概述
v0.9.95 於 2026-10-23 發布。官方定位:「Twenty-one community pull requests. A security pass on install.」——21 個社群 pull request,外加一輪安裝安全強化。主軸有三:
- 安裝安全:skill 安裝的每一次寫入改走隨機名稱的暫存檔,預先埋好的 symlink 不再能導向任意檔案。
- 抽取正確性:Python、Go、C++、Rust 的明確型別別名(type alias,含 Rust
union)抽取為 type node,讓 references 解析到真實宣告;C# 的每個 method overload 各自成節點、依參數數量綁定呼叫。 .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:動手檢查清單
逐項勾選,確認你已完成升級必要的步驟(進度會保存在此瀏覽器)
延伸閱讀
- 官方 v0.9.95 release notes
- 前一課:
v0993-v0994-resolution-and-ingestion-security——引用解析到真實宣告與 ingestion 安全