摘要: Firecrawl 在 2026 年 10 月 6 日的教學文章裡介紹了 Claude Mods:一種普通的 Claude Code 插件,只要在 hooks 設定裡指向一個 TypeScript 或 JavaScript 檔案,裡面的函式就會在 Claude Code 自己的進程內被呼叫。從 v2.1.287 起這功能預設開啟,不用再設環境變數,最小的可用 mod 只要三個檔案,而且儲存後直接熱載入。
它解決了什麼問題
過去的 Claude Code hooks(現在叫 settings hooks)是在 Claude Code 外面跑:啟動一個 shell 指令、發一個 HTTP 請求、或呼叫一個模型,Claude Code 等它結束。這種隔離很安全,腳本掛了也不影響主程式,但代價是你碰不到介面,也不能在事件傳遞的中途改寫它。
Mod 的 function hook 走另一條路:程式碼直接跑在 Claude Code 的進程裡。按 Firecrawl 文章的說法,每個 hook 可以觀察事件、改寫事件、或自己回答事件。因為 Claude Code 的介面本身用 React 寫成,hook 可以遞交一棵介面元素樹讓它畫在畫面上——文章提到有人因此把 Tetris、終端瀏覽器、甚至 DOOM 放進了提示框上方,而且這類畫面完全不消耗 token,純本地執行。
多個 mod 之間的執行順序採用 middleware 模式,類似 Express:排在前面的 mod 包住後面的,每個 hook 收到一個 next 函式,決定要不要把事件傳下去。
最小可用 mod 長什麼樣
手寫一個 mod 只要三個檔案:插件 manifest、指向程式碼的 hooks.json、以及 hooks module 本身。Claude Code 直接載入 TypeScript,不需要建置步驟或 bundler。核心結構像這樣:
import type { Register } from 'claude-code';
export const register: Register = on => {
on('command.run', { command: 'hello' }, async ($, e) => {
$.ui.invalidate('ui.render');
return { text: 'banner shown' };
});
on('ui.render', { component: 'AbovePrompt' }, async ($, e, next) => {
const { Box, Text } = await $.ui.resolve(e);
return (
<Box flexDirection="column">
<Text color="red">Hello from a Claude Mod</Text>
{await next(e)}
</Box>
);
});
};
每個 hook 收到同樣三個參數:$ 是 mods API,是 mod 對外界的唯一通道;e 是凍結的事件資料;next 把事件交給後續 mod 和 Claude Code 本身的行為。想更快上手,也可以直接在 session 裡用文字描述需求,Claude Code 內建的插件撰寫 skill 會幫你把檔案寫到受保護的路徑,但那個 mod 只在產生它的 session 裡載入,想留著就得把資料夾複製走。
安全面換來的能力面
這是整個設計裡最值得細看的取捨。Mod 不能 import npm 套件、React 元件或 WebAssembly——因為 Claude Code 必須在執行前讀完整個 mod、列出它做的每一件事。Mod 也沒有環境層級的檔案系統或網路存取:讀檔、開進程、發請求都得透過 $.fs、$.process、$.http,於是靜態分析就能說出每一個副作用,claude plugin validate 印出的正是這份清單。
實務上的例外是一個純粹、無依賴、以 ES module 形式複製進插件資料夾的小型函式庫。
升級時的兩個坑
如果你的舊版設定裡有 CLAUDE_CODE_ENABLE_FUNCTION_HOOKS,現在把它拿掉:v2.1.287 之後這個變數會被忽略,設成 0 也關不掉 mods。要停用的話,改用 /plugin 停用插件、--safe-mode 開 session,或設 "disableAllHooks": true——但最後一項會連 settings hooks 和自訂狀態列一起停。
另外,熱載入會從頭重跑 register,module 層級的變數會被重置。需要跨 reload 存活的狀態要放 $.state。儲存檔案後印出的 reload 清單也是除錯工具:清單裡少了一個 hook,通常是事件名稱打錯了。
該不該投入
Mod 的價值在於讓你把團隊的工作流縫進 Claude Code 本體:文章裡的開源 credit-tracker 就在同一個 session 顯示用了 10 個 Firecrawl credits、其中 8 個來自四次 developer index 搜尋。這種「把狀態畫在工作現場」的思路,其實和之前談過的 agent context 管理是同一件事的兩面——與其事後整理上下文,不如在事件發生的當下就攔截和改寫(可參考先前的討論:什麼時候該整理 context)。
限制也要記住:隔離性換掉了,mod 的品質和安全性完全取決於你自己寫的程式碼和審查流程。下一步很簡單——裝到 v2.1.287 以上,跑 claude --plugin-dir ./demo 載入官方 repo 裡的範例 mods,再決定要縫什麼進去。
