# 02 — Skills (代理技能) > 源: > 适用: 创建/修改 `SKILL.md` (`.opencode/skill//SKILL.md`) ## 放置文件 (发现路径) OpenCode 递归扫描以下位置找 `**/SKILL.md`: | 范围 | 路径 | |---|---| | 项目 opencode | `.opencode/skills//SKILL.md` | | 全局 opencode | `~/.config/opencode/skills//SKILL.md` | | 项目 Claude 兼容 | `.claude/skills//SKILL.md` | | 全局 Claude 兼容 | `~/.claude/skills//SKILL.md` | | 项目 agents 兼容 | `.agents/skills//SKILL.md` | | 全局 agents 兼容 | `~/.agents/skills//SKILL.md` | > 项目本地路径: opencode 从当前工作目录**向上**遍历到 git worktree 根,沿途全加载。 > 本仓库主要用 `.opencode/skill/` (opencode 风格),同时保留 `.qwen/skills/` / `.agents/skills/` (历史) — 三者并存不冲突。 ## Frontmatter 字段 **只识别**以下字段,其它一律忽略: | 字段 | 必填 | 说明 | |---|---|---| | `name` | ✅ | 1-64 字符,正则 `^[a-z0-9]+(-[a-z0-9]+)*$`,**必须与目录名一致** | | `description` | ✅ | 1-1024 字符,**决定何时被加载** | | `license` | ❌ | 字符串 | | `compatibility` | ❌ | 字符串 | | `metadata` | ❌ | string→string 映射 | > 缺 `description` → **静默过滤掉**,不会报错也不会出现在 ``。 ## Name 验证规则 (硬) ``` ^[a-z0-9]+(-[a-z0-9]+)*$ ``` - 1-64 字符 - 仅小写字母和数字,单个连字符分隔 - 不以 `-` 开头或结尾 - 不含连续 `--` - **与目录名一致** ## Description 写法 (触发匹配关键) - 第三人称 "Use when..." / "Use ONLY when..." - **前置** 关键词/文件名 (用户原话里常出现的字) - 1-1024 字符,具体到能区分相邻话题 - "Use ONLY when..." 收窄误触 **正面**: ```yaml description: Configures opencode itself (agents/skills/MCP/custom tools/permissions). Use ONLY when user creates/modifies opencode.json, agent files, SKILL.md, MCP server config, .opencode/tools/, or tool permission policies. ``` **反面** (太泛): ```yaml description: Helps with development ``` ## 工具描述 (模型看到什么) `` 列出每个 skill 的 `name` + `description`: ```xml git-release Create consistent releases and changelogs ``` 模型用 `skill({ name: "git-release" })` 加载。 ## 权限配置 **全局** (`opencode.json`): ```json { "permission": { "skill": { "*": "allow", "pr-review": "allow", "internal-*": "deny", "experimental-*": "ask" } } } ``` | 行为 | 效果 | |---|---| | `allow` | 立即加载 | | `deny` | 对代理**隐藏**,拒绝访问 (模型看不到) | | `ask` | 加载前弹确认 | **按代理覆盖**: ```yaml # 自定义代理 frontmatter --- permission: skill: "documents-*": allow --- ``` ```json // 内置代理 opencode.json { "agent": { "plan": { "permission": { "skill": { "internal-*": "allow" } } } } } ``` **禁用 skill 工具** (代理完全用不了): ```yaml # 自定义代理 --- tools: skill: false --- ``` ```json // 内置代理 { "agent": { "plan": { "tools": { "skill": false } } } } ``` ## 排查加载问题 (按顺序) 1. 文件名**全大写** `SKILL.md` (不是 `skill.md` / `SKILL.MD`) 2. frontmatter 含 `name` + `description` 3. `name` 在**所有路径里唯一** (项目 + 全局) 4. 权限: 被 `deny` 会静默消失 5. 退出并重启 opencode (配置不热重载) ## 文件组织 (大内容用子文件) > 本 skill 的约定: 主 SKILL.md 保持导航/速查,详细文档放 `references/`/`scripts/`/`templates/`。 ``` .opencode/skill/ └── my-skill/ ├── SKILL.md # 必填, 主体 (导航+摘要) ├── references/ # 可选, 详细文档 │ ├── 01-xxx.md │ └── 02-xxx.md ├── scripts/ # 可选, 工具脚本 └── templates/ # 可选, 模板 ``` > 加载方式: 主 SKILL.md 里用一句话导航,如"详细见 `references/01-xxx.md`",模型用 `read` 工具按需取。 ## 官方示例 (照搬) `.opencode/skills/git-release/SKILL.md`: ```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. ``` ## 验证清单 (改完跑一遍) 1. `name` 与目录名一致,通过正则。 2. `description` 1-1024 字符,前置关键词。 3. 文件名 `SKILL.md` 全大写。 4. 退出重启 opencode。 5. 主代理在 UI 输入与 description 相关的请求,看 `` 是否列出。 6. 主代理调 `skill({ name: "..." })` 验证内容能加载。