Sooua
登录
返回文章列表
OpenCode··11 分钟阅读

代理技能

技能(Skills)是可复用的指令集,让 OpenCode 在需要时加载特定能力。它们是团队知识沉淀的最佳载体——将反复使用的提示词、规范、流程封装为标准化模块。

目标:创建可复用的 AI 技能,提升团队协作效率


概述

技能(Skills)是可复用的指令集,让 OpenCode 在需要时加载特定能力。它们是团队知识沉淀的最佳载体——将反复使用的提示词、规范、流程封装为标准化模块。

类比:

  • 函数 — 代码复用
  • 技能 — AI 行为复用

技能发现机制图

技能加载优先级


技能目录结构

标准目录布局

.opencode/
└── skills/
    ├── code-review/
    │   └── SKILL.md
    ├── react-component/
    │   ├── SKILL.md
    │   └── examples/
    │       ├── Button.tsx
    │       └── Card.tsx
    ├── api-design/
    │   └── SKILL.md
    └── database-migration/
        └── SKILL.md

全局技能目录

~/.config/opencode/
└── skills/
    ├── write-git-commit/
    │   └── SKILL.md
    ├── generate-readme/
    │   └── SKILL.md
    └── explain-error/
        └── SKILL.md

多路径发现规则

OpenCode 会自动发现以下位置的技能:

  1. 当前项目 .opencode/skills/
  2. 向上遍历到 Git 根目录的 .opencode/skills/
  3. 全局 ~/.config/opencode/skills/
  4. Claude 兼容路径 .claude/skills/

创建技能

文件位置

# 项目本地
.opencode/skills/<name>/SKILL.md
 
# 全局
~/.config/opencode/skills/<name>/SKILL.md
 
# Claude 兼容
.claude/skills/<name>/SKILL.md

文件格式

---
name: react-component
description: 生成符合规范的 React 组件
---
 
# React 组件生成规范
 
## 要求
 
1. 使用函数组件 + TypeScript
2. Props 使用 interface 定义
3. 添加 JSDoc 注释
4. 使用 Tailwind CSS 样式
 
## 模板
 
```tsx
interface {{ComponentName}}Props {
  // ...
}
 
/**
 * {{ComponentName}} 组件
 */
export function {{ComponentName}}(props: {{ComponentName}}Props) {
  // ...
}

示例

...


---

## Frontmatter 详解

SKILL.md 顶部的 YAML frontmatter 是技能的元数据,影响技能发现和加载行为。

### 完整字段说明

```yaml
---
# 必填:技能标识符,kebab-case
name: my-awesome-skill

# 必填:一句话描述技能用途
description: 生成符合团队规范的 API 文档

# 可选:技能版本,语义化版本号
version: 1.2.0

# 可选:许可证
license: MIT

# 可选:兼容的 OpenCode 最低版本
compatibility: ">=0.5.0"

# 可选:作者信息
author: your-name

# 可选:标签,用于分类和搜索
tags:
  - api
  - documentation
  - backend

# 可选:自定义元数据
metadata:
  team: backend-squad
  priority: high
  reviewed: "2025-06-01"
---

Frontmatter 字段速查表

字段必填类型说明示例
namestring技能名称(kebab-case)code-review
descriptionstring技能描述执行标准化代码审查
versionstring语义化版本1.0.0
licensestring许可证MIT
compatibilitystring兼容版本>=0.5.0
authorstring作者team-alpha
tagsstring[]标签列表[api, backend]
metadataobject自定义元数据{team: backend}

实战:创建代码审查技能

.opencode/skills/code-review/SKILL.md

---
name: code-review
description: 执行标准化的代码审查
version: 1.0.0
tags:
  - review
  - quality
---
 
# 代码审查规范
 
## 检查项
 
### 安全性
- [ ] 没有 SQL 注入风险
- [ ] 用户输入经过校验(Zod / Joi / class-validator)
- [ ] 没有硬编码密钥或密码
- [ ] 敏感操作有权限校验
 
### 性能
- [ ] 没有 N+1 查询
- [ ] 大数据量有分页(limit/offset 或 cursor)
- [ ] 没有明显的内存泄漏
- [ ] 异步操作有适当的并发控制
 
