@obie:exhale 0.2.0 已发布。新功能:exhale complexity 会让让 Ruby 方法变得更难理解的 PR 检查失败,并告诉你的 agent……
摘要
exhale 0.2.0 为 Ruby gem 新增 exhale complexity 功能,基于认知复杂度算法在 PR 中检测代理式 AI 逐步引入的代码复杂化,并给出可修复提示,而非仅对遗留代码设固定阈值。
查看缓存全文
缓存时间: 2026/10/08 13:05
exhale 0.2.0 发布了。新功能:exhale complexity 会让一个让 Ruby 方法变得更难理解的 PR 直接失败,并告诉你的 agent 应该把哪些行提取出来。它只评判改动本身,不评判历史遗留代码,所以你今天就可以开启它。
gem install exhale https://t.co/mhTtKlSojQ
Exhale Complexity
你的护栏也许足以防止 agent 一次性写出 200 行的方法。但它能阻止 agent 以每次 12 行的方式,慢慢写成同一个大方法吗?
今天早上我发布了 Exhale ruby gem 的新版本,加入了 exhale complexity——一项会在 PR 让某个 Ruby 方法变得更难理解时令其失败的检查。
这个想法来自我观察到的一个现象:agent 倾向于让我们的代码一点点变复杂,而不一定是一下子变复杂。Reviewers 抓不到,因为每一步都很小。Linter 也抓不到。RuboCop 只有在方法超过固定上限时才会报警,而那时损害已经造成了。
Exhale complexity 则直接评判改动本身。它会为每个方法打两次分:你的分支改动之前,以及改动之后。只有当你的分支让方法变得更难理解、且最终分数高于底线时,方法才会失败:
输出会指出有问题的方法、代价最高的几行,以及修复该问题的重构提示。agent 把嵌套分支提取成一个命名方法,分数降下来,PR 转绿。我不需要读 diff 就知道这个方法依然简洁。
本来就很复杂的代码可以通过检查,直到有人让它变得更糟。你可以今天下午就在一个十年历史的 Rails 应用里开启它,无需先做一轮清理。拆分方法也能通过,因为总分不会重复计算。
评分算法基于 G. Ann Campbell 的认知复杂度(Cognitive Complexity),由 SonarSource 于 2017 年发布。它不统计代码中的执行路径数量,而是统计你阅读时被打断的次数,嵌套越深,收费越高。一个很长但自上而下顺畅阅读的方法得分很低,三个嵌套条件则得分很高。我把 Ruby 的规则写成了文档,这样就不需要争论了:&. 免费,@x ||= ... 免费,整个 case 计 1 分,each 和 map 上的 block 按循环计算。
现有的复杂度度量工具大多只追踪方法大小。但研究显示,更重要的数据点是方向:这次改动让方法更难理解了吗?这正是这个关卡要问的问题,也是一位有经验的 reviewer 如果有时间读每个 diff 时会问的问题。
有些代码本来就是故意写得复杂的,比如解析器或状态机。你可以在 Contract 里记录豁免及其理由,附带一个度量无法突破的上限,以此保持诚实。当代码变得简单后,豁免理由就会失效,关卡会强制你删掉它。豁免不应比理由活得更久。
我的 exhale gem 是“不耐烦编程“(Impatient Programming)理念的一部分。在 inhale 阶段,agent 大开大合地铺开代码,直到功能成形。在 exhale 阶段,你把学到的东西压缩、沉淀进已有的代码里。exhale dry 已经能抓出重复代码,exhale complexity 现在则能抓住那一点点累积起来的纠缠。
我是用现在一贯的方式来构建这个功能的。首先是在一个 artifact 里做设计探索,原本基于我想实现 @unclebobmartin 的 CRAP 指标这一诉求。我和 clanker 商定了一种替代方案,它成了最终功能的指导文档。agent 在构建实现的过程中写下了 Contract,完成后,第二个 agent 试图打破这个 Contract,并发现了两个真实的 bug。变异测试关卡杀死了新代码中 340 处刻意注入的破坏,无一幸免。注意:exhale 在 CI 中会对自身运行检查。
试试看:
Release notes: https://github.com/tools4imps/exhale-ruby/releases/tag/v0.2.0
相似文章
@obie:周五夜特刊,透露下周即将揭晓的重大惊喜线索!
tools4imps 发布了 exhale-ruby,一个专为 Rails 打造的代码收缩工具包。它在 Prism/Herb 之上整合了 dryer 和 flay,用于检测 AI 智能体引入的重复代码,并以 `exhale dry` 作为其首个 PR 检查关卡。它会将代码单元标准化,通过稀有指纹 Jaccard 加权算法计算相似度,并将发现的问题标记为「新引入」「发生位移」或「原本就存在」。
@obie:我和 Stephen 在 ZAR 的合作非常紧密,在这篇文章中他深入探讨了我们在学习以呼吸般的节奏使用编码智能体时所发现的基本原理……
exhale-ruby 是一个面向 Rails 的代码收敛工具箱,它能在拉取请求中检测重复代码,并引导编码智能体将重复副本折叠回已有代码中,其内置的 DRY 检查基于 Prism 和 Herb 构建。
@obie: flinch 0.1.0 已发布。当你的 Contract 所覆盖的代码可能被破坏、而没有任何 Contract 测试注意到时,它会让拉取请求失败。当……
flinch 0.1.0 发布:这是一款 Go 开发者工具,当 Contract 所覆盖的代码被破坏而没有任何 Contract 测试捕获到时,它会使拉取请求失败。这是 Impatient Programming 在 exhale 和 qualm 之后推出的第三款工具。
@AYi_AInotes: 在我刚入行那几年, 记得代码库里有一种人是被默默崇拜的, 他能在十几层调用栈里一眼看出 N+1,能在火焰图里指出哪个函数被多调了三次, 今天 Greg Brockman 转的那个 Codex Skill, 第一次让这件事不再是少数人的特权…
A Chinese developer discusses a new Codex Skill called Complexity Optimizer that automatically detects performance issues like O(n²) in codebases, making advanced optimization skills accessible to more developers.
@obie:我为 Elixir 生态系统做出的首次开源贡献!
作者发布了 Covenant——一个 Elixir 开源测试库(Hex 上的 covenant 0.1.0,采用 MIT 许可证),它将用 Markdown/YAML 编写的契约与自动化测试绑定,支持决策记录、按义务计分的变异测试以及面向 AI 智能体的组件重建包。