mattpocock/skills 到底怎么用
37 个技能、两条互斥的安装路线,和一条能跑通的最短路径
📅 更新于 2026-10-06
本文校对于 mattpocock/skills @ v1.3.1 · 官方源:github.com/mattpocock/skills
0030 秒速览:三条结论 + 按处境挑技能
读完这一篇,你能做出三个判断:这条路线该选哪条、这套东西能替你解决哪一类问题、以及为什么它给你的第一感受往往是"变慢了"(那是设计意图,不是 bug)。
① 它不是"帮你写代码"的流水线,而是在你最容易偷懒的那一步插一道闸——最值钱的几个技能干的事是向你提问、把答案落成文档;② 37 个技能里模型只能自己开动 15 个,22 个必须由你敲,这道"人才能点火"的设计是整套东西的分界线(04);③ 插件与 skills.sh 只能选一条,两条都装会让每个技能在你机器上出现两份。
按你的处境,直接用这个
| 你现在的状态 | 直接用这个 | 为什么 |
|---|---|---|
| 还没装,只想赶紧用上 | claude plugins install mattpocock-skills | 一条命令,自动更新(03) |
| 想改它、想在 Codex 上也用 | npx skills@latest add mattpocock/skills | 文件写进你的仓库,归你(03) |
| 装完了,不知道下一步 | 先跑 /setup-matt-pocock-skills,再敲 /ask-matt | 每个仓库一次;它是路由器(06) |
| 有个模糊想法,说不清要什么 | /grill-with-docs | 让 AI 反过来追着你问,把歧义问出来 |
| 需求聊清楚了,要落成文档 | /to-spec → /to-tickets | 不重复访谈,只把共识合成规格与票据 |
| 活儿太大,一次会话装不下 | /wayfinder | 把它变成一张可以一张张解的决策地图 |
| 开始写代码了 | /implement(一张票一次)或 /implement-spec(整份一次跑完) | 两者都驱动 /tdd,最后跑 /code-review 收尾 |
| AI 写的代码"看着对但不对" | /code-review | 双轴评审:代码规范 × 是否忠实于规格 |
| 一次改动做完了,想下次少踩坑 | /retro | 回头改 agent 的工作环境,而不是改代码 |
| 有个难复现的 bug | /diagnosing-bugs | 先建能变红的反馈回路,再谈修复 |
| 会话快爆了 / 要换人接手 | /handoff | 把活线程压成一份 Markdown |
| AI 说的话你没看懂 | /wait-what | 用你的项目词汇重讲一遍 |
一条可执行的上手路径
见 03。装完立刻跑一次 /setup-matt-pocock-skills——这不是可选项,缺配置时 /to-spec、/to-tickets、/triage、/code-review 会停下来让你先去跑它。
/grill-with-docs → /to-spec → /to-tickets → /implement → /code-review → /retro,见 06。先走通一条,再回来挑其他技能——不要一次装齐再慢慢试。
本仓库自己的说法是:这些技能的定位是"小、可改、可组合"(small, easy to adapt, and composable)。用不上的直接删掉,比留着占脑子更划算。
说清它和"全自动流水线"的区别;独立选对安装路线;讲出 37 / 27 / 10 这三个数字各自怎么来的;并且知道一次改动的六个技能该怎么串。本文讲的是这套技能包,不是某个技能的内部实现细节。
01这 37 个文件到底是什么(先破四个错想)
mattpocock/skills 是一套由 37 个 Markdown 技能文件组成的工程纪律包:每个技能是一个小到能一眼读完的指令文件(SKILL.md),你敲斜杠命令调用它,或者让模型在合适时机自己取用。作者 Matt Pocock 把它定位成"给真做工程的人用的技能,不是 vibe coding"(README 原话:My agent skills that I use every day to do real engineering - not vibe coding)。
先破掉四个错误印象
以为装上以后有个开关,一开就从头跑到尾。
它没有守护进程、没有后台任务、没有"启动后自动跑完"的开关。绝大多数技能干的事是向你提问、把答案落成文档,或者在动手前逼你先建好反馈回路。真正写代码的那两个(/implement、/tdd)反而是最短的文件。
既然都是"流程框架",那就挑一个功能最全的。
README 点名了那类做法的取舍:它们通过占有流程来帮忙,代价是你交出了控制权,而且流程本身的 bug 很难修(原话:they take away your control and make bugs in the process hard to resolve)。这套技能的自我定位正好相反:small, easy to adapt, and composable——小、可改、可拼。
既然是"装",那它应该是个程序,有自己的配置中心和卸载程序。
主要是 SKILL.md,外加极少量模板脚本(例如 wizard 的 template.sh、diagnosing-bugs 的 scripts/hitl-loop.template.sh)。没有二进制、没有依赖、没有配置中心——所以"卸载"就是删目录。
只支持 Claude Code 的话,我用 Codex 就只能干看着。
一份给 Claude Code 用的 frontmatter,一份给 Codex 用的同级文件 agents/openai.yaml(每个技能都带这一个文件,里面放着技能选择器要显示的 interface.display_name / short_description,以及用户可启动技能需要的那个"禁止隐式调用"开关)。仓库里还有一条 ADR(0002-ship-as-a-claude-code-plugin.md)专门记录"为什么以 Claude Code 插件形态发布",同时承认原生 Codex 插件还在路线图上。
一句话版本:它是什么
把作者日常在用的技能目录公开出来,按四个桶分组:engineering(20 个)、productivity(7 个)、misc(4 个)、in-progress(6 个)。每个桶把技能分成两类列出——用户可启动(user-invoked)与模型可启动(model-invoked)——这是整套设计的唯一分界线,04 专门讲它。
机制:为什么"几个 Markdown 文件"能改变工作方式
因为技能的实质不是知识,而是在你最容易偷懒的那一步插一道闸。三个真实例子:
/grill-me不给你任何技术答案,它只负责不停地问你,直到设计树上的每个分支都被决定;/to-tickets不写代码,它把一份计划切成"垂直切片",并给每张票标上阻塞边(谁必须先完成);/code-review不做修改,它把 diff 分两条轴并行评审,然后刻意不替你把两条轴的结论排个总名次。
这三件事的共同点:人在赶进度时最不会主动做,而 AI 又特别容易顺着你的话往下写。把闸做成一个斜杠命令,你才有机会在"已经写了两千行"之前把它拉下来。
它不是替你写代码的工具,是替你在正确的时候踩刹车的工具。所以它带来的第一个感受往往是"变慢了"——那是设计意图,不是 bug。
02它为什么存在:四条失效模式,和四句原话
这一节不是我总结的,是 README 自己写的"这些技能为什么存在":它点名了用编码代理时最典型的四种失效,每种配一位经典作者的原话、一个"修法"、以及对应的技能。理解这四条,你就能判断自己该用哪几个——而不是把 37 个都学一遍。
| 失效 | 问题(README 的说法) | 修法 | 对应技能 |
|---|---|---|---|
| 1 · 做的不是我想要的 | 你和代理之间存在沟通缺口;你以为它懂了,看到成品才发现它根本没懂 | 开一场盘问会(grilling session),在动手前把要建的东西问细 | /grill-me(非代码场景)/grill-with-docs(代码场景,外加下文第 2 条的好东西) |
| 2 · 它太啰嗦 | 代理被丢进一个项目,边干边猜行话,于是一句话能说清的事它用二十句 | 建一份共同语言文档,让代理能解码项目里的行话 | /grill-with-docs(盘问的同时建领域模型,把难解释的决定写成 ADR) |
| 3 · 代码跑不起来 | 就算对齐了要做什么,它做出来的东西还是不行——因为它不知道代码实际跑起来是什么样 | 补反馈回路:静态类型、浏览器、自动化测试。测试用红-绿-重构 | /tdd/diagnosing-bugs(把调试最佳实践包成有阶段闸门的循环) |
| 4 · 我们造出了一团泥(README 的用词是 a ball of mud) | 代理把写码速度拉满,于是软件熵也以前所未有的速度增长:库越来越复杂、越来越难改 | 把"关心设计"放进每一层:先说清你要动哪些模块,再定期勘察代码库 | /to-spec(写规格前先问你要动哪些模块)/improve-codebase-architecture(勘察加深模块的机会) |
四句原话(README 的引文)
README 给每一条失效都配了一句经典作者的话。四句放在一起看,能看出这套技能的野心:它想守的是软件工程的老底子,而不是发明一套新流程。
- 关于"想要的说不清":《程序员修炼之道》——"No-one knows exactly what they want"(没人确切知道自己想要什么)。README 因此主张:每次想改动之前都先做一次对齐。
- 关于"共同语言":Eric Evans《领域驱动设计》——"With a ubiquitous language, conversations among developers and expressions of the code are all derived from the same domain model."(有了无处不在的语言,开发者之间的对话与代码的表达都源自同一个领域模型。)
- 关于"小步与反馈":《程序员修炼之道》——"Always take small, deliberate steps. The rate of feedback is your speed limit."(永远走小而刻意的步子;反馈速率就是你的速度上限。)
- 关于"设计":Kent Beck《解析极限编程》——"Invest in the design of the system every day."(每天都为系统的设计投资。)以及 John Ousterhout《软件设计哲学》——"The best modules are deep."(最好的模块是深的:小接口后面藏很多行为。)
一条"共同语言"到底能省多少:一个真实的前后对照
README 举了自己那个 course-video-manager 仓库里的例子,同一件事的两种说法:
"There's a problem when a lesson inside a section of a course is made 'real' (i.e. given a spot in the file system)"
(课程里某一节里的一课被"实体化"——也就是在文件系统里拿到一个位置——时有问题。)为了说清一件事,得先把三个对象的关系和一个动作解释一遍。
"There's a problem with the materialization cascade"
("实体化级联"有问题。)一个词顶掉一整句解释。README 对这件事的评价很直白:这种简洁会在一个又一个会话里持续付利息(This concision pays off session after session)。
除了少说废话,共同语言还顺带带来三件事:变量、函数、文件名会用同一套词命名;于是代码库对代理更好导航;而且因为它拿到的是更简洁的语言,思考本身也花的 token 更少。这也是为什么 /grill-with-docs 值得在每次改动前跑——它一边盘问你,一边顺手把语言统一了。
03两条安装路线,先选一条别都装
官方 README 把安装压缩成三步。其中第一步有两条互斥的路线,选错会留下一个很难自查的后遗症。
路线 A:Claude Code 插件(订阅制,只读)
claude plugins install mattpocock-skills
会话内也可以敲 /plugin install mattpocock-skills。
它挂在 Claude Code 的官方 marketplace 上,所以不需要先添加市场,更新会自动到达。官方原话是 updates arrive automatically。
路线 B:skills.sh(把文件写进你的仓库)
npx skills@latest add mattpocock/skills
安装器会让你勾选要哪些技能、装给哪些编码代理。README 特意加粗提醒:确保 setup-matt-pocock-skills 在里面。
npx skills update
没人会在背后替你更新——文件是你的,什么时候拉新版由你决定。这正是它相对插件的全部卖点。
装完你得到的是一堆可编辑的 SKILL.md(以及每个技能旁边的 Codex 元数据文件),直接躺在你的机器 / 仓库里。
先用插件装一遍,又觉得"还是能改文件爽",再 npx skills add 一遍。结果:每个技能在你机器上出现两份,斜杠命令列表里同名项重复,模型自动触发时命中哪一份不确定。README 的原话毫不含糊:Pick one: installing both leaves you with every skill twice.
只想用、不想维护 → 插件一条命令收工。想改、想跨代理、想自己控版本 → skills.sh,然后用 npx skills update 手动升级。
两条路的区别,一张表看完
| 维度 | 路线 A:Claude Code 插件 | 路线 B:skills.sh |
|---|---|---|
| 文件归谁 | 只读的托管包,你不直接编辑它 | 写进你的仓库,是可编辑的普通文件 |
| 更新 | 随官方市场自动更新 | 你自己 npx skills update |
| 能不能改 | 不能改(要改就 fork) | 能改,改成你自己团队的习惯 |
| 可用代理 | 仅 Claude Code | 任何代理(含 Claude Code) |
| 拿到几个技能 | 27 个(engineering 20 + productivity 7) | 你勾选的那些;misc 与 in-progress 共 10 个只能走这条路 |
| 拿到几分 | 一份 | 一份 |
| 装到哪 | 由插件系统托管 | 写进你的机器 / 项目目录,是可编辑的普通文件 |
无论哪条路,每个仓库都要单独跑一次 /setup-matt-pocock-skills。它不是可选项:/to-spec、/to-tickets、/triage、/code-review 都会在缺少配置时停下来,让你先去跑它。misc 里的四个工具型技能是唯一例外——它们不依赖这套仓库配置。
(本文没有逐一验证各代理的默认安装目录——那随版本会变,请以你装完后 agent 实际报出的路径为准。)
04整套设计的唯一分界线:谁能启动它
如果这篇只能留一节,就留这一节。整套技能的其它设计几乎都是从这条分界线推出来的。
什么叫"谁能启动它"
仓库自己的文档 .agents/invocation.md 把它写得很直白:每个 SKILL.md 都是一个技能,唯一的分割轴是"调用"——谁能碰到它。做法是在元数据里关掉模型的权限:Claude Code 侧写 disable-model-invocation: true,Codex 侧写 policy.allow_implicit_invocation: false。
| 类型 | 谁能启动它 | 它的 description 写给谁看 | 它负责什么 |
|---|---|---|---|
| 用户可启动 (user-invoked) |
只有人敲名字。模型碰不到它——包括别的技能也调不动它 | 写给人看:你浏览斜杠命令时读的一行摘要。官方要求把触发词列表("Use when the user says…")删掉 | 编排(orchestrate):把流程串起来 |
| 模型可启动 (model-invoked) |
人和模型都能:任务合适时模型自己会用 | 写给模型看:保留丰富的触发措辞("Use when the user wants…, mentions…"),好让自动触发命中 | 沉淀可复用的纪律(reusable discipline) |
三条硬规则
官方原话是 a user-invoked skill can never be reached this way, full stop(完整地说:它绝不可能被这种方式碰到)。所以当一个步骤的前置条件是某个用户可启动技能(比如 setup-matt-pocock-skills),技能内部不能"调用"它,只能提示人去敲。这就是为什么 /to-spec 缺配置时会停下来让你去跑 /setup-…,而不是自己跑掉。
所以 /grill-with-docs 内部可以调用 grilling 和 domain-modeling(两个都是模型可启动),但两个用户可启动技能之间永远不会互相调用。这条规则让"编排"永远只发生在人能看见的那一层。
技能之间表达依赖的写法,官方规定为明确指示调用 Skill 工具并写出技能名(例如 Call the Skill tool with "grilling"),而不是深层的相对路径引用,也不是在散文里丢一个 /名字 让模型自己领会。理由很实在:把工具名点出来,命中率高于"希望它把 /名字 读成命令"。
它把"谁有权点火"变成了一个可以写进文件、并且跨两个代理保持一致的开关。你自己写技能时最该抄的就是这一条:会改变状态、会连续跑很多步、或者需要人为判断才能开动的流程,把它设成用户可启动;可复用的纪律、审查、领域建模这类"随时被叫来帮忙"的,设成模型可启动。
0537 个技能全景:22 个你能敲,15 个模型自己会用
先认路,再记命令。下面按桶(功能分组)排、在每个桶里再按类型(谁能启动)分。描述逐字取自上游 README 的 Reference 段(未公开的 10 个取自它们各自的 SKILL.md 元数据)。
Engineering(20 个):日常写代码用的
| 技能 | 类型 | 它是什么 / 怎么用(官方描述) |
|---|---|---|
| 用户可启动(你能敲,模型不会自己开动) | ||
ask-matt | 用户可启动 | 问你该用哪个技能或哪条流程。它是本仓库里「用户可启动」技能的路由器。 |
grill-with-docs | 用户可启动 | 一边盘问,一边建设你的领域模型:打磨术语,顺手更新 GLOSSARY.md 和 ADR。 |
triage | 用户可启动 | 让 issue 在「分诊角色」构成的状态机里往前走。 |
improve-codebase-architecture | 用户可启动 | 扫一遍代码库找「加深模块」的机会,给出一份可视化 HTML 报告,再挑一个继续盘问。 |
setup-matt-pocock-skills | 用户可启动 | 把一个仓库配置好(issue 跟踪器、分诊标签、领域文档布局)。每个仓库用其他工程类技能之前跑一次。 |
to-spec | 用户可启动 | 把当前这段对话整理成一份规格并发布到 issue 跟踪器。不再访谈,只合成你们已经聊出来的共识。 |
to-tickets | 用户可启动 | 把任何计划、规格或对话切成一组「曳光弹」票据,每张票声明自己的阻塞边(谁必须先完成),写成本地文件或跟踪器上的原生阻塞链接。 |
implement | 用户可启动 | 按规格或票据实现:在事先约定的接缝处驱动 /tdd,提交前用 /code-review 收尾。 |
implement-spec | 用户可启动 | 把整份规格一次实现掉:把票据当一张任务图(阻塞边就是图上的箭头),在可以开工的「前沿」(阻塞边都已清掉的那批票)上并行跑几个子 agent(各自独立干一段活的小助手),最后全部汇到同一条集成分支(大家最后合并进去的那条分支)上,用 /code-review 收尾。 |
wayfinder | 用户可启动 | 把大过单个 agent 会话的一坨活儿规划成跟踪器上的一批「决策票据」,一次解一张,直到去目的地的路清楚为止。 |
retro | 用户可启动 | 一次会话结束后,回头建议改进编码 agent 的环境(指路用的导航指针、自动化检查、编码规范、AGENTS.md 这类引导文件、工具链),最严重的排前面。 |
| 模型可启动(你敲它也行,任务合适时模型自己会用) | ||
prototype | 模型可启动 | 写一次性原型回答一个设计问题:要么一个可分享的单页 HTML 回答状态/逻辑问题,要么几条差异极大的 UI 变体用一个路由切换着看。 |
diagnosing-bugs | 模型可启动 | 针对难缠 bug 与性能退化的诊断循环:先建一个能对这个 bug 变红的反馈回路 → 最小化 → 提假设 → 加观测 → 修 → 加回归测试。 |
research | 模型可启动 | 拿一个问题上高可信的一手来源做调查,把发现写成带引用的 Markdown 放进仓库,作为后台 agent 跑。 |
tdd | 模型可启动 | 红-绿-重构的测试驱动开发。一次一个垂直切片地做功能或修 bug。 |
domain-modeling | 模型可启动 | 主动建设和打磨项目的领域模型:拿术语表挑战用词、用边界场景压测,顺手更新 GLOSSARY.md 和 ADR。 |
codebase-design | 模型可启动 | 设计「深模块」的共享纪律与词汇:小接口后面藏很多行为,放在干净的接缝上,并能透过这个接口测试。 |
code-review | 模型可启动 | 对「自某个固定点以来的 diff」做双轴评审:规范轴(是否符合本仓编码规范 + Fowler 坏味道基线)与规格轴(是否忠实实现了那个 issue/spec),两条轴并行跑子 agent,互不污染。 |
pr | 模型可启动 | 一个 pull request(PR,把一串改动交出去请人合入的那份请求)的正文该长什么样:用能把改动说清的最小可视化做摘要,配上"改前 / 改后"能跑的证据,再给一句"合进去有多险"的判断(双向门=能轻松回退,单向门=回不去,外加波及面多大)。 |
wizard | 模型可启动 | 生成一个交互式 bash 向导,把只有人能做的那几步领着走:开通基础设施、配置凭据或 CI secret、走一遍陌生的第三方后台、跑一次性迁移或切换。 |
Productivity(7 个):与代码无关的通用工作流
| 技能 | 类型 | 它是什么 / 怎么用(官方描述) |
|---|---|---|
| 用户可启动 | ||
grill-me | 用户可启动 | 就一个计划或设计被 relentlessly(不依不饶地)访谈,直到设计树上的每个分支都被解决。 |
handoff | 用户可启动 | 把当前对话压缩成一份交接文档,让另一个 agent 能接着干。 |
teach | 用户可启动 | 跨多次会话教你一个新技能或概念,把当前目录当作有状态的教学工作区。 |
to-questionnaire | 用户可启动 | 把一个你自己答不了的决策变成一份给「唯一能答的人」的 Markdown 问卷,可以异步填,也可以会上一起填。它盘问的是「怎么发出去」(给谁、要拿回什么),不是主题本身。 |
wait-what | 用户可启动 | 消息没听懂的那一刻就敲它。agent 会用你缺的那点上下文重讲一遍,用大白话,用你 GLOSSARY.md 里的词汇。 |
| 模型可启动 | ||
grilling | 模型可启动 | 就一个计划、决策或想法不依不饶地访谈用户,直到设计树上每个分支都被解决。它是 grill-me、grill-with-docs、triage、wayfinder 和 improve-codebase-architecture 背后那个可复用的访谈原语。 |
writing-for-agents | 模型可启动 | 写给 agent 看的文档:技能、AGENTS.md / CLAUDE.md,以及任何 agent 顺着指针读到的文档。 |
另外 10 个:仓库里有,但插件不给(misc 4 + in-progress 6)
这四个 misc 技能和六个 in-progress 技能都在仓库的 skills/ 目录里,但不在 Claude Code 插件里,README 的 Reference 段也没收它们。要用只能走路线 B 单装(见 03)。
| 技能 | 桶 / 类型 | 它是什么(取自各自 SKILL.md 的元数据) |
|---|---|---|
git-guardrails-claude-code | misc · 模型可启动 | 配置 Claude Code 的钩子,在危险 git 命令(push、reset --hard、clean、branch -D 等)执行前拦下它们。 |
migrate-to-shoehorn | misc · 模型可启动 | 把测试文件里的 as 类型断言迁移到 @total-typescript/shoehorn。 |
scaffold-exercises | misc · 模型可启动 | 创建练习目录结构:章节、题目、答案、讲解,并且能过 lint。 |
setup-pre-commit | misc · 模型可启动 | 给当前仓库配上 Husky 提交前钩子:lint-staged(Prettier)、类型检查、测试。 |
claude-handoff | in-progress · 用户可启动 | 把当前对话交接给一个新的后台 agent,让它立刻接手继续干。 |
loop-me | in-progress · 用户可启动 | 就你想在这个工作区里搭的那套工作流,盘问你对规格的想法。 |
setup-ts-deep-modules | in-progress · 用户可启动 | 把 dependency-cruiser 接进一个 TypeScript 仓库,让每个包都是深模块:实现藏在子目录里,只能从入口文件到达。 |
writing-beats | in-progress · 用户可启动 | 写作的「利用」阶段:把素材组装成一段段推进的节拍,每个术语在被节拍依赖之前先打好地基。 |
writing-fragments | in-progress · 用户可启动 | 写作的「探索」阶段:先把零散素材挖出来,还不谈结构。 |
writing-shape | in-progress · 用户可启动 | 写作的「利用」阶段:把素材一段一段地塑形成一篇文章。 |
- 你看到的数字取决于你在哪看。GitHub 仓库的
skills/下是 37 个 SKILL.md;README 的 Reference 段只收 27 个(engineering 20 + productivity 7);Claude Code 插件给的就是这 27 个。差异的来源就是上面这 10 个(misc 4 + in-progress 6)。 - in-progress 是会变的。这个桶的意思就是"还在长",命令名和行为都可能改。
- 光看清单没用。决定成败的是顺序(06),不是命令表。
06主流程:六个技能串起一次改动
清单是地图,这一节是路线。一次典型的改动,官方推荐的走法是六个技能首尾相接——每一步都产出一个下游能用的东西,这正是它和"想到哪写到哪"的区别。
| 步骤 | 它问你什么 / 做什么 | 它的产出是什么 | 缺了它会怎样 |
|---|---|---|---|
/grill-with-docs |
就这个改动不依不饶地盘问你,直到每个分支都被决定;同时顺手打磨术语 | 一份被问清楚的共识 + 更新过的 GLOSSARY.md / ADR |
你会在"其实没想清楚"的状态下直接开写,返工在最后暴露 |
/to-spec |
不再访谈,只把已经聊出来的东西合成规格 | 发布到 issue 跟踪器的一份规格 | 共识只活在这一段聊天记录里,换会话就没了 |
/to-tickets |
把规格切成"垂直切片",给每张票标阻塞边 | 一组能独立验收的票据(本地文件或跟踪器原生阻塞链接) | 活儿太大,一次会话装不下,进度无法交接 |
/implement |
按规格/票据实现,在事先约定的接缝处驱动 /tdd |
能跑的代码 + 测试;提交前用 /code-review 收尾 |
实现与规格分家,评审时才发现做的不是要的 |
/code-review |
双轴并行评审:规范轴(编码规范 + Fowler 坏味道)× 规格轴(是否忠实实现) | 两条轴各自的结论(刻意不合并成一个总名次) | 你只拿到"看着还行",拿不到"哪里不符合本仓规范 / 哪里偏离了规格" |
/retro |
回头看这次会话,问的是"环境该改什么"而不是"代码该怎么改":指路用的导航指针、自动化检查、编码规范、AGENTS.md 这类引导文件、工具链 |
一组对 agent 工作环境的改进建议(能用机器判的机械性错误变成确定性检查——lint 规则、提交前钩子、CI 任务;只能靠人判的变成编码规范) | 下次同一个坑再踩一遍,环境一点没变好 |
官方给了两条并行走法:/implement 是一张票一次,每张票之间清一次上下文(票据自带全部信息,上一张的记忆可以丢);/implement-spec 是整份规格一次跑完——把票据当一张任务图(阻塞边就是图上的箭头),在可开工的「前沿」上并行跑几个子 agent,最后全汇到同一条集成分支上。官方路由器 /ask-matt 给的选择标准是:想自己一张张驱动就用前者,想交给它编排就用后者。活儿要变成 pull request 时,/pr 负责 PR 正文的形状。
这是这套技能最容易被误读的地方。实际用法是按处境挑:活不是从"我想做个功能"开始的——可能是 issue 涌进来(/triage)、可能是一坨大过会话的活(/wayfinder)、也可能是一开始就说不清要什么(/grill-with-docs)。/ask-matt 就是为这件事准备的:它不干活,只告诉你"你这种情况该用哪个"。
07两个跑在所有技能底下的技能
有两个技能不在主流程上,但几乎跑在所有其它技能底下。理解它们,你就理解了这套东西为什么强调"文档"。
grilling:那个"问到你烦"的原语
官方把它定位成可复用的访谈原语——grill-me、grill-with-docs、triage、wayfinder、improve-codebase-architecture 背后都是它。它的行为很简单:就一个计划或决策不停地问,直到设计树上的每个分支都被解决。
它的价值恰恰在于"烦":人在赶进度时最不会主动做这件事,所以交给一个不许你跳过的流程。
domain-modeling / GLOSSARY.md:让术语不再漂移
domain-modeling 干的是主动建设和打磨项目的领域模型:拿术语表挑战你的用词、用边界场景压测、更新 GLOSSARY.md 和 ADR。
这里有个细节值得学:官方文档特意区分了"读"和"建"——仅仅为了取词汇而读一眼 GLOSSARY.md,那是一行散文指针,不等于执行 domain-modeling;只有主动的挑战术语、压测、写 ADR、就地更新 GLOSSARY.md 才算。
它们解释了这套技能对"文档"的态度:文档不是交付物,是让下一轮对话不用重新解释的缓存。GLOSSARY.md 存的是你这个项目的通用语言,ADR 存的是"为什么这么做"的决定——两者都是为了让下一次的 AI(以及下一个人)不必从零开始。
08最小例子:一句「导出当前筛选结果」
抽象讲了六节,来看一个具体到能想象的改动。
需求:后台列表页的"导出"按钮,现在导出全部数据,你想让它导出当前筛选结果。
/grill-with-docs 会先拦住你它不会马上写代码,而是问一些你还没决定的事。典型的几个:
- "当前筛选"在服务端和前端哪一边生效?两边不一致时以谁为准?
- 导出的是这一刻的结果,还是重新按条件查一遍?(数据在两次点击之间变了怎么办)
- 导出列要不要跟着筛选走——比如按"状态"筛选时,还要不要导出状态这一列?
- "筛选结果为空"时是给一个空文件、还是报错、还是禁用按钮?
顺手它会把"筛选""导出""当前结果"这些词在 GLOSSARY.md 里的说法对齐——如果你们团队管这个叫"视图"而不是"筛选",这里就会被纠正过来。
/to-spec 把这轮问答变成文档它不再问你第二遍,只把刚刚的共识合成一份规格:范围(改哪个接口)、行为(服务端为准 / 重新查询)、边界(空结果禁用按钮)、以及明确的"这次不做"。
/to-tickets 切成能独立验收的小块比如三张票:① 接口支持按筛选条件导出;② 前端把当前筛选传下去;③ 空结果时的按钮状态。每张票标出阻塞边(②依赖①)。
/implement 一次做一张,先写测试它在事先约定的接缝处驱动 /tdd:先写一个会失败的测试(比如"传了筛选条件时只返回匹配行"),再让它变绿,再重构。做完一张票再动下一张。
/code-review 最后做双轴体检它从某个固定点(比如主干)开始看 diff,两条轴并行跑:规范轴问"这符合本仓的编码习惯吗、有没有坏味道",规格轴问"这忠实实现了那份规格吗"。两条轴的结论刻意不合并——由你来判断"规格对但代码烂"和"代码漂亮但做错了事"哪个更急。
是第 1 步。那四个问题里,至少有一个("数据在两次点击之间变了怎么办")是你在写代码时几乎一定会漏掉、而在上线后一定会被问到的。整套技能的价值密度就集中在这种地方。
09七个常见坑
下面七条,是从这套技能的文档与设计里能直接读出来的失败模式。每条都给出"怎么避免"。
避免:README 说得毫不含糊——Pick one。想清楚你要的是"订阅"还是"拥有",然后固定下来。
/setup-matt-pocock-skills/to-spec、/to-tickets、/triage、/code-review 一敲就停下来让你先去配置。避免:把它当成"安装的第 1.5 步"。每个仓库一次,别指望它只跑一次就全局生效。
/scaffold-exercises 或 /writing-shape;或者以为自己装了全部 37 个。避免:记住三个数字——仓库 37、README 收录 27、插件给 27;差的 10 个(misc 4 + in-progress 6)只能走路线 B 单装。
grill → spec → tickets → implement → review → retro,于是一堆空转的文档。避免:先问一句"我现在的处境是什么"。issue 涌进来用
/triage,活太大用 /wayfinder,说不清要什么才用 /grill-with-docs。不确定就敲 /ask-matt。/code-review 或者 /improve-codebase-architecture 就等于质量有保障。避免:作者自己就给了反面说法——
improve-codebase-architecture 在 README 里被描述成 a survey, not a rescue(它是勘察报告,不是救援队)。它会在真正年久失修的代码库上找到真问题,但不会替你把泥解开(README 给的用法是每隔几天跑一次)。description 写给人看也写给模型看避免:官方把这件事分得很清——用户可启动的技能,描述写给人看(要删掉触发词列表);模型可启动的,描述写给模型看(要保留丰富触发措辞)。两个用途不要混在一句里。
10排错:六个最常见的问题
这一节留给"回来查"。每个问题都给出先怀疑哪一层——排查顺序比结论更重要。
1 · 敲了斜杠命令,agent 说没有这个技能
- 先确认装到哪了。插件与 skills.sh 装的位置不同;路线 B 还可能只装了部分技能(安装器让你勾选)。回 03 对一眼。
- 再看这个技能属于哪个桶。如果你走的是插件路线,
misc与in-progress的 10 个技能根本不在里面,看不到是正常的。 - 最后看名字有没有变。
in-progress桶的技能还在演进,命令名可能改(仓库自己就改过触发与命名)。以你实际安装目录里的SKILL.md为准。
2 · 模型没有自己用那些技能
- 这多半不是故障。22 个技能是用户可启动的,模型按设计就碰不到。04 讲了为什么。
- 想让某个流程自动触发?看它是哪个类型:模型可启动的(如
diagnosing-bugs、tdd、code-review)会在任务匹配时自己出现;用户可启动的只能你敲。 - 如果是你自己写的技能不触发:检查
description有没有保留触发措辞——写给模型看的描述不该被"精简"成一句人话。
3 · /to-spec 一敲就中止,让我先去配置
- 这是预期行为。它缺 issue 跟踪器配置就干不了活,而它不能替你跑
/setup-matt-pocock-skills(那是用户可启动技能,别的技能够不着)。 - 做法:在那个仓库里跑一次
/setup-matt-pocock-skills。它会问你三件事:issue 跟踪器放在哪(默认 GitHub,GitLab 与本地 Markdown 也开箱支持)、分诊标签用哪几个词(对应五个标准分诊角色)、领域文档(GLOSSARY.md与 ADR)放哪。 - 它会把答案写成文件,例如
docs/agents/issue-tracker.md;下次别的技能就是读这些文件来决定"该调gh issue create,还是往.scratch/写 Markdown"(这一点可核对:setup-matt-pocock-skills的 SKILL.md 里明确写了落盘位置)。
4 · 我按 README 找某个技能,但它不在 Reference 清单里
- 先分清"仓库里有"和"文档里收了"。README 的 Reference 段收 27 个;
skills/目录下有 37 个。 - 要看那 10 个的定义,就直接打开它们的
SKILL.md——本文 05 已经把它们的官方描述列出来了。
5 · 用完感觉更慢了,是不是装错了
- 先别当成故障。这套技能的第一个感受通常就是"变慢了"——因为它把"提问、写规格、建反馈回路"这些你平时会跳过的事变成必经步骤。
- 判断标准换一个:比较"从开始到合入主干的总时长"和"返工次数",而不是比较"从提问到看见代码的时间"。
6 · 它说的问题我不认同,能不能让它别问那么多
- 可以,这正是"可改"的意思。文件是你的(路线 B),不认同它的规则就直接改
SKILL.md——官方 README 的原话就是 Hack around with them. Make them your own. - 但先想清楚代价:
grilling那类技能的"烦"就是它的价值。删掉追问,你得到的就是一个很会附和你话的 AI。
装在哪 → 什么桶 / 什么类型 → 配置跑没跑 → 是不是本来就这样设计。前三层你能立刻查,最后一层要回去读一眼 04。
11术语对照表
这张表的第三列不是翻译,而是"为什么重要 / 什么时候用 · 别当什么用"。
| 术语 | 定义 | 为什么重要 / 何时用 · 别当什么用 |
|---|---|---|
| skill(技能) | 一个带 SKILL.md 的目录;文件里是给 agent 看的指令 |
它是这套东西的最小单位。别把它当插件或程序——它就是文本,看不懂就打开读,不认同就改。 |
| user-invoked (用户可启动) |
只有人能敲名字来启动的技能 | 用来放编排:会连跑多步、会改状态的流程。别指望模型自动用它们——它碰不到。 |
| model-invoked (模型可启动) |
人和模型都能启动的技能 | 用来放可复用的纪律(审查、诊断、领域建模)。别把"必须由人决定"的流程放进这一类。 |
| frontmatter | Markdown 文件顶部用两行 --- 夹起来的元数据区 |
技能的"身份证":名字、描述、以及"模型能不能自动启动"。别把它当注释——它是被程序读的,而且两个代理各有一份(Claude Code 写在 frontmatter,Codex 写在旁边的 agents/openai.yaml),两份要手动同步。 |
| call the Skill tool | 技能之间表达依赖的官方写法:明确说"调用 Skill 工具并写出技能名" | 决定一个技能能不能被另一个可靠地带动。别写成相对路径引用或在散文里丢一个 /名字 指望模型领会。 |
| GLOSSARY.md | 存你这个项目"通用语言"的文档(术语、约定)。v1.3.0 起由 CONTEXT.md 改名而来 |
让下一轮对话不必重新解释同一个词。别当交付物——它是缓存,不是成果。若你仓库里还叫 CONTEXT.md,技能现在只认 GLOSSARY.md,要 git mv 过去。 |
| ADR | Architecture Decision Record:记录"为什么这么决定"的短文档 | 防止同一个决定被反复推翻。别把每个改动都写成 ADR——它只装那种"以后有人会问为什么"的决定。 |
| tracer bullet (曳光弹) |
一条贯穿全链路的极小切片:先打通"从输入到输出"的完整路径 | 用来把大活切成能独立验收的小块(/to-tickets 的产出单位)。别把它当成"按层切"(先写完所有数据库再写所有界面)——那正是它要避免的。 |
| blocking edge (阻塞边) |
票据之间的"谁必须先完成"关系 | 让并行和排队有依据。别省掉它——那样票据就退化成一张待办清单。 |
| grilling | 就一个计划不停地追问、直到设计树上每个分支都被解决的访谈原语 | 多个技能的底座。别把它当"AI 在找麻烦"——它替代的是你本来会漏掉的那轮思考。 |
| plugin(插件) | Claude Code 的托管分发包 | 安装路线 A:省心、自动更新、只读。别指望改它——要改就走路线 B。 |
| skills.sh | 把技能文件复制进你仓库的安装器 | 安装路线 B:文件归你、可改、可跨代理。别指望自动更新——升级要你自己敲。 |
12成对示例:同一件事的两种装法
同一个目标——"我要用上这套技能"——两种做法。
动作:先用 Claude Code 插件装一遍,再 npx skills@latest add mattpocock/skills 装一遍,想着"反正多装点不亏"。
结果:
- 每个技能在你机器上两份,斜杠命令列表里同名项重复;
- 模型自动触发时命中哪一份不确定——你改了 A 份,生效的可能是 B 份;
- 升级变成两套机制并行:一套自动(插件)一套手动,你自己也说不清现在跑的是哪版;
- README 对这件事只有一句:installing both leaves you with every skill twice。
动作:先回答一个问题——我要不要改它、要不要跨代理?
- 不要 → 插件:
claude plugins install mattpocock-skills,此后不管理版本。 - 要 → skills.sh:
npx skills@latest add mattpocock/skills,勾选时务必含setup-matt-pocock-skills,之后用npx skills update自己控节奏。
然后:每个仓库跑一次 /setup-matt-pocock-skills,再敲 /ask-matt 确认下一步。
从第一个技能开始逐个读文档、背命令,想着"学全了再用"。
结果:读到一半就放弃;真开始用时还是不知道从哪下手,因为决定成败的是顺序,不是命令表。
挑一个真实的小需求,把 grill-with-docs → to-spec → to-tickets → implement → code-review → retro 走一遍(06 的例子里那个"导出当前筛选"就很合适)。走通之后再回来挑:你会自己发现"我这里缺的是 /handoff"或者"我这个 bug 该用 /diagnosing-bugs"——那时的选择比看清单准得多。
13一页纸:装完到用顺的检查清单
从"装完"到"用顺",这张表按顺序走一遍。
装的时候
| # | 做这件事 | 怎么知道做对了 |
|---|---|---|
| 1 | 只选一条安装路线 | 你清楚自己装的是插件还是文件;没有第二份同名技能 |
| 2 | 确认拿到了 setup-matt-pocock-skills | 斜杠命令列表里能看到它(路线 B 勾选时最容易漏) |
| 3 | 在目标仓库跑一次 /setup-matt-pocock-skills | 它能问出三个问题:跟踪器 / 标签 / 文档位置;跑完后 /to-spec 不再中止 |
| 4 | 敲一次 /ask-matt | 它给出"你这种情况该用哪个"的建议,而不是直接干活 |
用的时候
| # | 做这件事 | 怎么知道做对了 |
|---|---|---|
| 5 | 先判断处境,再选技能 | 不是每次都从头套主流程;说不清要什么才用 /grill-with-docs |
| 6 | 让每一步都留下产物 | 规格在跟踪器里、票据有阻塞边、ADR 记了"为什么" |
| 7 | 换会话前先 /handoff | 新会话能靠那份文档接着干,不用重讲一遍背景 |
| 8 | 看不懂就 /wait-what | 它用你 GLOSSARY.md 里的词汇重讲,而不是再堆一遍术语 |
| 9 | 把用不上的技能删掉 | 留下的都是你真会重复用的那几个 |
记这句:22 个技能要你点火,15 个可被自动取用;装只选一条路,用只跑通一条流程。
99一句话总结
mattpocock/skills 是作者公开的 37 个 Markdown 技能文件(engineering 20 / productivity 7 / misc 4 / in-progress 6):它的定位不是"自动帮你写代码",而是在你最容易偷懒的那一步插一道闸——最值钱的几个干的事是向你提问、把答案落成文档,所以第一个感受常是"变慢了",那是设计意图。整套设计只有一条分界线:谁能启动它——你敲着用的 22 个是用户可启动(模型碰不到,连别的技能也调不动;描述写给人看,要删掉触发词),任务合适时自动出现的 15 个是模型可启动(描述写给模型看,要保留触发措辞);用户可启动的可以调用模型可启动的,反过来不行。安装有两条互斥路线:Claude Code 插件(只读、自动更新、给 27 个技能)或 skills.sh(文件归你、手动升级、能拿到 misc 与 in-progress 那 10 个)——README 的原话是两条都装等于每个技能两份。装完每个仓库都要跑一次 /setup-matt-pocock-skills,否则 /to-spec、/to-tickets、/triage、/code-review 会停下来。典型用法是先跑通一条 grill-with-docs → to-spec → to-tickets → implement → code-review → retro 的主流程(每一步都留下下游能用的产物),再按处境补 /triage、/wayfinder、/handoff、/wait-what;不确定就用路由器 /ask-matt。最后两条实话:三个数字别记混(仓库 37 / README 收录 27 / 插件给 27),以及 improve-codebase-architecture 是勘察报告不是救援队——它找真问题,但不替你解泥。
98参考来源与证据边界
这是一篇"读别人仓库"的文章,所以来源比结论更重要。本文所有事实性陈述都来自下面这些文件,我没有凭记忆写任何一个技能的行为。
一手来源(全部逐字读取)
- 仓库 README(
github.com/mattpocock/skills的README.md)—— 定位原话(real engineering - not vibe coding)、对 BMAD / Spec-Kit 的取舍评价(take away your control…)、三步安装、两条路线的哲学差异(Pick one: installing both leaves you with every skill twice.)、以及 Reference 段里 27 个技能的官方描述(本文 05 的 engineering 与 productivity 两表逐字取自这里)。 - 各技能的
SKILL.md元数据(skills/<桶>/<名字>/SKILL.md)—— 仓库里技能文件的总数与分桶(37 = 20 + 7 + 4 + 6),以及 05 第三张表里 misc 4 个与 in-progress 6 个的官方描述(这 10 个不在 README 的 Reference 段里,只能从各自元数据取)。 .agents/invocation.md—— 用户可启动 / 模型可启动的判定与两条元数据写法(disable-model-invocation与policy.allow_implicit_invocation)、"描述写给人看还是写给模型看"、a user-invoked skill can never be reached this way, full stop、"用户可启动可调用模型可启动、反之不行"、以及"依赖要点名 Skill 工具而不是写相对路径"。CHANGELOG.md—— 版本锚点:本文校对时最新版是 v1.3.1(2026-10-04)。v1.3.0 是这次刷新改动最大的一版:implement-spec、pr、retro三个技能毕业进 engineering 与插件,resolving-merge-conflicts被删除,CONTEXT.md/CONTEXT-MAP.md整体改名成GLOSSARY.md/GLOSSARY-MAP.md。v1.2.3 里有一个补丁正好能说明本文的一个判断——它给diagnosing-bugs加了 Redact(脱敏)一节,要求 agent 展示命令与输出时先做脱敏、用环境变量承载凭据、只引用带信号的几行。.agents/adr/0002-ship-as-a-claude-code-plugin.md(经 README 引用)—— "为什么以 Claude Code 插件形态发布",以及原生 Codex 插件仍在路线图上。
本文自己做的核对
- 技能总数与分桶:不是引用别人的说法,而是把仓库的完整文件树取下来、筛出
skills/**/SKILL.md逐个计数(37 个:engineering 20、productivity 7、misc 4、in-progress 6),再与 README Reference 段的条目数(27)对照,差额正好是那 10 个未公开技能。 - 那 10 个技能的描述:逐个抓取各自
SKILL.md的 frontmatter,并记录它们的类型(6 个 in-progress 全部带disable-model-invocation: true,即用户可启动;4 个 misc 都没有,即模型可启动)。这次刷新还把全部 37 个SKILL.md的 frontmatter 过了一遍,逐个确认人可启动 22 个、模型可启动 15 个。
证据边界与时效
- 版本口径。本文校对于 mattpocock/skills @ v1.3.1 · https://github.com/mattpocock/skills。仓库在持续演进(
in-progress桶的存在本身就说明这一点),技能名与行为都可能变——这也是本文把learn:shelf-life标为evolving的原因。 - 没有做的事。我没有实际安装并逐个跑这些技能;没有验证两条安装路线在各代理上的具体落盘路径;没有评估每个技能的实际效果好坏;也没有覆盖仓库里的
docs/站点内容与那些 ADR 全文。 - 一处口径提醒。"37 / 27 / 10"这三个数字反映的是本文校对时刻的仓库状态。仓库还在长,你读到的可能已经不是这个数——以你实际 clone 下来的文件树为准。