SpyBara
Go Premium

Documentation 2026-10-09 23:02 UTC to 2026-10-10 03:59 UTC

19 files changed +451 −103. View all changes and history on the product overview
2026
Sat 10 05:00 Fri 9 23:02 Thu 8 22:58 Wed 7 23:59 Tue 6 23:59 Mon 5 23:58 Sun 4 23:58 Sat 3 23:57 Fri 2 22:59 Thu 1 23:59
Details

124 124 

125未啟用部分訊息時,您會接收除 `StreamEvent` 外的所有訊息類型。常見類型包括 `SystemMessage`(工作階段初始化)、`AssistantMessage`(完整內容區塊)、`ResultMessage`(最終結果)和一個緊湊邊界訊息,指示何時壓縮了對話歷史記錄(TypeScript 中為 `SDKCompactBoundaryMessage`;Python 中為具有子類型 `"compact_boundary"` 的 `SystemMessage`)。125未啟用部分訊息時,您會接收除 `StreamEvent` 外的所有訊息類型。常見類型包括 `SystemMessage`(工作階段初始化)、`AssistantMessage`(完整內容區塊)、`ResultMessage`(最終結果)和一個緊湊邊界訊息,指示何時壓縮了對話歷史記錄(TypeScript 中為 `SDKCompactBoundaryMessage`;Python 中為具有子類型 `"compact_boundary"` 的 `SystemMessage`)。

126 126 

127<h3 id="handle-a-stream-that’s-cut-off">

128 處理被中斷的串流

129</h3>

130 

131如果串流在訊息中途被中斷,例如您中斷了回合或連線中斷時,您仍會在回合結束前收到該訊息的 `message_stop`。被中斷的文字或思考區塊也會收到其 `content_block_stop`。被中斷的工具呼叫則不會,因此如果 `message_stop` 到達時某個工具呼叫的區塊仍處於開啟狀態,請將該呼叫的輸入視為不完整。

132 

133在 Claude Code v2.1.290 之前,被中斷的串流可能會在沒有 `message_stop` 的情況下結束回合,因此您根據串流事件呈現的回覆可能會一直顯示為進行中。TypeScript Agent SDK 從 v0.3.290 起內建 Claude Code v2.1.290 或更新版本,Python Agent SDK 則從 v0.2.164 起內建。如果回合結束後回覆仍一直顯示為進行中,請更新 SDK。

134 

127<h2 id="stream-tool-calls">135<h2 id="stream-tool-calls">

128 串流工具呼叫136 串流工具呼叫

129</h2>137</h2>

Details

1588 1588 

1589請依 `agent_id` 將 subagent 的訊息與其任務事件配對,而不是將訊息的 `parent_tool_use_id` 與任務事件的 `tool_use_id` 配對。當工具呼叫恢復 subagent 時,任務事件會帶有該呼叫的 `tool_use_id`,而訊息則保留最初啟動該 subagent 之工具呼叫的 `parent_tool_use_id`,因此兩者將不再相符。1589請依 `agent_id` 將 subagent 的訊息與其任務事件配對,而不是將訊息的 `parent_tool_use_id` 與任務事件的 `tool_use_id` 配對。當工具呼叫恢復 subagent 時,任務事件會帶有該呼叫的 `tool_use_id`,而訊息則保留最初啟動該 subagent 之工具呼叫的 `parent_tool_use_id`,因此兩者將不再相符。

1590 1590 

