Meta-skill 用於分析 Trail of Bits 測試手冊 (appsec.guide) 並根據手冊內容生成 Claude Code 技能,適用於安全測試工具與技術。當需要根據手冊內容建立新技能時使用。
Testing Handbook Skill Generator
從 Trail of Bits 測試手冊生成並維護 Claude Code 技能。
使用時機
在以下情況呼叫此技能:
- 根據手冊內容建立新的安全測試技能
- 使用者提到「testing handbook」、「appsec.guide」或詢問生成技能
- 需要大量生成或重新整理技能
請勿用於:
- 一般安全測試問題(請使用已生成的技能)
- 非手冊相關的技能建立
手冊位置
此技能需要測試手冊儲存庫。完整細節請參閱 discovery.md。
快速參考: 檢查 ./testing-handbook、../testing-handbook、~/testing-handbook → 詢問使用者 → 最後手段為複製儲存庫。
儲存庫: https://github.com/trailofbits/testing-handbook
工作流程概覽
階段 0:設定 階段 1:探索
┌─────────────────┐ ┌─────────────────┐
│ 定位手冊 │ → │ 分析手冊 │
│ - 尋找或複製 │ │ - 掃描章節 │
│ - 確認路徑 │ │ - 分類類型 │
└─────────────────┘ └─────────────────┘
↓ ↓
階段 3:生成 階段 2:規劃
┌─────────────────┐ ┌─────────────────┐
│ 兩階段生成 │ ← │ 生成計畫 │
│ 第一階段:內容 │ │ - 新技能 │
│ 第二階段:交叉引用│ │ - 更新 │
│ - 寫入 gen/ │ │ - 呈現給使用者 │
└─────────────────┘ └─────────────────┘
↓
階段 4:測試 階段 5:完成
┌─────────────────┐ ┌─────────────────┐
│ 驗證技能 │ → │ 生成後處理 │
│ - 執行驗證器 │ │ - 更新 README │
│ - 測試啟用 │ │ - 更新交叉引用 │
│ - 修正問題 │ │ - 自我改進 │
└─────────────────┘ └─────────────────┘
範圍限制
僅修改以下位置:
plugins/testing-handbook-skills/skills/[skill-name]/*- 生成的技能(與 testing-handbook-generator 同層)plugins/testing-handbook-skills/skills/testing-handbook-generator/*- 自我改進- 儲存庫根目錄
README.md- 將生成的技能加入表格
絕對不要修改或分析:
- 其他外掛(
plugins/property-based-testing/、plugins/static-analysis/等) - 此外掛以外的其他技能
請勿掃描或將 testing-handbook-skills/ 以外的任何技能納入上下文。僅根據手冊內容及其引用的資源生成技能。
快速參考
章節 → 技能類型對應
| 手冊章節 | 技能類型 | 範本 |
|---|---|---|
/static-analysis/[tool]/ |
工具技能 | tool-skill.md |
/fuzzing/[lang]/[fuzzer]/ |
模糊測試技能 | fuzzer-skill.md |
/fuzzing/techniques/ |
技術技能 | technique-skill.md |
/crypto/[tool]/ |
領域技能 | domain-skill.md |
/web/[tool]/ |
工具技能 | tool-skill.md |
技能候選訊號
| 訊號 | 表示 |
|---|---|
_index.md 包含 bookCollapseSection: true |
主要工具/主題 |
| 編號檔案 (00-, 10-, 20-) | 結構化內容 |
techniques/ 子章節 |
方法論內容 |
99-resources.md 或 91-resources.md |
有外部連結 |
排除訊號
| 訊號 | 動作 |
|---|---|
frontmatter 中 draft: true |
跳過該章節 |
| 空目錄 | 跳過該章節 |
| 範本/佔位檔案 | 跳過該章節 |
僅 GUI 工具(例如 web/burp/) |
跳過該章節(Claude 無法操作 GUI 工具) |
決策樹
開始生成技能?
├─ 需要分析手冊並建立計畫?
│ └─ 閱讀:discovery.md
│ (手冊分析方法論、計畫格式)
│
├─ 要啟動技能生成代理?
│ └─ 閱讀:agent-prompt.md
│ (完整提示範本、變數參考、驗證檢查清單)
│
├─ 要生成特定技能類型?
│ └─ 閱讀對應範本:
│ ├─ 工具(Semgrep, CodeQL)→ templates/tool-skill.md
│ ├─ 模糊測試器(libFuzzer, AFL++)→ templates/fuzzer-skill.md
│ ├─ 技術(harness, coverage)→ templates/technique-skill.md
│ └─ 領域(crypto, web)→ templates/domain-skill.md
│
├─ 要驗證生成的技能?
│ └─ 執行:scripts/validate-skills.py
│ 然後閱讀:testing.md 了解啟用測試
│
├─ 生成後要完成?
│ └─ 參閱下方「生成後任務」
│ (更新主 README、更新技能交叉引用、自我改進)
│
└─ 從特定章節快速生成?
└─ 使用上方快速參考,直接套用範本
兩階段生成(階段 3)
生成採用兩階段方法來解決前向引用問題(技能引用尚未存在的其他技能)。
第一階段:內容生成(並行)
並行生成所有技能,不包含相關技能區段:
第一階段 - 並行生成 5 個技能:
├─ 代理 1:libfuzzer (fuzzer) → skills/libfuzzer/SKILL.md
├─ 代理 2:aflpp (fuzzer) → skills/aflpp/SKILL.md
├─ 代理 3:semgrep (tool) → skills/semgrep/SKILL.md
├─ 代理 4:harness-writing (technique) → skills/harness-writing/SKILL.md
└─ 代理 5:wycheproof (domain) → skills/wycheproof/SKILL.md
每個代理使用:pass=1(僅內容,相關技能留空)
第一階段代理:
- 生成除「相關技能」外的所有區段
- 留下佔位符:
## Related Skills\n\n<!-- PASS2: populate after all skills exist --> - 輸出報告包含
references: DEFERRED
第二階段:交叉引用填充(依序)
所有第一階段代理完成後,執行第二階段以填充相關技能:
第二階段 - 填充交叉引用:
├─ 從 skills/*/SKILL.md 讀取所有生成的技能名稱
├─ 對每個技能,根據以下條件決定相關技能:
│ ├─ 來自探索的 related_sections(手冊結構)
│ ├─ 技能類型關係(模糊測試器 → 技術)
│ └─ 內容中的明確提及
└─ 更新每個 SKILL.md 的相關技能區段
第二階段流程:
- 收集所有生成的技能名稱:
ls -d skills/*/SKILL.md - 對每個技能,使用探索階段的對應關係識別相關技能
- 編輯每個 SKILL.md,將佔位符替換為實際連結
- 驗證交叉引用存在(無斷鏈)
代理提示範本
請參閱 agent-prompt.md 取得完整提示範本,包含:
- 變數替換參考(包含
pass變數) - 寫入前驗證檢查清單
- Hugo shortcode 轉換規則
- 行數分割規則
- 錯誤處理指引
- 輸出報告格式
收集結果
第一階段後:彙總輸出報告,確認所有技能已生成。
第二階段後:執行驗證器檢查交叉引用。
處理代理失敗
如果代理失敗或產生無效輸出:
| 失敗類型 | 偵測方式 | 復原動作 |
|---|---|---|
| 代理當機 | 無輸出報告 | 使用相同輸入重新執行單一代理 |
| 驗證失敗 | 輸出報告顯示錯誤 | 檢查缺口/警告,手動修補或重新執行 |
| 錯誤技能類型 | 內容與範本不符 | 使用修正後的 type 參數重新執行 |
| 內容遺漏 | 輸出報告列出缺口 | 若輕微則接受,或提供額外 related_sections |
| 第二階段引用錯誤 | 驗證器顯示缺少技能 | 檢查技能是否被跳過,更新引用 |
重要: 不要因單一代理失敗而重新執行整個並行批次。應獨立修復個別失敗。
單一技能重新生成
若要重新生成單一技能而不重新執行整個批次:
# 重新生成單一技能(第一階段 - 僅內容)
"使用 testing-handbook-generator 從章節 {section_path} 重新生成 {skill-name} 技能"
# 範例:
"使用 testing-handbook-generator 從章節 fuzzing/c-cpp/10-libfuzzer 重新生成 libfuzzer 技能"
重新生成工作流程:
- 重新讀取手冊章節以取得最新內容
- 套用適當範本
- 寫入
skills/{skill-name}/SKILL.md(覆蓋現有檔案) - 僅對該技能重新執行第二階段以更新交叉引用
- 對單一技能執行驗證器:
uv run scripts/validate-skills.py --skill {skill-name}
輸出位置
生成的技能寫入:
skills/[skill-name]/SKILL.md
每個技能擁有自己的目錄,以存放可能的支援檔案(與 testing-handbook-generator 同層)。
品質檢查清單
在交付生成的技能前:
- [ ] 所有手冊章節已分析(階段 1)
- [ ] 生成前已向使用者呈現計畫(階段 2)
- [ ] 已啟動並行代理 - 每個技能一個(階段 3)
- [ ] 範本已根據技能類型正確套用
- [ ] 驗證器通過:
uv run scripts/validate-skills.py - [ ] 啟用測試已通過 - 請參閱 testing.md
- [ ] 主
README.md已更新,包含生成的技能表格 - [ ]
README.md技能交叉引用圖表已更新 - [ ] 自我改進筆記已記錄
- [ ] 已通知使用者並附上摘要
生成後任務
1. 更新主 README
生成技能後,更新儲存庫的主 README.md 以列出它們。
格式: 將生成的技能加入相同的「可用外掛」表格,直接放在 testing-handbook-skills 之後。作者欄使用純文字 testing-handbook-generator(無連結)。
範例:
| 外掛 | 描述 | 作者 |
|--------|-------------|--------|
| ... 其他外掛 ... |
| [testing-handbook-skills](plugins/testing-handbook-skills/) | 從測試手冊生成技能的 Meta-skill | Paweł Płatek |
| [libfuzzer](plugins/testing-handbook-skills/skills/libfuzzer/) | 使用 libFuzzer 進行 C/C++ 覆蓋率導向模糊測試 | testing-handbook-generator |
| [aflpp](plugins/testing-handbook-skills/skills/aflpp/) | 使用 AFL++ 進行多核心模糊測試 | testing-handbook-generator |
| [semgrep](plugins/testing-handbook-skills/skills/semgrep/) | 快速靜態分析以尋找錯誤 | testing-handbook-generator |
2. 更新技能交叉引用
生成技能後,更新 README.md 的技能交叉引用區段,使用 mermaid 圖表顯示技能關係。
流程:
- 讀取每個生成技能的
SKILL.md,擷取其## Related Skills區段 - 建立 mermaid 圖表,節點按技能類型分組(模糊測試器、技術、工具、領域)
- 根據相關技能關係加入邊線:
- 實線箭頭 (
-->) 表示主要技術依賴 - 虛線箭頭 (
-.->) 表示替代工具建議
- 實線箭頭 (
- 取代 README.md 中現有的 mermaid 程式碼區塊
邊線分類:
| 關係 | 箭頭樣式 | 範例 |
|---|---|---|
| 模糊測試器 → 技術 | --> |
libfuzzer --> harness-writing |
| 工具 → 工具(替代) | -.-> |
semgrep -.-> codeql |
| 模糊測試器 → 模糊測試器(替代) | -.-> |
libfuzzer -.-> aflpp |
| 技術 → 技術 | --> |
harness-writing --> coverage-analysis |
驗證: 更新後,執行 validate-skills.py 以確認所有引用的技能都存在。
3. 自我改進
每次生成執行後,反思哪些部分可以改善未來的執行。
記錄改進項目:
- 範本(遺漏的區段、更好的結構)
- 探索邏輯(遺漏的模式、誤報)
- 內容擷取(未處理的 shortcode、格式問題)
更新流程:
- 記錄生成過程中遇到的問題
- 識別造成問題的模式
- 更新相關檔案:
SKILL.md- 工作流程、決策樹、快速參考更新templates/*.md- 範本改進discovery.md- 偵測邏輯更新testing.md- 新的驗證檢查
- 在提交訊息中記錄改進
自我改進範例:
問題:libFuzzer 技能缺少 sanitizer 旗標表格
修正:更新 templates/fuzzer-skill.md 加入 ## Compiler Flags 區段
使用範例
完整探索與生成
使用者:「從測試手冊生成技能」
1. 定位手冊(檢查常見位置、詢問使用者或複製)
2. 閱讀 discovery.md 了解方法論
3. 掃描手冊位於 {handbook_path}/content/docs/
4. 建立候選清單並標註類型
5. 向使用者呈現計畫
6. 獲得批准後,使用適當範本生成每個技能
7. 驗證生成的技能
8. 更新主 README.md,加入生成的技能表格
9. 根據相關技能區段更新 README.md 技能交叉引用圖表
10. 自我改進:記錄任何範本/探索問題以供未來執行參考
11. 回報結果
單一章節生成
使用者:「為 libFuzzer 章節建立一個技能」
1. 讀取 /testing-handbook/content/docs/fuzzing/c-cpp/10-libfuzzer/
2. 識別類型:模糊測試技能
3. 讀取 templates/fuzzer-skill.md
4. 擷取內容,套用範本
5. 寫入 skills/libfuzzer/SKILL.md
6. 驗證並回報
提示
應該:
- 生成前務必先呈現計畫
- 根據技能類型使用適當範本
- 精確保留程式碼區塊
- 生成後務必驗證
不應該:
- 未經使用者批准就生成
- 跳過擷取非影片的外部資源(請使用 WebFetch)
- 擷取影片網址(YouTube、Vimeo - 僅標題)
- 直接包含手冊圖片
- 跳過驗證步驟
- 每個 SKILL.md 超過 500 行
首次使用: 從 discovery.md 開始,了解手冊分析流程。
範本參考: 請參閱 templates/ 目錄取得技能類型範本。
驗證: 請參閱 testing.md 了解品質保證方法。