### 可维护性
- [ ] 函数长度 < 50 行
- [ ] 命名清晰有意义(动词开头用于函数)
- [ ] 有适当的注释(复杂逻辑必须注释)
- [ ] 没有冗余代码
 
### 测试
- [ ] 新功能有单元测试
- [ ] 边界情况覆盖
- [ ] 异步代码有 await 测试
 
## 输出格式
 
对每个问题:
1. **严重程度**:🔴 严重 / 🟡 警告 / 🟢 建议
2. **位置**:文件名和行号
3. **问题**:描述
4. **建议**:如何修复
 
## 示例输出
 

🔴 严重 位置: src/auth.ts:42 问题: 密码使用 md5 哈希 建议: 改用 bcrypt,rounds ≥ 12

使用:

使用 code-review 技能审查 @src/api.ts

真实场景案例 ①:团队代码审查标准化

某 12 人团队以前 Code Review 质量参差不齐,有的审查者只看风格,有的只看逻辑。引入 code-review 技能后,AI 按照统一清单逐项检查,每次审查覆盖安全、性能、可维护性、测试四个维度,遗漏率降低 80%。


使用技能

自动发现

OpenCode 会自动发现以下位置的技能:

  1. 当前项目 .opencode/skills/
  2. 全局 ~/.config/opencode/skills/
  3. 向上遍历到 Git 根目录

手动加载

使用 skill:react-component 生成一个 Button 组件

或:

/load react-component

在规则中引用技能

{
  "rules": [
    "生成 React 组件时,使用项目定义的 react-component 技能",
    "提交代码前,使用 code-review 技能自我审查"
  ]
}

团队技能共享方案

方案 A:Git 子目录(推荐小团队)

将技能直接提交到项目仓库:

# 项目仓库
my-project/
├── src/
├── .opencode/
└── skills/
├── code-review/
└── api-docs/
└── opencode.json

优点:版本控制、与代码同步、零配置 缺点:跨项目复用需复制

方案 B:独立技能仓库(推荐中团队)

创建专门的技能仓库,通过 Git Submodule 或脚本同步:

# 团队技能仓库
team-opencode-skills/
├── README.md
├── code-review/
└── SKILL.md
├── react-components/
└── SKILL.md
└── scripts/
    └── install.sh

安装脚本:

#!/bin/bash
# scripts/install.sh
 
SKILLS_DIR="${HOME}/.config/opencode/skills"
REPO_URL="[email protected]:your-org/team-opencode-skills.git"
 
# 克隆或更新
if [ -d "$SKILLS_DIR/.git" ]; then
  cd "$SKILLS_DIR" && git pull
else
  git clone "$REPO_URL" "$SKILLS_DIR"
fi
 
echo "✅ 团队技能已同步到 $SKILLS_DIR"

优点:统一管理、跨项目复用、权限控制 缺点:需要维护同步机制

方案 C:包管理器分发(推荐大团队)

将技能打包为 npm 包:

{
  "name": "@your-org/opencode-skills",
  "version": "1.0.0",
  "scripts": {
    "postinstall": "node scripts/install.js"
  }
}

安装:

npm install -g @your-org/opencode-skills

真实场景案例 ②:企业级技能管理

某互联网公司有 30+ 微服务团队,每个团队有独特的技术栈和规范。公司在内部 npm 仓库发布 @corp/opencode-skills,包含各团队的技能包。新成员入职时一键安装,AI 立即了解团队规范,上手时间从 2 周缩短到 2 天。


技能市场规范

如果你想将技能分享到社区,建议遵循以下规范:

目录结构规范

my-skill/
├── SKILL.md          # 技能定义(必须)
├── README.md         # 使用说明
├── examples/         # 示例文件(可选)
│   └── example.tsx
├── CHANGELOG.md      # 变更日志(可选)
└── LICENSE           # 许可证(推荐)

SKILL.md 规范

---
name: skill-name
description: 清晰的技能描述
version: 1.0.0
license: MIT
author: your-name
tags:
  - relevant-tag
---
 
# 技能标题
 
## 简介
 
