使用 Agent Skills
理解 OpenCode Agent Skills:放在哪里、怎么写、什么时候加载,以及权限如何控制。
Agent Skill 是一份可以被 OpenCode 按需加载的操作说明。新手可以把它理解成“给 Agent 的专题小手册”:平时只暴露名称和描述,真正需要时才把完整 SKILL.md 放进上下文。
这和把所有规则都写进 AGENTS.md 不同。AGENTS.md 适合放项目长期规则,Skill 适合放某个可复用任务的细节,例如发布流程、PR 审查流程、文档生成流程。
放在哪里
为每个技能名称创建一个文件夹,并在其中放入 SKILL.md。 OpenCode 会搜索以下位置:
- 项目配置:
.opencode/skills/<name>/SKILL.md - 全局配置:
~/.config/opencode/skills/<name>/SKILL.md - 项目 Claude 兼容:
.claude/skills/<name>/SKILL.md - 全局 Claude 兼容:
~/.claude/skills/<name>/SKILL.md - 项目代理兼容:
.agents/skills/<name>/SKILL.md - 全局代理兼容:
~/.agents/skills/<name>/SKILL.md
选择位置时按这个顺序判断:只服务当前仓库就放项目目录;多仓库都要用就放全局目录;已经有 Claude Code 技能库时,可以沿用 .claude/skills 兼容入口。
发现机制怎么理解
对于项目本地路径,OpenCode 会从当前工作目录向上遍历,直到到达 git 工作树根目录。 在此过程中,它会加载 .opencode/ 中所有匹配的 skills/*/SKILL.md,以及匹配的 .claude/skills/*/SKILL.md 或 .agents/skills/*/SKILL.md。
全局定义也会从 ~/.config/opencode/skills/*/SKILL.md、~/.claude/skills/*/SKILL.md 和 ~/.agents/skills/*/SKILL.md 中加载。
如果你在子目录启动 OpenCode,仍然希望项目技能生效,就要确认这个子目录还在同一个 git 工作树里。
怎么写 frontmatter
每个 SKILL.md 必须以 YAML frontmatter 开头。 仅识别以下字段:
name(必填)description(必填)license(可选)compatibility(可选)metadata(可选,字符串到字符串的映射)
未知的 frontmatter 字段会被忽略。
最小结构如下:
---
name: git-release
description: Prepare release notes and a safe GitHub release command
license: MIT
compatibility: opencode
---
## When to use
Use this when preparing a tagged release.名称怎么判断
name 必须满足:
- 长度为 1–64 个字符
- 仅包含小写字母和数字,可用单个连字符分隔
- 不以
-开头或结尾 - 不包含连续的
-- - 与包含
SKILL.md的目录名称一致
等效规则可以简单记成:只用小写字母、数字和单个连字符,目录名和 name 完全一致。
description 必须为 1-1024 个字符。 请保持描述足够具体,以便代理能够正确选择。
新手最容易踩的点
- 描述太泛:例如 “help with git” 会让 Agent 难以判断何时加载。
- 技能太大:一个 Skill 只解决一类任务,别把整个团队手册塞进去。
- 名称不一致:目录叫
git-release,frontmatter 里也必须叫git-release。 - 放错层级:项目专用 Skill 不要放全局,否则其他仓库可能误触发。
Agent 什么时候加载技能
OpenCode 会在 skill 工具描述里列出可用技能。Agent 先看到名称和描述,再决定是否调用 skill 工具加载完整内容。
所以 description 要写触发条件,不要只写功能名。好的描述会说明“什么时候用、产出什么、有哪些边界”。
权限如何控制
在 opencode.json 中使用基于模式的权限来控制代理可以访问哪些技能:
allow:允许加载deny:对代理隐藏并拒绝访问ask:加载前先确认
模式支持通配符。比如 internal-* 可以覆盖 internal-docs、internal-tools 等内部技能。团队环境里,建议内部流程默认 ask,确认稳定后再改成 allow。
你也可以按代理覆盖权限。例如让审查代理可以使用 documents-*,但让普通聊天代理看不到内部发布技能。
什么时候禁用技能
为不需要使用技能的代理完全禁用技能功能:
- 只做规划、不执行流程的代理
- 不应该接触内部资料的代理
- 临时测试代理,避免它误加载团队 Skill
禁用后,可用技能列表会被完全省略。
排查加载问题
如果某个技能没有显示,按这个顺序查:
SKILL.md文件名是否全部大写- frontmatter 是否包含
name和description - 技能名称是否和目录名一致
- 当前启动目录是否位于目标 git 工作树内
- 权限是否被设为
deny