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 在測試期間是關閉的,關閉時不會注入任何東西。
重跑的流程:
- 一次只安裝一個 mod,並確認它通過
claude plugin validate。 - 用 haiku 以無頭的
claude -p執行同一個唯讀任務,每個設定重複 3 次,取耗時和輸出 token 的中位數。 - 只引用耗時和輸出 token 的差值。USD 成本會因各設定的快取順序而不同,所以忽略它。
- 要量啟動成本,就把每個 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。
來源
- Customize Claude Code with mods,Anthropic 部落格。為什麼要讀:官方定義,以及 Anthropic 親口說的無沙箱警告。
- Mods overview,文件。為什麼要讀:mod 與 hook 的比較、各介面支援表和關閉開關。
- Mods reference,文件。為什麼要讀:完整事件清單和文件記載的限制。
- Getting started with Claude Code mods,claude.dev(Addy Osmani)。為什麼要讀:最好的實作教學,附上其他來源沒提到的陷阱。
- Mods issue #91870,GitHub。為什麼要讀:關於隔離、fail closed 行為和歷史外洩的現場回報。
- Manage mods for your organization,文件。為什麼要讀:validate 稽核,以及每項安全控制的限制。
- React to events with a mod,文件。為什麼要讀:middleware 鏈的順序和預設的 fail open。
- The Guard I Installed Was Enabled, Running, and Doing Nothing,部落格。為什麼要讀:唯一的遷移現場報告,從 27 個 shell hook 到 5 個 mod。
- awesome-claude-code-mods,GitHub。為什麼要讀:生態系規模,以及現成的稽核方法。
- next-steps plugin source,GitHub。為什麼要讀:旗艦 mod 的真實機制,包括逐回合的分叉。
- ClaudeDevs release tweet,X。為什麼要讀:發布公告及其觸及規模。
- Avid's session-log mining workflow,X。為什麼要讀:在安裝任何東西之前,決定該做或該裝什麼的方法。
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。
AIDive