dsh-codegraph:把 CodeGraph 索引裝進 DSH 會話的插件

前言

讓智能體讀懂一個陌生代碼庫,常見做法是 grep 關鍵詞、glob 找文件、再逐個 read——一輪下來工具調用十幾次,上下文塞滿文件片段,還不一定命中真正的調用鏈。

CodeGraph(@colbymchenry/codegraph)的思路不同:先把項目索引成代碼知識圖譜,之後按符號、按區域、按調用鏈查詢,一次調用就能拿到相關符號的逐行源碼和調用路徑。問題是,CLI 工具模型自己調不到,得有人把它包裝成模型可見的原生工具。

本文介紹的 dsh-codegraph 就是做這件事的 DSH 插件。

這是什麼

jiangzhenguo/dsh-codegraph 是一個可一鍵安裝的 DSH 插件(bundle),把 codegraph CLI 包裝成 13 個 codegraph_* 原生工具,讓 DSH 會話直接查詢預索引代碼知識圖譜,並支持自舉和維護索引(init/index/sync)。當前版本 1.1.0,許可證 MIT。

提供的工具

13 個工具與 codegraph CLI 命令一一對應,工具名與 CodeGraph 官方 MCP 工具同名:

工具 對應 CLI 用途
codegraph_status status --json 索引狀態(是否已初始化、文件/節點/邊數、待同步變更等)
codegraph_init init 初始化項目並建立初始索引(.codegraph/
codegraph_index index 全量(重)索引
codegraph_sync sync 增量同步索引
codegraph_uninit uninit -f 刪除項目索引
codegraph_query query --json 按名稱/子串搜索符號,返回結構化 JSON
codegraph_node node 單個符號源碼 + 調用/被調用軌跡
codegraph_explore explore 自然語言探索一塊代碼區域,返回相關文件源碼與調用路徑
codegraph_files files --json 索引內的項目文件結構
codegraph_callers callers --json 誰調用了某個符號
codegraph_callees callees --json 某個符號調用了什麼
codegraph_impact impact --json 改動某個符號會波及哪些代碼
codegraph_affected affected --json 改動若干源文件後應運行哪些測試文件

默認只註冊 4 個核心工具:codegraph_status / codegraph_init / codegraph_sync / codegraph_explore。這個裁剪借鑑了上游項目的實測結論——codegraph_explore 是唯一穩定贏得模型調用的工具,官方 MCP server 默認也只暴露 explore。工具列表精簡,引導才集中。需要全部 13 個工具時,配置 surface: 'full'

裝上即生效的提示詞引導

只把工具放出來還不夠,模型可能仍走 grep 反射路徑。插件會在系統提示詞注入一條高優先級指引(tool:codegraphorder: 98),而 DSH 內置文件工具的指引集中在 order 100–104read=100、write=101、edit=102、glob=103、grep=104)。指引放在 98,先於它們被模型看到。

指引內容採用上游驗證過的策略:命令式措辭(MUST use codegraph_explore INSTEAD of grep/glob/read)、反模式清單(不要先 grep「找文件」,不要用 grep 複覈 codegraph 結果——它來自完整 AST 解析),以及未索引項目的硬停止規則:不自行初始化時,本會話不再調用 codegraph 工具,索引與否是用戶的決定。

frontload:把上下文先送進當前 turn

提示詞指引仍是軟性的。所以插件實現了 frontload 前置注入——上游實測最有效的採用率手段:

  1. 插件監聽 agent/inbox/inserted 事件,當真實用戶 prompt 進入 agent 的 next-turn 收件箱時做置信度分級門控:含結構性關鍵詞(如「調用 / 重構 / 依賴 / how does / who calls / refactor / trace」)直接觸發;含代碼形態 token(文件名、camelCase、PascalCase、snake_case)則先用 codegraph query 對照索引驗證是真實符號才觸發;其餘 prompt 零開銷靜默跳過。
  2. 觸發後在會話 cwd 向上找最近的 .codegraph/ 索引根,找不到就靜默跳過——插件不擅自 init。
  3. 預跑 codegraph_explore,把結果以 <codegraph_context> 包裹注入當前 turn,上限 12000 字符。模型反射性要 grep/read 的內容已經在上下文裏了。

安全性上有三條保證:所有失敗路徑(無索引、門控未命中、CLI 報錯)都是靜默 no-op,不會弄壞用戶 prompt;注入內容帶標記,不會觸發自身循環;同文 prompt 在 10 分鐘內重複進入收件箱(GUI 重發、step 被拒後重新入隊)只注入一次。可用 frontload: false 整體關閉。

