src/graph — 圖層

GraphTraverser(BFS/DFS、影響半徑、路徑)+ GraphQueryManager(高階查詢)
檔案:src/graph/ · callers/callees/impact/path 的引擎

大方向

圖層把 SQLite 裡的 nodes/edges 變成「可以問的圖」:GraphQueryManager 做高階查詢(誰呼叫誰、影響誰),GraphTraverser 做底層遍歷(BFS/DFS、遞迴、路徑、型別階層)。MCP 的 codegraph_callers/callees/impact 與 CLI 同名指令、buildContext 的 blast-radius 摘要,全都是在這層上面。


1. GraphTraverser

traverseBFS / traverseDFS src/graph/traversal.ts廣度 / 深度優先遍歷——callers/callees/impact 的基礎。

traverseBFS 從起點沿呼叫邊擴散,適合找「最近 / 依深度分層」的依賴;traverseDFS(含 dfsRecursive)深入單一路徑,適合找 call graph 的完整展開。兩者都支援方向(inbound callers / outbound callees)與深度上限。

getCallers / getCallees src/graph/traversal.ts誰呼叫它 / 它呼叫誰(可遞迴、可含型別階層)。

getCallers(id) 沿 inbound 邊收集呼叫者;getCallersRecursive 追到傳遞閉包。注意這裡有 getCallGraph——把某個符號的呼叫圖整棵拉出來。這是「impact 分析」的圖論基礎。

getImpactRadius / getImpactRecursive src/graph/traversal.ts改一個符號,會炸到誰——blast radius 的實作。

getImpactRadius(id, depth) 以受限深度沿依賴方向展開,回傳受影響符號集合——就是 codegraph impact 與 explore 的 blast-radius 摘要。實測:改 GraphTraverser(depth 1)有 39 個受影響符號(見下)。

getTypeHierarchy / findPath src/graph/traversal.ts型別階層 / 兩符號之間的最短路徑。

getTypeHierarchy(含 getTypeAncestors/getTypeDescendants)沿 implements/extends 邊建型別樹;findPath 找 A→Z 的呼叫路徑——explore 回傳「相關符號之間的呼叫路徑」就是它。dynamic-dispatch 合成邊也參與路徑,所以 grep 追不到的那種跳躍在這裡看得到。

2. GraphQueryManager

GraphQueryManager src/graph/高階查詢:組合 traversal + FTS + 排序,供 explore/buildContext 使用。

把 traverser 的底層操作組合成「一個任務需要的相關符號集合」:依關鍵字/檔案/符號名找候選 → 用 call-edge 排序 → 帶出原始碼。explore 的「found 35 symbols across 2 files + blast radius + relationships」輸出就是這層的成果。

3. 本站實測對照

codegraph impact GraphTraverser --depth 1
Impact of changing "GraphTraverser" — 39 affected symbols:
src/graph/traversal.ts
  class       GraphTraverser:34
  method      traverseBFS:48
  method      traverseDFS:154
  method      getCallers:261
  method      getCallees:319
  method      getImpactRadius:520
  method      findPath:617
  ...(共 39 個受影響符號)
看完這頁你應該能說出:traverser 與 query manager 的分工、BFS vs DFS 的適用情境、getImpactRadius 如何變成 blast-radius 摘要、findPath 對 explore「呼叫路徑」的意義。