跳到主內容

Theme / v0.9.103

Graphify

Codebase 知識圖譜

基礎觀念

v0.9.94~v0.9.95:21 個社群 PR——YAML 進圖譜與安裝安全

🟡 中階|掌握 Graphify v0.9.95(2026-10-23 發布,21 個社群 PR):skill 安裝寫入改走隨機名稱暫存檔防 symlink 攻擊、.yaml/.yml 結構化抽取進圖譜(Helm、Kubernetes manifests、CI pipelines)、Python/Go/C++/Rust 型別別名抽取為 type node、C# method overload 各自成節點,以及 SSRF multicast 防護等三項安全修復;AST cache schema bump,升級後首次建置重新抽取。含互動測驗與檢查清單。

概述

v0.9.95 於 2026-10-23 發布。官方定位:「Twenty-one community pull requests. A security pass on install.」——21 個社群 pull request,外加一輪安裝安全強化。主軸有三:

  1. 安裝安全:skill 安裝的每一次寫入改走隨機名稱的暫存檔,預先埋好的 symlink 不再能導向任意檔案。
  2. 抽取正確性:Python、Go、C++、Rust 的明確型別別名(type alias,含 Rust union)抽取為 type node,讓 references 解析到真實宣告;C# 的每個 method overload 各自成節點、依參數數量綁定呼叫。
  3. .yaml/.yml 結構化進圖譜:Helm charts、Kubernetes manifests 與 CI pipelines 在 code-only 或 --update 執行中開始貢獻節點。

安裝安全:skill 寫入改走隨機名稱暫存檔