一两句话说明这个技能是做什么的。
 
## 使用场景
 
- 场景 1:...
- 场景 2:...
 
## 使用方式
 

使用 skill:skill-name 做某事


## 规范详情

详细的指令、模板、检查项...

## 示例

### 输入

...用户请求示例...

### 输出

...期望的 AI 输出示例...

技能命名规范

类型命名示例说明
代码生成react-component, api-endpoint动词+名词
代码审查code-review, security-audit功能导向
文档生成api-docs, changelog产出物导向
工作流git-workflow, deploy-checklist流程导向

社区分享渠道

  • GitHub Discussions — OpenCode 官方社区
  • Awesome OpenCode — 精选技能列表
  • npm — 可安装的技能包
  • Gist — 快速分享单个技能

高级技能示例

API 设计技能

---
name: api-design
description: 设计符合 RESTful 规范的 API
tags:
  - api
  - backend
---
 
# API 设计规范
 
## 路由命名
 
- 使用 kebab-case:`/user-profiles` 而非 `/userProfiles`
- 资源名用复数:`/orders` 而非 `/order`
- 动作用语义 HTTP 方法,不用动词路径
 
## 请求/响应格式
 
```json
// 请求
{
  "data": { ... }
}
 
// 成功响应
{
  "success": true,
  "data": { ... },
  "meta": { "page": 1, "perPage": 20 }
}
 
// 错误响应
{
  "success": false,
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "字段 email 格式不正确",
    "details": [{ "field": "email", "issue": "invalid_format" }]
  }
}

HTTP 状态码

场景状态码
成功200 / 201
参数错误400
未认证401
无权限403
不存在404
服务端错误500

---

## FAQ

**Q: 技能和规则有什么区别?**
> A: 规则是全局约束(如"使用单引号"),技能是按需加载的能力(如"按规范生成 React 组件")。规则始终生效,技能需要显式或按需调用。

**Q: 一个项目可以有多少个技能?**
> A: 没有硬性限制,但建议控制在 10-20 个以内。过多技能会导致发现困难,建议按团队/领域拆分。

**Q: 技能可以引用其他技能吗?**
> A: 目前不支持技能之间的显式引用。可以在一个技能的内容中说明"配合 X 技能使用"。

**Q: 技能更新后需要重启 OpenCode 吗?**
> A: 通常不需要。OpenCode 会在加载时读取最新的 SKILL.md 文件。如果已加载的技能正在使用中,新会话会使用最新版本。

---

## 避坑清单 ⚠️

| 坑 | 后果 | 正确做法 |
|----|------|----------|
| 技能描述过于模糊 | AI 无法理解技能意图 | 描述具体、包含使用场景 |
| 技能内容过长 | 占用过多上下文 | 控制在 500 行以内,核心规范优先 |
| 团队技能不纳入版本控制 | 新成员无法获取 | 将 `.opencode/skills/` 提交到 Git |
| 全局技能和项目技能冲突 | 行为不可预期 | 明确优先级,避免重复定义 |
| 技能命名不统一 | 发现困难 | 使用 kebab-case,语义清晰 |
| 忘记更新技能版本 | 无法追踪变更 | 修改后更新 `version` 字段 |
| 技能包含敏感信息 | 信息泄露 | 敏感配置使用环境变量 |

---

## 练习

1. 创建一个适合你们团队的技能(代码审查、组件生成、API 设计等)
2. 测试技能效果,让 AI 按技能规范输出
3. 与团队分享,将技能提交到 Git
4. 尝试创建一个全局技能,在多个项目中复用

---

🎉 中级教程完成!你已掌握 OpenCode 的进阶功能:

- ⚙️ 多层配置体系与优先级
- 🧠 模型选择策略与本地部署
- 🔒 工具权限与安全策略
- 📋 规则系统与团队规范
- 🔌 MCP 服务器集成
- 🐙 GitHub/GitLab 工作流
- 🖥️ 多界面形态选择
- 🛠️ 代理技能创建与共享

进入高级教程,学习定制和开发:

[16. 自定义工具开发](../advanced/16-custom-tools.md)
分享

评论

登录 后参与讨论。

加载中…

相关文章