{title="📊 页面导航"]

适用角色与上手难度

角色推荐度上手难度
🛠️ 开发★★★★★★★☆☆☆
🧪 测试★★★★☆★★☆☆☆
📦 产品★★☆☆☆★★★☆☆

🎯 学习产出: 掌握双轴代码审查方法,能独立审查分支、PR 和进行中的改动

🚀 AI 能力提升: 代码审查、质量把关

code-review

预计阅读时间: 7 分钟

双轴审查。对 HEAD 与用户给的固定点之间的 diff 做双轴审查:

  • 规范轴(Standards):代码是否符合仓库记录的编码标准?
  • 规格轴(Spec):代码是否忠实实现来源 issue / 规格?

两个轴由并行子 agent 执行(互不污染上下文),然后本技能聚合它们的发现。issue 追踪器应已配置(docs/agents/issue-tracker.md 缺失就提示运行 /setup-matt-pocock-skills)。

日常使用

/code-review            # 然后指定固定点
/code-review main
/code-review HEAD~5
/code-review 审查一下 feature/login 分支

实战

1. 钉住固定点

用户说的固定点(commit SHA、分支名、tag、mainHEAD~5 等),没指定就问。一次捕获 diff 命令:git diff <fixed-point>...HEAD三点,对比 merge-base),并记 git log <fixed-point>..HEAD --oneline 的提交列表。先确认固定点可解析(git rev-parse)且 diff 非空——坏 ref 或空 diff 应在这里失败,而不是在两个并行子 agent 内部。

2. 找规格来源

按顺序:commit message 里的 issue 引用(#123Closes #45、GitLab !67)→ 用户传的路径参数 → docs/specs/.scratch/ 下匹配分支名/功能名的规格文件 → 都没有就问用户规格在哪。用户说没有规格,Spec 子 agent 跳过并报告 "no spec available"。

3. 找规范来源

仓库里任何记录代码怎么写的东西(CODING_STANDARDS.mdCONTRIBUTING.md)。在此基础上,规范轴总是携带坏味道基线——固定的 Fowler 坏味道集(见下),即使仓库什么都没记录也适用。两条约束:仓库标准优先(仓库认可基线会标的东西就压制该味道);永远是判断——每条味道是带标签的启发式("可能的 Feature Envy"),不是硬违规;工具已强制的跳过。

4. 并行派两个子 agent

规范子 agent 提示词:完整 diff 命令 + 提交列表 + 规范来源文件列表 + 完整粘贴坏味道基线(子 agent 没有别的途径访问它)+ 简报:"逐文件/逐 hunk 报告:(a) 每个违反文档化标准的位置:引用标准(文件 + 规则);(b) 你发现的基线味道:命名 + 引用 hunk。区分硬违规与判断——文档化标准违反可以是硬的,基线味道永远是判断,文档化仓库标准覆盖基线。跳过工具强制的。400 词以内。"

规格子 agent 提示词:diff 命令 + 提交列表 + 规格路径或取回的内容 + 简报:"报告:(a) 规格要求但缺失/部分实现的;(b) diff 里没被要求的行为(范围蔓延);(c) 看起来实现了但实现错误的。每条引用规格原文。400 词以内。"规格缺失就跳过并注明。

5. 汇总

## Standards## Spec 标题下原文(或轻度清理后)呈现两份报告。不合并、不重排——两轴刻意分离。结尾一行摘要:每轴发现总数 + 每轴内最严重的问题(如有)。不跨轴挑唯一赢家——那正是分离要防止的重排。

12 种 Fowler 坏味道基线

每条读"它是什么 → 怎么修",对 diff 匹配:

味道是什么怎么修
神秘命名名字看不出用途重命名;想不出诚实名字说明设计浑
重复代码同样逻辑形状出现在多个 hunk/文件提取共享形状,两处都调用
依恋情结方法摸别人的数据比摸自己的多移到它依恋的数据上
数据泥团同一组字段/参数总一起旅行打包成一个类型
基本类型偏执原始类型/字符串充当该有自己类型的领域概念给概念建自己的小类型
重复的 switch同一类型上同样的 switch/if 级联反复出现多态,或两处共享一张 map
霰弹式修改一个逻辑改动被迫散落多文件把一起变的东西收进一个模块
发散式变化一个文件/模块因多种无关原因被编辑拆分,让每个模块为一个原因变
投机性泛化为规格没有的需求加抽象/参数/hook删掉,内联回去直到真实需要
消息链a.b().c().d() 导航在第一个对象上藏一次行走
中间人类/函数主要就是转发砍掉,直连真正目标
拒绝继承子类/实现者忽略或覆盖大部分继承内容放弃继承,用组合

为什么两个轴

一个改动可能过一轴挂一轴:遵守所有标准但实现错了东西 → 规范过、规格挂;完全按 issue 做了但破坏项目约定 → 规格过、规范挂。分开报告,防止一轴掩盖另一轴。

与其它技能的关系

  • 主流程/implement 提交前用它收尾
  • 可单独使用:想审查分支/PR 时直接用
  • 前置setup-matt-pocock-skills 配置的追踪器(找规格用)