writing-skills
寫作技巧
概述
**寫作技巧是將測試驅動開發應用於流程文件。 **
個人技能位於特定於代理商的目錄中(~/.claude/skills對於克勞德·代碼,~/.agents/skills/用於食品法典)
您編寫測試案例(子代理程式的壓力場景),觀察它們失敗(基線行為),編寫技能(文件),觀察測試通過(代理遵守),然後重構(關閉漏洞)。
核心原則: 如果你沒有看到代理在沒有技能的情況下失敗,你就不知道該技能是否教導了正確的東西。
所需背景: 在使用此技能之前,您必須瞭解超能力:測試驅動開發。該技能定義了基本的紅-綠-重構循環。該技能使 TDD 適應文檔。
官方指導: Anthropic 的官方技能創作最佳實踐,請參閱anthropic-best-practices.md。本文檔提供了額外的模式和指南,以補充該技能中以 TDD 為中心的方法。
什麼是技能?
技能是經過驗證的技術、模式或工具的參考指南。技能幫助未來的克勞德實例找到並應用有效的方法。
技能是: 可重複使用的技術、模式、工具、參考指南
技能不是: 關於您如何解決一次問題的敘述
TDD 技能映射
| TDD 概念 | 技能創造 |
|---|---|
| 測試用例 | 帶有子代理的壓力場景 |
| 生產代碼 | 技能文檔(SKILL.md) |
| 測試失敗(紅色) | 代理在沒有技能的情況下違反規則(基線) |
| 測試通過(綠色) | 代理人遵守現有技能 |
| 重構 | 堵住漏洞,同時保持合規性 |
| 先寫測試 | 在編寫技能之前運行基線場景 |
| 看著它失敗 | 記錄代理人所使用的準確合理化 |
| 最少程式碼 | 編寫解決這些特定違規行為的技能 |
| 看著它過去 | 驗證代理現在是否符合要求 |
| 重構週期 | 尋找新的合理化→阻塞→重新驗證 |
整個技能創建過程遵循紅-綠-重構。
何時創建技能
創建時間:
- 技術對你來說並不直觀明顯
- 您可以在項目中再次引用它
- 模式適用範圍廣泛(不特定於項目)
- 其他人會受益
不要為以下目的創建:
- 免洗解決方案
- 其他地方有詳細記錄的標準實踐
- 項目特定約定(放入CLAUDE.md)
- 機械約束(如果可以透過正規表示式/驗證強制執行,則將其自動化 - 保存判斷呼叫的文件)
技能類型
科技
具體方法和步驟(基於條件的等待、根本原因追蹤)
圖案
思考問題的方式(帶有標誌的扁平化、測試不變量)
參考
API文檔、語法指南、工具文檔(office文檔)
目錄結構
skills/
skill-name/
SKILL.md # Main reference (required)
supporting-file.* # Only if needed
扁平命名空間 - 所有技能都集中在一個可搜尋命名空間中
單獨的文件:
- 大量參考(100 多行)- API 文檔,全面的語法
- 可重複使用工具 - 腳本、實用程式、模板
保持內聯:
- 原理和概念
- 程式碼模式(< 50 行)
- 其他一切
SKILL.md結構
前端問題 (YAML):
- 僅支援兩個欄位:
name和description - 總共最多 1024 個字符
name:僅使用字母、數字和連字符(無括號、特殊字符)description:第三人稱,僅描述何時使用(而不是它的作用)- 從「Use when...」開始,專注於觸發條件
- 包括具體症狀、情況和背景
- 永遠不要總結技能的流程或工作流程(請參閱 CSO 部分以瞭解原因)
- 盡可能保持在 500 個字元以內
---
name: Skill-Name-With-Hyphens
description: Use when [specific triggering conditions and symptoms]
---
# Skill Name
## Overview
What is this? Core principle in 1-2 sentences.
## When to Use
[Small inline flowchart IF decision non-obvious]
Bullet list with SYMPTOMS and use cases
When NOT to use
## Core Pattern (for techniques/patterns)
Before/after code comparison
## Quick Reference
Table or bullets for scanning common operations
## Implementation
Inline code for simple patterns
Link to file for heavy reference or reusable tools
## Common Mistakes
What goes wrong + fixes
## Real-World Impact (optional)
Concrete results
克勞德搜尋優化 (CSO)
**發現的關鍵:**未來的克勞德需要找到你的技能
1.豐富的描述字段
目的: 克勞德閱讀描述來決定為給定任務加載哪些技能。讓它回答:“我現在應該讀這個技能嗎?”
格式: 以“Use when...”開頭,重點關注觸發條件
關鍵:描述=何時使用,而不是技能的作用
描述應僅描述觸發條件。不要在描述中總結技能的流程或工作流程。
為什麼這很重要: 測試顯示,當描述總結了技能的工作流程時,克勞德可能會遵循描述而不是閱讀完整的技能內容。儘管該技能的流程圖清楚地顯示了兩次審查(規範合規性然後是代碼質量),但“任務之間的代碼審查”的描述導致克勞德進行了一次審查。
當描述改為“在執行具有獨立任務的實施計劃時使用”(沒有工作流程摘要)時,克勞德正確地閱讀了流程圖並遵循了兩階段審核流程。
陷阱: 總結工作流程的描述創建了克勞德將採取的捷徑。技能主體變成了克勞德跳過的文檔。
# ❌ BAD: Summarizes workflow - Claude may follow this instead of reading skill
description: Use when executing plans - dispatches subagent per task with code review between tasks
# ❌ BAD: Too much process detail
description: Use for TDD - write test first, watch it fail, write minimal code, refactor
# ✅ GOOD: Just triggering conditions, no workflow summary
description: Use when executing implementation plans with independent tasks in the current session
# ✅ GOOD: Triggering conditions only
description: Use when implementing any feature or bugfix, before writing implementation code
內容:
- 使用顯示該技能適用的具體觸發因素、症狀和情況
- 描述問題(競爭條件、不一致的行為)而不是特定於語言的症狀(setTimeout、睡眠)
- 保持觸發器與技術無關,除非技能本身是特定於技術的
- 如果技能是特定於技術的,請在觸發器中明確說明
- 以第三人稱書寫(注入系統提示符)
- 永遠不要總結技能的流程或工作流程
# ❌ BAD: Too abstract, vague, doesn't include when to use
description: For async testing
# ❌ BAD: First person
description: I can help you with async tests when they're flaky
# ❌ BAD: Mentions technology but skill isn't specific to it
description: Use when tests use setTimeout/sleep and are flaky
# ✅ GOOD: Starts with "Use when", describes problem, no workflow
description: Use when tests have race conditions, timing dependencies, or pass/fail inconsistently
# ✅ GOOD: Technology-specific skill with explicit trigger
description: Use when using React Router and handling authentication redirects
2. 關鍵詞覆蓋率
使用克勞德會搜尋的字詞:
- 錯誤消息:“掛鉤超時”、“ENOTEMPTY”、“競爭條件”
- 症狀:“片狀”、“懸掛”、“殭屍”、“污染”
- 同義詞:“超時/掛起/凍結”、“清理/拆卸/afterEach”
- 工具:實際指令、函式庫名稱、檔案類型
3. 描述性命名
使用主動語態,動詞在前:
- ✅
creating-skills不是skill-creation - ✅
condition-based-waiting不是async-test-helpers
4. 代幣效率(關鍵)
**問題:**每次對話中都會包含入門和經常引用的技能。每個令牌都很重要。
目標字數:
- 入門工作流程:每個 <150 字
- 常用技能:總字數<200
- 其他技能:<500字(仍要簡潔)
技術:
將詳細信息移至工具幫助:
# ❌ BAD: Document all flags in SKILL.md
search-conversations supports --text, --both, --after DATE, --before DATE, --limit N
# ✅ GOOD: Reference --help
search-conversations supports multiple modes and filters. Run --help for details.
使用交叉引用:
# ❌ BAD: Repeat workflow details
When searching, dispatch subagent with template...
[20 lines of repeated instructions]
# ✅ GOOD: Reference other skill
Always use subagents (50-100x context savings). REQUIRED: Use [other-skill-name] for workflow.
壓縮範例:
# ❌ BAD: Verbose example (42 words)
your human partner: "How did we handle authentication errors in React Router before?"
You: I'll search past conversations for React Router authentication patterns.
[Dispatch subagent with search query: "React Router authentication error handling 401"]
# ✅ GOOD: Minimal example (20 words)
Partner: "How did we handle auth errors in React Router?"
You: Searching...
[Dispatch subagent → synthesis]
消除冗餘:
- 不要重複交叉引用技能中的內容
- 不要解釋從命令中顯而易見的內容
- 請勿包含同一模式的多個範例
確認:
wc -w skills/path/SKILL.md
# getting-started workflows: aim for <150 each
# Other frequently-loaded: aim for <200 total
根據您所做的事情或核心見解來命名:
- ✅
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- 活躍,描述您正在採取的行動
4. 交叉參考其他技能
在撰寫引用其他技能的文件時:
僅使用技能名稱,並帶有明確的要求標記:
- ✅ 好:
**REQUIRED SUB-SKILL:** Use superpowers:test-driven-development - ✅ 好:
**REQUIRED BACKGROUND:** You MUST understand superpowers:systematic-debugging - ❌ 壞:
See skills/testing/test-driven-development(不清楚是否需要) - ❌ 壞:
@skills/testing/test-driven-development/SKILL.md(力負荷,燒傷情況)
為什麼沒有@連結:@語法立即強制加載文件,在需要它們之前消耗 200k+ 上下文。
流程圖使用
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"];
}
流程圖僅用於:
- 不明顯的決策點
- 您可能會過早停止的處理循環
- 「何時使用 A 與 B」決策
切勿將流程圖用於:
- 參考資料 → 表格、列表
- 程式碼範例 → Markdown 區塊
- 線性指令 → 編號列表
- 無語義的標籤(step1、helper2)
有關 graphviz 樣式規則,請參閱@graphviz-conventions.dot。
為您的人類伴侶視覺化: 使用render-graphs.js在此目錄中將技能流程圖渲染為 SVG:
./render-graphs.js ../some-skill # Each diagram separately
./render-graphs.js ../some-skill --combine # All diagrams in one SVG
程式碼範例
一個優秀的例子勝過許多平庸的例子
選擇最相關的語言:
- 測試技術 → TypeScript/JavaScript
- 系統調試 → Shell/Python
- 數據處理 → Python
好例子:
- 完整且可運行
- 評論很好,解釋了為什麼
- 來自真實場景
- 清晰顯示圖案
- 準備好適應(不是通用模板)
不:
- 以 5 種以上語言實施
- 創建填空模板
- 編寫人為的例子
你很擅長移植——一個很好的例子就夠了。
文件組織
自成一體的技能
defense-in-depth/
SKILL.md # Everything inline
時間:所有內容都合適,不需要大量參考
使用可重複使用工具的技能
condition-based-waiting/
SKILL.md # Overview + patterns
example.ts # Working helpers to adapt
何時:工具是可重用的代碼,而不僅僅是敘述性的
具有大量參考的技能
pptx/
SKILL.md # Overview + workflows
pptxgenjs.md # 600 lines API reference
ooxml.md # 500 lines XML structure
scripts/ # Executable tools
何時:參考資料對內聯來說太大
鐵律(與 TDD 相同)
NO SKILL WITHOUT A FAILING TEST FIRST
這適用於新技能和對現有技能的編輯。
在測試之前先寫技能?刪除它。重新開始。 不測試就編輯技能?同樣違規。
沒有例外:
- 不適合“簡單添加”
- 不是為了“只是添加一個部分”
- 不適用於“文件更新”
- 不要將未經測試的更改保留為“參考”
- 運行測試時不要“適應”
- 刪除就是刪除
所需背景: 超級能力:測試驅動開發技能解釋了為什麼這很重要。同樣的原則也適用於文檔。
測試所有技能類型
不同的技能類型需要不同的測試方法:
紀律執行技能(規則/要求)
示例: TDD、完成前驗證、編碼前設計
測試用:
- 學術問題:他們理解規則嗎?
- 壓力場景:他們在壓力下服從嗎?
- 多重壓力疊加:時間+沉沒成本+疲憊
- 識別合理化並添加顯式計數器
成功標準: 特工在最大壓力下遵循規則
技術技能(操作指南)
範例: 基於條件的等待、根本原因追蹤、防禦性編程
測試用:
- 應用場景:他們能正確應用該技術嗎?
- 變化場景:它們是否處理邊緣情況?
- 缺失信息測試:說明是否存在空白?
成功標準: 代理成功地將技術應用於新場景
模式技能(心智模型)
示例: 降低複雜性、信息隱藏概念
測試用:
- 辨識場景:他們能辨識模式何時應用嗎?
- 應用場景:他們能使用心智模型嗎?
- 反例:他們知道什麼時候不應該申請嗎?
成功標準: 代理正確識別何時/如何應用模式
參考技能(文檔/API)
範例: API 文件、命令參考、庫指南
測試用:
- 檢索場景:他們能找到正確的資訊嗎?
- 應用場景:他們能正確使用他們發現的東西嗎?
- 差距測試:是否涵蓋常見用例?
成功標準: 代理找到並正確應用參考信息
跳過測試的常見理由
| 對不起 | 現實 |
|---|---|
| 「功力明顯清晰」 | 您清楚≠其他代理人清楚。測試一下。 |
| “這只是一個參考” | 參考文獻可能有空白、不清楚的部分。測試檢索。 |
| “測試是矯枉過正” | 未經測試的技能存在問題。總是。 15 分鐘測試可節省數小時。 |
| 「我會測試是否有問題」 | 問題=特工無法使用技能。部署之前進行測試。 |
| “測試太繁瑣” | 測試比調試生產中的不良技能要簡單得多。 |
| 「我相信這很好」 | 過度自信會帶來問題。無論如何都要測試一下。 |
| “學術評審就夠了” | 閱讀≠使用。測試應用場景。 |
| “沒有時間測試” | 部署未經測試的技能會浪費更多時間來修復它。 |
**所有這些意味著:在部署之前進行測試。無一例外。 **
反對合理化的防彈技巧
執行紀律的技能(如 TDD)需要抵制合理化。代理人很聰明,在壓力下會發現漏洞。
心理學註: 瞭解說服技巧為何有效可以幫助您有系統地應用它們。有關權威、承諾、稀缺性、社會證明和統一原則的研究基金會(Cialdini,2021;Meincke et al.,2025)請參閱persuasion-principles.md。
明確堵住每一個漏洞
不要只是陳述規則 - 禁止特定的解決方法:
<壞>
Write code before test? Delete it.
</壞>
<好>
Write code before test? Delete it. Start over.
**No exceptions:**
- Don't keep it as "reference"
- Don't "adapt" it while writing tests
- Don't look at it
- Delete means delete
</好>
解決「精神與文字」的爭論
儘早添加基本原則:
**Violating the letter of the rules is violating the spirit of the rules.**
這切斷了整個階級的「我追隨精神」的合理化。
建立合理化表
從基線測試中獲取合理性(請參閱下面的測試部分)。代理人提出的每一個藉口都在表中:
| Excuse | Reality |
|--------|---------|
| "Too simple to test" | Simple code breaks. Test takes 30 seconds. |
| "I'll test after" | Tests passing immediately prove nothing. |
| "Tests after achieve same goals" | Tests-after = "what does this do?" Tests-first = "what should this do?" |
建立危險訊號列表
讓代理商在合理化時可以輕鬆自檢:
## Red Flags - STOP and Start Over
- Code before test
- "I already manually tested it"
- "Tests after achieve the same purpose"
- "It's about spirit not ritual"
- "This is different because..."
**All of these mean: Delete code. Start over with TDD.**
更新 CSO 的違規症狀
加入描述:當您即將違反規則時的症狀:
description: use when implementing any feature or bugfix, before writing implementation code
技能紅綠重構
遵循 TDD 週期:
紅色:寫入失敗測試(基線)
在沒有技能的情況下使用子代理運行壓力場景。記錄確切的行為:
- 他們做出了什麼選擇?
- 他們使用了什麼合理化理由(逐字)?
- 哪些壓力引發了違規行為?
這就是“觀察測試失敗”——在編寫技能之前,您必須瞭解代理自然會做什麼。
綠色:寫出最低限度的技能
寫出解決這些具體合理化的技巧。不要為假設案例添加額外的內容。
運用技巧運行相同的場景。代理現在應該遵守。
重構:堵住漏洞
代理找到新的合理化?添加顯式計數器。重新測試直到防彈。
測試方法: 請參閱@testing-skills-with-subagents.md以瞭解完整的測試方法:
- 如何寫壓力場景
- 壓力類型(時間、沉沒成本、權威、疲憊)
- 系統地堵塞漏洞
- 元測試技術
反模式
❌ 敘述例子
“在 2025 年 10 月 3 日會話中,我們發現空的 projectDir 導致......” 為什麼不好: 太具體,不可重用
❌ 多語淡化
example-js.js、example-py.py、example-go.go 為什麼不好: 品質平庸,維持負擔重
❌ 流程圖中的代碼
step1 [label="import fs"];
step2 [label="read file"];
為什麼不好: 無法複製貼上,難以閱讀
❌ 通用標籤
助手 1、助手 2、步驟 3、模式 4 為什麼不好: 標籤應該具有語義意義
停止:在轉向下一個技能之前
**寫完任何技能後,您必須停止並完成部署程序。 **
不要:
- 批量創建多個技能,無需測試每個技能
- 在驗證目前技能之前移至下一個技能
- 跳過測試,因為“批處理更高效”
**下面的部署清單對於每項技能都是強制性的。 **
部署未經測試的技能=部署未經測試的程式碼。這是違反品質標準的。
技能創建清單(TDD 改編)
**重要提示:使用 TodoWrite 為下面的每個清單項目建立待辦事項。 **
紅色階段 - 寫入失敗測試:
- 創建壓力場景(紀律技能的 3+ 組合壓力)
- 無需技能即可運行場景 - 逐字記錄基線行為
- 識別合理化/失敗的模式
綠色階段 - 寫出最低技能:
- 名稱僅使用字母、數字、連字符(無括號/特殊字符)
- YAML frontmatter 僅包含名稱和描述(最多 1024 個字符)
- 描述以「何時使用」開頭,並包含特定的觸發因素/症狀
- 以第三人稱書寫的描述
- 搜索關鍵詞(錯誤、症狀、工具)
- 清晰概述與核心原則
- 解決 RED 中確定的特定基線故障
- 程式碼內聯或連結到單獨的文件
- 一個很好的例子(非多語言)
- 使用技能運行場景 - 驗證代理現在是否遵守
重構階段 - 堵住漏洞:
- 從測試中找出新的合理性
- 增加明確的指示物(如果是紀律技能)
- 根據所有測試迭代構建合理化表
- 建立危險訊號列表
- 重新測試至防彈
質量檢查:
- 僅當決策不明顯時才使用小流程圖
- 快速參考表
- 常見錯誤部分
- 不講故事
- 支援文件僅供工具或大量參考
部署:
- 將技能提交至 git 並推送到您的 fork(如果已配置)
- 考慮通過公關做出貢獻(如果廣泛有用)
發現工作流程
未來的克勞德如何找到你的技能:
- 遇到問題(“測試不穩定”)
- 找到技能(描述匹配)
- 掃描概述(這相關嗎?)
- 讀取模式(快速參考表)
- 載入範例(僅在實作時)
針對此流程進行優化 - 儘早且經常放置可搜索術語。
底線
**建立技能是流程文件的 TDD。 **
同樣的鐵律:沒有經過考驗就沒有技能。 相同的循環:紅色(基線)→綠色(編寫技巧)→REFACTOR(關閉漏洞)。 相同的好處:更好的品質、更少的驚喜、萬無一失的結果。
如果您在程式碼方面遵循 TDD,那麼在技能方面也遵循 TDD。這與套用於文件的規則相同。