ub-mode:把 Clean Code 纪律装进 Coding Agent

Coding Agent 写得快,难测、重复、越改越糊的代码也跟着来。开源 Skill ub-mode(GitHub:unclebob/ub-mode)把一套精简的工程纪律塞进 Agent:先让它工作,再把它做对,日常再守几条实践;并配上 CRAP、重复度、变异测试等确定性门禁工具。本文按仓库 README 与 SKILL.md 整理成概论,装法是复制 SKILL.md;配套工具本站未实测。
说明:原则条文来自 unclebob/ub-mode 的 SKILL.md;配套仓库与阈值(CRAP < 10、重复相似度 ≥ 0.8)来自 README。本站未安装或运行 crapper、dryer、mutator、uml-viewer,凡工具行为均标「未实测」。
它管什么
README 写明:ub-mode 是一份在写代码或改代码时强制遵守的工程原则 Skill,思路部分参考了社区里的 poteto-mode / pstack 规则集,再压短,并配上确定性质量门禁。每次改动都按同一顺序:
- First Make it Work — 先让行为正确、范围最小。
- Then Make it Right — 再压复杂度、去重复、补测试死角。
- Practice — 记日志、护上下文、收拾 worktree、小步提交。
装好 Skill 之后,在会话里调用 /ub-mode,或直接要求按这套精简原则改代码。
First Make it Work:先让它过关
SKILL.md 里这一段条目很多,落地时可抓几条高频的:
- Laziness Protocol:一个决策只活在一处;只提交能解决问题的最小编辑。
- Foundational Thinking:先把数据结构想清楚再写逻辑;能帮到后面每一阶段的事先做;并发写者会出事就别共享可变状态。
- TDD:改代码前先写会失败的测试,确认败在预期原因上,再做让它通过的最小改动;写不出诚实测试就别硬写烂测试。
- Redesign From First Principles:别把新需求焊在旧设计上;问「一开始就有这个需求会怎么建」,想清楚后分片交付。
- Subtract Before You Add:先减复杂度,再谈加东西。
- Attack the Premise:两个修法共一个前提、又撞上同一道门禁时,先把那句前提写下来,数清谁在维持失衡,撤掉错误指派,再开下一刀。
- Architecture 摘录:用结构让非法状态写不出来;数据在入口校验、内部信任、业务逻辑尽量纯函数;非法值类型上不可写;操作尽量幂等;共享可变状态能拆就拆,不能拆就只留一个写者并在结构里强制。
整段还有 Outcome-Oriented Execution、Build the Lever(先手做一单位,再做工具复刻)等条目,完整列表以仓库 SKILL.md 为准。
先交能验证的最小行为,再谈「优雅」。门禁不过,重构只是换一种糊法。
Then Make it Right:用工具把门
行为对了之后,Skill 要求修根因(复现 → 改因,藏崩溃的守卫不算修)、把工作切成可验证的小单元、测行为不测实现(若每个函数都返回空测试仍能过,就扔掉)。然后挂上配套工具(均未实测):
| 工具 | 仓库 | 门禁(README) |
|---|---|---|
| crapper | unclebob/crapper | 按函数算圈复杂度、覆盖率与 CRAP;目标每函数 CRAP < 10(拆函数、补测或两者) |
| dryer | unclebob/dryer | 抓结构重复;相似度 ≥ 0.8 的块要消掉 |
| mutator | unclebob/mutator | 变异测试:覆盖未覆盖、杀掉存活变异体、删死代码 |
| uml-viewer | unclebob/uml-viewer | 可视化组件、覆盖率、CRAP、变异分、依赖方向 |
Refactoring 的顺序写得很死:先钉住行为 → 改结构 → 证明行为没变。行为还没钉住就「大重构」,后面只能靠运气回归。
Practice:别把现场搞乱
- Keep a Log:记下每步动作和理由,结束时汇报。
- Guard the Context Window:主线程保持小;大块外送,只留摘要。
- Worktree Cleanup:确认安全可删再回收磁盘;未提交改动等你拍板。
- Commit and Push:小步、有序提交;每条写清为什么、改了什么、怎么证明;最后推主干。
怎么装
README 的安装方式很直接:把仓库里的 SKILL.md 复制到你所用 Agent 的 skills 目录,路径示例:
~/.grok/skills/ub-mode/SKILL.md
~/.claude/skills/ub-mode/SKILL.md
~/.cursor/skills/ub-mode/SKILL.md
然后在会话里调用 /ub-mode。配套工具需各自克隆/安装对应仓库后再在「做对」阶段使用;本站未跑通安装与阈值,接入前请对照各工具自己的 README。
常见坑
- 只贴原则、不挂门禁。没有 CRAP / 重复 / 变异这类硬指标,Agent 很容易「口头重构、数字不动」。
- 跳过「先工作」直接大重构。行为未钉死就改结构,回归只能靠运气。
- 写假测试凑覆盖率。Skill 明确:测用户能看见的结果;测实现细节或永远绿的测试要扔掉。
- 主会话塞满日志和大段 diff。Practice 要求主线程瘦身,细节外送,否则后面几步开始忘前提。
完成标准
- 能按 Work → Right → Practice 三段给 Agent 下指令,而不是一次性「帮我重构」。
- 说得出 CRAP < 10、重复 ≥ 0.8、变异测试各自卡什么(数字以 README 为准;工具未实测)。
SKILL.md已放进至少一个 Agent 的 skills 目录,并能触发/ub-mode。- 知道配套四个工具要另装,且本概论未代替实测。
最后
把 Clean Code 纪律写进 Skill,是想让 Agent 的「快」还能被验证。先装 ub-mode 管流程,再按需接入 crapper / dryer / mutator。还在给团队定 Agent 协作规矩的话,可对照站内 编程 Agent 团队实践 一起看。