一個 Claude Code 外掛程式現在可以攜帶模組(mod):也就是 Claude Code 在其自身程序中執行的 JavaScript 或 TypeScript 程式碼。模組功能隨 v2.1.287 版本在終端機中推出,並預設啟用。Anthropic 的模組概覽列出了模組載入後可以存取的內容。
它能讀寫使用者帳戶有權限存取的任何檔案,啟動程式並發出網路請求。它還可以讀取環境變數和設定檔,包括「您儲存在其中的 API 金鑰」。它能看到您發送的每個提示詞以及 Claude 進行的每個工具呼叫。它甚至可以在「您被要求之前批准工具呼叫」。同一頁面明確指出:「模組未經沙盒化。」
如果您開啟沙盒化功能,沙盒會隔離 Claude 執行的 Bash 指令,「但模組啟動的程序會在沙盒之外執行」。因此,/plugin install some-mod@some-marketplace 現在的意義等同於 npm install:一個陌生人的程式碼將以您的身份在您的機器上執行。我認為這值得您像審查新的依賴項一樣仔細檢視。
Claude Code 的權限頁面詳細說明了模組可以批准的順序。處理 tool.check 事件的模組會在您的權限規則和 PreToolUse 鉤子做出決定之後回應,「並且它的回應可以取代它們的決定」:對於「詢問規則」,模組可以批准該規則原本會提示您確認的呼叫。
對於「被 PreToolUse 鉤子阻擋的呼叫」,模組仍然可以批准,除非該鉤子位於受管設定中。在「自動模式」下,模組批准的呼叫無需分類器檢查即可執行。
對於「拒絕規則」,在具有受管設定的機器上,或當您使用團隊版或企業版方案登入時,拒絕規則預設會優先於模組。然而,「在其他任何情況下,模組都可以批准一個被拒絕規則拒絕的呼叫。」如果您在個人方案或沒有受管設定的 API 金鑰下使用 Claude Code,請務必仔細閱讀最後這句話。
確保拒絕規則最終生效的是一個名為 sec-default 的內建防護機制,管理員文件指出它僅在具有受管設定的機器上或團隊版/企業版登入時載入。即使它已載入,它也只涵蓋 Claude 的工具呼叫,而非模組本身的呼叫:「即使拒絕了 Read(.env) 權限,模組仍然可以使用 $.fs.read 讀取該檔案或啟動執行此操作的程式。」
也應肯定其設計。模組可以重新設計大部分介面,但不能修改權限提示,因此「它無法更改提示顯示的內容」。在您尚未信任的目錄中,模組在您回應信任提示之前不會載入。從 v2.1.292 版開始,需要使用者互動的工具(例如 AskUserQuestion)在模組批准後仍然會顯示提示(請參閱權限頁面)。
早期存取的一個陷阱是:如果您在點檔案中設定 CLAUDE_CODE_ENABLE_FUNCTION_HOOKS=0 以關閉模組,現在已無效。概覽指出 v2.1.287 及更高版本會忽略此設定,「因此將其設為 0 並不能關閉模組。」
外掛程式本來就能執行程式碼,而模組只是將其移至內部。外掛程式從來不只是指令。外掛程式安全頁面開宗明義地說:「您安裝的 Claude Code 外掛程式可以在您的機器上以您的使用者權限執行任意程式碼。」設定鉤子以 shell 指令執行,stdio MCP 伺服器以 Claude Code 啟動的程序執行,而外掛程式的 bin/ 目錄會加入 Bash 工具的 PATH 中。
如果您一直以來在未閱讀外掛程式內容的情況下安裝它們,您就已經將您的帳戶信任給了它們的作者。
模組改變的是程式碼的執行位置。Shell 鉤子在生命週期中的某個點執行並返回。MCP 伺服器等待 Claude 呼叫其工具。而模組則直接載入到 Claude Code 本身。它能即時看到每個提示詞和工具呼叫,並可以重寫它們,可以「如同您輸入一般」提交提示詞,可以根據您的方案呼叫模型,並且其在權限檢查上的回應可以覆蓋您的規則和鉤子,除非受管設定另有規定。
這就是為什麼 npm install 是恰當的比較。當您安裝套件時,npm 會執行套件的 preinstall、install 和 postinstall 腳本,這也是為什麼在添加套件之前先查看它已成為常規的衛生習慣。模組更像是安裝腳本,它在整個會話期間保持載入,位於保存您批准的程式內部。沙盒涵蓋了 Claude 的 Bash 指令,而模組則位於內部,緊鄰著批准印章。
模組確實有一點是 npm install 腳本沒有的。鉤子只能透過模組 API 存取檔案、程序和網路,並且 Claude Code「拒絕載入以本指令無法讀取的方式使用模組 API 的模組」(管理員文件)。您可以在不執行模組的情況下列出它呼叫的內容。請善用此功能。
像審查新的依賴項一樣審查模組。在安裝任何東西之前,先取得原始碼,然後驗證它:git clone "$MOD_REPO" some-mod,接著執行 claude plugin validate ./some-mod。claude plugin validate 會在不執行模組的情況下讀取其清單和鉤子模組(請參閱建立文件)。
其輸出中有兩行很重要:hooks: 列出模組處理的事件,而 calls: 列出其程式碼呼叫的模組 API 方法。管理員文件說明了每個方法的意義。
簡而言之:hooks: 行中的 tool.call 或 prompt.submit 表示它能看到並更改每個工具呼叫或提示詞。hooks: 行中的 tool.check 表示它可以在權限提示出現之前批准或拒絕工具呼叫。$.process.run 或 $.process.spawn 表示它會以您的身份在沙盒外啟動程式。
$.env.get 或 $.settings.read 表示它會讀取可能包含 API 金鑰的值。env reads: 行會列出每個變數的名稱。$.http.fetch 表示它會發出網路請求。$.model.complete 表示它會花費您的方案額度或 API 金鑰。
將此列表與模組聲稱的功能進行比對。一個繪製上下文視窗圖表的模組沒有理由掛鉤 tool.check。一旦 calls: 列出 $.process.run,其餘列表的資訊價值就不大了,因為它啟動的程式可以執行您能做的任何事情。然後,在您閱讀完後,請注意有什麼變化。
安裝文件指出,對於大多數 Anthropic 官方市集以及從 claude.ai 添加的市集,自動更新預設是開啟的。對於社群市集和第三方市集,自動更新是關閉的。
安全頁面警告說,更新意味著「您審查過的檔案可能會在磁碟上更改」。對於第三方市集,請關閉自動更新,並在添加時將其固定到一個標籤,例如文件中的 your-org/plugins#v1.2.0。這能確保市集保持在您閱讀過的版本,因此對於儲存在該儲存庫中的外掛程式,您閱讀的程式碼就是實際執行的程式碼。
關閉開關及其代價。概覽提供了三種從窄到寬的選項:針對單一模組,您可以從 /plugin 的「已安裝」分頁中停用或解除安裝其外掛程式,或在您的 shell 中執行 claude plugin disable <name>@<marketplace>。
針對單一會話中的所有已安裝模組,請使用 claude --safe-mode 啟動。這是有意為之的廣泛停用。CLI 參考列出了 CLAUDE.md、技能、外掛程式、鉤子、MCP 伺服器、狀態列和自動記憶體等不會載入的項目。這對於檢查模組是否導致異常情況很有用,但不適用於日常工作。
針對每個會話中的所有已安裝模組,請在 ~/.claude/settings.json 中設定 disableAllHooks 為 true。{ "disableAllHooks" : true }。這個選項也會讓您失去設定鉤子和自訂狀態列,因此您依賴的 PreToolUse 鉤子也會隨之失效。
無論是 --safe-mode 還是 disableAllHooks 都無法停止 Claude Code 內建的模組,例如載入 AGENTS.md 的模組。您可以在 /plugin 中逐一關閉這些模組。sec-default 防護機制是個例外:概覽指出它無法關閉。
在團隊環境中,有一個更精確的開關。管理員文件將 allowManagedModsOnly 選項放在內建防護機制中,位於受管設定裡。這會阻止使用者帶來的模組執行其鉤子,使用者無法從自己的設定檔中撤銷此設定,但他們的設定鉤子仍可正常運作:{ "pluginConfigs" : { "cc-plugin-sec-default@builtin" : { "options" : { "allowManagedModsOnly" : true } } } }。
當 Hermes 執行 Claude Code 時,防護機制的位置。我開發 Hermes IDE,因此請帶著這個背景來閱讀本節。Hermes 在「真實終端機中,如同其他任何地方一樣」執行每個代理程式自己的介面(README)。這是其設計,而這點有利有弊:Hermes 在 Claude Code 及其外掛程式之間不設置任何中介。
在 Hermes 任務中啟動的 Claude 是您機器上安裝的版本,帶有您的設定和外掛程式,因此您安裝的模組也會在那裡載入。⌘N 代理程式選擇器會顯示:Claude Code(已安裝,2.1.299)已選取,Codex 已安裝(0.145.0),以及其他支援的代理程式標示為「未安裝」。
Hermes「從不為您回應權限提示」。但模組可以,當它在提示出現之前批准呼叫時,就不會有提示。收件匣中沒有任何內容可顯示給您,因為沒有任何東西在等待。
Hermes 提供的是事後記錄:每個任務都有自己的 hermes/ 分支和工作樹,每個代理程式的執行步驟都已儲存,以便您可以進行差異比對或還原,以及按步驟或按檔案檢視的審閱台(⌘G)。這涵蓋了任務工作樹中發生的事情。但它不涵蓋模組寫入其他地方的檔案、讀取的金鑰或發送的請求。Hermes 並非沙盒。
因此,防護機制應設定在 Claude Code 讀取它的地方:/plugin 中的外掛程式條目、~/.claude/settings.json 中的 disableAllHooks,或團隊機器上的受管設定。一旦設定,它在 Hermes、您自己的終端機和編輯器中都會生效。
⌘N 新任務表單會顯示:Claude Code、orders-api 專案、一個新的 hermes/ 工作樹、接受編輯、模型和工作量,以及 claude 指令的「Hermes 將執行」預覽。該表單會在執行前顯示確切的 claude 指令。
如果您希望某個會話完全沒有安裝的模組,Hermes 也會在真實終端機中開啟純粹的 shell,因此您可以開啟一個並自行在那裡啟動 claude --safe-mode,但會產生上述代價。Hermes 可免費下載,在 GitHub 上以 BSL 1.1 授權開放原始碼,並可在 macOS、Windows 和 Linux 上執行。它不隸屬於 Anthropic 或 Nous Research。
您會安裝陌生人的模組嗎?模組確實很有價值。Anthropic 自己的範例包括 blast-radius,它能攔截危險的 shell 指令(例如 rm -rf 或強制推送),並在您執行前顯示會更改的內容。這是一種您無法透過提示詞建立的防護機制。
然而,使其運作的相同存取權限,也可能被粗心或惡意的模組濫用。因此,請以您為負責的服務添加依賴項的方式來安裝模組。在下一次執行 /plugin install 之前,請在複製的模組上執行 claude plugin validate 並閱讀 calls: 行。
您知道 Claude Code 中的模組已啟用嗎?您在安裝外掛程式之前會驗證它嗎?請在評論中告訴我。
如果這篇文章對您有幫助。模組是從另一個角度看工具呼叫:決定函數呼叫是否執行、重寫其參數,或在不執行任何操作的情況下回應的程式碼。《AI That Acts》則是您自己用 TypeScript 建構這些呼叫的一面:工具呼叫、函數,以及第一個可運作的代理程式。
如果這篇文章讓您想了解 tool.call 中傳遞的內容,請從那裡開始。它是《AI in TypeScript》系列叢書的第三本,該系列共有五本書,從您的第一個 LLM 呼叫到生產環境中的代理程式,完整系列在此。