AIDive

影片資料包

Claude Code mod:附來源的結論、實測數據與週一檢查清單

閱讀約 9 分鐘

TL;DR

  • 十個 mod 裡留三個:collision-guard、model-router 和 auto-handoff。它們在無頭讀取任務上的實測額外開銷都接近零,而且各自解決一個你說得出名字的問題。
  • 刪掉 next-steps。它在每次符合條件的回答之後都會分叉一次 session,在我們的測試中每回合多出 +250 個輸出 token 和 +2850 ms,連不會顯示它建議的介面也照付。
  • 刪掉 cache-keeper(+1589 ms,還要付費的模型 ping)、recording-mode(它只遮蔽畫面顯示,不遮蔽儲存下來的歷史紀錄)和 session-bookmarks(一個書籤卻能呼叫模型、執行程序、寫入檔案)。
  • goal-meter、repo-heatmap 和 flight-recorder 除非你想要那些視覺效果,否則也可以刪。它們幾乎不花成本,但也沒有量到任何好處。
  • 任何 guard mod 預設都是 fail open。沒有 .catch 處理器時,拋出錯誤的 guard 會被略過,指令照常執行。
  • Mod 沒有沙箱。安裝前先讀 claude plugin validate 的輸出。

測量結果說明了什麼

炒作與規模。發布推文在我們於 2026-10-03 截圖時有 4,138,918 次觀看、20,021 個讚和 13,440 個書籤 s11。社群目錄在 873 個候選儲存庫中列出 1018 個 mod,掃描日期為 2026-10-03,對照 Claude Code 2.1.288 s9。

Mod 是掛在某個事件上的函式。它可以在事件之前執行、之後執行、取代事件,或是包住事件 s1。Mod 需要 Claude Code v2.1.287 或更新版本,且預設啟用 s2。

先談安全。Anthropic 自己的說法是:「Mods run with the same access to your machine as Claude Code itself. They aren't sandboxed」 s1。即使你開啟沙箱,mod 啟動的程序仍在沙箱之外執行 s2。就算 Read(.env) 被拒絕,mod 仍能用 $.fs.read 讀取該檔案,或啟動能讀它的程式 s6。在目錄掃描中,409 個 mod 會執行主機程序,167 個會寫入檔案,150 個會連網,28 個在此版本上無法通過驗證 s9。

觸及範圍與宣傳的落差。在我們的靜態稽核中,session-bookmarks 呼叫了 $.model.complete、$.process.run 和 $.fs.write,對一個書籤功能來說,是整組裡觸及範圍最大的。next-steps 的足跡最小:沒有 fs、沒有 process、沒有 env。這次稽核用到的 calls: 和 env reads: 行由 claude plugin validate 印出 s6。

旗艦 mod 有逐回合的成本。next-steps 在 turn.complete 時用 $.model.fork 分叉 session,README 說這個分叉「costs about one short reply」 s10。建議只會畫在終端機裡,其他介面什麼都不顯示 s10。這個分叉沒有可以關閉的選項。在我們的無頭測試中,它多出 +250 個輸出 token 和 +2850 ms,分叉的用量計入 session,而畫面上什麼也沒顯示 s10。

文件記載的上限。每個事件的 hook 執行時間上限為 10 秒,$.fs 讀寫每個檔案上限 4 MiB,$.store 總共 4 MiB 的 JSON s3。

Guard 是 fail open。文件說,沒有 .catch 處理器的 hook 若拋出錯誤、逾時或回傳錯誤形狀,就會被略過,由下一個處理器接手 s7。我們重現了這點:一個會拋出錯誤、沒有 .catch 的 Bash guard,讓 touch ./marker-failopen.txt 建立了檔案。同一個 guard 加上回傳 {deny} 的 .catch 後,就沒有建立檔案。一份現場回報發現某個 guard 已啟用、正在運行,卻什麼也沒做,而 plugin list 仍顯示「enabled」 s8。

2.1.288 上有個未解的 bug:在 await next(e) 之後回傳的 deny 不會中止工具,檔案在 3 次中有 3 次被寫入,而模型卻被告知寫入失敗 s5。

Mod 對比 settings hook。Settings hook 每次呼叫都會產生一個程序。我們量到的啟動時間:true 執行檔 2.2 ms,bash -c 'exit 0' 8.3 ms,python3 -c 'pass' 26.1 ms,node -e '' 43.1 ms。以每週 5,993 次工具呼叫計算,node hook 花掉 258 s。行程內的 mod 完全不用付這筆。文件建議,當你已經有一支用來阻擋、允許或記錄事件的腳本時,就用 settings hook s2。一份遷移報告從 27 個 shell hook 換成 5 個 mod s8。

遮蔽只作用在顯示。recording-mode 改寫的是 ui.render 畫出的內容。~/.claude/history.jsonl 仍保留你輸入時的原始 prompt,一位測試者在 transcript 的 queue-operation 項目裡找到他的 canary 字串 7 次 s5。

