搜不到那个技能?技能搜索其实先去问了四个注册表


你刚在社区里看到一个挺妙的小技能——比如「把周报里的待办自动抽成清单」——作者说已经发布到 skills.sh 了。你兴冲冲打开终端:

hermes skills search weekly-report

零结果。你换个关键词,还是零。于是你开始怀疑是自己拼错了,或者这个技能根本不存在。半小时后你从作者给的链接手动装上,它工作得完美无缺。

问题不在你,也不在技能。搜索走的那条路,和「技能是否真的存在」并不是一回事。

搜索其实分两步走

未加过滤条件的搜索(CLI、TUI 和仪表盘都一样)默认由一份中央索引回答。这份索引覆盖了外部注册表,但它是定期重建的——也就是说,它回答的是「上一次构建时世界上有哪些技能」,而不是「此刻有什么」。

这中间有个时间窗口。一个刚发布几分钟的技能,很可能还没进索引。

9 月 16 日的改动把它补上了:当索引对你的查询零命中时,Hermes 会直接去问 skills.sh、ClawHub、LobeHub 和 well-known 端点。用官方文档的话说——「几分钟前发布的技能也能出现」。

这个兜底查询有几个限制值得记住:

  • 最多 8 秒。它拿的是搜索预算里的一小段,所以某个注册表慢吞吞也不会把一次「没搜到」拖成半分钟的等待;
  • 只有索引真的完成了并且返回零条时才触发。如果索引本身超时,不会启动兜底(合入时专门修了这个判断,否则仪表盘会冤枉 skills.sh 和 ClawHub「超时」);
  • 带 provider 过滤时不触发。--source nvidia 这类过滤只筛选带 provider 信息的来源,而这些注册表不带,所以不会白跑四次网络请求;
  • GitHub 不在兜底范围内。理由很实际:随便打错一个字就消耗掉未认证用户整小时的 GitHub 配额,太亏。要搜 GitHub 上的自定义 tap,就显式指定。

想找得更准,就告诉它去哪找

hermes skills search 支持 --source,可选项比多数人以为的多:

hermes skills search kubernetes                 # 全部来源
hermes skills search react --source skills-sh   # 只搜 skills.sh 目录
hermes skills search report --source clawhub    # 只搜 ClawHub
hermes skills search --source official          # 只看官方可选技能

可选的来源包括:official、skills-sh、well-known、github、clawhub、lobehub、browse-sh,以及 nvidia、openai、anthropic、huggingface、voltagent、gstack、minimax 这类按 provider 归类的来源(完整列表用 --source 的补全或 --help 看)。

顺手推荐几个好用的兄弟命令:hermes skills browse 分页浏览(官方技能排在前面),hermes skills inspect <name> 在装之前先看内容,hermes skills search <q> --json 输出结构化结果、方便脚本处理。

索引本身也在修:一个超时的分片不再静默吞掉技能

兜底只是补丁,根子上还得让索引可靠。9 月 17-18 日集中修了同一类问题:把「抓取失败」误当成「没有更多数据」。

  • ClawHub 的目录是游标翻页的。某页超时或返回非 200 时,原来的代码会当成翻到了末尾,于是剩下的技能全部消失。现在会重试。
  • skills.sh 的 sitemap 是按分片抓的。某个分片失败会被读成「空分片」,然后这份不完整的目录会被写进共享缓存——在缓存有效期内,全世界的搜索都少一批技能。现在:失败的分片重试,重试仍然失败就返回不完整结果但不写缓存。
  • 顺带把 CI 的超时从 50 分钟提到 120 分钟。原因写在提交信息里,很具体:ClawHub 从 9 月 17 日起每页 200 条要花约 10 秒(之前是 2.5 秒),光走完约 400 页就要 60-70 分钟——9 月 17、18 日两次定时构建都是在 50 分钟被掐断的,另一次只抓到 12,145 个技能就停了,低于 20,000 的底线。索引要重新发得出来,这两半都得修。

所以下次搜不到,按这个顺序排查

第一,先原样再搜一次。 如果是刚发布的技能,兜底查询本来会问到——但 8 秒预算意味着某个注册表正好很慢时也可能落空。

第二,指定来源。 --source clawhub、--source skills-sh 直接把搜索打到那个目录上,绕开索引的新鲜度问题。

第三,GitHub 上的仓库要显式搜。 自定义 tap 不在兜底里,用 --source github。

第四,确认自己搜的是技能。 如果你要找的其实是插件(带工具、钩子、平台适配的那种),那是另一套:插件走的是 SHA 固定、人工审核的目录,插件目录那篇里讲得更细。

想从整体上了解技能系统——目录结构、external_dirs、创建位置 skills.create_dir——可以看技能创建目录那篇;命令层面的完整参数在技能命令参考里。

一句话总结:看不到不等于不存在。搜索是「索引 + 兜底」两段式的,而这两段在 9 月中旬都被认真修过一轮——下次零命中,先想想你找的东西在不在它能问到的范围里。