背景
大型 monorepo 要做架構重購(例如拆分 billing 模組、引入新 auth middleware)。重購前必須回答:
- 這個改動會影響哪些 community / god node?
- 多個並行 PR 是否會互相衝突?merge 順序?
- 兩個看似無關的 service 在圖譜上暗中耦合嗎?
graphify 的 graph impact 與 --conflicts 比手動 git-inspect 跨檔追蹤更快、更結構化。
適用情境
- 拆分 / 重命名模組
- 引入 cross-cutting middleware(auth、logging、observability)
- 解耦兩個看似獨立的 service
- 大型 framework upgrade(例如 React 17 → 19)
完整流程
步驟 1:建圖 baseline
cd ~/my-monorepo
export ANTHROPIC_API_KEY=sk-ant-...
graphify extract . --mode deep --code-only # AST 為主,可加 docs
💡 大型 monorepo 建議先
--code-only跑 baseline,後續再加補 docs 語意層。
步驟 2:用 communities 確認重購目標
head -100 graphify-out/GRAPH_REPORT.md
找出重購目標:
- 想拆分的 billing community
- 共用過多 god node 的 services(候選解耦目標)
步驟 3:用 path 找暗耦合
graphify path "BillingService" "AuthService"
如果回傳路徑超過 5 跳,且包含多個共用 community,表示兩服務暗中耦合,重購要一併處理。
步驟 4:開 3 個 PR 平行
# PR #1: 拆出 billing module
git checkout -b refactor/extract-billing
# ... edit ...
git commit -m "refactor(billing): extract module"
# PR #2: 新 auth middleware
git checkout -b feat/auth-middleware
# ... edit ...
git commit -m "feat(auth): middleware"
# PR #3: 升級 logger
git checkout -b chore/logger-v2
# ... edit ...
git commit -m "chore: logger v2"
步驟 5:用 prs 分析影響與衝突
# 各 PR 的 graph impact
graphify prs 41 # PR #1
graphify prs 42 # PR #2
graphify prs 43 # PR #3
重點看:
- 哪些 PR 觸動 god node(high graph impact)
- 哪些 PR 觸動共用 community
接著找衝突配對:
graphify prs --conflicts
輸出例:
PR #41 ↔ PR #42 shared community: auth (Community 1)
PR #41 ↔ PR #43 shared community: billing (Community 3)
→ PR #41 與兩個都衝突,merge 順序重要。
步驟 6:用 prs --triage 排 review 優先度
graphify prs --triage
graphify 依 graph impact + CI 狀態 + 規模,告訴 reviewer:
1. #41 (HIGH) billing rewrite — 3 god nodes impacted, CI pending
2. #42 (MED) auth middleware — 1 community overlap with #41
3. #43 (LOW) logger v2 — isolated, CI passing
reviewer 先看 #41,決定 merge 順序:
- merge #43(無衝突)
- merge #42 → rebase #41
- merge #41
步驟 7:每個 merge 後 graphify hook 自動重建
有裝 graphify hook install 的話:
graphify hook install
每次 merge 觸發 AST 重建,後續 prs 結果保持最新。
真實輸出範例
$ graphify prs --conflicts
PR #41 ↔ PR #42 shared community: auth (Community 1)
PR #41 ↔ PR #43 shared community: billing (Community 3)
$ graphify prs 41
PR #41 (extract-billing)
Modified files: 23
Communities impacted: 1 (billing)
God nodes touched: 3 — BillingService, Invoice, Subscription
→ Reviewer should know: touches billing god nodes; may regress checkout flow.
$ graphify prs --triage
Triage ranking:
1. #41 (HIGH) billing rewrite
- 3 god nodes impacted, CI failing
- Suggested: pair with domain owner
2. #42 (MED) auth middleware
3. #43 (LOW) logger v2
對比傳統做法
| 任務 | 傳統(git log + grep) | graphify |
|---|---|---|
| 識別共用 module | 跨檔搜 import | 看 community 重疊 |
| PR 衝突風險 | 看 diff 重疊 | prs --conflicts 一行給答案 |
| Review 優先度 | reviewer 憑感覺 | AI 排序基於 graph impact |
graphify 的 prs --conflicts 是 graph-level 視角,特別能找出跨檔的隱性衝突(兩 PR 改的字串不在同檔,但都在同一個 community / god node)。
失敗處理
| 情境 | 排查 |
|---|---|
prs 回 gh not authenticated |
跑 gh auth login |
prs --triage 沒 AI 排序 |
設 GRAPHIFY_TRIAGE_BACKEND=kimi 或 claude/openai/gemini |
| 衝突結果為空但實際有衝突 | 確認 graph.json 是最新(graphify hook status 確認 hook 跑過) |