14.1 Skill 的定义与结构

模型: claude-opus-4-6 (anthropic/claude-opus-4-6) 生成日期: 2026-02-17


如果说 Plugin 是对 OpenCode 引擎层的扩展(修改工具、拦截消息、注入参数),那么 Skill 则是对 Agent 知识层的扩展——它向 Agent 注入特定领域的知识、指令和最佳实践。

一个简单的类比:Plugin 像是给汽车加装新的硬件(涡轮增压、导航系统),而 Skill 像是给司机一本新的操作手册("在雪地驾驶时应该这样做")。

14.1.1 Skill 文件格式:Markdown

Skill 的定义格式极其简单——一个带 YAML frontmatter 的 Markdown 文件,文件名固定为 SKILL.md

---
name: git-master
description: Expert at Git operations including atomic commits, rebase, squash, and history search
---

# Git Master Skill

When performing Git operations, follow these guidelines:

## Commit Messages
- Use conventional commits format: `type(scope): description`
- Types: feat, fix, refactor, docs, test, chore
...

## Rebase Strategy
...

Skill 的数据模型由 Zod Schema 定义:

YAML frontmatter 的解析使用 ConfigMarkdown.parse()——与 OpenCode 的配置文件解析器共享同一套逻辑,支持注释和灵活的格式。

14.1.2 Skill 目录发现机制

Skill 的发现是一个多层扫描过程,按照从全局到项目、从外部到内部的顺序搜索:

源码中的搜索逻辑:

兼容性设计:OpenCode 不仅搜索自己的 .opencode/skills/ 目录,还搜索 .claude/skills/.agents/skills/——这使得已有的 Claude Code Skill 和其他 Agent 框架的 Skill 可以直接被 OpenCode 使用。

重名处理:如果多个路径中出现同名 Skill,后加载的会覆盖先加载的(项目级覆盖全局级),并记录一条警告日志。

14.1.3 Skill 元数据

每个 Skill 的元数据从 YAML frontmatter 中提取:

字段
必填
说明

name

Skill 的唯一标识符

description

Skill 的简短描述(会显示给 Agent 和用户)

Skill 的 content 字段是 Markdown 正文——去除 frontmatter 后的纯内容。这个内容会在 Agent 调用 skill 工具时被注入到对话上下文中。

14.1.4 远程 Skill 发现

Discovery.pull() 函数实现了从远程 URL 下载 Skill 的能力:

远程 Skill 被下载到缓存目录(~/.cache/opencode/skills/),并且使用文件存在性检查实现简单的缓存——如果文件已存在就跳过下载。

14.1.5 小结

Skill 系统的设计体现了几个理念:

  1. 简单的格式:纯 Markdown + YAML frontmatter,不需要编程知识就能创建 Skill。

  2. 多源发现:全局目录、项目目录、配置路径、远程 URL——Skill 可以来自任何地方。

  3. 跨工具兼容:通过搜索 .claude/.agents/ 目录,兼容其他 AI 编程助手的 Skill 格式。

  4. Instance 级缓存:Skill 列表通过 Instance.state() 管理,每个项目实例有独立的 Skill 集合。

Last updated