跳到主內容

Theme / v0.9.103

Graphify

Codebase 知識圖譜

基礎觀念

v0.9.80~v0.9.86:解析正確性攻堅、OpenCode 2 與輸出安全

🟡 中階|v0.9.79 → v0.9.86 的升級重點:跨 Python/TS/C#/Elixir/Julia/Rust 的呼叫解析與型別綁定攻堅、MCP 查詢大幅加速、OpenCode 2 plugin 雙形載入、graph.json 緊湊單行輸出、uninstall --purge 安全防護與 18 個社群 PR。含互動測驗與升級檢查清單。

概述

七個 patch(v0.9.80 ~ v0.9.86,2026-10-07~10-11)延續 v0.9.78 起的兩條主線——解析正確性與輸出確定性——並補上平台整合與安全。各版定位:

版本 一句話
v0.9.80 更多 clone 相同確定性;MCP 查詢加速(shortest_path 最高約 300 倍);graph_stats 回報落後 HEAD
v0.9.81 Python/TS/C#/Elixir/PHP 大批次解析修正;AMBIGUOUS 邊降權防社群誤聚合
v0.9.82 Rust impl 綁定;SVG 清除非法控制字元;Cloud 一次性提示
v0.9.83 C# 泛型 arity、member-chain 呼叫;AST cache 依 grammar 版本命名空間
v0.9.84 PowerShell 進階函式;Python stdlib 遮蔽防護;OpenCode 2 plugin 修復
v0.9.85 Julia/Fortran/Elixir/Scala 擷取修正;graph.html 跳脫 <;watch 鎖競態
v0.9.86 18 個社群 PR;uninstall –purge 安全防護;緊湊單行 graph.json

解析正確性:讓呼叫落在真正的目標上

這批修復的共同句型是「同名不再誤綁」:

  • Python(v0.9.80/81):self.x.m() 與帶註記的區域變數(c: Client、含 Optional/union/字串形式)解析到擁有該方法的類別,歧義時 fail closed;self/cls/super() 可解析到另一個檔案裡的基底方法;巢狀類別身分加上外層限定(Outer.Inner 不再與 Outer2.Inner 撞成一個節點);絕對 import(from werkzeug.wrappers import Request)不再被本地同名模組(wrappers.py)劫持;if TYPE_CHECKING: 下的 import 標記為 type-only,不再形成不可能的 runtime 迴圈。
  • TypeScript(v0.9.81):this.field 的型別可來自 class field 宣告(不只 constructor 注入);receiver 型別同名多檔時解析到呼叫者實際 import 的那個;public 呼叫不再綁到同名 #private 方法。
  • C#(v0.9.81/83/84):外層 namespace 的型別可從巢狀 namespace 解析(innermost-wins);泛型與非泛型同名(Effect vs Effect&lt;T&gt;)以 arity 區分 node id,不再自繼承迴圈;member chain(a.b.C())、element access(xs[i].M())與 constructor body 內的呼叫解析;同名 enum member 不再被裸呼叫綁走;外部型別(List&lt;T&gt;、System.Type)改為單一共用 placeholder——查詢回一個節點、共用檔案經它相連。
  • 跨語言 own-class-chain(v0.9.83):Java/C#/Scala/C++ 的未限定呼叫綁到呼叫者自身的 class chain(自己 → 同檔基底 → 外圍類別),不再是檔案內最後一個同名方法;平手時 fail closed。
  • Elixir / Julia / Rust / Scala(v0.9.85/86):qualified 與 alias 遠端呼叫、keyword-form 定義 body、Julia 的 where 函式與參數型別、Fortran 具名 generic interface(dispatches_to 邊)、Rust 檔內呼叫綁到擁有的 impl、grouped use(use a::{b, c::d})展開為每個名稱一條 import 邊。

