writing-skills

当创建新技能、编辑现有技能或在部署前验证技能是否有效时使用

By jnmetacode · 921 installs

npx skills add jnmetacode/superpowers-zh --skill writing-skills

Source repository · Upstream listing

编写技能 概述 编写技能就是将测试驱动开发应用于流程文档。 个人技能存放在智能体特定的目录中(Claude Code 用 ~/.claude/skills ,Codex 用 ~/.agents/skills/ ) 你编写测试用例(带子智能体的压力场景),观察它们失败(基线行为),编写技能(文档),观察测试通过(智能体遵守规则),然后重构(堵住漏洞)。 核心原则: 如果你没有观察到智能体在没有该技能时失败,你就不知道这个技能是否教了正确的东西。 必需背景: 在使用此技能前,你必须理解 test driven development。该技能定义了基本的红 绿 重构循环。本技能将 TDD 适配到文档编写中。 官方指南: Anthropic 官方的技能编写最佳实践请参见 anthropic best practices.md。该文档提供了补充本技能 TDD 导向方法的额外模式和指南。 什么是技能? 技能 是经过验证的技术、模式或工具的参考指南。技能帮助未来的 Claude 实例找到并应用有效的方法。 技能是: 可复用的技术、模式、工具、参考指南 技能不是: 关于你某次如何解决问题的叙事 TDD 映射到技能 TDD 概念 技能创建 测试用例 带子智能体的压力场景 生产代码 技能文档(SKILL.md) 测试失败(红) 智能体在没有技能时违反规则(基线) 测试通过(绿) 智能体在有技能时遵守规则 重构 在保持合规的同时堵住漏洞 先写测试 在编写技能之前先运行基线场景 观察失败 记录智能体使用的确切合理化借口 最小代码 编写针对那些具体违规行为的技能 观察通过 验证智能体现在遵守规则 重构循环 发现新的合理化借口 → 堵住 → 重新验证 整个技能创建过程遵循红 绿 重构。 何时创建技能 创建条件: 技术对你来说不是直觉上显而易见的 你会在不同项目中反复引用 模式具有广泛适用性(非项目特定) 其他人也会受益 不要创建: 一次性解决方案 其他地方有充分文档的标准实践 项目特定的约定(放在 CLAUDE.md 中) 机械性约束(如果可以用正则/验证强制执行,就自动化——文档留给需要判断的场景) 技能类型 技术类 有具体步骤的方法(condition based waiting、root cause tracing) 模式类 思考问题的方式(flatten with flags、test invariants) 参考类 API 文档、语法指南、工具文档(office docs) 目录结构 扁平命名空间 所有技能在一个可搜索的命名空间中 分离文件的情况: 1. 大量参考内容 (100+ 行) API 文档、全面的语法说明 2. 可复用工具 脚本、实用程序、模板 保持内联: 原则和概念 代码模式(< 50 行) 其他所有内容 SKILL.md 结构 Frontmatter(YAML): 两个必需字段: name 和 description (完整支持字段参见 [agentskills.io/specification](https://agentskills.io/specification)) 总计最多 1024 字符 name :只使用字母、数字和连字符(不要用括号、特殊字符) description :第三人称,仅描述何时使用(不是做什么) 以"Use when..."开头,聚焦于触发条件 包含具体的症状、场景和上下文 绝不总结技能的流程或工作流 (参见 SDO 章节了解原因) 尽量控制在 500 字符以内 技能发现优化(SDO) 发现至关重要: 未来的 Claude 需要找到你的技能 1. 丰富的描述字段 目的: Claude 读取描述来决定为当前任务加载哪些技能。让它能回答:"我现在应该读这个技能吗?" 格式: 以"Use when..."开头,聚焦于触发条件 关键:描述 = 何时使用,不是技能做什么 描述应该只描述触发条件。不要在描述中总结技能的流程或工作流。 为什么这很重要: 测试表明,当描述总结了技能的工作流时,Claude 可能会跟随描述而非阅读完整的技能内容。一个写着"任务间进行代码审查"的描述导致 Claude 只做了一次审查,尽管技能的流程图清楚地展示了两次审查(先规格合规再代码质量)。 当描述改为仅"在当前会话中执行包含独立任务的实现计划时使用"(无工作流摘要)时,Claude 正确地阅读了流程图并遵循了两阶段审查流程。 陷阱: 总结工作流的描述创建了 Claude 会走的捷径。技能正文变成了 Claude 跳过的文档。 内容: 使用具体的触发条件、症状和场景来表明此技能适用 描述问题(竞态条件、行为不一致)而非语言特定的症状(setTimeout、sleep) 保持触发条件技术无关,除非技能本身是技术特定的 如果技能是技术特定的,在触发条件中明确说明 用第三人称写(注入到系统提示中) 绝不总结技能的流程或工作流 2. 关键词覆盖 使用 Claude 会搜索的词语: 错误信息:"Hook timed out"、"ENOTEMPTY"、"race condition" 症状:"flaky"、"hanging"、"zombie"、"pollution" 同义词:"timeout/hang/freeze"、"cleanup/teardown/afterEach" 工具:实际命令、库名称、文件类型 3. 描述性命名 使用主动语态,动词优先: ✅ creating skills 而非 skill creation ✅ condition based waiting 而非 async test helpers 4. Token 效率(关键) 问题: getting started 和频繁引用的技能会加载到每个对话中。每个 token 都很重要。 目标字数: getting started 工作流:每个 <150 词 频繁加载的技能:总计 <200 词 其他技能:<500 词(仍要简洁) 技巧: 将细节移到工具帮助中: 使用交叉引用: 压缩示例: 消除冗余: 不要重复交叉引用的技能中已有的内容 不要解释从命令中就能看出的东西 不要为同一模式提供多个示例 验证: 用你做的事或核心洞察来命名: ✅ condition based waiting async test helpers ✅ using skills 而非 skill usage ✅ flatten with flags data structure refactoring ✅ root cause tracing debugging techniques 动名词( ing)适合描述流程: creating skills 、 testing skills 、 debugging with logs 主动的,描述你正在进行的操作 5. 交叉引用其他技能 编写引用其他技能的文档时: 仅使用技能名称,带有明确的必需标记: ✅ 好的: 必需子技能: 使用 test driven development ✅ 好的: 必需背景: 你必须理解 systematic debugging ❌ 差的: 参见 skills/testing/test driven development (不清楚是否必需) ❌ 差的: @skills/testing/test driven development/SKILL.md (强制加载,浪费上下文) 为什么不用 @ 链接: @ 语法会立即强制加载文件,在你需要之前就消耗 200k+ 的上下文。 流程图使用 仅在以下情况使用流程图: 非显而易见的决策点 你可能过早停止的流程循环 "何时使用 A vs B"的决策 绝不使用流程图用于: 参考资料 → 表格、列表 代码示例 → Markdown 代码块 线性指令 → 编号列表 无语义意义的标签(step1、helper2) 参见 @graphviz conventions.dot 了解 graphviz 样式规则。 为你的搭档可视化: 使用此目录中的 render graphs.js 将技能的流程图渲染为 SVG: 代码示例 一个优秀的示例胜过多个平庸的 选择最相关的语言: 测试技术 → TypeScript/JavaScript 系统调试 → Shell/Python 数据处理 → Python 好的示例: 完整可运行 注释良好,解释为什么 来自真实场景 清晰展示模式 可以直接适配(不是通用模板) 不要: 用 5 种以上语言实现 创建填空模板 写人为构造的示例 你擅长语言移植——一个优秀的示例就够了。 文件组织 自包含技能 适用场景:所有内容都能放下,无需大量参考 带可复用工具的技能 适用场景:工具是可复用的代码,不只是叙述 带大量参考的技能 适用场景:参考资料太多无法内联 铁律(与 TDD 相同) 这适用于新技能和对现有技能的编辑。 先写技能再测试?删掉它。重新开始。 编辑技能不测试?同样违规。 无例外: 不适用于"简单的添加" 不适用于"只是加一个章节" 不适用于"文档更新" 不要保留未测试的更改作为"参考" 不要在运行测试时"调整" 删除就是删除 必需背景: test driven development 技能解释了为什么这很重要。相同的原则适用于文档。 测试所有技能类型 不同类型的技能需要不同的测试方法: 纪律执行类技能(规则/要求) 例如: TDD、完成前验证、编码前设计 测试方式: 学术性问题:它们理解规则吗? 压力场景:它们在压力下遵守吗? 多重压力组合:时间 + 沉没成本 + 疲惫 识别合理化借口并添加明确的反驳 成功标准: 智能体在最大压力下遵循规则 技术类技能(操作指南) 例如: condition based waiting、root cause tracing、defensive programming 测试方式: 应用场景:它们能正确应用技术吗? 变体场景:它们能处理边界情况吗? 缺失信息测试:说明是否有遗漏? 成功标准: 智能体成功将技术应用于新场景 模式类技能(心智模型) 例如: reducing complexity、information hiding 概念 测试方式: 识别场景:它们能识别模式何时适用吗? 应用场景:它们能使用心智模型吗? 反例:它们知道何时不应用吗? 成功标准: 智能体正确识别何时/如何应用模式 参考类技能(文档/API) 例如: API 文档、命令参考、库指南 测试方式: 检索场景:它们能找到正确的信息吗? 应用场景:它们能正确使用找到的内容吗? 覆盖测试:常见用例是否都涵盖了? 成功标准: 智能体找到并正确应用参考信息 跳过测试的常见合理化借口 借口 现实 "技能显然很清晰" 对你清晰 ≠ 对其他智能体清晰。测试它。 "这只是参考资料" 参考资料可能有遗漏、不清楚的地方。测试检索。 "测试太过了" 未测试的技能总有问题。15 分钟测试省下数小时。 "有问题再测试" 问题 = 智能体无法使用技能。在部署前测试。 "测试太繁琐" 测试比在生产中调试坏技能少繁琐得多。 "我有信心它很好" 过度自信保证出问题。无论如何都要测试。 "学术审查就够了" 阅读 ≠ 使用。测试应用场景。 "没时间测试" 部署未测试的技能比后面修复浪费更多时间。 以上所有都意味着:部署前测试。无例外。 让形式匹配失败类型 在写指导内容之前,先给基线失败 归类 。能让某一类失败变得无懈可击的形式,用在另一类上会 可测量地反噬 。 基线失败 正确的形式 错误的形式 压力之下跳过/违反规则(明知故犯) 禁令 + 合理化借口表 + 红线(见下方"让技能经受住合理化的考验") 软性建议("优先……"、"考虑……") 遵守了,但产出的 形状 不对(提示词臃肿、结论被埋、复述规格) 正面配方或契约:直接说明产出 是什么 —— 它由哪些部分组成、按什么顺序 禁令清单("不要复述"、"绝不旁白") 在他们 本来就会产出 的东西里漏掉了必需元素 结构性手段:在他们要填的模板里放一个 REQUIRED 字段或占位槽 在模板附近写散文式提醒 行为 应当取决于某个条件 挂在可观察谓词上的条件句("如果简报存在,就引用它") 无条件规则 + 一堆例外条款 为什么禁令在"塑形"类问题上会反噬: 在存在竞争性激励时(比如"让提示词自包含"),智能体会 跟"不要 X"讨价还价 。在针对分派提示词指导做的同题措辞对照测试里,禁令组产出的不想要的内容明显 多于 配方组(两组分布完全分离),甚至比"完全不给指导"的对照组还差 —— 请对你自己的场景做微型测试,别想当然,但 永远不要把禁令当默认选择 。配方留不下可讨价还价的空间:产出要么符合所说的形状,要么不符合。 无论你选哪种形式,都适用的规则: 不要加"视情况"从句。 "不要 X,除非它很重要"会重新打开谈判 —— 在同一批措辞测试里,给一个胜出的配方追加 一条 "视情况"从句,就把它从稳定退化成了飘忽。真正的例外要表达成 它自己的 条件句,挂在可观察的谓词上。 豁免条款不会限定作用域。 "这条长度限制不适用于代码块",照样会压制代码块。如果产出里有一部分必须豁免,就 重构结构让规则碰不到它 ,而不是写豁免。 让技能经受住合理化的考验 执行纪律的技能(如 TDD)需要抵抗合理化。智能体很聪明,在压力下会找到漏洞。 心理学说明: 理解说服技巧为什么有效有助于你系统性地应用它们。参见 persuasion principles.md 了解研究基础(Cialdini, 2021; Meincke et al., 2025),涵盖权威、承诺、稀缺、社会认同和归属原则。 明确堵住每个漏洞 不要只是陈述规则——禁止具体的变通方法: <Bad </Bad <Good </Good 应对"精神 vs 字面"的辩论 在前面加入基础原则: 这切断了整类"我遵循的是精神"的合理化借口。 构建合理化借口表 从基线测试中捕获合理化借口(参见下方测试章节)。智能体使用的每个借口都进入表中: 创建红线列表 让智能体容易自查是否在合理化: 更新 SDO 以包含违规症状 在描述中添加:你即将违反规则时的症状: 技能的红 绿 重构 遵循 TDD 循环: 红:编写失败的测试(基线) 在没有技能的情况下运行压力场景。逐字记录行为: 它们做了什么选择? 它们使用了什么合理化借口(原文)? 哪些压力触发了违规? 这就是"观察测试失败"——在编写技能之前你必须看到智能体自然会怎么做。 绿:编写最小技能 编写针对那些具体合理化借口的技能。不要为假设情况添加额外内容。 用技能运行相同的场景。智能体应该现在遵守。 重构:堵住漏洞 智能体找到了新的合理化借口?添加明确的反驳。重新测试直到无懈可击。 先做措辞微型测试,再跑完整场景 完整的压力场景是最后一道关卡,但它每轮迭代都又慢又贵。先用 微型测试 验证措辞本身: 1. 每次调用一个全新上下文的样本 —— 一次裸 API 调用,或者没有 API 权限时用一个单发子智能体。system prompt 放 这条指导实际会存在的真实上下文 (完整的 skill 或提示词模板,不是把指导单独拎出来);user message 放一个会 诱发该失败 的任务。 2. 永远带一个"不给指导"的对照组。 如果对照组根本没表现出那个失败,那就没什么可修的 —— 停下,别写这条指导。 3. 每个变体至少 5 次重复。 单个样本会骗人。 4. 每一条被标记的命中都要人工读一遍。 想用程序打分可以,但模板回声和被引用的反例会 伪装成命中 ;只看自动计数会同时高估失败和成功。 5. 方差本身就是一个指标。 指导真正生效时,多次重复会收敛到同一种形状。5 次重复出现 5 种不同解读,说明这个措辞 没有约束力 —— 先收紧形式,别急着加字。 微型测试验证的是 措辞 ;对纪律执行类技能,它 不能替代 压力场景。 测试方法论: 参见 @testing skills with subagents.md 了解完整的测试方法: 如何编写压力场景 压力类型(时间、沉没成本、权威、疲惫) 系统地堵住漏洞 元测试技巧 反模式 叙事式示例 "在 2025 10 03 的会话中,我们发现空的 projectDir 导致了……" 为什么不好: 太具体,不可复用 多语言稀释 example js.js、example py.py、example go.go 为什么不好: 质量平庸,维护负担重 流程图中的代码 为什么不好: 无法复制粘贴,难以阅读 通用标签 helper1、helper2、step3、pattern4 为什么不好: 标签应有语义意义 停下:进入下一个技能之前 编写任何技能后,你必须停下来完成部署流程。 不要: 批量创建多个技能而不逐个测试 在当前技能验证前就进入下一个 因为"批量处理更高效"就跳过测试 下面的部署清单对每个技能都是强制性的。 部署未测试的技能 = 部署未测试的代码。这是对质量标准的违反。 技能创建清单(TDD 适配版) 重要:使用 TodoWrite 为下面的每个清单项创建待办。 红色阶段 编写失败的测试: [ ] 创建压力场景(纪律类技能需 3 个以上组合压力) [ ] 在没有技能的情况下运行场景 逐字记录基线行为 [ ] 识别合理化借口中的模式 绿色阶段 编写最小技能: [ ] 名称只使用字母、数字、连字符(无括号/特殊字符) [ ] YAML frontmatter 包含必需的 name 和 description 字段(最多 1024 字符;参见 [spec](https://agentskills.io/specification)) [ ] 描述以"Use when..."开头并包含具体的触发条件/症状 [ ] 描述用第三人称 [ ] 全文包含搜索关键词(错误、症状、工具) [ ] 带有核心原则的清晰概述 [ ] 解决红色阶段识别出的具体基线失败 [ ] 代码内联或链接到独立文件 [ ] 一个优秀的示例(非多语言) [ ] 用技能运行场景 验证智能体现在遵守 重构阶段 堵住漏洞: [ ] 从测试中识别新的合理化借口 [ ] 添加明确的反驳(纪律类技能) [ ] 从所有测试迭代中构建合理化借口表 [ ] 创建红线列表 [ ] 重新测试直到无懈可击 质量检查: [ ] 仅在决策不明显时使用小流程图 [ ] 快速参考表 [ ] 常见错误章节 [ ] 无叙事性故事 [ ] 支持文件仅用于工具或大量参考 部署: [ ] 将技能提交到 git 并推送到你的 fork(如果已配置) [ ] 考虑通过 PR 贡献回去(如果具有广泛用途) 发现工作流 未来的 Claude 如何找到你的技能: 1. 遇到问题 ("测试不稳定") 3. 找到技能 (描述匹配) 4. 浏览概述 (这相关吗?) 5. 阅读模式 (快速参考表) 6. 加载示例 (仅在实现时) 为此流程优化 把可搜索的术语放在前面和各处。