OpenCode Agents、Skills 与 Commands:打造你的工作流

Posted on Sun 04 October 2026 in AI 编程 • Sucre Liu

一个比喻先分清

  • Agent:谁来干。它决定系统提示、模型、权限、可见性。
  • Skill:怎么干。可复用的知识或流程,需要时被加载。
  • Command:一键开干。把一段提示模板变成 /xxx。

三者可以组合:一个 command 指定用哪个 agent、哪个 model;一个 agent 可以加载 skill;skill 里可以引用脚本和参考资料。

Agent:定义"谁来干"

最省事的方式是写一个 markdown,放进 .opencode/agents/(全局则是 ~/.config/opencode/agents/):

---
description: Reviews changes for correctness and regressions
mode: subagent
model: anthropic/claude-sonnet-4-5#high
permissions:
  - action: edit
    resource: "*"
    effect: deny
  - action: shell
    resource: "*"
    effect: deny
---

Review the current changes. List findings in severity order with file and line references.

正文就是它的 system prompt。嵌套目录会成为 ID 的一部分:.opencode/agents/team/reviewer.md → team/reviewer。

模式决定它能在哪跑:

mode 行为
primary 作为会话主代理(新自定义 agent 的默认)
subagent 只能由 subagent 工具在子会话里启动
all 都可以

子代理有全新上下文,在前后台子会话里跑。父代理的 subagent 权限决定它能启动哪些子代理,子代理则用自己配置的权限——不是父权限的子集。

这里有个值得用的技巧:用权限反向塑造"专家"。上面的 reviewer 明确 deny 了 edit 和 shell,它就只能看、不能改。让"审查者"物理上无法改代码,比在提示里写"请不要改"可靠得多。

其他常用字段:

  • model:provider/model#variant;
  • system:非空会替换 provider 的基础提示(markdown 里就写正文);
  • steps:最大模型步数,到最后一步会移走工具并要求它用文字总结;
  • hidden:从列表和子代理目录里隐藏(控制可见性,不是安全边界);
  • disabled:在该配置层移除某个内置或自定义 agent;
  • color:UI 颜色。

覆盖内置 agent 用同名 ID,例如给 build 加一条只针对它的权限:

{
  "agents": {
    "build": {
      "permissions": [
        { "action": "shell", "resource": "git push *", "effect": "ask" }
      ]
    }
  }
}

合并规则:后出现的标量覆盖前面的,请求映射按键合并,权限规则追加。全局权限先于 agent 权限,所以 agent 规则能细化它们。

Skill:可复用的"怎么干"

一个 skill 是 .opencode/skills/<skill-id>/SKILL.md:

---
name: Git Release
description: Prepare release notes, version bumps, and GitHub releases
---

## Workflow

1. Read `references/release-policy.md`.
2. Summarize merged changes since the previous tag.
3. Propose the version bump before changing files.
4. Run `scripts/changelog.ts` only after the user approves the version.

把脚本、参考文档、模板放在 SKILL.md 旁边,路径以 SKILL.md 所在目录为基准。用目录形式,这样配套文件有独立的根目录。

它不会把每个 skill 都塞进每次提示,而是先广告 ID、名称、描述,模型需要时用 skill 工具按 ID 加载正文,并拿到最多十个配套文件路径(内容仍要它自己去读)。这个"按需加载"是 skill 的核心价值。

发现位置(含兼容):

作用域 来源
全局 ~/.config/opencode/skills
全局兼容 ~/.claude/skills、~/.agents/skills
项目 .opencode/skills
项目兼容 .claude/skills、.agents/skills

兼容目录意味着你为 Claude Code 写的 skill,OpenCode 也能直接发现。这对同时用两个工具的团队很实用。

两个必须记住的细节:

  1. ID 由路径决定,不是 frontmatter 的 name。 SKILL.md 的 ID 是它所在目录名;git-release.md 的 ID 是 git-release。ID 区分大小写。
  2. metadata.opencode/autoinvoke: false 只把 skill 从模型的可用列表里隐藏,它仍然可以被显式按 ID 加载。

对有副作用的 skill,建议关掉自动调用,只让你手动触发。方法是在 frontmatter 里设 slash: false(从交互命令目录隐藏)或用 autoinvoke 控制,并用 skill 权限把不想给的技能直接 deny 掉:

{
  "permissions": [
    { "action": "skill", "resource": "*", "effect": "allow" },
    { "action": "skill", "resource": "internal-*", "effect": "deny" }
  ]
}

Command:把重复的提示变成 /命令

标准写法是 .opencode/commands/review.md:

Review $ARGUMENTS for bugs and missing tests.

然后在 TUI 里:

/review src/auth.ts

它会提交 Review src/auth.ts for bugs and missing tests.。嵌套路径变成带 / 的命令名:.opencode/commands/team/review.md → /team/review。

参数有两种占位:

  • $ARGUMENTS:完整参数串原样填入;
  • $1、$2……:位置参数,单/双引号可以分组(引号会被去掉)。

最高编号的占位符会吃掉它之后的所有内容;缺失的位置变成空串。如果模板里没有任何占位符,OpenCode 会把非空参数追加在空行之后。

命令还能指定 agent 和 model:

---
description: Review code for correctness
agent: plan
model: anthropic/claude-sonnet-4-5#high
---

Review $ARGUMENTS. Report bugs first.

模型选择顺序:命令的 model > 所选 agent 的模型 > 当前会话模型。运行 /plan migration 这类命令会先把当前会话切到 plan 再提交提示。

有个强但危险的功能——在命令里嵌 shell:

---
description: Review the staged diff
---

Review this diff:

!`git diff --stat && git diff`

它在提交提示前运行 shell,并插入输出。注意:shell 块在 agent 的工具权限流程之外运行。 官方明确警告过,只在你完全信任模板来源时使用,而且不要把不可信参数放进 shell 块。

想让命令在后台子会话跑,设 subagent: true:

---
description: Audit changes
agent: general
subagent: true
---

Audit $ARGUMENTS for bugs and missing tests.

父会话保持可用、保留自己的 agent 和模型;子会话完成或失败后结果回传。

怎么选:一张对照

你想做的事 用
换一个"专职角色"(只读审查、特定模型) agent
沉淀一段流程/参考资料,需要时才加载 skill
把一段提示模板变成随手可用的命令 command
命令要指定角色和模型 command + agent
命令要后台跑 command + subagent: true
把 Claude Code 的技能迁移过来 直接复用 .claude/skills(兼容发现)

一个务实建议:优先写成仓库里的 markdown,而不是 JSON。 它们能被 git 跟踪、能 review、能跨工具复用;JSON 配置适合少量全局设置,不适合承载会演化的流程。

小结

  • agent 管"谁来干",skill 管"怎么干",command 管"一键开干"。
  • 用权限塑造专家:deny edit/shell,比提示词里写"不要改"可靠。
  • skill 的 ID 来自路径,不是 name;有副作用的技能关掉自动调用。
  • 命令的 shell 块在权限流程之外执行,来源可信才用。
  • .claude/skills、.agents/skills 会被自动发现,是跨工具复用技能的关键。

下一篇讲扩展与集成:插件、MCP、权限规则与快照回滚——覆盖你把它接进真实工程时最需要的那几块。