跳到內容

代理技能

透過 SKILL.md 定義可重複使用的行為

代理技能讓 OpenCode 能夠從你的儲存庫或主目錄中發現可重複使用的指令。 技能透過原生的 skill 工具按需載入——代理可以查看可用技能,並在需要時載入完整內容。


放置檔案

為每個技能名稱建立一個資料夾,並在其中放入 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

了解發現機制

對於專案本地路徑,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 中載入。


撰寫 frontmatter

每個 SKILL.md 必須以 YAML frontmatter 開頭。 僅識別以下欄位:

  • name(必填)
  • description(必填)
  • license(選填)
  • compatibility(選填)
  • metadata(選填,字串到字串的映射)

未知的 frontmatter 欄位會被忽略。


驗證名稱

name 必須滿足:

  • 長度為 1–64 個字元
  • 僅包含小寫字母和數字,可用單個連字號分隔
  • 不以 - 開頭或結尾
  • 不包含連續的 --
  • 與包含 SKILL.md 的目錄名稱一致

等效的正規表示式:

^[a-z0-9]+(-[a-z0-9]+)*$

遵循長度規則

description 必須為 1-1024 個字元。 請保持描述足夠具體,以便代理能夠正確選擇。


使用範例

建立 .opencode/skills/git-release/SKILL.md,內容如下:

---
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.

識別工具描述

OpenCode 會在 skill 工具描述中列出可用技能。 每個條目包含技能名稱和描述:

<available_skills>
<skill>
<name>git-release</name>
<description>Create consistent releases and changelogs</description>
</skill>
</available_skills>

代理透過呼叫工具來載入技能:

skill({ name: "git-release" })

設定權限

opencode.json 中使用基於模式的權限來控制代理可以存取哪些技能:

{
"permission": {
"skill": {
"*": "allow",
"pr-review": "allow",
"internal-*": "deny",
"experimental-*": "ask"
}
}
}
權限行為
allow技能立即載入
deny對代理隱藏技能,拒絕存取
ask載入前提示使用者確認

模式支援萬用字元:internal-* 可匹配 internal-docsinternal-tools 等。


按代理覆蓋權限

為特定代理授予與全域預設值不同的權限。

自訂代理(在代理 frontmatter 中):

---
permission:
skill:
"documents-*": "allow"
---

內建代理(在 opencode.json 中):

{
"agent": {
"plan": {
"permission": {
"skill": {
"internal-*": "allow"
}
}
}
}
}

停用技能工具

為不需要使用技能的代理完全停用技能功能:

自訂代理

---
tools:
skill: false
---

內建代理

{
"agent": {
"plan": {
"tools": {
"skill": false
}
}
}
}

停用後,<available_skills> 部分將被完全省略。


排查載入問題

如果某個技能沒有顯示:

  1. 確認 SKILL.md 檔案名稱全部為大寫字母
  2. 檢查 frontmatter 是否包含 namedescription
  3. 確保技能名稱在所有位置中唯一
  4. 檢查權限設定——設為 deny 的技能會對代理隱藏