src/graph/ · callers/callees/impact/path 的引擎圖層把 SQLite 裡的 nodes/edges 變成「可以問的圖」:GraphQueryManager 做高階查詢(誰呼叫誰、影響誰),GraphTraverser 做底層遍歷(BFS/DFS、遞迴、路徑、型別階層)。MCP 的 codegraph_callers/callees/impact 與 CLI 同名指令、buildContext 的 blast-radius 摘要,全都是在這層上面。
traverseBFS 從起點沿呼叫邊擴散,適合找「最近 / 依深度分層」的依賴;traverseDFS(含 dfsRecursive)深入單一路徑,適合找 call graph 的完整展開。兩者都支援方向(inbound callers / outbound callees)與深度上限。
getCallers(id) 沿 inbound 邊收集呼叫者;getCallersRecursive 追到傳遞閉包。注意這裡有 getCallGraph——把某個符號的呼叫圖整棵拉出來。這是「impact 分析」的圖論基礎。
getImpactRadius(id, depth) 以受限深度沿依賴方向展開,回傳受影響符號集合——就是 codegraph impact 與 explore 的 blast-radius 摘要。實測:改 GraphTraverser(depth 1)有 39 個受影響符號(見下)。
getTypeHierarchy(含 getTypeAncestors/getTypeDescendants)沿 implements/extends 邊建型別樹;findPath 找 A→Z 的呼叫路徑——explore 回傳「相關符號之間的呼叫路徑」就是它。dynamic-dispatch 合成邊也參與路徑,所以 grep 追不到的那種跳躍在這裡看得到。
把 traverser 的底層操作組合成「一個任務需要的相關符號集合」:依關鍵字/檔案/符號名找候選 → 用 call-edge 排序 → 帶出原始碼。explore 的「found 35 symbols across 2 files + blast radius + relationships」輸出就是這層的成果。
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 個受影響符號)