1591Claude Code 會在回合的第一個助手訊息上設定 `user_message_uuid` 和 `user_message_uuids`,條件請見 [`user_message_uuid`](#user_message_uuid)。當 Claude Code 重新執行被重新啟動中斷的回合時,重新執行中攜帶這些欄位的助手訊息也會攜帶 [`resume_reason`](#resume_reason)。1591Claude Code 會在符合 [`user_message_uuid`](#user_message_uuid) 所述條件時,於該回合的第一則助理訊息上設定 `user_message_uuid` 和 `user_message_uuids`。當該回合是接續因重新啟動而中斷的回合時,帶有這些欄位的助理訊息也會帶有 [`resume_reason`](#resume_reason)。

1592 1592 

1593`timestamp` 是訊息內容在產生它的程序上完成生成的 ISO 8601 時間。該值來自該機器的時鐘,因此僅用於顯示,不要依其排序訊息。一個 API 回合可以產生多個共用同一 `message.id` 的助手訊息,每個都有自己的 `timestamp`。當欄位不存在時,請改用您收到訊息的時間。1593`timestamp` 是訊息內容在產生它的程序上完成生成的 ISO 8601 時間。該值來自該機器的時鐘,因此僅用於顯示,不要依其排序訊息。一個 API 回合可以產生多個共用同一 `message.id` 的助手訊息,每個都有自己的 `timestamp`。當欄位不存在時,請改用您收到訊息的時間。

1594 1594 


1631 1631 

1632設定 `inline_pastes` 以告訴 Claude Code `message.content` 中哪些部分是使用者貼上而非輸入的,每次貼上對應一個字串。提示詞文字會保留在使用者放置的位置。Claude Code 可能會就地將每個列出的貼上內容包在 `<pasted_content>` 標籤中,讓 Claude 能區分貼上的素材與使用者自己的文字。只有提示詞最後一個文字區塊中的貼上內容會被包裝。需要 TypeScript Agent SDK v0.3.280 或更新版本。1632設定 `inline_pastes` 以告訴 Claude Code `message.content` 中哪些部分是使用者貼上而非輸入的,每次貼上對應一個字串。提示詞文字會保留在使用者放置的位置。Claude Code 可能會就地將每個列出的貼上內容包在 `<pasted_content>` 標籤中,讓 Claude 能區分貼上的素材與使用者自己的文字。只有提示詞最後一個文字區塊中的貼上內容會被包裝。需要 TypeScript Agent SDK v0.3.280 或更新版本。

1633 1633 

1634每個貼上欄位都有大小限制:

1635 

1636* `pasted_content`:若項目加上其中的內容區塊總數超過 1,000,Claude Code 會忽略整個欄位。

1637* `inline_pastes`:Claude Code 使用前 100 個非空白項目,並忽略其餘項目。

1638 

1634設定 `shouldQuery`、`client_composed` 或 `priority`,以變更 Claude Code 處理您所傳送訊息的方式:1639設定 `shouldQuery`、`client_composed` 或 `priority`,以變更 Claude Code 處理您所傳送訊息的方式:

1635 1640 

1636* `shouldQuery`:設定為 `false` 以將訊息附加到逐字稿,而不觸發助手回合。訊息會被保留,並合併到下一個會觸發回合的使用者訊息中。使用此方式注入上下文,例如您在頻外執行之命令的輸出,而不必為此花費一次模型呼叫。1641* `shouldQuery`:設定為 `false` 以將訊息附加到逐字稿,而不觸發助手回合。訊息會被保留,並合併到下一個會觸發回合的使用者訊息中。使用此方式注入上下文,例如您在頻外執行之命令的輸出,而不必為此花費一次模型呼叫。


1775* `ttft_stream_ms`:直到第一個 `message_start` 串流事件(即回應串流開啟時)的時間(毫秒)。低於 `ttft_ms`;兩者之間的差距是串流第一個訊息所花費的時間。僅在成功分支上存在。1780* `ttft_stream_ms`:直到第一個 `message_start` 串流事件(即回應串流開啟時)的時間(毫秒)。低於 `ttft_ms`;兩者之間的差距是串流第一個訊息所花費的時間。僅在成功分支上存在。

1776* `user_message_uuid`:此回合所回答的、您傳送之訊息的 `uuid`。請參閱 [`user_message_uuid`](#user_message_uuid) 以了解哪些結果會攜帶它。1781* `user_message_uuid`:此回合所回答的、您傳送之訊息的 `uuid`。請參閱 [`user_message_uuid`](#user_message_uuid) 以了解哪些結果會攜帶它。

1777* `user_message_uuids`:Claude Code 在此回合中回答的、您傳送之每則訊息的 `uuid`。請參閱 [`user_message_uuids`](#user_message_uuids)。1782* `user_message_uuids`:Claude Code 在此回合中回答的、您傳送之每則訊息的 `uuid`。請參閱 [`user_message_uuids`](#user_message_uuids)。

1778* `resume_reason`:Claude Code 在重新啟動中斷此回合後重新執行它的原因。存在於兩個分支。請參閱 [`resume_reason`](#resume_reason)。1783* `resume_reason`:此回合為何接續因重新啟動而中斷的回合。出現在兩個分支上。請參閱 [`resume_reason`](#resume_reason)。

1779* `local_command`:回合所分派之命令的名稱,出現在由命令完成、未進入 agent 迴圈之回合的成功結果上,例如 `/compact`。名稱會轉為小寫字母和底線,因此 `/reload-plugins` 回報為 `reload_plugins`。由 MCP 伺服器提供的命令以及內建的 `/mcp` 回報為 `mcp`。您自行定義的命令回報為 `custom`。引數永遠不會包含在內。在每個進入 agent 迴圈的回合上,以及在未執行任何命令的傳送上,此欄位不存在。需要 Agent SDK v0.3.268 或更新版本。1784* `local_command`:回合所分派之命令的名稱,出現在由命令完成、未進入 agent 迴圈之回合的成功結果上,例如 `/compact`。名稱會轉為小寫字母和底線,因此 `/reload-plugins` 回報為 `reload_plugins`。由 MCP 伺服器提供的命令以及內建的 `/mcp` 回報為 `mcp`。您自行定義的命令回報為 `custom`。引數永遠不會包含在內。在每個進入 agent 迴圈的回合上,以及在未執行任何命令的傳送上,此欄位不存在。需要 Agent SDK v0.3.268 或更新版本。

1780* `request_sent_wall_ms`:Claude Code 分派 API 請求時的紀元毫秒,用於與伺服器端時間戳記進行對照。僅與 [`user_message_uuid`](#user_message_uuid) 一起存在,出現在 `is_error` 為 false、且其回合傳送了 API 請求的成功結果上。1785* `request_sent_wall_ms`:Claude Code 分派 API 請求時的紀元毫秒,用於與伺服器端時間戳記進行對照。僅與 [`user_message_uuid`](#user_message_uuid) 一起存在,出現在 `is_error` 為 false、且其回合傳送了 API 請求的成功結果上。

1781* `first_content_frame_ms`:直到第一個 `content_block_start` 或 `content_block_delta` 串流事件的時間(毫秒),思考區塊也計為內容。僅在成功分支上、`is_error` 為 false 時存在。需要 Agent SDK v0.3.260 或更新版本。1786* `first_content_frame_ms`:直到第一個 `content_block_start` 或 `content_block_delta` 串流事件的時間(毫秒),思考區塊也計為內容。僅在成功分支上、`is_error` 為 false 時存在。需要 Agent SDK v0.3.260 或更新版本。


1825 1830 

1826* **您傳送的一般訊息**,即不帶 `isSynthetic: true` 的訊息:回合在整個執行過程中都回答該訊息。當您在短時間內傳送多則訊息時,Claude Code 可以將它們合併為一個回合,此時該欄位僅攜帶最後一則訊息的 `uuid`。若要將回覆與任何一則被合併的訊息對應,請使用 [`user_message_uuids`](#user_message_uuids)。1831* **您傳送的一般訊息**,即不帶 `isSynthetic: true` 的訊息:回合在整個執行過程中都回答該訊息。當您在短時間內傳送多則訊息時,Claude Code 可以將它們合併為一個回合,此時該欄位僅攜帶最後一則訊息的 `uuid`。若要將回覆與任何一則被合併的訊息對應,請使用 [`user_message_uuids`](#user_message_uuids)。

1827* **您以 `isSynthetic: true` 傳送的訊息**:回合一開始回答該訊息。如果 Claude Code 在工具呼叫之間接收到您的一般訊息,回合從那時起改為回答所接收的訊息。回傳合成訊息的 `uuid` 需要 Agent SDK v0.3.265 或更新版本;較早的版本在合成回合上不會回傳任何內容。1832* **您以 `isSynthetic: true` 傳送的訊息**:回合一開始回答該訊息。如果 Claude Code 在工具呼叫之間接收到您的一般訊息,回合從那時起改為回答所接收的訊息。回傳合成訊息的 `uuid` 需要 Agent SDK v0.3.265 或更新版本;較早的版本在合成回合上不會回傳任何內容。

1828* **Claude Code 在 [`CLAUDE_CODE_RESUME_INTERRUPTED_TURN`](/docs/zh-TW/env-vars) 下為重新執行中斷回合而產生的提示詞**:當中斷回合的最後一個提示詞是您傳送的一般訊息時,無論它是開啟該回合,還是 Claude Code 在回合期間接收到的,重新執行一開始都會回答該訊息。[`resume_reason`](#resume_reason) 可用來區分重新執行的框架與中斷嘗試的框架。當最後一個提示詞不是您的一般訊息時,重新執行一開始不回答您的任何訊息。如果 Claude Code 在工具呼叫之間接收到您的一般訊息,回合從那時起改為回答所接收的訊息。回傳中斷回合的提示詞需要 Agent SDK v0.3.268 或更新版本。1833* **Claude Code 在 [`CLAUDE_CODE_RESUME_INTERRUPTED_TURN`](/docs/zh-TW/env-vars) 下為接續中斷回合而產生的提示詞**:當中斷回合的最後一個提示詞是您傳送的一般訊息時(無論它是開啟了該回合,或是 Claude Code 在回合中接收的),接續的回合一開始回答該訊息。[`resume_reason`](#resume_reason) 可區分接續回合的框架與中斷嘗試的框架。當最後一個提示詞不是您的一般訊息時,接續的回合一開始不回答您的任何訊息。若 Claude Code 在工具呼叫之間接收了您的一般訊息,回合從那時起便回答所接收的訊息。回傳中斷回合的提示詞需要 Agent SDK v0.3.268 或更新版本。

1829* **Claude Code 自行產生的任何其他提示詞**:回合一開始不回答您的任何訊息,其框架不攜帶任何回傳值。如果 Claude Code 在工具呼叫之間接收到您的一般訊息,回合從那時起回答該訊息。接收時的回傳需要 Agent SDK v0.3.265 或更新版本;較早的版本在這些回合上不會回傳任何內容。1834* **Claude Code 自行產生的任何其他提示詞**:回合一開始不回答您的任何訊息,其框架不攜帶任何回傳值。如果 Claude Code 在工具呼叫之間接收到您的一般訊息,回合從那時起回答該訊息。接收時的回傳需要 Agent SDK v0.3.265 或更新版本;較早的版本在這些回合上不會回傳任何內容。

1830 1835 

1831Claude Code 會在三種框架上回傳所回答訊息的 `uuid`:1836Claude Code 會在三種框架上回傳所回答訊息的 `uuid`:


1857 `resume_reason`1862 `resume_reason`

1858</h4>1863</h4>

1859 1864 

1860Claude Code 在重新啟動後重新執行此回合的原因。Claude Code 會在它依 [`CLAUDE_CODE_RESUME_INTERRUPTED_TURN`](/docs/zh-TW/env-vars) 重新執行的回合上設定此欄位,讓您能區分重新執行的回覆和結果與中斷嘗試的回覆和結果。需要 Agent SDK v0.3.268 或更新版本。1865此回合為何接續因重新啟動而中斷的回合。Claude Code 會在 [`CLAUDE_CODE_RESUME_INTERRUPTED_TURN`](/docs/zh-TW/env-vars) 下接續中斷回合的回合上設定此欄位,讓您能區分接續回合的回覆和結果與中斷嘗試的回覆和結果。需要 Agent SDK v0.3.268 或更新版本。

1861 1866 

1862Claude Code 會在兩種框架上設定此欄位:1867Claude Code 會在兩種框架上設定此欄位:

1863 1868 

1864* **重新執行的結果**:在成功和錯誤分支上皆然,無論結果是否攜帶 `user_message_uuid`。1869* **接續回合的結果**:成功和錯誤分支皆然,無論結果是否帶有 `user_message_uuid`。

1865* **重新執行的回覆框架**:即攜帶 [`user_message_uuid`](#user_message_uuid) 的那些框架。1870* **接續回合的回覆框架**:帶有 [`user_message_uuid`](#user_message_uuid) 的那些框架。

1866 1871 

1867其值是一個簡短的小寫 token,指名回合被重新執行的原因,例如 `interrupted_turn`。1872其值是一個簡短的小寫 token,例如 `interrupted_turn`。

1868 1873 

1869<h4 id="queued_turn_count">1874<h4 id="queued_turn_count">

1870 `queued_turn_count`1875 `queued_turn_count`


2029};2034};

2030```2035```

2031 2036 

2032Claude Code 會在回合的第一個非 ping 串流事件上設定 `user_message_uuid` 和 `user_message_uuids`,並在回合所回答的訊息變更時再次設定,條件請見 [`user_message_uuid`](#user_message_uuid)。當 Claude Code 重新執行被重新啟動中斷的回合時,重新執行中攜帶這些欄位的串流事件也會攜帶 [`resume_reason`](#resume_reason)。2037Claude Code 會在符合 [`user_message_uuid`](#user_message_uuid) 所述條件時,於回合中第一個非 ping 的串流事件上設定 `user_message_uuid` 和 `user_message_uuids`,並在回合所回答的訊息改變時再次設定。當該回合是接續因重新啟動而中斷的回合時,帶有這些欄位的串流事件也會帶有 [`resume_reason`](#resume_reason)。

2033 2038 

2034<h3 id="sdkcompactboundarymessage">2039<h3 id="sdkcompactboundarymessage">

2035 `SDKCompactBoundaryMessage`2040 `SDKCompactBoundaryMessage`


3559| - | - | - |3564| - | - | - |

3560| `script` | `string` | 內嵌工作流程指令碼。必須以 `export const meta = { name, description }` 作為字面值開始,後面跟著使用 `agent()`、`parallel()`、`pipeline()` 和 `phase()` 的指令碼主體。`meta` 中的選擇性 `phases` 陣列在進度檢視中將 agent 分組到具名階段下 |3565| `script` | `string` | 內嵌工作流程指令碼。必須以 `export const meta = { name, description }` 作為字面值開始,後面跟著使用 `agent()`、`parallel()`、`pipeline()` 和 `phase()` 的指令碼主體。`meta` 中的選擇性 `phases` 陣列在進度檢視中將 agent 分組到具名階段下 |

3561| `name` | `string` | 內建工作流程的名稱或儲存在 `.claude/workflows/` 中的工作流程名稱。解析為指令碼 |3566| `name` | `string` | 內建工作流程的名稱或儲存在 `.claude/workflows/` 中的工作流程名稱。解析為指令碼 |

3562| `scriptPath` | `string` | 磁碟上工作流程指令碼檔案的路徑。優先於 `script` 和 `name`。Claude Code 保留每次呼叫的指令碼並在結果中傳回路徑,因此您可以編輯該檔案並使用相同的 `scriptPath` 重新呼叫以進行迭代 |3567| `scriptPath` | `string` | 磁碟上工作流程指令碼檔案的路徑,例如先前執行所傳回的 `scriptPath`。優先於 `script` 和 `name`。當工作階段的工具不包含 `Read` 時,Claude Code 會以錯誤拒絕 `scriptPath` |

3563| `args` | `unknown` | 輸入值,作為全域 `args` 公開給指令碼,用於參數化的具名工作流程,例如研究問題或檔案路徑清單。將陣列和物件作為實際 JSON 值傳遞,而不是 JSON 編碼的字串 |3568| `args` | `unknown` | 輸入值,作為全域 `args` 公開給指令碼,用於參數化的具名工作流程,例如研究問題或檔案路徑清單。將陣列和物件作為實際 JSON 值傳遞,而不是 JSON 編碼的字串 |

3564| `resumeFromRunId` | `string` | 先前 `Workflow` 呼叫的執行 ID 以繼續。具有未變更輸入的已完成 `agent()` 呼叫通常傳回快取結果;其餘的執行即時。[暫停後繼續](/docs/zh-TW/workflows#resume-after-a-pause)涵蓋哪些已完成的呼叫會重新執行。僅限同一工作階段 |3569| `resumeFromRunId` | `string` | 先前 `Workflow` 呼叫的執行 ID 以繼續。具有未變更輸入的已完成 `agent()` 呼叫通常傳回快取結果;其餘的執行即時。[暫停後繼續](/docs/zh-TW/workflows#resume-after-a-pause)涵蓋哪些已完成的呼叫會重新執行。僅限同一工作階段 |

3565| `title` | `string` | 被忽略;指令碼的 `meta` 區塊設定標題 |3570| `title` | `string` | 被忽略;指令碼的 `meta` 區塊設定標題 |

chrome.md +3 −4

Details

129 VS Code 工作階段中的權限提示129 VS Code 工作階段中的權限提示

130</h3>130</h3>

131 131 

132在 VS Code 工作階段中,Claude Code 是否會在瀏覽器操作前詢問您,取決於該工作階段連線到瀏覽器的方式:132在 VS Code 工作階段中,當 Claude Code 在瀏覽器操作前詢問您時,提示會以卡片形式顯示在聊天面板中。當該操作的目標是您尚未允許的網站時,卡片也會提供允許該網站的選項。

133 133 

134* **您輸入了 `@browser`**:擴充功能會批准 Claude Code 原本會詢問您的每個瀏覽器操作。134在因[預設啟用](#enable-chrome-by-default)已開啟而於啟動時連線到瀏覽器的工作階段中,在 Manual、Edit automatically、Auto 和 Bypass permissions 模式下,Claude Code 都會在您尚未允許的網站上執行瀏覽器操作前詢問您。在 Auto 和 Bypass permissions 模式下,此行為會持續到您在該工作階段中輸入 `@browser` 為止。

135* **由[預設啟用](#enable-chrome-by-default)設定在啟動時連線**:在 Manual、Edit automatically、Auto 和 Bypass permissions 模式下,Claude Code 都會在您尚未允許的網站上執行瀏覽器操作前詢問您,直到您在該工作階段中輸入 `@browser` 為止。

136 135 

137<h3 id="browser-tools-in-plan-mode">136<h3 id="browser-tools-in-plan-mode">

138 plan mode 中的瀏覽器工具137 plan mode 中的瀏覽器工具

139</h3>138</h3>

140 139 

141在 [plan mode](/docs/zh-TW/permission-modes#analyze-before-you-edit-with-plan-mode) 中,Claude 錄製 GIF、開啟新分頁或執行捷徑之前,會出現權限提示,但在您輸入了 [`@browser`](#permission-prompts-in-vs-code-sessions) 的 VS Code 工作階段中除外。在互動式 CLI 工作階段中,如果[可使用略過權限模式](/docs/zh-TW/permission-modes#skip-all-checks-with-bypasspermissions-mode),且[功能旗標擷取](/docs/zh-TW/env-vars#features-that-need-feature-flag-fetching)已關閉,這些呼叫會在無提示的情況下執行。140在 [plan mode](/docs/zh-TW/permission-modes#analyze-before-you-edit-with-plan-mode) 中,Claude 錄製 GIF、開啟新分頁或執行捷徑之前,會出現權限提示。在互動式 CLI 工作階段中,如果[可使用略過權限模式](/docs/zh-TW/permission-modes#skip-all-checks-with-bypasspermissions-mode),且[功能旗標擷取](/docs/zh-TW/env-vars#features-that-need-feature-flag-fetching)已關閉,這些呼叫會在無提示的情況下執行。

142 141 

143`tabs_context_mcp` 呼叫在設定 `createIfEmpty` 時也會提示,包含上述任一操作的 `browser_batch` 呼叫亦同。142`tabs_context_mcp` 呼叫在設定 `createIfEmpty` 時也會提示,包含上述任一操作的 `browser_batch` 呼叫亦同。

144 143 

Details

979 * **混用鍵**:同時含有 `code` 與 `cli`(或其較早的寫法 `settings`)的檔案會使閘道在啟動時停止。請在一次編輯中將所有區塊放在同一個鍵下。979 * **混用鍵**:同時含有 `code` 與 `cli`(或其較早的寫法 `settings`)的檔案會使閘道在啟動時停止。請在一次編輯中將所有區塊放在同一個鍵下。

980</Warning>980</Warning>

981 981 

982原則的 Claude Code 設定(例如拒絕讀取 `.env` 檔案的規則)放在 `cli` 或 `code` 鍵下的區塊中。兩個鍵接受相同的內容。鍵決定設定在何處執行:982政策的 Claude Code 設定(例如拒絕讀取 `.env` 檔案的規則)放在 `cli` 或 `code` 鍵之下的區塊中。`code` 是建議使用的鍵,`cli` 是舊版鍵。兩個鍵接受相同的內容。鍵決定設定在哪裡執行:

983 983 

984* **`cli`**:終端機、VS Code 與 JetBrains 擴充功能,以及 Agent SDK。使用 `cli` 時,Claude Desktop 的 Code 分頁會取得[衍生設定](#claude-desktop-overlay),因此像 `Read(./.env)` 這類有範圍的規則在那裡不會阻止使用者。984* **`cli`**:終端機、VS Code 與 JetBrains 擴充功能,以及 Agent SDK。使用 `cli` 時,Claude Desktop 的 Code 分頁會取得[衍生設定](#claude-desktop-overlay),因此像 `Read(./.env)` 這類有範圍的規則在那裡不會阻止使用者。

985* **`code`**:相同的位置,並且也可以涵蓋 Claude Desktop 的 Code 分頁。985* **`code`**:相同的位置,並且也可以涵蓋 Claude Desktop 的 Code 分頁。

986 986 

987要選擇的是這些設定是否也應涵蓋 Code 分頁。若不需要,則不必變更任何東西。使用 `cli` 的檔案會照常運作,而閘道若在帶有 [`desktop`](#claude-desktop-overlay) 鍵的原則中發現 `cli`,會在啟動時發出警告但仍會啟動。若要涵蓋 Code 分頁,請改用建議的鍵 `code`。987使用 `cli` 的檔案會照舊運作;若閘道在具有 [`desktop`](#claude-desktop-overlay) 鍵的政策中發現 `cli`,會在啟動時發出警告並照常啟動。請切換為 `code`,讓設定也能涵蓋 Code 分頁。

988 988 

989切換之前,請先閱讀[在 Code 分頁中套用 `code` 設定](#apply-code-settings-in-the-code-tab)。原則需要 `desktop` 鍵,且使用者的電腦需要先完成設定,設定才會在那裡生效,而且 Claude Desktop 中的網路搜尋會被關閉。989切換之前,請先閱讀[在 Code 分頁中套用 `code` 設定](#apply-code-settings-in-the-code-tab)。原則需要 `desktop` 鍵,且使用者的電腦需要先完成設定,設定才會在那裡生效,而且 Claude Desktop 中的網路搜尋會被關閉。

990 990 

Details

277 277 

278當執行緒的模型支援時,執行緒在 [auto mode](/docs/zh-TW/permission-modes#eliminate-prompts-with-auto-mode) 中執行,因此大多數工具呼叫執行而不詢問您。當執行緒需要您的批准時,提示在該執行緒內,執行緒等待直到您在那裡回答。在 project 對話中告訴 Claude 繼續不會到達它。278當執行緒的模型支援時,執行緒在 [auto mode](/docs/zh-TW/permission-modes#eliminate-prompts-with-auto-mode) 中執行,因此大多數工具呼叫執行而不詢問您。當執行緒需要您的批准時,提示在該執行緒內,執行緒等待直到您在那裡回答。在 project 對話中告訴 Claude 繼續不會到達它。

279 279 

280每個批准涵蓋該提示,或如果您選擇更廣泛的選項,則涵蓋該執行緒的其餘部分。要讓每個執行緒執行某些命令而不詢問,或阻止某些,請將 [permission rules](/docs/zh-TW/permissions) 添加到儲存庫的 `.claude/settings.json`。執行緒僅在有一個儲存庫的 project 中應用它們;請參閱 [執行緒從您的儲存庫中選擇什麼](#what-threads-pick-up-from-your-repositories)。在有多個儲存庫的 project 中,沒有儲存庫的權限規則到達雲端執行緒,因此您依賴 auto mode 和您在每個執行緒內給出的批准。280每次核准涵蓋該權限提示,或者如果您選擇更廣泛的選項,則涵蓋該執行緒的其餘部分。

281 

282要讓每個執行緒執行某些命令而不詢問,或封鎖某些命令,請將[權限規則](/docs/zh-TW/permissions)新增到儲存庫的 `.claude/settings.json`。請確認您 project 中的雲端執行緒會套用它們:

283 

284* **一個儲存庫**:雲端執行緒會套用這些規則。請參閱[執行緒從您的儲存庫中取得什麼](#what-threads-pick-up-from-your-repositories)。

285* **多個儲存庫,Anthropic 託管的環境**:沒有任何儲存庫的權限規則會傳達到雲端執行緒,因此您依賴自動模式以及您在每個執行緒內給予的核准。

286* **多個儲存庫,自行託管的環境**:請參閱[哪個儲存庫的設定會套用](/docs/zh-TW/self-hosted-environments-configuration#repository-settings-in-sessions-with-several-repositories)。

281 287 

282<h3 id="run-a-thread-on-your-own-computer">288<h3 id="run-a-thread-on-your-own-computer">

283 在您自己的電腦上執行執行緒289 在您自己的電腦上執行執行緒


381 執行緒從您的儲存庫中取得什麼387 執行緒從您的儲存庫中取得什麼

382</h3>388</h3>

383 389 

384每個雲端執行緒複製專案中的每個儲存庫,並從所有儲存庫載入 `CLAUDE.md` 和技能。權限規則、hooks 和 `env` 僅來自執行緒啟動所在目錄中的 `.claude/settings.json`:當專案有一個時在儲存庫內,當它有多個時在複製上方,其中沒有儲存庫的檔案被讀取用於它們。390每個雲端執行緒複製專案中的每個儲存庫,並從所有儲存庫載入 `CLAUDE.md` 和 skill。權限規則、hook 和 `env` 僅來自執行緒啟動所在目錄中的 `.claude/settings.json`。

385 391 

386| 在每個儲存庫中 | 一個儲存庫 | 多個儲存庫 |392| 在每個儲存庫中 | 一個儲存庫 | 多個儲存庫 |

387| :- | :- | :- |393| :- | :- | :- |

388| `CLAUDE.md` | 在執行緒啟動時載入 | 在執行緒啟動時從每個儲存庫載入 |394| `CLAUDE.md` | 在執行緒啟動時載入 | 在執行緒啟動時從每個儲存庫載入 |

389| `.claude/` 下的技能、代理和命令 | 已載入 | 從每個儲存庫載入 |395| `.claude/` 下的技能、代理和命令 | 已載入 | 從每個儲存庫載入 |

390| 在 `.claude/settings.json` 中啟用的外掛程式 | 未載入。改為在**專案設定 > 外掛程式**中新增外掛程式 | 未載入。改為在**專案設定 > 外掛程式**中新增外掛程式 |396| 在 `.claude/settings.json` 中啟用的外掛程式 | 未載入。改為在**專案設定 > 外掛程式**中新增外掛程式 | 未載入。改為在**專案設定 > 外掛程式**中新增外掛程式 |

391| 在 `.claude/settings.json` 中定義的權限規則、hooks 和 `env` | 套用到執行緒,除了[沒有雲端工作階段遵守](/docs/zh-TW/cloud-environments#what-carries-over-from-your-setup)的 `env` 鍵 | 不套用 |397| 在 `.claude/settings.json` 中定義的權限規則、hook 和 `env` | 套用到執行緒,除了[沒有雲端工作階段遵守](/docs/zh-TW/cloud-environments#what-carries-over-from-your-setup)的 `env` 鍵 | 在 Anthropic 託管的環境中不套用。對於自行託管的環境,請參閱[套用哪個儲存庫的設定](/docs/zh-TW/self-hosted-environments-configuration#repository-settings-in-sessions-with-several-repositories) |

392 398 

393在具有多個儲存庫的專案中,每個複製都附加到執行緒作為[其他目錄](/docs/zh-TW/memory#load-from-additional-directories),啟用了 `CLAUDE.md` 載入,這就是為什麼每個儲存庫的 `CLAUDE.md` 和技能在啟動時載入,儘管執行緒在它們上方啟動。在這樣的專案中,將常設規則放在專案指示中,並通過[雲端環境](#choose-an-environment-for-threads)為執行緒提供環境變數。399在具有多個儲存庫的專案中,將常設規則放在專案指示中,並通過[雲端環境](#choose-an-environment-for-threads)為執行緒提供環境變數。

394 400 

395<h3 id="choose-an-environment-for-threads">401<h3 id="choose-an-environment-for-threads">

396 為執行緒選擇環境402 為執行緒選擇環境


406 412 

407雲端執行緒沒有僅在您的機器上安裝的技能、MCP 伺服器、外掛程式和工具。通過[遠端控制](/docs/zh-TW/remote-control)在您的機器上執行的執行緒使用那裡安裝的內容。要使這些中的每一個對雲端執行緒可用:413雲端執行緒沒有僅在您的機器上安裝的技能、MCP 伺服器、外掛程式和工具。通過[遠端控制](/docs/zh-TW/remote-control)在您的機器上執行的執行緒使用那裡安裝的內容。要使這些中的每一個對雲端執行緒可用:

408 414 

409* 技能、子代理和命令:將它們提交到您新增到專案的儲存庫,例如 `.claude/skills/<skill-name>/SKILL.md` 中的技能。每個雲端執行緒複製專案中的每個儲存庫,並從每個儲存庫載入 `.claude/skills/`、`.claude/agents/` 和 `.claude/commands/`,因此提交到一個儲存庫的技能在每個雲端執行緒中可用。雲端執行緒也載入您為 claude.ai 帳戶啟用的技能。415* Skill、subagent 和命令:將它們提交到您新增到專案的儲存庫,例如 `.claude/skills/<skill-name>/SKILL.md` 中的 skill。每個雲端執行緒複製專案中的每個儲存庫,並從每個儲存庫載入 `.claude/skills/`、`.claude/agents/` 和 `.claude/commands/`,因此提交到一個儲存庫的 skill 在每個雲端執行緒中可用。雲端執行緒也載入[您為 claude.ai 帳戶啟用的 skill](/docs/zh-TW/skills#skills-in-cowork-and-cloud-sessions)。

410* 外掛程式:在**專案設定 > 外掛程式**中新增它們;它們載入到每個新雲端執行緒。儲存庫在其 `.claude/settings.json` 中宣告的外掛程式[不會在雲端執行緒中載入](/docs/zh-TW/cloud-environments#what-carries-over-from-your-setup)。416* 外掛程式:在**專案設定 > 外掛程式**中新增它們;它們載入到每個新雲端執行緒。儲存庫在其 `.claude/settings.json` 中宣告的外掛程式[不會在雲端執行緒中載入](/docs/zh-TW/cloud-environments#what-carries-over-from-your-setup)。

411* MCP 伺服器:雲端執行緒從您的 claude.ai 帳戶上的連接器獲取其 MCP 工具,這些是您在 [claude.ai/customize/connectors](https://claude.ai/customize/connectors) 或通過**專案設定 > 環境**中的**管理連接器**連結連接一次的 MCP 伺服器。每個雲端執行緒可以使用所有它們,無需每個專案的設定。專案對話本身沒有連接器,因此將需要連接器的工作作為雲端執行緒的任務傳送。在具有一個儲存庫的專案中,雲端執行緒也從該儲存庫的 [`.mcp.json`](/docs/zh-TW/cloud-environments#what-carries-over-from-your-setup) 載入 MCP 伺服器。[連接器如何到達 Claude Code](/docs/zh-TW/mcp#how-connectors-reach-claude-code) 列出雲端工作階段的規則和關閉連接器的設定。417* MCP 伺服器:雲端執行緒從您的 claude.ai 帳戶上的連接器獲取其 MCP 工具,這些是您在 [claude.ai/customize/connectors](https://claude.ai/customize/connectors) 或通過**專案設定 > 環境**中的**管理連接器**連結連接一次的 MCP 伺服器。每個雲端執行緒可以使用所有它們,無需每個專案的設定。專案對話本身沒有連接器,因此將需要連接器的工作作為雲端執行緒的任務傳送。在具有一個儲存庫的專案中,雲端執行緒也從該儲存庫的 [`.mcp.json`](/docs/zh-TW/cloud-environments#what-carries-over-from-your-setup) 載入 MCP 伺服器。[連接器如何到達 Claude Code](/docs/zh-TW/mcp#how-connectors-reach-claude-code) 列出雲端工作階段的規則和關閉連接器的設定。

412* 命令列工具和套件:在環境的[設定指令碼](/docs/zh-TW/cloud-environments#setup-scripts)中安裝它們。418* 命令列工具和套件:在環境的[設定指令碼](/docs/zh-TW/cloud-environments#setup-scripts)中安裝它們。

Details

108| `--maintenance` | 在工作階段之前使用 `maintenance` 匹配器執行[設定 hooks](/docs/zh-TW/hooks#setup)(僅列印模式) | `claude -p --maintenance "query"` |108| `--maintenance` | 在工作階段之前使用 `maintenance` 匹配器執行[設定 hooks](/docs/zh-TW/hooks#setup)(僅列印模式) | `claude -p --maintenance "query"` |

109| `--max-budget-usd` | 一旦 API 呼叫的估計支出達到此金額即停止執行(僅列印模式)。Claude Code 會依據其[用戶端成本估算](/docs/zh-TW/agent-sdk/cost-tracking#estimates-not-billing)檢查上限,這可能與您的帳單不同。來自 [subagent](/docs/zh-TW/sub-agents) 的支出計入上限。支出可能會超過上限,因此請[保留餘裕](/docs/zh-TW/agent-sdk/agent-loop#budget-headroom)。當您使用 `--continue` 或 `--resume` 返回對話時,[從較早的執行還原](/docs/zh-TW/agent-sdk/cost-tracking#accumulate-costs-across-multiple-calls)的總計不計入上限。一旦支出達到上限,產生另一個 subagent 會失敗並出現 `Budget limit reached`,且 Claude Code 會停止仍在執行的背景 subagent;上限強制行為需要 Claude Code v2.1.217 或更新版本 | `claude -p --max-budget-usd 5.00 "query"` |109| `--max-budget-usd` | 一旦 API 呼叫的估計支出達到此金額即停止執行(僅列印模式)。Claude Code 會依據其[用戶端成本估算](/docs/zh-TW/agent-sdk/cost-tracking#estimates-not-billing)檢查上限,這可能與您的帳單不同。來自 [subagent](/docs/zh-TW/sub-agents) 的支出計入上限。支出可能會超過上限,因此請[保留餘裕](/docs/zh-TW/agent-sdk/agent-loop#budget-headroom)。當您使用 `--continue` 或 `--resume` 返回對話時,[從較早的執行還原](/docs/zh-TW/agent-sdk/cost-tracking#accumulate-costs-across-multiple-calls)的總計不計入上限。一旦支出達到上限,產生另一個 subagent 會失敗並出現 `Budget limit reached`,且 Claude Code 會停止仍在執行的背景 subagent;上限強制行為需要 Claude Code v2.1.217 或更新版本 | `claude -p --max-budget-usd 5.00 "query"` |

110| `--max-turns` | 限制代理程式轉數(僅列印模式)。達到限制時結束並出現錯誤。預設無限制。使用 `--input-format stream-json` 時,當限制結束轉時,仍在佇列中的訊息會保持佇列並以自己的限制啟動新轉 | `claude -p --max-turns 3 "query"` |110| `--max-turns` | 限制代理程式轉數(僅列印模式)。達到限制時結束並出現錯誤。預設無限制。使用 `--input-format stream-json` 時,當限制結束轉時,仍在佇列中的訊息會保持佇列並以自己的限制啟動新轉 | `claude -p --max-turns 3 "query"` |

111| `--mcp-config` | 從 JSON 檔案或字串載入 MCP 伺服器(以空格分隔)。當您使用 `-p` 傳遞此旗標時,Claude Code 會等待仍在擱置的伺服器連線,直到 [`MCP_TIMEOUT`](/docs/zh-TW/env-vars) 啟動逾時(預設 30 秒);具有[快取工具清單](/docs/zh-TW/mcp#managing-your-servers)的伺服器會跳過等待並在首次使用時連線。等待需要 Claude Code v2.1.221 或更新版本 | `claude --mcp-config ./mcp.json` |111| `--mcp-config` | 從 JSON 檔案或字串載入 MCP 伺服器(以空格分隔)。當您使用 `-p` 傳遞此旗標時,Claude Code 會在執行第一個回合之前等待仍在擱置的伺服器連線,直到 [`MCP_TIMEOUT`](/docs/zh-TW/env-vars) 啟動逾時(預設 30 秒);具有[快取工具清單](/docs/zh-TW/mcp#managing-your-servers)的伺服器會跳過等待並在首次使用時連線。在[自託管環境](/docs/zh-TW/self-hosted-environments-configuration#connection-timing)中,則改為套用較短的等待時間。等待需要 Claude Code v2.1.221 或更新版本 | `claude --mcp-config ./mcp.json` |

112| `--model` | 使用[模型別名](/docs/zh-TW/model-config#model-aliases)(例如 `sonnet`、`opus`、`haiku` 或 `fable`)或模型的完整名稱為目前工作階段設定模型。覆蓋 [`model`](/docs/zh-TW/settings-reference#model) 設定和 [`ANTHROPIC_MODEL`](/docs/zh-TW/model-config#environment-variables) | `claude --model claude-sonnet-5` |112| `--model` | 使用[模型別名](/docs/zh-TW/model-config#model-aliases)(例如 `sonnet`、`opus`、`haiku` 或 `fable`)或模型的完整名稱為目前工作階段設定模型。覆蓋 [`model`](/docs/zh-TW/settings-reference#model) 設定和 [`ANTHROPIC_MODEL`](/docs/zh-TW/model-config#environment-variables) | `claude --model claude-sonnet-5` |

113| `--name`, `-n` | 為工作階段設定顯示名稱,顯示在 `/resume` 和終端機標題中。您可以使用 `claude --resume <name>` 恢復命名的工作階段。在互動工作階段中,如果此機器上的另一個即時工作階段已使用該名稱,Claude Code 會改為套用[它的變體](/docs/zh-TW/sessions#name-your-sessions)。<br /><br />[`/rename`](/docs/zh-TW/commands)在工作階段中期變更名稱,也會在提示列上顯示它 | `claude -n "my-feature-work"` |113| `--name`, `-n` | 為工作階段設定顯示名稱,顯示在 `/resume` 和終端機標題中。您可以使用 `claude --resume <name>` 恢復命名的工作階段。在互動工作階段中,如果此機器上的另一個即時工作階段已使用該名稱,Claude Code 會改為套用[它的變體](/docs/zh-TW/sessions#name-your-sessions)。<br /><br />[`/rename`](/docs/zh-TW/commands)在工作階段中期變更名稱,也會在提示列上顯示它 | `claude -n "my-feature-work"` |

114| `--no-chrome` | 為此工作階段停用 [Chrome 瀏覽器整合](/docs/zh-TW/chrome) | `claude --no-chrome` |114| `--no-chrome` | 為此工作階段停用 [Chrome 瀏覽器整合](/docs/zh-TW/chrome) | `claude --no-chrome` |

Details

314| 在您儲存庫的 `.claude/settings.json` 中宣告的外掛程式和市集 | 否 | 雲端工作階段不會安裝儲存庫在 [`enabledPlugins`](/docs/zh-TW/settings-reference#enabledplugins) 下開啟的外掛程式,包括來自它在 [`extraKnownMarketplaces`](/docs/zh-TW/settings-reference#extraknownmarketplaces) 下列出的市集的外掛程式 |314| 在您儲存庫的 `.claude/settings.json` 中宣告的外掛程式和市集 | 否 | 雲端工作階段不會安裝儲存庫在 [`enabledPlugins`](/docs/zh-TW/settings-reference#enabledplugins) 下開啟的外掛程式,包括來自它在 [`extraKnownMarketplaces`](/docs/zh-TW/settings-reference#extraknownmarketplaces) 下列出的市集的外掛程式 |

315| 您的組織的[伺服器管理的設定](/docs/zh-TW/server-managed-settings) | 是,除了在 [Claude Tag](https://claude.com/docs/claude-tag/overview) 工作階段中 | 在工作階段開始時從 Anthropic 的伺服器擷取。請參閱[使用介面涵蓋範圍](/docs/zh-TW/model-config#surface-coverage)以了解 `availableModels` 如何在雲端工作階段中強制執行。透過 MDM 或受管設定檔部署到您的裝置的設定不適用,因為工作階段在 Anthropic 管理的 VM 上執行;在[自我代管環境](/docs/zh-TW/self-hosted-environments)中,工作階段也會根據[Claude Code 如何結合受管來源](/docs/zh-TW/managed-settings#how-claude-code-combines-managed-sources)讀取執行器映像中的受管設定檔 |315| 您的組織的[伺服器管理的設定](/docs/zh-TW/server-managed-settings) | 是,除了在 [Claude Tag](https://claude.com/docs/claude-tag/overview) 工作階段中 | 在工作階段開始時從 Anthropic 的伺服器擷取。請參閱[使用介面涵蓋範圍](/docs/zh-TW/model-config#surface-coverage)以了解 `availableModels` 如何在雲端工作階段中強制執行。透過 MDM 或受管設定檔部署到您的裝置的設定不適用,因為工作階段在 Anthropic 管理的 VM 上執行;在[自我代管環境](/docs/zh-TW/self-hosted-environments)中,工作階段也會根據[Claude Code 如何結合受管來源](/docs/zh-TW/managed-settings#how-claude-code-combines-managed-sources)讀取執行器映像中的受管設定檔 |

316| 您的使用者 `~/.claude/CLAUDE.md` | 否 | 位於您的機器上,不在儲存庫中。請參閱[在不提交到儲存庫的情況下新增個人偏好設定](#add-personal-preferences-without-committing-to-the-repo) |316| 您的使用者 `~/.claude/CLAUDE.md` | 否 | 位於您的機器上,不在儲存庫中。請參閱[在不提交到儲存庫的情況下新增個人偏好設定](#add-personal-preferences-without-committing-to-the-repo) |

317| 您的使用者 `~/.claude/skills/`、`~/.claude/agents/`、`~/.claude/commands/` | 否 | 位於您的機器上,不在儲存庫中。改為將它們提交到儲存庫的 `.claude/` 目錄。雲端工作階段會自動載入您在 claude.ai 上啟用的 skill |317| 您的使用者 `~/.claude/skills/`、`~/.claude/agents/`、`~/.claude/commands/` | 否 | 位於您的機器上,不在儲存庫中。改為將它們提交到儲存庫的 `.claude/` 目錄。雲端工作階段會自動載入[您在 claude.ai 上啟用的 skill](/docs/zh-TW/skills#skills-in-cowork-and-cloud-sessions) |

318| 僅在您的使用者設定中啟用的外掛程式 | 否 | 使用者範圍的 `enabledPlugins` 位於您機器上的 `~/.claude/settings.json` 中 |318| 僅在您的使用者設定中啟用的外掛程式 | 否 | 使用者範圍的 `enabledPlugins` 位於您機器上的 `~/.claude/settings.json` 中 |

319| 您使用 `claude mcp add` 在預設本機範圍或使用者範圍新增的 MCP 伺服器 | 否 | 這些寫入您機器上的 `~/.claude.json`,不是儲存庫。使用 `claude mcp add --scope project` 新增伺服器,它會寫入儲存庫的 [`.mcp.json`](/docs/zh-TW/mcp#project-scope),並提交該檔案。具有一個儲存庫的工作階段會載入它 |319| 您使用 `claude mcp add` 在預設本機範圍或使用者範圍新增的 MCP 伺服器 | 否 | 這些寫入您機器上的 `~/.claude.json`,不是儲存庫。使用 `claude mcp add --scope project` 新增伺服器,它會寫入儲存庫的 [`.mcp.json`](/docs/zh-TW/mcp#project-scope),並提交該檔案。具有一個儲存庫的工作階段會載入它 |

320| 您儲存庫的 `.claude/settings.json` `env` 區塊中的傳輸變數,例如 `NODE_EXTRA_CA_CERTS` 和[mTLS 用戶端憑證變數](/docs/zh-TW/network-config#mtls-authentication) | 否 | 代管環境管理工作階段的 API 連線,因此 Claude Code 會忽略這些金鑰,並在工作階段的偵錯日誌中記錄每個被忽略的金鑰 |320| 您儲存庫的 `.claude/settings.json` `env` 區塊中的傳輸變數,例如 `NODE_EXTRA_CA_CERTS` 和[mTLS 用戶端憑證變數](/docs/zh-TW/network-config#mtls-authentication) | 否 | 代管環境管理工作階段的 API 連線,因此 Claude Code 會忽略這些金鑰,並在工作階段的偵錯日誌中記錄每個被忽略的金鑰 |

env-vars.md +1 −1

Details

340| `CLAUDE_CODE_MAX_WEB_SEARCHES_PER_SESSION` | [WebSearch](/docs/zh-TW/tools-reference#session-search-limit) 呼叫次數的上限(預設:200)。當 Claude 達到上限時,後續的 WebSearch 呼叫會傳回一則通知,告訴它以已收集的資訊繼續。接受沒有上限的正整數。其他任何值都會被忽略並套用預設值,因此此上限可以提高但無法關閉。需要 Claude Code v2.1.212 或更新版本 |340| `CLAUDE_CODE_MAX_WEB_SEARCHES_PER_SESSION` | [WebSearch](/docs/zh-TW/tools-reference#session-search-limit) 呼叫次數的上限(預設:200)。當 Claude 達到上限時,後續的 WebSearch 呼叫會傳回一則通知,告訴它以已收集的資訊繼續。接受沒有上限的正整數。其他任何值都會被忽略並套用預設值,因此此上限可以提高但無法關閉。需要 Claude Code v2.1.212 或更新版本 |

341| `CLAUDE_CODE_MCP_ALLOWLIST_ENV` | 設為 `1` 可讓 stdio MCP 伺服器僅以安全的基準環境加上該伺服器設定的 `env` 啟動,而不是繼承您的 shell 環境 |341| `CLAUDE_CODE_MCP_ALLOWLIST_ENV` | 設為 `1` 可讓 stdio MCP 伺服器僅以安全的基準環境加上該伺服器設定的 `env` 啟動,而不是繼承您的 shell 環境 |

342| `CLAUDE_CODE_MCP_AUTO_BACKGROUND_MS` | 仍在執行的 MCP 工具呼叫[移至背景任務](/docs/zh-TW/mcp#automatic-backgrounding-of-long-tool-calls)之前經過的時間(毫秒)(預設:120000,即 2 分鐘)。設為 `0` 可關閉自動背景執行。需要 Claude Code v2.1.212 或更新版本 |342| `CLAUDE_CODE_MCP_AUTO_BACKGROUND_MS` | 仍在執行的 MCP 工具呼叫[移至背景任務](/docs/zh-TW/mcp#automatic-backgrounding-of-long-tool-calls)之前經過的時間(毫秒)(預設:120000,即 2 分鐘)。設為 `0` 可關閉自動背景執行。需要 Claude Code v2.1.212 或更新版本 |

343| `CLAUDE_CODE_MCP_STARTUP_WAIT_MS` | [非互動](/docs/zh-TW/headless)工作階段的第一個回合等待仍在連線中的 MCP 伺服器的時間(毫秒),取代預設的[第一回合等待](/docs/zh-TW/agent-sdk/mcp#connection-timing)。設定後,等待會涵蓋所有擱置中的伺服器。設為 `0` 可略過等待。無論此值為何,[`--permission-prompt-tool`](/docs/zh-TW/cli-reference#cli-flags) 伺服器都會保留其自己的 `MCP_TIMEOUT` 等待。需要 Claude Code v2.1.274 或更新版本 |343| `CLAUDE_CODE_MCP_STARTUP_WAIT_MS` | [非互動](/docs/zh-TW/headless)工作階段的第一個回合等待仍在連線中之 MCP 伺服器的時間(毫秒),取代預設的[第一回合等待](/docs/zh-TW/agent-sdk/mcp#connection-timing)。設定後,等待會涵蓋所有待處理的伺服器;在[自行託管環境](/docs/zh-TW/self-hosted-environments-configuration#connection-timing)中,只會變更等待持續的時間。設為 `0` 可略過等待。無論此值為何,[`--permission-prompt-tool`](/docs/zh-TW/cli-reference#cli-flags) 伺服器都會保留自己的 `MCP_TIMEOUT` 等待。需要 Claude Code v2.1.274 或更新版本 |

344| `CLAUDE_CODE_MCP_TOOL_IDLE_TIMEOUT` | MCP 工具呼叫的閒置逾時(毫秒)。當 stdio、HTTP、SSE、WebSocket 或 [claude.ai 連接器](/docs/zh-TW/mcp#use-mcp-servers-from-claude-ai) MCP 伺服器在這段時間內沒有傳送任何回應或進度通知時,工具呼叫會以錯誤中止,而不會等待整體的 `MCP_TOOL_TIMEOUT`。覆寫各傳輸方式的預設值:網路伺服器為 300000(5 分鐘),stdio 伺服器為 1800000(30 分鐘)。設為 `0` 可停用閒置檢查。低於 1000 的值會提高為一秒,且此值的上限為有效的 `MCP_TOOL_TIMEOUT`。`.mcp.json` 中至少為 1000 的個別伺服器 `timeout` 會將該伺服器的閒置時間窗提高至至少為 `timeout` 值。不適用於 IDE 伺服器或 SDK 同程序伺服器。需要 Claude Code v2.1.187 或更新版本。在 v2.1.203 之前,stdio 伺服器不受閒置逾時限制 |344| `CLAUDE_CODE_MCP_TOOL_IDLE_TIMEOUT` | MCP 工具呼叫的閒置逾時(毫秒)。當 stdio、HTTP、SSE、WebSocket 或 [claude.ai 連接器](/docs/zh-TW/mcp#use-mcp-servers-from-claude-ai) MCP 伺服器在這段時間內沒有傳送任何回應或進度通知時,工具呼叫會以錯誤中止,而不會等待整體的 `MCP_TOOL_TIMEOUT`。覆寫各傳輸方式的預設值:網路伺服器為 300000(5 分鐘),stdio 伺服器為 1800000(30 分鐘)。設為 `0` 可停用閒置檢查。低於 1000 的值會提高為一秒,且此值的上限為有效的 `MCP_TOOL_TIMEOUT`。`.mcp.json` 中至少為 1000 的個別伺服器 `timeout` 會將該伺服器的閒置時間窗提高至至少為 `timeout` 值。不適用於 IDE 伺服器或 SDK 同程序伺服器。需要 Claude Code v2.1.187 或更新版本。在 v2.1.203 之前,stdio 伺服器不受閒置逾時限制 |

345| `CLAUDE_CODE_MESSAGING_SOCKET` | 由 Claude Code 設定,而非由您設定:在繫結[收件匣 socket](/docs/zh-TW/cross-session-messaging#the-sessions-inbox-socket) 的工作階段中,Claude Code 會在繫結 socket 時將該 socket 的路徑匯出給 hook 與 Bash 命令。在以開啟訊息功能啟動的工作階段中,Claude Code 會在任何 hook 執行之前繫結 socket。機器上的其他工作階段會將訊息傳遞至此路徑。每個工作階段會匯出自己的 socket,而非從父工作階段繼承的 socket,且抵達該 socket 的訊息會經過工作階段的[傳入控制](/docs/zh-TW/cross-session-messaging#control-inbound-messages)。設定的 `env` 區塊無法設定此變數。需要 Claude Code v2.1.224 或更新版本 |345| `CLAUDE_CODE_MESSAGING_SOCKET` | 由 Claude Code 設定,而非由您設定:在繫結[收件匣 socket](/docs/zh-TW/cross-session-messaging#the-sessions-inbox-socket) 的工作階段中,Claude Code 會在繫結 socket 時將該 socket 的路徑匯出給 hook 與 Bash 命令。在以開啟訊息功能啟動的工作階段中,Claude Code 會在任何 hook 執行之前繫結 socket。機器上的其他工作階段會將訊息傳遞至此路徑。每個工作階段會匯出自己的 socket,而非從父工作階段繼承的 socket,且抵達該 socket 的訊息會經過工作階段的[傳入控制](/docs/zh-TW/cross-session-messaging#control-inbound-messages)。設定的 `env` 區塊無法設定此變數。需要 Claude Code v2.1.224 或更新版本 |

346| `CLAUDE_CODE_MESSAGING_TOKEN` | 由 Claude Code 設定,而非由您設定:在繫結[收件匣 socket](/docs/zh-TW/cross-session-messaging#the-sessions-inbox-socket) 的工作階段中,Claude Code 會將此工作階段專屬的 token 與 `CLAUDE_CODE_MESSAGING_SOCKET` 一起匯出給 hook 與 Bash 命令。張貼至 socket 的指令碼可傳送 `{"type":"auth","token":"<token>"}` 作為第一行,以證明其屬於該工作階段。在原生 Windows 上,Claude Code 要求此行,並會關閉任何未以有效此行開頭的連線。[own-child 規則](/docs/zh-TW/cross-session-messaging#the-sessions-inbox-socket)說明 Claude Code 何時會參考此 token。每個工作階段會匯出自己的 token,絕不會是從父工作階段繼承的 token。設定的 `env` 區塊無法設定此變數。需要 Claude Code v2.1.228 或更新版本 |346| `CLAUDE_CODE_MESSAGING_TOKEN` | 由 Claude Code 設定,而非由您設定:在繫結[收件匣 socket](/docs/zh-TW/cross-session-messaging#the-sessions-inbox-socket) 的工作階段中,Claude Code 會將此工作階段專屬的 token 與 `CLAUDE_CODE_MESSAGING_SOCKET` 一起匯出給 hook 與 Bash 命令。張貼至 socket 的指令碼可傳送 `{"type":"auth","token":"<token>"}` 作為第一行,以證明其屬於該工作階段。在原生 Windows 上,Claude Code 要求此行,並會關閉任何未以有效此行開頭的連線。[own-child 規則](/docs/zh-TW/cross-session-messaging#the-sessions-inbox-socket)說明 Claude Code 何時會參考此 token。每個工作階段會匯出自己的 token,絕不會是從父工作階段繼承的 token。設定的 `env` 區塊無法設定此變數。需要 Claude Code v2.1.228 或更新版本 |

errors.md +46 −9

Details

247| `Windows reported an error (EBADF) when Claude Code read this session's transcript file` | [命令列錯誤](#windows-reported-an-error-ebadf) |247| `Windows reported an error (EBADF) when Claude Code read this session's transcript file` | [命令列錯誤](#windows-reported-an-error-ebadf) |

248| `Cannot switch renderers in this session` | [命令列錯誤](#cannot-switch-renderers-in-this-session) |248| `Cannot switch renderers in this session` | [命令列錯誤](#cannot-switch-renderers-in-this-session) |

249| `Cannot switch renderers while work is running in the background` | [命令列錯誤](#cannot-switch-renderers-in-this-session) |249| `Cannot switch renderers while work is running in the background` | [命令列錯誤](#cannot-switch-renderers-in-this-session) |

250| `Claude Code couldn't restart` | [命令列錯誤](#claude-code-couldnt-restart) |

250| `Couldn't open Claude Desktop` | [命令列錯誤](#couldnt-open-claude-desktop) |251| `Couldn't open Claude Desktop` | [命令列錯誤](#couldnt-open-claude-desktop) |

251| `Failed to open Claude Desktop. Please try opening it manually.` | [命令列錯誤](#couldnt-open-claude-desktop) |252| `Failed to open Claude Desktop. Please try opening it manually.` | [命令列錯誤](#couldnt-open-claude-desktop) |

252| `Couldn't read your Zed keymap` / `Couldn't back up your Zed keymap` / `Couldn't update your Zed keymap` | [命令列錯誤](#terminal-setup-left-your-zed-keymap-unchanged) |253| `Couldn't read your Zed keymap` / `Couldn't back up your Zed keymap` / `Couldn't update your Zed keymap` | [命令列錯誤](#terminal-setup-left-your-zed-keymap-unchanged) |


334| `Session isn't responding` / `Press enter again to restart this session — it isn't responding` | [背景工作階段錯誤](#session-isnt-responding) |335| `Session isn't responding` / `Press enter again to restart this session — it isn't responding` | [背景工作階段錯誤](#session-isnt-responding) |

335| `Session <id> was stopped while the respawn was in flight` | [背景工作階段錯誤](#session-was-stopped-while-the-respawn-was-in-flight) |336| `Session <id> was stopped while the respawn was in flight` | [背景工作階段錯誤](#session-was-stopped-while-the-respawn-was-in-flight) |

336| `This session was running agent '<name>', which is no longer available` | [背景工作階段錯誤](#session-agent-no-longer-available) |337| `This session was running agent '<name>', which is no longer available` | [背景工作階段錯誤](#session-agent-no-longer-available) |

338| `This session restarted <time> after its next /loop wakeup was due, so that wakeup will not fire` | [背景工作階段錯誤](#restarted-after-its-next-loop-wakeup-was-due) |

337| `CLAUDE_CODE_PROCESS_WRAPPER: launcher ...` | [背景工作階段錯誤](#claude_code_process_wrapper-launcher-errors) |339| `CLAUDE_CODE_PROCESS_WRAPPER: launcher ...` | [背景工作階段錯誤](#claude_code_process_wrapper-launcher-errors) |

338| `EUNKNOWN: unknown error, uv_spawn` | [背景工作階段錯誤](#eunknown-when-starting-a-background-session) |340| `EUNKNOWN: unknown error, uv_spawn` | [背景工作階段錯誤](#eunknown-when-starting-a-background-session) |

339| `EACCES: permission denied, posix_spawn` | [背景工作階段錯誤](#eacces-when-starting-a-background-session) |341| `EACCES: permission denied, posix_spawn` | [背景工作階段錯誤](#eacces-when-starting-a-background-session) |


439| :- | :- | :- |441| :- | :- | :- |

440| [`CLAUDE_CODE_MAX_RETRIES`](/docs/zh-TW/env-vars) | 10 | 重試嘗試次數。從 v2.1.186 開始上限為 15;從 v2.1.199 開始 `CLAUDE_CODE_RETRY_WATCHDOG` 會提高預設值並移除上限。降低它以在指令碼中更快地顯示故障。 |442| [`CLAUDE_CODE_MAX_RETRIES`](/docs/zh-TW/env-vars) | 10 | 重試嘗試次數。從 v2.1.186 開始上限為 15;從 v2.1.199 開始 `CLAUDE_CODE_RETRY_WATCHDOG` 會提高預設值並移除上限。降低它以在指令碼中更快地顯示故障。 |

441| [`CLAUDE_CODE_RETRY_WATCHDOG`](/docs/zh-TW/env-vars) | 未設定 | 在無人值守的工作階段(例如 CI 工作)中設定為 `1`,以無限期重試 `429` 和 `529` 容量錯誤,而不是在 `CLAUDE_CODE_MAX_RETRIES` 次嘗試後失敗。當標準速度的請求收到報告支出限制或用量點數耗盡的 `429` 時,Claude Code 會立即失敗,即使該 `429` 來自按排程重設的 [gateway spend cap](#spend-limit-reached)。在 v2.1.239 之前,看門狗會無限期重試這些錯誤。如需快速模式請求,請參閱 [Handle rate limits](/docs/zh-TW/fast-mode#handle-rate-limits)。在 v2.1.199 或更新版本上,它也會將其他暫時性錯誤(例如伺服器錯誤、逾時和連線中斷)的預設重試次數提高至 300,大約三小時的退避,並在您明確設定 `CLAUDE_CODE_MAX_RETRIES` 時移除其上限 15。 |443| [`CLAUDE_CODE_RETRY_WATCHDOG`](/docs/zh-TW/env-vars) | 未設定 | 在無人值守的工作階段(例如 CI 工作)中設定為 `1`,以無限期重試 `429` 和 `529` 容量錯誤,而不是在 `CLAUDE_CODE_MAX_RETRIES` 次嘗試後失敗。當標準速度的請求收到報告支出限制或用量點數耗盡的 `429` 時,Claude Code 會立即失敗,即使該 `429` 來自按排程重設的 [gateway spend cap](#spend-limit-reached)。在 v2.1.239 之前,看門狗會無限期重試這些錯誤。如需快速模式請求,請參閱 [Handle rate limits](/docs/zh-TW/fast-mode#handle-rate-limits)。在 v2.1.199 或更新版本上,它也會將其他暫時性錯誤(例如伺服器錯誤、逾時和連線中斷)的預設重試次數提高至 300,大約三小時的退避,並在您明確設定 `CLAUDE_CODE_MAX_RETRIES` 時移除其上限 15。 |

444| [`CLAUDE_CODE_RETRY_WATCHDOG_MAX_WAIT_MS`](/docs/zh-TW/env-vars) | 未設定 | 設定 `CLAUDE_CODE_RETRY_WATCHDOG` 時,每個 API 請求等待 `429` 和 `529` 錯誤所花費的最長時間(毫秒)。未設定時,等待時間沒有限制。需要 Claude Code v2.1.295 或更新版本。 |

442| [`CLAUDE_CODE_OVERLOADED_RETRY_BASE_DELAY_MS`](/docs/zh-TW/env-vars) | 500 | API 以 `529` 過載錯誤拒絕的請求,其重試之間退避的起始延遲(毫秒)。當 API 容量已滿時,可提高此值(最高 32000),以將重試分散在較長的時間範圍內。當 `CLAUDE_CODE_RETRY_WATCHDOG` 設定為 `1`,或被拒絕的請求是以[快速模式](/docs/zh-TW/fast-mode#handle-rate-limits)發送時,此設定無效。需要 Claude Code v2.1.292 或更新版本。 |445| [`CLAUDE_CODE_OVERLOADED_RETRY_BASE_DELAY_MS`](/docs/zh-TW/env-vars) | 500 | API 以 `529` 過載錯誤拒絕的請求,其重試之間退避的起始延遲(毫秒)。當 API 容量已滿時,可提高此值(最高 32000),以將重試分散在較長的時間範圍內。當 `CLAUDE_CODE_RETRY_WATCHDOG` 設定為 `1`,或被拒絕的請求是以[快速模式](/docs/zh-TW/fast-mode#handle-rate-limits)發送時,此設定無效。需要 Claude Code v2.1.292 或更新版本。 |

443| [`API_TIMEOUT_MS`](/docs/zh-TW/env-vars) | 600000 | 每個請求的逾時(毫秒)。在慢速網路或代理伺服器上請提高此值。它也會限制 Claude Code 等待回應標頭的時間上限,如 [No response from API](#no-response-from-api) 中所述。 |446| [`API_TIMEOUT_MS`](/docs/zh-TW/env-vars) | 600000 | 每個請求的逾時(毫秒)。在慢速網路或代理伺服器上請提高此值。它也會限制 Claude Code 等待回應標頭的時間上限,如 [No response from API](#no-response-from-api) 中所述。 |

444| [`CLAUDE_CODE_NONSTREAMING_TIMEOUT_RETRIES`](/docs/zh-TW/env-vars) | 未設定 | 逾時的[非串流請求](#streaming-response-ended-before-any-complete-data-was-received)重新發送次數上限。達到上限時,請求會失敗。Claude 產生時間超過逾時的回應在每次重新發送時都會再次逾時,因此請設定較低的數字(例如 `0`)以便更快失敗。在本機工作階段中,每次非串流嘗試會在 300 秒後逾時,或當您設定正值時在 `API_TIMEOUT_MS` 後逾時。需要 Claude Code v2.1.285 或更新版本。 |447| [`CLAUDE_CODE_NONSTREAMING_TIMEOUT_RETRIES`](/docs/zh-TW/env-vars) | 未設定 | 逾時的[非串流請求](#streaming-response-ended-before-any-complete-data-was-received)重新發送次數上限。達到上限時,請求會失敗。Claude 產生時間超過逾時的回應在每次重新發送時都會再次逾時,因此請設定較低的數字(例如 `0`)以便更快失敗。在本機工作階段中,每次非串流嘗試會在 300 秒後逾時,或當您設定正值時在 `API_TIMEOUT_MS` 後逾時。需要 Claude Code v2.1.285 或更新版本。 |


3412 3415 

3413Claude Code 對任何[注入動態脈絡](/docs/zh-TW/skills#when-an-injected-command-fails)的 skill 都會顯示相同的錯誤,而失敗的注入命令會中止該 skill 的呼叫。另有兩個同類字串會在命令執行之前就觸發:3416Claude Code 對任何[注入動態脈絡](/docs/zh-TW/skills#when-an-injected-command-fails)的 skill 都會顯示相同的錯誤,而失敗的注入命令會中止該 skill 的呼叫。另有兩個同類字串會在命令執行之前就觸發:

3414 3417 

3415* `Shell command permission check failed for pattern "..."`:該命令的權限檢查不允許它。[注入命令的權限檢查](/docs/zh-TW/skills#permission-checks-on-injected-commands)說明了在各權限模式下哪些結果會中止,以及如何使用 `allowed-tools` 預先核准命令3418* `Shell command permission check failed for pattern "..."`:命令的權限檢查不允許執行。[注入命令的權限檢查](/docs/zh-TW/skills#permission-checks-on-injected-commands)說明了在各種權限模式下哪些結果會中止,以及如何使用 `allowed-tools` 預先核准命令

3416* ``Skill <name> requires bash (`shell: bash` in frontmatter) but Git Bash was not found``:該 skill 的 frontmatter 在沒有 bash 的機器上要求使用 bash。請安裝 Git for Windows,或將 frontmatter 變更為 `shell: powershell`。請參閱[注入命令如何執行](/docs/zh-TW/skills#how-injected-commands-run)3419* ``Skill <name> requires bash (`shell: bash` in frontmatter) but Git Bash was not found``:skill 的 frontmatter 要求 bash,但機器上沒有 bash。請安裝 Git for Windows,或將 frontmatter 改為 `shell: powershell`。請參閱[注入命令的執行方式](/docs/zh-TW/skills#how-injected-commands-run)

3417 3420 

3418**處理方式:**3421**處理方式:**

3419 3422 


3562 3565 

3563* **您沒有傳入基底分支**:Claude Code 與儲存庫的預設分支進行比較,並建議您明確傳入基底分支,如上例所示3566* **您沒有傳入基底分支**:Claude Code 與儲存庫的預設分支進行比較,並建議您明確傳入基底分支,如上例所示

3564* **您傳入的基底分支已存在於您的複製中**:提示內容為 ``Make sure <branch> exists locally or on origin (try `git fetch origin <branch>`)``3567* **您傳入的基底分支已存在於您的複製中**:提示內容為 ``Make sure <branch> exists locally or on origin (try `git fetch origin <branch>`)``

3565* **您傳入的基底分支不在您的複製中**:Claude Code 在比較前從 origin 擷取了它。提示內容為 ``<branch> was fetched from origin but shares no history with HEAD. If another branch is your real base, pass it explicitly (`/code-review ultra <branch>`)``;當 Claude Code 無法判斷您的複製是否為淺層複製時,它會改為建議 `git fetch --unshallow origin`。在 v2.1.221 之前,提示會對每個被擷取的基底分支都建議 `git fetch --unshallow origin`,而在完整的複製上,該命令會以 `fatal: --unshallow on a complete repository does not make sense` 失敗。3568* **您傳入的基底分支不在您的複製中**:Claude Code 會在比較之前從 origin 擷取該分支。提示內容為 ``<branch> was fetched from origin but shares no history with HEAD. If another branch is your real base, pass it explicitly (`/code-review ultra <branch>`)``;當 Claude Code 無法判斷您的複製是否為淺層複製時,它會改為建議 `git fetch --unshallow origin`。在 v2.1.221 之前,提示會對每個擷取的基底分支建議 `git fetch --unshallow origin`,而在完整的複製上,該命令會以 `fatal: --unshallow on a complete repository does not make sense` 失敗。

3566 3569 

3567**處理方式:**3570**處理方式:**

3568 3571 


3816 3819 

3817* 在未帶有這些限制而啟動的工作階段中,執行 `/tui fullscreen`,或執行 `/tui default` 切換回來。Claude Code 會在該處儲存 [`tui` 設定](/docs/zh-TW/settings-reference#tui)3820* 在未帶有這些限制而啟動的工作階段中,執行 `/tui fullscreen`,或執行 `/tui default` 切換回來。Claude Code 會在該處儲存 [`tui` 設定](/docs/zh-TW/settings-reference#tui)

3818 3821 

3822<h3 id="claude-code-couldnt-restart">

3823 Claude Code couldn't restart

3824</h3>

3825 

3826Claude Code 正在重新啟動,例如在您執行 [`/tui`](/docs/zh-TW/fullscreen#enable-fullscreen-rendering) 後切換至或切換離開全螢幕渲染。它關閉了工作階段,但無法啟動新的程序,因此輸出此訊息並以狀態 1 結束:

3827 

3828```text theme={null}

3829Claude Code couldn't restart. Your conversation is saved. Start Claude Code again and run /resume to pick it up.

3830```

3831 

3832當重新啟動時沒有可重新開啟的對話,例如因為 `/tui` 是您在新工作階段中的第一個輸入,訊息內容為 `Claude Code couldn't restart. Start Claude Code again.`

3833 

3834**處理方式:**

3835 

3836* 在 shell 中從相同目錄再次執行 `claude`。若訊息表示您的對話已儲存,請在新的工作階段中執行 [`/resume`](/docs/zh-TW/sessions#resume-a-session) 並選擇該對話

3837* 若重新啟動持續失敗,請在 shell 中使用 [`claude --debug-file claude-debug.log`](/docs/zh-TW/cli-reference#cli-flags) 啟動 Claude Code。若從該工作階段重新啟動失敗,您啟動所在目錄中的 `claude-debug.log` 會記錄一行包含作業系統錯誤的 `Failed to relaunch:`。在您[回報問題](#report-an-error)時請附上該行

3838 

3819<h3 id="couldnt-open-claude-desktop">3839<h3 id="couldnt-open-claude-desktop">

3820 無法開啟 Claude Desktop3840 無法開啟 Claude Desktop

3821</h3>3841</h3>


4752 命令被 worktree 隔離檢查阻止4772 命令被 worktree 隔離檢查阻止

4753</h3>4773</h3>

4754 4774 

4755Claude 在[在 worktree 中隔離的工作階段](/docs/zh-TW/worktrees#how-claude-code-enforces-isolation)中執行了 Bash 或 Monitor 命令,Claude Code 因以下兩個原因之一拒絕了它:4775Claude 在[在 worktree 中隔離的工作階段](/docs/zh-TW/worktrees#how-claude-code-enforces-isolation)中執行了 Bash、[PowerShell](/docs/zh-TW/tools-reference#powershell-tool) 或 [Monitor](/docs/zh-TW/tools-reference#monitor-tool) 命令,Claude Code 因以下原因之一拒絕了它:

4756 4776 

4757* 命令將 git 指向主簽出。4777* 命令將在主簽出或另一個 worktree 中執行。訊息會說明其工作目錄 `resolved to the shared checkout` 或 `is in a different worktree`。

4758* Claude Code 無法從命令文字驗證命令執行的任何 git 保持在 worktree 內。從未提及 git 的命令仍然可能因此原因被拒絕,因為展開變數間接參照(例如 `${!name}`)或執行 Bash 函數替換(例如 `${ command; }`)會產生在執行時本身可能是命令的值。4778* Bash 或 Monitor 命令將 git 指向主簽出。

4779* Claude Code 無法從 Bash 或 Monitor 命令的文字驗證命令執行的任何 git 保持在 worktree 內。從未提及 git 的命令仍然可能因此原因被拒絕,因為展開變數間接參照(例如 `${!name}`)或執行 Bash 函數替換(例如 `${ command; }`)會產生在執行時本身可能是命令的值。

4759 4780 

4760訊息的中間命名無法驗證的內容:4781訊息會顯示 `is isolated in the worktree <path>, but this command`,後接原因,例如 Claude Code 無法驗證其文字的命令:

4761 4782 

4762```text wrap theme={null}4783```text wrap theme={null}

4763This session is isolated in the worktree /path/to/worktree, but this command evaluates ${!x@P} arithmetically inside a construct too complex to verify, which can run a command hidden in a variable's value. Refusing to run it — a worktree-isolated session's git operations must target its own worktree. Split it into plain, separate commands and run them from /path/to/worktree.4784This session is isolated in the worktree /path/to/worktree, but this command evaluates ${!x@P} arithmetically inside a construct too complex to verify, which can run a command hidden in a variable's value. Refusing to run it — a worktree-isolated session's git operations must target its own worktree. Split it into plain, separate commands and run them from /path/to/worktree.


4765 4786 

4766**該怎麼做:**4787**該怎麼做:**

4767 4788 

4768* 通常什麼都不做:Claude 讀取訊息並按其最後一句要求的方式重寫命令4789* **Git 指向主簽出,或無法驗證的命令文字**:什麼都不做。Claude 讀取訊息並按其最後一句要求的方式重寫命令。如果您要求的命令因其文字中的展開而持續被拒絕,請按字面拼寫標記的值,並從 worktree 內將 git 作為獨立的純命令執行

4769* 如果您要求的命令持續被拒絕,按字面拼寫標記的值:用其值替換間接參照或替換,並從 worktree 內將 git 作為獨立的純命令執行

4770* 要刻意作用於主簽出,請在工作階段外的終端機中自己執行命令4790* 要刻意作用於主簽出,請在工作階段外的終端機中自己執行命令

4771 4791 

4772<h3 id="this-session-has-no-saved-transcript">4792<h3 id="this-session-has-no-saved-transcript">


4946* 或使用 `--agent <name>` 繼續,指定確實存在的 agent,以改為作為該 agent 執行工作階段4966* 或使用 `--agent <name>` 繼續,指定確實存在的 agent,以改為作為該 agent 執行工作階段

4947* 如果 agent 是專案範圍的,而您尚未信任工作階段的原始目錄,請在那裡執行 Claude Code 一次,接受信任對話框,然後再次繼續4967* 如果 agent 是專案範圍的,而您尚未信任工作階段的原始目錄,請在那裡執行 Claude Code 一次,接受信任對話框,然後再次繼續

4948 4968 

4969<h3 id="restarted-after-its-next-loop-wakeup-was-due">

4970 This session restarted after its next /loop wakeup was due

4971</h3>

4972 

4973[背景工作階段](/docs/zh-TW/agent-view)中的[自行調節步調的 `/loop`](/docs/zh-TW/scheduled-tasks#let-claude-choose-the-interval) 已停止。工作階段的程序在迴圈等待下一次喚醒時結束,而該次喚醒在工作階段的[下一個程序](/docs/zh-TW/agent-view#the-supervisor-process)啟動之前就已到期。錯過的喚醒不會延遲觸發。通知會說明工作階段重新啟動時該次喚醒已逾期多久:

4974 

4975```text theme={null}

4976This session restarted 12m after its next /loop wakeup was due, so that wakeup will not fire. The loop stays stopped until Claude schedules it again: reply to continue it.

4977```

4978 

4979在 v2.1.295 之前,迴圈在此情況下會停止而不顯示通知。

4980 

4981**該怎麼做:**

4982 

4983* 若要繼續迴圈,請[回覆該工作階段](/docs/zh-TW/agent-view#peek-and-reply)並如此說明,例如 `keep the loop running`。Claude 會連同您的回覆一起讀取通知,並可以排程下一次喚醒

4984* 如果您已不需要該迴圈,則什麼都不用做。它已經停止

4985 

4949<h3 id="claude_code_process_wrapper-launcher-errors">4986<h3 id="claude_code_process_wrapper-launcher-errors">

4950 CLAUDE\_CODE\_PROCESS\_WRAPPER 啟動器錯誤4987 CLAUDE\_CODE\_PROCESS\_WRAPPER 啟動器錯誤

4951</h3>4988</h3>

headless.md +3 −1

Details

89* **[Monitor](/docs/zh-TW/tools-reference#monitor-tool) 監視**:執行會等待直到監視逾時或 10 分鐘上限結束等待,以先發生者為準。在等待期間,Claude 會持續回應監視報告的內容。預設情況下,監視在 Claude 啟動後五分鐘逾時。89* **[Monitor](/docs/zh-TW/tools-reference#monitor-tool) 監視**:執行會等待直到監視逾時或 10 分鐘上限結束等待,以先發生者為準。在等待期間,Claude 會持續回應監視報告的內容。預設情況下,監視在 Claude 啟動後五分鐘逾時。

90* **待處理的喚醒**:在以文字傳遞提示詞(而非使用 `--input-format stream-json`)的執行中,當 Claude 已排定 [自訂節奏的 `/loop` 喚醒](/docs/zh-TW/scheduled-tasks#let-claude-choose-the-interval) 時,執行會等待每次喚醒觸發並執行其迭代,直到 [迴圈結束](/docs/zh-TW/scheduled-tasks#stop-a-loop),即使超過 10 分鐘上限也是如此。90* **待處理的喚醒**:在以文字傳遞提示詞(而非使用 `--input-format stream-json`)的執行中,當 Claude 已排定 [自訂節奏的 `/loop` 喚醒](/docs/zh-TW/scheduled-tasks#let-claude-choose-the-interval) 時,執行會等待每次喚醒觸發並執行其迭代,直到 [迴圈結束](/docs/zh-TW/scheduled-tasks#stop-a-loop),即使超過 10 分鐘上限也是如此。

91 91 

92當 stderr 是終端機且執行已等待五秒時,Claude Code 會向 stderr 列印一行以 `Waiting for background work to finish` 開頭並指出該工作的訊息。使用 [`json` 或 `stream-json` 輸出](#get-structured-output) 時,只有在 stdout 不是終端機時才會列印該行,因此您的指令碼讀取的 JSON 永遠不會包含它。

93 

92如果執行達到其 [`--max-budget-usd`](/docs/zh-TW/cli-reference#cli-flags) 上限,Claude Code 會停止剩餘的背景工作,而不是繼續等待。94如果執行達到其 [`--max-budget-usd`](/docs/zh-TW/cli-reference#cli-flags) 上限,Claude Code 會停止剩餘的背景工作,而不是繼續等待。

93 95 

94當背景工作啟動另一個回合時,使用預設的 `text` 輸出時,執行會列印每個回合的結果;使用 `json` 輸出時,則列印最後一個回合的結果。在 v2.1.295 之前,使用 `text` 輸出時,執行也只會列印最後一個回合的結果。96當背景工作啟動另一個回合時,使用預設的 `text` 輸出時,執行會列印每個回合的結果;使用 `json` 輸出時,則列印最後一個回合的結果。在 v2.1.295 之前,使用 `text` 輸出時,執行也只會列印最後一個回合的結果。


296 298 

297當 `--plugin-dir` 目錄或封存檔本身載入失敗時,其 `plugin_errors` 項目會以 `path` 包含解析後的絕對路徑。可用它來判斷多個 `--plugin-dir` 值中是哪一個失敗。`path` 欄位需要 Claude Code v2.1.283 或更新版本。299當 `--plugin-dir` 目錄或封存檔本身載入失敗時,其 `plugin_errors` 項目會以 `path` 包含解析後的絕對路徑。可用它來判斷多個 `--plugin-dir` 值中是哪一個失敗。`path` 欄位需要 Claude Code v2.1.283 或更新版本。

298 300 

299以相同方式使用 MCP 伺服器欄位。當您搭配 `-p` 傳入 [`--mcp-config`](/docs/zh-TW/cli-reference#cli-flags) 時,Claude Code 會在執行第一個回合前等待仍在擱置中的伺服器,最長等待 [`MCP_TIMEOUT`](/docs/zh-TW/env-vars) 啟動逾時時間,預設為 30 秒。具有[快取工具清單](/docs/zh-TW/agent-sdk/mcp#connection-timing)的遠端伺服器會略過等待,在 `system/init` 中顯示 `pending`,並在第一次工具呼叫時連線。此等待需要 Claude Code v2.1.221 或更新版本。301以相同方式使用 MCP 伺服器欄位。當您搭配 `-p` 傳入 [`--mcp-config`](/docs/zh-TW/cli-reference#cli-flags) 時,Claude Code 會在執行第一個回合前等待仍在擱置中的伺服器,最長等待 [`MCP_TIMEOUT`](/docs/zh-TW/env-vars) 啟動逾時時間,預設為 30 秒。具有[快取工具清單](/docs/zh-TW/agent-sdk/mcp#connection-timing)的遠端伺服器會略過等待,在 `system/init` 中顯示 `pending`,並在第一次工具呼叫時連線。在[自架環境](/docs/zh-TW/self-hosted-environments-configuration#connection-timing)中,則會改為套用較短的等待時間。此等待需要 Claude Code v2.1.221 或更新版本。

300 302 

301Claude Code 會在啟動時驗證每個 `--mcp-config` 項目,並略過驗證失敗的項目,例如沒有 `type` 的 `url` 項目。執行會繼續並正常結束,因此請檢查這些欄位,以偵測從未載入的伺服器:303Claude Code 會在啟動時驗證每個 `--mcp-config` 項目,並略過驗證失敗的項目,例如沒有 `type` 的 `url` 項目。執行會繼續並正常結束,因此請檢查這些欄位,以偵測從未載入的伺服器:

302 304 

Details

132執行器及其工作階段進行多種出站連接,不需要來自 Anthropic 的入站連接:132執行器及其工作階段進行多種出站連接,不需要來自 Anthropic 的入站連接:

133 133 

134* **控制平面**:執行器輪詢 `api.anthropic.com` 以獲取工作並發佈設定進度和失敗事件,全部出站 HTTPS。輪詢充當執行器的心跳。134* **控制平面**:執行器輪詢 `api.anthropic.com` 以獲取工作並發佈設定進度和失敗事件,全部出站 HTTPS。輪詢充當執行器的心跳。

135* **SCM 連接器**:可選的協調器 [SCM 連接器](/docs/zh-TW/self-hosted-environments-reference#scm-connector-flags) 隧道是唯一的 WebSocket 連接。135* **Git**:執行器透過 HTTPS 或 SSH 從您的 git 主機複製和推送,使用您的部署提供的憑證進行身份驗證。請參閱[設定 git](/docs/zh-TW/self-hosted-environments-deploy#configure-git) 以了解各種選項,包括每個工作階段鑄造的憑證。使用 [Anthropic git 代理伺服器](/docs/zh-TW/self-hosted-environments-deploy#use-the-anthropic-git-proxy)時,github.com 上儲存庫的 git 流量會改為經由 `api.anthropic.com`。

136* **Git**:執行器透過 HTTPS 或 SSH 從您的 git 主機複製和推送,使用您的部署提供的認證進行身份驗證;[設定 git](/docs/zh-TW/self-hosted-environments-deploy#configure-git) 涵蓋了各種選項,包括每個工作階段鑄造的認證和 [Anthropic git 代理](/docs/zh-TW/self-hosted-environments-deploy#use-the-anthropic-git-proxy),它透過 `api.anthropic.com` 路由 git。136* **工作階段子程序**:子 Claude Code 程序持有工作階段到 `api.anthropic.com` 的事件串流,並為模型推理和工作階段期間執行的 git 命令進行自己的出站呼叫。在使用 [Anthropic 管理的 git](/docs/zh-TW/self-hosted-environments-deploy#use-the-anthropic-git-proxy) 的工作階段中,子程序會透過它開啟到 `api.anthropic.com` 的 WebSocket 連接,傳送其針對 github.com 的 `git` 和 `gh` 流量。

137* **工作階段子程序**:子 Claude Code 程序持有工作階段的事件流到 `api.anthropic.com`,並為模型推理和工作階段期間執行的 git 命令進行自己的出站呼叫。請參閱[網路需求](/docs/zh-TW/self-hosted-environments-deploy#network-requirements)以取得完整的出站清單。[上面的圖表](#how-self-hosted-environments-work)顯示了這些路徑,除了可選的 SCM 連接器。137* **SCM 連接器**:可選的協調器 [SCM 連接器](/docs/zh-TW/self-hosted-environments-reference#scm-connector-flags)無法使用,因此其隧道不會開啟。該隧道是到 `api.anthropic.com` 的 WebSocket 連接。

138 

139請參閱[網路需求](/docs/zh-TW/self-hosted-environments-deploy#network-requirements)以取得完整的出站清單。[上面的圖表](#how-self-hosted-environments-work)顯示了這些路徑,除了可選的 SCM 連接器和 Anthropic 管理的 git 連接。

138 140 

139預設情況下,模型推理使用 Anthropic API。控制平面將 API 端點傳遞給每個工作階段,工作階段使用 Anthropic 發行的、工作階段範圍的 OAuth token 進行身份驗證。若要改為將模型請求傳送到您自己的雲端帳戶,請參閱[將模型請求傳送到 Bedrock 或 Agent Platform](/docs/zh-TW/self-hosted-environments-configuration#send-model-requests-to-bedrock-or-agent-platform)。141預設情況下,模型推理使用 Anthropic API。控制平面將 API 端點傳遞給每個工作階段,工作階段使用 Anthropic 發行的、工作階段範圍的 OAuth token 進行身份驗證。若要改為將模型請求傳送到您自己的雲端帳戶,請參閱[將模型請求傳送到 Bedrock 或 Agent Platform](/docs/zh-TW/self-hosted-environments-configuration#send-model-requests-to-bedrock-or-agent-platform)。

140 142 

Details

31| 變數 | 說明 |31| 變數 | 說明 |

32| :- | :- |32| :- | :- |

33| `CLAUDE_CODE_SESSION_ACCESS_TOKEN` | 工作階段 JWT,前綴為 `sk-ant-cc-`。其 `act` 聲明識別工作階段建立者,並在建立的使用介面有記錄時包含建立者的電子郵件。該值是生成時的 token;重新整理會透過子程序的 stdin 到達,因此包裝指令碼只會看到初始值。請參閱[驗證工作階段身分](/docs/zh-TW/self-hosted-environments-identity)。 |33| `CLAUDE_CODE_SESSION_ACCESS_TOKEN` | 工作階段 JWT,前綴為 `sk-ant-cc-`。其 `act` 聲明識別工作階段建立者,並在建立的使用介面有記錄時包含建立者的電子郵件。該值是生成時的 token;重新整理會透過子程序的 stdin 到達,因此包裝指令碼只會看到初始值。請參閱[驗證工作階段身分](/docs/zh-TW/self-hosted-environments-identity)。 |

34| `CCR_SESSION_ACCOUNT_EMAIL` | 工作階段建立者的電子郵件,由執行器從 token 的 `act.email` 聲明中預先提取,未經簽章驗證。適合用於標籤,例如提交尾註。當電子郵件限制憑證發行時,請改為驗證 token 並從中讀取聲明;請參閱[佈建限定於工作階段建立者的憑證](#provision-credentials-scoped-to-the-session-creator)。當 token 不包含建立者電子郵件時未設定。請視為個人可識別資訊。 |34| `CCR_SESSION_ACCOUNT_EMAIL` | 工作階段建立者的電子郵件,由執行器從 token 的 `act.email` 聲明中預先提取,未經簽章驗證。適合用於標籤,例如提交尾註。當電子郵件限制憑證發行時,請改為驗證 token 並從中讀取聲明。請參閱[佈建限定於工作階段建立者的憑證](#provision-credentials-scoped-to-the-session-creator)。當 token 不包含建立者電子郵件時未設定,例如由您組織的服務身分建立的工作階段。請視為個人可識別資訊。 |

35| `CLAUDE_RUNNER_CLIENT_PLATFORM` | 建立工作階段的用戶端使用介面,例如 `web_claude_ai`、`desktop_app`、`ios`、`claude_code_cli` 或 `scheduled_trigger`。Anthropic 在工作階段建立時記錄該值一次,因此包裝指令碼和每個生命週期 hook 都會看到相同的值。僅將其用於採用分析和標籤,不要用作授權訊號。當工作階段沒有已記錄或可識別的使用介面時未設定,因此在 `set -u` 下請以 `${CLAUDE_RUNNER_CLIENT_PLATFORM:-}` 參照它。需要 Claude Code v2.1.229 或更新版本。 |35| `CLAUDE_RUNNER_CLIENT_PLATFORM` | 建立工作階段的用戶端使用介面,例如 `web_claude_ai`、`desktop_app`、`ios`、`claude_code_cli` 或 `scheduled_trigger`。Anthropic 在工作階段建立時記錄該值一次,因此包裝指令碼和每個生命週期 hook 都會看到相同的值。僅將其用於採用分析和標籤,不要用作授權訊號。當工作階段沒有已記錄或可識別的使用介面時未設定。需要 Claude Code v2.1.229 或更新版本。 |

36| `CLAUDE_RUNNER_CLAUDE_BIN` | 執行器自己的 Claude Code 二進位檔案的絕對路徑。以 `exec "$CLAUDE_RUNNER_CLAUDE_BIN" "$@"` 結束您的包裝指令碼,以移交給固定的二進位檔案,而無需硬編碼安裝路徑。 |36| `CLAUDE_RUNNER_CLAUDE_BIN` | 執行器自己的 Claude Code 二進位檔案的絕對路徑。以 `exec "$CLAUDE_RUNNER_CLAUDE_BIN" "$@"` 結束您的包裝指令碼,以移交給固定的二進位檔案,而無需硬編碼安裝路徑。 |

37| `CLAUDE_CODE_REMOTE_SESSION_ID` | 標記形式為 `cse_...` 的工作階段 ID。這與[生命週期 hook](#lifecycle-hooks) 以 `CLAUDE_RUNNER_SESSION_ID`(`session_...` 形式)看到的是相同工作階段;UUID 變數在兩者之間相符,將 `cse_` 前綴替換為 `session_` 會產生工作階段 URL 中顯示的 ID。 |37| `CLAUDE_CODE_REMOTE_SESSION_ID` | 標記形式為 `cse_...` 的工作階段 ID。這與[生命週期 hook](#lifecycle-hooks) 以 `CLAUDE_RUNNER_SESSION_ID`(`session_...` 形式)看到的是相同工作階段;UUID 變數在兩者之間相符,將 `cse_` 前綴替換為 `session_` 會產生工作階段 URL 中顯示的 ID。 |

38| `CLAUDE_CODE_REMOTE_SESSION_UUID` | 標準 UUID 形式的相同工作階段 ID,適用於以 UUID 為鍵的系統。 |38| `CLAUDE_CODE_REMOTE_SESSION_UUID` | 標準 UUID 形式的相同工作階段 ID,適用於以 UUID 為鍵的系統。 |

39| `CLAUDE_CODE_REMOTE_SLACK_THREAD_URL` | 對於屬於某個 Slack 討論串的 [Claude Tag](https://claude.com/docs/claude-tag/overview) 工作階段,為該討論串的連結。其他工作階段不會設定此變數,討論串工作階段也可能未設定。 |

40| `CLAUDE_CODE_REMOTE_SLACK_THREAD_TS` | 對於屬於某個 Slack 討論串的 Claude Tag 工作階段,為該討論串的 Slack 時間戳記,例如 `1700000000.000100`。可能未設定,且可能在 `CLAUDE_CODE_REMOTE_SLACK_THREAD_URL` 未設定時已設定,因此請分別檢查每個變數。 |

39| `CLAUDE_SESSION_INGRESS_TOKEN_FILE` | 保存目前工作階段 JWT 的每個工作階段檔案的絕對路徑,在 token 重新整理時保持最新。Shell 子程序在下載使用者新增到工作階段的附件時從中讀取其 `Authorization` 標頭。`exec` 會自動保留該變數;重建子程序環境的包裝指令碼必須帶上該變數,否則附件下載會無聲地停止運作。 |41| `CLAUDE_SESSION_INGRESS_TOKEN_FILE` | 保存目前工作階段 JWT 的每個工作階段檔案的絕對路徑,在 token 重新整理時保持最新。Shell 子程序在下載使用者新增到工作階段的附件時從中讀取其 `Authorization` 標頭。`exec` 會自動保留該變數;重建子程序環境的包裝指令碼必須帶上該變數,否則附件下載會無聲地停止運作。 |

40| `CLAUDE_CONFIG_DIR` | 每個工作階段的 Claude 設定目錄,在工作階段開始時從執行器在啟動時擷取的執行器主機設定快照中寫入;請參閱[權限和工具核准](#permissions-and-tool-approval)。此處的寫入隔離於此工作階段。工作階段結束後,該目錄會保留在 `<base-dir>/_sessions/` 下,除非您使用 [`--remove-session-state`](/docs/zh-TW/self-hosted-environments-reference#runner-cli-flags) 啟動執行器;請參閱[重複使用預先準備的簽出](/docs/zh-TW/self-hosted-environments-deploy#reuse-a-pre-warmed-checkout)。 |42| `CLAUDE_CONFIG_DIR` | 每個工作階段的 Claude 設定目錄,在工作階段開始時從執行器在啟動時擷取的執行器主機設定快照中寫入;請參閱[權限和工具核准](#permissions-and-tool-approval)。此處的寫入隔離於此工作階段。工作階段結束後,該目錄會保留在 `<base-dir>/_sessions/` 下,除非您使用 [`--remove-session-state`](/docs/zh-TW/self-hosted-environments-reference#runner-cli-flags) 啟動執行器;請參閱[重複使用預先準備的簽出](/docs/zh-TW/self-hosted-environments-deploy#reuse-a-pre-warmed-checkout)。 |

41| `ANTHROPIC_BASE_URL` | 子程序將使用的 API 基礎 URL,由控制平面按工作階段傳遞,通常為 `https://api.anthropic.com`。不要覆寫它:工作階段的推理憑證是 Anthropic 發行的 OAuth token,其他提供者不接受。 |43| `ANTHROPIC_BASE_URL` | 子程序將使用的 API 基礎 URL,由控制平面按工作階段傳遞,通常為 `https://api.anthropic.com`。不要覆寫它:工作階段的推理憑證是 Anthropic 發行的 OAuth token,其他提供者不接受。 |


43 45 

44包裝指令碼也會繼承子程序的其餘受管環境,包括任何伺服器提供的環境變數。`exec` 會自動傳播所有內容;如果您的包裝指令碼以另一種方式生成子程序,請轉發完整環境。46包裝指令碼也會繼承子程序的其餘受管環境,包括任何伺服器提供的環境變數。`exec` 會自動傳播所有內容;如果您的包裝指令碼以另一種方式生成子程序,請轉發完整環境。

45 47 

48`CLAUDE_CODE_REMOTE_SLACK_THREAD_URL` 和 `CLAUDE_CODE_REMOTE_SLACK_THREAD_TS` 會傳到您的包裝指令碼或 [`command` hook](#command)。它們也會傳到工作階段執行的內容,例如 shell 命令、git hook 和 Claude Code hook。`checkout`、`post-session` 和 `spawn-runner` hook 不會收到它們。

49 

50<h3 id="give-a-default-to-variables-that-can-be-unset">

51 為可能未設定的變數提供預設值

52</h3>

53 

54`CCR_SESSION_ACCOUNT_EMAIL`、`CLAUDE_RUNNER_CLIENT_PLATFORM`、`CLAUDE_CODE_REMOTE_SLACK_THREAD_URL` 和 `CLAUDE_CODE_REMOTE_SLACK_THREAD_TS` 都可能未設定。如果您的指令碼使用 `set -u`,Bash 在展開未設定的變數時會以 `unbound variable` 停止,因此請以預設值展開它們,例如 `${CCR_SESSION_ACCOUNT_EMAIL:-}`。

55 

56在 shell 展開 Slack 討論串連結的任何地方,請採取以下預防措施:

57 

58* **為其加上引號**:連結可能包含 shell 會處理的字元,例如 `?` 和 `&`,因此請為變數加上引號,如 `"${CLAUDE_CODE_REMOTE_SLACK_THREAD_URL:-}"`。

59* **不要將其值放入 `eval` 和 `sh -c` 字串中**:不要將其值代入 `eval` 或 `sh -c` 執行的字串,即使在引號內也不行。請改為讓該字串參照變數。

60 

46<h3 id="keep-stdin-and-file-descriptor-3-attached">61<h3 id="keep-stdin-and-file-descriptor-3-attached">

47 保持 stdin 和檔案描述符 3 連接62 保持 stdin 和檔案描述符 3 連接

48</h3>63</h3>

49 64 

50子程序的 stdin 是執行器的控制通道。token 輪換和工作階段結束訊號會在其上到達。執行器也會在檔案描述符 3 上開啟一個管道,並從中讀取子程序的活動訊號以驅動閒置和啟動逾時。單純的 `exec "$CLAUDE_RUNNER_CLAUDE_BIN" "$@"` 會自動保留兩者。65子程序的 stdin 是執行器的控制通道。token 輪換和工作階段結束訊號會在其上到達。執行器也會在檔案描述符 3 上開啟一個管道,並從中讀取子程序的活動訊號以驅動閒置和啟動逾時。單純的 `exec "$CLAUDE_RUNNER_CLAUDE_BIN" "$@"` 會自動保留兩者。

51 66 

52如果您的包裝指令碼使用單獨的 `&` 在背景中執行子程序,它會切斷子程序的 stdin:工作階段看起來健康,直到初始 OAuth token 大約 30 分鐘的生命週期過期,然後每個 API 呼叫都會失敗,並出現 `401 authentication_error`。如果您的包裝指令碼必須在背景中執行子程序,例如為了讓拆卸 trap 保持作用,請將 stdin 儲存在檔案描述符 4 或更高的編號上,並明確重新連接它:67如果您的包裝指令碼使用單獨的 `&` 在背景中執行子程序,它會切斷子程序的 stdin。工作階段看起來健康,直到初始 OAuth token 大約 30 分鐘的生命週期過期,然後每個使用該 token 的 API 呼叫都會失敗,並出現 `401 authentication_error`。如果您的包裝指令碼必須在背景中執行子程序,例如為了讓拆卸 trap 保持作用,請將 stdin 儲存在檔案描述符 4 或更高的編號上,並明確重新連接它:

53 68 

54```bash theme={null}69```bash theme={null}

55exec 4<&070exec 4<&0


59wait "$CHILD"74wait "$CHILD"

60```75```

61 76 

62不要在包裝指令碼中關閉或重複使用檔案描述符 3。重新導向子程序的 stdout 和 stderr 是可以的。77您可以重新導向子程序的 stdout。請保持檔案描述符 3 和 stderr 連接到執行器:

78 

79* **檔案描述符 3**:將子程序的活動訊號傳送給執行器。不要在包裝指令碼中關閉或重複使用它。

80* **stderr**:當包裝指令碼或子程序以非零狀態退出時,執行器會將 stderr 的最後幾行張貼到工作階段,並在自己的日誌中印出。工作階段的使用者會看到這些行,因此不要將祕密印到 stderr,並在部署包裝指令碼前移除 `set -x`。如果您重新導向 stderr,工作階段仍會執行,但執行器只會以退出碼回報失敗。

63 81 

64<h3 id="pass-the-system-prompt-flags-through">82<h3 id="pass-the-system-prompt-flags-through">

65 傳遞系統提示詞旗標83 傳遞系統提示詞旗標


108 checkout126 checkout

109</h3>127</h3>

110 128 

111每個儲存庫執行一次,取代執行器內建的複製與擷取。使用此 hook 從直讀式鏡像複製、從封存檔植入工作樹,或套用每個工作階段的 git 身分驗證。執行器會設定下列變數,也可能設定表格未列出的其他 `CLAUDE_RUNNER_` 變數:129每個儲存庫執行一次,取代執行器內建的複製與擷取。使用此 hook 從您透過 HTTPS 或 SSH 存取的直讀式鏡像複製、從封存檔植入工作樹,或套用每個工作階段的 git 身分驗證。執行器會設定下列變數,也可能設定表格未列出的其他 `CLAUDE_RUNNER_` 變數:

112 130 

113| 變數 | 說明 |131| 變數 | 說明 |

114| :- | :- |132| :- | :- |

115| `CLAUDE_RUNNER_REPO_URL` | 要複製的儲存庫 URL,在應用任何 `--git-host-rewrite` 和 `--git-ssh-rewrite` 之後 |133| `CLAUDE_RUNNER_REPO_URL` | 要複製的儲存庫 URL,在應用任何 `--git-host-rewrite` 和 `--git-ssh-rewrite` 之後 |

116| `CLAUDE_RUNNER_REPO_REF` | 要簽出的修訂版本:分支、標籤或提交 SHA,如會話要求的那樣。空表示儲存庫的預設分支。 |134| `CLAUDE_RUNNER_REPO_REF` | 要簽出的修訂版本,依工作階段的要求而定:分支、標籤、提交 SHA,或完整參照名稱,例如 `refs/pull/<number>/head`。空值表示儲存庫的預設分支。 |

117| `CLAUDE_RUNNER_CHECKOUT_PATH` | 工作樹必須留下的絕對路徑 |135| `CLAUDE_RUNNER_CHECKOUT_PATH` | 工作樹必須留下的絕對路徑 |

118| `CLAUDE_RUNNER_SESSION_ID` | 標記形式為 `session_...` 的會話 ID,用於記錄和相關性 |136| `CLAUDE_RUNNER_SESSION_ID` | 標記形式為 `session_...` 的會話 ID,用於記錄和相關性 |

119| `CLAUDE_RUNNER_SESSION_UUID` | 規範 UUID 形式的相同會話 ID |137| `CLAUDE_RUNNER_SESSION_UUID` | 規範 UUID 形式的相同會話 ID |

120| `CLAUDE_RUNNER_API_BASE_URL` | 用於會話範圍呼叫的 Anthropic API 基礎 URL |138| `CLAUDE_RUNNER_API_BASE_URL` | 用於會話範圍呼叫的 Anthropic API 基礎 URL |

121| `CLAUDE_RUNNER_CLIENT_PLATFORM` | 建立會話的用戶端表面,例如 `web_claude_ai`、`desktop_app` 或 `ios`。當會話沒有記錄或識別的表面時未設定。 |139| `CLAUDE_RUNNER_CLIENT_PLATFORM` | 建立工作階段的用戶端使用介面,例如 `web_claude_ai`、`desktop_app` 或 `ios`。當工作階段沒有已記錄或可辨識的使用介面時不會設定,因此在 `set -u` 下請以 `${CLAUDE_RUNNER_CLIENT_PLATFORM:-}` 參照它。需要 Claude Code v2.1.229 或更新版本。 |

122| `CLAUDE_CODE_SESSION_ACCESS_TOKEN` | 會話存取權杖,用於會話範圍的 API 呼叫 |140| `CLAUDE_CODE_SESSION_ACCESS_TOKEN` | 會話存取權杖,用於會話範圍的 API 呼叫 |

123| `GIT_CONFIG_COUNT`、`GIT_CONFIG_KEY_n`、`GIT_CONFIG_VALUE_n` | 執行器為您的 hook 所執行之 git 固定的 Git 設定。[生命週期 hook 內的 Git 設定](#git-configuration-inside-lifecycle-hooks)說明了這些設定。需要 Claude Code v2.1.280 或更新版本。 |141| `GIT_CONFIG_COUNT`、`GIT_CONFIG_KEY_n`、`GIT_CONFIG_VALUE_n` | 執行器為您的 hook 所執行之 git 固定的 Git 設定。[生命週期 hook 內的 Git 設定](#git-configuration-inside-lifecycle-hooks)說明了這些設定。需要 Claude Code v2.1.280 或更新版本。 |

124 142 

125指令碼必須在 `CLAUDE_RUNNER_CHECKOUT_PATH` 留下一個工作樹,簽出在要求的修訂版本。分離的 HEAD 是可以的;執行器在頂部建立會話的工作分支。執行器之後驗證路徑包含 `.git`;如果您的掛鉤具體化非 git 來源(例如 Perforce 或解包的 tarball),請在執行器的環境中設定 `CLAUDE_RUNNER_SKIP_GIT_VERIFY=1` 以跳過該檢查。基於 Git 的流程(例如工作分支建立和推送結果)需要 git 簽出,因此使用 [`post-session` 掛鉤](#post-session)從非 git 樹匯出結果。143指令碼必須在 `CLAUDE_RUNNER_CHECKOUT_PATH` 留下一個簽出於所要求修訂版本的工作樹。分離的 HEAD 也可以,因為執行器會在其上建立工作階段的工作分支。

126 144 

127執行器不會將 git 認證傳遞給掛鉤。相反,從會話的身份鑄造每個會話的複製認證:根據[驗證來自您的服務的權杖](/docs/zh-TW/self-hosted-environments-identity#verify-the-token-from-your-service)中所述,使用標準 JWT 庫針對 `CLAUDE_RUNNER_API_BASE_URL` 下的 JWKS 端點驗證 `CLAUDE_CODE_SESSION_ACCESS_TOKEN`,然後讓您的認證服務為權杖的 `act` 聲明中的身份發行短期複製認證。`CLAUDE_RUNNER_CLAUDE_BIN` 未在簽出掛鉤環境中設定,因此 `decode-token` 子命令在此不可用。回退到主機已有的任何 git 驗證(例如 SSH 代理、認證助手或 `.netrc`)也是一個選項。145在您的 hook 返回後,執行器會驗證 `CLAUDE_RUNNER_CHECKOUT_PATH` 包含 `.git`。如果您的 hook 具體化的是非 git 來源(例如 Perforce 或解開的 tarball),請在執行器的環境中設定 `CLAUDE_RUNNER_SKIP_GIT_VERIFY=1` 以略過該檢查。基於 Git 的流程(例如建立工作分支與推送結果)需要 git 簽出,因此請使用 [`post-session` hook](#post-session) 從非 git 樹匯出結果。

128 146 

129當掛鉤以非零狀態退出,或以 0 退出而沒有在後面留下可用的簽出時,執行器執行的操作取決於儲存庫:147<h4 id="get-git-credentials-in-the-hook">

148 在 hook 中取得 git 憑證

149</h4>

130 150 

131* **會話推送結果的儲存庫**:執行器失敗會話,在非零退出時將指令碼的 stderr 尾部呈現給使用者。151執行器不會將 git 憑證傳遞給 hook。`decode-token` 子命令在此也無法使用,因為 `CLAUDE_RUNNER_CLAUDE_BIN` 未在 checkout hook 環境中設定。請改為從工作階段的身分產生每個工作階段的複製憑證,或退而使用主機本身的 git 身分驗證:

132* **會話只從中讀取的儲存庫**,例如新增到執行中會話的儲存庫:執行器記錄帶有失敗詳細資訊的 `[runner:warn]` 行,向會話發佈 `Skipped` 步驟,移除掛鉤在簽出路徑留下的任何內容,並繼續處理其餘儲存庫。當執行器無法立即移除路徑時,它會在會話結束時重試移除。如果跳過使會話完全沒有儲存庫,執行器仍然會失敗會話。

133 152 

134在 v2.1.228 之前,執行器在任何儲存庫的掛鉤失敗時失敗會話,因此掛鉤無法提供的唯讀儲存庫在會話在每個新執行器上恢復時再次失敗會話。153* **每個工作階段的複製憑證**:依照[從您的服務驗證 token](/docs/zh-TW/self-hosted-environments-identity#verify-the-token-from-your-service)所述,使用標準 JWT 函式庫,針對 `CLAUDE_RUNNER_API_BASE_URL` 下的 JWKS 端點驗證 `CLAUDE_CODE_SESSION_ACCESS_TOKEN`。接著讓您的憑證服務為 token 的 `act` 宣告中的身分核發短期複製憑證。請以 `act.sub` 作為該憑證的識別鍵,且不要要求 `act.email`。

154* **主機 git 身分驗證**:使用主機已有的任何 git 身分驗證,例如 SSH agent、憑證輔助程式或 `.netrc`。

135 155 

136執行器在會話結束後移除簽出路徑。156<h4 id="when-the-hook-fails">

157 hook 失敗時

158</h4>

159 

160當 hook 以非零狀態結束,或以 0 結束卻未留下可用的簽出時,即視為 hook 失敗:

161 

162* **會話推送結果的儲存庫**:執行器失敗會話,在非零退出時將指令碼的 stderr 尾部呈現給使用者。

163* **工作階段只會讀取的儲存庫**,例如新增到執行中工作階段的儲存庫:執行器會記錄一行帶有失敗詳細資訊的 `[runner:warn]`,向工作階段發佈 `Skipped` 步驟,移除 hook 在簽出路徑留下的任何內容,並繼續處理其餘儲存庫。如果略過後工作階段完全沒有任何儲存庫,執行器仍會使工作階段失敗。

164 

165當 hook 成功時,執行器會在工作階段結束後移除簽出路徑。

137 166 

138<h3 id="post-session">167<h3 id="post-session">

139 post-session168 post-session


151| `CLAUDE_RUNNER_WORKSPACE_PATHS` | 會話工作樹的冒號分隔絕對路徑。零儲存庫會話為空。 |180| `CLAUDE_RUNNER_WORKSPACE_PATHS` | 會話工作樹的冒號分隔絕對路徑。零儲存庫會話為空。 |

152| `CLAUDE_RUNNER_DEBUG_LOG_PATH` | 會話的偵錯日誌的路徑,在掛鉤執行時仍在磁碟上 |181| `CLAUDE_RUNNER_DEBUG_LOG_PATH` | 會話的偵錯日誌的路徑,在掛鉤執行時仍在磁碟上 |

153| `CLAUDE_RUNNER_API_BASE_URL` | 用於會話範圍呼叫的 Anthropic API 基礎 URL |182| `CLAUDE_RUNNER_API_BASE_URL` | 用於會話範圍呼叫的 Anthropic API 基礎 URL |

154| `CLAUDE_RUNNER_CLIENT_PLATFORM` | 建立會話的用戶端表面,例如 `web_claude_ai`、`desktop_app` 或 `ios`。當會話沒有記錄或識別的表面時未設定。需要 Claude Code v2.1.229 或更新版本。 |183| `CLAUDE_RUNNER_CLIENT_PLATFORM` | 建立工作階段的用戶端使用介面,例如 `web_claude_ai`、`desktop_app` 或 `ios`。當工作階段沒有已記錄或可辨識的使用介面時不會設定,因此在 `set -u` 下請以 `${CLAUDE_RUNNER_CLIENT_PLATFORM:-}` 參照它。需要 Claude Code v2.1.229 或更新版本。 |

155| `CLAUDE_CODE_SESSION_ACCESS_TOKEN` | 會話存取權杖,用於會話範圍的 API 呼叫 |184| `CLAUDE_CODE_SESSION_ACCESS_TOKEN` | 會話存取權杖,用於會話範圍的 API 呼叫 |

156| `GIT_CONFIG_COUNT`、`GIT_CONFIG_KEY_n`、`GIT_CONFIG_VALUE_n` | 執行器為您的 hook 所執行之 git 固定的 Git 設定。[生命週期 hook 內的 Git 設定](#git-configuration-inside-lifecycle-hooks)說明了這些設定。需要 Claude Code v2.1.280 或更新版本。 |185| `GIT_CONFIG_COUNT`、`GIT_CONFIG_KEY_n`、`GIT_CONFIG_VALUE_n` | 執行器為您的 hook 所執行之 git 固定的 Git 設定。[生命週期 hook 內的 Git 設定](#git-configuration-inside-lifecycle-hooks)說明了這些設定。需要 Claude Code v2.1.280 或更新版本。 |

157 186 

158`CLAUDE_RUNNER_EXIT_REASON` 採用四個值之一:187`CLAUDE_RUNNER_EXIT_REASON` 採用四個值之一:

159 188 

160* `completed`:會話乾淨地結束。Claude Code 程序正常退出,或會話在仍在執行時被存檔或刪除。189* `completed`:工作階段正常結束。Claude Code 程序正常結束,或在工作階段被封存或刪除後自行結束。

161* `failed`:Claude Code 程序崩潰,或在它啟動後設定失敗。190* `failed`:Claude Code 程序崩潰,或在它啟動後設定失敗。

162* `interrupted`:執行器停止了會話。它釋放會話以釋放插槽、會話在啟動時逾時、伺服器將會話移出此執行器、執行器正在排水,或會話超過其 [`--kill-session-after-min`](/docs/zh-TW/self-hosted-environments-reference#runner-cli-flags) 限制。191* `interrupted`:執行器停止了工作階段,屬於下列其中一種情況:

192 * 執行器釋放工作階段以空出插槽。

193 * 工作階段在啟動時逾時。

194 * 伺服器將工作階段移出此執行器。

195 * 執行器的輪詢在程序結束前察覺到封存或刪除。

196 * 執行器正在排空。

197 * 工作階段超過其 [`--kill-session-after-min`](/docs/zh-TW/self-hosted-environments-reference#runner-cli-flags) 限制。

163* `abandoned`:保留給另一個執行器聲稱的會話。掛鉤目前在該情況下不觸發。198* `abandoned`:保留給另一個執行器聲稱的會話。掛鉤目前在該情況下不觸發。

164 199 

165[會話生命週期計數器](/docs/zh-TW/self-hosted-environments-reference#session-lifecycle-counter-semantics)將釋放、啟動逾時和伺服器移動計為 `completed` 而不是 `interrupted`,因為執行器乾淨地交回了插槽。如果您將掛鉤收據與計數器進行比較,請預期該差異。200如果您將 hook 收到的結果與[工作階段生命週期計數器](/docs/zh-TW/self-hosted-environments-reference#session-lifecycle-counter-semantics)進行比較,請預期部分 `interrupted` 結果在計數器中會被計為 `completed`。計數器會將釋放、啟動逾時、伺服器移動,以及由執行器輪詢先察覺到的封存或刪除計為 `completed`,因為執行器已乾淨地交回插槽。

166 201 

167掛鉤的結束狀態永遠不會影響會話結果;失敗被記錄並忽略。執行器在每個會話結束(包括執行器關閉)時等待最多 `--post-session-hook-timeout-sec`(預設 60 秒)。此範例將未提交的工作保存到救援分支:202掛鉤的結束狀態永遠不會影響會話結果;失敗被記錄並忽略。執行器在每個會話結束(包括執行器關閉)時等待最多 `--post-session-hook-timeout-sec`(預設 60 秒)。此範例將未提交的工作保存到救援分支:

168 203 

169```bash theme={null}204```bash theme={null}

170#!/usr/bin/env bash205#!/usr/bin/env bash

171set -u206set -u

207export GIT_ALLOW_PROTOCOL=${GIT_ALLOW_PROTOCOL:-https:http:ssh}

172IFS=':'208IFS=':'

173# -c overrides beat repo-local settings, blocking session-written fsmonitor,209# -c overrides beat repo-local settings, blocking session-written fsmonitor,

174# hook-path, and gpg-program config from executing code with the hook's210# hook-path, and gpg-program config from executing code with the hook's


188done224done

189```225```

190 226 

227指令碼中的 `GIT_ALLOW_PROTOCOL` 這一行將 git 限制為 HTTPS、HTTP 與 SSH 遠端。如果執行器的環境已自行設定非空的 `GIT_ALLOW_PROTOCOL` 清單,指令碼會保留該清單。

228 

191hook 會使用執行器主機上其自身環境中可用的任何 git 憑證進行推送。在[映像中不含憑證的做法](/docs/zh-TW/self-hosted-environments-deploy#configure-git)下,包括內建複製經由 Anthropic git 代理伺服器進行時,都不會有任何憑證,因此請在推送前於 hook 內產生短期推送憑證:將 hook 在 `CLAUDE_CODE_SESSION_ACCESS_TOKEN` 中收到的工作階段 token 與您自己的 token 服務交換,並依照[驗證工作階段身分](/docs/zh-TW/self-hosted-environments-identity)所述進行驗證。當 hook 持有工作階段所沒有的憑證時,請將 `origin` 替換為由操作人員提供的 URL,並傳遞 `-c credential.helper=` 加上您自己的輔助程式。[生命週期 hook 內的 Git 設定](#git-configuration-inside-lifecycle-hooks)說明了工作階段寫入的設定仍可能影響哪些部分。229hook 會使用執行器主機上其自身環境中可用的任何 git 憑證進行推送。在[映像中不含憑證的做法](/docs/zh-TW/self-hosted-environments-deploy#configure-git)下,包括內建複製經由 Anthropic git 代理伺服器進行時,都不會有任何憑證,因此請在推送前於 hook 內產生短期推送憑證:將 hook 在 `CLAUDE_CODE_SESSION_ACCESS_TOKEN` 中收到的工作階段 token 與您自己的 token 服務交換,並依照[驗證工作階段身分](/docs/zh-TW/self-hosted-environments-identity)所述進行驗證。當 hook 持有工作階段所沒有的憑證時,請將 `origin` 替換為由操作人員提供的 URL,並傳遞 `-c credential.helper=` 加上您自己的輔助程式。[生命週期 hook 內的 Git 設定](#git-configuration-inside-lifecycle-hooks)說明了工作階段寫入的設定仍可能影響哪些部分。

192 230 

193<h4 id="hook-timing-when-the-runner-releases-a-session">231<h4 id="hook-timing-when-the-runner-releases-a-session">


264| `CLAUDE_RUNNER_ORDER_ID` | 不透明的冪等性金鑰,每個啟動請求唯一,對 Kubernetes 資源名稱安全。將其用作您的佈建程式的去重金鑰。 |302| `CLAUDE_RUNNER_ORDER_ID` | 不透明的冪等性金鑰,每個啟動請求唯一,對 Kubernetes 資源名稱安全。將其用作您的佈建程式的去重金鑰。 |

265| `CLAUDE_RUNNER_SESSION_ID` | 此請求所針對的工作階段。它在每次重新請求工作階段時重複,因此將其用於記錄和路由,而不是作為去重金鑰。對於預熱請求為空,預熱請求會在設定 [`--min-idle`](/docs/zh-TW/self-hosted-environments-reference#orchestrator-cli-flags) 時在任何特定工作階段之前啟動待命執行器,因此不要假設變數已設定。 |303| `CLAUDE_RUNNER_SESSION_ID` | 此請求所針對的工作階段。它在每次重新請求工作階段時重複,因此將其用於記錄和路由,而不是作為去重金鑰。對於預熱請求為空,預熱請求會在設定 [`--min-idle`](/docs/zh-TW/self-hosted-environments-reference#orchestrator-cli-flags) 時在任何特定工作階段之前啟動待命執行器,因此不要假設變數已設定。 |

266| `CLAUDE_RUNNER_SESSION_UUID` | 相同的工作階段 ID,採用規範 UUID 形式。對於預熱請求為空。 |304| `CLAUDE_RUNNER_SESSION_UUID` | 相同的工作階段 ID,採用規範 UUID 形式。對於預熱請求為空。 |

267| `CLAUDE_RUNNER_ATTEMPT` | 此工作階段已有多少個啟動請求。對於預熱請求為 `0`。 |305| `CLAUDE_RUNNER_ATTEMPT` | 用於記錄的每個工作階段計數器。它不是重試次數,也不是請求次數。對於預熱請求為 `0`,但針對某個工作階段的請求也可能帶有 `0`。 |

268| `CLAUDE_RUNNER_ORDER_SERVER_TIME` | 來自輪詢回應的 HTTP `Date` 標頭的伺服器時間。當 hook 驗證工作單 JWT 的 `exp` 時,請與此值進行比較,而不是本地時鐘,以容許時間偏差。當閘道省略標頭時為空。 |306| `CLAUDE_RUNNER_ORDER_SERVER_TIME` | 來自輪詢回應的 HTTP `Date` 標頭的伺服器時間。當 hook 驗證工作單 JWT 的 `exp` 時,請與此值進行比較,而不是本地時鐘,以容許時間偏差。當閘道省略標頭時為空。 |

269| `CLAUDE_RUNNER_POOL_ID` | 新執行器應加入的環境的 ID,採用 `ccpool_...` 形式 |307| `CLAUDE_RUNNER_POOL_ID` | 新執行器應加入的環境的 ID,採用 `ccpool_...` 形式 |

270| `CLAUDE_RUNNER_ACCOUNT_ID` | 排隊工作階段的帳戶的標記 ID,用於按帳戶路由、配額或退款。不可用時為空,Claude Tag 頻道工作階段始終為空,這些工作階段沒有帳戶排隊。 |308| `CLAUDE_RUNNER_ACCOUNT_ID` | 排隊工作階段的帳戶的標記 ID,用於按帳戶路由、配額或退款。不可用時為空,Claude Tag 頻道工作階段始終為空,這些工作階段沒有帳戶排隊。 |

271| `CLAUDE_RUNNER_ACCOUNT_EMAIL` | 排隊工作階段的帳戶的電子郵件。不可用時為空。將電子郵件視為個人可識別資訊,不要記錄它。 |309| `CLAUDE_RUNNER_ACCOUNT_EMAIL` | 排隊工作階段的帳戶的電子郵件。不可用時為空。將電子郵件視為個人可識別資訊,不要記錄它。 |

272| `CLAUDE_RUNNER_PRIMARY_REPO_URL` | 工作階段的第一個 git 來源的 URL,用於路由到預先準備了該儲存庫的執行器。工作階段沒有 git 來源時為空。 |310| `CLAUDE_RUNNER_PRIMARY_REPO_URL` | 工作階段的第一個 git 來源的 URL,用於路由到預先準備了該儲存庫的執行器。工作階段沒有 git 來源時為空。 |

273| `CLAUDE_RUNNER_PRIMARY_REPO_REVISION` | 工作階段的第一個 git 來源的修訂版本:分支、SHA 或標籤。未指定時為空。 |311| `CLAUDE_RUNNER_PRIMARY_REPO_REVISION` | 工作階段的第一個 git 來源的修訂版本:分支、SHA、標籤或完整參照名稱。未指定時為空。 |

274| `CLAUDE_RUNNER_REPO_SOURCES` | 所有工作階段的 git 來源的 `{url, revision}` 的 JSON 陣列,用於在次要儲存庫上路由的 hook。沒有來源時為空。 |312| `CLAUDE_RUNNER_REPO_SOURCES` | 所有工作階段的 git 來源的 `{url, revision}` 的 JSON 陣列,用於在次要儲存庫上路由的 hook。沒有來源時為空。 |

275| `CLAUDE_RUNNER_CORRELATION_ID` | 在工作階段建立時提供的相關 ID,回顯以便 hook 可以將此工作單對應到建立工作階段的請求。工作階段沒有時為空。 |313| `CLAUDE_RUNNER_CORRELATION_ID` | 在工作階段建立時提供的相關 ID,回顯以便 hook 可以將此工作單對應到建立工作階段的請求。工作階段沒有時為空。 |

276| `CLAUDE_RUNNER_CLIENT_PLATFORM` | 建立工作階段的用戶端表面,例如 `web_claude_ai`、`desktop_app`、`ios` 或 `scheduled_trigger`,用於採用分析。當工作階段沒有記錄或識別的表面時未設定,對於預熱請求也未設定;使用 `[ -n "${CLAUDE_RUNNER_CLIENT_PLATFORM:-}" ]` 檢查它,在 `set -u` 下保持安全。 |314| `CLAUDE_RUNNER_CLIENT_PLATFORM` | 建立工作階段的用戶端表面,例如 `web_claude_ai`、`desktop_app`、`ios` 或 `scheduled_trigger`,用於採用分析。當工作階段沒有記錄或識別的表面時未設定,對於預熱請求也未設定;使用 `[ -n "${CLAUDE_RUNNER_CLIENT_PLATFORM:-}" ]` 檢查它,在 `set -u` 下保持安全。 |


282* **在啟動的執行器上使用 `--capacity 1`**:工作階段綁定的工作單恰好註冊一個綁定到該工作階段的執行器,因此更高的容量會新增永遠不會接收工作的插槽,執行器在啟動時會記錄警告。320* **在啟動的執行器上使用 `--capacity 1`**:工作階段綁定的工作單恰好註冊一個綁定到該工作階段的執行器,因此更高的容量會新增永遠不會接收工作的插槽,執行器在啟動時會記錄警告。

283* **預熱工作單註冊未綁定**:待命執行器未綁定到工作階段,並像固定群組執行器一樣聲稱已排隊的工作。321* **預熱工作單註冊未綁定**:待命執行器未綁定到工作階段,並像固定群組執行器一樣聲稱已排隊的工作。

284 322 

285合約有四個佈建程式無關的規則:323無論您的 hook 在哪個平台上佈建,合約都有四條規則:

286 324 

2871. **在 `CLAUDE_RUNNER_ORDER_ID` 上保持冪等性。** 重新傳遞相同的請求最多必須啟動一個執行器。從 ID 衍生確定性資源名稱,並讓您的平台拒絕重複項。不要改為在 `CLAUDE_RUNNER_SESSION_ID` 上進行金鑰設定。每次重新請求工作階段都會使用相同的工作階段 ID 和新的訂單 ID,因此按工作階段 ID 命名或去重的工作負載會為該工作階段建立一次,之後永遠不會再建立。3251. **在 `CLAUDE_RUNNER_ORDER_ID` 上保持冪等性。** 重新傳遞相同的請求最多必須啟動一個執行器。從 ID 衍生確定性資源名稱,並讓您的平台拒絕重複項。不要改為在 `CLAUDE_RUNNER_SESSION_ID` 上進行金鑰設定。每次重新請求工作階段都會使用相同的工作階段 ID 和新的訂單 ID,因此按工作階段 ID 命名或去重的工作負載會為該工作階段建立一次,之後永遠不會再建立。

2882. **不要重試工作負載。** 一個訂單 ID 最多意味著建立一個工作負載。如果執行器永遠不註冊,Anthropic 會在 `--expected-spawn-seconds` 後使用新的訂單 ID 重新請求。3262. **不要重試工作負載。** 一個訂單 ID 最多意味著建立一個工作負載。如果執行器永遠不註冊,Anthropic 會在 `--expected-spawn-seconds` 後使用新的訂單 ID 重新請求。

2893. **使用退出代碼合約。** 退出 0 表示已提交。退出 1 表示可重試的失敗;工作階段退避並被重新提供。退出 2 或更高表示不可重試;工作階段被阻止再次啟動,直到 [Owner](/docs/zh-TW/cloud-environments#organization-shared-environments) 在環境的 **Activity** 標籤中選擇 **Retry**。在非零退出時,hook 的 stderr 的尾部會作為失敗原因出現在那裡,因此將可操作的錯誤寫入 stderr,永遠不要寫入祕密。對於預熱請求,沒有工作階段失敗:協調器只在本地記錄非零退出,伺服器在租約後重新請求啟動。3273. **使用退出碼合約。** 以符合結果的狀態退出:

2904. **將 `--expected-spawn-seconds` 設定為至少您的 p99 啟動時間。** 這是伺服器端租約。所有協調器副本必須使用相同的值。328 

329 * **退出 0**:已提交。

330 * **退出 1**:可重試的失敗。工作階段會退避並被重新提供。

331 * **退出 2 或更高**:不可重試的失敗。工作階段會被阻止再次啟動,直到使用者向其傳送新訊息,或 [Owner](/docs/zh-TW/cloud-environments#organization-shared-environments) 在環境的 **Activity** 標籤中對其選擇 **Retry**。

332 

333 在非零退出時,hook 的 stderr 的尾部會作為失敗原因出現在 **Activity** 標籤中,因此將可操作的錯誤寫入 stderr,且永遠不要將祕密寫入其中。在 shell hook 中,請[保持暫時性失敗可重試](#keep-transient-failures-retryable-in-a-shell-hook)。

334 

335 預熱請求沒有可失敗的工作階段:協調器只在本地記錄非零退出,伺服器會在 `--expected-spawn-seconds` 租約到期後重新請求啟動。

3364. **將 `--expected-spawn-seconds` 設定為至少您從啟動請求到執行器註冊的 p99 時間。** 從協調器收到啟動請求時開始計算,並包含在您的平台上等待容量的時間以及啟動時間。此值是伺服器端租約,工作單會隨之過期,因此工作負載耗時更長的執行器將無法註冊。所有協調器副本必須使用相同的值。

291 337 

292hook 寫入 stdout 或 stderr 的所有內容都會出現在協調器的日誌中,認證會自動編輯。如果工作階段保持排隊,請檢查協調器的 `/healthz` 主體以取得佇列計數,然後在 [**Cloud environments** 管理頁面](https://claude.ai/admin-settings/cloud-environments) 上開啟您環境的 **Activity** 標籤:在那裡展開失敗的工作階段以查看其啟動錯誤,並選擇 **Retry** 以重新請求它。338hook 寫入 stdout 或 stderr 的所有內容都會出現在協調器的日誌中,認證會自動編輯。如果工作階段保持排隊,請檢查協調器的 `/healthz` 主體以取得佇列計數,然後在 [**Cloud environments** 管理頁面](https://claude.ai/admin-settings/cloud-environments) 上開啟您環境的 **Activity** 標籤:在那裡展開失敗的工作階段以查看其啟動錯誤,並選擇 **Retry** 以重新請求它。

293 339 

294保持排隊且在 **Activity** 標籤中沒有啟動錯誤的工作階段可能意味著 hook 是在工作階段 ID 上進行金鑰設定的。若要確認,請檢查您的平台是否有該工作階段的第一個啟動請求的工作負載,以及沒有重新請求的工作負載。如果是這樣,請改為在 `CLAUDE_RUNNER_ORDER_ID` 上進行工作負載金鑰設定。340保持排隊且在 **Activity** 標籤中沒有啟動錯誤的工作階段可能意味著 hook 是在工作階段 ID 上進行金鑰設定的。若要確認,請檢查您的平台是否有該工作階段的第一個啟動請求的工作負載,以及沒有重新請求的工作負載。如果是這樣,請改為在 `CLAUDE_RUNNER_ORDER_ID` 上進行工作負載金鑰設定。

295 341 

342<h4 id="keep-transient-failures-retryable-in-a-shell-hook">

343 在 shell hook 中保持暫時性失敗可重試

344</h4>

345 

346在使用 `set -e` 的 shell hook 中,原本重試即可排除的失敗可能會阻止工作階段。hook 會在失敗的命令處停止,並以該命令本身的狀態退出,而協調器會對該狀態套用退出碼合約。許多失敗會回傳 2 或更高的狀態,例如命令未安裝時的 `127`,以及 `curl --fail` 遇到 HTTP 錯誤時的 `22`,因此它們會在第一次失敗時就阻止工作階段。

347 

348已被 hook 阻止的工作階段會保持阻止狀態,直到使用者向其傳送新訊息,或 [Owner](/docs/zh-TW/cloud-environments#organization-shared-environments) 在環境的 **Activity** 標籤中對其選擇 **Retry**。

349 

350若要將此類失敗改為退出 1,請將以下幾行直接放在 hook 的 `#!` 行下方,位於任何可能失敗的內容之前:

351 

352```bash theme={null}

353set -e

354PERMANENT=; permanent() { printf '%s\n' "$*" >&2; PERMANENT=1; exit 2; }

355trap 'rc=$?; [ "$rc" -eq 0 ] || [ -n "${PERMANENT:-}" ] || exit 1' EXIT

356```

357 

358這幾行會改變 hook 其餘部分的行為,因此加入後,請檢查 hook 中是否有以下每種模式:

359 

360* **單獨的 `exit 2` 或更高**:設定 trap 後,它會變成退出 1。對於任何重試都無法修正的錯誤,請改為以原因呼叫 `permanent`,例如 `permanent "namespace claude-runners does not exist"`。請在主 shell 中呼叫它,不要在 `$( )`、`( )` 或管線中呼叫。

361* **`exec`**:不要以 `exec` 開始 hook 的最後一個命令,因為 `exec` 會取代 shell,trap 將不會執行。

362* **第二個 `EXIT` trap**:第二個 `trap ... EXIT` 會取代第一個,因此請將兩者合併為單一 trap。將您的清理命令直接放在 `rc=$?;` 之後,並在每個命令結尾加上 `|| true;`。如此一來,清理在失敗和成功時都會執行,且失敗的清理命令不會設定 hook 的退出狀態。以下合併後的 trap 展示了其形式,其中 `your-cleanup-command` 代表您自己的命令:

363 

364 ```bash theme={null}

365 trap 'rc=$?; your-cleanup-command || true; [ "$rc" -eq 0 ] || [ -n "${PERMANENT:-}" ] || exit 1' EXIT

366 ```

367* **允許失敗的命令**:如果 hook 之前未使用 `set -e`,它現在會在第一個回傳非零的命令處停止,例如找不到任何結果的查詢,或被您的平台拒絕的重複提交。如果 hook 會根據結果採取動作,請將該命令作為 `if` 的條件。如果它忽略結果,請在該命令後加上 `|| true`。

368 

369若要確認 trap 是否正常運作,請在 `trap` 行正下方新增一行,呼叫一個不存在的命令,例如 `no-such-command`。從您的 shell 執行 hook 檔案,確認 `echo $?` 輸出 `1`,然後移除該行。

370 

296<h2 id="send-model-requests-to-bedrock-or-agent-platform">371<h2 id="send-model-requests-to-bedrock-or-agent-platform">

297 將模型請求傳送至 Bedrock 或 Agent Platform372 將模型請求傳送至 Bedrock 或 Agent Platform

298</h2>373</h2>


381將模型請求傳送至 Amazon Bedrock 或 Google Cloud 的 Agent Platform 的工作階段,與 Anthropic API 上的工作階段有以下差異:456將模型請求傳送至 Amazon Bedrock 或 Google Cloud 的 Agent Platform 的工作階段,與 Anthropic API 上的工作階段有以下差異:

382 457 

383* **來自 claude.ai 的政策**:[伺服器管理設定](/docs/zh-TW/server-managed-settings)不會傳達至這些工作階段。Owner 在 Claude Code 管理設定中設定的組織政策也不會傳達,因此 Claude Code 不會在工作階段內強制執行這些政策。請將您所依賴的規則放入 runner 映像檔的[受管設定檔案](/docs/zh-TW/managed-settings#delivery-mechanisms)中。458* **來自 claude.ai 的政策**:[伺服器管理設定](/docs/zh-TW/server-managed-settings)不會傳達至這些工作階段。Owner 在 Claude Code 管理設定中設定的組織政策也不會傳達,因此 Claude Code 不會在工作階段內強制執行這些政策。請將您所依賴的規則放入 runner 映像檔的[受管設定檔案](/docs/zh-TW/managed-settings#delivery-mechanisms)中。

459* **帳戶 skill**:這些工作階段不會下載使用者的 claude.ai 帳戶所啟用的 skill。請參閱[每個工作階段的設定如何組成](#how-each-session’s-config-is-assembled)。

384* **檔案**:使用者在 claude.ai 或行動裝置或桌面應用程式中附加至工作階段的檔案不會傳達至工作階段,且 Claude 無法使用 [`SendUserFile` 工具](/docs/zh-TW/tools-reference)回傳檔案。請改將輸入檔案放在儲存庫中或 runner 上。460* **檔案**:使用者在 claude.ai 或行動裝置或桌面應用程式中附加至工作階段的檔案不會傳達至工作階段,且 Claude 無法使用 [`SendUserFile` 工具](/docs/zh-TW/tools-reference)回傳檔案。請改將輸入檔案放在儲存庫中或 runner 上。

385* **模型選擇**:Anthropic 的控制平面會傳送每個工作階段的模型,當工作階段在沒有指定模型的情況下啟動時,Claude Code 會使用該供應商的預設模型。Runner 會從其傳遞給工作階段的環境中移除 `ANTHROPIC_MODEL` 和 `ANTHROPIC_DEFAULT_MODEL`。供應商頁面的範例會設定 `ANTHROPIC_MODEL`,但在 runner 的環境中,這兩個變數都沒有任何作用。[Amazon Bedrock](/docs/zh-TW/amazon-bedrock#4-pin-model-versions) 和 [Agent Platform](/docs/zh-TW/google-vertex-ai#5-pin-model-versions) 的「固定模型版本」中的各模型系列變數確實會傳達至工作階段。這些變數決定的是 `opus` 等別名解析為哪個模型,而非完整模型 ID 解析為哪個模型。461* **模型選擇**:Anthropic 的控制平面會傳送每個工作階段的模型,當工作階段在沒有指定模型的情況下啟動時,Claude Code 會使用該供應商的預設模型。您無法透過 runner 環境中的 `ANTHROPIC_MODEL` 或 `ANTHROPIC_DEFAULT_MODEL` 選擇模型,但可以固定別名所解析的目標:

462 * **`ANTHROPIC_MODEL` 和 `ANTHROPIC_DEFAULT_MODEL`**:即使供應商頁面的範例會設定 `ANTHROPIC_MODEL`,runner 仍會從其傳遞給工作階段的環境中移除這兩個變數。

463 * **各模型系列的固定變數**:[Amazon Bedrock](/docs/zh-TW/amazon-bedrock#4-pin-model-versions) 和 [Agent Platform](/docs/zh-TW/google-vertex-ai#5-pin-model-versions) 的「固定模型版本」中的變數確實會傳達至工作階段。這些變數決定的是 `opus` 等別名解析為哪個模型,而非完整模型 ID 解析為哪個模型。

386* **您的帳戶未提供的模型**:工作階段可能會在某則訊息上失敗,並出現指出該模型名稱的錯誤。請啟用您的開發人員可以選擇的模型、「固定模型版本」中所述的背景模型,以及[自動模式](/docs/zh-TW/permission-modes#enable-auto-mode-on-bedrock-agent-platform-or-foundry)所使用的分類器模型。在 Amazon Bedrock 上,請在您的政策中允許其中每一個模型。464* **您的帳戶未提供的模型**:工作階段可能會在某則訊息上失敗,並出現指出該模型名稱的錯誤。請啟用您的開發人員可以選擇的模型、「固定模型版本」中所述的背景模型,以及[自動模式](/docs/zh-TW/permission-modes#enable-auto-mode-on-bedrock-agent-platform-or-foundry)所使用的分類器模型。在 Amazon Bedrock 上,請在您的政策中允許其中每一個模型。

387* **網路搜尋和快速模式**:[網路搜尋](/docs/zh-TW/tools-reference#websearch-tool-behavior)在 Amazon Bedrock 上無法使用,而[快速模式](/docs/zh-TW/fast-mode)在兩個供應商上都無法使用。關於其他因供應商而異的功能,請參閱[因供應商而異的 CLI 功能](/docs/zh-TW/feature-availability#cli-capabilities-that-vary-by-provider)。465* **網路搜尋和快速模式**:[網路搜尋](/docs/zh-TW/tools-reference#websearch-tool-behavior)在 Amazon Bedrock 上無法使用,而[快速模式](/docs/zh-TW/fast-mode)在兩個供應商上都無法使用。關於其他因供應商而異的功能,請參閱[因供應商而異的 CLI 功能](/docs/zh-TW/feature-availability#cli-capabilities-that-vary-by-provider)。

388 466 


411 489 

412工作階段會繼承 runner 的環境,因此請在該處設定 [`ENABLE_TOOL_SEARCH`](/docs/zh-TW/mcp#scale-with-mcp-tool-search),以控制 runner 產生的每個工作階段的 MCP 工具搜尋;各個值的說明請參閱 MCP 頁面。490工作階段會繼承 runner 的環境,因此請在該處設定 [`ENABLE_TOOL_SEARCH`](/docs/zh-TW/mcp#scale-with-mcp-tool-search),以控制 runner 產生的每個工作階段的 MCP 工具搜尋;各個值的說明請參閱 MCP 頁面。

413 491 

492<a id="connection-timing" />

493 

494<h3 id="wait-for-mcp-servers-before-the-first-turn">

495 在第一個回合前等待 MCP 伺服器

496</h3>

497 

498自架的工作階段會在兩個不同的時間點,短暫等待仍在連線中的 MCP 伺服器。錯過等待的伺服器,其工具在第一個回合開始時將不可用,之後無需您採取任何動作即會變為可用。這兩次等待如下:

499 

500* **工作階段啟動**:在首次取得工具清單之前,工作階段預設最多會等待 5 秒,等待項目中設定了 [`alwaysLoad: true`](/docs/zh-TW/mcp#exempt-a-server-from-deferral) 的 HTTP 或 SSE 伺服器;若您在 runner 的環境中設定了 [`MCP_CONNECTION_NONBLOCKING=0`](/docs/zh-TW/env-vars),則會等待所有伺服器。否則,HTTP 和 SSE 伺服器會在背景中連線。工作階段在此等待期間,初始化速度會較慢。[`MCP_CONNECT_TIMEOUT_MS`](/docs/zh-TW/env-vars) 可變更 5 秒的預設值。

501* **第一個回合**:在訊息抵達後,第一個回合最多會等待 2 秒,等待仍在連線中的 stdio 伺服器。工作階段在此等待期間,第一個回覆會較慢。若要變更此等待的時間長度,請在 runner 的環境中設定 [`CLAUDE_CODE_MCP_STARTUP_WAIT_MS`](/docs/zh-TW/env-vars)。它不會變更此等待涵蓋哪些伺服器。需要 Claude Code v2.1.274 或更新版本。

502 

503`claude mcp add` 沒有 `alwaysLoad` 旗標。若要設定此鍵,請改用 `claude mcp add-json` 加入伺服器,它會在伺服器的 JSON 中接受此鍵並將其寫入 `.claude.json`。在您的 Dockerfile 中:

504 

505```dockerfile theme={null}

506RUN claude mcp add-json core '{"type":"http","url":"https://mcp.example.com/mcp","alwaysLoad":true}' --scope user

507```

508 

509如果伺服器的工具在之後的回合中也沒有出現,請依照 [MCP 伺服器](#mcp-servers)中的說明,檢查該伺服器是否有傳達到工作階段。

510 

414<h3 id="turn-off-built-in-session-tools">511<h3 id="turn-off-built-in-session-tools">

415 關閉內建工作階段工具512 關閉內建工作階段工具

416</h3>513</h3>


571 668 

572設定 `SELF_HOSTED_RUNNER_HOST_CONFIG_DIR` 以從不同路徑植入,或將其指向空目錄以停用植入。669設定 `SELF_HOSTED_RUNNER_HOST_CONFIG_DIR` 以從不同路徑植入,或將其指向空目錄以停用植入。

573 670 

574儲存庫提交的 `.claude/settings.json` 會作為專案設定疊加於其上。在包含多個儲存庫的工作階段中,[最多只有一個儲存庫的檔案會生效](#repository-settings-in-sessions-with-several-repositories)。工作階段也會從執行器映像中的標準系統路徑讀取 [`managed-settings.json`](/docs/zh-TW/settings#where-settings-live)。其設定鍵是否與[伺服器受管設定](/docs/zh-TW/server-managed-settings)一併套用,取決於 [Claude Code 如何組合受管來源](/docs/zh-TW/managed-settings#how-claude-code-combines-managed-sources):預設情況下,當您的組織傳遞任何伺服器受管設定鍵時,工作階段會忽略執行器映像的檔案,但 [Claude Code 從每個管理來源讀取的設定鍵](/docs/zh-TW/managed-settings#keys-read-from-every-admin-source)除外,例如 `env` 區塊、沙箱鎖定、沙箱二進位檔路徑和 `forceRemoteSettingsRefresh`。請參閱[設定優先順序](/docs/zh-TW/settings#settings-precedence)。671工作階段也會讀取以下設定檔:

672 

673* **專案設定**:儲存庫提交的 `.claude/settings.json` 會疊加於使用者層級基準之上。在包含多個儲存庫的工作階段中,[最多只有一個儲存庫的檔案會生效](#repository-settings-in-sessions-with-several-repositories)。

674* **受管設定**:工作階段會從執行器映像中的標準系統路徑讀取 [`managed-settings.json`](/docs/zh-TW/settings#where-settings-live)。關於其設定鍵是否與[伺服器受管設定](/docs/zh-TW/server-managed-settings)一併套用,請參閱 [Claude Code 如何組合受管來源](/docs/zh-TW/managed-settings#how-claude-code-combines-managed-sources)。

675 

676關於這些來源的套用順序,請參閱[設定優先順序](/docs/zh-TW/settings#settings-precedence)。

575 677 

576當 Anthropic 的控制平面為工作階段提供 [Claude Code hook](/docs/zh-TW/hooks) 時,執行器會將其與您自己的設定並存安裝,而非覆寫您的設定。需要 Claude Code v2.1.229 或更新版本。678當 Anthropic 的控制平面為工作階段提供 [Claude Code hook](/docs/zh-TW/hooks) 時,執行器會將其與您自己的設定並存安裝,而非覆寫您的設定。需要 Claude Code v2.1.229 或更新版本。

577 679 


579* **撰寫者**:控制平面以其自身部署中的固定常數填入這些指令碼,絕不來自個別工作階段或第三方輸入。681* **撰寫者**:控制平面以其自身部署中的固定常數填入這些指令碼,絕不來自個別工作階段或第三方輸入。

580* **仍受何者管控**:透過 `--settings` 傳遞的 hook 會進入一般的合併 hook 設定,而非受管層級,因此您的受管設定仍然適用。`disableAllHooks` 會停用它們,且它們不屬於 [`allowManagedHooksOnly`](/docs/zh-TW/settings-reference#allowmanagedhooksonly) 保持載入的類別。682* **仍受何者管控**:透過 `--settings` 傳遞的 hook 會進入一般的合併 hook 設定,而非受管層級,因此您的受管設定仍然適用。`disableAllHooks` 會停用它們,且它們不屬於 [`allowManagedHooksOnly`](/docs/zh-TW/settings-reference#allowmanagedhooksonly) 保持載入的類別。

581 683 

684當使用者啟動自己的工作階段時,Claude Code 也會將[其 claude.ai 帳戶已啟用的 skill](/docs/zh-TW/skills#skills-in-cowork-and-cloud-sessions) 下載至該工作階段的設定目錄。[routine](/docs/zh-TW/routines) 執行不會取得其擁有者的 skill,而[將模型請求傳送至 Bedrock 或 Agent Platform](#send-model-requests-to-bedrock-or-agent-platform) 的工作階段則不會下載任何 skill。若這些工作階段需要某個 skill,請將其提交至儲存庫的 `.claude/skills/`,或將其加入您的執行器映像。

685 

582在 [Claude Tag](https://claude.com/docs/claude-tag/overview) 工作階段以外,自託管環境中的工作階段預設會關閉[自動記憶](/docs/zh-TW/memory#auto-memory)。若有應跨工作階段延續的指令,請使用執行器映像或儲存庫中的 `CLAUDE.md`。686在 [Claude Tag](https://claude.com/docs/claude-tag/overview) 工作階段以外,自託管環境中的工作階段預設會關閉[自動記憶](/docs/zh-TW/memory#auto-memory)。若有應跨工作階段延續的指令,請使用執行器映像或儲存庫中的 `CLAUDE.md`。

583 687 

584執行器對主機 `~/.claude/` 的快照不包含 `projects/` 目錄。自動記憶的預設儲存位置就位於該目錄下。如果您將記憶檔案放在那裡,執行器不會將其植入工作階段,這些檔案也不會開啟自動記憶。688執行器對主機 `~/.claude/` 的快照不包含 `projects/` 目錄。自動記憶的預設儲存位置就位於該目錄下。如果您將記憶檔案放在那裡,執行器不會將其植入工作階段,這些檔案也不會開啟自動記憶。

Details

20 20 

21* **臨時的、每個工作階段的容器**:在新鮮容器或 VM 中執行每個執行器程序,該容器或 VM 在程序退出時被銷毀,使用 `--capacity 1` 和預設的 `--drain-grace-sec 0`,以便每個容器恰好服務一個工作階段。在更高的容量或正的清空寬限期下,一個容器服務來自同一[鎖定所有者](/docs/zh-TW/self-hosted-environments#key-concepts)的多個工作階段;請參閱[執行器生命週期](/docs/zh-TW/self-hosted-environments#runner-lifecycle)。不要在執行器重新啟動之間重複使用檔案系統,除非在刻意的[預熱簽出](#reuse-a-pre-warmed-checkout)設定中,並且永遠不要跨所有者。21* **臨時的、每個工作階段的容器**:在新鮮容器或 VM 中執行每個執行器程序,該容器或 VM 在程序退出時被銷毀,使用 `--capacity 1` 和預設的 `--drain-grace-sec 0`,以便每個容器恰好服務一個工作階段。在更高的容量或正的清空寬限期下,一個容器服務來自同一[鎖定所有者](/docs/zh-TW/self-hosted-environments#key-concepts)的多個工作階段;請參閱[執行器生命週期](/docs/zh-TW/self-hosted-environments#runner-lifecycle)。不要在執行器重新啟動之間重複使用檔案系統,除非在刻意的[預熱簽出](#reuse-a-pre-warmed-checkout)設定中,並且永遠不要跨所有者。

22 * <span id="processes-a-stopped-session-leaves" />當執行器停止工作階段時,它不會向在其 shell 命令結束後仍在執行的程序傳送任何訊號,例如已轉為常駐程式(daemonized)的服務。銷毀容器或 VM 會結束該程序。22 * <span id="processes-a-stopped-session-leaves" />當執行器停止工作階段時,它不會向在其 shell 命令結束後仍在執行的程序傳送任何訊號,例如已轉為常駐程式(daemonized)的服務。銷毀容器或 VM 會結束該程序。

23* **映像中沒有廣泛的認證**:不要包含長期的 SSH 金鑰、雲端提供商認證或授予超過工作階段需要的個人存取令牌。在工作階段期間使用的薄荷認證,例如推送或 API 令牌,從您的[包裝器指令碼](/docs/zh-TW/self-hosted-environments-configuration#wrapper-scripts)按工作階段進行。對於在包裝器執行之前發生的初始複製,使用 [`checkout` 生命週期鉤子](/docs/zh-TW/self-hosted-environments-configuration#checkout)或 [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy);請參閱[配置 Git](#configure-git)。23* **映像中沒有廣泛的憑證**:不要包含長期的 SSH 金鑰、雲端提供商憑證,或授予超過工作階段所需權限的個人存取 token。工作階段期間使用的憑證,例如推送或 API token,應從您的[包裝器指令碼](/docs/zh-TW/self-hosted-environments-configuration#wrapper-scripts)按工作階段產生。初始複製會在包裝器執行之前發生,因此請使用 [`checkout` 生命週期 hook](/docs/zh-TW/self-hosted-environments-configuration#checkout) 處理,或在工作階段的所有儲存庫都位於 github.com 上時使用 [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy)。關於這兩者,請參閱[設定 git](#configure-git)。

24* **讓工作階段無法接觸主機的 GitHub 憑證**:Claude 可以使用工作階段能讀取的任何 GitHub 憑證,並擁有該憑證所授予的任何存取權。請將執行器主機本身範圍廣泛的 GitHub 憑證排除在工作階段可讀取的任何位置之外。此類憑證可能是個人存取 token、`gh auth login` 為您的帳戶儲存的 token,或執行器環境中的 `GH_TOKEN`。

25 * **使用 [Anthropic 管理的 git](#use-the-anthropic-git-proxy) 時**:若有此類憑證,Claude 會直接連線到 GitHub,而不是透過 Anthropic 管理的 git。

26 * **不使用 Anthropic 管理的 git 時**:如果您依照[在映像中提供 git 設定](#ship-git-config-in-your-image)所述嚴格限制其範圍,複製憑證可以保留在映像中。

24* **將環境祕密保留在執行工作階段的主機之外**:環境祕密可以註冊執行器並拾取在環境上排隊的任何工作階段。在固定群中,它存在於每個執行器主機上,任何工作階段的程式碼都可以讀取祕密檔案。優先使用[按需執行器](/docs/zh-TW/self-hosted-environments-configuration#on-demand-runners),其中祕密保留在協調器主機上,該主機永遠不執行使用者程式碼,每個執行器接收單次使用的工作單據,該單據恰好註冊一個執行器。在固定群中,將環境祕密檔案視為可由每個工作階段讀取,並在任何懷疑的工作階段洩露後輪換祕密。27* **將環境祕密保留在執行工作階段的主機之外**:環境祕密可以註冊執行器並拾取在環境上排隊的任何工作階段。在固定群中,它存在於每個執行器主機上,任何工作階段的程式碼都可以讀取祕密檔案。優先使用[按需執行器](/docs/zh-TW/self-hosted-environments-configuration#on-demand-runners),其中祕密保留在協調器主機上,該主機永遠不執行使用者程式碼,每個執行器接收單次使用的工作單據,該單據恰好註冊一個執行器。在固定群中,將環境祕密檔案視為可由每個工作階段讀取,並在任何懷疑的工作階段洩露後輪換祕密。

25* **預設拒絕網路出站流量**:在每個環境上限制執行器和工作階段容器的出站流量在您自己的網路邊界;[預設拒絕出站流量](#default-deny-egress)涵蓋允許什麼以及為什麼。28* **預設拒絕網路出站流量**:在每個環境上限制執行器和工作階段容器的出站流量在您自己的網路邊界;[預設拒絕出站流量](#default-deny-egress)涵蓋允許什麼以及為什麼。

26* **最小權限主機 IAM**:附加到執行器主機的計算身份,例如執行個體設定檔或節點服務帳戶,應僅授予執行器本身需要的內容。工作階段應通過您的包裝器指令碼而不是繼承主機的身份來獲得自己的認證。29* **最小權限主機 IAM**:附加到執行器主機的計算身份,例如執行個體設定檔或節點服務帳戶,應僅授予執行器本身需要的內容。工作階段應通過您的包裝器指令碼而不是繼承主機的身份來獲得自己的認證。


42 防護無論 [`--trust-workspace`](/docs/zh-TW/self-hosted-environments-reference#runner-cli-flags)如何都會執行,並且不涵蓋儲存庫鉤子、`.mcp.json` 或 Bash 規則;請參閱[權限和工具批准](/docs/zh-TW/self-hosted-environments-configuration#permissions-and-tool-approval)以了解這些授予應該在哪裡。45 防護無論 [`--trust-workspace`](/docs/zh-TW/self-hosted-environments-reference#runner-cli-flags)如何都會執行,並且不涵蓋儲存庫鉤子、`.mcp.json` 或 Bash 規則;請參閱[權限和工具批准](/docs/zh-TW/self-hosted-environments-configuration#permissions-and-tool-approval)以了解這些授予應該在哪裡。

43 46 

44<Note>47<Note>

45 您組織的 IP 允許列表預設不涵蓋自託管執行器流量。不要依賴它作為執行器或工作階段流量的網路控制;改為在您自己的網路邊界應用預設拒絕出站流量,如果您想要為您的組織強制執行 IP 允許列表,請聯繫您的 Anthropic 帳戶團隊。48 如果您的組織已啟用 [IP 允許清單](https://support.claude.com/en/articles/13200993-restrict-access-to-claude-with-ip-allowlisting),請在啟動執行器和工作階段容器之前,將它們的公用出站位址加入允許清單。如果您執行[按需執行器](/docs/zh-TW/self-hosted-environments-configuration#on-demand-runners),也請加入協調器主機的位址。不要依賴允許清單作為執行器或工作階段流量的網路控制,而應改為在您自己的網路邊界套用預設拒絕出站流量。

46</Note>49</Note>

47 50 

48<h2 id="network-requirements">51<h2 id="network-requirements">


55 58 

56| 主機 | 連接埠 | 用途 |59| 主機 | 連接埠 | 用途 |

57| :- | :- | :- |60| :- | :- | :- |

58| `api.anthropic.com` | 443、HTTPS;WSS 僅用於 SCM 連接器 | 執行器控制平面和工作階段串流、模型推理、功能旗標、產品分析、[JWKS](/docs/zh-TW/self-hosted-environments-identity)金鑰提取、提交簽名、設定 `--use-anthropic-git-proxy` 時的 Git 代理,以及設定 `--scm-connector-host` 時協調器的 [SCM 連接器](/docs/zh-TW/self-hosted-environments-reference#scm-connector-flags)隧道 |61| `api.anthropic.com` | 443、HTTPS;WSS 用於 [Anthropic 管理的 Git](#use-the-anthropic-git-proxy) | 執行器控制平面和工作階段串流、模型推理、功能旗標、產品分析、[JWKS](/docs/zh-TW/self-hosted-environments-identity) 金鑰提取、提交簽名,以及設定 `--use-anthropic-git-proxy` 時的 Anthropic 管理的 Git |

59| 您的 Git 主機,例如 `github.com` 或您的 GitHub Enterprise 主機 | 443 或 22 | 複製和推送儲存庫。如果執行器使用 `--use-anthropic-git-proxy`(將 Git 流量路由通過 `api.anthropic.com`)則不需要。 |62| 您的 Git 主機,例如 `github.com` 或您的 GitHub Enterprise 主機 | 443 或 22 | 在執行器工作階段所使用的每個 Git 主機上複製和推送儲存庫。對於使用 [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy) 的執行器,請參閱[何時仍需要 `github.com` 路徑](#github-com-egress-with-the-anthropic-git-proxy)。 |

63 

64<span id="github-com-egress-with-the-anthropic-git-proxy" />使用 [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy) 的執行器會將其 `github.com` Git 流量路由通過 `api.anthropic.com`,因此不需要 `github.com` 的 Git 主機路徑。如果您設定了 `--push-outcome-on-release` 或從 `post-session` hook 推送,則仍需要該路徑。

60 65 

61這些主機是否需要取決於您的配置:66這些主機是否需要取決於您的配置:

62 67 


71| `browser-intake-us5-datadoghq.com` | 443 | Anthropic 錯誤報告上傳,僅在為工作階段帳戶啟用[錯誤報告](/docs/zh-TW/data-usage#telemetry-services)時發送。由 `DISABLE_ERROR_REPORTING=1` 或 `DISABLE_TELEMETRY=1` 抑制。 |76| `browser-intake-us5-datadoghq.com` | 443 | Anthropic 錯誤報告上傳,僅在為工作階段帳戶啟用[錯誤報告](/docs/zh-TW/data-usage#telemetry-services)時發送。由 `DISABLE_ERROR_REPORTING=1` 或 `DISABLE_TELEMETRY=1` 抑制。 |

72| 您的雲端供應商用於模型請求、模型查詢和更新憑證的端點,例如 `bedrock-runtime.us-east-1.amazonaws.com` 或 `aiplatform.googleapis.com` | 443 | 僅當執行器[將模型請求傳送至 Amazon Bedrock 或 Google Cloud 的 Agent Platform](/docs/zh-TW/self-hosted-environments-configuration#send-model-requests-to-bedrock-or-agent-platform) 時 |77| 您的雲端供應商用於模型請求、模型查詢和更新憑證的端點,例如 `bedrock-runtime.us-east-1.amazonaws.com` 或 `aiplatform.googleapis.com` | 443 | 僅當執行器[將模型請求傳送至 Amazon Bedrock 或 Google Cloud 的 Agent Platform](/docs/zh-TW/self-hosted-environments-configuration#send-model-requests-to-bedrock-or-agent-platform) 時 |

73 78 

74執行器不會到達 `statsig.anthropic.com`、`*.sentry.io`、`claude.ai` 或 `platform.claude.com`。這些主機出現在一些較舊的企業網路檢查清單中,但您不需要為執行器或工作階段流量允許列表它們:功能旗標提取進入 `api.anthropic.com`,執行器使用環境祕密而不是互動式 OAuth 進行身份驗證。兩個主機端流確實到達 `claude.ai`,因此從其出站流量允許的主機執行它們,而不是擴大工作階段容器出站流量:單行安裝程式在安裝時從 `claude.ai` 提取 `install.sh`,互動式 `claude auth login`([引導式設定](/docs/zh-TW/self-hosted-environments-quickstart#set-up-an-environment-and-runner)、`doctor` 的已登入模式和 [CI 分派](/docs/zh-TW/self-hosted-environments-testing#authenticate-from-ci)使用)通過 `claude.ai`、`claude.com` 和 `platform.claude.com` 登入。`mcp-proxy.anthropic.com` 也不是必需的:自託管工作階段不使用它,當為您的組織啟用時,將您的組織 claude.ai 連接器傳遞到工作階段通過 `api.anthropic.com` 路由。請參閱 [MCP 伺服器](/docs/zh-TW/self-hosted-environments-configuration#mcp-servers)。79您不需要為執行器或工作階段流量將這些主機加入允許清單:

80 

81* **`statsig.anthropic.com`、`*.sentry.io`、`claude.ai` 和 `platform.claude.com`**:這些主機出現在一些較舊的企業網路檢查清單中,但執行器不會連線到它們。功能旗標提取會前往 `api.anthropic.com`,而執行器使用環境祕密而非互動式 OAuth 進行身分驗證。

82* **`mcp-proxy.anthropic.com`**:自託管工作階段不使用它。當您的組織啟用連接器傳遞時,您組織的 claude.ai 連接器會透過 `api.anthropic.com` 到達工作階段。請參閱 [MCP 伺服器](/docs/zh-TW/self-hosted-environments-configuration#mcp-servers)。

83 

84以下主機端流程確實會連線到 `claude.ai`,因此請從出站流量允許連線到它的主機執行這些流程,而不是擴大工作階段容器的出站流量:

85 

86* **單行安裝程式**:在安裝時從 `claude.ai` 提取 `install.sh`。

87* **互動式 `claude auth login`**:透過 `claude.ai`、`claude.com` 和 `platform.claude.com` 登入。[引導式設定](/docs/zh-TW/self-hosted-environments-quickstart#run-the-guided-setup)、`doctor` 的已登入模式和 [CI 分派](/docs/zh-TW/self-hosted-environments-testing#authenticate-from-ci)會使用它。您用來登入的瀏覽器也會從 `hcaptcha.com`、`*.hcaptcha.com` 和 `challenges.cloudflare.com` 載入 claude.ai 登入頁面的瀏覽器檢查。

75 88 

76<h3 id="default-deny-egress">89<h3 id="default-deny-egress">

77 預設拒絕出站流量90 預設拒絕出站流量


127* **讓執行器配置 Git**:使用 `--configure-git` 啟動執行器,以使其寫入 Anthropic 託管工作階段使用的相同身份和提交簽名配置140* **讓執行器配置 Git**:使用 `--configure-git` 啟動執行器,以使其寫入 Anthropic 託管工作階段使用的相同身份和提交簽名配置

128* **在映像中提供 Git 配置**:自己設定身份和推送認證,例如在您自己的機器人身份下提交141* **在映像中提供 Git 配置**:自己設定身份和推送認證,例如在您自己的機器人身份下提交

129 142 

143對於 github.com 上的儲存庫,您也可以使用 [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy) 啟動執行器,或設定 `CLAUDE_RUNNER_USE_GIT_PROXY=1`,請 Anthropic 為執行器的工作階段提供 Git 服務。

144 

130執行器主機上的 Git 版本下限:[`--configure-git`](#let-the-runner-configure-git) SSH 提交簽名需要 Git 2.34 或更新版本,[`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy) 需要 2.32 或更新版本,從 [`--push-outcome-on-release`](/docs/zh-TW/self-hosted-environments-reference#runner-cli-flags) 推送的分支恢復工作階段需要 2.29 或更新版本。如果您省略所有三個並自己管理 Git 身份,Git 2.24 就足夠了。145執行器主機上的 Git 版本下限:[`--configure-git`](#let-the-runner-configure-git) SSH 提交簽名需要 Git 2.34 或更新版本,[`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy) 需要 2.32 或更新版本,從 [`--push-outcome-on-release`](/docs/zh-TW/self-hosted-environments-reference#runner-cli-flags) 推送的分支恢復工作階段需要 2.29 或更新版本。如果您省略所有三個並自己管理 Git 身份,Git 2.24 就足夠了。

131 146 

132<h3 id="let-the-runner-configure-git">147<h3 id="let-the-runner-configure-git">


138* `user.name = Claude` 和 `user.email = noreply@anthropic.com`,與 Anthropic 託管工作階段相符153* `user.name = Claude` 和 `user.email = noreply@anthropic.com`,與 Anthropic 託管工作階段相符

139* SSH 格式提交和標籤簽名,通過執行器管理的填充程式路由,該填充程式使用工作階段自己的認證通過 Anthropic 的簽名服務簽名每個提交。簽名可在 GitHub 上針對 Anthropic 的已發佈 SSH 簽名金鑰進行驗證。154* SSH 格式提交和標籤簽名,通過執行器管理的填充程式路由,該填充程式使用工作階段自己的認證通過 Anthropic 的簽名服務簽名每個提交。簽名可在 GitHub 上針對 Anthropic 的已發佈 SSH 簽名金鑰進行驗證。

140* `push.negotiate = true`,因此 Git 在打包推送之前詢問您的 Git 主機它已經擁有哪些提交。需要 Claude Code v2.1.257 或更新版本。155* `push.negotiate = true`,因此 Git 在打包推送之前詢問您的 Git 主機它已經擁有哪些提交。需要 Claude Code v2.1.257 或更新版本。

141* `core.hooksPath` 指向執行器管理的鉤子目錄。其 `commit-msg` 和 `prepare-commit-msg` 鉤子為每個提交添加 `Co-authored-by:` 預告片,用於工作階段的建立者,從 [`CCR_SESSION_ACCOUNT_EMAIL`](/docs/zh-TW/self-hosted-environments-configuration#wrapper-scripts) 構建,當該變數未設定時省略。如果您的映像已設定 `core.hooksPath`,執行器保留您的設定,跳過安裝這些鉤子,並列印 `[runner:git]` 警告。156* `core.hooksPath` 指向執行器管理的 hook 目錄。其 `commit-msg` 和 `prepare-commit-msg` hook 會為每個提交加上工作階段建立者的 `Co-authored-by:` trailer。該 trailer 由 [`CCR_SESSION_ACCOUNT_EMAIL`](/docs/zh-TW/self-hosted-environments-configuration#wrapper-scripts) 中的電子郵件建立,當該變數未設定時則省略。如果您的映像已設定 `core.hooksPath`,且執行器未使用 [Anthropic 管理的 Git](#use-the-anthropic-git-proxy),執行器會保留您的設定、跳過安裝這些 hook,並列印 `[runner:git]` 警告。

142 157 

143提交簽名需要 Git 2.34 或更新版本;執行器在啟動時檢查並在您的 Git 較舊時以錯誤退出。此旗標不配置推送認證,您仍在映像中提供。158提交簽名需要 Git 2.34 或更新版本;執行器在啟動時檢查並在您的 Git 較舊時以錯誤退出。此旗標不配置推送認證,您仍在映像中提供。

144 159 

145在 v2.1.280 或更新版本的執行器上,您從 `checkout` 或 `post-session` 生命週期 hook 所建立的提交也會以工作階段身分簽署,但不會加上 `Co-authored-by:` trailer。[生命週期 hook 內的 Git 設定](/docs/zh-TW/self-hosted-environments-configuration#git-configuration-inside-lifecycle-hooks)說明了執行器在這些 hook 內固定的 Git 設定。160在 v2.1.280 或更新版本的執行器上,您從 `checkout` 或 `post-session` 生命週期 hook 所建立的提交也會以工作階段身分簽署,但不會加上 `Co-authored-by:` trailer。[生命週期 hook 內的 Git 設定](/docs/zh-TW/self-hosted-environments-configuration#git-configuration-inside-lifecycle-hooks)說明了執行器在這些 hook 內固定的 Git 設定。

146 161 

162無論是否使用 `--configure-git`,Claude Code 都會指示 Claude 在提交訊息結尾加上 `Claude-Session: <url>` trailer,並在 pull request 描述結尾加上工作階段的 URL。若要省略兩者,請在執行器主機的 [`~/.claude/settings.json`](/docs/zh-TW/self-hosted-environments-configuration#how-each-session’s-config-is-assembled) 中將 [`attribution.sessionUrl`](/docs/zh-TW/settings-reference#attribution-sessionurl) 設為 `false`,然後重新啟動執行器。

163 

147<h3 id="ship-git-config-in-your-image">164<h3 id="ship-git-config-in-your-image">

148 在映像中提供 Git 配置165 在映像中提供 Git 配置

149</h3>166</h3>


186 使用 Anthropic Git 代理203 使用 Anthropic Git 代理

187</h3>204</h3>

188 205 

189使用 `--use-anthropic-git-proxy` 啟動執行器,或設定 `CLAUDE_RUNNER_USE_GIT_PROXY=1`,以使其通過 Anthropic 的 Git 代理複製,使用工作階段自己的短期令牌進行身份驗證。對於普通使用者工作階段,代理使用為工作階段建立者儲存的 GitHub 或 GitHub Enterprise OAuth 令牌;對於機器人和代理工作階段,它使用您的組織的 GitHub App 安裝令牌。無論哪種方式,執行器映像都不需要任何 Git 認證:沒有 SSH 金鑰、沒有認證幫助程式、沒有 `.netrc`。這是 Anthropic 託管環境使用的相同身份驗證路徑。206使用 Anthropic Git 代理伺服器(也稱為 Anthropic 管理的 Git)時,執行器映像不需要為工作階段本身準備任何 SSH 金鑰、憑證輔助程式、`.netrc` 或其他 Git 憑證。執行器會改為請 Anthropic 為其工作階段提供 Git 服務。對於 Anthropic 所服務的使用者工作階段,執行器的複製以及工作階段自己的提取和推送都會經過 Anthropic,Anthropic 使用為工作階段建立者儲存的 GitHub OAuth token。[Anthropic 如何為工作階段提供 Git 服務](#how-anthropic-serves-git-for-a-session)說明了機器人和 agent 工作階段的情況。

207 

208除非您[將其開啟](#turn-the-anthropic-git-proxy-on),否則 Git 代理伺服器是關閉的。以自己的憑證連線到 Git 主機的執行器不需要它,其 Git 可搭配任何 Git 主機運作。

209 

210相對地,Git 代理伺服器會限制執行器支援的範圍,並改變執行器所需的條件:

211 

212* **僅限 github.com**:只有當工作階段的所有儲存庫都位於 github.com 時,Anthropic 才會服務該工作階段,且 Git 代理伺服器目前尚不支援 GitHub Enterprise Server。在使用 Git 代理伺服器的執行器上,含有其他 Git 主機儲存庫的工作階段[無法啟動](#when-anthropic-doesnt-serve-a-session)。

213* **已連結的 GitHub 帳戶**:建立使用者工作階段的人必須已在 claude.ai 上連結 GitHub,否則該工作階段[無法啟動](#creator-has-no-github-connection)。

214* **`--capacity 1`**:Git 代理伺服器要求每個執行器程序只處理一個工作階段,因此請執行更多副本以實現平行處理。[開啟 Anthropic Git 代理伺服器](#turn-the-anthropic-git-proxy-on)列出了相關要求。

215* **取代全域 Git 設定**:執行器會[刪除並取代其執行身分使用者的全域 Git 設定](#git-proxy-replaces-global-git-config)。請以專用使用者身分或在容器中執行它。

216* **主機推送使用主機憑證**:執行器的 [`--push-outcome-on-release`](/docs/zh-TW/self-hosted-environments-reference#runner-cli-flags) 推送,以及您的 [`post-session` hook](/docs/zh-TW/self-hosted-environments-configuration#post-session) 所做的任何推送,仍會使用執行器主機自己的 Git 憑證及其[到 `github.com` 的網路路徑](#github-com-egress-with-the-anthropic-git-proxy)。關於這些憑證,請參閱[在映像中提供 Git 設定](#ship-git-config-in-your-image)。

217* **逐一工作階段決定**:Anthropic 會針對執行器上的每個工作階段決定是否為其提供 Git 服務,未被服務的工作階段將無法啟動。[在使用 Git 代理伺服器的執行器上工作階段無法啟動時](#when-anthropic-doesnt-serve-a-session)說明了原因。

218 

219<span id="git-proxy-replaces-global-git-config" />

220 

221<Warning>

222 設定 `--use-anthropic-git-proxy` 時,執行器會刪除並取代其執行身分使用者的全域 Git 設定,且不保留任何備份。它會在啟動時以及每個工作階段之前執行此操作。您保存在那裡的登入資訊或憑證輔助程式將會遺失。[`--configure-git`](#let-the-runner-configure-git) 寫入的設定則會保留。請以專用使用者身分或在容器中執行執行器,切勿以您自己的使用者身分執行。

223</Warning>

224 

225請將非機密的 Git 設定(例如身分和 `safe.directory`)保存在系統 Git 設定中。

226 

227<h4 id="turn-the-anthropic-git-proxy-on">

228 開啟 Anthropic Git 代理伺服器

229</h4>

230 

231在使用 `--use-anthropic-git-proxy` 啟動執行器之前,請確認執行器主機符合以下每項要求。當容量或 Git 要求未滿足時,執行器會拒絕啟動:

190 232 

191代理需要 `--capacity 1`,因為代理 URL 是每個工作階段的,Git 2.32 或更新版本,因為較舊的 Git 忽略代理用來隔離工作階段的配置機制。如果任一要求未滿足,執行器拒絕啟動。因為代理從 Anthropic 端提取,您的 Git 主機必須可從 Anthropic 基礎設施到達,與 Anthropic 託管工作階段相同的要求;對於僅在您的網路內可路由的 Git 主機,改用 [`checkout` 生命週期鉤子](/docs/zh-TW/self-hosted-environments-configuration#checkout)。每個執行器程序一次處理一個工作階段,因此執行更多副本以實現並行性。啟用代理後,`--git-host-rewrite` 和 `--git-ssh-rewrite` 無效:代理 URL 指向 `api.anthropic.com`,而不是您的 Git 主機。233* **Claude Code v2.1.267 或更新版本**:較早的版本接受該旗標,但不會回報請 Anthropic 提供 Git 服務的請求,也不會列印 `Registering as opted in` 行,因此 Anthropic 不會服務其工作階段。

234* **`--capacity 1`(預設值)**:每個執行器程序一次處理一個工作階段,因此請執行更多副本以實現平行處理。

235* **Git 2.32 或更新版本**:較舊的 Git 會忽略執行器為 Git 代理伺服器設定的每個工作階段 Git 設定。

192 236 

193<Warning>237<Warning>

194 本頁上的 [Kubernetes](#kubernetes) 和 [Docker Compose](#docker-compose) 配方使用 `--capacity 4`。如果您在不將容量更改為 `1` 的情況下將 `--use-anthropic-git-proxy` 或 `CLAUDE_RUNNER_USE_GIT_PROXY=1` 添加到其中之一,每次您的協調器重新啟動執行器時,執行器都會在啟動時退出。設定 `--capacity 1` 並執行更多副本以實現並行性。[When the runner exits](#when-the-runner-exits) 顯示執行器列印的行。238 本頁上的 [Kubernetes](#kubernetes) 和 [Docker Compose](#docker-compose) 配方使用 `--capacity 4`。如果您在不將容量更改為 `1` 的情況下將 `--use-anthropic-git-proxy` 或 `CLAUDE_RUNNER_USE_GIT_PROXY=1` 添加到其中之一,每次您的協調器重新啟動執行器時,執行器都會在啟動時退出。設定 `--capacity 1` 並執行更多副本以實現並行性。[When the runner exits](#when-the-runner-exits) 顯示執行器列印的行。

195</Warning>239</Warning>

196 240 

197執行器也會在註冊時向 Anthropic 報告選擇加入,在啟動時列印 `Registering as opted in to Anthropic-managed git (--use-anthropic-git-proxy)`。報告選擇加入需要 Claude Code v2.1.267 或更新版本,較早的版本接受該旗標而不報告它或列印該行。選擇加入執行器上的每個工作階段隨後使用 Anthropic 管理的 Git 或每個工作階段的代理 URL。當工作階段使用每個工作階段的代理 URL 時,執行器記錄一行 `[runner:warn]` 說明這一點。241若要開啟 Git 代理伺服器,請在執行器的命令中加入 `--use-anthropic-git-proxy`,或在執行器的環境中設定 `CLAUDE_RUNNER_USE_GIT_PROXY=1`。以下命令在執行器主機的 shell 中執行,會以開啟 Git 代理伺服器的方式啟動[快速入門](/docs/zh-TW/self-hosted-environments-quickstart#set-up-manually)中的執行器:

242 

243```bash theme={null}

244claude self-hosted-runner --environment-secret-file '/etc/claude/environment-secret' --base-dir '<writable-dir>' --use-anthropic-git-proxy

245```

246 

247啟動時,執行器會列印 `Registering as opted in to Anthropic-managed git (--use-anthropic-git-proxy)`。接著 Anthropic 會針對該執行器上的每個工作階段決定是否為其提供 Git 服務。對於每個被服務的工作階段,執行器會記錄一行包含 `governed git ACTIVE` 的 `[runner:session]`。如果工作階段反而無法啟動,請參閱[在使用 Git 代理伺服器的執行器上工作階段無法啟動時](#when-anthropic-doesnt-serve-a-session)。

248 

249<h4 id="how-anthropic-serves-git-for-a-session">

250 Anthropic 如何為工作階段提供 Git 服務

251</h4>

252 

253對於 Anthropic 所服務的工作階段,執行器的複製以及工作階段自己的提取和推送都會經過 Anthropic,並以工作階段自己的短期 token 進行身分驗證:

254 

255* **使用者工作階段**:Anthropic 使用為工作階段建立者儲存的 GitHub OAuth token。

256* **機器人和 agent 工作階段**:Anthropic 使用您組織的 GitHub App 安裝 token。

257* **URL 重寫**:`--git-host-rewrite` 和 `--git-ssh-rewrite` 對 Git 代理伺服器所服務的儲存庫沒有作用。

258 

259<h4 id="when-anthropic-doesnt-serve-a-session">

260 在使用 Git 代理伺服器的執行器上工作階段無法啟動時

261</h4>

262 

263在以 `--use-anthropic-git-proxy` 啟動的執行器上,當 Anthropic 不為工作階段提供 Git 服務時,該工作階段將無法啟動。請在執行器的日誌中尋找指出包含 `/git_proxy/` 之 `api.anthropic.com` 位址的 Git 錯誤。

264 

265對於每個工作階段,Claude Code v2.1.267 或更新版本的執行器也會記錄以下其中一行:當 Anthropic 服務該工作階段的 Git 時,記錄一行包含 `governed git ACTIVE` 的 `[runner:session]`;若未服務,則記錄一行包含 `the server withheld Anthropic-managed git for this session` 的 `[runner:warn]`。請在以下情況中找出您看到的那一行:

266 

267* **既沒有 `governed git ACTIVE` 也沒有 `withheld` 行**:早於 Claude Code v2.1.267 的執行器兩行都不會記錄,且 Anthropic 不會服務其工作階段。請依照[固定版本](#pin-the-version)將執行器更新至 v2.1.267 或更新版本。

268* **`withheld` 行**:Anthropic 未服務該工作階段。先前可搭配 Git 代理伺服器運作的執行器,也可能在您這邊沒有任何變更的情況下以這種方式失敗。

269 * **有儲存庫不在 github.com 上**:只要工作階段中有任何一個儲存庫位於其他 Git 主機(例如 GitHub Enterprise Server),該工作階段就不會被服務,包括其 github.com 儲存庫在內。請為該環境的執行器[關閉 Anthropic Git 代理伺服器](#turn-the-anthropic-git-proxy-off)。

270 * **所有儲存庫都在 github.com 上**:請將此失敗連同 `withheld` 行中的工作階段 ID 回報給[您的 Anthropic 客戶團隊](#report-an-issue)。Anthropic 會在其端記錄原因。

271* **包含 `remote: access denied by the git proxy` 的行**:即使是 Anthropic 所服務的工作階段仍可能被拒絕,例如當組織政策拒絕該工作階段的 Git 存取,或該工作階段未獲授權存取該儲存庫時。此時執行器的日誌會顯示一行包含 `remote: access denied by the git proxy` 的內容,該行其餘部分會說明原因。

272* <span id="creator-has-no-github-connection" />**`GitHub authentication required`**:當工作階段建立者在 claude.ai 上沒有可用的 GitHub 連結時會出現此訊息。工作階段的複製會失敗,Git 錯誤訊息為 `GitHub authentication required. Please reconnect your GitHub account.` 請該使用者在其 claude.ai 設定中連結或重新連結 GitHub。

273 

274修正原因後,請重新啟動失敗的工作階段。

275 

276<h4 id="turn-the-anthropic-git-proxy-off">

277 關閉 Anthropic Git 代理伺服器

278</h4>

279 

280如果某個環境中的工作階段使用位於 github.com 以外 Git 主機(例如 GitHub Enterprise Server)上的儲存庫,請為該環境的執行器關閉 `--use-anthropic-git-proxy`。

281 

282<Steps>

283 <Step title="移除旗標">

284 從執行器的命令中移除 `--use-anthropic-git-proxy`。如果您在執行器的環境中(例如 pod spec 或 Compose 檔案)設定了 `CLAUDE_RUNNER_USE_GIT_PROXY`,請在該處將其移除。在 shell 中,請取消設定它:

285 

286 ```bash theme={null}

287 unset CLAUDE_RUNNER_USE_GIT_PROXY

288 ```

289 </Step>

290 

291 <Step title="為執行器提供 Git 憑證">

292 為執行器工作階段使用的每個 Git 主機(包括 github.com)提供無需提示即可運作的憑證。執行器使用者全域 Git 設定中原有的任何憑證都已消失,因為在設定 `--use-anthropic-git-proxy` 期間,執行器已刪除該設定。請[在映像中提供憑證](#ship-git-config-in-your-image),或使用 [`checkout` 生命週期 hook](/docs/zh-TW/self-hosted-environments-configuration#checkout)。

293 </Step>

294 

295 <Step title="開放網路路徑">

296 允許執行器透過連接埠 443 或 22 連線到執行器工作階段使用的每個 Git 主機。請參閱[網路需求](#network-requirements)中的 Git 主機列。

297 </Step>

298 

299 <Step title="重新啟動執行器">

300 重新啟動執行器,讓它們在不使用 Git 代理伺服器的情況下註冊。然後重新啟動每個失敗的工作階段。

301 </Step>

302</Steps>

198 303 

199<h4 id="github-api-access-without-the-github-cli">304<h4 id="github-api-access-without-the-github-cli">

200 不使用 GitHub CLI 存取 GitHub API305 不使用 GitHub CLI 存取 GitHub API


266```dockerfile theme={null}371```dockerfile theme={null}

267FROM debian:bookworm-slim372FROM debian:bookworm-slim

268ARG CLAUDE_CODE_VERSION373ARG CLAUDE_CODE_VERSION

269RUN apt-get update && apt-get install -y --no-install-recommends git curl ca-certificates openssh-client \374RUN apt-get update && apt-get install -y --no-install-recommends git curl ca-certificates openssh-client jq \

270 && rm -rf /var/lib/apt/lists/*375 && rm -rf /var/lib/apt/lists/*

271RUN curl -fsSL "https://downloads.claude.ai/claude-code-releases/${CLAUDE_CODE_VERSION:?set with --build-arg CLAUDE_CODE_VERSION}/linux-x64/claude" \376RUN curl -fsSL "https://downloads.claude.ai/claude-code-releases/${CLAUDE_CODE_VERSION:?set with --build-arg CLAUDE_CODE_VERSION}/linux-x64/claude" \

272 -o /usr/local/bin/claude && chmod +x /usr/local/bin/claude377 -o /usr/local/bin/claude && chmod +x /usr/local/bin/claude


382kubectl create namespace claude-runners487kubectl create namespace claude-runners

383```488```

384 489 

385從保存您在管理 UI 的[**複製環境金鑰**步驟](/docs/zh-TW/self-hosted-environments-quickstart#set-up-an-environment-and-runner)中複製的值的本地檔案建立支持 Secret,以便祕密永遠不會出現在您的 shell 歷史記錄中。執行 `(umask 077 && cat > ./environment-secret)`,貼上祕密,按 Enter,然後按 Ctrl-D。然後建立 Secret 並刪除檔案:490從保存您在管理 UI 的[**複製環境金鑰**步驟](/docs/zh-TW/self-hosted-environments-quickstart#set-up-manually)中複製的值的本地檔案建立支持 Secret,以便祕密永遠不會出現在您的 shell 歷史記錄中。執行 `(umask 077 && cat > ./environment-secret)`,貼上祕密,按 Enter,然後按 Ctrl-D。然後建立 Secret 並刪除檔案:

386 491 

387```bash theme={null}492```bash theme={null}

388kubectl create secret generic claude-runner-environment-secret -n claude-runners --from-file=environment-secret=./environment-secret493kubectl create secret generic claude-runner-environment-secret -n claude-runners --from-file=environment-secret=./environment-secret


500 重複使用預熱簽出605 重複使用預熱簽出

501</h2>606</h2>

502 607 

503對於大型儲存庫,複製可能主導工作階段啟動。在 `--capacity 1` 且沒有 [`checkout` 鉤子](/docs/zh-TW/self-hosted-environments-configuration#checkout) 的情況下,執行器在 `<base-dir>/<repo-owner>/<repo>` 保持每個儲存庫的一個規範複製並在工作階段之間重複使用它:它提取請求的 ref、分離 `HEAD` 並硬重置為它,當變化不多時幾乎是瞬間的。要跳過冷複製,以兩種方式之一提供複製:608對於大型儲存庫,複製可能主導工作階段啟動。要跳過冷複製,請自行在執行器保存其自身複製的路徑上提供一個複製。在沒有 [`checkout` hook](/docs/zh-TW/self-hosted-environments-configuration#checkout) 的情況下,執行器在 `<base-dir>/<repo-owner>/<repo>` 為每個儲存庫保持一個規範複製,並在工作階段之間重複使用它:

609 

610* **在 `--capacity 1` 時**:執行器提取請求的 ref、分離 `HEAD` 並硬重置為它,當變化不多時幾乎是瞬間的。

611* **在 `--capacity` 大於一時**:執行器提取到該複製中,然後為每個工作階段從中簽出一個單獨的 worktree。預熱複製可節省下載,但無法節省簽出。

612 

613在映像中或在持久卷上提供複製:

504 614 

505* **在映像中複製**:在該路徑將複製構建到您的執行器映像中。每個新容器然後以預熱複製啟動,而不重複使用磁碟。615* **在映像中複製**:在該路徑將複製構建到您的執行器映像中。每個新容器然後以預熱複製啟動,而不重複使用磁碟。

506* **在持久卷上複製**:在您使用 [`--lock-to-account`](/docs/zh-TW/self-hosted-environments-reference#runner-cli-flags) 預鎖定到一個使用者帳戶的執行器上,將 `--base-dir` 指向持久卷,因此磁碟只服務該帳戶。預鎖定的執行器永遠不會拾取 Claude Tag 頻道工作階段,因此此選項不適用於服務它們的執行器。616* **在持久卷上複製**:在您使用 [`--lock-to-account`](/docs/zh-TW/self-hosted-environments-reference#runner-cli-flags) 預鎖定到一個使用者帳戶的執行器上,將 `--base-dir` 指向持久卷,因此磁碟只服務該帳戶。預鎖定的執行器永遠不會拾取 Claude Tag 頻道工作階段,因此此選項不適用於服務它們的執行器。


508重複使用路徑做什麼和不保證什麼:618重複使用路徑做什麼和不保證什麼:

509 619 

510* **任何複製形狀都有效**:路徑上的完整、淺或單分支複製按原樣使用。執行器在提取到現有複製時永遠不會傳遞 `--depth`,因此完整預熱保持其完整歷史記錄,淺複製保持淺。`CLAUDE_RUNNER_FETCH_DEPTH`(`full`、`0` 或數字;預設 50)僅控制執行器在不存在複製時進行的冷複製。620* **任何複製形狀都有效**:路徑上的完整、淺或單分支複製按原樣使用。執行器在提取到現有複製時永遠不會傳遞 `--depth`,因此完整預熱保持其完整歷史記錄,淺複製保持淺。`CLAUDE_RUNNER_FETCH_DEPTH`(`full`、`0` 或數字;預設 50)僅控制執行器在不存在複製時進行的冷複製。

511* **追蹤的變化重置,未追蹤的檔案持續**:每個工作階段從硬重置開始,該重置擦除前一個工作階段的追蹤修改,但執行器永遠不執行 `git clean`,因此鎖定所有者的早期工作階段的未追蹤檔案保留在樹中。621* **追蹤的變化重置,未追蹤的檔案持續**:在 `--capacity 1` 時,每個工作階段從硬重置開始,該重置擦除前一個工作階段的追蹤修改,但執行器永遠不執行 `git clean`,因此鎖定所有者的早期工作階段的未追蹤檔案保留在樹中。

512* **每工作階段目錄也持續**:在簽出旁邊,執行器在 `<base-dir>/_sessions/` 下為它執行的每個工作階段建立每工作階段項目。工作階段的 Claude 設定目錄保存對話記錄的本地副本。在它旁邊是工作階段的上傳檔案,當工作階段有任何時。工作階段目錄也坐在那裡:它在工作階段執行時保存任何每工作階段 worktrees 和 `checkout` 鉤子簽出,並保持 Claude 在其中寫入的任何其他內容。622* **每工作階段目錄也持續**:在簽出旁邊,執行器在 `<base-dir>/_sessions/` 下為它執行的每個工作階段建立每工作階段項目。工作階段的 Claude 設定目錄保存對話記錄的本地副本。在它旁邊是工作階段的上傳檔案,當工作階段有任何時。工作階段目錄也坐在那裡:它在工作階段執行時保存任何每工作階段 worktrees 和 `checkout` 鉤子簽出,並保持 Claude 在其中寫入的任何其他內容。

513 623 

514 預設情況下,執行器在工作階段結束時將這些留在原地,因此在超越執行器程序的磁碟上它們會累積。每個工作階段都以執行器自己的使用者身份執行,因此該磁碟服務的任何後續工作階段都可以讀取它們。如果您保持持久 `--base-dir`,請為該增長調整卷的大小。相同的適用於任何在相同檔案系統上重新啟動執行器的設定,包括 [Docker Compose 配方](#docker-compose)。624 預設情況下,執行器在工作階段結束時將這些留在原地,因此在超越執行器程序的磁碟上它們會累積。每個工作階段都以執行器自己的使用者身份執行,因此該磁碟服務的任何後續工作階段都可以讀取它們。如果您保持持久 `--base-dir`,請為該增長調整卷的大小。相同的適用於任何在相同檔案系統上重新啟動執行器的設定,包括 [Docker Compose 配方](#docker-compose)。


522 632 

523每個工作階段的子 Claude Code 程序執行執行器自己的二進位檔案,執行器在它生成的工作階段內關閉自動更新,因此每個工作階段執行您在主機上安裝或構建到映像中的版本。主機級更新在執行器下次啟動時生效。633每個工作階段的子 Claude Code 程序執行執行器自己的二進位檔案,執行器在它生成的工作階段內關閉自動更新,因此每個工作階段執行您在主機上安裝或構建到映像中的版本。主機級更新在執行器下次啟動時生效。

524 634 

525您的工作階段使用的模型可能需要比它們執行的版本更新的 Claude Code 版本。伺服器隨後會以 [Claude Code 不支援此模型](/docs/zh-TW/errors#claude-code-does-not-support-this-model) 拒絕該模型的請求。在您固定版本之前,請檢查[模型所需的 Claude Code 版本](/docs/zh-TW/model-config#available-models),以確保您的工作階段使用的每個模型都符合要求。635選擇您的工作階段執行哪個版本,以及何時變更:

526 636 

637* **在固定版本之前**:針對工作階段使用的每個模型,檢查[模型所需的 Claude Code 版本](/docs/zh-TW/model-config#available-models)。如果某個模型需要比工作階段執行的版本更新的版本,伺服器會以 [Claude Code 不支援此模型](/docs/zh-TW/errors#claude-code-does-not-support-this-model) 拒絕該模型的請求。

527* **將群保持在一個版本上**:使用固定版本構建映像,或在裸主機上安裝特定版本並[禁用自動更新](/docs/zh-TW/setup#disable-auto-updates)638* **將群保持在一個版本上**:使用固定版本構建映像,或在裸主機上安裝特定版本並[禁用自動更新](/docs/zh-TW/setup#disable-auto-updates)

528* **升級**:安裝較新版本或重建映像,然後重新啟動執行器639* **升級固定機群**:閱讀從您目前版本到要安裝版本之間的 [changelog](/docs/en/changelog) 項目,然後安裝較新版本或重新建置映像,並重新啟動執行器

640* **升級隨需執行器**:閱讀從您目前版本到要安裝版本之間的 [changelog](/docs/en/changelog) 項目,然後變更您的 [`spawn-runner` hook](/docs/zh-TW/self-hosted-environments-configuration#the-spawn-runner-hook) 所啟動的映像。每個新的執行器都會取得新版本。已在執行中的執行器,包括由 [`--min-idle`](/docs/zh-TW/self-hosted-environments-reference#orchestrator-cli-flags) 啟動的待命執行器,會保留其版本直到結束。請勿重新啟動它,因為其工作指令只能使用一次。

529* **外掛程式**:外掛程式市場也不自動更新;在執行器的環境中設定 `FORCE_AUTOUPDATE_PLUGINS=1` 以讓外掛程式自動更新,同時二進位檔案保持固定641* **外掛程式**:外掛程式市場也不自動更新;在執行器的環境中設定 `FORCE_AUTOUPDATE_PLUGINS=1` 以讓外掛程式自動更新,同時二進位檔案保持固定

530 642 

531<h2 id="scale-the-fleet">643<h2 id="scale-the-fleet">


580</h3>692</h3>

581 693 

582* **恢復的工作階段丟失未推送的工作**:新的執行器會從其起始分支再次複製儲存庫,因此工作階段未推送的工作會消失。694* **恢復的工作階段丟失未推送的工作**:新的執行器會從其起始分支再次複製儲存庫,因此工作階段未推送的工作會消失。

583 * **若要保留已提交的工作**:設定 [`--push-outcome-on-release`](/docs/zh-TW/self-hosted-environments-reference#runner-cli-flags)。執行器會在釋放之前盡力推送工作階段的結果分支,恢復的工作階段便會從這些提交開始。未提交的變更仍會遺失。695 * **若要保留已提交的工作**:在環境中的每個執行器上設定 [`--push-outcome-on-release`](/docs/zh-TW/self-hosted-environments-reference#runner-cli-flags),因為沒有此旗標的執行器會從其起始分支恢復工作階段。具有此旗標的執行器會在釋放之前盡力推送工作階段的結果分支,恢復的工作階段便會從這些提交開始。推送會使用執行器主機本身的 git 憑證,包括在使用 [Anthropic 管理的 git](#use-the-anthropic-git-proxy) 的執行器上。未提交的變更仍會遺失。

696 * **使用 `checkout` hook 時**:透過 [`checkout` 生命週期 hook](/docs/zh-TW/self-hosted-environments-configuration#checkout) 簽出的儲存庫不會被推送。請改為從 [`post-session` hook](/docs/zh-TW/self-hosted-environments-configuration#post-session) 建立這些儲存庫的快照。

584 * **啟用旗標之前**:限制誰可以推送到來源遠端上的 `claude/*` refs。在恢復時,執行器會提取先前推送的分支,而不驗證是誰推送的。697 * **啟用旗標之前**:限制誰可以推送到來源遠端上的 `claude/*` refs。在恢復時,執行器會提取先前推送的分支,而不驗證是誰推送的。

585* **工作階段中途新增的儲存庫可能無法複製**:Claude 透過 HTTPS 使用 `git clone` 複製它。在未使用 [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy) 的執行器上,如果主機上沒有任何項目能讀取該儲存庫,複製會因 git 身分驗證錯誤而失敗。在可行的情況下,請在建立工作階段時選擇工作階段需要的每個儲存庫。698* **工作階段中途新增的儲存庫可能無法複製**:Claude 透過 HTTPS 使用 `git clone` 複製它。在未使用 [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy) 的執行器上,如果主機上沒有任何項目能讀取該儲存庫,複製會因 git 身分驗證錯誤而失敗。在可行的情況下,請在建立工作階段時選擇工作階段需要的每個儲存庫。

586* **某些連接器不出現在自託管工作階段中**:您在 claude.ai Settings 中尚未連接的連接器不在自託管工作階段中列出,工作階段不會提示您連接它。首先在 Settings 中連接它,然後啟動新工作階段。將連接器添加到已執行的工作階段也不會使其工具可用於 Claude;啟動新工作階段以拾取新添加的連接器。699* **某些連接器不出現在自託管工作階段中**:您在 claude.ai Settings 中尚未連接的連接器不在自託管工作階段中列出,工作階段不會提示您連接它。首先在 Settings 中連接它,然後啟動新工作階段。將連接器添加到已執行的工作階段也不會使其工具可用於 Claude;啟動新工作階段以拾取新添加的連接器。


606* **執行器不出現在環境中**:確認主機可以通過 HTTPS 到達 `api.anthropic.com`,環境祕密是最新的,主機時鐘在真實時間的五分鐘內;更大的偏差導致身份驗證失敗。執行器在身份驗證失敗時記錄 `[runner:fatal]` 及拒絕原因。719* **執行器不出現在環境中**:確認主機可以通過 HTTPS 到達 `api.anthropic.com`,環境祕密是最新的,主機時鐘在真實時間的五分鐘內;更大的偏差導致身份驗證失敗。執行器在身份驗證失敗時記錄 `[runner:fatal]` 及拒絕原因。

607* **執行器在啟動時以 `cannot create or write to base directory` 退出**:執行器無法建立或寫入 `--base-dir`,預設為 `/workspace`。修復目錄的所有權或將 `--base-dir` 指向可寫路徑,如[在執行器之間保持基本目錄和容量相同](#keep-the-base-directory-and-capacity-identical-across-runners)中所述。如果執行器改為記錄 `[runner:fatal]` 說基本目錄檢查超時,目錄在掛起的 NFS 或 CSI 掛載上。檢查掛載健康而不是權限。執行器在打開 `--log-file` 之前將這兩個啟動失敗列印到 stderr,因此在終端或您的平台的容器日誌中尋找它們,而不是日誌檔案。在 v2.1.225 之前,執行器在啟動時沒有檢查基本目錄,此配置錯誤在拾取後失敗工作階段。720* **執行器在啟動時以 `cannot create or write to base directory` 退出**:執行器無法建立或寫入 `--base-dir`,預設為 `/workspace`。修復目錄的所有權或將 `--base-dir` 指向可寫路徑,如[在執行器之間保持基本目錄和容量相同](#keep-the-base-directory-and-capacity-identical-across-runners)中所述。如果執行器改為記錄 `[runner:fatal]` 說基本目錄檢查超時,目錄在掛起的 NFS 或 CSI 掛載上。檢查掛載健康而不是權限。執行器在打開 `--log-file` 之前將這兩個啟動失敗列印到 stderr,因此在終端或您的平台的容器日誌中尋找它們,而不是日誌檔案。在 v2.1.225 之前,執行器在啟動時沒有檢查基本目錄,此配置錯誤在拾取後失敗工作階段。

608* **工作階段保持排隊**:每個線上執行器可能被鎖定到不同的所有者。檢查每個執行器的 `claude_code_self_hosted_runner_locked_account` [指標](/docs/zh-TW/self-hosted-environments-reference#prometheus-metrics)或其 `[runner:health]` 日誌行的 `locked_account` 欄位以查看誰持有它。兩者僅在執行器被發佈攜帶 `act.email` 聲明的工作階段令牌後顯示所有者的電子郵件,Claude Tag 代理的工作階段永遠不會這樣做。沒有聲明,執行器不發出 `locked_account` 系列並記錄 `locked_account=yes`,這告訴您執行器被鎖定但不知道到哪個所有者。添加副本,或等待現有執行器清空並重新啟動。如果環境使用按需執行器,改為檢查協調器;請參閱[按需執行器](/docs/zh-TW/self-hosted-environments-configuration#on-demand-runners)。721* **工作階段保持排隊**:每個線上執行器可能被鎖定到不同的所有者。檢查每個執行器的 `claude_code_self_hosted_runner_locked_account` [指標](/docs/zh-TW/self-hosted-environments-reference#prometheus-metrics)或其 `[runner:health]` 日誌行的 `locked_account` 欄位以查看誰持有它。兩者僅在執行器被發佈攜帶 `act.email` 聲明的工作階段令牌後顯示所有者的電子郵件,Claude Tag 代理的工作階段永遠不會這樣做。沒有聲明,執行器不發出 `locked_account` 系列並記錄 `locked_account=yes`,這告訴您執行器被鎖定但不知道到哪個所有者。添加副本,或等待現有執行器清空並重新啟動。如果環境使用按需執行器,改為檢查協調器;請參閱[按需執行器](/docs/zh-TW/self-hosted-environments-configuration#on-demand-runners)。

609* **工作階段在拾取後立即失敗**:在 claude.ai/code 中打開工作階段以查看錯誤。最常見的原因是執行器映像中缺少 [Git 認證](#configure-git)和未安裝的構建工具。不可寫的基本目錄在啟動時停止執行器,而不是失敗工作階段。請參閱此清單中的**執行器在啟動時以 `cannot create or write to base directory` 退出**項。722* **工作階段在拾取後立即失敗**:在 claude.ai/code 中開啟工作階段以查看錯誤。最常見的原因是執行器映像中缺少 [Git 憑證](#configure-git),以及未安裝建置工具。在以 `--use-anthropic-git-proxy` 啟動的執行器上,請參閱[當工作階段無法在使用 Git 代理伺服器的執行器上啟動時](#when-anthropic-doesnt-serve-a-session)。不可寫入的基本目錄會在啟動時停止執行器,而不是使工作階段失敗。請參閱此清單中的**執行器在啟動時以 `cannot create or write to base directory` 退出**項目。

723* **工作階段無法在設定了 `--use-anthropic-git-proxy` 的執行器上啟動**:在執行器的日誌中尋找 `access denied by the git proxy`,或指名包含 `/git_proxy/` 的 `api.anthropic.com` 位址的 Git 錯誤。若要判斷 Anthropic 是否有服務該工作階段並修正原因,請參閱[當工作階段無法在使用 Git 代理伺服器的執行器上啟動時](#when-anthropic-doesnt-serve-a-session)。

610* **工作階段無法通過身份驗證出站代理到達網路**:當您使用 [`--proxy-authorization-command` 或 `--proxy-authorization-file`](#authenticate-to-an-egress-proxy) 設定的來源失敗、在 30 秒後超時或產生空值時,執行器以 `502 Bad Gateway` 回答該連接並記錄原因。執行器在該日誌中編輯命令的 stderr,永遠不記錄標頭值。使用 `--proxy-authorization-command`,自己在主機上執行命令以確認它在 stdout 上列印整個標頭值。如果執行器改為在啟動時以 `could not start the proxy-authorization listener` 退出,它無法打開其環回偵聽器。724* **工作階段無法通過身份驗證出站代理到達網路**:當您使用 [`--proxy-authorization-command` 或 `--proxy-authorization-file`](#authenticate-to-an-egress-proxy) 設定的來源失敗、在 30 秒後超時或產生空值時,執行器以 `502 Bad Gateway` 回答該連接並記錄原因。執行器在該日誌中編輯命令的 stderr,永遠不記錄標頭值。使用 `--proxy-authorization-command`,自己在主機上執行命令以確認它在 stdout 上列印整個標頭值。如果執行器改為在啟動時以 `could not start the proxy-authorization listener` 退出,它無法打開其環回偵聽器。

611* **執行器記錄 `Poll failed` 行包含 `rejecting the malformed poll response`**:執行器接收到工作輪詢回應,其主體不是隊列的預期 JSON,最常見的原因是執行器和 `api.anthropic.com` 之間的某些內容(例如攔截代理或強制入口網站)以自己的頁面回答。執行器拒絕回應,在 `claude_code_self_hosted_runner_poll_errors_total` [指標](/docs/zh-TW/self-hosted-environments-reference#prometheus-metrics)的 `transport` 種類下計數,並在[工作階段生命週期](/docs/zh-TW/self-hosted-environments#session-lifecycle)中描述的失敗輪詢時間表上重試。執行器保持服務其活躍工作階段。配置代理以從 `api.anthropic.com` 無更改地傳遞回應。在 v2.1.246 之前,執行器將此類回應讀取為空工作隊列,這可能結束其活躍工作階段或使其退出。725* **執行器記錄 `Poll failed` 行包含 `rejecting the malformed poll response`**:執行器接收到工作輪詢回應,其主體不是隊列的預期 JSON,最常見的原因是執行器和 `api.anthropic.com` 之間的某些內容(例如攔截代理或強制入口網站)以自己的頁面回答。執行器拒絕回應,在 `claude_code_self_hosted_runner_poll_errors_total` [指標](/docs/zh-TW/self-hosted-environments-reference#prometheus-metrics)的 `transport` 種類下計數,並在[工作階段生命週期](/docs/zh-TW/self-hosted-environments#session-lifecycle)中描述的失敗輪詢時間表上重試。執行器保持服務其活躍工作階段。配置代理以從 `api.anthropic.com` 無更改地傳遞回應。在 v2.1.246 之前,執行器將此類回應讀取為空工作隊列,這可能結束其活躍工作階段或使其退出。

612* **工作階段的分支不再存在於遠端**:對於工作階段僅從中讀取的 Git 來源,執行器跳過該來源並在其餘來源上繼續。對於工作階段推送結果的來源,已刪除的分支(通常因為它被合併並自動刪除)使工作階段失敗,並出現命名儲存庫和分支的錯誤,要求您恢復分支並重試。當跳過會使其沒有儲存庫時,執行器使用相同的錯誤使工作階段失敗。在 v2.1.228 之前,此類工作階段在空目錄中啟動。726* **工作階段的分支不再存在於遠端**:對於工作階段僅從中讀取的 Git 來源,執行器跳過該來源並在其餘來源上繼續。對於工作階段推送結果的來源,已刪除的分支(通常因為它被合併並自動刪除)使工作階段失敗,並出現命名儲存庫和分支的錯誤,要求您恢復分支並重試。當跳過會使其沒有儲存庫時,執行器使用相同的錯誤使工作階段失敗。在 v2.1.228 之前,此類工作階段在空目錄中啟動。


616 730 

617 存取檢查在每次工作階段在執行器上啟動時再次執行,因此一旦執行器的 Git 身份具有讀取存取權限,下一次啟動會複製儲存庫。在 v2.1.274 之前,這些拒絕中的每一個都失敗了工作階段啟動。731 存取檢查在每次工作階段在執行器上啟動時再次執行,因此一旦執行器的 Git 身份具有讀取存取權限,下一次啟動會複製儲存庫。在 v2.1.274 之前,這些拒絕中的每一個都失敗了工作階段啟動。

618* **工作階段需要幾分鐘才能啟動**:初始複製通常主導。觀看 `claude_code_self_hosted_runner_session_init_duration_seconds` [指標](/docs/zh-TW/self-hosted-environments-reference#prometheus-metrics)以確認,並使用[預熱簽出](#reuse-a-pre-warmed-checkout)或較小的 `CLAUDE_RUNNER_FETCH_DEPTH` 切割複製。732* **工作階段需要幾分鐘才能啟動**:初始複製通常主導。觀看 `claude_code_self_hosted_runner_session_init_duration_seconds` [指標](/docs/zh-TW/self-hosted-environments-reference#prometheus-metrics)以確認,並使用[預熱簽出](#reuse-a-pre-warmed-checkout)或較小的 `CLAUDE_RUNNER_FETCH_DEPTH` 切割複製。

619* **輪次以 401 失敗**:每個工作階段使用執行器從 Anthropic 獲取並通過工作階段的 stdin 輪換的短期 [`CLAUDE_CODE_OAUTH_TOKEN`](/docs/zh-TW/self-hosted-environments-configuration#wrapper-scripts) 來驗證模型呼叫。當輪次以來自模型 API 的 401 或 403 結束時,執行器獲取新令牌並將其傳遞給工作階段。失敗的輪次不會重試。733* **回合以 401 失敗**:當回合以來自 Anthropic API 的 401 或 403 結束時,執行器會從 Anthropic 取得新的 [`CLAUDE_CODE_OAUTH_TOKEN`](/docs/zh-TW/self-hosted-environments-configuration#wrapper-scripts) 並將其傳遞給工作階段。失敗的回合不會重試。此 token 為短期有效,執行器會透過工作階段的 stdin 輪換它。

620 734 

621 當獲取失敗時,執行器記錄 `inference_token refresh failed` 行,說明何時會重試,並且只要工作階段運行就會繼續重試。735 當獲取失敗時,執行器記錄 `inference_token refresh failed` 行,說明何時會重試,並且只要工作階段運行就會繼續重試。

622 736 


637 751 

638* **正常退出**:執行器完成了其工作階段並清空、達到其退休時間或被告知停止。重新啟動它以便環境再次具有容量。[執行器生命週期](/docs/zh-TW/self-hosted-environments#runner-lifecycle)描述這些退出。752* **正常退出**:執行器完成了其工作階段並清空、達到其退休時間或被告知停止。重新啟動它以便環境再次具有容量。[執行器生命週期](/docs/zh-TW/self-hosted-environments#runner-lifecycle)描述這些退出。

639* **失敗的啟動**:執行器無法使用給定的設定或主機啟動,因此它在啟動後幾秒鐘退出,每次您重新啟動它時都以相同的方式退出。更快地重新啟動它沒有幫助。有人需要閱讀其輸出並修復原因。753* **失敗的啟動**:執行器無法使用給定的設定或主機啟動,因此它在啟動後幾秒鐘退出,每次您重新啟動它時都以相同的方式退出。更快地重新啟動它沒有幫助。有人需要閱讀其輸出並修復原因。

754* **失去聯繫**:無法連線到 Anthropic 的時間超過其[租約](/docs/zh-TW/self-hosted-environments#session-lifecycle)的執行器(例如在其主機休眠期間)可能會從環境中移除。當已移除的執行器重新連線時,它會退出。其日誌中可能會出現包含 `runner record gone server-side` 的 `[runner:fatal]` 行,或在較長的中斷之後出現 [`poll auth failed`](/docs/zh-TW/self-hosted-environments-quickstart#set-up-an-environment-and-runner)。執行器不會自行重新註冊,因此請重新啟動它。

640 755 

641配置您的監督程序以在執行器退出時重新啟動它,在執行器持續在啟動後立即退出時等待更長時間再重新啟動,並在這種情況持續發生時告知某人。756配置您的監督程序以在執行器退出時重新啟動它,在執行器持續在啟動後立即退出時等待更長時間再重新啟動,並在這種情況持續發生時告知某人。

642 757 

Details

195 195 

196包裝器在 `CLAUDE_RUNNER_CLAUDE_BIN` 中接收執行者自身二進位檔案的絕對路徑;使用該路徑而不是 PATH 解析的 `claude`,以便解碼在執行者本身使用的相同二進位檔案上執行。196包裝器在 `CLAUDE_RUNNER_CLAUDE_BIN` 中接收執行者自身二進位檔案的絕對路徑;使用該路徑而不是 PATH 解析的 `claude`,以便解碼在執行者本身使用的相同二進位檔案上執行。

197 197 

198使用 `jq -re` 而不是 `jq -r`,以便遺漏的聲明導致非零退出。僅使用 `-r`,遺漏的聲明會列印字面字串 `null` 並以零退出,這會無聲地將壞值傳遞到下游。僅當 JWKS 端點無法到達的離線檢查時,才將 `--no-verify` 傳遞給 `decode-token`。198使用 `jq -re` 而不是 `jq -r`,以便遺漏的聲明導致非零退出。僅使用 `-r`,遺漏的聲明會列印字面字串 `null` 並以零退出,這會無聲地將壞值傳遞到下游。

199 

200如果 `decode-token` 無法從 JWKS 端點取得金鑰或無法驗證 token,它會將原因列印到 stderr,不列印任何聲明,並以代碼 1 退出。僅當 JWKS 端點無法到達的離線檢查時,才將 `--no-verify` 傳遞給 `decode-token`。

199 201 

200<h2 id="claims-reference">202<h2 id="claims-reference">

201 聲明參考203 聲明參考

Details

34執行器主機需要:34執行器主機需要:

35 35 

36* 具有到 `api.anthropic.com` 的出站 HTTPS、到 `claude.ai` 和下面安裝步驟重定向到的下載主機,以及到您的 git 主機以進行複製的 Linux 或 macOS 主機或容器;[網路需求表](/docs/zh-TW/self-hosted-environments-deploy#network-requirements)有完整清單。Windows 不支援作為執行器主機;改為在 Linux 容器中執行執行器。開發人員工作站不受影響,因為工作階段從瀏覽器中的 claude.ai 啟動。36* 具有到 `api.anthropic.com` 的出站 HTTPS、到 `claude.ai` 和下面安裝步驟重定向到的下載主機,以及到您的 git 主機以進行複製的 Linux 或 macOS 主機或容器;[網路需求表](/docs/zh-TW/self-hosted-environments-deploy#network-requirements)有完整清單。Windows 不支援作為執行器主機;改為在 Linux 容器中執行執行器。開發人員工作站不受影響,因為工作階段從瀏覽器中的 claude.ai 啟動。

37* 用於測試工作階段的儲存庫:公開儲存庫,或此主機已能透過其 HTTPS URL 複製且不會被要求提供憑證的儲存庫。

37* 與實時同步的時鐘,例如使用 NTP。當時鐘偏差超過五分鐘時,驗證失敗;請參閱[疑難排解](/docs/zh-TW/self-hosted-environments-deploy#troubleshooting)。38* 與實時同步的時鐘,例如使用 NTP。當時鐘偏差超過五分鐘時,驗證失敗;請參閱[疑難排解](/docs/zh-TW/self-hosted-environments-deploy#troubleshooting)。

38 39 

39<h3 id="software-on-the-runner-host">40<h3 id="software-on-the-runner-host">


57 設定環境和執行器58 設定環境和執行器

58</h2>59</h2>

59 60 

60Claude Code 包含引導式設定:一個互動式 Claude Code 工作階段,引導您在管理 UI 中建立環境、使用您保存的密鑰檔案啟動本機執行器、確認執行器註冊,並將速查表寫入 `./runner-setup/CHEAT-SHEET.md`。在您已使用持有擁有者角色的帳戶使用 `claude auth login` 登入的機器上執行它;它不適用於 API 金鑰或第三方模型提供者。在無法進行互動式工作階段的主機上,改為使用下面的手動步驟。首先確認[版本檢查](#software-on-the-runner-host)已通過:在 2.1.224 之前的版本上,此命令會啟動一個普通的 Claude 工作階段,將這些詞作為提示,而不是引導式設定。若要啟動引導式設定,請執行設定子命令並按照提示進行:61使用[引導式設定](#run-the-guided-setup)或[手動步驟](#set-up-manually)。引導式設定是單一命令,會啟動互動式 Claude Code 工作階段,並引導您完成其餘步驟。在無法進行互動式工作階段的主機上,請改用手動步驟。當持有擁有者角色的人員已建立環境並將其密鑰交給您時,也請使用手動步驟,因為引導式設定需要以擁有者身分登入。

62 

63<h3 id="run-the-guided-setup">

64 執行引導式設定

65</h3>

66 

67引導式設定會引導您在管理 UI 中建立環境、使用您保存的密鑰檔案啟動本機執行器、確認執行器註冊,並將速查表寫入 `./runner-setup/CHEAT-SHEET.md`。執行之前,請確認您的登入狀態和版本:

68 

69* **登入**:在您已使用持有擁有者角色的帳戶透過 `claude auth login` 登入的機器上執行它。若僅使用 API 金鑰或第三方模型提供者,工作階段會啟動,但其組織檢查會失敗。

70* **版本**:確認[版本檢查](#software-on-the-runner-host)已通過。在 2.1.224 之前的版本上,setup 命令會啟動一個 Claude 工作階段,將這些字詞作為提示詞,而不是引導式設定。

71 

72若要啟動引導式設定,請在您的 shell 中執行設定子命令並按照提示進行:

61 73 

62```bash theme={null}74```bash theme={null}

63claude self-hosted-runner setup75claude self-hosted-runner setup

64```76```

65 77 

66若要改為手動設定:78設定本身不會啟動測試工作階段:它會告訴您在 claude.ai/code 啟動一個。設定的最後一步會停止它所啟動的執行器。如果您在該步驟之前離開設定,執行器會繼續執行。若要在最後一步之後繼續,請在您的 shell 中使用 `./runner-setup/CHEAT-SHEET.md` 中的命令再次啟動執行器,然後[將工作階段路由到環境](#route-a-session)。

79 

80<h3 id="set-up-manually">

81 手動設定

82</h3>

83 

84在 claude.ai 上建立環境,從主機上的終端機啟動執行器,然後返回 claude.ai 確認執行器出現,並將工作階段路由到它。如果持有擁有者角色的人員已建立環境並將其密鑰交給您,請從步驟 2 開始。

67 85 

68<Steps>86<Steps>

69 <Step title="建立環境">87 <Step title="建立環境">


73 </Step>91 </Step>

74 92 

75 <Step title="啟動執行器">93 <Step title="啟動執行器">

76 建立密鑰目錄。此步驟和下一步需要 root 用於 `/etc/claude` 路徑;執行器程序可以讀取的任何路徑都有效,因此如果您使用不同的路徑,請一起調整兩個命令和 `--environment-secret-file` 值。94 建立密鑰目錄。此命令和下一個命令使用 `/etc/claude`,這需要 root,且它們建立的密鑰檔案只能由執行它們的使用者讀取。如果執行器將以其他使用者身分執行,它會以 `error: Failed to read environment secret file <path> (EACCES: permission denied, open '<path>')` 退出。在這種情況下,請以執行器的使用者身分執行這兩個命令,並使用該使用者可寫入的目錄取代 `/etc/claude`,然後將相同路徑傳遞給 `--environment-secret-file`。執行器程序可以讀取的任何路徑都有效。

77 95 

78 ```bash theme={null}96 ```bash theme={null}

79 mkdir -p /etc/claude97 mkdir -p /etc/claude


89 107 

90 如果執行器無法建立或寫入路徑,它在啟動時會以命名目錄的錯誤退出,而不是註冊。請參閱[疑難排解](/docs/zh-TW/self-hosted-environments-deploy#troubleshooting)。108 如果執行器無法建立或寫入路徑,它在啟動時會以命名目錄的錯誤退出,而不是註冊。請參閱[疑難排解](/docs/zh-TW/self-hosted-environments-deploy#troubleshooting)。

91 109 

92 然後使用 `--environment-secret-file` 和 `--base-dir` 啟動執行器。執行器向您的環境註冊並開始輪詢工作。如果執行器退出,請手動重新啟動它。生產部署在編排器下執行執行器,該編排器重新啟動已退出的執行器,通常每次重新啟動時使用新的檔案系統;[重複使用預先準備的簽出](/docs/zh-TW/self-hosted-environments-deploy#reuse-a-pre-warmed-checkout)涵蓋支援的持久磁碟設定。110 然後使用 `--environment-secret-file` 和 `--base-dir` 啟動執行器:

93 111 

94 ```bash theme={null}112 ```bash theme={null}

95 claude self-hosted-runner --environment-secret-file '/etc/claude/environment-secret' --base-dir '<writable-dir>'113 claude self-hosted-runner --environment-secret-file '/etc/claude/environment-secret' --base-dir '<writable-dir>'

96 ```114 ```

115 

116 執行器向您的環境註冊後會記錄 `Registered: runner_id=<runner-id>`,然後開始輪詢工作。如果執行器之後退出,請自行重新啟動它。有關何時會發生這種情況,請參閱[如果執行器退出](#if-the-runner-exits)。

97 </Step>117 </Step>

98 118 

99 <Step title="驗證執行器出現">119 <Step title="驗證執行器出現">

100 返回[**雲端環境**頁面](https://claude.ai/admin-settings/cloud-environments)。您的環境狀態在執行器啟動後幾秒內從**未部署執行器**變更為**健康**;開啟環境並選擇**活動**以查看執行器本身。120 返回[**雲端環境**頁面](https://claude.ai/admin-settings/cloud-environments)。您的環境狀態在執行器啟動後幾秒內從**未部署執行器**變更為**健康**;開啟環境並選擇**活動**以查看執行器本身。如果您無法存取管理頁面,上一步執行器日誌中的 `Registered: runner_id=<runner-id>` 行可提供相同的訊號。

101 </Step>121 </Step>

102 122 

103 <Step title="將工作階段路由到環境">123 <Step title="將工作階段路由到環境">

104 在 claude.ai/code 啟動工作階段,並從環境選擇器中選擇您的環境,其中自託管環境與 Anthropic 託管的環境並排出現。執行器使用主機已有的任何 git 認證進行複製,因此選擇此主機已可以複製的存放庫,或公開存放庫;生產中私有存放庫的認證選項在[設定 git](/docs/zh-TW/self-hosted-environments-deploy#configure-git)。下一個可用的執行器會拾取佇列中的工作階段,並記錄 `Picked up session <session-id>` 以及其活動計數和容量,因此您可以從執行器自己的輸出確認哪個主機接收了工作階段。在 [claude.ai/code](https://claude.ai/code) 觀看工作階段工作並閱讀 Claude 的回覆。如果工作階段保持佇列狀態,請參閱[疑難排解](/docs/zh-TW/self-hosted-environments-deploy#troubleshooting)。124 <span id="route-a-session" />在 claude.ai/code 啟動工作階段,並從環境選擇器中選擇您的環境,其中自託管環境與 Anthropic 託管的環境並排出現。對於儲存庫,請選擇[先決條件](#host-and-network)中的儲存庫:公開儲存庫,或此主機已可以複製的儲存庫。執行器使用主機已有的任何 git 憑證進行複製。

125 

126 下一個可用的執行器會拾取佇列中的工作階段,並記錄 `Picked up session <session-id>` 以及其活動計數和容量,因此您可以從執行器自己的輸出確認哪個主機接收了工作階段。在 [claude.ai/code](https://claude.ai/code) 觀看工作階段工作並閱讀 Claude 的回覆。

127 

128 如果工作階段沒有開始工作,請對照您看到的情況:

129 

130 * **工作階段保持佇列狀態**:請參閱[疑難排解](/docs/zh-TW/self-hosted-environments-deploy#troubleshooting)。

131 * **工作階段因 git 錯誤而無法啟動**:錯誤會出現在工作階段和執行器的日誌中。如果其中包含 git 的 `could not read Username for`,後面接著您的 git 主機 URL,表示執行器沒有該主機的 HTTPS 憑證。請參閱[設定 git](/docs/zh-TW/self-hosted-environments-deploy#configure-git),其中也涵蓋了生產環境中私有儲存庫的憑證選項。

105 </Step>132 </Step>

106</Steps>133</Steps>

107 134 

108執行器在其活動工作階段完成後按設計退出;請參閱[執行器生命週期](/docs/zh-TW/self-hosted-environments#runner-lifecycle)。對於生產環境,在編排器下部署它,該編排器在退出時重新啟動它,並在執行器啟動後立即持續退出時等待更長的時間再重新啟動。請參閱[部署到生產環境](/docs/zh-TW/self-hosted-environments-deploy)和[當執行器退出時](/docs/zh-TW/self-hosted-environments-deploy#when-the-runner-exits)。135<h3 id="if-the-runner-exits">

136 如果執行器退出

137</h3>

138 

139如果執行器在此快速入門期間退出,請使用相同的命令再次啟動它。執行器可能會自行退出:

140 

141* **工作階段已完成**:日誌顯示 `[runner:exit] account workload drained — exiting`。執行器在其活動工作階段完成後按設計退出。請參閱[執行器生命週期](/docs/zh-TW/self-hosted-environments#runner-lifecycle)。

142* **失去聯繫**:日誌顯示一行 `[runner:fatal]`,並帶有 `runner record gone server-side` 或 `poll auth failed`。如果執行器與 Anthropic 失去聯繫一段時間,例如因為主機進入睡眠狀態,它可能會在下次連線到 Anthropic 時退出。

143 

144完成一個回合並不會結束您的測試工作階段。第一個回合之後,工作階段仍處於附加狀態,執行器也仍在執行,因此您可以[向工作階段傳送後續訊息](#send-a-follow-up-message-to-a-running-session),而無需先重新啟動執行器。

145 

146對於生產環境,在編排器下部署執行器,該編排器在退出時重新啟動它,並在執行器啟動後立即持續退出時等待更長的時間再重新啟動。請參閱[部署到生產環境](/docs/zh-TW/self-hosted-environments-deploy)和[當執行器退出時](/docs/zh-TW/self-hosted-environments-deploy#when-the-runner-exits)。

109 147 

110<h2 id="send-a-follow-up-message-to-a-running-session">148<h2 id="send-a-follow-up-message-to-a-running-session">

111 傳送後續訊息到執行中的工作階段149 傳送後續訊息到執行中的工作階段

Details

52| `--release-idle-session-min <n>` | `SELF_HOSTED_RUNNER_SESSION_IDLE_MS` | `0` | 在轉向完成或工作階段等待使用者操作後,在 N 分鐘的不活動後釋放工作階段槽。仍在進行中轉向的工作階段(包括持有永不完成的背景工作或從執行中工具呼叫內部請求的批准的工作階段)不計為閒置;與 `--kill-session-after-min` 配對作為硬後擋。在工作階段的背景工作完成後,執行器將工作階段視為忙碌,直到讀取結果的後續轉向開始,最多 [`SELF_HOSTED_RUNNER_BG_RESULT_GRACE_MS`](#environment-variable-only-settings) 視窗。在執行器接收到關閉信號或達到其退休時間之前,留下執行器沒有活動工作階段的釋放會啟動與正常排空相同的退出路徑,由 `--drain-grace-sec` 管理。在您使用 [`--defer-shutdown-max-min`](/docs/zh-TW/self-hosted-environments-deploy#defer-the-drain-past-the-first-signal) 延遲的第一個信號之後,執行器在釋放使其不持有任何工作階段時立即退出。`0` 停用。 |52| `--release-idle-session-min <n>` | `SELF_HOSTED_RUNNER_SESSION_IDLE_MS` | `0` | 在轉向完成或工作階段等待使用者操作後,在 N 分鐘的不活動後釋放工作階段槽。仍在進行中轉向的工作階段(包括持有永不完成的背景工作或從執行中工具呼叫內部請求的批准的工作階段)不計為閒置;與 `--kill-session-after-min` 配對作為硬後擋。在工作階段的背景工作完成後,執行器將工作階段視為忙碌,直到讀取結果的後續轉向開始,最多 [`SELF_HOSTED_RUNNER_BG_RESULT_GRACE_MS`](#environment-variable-only-settings) 視窗。在執行器接收到關閉信號或達到其退休時間之前,留下執行器沒有活動工作階段的釋放會啟動與正常排空相同的退出路徑,由 `--drain-grace-sec` 管理。在您使用 [`--defer-shutdown-max-min`](/docs/zh-TW/self-hosted-environments-deploy#defer-the-drain-past-the-first-signal) 延遲的第一個信號之後,執行器在釋放使其不持有任何工作階段時立即退出。`0` 停用。 |

53| `--remove-session-state [bool]` | `SELF_HOSTED_RUNNER_REMOVE_SESSION_STATE` | 關閉 | 當工作階段在此執行器上結束時,移除 `<base-dir>/_sessions/` 下的工作階段的每個工作階段目錄,無論結果如何。[重複使用預先加熱的簽出](/docs/zh-TW/self-hosted-environments-deploy#reuse-a-pre-warmed-checkout)描述它們持有的內容以及當它們保留時誰可以讀取它們。移除是盡力而為:當執行器被終止或在清理執行之前達到其排空期限時,每個工作階段目錄保留在原位。啟用旗標後,失敗或中斷的工作階段的偵錯日誌不會保留在磁碟上。需要 Claude Code v2.1.268 或更新版本。 |53| `--remove-session-state [bool]` | `SELF_HOSTED_RUNNER_REMOVE_SESSION_STATE` | 關閉 | 當工作階段在此執行器上結束時,移除 `<base-dir>/_sessions/` 下的工作階段的每個工作階段目錄,無論結果如何。[重複使用預先加熱的簽出](/docs/zh-TW/self-hosted-environments-deploy#reuse-a-pre-warmed-checkout)描述它們持有的內容以及當它們保留時誰可以讀取它們。移除是盡力而為:當執行器被終止或在清理執行之前達到其排空期限時,每個工作階段目錄保留在原位。啟用旗標後,失敗或中斷的工作階段的偵錯日誌不會保留在磁碟上。需要 Claude Code v2.1.268 或更新版本。 |

54| `--retire-at <epoch-seconds>` | `SELF_HOSTED_RUNNER_RETIRE_AT` | 未設定 | 在絕對 Unix 時間戳記(秒)時退休執行器,用於在已知時間終止執行器的基礎設施;[執行器生命週期](/docs/zh-TW/self-hosted-environments#runner-lifecycle)描述釋放序列以及如何調整邊距。2001 年之前或 5138 年之後的值被旗標拒絕,被環境變數忽略。 |54| `--retire-at <epoch-seconds>` | `SELF_HOSTED_RUNNER_RETIRE_AT` | 未設定 | 在絕對 Unix 時間戳記(秒)時退休執行器,用於在已知時間終止執行器的基礎設施;[執行器生命週期](/docs/zh-TW/self-hosted-environments#runner-lifecycle)描述釋放序列以及如何調整邊距。2001 年之前或 5138 年之後的值被旗標拒絕,被環境變數忽略。 |

55| `--server-auto-mode-lists <mode>` | `SELF_HOSTED_RUNNER_SERVER_AUTO_MODE_LISTS` | `no-allow` | 控制平面隨工作階段傳送的[自動模式](/docs/zh-TW/permission-modes#eliminate-prompts-with-auto-mode)分類器規則清單中,哪些可以送達該工作階段:`all`、`no-allow` 或 `none`。請參閱[自動模式規則清單](#auto-mode-rule-lists)以了解每個值套用的內容。無效的值會使執行器在啟動時停止。需要 Claude Code v2.1.295 或更新版本。 |

55| `--session-stop-grace-sec <n>` | `SELF_HOSTED_RUNNER_SESSION_STOP_GRACE_MS` | `5` | 在工作階段結束後,在強制終止之前等待 Claude 程序乾淨退出的時間。如果子程序自己的 `SessionEnd` 掛鉤需要更多時間,請提高該值。 |56| `--session-stop-grace-sec <n>` | `SELF_HOSTED_RUNNER_SESSION_STOP_GRACE_MS` | `5` | 在工作階段結束後,在強制終止之前等待 Claude 程序乾淨退出的時間。如果子程序自己的 `SessionEnd` 掛鉤需要更多時間,請提高該值。 |

56| `--startup-timeout-min <n>` | `SELF_HOSTED_RUNNER_STARTUP_TIMEOUT_MS` | `15` | 如果子程序在產生後 N 分鐘內未在[活動頻道](/docs/zh-TW/self-hosted-environments-configuration#keep-stdin-and-file-descriptor-3-attached)上發出初始化信號,則釋放工作階段槽。由子程序的初始化信號清除,而不是普通輸出,之後 `--release-idle-session-min` 接管。`0` 停用。 |57| `--startup-timeout-min <n>` | `SELF_HOSTED_RUNNER_STARTUP_TIMEOUT_MS` | `15` | 如果子程序在產生後 N 分鐘內未發出已完成初始化的信號,則釋放工作階段槽。複製在產生之前進行,因此複製時間不計入。由子程序在[活動頻道](/docs/zh-TW/self-hosted-environments-configuration#keep-stdin-and-file-descriptor-3-attached)上的初始化信號清除,而不是普通輸出,之後 `--release-idle-session-min` 接管。`0` 停用。 |

57| `--trust-workspace [bool]` | `SELF_HOSTED_RUNNER_TRUST_WORKSPACE` | 開啟 | 為每個工作階段的存放庫路徑播種持久化信任,以便尊重存放庫提交的 `permissions.allow` 和 `additionalDirectories`。設定 `false` 以放棄存放庫提交的權限授予,並改為在主機設定的 `settings.json` 中配置允許規則;存放庫提交的 `sandbox.*` 設定無論如何仍然適用,這就是為什麼[存放庫設定防護](/docs/zh-TW/self-hosted-environments-deploy#harden-your-deployment)無論此旗標如何都掃描它們。 |58| `--trust-workspace [bool]` | `SELF_HOSTED_RUNNER_TRUST_WORKSPACE` | 開啟 | 為每個工作階段的存放庫路徑播種持久化信任,以便尊重存放庫提交的 `permissions.allow` 和 `additionalDirectories`。設定 `false` 以放棄存放庫提交的權限授予,並改為在主機設定的 `settings.json` 中配置允許規則;存放庫提交的 `sandbox.*` 設定無論如何仍然適用,這就是為什麼[存放庫設定防護](/docs/zh-TW/self-hosted-environments-deploy#harden-your-deployment)無論此旗標如何都掃描它們。 |

58| `--use-anthropic-git-proxy` | `CLAUDE_RUNNER_USE_GIT_PROXY=1` | 關閉 | 通過 [Anthropic git proxy](/docs/zh-TW/self-hosted-environments-deploy#use-the-anthropic-git-proxy) 而不是客戶管理的 git 驗證進行複製。需要 `--capacity 1` 和 git 2.32 或更新版本;執行器否則拒絕啟動。取代重寫旗標。 |59| `--use-anthropic-git-proxy` | `CLAUDE_RUNNER_USE_GIT_PROXY=1` | 關閉 | 透過 [Anthropic git proxy](/docs/zh-TW/self-hosted-environments-deploy#use-the-anthropic-git-proxy) 複製 github.com 上的儲存庫,而不是使用客戶管理的 git 驗證。需要 `--capacity 1` 和 git 2.32 或更新版本;否則執行器拒絕啟動。取代重寫旗標。 |

59 60 

60大多數持續時間旗標都有最大值,選擇以將每個逾時保持在執行時間的 32 位元計時器上限內,大約 24.85 天。`--*-min` 旗標上限為 10080 分鐘,7 天;`--drain-grace-sec` 為 604800 秒,也是 7 天;`--drain-wait-sec` 為 86400 秒,24 小時。`--session-stop-grace-sec` 和 `--post-session-hook-timeout-sec` 無上限。超過上限的行為因表面而異:61大多數持續時間旗標都有最大值,選擇以將每個逾時保持在執行時間的 32 位元計時器上限內,大約 24.85 天。`--*-min` 旗標上限為 10080 分鐘,7 天;`--drain-grace-sec` 為 604800 秒,也是 7 天;`--drain-wait-sec` 為 86400 秒,24 小時。`--session-stop-grace-sec` 和 `--post-session-hook-timeout-sec` 無上限。超過上限的行為因表面而異:

61 62 

62* **旗標**:啟動失敗並出現錯誤。63* **旗標**:啟動失敗並出現錯誤。

63* **環境變數**:執行器將值夾住到計時器上限,而不是拒絕它。64* **環境變數**:執行器將值夾住到計時器上限,而不是拒絕它。

64 65 

66<h3 id="auto-mode-rule-lists">

67 自動模式規則清單

68</h3>

69 

70`--server-auto-mode-lists` 讓您決定哪些來自執行器外部的[自動模式](/docs/zh-TW/permission-modes#eliminate-prompts-with-auto-mode)分類器規則可以送達您執行器上的工作階段。Anthropic 的控制平面可以隨工作階段傳送規則清單,並要求執行器套用它們。其中某些項目可能是您組織的管理員所撰寫的規則。這些清單為 `environment`、`soft_deny` 和 `allow`:

71 

72* **`environment`**:項目可以讓分類器允許更多,也可以允許更少。

73* **`soft_deny`**:項目會封鎖某個動作,除非使用者明確要求該動作或適用某個 `allow` 例外。

74* **`allow`**:`soft_deny` 項目的例外。

75 

76旗標的值決定執行器套用哪些清單:

77 

78* **`no-allow`**:預設值。套用 `environment` 和 `soft_deny`,並保留 `allow` 不套用。`environment` 項目仍然可以讓分類器允許更多,因此預設值並不會排除所有放寬。

79* **`all`**:套用全部三個清單。

80* **`none`**:一個都不套用。選擇 `none` 可排除來自這些清單的所有放寬。它也會捨棄 `soft_deny` 的限制。

81 

82沒有任何執行器設定能讓控制平面要求執行器套用這些清單。當控制平面未提出要求時,無論您如何設定,工作階段都不會收到任何清單。若要查看實際發生的情況,請使用 `--log-level debug` 啟動執行器。執行器接著會為每個工作階段記錄一行包含 `the server asked this runner to apply` 的日誌,或一行包含 `the server did not ask this runner to apply the auto mode lists it sends` 的日誌。

83 

65<h2 id="orchestrator-cli-flags">84<h2 id="orchestrator-cli-flags">

66 協調器 CLI 旗標85 協調器 CLI 旗標

67</h2>86</h2>


72| :- | :- | :- |91| :- | :- | :- |

73| `--hook-concurrency <n>` | `4` | 最大 `spawn-runner` 掛鉤並行執行。也限制每次輪詢聲稱多少個產生請求。 |92| `--hook-concurrency <n>` | `4` | 最大 `spawn-runner` 掛鉤並行執行。也限制每次輪詢聲稱多少個產生請求。 |

74| `--hook-timeout <sec>` | `60` | 在此許多秒後終止掛鉤的程序樹。逾時加上其 5 秒終止寬限期必須保持在 `--expected-spawn-seconds` 以下;協調器在啟動時強制執行此項。 |93| `--hook-timeout <sec>` | `60` | 在此許多秒後終止掛鉤的程序樹。逾時加上其 5 秒終止寬限期必須保持在 `--expected-spawn-seconds` 以下;協調器在啟動時強制執行此項。 |

75| `--expected-spawn-seconds <sec>` | `120` | 產生的執行器的預期 p99 啟動時間,在伺服器強制的範圍 10 到 3600 內。在每次輪詢時作為伺服器端租約發送;如果沒有執行器在其經過前註冊,工作階段會以新訂單 ID 重新提供。所有副本必須共享此值。 |94| `--expected-spawn-seconds <sec>` | `120` | 從協調器收到產生請求到執行器註冊為止的預期 p99 時間,包括在您的平台上等待容量的任何時間。伺服器強制的範圍為 10 到 3600。在每次輪詢時作為伺服器端租約發送:如果沒有執行器在其經過前註冊,工作階段會以新訂單 ID 重新提供。所有副本必須共享此值。 |

76| `--min-idle <n>` | `0` | 通過主動產生待命執行器來保持至少 N 個閒置工作階段槽空閒。`0` 停用預熱。與執行器的 `--exit-if-unused-min` 配對,以便多餘的待命執行器回收自己。 |95| `--min-idle <n>` | `0` | 通過主動產生待命執行器來保持至少 N 個閒置工作階段槽空閒。`0` 停用預熱。與執行器的 `--exit-if-unused-min` 配對,以便多餘的待命執行器回收自己。 |

77| `--debug-dir <path>` | 未設定 | 將每個產生請求的工作訂單和掛鉤 stderr 寫入磁碟。僅用於偵錯;永遠不要在生產環境中設定。 |96| `--debug-dir <path>` | 未設定 | 將每個產生請求的工作訂單和掛鉤 stderr 寫入磁碟。僅用於偵錯;永遠不要在生產環境中設定。 |

78 97 


108| `SELF_HOSTED_RUNNER_POST_TURN_SETTLE_MS` | `7000` | 執行器在轉向完成後計算工作階段忙碌的上限時間,用於 `--drain-wait-sec` 排空,而工作階段的程序向 Anthropic 報告轉向的結束。`0` 或無法使用的值回退到預設值,因此無法關閉保持。需要 Claude Code v2.1.275 或更新版本。 |127| `SELF_HOSTED_RUNNER_POST_TURN_SETTLE_MS` | `7000` | 執行器在轉向完成後計算工作階段忙碌的上限時間,用於 `--drain-wait-sec` 排空,而工作階段的程序向 Anthropic 報告轉向的結束。`0` 或無法使用的值回退到預設值,因此無法關閉保持。需要 Claude Code v2.1.275 或更新版本。 |

109| `SELF_HOSTED_RUNNER_SIGKILL_GRACE_MS` | `30000` | 執行器等待作業系統將 `SIGKILL` 傳遞到卡在不可中斷 I/O 中的子程序的時間,然後自己退出。下限為 `--post-session-hook-timeout-sec` 加 15 秒,以及設定 `--push-outcome-on-release` 時的 30 秒,因此有效最小值在預設值為 75 秒。 |128| `SELF_HOSTED_RUNNER_SIGKILL_GRACE_MS` | `30000` | 執行器等待作業系統將 `SIGKILL` 傳遞到卡在不可中斷 I/O 中的子程序的時間,然後自己退出。下限為 `--post-session-hook-timeout-sec` 加 15 秒,以及設定 `--push-outcome-on-release` 時的 30 秒,因此有效最小值在預設值為 75 秒。 |

110| `CLAUDE_RUNNER_FETCH_DEPTH` | `50` | 新複製的 git 提取深度。設定正整數,或 `full` 或 `0` 以進行完整提取。工作區中已存在的存放庫保持其現有深度。 |129| `CLAUDE_RUNNER_FETCH_DEPTH` | `50` | 新複製的 git 提取深度。設定正整數,或 `full` 或 `0` 以進行完整提取。工作區中已存在的存放庫保持其現有深度。 |

130| `CLAUDE_RUNNER_FETCH_SERVER_PROGRESS_CAP_MS` | `600000` | 每次嘗試中,當 git 伺服器本身的進度數字持續上升時(例如伺服器為大型儲存庫準備 pack 時),git 提取可等待第一筆資料的時間(以毫秒為單位)。`0` 或 `off` 會關閉此等待:此類提取在兩分鐘內沒有資料時即會被中斷。其他任何整數會被限制在 `120000` 到 `1800000` 之間,即 2 到 30 分鐘。需要 Claude Code v2.1.295 或更新版本。 |

111| `CLAUDE_RUNNER_SKIP_GIT_VERIFY` | 未設定 | 當 `1` 時,在 `checkout` 掛鉤執行後跳過 `.git` 存在檢查。當您的掛鉤具體化非 git 來源時設定此項。 |131| `CLAUDE_RUNNER_SKIP_GIT_VERIFY` | 未設定 | 當 `1` 時,在 `checkout` 掛鉤執行後跳過 `.git` 存在檢查。當您的掛鉤具體化非 git 來源時設定此項。 |

112| `FORCE_AUTOUPDATE_PLUGINS` | 未設定 | 當 `1` 時,即使二進位檔被固定,也讓外掛程式市場自動更新 |132| `FORCE_AUTOUPDATE_PLUGINS` | 未設定 | 當 `1` 時,即使二進位檔被固定,也讓外掛程式市場自動更新 |

113| `CLAUDE_CODE_DISABLE_ARTIFACT` | 未設定 | 當 `1` 時,無論組織的管理員設定如何,都在工作階段中停用 Artifact 工具,並放棄 `*.frame.claudeusercontent.com` 出口要求 |133| `CLAUDE_CODE_DISABLE_ARTIFACT` | 未設定 | 當 `1` 時,無論組織的管理員設定如何,都在工作階段中停用 Artifact 工具,並放棄 `*.frame.claudeusercontent.com` 出口要求 |


178| `claude_code_self_hosted_orchestrator_poll_errors_total{error_kind}` | 按類型累積 PollSpawnHints 失敗:`transport`、`timeout`、`5xx`、`429` 或 `4xx`。所有五個序列都從程序啟動開始存在;在 `rate(...[5m]) > 0` 時發出警報。 |198| `claude_code_self_hosted_orchestrator_poll_errors_total{error_kind}` | 按類型累積 PollSpawnHints 失敗:`transport`、`timeout`、`5xx`、`429` 或 `4xx`。所有五個序列都從程序啟動開始存在;在 `rate(...[5m]) > 0` 時發出警報。 |

179| `claude_code_self_hosted_orchestrator_queue_pending_sessions` | 現在可聲稱的產生請求 |199| `claude_code_self_hosted_orchestrator_queue_pending_sessions` | 現在可聲稱的產生請求 |

180| `claude_code_self_hosted_orchestrator_queue_backing_off_sessions` | 在可重試掛鉤失敗後退避重試的產生請求 |200| `claude_code_self_hosted_orchestrator_queue_backing_off_sessions` | 在可重試掛鉤失敗後退避重試的產生請求 |

181| `claude_code_self_hosted_orchestrator_queue_circuit_broken_sessions` | 被阻止的產生請求,直到擁有者從環境的**活動**標籤重試它們;如果高於零則發出警報 |201| `claude_code_self_hosted_orchestrator_queue_circuit_broken_sessions` | 被阻止產生的工作階段。每個工作階段會持續被阻止,直到使用者傳送新訊息給它,或擁有者從環境的**活動**標籤重試它。修正原因後,計數可能仍維持在零以上。如果高於零則發出警報。 |

182| `claude_code_self_hosted_orchestrator_pool_pending_sessions` | 等待此環境中執行器的總工作階段。環境範圍的聚合,在每個協調器實例上相同:在實例之間使用 `MAX` 而不是 `SUM`。 |202| `claude_code_self_hosted_orchestrator_pool_pending_sessions` | 等待此環境中執行器的總工作階段。環境範圍的聚合,在每個協調器實例上相同:在實例之間使用 `MAX` 而不是 `SUM`。 |

183| `claude_code_self_hosted_orchestrator_pool_active_sessions` | 目前指派給此環境中活著執行器的工作階段。環境範圍的聚合,在每個協調器實例上相同:在實例之間使用 `MAX` 而不是 `SUM`。 |203| `claude_code_self_hosted_orchestrator_pool_active_sessions` | 目前指派給此環境中活著執行器的工作階段。環境範圍的聚合,在每個協調器實例上相同:在實例之間使用 `MAX` 而不是 `SUM`。 |

184| `claude_code_self_hosted_orchestrator_spawn_hooks_total{result}` | 累積 `spawn-runner` 掛鉤結果:`ok`、`retryable`、`non_retryable`。計數協調器掛鉤呼叫,而不是執行器產生的工作階段子程序:不可與 `sessions_started_total` 比較,因為容量高於 1、暖池和為同一工作階段再次產生的執行器都使兩者分歧。 |204| `claude_code_self_hosted_orchestrator_spawn_hooks_total{result}` | 累積 `spawn-runner` 掛鉤結果:`ok`、`retryable`、`non_retryable`。計數協調器掛鉤呼叫,而不是執行器產生的工作階段子程序:不可與 `sessions_started_total` 比較,因為容量高於 1、暖池和為同一工作階段再次產生的執行器都使兩者分歧。 |


251 for: 5m271 for: 5m

252 labels: {severity: warning}272 labels: {severity: warning}

253 annotations:273 annotations:

254 summary: "執行器 {{ $labels.pod }}:10 分鐘內 >3 個工作階段初始化失敗(簽出掛鉤 / git / 權杖 / 初始化前崩潰)"274 summary: "執行器 {{ $labels.pod }}:10 分鐘內 >3 個工作階段初始化失敗(簽出 hook / git / 權杖 / 初始化前崩潰)"

255 - alert: ClaudeRunnerPollErrors275 - alert: ClaudeRunnerPollErrors

256 expr: sum by (pod) (rate(claude_code_self_hosted_runner_poll_errors_total[5m])) > 0276 expr: sum by (pod) (rate(claude_code_self_hosted_runner_poll_errors_total[5m])) > 0

257 for: 2m277 for: 2m


263 for: 5m283 for: 5m

264 labels: {severity: warning}284 labels: {severity: warning}

265 annotations:285 annotations:

266 summary: "執行器 {{ $labels.pod }}:10 分鐘內 >3 個 SessionStart 掛鉤失敗"286 summary: "執行器 {{ $labels.pod }}:10 分鐘內 >3 個 SessionStart hook 失敗"

267 287 

268 - name: claude-code-self-hosted-orchestrator288 - name: claude-code-self-hosted-orchestrator

269 rules:289 rules:


278 for: 2m298 for: 2m

279 labels: {severity: warning}299 labels: {severity: warning}

280 annotations:300 annotations:

281 summary: "協調器 {{ $labels.pod }} 已超過 90 秒未輪詢(輪詢迴圈等待掛鉤執行)"301 summary: "協調器 {{ $labels.pod }} 已超過 90 秒未輪詢(輪詢迴圈等待 hook 執行)"

282 - alert: ClaudeOrchestratorCircuitBroken302 - alert: ClaudeOrchestratorCircuitBroken

283 expr: claude_code_self_hosted_orchestrator_queue_circuit_broken_sessions > 0303 expr: claude_code_self_hosted_orchestrator_queue_circuit_broken_sessions > 0

284 for: 1m304 for: 1m

285 labels: {severity: critical}305 labels: {severity: critical}

286 annotations:306 annotations:

287 summary: "{{ $value }} 個工作階段斷路 — spawn-runner 掛鉤重複不可重試;修復基礎設施然後從活動標籤重試"307 summary: "被阻止產生的工作階段:{{ $value }}。在活動標籤中閱讀每個工作階段的錯誤,修正原因,然後選取重試"

288 - alert: ClaudeOrchestratorPollErrors308 - alert: ClaudeOrchestratorPollErrors

289 expr: sum by (pod) (rate(claude_code_self_hosted_orchestrator_poll_errors_total[5m])) > 0309 expr: sum by (pod) (rate(claude_code_self_hosted_orchestrator_poll_errors_total[5m])) > 0

290 for: 2m310 for: 2m


296 for: 5m316 for: 5m

297 labels: {severity: warning}317 labels: {severity: warning}

298 annotations:318 annotations:

299 summary: "協調器 {{ $labels.pod }}:5 分鐘內 >3 個 spawn-runner 掛鉤失敗"319 summary: "協調器 {{ $labels.pod }}:5 分鐘內 >3 個 spawn-runner hook 失敗"

300```320```

301 321 

302<h3 id="pass-through-session-child-metrics">322<h3 id="pass-through-session-child-metrics">


319 339 

320在 v2.1.260 之前,執行器終止達到其 `--kill-session-after-min` 限制的每個工作階段並在 `sessions_interrupted_total` 中計數。340在 v2.1.260 之前,執行器終止達到其 `--kill-session-after-min` 限制的每個工作階段並在 `sessions_interrupted_total` 中計數。

321 341 

322[`post-session` 掛鉤](/docs/zh-TW/self-hosted-environments-configuration#post-session)的 `CLAUDE_RUNNER_EXIT_REASON` 以不同方式分類乾淨交接。掛鉤將釋放、啟動逾時和伺服器取消指派報告為 `interrupted`,因為執行器停止了子程序。這些計數器記錄與 `completed` 相同的事件,因為槽被乾淨地交回。342[`post-session` hook](/docs/zh-TW/self-hosted-environments-configuration#post-session)的 `CLAUDE_RUNNER_EXIT_REASON` 以不同方式分類乾淨交接。hook 將這些情況報告為 `interrupted`,因為執行器停止了子程序:釋放、啟動逾時、伺服器取消指派,以及輪詢先注意到的存檔或刪除。這些計數器記錄與 `completed` 相同的事件,因為槽被乾淨地交回。

323 343 

324如果您直接根據 `sessions_completed_total` 協調掛鉤收據,您會低估完成。使用掛鉤以獲得每個工作階段的保證,並使用計數器以獲得聚合速率。344如果您直接根據 `sessions_completed_total` 協調掛鉤收據,您會低估完成。使用掛鉤以獲得每個工作階段的保證,並使用計數器以獲得聚合速率。

325 345 

Details

87 87 

88The `--environment` 和 `--ref` 分派旗標需要執行指令碼的機器上的 Claude Code v2.1.224 或更新版本,與執行器本身的下限相同。安裝 hook 並在此主機上啟動執行器後,測試指令碼:88The `--environment` 和 `--ref` 分派旗標需要執行指令碼的機器上的 Claude Code v2.1.224 或更新版本,與執行器本身的下限相同。安裝 hook 並在此主機上啟動執行器後,測試指令碼:

89 89 

901. 使用 `claude -p "<prompt>" --environment <environment-id> --output-format json` 在測試環境上建立工作階段,從 git 簽出執行,以便 CLI 可以從 `origin` 遠端自動偵測存放庫。可選的 `--ref <branch>` 將工作階段的簽出基於命名的 ref,而不是本機 HEAD。該命令建立工作階段、列印包含 `session_id` 的一行 JSON,並在不等待 Claude 回覆的情況下退出。901. 使用 `claude -p "<prompt>" --environment <environment-id> --output-format json` 在測試環境上建立工作階段。請從 git 簽出中執行該命令,以便 CLI 可以從 `origin` 遠端自動偵測儲存庫。可選的 `--ref <branch>` 將工作階段的簽出基於命名的 ref,而不是本機 HEAD。該命令會在不等待 Claude 回覆的情況下退出。其列印的內容會告訴您的指令碼結果:

91 * **工作階段已建立**:一行 JSON,例如 `{"ok":true,"session_id":"session_...","title":"...","url":"...","pool_id":"..."}`

92 * **工作階段建立失敗**:`{"ok":false,"error":"..."}` 這一行,且命令以狀態 1 退出

93 * **某些較早發生的錯誤**,例如您的組織無法使用雲端工作階段或缺少提示詞:錯誤會輸出到 stderr 且沒有 JSON 行,命令以狀態 1 退出

912. 等待回覆出現在 `$E2E_REPLY_DIR/<session_id>.txt` 中,由執行器上的 Stop hook 在回合完成後寫入。942. 等待回覆出現在 `$E2E_REPLY_DIR/<session_id>.txt` 中,由執行器上的 Stop hook 在回合完成後寫入。

923. 使用 `claude -p "<message>" --cloud <session_id> --output-format json` 傳送後續訊息(請參閱[傳送後續訊息到執行中的工作階段](/docs/zh-TW/claude-code-on-the-web#send-follow-ups-from-the-cli)),它將使用者事件發佈到現有工作階段並退出。953. 使用 `claude -p "<message>" --cloud <session_id> --output-format json` 傳送後續訊息(請參閱[傳送後續訊息到執行中的工作階段](/docs/zh-TW/claude-code-on-the-web#send-follow-ups-from-the-cli)),它將使用者事件發佈到現有工作階段並退出。

934. 以與步驟 2 相同的方式等待後續訊息的回覆。964. 以與步驟 2 相同的方式等待後續訊息的回覆。


104 範例指令碼107 範例指令碼

105</h2>108</h2>

106 109 

107下面的指令碼針對 `$CLAUDE_TEST_ENVIRONMENT_ID`(您的測試環境的 `ccpool_...` ID,顯示在管理頁面上環境的詳細對話框中或由[建立環境呼叫](#create-a-dedicated-test-environment)返回)執行完整迴圈,並在每個回覆中斷言哨兵短語。從您希望工作階段在其中工作的儲存庫的 git 簽出執行它,在此主機上啟動執行器後,安裝擷取 hook 並匯出 `E2E_REPLY_DIR`。請先依照[從 CI 進行驗證](#authenticate-from-ci)中的說明,在執行指令碼的機器上使用 claude.ai 帳戶登入。若未登入,第一次分派會失敗並出現錯誤,例如 `Unable to get organization UUID for cloud session creation`。110範例指令碼在與測試執行器相同的機器上執行。執行之前,請先準備好該機器:

111 

112* **儲存庫簽出**:從您希望工作階段在其中工作的儲存庫的 git 簽出執行指令碼。

113* **執行器**:在此主機上啟動執行器,並安裝擷取 hook 及匯出 `E2E_REPLY_DIR`。

114* **登入**:依照[從 CI 進行驗證](#authenticate-from-ci)中的說明,在執行指令碼的機器上使用 claude.ai 帳戶登入。

115* **環境 ID**:將 `CLAUDE_TEST_ENVIRONMENT_ID` 設定為您的測試環境的 `ccpool_...` ID,該 ID 顯示在管理頁面上環境的詳細對話框中,或由[建立環境呼叫](#create-a-dedicated-test-environment)返回。

116 

117下面的指令碼針對 `$CLAUDE_TEST_ENVIRONMENT_ID` 執行完整迴圈,並在每個回覆中斷言哨兵短語。

108 118 

109```bash theme={null}119```bash theme={null}

110#!/usr/bin/env bash120#!/usr/bin/env bash


152TURN1="e2e-probe-$(date +%s)-$$: say exactly 'ok: custom tools are reachable' and nothing else"162TURN1="e2e-probe-$(date +%s)-$$: say exactly 'ok: custom tools are reachable' and nothing else"

153EXPECT1="ok: custom tools are reachable"163EXPECT1="ok: custom tools are reachable"

154create_json=$(claude -p "$TURN1" --environment "$CLAUDE_TEST_ENVIRONMENT_ID" \164create_json=$(claude -p "$TURN1" --environment "$CLAUDE_TEST_ENVIRONMENT_ID" \

155 --ref "$TEST_REPO_REF" --output-format json)165 --ref "$TEST_REPO_REF" --output-format json < /dev/null)

156echo "create: $create_json"166echo "create: $create_json"

157SESSION_ID=$(jq -er '.session_id' <<<"$create_json")167SESSION_ID=$(jq -er '.session_id' <<<"$create_json")

158 168 


163# 3. Post a follow-up via the CLI.173# 3. Post a follow-up via the CLI.

164TURN2="e2e-probe-followup-$(date +%s): say exactly 'ok: follow-up delivered' and nothing else"174TURN2="e2e-probe-followup-$(date +%s): say exactly 'ok: follow-up delivered' and nothing else"

165EXPECT2="ok: follow-up delivered"175EXPECT2="ok: follow-up delivered"

166followup_json=$(claude -p "$TURN2" --cloud "$SESSION_ID" --output-format json)176followup_json=$(claude -p "$TURN2" --cloud "$SESSION_ID" --output-format json < /dev/null)

167echo "followup: $followup_json"177echo "followup: $followup_json"

168jq -e '.ok == true' <<<"$followup_json" >/dev/null178jq -e '.ok == true' <<<"$followup_json" >/dev/null

169 179 

skills.md +1 −1

Details

235 235 

236如果技能僅存在於您機器上的 `~/.claude/skills/` 中,當[例行工作](/docs/zh-TW/routines)叫用它時,Claude Code 會報告找不到該技能,因為每次例行工作執行都會啟動為新的雲端工作階段。若要在這些工作階段中提供個人技能:236如果技能僅存在於您機器上的 `~/.claude/skills/` 中,當[例行工作](/docs/zh-TW/routines)叫用它時,Claude Code 會報告找不到該技能,因為每次例行工作執行都會啟動為新的雲端工作階段。若要在這些工作階段中提供個人技能:

237 237 

238* 對於 Cowork 和雲端工作階段,為您的 claude.ai 帳戶啟用該技能。238* 對於 Cowork 和雲端工作階段,為您的 claude.ai 帳戶啟用該 skill。[自架環境中的某些工作階段](/docs/zh-TW/self-hosted-environments-configuration#how-each-session’s-config-is-assembled)不會載入您帳戶的 skill。

239* 對於雲端工作階段,您可以改為將技能提交到版本庫的 `.claude/skills/`。在版本庫的 `.claude/settings.json` 中宣告的外掛程式和僅在您的使用者設定中啟用的外掛程式[不會在雲端工作階段中載入](/docs/zh-TW/cloud-environments#what-carries-over-from-your-setup)。239* 對於雲端工作階段,您可以改為將技能提交到版本庫的 `.claude/skills/`。在版本庫的 `.claude/settings.json` 中宣告的外掛程式和僅在您的使用者設定中啟用的外掛程式[不會在雲端工作階段中載入](/docs/zh-TW/cloud-environments#what-carries-over-from-your-setup)。

240 240 

241[Desktop 排程工作](/docs/zh-TW/desktop-scheduled-tasks)在您的機器上本地執行,因此它們會載入 `~/.claude/skills/`。241[Desktop 排程工作](/docs/zh-TW/desktop-scheduled-tasks)在您的機器上本地執行,因此它們會載入 `~/.claude/skills/`。

vs-code.md +1 −1

Details

479 479 

480Claude 會為瀏覽器任務開啟新分頁,並共享您瀏覽器的登入狀態,因此它可以存取您已登入的任何網站。480Claude 會為瀏覽器任務開啟新分頁,並共享您瀏覽器的登入狀態,因此它可以存取您已登入的任何網站。

481 481 

482若要讓每個工作階段在啟動時即連接到您的瀏覽器,而無需輸入 `@browser`,請參閱[預設啟用 Chrome](/docs/zh-TW/chrome#enable-chrome-by-default)。關於在以此方式連接的工作階段中,Claude Code 於執行瀏覽器操作前詢問您的情況,請參閱[VS Code 工作階段中的權限提示](/docs/zh-TW/chrome#permission-prompts-in-vs-code-sessions)。482若要讓每個工作階段在啟動時即連接到您的瀏覽器,而無需輸入 `@browser`,請參閱[預設啟用 Chrome](/docs/zh-TW/chrome#enable-chrome-by-default)。關於 Claude Code 何時會在執行瀏覽器操作前詢問您,請參閱[VS Code 工作階段中的權限提示](/docs/zh-TW/chrome#permission-prompts-in-vs-code-sessions)。

483 483 

484如需設定說明、完整的功能清單和疑難排解,請參閱 [使用 Claude Code 搭配 Chrome](/docs/zh-TW/chrome)。484如需設定說明、完整的功能清單和疑難排解,請參閱 [使用 Claude Code 搭配 Chrome](/docs/zh-TW/chrome)。

485 485