如果你装过 Skill 以后发现“和别人效果不一样”“改了文件却没立刻生效”“同名 Skill 好像被另一个版本覆盖了”,问题大概率不在模型,而在这套加载机制。位置、优先级、门槛、会话快照和 watcher,一起决定某个 Skill 现在能不能被用到。
先记住最核心的一行
<workspace>/skills → ~/.openclaw/skills → bundled skills,而 skills.load.extraDirs 加的目录优先级最低。也就是说,workspace 里的本地技能优先级最高。
三类主要来源
- Bundled skills:随 OpenClaw 安装一起带上的默认技能。
- Managed/local skills:通常位于
~/.openclaw/skills。 - Workspace skills:位于
<workspace>/skills,也是最容易覆盖其他版本的来源。
插件也能带 Skills
插件可以在 openclaw.plugin.json 里声明 skills 目录。插件启用后,这些 plugin skills 会参与正常的优先级规则。
不是所有 Skill 都会被加载:还有门槛过滤
常见门槛包括:
requires.binsrequires.anyBinsrequires.envrequires.configos
所以很多“装好了但看不到”的情况,本质上是没过这些门槛,不是没装进去。
配置覆盖也会影响资格和行为
在 ~/.openclaw/openclaw.json 里,官方支持通过 skills.entries 对技能做覆盖,例如:
enabled: false:直接禁用某个 Skill。env:给它注入环境变量。apiKey:给声明了primaryEnv的技能传密钥。config:给自定义字段传配置。
最容易被忽略的一点:会话快照
OpenClaw 会在 session 启动时快照当前 eligible skills 列表,并在同一会话里复用。 这意味着你改了 Skill、装了新 Skill、改了配置,不一定会立刻在当前会话里反映出来。
最稳的做法仍然是:变更后开一个新会话。
Watcher 会帮你热刷新,但不要过度依赖
默认情况下,OpenClaw 会监听 skill folders,在 SKILL.md 变化时 bump skills snapshot。对应配置在 skills.load.watch 和 watchDebounceMs。
另外两个常被忽略的前置项
user-invocable:允许作为用户 slash command 暴露。disable-model-invocation:不进入模型提示,但仍可以用户调用。
最常见的排障顺序
- 先确认 Skill 在哪个目录里。
- 再确认有没有同名冲突。
- 再看
requires.bins / env / config / os有没有没满足。 - 再确认
skills.entries有没有把它关掉或改掉。 - 最后再新开会话测试。