Mods 參考資料
Claude Code mod 的完整參考資料:hook 模組配置、事件、mods API 方法、轉譯位置、各使用介面的元素、限制與設定。
查詢 mod 可處理的任何事件、可呼叫的任何 mods API 方法,或可繪製的任何轉譯位置,適用於 v2.1.287 版起的 Claude Code CLI 與 Desktop 應用程式。每個項目皆提供名稱與一行說明,若有對應的指南章節,亦會連結至該處。
完整的參考資料是 Claude Code 的 mod TypeScript 宣告,其中以範例描述每個事件、方法與元素。GitHub 上的副本可能比您安裝的 Claude Code 版本更舊。兩者不一致時,請以 Claude Code 為您的版本寫入的副本為準。
檔案
mod 是包含下列檔案的外掛目錄:
| 檔案 | 必要 | 內容 |
|---|---|---|
.claude-plugin/plugin.json |
是 | 外掛資訊清單。mod 不會新增任何必要欄位。 |
hooks/hooks.json |
是 | modules:一個陣列,內含一個相對於此檔案、指向 hook 模組的路徑,例如 "modules": ["./register.js"]。也可以在 hooks 下存放設定 hook。 |
hook 模組,例如 hooks/register.js |
是 | mod 的進入點。匯出 register(on, options)。檔名為 .js、.mjs、.cjs、.jsx、.ts、.mts、.cts 或 .tsx。為 ES 模組。 |
types/index.d.ts,由資訊清單中的 types 指定 |
當 mod 使用 $.state 或在 mods API 中新增命名空間時 |
宣告 PluginState 值以及 mod 新增的任何命名空間 |
檔名以 .test.ts 或 .test.tsx 結尾的檔案 |
否 | claude plugin test 執行的測試 |
register 會接收 on 與 options。options 存放資訊清單所宣告之 userConfig 欄位的值,並已填入預設值。
hook 函式
mod 透過在 register 內呼叫 on 來註冊其每個 hook(即事件處理常式)。on 接受事件名稱、選用的 matcher(針對事件欄位的篩選條件),以及 hook 本身,例如 on('tool.call', { tool: 'Bash' }, async ($, e, next) => next(e))。on 會回傳一個只有一個方法 .catch(handler) 的註冊物件,用來設定 hook 的錯誤處理常式。
| 引數 | 說明 |
|---|---|
$ |
mods API:mods API 方法中的每個方法。每次呼叫請完整寫出,先命名空間再方法,例如 $.fs.read('notes.md')。 |
e |
事件的輸入,為深度凍結的純資料。若要變更,請將副本傳給 next。 |
next(e) |
下一個處理常式,如同中介軟體。會執行此 hook 之後的 hook,接著執行 Claude Code 的行為。解析為事件的結果。 |
next.signal |
一個 AbortSignal,在事件被放棄時中止 |
next.origin |
觸發事件者的 { plugin, tier }。Claude Code 本身為 { plugin: 'engine', tier: 'core' }。mod 的 tier 是它在 mod 執行順序中的優先群組:prepend、user、append 或 builtin。 |
next.budget |
hook 的時間限制(毫秒):next.budget.ms 為整體限制,next.budget.remainingMs 為目前剩餘時間 |
next.to(e, tier) |
跳至較後面的層級,即 append、builtin 或 core。next.to(e, 'append') 會略過使用者安裝的 mod。只有 prependPlugins 或 appendPlugins 中的 mod 可以呼叫它。 |
next.error、next.called |
僅限 .catch 處理常式中。next.error.kind 為 throw 或 timeout,next.error.message 為錯誤文字,當失敗的 hook 曾呼叫 next 時,next.called 為 true。 |
事件
事件依其相關內容分組,並列出每個事件的觸發時機,以及其上的 hook 可回傳的內容。turn.step 與 process.spawn 上的 hook 是非同步產生器,其他 hook 則是非同步函式。
每個表格的最後一欄使用簡寫。next(e) 會將事件原封不動地傳遞下去。next({ ...e, text }) 會傳遞變更了指定欄位的副本,例如 next({ ...e, text: e.text.trim() })。物件會在不呼叫 next 的情況下回應事件,而 reason 之類的詞代表您撰寫的字串,例如 { deny: 'Use the file tools.' }。
工具
工具事件在 Claude 發出的每個工具呼叫前後觸發,從 Claude 讀取的說明,到是否執行該呼叫的決定:
| 事件 | 觸發時機 | hook 可回傳 |
|---|---|---|
tool.call |
工具即將執行時 | next(e)、{ deny: reason } 或 { result } |
tool.check |
Claude Code 在 tool.call 與 PreToolUse hook 之後,決定工具呼叫是否可以執行時。next(e) 會解析為規則、權限模式與這些 hook 所得出的決定。 |
{ decision },值為 allow、ask 或 deny |
tool.describe |
每個工具一次,在其說明首次傳送給 Claude 時 | { description } |
提示詞與 Claude 讀取的內容
提示詞事件涵蓋使用者輸入的文字,以及 Claude Code 自行傳送給 Claude 的文字,例如系統提示詞與提醒:
| 事件 | 觸發時機 | hook 可回傳 |
|---|---|---|
prompt.submit |
提交提示詞時 | next({ ...e, text })、next({ ...e, context }) 或 { drop: reason } |
prompt.fill、prompt.suggest |
文字即將以草稿或淡色建議的形式放入提示詞輸入框時 | 變更了文字的 next(e) |
prompt.edit |
使用者編輯提示詞輸入框時 | next(e) |
prompt.compose |
Claude Code 轉譯系統提示詞時 | { sections },即依傳送順序排列的 { id, text, scope } 清單 |
prompt.section |
系統提示詞的每個具名區段各一次。e.name 是該區段在 prompt.compose 中的 id。 |
{ text },或以 { text: null } 省略該區段 |
prompt.context |
每個對話一次,針對隨第一則訊息傳送的上下文 | { blocks } |
prompt.attachment |
Claude Code 為 Claude 新增一則自己的訊息時,例如提醒。e.type 指出種類,對於型別有宣告的種類,e.detail 存放撰寫該文字所依據的事實。 |
{ text },或以 { text: null } 省略 |
skill.prompt |
skill 的文字為 Claude 展開時 | { text } |
attribution.text |
Claude Code 撰寫提交或 pull request 的歸屬文字時 | { text } |
命令與設定
命令與設定事件在命令執行或被列出時,以及 /config 列被顯示或變更時觸發:
| 事件 | 觸發時機 | hook 可回傳 |
|---|---|---|
command.run |
命令即將執行時 | { text }、{} 或 next(e) |
command.describe |
每個命令一次,用於命令清單 | { description, argumentHint, isHidden } |
config.set |
/config 列即將變更時 |
next({ ...e, value }) 或 { deny: reason } |
config.describe |
每個 /config 列一次 |
{ label, description, isHidden } |
回合
回合事件從頭到尾追蹤一次回答,包括其中每個對模型的請求:
| 事件 | 觸發時機 | hook 可回傳 |
|---|---|---|
turn.start |
回合開始時 | next(e) |
turn.step |
一個請求即將傳送給模型時 | yield* next(e),或 next({ ...e, model })、next({ ...e, effort }) |
turn.complete |
回合結束時 | next(e),或以 { text } 在回答下方顯示一行 |
工作階段
工作階段事件標示工作階段的開始、結束、壓縮,以及與其他工作階段交換訊息:
| 事件 | 觸發時機 | hook 可回傳 |
|---|---|---|
session.start |
每個已載入的 mod 一次,在第一個提示詞之前,並在該 mod 重新載入後再次觸發。/clear、/resume 或 /branch 之後不會觸發。 |
next(e) |
session.end |
工作階段結束,或執行 /clear、/resume 或 /branch 時。e.reason 為 clear、resume、logout、prompt_input_exit 或 other。/branch 會回報 resume。 |
next(e) |
session.compact |
對話即將被壓縮時 | { skip: reason } |
session.receive、session.send |
訊息從另一個 agent 或工作階段送達,或即將傳送至另一個 agent 或工作階段時。請參閱在工作階段之間傳送與接收訊息。 | receive 為 { consumed: reason },send 為 { isDelivered: false, reason } |
session.append |
對話保留的每一列各一次,例如提示詞、回應區塊、工具結果或通知,在其儲存之前 | 以 next({ ...e, message }) 改寫該列的 content |
session.attach、session.detach |
另一個應用程式連線至工作階段或與其中斷連線時 | next(e) |
session.measure |
每個回合之後,以及方案限制的使用百分比變更時 | next(e) |
Subagent
subagent 事件在 subagent 類型提供給 Claude 時,以及 subagent 即將啟動時觸發:
| 事件 | 觸發時機 | hook 可回傳 |
|---|---|---|
agent.offer |
subagent 類型提供給 Claude 時 | 以 { isOffered: false } 保留不提供 |
agent.spawn |
subagent 即將啟動時 | { model } 或 { deny: reason } |
介面
介面事件在 Claude Code 繪製轉譯位置時,以及使用者使用 mod 所繪製的控制項時觸發。在介面中繪製說明 ui.render hook 回傳的內容:
| 事件 | 觸發時機 |
|---|---|
ui.render |
轉譯位置即將被繪製時 |
ui.resolve |
mod 載入時,每個應用程式、轉譯位置與 mod 各一次。結果是 $.ui.resolve(e) 讀取的元素表。 |
ui.press、ui.input、ui.select |
mod 所繪製的 Button、Input 或 Select 被使用時 |
ui.focus、ui.scroll |
焦點所在的控制項,或窗格或橫帶的捲動位置即將變更時 |
ui.close |
窗格即將關閉時。e.id 為該窗格,e.origin.kind 為 plugin、person 或 unload。 |
ui.message |
Client 元素將資料傳送給其 mod 時 |
其他 mod
這些事件讓 mod 能在其他 mod 載入時對其採取行動,例如拒絕某個 mod,或變更它所接收的 mods API:
| 事件 | 觸發時機 | hook 可回傳 |
|---|---|---|
plugin.register |
hook 模組即將載入時。e.uses 列出其事件、mods API 呼叫、環境變數與狀態,與 claude plugin validate 印出的內容相同。每個呼叫都不含 $. 前綴,例如 fs.read。 |
{ refuse: reason } |
engine.create |
正在為此 mod 建置 mods API 時 | 變更後的 mods API,用以新增或保留某個命名空間 |
遙測
遙測事件針對 Claude Code 記錄的使用紀錄觸發:
| 事件 | 觸發時機 | hook 可回傳 |
|---|---|---|
telemetry.log、telemetry.mark |
遙測紀錄即將被記錄,或標記某項功能的一次使用時。在您安裝的 mod 中,請為遙測 hook 加上篩選條件 { to: 'collector' },例如 on('telemetry.log', { to: 'collector' }, hook)。若沒有此篩選條件,該 mod 將無法通過 claude plugin validate。* 不會比對這些事件。 |
next(e) 或 { deny: reason } |
設定 hook 事件
每個設定 hook 事件都是名為 classic.<Event> 的事件,例如 classic.Stop 或 classic.PostToolUse。e 是該 hook 的 stdin JSON。
mods API 呼叫
每個 mods API 方法也是一個事件,以其命名空間與方法命名,例如 fs.read、model.complete 或 ui.open。其上的 hook 會攔截在它之後執行之 mod 的呼叫,並可回傳 next(e)、{ deny: reason } 或 { value }。
Mods API 方法
mods API 是每個 hook 接收的 $ 引數。其方法依命名空間分組,例如 $.ui。此表依名稱列出每個命名空間的方法,因此 $.ui 列中的 open 即為呼叫 $.ui.open(...)。指南會示範常用方法的用法,而您建置版本的型別則以範例記錄每個方法。
| 命名空間 | 方法 |
|---|---|
$.plugin |
name、root:此外掛的名稱與目錄 |
$.ui |
resolve、invalidate、open、close、panes、focus、scroll、toast、status、log、notice、ask、copy、blit |
$.command |
register、run、list |
$.tool |
register、call、check、list |
$.agent |
register、spawn、list |
$.model |
complete、fork、classify |
$.prompt |
submit、read、fill、suggest、compose。Claude 會在一個指明您的 mod 為傳送者的句子之後,讀取來自 submit({ text }) 的文字。submit({ text, asUser: true }) 會將文字當作使用者本人的話傳送,不附帶該句子。 |
$.turn |
abort |
$.session |
messages、cwd、root、model、turns、id、repo、surfaces、usage、version、compact、send、append、authorize。usage() 回傳 { startedAt, context, rateLimits, cost }:context 包含 tokens、window 與 percent,rateLimits 是 { kind, percentUsed, resetsAt } 的清單。 |
$.config |
list、set |
$.settings |
read |
$.env |
get、set |
$.fs |
read、write、list、exists、stat、ancestors。write 不是不可分割的操作:它會就地取代檔案內容,因此其他程序可能讀到寫入一半的檔案。多個工作階段都會變更的資料,請存放在 $.store 中。 |
$.store |
get、set、delete、keys。由機器上每個工作階段共用的鍵值儲存區。請參閱從多個工作階段儲存。 |
$.state |
反應式狀態:get、set,以及從 claude-code 匯入的輔助函式 atom、read、update、derive 與 memberOf |
$.clock |
now、sleep、after、every |
$.http |
fetch |
$.process |
run、spawn |
$.mcp |
call、connect。connect(server) 會連線至您自己外掛的資訊清單所列出的 MCP 伺服器。 |
$.audio |
play、speak |
$.telemetry |
log、mark。只有當 Claude Code 或內建 mod 發出呼叫時,才會傳送紀錄。 |
轉譯位置
轉譯位置是 Claude Code 介面中的擴充點。每一列都是 ui.render hook 中 e.component 的一個值,並列出 e.props 的欄位以及轉譯它的應用程式。e.surface 為 terminal 或 desktop。變更 Claude Code 既有的繪製內容說明 hook 能在某個位置做什麼,並為每種選擇提供範例。
| 位置 | e.props |
e.requestId |
轉譯於 |
|---|---|---|---|
Pane |
title、isFocused、bodyColumns、placement、scroll、view |
窗格的 id |
終端機、Desktop |
AbovePrompt |
hasSurvey、isWorking、maxRows、bodyColumns、scroll、view |
單一實例 | 終端機、Desktop |
UserMessage |
text、origin、isExpanded,以及依來源而定的 task 或 from |
訊息 id | 終端機、Desktop |
AssistantMessage |
回覆的文字 | 訊息 id | 終端機、Desktop |
ToolUse、ToolResult、ToolGroup |
工具的名稱、輸入與結果 | 工具呼叫 id | 終端機、Desktop |
CommandOutput |
command、text |
訊息 id | 終端機、Desktop |
AskUserQuestion |
問題與選項 | 工具呼叫 id | 終端機、Desktop |
ToolProgress |
kind |
工具呼叫 id | 終端機 |
Spinner |
word、message、suffix、mode |
agent id | 終端機、Desktop |
TurnDuration |
word、durationMs |
訊息 id | 終端機 |
InfoNotice |
text、command |
訊息 id | 終端機 |
SessionMode |
modes |
單一實例 | 終端機、Desktop |
PromptHint |
isDraft、isWorking、hint |
單一實例 | 終端機、Desktop |
e.viewport 存放 columns、rows 與 isFullscreen。在應用程式量測其視窗之前,它不會存在。其 rows 是整個視窗的高度,而非您窗格的高度。
若要讓樹狀結構符合其位置,請在 hook 中讀取下列 prop:
Pane或橫帶的寬度:依e.props.bodyColumns繪製- 逐字稿旁
Pane的高度:當e.props.placement為'dock'時,e.props.scroll.bodyRows是窗格擁有的列數 - 提示詞上方
Pane的高度:當e.props.placement為'inline'時,窗格會隨您的樹狀結構增高,直到上限為止,而bodyRows只計算目前顯示的列數。$.ui.open的rows欄位可要求不同的上限。
高於窗格的樹狀結構會整體捲動。
元素
元素是 ui.render hook 所回傳樹狀結構的建構區塊,您可以從 $.ui.resolve(e) 取得。從元素建立樹狀結構會展示常用元素以及終端機如何繪製它們,介面圖庫則提供大多數元素的螢幕截圖。勾號表示該應用程式可以繪製此元素。
| 元素 | 主要 prop | 終端機 | Desktop |
|---|---|---|---|
Box |
key、flex 版面配置、gap、padding、margin、width、height、borderStyle、backgroundColor、position、hover |
✓ | ✓ |
Text |
color、backgroundColor、bold、italic、underline、dimColor、inverse、wrap |
✓ | ✓ |
Button |
key、label、onPress、hotkey、plain、dimColor、autoFocus、action |
✓ | ✓ |
Link |
href、label |
✓ | ✓ |
Code |
程式碼,最多 10,000 個字元 | ✓ | ✓ |
Markdown |
text(最多 10,000 個字元)、key、dimColor、onLinkPress、pressableLinks |
✓ | ✓ |
Input |
key、label、placeholder、value、submitLabel、onSubmit、onInput、autoFocus |
✓ | ✓ |
Select |
key、label、options、value、onSelect、autoFocus |
✓ | ✓ |
Svg |
SVG 文件,最多 131,072 個字元 | ✓ | |
Client |
module、key |
✓ | ✓ |
Raster |
key、最多 512 的 columns、最多 256 的 rows、cells。請參閱繪製彩色儲存格網格。 |
✓ | |
Image |
最多 2 MiB 的 PNG 或 RGBA 位元組,或檔案路徑 | ✓ |
更多 Button 規則:action 指定 Claude Code 本身的某個快捷鍵動作,當使用者對該動作的綁定為組合鍵或修飾鍵時,該綁定會按下此按鈕。橫帶中按鈕上的數字 hotkey,在使用者於空白提示詞中單獨輸入該數字並停頓時也會觸發。當同一次繪製中有兩個按鈕指定相同的 hotkey 時,由後者取得。autoFocus 在任何控制項上都只接受 true,因此若要關閉,請省略此 prop。
限制
hook 與 mods API 呼叫都在時間與大小限制下執行。Claude Code 會略過超過時間限制的 hook,並拒絕超過大小限制的呼叫。
| 限制 | 值 |
|---|---|
hook 針對單一事件本身的執行時間,不計入 next 內部或 $.clock.sleep 以外之 mods API 呼叫內部的時間 |
10 秒 |
.catch 處理常式的執行時間 |
1 秒 |
所有 session.end hook 合計 |
1.5 秒 |
$.process.run 逾時 |
預設 30 秒,最多 10 分鐘 |
$.model.complete maxTokens |
預設 1024,最多 64,000 或模型的輸出上限 |
$.fs.read 與 $.fs.write |
單一檔案 4 MiB |
Text 的單一字串子項 |
10,000 個字元 |
$.store |
總計 4 MiB 的 JSON |
$.session.messages() |
最新的 4,096 個項目 |
$.ui.invalidate('ui.render') 重新繪製 |
節流為每秒 10 次,在終端機中針對可見窗格、展開的橫帶與提示詞下方的提示行則為每秒 30 次。更早到來的呼叫會被合併。 |
$.ui.toast |
顯示 4 秒,除非您傳入 { timeoutMs } |
| 未經使用者要求而開啟的窗格 | 自 144 個終端機欄寬起放置,使用者開啟過一次後則為 110 |
| 命令、工具、subagent 類型與窗格名稱 | 字母、數字、_ 與 -,最多 64 個字元 |
單一 claude plugin test 測試 |
5 秒,除非測試設定了 timeoutMs |
設定與環境變數
以下是影響 mod 的設定與環境變數。「位置」欄說明每一項是從哪個設定檔或環境讀取:
| 名稱 | 位置 | 作用 |
|---|---|---|
CLAUDE_CODE_PLUGIN_DIRS |
環境,或 ~/.claude/settings.json 中的 env |
以 --plugin-dir 的方式載入的外掛目錄,供無法傳入旗標的應用程式使用。以 : 分隔的絕對路徑,在 Windows 上則以 ; 分隔。 |
CLAUDE_CODE_PLUGIN_DIR_WATCH |
環境 | 1 會讓長時間執行的非互動式工作階段在儲存時重新載入 --plugin-dir mod |
prependPlugins、appendPlugins |
受管設定。僅在沒有受管設定的機器上、且使用者未以 Team 或 Enterprise 方案登入時,才可使用使用者設定。 | 外掛 id 的清單,例如 acme-guard@acme-tools。prependPlugins 中的 mod 會在使用者安裝的每個 mod 之前執行,appendPlugins 中的 mod 則在之後執行,並依列出的順序。請參閱 mod 執行順序。 |
allowManagedModsOnly |
受管設定,作為內建防護的選項 | 只有屬於您組織的 mod,以及內建於 Claude Code 的 mod 會載入。使用者的設定 hook 會繼續執行。 |
allowModsToOverrideDenyRules |
受管設定,作為內建防護的選項 | 允許使用者安裝的 mod 核准遭 deny 規則拒絕的工具呼叫 |
allowManagedHooksOnly |
受管設定 | 封鎖不屬於您組織的 hook 與已安裝的 mod。請參閱哪些會繼續執行。 |
disableAllHooks |
任何設定檔 | 在受管設定中,已安裝外掛的任何 mod 或 hook 都不會執行。在您自己的設定中,您組織所管理的內容會繼續執行。請參閱 disableAllHooks。 |
disableSideloadFlags |
受管設定 | 在啟動時拒絕 --plugin-dir 與 --plugin-url |
pluginConfigs |
使用者或受管設定 | 存放 mod 的 userConfig 值,以外掛 id 為鍵,例如 acme-guard@acme-tools;若是以 --plugin-dir 載入的外掛,則以其名稱加上 @inline 為鍵,例如 first-mod@inline |
sec-default@builtin 是內建於 Claude Code 的防護,在 /plugin 與偵錯日誌中列為 cc-plugin-sec-default。在具有受管設定的機器上,或對於以 Team 或 Enterprise 方案登入的使用者,它會在使用者安裝的每個 mod 之前載入。若設定了受管 prependPlugins,則只有在該清單列出此防護時才會載入,並位於所列的位置。其原始碼位於 Claude Code 儲存庫的 mods/sec-default 目錄。
命令
這些命令與旗標用於載入、檢查與測試 mod。claude 命令在您的 shell 中執行,/ 命令則在 Claude Code 提示詞輸入處執行。表格中的 <directory> 代表您輸入的路徑,例如 claude plugin validate ./first-mod。方括號表示選用的引數。
| 命令 | 作用 |
|---|---|
/plugin |
當非內建的 mod 已載入時,在其分頁下方顯示如 1 mod active · first-mod 的一行 |
claude plugin validate <directory> |
讀取外掛的資訊清單與 hook 模組,並回報錯誤、其處理的事件,以及其發出的 mods API 呼叫。--strict 會將警告視為錯誤,--json 會印出機器可讀的報告。 |
claude plugin test [directory] |
執行該目錄下(未指定時則為目前目錄)所有檔名以 .test.ts 或 .test.tsx 結尾的檔案。測試失敗時以狀態 1 結束。 |
claude --plugin-dir <directory> |
為單一工作階段載入外掛目錄,並在您儲存時重新載入其 hook 模組。重複使用此旗標可載入多個目錄。 |
/reload-plugins |
在您執行時重新載入外掛 |