v0.9.95 的第一項修復就是安全修復(#4513,感謝 @Mahdifotohi):skill 安裝的每一次寫入(version stamp、SKILL.md、references)過去用可預測的 *.tmp 名稱,本機攻擊者可以預先在該路徑放置 symlink,把寫入導向(redirect)並覆寫(clobber)任意檔案。

現在每個寫入都先寫進以 mkstemp/mkdtemp 建立、帶 O_EXCL 與受限權限(restrictive mode)的隨機名稱暫存檔;最後的搬移(move)維持原子性(atomic)。

.yaml/.yml 結構化抽取(新功能)

.yaml/.yml 檔過去被當成 documents,不進 AST 抽取。現在它們以檔案節點加 contains 邊連到各 key 的方式被結構化抽取,並分類為 code 而非 documents——與 .json 的處理方式一致(#2214、#4706,感謝 @nothariharan)。Helm charts、Kubernetes manifests 與 CI pipelines 因此在 code-only 或 --update 執行中貢獻節點,而不是什麼都不產生。

設計邊界(原文逐點):

  • 多文件流(--- 分隔)逐文件(per document)走訪。
  • 跳過資料型 YAML:資料陣列(data array)、OpenAPI/Swagger spec、JSON-schema-in-YAML 與扁平資料包(flat data bundle)被跳過,避免資料密集的 YAML 鑄出孤兒節點。
  • 安全解析:使用 safe_load,!!python/... tag 永不執行。
  • 輸出有界:1 MiB、500 pairs、深度 6。

型別別名抽取為 type node

本版的抽取主軸延續 v0.9.93 的方向——「a reference … now resolves to its real declaration instead of minting a sourceless stub」。四個語言的明確型別別名被抽取為 type node:

語言 修正 PR
Python 模組層明確別名(X: TypeAlias = ...、type X = ...、NewType)抽取為 type node,以別名標註型別的 field/parameter 解析到它;隱式指定、區域別名與 re-export 不動 #4578
Go type A = B 別名抽取為 type node(tree-sitter 解析為 type_alias 而非 type_spec);re-export(type Field = pkg.Field)不鑄節點 #4579
C++ namespace 層的 using A = B;/typedef B A; 抽取為 type node;class 內成員別名與同名 re-export 排除 #4580
Rust type 別名與 union item 抽取為 type node(union 的 fields 像 struct 一樣引用其型別);impl 附屬的 type 排除 #4581

C# method overload(#4584、#4591)同批修正:每個 overload 有自己的節點與 source location,不再折疊為一個;呼叫依參數數量(argument count)綁到對應的 overload,涵蓋 in-file、receiver-typed、裸名跨檔、partial-class 與 interface-dispatch 解析;非 overload 的方法 id 不變。

安全修復×3

除安裝暫存檔外,本版還有三項安全修復:

  • SSRF guard 封鎖 multicast 位址(#4708):解析到 multicast 位址(224.0.0.0/4、ff00::/8)的主機被封鎖,補齊既有的 private/reserved/loopback/link-local 檢查。
  • Obsidian 匯出消毒 frontmatter tags(#4709):節點的 file-type 與 confidence 在放進 frontmatter tags 前先消毒,crafted 值無法 breakout 到相鄰 key——與 community tags 既有的消毒方式一致。
  • Google Workspace 捷徑 sidecar 跳脫(#4710):file id 與 url 改以完整 YAML double-quoted-scalar 跳脫(tab、C0/DEL 控制字元與 Unicode 行斷 U+2028/U+2029/U+0085),敵意捷徑檔無法注入 frontmatter key。

圖譜與管線修復

  • 每 repo 一個根(#4524、#4525):合併多 repo 圖上 graphify export tree 給每個 repo 自己的根(以 repo tag 為 key),不同 repo 的同路徑檔案不再混同;未標 tag 的節點不計為 repo。
  • package.json 相依連到引用節點(#4569、#4572):相依的 manifest entry 以 declares 邊連到 import 程式碼解析到的節點,manifest entry 與其 importers 共用一個節點而非各自孤立;entry 改標 name@range。
  • graphify affected <path> 認得消歧標籤(#4698、#4713):被 shared-basename 後綴消歧的檔案節點標籤(例如來自不同目錄的兩個 hooks.py)可以解析,重用 canonical file-label 判定而非裸 basename 比對。
  • extract 不再假認證(#2945、#4707):裸呼叫僅因 caller import 了該符號所在模組而撞到同名符號時,不再被升為 EXTRACTED——邊仍發出以維持連通、但維持 INFERRED;真正的符號 import(from a import _make_id)仍解析 EXTRACTED。
  • raw build 解析一致(#4670、#4676):raw(--no-cluster)build 用與 clustered build 相同的 old-stem alias index 解析 import 端點、解析失敗才鑄 external stub,raw 圖不再把 import 凍結在 clustered 圖已能解析的 stub 上。
  • SQL CREATE TABLE 救回(#4613、#4677):欄位預設值 SQL 文法解析不了(如 MySQL/MariaDB 的 DEFAULT current_timestamp())的資料表改從 ERROR node 救回,資料表與 foreign-key references 仍可解析。
  • Windows 延伸長度路徑(#4542):AST cache 以 Windows extended-length(\\?\)路徑讀寫,超過 260 字元限制的深層 cache 路徑不再以 FileNotFoundError 讓抽取失敗;Windows 之外無影響。
  • binary 媒體不計字數(#4548):圖片或 audio/video 等 binary 媒體檔不再被當文字讀取並計入 corpus 字數;SVG 仍以其 XML 文字身分被計入。
  • 跨 repo Objective-C(#4690、#4691):一 repo 的 header 宣告、另一 repo 的 .m 實作,成員呼叫綁到實作(同 repo split-dir 修復的跨 repo 版);兩個定義同一 selector 的同名類別維持歧義。
  • NS_CLOSED_ENUM(#4705):與 NS_ENUM/NS_OPTIONS 一樣抽取為 enum 含 cases。
  • rebuild hook 根目錄(#3258、#4689):rebuild hook 改從 checkout 頂層執行(取自 git common dir、退回 --show-toplevel),子目錄裡的雜散 graphify-out/ 不再把重建根到錯誤位置並走訪巨大樹。
隨堂測驗

v0.9.95 起下列哪一類 YAML 會被「跳過」、不貢獻節點?

💡 想先看個提示?

官方設計的取捨是:結構化 YAML 進圖譜,資料密集的 YAML 跳過以免鑄出孤兒節點。

動手升級檢查清單

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

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

0 / 6

延伸閱讀

  • 官方 v0.9.95 release notes
  • 前一課:v0993-v0994-resolution-and-ingestion-security——引用解析到真實宣告與 ingestion 安全