OpenCode Skills
在 OpenCode 中,代理技能(Skills)是一种用于封装可复用行为的机制,通过 SKILL.md 文件定义,使 LLM 能够按需加载、按需执行特定能力。
相比普通提示词,技能更接近模块化能力单元,可以在多个项目或团队中复用。
Skills 是 OpenCode 的能力插件系统,它将 AI 行为从单次提示升级为可复用能力模块,使开发流程更加标准化、可组合,并适用于复杂工程体系。
更多 Skills 可以参考:
- Skills 教程:https://www.runoob.com/ai-agent/skills-agent.html
- OpenCode skills 使用:https://www.runoob.com/ai-agent/opencode-skills-intro.html
一、核心机制
Skills 通过内置的 skill 工具进行管理,工作流程如下:
- 扫描本地和全局技能目录
- 在上下文中暴露可用技能列表
- 代理根据任务自动选择技能
- 按需加载 SKILL.md 内容
这种机制避免了将所有规则一次性加载,提高了性能和上下文利用率。
二、目录结构与放置位置
每个技能必须独立目录:
.opencode/skills/<skill-name>/SKILL.md
OpenCode 会在以下位置查找技能:
- 项目级:
.opencode/skills/ - 全局:
~/.config/opencode/skills/ - Claude 兼容:
.claude/skills/、~/.claude/skills/ - Agents 兼容:
.agents/skills/、~/.agents/skills/
加载规则:
- 从当前目录向上遍历至 Git 根目录
- 加载所有匹配的 skills/*/SKILL.md
- 同时加载全局目录中的技能
三、SKILL.md 基本结构
每个技能文件必须包含 YAML frontmatter:
--- name: git-release description: Create consistent releases and changelogs license: MIT compatibility: opencode metadata: audience: maintainers workflow: github ---
字段说明
| 字段 | 说明 |
|---|---|
name |
技能名称(必填) |
description |
技能描述(必填) |
license |
许可证(可选) |
compatibility |
兼容标识(可选) |
metadata |
扩展信息(键值对) |
frontmatter 之后为技能的具体行为说明。
四、完整示例
--- name: git-release description: Create consistent releases and changelogs license: MIT compatibility: opencode metadata: audience: maintainers workflow: github --- ## What I do - Draft release notes from merged PRs - Propose a version bump - Provide a gh release command ## When to use me Use this when preparing a release. Ask for clarification if versioning is unclear.
该技能可用于自动生成版本发布流程。
五、技能命名规范
技能名称必须满足以下规则:
- 长度:1–64 字符
- 仅包含:小写字母、数字、连字符
- 不能以 - 开头或结尾
- 不能出现连续 --
- 必须与目录名称一致
正则表达式:
^[a-z0-9]+(-[a-z0-9]+)*$
六、技能发现与加载
OpenCode 会将技能列表注入上下文:
<available_skills>
<skill>
<name>git-release</name>
<description>Create consistent releases</description>
</skill>
</available_skills>
代理在需要时调用:
skill({ name: "git-release" })
然后加载完整 SKILL.md 内容。
七、权限控制
通过 opencode.json 控制技能访问权限:
{
"permission": {
"skill": {
"*": "allow",
"internal-*": "deny",
"experimental-*": "ask"
}
}
}
| 权限 | 行为 |
|---|---|
| allow | 直接加载 |
| deny | 隐藏技能 |
| ask | 需用户确认 |
八、按代理覆盖权限
可以针对不同代理设置不同技能权限:
{
"agent": {
"plan": {
"permission": {
"skill": {
"internal-*": "allow"
}
}
}
}
}
适用于:
- 分析代理使用更多内部工具
- 生产代理限制敏感技能
九、禁用技能工具
如果某些代理不需要 Skills,可以完全禁用:
{
"agent": {
"plan": {
"tools": {
"skill": false
}
}
}
}
禁用后:
- 技能不会被加载
- 上下文中不再出现 skills 列表
十、常见问题排查
- 确认文件名必须为
SKILL.md(大写) - 检查是否包含 name 和 description
- 确保技能名称全局唯一
- 检查权限是否被 deny
- 确认目录结构是否正确
十一、最佳实践
- 将复杂流程封装为 Skills(如发布、部署、审查)
- 保持 description 清晰具体,方便代理选择
- 按功能拆分多个技能,避免单体过大
- 结合权限控制敏感操作
- 团队统一维护 skills 目录
点我分享笔记