Skip to content

快速开始

你需要什么

  • Node.js 22 或更高版本
  • 一个有 git 历史的仓库 —— 改动频率就来自这里
  • 一个 TypeScript 代码库(monorepo 或单包都可以)

浅克隆下无法工作

git clone --depth 1,或大多数 CI 的默认设置,历史会被截断,改动频率、hotspot 和耦合就全都是错的。dowsing 会检测并警告,但它打印的数字不可信。在 CI 中请设置 fetch-depth: 0

跑起来

无需安装。

bash
npx dowsing 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/customer-web — 无依赖却一起改动了 91 次

完整结果同时写入 .dowsing/dowsing.json

为什么要打印排除了什么

每次运行都会声明剔除了合并提交、bot 提交和纯格式化提交。悄悄排除会让你把输出读成「全部分析过了」——而一个你看不出范围的数字,是无法据以行动的。

深入排查

它们为什么会一起改动?

出现隐藏耦合时,去看背后到底是什么。

bash
npx dowsing why @acme/admin-web @acme/customer-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 给两个 Web 应用都加上会话过期后的重新登录引导 [A:3 B:6 files]

两边有同名文件,同样的修改被手工复制。这是抽取到共享包的候选。

那个改动频率是真的吗?

bash
npx dowsing analyze --verify-churn

它比对 AST,把真实修改与重命名、格式化区分开。

🔍 Churn 验证(AST 比对,前 20 个文件):
  568 个版本中有 513 个是实质修改(55 个虚假:重命名 12 / 仅格式化 35 / 内容未变 8)
  ⚠ customer-detail-panel.tsx: 42% 的 churn 并未改变语义

它需要对每个版本执行 git show,因此是可选项,且只针对前 N 个文件。

这个文件为什么复杂?

bash
npx dowsing health --file src/foo.ts
  health: 4.9 / 10  (仅按代码行数的基线: 10.0)
  从 10.0 起的扣分:
    -3.00 认知复杂度过高 (50 > 阈值 15, severity 1.00)
         → validateConfig (cognitive=50, L3)
    -2.13 复杂函数 (27 > 阈值 10, severity 0.85)
         → validateConfig (cyclomatic=27, L3)

LoC 基线是 10.0,health 却是 4.9——一个短小但密集的文件。只数行数的指标会完全错过它。

知识集中在哪里?

bash
npx dowsing knowledge

按包给出 bus factor,以及主要开发者离开后会有多少文件无人负责。

从代理中使用

没有需要注册的东西。代理本来就能执行 CLI,而接口只有一条命令。

bash
npx dowsing --help

再装上可选的 Agent Skill,代理就知道什么时候该用它,以及怎么读这些数字:

bash
gh skill install yhay81/dowsing dowsing --agent claude-code --scope user

之后就可以在会话中直接问「这个仓库接下来该重构哪里?」,得到基于分析结果的回答。参见编码代理集成

确认重构是否奏效

bash
npx dowsing diff origin/main

它会在两个版本上重新测量每个变更文件,报告复杂度实际的变化。

📉 复杂度实测(base → head):
  cognitive -41 / cyclomatic -22 / LoC -111

谁改的都无所谓——你自己、代理,或者 CI 里的 PR。参见实测改善效果

接下来

基于 MIT 许可发布