在 AI 编程助手的日常使用中,我们经常遇到这样的场景:每次处理代码审查时都需要重复描述审查规则;每次发版前都要重新说明发布流程;每次写测试时都要重申代码规范。OpenCode 的 Skills(技能)系统正是为解决这类重复性指令问题而设计的——它将特定任务的指令封装为可复用的技能模块,让 AI 编程助手在需要时自动加载。
Skills 是 OpenCode 提供的一种轻量级机制,用于定义可重用的行为模式。你只需编写一个 SKILL.md 文件,放置在特定目录下,OpenCode 就能自动发现并将其注册到 Agent 可用的工具列表中。当任务匹配时,Agent 会自动加载对应的技能,无需你在每次对话中都重复相同的指令。
本文将从概念、创建、配置到最佳实践,全面讲解 OpenCode Skills 系统的使用方法。
Skills 本质上是一组结构化的指令说明文件。与 OpenCode 中的其他配置机制相比,Skills 有以下几个关键特点:
skill 工具中,Agent 会在任务匹配时主动加载每个技能以一个包含 SKILL.md 文件的目录表示,目录名就是技能名称。
Skills 可以存放在项目级目录和全局目录中,OpenCode 会在启动时自动发现。以下是支持的存放位置:
# 项目级(按优先级从高到低查找) .opencode/skills/<name>/SKILL.md .claude/skills/<name>/SKILL.md .agents/skills/<name>/SKILL.md # 全局级 ~/.config/opencode/skills/<name>/SKILL.md ~/.claude/skills/<name>/SKILL.md ~/.agents/skills/<name>/SKILL.md
项目级路径中,OpenCode 会从当前工作目录向上遍历到 Git 工作树的根目录,沿途查找所有匹配的目录。
每个 SKILL.md 文件包含两部分:YAML 前置元数据和 Markdown 正文。下面是一个完整的示例:
--- 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 copy-pasteable `gh release create` command ## When to use me Use this when you are preparing a tagged release. Ask clarifying questions if the target versioning scheme is unclear.
前置元数据中只有 name 和 description 是必填字段,其余均为可选。name 必须符合正则 ^[a-z0-9]+(-[a-z0-9]+)*$,长度为 1–64 个字符,且必须与目录名一致。
创建完成后,OpenCode 会在启动时自动发现该技能,并将其注册到 Agent 的 skill 工具描述中。Agent 看到的工具列表会包含可用技能的信息:
<available_skills>
<skill>
<name>git-release</name>
<description>Create consistent releases and changelogs</description>
</skill>
</available_skills>
当 Agent 判断当前任务匹配某个技能时,它会调用 skill({ name: "git-release" }) 来加载完整内容。这个过程是自动的,不需要用户手动干预。
假设你所在团队有统一的代码审查规范,每个 Pull Request 都需要检查特定的项目。我们可以创建一个专用的代码审查技能:
创建目录 .opencode/skills/pr-review/ 并编写 SKILL.md:
--- name: pr-review description: Review pull requests against project standards metadata: audience: all-developers workflow: code-review --- ## Review Checklist When reviewing a PR, check the following: ### Security - Are user inputs properly sanitized? - Are sensitive data (API keys, tokens) handled via environment variables? - Is authentication enforced on all protected routes? ### Performance - Are N+1 queries present in database operations? - Is pagination applied to list endpoints? - Are large assets optimized or lazy-loaded? ### Code Quality - Are TypeScript types properly defined (no `any` unless justified)? - Are functions kept under 50 lines where reasonable? - Are error messages descriptive and actionable? ### Testing - Are there unit tests covering the changed logic? - Do the tests follow the project's testing conventions? - Are edge cases (empty state, error state, boundary values) covered? ## Output Format For each issue found, provide: 1. File path and line number 2. Severity (blocker / warning / suggestion) 3. Explanation of the concern 4. Suggested fix (with code snippet when applicable)
这个技能包含了代码审查的完整检查清单,当 Agent 被要求审查 PR 时,它会自动加载这个技能,从而按照团队规范进行审查。
Skills 系统提供了灵活的权限配置机制,你可以在 opencode.json 中按模式匹配来控制哪些技能可以被哪些 Agent 加载:
{
"permission": {
"skill": {
"*": "allow",
"pr-review": "allow",
"internal-*": "deny",
"experimental-*": "ask"
}
}
}
权限有三种级别:
| 权限 | 行为 |
|------|------|
| allow | 技能立即可用 |
| deny | 技能对 Agent 不可见,访问被拒绝 |
| ask | 加载前需要用户确认 |
对于自定义 Agent,你可以在其前置元数据中覆盖权限:
---
name: senior-dev
permission:
skill:
"internal-*": "allow"
---
对于内置 Agent(如 plan),在 opencode.json 中配置:
{
"agent": {
"plan": {
"permission": {
"skill": {
"internal-*": "allow"
}
}
}
}
}
如果某个 Agent 完全不需要使用技能,可以直接禁用 skill 工具:
--- name: simple-assistant tools: skill: false ---
或者对内置 Agent:
{
"agent": {
"plan": {
"tools": {
"skill": false
}
}
}
}
每个技能应该专注于一个特定的任务领域。不要在一个技能中混合代码审查和数据库迁移的规则。职责单一的技能更容易被 Agent 正确识别和加载。
description 字段是 Agent 判断是否加载技能的关键依据。描述要具体且有区分度:
# 好的描述 description: Review Go microservice code for correctness, concurrency safety, and stdlib usage patterns # 不够好的描述 description: Code review
使用标题和列表组织正文,让 Agent 更容易解析和遵循指令。避免长篇大论的段落,使用清晰的分层结构。
metadata 是字符串-字符串映射表,可以用来附加技能本身的元信息。虽然 Agent 不会直接使用这些数据,但它们有助于组织和管理技能集合:
metadata: audience: backend team: platform-engineering created: "2026-07" version: "2.1"
~/.config/opencode/skills/):适合通用性强的技能,如代码规范审查、通用发布流程等.opencode/skills/):适合项目特定的规则,如项目特有的架构约束、特殊的数据处理流程等全局技能会跟随你的所有项目,而项目级技能应该提交到 Git 仓库中,与团队成员共享。
如果技能没有出现在 Agent 的可选列表中,按以下顺序排查:
文件名是否正确:必须是全大写的 SKILL.md,注意大小写
前置元数据是否完整:name 和 description 是必填项
名称是否唯一:相同名称的技能在不同位置存在时,只有优先级最高的会被加载
权限是否屏蔽:检查 opencode.json 中的 permission.skill 配置,被设置 deny 的技能对 Agent 不可见
目录名称是否匹配:目录名必须与 name 字段完全一致
OpenCode Skills 系统提供了一种优雅的方式来封装和复用 AI 编程助手的指令。通过将特定任务的指导说明抽象为独立的技能模块,你不再需要在每次对话中重复相同的要求,Agent 会在识别到匹配任务时自动加载对应的技能。
这种设计不仅提高了工作效率,更重要的是让团队的最佳实践可以标准化和共享。无论是代码审查规范、发布流程、测试策略还是架构约束,都能通过 Skills 系统沉淀为团队的共同资产。
结合 OpenCode 的权限系统和 Agent 配置,你可以精细控制每个 Agent 的能力边界,构建一个既灵活又可控的 AI 编程协作环境。