opencode技能列表全空?排查发现是内置ripgrep版本不兼容
“技能列表全空”这个事,我排查了一整个下午,最后定位到的根因让我有点意外:opencode 加载 skills 时根本没有走系统 PATH 里那个正常的 ripgrep,而是调了它自己捆绑的一个旧版 rg。这个版本对某些搜索参数的处理有问题,导致所有技能索引直接失败,界面里一个技能都看不到。这篇就把整个排障过程、机制原理和修复方法完整记录下来,给同样踩坑的人一条直达路径。
1. 故障现场:技能列表一夜全空
1.1 现象描述
我在终端里启动 opencode 后,使用 /skills 命令列出可用技能,结果返回空列表。更诡异的是,不只是某个技能缺失,而是所有技能全部消失——包括我之前放在全局目录下、一直正常使用的几个自定义技能。命令行直接回车没有任何提示,状态栏也没有报错,表现得就像我从来没配置过任何技能一样。
第一反应是配置文件被改了。我检查了 ~/.config/opencode/ 目录,opencode.json 还在,skills 子目录下的文件夹和 SKILL.md 文件也都在,文件权限正常,内容没有变化。于是我把项目目录下的 .opencode/skills 和用户级目录都翻了一遍,确认技能文件确实存在,格式也符合 frontmatter 加正文的标准结构。这就说明问题不在技能本身,而在 opencode 读取技能的那条链路上。
我用 opencode --version 确认了当前版本号,又用 opencode --debug 启动并复现了一次。日志里能看到插件和 MCP 服务正常加载,但到了技能扫描阶段,日志突然中断,没有输出任何技能被发现的记录。这时候我意识到问题出在“搜索/发现”环节,而不是技能内容的解析环节。
1.2 初步排查的思路
遇到技能加载全挂,我习惯按以下顺序排查:
- 检查技能目录结构和
SKILL.md格式是否合法 - 确认 opencode 版本和配置文件是否匹配
- 查看 debug 日志中技能扫描段的输出
- 手动在技能目录里搜索
SKILL.md文件,验证目录可读性 - 检查是否有环境变量影响搜索行为
前两步很快就排除了,第三步日志无有效输出,第四步手动搜索正常。到这一步,问题范围已经收窄到 opencode 内部使用的文件搜索工具上。opencode 在扫描技能时依赖一个命令行工具来做文件发现和内容匹配,这个工具就是 ripgrep。日志里没有错误、列表为空,典型的特征是“搜索进程根本没找到任何文件”,而不是“文件找到了但解析失败”。
手动搜索正常、工具内搜索失败,这种组合通常指向两个方向:要么 opencode 调用 rg 时传入了不兼容的参数,要么它调用的根本不是你系统里那个 rg。我在此之前一直假设 opencode 会使用系统自带的 ripgrep,检查了系统 rg 版本是 14.1.0,功能完整,排除了 rg 依赖缺失的问题。真正的问题在于:opencode 的某些版本并不会老老实实使用 PATH 环境变量里的 rg,而是优先调用它自己内置的二进制文件。
2. opencode 的 skills 机制与 ripgrep 的关系
2.1 skills 是如何被发现和加载的
opencode 的 skills 功能借鉴了 Claude Code 的 Skill 概念,本质上是把一组带 frontmatter 的 Markdown 文件按目录组织起来,在对话中通过 /skills 命令展示,并由模型按需加载描述和内容。每个技能目录下都有一个 SKILL.md 文件,frontmatter 里声明 name、description 等元数据,正文则是具体的提示词或操作说明。
加载流