📚AI 编程官方教程中文版
官方教程中文版Agents & Skills

使用 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-docsinternal-tools 等内部技能。团队环境里,建议内部流程默认 ask,确认稳定后再改成 allow

你也可以按代理覆盖权限。例如让审查代理可以使用 documents-*,但让普通聊天代理看不到内部发布技能。

什么时候禁用技能

为不需要使用技能的代理完全禁用技能功能:

  • 只做规划、不执行流程的代理
  • 不应该接触内部资料的代理
  • 临时测试代理,避免它误加载团队 Skill

禁用后,可用技能列表会被完全省略。

排查加载问题

如果某个技能没有显示,按这个顺序查:

  1. SKILL.md 文件名是否全部大写
  2. frontmatter 是否包含 namedescription
  3. 技能名称是否和目录名一致
  4. 当前启动目录是否位于目标 git 工作树内
  5. 权限是否被设为 deny

官方来源

On this page