確定性與輸出品質

  • 更多可攜 node id(v0.9.80/83/86):manifest key、AST cache 的過時絕對路徑 id、--no-cluster 的 run-only 路徑、未解析 re-export 的 id(改以 repo-relative 路徑雜湊鑄造)都不再洩漏 checkout 路徑或 OS 使用者名;同名不同檔(x.py vs x.html)不再塌縮。
  • MCP 大加速(v0.9.80):traversal view 與 shortest-path 圖每個載入的圖只建一次(鍵於既有 graph cache)——query_graph 約 1.6 倍、shortest_path 最高約 300 倍;兩個快取路徑圖的記憶體成本有 LRU 上限。
  • AMBIGUOUS 邊降權(v0.9.81):低信心模糊邊在社群偵測前先降權(在副本上做、不動真圖),不再把獨立集群熔成一團;GRAPHIFY_AMBIGUOUS_SCALE=1.0 還原舊行為。
  • AST cache 依 grammar 版本命名空間(v0.9.83):目錄加上 …-g&lt;fingerprint&gt; 後綴,同版 graphify 升級 grammar 後不再吃到過時或 ABI 不相容的快取。
  • graph.html 跳脫(v0.9.85):內嵌 JSON 中每個 &lt; 都被跳脫——節點標籤含未閉合 &lt;!-- 接 &lt;script 時再也無法跳出資料區塊讓頁面變白。
  • 緊湊單行 graph.json(v0.9.86):committed 的 graph.json 改為一行緊湊 JSON,重跑 build 產生 +1/-1 diff 而不是大面積空白 churn;文件同時說明 PR 中大 diff 是預期。
  • 查詢介面(v0.9.86):explain 對檔內同名多節點拒絕靜默擇一;lookup exit code 區分 0(有答案)/3(歧義)/4(找不到);輸出被 token budget 截斷時告訴你怎麼拿全文(含 explain --all)。

平台與整合

  • OpenCode 2 plugin(v0.9.84,#3554/#3732):plugin 改為輸出雙形——OpenCode 2 以 default export + setup() 載入、v1 的 server() hook 保留;graphify install 會刷新已安裝的 v1-only 副本,被升級過 v1 plugin 契約的使用者重新看得到圖工具。
  • Windows(v0.9.80/83/85):console script 改用多核心抽取 pool(不再因非檔案 __main__.__file__ 退單核);測試套件在 Windows 通過(_atomic_replace 對唯讀目的檔拒絕而非靜默覆寫);git hook 處理非 ASCII 檔名(core.quotePath=false + C-quote 解碼)。
  • Graphify Cloud 提示(v0.9.82):graphify extract 後在互動終端顯示一次性 Cloud 指引(每專案一次);GRAPHIFY_NO_TIPS 或 GRAPHIFY_NO_CTA 關閉;CI、管線輸出與 AI 助理管線看不到它。
  • graph_stats(v0.9.80):回報圖的 build commit 與是否落後目前 HEAD。
  • skill runbook(v0.9.83):重用前次 build 寫入的掃描選項(排除與 gitignore 旗標),skill 驅動的 update 不再與 CLI rebuild 行為不一致。
  • git 整合(v0.9.86):遵守 git 全域 ignore 檔(core.excludesFile,git 忠實的優先序與 ~/XDG 展開)。

安全修復:uninstall –purge 的防呆(v0.9.86)

“graphify uninstall --purge now refuses to delete the project (or home, or a filesystem root) when GRAPHIFY_OUT is empty or .”

當 GRAPHIFY_OUT 是空字串或 . 時,--purge 的刪除目標會解析成專案根目錄、家目錄甚至檔案系統根——現在直接拒絕,不再默默砍掉工作樹(#4329)。

隨堂測驗

隨堂測驗

升級到 v0.9.86 後重建 graph,committed 的 graph.json 會出現什麼樣的 diff?

💡 想先看個提示?

想想誰在 review 你的 PR——diff 噪音就是 review 成本。

隨堂測驗

GRAPHIFY_OUT 設成空字串時執行 graphify uninstall --purge,v0.9.86 的行為是?

💡 想先看個提示?

destructive 指令要檢查解析後的目標語義。

動手升級檢查清單

升級 v0.9.86:動手檢查清單

逐項勾選,確認你已完成升級必要的步驟(進度會保存在此瀏覽器)

0 / 6

延伸閱讀