和會話級 MCP server 的區別

codegraph 官方 MCP server 在工作區未建立索引時暴露 0 個工具,並提示模型不要自己索引。本插件始終暴露工具,包括模型自舉和維護索引所需的 init/index/sync,這是它選擇 bundle 形態而非 MCP 的原因。

安裝與啓用

前置要求兩項:已安裝 DSH(本插件爲 DSH bundle,隨 DSH web 應用裝載);codegraph CLI 在 PATH 上且版本 ≥ 1.0:

npm i -g @colbymchenry/codegraph
codegraph --version    # 確認可用(≥ 1.0)

然後在目標 profile(這裏是 web)一條命令安裝:

dsh plugin --profile web add github:jiangzhenguo/dsh-codegraph

這條命令做了什麼:dsh plugin 在 profile 目錄裏跑 pnpm add github:jiangzhenguo/dsh-codegraph;因爲本包的 package.json 聲明瞭 dsh.bundle.patch,DSH 的 plugin 管理器會把它自動加入 profile 的 dsh.profile.bundles 層棧,不需要手動改配置。重啓 DSH 應用後,任意會話裏模型即可看到 codegraph_* 工具(默認 core 面 4 個)。其他 profile 換成 --profile tui 等即可。README 另提到,若已發佈到 npm,可用包名替換命令開頭的 github:

卸載:

dsh plugin --profile web remove dsh-codegraph

配置在組合層(如 cordis.patch.yml 的 insert 行)傳入:

- insert:
    - id: dsh-codegraph
      name: dsh-codegraph
      require: dsh-codegraph
      config:
        guideSearch: true    # 默認 true:注入系統提示指引;false 只註冊工具
        surface: core        # 默認 core(4 個工具);設爲 full 註冊全部 13 個
        frontload: true      # 默認 true:結構化 prompt 自動前置注入

典型用法

  1. 在項目目錄(cwd = 項目根)開一個新的 DSH 會話。
  2. 讓模型先跑 codegraph_status:未初始化則跑 codegraph_init
  3. 之後用 codegraph_explore 查代碼,一次調用返回相關符號源碼 + 調用鏈;surface: 'full' 下還可用 codegraph_query / codegraph_node / codegraph_callers / codegraph_callees / codegraph_impact 做更細的查詢。
  4. 改動代碼後用 codegraph_sync,需要跑測試時用 codegraph_affected(full surface)。

所有工具默認作用於調用方會話的 cwd,也可顯式傳 path 指向其他項目。

插件自帶運行時測試 harness(test/run-plugin-test.mjs,真實 codegraph CLI + 樁 cordis 服務),覆蓋提示詞注入順序、core/full surface 的工具註冊、frontload 的注入與去重等路徑。在裝好插件的 profile 裏運行:

CG_PROFILE_NM=<profile>/node_modules node test/run-plugin-test.mjs

適用場景與注意

適合的項目形態:代碼庫較大、模型頻繁需要按調用鏈理解代碼的 DSH 用戶;重構、改名前想確認波及面,或改動後想確定該跑哪些測試的場景。前提是願意爲項目建立並維護 .codegraph/ 索引。

幾個值得知道的點:

  • 在本機 codegraph@1.0.1 上,callers/callees 返回空數組是 CLI 側的數據/索引特性(該版本調用圖邊未解析到),插件忠實返回 CLI 真實輸出;impact 已能返回真實的受影響節點與邊。
  • 未索引項目時插件不會擅自 init,是否索引由用戶決定,指引裏含對應的硬停止規則。
  • frontload 的所有失敗路徑均爲靜默 no-op,不影響普通 prompt 的處理。

安全提示:插件以當前 dsh 進程的權限運行,安裝前建議檢查其源碼與許可證(本項目爲 MIT),確認可接受再裝入常用 profile。

結尾

dsh-codegraph 把「預索引、按調用鏈查代碼」這條路徑接進了 DSH:默認 4 個核心工具保持工具面精簡,order 98 的提示詞指引和 frontload 前置注入負責讓模型真的用起來,而不是多掛幾個無人問津的工具。

  • 目錄頁:https://www.skillhub.cn/plugins/jiangzhenguo/dsh-codegraph
  • GitHub:https://github.com/jiangzhenguo/dsh-codegraph
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