分析 Trail of Bits 测试手册(appsec.guide)并生成安全测试工具与技术的 Claude Code 技能的元技能。在需要基于手册内容创建新技能时使用。
测试手册技能生成器
从 Trail of Bits 测试手册生成并维护 Claude Code 技能。
何时使用
在以下情况下调用此技能:
- 从手册内容创建新的安全测试技能
- 用户提到“测试手册”、“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 |
技能候选信号
| 信号 | 指示 |
|---|---|
包含 bookCollapseSection: true 的 _index.md |
主要工具/主题 |
| 编号文件(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(模糊测试器)→ skills/libfuzzer/SKILL.md
├─ 代理 2:aflpp(模糊测试器)→ skills/aflpp/SKILL.md
├─ 代理 3:semgrep(工具)→ skills/semgrep/SKILL.md
├─ 代理 4:harness-writing(技术)→ skills/harness-writing/SKILL.md
└─ 代理 5:wycheproof(领域)→ 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 短代码转换规则
- 行数分割规则
- 错误处理指南
- 输出报告格式
收集结果
第一遍后:汇总输出报告,验证所有技能已生成。
第二遍后:运行验证器检查交叉引用。
处理代理失败
如果代理失败或产生无效输出:
| 失败类型 | 检测 | 恢复操作 |
|---|---|---|
| 代理崩溃 | 无输出报告 | 使用相同输入重新运行单个代理 |
| 验证失败 | 输出报告显示错误 | 检查差距/警告,手动修补或重新运行 |
| 错误技能类型 | 内容与模板不匹配 | 使用修正后的 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/) | 从测试手册生成技能的元技能 | 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. 自我改进
每次生成运行后,反思哪些方面可以改进未来的运行。
记录改进点:
- 模板(缺失部分、更好的结构)
- 发现逻辑(遗漏模式、误报)
- 内容提取(未处理的短代码、格式问题)
更新过程:
- 记录生成过程中遇到的问题
- 识别导致问题的模式
- 更新相关文件:
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)
- 获取视频 URL(YouTube、Vimeo - 仅标题)
- 直接包含手册图片
- 跳过验证步骤
- 每个 SKILL.md 超过 500 行
首次使用: 从 discovery.md 开始,了解手册分析过程。
模板参考: 参见 templates/ 目录获取技能类型模板。
验证: 参见 testing.md 了解质量保证方法论。






