以 mattpocock/skills("Skills For Real Engineers")为蓝本,整理出一条从「模糊想法」到「可合并代码」的完整工作流程:每个环节做什么、用哪个技能、为什么这样设计,以及可直接落地的检查清单。附录逐一讲解全部 37 个技能。
这套技能的设计者 Matt Pocock(Total TypeScript 作者)的立场很明确:GSD、BMAD、Spec-Kit 这类"全流程框架"试图接管开发过程,代价是你失去了控制权,流程出了 bug 也难以修复。这套技能反其道而行——小、易改、可组合,每个技能只封装一件事,由你决定怎么串。它不是框架,是一套可以拆开改造的工具箱。
整套体系来自四个 AI 编码最常见的失败模式,每个失败模式对应一组"修复技能"。理解这个映射,就理解了每个环节存在的理由:
| 失败模式 | 典型症状 | 修复技能 |
|---|---|---|
| #1 智能体没做我想要的 对齐失败 |
你以为它懂了,看到产出才发现完全理解错了。"没人确切知道自己想要什么"(《程序员修炼之道》)。 | /grill-with-docs、/grill-me —— 用一轮轮追问把模糊想法逼成清晰设计 |
| #2 智能体太啰嗦 缺乏共享语言 |
智能体被扔进项目里自己猜行话,20 个词说 1 个词的事;命名不一致,代码库难导航。 | /grill-with-docs 内建的 /domain-modeling —— 维护 CONTEXT.md 词汇表 + ADR |
| #3 代码跑不起来 反馈回路缺失 |
没有反馈就没有纠偏,智能体在盲飞。"反馈速率就是你的速度上限"。 | /tdd(红-绿-重构)、/diagnosing-bugs(先造反馈回路再谈假设) |
| #4 造出一团泥球 软件熵加速 |
智能体写码太快,复杂度积累得也更快。"最好的模块是深的:简单接口后面藏大量功能"(Ousterhout)。 | /to-spec 先问模块、/codebase-design 深模块词汇、/improve-codebase-architecture 定期巡检 |
软件工程的基本功在 AI 时代不是过时了,而是更值钱了——这套技能就是把基本功压缩成可重复执行的动作。
大多数工作沿着一条主流程(idea → ship)走,三条汇入通道(on-ramp)处理特殊情况后并入主流程。底下还垫着一层"词汇层"技能,为上面所有环节提供统一的术语。
/implement 从票出发开新会话,因为票已经是自包含的;③ 巨型任务不硬拆——雾还没散时先做决策(wayfinder),而不是假装能写规格。
.scratch/ / 其他);② 分诊标签是否沿用默认五态(needs-triage / needs-info / ready-for-agent / ready-for-human / wontfix);③ 领域文档布局(默认单上下文:根目录一个 CONTEXT.md + docs/adr/)。结果写入 docs/agents/*.md,并在 AGENTS.md / CLAUDE.md 里加一个 ## Agent skills 块。.scratch/<feature>/issues/ 下,一票一文件。团队项目 → GitHub Issues + 原生 blocking 关系。这是整套体系里最受欢迎、也最该每次都用的环节。你想做一件事,先别让智能体动手——让它来拷问你。
/domain-modeling:当场把敲定的术语写进 CONTEXT.md,把"难以逆转 + 没有上下文会让人费解 + 真实权衡的结果"三条全满足的决策记成 ADR。副产品是项目的共享语言——README 里的例子:以前说"课程章节里的课被'实化'(在文件系统里拿到位置)时出问题",有了词汇表之后一句"materialization cascade 出问题"就够了。省 token、命名一致、代码库更好导航。/handoff 双向桥接:handoff 出去 → 开新会话做原型 → handoff 回来带着结论 → 回到原想法线程继续拷问。原型本身不进主干:验证出的决策折进真实代码,原型提交到一个 prototype/<name> 分支留作"一手证据",在实现票上留个指针。ready-for-agent 标签(无需再分诊)。规格模板六段:问题陈述(用户视角)→ 解决方案(用户视角)→ 超长的用户故事编号清单 → 实现决策 → 测试决策 → 范围外。/tdd 会拒绝在任何未确认接缝上写测试。ready-for-agent。/implement 会话结束后 /clear,从下一张票冷启动。/tdd;定期跑类型检查、定期跑单个测试文件、最后跑一次全量测试;完成后跑 /code-review,然后提交到当前分支。expect(add(a,b)).toBe(a+b) 这种按实现复算期望值的测试永不可能失败)、水平切片(一次写完所有测试再写实现——验证的是想象中的行为)。
CONTEXT.md,让测试命名和接口词汇与项目领域语言对齐;尊重所触区域的 ADR。git diff <固定点>...HEAD 做双轴评审:Standards 轴——代码是否符合仓库书面编码规范 + 一组固定的 Fowler 代码坏味道基线(Mysterious Name、Duplicated Code、Feature Envy、Primitive Obsession、Shotgun Surgery 等 12 条,每条都是"是什么→怎么改"的判断题而非硬违规,仓库规范永远覆盖基线);Spec 轴——代码是否忠实实现了来源规格:缺了什么、多了什么(scope creep)、看似实现了但实现得不对。needs-triage → needs-info / ready-for-agent / ready-for-human / wontfix。流程:收集上下文 → 给出分类/状态建议及理由 → 验证声称(bug 按报告者步骤复现;PR 检出跑测试)→ 需要时拷问补全 → 应用结果。ready-for-agent 的票附上 agent brief(面向智能体的任务简报)。.out-of-scope/ 拒绝知识库——被拒的增强请求记档,防止同一个请求下个月再来一遍;② 所有 AI 产的 issue 评论强制带免责声明。注意:/to-tickets 产出的票天生 agent-ready,不要再分诊。[DEBUG-xxxx] 前缀方便最后一把清理;性能问题先测基线再二分)→ ⑤ 修复 + 回归测试(回归测试写在使用"真实 bug 模式"的正确接缝上;找不到正确接缝本身就是发现——说明架构拦不住这类 bug,转交架构巡检)→ ⑥ 清理(原始 repro 不再红、插桩全删、把最终成立的假设写进 commit)。wayfinder:map 标签的 issue(索引而非存储,决策细节只活在票里);票是它的子 issue,用追踪器原生 blocking 关系。开工前先认领(assign 自己)防多会话撞车;一次会话只解决一张票(research 票除外)。地图收口后移交而不建造:合并回主流程的 /to-spec,把散落的决策收敛成可建造的规格——直接从地图冲进 implement 会丢掉关联细节。domain-modeling 管领域语言:用词和词汇表冲突当场指出("你的词汇表把'取消'定义为 X,你现在说的像 Y,到底是哪个?");模糊词给出精确的规范术语;用具体场景压力测试概念边界;用户陈述与代码矛盾时摆到桌面上;术语敲定当场写入 CONTEXT.md(纯词汇表,禁止当规格或便签用)。ADR 三条件才立:难以逆转 + 脱离上下文会费解 + 真实权衡的结果。
codebase-design 管架构词汇:module / interface / depth / seam / adapter / leverage / locality 七个术语严格统一(禁用 component、service、API、boundary 这些漂移词)。核心原则:深度是接口的属性而非实现的属性;删除测试;接口即测试面;一个 adapter 是假想接缝,两个才是真接缝。/tdd 和 /improve-codebase-architecture 都说这门语言——统一词汇让"哪里该深、哪里该薄"的讨论有共同坐标。
流程的形状很大程度上由 LLM 的一个物理约束决定:smart zone——约 150k token 以内模型仍然推理敏锐,超过就开始劣化。由此派生出两条核心规则和一套边界决策树:
/compact。| 选项 | 适用 | 关键理由 |
|---|---|---|
| 继续 | 默认起点。当前内容对下一步还有用。 | 成本为零,损失为零。因"一手信息"最贵,先排除其他选项再考虑它。 |
/clear | 当前内容对接下来要做的事毫无价值。 | 最彻底的重置。 |
/handoff | 换 harness、换目录、交给同事、阶段中途分叉支线任务。 | 买的是可移植性:一份 markdown 摘要(含"建议调用的技能"清单,引用既有产物而非复制,脱敏)。写到系统临时目录而非工作区。 |
| 子代理 | 范围收紧的独立任务,要一份报告回来。 | 主窗口不被污染。 |
/compact | 窗口要满但工作要续。 | 压缩现状并播种新会话。是树底的默认,不是第一反应用。 |
决策发生在边界上;阶段中途只允许"继续"或"把剩余拆成子代理"。
把这套体系落到你自己的项目,按顺序过一遍:
npx skills@latest add mattpocock/skills,二选一)/setup-matt-pocock-skills:定追踪器、标签、领域文档布局CONTEXT.md 与 docs/adr/ 约定生效(第一个术语出现时才建文件,允许懒创建)/grill-with-docs,直到前沿为空、你确认达成共识/to-spec:接缝先行并与你确认;规格里不写文件路径/to-tickets:垂直切片 + 阻塞边;宽重构走 expand–contract;你批准粒度后才发布/implement,会话间 /clear;tdd 只在预约定接缝上写测试/code-review:Standards / Spec 两轴都看,不接受"合并排序"的偷懒结论/triage(先查重复实现和 out-of-scope 档案)/diagnosing-bugs:先有红命令,再谈假设;插桩统一前缀,收尾全清/improve-codebase-architecture 巡检热点区域,选中候选回到主流程/compact 或 /handoff,不要带病硬撑按仓库的分类桶组织。调用类型标注:用户调用 只能你敲命令触发(编排职责);模型调用 智能体可自动触发(纪律职责)。engineering/ 和 productivity/ 是"晋升桶"(随插件发布、有文档页);in-progress/ 是公测(需单独安装);misc/ 是低频留存;deprecated/ 当前为空(退役技能直接删除并在 changeset 里注明替代者)。
全套技能的路由器:记不住该用哪个时,问它。它把所有用户可达技能组织成主流程、三条汇入通道、代码库健康、词汇层、独立技能五张图,并回答"我现在这个处境该从哪进"。仓库规定:任何新增/改名/改变用户可达技能的变更都必须同步更新它——"一个不认识新技能、还指向已删技能的路由器是在撒谎"。
带文档产出的拷问会话——整个体系的核心技能。SKILL.md 本体只有一句话:"调用两次 Skill 工具:grilling 和 domain-modeling"。这句话本身就是设计示范:编排技能应该薄,纪律下沉到可复用的模型调用技能里。
把 issue 和外部 PR 推过五态分诊状态机,产出 agent-ready 的任务简报。要点:AI 评论强制免责声明;先复现/验证声称再拷问;拒绝的增强请求写入 .out-of-scope/ 知识库防止重复提议;支持续聊(读旧分诊笔记,不重复问已答问题)。
扫描代码库找"深化机会",产出到临时目录的可视化 HTML 报告(候选卡片 + before/after 图 + 推荐强度),选中候选后进入 grilling 循环。热点优先(YAGNI)、删除测试、ADR 冲突只在摩擦真实时重提。
每仓库一次的初始化:配置问题追踪器(GitHub/GitLab/本地 markdown/自定义 prose)、分诊标签词汇、领域文档布局(默认单上下文)。写入 docs/agents/*.md 并在 AGENTS.md/CLAUDE.md 加 ## Agent skills 块,绝不覆盖用户已有编辑。
不做访谈,把当前对话直接合成为规格并发布(打 ready-for-agent)。先定测试接缝并与用户确认;模板含超长用户故事清单;禁文件路径与代码片段(原型决策密集片段除外)。
把规格/计划/对话拆成带阻塞边的曳光弹垂直切片,先给用户过目(粒度、阻塞边、合并/拆分)再发布。宽重构走 expand–contract。本地追踪器一票一文件,真追踪器用原生 blocking。
按票/规格实现,指令极简(这是特性不是缺陷):在预约定接缝用 tdd;定期类型检查 + 单测、最后全量;收尾 code-review;提交当前分支。
为超过单会话容量的巨型任务绘制决策票地图:目的地先行、雾中之战、四类票(research/prototype/grilling/task)、认领防撞、一次一票、地图收口后移交 to-spec。详述见第十章 ON-RAMP C。
一次性代码回答一个设计问题。两分支:逻辑/状态 → 单 HTML 可玩文件;UI → 同路由多变体。铁律:标注一次性、一条命令能跑、不持久化、不抛光、状态可见;收尾时决策折进真码、原型留 primary source 分支。
疑难 bug 六阶段纪律环,核心是阶段 1 的"造反馈回路"(十种手段、红-capable 验收标准)。全程先脱敏;性能问题先测基线;找不到回归测试的正确接缝本身即为发现,转交架构巡检。详述见第十章 ON-RAMP B。
把阅读调研委托给后台子代理:针对高信任一手来源调查一个问题,产出带引用的 Markdown 文件落回仓库。你继续干活,它读完留档。产物是喂给 grill-with-docs 的素材——研究是喂养思考,不是替代思考。
红-绿循环的参考手册:好测试 = 通过公共接口验证行为;测试只写在预约定接缝上;三反模式(实现耦合/同义反复/水平切片);三规则(红先于绿/一次一片/重构不在循环里)。可单独用("就想测试优先做这个行为"),也被 implement 驱动。
领域模型的主动纪律:挑战词汇表冲突、锐化模糊词、场景压测边界、代码与陈述交叉验证、当场更新 CONTEXT.md。ADR 三条件门槛。支持多上下文布局(CONTEXT-MAP.md + 各子域自己的 CONTEXT.md/ADR)。
深模块设计词汇的单一事实来源:module/interface/depth/seam/adapter/leverage/locality 七术语 + 四原则(深度是接口属性/删除测试/接口即测试面/两 adapter 才是真接缝)+ 可测试性三招(接受依赖不创建、返回结果不产副作用、小表面)。附带 DEEPENING 和 DESIGN-IT-TWICE 两个进阶模式(后者用并行子代理设计多个 radically different 的接口再比较)。
对 diff 做双轴评审:Standards(仓库规范 + 12 条 Fowler 坏味道基线,仓库覆盖基线,全部是判断题)+ Spec(缺失/越界/错实现),两轴并行子代理、聚合不重排。详述见第九章。
逐 hunk 处理进行中的 merge/rebase 冲突:按意图解决——追溯每一方的一手来源,而不是挑行拼接;然后完成整个操作。永不 --abort。
为"只有人能做"的步骤生成交互式 bash 向导:开 provision 基础设施、配凭据/CI secrets、点陌生第三方后台、跑一次性割接。脚本打开每个 URL、捕获每个值、写进 .env 和 GitHub secrets。判据:智能体能自己做的就自己做,这是给"人真正在环里"的环节用的。
grill-with-docs 的无状态版:同一套拷问,但不落盘、不建词汇表。用于没有工作目录的场景(打磨计划/设计/文章)。有仓库时它严格劣于 grill-with-docs。
把当前对话压缩成交接文档存到系统临时目录(不进工作区),让新智能体无缝续接。含"建议调用的技能"清单;引用既有产物(规格/ADR/commit)的路径而非复制;脱敏。可传参指定下一会话的重点。
跨多个会话教你一个新技能/概念,用当前目录做有状态的教学工作区(进度、练习、笔记都在里面)。
挡路的信息既不在你脑子里也不在代码库里,而在别人脑子里时:它拷问你的发送(问谁、要什么回来),而不是拷问主题本身,然后产出一份 Markdown 问卷(异步填或会上过)。grill-me 的逆操作。收到的答案回喂 grill-with-docs / to-spec。
"等等,没听懂"的即时补救:智能体用你缺的上下文、大白话、CONTEXT.md 的词汇重新讲一遍刚才说的东西。任何会话中途可用。治标;治本靠 grill-with-docs 早早建立共享语言。
访谈原语本身:设计树、轮次、前沿、事实智能体查/决策用户拍。grill-me、grill-with-docs、triage、wayfinder、improve-codebase-architecture 全部在内部跑它。详述见第四章。
给智能体写文档的参考:SKILL.md 怎么写、AGENTS.md/CLAUDE.md 怎么写、被指针引用的文档怎么写。让"写给 AI 看的文本"有自己的写作规范。
| 技能 | 说明 |
|---|---|
| loop-me 用户调用 | 跨会话把自己拷问出可实施的工作流规格,当前目录做有状态工作区。 |
| writing-beats | 把文章组织成一串"节拍"的旅程,选一个起点只写那一拍,再跳下一拍,直到自然收尾。 |
| writing-fragments | 拷问式挖掘写作素材碎片,追加到单一文档,为未来文章攒原料。 |
| writing-shape | 把原料文档逐段整形成文章,每步都论证格式选择。 |
| claude-handoff 用户调用 | 把当前对话经 claude --bg 移交给一个立刻接手的后台智能体。 |
| setup-ts-deep-modules 用户调用 | 给 TypeScript 仓库接上 dependency-cruiser,强制每个 package 成为深模块(实现藏子目录、只从入口可达、测试走入口)。 |
| implement-spec 用户调用 | 把整份规格在一个分支上实现:票当任务图处理,implementer 子代理沿"就绪前沿"并行推进,落成单个 PR。相当于 to-tickets + implement 的自动化版。 |
| retro 用户调用 | 会话结束后建议改进智能体环境(steering 文件、编码规范、自动化检查、工具链)。目前是 STUB,只有设计笔记。 |
| 技能 | 说明 |
|---|---|
| git-guardrails-claude-code | 配置 Claude Code hooks,在危险 git 命令(push、reset --hard、clean 等)执行前拦截。 |
| migrate-to-shoehorn | 把测试文件里的 as 类型断言迁移到 @total-typescript/shoehorn。 |
| scaffold-exercises | 生成练习目录结构:sections / problems / solutions / explainers。 |
| setup-pre-commit | 配置 Husky pre-commit:lint-staged + Prettier + 类型检查 + 测试。 |
当前为空。退役策略:技能直接删除,移除它的 changeset 必须注明由什么替代。
| 路线 | 说明 |
|---|---|
| Claude Code 插件 | claude plugins install mattpocock-skills。官方市场直接装,托管式只读包,作者更新自动同步——"订阅"哲学。 |
| skills.sh 安装器 | npx skills@latest add mattpocock/skills。把技能文件复制进你的仓库,归你所有、随便改,无后台更新——"fork"哲学。记得勾上 setup-matt-pocock-skills。 |
两条都装会导致每个技能出现两份。装完跑 /setup-matt-pocock-skills 完成仓库配置。
engineering/(每日代码工作)、productivity/(非代码工作流)、misc/(低频留存)、in-progress/(公测)、deprecated/(退役)。前两个是晋升桶。.claude-plugin/plugin.json 的 skills 数组、拥有 docs/<bucket>/<skill>.md 文档页(四节结构:What it does / When to reach for it / Common questions / It's working if)。disable-model-invocation: true),要么是模型调用——二选一,且有明确的存在理由。ask-matt 路由器随技能变更同步更新,保证地图不撒谎。claude plugin validate . --strict 验证。scripts/link-skills.sh 把技能软链到本机技能目录,git pull 即更新。