name: designing-workflow-skills description: >- 指导基于工作流的Claude Code技能的设计和结构化,包括多阶段流程、决策树、子代理委派和渐进式披露。适用于创建涉及序列管道、路由模式、安全门、任务跟踪、分阶段执行或任何多步工作流的技能。也适用于审查或重构现有工作流技能以提升质量。 allowed-tools:
- Read
- Glob
- Grep
- TodoRead
- TodoWrite
设计工作流技能
通过遵循结构模式而非散文,构建可靠执行的工作流技能。
基本原则
<essential_principles>
<principle name=“描述即触发器”>
description字段是唯一控制技能激活的因素。
Claude仅根据前置元数据description决定是否加载技能。SKILL.md的主体内容——包括“何时使用”和“何时不使用”部分——仅在技能激活后才读取。将触发关键词、用例和排除条件放在描述中。糟糕的描述会导致错误的激活或遗漏激活,无论主体内容如何说明。
“何时使用”和“何时不使用”部分仍有其用途:它们在技能激活后界定LLM的行为。“何时不使用”应指定具体替代方案:例如“使用Semgrep进行简单模式匹配”,而不是“不用于简单任务”。 </principle>
<principle name=“编号阶段”> 阶段必须编号,并包含进入和退出标准。
未编号的散文指令会导致执行顺序不可靠。每个阶段需要:
- 一个编号(阶段1、阶段2、…)
- 进入标准(开始前必须满足的条件)
- 编号操作(要执行的动作)
- 退出标准(如何知道已完成) </principle>
<principle name=“工具匹配执行器”> 工具必须与执行器匹配。
技能使用前置元数据中的allowed-tools:。代理使用前置元数据中的tools:。子代理从其subagent_type获取工具。永远不要列出组件不使用的工具。永远不要使用Bash进行有专用工具(如Glob、Grep、Read、Write、Edit)的操作。
大多数技能和代理应在工具列表中包含TodoRead和TodoWrite——这些工具在多步执行期间启用进度跟踪,即使对于不显式管理任务的技能也很有用。
</principle>
<principle name=“渐进式披露”> 渐进式披露是结构性的,而非可选的。
SKILL.md保持在500行以内。它仅包含LLM每次调用所需的内容:基本原则、路由、快速参考和链接。详细模式放在references/中。逐步流程放在workflows/中。深度仅一层——无引用链。
</principle>
<principle name=“可扩展工具模式”> 指令必须产生可扩展的工具调用模式。
每个工作流指令在运行时都会变为工具调用。如果工作流搜索N个文件中的M个模式,请合并成一个正则表达式——而不是N×M次调用。如果工作流为每个项目生成子代理,请使用批处理——而不是每个文件一个子代理。应用10,000文件测试:在心里对大仓库运行工作流,并检查工具调用次数是否保持有限。参见anti-patterns.md的AP-18和AP-19。 </principle>
<principle name=“自由度”> 将指令特异性与任务脆弱性匹配。
并非每个步骤都需要相同程度的规范。根据步骤校准:
- 低自由度(精确命令,无变体):脆弱操作——如数据库迁移、加密、破坏性动作。“准确运行此脚本。”
- 中自由度(带参数的伪代码):首选模式,变体可接受。“使用此模板并根据需要自定义。”
- 高自由度(启发式和判断):可变任务——如代码审查、探索、文档。“分析结构并提出改进建议。”
一个技能可以混合自由度级别。例如,安全审计技能可能在发现阶段使用高自由度(“探索代码库以查找认证模式”),在报告阶段使用低自由度(“准确使用此严重性分类表”)。 </principle>
</essential_principles>
何时使用
- 设计具有多步工作流或分阶段执行的新技能
- 创建在多个独立任务之间路由的技能
- 构建具有安全门(需要确认的破坏性动作)的技能
- 结构化使用子代理或任务跟踪的技能
- 审查或重构现有工作流技能以提升质量
- 决定如何将内容分割在SKILL.md、references/和workflows/之间
何时不使用
- 简单单用途技能,无工作流(仅指导)——直接编写SKILL.md
- 编写技能的实际领域内容(本指南教授结构,而非领域专业知识)
- 插件配置(plugin.json、hooks、commands)——使用插件开发指南
- 非技能Claude Code开发——本指南专门用于技能架构
模式选择
根据技能的结构选择正确的模式。在workflow-patterns.md中阅读完整模式描述。
技能有多少条不同的路径?
|
+-- 一条路径,始终相同
| +-- 是否执行破坏性动作?
| +-- 是 -> 安全门模式
| +-- 否 -> 线性进展模式
|
+-- 从共享设置出发的多条独立路径
| +-- 路由模式
|
+-- 序列中的多条依赖步骤
+-- 步骤是否有复杂依赖关系?
+-- 是 -> 任务驱动模式
+-- 否 -> 序列管道模式
模式摘要
| 模式 | 使用场景 | 关键特征 |
|---|---|---|
| 路由 | 从共享输入出发的多个独立任务 | 路由表将意图映射到工作流文件 |
| 序列管道 | 依赖步骤,每个步骤为下一步提供输入 | 自动检测可能从部分进度恢复 |
| 线性进展 | 单一路径,每次相同 | 带进入/退出标准的编号阶段 |
| 安全门 | 破坏性/不可逆动作 | 执行前两个确认门 |
| 任务驱动 | 复杂依赖关系,部分失败容忍度 | 带依赖跟踪的TaskCreate/TaskUpdate |
结构解剖
每个工作流技能都需要这个骨架,无论模式如何:
---
name: kebab-case-name
description: "第三人称描述带触发关键词——这是Claude决定激活技能的方式"
allowed-tools:
- [所需最少工具]
# 可选字段——参见tool-assignment-guide.md获取完整参考:
# disable-model-invocation: true # 仅用户可调用(非Claude)
# user-invocable: false # 仅Claude可调用(从/菜单隐藏)
# context: fork # 在隔离子代理上下文中运行
# agent: Explore # 子代理类型(需要context: fork)
# model: [模型名称] # 技能激活时切换模型
# argument-hint: "[文件名]" # 自动完成期间显示的提示
---
# 标题
## 基本原则
[3-5条非协商规则,带WHY解释]
## 何时使用
[4-6个具体场景——激活后界定行为]
## 何时不使用
[3-5个场景,带命名替代方案——激活后界定行为]
## [模式特定部分]
[路由表 / 管道步骤 / 阶段列表 / 门]
## 快速参考
[常用信息的紧凑表]
## 参考索引
[所有支持文件的链接]
## 成功标准
[输出验证的检查表]
技能支持三种字符串替换:美元前缀变量用于参数和会话ID,以及感叹号-反引号语法用于shell预处理。技能加载器在Claude看到文件之前处理这些——即使在代码围栏内——因此永远不要在文档文本中使用原始语法。参见tool-assignment-guide.md获取完整变量参考和使用指南。
反模式快速参考
最常见的错误。完整目录及前后修复在anti-patterns.md。
| AP | 反模式 | 单行修复 |
|---|---|---|
| AP-1 | 缺少目标/反目标 | 添加“何时使用”和“何时不使用”部分 |
| AP-2 | 单一SKILL.md(>500行) | 分割到references/和workflows/ |
| AP-3 | 引用链(A -> B -> C) | 所有文件从SKILL.md出发仅一跳 |
| AP-4 | 硬编码路径 | 对所有内部路径使用{baseDir} |
| AP-5 | 破损文件引用 | 提交前验证每条路径解析正确 |
| AP-6 | 未编号阶段 | 为每个阶段编号,带进入/退出标准 |
| AP-7 | 缺少退出标准 | 定义每个阶段的“完成”含义 |
| AP-8 | 无验证步骤 | 在每个工作流末尾添加验证 |
| AP-9 | 模糊路由关键词 | 为每条工作流路由使用独特关键词 |
| AP-11 | 错误工具用于任务 | 使用Glob/Grep/Read,而非Bash等效工具 |
| AP-12 | 过度授权工具 | 移除实际未使用的工具 |
| AP-13 | 模糊子代理提示 | 指定要分析的内容、查找目标和返回内容 |
| AP-15 | 引用转储 | 教授判断,而非原始文档 |
| AP-16 | 缺少合理化拒绝 | 为审计技能添加“合理化拒绝” |
| AP-17 | 无具体示例 | 显示关键指令的输入 -> 输出 |
| AP-18 | 笛卡尔积工具调用 | 将模式合并成单一正则表达式,一次性grep,然后过滤 |
| AP-19 | 无界子代理生成 | 将项目批量分组,每组一个子代理 |
| AP-20 | 描述总结工作流 | 描述 = 仅触发条件,永远不是工作流步骤 |
AP-10(无默认/回退路由)、AP-14(代理中缺少工具理由)和AP-20(描述总结工作流)在完整目录中。AP-20由于高影响包含在快速参考中。
工具分配快速参考
将组件类型映射到正确的工具集。完整指南在tool-assignment-guide.md。
| 组件类型 | 典型工具 |
|---|---|
| 只读分析技能 | Read, Glob, Grep, TodoRead, TodoWrite |
| 交互式分析技能 | Read, Glob, Grep, AskUserQuestion, TodoRead, TodoWrite |
| 代码生成技能 | Read, Glob, Grep, Write, Bash, TodoRead, TodoWrite |
| 管道技能 | Read, Write, Glob, Grep, Bash, AskUserQuestion, Task, TaskCreate, TaskList, TaskUpdate, TodoRead, TodoWrite |
| 只读代理 | Read, Grep, Glob, TodoRead, TodoWrite |
| 动作代理 | Read, Grep, Glob, Write, Bash, TodoRead, TodoWrite |
关键规则:
- 使用Glob(非
find)、Grep(非grep)、Read(非cat)——始终优先使用专用工具 - 技能使用
allowed-tools:——代理使用tools: - 仅列出指令实际引用的工具
- 只读组件永远不应有Write或Bash
合理化拒绝
设计工作流技能时,拒绝这些快捷方式:
| 合理化 | 为什么错误 |
|---|---|
| “哪个阶段下一个很明显” | LLM不从散文推断顺序。为阶段编号。 |
| “退出标准是隐含的” | 隐含标准是被跳过的标准。显式写出它们。 |
| “一个大SKILL.md更简单” | 写起来简单,执行起来差。LLM在500行后会失去焦点。 |
| “描述不重要” | 描述是技能如何被触发的。糟糕的描述意味着错误的激活或遗漏激活。 |
| “Bash可以做一切” | Bash文件操作脆弱。专用工具更好地处理编码、权限和格式化。 |
| “LLM会找出工具” | 它会猜错。为每个操作指定确切工具。 |
| “我稍后添加细节” | 不完整的技能会发布不完整。在编写前完全设计。 |
参考索引
| 文件 | 内容 |
|---|---|
| workflow-patterns.md | 5种模式,带结构骨架和示例 |
| anti-patterns.md | 20种反模式,带前后修复 |
| tool-assignment-guide.md | 工具选择矩阵、组件比较、子代理指南 |
| progressive-disclosure-guide.md | 内容分割规则、500行规则、大小指南 |
| 工作流 | 目的 |
|---|---|
| design-a-workflow-skill.md | 6阶段创建流程,从范围到自审查 |
| review-checklist.md | 结构化自审查检查表,用于提交就绪 |
成功标准
一个设计良好的工作流技能:
- [ ] 有“何时使用”和“何时不使用”部分
- [ ] 使用可识别模式(路由、管道、线性、安全门或任务驱动)
- [ ] 为所有阶段编号,带进入和退出标准
- [ ] 仅列出实际使用的工具(最小权限)
- [ ] 保持SKILL.md在500行以内,细节在references/workflows
- [ ] 无硬编码路径(使用
{baseDir}) - [ ] 无破损文件引用
- [ ] 无引用链(所有链接从SKILL.md出发仅一跳)
- [ ] 包括工作流末尾的验证步骤
- [ ] 有正确触发的描述(第三人称,特定关键词)
- [ ] 包括关键指令的具体示例
- [ ] 解释WHY,而不仅仅是WHAT,对于基本原则