本教程面向已掌握单个 Skill 创建的开发者,深入讲解 Claude Code 的 Skill Collaboration(技能协作)机制——如何让多个 Skill 自动串联、互相交接,形成端到端自动化工作流。学完本教程,你将掌握 Skill 链式触发的三种模式、Handoff 协议设计、跨平台兼容性处理,并能构建一个从代码审查到自动部署的完整协作链。
适用人群:已有 Claude Code 基础使用经验,至少创建过一个自定义 Skill 的开发者。
| 条件 | 说明 |
|---|---|
| Claude Code | 版本 ≥ 2.1.0(支持 Skill Collaboration) |
| 已有 Skill 经验 | 至少完成过一个 SKILL.md 编写 |
| Git 基础 | 理解分支、提交、PR 流程 |
| 测试环境 | 一个可运行的 Node.js 或 Python 项目 |
单个 Skill 解决的是一个特定场景。但真实开发流程是连续的:写代码 → 审查 → 测试 → 部署。如果每个环节都需要人工调用不同的 Skill,效率提升有限。
Skill Collaboration 的核心理念:
flowchart LR
A[Skill A: 代码生成] -->|自动触发| B[Skill B: 安全审查]
B -->|自动触发| C[Skill C: 测试生成]
C -->|自动触发| D[Skill D: 部署准备]
style A fill:#4A90D9,color:#fff
style B fill:#E67E22,color:#fff
style C fill:#27AE60,color:#fff
style D fill:#8E44AD,color:#fff
与传统"手动逐个调用"相比,Skill 协作链的区别在于:
| 维度 | 手动调用 | 协作链 |
|---|---|---|
| 触发方式 | 用户逐个 /skill-name |
前一个 Skill 结尾自动触发下一个 |
| 上下文传递 | 靠用户口头描述 | 结构化 Handoff 数据 |
| 错误处理 | 人工判断 | 链内置回退机制 |
| 可复现性 | 低 | 高(链定义即流程) |
Claude Code 的 Skill 系统支持三种协作触发模式:
模式一:显式指令触发(Explicit Trigger)
在 SKILL.md 中通过指令文本让 Claude 在适当时机调用下一个 Skill:
---
name: code-review-skill
description: 执行代码审查并触发安全检查
---
# 代码审查 Skill
## 审查流程
1. 检查变更文件的 diff
2. 按编码规范逐项审查
3. 标记问题并给出建议
## 审查完成后
审查通过后,使用 Skill 工具调用 `security-scan` Skill,
将审查结果作为上下文传递,执行安全扫描。
模式二:条件触发(Conditional Trigger)
根据执行结果决定是否触发下一个 Skill:
---
name: smart-test-runner
description: 智能测试运行器,失败时自动触发调试
---
## 测试执行
1. 识别变更文件
2. 运行相关测试套件
3. 分析测试结果
## 条件分支
- **测试全部通过**:输出通过摘要,使用 Skill 工具调用 `deploy-prep` Skill
- **测试失败**:使用 Skill 工具调用 `test-debugger` Skill,传递失败用例列表和错误日志
模式三:并行触发(Parallel Trigger)
同时触发多个独立 Skill,适合无依赖关系的并行任务:
---
name: pr-quality-gate
description: PR 质量门禁,并行执行多项检查
---
## 并行检查流程
当用户请求 PR 质量检查时,同时执行以下操作:
1. 使用 Task 工具启动 subagent 执行 `code-review-skill`
2. 使用 Task 工具启动 subagent 执行 `security-scan`
3. 使用 Task 工具启动 subagent 执行 `performance-check`
等待所有 subagent 完成后,汇总结果生成质量报告。
flowchart TB
subgraph 显式触发
A1[Skill A] --> A2[Skill B] --> A3[Skill C]
end
subgraph 条件触发
B1[Skill A] --> B2{判断条件}
B2 -->|通过| B3[Skill B]
B2 -->|失败| B4[Skill C]
end
subgraph 并行触发
C1[Skill A] --> C2[Skill B]
C1 --> C3[Skill C]
C1 --> C4[Skill D]
C2 --> C5[汇总]
C3 --> C5
C4 --> C5
end
Skill 协作的核心挑战是上下文传递。一个 Skill 执行完,下一个 Skill 需要知道哪些信息?这就是 Handoff 协议要解决的问题。
最佳实践是在 Skill 的输出末尾包含一段结构化的交接摘要:
---
name: code-review-skill
description: 代码审查
---
## 审查流程
(审查步骤省略...)
## 交接输出格式
审查完成后,在输出末尾生成以下格式的交接摘要:
---
### HANDOFF
- source: code-review-skill
- status: passed | failed | warning
- reviewed_files: [文件列表]
- issues_found: N
- critical_issues: [关键问题列表]
- summary: [一句话总结]
---
下游 Skill 在 SKILL.md 开头声明它期望接收的上下文:
---
name: security-scan
description: 安全漏洞扫描
---
# 安全扫描 Skill
## 输入上下文
本 Skill 接收来自 `code-review-skill` 的交接数据:
- `reviewed_files`:已审查的文件列表,仅对这些文件执行安全扫描
- `critical_issues`:代码审查中发现的关键问题,作为安全扫描的优先关注点
## 扫描流程
1. 读取上游 Skill 交接的文件列表
2. 对每个文件执行 OWASP Top 10 规则检查
3. 结合上游标记的关键问题进行深度分析
## 交接输出格式
(下游交接格式...)
以下是一个可复用的交接协议模板:
## 交接协议规范
### 交接头部(必须)
\```
### HANDOFF_HEADER
- source_skill: [当前Skill名称]
- target_skill: [下一个Skill名称]
- timestamp: [执行时间]
- status: success | failure | partial
\```
### 交接负载(按需)
\```
### HANDOFF_PAYLOAD
- artifacts: [生成的文件路径列表]
- data: { key: value } # 结构化数据
- warnings: [警告列表]
- next_actions: [建议的后续操作]
\```
### 交接尾部(必须)
\```
### HANDOFF_FOOTER
- context_preserved: true/false
- cleanup_needed: [需要清理的资源]
\```
下面我们构建一个完整的 PR 质量门禁系统,包含四个 Skill 的协作链:
flowchart TD
Start[用户: /pr-quality-gate] --> A[pr-gate-orcherstrator]
A --> B1[code-review-skill]
A --> B2[security-scan-skill]
B1 --> C[汇总节点]
B2 --> C
C --> D{质量达标?}
D -->|是| E[test-runner-skill]
D -->|否| F[生成问题报告]
E --> G{测试通过?}
G -->|是| H[输出部署就绪标记]
G -->|否| I[test-debugger-skill]
style A fill:#3498DB,color:#fff
style B1 fill:#E67E22,color:#fff
style B2 fill:#E74C3C,color:#fff
style C fill:#2ECC71,color:#fff
style E fill:#9B59B6,color:#fff
style I fill:#F39C12,color:#fff
这是协作链的入口,负责启动和协调所有下游 Skill。
文件路径:~/.claude/skills/pr-gate-orchestrator/SKILL.md
---
name: pr-gate-orchestrator
description: PR质量门禁编排器,协调代码审查、安全扫描和测试
---
# PR 质量门禁编排器
## 触发条件
当用户请求 PR 质量检查、代码门禁、或提到"质量门禁"时激活。
## 编排流程
### 第一步:信息收集
1. 运行 `git diff --name-only origin/main...HEAD` 获取变更文件列表
2. 运行 `git log --oneline -5` 获取最近提交
3. 统计变更行数:`git diff --stat origin/main...HEAD`
### 第二步:并行审查(使用 Task 工具)
启动两个并行 subagent:
**Subagent 1 — 代码审查**
使用 Skill 工具调用 `code-review-skill`,传递:
- 变更文件列表
- 变更统计信息
**Subagent 2 — 安全扫描**
使用 Skill 工具调用 `security-scan-skill`,传递:
- 变更文件列表(仅代码文件)
### 第三步:结果汇总
等待两个 subagent 完成,汇总结果:
- 代码审查评分(0-100)
- 安全扫描结果(通过/失败 + 漏洞列表)
- 综合质量评分
### 第四步:条件分支
- **评分 ≥ 80 且无严重安全问题**:使用 Skill 工具调用 `test-runner-skill`
- **评分 < 80 或存在严重问题**:输出问题报告,列出所有发现的问题和修复建议
### 输出格式
\```
# PR 质量门禁报告
## 变更概要
- 文件数: N | 新增: N | 修改: N | 删除: N
- 代码行数: +N / -N
## 代码审查(评分: XX/100)
(审查结果)
## 安全扫描(状态: 通过/失败)
(扫描结果)
## 综合评估
- 状态: ✅ 通过 / ❌ 未通过
- 建议: [改进建议]
\```
文件路径:~/.claude/skills/code-review-skill/SKILL.md
---
name: code-review-skill
description: 基于规则的代码审查,支持多语言
---
# 代码审查 Skill
## 输入
- `files`: 待审查文件列表(由编排器传递)
- `focus_areas`: 特别关注领域(可选)
## 审查维度
### 1. 代码质量(权重 30%)
- 命名规范性
- 函数长度(超过 50 行扣分)
- 嵌套深度(超过 4 层扣分)
- 重复代码检测
### 2. 错误处理(权重 25%)
- 异常捕获是否合理
- 边界条件是否处理
- 错误信息是否有意义
### 3. 可维护性(权重 25%)
- 是否有适当的抽象
- 依赖是否合理
- 配置是否外部化
### 4. 性能(权重 20%)
- 是否有明显的性能问题
- 资源是否正确释放
- 数据库查询是否高效
## 审查流程
1. 逐文件读取内容
2. 按四个维度打分
3. 生成改进建议
4. 计算总评分
## 交接输出
\```
### HANDOFF
- source: code-review-skill
- score: [0-100]
- issues:
- category: [quality|error-handling|maintainability|performance]
severity: critical|warning|info
file: [文件路径]
line: [行号]
message: [问题描述]
suggestion: [修改建议]
\```
文件路径:~/.claude/skills/security-scan-skill/SKILL.md
---
name: security-scan-skill
description: OWASP Top 10 安全漏洞扫描
---
# 安全扫描 Skill
## 扫描规则
### 注入漏洞(SQL/Command/LDAP)
检查以下模式:
- 字符串拼接构建 SQL
- 未过滤的用户输入传入 `exec()`/`system()`
- 直接拼接 URL 参数
### 跨站脚本(XSS)
- 未转义的 HTML 输出
- `innerHTML` 直接赋值
- `v-html` / `dangerouslySetInnerHTML` 使用
### 敏感数据泄露
- 硬编码密钥/密码
- 日志中打印敏感信息
- API 响应包含多余字段
### 访问控制缺陷
- 缺少权限校验的 API 端点
- 未验证的 IDOR 场景
- 缺少 CORS 配置
### 安全配置错误
- 调试模式开启
- 默认密码/密钥
- 不安全的 HTTP 头
## 扫描流程
1. 使用 Grep 工具搜索危险模式
2. 逐个确认是否为真实漏洞
3. 按严重程度分级
## 交接输出
\```
### HANDOFF
- source: security-scan-skill
- status: passed | failed
- vulnerabilities:
- type: [漏洞类型]
severity: critical|high|medium|low
file: [文件路径]
line: [行号]
cwe: [CWE编号]
remediation: [修复方案]
\```
文件路径:~/.claude/skills/test-runner-skill/SKILL.md
---
name: test-runner-skill
description: 智能测试运行器,失败时触发调试
---
# 测试运行 Skill
## 测试策略
1. 根据变更文件识别受影响的测试
2. 优先运行与变更直接相关的测试
3. 运行完整测试套件(如果时间允许)
## 执行流程
### Node.js 项目
\```bash
# 识别测试文件
git diff --name-only origin/main...HEAD | grep -E '\.(ts|js|tsx|jsx)$'
# 运行相关测试
npx jest --changedSince=origin/main --coverage
\```
### Python 项目
\```bash
# 运行受影响的测试
pytest --co -q # 列出测试
pytest tests/ -v --tb=short # 执行测试
\```
## 条件分支
- **全部通过**:输出覆盖率和通过摘要
- **有失败**:使用 Skill 工具调用 `test-debugger-skill`,传递:
- 失败测试名称列表
- 错误堆栈信息
- 相关源文件路径
## 交接输出
\```
### HANDOFF
- source: test-runner-skill
- status: passed | failed
- total: [总测试数]
- passed: [通过数]
- failed: [失败数]
- coverage: [覆盖率%]
- failed_tests:
- name: [测试名]
file: [文件路径]
error: [错误信息]
\```
# 创建协作链目录结构
mkdir -p ~/.claude/skills/pr-gate-orchestrator
mkdir -p ~/.claude/skills/code-review-skill
mkdir -p ~/.claude/skills/security-scan-skill
mkdir -p ~/.claude/skills/test-runner-skill
将上述四个 SKILL.md 分别保存到对应目录。
在 Claude Code 中执行:
/pr-gate-orchestrator
预期行为: 1. Claude 识别并加载编排器 Skill 2. 自动读取当前 Git 仓库的变更信息 3. 启动并行 subagent 执行代码审查和安全扫描 4. 等待结果后进行条件判断 5. 如果通过,自动触发测试运行
| 问题 | 原因 | 解决方案 |
|---|---|---|
| Skill 未被识别 | 文件路径错误 | 确认路径为 ~/.claude/skills/<name>/SKILL.md |
| 下游 Skill 未触发 | SKILL.md 中未写触发指令 | 添加 使用 Skill 工具调用 xxx 指令 |
| 上下文丢失 | Handoff 数据格式不规范 | 使用标准交接模板 |
| subagent 超时 | 检查范围太大 | 限制 Grep 搜索的文件范围 |
| 循环触发 | 两个 Skill 互相调用 | 添加最大深度限制 |
固定顺序的协作链适用于稳定流程,但真实场景往往需要根据运行时状态动态决定下一步。
根据项目类型自动选择不同的 Skill 链:
---
name: smart-ci
description: 智能CI,根据项目类型动态编排
---
## 项目类型检测
1. 检查 `package.json` → Node.js 项目
2. 检查 `requirements.txt` / `pyproject.toml` → Python 项目
3. 检查 `Cargo.toml` → Rust 项目
4. 检查 `go.mod` → Go 项目
## 动态路由
- **Node.js 项目**:调用 `npm-audit-skill` → `jest-runner-skill` → `bundle-size-skill`
- **Python 项目**:调用 `safety-check-skill` → `pytest-runner-skill` → `coverage-skill`
- **Rust 项目**:调用 `cargo-audit-skill` → `cargo-test-skill` → `clippy-skill`
- **Go 项目**:调用 `govulncheck-skill` → `go-test-skill` → `lint-skill`
## 动态决策逻辑
根据代码审查评分决定后续流程:
- **评分 90+**(优秀):
跳过人工审查,直接 → 测试 → 自动合并
- **评分 70-89**(良好):
→ 测试 → 生成审查报告 → 等待人工确认
- **评分 50-69**(一般):
→ 生成详细问题报告 → 使用 Skill 工具调用 `auto-fix-skill` 尝试自动修复
- **评分 < 50**(不达标):
→ 输出详细问题报告 → 阻断合并 → 建议手动修复
Skill 协作链不仅限于 Claude Code。相同的 SKILL.md 文件可以在多个 AI 编码工具中使用。
| 特性 | Claude Code | GitHub Copilot CLI | Cursor | Gemini CLI |
|---|---|---|---|---|
| SKILL.md 加载 | ✅ 原生 | ✅ 通过 plugin.json | ✅ 通过 .cursor/rules | ✅ 通过 GEMINI.md |
| Skill 工具调用 | Skill |
skill |
内嵌触发 | activate_skill |
| Task subagent | Task |
不支持 | Agent 模式 | 部分支持 |
| Handoff 协议 | ✅ 完整 | ✅ 文本传递 | ✅ 文本传递 | ✅ 文本传递 |
<!-- 跨平台兼容的 Skill 编写原则 -->
1. **工具名称不硬编码**
❌ 不要写: "使用 Task 工具启动 subagent"
✅ 应该写: "启动并行任务执行安全扫描"
2. **交接数据使用纯文本格式**
避免依赖特定工具的 JSON 解析能力
3. **错误处理要通用**
不要依赖 Claude Code 特有的错误格式
4. **文件路径使用相对路径**
❌ /Users/xxx/.claude/skills/...
✅ ./skills/... 或 ~/.claude/skills/...
对于 GitHub Copilot CLI,需要额外创建 plugin.json:
{
"name": "pr-gate-orchestrator",
"description": "PR质量门禁编排器",
"skills": [
{
"name": "pr-gate-orchestrator",
"description": "PR质量门禁编排器",
"file": "SKILL.md"
}
]
}
在构建复杂链之前,先确保每个 Skill 独立可用:
# 在 Claude Code 中单独测试每个 Skill
/code-review-skill
# 验证点:
# 1. Skill 是否被正确加载
# 2. 是否生成了 Handoff 输出
# 3. Handoff 数据格式是否正确
使用一个小的测试项目验证完整链:
# 创建测试项目
mkdir /tmp/skill-chain-test && cd /tmp/skill-chain-test
git init
npm init -y
# 创建一个故意有问题的文件
cat > index.js << 'EOF'
const userInput = process.argv[2];
const query = "SELECT * FROM users WHERE id = " + userInput;
db.exec(query);
function processData(data) {
for (let i = 0; i < data.length; i++) {
for (let j = 0; j < data[i].items.length; j++) {
for (let k = 0; k < data[i].items[j].length; k++) {
console.log(data[i].items[j][k]);
}
}
}
}
EOF
git add . && git commit -m "test: add problematic code"
然后运行 /pr-gate-orchestrator,验证:
1. 代码审查 Skill 应发现嵌套过深和性能问题
2. 安全扫描 Skill 应发现 SQL 注入漏洞
3. 综合评分应低于 80,不会触发测试
4. 输出的报告应包含所有发现的问题
查看 Skill 加载日志:
在 Claude Code 中输入:
请列出你当前加载的所有 Skills
模拟 Handoff 数据:
如果下游 Skill 没有正确接收数据,可以手动模拟:
请假装收到了以下 Handoff 数据,然后执行 security-scan-skill:
### HANDOFF
- source: code-review-skill
- score: 75
- reviewed_files: ["index.js", "utils.py"]
- critical_issues: ["SQL注入风险 in index.js:2"]
渐进式构建:
不要一次性构建完整链。推荐顺序: 1. 先让编排器单独运行,确认它能收集信息 2. 添加第一个下游 Skill(代码审查),测试二步链 3. 添加第二个下游 Skill(安全扫描),测试并行分支 4. 添加条件逻辑,测试分支判断 5. 添加第三个下游 Skill(测试运行),测试完整链
长协作链会消耗大量上下文窗口。优化策略:
| 策略 | 方法 | 节省量 |
|---|---|---|
| 精简 Handoff | 只传文件名列表,不传文件内容 | ~70% |
| 流式处理 | 每完成一个 Skill 就摘要化输出 | ~50% |
| 范围限定 | 用 glob 限制 Grep 搜索范围 | ~40% |
| 增量扫描 | 只扫描 git diff 的行,不扫描全文件 | ~60% |
## 编排器性能配置
### 并行策略
- 小型变更(< 10 文件):完全并行,一次性启动所有 subagent
- 中型变更(10-50 文件):分组并行,每组 3-5 个 subagent
- 大型变更(> 50 文件):串行处理,逐文件/模块执行
### 超时配置
- 单文件扫描:30 秒
- 单 Skill 执行:3 分钟
- 完整链执行:10 分钟
以下是一个可以直接使用的完整 PR 质量门禁协作链。将它保存到你的 Skill 目录即可使用:
目录结构:
~/.claude/skills/
├── pr-gate-orchestrator/
│ └── SKILL.md
├── code-review-skill/
│ └── SKILL.md
├── security-scan-skill/
│ └── SKILL.md
└── test-runner-skill/
└── SKILL.md
完整编排器 SKILL.md:
---
name: pr-gate-orchestrator
description: |
PR质量门禁编排器。当用户请求PR检查、质量门禁、代码质量评估时触发。
自动协调代码审查、安全扫描和测试运行三个Skill。
---
# PR 质量门禁编排器
## 适用场景
- 用户提到 "PR 检查"、"质量门禁"、"code review"、"质量评估"
- 用户提交了 PR 并希望自动检查
- CI/CD 前置质量检查
## 第一步:收集变更信息
执行以下命令收集当前分支的变更信息:
1. `git diff --name-only origin/main...HEAD` — 获取变更文件列表
2. `git diff --stat origin/main...HEAD` — 获取变更统计
3. `git log --oneline -10` — 获取最近提交记录
将结果记录为 `CHANGE_INFO`。
## 第二步:并行启动审查
使用 Task 工具启动两个并行 subagent:
### Subagent A:代码审查
在 subagent 中使用 Skill 工具调用 `code-review-skill`。
将 `CHANGE_INFO` 中的文件列表传递给它。
### Subagent B:安全扫描
在 subagent 中使用 Skill 工具调用 `security-scan-skill`。
将 `CHANGE_INFO` 中的代码文件(排除 .md/.txt/.json 配置文件)传递给它。
## 第三步:汇总评估
等待两个 subagent 完成后,汇总结果:
### 评分计算
- 代码审查分(满分 100) × 0.5
- 安全扫描分(通过=100,有高危=40,有严重=0) × 0.5
- 综合分 = 两项加权平均
### 判定标准
- **综合分 ≥ 85 且无严重安全问题** → 进入第四步
- **综合分 < 85 或存在严重问题** → 跳到第五步
## 第四步:运行测试(条件执行)
如果第三步判定通过,使用 Skill 工具调用 `test-runner-skill`。
传递通过审查的文件列表。
等待测试完成后:
- 测试通过 → 输出 "✅ PR 质量门禁通过" 报告
- 测试失败 → 输出测试失败详情,建议修复后重新提交
## 第五步:问题报告(条件执行)
如果第三步判定未通过,生成详细问题报告:
| 指标 | 值 |
|---|---|
| 变更文件数 | N |
| 新增行数 | +N |
| 删除行数 | -N |
[列出所有发现的问题]
[列出所有安全漏洞]
[按优先级排序的修复建议]
修复完成后,再次运行 /pr-gate-orchestrator
## 约束
- 不要修改任何代码文件,仅做分析和报告
- 不要执行 git push 或任何远程操作
- 如果项目没有 git 仓库,提示用户初始化或指定对比分支
| 维度 | 评估 |
|---|---|
| 适合训练营类型 | 进阶开发者训练营、AI 工程师训练营、DevOps 自动化训练营 |
| 预计教学时长 | 4-6 小时(含实操) |
| 前置知识要求 | Claude Code 基础使用、至少完成过一个 Skill 创建 |
| 实操难度 | ⭐⭐⭐⭐(中高) |
| 学员人数建议 | ≤ 20 人(需个性化指导) |
| 硬件要求 | 每人一台电脑,已安装 Claude Code 和 Git |
| 课程结构建议 | 1h 理论 + 1.5h 单 Skill 构建 + 1.5h 协作链集成 + 1h 自由实践 + 0.5h 答疑 |
[!tip] 51学通信知识星球 星主:爱卫生(微信:gprshome201101)——公众号「51学通信」创办者,19 年通信行业运维与讲师经验,著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书(各大电商平台有售)。 星球定位:深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域,主打运维岗位与信令分析。 当前规模:5200 篇主题 / 990 个回答,198 元/年。 加入福利:加入星球后请加爱卫生微信,拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题,另有群内分享。 AI 加持:51学通信知识星球已作为 skill 接入 WorkBuddy,使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例,做总结、找文档和 PPT 等场景全覆盖。
