brooks-lint
植根于十二本经典工程著作的 AI 代码审查。
一致、可溯源、可落地。
English ·
简体中文 ·
繁體中文 ·
日本語 ·
한국어 ·
Español
快速上手 •
六类衰退风险 •
实际效果 •
基准测试 •
安装
→ 访问官网
---
> *"一个孩子要十月怀胎,无论派多少人去都一样。"*
> —— Frederick Brooks,《人月神话》(1975)
**五十年过去,Brooks 依然正确——McConnell、Fowler、Martin、Hunt & Thomas、Evans、Ousterhout、Winters、Meszaros、Osherove、Feathers 以及 Google 测试团队同样如此。**
大多数代码质量工具只数行数和圈复杂度。**brooks-lint** 更进一步——它对照六个衰退风险维度(综合自十二本经典工程著作)诊断你的代码,每一次都产出带书目出处、严重度标签和具体对策的结构化诊断。
完整的"书目—技能"映射(含例外与误报防护),见
[`skills/_shared/source-coverage.md`](skills/_shared/source-coverage.md)。
## 快速上手
```bash
# Claude Code
/plugin marketplace add hyhmrright/brooks-lint
/plugin install brooks-lint@brooks-lint-marketplace
# 其他任意 Agent Skills 平台 —— Cursor · Codex · Gemini · Copilot · Windsurf · OpenCode · Kiro · …
curl -fsSL https://raw.githubusercontent.com/hyhmrright/brooks-lint/main/scripts/install.sh | bash -s -- <平台>
```
装好后直接开口("审查这个 PR""审计架构"),或运行六个命令之一——`/brooks-review`、`/brooks-audit`、
`/brooks-debt`、`/brooks-test`、`/brooks-health`、`/brooks-sweep`([各自的作用](#斜杠命令))。
每条诊断都以 **症状 → 根源 → 后果 → 对策** 返回,附书目出处和 0–100 健康分。完整安装方式(另外 8 个
平台)和 CI/CD 配置见[下文](#安装)。
## 十二本书
| 书名 | 作者 | 贡献于 |
|------|--------|----------------|
| *The Mythical Man-Month*(人月神话,1975) | Frederick P. Brooks Jr. | R2、R4、R5 |
| *Code Complete*(代码大全,1993,第 2 版 2004) | Steve McConnell | R1、R4 |
| *Refactoring*(重构,1999,第 2 版 2018) | Martin Fowler | R1、R2、R3、R4、R6 |
| *Clean Architecture*(架构整洁之道,2017) | Robert C. Martin | R2、R5 |
| *The Pragmatic Programmer*(程序员修炼之道,1999,20 周年版 2019) | Andrew Hunt & David Thomas | R2、R3、R4、R5、T2、T3 |
| *Domain-Driven Design*(领域驱动设计,2003) | Eric Evans | R1、R3、R6 |
| *A Philosophy of Software Design*(软件设计的哲学,2018) | John Ousterhout | R1、R4 |
| *Software Engineering at Google*(Google 软件工程,2020) | Winters, Manshreck & Wright | R2、R5 |
| *The Art of Unit Testing*(单元测试的艺术,2009,第 3 版 2023) | Roy Osherove | T1、T2、T4、T5 |
| *How Google Tests Software*(Google 测试之道,2012) | Whittaker, Arbon & Carollo | T5、T6 |
| *Working Effectively with Legacy Code*(修改代码的艺术,2004) | Michael Feathers | T4、T5、T6 |
| *xUnit Test Patterns*(xUnit 测试模式,2007) | Gerard Meszaros | T1、T2、T3、T4 |
## 六类衰退风险
brooks-lint 从**六类生产代码衰退风险**和**六类测试代码衰退风险**两个角度评估你的代码,这些维度综合自十二本经典工程著作:
| 衰退风险 | 诊断问题 | 出处 |
|------------|---------------------|---------|
| 🧠 认知过载 | 理解这段代码要花多少脑力? | Code Complete、Refactoring、DDD、Philosophy of SD |
| 🔗 变更扩散 | 改一处会牵连多少不相干的东西? | Refactoring、Clean Architecture、Pragmatic、SE@Google |
| 📋 知识重复 | 同一个决策是否在多处被表达? | Pragmatic、Refactoring、DDD |
| 🌀 偶发复杂度 | 代码是否比问题本身更复杂? | Refactoring、Code Complete、Brooks、Philosophy of SD |
| 🏗️ 依赖失序 | 依赖是否朝一致的方向流动? | Clean Architecture、Brooks、Pragmatic、SE@Google |
| 🗺️ 领域模型失真 | 代码是否忠实地表达了业务领域? | DDD、Refactoring |
> Philosophy of SD = *A Philosophy of Software Design*(Ousterhout) · SE@Google = *Software Engineering at Google*(Winters 等)
## 实际效果
给定这段代码:
```python
class UserService:
def update_profile(self, user_id, name, email, avatar_url):
user = self.db.query(f"SELECT * FROM users WHERE id = {user_id}")
user['email'] = email
...
if user['email'] != email: # 永远为 False —— 隐性 bug
self.smtp.send(...)
points = user['login_count'] * 10 + 500
self.db.execute(f"UPDATE loyalty SET points={points} WHERE user_id={user_id}")
```
brooks-lint 产出:
---
**健康分:28/100**
*这个方法把四个不相干的业务职责塞进同一个函数,含有一个会静默吞掉"邮箱变更通知"的逻辑 bug,并且对 SQL 注入门户大开。*
### 🔴 变更扩散 —— 单个方法因四个不相干的业务原因而改动
**症状:** `update_profile` 在同一个方法体里完成资料字段更新、邮箱变更通知、积分重算和缓存失效。
**根源:** Fowler — *Refactoring* — 发散式变更(Divergent Change);Hunt & Thomas — *The Pragmatic Programmer* — 正交性(Orthogonality)
**后果:** 任何对积分公式的改动都可能破坏邮件通知,反之亦然。每次修改都同时背负着四个不相干领域的回归风险。
**对策:** 抽出 `NotificationService`、`LoyaltyService` 和 `UserCacheInvalidator`。`UserService.update_profile` 应只做编排、逐一调用它们——本身不持有任何实现逻辑。
### 🔴 领域模型失真 —— 隐性逻辑 bug:邮箱通知永不触发
**症状:** `user['email'] = email` 在 `if user['email'] != email` 之前就覆盖了旧值——条件恒为 `False`,通知是死代码。
**根源:** McConnell — *Code Complete* — 第 17 章:非常规控制结构
**后果:** 用户改邮箱时永远收不到通知。这是静默的数据完整性失效——系统看似正常运转,实则违反了业务规则。
**对策:** 在任何修改之前先捕获 `old_email = user['email']`,拿它(而非 `user['email']`)做比较。
*(另有 6 条诊断,含 SQL 注入、依赖失序、魔法数字)*
### 带依赖图的架构审查
在模式 2(架构审查)中,brooks-lint 会在报告顶部生成一张 **Mermaid 依赖图**。模块按严重度着色:红=Critical,黄=Warning,绿=干净。
```mermaid
graph TD
subgraph src/api
AuthController
UserController
end
subgraph src/domain
UserService
OrderService
end
subgraph src/infra
Database
EmailClient
end
AuthController --> UserService
UserController --> UserService
UserController --> OrderService
OrderService --> UserService
OrderService --> EmailClient
UserService --> Database
EmailClient -.->|circular| OrderService
classDef critical fill:#ff6b6b,stroke:#c92a2a,color:#fff
classDef warning fill:#ffd43b,stroke:#e67700
classDef clean fill:#51cf66,stroke:#2b8a3e,color:#fff
class OrderService,EmailClient critical
class AuthController warning
class UserService,UserController,Database clean
```
该图在 GitHub、Notion 等 Markdown 环境中原生渲染——无需额外工具。
## 更多示例
[完整画廊](docs/gallery.md) 收录了 brooks-lint 在 Python、TypeScript、Go、Java 上的真实输出——涵盖 PR 审查、带 Mermaid 依赖图的架构审查、技术债评估和测试质量审查。
初次接触这些衰退风险?[**衰退风险实战指南**](https://hyhmrright.github.io/brooks-lint/guide.html) 逐一讲解全部六类——每类的诊断问题、代表症状、出处书目与对策。
---
## 基准测试
在 3 个真实场景(PR 审查、架构审查、技术债评估)上测试:
| 评估项 | brooks-lint | 仅用 Claude |
|-----------|:-----------:|:------------:|
| 结构化诊断(症状 → 根源 → 后果 → 对策) | ✅ 100% | ❌ 0% |
| 每条诊断带书目出处 | ✅ 100% | ❌ 0% |
| 严重度标签(🔴/🟡/🟢) | ✅ 100% | ❌ 0% |
| 健康分(0–100) | ✅ 100% | ❌ 0% |
| 识别"变更扩散" | ✅ 100% | ✅ 100% |
| **整体通过率** | **94%** | **16%** |
差距不在于 Claude *能不能*发现问题——而在于它能否*每一次都稳定地*发现,并附上可溯源的证据和可落地的对策。
### 可复现基准
上表是示意性的。下面这些数字**确定、可在本地复算**:
**parser 保真度** —— SARIF 输出与 CI 闸门都依赖于正确解析模型的 Markdown 报告。在一个**冻结的 30 份真实模型报告语料**上(覆盖全部六种 mode,`evals/benchmark-corpus.json`),每份都配有**独立评分**的发现清单(由另一遍模型评分、并经人工抽查),实际发布的 parser 跑分如下——执行 `npm run benchmark`:
| 指标(n = 30,冻结语料) | 结果 |
|---|:---:|
| 严重度计数精确吻合(parser vs 人工标注真值) | 30 / 30 |
| 风险码 precision / recall | 100% / 100%(56 个 finding-level 码,0 假阳 / 0 假阴) |
| 产出合法 SARIF 2.1.0 | 30 / 30 |
由于 parser 是确定性的、语料是冻结的,`npm run benchmark` 对任何人都给出相同结果,`npm test` 也将其作为回归守卫。该语料**有意**包含 9 份假阳性 / tradeoff 报告(例如一个*看起来像*循环依赖、实则是端口与适配器的设计),它们必须保持干净。
**打分确定性** —— 给定一组固定发现(2 Critical / 3 Warning / 1 Suggestion),三个 strictness 预设产出的分数与其 `common.md` 表的预测分毫不差:strict **34**、balanced **54**、legacy-friendly **74**——且只有 `legacy-friendly` 会优先列出前三高杠杆修复。
**模型质量** —— 模型能否在真实代码上找到*正确的*风险,由 **57 场景 eval 套件**(`evals/evals.json`)衡量:`npm run evals`(结构校验)与 `npm run evals:live`(实测,需 `ANTHROPIC_API_KEY`)。
> 范围与诚实说明:parser 数字是确定性的、可精确复算;strictness 与 eval 套件的数字是对模型的单次实测,会有轻微跑动差异。parser 基准衡量的是报告解析保真度(工具是否读出了报告里写的每条发现),而非某条发现"是否正确"。严重度计数吻合是完全独立的信号;风险码一致性还反映了 parser 与 grader 共用同一套权威 name→code 映射。
## 横向对比
| | brooks-lint | ESLint / Pylint | GitHub Copilot Review | 原生 Claude |
|---|:---:|:---:|:---:|:---:|
| 检测语法与风格问题 | — | ✅ | ✅ | ~ |
| 结构化诊断链 | ✅ | ❌ | ❌ | ❌ |
| 将诊断溯源到经典著作 | ✅ | ❌ | ❌ | ❌ |
| 一致的严重度标签 | ✅ | ✅ | ~ | ❌ |
| 架构层面的洞察 | ✅ | ❌ | ~ | ~ |
| 领域模型分析 | ✅ | ❌ | ❌ | ~ |
| 零配置、无需安装插件 | ✅ | ❌ | ✅ | ✅ |
| 适用于任何语言 | ✅ | ❌ | ✅ | ✅ |
> `~` = 偶尔 / 不稳定
**brooks-lint 不是要取代你的 linter。** 它捕捉的是 linter 抓不到的东西:架构漂移、知识孤岛、领域模型失真——这些问题往往在无人察觉的几个月里持续拖慢团队。
## 安装
### Claude Code(推荐)
```bash
/plugin marketplace add hyhmrright/brooks-lint
/plugin install brooks-lint@brooks-lint-marketplace
```
短命令(`/brooks-review`)会在首次会话启动时自动安装——也可以自己跑 `bash hooks/session-start`。
不想走市场:`mkdir -p ~/.claude/skills/brooks-lint && cp -r skills/* ~/.claude/skills/brooks-lint/`。
### Gemini CLI · Codex CLI
```bash
/extensions install https://github.com/hyhmrright/brooks-lint # Gemini CLI
```
```
Install the brooks-lint skill from hyhmrright/brooks-lint # 在 Codex 会话中直接说
```
或使用下面的安装器:`./scripts/install.sh gemini` / `./scripts/install.sh codex`。
### 其它所有平台——OpenCode · Cursor · Windsurf · Antigravity · pi · Copilot · Kiro · Factory Droid
brooks-lint 以标准 [Agent Skills](https://agentskills.io) 形式分发。**任何加载 Agent Skills 的 agent
都能无需任何转换运行全部六种模式**——一条命令即可安装:
```bash
# 选择你的平台;加 --project 装进当前仓库而非全局配置
curl -fsSL https://raw.githubusercontent.com/hyhmrright/brooks-lint/main/scripts/install.sh | bash -s -- <平台>
# <平台> = opencode · cursor · windsurf · antigravity · pi · kiro · copilot · droid · gemini · codex · agents
```
安装器会把技能**扁平**拷进该平台对应的文件夹,让共享框架(`../_shared/`)始终正确解析——你不可能装错布局。
装好后直接提问("审查这个 PR"、"审查架构"),对应技能就会依据 `description` 自动触发。
| 平台 | 安装到 | 同时读取 | 指南 |
|---|---|---|---|
| OpenCode | `~/.config/opencode/skills` | `~/.claude/skills`、`AGENTS.md` | [配置](docs/opencode-setup.md) |
| Cursor(2.4+) | `~/.cursor/skills` | `.agents/skills`、`AGENTS.md` | [配置](docs/cursor-setup.md) |
| Windsurf(Cascade) | `~/.codeium/windsurf/skills` | `AGENTS.md` | [配置](docs/windsurf-setup.md) |
| Antigravity(Google) | `.agent/skills`(`--project`) | `AGENTS.md`、`GEMINI.md` | [配置](docs/antigravity-setup.md) |
| pi(earendil-works) | `~/.pi/agent/skills` | — | [配置](docs/pi-setup.md) |
| GitHub Copilot | `.github/skills`(`--project`) | `.claude/skills`、`AGENTS.md` | [配置](docs/copilot-setup.md) |
| Kiro(AWS) | `~/.kiro/skills` | `AGENTS.md` | [配置](docs/kiro-setup.md) |
| Factory Droid | `~/.factory/skills` | `AGENTS.md` | [配置](docs/factory-droid-setup.md) |
Kiro 与 Factory Droid 还会自动注册 `/brooks-review`。不熟悉 skills、或用的是上面没列出的 agent?
见 **[docs/getting-started.md](docs/getting-started.md)**。
> **🧪 验证状态。** Claude Code、Gemini CLI、Codex CLI 已由维护者验证。上面八个平台依据各工具官方技能规范编写,
> 并已在文件布局层面验证(安装器经过测试),但维护者尚未在每个平台端到端实跑。在某平台试过了——无论成功**还是**失败?
> 请[提一个 issue](https://github.com/hyhmrright/brooks-lint/issues/new),附上平台、版本和你看到的结果。
> 用的是其它兼容 Agent Skills 的 agent?它几乎肯定以同样方式工作——告诉我们,我们会补上。
## 斜杠命令
| 命令 | 作用 |
|---------|--------------|
| `/brooks-review` | 粘贴一段 diff,或让 AI 指向改动的文件。以 症状 → 根源 → 后果 → 对策 的格式逐一诊断六类衰退风险。 |
| `/brooks-audit` | 梳理模块依赖(附 Mermaid 依赖图)、识别循环依赖,并检查是否符合康威定律。 |
| `/brooks-debt` | 按六类衰退风险对技术债分类,以 痛感 × 扩散面 打优先级,产出带 Critical / Scheduled / Monitored 分级的偿还路线图。 |
| `/brooks-test` | 对照六类测试空间衰退风险审查测试套件——测试晦涩、测试脆弱、测试重复、Mock 滥用、覆盖率幻觉、架构错配。 |
| `/brooks-health` | 对全部四个质量维度做精简扫描,产出一个加权综合健康分。适合发版前或新团队上手时使用。 |
| `/brooks-sweep` | 一次性扫描 R1–R6、T1–T6 与架构,然后施加修复:安全改动自动应用,跨文件改动需确认,架构决策标记为人工处理项。输出修复日志与健康分变化。 |
**各平台语法。** Claude Code 也接受带命名空间的完整形式 `/brooks-lint:brooks-review`——短命令由
session-start 钩子在首次会话启动时自动安装。Codex CLI 用 `$brooks-review`。Gemini CLI 直接用上表。
OpenCode、Cursor、Antigravity、pi 依据每个技能的 `description` 自动调用 Agent Skills,直接提问即可
("审查这个 PR"、"我们最糟的技术债在哪");需要显式调用时用各平台自己的语法(pi 把每个技能注册为
`/skill:brooks-review`)。在所有平台上,当你讨论代码质量、架构或测试健康时,这些技能也会自动触发。
> PR 审查会自动包含一个轻量的第 7 步快速测试检查(对纯文档 diff 会跳过)。需要完整的测试审查请用
> `/brooks-test`;需要某个维度的深度诊断时,请用该维度的专项技能,而不是 `/brooks-health`。
## 配置
在项目根目录放一个 `.brooks-lint.yaml` 来定制审查行为:
```yaml
version: 1
strictness: balanced # strict | balanced(默认)| legacy-friendly——对遗留代码更宽松的打分
disable:
- T5 # 跳过覆盖率指标检查——我们不强制覆盖率
severity:
R1: suggestion # 在该领域下调"认知过载"诊断的严重度
ignore:
- "**/*.generated.*"
- "**/vendor/**"
# custom_risks: # 定义项目专属 Cx 风险码——见 skills/_shared/custom-risks-guide.md
# suppress: # 按风险码 + 路径下调特定诊断(如已接受的遗留债务)
```
可复制 [`.brooks-lint.example.yaml`](.brooks-lint.example.yaml) 作为起点。
所有设置均为可选——完全省略该文件即使用默认行为。
| 设置 | 说明 |
|---------|-------------|
| `strictness` | 打分预设:`strict`、`balanced`(默认)或 `legacy-friendly`(更轻的扣分,并优先列出高杠杆修复项) |
| `disable` | 要跳过的风险码(`R1`–`R6`、`T1`–`T6`) |
| `severity` | 覆盖严重度等级(`critical` / `warning` / `suggestion`) |
| `ignore` | 要排除的文件 glob 模式 |
| `focus` | 只评估这些风险码(不能与 `disable` 同时使用) |
| `custom_risks` | 定义项目专属风险码(`C1`、`C2`……)——见 [`custom-risks-guide.md`](skills/_shared/custom-risks-guide.md) |
| `suppress` | 按风险码 + 路径下调特定诊断的严重度(可带 `expires:` 过期日期) |
---
## 为什么是这些书,为什么是现在?
> *"软件的复杂性是本质属性,而非偶然属性。"*
> —— Frederick Brooks
AI 能帮你更快地写代码,却无法告诉你正在建造的是大教堂还是焦油坑——而生成越廉价,这些作者识别出的
衰退风险就越尖锐。接入 AI 助手并不能修复认知过载或领域模型失真;生成更多代码会加剧变更扩散和知识重复;
跑得更快让偶发复杂度和依赖失序更加危险。
## 项目结构
每个技能都是一个 `SKILL.md`(触发条件 + 流程骨架)加上它自己的指南:
```
brooks-lint/
├── .claude-plugin/ · .codex-plugin/ # 各平台插件元数据
├── skills/
│ ├── _shared/ # common.md(铁律、配置、报告模板、健康分)
│ │ # source-coverage.md · decay-risks.md(R1–R6)
│ │ # test-decay-risks.md(T1–T6)· remedy-guide.md · custom-risks-guide.md
│ ├── brooks-review/ # 模式 1:PR 审查 → pr-review-guide.md
│ ├── brooks-audit/ # 模式 2:架构审查 → architecture-guide.md、onboarding-guide.md
│ ├── brooks-debt/ # 模式 3:技术债 → debt-guide.md
│ ├── brooks-test/ # 模式 4:测试质量 → test-guide.md
│ ├── brooks-health/ # 模式 5:健康仪表盘 → health-guide.md
│ └── brooks-sweep/ # 模式 6:全面扫描 → sweep-guide.md
├── hooks/ # SessionStart 钩子
├── commands/ # 短命令包装(由钩子自动安装)
├── evals/ # 57 场景评测套件 + 冻结的 parser 保真度语料
└── assets/ # logo、banner、demo
```
## CI/CD 集成
用 GitHub Action 在每个 PR 上自动运行 brooks-lint:
```yaml
# .github/workflows/brooks-lint.yml
name: Brooks-Lint PR Review
on:
pull_request:
types: [opened, synchronize, reopened]
jobs:
brooks-lint:
runs-on: ubuntu-latest
permissions:
pull-requests: write
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: hyhmrright/brooks-lint/.github/actions/brooks-lint@v1.4.3
with:
mode: review
anthropic-api-key: ${{ secrets.ANTHROPIC_API_KEY }}
fail-below: 70
```
完整模板见 [`docs/github-action-example.yml`](docs/github-action-example.yml)。
该 Action 会把审查结果作为 PR 评论发布,并可在健康分跌破阈值时让检查失败。若仓库中提交了 `.brooks-lint-history.json`,评论还会包含趋势变化(如 "85 → 82(−3),近 3 次运行")。
**质量闸门与 Code Scanning。** 除 `fail-below` 外,该 Action 还提供:
```yaml
with:
mode: review
anthropic-api-key: ${{ secrets.ANTHROPIC_API_KEY }}
fail-on: critical # 出现任何 Critical 即失败(none | warning | critical)
fail-on-regression: true # 健康分较上次运行下降则失败
sarif-file: brooks-lint.sarif # 同时把诊断上传到 GitHub Code Scanning
```
`fail-on-regression` 读取 `.brooks-lint-history.json`,因此提交该文件即可强制"无新增回归"。设置 `sarif-file` 会让诊断直接显示在 PR 的 **Files changed** 标签页,并需要 job 具备 `security-events: write` 权限。
**成本:** 每次 PR 运行约 $0.05–0.15,取决于 diff 大小和模型。建议仅在 `pull_request` 事件上运行。
## 路线图
**当前状态(v1.4):** 12 本书地基,6 类生产衰退风险(R1–R6)+ 6 类测试衰退风险(T1–T6),6 个技能,
CI 质量闸门、面向 GitHub Code Scanning 的 SARIF 输出、严格度预设,以及一个可复现的 parser 保真度基准。
里程碑 v0.2 → v1.4
- **v0.2–v0.4**:插件基础设施、六本书框架、衰退风险维度、基准套件
- **v0.5–v0.7**:测试质量审查、Mermaid 依赖图、`.brooks-lint.yaml`、扩展到 10 本书
- **v0.8–v0.9**:独立技能架构;步骤校验、自动 diff 范围、`/brooks-health`、趋势追踪、分诊模式、`--fix` 对策、GitHub Action
- **v1.0–v1.2**:评测自动化、自定义 `Cx` 风险码、全量扫描技能、`npm run bump` 版本传播
- **v1.3**:Codex 市场元数据、多平台一键安装脚本、多语言 README + 落地页
- **v1.4**:SARIF 输出、CI severity + 回归闸门、严格度预设、57 场景 eval 套件、`npm run benchmark`
## 贡献
见 [CONTRIBUTING.md](CONTRIBUTING.md)。现在最有价值的贡献是新的评测用例和更好的衰退风险症状模式。
在你自己的 PR 上跑一遍 `/brooks-review`——我们用正在打造的工具来审查贡献。
## 许可证
MIT License——详见 [LICENSE](LICENSE)。
## 致谢
本项目站在十二位巨人的肩膀上——完整书单与版本见上面的[十二本书](#十二本书)。本工具中编码的衰退风险,
是我们对他们思想的综合,并应用于现代代码质量评估。
---
## Star 历史
[](https://star-history.com/#hyhmrright/brooks-lint&Date)
---
⭐ 如果这个工具让你以不同的眼光看待自己的代码库,请给它点个 star!