Mod 不會執行的地方。無頭的 claude -p 和 Agent SDK 會執行 hook 但不畫任何東西;Desktop 的 WSL session 兩者都不執行 s2。

目錄的信任問題。一位測試者發布了一個 mod,它的按鈕用 $.process.run 啟動程式,並在他的家目錄寫入一個檔案。它和其他 mod 一樣安裝,沒有任何警告 s5。這是自行發布的概念驗證,不是實際發生的攻擊。

實測數據

語料:一套真實環境最近 7 天的資料,85 個 session、4 個專案、882 則使用者 prompt、11,010 個助理回合、5,993 次工具呼叫。基準測試在 Claude Code 2.1.288(macOS)上執行。

設定 耗時 ms Δ耗時 輸出 tok Δ輸出 任務成功
baseline 3980 0 247 0 3/3
next-steps 6830 +2850 497 +250 3/3
cache-keeper 5569 +1589 367 +120 3/3
recording-mode 8240 +4260* 598 +351* 3/3
goal-meter 3722 -258 244 -3 3/3
collision-guard 4565 +585 376 +129* 3/3
repo-heatmap 4119 +139 257 +10 3/3
flight-recorder 3949 -31 261 +14 3/3
model-router 3698 -282 238 -9 3/3
session-bookmarks 4152 +172 235 -12 3/3
auto-handoff 4051 +71 248 +1 3/3

標 * 的列很可能是回答變異。recording-mode 在測試期間是關閉的,關閉時不會注入任何東西。

重跑的流程:

  1. 一次只安裝一個 mod,並確認它通過 claude plugin validate。
  2. 用 haiku 以無頭的 claude -p 執行同一個唯讀任務,每個設定重複 3 次,取耗時和輸出 token 的中位數。
  3. 只引用耗時和輸出 token 的差值。USD 成本會因各設定的快取順序而不同,所以忽略它。
  4. 要量啟動成本,就把每個 hook 本體各啟動 30 次計時,取中位數,再乘以你每週的工具呼叫次數。

週一就做

  • 對每個已安裝的 mod 執行 claude plugin validate,並讀 calls: 和 env reads: 這幾行。
  • 停用任何觸及範圍(程序、寫檔、模型呼叫)大於其工作內容的 mod。
  • 如果你主要在無頭執行、VS Code 面板或 SDK 裡工作,建議永遠不會顯示,就停用 next-steps。
  • 為你依賴的每個 guard mod 加上回傳 { deny: ... } 的 .catch 處理器。
  • 證明每個 guard 都是 fail closed:讓它拋出錯誤,執行一個會建立標記檔的指令,確認該檔案沒有出現。
  • 不要靠遮蔽類 mod 來避免機密進入 ~/.claude/history.jsonl 或 transcript。直接檢查磁碟上的兩者。
  • 如果每週工具呼叫累積的啟動成本很可觀,就把每次呼叫都跑 node 或 python 的 shell hook 換成行程內的 mod,或編譯後的執行檔。
  • 記住關閉開關:在 /plugin 停用單一 mod,單一 session 用 --safe-mode,全域則在 ~/.claude/settings.json 設 "disableAllHooks": true。

延伸閱讀

  • 自己做一個:約 80 行 mod 的實作教學,附上重要的陷阱(模組層級的狀態會在熱重載時重置,所以資料要放在 $.state) s4。
  • 用你自己的歷史來決定該用 mod、hook、skill 還是 settings:一位實踐者建議先從 session 日誌裡挖出反覆出現的問題 s12。
  • 寫 guard 之前先讀完整的事件清單和限制 s3。
  • 組織層級的管理不在這裡討論。對個人開發者只有一點:當機器有受管理的設定,或你以 Team 或 Enterprise 方案登入時,會載入 sec-default,它不會加入其他限制 s6。
  • 這個設計的由來,包括 2.1.288 修好的 worktree 隔離 bug 和執行階段內部機制,都在公開討論串裡 s5。
  • Anthropic 的範例 mod(token-weather、blast-radius、replay-theater)標示為分享但不提供支援 s2。

來源

FAQ

Mod 有沙箱嗎?

沒有。Anthropic 說 mod 擁有與 Claude Code 本身相同的機器存取權 s1。Mod 啟動的程式也在沙箱之外執行 s2。

我的 guard mod 當掉會怎樣?

沒有 .catch 處理器時,它會被略過,指令照常執行 s7。加上回傳 { deny: ... } 的 .catch,讓它 fail closed。

Mod 會花 token 嗎?

只有在它呼叫模型時才會。我們跑的十個裡,next-steps 和 cache-keeper 量到明顯的成本;其他的在我們的測試中沒有穩健的額外開銷。

怎麼快速關掉 mod?

在 /plugin 停用單一 mod,用 --safe-mode 啟動 session,或在 ~/.claude/settings.json 設 "disableAllHooks": true s2。這些都無法停用內建 mod。

安裝前能先檢查 mod 做了什麼嗎?

可以。claude plugin validate 會列出它的 hook、API 呼叫和讀取的環境變數 s6。