SpyBara
Go Premium

Documentation 2026-10-08 22:58 UTC to 2026-10-09 21:01 UTC

50 files changed +686 −218. View all changes and history on the product overview
2026
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

216| 选项 | 它控制什么 | 默认值 |216| 选项 | 它控制什么 | 默认值 |

217| :- | :- | :- |217| :- | :- | :- |

218| 最大轮次(`max_turns` / `maxTurns`) | 最大工具使用往返次数 | 无限制 |218| 最大轮次(`max_turns` / `maxTurns`) | 最大工具使用往返次数 | 无限制 |

219| 最大预算(`max_budget_usd` / `maxBudgetUsd`) | 停止前的最大成本 | 无限制 |219| 最大预算(`max_budget_usd` / `maxBudgetUsd`) | 循环停止时的预估支出 | 无限制 |

220 220 

221当达到任一限制时,SDK 返回一个 `ResultMessage`,包含相应的错误子类型(`error_max_turns` 或 `error_max_budget_usd`)。有关如何检查这些子类型,请参阅 [处理结果](#handle-the-result),有关语法,请参阅 [`ClaudeAgentOptions`](/docs/zh-CN/agent-sdk/python#claudeagentoptions) / [`Options`](/docs/zh-CN/agent-sdk/typescript#options)。221当达到任一限制时,SDK 返回一个 `ResultMessage`,包含相应的错误子类型(`error_max_turns` 或 `error_max_budget_usd`)。有关如何检查这些子类型,请参阅 [处理结果](#handle-the-result),有关语法,请参阅 [`ClaudeAgentOptions`](/docs/zh-CN/agent-sdk/python#claudeagentoptions) / [`Options`](/docs/zh-CN/agent-sdk/typescript#options)。

222 222 


224 224 

225使用 [流式输入](/docs/zh-CN/agent-sdk/streaming-vs-single-mode),当轮次在最大轮次限制处结束时,仍在队列中的消息保持排队。Claude Code 不会将其添加到该轮次的最后一次模型调用中。它为该消息启动新轮次,该轮次的最大轮次计数重新开始。预算总额继续在消息间累积,一旦支出达到 `maxBudgetUsd`,同一对话中的后续消息以 `error_max_budget_usd` 结果结束。[`/clear`](/docs/zh-CN/agent-sdk/cost-tracking) 会重新开始预算。225使用 [流式输入](/docs/zh-CN/agent-sdk/streaming-vs-single-mode),当轮次在最大轮次限制处结束时,仍在队列中的消息保持排队。Claude Code 不会将其添加到该轮次的最后一次模型调用中。它为该消息启动新轮次,该轮次的最大轮次计数重新开始。预算总额继续在消息间累积,一旦支出达到 `maxBudgetUsd`,同一对话中的后续消息以 `error_max_budget_usd` 结果结束。[`/clear`](/docs/zh-CN/agent-sdk/cost-tracking) 会重新开始预算。

226 226 

227<h4 id="budget-headroom">

228 预算余量

229</h4>

230 

231Claude Code 在模型响应到达后才将支出与 `max_budget_usd` / `maxBudgetUsd` 上限进行比较,因为每个响应的成本来自 API 随响应返回的 token 用量。达到上限的那个响应仍会完成,并计入 [`total_cost_usd`](/docs/zh-CN/agent-sdk/cost-tracking#get-the-total-cost-of-a-query)。因此,支出最多可能超出上限该响应的成本,再加上此时仍在运行的子代理在停止前产生的任何支出。设置上限时,请为此预留余量。

232 

227<h3 id="effort-level">233<h3 id="effort-level">

228 努力级别234 努力级别

229</h3>235</h3>

Details

146| `auto` | 模型分类批准 | 模型分类器审查 shell 命令和网络请求等操作,允许或阻止它审查的每一个操作。有关可用性和决策顺序,请参阅[自动模式](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode) |146| `auto` | 模型分类批准 | 模型分类器审查 shell 命令和网络请求等操作,允许或阻止它审查的每一个操作。有关可用性和决策顺序,请参阅[自动模式](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode) |

147 147 

148<Warning>148<Warning>

149 **子代理继承:** 子代理在父会话的权限模式下运行,除非您在其[`AgentDefinition`](/docs/zh-CN/agent-sdk/typescript#agentdefinition)上设置 `permissionMode`,且父会话处于 `default`、`dontAsk` 或 `plan` 模式。即使这样,Claude Code 也永远不会应用 `"bypassPermissions"` 值。子代理仅在父会话本身处于 `bypassPermissions` 模式时才在该模式下运行。 `bypassPermissions` 异常需要 Claude Code v2.1.267 或更高版本。149 **子代理继承:** 子代理在父会话的权限模式下运行,除非您在其[`AgentDefinition`](/docs/zh-CN/agent-sdk/typescript#agentdefinition)上设置 `permissionMode`,且父会话处于 `default`、`dontAsk` 或 `plan` 模式。即使这样,Claude Code 也永远不会应用 `"bypassPermissions"` 值,并且仅当该子代理[可以使用自动模式](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode)时才会应用 `"auto"` 值。子代理仅在父会话本身处于 `bypassPermissions` 模式时才在该模式下运行。 `bypassPermissions` 异常需要 Claude Code v2.1.267 或更高版本。

150 150 

151 子代理可能具有不同的系统提示和比主代理更少受限的行为,因此继承 `bypassPermissions` 会授予它们完整的自主系统访问权限。[任何模式都不自动批准的操作](/docs/zh-CN/permission-modes#actions-no-mode-auto-approves)仍然适用。151 子代理可能具有不同的系统提示和比主代理更少受限的行为,因此继承 `bypassPermissions` 会授予它们完整的自主系统访问权限。[任何模式都不自动批准的操作](/docs/zh-CN/permission-modes#actions-no-mode-auto-approves)仍然适用。

152</Warning>152</Warning>

Details

928| `resume` | `str \| None` | `None` | 要恢复的会话 ID |928| `resume` | `str \| None` | `None` | 要恢复的会话 ID |

929| `session_id` | `str \| None` | `None` | 使用特定的会话 ID 而不是自动生成的。必须是有效的 UUID。不能与 `continue_conversation` 或 `resume` 结合使用,除非也设置了 `fork_session` |929| `session_id` | `str \| None` | `None` | 使用特定的会话 ID 而不是自动生成的。必须是有效的 UUID。不能与 `continue_conversation` 或 `resume` 结合使用,除非也设置了 `fork_session` |

930| `max_turns` | `int \| None` | `None` | 最大 Agent 轮次(工具使用往返) |930| `max_turns` | `int \| None` | `None` | 最大 Agent 轮次(工具使用往返) |

931| `max_budget_usd` | `float \| None` | `None` | 当客户端成本估计达到此 USD 值时停止查询。仅计算调用自身的支出;从恢复的会话恢复的总数不计算。有关准确性注意事项和重置行为,见 [跟踪成本和使用](/docs/zh-CN/agent-sdk/cost-tracking) |931| `max_budget_usd` | `float \| None` | `None` | 当客户端成本估计达到此 USD 值时停止查询。该估计值可能超过此值,因此请[预留余量](/docs/zh-CN/agent-sdk/agent-loop#budget-headroom)。仅计算调用自身的支出;从恢复的会话恢复的总数不计算。有关准确性注意事项和重置行为,见 [跟踪成本和使用](/docs/zh-CN/agent-sdk/cost-tracking) |

932| `disallowed_tools` | `list[str]` | `[]` | 要拒绝的工具。裸名称如 `"Bash"` 从 Claude 的上下文中移除工具。限定规则如 `"Bash(rm *)"` 保持工具可用,并在每个权限模式(包括 `bypassPermissions`)中拒绝匹配的调用,针对[按书写形式](/docs/zh-CN/permissions#bash-rule-limits)的命令。见 [权限](/docs/zh-CN/agent-sdk/permissions#allow-and-deny-rules) |932| `disallowed_tools` | `list[str]` | `[]` | 要拒绝的工具。裸名称如 `"Bash"` 从 Claude 的上下文中移除工具。限定规则如 `"Bash(rm *)"` 保持工具可用,并在每个权限模式(包括 `bypassPermissions`)中拒绝匹配的调用,针对[按书写形式](/docs/zh-CN/permissions#bash-rule-limits)的命令。见 [权限](/docs/zh-CN/agent-sdk/permissions#allow-and-deny-rules) |

933| `enable_file_checkpointing` | `bool` | `False` | 启用文件更改跟踪以进行回滚。见 [文件检查点功能](/docs/zh-CN/agent-sdk/file-checkpointing) |933| `enable_file_checkpointing` | `bool` | `False` | 启用文件更改跟踪以进行回滚。见 [文件检查点功能](/docs/zh-CN/agent-sdk/file-checkpointing) |

934| `model` | `str \| None` | `None` | Claude 模型别名或完整模型名称。见 [接受的值和特定于提供商的 ID](/docs/zh-CN/model-config#available-models) |934| `model` | `str \| None` | `None` | Claude 模型别名或完整模型名称。见 [接受的值和特定于提供商的 ID](/docs/zh-CN/model-config#available-models) |


987```987```

988 988 

989* `API_TIMEOUT_MS`:Anthropic 客户端上的每个请求超时时间,以毫秒为单位。默认 `600000`。适用于主循环和所有子代理。989* `API_TIMEOUT_MS`:Anthropic 客户端上的每个请求超时时间,以毫秒为单位。默认 `600000`。适用于主循环和所有子代理。

990* `CLAUDE_CODE_MAX_RETRIES`:最大 API 重试次数。默认 `10`,上限为 `15`。每次重试都有自己的 `API_TIMEOUT_MS` 窗口,因此最坏情况下的实际时间大约是 `API_TIMEOUT_MS × (CLAUDE_CODE_MAX_RETRIES + 1)` 加上退避时间。对于需要等待更长时间中断的无人值守运行,设置 [`CLAUDE_CODE_RETRY_WATCHDOG=1`](/docs/zh-CN/errors#tune-retry-behavior):它会无限期重试瞬时容量错误,并且在 Claude Code v2.1.199 或更高版本上,将其他瞬时错误的默认值提高到 `300` 并移除此变量的上限。990* `CLAUDE_CODE_MAX_RETRIES`:最大 API 重试次数。默认 `10`,上限为 `15`。每次重试都有自己的 `API_TIMEOUT_MS` 窗口。

991 

992 对于需要等待更长时间中断的无人值守运行,设置 [`CLAUDE_CODE_RETRY_WATCHDOG=1`](/docs/zh-CN/errors#tune-retry-behavior):它会无限期重试瞬时容量错误,并且在 Claude Code v2.1.199 或更高版本上,将其他瞬时错误的默认值提高到 `300` 并移除此变量的上限。

991* `CLAUDE_ASYNC_AGENT_STALL_TIMEOUT_MS`:子代理的停滞监视器。当流监视器开启时,默认值为 `CLAUDE_STREAM_IDLE_TIMEOUT_MS` 加 5 分钟,即 `600000`,除非您提高该变量。当流监视器关闭时,默认值为 `600000`。在 v2.1.257 之前,默认值始终为 `600000`。993* `CLAUDE_ASYNC_AGENT_STALL_TIMEOUT_MS`:子代理的停滞监视器。当流监视器开启时,默认值为 `CLAUDE_STREAM_IDLE_TIMEOUT_MS` 加 5 分钟,即 `600000`,除非您提高该变量。当流监视器关闭时,默认值为 `600000`。在 v2.1.257 之前,默认值始终为 `600000`。

992 994 

993 计时器在每个流事件时重置。停滞时,Claude Code 中止子代理并向父 Agent 报告停滞。对于后台子代理,它也会将任务标记为失败并附加任何部分结果。995 计时器在每个流事件时重置。停滞时,Claude Code 中止子代理并向父 Agent 报告停滞。对于后台子代理,它也会将任务标记为失败并附加任何部分结果。


3327{3329{

3328 "url": str, # 要从中获取内容的 URL3330 "url": str, # 要从中获取内容的 URL

3329 "prompt": str, # 要在获取的内容上运行的提示词3331 "prompt": str, # 要在获取的内容上运行的提示词

3332 "offset": int | None, # 从页面开头跳过的字符数。需要 Python Agent SDK 0.2.164 或更高版本

3330}3333}

3331```3334```

3332 3335 

Details

323 检测子代理调用323 检测子代理调用

324</h2>324</h2>

325 325 

326Claude 通过 Agent 工具调用子代理。要检测何时调用子代理,请检查 `tool_use` 块,其中 `name` 为 `"Agent"`。来自子代理上下文内的消息包含 `parent_tool_use_id` 字段。326Claude 通过 Agent 工具调用子代理。要检测何时调用子代理,请检查 `tool_use` 块,其中 `name` 为 `"Agent"`。

327 

328来自子代理上下文内的消息包含 `parent_tool_use_id` 字段。在 TypeScript 中,子代理生成的每条 assistant 消息和 user 消息还带有 [`agent_id`](/docs/zh-CN/agent-sdk/typescript#sdkassistantmessage):即该子代理的[任务事件](/docs/zh-CN/agent-sdk/typescript#sdktaskstartedmessage)中的 `task_id`。`agent_id` 需要 TypeScript Agent SDK v0.3.292 或更高版本。

327 329 

328<Note>330<Note>

329 该工具在 `tool_use` 块中显示为 `"Agent"`,但在 `system:init` 工具列表中显示为 `"Task"`。在 Claude Code v2.1.63 之前,`tool_use` 块也将其命名为 `"Task"`。为了保持检测在不同 SDK 版本中的工作,请在 `block.name` 中匹配两个值。331 该工具在 `tool_use` 块中显示为 `"Agent"`,但在 `system:init` 工具列表中显示为 `"Task"`。在 Claude Code v2.1.63 之前,`tool_use` 块也将其命名为 `"Task"`。为了保持检测在不同 SDK 版本中的工作,请在 `block.name` 中匹配两个值。


331 333 

332消息结构在不同 SDK 中有所不同。在 Python 中,您可以通过 `message.content` 直接访问内容块。在 TypeScript 中,`SDKAssistantMessage` 包装 Claude API 消息,因此您通过 `message.message.content` 访问内容。334消息结构在不同 SDK 中有所不同。在 Python 中,您可以通过 `message.content` 直接访问内容块。在 TypeScript 中,`SDKAssistantMessage` 包装 Claude API 消息,因此您通过 `message.message.content` 访问内容。

333 335 

334此示例遍历流式消息,记录何时调用子代理以及后续消息来自该子代理执行上下文内的时间。336此示例遍历流式消息,记录何时调用子代理以及后续消息来自该子代理执行上下文内的时间。TypeScript 版本还会为每条带有 `agent_id` 的子代理消息记录该 `agent_id`。

335 337 

336<CodeGroup>338<CodeGroup>

337 ```python Python theme={null}339 ```python Python theme={null}


403 // Check if this message is from within a subagent's context405 // Check if this message is from within a subagent's context

404 if (msg.parent_tool_use_id) {406 if (msg.parent_tool_use_id) {

405 console.log(" (running inside subagent)");407 console.log(" (running inside subagent)");

408 // On assistant and user messages, agent_id matches the task_id

409 // on that subagent's task_started and other task events

410 if (msg.agent_id) {

411 console.log(` agent_id: ${msg.agent_id}`);

412 }

406 }413 }

407 414 

408 if ("result" in message) {415 if ("result" in message) {

Details

569| `includePartialMessages` | `boolean` | `false` | 包含部分消息事件 |569| `includePartialMessages` | `boolean` | `false` | 包含部分消息事件 |

570| `loadTimeoutMs` | `number` | `60000` | *Alpha。* 在恢复物化期间,每次 `sessionStore.load()` 和 `sessionStore.listSubkeys()` 调用的超时时间(毫秒)。如果适配器在此时间窗口内未完成,查询将失败而不是挂起。未设置 `sessionStore` 时忽略 |570| `loadTimeoutMs` | `number` | `60000` | *Alpha。* 在恢复物化期间,每次 `sessionStore.load()` 和 `sessionStore.listSubkeys()` 调用的超时时间(毫秒)。如果适配器在此时间窗口内未完成,查询将失败而不是挂起。未设置 `sessionStore` 时忽略 |

571| `managedSettings` | `Settings` | `undefined` | 由您的宿主进程提供给所生成会话的策略层级设置。在部署了管理员托管设置的机器上,除非管理员优先级最高的托管源设置了 `parentSettingsBehavior: 'merge'`,否则 Claude Code 会忽略这些设置;并且当 [`policyHelper`](/docs/zh-CN/settings-reference#policyhelper) 提供托管设置时,永远不会合并它们。合并的值会经过一个仅限收紧的过滤器;[限制父级设置](/docs/zh-CN/claude-apps-gateway#restrict-parent-settings)介绍了过滤器允许的内容以及 `allowManaged*Only` 锁定。设置了 [`CLAUDE_CODE_PROVIDER_MANAGED_BY_HOST`](/docs/zh-CN/env-vars) 的宿主会改为直接从此负载中读取三个键:在 Claude Code v2.1.222 或更高版本中读取其[模型配置](/docs/zh-CN/model-config#restrict-model-selection);在 v2.1.246 或更高版本中,当没有托管源设置 [`modelPricing`](/docs/zh-CN/settings-reference#modelpricing) 时读取该键;在 v2.1.247 或更高版本中读取其 `ENABLE_TOOL_SEARCH` env 条目 |571| `managedSettings` | `Settings` | `undefined` | 由您的宿主进程提供给所生成会话的策略层级设置。在部署了管理员托管设置的机器上,除非管理员优先级最高的托管源设置了 `parentSettingsBehavior: 'merge'`,否则 Claude Code 会忽略这些设置;并且当 [`policyHelper`](/docs/zh-CN/settings-reference#policyhelper) 提供托管设置时,永远不会合并它们。合并的值会经过一个仅限收紧的过滤器;[限制父级设置](/docs/zh-CN/claude-apps-gateway#restrict-parent-settings)介绍了过滤器允许的内容以及 `allowManaged*Only` 锁定。设置了 [`CLAUDE_CODE_PROVIDER_MANAGED_BY_HOST`](/docs/zh-CN/env-vars) 的宿主会改为直接从此负载中读取三个键:在 Claude Code v2.1.222 或更高版本中读取其[模型配置](/docs/zh-CN/model-config#restrict-model-selection);在 v2.1.246 或更高版本中,当没有托管源设置 [`modelPricing`](/docs/zh-CN/settings-reference#modelpricing) 时读取该键;在 v2.1.247 或更高版本中读取其 `ENABLE_TOOL_SEARCH` env 条目 |

572| `maxBudgetUsd` | `number` | `undefined` | 当客户端成本估算达到此美元值时停止查询。仅计算本次调用自身的花费;从恢复的会话中还原的总额不计入。有关准确性注意事项和重置行为,请参阅[跟踪成本和用量](/docs/zh-CN/agent-sdk/cost-tracking) |572| `maxBudgetUsd` | `number` | `undefined` | 当客户端成本估算达到此美元值时停止查询。估算值可能超过此值,因此请[留出余量](/docs/zh-CN/agent-sdk/agent-loop#budget-headroom)。仅计算本次调用自身的花费;从恢复的会话中还原的总计不计入。有关准确性注意事项和重置行为,请参阅[跟踪成本和用量](/docs/zh-CN/agent-sdk/cost-tracking) |

573| `maxThinkingTokens` | `number` | `undefined` | *已弃用:* 请改用 `thinking`。思考过程的最大 token 数 |573| `maxThinkingTokens` | `number` | `undefined` | *已弃用:* 请改用 `thinking`。思考过程的最大 token 数 |

574| `maxTurns` | `number` | `undefined` | 最大 agentic 轮次(工具使用往返次数) |574| `maxTurns` | `number` | `undefined` | 最大 agentic 轮次(工具使用往返次数) |

575| `mcpServers` | `Record<string, [`McpServerConfig`](#mcpserverconfig)>` | `{}` | MCP 服务器配置 |575| `mcpServers` | `Record<string, [`McpServerConfig`](#mcpserverconfig)>` | `{}` | MCP 服务器配置 |


631```631```

632 632 

633* `API_TIMEOUT_MS`:Anthropic 客户端上的每请求超时时间,以毫秒为单位。默认值为 `600000`。适用于主循环和所有子代理。633* `API_TIMEOUT_MS`:Anthropic 客户端上的每请求超时时间,以毫秒为单位。默认值为 `600000`。适用于主循环和所有子代理。

634* `CLAUDE_CODE_MAX_RETRIES`:API 最大重试次数。默认值为 `10`,上限为 `15`。每次重试都有自己的 `API_TIMEOUT_MS` 时间窗口,因此最坏情况下的实际耗时约为 `API_TIMEOUT_MS × (CLAUDE_CODE_MAX_RETRIES + 1)` 加上退避时间。对于需要等待较长中断时间的无人值守运行,请设置 [`CLAUDE_CODE_RETRY_WATCHDOG=1`](/docs/zh-CN/errors#tune-retry-behavior):它会无限期重试暂时性容量错误,并且在 Claude Code v2.1.199 或更高版本中,会将其他暂时性错误的默认重试次数提高到 `300`,并取消此变量的上限。634* `CLAUDE_CODE_MAX_RETRIES`:最大 API 重试次数。默认值为 `10`,上限为 `15`。每次重试都有各自的 `API_TIMEOUT_MS` 时间窗口。

635 

636 对于需要挺过较长中断的无人值守运行,请设置 [`CLAUDE_CODE_RETRY_WATCHDOG=1`](/docs/zh-CN/errors#tune-retry-behavior):它会无限期重试临时性容量错误,并且在 Claude Code v2.1.199 或更高版本上,会将其他临时性错误的默认重试次数提高到 `300`,并取消此变量的上限。

635* `CLAUDE_ASYNC_AGENT_STALL_TIMEOUT_MS`:子代理的停滞看门狗。当流看门狗开启时,默认值为 `CLAUDE_STREAM_IDLE_TIMEOUT_MS` 加 5 分钟,除非您调高该变量,否则合计为 `600000`。当流看门狗关闭时,默认值为 `600000`。在 v2.1.257 之前,默认值始终为 `600000`。637* `CLAUDE_ASYNC_AGENT_STALL_TIMEOUT_MS`:子代理的停滞看门狗。当流看门狗开启时,默认值为 `CLAUDE_STREAM_IDLE_TIMEOUT_MS` 加 5 分钟,除非您调高该变量,否则合计为 `600000`。当流看门狗关闭时,默认值为 `600000`。在 v2.1.257 之前,默认值始终为 `600000`。

636 638 

637 每个流事件都会重置计时器。发生停滞时,Claude Code 会中止该子代理并向父级报告停滞。对于后台子代理,它还会将该任务标记为失败并附上任何部分结果。639 每个流事件都会重置计时器。发生停滞时,Claude Code 会中止该子代理并向父级报告停滞。对于后台子代理,它还会将该任务标记为失败并附上任何部分结果。


1561 parent_tool_use_id: string | null;1563 parent_tool_use_id: string | null;

1562 error?: SDKAssistantMessageError;1564 error?: SDKAssistantMessageError;

1563 aborted?: true;1565 aborted?: true;

1566 agent_id?: string;

1564 timestamp?: string;1567 timestamp?: string;

1565 context_usage?: SDKContextUsage;1568 context_usage?: SDKContextUsage;

1566 user_message_uuid?: string;1569 user_message_uuid?: string;


1580 1583 

1581当中断或中止在流完成前截断助手消息时,`aborted` 为 `true`:消息没有 `stop_reason`,内容可能在单词中间结束。该字段在正常完成的消息上不存在。它需要 Agent SDK v0.3.214 或更高版本。1584当中断或中止在流完成前截断助手消息时,`aborted` 为 `true`:消息没有 `stop_reason`,内容可能在单词中间结束。该字段在正常完成的消息上不存在。它需要 Agent SDK v0.3.214 或更高版本。

1582 1585 

1586`agent_id` 标识生成该消息的子代理,主线程消息中不包含此字段。其值等于该子代理的 [`task_started`](#sdktaskstartedmessage) 及其他任务事件上的 `task_id`,并且在子代理被[恢复](/docs/zh-CN/agent-sdk/subagents#resume-subagents)时保持不变。该字段需要 Agent SDK v0.3.292 或更高版本。

1587 

1588请通过 `agent_id` 将子代理的消息与其任务事件进行匹配,而不是将消息的 `parent_tool_use_id` 与任务事件的 `tool_use_id` 配对。当某个工具调用恢复子代理时,任务事件携带的是该调用的 `tool_use_id`,而消息保留的是最初启动该子代理的工具调用的 `parent_tool_use_id`,因此两者不再匹配。

1589 

1583Claude Code 在该轮的第一条助手消息上设置 `user_message_uuid` 和 `user_message_uuids`,条件在 [`user_message_uuid`](#user_message_uuid) 中。当 Claude Code 重新运行被重启中断的轮时,重新运行的携带这些字段的助手消息也携带 [`resume_reason`](#resume_reason)。1590Claude Code 在该轮的第一条助手消息上设置 `user_message_uuid` 和 `user_message_uuids`,条件在 [`user_message_uuid`](#user_message_uuid) 中。当 Claude Code 重新运行被重启中断的轮时,重新运行的携带这些字段的助手消息也携带 [`resume_reason`](#resume_reason)。

1584 1591 

1585`timestamp` 是消息内容在生成它的进程上完成生成的 ISO 8601 时间。该值来自该机器的时钟,因此仅用于显示,不要按它排序消息。一个 API 轮可以产生多条共享 `message.id` 的助手消息,每条都有自己的 `timestamp`。当字段不存在时,回退到您收到消息的时间。1592`timestamp` 是消息内容在生成它的进程上完成生成的 ISO 8601 时间。该值来自该机器的时钟,因此仅用于显示,不要按它排序消息。一个 API 轮可以产生多条共享 `message.id` 的助手消息,每条都有自己的 `timestamp`。当字段不存在时,回退到您收到消息的时间。


1597 type: "user";1604 type: "user";

1598 uuid?: UUID;1605 uuid?: UUID;

1599 session_id?: string;1606 session_id?: string;

1607 agent_id?: string;

1600 message: MessageParam; // From Anthropic SDK1608 message: MessageParam; // From Anthropic SDK

1601 pasted_content?: MessageParam["content"][];1609 pasted_content?: MessageParam["content"][];

1602 parent_tool_use_id: string | null;1610 parent_tool_use_id: string | null;


1636};1644};

1637```1645```

1638 1646 

1647由子代理生成的用户消息(例如其自身某个工具调用的 `tool_result`)会携带 `agent_id`。请参阅 [`SDKAssistantMessage`](#sdkassistantmessage),其中定义了该字段及其版本要求。

1648 

1639在携带 `tool_result` 块的消息上,`tool_use_result` 是工具的结构化输出对象,而不是发送给模型的文本。其结构取决于对应 `tool_use` 块所指定的工具,因此该字段的类型为 `unknown`;内置结构列在[工具输出类型](#tool-output-types)下。以下结果需要超出其所列结构的额外处理:1649在携带 `tool_result` 块的消息上,`tool_use_result` 是工具的结构化输出对象,而不是发送给模型的文本。其结构取决于对应 `tool_use` 块所指定的工具,因此该字段的类型为 `unknown`;内置结构列在[工具输出类型](#tool-output-types)下。以下结果需要超出其所列结构的额外处理:

1640 1650 

1641* `Agent` 工具:`tool_use_result` 为 [`AgentOutput`](#agent-2)。请据此进行渲染,而不是解析 `tool_result` 文本。`completed` 结果的 `content` 包含子代理的报告;对于通过 `SubagentHandback` 工具调用提交报告的子代理,则包含一条关于该交接的简短说明来代替报告。在 Claude Code v2.1.271 或更高版本的[自动模式](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode)下,每个产生 `completed` 结果的子代理都以这种方式报告([fork](/docs/zh-CN/sub-agents#fork-the-current-conversation) 除外),Claude 会以来自子代理的单独消息接收报告。1651* `Agent` 工具:`tool_use_result` 为 [`AgentOutput`](#agent-2)。请据此进行渲染,而不是解析 `tool_result` 文本。`completed` 结果的 `content` 包含子代理的报告;对于通过 `SubagentHandback` 工具调用提交报告的子代理,则包含一条关于该交接的简短说明来代替报告。在 Claude Code v2.1.271 或更高版本的[自动模式](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode)下,每个产生 `completed` 结果的子代理都以这种方式报告([fork](/docs/zh-CN/sub-agents#fork-the-current-conversation) 除外),Claude 会以来自子代理的单独消息接收报告。


1992 `SDKPartialAssistantMessage`2002 `SDKPartialAssistantMessage`

1993</h3>2003</h3>

1994 2004 

1995流式部分消息(仅当 `includePartialMessages` 为 true 时)。`parent_tool_use_id` 字段始终为 `null`:流事件仅为主会话发出。对于子代理归因,使用完整消息,它们携带 `parent_tool_use_id`,或启用 [`forwardSubagentText`](#options) 以接收子代理文本和思考作为完整消息。2005流式部分消息(仅当 `includePartialMessages` 为 true 时)。

2006 

2007`parent_tool_use_id` 字段始终为 `null`:流事件仅针对主会话发出。要进行子代理归属,请使用完整消息(它们携带 [`agent_id`](#sdkassistantmessage) 和 `parent_tool_use_id`),或启用 [`forwardSubagentText`](#options) 以完整消息的形式接收子代理的文本和思考内容。

1996 2008 

1997```typescript theme={null}2009```typescript theme={null}

1998type SDKPartialAssistantMessage = {2010type SDKPartialAssistantMessage = {


3416type WebFetchInput = {3428type WebFetchInput = {

3417 url: string;3429 url: string;

3418 prompt: string;3430 prompt: string;

3431 offset?: number;

3419};3432};

3420```3433```

3421 3434 

3422从 URL 获取内容并使用 AI 模型处理它。3435从 URL 获取内容并使用 AI 模型处理它。

3423 3436 

3437`offset` 是从页面开头跳过的字符数。Claude 设置它以继续读取较长的页面。该字段需要 Agent SDK v0.3.290 或更高版本。

3438 

3424<h3 id="websearch">3439<h3 id="websearch">

3425 WebSearch3440 WebSearch

3426</h3>3441</h3>


5775 task_type?: string;5790 task_type?: string;

5776 is_backgrounded?: boolean;5791 is_backgrounded?: boolean;

5777 spawn_depth?: number;5792 spawn_depth?: number;

5793 parent_task_id?: string;

5778 ambient?: boolean;5794 ambient?: boolean;

5779 uuid: UUID;5795 uuid: UUID;

5780 session_id: string;5796 session_id: string;


5792 5808 

5793[恢复的子代理](/docs/zh-CN/agent-sdk/subagents#resume-subagents)始终报告 `is_backgrounded: true`,因为 Claude Code 会在后台运行每个恢复的子代理。当前台任务稍后移到后台时,Claude Code 会在 [`task_updated`](#sdktaskupdatedmessage) 消息中报告新的 `is_backgrounded` 值,而不是发送第二条 `task_started`。5809[恢复的子代理](/docs/zh-CN/agent-sdk/subagents#resume-subagents)始终报告 `is_backgrounded: true`,因为 Claude Code 会在后台运行每个恢复的子代理。当前台任务稍后移到后台时,Claude Code 会在 [`task_updated`](#sdktaskupdatedmessage) 消息中报告新的 `is_backgrounded` 值,而不是发送第二条 `task_started`。

5794 5810 

5811`parent_task_id` 保存启动此任务的子代理的 `task_id`。使用它将每个任务归组到启动它的子代理之下。Claude Code 会在子代理、Bash 和 [Monitor](#monitor) 任务上设置它。该字段需要 Agent SDK v0.3.292 或更高版本。在以下情况下该字段不存在:

5812 

5813* 任务由主线程启动

5814* Claude Code 不再跟踪父任务

5815* 任务由 [teammate](/docs/zh-CN/agent-teams) 或工作流中的 Agent 启动

5816 

5817父任务可能是前台任务,也可能是已经结束的任务,因此请将无法识别的 ID 视为没有父任务。

5818 

5795<h3 id="sdktaskprogressmessage">5819<h3 id="sdktaskprogressmessage">

5796 `SDKTaskProgressMessage`5820 `SDKTaskProgressMessage`

5797</h3>5821</h3>


5848 `SDKBackgroundTasksChangedMessage`5872 `SDKBackgroundTasksChangedMessage`

5849</h3>5873</h3>

5850 5874 

5851每当活动后台任务集合发生变化时发出:任务启动、完成、被终止、前台 Agent 被移到后台,或任务的 `description` 或 `ambient` 字段发生变化。5875每当活动后台任务集合发生变化时发出:任务启动、完成、被终止、前台 Agent 被移到后台,或任务的 `description`、`ambient` 或 `parent_task_id` 字段发生变化。有关每个条目上的 `parent_task_id` 字段,请参阅 [`SDKTaskStartedMessage`](#sdktaskstartedmessage),其中定义了该字段及其版本要求。

5852 5876 

5853`tasks` 数组是完整的活动集合。请用每次的负载替换任何缓存的集合,而不是对 `task_started` 和 `task_notification` 事件进行配对,这样下一次成员变化就会纠正您错过的任何事件。5877`tasks` 数组是完整的活动集合。请用每次的负载替换任何缓存的集合,而不是对 `task_started` 和 `task_notification` 事件进行配对,这样下一次成员变化就会纠正您错过的任何事件。

5854 5878 

5855相对于这些逐任务事件的顺序是未指定的,因此不要将这两个流相互关联。5879当任务结束时,其 [`task_updated`](#sdktaskupdatedmessage) 和 [`task_notification`](#sdktasknotificationmessage) 会先于将其从列表中移除的 `background_tasks_changed` 到达。除此之外,相对于这些逐任务事件的顺序是未指定的。

5856 5880 

5857启动时不会发出任何内容。每当会话的 CLI 进程启动或重启时,请重置为空集合,并由下一次成员变化重新填充。5881启动时不会发出任何内容。每当会话的 CLI 进程启动或重启时,请重置为空集合,并由下一次成员变化重新填充。

5858 5882 


5869 task_type: string;5893 task_type: string;

5870 subagent_type?: string;5894 subagent_type?: string;

5871 description: string;5895 description: string;

5896 parent_task_id?: string;

5872 ambient?: boolean;5897 ambient?: boolean;

5873 }[];5898 }[];

5874 uuid: UUID;5899 uuid: UUID;

Details

36 ```36 ```

37 37 

38 ```typescript TypeScript theme={null}38 ```typescript TypeScript theme={null}

39 async function handleToolRequest(toolName, input, options) {39 import type { CanUseTool } from "@anthropic-ai/claude-agent-sdk";

40 

41 const handleToolRequest: CanUseTool = async (toolName, input, options) => {

40 // options includes { signal: AbortSignal, suggestions?: PermissionUpdate[] }42 // options includes { signal: AbortSignal, suggestions?: PermissionUpdate[] }

41 // 提示用户并返回允许或拒绝43 // 在此提示用户,然后返回允许或拒绝

42 }44 return { behavior: "deny", message: "User declined" };

45 };

43 46 

44 const options = { canUseTool: handleToolRequest };47 const options = { canUseTool: handleToolRequest };

45 ```48 ```


440 // 在您的工具列表中包含 AskUserQuestion443 // 在您的工具列表中包含 AskUserQuestion

441 tools: ["Read", "Glob", "Grep", "AskUserQuestion"],444 tools: ["Read", "Glob", "Grep", "AskUserQuestion"],

442 canUseTool: async (toolName, input) => {445 canUseTool: async (toolName, input) => {

443 // 在此处处理澄清问题446 // 批准每次调用的占位实现。"检测 AskUserQuestion"步骤会替换它。

447 return { behavior: "allow", updatedInput: input };

444 }448 }

445 }449 }

446 })) {450 })) {


763 767 

764 ```typescript TypeScript theme={null}768 ```typescript TypeScript theme={null}

765 import { query } from "@anthropic-ai/claude-agent-sdk";769 import { query } from "@anthropic-ai/claude-agent-sdk";

770 import type { PermissionResult } from "@anthropic-ai/claude-agent-sdk";

766 import * as readline from "readline/promises";771 import * as readline from "readline/promises";

767 772 

768 // 帮助程序在终端中提示用户输入773 // 帮助程序在终端中提示用户输入


783 }788 }

784 789 

785 // 显示 Claude 的问题并收集用户答案790 // 显示 Claude 的问题并收集用户答案

786 async function handleAskUserQuestion(input: any) {791 async function handleAskUserQuestion(input: any): Promise<PermissionResult> {

787 const answers: Record<string, string> = {};792 const answers: Record<string, string> = {};

788 793 

789 for (const q of input.questions) {794 for (const q of input.questions) {

agent-view.md +9 −6

Details

603 603 

604在 git 仓库外,会话直接写入工作目录,彼此之间不隔离,因此请避免分派会编辑相同文件的并行会话。如果您使用其他版本控制系统,请配置 [`WorktreeCreate` hook](/docs/zh-CN/worktrees#non-git-version-control),Claude 会以与 git 相同的方式隔离编辑。604在 git 仓库外,会话直接写入工作目录,彼此之间不隔离,因此请避免分派会编辑相同文件的并行会话。如果您使用其他版本控制系统,请配置 [`WorktreeCreate` hook](/docs/zh-CN/worktrees#non-git-version-control),Claude 会以与 git 相同的方式隔离编辑。

605 605 

606当 hook 在非 git 仓库的目录中失败时,Claude 会跳过该目录的隔离,并就地编辑工作目录。在 git 仓库内,Claude 在编辑前会将其移入 worktree 的会话,在该移动完成之前无法编辑共享检出中的文件。606当 hook 在非 git 仓库的目录中失败时,Claude 会跳过该目录的隔离,并就地编辑工作目录。在 git 仓库内,Claude 在编辑前会将其移入 worktree 的会话,在该移动完成之前无法对共享检出使用 `Edit`、`Write` 或 `NotebookEdit` 工具。

607 607 

608要查找会话的 worktree 路径,请附加到会话并查看其工作目录。608要查找会话的 worktree 路径,请附加到会话并查看其工作目录。

609 609 


825| `claude daemon logs` | 跟踪 supervisor 的日志文件 [`~/.claude/daemon.log`](#where-state-is-stored),在新行到达时将其打印出来,直到您按下 `Ctrl+C` |825| `claude daemon logs` | 跟踪 supervisor 的日志文件 [`~/.claude/daemon.log`](#where-state-is-stored),在新行到达时将其打印出来,直到您按下 `Ctrl+C` |

826| `claude daemon stop --any` | 停止 supervisor 进程及其托管的后台会话。传递 `--keep-workers` 以保持后台会话运行,以便下一个 supervisor 重新连接到它们。下一个 `claude agents` 或 `claude --bg` 启动一个新的 supervisor |826| `claude daemon stop --any` | 停止 supervisor 进程及其托管的后台会话。传递 `--keep-workers` 以保持后台会话运行,以便下一个 supervisor 重新连接到它们。下一个 `claude agents` 或 `claude --bg` 启动一个新的 supervisor |

827 827 

828`claude attach` 和 `claude logs` 可以使用运行中会话名称的一部分代替 ID,例如 `claude logs "auth refactor"`。传递名称需要 Claude Code v2.1.290 或更高版本。828`claude attach` 和 `claude logs` 可以使用会话名称的一部分代替 ID,例如 `claude logs "auth refactor"`。传递名称需要 Claude Code v2.1.290 或更高版本。

829 829 

830<h3 id="list-sessions-as-json">830<h3 id="list-sessions-as-json">

831 将会话列为 JSON831 将会话列为 JSON


979 打开会话说它没有保存的会话记录979 打开会话说它没有保存的会话记录

980</h3>980</h3>

981 981 

982已停止的会话[从另一个对话后台处理](#from-inside-a-session)并在其第一个回复完成之前停止,没有任何可恢复的内容:在该第一个回复完成之前,对话仍然只存在于它被后台处理的会话中。`claude attach` 拒绝打开它,显示 `This session has no saved transcript`。982当您打开一个[从另一个对话后台处理](#from-inside-a-session)的会话,且该会话在运行自己的轮次之前就已停止时,Claude Code 会恢复那个对话。如果 Claude Code 找不到该对话,则会拒绝打开该会话:

983 983 

984在 Agent 视图中,打开该行会在列表下显示 `Press enter again to restart this session fresh`。在同一行上再次按 `Enter` 来使用空对话重新启动会话,或从 shell 运行 `claude respawn <id>`。984* `claude attach` 打印 `This session has no saved transcript`。

985* Agent 视图在列表下方显示 `Press enter again to restart this session fresh`。

985 986 

986原始对话完整无损;使用 `claude --resume` 恢复它或继续在其中工作。有关详细信息,请参阅[错误参考](/docs/zh-CN/errors#this-session-has-no-saved-transcript)。987在同一行上再次按 `Enter` 来使用空对话重新启动会话,或从 shell 运行 `claude respawn <id>`。

988 

989有关详细信息,请参阅[错误参考](/docs/zh-CN/errors#this-session-has-no-saved-transcript)。

987 990 

988<h3 id="the-terminal-host-died-or-the-session-stopped-responding">991<h3 id="the-terminal-host-died-or-the-session-stopped-responding">

989 终端主机已死亡或会话停止响应992 终端主机已死亡或会话停止响应


1095 1098 

1096| 版本 | 更改 |1099| 版本 | 更改 |

1097| - | - |1100| - | - |

1098| v2.1.290 | [`claude attach` 和 `claude logs`](#manage-sessions-from-the-shell) 可以使用正在运行的会话名称的一部分来代替 ID。 |1101| v2.1.290 | [`claude attach` 和 `claude logs`](#manage-sessions-from-the-shell) 可以使用会话名称的一部分来代替 ID。 |

1099| v2.1.290 | `/model`、`/effort`、`/rename` 和 `/usage` 作为[窥视回复](#peek-and-reply)发送给正在工作的会话时会立即运行。 |1102| v2.1.290 | `/model`、`/effort`、`/rename` 和 `/usage` 作为[窥视回复](#peek-and-reply)发送给正在工作的会话时会立即运行。 |

1100| v2.1.290 | 无法投递的[窥视回复](#peek-and-reply)如果以 `/` 开头,或者在会话进程运行期间回答的是带有预定义选项的问题,则不再被保存以待下次重启时发送。 |1103| v2.1.290 | 无法投递的[窥视回复](#peek-and-reply)如果以 `/` 开头,或者在会话进程运行期间回答的是带有预定义选项的问题,则不再被保存以待下次重启时发送。 |

1101| v2.1.288 | `Ctrl+F` 按名称查找会话,`Alt+↑` / `Alt+↓` 在组标题之间跳转。这两者以及 `Ctrl+R` 都可以[重新绑定](/docs/zh-CN/keybindings#agents-actions)。 |1104| v2.1.288 | `Ctrl+F` 按名称查找会话,`Alt+↑` / `Alt+↓` 在组标题之间跳转。这两者以及 `Ctrl+R` 都可以[重新绑定](/docs/zh-CN/keybindings#agents-actions)。 |

Details

1237 1237 

1238CLI 将指标、日志和(启用时)跟踪发送到网关,网关将它们逐字中继到每个配置的目的地。导出使用 OpenTelemetry Protocol (OTLP) over HTTP。要跳过中继并让会话直接导出到您的收集器,[在策略中命名收集器](#export-directly-to-your-collector)。请参阅[监控使用](/docs/zh-CN/monitoring-usage)了解 CLI 发出的指标和事件。1238CLI 将指标、日志和(启用时)跟踪发送到网关,网关将它们逐字中继到每个配置的目的地。导出使用 OpenTelemetry Protocol (OTLP) over HTTP。要跳过中继并让会话直接导出到您的收集器,[在策略中命名收集器](#export-directly-to-your-collector)。请参阅[监控使用](/docs/zh-CN/monitoring-usage)了解 CLI 发出的指标和事件。

1239 1239 

1240在通过 `/login` 登录的会话中,CLI 使用从网关颁发的 JWT 读取的已认证用户的身份为每个导出加盖时间戳:`user.id`、`user.email` 和 `user.groups` 属性。每个开发者的成本和使用归因因此无需开发者端配置即可工作。1240在通过 `/login` 登录的会话中,CLI 使用从网关颁发的 JWT 读取的已认证用户的身份为每个导出加盖时间戳:`user.id`、`user.email` 和 `user.groups` 属性。每个开发者的成本和使用归因因此无需开发者端配置即可工作。Claude Code 在开发者登录之前记录的事件[不携带此身份](/docs/zh-CN/monitoring-usage#standard-attributes)。

1241 1241 

1242[Claude Desktop](#claude-desktop-overlay) 和通过网关登录的 Cowork 会话使用 `user.email` 和 `user.groups` 以及 `enduser.id` 为其遥测加盖时间戳,因此您可以使用一个关于 `user.email` 或 `user.groups` 的查询覆盖终端、Desktop 和 Cowork 使用。`user.groups` 是逗号分隔的 IdP 组列表。1242[Claude Desktop](#claude-desktop-overlay) 和通过网关登录的 Cowork 会话使用 `user.email` 和 `user.groups` 以及 `enduser.id` 为其遥测加盖时间戳,因此您可以使用一个关于 `user.email` 或 `user.groups` 的查询覆盖终端、Desktop 和 Cowork 使用。`user.groups` 是逗号分隔的 IdP 组列表。

1243 1243 

Details

516 遥测516 遥测

517</h2>517</h2>

518 518 

519网关为您提供每个开发者的使用指标,无需任何每台机器的 OTEL 配置。Claude Code 发出 OpenTelemetry (OTLP) 指标、日志和可选的跟踪;[监控使用情况](/docs/zh-CN/monitoring-usage)涵盖了 CLI 报告的所有内容。在通过 `/login` 登录的会话中,CLI 使用经过身份验证的 IdP 身份属性 `user.id`、`user.email` 和 `user.groups` 为每个导出加盖时间戳,因此使用情况按开发者汇总。519网关为您提供每个开发者的使用指标,无需任何每台机器的 OTEL 配置。Claude Code 发出 OpenTelemetry (OTLP) 指标、日志和可选的跟踪;[监控使用情况](/docs/zh-CN/monitoring-usage)涵盖了 CLI 报告的所有内容。在通过 `/login` 登录的会话中,CLI 使用经过身份验证的 IdP 身份属性 `user.id`、`user.email` 和 `user.groups` [标记每个导出](/docs/zh-CN/monitoring-usage#standard-attributes),因此使用情况按开发者汇总。

520 520 

521网关本身是一个经过身份验证的 OTLP 中继。将 [`telemetry.forward_to`](/docs/zh-CN/claude-apps-gateway-config#telemetry) 与 `listen.public_url` 一起设置,它会将 OTEL 导出器设置推送到每个连接的客户端,并将其 OTLP 流量逐字转发到您列出的每个目标。每个目标独立选择指标、日志和跟踪,默认仅为指标;有关每个信号字段及其敏感性权衡,请参阅 [`telemetry` 参考](/docs/zh-CN/claude-apps-gateway-config#telemetry)。网关不缓冲、聚合或存储遥测数据,因此数据最终的位置完全由收集器的导出器配置决定。521网关本身是一个经过身份验证的 OTLP 中继。将 [`telemetry.forward_to`](/docs/zh-CN/claude-apps-gateway-config#telemetry) 与 `listen.public_url` 一起设置,它会将 OTEL 导出器设置推送到每个连接的客户端,并将其 OTLP 流量逐字转发到您列出的每个目标。每个目标独立选择指标、日志和跟踪,默认仅为指标;有关每个信号字段及其敏感性权衡,请参阅 [`telemetry` 参考](/docs/zh-CN/claude-apps-gateway-config#telemetry)。网关不缓冲、聚合或存储遥测数据,因此数据最终的位置完全由收集器的导出器配置决定。

522 522 

Details

483从 [claude.ai/code](https://claude.ai/code) 重新打开会话以预配新的 VM:483从 [claude.ai/code](https://claude.ai/code) 重新打开会话以预配新的 VM:

484 484 

485* **会恢复**:您的对话历史485* **会恢复**:您的对话历史

486* **不会恢复**:VM 被回收时仍在运行的后台工作,例如子代理和 shell 命令486* **不会恢复**:VM 被回收时仍在运行的后台工作,例如子代理和 shell 命令,以及[自定节奏的 `/loop`](/docs/zh-CN/scheduled-tasks#let-claude-choose-the-interval) 中待执行的唤醒。要重新启动该循环,请再次运行 `/loop`。

487 487 

488<h2 id="limitations">488<h2 id="limitations">

489 限制489 限制

Details

489* **例程**:当您在项目中要求计划工作时,Claude 创建一个[例程](/docs/zh-CN/routines),作为该项目中的线程运行,并出现在其 **Routines** 标签页上。您在项目外创建的例程继续自己工作。489* **例程**:当您在项目中要求计划工作时,Claude 创建一个[例程](/docs/zh-CN/routines),作为该项目中的线程运行,并出现在其 **Routines** 标签页上。您在项目外创建的例程继续自己工作。

490* **Remote Control**:[Remote Control](/docs/zh-CN/remote-control) 连接 claude.ai 到在您的机器上运行的 Claude Code 会话。当您在项目中要求 Claude 在您的计算机上运行线程时,项目[使用 Remote Control 来执行](#run-a-thread-on-your-own-computer)。490* **Remote Control**:[Remote Control](/docs/zh-CN/remote-control) 连接 claude.ai 到在您的机器上运行的 Claude Code 会话。当您在项目中要求 Claude 在您的计算机上运行线程时,项目[使用 Remote Control 来执行](#run-a-thread-on-your-own-computer)。

491* **本地会话和代理视图**:您在终端、IDE 或桌面应用的本地环境中启动的会话不能添加到项目中。[代理视图](/docs/zh-CN/agent-view)是用于跟踪多个本地会话并排的屏幕,您仍然启动每个会话并自己给它分配任务。491* **本地会话和代理视图**:您在终端、IDE 或桌面应用的本地环境中启动的会话不能添加到项目中。[代理视图](/docs/zh-CN/agent-view)是用于跟踪多个本地会话并排的屏幕,您仍然启动每个会话并自己给它分配任务。

492* **Worktrees**:一个[worktree](/docs/zh-CN/worktrees)为每个本地会话提供其自己的代码库工作副本,因此您机器上的并行会话不会相互覆盖。云线程不需要它们:每个线程将其代码库克隆到其自己的云沙箱中,并在其自己的分支上工作。492* **Worktrees**:一个 [worktree](/docs/zh-CN/worktrees) 为每个本地会话提供其自己的仓库工作副本。云线程不需要它们:每个线程将其仓库克隆到其自己的云沙箱中,并在其自己的分支上工作。

493* **代理团队**:一个[代理团队](/docs/zh-CN/agent-teams)是一个会话,为单个任务启动队友会话,在您的机器上或在云会话内,并以该任务结束。493* **代理团队**:一个[代理团队](/docs/zh-CN/agent-teams)是一个会话,为单个任务启动队友会话,在您的机器上或在云会话内,并以该任务结束。

494* **Subagents**:一个[subagent](/docs/zh-CN/sub-agents)在一个会话内运行,在其自己的上下文窗口中执行一个辅助任务,并向该会话返回摘要。项目的线程是 Claude 启动的整个会话,向项目对话报告,一个线程仍然可以为其自己的辅助任务使用 subagents。494* **Subagents**:一个[subagent](/docs/zh-CN/sub-agents)在一个会话内运行,在其自己的上下文窗口中执行一个辅助任务,并向该会话返回摘要。项目的线程是 Claude 启动的整个会话,向项目对话报告,一个线程仍然可以为其自己的辅助任务使用 subagents。

495* **claude.ai 聊天和 Cowork 中的 Projects**:[早期的 Projects 体验](https://support.claude.com/en/articles/9517075-what-are-projects),对对话和参考文件进行分组,没有线程或协调员。这些项目继续按照今天的方式工作,直到重新设计的体验到达它们。495* **claude.ai 聊天和 Cowork 中的 Projects**:[早期的 Projects 体验](https://support.claude.com/en/articles/9517075-what-are-projects),对对话和参考文件进行分组,没有线程或协调员。这些项目继续按照今天的方式工作,直到重新设计的体验到达它们。

Details

28| `claude auth logout` | 从您的 Anthropic 账户登出 | `claude auth logout` |28| `claude auth logout` | 从您的 Anthropic 账户登出 | `claude auth logout` |

29| `claude auth status` | 以 JSON 格式显示身份验证状态。使用 `--text` 获取人类可读的输出。如果已登录,则以代码 0 退出,如果未登录,则以代码 1 退出。JSON 包含一个 `configDirectory` 字段,命名 CLI 使用的 [配置目录](/docs/zh-CN/claude-directory)。该字段需要 Claude Code v2.1.268 或更高版本。JSON 的 `authMethod` 字段取值为 `none`、`claude.ai`、`oauth_token`、`api_key`、`api_key_helper` 或 `third_party` 之一 | `claude auth status` |29| `claude auth status` | 以 JSON 格式显示身份验证状态。使用 `--text` 获取人类可读的输出。如果已登录,则以代码 0 退出,如果未登录,则以代码 1 退出。JSON 包含一个 `configDirectory` 字段,命名 CLI 使用的 [配置目录](/docs/zh-CN/claude-directory)。该字段需要 Claude Code v2.1.268 或更高版本。JSON 的 `authMethod` 字段取值为 `none`、`claude.ai`、`oauth_token`、`api_key`、`api_key_helper` 或 `third_party` 之一 | `claude auth status` |

30| `claude agents` | 打开 [agent view](/docs/zh-CN/agent-view) 以监控和分派并行后台会话。使用 `--cwd <path>` 仅显示在该目录下启动的会话,或使用 `--json` 将活动会话打印为 JSON 数组以供脚本使用(`--json --all` 也包括已完成的后台会话)。传递 `--permission-mode`、`--model`、`--effort` 或 `--agent` 以设置 [分派会话的默认值](/docs/zh-CN/agent-view#permission-mode-model-and-effort)。接受 `--settings`、`--add-dir`、`--plugin-dir` 和 `--mcp-config`,如顶级 `claude` 命令。打开 agent view 需要交互式终端 | `claude agents --json` |30| `claude agents` | 打开 [agent view](/docs/zh-CN/agent-view) 以监控和分派并行后台会话。使用 `--cwd <path>` 仅显示在该目录下启动的会话,或使用 `--json` 将活动会话打印为 JSON 数组以供脚本使用(`--json --all` 也包括已完成的后台会话)。传递 `--permission-mode`、`--model`、`--effort` 或 `--agent` 以设置 [分派会话的默认值](/docs/zh-CN/agent-view#permission-mode-model-and-effort)。接受 `--settings`、`--add-dir`、`--plugin-dir` 和 `--mcp-config`,如顶级 `claude` 命令。打开 agent view 需要交互式终端 | `claude agents --json` |

31| `claude attach <id\|name>` | 在此终端中附加到 [后台会话](/docs/zh-CN/agent-view#manage-sessions-from-the-shell)。传递正在运行的会话名称的一部分来代替 ID 需要 Claude Code v2.1.290 或更高版本 | `claude attach 7c5dcf5d` |31| `claude attach <id\|name>` | 在此终端中附加到 [后台会话](/docs/zh-CN/agent-view#manage-sessions-from-the-shell)。传递会话名称的一部分来代替 ID 需要 Claude Code v2.1.290 或更高版本 | `claude attach 7c5dcf5d` |

32| `claude auto-mode defaults` | 以 JSON 格式打印内置 [自动模式](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode) 分类器规则。使用 `claude auto-mode config` 查看应用了设置的有效配置。`--label <prefix>` 仅打印标签以该前缀开头的规则,不区分大小写匹配。需要 Claude Code v2.1.208 或更高版本 | `claude auto-mode defaults --label 'Git Destructive'` |32| `claude auto-mode defaults` | 以 JSON 格式打印内置 [自动模式](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode) 分类器规则。使用 `claude auto-mode config` 查看应用了设置的有效配置。`--label <prefix>` 仅打印标签以该前缀开头的规则,不区分大小写匹配。需要 Claude Code v2.1.208 或更高版本 | `claude auto-mode defaults --label 'Git Destructive'` |

33| `claude auto-mode reset` | 通过从用户设置文件中删除 `autoMode` 部分来恢复默认 [自动模式](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode) 配置。在写入前提示确认;传递 `-y`/`--yes` 以跳过提示。来自 [托管设置](/docs/zh-CN/server-managed-settings) 或 `--settings` 标志的规则仍然适用。需要 Claude Code v2.1.212 或更高版本。请参阅 [检查默认值和您的有效配置](/docs/zh-CN/auto-mode-config#inspect-the-defaults-and-your-effective-config) | `claude auto-mode reset --yes` |33| `claude auto-mode reset` | 通过从用户设置文件中删除 `autoMode` 部分来恢复默认 [自动模式](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode) 配置。在写入前提示确认;传递 `-y`/`--yes` 以跳过提示。来自 [托管设置](/docs/zh-CN/server-managed-settings) 或 `--settings` 标志的规则仍然适用。需要 Claude Code v2.1.212 或更高版本。请参阅 [检查默认值和您的有效配置](/docs/zh-CN/auto-mode-config#inspect-the-defaults-and-your-effective-config) | `claude auto-mode reset --yes` |

34| `claude daemon logs` | 跟踪后台会话 [supervisor](/docs/zh-CN/agent-view#the-supervisor-process) 的日志文件 `~/.claude/daemon.log`,在新行到达时将其打印出来,直到您按下 `Ctrl+C` | `claude daemon logs` |34| `claude daemon logs` | 跟踪后台会话 [supervisor](/docs/zh-CN/agent-view#the-supervisor-process) 的日志文件 `~/.claude/daemon.log`,在新行到达时将其打印出来,直到您按下 `Ctrl+C` | `claude daemon logs` |


37| `claude daemon stop --any` | 停止后台会话 [supervisor](/docs/zh-CN/agent-view#the-supervisor-process) 及其托管的会话。传递 `--keep-workers` 以保持后台会话运行,以便下一个 supervisor 重新连接到它们。`--any` 确认停止按需 supervisor,这是默认值。使用此命令从 [无响应的 supervisor](/docs/zh-CN/agent-view#agent-view-says-the-background-service-did-not-respond) 恢复 | `claude daemon stop --any --keep-workers` |37| `claude daemon stop --any` | 停止后台会话 [supervisor](/docs/zh-CN/agent-view#the-supervisor-process) 及其托管的会话。传递 `--keep-workers` 以保持后台会话运行,以便下一个 supervisor 重新连接到它们。`--any` 确认停止按需 supervisor,这是默认值。使用此命令从 [无响应的 supervisor](/docs/zh-CN/agent-view#agent-view-says-the-background-service-did-not-respond) 恢复 | `claude daemon stop --any --keep-workers` |

38| `claude doctor` | 从终端打印只读安装和设置诊断,无需启动会话,包括安装健康状况、设置文件验证错误和 Remote Control 资格。对于可以应用修复的会话内设置检查,请运行 [`/doctor`](/docs/zh-CN/commands#all-commands) | `claude doctor` |38| `claude doctor` | 从终端打印只读安装和设置诊断,无需启动会话,包括安装健康状况、设置文件验证错误和 Remote Control 资格。对于可以应用修复的会话内设置检查,请运行 [`/doctor`](/docs/zh-CN/commands#all-commands) | `claude doctor` |

39| `claude import [source]` | 启动交互式会话,运行 [`/import`](/docs/zh-CN/commands#all-commands) 以将来自其他编码 Agent 的配置引入 Claude Code。接受与命令相同的 `--dry-run` 和 `--yes` 选项。在 Amazon Bedrock、Google Cloud 的 Agent Platform、Microsoft Foundry 或 AWS 上的 Claude Platform 上不可用。当您关闭 [功能标志获取](/docs/zh-CN/env-vars#features-that-need-feature-flag-fetching) 时也不可用。需要 Claude Code v2.1.213 或更高版本 | `claude import codex --dry-run` |39| `claude import [source]` | 启动交互式会话,运行 [`/import`](/docs/zh-CN/commands#all-commands) 以将来自其他编码 Agent 的配置引入 Claude Code。接受与命令相同的 `--dry-run` 和 `--yes` 选项。在 Amazon Bedrock、Google Cloud 的 Agent Platform、Microsoft Foundry 或 AWS 上的 Claude Platform 上不可用。当您关闭 [功能标志获取](/docs/zh-CN/env-vars#features-that-need-feature-flag-fetching) 时也不可用。需要 Claude Code v2.1.213 或更高版本 | `claude import codex --dry-run` |

40| `claude logs <id\|name>` | 从 [后台会话](/docs/zh-CN/agent-view#manage-sessions-from-the-shell) 打印最近的输出。传递正在运行的会话名称的一部分来代替 ID 需要 Claude Code v2.1.290 或更高版本 | `claude logs 7c5dcf5d` |40| `claude logs <id\|name>` | 从 [后台会话](/docs/zh-CN/agent-view#manage-sessions-from-the-shell) 打印最近的输出。传递会话名称的一部分来代替 ID 需要 Claude Code v2.1.290 或更高版本 | `claude logs 7c5dcf5d` |

41| `claude mcp` | 配置 Model Context Protocol (MCP) 服务器 | 请参阅 [Claude Code MCP 文档](/docs/zh-CN/mcp)。 |41| `claude mcp` | 配置 Model Context Protocol (MCP) 服务器 | 请参阅 [Claude Code MCP 文档](/docs/zh-CN/mcp)。 |

42| `claude mcp login <name>` | 运行配置的 MCP 服务器的 OAuth 流程而不打开交互式 `/mcp` 面板。适用于 HTTP、SSE 和 claude.ai 连接器服务器。在 SSH 上添加 `--no-browser` 以打印授权 URL 而不是打开浏览器,然后在提示处粘贴重定向 URL。请参阅 [从命令行进行身份验证](/docs/zh-CN/mcp#authenticate-from-the-command-line) | `claude mcp login sentry` |42| `claude mcp login <name>` | 运行配置的 MCP 服务器的 OAuth 流程而不打开交互式 `/mcp` 面板。适用于 HTTP、SSE 和 claude.ai 连接器服务器。在 SSH 上添加 `--no-browser` 以打印授权 URL 而不是打开浏览器,然后在提示处粘贴重定向 URL。请参阅 [从命令行进行身份验证](/docs/zh-CN/mcp#authenticate-from-the-command-line) | `claude mcp login sentry` |

43| `claude mcp logout <name>` | 清除 MCP 服务器的存储 OAuth 凭据 | `claude mcp logout sentry` |43| `claude mcp logout <name>` | 清除 MCP 服务器的存储 OAuth 凭据 | `claude mcp logout sentry` |


106| `--input-format` | 为 print 模式指定输入格式(选项:`text`、`stream-json`) | `claude -p --output-format json --input-format stream-json` |106| `--input-format` | 为 print 模式指定输入格式(选项:`text`、`stream-json`) | `claude -p --output-format json --input-format stream-json` |

107| `--json-schema` | 在 Agent 完成其工作流后获得与 JSON Schema 匹配的经过验证的 JSON 输出(仅限 print 模式)。请参阅[结构化输出](/docs/zh-CN/agent-sdk/structured-outputs)。Claude Code 在 schema 无效时以错误退出,并接受 `format` 关键字作为注释而不进行客户端验证 | `claude -p --json-schema '{"type":"object","properties":{...}}' "query"` |107| `--json-schema` | 在 Agent 完成其工作流后获得与 JSON Schema 匹配的经过验证的 JSON 输出(仅限 print 模式)。请参阅[结构化输出](/docs/zh-CN/agent-sdk/structured-outputs)。Claude Code 在 schema 无效时以错误退出,并接受 `format` 关键字作为注释而不进行客户端验证 | `claude -p --json-schema '{"type":"object","properties":{...}}' "query"` |

108| `--maintenance` | 在会话之前使用 `maintenance` 匹配器运行 [Setup hook](/docs/zh-CN/hooks#setup)(仅限 print 模式) | `claude -p --maintenance "query"` |108| `--maintenance` | 在会话之前使用 `maintenance` 匹配器运行 [Setup hook](/docs/zh-CN/hooks#setup)(仅限 print 模式) | `claude -p --maintenance "query"` |

109| `--max-budget-usd` | 在停止之前在 API 调用上花费的最大美元金额(仅限 print 模式)。Claude Code 根据其[客户端成本估算](/docs/zh-CN/agent-sdk/cost-tracking#estimates-not-billing)检查上限,该估算可能与您的账单不同。来自[子代理](/docs/zh-CN/sub-agents)的支出计入上限。当您使用 `--continue` 或 `--resume` 返回对话时,[从早期运行恢复的](/docs/zh-CN/agent-sdk/cost-tracking#accumulate-costs-across-multiple-calls)总数不计入上限。一旦支出达到上限,生成另一个子代理会失败并显示 `Budget limit reached`,Claude Code 会停止仍在运行的后台子代理;上限执行行为需要 Claude Code v2.1.217 或更高版本 | `claude -p --max-budget-usd 5.00 "query"` |109| `--max-budget-usd` | 一旦 API 调用的估算支出达到此金额,即停止运行(仅限 print 模式)。Claude Code 根据其[客户端成本估算](/docs/zh-CN/agent-sdk/cost-tracking#estimates-not-billing)检查上限,该估算可能与您的账单不同。来自[子代理](/docs/zh-CN/sub-agents)的支出计入上限。支出可能超过上限,因此请[预留余量](/docs/zh-CN/agent-sdk/agent-loop#budget-headroom)。当您使用 `--continue` 或 `--resume` 返回对话时,[从早期运行恢复的](/docs/zh-CN/agent-sdk/cost-tracking#accumulate-costs-across-multiple-calls)总数不计入上限。一旦支出达到上限,生成另一个子代理会失败并显示 `Budget limit reached`,Claude Code 会停止仍在运行的后台子代理;上限执行行为需要 Claude Code v2.1.217 或更高版本 | `claude -p --max-budget-usd 5.00 "query"` |

110| `--max-turns` | 限制 Agent 轮次数(仅限 print 模式)。达到限制时以错误退出。默认无限制。使用 `--input-format stream-json` 时,当限制结束某一轮次时仍在排队的消息会保持排队,并以其自己的限制启动新轮次 | `claude -p --max-turns 3 "query"` |110| `--max-turns` | 限制 Agent 轮次数(仅限 print 模式)。达到限制时以错误退出。默认无限制。使用 `--input-format stream-json` 时,当限制结束某一轮次时仍在排队的消息会保持排队,并以其自己的限制启动新轮次 | `claude -p --max-turns 3 "query"` |

111| `--mcp-config` | 从 JSON 文件或字符串加载 MCP 服务器(空格分隔)。当您使用 `-p` 传递此标志时,Claude Code 在运行第一轮之前等待仍待处理的服务器连接,最多等待 [`MCP_TIMEOUT`](/docs/zh-CN/env-vars) 启动超时时间,默认 30 秒;具有[缓存工具列表](/docs/zh-CN/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-CN/env-vars) 启动超时时间,默认 30 秒;具有[缓存工具列表](/docs/zh-CN/mcp#managing-your-servers)的服务器跳过等待并在首次使用时连接。等待需要 Claude Code v2.1.221 或更高版本 | `claude --mcp-config ./mcp.json` |

112| `--model` | 使用[模型别名](/docs/zh-CN/model-config#model-aliases)(如 `sonnet`、`opus`、`haiku` 或 `fable`)或模型的完整名称为当前会话设置模型。覆盖 [`model`](/docs/zh-CN/settings-reference#model) 设置和 [`ANTHROPIC_MODEL`](/docs/zh-CN/model-config#environment-variables) | `claude --model claude-sonnet-5` |112| `--model` | 使用[模型别名](/docs/zh-CN/model-config#model-aliases)(如 `sonnet`、`opus`、`haiku` 或 `fable`)或模型的完整名称为当前会话设置模型。覆盖 [`model`](/docs/zh-CN/settings-reference#model) 设置和 [`ANTHROPIC_MODEL`](/docs/zh-CN/model-config#environment-variables) | `claude --model claude-sonnet-5` |

Details

307| | 在云端会话中可用 | 原因 |307| | 在云端会话中可用 | 原因 |

308| :- | :- | :- |308| :- | :- | :- |

309| 您的仓库的 `CLAUDE.md` | 是 | 克隆的一部分 |309| 您的仓库的 `CLAUDE.md` | 是 | 克隆的一部分 |

310| 您的仓库的 `.claude/settings.json` hook 和权限规则 | 是,在具有一个仓库的会话中 | 克隆的一部分。具有多个仓库的会话(包括[项目](/docs/zh-CN/claude-projects#what-threads-pick-up-from-your-repositories)线程)在克隆上方启动,不读取它们 |310| 您的仓库的 `.claude/settings.json` hook 和权限规则 | 是,在具有一个仓库的会话中 | 克隆的一部分。对于具有多个仓库的会话,请参阅[它读取哪些设置](/docs/zh-CN/settings#settings-in-cloud-sessions) |

311| 您的仓库的 `.mcp.json` MCP 服务器 | 是,在具有一个仓库的会话中 | 克隆的一部分,从会话的工作目录中找到 |311| 您的仓库的 `.mcp.json` MCP 服务器 | 是,在具有一个仓库的会话中 | 克隆的一部分,从会话的工作目录中找到。对于自托管环境,请参阅[哪个仓库的设置适用](/docs/zh-CN/self-hosted-environments-configuration#repository-settings-in-sessions-with-several-repositories) |

312| 您的仓库的 `.claude/rules/` | 是 | 克隆的一部分 |312| 您的仓库的 `.claude/rules/` | 是 | 克隆的一部分 |

313| 您的仓库的 `.claude/skills/`、`.claude/agents/`、`.claude/commands/` | 是 | 克隆的一部分 |313| 您的仓库的 `.claude/skills/`、`.claude/agents/`、`.claude/commands/` | 是 | 克隆的一部分 |

314| 在您的仓库的 `.claude/settings.json` 中声明的插件和市场 | 否 | 云端会话不会安装仓库在 [`enabledPlugins`](/docs/zh-CN/settings-reference#enabledplugins) 下启用的插件,包括来自它在 [`extraKnownMarketplaces`](/docs/zh-CN/settings-reference#extraknownmarketplaces) 下列出的市场的插件 |314| 在您的仓库的 `.claude/settings.json` 中声明的插件和市场 | 否 | 云端会话不会安装仓库在 [`enabledPlugins`](/docs/zh-CN/settings-reference#enabledplugins) 下启用的插件,包括来自它在 [`extraKnownMarketplaces`](/docs/zh-CN/settings-reference#extraknownmarketplaces) 下列出的市场的插件 |


575 575 

576SessionStart hooks 在云端的行为与本地相同,但有以下注意事项:576SessionStart hooks 在云端的行为与本地相同,但有以下注意事项:

577 577 

578* **每个会话一个存储库**:具有多个存储库的会话不会从任何存储库的 `.claude/settings.json` 加载 hooks,因此您在那里定义的 SessionStart hook 不会运行。请改为使用[设置脚本](#setup-scripts)为这些会话安装依赖项。578* **每个会话一个仓库**:在 Anthropic 托管环境中,具有多个仓库的会话不会从任何仓库的 `.claude/settings.json` 加载 hook,因此您在那里定义的 SessionStart hook 不会运行。请改为使用[设置脚本](#setup-scripts)为这些会话安装依赖项。对于自托管环境,请参阅[适用哪个仓库的设置](/docs/zh-CN/self-hosted-environments-configuration#repository-settings-in-sessions-with-several-repositories)。

579* **没有仅云端的范围**:hooks 在本地和云会话中都运行。要跳过本地运行,请在 `CLAUDE_CODE_REMOTE` 环境变量不为 `true` 时提前退出,就像[依赖项安装脚本](#install-dependencies-with-a-sessionstart-hook)所做的那样。579* **没有仅云端的范围**:hooks 在本地和云会话中都运行。要跳过本地运行,请在 `CLAUDE_CODE_REMOTE` 环境变量不为 `true` 时提前退出,就像[依赖项安装脚本](#install-dependencies-with-a-sessionstart-hook)所做的那样。

580* **需要网络访问**:安装命令需要连接到包注册表。如果您的环境使用 **None** 网络访问,这些 hooks 会失败。**Trusted** 下的[默认允许列表](#default-allowed-domains)涵盖 npm、PyPI、RubyGems 和 crates.io。580* **需要网络访问**:安装命令需要连接到包注册表。如果您的环境使用 **None** 网络访问,这些 hooks 会失败。**Trusted** 下的[默认允许列表](#default-allowed-domains)涵盖 npm、PyPI、RubyGems 和 crates.io。

581* **代理兼容性**:在 Anthropic 托管环境中,所有出站流量都经过[安全代理](#security-proxy),某些包管理器无法与此代理正确配合工作;Bun 是一个已知的例子。在[自托管环境](/docs/zh-CN/self-hosted-environments-deploy#default-deny-egress)中,出站流量改为经过您自己的网络边界。581* **代理兼容性**:在 Anthropic 托管环境中,所有出站流量都经过[安全代理](#security-proxy),某些包管理器无法与此代理正确配合工作;Bun 是一个已知的例子。在[自托管环境](/docs/zh-CN/self-hosted-environments-deploy#default-deny-egress)中,出站流量改为经过您自己的网络边界。

desktop.md +1 −1

Details

396 使用会话并行工作396 使用会话并行工作

397</h3>397</h3>

398 398 

399点击侧边栏中的 **+ New session**,或在 macOS 上按 **Cmd+N**、在 Windows 上按 **Ctrl+N**,即可并行处理多个任务。按 **Ctrl+Tab** 和 **Ctrl+Shift+Tab** 可在侧边栏中循环切换会话。对于 Git 仓库,选择分支名称旁边的 **worktree** 选项,即可使用 [Git worktrees](/docs/zh-CN/worktrees) 为会话提供项目的独立隔离副本,这样一个会话中的更改在您提交之前不会影响其他会话。399点击侧边栏中的 **+ New session**,或在 macOS 上按 **Cmd+N**、在 Windows 上按 **Ctrl+N**,即可并行处理多个任务。按 **Ctrl+Tab** 和 **Ctrl+Shift+Tab** 可在侧边栏中循环切换会话。对于 Git 仓库,选择分支名称旁边的 **worktree** 选项,即可使用 [Git worktrees](/docs/zh-CN/worktrees) 为会话提供项目的独立隔离副本。

400 400 

401要同时查看两个会话,请在 macOS 上按住 **Cmd** 或在 Windows 上按住 **Ctrl** 并点击侧边栏中的会话。该会话会在第二个窗格中打开,与您已打开的会话并排显示。分屏处于活跃状态时,点击侧边栏中的另一个会话会替换当前具有焦点的窗格。在 macOS 上按 **Cmd+\\** 或在 Windows 上按 **Ctrl+\\** 可关闭具有焦点的窗格并返回单个会话。401要同时查看两个会话,请在 macOS 上按住 **Cmd** 或在 Windows 上按住 **Ctrl** 并点击侧边栏中的会话。该会话会在第二个窗格中打开,与您已打开的会话并排显示。分屏处于活跃状态时,点击侧边栏中的另一个会话会替换当前具有焦点的窗格。在 macOS 上按 **Cmd+\\** 或在 Windows 上按 **Ctrl+\\** 可关闭具有焦点的窗格并返回单个会话。

402 402 

env-vars.md +2 −2

Details

204| `CLAUDE_AFK_TIMEOUT_MS` | 未回答的 [`AskUserQuestion`](/docs/zh-CN/tools-reference) 对话框在空闲多少毫秒后无需您参与即自动继续。自动继续默认关闭;可通过 [`askUserQuestionTimeout`](/docs/zh-CN/settings-reference#askuserquestiontimeout) 设置选择启用。此变量是用于演示和自动化测试的覆盖项:设置后,它优先于该设置,即使该设置未设置或为 `never`,也会启用自动继续。设置为 `0` 不会关闭超时,而是会立即关闭对话框。在[项目和本地设置](/docs/zh-CN/settings-reference#variables-claude-code-ignores-in-env)中会被忽略。在 v2.1.200 之前,自动继续默认启用,超时时间为 `60000`(60 秒)。需要 Claude Code v2.1.198 或更高版本 |204| `CLAUDE_AFK_TIMEOUT_MS` | 未回答的 [`AskUserQuestion`](/docs/zh-CN/tools-reference) 对话框在空闲多少毫秒后无需您参与即自动继续。自动继续默认关闭;可通过 [`askUserQuestionTimeout`](/docs/zh-CN/settings-reference#askuserquestiontimeout) 设置选择启用。此变量是用于演示和自动化测试的覆盖项:设置后,它优先于该设置,即使该设置未设置或为 `never`,也会启用自动继续。设置为 `0` 不会关闭超时,而是会立即关闭对话框。在[项目和本地设置](/docs/zh-CN/settings-reference#variables-claude-code-ignores-in-env)中会被忽略。在 v2.1.200 之前,自动继续默认启用,超时时间为 `60000`(60 秒)。需要 Claude Code v2.1.198 或更高版本 |

205| `CLAUDE_AGENT_SDK_DISABLE_BUILTIN_AGENTS` | 设置为 `1` 可禁用所有内置[子代理](/docs/zh-CN/sub-agents)类型,例如 Explore 和 Plan。仅适用于非交互模式(`-p` 标志)。适用于希望从空白状态开始的 SDK 用户。这还会移除 `general-purpose`,即 Agent 工具调用省略 `subagent_type` 时 Claude Code 运行的子代理。此后此类调用会失败并报错 [`subagent_type is required`](/docs/zh-CN/errors#subagent-type-is-required) |205| `CLAUDE_AGENT_SDK_DISABLE_BUILTIN_AGENTS` | 设置为 `1` 可禁用所有内置[子代理](/docs/zh-CN/sub-agents)类型,例如 Explore 和 Plan。仅适用于非交互模式(`-p` 标志)。适用于希望从空白状态开始的 SDK 用户。这还会移除 `general-purpose`,即 Agent 工具调用省略 `subagent_type` 时 Claude Code 运行的子代理。此后此类调用会失败并报错 [`subagent_type is required`](/docs/zh-CN/errors#subagent-type-is-required) |

206| `CLAUDE_AGENT_SDK_MCP_NO_PREFIX` | 设置为 `1` 可跳过 SDK 创建的 MCP 服务器中工具名称的 `mcp__<server>__` 前缀。工具使用其原始名称。仅限 SDK 使用 |206| `CLAUDE_AGENT_SDK_MCP_NO_PREFIX` | 设置为 `1` 可跳过 SDK 创建的 MCP 服务器中工具名称的 `mcp__<server>__` 前缀。工具使用其原始名称。仅限 SDK 使用 |

207| `CLAUDE_ASYNC_AGENT_STALL_TIMEOUT_MS` | 子代理的停滞超时时间,以毫秒为单位。默认值为 `600000`(10 分钟);如果您在流式监视器启用时提高了 `CLAUDE_STREAM_IDLE_TIMEOUT_MS`,默认值也会随之提高,详见[处理缓慢或停滞的 API 响应](/docs/zh-CN/agent-sdk/typescript#handle-slow-or-stalled-api-responses)。计时器会在每个流式进度事件时重置;如果在该时间窗口内没有进度到达,Claude Code 会中止该子代理并向父级报告停滞 |207| `CLAUDE_ASYNC_AGENT_STALL_TIMEOUT_MS` | 子代理的停滞超时时间,以毫秒为单位。在 Claude Code v2.1.286 或更高版本上还涵盖[工作流 Agent](/docs/zh-CN/workflows#when-an-agent-stalls-and-restarts)。默认 `600000`(10 分钟);如果您在流式监视器启用时调高了 `CLAUDE_STREAM_IDLE_TIMEOUT_MS`,默认值也会随之提高,如[处理缓慢或停滞的 API 响应](/docs/zh-CN/agent-sdk/typescript#handle-slow-or-stalled-api-responses)所述 |

208| `CLAUDE_AUTOCOMPACT_PCT_OVERRIDE` | 设置触发自动压缩时自动压缩窗口的百分比(1-100)。使用较低的值(如 `50`)可以更早压缩;该变量无法提高阈值,因此高于默认百分比的值会被忽略。它仅适用于[在达到模型上下文限制之前进行压缩](/docs/zh-CN/model-config#context-window-and-auto-compaction)的会话。同时适用于主对话和子代理 |208| `CLAUDE_AUTOCOMPACT_PCT_OVERRIDE` | 设置触发自动压缩时自动压缩窗口的百分比(1-100)。使用较低的值(如 `50`)可以更早压缩;该变量无法提高阈值,因此高于默认百分比的值会被忽略。它仅适用于[在达到模型上下文限制之前进行压缩](/docs/zh-CN/model-config#context-window-and-auto-compaction)的会话。同时适用于主对话和子代理 |

209| `CLAUDE_AUTO_BACKGROUND_TASKS` | 设置为 `1` 可强制启用长时间运行的 Agent 任务的自动后台化。启用后,子代理运行约两分钟后会被移至后台。在 Claude Code v2.1.212 或更高版本中,还会在非交互模式下启用[长时间 MCP 工具调用的自动后台化](/docs/zh-CN/mcp#automatic-backgrounding-of-long-tool-calls) |209| `CLAUDE_AUTO_BACKGROUND_TASKS` | 设置为 `1` 可强制启用长时间运行的 Agent 任务的自动后台化。启用后,子代理运行约两分钟后会被移至后台。在 Claude Code v2.1.212 或更高版本中,还会在非交互模式下启用[长时间 MCP 工具调用的自动后台化](/docs/zh-CN/mcp#automatic-backgrounding-of-long-tool-calls) |

210| `CLAUDE_AX_PREPARK_MS` | 在[屏幕阅读器模式](/docs/zh-CN/accessibility)下,Claude Code 在写入新行或已更改的行之前等待的毫秒数。默认值为 `0`,因此 Claude Code 不会等待。在 v2.1.287 之前,默认值为 `50`。Claude Code 将等待上限设为 `5000`。需要 Claude Code v2.1.233 或更高版本 |210| `CLAUDE_AX_PREPARK_MS` | 在[屏幕阅读器模式](/docs/zh-CN/accessibility)下,Claude Code 在写入新行或已更改的行之前等待的毫秒数。默认值为 `0`,因此 Claude Code 不会等待。在 v2.1.287 之前,默认值为 `50`。Claude Code 将等待上限设为 `5000`。需要 Claude Code v2.1.233 或更高版本 |


378| `CLAUDE_CODE_RESUME_INTERRUPTED_TURN_MAX_AGE_MS` | 对于在轮次中途结束的会话,恢复时自动继续所允许的最后一条会话记录消息的最大时长(毫秒)。当最后一条消息早于此界限时,Claude Code 会跳过 `CLAUDE_CODE_RESUME_INTERRUPTED_TURN` 自动恢复及其 `CLAUDE_CODE_RESUME_PROMPT` 继续消息,会话以空闲状态启动,由您显式继续。未设置或为 `0` 表示无界限,但最后一个请求因 API 错误而失败的轮次仅在该错误发生不到六小时时才会恢复。正值会限制所有轮次,包括上述轮次;负值或非数字值会应用一小时的界限。长时间运行的 Agent 的启动脚本可以设置此项,以免针对旧会话记录重启时重新运行过时的提示词。当 Claude Code 重启一个从交互式会话继承对话的已崩溃 [agent view](/docs/zh-CN/agent-view) 会话时,会自行设置一小时的界限。需要 Claude Code v2.1.211 或更高版本 |378| `CLAUDE_CODE_RESUME_INTERRUPTED_TURN_MAX_AGE_MS` | 对于在轮次中途结束的会话,恢复时自动继续所允许的最后一条会话记录消息的最大时长(毫秒)。当最后一条消息早于此界限时,Claude Code 会跳过 `CLAUDE_CODE_RESUME_INTERRUPTED_TURN` 自动恢复及其 `CLAUDE_CODE_RESUME_PROMPT` 继续消息,会话以空闲状态启动,由您显式继续。未设置或为 `0` 表示无界限,但最后一个请求因 API 错误而失败的轮次仅在该错误发生不到六小时时才会恢复。正值会限制所有轮次,包括上述轮次;负值或非数字值会应用一小时的界限。长时间运行的 Agent 的启动脚本可以设置此项,以免针对旧会话记录重启时重新运行过时的提示词。当 Claude Code 重启一个从交互式会话继承对话的已崩溃 [agent view](/docs/zh-CN/agent-view) 会话时,会自行设置一小时的界限。需要 Claude Code v2.1.211 或更高版本 |

379| `CLAUDE_CODE_RESUME_PROMPT` | 覆盖 Claude Code 发送给 Claude 的继续消息,适用于 `CLAUDE_CODE_RESUME_INTERRUPTED_TURN` 继续被中断的轮次而不是重新发送其提示词时,或您使用 `-p` 恢复[延迟的工具调用](/docs/zh-CN/hooks#defer-a-tool-call-for-later)时。默认为 `Continue from where you left off.`。空字符串会使用默认值 |379| `CLAUDE_CODE_RESUME_PROMPT` | 覆盖 Claude Code 发送给 Claude 的继续消息,适用于 `CLAUDE_CODE_RESUME_INTERRUPTED_TURN` 继续被中断的轮次而不是重新发送其提示词时,或您使用 `-p` 恢复[延迟的工具调用](/docs/zh-CN/hooks#defer-a-tool-call-for-later)时。默认为 `Continue from where you left off.`。空字符串会使用默认值 |

380| `CLAUDE_CODE_RETRY_WATCHDOG` | 对于评估框架、CI 作业或远程工作器等无人值守会话,请设置为 `1`。会无限期重试 `429` 和 `529` 容量错误,而不是在 `CLAUDE_CODE_MAX_RETRIES` 次尝试后失败。当标准速度请求收到报告支出限额或使用额度耗尽的 `429` 时,Claude Code 会立即失败,即使它来自按计划重置的[网关支出上限](/docs/zh-CN/errors#spend-limit-reached)。在 v2.1.239 之前,watchdog 会无限期重试这些错误。对于快速模式请求,请参阅[处理速率限制](/docs/zh-CN/fast-mode#handle-rate-limits)。watchdog 在两次尝试之间最多退避 5 分钟,或者当响应包含速率限制重置时间时等到限制重置,因此遇到用量限制的会话会等待剩余的时间窗口结束。在 v2.1.199 或更高版本上,它还会将其他瞬态错误(例如服务器错误、超时和连接断开)的默认重试次数提高到 300,约合三小时的退避时间,并在您显式设置 `CLAUDE_CODE_MAX_RETRIES` 时移除其 15 次的上限。需要 Claude Code v2.1.186 或更高版本 |380| `CLAUDE_CODE_RETRY_WATCHDOG` | 对于评估框架、CI 作业或远程工作器等无人值守会话,请设置为 `1`。会无限期重试 `429` 和 `529` 容量错误,而不是在 `CLAUDE_CODE_MAX_RETRIES` 次尝试后失败。当标准速度请求收到报告支出限额或使用额度耗尽的 `429` 时,Claude Code 会立即失败,即使它来自按计划重置的[网关支出上限](/docs/zh-CN/errors#spend-limit-reached)。在 v2.1.239 之前,watchdog 会无限期重试这些错误。对于快速模式请求,请参阅[处理速率限制](/docs/zh-CN/fast-mode#handle-rate-limits)。watchdog 在两次尝试之间最多退避 5 分钟,或者当响应包含速率限制重置时间时等到限制重置,因此遇到用量限制的会话会等待剩余的时间窗口结束。在 v2.1.199 或更高版本上,它还会将其他瞬态错误(例如服务器错误、超时和连接断开)的默认重试次数提高到 300,约合三小时的退避时间,并在您显式设置 `CLAUDE_CODE_MAX_RETRIES` 时移除其 15 次的上限。需要 Claude Code v2.1.186 或更高版本 |

381| `CLAUDE_CODE_RETRY_WATCHDOG_MAX_WAIT_MS` | 设置 `CLAUDE_CODE_RETRY_WATCHDOG` 时,每个 API 请求等待 `429` 和 `529` 错误消退所花费的最长时间(毫秒)。用完该时间后,下一个此类错误将结束该请求。请以纯数字给出正整数,例如 `1800000` 表示 30 分钟。未设置时,等待没有限制。需要 Claude Code v2.1.295 或更高版本 |

381| `CLAUDE_CODE_SAFE_MODE` | 设置为 `1` 可在安全模式下启动:CLAUDE.md、skill、插件、hook、MCP 服务器、自定义命令和 Agent、输出样式、工作流、自定义主题、自定义快捷键、状态栏和文件建议命令、LSP 服务器以及自动记忆均不会加载,用于对损坏的配置进行故障排除。托管设置策略仍然适用,包括策略配置的 hook、状态栏和文件建议命令;托管插件、托管 skill、托管 CLAUDE.md 和策略配置的 MCP 服务器则不会加载。等同于传递 [`--safe-mode`](/docs/zh-CN/cli-reference#cli-flags)。直接生成的子进程会继承该变量 |382| `CLAUDE_CODE_SAFE_MODE` | 设置为 `1` 可在安全模式下启动:CLAUDE.md、skill、插件、hook、MCP 服务器、自定义命令和 Agent、输出样式、工作流、自定义主题、自定义快捷键、状态栏和文件建议命令、LSP 服务器以及自动记忆均不会加载,用于对损坏的配置进行故障排除。托管设置策略仍然适用,包括策略配置的 hook、状态栏和文件建议命令;托管插件、托管 skill、托管 CLAUDE.md 和策略配置的 MCP 服务器则不会加载。等同于传递 [`--safe-mode`](/docs/zh-CN/cli-reference#cli-flags)。直接生成的子进程会继承该变量 |

382| `CLAUDE_CODE_SCRIPT_CAPS` | 当设置了 `CLAUDE_CODE_SUBPROCESS_ENV_SCRUB` 时,用于限制特定脚本在每个会话中可被调用次数的 JSON 对象。键是与命令文本匹配的子字符串;值是整数调用上限。例如,`{"deploy.sh": 2}` 允许 `deploy.sh` 最多被调用两次。匹配基于子字符串,因此 `./scripts/deploy.sh $(evil)` 之类的 shell 展开技巧仍会计入上限。不会检测通过 `xargs` 或 `find -exec` 进行的运行时扇出;这是一项纵深防御控制 |383| `CLAUDE_CODE_SCRIPT_CAPS` | 当设置了 `CLAUDE_CODE_SUBPROCESS_ENV_SCRUB` 时,用于限制特定脚本在每个会话中可被调用次数的 JSON 对象。键是与命令文本匹配的子字符串;值是整数调用上限。例如,`{"deploy.sh": 2}` 允许 `deploy.sh` 最多被调用两次。匹配基于子字符串,因此 `./scripts/deploy.sh $(evil)` 之类的 shell 展开技巧仍会计入上限。不会检测通过 `xargs` 或 `find -exec` 进行的运行时扇出;这是一项纵深防御控制 |

383| `CLAUDE_CODE_SCROLL_SPEED` | 设置[全屏渲染](/docs/zh-CN/fullscreen#mouse-wheel-scrolling)中的鼠标滚轮滚动倍数。接受不超过 20 的任意正值,包括低于 1 的小数值(例如 `0.5`),以便在已放大滚轮事件的终端中减慢加速的触控板和滚轮滚动。如果您的终端每格发送一个滚轮事件且不进行放大,请设置为 `3` 以与 `vim` 保持一致。在 JetBrains IDE 终端中会被忽略,Claude Code 在那里使用自己的滚动处理 |384| `CLAUDE_CODE_SCROLL_SPEED` | 设置[全屏渲染](/docs/zh-CN/fullscreen#mouse-wheel-scrolling)中的鼠标滚轮滚动倍数。接受不超过 20 的任意正值,包括低于 1 的小数值(例如 `0.5`),以便在已放大滚轮事件的终端中减慢加速的触控板和滚轮滚动。如果您的终端每格发送一个滚轮事件且不进行放大,请设置为 `3` 以与 `vim` 保持一致。在 JetBrains IDE 终端中会被忽略,Claude Code 在那里使用自己的滚动处理 |


590* 使用 [advisor 工具](/docs/zh-CN/advisor#requirements)591* 使用 [advisor 工具](/docs/zh-CN/advisor#requirements)

591* 阅读或回复 [Artifact 上的评论](/docs/zh-CN/artifacts#collect-comments-on-an-artifact)592* 阅读或回复 [Artifact 上的评论](/docs/zh-CN/artifacts#collect-comments-on-an-artifact)

592* 让 Claude 读取[其他组织的公开 Artifact](/docs/zh-CN/artifacts#read-an-artifact-shared-with-you)593* 让 Claude 读取[其他组织的公开 Artifact](/docs/zh-CN/artifacts#read-an-artifact-shared-with-you)

593* 让 Claude Code 针对 [MCP 协议修订版 2026-07-28](/docs/zh-CN/mcp#mcp-client-runtimes) 探测 claude.ai 连接器服务器,除非您设置了 `MCP_PROTOCOL_NEGOTIATION=auto`

594* 在安装了 Git Bash 的 Windows 上,为 claude.ai 和 Console 账户默认获得 [PowerShell 工具](/docs/zh-CN/tools-reference#powershell-tool);除非您设置了 `CLAUDE_CODE_USE_POWERSHELL_TOOL=1`,否则 Claude Code 会通过 Git Bash 执行 shell 命令。在未安装 Git Bash 的 Windows 上,该工具保持启用594* 在安装了 Git Bash 的 Windows 上,为 claude.ai 和 Console 账户默认获得 [PowerShell 工具](/docs/zh-CN/tools-reference#powershell-tool);除非您设置了 `CLAUDE_CODE_USE_POWERSHELL_TOOL=1`,否则 Claude Code 会通过 Git Bash 执行 shell 命令。在未安装 Git Bash 的 Windows 上,该工具保持启用

595* 获得 [Claude 起草的反馈](/docs/zh-CN/tools-reference#sendfeedback-tool-behavior),该功能由 Claude Code 通过获取的标志启用595* 获得 [Claude 起草的反馈](/docs/zh-CN/tools-reference#sendfeedback-tool-behavior),该功能由 Claude Code 通过获取的标志启用

596* 让 Claude [将大段粘贴内容视为粘贴而非键入的文本](/docs/zh-CN/terminal-config#how-claude-treats-pasted-text);`[Pasted text #N]` 占位符背后的内容将以无标记形式传给 Claude596* 让 Claude [将大段粘贴内容视为粘贴而非键入的文本](/docs/zh-CN/terminal-config#how-claude-treats-pasted-text);`[Pasted text #N]` 占位符背后的内容将以无标记形式传给 Claude

errors.md +7 −5

Details

261| `Marketplace name impersonates an official Anthropic/Claude marketplace` | [Plugin 错误](#claude-code-refuses-the-marketplace-name) |261| `Marketplace name impersonates an official Anthropic/Claude marketplace` | [Plugin 错误](#claude-code-refuses-the-marketplace-name) |

262| `Marketplace "<name>" is already added from a different source` | [Plugin 错误](#marketplace-is-already-added-from-a-different-source) |262| `Marketplace "<name>" is already added from a different source` | [Plugin 错误](#marketplace-is-already-added-from-a-different-source) |

263| `"<name>" is another spelling of "<reserved>", a reserved marketplace name` | [Plugin 错误](#marketplace-name-is-another-spelling-of-a-reserved-name) |263| `"<name>" is another spelling of "<reserved>", a reserved marketplace name` | [Plugin 错误](#marketplace-name-is-another-spelling-of-a-reserved-name) |

264| `Cannot add marketplace "<name>": Claude Code cannot install plugins from a marketplace with this name` | [Plugin 故障排除](/docs/zh-CN/plugins/troubleshooting#cannot-install-plugins-from-a-marketplace-with-this-name) |

264| `Marketplace "<name>" is added but ignored` | [Plugin 故障排除](/docs/zh-CN/plugins/troubleshooting#marketplace-is-added-but-ignored) |265| `Marketplace "<name>" is added but ignored` | [Plugin 故障排除](/docs/zh-CN/plugins/troubleshooting#marketplace-is-added-but-ignored) |

265| `Marketplace "<name>" is registered but was refused (see the debug log)` | [Plugin 故障排除](/docs/zh-CN/plugins/troubleshooting#marketplace-is-added-but-ignored) |266| `Marketplace "<name>" is registered but was refused (see the debug log)` | [Plugin 故障排除](/docs/zh-CN/plugins/troubleshooting#marketplace-is-added-but-ignored) |

266| `references ${user_config.*} in a shell-form command` | [Plugin 错误](#plugin-command-references-user-config) |267| `references ${user_config.*} in a shell-form command` | [Plugin 错误](#plugin-command-references-user-config) |


269| `Plugin archive integrity check failed` | [Plugin 错误](#plugin-archive-integrity-check-failed) |270| `Plugin archive integrity check failed` | [Plugin 错误](#plugin-archive-integrity-check-failed) |

270| `An npm plugin source must name a registry package` | [Plugin 故障排除](/docs/zh-CN/plugins/troubleshooting#an-npm-plugin-source-must-name-a-registry-package) |271| `An npm plugin source must name a registry package` | [Plugin 故障排除](/docs/zh-CN/plugins/troubleshooting#an-npm-plugin-source-must-name-a-registry-package) |

271| `The packages it lists are not installed` / `The packages it lists were not installed, because` | [Plugin 故障排除](/docs/zh-CN/plugins/troubleshooting#the-packages-it-lists-are-not-installed) |272| `The packages it lists are not installed` / `The packages it lists were not installed, because` | [Plugin 故障排除](/docs/zh-CN/plugins/troubleshooting#the-packages-it-lists-are-not-installed) |

273| `does not load (...), so Claude Code ignores the whole file` | [Plugin 故障排除](/docs/zh-CN/plugins/troubleshooting#does-not-load-so-claude-code-ignores-the-whole-file) |

272| `path escapes plugin directory` | [Plugin 错误](#path-escapes-plugin-directory) |274| `path escapes plugin directory` | [Plugin 错误](#path-escapes-plugin-directory) |

273| `path could not be checked` | [Plugin 错误](#path-could-not-be-checked) |275| `path could not be checked` | [Plugin 错误](#path-could-not-be-checked) |

274| `its marketplace entry path does not stay inside the marketplace directory` | [Plugin 错误](#marketplace-entry-path-does-not-stay-inside-the-marketplace-directory) |276| `its marketplace entry path does not stay inside the marketplace directory` | [Plugin 错误](#marketplace-entry-path-does-not-stay-inside-the-marketplace-directory) |


279| `"<plugin>" was not uninstalled: it is still switched on in <file>` | [Plugin 错误](#plugin-was-not-uninstalled) |281| `"<plugin>" was not uninstalled: it is still switched on in <file>` | [Plugin 错误](#plugin-was-not-uninstalled) |

280| `"<plugin>" was not uninstalled: <file> is there and could not be read` | [Plugin 错误](#plugin-was-not-uninstalled) |282| `"<plugin>" was not uninstalled: <file> is there and could not be read` | [Plugin 错误](#plugin-was-not-uninstalled) |

281| `Plugin "<plugin>" was not uninstalled: installed_plugins.json` | [Plugin 故障排除](/docs/zh-CN/plugins/troubleshooting#installed-plugins-json-holds-a-record-this-version-cannot-read) |283| `Plugin "<plugin>" was not uninstalled: installed_plugins.json` | [Plugin 故障排除](/docs/zh-CN/plugins/troubleshooting#installed-plugins-json-holds-a-record-this-version-cannot-read) |

284| `Plugin directory does not exist: <path>` | [Plugin 故障排除](/docs/zh-CN/plugins/troubleshooting#plugin-directory-does-not-exist) |

282| `Error: No such tool available: <tool name>` | [工具错误](#no-such-tool-available) |285| `Error: No such tool available: <tool name>` | [工具错误](#no-such-tool-available) |

283| `would be spawned with zero tools — refusing` | [工具错误](#agent-would-be-spawned-with-zero-tools) |286| `would be spawned with zero tools — refusing` | [工具错误](#agent-would-be-spawned-with-zero-tools) |

284| `File is covered by a Read deny rule in your permission settings` | [工具错误](#file-is-covered-by-a-read-deny-rule) |287| `File is covered by a Read deny rule in your permission settings` | [工具错误](#file-is-covered-by-a-read-deny-rule) |


386* 在 Claude 完成思考之后、但在开始任何文本或工具调用之前到达的服务器错误或过载响应。Claude Code 会在该点重试服务器错误最多两次。在 v2.1.284 之前,Claude Code 会在该点以该错误结束轮次。389* 在 Claude 完成思考之后、但在开始任何文本或工具调用之前到达的服务器错误或过载响应。Claude Code 会在该点重试服务器错误最多两次。在 v2.1.284 之前,Claude Code 会在该点以该错误结束轮次。

387* 连接断开。当连接在请求过程中途断开,且 Claude 尚未完成其响应的任何部分(包括其思考过程)时,Claude Code 会使用相同的退避重新发送请求,轮次继续进行,即使某些文本已经开始流式传输。当连接在 Claude 完成思考之后但在开始任何文本或工具调用之前断开时,Claude Code 改为快速连续重新发送请求最多两次,如果连接在该点继续断开,则以 `Connection lost before a response was produced` 结束轮次。390* 连接断开。当连接在请求过程中途断开,且 Claude 尚未完成其响应的任何部分(包括其思考过程)时,Claude Code 会使用相同的退避重新发送请求,轮次继续进行,即使某些文本已经开始流式传输。当连接在 Claude 完成思考之后但在开始任何文本或工具调用之前断开时,Claude Code 改为快速连续重新发送请求最多两次,如果连接在该点继续断开,则以 `Connection lost before a response was produced` 结束轮次。

388* Claude Code 检测到的连接在您的计算机进入睡眠状态时在请求过程中途被破坏。Claude Code 将其计为上述规则下的断开连接;一旦重试标签命名了具体原因,它会读作 `Connection lost while your computer was asleep`,如果轮次在 Claude 完成思考之后但在任何文本或工具调用之前结束,消息会读作 `Your computer went to sleep before a response was produced`。391* Claude Code 检测到的连接在您的计算机进入睡眠状态时在请求过程中途被破坏。Claude Code 将其计为上述规则下的断开连接;一旦重试标签命名了具体原因,它会读作 `Connection lost while your computer was asleep`,如果轮次在 Claude 完成思考之后但在任何文本或工具调用之前结束,消息会读作 `Your computer went to sleep before a response was produced`。

389* 停滞的响应流,当响应头已到达但 Claude 响应的任何部分都未到达,或当 Claude 完成思考但尚未开始任何文本或工具调用时:Claude Code 中止停滞连接并最多重新发送一次请求,不计入上述 10 次尝试预算。如果响应在 Claude 完成思考之后但在任何文本或工具调用之前第二次停滞,Claude Code 以 `The response stalled before a response was produced` 结束轮次。392* 停滞的响应流,当响应头已到达但 Claude 响应的任何部分都未到达,或当 Claude 完成思考但尚未开始任何文本或工具调用时:Claude Code 中止停滞连接,并最多再以流式方式发送一次请求。如果响应在 Claude 完成思考之后但在任何文本或工具调用之前第二次停滞,Claude Code 以 `The response stalled before a response was produced` 结束轮次。

390* 流式请求 API 从未用响应头回答,在 [first-byte deadline runs](/docs/zh-CN/network-config#streaming-idle-watchdogs) 的连接上:Claude Code 在截止时间中止它,并在重试预算内每个模型请求最多重新发送一次,然后如果该尝试也未得到回答,则以 [No response from API](#no-response-from-api) 结束轮次。在其他连接上,请求等待 `API_TIMEOUT_MS`。当您设置 `CLAUDE_CODE_RETRY_WATCHDOG` 时,一次重试上限不适用。393* 流式请求 API 从未用响应头回答,在 [first-byte deadline runs](/docs/zh-CN/network-config#streaming-idle-watchdogs) 的连接上:Claude Code 在截止时间中止它,并在重试预算内每个模型请求最多重新发送一次,然后如果该尝试也未得到回答,则以 [No response from API](#no-response-from-api) 结束轮次。在其他连接上,请求等待 `API_TIMEOUT_MS`。当您设置 `CLAUDE_CODE_RETRY_WATCHDOG` 时,一次重试上限不适用。

391* 在 Claude 完成思考或开始任何文本或工具调用之前,被 API 输出内容过滤器拦截的流式响应。Claude Code 会在重试预算内重新发送一次请求,如果过滤器也拦截了第二次响应,则显示 [Output blocked by content filtering policy](#output-blocked-by-content-filtering-policy)。394* 在 Claude 完成思考或开始任何文本或工具调用之前,被 API 输出内容过滤器拦截的流式响应。Claude Code 会在重试预算内重新发送一次请求,如果过滤器也拦截了第二次响应,则显示 [Output blocked by content filtering policy](#output-blocked-by-content-filtering-policy)。

392* 临时 429 节流,但不是网关的支出限制 `429`,这不是节流;请参阅 [Spend limit reached](#spend-limit-reached)。395* 临时 429 节流,但不是网关的支出限制 `429`,这不是节流;请参阅 [Spend limit reached](#spend-limit-reached)。


4064 Marketplace 已从不同的来源添加4067 Marketplace 已从不同的来源添加

4065</h3>4068</h3>

4066 4069 

4067您通过[`/plugin install <plugin> --marketplace <source>`](/docs/zh-CN/plugins/install#add-a-marketplace-and-install-in-one-command)确认添加了 marketplace,Claude Code 从该来源获取的目录将自己命名为与您已从不同来源添加的 marketplace 相同。Claude Code 保留现有的 marketplace 而不是替换它,插件未安装。4070您在会话中或从 shell 中,通过[安装命令上的`--marketplace <source>`](/docs/zh-CN/plugins/install#add-a-marketplace-and-install-in-one-command)指定了一个新的市场来源。Claude Code 从该来源获取的目录与您已从不同来源添加的市场同名。Claude Code 保留现有的市场而不是替换它,插件未安装。

4068 4071 

4069```text theme={null}4072```text theme={null}

4070Marketplace "acme-tools" is already added from a different source (github:acme/plugins). To use this source instead, remove that marketplace first with /plugin marketplace remove acme-tools.4073Marketplace "acme-tools" is already added from a different source (github:acme/plugins). To use this source instead, remove that marketplace first with /plugin marketplace remove acme-tools.


4817 此会话没有保存的会话记录4820 此会话没有保存的会话记录

4818</h3>4821</h3>

4819 4822 

4820您附加到一个停止的[后台会话](/docs/zh-CN/agent-view),该会话从另一个对话中用 `←` 或 `/background` 后台化,并在其第一个回复完成之前停止。在该第一个回复完成之前,对话仍然仅存在于后台化它的会话中,因此 `claude attach` 拒绝启动停止的会话,而不是在相同的会话 ID 下开始空白对话。消息以此会话的 `claude respawn` 命令结尾:4823您附加到一个通过 `←` 或 `/background` [移至后台](/docs/zh-CN/agent-view#from-inside-a-session)的会话,该会话在运行自己的轮次之前就已停止。Claude Code 找不到您将其移出的那个对话,因此该会话没有可恢复的内容。消息以此会话的 `claude respawn` 命令结尾:

4821 4824 

4822```text theme={null}4825```text theme={null}

4823This session has no saved transcript — it was stopped before its first response finished. If it was backgrounded from another conversation, that one is still intact; `claude respawn <id>` starts this one fresh.4826This session has no saved transcript — it was stopped before its first response finished. If it was backgrounded from another conversation, that one is still intact; `claude respawn <id>` starts this one fresh.


4827 4830 

4828**要做什么:**4831**要做什么:**

4829 4832 

4830* 您后台化的对话是完整的:使用 [`claude --resume`](/docs/zh-CN/sessions) 恢复它或继续在其中工作4833* 要重新启动停止的会话,请使用消息中的 ID 运行 `claude respawn <id>`,或在 Agent 视图中的其行上按 `Enter` 两次

4831* 要无论如何启动停止的会话,请使用消息中的 ID 运行 `claude respawn <id>`,或在 Agent 视图中的其行上按 `Enter` 两次

4832* 如果会话确实完成了回复,您仍然在 v2.1.214 之前的版本上看到此拒绝,`~/.claude/projects` 中的不可读文件夹可能会使会话记录扫描错过保存的对话;更新到 v2.1.214 或更高版本,它在扫描期间容忍不可读的文件夹4834* 如果会话确实完成了回复,您仍然在 v2.1.214 之前的版本上看到此拒绝,`~/.claude/projects` 中的不可读文件夹可能会使会话记录扫描错过保存的对话;更新到 v2.1.214 或更高版本,它在扫描期间容忍不可读的文件夹

4833 4835 

4834<h3 id="this-session-is-running-in-another-terminal">4836<h3 id="this-session-is-running-in-another-terminal">

glossary.md +1 −1

Details

511 Worktree isolation511 Worktree isolation

512</h3>512</h3>

513 513 

514一个隔离模式,在 `.claude/worktrees/` 下的单独 git worktree 中运行 Claude,使用 `-w` 标志或 subagent 配置中的 `isolation: worktree` 启用。更改保留在单独分支的单独目录中,因此并行代理不会覆盖彼此的文件。514一个隔离模式,在 `.claude/worktrees/` 下的单独 git worktree 中运行 Claude,使用 `-w` 标志或子代理配置中的 `isolation: worktree` 启用。更改保留在单独目录中的单独分支上,因此每个并行 Agent 都各自编辑自己的文件副本。

515 515 

516了解更多:[使用 git worktrees 运行并行会话](/docs/zh-CN/worktrees)516了解更多:[使用 git worktrees 运行并行会话](/docs/zh-CN/worktrees)

517 517 

goal.md +1 −1

Details

127claude -p "/goal CHANGELOG.md has an entry for every PR merged this week"127claude -p "/goal CHANGELOG.md has an entry for every PR merged this week"

128```128```

129 129 

130使用默认文本输出时,在运行结束前不会打印任何内容,所以运行许多回合的目标可能看起来卡住了。添加 `--output-format stream-json --verbose` 以在循环运行时发出每条消息。130使用默认文本输出时,Claude 的最终回复会在循环结束时打印,因此运行许多轮次的目标可能看起来卡住了。添加 `--output-format stream-json --verbose` 以在循环运行时输出每条消息。

131 131 

132使用 Ctrl+C 中断进程以在条件满足之前停止非交互式目标。132使用 Ctrl+C 中断进程以在条件满足之前停止非交互式目标。

133 133 

headless.md +24 −22

Details

20 基本用法20 基本用法

21</h2>21</h2>

22 22 

23在任何 `claude` 命令中添加 `-p`(或 `--print`)标志以非交互方式运行它。并非每个 [CLI 选项](/docs/zh-CN/cli-reference) 都与 `-p` 兼容。Claude Code 拒绝 `--bg`,并在任务描述中拒绝 `--cloud`,会报错说明冲突;`--cloud` 与会话 ID 和 `-p` 一起使用时,会 [将消息排队到该云会话](/docs/zh-CN/claude-code-on-the-web#send-follow-ups-from-the-cli) 并退出。你通常会与 `-p` 结合使用的选项包括:23在任何 `claude` 命令中添加 `-p`(或 `--print`)标志以非交互方式运行它。并非每个 [CLI 选项](/docs/zh-CN/cli-reference) 都能与 `-p` 组合使用。Claude Code 会拒绝 `--bg`,也会拒绝带有任务描述的 `--cloud`,并报错说明冲突;而 `--cloud` 与会话 ID 和 `-p` 一起使用时,会 [将消息排队到该云端会话](/docs/zh-CN/claude-code-on-the-web#send-follow-ups-from-the-cli) 并退出。经常与 `-p` 结合使用的选项包括:

24 24 

25* `--continue` 用于 [继续对话](#continue-conversations)25* `--continue` 用于 [继续对话](#continue-conversations)

26* `--allowedTools` 用于 [自动批准工具](#auto-approve-tools)26* `--allowedTools` 用于 [自动批准工具](#auto-approve-tools)

27* `--output-format` 用于 [获取结构化输出](#get-structured-output)27* `--output-format` 用于 [获取结构化输出](#get-structured-output)

28 28 

29此示例向 Claude 询问有关你的代码库的问题并打印响应:29此示例向 Claude 询问有关您的代码库的问题并打印回复:

30 30 

31```bash theme={null}31```bash theme={null}

32claude -p "What does the auth module do?"32claude -p "What does the auth module do?"

33```33```

34 34 

35Claude Code 在成功时以代码 0 退出,在运行失败时以非零代码退出,因此你的脚本可以根据退出状态进行分支。如果你传递无效标志,Claude Code 会在运行开始前向 stderr 报告错误。当运行内部发生故障(例如缺少身份验证)时,Claude Code 会将故障作为结果打印到 stdout。35Claude Code 在成功时以代码 0 退出,在运行失败时以非零代码退出,因此您的脚本可以根据退出状态进行分支。如果您传递无效标志,Claude Code 会在运行开始前向 stderr 报告错误。当运行内部发生故障(例如缺少身份验证)时,Claude Code 会将故障作为结果打印到 stdout。

36 36 

37<h3 id="start-faster-with-bare-mode">37<h3 id="start-faster-with-bare-mode">

38 使用裸模式更快启动38 使用 bare 模式更快启动

39</h3>39</h3>

40 40 

41添加 `--bare` 以通过跳过 hooks、skills、自定义命令、[subagents](/docs/zh-CN/sub-agents)、已安装的插件、MCP 服务器、自动内存和 CLAUDE.md 的自动发现来减少启动时间。没有它,`claude -p` 会加载交互式会话相同的 [context](/docs/zh-CN/how-claude-code-works#the-context-window),包括在工作目录或 `~/.claude` 中配置的任何内容。41添加 `--bare` 可以跳过 hook、skill、自定义命令、[子代理](/docs/zh-CN/sub-agents)、已安装的插件、MCP 服务器、自动记忆和 CLAUDE.md 的自动发现,从而减少启动时间。如果不使用它,`claude -p` 会加载与交互式会话相同的 [上下文](/docs/zh-CN/how-claude-code-works#the-context-window),包括在工作目录或 `~/.claude` 中配置的任何内容。

42 42 

43裸模式对于 CI 和脚本很有用,你需要在每台机器上获得相同的结果。队友的 `~/.claude` 中的 hook 或项目的 `.mcp.json` 中的 MCP 服务器不会运行,因为裸模式永远不会读取它们。你用 `--add-dir` 命名的目录是一个部分例外:裸模式从其 `.claude/skills/` 文件夹加载 skills,但仍然跳过其 `.claude/commands/` 和 `.claude/agents/` 文件夹。[来自其他目录的 Skills](/docs/zh-CN/skills#skills-from-additional-directories) 涵盖了加载和不加载的内容。43bare 模式适用于需要在每台机器上获得相同结果的 CI 和脚本。队友的 `~/.claude` 中的 hook 或项目的 `.mcp.json` 中的 MCP 服务器不会运行,因为 bare 模式从不读取它们。您用 `--add-dir` 指定的目录是一个部分例外:bare 模式会从其 `.claude/skills/` 文件夹加载 skill,但仍然跳过其 `.claude/commands/` 和 `.claude/agents/` 文件夹。[来自其他目录的 Skills](/docs/zh-CN/skills#skills-from-additional-directories) 介绍了哪些内容会加载、哪些不会加载。

44 44 

45没有 `--bare`,`-p` 会话会运行项目的 `.claude/settings.json` 中的 hooks 并连接其 `.mcp.json` 中的服务器,即使在你从未信任的文件夹中也是如此。`-p` 会话不显示工作区信任对话框和每个服务器的批准提示。[在你信任文件夹之前运行的内容](/docs/zh-CN/permissions#what-runs-before-you-trust-a-folder) 涵盖了 `-p` 下每种类型的存储库内容以及如何将其排除在外。45如果不使用 `--bare`,`-p` 会话会运行项目的 `.claude/settings.json` 中的 hook 并连接其 `.mcp.json` 中的服务器,即使在您从未信任过的文件夹中也是如此。`-p` 会话不会显示工作区信任对话框,也不会显示逐个服务器的批准提示。[在您信任文件夹之前运行的内容](/docs/zh-CN/permissions#what-runs-before-you-trust-a-folder) 介绍了 `-p` 下每种仓库内容以及如何将其排除在外。

46 46 

47此示例在裸模式下运行一次性摘要任务,并预先批准 Read 工具,以便调用完成而无需权限提示。运行前设置 `ANTHROPIC_API_KEY`,因为裸模式不使用你的订阅登录:47此示例在 bare 模式下运行一次性摘要任务,并预先批准 Read 工具,以便调用无需权限提示即可完成。运行前请设置 `ANTHROPIC_API_KEY`,因为 bare 模式不使用您的订阅登录:

48 48 

49```bash theme={null}49```bash theme={null}

50claude --bare -p "Summarize README.md" --allowedTools "Read"50claude --bare -p "Summarize README.md" --allowedTools "Read"

51```51```

52 52 

53在裸模式下,Claude Code 永远不会读取 OAuth 凭证或系统密钥链。对于 Anthropic API,在环境中设置 `ANTHROPIC_API_KEY`,使用在 [Claude Console](https://platform.claude.com) 中创建的密钥,或在 `--settings` JSON 中提供 `apiKeyHelper`。Amazon Bedrock、Google Cloud 的 Agent Platform 和 Microsoft Foundry 继续照常读取它们自己的提供商凭证。53在 bare 模式下,Claude Code 从不读取 OAuth 凭据或系统密钥链。对于 Anthropic API,请在环境中设置 `ANTHROPIC_API_KEY`(使用在 [Claude Console](https://platform.claude.com) 中创建的密钥),或在 `--settings` JSON 中提供 `apiKeyHelper`。Amazon Bedrock、Google Cloud 的 Agent Platform 和 Microsoft Foundry 会继续照常读取各自的提供商凭据。

54 54 

55在裸模式下,Claude 可以访问 Bash、文件读取和文件编辑工具。使用标志传递你需要的任何 context:55在 bare 模式下,Claude 可以使用 Bash、文件读取和文件编辑工具。请使用标志传递您需要的任何上下文:

56 56 

57| 要加载 | 使用 |57| 要加载的内容 | 使用 |

58| - | - |58| - | - |

59| 系统提示添加 | `--append-system-prompt`, `--append-system-prompt-file` |59| 系统提示词附加内容 | `--append-system-prompt`, `--append-system-prompt-file` |

60| 设置 | `--settings <file-or-json>` |60| 设置 | `--settings <file-or-json>` |

61| MCP 服务器 | `--mcp-config <file-or-json>` |61| MCP 服务器 | `--mcp-config <file-or-json>` |

62| [自定义 Agent](/docs/zh-CN/sub-agents#choose-the-subagent-scope) | `--agents <file-or-json>` |62| [自定义 Agent](/docs/zh-CN/sub-agents#choose-the-subagent-scope) | `--agents <file-or-json>` |

63| 一个插件 | `--plugin-dir <path>`, `--plugin-url <url>` |63| 插件 | `--plugin-dir <path>`, `--plugin-url <url>` |

64 64 

65bare 模式还会限制会话运行期间发生的事情:65bare 模式还会限制会话运行期间发生的事情:

66 66 


84 84 

85运行会等待后台工作,例如后台命令、子代理和工作流、Monitor 监视以及待处理的 `/loop` 唤醒:85运行会等待后台工作,例如后台命令、子代理和工作流、Monitor 监视以及待处理的 `/loop` 唤醒:

86 86 

87* **[后台命令](/docs/zh-CN/tools-reference#background-commands)**:对于主对话启动的命令(例如开发服务器或监视构建),运行会等待,直到该命令退出或达到其 [时间限制](/docs/zh-CN/tools-reference#time-limit-for-background-commands)。随后 Claude 会根据结果再进行一轮,该轮次的结果成为运行的最后结果,也就是 `text` 和 `json` 输出所打印的结果。在命令运行期间,10 分钟上限不会结束等待。87* **[后台命令](/docs/zh-CN/tools-reference#background-commands)**:对于主对话启动的命令(例如开发服务器或监视构建),运行会等待,直到该命令退出或达到其 [时间限制](/docs/zh-CN/tools-reference#time-limit-for-background-commands)。随后 Claude 会根据结果再进行一轮。在命令运行期间,10 分钟上限不会结束等待。

88* **后台[子代理](/docs/zh-CN/sub-agents)和工作流**:运行会保持打开状态,直到该工作完成,因为其结果是最终输出的一部分。88* **后台[子代理](/docs/zh-CN/sub-agents)和工作流**:运行会保持打开状态,直到该工作完成,因为其结果是最终输出的一部分。

89* **[Monitor](/docs/zh-CN/tools-reference#monitor-tool) 监视**:运行会等待,直到监视超时或 10 分钟上限结束等待,以先发生者为准。在等待期间,Claude 会继续响应监视报告的内容。默认情况下,监视在 Claude 启动后五分钟超时。89* **[Monitor](/docs/zh-CN/tools-reference#monitor-tool) 监视**:运行会等待,直到监视超时或 10 分钟上限结束等待,以先发生者为准。在等待期间,Claude 会继续响应监视报告的内容。默认情况下,监视在 Claude 启动后五分钟超时。

90* **待处理的唤醒**:在以文本形式而非通过 `--input-format stream-json` 传递提示词的运行中,如果 Claude 已安排 [自定节奏的 `/loop` 唤醒](/docs/zh-CN/scheduled-tasks#let-claude-choose-the-interval),运行会等待每次唤醒触发并执行其迭代,直到 [循环结束](/docs/zh-CN/scheduled-tasks#stop-a-loop),即使超过 10 分钟上限也是如此。90* **待处理的唤醒**:在以文本形式而非通过 `--input-format stream-json` 传递提示词的运行中,如果 Claude 已安排 [自定节奏的 `/loop` 唤醒](/docs/zh-CN/scheduled-tasks#let-claude-choose-the-interval),运行会等待每次唤醒触发并执行其迭代,直到 [循环结束](/docs/zh-CN/scheduled-tasks#stop-a-loop),即使超过 10 分钟上限也是如此。

91 91 

92如果运行达到其 [`--max-budget-usd`](/docs/zh-CN/cli-reference#cli-flags) 上限,Claude Code 会停止剩余的后台工作,而不是继续等待。92如果运行达到其 [`--max-budget-usd`](/docs/zh-CN/cli-reference#cli-flags) 上限,Claude Code 会停止剩余的后台工作,而不是继续等待。

93 93 

94当后台工作启动新的轮次时,使用默认的 `text` 输出时运行会打印每一轮的结果,使用 `json` 输出时则打印最后一轮的结果。在 v2.1.295 之前,使用 `text` 输出时运行也只打印最后一轮的结果。

95 

94<h3 id="stop-a-run-with-sigterm">96<h3 id="stop-a-run-with-sigterm">

95 使用 SIGTERM 停止运行97 使用 SIGTERM 停止运行

96</h3>98</h3>

97 99 

98如果你使用 SIGTERM 停止 `claude -p` 运行,例如使用 `kill` 或从进程监督程序,Claude Code 以代码 143 退出。Claude Code 将正在进行的转向保持未完成状态,并且不为其记录任何结果。要改为结束转向,请发送 SIGINT,或在停止进程之前调用 Agent SDK 的 `interrupt()`。100如果您使用 SIGTERM 停止 `claude -p` 运行(例如使用 `kill` 或通过进程监督程序),Claude Code 会以代码 143 退出。Claude Code 会让正在进行的轮次保持未完成状态,并且不为其记录任何结果。如果要结束该轮次,请在停止进程之前发送 SIGINT,或调用 Agent SDK 的 `interrupt()`。

99 101 

100在 SIGTERM 上,Claude Code 终止仍在运行的任何 Bash 命令的进程树。Claude Code 然后运行 [`SessionEnd` hooks](/docs/zh-CN/hooks#sessionend) 并退出。退出时,Claude Code 不启动新的工具调用,不发送新的模型请求,也不运行除 `SessionEnd` 之外的任何 hook。如果运行在信号到达时处于命令中间或等待权限提示的答案,Claude Code 按如下方式处理该步骤:102收到 SIGTERM 时,Claude Code 会终止仍在运行的任何 Bash 命令的进程树。然后 Claude Code 运行 [`SessionEnd` hook](/docs/zh-CN/hooks#sessionend) 并退出。在退出过程中,Claude Code 不会启动新的工具调用,不会发送新的模型请求,也不会运行除 `SessionEnd` 之外的任何 hook。如果信号到达时运行正在执行命令或等待权限提示,Claude Code 会按如下方式处理该步骤:

101 103 

102* **运行命令**:Claude Code 在会话中将命令记录为已杀死。104* **正在运行命令**:Claude Code 会在会话中将该命令记录为已终止。

103* **等待权限提示的答案**:如果你向进程发送 SIGTERM,Claude Code 会将提示保持未回答状态。如果你的程序通过 Agent SDK 关闭会话,SDK 会在发送任何信号之前结束 Claude Code 的输入,Claude Code 会在输入结束后立即取消提示。105* **正在等待权限提示的答复**:如果您向进程发送 SIGTERM,Claude Code 会让该提示保持未答复状态。如果您的程序通过 Agent SDK 关闭会话,SDK 会在发送任何信号之前结束 Claude Code 的输入,而 Claude Code 会在输入结束后立即取消该提示。

104 106 

105当你 [恢复会话](#continue-conversations) 时,Claude Code 将中断的转向保持原样,你的下一个提示驱动对话。要让 Claude Code 在恢复时继续中断的转向,请设置 [`CLAUDE_CODE_RESUME_INTERRUPTED_TURN=1`](/docs/zh-CN/env-vars)。107当您 [恢复会话](#continue-conversations) 时,Claude Code 会保留被中断的轮次原样,由您的下一个提示词推动对话。如果希望 Claude Code 在恢复时继续被中断的轮次,请设置 [`CLAUDE_CODE_RESUME_INTERRUPTED_TURN=1`](/docs/zh-CN/env-vars)。

106 108 

107<h3 id="if-the-working-directory-is-deleted">109<h3 id="if-the-working-directory-is-deleted">

108 如果工作目录被删除110 如果工作目录被删除

109</h3>111</h3>

110 112 

111如果 `claude -p` 或 Agent SDK 会话的工作目录在会话中间被删除,会话继续运行。当转向在目录缺失时启动时,Claude Code 在 `stream-json` 输出中发出 [警告消息](/docs/zh-CN/agent-sdk/typescript#sdkinformationalmessage),shell 命令失败,直到目录再次存在。113如果 `claude -p` 或 Agent SDK 会话的工作目录在会话进行中被删除,会话会继续运行。当某个轮次在目录缺失时开始,Claude Code 会在 `stream-json` 输出中发出 [警告消息](/docs/zh-CN/agent-sdk/typescript#sdkinformationalmessage),并且 shell 命令会失败,直到该目录重新存在。

112 114 

113<h2 id="examples">115<h2 id="examples">

114 示例116 示例


262| `type` | `"system"` | 消息类型 |264| `type` | `"system"` | 消息类型 |

263| `subtype` | `"api_retry"` | 将其标识为重试事件 |265| `subtype` | `"api_retry"` | 将其标识为重试事件 |

264| `attempt` | 整数 | 当前尝试次数,从 1 开始 |266| `attempt` | 整数 | 当前尝试次数,从 1 开始 |

265| `max_retries` | 整数 | 允许的总重试次数,对于此失败的原因可能少于会话范围的预算 |267| `max_retries` | 整数 | 针对此失败原因允许的总重试次数 |

266| `retry_delay_ms` | 整数 | 毫秒直到下一次尝试 |268| `retry_delay_ms` | 整数 | 毫秒直到下一次尝试 |

267| `error_status` | 整数或 null | 失败尝试的 HTTP 状态代码,或 `null` 当尝试从 API 没有获得 HTTP 响应时 |269| `error_status` | 整数或 null | 失败尝试的 HTTP 状态代码,或 `null` 当尝试从 API 没有获得 HTTP 响应时 |

268| `no_response` | 对象,可选 | 仅当失败的尝试 [及时没有获得响应头](/docs/zh-CN/errors#no-response-from-api) 时存在。`waited_ms` 是该尝试等待的时间,`retry_wait_ms` 是重试将等待的时间。在这些事件中,`max_retries` 反映此原因通常获得的一次重试,而不是会话范围的预算。需要 Claude Code v2.1.261 或更高版本 |270| `no_response` | 对象,可选 | 仅当失败的尝试 [未及时获得响应头](/docs/zh-CN/errors#no-response-from-api) 时存在。`waited_ms` 是该尝试等待的时间,`retry_wait_ms` 是重试将等待的时间。需要 Claude Code v2.1.261 或更高版本 |

269| `error` | 字符串 | 错误类别:`authentication_failed`、`oauth_org_not_allowed`、`account_on_hold`、`billing_error`、`rate_limit`、`overloaded`、`invalid_request`、`model_not_found`、`server_error`、`max_output_tokens`、`cloud_credential_error` 或 `unknown` |271| `error` | 字符串 | 错误类别:`authentication_failed`、`oauth_org_not_allowed`、`account_on_hold`、`billing_error`、`rate_limit`、`overloaded`、`invalid_request`、`model_not_found`、`server_error`、`max_output_tokens`、`cloud_credential_error` 或 `unknown` |

270| `uuid` | 字符串 | 唯一事件标识符 |272| `uuid` | 字符串 | 唯一事件标识符 |

271| `session_id` | 字符串 | 事件所属的会话 |273| `session_id` | 字符串 | 事件所属的会话 |

hooks.md +124 −35

Details

476| `async` | 否 | 如果为 `true`,在后台运行而不阻止。请参阅 [在后台运行 hooks](#run-hooks-in-the-background) |476| `async` | 否 | 如果为 `true`,在后台运行而不阻止。请参阅 [在后台运行 hooks](#run-hooks-in-the-background) |

477| `asyncRewake` | 否 | 如果为 `true`,在后台运行并在退出代码 2 时唤醒 Claude。hook 的 stderr 或 stdout(如果 stderr 为空)显示给 Claude 作为 [系统提醒](/docs/zh-CN/glossary#system-reminder),以便它可以对长时间运行的后台失败做出反应 |477| `asyncRewake` | 否 | 如果为 `true`,在后台运行并在退出代码 2 时唤醒 Claude。hook 的 stderr 或 stdout(如果 stderr 为空)显示给 Claude 作为 [系统提醒](/docs/zh-CN/glossary#system-reminder),以便它可以对长时间运行的后台失败做出反应 |

478| `shell` | 否 | 用于此 hook 的 shell。接受 `"bash"` 或 `"powershell"`。默认为 `"bash"`,或在未安装 Git Bash 时在 Windows 上默认为 `"powershell"`。设置 `"powershell"` 在 Windows 上通过 PowerShell 运行命令。不需要 `CLAUDE_CODE_USE_POWERSHELL_TOOL`,因为 hooks 直接生成 PowerShell。设置 `args` 时被忽略 |478| `shell` | 否 | 用于此 hook 的 shell。接受 `"bash"` 或 `"powershell"`。默认为 `"bash"`,或在未安装 Git Bash 时在 Windows 上默认为 `"powershell"`。设置 `"powershell"` 在 Windows 上通过 PowerShell 运行命令。不需要 `CLAUDE_CODE_USE_POWERSHELL_TOOL`,因为 hooks 直接生成 PowerShell。设置 `args` 时被忽略 |

479| `onFailure` | 否 | hook 失败时对该操作的处理方式:`"continue"`(默认值)或 `"block"`。请参阅 [在 hook 失败时阻止操作](#block-the-action-when-a-hook-fails)。需要 Claude Code v2.1.295 或更高版本 |

479 480 

480<a id="exec-form-and-shell-form" />481<a id="exec-form-and-shell-form" />

481 482 


533| `url` | 是 | 发送 POST 请求的 URL |534| `url` | 是 | 发送 POST 请求的 URL |

534| `headers` | 否 | 其他 HTTP 标头作为键值对。值支持使用 `$VAR_NAME` 或 `${VAR_NAME}` 语法的环境变量插值。仅解析 `allowedEnvVars` 中列出的变量 |535| `headers` | 否 | 其他 HTTP 标头作为键值对。值支持使用 `$VAR_NAME` 或 `${VAR_NAME}` 语法的环境变量插值。仅解析 `allowedEnvVars` 中列出的变量 |

535| `allowedEnvVars` | 否 | 可能被插值到标头值中的环境变量名称列表。对未列出变量的引用被替换为空字符串。任何环境变量插值都需要 |536| `allowedEnvVars` | 否 | 可能被插值到标头值中的环境变量名称列表。对未列出变量的引用被替换为空字符串。任何环境变量插值都需要 |

537| `onFailure` | 否 | hook 失败时对该操作的处理方式:`"continue"`(默认值)或 `"block"`。请参阅 [在 hook 失败时阻止操作](#block-the-action-when-a-hook-fails)。需要 Claude Code v2.1.295 或更高版本 |

536 538 

537Claude Code 将 hook 的 [JSON 输入](#hook-input-and-output) 作为 POST 请求体发送,`Content-Type: application/json`。响应体使用与命令 hooks 相同的 [JSON 输出格式](#json-output)。539Claude Code 将 hook 的 [JSON 输入](#hook-input-and-output) 作为 POST 请求体发送,`Content-Type: application/json`。响应体使用与命令 hooks 相同的 [JSON 输出格式](#json-output)。

538 540 


821 退出码输出823 退出码输出

822</h3>824</h3>

823 825 

824来自 hook 命令的退出码告诉 Claude Code 该操作是否应继续、被阻止或被忽略。退出码不单独起作用。Claude Code 从 stdout 读取 [JSON 输出字段](#json-output),无论退出码是什么(不仅仅是 0),对于使用标准决策模型的事件,通过 schema 验证的解析对象与退出码一起生效。退出 2 的阻止是 JSON 无法覆盖的唯一结果。826hook 的退出码告诉 Claude Code 是否继续执行触发该 hook 的操作,例如工具调用或提示词。运行结束时有以下三种结果之一:

825 827 

826两个表负责说明每个事件的例外:[每个事件的退出码 2 行为](#exit-code-2-behavior-per-event)说明退出码对每个事件的作用,[决策控制](#decision-control)说明每个事件接受哪些决策字段。通用字段如 `systemMessage` 在大多数事件中工作,并在 [JSON 输出](#json-output)表中列出。828* **成功**:hook 以 0 退出。Claude Code 应用 hook 打印的任何 [JSON 输出](#json-output)字段,除非这些字段阻止或拒绝该操作,否则操作继续进行。

829* **阻止错误**:hook 以 2 退出。在[可以阻止的事件](#exit-code-2-behavior-per-event)上,Claude Code 停止该操作。

830* **非阻止错误**:hook 以任何其他代码退出,或以其他方式失败,例如无法启动或打印无效 JSON。操作继续进行,在 `PreToolUse` 等事件上,您会在会话记录中看到 `<hook name> hook error` 通知。如果希望失败的 hook 阻止操作,请设置 [`onFailure: "block"`](#block-the-action-when-a-hook-fails)。

831 

832hook 打印到 stdout 的内容可能会改变结果。例如,如果 `PreToolUse` hook 以 1 退出但打印了通过验证的 JSON,则该运行是成功的,由 JSON 字段决定后续行为。要确定 hook 在 `PreToolUse` 等事件上的结果,请将其打印到 stdout 的内容与第一列匹配,并将其退出码与表头匹配:

833 

834| Stdout | 退出 0 | 退出 2 | 任何其他退出码 |

835| :- | :- | :- | :- |

836| 通过 [schema 验证](#json-output)的 JSON 对象 | 成功。字段生效 | 阻止错误。Claude Code 仍读取字段,但它们无法覆盖阻止 | 成功。Claude Code 忽略退出码,仅由字段决定。设置 [`onFailure: "block"`](#block-the-action-when-a-hook-fails) 时,这算作失败 |

837| [无法解析](#exit-code-0)或未通过 schema 验证的 JSON | 非阻止错误。通知带有解析或验证消息 | 阻止错误。您的 stderr 作为原因 | 非阻止错误。通知带有解析或验证消息 |

838| [纯文本](#exit-code-0)或无输出 | 成功 | 阻止错误。您的 stderr 作为原因 | 非阻止错误。通知带有您的 stderr 的第一行 |

839 

840某些事件有自己的规则:

841 

842* **`WorktreeCreate`**:任何非零退出码都会使 worktree 创建失败,无论您的 JSON 说什么。

843* **`WorktreeRemove`**:任何非零退出码会在目录之后仍然存在时使 worktree 移除失败。

844* **`Stop`、`SubagentStop`、`TaskCompleted` 以及插件的 `UserPromptSubmit` hook**:当 hook 以 2 退出、stdout 上无内容且其 stderr 表明某个文件缺失(例如 `No such file or directory`)时,Claude Code 将该运行视为非阻止错误。

845* **`Elicitation` 和 `ElicitationResult`**:Claude Code 在 hook 以 0 退出时应用您的 `hookSpecificOutput`,在任何其他退出码上忽略它。

846* **丢弃 hook 输出的事件,如 `StopFailure`**:Claude Code 在任何退出码上都忽略您的 JSON,但 `terminalSequence` 等副作用字段除外,它们仍会触发。

847 

848要查看退出码 2 对您的事件有何作用,请参阅[每个事件的退出码 2 行为](#exit-code-2-behavior-per-event)。要查看它接受哪些决策字段,请参阅[决策控制](#decision-control)。

827 849 

828<h4 id="exit-code-0">850<h4 id="exit-code-0">

829 退出码 0851 退出码 0


835 857 

836Claude Code 是否将您的 stdout 读取为 [JSON 输出](#json-output)或纯文本取决于它如何开始和结束,忽略周围的空白:858Claude Code 是否将您的 stdout 读取为 [JSON 输出](#json-output)或纯文本取决于它如何开始和结束,忽略周围的空白:

837 859 

838* **以 `{` 开始并以 `}` 结束**:Claude Code 将其解析为 JSON。当输出是两行或更多行,每行本身都解析为 JSON,且没有行是设置字段的 [JSON 输出](#json-output)对象时,Claude Code 将整个输出视为纯文本。当其中一行确实设置了字段时,整个输出是解析失败,如下所述。860* **以 `{` 开始并以 `}` 结束**:Claude Code 将其解析为 JSON。当输出是两行或更多行,每行本身都解析为 JSON,且没有行是设置字段的 [JSON 输出](#json-output)对象时,Claude Code 将整个输出视为纯文本。当其中一行确实设置了字段时,整个输出是解析失败。

839* **以 `{` 开始但不以 `}` 结束**:Claude Code 将其视为纯文本。861* **以 `{` 开始但不以 `}` 结束**:Claude Code 将其视为纯文本。

840* **以其他任何内容开始**:Claude Code 将其视为纯文本,即使它是 JSON 数组或带引号的 JSON 字符串也是如此。862* **以其他任何内容开始**:Claude Code 将其视为纯文本,即使它是 JSON 数组或带引号的 JSON 字符串也是如此。

841 863 

842对于使用标准决策模型的事件,退出 0 且解析对象未通过 schema 验证是非阻止错误:操作继续,会话记录显示 `<hook name> hook error` 通知,带有验证消息。在除 2 以外的任何退出码上都会发生相同情况,而[退出 2 仍然阻止](#exit-code-2)。864当 Claude Code 尝试将您的 stdout 解析为 JSON 但无法解析,或解析后的对象未通过 [schema 验证](#json-output)时,该运行是[非阻止错误](#exit-code-output)。`<hook name> hook error` 通知带有解析或验证消息。在添加纯文本 stdout 作为上下文的事件上,Claude Code 不会添加它未能解析的 stdout。

843 

844对于使用标准决策模型的事件,当 Claude Code 尝试将您的 stdout 解析为 JSON 且无法解析时,它在除 2 外的每个退出码上报告非阻止错误。会话记录显示 `<hook name> hook error` 通知,带有解析消息。在添加纯文本 stdout 作为上下文的事件上,Claude Code 不添加文本。在 v2.1.248 之前,Claude Code 将该 stdout 视为纯文本。

845 865 

846来自退出 0 的 hook 的 stderr 仅进入调试日志,从不进入会话记录,Claude 从不看到它。要自己读取它,请启用[调试日志](#debug-hooks)。要从 `PostToolUse` 或 `PostToolUseFailure` hook 向 Claude 显示警告,请改为退出 2,以便 [Claude 看到 stderr](#exit-code-2-behavior-per-event),即使工具已经运行。866Claude 从不看到以 0 退出的 hook 的 stderr。要在 `PreToolUse` 等事件上自己读取它,请启用[调试日志](#debug-hooks)。要从 `PostToolUse` 或 `PostToolUseFailure` hook 向 Claude 显示警告,请改为退出 2,以便 [Claude 看到 stderr](#exit-code-2-behavior-per-event),即使工具已经运行。

847 867 

848<h4 id="exit-code-2">868<h4 id="exit-code-2">

849 退出码 2869 退出码 2

850</h4>870</h4>

851 871 

852退出 2 表示阻止错误。在[可以阻止的事件](#exit-code-2-behavior-per-event)上,无论您是否打印 JSON,退出 2 都会阻止:即使 JSON `permissionDecision` 为 `"allow"` 也无法覆盖它。Claude Code 仍然读取 stdout 上的任何有效 [JSON 输出](#json-output)。在 `Elicitation` 和 `ElicitationResult` 上,退出 2 的 hook 的 `hookSpecificOutput` 被忽略。872以代码 2 退出以阻止操作。在[可以阻止的事件](#exit-code-2-behavior-per-event)上,Claude Code 会停止该操作:例如,`PreToolUse` hook 会阻止工具调用,`UserPromptSubmit` hook 会拒绝提示词。

853 873 

854阻止消息是您的 JSON 阻止决策中的原因(如果它做出了阻止决策),否则是您的 stderr 文本。阻止的作用因事件而异:`PreToolUse` 阻止工具调用,`UserPromptSubmit` 拒绝提示词,等等。[每个事件的退出码 2 行为](#exit-code-2-behavior-per-event)列出每个事件的效果,每个事件的部分说明消息去向。874随阻止一起提供的消息是 hook 的 stderr。如果 hook 还打印了做出阻止决策的 JSON,Claude Code 会改用该决策的原因。

855 875 

856退出 2 的 hook 同时打印未通过 [JSON 输出](#json-output) schema 验证的 JSON 时仍然阻止:Claude Code 使用 stderr 作为阻止原因,并在调试日志中记录验证失败。在 v2.1.214 之前,Claude Code 将该组合视为非阻止错误,操作继续。876即使 hook 打印了 JSON,退出 2 也会阻止:

877 

878* **通过 schema 验证的 JSON**:Claude Code 仍读取 [JSON 输出](#json-output)字段,但它们无法覆盖阻止。即使 `permissionDecision` 为 `"allow"`,也不会放行操作。在 `Elicitation` 和 `ElicitationResult` 上,以 2 退出的 hook 的 `hookSpecificOutput` 被忽略。

879* **未通过 schema 验证的 JSON**:hook 仍然阻止。Claude Code 使用您的 stderr 作为阻止原因,并在调试日志中记录验证失败。

857 880 

858此脚本通过退出 2 阻止 `rm` 命令,并将所有其他命令留给正常权限流程:881此脚本通过退出 2 阻止 `rm` 命令,并将所有其他命令留给正常权限流程:

859 882 


871exit 0 # No decision: the normal permission flow applies894exit 0 # No decision: the normal permission flow applies

872```895```

873 896 

897将此脚本注册为 `Bash` 上的 `PreToolUse` hook 后,以 `rm` 开头的命令会被阻止,Claude 会收到 hook 的 stderr 作为工具的错误,前缀为事件名称、工具名称和 hook 的命令:

898 

899```text theme={null}

900PreToolUse:Bash hook error: [${CLAUDE_PROJECT_DIR}/.claude/hooks/no-rm.sh]: Blocked: rm commands are not allowed

901```

902 

874<h4 id="other-exit-codes">903<h4 id="other-exit-codes">

875 其他退出码904 其他退出码

876</h4>905</h4>

877 906 

878对于大多数 hook 事件,任何其他退出码本身不会阻止。发生什么取决于您的 stdout:907当 hook 以 0 或 2 以外的代码退出,并且向 stdout 打印纯文本或不打印任何内容时,该运行是[非阻止错误](#exit-code-output)。您会在会话记录中看到 `<hook name> hook error` 通知,带有 `Failed with non-blocking status code:` 和 hook stderr 的第一行。例如,当 `Bash` 上的 `PreToolUse` hook 向 stderr 打印 `something broke` 并以 1 退出时,`PreToolUse:Bash hook error` 通知带有以下行:

879 908 

880* 使用通过 schema 验证的解析对象时,对于使用标准决策模型的事件,Claude Code 忽略退出码,仅由 JSON 决定结果:909```text theme={null}

881 * 事件支持的每个字段都会生效,包括 `permissionDecision`、`additionalContext`、`updatedInput` 和 `systemMessage`,hook 不被报告为错误。910Failed with non-blocking status code: something broke

882 * [决策控制](#decision-control)列出每个事件的决策字段;通用字段如 `systemMessage` 遵循 [JSON 输出](#json-output)表。911```

883* 使用未通过 schema 验证的解析对象时,对于使用标准决策模型的事件,它与[退出 0 时](#exit-code-0)相同,是非阻止错误:操作继续,`<hook name> hook error` 通知带有验证消息。

884* 使用 Claude Code [尝试解析为 JSON](#exit-code-0) 但无法解析的 stdout 时,对于使用标准决策模型的事件,Claude Code 报告与退出 0 时相同的非阻止错误。操作继续,通知带有解析消息。

885* 使用 Claude Code [视为纯文本](#exit-code-0)的 stdout,或使用空 stdout 时,对于大多数 hook 事件是非阻止错误:操作继续,会话记录显示 `<hook name> hook error` 通知,后跟 stderr 的第一行,前缀为 `Failed with non-blocking status code:`。要捕获完整 stderr,请启用[调试日志](#debug-hooks)。

886 912 

887标准决策模型之外的事件在[每个事件表](#exit-code-2-behavior-per-event)中保留自己的行:`WorktreeCreate` 在任何非零退出时都会使创建失败,无论您的 JSON 说什么;完全丢弃 hook 输出的事件(如 `StopFailure`)在每个退出码上都忽略您的 JSON,但 `terminalSequence` 等副作用字段除外,它们仍会触发。913要捕获完整的 stderr 而不仅是第一行,请启用[调试日志](#debug-hooks)。

888 914 

889无法启动的 hook 也归入相同的非阻止类别。当脚本路径不存在或不可执行时,shell 以某个代码(如 127)退出,您会看到相同的通知,带有解释器的消息,例如 `Failed with non-blocking status code: /bin/sh: /path/to/hook.sh: No such file or directory`。对于大多数 hook 事件,操作继续。当您设置策略 hook 时,请在其第一次运行时留意此通知:`settings.json` 中拼写错误的路径会使该关卡被悄无声息地禁用。915无法启动的 hook 也是非阻止错误。在 shell 形式下,当脚本路径不存在或不可执行时,shell 以某个代码(如 127)退出,通知带有解释器的消息,例如 `Failed with non-blocking status code: /bin/sh: /path/to/hook.sh: No such file or directory`。当您设置策略 hook 时,请在其第一次运行时留意此通知,因为 `settings.json` 中拼写错误的路径意味着该 hook 从不运行。要改为阻止操作,请设置 [`onFailure: "block"`](#block-the-action-when-a-hook-fails)。

890 916 

891<Warning>917<Warning>

892 对于大多数 hook 事件,退出码 2 是唯一仅凭退出码即可阻止的退出码。如果 stdout 上没有有效 JSON,Claude Code 将退出码 1 视为非阻止错误并继续操作,即使 1 是传统的 Unix 失败代码。如果您的 hook 旨在强制执行策略,请使用 `exit 2`。worktree 事件不同:来自 `WorktreeCreate` 的任何非零退出码都会中止 worktree 创建,来自 `WorktreeRemove` 的任何非零退出码会在目录之后仍然存在时使 worktree 移除失败。918 如果 stdout 上没有有效 JSON,Claude Code 将退出码 1 视为非阻止错误,即使 1 是传统的 Unix 失败代码。如果您的 hook 旨在强制执行策略,请使用 `exit 2`。

893</Warning>919</Warning>

894 920 

895<h4 id="timeouts">921<h4 id="timeouts">


900 926 

901在 [`PreModelSwitch`](#premodelswitch) 上,因超时被取消的 hook 会阻止模型切换。在 `PreToolUse` 上,两类 hook 的行为不同:927在 [`PreModelSwitch`](#premodelswitch) 上,因超时被取消的 hook 会阻止模型切换。在 `PreToolUse` 上,两类 hook 的行为不同:

902 928 

903* 超时的 `command`、`http` 或 `mcp_tool` hook 不阻止工具调用。调用通过正常[权限流程](/docs/zh-CN/permissions)继续,因此不要指望停滞的 hook 充当关卡。929* 超时的 `command`、`http` 或 `mcp_tool` hook 不阻止工具调用。调用通过正常[权限流程](/docs/zh-CN/permissions)继续,因此不要指望停滞的 hook 充当关卡。要在 `command` 或 `http` hook 超时时阻止调用,请设置 [`onFailure: "block"`](#block-the-action-when-a-hook-fails)。

904* 超过其超时时间的 [Agent SDK 回调 hook](/docs/zh-CN/agent-sdk/hooks) 会[阻止工具调用](#pretooluse)。930* 超过其超时时间的 [Agent SDK 回调 hook](/docs/zh-CN/agent-sdk/hooks) 会[阻止工具调用](#pretooluse)。

905 931 

932<h4 id="block-the-action-when-a-hook-fails">

933 hook 失败时阻止操作

934</h4>

935 

936在大多数事件上,当 hook 失败或超时时,Claude Code 仍会执行该操作,因此路径错误或脚本崩溃的策略 hook 会放行一切。要改为阻止操作,请在 `command` 或 `http` hook 上设置 `"onFailure": "block"`。默认值为 `"continue"`。需要 Claude Code v2.1.295 或更高版本。

937 

938`.claude/settings.json` 中的这个 `PreToolUse` hook 会在每个 Bash 命令之前运行一个项目脚本,如果脚本失败则阻止该命令:

939 

940```json theme={null}

941{

942 "hooks": {

943 "PreToolUse": [

944 {

945 "matcher": "Bash",

946 "hooks": [

947 {

948 "type": "command",

949 "command": "node",

950 "args": ["${CLAUDE_PROJECT_DIR}/.claude/hooks/check-command.js"],

951 "onFailure": "block"

952 }

953 ]

954 }

955 ]

956 }

957}

958```

959 

960要测试它,请让 `check-command.js` 保持缺失状态,并让 Claude 运行一个 Bash 命令,例如 `ls`。Claude Code 会阻止该调用,错误中包含 `failed; blocking because onFailure is "block"`,后跟 node 自身的错误输出(此处截取为一行):

961 

962```text theme={null}

963PreToolUse:Bash hook error: [node ${CLAUDE_PROJECT_DIR}/.claude/hooks/check-command.js]: failed; blocking because onFailure is "block"

964Error: Cannot find module '/path/to/project/.claude/hooks/check-command.js'

965```

966 

967超时后,消息显示 `timed out` 而不是 `failed`。如果未设置 `onFailure`,同样缺失的脚本是非阻止错误,`ls` 会运行。

968 

969以下每种情况都算作失败:

970 

971* **无法启动**:命令 hook 无法启动,例如因为脚本或可执行文件不存在

972* **0 或 2 以外的退出码**:对于命令 hook,即使它打印了允许操作的 JSON(如 `permissionDecision: "allow"`),也算作失败。要返回 JSON 决策,请以 0 退出

973* **HTTP 错误**:HTTP hook 的连接失败,或响应状态不是 2xx

974* **超时**:hook 达到其 [`timeout`](#common-fields)

975* **无效输出**:JSON 输出[无法解析](#exit-code-0)或未通过 [schema 验证](#json-output)。对于 HTTP hook,既不为空也不是 JSON 对象的 2xx 响应体也算。命令 hook 的纯文本 stdout 不算失败

976 

977设置 `"block"` 后,失败的效果与[该事件上退出码 2 的效果](#exit-code-2-behavior-per-event)相同,但 `PermissionRequest` 除外,在该事件上它会拒绝请求。例如,`PreToolUse` 失败会阻止工具调用,`UserPromptSubmit` 失败会阻止提示词。

978 

979该字段对以下 hook 无效:

980 

981* **`Stop`、`SubagentStop`、`TaskCompleted` 和 `TeammateIdle` hook**:这些事件上的退出码 2 会让 Claude 回去继续工作,而 Claude 无法修复无法运行的 hook

982* **后台命令 hook**:设置了 [`async` 或 `asyncRewake`](#run-hooks-in-the-background) 的命令 hook

983 

906<h4 id="exit-code-2-behavior-per-event">984<h4 id="exit-code-2-behavior-per-event">

907 每个事件的退出码 2 行为985 每个事件的退出码 2 行为

908</h4>986</h4>


960* **连接失败**:非阻止错误,执行继续1038* **连接失败**:非阻止错误,执行继续

961* **超时**:hook 被取消,如[超时](#timeouts)下所述1039* **超时**:hook 被取消,如[超时](#timeouts)下所述

962 1040 

963与命令 hook 不同,HTTP hook 无法仅通过状态码发出阻止错误信号。要阻止工具调用或拒绝权限,请返回 2xx 响应,其 JSON 响应体包含相应的决策字段。1041HTTP hook 无法仅通过状态码发出阻止错误信号:非 2xx 状态或连接失败是[非阻止错误](#exit-code-output)。要阻止工具调用或拒绝权限,请返回 2xx 响应,其 JSON 响应体包含相应的决策字段。要在请求失败或返回非 2xx 状态时阻止操作,请设置 [`onFailure: "block"`](#block-the-action-when-a-hook-fails)。

964 1042 

965<h3 id="json-output">1043<h3 id="json-output">

966 JSON 输出1044 JSON 输出


1237 SessionStart 决策控制1315 SessionStart 决策控制

1238</h4>1316</h4>

1239 1317 

1240Claude Code 会将其[视为纯文本](#exit-code-0)的 stdout 添加到 Claude 的上下文中。除所有 hook 都可用的 [JSON 输出字段](#json-output)外,您还可以返回以下事件专属字段:1318SessionStart hook 可以为 Claude 添加上下文、提供第一条用户消息、设置会话标题、监视文件以及重新加载 skill。除所有 hook 都可用的 [JSON 输出字段](#json-output)外,为每项功能返回相应字段:

1241 1319 

1242| 字段 | 描述 |1320| 字段 | 描述 |

1243| :- | :- |1321| :- | :- |

1244| `additionalContext` | 在对话开始时、第一个提示词之前添加到 Claude 上下文中的字符串。关于文本的传递方式以及应放入的内容,请参阅[为 Claude 添加上下文](#add-context-for-claude) |1322| `additionalContext` | 在对话开始时、第一个提示词之前添加到 Claude 上下文中的字符串。关于文本的传递方式以及应放入的内容,请参阅[为 Claude 添加上下文](#add-context-for-claude) |

1245| `initialUserMessage` | 用作会话第一条用户消息的字符串。适用于使用 `-p` 标志的[非交互模式](/docs/zh-CN/headless),此时即使未提供提示词,它也会成为第一个轮次。如果提供了提示词,该提示词将作为下一个轮次跟随其后。与附加到现有轮次的 `additionalContext` 不同,此字段会创建轮次 |1323| `initialUserMessage` | 在使用 `-p` 标志的[非交互模式](/docs/zh-CN/headless)下,用作会话第一条用户消息的字符串。即使您未传入提示词,它也会成为第一轮。您传入的提示词会作为下一轮紧随其后 |

1246| `sessionTitle` | 设置会话标题,效果与 `/rename` 相同。可用于根据启动文件夹、git 分支或 worktree 名称自动命名会话。当 `source` 为 `"startup"`、`"resume"` 或 `"fork"` 时生效;在 `"clear"` 和 `"compact"` 时被忽略 |1324| `sessionTitle` | 设置会话标题,效果与 `/rename` 相同。在 `source` 为 `"startup"`、`"resume"` 或 `"fork"` 时生效 |

1247| `watchPaths` | 在此会话期间监视 [FileChanged](#filechanged) 事件的绝对路径数组 |1325| `watchPaths` | 在此会话期间监视 [FileChanged](#filechanged) 事件的绝对路径数组 |

1248| `reloadSkills` | 布尔值。为 `true` 时,Claude Code 会在 SessionStart hook 完成后重新扫描 [skill](/docs/zh-CN/skills) 和命令目录,使 hook 安装的 skill 在同一会话中(从第一个提示词开始)即可使用 |1326| `reloadSkills` | 布尔值。为 `true` 时,Claude Code 会在 SessionStart hook 完成后重新扫描 [skill](/docs/zh-CN/skills) 和命令目录。请参阅[重新加载 hook 安装的 skill](#reload-skills-that-a-hook-installs) |

1327 

1328以下输出添加上下文并为会话命名:

1249 1329 

1250```json theme={null}1330```json theme={null}

1251{1331{


1257}1337}

1258```1338```

1259 1339 

1260由于对于此事件,纯 stdout 已经会传达给 Claude,因此仅加载上下文的 hook 可以直接打印到 stdout,而无需构建 JSON。当您需要将上下文与 `sessionTitle` 等其他字段结合使用时,请使用 JSON 形式。1340仅添加上下文的 hook 可以直接打印内容而无需构建 JSON,因为 Claude Code 会将 SessionStart hook 的[纯文本 stdout](#exit-code-0) 添加到 Claude 的上下文中。

1341 

1342如果您的插件的 SessionStart hook 提供 `initialUserMessage` 或 `sessionTitle`,请在会话开始前安装该插件。对于在 SessionStart hook 运行之后才完成安装的插件,Claude Code 会忽略这两个字段。

1343 

1344<h4 id="reload-skills-that-a-hook-installs">

1345 重新加载 hook 安装的 skill

1346</h4>

1347 

1348要使 SessionStart hook 安装的 skill 在同一会话中可用,请返回 `reloadSkills`。skill 发现通常在 SessionStart hook 完成之前运行,因此如果不这样做,hook 写入 `~/.claude/skills/` 或 `.claude/skills/` 的文件在第一个提示词运行时可能缺失。

1261 1349 

1262当 SessionStart hook 安装或更新 skill 时,请使用 `reloadSkills`。skill 发现通常在 SessionStart hook 完成之前运行,因此 hook 写入 `~/.claude/skills/` 或 `.claude/skills/` 的文件否则只会在下一个会话中出现。此示例同步一个共享的 skill 仓库并请求重新扫描:1350此示例同步共享的 skill 仓库并请求重新扫描:

1263 1351 

1264```bash theme={null}1352```bash theme={null}

1265#!/bin/bash1353#!/bin/bash


1270echo '{"hookSpecificOutput": {"hookEventName": "SessionStart", "reloadSkills": true}}'1358echo '{"hookSpecificOutput": {"hookEventName": "SessionStart", "reloadSkills": true}}'

1271```1359```

1272 1360 

1273仓库 URL 只是一个占位符;请将其替换为您自己的 skill 仓库。使用占位符时,clone 会失败并向 stderr 打印一条 `fatal:` 消息。以 0 退出的 SessionStart hook 的 stderr 仅供参考,因此 `reloadSkills` 请求仍然有效。1361仓库 URL 是占位符。请将其替换为您自己的 skill 仓库。

1274 1362 

1275<h4 id="persist-environment-variables">1363<h4 id="persist-environment-variables">

1276 持久化环境变量1364 持久化环境变量


1419 1507 

1420对于 `command`、`http` 和 `mcp_tool` 类型,`UserPromptSubmit` hook 的默认超时时间为 30 秒,短于这些类型在大多数其他事件上 600 秒的默认值。由于此 hook 在每个提示词之前运行,并且在完成前会阻塞模型处理,卡住的 hook 会使会话停滞。如果您的 hook 需要更多时间,请在 hook 条目中设置 `timeout` 字段。1508对于 `command`、`http` 和 `mcp_tool` 类型,`UserPromptSubmit` hook 的默认超时时间为 30 秒,短于这些类型在大多数其他事件上 600 秒的默认值。由于此 hook 在每个提示词之前运行,并且在完成前会阻塞模型处理,卡住的 hook 会使会话停滞。如果您的 hook 需要更多时间,请在 hook 条目中设置 `timeout` 字段。

1421 1509 

1422除了使用 [`async: true`](#run-hooks-in-the-background) 运行的 command hook 外,达到超时的 `UserPromptSubmit` command、HTTP 或 MCP 工具 hook 会被取消,其输出(包括任何 `additionalContext`)会被丢弃。提示词仍会传达给 Claude,只是不带该上下文。会话记录中会显示一条通知,指明该 hook、触发的超时时间,以及输出已被丢弃。1510除了使用 [`async: true`](#run-hooks-in-the-background) 运行的 command hook 之外,达到超时的 `UserPromptSubmit` command、HTTP 或 MCP 工具 hook 都会被取消,其输出(包括任何 `additionalContext`)会被丢弃。提示词仍会在没有该上下文的情况下传达给 Claude。若要改为阻止该提示词,请在 command 或 HTTP hook 上设置 [`onFailure: "block"`](#block-the-action-when-a-hook-fails)。会话记录中会显示一条通知,指明该 hook、触发的超时以及输出已被丢弃。

1423 1511 

1424`UserPromptSubmit` 上的 [Agent SDK 回调 hook](/docs/zh-CN/agent-sdk/hooks) 达到超时时,会阻止该提示词,并显示一条指明该 hook 和超时时间的消息,因为此处的回调可能充当不能失败放行的策略关卡。会话会继续。在 v2.1.208 之前,该事件上的回调超时会以执行错误结束该轮次。1512`UserPromptSubmit` 上的 [Agent SDK 回调 hook](/docs/zh-CN/agent-sdk/hooks) 达到超时时,会阻止该提示词,并显示一条指明该 hook 和超时时间的消息,因为此处的回调可能充当不能失败放行的策略关卡。会话会继续。在 v2.1.208 之前,该事件上的回调超时会以执行错误结束该轮次。

1425 1513 


1860| :- | :- | :- | :- |1948| :- | :- | :- | :- |

1861| `url` | string | `"https://example.com/api"` | 要获取内容的 URL |1949| `url` | string | `"https://example.com/api"` | 要获取内容的 URL |

1862| `prompt` | string | `"Extract the API endpoints"` | 对获取到的内容运行的提示词 |1950| `prompt` | string | `"Extract the API endpoints"` | 对获取到的内容运行的提示词 |

1951| `offset` | number | `100000` | 可选,从页面开头跳过的字符数。Claude 会设置它以继续读取较长的页面。需要 Claude Code v2.1.290 或更高版本 |

1863 1952 

1864<h5 id="websearch">1953<h5 id="websearch">

1865 WebSearch1954 WebSearch


2112| `message` | 仅用于 `"deny"`:告诉 Claude 权限被拒绝的原因 |2201| `message` | 仅用于 `"deny"`:告诉 Claude 权限被拒绝的原因 |

2113| `interrupt` | 仅用于 `"deny"`:如果为 `true`,则停止 Claude |2202| `interrupt` | 仅用于 `"deny"`:如果为 `true`,则停止 Claude |

2114 2203 

2115以 2 退出但不带 `decision` 对象的 hook 不会改变权限流程,其 stderr 会被丢弃。只有 `decision` 对象才能授予或拒绝请求。2204以退出码 2 退出但未提供 `decision` 对象的 hook 不会改变权限流程,其 stderr 会被丢弃。要授予或拒绝请求,请返回 `decision` 对象。

2116 2205 

2117```json theme={null}2206```json theme={null}

2118{2207{


2678 TaskCreated 决策控制2767 TaskCreated 决策控制

2679</h4>2768</h4>

2680 2769 

2681TaskCreated hook 可以通过两种方式阻止创建。无论哪种方式,Claude Code 都会删除该任务,并将您的消息作为工具错误返回给 Claude。Claude Code 会忽略此事件中的 `continue: false`,Claude 会继续工作。2770TaskCreated hook 可以通过退出码 2 或 JSON 决策来阻止创建。无论哪种方式,Claude Code 都会删除该任务,并将您的消息作为工具的错误返回给 Claude。Claude Code 会忽略来自此事件的 `continue: false`,Claude 会继续工作。

2682 2771 

2683* **退出码 2**:Claude Code 将 stderr 文本作为消息返回。2772* **退出码 2**:Claude Code 将 stderr 文本作为消息返回。

2684* **JSON `{"decision": "block", "reason": "..."}`**:Claude Code 将 `reason` 作为消息返回。2773* **JSON `{"decision": "block", "reason": "..."}`**:Claude Code 将 `reason` 作为消息返回。


3560 3649 

3561无论决策如何,Claude Code 都会向用户显示您的 hook 返回的任何 `systemMessage`,因此用于报告成本的 hook 可以返回 `{"systemMessage": "..."}` 并以 0 退出。3650无论决策如何,Claude Code 都会向用户显示您的 hook 返回的任何 `systemMessage`,因此用于报告成本的 hook 可以返回 `{"systemMessage": "..."}` 并以 0 退出。

3562 3651 

3563未在超时时间内响应的 PreModelSwitch hook 会阻止切换。相比之下,在 [PreToolUse](#timeouts) 上,超时的命令 hook 会让工具调用继续进行。此事件的默认超时时间为 30 秒。`PreModelSwitch` 仅运行 `command`、`http` 和 `mcp_tool` hook,因此 `prompt` 和 `agent` 的默认值不适用。3652在超时之前未响应的 PreModelSwitch hook 会阻止切换。关于超时对其他事件的影响,请参阅[超时](#timeouts)。此事件的默认超时时间为 30 秒。`PreModelSwitch` 仅运行 `command`、`http` 和 `mcp_tool` hook,因此 `prompt` 和 `agent` 的默认值不适用。

3564 3653 

3565以 0 或 2 以外的代码退出且未打印 JSON 决策的 hook 不会阻止切换:Claude Code 会显示其 stderr 并应用切换,如[其他退出码](#other-exit-codes)中所述。3654以 0 或 2 以外的代码退出且未打印 JSON 决策的 hook 属于非阻塞错误,如[其他退出码](#other-exit-codes)中所述。

3566 3655 

3567<h3 id="postmodelswitch">3656<h3 id="postmodelswitch">

3568 PostModelSwitch3657 PostModelSwitch


4278异步 hooks 与同步 hooks 相比有额外的约束:4367异步 hooks 与同步 hooks 相比有额外的约束:

4279 4368 

4280* Hook 输出在下一个对话轮次传递。如果会话空闲,响应等待直到下一个用户交互。例外:退出代码为 2 的 `asyncRewake` hook 即使在会话空闲时也会立即唤醒 Claude。4369* Hook 输出在下一个对话轮次传递。如果会话空闲,响应等待直到下一个用户交互。例外:退出代码为 2 的 `asyncRewake` hook 即使在会话空闲时也会立即唤醒 Claude。

4281* 每次执行创建一个单独的后台进程。同一异步 hook 的多个触发之间没有去重。4370* 每次执行创建一个单独的后台进程。

4282 4371 

4283<h2 id="security-considerations">4372<h2 id="security-considerations">

4284 安全考虑4373 安全考虑

hooks-guide.md +14 −11

Details

242 242 

243要测试 hook,请要求 Claude 向 JavaScript 文件添加一行带有单引号字符串的代码,然后打开该文件:使用 Prettier 的默认设置,hook 会将它们重写为双引号。243要测试 hook,请要求 Claude 向 JavaScript 文件添加一行带有单引号字符串的代码,然后打开该文件:使用 Prettier 的默认设置,hook 会将它们重写为双引号。

244 244 

245当 hook 成功时,Claude Code 在对话中不显示任何内容。要确认 hook 已运行,请检查编辑的文件是否已重新格式化,或参阅[调试技术](#debug-techniques)。245当 hook 成功时,Claude Code 在对话中不显示任何内容。要确认 hook 已运行,请检查编辑的文件是否已重新格式化,或参阅[检查 hook 执行了什么](#check-what-a-hook-did)。

246 246 

247要重新格式化特定文件,无论它如何更改,包括当 `Bash` 命令重写它时,请改用 [FileChanged](/docs/zh-CN/hooks#filechanged) hook。247要重新格式化特定文件,无论它如何更改,包括当 `Bash` 命令重写它时,请改用 [FileChanged](/docs/zh-CN/hooks#filechanged) hook。

248 248 


979}979}

980```980```

981 981 

982端点应使用与命令 hooks 相同的 [输出格式](/docs/zh-CN/hooks#json-output) 返回 JSON 响应体。要阻止工具调用,返回 2xx 响应,包含适当的 `hookSpecificOutput` 字段。HTTP 状态代码本身无法阻止操作。982您的端点使用与命令 hook 相同的[输出格式](/docs/zh-CN/hooks#json-output)返回 JSON 响应体,Claude Code 还会检查响应状态:

983 

984* **2xx 状态**:要阻止工具调用,请在响应体中返回相应的 `hookSpecificOutput` 字段。

985* **任何其他状态,或请求失败**:Claude Code 会报告[非阻塞错误](/docs/zh-CN/hooks#exit-code-output)并允许操作继续。要让失败的端点阻止该操作,请在 hook 上设置 [`onFailure: "block"`](/docs/zh-CN/hooks#block-the-action-when-a-hook-fails)。

983 986 

984标头值支持使用 `$VAR_NAME` 或 `${VAR_NAME}` 语法的环境变量插值。仅解析 `allowedEnvVars` 数组中列出的变量;所有其他 `$VAR` 引用保持为空。987标头值支持使用 `$VAR_NAME` 或 `${VAR_NAME}` 语法的环境变量插值。仅解析 `allowedEnvVars` 数组中列出的变量;所有其他 `$VAR` 引用保持为空。

985 988 


1103 1106 

1104当你的 hook 返回 `permissionDecision` 或 `additionalContext` 在顶级而不是在 `hookSpecificOutput` 内部时,JSON 仍然解析,Claude Code 忽略错误放置的字段而不报告错误。要查看它忽略了哪些字段,使用 `claude --debug` 启动 Claude Code 并在[调试日志](/docs/zh-CN/hooks#debug-hooks)中搜索 `Hook JSON output had unrecognized keys`。1107当你的 hook 返回 `permissionDecision` 或 `additionalContext` 在顶级而不是在 `hookSpecificOutput` 内部时,JSON 仍然解析,Claude Code 忽略错误放置的字段而不报告错误。要查看它忽略了哪些字段,使用 `claude --debug` 启动 Claude Code 并在[调试日志](/docs/zh-CN/hooks#debug-hooks)中搜索 `Hook JSON output had unrecognized keys`。

1105 1108 

1106<h3 id="debug-techniques">1109<h3 id="check-what-a-hook-did">

1107 调试技术1110 检查 hook 的执行结果

1108</h3>1111</h3>

1109 1112 

1110按 `Ctrl+O` 打开成绩单视图以检查 hook 运行的结果:1113按 `Ctrl+O` 打开会话记录视图,查找 hook 的结果:

1111 1114 

1112* **成功运行**:你看不到任何内容,除非 hook 的 JSON 显示某些内容,例如 `systemMessage` 或 Stop hook 反馈。1115* **成功**:您看不到任何内容,除非 hook 的 JSON 显示了某些内容,例如 `systemMessage` 或 Stop hook 反馈。

1113 * 要确认 hook 已运行,检查其效果,例如重新格式化的文件,或按如下所述打开调试日志并再次触发 hook1116 * 要确认 hook 已运行,请检查其效果,例如被重新格式化的文件

1114* **阻止错误**:在大多数事件上,你会看到 hook 的反馈。当 hook 的 JSON 做出阻止决策时,反馈是该决策的原因;否则它是 hook 的 stderr。在少数事件上,例如 `ConfigChange` 和 `Elicitation`,阻止不会显示消息。1117* **阻止错误**:在大多数事件上,您会看到随阻止一起返回的消息,例如 `Blocked: rm commands are not allowed`。在少数事件上,例如 `ConfigChange` 和 `Elicitation`,您不会看到消息。[退出码 2](/docs/zh-CN/hooks#exit-code-2) 介绍了该消息的来源。

1115* **非阻止错误**:操作继续进行,你会看到 `<hook name> hook error` 通知,其中包含简短说明,例如 stderr 的第一行,前缀为 `Failed with non-blocking status code:`,或 JSON 验证或解析消息。1118* **非阻止错误**:您会看到 `<hook name> hook error` 通知,其中包含简短说明,例如 `Failed with non-blocking status code:` 之后的 stderr 第一行,或 JSON 验证或解析消息。操作会继续进行。

1116 1119 

1117哪些退出代码和 JSON 组合产生每个结果,包括每个事件的例外,在参考的[退出代码输出](/docs/zh-CN/hooks#exit-code-output)部分中定义。1120要查询特定退出码和 stdout 对应的结果(包括各事件的例外情况),请参阅参考文档中的[退出码输出](/docs/zh-CN/hooks#exit-code-output)。

1118 1121 

1119有关完整的执行详情,包括哪些 hooks 匹配、它们的退出代码、stdout 和 stderr,请阅读调试日志。使用 `claude --debug-file /tmp/claude.log` 启动 Claude Code 以写入已知路径,然后在另一个终端中 `tail -f /tmp/claude.log`。如果你启动时没有该标志,在会话中运行 `/debug` 以启用日志记录并找到日志路径。1122有关完整的执行详情,包括 hook 的退出码、stdout 和 stderr,请阅读调试日志。使用 `claude --debug-file /tmp/claude.log` 启动 Claude Code 以写入已知路径,然后在另一个终端中运行 `tail -f /tmp/claude.log`。如果您启动时没有使用该标志,请在会话中运行 `/debug` 以启用日志记录并找到日志路径。

1120 1123 

1121<h2 id="learn-more">1124<h2 id="learn-more">

1122 了解更多1125 了解更多

Details

216| `^` | 第一个非空白字符 |216| `^` | 第一个非空白字符 |

217| `gg` | 输入开始 |217| `gg` | 输入开始 |

218| `G` | 最后一行的行首 |218| `G` | 最后一行的行首 |

219| `f{char}` | 跳转到下一个字符出现位置 |219| `f{char}` | 跳转到当前行中该字符的下一个出现位置 |

220| `F{char}` | 跳转到上一个字符出现位置 |220| `F{char}` | 跳转到当前行中该字符的上一个出现位置 |

221| `t{char}` | 跳转到下一个字符出现位置之前 |221| `t{char}` | 跳转到当前行中该字符的下一个出现位置之前 |

222| `T{char}` | 跳转到上一个字符出现位置之后 |222| `T{char}` | 跳转到当前行中该字符的上一个出现位置之后 |

223| `;` | 重复上一个 f/F/t/T 动作 |223| `;` | 重复上一个 f/F/t/T 动作 |

224| `,` | 反向重复上一个 f/F/t/T 动作 |224| `,` | 反向重复上一个 f/F/t/T 动作 |

225| `/` | 打开反向历史搜索,与 `Ctrl+R` 相同。空搜索提示显示提示:按 `Esc` 然后 `i` 然后 `/` 来打开命令菜单 |225| `/` | 打开反向历史搜索,与 `Ctrl+R` 相同。空搜索提示显示提示:按 `Esc` 然后 `i` 然后 `/` 来打开命令菜单 |


239| `dd` | 删除行 |239| `dd` | 删除行 |

240| `D` | 删除到行尾 |240| `D` | 删除到行尾 |

241| `dw`/`de`/`db` | 删除单词/到末尾/向后 |241| `dw`/`de`/`db` | 删除单词/到末尾/向后 |

242| `df{char}`/`dt{char}` | 删除到并包括,或删除到下一个字符出现位置 |242| `df{char}`/`dt{char}` | 删除到当前行中该字符的下一个出现位置(包括或不包括该字符) |

243| `dj`/`dk` | 删除当前行和下方或上方的行 |243| `dj`/`dk` | 删除当前行和下方或上方的行 |

244| `dgg`/`dG` | 从当前行删除到第一行或最后一行 |244| `dgg`/`dG` | 从当前行删除到第一行或最后一行 |

245| `d0`/`c0`/`y0` | 从光标删除、更改或复制回行首。需要 Claude Code v2.1.281 或更高版本 |245| `d0`/`c0`/`y0` | 从光标删除、更改或复制回行首。需要 Claude Code v2.1.281 或更高版本 |


852 问题参考链接852 问题参考链接

853</h2>853</h2>

854 854 

855当 Claude 提到一个问题为 `owner/repo#123` 时,只要你的终端支持超链接,你就可以点击该参考来打开它。如果 Claude Code 没有检测到你的终端支持超链接,请设置 [`FORCE_HYPERLINK`](/docs/zh-CN/env-vars) 为 `1` 来打开链接,或设置为 `0` 来保持参考为纯文本。855当 Claude 以 `owner/repo#123` 的形式提到一个问题时,只要您的终端支持超链接,您就可以点击该参考来打开它。如果 Claude Code 没有检测到您的终端支持超链接,请将 [`FORCE_HYPERLINK`](/docs/zh-CN/env-vars) 设置为 `1` 来启用链接,或设置为 `0` 来保持参考为纯文本。

856 856 

857你只能获得两部分 `owner/repo#123` 形式的链接。这些保持为纯文本:857只有两部分的 `owner/repo#123` 形式才会生成链接。以下情况保持为纯文本:

858 858 

859* 一个单独的 `#123`859* 单独的 `#123`

860* 一个嵌套的 GitLab 路径,例如 `group/subgroup/project#123`860* 嵌套的 GitLab 路径,例如 `group/subgroup/project#123`

861* 代码跨度或代码块内的任何参考861* 代码跨度或代码块内的任何参考

862* 长度超过约 1,000 行或 100,000 个字符的回复中的任何参考

862 863 

863Claude Code 根据它从你的 git remote 识别的仓库主机来构建链接,而不是根据参考命名的仓库:864Claude Code 根据它从您的 git remote 识别出的仓库主机来构建链接,而不是根据参考所指定的仓库:

864 865 

865| 你的仓库的主机 | `owner/repo#123` 链接到 |866| 您的仓库的主机 | `owner/repo#123` 链接到 |

866| :- | :- |867| :- | :- |

867| github.com、GitHub Enterprise 主机或下面未列出的任何主机 | `https://<host>/owner/repo/issues/123` |868| github.com、GitHub Enterprise 主机或下面未列出的任何主机 | `https://<host>/owner/repo/issues/123` |

868| gitlab.com | `https://gitlab.com/owner/repo/-/issues/123` |869| gitlab.com | `https://gitlab.com/owner/repo/-/issues/123` |

mcp.md +1 −1

Details

367 367 

368在 v2 上,Claude Code 还会:368在 v2 上,Claude Code 还会:

369 369 

370* 询问 HTTP 和 stdio 服务器是否支持较新的修订版,并与支持的服务器一起使用它。在获取功能标志的会话中,它还会询问 claude.ai 连接器服务器。它与 v1 一样连接到其他所有服务器。370* 询问 HTTP、stdio 和 claude.ai 连接器服务器是否支持较新的修订版,并与支持的服务器一起使用它。它与 v1 一样连接到其他所有服务器。

371* 通过 [它保持打开的流](#notification-streams-on-the-v2-runtime) 从使用较新修订版的服务器接收 `list_changed` 通知。371* 通过 [它保持打开的流](#notification-streams-on-the-v2-runtime) 从使用较新修订版的服务器接收 `list_changed` 通知。

372* 不注册在较新修订版上连接的 [频道](#push-messages-with-channels) 服务器,因为该修订版无法携带频道消息。372* 不注册在较新修订版上连接的 [频道](#push-messages-with-channels) 服务器,因为该修订版无法携带频道消息。

373* 当授权响应指明意外的发行者时,使 [MCP OAuth 登录](#authenticate-with-remote-mcp-servers) 失败。373* 当授权响应指明意外的发行者时,使 [MCP OAuth 登录](#authenticate-with-remote-mcp-servers) 失败。

Details

599 599 

600在通过 `/login` 登录到[Claude 应用网关](/docs/zh-CN/claude-apps-gateway)的会话中,CLI 会使用已认证身份标记导出:`user.id` 是 IdP 主体,`user.email` 是已登录的电子邮件,`user.groups` 以逗号分隔的字符串形式携带 IdP 组成员身份。每个导出还携带 `identity.source: gateway-oidc`。网关身份最后应用,因此通过 `OTEL_RESOURCE_ATTRIBUTES` 设置的 `user.*` 和 `identity.*` 键在这些会话上被忽略。600在通过 `/login` 登录到[Claude 应用网关](/docs/zh-CN/claude-apps-gateway)的会话中,CLI 会使用已认证身份标记导出:`user.id` 是 IdP 主体,`user.email` 是已登录的电子邮件,`user.groups` 以逗号分隔的字符串形式携带 IdP 组成员身份。每个导出还携带 `identity.source: gateway-oidc`。网关身份最后应用,因此通过 `OTEL_RESOURCE_ATTRIBUTES` 设置的 `user.*` 和 `identity.*` 键在这些会话上被忽略。

601 601 

602<Note>

603 Claude Code 在开发者登录之前记录的事件不携带网关身份。当 Claude Code 以未登录网关的状态打开会话时(例如在[网关结束登录](/docs/zh-CN/errors#cloud-gateway-session-expired)之后),登录前记录的启动事件会携带匿名 `user.id`,且不含 `identity.source`。这些事件包括 [`managed_settings_resolved`](#managed-settings-resolved-event)、[`plugin_loaded`](#plugin-loaded-event) 和 [`mcp_server_connection`](#mcp-server-connection-event)。

604</Note>

605 

602对于通过网关连接的 Claude Desktop 和 Cowork 会话上的身份属性,请参阅[网关 `telemetry` 参考](/docs/zh-CN/claude-apps-gateway-config#telemetry)。606对于通过网关连接的 Claude Desktop 和 Cowork 会话上的身份属性,请参阅[网关 `telemetry` 参考](/docs/zh-CN/claude-apps-gateway-config#telemetry)。

603 607 

604事件另外包括以下属性。这些永远不会附加到指标,因为它们会导致无限的基数:608事件另外包括以下属性。这些永远不会附加到指标,因为它们会导致无限的基数:


917* `error`:错误消息921* `error`:错误消息

918* `status_code`:HTTP 状态代码作为数字。对于非 HTTP 错误(如连接失败)不存在。922* `status_code`:HTTP 状态代码作为数字。对于非 HTTP 错误(如连接失败)不存在。

919* `duration_ms`:请求持续时间(以毫秒为单位)923* `duration_ms`:请求持续时间(以毫秒为单位)

920* `attempt`:进行的总尝试次数,包括初始请求(`1` 表示没有重试发生)924* `attempt`:已进行的尝试次数,包括初始请求。[检测重试耗尽](#detect-retry-exhaustion)说明了计数何时重新开始

921* `request_id`:API 请求 ID,例如 `"req_011..."`,在[事件关联属性](#event-correlation-attributes)下描述。925* `request_id`:API 请求 ID,例如 `"req_011..."`,在[事件关联属性](#event-correlation-attributes)下描述。

922* `client_request_id`:作为 `x-client-request-id` 请求头发送的客户端生成的 UUID。即使在超时或连接错误等失败从未产生服务器 `request_id` 时也可用;请参阅[事件关联属性](#event-correlation-attributes)表了解何时存在。需要 Claude Code v2.1.214 或更高版本926* `client_request_id`:作为 `x-client-request-id` 请求头发送的客户端生成的 UUID。即使在超时或连接错误等失败从未产生服务器 `request_id` 时也可用;请参阅[事件关联属性](#event-correlation-attributes)表了解何时存在。需要 Claude Code v2.1.214 或更高版本

923* `speed`:`"fast"` 或 `"normal"`,指示快速模式是否活跃927* `speed`:`"fast"` 或 `"normal"`,指示快速模式是否活跃


1190 1194 

1191当 Claude Code 解析提示中的 `@` 提及时记录。并非每个提及都发出事件:早期退出路径如权限拒绝、超大文件、PDF 参考附件和目录列表失败返回而不记录。1195当 Claude Code 解析提示中的 `@` 提及时记录。并非每个提及都发出事件:早期退出路径如权限拒绝、超大文件、PDF 参考附件和目录列表失败返回而不记录。

1192 1196 

1197每次 Claude Code 读取提示词时,对于 `mention_type` 为 `"agent"` 的事件最多记录 100 个,对于 `"mcp_resource"` 也最多记录 100 个。超出任一限制的提及仍会被解析,但不会发出事件。

1198 

1193**事件名称**:`claude_code.at_mention`1199**事件名称**:`claude_code.at_mention`

1194 1200 

1195**属性**:1201**属性**:


1528 1534 

1529Claude Code 在内部重试失败的 API 请求,仅在放弃后才发出单个 `claude_code.api_error` 事件,因此事件本身是该请求的终端信号。中间重试尝试不会作为单独的事件记录。1535Claude Code 在内部重试失败的 API 请求,仅在放弃后才发出单个 `claude_code.api_error` 事件,因此事件本身是该请求的终端信号。中间重试尝试不会作为单独的事件记录。

1530 1536 

1531事件上的 `attempt` 属性记录进行的总尝试次数。`CLAUDE_CODE_MAX_RETRIES` 默认为 10,上限为 15。在 v2.1.199 或更高版本上,您可以设置 `CLAUDE_CODE_RETRY_WATCHDOG` 来提高默认值并移除上限。1537事件上的 `attempt` 属性记录尝试次数。`CLAUDE_CODE_MAX_RETRIES` 默认为 10,上限为 15。在 v2.1.199 或更高版本上,您可以设置 `CLAUDE_CODE_RETRY_WATCHDOG` 来提高默认值并移除上限。

1538 

1539当请求在瞬时错误上耗尽所有重试时,`attempt` 最多等于该有效限制加一:默认为 11。

1532 1540 

1533当请求在瞬时错误上耗尽所有重试时,`attempt` 等于该有效限制加一:默认为 11,除非设置了看门狗,否则永远不超过 16。较低的值表示不可重试的错误,例如 `400` 响应,或具有自己较小重试预算的原因。例如,Claude Code 最多重试两次加载 AWS 或 Google Cloud 凭证的失败。1541较低的值仍可能表示重试已耗尽:每次 Claude Code 在流式传输失败后重新发出请求时,`attempt` 都会从 `1` 重新开始计数。

1534 1542 

1535要区分从一个恢复的会话与停滞的会话,按 `session.id` 分组事件,并检查错误后是否存在更晚的 `api_request` 事件。1543要区分从一个恢复的会话与停滞的会话,按 `session.id` 分组事件,并检查错误后是否存在更晚的 `api_request` 事件。

1536 1544 

Details

91| `-y, --yes` | 接受显示的安装命令,不出现 `Run this command now?` 提示。在 Claude Code 会话内运行命令时(例如从 Bash 工具或 hook 运行)会被忽略。需要 Claude Code v2.1.229 或更高版本 |91| `-y, --yes` | 接受显示的安装命令,不出现 `Run this command now?` 提示。在 Claude Code 会话内运行命令时(例如从 Bash 工具或 hook 运行)会被忽略。需要 Claude Code v2.1.229 或更高版本 |

92| `--accept-command <sha256>` | 代替 `-y`,接受之前某次 [`--json` 运行](#plugin-json-result)在 `shownCommand` 中报告了其 `sha256` 的显示安装命令。不能与 `-y` 组合使用。请参阅[接受显示的安装命令](#accept-a-displayed-install-command)。需要 Claude Code v2.1.271 或更高版本 |92| `--accept-command <sha256>` | 代替 `-y`,接受之前某次 [`--json` 运行](#plugin-json-result)在 `shownCommand` 中报告了其 `sha256` 的显示安装命令。不能与 `-y` 组合使用。请参阅[接受显示的安装命令](#accept-a-displayed-install-command)。需要 Claude Code v2.1.271 或更高版本 |

93| `--json` | 将结果作为一个 JSON 对象打印在 stdout 的最后一行,而不是人类可读的消息,供脚本使用。请参阅 [JSON 结果格式](#plugin-json-result)。需要 Claude Code v2.1.268 或更高版本 |93| `--json` | 将结果作为一个 JSON 对象打印在 stdout 的最后一行,而不是人类可读的消息,供脚本使用。请参阅 [JSON 结果格式](#plugin-json-result)。需要 Claude Code v2.1.268 或更高版本 |

94| `--marketplace <source>` | 从位于 `<source>` 的市场安装以裸名称指定的 `<plugin>`,如果您尚未添加该市场,则先添加它。请参阅[通过一条命令添加市场并安装](/docs/zh-CN/plugins/install#add-a-marketplace-and-install-in-one-command)。需要 Claude Code v2.1.292 或更高版本 |

94 95 

95在 shell 中运行 `claude plugin install --help`,可查看您的版本支持的所有选项。96在 shell 中运行 `claude plugin install --help`,可查看您的版本支持的所有选项。

96 97 

Details

413 用户如何接受 headersHelper 命令413 用户如何接受 headersHelper 命令

414</h3>414</h3>

415 415 

416用户每次自己安装或更新该一个插件时接受插件条目的命令。他们从 `/plugin` 中的插件自己的视图或使用 `claude plugin install` 或 `claude plugin update` 执行此操作。Claude Code 显示命令和存档 URL,并仅在用户接受后运行命令。416用户每次单独安装或更新该插件时,都需要接受插件条目的命令。Claude Code 会显示命令和存档 URL,并仅在用户接受后运行命令。

417 

418用户可以在终端中的 Claude Code 会话内、在未运行会话的 shell 中,或在 VS Code 扩展中安装或更新插件:

419 

420* **终端会话**:从 `/plugin` 中该插件自己的视图。

421* **Shell**:使用 `claude plugin install` 或 `claude plugin update`。

422* **VS Code 扩展**:从 [**Manage plugins** 对话框](/docs/zh-CN/vs-code#manage-plugins),需要扩展版本 2.1.290 或更高版本。

417 423 

418在非交互式 shell 中,传递 [`--yes`](/docs/zh-CN/plugins/cli-reference#plugin-install) 以接受命令。要仅接受之前 `--json` 运行显示的命令,传递 [`--accept-command`](/docs/zh-CN/plugins/cli-reference#plugin-install) 与运行报告的 `sha256`。424在非交互式 shell 中,传递 [`--yes`](/docs/zh-CN/plugins/cli-reference#plugin-install) 以接受命令。要仅接受之前 `--json` 运行显示的命令,传递 [`--accept-command`](/docs/zh-CN/plugins/cli-reference#plugin-install) 与运行报告的 `sha256`。

419 425 

420Claude Code 仅运行它显示的命令,对于它显示的存档 URL。如果条目的命令或存档 URL 在中间改变,Claude Code 拒绝安装或更新。查询字符串中的更改单独不计数。426Claude Code 仅针对它显示的存档 URL 运行它显示的命令。如果条目的命令或存档 URL 在此期间发生了变化,Claude Code 会拒绝安装或更新。仅查询字符串的更改不计在内,但在 VS Code 扩展中或使用 `--accept-command` 时除外。

421 427 

422<h3 id="installs-and-updates-that-refuse-the-command-instead-of-asking">428<h3 id="installs-and-updates-that-refuse-the-command-instead-of-asking">

423 拒绝命令而不是询问的安装和更新429 拒绝命令而不是询问的安装和更新

Details

189 189 

190* **Scope**:默认为用户范围。传递 `--scope project` 或 `--scope local` 以更改它。190* **Scope**:默认为用户范围。传递 `--scope project` 或 `--scope local` 以更改它。

191* **When the plugins load**:它安装的插件在您下次启动 Claude Code 时加载,或当您在已打开的会话中运行 `/reload-plugins` 时加载。191* **When the plugins load**:它安装的插件在您下次启动 Claude Code 时加载,或当您在已打开的会话中运行 `/reload-plugins` 时加载。

192* **The marketplace must be added first**:在没有人打开交互式 Claude Code 会话的机器上,官方市场未注册,因此从它安装的脚本在安装前运行 `claude plugin marketplace add anthropics/claude-plugins-official`。192* **The marketplace on a new machine**:在还没有人打开过交互式 Claude Code 会话的机器上,官方市场未注册,因此从它安装的脚本在安装前运行 `claude plugin marketplace add anthropics/claude-plugins-official`。请参阅[从 shell 添加和安装](#add-and-install-from-your-shell)。

193 193 

194```bash theme={null}194```bash theme={null}

195claude plugin install formatter@your-org --scope project195claude plugin install formatter@your-org --scope project


232 Add a marketplace and install in one command232 Add a marketplace and install in one command

233</h3>233</h3>

234 234 

235要从您尚未添加的市场安装插件,请在 Claude Code 会话中运行 `/plugin install` 并使用 `--marketplace` 命名市场来源。需要 Claude Code v2.1.275 或更高版本。235要从您尚未添加的市场安装插件,请在安装命令中使用 `--marketplace` 命名市场来源,可以在会话中或从 shell 中执行。来源采用 [the same forms as `/plugin marketplace add`](#add-a-marketplace),例如 GitHub `owner/repo`、git URL 或本地路径。单独给出插件名称,不带 `@marketplace` 后缀。

236 

237<h4 id="add-and-install-in-a-session">

238 Add and install in a session

239</h4>

240 

241在 Claude Code 会话中运行 `/plugin install`,并指定插件和来源。需要 Claude Code v2.1.275 或更高版本。在会话中,来源不能包含空格。

236 242 

237```text theme={null}243```text theme={null}

238/plugin install deploy-helper --marketplace your-org/plugins244/plugin install deploy-helper --marketplace your-org/plugins

239```245```

240 246 

241来源采用 [the same forms as `/plugin marketplace add`](#add-a-marketplace),例如 GitHub `owner/repo`、git URL 或本地路径,除了它不能包含空格。单独给出插件名称,不带 `@marketplace` 后缀。

242 

243如果您尚未添加该市场,Claude Code 显示它解析的来源并要求您在添加前确认。一旦添加了市场,插件的详细信息打开,您选择 [installation scope](#install-a-plugin)。如果来源与您已添加的市场匹配,Claude Code 跳过确认并在该市场中打开插件的详细信息。247如果您尚未添加该市场,Claude Code 显示它解析的来源并要求您在添加前确认。一旦添加了市场,插件的详细信息打开,您选择 [installation scope](#install-a-plugin)。如果来源与您已添加的市场匹配,Claude Code 跳过确认并在该市场中打开插件的详细信息。

244 248 

249<h4 id="add-and-install-from-your-shell">

250 Add and install from your shell

251</h4>

252 

253在 shell 中,无需启动会话,运行 `claude plugin install` 并指定插件和来源。需要 Claude Code v2.1.292 或更高版本。

254 

255```bash theme={null}

256claude plugin install deploy-helper --marketplace your-org/plugins

257```

258 

259shell 命令添加市场时没有确认步骤。您已从该来源添加的市场会被重用。新市场会经过与 `claude plugin marketplace add` 相同的 [organization policy checks](/docs/zh-CN/plugins/org#restrict-what-users-can-install) 后添加,并且即使您传递 `--scope project`,也会在您的用户设置中声明。

260 

261如果您尚未添加该市场,该命令会打印 `Successfully added marketplace: <name> (declared in user settings)`,然后[安装插件](#install-from-your-shell)。

262 

245<h3 id="add-a-private-marketplace">263<h3 id="add-a-private-marketplace">

246 Add a private marketplace264 Add a private marketplace

247</h3>265</h3>

Details

185| 将 `official` 放在 `claude` 或 `anthropic` 旁边,例如 `official-claude-tools` | 错误 |185| 将 `official` 放在 `claude` 或 `anthropic` 旁边,例如 `official-claude-tools` | 错误 |

186| 在其他任何地方有 `claude`、`anthropic` 或 `anthropics` 作为整个单词,例如 `mcp-for-claude` | 警告 |186| 在其他任何地方有 `claude`、`anthropic` 或 `anthropics` 作为整个单词,例如 `mcp-for-claude` | 警告 |

187 187 

188错误读作 `Plugin name "<name>" is reserved: it passes as one of Anthropic's own`,警告读作 `Plugin name "<name>" reads as one of Anthropic's own`。`claude plugin init` 和 `claude plugin tag` 拒绝引发错误的名称。仅这些命令检查名称。Claude Code 仍然安装和加载其名称被拒绝的 plugin。188错误读作 `Plugin name "<name>" is reserved: it passes as one of Anthropic's own`,警告读作 `Plugin name "<name>" reads as one of Anthropic's own`。`claude plugin init` 和 `claude plugin tag` 拒绝引发错误的名称。Claude Code 仍然安装和加载其名称被拒绝的插件。

189 189 

190<h3 id="displayname">190<h3 id="displayname">

191 `displayName`191 `displayName`

Details

64 64 

65| 字段 | 类型 | 描述 |65| 字段 | 类型 | 描述 |

66| :- | :- | :- |66| :- | :- | :- |

67| `name` | string | 市场标识符:字母、数字、`.`、`_` 和 `-`,以字母或数字开头,且不含 `..`。`claude plugin validate` 会使任何其他名称验证失败,因为 Claude Code 无法从使用此类名称的市场安装插件。用户安装插件时,会在 [插件 ID](/docs/zh-CN/plugins/loading#find-where-a-plugin-came-from)(例如 `my-plugin@my-marketplace`)中的 `@` 之后输入该名称。请参阅 [保留名称](#reserved-names) |67| `name` | string | 市场标识符:字母、数字、`.`、`_` 和 `-`,以字母或数字开头,且不含 `..`。`claude plugin validate` 会使任何其他名称验证失败,因为 Claude Code [无法从使用此类名称的市场安装插件](/docs/zh-CN/plugins/troubleshooting#cannot-install-plugins-from-a-marketplace-with-this-name)。用户安装插件时,会在 [插件 ID](/docs/zh-CN/plugins/loading#find-where-a-plugin-came-from)(例如 `my-plugin@my-marketplace`)中的 `@` 之后输入该名称。请参阅 [保留名称](#reserved-names) |

68| `owner` | object | 维护者信息。`name` 是必需的;`email` 和 `url` 是可选的 |68| `owner` | object | 维护者信息。`name` 是必需的;`email` 和 `url` 是可选的 |

69| `plugins` | array | [插件条目](#plugin-entries)。每个条目单独验证,因此一个无效条目不会导致 marketplace 失败 |69| `plugins` | array | [插件条目](#plugin-entries)。每个条目单独验证,因此一个无效条目不会导致 marketplace 失败 |

70| `$schema` | string | JSON Schema URL 用于编辑器自动完成。在加载时忽略 |70| `$schema` | string | JSON Schema URL 用于编辑器自动完成。在加载时忽略 |

Details

138| `$.mcp.call` | 在连接的 MCP 服务器上调用工具,在会话的权限规则下 |138| `$.mcp.call` | 在连接的 MCP 服务器上调用工具,在会话的权限规则下 |

139| `$.model.complete` | 使用用户的计划或 API 密钥进行模型调用 |139| `$.model.complete` | 使用用户的计划或 API 密钥进行模型调用 |

140| `$.prompt.submit` | 提交提示,可以将其作为用户自己的话语发送 |140| `$.prompt.submit` | 提交提示,可以将其作为用户自己的话语发送 |

141| `$.session.send` | 发送另一个会话或子代理的 Claude 读取的消息 |141| `$.session.send` | 发送另一个会话、子代理或[队友](/docs/zh-CN/agent-teams)的 Claude 读取的消息 |

142 142 

143在 `hooks:` 行中,[`tool.call`](/docs/zh-CN/plugins/mods/reference#tools) 和 [`prompt.submit`](/docs/zh-CN/plugins/mods/reference#prompts-and-what-claude-reads) 意味着 mod 看到每个工具调用和每个提示,并可以更改它们。[`session.append`](/docs/zh-CN/plugins/mods/reference#session) 意味着 mod 可以在存储之前重写对话的每一行。[`ui.render{component=AskUserQuestion}`](/docs/zh-CN/plugins/mods/interface#change-what-claude-code-already-draws) 意味着 mod 可以重新绘制 Claude 用来询问用户问题的对话框。`tool.check` 意味着 mod 可以在权限提示出现之前批准或拒绝工具调用。[了解默认情况下会发生什么](#know-what-happens-by-default)列出了您的哪些规则和 hooks 优先于其答案。143在 `hooks:` 行中,[`tool.call`](/docs/zh-CN/plugins/mods/reference#tools) 和 [`prompt.submit`](/docs/zh-CN/plugins/mods/reference#prompts-and-what-claude-reads) 意味着 mod 看到每个工具调用和每个提示,并可以更改它们。[`session.append`](/docs/zh-CN/plugins/mods/reference#session) 意味着 mod 可以在存储之前重写对话的每一行。[`ui.render{component=AskUserQuestion}`](/docs/zh-CN/plugins/mods/interface#change-what-claude-code-already-draws) 意味着 mod 可以重新绘制 Claude 用来询问用户问题的对话框。`tool.check` 意味着 mod 可以在权限提示出现之前批准或拒绝工具调用。[了解默认情况下会发生什么](#know-what-happens-by-default)列出了您的哪些规则和 hooks 优先于其答案。

144 144 

Details

79 调用模型79 调用模型

80</h2>80</h2>

81 81 

82mod 可以向模型提出自己的问题,在对话之外,用于排序或总结文本等小工作。`$.model.complete` 使用您的会话凭据向模型发送一个提示,并解析为回复。它没有对话历史。82mod 可以向模型发送自己的请求,用于分类或总结文本等小任务。`$.model.complete` 单独发送您的提示词,而 `$.model.fork({ prompt })` 发送当前对话,并将您的提示词附加在末尾。

83 

84下表比较了每种请求包含的内容:

85 

86| 请求中的内容 | `$.model.complete` | `$.model.fork` |

87| :- | :- | :- |

88| 模型 | 您传入的 `model` | 会话的模型 |

89| 系统提示词 | 一个简短的[归属块](/docs/zh-CN/llm-gateway-protocol#system-prompt-attribution-block),然后是您传入的 `system`(如果有) | 会话的系统提示词 |

90| 消息 | 一条用户消息,即您的 `prompt` | 迄今为止的对话,然后是作为用户消息的您的 `prompt` |

91| CLAUDE.md 和其他项目上下文 | 不包含 | 包含,与对话的最后一个请求相同 |

92| 工具 | 无 | Claude 的工具,但模型无法调用它们 |

93 

94fork 会重复对话的最后一个请求,因此在对话仍处于缓存中时,Claude API 会从[提示缓存](/docs/zh-CN/prompt-caching)中提供其大部分内容。

95 

96这两种调用都使用会话的凭据,因此费用计入用户的套餐、API 密钥或云提供商。[您的构建的类型](/docs/zh-CN/plugins/mods/create#get-the-types-for-your-build)记录了每个 `$.model` 方法。

97 

98<h3 id="send-one-prompt">

99 发送单个提示词

100</h3>

101 

102向 `$.model.complete` 传入 `model` 和 `prompt`。`prompt` 会成为用户消息。要向模型提供指令(例如角色或输出格式),还需传入 `system`,它会成为系统提示词。

83 103 

84此 hook 通过要求小型模型标记在其后键入的文本来回答 `/triage` 命令([注册为命令](#add-a-command)):104此 hook 通过要求小型模型标记在其后键入的文本来回答 `/triage` 命令([注册为命令](#add-a-command)):

85 105 


100})120})

101```121```

102 122 

103当您运行 `/triage the export button does nothing` 时,mod 将该文本发送到模型并打印其答案,例如 `Label: bug`。Claude 的对话不是请求的一部分。当模型不回答时,标签是 `unknown`。123当您运行 `/triage the export button does nothing` 时,mod 将该文本发送到模型并打印其答案,例如 `Label: bug`。当模型不回答时,标签是 `unknown`。

124 

125Claude API 失败不会拒绝调用,因此请检查 `r.isAnswered`,并在其为 `false` 时读取 `r.reason`。对于 Claude Code 不会发送的请求,例如您的组织阻止的模型,调用会被拒绝。

126 

127[您的构建的类型](/docs/zh-CN/plugins/mods/create#get-the-types-for-your-build)列出了其他选项,例如 `effort`,[限制](/docs/zh-CN/plugins/mods/reference#limits)给出了 `maxTokens` 的默认值。

128 

129<h3 id="use-prompt-caching">

130 使用提示缓存

131</h3>

132 

133`$.model.complete` 支持 Claude API 的[提示缓存](https://platform.claude.com/docs/en/build-with-claude/prompt-caching)。API 会缓存请求的开头部分(称为前缀),直到您设置的[缓存断点](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#explicit-cache-breakpoints)为止。当每次调用都以相同的长静态内容(例如指令或参考资料)开头时,请在该内容的末尾设置断点。之后的调用就会从缓存中读取这部分内容,而无需为其支付完整的输入价格。

134 

135要设置断点,请将 `prompt` 作为 `{ text }` 块的数组而不是字符串传入,并在静态内容的最后一个块上添加 `cache: true`。Claude Code 会使用 API 的 `cache_control` 字段发送该块。`system` 也接受相同的数组形式。要在两者之间做出选择,请参阅[在 `prompt` 和 `system` 之间选择](#choose-between-prompt-and-system)。

136 

137<Note>

138 块数组需要 Claude Code v2.1.292 或更高版本。早期版本会拒绝 `prompt` 中的数组,并报出以 `takes { model, prompt } (host check)` 结尾的错误,而 `system` 中的数组则会被排除在请求之外。

139</Note>

140 

141此版本的 [`/triage` hook](#send-one-prompt) 在要标记的文本之前发送一组较长的标记规则,并在规则之后设置断点。`RULES` 是您自己定义的字符串:

142 

143```javascript theme={null}

144on('command.run', { command: 'triage' }, async ($, e) => {

145 const r = await $.model.complete({

146 model: 'haiku',

147 prompt: [

148 // 每次调用都相同,因此构成缓存的前缀

149 { text: RULES, cache: true },

150 // 每次调用都会变化,因此放在断点之后

151 { text: e.args },

152 ],

153 })

154 return { text: 'Label: ' + (r.isAnswered ? r.text.trim() : 'unknown') }

155})

156```

157 

158TTL 和断点数量有以下限制:

159 

160* **TTL**:缓存条目在最后一次使用后持续五分钟。TTL 来自用户的 Claude Code 设置,而不是来自调用。如需一小时,请将 [`subagentPromptCacheTtl`](/docs/zh-CN/prompt-caching#choose-the-ttl-yourself) 设置为 `1h`。

161* **每个请求的断点数**:API 接受[最多四个](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#when-to-use-multiple-breakpoints),再多一个则会在 `r.reason` 中返回 `api-error`

162 

163<h4 id="choose-between-prompt-and-system">

164 在 `prompt` 和 `system` 之间选择

165</h4>

166 

167除非您确定请求直接发送到 Claude API,否则请将各调用共享的静态内容放在 `prompt` 的开头:

168 

169* **使用 API 密钥或 Claude 订阅直接发送到 Claude API**:两个字段都可以

170* **通过 [Amazon Bedrock](/docs/zh-CN/amazon-bedrock)、[Claude Platform on AWS](/docs/zh-CN/claude-platform-on-aws)、[Google Cloud's Agent Platform](/docs/zh-CN/google-vertex-ai)、[Microsoft Foundry](/docs/zh-CN/microsoft-foundry) 或 [LLM 网关](/docs/zh-CN/llm-gateway)发送**:使用 `prompt`。Claude Code 会在系统提示词开头添加一个[归属块](/docs/zh-CN/llm-gateway-protocol#system-prompt-attribution-block),其指纹来自用户消息的开头。`api.anthropic.com` 端点会在缓存之前去除该块。其他端点则会将其作为提示词的一部分接收,因此当 `prompt` 的开头不同时,`system` 中的断点可能无法命中。

171* **在其他人运行的 mod 中**:使用 `prompt`,因为您无法选择他们的提供商

172 

173在前缀中,`system` 位于 `prompt` 之前,因此 `prompt` 中的断点也会覆盖 `system`,而 `system` 不同的调用将无法命中缓存。

104 174 

105Claude API 失败不会拒绝调用,因此检查 `r.isAnswered`,当其为 `false` 时读取 `r.reason`。对于 Claude Code 不会发送的请求,调用会拒绝,例如您的组织阻止的模型。[您的构建的类型](/docs/zh-CN/plugins/mods/create#get-the-types-for-your-build)列出其他选项,例如 `effort`,[限制](/docs/zh-CN/plugins/mods/reference#limits)给出 `maxTokens` 默认值。175<h4 id="check-for-cache-hits">

176 检查缓存命中

177</h4>

106 178 

107`$.model.fork({ prompt })` 改为在当前对话上提出一个问题,使用相同的模型和系统提示,因此 Claude API 从提示缓存为大部分内容提供服务。179`$.model.complete` 的结果包含一个 `usage` 对象,其中带有 API 的[缓存字段](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#tracking-cache-performance)。`usage.cache_creation_input_tokens` 统计调用写入缓存的 token 数,`usage.cache_read_input_tokens` 统计调用从缓存读取的 token 数。预期第一次调用会产生写入,而在 TTL 内的后续调用会产生读取。

108 180 

109这些调用使用用户的计划或 API 密钥。181如果每次调用都在写入而没有任何读取,则说明各调用之间的前缀不同,或者调用间隔超过了 TTL。关于前缀不同的情况,请参阅[在 `prompt` 和 `system` 之间选择](#choose-between-prompt-and-system)。

182 

183如果在模型已回答的调用中两个字段都保持为零,则说明没有缓存任何内容。请逐一检查以下原因:

184 

185* **前缀太短**:API 不会缓存短于模型[最小长度](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#cache-limitations)的前缀,并且不会返回错误

186* **提示缓存已禁用**:当某个 [`DISABLE_PROMPT_CACHING` 变量](/docs/zh-CN/prompt-caching#disable-prompt-caching)适用于该模型时,Claude Code 会移除断点并以不缓存的方式发送文本

187* **您的网关去除了 `cache_control`**:网关可能会[移除该字段但仍返回成功](/docs/zh-CN/prompt-caching#where-the-cache-lives)

188* **另一个 mod 重写了文本的开头**:此时 Claude Code 会[不带断点发送文本](#what-a-model-complete-hook-receives)

189 

190<h3 id="what-a-model-complete-hook-receives">

191 `model.complete` hook 接收的内容

192</h3>

193 

194如果您通过 hook 监听 [`model.complete`](/docs/zh-CN/plugins/mods/reference#mods-api-calls) 事件来检查或更改其他 mod 的请求,请从以下字段读取文本:

195 

196* **`e.prompt`**:始终是字符串。当调用方传入数组时,它是各块文本按顺序拼接的结果。

197* **`e.system`**:以相同方式构建的字符串,当调用方未传入 `system` 时则不存在

198* **`e.promptBlocks` 和 `e.systemBlocks`**:调用方的数组,当调用方为相应字段传入数组时才存在

199 

200Claude Code 会发送您的 hook 传给 `next` 的字符串,并使用您随之传入的数组来放置[缓存断点](#use-prompt-caching)。它会保留仍与字符串开头匹配的前导块及其断点,并以不带断点的方式发送字符串的其余部分。例如,`next({ ...e, prompt: e.prompt + NOTE })` 会保留调用方的断点,而更改 `prompt` 开头的 hook 会移除这些断点。

110 201 

111<h2 id="run-work-in-the-background">202<h2 id="run-work-in-the-background">

112 在后台运行工作203 在后台运行工作


140| 调用 | 用户看到的内容 |231| 调用 | 用户看到的内容 |

141| :- | :- |232| :- | :- |

142| `$.ui.status(text)` | 提示下的一行,保持不变直到您更改它。它以 `⚠` 和 mod 的名称开头,如 `⚠ my-mod: checks: 3 passing`。 |233| `$.ui.status(text)` | 提示下的一行,保持不变直到您更改它。它以 `⚠` 和 mod 的名称开头,如 `⚠ my-mod: checks: 3 passing`。 |

143| `$.ui.toast(text)` | 右上角的一条 toast 通知,mod 的名称在文本上方,几秒后消失 |234| `$.ui.toast(text)` | 一条带有 mod 名称的 toast 通知,几秒后消失。在[全屏渲染](/docs/zh-CN/fullscreen)中,它是右上角的一个框;在经典渲染器中,它是提示下右侧的一行。 |

144| `$.ui.log(text)` | 成绩单中的一条暗线,Claude 不读取。它以 `●` 和 mod 的名称开头,如 `● my-mod: build finished`。 |235| `$.ui.log(text)` | 成绩单中的一条暗线,Claude 不读取。它以 `●` 和 mod 的名称开头,如 `● my-mod: build finished`。 |

145 236 

146<h3 id="start-a-turn-from-a-background-job">237<h3 id="start-a-turn-from-a-background-job">


159 在会话之间发送和接收消息250 在会话之间发送和接收消息

160</h2>251</h2>

161 252 

162mod 可以向您的另一个会话或此会话的子代理之一发送纯文本消息,并观察到达和离开的消息。`$.session.send({ to, text })` 发送一个,与 SendMessage 工具进行相同的传递。`to` 是 `{ sessionId }` 用于会话,`{ agentId }` 用于来自 `$.agent.list()` 的子代理,或接收消息来自的字符串地址。调用在消息排队后解析,带有 `{ isDelivered: true }`。当没有传递任何内容时,它使用 `{ isDelivered: false, reason }` 解析,`reason` 说明原因。253mod 可以向您的另一个会话、此会话的子代理之一或其 [agent team](/docs/zh-CN/agent-teams) 中的队友发送纯文本消息,还可以观察到达和离开的消息。

254 

255要发送消息,请调用 `$.session.send({ to, text })`,它与 SendMessage 工具进行相同的传递。根据消息的接收者设置 `to`:

256 

257* **您的另一个会话**:`{ sessionId }`

258* **子代理或队友**:`{ agentId }`,使用来自 `$.agent.list()` 的 id

259* **您收到的某条消息的发送者**:该消息来源的字符串地址

260 

261调用在消息排队后解析,带有 `{ isDelivered: true }`。当没有传递任何内容时,它使用 `{ isDelivered: false, reason }` 解析,`reason` 说明原因。

163 262 

164此 hook 通过要求您在其后键入的 id 的会话获取状态来回答 `/ping` 命令([注册为命令](#add-a-command)):263此 hook 通过要求您在其后键入的 id 的会话获取状态来回答 `/ping` 命令([注册为命令](#add-a-command)):

165 264 

Details

281 获取你的版本的类型定义281 获取你的版本的类型定义

282</h3>282</h3>

283 283 

284每次 Claude Code 从你传递给 `--plugin-dir` 的目录加载或重新加载 mod,或 mod [Claude 为你编写](#ask-claude-for-a-mod)时,它会将 TypeScript 声明文件(以 `.d.ts` 结尾)写入 mod 目录内的 `.claude-plugin/types/`。它们描述你正在运行的 Claude Code 版本中的确切事件、mods API 方法和元素,所以你的编辑器可以自动完成和类型检查你的 hooks。要在线浏览声明,请阅读 Claude Code 仓库中的 [`mods/types/claude-code.d.ts`](https://github.com/anthropics/claude-code/blob/main/mods/types/claude-code.d.ts),其第一行命名了写入它的版本。该目录包含这些文件:284当 Claude Code 在交互式会话中从 `--plugin-dir` 加载 mod,或加载 [Claude 为您编写](#ask-claude-for-a-mod)的 mod 时,它会将 TypeScript 声明文件写入 mod 的 `.claude-plugin/types/` 目录。这些文件描述了您正在运行的 Claude Code 版本中的确切事件、mods API 方法和元素,因此您的编辑器可以对您的 hook 进行自动补全和类型检查。该目录包含以下文件:

285 285 

286| 路径 | 它声明的内容 |286| 路径 | 它声明的内容 |

287| :- | :- |287| :- | :- |

Details

145 145 

146在 Claude 编辑或写入 `.mdx` 文件后,会话记录中会出现一行暗色文本,注明该文件名。对于其他类型的文件,或者被拒绝或失败的调用,不会记录任何内容。Claude 对该调用的认知不会改变,因为该 hook 返回的是它收到的结果。146在 Claude 编辑或写入 `.mdx` 文件后,会话记录中会出现一行暗色文本,注明该文件名。对于其他类型的文件,或者被拒绝或失败的调用,不会记录任何内容。Claude 对该调用的认知不会改变,因为该 hook 返回的是它收到的结果。

147 147 

148要更改调用,请将更改后的参数传给 `next`。要重试调用,请再次调用 `next(e)`:如果 hook 在第一次结果中看到 `isError`,可以再次运行该工具并返回那次的结果。要自行响应调用,请在不调用 `next` 的情况下返回一个带有 `result` 字段的对象,例如 `{ result: 'Skipped by my-mod' }`。这样做时,不会出现权限提示,工具也不会运行,因此您返回的结果就是 Claude 对所发生情况的全部了解。148您的 hook 还可以更改调用、重试调用、自行响应调用或扣留其结果:

149 

150* **更改调用**:将更改后的参数传给 `next`。

151* **重试调用**:再次调用 `next(e)`。如果 hook 在第一次结果中看到 `isError`,可以再次运行该工具并返回那次的结果。

152* **自行响应调用**:在不调用 `next` 的情况下返回一个带有 `result` 字段的对象;对于内置工具,请让 `result` 的结构与该工具自身结果在[适用于您构建版本的类型](/docs/zh-CN/plugins/mods/create#get-the-types-for-your-build)中的结构一致。不会出现权限提示,工具也不会运行,因此您返回的结果就是 Claude 对所发生情况的全部了解。

153* **向 Claude 扣留结果**:在 `await next(e)` 之后返回 `{ deny: reason }`。Claude 读取的是您的原因,而不是 `next` 返回的内容。如果工具已运行,deny 会阻止 Claude 看到其结果,但不会撤销工具所做的任何操作。如果工具已运行并成功,原因会跟在诸如 `Bash ran, and a plugin withheld its result:` 的说明之后。

149 154 

150您组织的[托管设置](/docs/zh-CN/server-managed-settings)中的 hook 会在任何 mod 的 `tool.call` hook 之前运行,并且其中任一 hook 的阻止都是最终决定。155您组织的[托管设置](/docs/zh-CN/server-managed-settings)中的 hook 会在任何 mod 的 `tool.call` hook 之前运行,并且其中任一 hook 的阻止都是最终决定。

151 156 


225 230 

226| 要执行的操作 | 返回的内容 |231| 要执行的操作 | 返回的内容 |

227| :- | :- |232| :- | :- |

228| 改写提示词。会话记录中的消息会显示新文本。 | `next({ ...e, text: newText })` |233| 改写提示词。会话记录和您的[提示词历史](/docs/zh-CN/interactive-mode#command-history)会显示新文本。 | `next({ ...e, text: newText })` |

229| 在提示词之后添加只有 Claude 读取的文本 | `next({ ...e, context: [...(e.context ?? []), extraText] })` |234| 在提示词之后添加只有 Claude 读取的文本 | `next({ ...e, context: [...(e.context ?? []), extraText] })` |

230| 阻止发送提示词 | `{ drop: 'the reason' }` |235| 阻止发送提示词 | `{ drop: 'the reason' }` |

231 236 


245 250 

246当您发送诸如 `open a PR for this change` 之类的提示词时,您的消息在会话记录中看起来不变,而 Claude 还会在其后读取诸如 `Current branch: feature/auth` 的一行。未提及 Pull Request 的提示词会原样通过,且不会运行 `git`。251当您发送诸如 `open a PR for this change` 之类的提示词时,您的消息在会话记录中看起来不变,而 Claude 还会在其后读取诸如 `Current branch: feature/auth` 的一行。未提及 Pull Request 的提示词会原样通过,且不会运行 `git`。

247 252 

248要阻止提示词,请在不调用 `next` 的情况下返回 `{ drop: 'the reason' }`。如果您的 hook 在其 `next(e)` 调用已放行提示词之后返回 `drop`,轮次仍会运行,并且该 hook 会[失败](#handle-a-hook-that-fails),错误消息中包含 `a drop after its next() was answered`。253要阻止提示词,请在不调用 `next` 的情况下返回 `{ drop: 'the reason' }`。文本会返回到用户的提示词输入框中,用户会看到 `Prompt dropped by a hook:` 后跟您的原因,因此请以用户为对象撰写原因。如果您的 hook 在其 `next(e)` 调用已放行提示词之后返回 `drop`,轮次仍会运行,并且该 hook 会[失败](#handle-a-hook-that-fails),错误消息中包含 `a drop after its next() was answered`。

249 254 

250[其他事件](/docs/zh-CN/plugins/mods/reference#prompts-and-what-claude-reads)涵盖了 Claude 读取的其余内容:`prompt.section` 用于系统提示词的每个部分,`prompt.context` 用于随第一条消息发送的上下文,`skill.prompt` 用于 skill 的文本。这些 hook 产生的文本如果在请求之间发生变化,会[使提示缓存失效](/docs/zh-CN/prompt-caching)。255[其他事件](/docs/zh-CN/plugins/mods/reference#prompts-and-what-claude-reads)涵盖了 Claude 读取的其余内容:`prompt.section` 用于系统提示词的每个部分,`prompt.context` 用于随第一条消息发送的上下文,`skill.prompt` 用于 skill 的文本。这些 hook 产生的文本如果在请求之间发生变化,会[使提示缓存失效](/docs/zh-CN/prompt-caching)。

251 256 


281 286 

282`result.usage` 保存 Claude API 为某个请求报告的 token 计数,以及作出回答的 `model`:`input_tokens`、`output_tokens`、`cache_read_input_tokens` 和 `cache_creation_input_tokens`。该 hook 也会针对子代理的请求运行,因此如果您只想处理主对话,请检查 `e.agentId`。287`result.usage` 保存 Claude API 为某个请求报告的 token 计数,以及作出回答的 `model`:`input_tokens`、`output_tokens`、`cache_read_input_tokens` 和 `cache_creation_input_tokens`。该 hook 也会针对子代理的请求运行,因此如果您只想处理主对话,请检查 `e.agentId`。

283 288 

289要查看 API 在请求期间自行运行的工具调用(例如对 [advisor 工具](/docs/zh-CN/advisor)的调用),请读取 `result.serverToolUses`。Claude Code 不会运行这些调用,因此不会为它们触发任何 `tool.call` 或 `tool.check` hook。当响应中没有此类调用时,该字段不存在;该字段需要 Claude Code v2.1.290 或更高版本。

290 

284<h3 id="hook-the-settings-hook-events">291<h3 id="hook-the-settings-hook-events">

285 处理设置 hook 事件292 处理设置 hook 事件

286</h3>293</h3>


369* **`tool.check`**:返回 `{ decision: 'deny', reason: 'the reason' }`376* **`tool.check`**:返回 `{ decision: 'deny', reason: 'the reason' }`

370* **`plugin.register`**:返回 `{ refuse: 'the reason' }`,如[在检查失败时拒绝 mod](/docs/zh-CN/plugins/mods/admin#refuse-mods-when-your-check-fails) 所示377* **`plugin.register`**:返回 `{ refuse: 'the reason' }`,如[在检查失败时拒绝 mod](/docs/zh-CN/plugins/mods/admin#refuse-mods-when-your-check-fails) 所示

371 378 

379在 `tool.call` 中,在 `next` 解析后返回的 `deny` 会[向 Claude 隐瞒该结果](#guard-or-change-a-tool-call)。

380 

372<h2 id="next-steps">381<h2 id="next-steps">

373 后续步骤382 后续步骤

374</h2>383</h2>

Details

10 10 

11此地图显示 mod 可以在终端会话中的绘制位置:11此地图显示 mod 可以在终端会话中的绘制位置:

12 12 

13<img src="https://mintcdn.com/claude-code/dgiVO_Od1X1faduV/images/mods-screen-map.svg?fit=max&auto=format&n=dgiVO_Od1X1faduV&q=85&s=5fda26b6609c62b68c6f9e528c1590ea" className="dark:hidden" alt="Claude Code 终端会话的地图。mod 可以在右侧添加窗格作为侧边栏,在会话记录的右上角添加 toast,在会话记录中添加日志行,在输入框上方添加条带,以及在输入框下方添加状态栏。mod 可以重绘消息、工具调用行和加载指示器。输入框是 Claude Code 自己的。" width="600" height="336" data-path="images/mods-screen-map.svg" />13<img src="https://mintcdn.com/claude-code/dgiVO_Od1X1faduV/images/mods-screen-map.svg?fit=max&auto=format&n=dgiVO_Od1X1faduV&q=85&s=5fda26b6609c62b68c6f9e528c1590ea" className="dark:hidden" alt="全屏渲染模式下 Claude Code 终端会话的地图。mod 可以在右侧添加窗格作为侧边栏,在会话记录的右上角添加 toast,在会话记录中添加日志行,在输入框上方添加条带,以及在输入框下方添加状态栏。mod 可以重绘消息、工具调用行和加载指示器。输入框是 Claude Code 自己的。" width="600" height="336" data-path="images/mods-screen-map.svg" />

14 14 

15<img src="https://mintcdn.com/claude-code/dgiVO_Od1X1faduV/images/mods-screen-map-dark.svg?fit=max&auto=format&n=dgiVO_Od1X1faduV&q=85&s=5b4161581a1bd2c0450b0c8b57bc1225" className="hidden dark:block" alt="Claude Code 终端会话的地图。mod 可以在右侧添加窗格作为侧边栏,在会话记录的右上角添加 toast,在会话记录中添加日志行,在输入框上方添加条带,以及在输入框下方添加状态栏。mod 可以重绘消息、工具调用行和加载指示器。输入框是 Claude Code 自己的。" width="600" height="336" data-path="images/mods-screen-map-dark.svg" />15<img src="https://mintcdn.com/claude-code/dgiVO_Od1X1faduV/images/mods-screen-map-dark.svg?fit=max&auto=format&n=dgiVO_Od1X1faduV&q=85&s=5b4161581a1bd2c0450b0c8b57bc1225" className="hidden dark:block" alt="全屏渲染模式下 Claude Code 终端会话的地图。mod 可以在右侧添加窗格作为侧边栏,在会话记录的右上角添加 toast,在会话记录中添加日志行,在输入框上方添加条带,以及在输入框下方添加状态栏。mod 可以重绘消息、工具调用行和加载指示器。输入框是 Claude Code 自己的。" width="600" height="336" data-path="images/mods-screen-map-dark.svg" />

16 16 

17在较窄的终端中,窗格位于输入框上方而不是会话记录旁边。17在较窄的终端中,窗格位于输入框上方而不是会话记录旁边。

18 18 


324| `title` | 打开多个窗格时窗格的选项卡标签 |324| `title` | 打开多个窗格时窗格的选项卡标签 |

325| `focus` | 请求[键盘焦点](#know-which-keys-your-mod-can-receive) |325| `focus` | 请求[键盘焦点](#know-which-keys-your-mod-can-receive) |

326| `closeOnEscape` | 使 Esc 关闭窗格 |326| `closeOnEscape` | 使 Esc 关闭窗格 |

327| `holdToasts` | 暂缓显示 toast(来自 [`$.ui.toast`](/docs/zh-CN/plugins/mods/api#show-something-without-starting-a-turn) 的小通知),直到窗格关闭 |327| `holdToasts` | 在终端中,当此窗格是正在显示的窗格时暂缓显示 toast。请参阅[在对话框后暂缓显示 toast](#hold-toasts-behind-a-dialog)。 |

328| `rows` | 当窗格位于输入框上方时请求的高度。默认值为空间的三分之一。 |328| `rows` | 当窗格位于输入框上方时请求的高度。默认值为空间的三分之一。 |

329| `columns` | 当窗格位于会话记录旁边时请求的宽度 |329| `columns` | 当窗格位于会话记录旁边时请求的宽度 |

330 330 


337 337 

338要让命令在 Claude 工作时打开窗格,请在[注册命令](/docs/zh-CN/plugins/mods/api#add-a-command)时添加 `immediate: true`。如果不添加,在轮次进行期间输入的命令会等待轮次结束。338要让命令在 Claude 工作时打开窗格,请在[注册命令](/docs/zh-CN/plugins/mods/api#add-a-command)时添加 `immediate: true`。如果不添加,在轮次进行期间输入的命令会等待轮次结束。

339 339 

340<h4 id="hold-toasts-behind-a-dialog">

341 在对话框后暂缓显示 toast

342</h4>

343 

344当窗格是用户作答后即离开的对话框时,请向 `$.ui.open` 传递 `holdToasts: true`,这样在用户做决定时不会出现 toast。在终端中,只要该窗格是正在显示的窗格,暂缓就会持续,在此期间触发的 toast 会等到暂缓结束后再显示。

345 

346除了您的 mod 通过 [`$.ui.toast`](/docs/zh-CN/plugins/mods/api#show-something-without-starting-a-turn) 触发的 toast 外,Claude Code 还会暂缓其他 mod 的 toast 以及它自己的短时通知。对于保持打开的窗格,请不要设置该字段,以便用户能继续看到这些通知。

347 

340<h4 id="when-a-pane-waits-for-a-wider-terminal">348<h4 id="when-a-pane-waits-for-a-wider-terminal">

341 当窗格等待更宽的终端时349 当窗格等待更宽的终端时

342</h4>350</h4>

Details

64| :- | :- | :- |64| :- | :- | :- |

65| [`tool.call`](/docs/zh-CN/plugins/mods/events#guard-or-change-a-tool-call) | 工具即将运行 | `next(e)`、`{ deny: reason }` 或 `{ result }` |65| [`tool.call`](/docs/zh-CN/plugins/mods/events#guard-or-change-a-tool-call) | 工具即将运行 | `next(e)`、`{ deny: reason }` 或 `{ result }` |

66| [`tool.check`](/docs/zh-CN/plugins/mods/events#where-settings-hooks-run-in-the-order) | Claude Code 在 `tool.call` 和 `PreToolUse` hook 之后决定是否允许运行某个工具调用。`next(e)` 解析为规则、权限模式和这些 hook 得出的决定。 | `{ decision }`,其值为 `allow`、`ask` 或 `deny` |66| [`tool.check`](/docs/zh-CN/plugins/mods/events#where-settings-hooks-run-in-the-order) | Claude Code 在 `tool.call` 和 `PreToolUse` hook 之后决定是否允许运行某个工具调用。`next(e)` 解析为规则、权限模式和这些 hook 得出的决定。 | `{ decision }`,其值为 `allow`、`ask` 或 `deny` |

67| `tool.describe` | 每个工具一次,在其描述首次发送给 Claude 时 | `{ description }`,可选择将 `isDeferred` 设为 `true` 以将该工具置于[工具搜索](/docs/zh-CN/mcp#scale-with-mcp-tool-search)之后,或设为 `false` 以预先加载它 |67| `tool.describe` | 每个工具一次,在其描述首次发送给 Claude 时。对于 MCP 工具,当 Claude 通过[工具搜索](/docs/zh-CN/mcp#scale-with-mcp-tool-search)加载它时会再触发一次,此时 `e.description` 设为 Claude 针对已加载工具读取的文本。 | `{ description }`,可选择将 `isDeferred` 设为 `true` 以将该工具置于工具搜索之后,或设为 `false` 以预先加载它 |

68 68 

69<h4 id="agent-and-organization-fields-on-tool-check">69<h4 id="agent-and-organization-fields-on-tool-check">

70 `tool.check` 上的 Agent 和组织字段70 `tool.check` 上的 Agent 和组织字段


133| `session.end` | 会话结束,或运行 `/clear`、`/resume` 或 `/branch` 时。`e.reason` 为 `clear`、`resume`、`logout`、`prompt_input_exit` 或 `other`。`/branch` 报告为 `resume`。 | `next(e)` |133| `session.end` | 会话结束,或运行 `/clear`、`/resume` 或 `/branch` 时。`e.reason` 为 `clear`、`resume`、`logout`、`prompt_input_exit` 或 `other`。`/branch` 报告为 `resume`。 | `next(e)` |

134| `session.compact` | 对话即将被压缩 | `{ skip: reason }` |134| `session.compact` | 对话即将被压缩 | `{ skip: reason }` |

135| [`session.receive`](/docs/zh-CN/plugins/mods/api#send-and-receive-messages-between-sessions), [`session.send`](/docs/zh-CN/plugins/mods/api#send-and-receive-messages-between-sessions) | 一条消息从另一个 Agent 或会话到达,或即将发往另一个 Agent 或会话。请参阅[在会话之间发送和接收消息](/docs/zh-CN/plugins/mods/api#send-and-receive-messages-between-sessions)。 | `receive` 返回 `{ consumed: reason }`,`send` 返回 `{ isDelivered: false, reason }` |135| [`session.receive`](/docs/zh-CN/plugins/mods/api#send-and-receive-messages-between-sessions), [`session.send`](/docs/zh-CN/plugins/mods/api#send-and-receive-messages-between-sessions) | 一条消息从另一个 Agent 或会话到达,或即将发往另一个 Agent 或会话。请参阅[在会话之间发送和接收消息](/docs/zh-CN/plugins/mods/api#send-and-receive-messages-between-sessions)。 | `receive` 返回 `{ consumed: reason }`,`send` 返回 `{ isDelivered: false, reason }` |

136| `session.append` | 对话保留的每一行一次,例如提示词、响应块、工具结果或通知,在存储之前触发 | `next({ ...e, message })` 以重写该行的 `content` |136| `session.append` | 对话保留的每一行一次,例如提示词、响应块、工具结果或通知,在存储之前触发 | 带有更改后 `message.content` 的 `next({ ...e, message })`,用于重写该行的文本块或其中 `tool_result` 块的 `content` |

137| `session.attach`, `session.detach` | 另一个应用连接到会话或从会话断开 | `next(e)` |137| `session.attach`, `session.detach` | 另一个应用连接到会话或从会话断开 | `next(e)` |

138| `session.measure` | 每个轮次之后,以及套餐限制的已用百分比发生变化时 | `next(e)` |138| `session.measure` | 每个轮次之后,以及套餐限制的已用百分比发生变化时 | `next(e)` |

139 139 


209| [`$.ui`](/docs/zh-CN/plugins/mods/interface#pick-where-to-draw) | `resolve`、`invalidate`、`open`、`close`、`panes`、`focus`、`scroll`、`toast`、`status`、`log`、`notice`、`ask`、`copy`、`selection`、`blit` |209| [`$.ui`](/docs/zh-CN/plugins/mods/interface#pick-where-to-draw) | `resolve`、`invalidate`、`open`、`close`、`panes`、`focus`、`scroll`、`toast`、`status`、`log`、`notice`、`ask`、`copy`、`selection`、`blit` |

210| [`$.command`](/docs/zh-CN/plugins/mods/api#add-a-command) | `register`、`run`、`list` |210| [`$.command`](/docs/zh-CN/plugins/mods/api#add-a-command) | `register`、`run`、`list` |

211| [`$.tool`](/docs/zh-CN/plugins/mods/api#add-a-tool) | `register`、`call`、`check`、`list` |211| [`$.tool`](/docs/zh-CN/plugins/mods/api#add-a-tool) | `register`、`call`、`check`、`list` |

212| `$.agent` | `register`、`spawn`、`list` |212| `$.agent` | `register`、`spawn`、`list`。`list()` 返回此会话的子代理和队友,每项都带有 `status`,其值为 `pending`、`running`、`waiting`、`idle`、`completed`、`failed` 或 `killed` 之一,其中 `idle` 和 `waiting` 需要 Claude Code v2.1.289 或更高版本。 |

213| [`$.model`](/docs/zh-CN/plugins/mods/api#call-a-model) | `complete`、`fork`、`classify` |213| [`$.model`](/docs/zh-CN/plugins/mods/api#call-a-model) | `complete`、`fork`、`classify` |

214| [`$.prompt`](/docs/zh-CN/plugins/mods/api#start-a-turn-from-a-background-job) | `submit`、`read`、`fill`、`suggest`、`compose`。Claude 读取来自 `submit({ text })` 的文本时,前面会有一句指明您的 mod 为发送者的话。`submit({ text, asUser: true })` 将文本作为用户自己的话发送,不带那句话。 |214| [`$.prompt`](/docs/zh-CN/plugins/mods/api#start-a-turn-from-a-background-job) | `submit`、`read`、`fill`、`suggest`、`compose`。Claude 读取来自 `submit({ text })` 的文本时,前面会有一句指明您的 mod 为发送者的话。`submit({ text, asUser: true })` 将文本作为用户自己的话发送,不带那句话。 |

215| `$.turn` | `abort` |215| `$.turn` | `abort` |


317| `$.process.run` 超时时间 | 默认 30 秒,最长 10 分钟 |317| `$.process.run` 超时时间 | 默认 30 秒,最长 10 分钟 |

318| `$.model.complete` `maxTokens` | 默认 1024,最多 64,000 或模型的输出上限 |318| `$.model.complete` `maxTokens` | 默认 1024,最多 64,000 或模型的输出上限 |

319| `$.fs.read` 和 `$.fs.write` | 单个文件 4 MiB |319| `$.fs.read` 和 `$.fs.write` | 单个文件 4 MiB |

320| hook 的 `drop` 原因或 `config.set` 的 `deny` 原因 | 4,096 个字符。更长的原因会被截去末尾部分,drop 或 deny 仍然生效。截断需要 Claude Code v2.1.292 或更高版本;在更早的版本中,该 hook 会改为[失败](/docs/zh-CN/plugins/mods/events#handle-a-hook-that-fails)。 |

320| 单个树中的文本 | 仅绘制前 100,000 个字符 |321| 单个树中的文本 | 仅绘制前 100,000 个字符 |

321| `Code` 的 `language` 或 `path`、`Select` 选项的 `value`,或 `Client` 的 `module` | 10,000 个字符。如果其中任何一项超出此长度,Claude Code 会[在该位置绘制其自身的版本](/docs/zh-CN/plugins/mods/interface#build-a-tree-from-elements)。 |322| `Code` 的 `language` 或 `path`、`Select` 选项的 `value`,或 `Client` 的 `module` | 10,000 个字符。如果其中任何一项超出此长度,Claude Code 会[在该位置绘制其自身的版本](/docs/zh-CN/plugins/mods/interface#build-a-tree-from-elements)。 |

322| `Link` 的 `href` | 2,048 个字符。更长的 `href` 会导致整个树无法绘制。 |323| `Link` 的 `href` | 2,048 个字符。更长的 `href` 会导致整个树无法绘制。 |


325| `$.ui.invalidate('ui.render')` 重绘 | 限制为每秒 10 次;在终端中,对于可见窗格、展开区域以及输入框下方的提示行,限制为每秒 30 次。更早到达的调用会被合并。 |326| `$.ui.invalidate('ui.render')` 重绘 | 限制为每秒 10 次;在终端中,对于可见窗格、展开区域以及输入框下方的提示行,限制为每秒 30 次。更早到达的调用会被合并。 |

326| `$.ui.toast` | 显示 4 秒,除非您传入 `{ timeoutMs }` |327| `$.ui.toast` | 显示 4 秒,除非您传入 `{ timeoutMs }` |

327| 非用户主动打开的窗格 | 从终端第 144 列起放置;用户打开过一次后,从第 110 列起放置 |328| 非用户主动打开的窗格 | 从终端第 144 列起放置;用户打开过一次后,从第 110 列起放置 |

329| 在 hook 模块的单个文件中相互嵌套的作用域(如函数、代码块和循环) | 2,000 |

328| 命令、工具、子代理类型和窗格名称 | 字母、数字、`_` 和 `-`,最多 64 个字符 |330| 命令、工具、子代理类型和窗格名称 | 字母、数字、`_` 和 `-`,最多 64 个字符 |

329| 单个 `claude plugin test` 测试 | 5 秒,除非该测试设置了 `timeoutMs` |331| 单个 `claude plugin test` 测试 | 5 秒,除非该测试设置了 `timeoutMs` |

330 332 

Details

110* `returned neither { value } nor { deny }`:mods API 调用的 stub 返回了一个裸值,这会导致测试失败110* `returned neither { value } nor { deny }`:mods API 调用的 stub 返回了一个裸值,这会导致测试失败

111* `no implementation for` 后跟一个名称:您的 mod 进行了该调用,没有 stub 回答它111* `no implementation for` 后跟一个名称:您的 mod 进行了该调用,没有 stub 回答它

112 112 

113工具包还导出内存中的 mocks,为您回答整个命名空间。`mock.clock(on)` 回答 [`$.clock`](/docs/zh-CN/plugins/mods/api#run-work-in-the-background),`mock.store(on, { count: 7 })` 从以这些条目开始的存储中回答 `$.store`,`mock.env(on, { CI: 'true' })` 从这些变量中回答 `$.env.get`。`mock.clock` 返回一个您的测试可以推进的 mock 时钟,因此计时器的测试不会等待。`mock.store` 返回 nothing,因此要检查您的 mod 保存了什么,请自己编写两个 `store` stubs,如 [drawing test](#test-a-drawing) 所做的那样。113工具包还导出现成的 mocks,用于时钟、存储、环境变量以及追加到对话中的行:

114 

115* **`mock.clock(on)`**:回答 [`$.clock`](/docs/zh-CN/plugins/mods/api#run-work-in-the-background),并返回一个您的测试可以推进的 mock 时钟,因此计时器的测试不会等待。

116* **`mock.store(on, { count: 7 })`**:从以这些条目开始的存储中回答 `$.store`。它不返回任何内容,因此要检查您的 mod 保存了什么,请自己编写两个 `store` stubs,如 [drawing test](#test-a-drawing) 所做的那样。

117* **`mock.env(on, { CI: 'true' })`**:从这些变量中回答 `$.env.get`。

118* **`mock.session(on)`**:返回一个 mock 会话,其 `appended()` 方法按从旧到新的顺序列出您的 mod 通过 [`$.session.append`](/docs/zh-CN/plugins/mods/reference#session) 添加的行;需要 Claude Code v2.1.293 或更高版本。

114 119 

115<h3 id="follow-the-test-kit’s-rules">120<h3 id="follow-the-test-kit’s-rules">

116 遵循测试工具包的规则121 遵循测试工具包的规则


168 查看 stub 返回的内容173 查看 stub 返回的内容

169</h3>174</h3>

170 175 

171您的 mod 在测试中进行的每个 mods API 调用都需要一个 stub 来回答,除了工具包自己回答的少数几个:[`$.ui.invalidate`](/docs/zh-CN/plugins/mods/interface#redraw-when-something-changes) 和 [`$.state`](/docs/zh-CN/plugins/mods/interface#keep-state) 调用。对于 `$.clock` 调用,使用 `mock.clock(on)`,否则您的 mod 的 `$.clock.now()` 会失败并显示 `no implementation for clock.now`。176您的 mod 在测试中进行的每个 mods API 调用都需要一个 stub 来回答,除了工具包自己回答的少数几个:[`$.ui.invalidate`](/docs/zh-CN/plugins/mods/interface#redraw-when-something-changes)、[`$.state`](/docs/zh-CN/plugins/mods/interface#keep-state) 和 `$.session.append` 调用。对于 `$.clock` 调用,使用 `mock.clock(on)`,否则您的 mod 的 `$.clock.now()` 会失败并显示 `no implementation for clock.now`。

172 177 

173此表列出了 mods 最常使用的。第一列是您的 mod 进行的调用或它使用 `next(e)` 传递的事件。第二列是传递给 `on` 的函数,使用该名称,因此 `$.store.get` 行变成 `on('store.get', ($, e) => ({ value: saved.get(e.key) }))`。stub 中的 `'...'` 标记您需要填写的文本:178此表列出了 mods 最常使用的。第一列是您的 mod 进行的调用或它使用 `next(e)` 传递的事件。第二列是传递给 `on` 的函数,使用该名称,因此 `$.store.get` 行变成 `on('store.get', ($, e) => ({ value: saved.get(e.key) }))`。stub 中的 `'...'` 标记您需要填写的文本:

174 179 

Details

116 116 

117设置或更改值。该行的末尾命名其在 `settings.json` 中的 `pluginConfigs` 条目。117设置或更改值。该行的末尾命名其在 `settings.json` 中的 `pluginConfigs` 条目。

118 118 

119<h3 id="code-nested-too-deep-to-scan-more-than-2000-scopes">

120 `code nested too deep to scan: more than 2000 scopes`

121</h3>

122 

123该行以 mod 的名称开头,然后是 `hooks module did not load:`、文件,以及 `code nested too deep to scan: more than 2000 scopes`。hook 模块中的文件不能将作用域(例如函数、块和循环)嵌套超过 [2,000 层](/docs/zh-CN/plugins/mods/reference#limits)。[`claude plugin validate`](/docs/zh-CN/plugins/mods/create#check-what-claude-code-reads-from-your-mod) 会报告相同的原因。

124 

125重写代码,减少其作用域的嵌套深度。

126 

119<h3 id="no-mod-loads-in-a-directory-you-opened-for-the-first-time">127<h3 id="no-mod-loads-in-a-directory-you-opened-for-the-first-time">

120 没有 mod 在您首次打开的目录中加载128 没有 mod 在您首次打开的目录中加载

121</h3>129</h3>


132 140 

133启动时不使用该标志。141启动时不使用该标志。

134 142 

143<h3 id="claude-code-stops-asking-to-enable-hot-reloading">

144 Claude Code 不再询问是否启用热重载

145</h3>

146 

147Claude 在交互式会话中编写了 mod,但没有任何内容加载,而且 Claude Code 不再询问[是否启用热重载](/docs/zh-CN/plugins/mods/create#ask-claude-for-a-mod)。如果该问题有三次在未选择任何答案的情况下结束,热重载将保持关闭。例如,当您设置了 [`askUserQuestionTimeout`](/docs/zh-CN/settings-reference#askuserquestiontimeout) 并且在您回答之前时间已到时,问题就会以这种方式结束。该设置在此适用,是因为 Claude Code 使用与 [`AskUserQuestion` 相同的问题对话框](/docs/zh-CN/tools-reference#question-auto-continue-timeout)进行询问。您自己关闭的问题不计入这三次。

148 

149要运行该 mod,请[将其目录从 mods 文件夹中复制出来](/docs/zh-CN/plugins/mods/create#use-the-mod-in-other-sessions),然后在 shell 中使用 `--plugin-dir` 启动新会话,例如 `claude --plugin-dir ~/mods/git-branch`。

150 

135<h2 id="a-hook-is-skipped-or-a-mod-is-unloaded">151<h2 id="a-hook-is-skipped-or-a-mod-is-unloaded">

136 hook 被跳过或 mod 被卸载152 hook 被跳过或 mod 被卸载

137</h2>153</h2>


209 绘图不出现或不响应225 绘图不出现或不响应

210</h2>226</h2>

211 227 

212mod 已加载,其窗格、带或控件的行为不符合您的预期。228mod 已加载,其窗格、带、toast 或控件的行为不符合您的预期。

213 229 

214<h3 id="a-pane-or-band-is-empty-or-shows-claude-code’s-usual-content">230<h3 id="a-pane-or-band-is-empty-or-shows-claude-code’s-usual-content">

215 窗格或带为空或显示 Claude Code 的常规内容231 窗格或带为空或显示 Claude Code 的常规内容


247 263 

248从命令或按钮打开窗格,或检查调用的 `isPlaced` 结果。请参阅 [在正确的时间打开窗格](/docs/zh-CN/plugins/mods/interface#open-a-pane-at-the-right-time)。264从命令或按钮打开窗格,或检查调用的 `isPlaced` 结果。请参阅 [在正确的时间打开窗格](/docs/zh-CN/plugins/mods/interface#open-a-pane-at-the-right-time)。

249 265 

266<h3 id="a-toast-doesn’t-appear">

267 toast 不出现

268</h3>

269 

270您的 mod 在交互式终端会话中调用了 [`$.ui.toast`](/docs/zh-CN/plugins/mods/api#show-something-without-starting-a-turn),但您没有看到该 toast。要确认调用已运行,请在[调试日志](#read-the-debug-log)中查找包含您的 mod 名称和 toast 文本的行,如 `$.ui.toast (first-mod): build finished`。然后检查以下原因:

271 

272* **缺少该调用对应的行**:查找说明 Claude Code 拒绝该调用原因的行,如 `first-mod: $.ui.toast dropped: timeoutMs is a whole number of ms, 1 to 60000`。

273* **某个窗格正在暂缓 toast**:您的 mod 或其他 mod 在打开当前显示的窗格时传递了 [`holdToasts`](/docs/zh-CN/plugins/mods/interface#hold-toasts-behind-a-dialog)。关闭该窗格即可结束暂缓。如果该窗格是您的且需要保持打开,请从其 `$.ui.open` 调用中移除 `holdToasts`,然后重新打开该窗格。

274* **toast 位于输入框下方**:在[经典渲染器](/docs/zh-CN/fullscreen#enable-fullscreen-rendering)中,请查看输入框下方的右侧。该处的 toast 是以 mod 名称开头的一行文字,而不是右上角的方框。

275* **您的 mod 发出了更新的 toast**:在经典渲染器中,来自您的 mod 的更新 toast 可能会取代正在显示或等待显示的 toast。调试日志中会有针对较早 toast 的另一行:如果该 toast 当时正在显示,该行以 `gave way, cut short` 结尾;如果它从未出现,则以 `gave way, unseen` 结尾。要同时显示两条消息,请将它们放在一个 toast 中。

276* **toast 在绘制前超时**:在全屏渲染中,Claude Code 一次最多绘制三个 toast,因此 toast 可能在绘制之前就已超时。调试日志中会有针对该 toast 的另一行,以 `left the stack, never drawn` 结尾。当您的 mod 同时发出多个 toast 时,请将这些消息放在一个 toast 中。

277 

278在 v2.1.290 之前,如果某个 toast 是在 Claude Code 为您的 mod 显示上一个 toast 后两秒内发出的,Claude Code 会丢弃该 toast,且调试日志中针对被丢弃 toast 的行会显示 `within 2000ms of the last; dropped`。

279 

250<h3 id="hotkeys-do-nothing">280<h3 id="hotkeys-do-nothing">

251 热键不起作用281 热键不起作用

252</h3>282</h3>

Details

110}110}

111```111```

112 112 

113在您的 shell 中,在推送前在存储库中运行 `claude plugin validate .` 以检查文件。113在您的 shell 中,推送前在仓库中运行 `claude plugin validate .`。有关该运行检查的内容,请参阅[验证目录](/docs/zh-CN/plugins/cli-reference#validate-a-directory)。

114 114 

115[创建市场](/docs/zh-CN/plugins/create-marketplace)涵盖了一个存储库中有多个插件的布局。115[创建市场](/docs/zh-CN/plugins/create-marketplace)涵盖了一个存储库中有多个插件的布局。

116 116 


129* 添加市场一次:`claude plugin marketplace add your-org/your-marketplace`,其中参数是 GitHub `owner/repo` 简写、URL 或路径129* 添加市场一次:`claude plugin marketplace add your-org/your-marketplace`,其中参数是 GitHub `owner/repo` 简写、URL 或路径

130* 安装插件:`claude plugin install deploy-helper@your-marketplace`130* 安装插件:`claude plugin install deploy-helper@your-marketplace`

131* 或从会话内同时执行两者:`/plugin install deploy-helper --marketplace your-org/your-marketplace`。需要 Claude Code v2.1.275 或更高版本。请参阅[在一个命令中添加市场和安装](/docs/zh-CN/plugins/install#add-a-marketplace-and-install-in-one-command)131* 或从会话内同时执行两者:`/plugin install deploy-helper --marketplace your-org/your-marketplace`。需要 Claude Code v2.1.275 或更高版本。请参阅[在一个命令中添加市场和安装](/docs/zh-CN/plugins/install#add-a-marketplace-and-install-in-one-command)

132* 或在 shell 中用一个命令同时执行两者:`claude plugin install deploy-helper --marketplace your-org/your-marketplace`。需要 Claude Code v2.1.292 或更高版本

132 133 

133<h3 id="ship-updates-to-users">134<h3 id="ship-updates-to-users">

134 向用户发布更新135 向用户发布更新

Details

163 `Invalid marketplace source format`163 `Invalid marketplace source format`

164</h3>164</h3>

165 165 

166您运行了 `/plugin marketplace add <source>` 或 `claude plugin marketplace add <source>`,Claude Code 回复 `Invalid marketplace source format. Try: owner/repo, https://..., or ./path`。166您运行了 `/plugin marketplace add <source>`、`claude plugin marketplace add <source>` 或 `claude plugin install <plugin> --marketplace <source>`,Claude Code 回复 `Invalid marketplace source format. Try: owner/repo, https://..., or ./path`。

167 167 

168Claude Code 接受以下形式之一的源:168Claude Code 接受以下形式之一的源:

169 169 


237* **您拥有市场**:将文件放在该位置并重新添加市场237* **您拥有市场**:将文件放在该位置并重新添加市场

238* **其他人托管它**:向所有者询问他们发布的确切源238* **其他人托管它**:向所有者询问他们发布的确切源

239 239 

240<h3 id="cannot-install-plugins-from-a-marketplace-with-this-name">

241 `Cannot add marketplace "<name>": Claude Code cannot install plugins from a marketplace with this name`

242</h3>

243 

244您添加了一个市场,但其 `marketplace.json` 中的 [`name`](/docs/zh-CN/plugins/marketplace-reference#top-level-fields) 不能作为 [插件 ID](/docs/zh-CN/plugins/loading#find-where-a-plugin-came-from)(例如 `my-plugin@my-marketplace`)中 `@` 之后的部分。Claude Code 拒绝添加,且不注册任何内容。

245 

246消息的其余部分说明了名称的规则。在此示例中,`_internal` 以 `_` 开头,违反了该规则:

247 

248```text theme={null}

249Cannot add marketplace "_internal": Claude Code cannot install plugins from a marketplace with this name. Each part of a plugin id (plugin@marketplace) may use only the letters a-z and A-Z, digits, ".", "_" and "-", and must start with a letter or digit. The name is set by "name" in the marketplace's marketplace.json; ask its maintainer to change it.

250```

251 

252为市场指定符合该规则的名称,然后再次添加:

253 

254* **您拥有市场**:更改 `marketplace.json` 中的 `name`,例如改为 `internal-tools`

255* **其他人托管它**:请所有者更改名称

256 

257在 v2.1.295 之前,Claude Code 会将此示例中的添加报告为成功。

258 

240<h3 id="ssh-authentication-failed-or-https-authentication-failed">259<h3 id="ssh-authentication-failed-or-https-authentication-failed">

241 `SSH authentication failed` 或 `HTTPS authentication failed`260 `SSH authentication failed` 或 `HTTPS authentication failed`

242</h3>261</h3>


568 `Marketplace "<name>" is already added from a different source`587 `Marketplace "<name>" is already added from a different source`

569</h3>588</h3>

570 589 

571您通过 [`/plugin install <plugin> --marketplace <source>`](/docs/zh-CN/plugins/install#add-a-marketplace-and-install-in-one-command) 确认添加市场,Claude Code 从该源获取的目录与您已从不同源添加的市场具有相同的名称。Claude Code 保留现有市场而不是替换它,插件未安装。590您在会话中或从 shell 中,通过 [安装命令上的 `--marketplace <source>`](/docs/zh-CN/plugins/install#add-a-marketplace-and-install-in-one-command) 指定了一个新的市场源。Claude Code 从该源获取的目录与您已从不同源添加的市场具有相同的名称。Claude Code 保留现有市场而不是替换它,插件未安装。

572 591 

573完整消息如下所示:592完整消息如下所示:

574 593 


786 805 

787Claude Code 将不可用的记录复制到 `.set-aside` 文件中并将其从列表中删除。Claude Code 永远不会读回副本,副本在 [`cleanupPeriodDays`](/docs/zh-CN/settings-reference#cleanupperioddays) 计划上老化。806Claude Code 将不可用的记录复制到 `.set-aside` 文件中并将其从列表中删除。Claude Code 永远不会读回副本,副本在 [`cleanupPeriodDays`](/docs/zh-CN/settings-reference#cleanupperioddays) 计划上老化。

788 807 

808<h3 id="does-not-load-so-claude-code-ignores-the-whole-file">

809 `does not load (...), so Claude Code ignores the whole file`

810</h3>

811 

812命令已成功执行。警告中指明的设置文件存在错误,因此在您修复之前,Claude Code 会忽略整个文件,包括命令写入其中的任何内容。

813 

814修复警告中指明的错误。对于 Claude Code 不接受的值,[修复损坏的设置文件](/docs/zh-CN/settings#fix-a-broken-settings-file) 说明了修复方法。然后,如果命令所做的更改已不在文件中,请再次运行该命令。

815 

816该警告出现在您的 shell 中 `claude plugin install`、`enable`、`disable` 或 `claude plugin marketplace add` 的成功行之后:

817 

818```text theme={null}

819⚠ /home/user/.claude/settings.json does not load (its "permissions" is not valid), so Claude Code ignores the whole file, including anything this command wrote there. Fix the file, then run this command again if its change is missing. If a newer Claude Code wrote the file, update Claude Code instead.

820```

821 

822括号中的文本指明了错误:

823 

824* **`its "<key>" is not valid`**:引号中的设置项包含 Claude Code 不接受的值。在 [设置参考](/docs/zh-CN/settings-reference) 中查找该设置项可接受的值。当多个值无效时,文本会指明第一个设置项并统计其他设置项的数量,例如 `its "permissions" and 1 other value are not valid`。

825* **`it is not a JSON object`**:文件的顶层不是 JSON 对象,例如顶层为数组的文件。

826 

789<h3 id="a-plugin-you-disabled-still-loads">827<h3 id="a-plugin-you-disabled-still-loads">

790 `Disabled in ~/.claude/settings.json but still loads`828 `Disabled in ~/.claude/settings.json but still loads`

791</h3>829</h3>


812 850 

813如果您的组织为您预安装插件,它通过托管设置而不是这样做。请参阅 [预安装和要求插件](/docs/zh-CN/plugins/org#pre-install-and-require-plugins)。851如果您的组织为您预安装插件,它通过托管设置而不是这样做。请参阅 [预安装和要求插件](/docs/zh-CN/plugins/org#pre-install-and-require-plugins)。

814 852 

853<h3 id="a-plugin-stays-installed-after-plugin-uninstall-on-windows">

854 在 Windows 上执行 `plugin uninstall` 后插件仍保持安装

855</h3>

856 

857在 Windows 上,您在项目或本地作用域运行 `claude plugin uninstall` 并报告成功,但 `claude plugin list` 或 `/plugin` 仍然列出该插件。

858 

859`installed_plugins.json` 为该项目文件夹保存了该插件的两条安装记录,每条记录对文件夹路径的写法不同,而一次卸载只会删除其中一条。要进行检查,请在您的 shell 中运行 `claude plugin list --json`。该插件剩余的行中,`projectPath` 对文件夹的写法与您运行卸载的位置不同,例如 `C:\work\app` 被写为 `c:\work\app`。

860 

861在同一文件夹中,使用相同的 `--scope` 再次运行相同的卸载命令。第二次运行在其自身的路径写法下找不到记录,因此会删除另一种写法下的记录。对于项目作用域的安装:

862 

863```shell theme={null}

864claude plugin uninstall <name>@<marketplace> --scope project

865```

866 

867然后再次运行 `claude plugin list --json`,确认该行已消失。

868 

869在 v2.1.295 之前,第二次运行会失败并显示 `Plugin "<name>" is not installed in project scope`。请运行 `claude update`,然后再次运行卸载。

870 

815<h3 id="failed-to-load-hooks-from-and-hooks-that-dont-fire">871<h3 id="failed-to-load-hooks-from-and-hooks-that-dont-fire">

816 `Failed to load hooks from <path>` 和不触发的 hooks872 `Failed to load hooks from <path>` 和不触发的 hooks

817</h3>873</h3>


835 891 

836如果 stderr 显示插件的路径在空格处被截断,hook 的 shell 形式命令在引号外使用 `${CLAUDE_PLUGIN_ROOT}`,安装路径包含空格。将变量用双引号包装或使用 [exec 形式](/docs/zh-CN/hooks#exec-form-and-shell-form)。要找到未引用的变量,请在插件的目录上运行 `claude plugin validate` 并查找其 [引用警告](/docs/zh-CN/plugins/manifest-reference#quoting-and-path-separators)。892如果 stderr 显示插件的路径在空格处被截断,hook 的 shell 形式命令在引号外使用 `${CLAUDE_PLUGIN_ROOT}`,安装路径包含空格。将变量用双引号包装或使用 [exec 形式](/docs/zh-CN/hooks#exec-form-and-shell-form)。要找到未引用的变量,请在插件的目录上运行 `claude plugin validate` 并查找其 [引用警告](/docs/zh-CN/plugins/manifest-reference#quoting-and-path-separators)。

837 893 

894如果通知内容为 `Failed to run: Plugin directory does not exist: <path>`,请参阅 [`Plugin directory does not exist`](#plugin-directory-does-not-exist)。

895 

838对于任何其他错误,从插件目录自己运行 hook 的命令以查看完整输出,或使用 [调试日志](/docs/zh-CN/hooks#debug-hooks) 捕获完整 stderr。896对于任何其他错误,从插件目录自己运行 hook 的命令以查看完整输出,或使用 [调试日志](/docs/zh-CN/hooks#debug-hooks) 捕获完整 stderr。

839 897 

840<h4 id="a-plugin-hook-blocks-a-tool-call-or-prompt">898<h4 id="a-plugin-hook-blocks-a-tool-call-or-prompt">


869 </Step>927 </Step>

870</Steps>928</Steps>

871 929 

930<h3 id="plugin-directory-does-not-exist">

931 `Plugin directory does not exist: <path>`

932</h3>

933 

934即使消息提示重新安装,也请先在 Claude Code 输入框中运行 `/reload-plugins`。当您的会话加载插件 hook 所用的目录已从磁盘上消失时,插件的 hook 会失败并显示 `Failed to run: Plugin directory does not exist: <path> (<plugin> — run /plugin to reinstall)`,且该 hook 不会运行。[`Plugin directory not found at path: <path>`](#plugin-directory-not-found-at-path) 是另一条消息,与市场条目有关。

935 

936重新加载会从插件的当前目录加载其 hook。对于每个 hook 事件和命令,该失败在每个会话中只显示一次,因此 hook 不再报错并不能确认问题已修复。请改为阅读重新加载的输出:

937 

938* **`Reloaded:` 且没有错误行**:插件的 hook 不再指向缺失的目录

939* **`N errors during load. Run /plugin for details.`**:在 `/plugin` 中打开 **Errors** 选项卡,并按照本页中针对其显示的消息的条目操作

940* **以 `Run /reload-plugins --force to apply.` 结尾的行**:没有重新加载任何内容,hook 会继续失败。请在 Claude Code 输入框中运行 `/reload-plugins --force`

941 

872<h3 id="invalid-mcp-server-config-for-and-mcp-servers-that-dont-start">942<h3 id="invalid-mcp-server-config-for-and-mcp-servers-that-dont-start">

873 `Invalid MCP server config for "<server>"` 和不启动的 MCP 服务器943 `Invalid MCP server config for "<server>"` 和不启动的 MCP 服务器

874</h3>944</h3>


1063 1133 

1064您运行了 `claude plugin validate <path>`,或在会话中运行了 `/plugin validate <path>`,它打印了 `Found N errors` 和 `Validation failed`,然后以代码 1 退出。1134您运行了 `claude plugin validate <path>`,或在会话中运行了 `/plugin validate <path>`,它打印了 `Found N errors` 和 `Validation failed`,然后以代码 1 退出。

1065 1135 

1066验证器读取您指定路径处的清单:插件目录为 `.claude-plugin/plugin.json`,市场目录为 `.claude-plugin/marketplace.json`。对于市场,它会在条目自身清单中的问题前加上条目索引,例如 `plugins[1] plugin.json → json: ...`。1136验证器读取您指定路径处的清单:插件目录为 `.claude-plugin/plugin.json`,市场目录为 `.claude-plugin/marketplace.json`,同时包含两者的目录则两者都读取。对于市场,它会在条目自身清单中的问题前加上条目索引,例如 `plugins[1] plugin.json → json: ...`。在 v2.1.289 之前,Claude Code 仅将同时包含两者的目录作为市场进行验证。

1067 1137 

1068下表涵盖会导致验证停止的消息,以及两个警告 `No frontmatter block found` 和 `Unknown field '<key>'`,这两个警告仅在传递 `--strict` 时才会导致验证停止。其他警告(例如缺少描述)未列出。1138下表涵盖会导致验证停止的消息,以及两个警告 `No frontmatter block found` 和 `Unknown field '<key>'`,这两个警告仅在传递 `--strict` 时才会导致验证停止。其他警告(例如缺少描述)未列出。

1069 1139 

Details

191 抖动191 抖动

192</h3>192</h3>

193 193 

194为了避免每个会话在同一个挂钟时刻击中 API,调度程序会向触发时间添加一个确定性偏移:194定时任务的实际运行时间可能与其计划时间不同。如果每个会话的任务都严格按计划运行,许多任务会在同一时刻调用 API,因此 Claude Code 会调整每个任务的运行时间。重复任务会延后运行,而安排在整点或半点的一次性任务会稍微提前运行。

195 195 

196* 重复任务最多在计划时间之后 30 分钟触发(或对于运行频率超过每小时的任务,最多为间隔的一半)。为 `:00` 计划的每小时作业可能在 `:00` 到 `:30` 之间的任何时间触发。196<h4 id="how-late-a-recurring-task-runs">

197* 为小时顶部或底部计划的一次性任务最多提前 90 秒触发。197 重复任务会延后多久运行

198</h4>

198 199 

199偏移是从任务 ID 派生的,所以相同的任务总是获得相同的偏移。如果精确的时间很重要,选择不是 `:00` 或 `:30` 的分钟,例如 `3 9 * * *` 而不是 `0 9 * * *`,一次性抖动将不适用。200当您创建重复任务时,Claude Code 会为其分配一个固定的延迟,并将该延迟添加到每次运行中。该延迟是根据任务 ID 计算得出的,因此同一任务每次都会延后相同的分钟数运行,包括在会话空闲且没有其他任何内容运行时。

201 

202运行越频繁的任务获得的延迟越短,任务可获得的最长延迟为 30 分钟。以下是一些常见计划的延迟范围:

203 

204| 任务运行频率 | 延迟范围 |

205| :- | :- |

206| 每 10 分钟 | 0 到 5 分钟 |

207| 每 30 分钟 | 0 到 15 分钟 |

208| 每小时,或频率更低(例如每天) | 0 到 30 分钟 |

209 

210例如,`7,37 * * * *` 将任务安排在 `:07` 和 `:37` 运行,两者相隔 30 分钟,因此其延迟介于 0 到 15 分钟之间。如果该任务的延迟为 14 分钟,它会在每小时的 `:21` 和 `:51` 运行。将计划更改为其他分钟会改变运行时间,但仍会在其基础上添加延迟。

211 

212<h4 id="when-a-one-shot-task-runs-early">

213 一次性任务何时提前运行

214</h4>

215 

216安排在 `:00` 或 `:30` 的一次性任务最多会提前 90 秒运行。Claude Code 不会调整安排在其他任何分钟的一次性任务,因此当时间很重要时,请避开整点和半点进行安排:使用 `3 9 * * *` 而不是 `0 9 * * *`。

200 217 

201<h3 id="seven-day-expiry">218<h3 id="seven-day-expiry">

202 七天过期219 七天过期

Details

403 403 

404* 位于标准系统路径的企业作用域[托管 MCP 文件](/docs/zh-CN/managed-mcp):Linux 运行器主机上为 `/etc/claude-code/managed-mcp.json`,macOS 主机上为 `/Library/Application Support/ClaudeCode/managed-mcp.json`。适用于只允许加载管理员列出的服务器的锁定机群。有关优先级规则,请参阅[使用 managed-mcp.json 进行独占控制](/docs/zh-CN/managed-mcp#exclusive-control-with-managed-mcp-json)。当运行器主机上存在此文件时,Claude Code 会跳过 Anthropic 控制平面下发给会话的 MCP 服务器(包括 claude.ai 连接器),并在会话子进程的 stderr 上以警告形式列出它们的名称,运行器会以 `debug` 日志级别记录这些警告。在 v2.1.229 之前,这些会话会在启动时退出并显示 `You cannot dynamically configure MCP servers when an enterprise MCP config is present`。404* 位于标准系统路径的企业作用域[托管 MCP 文件](/docs/zh-CN/managed-mcp):Linux 运行器主机上为 `/etc/claude-code/managed-mcp.json`,macOS 主机上为 `/Library/Application Support/ClaudeCode/managed-mcp.json`。适用于只允许加载管理员列出的服务器的锁定机群。有关优先级规则,请参阅[使用 managed-mcp.json 进行独占控制](/docs/zh-CN/managed-mcp#exclusive-control-with-managed-mcp-json)。当运行器主机上存在此文件时,Claude Code 会跳过 Anthropic 控制平面下发给会话的 MCP 服务器(包括 claude.ai 连接器),并在会话子进程的 stderr 上以警告形式列出它们的名称,运行器会以 `debug` 日志级别记录这些警告。在 v2.1.229 之前,这些会话会在启动时退出并显示 `You cannot dynamically configure MCP servers when an enterprise MCP config is present`。

405* 运行器主机上[托管设置](/docs/zh-CN/managed-settings)中的 [`managedMcpServers`](/docs/zh-CN/settings-reference#managedmcpservers) 键:提供 HTTP 和 SSE 服务器,但不进行独占控制,因此来自其他来源的服务器仍会加载。需要 Claude Code v2.1.259 或更高版本。405* 运行器主机上[托管设置](/docs/zh-CN/managed-settings)中的 [`managedMcpServers`](/docs/zh-CN/settings-reference#managedmcpservers) 键:提供 HTTP 和 SSE 服务器,但不进行独占控制,因此来自其他来源的服务器仍会加载。需要 Claude Code v2.1.259 或更高版本。

406* `<repo>/.mcp.json`:项目作用域。将该文件提交到仓库;其中的服务器在云端会话中会被自动批准。406* `<repo>/.mcp.json`:项目作用域。将该文件提交到仓库;其中的服务器在云端会话中会被自动批准。在包含多个仓库的会话中,[最多只会加载一个仓库的该文件](#repository-settings-in-sessions-with-several-repositories)。

407 407 

408当您的组织启用了连接器下发时,Anthropic 的控制平面会通过服务器提供的 MCP 配置,将您在 claude.ai 上配置的连接器下发到以交互方式创建的会话,请求经由 `api.anthropic.com` 路由。以编程方式创建的会话(例如 [CLI 调度](/docs/zh-CN/self-hosted-environments-testing#run-the-test-loop))不会接收连接器下发;请改为通过本节列出的任何其他来源为它们提供 MCP 服务器。子进程的 OAuth 令牌不带有直接获取连接器的作用域,因此子进程本身不会尝试获取;下发由服务器驱动。408当您的组织启用了连接器下发时,Anthropic 的控制平面会通过服务器提供的 MCP 配置,将您在 claude.ai 上配置的连接器下发到以交互方式创建的会话,请求经由 `api.anthropic.com` 路由。以编程方式创建的会话(例如 [CLI 调度](/docs/zh-CN/self-hosted-environments-testing#run-the-test-loop))不会接收连接器下发;请改为通过本节列出的任何其他来源为它们提供 MCP 服务器。子进程的 OAuth 令牌不带有直接获取连接器的作用域,因此子进程本身不会尝试获取;下发由服务器驱动。

409 409 


542exit 0542exit 0

543```543```

544 544 

545钩子在会话结束前提示 Claude 提交并推送,当目录不是 git 存储库或没有远程时保持沉默。545该 hook 在会话结束前提示 Claude 提交并推送,当目录不是 git 仓库或没有远程时保持沉默。对于包含多个仓库的会话,请参阅 [`$CLAUDE_PROJECT_DIR` 指向的内容](#repository-settings-in-sessions-with-several-repositories)。

546 546 

547<h2 id="permissions-and-tool-approval">547<h2 id="permissions-and-tool-approval">

548 权限和工具批准548 权限和工具批准


571 571 

572设置 `SELF_HOSTED_RUNNER_HOST_CONFIG_DIR` 可从其他路径获取初始内容,或将其指向空目录以禁用初始内容填充。572设置 `SELF_HOSTED_RUNNER_HOST_CONFIG_DIR` 可从其他路径获取初始内容,或将其指向空目录以禁用初始内容填充。

573 573 

574仓库中提交的 `.claude/settings.json` 会作为项目设置叠加在其上。会话还会从运行器镜像中的标准系统路径读取 [`managed-settings.json`](/docs/zh-CN/settings#where-settings-live)。其中的键是否与[服务器托管设置](/docs/zh-CN/server-managed-settings)一起应用,取决于 [Claude Code 如何合并托管来源](/docs/zh-CN/managed-settings#how-claude-code-combines-managed-sources):默认情况下,当您的组织下发了任何服务器托管的键时,会话会忽略运行器镜像中的该文件,但 [Claude Code 从每个管理员来源读取的键](/docs/zh-CN/managed-settings#keys-read-from-every-admin-source)除外,例如 `env` 块、沙箱锁定、沙箱二进制路径和 `forceRemoteSettingsRefresh`。请参阅[设置优先级](/docs/zh-CN/settings#settings-precedence)。574仓库中提交的 `.claude/settings.json` 会作为项目设置叠加在其上。在包含多个仓库的会话中,[最多只有一个仓库的文件生效](#repository-settings-in-sessions-with-several-repositories)。会话还会从运行器镜像中的标准系统路径读取 [`managed-settings.json`](/docs/zh-CN/settings#where-settings-live)。其中的键是否与[服务器托管设置](/docs/zh-CN/server-managed-settings)一起应用,取决于 [Claude Code 如何合并托管来源](/docs/zh-CN/managed-settings#how-claude-code-combines-managed-sources):默认情况下,当您的组织下发了任何服务器托管的键时,会话会忽略运行器镜像中的该文件,但 [Claude Code 从每个管理员来源读取的键](/docs/zh-CN/managed-settings#keys-read-from-every-admin-source)除外,例如 `env` 块、沙箱锁定、沙箱二进制路径和 `forceRemoteSettingsRefresh`。请参阅[设置优先级](/docs/zh-CN/settings#settings-precedence)。

575 575 

576当 Anthropic 的控制平面为会话提供 [Claude Code hook](/docs/zh-CN/hooks) 时,运行器会将它们与您自己的配置并行安装,而不是覆盖您的配置。需要 Claude Code v2.1.229 或更高版本。576当 Anthropic 的控制平面为会话提供 [Claude Code hook](/docs/zh-CN/hooks) 时,运行器会将它们与您自己的配置并行安装,而不是覆盖您的配置。需要 Claude Code v2.1.229 或更高版本。

577 577 


583 583 

584运行器对主机 `~/.claude/` 的快照不包含 `projects/` 目录。自动记忆的默认存储位置就在该目录下。如果您将记忆文件放在那里,运行器不会将它们填充到会话中,它们也不会启用自动记忆。584运行器对主机 `~/.claude/` 的快照不包含 `projects/` 目录。自动记忆的默认存储位置就在该目录下。如果您将记忆文件放在那里,运行器不会将它们填充到会话中,它们也不会启用自动记忆。

585 585 

586<h3 id="repository-settings-in-sessions-with-several-repositories">

587 包含多个仓库的会话中的仓库设置

588</h3>

589 

590在包含多个仓库的会话中,Claude Code 从会话启动所在的目录读取项目设置,因此最多只有一个仓库的 `.claude/settings.json` 作为项目设置生效。在其他仓库的文件中定义的 hook 不会运行,其中的拒绝规则不会生效,其 `env` 也不会被设置。

591 

592* **`--capacity 1`(默认值)并使用内置检出**:会话在其仓库列表中的第一个仓库中启动。该仓库的 `.claude/settings.json` 作为项目设置生效,其 `.mcp.json` 会被加载,而其他仓库的则不会。

593* **`--capacity` 大于 1,或使用 [`checkout` hook](#checkout)**:会话在包含各检出内容的按会话目录中启动。没有任何仓库的 `.claude/settings.json` 作为项目设置生效,没有任何仓库的 `.mcp.json` 会被加载,并且 hook 命令中的 [`$CLAUDE_PROJECT_DIR`](/docs/zh-CN/hooks#reference-scripts-by-path) 是该目录,而不是某个检出目录。

594 

595无论会话在何处启动,每个仓库的 `CLAUDE.md` 和 skill 都会被加载。运行器将每个仓库作为[附加目录](/docs/zh-CN/permissions#additional-directories-grant-file-access-not-configuration)传递给 Claude Code,因此 Claude Code 还会从每个仓库的 `.claude/settings.json` 中读取 `enabledPlugins` 和 `extraKnownMarketplaces` 键。

596 

597要在每个会话中运行某个 hook 或应用某条权限规则,请将其放在运行器主机上的 `~/.claude/settings.json` 中。无论会话在何处启动,运行器都会[将该主机文件填充到每个会话中](#how-each-session’s-config-is-assembled)。在 `Read` 或 `Edit` 规则中,请将路径写为以 `//` 开头的绝对路径或以 `~/` 开头的相对于主目录的[模式](/docs/zh-CN/permissions#read-and-edit),因为其他模式会以设置来源或当前目录为锚点。

598 

586<h3 id="repository-committed-permission-rules">599<h3 id="repository-committed-permission-rules">

587 仓库中提交的权限规则600 仓库中提交的权限规则

588</h3>601</h3>

Details

87 87 

88 由于 hooks 执行 shell 命令,交互式会话中的用户在 Claude Code 应用它们之前会看到[安全批准对话框](#security-approval-dialogs)。88 由于 hooks 执行 shell 命令,交互式会话中的用户在 Claude Code 应用它们之前会看到[安全批准对话框](#security-approval-dialogs)。

89 89 

90 要配置 [auto mode](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode) 分类器,使其了解您的组织信任的存储库、存储桶和域,以相同的方式传递 `autoMode` 块;有关 `autoMode` 条目如何影响分类器阻止的内容以及关于 `environment`、`allow`、`soft_deny` 和 `hard_deny` 字段的重要警告,请参阅[配置 auto mode](/docs/zh-CN/auto-mode-config)。90 要配置[自动模式](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode)分类器,使其了解您的组织信任的存储库、存储桶和域,以相同的方式传递 `autoMode` 块;有关 `autoMode` 条目如何影响分类器阻止的内容以及关于 `environment`、`allow`、`soft_deny` 和 `hard_deny` 字段的重要警告,请参阅[配置自动模式](/docs/zh-CN/auto-mode-config)。

91 </Step>91 </Step>

92 92 

93 <Step title="保存并部署">93 <Step title="保存并部署">

94 保存您的更改。Claude Code 客户端在下次启动或每小时轮询周期时接收更新的设置。94 保存您的更改。Claude Code 客户端在下次启动或每小时轮询周期时接收更新的设置。

95 

96 编辑器会根据已发布的 Claude Code 设置 JSON schema 检查您的 JSON。如果在可解析的 JSON 中发现问题,它会显示警告并更改保存按钮的标签。当已保存设置时,标签为 **Update with errors**;当尚未保存任何设置时,标签为 **Add with errors**。该按钮仍然会保存,因为 schema 警告不会阻止保存。

97 

98 该 schema [可能落后于最新版本](/docs/zh-CN/settings#edit-a-settings-file),因此编辑器可能会标记[设置参考](/docs/zh-CN/settings-reference#all-settings)中已记录的键或值。Claude Code 会接收您保存的键和值,并在加载它们时运行[自己的验证](#invalid-entries-in-delivered-settings)。

95 </Step>99 </Step>

96</Steps>100</Steps>

97 101 

settings.md +41 −41

Details

400 设置文件及其影响范围400 设置文件及其影响范围

401</h2>401</h2>

402 402 

403Claude Code 从四个文件读取设置,组织也可以从 claude.ai 控制台提供托管设置。每个来源都有一个作用域:设置所适用的人员和项目范围,可能是仅限于您、项目中的所有人,或组织中的所有人。403Claude Code 从四个文件读取设置,组织也可以从 claude.ai 控制台提供托管设置。每个来源都有一个作用域:保存在其中的设置所适用的人员和项目范围,可能是仅限于您、项目中的所有人,或组织中的所有人。

404 404 

405| 作用域 | 文件 | 影响范围 | 用途 |405| 作用域 | 文件 | 影响范围 | 用途 |

406| :- | :- | :- | :- |406| :- | :- | :- | :- |

407| 用户 | `~/.claude/settings.json` | 你在这台机器上的每个项目中 | 个人偏好:主题、编辑器模式、默认模型、你自己的权限规则 |407| 用户 | `~/.claude/settings.json` | 您在这台机器上的每个项目 | 个人偏好:主题、编辑器模式、默认模型、您自己的权限规则 |

408| 共享项目 | `.claude/settings.json` | 包含该文件的文件夹中的所有人。在 git 仓库中,提交它以便队友获得 | 团队权限、hooks、plugins 和项目需要的环境变量 |408| 共享项目 | `.claude/settings.json` | 在包含该文件的文件夹中工作的所有人。在 git 仓库中,提交该文件以便队友获得它 | 团队权限、hook、插件以及项目所需的环境变量 |

409| 项目本地 | `.claude/settings.local.json` | 仅在这个项目中的你。Claude Code 在创建文件时将其排除在 git 之外;如果你手动创建,请自己添加到 `.gitignore` | 单个项目的个人覆盖,以及在共享前的测试 |409| 项目本地 | `.claude/settings.local.json` | 仅限您,且仅在这一个项目中。Claude Code 在创建该文件时会将其排除在 git 之外;如果您手动创建,请自行将其添加到 `.gitignore` | 针对单个项目的个人覆盖,以及共享前的测试 |

410| 托管 | `managed-settings.json` 和其他[托管来源](/docs/zh-CN/managed-settings#delivery-mechanisms) | 您的组织部署到的所有人;[设置优先级](#settings-precedence)说明了哪些内容可以覆盖它 | 安全策略和合规要求 |410| 托管 | `managed-settings.json` 和其他[托管来源](/docs/zh-CN/managed-settings#delivery-mechanisms) | 您的组织部署到的所有人;[设置优先级](#settings-precedence)说明了哪些内容可以覆盖它 | 安全策略和合规要求 |

411 411 

412在"文件"列中,`~/.claude` 是你主目录中的 `.claude` 文件夹,而单独的 `.claude` 是项目内的 `.claude` 文件夹。412在"文件"列中,`~/.claude` 是您主目录中的 `.claude` 文件夹,而单独的 `.claude` 是项目内的 `.claude` 文件夹。

413 413 

414<span id="where-each-file-applies" />414<span id="where-each-file-applies" />

415 415 


419 比较每个设置文件的作用域419 比较每个设置文件的作用域

420</h3>420</h3>

421 421 

422假设你在机器上有三个项目:`website/`、`api/` 和 `acme-app/`,一个队友有他们自己的 `acme-app/` 克隆,你在 `acme-app/` 上启动了一个[云会话](#settings-in-cloud-sessions)。422假设您的机器上有三个项目:`website/`、`api/` 和 `acme-app/`,一位队友有自己的 `acme-app/` 克隆,并且您在 `acme-app/` 上启动了一个[云端会话](#settings-in-cloud-sessions)。

423 423 

424下面的图表显示当你从这些文件夹启动 Claude Code 时,设置应用在哪些文件夹中。点击一个设置文件查看它到达的文件夹。424下图显示了当您从这些文件夹启动 Claude Code 时,设置会在哪些文件夹中生效。点击某个设置文件即可查看它覆盖到的文件夹。

425 425 

426<SettingsScope />426<SettingsScope />

427 427 

428* **`~/.claude/settings.json`**:你机器上的每个项目,以及队友机器上或云会话中都没有428* **`~/.claude/settings.json`**:您机器上的每个项目,而队友的机器上和云端会话中都不会生效

429* **`acme-app/.claude/settings.json`**:你的 `acme-app/`。只有当你将文件提交到版本控制时,它才会到达你队友的克隆和云会话;在此之前,它就像任何其他磁盘上的文件一样,其他人没有它429* **`acme-app/.claude/settings.json`**:您的 `acme-app/`。只有当您将该文件提交到版本控制后,它才会覆盖到队友的克隆和云端会话;在此之前,它只是您磁盘上的一个普通文件,其他人都没有它

430* **`acme-app/.claude/settings.local.json`**:仅你的 `acme-app/`。Claude Code 第一次写入文件时将其添加到你的全局 git 排除项中,因此它不会进入你的提交;如果你手动创建文件,[自己添加到 `.gitignore`](#keep-personal-settings-out-of-a-repository)430* **`acme-app/.claude/settings.local.json`**:仅您的 `acme-app/`。Claude Code 第一次写入该文件时会将其添加到您的全局 git 排除项中,因此它不会进入您的提交;如果您手动创建该文件,请[自行将其添加到 `.gitignore`](#keep-personal-settings-out-of-a-repository)

431* **托管设置**,无论是 `managed-settings.json` 文件、MDM 策略,还是来自 claude.ai 控制台的[服务器托管设置](/docs/zh-CN/server-managed-settings):你的组织部署到的每台机器上的每个项目,或你使用组织账户登录的地方。只有服务器托管设置到达云会话431* **托管设置**,无论是 `managed-settings.json` 文件、MDM 策略,还是来自 claude.ai 控制台的[服务器托管设置](/docs/zh-CN/server-managed-settings):您的组织部署到的每台机器上的每个项目,或您使用组织账户登录的每台机器上的每个项目。只有服务器托管设置会覆盖到云端会话

432 432 

433<span id="which-files-you-have" />433<span id="which-files-you-have" />

434 434 

435<h3 id="find-or-create-your-settings-files">435<h3 id="find-or-create-your-settings-files">

436 查找或创建你的设置文件436 查找或创建设置文件

437</h3>437</h3>

438 438 

439安装 Claude Code 不会创建任何设置文件。如果你的机器或项目已经有一个,它来自以下来源之一:439安装 Claude Code 不会创建任何设置文件。如果您的机器或项目中已经有设置文件,它来自以下来源之一:

440 440 

441* **托管**:你的组织部署它。你不创建或编辑它。441* **托管**:由您的组织部署。您无需创建或编辑它。

442* **共享项目**:已经使用 Claude Code 的项目可能已提交一个。如果没有,在项目文件夹中的 `.claude/settings.json` 创建一个。442* **共享项目**:已经使用 Claude Code 的项目可能已提交了该文件。如果没有,请在项目文件夹中的 `.claude/settings.json` 创建它。

443* **用户**和**项目本地**:自己创建它们,或让 Claude Code 创建它们。当你在 `/config` 菜单中更改存储在用户设置中的选项(如主题)时,它会写入 `~/.claude/settings.json`,当你在权限提示上给予常设批准(如对 Bash 命令的"是的,不要再问")时,它会写入 `.claude/settings.local.json`。一些 `/config` 选项,包括**显示提示**,保存到 `.claude/settings.local.json` 而不是用户文件。443* **用户**和**项目本地**:您可以自行创建,也可以让 Claude Code 创建。当您第一次在 `/config` 菜单中更改存储在用户设置中的选项(例如主题)时,它会写入 `~/.claude/settings.json`;当您第一次在权限提示上给予常设批准(例如对 Bash 命令选择"Yes, and don't ask again")时,它会写入 `.claude/settings.local.json`。少数 `/config` 选项(包括 **Show tips**)会保存到 `.claude/settings.local.json`,而不是用户文件。

444 444 

445<Info>445<Info>

446 在 Windows 上,`~/.claude` 表示 `%USERPROFILE%\.claude`。要将主目录文件保存在其他地方,设置 [`CLAUDE_CONFIG_DIR`](/docs/zh-CN/env-vars);Claude Code 然后将你的设置、会话历史和 plugins 存储在那里。446 在 Windows 上,`~/.claude` 表示 `%USERPROFILE%\.claude`。要将主目录中的文件保存在其他位置,请设置 [`CLAUDE_CONFIG_DIR`](/docs/zh-CN/env-vars);Claude Code 随后会将您的设置、会话历史和插件存储在该位置。

447</Info>447</Info>

448 448 

449Claude Code 还保留第五个文件 [`~/.claude.json`](/docs/zh-CN/claude-directory#ce-claude-json),它为自己写入;你不需要编辑它。它保存你的登录会话、[MCP server](/docs/zh-CN/mcp) 配置、每个项目的状态(如信任决定),以及 `/config` 为你写入的[全局配置键](/docs/zh-CN/settings-reference#global-config-settings)。449Claude Code 还会保留第五个文件 [`~/.claude.json`](/docs/zh-CN/claude-directory#ce-claude-json),由它自行写入;您无需编辑它。该文件保存您的登录会话、[MCP 服务器](/docs/zh-CN/mcp)配置、每个项目的状态(例如信任决定),以及 `/config` 为您写入的[全局配置键](/docs/zh-CN/settings-reference#global-config-settings)。

450 450 

451<h3 id="share-settings-with-your-team">451<h3 id="share-settings-with-your-team">

452 与你的团队共享设置452 与团队共享设置

453</h3>453</h3>

454 454 

455提交 `.claude/settings.json` 以便克隆仓库的每个人都获得相同的权限、hooks 和 plugins。每个队友仍然可以在他们自己的 `.claude/settings.local.json` 中为自己覆盖它,因此个人例外不需要提交。有关完整的团队文件,请参阅[团队的共享设置](/docs/zh-CN/settings-example#a-teams-shared-settings)。455提交 `.claude/settings.json`,以便克隆仓库的每个人都获得相同的权限、hook 和插件。每位队友仍可以在自己的 `.claude/settings.local.json` 中为自己覆盖它,因此个人例外无需提交。有关完整的团队文件,请参阅[团队的共享设置](/docs/zh-CN/settings-example#a-teams-shared-settings)。

456 456 

457你提交的一些内容等待每个队友[信任文件夹](/docs/zh-CN/permissions#project-allow-rules-and-workspace-trust),少数键永远不会从仓库文件生效;[排查不适用的设置](#common-cases)涵盖两者。457您提交的部分内容要等到每位队友[信任该文件夹](/docs/zh-CN/permissions#project-allow-rules-and-workspace-trust)后才会生效,还有少数键永远不会从仓库文件中生效;[排查不生效的设置](#common-cases)涵盖了这两种情况。

458 458 

459<span id="local-settings-file" />459<span id="local-settings-file" />

460 460 


468 将个人设置保留在仓库之外468 将个人设置保留在仓库之外

469</h3>469</h3>

470 470 

471要在一个项目中为自己更改设置而不为队友更改,请在项目内的 `.claude/settings.local.json` 中保存它。Claude Code 在提交的 `.claude/settings.json` 上应用该文件,因此如果你的团队文件设置 `"model": "claude-sonnet-5"` 而你想要 Opus,在你的本地文件中放入 `"model": "claude-opus-5-5"`,只有你的会话会改变。471要在某个项目中仅为自己更改设置而不影响队友,请将其保存在项目内的 `.claude/settings.local.json` 中。Claude Code 会在已提交的 `.claude/settings.json` 之上应用该文件,因此如果团队文件设置了 `"model": "claude-sonnet-5"` 而您想使用 Opus,请在本地文件中放入 `"model": "claude-opus-5-5"`,这样只有您的会话会发生变化。

472 472 

473Claude Code 也会写入此文件,将其保留在你的提交之外,并应用其允许规则而无需信任步骤:473Claude Code 也会写入此文件,将其排除在您的提交之外,并且无需信任步骤即可应用其允许规则:

474 474 

475* **Claude Code 也会写入它。** 当 Claude 要求运行 Bash 命令的权限,你选择"是的,不要再问"时,Claude Code 将该[权限批准](/docs/zh-CN/permissions#permission-system)保存为此处的 `allow` 规则。475* **Claude Code 也会写入它。** 当 Claude 请求运行 Bash 命令的权限而您选择"Yes, and don't ask again"时,Claude Code 会将该[权限批准](/docs/zh-CN/permissions#permission-system)作为 `allow` 规则保存在此处。

476* **除非你手动创建,否则你不需要 gitignore 它。** Claude Code 第一次在不已忽略它的 git 仓库中写入文件时,它会将 `**/.claude/settings.local.json` 添加到你的全局 git 排除文件中,因此该文件在每个仓库中都不会进入你的提交。该文件是 `core.excludesFile`(当你的全局 git 配置将其设置为绝对路径或 `~` 前缀路径时);否则是 `$XDG_CONFIG_HOME/git/ignore`,或当 `XDG_CONFIG_HOME` 未设置时是 `~/.config/git/ignore`。如果你手动创建了文件,Claude Code 还没有写入它,请自己添加到 `.gitignore`。476* **您无需自行将其加入 gitignore,除非您是手动创建的。** Claude Code 第一次在尚未忽略该文件的 git 仓库中写入它时,会将 `**/.claude/settings.local.json` 添加到您的全局 git 排除文件中,因此该文件在每个仓库中都不会进入您的提交。当您的全局 git 配置将 `core.excludesFile` 设置为绝对路径或以 `~` 开头的路径时,该排除文件就是 `core.excludesFile`;否则为 `$XDG_CONFIG_HOME/git/ignore`,或在未设置 `XDG_CONFIG_HOME` 时为 `~/.config/git/ignore`。如果您手动创建了该文件且 Claude Code 尚未写入它,请自行将其添加到 `.gitignore`。

477* **当文件保持未跟踪时,其允许规则不等待信任。** 因为文件是你的而不是仓库的,Claude Code 应用其 `allow` 规则而无需它对提交文件要求的[工作区信任](/docs/zh-CN/permissions#project-allow-rules-and-workspace-trust)步骤。如果文件被 git 跟踪,信任步骤也适用于它;请参阅[当你的本地设置文件需要信任](/docs/zh-CN/permissions#when-your-local-settings-file-needs-trust)。477* **只要文件保持未跟踪状态,其允许规则就无需等待信任。** 由于该文件属于您而不属于仓库,Claude Code 会应用其 `allow` 规则,而无需经过已提交文件所要求的[工作区信任](/docs/zh-CN/permissions#project-allow-rules-and-workspace-trust)步骤。如果该文件被 git 跟踪,信任步骤同样适用于它;请参阅[本地设置文件何时需要信任](/docs/zh-CN/permissions#when-your-local-settings-file-needs-trust)。

478 478 

479<span id="where-claude-code-looks-for-each-file" />479<span id="where-claude-code-looks-for-each-file" />

480 480 


483<span id="local-allow-rules-dont-wait-for-workspace-trust" />483<span id="local-allow-rules-dont-wait-for-workspace-trust" />

484 484 

485<h4 id="where-claude-code-keeps-the-local-file-in-a-git-repository">485<h4 id="where-claude-code-keeps-the-local-file-in-a-git-repository">

486 Claude Code 在 git 仓库中保留本地文件的位置486 Claude Code 在 git 仓库中保存本地文件的位置

487</h4>487</h4>

488 488 

489当 Claude 要求运行 Bash 命令的权限,你选择"是的,不要再问"时,Claude Code 将该批准保存为 `.claude/settings.local.json` 中的 `allow` 规则。如果你在 git 仓库的子目录中启动 Claude Code,它会在仓库根目录读取和写入该文件,并在整个仓库中应用批准。在[worktree](/docs/zh-CN/worktrees) 中,它使用主检出根目录处的文件。489当 Claude 请求运行 Bash 命令的权限而您选择"Yes, and don't ask again"时,Claude Code 会将该批准作为 `allow` 规则保存在 `.claude/settings.local.json` 中。如果您在 git 仓库的子目录中启动 Claude Code,它会在仓库根目录读取和写入该文件,并在整个仓库中应用该批准。在 [worktree](/docs/zh-CN/worktrees) 中,它使用主检出根目录下的文件。

490 490 

491两条规则限定根位置:491有两条规则对根目录位置加以限定:

492 492 

493* **当文件与 `.claude/settings.json` 保持在一起时**:在 git 仓库之外,当仓库根是你的主目录时,在 Windows 上,或当仓库根或其 `.git` 或 `.claude` 条目不由你的用户拥有时。493* **文件改为与 `.claude/settings.json` 放在一起的情况**:在 git 仓库之外、仓库根目录是您的主目录时、在 Windows 上,或者仓库根目录或其 `.git` 或 `.claude` 条目不归您的用户所有时。

494* **文件中的路径不在仓库根处锚定**:以 `/` 开头的权限规则或相对沙箱路径[在会话的主工作目录处锚定](/docs/zh-CN/permissions#read-and-edit)。494* **文件中的路径不以仓库根目录为锚点**:以 `/` 开头的权限规则或相对沙箱路径改为[以会话的主工作目录为锚点](/docs/zh-CN/permissions#read-and-edit)。

495 495 

496在 v2.1.211 之前,Claude Code 将文件保留在启动目录中。它仍然读取早期版本在根文件旁边留下的文件;当两者设置相同的键时,根的值适用,两个文件的权限规则都适用。Agent SDK 的 [`resolveSettings()`](/docs/zh-CN/agent-sdk/typescript#resolvesettings) 助手始终从启动目录读取文件。496在 v2.1.211 之前,Claude Code 将该文件保存在启动目录中。它仍会读取早期版本留在那里的文件,并与根目录文件一同读取;当两者设置了相同的键时,以根目录文件的值为准,而两个文件中的权限规则都会生效。Agent SDK 的 [`resolveSettings()`](/docs/zh-CN/agent-sdk/typescript#resolvesettings) 辅助函数始终从启动目录读取该文件。

497 497 

498Claude Code 从会话的[主工作目录](/docs/zh-CN/permissions#working-directories)读取共享的 `.claude/settings.json`,因此要使用在仓库根处提交的文件,请从那里启动 Claude Code。在你[使用 `/cd` 移动会话](/docs/zh-CN/permissions#move-the-session-to-another-directory)后,Claude Code 改为从新目录读取两个项目文件,按相同规则放置本地文件。从你移动到的目录读取它们需要 Claude Code v2.1.246 或更高版本。498Claude Code 从会话的[主工作目录](/docs/zh-CN/permissions#working-directories)读取共享的 `.claude/settings.json`,因此要使用提交在仓库根目录的文件,请从那里启动 Claude Code。在您[使用 `/cd` 移动会话](/docs/zh-CN/permissions#move-the-session-to-another-directory)后,Claude Code 会改为从新目录读取这两个项目文件,并按相同规则放置本地文件。从您移动到的目录读取它们需要 Claude Code v2.1.246 或更高版本。

499 499 

500<span id="managed-settings-delivery" />500<span id="managed-settings-delivery" />

501 501 


508<span id="settings-your-organization-manages" />508<span id="settings-your-organization-manages" />

509 509 

510<h3 id="check-what-your-organization-enforces">510<h3 id="check-what-your-organization-enforces">

511 检查你的组织强制执行的内容511 检查组织强制执行的内容

512</h3>512</h3>

513 513 

514如果你的组织管理 Claude Code,某些设置是为你决定的,你在自己的文件中放入的任何内容都不会改变它们。要查看哪些,运行 `/status`:`Setting sources` 行命名适用于你的托管来源。托管设置在这台机器上 Claude Code 运行的任何地方都适用;[开发人员可以更改的内容](/docs/zh-CN/managed-settings#what-a-developer-can-change)涵盖本地管理员权限和 Claude Code 以外的工具。514如果您的组织管理 Claude Code,某些设置已由组织为您决定,您在自己的文件中放入的任何内容都无法更改它们。要查看是哪些设置,请运行 `/status`:`Setting sources` 行会列出适用于您的托管来源。托管设置在这台机器上 Claude Code 运行的任何位置都会生效;[开发人员可以更改的内容](/docs/zh-CN/managed-settings#what-a-developer-can-change)介绍了本地管理员权限以及 Claude Code 以外的工具。

515 515 

516托管设置通过托管设置页面上的[交付机制](/docs/zh-CN/managed-settings#delivery-mechanisms)到达你,最常见的是:516托管设置通过托管设置页面上介绍的[交付机制](/docs/zh-CN/managed-settings#delivery-mechanisms)送达您,最常见的是:

517 517 

518* [服务器托管设置](/docs/zh-CN/server-managed-settings),Claude Code 从 claude.ai 管理控制台或自托管的 [Claude apps gateway](/docs/zh-CN/claude-apps-gateway) 获取518* [服务器托管设置](/docs/zh-CN/server-managed-settings),由 Claude Code 从 claude.ai 管理控制台或自托管的 [Claude apps gateway](/docs/zh-CN/claude-apps-gateway) 获取

519* MDM 或操作系统级别的策略,以及系统目录中的 `managed-settings.json` 文件519* MDM 或操作系统级别的策略,以及系统目录中的 `managed-settings.json` 文件

520* 嵌入主机(如 Claude Desktop),通过 SDK `managedSettings` 选项;请参阅[从嵌入主机控制策略](/docs/zh-CN/managed-settings#parent-settings-from-embedding-hosts)520* 嵌入主机(例如 Claude Desktop),通过 SDK `managedSettings` 选项提供;请参阅[从嵌入主机控制策略](/docs/zh-CN/managed-settings#parent-settings-from-embedding-hosts)

521 521 

522在在 Claude Desktop 应用中在你的机器上运行的 [Cowork](https://claude.com/docs/cowork/overview) 会话中,Claude Code 不会从 claude.ai 管理控制台获取服务器托管设置,它读取部署到你的设备的策略,除非你的组织的 Claude Desktop 配置设置 `requireCoworkFullVmSandbox`。[策略应用的位置和时间](/docs/zh-CN/managed-settings#where-and-when-a-policy-applies)涵盖 Cowork 和云会话。522在 Claude Desktop 应用中于您的机器上运行的 [Cowork](https://claude.com/docs/cowork/overview) 会话中,Claude Code 不会从 claude.ai 管理控制台获取服务器托管设置,并且会读取部署到您设备上的策略,除非您组织的 Claude Desktop 配置设置了 `requireCoworkFullVmSandbox`。[策略的生效位置和时间](/docs/zh-CN/managed-settings#where-and-when-a-policy-applies)介绍了 Cowork 和云端会话的情况。

523 523 

524如果你是管理员,[为你的组织设置 Claude Code](/docs/zh-CN/admin-setup) 介绍了选择要强制执行的内容,[部署托管设置](/docs/zh-CN/managed-settings)涵盖交付以及如何确认策略生效。524如果您是管理员,[为组织设置 Claude Code](/docs/zh-CN/admin-setup) 将引导您选择要强制执行的内容,[部署托管设置](/docs/zh-CN/managed-settings)介绍了交付方式以及如何确认策略已生效。有关 claude.ai 管理控制台中托管设置编辑器可能显示的警告,请参阅[配置服务器托管设置](/docs/zh-CN/server-managed-settings#configure-server-managed-settings)。

525 525 

526<h2 id="change-a-setting">526<h2 id="change-a-setting">

527 更改设置527 更改设置


809 809 

810[云会话](/docs/zh-CN/claude-code-on-the-web)在[云环境](/docs/zh-CN/cloud-environments)中运行在您的存储库的新克隆上,而不是在您的机器上。这改变了哪些设置到达它:810[云会话](/docs/zh-CN/claude-code-on-the-web)在[云环境](/docs/zh-CN/cloud-environments)中运行在您的存储库的新克隆上,而不是在您的机器上。这改变了哪些设置到达它:

811 811 

812* **共享项目设置** (`.claude/settings.json`):在一个存储库的会话中读取,因为该文件是克隆的一部分,会话在其中启动。在那里提交设置以在这些会话中应用它。具有多个存储库的会话在克隆上方启动,因此从每个存储库的 `.claude/settings.json` 仅读取 `enabledPlugins` 和 `extraKnownMarketplaces` 键,而不是权限规则、hooks、`env` 或其他键。这些两个键声明的市场和插件仍然[不在云会话中加载](/docs/zh-CN/cloud-environments#what-carries-over-from-your-setup)。812* **共享项目设置**(`.claude/settings.json`):在只有一个仓库的会话中会被读取,因为该文件是克隆的一部分,且会话在其中启动。将设置提交到该文件中,即可在这些会话中应用。在 Anthropic 托管的环境中,包含多个仓库的会话会在各克隆的上层目录启动,并且只从每个仓库的 `.claude/settings.json` 中读取 `enabledPlugins` 和 `extraKnownMarketplaces` 这两个键,而不会读取权限规则、hook、`env` 或其他键。这两个键所声明的市场和插件仍然[不会在云端会话中加载](/docs/zh-CN/cloud-environments#what-carries-over-from-your-setup)。对于自托管环境,请参阅[应用哪个仓库的设置](/docs/zh-CN/self-hosted-environments-configuration#repository-settings-in-sessions-with-several-repositories)。

813* **用户和项目本地设置** (`~/.claude/settings.json` 和 `.claude/settings.local.json`):不读取。两者都保持在您的机器上,本地文件不在克隆中。813* **用户和项目本地设置** (`~/.claude/settings.json` 和 `.claude/settings.local.json`):不读取。两者都保持在您的机器上,本地文件不在克隆中。

814* **托管设置**:您设备上的 `managed-settings.json` 文件或 MDM 配置文件不会到达云会话。您组织的[服务器管理设置](/docs/zh-CN/server-managed-settings)会;[表面覆盖](/docs/zh-CN/model-config#surface-coverage)列出哪些云会话接收它们。[自托管环境](/docs/zh-CN/self-hosted-environments)也读取其运行器镜像中的托管设置文件。[Claude Code 如何组合托管来源](/docs/zh-CN/managed-settings#how-claude-code-combines-managed-sources)说该文件何时适用。814* **托管设置**:您设备上的 `managed-settings.json` 文件或 MDM 配置文件不会到达云会话。您组织的[服务器管理设置](/docs/zh-CN/server-managed-settings)会;[表面覆盖](/docs/zh-CN/model-config#surface-coverage)列出哪些云会话接收它们。[自托管环境](/docs/zh-CN/self-hosted-environments)也读取其运行器镜像中的托管设置文件。[Claude Code 如何组合托管来源](/docs/zh-CN/managed-settings#how-claude-code-combines-managed-sources)说该文件何时适用。

815* **`/config`**:在您的浏览器中的 claude.ai/code,打开您的 claude.ai 设置的 Claude Code 部分而不是更改值。要为云会话更改设置,在环境上设置[环境变量](/docs/zh-CN/cloud-environments#set-environment-variables),或在具有一个存储库的会话中,将键提交到该存储库的 `.claude/settings.json`。815* **`/config`**:在您的浏览器中的 claude.ai/code,打开您的 claude.ai 设置的 Claude Code 部分而不是更改值。要为云会话更改设置,在环境上设置[环境变量](/docs/zh-CN/cloud-environments#set-environment-variables),或在具有一个存储库的会话中,将键提交到该存储库的 `.claude/settings.json`。

skills.md +2 −0

Details

94| `migrate` | 将您现有的 Claude API 代码更新到更新的模型 | 早于 v2.1.221 |94| `migrate` | 将您现有的 Claude API 代码更新到更新的模型 | 早于 v2.1.221 |

95| `upgrade` | 跨主要版本移动您的项目的 Anthropic SDK 依赖项,目前是 Python `anthropic` 包从 0.x 到 1.x | v2.1.236 或更高版本 |95| `upgrade` | 跨主要版本移动您的项目的 Anthropic SDK 依赖项,目前是 Python `anthropic` 包从 0.x 到 1.x | v2.1.236 或更高版本 |

96| `managed-agents-onboard` | 逐步完成创建新的托管代理 | 早于 v2.1.221 |96| `managed-agents-onboard` | 逐步完成创建新的托管代理 | 早于 v2.1.221 |

97| `managed-agents-onboard <url>` | 构建该 URL 所指页面描述的 Managed Agent,例如 [Managed Agents 文档](https://platform.claude.com/docs/en/managed-agents/overview)中的某个页面 | v2.1.290 或更高版本 |

98| `managed-agents-onboard <quickstart-name>` | 构建 Console 的某个快速入门模板,例如 `deep-researcher`。如果您提供的单个词不是模板名称,Claude 会列出有效的名称 | v2.1.290 或更高版本 |

97| `prompt-audit` | 标记为旧模型编写的指令在您的提示、技能和工具描述中,并提议修复作为差异 | v2.1.221 或更高版本 |99| `prompt-audit` | 标记为旧模型编写的指令在您的提示、技能和工具描述中,并提议修复作为差异 | v2.1.221 或更高版本 |

98| `cost-optimize` | 分析您的项目的 Claude API 支出去向,并提议从提示缓存、修剪不需要的输入和输出令牌、批处理、工作量和模型选择等选项中节省成本,一次一个更改 | v2.1.247 或更高版本 |100| `cost-optimize` | 分析您的项目的 Claude API 支出去向,并提议从提示缓存、修剪不需要的输入和输出令牌、批处理、工作量和模型选择等选项中节省成本,一次一个更改 | v2.1.247 或更高版本 |

99| `build-eval` | 为您的 Claude 驱动的应用构建评估集 | v2.1.259 或更高版本 |101| `build-eval` | 为您的 Claude 驱动的应用构建评估集 | v2.1.259 或更高版本 |

sub-agents.md +4 −2

Details

609主对话的权限模式决定 Claude Code 是否使用您设置的值:609主对话的权限模式决定 Claude Code 是否使用您设置的值:

610 610 

611* 当主对话在 `bypassPermissions`、`acceptEdits` 或 [auto mode](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode) 时,subagent 在该相同模式中运行,Claude Code 忽略您设置的 `permissionMode`。在自动模式下,分类器使用主对话的块和允许规则评估 subagent 的工具调用。当 subagent 完成时,分类器也会在报告被传递之前审查其工作和最终报告,如 [How auto mode handles subagents](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode) 所述。611* 当主对话在 `bypassPermissions`、`acceptEdits` 或 [auto mode](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode) 时,subagent 在该相同模式中运行,Claude Code 忽略您设置的 `permissionMode`。在自动模式下,分类器使用主对话的块和允许规则评估 subagent 的工具调用。当 subagent 完成时,分类器也会在报告被传递之前审查其工作和最终报告,如 [How auto mode handles subagents](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode) 所述。

612* 当主对话在 `default`、`dontAsk` 或 `plan` 模式时,subagent 在您设置的权限模式中运行,除了 `bypassPermissions`。声明 `bypassPermissions` 的 subagent 改为保持主对话的模式。`bypassPermissions` 例外需要 Claude Code v2.1.267 或更高版本。612* 当主对话处于 `default`、`dontAsk` 或 `plan` 模式时,子代理会在您设置的权限模式下运行。在以下情况下,它会改为保持主对话的权限模式:

613 * 您设置了 `bypassPermissions`。`bypassPermissions` 例外需要 Claude Code v2.1.267 或更高版本。

614 * 您设置了 `auto`,但子代理[无法使用自动模式](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode),例如某个设置文件设置了 [`disableAutoMode`](/docs/zh-CN/settings-reference#disableautomode),或子代理的模型不支持自动模式。

613 615 

614`permissionMode` 接受这些值,以及 `manual` 作为 `default` 的别名:616`permissionMode` 接受这些值,以及 `manual` 作为 `default` 的别名:

615 617 


640Implement API endpoints. Follow the conventions and patterns from the preloaded skills.642Implement API endpoints. Follow the conventions and patterns from the preloaded skills.

641```643```

642 644 

643每个列出的技能的完整内容被注入到 subagent 的上下文中。此字段控制哪些技能被预加载,而不是 subagent 可以访问哪些技能:没有它,subagent 仍然可以在执行期间通过 Skill 工具发现和调用项目、用户和 plugin 技能。要防止 subagent 完全调用技能,请从 [`tools`](#available-tools) 列表中省略 `Skill` 或将其添加到 `disallowedTools`。645每个列出的 skill 的完整内容会在启动时注入到子代理的上下文中,最多为列表中前 32 个不同的名称。此字段控制预加载哪些 skill,而不是子代理可以访问哪些 skill:即使没有此字段,子代理仍然可以在执行期间通过 Skill 工具发现和调用项目、用户和插件 skill。要完全阻止子代理调用 skill,请从 [`tools`](#available-tools) 列表中省略 `Skill`,或将其添加到 `disallowedTools`。

644 646 

645您无法预加载设置了 [`disable-model-invocation: true`](/docs/zh-CN/skills#control-who-invokes-a-skill) 的 skill,因为预加载的来源与 Claude 可以调用的 skill 集合相同。这包括内置的 `/verify` skill,Claude 无法自行运行它。647您无法预加载设置了 [`disable-model-invocation: true`](/docs/zh-CN/skills#control-who-invokes-a-skill) 的 skill,因为预加载的来源与 Claude 可以调用的 skill 集合相同。这包括内置的 `/verify` skill,Claude 无法自行运行它。

646 648 

Details

666 666 

667* WebFetch 拒绝 `localhost` 和任何其他没有点的主机名,例如裸露的内网名称,在发出请求之前。它返回的[错误](/docs/zh-CN/errors#webfetch-cannot-fetch-localhost)告诉 Claude 通过 Bash 使用 `curl` 到达本地服务器。667* WebFetch 拒绝 `localhost` 和任何其他没有点的主机名,例如裸露的内网名称,在发出请求之前。它返回的[错误](/docs/zh-CN/errors#webfetch-cannot-fetch-localhost)告诉 Claude 通过 Bash 使用 `curl` 到达本地服务器。

668* HTTP URL 会自动升级到 HTTPS。668* HTTP URL 会自动升级到 HTTPS。

669* 大型页面在处理前会被截断到固定的字符限制。669* WebFetch 每次调用最多读取页面内容的 100,000 个字符。在 Claude Code v2.1.290 或更高版本上,对于更长的页面,结果会告知 Claude 有多少内容未被读取,以便 Claude 可以获取下一部分。

670* WebFetch 默认缓存每个响应 15 分钟,所以重复获取同一 URL 会快速返回。在 Claude Code v2.1.233 或更高版本上,设置 [`CLAUDE_CODE_WEBFETCH_CACHE_TTL_MS`](/docs/zh-CN/env-vars#variables) 以更改 WebFetch 保留每个响应的时长。670* WebFetch 默认缓存每个响应 15 分钟,所以重复获取同一 URL 会快速返回。在 Claude Code v2.1.233 或更高版本上,设置 [`CLAUDE_CODE_WEBFETCH_CACHE_TTL_MS`](/docs/zh-CN/env-vars#variables) 以更改 WebFetch 保留每个响应的时长。

671* 一个页面如果在五分钟内未完成下载,包括 WebFetch 跟随的任何重定向,则会因截止期限错误而失败。在 Claude Code v2.1.268 或更高版本上,设置 [`CLAUDE_CODE_WEBFETCH_DEADLINE_MS`](/docs/zh-CN/env-vars#variables) 以更改限制,或设置为 `0` 以移除它。671* 一个页面如果在五分钟内未完成下载,包括 WebFetch 跟随的任何重定向,则会因截止期限错误而失败。在 Claude Code v2.1.268 或更高版本上,设置 [`CLAUDE_CODE_WEBFETCH_DEADLINE_MS`](/docs/zh-CN/env-vars#variables) 以更改限制,或设置为 `0` 以移除它。

672* 当 URL 重定向到不同的主机时,WebFetch 返回一个文本结果,命名原始 URL 和重定向目标,而不是跟随它。Claude 然后使用第二个 WebFetch 调用获取新 URL。672* 当 URL 重定向到不同的主机时,WebFetch 返回一个文本结果,命名原始 URL 和重定向目标,而不是跟随它。Claude 然后使用第二个 WebFetch 调用获取新 URL。

ultrareview.md +6 −6

Details

56 审查拉取请求56 审查拉取请求

57</h3>57</h3>

58 58 

59要审查 GitHub 拉取请求而不是本地分支,请传递 PR 编号:59要审查 `github.com` 上的拉取请求而不是本地分支,请传递 PR 编号:

60 60 

61```text theme={null}61```text theme={null}

62/code-review ultra 123462/code-review ultra 1234


64 64 

65该命令也接受 `#1234`、`PR 1234` 和粘贴的 PR URL;粘贴的 URL 必须指向您当前目录中的存储库。65该命令也接受 `#1234`、`PR 1234` 和粘贴的 PR URL;粘贴的 URL 必须指向您当前目录中的存储库。

66 66 

67在 PR 模式下,云沙箱直接从主机克隆拉取请求,而不是捆绑您的本地工作树。PR 模式适用于 `github.com` 上的存储库以及 Owner 已连接到 Claude Code 的 [GitHub Enterprise Server](/docs/zh-CN/github-enterprise-server) 实例。67PR 模式需要 `github.com` 上的仓库。对于 [GitHub Enterprise Server](/docs/zh-CN/github-enterprise-server) 实例上的仓库,请运行不带 PR 编号的 `/code-review ultra` 来审查您的本地分支。

68 68 

69对于 `github.com` 上的存储库,沙箱使用连接到您的 Claude 账户的 GitHub 账户进行克隆,因此该账户必须能够读取 PR 的存储库。69在 PR 模式下,云沙箱从 `github.com` 克隆拉取请求,而不是上传您的工作树。它使用连接到您的 Claude 账户的 GitHub 账户,因此该账户需要对仓库具有读取权限。

70 70 

71运行 [`/web-setup`](/docs/zh-CN/web-quickstart#connect-from-your-terminal) 将您的 GitHub CLI 登录连接到您的 Claude 账户。71运行 [`/web-setup`](/docs/zh-CN/web-quickstart#connect-from-your-terminal) 将您的 GitHub CLI 登录连接到您的 Claude 账户。

72 72 


74 将发现发布到拉取请求74 将发现发布到拉取请求

75</h3>75</h3>

76 76 

77在 Claude Code v2.1.227 或更高版本上,当您在 `github.com` 上审查拉取请求时,您可以让 Claude 将完成的发现作为来自您自己 GitHub 账户的单个纯文本评论发布到 PR。该评论不是审查或批准,并以"由 Claude Code 生成"的说明结尾。当您审查分支或 GitHub Enterprise Server 拉取请求时,Claude Code 仅在您的会话中显示发现。77在 Claude Code v2.1.227 或更高版本上,当您在 `github.com` 上审查拉取请求时,您可以让 Claude 将完成的发现作为来自您自己 GitHub 账户的单个纯文本评论发布到 PR。该评论不是审查或批准,并以"由 Claude Code 生成"的说明结尾。当您审查分支时,Claude Code 仅在您的会话中显示发现。

78 78 

79Claude Code 永远不会发布,除非您在该运行中选择,`--no-post` 是默认值。发布是您为每次运行做出的选择:79Claude Code 永远不会发布,除非您在该运行中选择,`--no-post` 是默认值。发布是您为每次运行做出的选择:

80 80 


106当 Claude Code 的文本超过一个单词且不是分支名称或 PR 引用时,它将您的文本视为说明。它将单个单词读取为分支名称或 PR 引用,因此拼写错误的分支名称会从[针对不同的基础进行审查](#review-against-a-different-base)获得最接近分支的错误,而不是使用说明启动。如果您的文本将 PR 引用与其他单词结合,如 `check PR 123 again`,Claude Code 也不会启动;它会要求您重新运行仅使用 PR 编号来审查该 PR,或不使用引用来审查您的当前分支。106当 Claude Code 的文本超过一个单词且不是分支名称或 PR 引用时,它将您的文本视为说明。它将单个单词读取为分支名称或 PR 引用,因此拼写错误的分支名称会从[针对不同的基础进行审查](#review-against-a-different-base)获得最接近分支的错误,而不是使用说明启动。如果您的文本将 PR 引用与其他单词结合,如 `check PR 123 again`,Claude Code 也不会启动;它会要求您重新运行仅使用 PR 编号来审查该 PR,或不使用引用来审查您的当前分支。

107 107 

108<Tip>108<Tip>

109 如果您的存储库太大而无法捆绑,Claude Code 会提示您改用 PR 模式。推送您的分支并打开草稿 PR,然后运行 `/code-review ultra <PR-number>`。109 如果您的仓库太大而无法捆绑,Claude Code 会提示您改用 PR 模式。对于 `github.com` 上的仓库,推送您的分支并打开草稿 PR,然后运行 `/code-review ultra <PR-number>`。

110</Tip>110</Tip>

111 111 

112<h3 id="diff-limits-and-fallbacks">112<h3 id="diff-limits-and-fallbacks">


173claude ultrareview origin/main173claude ultrareview origin/main

174```174```

175 175 

176不带参数时,该子命令会审查当前分支与默认分支之间的 diff;当不存在合并基准时,会执行与 `/code-review ultra` 相同的[回退到整个仓库审查](#diff-limits-and-fallbacks)。传入 PR 编号可审查对应的 Pull Request,传入基准分支则以该分支为基准进行审查;[基准分支的处理方式](#review-against-a-different-base)与交互式命令一致。176不带参数时,该子命令会审查当前分支与默认分支之间的 diff;当不存在合并基准时,会执行与 `/code-review ultra` 相同的[回退到整个仓库审查](#diff-limits-and-fallbacks)。传入 PR 编号可[审查 `github.com` 上的 Pull Request](#review-a-pull-request),传入基准分支则以该分支为基准进行审查;[基准分支的处理方式](#review-against-a-different-base)与交互式命令一致。

177 177 

178运行该子命令即表示您同意回退到整个仓库审查,并同意计费和条款确认提示,因此运行会直接开始,无需等待输入。只有您亲自运行才算作同意。如果改由 Claude 替您运行该子命令(例如通过 Bash 工具),Claude Code 会拒绝执行整个仓库审查。178运行该子命令即表示您同意回退到整个仓库审查,并同意计费和条款确认提示,因此运行会直接开始,无需等待输入。只有您亲自运行才算作同意。如果改由 Claude 替您运行该子命令(例如通过 Bash 工具),Claude Code 会拒绝执行整个仓库审查。

179 179 

vs-code.md +1 −0

Details

166* **书签**:将鼠标悬停在某条回复上并点击 **Bookmark response** 即可保存它,或在已保存的回复上点击 **Remove bookmark** 将其移除。166* **书签**:将鼠标悬停在某条回复上并点击 **Bookmark response** 即可保存它,或在已保存的回复上点击 **Remove bookmark** 将其移除。

167 167 

168 要查看已保存的回复,请打开 Bookmarks 面板:点击 Claude Code 面板顶部的书签图标,在命令菜单的 Context 部分中选择 **Bookmarks**,或输入 `/bookmarks`。需要 Claude Code v2.1.286 或更高版本。168 要查看已保存的回复,请打开 Bookmarks 面板:点击 Claude Code 面板顶部的书签图标,在命令菜单的 Context 部分中选择 **Bookmarks**,或输入 `/bookmarks`。需要 Claude Code v2.1.286 或更高版本。

169* **Claude 发送给您的文件**:当会话连接到 [Remote Control](/docs/zh-CN/remote-control#start-a-remote-control-session) 且 Claude 使用 [`SendUserFile` 工具](/docs/zh-CN/tools-reference)向您发送文件时,对话中会显示一行,例如 **Sent report.md, chart.png**。点击文件名即可在编辑器中打开该文件。

169* **上下文指示器**:输入框会显示您已使用了 Claude 上下文窗口的多少。Claude 会在需要时自动压缩,您也可以手动运行 `/compact`。170* **上下文指示器**:输入框会显示您已使用了 Claude 上下文窗口的多少。Claude 会在需要时自动压缩,您也可以手动运行 `/compact`。

170* **提示缓存时钟**:上下文指示器旁边的时钟图标会估算对话的[提示缓存](/docs/zh-CN/prompt-caching)在过期前还剩多少时间。它会从缓存的五分钟或一小时[生命周期](/docs/zh-CN/prompt-caching#cache-lifetime)开始倒计时,每次使用缓存的响应都会重新开始倒计时。除压缩外,[使缓存失效的操作](/docs/zh-CN/prompt-caching#actions-that-invalidate-the-cache)不会重置时钟,因此在您切换模型后它仍可能显示剩余分钟数。171* **提示缓存时钟**:上下文指示器旁边的时钟图标会估算对话的[提示缓存](/docs/zh-CN/prompt-caching)在过期前还剩多少时间。它会从缓存的五分钟或一小时[生命周期](/docs/zh-CN/prompt-caching#cache-lifetime)开始倒计时,每次使用缓存的响应都会重新开始倒计时。除压缩外,[使缓存失效的操作](/docs/zh-CN/prompt-caching#actions-that-invalidate-the-cache)不会重置时钟,因此在您切换模型后它仍可能显示剩余分钟数。

171 * 在倒计时结束之前,图标会显示剩余分钟数,例如 **12m**。172 * 在倒计时结束之前,图标会显示剩余分钟数,例如 **12m**。

workflows.md +27 −1

Details

354 354 

355主体是带有顶级 `await` 的纯 JavaScript。`agent()` 生成一个子代理,`pipeline()` 为列表中的每个项目运行一个,`parallel()` 同时运行一组代理任务并等待所有任务完成。355主体是带有顶级 `await` 的纯 JavaScript。`agent()` 生成一个子代理,`pipeline()` 为列表中的每个项目运行一个,`parallel()` 同时运行一组代理任务并等待所有任务完成。

356 356 

357如果您在运行中途停止 `agent()` 调用或它遇到不可恢复的 API 错误,则 `agent()` 调用解析为 `null`。`pipeline()` 在结果数组中保留每个 `null`,这就是为什么示例以 `.filter(Boolean)` 结尾以删除这些条目。357如果您在运行中途停止 `agent()` 调用或它遇到不可恢复的 API 错误,则 `agent()` 调用解析为 `null`。`pipeline()` 在结果数组中保留每个 `null`,这就是为什么示例以 `.filter(Boolean)` 结尾以删除这些条目,其中包括[每次尝试都停滞的 Agent](#when-an-agent-stalls-and-restarts) 所占的位置。

358 358 

359在[自动模式](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode)中,您的脚本传递给 `agent()` 的提示不会计为您的请求,当分类器审查该子代理的操作时,因为 Claude Code 将其标记为脚本计算的文本。359在[自动模式](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode)中,您的脚本传递给 `agent()` 的提示不会计为您的请求,当分类器审查该子代理的操作时,因为 Claude Code 将其标记为脚本计算的文本。

360 360 


463* 限制在 24 小时内重置。每周限制可能重置得更远。463* 限制在 24 小时内重置。每周限制可能重置得更远。

464* 运行还没有等待过两次。当它第三次达到限制时,代理会失败。464* 运行还没有等待过两次。当它第三次达到限制时,代理会失败。

465 465 

466<h3 id="when-an-agent-stalls-and-restarts">

467 当 Agent 停滞并重启时

468</h3>

469 

470如果某个 Agent 的输出停止到达足够长的时间,它会使用相同的提示词重新开始。在 [`/workflows`](#watch-the-run) 中,其名称会添加 `(retry 1)` 后缀,其详细信息会显示 `attempt 2 (stalled)`。重启是自动的,因此您无需执行任何操作。

471 

472新的尝试在开始时不带有停滞尝试的会话记录。停滞尝试已更改的文件保持更改状态,其消耗的 token 仍计入运行的总量。停滞窗口是 Claude Code 在结束尝试之前等待 Agent 输出的时长。Agent 等待其自身工具调用或等待[用量限制重置](#when-a-run-hits-your-usage-limit)所花费的时间不计入停滞窗口。

473 

474一个 Agent 最多重启五次,包括您使用 `r` 请求的任何重启。如果第六次尝试也停滞,`agent()` 调用会失败,错误的开头会说明原因:

475 

476* `agent stalled on all 6 attempts`:每次尝试在整个窗口内都没有输出。如果 Agent 的工作使其保持静默这么长时间,请延长窗口

477* `agent lost its reply on all 6 attempts`:每次尝试的响应流都变为静默,Claude Code 放弃了等待。延长停滞窗口没有帮助,因为[流式空闲看门狗](/docs/zh-CN/network-config#streaming-idle-watchdogs)先结束了响应,而 `CLAUDE_STREAM_IDLE_TIMEOUT_MS` 设置该看门狗的超时时间

478* `agent abandoned after 6 attempts`:各次尝试以不同方式结束,错误会按顺序列出这些方式

479 

480要在窗口结束前给 Agent 更多时间来产生输出:

481 

482* **单个 Agent**:在其 `agent()` 调用中以毫秒为单位传入 `stallMs`,例如 `agent(prompt, { stallMs: 1800000 })` 表示 30 分钟

483* **所有 Agent**:设置 [`CLAUDE_ASYNC_AGENT_STALL_TIMEOUT_MS`](/docs/zh-CN/env-vars#variables),它也适用于工作流之外的子代理

484 

485失败后运行是否继续取决于您的脚本如何调用该 Agent:

486 

487* **在 [`parallel()` 或 `pipeline()`](#what-the-saved-script-looks-like) 内部**:运行继续,用 `null` 代替该 Agent 的结果

488* **直接 await**:运行以该错误结束

489 

490要重试,请要求 Claude 重新启动工作流。[暂停后恢复](#resume-after-a-pause)介绍了哪些内容会再次运行。

491 

466<h3 id="cost">492<h3 id="cost">

467 成本493 成本

468</h3>494</h3>

worktrees.md +1 −1

Details

104* **Git 重定向**:Claude Code 阻止将 git 重定向到主检出的 Bash 或 Monitor 命令。重定向可以通过 `git -C`、`--git-dir`、`GIT_DIR` 或 `GIT_WORK_TREE` 变量,或在运行 git 之前 `cd` 到主检出来进行。104* **Git 重定向**:Claude Code 阻止将 git 重定向到主检出的 Bash 或 Monitor 命令。重定向可以通过 `git -C`、`--git-dir`、`GIT_DIR` 或 `GIT_WORK_TREE` 变量,或在运行 git 之前 `cd` 到主检出来进行。

105* **命令形状**:当 Claude Code 无法从命令文本验证命令运行的任何 git 保持在 worktree 内时,它会阻止 Bash 或 Monitor 命令。例如,当命令名称在运行时计算、语法无法解析,或当诸如 `${!name}` 或 `${ command; }` 之类的扩展可能运行文本中未明确说明的命令时,就会发生这种情况。Claude Code 告诉 Claude 如何重写被拒绝的命令,例如将其分割成普通的单独命令。您无法关闭此检查。105* **命令形状**:当 Claude Code 无法从命令文本验证命令运行的任何 git 保持在 worktree 内时,它会阻止 Bash 或 Monitor 命令。例如,当命令名称在运行时计算、语法无法解析,或当诸如 `${!name}` 或 `${ command; }` 之类的扩展可能运行文本中未明确说明的命令时,就会发生这种情况。Claude Code 告诉 Claude 如何重写被拒绝的命令,例如将其分割成普通的单独命令。您无法关闭此检查。

106 106 

107这些检查读取编辑所针对的路径、命令运行所在的目录以及命令的文本。它们都不会跟踪 shell 命令写入了哪些文件,因此,在主检出中写入文件但并未在那里运行 git 的命令(例如 `cp` 或 shell 重定向)不会被这些检查拒绝。Claude Code 会像对待任何其他 shell 命令一样对待该命令,因此它是直接运行还是向您发出提示,取决于您的[权限模式](/docs/zh-CN/permission-modes)和规则。107这些检查读取编辑所针对的路径、命令运行所在的目录以及命令的文本。它们都不会跟踪 shell 命令写入了哪些文件,因此,在主检出中写入文件但并未在那里运行 git 的命令(例如 `cp` 或 shell 重定向)不会被这些检查拒绝。Claude Code 会像对待任何其他 shell 命令一样,依据您的[权限](/docs/zh-CN/permissions)和[沙箱隔离](/docs/zh-CN/sandboxing)设置来处理该命令。

108 108 

109检查适用于您启动 Claude Code 的存储库。它们也涵盖链接的 worktree 链接自的主检出。对于 PowerShell 命令,Claude Code 仅应用工作目录检查。109检查适用于您启动 Claude Code 的存储库。它们也涵盖链接的 worktree 链接自的主检出。对于 PowerShell 命令,Claude Code 仅应用工作目录检查。

110 110