AGENTIC COMMONSAI 產業簡報

繁中EN

主題AI 編程與開發工具出版 2026-10-13

返回文章列表Claude Code

在 Claude Code 進程裡跑自己的程式碼:Claude Mods 用三個檔案改寫終端介面

本頁內容6 個段落
  1. 它解決了什麼問題
  2. 最小可用 mod 長什麼樣
  3. 安全面換來的能力面
  4. 升級時的兩個坑
  5. 該不該投入
  6. 參考來源

摘要: 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,再決定要縫什麼進去。

參考來源

AGENTIC COMMONS由 PHLEGON LABS 經營
分享X電郵
支持我們

相關閱讀

  1. Claude 5 世代上下文工程新規則:系統提示砍八成

    Anthropic 於 7 月 24 日發表 Claude 5 世代模型的上下文工程指南:Claude Code 系統提示砍掉逾 80%,六組新舊做法對照,並更新 CLAUDE.md、Skills 與 /doctor 的建議。

    Claude

  2. Bun 1.4 改寫成 Rust:64 個 Claude 代理 11 天完成的大搬遷

    JavaScript 執行環境 Bun 釋出 1.4.0,首個以 Rust 重寫的版本:Claude Code 動態工作流程搭配 Claude Fable 5,以 64 個並行代理在 11 天內移植約 53.5 萬行 Zig 程式碼,API 成本約 16.5 萬美元。

    Open Source

  3. JetBrains 裡的 Copilot 開始讓管理員先講話:預設模型與 MCP 啟動時機都交給你決定

    GitHub Copilot for JetBrains 新增企業預設模型控管、可停用的 MCP 自動啟動,以及診斷一鍵修復等聊天改進。

    Copilot