476| `async` | 否 | 若為 `true`,會在背景執行而不封鎖。請參閱[在背景執行 hook](#run-hooks-in-the-background) |476| `async` | 否 | 若為 `true`,會在背景執行而不封鎖。請參閱[在背景執行 hook](#run-hooks-in-the-background) |
477| `asyncRewake` | 否 | 若為 `true`,會在背景執行,並在退出碼為 2 時喚醒 Claude。Hook 的 stderr(若 stderr 為空則為 stdout)會以[系統提醒](/docs/zh-TW/glossary#system-reminder)的形式顯示給 Claude,讓它能對長時間執行的背景失敗做出反應 |477| `asyncRewake` | 否 | 若為 `true`,會在背景執行,並在退出碼為 2 時喚醒 Claude。Hook 的 stderr(若 stderr 為空則為 stdout)會以[系統提醒](/docs/zh-TW/glossary#system-reminder)的形式顯示給 Claude,讓它能對長時間執行的背景失敗做出反應 |
478| `shell` | 否 | 此 hook 使用的 shell。接受 `"bash"` 或 `"powershell"`。預設為 `"bash"`,在未安裝 Git Bash 的 Windows 上則為 `"powershell"`。設為 `"powershell"` 會在 Windows 上透過 PowerShell 執行命令。由於 hook 會直接產生 PowerShell,因此不需要 `CLAUDE_CODE_USE_POWERSHELL_TOOL`。設定了 `args` 時會被忽略 |478| `shell` | 否 | 此 hook 使用的 shell。接受 `"bash"` 或 `"powershell"`。預設為 `"bash"`,在未安裝 Git Bash 的 Windows 上則為 `"powershell"`。設為 `"powershell"` 會在 Windows 上透過 PowerShell 執行命令。由於 hook 會直接產生 PowerShell,因此不需要 `CLAUDE_CODE_USE_POWERSHELL_TOOL`。設定了 `args` 時會被忽略 |
479| `onFailure` | 否 | hook 失敗時該動作的處理方式:`"continue"`(預設)或 `"block"`。請參閱[在 hook 失敗時封鎖動作](#block-the-action-when-a-hook-fails)。需要 Claude Code v2.1.295 或更新版本 |479| `onFailure` | 否 | hook 失敗時,觸發該 hook 的動作是否繼續進行:`"continue"` 或 `"block"`。關於 `"block"` 以及未設定此欄位時的行為,請參閱[在 hook 失敗時封鎖動作](#block-the-action-when-a-hook-fails)。需要 Claude Code v2.1.295 或更新版本 |
480 480
481<a id="exec-form-and-shell-form" />481<a id="exec-form-and-shell-form" />
482 482
829 829
830* **成功**:您的 hook 以 0 退出。Claude Code 套用您的 hook 列印的任何 [JSON 輸出](#json-output) 欄位,除非這些欄位阻止或拒絕該操作,否則操作會繼續進行。[啟動背景程序的 hook](#hooks-that-start-a-background-process) 說明了例外情況。830* **成功**:您的 hook 以 0 退出。Claude Code 套用您的 hook 列印的任何 [JSON 輸出](#json-output) 欄位,除非這些欄位阻止或拒絕該操作,否則操作會繼續進行。[啟動背景程序的 hook](#hooks-that-start-a-background-process) 說明了例外情況。
831* **阻止性錯誤**:您的 hook 以 2 退出。在 [可以阻止的事件](#exit-code-2-behavior-per-event) 上,Claude Code 會停止該操作。831* **阻止性錯誤**:您的 hook 以 2 退出。在 [可以阻止的事件](#exit-code-2-behavior-per-event) 上,Claude Code 會停止該操作。
832* **非阻止性錯誤**:您的 hook 以任何其他代碼退出,或以其他方式失敗,例如無法啟動或列印無效的 JSON。操作會繼續進行,且在 `PreToolUse` 等事件上,您會在逐字稿中看到 `<hook name> hook error` 通知。如果您希望失敗的 hook 阻止操作,請設定 [`onFailure: "block"`](#block-the-action-when-a-hook-fails)。832* **非阻止性錯誤**:您的 hook 以任何其他代碼退出,或以其他方式失敗,例如無法啟動或列印無效的 JSON。操作會繼續進行,但 [失敗時會阻止操作的 hook](#block-the-action-when-a-hook-fails) 除外,例如將 `onFailure` 設定為 `"block"` 的 hook。在 `PreToolUse` 等事件上,您會在逐字稿中看到 `<hook name> hook error` 通知。
833 833
834您的 hook 列印到 stdout 的內容可能會改變結果。例如,如果 `PreToolUse` hook 以 1 退出,但列印了通過驗證的 JSON,則該次執行為成功,由 JSON 欄位決定接下來發生的情況。要找出您的 hook 在 `PreToolUse` 等事件上的結果,請將第一欄中它列印到 stdout 的內容與頂端的退出碼對應:834您的 hook 列印到 stdout 的內容可能會改變結果。例如,當 `PreToolUse` hook 以 1 退出,但列印了通過驗證的 JSON 時,該 JSON 仍可決定接下來發生的情況。要找出您的 hook 在 `PreToolUse` 等事件上的結果,請將第一欄中它列印到 stdout 的內容與頂端的退出碼對應:
835 835
836| Stdout | 退出 0 | 退出 2 | 任何其他退出碼 |836| Stdout | 退出 0 | 退出 2 | 任何其他退出碼 |
837| :- | :- | :- | :- |837| :- | :- | :- | :- |
838| 通過 [schema 驗證](#json-output) 的 JSON 物件 | 成功。欄位生效 | 阻止性錯誤。Claude Code 仍會讀取欄位,但它們無法覆寫阻止 | 成功。Claude Code 忽略退出碼,僅由欄位決定。若設定 [`onFailure: "block"`](#block-the-action-when-a-hook-fails),這會計為失敗 |838| 通過 [schema 驗證](#json-output) 的 JSON 物件 | 成功。欄位生效 | 阻止性錯誤。Claude Code 仍會讀取欄位,但它們無法覆寫阻止 | 成功。Claude Code 忽略退出碼,僅由欄位決定。對於 [失敗時會阻止操作的 hook](#block-the-action-when-a-hook-fails),該次執行改為計為失敗 |
839| [無法解析](#exit-code-0) 或未通過 schema 驗證的 JSON | 非阻止性錯誤。通知帶有解析或驗證訊息 | 阻止性錯誤。您的 stderr 即為原因 | 非阻止性錯誤。通知帶有解析或驗證訊息 |839| [無法解析](#exit-code-0) 或未通過 schema 驗證的 JSON | 非阻止性錯誤。通知帶有解析或驗證訊息 | 阻止性錯誤。您的 stderr 即為原因 | 非阻止性錯誤。通知帶有解析或驗證訊息 |
840| [純文字](#exit-code-0) 或無內容 | 成功 | 阻止性錯誤。您的 stderr 即為原因 | 非阻止性錯誤。通知帶有您的 stderr 的第一行 |840| [純文字](#exit-code-0) 或無內容 | 成功 | 阻止性錯誤。您的 stderr 即為原因 | 非阻止性錯誤。通知帶有您的 stderr 的第一行 |
841 841
864* **兩行或更多行,每行本身都可解析為 JSON,且第一行以 `{` 開頭、最後一行以 `}` 結尾**:若沒有任何一行是設定欄位的 JSON 輸出物件,則為純文字;若有,則為解析失敗。864* **兩行或更多行,每行本身都可解析為 JSON,且第一行以 `{` 開頭、最後一行以 `}` 結尾**:若沒有任何一行是設定欄位的 JSON 輸出物件,則為純文字;若有,則為解析失敗。
865* **其他任何以 `{` 開頭並以 `}` 結尾但不是有效 JSON 的內容**:解析失敗。865* **其他任何以 `{` 開頭並以 `}` 結尾但不是有效 JSON 的內容**:解析失敗。
866 866
867當 Claude Code 嘗試將您的 stdout 解析為 JSON 但無法解析,或已解析的物件未通過 [schema 驗證](#json-output) 時,該次執行為 [非阻止性錯誤](#exit-code-output)。`<hook name> hook error` 通知帶有解析或驗證訊息。在將純文字 stdout 新增為上下文的事件上,Claude Code 不會新增其無法解析的 stdout。867除非該 hook 是 [失敗時會阻止操作的 hook](#block-the-action-when-a-hook-fails),否則解析失敗或已解析的物件未通過 [schema 驗證](#json-output) 都是 [非阻止性錯誤](#exit-code-output)。`<hook name> hook error` 通知帶有解析或驗證訊息。在將純文字 stdout 新增為上下文的事件上,Claude Code 不會新增其無法解析的 stdout。
868 868
869Claude 永遠看不到以 0 退出的 hook 的 stderr。要在 `PreToolUse` 等事件上自行讀取它,請啟用 [偵錯日誌](#debug-hooks)。要從 `PostToolUse` 或 `PostToolUseFailure` hook 向 Claude 顯示警告,請改為退出 2,以便 [Claude 看到 stderr](#exit-code-2-behavior-per-event),儘管工具已執行。869Claude 永遠看不到以 0 退出的 hook 的 stderr。要在 `PreToolUse` 等事件上自行讀取它,請啟用 [偵錯日誌](#debug-hooks)。要從 `PostToolUse` 或 `PostToolUseFailure` hook 向 Claude 顯示警告,請改為退出 2,以便 [Claude 看到 stderr](#exit-code-2-behavior-per-event),儘管工具已執行。
870 870
907 其他退出碼907 其他退出碼
908</h4>908</h4>
909 909
910當您的 hook 以 0 或 2 以外的代碼退出,並在 stdout 列印純文字或不列印任何內容時,該次執行為 [非阻止性錯誤](#exit-code-output)。您會在逐字稿中看到 `<hook name> hook error` 通知,帶有 `Failed with non-blocking status code:` 和您的 hook 的 stderr 第一行。例如,當 `Bash` 上的 `PreToolUse` hook 將 `something broke` 列印到 stderr 並以 1 退出時,`PreToolUse:Bash hook error` 通知帶有這一行:910除非該 hook 是 [失敗時會阻止操作的 hook](#block-the-action-when-a-hook-fails),否則以 0 或 2 以外的退出碼退出,並在 stdout 列印純文字或不列印任何內容,即為 [非阻止性錯誤](#exit-code-output)。如果操作繼續進行,您會在逐字稿中看到 `<hook name> hook error` 通知,帶有 `Failed with non-blocking status code:` 和您的 hook 的 stderr 第一行。
911
912例如,當 `Bash` 上的 `PreToolUse` hook 將 `something broke` 列印到 stderr 並以 1 退出時,`PreToolUse:Bash hook error` 通知帶有這一行:
911 913
912```text theme={null}914```text theme={null}
913Failed with non-blocking status code: something broke915Failed with non-blocking status code: something broke
915 917
916要擷取完整的 stderr 而不僅是其第一行,請啟用 [偵錯日誌](#debug-hooks)。918要擷取完整的 stderr 而不僅是其第一行,請啟用 [偵錯日誌](#debug-hooks)。
917 919
918無法啟動的 hook 也是非阻止性錯誤。在 shell 形式中,當指令碼路徑不存在或不可執行時,shell 以代碼(如 127)退出,通知帶有解譯器的訊息,例如 `Failed with non-blocking status code: /bin/sh: /path/to/hook.sh: No such file or directory`。當您設定原則 hook 時,請在其第一次執行時留意此通知,因為 `settings.json` 中拼寫錯誤的路徑代表該 hook 永遠不會執行。若要改為阻止操作,請設定 [`onFailure: "block"`](#block-the-action-when-a-hook-fails)。920除非該 hook 是 [失敗時會阻止操作的 hook](#block-the-action-when-a-hook-fails),否則無法啟動的 hook 也是非阻止性錯誤。在 shell 形式中,當指令碼路徑不存在或不可執行時,shell 以代碼(如 127)退出,通知帶有解譯器的訊息。例如,當指令碼路徑不存在時,通知會帶有類似這樣的一行:
921
922```text theme={null}
923Failed with non-blocking status code: /bin/sh: /path/to/hook.sh: No such file or directory
924```
925
926當您設定原則 hook 時,請在其第一次執行時留意此通知,因為 `settings.json` 中拼寫錯誤的路徑代表該 hook 永遠不會執行。要在 hook 無法啟動時阻止操作,請設定 [`onFailure: "block"`](#block-the-action-when-a-hook-fails)。
919 927
920<Warning>928<Warning>
921 沒有 stdout 上的有效 JSON,Claude Code 將退出碼 1 視為非阻止性錯誤,儘管 1 是傳統的 Unix 失敗代碼。如果您的 hook 旨在強制執行原則,請使用 `exit 2`。929 沒有有效 JSON 輸出的退出碼 1 是非阻止性錯誤,除非該 hook 是 [失敗時會阻止操作的 hook](#block-the-action-when-a-hook-fails),儘管 1 是傳統的 Unix 失敗代碼。如果您的 hook 旨在強制執行原則,請使用 `exit 2`。
922</Warning>930</Warning>
923 931
924<h4 id="timeouts">932<h4 id="timeouts">
929 937
930在 [`PreModelSwitch`](#premodelswitch) 上,在其逾時時被取消的 hook 會阻止模型切換。在 `PreToolUse` 上,兩個 hook 系列不同:938在 [`PreModelSwitch`](#premodelswitch) 上,在其逾時時被取消的 hook 會阻止模型切換。在 `PreToolUse` 上,兩個 hook 系列不同:
931 939
932* 逾時的 `command`、`http` 或 `mcp_tool` hook 不阻止工具呼叫。呼叫透過正常 [權限流程](/docs/zh-TW/permissions) 繼續,因此不要指望停滯的 hook 充當閘門。要在 `command` 或 `http` hook 逾時時阻止呼叫,請設定 [`onFailure: "block"`](#block-the-action-when-a-hook-fails)。940* 逾時的 `command`、`http` 或 `mcp_tool` hook 不阻止工具呼叫,但 [失敗時會阻止操作的 hook](#block-the-action-when-a-hook-fails) 除外。呼叫透過正常 [權限流程](/docs/zh-TW/permissions) 繼續,因此不要指望停滯的 hook 充當閘門。要在 `command` 或 `http` hook 逾時時阻止呼叫,請設定 [`onFailure: "block"`](#block-the-action-when-a-hook-fails)。
933* 超過其逾時的 [Agent SDK 回呼 hook](/docs/zh-TW/agent-sdk/hooks) [阻止工具呼叫](#pretooluse)。941* 超過其逾時的 [Agent SDK 回呼 hook](/docs/zh-TW/agent-sdk/hooks) [阻止工具呼叫](#pretooluse)。
934 942
935<h4 id="hooks-that-start-a-background-process">943<h4 id="hooks-that-start-a-background-process">
959 在 hook 失敗時阻止操作967 在 hook 失敗時阻止操作
960</h4>968</h4>
961 969
962在大多數事件上,當 hook 失敗或逾時時,Claude Code 仍會執行該操作,因此路徑錯誤或指令碼當機的原則 hook 會讓所有操作通過。若要改為阻止操作,請在 `command` 或 `http` hook 上設定 `"onFailure": "block"`。預設值為 `"continue"`。需要 Claude Code v2.1.295 或更新版本。970在大多數事件上,當 hook 失敗或逾時時,Claude Code 仍會執行該操作。如此一來,路徑錯誤或指令碼當機的原則 hook 會讓所有操作通過。若要改為阻止操作,請在 `command` 或 `http` hook 上設定 `"onFailure": "block"`。需要 Claude Code v2.1.295 或更新版本。
971
972<Note>
973 在沒有 Git Bash 的 Windows 上,未設定 `onFailure` 的 shell 形式 `PreToolUse` 或 `PermissionRequest` 命令 hook 失敗時,可能改為[阻止工具呼叫](#failed-hooks-on-windows-without-git-bash)。
974</Note>
963 975
964`.claude/settings.json` 中的這個 `PreToolUse` hook 會在每個 Bash 命令之前執行專案指令碼,並在指令碼失敗時阻止該命令:976`.claude/settings.json` 中的這個 `PreToolUse` hook 會在每個 Bash 命令之前執行專案指令碼,並在指令碼失敗時阻止該命令:
965 977
1007* **`Stop`、`SubagentStop`、`TaskCompleted` 和 `TeammateIdle` hook**:在這些事件上,退出碼 2 會讓 Claude 回去繼續工作,而 Claude 無法修復無法執行的 hook1019* **`Stop`、`SubagentStop`、`TaskCompleted` 和 `TeammateIdle` hook**:在這些事件上,退出碼 2 會讓 Claude 回去繼續工作,而 Claude 無法修復無法執行的 hook
1008* **背景命令 hook**:設定 [`async` 或 `asyncRewake`](#run-hooks-in-the-background) 的命令 hook1020* **背景命令 hook**:設定 [`async` 或 `asyncRewake`](#run-hooks-in-the-background) 的命令 hook
1009 1021
1022<h4 id="failed-hooks-on-windows-without-git-bash">
1023 Windows 上沒有 Git Bash 時失敗的 hook
1024</h4>
1025
1026如果被阻止的工具呼叫的錯誤包含以下文字,表示某個 `PreToolUse` 或 `PermissionRequest` 命令 hook 失敗或逾時,並阻止了該呼叫:
1027
1028```text theme={null}
1029blocking because Git Bash wasn't found and this hook doesn't set "shell" to "powershell", so only exit code 0 or 2 counts as its verdict.
1030```
1031
1032未設定 `shell` 的 shell 形式 hook 在未安裝 Git Bash 時會在 PowerShell 中執行,而為 Bash 撰寫的指令碼在那裡可能無法照原樣執行。請選擇符合您 hook 的修正方式:
1033
1034* **hook 是為 Bash 撰寫的**:安裝 [Git for Windows](https://git-scm.com/downloads/win),或者如果 Git Bash 安裝在 Claude Code 找不到的位置,請設定 [`CLAUDE_CODE_GIT_BASH_PATH`](/docs/zh-TW/env-vars),然後啟動新的工作階段
1035* **hook 執行單一 `.exe`,而非 `.cmd` 或 `.bat` 檔案**:將程式放在 `command` 中、將其引數放在 `args` 中以使用 [exec 形式](#exec-form-and-shell-form),並新增 [`"onFailure": "block"`](#block-the-action-when-a-hook-fails)。Claude Code 接著會在沒有 shell 的情況下啟動該程式。若沒有 `"onFailure": "block"`,當程式失敗、不存在或逾時時,呼叫可能會繼續進行
1036* **hook 是為 PowerShell 撰寫的**:在 hook 中新增 `"shell": "powershell"` 和 [`"onFailure": "block"`](#block-the-action-when-a-hook-fails)。若沒有 `"onFailure": "block"`,當 hook 仍然失敗或逾時時,呼叫可能會繼續進行。要找出 hook 失敗的原因,請查看 [偵錯日誌](#debug-hooks)
1037* **hook 失敗時操作應繼續進行**:在 hook 中新增 `"onFailure": "continue"`
1038
1039對於顯示此錯誤的 hook,0 或 2 以外的任何退出碼都計為 [失敗](#block-the-action-when-a-hook-fails),即使該 hook 列印了不拒絕呼叫的 JSON。
1040
1010<h4 id="exit-code-2-behavior-per-event">1041<h4 id="exit-code-2-behavior-per-event">
1011 每個事件的退出碼 2 行為1042 每個事件的退出碼 2 行為
1012</h4>1043</h4>
1060* **2xx 且正文為空**:成功,等同於退出碼 0 且無輸出1091* **2xx 且正文為空**:成功,等同於退出碼 0 且無輸出
1061* **2xx 且 JSON 物件正文**:使用與命令 hook 相同的 [JSON 輸出](#json-output) schema 進行解析。未通過 schema 驗證的正文是非阻止性錯誤1092* **2xx 且 JSON 物件正文**:使用與命令 hook 相同的 [JSON 輸出](#json-output) schema 進行解析。未通過 schema 驗證的正文是非阻止性錯誤
1062* **2xx 且任何其他正文,如純文字**:非阻止性錯誤,處理方式與非 2xx 狀態相同。Claude Code 不將文字新增到 Claude 的上下文1093* **2xx 且任何其他正文,如純文字**:非阻止性錯誤,處理方式與非 2xx 狀態相同。Claude Code 不將文字新增到 Claude 的上下文
1063* **非 2xx 狀態**:非阻止性錯誤,執行繼續1094* **非 2xx 狀態**:非阻止性錯誤
1064* **連線失敗**:非阻止性錯誤,執行繼續1095* **連線失敗**:非阻止性錯誤
1065* **逾時**:hook 被取消,如 [逾時](#timeouts) 下所述1096* **逾時**:hook 被取消,如 [逾時](#timeouts) 下所述
1066 1097
1067HTTP hook 無法僅透過狀態碼發出阻止性錯誤信號:非 2xx 狀態或失敗的連線是 [非阻止性錯誤](#exit-code-output)。要阻止工具呼叫或拒絕權限,請返回 2xx 回應,其 JSON 正文包含適當的決定欄位。要在請求失敗或返回非 2xx 狀態時阻止操作,請設定 [`onFailure: "block"`](#block-the-action-when-a-hook-fails)。1098發生 [非阻止性錯誤](#exit-code-output) 後,操作會繼續進行,除非該 hook 是 [失敗時會阻止操作的 hook](#block-the-action-when-a-hook-fails)。要阻止工具呼叫或拒絕權限,請返回 2xx 回應,其 JSON 正文包含適當的 [決定欄位](#decision-control)。要在請求失敗或返回非 2xx 狀態時阻止操作,請設定 [`onFailure: "block"`](#block-the-action-when-a-hook-fails)。
1068 1099
1069<h3 id="json-output">1100<h3 id="json-output">
1070 JSON 輸出1101 JSON 輸出
1573}1604}
1574```1605```
1575 1606
1607當提示詞是您輸入的 [skill](/docs/zh-TW/skills) 或自訂命令(例如 `/deploy staging`)時,hook 接收的是您輸入的那一行原文,而非展開後的 skill 內容。如果 hook 阻擋了該提示詞,命令就不會執行,因此 skill [以 `` !`<command>` `` 注入](/docs/zh-TW/skills#inject-dynamic-context)的 shell 命令也不會執行。若要改為比對命令的名稱或引數,請使用 [UserPromptExpansion](#userpromptexpansion)。
1608
1576<h4 id="userpromptsubmit-decision-control">1609<h4 id="userpromptsubmit-decision-control">
1577 UserPromptSubmit 決策控制1610 UserPromptSubmit 決策控制
1578</h4>1611</h4>
2076 2109
2077| 欄位 | 說明 |2110| 欄位 | 說明 |
2078| :- | :- |2111| :- | :- |
2079| `permissionDecision` | `"allow"` 會略過權限提示,但[沒有任何模式會自動核准的動作](/docs/zh-TW/permission-modes#actions-no-mode-auto-approves)、[從網路路徑讀取](/docs/zh-TW/permissions#network-paths),以及需要[搭配 `updatedInput`](#allow-with-updatedinput) 的 `AskUserQuestion` 和 `ExitPlanMode` 除外。`"deny"` 會阻止工具呼叫。`"ask"` 會提示使用者確認。`"defer"` 會正常結束,以便稍後恢復該工具。無論 hook 回傳什麼,[拒絕和詢問規則](/docs/zh-TW/permissions#manage-permissions)仍會被評估 |2112| `permissionDecision` | `"allow"` 會略過權限提示,但[任何模式都不會自動核准的動作](/docs/zh-TW/permission-modes#actions-no-mode-auto-approves)和[從網路路徑讀取](/docs/zh-TW/permissions#network-paths)除外。`AskUserQuestion` 和 `ExitPlanMode` 需要[搭配 `"allow"` 的 `updatedInput`](#allow-with-updatedinput)。關於 plan mode,請參閱 [plan mode 中的 hook 核准](/docs/zh-TW/permissions#hook-approvals-in-plan-mode)。`"deny"` 會阻止工具呼叫。`"ask"` 會提示使用者確認。`"defer"` 會正常結束,讓工具稍後可以恢復。無論 hook 回傳什麼,[拒絕與詢問規則](/docs/zh-TW/permissions#manage-permissions)仍會被評估 |
2080| `permissionDecisionReason` | 對於 `"ask"`,會在權限提示中向使用者顯示。當 Claude Code 在沒有人能回應該提示的 `-p` 執行中[拒絕呼叫](/docs/zh-TW/headless#turn-off-permission-prompts-in-unattended-runs)時,Claude 會改為在工具結果中讀到原因。對於 `"deny"`,會向 Claude 顯示。對於 `"allow"` 和 `"defer"`,只會寫入[除錯日誌](#debug-hooks) |2113| `permissionDecisionReason` | 對於 `"ask"`,會在權限提示中向使用者顯示。當 Claude Code 在沒有人能回應該提示的 `-p` 執行中[拒絕呼叫](/docs/zh-TW/headless#turn-off-permission-prompts-in-unattended-runs)時,Claude 會改為在工具結果中讀到原因。對於 `"deny"`,會向 Claude 顯示。對於 `"allow"` 和 `"defer"`,只會寫入[除錯日誌](#debug-hooks) |
2081| `updatedInput` | 在執行前修改工具的輸入參數。會取代整個輸入物件,因此請將未變更的欄位與修改過的欄位一併包含。Claude Code 會根據您 hook 回傳的輸入(而非 Claude 傳送的輸入)評估權限規則,以及 Bash 命令的[自動移至背景資格](/docs/zh-TW/tools-reference#foreground-commands-that-move-to-the-background)。與 `"allow"` 搭配可自動核准,或與 `"ask"` 搭配向使用者顯示修改後的輸入。對於 `"defer"`,會被忽略 |2114| `updatedInput` | 在執行前修改工具的輸入參數。會取代整個輸入物件,因此請將未變更的欄位與修改過的欄位一併包含。Claude Code 會根據您 hook 回傳的輸入(而非 Claude 傳送的輸入)評估權限規則,以及 Bash 命令的[自動移至背景資格](/docs/zh-TW/tools-reference#foreground-commands-that-move-to-the-background)。與 `"allow"` 搭配可自動核准,或與 `"ask"` 搭配向使用者顯示修改後的輸入。對於 `"defer"`,會被忽略 |
2082| `additionalContext` | 與工具結果一同加入 Claude 情境的字串。當 `permissionDecision` 為 `"defer"` 時會被忽略。請參閱[為 Claude 新增情境](#add-context-for-claude) |2115| `additionalContext` | 與工具結果一同加入 Claude 情境的字串。當 `permissionDecision` 為 `"defer"` 時會被忽略。請參閱[為 Claude 新增情境](#add-context-for-claude) |
3717 3750
3718無論決策為何,Claude Code 都會向使用者顯示您的 hook 所傳回的任何 `systemMessage`,因此回報成本的 hook 可以傳回 `{"systemMessage": "..."}` 並以 0 結束。3751無論決策為何,Claude Code 都會向使用者顯示您的 hook 所傳回的任何 `systemMessage`,因此回報成本的 hook 可以傳回 `{"systemMessage": "..."}` 並以 0 結束。
3719 3752
3720未在逾時前回應的 PreModelSwitch hook 會封鎖切換。關於逾時對其他事件的影響,請參閱[逾時](#timeouts)。此事件的預設逾時為 30 秒。`PreModelSwitch` 只執行 `command`、`http` 與 `mcp_tool` hook,因此 `prompt` 與 `agent` 的預設值不適用。3753<h4 id="premodelswitch-timeouts-and-other-exit-codes">
3754 PreModelSwitch 逾時及其他退出碼
3755</h4>
3756
3757在逾時之前未回應的 PreModelSwitch hook 會阻擋切換。此事件的預設逾時為 30 秒。
3721 3758
3722以 0 或 2 以外的代碼結束且未印出 JSON 決策的 hook 屬於非封鎖錯誤,如[其他退出碼](#other-exit-codes)中所述。3759關於 0 或 2 以外的退出碼會產生什麼效果,請參閱[其他退出碼](#other-exit-codes)。
3723 3760
3724<h3 id="postmodelswitch">3761<h3 id="postmodelswitch">
3725 PostModelSwitch3762 PostModelSwitch