Tokenlab Openai Compatible Migration
将 OpenAI 兼容应用迁移至 TokenLab,保持请求语义并支持模型实时发现。
基于TDD理念的技能编写与验证方法,确保文档可复用且有效。
openclaw skills install @freshman94/write-skills-demo命令、参数、文件名以原文为准
写作技能 = 将测试驱动开发(TDD)应用于流程文档的实践。
**个人技能存放在特定代理的目录中(Claude Code 为 ~/.claude/skills,Codex 为 ~/.codex/skills)**
你编写测试用例(带子代理的压力场景),观察其失败(基线行为),撰写技能文档(即技能本身),再观察测试通过(代理遵从规则),最后重构(修补漏洞)。
核心原则: 如果你没有在未提供技能的情况下观察到代理的失败,你就无法确定该技能是否真正教会了正确的内容。
必要背景知识: 在使用本技能前,你必须理解 superpowers:test-driven-development。该技能定义了基本的 RED-GREEN-REFACTOR 循环。本技能将 TDD 方法适配至文档编写。
官方指南: 关于 Anthropic 官方技能创作最佳实践,请参阅 anthropic-best-practices.md。本文档提供了补充性的模式与指导,与本技能聚焦 TDD 的方法相辅相成。
技能 是经过验证的技术、模式或工具的参考指南。技能帮助未来的 Claude 实例找到并应用有效的解决方案。
技能是: 可复用的方法、模式、工具、参考手册
技能不是: 关于你一次性解决问题的叙述性记录
| TDD 概念 | 技能创建 |
|---|---|
| 测试用例 | 带有子代理的压力场景 |
| 生产代码 | 技能文档(SKILL.md) |
| 测试失败(RED) | 无技能时代理违反规则(基线行为) |
| 测试通过(GREEN) | 有技能存在时代理遵守规则 |
| 重构 | 在保持合规的前提下修补漏洞 |
| 先写测试 | 在编写技能前运行基线场景 |
| 观察其失败 | 记录代理使用的具体理由 |
| 最小化代码 | 编写仅针对这些违规行为的技能 |
| 观察其通过 | 验证代理现在已遵从规则 |
| 重构循环 | 发现新理由 → 补漏 → 重新验证 |
整个技能创建过程遵循 RED-GREEN-REFACTOR 原则。
应创建的情况:
不应创建的情况:
具体的可操作方法,包含明确步骤(如条件等待、根因追踪)
思考问题的方式(如标志展平、测试不变量)
API 文档、语法指南、工具说明(如办公文档)
skills/
skill-name/
SKILL.md # 主要参考文档(必需)
supporting-file.* # 仅在需要时添加扁平命名空间 —— 所有技能位于同一可搜索命名空间中
分离文件的情况:
保持内联的内容:
前置元数据(YAML):
name 和 descriptionname:仅使用字母、数字和连字符(禁止括号、特殊字符)description:第三人称描述,仅说明使用时机(不描述功能)- 以 "Use when..." 开头,聚焦触发条件
- 包含具体症状、情境与上下文
- 绝对不要总结技能的流程或工作流(详见 CSO 章节原因)
- 若可能,控制在 500 字符以内
---
name: Skill-Name-With-Hyphens
description: Use when [具体触发条件与症状]
---
# 技能名称
## 概述
这是什么?用 1-2 句话概括核心原则。
## 何时使用
[若决策不明确,可附简短流程图]
- 列出症状与使用场景
- 不应使用的情况
## 核心模式(适用于技术/模式类)
前后代码对比示例
## 快速参考
表格或列表形式,便于快速扫描常见操作
## 实现方式
简单模式使用内联代码
复杂参考或可复用工具请链接至文件
## 常见错误
哪些情况容易出错 + 解决方案
## 实际影响(可选)
具体成果案例对发现至关重要: 未来的 Claude 需要能够“找到”你的技能
目的: Claude 会根据描述决定在当前任务中加载哪些技能。确保它能回答:“我现在应该读这个技能吗?”
格式: 以 "Use when..." 开头,聚焦触发条件
关键点:描述 = 何时使用,而非技能做了什么
描述应仅描述触发条件。不要在描述中总结技能的工作流程或执行步骤。
为何重要: 测试表明,当描述中总结了技能流程时,Claude 可能直接按照描述执行,而跳过阅读完整技能内容。例如,一个描述为“任务间进行代码审查”的技能,导致 Claude 只执行一次审查;而实际上技能中的流程图明确要求两次审查(规范符合性检查 + 代码质量检查)。
当描述改为“Use when executing implementation plans with independent tasks”(仅说明触发条件,不提流程),Claude 正确读取了流程图,并执行了双阶段审查。
陷阱: 描述中包含流程总结会诱导 Claude 走捷径。技能正文变成被忽略的文档。
# ❌ 错误:总结工作流程 - Claude 可能遵循此描述而非阅读技能本身
description: 用于执行实施计划时 - 每个任务分配子代理,并在任务间进行代码审查
# ❌ 错误:包含过多流程细节
description: 用于 TDD 场景 - 先写测试,观察其失败,再编写最小化代码,最后重构
# ✅ 正确:仅描述触发条件,不包含工作流程
description: 在当前会话中执行独立任务的实施计划时使用
# ✅ 正确:仅描述触发条件
description: 在编写实现代码前,用于实现任何功能或修复缺陷时内容要求:
# ❌ 错误:过于抽象模糊,未说明何时使用
description: 用于异步测试
# ❌ 错误:使用第一人称
description: 我可以在异步测试出现不稳定时提供帮助
# ❌ 错误:提及技术但技能并非专门针对该技术
description: 当测试使用 setTimeout/sleep 且结果不稳定时使用
# ✅ 正确:以“使用当”开头,描述问题,不包含流程
description: 当测试存在竞态条件、时间依赖性,或通过/失败结果不一致时使用
# ✅ 正确:技术专属性技能,触发条件明确
description: 使用 React Router 并处理认证重定向时使用使用 Claude 可能搜索的关键词:
使用主动语态,动词开头:
creating-skills 而非 skill-creationcondition-based-waiting 而非 async-test-helpers问题: getting-started 和高频调用的技能会加载到每一次对话中。每个 token 都至关重要。
目标字数:
getting-started 流程:每项 <150 字优化技巧:
将细节移至工具帮助文档:
# ❌ 错误:在 SKILL.md 中罗列所有参数
search-conversations 支持 --text、--both、--after DATE、--before DATE、--limit N
# ✅ 正确:引用 --help
search-conversations 支持多种模式和过滤器。运行 --help 查看详细信息。使用交叉引用:
# ❌ 错误:重复工作流程说明
搜索时,使用模板分派子代理...
[重复 20 行指令]
# ✅ 正确:引用其他技能
始终使用子代理(节省 50-100 倍上下文)。必需:使用 [other-skill-name] 完成流程。压缩示例:
# ❌ 错误:冗长示例(42 字)
你的合作伙伴:“我们之前如何处理 React Router 的认证错误?”
你:我将搜索过往对话中关于 React Router 认证模式的内容。
[分派子代理,查询: "React Router authentication error handling 401"]
# ✅ 正确:极简示例(20 字)
合作伙伴:“如何处理 React Router 的认证错误?”
你:正在搜索...
[分派子代理 → 综合]消除冗余:
验证方法:
wc -w skills/path/SKILL.md
# getting-started 流程:目标 <150 字
# 其他高频加载技能:目标 <200 字总和按行动或核心洞察命名:
condition-based-waiting > async-test-helpersusing-skills 而非 skill-usageflatten-with-flags > data-structure-refactoringroot-cause-tracing > debugging-techniques动名词形式(-ing)适用于流程类技能:
creating-skills、testing-skills、debugging-with-logs在撰写引用其他技能的文档时:
仅使用技能名称,并添加明确的强制标记:
**REQUIRED SUB-SKILL:** Use superpowers:test-driven-development**REQUIRED BACKGROUND:** You MUST understand superpowers:systematic-debuggingSee skills/testing/test-driven-development(未明确是否必须)@skills/testing/test-driven-development/SKILL.md(强制加载,消耗上下文)为何不使用 @ 链接: @ 语法会立即强制加载文件,提前消耗超过 20 万上下文,而你可能尚未需要。
digraph when_flowchart {
"Need to show information?" [shape=diamond];
"Decision where I might go wrong?" [shape=diamond];
"Use markdown" [shape=box];
"Small inline flowchart" [shape=box];
"Need to show information?" -> "Decision where I might go wrong?" [label="yes"];
"Decision where I might go wrong?" -> "Small inline flowchart" [label="yes"];
"Decision where I might go wrong?" -> "Use markdown" [label="no"];
}仅在以下情况使用流程图:
绝不用于:
参考 @graphviz-conventions.dot 获取 Graphviz 风格规范。
为人类伙伴可视化: 使用本目录中的 render-graphs.js 渲染技能的流程图为 SVG:
./render-graphs.js ../some-skill # 每个图表单独渲染
./render-graphs.js ../some-skill --combine # 所有图表合并为一个 SVG一个优秀的示例胜过多个平庸的示例
选择最相关的语言:
优秀示例应具备:
不要这样做:
你擅长迁移——一个出色的示例就足够了。
defense-in-depth/
SKILL.md # 所有内容内联适用场景:所有内容可容纳在文档中,无需大量外部引用
condition-based-waiting/
SKILL.md # 概述 + 模式说明
example.ts # 可直接调整使用的实用代码适用场景:工具为可复用代码,而不仅是叙述性内容
pptx/
SKILL.md # 概述 + 工作流程
pptxgenjs.md # 600 行 API 参考文档
ooxml.md # 500 行 XML 结构说明
scripts/ # 可执行工具适用场景:参考资料过于庞大,无法内联呈现
没有失败测试的技能,就不算技能此规则适用于新技能创建以及对已有技能的修改。
先写技能再写测试?删除它。从头开始。
修改技能却不写测试?同样违反规则。
无一例外:
必要背景: superpowers:test-driven-development 技能详细解释了为何如此重要。文档编写同样遵循相同原则。
不同类型的技能需要不同的测试策略:
示例: TDD、验证先行、设计优先于编码
测试方式:
成功标准: 代理在最大压力下仍能遵守规则
示例: 基于条件等待、根因追踪、防御性编程
测试方式:
成功标准: 代理能在新场景中成功应用该技术
示例: 降低复杂度、信息隐藏等概念
测试方式:
成功标准: 代理能准确判断何时/如何应用该模式
示例: API 文档、命令行参考、库使用指南
测试方式:
成功标准: 代理能准确检索并正确应用参考信息
| 说辞 | 现实 |
|---|---|
| “这个技能显然很清晰” | 对你清晰 ≠ 对其他代理也清晰。必须测试。 |
| “这只是个参考” | 参考也可能存在遗漏或表述不清。需测试检索能力。 |
| “测试是过度设计” | 未经测试的技能必然存在问题。15 分钟测试可节省数小时调试时间。 |
| “等出问题再测试” | 问题出现 = 代理无法使用该技能。应在部署前测试。 |
| “测试太繁琐” | 测试比生产环境调试差劲的技能要轻松得多。 |
| “我很有信心它是好的” | 过度自信必然导致问题。无论如何都要测试。 |
| “学术评审就够了” | 阅读 ≠ 使用。必须测试实际应用。 |
| “没时间测试” | 部署未经测试的技能,后期修复耗时更长。 |
所有这些都意味着:部署前必须测试。无一例外。
强制规范类技能(如 TDD)必须能抵御合理化行为。代理在压力下会主动寻找漏洞。
心理学提示: 理解说服技巧的原理,有助于系统性地应用它们。详见 persuasion-principles.md(Cialdini, 2021;Meincke 等, 2025),涵盖权威、承诺、稀缺、社会认同和团结等原则。
不要只陈述规则,而要禁止具体变通方式:
<坏>
写代码前写测试?删除它。</坏>
<好>
写代码前写测试?删除它。从头开始。
**无一例外:**
- 不得保留为“参考”
- 不得在写测试时“临时调整”
- 不得查看
- 删除即彻底删除</好>
早期引入基础原则:
**违背规则字面,即是违背规则精神。**这能直接切断“我是在遵循精神”的各类借口。
在基线测试中记录代理提出的各种借口。每一条说辞都应列入表格:
| 说辞 | 现实 |
|------|------|
| “太简单不用测” | 简单代码也会出错。测试只需 30 秒。 |
| “我稍后再测” | 测试通过不能证明任何事。 |
| “事后测试能达到同样目标” | 事后测试 = “这是做什么的?” 事前测试 = “它应该做什么?” |让代理能快速自查是否陷入合理化思维:
以上所有情况都意味着:删除代码,从 TDD 开始重新构建。
在 description 中添加:即将违反规则时的征兆:
description: 在实现任何功能或修复 bug 之前使用,写实现代码前遵循 TDD 循环:
使用子代理在没有该技能的情况下运行压力场景。记录其确切行为:
这就是“观察测试失败”——你必须先看到代理在无技能情况下自然的表现,才能编写技能。
编写仅针对上述具体理由的技能。不要为假设性场景添加额外内容。
在有技能的情况下重复运行相同场景。代理应能合规。
如果代理发现了新的合理化理由?添加明确的反制措施。反复测试直至无懈可击。
测试方法论: 参见 @testing-skills-with-subagents.md 获取完整的测试方法:
“在会话 2025-10-03 中,我们发现空 projectDir 导致……”
为何不好: 过于具体,无法复用
example-js.js, example-py.py, example-go.go
为何不好: 质量平庸,维护负担重
step1 [label="import fs"];
step2 [label="read file"];为何不好: 无法复制粘贴,难以阅读
helper1, helper2, step3, pattern4
为何不好: 标签应具有语义意义
在编写任意技能后,必须立即停止,并完成部署流程。
禁止:
以下部署清单对每个技能都是强制性的。
未经过测试的技能 = 未经测试的代码。这违反了质量标准。
重要:请使用 TodoWrite 为以下每一项检查条目创建待办事项。
未来 Claude 如何找到你的技能:
优化此流程——尽早且频繁地放置可搜索术语。
创建技能 = 对流程文档执行 TDD。
同样的铁律:没有失败测试,就不写技能。
同样的循环:红色(基线)→ 绿色(编写技能)→ 重构(堵漏洞)。
同样的收益:更高质量、更少意外、坚不可摧的结果。
如果你对代码遵循 TDD,那么对技能也应如此。这只是将同一套纪律应用于文档而已。
已收录 1 个 Skill