快速开始
你需要什么
- Node.js 22 或更高版本
- 一个有 git 历史的仓库 —— 改动频率就来自这里
- 一个 TypeScript 代码库(monorepo 或单包都可以)
浅克隆下无法工作
用 git clone --depth 1,或大多数 CI 的默认设置,历史会被截断,改动频率、hotspot 和耦合就全都是错的。dowse 会检测并警告,但它打印的数字不可信。在 CI 中请设置 fetch-depth: 0。
跑起来
无需安装。
bash
npx dowse analyze几秒之内你会得到这样的输出——2,238 个文件、3,920 个提交的 monorepo 约需 7 秒。
Discovering workspace... 40 packages (pnpm)
Reading git history (since 12 months ago)... 3920 commits
excluded: 6 merge, 0 bot, 1 format-only, 0 ignore-revs
Parsing AST (oxc)... 2238 files
Building package graph... 40 packages, 168 edges
Computing change coupling... 500 file pairs, 25 package pairs (1 hidden)
⚠ Top hotspots (complexity=loc):
┌───┬─────────────────────────────┬───────┬────────┬────────┬─────────┐
│ # │ file │ score │ freq │ cx │ commits │
├───┼─────────────────────────────┼───────┼────────┼────────┼─────────┤
│ 1 │ services/api/src/runtime.ts │ 0.999 │ 100pct │ 100pct │ 255 │
└───┴─────────────────────────────┴───────┴────────┴────────┴─────────┘
📌 Top findings (where to look first):
🔥 services/api/src/runtime.ts — 改动频繁且复杂(255 commits, 857 LoC)
🔗 @acme/admin-web ↔ @acme/doctor-web — 无依赖却一起改动了 91 次完整结果同时写入 .dowse/dowse.json。
为什么要打印排除了什么
每次运行都会声明剔除了合并提交、bot 提交和纯格式化提交。悄悄排除会让你把输出读成「全部分析过了」——而一个你看不出范围的数字,是无法据以行动的。
深入排查
它们为什么会一起改动?
出现隐藏耦合时,去看背后到底是什么。
bash
npx dowse why @acme/admin-web @acme/doctor-web■ 最常一起改动的文件对
src/lib/server-api.ts ↔ src/lib/server-api.ts 13
src/app/(authed)/page.tsx ↔ src/app/(authed)/page.tsx 15
■ 代表性提交(从新到旧)
c23db79c 2026-07-09 给三个界面都加上会话过期后的重新登录引导 [A:3 B:6 files]两边有同名文件,同样的修改被手工复制。这是抽取到共享包的候选。
那个改动频率是真的吗?
bash
npx dowse analyze --verify-churn它比对 AST,把真实修改与重命名、格式化区分开。
🔍 Churn 验证(AST 比对,前 20 个文件):
568 个版本中有 513 个是实质修改(55 个虚假:重命名 12 / 仅格式化 35 / 内容未变 8)
⚠ doctor-call-panel.tsx: 42% 的 churn 并未改变语义它需要对每个版本执行 git show,因此是可选项,且只针对前 N 个文件。
这个文件为什么复杂?
bash
npx dowse health --file src/foo.ts health: 4.9 / 10 (仅按代码行数的基线: 10.0)
从 10.0 起的扣分:
-3.00 认知复杂度过高 (50 > 阈值 15, severity 1.00)
→ validateEnvironmentConfig (cognitive=50, L3)
-2.13 复杂函数 (27 > 阈值 10, severity 0.85)
→ validateEnvironmentConfig (cyclomatic=27, L3)LoC 基线是 10.0,health 却是 4.9——一个短小但密集的文件。只数行数的指标会完全错过它。
知识集中在哪里?
bash
npx dowse knowledge按包给出 bus factor,以及主要开发者离开后会有多少文件无人负责。
从代理中使用
如果你用 Claude Code,把它接成 MCP 服务器是最实用的方式。
bash
claude mcp add dowse -- npx -y dowse mcp之后就可以在会话中直接问「这个仓库接下来该重构哪里?」,得到基于分析结果的回答。参见编码代理集成。
让它动手修
bash
npx dowse fix它把排名第一的 hotspot 交给代理,用你的类型检查与测试验证结果,并报告复杂度移动了多少。默认是空跑——修改一定会被丢弃。
packages/cli/src/analyze.ts
cognitive -41 / cyclomatic -22 / LoC -111
已验证: typecheck ✓ / tests ✓加上 --apply 才会保留。参见闭环修复。