SpyBara
Go Premium

Documentation 2026-10-09 23:02 UTC to 2026-10-10 21:01 UTC

69 files changed +1,195 −382. View all changes and history on the product overview
2026
Sat 10 21:01 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

187 187 

188Claude 根据任务确定调用哪些工具,但你控制这些调用是否被允许执行。你可以自动批准特定工具、完全阻止其他工具,或要求对所有工具进行批准。三个选项一起工作以确定什么运行:188Claude 根据任务确定调用哪些工具,但你控制这些调用是否被允许执行。你可以自动批准特定工具、完全阻止其他工具,或要求对所有工具进行批准。三个选项一起工作以确定什么运行:

189 189 

190* **`allowed_tools` / `allowedTools`** 自动批准列出的工具。具有 `["Read", "Glob", "Grep"]` 在其允许工具列表中的只读代理运行这些工具而不提示。未列出的工具仍然可用,对它们的调用如果需要批准会转到权限模式和 `canUseTool`。190* **`allowed_tools` / `allowedTools`** 自动批准列出的工具。允许工具列表中包含 `["Read", "Glob", "Grep"]` 的只读 Agent 会运行这些工具而不提示,但从[网络路径](/docs/zh-CN/permissions#network-paths)读取的情况除外。未列出的工具仍然可用,对它们的调用如果需要批准会转到权限模式和 `canUseTool`。

191* **`disallowed_tools` / `disallowedTools`** 阻止列出的工具,无论其他设置如何。有关在工具运行前检查规则的顺序,请参阅 [权限](/docs/zh-CN/agent-sdk/permissions)。191* **`disallowed_tools` / `disallowedTools`** 阻止列出的工具,无论其他设置如何。有关在工具运行前检查规则的顺序,请参阅 [权限](/docs/zh-CN/agent-sdk/permissions)。

192* **`permission_mode` / `permissionMode`** 控制你想要多少人工监督。SDK 按固定顺序评估活跃模式以及你的允许和拒绝规则,详见 [权限如何被评估](/docs/zh-CN/agent-sdk/permissions#how-permissions-are-evaluated)。有关可用模式,请参阅 [权限模式](#permission-mode)。192* **`permission_mode` / `permissionMode`** 控制你想要多少人工监督。SDK 按固定顺序评估活跃模式以及你的允许和拒绝规则,详见 [权限如何被评估](/docs/zh-CN/agent-sdk/permissions#how-permissions-are-evaluated)。有关可用模式,请参阅 [权限模式](#permission-mode)。

193 193 


263| `"default"` | 需要批准且不被允许规则覆盖的工具调用触发你的 `canUseTool` 回调;没有回调意味着拒绝 | 具有自定义批准回调的交互式应用程序 |263| `"default"` | 需要批准且不被允许规则覆盖的工具调用触发你的 `canUseTool` 回调;没有回调意味着拒绝 | 具有自定义批准回调的交互式应用程序 |

264| `"acceptEdits"` | 自动批准文件编辑和常见文件系统命令(`mkdir`、`touch`、`mv`、`cp` 等);其他 Bash 命令遵循默认规则 | 你信任 Claude 的编辑并想要更快的迭代,例如在原型设计期间或在隔离目录中工作时 |264| `"acceptEdits"` | 自动批准文件编辑和常见文件系统命令(`mkdir`、`touch`、`mv`、`cp` 等);其他 Bash 命令遵循默认规则 | 你信任 Claude 的编辑并想要更快的迭代,例如在原型设计期间或在隔离目录中工作时 |

265| `"plan"` | Claude 探索并规划而不编辑你的源文件;文件编辑永远不会自动批准,并通过你的 `canUseTool` 回调提示 | 你想要 Claude 提议更改而不执行它们,例如在代码审查期间或当你需要在进行更改前批准它们时 |265| `"plan"` | Claude 探索并规划而不编辑你的源文件;文件编辑永远不会自动批准,并通过你的 `canUseTool` 回调提示 | 你想要 Claude 提议更改而不执行它们,例如在代码审查期间或当你需要在进行更改前批准它们时 |

266| `"dontAsk"` | 从不提示。由 [权限规则](/docs/zh-CN/settings-reference#permission-settings) 预批准的工具运行,以及在 `default` 模式中不需要批准的调用(如你的工作目录内的文件读取);所有其他会提示的调用都被拒绝。`AskUserQuestion`、连接器工具 [你的组织设置为 `ask`](/docs/zh-CN/mcp#organization-controls-on-connector-tools) 和标记为 [`requiresUserInteraction`](/docs/zh-CN/mcp#require-approval-for-a-specific-tool) 的 MCP 工具即使你已允许它们也会被拒绝 | 你想要为无头代理提供固定、明确的工具表面,并且更喜欢硬拒绝而不是在 `canUseTool` 缺失时的无声依赖 |266| `"dontAsk"` | 从不提示。由 [权限规则](/docs/zh-CN/settings-reference#permission-settings) 预批准的工具会运行,在 `default` 模式中不需要批准的调用(如您的工作目录内的文件读取)也会运行;所有其他会提示的调用都被拒绝。`AskUserQuestion`、[您的组织设置为 `ask`](/docs/zh-CN/mcp#organization-controls-on-connector-tools) 的连接器工具、标记为 [`requiresUserInteraction`](/docs/zh-CN/mcp#require-approval-for-a-specific-tool) 的 MCP 工具以及 [从网络路径读取](/docs/zh-CN/permissions#network-paths) 即使您已允许它们也会被拒绝 | 您希望为无头 Agent 提供固定、明确的工具范围,并且更倾向于硬拒绝,而不是默默依赖 `canUseTool` 缺失 |

267| `"auto"` | 使用模型分类器来审查诸如 shell 命令和网络请求之类的操作,允许或阻止它审查的每一个。有关可用性和决策顺序,请参阅 [自动模式](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode) | 仍然想要工具使用安全防护的自主代理 |267| `"auto"` | 使用模型分类器来审查诸如 shell 命令和网络请求之类的操作,允许或阻止它审查的每一个。有关可用性和决策顺序,请参阅 [自动模式](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode) | 仍然想要工具使用安全防护的自主代理 |

268| `"bypassPermissions"` | 运行所有允许的工具而不询问,除了由显式 [`ask` 规则](/docs/zh-CN/settings-reference#permission-settings) 匹配的工具、连接器工具 [你的组织设置为 `ask`](/docs/zh-CN/mcp#organization-controls-on-connector-tools) 和需要用户交互的工具。[跨会话消息安全防护](/docs/zh-CN/permission-modes#skip-all-checks-with-bypasspermissions-mode) 仍然适用。有关优先级顺序,请参阅 [权限如何被评估](/docs/zh-CN/agent-sdk/permissions#how-permissions-are-evaluated)。在 TypeScript SDK 中,还需要在 `options` 中设置 `allowDangerouslySkipPermissions: true`。无法在 Unix 上以 root 身份运行。仅在隔离环境中使用,其中代理的操作无法影响你关心的系统 | CI、容器或其他隔离环境 |268| `"bypassPermissions"` | 运行所有允许的工具而不询问,除了由显式 [`ask` 规则](/docs/zh-CN/settings-reference#permission-settings) 匹配的工具、连接器工具 [你的组织设置为 `ask`](/docs/zh-CN/mcp#organization-controls-on-connector-tools) 和需要用户交互的工具。[跨会话消息安全防护](/docs/zh-CN/permission-modes#skip-all-checks-with-bypasspermissions-mode) 仍然适用。有关优先级顺序,请参阅 [权限如何被评估](/docs/zh-CN/agent-sdk/permissions#how-permissions-are-evaluated)。在 TypeScript SDK 中,还需要在 `options` 中设置 `allowDangerouslySkipPermissions: true`。无法在 Unix 上以 root 身份运行。仅在隔离环境中使用,其中代理的操作无法影响你关心的系统 | CI、容器或其他隔离环境 |

269 269 

Details

424 自动批准特定工具424 自动批准特定工具

425</h3>425</h3>

426 426 

427默认情况下,代理可能在使用某些工具前提示权限。此示例通过返回 `permissionDecision: 'allow'` 自动批准只读文件系统工具(Read、Glob、Grep),让它们无需用户确认即可运行,同时让所有其他工具受到正常权限检查:427默认情况下,Agent 可能在使用某些工具前请求权限。此示例通过返回 `permissionDecision: 'allow'` 自动批准只读文件系统工具(Read、Glob、Grep),让它们无需用户确认即可运行(从[网络路径](/docs/zh-CN/permissions#network-paths)读取的操作除外),同时让所有其他工具受到正常权限检查:

428 428 

429<CodeGroup>429<CodeGroup>

430 ```python Python theme={null}430 ```python Python theme={null}

Details

44 检查 `allow` 规则(来自 `allowed_tools` 和 settings.json)。如果规则匹配,工具被批准。工具自己批准的调用也在此步骤被解决,无需规则:例如在您的工作目录内的文件读取或 [只读 Bash 命令](/docs/zh-CN/permissions#read-only-commands)。44 检查 `allow` 规则(来自 `allowed_tools` 和 settings.json)。如果规则匹配,工具被批准。工具自己批准的调用也在此步骤被解决,无需规则:例如在您的工作目录内的文件读取或 [只读 Bash 命令](/docs/zh-CN/permissions#read-only-commands)。

45 45 

46 针对 [关键路径](/docs/zh-CN/permission-modes#critical-paths) 的 `rm` 和 `rmdir` 删除永远不会被允许规则批准。它们是否随后到达您的回调取决于权限模式:例如在 `auto` 模式的 Agent SDK 会话中,Claude Code 默认拒绝它们而不调用它。[关键路径](/docs/zh-CN/permission-modes#critical-paths) 模式表列出了每种模式对它们的处理方式。46 针对 [关键路径](/docs/zh-CN/permission-modes#critical-paths) 的 `rm` 和 `rmdir` 删除永远不会被允许规则批准。它们是否随后到达您的回调取决于权限模式:例如在 `auto` 模式的 Agent SDK 会话中,Claude Code 默认拒绝它们而不调用它。[关键路径](/docs/zh-CN/permission-modes#critical-paths) 模式表列出了每种模式对它们的处理方式。

47 

48 允许规则不会批准从 [网络路径](/docs/zh-CN/permissions#network-paths) 进行的读取。

47 </Step>49 </Step>

48 50 

49 <Step title="canUseTool 回调">51 <Step title="canUseTool 回调">


60如果您在 TypeScript SDK 期望评估顺序在咨询回调之前自动批准调用的配置中传递 `canUseTool` 回调,SDK 在构造查询时会发出一次 Node.js 进程警告。警告的代码是 `CLAUDE_SDK_CAN_USE_TOOL_SHADOWED`。两个配置会触发它:62如果您在 TypeScript SDK 期望评估顺序在咨询回调之前自动批准调用的配置中传递 `canUseTool` 回调,SDK 在构造查询时会发出一次 Node.js 进程警告。警告的代码是 `CLAUDE_SDK_CAN_USE_TOOL_SHADOWED`。两个配置会触发它:

61 63 

62* `permissionMode: 'bypassPermissions'`,它自动批准到达权限模式步骤的每个调用,除了 [任何模式都不自动批准的操作](/docs/zh-CN/permission-modes#actions-no-mode-auto-approves)64* `permissionMode: 'bypassPermissions'`,它自动批准到达权限模式步骤的每个调用,除了 [任何模式都不自动批准的操作](/docs/zh-CN/permission-modes#actions-no-mode-auto-approves)

63* 每个裸 `allowedTools` 条目,如 `"Read"`,它在回调被咨询之前自动批准整个工具,除了 [任何模式都不自动批准的操作](/docs/zh-CN/permission-modes#actions-no-mode-auto-approves)65* 每个裸 `allowedTools` 条目,如 `"Read"`,它在回调被咨询之前自动批准整个工具,除了 [任何模式都不自动批准的操作](/docs/zh-CN/permission-modes#actions-no-mode-auto-approves) 和 [从网络路径进行的读取](/docs/zh-CN/permissions#network-paths)

64 66 

65带有说明符的条目,如 `Bash(ls *)` 和 `acceptEdits` 模式不会触发它,来自设置文件的允许规则对检查不可见。67带有说明符的条目,如 `Bash(ls *)` 和 `acceptEdits` 模式不会触发它,来自设置文件的允许规则对检查不可见。

66 68 


79 81 

80| 选项 | 效果 |82| 选项 | 效果 |

81| :- | :- |83| :- | :- |

82| `allowed_tools=["Read", "Grep"]` | `Read` 和 `Grep` 被自动批准。此处未列出的其他工具仍然存在,对它们的调用如果需要批准,则会进入权限模式和 `canUseTool`。 |84| `allowed_tools=["Read", "Grep"]` | `Read` 和 `Grep` 被自动批准,[从网络路径读取](/docs/zh-CN/permissions#network-paths)除外。此处未列出的其他工具仍然存在,对它们的调用如果需要批准,则会进入权限模式和 `canUseTool`。 |

83| `disallowed_tools=["Bash"]` | `Bash` 工具定义从请求中移除。Claude 看不到该工具,无法尝试使用它。 |85| `disallowed_tools=["Bash"]` | `Bash` 工具定义从请求中移除。Claude 看不到该工具,无法尝试使用它。 |

84| `disallowed_tools=["Bash(rm *)"]` | `Bash` 保持可用。匹配 `rm *` [如所写](/docs/zh-CN/permissions#bash-rule-limits) 的调用在每种权限模式中都被拒绝,包括 `bypassPermissions`。其他 `Bash` 调用(包括 `/bin/rm`)会进入权限模式。 |86| `disallowed_tools=["Bash(rm *)"]` | `Bash` 保持可用。匹配 `rm *` [如所写](/docs/zh-CN/permissions#bash-rule-limits) 的调用在每种权限模式中都被拒绝,包括 `bypassPermissions`。其他 `Bash` 调用(包括 `/bin/rm`)会进入权限模式。 |

85| `disallowed_tools=["*"]` | 每个工具定义都从请求中移除。拒绝规则中支持工具名称通配符:`"*"` 匹配每个工具,`"mcp__*"` 匹配所有服务器中的每个 MCP 工具。 |87| `disallowed_tools=["*"]` | 每个工具定义都从请求中移除。拒绝规则中支持工具名称通配符:`"*"` 匹配每个工具,`"mcp__*"` 匹配所有服务器中的每个 MCP 工具。 |


95 97 

96 允许规则永远不会自动批准 `AskUserQuestion`、标记为 [`_meta["anthropic/requiresUserInteraction"]`](/docs/zh-CN/mcp#require-approval-for-a-specific-tool) 的 MCP 工具、连接器工具[你的组织设置为 `ask`](/docs/zh-CN/mcp#organization-controls-on-connector-tools),或针对[关键路径](/docs/zh-CN/permission-modes#critical-paths)的 `rm` 和 `rmdir` 移除。在 `dontAsk` 模式中,Claude Code 拒绝这些调用而不调用回调。在其他模式中,前三个会到达回调。根据[权限模式](/docs/zh-CN/permission-modes#critical-paths),关键路径移除要么到达回调,要么 Claude Code 拒绝它而不调用它,就像它在 `auto` 模式中对 Agent SDK 会话默认做的那样。98 允许规则永远不会自动批准 `AskUserQuestion`、标记为 [`_meta["anthropic/requiresUserInteraction"]`](/docs/zh-CN/mcp#require-approval-for-a-specific-tool) 的 MCP 工具、连接器工具[你的组织设置为 `ask`](/docs/zh-CN/mcp#organization-controls-on-connector-tools),或针对[关键路径](/docs/zh-CN/permission-modes#critical-paths)的 `rm` 和 `rmdir` 移除。在 `dontAsk` 模式中,Claude Code 拒绝这些调用而不调用回调。在其他模式中,前三个会到达回调。根据[权限模式](/docs/zh-CN/permission-modes#critical-paths),关键路径移除要么到达回调,要么 Claude Code 拒绝它而不调用它,就像它在 `auto` 模式中对 Agent SDK 会话默认做的那样。

97 99 

98 覆盖范围取决于条目的形式:像 `Read` 或 `mcp__github__get_issue` 这样的裸名称会自动批准对该工具的每个调用,除了上面列出的例外,而像 `Bash(npm test *)` 这样的限定规则仅自动批准匹配的调用,其他需要批准的 `Bash` 调用仍然会进入回调。对于必须在每个工具调用上运行的检查,使用 [`PreToolUse` hook](/docs/zh-CN/agent-sdk/hooks):hooks 在每个其他步骤之前运行,hook 拒绝即使在 `bypassPermissions` 模式中也适用。100 覆盖范围取决于条目的形式:像 `Read` 或 `mcp__github__get_issue` 这样的裸名称会自动批准对该工具的每个调用,上述例外和[从网络路径读取](/docs/zh-CN/permissions#network-paths)除外,而像 `Bash(npm test *)` 这样的限定规则仅自动批准匹配的调用,其他需要批准的 `Bash` 调用仍然会进入回调。对于必须在每个工具调用上运行的检查,使用 [`PreToolUse` hook](/docs/zh-CN/agent-sdk/hooks):hook 在每个其他步骤之前运行,hook 拒绝即使在 `bypassPermissions` 模式中也适用。

99</Warning>101</Warning>

100 102 

101对于锁定的代理,将 `allowedTools` 与 `permissionMode: "dontAsk"` 配对:103对于锁定的代理,将 `allowedTools` 与 `permissionMode: "dontAsk"` 配对:


107};109};

108```110```

109 111 

110列出的工具被批准,除了[任何模式都不自动批准的操作](/docs/zh-CN/permission-modes#actions-no-mode-auto-approves),以及每个其他会提示的调用都被拒绝。在 `default` 模式中不需要批准的调用会运行,无论你是否列出它们,例如[只读 Bash 命令](/docs/zh-CN/permissions#read-only-commands)、不在运行前询问的 `Agent` 等工具,以及工作目录内的文件读取。要使工具完全超出 Claude 的范围,请将其裸名称添加到 `disallowedTools`。112列出的工具被批准,[任何模式都不自动批准的操作](/docs/zh-CN/permission-modes#actions-no-mode-auto-approves)和[从网络路径读取](/docs/zh-CN/permissions#network-paths)除外,而每个其他会提示的调用都会被拒绝。在 `default` 模式中不需要批准的调用会运行,无论您是否列出它们,例如[只读 Bash 命令](/docs/zh-CN/permissions#read-only-commands)、不在运行前询问的 `Agent` 等工具,以及工作目录内的文件读取。要将工具从请求中完全移除,请将其裸名称添加到 `disallowedTools`。

111 113 

112<Warning>114<Warning>

113 **`allowed_tools` 不限制 `bypassPermissions`。** `allowed_tools` 预批准你列出的工具。其他未列出的工具不匹配任何允许规则,会进入权限模式,其中 `bypassPermissions` 批准它们。将 `allowed_tools=["Read"]` 与 `permission_mode="bypassPermissions"` 一起设置仍然会批准每个工具,包括 `Bash`、`Write` 和 `Edit`。如果你需要 `bypassPermissions` 但想要阻止特定工具,请使用 `disallowed_tools`。115 **`allowed_tools` 不限制 `bypassPermissions`。** `allowed_tools` 预批准你列出的工具。其他未列出的工具不匹配任何允许规则,会进入权限模式,其中 `bypassPermissions` 批准它们。将 `allowed_tools=["Read"]` 与 `permission_mode="bypassPermissions"` 一起设置仍然会批准每个工具,包括 `Bash`、`Write` 和 `Edit`。如果你需要 `bypassPermissions` 但想要阻止特定工具,请使用 `disallowed_tools`。


139| 模式 | 描述 | 工具行为 |141| 模式 | 描述 | 工具行为 |

140| :- | :- | :- |142| :- | :- | :- |

141| `default` | 标准权限行为 | 无基于模式的自动批准;需要批准且不匹配任何允许规则的调用会触发您的 `canUseTool` 回调 |143| `default` | 标准权限行为 | 无基于模式的自动批准;需要批准且不匹配任何允许规则的调用会触发您的 `canUseTool` 回调 |

142| `dontAsk` | 拒绝而不是提示 | 任何会提示的调用都被拒绝。由 `allowed_tools` 或规则批准的调用会运行,`default` 模式下不需要批准的调用也会运行;连接器工具[您的组织设置为 `ask`](/docs/zh-CN/mcp#organization-controls-on-connector-tools)和需要用户交互的工具即使您已预先批准也会被拒绝,`rm` 和 `rmdir` 针对[关键路径](/docs/zh-CN/permission-modes#critical-paths)的删除也会被拒绝。`canUseTool` 永远不会被调用 |144| `dontAsk` | 拒绝而不是提示 | 任何会提示的调用都被拒绝。由 `allowed_tools` 或规则批准的调用会运行,`default` 模式下不需要批准的调用也会运行;连接器工具[您的组织设置为 `ask`](/docs/zh-CN/mcp#organization-controls-on-connector-tools)和需要用户交互的工具即使您已预先批准也会被拒绝,[来自网络路径的读取](/docs/zh-CN/permissions#network-paths)以及 `rm` 和 `rmdir` 针对[关键路径](/docs/zh-CN/permission-modes#critical-paths)的删除也会被拒绝。`canUseTool` 永远不会被调用 |

143| `acceptEdits` | 自动接受文件编辑 | 文件编辑和[文件系统操作](#accept-edits-mode-acceptedits)(`mkdir`、`rm`、`mv` 等)会自动批准 |145| `acceptEdits` | 自动接受文件编辑 | 文件编辑和[文件系统操作](#accept-edits-mode-acceptedits)(`mkdir`、`rm`、`mv` 等)会自动批准 |

144| `bypassPermissions` | 绕过权限检查 | 工具运行时无需权限提示,除了[任何模式都不自动批准的操作](/docs/zh-CN/permission-modes#actions-no-mode-auto-approves)。请谨慎使用 |146| `bypassPermissions` | 绕过权限检查 | 工具运行时无需权限提示,除了[任何模式都不自动批准的操作](/docs/zh-CN/permission-modes#actions-no-mode-auto-approves)。请谨慎使用 |

145| `plan` | 规划模式 | Claude 在不编辑您的源文件的情况下探索和规划;文件编辑永远不会自动批准,而是通过您的 `canUseTool` 回调提示 |147| `plan` | 规划模式 | Claude 在不编辑您的源文件的情况下探索和规划;文件编辑永远不会自动批准,而是通过您的 `canUseTool` 回调提示 |


286 不要询问模式(`dontAsk`)288 不要询问模式(`dontAsk`)

287</h4>289</h4>

288 290 

289将任何权限提示转换为拒绝,而不调用 `canUseTool`。由 `allowed_tools`、`settings.json` 允许规则或钩子预先批准的工具会正常运行,`default` 模式下不需要批准的调用也会运行,例如在您的工作目录内的文件读取和对 `Agent` 的调用。连接器工具[您的组织设置为 `ask`](/docs/zh-CN/mcp#organization-controls-on-connector-tools)、需要用户交互的工具,以及 `rm` 和 `rmdir` 针对[关键路径](/docs/zh-CN/permission-modes#critical-paths)的删除即使允许规则匹配也会被拒绝。`PreToolUse` 钩子允许也不会清除关键路径删除。291将任何权限提示转换为拒绝,而不调用 `canUseTool`。由 `allowed_tools`、`settings.json` 允许规则或 hook 预先批准的工具会正常运行,`default` 模式下不需要批准的调用也会运行,例如在您的工作目录内的文件读取和对 `Agent` 的调用。连接器工具[您的组织设置为 `ask`](/docs/zh-CN/mcp#organization-controls-on-connector-tools)、需要用户交互的工具、[来自网络路径的读取](/docs/zh-CN/permissions#network-paths),以及 `rm` 和 `rmdir` 针对[关键路径](/docs/zh-CN/permission-modes#critical-paths)的删除即使允许规则匹配也会被拒绝。`PreToolUse` hook 允许也不会放行关键路径删除或来自网络路径的读取。

290 292 

291**使用场景:** 您希望为无头代理提供固定的、明确的工具表面,并且更喜欢硬拒绝而不是依赖 `canUseTool` 不存在的无声依赖。293**使用场景:** 您希望为无头代理提供固定的、明确的工具表面,并且更喜欢硬拒绝而不是依赖 `canUseTool` 不存在的无声依赖。

292 294 

Details

518 print(session.summary)518 print(session.summary)

519```519```

520 520 

521<h3 id="fork_session">

522 `fork_session()`

523</h3>

524 

525将会话的会话记录复制到新会话中,以便您可以将对话引向另一个方向,同时原始会话保持不变。要从对话中较早的某个点分支,请传递 `up_to_message_id`。同步。

526 

527```python theme={null}

528def fork_session(

529 session_id: str,

530 directory: str | None = None,

531 up_to_message_id: str | None = None,

532 title: str | None = None,

533) -> ForkSessionResult

534```

535 

536<h4 id="parameters-9">

537 参数

538</h4>

539 

540| 参数 | 类型 | 默认值 | 描述 |

541| :- | :- | :- | :- |

542| `session_id` | `str` | 必需 | 要分叉的会话的 UUID |

543| `directory` | `str \| None` | `None` | 项目目录路径。省略时,搜索所有项目目录 |

544| `up_to_message_id` | `str \| None` | `None` | 复制会话记录直到(并包括)具有此 UUID 的消息,例如来自 [`get_session_messages()`](#get_session_messages) 的 `uuid`。省略时,复制整个会话记录 |

545| `title` | `str \| None` | `None` | 分叉的标题。省略时,SDK 会从原始会话派生一个标题,后跟 `(fork)` |

546 

547返回一个 `ForkSessionResult`,其 `session_id` 是新会话的 UUID。将其作为 [`resume`](#claudeagentoptions) 传递即可继续该分叉。分叉不包含原始会话的[文件检查点](/docs/zh-CN/agent-sdk/file-checkpointing),因此您无法将其回退到分叉之前捕获的检查点。

548 

549`fork_session()` 会抛出:

550 

551* `ValueError`:`session_id` 或 `up_to_message_id` 不是有效的 UUID

552* `ValueError`:会话没有消息,或 `up_to_message_id` 与会话记录中的任何消息都不匹配

553* `FileNotFoundError`:找不到会话

554 

555<h4 id="example-8">

556 示例

557</h4>

558 

559以新标题分叉最近的会话,然后恢复该分叉。原始会话保留其自身的历史记录。

560 

561```python theme={null}

562from claude_agent_sdk import fork_session, list_sessions

563 

564sessions = list_sessions(directory="/path/to/project", limit=1)

565if sessions:

566 forked = fork_session(sessions[0].session_id, title="Try the OAuth approach")

567 print(forked.session_id) # pass as ClaudeAgentOptions(resume=...) to continue the fork

568```

569 

521<h2 id="classes">570<h2 id="classes">

522 类571 类

523</h2>572</h2>


919| 属性 | 类型 | 默认值 | 描述 |968| 属性 | 类型 | 默认值 | 描述 |

920| :- | :- | :- | :- |969| :- | :- | :- | :- |

921| `tools` | `list[str] \| ToolsPreset \| None` | `None` | 工具配置。使用 `{"type": "preset", "preset": "claude_code"}` 获取 Claude Code 的默认工具 |970| `tools` | `list[str] \| ToolsPreset \| None` | `None` | 工具配置。使用 `{"type": "preset", "preset": "claude_code"}` 获取 Claude Code 的默认工具 |

922| `allowed_tools` | `list[str]` | `[]` | 无需提示即可自动批准的工具。这不会限制 Claude 仅使用这些工具。如果您在此处列出[任务跟踪工具](/docs/zh-CN/agent-sdk/todo-tracking#model-availability)之一,Claude Code 也会为该会话启用它们。其他未列出的工具会交由 `permission_mode` 和 `can_use_tool` 处理。使用 `disallowed_tools` 阻止工具。见 [权限](/docs/zh-CN/agent-sdk/permissions#allow-and-deny-rules) |971| `allowed_tools` | `list[str]` | `[]` | 无需提示即可自动批准的工具,但从[网络路径](/docs/zh-CN/permissions#network-paths)进行的读取除外。这不会限制 Claude 仅使用这些工具。如果您在此处列出[任务跟踪工具](/docs/zh-CN/agent-sdk/todo-tracking#model-availability)之一,Claude Code 也会为该会话启用它们。其他未列出的工具会交由 `permission_mode` 和 `can_use_tool` 处理。使用 `disallowed_tools` 阻止工具。见 [权限](/docs/zh-CN/agent-sdk/permissions#allow-and-deny-rules) |

923| `system_prompt` | `str \| SystemPromptPreset \| SystemPromptCustom \| SystemPromptFile \| None` | `None` | 系统提示词配置。传递字符串以使用自定义提示词,`{"type": "preset", "preset": "claude_code"}` 以使用 Claude Code 的系统提示词(带可选 `"append"`),`{"type": "custom", "prompt": "..."}` 以使用也可以设置 `"snapshot"` 的自定义提示词,或 `{"type": "file", "path": "..."}` 从磁盘加载大型提示词。见 [`SystemPromptPreset`](#systempromptpreset)、[`SystemPromptCustom`](#systempromptcustom) 和 [`SystemPromptFile`](#systempromptfile) |972| `system_prompt` | `str \| SystemPromptPreset \| SystemPromptCustom \| SystemPromptFile \| None` | `None` | 系统提示词配置。传递字符串以使用自定义提示词,`{"type": "preset", "preset": "claude_code"}` 以使用 Claude Code 的系统提示词(带可选 `"append"`),`{"type": "custom", "prompt": "..."}` 以使用也可以设置 `"snapshot"` 的自定义提示词,或 `{"type": "file", "path": "..."}` 从磁盘加载大型提示词。见 [`SystemPromptPreset`](#systempromptpreset)、[`SystemPromptCustom`](#systempromptcustom) 和 [`SystemPromptFile`](#systempromptfile) |

924| `mcp_servers` | `dict[str, McpServerConfig] \| str \| Path` | `{}` | MCP 服务器配置或配置文件路径 |973| `mcp_servers` | `dict[str, McpServerConfig] \| str \| Path` | `{}` | MCP 服务器配置或配置文件路径 |

925| `strict_mcp_config` | `bool` | `False` | 当为 `True` 时,仅使用在 `mcp_servers` 中传递的服务器,忽略项目 `.mcp.json`、用户设置、插件提供的 MCP 服务器和 [claude.ai 连接器](/docs/zh-CN/mcp#use-mcp-servers-from-claude-ai)。映射到 CLI `--strict-mcp-config` 标志 |974| `strict_mcp_config` | `bool` | `False` | 当为 `True` 时,仅使用在 `mcp_servers` 中传递的服务器,忽略项目 `.mcp.json`、用户设置、插件提供的 MCP 服务器和 [claude.ai 连接器](/docs/zh-CN/mcp#use-mcp-servers-from-claude-ai)。映射到 CLI `--strict-mcp-config` 标志 |


1849* `terminal_reason`:查询循环结束的原因,例如 `"completed"`、`"max_turns"`、`"api_error"`、`"aborted_streaming"` 或 `"aborted_tools"`。值为 `"aborted_streaming"` 或 `"aborted_tools"` 意味着轮次在完成前被中止。常见原因是 [`interrupt()`](#claudesdkclient) 和权限回调返回 [`PermissionResultDeny`](#permissionresultdeny) 且 `interrupt=True`。在早于该字段的 CLI 版本上为 `None`,在本地命令(如 `/voice` 或 `/usage`)的结果上为 `None`,这些命令绕过查询循环,或在会话严重失败时发出的合成错误结果上为 `None`。镜像 TypeScript SDK 的 [`SDKResultMessage.terminal_reason`](/docs/zh-CN/agent-sdk/typescript#sdkresultmessage),其列出了完整的值集。1898* `terminal_reason`:查询循环结束的原因,例如 `"completed"`、`"max_turns"`、`"api_error"`、`"aborted_streaming"` 或 `"aborted_tools"`。值为 `"aborted_streaming"` 或 `"aborted_tools"` 意味着轮次在完成前被中止。常见原因是 [`interrupt()`](#claudesdkclient) 和权限回调返回 [`PermissionResultDeny`](#permissionresultdeny) 且 `interrupt=True`。在早于该字段的 CLI 版本上为 `None`,在本地命令(如 `/voice` 或 `/usage`)的结果上为 `None`,这些命令绕过查询循环,或在会话严重失败时发出的合成错误结果上为 `None`。镜像 TypeScript SDK 的 [`SDKResultMessage.terminal_reason`](/docs/zh-CN/agent-sdk/typescript#sdkresultmessage),其列出了完整的值集。

1850* `origin`:触发此轮次的用户消息的来源。在[流式输入模式](/docs/zh-CN/agent-sdk/streaming-vs-single-mode)中,检查此项以区分您自己的提示词结果(其中 `origin` 为 `None` 或 `{"kind": "human"}`)与注入的轮次(如后台任务通知)的结果。需要 Python Agent SDK 0.2.137 或更高版本。1899* `origin`:触发此轮次的用户消息的来源。在[流式输入模式](/docs/zh-CN/agent-sdk/streaming-vs-single-mode)中,检查此项以区分您自己的提示词结果(其中 `origin` 为 `None` 或 `{"kind": "human"}`)与注入的轮次(如后台任务通知)的结果。需要 Python Agent SDK 0.2.137 或更高版本。

1851 1900 

1901当多个后台任务在相近时间内完成时,Claude Code 可以在一个轮次中回复它们的通知,而不是为每个通知各用一个轮次。您仍会按顺序为每个通知收到一个 `ResultMessage`,每个都带有 `kind` 为 `"task-notification"` 的 `origin`。除最后一个外,其余消息的 `num_turns` 均为 `0` 且 `result` 为空,最后一个则承载回复所有通知的那个轮次。

1902 

1852`usage` 字典仅涵盖主 Agent 循环,不包括子代理和其他嵌套或辅助模型调用。在[流式输入模式](/docs/zh-CN/agent-sdk/streaming-vs-single-mode)中,值是按轮次的。优先使用 `model_usage` 进行 token 和成本核算。`usage` 字典在存在时包含以下键:1903`usage` 字典仅涵盖主 Agent 循环,不包括子代理和其他嵌套或辅助模型调用。在[流式输入模式](/docs/zh-CN/agent-sdk/streaming-vs-single-mode)中,值是按轮次的。优先使用 `model_usage` 进行 token 和成本核算。`usage` 字典在存在时包含以下键:

1853 1904 

1854| 键 | 类型 | 描述 |1905| 键 | 类型 | 描述 |

Details

358* [`renameSession()`](/docs/zh-CN/agent-sdk/typescript#renamesession)358* [`renameSession()`](/docs/zh-CN/agent-sdk/typescript#renamesession)

359* [`tagSession()`](/docs/zh-CN/agent-sdk/typescript#tagsession)359* [`tagSession()`](/docs/zh-CN/agent-sdk/typescript#tagsession)

360* [`deleteSession()`](/docs/zh-CN/agent-sdk/typescript)360* [`deleteSession()`](/docs/zh-CN/agent-sdk/typescript)

361* [`forkSession()`](/docs/zh-CN/agent-sdk/typescript)361* [`forkSession()`](/docs/zh-CN/agent-sdk/typescript#forksession)

362* [`listSubagents()`](/docs/zh-CN/agent-sdk/typescript)362* [`listSubagents()`](/docs/zh-CN/agent-sdk/typescript)

363* [`getSubagentMessages()`](/docs/zh-CN/agent-sdk/typescript)363* [`getSubagentMessages()`](/docs/zh-CN/agent-sdk/typescript)

364 364 

Details

293 293 

294 您可以从任何工作目录恢复:294 您可以从任何工作目录恢复:

295 295 

296 * **跨目录查找**:Claude Code 搜索超出当前项目目录以查找 ID;请参阅[恢复会话](/docs/zh-CN/sessions#resume-a-session)了解确切的查找顺序以及如何处理重复副本。296 * **跨目录查找**:Claude Code 搜索超出当前项目目录以查找 ID;请参阅[恢复会话](/docs/zh-CN/sessions#where-the-session-picker-looks)了解确切的查找顺序以及如何处理重复副本。

297 * **仅限同一机器**:会话文件仍需要存在于当前机器上。297 * **仅限同一机器**:会话文件仍需要存在于当前机器上。

298 298 

299 在 v2.1.223 之前,查找范围限于当前项目目录及其 git worktrees;捆绑较旧 CLI 的 SDK 版本仍然以这种方式运行。299 在 v2.1.223 之前,查找范围限于当前项目目录及其 git worktrees;捆绑较旧 CLI 的 SDK 版本仍然以这种方式运行。


423 423 

424* **移动会话文件。** 从第一次运行中保持 `~/.claude/projects/<encoded-cwd>/<session-id>.jsonl`,并在调用 `resume` 之前将其恢复到新主机上的 `~/.claude/projects/` 下的任何目录内。424* **移动会话文件。** 从第一次运行中保持 `~/.claude/projects/<encoded-cwd>/<session-id>.jsonl`,并在调用 `resume` 之前将其恢复到新主机上的 `~/.claude/projects/` 下的任何目录内。

425 425 

426 Claude Code 搜索超出当前项目目录以查找 ID;有关确切的查找顺序以及如何处理重复副本,请参阅[恢复会话](/docs/zh-CN/sessions#resume-a-session)。在 v2.1.223 之前,查找范围限于当前项目目录及其 git worktrees;捆绑较旧 CLI 的 SDK 版本仍然以这种方式运行。426 Claude Code 搜索超出当前项目目录以查找 ID;有关确切的查找顺序以及如何处理重复副本,请参阅[恢复会话](/docs/zh-CN/sessions#where-the-session-picker-looks)。在 v2.1.223 之前,查找范围限于当前项目目录及其 git worktrees;捆绑较旧 CLI 的 SDK 版本仍然以这种方式运行。

427 427 

428* **不依赖会话恢复。** 捕获您需要的结果(分析输出、决定、文件差异)作为应用状态,并将其传递到新会话的提示中。这通常比在周围运送记录文件更强大。428* **不依赖会话恢复。** 捕获您需要的结果(分析输出、决定、文件差异)作为应用状态,并将其传递到新会话的提示中。这通常比在周围运送记录文件更强大。

429 429 

Details

124 124 

125未启用部分消息时,你会接收除 `StreamEvent` 之外的所有消息类型。常见类型包括 `SystemMessage`(会话初始化)、`AssistantMessage`(完整内容块)、`ResultMessage`(最终结果)和一个紧凑边界消息,指示何时压缩了对话历史记录(TypeScript 中为 `SDKCompactBoundaryMessage`;Python 中为带有子类型 `"compact_boundary"` 的 `SystemMessage`)。125未启用部分消息时,你会接收除 `StreamEvent` 之外的所有消息类型。常见类型包括 `SystemMessage`(会话初始化)、`AssistantMessage`(完整内容块)、`ResultMessage`(最终结果)和一个紧凑边界消息,指示何时压缩了对话历史记录(TypeScript 中为 `SDKCompactBoundaryMessage`;Python 中为带有子类型 `"compact_boundary"` 的 `SystemMessage`)。

126 126 

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

128 处理被中断的流

129</h3>

130 

131如果流在消息中途被中断,例如当您中断该轮次或连接断开时,您仍会在该轮次结束前收到该消息的 `message_stop`。被中断的文本块或思考块也会收到其 `content_block_stop`。被中断的工具调用则不会,因此如果 `message_stop` 到达时某个工具调用的块仍处于打开状态,请将该调用的输入视为不完整。

132 

133在 Claude Code v2.1.290 之前,被中断的流可能会在没有 `message_stop` 的情况下结束轮次,因此您根据流事件渲染的回复可能会一直显示为进行中。TypeScript Agent SDK 从 v0.3.290 起捆绑 Claude Code v2.1.290 或更高版本,Python Agent SDK 则从 v0.2.164 起捆绑。如果轮次结束后回复仍显示为进行中,请更新 SDK。

134 

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

128 流式传输工具调用136 流式传输工具调用

129</h2>137</h2>

Details

464| `tag` | `string \| null` | 必需 | 标签字符串,或 `null` 以清除 |464| `tag` | `string \| null` | 必需 | 标签字符串,或 `null` 以清除 |

465| `options.dir` | `string` | `undefined` | 项目目录路径。省略时,搜索所有项目目录 |465| `options.dir` | `string` | `undefined` | 项目目录路径。省略时,搜索所有项目目录 |

466 466 

467<h3 id="forksession">

468 `forkSession()`

469</h3>

470 

471将会话的会话记录复制到新会话中,以便您可以将对话引向另一个方向,同时保持原始会话不变。要从对话中较早的某个点分支,请传递 `upToMessageId`。

472 

473```typescript theme={null}

474function forkSession(

475 sessionId: string,

476 options?: ForkSessionOptions

477): Promise<ForkSessionResult>;

478```

479 

480<h4 id="parameters-10">

481 参数

482</h4>

483 

484| 参数 | 类型 | 默认值 | 描述 |

485| :- | :- | :- | :- |

486| `sessionId` | `string` | 必需 | 要分叉的会话 UUID |

487| `options.dir` | `string` | `undefined` | 项目目录路径。省略时,搜索所有项目目录 |

488| `options.upToMessageId` | `string` | `undefined` | 复制会话记录,直到并包括具有此 `uuid` 的消息:该值来自 [`getSessionMessages()`](#getsessionmessages),或是您在流式传输的 [`SDKUserMessage`](#sdkusermessage) 上设置的 `uuid`。省略时,复制整个会话记录 |

489| `options.title` | `string` | `undefined` | 分叉的标题。省略时,SDK 从原始会话派生一个标题,后跟 `(fork)` |

490 

491返回 `{ sessionId }`,即新会话的 UUID。将其作为 [`resume`](#options) 传递以继续该分叉。分叉不包括原始会话的[文件检查点](/docs/zh-CN/agent-sdk/file-checkpointing),因此您无法将其回退到分叉之前捕获的检查点。

492 

493`forkSession()` 在以下情况下会抛出错误:

494 

495* `sessionId` 不是 UUID

496* 找不到会话,或会话没有消息

497* `upToMessageId` 与会话记录中的任何消息都不匹配

498 

467<h3 id="resolvesettings">499<h3 id="resolvesettings">

468 `resolveSettings()`500 `resolveSettings()`

469</h3>501</h3>


486): Promise<ResolvedSettings>;518): Promise<ResolvedSettings>;

487```519```

488 520 

489<h4 id="parameters-10">521<h4 id="parameters-11">

490 参数522 参数

491</h4>523</h4>

492 524 


547| `agents` | `Record<string, [`AgentDefinition`](#agentdefinition)>` | `undefined` | 以编程方式定义子代理 |579| `agents` | `Record<string, [`AgentDefinition`](#agentdefinition)>` | `undefined` | 以编程方式定义子代理 |

548| `agentProgressSummaries` | `boolean` | `false` | 为 `true` 时,为子代理生成单行进度摘要,并通过 `summary` 字段在 [`task_progress`](#sdktaskprogressmessage) 事件中转发。适用于前台和后台子代理 |580| `agentProgressSummaries` | `boolean` | `false` | 为 `true` 时,为子代理生成单行进度摘要,并通过 `summary` 字段在 [`task_progress`](#sdktaskprogressmessage) 事件中转发。适用于前台和后台子代理 |

549| `allowDangerouslySkipPermissions` | `boolean` | `false` | 启用绕过权限。使用 `permissionMode: 'bypassPermissions'` 时必需,无论是在启动时还是之后通过 `setPermissionMode()` 设置。有关它与 `permissionMode: 'plan'` 的交互方式,请参阅[计划模式](/docs/zh-CN/agent-sdk/permissions#plan-mode-plan) |581| `allowDangerouslySkipPermissions` | `boolean` | `false` | 启用绕过权限。使用 `permissionMode: 'bypassPermissions'` 时必需,无论是在启动时还是之后通过 `setPermissionMode()` 设置。有关它与 `permissionMode: 'plan'` 的交互方式,请参阅[计划模式](/docs/zh-CN/agent-sdk/permissions#plan-mode-plan) |

550| `allowedTools` | `string[]` | `[]` | 无需提示即可自动批准的工具。这不会将 Claude 限制为只能使用这些工具。如果您在此处指定了某个[任务跟踪工具](/docs/zh-CN/agent-sdk/todo-tracking#model-availability),Claude Code 也会为该会话启用它。其他未列出的工具将交由 `permissionMode` 和 `canUseTool` 处理。使用 `disallowedTools` 来阻止工具。请参阅[权限](/docs/zh-CN/agent-sdk/permissions#allow-and-deny-rules) |582| `allowedTools` | `string[]` | `[]` | 无需提示即可自动批准的工具,从[网络路径](/docs/zh-CN/permissions#network-paths)读取的操作除外。这并不会将 Claude 限制为仅使用这些工具。如果您在此处指定了某个[任务跟踪工具](/docs/zh-CN/agent-sdk/todo-tracking#model-availability),Claude Code 也会为该会话启用它。其他未列出的工具将交由 `permissionMode` 和 `canUseTool` 处理。使用 `disallowedTools` 来阻止工具。请参阅[权限](/docs/zh-CN/agent-sdk/permissions#allow-and-deny-rules) |

551| `betas` | [`SdkBeta`](#sdkbeta)`[]` | `[]` | 启用 beta 功能 |583| `betas` | [`SdkBeta`](#sdkbeta)`[]` | `[]` | 启用 beta 功能 |

552| `canUseTool` | [`CanUseTool`](#canusetool) | `undefined` | 自定义权限函数,仅在[权限流程](/docs/zh-CN/agent-sdk/permissions#how-permissions-are-evaluated)落到提示环节时调用。对于由 `allowedTools`、允许规则或 `permissionMode` 自动批准的调用,不会调用此函数。允许规则不会预先批准[任何模式都不会自动批准的操作](/docs/zh-CN/permission-modes#actions-no-mode-auto-approves)。详情请参阅 [`CanUseTool`](#canusetool) |584| `canUseTool` | [`CanUseTool`](#canusetool) | `undefined` | 自定义权限函数,仅在[权限流程](/docs/zh-CN/agent-sdk/permissions#how-permissions-are-evaluated)落到提示环节时调用。对于由 `allowedTools`、允许规则或 `permissionMode` 自动批准的调用,不会调用此函数。允许规则不会预先批准[任何模式都不会自动批准的操作](/docs/zh-CN/permission-modes#actions-no-mode-auto-approves)。详情请参阅 [`CanUseTool`](#canusetool) |

553| `continue` | `boolean` | `false` | 继续最近的对话 |585| `continue` | `boolean` | `false` | 继续最近的对话 |


1588 1620 

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

1590 1622 

1591Claude Code 在该轮的第一条助手消息上设置 `user_message_uuid` 和 `user_message_uuids`,条件在 [`user_message_uuid`](#user_message_uuid) 中。当 Claude Code 重新运行被重启中断的轮时,重新运行的携带这些字段的助手消息也携带 [`resume_reason`](#resume_reason)。1623Claude Code 会在满足 [`user_message_uuid`](#user_message_uuid) 中所述条件时,在该轮次的第一条助手消息上设置 `user_message_uuid` 和 `user_message_uuids`。当该轮次是继续一个被重启中断的轮次时,携带这些字段的助手消息还会携带 [`resume_reason`](#resume_reason)。

1592 1624 

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

1594 1626 


1631 1663 

1632设置 `inline_pastes` 可告知 Claude Code `message.content` 中哪些部分是用户粘贴的而非键入的,每次粘贴对应一个字符串。提示词文本保留在用户放置的位置。Claude Code 可能会在原位用 `<pasted_content>` 标签包裹每个列出的粘贴内容,以便 Claude 区分粘贴的材料和用户自己的话。只有提示词最后一个文本块中的粘贴内容会被包裹。需要 TypeScript Agent SDK v0.3.280 或更高版本。1664设置 `inline_pastes` 可告知 Claude Code `message.content` 中哪些部分是用户粘贴的而非键入的,每次粘贴对应一个字符串。提示词文本保留在用户放置的位置。Claude Code 可能会在原位用 `<pasted_content>` 标签包裹每个列出的粘贴内容,以便 Claude 区分粘贴的材料和用户自己的话。只有提示词最后一个文本块中的粘贴内容会被包裹。需要 TypeScript Agent SDK v0.3.280 或更高版本。

1633 1665 

1666每个粘贴字段都有大小限制:

1667 

1668* `pasted_content`:如果条目数加上其中的内容块数超过 1,000,Claude Code 会忽略整个字段。

1669* `inline_pastes`:Claude Code 使用前 100 个非空条目,并忽略其余条目。

1670 

1634设置 `shouldQuery`、`client_composed` 或 `priority` 可以改变 Claude Code 处理您所发送消息的方式:1671设置 `shouldQuery`、`client_composed` 或 `priority` 可以改变 Claude Code 处理您所发送消息的方式:

1635 1672 

1636* `shouldQuery`:设置为 `false` 以将消息附加到会话记录中而不触发助手轮。消息被保留并合并到下一条触发轮的用户消息中。使用此方法注入上下文,例如您在带外运行的命令的输出,而无需在模型调用上花费。1673* `shouldQuery`:设置为 `false` 以将消息附加到会话记录中而不触发助手轮。消息被保留并合并到下一条触发轮的用户消息中。使用此方法注入上下文,例如您在带外运行的命令的输出,而无需在模型调用上花费。


1661* Claude Code 为交付 `'now'` 消息而移到后台的 WebFetch 或 WebSearch 调用:携带该调用 `tool_result` 的用户消息的 `tool_use_result` 被设为 `{ detachedToolCall: true }`。该调用仍在运行,Claude 会在其完成后收到结果。该 `tool_use_id` 之后不会再有第二个 `tool_result`,因此如果您的应用为每个工具调用绘制一行,请在收到此消息时将该行标记为已移到后台。需要 Claude Code v2.1.287 或更高版本。1698* Claude Code 为交付 `'now'` 消息而移到后台的 WebFetch 或 WebSearch 调用:携带该调用 `tool_result` 的用户消息的 `tool_use_result` 被设为 `{ detachedToolCall: true }`。该调用仍在运行,Claude 会在其完成后收到结果。该 `tool_use_id` 之后不会再有第二个 `tool_result`,因此如果您的应用为每个工具调用绘制一行,请在收到此消息时将该行标记为已移到后台。需要 Claude Code v2.1.287 或更高版本。

1662* 结果包含 `resource_link` 块的 MCP 工具:`tool_use_result` 是一个对象,其 `resourceLinks` 数组由 [`SDKMcpResourceLink`](#sdkmcpresourcelink) 条目组成。Claude 会在 `tool_result` 块中以一行文本的形式接收每个链接,因此请读取 `resourceLinks` 来渲染服务器返回的文件,而不是解析该文本。当结果中没有链接时以及对于来自子代理的结果,Claude Code 会省略 `resourceLinks`;每个结果最多保留 50 个链接,并在数组序列化后的 JSON 达到 64 KiB 时停止添加链接。`resourceLinks` 需要 Agent SDK v0.3.257 或更高版本。1699* 结果包含 `resource_link` 块的 MCP 工具:`tool_use_result` 是一个对象,其 `resourceLinks` 数组由 [`SDKMcpResourceLink`](#sdkmcpresourcelink) 条目组成。Claude 会在 `tool_result` 块中以一行文本的形式接收每个链接,因此请读取 `resourceLinks` 来渲染服务器返回的文件,而不是解析该文本。当结果中没有链接时以及对于来自子代理的结果,Claude Code 会省略 `resourceLinks`;每个结果最多保留 50 个链接,并在数组序列化后的 JSON 达到 64 KiB 时停止添加链接。`resourceLinks` 需要 Agent SDK v0.3.257 或更高版本。

1663* 返回 [`structuredContent`](#calltoolresult) 的 MCP 工具:`tool_use_result` 是一个对象,其 `structuredContent` 成员包含服务器发送的内容,`content` 成员包含 [`McpOutput`](#mcpoutput) 值。来自子代理的结果不携带 `structuredContent`。1700* 返回 [`structuredContent`](#calltoolresult) 的 MCP 工具:`tool_use_result` 是一个对象,其 `structuredContent` 成员包含服务器发送的内容,`content` 成员包含 [`McpOutput`](#mcpoutput) 值。来自子代理的结果不携带 `structuredContent`。

1664* `structuredContent` 序列化后超过 1,048,576 个字符 JSON 的 MCP 工具:Claude Code 会从 `tool_use_result` 中去掉 `structuredContent`,并在其位置设置 `structuredContentOmitted: true`,以便您的应用区分被丢弃的对象与根本未发送该对象的工具。其他成员(例如 `content` 和 `resourceLinks`)保留,Claude 接收到的内容也不会改变。来自[进程内 SDK 服务器](/docs/zh-CN/agent-sdk/custom-tools)的工具,以及其 `tools/list` 条目声明了 [MCP Apps `_meta.ui` 资源](#mcpserverstatus)的工具不受此限制,会完整交付该对象。Claude Code v2.1.287 或更高版本应用此上限。1701* `structuredContent` 序列化后超过 1,048,576 个 JSON 字符的 MCP 工具:Claude Code 会从 `tool_use_result` 中去掉 `structuredContent`,并在其位置设置 `structuredContentOmitted: true`,以便您的应用能够区分被丢弃的对象与根本未发送该对象的工具。其他成员(例如 `content` 和 `resourceLinks`)会保留,Claude 收到的内容也不会改变。Claude Code v2.1.287 或更高版本会应用此上限。有两类工具有所不同:

1702 * 来自[进程内 SDK 服务器](/docs/zh-CN/agent-sdk/custom-tools)的工具不受此限制,会完整交付该对象。

1703 * 在 `tools/list` 条目中声明了 [MCP Apps `ui://` 资源](#mcpserverstatus)的工具,在 Claude Code v2.1.295 或更高版本上的上限为 8,388,608 个字符,而 v2.1.295 之前的版本对其不设限制。

1665 1704 

1666<h3 id="sdkusermessagereplay">1705<h3 id="sdkusermessagereplay">

1667 `SDKUserMessageReplay`1706 `SDKUserMessageReplay`


1775* `ttft_stream_ms`:直到第一个 `message_start` 流事件(响应流打开时)的时间(毫秒)。低于 `ttft_ms`;两者之间的差距是流式传输第一条消息所花费的时间。仅在成功分支上存在。1814* `ttft_stream_ms`:直到第一个 `message_start` 流事件(响应流打开时)的时间(毫秒)。低于 `ttft_ms`;两者之间的差距是流式传输第一条消息所花费的时间。仅在成功分支上存在。

1776* `user_message_uuid`:您发送的消息的 `uuid`,该轮回答了该消息。请参阅 [`user_message_uuid`](#user_message_uuid) 了解哪些结果携带它。1815* `user_message_uuid`:您发送的消息的 `uuid`,该轮回答了该消息。请参阅 [`user_message_uuid`](#user_message_uuid) 了解哪些结果携带它。

1777* `user_message_uuids`:您发送的每条消息的 `uuid`,Claude Code 在该轮中回答了这些消息。请参阅 [`user_message_uuids`](#user_message_uuids)。1816* `user_message_uuids`:您发送的每条消息的 `uuid`,Claude Code 在该轮中回答了这些消息。请参阅 [`user_message_uuids`](#user_message_uuids)。

1778* `resume_reason`:Claude Code 在重启中断该轮次后重新运行它的原因。出现在两个分支上。请参阅 [`resume_reason`](#resume_reason)。1817* `resume_reason`:本轮次为何是继续一个被重启中断的轮次。在两个分支上都存在。请参阅 [`resume_reason`](#resume_reason)。

1779* `local_command`:轮分派的命令的名称,在轮由命令完成而不进入 Agent 循环的成功结果上,例如 `/compact`。名称折叠为小写字母和下划线,因此 `/reload-plugins` 报告 `reload_plugins`。MCP 服务器提供的命令和内置 `/mcp` 报告 `mcp`。您自己定义的命令报告 `custom`。参数从不包含。在进入 Agent 循环的每个轮上不存在,在运行无命令的发送上不存在。需要 Agent SDK v0.3.268 或更高版本。1818* `local_command`:轮分派的命令的名称,在轮由命令完成而不进入 Agent 循环的成功结果上,例如 `/compact`。名称折叠为小写字母和下划线,因此 `/reload-plugins` 报告 `reload_plugins`。MCP 服务器提供的命令和内置 `/mcp` 报告 `mcp`。您自己定义的命令报告 `custom`。参数从不包含。在进入 Agent 循环的每个轮上不存在,在运行无命令的发送上不存在。需要 Agent SDK v0.3.268 或更高版本。

1780* `request_sent_wall_ms`:Claude Code 分派 API 请求的纪元毫秒,用于与服务器端时间戳的连接。仅与 [`user_message_uuid`](#user_message_uuid) 一起存在,在成功结果上,其中 `is_error` 为 false,且轮发送了 API 请求。1819* `request_sent_wall_ms`:Claude Code 分派 API 请求的纪元毫秒,用于与服务器端时间戳的连接。仅与 [`user_message_uuid`](#user_message_uuid) 一起存在,在成功结果上,其中 `is_error` 为 false,且轮发送了 API 请求。

1781* `first_content_frame_ms`:直到第一个 `content_block_start` 或 `content_block_delta` 流事件的时间(毫秒),计算思考块作为内容。仅在成功分支上存在,当 `is_error` 为 false 时。需要 Agent SDK v0.3.260 或更高版本。1820* `first_content_frame_ms`:直到第一个 `content_block_start` 或 `content_block_delta` 流事件的时间(毫秒),计算思考块作为内容。仅在成功分支上存在,当 `is_error` 为 false 时。需要 Agent SDK v0.3.260 或更高版本。


1825 1864 

1826* **您发送的常规消息**,意思是没有 `isSynthetic: true` 的消息:轮在其整个运行中回答该消息。当您一起发送多条消息时,Claude Code 可以将它们合并为一轮,该字段然后仅携带最后一条消息的 `uuid`。要将回复与任何合并的消息匹配,请使用 [`user_message_uuids`](#user_message_uuids)。1865* **您发送的常规消息**,意思是没有 `isSynthetic: true` 的消息:轮在其整个运行中回答该消息。当您一起发送多条消息时,Claude Code 可以将它们合并为一轮,该字段然后仅携带最后一条消息的 `uuid`。要将回复与任何合并的消息匹配,请使用 [`user_message_uuids`](#user_message_uuids)。

1827* **您发送的带有 `isSynthetic: true` 的消息**:轮最初回答该消息。如果 Claude Code 在工具调用之间拾取您的常规消息,轮从那时起回答拾取的消息。回显合成消息的 `uuid` 需要 Agent SDK v0.3.265 或更高版本;早期版本在合成轮上不回显任何内容。1866* **您发送的带有 `isSynthetic: true` 的消息**:轮最初回答该消息。如果 Claude Code 在工具调用之间拾取您的常规消息,轮从那时起回答拾取的消息。回显合成消息的 `uuid` 需要 Agent SDK v0.3.265 或更高版本;早期版本在合成轮上不回显任何内容。

1828* **Claude Code 生成的、用于在 [`CLAUDE_CODE_RESUME_INTERRUPTED_TURN`](/docs/zh-CN/env-vars) 下重新运行被中断轮的提示词**:当被中断轮的最后一个提示词是您发送的常规消息时,无论它是打开轮还是 Claude Code 在轮期间拾取它,重新运行最初回答该消息。[`resume_reason`](#resume_reason) 可将重新运行的帧与被中断尝试的帧区分开。当最后一个提示词不是您的常规消息时,重新运行最初不回答您的任何消息。如果 Claude Code 在工具调用之间拾取您的常规消息,轮从那时起回答拾取的消息。回显被中断轮的提示词需要 Agent SDK v0.3.268 或更高版本。1867* **Claude Code 在 [`CLAUDE_CODE_RESUME_INTERRUPTED_TURN`](/docs/zh-CN/env-vars) 下为继续被中断的轮次而生成的提示词**:当被中断轮次的最后一个提示词是您发送的常规消息时(无论它是开启了该轮次,还是 Claude Code 在轮次期间接收的),继续的轮次起初回答该消息。[`resume_reason`](#resume_reason) 可将继续轮次的帧与被中断尝试的帧区分开来。当最后一个提示词不是您的常规消息时,继续的轮次起初不回答您的任何消息。如果 Claude Code 在工具调用之间接收了您的一条常规消息,则从那时起该轮次回答被接收的消息。回显被中断轮次的提示词需要 Agent SDK v0.3.268 或更高版本。

1829* **Claude Code 自己生成的任何其他提示词**:轮最初不回答您的任何消息,其帧不携带回显。如果 Claude Code 在工具调用之间拾取您的常规消息,轮从那时起回答该消息。拾取回显需要 Agent SDK v0.3.265 或更高版本;早期版本在这些轮上不回显任何内容。1868* **Claude Code 自己生成的任何其他提示词**:轮最初不回答您的任何消息,其帧不携带回显。如果 Claude Code 在工具调用之间拾取您的常规消息,轮从那时起回答该消息。拾取回显需要 Agent SDK v0.3.265 或更高版本;早期版本在这些轮上不回显任何内容。

1830 1869 

1831Claude Code 在三种帧上回显回答的消息的 `uuid`:1870Claude Code 在三种帧上回显回答的消息的 `uuid`:


1857 `resume_reason`1896 `resume_reason`

1858</h4>1897</h4>

1859 1898 

1860Claude Code 在重启后重新运行该轮的原因。Claude Code 在它在 [`CLAUDE_CODE_RESUME_INTERRUPTED_TURN`](/docs/zh-CN/env-vars) 下重新运行的轮上设置此字段,以便您可以将重新运行的回复和结果与被中断尝试的区分开。需要 Agent SDK v0.3.268 或更高版本。1899本轮次为何是继续一个被重启中断的轮次。Claude Code 会在 [`CLAUDE_CODE_RESUME_INTERRUPTED_TURN`](/docs/zh-CN/env-vars) 下继续被中断轮次的轮次上设置此字段,以便您将继续轮次的回复和结果与被中断尝试的回复和结果区分开来。需要 Agent SDK v0.3.268 或更高版本。

1861 1900 

1862Claude Code 在两种帧上设置该字段:1901Claude Code 在两种帧上设置该字段:

1863 1902 

1864* **重新运行的结果**:在成功和错误分支上,无论结果是否携带 `user_message_uuid`。1903* **继续轮次的结果**:在 success 和 error 分支上均设置,无论结果是否携带 `user_message_uuid`。

1865* **重新运行的回复帧**:那些携带 [`user_message_uuid`](#user_message_uuid) 的帧。1904* **继续轮次的回复帧**:携带 [`user_message_uuid`](#user_message_uuid) 的那些帧。

1866 1905 

1867该值是一个简短的小写标记,指明该轮次被重新运行的原因,例如 `interrupted_turn`。1906其值是一个简短的小写标记,例如 `interrupted_turn`。

1868 1907 

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

1870 `queued_turn_count`1909 `queued_turn_count`


2029};2068};

2030```2069```

2031 2070 

2032Claude Code 在轮的第一个非 ping 流事件上设置 `user_message_uuid` 和 `user_message_uuids`,并在轮回答的消息改变时再次设置,条件在 [`user_message_uuid`](#user_message_uuid) 中。当 Claude Code 重新运行被重启中断的轮时,重新运行的携带这些字段的流事件也携带 [`resume_reason`](#resume_reason)。2071Claude Code 会在满足 [`user_message_uuid`](#user_message_uuid) 中所述条件时,在该轮次的第一个非 ping 流事件上设置 `user_message_uuid` 和 `user_message_uuids`,并在轮次所回答的消息发生变化时再次设置。当该轮次是继续一个被重启中断的轮次时,携带这些字段的流事件还会携带 [`resume_reason`](#resume_reason)。

2033 2072 

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

2035 `SDKCompactBoundaryMessage`2074 `SDKCompactBoundaryMessage`


2370当 Claude Code 将任务通知传递到会话中时,如果 Anthropic 服务器验证了该通知的来源,它会在通知的 `origin` 上设置 `subkind`。当您的应用程序[自己声明消息为定时运行](#declare-a-scheduled-run)时,它也设置 `subkind`,这需要 TypeScript Agent SDK v0.3.280 或更高版本。`subkind` 需要 Claude Code v2.1.213 或更高版本,它采用两个值之一:2409当 Claude Code 将任务通知传递到会话中时,如果 Anthropic 服务器验证了该通知的来源,它会在通知的 `origin` 上设置 `subkind`。当您的应用程序[自己声明消息为定时运行](#declare-a-scheduled-run)时,它也设置 `subkind`,这需要 TypeScript Agent SDK v0.3.280 或更高版本。`subkind` 需要 Claude Code v2.1.213 或更高版本,它采用两个值之一:

2371 2410 

2372* `scheduled-trigger`:通知是 [Routine](/docs/zh-CN/routines) 的存储提示词,因为 Routine 的触发器之一触发而传递:其计划、其 [API 触发器](/docs/zh-CN/routines#add-an-api-trigger)、其 [GitHub 触发器](/docs/zh-CN/routines#add-a-github-trigger) 或**立即运行**。您的应用程序[声明为定时运行](#declare-a-scheduled-run)的提示词也携带此值。Claude Code 将这些作为会话的分配任务呈现给模型,附带的通知与[其他任务通知携带的通知](#sdktasknotificationmessage)不同。2411* `scheduled-trigger`:通知是 [Routine](/docs/zh-CN/routines) 的存储提示词,因为 Routine 的触发器之一触发而传递:其计划、其 [API 触发器](/docs/zh-CN/routines#add-an-api-trigger)、其 [GitHub 触发器](/docs/zh-CN/routines#add-a-github-trigger) 或**立即运行**。您的应用程序[声明为定时运行](#declare-a-scheduled-run)的提示词也携带此值。Claude Code 将这些作为会话的分配任务呈现给模型,附带的通知与[其他任务通知携带的通知](#sdktasknotificationmessage)不同。

2373* `peer-send-message`:通知是您的另一个会话使用[云端会话](/docs/zh-CN/claude-code-on-the-web)用来互相发送消息的服务器端 `send_message` 工具发送的消息,而不是[跨会话 `SendMessage` 工具](/docs/zh-CN/cross-session-messaging),并且 Anthropic 服务器验证了两个会话都属于同一私有会话组。需要 Claude Code v2.1.224 或更高版本。服务器未以这种方式验证的 `send_message` 传递没有 `subkind`。2412* `peer-send-message`:该通知是您的另一个会话通过服务器端 `send_message` 工具发送的消息([云端会话](/docs/zh-CN/claude-code-on-the-web)之间使用该工具互相发送消息),而不是[跨会话 `SendMessage` 工具](/docs/zh-CN/cross-session-messaging),并且 Anthropic 服务器已验证两个会话属于同一个私有会话组。需要 Claude Code v2.1.224 或更高版本。服务器未以此方式验证的 `send_message` 投递不会获得子类型。

2374 2413 

2375每个其他任务通知都没有 `subkind`。这包括[PR 活动](/docs/zh-CN/claude-code-on-the-web#how-claude-responds-to-pr-activity)传递到会话和后台事件,例如完成的任务。来自[跨会话 `SendMessage` 工具](/docs/zh-CN/cross-session-messaging)的消息根本不是任务通知:无论它们来自同一机器上的会话还是通过 Anthropic 服务器来自另一台机器,Claude Code 都给它们 `kind: "peer"` 和[对等体来源字段](#peer-origin-fields)。2414每个其他任务通知都没有 `subkind`。这包括[PR 活动](/docs/zh-CN/claude-code-on-the-web#how-claude-responds-to-pr-activity)传递到会话和后台事件,例如完成的任务。来自[跨会话 `SendMessage` 工具](/docs/zh-CN/cross-session-messaging)的消息根本不是任务通知:无论它们来自同一机器上的会话还是通过 Anthropic 服务器来自另一台机器,Claude Code 都给它们 `kind: "peer"` 和[对等体来源字段](#peer-origin-fields)。

2376 2415 


3558| - | - | - |3597| - | - | - |

3559| `script` | `string` | 内联工作流脚本。必须以 `export const meta = { name, description }` 作为字面量开头,后跟使用 `agent()`、`parallel()`、`pipeline()` 和 `phase()` 的脚本主体。`meta` 中的可选 `phases` 数组在进度视图中将 Agent 分组到命名阶段下 |3598| `script` | `string` | 内联工作流脚本。必须以 `export const meta = { name, description }` 作为字面量开头,后跟使用 `agent()`、`parallel()`、`pipeline()` 和 `phase()` 的脚本主体。`meta` 中的可选 `phases` 数组在进度视图中将 Agent 分组到命名阶段下 |

3560| `name` | `string` | 内置工作流的名称或保存在 `.claude/workflows/` 中的工作流名称。解析为脚本 |3599| `name` | `string` | 内置工作流的名称或保存在 `.claude/workflows/` 中的工作流名称。解析为脚本 |

3561| `scriptPath` | `string` | 磁盘上工作流脚本文件的路径。优先于 `script` 和 `name`。Claude Code 持久化每次调用的脚本并在结果中返回路径,因此您可以编辑该文件并使用相同的 `scriptPath` 重新调用以进行迭代 |3600| `scriptPath` | `string` | 磁盘上工作流脚本文件的路径,例如先前运行返回的 `scriptPath`。优先于 `script` 和 `name`。当会话的工具不包含 `Read` 时,Claude Code 会以错误拒绝 `scriptPath` |

3562| `args` | `unknown` | 输入值,作为全局 `args` 暴露给脚本,用于参数化的命名工作流,例如研究问题或文件路径列表。将数组和对象作为实际 JSON 值传递,而不是作为 JSON 编码的字符串 |3601| `args` | `unknown` | 输入值,作为全局 `args` 暴露给脚本,用于参数化的命名工作流,例如研究问题或文件路径列表。将数组和对象作为实际 JSON 值传递,而不是作为 JSON 编码的字符串 |

3563| `resumeFromRunId` | `string` | 要恢复的先前 `Workflow` 调用的运行 ID。具有未更改输入的已完成 `agent()` 调用通常返回缓存的结果;其余的实时运行。[暂停后恢复](/docs/zh-CN/workflows#resume-after-a-pause)涵盖哪些已完成的调用会重新运行。仅限同一会话 |3602| `resumeFromRunId` | `string` | 要恢复的先前 `Workflow` 调用的运行 ID。具有未更改输入的已完成 `agent()` 调用通常返回缓存的结果;其余的实时运行。[暂停后恢复](/docs/zh-CN/workflows#resume-after-a-pause)涵盖哪些已完成的调用会重新运行。仅限同一会话 |

3564| `title` | `string` | 被忽略;脚本的 `meta` 块设置标题 |3603| `title` | `string` | 被忽略;脚本的 `meta` 块设置标题 |

agent-view.md +18 −14

Details

152| 形状 | 含义 |152| 形状 | 含义 |

153| :- | :- |153| :- | :- |

154| `✻` 或动画 `✽` | 会话进程正在运行,或会话需要您的输入 |154| `✻` 或动画 `✽` | 会话进程正在运行,或会话需要您的输入 |

155| `∙` | 进程已退出。您仍然可以窥视该行,当您回复或附加时,Claude 会从中断处重新启动 |155| `∙` | 进程已退出。您仍然可以窥视该行,当您回复或附加时,Claude 会根据其保存的对话重新启动它 |

156| `✢` | 一个 [`/loop`](/docs/zh-CN/scheduled-tasks) 会话正在迭代之间休眠。该行显示其运行次数和倒计时 |156| `✢` | 一个 [`/loop`](/docs/zh-CN/scheduled-tasks) 会话正在迭代之间休眠。该行显示其运行次数和倒计时 |

157 157 

158行右边缘可能出现的 `#N` 或 `!N` 标签是指向会话的[拉取请求或合并请求](#pull-request-status)的链接,不是状态图标的一部分。158行右边缘可能出现的 `#N` 或 `!N` 标签是指向会话的[拉取请求或合并请求](#pull-request-status)的链接,不是状态图标的一部分。


256 256 

257附加的会话始终以[全屏模式](/docs/zh-CN/fullscreen)呈现,不受您的 `tui` 设置影响,因为后台会话没有可追加内容的终端回滚缓冲区。使用 `PgUp`、`PgDn` 或鼠标滚轮滚动,按 `Ctrl+O` 进入会话记录模式。终端的原生滚动和 tmux 复制模式仅显示当前视口,与运行任何全屏应用程序时相同。257附加的会话始终以[全屏模式](/docs/zh-CN/fullscreen)呈现,不受您的 `tui` 设置影响,因为后台会话没有可追加内容的终端回滚缓冲区。使用 `PgUp`、`PgDn` 或鼠标滚轮滚动,按 `Ctrl+O` 进入会话记录模式。终端的原生滚动和 tmux 复制模式仅显示当前视口,与运行任何全屏应用程序时相同。

258 258 

259附加的会话不会[向您的终端报告其状态](/docs/zh-CN/terminal-config#see-session-status-in-your-terminal)。

260 

259在空提示符上按 `←` 或运行 `/exit` 即可分离并返回 agent view,无论您是从 agent view 打开会话,还是从 shell 用 `claude attach <id>` 打开的。261在空提示符上按 `←` 或运行 `/exit` 即可分离并返回 agent view,无论您是从 agent view 打开会话,还是从 shell 用 `claude attach <id>` 打开的。

260 262 

261[`/btw` overlay](/docs/zh-CN/interactive-mode#side-questions-with-%2Fbtw) 打开时,`←` 也可以分离。需要 Claude Code v2.1.257 或更高版本。仍在回答中的旁支问题会在您离开期间继续运行。下次附加时,overlay 会重新打开并显示该问题或其答案。263[`/btw` overlay](/docs/zh-CN/interactive-mode#side-questions-with-%2Fbtw) 打开时,`←` 也可以分离。需要 Claude Code v2.1.257 或更高版本。仍在回答中的旁支问题会在您离开期间继续运行。下次附加时,overlay 会重新打开并显示该问题或其答案。


264 266 

265`Ctrl+Z` 也会分离,但会返回到您开始的地方:如果您从 agent view 附加则返回 agent view,如果您运行的是 `claude attach` 则返回 shell。当对话框获得焦点且不响应 `←` 时,请使用 `Ctrl+Z`。267`Ctrl+Z` 也会分离,但会返回到您开始的地方:如果您从 agent view 附加则返回 agent view,如果您运行的是 `claude attach` 则返回 shell。当对话框获得焦点且不响应 `←` 时,请使用 `Ctrl+Z`。

266 268 

267附加时 `Ctrl+C` 保持其标准中断行为:它会取消正在进行的回复或 `!` shell 命令,而不是分离。在空提示符上按两次 `Ctrl+C` 会分离,与在任何会话中相同。269附加时 `Ctrl+C` 保持其标准中断行为:它会取消正在进行的回复或 `!` shell 命令,而不是分离。在空提示符上按两次 `Ctrl+C` 会分离。

268 270 

269分离永远不会停止后台会话:`←`、`Ctrl+Z`、`/exit` 以及连按两次 `Ctrl+C` 或 `Ctrl+D` 都会让它继续运行。要从会话内部结束会话,请运行 `/stop`。271分离永远不会停止后台会话:`←`、`Ctrl+Z`、`/exit` 以及连按两次 `Ctrl+C` 或 `Ctrl+D` 都会让它继续运行。如果您在 `/loop` 等待下一次迭代时分离,循环会继续运行,该次迭代会在您不在时按计划开始。要在分离前停止循环,请参阅[停止循环](/docs/zh-CN/scheduled-tasks#stop-a-loop)。要从会话内部结束会话,请运行 `/stop`。

270 272 

271<h4 id="switch-sessions-without-leaving-the-terminal">273<h4 id="switch-sessions-without-leaving-the-terminal">

272 在不离开终端的情况下切换会话274 在不离开终端的情况下切换会话


293大约十秒后,Claude Code 会不再等待,直接将会话转入后台,但以下情况等除外:295大约十秒后,Claude Code 会不再等待,直接将会话转入后台,但以下情况等除外:

294 296 

295* **前台子代理仍在运行**:Claude Code 会继续等待,以便 Claude 启动的[前台子代理](/docs/zh-CN/sub-agents#run-subagents-in-foreground-or-background)的工作能够转移,并显示 `Still backgrounding after the current tool`。再按一次 `←` 可不等待直接转入后台,这会从头重新启动这些子代理。297* **前台子代理仍在运行**:Claude Code 会继续等待,以便 Claude 启动的[前台子代理](/docs/zh-CN/sub-agents#run-subagents-in-foreground-or-background)的工作能够转移,并显示 `Still backgrounding after the current tool`。再按一次 `←` 可不等待直接转入后台,这会从头重新启动这些子代理。

296* **有权限提示或问题在等待您的回答**:当权限提示或 Claude 提出的问题处于等待状态时,Claude Code 会继续等待并显示 `Still backgrounding after the current tool — a question is waiting for your answer.`298* **有权限提示或问题在等待您的回答**:当权限提示或 Claude 提出的问题处于等待状态时,Claude Code 会继续等待并显示 `Still backgrounding after the current tool — a question is waiting for your answer.` 如果您的回答让当前轮次得以继续,例如在权限提示上选择 **Yes**,Claude Code 会在当前工具完成时将会话转入后台。

297* **您在提示输入框中输入内容**:Claude Code 会取消切换,因为未发送的文本会留在终端的输入框中,不会移到后台会话。它会显示 `Backgrounding cancelled — you have unsent text in the input. Send it or clear it, then press ← again.`299* **您在提示输入框中输入内容**:Claude Code 会取消切换,因为未发送的文本会留在终端的输入框中,不会移到后台会话。它会显示 `Backgrounding cancelled — you have unsent text in the input. Send it or clear it, then press ← again.`

300* **您停止了当前轮次**:Claude Code 会取消切换并显示 `Backgrounding cancelled — the turn was stopped.` 例如,当您[用 `Esc` 中断 Claude](/docs/zh-CN/interactive-mode#general-controls),在主对话的权限提示上[不添加评论](/docs/zh-CN/permissions#add-a-comment-when-you-answer-a-permission-prompt)而选择 **No**,或在主对话中 Claude 提出的问题上按 `Esc` 时,当前轮次会停止。再按一次 `←` 即可将会话转入后台。

298* **排队的消息无法移动**:您[在 Claude 工作时排队的消息](/docs/zh-CN/interactive-mode#queue-messages-while-claude-works)会随对话移到后台会话。当其中某条消息无法移动时,会话会留在前台,Claude Code 会显示类似 `Cannot open agents — 1 queued message can't move to the background. Press ← again once Claude has read it.` 的通知。301* **排队的消息无法移动**:您[在 Claude 工作时排队的消息](/docs/zh-CN/interactive-mode#queue-messages-while-claude-works)会随对话移到后台会话。当其中某条消息无法移动时,会话会留在前台,Claude Code 会显示类似 `Cannot open agents — 1 queued message can't move to the background. Press ← again once Claude has read it.` 的通知。

299 302 

300即使对话还没有任何消息,按 `←` 也会创建该会话的行,因此 `→` 仍可返回该会话。303即使对话还没有任何消息,按 `←` 也会创建该会话的行,因此 `→` 仍可返回该会话。


513* `--fallback-model`516* `--fallback-model`

514* `--allow-dangerously-skip-permissions`517* `--allow-dangerously-skip-permissions`

515 518 

516您在会话期间使用 [`/add-dir`](/docs/zh-CN/permissions#additional-directories-grant-file-access-not-configuration) 添加的目录也会继承。继承 `--allow-dangerously-skip-permissions` 会使 `bypassPermissions` 在后台会话中保持可用,但不会授予任何新权限:该模式仍需要 [权限模式、模型和 effort](#permission-mode-model-and-effort) 中所述的一次性交互式接受。519您在会话期间使用 [`/add-dir`](/docs/zh-CN/permissions#additional-directories-grant-file-access-not-configuration) 添加的目录也会继承。继承 `--allow-dangerously-skip-permissions` 会使 `bypassPermissions` 在后台会话中保持可用,但不会授予任何新权限:该模式仍需要有您 [接受绕过免责声明](/docs/zh-CN/permission-modes#skip-all-checks-with-bypasspermissions-mode) 的记录。

517 520 

518<span id="from-your-shell" />521<span id="from-your-shell" />

519 522 


767 770 

768当前生效的默认值会显示在分派输入框下方的页脚中。771当前生效的默认值会显示在分派输入框下方的页脚中。

769 772 

770在您通过交互式运行一次 `claude --dangerously-skip-permissions` 接受绕过免责声明之前,Claude Code 会拒绝 `claude --bg --permission-mode bypassPermissions`,因为该模式允许一个您未在观察的会话无需批准即可执行操作。如果您之前未接受过,将 `--dangerously-skip-permissions` 或 `--permission-mode bypassPermissions` 传递给 `claude agents` 会显示相同的免责声明,接受后会将 `bypassPermissions` 应用于您从该视图启动的会话。传递 `--allow-dangerously-skip-permissions` 同样会显示该免责声明,接受后会使 `bypassPermissions` 在这些会话的 `Shift+Tab` 循环中可用,但不会以该模式启动它们。773以 `bypassPermissions` 模式启动的后台会话需要有您 [接受绕过免责声明](/docs/zh-CN/permission-modes#skip-all-checks-with-bypasspermissions-mode) 的记录,因为该模式允许一个您未在观察的会话无需批准即可执行操作。如果您之前未接受过,将 `--dangerously-skip-permissions` 或 `--permission-mode bypassPermissions` 传递给 `claude agents` 会显示相同的免责声明,接受后会将 `bypassPermissions` 应用于您从该视图启动的会话。传递 `--allow-dangerously-skip-permissions` 同样会显示该免责声明,接受后会使 `bypassPermissions` 在这些会话的 `Shift+Tab` 循环中可用,但不会以该模式启动它们。

771 774 

772<h4 id="what-persists-across-restarts">775<h4 id="what-persists-across-restarts">

773 重新启动后保留的内容776 重新启动后保留的内容

774</h4>777</h4>

775 778 

776您为后台会话选择的权限模式、模型和 effort,以及 [它继承的配置标志](#what-carries-over-when-you-background),在主管进程之后 [停止并重新启动](#the-supervisor-process) 其进程时都会保留。使用 `claude --bg --dangerously-skip-permissions` 或 `claude --bg --permission-mode bypassPermissions` 启动的会话在重新启动后仍处于 `bypassPermissions`。您在会话中途使用 `/model` 或 `/effort` 更改的模型或 effort 也会保留。779您为后台会话选择的权限模式、模型和 effort,以及 [它继承的配置标志](#what-carries-over-when-you-background),在主管进程之后 [停止并重新启动](#the-supervisor-process) 其进程时都会保留。您在会话中途使用 `/model` 或 `/effort` 更改的模型或 effort 也会保留。

777 780 

778如果会话的 effort 来自您的设置,而不是 `--effort` 或 `/effort`,Claude Code 每次为该会话启动进程时都会重新读取您的设置。在您编辑 `settings.json` 中保存的 effort 后,更改会作用于您使用 `←` 或 `/bg` 转入后台的会话及其之后的重新启动。保存的 effort 是 [`effortLevel`](/docs/zh-CN/settings-reference#effortlevel) 键或 [`modelSettings`](/docs/zh-CN/settings-reference#modelsettings) 条目。781如果会话的 effort 来自您的设置,而不是 `--effort` 或 `/effort`,Claude Code 每次为该会话启动进程时都会重新读取您的设置。在您编辑 `settings.json` 中保存的 effort 后,更改会作用于您使用 `←` 或 `/bg` 转入后台的会话及其之后的重新启动。保存的 effort 是 [`effortLevel`](/docs/zh-CN/settings-reference#effortlevel) 键或 [`modelSettings`](/docs/zh-CN/settings-reference#modelsettings) 条目。

779 782 


822| `claude attach <id\|name>` | 在此终端附加到会话 |825| `claude attach <id\|name>` | 在此终端附加到会话 |

823| `claude logs <id\|name>` | 打印会话的最近输出 |826| `claude logs <id\|name>` | 打印会话的最近输出 |

824| `claude stop <id>` | 停止会话。也接受 `claude kill` |827| `claude stop <id>` | 停止会话。也接受 `claude kill` |

825| `claude respawn <id>` | 重新启动会话,运行中或已停止,例如用于获取更新的 Claude Code 二进制文件。重新启动的会话恢复其保存的对话;当磁盘上没有对话时,它会再次运行其原始提示词作为新对话 |828| `claude respawn <id>` | 重新启动会话,运行中或已停止,例如用于获取更新的 Claude Code 二进制文件。具有已保存对话的会话会恢复该对话 |

826| `claude respawn --all` | 重新启动每个运行中的会话,例如一次性将所有会话移至更新的 Claude Code 二进制文件 |829| `claude respawn --all` | 重新启动每个运行中的会话,例如一次性将所有会话移至更新的 Claude Code 二进制文件 |

827| `claude rm <id>` | 从列表中删除会话,以及 Claude 为其创建的 worktree(当安全删除时);参见 [删除会话会删除什么](#what-deleting-a-session-removes)。会话记录保存在您的本地机器上,并且仍然可以通过 `claude --resume` 访问 |830| `claude rm <id>` | 从列表中删除会话,以及 Claude 为其创建的 worktree(当安全删除时);参见 [删除会话会删除什么](#what-deleting-a-session-removes)。会话记录保存在您的本地机器上,并且仍然可以通过 `claude --resume` 访问 |

828| `claude rm <id> --discard-unpushed <commit>@<worktree-id>` | 删除因未推送提交而删除被拒绝的会话,丢弃 worktree 及其分支和提交。传递拒绝打印的确切值;参见 [删除会话会删除什么](#what-deleting-a-session-removes)。需要 v2.1.260 或更高版本 |831| `claude rm <id> --discard-unpushed <commit>@<worktree-id>` | 删除因未推送提交而删除被拒绝的会话,丢弃 worktree 及其分支和提交。传递拒绝打印的确切值;参见 [删除会话会删除什么](#what-deleting-a-session-removes)。需要 v2.1.260 或更高版本 |

829| `claude rm <id> --force-remove-worktree <worktree-id>` | 删除因 git 或 `WorktreeRemove` hook 无法删除其 worktree 而删除被拒绝的会话,无论如何删除 worktree 目录并在仓库中保留其分支。传递拒绝打印的确切值;参见 [删除会话会删除什么](#what-deleting-a-session-removes)。需要 v2.1.268 或更高版本 |832| `claude rm <id> --force-remove-worktree <worktree-id>` | 删除因 git 或 `WorktreeRemove` hook 无法删除其 worktree 而删除被拒绝的会话,无论如何删除 worktree 目录并在仓库中保留其分支。传递拒绝打印的确切值;参见 [删除会话会删除什么](#what-deleting-a-session-removes)。需要 v2.1.268 或更高版本 |

830| `claude daemon status` | 打印 [supervisor](#the-supervisor-process) 的状态、版本、socket 目录和 worker 数量 |833| `claude daemon status` | 打印 [supervisor](#the-supervisor-process) 的状态、版本、socket 目录和 worker 数量 |

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

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

833 836 

834`claude attach` 和 `claude logs` 可以使用会话名称的一部分代替 ID,例如 `claude logs "auth refactor"`。传递名称需要 Claude Code v2.1.290 或更高版本。837`claude attach` 和 `claude logs` 可以使用会话名称的一部分代替 ID,例如 `claude logs "auth refactor"`。`claude attach` 仅在会话进程运行时才能按名称打开会话,因此要重新启动已停止的会话,请改为传递 ID。传递名称需要 Claude Code v2.1.290 或更高版本。

835 838 

836<h3 id="list-sessions-as-json">839<h3 id="list-sessions-as-json">

837 将会话列为 JSON840 将会话列为 JSON


889* **已完成或等待您的下一条消息,且未连接约一小时**:监督进程停止该进程以释放资源。以向您提问结束其轮次的会话计为等待您的下一条消息。对话保存在磁盘上,下次您连接或回复时,会话从中断处恢复。使用 `Ctrl+T` 固定会话以保持其进程运行。892* **已完成或等待您的下一条消息,且未连接约一小时**:监督进程停止该进程以释放资源。以向您提问结束其轮次的会话计为等待您的下一条消息。对话保存在磁盘上,下次您连接或回复时,会话从中断处恢复。使用 `Ctrl+T` 固定会话以保持其进程运行。

890* **在监督进程运行时意外退出**:监督进程重新启动该进程。如果通过 `kill` 等方式结束您自己使用 `←` 或 `/background` 后台化的会话,该会话会被标记为已停止,而不是重新启动。对于以关闭结束的会话,请参阅[会话在关闭后显示为失败或已停止](#sessions-show-as-failed-after-shutdown)。893* **在监督进程运行时意外退出**:监督进程重新启动该进程。如果通过 `kill` 等方式结束您自己使用 `←` 或 `/background` 后台化的会话,该会话会被标记为已停止,而不是重新启动。对于以关闭结束的会话,请参阅[会话在关闭后显示为失败或已停止](#sessions-show-as-failed-after-shutdown)。

891* **自动更新后**:监督进程重新启动自身到新版本,并在后台移动空闲会话。工作中、等待您或已连接的会话不会被中断。894* **自动更新后**:监督进程重新启动自身到新版本,并在后台移动空闲会话。工作中、等待您或已连接的会话不会被中断。

895* **监督进程本身停止**,例如因为其进程被 Claude Code 外部结束:在 macOS 和 Linux 上,每个会话的进程会等待约一分钟,等待新的监督进程重新连接到它,如果没有重新连接则停止。在这一分钟内于 shell 中运行 `claude agents`,即可启动新的监督进程并保持会话运行。如果这一分钟先过去,会话会停止,但其保存的对话仍保留在磁盘上:连接或回复某个会话,它就会从保存的对话重新启动,如[会话在关闭后显示为失败或已停止](#sessions-show-as-failed-after-shutdown)中所述。

892 896 

893当会话的进程停止或重新启动时,Claude 在其中启动的后台 shell 命令、动态工作流和后台子代理会转移到其下一个进程;运行中的监视器和子代理启动的 shell 命令会随进程停止。删除会话会停止它转移的所有内容。要改为让所有内容随进程停止而不是转移,请将 [`CLAUDE_CODE_DISABLE_BG_EXIT_HANDOFF`](/docs/zh-CN/env-vars#variables) 设置为 `1`。897当会话的进程停止或重新启动时,Claude 在其中启动的后台 shell 命令、动态工作流和后台子代理会转移到其下一个进程;运行中的监视器和子代理启动的 shell 命令会随进程停止。删除会话会停止它转移的所有内容。要改为让所有内容随进程停止而不是转移,请将 [`CLAUDE_CODE_DISABLE_BG_EXIT_HANDOFF`](/docs/zh-CN/env-vars#variables) 设置为 `1`。

894 898 


911 915 

912要在不直接读取文件的情况下检查此状态,请运行 `claude daemon status`。它报告监督进程是否可达、其进程 ID 和版本、套接字目录以及有多少后台会话处于活跃状态。916要在不直接读取文件的情况下检查此状态,请运行 `claude daemon status`。它报告监督进程是否可达、其进程 ID 和版本、套接字目录以及有多少后台会话处于活跃状态。

913 917 

914该命令还会在运行的监督进程版本与您调用的 `claude` 版本不同时发出警告,这发生在监督进程尚未重新启动到新版本的更新之后。警告显示两个版本,并告诉您运行 `claude daemon stop --any` 以获取新版本。当 Claude Code 作为操作系统服务安装时,建议的命令是 `claude daemon stop` 不带该标志。918该命令还会在运行的监督进程版本与您调用的 `claude` 版本不同时发出警告,这发生在监督进程尚未重新启动到新版本的更新之后。警告显示两个版本,并告诉您运行 `claude daemon stop --any` 以获取新版本。

915 919 

916会话在该版本不匹配时完好无损:更新会话 `state.json` 的较旧 Claude Code 版本会保留它不识别的字段并保持会话列出。`roster.json` 中的会话列表遵循相同的规则,因此由较新版本启动的会话保持可达并在监督进程重新启动后继续接受输入。920会话在该版本不匹配时完好无损:更新会话 `state.json` 的较旧 Claude Code 版本会保留它不识别的字段并保持会话列出。`roster.json` 中的会话列表遵循相同的规则,因此由较新版本启动的会话保持可达并在监督进程重新启动后继续接受输入。

917 921 


963 967 

964关闭或重新启动您的机器会停止运行的后台会话。等待您输入的会话在您返回时仍会显示在 `Needs input` 下。对于任何其他运行的会话,Agent 视图显示的内容取决于它上次取得进展的时间:968关闭或重新启动您的机器会停止运行的后台会话。等待您输入的会话在您返回时仍会显示在 `Needs input` 下。对于任何其他运行的会话,Agent 视图显示的内容取决于它上次取得进展的时间:

965 969 

966* 在 48 小时内,会话显示为失败。附加或回复它,它会从中断的地方重新启动。970* 在 48 小时内,会话显示为失败。附加或回复它,它会从其保存的对话重新启动。要继续被中断的工作,请向它发送一条回复,要求它继续。

967* 超过 48 小时,例如机器关闭数天后,会话显示为已停止,并显示 `ended while the background service was off`。在该行上按 `Enter`,页脚会显示 `Press enter again to resume this session (it ended while the background service was off), or ctrl+x to delete it.` 在同一行上再次按 `Enter` 来恢复其保存的对话。回复或 `claude attach <id>` 会在没有该页脚提示的情况下恢复它。971* 超过 48 小时,例如机器关闭数天后,会话显示为已停止,并显示 `ended while the background service was off`。在该行上按 `Enter`,页脚会显示 `Press enter again to resume this session (it ended while the background service was off), or ctrl+x to delete it.` 在同一行上再次按 `Enter` 来恢复其保存的对话。回复或 `claude attach <id>` 会在没有该页脚提示的情况下恢复它。

968 972 

969当[会话记录清理](/docs/zh-CN/settings-reference#cleanupperioddays)删除了已停止会话的保存对话时,Claude Code 拒绝打开该行:消息说没有可恢复的内容。`claude rm <id>` 删除该行,除了上文[保留的情况](#what-deleting-a-session-removes)中描述的情况,`claude respawn <id>` 再次运行其原始提示词。请参阅[此会话的保存对话不再在磁盘上](/docs/zh-CN/errors#this-sessions-saved-conversation-is-no-longer-on-disk)。973当[会话记录清理](/docs/zh-CN/settings-reference#cleanupperioddays)删除了已停止会话的保存对话时,Claude Code 拒绝打开该行:消息说没有可恢复的内容。`claude rm <id>` 删除该行,除了上文[保留的情况](#what-deleting-a-session-removes)中描述的情况,`claude respawn <id>` 再次运行其原始提示词。请参阅[此会话的保存对话不再在磁盘上](/docs/zh-CN/errors#this-sessions-saved-conversation-is-no-longer-on-disk)。


1022claude daemon stop --any --keep-workers1026claude daemon stop --any --keep-workers

1023```1027```

1024 1028 

1025新的主管重新连接到运行的会话。没有 `--keep-workers`,该命令也会结束后台会话。`--any` 标志确认您想停止按需启动的主管,而不是作为已安装的服务,这是默认值。1029然后在 shell 中运行 `claude agents` 来启动新的主管。如果您在停止后[大约一分钟](#the-supervisor-process)内执行此操作,它会重新连接到仍在运行的会话,这些会话的工作会不间断地继续。如果您花费的时间更长,在 macOS 和 Linux 上,这些会话届时已自行停止,附加或回复其中一个会话会从其保存的对话重新启动它。没有 `--keep-workers`,该命令也会结束后台会话。`--any` 标志使该命令停止由 Claude Code 按需启动的主管。

1026 1030 

1027启动但无法接受连接的主管会自行退出并释放其锁,所以下一个 `claude agents` 会启动新的,无需此手动停止。上述步骤适用于运行的主管停滞的情况。1031启动但无法接受连接的主管会自行退出并释放其锁,所以下一个 `claude agents` 会启动新的,无需此手动停止。上述步骤适用于运行的主管停滞的情况。

1028 1032 


1040claude daemon stop --any --keep-workers1044claude daemon stop --any --keep-workers

1041```1045```

1042 1046 

1043下一个 `claude agents` 或 `claude --bg` 启动读取您存储凭据的新主管。如果您使用环境变量(如 `ANTHROPIC_API_KEY`)而不是 `/login` 进行身份验证,请从设置了该变量的 shell 运行该下一个命令。1047在[大约一分钟](#the-supervisor-process)内,在 shell 中运行 `claude agents` 或 `claude --bg`,以启动读取您存储凭据的新主管。如果您使用环境变量(如 `ANTHROPIC_API_KEY`)而不是 `/login` 进行身份验证,请从设置了该变量的 shell 运行该下一个命令。

1044 1048 

1045有关原因和修复的完整列表,请参阅[错误参考](/docs/zh-CN/errors#could-not-resolve-authentication-method)。1049有关原因和修复的完整列表,请参阅[错误参考](/docs/zh-CN/errors#could-not-resolve-authentication-method)。

1046 1050 

analytics.md +1 −1

Details

67* **"GitHub 应用必需"**:安装 GitHub 应用以查看贡献指标67* **"GitHub 应用必需"**:安装 GitHub 应用以查看贡献指标

68* **"数据处理进行中"**:几天后重新检查,如果数据未出现,请确认 GitHub 应用已安装68* **"数据处理进行中"**:几天后重新检查,如果数据未出现,请确认 GitHub 应用已安装

69 69 

70贡献指标支持 GitHub Cloud 和 GitHub Enterprise Server。70贡献指标涵盖托管在 github.com 上的仓库。对于 [GitHub Enterprise Server](/docs/zh-CN/github-enterprise-server) 上的仓库,分析仪表板仅显示使用指标。

71 71 

72<h3 id="review-summary-metrics">72<h3 id="review-summary-metrics">

73 查看摘要指标73 查看摘要指标

Details

96 <Step title="添加用户">96 <Step title="添加用户">

97 您可以通过以下任一方法添加用户:97 您可以通过以下任一方法添加用户:

98 98 

99 * 从 Console 内批量邀请用户:Settings -> Members -> Invite99 * 从 Console 的 Members 页面 [platform.claude.com/settings/members](https://platform.claude.com/settings/members) 批量邀请用户:点击 **Invite**

100 * [设置 SSO](https://support.claude.com/en/articles/13132885-setting-up-single-sign-on-sso)100 * [设置 SSO](https://support.claude.com/en/articles/13132885-setting-up-single-sign-on-sso)

101 </Step>101 </Step>

102 102 


113 * 接受 Console 邀请113 * 接受 Console 邀请

114 * [检查系统要求](/docs/zh-CN/setup#system-requirements)114 * [检查系统要求](/docs/zh-CN/setup#system-requirements)

115 * [安装 Claude Code](/docs/zh-CN/setup#install-claude-code)115 * [安装 Claude Code](/docs/zh-CN/setup#install-claude-code)

116 * 使用 Console 账户凭证登录116 * 使用 Console 账户凭据登录

117 </Step>117 </Step>

118</Steps>118</Steps>

119 119 

Details

1> ## Documentation Index

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> Use this file to discover all available pages before exploring further.

4 

5# 自动模式分类器请求费用

6 

7> 解决 Claude Code 通知说此会话不符合自动模式免费分类器请求条件的问题:它的含义、为什么出现,以及该怎么做。

8 

9在 [auto mode](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode) 中,分类器在 shell 命令和网络请求等操作运行前对其进行检查。在 [服务器端检查启用](/docs/zh-CN/permission-modes#server-side-classifier-review) 的地方,服务器将这些检查作为会话自身模型请求的一部分执行,不收费。此通知意味着服务器的检查无法到达您的会话,因此 Claude Code 正在发出自己的分类器请求,在您的账户上这些请求计入您的令牌使用量:

10 

11```text theme={null}

12We're changing auto mode to no longer charge for classifier requests in Claude Code. However, this session isn't eligible.

13```

14 

15在提示符处,Claude Code 会暂停它要以这种方式检查的第一个操作,直到您回答。没有任何问题:auto mode 继续工作,其分类器请求按之前的方式计费。最常见的原因是 Claude Code 和 API 之间存在 LLM gateway 或代理,当 Claude Code 能够识别一个时,通知会将其命名。按 **Enter** 继续,或参阅 [使会话符合条件](#make-the-session-eligible) 以防止其在新会话中出现。

16 

17<h2 id="respond-to-the-notice">

18 响应通知

19</h2>

20 

21该通知会保持操作处于待处理状态,直到您回答:

22 

23* **Enter** 继续:保持的操作和会话的其余部分使用 Claude Code 自己的分类器请求,按照之前的方式计费为令牌使用,该通知在该会话中不会再次出现。当通知命名了网关时,确认它会防止它在这台机器上的 24 小时内再次出现。当它没有命名时,通知会在下次会话回退时返回。

24* **Esc** 或 **Ctrl+C** 取消:保持的操作不会运行,当前轮次停止,会话仍处于自动模式。没有任何内容被记住,所以通知会在下一个检查的操作之前再次出现。

25 

26要停止使用自动模式,请在您回答后使用 `Shift+Tab` 切换权限模式。

27 

28在无法等待答案的地方,Claude Code 报告相同的文本,会话继续以自动模式运行,除非此机器上过去 24 小时内的网关确认已将其关闭。在 [non-interactive mode](/docs/zh-CN/headless) 中使用 `-p` 时,它会将文本打印到 stderr,在 `stream-json` 输出中,它会发出 `system` 警告消息,Agent SDK 应用程序可以从消息流中读取该消息。

29 

30<h2 id="make-the-session-eligible">

31 使会话符合条件

32</h2>

33 

34如果网关是原因,请要求您公司的管理员或网关提供商原封不动地传递请求和回复。这意味着按原样转发请求头和正文字段,包括网关不识别的字段,例如 `safeguards` 请求字段,以及返回响应和流式事件而不删除键(例如 `safeguard_results` 字段)或重写工具使用 ID,如[网关兼容性指南](/docs/zh-CN/llm-gateway-protocol#feature-pass-through)所述。以这种方式传递流量的网关可继续与此功能和未来功能配合使用。新会话随后再次使用服务器的检查。

35 

36如果您已经知道您的网关无法提供服务器的检查,请在启动会话之前通过在 shell 中或在 [`env` 设置键](/docs/zh-CN/settings-reference#env)中将 `CLAUDE_CODE_AUTO_MODE_SERVER` 设置为 `0` 来告诉 Claude Code 不要在那里请求它们:

37 

38```bash theme={null}

39export CLAUDE_CODE_AUTO_MODE_SERVER=0

40```

41 

42分类器请求随后始终是 Claude Code 自己的,以相同方式计费,通知不会出现。在与 Anthropic API 的直接连接上,该变量需要 Claude Code v2.1.281 或更高版本。当 `CLAUDE_CODE_AUTO_MODE_SERVER` 未设置时,设置 `CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1` 也会关闭服务器的检查,除了[禁用预发布功能](/docs/zh-CN/llm-gateway-protocol#disable-pre-release-capabilities)所述的情况。

43 

44`CLAUDE_CODE_AUTO_MODE_SERVER` 是一个临时设置,可能在后续版本中被移除。

45 

46<h2 id="why-the-notice-appears">

47 为什么会出现通知

48</h2>

49 

50[服务器端分类器审查](/docs/zh-CN/permission-modes#server-side-classifier-review)列出了哪些会话向服务器请求分类器检查。Pro、Max 和 Team 计划永远不会显示该通知。当它出现时,通常的原因是:

51 

52* **路径中存在 LLM 网关或代理**:一个会剥离或重写请求头、丢弃它不识别的请求字段或编辑响应的网关。服务器随后永远不会收到检查请求,或 Claude Code 永远不会收到结果。当您的配置或响应识别网关时,通知会将其命名。

53* **服务器端检查尚未到达您的平台、区域或凭证**:平台或区域是否执行检查取决于该平台的推出情况。如果您看到通知且路径中没有网关或代理,并且它持续出现,这是可能的原因。要确认,请联系支持或您公司的管理员,或使用 `/feedback` 报告。

54 

55要检查处于自动模式的会话,请在 Claude Code 提示符处运行 `/status`:其**自动模式服务器**行在服务器的检查决定会话的操作时读取 `Enabled`,在会话回退后读取 `Disabled`。

56 

57当网关截断响应或将结果重写为 Claude Code 无法读取的形式时,您会收到没有判决的拒绝,而不是此通知;请参阅[服务器端分类器审查](/docs/zh-CN/permission-modes#server-side-classifier-review)。

58 

59<h2 id="related-resources">

60 相关资源

61</h2>

62 

63* [Auto mode](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode):什么是 auto mode 以及它默认阻止的内容

64* [Server-side classifier review](/docs/zh-CN/permission-modes#server-side-classifier-review):哪些会话要求服务器检查操作,以及每个会话所需的 Claude Code 版本

65* [Gateway compatibility guide](/docs/zh-CN/llm-gateway-protocol#feature-pass-through):当网关删除请求头或正文字段时会出现什么问题

66* [The server returned no safety verdict](/docs/zh-CN/errors#the-server-returned-no-safety-verdict):当服务器对操作没有给出判决时您看到的拒绝

67* [Manage costs effectively](/docs/zh-CN/costs):跟踪令牌使用情况并降低 Claude Code 成本

Details

379 379 

380屏幕上报告拒绝的另外两个位置省略了命令或 URL:输入框附近的通知,例如 `bash denied by auto mode · [Data Exfiltration] · /permissions`,给出工具和原因,**Recently denied** 选项卡按 Claude 为其编写的描述列出 shell 命令。要以编程方式捕获这些拒绝的确切输入,请添加一个 [`PermissionDenied` hook](/docs/zh-CN/hooks#permissiondenied),它将其作为 `tool_input` 接收。380屏幕上报告拒绝的另外两个位置省略了命令或 URL:输入框附近的通知,例如 `bash denied by auto mode · [Data Exfiltration] · /permissions`,给出工具和原因,**Recently denied** 选项卡按 Claude 为其编写的描述列出 shell 命令。要以编程方式捕获这些拒绝的确切输入,请添加一个 [`PermissionDenied` hook](/docs/zh-CN/hooks#permissiondenied),它将其作为 `tool_input` 接收。

381 381 

382调用下方的文本告诉您是否有任何需要修复的内容。报告分类器本身问题的文本,例如 `is temporarily unavailable` 的模型或分类器错误,意味着 Claude Code 在没有来自分类器的最终判决的情况下阻止了调用;请参阅 [Auto mode 无法确定操作的安全性](/docs/zh-CN/errors#auto-mode-cannot-determine-the-safety-of-an-action)了解该怎么做。否则,一行显示 `Denied by auto mode classifier` 并带有 `[Production Deploy]` 或 `Blocked by classifier` 等原因意味着分类器判断调用不安全,因此从调用试图到达或执行的内容中选择修复:382调用下方的文本告诉您是否有任何需要修复的内容。一行暗色的 `Not run · auto mode's check had no usable answer`,或报告分类器本身问题的文本(例如 `Auto mode could not evaluate this action`),意味着 Claude Code 在没有来自分类器的判决的情况下阻止了调用。对于 `Not run` 行,请按 `Ctrl+O` 阅读完整消息,然后参阅[自动模式无法确定操作的安全性](/docs/zh-CN/errors#auto-mode-cannot-determine-the-safety-of-an-action)或[服务器未返回安全判决](/docs/zh-CN/errors#the-server-returned-no-safety-verdict)了解该怎么做。

383 

384否则,一行显示 `Denied by auto mode classifier` 并带有 `[Production Deploy]` 或 `Blocked by classifier` 等原因意味着分类器判断调用不安全,因此从调用试图到达或执行的内容中选择修复:

383 385 

384* Claude 在整个任务中需要的目标,例如包注册表、内部域或存储库主机:将其添加到 `autoMode.environment`。386* Claude 在整个任务中需要的目标,例如包注册表、内部域或存储库主机:将其添加到 `autoMode.environment`。

385* 您想从现在开始运行而无需审查的命令:添加一个 `allow` 规则。387* 您想从现在开始运行而无需审查的命令:添加一个 `allow` 规则。

Details

114 中途发送的消息未检查点114 中途发送的消息未检查点

115</h3>115</h3>

116 116 

117当您在 Claude 工作时[排队的消息](/docs/zh-CN/interactive-mode#queue-messages-while-claude-works)在运行的轮次中到达 Claude 时,它会加入该轮次而不是开始新的轮次。该消息会出现在对话中,但 Claude Code 不会为其创建检查点。Claude Code 作为新轮次的一部分发送的排队消息会照常获得检查点,包括当多个排队消息[共享该轮次](/docs/zh-CN/interactive-mode#when-claude-code-sends-what-you-queued)时。117在回溯菜单中,您[在 Claude 仍在工作时输入的](/docs/zh-CN/interactive-mode#queue-messages-while-claude-works)消息可能会被标记为 **No code restore**。Claude 在其轮次结束之前读取了该消息。[检查点是为启动轮次的提示词创建的](#how-checkpoints-work),因此该消息没有属于自己的检查点。Claude 在读取该消息之后所做的编辑会计入启动该轮次的提示词。

118 118 

119要撤销 Claude 在此类消息之后所做的编辑,请回溯到启动该轮次的提示词。这会回溯整个轮次,包括 Claude 在您的消息到达之前所做的工作。119您无需对该消息本身做任何处理。要撤销会话中那部分的文件更改,请选择启动该轮次的提示词,然后选择 **Restore code** 或 **Restore code and conversation**。这会还原 Claude 在整个轮次中所做的文件编辑,包括您的消息到达之前所做的编辑。选择被标记的消息时仍会提供 **Restore conversation**,它会将对话回溯到该消息,并保持您的文件不变。

120 120 

121<h3 id="symlinked-and-hard-linked-paths-not-restored">121<h3 id="symlinked-and-hard-linked-paths-not-restored">

122 符号链接和硬链接路径未恢复122 符号链接和硬链接路径未恢复

123</h3>123</h3>

124 124 

125Checkpointing 不会回溯符号链接或硬链接文件。当您从 `/rewind` 菜单中选择**恢复代码**或**恢复代码和对话**时,Claude Code 会跳过任何是符号链接或硬链接的跟踪路径,并显示 `已恢复代码,但跳过了 N 个文件` 警告。跳过的文件保持其当前内容。要撤销会话对其中一个文件的更改,请要求 Claude 反转编辑或自己编辑文件。配置文件(dotfile 管理器符号链接到您的项目中的文件)和 pnpm 硬链接到位的文件都属于此类别。125检查点功能不会回溯符号链接或硬链接文件。当您从 `/rewind` 菜单中选择 **Restore code** 或 **Restore code and conversation** 时,Claude Code 会跳过任何是符号链接或硬链接的跟踪路径,并显示 `Restored the code, but skipped N files` 警告。跳过的文件保持其当前内容。要撤销会话对其中一个文件的更改,请要求 Claude 反转编辑或自己编辑文件。dotfile 管理器符号链接到您项目中的配置文件,以及 pnpm 硬链接到位的文件,都属于此类别。

126 126 

127要查看恢复跳过的路径,请在恢复前使用 `/debug` 打开调试日志:`~/.claude/debug/<session-id>.txt` 中的调试日志会列出每个跳过的路径。有关每个跳过原因和恢复步骤,请参阅[错误参考中的 skipped-files 条目](/docs/zh-CN/errors#restored-the-code-but-skipped-files)。127要查看恢复跳过的路径,请在恢复前使用 `/debug` 打开调试日志:`~/.claude/debug/<session-id>.txt` 中的调试日志会列出每个跳过的路径。有关每个跳过原因和恢复步骤,请参阅[错误参考中的 skipped-files 条目](/docs/zh-CN/errors#restored-the-code-but-skipped-files)。

128 128 

chrome.md +3 −4

Details

129 VS Code 会话中的权限提示129 VS Code 会话中的权限提示

130</h3>130</h3>

131 131 

132在 VS Code 会话中,Claude Code 是否在浏览器操作前询问您,取决于该会话连接到您浏览器的方式:132在 VS Code 会话中,当 Claude Code 在浏览器操作前询问您时,提示会以卡片形式显示在聊天面板中。当该操作针对您尚未允许的网站时,该卡片还会提供允许该网站的选项。

133 133 

134* **您键入了 `@browser`**:扩展程序会批准 Claude Code 原本会询问您的每个浏览器操作。134在因 [Enabled by default](#enable-chrome-by-default) 已开启而在启动时连接到您浏览器的会话中,在 Manual、Edit automatically、Auto 和 Bypass permissions 模式下,对于您尚未允许的网站,Claude Code 会在浏览器操作前询问您。在 Auto 和 Bypass permissions 模式下,这一行为持续到您在该会话中键入 `@browser` 为止。

135* **[Enabled by default](#enable-chrome-by-default) 设置在启动时建立了连接**:在 Manual、Edit automatically、Auto 和 Bypass permissions 模式下,对于您尚未允许的网站,Claude Code 会在浏览器操作前询问您,直到您在该会话中键入 `@browser`。

136 135 

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

138 Plan Mode 中的浏览器工具137 Plan Mode 中的浏览器工具

139</h3>138</h3>

140 139 

141在[计划模式](/docs/zh-CN/permission-modes#analyze-before-you-edit-with-plan-mode)中,在 Claude 记录 GIF、打开新标签页或运行快捷方式之前会出现权限提示,但在您键入了 [`@browser`](#permission-prompts-in-vs-code-sessions) 的 VS Code 会话中除外。在交互式 CLI 会话中,如果[可用绕过权限模式](/docs/zh-CN/permission-modes#skip-all-checks-with-bypasspermissions-mode)且[功能标志获取](/docs/zh-CN/env-vars#features-that-need-feature-flag-fetching)已关闭,这些调用将在没有提示的情况下运行。140在[计划模式](/docs/zh-CN/permission-modes#analyze-before-you-edit-with-plan-mode)中,在 Claude 记录 GIF、打开新标签页或运行快捷方式之前会出现权限提示。在交互式 CLI 会话中,如果[可用绕过权限模式](/docs/zh-CN/permission-modes#skip-all-checks-with-bypasspermissions-mode)且[功能标志获取](/docs/zh-CN/env-vars#features-that-need-feature-flag-fetching)已关闭,这些调用将在没有提示的情况下运行。

142 141 

143当 `tabs_context_mcp` 调用设置 `createIfEmpty` 时也会提示,包含任何这些操作的 `browser_batch` 调用也是如此。142当 `tabs_context_mcp` 调用设置 `createIfEmpty` 时也会提示,包含任何这些操作的 `browser_batch` 调用也是如此。

144 143 

Details

261 连接开发人员261 连接开发人员

262</h2>262</h2>

263 263 

264开发人员从自己的笔记本电脑使用一次浏览器登录进行连接,使用他们的公司工作账户。他们不需要 claude.ai 账户、API 密钥或订阅,因为对模型的请求通过网关使用组织的上游凭证。连接由您通过 MDM 推送的[客户端托管设置](/docs/zh-CN/claude-apps-gateway-config#client-side-managed-settings)驱动,因此开发人员端没有手动设置;本部分涵盖管理员配置的内容。264开发人员从自己的笔记本电脑使用一次浏览器登录进行连接,使用他们的公司工作账户。他们不需要 claude.ai 账户、API 密钥或订阅,因为对模型的请求通过网关使用组织的上游凭据。连接由您通过 MDM 推送的[客户端托管设置](/docs/zh-CN/claude-apps-gateway-config#client-side-managed-settings)驱动,本部分涵盖管理员配置的内容。

265 265 

266CLI 在首次连接时对网关的 TLS 叶证书进行指纹识别,并按主机名固定它。它在登录期间、静默会话刷新期间和托管设置获取期间再次检查该固定,而推理请求使用标准 TLS 验证而不使用固定。通过 HTTPS 代理路由的请求跳过固定检查,因此将网关主机添加到 `NO_PROXY` 以保持它们直接连接。266CLI 在首次连接时对网关的 TLS 叶证书进行指纹识别,并按主机名固定它。它在登录期间、静默会话刷新期间和托管设置获取期间再次检查该固定,而推理请求使用标准 TLS 验证而不使用固定。通过 HTTPS 代理路由的请求跳过固定检查,因此将网关主机添加到 `NO_PROXY` 以保持它们直接连接。

267 267 


285 设置网关 URL285 设置网关 URL

286</h3>286</h3>

287 287 

288三个密钥进入您通过 MDM 或直接在磁盘上部署的每个操作系统[托管设置文件](/docs/zh-CN/managed-settings#delivery-mechanisms)。`forceLoginMethod` 和 `forceLoginGatewayUrl` 在**Cloud gateway** 屏幕上直接打开 `/login`,URL 已填入,`parentSettingsBehavior: "merge"` 让 Claude Desktop 将网关的出口允许列表传递给它启动的 Claude Code 会话,在[将策略传递给 Claude Desktop 会话](#deliver-policy-to-claude-desktop-sessions)中解释:288三个密钥进入您通过 MDM 或直接在磁盘上部署的每个操作系统[托管设置文件](/docs/zh-CN/managed-settings#delivery-mechanisms)。对于没有托管设置的机器,请改为参阅[在用户设置中设置网关 URL](#set-the-gateway-url-in-user-settings)。`forceLoginMethod` 和 `forceLoginGatewayUrl` 在**Cloud gateway** 屏幕上直接打开 `/login`,URL 已填入,`parentSettingsBehavior: "merge"` 让 Claude Desktop 将网关的出口允许列表传递给它启动的 Claude Code 会话,在[将策略传递给 Claude Desktop 会话](#deliver-policy-to-claude-desktop-sessions)中解释:

289 289 

290```json theme={null}290```json theme={null}

291{291{


297 297 

298开发人员按 Enter 连接。[首次连接 TLS 指纹提示](#connect-developers)仍然出现。文件在机器上后,未完成网关登录的开发人员会看到[管理员策略需要 Cloud 网关登录](/docs/zh-CN/errors#administrator-policy-requires-a-cloud-gateway-sign-in)下描述的消息之一。通过环境变量(如 `CLAUDE_CODE_USE_BEDROCK`)选择云提供商的开发人员不需要网关登录。298开发人员按 Enter 连接。[首次连接 TLS 指纹提示](#connect-developers)仍然出现。文件在机器上后,未完成网关登录的开发人员会看到[管理员策略需要 Cloud 网关登录](/docs/zh-CN/errors#administrator-policy-requires-a-cloud-gateway-sign-in)下描述的消息之一。通过环境变量(如 `CLAUDE_CODE_USE_BEDROCK`)选择云提供商的开发人员不需要网关登录。

299 299 

300开发人员无法手动设置此项。登录选择器中没有网关选项,`forceLoginGatewayUrl` 在开发人员自己的设置文件中被忽略。单独的 `forceLoginMethod`,没有 URL,将开发人员留在"联系您的 IT 管理员"消息处。登录密钥属于您推送到机器的文件中,而不是网关的 `managed.policies[].cli` 块中,该块仅到达已连接的客户端。300登录选择器中没有网关选项,而在托管设置中,单独的 `forceLoginMethod`(没有 URL)会将开发人员留在"联系您的 IT 管理员"消息处。登录密钥属于您推送到机器的文件中,而不是网关的 `managed.policies[].cli` 块中,该块仅到达已连接的客户端。

301 

302<h4 id="set-the-gateway-url-in-user-settings">

303 在用户设置中设置网关 URL

304</h4>

305 

306在没有托管设置的机器上,让每位开发人员将 `forceLoginMethod` 和 `forceLoginGatewayUrl` 添加到其自己的用户设置文件 `~/.claude/settings.json` 中。这需要开发人员机器上的 Claude Code v2.1.295 或更高版本。此示例指定位于 `claude-gateway.internal.example.com` 的网关:

307 

308```json theme={null}

309{

310 "forceLoginMethod": "gateway",

311 "forceLoginGatewayUrl": "https://claude-gateway.internal.example.com"

312}

313```

314 

315当开发人员在 Claude Code 提示符处运行 `/login` 时,**Cloud gateway** 屏幕会以该地址打开,开发人员按 Enter 即可连接。[首次连接 TLS 指纹提示](#connect-developers)仍然出现。以这种方式设置的设置项受以下限制:

316 

317* **仅限用户设置**:Claude Code 从 `~/.claude/settings.json` 读取这两个设置项,而不是从项目的 `.claude/settings.json` 或 `.claude/settings.local.json` 读取。

318* **托管设置会使其失效**:一旦管理员的设置通过托管设置文件、macOS plist 或 Windows HKLM 策略,或[策略助手](/docs/zh-CN/settings-reference#policyhelper)到达机器,Claude Code 就会忽略用户设置中指定的网关。

301 319 

302<h3 id="allow-a-gateway-on-public-address-space-you-own">320<h3 id="allow-a-gateway-on-public-address-space-you-own">

303 在您拥有的公共地址空间上允许网关321 在您拥有的公共地址空间上允许网关

Details

981 * **混合键**:同时包含 `code` 和 `cli`(或其早期写法 `settings`)的文件会使网关在启动时停止。请在一次编辑中将所有块放在同一个键下。981 * **混合键**:同时包含 `code` 和 `cli`(或其早期写法 `settings`)的文件会使网关在启动时停止。请在一次编辑中将所有块放在同一个键下。

982</Warning>982</Warning>

983 983 

984策略的 Claude Code 设置(例如拒绝读取 `.env` 文件的规则)放在 `cli` 或 `code` 键下的块中。两个键接受相同的内容。键决定设置在哪里被执行:984策略的 Claude Code 设置(例如拒绝读取 `.env` 文件的规则)放在 `cli` 或 `code` 键下的块中。`code` 是推荐的键,`cli` 是旧版键。两个键接受相同的内容。键决定了设置在何处强制执行:

985 985 

986* **`cli`**:终端、VS Code 和 JetBrains 扩展以及 Agent SDK。在 `cli` 下,Claude Desktop 的 Code 标签页获得的是[派生设置](#claude-desktop-overlay),因此诸如 `Read(./.env)` 之类的限定规则在那里不会阻止用户。986* **`cli`**:终端、VS Code 和 JetBrains 扩展以及 Agent SDK。在 `cli` 下,Claude Desktop 的 Code 标签页获得的是[派生设置](#claude-desktop-overlay),因此诸如 `Read(./.env)` 之类的限定规则在那里不会阻止用户。

987* **`code`**:相同的位置,并且也可以覆盖 Claude Desktop 的 Code 标签页。987* **`code`**:相同的位置,并且也可以覆盖 Claude Desktop 的 Code 标签页。

988 988 

989需要决定的是这些设置是否也应覆盖 Code 标签页。如果不需要,无需做任何更改。使用 `cli` 的文件会照常工作;如果网关在带有 [`desktop`](#claude-desktop-overlay) 键的策略中发现 `cli`,它会在启动时发出警告但仍会启动。要覆盖 Code 标签页,请切换到推荐的 `code` 键。989使用 `cli` 的文件照常工作;如果网关在带有 [`desktop`](#claude-desktop-overlay) 键的策略中发现 `cli`,会在启动时发出警告,但仍会启动。请切换到 `code`,以便设置也能涵盖 Code 标签页。

990 990 

991切换之前,请阅读[在 Code 标签页中应用 `code` 设置](#apply-code-settings-in-the-code-tab)。策略需要 `desktop` 键,用户的机器也需要进行设置后这些设置才会在那里生效,并且 Claude Desktop 中的网页搜索会被关闭。991切换之前,请阅读[在 Code 标签页中应用 `code` 设置](#apply-code-settings-in-the-code-tab)。策略需要 `desktop` 键,用户的机器也需要进行设置后这些设置才会在那里生效,并且 Claude Desktop 中的网页搜索会被关闭。

992 992 


1713 1713 

1714对于 Claude Desktop,在 Claude Desktop 自己的[托管配置](https://claude.com/docs/third-party/claude-desktop/configuration)中设置 `bootstrapUrl` 密钥为 `<listen.public_url>/user/bootstrap`。登录流程和每组策略随后与 CLI 的匹配,一旦策略通过 `desktop` 密钥在服务器端选择加入;没有选择加入,`/user/bootstrap` 返回 404。有关服务器端部分,请参阅 [Claude Desktop 覆盖层](#claude-desktop-overlay)。1714对于 Claude Desktop,在 Claude Desktop 自己的[托管配置](https://claude.com/docs/third-party/claude-desktop/configuration)中设置 `bootstrapUrl` 密钥为 `<listen.public_url>/user/bootstrap`。登录流程和每组策略随后与 CLI 的匹配,一旦策略通过 `desktop` 密钥在服务器端选择加入;没有选择加入,`/user/bootstrap` 返回 404。有关服务器端部分,请参阅 [Claude Desktop 覆盖层](#claude-desktop-overlay)。

1715 1715 

1716Claude Code 仅从机器上的托管源尊重 [`forceLoginGatewayUrl`](/docs/zh-CN/settings-reference#forcelogingatewayurl)、[`gatewayInternalNetworks`](/docs/zh-CN/settings-reference#gatewayinternalnetworks) 和 [`forceLoginMethod`](/docs/zh-CN/settings-reference#forceloginmethod) 的 `"gateway"` 值:`managed-settings.json`、macOS plist 或 Windows HKLM 注册表,或策略助手。在开发者自己的 `~/.claude/settings.json` 中设置它们或在网关有效负载中设置它们不会配置网关登录。1716Claude Code 从机器上的托管源读取并遵循 [`forceLoginGatewayUrl`](/docs/zh-CN/settings-reference#forcelogingatewayurl)、[`gatewayInternalNetworks`](/docs/zh-CN/settings-reference#gatewayinternalnetworks) 和 [`forceLoginMethod`](/docs/zh-CN/settings-reference#forceloginmethod) 的 `"gateway"` 值:`managed-settings.json`、macOS plist 或 Windows HKLM 注册表,或策略助手。在网关负载中设置它们不会配置网关登录。关于开发者自己的 `~/.claude/settings.json`,请参阅[在用户设置中设置网关 URL](/docs/zh-CN/claude-apps-gateway#set-the-gateway-url-in-user-settings)。

1717 1717 

1718不要在有效负载中包含 `forceLoginMethod` 和 `forceLoginOrgUUID`。Claude Code 仍然从有效负载中读取这两个密钥以进行启动凭证检查,因此在机器上保留 Anthropic 颁发的凭证的开发者会获得[管理员策略需要云网关登录](/docs/zh-CN/errors#administrator-policy-requires-a-cloud-gateway-sign-in)下描述的启动退出,即使他们已经登录。1718不要在有效负载中包含 `forceLoginMethod` 和 `forceLoginOrgUUID`。Claude Code 仍然从有效负载中读取这两个密钥以进行启动凭证检查,因此在机器上保留 Anthropic 颁发的凭证的开发者会获得[管理员策略需要云网关登录](/docs/zh-CN/errors#administrator-policy-requires-a-cloud-gateway-sign-in)下描述的启动退出,即使他们已经登录。

1719 1719 

Details

135 将网关 URL 推送到开发者机器135 将网关 URL 推送到开发者机器

136</h3>136</h3>

137 137 

138一旦网关开始提供服务,通过托管设置、MDM 或直接写入每个操作系统的 `managed-settings.json` 将 `forceLoginMethod`、`forceLoginGatewayUrl` 和 `parentSettingsBehavior: "merge"` 推送到每个开发者的机器。没有这个,`/login` 显示标准账户选择器,没有网关选项。138一旦网关开始提供服务,通过托管设置、MDM 或直接写入每个操作系统的 `managed-settings.json` 将 `forceLoginMethod`、`forceLoginGatewayUrl` 和 `parentSettingsBehavior: "merge"` 推送到每个开发者的机器。

139 139 

140一旦您部署密钥,Claude Code 停止使用机器上剩余的 API 密钥或 claude.ai 登录,因此计划与您的登录说明一起推送。[管理员策略需要 Cloud 网关登录](/docs/zh-CN/errors#administrator-policy-requires-a-cloud-gateway-sign-in) 描述开发者看到的消息。140一旦您部署密钥,Claude Code 停止使用机器上剩余的 API 密钥或 claude.ai 登录,因此计划与您的登录说明一起推送。[管理员策略需要 Cloud 网关登录](/docs/zh-CN/errors#administrator-policy-requires-a-cloud-gateway-sign-in) 描述开发者看到的消息。

141 141 

Details

277 277 

278当线程的模型支持时,线程在[自动模式](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode)中运行,因此大多数工具调用无需询问你即可运行。当线程需要你的批准时,提示在该线程内,线程等待你在那里回答。在项目对话中告诉 Claude 继续不会到达它。278当线程的模型支持时,线程在[自动模式](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode)中运行,因此大多数工具调用无需询问你即可运行。当线程需要你的批准时,提示在该线程内,线程等待你在那里回答。在项目对话中告诉 Claude 继续不会到达它。

279 279 

280每个批准涵盖该提示,或如果你选择更广泛的选项,则涵盖该线程的其余部分。要让每个线程运行某些命令而不询问,或阻止某些命令,请将[权限规则](/docs/zh-CN/permissions)添加到存储库的`.claude/settings.json`。云线程仅在具有一个存储库的项目中应用它们;请参阅[线程从你的存储库中获取什么](#what-threads-pick-up-from-your-repositories)。在具有多个存储库的项目中,没有存储库的权限规则到达云线程,因此你依赖自动模式和你在每个线程内给出的批准。280每次批准仅涵盖该提示,或者如果您选择更广泛的选项,则涵盖该线程的其余部分。

281 

282要让每个线程无需询问即可运行某些命令,或阻止某些命令,请将[权限规则](/docs/zh-CN/permissions)添加到仓库的 `.claude/settings.json` 中。请确认项目中的云线程是否会应用这些规则:

283 

284* **一个仓库**:云线程会应用这些规则。请参阅[线程从您的仓库中获取哪些内容](#what-threads-pick-up-from-your-repositories)。

285* **多个仓库,Anthropic 托管的环境**:任何仓库的权限规则都不会传达到云线程,因此您需要依赖自动模式以及您在每个线程内给出的批准。

286* **多个仓库,自托管环境**:请参阅[哪个仓库的设置适用](/docs/zh-CN/self-hosted-environments-configuration#repository-settings-in-sessions-with-several-repositories)。

281 287 

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

283 在你自己的计算机上运行线程289 在你自己的计算机上运行线程


381 线程从您的仓库中获取什么387 线程从您的仓库中获取什么

382</h3>388</h3>

383 389 

384每个云线程会克隆项目中的每个仓库,并从所有仓库加载 `CLAUDE.md` 和 skill。权限规则、hook 和 `env` 仅来自线程启动目录中的 `.claude/settings.json`:当项目只有一个仓库时,该目录位于仓库内;当有多个仓库时,该目录位于各克隆的上层,此时不会读取任何仓库的该文件来获取这些内容。390每个云线程会克隆项目中的每个仓库,并从所有仓库加载 `CLAUDE.md` 和 skill。权限规则、hook 和 `env` 仅来自线程启动目录中的 `.claude/settings.json`。

385 391 

386| 在每个仓库中 | 一个仓库 | 多个仓库 |392| 在每个仓库中 | 一个仓库 | 多个仓库 |

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

388| `CLAUDE.md` | 在线程启动时加载 | 在线程启动时从每个仓库加载 |394| `CLAUDE.md` | 在线程启动时加载 | 在线程启动时从每个仓库加载 |

389| `.claude/` 下的 skill、Agent 和命令 | 加载 | 从每个仓库加载 |395| `.claude/` 下的 skill、Agent 和命令 | 加载 | 从每个仓库加载 |

390| 在 `.claude/settings.json` 中启用的插件 | 不加载。请改为在 **Project settings > Plugins** 中添加该插件 | 不加载。请改为在 **Project settings > Plugins** 中添加该插件 |396| 在 `.claude/settings.json` 中启用的插件 | 不加载。请改为在 **Project settings > Plugins** 中添加该插件 | 不加载。请改为在 **Project settings > Plugins** 中添加该插件 |

391| 在 `.claude/settings.json` 中定义的权限规则、hook 和 `env` | 适用于线程,但[任何云端会话都不遵循](/docs/zh-CN/cloud-environments#what-carries-over-from-your-setup)的 `env` 键除外 | 不适用 |397| 在 `.claude/settings.json` 中定义的权限规则、hook 和 `env` | 适用于线程,但[任何云端会话都不遵循](/docs/zh-CN/cloud-environments#what-carries-over-from-your-setup)的 `env` 键除外 | 在 Anthropic 托管环境中不适用。对于自托管环境,请参阅[哪个仓库的设置适用](/docs/zh-CN/self-hosted-environments-configuration#repository-settings-in-sessions-with-several-repositories) |

392 398 

393在有多个仓库的项目中,每个克隆都作为[附加目录](/docs/zh-CN/memory#load-from-additional-directories)附加到线程,并启用了 `CLAUDE.md` 加载,这就是为什么即使线程在它们的上层启动,每个仓库的 `CLAUDE.md` 和 skill 仍会在启动时加载。在这样的项目中,请将常规规则放在项目说明中,并通过[云环境](#choose-an-environment-for-threads)为线程提供环境变量。399在有多个仓库的项目中,请将常规规则放在项目说明中,并通过[云环境](#choose-an-environment-for-threads)为线程提供环境变量。

394 400 

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

396 为线程选择环境402 为线程选择环境


406 412 

407云线程不具备仅安装在您机器上的 skill、MCP 服务器、插件和工具。Claude 通过 [Remote Control](/docs/zh-CN/remote-control) 在您机器上运行的线程会使用那里安装的内容。要让这些内容对云线程可用:413云线程不具备仅安装在您机器上的 skill、MCP 服务器、插件和工具。Claude 通过 [Remote Control](/docs/zh-CN/remote-control) 在您机器上运行的线程会使用那里安装的内容。要让这些内容对云线程可用:

408 414 

409* skill、子代理和命令:将它们提交到您已添加到项目的仓库,例如位于 `.claude/skills/<skill-name>/SKILL.md` 的 skill。每个云线程会克隆项目中的每个仓库,并从每个仓库加载 `.claude/skills/`、`.claude/agents/` 和 `.claude/commands/`,因此提交到一个仓库的 skill 在每个云线程中都可用。云线程还会加载您为 claude.ai 账户启用的 skill。415* skill、子代理和命令:将它们提交到您已添加到项目的仓库,例如位于 `.claude/skills/<skill-name>/SKILL.md` 的 skill。每个云线程会克隆项目中的每个仓库,并从每个仓库加载 `.claude/skills/`、`.claude/agents/` 和 `.claude/commands/`,因此提交到一个仓库的 skill 在每个云线程中都可用。云线程还会加载[您为 claude.ai 账户启用的 skill](/docs/zh-CN/skills#skills-in-cowork-and-cloud-sessions)。

410* 插件:在 **Project settings > Plugins** 中添加它们;它们会加载到每个新云线程中。仓库在其 `.claude/settings.json` 中声明的插件[不会在云线程中加载](/docs/zh-CN/cloud-environments#what-carries-over-from-your-setup)。416* 插件:在 **Project settings > Plugins** 中添加它们;它们会加载到每个新云线程中。仓库在其 `.claude/settings.json` 中声明的插件[不会在云线程中加载](/docs/zh-CN/cloud-environments#what-carries-over-from-your-setup)。

411* MCP 服务器:云线程从您 claude.ai 账户上的连接器获取 MCP 工具,这些连接器是您在 [claude.ai/customize/connectors](https://claude.ai/customize/connectors) 或通过 **Project settings > Environment** 中的 **Manage connectors** 链接一次性连接的 MCP 服务器。每个云线程都可以使用所有这些连接器,无需按项目设置。项目对话本身没有连接器,因此请将需要连接器的工作作为任务发送给云线程。在只有一个仓库的项目中,云线程还会从该仓库的 [`.mcp.json`](/docs/zh-CN/cloud-environments#what-carries-over-from-your-setup) 加载 MCP 服务器。[连接器如何到达 Claude Code](/docs/zh-CN/mcp#how-connectors-reach-claude-code) 列出了云端会话的规则以及关闭连接器的设置。417* MCP 服务器:云线程从您 claude.ai 账户上的连接器获取 MCP 工具,这些连接器是您在 [claude.ai/customize/connectors](https://claude.ai/customize/connectors) 或通过 **Project settings > Environment** 中的 **Manage connectors** 链接一次性连接的 MCP 服务器。每个云线程都可以使用所有这些连接器,无需按项目设置。项目对话本身没有连接器,因此请将需要连接器的工作作为任务发送给云线程。在只有一个仓库的项目中,云线程还会从该仓库的 [`.mcp.json`](/docs/zh-CN/cloud-environments#what-carries-over-from-your-setup) 加载 MCP 服务器。[连接器如何到达 Claude Code](/docs/zh-CN/mcp#how-connectors-reach-claude-code) 列出了云端会话的规则以及关闭连接器的设置。

412* 命令行工具和包:在环境的[设置脚本](/docs/zh-CN/cloud-environments#setup-scripts)中安装它们。418* 命令行工具和包:在环境的[设置脚本](/docs/zh-CN/cloud-environments#setup-scripts)中安装它们。

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` |


68| `--agent` | 为当前会话指定 Agent(覆盖 `agent` 设置) | `claude --agent my-custom-agent` |68| `--agent` | 为当前会话指定 Agent(覆盖 `agent` 设置) | `claude --agent my-custom-agent` |

69| `--agents` | 通过 JSON 动态定义自定义子代理。接受[为 CLI 定义的子代理列出的字段](/docs/zh-CN/sub-agents#choose-the-subagent-scope)。使用 `--print` 时,该值可以是包含该对象的 JSON 文件的路径;文件形式需要 Claude Code v2.1.281 或更高版本。Claude Code 在启动时验证该值并在值无效时退出;有关消息以及跳过验证的标志和环境变量,请参阅 [`Invalid --agents configuration`](/docs/zh-CN/errors#invalid-agents-configuration)。验证需要 Claude Code v2.1.242 或更高版本 | `claude --agents '{"reviewer":{"description":"Reviews code","prompt":"You are a code reviewer"}}'` |69| `--agents` | 通过 JSON 动态定义自定义子代理。接受[为 CLI 定义的子代理列出的字段](/docs/zh-CN/sub-agents#choose-the-subagent-scope)。使用 `--print` 时,该值可以是包含该对象的 JSON 文件的路径;文件形式需要 Claude Code v2.1.281 或更高版本。Claude Code 在启动时验证该值并在值无效时退出;有关消息以及跳过验证的标志和环境变量,请参阅 [`Invalid --agents configuration`](/docs/zh-CN/errors#invalid-agents-configuration)。验证需要 Claude Code v2.1.242 或更高版本 | `claude --agents '{"reviewer":{"description":"Reviews code","prompt":"You are a code reviewer"}}'` |

70| `--allow-dangerously-skip-permissions` | 将 `bypassPermissions` 添加到 `Shift+Tab` 模式循环中而不以该模式启动。让您可以从不同的模式(如 `plan`)开始,稍后切换到 `bypassPermissions`。请参阅[权限模式](/docs/zh-CN/permission-modes#skip-all-checks-with-bypasspermissions-mode) | `claude --permission-mode plan --allow-dangerously-skip-permissions` |70| `--allow-dangerously-skip-permissions` | 将 `bypassPermissions` 添加到 `Shift+Tab` 模式循环中而不以该模式启动。让您可以从不同的模式(如 `plan`)开始,稍后切换到 `bypassPermissions`。请参阅[权限模式](/docs/zh-CN/permission-modes#skip-all-checks-with-bypasspermissions-mode) | `claude --permission-mode plan --allow-dangerously-skip-permissions` |

71| `--allowedTools`, `--allowed-tools` | 无需提示权限即可执行的工具。有关模式匹配,请参阅[权限规则语法](/docs/zh-CN/settings-reference#permission-rule-syntax)。要限制哪些工具可用,请改用 `--tools`。如果您在此处指定[任务跟踪工具](/docs/zh-CN/tools-reference#task-tool-availability)之一,Claude Code 也会让会话选择加入 | `"Bash(git log *)" "Bash(git diff *)" "Read"` |71| `--allowedTools`, `--allowed-tools` | 无需提示权限即可执行的工具,但从[网络路径](/docs/zh-CN/permissions#network-paths)读取除外。有关模式匹配,请参阅[权限规则语法](/docs/zh-CN/settings-reference#permission-rule-syntax)。要限制哪些工具可用,请改用 `--tools`。如果您在此处指定[任务跟踪工具](/docs/zh-CN/tools-reference#task-tool-availability)之一,Claude Code 也会让会话选择加入 | `"Bash(git log *)" "Bash(git diff *)" "Read"` |

72| `--append-subagent-system-prompt` | 将自定义文本附加到每个[子代理](/docs/zh-CN/sub-agents)的系统提示词末尾,包括嵌套子代理,但[分叉的子代理](/docs/zh-CN/sub-agents#fork-the-current-conversation)除外,它重用对话自身的提示词。仅在使用 `-p` 的非交互模式下应用。需要 Claude Code v2.1.205 或更高版本 | `claude -p --append-subagent-system-prompt "Cite file paths in every answer" "query"` |72| `--append-subagent-system-prompt` | 将自定义文本附加到每个[子代理](/docs/zh-CN/sub-agents)的系统提示词末尾,包括嵌套子代理,但[分叉的子代理](/docs/zh-CN/sub-agents#fork-the-current-conversation)除外,它重用对话自身的提示词。仅在使用 `-p` 的非交互模式下应用。需要 Claude Code v2.1.205 或更高版本 | `claude -p --append-subagent-system-prompt "Cite file paths in every answer" "query"` |

73| `--append-subagent-system-prompt-file` | 从文件加载文本并将其附加到[子代理](/docs/zh-CN/sub-agents)系统提示词。当文本过长无法在命令行上传递时,可作为 `--append-subagent-system-prompt` 的替代方案。这两个标志不能组合使用。仅在使用 `-p` 的非交互模式下应用。需要 Claude Code v2.1.261 或更高版本 | `claude -p --append-subagent-system-prompt-file ./subagent-rules.txt "query"` |73| `--append-subagent-system-prompt-file` | 从文件加载文本并将其附加到[子代理](/docs/zh-CN/sub-agents)系统提示词。当文本过长无法在命令行上传递时,可作为 `--append-subagent-system-prompt` 的替代方案。这两个标志不能组合使用。仅在使用 `-p` 的非交互模式下应用。需要 Claude Code v2.1.261 或更高版本 | `claude -p --append-subagent-system-prompt-file ./subagent-rules.txt "query"` |

74| `--append-system-prompt` | 将自定义文本附加到默认系统提示词的末尾 | `claude --append-system-prompt "Always use TypeScript"` |74| `--append-system-prompt` | 将自定义文本附加到默认系统提示词的末尾 | `claude --append-system-prompt "Always use TypeScript"` |


81| `--channels` | (研究预览)Claude 应在此会话中侦听其[频道](/docs/zh-CN/channels)通知的 MCP 服务器。空格分隔的 `plugin:<name>@<marketplace>` 条目列表。需要通过 claude.ai 或 Console API 密钥进行 Anthropic 身份验证 | `claude --channels plugin:my-notifier@my-marketplace` |81| `--channels` | (研究预览)Claude 应在此会话中侦听其[频道](/docs/zh-CN/channels)通知的 MCP 服务器。空格分隔的 `plugin:<name>@<marketplace>` 条目列表。需要通过 claude.ai 或 Console API 密钥进行 Anthropic 身份验证 | `claude --channels plugin:my-notifier@my-marketplace` |

82| `--chrome` | 启用 [Chrome 浏览器集成](/docs/zh-CN/chrome)以进行网络自动化和测试 | `claude --chrome` |82| `--chrome` | 启用 [Chrome 浏览器集成](/docs/zh-CN/chrome)以进行网络自动化和测试 | `claude --chrome` |

83| `--cloud` | 使用任务描述创建新的[云端会话](/docs/zh-CN/claude-code-on-the-web)。使用会话 ID(`session_...` 或 `cse_...`)或 claude.ai/code URL 时,则配合 `-p` 将消息排队到该现有会话。请参阅[发送后续消息](/docs/zh-CN/claude-code-on-the-web#send-follow-ups-from-the-cli)。 | `claude --cloud "Fix the login bug"` |83| `--cloud` | 使用任务描述创建新的[云端会话](/docs/zh-CN/claude-code-on-the-web)。使用会话 ID(`session_...` 或 `cse_...`)或 claude.ai/code URL 时,则配合 `-p` 将消息排队到该现有会话。请参阅[发送后续消息](/docs/zh-CN/claude-code-on-the-web#send-follow-ups-from-the-cli)。 | `claude --cloud "Fix the login bug"` |

84| `--continue`, `-c` | 加载当前目录中最近的对话,包括[已完成的后台会话](/docs/zh-CN/sessions#resume-a-session);打开已完成的后台会话需要 Claude Code v2.1.257 或更高版本。跳过使用 `claude -p` 或 Agent SDK 创建的会话,以及第一个提示词为 `/loop` 的会话。`claude -p --continue` 包括 `-p`、SDK 和 `/loop` 会话。包括使用 `/add-dir` 添加此目录的会话 | `claude --continue` |84| `--continue`, `-c` | 加载当前目录中最近的对话,包括[已完成的后台会话](/docs/zh-CN/sessions#where-the-session-picker-looks);打开已完成的后台会话需要 Claude Code v2.1.257 或更高版本。跳过使用 `claude -p` 或 Agent SDK 创建的会话,以及第一个提示词为 `/loop` 的会话。`claude -p --continue` 包括 `-p`、SDK 和 `/loop` 会话。包括使用 `/add-dir` 添加此目录的会话 | `claude --continue` |

85| `--dangerously-load-development-channels` | 启用不在批准的允许列表上的[频道](/docs/zh-CN/channels-reference#test-during-the-research-preview),用于本地开发。接受 `plugin:<name>@<marketplace>` 和 `server:<name>` 条目。会提示确认,因此它在交互式会话中生效。使用 `-p` 时,Claude Code 会忽略此标志 | `claude --dangerously-load-development-channels server:webhook` |85| `--dangerously-load-development-channels` | 启用不在批准的允许列表上的[频道](/docs/zh-CN/channels-reference#test-during-the-research-preview),用于本地开发。接受 `plugin:<name>@<marketplace>` 和 `server:<name>` 条目。会提示确认,因此它在交互式会话中生效。使用 `-p` 时,Claude Code 会忽略此标志 | `claude --dangerously-load-development-channels server:webhook` |

86| `--dangerously-skip-permissions` | 跳过权限提示。等同于 `--permission-mode bypassPermissions`。请参阅[权限模式](/docs/zh-CN/permission-modes#skip-all-checks-with-bypasspermissions-mode)了解此操作跳过和不跳过的内容。对于使用 `--bg` 启动的会话,当主管重新启动会话时,该模式[持续存在](/docs/zh-CN/agent-view#permission-mode-model-and-effort) | `claude --dangerously-skip-permissions` |86| `--dangerously-skip-permissions` | 跳过权限提示。等同于 `--permission-mode bypassPermissions`。请参阅[权限模式](/docs/zh-CN/permission-modes#skip-all-checks-with-bypasspermissions-mode)了解此操作跳过和不跳过的内容。对于使用 `--bg` 启动的会话,当主管重新启动会话时,该模式[持续存在](/docs/zh-CN/agent-view#permission-mode-model-and-effort) | `claude --dangerously-skip-permissions` |

87| `--debug` | 启用调试模式,可选类别过滤,例如 `--debug='mcp,startup'` 或 `--debug='!1p'`。过滤器仅在 `=` 形式中绑定;空格分隔的过滤器启用调试模式而不进行过滤 | `claude --debug='mcp,startup'` |87| `--debug` | 启用调试模式,可选类别过滤,例如 `--debug='mcp,startup'` 或 `--debug='!1p'`。过滤器仅在 `=` 形式中绑定;空格分隔的过滤器启用调试模式而不进行过滤 | `claude --debug='mcp,startup'` |


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)的支出计入上限。支出可能超过上限,因此请[预留余量](/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"` |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)的服务器跳过等待并在首次使用时连接。在[自托管环境](/docs/zh-CN/self-hosted-environments-configuration#connection-timing)中,则改为适用较短的等待时间。等待需要 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` |

113| `--name`, `-n` | 为会话设置显示名称,显示在 `/resume` 和终端标题中。您可以使用 `claude --resume <name>` 恢复命名会话。在交互式会话中,如果此机器上的另一个活动会话已使用该名称,Claude Code 会改为应用[其变体](/docs/zh-CN/sessions#name-your-sessions)。<br /><br />[`/rename`](/docs/zh-CN/commands) 在会话中途更改名称,并且还会在提示栏上显示它 | `claude -n "my-feature-work"` |113| `--name`, `-n` | 为会话设置显示名称,显示在 `/resume` 和终端标题中。您可以使用 `claude --resume <name>` 恢复命名会话。<br /><br />[`/rename`](/docs/zh-CN/commands) 在会话中途更改名称,并且还会在提示栏上显示它 | `claude -n "my-feature-work"` |

114| `--no-chrome` | 为此会话禁用 [Chrome 浏览器集成](/docs/zh-CN/chrome) | `claude --no-chrome` |114| `--no-chrome` | 为此会话禁用 [Chrome 浏览器集成](/docs/zh-CN/chrome) | `claude --no-chrome` |

115| `--no-session-persistence` | 禁用会话持久性,以便会话不保存到磁盘且无法恢复。仅限 print 模式。[`CLAUDE_CODE_SKIP_PROMPT_HISTORY`](/docs/zh-CN/env-vars) 环境变量在任何模式下执行相同操作 | `claude -p --no-session-persistence "query"` |115| `--no-session-persistence` | 禁用会话持久性,以便会话不保存到磁盘且无法恢复。仅限 print 模式。[`CLAUDE_CODE_SKIP_PROMPT_HISTORY`](/docs/zh-CN/env-vars) 环境变量在任何模式下执行相同操作 | `claude -p --no-session-persistence "query"` |

116| `--output-format` | 为 print 模式指定输出格式(选项:`text`、`json`、`stream-json`) | `claude -p "query" --output-format json` |116| `--output-format` | 为 print 模式指定输出格式(选项:`text`、`json`、`stream-json`) | `claude -p "query" --output-format json` |

Details

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) 下列出的市场的插件 |

315| 您组织的[服务器托管设置](/docs/zh-CN/server-managed-settings) | 是,除了在 [Claude Tag](https://claude.com/docs/claude-tag/overview) 会话中 | 在会话启动时从 Anthropic 的服务器获取。请参阅[使用入口覆盖范围](/docs/zh-CN/model-config#surface-coverage)了解 `availableModels` 在云端会话中如何强制执行。通过 MDM 或托管设置文件部署到您设备的设置不适用,因为会话在 Anthropic 管理的 VM 上运行;在[自托管环境](/docs/zh-CN/self-hosted-environments)中,会话也会读取运行器镜像中的托管设置文件,根据 [Claude Code 如何组合托管来源](/docs/zh-CN/managed-settings#how-claude-code-combines-managed-sources) |315| 您组织的[服务器托管设置](/docs/zh-CN/server-managed-settings) | 是,除了在 [Claude Tag](https://claude.com/docs/claude-tag/overview) 会话中 | 在会话启动时从 Anthropic 的服务器获取。请参阅[使用入口覆盖范围](/docs/zh-CN/model-config#surface-coverage)了解 `availableModels` 在云端会话中如何强制执行。通过 MDM 或托管设置文件部署到您设备的设置不适用,因为会话在 Anthropic 管理的 VM 上运行;在[自托管环境](/docs/zh-CN/self-hosted-environments)中,会话也会读取运行器镜像中的托管设置文件,根据 [Claude Code 如何组合托管来源](/docs/zh-CN/managed-settings#how-claude-code-combines-managed-sources) |

316| 您的用户 `~/.claude/CLAUDE.md` | 否 | 位于您的机器上,不在仓库中。请参阅[添加个人偏好而无需提交到仓库](#add-personal-preferences-without-committing-to-the-repo) |316| 您的用户 `~/.claude/CLAUDE.md` | 否 | 位于您的机器上,不在仓库中。请参阅[添加个人偏好而无需提交到仓库](#add-personal-preferences-without-committing-to-the-repo) |

317| 您的用户 `~/.claude/skills/`、`~/.claude/agents/`、`~/.claude/commands/` | 否 | 位于您的机器上,不在仓库中。请改为将它们提交到仓库的 `.claude/` 目录。云端会话会自动加载您在 claude.ai 上启用的 skill |317| 您的用户 `~/.claude/skills/`、`~/.claude/agents/`、`~/.claude/commands/` | 否 | 位于您的机器上,不在仓库中。请改为将它们提交到仓库的 `.claude/` 目录。云端会话会自动加载[您在 claude.ai 上启用的 skill](/docs/zh-CN/skills#skills-in-cowork-and-cloud-sessions) |

318| 仅在您的用户设置中启用的插件 | 否 | 用户作用域的 `enabledPlugins` 位于您机器上的 `~/.claude/settings.json` |318| 仅在您的用户设置中启用的插件 | 否 | 用户作用域的 `enabledPlugins` 位于您机器上的 `~/.claude/settings.json` |

319| 您使用 `claude mcp add` 在默认本地作用域或用户作用域添加的 MCP 服务器 | 否 | 这些写入您机器上的 `~/.claude.json`,而不是仓库。请使用 `claude mcp add --scope project` 添加服务器,它会写入仓库的 [`.mcp.json`](/docs/zh-CN/mcp#project-scope),并提交该文件。具有一个仓库的会话会加载它 |319| 您使用 `claude mcp add` 在默认本地作用域或用户作用域添加的 MCP 服务器 | 否 | 这些写入您机器上的 `~/.claude.json`,而不是仓库。请使用 `claude mcp add --scope project` 添加服务器,它会写入仓库的 [`.mcp.json`](/docs/zh-CN/mcp#project-scope),并提交该文件。具有一个仓库的会话会加载它 |

320| 您的仓库的 `.claude/settings.json` `env` 块中的传输变量,例如 `NODE_EXTRA_CA_CERTS` 和 [mTLS 客户端证书变量](/docs/zh-CN/network-config#mtls-authentication) | 否 | 托管环境管理会话的 API 连接,因此 Claude Code 忽略这些键,并在会话的调试日志中记录每个被忽略的键 |320| 您的仓库的 `.claude/settings.json` `env` 块中的传输变量,例如 `NODE_EXTRA_CA_CERTS` 和 [mTLS 客户端证书变量](/docs/zh-CN/network-config#mtls-authentication) | 否 | 托管环境管理会话的 API 连接,因此 Claude Code 忽略这些键,并在会话的调试日志中记录每个被忽略的键 |

code-review.md +4 −4

Details

264| 部分 | 显示内容 |264| 部分 | 显示内容 |

265| :- | :- |265| :- | :- |

266| 审查的 PR | 所选时间范围内每日审查的 pull request 计数 |266| 审查的 PR | 所选时间范围内每日审查的 pull request 计数 |

267| 每周成本 | Code Review 的每周支出 |267| Code Review 成本 | 本月迄今为止的 Code Review 支出 |

268| 反馈 | 因开发人员解决问题而自动解决的审查评论计数 |268| 反馈 | 因开发人员解决问题而自动解决的审查评论计数 |

269| 存储库分解 | 每个存储库的审查 PR 计数和已解决评论 |269| 仓库细分 | 每个仓库的审查 PR 计数、已解决评论计数和审查运行次数,以及估算成本和按 PR 查看的视图 |

270 270 

271仪表板成本数字是用于监控活动的估计。对于发票准确的支出,请参考您的 Anthropic 账单。271仅当选择当前月份时,Code Review 成本卡片才会显示金额。分析中的成本数字可能与您的发票不同。仓库细分中的成本按标价估算,未计入任何折扣或抵扣额度,并且仅涵盖 Claude 在 Pull Request 上发布的审查。对于发票准确的支出,请参考您的 Anthropic 账单。

272 272 

273<h2 id="pricing">273<h2 id="pricing">

274 定价274 定价


286 286 

287无论您的组织是否为其他 Claude Code 功能使用 Amazon Bedrock 或 Google Cloud 的 Agent Platform,成本都会出现在您的 Anthropic 账单上。要为 Code Review 设置每月支出上限,请转到 [claude.ai/admin-settings/usage](https://claude.ai/admin-settings/usage) 并为 Claude Code Review 服务配置限制。287无论您的组织是否为其他 Claude Code 功能使用 Amazon Bedrock 或 Google Cloud 的 Agent Platform,成本都会出现在您的 Anthropic 账单上。要为 Code Review 设置每月支出上限,请转到 [claude.ai/admin-settings/usage](https://claude.ai/admin-settings/usage) 并为 Claude Code Review 服务配置限制。

288 288 

289通过[分析](#view-usage)中的每周成本图表或管理员设置中的每个存储库平均成本列监控支出。289要监控支出,请使用[分析仪表板](#view-usage)。

290 290 

291<h2 id="troubleshooting">291<h2 id="troubleshooting">

292 故障排除292 故障排除

commands.md +2 −2

Details

77| `/compact [instructions]` | 通过总结到目前为止的对话来释放上下文。可选择传递摘要的重点指令。请参阅[压缩如何处理规则、skill 和记忆文件](/docs/zh-CN/context-window#what-survives-compaction) |77| `/compact [instructions]` | 通过总结到目前为止的对话来释放上下文。可选择传递摘要的重点指令。请参阅[压缩如何处理规则、skill 和记忆文件](/docs/zh-CN/context-window#what-survives-compaction) |

78| `/config [key=value ...]` | 打开[设置](/docs/zh-CN/settings)界面,以调整主题、模型、[输出样式](/docs/zh-CN/output-styles)和其他偏好。传递一个或多个 `key=value` 对可直接设置某项设置而无需打开界面,例如 `/config thinking=false`、`/config theme=dark` 或 `/config model=sonnet`。`key=value` 形式也适用于非交互模式(`-p`),以及通过 [Remote Control](/docs/zh-CN/remote-control) 从 Claude 移动应用使用。`key=value` 形式无法开启需要您在面板中确认的设置,例如 [`autoContinueAtUsageLimit`](/docs/zh-CN/interactive-mode#turn-automatic-continue-off),但可以将其关闭。运行 `/config --help` 可列出其接受的键。别名:`/settings` |78| `/config [key=value ...]` | 打开[设置](/docs/zh-CN/settings)界面,以调整主题、模型、[输出样式](/docs/zh-CN/output-styles)和其他偏好。传递一个或多个 `key=value` 对可直接设置某项设置而无需打开界面,例如 `/config thinking=false`、`/config theme=dark` 或 `/config model=sonnet`。`key=value` 形式也适用于非交互模式(`-p`),以及通过 [Remote Control](/docs/zh-CN/remote-control) 从 Claude 移动应用使用。`key=value` 形式无法开启需要您在面板中确认的设置,例如 [`autoContinueAtUsageLimit`](/docs/zh-CN/interactive-mode#turn-automatic-continue-off),但可以将其关闭。运行 `/config --help` 可列出其接受的键。别名:`/settings` |

79| `/context [all]` | 以彩色网格形式可视化当前上下文使用情况。显示针对占用大量上下文的工具、记忆膨胀的优化建议以及容量警告。当对话超出上下文窗口时,输出会包含一条[警告](/docs/zh-CN/errors#context-exceeds-the-token-limit),显示超出限制多少以及哪个命令可以释放空间。在[全屏模式](/docs/zh-CN/fullscreen)下,`/context` 会折叠逐项明细以保持网格可见。传递 `all` 可将其展开 |79| `/context [all]` | 以彩色网格形式可视化当前上下文使用情况。显示针对占用大量上下文的工具、记忆膨胀的优化建议以及容量警告。当对话超出上下文窗口时,输出会包含一条[警告](/docs/zh-CN/errors#context-exceeds-the-token-limit),显示超出限制多少以及哪个命令可以释放空间。在[全屏模式](/docs/zh-CN/fullscreen)下,`/context` 会折叠逐项明细以保持网格可见。传递 `all` 可将其展开 |

80| `/copy [N]` | 将最后一条助手回复复制到剪贴板。传递数字 `N` 可复制倒数第 N 条回复:`/copy 2` 复制倒数第二条。当存在代码块时,会显示交互式选择器,以选择单个代码块或完整回复。在选择器中按 `w` 可将所选内容写入文件而不是剪贴板,这在通过 SSH 使用时很有用 |80| `/copy [N]` | 将最后一条助手回复复制到剪贴板。传递数字 `N` 可复制倒数第 N 条回复:`/copy 2` 复制倒数第二条。当存在代码块或引用块时,会显示交互式选择器,以选择单个块或完整回复。在选择器中按 `w` 可将所选内容写入文件而不是剪贴板,这在通过 SSH 使用时很有用 |

81| `/cost` | `/usage` 的别名 |81| `/cost` | `/usage` 的别名 |

82| `/dataviz [request]` | **[Skill](/docs/zh-CN/skills#bundled-skills)。** 图表、图形和仪表板的设计指导。Claude 会为数据选择图表形式,按角色分配颜色,使用随附脚本验证调色板的色盲安全性和对比度,并应用标记、交互和无障碍规则。使用品牌中立的占位调色板,供您替换为自己的调色板 |82| `/dataviz [request]` | **[Skill](/docs/zh-CN/skills#bundled-skills)。** 图表、图形和仪表板的设计指导。Claude 会为数据选择图表形式,按角色分配颜色,使用随附脚本验证调色板的色盲安全性和对比度,并应用标记、交互和无障碍规则。使用品牌中立的占位调色板,供您替换为自己的调色板 |

83| `/debug [description]` | **[Skill](/docs/zh-CN/skills#bundled-skills)。** 为当前会话启用调试日志记录,并通过读取会话调试日志来排除问题。除非您使用 `claude --debug` 启动,否则调试日志记录默认关闭,因此在会话中途运行 `/debug` 会从该时刻开始捕获日志。可选择描述问题以聚焦分析 |83| `/debug [description]` | **[Skill](/docs/zh-CN/skills#bundled-skills)。** 为当前会话启用调试日志记录,并通过读取会话调试日志来排除问题。除非您使用 `claude --debug` 启动,否则调试日志记录默认关闭,因此在会话中途运行 `/debug` 会从该时刻开始捕获日志。可选择描述问题以聚焦分析 |


132| `/reload-skills` | 重新扫描 [skill](/docs/zh-CN/skills) 和命令目录,使会话期间在磁盘上添加或更改的 skill 无需重启即可使用。报告可用的 skill 数量以及添加或移除的数量 |132| `/reload-skills` | 重新扫描 [skill](/docs/zh-CN/skills) 和命令目录,使会话期间在磁盘上添加或更改的 skill 无需重启即可使用。报告可用的 skill 数量以及添加或移除的数量 |

133| `/remote-control` | 使此会话可通过 claude.ai 进行 [Remote Control](/docs/zh-CN/remote-control)。在未登录时运行,会输出 Remote Control 需要 claude.ai 订阅的提示,并告诉您如何登录;在 v2.1.206 之前,它会报告 `Unknown command: /remote-control`。别名:`/rc` |133| `/remote-control` | 使此会话可通过 claude.ai 进行 [Remote Control](/docs/zh-CN/remote-control)。在未登录时运行,会输出 Remote Control 需要 claude.ai 订阅的提示,并告诉您如何登录;在 v2.1.206 之前,它会报告 `Unknown command: /remote-control`。别名:`/rc` |

134| `/remote-env` | 为您从 CLI 启动的云端会话选择默认[云环境](/docs/zh-CN/cloud-environments#select-an-environment-from-the-cli) |134| `/remote-env` | 为您从 CLI 启动的云端会话选择默认[云环境](/docs/zh-CN/cloud-environments#select-an-environment-from-the-cli) |

135| `/rename [name]` | 重命名当前会话并在提示栏上显示名称。不提供名称时,根据对话历史自动生成一个名称。也可在非交互模式(`-p`)中使用;需要 Claude Code v2.1.205 或更高版本。在所有重命名入口(包括 claude.ai 和桌面应用)中,Claude Code 都会将新名称中的控制字符和不可见字符替换为空格,并将名称长度上限设为 200 个字符。如果移除不可见字符后名称为空,Claude Code 会拒绝该名称并显示 `That name is empty once invisible characters are removed. Usage: /rename <name>`。字符替换和长度上限需要 Claude Code v2.1.221 或更高版本。如果此计算机上另一个活动会话已使用您传递的名称,Claude Code 会改为应用[该名称的变体](/docs/zh-CN/sessions#name-your-sessions) |135| `/rename [name]` | 重命名当前会话并在提示栏上显示名称。不提供名称时,根据对话历史自动生成一个名称。也可在非交互模式(`-p`)中使用;需要 Claude Code v2.1.205 或更高版本。在所有重命名入口(包括 claude.ai 和桌面应用)中,Claude Code 都会将新名称中的控制字符和不可见字符替换为空格,并将名称长度上限设为 200 个字符。如果移除不可见字符后名称为空,Claude Code 会拒绝该名称并显示 `That name is empty once invisible characters are removed. Usage: /rename <name>`。字符替换和长度上限需要 Claude Code v2.1.221 或更高版本 |

136| `/resume [session]` | 通过 ID 或名称恢复对话,或打开会话选择器。[后台会话](/docs/zh-CN/agent-view)在选择器中以 `bg` 标记显示。恢复仍在运行的后台会话时(无论是从选择器还是通过 ID 或名称),会[打开该会话](/docs/zh-CN/sessions#resume-a-running-background-session):您当前的对话会移到后台,此终端会附加到正在运行的会话。在空输入框中按 `←` 可返回 Agent 视图,其中也会列出您离开的对话。在 v2.1.285 之前,Claude Code 会拒绝并告诉您使用 `claude attach` 打开该会话,或先停止它。别名:`/continue` |136| `/resume [session]` | 通过 ID 或名称恢复对话,或打开会话选择器。[后台会话](/docs/zh-CN/agent-view)在选择器中以 `bg` 标记显示。恢复仍在运行的后台会话时(无论是从选择器还是通过 ID 或名称),会[打开该会话](/docs/zh-CN/sessions#resume-a-running-background-session):您当前的对话会移到后台,此终端会附加到正在运行的会话。在空输入框中按 `←` 可返回 Agent 视图,其中也会列出您离开的对话。在 v2.1.285 之前,Claude Code 会拒绝并告诉您使用 `claude attach` 打开该会话,或先停止它。别名:`/continue` |

137| `/review [low\|medium\|high\|xhigh\|max\|ultra] [--fix] [--comment] [--max-findings n\|all\|default] [pr#\|branch\|path]` | [`/code-review`](/docs/zh-CN/code-review#review-a-diff-locally) 的别名:审查当前 diff,或您传递的 PR 编号、分支或路径(例如 `/review 1234`),并接受相同的 effort 级别和标志。未指定级别时,审查会沿用您上次输入的 `low` 到 `max` 级别;有关确切规则,请参阅[在本地审查 diff](/docs/zh-CN/code-review#review-a-diff-locally)。要进行深度云端审查,请使用 [`/code-review ultra`](/docs/zh-CN/ultrareview)。在 v2.1.223 之前,`/review` 是一个单独的命令,按编号对 GitHub Pull Request 运行单次只读审查,不带参数运行时会列出打开的 PR 供选择;从 v2.1.186 到 v2.1.201,它运行与 `/code-review medium` 相同的多 Agent 引擎 |137| `/review [low\|medium\|high\|xhigh\|max\|ultra] [--fix] [--comment] [--max-findings n\|all\|default] [pr#\|branch\|path]` | [`/code-review`](/docs/zh-CN/code-review#review-a-diff-locally) 的别名:审查当前 diff,或您传递的 PR 编号、分支或路径(例如 `/review 1234`),并接受相同的 effort 级别和标志。未指定级别时,审查会沿用您上次输入的 `low` 到 `max` 级别;有关确切规则,请参阅[在本地审查 diff](/docs/zh-CN/code-review#review-a-diff-locally)。要进行深度云端审查,请使用 [`/code-review ultra`](/docs/zh-CN/ultrareview)。在 v2.1.223 之前,`/review` 是一个单独的命令,按编号对 GitHub Pull Request 运行单次只读审查,不带参数运行时会列出打开的 PR 供选择;从 v2.1.186 到 v2.1.201,它运行与 `/code-review medium` 相同的多 Agent 引擎 |

138| `/rewind` | 将对话和/或代码回退到之前的某个时间点,或从选定的消息开始总结。请参阅[检查点功能](/docs/zh-CN/checkpointing)。别名:`/checkpoint`、`/undo` |138| `/rewind` | 将对话和/或代码回退到之前的某个时间点,或从选定的消息开始总结。请参阅[检查点功能](/docs/zh-CN/checkpointing)。别名:`/checkpoint`、`/undo` |

Details

8 8 

9某些组织要求工作站上的每个进程都通过强制启动器启动。启动器应用沙箱、网络控制或凭证注入,这些是公司安全态势所依赖的,而不通过它启动的二进制文件是策略违规。9某些组织要求工作站上的每个进程都通过强制启动器启动。启动器应用沙箱、网络控制或凭证注入,这些是公司安全态势所依赖的,而不通过它启动的二进制文件是策略违规。

10 10 

11`CLAUDE_CODE_PROCESS_WRAPPER` 通过您的启动器启动 Claude Code 从其自身二进制文件启动的每个进程:后台服务、它在 [agent view](/docs/zh-CN/agent-view) 中托管的每个会话,以及 Claude Code 在更新后的重新启动。将其设置为启动器的绝对路径,Claude Code 将使用 Claude Code 命令作为其参数运行启动器。11`CLAUDE_CODE_PROCESS_WRAPPER` 通过您的启动器启动 Claude Code 从其自身二进制文件启动的每个进程:[后台服务](/docs/zh-CN/agent-view#the-supervisor-process)、它在 [agent view](/docs/zh-CN/agent-view) 中托管的每个会话,以及 Claude Code 在更新后的重新启动。将其设置为启动器的绝对路径,Claude Code 将使用 Claude Code 命令作为其参数运行启动器。

12 12 

13在您的 `PATH` 上包装 `claude` 命令的启动器无法到达这些进程,因为它们从二进制文件的直接路径启动,不查询 `claude`。13在您的 `PATH` 上包装 `claude` 命令的启动器无法到达这些进程,因为它们从二进制文件的直接路径启动,不查询 `claude`。

14 14 


39 39 

40以下进程不通过启动器启动:40以下进程不通过启动器启动:

41 41 

42* [已安装的后台服务](/docs/zh-CN/agent-view#the-supervisor-process),其单元在配置启动器之前编写:`launchd` 或 `systemd` 从其单元文件启动该进程。当运行的服务和配置的启动器不匹配时,`/status` 和 `claude daemon status` 会发出警告,一旦服务使用设置中的变量重新启动,服务生成的会话仍会通过启动器启动。

43* 您自己在终端中启动的会话,它运行的方式取决于您如何调用它。要覆盖这些会话,在 `PATH` 上较早的目录中放置一个名为 `claude` 的脚本,该脚本使用真实二进制文件运行您的启动器;不要替换托管符号链接。后台服务及其会话启动时不进行 `PATH` 查询,所以两个启动器不会在那里堆叠。42* 您自己在终端中启动的会话,它运行的方式取决于您如何调用它。要覆盖这些会话,在 `PATH` 上较早的目录中放置一个名为 `claude` 的脚本,该脚本使用真实二进制文件运行您的启动器;不要替换托管符号链接。后台服务及其会话启动时不进行 `PATH` 查询,所以两个启动器不会在那里堆叠。

44* `claude-cli://` 深层链接的第一个进程,操作系统的协议处理程序直接启动。该会话之后在后台启动的所有内容都通过启动器运行。要完全关闭此路径,请使用 `disableDeepLinkRegistration` 设置 [prevent handler registration](/docs/zh-CN/deep-links#registration-and-supported-platforms)。43* `claude-cli://` 深层链接的第一个进程,操作系统的协议处理程序直接启动。该会话之后在后台启动的所有内容都通过启动器运行。要完全关闭此路径,请使用 `disableDeepLinkRegistration` 设置 [prevent handler registration](/docs/zh-CN/deep-links#registration-and-supported-platforms)。

45* `--worktree` 与 `--tmux` 结合执行的重新启动:终端多路复用器启动该窗格,而不是 Claude Code 的二进制文件。44* `--worktree` 与 `--tmux` 结合执行的重新启动:终端多路复用器启动该窗格,而不是 Claude Code 的二进制文件。


100 99 

101 因为 `processWrapper` 是一个命名设置,通过 [远程托管设置](/docs/zh-CN/managed-settings#delivery-mechanisms) 提供它的组织会在 [安全批准对话框](/docs/zh-CN/server-managed-settings#security-approval-dialogs) 上看到它与运行管理员提供的可执行文件的其他设置一起列出。100 因为 `processWrapper` 是一个命名设置,通过 [远程托管设置](/docs/zh-CN/managed-settings#delivery-mechanisms) 提供它的组织会在 [安全批准对话框](/docs/zh-CN/server-managed-settings#security-approval-dialogs) 上看到它与运行管理员提供的可执行文件的其他设置一起列出。

102 101 

103 项目和本地设置无法配置启动器。提交到存储库的文件不能在机器上的每个 Claude Code 进程前放置二进制文件,因此 Claude Code 在 `.claude/settings.json` 或 `.claude/settings.local.json` 中忽略 `CLAUDE_CODE_PROCESS_WRAPPER`,并在 [调试日志](/docs/zh-CN/troubleshooting) 中发出警告,并且从不从这些文件中读取 `processWrapper` 键。102 项目和本地设置无法配置启动器。提交到仓库的文件不能在机器上的每个 Claude Code 进程前放置二进制文件,因此 Claude Code 在 `.claude/settings.json` 或 `.claude/settings.local.json` 中忽略 `CLAUDE_CODE_PROCESS_WRAPPER`,并在 [调试日志](/docs/zh-CN/troubleshooting) 中发出警告,并且从不从这些文件中读取 `processWrapper` 键。

104 </Step>103 </Step>

105 104 

106 <Step title="重新启动后台服务和您的会话">105 <Step title="重新启动后台服务和您的会话">

107 运行的后台服务和任何打开的 `claude` 会话在启动时读取变量一次,因此它们继续启动未包装的进程,直到重新启动。运行 `claude daemon stop --any` 停止按需服务;下一个需要它的命令(例如 `claude agents`)启动一个包装的。[已安装的服务](/docs/zh-CN/agent-view#the-supervisor-process) 采用 `claude daemon stop` 不带 `--any`。然后重新启动您打开的 `claude` 会话。106 运行的后台服务和任何打开的 `claude` 会话在启动时读取变量一次,因此它们继续启动未包装的进程,直到重新启动。运行 `claude daemon stop --any` 停止按需服务。下一个需要它的命令(例如 `claude agents`)会启动一个包装的服务。然后重新启动您打开的 `claude` 会话。

108 107 

109 在您无法手动重新启动的机器上,设置推送后启动的第一个会话自动停用剩余的未包装按需服务。没有新会话启动的机器保持其未包装的服务,直到启动一个,已安装的服务始终需要此步骤中的重新启动。108 在您无法手动重新启动的机器上,设置推送后启动的第一个会话会自动停用剩余的未包装按需服务。没有新会话启动的机器会保持其未包装的后台服务,直到有新会话启动。

110 </Step>109 </Step>

111 110 

112 <Step title="验证">111 <Step title="验证">

Details

46要自己命名目标,在你的提示中提及会话:输入 `@` 后跟会话名称的首字母,然后从类型提示中选择会话,方式与 [@-提及子代理](/docs/zh-CN/sub-agents#invoke-subagents-explicitly) 相同。需要 Claude Code v2.1.232 或更高版本。Claude Code 会插入提及,例如 `@api-worker`,并告诉 Claude 它命名的是哪个会话,这样 Claude 可以向该会话发送消息而无需先列出你的会话。这个提示用提及命名目标:46要自己命名目标,在你的提示中提及会话:输入 `@` 后跟会话名称的首字母,然后从类型提示中选择会话,方式与 [@-提及子代理](/docs/zh-CN/sub-agents#invoke-subagents-explicitly) 相同。需要 Claude Code v2.1.232 或更高版本。Claude Code 会插入提及,例如 `@api-worker`,并告诉 Claude 它命名的是哪个会话,这样 Claude 可以向该会话发送消息而无需先列出你的会话。这个提示用提及命名目标:

47 47 

48```text wrap theme={null}48```text wrap theme={null}

49让 @api-worker 知道架构迁移已完成49让 @api-worker 知道 schema 迁移已完成

50```50```

51 51 

52类型提示列出你在这台机器上的其他活跃会话。两种情况需要超过名称的首字母:52类型提示列出你在这台机器上的其他活跃会话。两种情况需要超过名称的首字母:


142 142 

143会话响应你用 [`/rename`](/docs/zh-CN/commands) 命令或 [`--name`](/docs/zh-CN/cli-reference#cli-flags) 标志设置的名称。当你不设置一个时,Claude Code 自己命名会话。对于交互式会话,这是在 [运行会话的列表](/docs/zh-CN/sessions#name-your-sessions) 中显示的名称。143会话响应你用 [`/rename`](/docs/zh-CN/commands) 命令或 [`--name`](/docs/zh-CN/cli-reference#cli-flags) 标志设置的名称。当你不设置一个时,Claude Code 自己命名会话。对于交互式会话,这是在 [运行会话的列表](/docs/zh-CN/sessions#name-your-sessions) 中显示的名称。

144 144 

145当你重命名会话,或用另一个活跃会话在这台机器上已经使用的名称启动或恢复交互式会话时,Claude Code 将名称留给已经拥有它的会话,并 [将你的重命名为变体](/docs/zh-CN/sessions#name-your-sessions)。会话仍然可以共享名称,例如当其中一个运行早期版本的 Claude Code 或共享名称是 Claude Code 生成的名称时。除非此会话连接到远程控制,Claude Code 在 `/list-agents` 输出中显示每个本地会话的工作目录,所以当它们在不同目录中运行时,你可以区分同名会话。Claude 根据有多少活跃会话响应该名称,以两种方式之一寻址消息:145除非此会话连接到 Remote Control,否则 Claude Code 会在 `/list-agents` 输出中显示每个本地会话的工作目录,以便您在同名会话运行于不同目录时区分它们。Claude 会根据有多少活跃会话对应该名称,以以下两种方式之一指定消息地址:

146 146 

147* **一个会话响应该名称**:Claude Code 仅在名称上传递消息。147* **一个会话响应该名称**:Claude Code 仅在名称上传递消息。

148* **多个会话共享该名称,或 Claude Code 无法检查你的会话运行的所有地方**:Claude 为其列表的每一行添加一个短标识符,并在地址中使用该标识符。148* **多个会话共享该名称,或 Claude Code 无法检查你的会话运行的所有地方**:Claude 为其列表的每一行添加一个短标识符,并在地址中使用该标识符。

desktop.md +30 −4

Details

400 400 

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

402 402 

403Worktree 默认存储在 `<project-root>/.claude/worktrees/` 中。您可以在设置 → Claude Code 中的"Worktree location"下将其更改为自定义目录。您还可以设置一个分支前缀,该前缀会添加到每个 worktree 分支名称的前面,这有助于让 Claude 创建的分支保持条理。完成后要删除 worktree,请将鼠标悬停在侧边栏中的会话上并点击存档图标。要让会话在其 Pull Request 合并或关闭时自动存档,请在设置 → Claude Code 中打开 **Auto-archive after PR merge or close**。自动存档仅适用于已完成运行的本地会话。403Worktree 默认存储在 `<project-root>/.claude/worktrees/` 中。您可以将其更改为自定义目录:

404 404 

405要在新 worktree 中包含被 gitignore 的文件(如 `.env`),请在项目根目录中创建一个 [`.worktreeinclude` 文件](/docs/zh-CN/worktrees#copy-gitignored-files-into-worktrees)。405* **本地会话**:在 **Settings > Claude Code** 中设置 **Worktree location**

406* **SSH 会话**:在 [SSH 连接](#choose-where-ssh-session-worktrees-go)上设置 **Worktree folder**

407 

408您还可以在 **Settings > Claude Code** 中设置 **Branch prefix**。Desktop 会将其添加到每个 worktree 分支名称的前面,这有助于让 Claude 创建的分支保持条理。

409 

410完成后要删除 worktree,请将鼠标悬停在侧边栏中的会话上并点击存档图标。要让会话在其 Pull Request 合并或关闭时自动存档,请在 **Settings > Claude Code** 中打开 **Auto-archive after PR merge or close**。自动存档仅适用于已完成运行的本地会话。

411 

412要在新 worktree 中包含被 gitignore 的文件(如 `.env`),请在项目根目录中创建一个 [`.worktreeinclude` 文件](/docs/zh-CN/worktrees#copy-gitignored-files-into-worktrees)。有关 worktree 会话从何处读取项目设置、hook 和 skill,请参阅 [worktree 与主检出共享的内容](/docs/zh-CN/worktrees#what-worktrees-share-with-the-main-checkout)。

406 413 

407<Note>414<Note>

408 会话隔离需要 [Git](https://git-scm.com/downloads)。大多数 Mac 默认已包含 Git。在终端中运行 `git --version` 进行检查;如果输出了版本号,则说明 Git 已安装。如果遇到 Git 错误,请在 [Cowork 选项卡](https://claude.com/product/cowork)中请 Claude 帮助排查您的设置。415 会话隔离需要 [Git](https://git-scm.com/downloads)。大多数 Mac 默认已包含 Git。在终端中运行 `git --version` 进行检查;如果输出了版本号,则说明 Git 已安装。如果遇到 Git 错误,请在 [Cowork 选项卡](https://claude.com/product/cowork)中请 Claude 帮助排查您的设置。


811* **SSH host**:`user@hostname` 或在 `~/.ssh/config` 中定义的主机818* **SSH host**:`user@hostname` 或在 `~/.ssh/config` 中定义的主机

812* **SSH port**:如果留空,则默认为 22,或使用您 SSH 配置中的端口819* **SSH port**:如果留空,则默认为 22,或使用您 SSH 配置中的端口

813* **SSH key (optional)**:您的私钥路径,例如 `~/.ssh/id_ed25519`。留空则使用您的 SSH 配置或 SSH agent。820* **SSH key (optional)**:您的私钥路径,例如 `~/.ssh/id_ed25519`。留空则使用您的 SSH 配置或 SSH agent。

821* **Worktree folder**:远程机器上的一个文件夹,例如 `~/worktrees`,新会话会在其中创建 worktree。留空则使用[远程机器的默认设置](#choose-where-ssh-session-worktrees-go)。

814 822 

815添加后,该连接会出现在环境下拉菜单的 **SSH** 下。选择它即可在该机器上启动会话。Claude 在远程机器上运行,可以访问其文件和工具。823添加后,该连接会出现在环境下拉菜单的 **SSH** 下。选择它即可在该机器上启动会话。Claude 在远程机器上运行,可以访问其文件和工具。

816 824 

817远程机器必须运行 Linux 或 macOS。Desktop 在你第一次连接时会自动在远程机器上安装 Claude Code。连接后,SSH 会话支持权限模式、connectors、plugins 和 MCP servers。825远程机器必须运行 Linux 或 macOS。Desktop 在你第一次连接时会自动在远程机器上安装 Claude Code。连接后,SSH 会话支持权限模式、connectors、plugins 和 MCP servers。

818 826 

827<h4 id="choose-where-ssh-session-worktrees-go">

828 选择 SSH 会话 worktree 的位置

829</h4>

830 

831除非您的组织限制了会话可以使用的文件夹,否则新的 SSH 会话会在以下各项中第一个已设置的位置创建其 [worktree](#work-in-parallel-with-sessions):

832 

8331. SSH 连接上的 **Worktree folder**

8342. 远程机器上 `~/.claude/settings.json` 中的 [`worktree.location`](/docs/zh-CN/settings-reference#worktree-location)

8353. `<project-root>/.claude/worktrees/`,即默认位置

836 

837每个项目在您设置的文件夹中都有自己的子文件夹,因此使用 `~/worktrees` 时,worktree 的路径为 `~/worktrees/<project>-<id>/<worktree-name>`。如果您设置的文件夹位于项目内部,Desktop 会对该项目忽略它并使用默认位置。

838 

839要为您之前添加的连接或由您的组织管理的连接设置 **Worktree folder**,请在环境下拉菜单中将鼠标悬停在该连接上,然后点击齿轮图标。

840 

841该字段需要 Claude Desktop v1.44121.0 或更高版本。如果您的组织限制了会话可以使用的文件夹,Desktop 会隐藏该字段,并将 worktree 保留在项目内部。

842 

819<h4 id="open-an-ssh-session-from-a-link">843<h4 id="open-an-ssh-session-from-a-link">

820 通过链接打开 SSH 会话844 通过链接打开 SSH 会话

821</h4>845</h4>


869 为你的团队预配置 SSH 连接893 为你的团队预配置 SSH 连接

870</h4>894</h4>

871 895 

872管理员可以通过在[托管设置](/docs/zh-CN/managed-settings)中设置 `sshConfigs` 来向团队成员分发 SSH 连接。以这种方式定义的连接会自动出现在每个用户的环境下拉菜单中,并显示为托管的,因此用户可以选择它们,但不能在应用中编辑或删除它们。896管理员可以通过在[托管设置](/docs/zh-CN/managed-settings)中设置 `sshConfigs` 来向团队成员分发 SSH 连接。以这种方式定义的连接会自动出现在每个用户的环境下拉菜单中,并显示为托管的。用户可以选择它们并为其[设置自己的 **Worktree folder**](#choose-where-ssh-session-worktrees-go),但不能在应用中编辑其他任何内容或删除它们。

873 897 

874以下示例预配置了一个单个连接:898以下示例预配置了一个单个连接:

875 899 


935 Cowork 下的 OpenTelemetry 表单位于管理员控制台的[数据和隐私设置](https://claude.ai/admin-settings/data-privacy-controls)中的**监控**下,仅适用于 Cowork 会话。在此机器上的 Cowork 会话中,桌面应用将该收集器作为 `OTEL_*` 环境变量传递给 Claude Code,因此该表单生效,尽管该会话中的 Claude Code [从不获取管理员控制台设置](#managed-settings)。959 Cowork 下的 OpenTelemetry 表单位于管理员控制台的[数据和隐私设置](https://claude.ai/admin-settings/data-privacy-controls)中的**监控**下,仅适用于 Cowork 会话。在此机器上的 Cowork 会话中,桌面应用将该收集器作为 `OTEL_*` 环境变量传递给 Claude Code,因此该表单生效,尽管该会话中的 Claude Code [从不获取管理员控制台设置](#managed-settings)。

936 960 

937 要从 Code 选项卡会话导出遥测,请在 Claude Code 托管设置的 `env` 块中设置 `CLAUDE_CODE_ENABLE_TELEMETRY` 和 `OTEL_*` 变量,如[监控的管理员配置](/docs/zh-CN/monitoring-usage#administrator-configuration)中所示。本地、云端和 SSH 会话各自[从不同来源读取托管设置](#managed-settings)。有关云端会话可以到达的主机,请参阅[网络访问](/docs/zh-CN/cloud-environments#network-access)。有关 Code 选项卡会话报告的 `service.name`,请参阅[服务信息](/docs/zh-CN/monitoring-usage#service-information)。961 要从 Code 选项卡会话导出遥测,请在 Claude Code 托管设置的 `env` 块中设置 `CLAUDE_CODE_ENABLE_TELEMETRY` 和 `OTEL_*` 变量,如[监控的管理员配置](/docs/zh-CN/monitoring-usage#administrator-configuration)中所示。本地、云端和 SSH 会话各自[从不同来源读取托管设置](#managed-settings)。有关云端会话可以到达的主机,请参阅[网络访问](/docs/zh-CN/cloud-environments#network-access)。有关 Code 选项卡会话报告的 `service.name`,请参阅[服务信息](/docs/zh-CN/monitoring-usage#service-information)。

962 

963 要了解 SSH 会话在哪台远程机器上运行,请参阅[将遥测归因于 Desktop SSH 会话](/docs/zh-CN/monitoring-usage#attribute-telemetry-to-desktop-ssh-sessions)。

938</Note>964</Note>

939 965 

940<h3 id="managed-settings">966<h3 id="managed-settings">


951| `browserExternalPageTools` | 设置为 `"disabled"` 以防止 Claude 使用工具在[浏览器窗格](#browse-external-sites)中读取或作用于外部页面。用户仍然可以自己导航到外部网站,本地开发服务器预览不受影响。 |977| `browserExternalPageTools` | 设置为 `"disabled"` 以防止 Claude 使用工具在[浏览器窗格](#browse-external-sites)中读取或作用于外部页面。用户仍然可以自己导航到外部网站,本地开发服务器预览不受影响。 |

952| `disableMobileSimulatorTools` | 设置为 `true` 以阻止 Claude 在 [iOS Simulator 窗格](/docs/zh-CN/desktop-ios-simulator#turn-off-simulator-access)中控制和捕获设备的工具。该窗格仍可用于用户自己的点击;仅删除 Claude 的访问权限。该值必须是 JSON 布尔值 `true`;字符串 `"true"` 被忽略。 |978| `disableMobileSimulatorTools` | 设置为 `true` 以阻止 Claude 在 [iOS Simulator 窗格](/docs/zh-CN/desktop-ios-simulator#turn-off-simulator-access)中控制和捕获设备的工具。该窗格仍可用于用户自己的点击;仅删除 Claude 的访问权限。该值必须是 JSON 布尔值 `true`;字符串 `"true"` 被忽略。 |

953| `disableBrowserExternalNavigation` | 设置为 `true` 以完全关闭[浏览器窗格](#browse-external-sites)中的外部浏览。用户和 Claude 都无法导航到外部网站,localhost 开发服务器预览不受影响。该值必须是 JSON 布尔值 `true`;字符串 `"true"` 被忽略。 |979| `disableBrowserExternalNavigation` | 设置为 `true` 以完全关闭[浏览器窗格](#browse-external-sites)中的外部浏览。用户和 Claude 都无法导航到外部网站,localhost 开发服务器预览不受影响。该值必须是 JSON 布尔值 `true`;字符串 `"true"` 被忽略。 |

954| `sshConfigs` | 预配置[SSH 连接](#pre-configure-ssh-connections-for-your-team),在环境下拉菜单中显示。用户无法编辑或删除托管连接。 |980| `sshConfigs` | 预配置[SSH 连接](#pre-configure-ssh-connections-for-your-team),在环境下拉菜单中显示。用户无法删除托管连接,也无法编辑除其自己的 **Worktree folder** 之外的任何内容。 |

955| `sshHostAllowlist` | 限制 [SSH 会话](#restrict-which-ssh-hosts-users-can-connect-to)连接到已解析主机名与这些模式之一匹配的主机。仅从托管设置中读取。 |981| `sshHostAllowlist` | 限制 [SSH 会话](#restrict-which-ssh-hosts-users-can-connect-to)连接到已解析主机名与这些模式之一匹配的主机。仅从托管设置中读取。 |

956| `disableDesktopLocalSessions` | 设置为 `true` 以关闭[在设备上运行的 Code 会话](#local-sessions-on-managed-devices),仅保留到其他主机的 SSH 会话和云端会话可用。该值必须是 JSON 布尔值 `true`。仅从托管设置中读取。需要 Claude Desktop v1.37937.0 或更高版本。 |982| `disableDesktopLocalSessions` | 设置为 `true` 以关闭[在设备上运行的 Code 会话](#local-sessions-on-managed-devices),仅保留到其他主机的 SSH 会话和云端会话可用。该值必须是 JSON 布尔值 `true`。仅从托管设置中读取。需要 Claude Desktop v1.37937.0 或更高版本。 |

957| `disableSshSavedPasswords` | 设置为 `true` 以阻止 Desktop 提供记住 SSH 密码的选项,并阻止其使用或显示之前保存的密码。启用此设置不会删除这些密码。仅从托管设置中读取。需要 Claude Desktop v1.49585.0 或更高版本。 |983| `disableSshSavedPasswords` | 设置为 `true` 以阻止 Desktop 提供记住 SSH 密码的选项,并阻止其使用或显示之前保存的密码。启用此设置不会删除这些密码。仅从托管设置中读取。需要 Claude Desktop v1.49585.0 或更高版本。 |

env-vars.md +5 −5

Details

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

211| `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)所述 |211| `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)所述 |

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

213| `CLAUDE_AUTO_BACKGROUND_TASKS` | 设置为 `1` 可强制启用长时间运行的 Agent 任务的自动后台化。启用后,子代理在运行约两分钟后会被移至后台。在 Claude Code v2.1.212 或更高版本上,还会在非交互模式下启用[长时间 MCP 工具调用的自动后台化](/docs/zh-CN/mcp#automatic-backgrounding-of-long-tool-calls) |213| `CLAUDE_AUTO_BACKGROUND_TASKS` | 设置为 `1` 可强制启用长时间运行的 Agent 任务的自动后台化。启用后,[子代理](/docs/zh-CN/sub-agents#run-subagents-in-foreground-or-background)在运行约两分钟后会转入后台。如果 Claude 在该子代理之后排队了文件编辑等工具调用,该子代理会先在前台完成,然后该调用才开始。在 Claude Code v2.1.212 或更高版本上,还会在非交互模式下启用[长时间 MCP 工具调用的自动后台化](/docs/zh-CN/mcp#automatic-backgrounding-of-long-tool-calls) |

214| `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 或更高版本 |214| `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 或更高版本 |

215| `CLAUDE_AX_SCREEN_READER` | 设置为 `1` 可渲染适合屏幕阅读器的输出:不带装饰性边框或动画的纯文本。设置为 `0` 可强制关闭屏幕阅读器模式,即使 [`axScreenReader`](/docs/zh-CN/settings-reference#axscreenreader) 为 `true`。[`--ax-screen-reader`](/docs/zh-CN/cli-reference#cli-flags) 标志优先。需要 Claude Code v2.1.181 或更高版本 |215| `CLAUDE_AX_SCREEN_READER` | 设置为 `1` 可渲染适合屏幕阅读器的输出:不带装饰性边框或动画的纯文本。设置为 `0` 可强制关闭屏幕阅读器模式,即使 [`axScreenReader`](/docs/zh-CN/settings-reference#axscreenreader) 为 `true`。[`--ax-screen-reader`](/docs/zh-CN/cli-reference#cli-flags) 标志优先。需要 Claude Code v2.1.181 或更高版本 |

216| `CLAUDE_AX_STARTUP_QUIET_MS` | 在[屏幕阅读器模式](/docs/zh-CN/accessibility)下,Claude Code 在启动确认行之后暂缓首次界面渲染的毫秒数,以便您的屏幕阅读器在新输出打断之前完整朗读该行。默认 `3000`。设置 `0` 可立即渲染。Claude Code 将暂缓时间上限设为 `600000`(10 分钟)。您的第一次按键会提前结束暂缓。需要 Claude Code v2.1.217 或更高版本 |216| `CLAUDE_AX_STARTUP_QUIET_MS` | 在[屏幕阅读器模式](/docs/zh-CN/accessibility)下,Claude Code 在启动确认行之后暂缓首次界面渲染的毫秒数,以便您的屏幕阅读器在新输出打断之前完整朗读该行。默认 `3000`。设置 `0` 可立即渲染。Claude Code 将暂缓时间上限设为 `600000`(10 分钟)。您的第一次按键会提前结束暂缓。需要 Claude Code v2.1.217 或更高版本 |


285| `CLAUDE_CODE_DISABLE_REFUSAL_FALLBACK` | 设置为 `1` 可关闭[安全分类器标记请求时的自动模型切换](/docs/zh-CN/model-config#automatic-model-fallback),即由 [`switchModelsOnFlag`](/docs/zh-CN/settings-reference#switchmodelsonflag) 设置控制的行为 |285| `CLAUDE_CODE_DISABLE_REFUSAL_FALLBACK` | 设置为 `1` 可关闭[安全分类器标记请求时的自动模型切换](/docs/zh-CN/model-config#automatic-model-fallback),即由 [`switchModelsOnFlag`](/docs/zh-CN/settings-reference#switchmodelsonflag) 设置控制的行为 |

286| `CLAUDE_CODE_DISABLE_STRUCTURED_OUTPUTS` | 设置为 `1` 可阻止 Claude Code 发送结构化输出 `output_config.format` 字段及与其配对的 `anthropic-beta` 值,适用于上游会拒绝它们的 [LLM 网关](/docs/zh-CN/llm-gateway-protocol#feature-pass-through)。这会保留 [`CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS`](/docs/zh-CN/llm-gateway-protocol#disable-pre-release-capabilities) 会关闭的其他预发布功能。需要 Claude Code v2.1.288 或更高版本 |286| `CLAUDE_CODE_DISABLE_STRUCTURED_OUTPUTS` | 设置为 `1` 可阻止 Claude Code 发送结构化输出 `output_config.format` 字段及与其配对的 `anthropic-beta` 值,适用于上游会拒绝它们的 [LLM 网关](/docs/zh-CN/llm-gateway-protocol#feature-pass-through)。这会保留 [`CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS`](/docs/zh-CN/llm-gateway-protocol#disable-pre-release-capabilities) 会关闭的其他预发布功能。需要 Claude Code v2.1.288 或更高版本 |

287| `CLAUDE_CODE_DISABLE_SUBSTITUTION_RM_PROMPT` | 设置为 `1` 可关闭针对目标完全是命令替换输出的递归 `rm`(例如 `rm -rf "$(pwd)"`)的[关键路径](/docs/zh-CN/permission-modes#critical-paths)检查。其他关键路径检查会继续运行。请在启动 Claude Code 的环境中设置它,因为 Claude Code 会忽略通过设置 `env` 块传递的副本。需要 Claude Code v2.1.281 或更高版本 |287| `CLAUDE_CODE_DISABLE_SUBSTITUTION_RM_PROMPT` | 设置为 `1` 可关闭针对目标完全是命令替换输出的递归 `rm`(例如 `rm -rf "$(pwd)"`)的[关键路径](/docs/zh-CN/permission-modes#critical-paths)检查。其他关键路径检查会继续运行。请在启动 Claude Code 的环境中设置它,因为 Claude Code 会忽略通过设置 `env` 块传递的副本。需要 Claude Code v2.1.281 或更高版本 |

288| `CLAUDE_CODE_DISABLE_TERMINAL_TITLE` | 设置为 `1` 可禁用根据对话上下文自动更新终端标题。这也会跳过用于[生成会话标题](/docs/zh-CN/sessions#name-your-sessions)的后台小型/快速模型请求 |288| `CLAUDE_CODE_DISABLE_TERMINAL_TITLE` | 设置为 `1` 可禁用根据对话上下文自动更新终端标题。这还会跳过用于[生成会话标题](/docs/zh-CN/sessions#name-your-sessions)的后台小型/快速模型请求,并关闭[向终端报告状态](/docs/zh-CN/terminal-config#see-session-status-in-your-terminal)功能 |

289| `CLAUDE_CODE_DISABLE_THINKING` | 设置为 `1` 可从 API 请求中完全省略 `thinking` 参数。这是针对会拒绝该参数的代理和网关的兼容性选项。在默认进行思考的模型上,省略该参数意味着模型仍可能进行思考。若要在 Anthropic API 上明确禁用[扩展思考](https://platform.claude.com/docs/en/build-with-claude/extended-thinking),请改用 `MAX_THINKING_TOKENS=0`。这两个变量都无法在 Opus 5.5、Sonnet 5.5、Haiku 5.5 或 Fable 模型上关闭思考,这些模型不能关闭思考。在[第三方提供商](/docs/zh-CN/third-party-integrations)上,`MAX_THINKING_TOKENS=0` 同样会省略该参数,因此这两个变量在那里的行为相同 |289| `CLAUDE_CODE_DISABLE_THINKING` | 设置为 `1` 可从 API 请求中完全省略 `thinking` 参数。这是针对会拒绝该参数的代理和网关的兼容性选项。在默认进行思考的模型上,省略该参数意味着模型仍可能进行思考。若要在 Anthropic API 上明确禁用[扩展思考](https://platform.claude.com/docs/en/build-with-claude/extended-thinking),请改用 `MAX_THINKING_TOKENS=0`。这两个变量都无法在 Opus 5.5、Sonnet 5.5、Haiku 5.5 或 Fable 模型上关闭思考,这些模型不能关闭思考。在[第三方提供商](/docs/zh-CN/third-party-integrations)上,`MAX_THINKING_TOKENS=0` 同样会省略该参数,因此这两个变量在那里的行为相同 |

290| `CLAUDE_CODE_DISABLE_UNKNOWN_MODEL_WINDOW_ENFORCEMENT` | 设置为 `1` 可在 Claude Code 无法识别模型 ID(例如 [LLM 网关](/docs/zh-CN/llm-gateway)别名)时跳过主动[自动压缩](/docs/zh-CN/costs#reduce-token-usage)。未设置此变量时,Claude Code 会在其为该 ID 假定的上下文窗口处进行压缩。`CLAUDE_CODE_MAX_CONTEXT_TOKENS` 可以改为纠正假定的窗口;有关每个变量的适用情况,请参阅[纠正网关或自定义模型 ID 的窗口](/docs/zh-CN/model-config#correct-the-window-for-a-gateway-or-custom-model-id)。需要 Claude Code v2.1.223 或更高版本 |290| `CLAUDE_CODE_DISABLE_UNKNOWN_MODEL_WINDOW_ENFORCEMENT` | 设置为 `1` 可在 Claude Code 无法识别模型 ID(例如 [LLM 网关](/docs/zh-CN/llm-gateway)别名)时跳过主动[自动压缩](/docs/zh-CN/costs#reduce-token-usage)。未设置此变量时,Claude Code 会在其为该 ID 假定的上下文窗口处进行压缩。`CLAUDE_CODE_MAX_CONTEXT_TOKENS` 可以改为纠正假定的窗口;有关每个变量的适用情况,请参阅[纠正网关或自定义模型 ID 的窗口](/docs/zh-CN/model-config#correct-the-window-for-a-gateway-or-custom-model-id)。需要 Claude Code v2.1.223 或更高版本 |

291| `CLAUDE_CODE_DISABLE_VIRTUAL_SCROLL` | 设置为 `1` 可在[全屏渲染](/docs/zh-CN/fullscreen)中禁用虚拟滚动,并渲染会话记录中的每条消息。如果在全屏模式下滚动时,本应显示消息的位置出现空白区域,请使用此变量 |291| `CLAUDE_CODE_DISABLE_VIRTUAL_SCROLL` | 设置为 `1` 可在[全屏渲染](/docs/zh-CN/fullscreen)中禁用虚拟滚动,并渲染会话记录中的每条消息。如果在全屏模式下滚动时,本应显示消息的位置出现空白区域,请使用此变量 |


309| `CLAUDE_CODE_EXIT_AFTER_STOP_DELAY` | 查询循环进入空闲状态后、自动退出前等待的时间(毫秒)。适用于使用 SDK 模式的自动化工作流和脚本 |309| `CLAUDE_CODE_EXIT_AFTER_STOP_DELAY` | 查询循环进入空闲状态后、自动退出前等待的时间(毫秒)。适用于使用 SDK 模式的自动化工作流和脚本 |

310| `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS` | 设置为 `1` 可启用 [agent team](/docs/zh-CN/agent-teams)。agent team 为实验性功能,默认禁用 |310| `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS` | 设置为 `1` 可启用 [agent team](/docs/zh-CN/agent-teams)。agent team 为实验性功能,默认禁用 |

311| `CLAUDE_CODE_EXTRA_BODY` | 要合并到每个 API 请求体顶层的 JSON 对象。适用于传递 Claude Code 未直接公开的提供商特定参数。在 shell 中导出的值也会应用于您通过 `claude agents` 或 `--bg` 分派的[后台会话](/docs/zh-CN/agent-view)。在 v2.1.206 之前,后台会话会忽略 shell 导出的值,而使用后台监管进程所继承的副本 |311| `CLAUDE_CODE_EXTRA_BODY` | 要合并到每个 API 请求体顶层的 JSON 对象。适用于传递 Claude Code 未直接公开的提供商特定参数。在 shell 中导出的值也会应用于您通过 `claude agents` 或 `--bg` 分派的[后台会话](/docs/zh-CN/agent-view)。在 v2.1.206 之前,后台会话会忽略 shell 导出的值,而使用后台监管进程所继承的副本 |

312| `CLAUDE_CODE_FILE_READ_MAX_OUTPUT_TOKENS` | 覆盖文件读取的默认 token 限制。适用于需要完整读取较大文件的情况 |312| `CLAUDE_CODE_FILE_READ_MAX_OUTPUT_TOKENS` | 覆盖[文件读取](/docs/zh-CN/tools-reference#large-files)的默认 token 限制,默认值为 25,000 个 token。适用于需要完整读取较大文件的情况。当上下文窗口有余量时,Claude 使用 `allow_large` 参数进行的读取可以超过此限制 |

313| `CLAUDE_CODE_FORCE_SESSION_PERSISTENCE` | 设置为 `1` 可强制持久化会话记录、提示词历史并注册到 `claude agents`,即使此 `claude` 是从另一个 Claude Code 会话内部启动的。当继承的 `CLAUDE_CODE_CHILD_SESSION` 值(例如来自 `screen` 会话,或最初由 Claude Code 的 Bash 工具启动的后台启动器)导致真正的顶层会话被误判为嵌套会话时使用。从 v2.1.178 起,Claude Code 会自动检测 tmux 的情况并忽略继承的标记,因此 tmux 不再需要此变量。在 v2.1.169 及更早版本中同样有效;在 v2.1.170 和 v2.1.171 中不起作用,因为这两个版本移除了它所覆盖的嵌套会话检测 |313| `CLAUDE_CODE_FORCE_SESSION_PERSISTENCE` | 设置为 `1` 可强制持久化会话记录、提示词历史并注册到 `claude agents`,即使此 `claude` 是从另一个 Claude Code 会话内部启动的。当继承的 `CLAUDE_CODE_CHILD_SESSION` 值(例如来自 `screen` 会话,或最初由 Claude Code 的 Bash 工具启动的后台启动器)导致真正的顶层会话被误判为嵌套会话时使用。从 v2.1.178 起,Claude Code 会自动检测 tmux 的情况并忽略继承的标记,因此 tmux 不再需要此变量。在 v2.1.169 及更早版本中同样有效;在 v2.1.170 和 v2.1.171 中不起作用,因为这两个版本移除了它所覆盖的嵌套会话检测 |

314| `CLAUDE_CODE_FORCE_STRIKETHROUGH` | 当终端支持删除线但未被自动检测到时(例如通过 SSH 连接且未转发 `TERM_PROGRAM`),设置为 `1` 可强制将 Claude 回复中的 `~~text~~` 渲染为删除线。如果不设置,未被检测到的终端会显示字面的 `~~` 标记,而不是将文本渲染为删除线。需要 Claude Code v2.1.186 或更高版本 |314| `CLAUDE_CODE_FORCE_STRIKETHROUGH` | 当终端支持删除线但未被自动检测到时(例如通过 SSH 连接且未转发 `TERM_PROGRAM`),设置为 `1` 可强制将 Claude 回复中的 `~~text~~` 渲染为删除线。如果不设置,未被检测到的终端会显示字面的 `~~` 标记,而不是将文本渲染为删除线。需要 Claude Code v2.1.186 或更高版本 |

315| `CLAUDE_CODE_FORCE_SYNC_OUTPUT` | 当终端支持但未被自动检测到时,设置为 `1` 可强制启用 DEC 私有模式 2026 [同步输出](https://gist.github.com/christianparpart/d8a62cc1ab659194337d73e399004036)。适用于实现了 BSU/ESU 但不响应能力探测的模拟器,例如 Emacs `eat`。在 tmux 下无效。与切换到[全屏渲染](/docs/zh-CN/fullscreen)的 `CLAUDE_CODE_NO_FLICKER` 不同,此变量不会更改渲染器 |315| `CLAUDE_CODE_FORCE_SYNC_OUTPUT` | 当终端支持但未被自动检测到时,设置为 `1` 可强制启用 DEC 私有模式 2026 [同步输出](https://gist.github.com/christianparpart/d8a62cc1ab659194337d73e399004036)。适用于实现了 BSU/ESU 但不响应能力探测的模拟器,例如 Emacs `eat`。在 tmux 下无效。与切换到[全屏渲染](/docs/zh-CN/fullscreen)的 `CLAUDE_CODE_NO_FLICKER` 不同,此变量不会更改渲染器 |


340| `CLAUDE_CODE_MAX_WEB_SEARCHES_PER_SESSION` | [WebSearch](/docs/zh-CN/tools-reference#session-search-limit) 调用次数上限(默认:200)。当 Claude 达到上限后,后续 WebSearch 调用会返回一条通知,告知它使用已收集的信息继续。接受任意正整数,没有最大值限制。其他值会被忽略并应用默认值,因此该上限可以提高,但不能关闭。需要 Claude Code v2.1.212 或更高版本 |340| `CLAUDE_CODE_MAX_WEB_SEARCHES_PER_SESSION` | [WebSearch](/docs/zh-CN/tools-reference#session-search-limit) 调用次数上限(默认:200)。当 Claude 达到上限后,后续 WebSearch 调用会返回一条通知,告知它使用已收集的信息继续。接受任意正整数,没有最大值限制。其他值会被忽略并应用默认值,因此该上限可以提高,但不能关闭。需要 Claude Code v2.1.212 或更高版本 |

341| `CLAUDE_CODE_MCP_ALLOWLIST_ENV` | 设置为 `1` 可在启动 stdio MCP 服务器时仅提供安全的基线环境加上服务器配置的 `env`,而不是继承您的 shell 环境 |341| `CLAUDE_CODE_MCP_ALLOWLIST_ENV` | 设置为 `1` 可在启动 stdio MCP 服务器时仅提供安全的基线环境加上服务器配置的 `env`,而不是继承您的 shell 环境 |

342| `CLAUDE_CODE_MCP_AUTO_BACKGROUND_MS` | 仍在运行的 MCP 工具调用在经过多长时间(毫秒)后[转为后台任务](/docs/zh-CN/mcp#automatic-backgrounding-of-long-tool-calls)(默认:120000,即 2 分钟)。设置为 `0` 可关闭自动转入后台。需要 Claude Code v2.1.212 或更高版本 |342| `CLAUDE_CODE_MCP_AUTO_BACKGROUND_MS` | 仍在运行的 MCP 工具调用在经过多长时间(毫秒)后[转为后台任务](/docs/zh-CN/mcp#automatic-backgrounding-of-long-tool-calls)(默认:120000,即 2 分钟)。设置为 `0` 可关闭自动转入后台。需要 Claude Code v2.1.212 或更高版本 |

343| `CLAUDE_CODE_MCP_STARTUP_WAIT_MS` | [非交互](/docs/zh-CN/headless)会话的第一轮等待仍在连接中的 MCP 服务器的时长(毫秒),用于替代默认的[首轮等待](/docs/zh-CN/agent-sdk/mcp#connection-timing)。设置后,该等待涵盖所有待连接的服务器。设置为 `0` 可跳过等待。无论该值如何,[`--permission-prompt-tool`](/docs/zh-CN/cli-reference#cli-flags) 服务器都会保留其自身的 `MCP_TIMEOUT` 等待。需要 Claude Code v2.1.274 或更高版本 |343| `CLAUDE_CODE_MCP_STARTUP_WAIT_MS` | [非交互](/docs/zh-CN/headless)会话的第一轮等待仍在连接的 MCP 服务器的时长(毫秒),用于替代默认的[首轮等待](/docs/zh-CN/agent-sdk/mcp#connection-timing)。设置后,等待会涵盖所有待连接的服务器;在[自托管环境](/docs/zh-CN/self-hosted-environments-configuration#connection-timing)中,它只改变等待持续的时长。设置为 `0` 可跳过等待。无论该值如何,[`--permission-prompt-tool`](/docs/zh-CN/cli-reference#cli-flags) 服务器都会保持其自身的 `MCP_TIMEOUT` 等待。需要 Claude Code v2.1.274 或更高版本 |

344| `CLAUDE_CODE_MCP_TOOL_IDLE_TIMEOUT` | MCP 工具调用的空闲超时时间(毫秒)。当 stdio、HTTP、SSE、WebSocket 或 [claude.ai 连接器](/docs/zh-CN/mcp#use-mcp-servers-from-claude-ai) MCP 服务器在这段时间内既没有发送响应也没有发送进度通知时,工具调用会报错中止,而不是等待整体的 `MCP_TOOL_TIMEOUT`。覆盖各传输方式的默认值:网络服务器为 300000(5 分钟),stdio 服务器为 1800000(30 分钟)。设置为 `0` 可禁用空闲检查。低于 1000 的值会被提高到一秒,且该值的上限为生效的 `MCP_TOOL_TIMEOUT`。`.mcp.json` 中至少为 1000 的单服务器 `timeout` 会将该服务器的空闲窗口提高到至少等于 `timeout` 值。不适用于 IDE 服务器或 SDK 进程内服务器。需要 Claude Code v2.1.187 或更高版本。在 v2.1.203 之前,stdio 服务器不受空闲超时限制 |344| `CLAUDE_CODE_MCP_TOOL_IDLE_TIMEOUT` | MCP 工具调用的空闲超时时间(毫秒)。当 stdio、HTTP、SSE、WebSocket 或 [claude.ai 连接器](/docs/zh-CN/mcp#use-mcp-servers-from-claude-ai) MCP 服务器在这段时间内既没有发送响应也没有发送进度通知时,工具调用会报错中止,而不是等待整体的 `MCP_TOOL_TIMEOUT`。覆盖各传输方式的默认值:网络服务器为 300000(5 分钟),stdio 服务器为 1800000(30 分钟)。设置为 `0` 可禁用空闲检查。低于 1000 的值会被提高到一秒,且该值的上限为生效的 `MCP_TOOL_TIMEOUT`。`.mcp.json` 中至少为 1000 的单服务器 `timeout` 会将该服务器的空闲窗口提高到至少等于 `timeout` 值。不适用于 IDE 服务器或 SDK 进程内服务器。需要 Claude Code v2.1.187 或更高版本。在 v2.1.203 之前,stdio 服务器不受空闲超时限制 |

345| `CLAUDE_CODE_MESSAGING_SOCKET` | 由 Claude Code 设置,而非由您设置:在绑定了[收件箱套接字](/docs/zh-CN/cross-session-messaging#the-sessions-inbox-socket)的会话中,Claude Code 在绑定套接字时会将该套接字的路径导出给 hook 和 Bash 命令。在启动时即开启消息功能的会话中,Claude Code 会在任何 hook 运行之前绑定套接字。本机上的其他会话会将消息投递到此路径。每个会话导出自己的套接字,而不是从父会话继承的套接字,到达该套接字的消息会经过该会话的[入站控制](/docs/zh-CN/cross-session-messaging#control-inbound-messages)。设置中的 `env` 块无法设置此变量。需要 Claude Code v2.1.224 或更高版本 |345| `CLAUDE_CODE_MESSAGING_SOCKET` | 由 Claude Code 设置,而非由您设置:在绑定了[收件箱套接字](/docs/zh-CN/cross-session-messaging#the-sessions-inbox-socket)的会话中,Claude Code 在绑定套接字时会将该套接字的路径导出给 hook 和 Bash 命令。在启动时即开启消息功能的会话中,Claude Code 会在任何 hook 运行之前绑定套接字。本机上的其他会话会将消息投递到此路径。每个会话导出自己的套接字,而不是从父会话继承的套接字,到达该套接字的消息会经过该会话的[入站控制](/docs/zh-CN/cross-session-messaging#control-inbound-messages)。设置中的 `env` 块无法设置此变量。需要 Claude Code v2.1.224 或更高版本 |

346| `CLAUDE_CODE_MESSAGING_TOKEN` | 由 Claude Code 设置,而非由您设置:在绑定了[收件箱套接字](/docs/zh-CN/cross-session-messaging#the-sessions-inbox-socket)的会话中,Claude Code 会将此会话专属令牌与 `CLAUDE_CODE_MESSAGING_SOCKET` 一起导出给 hook 和 Bash 命令。向该套接字发送消息的脚本可以将 `{"type":"auth","token":"<token>"}` 作为第一行发送,以证明它属于该会话。在原生 Windows 上,Claude Code 要求发送此行,并会关闭任何未以有效认证行开头的连接。[自有子进程规则](/docs/zh-CN/cross-session-messaging#the-sessions-inbox-socket)说明了 Claude Code 何时会检查该令牌。每个会话导出自己的令牌,绝不会使用从父会话继承的令牌。设置中的 `env` 块无法设置此变量。需要 Claude Code v2.1.228 或更高版本 |346| `CLAUDE_CODE_MESSAGING_TOKEN` | 由 Claude Code 设置,而非由您设置:在绑定了[收件箱套接字](/docs/zh-CN/cross-session-messaging#the-sessions-inbox-socket)的会话中,Claude Code 会将此会话专属令牌与 `CLAUDE_CODE_MESSAGING_SOCKET` 一起导出给 hook 和 Bash 命令。向该套接字发送消息的脚本可以将 `{"type":"auth","token":"<token>"}` 作为第一行发送,以证明它属于该会话。在原生 Windows 上,Claude Code 要求发送此行,并会关闭任何未以有效认证行开头的连接。[自有子进程规则](/docs/zh-CN/cross-session-messaging#the-sessions-inbox-socket)说明了 Claude Code 何时会检查该令牌。每个会话导出自己的令牌,绝不会使用从父会话继承的令牌。设置中的 `env` 块无法设置此变量。需要 Claude Code v2.1.228 或更高版本 |


443| `CLAUDE_ENABLE_BYTE_WATCHDOG` | 设置为 `1` 可强制启用字节级流式空闲看门狗,设置为 `0` 可强制禁用它。`0` 还会在运行[首字节截止时间](/docs/zh-CN/network-config#streaming-idle-watchdogs)的连接上关闭该截止时间。未设置时,该看门狗默认在直连 Anthropic API 和 [Claude Platform on AWS](/docs/zh-CN/claude-platform-on-aws) 的连接上启用,并对通过 `ANTHROPIC_BASE_URL` 或 `ANTHROPIC_AWS_BASE_URL` 访问的[网关](/docs/zh-CN/gateways)连接上的流式响应启用;在 v2.1.222 之前,它不会在这些网关连接上运行,因此即使 keep-alive ping 持续到达,事件级看门狗也可能在那里报告停滞。关于超时时间以及各计时器如何相互作用,请参阅[流式空闲看门狗](/docs/zh-CN/network-config#streaming-idle-watchdogs) |443| `CLAUDE_ENABLE_BYTE_WATCHDOG` | 设置为 `1` 可强制启用字节级流式空闲看门狗,设置为 `0` 可强制禁用它。`0` 还会在运行[首字节截止时间](/docs/zh-CN/network-config#streaming-idle-watchdogs)的连接上关闭该截止时间。未设置时,该看门狗默认在直连 Anthropic API 和 [Claude Platform on AWS](/docs/zh-CN/claude-platform-on-aws) 的连接上启用,并对通过 `ANTHROPIC_BASE_URL` 或 `ANTHROPIC_AWS_BASE_URL` 访问的[网关](/docs/zh-CN/gateways)连接上的流式响应启用;在 v2.1.222 之前,它不会在这些网关连接上运行,因此即使 keep-alive ping 持续到达,事件级看门狗也可能在那里报告停滞。关于超时时间以及各计时器如何相互作用,请参阅[流式空闲看门狗](/docs/zh-CN/network-config#streaming-idle-watchdogs) |

444| `CLAUDE_ENABLE_BYTE_WATCHDOG_BEDROCK` | 设置为 `1` 可在 Amazon Bedrock `vnd.amazon.eventstream` 响应上启用字节级流式空闲看门狗,这也会在 Bedrock 流式请求上启用[首字节截止时间](/docs/zh-CN/network-config#streaming-idle-watchdogs)。默认关闭。使用 `CLAUDE_STREAM_IDLE_TIMEOUT_MS` 配置超时时间 |444| `CLAUDE_ENABLE_BYTE_WATCHDOG_BEDROCK` | 设置为 `1` 可在 Amazon Bedrock `vnd.amazon.eventstream` 响应上启用字节级流式空闲看门狗,这也会在 Bedrock 流式请求上启用[首字节截止时间](/docs/zh-CN/network-config#streaming-idle-watchdogs)。默认关闭。使用 `CLAUDE_STREAM_IDLE_TIMEOUT_MS` 配置超时时间 |

445| `CLAUDE_ENABLE_STREAM_WATCHDOG` | 设置为 `0` 可强制禁用事件级流式空闲看门狗,设置为 `1` 可强制启用它。未设置时,该看门狗对所有提供商默认开启。在 v2.1.196 之前,未设置时的默认值在直连 Anthropic API 上由服务器控制,在其他提供商上为关闭。使用 `CLAUDE_STREAM_IDLE_TIMEOUT_MS` 配置超时时间;关于与其同时运行的其他停滞计时器,请参阅[流式空闲看门狗](/docs/zh-CN/network-config#streaming-idle-watchdogs) |445| `CLAUDE_ENABLE_STREAM_WATCHDOG` | 设置为 `0` 可强制禁用事件级流式空闲看门狗,设置为 `1` 可强制启用它。未设置时,该看门狗对所有提供商默认开启。在 v2.1.196 之前,未设置时的默认值在直连 Anthropic API 上由服务器控制,在其他提供商上为关闭。使用 `CLAUDE_STREAM_IDLE_TIMEOUT_MS` 配置超时时间;关于与其同时运行的其他停滞计时器,请参阅[流式空闲看门狗](/docs/zh-CN/network-config#streaming-idle-watchdogs) |

446| `CLAUDE_ENV_FILE` | shell 脚本的路径,Claude Code 会在同一 shell 进程中于每个 Bash 命令之前运行该脚本的内容,因此文件中的导出对命令可见。用于在多个命令之间保持 virtualenv 或 conda 的激活状态。也会由 [SessionStart](/docs/zh-CN/hooks#persist-environment-variables)、[Setup](/docs/zh-CN/hooks#setup)、[CwdChanged](/docs/zh-CN/hooks#cwdchanged) 和 [FileChanged](/docs/zh-CN/hooks#filechanged) hook 动态填充 |446| `CLAUDE_ENV_FILE` | 一个 shell 脚本的路径,Claude Code 会在每个 Bash 命令之前于同一 shell 进程中运行其内容,因此文件中的 export 对该命令可见。用于在命令之间保持 virtualenv 或 conda 的激活状态。在 v2.1.296 或更高版本中,PowerShell 命令也会在 [PowerShell 命令中的持久化变量](/docs/zh-CN/hooks#persisted-variables-in-powershell-commands)所述的条件下接收其变量。也会由 [SessionStart](/docs/zh-CN/hooks#persist-environment-variables)、[Setup](/docs/zh-CN/hooks#setup)、[CwdChanged](/docs/zh-CN/hooks#cwdchanged) 和 [FileChanged](/docs/zh-CN/hooks#filechanged) hook 动态填充 |

447| `CLAUDE_JOB_DIR` | 由 Claude Code 在每个[后台会话](/docs/zh-CN/agent-view)中设置为该会话的 `~/.claude/jobs/<id>` 目录。会话运行的 shell 命令会继承它。请将临时文件写入 [`$CLAUDE_JOB_DIR/tmp`](/docs/zh-CN/agent-view#where-state-is-stored)。Claude 在该位置的 `Write` 和 `Edit` 调用不会提示请求权限,且该目录会在会话被删除时一并移除 |447| `CLAUDE_JOB_DIR` | 由 Claude Code 在每个[后台会话](/docs/zh-CN/agent-view)中设置为该会话的 `~/.claude/jobs/<id>` 目录。会话运行的 shell 命令会继承它。请将临时文件写入 [`$CLAUDE_JOB_DIR/tmp`](/docs/zh-CN/agent-view#where-state-is-stored)。Claude 在该位置的 `Write` 和 `Edit` 调用不会提示请求权限,且该目录会在会话被删除时一并移除 |

448| `CLAUDE_PID` | Claude Code 会在其生成的子进程(Bash 和 PowerShell 工具命令以及 hook 命令)中将此变量设置为自身的进程 ID。在 Linux 上,Bash 工具的 shell 集成会使用它来拒绝会匹配 Claude Code 进程本身的 `pkill` 模式;请参阅[错误参考](/docs/zh-CN/errors#pkill-pattern-matches-the-claude-code-process)。您可以在自己的脚本中读取它,以有意识地识别父 Claude Code 进程或向其发送信号。需要 Claude Code v2.1.214 或更高版本 |448| `CLAUDE_PID` | Claude Code 会在其生成的子进程(Bash 和 PowerShell 工具命令以及 hook 命令)中将此变量设置为自身的进程 ID。在 Linux 上,Bash 工具的 shell 集成会使用它来拒绝会匹配 Claude Code 进程本身的 `pkill` 模式;请参阅[错误参考](/docs/zh-CN/errors#pkill-pattern-matches-the-claude-code-process)。您可以在自己的脚本中读取它,以有意识地识别父 Claude Code 进程或向其发送信号。需要 Claude Code v2.1.214 或更高版本 |

449| `CLAUDE_REMOTE_CONTROL_SESSION_NAME_PREFIX` | 未提供显式名称时,自动生成的 [Remote Control](/docs/zh-CN/remote-control) 会话名称的前缀。默认为您机器的主机名,生成的名称类似 `myhost-graceful-unicorn`。`--remote-control-session-name-prefix` CLI 标志可为单次调用设置相同的值 |449| `CLAUDE_REMOTE_CONTROL_SESSION_NAME_PREFIX` | 未提供显式名称时,自动生成的 [Remote Control](/docs/zh-CN/remote-control) 会话名称的前缀。默认为您机器的主机名,生成的名称类似 `myhost-graceful-unicorn`。`--remote-control-session-name-prefix` CLI 标志可为单次调用设置相同的值 |

errors.md +73 −10

Details

37| `Connection lost while your computer was asleep` | [自动重试](#automatic-retries) |37| `Connection lost while your computer was asleep` | [自动重试](#automatic-retries) |

38| `<model> is temporarily unavailable, so auto mode cannot determine the safety of...` | [服务器错误](#auto-mode-cannot-determine-the-safety-of-an-action) |38| `<model> is temporarily unavailable, so auto mode cannot determine the safety of...` | [服务器错误](#auto-mode-cannot-determine-the-safety-of-an-action) |

39| `Auto mode could not evaluate this action and is blocking it for safety` | [服务器错误](#auto-mode-cannot-determine-the-safety-of-an-action) |39| `Auto mode could not evaluate this action and is blocking it for safety` | [服务器错误](#auto-mode-cannot-determine-the-safety-of-an-action) |

40| `Not run · auto mode's check had no usable answer` | [服务器错误](#auto-mode-cannot-determine-the-safety-of-an-action) |

40| `Auto mode classifier transcript exceeded context window` | [服务器错误](#auto-mode-cannot-determine-the-safety-of-an-action) |41| `Auto mode classifier transcript exceeded context window` | [服务器错误](#auto-mode-cannot-determine-the-safety-of-an-action) |

41| `Agent aborted: auto mode classifier request refused by the safety safeguard` | [服务器错误](#auto-mode-cannot-determine-the-safety-of-an-action) |42| `Agent aborted: auto mode classifier request refused by the safety safeguard` | [服务器错误](#auto-mode-cannot-determine-the-safety-of-an-action) |

42| `The server-side auto mode classifier gave no verdict` | [服务器错误](#the-server-returned-no-safety-verdict) |43| `The server-side auto mode classifier gave no verdict` | [服务器错误](#the-server-returned-no-safety-verdict) |


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

248| `Cannot switch renderers in this session` | [命令行错误](#cannot-switch-renderers-in-this-session) |249| `Cannot switch renderers in this session` | [命令行错误](#cannot-switch-renderers-in-this-session) |

249| `Cannot switch renderers while work is running in the background` | [命令行错误](#cannot-switch-renderers-in-this-session) |250| `Cannot switch renderers while work is running in the background` | [命令行错误](#cannot-switch-renderers-in-this-session) |

251| `Claude Code couldn't restart` | [命令行错误](#claude-code-couldnt-restart) |

250| `Couldn't open Claude Desktop` | [命令行错误](#couldnt-open-claude-desktop) |252| `Couldn't open Claude Desktop` | [命令行错误](#couldnt-open-claude-desktop) |

251| `Failed to open Claude Desktop. Please try opening it manually.` | [命令行错误](#couldnt-open-claude-desktop) |253| `Failed to open Claude Desktop. Please try opening it manually.` | [命令行错误](#couldnt-open-claude-desktop) |

252| `Couldn't read your Zed keymap` / `Couldn't back up your Zed keymap` / `Couldn't update your Zed keymap` | [命令行错误](#terminal-setup-left-your-zed-keymap-unchanged) |254| `Couldn't read your Zed keymap` / `Couldn't back up your Zed keymap` / `Couldn't update your Zed keymap` | [命令行错误](#terminal-setup-left-your-zed-keymap-unchanged) |


262| `Marketplace "<name>" is already added from a different source` | [Plugin 错误](#marketplace-is-already-added-from-a-different-source) |264| `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) |265| `"<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) |266| `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) |

267| `Cannot add marketplace "<name>": Claude Code reserves this name and cannot register a marketplace under it` | [Plugin 故障排除](/docs/zh-CN/plugins/troubleshooting#claude-code-reserves-this-name) |

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

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


308| `Your disk quota is full on the filesystem with Claude Code's temp directory <dir> (EDQUOT)` | [工具错误](#disk-quota-or-temp-filesystem-is-full) |311| `Your disk quota is full on the filesystem with Claude Code's temp directory <dir> (EDQUOT)` | [工具错误](#disk-quota-or-temp-filesystem-is-full) |

309| `The filesystem with Claude Code's temp directory <dir>, or your disk quota on it, is full (ENOSPC)` | [工具错误](#disk-quota-or-temp-filesystem-is-full) |312| `The filesystem with Claude Code's temp directory <dir>, or your disk quota on it, is full (ENOSPC)` | [工具错误](#disk-quota-or-temp-filesystem-is-full) |

310| `Command output was lost: the temp filesystem at <dir> is full` / `is out of inodes` | [工具错误](#disk-quota-or-temp-filesystem-is-full) |313| `Command output was lost: the temp filesystem at <dir> is full` / `is out of inodes` | [工具错误](#disk-quota-or-temp-filesystem-is-full) |

314| `File is not valid UTF-8. It may use a legacy encoding such as Windows-1252, Shift-JIS or GBK, or be binary` | [工具错误](#file-is-not-valid-utf-8) |

311| `the source file is not valid UTF-8 text` / `the source file is not valid UTF-16 text` | [工具错误](#the-source-file-is-not-valid-utf-8-text) |315| `the source file is not valid UTF-8 text` / `the source file is not valid UTF-16 text` | [工具错误](#the-source-file-is-not-valid-utf-8-text) |

312| `the source file has the replacement character U+FFFD` | [工具错误](#the-source-file-is-not-valid-utf-8-text) |316| `the source file has the replacement character U+FFFD` | [工具错误](#the-source-file-is-not-valid-utf-8-text) |

313| `Not published: that file is on a network share` | [工具错误](#not-published-that-file-is-on-a-network-share) |317| `Not published: that file is on a network share` | [工具错误](#not-published-that-file-is-on-a-network-share) |


334| `Session isn't responding` / `Press enter again to restart this session — it isn't responding` | [后台会话错误](#session-isnt-responding) |338| `Session isn't responding` / `Press enter again to restart this session — it isn't responding` | [后台会话错误](#session-isnt-responding) |

335| `Session <id> was stopped while the respawn was in flight` | [后台会话错误](#session-was-stopped-while-the-respawn-was-in-flight) |339| `Session <id> was stopped while the respawn was in flight` | [后台会话错误](#session-was-stopped-while-the-respawn-was-in-flight) |

336| `This session was running agent '<name>', which is no longer available` | [后台会话错误](#session-agent-no-longer-available) |340| `This session was running agent '<name>', which is no longer available` | [后台会话错误](#session-agent-no-longer-available) |

341| `This session restarted <time> after its next /loop wakeup was due, so that wakeup will not fire` | [后台会话错误](#restarted-after-its-next-loop-wakeup-was-due) |

337| `CLAUDE_CODE_PROCESS_WRAPPER: launcher ...` | [后台会话错误](#claude_code_process_wrapper-launcher-errors) |342| `CLAUDE_CODE_PROCESS_WRAPPER: launcher ...` | [后台会话错误](#claude_code_process_wrapper-launcher-errors) |

338| `EUNKNOWN: unknown error, uv_spawn` | [后台会话错误](#eunknown-when-starting-a-background-session) |343| `EUNKNOWN: unknown error, uv_spawn` | [后台会话错误](#eunknown-when-starting-a-background-session) |

339| `EACCES: permission denied, posix_spawn` | [后台会话错误](#eacces-when-starting-a-background-session) |344| `EACCES: permission denied, posix_spawn` | [后台会话错误](#eacces-when-starting-a-background-session) |


439| :- | :- | :- |444| :- | :- | :- |

440| [`CLAUDE_CODE_MAX_RETRIES`](/docs/zh-CN/env-vars) | 10 | 重试尝试次数。从 v2.1.186 开始上限为 15;从 v2.1.199 开始 `CLAUDE_CODE_RETRY_WATCHDOG` 提高默认值并移除上限。降低它以在脚本中更快地显示故障。 |445| [`CLAUDE_CODE_MAX_RETRIES`](/docs/zh-CN/env-vars) | 10 | 重试尝试次数。从 v2.1.186 开始上限为 15;从 v2.1.199 开始 `CLAUDE_CODE_RETRY_WATCHDOG` 提高默认值并移除上限。降低它以在脚本中更快地显示故障。 |

441| [`CLAUDE_CODE_RETRY_WATCHDOG`](/docs/zh-CN/env-vars) | 未设置 | 在 CI 作业等无人值守会话中设置为 `1`,以无限期重试 `429` 和 `529` 容量错误,而不是在 `CLAUDE_CODE_MAX_RETRIES` 尝试后失败。当标准速度请求获得报告支出限制或耗尽使用额度的 `429` 时,Claude Code 立即失败,即使来自 [gateway spend cap](#spend-limit-reached) 的也是如此,该上限按计划重置。在 v2.1.239 之前,看门狗无限期重试这些。对于快速模式请求,请参阅 [Handle rate limits](/docs/zh-CN/fast-mode#handle-rate-limits)。在 v2.1.199 或更高版本上,它还为其他瞬时错误(例如服务器错误、超时和断开连接)提高默认重试计数至 300,大约三小时的退避,如果您明确设置该变量,则移除 `CLAUDE_CODE_MAX_RETRIES` 的 15 上限。 |446| [`CLAUDE_CODE_RETRY_WATCHDOG`](/docs/zh-CN/env-vars) | 未设置 | 在 CI 作业等无人值守会话中设置为 `1`,以无限期重试 `429` 和 `529` 容量错误,而不是在 `CLAUDE_CODE_MAX_RETRIES` 尝试后失败。当标准速度请求获得报告支出限制或耗尽使用额度的 `429` 时,Claude Code 立即失败,即使来自 [gateway spend cap](#spend-limit-reached) 的也是如此,该上限按计划重置。在 v2.1.239 之前,看门狗无限期重试这些。对于快速模式请求,请参阅 [Handle rate limits](/docs/zh-CN/fast-mode#handle-rate-limits)。在 v2.1.199 或更高版本上,它还为其他瞬时错误(例如服务器错误、超时和断开连接)提高默认重试计数至 300,大约三小时的退避,如果您明确设置该变量,则移除 `CLAUDE_CODE_MAX_RETRIES` 的 15 上限。 |

447| [`CLAUDE_CODE_RETRY_WATCHDOG_MAX_WAIT_MS`](/docs/zh-CN/env-vars) | 未设置 | 设置 `CLAUDE_CODE_RETRY_WATCHDOG` 时,每个 API 请求在等待 `429` 和 `529` 错误上所花费的最长时间(毫秒)。未设置时,等待时间没有限制。需要 Claude Code v2.1.295 或更高版本。 |

442| [`CLAUDE_CODE_OVERLOADED_RETRY_BASE_DELAY_MS`](/docs/zh-CN/env-vars) | 500 | 当 API 以 `529` 过载错误拒绝请求时,该请求各次重试之间退避的起始延迟(毫秒)。当 API 容量已满时,可将其提高(最高 32000),以便在更长的时间窗口内分散重试。当 `CLAUDE_CODE_RETRY_WATCHDOG` 设置为 `1`,或被拒绝的请求是在[快速模式](/docs/zh-CN/fast-mode#handle-rate-limits)下发送时,此变量无效。需要 Claude Code v2.1.292 或更高版本。 |448| [`CLAUDE_CODE_OVERLOADED_RETRY_BASE_DELAY_MS`](/docs/zh-CN/env-vars) | 500 | 当 API 以 `529` 过载错误拒绝请求时,该请求各次重试之间退避的起始延迟(毫秒)。当 API 容量已满时,可将其提高(最高 32000),以便在更长的时间窗口内分散重试。当 `CLAUDE_CODE_RETRY_WATCHDOG` 设置为 `1`,或被拒绝的请求是在[快速模式](/docs/zh-CN/fast-mode#handle-rate-limits)下发送时,此变量无效。需要 Claude Code v2.1.292 或更高版本。 |

443| [`API_TIMEOUT_MS`](/docs/zh-CN/env-vars) | 600000 | 每个请求的超时(毫秒)。为慢速网络或代理提高它。它还限制 Claude Code 等待响应头的时间,在 [No response from API](#no-response-from-api) 中描述。 |449| [`API_TIMEOUT_MS`](/docs/zh-CN/env-vars) | 600000 | 每个请求的超时(毫秒)。为慢速网络或代理提高它。它还限制 Claude Code 等待响应头的时间,在 [No response from API](#no-response-from-api) 中描述。 |

444| [`CLAUDE_CODE_NONSTREAMING_TIMEOUT_RETRIES`](/docs/zh-CN/env-vars) | 未设置 | 超时的[非流式请求](#streaming-response-ended-before-any-complete-data-was-received)的重新发送次数限制。达到该限制时,请求失败。生成时间超过超时时间的 Claude 响应在每次重新发送时都会再次超时,因此请设置较低的数值(例如 `0`)以更快地失败。在本地会话中,每次非流式尝试在 300 秒后超时;当您为 `API_TIMEOUT_MS` 设置正值时,则在该值指定的时间后超时。需要 Claude Code v2.1.285 或更高版本。 |450| [`CLAUDE_CODE_NONSTREAMING_TIMEOUT_RETRIES`](/docs/zh-CN/env-vars) | 未设置 | 超时的[非流式请求](#streaming-response-ended-before-any-complete-data-was-received)的重新发送次数限制。达到该限制时,请求失败。生成时间超过超时时间的 Claude 响应在每次重新发送时都会再次超时,因此请设置较低的数值(例如 `0`)以更快地失败。在本地会话中,每次非流式尝试在 300 秒后超时;当您为 `API_TIMEOUT_MS` 设置正值时,则在该值指定的时间后超时。需要 Claude Code v2.1.285 或更高版本。 |


596<model> is temporarily unavailable, so auto mode cannot determine the safety of <tool> right now. Wait a moment and then try this action again.602<model> is temporarily unavailable, so auto mode cannot determine the safety of <tool> right now. Wait a moment and then try this action again.

597```603```

598 604 

605在交互式会话中,工具调用下方会显示一行暗色的 `Not run · auto mode's check had no usable answer`,而不是此消息。按 `Ctrl+O` 可在[会话记录查看器](/docs/zh-CN/interactive-mode#transcript-viewer)中阅读该消息。[The server returned no safety verdict](#the-server-returned-no-safety-verdict) 下的拒绝也显示同样的一行。在 v2.1.296 之前,该消息以红色错误的形式显示在调用下方。

606 

599当 Claude Code 可以确定故障类别时,它在 `temporarily unavailable` 后的括号中指出该类别,例如 `<model> is temporarily unavailable (rate-limited), so auto mode cannot determine the safety of <tool> right now`。类别为 `(rate-limited)`、`(overloaded)`、`(server error)`、`(timed out)` 和 `(connection failed)`。如果 `(timed out)` 或 `(connection failed)` 重复出现,请检查您的连接;请参阅[无法连接到 API](#unable-to-connect-to-api)。在 v2.1.229 之前,消息从不指出类别,读作 `Wait briefly and then try this action again`。607当 Claude Code 可以确定故障类别时,它在 `temporarily unavailable` 后的括号中指出该类别,例如 `<model> is temporarily unavailable (rate-limited), so auto mode cannot determine the safety of <tool> right now`。类别为 `(rate-limited)`、`(overloaded)`、`(server error)`、`(timed out)` 和 `(connection failed)`。如果 `(timed out)` 或 `(connection failed)` 重复出现,请检查您的连接;请参阅[无法连接到 API](#unable-to-connect-to-api)。在 v2.1.229 之前,消息从不指出类别,读作 `Wait briefly and then try this action again`。

600 608 

601当没有类别适用时,消息出现时括号中没有类别;多个故障会产生该形式。在 [Amazon Bedrock](/docs/zh-CN/amazon-bedrock) 上,包括 [Mantle 端点](/docs/zh-CN/amazon-bedrock#use-the-mantle-endpoint),当您的 AWS 账户无法调用消息中指出的模型时,它也会出现,该故障在每次重试时重复,直到您的账户被授予访问该模型的权限。609当没有类别适用时,消息出现时括号中没有类别;多个故障会产生该形式。在 [Amazon Bedrock](/docs/zh-CN/amazon-bedrock) 上,包括 [Mantle 端点](/docs/zh-CN/amazon-bedrock#use-the-mantle-endpoint),当您的 AWS 账户无法调用消息中指出的模型时,它也会出现,该故障在每次重试时重复,直到您的账户被授予访问该模型的权限。


1900 1908 

1901当[托管设置文件、MDM 策略或策略助手](/docs/zh-CN/managed-settings)将 [`forceLoginMethod`](/docs/zh-CN/settings-reference#forceloginmethod) 设置为 `"gateway"` 或设置 [`forceLoginGatewayUrl`](/docs/zh-CN/settings-reference#forcelogingatewayurl) 而不设置 `forceLoginMethod` 时,Claude Code 会跳过此检查。使用任一配置,Claude Code 在**云网关**屏幕上打开登录步骤,而不是 Anthropic 登录方法。当机器上存在托管设置源但无法读取时,Claude Code 也会跳过检查,因为该源可能包含网关配置。在 v2.1.247 之前,Claude Code 在此配置下也运行检查,当 Anthropic 的端点无法到达时以此错误退出。1909当[托管设置文件、MDM 策略或策略助手](/docs/zh-CN/managed-settings)将 [`forceLoginMethod`](/docs/zh-CN/settings-reference#forceloginmethod) 设置为 `"gateway"` 或设置 [`forceLoginGatewayUrl`](/docs/zh-CN/settings-reference#forcelogingatewayurl) 而不设置 `forceLoginMethod` 时,Claude Code 会跳过此检查。使用任一配置,Claude Code 在**云网关**屏幕上打开登录步骤,而不是 Anthropic 登录方法。当机器上存在托管设置源但无法读取时,Claude Code 也会跳过检查,因为该源可能包含网关配置。在 v2.1.247 之前,Claude Code 在此配置下也运行检查,当 Anthropic 的端点无法到达时以此错误退出。

1902 1910 

1911在没有托管设置的机器上,当您自己的 `~/.claude/settings.json` 通过 `forceLoginMethod` 和 `forceLoginGatewayUrl` [指定网关](/docs/zh-CN/claude-apps-gateway#set-the-gateway-url-in-user-settings)时,Claude Code 也会跳过此检查。在 v2.1.295 之前,Claude Code 在这种情况下会运行检查。

1912 

1903**要做什么:**1913**要做什么:**

1904 1914 

1905* 如果消息名称代理变量,检查其值是否指向正确的代理,并要求您的网络团队允许通过它进行 HTTPS 连接到消息中的主机。请参阅[网络配置](/docs/zh-CN/network-config)。1915* 如果消息名称代理变量,检查其值是否指向正确的代理,并要求您的网络团队允许通过它进行 HTTPS 连接到消息中的主机。请参阅[网络配置](/docs/zh-CN/network-config)。


3412 3422 

3413对于任何[注入动态上下文](/docs/zh-CN/skills#when-an-injected-command-fails)的 skill,Claude Code 都会显示相同的错误,注入的命令失败会中止该 skill 的调用。还有两条相关字符串会在命令运行之前就触发:3423对于任何[注入动态上下文](/docs/zh-CN/skills#when-an-injected-command-fails)的 skill,Claude Code 都会显示相同的错误,注入的命令失败会中止该 skill 的调用。还有两条相关字符串会在命令运行之前就触发:

3414 3424 

3415* `Shell command permission check failed for pattern "..."`:该命令的权限检查未允许它运行。[注入命令的权限检查](/docs/zh-CN/skills#permission-checks-on-injected-commands)介绍了在每种权限模式下哪些结果会导致中止,以及如何使用 `allowed-tools` 预先批准命令3425* `Shell command permission check failed for pattern "..."`:该命令的权限检查未允许其运行。[注入命令的权限检查](/docs/zh-CN/skills#permission-checks-on-injected-commands)介绍了在各权限模式下哪些结果会导致中止,以及如何使用 `allowed-tools` 预先批准命令

3416* ``Skill <name> requires bash (`shell: bash` in frontmatter) but Git Bash was not found``:该 skill 的 frontmatter 要求使用 bash,但机器上没有 bash。请安装 Git for Windows,或将 frontmatter 改为 `shell: powershell`。请参阅[注入命令的运行方式](/docs/zh-CN/skills#how-injected-commands-run)3426* ``Skill <name> requires bash (`shell: bash` in frontmatter) but Git Bash was not found``:该 skill 的 frontmatter 要求使用 bash,但机器上没有 bash。请安装 Git for Windows,或将 frontmatter 改为 `shell: powershell`。请参阅[注入命令的运行方式](/docs/zh-CN/skills#how-injected-commands-run)

3417 3427 

3418**解决方法:**3428**解决方法:**


3562 3572 

3563* **您没有传入基础分支**:Claude Code 与仓库的默认分支进行了比较,并建议您显式传入基础分支,如上例所示3573* **您没有传入基础分支**:Claude Code 与仓库的默认分支进行了比较,并建议您显式传入基础分支,如上例所示

3564* **您传入的基础分支已存在于您的克隆中**:提示为 ``Make sure <branch> exists locally or on origin (try `git fetch origin <branch>`)``3574* **您传入的基础分支已存在于您的克隆中**:提示为 ``Make sure <branch> exists locally or on origin (try `git fetch origin <branch>`)``

3565* **您传入的基础分支不在您的克隆中**:Claude Code 在比较前已从 origin fetch 了该分支。提示为 ``<branch> was fetched from origin but shares no history with HEAD. If another branch is your real base, pass it explicitly (`/code-review ultra <branch>`)``;当 Claude Code 无法判断您的克隆是否为浅克隆时,它会改为建议 `git fetch --unshallow origin`。在 v2.1.221 之前,对于每个被 fetch 的基础分支,提示都会建议 `git fetch --unshallow origin`,而在完整克隆上,该命令会以 `fatal: --unshallow on a complete repository does not make sense` 失败。3575* **您传入的基础分支不在您的克隆中**:Claude Code 在比较之前从 origin fetch 了该分支。提示为 ``<branch> was fetched from origin but shares no history with HEAD. If another branch is your real base, pass it explicitly (`/code-review ultra <branch>`)``;当 Claude Code 无法判断您的克隆是否为浅克隆时,它会改为建议 `git fetch --unshallow origin`。在 v2.1.221 之前,对于每个被 fetch 的基础分支,提示都会建议 `git fetch --unshallow origin`,而在完整克隆上,该命令会以 `fatal: --unshallow on a complete repository does not make sense` 失败。

3566 3576 

3567**解决方法:**3577**解决方法:**

3568 3578 


3756No conversation found with session ID: <session-id>3766No conversation found with session ID: <session-id>

3757```3767```

3758 3768 

3759显示该消息后,Claude Code 以退出码 1 退出。Claude Code 会[先搜索当前项目,然后搜索这台机器上的所有其他项目](/docs/zh-CN/sessions#resume-a-session)来查找该 ID。在 v2.1.223 之前,查找仅限于当前项目目录及其 git worktree,因此需要从该会话最后工作的目录中进行恢复。3769Claude Code 在显示该消息后以退出码 1 退出。Claude Code 会[先在当前项目中查找该 ID,然后在本机上的所有其他项目中查找](/docs/zh-CN/sessions#where-the-session-picker-looks)。在 v2.1.223 之前,查找仅限于当前项目目录及其 git worktree,因此需要从该会话最后工作的目录中恢复。

3760 3770 

3761常见原因:3771常见原因:

3762 3772 


3816 3826 

3817* 在不带这些限制启动的会话中运行 `/tui fullscreen`,或运行 `/tui default` 切换回来。Claude Code 会在那里保存 [`tui` 设置](/docs/zh-CN/settings-reference#tui)3827* 在不带这些限制启动的会话中运行 `/tui fullscreen`,或运行 `/tui default` 切换回来。Claude Code 会在那里保存 [`tui` 设置](/docs/zh-CN/settings-reference#tui)

3818 3828 

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

3830 Claude Code couldn't restart

3831</h3>

3832 

3833Claude Code 正在重启,例如在您运行 [`/tui`](/docs/zh-CN/fullscreen#enable-fullscreen-rendering) 后切换到全屏渲染或从全屏渲染切换回来。它关闭了会话,但无法启动新进程,因此打印了以下消息并以状态 1 退出:

3834 

3835```text theme={null}

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

3837```

3838 

3839当重启时没有可重新打开的对话,例如 `/tui` 是您在新会话中的第一个输入时,消息为 `Claude Code couldn't restart. Start Claude Code again.`

3840 

3841**解决方法:**

3842 

3843* 在 shell 中从同一目录再次运行 `claude`。如果消息表示您的对话已保存,请在新会话中运行 [`/resume`](/docs/zh-CN/sessions#resume-a-session) 并选择该对话

3844* 如果重启持续失败,请在 shell 中使用 [`claude --debug-file claude-debug.log`](/docs/zh-CN/cli-reference#cli-flags) 启动 Claude Code。如果从该会话重启失败,您启动时所在目录中的 `claude-debug.log` 会记录一行包含操作系统错误的 `Failed to relaunch:`。[报告问题](#report-an-error)时请附上该行

3845 

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

3820 无法打开 Claude Desktop3847 无法打开 Claude Desktop

3821</h3>3848</h3>


4593* 或使用设置为具有空间的文件系统上的目录的 [`CLAUDE_CODE_TMPDIR`](/docs/zh-CN/env-vars)重启 Claude Code4620* 或使用设置为具有空间的文件系统上的目录的 [`CLAUDE_CODE_TMPDIR`](/docs/zh-CN/env-vars)重启 Claude Code

4594* 然后让 Claude 再次运行该命令。它打印的输出已丢失,未被截断4621* 然后让 Claude 再次运行该命令。它打印的输出已丢失,未被截断

4595 4622 

4623<h3 id="file-is-not-valid-utf-8">

4624 File is not valid UTF-8

4625</h3>

4626 

4627Claude 对一个字节无法解码为 UTF-8 的文件使用了 Edit 或 NotebookEdit 工具,Claude Code 拒绝了该更改。没有写入任何内容,因此文件保持原样。这些工具会将整个文件以 UTF-8 保存回去,这会将它们无法解码的每个字节都变成替换字符 `U+FFFD`。消息出现在工具结果中:

4628 

4629```text wrap theme={null}

4630File is not valid UTF-8. It may use a legacy encoding such as Windows-1252, Shift-JIS or GBK, or be binary. This tool saves the whole file as UTF-8, which would replace every byte it cannot decode with U+FFFD. Nothing was written. Make the change with a shell command that reads and writes the file in its own encoding, or ask the user whether to convert the file to UTF-8 first.

4631```

4632 

4633本应为 UTF-8 的文件只要包含哪怕一个无效字节序列,也会收到此消息,因为该检查针对的是文件的全部字节。

4634 

4635**应该做什么:**

4636 

4637* 要保持文件当前的编码,请让 Claude 按照消息的指示,使用以该编码读写文件的 shell 命令进行更改

4638* 要继续使用 Edit 工具编辑该文件,请将其转换为 UTF-8,或修复本应为 UTF-8 的文件中的无效字节,然后要求 Claude 再次进行编辑

4639 

4640在 v2.1.296 之前,Edit 和 NotebookEdit 会应用此类编辑,并将无法解码的每个字节保存为 `U+FFFD`。如果您使用的是这些版本,请更新 Claude Code。

4641 

4596<h3 id="the-source-file-is-not-valid-utf-8-text">4642<h3 id="the-source-file-is-not-valid-utf-8-text">

4597 源文件不是有效的 UTF-8 文本4643 源文件不是有效的 UTF-8 文本

4598</h3>4644</h3>


4752 命令被 worktree 隔离检查阻止4798 命令被 worktree 隔离检查阻止

4753</h3>4799</h3>

4754 4800 

4755Claude 在[在 worktree 中隔离的会话](/docs/zh-CN/worktrees#how-claude-code-enforces-isolation)中运行了 Bash 或 Monitor 命令,Claude Code 因以下两个原因之一拒绝了它:4801Claude 在[在 worktree 中隔离的会话](/docs/zh-CN/worktrees#how-claude-code-enforces-isolation)中运行了 Bash、[PowerShell](/docs/zh-CN/tools-reference#powershell-tool) 或 [Monitor](/docs/zh-CN/tools-reference#monitor-tool) 命令,Claude Code 因以下原因之一拒绝了它:

4756 4802 

4757* 该命令将 git 指向主检出。4803* 该命令将在主检出或另一个 worktree 中运行。消息会说明其工作目录 `resolved to the shared checkout` 或 `is in a different worktree`。

4758* Claude Code 无法从命令文本验证该命令运行的任何 git 都保留在 worktree 内。从不命名 git 的命令仍然可能因此原因被拒绝,因为展开变量间接寻址(如 `${!name}`)或运行 Bash 函数替换(如 `${ command; }`)会产生在运行时本身可能是命令的值。4804* Bash 或 Monitor 命令将 git 指向主检出。

4805* Claude Code 无法从 Bash 或 Monitor 命令的文本验证该命令运行的任何 git 都保留在 worktree 内。从不命名 git 的命令仍然可能因此原因被拒绝,因为展开变量间接寻址(如 `${!name}`)或运行 Bash 函数替换(如 `${ command; }`)会产生在运行时本身可能是命令的值。

4759 4806 

4760消息的中间命名无法验证的内容:4807消息会说 `is isolated in the worktree <path>, but this command`,后跟原因,例如 Claude Code 无法验证其文本的命令:

4761 4808 

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

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


4765 4812 

4766**要做什么:**4813**要做什么:**

4767 4814 

4768* 通常什么都不做:Claude 读取消息并按照其最后一句要求的方式重写命令4815* **git 指向主检出,或命令文本无法验证**:什么都不用做。Claude 读取消息并按照其最后一句要求的方式重写命令。如果您要求的命令因其文本中的展开而持续被拒绝,请按字面拼写被标记的值,并从 worktree 内将 git 作为独立的纯命令运行

4769* 如果您要求的命令继续被拒绝,按字面拼写标记的值:用其值替换间接寻址或替换,并从 worktree 内作为其自己的纯命令运行 git

4770* 要有意对主检出采取行动,在会话外的终端中自己运行该命令4816* 要有意对主检出采取行动,在会话外的终端中自己运行该命令

4771 4817 

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


4946* 或使用 `--agent <name>` 恢复,命名确实存在的 Agent,以改为作为该 Agent 运行会话4992* 或使用 `--agent <name>` 恢复,命名确实存在的 Agent,以改为作为该 Agent 运行会话

4947* 如果 Agent 是项目范围的,您还没有信任会话的原始目录,在那里运行一次 Claude Code,接受信任对话框,然后再次恢复4993* 如果 Agent 是项目范围的,您还没有信任会话的原始目录,在那里运行一次 Claude Code,接受信任对话框,然后再次恢复

4948 4994 

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

4996 此会话在其下一次 /loop 唤醒到期后才重启

4997</h3>

4998 

4999[后台会话](/docs/zh-CN/agent-view)中的[自定节奏 `/loop`](/docs/zh-CN/scheduled-tasks#let-claude-choose-the-interval) 已停止。会话的进程在循环等待下一次唤醒时结束,而该唤醒在会话的[下一个进程](/docs/zh-CN/agent-view#the-supervisor-process)启动之前就已到期。错过的唤醒不会延迟触发。通知会说明会话重启时该唤醒已逾期多久:

5000 

5001```text theme={null}

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

5003```

5004 

5005在 v2.1.295 之前,循环在这种情况下会停止且不显示通知。

5006 

5007**要做什么:**

5008 

5009* 要继续循环,请[回复该会话](/docs/zh-CN/agent-view#peek-and-reply)并说明这一点,例如 `keep the loop running`。Claude 会连同您的回复一起读取通知,并可以安排下一次唤醒

5010* 如果您已不再需要该循环,则无需任何操作。它已经停止

5011 

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

4950 CLAUDE\_CODE\_PROCESS\_WRAPPER 启动器错误5013 CLAUDE\_CODE\_PROCESS\_WRAPPER 启动器错误

4951</h3>5014</h3>


5343Claude Code 以这种方式拒绝的路径包括:5406Claude Code 以这种方式拒绝的路径包括:

5344 5407 

5345* UNC 共享,例如 `\\server\share`5408* UNC 共享,例如 `\\server\share`

5346* 自动挂载路径,例如 `/net/<host>`,除非您从该主机的自动挂载下的目录启动了 Claude Code5409* 自动挂载路径,例如 `/net/<host>`,除非您从该主机的自动挂载下的目录启动了 Claude Code。对该自动挂载下的读取仍会经过[网络路径检查](/docs/zh-CN/permissions#network-paths)。

5347* 通过符号链接或连接点到达网络位置的本地路径5410* 通过符号链接或连接点到达网络位置的本地路径

5348 5411 

5349映射的驱动器号和 `\\wsl$` 路径不计为网络路径。5412映射的驱动器号和 `\\wsl$` 路径不计为网络路径。

Details

27| Claude Security | ✅ 支持 | 在 [claude.ai/security](https://claude.ai/security) 为 Enterprise 计划提供公开测试版 |27| Claude Security | ✅ 支持 | 在 [claude.ai/security](https://claude.ai/security) 为 Enterprise 计划提供公开测试版 |

28| Teleport 会话 | ✅ 支持 | 使用 `--teleport` 在云和终端之间移动会话 |28| Teleport 会话 | ✅ 支持 | 使用 `--teleport` 在云和终端之间移动会话 |

29| 插件市场 | ✅ 支持 | 凭证要求因表面而异。请参阅 [GHES 上的插件市场](#plugin-marketplaces-on-ghes) |29| 插件市场 | ✅ 支持 | 凭证要求因表面而异。请参阅 [GHES 上的插件市场](#plugin-marketplaces-on-ghes) |

30| 贡献指标 | ✅ 支持 | 通过 webhook 传递到 [分析仪表板](/docs/zh-CN/analytics) |30| 贡献指标 | ❌ 不支持 | 需要托管在 github.com 上的仓库。[分析仪表板](/docs/zh-CN/analytics) 仍会显示 GHES 仓库中工作的使用指标 |

31| GitHub Actions | ✅ 支持 | 需要手动工作流设置;`/install-github-app` 仅适用于 github.com |31| GitHub Actions | ✅ 支持 | 需要手动工作流设置;`/install-github-app` 仅适用于 github.com |

32| GitHub MCP server | ❌ 不支持 | GitHub MCP server 不适用于 GHES 实例 |32| GitHub MCP server | ❌ 不支持 | GitHub MCP server 不适用于 GHES 实例 |

33 33 


56 从您的 GHES 实例上的 GitHub App 页面,在您希望 Claude 访问的仓库或组织上安装应用。您可以从一个子集开始,稍后再添加更多。56 从您的 GHES 实例上的 GitHub App 页面,在您希望 Claude 访问的仓库或组织上安装应用。您可以从一个子集开始,稍后再添加更多。

57 </Step>57 </Step>

58 58 

59 <Step title="启用功能">59 <Step title="启用 Code Review">

60 转到 [claude.ai/admin-settings/claude-code](https://claude.ai/admin-settings/claude-code),使用与 github.com 相同的配置为您的 GHES 仓库启用 [Code Review](/docs/zh-CN/code-review#set-up-code-review) 和[贡献指标](/docs/zh-CN/analytics#enable-contribution-metrics)。60 转到 [claude.ai/admin-settings/claude-code](https://claude.ai/admin-settings/claude-code),使用与 github.com 相同的配置为您的 GHES 仓库启用 [Code Review](/docs/zh-CN/code-review#set-up-code-review)。

61 </Step>61 </Step>

62</Steps>62</Steps>

63 63 


65 GitHub App 权限65 GitHub App 权限

66</h3>66</h3>

67 67 

68清单使用以下权限和 webhook 事件配置 GitHub App,这些权限和事件共同涵盖云端会话、Code Review、Claude Security、插件市场和贡献指标:68清单使用以下权限和 webhook 事件配置 GitHub App,这些权限和事件共同涵盖云端会话、Code Review、Claude Security 和插件市场:

69 69 

70| 权限 | 访问 | 用途 |70| 权限 | 访问 | 用途 |

71| :- | :- | :- |71| :- | :- | :- |


270* [网络上的 Claude Code](/docs/zh-CN/claude-code-on-the-web):在云基础设施上运行 Claude Code 会话270* [网络上的 Claude Code](/docs/zh-CN/claude-code-on-the-web):在云基础设施上运行 Claude Code 会话

271* [代码审查](/docs/zh-CN/code-review):自动化 PR 审查271* [代码审查](/docs/zh-CN/code-review):自动化 PR 审查

272* [插件市场](/docs/zh-CN/plugins/host-marketplace):构建和分发插件目录272* [插件市场](/docs/zh-CN/plugins/host-marketplace):构建和分发插件目录

273* [分析](/docs/zh-CN/analytics):跟踪使用情况和贡献指标273* [分析](/docs/zh-CN/analytics):跟踪整个组织的 Claude Code 使用情况

274* [托管设置](/docs/zh-CN/settings):组织范围的策略配置274* [托管设置](/docs/zh-CN/settings):组织范围的策略配置

275* [网络配置](/docs/zh-CN/network-config):防火墙和 IP 白名单要求275* [网络配置](/docs/zh-CN/network-config):防火墙和 IP 白名单要求

headless.md +43 −41

Details

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当 stderr 是终端且运行已等待五秒时,Claude Code 会向 stderr 打印一行以 `Waiting for background work to finish` 开头的内容,并列出正在等待的工作。使用 [`json` 或 `stream-json` 输出](#get-structured-output) 时,该行仅在 stdout 不是终端时才会打印,因此您的脚本读取的 JSON 中永远不会包含它。

93 

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

93 95 

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


116 示例118 示例

117</h2>119</h2>

118 120 

119这些示例突出了常见的 CLI 模式。对于命名文件(如 `auth.py` 或 `build-error.txt`)的命令,请替换来自您自己项目的文件。在 CI 或其他脚本环境中,添加 [`--bare`](#start-faster-with-bare-mode) 以便 Claude Code 启动时不加载主机的 hooks、plugins、auto memory 或 `CLAUDE.md`。121这些示例突出了常见的 CLI 模式。对于命名文件(如 `auth.py` 或 `build-error.txt`)的命令,请替换为您自己项目中的文件。在 CI 或其他脚本环境中,添加 [`--bare`](#start-faster-with-bare-mode),以便 Claude Code 启动时不加载主机的 hook、插件、自动记忆或 `CLAUDE.md`。

120 122 

121<h3 id="pipe-data-through-claude">123<h3 id="pipe-data-through-claude">

122 通过 Claude 管道传输数据124 通过 Claude 管道传输数据


130cat build-error.txt | claude -p 'concisely explain the root cause of this build error' > output.txt132cat build-error.txt | claude -p 'concisely explain the root cause of this build error' > output.txt

131```133```

132 134 

133使用 `--output-format json`,响应有效负载包括 `total_cost_usd` 和按模型的成本分解,因此脚本调用者可以跟踪支出而无需查询 [使用情况仪表板](/docs/zh-CN/costs)。当您使用 `--continue` 或 `--resume` 继续较早的对话时,运行报告对话的整体总计,[包括较早运行的支出](/docs/zh-CN/agent-sdk/cost-tracking#accumulate-costs-across-multiple-calls)。两个数字都是 [客户端估计](/docs/zh-CN/agent-sdk/cost-tracking),可能与您的实际账单不同。135使用 `--output-format json` 时,响应的 JSON 数据包括 `total_cost_usd` 和按模型的成本分解,因此脚本调用者可以跟踪支出而无需查询 [使用情况仪表板](/docs/zh-CN/costs)。当您使用 `--continue` 或 `--resume` 继续较早的对话时,运行报告对话的整体总计,[包括较早运行的支出](/docs/zh-CN/agent-sdk/cost-tracking#accumulate-costs-across-multiple-calls)。两个数字都是 [客户端估计](/docs/zh-CN/agent-sdk/cost-tracking),可能与您的实际账单不同。

134 136 

135<Note>137<Note>

136 管道 stdin 的上限为 10MB。如果超过上限,Claude Code 会以清晰的错误和非零状态退出。要处理更大的输入,请将内容写入文件并在提示中引用文件路径,而不是管道传输它。138 管道 stdin 的上限为 10MB。如果超过上限,Claude Code 会以清晰的错误和非零状态退出。要处理更大的输入,请将内容写入文件并在提示词中引用文件路径,而不是管道传输它。

137</Note>139</Note>

138 140 

139如果 Claude Code 无法读取 stdin,例如因为启动它的进程断开了其端点,Claude Code 会向 stderr 打印警告并继续使用命令行中的提示。在 v2.1.211 之前,Windows 上不可读的 stdin 会导致会话崩溃或无输出地静默退出。141如果 Claude Code 无法读取 stdin,例如因为启动它的进程断开了其端点,Claude Code 会向 stderr 打印警告并继续使用命令行中的提示词。在 v2.1.211 之前,Windows 上不可读的 stdin 会导致会话崩溃或无输出地静默退出。

140 142 

141<h3 id="add-claude-to-a-build-script">143<h3 id="add-claude-to-a-build-script">

142 将 Claude 添加到构建脚本144 将 Claude 添加到构建脚本


172claude -p "Summarize this project" --output-format json174claude -p "Summarize this project" --output-format json

173```175```

174 176 

175要获得符合特定架构的输出,请使用 `--output-format json` 与 `--json-schema` 和 [JSON Schema](https://json-schema.org/) 定义。响应包括关于请求的元数据(会话 ID、使用情况等),结构化输出在 `structured_output` 字段中。177要获得符合特定 schema 的输出,请使用 `--output-format json` 与 `--json-schema` 和 [JSON Schema](https://json-schema.org/) 定义。响应包括关于请求的元数据(会话 ID、使用情况等),结构化输出在 `structured_output` 字段中。

176 178 

177此示例从 auth.py 中提取函数名称并将其作为字符串数组返回:179此示例从 auth.py 中提取函数名称并将其作为字符串数组返回:

178 180 


182 --json-schema '{"type":"object","properties":{"functions":{"type":"array","items":{"type":"string"}}},"required":["functions"]}'184 --json-schema '{"type":"object","properties":{"functions":{"type":"array","items":{"type":"string"}}},"required":["functions"]}'

183```185```

184 186 

185如果该值不是有效的 JSON Schema,`claude` 会以 `Error: --json-schema is not a valid JSON Schema` 退出,后跟验证器的诊断。Claude Code 接受使用 `format` 关键字的架构,例如 `"format": "email"`,但将 `format` 视为注释,不强制执行它。在 v2.1.205 之前,Claude Code 会静默忽略无效的架构并返回非结构化文本,并将任何包含 `format` 的架构视为无效。187如果该值不是有效的 JSON Schema,`claude` 会以 `Error: --json-schema is not a valid JSON Schema` 退出,后跟验证器的诊断。Claude Code 接受使用 `format` 关键字的 schema,例如 `"format": "email"`,但将 `format` 视为注释,不强制执行它。在 v2.1.205 之前,Claude Code 会静默忽略无效的 schema 并返回非结构化文本,并将任何包含 `format` 的 schema 视为无效。

186 188 

187<Tip>189<Tip>

188 使用 [jq](https://jqlang.org/) 之类的工具来解析响应并提取特定字段:190 使用 [jq](https://jqlang.org/) 之类的工具来解析响应并提取特定字段:


203 流式传输响应205 流式传输响应

204</h3>206</h3>

205 207 

206使用 `--output-format stream-json` 与 `--verbose` 和 `--include-partial-messages` 来接收生成的令牌。每一行都是代表一个事件的 JSON 对象:208使用 `--output-format stream-json` 与 `--verbose` 和 `--include-partial-messages` 来接收生成的 token。每一行都是代表一个事件的 JSON 对象:

207 209 

208```bash theme={null}210```bash theme={null}

209claude -p "Explain recursion" --output-format stream-json --verbose --include-partial-messages211claude -p "Explain recursion" --output-format stream-json --verbose --include-partial-messages


223对于具有回调和消息对象的编程流式传输,请参阅 Agent SDK 文档中的 [实时流式传输响应](/docs/zh-CN/agent-sdk/streaming-output)。225对于具有回调和消息对象的编程流式传输,请参阅 Agent SDK 文档中的 [实时流式传输响应](/docs/zh-CN/agent-sdk/streaming-output)。

224 226 

225<h4 id="follow-subagent-messages">227<h4 id="follow-subagent-messages">

226 跟踪 subagent 消息228 跟踪子代理消息

227</h4>229</h4>

228 230 

229来自[子代理](/docs/zh-CN/sub-agents)以及[在子代理中运行](/docs/zh-CN/skills#run-skills-in-a-subagent)的 skill 的消息在流中显示为 `assistant` 和 `user` 消息。其 `parent_tool_use_id` 字段表明每条消息属于哪次运行。来自主对话的消息在该字段中为 `null`。231来自[子代理](/docs/zh-CN/sub-agents)以及[在子代理中运行](/docs/zh-CN/skills#run-skills-in-a-subagent)的 skill 的消息在流中显示为 `assistant` 和 `user` 消息。其 `parent_tool_use_id` 字段表明每条消息属于哪次运行。来自主对话的消息在该字段中为 `null`。


257 处理 API 重试259 处理 API 重试

258</h4>260</h4>

259 261 

260当 API 请求因可重试错误而失败时,Claude Code 在重试前发出 `system/api_retry` 事件。在 v2.1.246 或更高版本上,当 `401` 或 `403` 拒绝 [`apiKeyHelper`](/docs/zh-CN/settings-reference#apikeyhelper) 凭证时,Claude Code 会静默进行前两次重试,没有事件,然后从第三次连续重试开始照常发出事件。静默重试仍然计入 `attempt`。您可以使用该事件在您自己的界面中显示重试进度。262当 API 请求因可重试错误而失败时,Claude Code 在重试前发出 `system/api_retry` 事件。在 v2.1.246 或更高版本上,当 `401` 或 `403` 拒绝 [`apiKeyHelper`](/docs/zh-CN/settings-reference#apikeyhelper) 凭据时,Claude Code 会静默进行前两次重试,没有事件,然后从第三次连续重试开始照常发出事件。静默重试仍然计入 `attempt`。您可以使用该事件在您自己的界面中显示重试进度。

261 263 

262| 字段 | 类型 | 描述 |264| 字段 | 类型 | 描述 |

263| - | - | - |265| - | - | - |


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

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

267| `max_retries` | 整数 | 针对此失败原因允许的总重试次数 |269| `max_retries` | 整数 | 针对此失败原因允许的总重试次数 |

268| `retry_delay_ms` | 整数 | 毫秒直到下一次尝试 |270| `retry_delay_ms` | 整数 | 距下一次尝试的毫秒数 |

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

270| `no_response` | 对象,可选 | 仅当失败的尝试 [未及时获得响应头](/docs/zh-CN/errors#no-response-from-api) 时存在。`waited_ms` 是该尝试等待的时间,`retry_wait_ms` 是重试将等待的时间。需要 Claude Code v2.1.261 或更高版本 |272| `no_response` | 对象,可选 | 仅当失败的尝试 [未及时获得响应头](/docs/zh-CN/errors#no-response-from-api) 时存在。`waited_ms` 是该尝试等待的时间,`retry_wait_ms` 是重试将等待的时间。需要 Claude Code v2.1.261 或更高版本 |

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` |273| `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` |

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


276 读取会话元数据278 读取会话元数据

277</h4>279</h4>

278 280 

279`system/init` 事件报告会话元数据,包括模型、工具、MCP 服务器和加载的 plugins。它是流中的第一个事件,除非启动事件在其之前:281`system/init` 事件报告会话元数据,包括模型、工具、MCP 服务器和加载的插件。它是流中的第一个事件,除非启动事件在其之前:

280 282 

281* `plugin_install` 事件,当设置了 [`CLAUDE_CODE_SYNC_PLUGIN_INSTALL`](/docs/zh-CN/env-vars) 时。283* `plugin_install` 事件,当设置了 [`CLAUDE_CODE_SYNC_PLUGIN_INSTALL`](/docs/zh-CN/env-vars) 时。

282* [`hook_started`、`hook_progress` 和 `hook_response` 事件](/docs/zh-CN/agent-sdk/typescript#sdkhookstartedmessage),当配置的 [`SessionStart`](/docs/zh-CN/hooks#sessionstart) 或 [`Setup`](/docs/zh-CN/hooks#setup) hook 运行时。这些事件在 hook 生成时流式传输。Claude Code v2.1.169 至 v2.1.203 在 hook 完成后以一个批次传递它们,仍然在 `system/init` 之前;v2.1.204 恢复了实时传递。284* [`hook_started`、`hook_progress` 和 `hook_response` 事件](/docs/zh-CN/agent-sdk/typescript#sdkhookstartedmessage),当配置的 [`SessionStart`](/docs/zh-CN/hooks#sessionstart) 或 [`Setup`](/docs/zh-CN/hooks#setup) hook 运行时。这些事件在 hook 生成时流式传输。Claude Code v2.1.169 至 v2.1.203 在 hook 完成后以一个批次传递它们,仍然在 `system/init` 之前;v2.1.204 恢复了实时传递。


284该事件还携带一个可选的 `capabilities` 字符串数组,命名此 Claude Code 版本实现的协议行为,例如 `interrupt_receipt_v1` 或 `interrupt_cancel_queued_v1`。检查它以进行功能检测,而不是比较版本字符串,并忽略您不认识的值。该字段需要 Claude Code v2.1.205 或更高版本,在早期版本中不存在。有关功能列表,请参阅 [`SDKSystemMessage`](/docs/zh-CN/agent-sdk/typescript#sdksystemmessage)。286该事件还携带一个可选的 `capabilities` 字符串数组,命名此 Claude Code 版本实现的协议行为,例如 `interrupt_receipt_v1` 或 `interrupt_cancel_queued_v1`。检查它以进行功能检测,而不是比较版本字符串,并忽略您不认识的值。该字段需要 Claude Code v2.1.205 或更高版本,在早期版本中不存在。有关功能列表,请参阅 [`SDKSystemMessage`](/docs/zh-CN/agent-sdk/typescript#sdksystemmessage)。

285 287 

286<h4 id="fail-ci-when-a-plugin-or-mcp-server-doesn’t-load">288<h4 id="fail-ci-when-a-plugin-or-mcp-server-doesn’t-load">

287 当 plugin 或 MCP 服务器未加载时使 CI 失败289 当插件或 MCP 服务器未加载时使 CI 失败

288</h4>290</h4>

289 291 

290使用 `system/init` 事件中的 plugin 字段来捕获未加载的 plugin:292使用 `system/init` 事件中的插件字段来捕获未加载的插件:

291 293 

292| 字段 | 类型 | 描述 |294| 字段 | 类型 | 描述 |

293| - | - | - |295| - | - | - |

294| `plugins` | 数组 | 成功加载的 plugins,每个都有 `name` 和 `path` |296| `plugins` | 数组 | 成功加载的插件,每个都有 `name` 和 `path` |

295| `plugin_errors` | 数组 | plugin 加载时错误,每个都有 `plugin`、`type` 和 `message`。包括不满足的依赖版本和 `--plugin-dir` 加载失败,例如缺失路径或无效存档。未加载的 plugin 从 `plugins` 中缺失。当没有错误时,该键被省略 |297| `plugin_errors` | 数组 | 插件加载时错误,每个都有 `plugin`、`type` 和 `message`。包括不满足的依赖版本和 `--plugin-dir` 加载失败,例如缺失路径或无效存档。未加载的插件不会出现在 `plugins` 中。当没有错误时,该键被省略 |

296 298 

297当 `--plugin-dir` 目录或存档本身加载失败时,其 `plugin_errors` 条目包括解析的绝对路径作为 `path`。使用它来判断哪个 `--plugin-dir` 值失败。`path` 字段需要 Claude Code v2.1.283 或更高版本。299当 `--plugin-dir` 目录或存档本身加载失败时,其 `plugin_errors` 条目包括解析的绝对路径作为 `path`。使用它来判断哪个 `--plugin-dir` 值失败。`path` 字段需要 Claude Code v2.1.283 或更高版本。

298 300 

299以相同的方式使用 MCP 服务器字段。当您使用 `-p` 传递 [`--mcp-config`](/docs/zh-CN/cli-reference#cli-flags) 时,Claude Code 在运行第一轮之前等待仍然待处理的服务器,最多等待 [`MCP_TIMEOUT`](/docs/zh-CN/env-vars) 启动超时,默认为 30 秒。具有 [缓存工具列表](/docs/zh-CN/agent-sdk/mcp#connection-timing) 的远程服务器跳过等待,在 `system/init` 中显示 `pending`,并在其第一次工具调用时连接。等待需要 Claude Code v2.1.221 或更高版本。301以相同的方式使用 MCP 服务器字段。当您使用 `-p` 传递 [`--mcp-config`](/docs/zh-CN/cli-reference#cli-flags) 时,Claude Code 在运行第一轮之前等待仍然待处理的服务器,最多等待 [`MCP_TIMEOUT`](/docs/zh-CN/env-vars) 启动超时时间,默认为 30 秒。具有 [缓存工具列表](/docs/zh-CN/agent-sdk/mcp#connection-timing) 的远程服务器跳过等待,在 `system/init` 中显示 `pending`,并在其第一次工具调用时连接。在 [自托管环境](/docs/zh-CN/self-hosted-environments-configuration#connection-timing) 中,改为适用较短的等待时间。等待需要 Claude Code v2.1.221 或更高版本。

300 302 

301Claude Code 在启动时验证每个 `--mcp-config` 条目并跳过验证失败的条目,例如没有 `type` 的 `url` 条目。运行继续并干净地退出,因此检查这些字段以捕获从未加载的服务器:303Claude Code 在启动时验证每个 `--mcp-config` 条目并跳过验证失败的条目,例如没有 `type` 的 `url` 条目。运行继续并干净地退出,因此检查这些字段以捕获从未加载的服务器:

302 304 

303| 字段 | 类型 | 描述 |305| 字段 | 类型 | 描述 |

304| - | - | - |306| - | - | - |

305| `mcp_servers` | 数组 | 会话中的 MCP 服务器,每个都有 `name` 和 `status` |307| `mcp_servers` | 数组 | 会话中的 MCP 服务器,每个都有 `name` 和 `status` |

306| `mcp_server_errors` | 数组 | `--mcp-config` 条目被配置验证跳过,每个都有 `name`、`type` 和 `message`。`type` 是跳过类别,例如 `unknown_type`、`url_missing_type`、`invalid_config` 或 `reserved_name`;将您不认识的值视为通用跳过。受影响的服务器从 `mcp_servers` 中缺失。当没有错误时,该键被省略,因此 CI 门可以在非空数组上失败。需要 Claude Code v2.1.219 或更高版本 |308| `mcp_server_errors` | 数组 | 被配置验证跳过的 `--mcp-config` 条目,每个都有 `name`、`type` 和 `message`。`type` 是跳过类别,例如 `unknown_type`、`url_missing_type`、`invalid_config` 或 `reserved_name`;将您不认识的值视为通用跳过。受影响的服务器不会出现在 `mcp_servers` 中。当没有错误时,该键被省略,因此 CI 门可以在数组非空时失败。需要 Claude Code v2.1.219 或更高版本 |

307 309 

308当您在终端中手动运行命令时,Claude Code 也会向 stderr 打印启动警告,例如 `Warning: 1 MCP server skipped due to invalid config:`,后跟每个跳过条目的原因。当您重定向 stderr 或当 CI 运行器或 SDK 主机等程序捕获它时,Claude Code 不打印警告,仅在 `mcp_server_errors` 字段中报告跳过的条目。警告需要 Claude Code v2.1.219 或更高版本。310当您在终端中手动运行命令时,Claude Code 也会向 stderr 打印启动警告,例如 `Warning: 1 MCP server skipped due to invalid config:`,后跟每个跳过条目的原因。当您重定向 stderr 或当 CI 运行器或 SDK 主机等程序捕获它时,Claude Code 不打印警告,仅在 `mcp_server_errors` 字段中报告跳过的条目。警告需要 Claude Code v2.1.219 或更高版本。

309 311 

310<h4 id="track-plugin-installs">312<h4 id="track-plugin-installs">

311 跟踪 plugin 安装313 跟踪插件安装

312</h4>314</h4>

313 315 

314当设置了 [`CLAUDE_CODE_SYNC_PLUGIN_INSTALL`](/docs/zh-CN/env-vars) 时,Claude Code 在第一轮之前安装市场 plugins 时发出 `system/plugin_install` 事件。使用这些在您自己的 UI 中显示安装进度。316当设置了 [`CLAUDE_CODE_SYNC_PLUGIN_INSTALL`](/docs/zh-CN/env-vars) 时,Claude Code 在第一轮之前安装市场插件时发出 `system/plugin_install` 事件。使用这些事件在您自己的 UI 中显示安装进度。

315 317 

316| 字段 | 类型 | 描述 |318| 字段 | 类型 | 描述 |

317| - | - | - |319| - | - | - |

318| `type` | `"system"` | 消息类型 |320| `type` | `"system"` | 消息类型 |

319| `subtype` | `"plugin_install"` | 将其标识为 plugin 安装事件 |321| `subtype` | `"plugin_install"` | 将其标识为插件安装事件 |

320| `status` | `"started"`、`"installed"`、`"failed"` 或 `"completed"` | `started` 和 `completed` 括住整体安装;`installed` 和 `failed` 报告单个市场 |322| `status` | `"started"`、`"installed"`、`"failed"` 或 `"completed"` | `started` 和 `completed` 标记整体安装的开始和结束;`installed` 和 `failed` 报告单个市场 |

321| `name` | 字符串,可选 | 市场名称,在 `installed` 和 `failed` 上存在 |323| `name` | 字符串,可选 | 市场名称,在 `installed` 和 `failed` 上存在 |

322| `error` | 字符串,可选 | 失败消息,在 `failed` 上存在 |324| `error` | 字符串,可选 | 失败消息,在 `failed` 上存在 |

323| `uuid` | 字符串 | 唯一事件标识符 |325| `uuid` | 字符串 | 唯一事件标识符 |


327 自动批准工具329 自动批准工具

328</h3>330</h3>

329 331 

330使用 `--allowedTools` 让 Claude 使用某些工具而无需提示。列出 `Read` 和 `Edit` 让 Claude 读取和编辑文件而无需请求权限。列出 `Bash` 对 shell 命令执行相同操作,除了在 [auto 模式](/docs/zh-CN/permission-modes#how-auto-mode-evaluates-actions) 中启动的运行,其中 Claude Code 删除裸 `Bash` 条目作为广泛允许规则,auto 模式改为评估每个命令。此示例运行测试套件并修复失败,允许这三个工具:332使用 `--allowedTools` 让 Claude 使用某些工具而无需提示。列出 `Read` 和 `Edit` 让 Claude 读取和编辑文件而无需请求权限,但从 [网络路径](/docs/zh-CN/permissions#network-paths) 读取除外。列出 `Bash` 对 shell 命令执行相同操作,但在 [自动模式](/docs/zh-CN/permission-modes#how-auto-mode-evaluates-actions) 中启动的运行除外,此时 Claude Code 会将裸 `Bash` 条目作为宽泛的允许规则丢弃,改由自动模式评估每个命令。此示例运行测试套件并修复失败,列出了这三个工具:

331 333 

332```bash theme={null}334```bash theme={null}

333claude -p "Run the test suite and fix any failures" \335claude -p "Run the test suite and fix any failures" \

334 --allowedTools "Bash,Read,Edit"336 --allowedTools "Bash,Read,Edit"

335```337```

336 338 

337要为整个会话设置基线而不是列出单个工具,请传递 [权限模式](/docs/zh-CN/permission-modes)。对于不设置权限模式的运行,采用 [内置启动权限模式](/docs/zh-CN/permission-modes#which-mode-a-session-starts-in),可能是 `auto`,因此传递您想要的权限模式:339要为整个会话设置基线而不是列出单个工具,请传递 [权限模式](/docs/zh-CN/permission-modes)。对于不设置权限模式的运行,采用 [内置启动权限模式](/docs/zh-CN/permission-modes#which-mode-a-session-starts-in),可能是 `auto`,因此请传递您想要的权限模式:

338 340 

339* **`auto`**:传递 `--permission-mode auto` 以让分类器审查大多数操作而不是您341* **`auto`**:传递 `--permission-mode auto` 以让分类器代替您审查大多数操作

340* **`dontAsk`**:Claude Code 拒绝每个原本会提示的调用,这对于锁定的 CI 运行很有用。在 Manual 模式下无需批准的操作仍会运行,例如工作目录中的文件读取和 [只读命令集](/docs/zh-CN/permissions#read-only-commands),您的 `--allowedTools` 条目或 `permissions.allow` 规则涵盖的操作也是如此。`AskUserQuestion`、连接器工具 [您的组织设置为 `ask`](/docs/zh-CN/mcp#organization-controls-on-connector-tools) 和标记为 [`requiresUserInteraction`](/docs/zh-CN/mcp#require-approval-for-a-specific-tool) 的 MCP 工具即使当允许规则匹配时也被拒绝342* **`dontAsk`**:Claude Code 拒绝每个原本会提示的调用,这对于锁定的 CI 运行很有用。在 Manual 模式下无需批准的操作仍会运行,例如工作目录中的文件读取和 [只读命令集](/docs/zh-CN/permissions#read-only-commands),您的 `--allowedTools` 条目或 `permissions.allow` 规则涵盖的操作也是如此。`AskUserQuestion`、[您的组织设置为 `ask`](/docs/zh-CN/mcp#organization-controls-on-connector-tools) 的连接器工具、标记为 [`requiresUserInteraction`](/docs/zh-CN/mcp#require-approval-for-a-specific-tool) 的 MCP 工具以及 [从网络路径读取](/docs/zh-CN/permissions#network-paths) 即使在允许规则匹配时也会被拒绝

341* **`acceptEdits`**:Claude 写入文件而无需提示,Claude Code 自动批准常见的文件系统命令,例如 `mkdir`、`touch`、`mv` 和 `cp`。[任何模式都不自动批准的操作](/docs/zh-CN/permission-modes#actions-no-mode-auto-approves) 仍然适用。除了只读命令集,其他 shell 命令和网络请求仍然需要 `--allowedTools` 条目或 `permissions.allow` 规则。有关 `acceptEdits` 自动批准的内容,请参阅 [使用 acceptEdits 模式自动批准文件编辑](/docs/zh-CN/permission-modes#auto-approve-file-edits-with-acceptedits-mode)343* **`acceptEdits`**:Claude 写入文件而无需提示,Claude Code 自动批准常见的文件系统命令,例如 `mkdir`、`touch`、`mv` 和 `cp`。[任何模式都不自动批准的操作](/docs/zh-CN/permission-modes#actions-no-mode-auto-approves) 仍然适用。除了只读命令集,其他 shell 命令和网络请求仍然需要 `--allowedTools` 条目或 `permissions.allow` 规则。有关完整列表,请参阅 [`acceptEdits` 自动批准的内容](/docs/zh-CN/permission-modes#auto-approve-file-edits-with-acceptedits-mode)

342 344 

343此示例使用 `acceptEdits` 作为基线应用 lint 修复:345此示例使用 `acceptEdits` 作为基线应用 lint 修复:

344 346 


352 354 

353当没有人可用来回答权限提示时,传递 `--permission-prompts none`,例如在计划的作业中。当您的运行有权限主机时,该标志最重要:具有 [`canUseTool` 回调](/docs/zh-CN/agent-sdk/user-input) 的 Agent SDK 应用,或您使用 [`--permission-prompt-tool`](/docs/zh-CN/cli-reference#cli-flags) 传递的 MCP 工具。没有该标志,您的运行会等待该主机回答每个权限请求。355当没有人可用来回答权限提示时,传递 `--permission-prompts none`,例如在计划的作业中。当您的运行有权限主机时,该标志最重要:具有 [`canUseTool` 回调](/docs/zh-CN/agent-sdk/user-input) 的 Agent SDK 应用,或您使用 [`--permission-prompt-tool`](/docs/zh-CN/cli-reference#cli-flags) 传递的 MCP 工具。没有该标志,您的运行会等待该主机回答每个权限请求。

354 356 

355使用该标志,您的运行不会查询主机或等待它。任何会提示的内容都被拒绝,除非 `PermissionRequest` hook 允许它,Claude 被告知没有人可以批准请求且不要重试它,运行继续。在没有主机的 `-p` 运行中,这些请求无论如何都被拒绝,该标志也告诉 Claude 不要重试它们。权限规则、[`PermissionRequest` hooks](/docs/zh-CN/hooks#permissionrequest) 和您设置的权限模式仍然首先决定每个调用;Claude Code 仅拒绝其他任何内容都不解决的请求。357使用该标志,您的运行不会查询主机或等待它。任何会提示的内容都被拒绝,除非 `PermissionRequest` hook 允许它,Claude 被告知没有人可以批准请求且不要重试它,运行继续。在没有主机的 `-p` 运行中,这些请求无论如何都被拒绝,该标志也告诉 Claude 不要重试它们。权限规则、[`PermissionRequest` hook](/docs/zh-CN/hooks#permissionrequest) 和您设置的权限模式仍然首先决定每个调用;Claude Code 仅拒绝其他任何机制都无法解决的请求。

356 358 

357此示例在 [auto 模式](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode) 中运行无人值守任务。分类器照常审查每个操作,Claude Code 拒绝任何会回退到提示的内容:359此示例在 [自动模式](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode) 中运行无人值守任务。分类器照常审查每个操作,Claude Code 拒绝任何会回退到提示的内容:

358 360 

359```bash theme={null}361```bash theme={null}

360claude -p "Update the dependency pins and run the tests" --permission-mode auto --permission-prompts none362claude -p "Update the dependency pins and run the tests" --permission-mode auto --permission-prompts none


372 创建提交374 创建提交

373</h3>375</h3>

374 376 

375此示例审查暂存的更改并创建具有适当消息的提交:377此示例审查暂存的更改并创建具有适当提交信息的提交:

376 378 

377```bash theme={null}379```bash theme={null}

378claude -p "Look at my staged changes and create an appropriate commit" \380claude -p "Look at my staged changes and create an appropriate commit" \

379 --allowedTools "Bash(git diff *),Bash(git log *),Bash(git status *),Bash(git commit *)"381 --allowedTools "Bash(git diff *),Bash(git log *),Bash(git status *),Bash(git commit *)"

380```382```

381 383 

382`--allowedTools` 标志使用 [权限规则语法](/docs/zh-CN/settings-reference#permission-rule-syntax)。尾部的 ` *` 启用前缀匹配,因此 `Bash(git diff *)` 允许任何以 `git diff` 开头的命令。空格在 `*` 之前很重要:没有它,`Bash(git diff*)` 也会匹配 `git diff-index`。384`--allowedTools` 标志使用 [权限规则语法](/docs/zh-CN/settings-reference#permission-rule-syntax)。尾部的 ` *` 启用前缀匹配,因此 `Bash(git diff *)` 允许任何以 `git diff` 开头的命令。`*` 之前的空格很重要:没有它,`Bash(git diff*)` 也会匹配 `git diff-index`。

383 385 

384<Note>386<Note>

385 命令支持在 `-p` 模式下有所不同:387 命令支持在 `-p` 模式下有所不同:

386 388 

387 * 用户调用的 [skills](/docs/zh-CN/skills) 和自定义命令工作。在提示字符串中包含 `/skill-name`,Claude Code 会在运行前展开它。389 * 用户调用的 [skill](/docs/zh-CN/skills) 和自定义命令可以使用。在提示词字符串中包含 `/skill-name`,Claude Code 会在运行前展开它。

388 * 仅在终端界面中运行的内置命令,例如 `/login`,在 `-p` 模式下不可用。390 * 仅在终端界面中运行的内置命令,例如 `/login`,不可用。

389 * `/model`、`/effort`、`/fast`、`/color` 和 `/rename` 接受该值作为参数,例如 `/model sonnet`,`/mcp` 不带参数打印服务器状态的文本摘要。这些形式需要 Claude Code v2.1.205 或更高版本,并遵循每个命令的 [可用性说明](/docs/zh-CN/commands#all-commands)。391 * `/model`、`/effort`、`/fast`、`/color` 和 `/rename` 接受该值作为参数,例如 `/model sonnet`,`/mcp` 不带参数时打印服务器状态的文本摘要。这些形式需要 Claude Code v2.1.205 或更高版本,并遵循每个命令的 [可用性说明](/docs/zh-CN/commands#all-commands)。

390 * 要从 `-p` 调用更改设置,请将 `key=value` 传递给 `/config`,例如 `/config thinking=false`。392 * 要更改设置,请将 `key=value` 传递给 `/config`,例如 `/config thinking=false`。

391 * `/output-style <style>` 切换 [输出样式](/docs/zh-CN/output-styles),`/output-style` 单独列出它们。需要 Claude Code v2.1.269 或更高版本。393 * `/output-style <style>` 切换 [输出样式](/docs/zh-CN/output-styles),单独使用 `/output-style` 会列出它们。需要 Claude Code v2.1.269 或更高版本。

392</Note>394</Note>

393 395 

394<h3 id="customize-the-system-prompt">396<h3 id="customize-the-system-prompt">

395 自定义系统提示397 自定义系统提示词

396</h3>398</h3>

397 399 

398使用 `--append-system-prompt` 添加指令同时保持 Claude Code 的默认行为。此示例将 PR diff 传递给 Claude 并指示它审查安全漏洞。将其保存为 shell 脚本,例如 `review.sh`:400使用 `--append-system-prompt` 添加指令同时保持 Claude Code 的默认行为。此示例将 PR diff 传递给 Claude 并指示它审查安全漏洞。将其保存为 shell 脚本,例如 `review.sh`:


405 407 

406在脚本中,`"$1"` 代表您在命令行上传递的第一个参数。运行 `bash review.sh 123`,shell 将 `"$1"` 替换为 `123`,因此脚本获取 PR 123 的 diff。Claude Code 将审查打印为 JSON,文本在 `result` 字段中。408在脚本中,`"$1"` 代表您在命令行上传递的第一个参数。运行 `bash review.sh 123`,shell 将 `"$1"` 替换为 `123`,因此脚本获取 PR 123 的 diff。Claude Code 将审查打印为 JSON,文本在 `result` 字段中。

407 409 

408有关更多选项(包括 `--system-prompt` 以完全替换默认提示),请参阅 [系统提示标志](/docs/zh-CN/cli-reference#system-prompt-flags)。410有关更多选项(包括用于完全替换默认提示词的 `--system-prompt`),请参阅 [系统提示词标志](/docs/zh-CN/cli-reference#system-prompt-flags)。

409 411 

410<h3 id="continue-conversations">412<h3 id="continue-conversations">

411 继续对话413 继续对话

412</h3>414</h3>

413 415 

414使用 `--continue` 继续最近的对话,或使用 `--resume` 与会话 ID 继续特定对话。在 Claude Code v2.1.257 或更高版本上,当您传递 `--continue` 时,Claude Code 会打开已完成的 [后台会话](/docs/zh-CN/sessions#resume-a-session),但不会打开仍在运行的后台会话。此示例运行审查,然后发送后续提示:416使用 `--continue` 继续最近的对话,或使用 `--resume` 与会话 ID 继续特定对话。在 Claude Code v2.1.257 或更高版本上,当您传递 `--continue` 时,Claude Code 会打开已完成的 [后台会话](/docs/zh-CN/sessions#where-the-session-picker-looks),但不会打开仍在运行的后台会话。此示例运行审查,然后发送后续提示词:

415 417 

416```bash theme={null}418```bash theme={null}

417# First request419# First request


429claude -p "Continue that review" --resume "$session_id"431claude -p "Continue that review" --resume "$session_id"

430```432```

431 433 

432您可以从不同的目录运行两个命令:Claude Code [按其 ID 查找会话](/docs/zh-CN/sessions#resume-a-session) 在此机器上的任何项目中。在 v2.1.223 之前,Claude Code 仅在当前项目目录及其 git worktrees 中查找 ID,因此您必须从同一目录运行两个命令。434您可以从不同的目录运行这两个命令:Claude Code 会在此机器上的任何项目中 [按其 ID 查找会话](/docs/zh-CN/sessions#where-the-session-picker-looks)。

433 435 

434代替会话 ID,您可以将 `--resume` 传递会话的 `.jsonl` [记录文件](/docs/zh-CN/sessions#where-transcripts-are-stored) 的绝对路径,Claude Code 继续存储在该文件中的对话。436您可以向 `--resume` 传递会话的 `.jsonl` [会话记录文件](/docs/zh-CN/sessions#where-transcripts-are-stored) 的绝对路径来代替会话 ID,Claude Code 会继续存储在该文件中的对话。

435 437 

436<h2 id="next-steps">438<h2 id="next-steps">

437 后续步骤439 后续步骤

hooks.md +41 −14

Details

425 425 

426所有匹配的 hooks 并行运行。如果在多个设置文件中定义相同的处理程序,它运行一次。插件或技能的相同处理程序副本保持分离。426所有匹配的 hooks 并行运行。如果在多个设置文件中定义相同的处理程序,它运行一次。插件或技能的相同处理程序副本保持分离。

427 427 

428处理程序在当前目录中使用 Claude Code 的环境运行。如果当前目录不再存在,例如另一个 shell 在会话中途删除的 worktree 或临时目录,Claude Code 从以下第一个仍然存在的目录运行命令 hooks:会话启动的目录、项目根目录、您的主目录或系统临时目录。Claude Code 在 [调试日志](#debug-hooks) 中记录一个警告,命名回退目录。428处理程序在当前目录中使用 Claude Code 的环境运行。如果当前目录不再存在,例如另一个 shell 在会话中途删除的 worktree 或临时目录,Claude Code 从以下第一个仍然存在的目录运行命令 hook:会话启动的目录、项目根目录、您的主目录或系统临时目录。Claude Code 在 [调试日志](#debug-hooks) 中记录一个警告,命名回退目录。对于从桌面应用启动的 worktree 会话,请参阅 [worktree 与主检出共享的内容](/docs/zh-CN/worktrees#what-worktrees-share-with-the-main-checkout)。

429 429 

430`$CLAUDE_CODE_REMOTE` 环境变量在远程 web 环境中为 `"true"`,在本地 CLI 中未设置。Claude Code v2.1.199 及更高版本在本地会话有活跃的远程控制连接时将 [`$CLAUDE_CODE_BRIDGE_SESSION_ID`](/docs/zh-CN/env-vars) 设置为 [远程控制](/docs/zh-CN/remote-control) 会话 ID。430`$CLAUDE_CODE_REMOTE` 环境变量在远程 web 环境中为 `"true"`,在本地 CLI 中未设置。Claude Code v2.1.199 及更高版本在本地会话有活跃的远程控制连接时将 [`$CLAUDE_CODE_BRIDGE_SESSION_ID`](/docs/zh-CN/env-vars) 设置为 [远程控制](/docs/zh-CN/remote-control) 会话 ID。

431 431 


645 645 

646 * **`${CLAUDE_PROJECT_DIR}` 保持不变**:它仍然指向会话启动的项目根目录,所以像 `${CLAUDE_PROJECT_DIR}/.claude/hooks/check-style.sh` 这样的命令仍然在主检出中运行脚本。646 * **`${CLAUDE_PROJECT_DIR}` 保持不变**:它仍然指向会话启动的项目根目录,所以像 `${CLAUDE_PROJECT_DIR}/.claude/hooks/check-style.sh` 这样的命令仍然在主检出中运行脚本。

647 * **`cwd` 跟随 Claude**:hook 的 [输入 JSON](#common-input-fields) 中的 `cwd` 字段在 Claude 进入 worktree 后是 worktree 根目录,在 Claude 运行 `cd` 后是新目录。当 hook 需要知道 Claude 正在哪个目录中工作时读取它。647 * **`cwd` 跟随 Claude**:hook 的 [输入 JSON](#common-input-fields) 中的 `cwd` 字段在 Claude 进入 worktree 后是 worktree 根目录,在 Claude 运行 `cd` 后是新目录。当 hook 需要知道 Claude 正在哪个目录中工作时读取它。

648 

649 对于从桌面应用启动的 worktree 会话,请参阅 [worktree 与主检出共享的内容](/docs/zh-CN/worktrees#what-worktrees-share-with-the-main-checkout) 了解 `${CLAUDE_PROJECT_DIR}` 指向何处。

648</Note>650</Note>

649 651 

650对于任何引用路径占位符的 hook,优先使用 [exec 形式](#exec-form-and-shell-form)。在 shell 形式中,用双引号包装每个占位符。652对于任何引用路径占位符的 hook,优先使用 [exec 形式](#exec-form-and-shell-form)。在 shell 形式中,用双引号包装每个占位符。


680 682 

681 ```json theme={null}683 ```json theme={null}

682 {684 {

683 "description": "自动代码格式化",685 "description": "Automatic code formatting",

684 "hooks": {686 "hooks": {

685 "PostToolUse": [687 "PostToolUse": [

686 {688 {


717```yaml theme={null}719```yaml theme={null}

718---720---

719name: secure-operations721name: secure-operations

720description: 执行具有安全检查的操作722description: Perform operations with security checks

721hooks:723hooks:

722 PreToolUse:724 PreToolUse:

723 - matcher: "Bash"725 - matcher: "Bash"


782| `effort` | 对象,其 `level` 字段保存 hook 运行时生效的 [effort 级别](/docs/zh-CN/model-config#adjust-effort-level):`"low"`、`"medium"`、`"high"`、`"xhigh"` 或 `"max"`。如果您设置了活跃模型不支持的级别,`level` 会报告 Claude Code 实际运行的级别;[调整 effort 级别](/docs/zh-CN/model-config#adjust-effort-level)说明它如何选择该级别。该对象与[状态栏](/docs/zh-CN/statusline#available-data) `effort` 字段匹配。对于在工具使用上下文中触发的事件(如 `PreToolUse`、`PostToolUse`、`Stop` 和 `SubagentStop`),当当前模型支持 effort 参数时存在。该级别也可作为 `$CLAUDE_EFFORT` 环境变量供 hook 命令和 Bash 工具使用。 |784| `effort` | 对象,其 `level` 字段保存 hook 运行时生效的 [effort 级别](/docs/zh-CN/model-config#adjust-effort-level):`"low"`、`"medium"`、`"high"`、`"xhigh"` 或 `"max"`。如果您设置了活跃模型不支持的级别,`level` 会报告 Claude Code 实际运行的级别;[调整 effort 级别](/docs/zh-CN/model-config#adjust-effort-level)说明它如何选择该级别。该对象与[状态栏](/docs/zh-CN/statusline#available-data) `effort` 字段匹配。对于在工具使用上下文中触发的事件(如 `PreToolUse`、`PostToolUse`、`Stop` 和 `SubagentStop`),当当前模型支持 effort 参数时存在。该级别也可作为 `$CLAUDE_EFFORT` 环境变量供 hook 命令和 Bash 工具使用。 |

783| `hook_event_name` | 触发的事件的名称 |785| `hook_event_name` | 触发的事件的名称 |

784 786 

785使用 `--agent` 运行或在子代理内部时,包括两个额外字段:787`agent_id` 和 `agent_type` 告诉您的脚本 hook 是在哪个 Agent 中触发的,例如子代理、[进程内队友](/docs/zh-CN/agent-teams#choose-a-display-mode),或您通过 `--agent` 选择的 Agent:

786 788 

787| 字段 | 描述 |789| 字段 | 描述 |

788| :- | :- |790| :- | :- |

789| `agent_id` | 子代理的唯一标识符。仅当 hook 在子代理调用内触发时存在。使用此来区分子代理 hook 调用和主线程调用。 |791| `agent_id` | hook 触发所在的子代理或进程内队友的唯一标识符。 |

790| `agent_type` | Agent 名称(例如,`"Explore"` 或 `"security-reviewer"`)。当会话使用 `--agent` 或 hook 在子代理内触发时存在。对于子代理,子代理的类型优先于会话的 `--agent` 值。请参阅 [SubagentStart](#subagentstart) 了解自定义和插件子代理报告的值以及如何针对限定于插件的名称编写匹配器。 |792| `agent_type` | Agent 名称(例如,`"Explore"` 或 `"security-reviewer"`)。当会话使用 `--agent` 或 hook 在子代理内触发时存在。对于子代理,子代理的类型优先于会话的 `--agent` 值。请参阅 [SubagentStart](#subagentstart) 了解自定义和插件子代理报告的值以及如何针对限定于插件的名称编写匹配器。 |

791 793 

792只有 [`SessionStart`](#sessionstart) hook 可以接收 `model` 字段,Claude Code 并不总是包括它。[`PreModelSwitch`](#premodelswitch) 和 [`PostModelSwitch`](#postmodelswitch) hook 改为接收 `from_model` 和 `to_model`,因此使用 PostModelSwitch hook 来跟踪模型在会话期间的变化。794只有 [`SessionStart`](#sessionstart) hook 可以接收 `model` 字段,Claude Code 并不总是包括它。[`PreModelSwitch`](#premodelswitch) 和 [`PostModelSwitch`](#postmodelswitch) hook 改为接收 `from_model` 和 `to_model`,因此使用 PostModelSwitch hook 来跟踪模型在会话期间的变化。


855 857 

856对于大多数事件,Claude Code 将 stdout 写入调试日志,不在会话记录中显示。例外是 `UserPromptSubmit`、`UserPromptExpansion`、`SessionStart` 和 `PostModelSwitch`,其中 Claude Code 添加纯文本 stdout 作为 Claude 可以看到并据此行动的上下文。858对于大多数事件,Claude Code 将 stdout 写入调试日志,不在会话记录中显示。例外是 `UserPromptSubmit`、`UserPromptExpansion`、`SessionStart` 和 `PostModelSwitch`,其中 Claude Code 添加纯文本 stdout 作为 Claude 可以看到并据此行动的上下文。

857 859 

858Claude Code 是否将您的 stdout 读取为 [JSON 输出](#json-output)或纯文本取决于它如何开始和结束,忽略周围的空白:860对于非[异步](#how-async-hooks-execute)的 hook,当整个输出是一个 JSON 对象且周围除空白外没有其他内容时,Claude Code 会将您的 stdout 解析为 [JSON 输出](#json-output),否则将其视为纯文本或解析失败:

859 861 

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

861* **以 `{` 开始但不以 `}` 结束**:Claude Code 将其视为纯文本。863* **不以 `{` 开头的输出,或以 `{` 开头但不以 `}` 结尾的输出**:纯文本。根据此规则,JSON 数组和带引号的 JSON 字符串都是纯文本。

862* **以其他任何内容开始**:Claude Code 将其视为纯文本,即使它是 JSON 数组或带引号的 JSON 字符串也是如此。864* **两行或更多行,每行本身都可解析为 JSON,且第一行以 `{` 开头、最后一行以 `}` 结尾**:如果没有任何一行是设置了字段的 JSON 输出对象,则为纯文本;如果有一行是,则为解析失败。

865* **其他任何以 `{` 开头并以 `}` 结尾但不是有效 JSON 的内容**:解析失败。

863 866 

864当 Claude Code 尝试将您的 stdout 解析为 JSON 但无法解析,或解析后的对象未通过 [schema 验证](#json-output)时,该运行是[非阻止错误](#exit-code-output)。`<hook name> hook error` 通知带有解析或验证消息。在添加纯文本 stdout 作为上下文的事件上,Claude Code 不会添加它未能解析的 stdout。867当 Claude Code 尝试将您的 stdout 解析为 JSON 但无法解析,或解析后的对象未通过 [schema 验证](#json-output)时,该运行是[非阻止错误](#exit-code-output)。`<hook name> hook error` 通知带有解析或验证消息。在添加纯文本 stdout 作为上下文的事件上,Claude Code 不会添加它未能解析的 stdout。

865 868 


1050 每个 hook 选择一种方法:要么仅使用退出码发出信号,要么退出 0 并打印 JSON 进行结构化控制。如果您混合使用,退出 2 保持其[阻止效果](#exit-code-2-behavior-per-event),Claude Code 仍然读取 JSON 字段,但[退出码 2](#exit-code-2) 下注明的 elicitation 例外除外。1053 每个 hook 选择一种方法:要么仅使用退出码发出信号,要么退出 0 并打印 JSON 进行结构化控制。如果您混合使用,退出 2 保持其[阻止效果](#exit-code-2-behavior-per-event),Claude Code 仍然读取 JSON 字段,但[退出码 2](#exit-code-2) 下注明的 elicitation 例外除外。

1051</Note>1054</Note>

1052 1055 

1053您的 hook 的 stdout 必须仅包含 JSON 对象。如果您的 shell 配置文件在启动时打印文本,它可能会干扰 JSON 解析。请参阅故障排除指南中的 [Hook JSON 无效](/docs/zh-CN/hooks-guide#hook-json-has-no-effect)。1056只向 stdout 打印 JSON 对象,不要打印其他任何内容。对于非[异步](#how-async-hooks-execute)的 hook,stdout 中的其他文本(例如 shell 配置文件在启动时 echo 的一行)会使 Claude Code 无法将该对象读取为 JSON,[Hook JSON 无效](/docs/zh-CN/hooks-guide#hook-json-has-no-effect)介绍了如何找到并屏蔽这类文本。

1054 1057 

1055hook 的 `additionalContext`、`systemMessage` 和 `initialUserMessage` 字符串,以及其纯 stdout,限制为 10,000 个字符:1058hook 的 `additionalContext`、`systemMessage` 和 `initialUserMessage` 字符串,以及其纯 stdout,限制为 10,000 个字符:

1056 1059 


1142 1145 

1143当多个 hook 为同一事件返回 `additionalContext` 时,Claude 会接收所有值。1146当多个 hook 为同一事件返回 `additionalContext` 时,Claude 会接收所有值。

1144 1147 

1148如果您的字符串包含 `<system-reminder>` 或 `</system-reminder>` 标签,Claude 收到的字符串中该标签的 `<` 会被替换为 `&lt;`。

1149 

1145如果值超过 10,000 个字符,Claude Code 会将文本写入会话目录中的文件,并改为向 Claude 传递文件路径以及最多前 2,000 个字符的预览。Claude 可以读取该文件,但 Claude Code 不会要求它读取。1150如果值超过 10,000 个字符,Claude Code 会将文本写入会话目录中的文件,并改为向 Claude 传递文件路径以及最多前 2,000 个字符的预览。Claude 可以读取该文件,但 Claude Code 不会要求它读取。

1146 1151 

1147使用 `additionalContext` 提供 Claude 应了解的有关您环境当前状态或刚刚运行的操作的信息:1152使用 `additionalContext` 提供 Claude 应了解的有关您环境当前状态或刚刚运行的操作的信息:


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

1365</h4>1370</h4>

1366 1371 

1367SessionStart hook 可以访问 `CLAUDE_ENV_FILE` 环境变量,该变量提供一个文件路径,您可以在其中持久化环境变量,供后续 Bash 命令使用。1372SessionStart hook 可以访问 `CLAUDE_ENV_FILE` 环境变量,它提供一个文件路径,您可以在其中为 Claude 在会话后续运行的 shell 命令持久化环境变量。

1368 1373 

1369要设置单个环境变量,请将 `export` 语句写入 `CLAUDE_ENV_FILE`。使用追加(`>>`)以保留其他 hook 设置的变量:1374要设置单个环境变量,请将 `export` 语句写入 `CLAUDE_ENV_FILE`。使用追加(`>>`)以保留其他 hook 设置的变量:

1370 1375 


1399exit 01404exit 0

1400```1405```

1401 1406 

1407每个 Bash 命令在执行命令本身之前,都会将该文件的内容作为 shell 代码运行,因此其中的行可以使用 Bash 能求值的任何内容,例如 `export PATH="$PATH:./node_modules/.bin"` 中的 `$PATH` 引用。

1408 

1409<a id="persisted-variables-in-powershell-commands" />

1410 

1411<h5 id="persisted-variables-in-powershell-commands">

1412 PowerShell 命令中的持久化变量

1413</h5>

1414 

1415在 Claude Code v2.1.296 或更高版本中,[PowerShell](/docs/zh-CN/tools-reference#powershell-tool) 命令也会接收来自 `CLAUDE_ENV_FILE` 的变量,但 PowerShell 从不运行该文件。Claude Code 会从中读取赋值语句,并将其复制到 PowerShell 命令的环境中。只有当本会话中每个 hook 写入的内容,以及您在启动前[将 `CLAUDE_ENV_FILE` 设置为](/docs/zh-CN/env-vars)的任何脚本中,每一行都属于以下类型之一时,它才会这样做:

1416 

1417* 空行或 `#` 注释

1418* 位于行首的一条赋值语句,写作 `export NAME=value`、`declare -x NAME=value` 或 `NAME=value`,其值必须是 Bash 会按原样使用的值,由以下部分任意组合而成:仅使用字母、数字和字符 `_ @ % + = : , . / -` 的无引号文本、单引号内的文本,以及双引号内的文本(其中的任何 `$`、反引号或 `"` 都用反斜杠转义)

1419 

1420如果任何一行属于其他类型,例如带有未转义 `$PATH` 的 `export PATH="$PATH:./node_modules/.bin"`、`source` 命令,或 `direnv export bash` 打印的 `$'...'` 字符串,则 PowerShell 命令不会接收任何变量,并且 `claude --debug` 会记录 `Session environment is not all plain assignments`。Bash 命令仍会接收所有变量。在 Windows 上,PowerShell 命令也不会接收值中包含 `/` 或 `\` 的变量,因为 Git Bash 和 Windows 的路径写法不同。[沙箱化](/docs/zh-CN/sandboxing)的 PowerShell 命令不会接收任何变量。

1421 

1402<Note>1422<Note>

1403 `CLAUDE_ENV_FILE` 可用于 SessionStart、[Setup](#setup)、[CwdChanged](#cwdchanged) 和 [FileChanged](#filechanged) hook。其他 hook 类型无法访问此变量。1423 `CLAUDE_ENV_FILE` 可用于 SessionStart、[Setup](#setup)、[CwdChanged](#cwdchanged) 和 [FileChanged](#filechanged) hook。其他 hook 事件无法访问此变量,在 PowerShell 中运行的 hook 也无法访问,无论是通过 [`"shell": "powershell"`](#command-hook-fields) 还是在没有 Git Bash 的 Windows 上默认如此。

1404</Note>1424</Note>

1405 1425 

1406<h3 id="setup">1426<h3 id="setup">


2030 2050 

2031| 字段 | 描述 |2051| 字段 | 描述 |

2032| :- | :- |2052| :- | :- |

2033| `permissionDecision` | `"allow"` 会跳过权限提示,但[任何模式都不会自动批准的操作](/docs/zh-CN/permission-modes#actions-no-mode-auto-approves)除外,`AskUserQuestion` 和 `ExitPlanMode` 也除外,它们需要[与 `updatedInput` 配合使用](#allow-with-updatedinput)。`"deny"` 会阻止工具调用。`"ask"` 会提示用户确认。`"defer"` 会正常退出,以便稍后恢复该工具。无论 hook 返回什么,[拒绝和询问规则](/docs/zh-CN/permissions#manage-permissions)仍会被评估 |2053| `permissionDecision` | `"allow"` 跳过权限提示,但以下情况除外:[任何模式都不会自动批准的操作](/docs/zh-CN/permission-modes#actions-no-mode-auto-approves)、[从网络路径读取](/docs/zh-CN/permissions#network-paths),以及需要[与 `updatedInput` 搭配使用](#allow-with-updatedinput)的 `AskUserQuestion` 和 `ExitPlanMode`。`"deny"` 阻止工具调用。`"ask"` 提示用户确认。`"defer"` 正常退出,以便稍后恢复该工具。无论 hook 返回什么,[拒绝和询问规则](/docs/zh-CN/permissions#manage-permissions)仍会被评估 |

2034| `permissionDecisionReason` | 对于 `"ask"`,在权限提示中向用户显示。当 Claude Code 在无人能响应该提示的 `-p` 运行中[拒绝调用](/docs/zh-CN/headless#turn-off-permission-prompts-in-unattended-runs)时,Claude 会改为在工具结果中读取该原因。对于 `"deny"`,向 Claude 显示。对于 `"allow"` 和 `"defer"`,仅写入[调试日志](#debug-hooks) |2054| `permissionDecisionReason` | 对于 `"ask"`,在权限提示中向用户显示。当 Claude Code 在无人能响应该提示的 `-p` 运行中[拒绝调用](/docs/zh-CN/headless#turn-off-permission-prompts-in-unattended-runs)时,Claude 会改为在工具结果中读取该原因。对于 `"deny"`,向 Claude 显示。对于 `"allow"` 和 `"defer"`,仅写入[调试日志](#debug-hooks) |

2035| `updatedInput` | 在执行前修改工具的输入参数。会替换整个输入对象,因此请将未更改的字段与修改后的字段一并包含在内。Claude Code 会针对您的 hook 返回的输入(而不是 Claude 发送的输入)评估权限规则以及 Bash 命令的[自动转入后台资格](/docs/zh-CN/tools-reference#foreground-commands-that-move-to-the-background)。与 `"allow"` 结合可自动批准,与 `"ask"` 结合可向用户显示修改后的输入。对于 `"defer"` 会被忽略 |2055| `updatedInput` | 在执行前修改工具的输入参数。会替换整个输入对象,因此请将未更改的字段与修改后的字段一并包含在内。Claude Code 会针对您的 hook 返回的输入(而不是 Claude 发送的输入)评估权限规则以及 Bash 命令的[自动转入后台资格](/docs/zh-CN/tools-reference#foreground-commands-that-move-to-the-background)。与 `"allow"` 结合可自动批准,与 `"ask"` 结合可向用户显示修改后的输入。对于 `"defer"` 会被忽略 |

2036| `additionalContext` | 与工具结果一同添加到 Claude 上下文中的字符串。当 `permissionDecision` 为 `"defer"` 时会被忽略。请参阅[为 Claude 添加上下文](#add-context-for-claude) |2056| `additionalContext` | 与工具结果一同添加到 Claude 上下文中的字符串。当 `permissionDecision` 为 `"defer"` 时会被忽略。请参阅[为 Claude 添加上下文](#add-context-for-claude) |


2136如果恢复时被推迟的工具已不可用,进程会在 hook 触发之前以 `stop_reason: "tool_deferred_unavailable"` 和 `is_error: true` 退出。当提供该工具的 MCP 服务器在恢复的会话中未连接时,就会发生这种情况。`deferred_tool_use` 负载仍会包含在内,以便您确定缺失的是哪个工具。2156如果恢复时被推迟的工具已不可用,进程会在 hook 触发之前以 `stop_reason: "tool_deferred_unavailable"` 和 `is_error: true` 退出。当提供该工具的 MCP 服务器在恢复的会话中未连接时,就会发生这种情况。`deferred_tool_use` 负载仍会包含在内,以便您确定缺失的是哪个工具。

2137 2157 

2138<Note>2158<Note>

2139 要在计划模式下恢复被推迟的会话,请将 [`--permission-prompt-tool`](/docs/zh-CN/cli-reference#cli-flags) 与 `--resume` 一起传入,以便 Claude Code 可以呈现计划供批准。如果您传入了某些其他启动标志,恢复的运行将不会回到计划模式;请参阅[使用 `-p` 在计划模式下恢复](/docs/zh-CN/sessions#resume-in-plan-mode-with-p)。需要 Claude Code v2.1.246 或更高版本。2159 要在计划模式下恢复被延迟的会话,请将 [`--permission-prompt-tool`](/docs/zh-CN/cli-reference#cli-flags) 与 `--resume` 一起传入,以便 Claude Code 可以展示计划供批准。有关其他条件,请参阅[使用 `-p` 在计划模式下恢复](/docs/zh-CN/sessions#resume-in-plan-mode-with-p)。需要 Claude Code v2.1.246 或更高版本。

2140 2160 

2141 当您使用 `-p` 恢复时,Claude Code 不会还原任何其他已存储的权限模式。它会以新的 `claude -p` 运行所使用的权限模式启动,因此如果被推迟的会话使用了 `--permission-mode` 或 `--dangerously-skip-permissions`,请再次传入。当您不带 `-p` 使用 `claude --resume <session-id>` 恢复时,Claude Code 会还原已存储的权限模式,例外情况列于[恢复时的权限模式](/docs/zh-CN/sessions#permission-mode-on-resume)中。2161 当您使用 `-p` 恢复时,Claude Code 不会还原任何其他已存储的权限模式。它会以新的 `claude -p` 运行所使用的权限模式启动,因此如果被推迟的会话使用了 `--permission-mode` 或 `--dangerously-skip-permissions`,请再次传入。当您不带 `-p` 使用 `claude --resume <session-id>` 恢复时,Claude Code 会还原已存储的权限模式,例外情况列于[恢复时的权限模式](/docs/zh-CN/sessions#permission-mode-on-resume)中。

2142</Note>2162</Note>


4303 4323 

4304后台进程退出后,Claude Code 从 hook 的 JSON 响应中传递 `additionalContext` 和 `systemMessage` 字段给 Claude 在下一个对话轮次。与同步 hook 的 `systemMessage` 不同,这两个字段都不会显示给你。4324后台进程退出后,Claude Code 从 hook 的 JSON 响应中传递 `additionalContext` 和 `systemMessage` 字段给 Claude 在下一个对话轮次。与同步 hook 的 `systemMessage` 不同,这两个字段都不会显示给你。

4305 4325 

4326将 JSON 响应单独输出到 stdout,或单独输出在一行上:

4327 

4328* **单独输出到 stdout**:当响应是 stdout 上唯一的文本时,它可以跨越多行,例如经过格式化美化的 `jq` 输出。跨越多行需要 Claude Code v2.1.295 或更高版本。

4329* **单独输出在一行上**:当响应可以单独放在一行中时(例如使用 `jq -c`),异步 hook 可以向 stdout 输出其他文本。

4330 

4306Claude Code 根据与同步 hooks 相同的[输出架构](#json-output)验证 JSON 响应,并删除任何值类型错误的字段,例如不是字符串的 `systemMessage`,而不是传递它。使用 `--debug` 运行以查看命名每个删除字段的警告。在 v2.1.202 之前,来自异步 hook 的格式错误的 JSON 输出可能会导致会话崩溃,并且每次恢复会话时崩溃都会重复发生。4331Claude Code 根据与同步 hooks 相同的[输出架构](#json-output)验证 JSON 响应,并删除任何值类型错误的字段,例如不是字符串的 `systemMessage`,而不是传递它。使用 `--debug` 运行以查看命名每个删除字段的警告。在 v2.1.202 之前,来自异步 hook 的格式错误的 JSON 输出可能会导致会话崩溃,并且每次恢复会话时崩溃都会重复发生。

4307 4332 

4308异步 hook 完成通知默认被抑制。要查看它们,请使用 `Ctrl+O` 启用详细模式或使用 `--verbose` 启动 Claude Code。4333异步 hook 完成通知默认被抑制。要查看它们,请使用 `Ctrl+O` 启用详细模式或使用 `--verbose` 启动 Claude Code。


44562026-07-19T02:03:24.382Z [DEBUG] "Hook PostToolUse:Write (PostToolUse) success:\nhook-ran"44812026-07-19T02:03:24.382Z [DEBUG] "Hook PostToolUse:Write (PostToolUse) success:\nhook-ran"

4457```4482```

4458 4483 

4484要查找运行缓慢的 hook,请在日志中搜索以持续时间结尾的 `Hooks:` 行。在 Claude Code v2.1.296 或更高版本中,工具事件、`UserPromptSubmit`、`SessionStart`、`Stop` 以及其他若干事件上的每个命令 hook 在完成时都会留下一行这样的记录,无论其打印了什么内容。该行依次给出事件名称(通过冒号与 hook 所匹配的工具名称或其他值相连),然后是方括号中的 hook 命令、其来源插件(如有)、运行的结束方式以及耗时,例如 `Hooks: PostToolUse:Write [.claude/hooks/log-write.sh] finished with status 0 (31ms)`。运行也可能以 `timed out after <N>ms`、`cancelled`、`moved to the background` 或 `failed to start` 结束。在某些事件(例如 `Notification`、`SessionEnd` 和 `PreCompact`)上,命令 hook 会改为留下一行不带持续时间的 `completed with status` 记录。

4485 

4459对于更细粒度的 hook 匹配详细信息,设置 `CLAUDE_CODE_DEBUG_LOG_LEVEL=verbose` 以查看额外的日志行,例如 hook 匹配器计数和查询匹配。4486对于更细粒度的 hook 匹配详细信息,设置 `CLAUDE_CODE_DEBUG_LOG_LEVEL=verbose` 以查看额外的日志行,例如 hook 匹配器计数和查询匹配。

4460 4487 

4461有关故障排除常见问题,如 hooks 不触发、Stop hooks 持续阻止或配置错误,请参阅指南中的[限制和故障排除](/docs/zh-CN/hooks-guide#limitations-and-troubleshooting)。有关涵盖 `/context`、`/doctor` 和设置优先级的更广泛的诊断演练,请参阅[调试你的配置](/docs/zh-CN/debug-your-config)。4488有关故障排除常见问题,如 hooks 不触发、Stop hooks 持续阻止或配置错误,请参阅指南中的[限制和故障排除](/docs/zh-CN/hooks-guide#limitations-and-troubleshooting)。有关涵盖 `/context`、`/doctor` 和设置优先级的更广泛的诊断演练,请参阅[调试你的配置](/docs/zh-CN/debug-your-config)。

hooks-guide.md +21 −13

Details

620COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command')620COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command')

621 621 

622if echo "$COMMAND" | grep -q "drop table"; then622if echo "$COMMAND" | grep -q "drop table"; then

623 echo "Blocked: dropping tables is not allowed" >&2 # stderr 变成 Claude 的反馈623 echo "Blocked: dropping tables is not allowed" >&2 # stderr becomes Claude's feedback

624 exit 2 # exit 2 = 阻止操作624 exit 2 # exit 2 = block the action

625fi625fi

626 626 

627exit 0 # exit 0 = 没有决策;正常权限流程适用627exit 0 # exit 0 = no decision; the normal permission flow applies

628```628```

629 629 

630退出代码确定接下来会发生什么:630退出代码确定接下来会发生什么:


664 664 

665在 `PreToolUse` 上,Claude Code 处理每个 `permissionDecision` 值如下:665在 `PreToolUse` 上,Claude Code 处理每个 `permissionDecision` 值如下:

666 666 

667* `"allow"`:跳过交互式权限提示。拒绝和询问规则(包括企业托管拒绝列表)仍然适用,以及标记为 [`requiresUserInteraction`](/docs/zh-CN/mcp#require-approval-for-a-specific-tool) 的 MCP 工具和你的组织设置为 `ask` 的 [连接器工具](/docs/zh-CN/mcp#organization-controls-on-connector-tools)(在该设置到达 Claude Code 的会话中)667* `"allow"`:跳过交互式权限提示。拒绝和询问规则(包括企业托管拒绝列表)仍然适用;从 [网络路径](/docs/zh-CN/permissions#network-paths) 读取的提示、标记为 [`requiresUserInteraction`](/docs/zh-CN/mcp#require-approval-for-a-specific-tool) 的 MCP 工具的提示,以及 [您的组织设置为 `ask`](/docs/zh-CN/mcp#organization-controls-on-connector-tools) 的连接器工具的提示(在该设置到达 Claude Code 的会话中)也仍然适用

668* `"deny"`:取消工具调用并将原因发送给 Claude668* `"deny"`:取消工具调用并将原因发送给 Claude

669* `"ask"`:照常向用户显示权限提示669* `"ask"`:照常向用户显示权限提示

670 670 


1015 1015 

1016`PreToolUse` hooks 在任何权限模式检查之前触发,在每个[权限模式](/docs/zh-CN/permission-modes)中,包括 `dontAsk`。返回 `permissionDecision: "deny"` 的 hook 会阻止工具,即使在 `bypassPermissions` 模式或使用 `--dangerously-skip-permissions` 时也是如此。这让你强制执行用户无法通过更改其权限模式来绕过的策略。1016`PreToolUse` hooks 在任何权限模式检查之前触发,在每个[权限模式](/docs/zh-CN/permission-modes)中,包括 `dontAsk`。返回 `permissionDecision: "deny"` 的 hook 会阻止工具,即使在 `bypassPermissions` 模式或使用 `--dangerously-skip-permissions` 时也是如此。这让你强制执行用户无法通过更改其权限模式来绕过的策略。

1017 1017 

1018反面不成立:返回 `"allow"` 的 hook 不会绕过来自设置的拒绝规则,它也无法抑制标记为 [`requiresUserInteraction`](/docs/zh-CN/mcp#require-approval-for-a-specific-tool) 的 MCP 工具的提示或[你的组织设置为 `ask`](/docs/zh-CN/mcp#organization-controls-on-connector-tools) 的连接器工具在该设置到达 Claude Code 的会话中的提示。Hooks 在设置文件和插件的 `hooks/hooks.json` 中可以收紧限制,但不能放松它们超过权限规则允许的范围。1018反过来则不成立:返回 `"allow"` 的 hook 不会绕过设置中的拒绝规则,并且在以下情况下也无法抑制提示:从[网络路径](/docs/zh-CN/permissions#network-paths)读取、标记为 [`requiresUserInteraction`](/docs/zh-CN/mcp#require-approval-for-a-specific-tool) 的 MCP 工具,以及在该设置会传达到 Claude Code 的会话中[您的组织设置为 `ask`](/docs/zh-CN/mcp#organization-controls-on-connector-tools) 的连接器工具。设置文件和插件的 `hooks/hooks.json` 中的 hook 可以收紧限制,但不能放宽到超出权限规则允许的范围。

1019 1019 

1020您安装的处理 `tool.check` 的 [mod](/docs/zh-CN/plugins/mods/overview) 可以批准被您的 `PreToolUse` hook 阻止的调用,除非该 hook 位于托管设置中。[使用 hooks 扩展权限](/docs/zh-CN/permissions#extend-permissions-with-hooks)列出了哪些规则优先于 mod。1020您安装的处理 `tool.check` 的 [mod](/docs/zh-CN/plugins/mods/overview) 可以批准被您的 `PreToolUse` hook 阻止的调用,除非该 hook 位于托管设置中。[使用 hooks 扩展权限](/docs/zh-CN/permissions#extend-permissions-with-hooks)列出了哪些规则优先于 mod。

1021 1021 


1038* 你的脚本意外以非零代码退出。通过管道传递示例 JSON 来手动测试它:1038* 你的脚本意外以非零代码退出。通过管道传递示例 JSON 来手动测试它:

1039 ```bash theme={null}1039 ```bash theme={null}

1040 echo '{"tool_name":"Bash","tool_input":{"command":"ls"}}' | ./my-hook.sh1040 echo '{"tool_name":"Bash","tool_input":{"command":"ls"}}' | ./my-hook.sh

1041 echo $? # 检查退出代码1041 echo $? # Check the exit code

1042 ```1042 ```

1043* 如果你看到"command not found",使用绝对路径或 `${CLAUDE_PROJECT_DIR}` 来引用脚本。为了完全避免 shell 引用,添加 `"args": []` 来切换到 [exec 形式](/docs/zh-CN/hooks#exec-form-and-shell-form),它直接生成脚本而不使用 shell1043* 如果你看到"command not found",使用绝对路径或 `${CLAUDE_PROJECT_DIR}` 来引用脚本。为了完全避免 shell 引用,添加 `"args": []` 来切换到 [exec 形式](/docs/zh-CN/hooks#exec-form-and-shell-form),它直接生成脚本而不使用 shell

1044* 如果你看到"jq: command not found",安装 `jq` 或使用 Python/Node.js 进行 JSON 解析1044* 如果你看到"jq: command not found",安装 `jq` 或使用 Python/Node.js 进行 JSON 解析


1070#!/bin/bash1070#!/bin/bash

1071INPUT=$(cat)1071INPUT=$(cat)

1072if [ "$(echo "$INPUT" | jq -r '.stop_hook_active')" = "true" ]; then1072if [ "$(echo "$INPUT" | jq -r '.stop_hook_active')" = "true" ]; then

1073 exit 0 # 允许 Claude 停止1073 exit 0 # Allow Claude to stop

1074fi1074fi

1075# ... 你的 hook 逻辑的其余部分1075# ... rest of your hook logic

1076```1076```

1077 1077 

1078如果你的 hook 合理地需要超过八次迭代才能收敛,使用 [`CLAUDE_CODE_STOP_HOOK_BLOCK_CAP`](/docs/zh-CN/env-vars) 提高上限。1078如果你的 hook 合理地需要超过八次迭代才能收敛,使用 [`CLAUDE_CODE_STOP_HOOK_BLOCK_CAP`](/docs/zh-CN/env-vars) 提高上限。


1083 1083 

1084你的 hook 打印有效的 JSON,但决策没有生效,成绩单中没有出现错误。检查哪个原因适用:1084你的 hook 打印有效的 JSON,但决策没有生效,成绩单中没有出现错误。检查哪个原因适用:

1085 1085 

1086* **JSON 前面有额外输出**:其他东西首先写入 stdout,通常是你的 shell 配置文件中的无条件 `echo`,所以输出不再以 `{` 开头,Claude Code 不会将其解析为 JSON。原因和修复如下所示。1086* **JSON 前面有额外输出**:有其他内容先写入了 stdout,通常是您的 shell profile 中无条件的 `echo`,导致输出不再以 `{` 开头。请参阅 [JSON 之前的 shell profile 输出](#shell-profile-output-before-the-json)。

1087* **字段在错误的级别**:将每个字段的位置与 [JSON 输出](/docs/zh-CN/hooks#json-output)格式进行比较。例如,`permissionDecision` 属于 `hookSpecificOutput` 内部,而不是顶级。1087* **字段位于错误的层级**:将每个字段的位置与 [JSON 输出](/docs/zh-CN/hooks#json-output)格式进行比较。例如,`permissionDecision` 应位于 `hookSpecificOutput` 内部,而不是顶层。请参阅[字段位于错误的层级](#fields-at-the-wrong-level)。

1088 1088 

1089当 Claude Code 运行 shell 形式的命令 hook(没有 `args` 的)时,它在 macOS 和 Linux 上生成 `sh -c`,在 Windows 上生成 Git Bash,或在默认情况下未安装 Git Bash 时生成 PowerShell。这个 shell 是非交互式的,但 Git Bash 和某些配置(例如 `BASH_ENV` 指向 `~/.bashrc`)仍然会源你的配置文件。如果该配置文件包含无条件的 `echo` 语句,输出会被添加到你的 hook 的 JSON 前面:1089<h4 id="shell-profile-output-before-the-json">

1090 JSON 之前的 shell profile 输出

1091</h4>

1092 

1093Hook 在非交互式 shell 中运行,但 Git Bash 和某些配置(例如 `BASH_ENV` 指向 `~/.bashrc`)仍会加载您的 profile,profile 打印的任何内容都会先于 hook 的 JSON 进入 stdout:

1090 1094 

1091```text theme={null}1095```text theme={null}

1092Shell ready on arm641096Shell ready on arm64

1093{"decision": "block", "reason": "Not allowed"}1097{"decision": "block", "reason": "Not allowed"}

1094```1098```

1095 1099 

1096组合输出不再以 `{` 开头,所以 Claude Code 将所有 stdout 视为纯文本并忽略 JSON。在退出 0 时,成绩单中不会报告任何内容;解析尝试仅在[调试日志](/docs/zh-CN/hooks#debug-hooks)中记录。要修复此问题,在你的 shell 配置文件中包装 echo 语句,使其仅在交互式 shell 中运行:1100除非该 hook 是[异步](/docs/zh-CN/hooks#how-async-hooks-execute)的,否则 Claude Code 会将不以 `{` 开头的输出作为纯文本读取,因此您的 JSON 会被忽略。由于 hook 以 0 退出,会话记录中也不会显示错误。要检查是否为此原因,请使用 `claude --debug` 启动 Claude Code,触发该 hook,然后在[调试日志](/docs/zh-CN/hooks#debug-hooks)中搜索 `Hook output does not start with {`。要修复此问题,请包装 profile 中的 `echo` 语句,使其仅在交互式 shell 中运行:

1097 1101 

1098```bash theme={null}1102```bash theme={null}

1099# 在 ~/.zshrc 或 ~/.bashrc 中1103# 在 ~/.zshrc 或 ~/.bashrc 中


1104 1108 

1105`$-` 变量包含 shell 标志,`i` 表示交互式。Hooks 在非交互式 shell 中运行,因此 echo 被跳过。1109`$-` 变量包含 shell 标志,`i` 表示交互式。Hooks 在非交互式 shell 中运行,因此 echo 被跳过。

1106 1110 

1111<h4 id="fields-at-the-wrong-level">

1112 字段位于错误的层级

1113</h4>

1114 

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

1108 1116 

1109<h3 id="check-what-a-hook-did">1117<h3 id="check-what-a-hook-did">


1119 1127 

1120要查询特定退出码和 stdout 对应的结果(包括各事件的例外情况),请参阅参考文档中的[退出码输出](/docs/zh-CN/hooks#exit-code-output)。1128要查询特定退出码和 stdout 对应的结果(包括各事件的例外情况),请参阅参考文档中的[退出码输出](/docs/zh-CN/hooks#exit-code-output)。

1121 1129 

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

1123 1131 

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

1125 了解更多1133 了解更多

Details

22 22 

23| 快捷键 | 描述 | 上下文 |23| 快捷键 | 描述 | 上下文 |

24| :- | :- | :- |24| :- | :- | :- |

25| `Ctrl+C` | 中断或清除输入 | 中断正在运行的操作。如果没有任何操作在运行,第一次按下会清除提示输入,第二次按下会退出 Claude Code |25| `Ctrl+C` | 中断或清除输入 | 中断正在运行的操作。如果没有任何操作在运行,第一次按下会清除提示输入,第二次按下会退出 Claude Code。在提示输入仍为空时按 `Up` 可找回被清除的草稿,这需要 Claude Code v2.1.288 或更高版本 |

26| `Ctrl+X Ctrl+K` | 停止此会话中所有正在运行的[后台子代理](/docs/zh-CN/sub-agents#run-subagents-in-foreground-or-background),并在该会话的剩余时间内关闭 [Artifact 自动回复](/docs/zh-CN/artifacts#let-claude-reply-to-comments-on-its-own)。在 3 秒内按两次以确认。后台子代理的权限提示打开时,您也可以按此快捷键 | 子代理控制 |26| `Ctrl+X Ctrl+K` | 停止此会话中所有正在运行的[后台子代理](/docs/zh-CN/sub-agents#run-subagents-in-foreground-or-background),并在该会话的剩余时间内关闭 [Artifact 自动回复](/docs/zh-CN/artifacts#let-claude-reply-to-comments-on-its-own)。在 3 秒内按两次以确认。后台子代理的权限提示打开时,您也可以按此快捷键 | 子代理控制 |

27| `Ctrl+D` | 退出 Claude Code 会话 | 第一次按下显示确认提示,第二次在 800ms 内按下会退出。当提示有文本时,`Ctrl+D` 会删除光标后的字符 |27| `Ctrl+D` | 退出 Claude Code 会话 | 第一次按下显示确认提示,第二次在 800ms 内按下会退出。当提示有文本时,`Ctrl+D` 会删除光标后的字符 |

28| `Ctrl+G` 或 `Ctrl+X Ctrl+E` | 在默认文本编辑器中打开 | 在默认文本编辑器中编辑您的提示或自定义响应。`Ctrl+X Ctrl+E` 是 readline 原生绑定。在 `/config` 中打开**在外部编辑器中显示最后一个响应**,以在您的提示上方将 Claude 的前一个回复作为 `#` 注释上下文预置;Claude Code 在您保存时会删除注释块 |28| `Ctrl+G` 或 `Ctrl+X Ctrl+E` | 在默认文本编辑器中打开 | 在默认文本编辑器中编辑您的提示或自定义响应。`Ctrl+X Ctrl+E` 是 readline 原生绑定。在 `/config` 中打开**在外部编辑器中显示最后一个响应**,以在您的提示上方将 Claude 的前一个回复作为 `#` 注释上下文预置;Claude Code 在您保存时会删除注释块 |


442 442 

443Claude Code 仅在输入框为空且您没有其他排队内容时才取回排队的 shell 命令,并在执行此操作时将输入框切换到 shell 模式。否则,它会将其保留在队列中,用其 `!` 前缀列出,并在轮次结束后运行它们。443Claude Code 仅在输入框为空且您没有其他排队内容时才取回排队的 shell 命令,并在执行此操作时将输入框切换到 shell 模式。否则,它会将其保留在队列中,用其 `!` 前缀列出,并在轮次结束后运行它们。

444 444 

445如果您在 `←` [等待将会话转入后台](/docs/zh-CN/agent-view#switch-sessions-without-leaving-the-terminal)时取回排队的文本,文本会保留在输入框中,Claude Code 会取消切换。如果您恰好在会话移动的那一刻取回文本,文本会随前台屏幕一起消失:它并未被发送。您取回的每条消息都会作为单独的条目保存在[命令历史记录](#command-history)中。要恢复某条消息,请重新打开该会话,并在提示词为空且没有排队内容时按 `Up`。

446 

445<h2 id="prompt-suggestions">447<h2 id="prompt-suggestions">

446 提示建议448 提示建议

447</h2>449</h2>

Details

299 299 

300[Slack 中的 Claude Code](/docs/zh-CN/slack) 和[云端会话](/docs/zh-CN/claude-code-on-the-web)不属于网关部署的一部分。在云端会话的环境配置中设置的网关变量不会生效。如果您的流量必须保持在网关上,请不要为这些用户启用这些使用入口。300[Slack 中的 Claude Code](/docs/zh-CN/slack) 和[云端会话](/docs/zh-CN/claude-code-on-the-web)不属于网关部署的一部分。在云端会话的环境配置中设置的网关变量不会生效。如果您的流量必须保持在网关上,请不要为这些用户启用这些使用入口。

301 301 

302[远程控制](/docs/zh-CN/remote-control)和[语音听写](/docs/zh-CN/voice-dictation)都依赖于 claude.ai 身份:远程控制将实时会话与您的账户配对,语音听写到达 claude.ai 转录端点。当 `ANTHROPIC_API_KEY`、`ANTHROPIC_AUTH_TOKEN` 或 `apiKeyHelper` 处于活动状态时,它们不可用。远程控制在 `ANTHROPIC_BASE_URL` 指向非 Anthropic 主机时也被禁用,因此仅使用 claude.ai 登录是不够的。在 v2.1.196 之前,非 Anthropic 基础 URL 不会阻止远程控制。302[Remote Control](/docs/zh-CN/remote-control) 和[语音听写](/docs/zh-CN/voice-dictation)都依赖于 claude.ai 身份:Remote Control 将实时会话与您的账户配对,语音听写到达 claude.ai 转录端点。当 `ANTHROPIC_API_KEY`、`ANTHROPIC_AUTH_TOKEN` 或 `apiKeyHelper` 处于活动状态时,它们不可用。Remote Control 在 `ANTHROPIC_BASE_URL` 指向非 Anthropic 主机时也被禁用,因此仅使用 claude.ai 登录是不够的。

303 303 

304要恢复任一功能,请使用 claude.ai 登录并取消设置该功能检查的网关变量。`claude doctor` 的远程控制部分命名当前阻止远程控制的内容。304要恢复任一功能,请使用 claude.ai 登录并取消设置该功能检查的网关变量。`claude doctor` 的远程控制部分命名当前阻止远程控制的内容。

305 305 

mcp.md +3 −3

Details

283 项目服务器批准和工作区信任283 项目服务器批准和工作区信任

284</h4>284</h4>

285 285 

286从 v2.1.196 开始,`claude mcp list` 和 `claude mcp get` 仅从未签入仓库的设置文件中读取 `.mcp.json` 批准,直到您通过在其中运行 `claude` 并接受工作区信任对话框来信任工作区。克隆的仓库无法批准自己的服务器:提交到项目的 `.claude/settings.json` 的 [`enableAllProjectMcpServers`](/docs/zh-CN/settings-reference#enableallprojectmcpservers) 或 [`enabledMcpjsonServers`](/docs/zh-CN/settings-reference#enabledmcpjsonservers) 在不受信任的文件夹中被忽略,服务器保持在 `⏸ Pending approval` 而不是被连接和健康检查。286`claude mcp list` 和 `claude mcp get` 仅从未签入仓库的设置文件中读取 `.mcp.json` 批准,直到您通过在其中运行 `claude` 并接受工作区信任对话框来信任工作区。克隆的仓库无法批准自己的服务器:提交到项目的 `.claude/settings.json` 的 [`enableAllProjectMcpServers`](/docs/zh-CN/settings-reference#enableallprojectmcpservers) 或 [`enabledMcpjsonServers`](/docs/zh-CN/settings-reference#enabledmcpjsonservers) 在不受信任的文件夹中被忽略,服务器保持在 `⏸ Pending approval` 而不是被连接和健康检查。

287 287 

288这些来源的批准仍然适用于不受信任的文件夹:288这些来源的批准仍然适用于不受信任的文件夹:

289 289 


859 859 

860该通知每次宣布每个服务器一次,并在后续启动时将其排除在计数之外,直到该服务器已连接并再次需要登录。`/mcp` 仍然列出每个需要登录的服务器。860该通知每次宣布每个服务器一次,并在后续启动时将其排除在计数之外,直到该服务器已连接并再次需要登录。`/mcp` 仍然列出每个需要登录的服务器。

861 861 

862在非交互模式下,没有 `/mcp` 面板,因此 Claude Code 无法为您运行 OAuth 流程。从 v2.1.196 开始,当配置的服务器在启用了 [工具搜索](#scale-with-mcp-tool-search)(这是默认设置)的 `claude -p` 或 Agent SDK 运行期间需要身份验证时,Claude Code 会告诉 Claude 该服务器的工具不可用,直到您授权它。Claude 然后可以命名需要登录的服务器,而不是响应就像服务器未配置一样。从使用 `/mcp` 或 `claude mcp login <name>` 的交互式会话完成登录。862在非交互模式下,没有 `/mcp` 面板,因此 Claude Code 无法为您运行 OAuth 流程。当配置的服务器在启用了 [工具搜索](#scale-with-mcp-tool-search)(这是默认设置)的 `claude -p` 或 Agent SDK 运行期间需要身份验证时,Claude Code 会告诉 Claude 该服务器的工具在您授权之前不可用。Claude 随后可以指出需要登录的服务器。请在交互式会话中使用 `/mcp` 或 `claude mcp login <name>` 完成登录。

863 863 

864如果您为服务器配置了 `headers.Authorization`,而服务器拒绝了该标头,Claude Code 会报告连接失败,而不是回退到 OAuth。检查令牌对 MCP 端点是否有效,或删除标头以使用 OAuth 流程。864如果您为服务器配置了 `headers.Authorization`,而服务器拒绝了该标头,Claude Code 会报告连接失败,而不是回退到 OAuth。检查令牌对 MCP 端点是否有效,或删除标头以使用 OAuth 流程。

865 865 


1048 1048 

1049`oauth.scopes` 优先于 `authServerMetadataUrl` 和服务器在 `/.well-known` 处发现的范围。将其保留为未设置以让 MCP 服务器确定请求的范围集。1049`oauth.scopes` 优先于 `authServerMetadataUrl` 和服务器在 `/.well-known` 处发现的范围。将其保留为未设置以让 MCP 服务器确定请求的范围集。

1050 1050 

1051从 v2.1.196 开始,当未设置 `oauth.scopes` 时,Claude Code 请求服务器的 `WWW-Authenticate` 标头或其受保护资源元数据提供的范围,当两者都不提供时不发送 `scope` 参数。它不再从自动发现的授权服务器元数据请求完整的 `scopes_supported` 目录。请求该目录导致宣传仅限管理员或模板范围的身份提供者以 `invalid_scope` 错误拒绝授权请求。从配置的 `authServerMetadataUrl` 获取的元数据仍然将其 `scopes_supported` 作为请求的范围提供。1051当未设置 `oauth.scopes` 时,Claude Code 不会从自动发现的授权服务器元数据中请求完整的 `scopes_supported` 目录。从配置的 `authServerMetadataUrl` 获取的元数据仍会将其 `scopes_supported` 作为请求的作用域提供。

1052 1052 

1053如果授权服务器在 `scopes_supported` 中宣传 `offline_access`,Claude Code 会将其附加到固定范围,以便可以在没有新浏览器登录的情况下刷新访问令牌。1053如果授权服务器在 `scopes_supported` 中宣传 `offline_access`,Claude Code 会将其附加到固定范围,以便可以在没有新浏览器登录的情况下刷新访问令牌。

1054 1054 

Details

470 用引号包装值不会转义空格。例如,`org.name="My Company"` 导致文字值 `"My Company"`(包括引号),而不是 `My Company`。470 用引号包装值不会转义空格。例如,`org.name="My Company"` 导致文字值 `"My Company"`(包括引号),而不是 `My Company`。

471</Warning>471</Warning>

472 472 

473<h3 id="attribute-telemetry-to-desktop-ssh-sessions">

474 将遥测归因到 Desktop SSH 会话

475</h3>

476 

477要查看 [Desktop SSH 会话](/docs/zh-CN/desktop#ssh-sessions)在哪台远程机器上运行,请在自定义属性中为每台机器命名。指标和事件不会指明会话运行所在的机器。

478 

479在每台远程机器上,将 [`OTEL_RESOURCE_ATTRIBUTES`](#multi-team-organization-support) 添加到[会话读取的托管设置文件](/docs/zh-CN/desktop#managed-settings)中启用遥测的 `env` 块。在每台机器的文件中写出名称。Claude Code 不会展开该值,因此 `host.name=$(hostname)` 会按这些字符原样到达。

480 

481以下示例将机器命名为 `build-7`:

482 

483```json theme={null}

484{

485 "env": {

486 "CLAUDE_CODE_ENABLE_TELEMETRY": "1",

487 "OTEL_METRICS_EXPORTER": "otlp",

488 "OTEL_LOGS_EXPORTER": "otlp",

489 "OTEL_EXPORTER_OTLP_PROTOCOL": "grpc",

490 "OTEL_EXPORTER_OTLP_ENDPOINT": "http://collector.example.com:4317",

491 "OTEL_RESOURCE_ATTRIBUTES": "host.name=build-7"

492 }

493}

494```

495 

496当没有其他来源设置该变量时,`host.name` 会出现在资源块中,适用于 Desktop SSH 会话以及该机器上的 CLI。有关自定义属性还会出现在哪些位置,请参阅[多团队组织支持](#multi-team-organization-support)。

497 

498如果名称没有到达,请检查是否存在以下原因之一:

499 

500* **您在运行 Desktop 的计算机上设置了它**:Desktop 不会将您在那里设置的值传递给 SSH 会话

501* **您在登录文件中导出了它**:只有登录 shell 会读取 `/etc/profile` 之类的文件。您在其中 `export` 的值会传递给从登录 shell 启动的 Claude Code。它不会传递到 Desktop SSH 会话,因为 Desktop 不通过登录 shell 启动 Claude Code。

502* **某个值内部包含空格**:此时 Claude Code 不会将任何键复制到事件或数据点上,也不会报告错误。[从值中去掉空格](#multi-team-organization-support)。

503* **其他来源已经设置了该变量**:在桌面应用启动的会话中,启动环境中已设置的变量[优先于设置文件](/docs/zh-CN/settings-reference#how-env-values-interact-with-your-shell)。[调试日志](/docs/zh-CN/debug-your-config)会列出每个被忽略的变量。当第三方 Desktop 部署在其提供的环境中[指定 OTLP 端点](#how-managed-settings-lock-the-otlp-destination)时,该环境会带有 Desktop 自己的 `OTEL_RESOURCE_ATTRIBUTES`。

504 

473<h3 id="example-configurations">505<h3 id="example-configurations">

474 示例配置506 示例配置

475</h3>507</h3>


1746 1778 

1747所有指标和事件都使用以下资源属性导出:1779所有指标和事件都使用以下资源属性导出:

1748 1780 

1749* `service.name`:终端会话为 `claude-code`,从 [Claude Desktop 应用](/docs/zh-CN/desktop)中的代码选项卡启动的会话为 `claude-code-desktop`1781* `service.name`:终端会话为 `claude-code`,从 [Claude Desktop 应用](/docs/zh-CN/desktop)中的代码选项卡启动的本地会话为 `claude-code-desktop`

1750* `service.version`:当前 Claude Code 版本,或代码选项卡会话的 Desktop 应用版本1782* `service.version`:当前 Claude Code 版本,或本地代码选项卡会话的 Desktop 应用版本

1751* `os.type`:操作系统类型(例如,`linux`、`darwin`、`windows`)1783* `os.type`:操作系统类型(例如,`linux`、`darwin`、`windows`)

1752* `os.version`:操作系统版本字符串1784* `os.version`:操作系统版本字符串

1753* `host.arch`:主机架构(例如,`amd64`、`arm64`)1785* `host.arch`:主机架构(例如,`amd64`、`arm64`)

1754* `wsl.version`:WSL 版本号(仅在 Windows Subsystem for Linux 上运行时出现)1786* `wsl.version`:WSL 版本号(仅在 Windows Subsystem for Linux 上运行时出现)

1755* 仪表名称:`com.anthropic.claude_code`1787* 仪表名称:`com.anthropic.claude_code`

1756 1788 

1757如果您的收集器管道或仪表板在 `service.name = claude-code` 上进行过滤,请将 `claude-code-desktop` 添加到过滤器中,以便也捕获来自代码选项卡会话的遥测数据。1789如果您的收集器管道或仪表板在 `service.name = claude-code` 上进行过滤,请将 `claude-code-desktop` 添加到过滤器中,以便也捕获来自本地代码选项卡会话的遥测数据。

1758 1790 

1759<h2 id="roi-measurement-resources">1791<h2 id="roi-measurement-resources">

1760 ROI 测量资源1792 ROI 测量资源

Details

183 在设置中设置网络变量,而不是在 shell 中183 在设置中设置网络变量,而不是在 shell 中

184</h3>184</h3>

185 185 

186监督进程是由每个终端共享的一个进程。它继承启动它的第一个 shell 的环境,而操作系统安装的监督进程根本不接收任何 shell 环境。如果你仅在 shell 中导出代理、CA 路径或 mTLS 变量,当该 shell 碰巧冷启动监督进程时,它会到达后台代理,而当不同的 shell 启动时,它会无声地失败。186监督进程是由每个终端共享的一个进程。它继承最先启动它的那个 shell 的环境。如果您仅在 shell 中导出代理、CA 路径或 mTLS 变量,当该 shell 碰巧冷启动监督进程时,这些变量会到达后台 Agent;而当由另一个 shell 启动监督进程时,它们会无声地无法到达。

187 187 

188将相同的变量放在 `~/.claude/settings.json` 的 `env` 块中或[托管设置](/docs/zh-CN/settings)中。此页面上的每个变量都可以在那里设置,设置是唯一到达每台机器上每个后台会话的配置。188将相同的变量放在 `~/.claude/settings.json` 的 `env` 块中或[托管设置](/docs/zh-CN/settings)中。此页面上的每个变量都可以在那里设置,设置是唯一到达每台机器上每个后台会话的配置。

189 189 


196设置 [`processWrapper`](/docs/zh-CN/settings-reference#processwrapper) 设置以使用你的启动器为监督进程、其工作进程和[启动器覆盖的内容](/docs/zh-CN/corporate-launcher#what-the-launcher-covers)下列出的其他后台进程添加前缀。等效的 [`CLAUDE_CODE_PROCESS_WRAPPER`](/docs/zh-CN/env-vars) 环境变量在两者都设置时优先,它受相同规则约束:通过托管设置或 `~/.claude/settings.json` 传递它,而不是 shell 导出。[在企业启动器后面运行 Claude Code](/docs/zh-CN/corporate-launcher)涵盖启动器必须满足的合同、它做什么和不做什么,以及如何推出它。196设置 [`processWrapper`](/docs/zh-CN/settings-reference#processwrapper) 设置以使用你的启动器为监督进程、其工作进程和[启动器覆盖的内容](/docs/zh-CN/corporate-launcher#what-the-launcher-covers)下列出的其他后台进程添加前缀。等效的 [`CLAUDE_CODE_PROCESS_WRAPPER`](/docs/zh-CN/env-vars) 环境变量在两者都设置时优先,它受相同规则约束:通过托管设置或 `~/.claude/settings.json` 传递它,而不是 shell 导出。[在企业启动器后面运行 Claude Code](/docs/zh-CN/corporate-launcher)涵盖启动器必须满足的合同、它做什么和不做什么,以及如何推出它。

197 197 

198<Note>198<Note>

199 已运行的监督进程保持它启动时的启动配置。部署启动器设置后,运行 [`claude daemon stop --any`](/docs/zh-CN/agent-view#the-supervisor-process),以便下一个 `claude agents` 或 `--bg` 启动一个尊重它的监督进程。已安装的服务采用 `claude daemon stop` 而不需要 `--any`。199 已运行的监督进程保持它启动时的启动配置。部署启动器设置后,运行 [`claude daemon stop --any`](/docs/zh-CN/agent-view#the-supervisor-process),以便下一个 `claude agents` 或 `--bg` 启动一个遵循该设置的监督进程。

200</Note>200</Note>

201 201 

202<h2 id="streaming-idle-watchdogs">202<h2 id="streaming-idle-watchdogs">

Details

22| [`acceptEdits`](#auto-approve-file-edits-with-acceptedits-mode) | 读取、文件编辑和常见文件系统命令(`mkdir`、`touch`、`mv`、`cp` 等) | 迭代您正在审查的代码 |22| [`acceptEdits`](#auto-approve-file-edits-with-acceptedits-mode) | 读取、文件编辑和常见文件系统命令(`mkdir`、`touch`、`mv`、`cp` 等) | 迭代您正在审查的代码 |

23| [`plan`](#analyze-before-you-edit-with-plan-mode) | 读取,加上当 [auto 模式](#eliminate-prompts-with-auto-mode) 可用时分类器批准的命令 | 在更改代码库之前探索它 |23| [`plan`](#analyze-before-you-edit-with-plan-mode) | 读取,加上当 [auto 模式](#eliminate-prompts-with-auto-mode) 可用时分类器批准的命令 | 在更改代码库之前探索它 |

24| [`auto`](#eliminate-prompts-with-auto-mode) | 一切,带有后台安全检查 | 长任务,减少提示疲劳 |24| [`auto`](#eliminate-prompts-with-auto-mode) | 一切,带有后台安全检查 | 长任务,减少提示疲劳 |

25| [`dontAsk`](#allow-only-pre-approved-tools-with-dontask-mode) | 读取和预批准的工具;任何会提示的内容都被拒绝 | 锁定的 CI 和脚本 |25| [`dontAsk`](#allow-only-pre-approved-tools-with-dontask-mode) | 工作目录内的文件读取和预批准的工具;任何会提示的内容都被拒绝 | 锁定的 CI 和脚本 |

26| [`bypassPermissions`](#skip-all-checks-with-bypasspermissions-mode) | 一切 | 仅限隔离容器和虚拟机 |26| [`bypassPermissions`](#skip-all-checks-with-bypasspermissions-mode) | 一切 | 仅限隔离容器和虚拟机 |

27 27 

28审查每项操作的模式在 CLI 中名为 **Manual**,在 `claude --help` 中、在 VS Code 和 JetBrains 扩展中以及在桌面应用中也是如此。其配置值是 `default`,这是 hook 和 SDK 集成使用的。CLI 在您输入值的任何地方接受 `manual` 作为别名,例如 `claude --permission-mode manual` 或 `"defaultMode": "manual"`。28审查每项操作的模式在 CLI 中名为 **Manual**,在 `claude --help` 中、在 VS Code 和 JetBrains 扩展中以及在桌面应用中也是如此。其配置值是 `default`,这是 hook 和 SDK 集成使用的。CLI 在您输入值的任何地方接受 `manual` 作为别名,例如 `claude --permission-mode manual` 或 `"defaultMode": "manual"`。


466 首次读取工作目录之外的内容466 首次读取工作目录之外的内容

467</h3>467</h3>

468 468 

469当 [`permissions.blockReadsOutsideWorkingDirectories`](/docs/zh-CN/settings-reference#permissions-blockreadsoutsideworkingdirectories) 关闭时,在自动模式下文件读取无需提示即可运行,包括读取[工作目录](/docs/zh-CN/permissions#working-directories)之外的内容。当 Claude 首次对工作目录之外的路径使用 Read、Grep 或 Glob 工具时,Claude Code 会询问是否允许该读取。469当 [`permissions.blockReadsOutsideWorkingDirectories`](/docs/zh-CN/settings-reference#permissions-blockreadsoutsideworkingdirectories) 关闭时,在自动模式下,除[从网络路径读取](/docs/zh-CN/permissions#network-paths)之外的文件读取无需提示即可运行,包括读取[工作目录](/docs/zh-CN/permissions#working-directories)之外的内容。当 Claude 首次对工作目录之外的路径使用 Read、Grep 或 Glob 工具时,Claude Code 会询问是否允许该读取。

470 470 

471在非交互式 `-p` 运行或后台会话中不会出现该提示;这些情况下的读取照常运行。471在非交互式 `-p` 运行或后台会话中不会出现该提示;这些情况下的读取照常运行。

472 472 


530 每个操作都会经过固定的决策顺序。第一个匹配的步骤生效:530 每个操作都会经过固定的决策顺序。第一个匹配的步骤生效:

531 531 

532 1. 与您的 [allow、ask 或 deny 规则](/docs/zh-CN/permissions#manage-permissions)匹配的操作会立即得到处理,但以下情况除外:532 1. 与您的 [allow、ask 或 deny 规则](/docs/zh-CN/permissions#manage-permissions)匹配的操作会立即得到处理,但以下情况除外:

533 * 对[受保护路径](#protected-paths)的写入即使匹配了 allow 规则,也会交由分类器处理533 * 对[受保护路径](#protected-paths)的写入即使匹配了 allow 规则,也会交由分类器处理。当受保护路径是某个符号链接形式的设置文件所指向的文件时,该写入可能会改为提示您,如[受保护路径](#protected-paths)列表所述

534 * 任何 allow 规则都不会批准针对[关键路径](#critical-paths)的 `rm` 和 `rmdir` 删除操作534 * 任何 allow 规则都不会批准针对[关键路径](#critical-paths)的 `rm` 和 `rmdir` 删除操作

535 * 标记为 [`requiresUserInteraction`](/docs/zh-CN/mcp#require-approval-for-a-specific-tool) 的 MCP 工具即使匹配了 allow 规则,也会直接提示您;在[您的组织设置为 `ask`](/docs/zh-CN/mcp#organization-controls-on-connector-tools) 的连接器工具上也是如此(在该设置传达到 Claude Code 的会话中)535 * 标记为 [`requiresUserInteraction`](/docs/zh-CN/mcp#require-approval-for-a-specific-tool) 的 MCP 工具即使匹配了 allow 规则,也会直接提示您;在[您的组织设置为 `ask`](/docs/zh-CN/mcp#organization-controls-on-connector-tools) 的连接器工具上也是如此(在该设置传达到 Claude Code 的会话中)

536 * 携带[按命令允许的域名](/docs/zh-CN/sandboxing#per-command-allowed-domains-in-auto-mode)的 shell 命令即使匹配了 allow 规则,也会交由分类器处理,因为规则批准的是命令,而不是其主机536 * 携带[按命令允许的域名](/docs/zh-CN/sandboxing#per-command-allowed-domains-in-auto-mode)的 shell 命令即使匹配了 allow 规则,也会交由分类器处理,因为规则批准的是命令,而不是其主机

537 * 基于命令内容进行匹配的 ask 规则(例如 `Bash(git push *)`)会回退为权限提示537 * 基于命令内容进行匹配的 ask 规则(例如 `Bash(git push *)`)会回退为权限提示

538 * 当 Claude 请求的路径本身不受保护,但[符号链接检查](/docs/zh-CN/permissions#symlinks)将写入解析到受保护路径时,会提示您538 * 当 Claude 请求的路径本身不受保护,但[符号链接检查](/docs/zh-CN/permissions#symlinks)将写入解析到受保护路径时,会提示您

539 * 从[网络路径](/docs/zh-CN/permissions#network-paths)读取即使匹配了 allow 规则,也会提示您

539 2. 工作目录中的只读操作和文件编辑会被自动批准,但对[受保护路径](#protected-paths)的写入以及[首次读取工作目录之外的内容](#first-read-outside-the-working-directories)除外,后者会提示您540 2. 工作目录中的只读操作和文件编辑会被自动批准,但对[受保护路径](#protected-paths)的写入以及[首次读取工作目录之外的内容](#first-read-outside-the-working-directories)除外,后者会提示您

540 * 在启用了[服务器端分类器审查](#server-side-classifier-review)的会话中,只读和[沙箱化](/docs/zh-CN/sandboxing#sandbox-modes)的 shell 命令会等待该审查,如果审查标记了它们,则会被阻止541 * 在启用了[服务器端分类器审查](#server-side-classifier-review)的会话中,只读和[沙箱化](/docs/zh-CN/sandboxing#sandbox-modes)的 shell 命令会等待该审查,如果审查标记了它们,则会被阻止

541 * 当[符号链接检查](/docs/zh-CN/permissions#symlinks)将工作目录内的写入解析到工作目录之外的位置时,会提示您542 * 当[符号链接检查](/docs/zh-CN/permissions#symlinks)将工作目录内的写入解析到工作目录之外的位置时,会提示您

542 * 当 Claude 读取[他人制作的 Artifact](/docs/zh-CN/artifacts#read-an-artifact-shared-with-you) 时,适用该部分列出的批准情况543 * 当 Claude 读取[他人制作的 Artifact](/docs/zh-CN/artifacts#read-an-artifact-shared-with-you) 时,适用该部分列出的批准情况

544 * 从[网络路径](/docs/zh-CN/permissions#network-paths)读取会提示您

543 3. 其他所有操作都会交给分类器处理,按默认方式处理的[关键路径删除](#critical-paths)除外。在第 1 步中直接提示您的连接器工具和 `requiresUserInteraction` MCP 工具也永远不会到达分类器,因此组织要求的批准和同意步骤都不会被自动批准545 3. 其他所有操作都会交给分类器处理,按默认方式处理的[关键路径删除](#critical-paths)除外。在第 1 步中直接提示您的连接器工具和 `requiresUserInteraction` MCP 工具也永远不会到达分类器,因此组织要求的批准和同意步骤都不会被自动批准

544 4. 如果分类器阻止了操作,Claude 会收到原因。在大多数会话中,原因会指明分类器匹配的规则,例如 `[Data Exfiltration]`,而不是给出书面解释;请参阅[查看拒绝记录](/docs/zh-CN/auto-mode-config#review-denials)546 4. 如果分类器阻止了操作,Claude 会收到原因。在大多数会话中,原因会指明分类器匹配的规则,例如 `[Data Exfiltration]`,而不是给出书面解释;请参阅[查看拒绝记录](/docs/zh-CN/auto-mode-config#review-denials)

545 547 


593 595 

594Claude Code 拒绝与您的显式 [`ask` 规则](/docs/zh-CN/permissions#manage-permissions)匹配的调用,而不是提示。它还拒绝内置的 `AskUserQuestion` 工具,即使您的 allow 规则与其匹配,以及您的组织[设置为 `ask`](/docs/zh-CN/mcp#organization-controls-on-connector-tools) 的连接器工具在该设置到达 Claude Code 的会话中。它以相同的方式拒绝标记为 [`_meta["anthropic/requiresUserInteraction"]`](/docs/zh-CN/mcp#require-approval-for-a-specific-tool) 的 MCP 工具,因为其批准卡需要此模式永远不会收集的答案。596Claude Code 拒绝与您的显式 [`ask` 规则](/docs/zh-CN/permissions#manage-permissions)匹配的调用,而不是提示。它还拒绝内置的 `AskUserQuestion` 工具,即使您的 allow 规则与其匹配,以及您的组织[设置为 `ask`](/docs/zh-CN/mcp#organization-controls-on-connector-tools) 的连接器工具在该设置到达 Claude Code 的会话中。它以相同的方式拒绝标记为 [`_meta["anthropic/requiresUserInteraction"]`](/docs/zh-CN/mcp#require-approval-for-a-specific-tool) 的 MCP 工具,因为其批准卡需要此模式永远不会收集的答案。

595 597 

596`rm` 和 `rmdir` 移除针对[关键路径](#critical-paths)的操作,如 `rm -rf /` 和 `rm -rf ~`,即使 allow 规则与其匹配或 `PreToolUse` hook 允许它们,也被拒绝。598`rm` 和 `rmdir` 移除针对[关键路径](#critical-paths)的操作,如 `rm -rf /` 和 `rm -rf ~`,即使 allow 规则与其匹配或 `PreToolUse` hook 允许它们,也被拒绝。从[网络路径](/docs/zh-CN/permissions#network-paths)进行的读取也会以相同的方式被拒绝。

597 599 

598[网络上的 Claude Code](/docs/zh-CN/claude-code-on-the-web)上的云会话忽略 `defaultMode: "dontAsk"`;有关详细信息,请参阅 [bypassPermissions](#skip-all-checks-with-bypasspermissions-mode)。600[网络上的 Claude Code](/docs/zh-CN/claude-code-on-the-web)上的云会话忽略 `defaultMode: "dontAsk"`;有关详细信息,请参阅 [bypassPermissions](#skip-all-checks-with-bypasspermissions-mode)。

599 601 


639* **如果您接受**:Claude Code 在 `~/.claude/settings.json` 中将 `skipDangerousModePermissionPrompt` 设置为 `true`,因此后续会话会跳过对话框。要再次看到对话框,请从该文件中删除该键或将其设置为 `false`。[`skipDangerousModePermissionPrompt` 参考](/docs/zh-CN/settings-reference#skipdangerousmodepermissionprompt)列出了您或您的组织可以设置它的其他设置文件。641* **如果您接受**:Claude Code 在 `~/.claude/settings.json` 中将 `skipDangerousModePermissionPrompt` 设置为 `true`,因此后续会话会跳过对话框。要再次看到对话框,请从该文件中删除该键或将其设置为 `false`。[`skipDangerousModePermissionPrompt` 参考](/docs/zh-CN/settings-reference#skipdangerousmodepermissionprompt)列出了您或您的组织可以设置它的其他设置文件。

640* **如果您拒绝**:Claude Code 退出。642* **如果您拒绝**:Claude Code 退出。

641 643 

642在[非交互模式](/docs/zh-CN/headless)中不显示对话框,使用 `--bg` 启动的[后台会话](/docs/zh-CN/agent-view)会被拒绝,直到您在交互式会话中接受对话框。644在[非交互模式](/docs/zh-CN/headless)中不显示对话框。当您的接受记录在用户设置或托管设置中时,[后台会话](/docs/zh-CN/agent-view)会遵循该接受:

645 

646* 如果没有记录接受,`claude --bg --permission-mode bypassPermissions` 会被拒绝,直到您在交互式会话中接受对话框。

647* 如果 `skipDangerousModePermissionPrompt` 仅在 `.claude/settings.local.json` 中设置,后台会话启动时会忽略绕过请求,并固定显示通知 `Bypass permissions was requested at launch and ignored · if that was you, ~/.claude/settings.json needs "skipDangerousModePermissionPrompt": true`。要使绕过生效,请将该键添加到 `~/.claude/settings.json`,然后启动新的后台会话。

643 648 

644在 Linux 和 macOS 上,当以 root 身份或在 `sudo` 下运行时,Claude Code 拒绝以此模式启动:649在 Linux 和 macOS 上,当以 root 身份或在 `sudo` 下运行时,Claude Code 拒绝以此模式启动:

645 650 


708* `.devcontainer.json`713* `.devcontainer.json`

709* `.ripgreprc`、`pyrightconfig.json`714* `.ripgreprc`、`pyrightconfig.json`

710* `.mcp.json`、`.claude.json`715* `.mcp.json`、`.claude.json`

716* 当您的用户、项目或本地[设置文件](/docs/zh-CN/settings#settings-files-and-who-they-affect)本身是符号链接(例如指向 dotfiles 仓库)时,该设置文件所指向的文件。在将受保护路径写入路由到分类器的模式中,对此文件的写入会改为提示您,即使有允许规则匹配也是如此。如果该文件自身的路径同时也是某个设置文件的路径,例如另一个文件夹中的 `.claude/settings.json`,则该写入会像其他受保护路径写入一样交由分类器处理

711 717 

712<h2 id="critical-paths">718<h2 id="critical-paths">

713 关键路径719 关键路径


727 733 

728* 文件系统根目录734* 文件系统根目录

729* 顶级目录,意味着根目录的任何直接子目录,如 `/usr`、`/etc` 或 `/data`735* 顶级目录,意味着根目录的任何直接子目录,如 `/usr`、`/etc` 或 `/data`

730* 您的主目录736* 您的主目录。在 Windows 上,其 8.3 短名称也计算在内,如 `C:\Users\LONGNA~1`

731* Windows 驱动器根目录及其顶级目录,如 `C:\` 和 `C:\Windows`737* Windows 驱动器根目录及其顶级目录,如 `C:\` 和 `C:\Windows`。`\\?\C:\` 和 `\\localhost\C$` 等写法均视为 `C:\`

732* 您的工作目录及其父目录738* 您的工作目录及其父目录

733* 您的额外工作目录及其父目录,但仅当移除是其下的 glob 时,如 `rm -rf <dir>/*`。`rm -rf <dir>` 在目录本身上不会触发此检查739* 您的额外工作目录及其父目录,但仅当移除是其下的 glob 时,如 `rm -rf <dir>/*`。`rm -rf <dir>` 在目录本身上不会触发此检查

734 740 

741对主目录 8.3 短名称以及 `\\?\C:\` 和 `\\localhost\C$` 写法的检查需要 Claude Code v2.1.292 或更高版本。

742 

735<h3 id="other-targets-that-count-as-critical-paths">743<h3 id="other-targets-that-count-as-critical-paths">

736 计为关键路径的其他目标744 计为关键路径的其他目标

737</h3>745</h3>


747| 仅命令替换的输出的目标,当 `rm` 是递归的时 | `rm -rf "$(pwd)"` | Claude Code 无法在命令运行前检查目标 |755| 仅命令替换的输出的目标,当 `rm` 是递归的时 | `rm -rf "$(pwd)"` | Claude Code 无法在命令运行前检查目标 |

748| 关键路径后的尾部命令替换 | `rm -rf ~/$(cmd)` | Claude Code 检查如果替换扩展为空将保留的路径,此处为您的主目录 |756| 关键路径后的尾部命令替换 | `rm -rf ~/$(cmd)` | Claude Code 检查如果替换扩展为空将保留的路径,此处为您的主目录 |

749| 仅反斜杠的目标 | `rm -rf "\\"` | Windows 上的 Git Bash 将单个反斜杠读取为当前驱动器的根目录,因此检查适用于每个平台 |757| 仅反斜杠的目标 | `rm -rf "\\"` | Windows 上的 Git Bash 将单个反斜杠读取为当前驱动器的根目录,因此检查适用于每个平台 |

758| 通过 GUID 而非驱动器号命名卷的 Windows 路径 | `rm -rf '\\?\Volume{GUID}\work\build'` | 该路径未说明它位于哪个驱动器上,因此它可能是关键路径。需要 Claude Code v2.1.292 或更高版本 |

750| 部分以 `/*` 或 `/*/` 结尾的目标 | `rm -rf logs/*/*`、`rm -rf logs/*/`、`cd logs && rm -rf a/*` | Claude Code 无法在命令运行前判断它们会涉及哪些目录 |759| 部分以 `/*` 或 `/*/` 结尾的目标 | `rm -rf logs/*/*`、`rm -rf logs/*/`、`cd logs && rm -rf a/*` | Claude Code 无法在命令运行前判断它们会涉及哪些目录 |

751 760 

752要关闭仅命令替换输出的目标上的检查,请在启动 Claude Code 的环境中设置 [`CLAUDE_CODE_DISABLE_SUBSTITUTION_RM_PROMPT=1`](/docs/zh-CN/env-vars#variables)。761要关闭仅命令替换输出的目标上的检查,请在启动 Claude Code 的环境中设置 [`CLAUDE_CODE_DISABLE_SUBSTITUTION_RM_PROMPT=1`](/docs/zh-CN/env-vars#variables)。

permissions.md +39 −8

Details

36 36 

37在 v2.1.211 之前,Claude Code 总是在启动目录中保存规则,因此在工作树或子目录中授予的批准不适用于项目的其余部分。早期版本在子目录或工作树中保存的规则仍然适用于在那里启动的会话。37在 v2.1.211 之前,Claude Code 总是在启动目录中保存规则,因此在工作树或子目录中授予的批准不适用于项目的其余部分。早期版本在子目录或工作树中保存的规则仍然适用于在那里启动的会话。

38 38 

39有时权限提示仅提供一次性批准,没有"不再询问"选项,也没有允许操作在会话的其余部分进行的选项。Claude Code 仅在提示可以向您显示它们允许的所有内容时才提供这些选项,因此您从提示保存的规则仅涵盖其选项命名的内容。当提示仅提供一次性批准时,批准该操作一次,或在 [`/permissions`](#manage-permissions) 中自己添加规则。39有时权限提示仅提供一次性批准,没有"不再询问"选项,也没有允许操作在会话的其余部分进行的选项。Claude Code 仅在提示可以向您显示它们允许的所有内容时才提供这些选项,因此您从提示保存的规则仅涵盖其选项命名的内容。当提示仅提供一次性批准时,批准该操作一次,或在 [`/permissions`](#manage-permissions) 中自己添加规则。要停止针对以 `watch` 等 exec 包装器开头的命令的提示,或针对带有 `-delete` 等操作的 `find` 命令的提示,请参阅 [Exec 包装器和 `find` 操作](#exec-wrappers-and-find-actions)。

40 40 

41<h3 id="add-a-comment-when-you-answer-a-permission-prompt">41<h3 id="add-a-comment-when-you-answer-a-permission-prompt">

42 在回答权限提示时添加注释42 在回答权限提示时添加注释


91| `acceptEdits` | 自动接受工作目录或 `additionalDirectories` 中路径的文件编辑和常见文件系统命令,例如 `mkdir`、`touch`、`mv` 和 `cp` |91| `acceptEdits` | 自动接受工作目录或 `additionalDirectories` 中路径的文件编辑和常见文件系统命令,例如 `mkdir`、`touch`、`mv` 和 `cp` |

92| `plan` | Claude 读取文件并运行只读 shell 命令来探索,但不编辑您的源文件;在[自动模式](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode)可用的情况下,分类器批准的命令也会运行。在 CLI 和 VS Code 扩展中标记为 Plan |92| `plan` | Claude 读取文件并运行只读 shell 命令来探索,但不编辑您的源文件;在[自动模式](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode)可用的情况下,分类器批准的命令也会运行。在 CLI 和 VS Code 扩展中标记为 Plan |

93| `auto` | 无需常规提示即可运行;在 shell 命令和网络请求等操作运行之前,后台[分类器](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode)会检查它们是否与您的请求一致 |93| `auto` | 无需常规提示即可运行;在 shell 命令和网络请求等操作运行之前,后台[分类器](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode)会检查它们是否与您的请求一致 |

94| `dontAsk` | 自动拒绝每个会导致提示的调用;您的工作目录中的文件读取和其他不需要批准的操作仍会运行,通过 `/permissions` 或 `permissions.allow` 规则预先批准的工具也会运行。`AskUserQuestion`、标记为 [`requiresUserInteraction`](/docs/zh-CN/mcp#require-approval-for-a-specific-tool) 的 MCP 工具以及连接器工具[您的组织设置为 `ask`](/docs/zh-CN/mcp#organization-controls-on-connector-tools)在该设置到达 Claude Code 的会话中即使您已允许它们也会被拒绝 |94| `dontAsk` | 自动拒绝每个会导致提示的调用;您的工作目录中的文件读取和其他不需要批准的操作仍会运行,通过 `/permissions` 或 `permissions.allow` 规则预先批准的工具也会运行。`AskUserQuestion`、标记为 [`requiresUserInteraction`](/docs/zh-CN/mcp#require-approval-for-a-specific-tool) 的 MCP 工具、[从网络路径读取](#network-paths),以及[您的组织设置为 `ask`](/docs/zh-CN/mcp#organization-controls-on-connector-tools) 的连接器工具,在该设置到达 Claude Code 的会话中即使您已允许它们也会被拒绝 |

95| `bypassPermissions` | 跳过权限提示,除了[任何模式都不会自动批准的操作](/docs/zh-CN/permission-modes#actions-no-mode-auto-approves) |95| `bypassPermissions` | 跳过权限提示,除了[任何模式都不会自动批准的操作](/docs/zh-CN/permission-modes#actions-no-mode-auto-approves) |

96 96 

97<Warning>97<Warning>


240 Bash240 Bash

241</h3>241</h3>

242 242 

243Bash 规则匹配整个命令文本,其中 `*` 代表任何文本。[通配符模式](#wildcard-patterns)显示每个规则形状匹配的命令以及在哪里放置 `*`。本节的其余部分涵盖 Claude Code 如何匹配复合命令和包装器、规则不匹配的内容、只读命令和重定向。243Bash 规则匹配整个命令文本,其中 `*` 代表任何文本。[通配符模式](#wildcard-patterns)显示每个规则形状匹配的命令以及在哪里放置 `*`。本节的其余部分涵盖 Claude Code 如何匹配复合命令和包装器、哪些包装器和 `find` 操作无法通过前缀规则批准、规则不匹配的内容、只读命令和重定向。

244 244 

245<h4 id="compound-commands">245<h4 id="compound-commands">

246 复合命令246 复合命令


268 268 

269此包装器列表是内置的,不可配置。开发环境运行器,如 `direnv exec`、`devbox run`、`mise exec`、`npx` 和 `docker exec` 不在列表中。因为这些工具将其参数作为命令执行,像 `Bash(devbox run *)` 这样的规则匹配 `run` 之后的任何内容,包括 `devbox run rm -rf .`。要批准环境运行器内的工作,请编写一个包含运行器和内部命令的特定规则,如 `Bash(devbox run npm test)`。为您想要允许的每个内部命令添加一个规则。269此包装器列表是内置的,不可配置。开发环境运行器,如 `direnv exec`、`devbox run`、`mise exec`、`npx` 和 `docker exec` 不在列表中。因为这些工具将其参数作为命令执行,像 `Bash(devbox run *)` 这样的规则匹配 `run` 之后的任何内容,包括 `devbox run rm -rf .`。要批准环境运行器内的工作,请编写一个包含运行器和内部命令的特定规则,如 `Bash(devbox run npm test)`。为您想要允许的每个内部命令添加一个规则。

270 270 

271Exec 包装器,如 `watch`、`setsid`、`ionice` 和 `flock` 无法通过像 `Bash(watch *)` 这样的前缀规则自动批准,因此在 Manual 模式下它们总是提示。同样适用于带有 `-exec` 或 `-delete` 的 `find`:`Bash(find *)` 规则不涵盖这些形式。要批准特定调用,请为完整命令字符串编写精确匹配规则。271<h4 id="exec-wrappers-and-find-actions">

272 Exec 包装器和 `find` 操作

273</h4>

274 

275像 `Bash(watch *)` 或 `Bash(find *)` 这样的前缀规则无法自动批准以下命令,因此在 Manual 模式下它们会提示:

276 

277* **Exec 包装器**:如 `watch`、`setsid`、`ionice` 和 `flock`

278* **`find`**:带有运行命令、删除文件或写入文件的操作(如 `-exec`、`-delete` 或 `-fprint`),或带有 `-files0-from`(从文件中获取要搜索的路径)

279 

280要批准不含 `*` 的特定调用,请为完整命令字符串编写精确匹配规则,如 `Bash(find build -type f -delete)`。

281 

282当命令包含 `*` 时,如 `find . -name '*.tmp' -delete`,Claude Code 会将规则读作[通配符模式](#wildcard-patterns)而不是精确匹配,因此该命令仍然会提示。请在每次提示时批准它,或使用为其返回 `"allow"` 的 [PreToolUse hook](/docs/zh-CN/hooks#pretooluse-decision-control)。

272 283 

273<h4 id="bash-rule-limits">284<h4 id="bash-rule-limits">

274 Bash 规则不匹配的内容285 Bash 规则不匹配的内容


301* **具有写入能力标志的命令的未引用 glob**:具有写入能力或执行能力标志的命令,如 `find`、`sort`、`sed` 和 `git`,在存在未引用的 glob 时提示,因为 glob 可能扩展为像 `-delete` 这样的标志。312* **具有写入能力标志的命令的未引用 glob**:具有写入能力或执行能力标志的命令,如 `find`、`sort`、`sed` 和 `git`,在存在未引用的 glob 时提示,因为 glob 可能扩展为像 `-delete` 这样的标志。

302* **`docker` 指向另一个守护程序**:当命令携带选择不同守护程序的标志时,`docker` 的只读形式提示,如 `-H`、`--context` 或 Podman 的 `--url` 和 `--connection`。313* **`docker` 指向另一个守护程序**:当命令携带选择不同守护程序的标志时,`docker` 的只读形式提示,如 `-H`、`--context` 或 Podman 的 `--url` 和 `--connection`。

303* **`file` 带有路径打开标志**:当 `file` 传递 `-m`/`--magic-file` 或 `-f`/`--files-from` 时,`file` 提示,因为这些标志使 `file` 打开标志值中命名的路径。314* **`file` 带有路径打开标志**:当 `file` 传递 `-m`/`--magic-file` 或 `-f`/`--files-from` 时,`file` 提示,因为这些标志使 `file` 打开标志值中命名的路径。

315* **可能打印环境变量的 `ps`**:当 `ps` 的某个参数可能充当 `e` 选项时(如 `ps auxe` 或 `ps aux -e`),`ps` 会提示,因为该选项会打印进程环境变量。`ps aux` 和 `ps -ef` 无需提示即可运行。对 `ps aux -e` 等带短横线形式的检查需要 Claude Code v2.1.290 或更高版本。

304* **Windows 上的网络路径**:其参数包括网络 (UNC) 路径的命令,如 `\\server\share\file`,提示是因为访问网络路径可能会将您的 Windows 凭据发送到它命名的主机。同样的检查适用于[PowerShell 工具](/docs/zh-CN/tools-reference#powershell-tool)命令。316* **Windows 上的网络路径**:其参数包括网络 (UNC) 路径的命令,如 `\\server\share\file`,提示是因为访问网络路径可能会将您的 Windows 凭据发送到它命名的主机。同样的检查适用于[PowerShell 工具](/docs/zh-CN/tools-reference#powershell-tool)命令。

305* **写入特殊 shell 变量**:设置、取消设置或遍历某些特殊 shell 变量(如 `PATH` 或 `IFS`)的命令会提示,即使命令的其余部分是只读的。317* **写入特殊 shell 变量**:设置、取消设置或遍历某些特殊 shell 变量(如 `PATH` 或 `IFS`)的命令会提示,即使命令的其余部分是只读的。

306* **分析无法解析的命令**:当 Claude Code 无法完全解析命令时,它会要求批准而不是将命令视为只读。超过 10,000 个字符的命令总是提示,因为它们超过了分析解析的内容。318* **分析无法解析的命令**:当 Claude Code 无法完全解析命令时,它会要求批准而不是将命令视为只读。超过 10,000 个字符的命令总是提示,因为它们超过了分析解析的内容。


508 520 

509当工具随后打开已批准的文件时,它[确认路径仍然解析到权限检查批准的位置](/docs/zh-CN/errors#refusing-after-a-symlink-changed)。521当工具随后打开已批准的文件时,它[确认路径仍然解析到权限检查批准的位置](/docs/zh-CN/errors#refusing-after-a-symlink-changed)。

510 522 

523<h4 id="network-paths">

524 网络路径

525</h4>

526 

527当 Claude 的文件读取工具(如 Read、Grep 和 Glob)从网络路径读取时,该读取会经过单独的权限检查。网络路径是可以访问另一台计算机的路径:在 Windows 上是 UNC 路径,如 `\\server\share\file`;在 macOS 和 Linux 上是 `/net` 自动挂载路径,如 `/net/fileserver/notes.txt`。查找此类路径可能会联系它命名的主机,而在 Windows 上,这种联系可能会将您的凭据发送给该主机。Shell 命令有自己的检查:在 Manual 模式下,参数中包含 UNC 路径的只读 Bash 或 PowerShell 命令[在 Windows 上仍然会提示](#read-only-commands)。

528 

529在 Claude Code v2.1.292 及更高版本中,以下各项都不会取消该提示:

530 

531* **Allow 规则**:规则不会预先批准该读取,包括针对整个工具的规则,如 `Read`

532* **PreToolUse hook**:返回 `"allow"` 的 [hook](#extend-permissions-with-hooks) 不会跳过该提示

533* **自动模式**:提示会交给您,而不是由[分类器](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode)决定该读取

534 

535在 `dontAsk` 模式下,Claude Code 会拒绝该读取而不是提示。在 `bypassPermissions` 模式下,以及在可使用[绕过权限](/docs/zh-CN/permission-modes#skip-all-checks-with-bypasspermissions-mode)的交互式终端会话中处于计划模式时,该读取无需此提示即可运行。

536 

537要在没有此提示的情况下读取网络共享上的文件,请先为该共享提供一个本地路径:

538 

539* **Windows**:将共享映射到驱动器号,并在启动 Claude Code 时使用 `--add-dir` 传递该驱动器,如[工作目录](#working-directories)中所述

540* **macOS 和 Linux**:将共享挂载到本地路径(如 `/mnt` 或 `/Volumes` 下的目录),并从那里读取文件,如[工作目录是网络路径](/docs/zh-CN/errors#working-directory-is-a-network-path)中所述

541 

511<h3 id="webfetch">542<h3 id="webfetch">

512 WebFetch543 WebFetch

513</h3>544</h3>

514 545 

515WebFetch 规则使用 `domain:` 前缀并针对请求的 URL 的主机名进行匹配。匹配不区分大小写,支持 `*` 通配符,并从规则和主机名中剥离尾部 `.`,因此 `example.com.` 和 `example.com` 被视为相同。546WebFetch 规则使用 `domain:` 前缀并针对请求的 URL 的主机名进行匹配。匹配不区分大小写,支持 `*` 通配符,并从规则和主机名中剥离尾部 `.`,因此 `example.com.` 和 `example.com` 被视为相同。

516 547 

517* `WebFetch(domain:example.com)` 匹配对 `example.com` 的请求548* `WebFetch(domain:example.com)` 仅匹配对 `example.com` 的请求。要同时涵盖 `api.example.com` 等子域,请添加 `WebFetch(domain:*.example.com)` 规则

518* `WebFetch(domain:*.example.com)` 匹配任何深度的任何子域,如 `api.example.com` 或 `a.b.example.com`,但不匹配 `example.com` 本身549* `WebFetch(domain:*.example.com)` 匹配任何深度的任何子域,如 `api.example.com` 或 `a.b.example.com`,但不匹配 `example.com` 本身

519* `WebFetch(domain:*)` 匹配每个域。它与裸 `WebFetch` 规则不同;请参阅[允许或拒绝每次获取](#allow-or-deny-every-fetch)550* `WebFetch(domain:*)` 匹配每个域。它与裸 `WebFetch` 规则不同;请参阅[允许或拒绝每次获取](#allow-or-deny-every-fetch)

520 551 


622 653 

623请参见[决定是否信任模块](/docs/zh-CN/plugins/mods/overview#decide-whether-to-trust-a-mod),或如果您部署托管设置,请参见[为您的组织管理模块](/docs/zh-CN/plugins/mods/admin#know-what-happens-by-default)。654请参见[决定是否信任模块](/docs/zh-CN/plugins/mods/overview#decide-whether-to-trust-a-mod),或如果您部署托管设置,请参见[为您的组织管理模块](/docs/zh-CN/plugins/mods/admin#know-what-happens-by-default)。

624 655 

625标记为 [`requiresUserInteraction`](/docs/zh-CN/mcp#require-approval-for-a-specific-tool) 的 MCP 工具在 hook 返回 `"allow"` 时仍然会提示,连接器工具[您的组织设置为 `ask`](/docs/zh-CN/mcp#organization-controls-on-connector-tools) 的工具在该设置到达 Claude Code 的会话中也是如此。656对于[需要用户交互的工具](/docs/zh-CN/permission-modes#actions-no-mode-auto-approves),例如 `AskUserQuestion` 或标记为 `requiresUserInteraction` 的 MCP 工具,mod 的 `tool.check` 批准不会跳过提示。需要 Claude Code v2.1.292 或更高版本。标记为 [`requiresUserInteraction`](/docs/zh-CN/mcp#require-approval-for-a-specific-tool) 的 MCP 工具在 hook 返回 `"allow"` 时也仍然会提示,从[网络路径](#network-paths)进行的读取,以及在该设置到达 Claude Code 的会话中[您的组织设置为 `ask`](/docs/zh-CN/mcp#organization-controls-on-connector-tools) 的连接器工具也是如此。

626 657 

627阻止 hook 也优先于 allow 规则。以退出代码 2 退出的 hook 在权限规则被评估之前停止工具调用,因此即使 allow 规则会让调用继续,阻止也适用。要运行所有 Bash 命令而无需提示,除了您想要阻止的少数几个,将 `"Bash"` 添加到您的 allow 列表,并注册一个 PreToolUse hook 来拒绝那些特定命令。请参见[阻止对受保护文件的编辑](/docs/zh-CN/hooks-guide#block-edits-to-protected-files)以获取您可以调整的 hook 脚本。658阻止 hook 也优先于 allow 规则。以退出代码 2 退出的 hook 在权限规则被评估之前停止工具调用,因此即使 allow 规则会让调用继续,阻止也适用。要运行所有 Bash 命令而无需提示,除了您想要阻止的少数几个,将 `"Bash"` 添加到您的 allow 列表,并注册一个 PreToolUse hook 来拒绝那些特定命令。请参见[阻止对受保护文件的编辑](/docs/zh-CN/hooks-guide#block-edits-to-protected-files)以获取您可以调整的 hook 脚本。

628 659 


636* **会话期间**:使用 `/add-dir` 命令667* **会话期间**:使用 `/add-dir` 命令

637* **持久配置**:添加到[设置文件](/docs/zh-CN/settings#where-settings-live)中的 `additionalDirectories`668* **持久配置**:添加到[设置文件](/docs/zh-CN/settings#where-settings-live)中的 `additionalDirectories`

638 669 

639其他目录中的文件遵循与原始工作目录相同的权限规则:它们变为可读的而无需提示,文件编辑权限遵循当前权限模式。670其他目录中的文件遵循与原始工作目录相同的权限规则:除[网络路径](#network-paths)检查外,它们变为可读的而无需提示,文件编辑权限遵循当前权限模式。

640 671 

641您无法添加大多数[网络路径](/docs/zh-CN/errors#working-directory-is-a-network-path)(例如 UNC 共享 `\\server\share`)作为工作目录,因为查找它们可能会联系它们命名的主机。在 Windows 上,将共享映射到驱动器号,然后在启动时使用 `--add-dir` 传递该驱动器。672您无法添加大多数[网络路径](/docs/zh-CN/errors#working-directory-is-a-network-path)(例如 UNC 共享 `\\server\share`)作为工作目录,因为查找它们可能会联系它们命名的主机。在 Windows 上,将共享映射到驱动器号,然后在启动时使用 `--add-dir` 传递该驱动器。

642 673 


648 将会话移动到另一个目录679 将会话移动到另一个目录

649</h3>680</h3>

650 681 

651要将会话移动到不同的主工作目录,而不是[在当前目录旁添加目录](#working-directories),请运行 `/cd <path>`。Claude Code 保持对话,加载新目录的 `CLAUDE.md`,如果您之前未在其中工作过,会提示您[信任工作区](#project-allow-rules-and-workspace-trust)。之后,当您从新目录运行 `--resume` 时,Claude Code [找到移动的会话](/docs/zh-CN/sessions#resume-a-session)。682要将会话移动到不同的主工作目录,而不是[在当前目录旁添加目录](#working-directories),请运行 `/cd <path>`。Claude Code 保持对话,加载新目录的 `CLAUDE.md`,如果您之前未在其中工作过,会提示您[信任工作区](#project-allow-rules-and-workspace-trust)。之后,当您从新目录运行 `--resume` 时,Claude Code [找到移动的会话](/docs/zh-CN/sessions#where-the-session-picker-looks)。

652 683 

653移动后,Claude Code 立即应用新目录的项目配置:684移动后,Claude Code 立即应用新目录的项目配置:

654 685 

Details

790 790 

791`hooks/hooks.json` 和 `hooks` 清单键中的 hooks 都会加载。对于每个事件及其有效负载,参见 [Hook 事件](/docs/zh-CN/hooks#hook-events)。791`hooks/hooks.json` 和 `hooks` 清单键中的 hooks 都会加载。对于每个事件及其有效负载,参见 [Hook 事件](/docs/zh-CN/hooks#hook-events)。

792 792 

793当另一个已启用的插件具有相同名称时,两者中只有一个会注册其 `hooks/hooks.json` 中的 hook,另一个的 hook 会被排除。关于是哪一个,以及 `/plugin` 中告知您此情况的提示,参见 [两个已启用插件同名时的 hook](/docs/zh-CN/plugins/loading#hooks-when-two-enabled-plugins-share-a-name)。

794 

793要将 hooks 写成在 Claude Code 内运行并可以在其界面中绘制的 JavaScript 函数,在同一 `hooks/hooks.json` 中的 `modules` 键下列出一个模块文件。具有一个的插件是 mod。参见 [创建 mod](/docs/zh-CN/plugins/mods/create)。795要将 hooks 写成在 Claude Code 内运行并可以在其界面中绘制的 JavaScript 函数,在同一 `hooks/hooks.json` 中的 `modules` 键下列出一个模块文件。具有一个的插件是 mod。参见 [创建 mod](/docs/zh-CN/plugins/mods/create)。

794 796 

795<h4 id="when-plugin-hooks-fire">797<h4 id="when-plugin-hooks-fire">

Details

209* **具有自身存储库的 plugin**:安装失败,消息包含 `Dependency "secrets-vault@your-marketplace" has no git tag satisfying`。209* **具有自身存储库的 plugin**:安装失败,消息包含 `Dependency "secrets-vault@your-marketplace" has no git tag satisfying`。

210* **由相对路径引用的 plugin**:安装改为使用市场的当前副本,约束在 plugin 加载时被检查。如果该副本在范围之外,依赖的 plugin 保持禁用,`claude plugin list` 显示 `Requires "secrets-vault@your-marketplace" ~2.1.0, installed 3.0.0`。210* **由相对路径引用的 plugin**:安装改为使用市场的当前副本,约束在 plugin 加载时被检查。如果该副本在范围之外,依赖的 plugin 保持禁用,`claude plugin list` 显示 `Requires "secrets-vault@your-marketplace" ~2.1.0, installed 3.0.0`。

211 211 

212对于市场通过相对路径引用的 plugin,你添加为本地文件夹路径的市场也会针对该文件夹的 git 标签解析约束,当该文件夹是 git 存储库时。这需要 Claude Code v2.1.196 或更高版本。不是 git 存储库的本地文件夹没有标签,所以 Claude Code 改为从文件夹的当前内容安装依赖。212对于市场通过相对路径引用的插件,当您添加为本地文件夹路径的市场所在文件夹是 git 仓库时,该市场也会针对该文件夹的 git 标签解析约束。不是 git 仓库的本地文件夹没有标签,所以 Claude Code 改为从文件夹的当前内容安装依赖。

213 213 

214<h3 id="confirm-the-resolved-version">214<h3 id="confirm-the-resolved-version">

215 确认解析的版本215 确认解析的版本

Details

144这些条目源不需要 git 账户:144这些条目源不需要 git 账户:

145 145 

146* **`archive`**:通过 HTTPS 下载的 zip。用户既不需要 `git` 也不需要账户,只需要对 URL 的网络访问。需要 Claude Code v2.1.224 或更高版本。用 `sha256` 固定每个存档,以便 Claude Code 拒绝更改的下载。要随下载发送凭证,请参阅 [认证存档下载](#authenticate-archive-downloads)。146* **`archive`**:通过 HTTPS 下载的 zip。用户既不需要 `git` 也不需要账户,只需要对 URL 的网络访问。需要 Claude Code v2.1.224 或更高版本。用 `sha256` 固定每个存档,以便 Claude Code 拒绝更改的下载。要随下载发送凭证,请参阅 [认证存档下载](#authenticate-archive-downloads)。

147* **公共 git 仓库**:当条目给出 `https://` URL 时,Claude Code 通过 HTTPS 克隆公共 `url` 或 `git-subdir` 源,无需凭证。对于 `github` 源或写成 `owner/repo` 的 `git-subdir` 源,没有 GitHub SSH 密钥的用户设置 `CLAUDE_CODE_PLUGIN_PREFER_HTTPS=1`。147* **公共 git 仓库**:当条目给出 `https://` URL 时,Claude Code 会通过 HTTPS 克隆公共 `url` 或 `git-subdir` 源,无需凭据。对于 `github` 源,或写成 `owner/repo` 形式的 `git-subdir` 源,请告知没有 GitHub SSH 密钥的用户设置 `CLAUDE_CODE_PLUGIN_PREFER_HTTPS=1`。

148 

149即使在没有 SSH 密钥的机器上从 shell 运行 `claude plugin install` 不设置该变量也能成功,也请在您的说明中保留 `CLAUDE_CODE_PLUGIN_PREFER_HTTPS=1`。对于 `github` 源,该命令可能会自行回退到 HTTPS,并输出 `SSH not configured, cloning via HTTPS`。在会话内通过 `/plugin` 进行的安装以及插件更新不会回退,因此如果不设置该变量,没有 GitHub SSH 密钥的用户会遇到失败。

148 150 

149对于一个网络上的团队,共享文件系统上的 `directory` marketplace 也可以在没有 git 账户的情况下工作。用户只需要对路径的读取访问权限。151对于一个网络上的团队,共享文件系统上的 `directory` marketplace 也可以在没有 git 账户的情况下工作。用户只需要对路径的读取访问权限。

150 152 

Details

80 80 

81云会话不会添加存储库在 [`extraKnownMarketplaces`](/docs/zh-CN/settings-reference#extraknownmarketplaces) 下列出的市场,因为这需要工作区信任对话框,云会话永远不会显示。81云会话不会添加存储库在 [`extraKnownMarketplaces`](/docs/zh-CN/settings-reference#extraknownmarketplaces) 下列出的市场,因为这需要工作区信任对话框,云会话永远不会显示。

82 82 

83项目范围的技能目录插件仅从会话[主工作目录](/docs/zh-CN/permissions#working-directories)的 `.claude/skills/` 加载,并且仅在您接受该文件夹的[工作区信任对话框](/docs/zh-CN/permissions#what-runs-before-you-trust-a-folder)后加载。它不会[搜索从存储库根目录向上的父目录](/docs/zh-CN/skills#discovery-from-parent-and-nested-directories),就像普通技能和命令那样。如果您从子目录启动,存储库根目录中的插件不会加载。改为从存储库根目录启动,或 [使用 `/cd` 将会话移到那里](/docs/zh-CN/permissions#move-the-session-to-another-directory)(v2.1.246 或更高版本)。83如果仓库 `.claude/skills/` 中的插件未加载,请检查您在何处启动了会话以及是否信任了该文件夹:

84 

85* **在子目录中**:仓库根目录中的插件不会加载。Claude Code 读取会话[主工作目录](/docs/zh-CN/permissions#working-directories)的 `.claude/skills/`,并且与普通 skill 和命令不同,它不会为插件[搜索父目录](/docs/zh-CN/skills#discovery-from-parent-and-nested-directories)。请改为从仓库根目录启动,或在 v2.1.246 或更高版本上 [使用 `/cd` 将会话移到那里](/docs/zh-CN/permissions#move-the-session-to-another-directory)

86* **从桌面应用启动、在 worktree 中**:插件从主检出的 `.claude/skills/` 加载,而不是从 worktree 的 `.claude/skills/` 加载。请参阅 [worktree 与主检出共享的内容](/docs/zh-CN/worktrees#what-worktrees-share-with-the-main-checkout)

87* **在您尚未信任的文件夹中**:插件仅在您接受该文件夹的[工作区信任对话框](/docs/zh-CN/permissions#what-runs-before-you-trust-a-folder)后加载

84 88 

85项目范围的插件被检入存储库,并到达克隆它的每个协作者。因为该内容来自存储库而不是来自您,它仅在应用于 `.claude/settings.json` 中项目允许规则的相同信任检查后加载。信任父文件夹或使用 `-p` 运行是不够的。运行代码的组件受到进一步限制:89项目范围的插件被检入存储库,并到达克隆它的每个协作者。因为该内容来自存储库而不是来自您,它仅在应用于 `.claude/settings.json` 中项目允许规则的相同信任检查后加载。信任父文件夹或使用 `-p` 运行是不够的。运行代码的组件受到进一步限制:

86 90 


421 425 

422因为顺序比较清单名称,名为 `hello-plugin` 的 `--plugin-dir` 插件在该插件的清单也说 `"name": "hello-plugin"` 时替换 `hello@example-marketplace`。426因为顺序比较清单名称,名为 `hello-plugin` 的 `--plugin-dir` 插件在该插件的清单也说 `"name": "hello-plugin"` 时替换 `hello@example-marketplace`。

423 427 

428<h3 id="hooks-when-two-enabled-plugins-share-a-name">

429 两个已启用插件同名时的 hook

430</h3>

431 

432当您从不同市场安装并启用两个具有相同清单名称的插件时,两者在 `/plugin` 中都显示为已启用,但其中一个的 hook 会被略过。每个名称只有一个插件会注册其 `hooks/hooks.json` 中的 hook,每个名称也只有一个插件会加载 [hook 模块](/docs/zh-CN/plugins/mods/overview)。当您组织的托管设置启用了其中一个副本时,该副本占有此名称。否则,由 Claude Code 首先加载的副本占有此名称。

433 

434要查看哪个副本占有此名称,请在会话中运行 `/plugin` 并打开 **Errors** 选项卡。对于 hook 被略过的副本,那里会有一条说明,指出占有此名称的副本,被略过副本的详细信息中也会显示相同的说明。对于 `hooks/hooks.json` 中的 hook,说明以 `Its hooks.json hooks do not run` 开头;对于 hook 模块,说明以 `Its hooks module does not load` 开头。此说明需要 Claude Code v2.1.296 或更高版本。

435 

436要改为运行被略过副本的 hook,请禁用或卸载占有此名称的副本,然后在会话中运行 `/reload-plugins`。重新加载会注册剩余副本的 hook 并清除该说明。当占有此名称的副本是由您的托管设置启用的副本时,您无法禁用它,只要两者都已安装,另一个副本的 hook 就会保持关闭。

437 

424<h3 id="keep-a-session-only-plugin-from-loading">438<h3 id="keep-a-session-only-plugin-from-loading">

425 防止会话专用插件加载439 防止会话专用插件加载

426</h3>440</h3>

Details

51* <span id="reserved-name-spellings" />**保留名称的另一种拼写**:与保留名称仅在尾部点或用除下划线以外的符号代替连字符的名称,因此 `claude.code.plugins` 计为 `claude-code-plugins`。添加 marketplace 失败,错误为 [`is another spelling of "<reserved>", a reserved marketplace name`](/docs/zh-CN/errors#marketplace-name-is-another-spelling-of-a-reserved-name),已在一个下注册的 marketplace 停止加载。此检查需要 Claude Code v2.1.280 或更高版本。51* <span id="reserved-name-spellings" />**保留名称的另一种拼写**:与保留名称仅在尾部点或用除下划线以外的符号代替连字符的名称,因此 `claude.code.plugins` 计为 `claude-code-plugins`。添加 marketplace 失败,错误为 [`is another spelling of "<reserved>", a reserved marketplace name`](/docs/zh-CN/errors#marketplace-name-is-another-spelling-of-a-reserved-name),已在一个下注册的 marketplace 停止加载。此检查需要 Claude Code v2.1.280 或更高版本。

52* **Claude Code 用于不来自 marketplace 的插件的名称**:`inline` 用于使用 [`--plugin-dir`](/docs/zh-CN/cli-reference) 加载的插件,`builtin` 用于内置插件,`skills-dir` 用于从 [`.claude/skills/`](/docs/zh-CN/skills) 自动加载的插件,`synced` 用于从你的 claude.ai 账户同步的插件。`claude-plugin-test` 也被保留。`skills-dir` 也显示为 `{"source": "skills-dir"}`,在 `strictKnownMarketplaces` 和 `blockedMarketplaces` 中,如 [仅在策略列表中有效的源值](#source-values-valid-only-in-policy-lists) 下所述。52* **Claude Code 用于不来自 marketplace 的插件的名称**:`inline` 用于使用 [`--plugin-dir`](/docs/zh-CN/cli-reference) 加载的插件,`builtin` 用于内置插件,`skills-dir` 用于从 [`.claude/skills/`](/docs/zh-CN/skills) 自动加载的插件,`synced` 用于从你的 claude.ai 账户同步的插件。`claude-plugin-test` 也被保留。`skills-dir` 也显示为 `{"source": "skills-dir"}`,在 `strictKnownMarketplaces` 和 `blockedMarketplaces` 中,如 [仅在策略列表中有效的源值](#source-values-valid-only-in-policy-lists) 下所述。

53* **`npm`、`pip`、`uv`、`cargo`、`github` 和 `gh`**:以任何大小写保留。此检查需要 Claude Code v2.1.275 或更高版本。53* **`npm`、`pip`、`uv`、`cargo`、`github` 和 `gh`**:以任何大小写保留。此检查需要 Claude Code v2.1.275 或更高版本。

54* **每个 JavaScript 对象都具有的成员名称**:`constructor`、`hasOwnProperty`、`isPrototypeOf`、`propertyIsEnumerable`、`toLocaleString`、`toString` 和 `valueOf`。`claude plugin marketplace add` 会拒绝使用其中之一的市场,错误为 [`Claude Code reserves this name and cannot register a marketplace under it`](/docs/zh-CN/plugins/troubleshooting#claude-code-reserves-this-name)。此检查需要 Claude Code v2.1.296 或更高版本。

54* **以 `claudeai-` 开头的名称**:为托管在 claude.ai 上的 marketplace 保留。`claude plugin marketplace add` 拒绝任何其他使用一个的 marketplace,错误为 `Cannot add marketplace "<name>": names starting with "claudeai-" are reserved for marketplaces hosted on claude.ai`。55* **以 `claudeai-` 开头的名称**:为托管在 claude.ai 上的 marketplace 保留。`claude plugin marketplace add` 拒绝任何其他使用一个的 marketplace,错误为 `Cannot add marketplace "<name>": names starting with "claudeai-" are reserved for marketplaces hosted on claude.ai`。

55* **已注册 GitHub 市场的下载文件夹名称 `<owner>-<repo>`**:对于从 `github` 源(例如 `acme/x-tools`)添加的市场,无论该市场自身的 `name` 是什么,Claude Code 都会通过名为 `acme-x-tools` 的文件夹下载它。当该市场以 `acme-x-tools` 以外的名称注册时,`claude plugin marketplace add` 会在下载另一个名为 `acme-x-tools` 的市场后拒绝它,并报告 `Can't use the marketplace name "acme-x-tools"`。此检查需要 Claude Code v2.1.290 或更高版本。56* **已注册 GitHub 市场的下载文件夹名称 `<owner>-<repo>`**:对于从 `github` 源(例如 `acme/x-tools`)添加的市场,无论该市场自身的 `name` 是什么,Claude Code 都会通过名为 `acme-x-tools` 的文件夹下载它。当该市场以 `acme-x-tools` 以外的名称注册时,`claude plugin marketplace add` 会在下载另一个名为 `acme-x-tools` 的市场后拒绝它,并报告 `Can't use the marketplace name "acme-x-tools"`。此检查需要 Claude Code v2.1.290 或更高版本。

56 57 

Details

68* **保护程序保护您管理的内容。** 用户的 mod 无法更改您的托管 hooks 接收或决定的内容、系统提示、您的托管 `CLAUDE.md` 和其他托管说明、任何 mod 读取的设置内容,或您的托管 MCP 服务器的工具和描述。68* **保护程序保护您管理的内容。** 用户的 mod 无法更改您的托管 hooks 接收或决定的内容、系统提示、您的托管 `CLAUDE.md` 和其他托管说明、任何 mod 读取的设置内容,或您的托管 MCP 服务器的工具和描述。

69* **允许所有其他内容。** 保护程序不添加其他限制。用户的 mod 仍然可以读写文件、启动进程、发出网络请求、重写工具调用和提示、拒绝工具调用、批准否则会提示的工具调用,以及在界面中绘制,所有这些都具有该用户的权限。69* **允许所有其他内容。** 保护程序不添加其他限制。用户的 mod 仍然可以读写文件、启动进程、发出网络请求、重写工具调用和提示、拒绝工具调用、批准否则会提示的工具调用,以及在界面中绘制,所有这些都具有该用户的权限。

70* **拒绝规则和您的托管 hook 优先。** 保护程序加载的地方,用户的 mod 无法批准 `deny` 规则拒绝的调用,无论哪个设置文件持有该规则。来自托管设置中 `PreToolUse` hook 的阻止也是最终的。两者都适用于 Claude 的工具调用。两者都不适用于 mod 自己的 [`$.fs` 和 `$.process` 调用](/docs/zh-CN/plugins/mods/api#reach-files-processes-and-the-network):即使 `Read(.env)` 被拒绝,mod 仍然可以使用 `$.fs.read` 读取该文件或启动执行此操作的程序。要限制这些调用,请防止 mod 加载或在[策略 mod](#enforce-a-policy-with-a-mod-of-your-own) 中处理该调用。70* **拒绝规则和您的托管 hook 优先。** 保护程序加载的地方,用户的 mod 无法批准 `deny` 规则拒绝的调用,无论哪个设置文件持有该规则。来自托管设置中 `PreToolUse` hook 的阻止也是最终的。两者都适用于 Claude 的工具调用。两者都不适用于 mod 自己的 [`$.fs` 和 `$.process` 调用](/docs/zh-CN/plugins/mods/api#reach-files-processes-and-the-network):即使 `Read(.env)` 被拒绝,mod 仍然可以使用 `$.fs.read` 读取该文件或启动执行此操作的程序。要限制这些调用,请防止 mod 加载或在[策略 mod](#enforce-a-policy-with-a-mod-of-your-own) 中处理该调用。

71* **其他权限检查可以被覆盖。** 批准工具调用的用户 mod 可以批准 `ask` 规则会提示的调用,或 `PreToolUse` hook 在托管设置外阻止的调用。在自动模式下,mod 批准的调用运行时不进行分类器检查。71* **其他权限检查可以被覆盖。** 批准工具调用的用户 mod 可以批准 `ask` 规则会提示的调用,或 `PreToolUse` hook 在托管设置外阻止的调用。在自动模式下,mod 批准的调用运行时不进行分类器检查。对于 mod 的 `tool.check` 批准不会跳过的提示,请参阅[使用 hook 扩展权限](/docs/zh-CN/permissions#extend-permissions-with-hooks)。

72 72 

73保护程序的源代码在 [Claude Code 存储库的 `mods/sec-default` 目录](https://github.com/anthropics/claude-code/tree/main/mods/sec-default)中是公开的。73保护程序的源代码在 [Claude Code 存储库的 `mods/sec-default` 目录](https://github.com/anthropics/claude-code/tree/main/mods/sec-default)中是公开的。

74 74 


81* **设置 hooks 继续工作。** 设置文件和插件的 `hooks/hooks.json` 中的命令、HTTP、提示和代理 hooks 照常运行,与 mods 一起。关于它们的任何内容都没有被弃用。81* **设置 hooks 继续工作。** 设置文件和插件的 `hooks/hooks.json` 中的命令、HTTP、提示和代理 hooks 照常运行,与 mods 一起。关于它们的任何内容都没有被弃用。

82* **拒绝规则在保护程序加载的地方优先。** 用户的 mod 无法批准 `deny` 规则拒绝的调用,除非您设置 [`allowModsToOverrideDenyRules`](#set-options-on-the-built-in-guard)。82* **拒绝规则在保护程序加载的地方优先。** 用户的 mod 无法批准 `deny` 规则拒绝的调用,除非您设置 [`allowModsToOverrideDenyRules`](#set-options-on-the-built-in-guard)。

83* **托管 hooks 首先运行。** 托管设置中的 `PreToolUse` hook 在任何 mod 看到工具调用之前运行,其块是最终的。如果 mod 随后重写调用,您的托管 hooks 在重写的调用上再次运行,因此块仍然适用。来自其他设置文件和插件的 `PreToolUse` hooks 在最后一个 mod 之后运行,因此返回自己结果代替运行工具的 mod 会阻止这些运行。请参阅[mods 运行的顺序](/docs/zh-CN/plugins/mods/events#the-order-mods-run-in)。83* **托管 hooks 首先运行。** 托管设置中的 `PreToolUse` hook 在任何 mod 看到工具调用之前运行,其块是最终的。如果 mod 随后重写调用,您的托管 hooks 在重写的调用上再次运行,因此块仍然适用。来自其他设置文件和插件的 `PreToolUse` hooks 在最后一个 mod 之后运行,因此返回自己结果代替运行工具的 mod 会阻止这些运行。请参阅[mods 运行的顺序](/docs/zh-CN/plugins/mods/events#the-order-mods-run-in)。

84* **网络策略涵盖 `$.http.fetch`。** 如果您的组织关闭了网络获取,或为会话关闭了非必要的网络流量,Claude Code 会拒绝 mod 使用 `$.http.fetch` 发出的网络请求。该策略不涵盖 mod 使用 `$.process.run` 启动的程序。该程序使用用户自己的访问权限到达网络。84* **网络策略涵盖 `$.http.fetch`。**

85 

86 * **您的组织策略不允许 WebFetch**:Claude Code 也会拒绝每个 mod 的 `$.http.fetch` 请求。请参阅 [WebFetch 可用性](/docs/zh-CN/tools-reference#webfetch-availability)。

87 * **您设置了 [`CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC`](/docs/zh-CN/env-vars)**:您或您的用户安装的 mod 仍然可以发出这些请求。该变量仅阻止 [Claude Code 内置的 mod](/docs/zh-CN/plugins/mods/overview#mods-built-into-claude-code),以及任何携带会话 Anthropic 凭据的 `$.http.fetch` 请求。在 v2.1.288 之前,该变量会阻止每个 mod 的 `$.http.fetch` 请求。

88 

89 两者都不涵盖 mod 使用 `$.process.run` 启动的程序,该程序使用用户自己的访问权限访问网络。

85* **插件控制涵盖 mods。** Mod 是一个插件,因此[限制用户可以安装的内容的设置](/docs/zh-CN/plugins/org#restrict-what-users-can-install),例如 `strictKnownMarketplaces`,决定它是否可以被安装。90* **插件控制涵盖 mods。** Mod 是一个插件,因此[限制用户可以安装的内容的设置](/docs/zh-CN/plugins/org#restrict-what-users-can-install),例如 `strictKnownMarketplaces`,决定它是否可以被安装。

86* **Mods 无法更改权限提示。** Mod 可以重新设置 Claude Code 界面的大部分样式,但不能更改权限提示,因此它无法更改提示显示的内容。Mod 仍然可以在提示出现之前批准或拒绝工具调用,如[了解默认情况下会发生什么](#know-what-happens-by-default)所述。91* **Mods 无法更改权限提示。** Mod 可以重新设置 Claude Code 界面的大部分样式,但不能更改权限提示,因此它无法更改提示显示的内容。Mod 仍然可以在提示出现之前批准或拒绝工具调用,如[了解默认情况下会发生什么](#know-what-happens-by-default)所述。

87* **信任提示首先出现。** 在用户尚未信任的目录中的交互式会话中,在他们回答信任提示之前,没有 mod 加载。92* **信任提示首先出现。** 在用户尚未信任的目录中的交互式会话中,在他们回答信任提示之前,没有 mod 加载。

Details

303| `$.session` | `messages()` 将会话记录作为 `{ role, text, toolUses }` 列表返回。还有工作目录、模型等。[`usage()`](/docs/zh-CN/plugins/mods/reference#mods-api-methods) 返回上下文窗口使用和计划限制。 |303| `$.session` | `messages()` 将会话记录作为 `{ role, text, toolUses }` 列表返回。还有工作目录、模型等。[`usage()`](/docs/zh-CN/plugins/mods/reference#mods-api-methods) 返回上下文窗口使用和计划限制。 |

304| `$.mcp` | `call` 连接的 MCP 服务器上的工具 |304| `$.mcp` | `call` 连接的 MCP 服务器上的工具 |

305 305 

306文件和进程有一些自己的规则:306文件、进程和请求有一些自己的规则:

307 307 

308* **路径**:相对路径相对于会话的工作目录进行解析308* **路径**:相对路径相对于会话的工作目录进行解析,或相对于 hook 正在处理其事件的子代理的工作目录进行解析

309* **`$.fs.list`**:将一个目录的条目作为 `{ name, kind, size, isLink }` 返回,不进行递归309* **`$.fs.list`**:将一个目录的条目作为 `{ name, kind, size, isLink }` 返回,不进行递归

310* **`$.process.run`**:接受参数列表,不使用 shell。它解析为 `{ exitCode, stdout, stderr }`,无论退出码如何。如果程序无法启动或在超时时仍在运行,它会拒绝,默认为 30 秒,因此将其包装在 `try` 和 `catch` 中。310* **`$.process.run`**:接受参数列表,不使用 shell。它解析为 `{ exitCode, stdout, stderr }`,无论退出码如何。如果程序无法启动或在超时时仍在运行,它会拒绝,默认为 30 秒,因此将其包装在 `try` 和 `catch` 中。

311* **`$.http.fetch`**:最多跟随五次重定向。当重定向到不同的源时,它只保留您设置的 `accept`、`accept-language`、`content-type` 和 `user-agent` 请求头,并丢弃其余请求头,因此依赖其他请求头(如 `Authorization`)的请求在该重定向之后可能会失败。[限制](/docs/zh-CN/plugins/mods/reference#limits)中列出了它的超时时间和体大小。

311 312 

312这些调用中的每一个本身都是一个事件,以其命名空间和方法命名,不带 `$.`,例如 `fs.read` 用于 `$.fs.read`。[链中较早的](/docs/zh-CN/plugins/mods/events#the-order-mods-run-in) mod 可以观察、重写或拒绝您的调用,这是组织限制 mod 到达的方式。313这些调用中的每一个本身都是一个事件,以其命名空间和方法命名,不带 `$.`,例如 `fs.read` 用于 `$.fs.read`。[链中较早的](/docs/zh-CN/plugins/mods/events#the-order-mods-run-in) mod 可以观察、重写或拒绝您的调用,这是组织限制 mod 到达的方式。

313 314 

Details

148| `agent.offer` | 向 Claude 提供某个子代理类型 | `{ isOffered: false }` 以不提供它 |148| `agent.offer` | 向 Claude 提供某个子代理类型 | `{ isOffered: false }` 以不提供它 |

149| `agent.spawn` | 子代理或 [agent team](/docs/zh-CN/agent-teams) 队友即将启动。对于队友,`e.isTeammate` 为 `true`。 | `next({ ...e, model })` 以选择其模型,或 `{ deny: reason }` |149| `agent.spawn` | 子代理或 [agent team](/docs/zh-CN/agent-teams) 队友即将启动。对于队友,`e.isTeammate` 为 `true`。 | `next({ ...e, model })` 以选择其模型,或 `{ deny: reason }` |

150 150 

151当 Claude 使用 [`SendMessage`](/docs/zh-CN/sub-agents#resume-subagents) 工具恢复子代理时,您的 `agent.spawn` hook 不会再次运行。要拒绝恢复子代理的 `SendMessage` 调用,请在 [`tool.call`](/docs/zh-CN/plugins/mods/events#guard-or-change-a-tool-call) hook 中匹配该工具。

152 

151<h3 id="interface">153<h3 id="interface">

152 界面154 界面

153</h3>155</h3>


175| [`plugin.register`](/docs/zh-CN/plugins/mods/admin#enforce-a-policy-with-a-mod-of-your-own) | hook 模块即将加载。`e.uses` 列出它的事件、mods API 调用、环境变量和状态,与 `claude plugin validate` 打印的内容一致。每个调用都不带 `$.` 前缀,如 `fs.read`。 | `{ refuse: reason }` |177| [`plugin.register`](/docs/zh-CN/plugins/mods/admin#enforce-a-policy-with-a-mod-of-your-own) | hook 模块即将加载。`e.uses` 列出它的事件、mods API 调用、环境变量和状态,与 `claude plugin validate` 打印的内容一致。每个调用都不带 `$.` 前缀,如 `fs.read`。 | `{ refuse: reason }` |

176| `engine.create` | 正在为此 mod 构建 mods API | 更改后的 mods API,用于添加某个命名空间。`user` [层级](#the-hook-function)之外的 mod 还可以隐藏某个命名空间。 |178| `engine.create` | 正在为此 mod 构建 mods API | 更改后的 mods API,用于添加某个命名空间。`user` [层级](#the-hook-function)之外的 mod 还可以隐藏某个命名空间。 |

177 179 

180当另一个 mod 的 hook 调用您在 `engine.create` 中添加的命名空间上的方法时,在该事件上的所有 hook 返回之前,您的方法发出的 `$` 调用都在该 hook 的上下文中运行。例如,相对路径基于该 hook 的工作目录解析,而当轮次正在等待该 hook 时,`$.prompt.submit` 会被拒绝。在此之后您的方法发出的调用将在您的 mod 自身的上下文中运行。

181 

178<h3 id="telemetry">182<h3 id="telemetry">

179 遥测183 遥测

180</h3>184</h3>


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

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

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

324| `$.http.fetch` 请求正文 | 4 MiB,按字符计算。正文更大的调用会被拒绝。 |

325| `$.http.fetch` 响应正文 | 4 MiB。`text` 保存前 4 MiB,其余部分不会被读取。当 `Content-Length` 标头声明的大小超出此限制时,该调用会改为被拒绝,拒绝原因以 `is over the 4194304-byte limit` 结尾,但经过所有重定向后的最后一个请求使用 `HEAD` 方法时除外。`HEAD` 例外需要 Claude Code v2.1.296 或更高版本。 |

326| 单次 `$.http.fetch` 调用(包括重定向和正文) | 30 秒 |

327| 单次 `$.http.fetch` 调用跟随的重定向次数 | 5 |

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)。 |328| 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)。 |

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

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

Details

78| `disableAllHooks in managed settings` | 您的组织关闭了来自已安装插件的 hooks |78| `disableAllHooks in managed settings` | 您的组织关闭了来自已安装插件的 hooks |

79| `only managed plugins and built-in plugins run` | 设置了 `allowManagedHooksOnly`,或在托管设置以外的设置文件中设置了 `disableAllHooks` |79| `only managed plugins and built-in plugins run` | 设置了 `allowManagedHooksOnly`,或在托管设置以外的设置文件中设置了 `disableAllHooks` |

80| `installed plugins that are not managed load no hooks module in this mode (--bare)` | 您使用 `--bare` 启动了 Claude Code |80| `installed plugins that are not managed load no hooks module in this mode (--bare)` | 您使用 `--bare` 启动了 Claude Code |

81| `another plugin of that name loads first` | 两个插件共享一个名称。使用托管的或首先加载的。 |81| `another plugin of that name loads first` | 另一个已启用的插件与您的 mod 同名,并且[占用了该名称](/docs/zh-CN/plugins/loading#hooks-when-two-enabled-plugins-share-a-name),因此您的 hook 模块不会加载 |

82 82 

83<h3 id="messages-from-the-built-in-guard">83<h3 id="messages-from-the-built-in-guard">

84 来自内置保护的消息84 来自内置保护的消息


191 191 

192在 v2.1.292 之前,该调用会再运行一次,因此提示词会被提交两次、命令会被运行两次,或子代理会被启动两次。192在 v2.1.292 之前,该调用会再运行一次,因此提示词会被提交两次、命令会被运行两次,或子代理会被启动两次。

193 193 

194<h3 id="$-agent-register-refused-the-hooks-module-that-made-the-call-is-no-longer-loaded">

195 `$.agent.register refused: the hooks module that made the call is no longer loaded`

196</h3>

197 

198该行以您的 mod 名称开头,如 `first-mod: $.agent.register refused: the hooks module that made the call is no longer loaded (it was reloaded or removed)`,且该 Agent 未被注册。您的 mod 在该调用之前被重新加载或卸载。重新加载会加载 hook 模块的新副本,而此调用来自仍在旧副本中运行的代码,例如尚未返回的 hook。

199 

200如果该 hook 未捕获此拒绝,它会失败,Claude Code 会[跳过它](#hook-skipped)。要从保持加载的副本注册该 Agent,请在您的 [`session.start`](/docs/zh-CN/plugins/mods/reference#session) hook 中进行该调用,该 hook 会在重新加载后的每个新副本中再次运行。

201 

194<h3 id="mods-that-run-in-the-hooks-worker-are-off-for-this-session">202<h3 id="mods-that-run-in-the-hooks-worker-are-off-for-this-session">

195 `mods that run in the hooks worker are off for this session`203 `mods that run in the hooks worker are off for this session`

196</h3>204</h3>

Details

256 256 

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

258 258 

259<h3 id="claude-code-reserves-this-name">

260 `Cannot add marketplace "<name>": Claude Code reserves this name and cannot register a marketplace under it`

261</h3>

262 

263您添加了一个市场,但其 `marketplace.json` 中的 [`name`](/docs/zh-CN/plugins/marketplace-reference#top-level-fields) 是每个 JavaScript 对象都具有的成员名称之一,例如 `constructor`、`toString` 或 `valueOf`。Claude Code 保留这些名称,因此它拒绝添加,且不注册任何内容。[保留名称](/docs/zh-CN/plugins/marketplace-reference#reserved-names) 列出了这些名称。

264 

265在此示例中,市场名为 `constructor`:

266 

267```text theme={null}

268Cannot add marketplace "constructor": Claude Code reserves this name and cannot register a marketplace under it. The name is set by "name" in the marketplace's marketplace.json; ask its maintainer to change it.

269```

270 

271如果设置文件在 [`extraKnownMarketplaces`](/docs/zh-CN/settings-reference#extraknownmarketplaces) 下声明了该市场,Claude Code 在启动时尝试添加它也会以相同方式失败,该消息会显示在 `/plugin` 的 **Errors** 选项卡中。

272 

273为市场指定另一个名称,然后再次添加:

274 

275* **您拥有市场**:更改 `marketplace.json` 中的 `name`

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

277 

278在 v2.1.296 之前,添加此类市场会因内部错误而失败,而不是显示此消息。

279 

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

260 `SSH authentication failed` 或 `HTTPS authentication failed`281 `SSH authentication failed` 或 `HTTPS authentication failed`

261</h3>282</h3>


907 Hook 加载但永远不触发928 Hook 加载但永远不触发

908</h4>929</h4>

909 930 

910如果 hook 加载无错误但永远不触发,检查其定义然后观看它运行:931如果 hook 加载无错误但永远不触发,请先在会话中运行 `/plugin` 并打开该插件的详细信息。如果其中有一条以 `Its hooks.json hooks do not run` 开头的说明,则表示另一个同名的已启用插件改为注册了它的 hook,[两个已启用插件同名时的 hook](/docs/zh-CN/plugins/loading#hooks-when-two-enabled-plugins-share-a-name) 说明了是哪个副本以及如何切换。否则,请检查 hook 的定义,然后观察它运行:

911 932 

912<Steps>933<Steps>

913 <Step title="检查事件名称">934 <Step title="检查事件名称">

routines.md +4 −4

Details

85 提示输入包括一个模型选择器。Claude 在每次运行时使用选定的模型。85 提示输入包括一个模型选择器。Claude 在每次运行时使用选定的模型。

86 </Step>86 </Step>

87 87 

88 <Step title="选择存储库">88 <Step title="选择仓库">

89 添加一个或多个 GitHub 存储库供 Claude 在其中工作。每个存储库在运行开始时从默认分支克隆。Claude 为其更改创建 `claude/` 前缀的分支。89 添加一个或多个供 Claude 在其中工作的 GitHub 仓库。每个仓库都会在运行开始时被克隆。Claude 会为其更改创建带有 `claude/` 前缀的分支。

90 </Step>90 </Step>

91 91 

92 <Step title="选择环境">92 <Step title="选择环境">


359 仓库和分支权限359 仓库和分支权限

360</h3>360</h3>

361 361 

362Routine 需要 GitHub 访问权限才能克隆仓库。当您在 CLI 中使用 `/schedule` 创建 Routine 时,Claude 会检查您的账户是否拥有对您运行该命令所在仓库的 GitHub 访问权限;如果没有,则会添加一条设置说明,指明如何授予访问权限。请参阅 [GitHub 身份验证选项](/docs/zh-CN/claude-code-on-the-web#github-authentication-options),了解授予访问权限的两种方式。362Routine 需要 GitHub 访问权限才能克隆仓库。当您在 CLI 中使用 `/schedule` 创建 Routine 时,Claude 会检查您的账户是否拥有对您运行该命令所在仓库的 GitHub 访问权限;如果没有,则会添加一条设置说明,指明如何授予访问权限。请参阅 [GitHub 身份验证选项](/docs/zh-CN/claude-code-on-the-web#github-authentication-options),了解授予访问权限的两种方式。在 Team 和 Enterprise 计划中,必须由您 Claude 组织的 [Owner](/docs/zh-CN/server-managed-settings#access-control) 先启用每种方式,您才能使用;请参阅[连接 GitHub](/docs/zh-CN/web-quickstart#connect-github)。

363 363 

364如果在某次运行按计划应当执行时,您的 GitHub 连接缺失或已过期,Routine 会跳过运行,直到您重新连接为止,最长持续 72 小时。在此期间内重新连接 GitHub,Routine 会自行恢复。如果 72 小时后仍未连接,Routine 将被关闭,您需要在重新连接 GitHub 后再将其重新打开。364如果在某次运行按计划应当执行时,您的 GitHub 连接缺失或已过期,Routine 会跳过运行,直到您重新连接为止,最长持续 72 小时。在此期间内重新连接 GitHub,Routine 会自行恢复。如果 72 小时后仍未连接,Routine 将被关闭,您需要在重新连接 GitHub 后再将其重新打开。

365 365 

366您添加的每个仓库都会在每次运行时被克隆。除非您的提示词另有指定,否则 Claude 会从仓库的默认分支开始。366您添加的每个仓库都会在每次运行时被克隆。除非您的提示词另有指定,否则 Claude 会从仓库的默认分支开始。如果运行由 [GitHub Pull Request 事件](#add-a-github-trigger)触发,且该 Pull Request 所在的仓库是 Routine 中的第一个仓库,则该仓库会改为从 Pull Request 的 head 提交开始。

367 367 

368除非您的提示词指示 Claude 推送到其他分支,否则 Claude 会将其工作推送到以 `claude/` 为前缀的分支。要控制运行可以推送到哪些分支,请在 GitHub 上使用分支保护规则或规则集。对于在 Anthropic 托管基础设施上的运行,以及通过 [Anthropic 的 git 代理](/docs/zh-CN/self-hosted-environments-deploy#use-the-anthropic-git-proxy)推送的自托管运行,GitHub 会将这些规则应用于您所连接的 GitHub 访问权限,因此该访问权限可以绕过的规则不会阻止运行的推送。使用您的部署所提供的 git 凭据进行推送的自托管运行,则会依据这些凭据进行检查。请参阅[配置 git](/docs/zh-CN/self-hosted-environments-deploy#configure-git)。368除非您的提示词指示 Claude 推送到其他分支,否则 Claude 会将其工作推送到以 `claude/` 为前缀的分支。要控制运行可以推送到哪些分支,请在 GitHub 上使用分支保护规则或规则集。对于在 Anthropic 托管基础设施上的运行,以及通过 [Anthropic 的 git 代理](/docs/zh-CN/self-hosted-environments-deploy#use-the-anthropic-git-proxy)推送的自托管运行,GitHub 会将这些规则应用于您所连接的 GitHub 访问权限,因此该访问权限可以绕过的规则不会阻止运行的推送。使用您的部署所提供的 git 凭据进行推送的自托管运行,则会依据这些凭据进行检查。请参阅[配置 git](/docs/zh-CN/self-hosted-environments-deploy#configure-git)。

369 369 

sandboxing.md +1 −0

Details

203* 针对[关键路径](/docs/zh-CN/permission-modes#critical-paths)的 `rm` 或 `rmdir` 命令仍会经过常规权限流程203* 针对[关键路径](/docs/zh-CN/permission-modes#critical-paths)的 `rm` 或 `rmdir` 命令仍会经过常规权限流程

204* 限定内容范围的[询问规则](/docs/zh-CN/permissions)(如 `Bash(git push *)`)即使对沙箱命令也仍会强制提示204* 限定内容范围的[询问规则](/docs/zh-CN/permissions)(如 `Bash(git push *)`)即使对沙箱命令也仍会强制提示

205* 单独的 `Bash` 询问规则或等效的 `Bash(*)` 形式,对于在沙箱中运行的命令会被跳过;对于回退到常规权限流程的命令仍然适用。在[计划模式](/docs/zh-CN/permission-modes#analyze-before-you-edit-with-plan-mode)下,该规则不会被跳过:它同样会对沙箱命令进行提示,包括只读命令205* 单独的 `Bash` 询问规则或等效的 `Bash(*)` 形式,对于在沙箱中运行的命令会被跳过;对于回退到常规权限流程的命令仍然适用。在[计划模式](/docs/zh-CN/permission-modes#analyze-before-you-edit-with-plan-mode)下,该规则不会被跳过:它同样会对沙箱命令进行提示,包括只读命令

206* [Monitor 工具](/docs/zh-CN/tools-reference#monitor-tool)的命令不会被自动批准,但仍会在沙箱中运行。要跳过提示,请添加与该命令匹配的[允许规则](/docs/zh-CN/permissions#bash),例如 `Bash(npm run *)`

206 207 

207<Info>208<Info>

208 自动允许模式独立于您的权限模式设置运行,但有三个例外:[计划模式](/docs/zh-CN/permission-modes#analyze-before-you-edit-with-plan-mode)、带有[每命令允许域名](#per-command-allowed-domains-in-auto-mode)的自动模式命令,以及自动模式下对沙箱命令的[服务器端分类器审查](/docs/zh-CN/permission-modes#how-the-classifier-evaluates-actions)。即使您未处于"接受编辑"模式,启用自动允许后,沙箱 Bash 命令也会自动运行。这意味着,即使在 Manual 模式下(此时文件编辑工具会提示),在沙箱边界内修改文件的 Bash 命令也会在不提示的情况下执行。209 自动允许模式独立于您的权限模式设置运行,但有三个例外:[计划模式](/docs/zh-CN/permission-modes#analyze-before-you-edit-with-plan-mode)、带有[每命令允许域名](#per-command-allowed-domains-in-auto-mode)的自动模式命令,以及自动模式下对沙箱命令的[服务器端分类器审查](/docs/zh-CN/permission-modes#how-the-classifier-evaluates-actions)。即使您未处于"接受编辑"模式,启用自动允许后,沙箱 Bash 命令也会自动运行。这意味着,即使在 Manual 模式下(此时文件编辑工具会提示),在沙箱边界内修改文件的 Bash 命令也会在不提示的情况下执行。

Details

132运行器及其会话进行多种出站连接,不需要来自 Anthropic 的入站连接:132运行器及其会话进行多种出站连接,不需要来自 Anthropic 的入站连接:

133 133 

134* **控制平面**:运行器轮询 `api.anthropic.com` 以获取工作并发布设置进度和失败事件,全部出站 HTTPS。轮询充当运行器的心跳。134* **控制平面**:运行器轮询 `api.anthropic.com` 以获取工作并发布设置进度和失败事件,全部出站 HTTPS。轮询充当运行器的心跳。

135* **SCM 连接器**:可选的编排器 [SCM 连接器](/docs/zh-CN/self-hosted-environments-reference#scm-connector-flags)隧道是唯一的 WebSocket 连接。135* **Git**:运行器通过 HTTPS 或 SSH 从您的 git 主机克隆和推送,使用您的部署提供的凭据进行身份验证。请参阅[配置 git](/docs/zh-CN/self-hosted-environments-deploy#configure-git)了解各选项,包括每个会话铸造的凭据。使用 [Anthropic git 代理](/docs/zh-CN/self-hosted-environments-deploy#use-the-anthropic-git-proxy)时,github.com 上仓库的 git 流量改为经由 `api.anthropic.com` 传输。

136* **Git**:运行器通过 HTTPS 或 SSH 从您的 git 主机克隆和推送,使用您的部署提供的凭证进行身份验证;[配置 git](/docs/zh-CN/self-hosted-environments-deploy#configure-git)涵盖了选项,包括每个会话铸造的凭证和 [Anthropic git 代理](/docs/zh-CN/self-hosted-environments-deploy#use-the-anthropic-git-proxy),它通过 `api.anthropic.com` 路由 git。136* **会话子进程**:子 Claude Code 进程将会话的事件流保持到 `api.anthropic.com`,并为模型推理和会话期间运行的 git 命令进行自己的出站调用。在使用 [Anthropic 托管 git](/docs/zh-CN/self-hosted-environments-deploy#use-the-anthropic-git-proxy) 的会话中,子进程通过其打开到 `api.anthropic.com` 的 WebSocket 连接发送 github.com 的 `git` 和 `gh` 流量。

137* **会话子进程**:子 Claude Code 进程将会话的事件流保持到 `api.anthropic.com`,并为模型推理和会话期间运行的 git 命令进行自己的出站调用。请参阅[网络要求](/docs/zh-CN/self-hosted-environments-deploy#network-requirements)了解完整的出站列表。[上面的图](#how-self-hosted-environments-work)显示了这些路径,除了可选的 SCM 连接器。137* **SCM 连接器**:可选的编排器 [SCM 连接器](/docs/zh-CN/self-hosted-environments-reference#scm-connector-flags)不可用,因此其隧道不会打开。该隧道是到 `api.anthropic.com` 的 WebSocket 连接。

138 

139请参阅[网络要求](/docs/zh-CN/self-hosted-environments-deploy#network-requirements)了解完整的出站列表。[上面的图](#how-self-hosted-environments-work)显示了这些路径,但可选的 SCM 连接器和 Anthropic 托管的 git 连接除外。

138 140 

139默认情况下,模型推理使用 Anthropic API。控制平面将 API 端点传递给每个会话,会话使用 Anthropic 颁发的会话范围的 OAuth 令牌进行身份验证。如需改为将模型请求发送到您自己的云帐户,请参阅[将模型请求发送到 Bedrock 或 Agent Platform](/docs/zh-CN/self-hosted-environments-configuration#send-model-requests-to-bedrock-or-agent-platform)。141默认情况下,模型推理使用 Anthropic API。控制平面将 API 端点传递给每个会话,会话使用 Anthropic 颁发的会话范围的 OAuth 令牌进行身份验证。如需改为将模型请求发送到您自己的云帐户,请参阅[将模型请求发送到 Bedrock 或 Agent Platform](/docs/zh-CN/self-hosted-environments-configuration#send-model-requests-to-bedrock-or-agent-platform)。

140 142 

Details

31| 变量 | 描述 |31| 变量 | 描述 |

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

33| `CLAUDE_CODE_SESSION_ACCESS_TOKEN` | 会话 JWT,前缀为 `sk-ant-cc-`。其 `act` 声明标识会话创建者,并在创建会话的使用入口记录了创建者电子邮件时包含该电子邮件。该值是生成时的令牌;刷新通过子进程的 stdin 到达,因此包装脚本只看到初始值。请参阅 [Verify session identity](/docs/zh-CN/self-hosted-environments-identity)。 |33| `CLAUDE_CODE_SESSION_ACCESS_TOKEN` | 会话 JWT,前缀为 `sk-ant-cc-`。其 `act` 声明标识会话创建者,并在创建会话的使用入口记录了创建者电子邮件时包含该电子邮件。该值是生成时的令牌;刷新通过子进程的 stdin 到达,因此包装脚本只看到初始值。请参阅 [Verify session identity](/docs/zh-CN/self-hosted-environments-identity)。 |

34| `CCR_SESSION_ACCOUNT_EMAIL` | 会话创建者的电子邮件,由运行器从令牌的 `act.email` 声明中预先提取,无需签名验证。适合用于标记,例如提交 trailer。当电子邮件控制凭据发放时,验证令牌并从中读取声明;请参阅 [Provision credentials scoped to the session creator](#provision-credentials-scoped-to-the-session-creator)。当令牌不包含创建者电子邮件时未设置。视为个人可识别信息。 |34| `CCR_SESSION_ACCOUNT_EMAIL` | 会话创建者的电子邮件,由运行器从令牌的 `act.email` 声明中预先提取,无需签名验证。适合用于标记,例如提交 trailer。当电子邮件控制凭据发放时,请改为验证令牌并从中读取声明。请参阅 [Provision credentials scoped to the session creator](#provision-credentials-scoped-to-the-session-creator)。当令牌不包含创建者电子邮件时未设置,例如在由您组织的服务身份创建的会话中。视为个人可识别信息。 |

35| `CLAUDE_RUNNER_CLIENT_PLATFORM` | 创建会话的客户端使用入口,例如 `web_claude_ai`、`desktop_app`、`ios`、`claude_code_cli` 或 `scheduled_trigger`。Anthropic 在会话创建时记录该值一次,因此包装脚本和每个生命周期 hook 都看到相同的值。仅将其用于采用分析和标记,不用作授权信号。当会话没有记录或识别的使用入口时未设置,因此在 `set -u` 下将其引用为 `${CLAUDE_RUNNER_CLIENT_PLATFORM:-}`。需要 Claude Code v2.1.229 或更高版本。 |35| `CLAUDE_RUNNER_CLIENT_PLATFORM` | 创建会话的客户端使用入口,例如 `web_claude_ai`、`desktop_app`、`ios`、`claude_code_cli` 或 `scheduled_trigger`。Anthropic 在会话创建时记录该值一次,因此包装脚本和每个生命周期 hook 都看到相同的值。仅将其用于采用分析和标记,不用作授权信号。当会话没有记录或识别的使用入口时未设置。需要 Claude Code v2.1.229 或更高版本。 |

36| `CLAUDE_RUNNER_CLAUDE_BIN` | 运行器自己的 Claude Code 二进制文件的绝对路径。使用 `exec "$CLAUDE_RUNNER_CLAUDE_BIN" "$@"` 结束您的包装脚本,以移交到固定的二进制文件,而无需硬编码安装路径。 |36| `CLAUDE_RUNNER_CLAUDE_BIN` | 运行器自己的 Claude Code 二进制文件的绝对路径。使用 `exec "$CLAUDE_RUNNER_CLAUDE_BIN" "$@"` 结束您的包装脚本,以移交到固定的二进制文件,而无需硬编码安装路径。 |

37| `CLAUDE_CODE_REMOTE_SESSION_ID` | 会话 ID,采用标记的 `cse_...` 形式。这与[生命周期 hook](#lifecycle-hooks)以 `session_...` 形式在 `CLAUDE_RUNNER_SESSION_ID` 中看到的是同一个会话;UUID 变量在两者之间匹配,将 `cse_` 前缀替换为 `session_` 会产生会话 URL 中显示的 ID。 |37| `CLAUDE_CODE_REMOTE_SESSION_ID` | 会话 ID,采用标记的 `cse_...` 形式。这与[生命周期 hook](#lifecycle-hooks)以 `session_...` 形式在 `CLAUDE_RUNNER_SESSION_ID` 中看到的是同一个会话;UUID 变量在两者之间匹配,将 `cse_` 前缀替换为 `session_` 会产生会话 URL 中显示的 ID。 |

38| `CLAUDE_CODE_REMOTE_SESSION_UUID` | 相同的会话 ID,采用规范 UUID 形式,供以 UUID 作为键的系统使用。 |38| `CLAUDE_CODE_REMOTE_SESSION_UUID` | 相同的会话 ID,采用规范 UUID 形式,供以 UUID 作为键的系统使用。 |

39| `CLAUDE_CODE_REMOTE_SLACK_THREAD_URL` | 对于属于某个 Slack 线程的 [Claude Tag](https://claude.com/docs/claude-tag/overview) 会话,为该线程的链接。其他会话未设置此变量,线程会话也可能未设置。 |

40| `CLAUDE_CODE_REMOTE_SLACK_THREAD_TS` | 对于属于某个 Slack 线程的 Claude Tag 会话,为该线程的 Slack 时间戳,例如 `1700000000.000100`。可能未设置,也可能在 `CLAUDE_CODE_REMOTE_SLACK_THREAD_URL` 未设置时被设置,因此请分别检查每个变量。 |

39| `CLAUDE_SESSION_INGRESS_TOKEN_FILE` | 绝对路径,指向保存当前会话 JWT 的按会话文件,在令牌刷新时保持最新。Shell 子进程在下载用户添加到会话的附件时从中读取其 `Authorization` 标头。`exec` 自动保留该变量;重建子进程环境的包装脚本必须携带该变量,否则附件下载会无声地停止工作。 |41| `CLAUDE_SESSION_INGRESS_TOKEN_FILE` | 绝对路径,指向保存当前会话 JWT 的按会话文件,在令牌刷新时保持最新。Shell 子进程在下载用户添加到会话的附件时从中读取其 `Authorization` 标头。`exec` 自动保留该变量;重建子进程环境的包装脚本必须携带该变量,否则附件下载会无声地停止工作。 |

40| `CLAUDE_CONFIG_DIR` | 按会话 Claude 配置目录,在会话启动时从运行器在启动时捕获的运行器主机配置快照中写入;请参阅 [Permissions and tool approval](#permissions-and-tool-approval)。此处的写入仅限于此会话。除非您使用 [`--remove-session-state`](/docs/zh-CN/self-hosted-environments-reference#runner-cli-flags) 启动运行器,否则会话结束后该目录仍会保留在 `<base-dir>/_sessions/` 下;请参阅 [Reuse a pre-warmed checkout](/docs/zh-CN/self-hosted-environments-deploy#reuse-a-pre-warmed-checkout)。 |42| `CLAUDE_CONFIG_DIR` | 按会话 Claude 配置目录,在会话启动时从运行器在启动时捕获的运行器主机配置快照中写入;请参阅 [Permissions and tool approval](#permissions-and-tool-approval)。此处的写入仅限于此会话。除非您使用 [`--remove-session-state`](/docs/zh-CN/self-hosted-environments-reference#runner-cli-flags) 启动运行器,否则会话结束后该目录仍会保留在 `<base-dir>/_sessions/` 下;请参阅 [Reuse a pre-warmed checkout](/docs/zh-CN/self-hosted-environments-deploy#reuse-a-pre-warmed-checkout)。 |

41| `ANTHROPIC_BASE_URL` | 子进程将使用的 API 基础 URL,由控制平面按会话交付,通常为 `https://api.anthropic.com`。不要覆盖它:会话的推理凭据是 Anthropic 颁发的 OAuth 令牌,其他提供者不接受。 |43| `ANTHROPIC_BASE_URL` | 子进程将使用的 API 基础 URL,由控制平面按会话交付,通常为 `https://api.anthropic.com`。不要覆盖它:会话的推理凭据是 Anthropic 颁发的 OAuth 令牌,其他提供者不接受。 |


43 45 

44包装脚本还继承子进程的其余托管环境,包括任何服务器提供的环境变量。`exec` 自动传播所有内容;如果您的包装脚本以其他方式生成子进程,请转发完整环境。46包装脚本还继承子进程的其余托管环境,包括任何服务器提供的环境变量。`exec` 自动传播所有内容;如果您的包装脚本以其他方式生成子进程,请转发完整环境。

45 47 

48`CLAUDE_CODE_REMOTE_SLACK_THREAD_URL` 和 `CLAUDE_CODE_REMOTE_SLACK_THREAD_TS` 会传递到您的包装脚本或 [`command` hook](#command)。它们也会传递到会话运行的内容,例如 shell 命令、git 钩子和 Claude Code hook。`checkout`、`post-session` 和 `spawn-runner` hook 不会接收它们。

49 

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

51 为可能未设置的变量提供默认值

52</h3>

53 

54`CCR_SESSION_ACCOUNT_EMAIL`、`CLAUDE_RUNNER_CLIENT_PLATFORM`、`CLAUDE_CODE_REMOTE_SLACK_THREAD_URL` 和 `CLAUDE_CODE_REMOTE_SLACK_THREAD_TS` 都可能未设置。如果您的脚本使用 `set -u`,Bash 在展开其中未设置的变量时会以 `unbound variable` 停止,因此请使用默认值展开它们,例如 `${CCR_SESSION_ACCOUNT_EMAIL:-}`。

55 

56在 shell 展开 Slack 线程链接的任何位置,请采取以下预防措施:

57 

58* **为其加引号**:该链接可能包含 shell 会处理的字符,例如 `?` 和 `&`,因此请为变量加引号,如 `"${CLAUDE_CODE_REMOTE_SLACK_THREAD_URL:-}"`。

59* **不要将其值放入 `eval` 和 `sh -c` 字符串**:不要将其值替换到 `eval` 或 `sh -c` 运行的字符串中,即使在引号内也不行。应让该字符串引用该变量。

60 

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

47 保持 stdin 和文件描述符 3 的连接62 保持 stdin 和文件描述符 3 的连接

48</h3>63</h3>

49 64 

50子进程的 stdin 是运行器的控制通道。令牌轮换和会话结束信号在其上到达。运行器还在文件描述符 3 上打开一个管道,并从中读取子进程的活动信号以驱动空闲和启动超时。普通的 `exec "$CLAUDE_RUNNER_CLAUDE_BIN" "$@"` 自动保留两者。65子进程的 stdin 是运行器的控制通道。令牌轮换和会话结束信号在其上到达。运行器还在文件描述符 3 上打开一个管道,并从中读取子进程的活动信号以驱动空闲和启动超时。普通的 `exec "$CLAUDE_RUNNER_CLAUDE_BIN" "$@"` 自动保留两者。

51 66 

52如果您的包装脚本使用裸 `&` 在后台运行子进程,它会切断子进程的 stdin:会话看起来健康,直到初始 OAuth 令牌的大约 30 分钟生命周期过期,然后每个 API 调用都失败,出现 `401 authentication_error`。如果您的包装脚本必须在后台运行子进程,例如保持拆卸陷阱活跃,请在文件描述符 4 或更高编号上保存 stdin 并显式重新连接它:67如果您的包装脚本使用裸 `&` 在后台运行子进程,它会切断子进程的 stdin。会话看起来健康,直到初始 OAuth 令牌的大约 30 分钟生命周期过期,然后每个使用该令牌的 API 调用都失败,出现 `401 authentication_error`。如果您的包装脚本必须在后台运行子进程,例如保持拆卸陷阱活跃,请在文件描述符 4 或更高编号上保存 stdin 并显式重新连接它:

53 68 

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

55exec 4<&070exec 4<&0


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

60```75```

61 76 

62不要在包装脚本中关闭或重用文件描述符 3。重定向子进程的 stdout 和 stderr 是可以的。77您可以重定向子进程的 stdout。请保持文件描述符 3 和 stderr 连接到运行器:

78 

79* **文件描述符 3**:将子进程的活动信号传送给运行器。不要在包装脚本中关闭或重用它。

80* **stderr**:当包装脚本或子进程以非零状态退出时,运行器会将 stderr 的最后几行发布到会话中,并在其自身日志中打印这些行。会话的用户会看到这些行,因此不要将密钥打印到 stderr,并在部署包装脚本之前移除 `set -x`。如果您重定向 stderr,会话仍会运行,但运行器仅以退出码报告失败。

63 81 

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

65 透传系统提示词标志83 透传系统提示词标志


108 checkout126 checkout

109</h3>127</h3>

110 128 

111每个仓库运行一次,代替运行器的内置克隆和获取。使用此 hook 从读通镜像克隆、从存档为工作树设置种子或应用按会话的 git 身份验证。运行器设置以下变量,并且可能设置表中未列出的其他 `CLAUDE_RUNNER_` 变量:129每个仓库运行一次,代替运行器的内置克隆和获取。使用此 hook 从您通过 HTTPS 或 SSH 访问的读通镜像克隆、从存档为工作树设置种子,或应用按会话的 git 身份验证。运行器设置以下变量,并且可能设置表中未列出的其他 `CLAUDE_RUNNER_` 变量:

112 130 

113| 变量 | 描述 |131| 变量 | 描述 |

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

115| `CLAUDE_RUNNER_REPO_URL` | 要克隆的存储库 URL,在应用任何 `--git-host-rewrite` 和 `--git-ssh-rewrite` 之后 |133| `CLAUDE_RUNNER_REPO_URL` | 要克隆的存储库 URL,在应用任何 `--git-host-rewrite` 和 `--git-ssh-rewrite` 之后 |

116| `CLAUDE_RUNNER_REPO_REF` | 要检出的修订版本:分支、标签或提交 SHA,如会话请求的那样。空表示存储库的默认分支。 |134| `CLAUDE_RUNNER_REPO_REF` | 要检出的修订版本,即会话所请求的形式:分支、标签、提交 SHA,或完整引用名称(例如 `refs/pull/<number>/head`)。为空表示仓库的默认分支。 |

117| `CLAUDE_RUNNER_CHECKOUT_PATH` | 必须留下工作树的绝对路径 |135| `CLAUDE_RUNNER_CHECKOUT_PATH` | 必须留下工作树的绝对路径 |

118| `CLAUDE_RUNNER_SESSION_ID` | 会话 ID,采用标记的 `session_...` 形式,用于日志记录和关联 |136| `CLAUDE_RUNNER_SESSION_ID` | 会话 ID,采用标记的 `session_...` 形式,用于日志记录和关联 |

119| `CLAUDE_RUNNER_SESSION_UUID` | 相同的会话 ID,采用规范 UUID 形式 |137| `CLAUDE_RUNNER_SESSION_UUID` | 相同的会话 ID,采用规范 UUID 形式 |

120| `CLAUDE_RUNNER_API_BASE_URL` | Anthropic API 基础 URL,用于会话范围的调用 |138| `CLAUDE_RUNNER_API_BASE_URL` | Anthropic API 基础 URL,用于会话范围的调用 |

121| `CLAUDE_RUNNER_CLIENT_PLATFORM` | 创建会话的客户端表面,例如 `web_claude_ai`、`desktop_app` 或 `ios`。当会话没有记录或识别的表面时未设置。 |139| `CLAUDE_RUNNER_CLIENT_PLATFORM` | 创建会话的客户端使用入口,例如 `web_claude_ai`、`desktop_app` 或 `ios`。当会话没有记录或可识别的使用入口时未设置,因此在 `set -u` 下请以 `${CLAUDE_RUNNER_CLIENT_PLATFORM:-}` 的形式引用它。需要 Claude Code v2.1.229 或更高版本。 |

122| `CLAUDE_CODE_SESSION_ACCESS_TOKEN` | 会话访问令牌,用于会话范围的 API 调用 |140| `CLAUDE_CODE_SESSION_ACCESS_TOKEN` | 会话访问令牌,用于会话范围的 API 调用 |

123| `GIT_CONFIG_COUNT`、`GIT_CONFIG_KEY_n`、`GIT_CONFIG_VALUE_n` | 运行器为您的 hook 所运行的 git 固定的 Git 设置。[生命周期 hook 中的 Git 配置](#git-configuration-inside-lifecycle-hooks)对其进行了说明。需要 Claude Code v2.1.280 或更高版本。 |141| `GIT_CONFIG_COUNT`、`GIT_CONFIG_KEY_n`、`GIT_CONFIG_VALUE_n` | 运行器为您的 hook 所运行的 git 固定的 Git 设置。[生命周期 hook 中的 Git 配置](#git-configuration-inside-lifecycle-hooks)对其进行了说明。需要 Claude Code v2.1.280 或更高版本。 |

124 142 

125脚本必须在 `CLAUDE_RUNNER_CHECKOUT_PATH` 处留下一个工作树,检出到请求的修订版本。分离的 HEAD 是可以的;运行器在其上创建会话的工作分支。运行器之后验证路径包含 `.git`;如果您的钩子具体化非 git 源(例如 Perforce 或解包的 tarball),请在运行器的环境中设置 `CLAUDE_RUNNER_SKIP_GIT_VERIFY=1` 以跳过该检查。基于 Git 的流程(例如工作分支创建和推送结果)需要 git 检出,因此使用 [`post-session` 钩子](#post-session) 从非 git 树导出结果。143脚本必须在 `CLAUDE_RUNNER_CHECKOUT_PATH` 处留下一个检出到所请求修订版本的工作树。分离的 HEAD 也可以,因为运行器会在其上创建会话的工作分支。

126 144 

127运行器不会将 git 凭证传递给钩子。相反,从会话的身份生成按会话克隆凭证:使用标准 JWT 库针对 `CLAUDE_RUNNER_API_BASE_URL` 下的 JWKS 端点验证 `CLAUDE_CODE_SESSION_ACCESS_TOKEN`,如 [Verify the token from your service](/docs/zh-CN/self-hosted-environments-identity#verify-the-token-from-your-service) 中所述,然后让您的凭证服务为令牌的 `act` 声明中的身份发放短期克隆凭证。`CLAUDE_RUNNER_CLAUDE_BIN` 未在 checkout-hook 环境中设置,因此 `decode-token` 子命令在此处不可用。回退到主机已有的任何 git 身份验证(例如 SSH 代理、凭证助手或 `.netrc`)也是一个选项。145在您的 hook 返回后,运行器会验证 `CLAUDE_RUNNER_CHECKOUT_PATH` 包含 `.git`。如果您的 hook 具体化的是非 git 源(例如 Perforce 或解包的 tarball),请在运行器的环境中设置 `CLAUDE_RUNNER_SKIP_GIT_VERIFY=1` 以跳过该检查。基于 Git 的流程(例如工作分支创建和推送结果)需要 git 检出,因此请使用 [`post-session` hook](#post-session) 从非 git 树导出结果。

128 146 

129当钩子以非零状态退出,或以 0 退出但没有留下可用的检出时,运行器的行为取决于存储库:147<h4 id="get-git-credentials-in-the-hook">

148 在 hook 中获取 git 凭据

149</h4>

130 150 

131* **会话推送结果的存储库**:运行器失败会话,在非零退出时将脚本的 stderr 尾部呈现给用户。151运行器不会将 git 凭据传递给 hook。`decode-token` 子命令在此处同样不可用,因为 `CLAUDE_RUNNER_CLAUDE_BIN` 未在 checkout-hook 环境中设置。请改为从会话的身份生成按会话的克隆凭据,或回退到主机自身的 git 身份验证:

132* **会话仅从中读取的存储库**,例如添加到运行会话的存储库:运行器记录带有失败详情的 `[runner:warn]` 行,向会话发布 `Skipped` 步骤,删除钩子在检出路径处留下的任何内容,并继续处理其余存储库。当运行器无法立即删除路径时,它会在会话结束时重试删除。如果跳过使会话完全没有存储库,运行器仍然会失败会话。

133 152 

134在 v2.1.228 之前,运行器对任何存储库的钩子失败都会失败会话,因此钩子无法提供的只读存储库在会话恢复到的每个新运行器上再次失败会话。153* **按会话的克隆凭据**:使用标准 JWT 库,针对 `CLAUDE_RUNNER_API_BASE_URL` 下的 JWKS 端点验证 `CLAUDE_CODE_SESSION_ACCESS_TOKEN`,如[从您的服务验证令牌](/docs/zh-CN/self-hosted-environments-identity#verify-the-token-from-your-service)中所述。然后让您的凭据服务为令牌 `act` 声明中的身份发放短期克隆凭据。请以 `act.sub` 作为该凭据的键,不要依赖 `act.email`。

154* **主机 git 身份验证**:使用主机已有的任何 git 身份验证,例如 SSH agent、凭据助手或 `.netrc`。

135 155 

136运行器在会话结束后删除检出路径。156<h4 id="when-the-hook-fails">

157 hook 失败时

158</h4>

159 

160当 hook 以非零状态退出,或以 0 退出但没有留下可用的检出时,hook 即为失败:

161 

162* **会话推送结果的存储库**:运行器失败会话,在非零退出时将脚本的 stderr 尾部呈现给用户。

163* **会话仅从中读取的仓库**,例如添加到正在运行的会话中的仓库:运行器记录一行带有失败详情的 `[runner:warn]`,向会话发布一个 `Skipped` 步骤,删除 hook 在检出路径处留下的任何内容,并继续处理其余仓库。如果跳过后会话完全没有仓库,运行器仍然会使会话失败。

164 

165当 hook 成功时,运行器会在会话结束后删除检出路径。

137 166 

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

139 post-session168 post-session


151| `CLAUDE_RUNNER_WORKSPACE_PATHS` | 会话工作树的冒号分隔绝对路径。对于零存储库会话为空。 |180| `CLAUDE_RUNNER_WORKSPACE_PATHS` | 会话工作树的冒号分隔绝对路径。对于零存储库会话为空。 |

152| `CLAUDE_RUNNER_DEBUG_LOG_PATH` | 会话的调试日志的路径,在钩子运行时仍在磁盘上 |181| `CLAUDE_RUNNER_DEBUG_LOG_PATH` | 会话的调试日志的路径,在钩子运行时仍在磁盘上 |

153| `CLAUDE_RUNNER_API_BASE_URL` | Anthropic API 基础 URL,用于会话范围的调用 |182| `CLAUDE_RUNNER_API_BASE_URL` | Anthropic API 基础 URL,用于会话范围的调用 |

154| `CLAUDE_RUNNER_CLIENT_PLATFORM` | 创建会话的客户端表面,例如 `web_claude_ai`、`desktop_app` 或 `ios`。当会话没有记录或识别的表面时未设置。需要 Claude Code v2.1.229 或更高版本。 |183| `CLAUDE_RUNNER_CLIENT_PLATFORM` | 创建会话的客户端使用入口,例如 `web_claude_ai`、`desktop_app` 或 `ios`。当会话没有记录或可识别的使用入口时未设置,因此在 `set -u` 下请以 `${CLAUDE_RUNNER_CLIENT_PLATFORM:-}` 的形式引用它。需要 Claude Code v2.1.229 或更高版本。 |

155| `CLAUDE_CODE_SESSION_ACCESS_TOKEN` | 会话访问令牌,用于会话范围的 API 调用 |184| `CLAUDE_CODE_SESSION_ACCESS_TOKEN` | 会话访问令牌,用于会话范围的 API 调用 |

156| `GIT_CONFIG_COUNT`、`GIT_CONFIG_KEY_n`、`GIT_CONFIG_VALUE_n` | 运行器为您的 hook 所运行的 git 固定的 Git 设置。[生命周期 hook 中的 Git 配置](#git-configuration-inside-lifecycle-hooks)对其进行了说明。需要 Claude Code v2.1.280 或更高版本。 |185| `GIT_CONFIG_COUNT`、`GIT_CONFIG_KEY_n`、`GIT_CONFIG_VALUE_n` | 运行器为您的 hook 所运行的 git 固定的 Git 设置。[生命周期 hook 中的 Git 配置](#git-configuration-inside-lifecycle-hooks)对其进行了说明。需要 Claude Code v2.1.280 或更高版本。 |

157 186 

158`CLAUDE_RUNNER_EXIT_REASON` 采用四个值之一:187`CLAUDE_RUNNER_EXIT_REASON` 采用四个值之一:

159 188 

160* `completed`:会话干净地结束。Claude Code 进程正常退出,或会话在仍在运行时被存档或删除。189* `completed`:会话正常结束。Claude Code 进程正常退出,或在会话被存档或删除后自行退出。

161* `failed`:Claude Code 进程崩溃,或在启动后设置失败。190* `failed`:Claude Code 进程崩溃,或在启动后设置失败。

162* `interrupted`:运行器停止了会话。它释放了会话以释放插槽、会话在启动时超时、服务器将会话移出此运行器、运行器正在排空,或会话超过了其 [`--kill-session-after-min`](/docs/zh-CN/self-hosted-environments-reference#runner-cli-flags) 限制。191* `interrupted`:运行器停止了会话,属于以下情况之一:

192 * 运行器释放了会话以腾出插槽。

193 * 会话在启动时超时。

194 * 服务器将会话移出了此运行器。

195 * 运行器的轮询在进程退出之前发现了存档或删除操作。

196 * 运行器正在排空。

197 * 会话超过了其 [`--kill-session-after-min`](/docs/zh-CN/self-hosted-environments-reference#runner-cli-flags) 限制。

163* `abandoned`:为另一个运行器声称的会话保留。钩子目前在这种情况下不触发。198* `abandoned`:为另一个运行器声称的会话保留。钩子目前在这种情况下不触发。

164 199 

165[session lifecycle counters](/docs/zh-CN/self-hosted-environments-reference#session-lifecycle-counter-semantics) 将释放、启动超时和服务器移动计为 `completed` 而不是 `interrupted`,因为运行器干净地交还了插槽。如果您将钩子收据与计数器进行比较,请预期这种差异。200如果您将 hook 收据与[会话生命周期计数器](/docs/zh-CN/self-hosted-environments-reference#session-lifecycle-counter-semantics)进行比较,请预期某些 `interrupted` 收据在计数器中会计为 `completed`。计数器会将释放、启动超时、服务器移动,以及运行器轮询先发现的存档或删除计为 `completed`,因为运行器干净地交还了插槽。

166 201 

167钩子的退出状态永远不会影响会话结果;失败被记录并忽略。运行器在每个会话结束(包括运行器关闭)时等待最多 `--post-session-hook-timeout-sec`(默认 60 秒)。此示例将未提交的工作保存到救援分支:202钩子的退出状态永远不会影响会话结果;失败被记录并忽略。运行器在每个会话结束(包括运行器关闭)时等待最多 `--post-session-hook-timeout-sec`(默认 60 秒)。此示例将未提交的工作保存到救援分支:

168 203 

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

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

171set -u206set -u

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

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

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

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

175# privileges. -c commit.gpgsign=false also leaves these rescue commits211# privileges. -c commit.gpgsign=false also leaves these rescue commits

176# unsigned under --configure-git.212# unsigned under --configure-git.

177# Repo-local credential.helper and pushurl still apply, and on a runner213# Repo-local credential.helper and pushurl still apply, and on a runner

178# before v2.1.280 so does core.sshCommand; if the hook holds credentials214# before v2.1.280 so does core.sshCommand; see the note below the script

179# the session didn't, see the note below the script.215# before you give this push a credential.

180g() { git -c core.fsmonitor=false -c core.hooksPath=/dev/null \216g() { git -c core.fsmonitor=false -c core.hooksPath=/dev/null \

181 -c commit.gpgsign=false "$@"; }217 -c commit.gpgsign=false "$@"; }

182for ws in $CLAUDE_RUNNER_WORKSPACE_PATHS; do218for ws in $CLAUDE_RUNNER_WORKSPACE_PATHS; do


188done224done

189```225```

190 226 

191hook 使用运行器主机上其自身环境中可用的任何 git 凭据进行推送。在[镜像中不含凭据的部署方式](/docs/zh-CN/self-hosted-environments-deploy#configure-git)下,包括内置克隆通过 Anthropic git 代理进行时,都没有可用凭据,因此请在推送前于 hook 内生成短期推送凭据:将 hook 在 `CLAUDE_CODE_SESSION_ACCESS_TOKEN` 中收到的会话令牌与您自己的令牌服务进行交换,并按照[验证会话身份](/docs/zh-CN/self-hosted-environments-identity)中的说明对其进行验证。当 hook 持有会话没有的凭据时,请将 `origin` 替换为操作员提供的 URL,并传递 `-c credential.helper=` 加上您自己的助手。[生命周期 hook 中的 Git 配置](#git-configuration-inside-lifecycle-hooks)说明了会话写入的配置仍可能影响哪些内容。227脚本中的 `GIT_ALLOW_PROTOCOL` 行将 git 限制为 HTTPS、HTTP 和 SSH 远程。如果运行器的环境已经设置了自己的非空 `GIT_ALLOW_PROTOCOL` 列表,脚本会保留该列表。

228 

229hook 使用运行器主机上其自身环境中可用的任何 git 凭据进行推送。在[镜像中不含凭据的部署方式](/docs/zh-CN/self-hosted-environments-deploy#configure-git)下,包括内置克隆通过 Anthropic git 代理进行时,都没有可用凭据,因此请在推送前于 hook 内生成短期推送凭据:将 hook 在 `CLAUDE_CODE_SESSION_ACCESS_TOKEN` 中收到的会话令牌与您自己的令牌服务进行交换,并按照[验证会话身份](/docs/zh-CN/self-hosted-environments-identity)中的说明对其进行验证。

230 

231请将您的 hook 提供给 git 的任何凭据都视为会话可以获取的凭据,并在生成时使其只能完成此次推送。hook 中的 git 会读取会话可以写入的配置文件,而其中某个文件指定的凭据助手或过滤器驱动程序会以您的 hook 的权限运行。无论您指定哪个远程,这些文件中的设置还可能改变推送的目标位置。有关运行器在您的 hook 中固定的 git 设置以及留给这些文件决定的设置,请参阅[生命周期 hook 中的 Git 配置](#git-configuration-inside-lifecycle-hooks)。

192 232 

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

194 运行器释放会话时的钩子时序234 运行器释放会话时的钩子时序


264| `CLAUDE_RUNNER_ORDER_ID` | 不透明的幂等性密钥,每个生成请求唯一,对 Kubernetes 资源名称安全。仅将订单 ID 用作您的配置器的去重密钥。 |304| `CLAUDE_RUNNER_ORDER_ID` | 不透明的幂等性密钥,每个生成请求唯一,对 Kubernetes 资源名称安全。仅将订单 ID 用作您的配置器的去重密钥。 |

265| `CLAUDE_RUNNER_SESSION_ID` | 此请求所针对的会话。该会话的每次重新请求都会重复此值,因此请将其用于日志记录和路由,而不要用作去重密钥。对于预热请求为空,预热请求在设置 [`--min-idle`](/docs/zh-CN/self-hosted-environments-reference#orchestrator-cli-flags) 时于任何特定会话之前启动待命运行器,因此不要假设变量已设置。 |305| `CLAUDE_RUNNER_SESSION_ID` | 此请求所针对的会话。该会话的每次重新请求都会重复此值,因此请将其用于日志记录和路由,而不要用作去重密钥。对于预热请求为空,预热请求在设置 [`--min-idle`](/docs/zh-CN/self-hosted-environments-reference#orchestrator-cli-flags) 时于任何特定会话之前启动待命运行器,因此不要假设变量已设置。 |

266| `CLAUDE_RUNNER_SESSION_UUID` | 相同的会话 ID,采用规范 UUID 形式。对于预热请求为空。 |306| `CLAUDE_RUNNER_SESSION_UUID` | 相同的会话 ID,采用规范 UUID 形式。对于预热请求为空。 |

267| `CLAUDE_RUNNER_ATTEMPT` | 此会话已有多少个生成请求。对于预热请求为 `0`。 |307| `CLAUDE_RUNNER_ATTEMPT` | 用于日志记录的按会话计数器。它不是重试次数,也不是请求次数。对于预热请求为 `0`,但针对某个会话的请求也可能携带 `0`。 |

268| `CLAUDE_RUNNER_ORDER_SERVER_TIME` | 来自轮询响应的 HTTP `Date` 标头的服务器时间。当 hook 验证工作单 JWT 的 `exp` 时,与此值进行比较而不是本地时钟,以容忍时钟偏差。当网关省略标头时为空。 |308| `CLAUDE_RUNNER_ORDER_SERVER_TIME` | 来自轮询响应的 HTTP `Date` 标头的服务器时间。当 hook 验证工作单 JWT 的 `exp` 时,与此值进行比较而不是本地时钟,以容忍时钟偏差。当网关省略标头时为空。 |

269| `CLAUDE_RUNNER_POOL_ID` | 新运行器应加入的环境的 ID,采用 `ccpool_...` 形式 |309| `CLAUDE_RUNNER_POOL_ID` | 新运行器应加入的环境的 ID,采用 `ccpool_...` 形式 |

270| `CLAUDE_RUNNER_ACCOUNT_ID` | 排队会话的帐户的标记 ID,用于按帐户路由、配额或退款。当不可用时为空,对于 Claude Tag 频道会话始终为空,这些会话没有帐户排队。 |310| `CLAUDE_RUNNER_ACCOUNT_ID` | 排队会话的帐户的标记 ID,用于按帐户路由、配额或退款。当不可用时为空,对于 Claude Tag 频道会话始终为空,这些会话没有帐户排队。 |

271| `CLAUDE_RUNNER_ACCOUNT_EMAIL` | 排队会话的帐户的电子邮件。当不可用时为空。将电子邮件视为个人可识别信息,不要记录它。 |311| `CLAUDE_RUNNER_ACCOUNT_EMAIL` | 排队会话的帐户的电子邮件。当不可用时为空。将电子邮件视为个人可识别信息,不要记录它。 |

272| `CLAUDE_RUNNER_PRIMARY_REPO_URL` | 会话的第一个 git 源的 URL,用于路由到已预热该仓库的运行器。当会话没有 git 源时为空。 |312| `CLAUDE_RUNNER_PRIMARY_REPO_URL` | 会话的第一个 git 源的 URL,用于路由到已预热该仓库的运行器。当会话没有 git 源时为空。 |

273| `CLAUDE_RUNNER_PRIMARY_REPO_REVISION` | 会话的第一个 git 源的修订版本:分支、SHA 或标签。当未指定时为空。 |313| `CLAUDE_RUNNER_PRIMARY_REPO_REVISION` | 会话的第一个 git 源的修订版本:分支、SHA、标签或完整引用名称。当未指定时为空。 |

274| `CLAUDE_RUNNER_REPO_SOURCES` | 所有会话的 git 源的 `{url, revision}` 的 JSON 数组,用于根据辅助仓库进行路由的 hook。当没有源时为空。 |314| `CLAUDE_RUNNER_REPO_SOURCES` | 所有会话的 git 源的 `{url, revision}` 的 JSON 数组,用于根据辅助仓库进行路由的 hook。当没有源时为空。 |

275| `CLAUDE_RUNNER_CORRELATION_ID` | 在会话创建时提供的关联 ID,回显以便 hook 可以将此工作单映射到创建会话的请求。当会话没有时为空。 |315| `CLAUDE_RUNNER_CORRELATION_ID` | 在会话创建时提供的关联 ID,回显以便 hook 可以将此工作单映射到创建会话的请求。当会话没有时为空。 |

276| `CLAUDE_RUNNER_CLIENT_PLATFORM` | 创建会话的客户端使用入口,例如 `web_claude_ai`、`desktop_app`、`ios` 或 `scheduled_trigger`,用于采用分析。当会话没有记录或识别的使用入口时未设置,对于预热请求也未设置;使用 `[ -n "${CLAUDE_RUNNER_CLIENT_PLATFORM:-}" ]` 检查它,这在 `set -u` 下保持安全。 |316| `CLAUDE_RUNNER_CLIENT_PLATFORM` | 创建会话的客户端使用入口,例如 `web_claude_ai`、`desktop_app`、`ios` 或 `scheduled_trigger`,用于采用分析。当会话没有记录或识别的使用入口时未设置,对于预热请求也未设置;使用 `[ -n "${CLAUDE_RUNNER_CLIENT_PLATFORM:-}" ]` 检查它,这在 `set -u` 下保持安全。 |


282* **在生成的运行器上使用 `--capacity 1`**:会话绑定的工作单恰好注册一个绑定到该会话的运行器,因此更高的容量添加永远不会接收工作的插槽,运行器在启动时记录警告。322* **在生成的运行器上使用 `--capacity 1`**:会话绑定的工作单恰好注册一个绑定到该会话的运行器,因此更高的容量添加永远不会接收工作的插槽,运行器在启动时记录警告。

283* **预热工作单注册未绑定**:待命运行器未绑定到会话,并像固定队列运行器一样声称排队的工作。323* **预热工作单注册未绑定**:待命运行器未绑定到会话,并像固定队列运行器一样声称排队的工作。

284 324 

285约定有四个与配置器无关的规则:325无论您的 hook 在哪个平台上配置资源,约定都有四条规则:

286 326 

2871. **在 `CLAUDE_RUNNER_ORDER_ID` 上保持幂等。** 相同请求的重新交付必须最多生成一个运行器。从订单 ID 派生确定性资源名称,让您的平台拒绝重复。不要改为以 `CLAUDE_RUNNER_SESSION_ID` 作为键。会话的每次重新请求都携带相同的会话 ID 和新的订单 ID,因此按会话 ID 命名或去重的工作负载只会创建一次,之后该会话再也不会创建。3271. **在 `CLAUDE_RUNNER_ORDER_ID` 上保持幂等。** 相同请求的重新交付必须最多生成一个运行器。从订单 ID 派生确定性资源名称,让您的平台拒绝重复。不要改为以 `CLAUDE_RUNNER_SESSION_ID` 作为键。会话的每次重新请求都携带相同的会话 ID 和新的订单 ID,因此按会话 ID 命名或去重的工作负载只会创建一次,之后该会话再也不会创建。

2882. **不要重试工作负载。** 一个订单 ID 意味着最多创建一个工作负载。如果运行器从不注册,Anthropic 在 `--expected-spawn-seconds` 后使用新订单 ID 重新请求。3282. **不要重试工作负载。** 一个订单 ID 意味着最多创建一个工作负载。如果运行器从不注册,Anthropic 在 `--expected-spawn-seconds` 后使用新订单 ID 重新请求。

2893. **使用退出码约定。** 退出 0 表示已提交。退出 1 表示可重试失败;会话退避并被重新提供。退出 2 或更高表示不可重试;会话被阻止再次生成,直到 [Owner](/docs/zh-CN/cloud-environments#organization-shared-environments) 在环境的 **Activity** 标签中选择 **Retry**。在非零退出时,hook 的 stderr 尾部出现在那里作为失败原因,因此将可操作的错误写入 stderr,永远不要写密钥。对于预热请求,没有会话失败:编排器仅在本地记录非零退出,服务器在租约后重新请求生成。3293. **使用退出码约定。** 以与结果相匹配的状态退出:

2904. **将 `--expected-spawn-seconds` 设置为至少您的 p99 启动时间。** 这是服务器端租约。所有编排器副本必须使用相同的值。330 

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

332 * **退出 1**:可重试失败。会话退避并被重新提供。

333 * **退出 2 或更高**:不可重试失败。会话被阻止再次生成,直到用户向其发送新消息,或 [Owner](/docs/zh-CN/cloud-environments#organization-shared-environments) 在环境的 **Activity** 标签中对其选择 **Retry**。

334 

335 在非零退出时,hook 的 stderr 尾部会作为失败原因出现在 **Activity** 标签中,因此请将可操作的错误写入 stderr,并且永远不要在其中写入密钥。在 shell hook 中,请[保持暂时性失败可重试](#keep-transient-failures-retryable-in-a-shell-hook)。

336 

337 预热请求没有可失败的会话:编排器仅在本地记录非零退出,服务器在 `--expected-spawn-seconds` 租约到期后重新请求生成。

3384. **将 `--expected-spawn-seconds` 设置为至少您从生成请求到运行器注册的 p99 时间。** 从编排器收到生成请求时开始计算,并包括在您的平台上等待容量的时间以及启动时间。此值是服务器端租约,工作单也随之过期,因此工作负载耗时更长的运行器无法注册。所有编排器副本必须使用相同的值。

291 339 

292hook 写入 stdout 或 stderr 的所有内容都出现在编排器的日志中,凭据会自动脱敏。如果会话保持排队,检查编排器的 `/healthz` 正文以获取队列计数,然后在 [**Cloud environments** 管理页面](https://claude.ai/admin-settings/cloud-environments) 上打开您的环境的 **Activity** 标签:在那里展开失败的会话以获取其生成错误,并选择 **Retry** 以重新请求它。340hook 写入 stdout 或 stderr 的所有内容都出现在编排器的日志中,凭据会自动脱敏。如果会话保持排队,检查编排器的 `/healthz` 正文以获取队列计数,然后在 [**Cloud environments** 管理页面](https://claude.ai/admin-settings/cloud-environments) 上打开您的环境的 **Activity** 标签:在那里展开失败的会话以获取其生成错误,并选择 **Retry** 以重新请求它。

293 341 

294如果会话保持排队,且 **Activity** 标签中没有生成错误,可能意味着 hook 以会话 ID 作为键。要确认这一点,请检查您的平台是否存在该会话第一次生成请求对应的工作负载,而重新请求却没有对应的工作负载。如果是这样,请改为以 `CLAUDE_RUNNER_ORDER_ID` 作为工作负载的键。342如果会话保持排队,且 **Activity** 标签中没有生成错误,可能意味着 hook 以会话 ID 作为键。要确认这一点,请检查您的平台是否存在该会话第一次生成请求对应的工作负载,而重新请求却没有对应的工作负载。如果是这样,请改为以 `CLAUDE_RUNNER_ORDER_ID` 作为工作负载的键。

295 343 

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

345 在 shell hook 中保持暂时性失败可重试

346</h4>

347 

348在使用 `set -e` 的 shell hook 中,本可通过重试解决的失败可能会导致会话被阻止。hook 会在失败的命令处停止,并以该命令自身的状态退出,而编排器会对该状态应用退出码约定。许多失败返回 2 或更高的状态,例如命令未安装时返回的 `127`,以及 `curl --fail` 遇到 HTTP 错误时返回的 `22`,因此它们会在第一次失败时就阻止会话。

349 

350已被 hook 阻止的会话会保持阻止状态,直到用户向其发送新消息,或 [Owner](/docs/zh-CN/cloud-environments#organization-shared-environments) 在环境的 **Activity** 标签中对其选择 **Retry**。

351 

352要将此类失败改为退出 1,请将以下几行直接放在 hook 的 `#!` 行下方、任何可能失败的内容之上:

353 

354```bash theme={null}

355set -e

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

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

358```

359 

360这几行会改变 hook 其余部分的行为方式,因此添加后请检查 hook 中是否存在以下每种模式:

361 

362* **单独的 `exit 2` 或更高**:设置 trap 后,它会变为退出 1。对于任何重试都无法修复的错误,请改为调用 `permanent` 并附上原因,例如 `permanent "namespace claude-runners does not exist"`。请在主 shell 中调用它,而不要在 `$( )`、`( )` 或管道内调用。

363* **`exec`**:不要以 `exec` 开始 hook 的最后一条命令,因为 `exec` 会替换 shell,trap 将不会运行。

364* **第二个 `EXIT` trap**:第二个 `trap ... EXIT` 会替换第一个,因此请将两者合并为一个 trap。将您的清理命令直接放在 `rc=$?;` 之后,并在每条命令末尾加上 `|| true;`。这样清理在失败和成功时都会运行,而且失败的清理命令不会设置 hook 的退出状态。以下合并后的 trap 展示了其结构,其中 `your-cleanup-command` 代表您自己的命令:

365 

366 ```bash theme={null}

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

368 ```

369* **允许失败的命令**:如果 hook 之前未使用 `set -e`,它现在会在第一条返回非零值的命令处停止,例如未找到任何结果的查找,或被您的平台拒绝的重复提交。如果 hook 会根据结果执行操作,请将该命令作为 `if` 的条件。如果 hook 忽略结果,请在该命令后加上 `|| true`。

370 

371要确认 trap 是否生效,请在 `trap` 行正下方添加一行,调用一个不存在的命令,例如 `no-such-command`。从您的 shell 运行 hook 文件,检查 `echo $?` 是否输出 `1`,然后删除该行。

372 

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

297 将模型请求发送到 Bedrock 或 Agent Platform374 将模型请求发送到 Bedrock 或 Agent Platform

298</h2>375</h2>


381将模型请求发送到 Amazon Bedrock 或 Google Cloud 的 Agent Platform 的会话与 Anthropic API 上的会话存在以下不同:458将模型请求发送到 Amazon Bedrock 或 Google Cloud 的 Agent Platform 的会话与 Anthropic API 上的会话存在以下不同:

382 459 

383* **来自 claude.ai 的策略**:[服务器托管设置](/docs/zh-CN/server-managed-settings)不会传递到这些会话。Owner 在 Claude Code 管理设置中设定的组织策略也不会传递到这些会话,因此 Claude Code 不会在会话中强制执行这些策略。请将您依赖的规则放入 runner 镜像的[托管设置文件](/docs/zh-CN/managed-settings#delivery-mechanisms)中。460* **来自 claude.ai 的策略**:[服务器托管设置](/docs/zh-CN/server-managed-settings)不会传递到这些会话。Owner 在 Claude Code 管理设置中设定的组织策略也不会传递到这些会话,因此 Claude Code 不会在会话中强制执行这些策略。请将您依赖的规则放入 runner 镜像的[托管设置文件](/docs/zh-CN/managed-settings#delivery-mechanisms)中。

461* **账户 skill**:这些会话不会下载用户的 claude.ai 账户中已启用的 skill。请参阅[每个会话的配置是如何组装的](#how-each-session’s-config-is-assembled)。

384* **文件**:用户在 claude.ai 或移动端、桌面端应用中附加到会话的文件不会传递到会话,Claude 也无法通过 [`SendUserFile` 工具](/docs/zh-CN/tools-reference)回传文件。请改为将输入文件放在仓库中或 runner 上。462* **文件**:用户在 claude.ai 或移动端、桌面端应用中附加到会话的文件不会传递到会话,Claude 也无法通过 [`SendUserFile` 工具](/docs/zh-CN/tools-reference)回传文件。请改为将输入文件放在仓库中或 runner 上。

385* **模型选择**:Anthropic 的控制平面会发送每个会话的模型;当会话启动时未指定模型,Claude Code 会使用该提供商的默认模型。runner 会从其传递给会话的环境中移除 `ANTHROPIC_MODEL` 和 `ANTHROPIC_DEFAULT_MODEL`。提供商页面的示例设置了 `ANTHROPIC_MODEL`,但在 runner 的环境中这两个变量都不起作用。[Amazon Bedrock](/docs/zh-CN/amazon-bedrock#4-pin-model-versions) 和 [Agent Platform](/docs/zh-CN/google-vertex-ai#5-pin-model-versions) 的"固定模型版本"中的各模型系列变量确实会传递到会话。它们决定的是 `opus` 等别名解析为哪个模型,而不是完整模型 ID 解析为哪个模型。463* **模型选择**:Anthropic 的控制平面会发送每个会话的模型;当会话启动时未指定模型,Claude Code 会使用该提供商的默认模型。您无法通过 runner 环境中的 `ANTHROPIC_MODEL` 或 `ANTHROPIC_DEFAULT_MODEL` 选择模型,但可以固定别名解析到的模型:

464 * **`ANTHROPIC_MODEL` 和 `ANTHROPIC_DEFAULT_MODEL`**:runner 会从其传递给会话的环境中移除这两个变量,尽管提供商页面的示例设置了 `ANTHROPIC_MODEL`。

465 * **各模型系列的固定变量**:[Amazon Bedrock](/docs/zh-CN/amazon-bedrock#4-pin-model-versions) 和 [Agent Platform](/docs/zh-CN/google-vertex-ai#5-pin-model-versions) 的"固定模型版本"中的变量确实会传递到会话。它们决定的是 `opus` 等别名解析为哪个模型,而不是完整模型 ID 解析为哪个模型。

386* **您的账户不提供的模型**:会话可能在某条消息上失败,并显示指明该模型的错误。请启用您的开发人员可以选择的模型、"固定模型版本"中所述的后台模型,以及[自动模式](/docs/zh-CN/permission-modes#enable-auto-mode-on-bedrock-agent-platform-or-foundry)使用的分类器模型。在 Amazon Bedrock 上,请在策略中允许其中的每一个模型。466* **您的账户不提供的模型**:会话可能在某条消息上失败,并显示指明该模型的错误。请启用您的开发人员可以选择的模型、"固定模型版本"中所述的后台模型,以及[自动模式](/docs/zh-CN/permission-modes#enable-auto-mode-on-bedrock-agent-platform-or-foundry)使用的分类器模型。在 Amazon Bedrock 上,请在策略中允许其中的每一个模型。

387* **Web 搜索和快速模式**:[Web 搜索](/docs/zh-CN/tools-reference#websearch-tool-behavior)在 Amazon Bedrock 上不可用,[快速模式](/docs/zh-CN/fast-mode)在这两个提供商上均不可用。有关因提供商而异的其他功能,请参阅[因提供商而异的 CLI 功能](/docs/zh-CN/feature-availability#cli-capabilities-that-vary-by-provider)。467* **Web 搜索和快速模式**:[Web 搜索](/docs/zh-CN/tools-reference#websearch-tool-behavior)在 Amazon Bedrock 上不可用,[快速模式](/docs/zh-CN/fast-mode)在这两个提供商上均不可用。有关因提供商而异的其他功能,请参阅[因提供商而异的 CLI 功能](/docs/zh-CN/feature-availability#cli-capabilities-that-vary-by-provider)。

388 468 


411 491 

412会话会继承运行器的环境,因此请在运行器环境中设置 [`ENABLE_TOOL_SEARCH`](/docs/zh-CN/mcp#scale-with-mcp-tool-search),以控制该运行器生成的每个会话的 MCP 工具搜索;MCP 页面介绍了可用的值。492会话会继承运行器的环境,因此请在运行器环境中设置 [`ENABLE_TOOL_SEARCH`](/docs/zh-CN/mcp#scale-with-mcp-tool-search),以控制该运行器生成的每个会话的 MCP 工具搜索;MCP 页面介绍了可用的值。

413 493 

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

495 

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

497 在第一轮之前等待 MCP 服务器

498</h3>

499 

500自托管会话会在两个不同的时间点短暂等待仍在连接中的 MCP 服务器。错过等待的服务器,其工具在第一轮开始时不可用,之后会自动变为可用,无需您进行任何操作。这两次等待分别是:

501 

502* **会话启动**:在首次获取工具列表之前,会话默认最多等待 5 秒,等待条目中设置了 [`alwaysLoad: true`](/docs/zh-CN/mcp#exempt-a-server-from-deferral) 的 HTTP 或 SSE 服务器;如果您在运行器的环境中设置了 [`MCP_CONNECTION_NONBLOCKING=0`](/docs/zh-CN/env-vars),则会等待所有服务器。否则,HTTP 和 SSE 服务器会在后台连接。会话在此处等待期间,初始化会变慢。[`MCP_CONNECT_TIMEOUT_MS`](/docs/zh-CN/env-vars) 可更改 5 秒的默认值。

503* **第一轮**:消息到达后,第一轮最多等待 2 秒,等待仍在连接中的 stdio 服务器。会话在此处等待期间,第一条回复会变慢。要更改此等待的时长,请在运行器的环境中设置 [`CLAUDE_CODE_MCP_STARTUP_WAIT_MS`](/docs/zh-CN/env-vars)。它不会改变此等待涵盖哪些服务器。需要 Claude Code v2.1.274 或更高版本。

504 

505`claude mcp add` 没有 `alwaysLoad` 标志。要设置该键,请改用 `claude mcp add-json` 添加服务器,该命令从服务器的 JSON 中接收该键并将其写入 `.claude.json`。在您的 Dockerfile 中:

506 

507```dockerfile theme={null}

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

509```

510 

511如果某个服务器的工具在后续轮次中也没有出现,请按照 [MCP 服务器](#mcp-servers)中的说明,检查该服务器是否到达了会话。

512 

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

415 关闭内置会话工具514 关闭内置会话工具

416</h3>515</h3>


571 670 

572设置 `SELF_HOSTED_RUNNER_HOST_CONFIG_DIR` 可从其他路径获取初始内容,或将其指向空目录以禁用初始内容填充。671设置 `SELF_HOSTED_RUNNER_HOST_CONFIG_DIR` 可从其他路径获取初始内容,或将其指向空目录以禁用初始内容填充。

573 672 

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)。673会话还会读取以下设置文件:

674 

675* **项目设置**:仓库中提交的 `.claude/settings.json` 会叠加在用户级基线之上。在包含多个仓库的会话中,[最多只有一个仓库的文件生效](#repository-settings-in-sessions-with-several-repositories)。

676* **托管设置**:会话会从运行器镜像中的标准系统路径读取 [`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)。

677 

678有关这些来源的应用顺序,请参阅[设置优先级](/docs/zh-CN/settings#settings-precedence)。

575 679 

576当 Anthropic 的控制平面为会话提供 [Claude Code hook](/docs/zh-CN/hooks) 时,运行器会将它们与您自己的配置并行安装,而不是覆盖您的配置。需要 Claude Code v2.1.229 或更高版本。680当 Anthropic 的控制平面为会话提供 [Claude Code hook](/docs/zh-CN/hooks) 时,运行器会将它们与您自己的配置并行安装,而不是覆盖您的配置。需要 Claude Code v2.1.229 或更高版本。

577 681 


579* **编写者**:控制平面使用其自身部署中的固定常量填充这些脚本,绝不使用按会话或第三方的输入。683* **编写者**:控制平面使用其自身部署中的固定常量填充这些脚本,绝不使用按会话或第三方的输入。

580* **仍然适用的管控**:通过 `--settings` 下发的 hook 会进入普通的合并 hook 配置,而不是托管层,因此您的托管设置仍然适用。`disableAllHooks` 会禁用它们,并且它们不属于 [`allowManagedHooksOnly`](/docs/zh-CN/settings-reference#allowmanagedhooksonly) 保持加载的类别。684* **仍然适用的管控**:通过 `--settings` 下发的 hook 会进入普通的合并 hook 配置,而不是托管层,因此您的托管设置仍然适用。`disableAllHooks` 会禁用它们,并且它们不属于 [`allowManagedHooksOnly`](/docs/zh-CN/settings-reference#allowmanagedhooksonly) 保持加载的类别。

581 685 

686当某人启动自己的会话时,Claude Code 还会将[其 claude.ai 账户中启用的 skill](/docs/zh-CN/skills#skills-in-cowork-and-cloud-sessions) 下载到该会话的配置目录中。[Routine](/docs/zh-CN/routines) 运行不会获得其所有者的 skill,而[将模型请求发送到 Bedrock 或 Agent Platform](#send-model-requests-to-bedrock-or-agent-platform) 的会话不会下载任何 skill。对于这些会话需要的 skill,请将其提交到仓库的 `.claude/skills/` 中,或将其添加到您的运行器镜像中。

687 

582除 [Claude Tag](https://claude.com/docs/claude-tag/overview) 会话外,自托管环境中的会话默认关闭[自动记忆](/docs/zh-CN/memory#auto-memory)。对于需要跨会话保留的指令,请使用运行器镜像或仓库中的 `CLAUDE.md`。688除 [Claude Tag](https://claude.com/docs/claude-tag/overview) 会话外,自托管环境中的会话默认关闭[自动记忆](/docs/zh-CN/memory#auto-memory)。对于需要跨会话保留的指令,请使用运行器镜像或仓库中的 `CLAUDE.md`。

583 689 

584运行器对主机 `~/.claude/` 的快照不包含 `projects/` 目录。自动记忆的默认存储位置就在该目录下。如果您将记忆文件放在那里,运行器不会将它们填充到会话中,它们也不会启用自动记忆。690运行器对主机 `~/.claude/` 的快照不包含 `projects/` 目录。自动记忆的默认存储位置就在该目录下。如果您将记忆文件放在那里,运行器不会将它们填充到会话中,它们也不会启用自动记忆。

Details

20 20 

21* **临时的、按会话的容器**:在新容器或 VM 中运行每个运行器进程,该容器或 VM 在进程退出时被销毁,使用 `--capacity 1` 和默认的 `--drain-grace-sec 0`,以便每个容器恰好服务一个会话。在更高的容量或正的 drain grace 下,一个容器为来自同一[锁定所有者](/docs/zh-CN/self-hosted-environments#key-concepts)的多个会话服务;请参阅[运行器生命周期](/docs/zh-CN/self-hosted-environments#runner-lifecycle)。不要在运行器重启之间重用文件系统,除了在刻意的[预热检出](#reuse-a-pre-warmed-checkout)设置中,并且永远不要跨所有者。21* **临时的、按会话的容器**:在新容器或 VM 中运行每个运行器进程,该容器或 VM 在进程退出时被销毁,使用 `--capacity 1` 和默认的 `--drain-grace-sec 0`,以便每个容器恰好服务一个会话。在更高的容量或正的 drain grace 下,一个容器为来自同一[锁定所有者](/docs/zh-CN/self-hosted-environments#key-concepts)的多个会话服务;请参阅[运行器生命周期](/docs/zh-CN/self-hosted-environments#runner-lifecycle)。不要在运行器重启之间重用文件系统,除了在刻意的[预热检出](#reuse-a-pre-warmed-checkout)设置中,并且永远不要跨所有者。

22 * <span id="processes-a-stopped-session-leaves" />当运行器停止会话时,它不会向在其 shell 命令退出后仍在运行的进程(例如已转为守护进程的服务)发送任何信号。销毁容器或 VM 会结束该进程。22 * <span id="processes-a-stopped-session-leaves" />当运行器停止会话时,它不会向在其 shell 命令退出后仍在运行的进程(例如已转为守护进程的服务)发送任何信号。销毁容器或 VM 会结束该进程。

23* **镜像中没有广泛的凭证**:不要包含长期的 SSH 密钥、云提供商凭证或授予超过会话需要的个人访问令牌。从您的[包装脚本](/docs/zh-CN/self-hosted-environments-configuration#wrapper-scripts)按会话铸造会话期间使用的凭证,例如推送或 API 令牌。对于在包装脚本运行之前发生的初始克隆,使用 [`checkout` 生命周期钩子](/docs/zh-CN/self-hosted-environments-configuration#checkout)或 [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy);请参阅[配置 git](#configure-git)。23* **镜像中没有广泛的凭据**:不要包含长期的 SSH 密钥、云提供商凭据或授予超过会话需要的个人访问令牌。从您的[包装脚本](/docs/zh-CN/self-hosted-environments-configuration#wrapper-scripts)按会话铸造会话期间使用的凭据,例如推送或 API 令牌。初始克隆发生在包装脚本运行之前,因此请使用 [`checkout` 生命周期 hook](/docs/zh-CN/self-hosted-environments-configuration#checkout) 处理它,或者在会话的所有仓库都位于 github.com 上时使用 [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy)。关于这两者,请参阅[配置 git](#configure-git)。

24* **使主机的 GitHub 凭据远离会话**:Claude 可以使用会话能够读取的任何 GitHub 凭据,并拥有该凭据授予的全部访问权限。请确保运行器主机自身的宽范围 GitHub 凭据不出现在会话可以读取的任何位置。此类凭据可以是个人访问令牌、`gh auth login` 为您的帐户保存的令牌,或运行器环境中的 `GH_TOKEN`。

25 * **使用 [Anthropic 托管的 git](#use-the-anthropic-git-proxy) 时**:有了此类凭据,Claude 会直接访问 GitHub,而不是通过 Anthropic 托管的 git。

26 * **不使用 Anthropic 托管的 git 时**:如果您按照[在镜像中附带 git 配置](#ship-git-config-in-your-image)所述严格限定克隆凭据的范围,则该凭据可以保留在镜像中。

24* **将环境密钥保持在运行会话的主机之外**:环境密钥可以注册运行器并获取在环境上排队的任何会话。在固定队列上,它存在于每个运行器主机上,任何会话的代码都可以读取密钥文件。优先使用[按需运行器](/docs/zh-CN/self-hosted-environments-configuration#on-demand-runners),其中密钥保留在编排器主机上,该主机从不运行用户代码,每个运行器接收单次使用的工作单,恰好注册一个运行器。在固定队列上,将环境密钥文件视为可由每个会话读取,并在任何可疑会话泄露后轮换密钥。27* **将环境密钥保持在运行会话的主机之外**:环境密钥可以注册运行器并获取在环境上排队的任何会话。在固定队列上,它存在于每个运行器主机上,任何会话的代码都可以读取密钥文件。优先使用[按需运行器](/docs/zh-CN/self-hosted-environments-configuration#on-demand-runners),其中密钥保留在编排器主机上,该主机从不运行用户代码,每个运行器接收单次使用的工作单,恰好注册一个运行器。在固定队列上,将环境密钥文件视为可由每个会话读取,并在任何可疑会话泄露后轮换密钥。

25* **默认拒绝网络出站流量**:在每个环境上限制运行器和会话容器的出站流量在您自己的网络边界;[默认拒绝出站流量](#default-deny-egress)涵盖允许什么以及原因。28* **默认拒绝网络出站流量**:在每个环境上限制运行器和会话容器的出站流量在您自己的网络边界;[默认拒绝出站流量](#default-deny-egress)涵盖允许什么以及原因。

26* **最小权限主机 IAM**:附加到运行器主机的计算身份(例如实例配置文件或节点服务帐户)应仅授予运行器本身需要的内容。会话应通过您的包装脚本而不是继承主机的身份获取自己的凭证。29* **最小权限主机 IAM**:附加到运行器主机的计算身份(例如实例配置文件或节点服务帐户)应仅授予运行器本身需要的内容。会话应通过您的包装脚本而不是继承主机的身份获取自己的凭证。


42 无论 [`--trust-workspace`](/docs/zh-CN/self-hosted-environments-reference#runner-cli-flags) 如何,保护都会运行,并且不涵盖存储库钩子、`.mcp.json` 或 Bash 规则;请参阅[权限和工具批准](/docs/zh-CN/self-hosted-environments-configuration#permissions-and-tool-approval)了解这些授予的位置。45 无论 [`--trust-workspace`](/docs/zh-CN/self-hosted-environments-reference#runner-cli-flags) 如何,保护都会运行,并且不涵盖存储库钩子、`.mcp.json` 或 Bash 规则;请参阅[权限和工具批准](/docs/zh-CN/self-hosted-environments-configuration#permissions-and-tool-approval)了解这些授予的位置。

43 46 

44<Note>47<Note>

45 您组织的 IP 允许列表默认不涵盖自托管运行器流量。不要将其作为运行器或会话流量的网络控制;而是在您自己的网络边界应用默认拒绝出站流量,如果您想为您的组织强制执行 IP 允许列表,请联系您的 Anthropic 帐户团队。48 如果您的组织启用了 [IP 允许列表](https://support.claude.com/en/articles/13200993-restrict-access-to-claude-with-ip-allowlisting),请在启动运行器和会话容器之前,将它们的公共出站地址添加到允许列表中。如果您运行[按需运行器](/docs/zh-CN/self-hosted-environments-configuration#on-demand-runners),还需添加编排器主机的地址。不要将允许列表作为运行器或会话流量的网络控制,而应在您自己的网络边界应用默认拒绝出站流量。

46</Note>49</Note>

47 50 

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


55 58 

56| 主机 | 端口 | 用途 |59| 主机 | 端口 | 用途 |

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

58| `api.anthropic.com` | 443,HTTPS;仅 SCM 连接器的 WSS | 运行器控制平面和会话流式传输、模型推理、功能标志、产品分析、[JWKS](/docs/zh-CN/self-hosted-environments-identity) 密钥获取、提交签名、设置 `--use-anthropic-git-proxy` 时的 git 代理,以及设置 `--scm-connector-host` 时编排器的 [SCM 连接器](/docs/zh-CN/self-hosted-environments-reference#scm-connector-flags)隧道 |61| `api.anthropic.com` | 443,HTTPS;[Anthropic 托管的 git](#use-the-anthropic-git-proxy) 使用 WSS | 运行器控制平面和会话流式传输、模型推理、功能标志、产品分析、[JWKS](/docs/zh-CN/self-hosted-environments-identity) 密钥获取、提交签名,以及设置 `--use-anthropic-git-proxy` 时的 Anthropic 托管 git |

59| 您的 git 主机,例如 `github.com` 或您的 GitHub Enterprise 主机 | 443 或 22 | 克隆和推送存储库。如果运行器使用 `--use-anthropic-git-proxy`(通过 `api.anthropic.com` 路由 git 流量)则不需要。 |62| 您的 git 主机,例如 `github.com` 或您的 GitHub Enterprise 主机 | 443 或 22 | 在运行器会话使用的每个 git 主机上克隆和推送仓库。对于使用 [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy) 的运行器,请参阅[何时仍需要 `github.com` 路径](#github-com-egress-with-the-anthropic-git-proxy)。 |

63 

64<span id="github-com-egress-with-the-anthropic-git-proxy" />使用 [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy) 的运行器通过 `api.anthropic.com` 路由其 `github.com` git 流量,因此不需要 `github.com` 的 git 主机路径。如果您设置了 `--push-outcome-on-release` 或从 `post-session` hook 推送,则仍需要该路径。

60 65 

61这些主机是否需要取决于您的配置:66这些主机是否需要取决于您的配置:

62 67 


71| `browser-intake-us5-datadoghq.com` | 443 | Anthropic 错误报告上传,仅在为会话帐户启用[错误报告](/docs/zh-CN/data-usage#telemetry-services)时发送。由 `DISABLE_ERROR_REPORTING=1` 或 `DISABLE_TELEMETRY=1` 抑制。 |76| `browser-intake-us5-datadoghq.com` | 443 | Anthropic 错误报告上传,仅在为会话帐户启用[错误报告](/docs/zh-CN/data-usage#telemetry-services)时发送。由 `DISABLE_ERROR_REPORTING=1` 或 `DISABLE_TELEMETRY=1` 抑制。 |

72| 您的云提供商用于模型请求、模型查询和续期凭据的端点,例如 `bedrock-runtime.us-east-1.amazonaws.com` 或 `aiplatform.googleapis.com` | 443 | 仅当运行器[将模型请求发送到 Amazon Bedrock 或 Google Cloud 的 Agent Platform](/docs/zh-CN/self-hosted-environments-configuration#send-model-requests-to-bedrock-or-agent-platform) 时 |77| 您的云提供商用于模型请求、模型查询和续期凭据的端点,例如 `bedrock-runtime.us-east-1.amazonaws.com` 或 `aiplatform.googleapis.com` | 443 | 仅当运行器[将模型请求发送到 Amazon Bedrock 或 Google Cloud 的 Agent Platform](/docs/zh-CN/self-hosted-environments-configuration#send-model-requests-to-bedrock-or-agent-platform) 时 |

73 78 

74运行器不会到达 `statsig.anthropic.com`、`*.sentry.io`、`claude.ai` 或 `platform.claude.com`。这些主机出现在一些较旧的企业网络检查清单中,但您不需要为运行器或会话流量允许列表它们:功能标志获取转到 `api.anthropic.com`,运行器使用环境密钥而不是交互式 OAuth 进行身份验证。两个主机端流程确实到达 `claude.ai`,因此从其出站允许它的主机运行它们,而不是扩大会话容器出站流量:单行安装程序在安装时从 `claude.ai` 获取 `install.sh`,交互式 `claude auth login`([引导设置](/docs/zh-CN/self-hosted-environments-quickstart#set-up-an-environment-and-runner)、`doctor` 的已登录模式和 [CI 分派](/docs/zh-CN/self-hosted-environments-testing#authenticate-from-ci)使用)通过 `claude.ai`、`claude.com` 和 `platform.claude.com` 登录。`mcp-proxy.anthropic.com` 也不是必需的:自托管会话不使用它,当为您的组织启用时,您组织的 claude.ai 连接器向会话的交付通过 `api.anthropic.com` 路由。请参阅 [MCP 服务器](/docs/zh-CN/self-hosted-environments-configuration#mcp-servers)。79您不需要为运行器或会话流量将以下主机加入允许列表:

80 

81* **`statsig.anthropic.com`、`*.sentry.io`、`claude.ai` 和 `platform.claude.com`**:这些主机出现在一些较旧的企业网络检查清单中,但运行器不会访问它们。功能标志获取转到 `api.anthropic.com`,运行器使用环境密钥而不是交互式 OAuth 进行身份验证。

82* **`mcp-proxy.anthropic.com`**:自托管会话不使用它。当为您的组织启用连接器交付时,您组织的 claude.ai 连接器通过 `api.anthropic.com` 到达会话。请参阅 [MCP 服务器](/docs/zh-CN/self-hosted-environments-configuration#mcp-servers)。

83 

84以下主机端流程确实会访问 `claude.ai`,因此请从出站流量允许访问它的主机运行这些流程,而不是扩大会话容器出站流量:

85 

86* **单行安装程序**:在安装时从 `claude.ai` 获取 `install.sh`。

87* **交互式 `claude auth login`**:通过 `claude.ai`、`claude.com` 和 `platform.claude.com` 登录。[引导设置](/docs/zh-CN/self-hosted-environments-quickstart#run-the-guided-setup)、`doctor` 的已登录模式和 [CI 分派](/docs/zh-CN/self-hosted-environments-testing#authenticate-from-ci)会使用它。您用于登录的浏览器还会从 `hcaptcha.com`、`*.hcaptcha.com` 和 `challenges.cloudflare.com` 加载 claude.ai 登录页面的浏览器检查。

75 88 

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

77 默认拒绝出站流量90 默认拒绝出站流量


127* **让运行器配置 git**:使用 `--configure-git` 启动运行器,使其写入 Anthropic 托管会话使用的相同身份和提交签名配置140* **让运行器配置 git**:使用 `--configure-git` 启动运行器,使其写入 Anthropic 托管会话使用的相同身份和提交签名配置

128* **在镜像中提供 git 配置**:自己设置身份和推送凭证,例如在您自己的机器人身份下提交141* **在镜像中提供 git 配置**:自己设置身份和推送凭证,例如在您自己的机器人身份下提交

129 142 

143对于 github.com 上的仓库,您还可以使用 [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy) 启动运行器,或设置 `CLAUDE_RUNNER_USE_GIT_PROXY=1`,以请求 Anthropic 为运行器的会话提供 git 服务。

144 

130运行器主机上的 Git 版本下限:[`--configure-git`](#let-the-runner-configure-git) SSH 提交签名需要 Git 2.34 或更高版本,[`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy) 需要 2.32 或更高版本,从 [`--push-outcome-on-release`](/docs/zh-CN/self-hosted-environments-reference#runner-cli-flags) 推送的分支恢复会话需要 2.29 或更高版本。如果您省略所有三个并自己管理 git 身份,Git 2.24 就足够了。145运行器主机上的 Git 版本下限:[`--configure-git`](#let-the-runner-configure-git) SSH 提交签名需要 Git 2.34 或更高版本,[`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy) 需要 2.32 或更高版本,从 [`--push-outcome-on-release`](/docs/zh-CN/self-hosted-environments-reference#runner-cli-flags) 推送的分支恢复会话需要 2.29 或更高版本。如果您省略所有三个并自己管理 git 身份,Git 2.24 就足够了。

131 146 

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


138* `user.name = Claude` 和 `user.email = noreply@anthropic.com`,与 Anthropic 托管会话匹配153* `user.name = Claude` 和 `user.email = noreply@anthropic.com`,与 Anthropic 托管会话匹配

139* SSH 格式提交和标签签名,通过运行器管理的垫片路由,使用会话自己的凭证通过 Anthropic 的签名服务签署每个提交。签名可在 GitHub 上针对 Anthropic 的已发布 SSH 签名密钥进行验证。154* SSH 格式提交和标签签名,通过运行器管理的垫片路由,使用会话自己的凭证通过 Anthropic 的签名服务签署每个提交。签名可在 GitHub 上针对 Anthropic 的已发布 SSH 签名密钥进行验证。

140* `push.negotiate = true`,所以 git 在打包推送之前询问您的 git 主机它已经拥有哪些提交。需要 Claude Code v2.1.257 或更高版本。155* `push.negotiate = true`,所以 git 在打包推送之前询问您的 git 主机它已经拥有哪些提交。需要 Claude Code v2.1.257 或更高版本。

141* `core.hooksPath` 指向运行器管理的钩子目录。其 `commit-msg` 和 `prepare-commit-msg` 钩子为每个提交添加 `Co-authored-by:` 预告片,用于会话的创建者,从 [`CCR_SESSION_ACCOUNT_EMAIL`](/docs/zh-CN/self-hosted-environments-configuration#wrapper-scripts) 构建,当该变量未设置时省略。如果您的镜像已设置 `core.hooksPath`,运行器保留您的设置,跳过安装这些钩子,并打印 `[runner:git]` 警告。156* `core.hooksPath` 指向运行器管理的钩子目录。其 `commit-msg` 和 `prepare-commit-msg` 钩子为每个提交添加会话创建者的 `Co-authored-by:` 尾注。该尾注根据 [`CCR_SESSION_ACCOUNT_EMAIL`](/docs/zh-CN/self-hosted-environments-configuration#wrapper-scripts) 中的电子邮件构建,当该变量未设置时省略。如果您的镜像已设置 `core.hooksPath`,且运行器未使用 [Anthropic 管理的 git](#use-the-anthropic-git-proxy),运行器会保留您的设置,跳过安装这些钩子,并打印 `[runner:git]` 警告。

142 157 

143提交签名需要 git 2.34 或更高版本;运行器在启动时检查并在您的 git 较旧时以错误退出。此标志不配置推送凭证,您仍然在镜像中提供。158提交签名需要 git 2.34 或更高版本;运行器在启动时检查并在您的 git 较旧时以错误退出。此标志不配置推送凭证,您仍然在镜像中提供。

144 159 

145在 v2.1.280 或更高版本的运行器上,您从 `checkout` 或 `post-session` 生命周期钩子中进行的提交也会以会话身份签名,但不带 `Co-authored-by:` 尾注。[生命周期钩子内的 Git 配置](/docs/zh-CN/self-hosted-environments-configuration#git-configuration-inside-lifecycle-hooks)介绍了运行器在这些钩子内固定的 git 设置。160在 v2.1.280 或更高版本的运行器上,您从 `checkout` 或 `post-session` 生命周期钩子中进行的提交也会以会话身份签名,但不带 `Co-authored-by:` 尾注。[生命周期钩子内的 Git 配置](/docs/zh-CN/self-hosted-environments-configuration#git-configuration-inside-lifecycle-hooks)介绍了运行器在这些钩子内固定的 git 设置。

146 161 

162无论是否使用 `--configure-git`,Claude Code 都会指示 Claude 在其提交信息末尾添加 `Claude-Session: <url>` 尾注,并在其 Pull Request 描述末尾添加会话的 URL。要省略两者,请在运行器主机的 [`~/.claude/settings.json`](/docs/zh-CN/self-hosted-environments-configuration#how-each-session’s-config-is-assembled) 中将 [`attribution.sessionUrl`](/docs/zh-CN/settings-reference#attribution-sessionurl) 设置为 `false`,然后重新启动运行器。

163 

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

148 在镜像中提供 git 配置165 在镜像中提供 git 配置

149</h3>166</h3>


186 使用 Anthropic git 代理203 使用 Anthropic git 代理

187</h3>204</h3>

188 205 

189使用 `--use-anthropic-git-proxy` 启动运行器,或设置 `CLAUDE_RUNNER_USE_GIT_PROXY=1`,使其通过 Anthropic 的 git 代理克隆,使用会话自己的短期令牌进行身份验证。对于普通用户会话,代理使用为会话创建者存储的 GitHub 或 GitHub Enterprise OAuth 令牌;对于机器人和代理会话,它使用您组织的 GitHub App 安装令牌。无论哪种方式,运行器镜像根本不需要 git 凭证:没有 SSH 密钥、没有凭证助手、没有 `.netrc`。这是 Anthropic 托管环境使用的相同身份验证路径。206使用 Anthropic git 代理(也称为 Anthropic 管理的 git)时,运行器镜像无需为会话本身提供 SSH 密钥、凭据助手、`.netrc` 或其他 git 凭据。相反,运行器请求 Anthropic 为其会话提供 git 服务。对于 Anthropic 提供服务的用户会话,运行器的克隆以及会话自身的获取和推送都经过 Anthropic,Anthropic 使用为会话创建者存储的 GitHub OAuth 令牌。[Anthropic 如何为会话提供 git 服务](#how-anthropic-serves-git-for-a-session)介绍了机器人和 Agent 会话的情况。

207 

208除非您[启用它](#turn-the-anthropic-git-proxy-on),否则 git 代理处于关闭状态。使用自身凭据访问您的 git 主机的运行器不需要它,其 git 可与任何 git 主机配合使用。

209 

210作为交换,git 代理会限制运行器支持的内容,并改变运行器的需求:

211 

212* **仅限 github.com**:只有当会话的所有仓库都在 github.com 上时,Anthropic 才会为其提供服务,并且 git 代理尚不支持 GitHub Enterprise Server。在启用 git 代理的运行器上,包含其他 git 主机上仓库的会话[无法启动](#when-anthropic-doesnt-serve-a-session)。

213* **仅限会话仓库的凭据**:Anthropic 只为属于会话的仓库提供 git 凭据,而不为同一 git 主机上的其他仓库提供。私有子模块、包管理器通过 git 获取的依赖,或位于另一个仓库中的插件市场,都不会从 Anthropic 获得凭据。请让创建会话的人员在创建会话时[添加会话所需的每个仓库](/docs/zh-CN/web-quickstart#start-a-task)。

214* **仅限分支推送**:删除分支的推送会失败,推送到任何其他类型的引用(例如标签)也会失败。有关推送可以更新哪些分支,请参阅 [GitHub 代理](/docs/zh-CN/cloud-environments#github-proxy)。

215* **已连接的 GitHub 账户**:创建用户会话的人必须已在 claude.ai 上连接 GitHub,否则会话[无法启动](#creator-has-no-github-connection)。

216* **`--capacity 1`**:git 代理要求每个运行器进程只有一个会话,因此请运行更多副本以获得并行性。[启用 Anthropic git 代理](#turn-the-anthropic-git-proxy-on)列出了各项要求。

217* **替换全局 git 配置**:运行器会[删除并替换其运行用户的全局 git 配置](#git-proxy-replaces-global-git-config)。请以专用用户身份或在容器中运行它。

218* **主机推送使用主机凭据**:运行器的 [`--push-outcome-on-release`](/docs/zh-CN/self-hosted-environments-reference#runner-cli-flags) 推送以及您的 [`post-session` 钩子](/docs/zh-CN/self-hosted-environments-configuration#post-session)进行的任何推送,仍使用运行器主机自身的 git 凭据及其[到 `github.com` 的网络路径](#github-com-egress-with-the-anthropic-git-proxy)。有关这些凭据,请参阅[在镜像中提供 git 配置](#ship-git-config-in-your-image)。

219* **按会话决定**:Anthropic 会针对运行器上的每个会话决定是否为其提供 git 服务,未获服务的会话将无法启动。[在启用 git 代理的运行器上会话无法启动时](#when-anthropic-doesnt-serve-a-session)介绍了原因。

220 

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

222 

223<Warning>

224 设置 `--use-anthropic-git-proxy` 后,运行器会删除并替换其运行用户的全局 git 配置,且不保留备份。它会在启动时以及每个会话之前执行此操作。您保存在其中的登录或凭据助手将会丢失。[`--configure-git`](#let-the-runner-configure-git) 写入的设置会保留。请以专用用户身份或在容器中运行运行器,切勿以您自己的用户身份运行。

225</Warning>

226 

227将非机密的 git 设置(例如身份和 `safe.directory`)保存在系统 git 配置中。

228 

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

230 启用 Anthropic git 代理

231</h4>

232 

233在使用 `--use-anthropic-git-proxy` 启动运行器之前,请确认运行器主机满足以下每项要求。当容量或 git 要求未满足时,运行器会拒绝启动:

190 234 

191代理需要 `--capacity 1`,因为代理 URL 是按会话的,以及 git 2.32 或更高版本,因为较旧的 git 忽略代理用来隔离会话的配置机制。如果任一要求未满足,运行器拒绝启动。因为代理从 Anthropic 端获取,您的 git 主机必须可从 Anthropic 基础设施到达,与 Anthropic 托管会话相同的要求;对于仅在您的网络内可路由的 git 主机,改用 [`checkout` 生命周期钩子](/docs/zh-CN/self-hosted-environments-configuration#checkout)。每个运行器进程一次处理一个会话,因此运行更多副本以获得并行性。启用代理后,`--git-host-rewrite` 和 `--git-ssh-rewrite` 无效:代理 URL 指向 `api.anthropic.com`,而不是您的 git 主机。235* **Claude Code v2.1.267 或更高版本**:较早的版本接受该标志,但不会报告请求 Anthropic 提供 git 服务,也不会打印 `Registering as opted in` 行,因此 Anthropic 不会为其会话提供服务。

236* **`--capacity 1`(默认值)**:每个运行器进程一次处理一个会话,因此请运行更多副本以获得并行性。

237* **Git 2.32 或更高版本**:较旧的 git 会忽略运行器为 git 代理设置的按会话 git 配置。

192 238 

193<Warning>239<Warning>

194 本页上的 [Kubernetes](#kubernetes) 和 [Docker Compose](#docker-compose) 配方使用 `--capacity 4`。如果您在不将容量更改为 `1` 的情况下向其中一个添加 `--use-anthropic-git-proxy` 或 `CLAUDE_RUNNER_USE_GIT_PROXY=1`,每次您的编排器重新启动它时,运行器都会在启动时退出。设置 `--capacity 1` 并运行更多副本以获得并行性。[当运行器退出](#when-the-runner-exits)显示运行器打印的行。240 本页上的 [Kubernetes](#kubernetes) 和 [Docker Compose](#docker-compose) 配方使用 `--capacity 4`。如果您在不将容量更改为 `1` 的情况下向其中一个添加 `--use-anthropic-git-proxy` 或 `CLAUDE_RUNNER_USE_GIT_PROXY=1`,每次您的编排器重新启动它时,运行器都会在启动时退出。设置 `--capacity 1` 并运行更多副本以获得并行性。[当运行器退出](#when-the-runner-exits)显示运行器打印的行。

195</Warning>241</Warning>

196 242 

197运行器还在注册时向 Anthropic 报告选择加入,在启动时打印 `Registering as opted in to Anthropic-managed git (--use-anthropic-git-proxy)`。报告选择加入需要 Claude Code v2.1.267 或更高版本,较早的版本接受该标志而不报告它或打印该行。选择加入运行器上的每个会话然后使用 Anthropic 管理的 git 或按会话代理 URL。当会话使用按会话代理 URL 时,运行器记录一行 `[runner:warn]` 说明这一点。243要启用 git 代理,请将 `--use-anthropic-git-proxy` 添加到运行器的命令中,或在运行器的环境中设置 `CLAUDE_RUNNER_USE_GIT_PROXY=1`。在运行器主机的 shell 中运行以下命令,即可启动启用了 git 代理的[快速入门](/docs/zh-CN/self-hosted-environments-quickstart#set-up-manually)运行器:

244 

245```bash theme={null}

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

247```

248 

249启动时,运行器会打印 `Registering as opted in to Anthropic-managed git (--use-anthropic-git-proxy)`。随后 Anthropic 会针对该运行器上的每个会话决定是否为其提供 git 服务。对于每个获得服务的会话,运行器会记录一行包含 `governed git ACTIVE` 的 `[runner:session]` 日志。如果会话反而无法启动,请参阅[在启用 git 代理的运行器上会话无法启动时](#when-anthropic-doesnt-serve-a-session)。

250 

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

252 Anthropic 如何为会话提供 git 服务

253</h4>

254 

255对于 Anthropic 提供服务的会话,运行器的克隆以及会话自身的获取和推送都经过 Anthropic,并使用会话自己的短期令牌进行身份验证:

256 

257* **用户会话**:Anthropic 使用为会话创建者存储的 GitHub OAuth 令牌。

258* **机器人和 Agent 会话**:Anthropic 使用您组织的 GitHub App 安装令牌。

259* **URL 重写**:`--git-host-rewrite` 和 `--git-ssh-rewrite` 对 git 代理提供服务的仓库无效。

260 

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

262 在启用 git 代理的运行器上会话无法启动时

263</h4>

264 

265在使用 `--use-anthropic-git-proxy` 启动的运行器上,当 Anthropic 不为会话提供 git 服务时,会话将无法启动。请在运行器的日志中查找提及包含 `/git_proxy/` 的 `api.anthropic.com` 地址的 git 错误。

266 

267对于每个会话,Claude Code v2.1.267 或更高版本的运行器还会记录以下两者之一:当 Anthropic 为会话提供 git 服务时,记录一行包含 `governed git ACTIVE` 的 `[runner:session]` 日志;当不提供服务时,记录一行包含 `the server withheld Anthropic-managed git for this session` 的 `[runner:warn]` 日志。在以下情况中找到您看到的行:

268 

269* **既没有 `governed git ACTIVE` 也没有 `withheld` 行**:早于 Claude Code v2.1.267 的运行器不会记录这两行中的任何一行,Anthropic 也不会为其会话提供服务。请按照[固定版本](#pin-the-version)将运行器更新到 v2.1.267 或更高版本。

270* **`withheld` 行**:Anthropic 未为该会话提供服务。之前可以正常使用 git 代理的运行器,即使您这边没有任何更改,也可能以这种方式失败。

271 * **某个仓库不在 github.com 上**:只要会话中有一个仓库位于其他 git 主机(例如 GitHub Enterprise Server)上,该会话就不会获得服务,其 github.com 仓库也不例外。请为该环境的运行器[关闭 Anthropic git 代理](#turn-the-anthropic-git-proxy-off)。

272 * **所有仓库都在 github.com 上**:请将此失败连同 `withheld` 行中的会话 ID 一起报告给[您的 Anthropic 客户团队](#report-an-issue)。Anthropic 会在其一端记录原因。

273* **包含 `remote: access denied by the git proxy` 的行**:Anthropic 提供服务的会话仍可能被拒绝,例如当组织策略拒绝该会话的 git 访问,或该会话未获得该仓库的授权时。此时运行器的日志会显示一行包含 `remote: access denied by the git proxy` 的内容,该行的其余部分说明了原因。

274* <span id="creator-has-no-github-connection" />**`GitHub authentication required`**:当会话的创建者在 claude.ai 上没有可用的 GitHub 连接时会出现此情况。会话的克隆失败,git 错误显示为 `GitHub authentication required. Please reconnect your GitHub account.` 请让该用户在其 claude.ai 设置中连接或重新连接 GitHub。

275 

276修复原因后,请重新启动失败的会话。

277 

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

279 关闭 Anthropic git 代理

280</h4>

281 

282如果某个环境中的会话使用 github.com 以外的 git 主机(例如 GitHub Enterprise Server)上的仓库,请为该环境的运行器关闭 `--use-anthropic-git-proxy`。

283 

284<Steps>

285 <Step title="移除标志">

286 从运行器的命令中移除 `--use-anthropic-git-proxy`。如果您在运行器的环境(例如 pod spec 或 Compose 文件)中设置了 `CLAUDE_RUNNER_USE_GIT_PROXY`,请在那里将其移除。在 shell 中,取消设置它:

287 

288 ```bash theme={null}

289 unset CLAUDE_RUNNER_USE_GIT_PROXY

290 ```

291 </Step>

292 

293 <Step title="为运行器提供 git 凭据">

294 为运行器会话使用的每个 git 主机(包括 github.com)提供无需提示即可工作的凭据。运行器用户全局 git 配置中的任何凭据都已丢失,因为在设置 `--use-anthropic-git-proxy` 期间运行器删除了该配置。请[在镜像中提供凭据](#ship-git-config-in-your-image)或使用 [`checkout` 生命周期钩子](/docs/zh-CN/self-hosted-environments-configuration#checkout)。

295 </Step>

296 

297 <Step title="打开网络路径">

298 允许运行器通过 443 或 22 端口访问运行器会话使用的每个 git 主机。请参阅[网络要求](#network-requirements)中的 git 主机行。

299 </Step>

300 

301 <Step title="重新启动运行器">

302 重新启动运行器,使其在不使用 git 代理的情况下注册。然后重新启动每个失败的会话。

303 </Step>

304</Steps>

198 305 

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

200 不使用 GitHub CLI 访问 GitHub API307 不使用 GitHub CLI 访问 GitHub API


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

267FROM debian:bookworm-slim374FROM debian:bookworm-slim

268ARG CLAUDE_CODE_VERSION375ARG CLAUDE_CODE_VERSION

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

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

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

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


382kubectl create namespace claude-runners489kubectl create namespace claude-runners

383```490```

384 491 

385从保存您在管理 UI 的[**复制环境密钥**步骤](/docs/zh-CN/self-hosted-environments-quickstart#set-up-an-environment-and-runner)中复制的值的本地文件创建支持 Secret,以便密钥永远不会出现在您的 shell 历史记录中。运行 `(umask 077 && cat > ./environment-secret)`,粘贴密钥,按 Enter,然后按 Ctrl-D。然后创建 Secret 并删除文件:492从保存您在管理 UI 的 [**Copy environment key** 步骤](/docs/zh-CN/self-hosted-environments-quickstart#set-up-manually)中复制的值的本地文件创建支持 Secret,以便密钥永远不会出现在您的 shell 历史记录中。运行 `(umask 077 && cat > ./environment-secret)`,粘贴密钥,按 Enter,然后按 Ctrl-D。然后创建 Secret 并删除文件:

386 493 

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

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


500 重用预热的检出607 重用预热的检出

501</h2>608</h2>

502 609 

503对于大型仓库,克隆可能会主导会话启动。在 `--capacity 1` 且没有 [`checkout` hook](/docs/zh-CN/self-hosted-environments-configuration#checkout) 的情况下,运行器在 `<base-dir>/<repo-owner>/<repo>` 处为每个仓库保持一个规范克隆,并在会话间重用它:它获取请求的引用,分离 `HEAD`,并硬重置到该引用,当变化不大时这几乎是瞬间完成的。要跳过冷克隆,可以通过以下两种方式之一提供克隆:610对于大型仓库,克隆可能会主导会话启动。要跳过冷克隆,请在运行器保存其自身克隆的路径处自行提供一个克隆。在没有 [`checkout` hook](/docs/zh-CN/self-hosted-environments-configuration#checkout) 的情况下,运行器在 `<base-dir>/<repo-owner>/<repo>` 处为每个仓库保持一个规范克隆,并在会话间重用它:

611 

612* **在 `--capacity 1` 时**:运行器获取请求的引用,分离 `HEAD`,并硬重置到该引用,当变化不大时这几乎是瞬间完成的。

613* **在 `--capacity` 大于 1 时**:运行器获取到该克隆中,然后从中为每个会话检出单独的 worktree。预热的克隆可以节省下载,但不能节省检出。

614 

615在镜像中或持久卷上提供克隆:

504 616 

505* **在镜像中克隆**:在该路径处将克隆构建到运行器镜像中。每个新容器随后都会以预热克隆启动,而无需重用磁盘。617* **在镜像中克隆**:在该路径处将克隆构建到运行器镜像中。每个新容器随后都会以预热克隆启动,而无需重用磁盘。

506* **在持久卷上克隆**:在使用 [`--lock-to-account`](/docs/zh-CN/self-hosted-environments-reference#runner-cli-flags) 预锁定到一个用户账户的运行器上,将 `--base-dir` 指向持久卷,这样磁盘只为该账户服务。预锁定的运行器永远不会接收 Claude Tag 频道会话,因此此选项不适用于为其服务的运行器。618* **在持久卷上克隆**:在使用 [`--lock-to-account`](/docs/zh-CN/self-hosted-environments-reference#runner-cli-flags) 预锁定到一个用户账户的运行器上,将 `--base-dir` 指向持久卷,这样磁盘只为该账户服务。预锁定的运行器永远不会接收 Claude Tag 频道会话,因此此选项不适用于为其服务的运行器。


508重用路径的保证和不保证的内容:620重用路径的保证和不保证的内容:

509 621 

510* **任何克隆形状都可以工作**:路径处的完整、浅层或单分支克隆按原样使用。运行器在获取到现有克隆时永远不会传递 `--depth`,因此完整的预热保持其完整历史,浅层克隆保持浅层。`CLAUDE_RUNNER_FETCH_DEPTH`(`full`、`0` 或一个数字;默认 50)仅控制当尚不存在克隆时运行器进行的冷克隆。622* **任何克隆形状都可以工作**:路径处的完整、浅层或单分支克隆按原样使用。运行器在获取到现有克隆时永远不会传递 `--depth`,因此完整的预热保持其完整历史,浅层克隆保持浅层。`CLAUDE_RUNNER_FETCH_DEPTH`(`full`、`0` 或一个数字;默认 50)仅控制当尚不存在克隆时运行器进行的冷克隆。

511* **跟踪的更改重置,未跟踪的文件保留**:每个会话从硬重置开始,该重置会清除前一个会话的跟踪修改,但运行器永远不会运行 `git clean`,因此来自锁定所有者早期会话的未跟踪文件保留在树中。623* **跟踪的更改重置,未跟踪的文件保留**:在 `--capacity 1` 时,每个会话从硬重置开始,该重置会清除前一个会话的跟踪修改,但运行器永远不会运行 `git clean`,因此来自锁定所有者早期会话的未跟踪文件保留在树中。

512* **按会话目录也会保留**:在检出旁边,运行器在 `<base-dir>/_sessions/` 下为其运行的每个会话创建按会话条目。会话的 Claude 配置目录保存对话记录的本地副本。在其旁边是会话的上传文件,当会话有任何文件时。会话目录也在那里:它保存会话运行时的任何按会话工作树和 `checkout` hook 检出,以及 Claude 在其中写入的任何其他内容。624* **按会话目录也会保留**:在检出旁边,运行器在 `<base-dir>/_sessions/` 下为其运行的每个会话创建按会话条目。会话的 Claude 配置目录保存对话记录的本地副本。在其旁边是会话的上传文件,当会话有任何文件时。会话目录也在那里:它保存会话运行时的任何按会话工作树和 `checkout` hook 检出,以及 Claude 在其中写入的任何其他内容。

513 625 

514 默认情况下,运行器在会话结束时将这些保留在原地,因此在持久化的磁盘上它们会累积。每个会话都以运行器自己的用户身份运行,因此该磁盘服务的任何后续会话都可以读取它们。如果保持持久的 `--base-dir`,请为该增长调整卷的大小。同样适用于在同一文件系统上重启运行器的任何设置,包括 [Docker Compose 配方](#docker-compose)。626 默认情况下,运行器在会话结束时将这些保留在原地,因此在持久化的磁盘上它们会累积。每个会话都以运行器自己的用户身份运行,因此该磁盘服务的任何后续会话都可以读取它们。如果保持持久的 `--base-dir`,请为该增长调整卷的大小。同样适用于在同一文件系统上重启运行器的任何设置,包括 [Docker Compose 配方](#docker-compose)。


522 634 

523每个会话的子 Claude Code 进程运行运行器自己的二进制文件,运行器在它生成的会话内关闭自动更新,所以每个会话运行您在主机上安装或构建到镜像中的版本。主机级更新在运行器下次启动时生效。635每个会话的子 Claude Code 进程运行运行器自己的二进制文件,运行器在它生成的会话内关闭自动更新,所以每个会话运行您在主机上安装或构建到镜像中的版本。主机级更新在运行器下次启动时生效。

524 636 

525您的会话使用的模型可能需要比它们运行的 Claude Code 版本更新的版本。服务器随后会以 [Claude Code does not support this model](/docs/zh-CN/errors#claude-code-does-not-support-this-model) 拒绝对该模型的请求。在您固定版本之前,请检查[模型需要的 Claude Code 版本](/docs/zh-CN/model-config#available-models),以了解您的会话使用的每个模型。637选择您的会话运行哪个版本以及何时更改:

526 638 

639* **在固定版本之前**:针对您的会话使用的每个模型,检查[模型需要的 Claude Code 版本](/docs/zh-CN/model-config#available-models)。如果某个模型需要比您的会话所运行版本更新的版本,服务器会以 [Claude Code does not support this model](/docs/zh-CN/errors#claude-code-does-not-support-this-model) 拒绝对该模型的请求。

527* **将队列保持在一个版本上**:使用固定版本构建镜像,或在裸主机上安装特定版本并[禁用自动更新](/docs/zh-CN/setup#disable-auto-updates)640* **将队列保持在一个版本上**:使用固定版本构建镜像,或在裸主机上安装特定版本并[禁用自动更新](/docs/zh-CN/setup#disable-auto-updates)

528* **升级**:安装较新版本或重建镜像,然后重启运行器641* **升级固定队列**:阅读您当前版本与要安装版本之间的 [changelog](/docs/en/changelog) 条目,然后安装较新版本或重建镜像,并重启运行器

642* **升级按需运行器**:阅读您当前版本与要安装版本之间的 [changelog](/docs/en/changelog) 条目,然后更改您的 [`spawn-runner` hook](/docs/zh-CN/self-hosted-environments-configuration#the-spawn-runner-hook) 启动的镜像。每个新运行器都会获得新版本。已经在运行的运行器(包括由 [`--min-idle`](/docs/zh-CN/self-hosted-environments-reference#orchestrator-cli-flags) 启动的备用运行器)会保持其版本,直到退出。不要重启它,因为它的工作指令是一次性的。

529* **插件**:插件市场也不自动更新;在运行器的环境中设置 `FORCE_AUTOUPDATE_PLUGINS=1` 以让插件自动更新,同时二进制保持固定643* **插件**:插件市场也不自动更新;在运行器的环境中设置 `FORCE_AUTOUPDATE_PLUGINS=1` 以让插件自动更新,同时二进制保持固定

530 644 

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


580</h3>694</h3>

581 695 

582* **恢复的会话丢失未推送的工作**:新的运行器会从其起始分支重新克隆仓库,因此会话未推送的工作会丢失。696* **恢复的会话丢失未推送的工作**:新的运行器会从其起始分支重新克隆仓库,因此会话未推送的工作会丢失。

583 * **要保留已提交的工作**:设置 [`--push-outcome-on-release`](/docs/zh-CN/self-hosted-environments-reference#runner-cli-flags)。运行器随后会在释放之前尽力推送会话的结果分支,恢复的会话将从这些提交开始。未提交的更改仍会丢失。697 * **要保留已提交的工作**:在环境中的每个运行器上设置 [`--push-outcome-on-release`](/docs/zh-CN/self-hosted-environments-reference#runner-cli-flags),因为未设置该标志的运行器会从起始分支恢复会话。设置了该标志的运行器会在释放之前尽力推送会话的结果分支,恢复的会话将从这些提交开始。推送使用运行器主机自身的 git 凭据,在使用 [Anthropic 托管 git](#use-the-anthropic-git-proxy) 的运行器上也是如此。未提交的更改仍会丢失。

698 * **使用 `checkout` hook 时**:通过 [`checkout` 生命周期 hook](/docs/zh-CN/self-hosted-environments-configuration#checkout) 检出的仓库不会被推送。请改为从 [`post-session` hook](/docs/zh-CN/self-hosted-environments-configuration#post-session) 对其进行快照。

584 * **启用该标志之前**:限制谁可以推送到源远程上的 `claude/*` refs。在恢复时,运行器会获取之前推送的分支,而不验证是谁推送的。699 * **启用该标志之前**:限制谁可以推送到源远程上的 `claude/*` refs。在恢复时,运行器会获取之前推送的分支,而不验证是谁推送的。

585* **会话中途添加的仓库可能无法克隆**:Claude 通过 HTTPS 使用 `git clone` 克隆它。在未启用 [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy) 的运行器上,如果主机上没有任何内容能够读取该仓库,克隆会因 git 身份验证错误而失败。如有可能,请在创建会话时选择会话所需的每个仓库。700* **会话中途添加的仓库可能无法克隆**:Claude 通过 HTTPS 使用 `git clone` 克隆它。在未启用 [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy) 的运行器上,如果主机上没有任何内容能够读取该仓库,克隆会因 git 身份验证错误而失败。如有可能,请在创建会话时选择会话所需的每个仓库。

586* **某些连接器不出现在自托管会话中**:您在 claude.ai Settings 中尚未连接的连接器不在自托管会话中列出,会话不会提示您连接它。首先在 Settings 中连接它,然后启动新会话。向已运行的会话添加连接器也不会使其工具对 Claude 可用;启动新会话以获取新添加的连接器。701* **某些连接器不出现在自托管会话中**:您在 claude.ai Settings 中尚未连接的连接器不在自托管会话中列出,会话不会提示您连接它。首先在 Settings 中连接它,然后启动新会话。向已运行的会话添加连接器也不会使其工具对 Claude 可用;启动新会话以获取新添加的连接器。


606* **运行器未出现在环境中**:确认主机可以通过 HTTPS 到达 `api.anthropic.com`,环境密钥是最新的,并且主机时钟与实际时间相差在五分钟以内;更大的时间偏差会导致身份验证失败。运行器在身份验证失败时会记录 `[runner:fatal]` 和拒绝原因。721* **运行器未出现在环境中**:确认主机可以通过 HTTPS 到达 `api.anthropic.com`,环境密钥是最新的,并且主机时钟与实际时间相差在五分钟以内;更大的时间偏差会导致身份验证失败。运行器在身份验证失败时会记录 `[runner:fatal]` 和拒绝原因。

607* **运行器在启动时退出,显示 `cannot create or write to base directory`**:运行器无法创建或写入 `--base-dir`,其默认值为 `/workspace`。修复目录的所有权或将 `--base-dir` 指向可写路径,如 [保持基础目录和容量在运行器之间相同](#keep-the-base-directory-and-capacity-identical-across-runners) 中所述。如果运行器改为记录 `[runner:fatal]` 说基础目录检查超时,则该目录位于挂起的 NFS 或 CSI 挂载上。检查挂载健康状况而不是权限。运行器在打开 `--log-file` 之前将这两个启动失败打印到 stderr,因此请在终端或您的平台的容器日志中查找它们,而不是日志文件。在 v2.1.225 之前,运行器在启动时不检查基础目录,此错误配置在拾取后失败会话。722* **运行器在启动时退出,显示 `cannot create or write to base directory`**:运行器无法创建或写入 `--base-dir`,其默认值为 `/workspace`。修复目录的所有权或将 `--base-dir` 指向可写路径,如 [保持基础目录和容量在运行器之间相同](#keep-the-base-directory-and-capacity-identical-across-runners) 中所述。如果运行器改为记录 `[runner:fatal]` 说基础目录检查超时,则该目录位于挂起的 NFS 或 CSI 挂载上。检查挂载健康状况而不是权限。运行器在打开 `--log-file` 之前将这两个启动失败打印到 stderr,因此请在终端或您的平台的容器日志中查找它们,而不是日志文件。在 v2.1.225 之前,运行器在启动时不检查基础目录,此错误配置在拾取后失败会话。

608* **会话保持排队**:每个在线运行器可能被锁定到不同的所有者。检查每个运行器的 `claude_code_self_hosted_runner_locked_account` [指标](/docs/zh-CN/self-hosted-environments-reference#prometheus-metrics) 或其 `[runner:health]` 日志行的 `locked_account` 字段,以查看谁持有它。两者仅在运行器被颁发携带 `act.email` 声明的会话令牌后才显示所有者的电子邮件,Claude Tag 代理的会话永远不会这样做。没有该声明,运行器不发出 `locked_account` 系列,并记录 `locked_account=yes`,这告诉您运行器被锁定但不知道是哪个所有者。添加副本,或等待现有运行器耗尽并重新启动。如果环境使用按需运行器,请改为检查编排器;请参阅 [按需运行器](/docs/zh-CN/self-hosted-environments-configuration#on-demand-runners)。723* **会话保持排队**:每个在线运行器可能被锁定到不同的所有者。检查每个运行器的 `claude_code_self_hosted_runner_locked_account` [指标](/docs/zh-CN/self-hosted-environments-reference#prometheus-metrics) 或其 `[runner:health]` 日志行的 `locked_account` 字段,以查看谁持有它。两者仅在运行器被颁发携带 `act.email` 声明的会话令牌后才显示所有者的电子邮件,Claude Tag 代理的会话永远不会这样做。没有该声明,运行器不发出 `locked_account` 系列,并记录 `locked_account=yes`,这告诉您运行器被锁定但不知道是哪个所有者。添加副本,或等待现有运行器耗尽并重新启动。如果环境使用按需运行器,请改为检查编排器;请参阅 [按需运行器](/docs/zh-CN/self-hosted-environments-configuration#on-demand-runners)。

609* **会话在拾取后立即失败**:在 claude.ai/code 中打开会话以查看错误。最常见的原因是运行器镜像中缺少 [git 凭证](#configure-git) 和未安装的构建工具。不可写的基础目录会在启动时停止运行器,而不是失败会话。请参阅此列表中的 **运行器在启动时退出,显示 `cannot create or write to base directory`** 条目。724* **会话在拾取后立即失败**:在 claude.ai/code 中打开会话以查看错误。最常见的原因是运行器镜像中缺少 [git 凭据](#configure-git) 和未安装的构建工具。对于使用 `--use-anthropic-git-proxy` 启动的运行器,请参阅 [当会话在使用 git 代理的运行器上无法启动时](#when-anthropic-doesnt-serve-a-session)。不可写的基础目录会在启动时停止运行器,而不是失败会话。请参阅此列表中的 **运行器在启动时退出,显示 `cannot create or write to base directory`** 条目。

725* **在设置了 `--use-anthropic-git-proxy` 的运行器上会话无法启动**:在运行器的日志中查找 `access denied by the git proxy`,或查找指明包含 `/git_proxy/` 的 `api.anthropic.com` 地址的 git 错误。要判断 Anthropic 是否提供了该会话并修复原因,请参阅 [当会话在使用 git 代理的运行器上无法启动时](#when-anthropic-doesnt-serve-a-session)。

610* **会话无法通过身份验证出口代理到达网络**:当您使用 [`--proxy-authorization-command` 或 `--proxy-authorization-file`](#authenticate-to-an-egress-proxy) 设置的源失败、在 30 秒后超时或产生空值时,运行器以 `502 Bad Gateway` 应答该连接并记录原因。运行器在该日志中编辑命令的 stderr,并且永远不会记录标头值。使用 `--proxy-authorization-command` 时,在主机上自己运行该命令以确认它在 stdout 上打印整个标头值。如果运行器改为在启动时退出,显示 `could not start the proxy-authorization listener`,则它无法打开其环回监听器。726* **会话无法通过身份验证出口代理到达网络**:当您使用 [`--proxy-authorization-command` 或 `--proxy-authorization-file`](#authenticate-to-an-egress-proxy) 设置的源失败、在 30 秒后超时或产生空值时,运行器以 `502 Bad Gateway` 应答该连接并记录原因。运行器在该日志中编辑命令的 stderr,并且永远不会记录标头值。使用 `--proxy-authorization-command` 时,在主机上自己运行该命令以确认它在 stdout 上打印整个标头值。如果运行器改为在启动时退出,显示 `could not start the proxy-authorization listener`,则它无法打开其环回监听器。

611* **运行器记录包含 `rejecting the malformed poll response` 的 `Poll failed` 行**:运行器收到的工作轮询响应的正文不是队列的预期 JSON,最常见的原因是运行器和 `api.anthropic.com` 之间的某些内容(例如拦截代理或强制门户)用自己的页面进行了应答。运行器拒绝响应,在 `claude_code_self_hosted_runner_poll_errors_total` [指标](/docs/zh-CN/self-hosted-environments-reference#prometheus-metrics) 的 `transport` 类型下计数,并按 [会话生命周期](/docs/zh-CN/self-hosted-environments#session-lifecycle) 中描述的失败轮询计划重试。运行器继续为其实时会话提供服务。配置代理以将来自 `api.anthropic.com` 的响应原封不动地传递。在 v2.1.246 之前,运行器将这样的响应读取为空工作队列,这可能会结束其实时会话或使其退出。727* **运行器记录包含 `rejecting the malformed poll response` 的 `Poll failed` 行**:运行器收到的工作轮询响应的正文不是队列的预期 JSON,最常见的原因是运行器和 `api.anthropic.com` 之间的某些内容(例如拦截代理或强制门户)用自己的页面进行了应答。运行器拒绝响应,在 `claude_code_self_hosted_runner_poll_errors_total` [指标](/docs/zh-CN/self-hosted-environments-reference#prometheus-metrics) 的 `transport` 类型下计数,并按 [会话生命周期](/docs/zh-CN/self-hosted-environments#session-lifecycle) 中描述的失败轮询计划重试。运行器继续为其实时会话提供服务。配置代理以将来自 `api.anthropic.com` 的响应原封不动地传递。在 v2.1.246 之前,运行器将这样的响应读取为空工作队列,这可能会结束其实时会话或使其退出。

612* **会话的分支在远程上不再存在**:对于会话仅从中读取的 git 源,运行器跳过该源并继续处理其余源。对于会话推送结果的源,删除的分支(通常是因为它被合并并自动删除)会导致会话失败,并显示一个错误,命名存储库和分支,并要求您恢复分支并重试。当跳过会导致它完全没有存储库时,运行器会以相同的错误失败会话。在 v2.1.228 之前,这样的会话在空目录中启动。728* **会话的分支在远程上不再存在**:对于会话仅从中读取的 git 源,运行器跳过该源并继续处理其余源。对于会话推送结果的源,删除的分支(通常是因为它被合并并自动删除)会导致会话失败,并显示一个错误,命名存储库和分支,并要求您恢复分支并重试。当跳过会导致它完全没有存储库时,运行器会以相同的错误失败会话。在 v2.1.228 之前,这样的会话在空目录中启动。


616 732 

617 访问检查在每次会话在运行器上启动时再次运行,因此一旦运行器的 git 身份具有读取访问权限,下一次启动就会克隆存储库。在 v2.1.274 之前,这些拒绝中的每一个都导致会话启动失败。733 访问检查在每次会话在运行器上启动时再次运行,因此一旦运行器的 git 身份具有读取访问权限,下一次启动就会克隆存储库。在 v2.1.274 之前,这些拒绝中的每一个都导致会话启动失败。

618* **会话需要数分钟才能启动**:初始克隆通常占主导地位。观察 `claude_code_self_hosted_runner_session_init_duration_seconds` [指标](/docs/zh-CN/self-hosted-environments-reference#prometheus-metrics) 以确认,并使用 [预热检出](#reuse-a-pre-warmed-checkout) 或更小的 `CLAUDE_RUNNER_FETCH_DEPTH` 减少克隆。734* **会话需要数分钟才能启动**:初始克隆通常占主导地位。观察 `claude_code_self_hosted_runner_session_init_duration_seconds` [指标](/docs/zh-CN/self-hosted-environments-reference#prometheus-metrics) 以确认,并使用 [预热检出](#reuse-a-pre-warmed-checkout) 或更小的 `CLAUDE_RUNNER_FETCH_DEPTH` 减少克隆。

619* **轮次以 401 失败**:每个会话使用运行器从 Anthropic 获取并通过会话的 stdin 轮换的短期 [`CLAUDE_CODE_OAUTH_TOKEN`](/docs/zh-CN/self-hosted-environments-configuration#wrapper-scripts) 对模型调用进行身份验证。当轮次以来自模型 API 的 401 或 403 结束时,运行器获取新令牌并将其传递给会话。失败的轮次不会重试。735* **轮次以 401 失败**:当轮次以来自 Anthropic API 的 401 或 403 结束时,运行器从 Anthropic 获取新的 [`CLAUDE_CODE_OAUTH_TOKEN`](/docs/zh-CN/self-hosted-environments-configuration#wrapper-scripts) 并将其传递给会话。失败的轮次不会重试。此令牌是短期的,运行器通过会话的 stdin 轮换它。

620 736 

621 当获取失败时,运行器记录一条 `inference_token refresh failed` 行,说明何时重试,并在会话运行期间继续重试。737 当获取失败时,运行器记录一条 `inference_token refresh failed` 行,说明何时重试,并在会话运行期间继续重试。

622 738 


637 753 

638* **正常退出**:运行器完成了其会话并耗尽,达到了其退休时间,或被告知停止。重新启动它以便环境再次具有容量。[运行器生命周期](/docs/zh-CN/self-hosted-environments#runner-lifecycle) 描述了这些退出。754* **正常退出**:运行器完成了其会话并耗尽,达到了其退休时间,或被告知停止。重新启动它以便环境再次具有容量。[运行器生命周期](/docs/zh-CN/self-hosted-environments#runner-lifecycle) 描述了这些退出。

639* **启动失败**:运行器无法使用给定的配置或主机启动,因此它在启动后几秒钟退出,并且每次重新启动时都以相同的方式退出。更快地重新启动它没有帮助。有人需要阅读其输出并修复原因。755* **启动失败**:运行器无法使用给定的配置或主机启动,因此它在启动后几秒钟退出,并且每次重新启动时都以相同的方式退出。更快地重新启动它没有帮助。有人需要阅读其输出并修复原因。

756* **失去联系**:无法连接 Anthropic 的时间超过其 [租约](/docs/zh-CN/self-hosted-environments#session-lifecycle) 的运行器(例如在其主机休眠期间)可能会被从环境中移除。被移除的运行器重新连接时会退出。其日志可能显示一条包含 `runner record gone server-side` 的 `[runner:fatal]` 行,或者在较长时间的中断之后显示 [`poll auth failed`](/docs/zh-CN/self-hosted-environments-quickstart#set-up-an-environment-and-runner)。运行器不会自行重新注册,因此请重新启动它。

640 757 

641配置您的监督程序在运行器退出时重新启动它,当运行器在启动后立即保持退出时等待更长时间,并在这种情况持续发生时告知某人。758配置您的监督程序在运行器退出时重新启动它,当运行器在启动后立即保持退出时等待更长时间,并在这种情况持续发生时告知某人。

642 759 

Details

52 验证令牌52 验证令牌

53</h2>53</h2>

54 54 

55验证在两个地方之一运行。网络上的服务根据 Anthropic 发布的密钥对令牌进行加密验证,会话内的包装脚本可以改为使用运行程序二进制文件的内置解码器。55验证可以在两个位置之一进行。您网络中的服务可以使用 Anthropic 发布的密钥对令牌进行加密验证,而会话内的包装脚本则可以改用运行器二进制文件内置的解码器。

56 56 

57<h3 id="verify-the-token-from-your-service">57<h3 id="verify-the-token-from-your-service">

58 从您的服务验证令牌58 从您的服务验证令牌

59</h3>59</h3>

60 60 

61Anthropic 在公开的、未经身份验证的端点发布验证密钥:61Anthropic 在一个公开、无需身份验证的端点上发布验证密钥:

62 62 

63```text theme={null}63```text theme={null}

64https://api.anthropic.com/v1/code/.well-known/jwks.json64https://api.anthropic.com/v1/code/.well-known/jwks.json

65```65```

66 66 

67响应是标准的 [JSON Web Key Set](https://www.rfc-editor.org/rfc/rfc7517)。Anthropic 定期轮换签名密钥,轮换前的密钥在集合中保留足够长的时间,以便它们签名的令牌继续验证,因此不要固定单个密钥。端点设置 `Cache-Control: public, max-age=300`,因此缓存密钥集并每五分钟重新获取一次是安全的。67响应是标准的 [JSON Web Key Set](https://www.rfc-editor.org/rfc/rfc7517)。Anthropic 会定期轮换签名密钥,轮换前的密钥会在密钥集中保留足够长的时间,使其签发的令牌仍能通过验证,因此请勿固定使用单个密钥。该端点设置了 `Cache-Control: public, max-age=300`,因此缓存密钥集并每五分钟重新获取一次是安全的。

68 68 

69根据以下检查验证每个传入令牌:69请按以下检查项验证每个传入的令牌:

70 70 

71<Steps>71<Steps>

72 <Step title="检查前缀">72 <Step title="检查前缀">

73 如果值不以 `sk-ant-cc-` 开头,则拒绝该值,然后删除该前缀。其余部分是标准的紧凑 JWT。73 如果值不以 `sk-ant-cc-` 开头,则拒绝该值,否则移除该前缀。剩余部分是一个标准的紧凑格式 JWT。

74 </Step>74 </Step>

75 75 

76 <Step title="验证签名">76 <Step title="验证签名">

77 获取 JWKS,选择 `kid` 与令牌头部匹配的密钥,并验证 `ES256` 签名。拒绝 `alg` 头部不是 `ES256` 的令牌。如果令牌到达时带有缓存密钥集中没有的 `kid`,在拒绝之前重新获取 JWKS 一次:轮换后,新令牌使用缓存集还没有的密钥进行签名。77 获取 JWKS,选择 `kid` 与令牌头部匹配的密钥,并验证 `ES256` 签名。拒绝 `alg` 头部不是 `ES256` 的令牌。如果传入令牌的 `kid` 不在您缓存的密钥集中,请在拒绝之前重新获取一次 JWKS:密钥轮换后,新令牌会使用您缓存的密钥集中尚未包含的密钥进行签名。

78 </Step>78 </Step>

79 79 

80 <Step title="验证发行者">80 <Step title="验证签发者">

81 如果 `iss` 不完全是 `ccr`,则拒绝令牌。81 如果 `iss` 不完全等于 `ccr`,则拒绝该令牌。

82 </Step>82 </Step>

83 83 

84 <Step title="根据您的环境验证受众">84 <Step title="根据您的环境验证受众">

85 `aud` 声明是一个数组。除非它包含您的环境 ID(形式为 `ccpool_...`),否则拒绝令牌。环境 ID 显示在[**云环境**管理页面](https://claude.ai/admin-settings/cloud-environments)上您的环境的详细信息对话框中,并在任何环境的会话令牌中显示为 `ccr:pool_id` 声明。此检查是将令牌范围限制到您的环境并拒绝发布给其他组织的令牌的内容。85 `aud` 声明是一个数组。除非其中包含您的环境 ID(格式为 `ccpool_...`),否则拒绝该令牌。环境 ID 显示在 [**Cloud environments** 管理页面](https://claude.ai/admin-settings/cloud-environments)中您环境的详情对话框里,也会作为 `ccr:pool_id` 声明出现在该环境的任意会话令牌中。正是这项检查将令牌限定在您的环境内,并拒绝签发给其他组织的令牌。

86 </Step>86 </Step>

87 87 

88 <Step title="验证角色">88 <Step title="验证角色">

89 如果 `ccr:role` 不完全是 `session_worker`,则拒绝令牌。为自托管环境发布的其他令牌,例如环境机密、运行程序令牌和工作订单,由同一密钥集签名,但携带不同的角色。89 如果 `ccr:role` 不完全等于 `session_worker`,则拒绝该令牌。为自托管环境签发的其他令牌(例如环境密钥、运行器令牌和工单)由同一密钥集签名,但携带不同的角色。

90 </Step>90 </Step>

91 91 

92 <Step title="验证过期">92 <Step title="验证过期时间">

93 如果 `exp` 在过去,则拒绝令牌。Anthropic 默认发布生命周期为四小时、最长为八小时的会话令牌。运行程序在过期前刷新令牌,并将新值推送到会话,因此 Claude 在刷新后启动的子进程继承它。因此,一个会话在其生命周期内可以向您的服务呈现多个不同的有效令牌。93 如果 `exp` 已经过去,则拒绝该令牌。Anthropic 签发的会话令牌默认有效期为四小时,最长为八小时。运行器会在令牌过期前刷新令牌并将新值推送到会话中,因此 Claude 在刷新后启动的子进程会继承新令牌。因此,一个会话在其生命周期内可能会向您的服务出示多个不同的有效令牌。

94 </Step>94 </Step>

95 95 

96 <Step title="读取身份">96 <Step title="读取身份">

97 创建用户的身份在 `act` 声明中:`act.sub` 是他们的 Anthropic 用户 ID,采用前缀形式 `user:<id>`,`act.email`(当创建表面记录了一个时)是他们的电子邮件地址。您组织的服务身份创建的会话(包括 Claude Tag 频道会话)改为在 `act.sub` 中携带 `agent:` 主题,因此仅当 `act.sub` 携带 `user:` 前缀时才将会话视为用户创建的,而不是测试身份声明是否不存在。有关完整结构和平面重复声明,请参阅[声明参考](#claims-reference)。97 创建者的用户身份位于 `act` 声明中:`act.sub` 是其 Anthropic 用户 ID,采用带前缀的形式 `user:<id>`;`act.email`(当创建会话的使用入口记录了该信息时)是其电子邮件地址。由您组织的服务身份创建的会话(包括 Claude Tag 频道会话)则携带 `agent:` 主体,因此,仅当 `act.sub` 带有 `user:` 前缀时才将会话视为用户创建,而不是通过检测身份声明是否缺失来判断。有关完整结构和扁平的重复声明,请参阅[声明参考](#claims-reference)。

98 </Step>98 </Step>

99</Steps>99</Steps>

100 100 

101这些检查直接映射到标准 JWT 库。下面的示例使用 [`jose`](https://www.npmjs.com/package/jose) 在 Node.js 中实现完整序列,它处理 JWKS 获取、缓存和 `kid` 选择,以及使用 [`PyJWT`](https://pyjwt.readthedocs.io/) 及其内置 JWKS 客户端在 Python 中实现。101这些检查可以直接对应到标准 JWT 库。以下示例分别在 Node.js 中使用 [`jose`](https://www.npmjs.com/package/jose)(它负责 JWKS 的获取、缓存和 `kid` 选择),以及在 Python 中使用 [`PyJWT`](https://pyjwt.readthedocs.io/) 及其内置的 JWKS 客户端,实现了完整的检查流程。

102 102 

103<Tabs>103<Tabs>

104 <Tab title="Node.js (jose)">104 <Tab title="Node.js (jose)">


185 在会话内验证令牌185 在会话内验证令牌

186</h3>186</h3>

187 187 

188[包装脚本](/docs/zh-CN/self-hosted-environments-configuration#wrapper-scripts)在会话内运行,在 Claude 启动之前。它们可以运行运行程序二进制文件的 `self-hosted-runner decode-token` 子命令,而不是调用 JWT 库。子命令从位置参数、`CLAUDE_CODE_SESSION_ACCESS_TOKEN` 或管道 stdin 读取令牌(按该顺序),然后删除前缀,根据 JWKS 端点验证签名,检查过期,并将声明打印为 JSON。子命令仅执行签名和过期检查;它不检查 `iss`、`aud` 或 `ccr:role`。当您的包装器的身份验证决定取决于这些声明时,从打印的 JSON 中读取它们并明确比较它们。188[包装脚本](/docs/zh-CN/self-hosted-environments-configuration#wrapper-scripts)在会话内、Claude 启动之前运行。它们无需调用 JWT 库,而是可以运行运行器二进制文件的 `self-hosted-runner decode-token` 子命令。该子命令依次从位置参数、`CLAUDE_CODE_SESSION_ACCESS_TOKEN` 或通过管道传入的 stdin 读取令牌,然后去除前缀,根据 JWKS 端点验证签名,检查过期时间,并以 JSON 格式打印声明。该子命令仅执行签名和过期检查;它不会检查 `iss`、`aud` 或 `ccr:role`。当您的包装脚本的授权决策依赖于这些声明时,请从打印的 JSON 中读取它们并进行显式比较。

189 189 

190此命令提取创建者身份,优先选择电子邮件地址,然后是创建者的 `act.sub` 主题 `user:<id>` 或 `agent:<id>`:190以下命令提取创建者身份,优先使用电子邮件地址,其次使用创建者的 `act.sub` 主体(`user:<id>` 或 `agent:<id>`):

191 191 

192```bash theme={null}192```bash theme={null}

193"$CLAUDE_RUNNER_CLAUDE_BIN" self-hosted-runner decode-token | jq -re '.act.email // .act.sub'193"$CLAUDE_RUNNER_CLAUDE_BIN" self-hosted-runner decode-token | jq -re '.act.email // .act.sub'

194```194```

195 195 

196包装脚本在 `CLAUDE_RUNNER_CLAUDE_BIN` 中接收运行程序自身二进制文件的绝对路径;使用该路径而不是 PATH 解析的 `claude`,以便解码在运行程序本身使用的同一二进制文件上运行。196包装脚本会通过 `CLAUDE_RUNNER_CLAUDE_BIN` 获得运行器自身二进制文件的绝对路径;请使用该路径,而不是通过 PATH 解析的 `claude`,以便解码操作在运行器本身所使用的同一个二进制文件上运行。

197 197 

198使用 `jq -re` 而不是 `jq -r`,以便缺少的声明导致非零退出。仅使用 `-r`,缺少的声明会打印文字字符串 `null` 并以零退出,这会以静默方式将坏值传递给下游。仅在 JWKS 端点无法访问的离线检查中将 `--no-verify` 传递给 `decode-token`。198请使用 `jq -re` 而不是 `jq -r`,这样缺失的声明会导致非零退出码。如果仅使用 `-r`,缺失的声明会打印字面字符串 `null` 并以零退出码退出,从而悄无声息地将错误值传递到下游。

199 

200如果 `decode-token` 无法从 JWKS 端点获取密钥或无法验证令牌,它会将原因打印到 stderr,不打印任何声明,并以退出码 1 退出。仅在 JWKS 端点无法访问、需要进行离线检查时,才向 `decode-token` 传递 `--no-verify`。

199 201 

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

201 声明参考203 声明参考

Details

34运行器主机需要:34运行器主机需要:

35 35 

36* 一个 Linux 或 macOS 主机或容器,具有到 `api.anthropic.com` 的出站 HTTPS、到 `claude.ai` 和下面安装步骤重定向到的下载主机的出站 HTTPS,以及到您的 git 主机的出站 HTTPS 用于克隆;[网络要求表](/docs/zh-CN/self-hosted-environments-deploy#network-requirements)有完整列表。Windows 不支持作为运行器主机;改为在 Linux 容器中运行运行器。开发人员工作站不受影响,因为会话从浏览器中的 claude.ai 启动。36* 一个 Linux 或 macOS 主机或容器,具有到 `api.anthropic.com` 的出站 HTTPS、到 `claude.ai` 和下面安装步骤重定向到的下载主机的出站 HTTPS,以及到您的 git 主机的出站 HTTPS 用于克隆;[网络要求表](/docs/zh-CN/self-hosted-environments-deploy#network-requirements)有完整列表。Windows 不支持作为运行器主机;改为在 Linux 容器中运行运行器。开发人员工作站不受影响,因为会话从浏览器中的 claude.ai 启动。

37* 一个用于测试会话的仓库:可以是公共仓库,也可以是此主机已能通过其 HTTPS URL 克隆且无需提供凭据的仓库。

37* 与实时同步的时钟,例如使用 NTP。当时钟偏离超过五分钟时,身份验证失败;请参阅[故障排除](/docs/zh-CN/self-hosted-environments-deploy#troubleshooting)。38* 与实时同步的时钟,例如使用 NTP。当时钟偏离超过五分钟时,身份验证失败;请参阅[故障排除](/docs/zh-CN/self-hosted-environments-deploy#troubleshooting)。

38 39 

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


57 设置环境和运行器58 设置环境和运行器

58</h2>59</h2>

59 60 

60Claude Code 包括一个引导式设置:一个交互式 Claude Code 会话,引导您在管理 UI 中创建环境、使用您保存的密钥文件启动本地运行器、确认运行器注册,并将速查表写入 `./runner-setup/CHEAT-SHEET.md`。在您已使用拥有所有者角色的帐户使用 `claude auth login` 登录的机器上运行它;它不适用于 API 密钥或第三方模型提供商。在无法进行交互式会话的主机上,改为使用下面的手动步骤。首先确认[版本检查](#software-on-the-runner-host)通过:在 2.1.224 之前的版本上,此命令启动一个普通的 Claude 会话,将这些词作为提示而不是引导式设置。要启动引导式设置,请运行设置子命令并按照提示进行:61使用[引导式设置](#run-the-guided-setup)或[手动步骤](#set-up-manually)。引导式设置只需一条命令,它会启动一个交互式 Claude Code 会话,并引导您完成其余步骤。在无法进行交互式会话的主机上,请改用手动步骤。如果拥有所有者角色的人员已创建环境并将其密钥交给您,也请使用手动步骤,因为引导式设置需要以所有者身份登录。

62 

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

64 运行引导式设置

65</h3>

66 

67引导式设置会引导您在管理 UI 中创建环境、使用您保存的密钥文件启动本地运行器、确认运行器已注册,并将速查表写入 `./runner-setup/CHEAT-SHEET.md`。运行之前,请确认您的登录状态和版本:

68 

69* **登录**:在您已使用拥有所有者角色的帐户通过 `claude auth login` 登录的机器上运行它。如果仅使用 API 密钥或第三方模型提供商,会话虽然会启动,但其组织检查会失败。

70* **版本**:确认[版本检查](#software-on-the-runner-host)已通过。在 2.1.224 之前的版本上,此设置命令会启动一个 Claude 会话,并将这些词作为提示词,而不是启动引导式设置。

71 

72要启动引导式设置,请在 shell 中运行设置子命令并按照提示进行操作:

61 73 

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

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

64```76```

65 77 

66要改为手动设置:78设置本身不会启动测试会话:它会提示您在 claude.ai/code 启动一个。设置的最后一步会停止它所启动的运行器。如果您在该步骤之前退出设置,运行器将继续运行。要在最后一步之后继续,请在 shell 中使用 `./runner-setup/CHEAT-SHEET.md` 中的命令再次启动运行器,然后[将会话路由到环境](#route-a-session)。

79 

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

81 手动设置

82</h3>

83 

84在 claude.ai 上创建环境,从主机上的终端启动运行器,然后返回 claude.ai 确认运行器出现并将会话路由到它。如果拥有所有者角色的人员已创建环境并将其密钥交给您,请从第 2 步开始。

67 85 

68<Steps>86<Steps>

69 <Step title="创建环境">87 <Step title="创建环境">


73 </Step>91 </Step>

74 92 

75 <Step title="启动运行器">93 <Step title="启动运行器">

76 创建密钥目录。此步骤和下一步需要 root 用于 `/etc/claude` 路径;运行器进程可以读取的任何路径都有效,因此如果您使用不同的路径,请一起调整两个命令和 `--environment-secret-file` 值。94 创建密钥目录。此命令和下一条命令使用 `/etc/claude`,这需要 root 权限,并且它们创建的密钥文件仅可由运行这些命令的用户读取。如果运行器将以其他用户身份运行,它会退出并显示 `error: Failed to read environment secret file <path> (EACCES: permission denied, open '<path>')`。在这种情况下,请以运行器的用户身份运行这两条命令,并使用该用户可写入的目录代替 `/etc/claude`,同时将相同的路径传递给 `--environment-secret-file`。运行器进程可以读取的任何路径都有效。

77 95 

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

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


89 107 

90 如果运行器无法创建或写入路径,它在启动时以命名目录的错误退出,而不是注册。请参阅[故障排除](/docs/zh-CN/self-hosted-environments-deploy#troubleshooting)。108 如果运行器无法创建或写入路径,它在启动时以命名目录的错误退出,而不是注册。请参阅[故障排除](/docs/zh-CN/self-hosted-environments-deploy#troubleshooting)。

91 109 

92 然后使用 `--environment-secret-file` 和 `--base-dir` 启动运行器。运行器向您的环境注册并开始轮询工作。如果运行器退出,请手动重新启动它。生产部署在编排器下运行运行器,该编排器重新启动已退出的运行器,通常每次重新启动时使用新的文件系统;[重用预热的检查](/docs/zh-CN/self-hosted-environments-deploy#reuse-a-pre-warmed-checkout)涵盖了支持的持久磁盘设置。110 然后使用 `--environment-secret-file` 和 `--base-dir` 启动运行器:

93 111 

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

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

96 ```114 ```

115 

116 运行器向您的环境注册后会记录 `Registered: runner_id=<runner-id>`,然后开始轮询工作。如果运行器之后退出,请手动重新启动它。有关何时会发生这种情况,请参阅[如果运行器退出](#if-the-runner-exits)。

97 </Step>117 </Step>

98 118 

99 <Step title="验证运行器出现">119 <Step title="验证运行器出现">

100 返回[**Cloud environments** 页面](https://claude.ai/admin-settings/cloud-environments)。您的环境状态在运行器启动后几秒内从 **No runners deployed** 更改为 **Healthy**;打开环境并选择 **Activity** 以查看运行器本身。120 返回[**Cloud environments** 页面](https://claude.ai/admin-settings/cloud-environments)。您的环境状态在运行器启动后几秒内从 **No runners deployed** 更改为 **Healthy**;打开环境并选择 **Activity** 以查看运行器本身。如果您无权访问管理页面,上一步运行器日志中的 `Registered: runner_id=<runner-id>` 行可提供相同的信号。

101 </Step>121 </Step>

102 122 

103 <Step title="将会话路由到环境">123 <Step title="将会话路由到环境">

104 在 claude.ai/code 启动会话,并从环境选择器中选择您的环境,其中自托管环境与 Anthropic 托管的环境一起出现。运行器使用主机已有的任何 git 凭证进行克隆,因此选择此主机已可以克隆的存储库或公共存储库;生产中私有存储库的凭证选项在[配置 git](/docs/zh-CN/self-hosted-environments-deploy#configure-git)上。下一个可用的运行器拾取排队的会话并记录 `Picked up session <session-id>` 以及其活跃计数和容量,因此您可以从运行器自己的输出中确认哪个主机接收了会话。在 [claude.ai/code](https://claude.ai/code) 观看会话工作并阅读 Claude 的回复。如果会话保持排队状态,请参阅[故障排除](/docs/zh-CN/self-hosted-environments-deploy#troubleshooting)。124 <span id="route-a-session" />在 claude.ai/code 启动会话,并从环境选择器中选择您的环境,其中自托管环境与 Anthropic 托管的环境一起出现。对于仓库,请选择[前提条件](#host-and-network)中的仓库:公共仓库,或此主机已可以克隆的仓库。运行器使用主机已有的任何 git 凭据进行克隆。

125 

126 下一个可用的运行器拾取排队的会话并记录 `Picked up session <session-id>` 以及其活跃计数和容量,因此您可以从运行器自己的输出中确认哪个主机接收了会话。在 [claude.ai/code](https://claude.ai/code) 观看会话工作并阅读 Claude 的回复。

127 

128 如果会话没有开始工作,请对照您看到的情况:

129 

130 * **会话保持排队状态**:请参阅[故障排除](/docs/zh-CN/self-hosted-environments-deploy#troubleshooting)。

131 * **会话因 git 错误而无法启动**:错误会显示在会话和运行器的日志中。如果错误包含 git 的 `could not read Username for`,后跟您的 git 主机的 URL,则说明运行器没有该主机的 HTTPS 凭据。请参阅[配置 git](/docs/zh-CN/self-hosted-environments-deploy#configure-git),其中还介绍了生产环境中私有仓库的凭据选项。

105 </Step>132 </Step>

106</Steps>133</Steps>

107 134 

108运行器在其活跃会话完成后按设计退出;请参阅[运行器生命周期](/docs/zh-CN/self-hosted-environments#runner-lifecycle)。对于生产,在编排器下部署它,该编排器在退出时重新启动它,并在运行器启动后立即继续退出时等待更长的时间再重新启动。请参阅[部署到生产环境](/docs/zh-CN/self-hosted-environments-deploy)和[当运行器退出时](/docs/zh-CN/self-hosted-environments-deploy#when-the-runner-exits)。135<h3 id="if-the-runner-exits">

136 如果运行器退出

137</h3>

138 

139如果运行器在本快速入门期间退出,请使用相同的命令再次启动它。运行器可能会自行退出:

140 

141* **会话已完成**:日志显示 `[runner:exit] account workload drained — exiting`。运行器在其活跃会话完成后按设计退出。请参阅[运行器生命周期](/docs/zh-CN/self-hosted-environments#runner-lifecycle)。

142* **失去联系**:日志显示一行包含 `runner record gone server-side` 或 `poll auth failed` 的 `[runner:fatal]`。如果运行器与 Anthropic 失去联系一段时间(例如因为主机休眠),它可能会在下次连接到 Anthropic 时退出。

143 

144一个轮次结束并不会结束您的测试会话。第一轮之后,会话仍处于连接状态,运行器也仍在运行,因此您可以[向会话发送后续消息](#send-a-follow-up-message-to-a-running-session),而无需先重新启动运行器。

145 

146对于生产,在编排器下部署运行器,该编排器在退出时重新启动它,并在运行器启动后立即继续退出时等待更长的时间再重新启动。请参阅[部署到生产环境](/docs/zh-CN/self-hosted-environments-deploy)和[当运行器退出时](/docs/zh-CN/self-hosted-environments-deploy#when-the-runner-exits)。

109 147 

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

111 向运行中的会话发送后续消息149 向运行中的会话发送后续消息

Details

52| `--release-idle-session-min <n>` | `SELF_HOSTED_RUNNER_SESSION_IDLE_MS` | `0` | 在轮次完成或会话等待用户操作后,在 N 分钟的不活动后释放会话槽。仍在进行中的会话(包括持有永不完成的后台任务或从运行的工具调用内部请求的批准的会话)不计为空闲;与 `--kill-session-after-min` 配对作为硬后挡。在会话的后台任务完成后,运行器认为会话繁忙,直到读取结果的后续轮次开始,最多为 [`SELF_HOSTED_RUNNER_BG_RESULT_GRACE_MS`](#environment-variable-only-settings) 窗口。在运行器接收到关闭信号或达到其退休时间之前,留下运行器没有活跃会话的释放启动与正常排空相同的退出路径,由 `--drain-grace-sec` 管理。在您使用 [`--defer-shutdown-max-min`](/docs/zh-CN/self-hosted-environments-deploy#defer-the-drain-past-the-first-signal) 推迟的第一个信号之后,运行器在释放使其不持有任何会话时立即退出。`0` 禁用。 |52| `--release-idle-session-min <n>` | `SELF_HOSTED_RUNNER_SESSION_IDLE_MS` | `0` | 在轮次完成或会话等待用户操作后,在 N 分钟的不活动后释放会话槽。仍在进行中的会话(包括持有永不完成的后台任务或从运行的工具调用内部请求的批准的会话)不计为空闲;与 `--kill-session-after-min` 配对作为硬后挡。在会话的后台任务完成后,运行器认为会话繁忙,直到读取结果的后续轮次开始,最多为 [`SELF_HOSTED_RUNNER_BG_RESULT_GRACE_MS`](#environment-variable-only-settings) 窗口。在运行器接收到关闭信号或达到其退休时间之前,留下运行器没有活跃会话的释放启动与正常排空相同的退出路径,由 `--drain-grace-sec` 管理。在您使用 [`--defer-shutdown-max-min`](/docs/zh-CN/self-hosted-environments-deploy#defer-the-drain-past-the-first-signal) 推迟的第一个信号之后,运行器在释放使其不持有任何会话时立即退出。`0` 禁用。 |

53| `--remove-session-state [bool]` | `SELF_HOSTED_RUNNER_REMOVE_SESSION_STATE` | 关闭 | 当会话在此运行器上结束时,删除 `<base-dir>/_sessions/` 下的会话的每个会话目录,无论结果如何。[重用预热的检出](/docs/zh-CN/self-hosted-environments-deploy#reuse-a-pre-warmed-checkout)描述它们保存的内容以及当它们保留时谁可以读取它们。删除是尽力而为:当运行器被杀死或在清理运行之前达到其排空截止时间时,每个会话目录保持到位。启用标志后,失败或中断的会话的调试日志不会保留在磁盘上。需要 Claude Code v2.1.268 或更高版本。 |53| `--remove-session-state [bool]` | `SELF_HOSTED_RUNNER_REMOVE_SESSION_STATE` | 关闭 | 当会话在此运行器上结束时,删除 `<base-dir>/_sessions/` 下的会话的每个会话目录,无论结果如何。[重用预热的检出](/docs/zh-CN/self-hosted-environments-deploy#reuse-a-pre-warmed-checkout)描述它们保存的内容以及当它们保留时谁可以读取它们。删除是尽力而为:当运行器被杀死或在清理运行之前达到其排空截止时间时,每个会话目录保持到位。启用标志后,失败或中断的会话的调试日志不会保留在磁盘上。需要 Claude Code v2.1.268 或更高版本。 |

54| `--retire-at <epoch-seconds>` | `SELF_HOSTED_RUNNER_RETIRE_AT` | 未设置 | 在绝对 Unix 时间戳(以秒为单位)处退休运行器,用于在已知时间杀死运行器的基础设施;[运行器生命周期](/docs/zh-CN/self-hosted-environments#runner-lifecycle)描述释放序列以及如何调整边距。2001 年之前或 5138 年之后的值被标志拒绝,被环境变量忽略。 |54| `--retire-at <epoch-seconds>` | `SELF_HOSTED_RUNNER_RETIRE_AT` | 未设置 | 在绝对 Unix 时间戳(以秒为单位)处退休运行器,用于在已知时间杀死运行器的基础设施;[运行器生命周期](/docs/zh-CN/self-hosted-environments#runner-lifecycle)描述释放序列以及如何调整边距。2001 年之前或 5138 年之后的值被标志拒绝,被环境变量忽略。 |

55| `--server-auto-mode-lists <mode>` | `SELF_HOSTED_RUNNER_SERVER_AUTO_MODE_LISTS` | `no-allow` | 控制平面随会话发送的[自动模式](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode)分类器规则列表中,哪些可以到达该会话:`all`、`no-allow` 或 `none`。请参阅[自动模式规则列表](#auto-mode-rule-lists)了解每个值应用的内容。无效值会使运行器在启动时停止。需要 Claude Code v2.1.295 或更高版本。 |

55| `--session-stop-grace-sec <n>` | `SELF_HOSTED_RUNNER_SESSION_STOP_GRACE_MS` | `5` | 会话结束后等待 Claude 进程干净退出的时间,然后强制杀死它。如果子进程自己的 `SessionEnd` 钩子需要更多时间,请提高该值。 |56| `--session-stop-grace-sec <n>` | `SELF_HOSTED_RUNNER_SESSION_STOP_GRACE_MS` | `5` | 会话结束后等待 Claude 进程干净退出的时间,然后强制杀死它。如果子进程自己的 `SessionEnd` 钩子需要更多时间,请提高该值。 |

56| `--startup-timeout-min <n>` | `SELF_HOSTED_RUNNER_STARTUP_TIMEOUT_MS` | `15` | 如果子进程在生成后 N 分钟内未在[活动频道](/docs/zh-CN/self-hosted-environments-configuration#keep-stdin-and-file-descriptor-3-attached)上发出初始化信号,则释放会话槽。由子进程的初始化信号清除,而不是普通输出,之后 `--release-idle-session-min` 接管。`0` 禁用。 |57| `--startup-timeout-min <n>` | `SELF_HOSTED_RUNNER_STARTUP_TIMEOUT_MS` | `15` | 如果子进程在生成后 N 分钟内未发出已完成初始化的信号,则释放会话槽。克隆发生在生成之前,因此克隆时间不计入。由子进程在[活动频道](/docs/zh-CN/self-hosted-environments-configuration#keep-stdin-and-file-descriptor-3-attached)上的初始化信号清除,而不是由普通输出清除,之后 `--release-idle-session-min` 接管。`0` 禁用。 |

57| `--trust-workspace [bool]` | `SELF_HOSTED_RUNNER_TRUST_WORKSPACE` | 开启 | 为每个会话的存储库路径播种持久化信任,以便遵守存储库提交的 `permissions.allow` 和 `additionalDirectories`。设置 `false` 以删除存储库提交的权限授予,并在主机配置的 `settings.json` 中配置允许规则;无论如何,存储库提交的 `sandbox.*` 设置仍然适用,这就是为什么[存储库设置保护](/docs/zh-CN/self-hosted-environments-deploy#harden-your-deployment)无论此标志如何都扫描它们。 |58| `--trust-workspace [bool]` | `SELF_HOSTED_RUNNER_TRUST_WORKSPACE` | 开启 | 为每个会话的存储库路径播种持久化信任,以便遵守存储库提交的 `permissions.allow` 和 `additionalDirectories`。设置 `false` 以删除存储库提交的权限授予,并在主机配置的 `settings.json` 中配置允许规则;无论如何,存储库提交的 `sandbox.*` 设置仍然适用,这就是为什么[存储库设置保护](/docs/zh-CN/self-hosted-environments-deploy#harden-your-deployment)无论此标志如何都扫描它们。 |

58| `--use-anthropic-git-proxy` | `CLAUDE_RUNNER_USE_GIT_PROXY=1` | 关闭 | 通过 [Anthropic git 代理](/docs/zh-CN/self-hosted-environments-deploy#use-the-anthropic-git-proxy)而不是客户管理的 git 身份验证进行克隆。需要 `--capacity 1` 和 git 2.32 或更高版本;运行器否则拒绝启动。取代重写标志。 |59| `--use-anthropic-git-proxy` | `CLAUDE_RUNNER_USE_GIT_PROXY=1` | 关闭 | 通过 [Anthropic git 代理](/docs/zh-CN/self-hosted-environments-deploy#use-the-anthropic-git-proxy)而不是客户管理的 git 身份验证克隆 github.com 上的仓库。需要 `--capacity 1` 和 git 2.32 或更高版本;运行器否则拒绝启动。取代重写标志。 |

59 60 

60大多数持续时间标志都有最大值,选择以将每个超时保持在运行时的 32 位计时器上限内,大约 24.85 天。`--*-min` 标志上限为 10080 分钟,7 天;`--drain-grace-sec` 为 604800 秒,也是 7 天;`--drain-wait-sec` 为 86400 秒,24 小时。`--session-stop-grace-sec` 和 `--post-session-hook-timeout-sec` 无上限。超过上限的行为因表面而异:61大多数持续时间标志都有最大值,选择以将每个超时保持在运行时的 32 位计时器上限内,大约 24.85 天。`--*-min` 标志上限为 10080 分钟,7 天;`--drain-grace-sec` 为 604800 秒,也是 7 天;`--drain-wait-sec` 为 86400 秒,24 小时。`--session-stop-grace-sec` 和 `--post-session-hook-timeout-sec` 无上限。超过上限的行为因表面而异:

61 62 

62* **标志**:启动失败并出现错误。63* **标志**:启动失败并出现错误。

63* **环境变量**:运行器将值夹紧到计时器上限,而不是拒绝它。64* **环境变量**:运行器将值夹紧到计时器上限,而不是拒绝它。

64 65 

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

67 自动模式规则列表

68</h3>

69 

70`--server-auto-mode-lists` 让您决定来自运行器外部的哪些[自动模式](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode)分类器规则可以到达您的运行器上的会话。Anthropic 的控制平面可以随会话发送规则列表,并要求运行器应用它们。其中某些条目可能是您组织的管理员编写的规则。这些列表是 `environment`、`soft_deny` 和 `allow`:

71 

72* **`environment`**:条目既可以让分类器允许更多操作,也可以让其允许更少操作。

73* **`soft_deny`**:条目会阻止某个操作,除非用户明确要求执行该操作,或者适用某个 `allow` 例外。

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

75 

76标志的值决定运行器应用哪些列表:

77 

78* **`no-allow`**:默认值。应用 `environment` 和 `soft_deny`,不应用 `allow`。`environment` 条目仍然可以让分类器允许更多操作,因此默认值并不能排除所有放宽。

79* **`all`**:应用全部三个列表。

80* **`none`**:不应用其中任何列表。选择 `none` 可排除来自这些列表的所有放宽。它也会丢弃 `soft_deny` 限制。

81 

82没有任何运行器设置能让控制平面要求运行器应用这些列表。当控制平面没有提出要求时,无论您如何设置,会话都不会收到任何列表。要查看发生了哪种情况,请使用 `--log-level debug` 启动运行器。随后,运行器会为每个会话记录一行包含 `the server asked this runner to apply` 的日志,或一行包含 `the server did not ask this runner to apply the auto mode lists it sends` 的日志。

83 

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

66 Orchestrator CLI 标志85 Orchestrator CLI 标志

67</h2>86</h2>


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

73| `--hook-concurrency <n>` | `4` | 最大 `spawn-runner` 钩子并行运行。还限制每次轮询声称的生成请求数。 |92| `--hook-concurrency <n>` | `4` | 最大 `spawn-runner` 钩子并行运行。还限制每次轮询声称的生成请求数。 |

74| `--hook-timeout <sec>` | `60` | 在这么多秒后终止钩子的进程树。超时加其 5 秒杀死宽限期必须保持在 `--expected-spawn-seconds` 以下;编排器在启动时强制执行此操作。 |93| `--hook-timeout <sec>` | `60` | 在这么多秒后终止钩子的进程树。超时加其 5 秒杀死宽限期必须保持在 `--expected-spawn-seconds` 以下;编排器在启动时强制执行此操作。 |

75| `--expected-spawn-seconds <sec>` | `120` | 生成的运行器的预期 p99 启动时间,在服务器强制的范围 10 到 3600 内。在每次轮询时发送作为服务器端租约;如果没有运行器在其过期前注册,会话将使用新的订单 ID 重新提供。所有副本必须共享此值。 |94| `--expected-spawn-seconds <sec>` | `120` | 从编排器收到生成请求到运行器注册的预期 p99 时间,包括在您的平台上等待容量的任何时间。服务器强制的范围为 10 到 3600。在每次轮询时作为服务器端租约发送;如果没有运行器在其过期前注册,会话将使用新的订单 ID 重新提供。所有副本必须共享此值。 |

76| `--min-idle <n>` | `0` | 通过主动生成待命运行器来保持至少 N 个空闲会话槽。`0` 禁用预热。与运行器的 `--exit-if-unused-min` 配对,以便多余的待命运行器回收自己。 |95| `--min-idle <n>` | `0` | 通过主动生成待命运行器来保持至少 N 个空闲会话槽。`0` 禁用预热。与运行器的 `--exit-if-unused-min` 配对,以便多余的待命运行器回收自己。 |

77| `--debug-dir <path>` | 未设置 | 将每个生成请求的工作订单和钩子 stderr 写入磁盘。仅用于调试;永远不要在生产中设置。 |96| `--debug-dir <path>` | 未设置 | 将每个生成请求的工作订单和钩子 stderr 写入磁盘。仅用于调试;永远不要在生产中设置。 |

78 97 


108| `SELF_HOSTED_RUNNER_POST_TURN_SETTLE_MS` | `7000` | 运行器在轮次完成后计算会话繁忙的时间上限,用于 `--drain-wait-sec` 排空,而会话的进程向 Anthropic 报告轮次的结束。`0` 或不可用的值回退到默认值,因此无法关闭保持。需要 Claude Code v2.1.275 或更高版本。 |127| `SELF_HOSTED_RUNNER_POST_TURN_SETTLE_MS` | `7000` | 运行器在轮次完成后计算会话繁忙的时间上限,用于 `--drain-wait-sec` 排空,而会话的进程向 Anthropic 报告轮次的结束。`0` 或不可用的值回退到默认值,因此无法关闭保持。需要 Claude Code v2.1.275 或更高版本。 |

109| `SELF_HOSTED_RUNNER_SIGKILL_GRACE_MS` | `30000` | 运行器等待操作系统向陷入不可中断 I/O 的子进程传递 `SIGKILL` 的时间,然后自己退出。下限为 `--post-session-hook-timeout-sec` 加 15 秒,设置 `--push-outcome-on-release` 时再加 30 秒,因此有效最小值在默认值处为 75 秒。 |128| `SELF_HOSTED_RUNNER_SIGKILL_GRACE_MS` | `30000` | 运行器等待操作系统向陷入不可中断 I/O 的子进程传递 `SIGKILL` 的时间,然后自己退出。下限为 `--post-session-hook-timeout-sec` 加 15 秒,设置 `--push-outcome-on-release` 时再加 30 秒,因此有效最小值在默认值处为 75 秒。 |

110| `CLAUDE_RUNNER_FETCH_DEPTH` | `50` | 新克隆的 git 获取深度。设置正整数,或 `full` 或 `0` 以进行完整获取。工作区中已存在的存储库保持其现有深度。 |129| `CLAUDE_RUNNER_FETCH_DEPTH` | `50` | 新克隆的 git 获取深度。设置正整数,或 `full` 或 `0` 以进行完整获取。工作区中已存在的存储库保持其现有深度。 |

130| `CLAUDE_RUNNER_FETCH_SERVER_PROGRESS_CAP_MS` | `600000` | 在 git 服务器自身的进度数字持续上升期间(例如服务器为大型仓库准备 pack 时),每次尝试中 git 获取等待首批数据的最长时间(以毫秒为单位)。`0` 或 `off` 会关闭此等待:此类获取在两分钟内没有收到数据时将被中断。任何其他整数都会被限制在 `120000` 到 `1800000` 之间,即 2 到 30 分钟。需要 Claude Code v2.1.295 或更高版本。 |

111| `CLAUDE_RUNNER_SKIP_GIT_VERIFY` | 未设置 | 当为 `1` 时,跳过 `checkout` 钩子运行后的 `.git` 存在检查。当您的钩子物化非 git 源时设置此项。 |131| `CLAUDE_RUNNER_SKIP_GIT_VERIFY` | 未设置 | 当为 `1` 时,跳过 `checkout` 钩子运行后的 `.git` 存在检查。当您的钩子物化非 git 源时设置此项。 |

112| `FORCE_AUTOUPDATE_PLUGINS` | 未设置 | 当为 `1` 时,让插件市场自动更新,即使二进制文件被固定 |132| `FORCE_AUTOUPDATE_PLUGINS` | 未设置 | 当为 `1` 时,让插件市场自动更新,即使二进制文件被固定 |

113| `CLAUDE_CODE_DISABLE_ARTIFACT` | 未设置 | 当为 `1` 时,无论组织的管理员设置如何,都在会话中禁用 Artifact 工具,并删除 `*.frame.claudeusercontent.com` 出口要求 |133| `CLAUDE_CODE_DISABLE_ARTIFACT` | 未设置 | 当为 `1` 时,无论组织的管理员设置如何,都在会话中禁用 Artifact 工具,并删除 `*.frame.claudeusercontent.com` 出口要求 |


178| `claude_code_self_hosted_orchestrator_poll_errors_total{error_kind}` | 按类型累积 PollSpawnHints 失败:`transport`、`timeout`、`5xx`、`429` 或 `4xx`。所有五个系列从进程启动时存在;在 `rate(...[5m]) > 0` 时发出警报。 |198| `claude_code_self_hosted_orchestrator_poll_errors_total{error_kind}` | 按类型累积 PollSpawnHints 失败:`transport`、`timeout`、`5xx`、`429` 或 `4xx`。所有五个系列从进程启动时存在;在 `rate(...[5m]) > 0` 时发出警报。 |

179| `claude_code_self_hosted_orchestrator_queue_pending_sessions` | 现在可声称的生成请求 |199| `claude_code_self_hosted_orchestrator_queue_pending_sessions` | 现在可声称的生成请求 |

180| `claude_code_self_hosted_orchestrator_queue_backing_off_sessions` | 在可重试钩子失败后处于重试退避中的生成请求 |200| `claude_code_self_hosted_orchestrator_queue_backing_off_sessions` | 在可重试钩子失败后处于重试退避中的生成请求 |

181| `claude_code_self_hosted_orchestrator_queue_circuit_broken_sessions` | 被阻止的生成请求,直到所有者从环境的**活动**选项卡重试它们;如果高于零则发出警报 |201| `claude_code_self_hosted_orchestrator_queue_circuit_broken_sessions` | 被阻止生成的会话。每个会话都保持阻止状态,直到用户向其发送新消息,或所有者从环境的**活动**选项卡重试它。修复原因后,该计数可能仍保持在零以上。如果高于零则发出警报。 |

182| `claude_code_self_hosted_orchestrator_pool_pending_sessions` | 等待此环境中的运行器的总会话。环境范围的聚合,在每个编排器实例上相同:在实例间使用 `MAX` 而不是 `SUM`。 |202| `claude_code_self_hosted_orchestrator_pool_pending_sessions` | 等待此环境中的运行器的总会话。环境范围的聚合,在每个编排器实例上相同:在实例间使用 `MAX` 而不是 `SUM`。 |

183| `claude_code_self_hosted_orchestrator_pool_active_sessions` | 当前分配给此环境中活跃运行器的会话。环境范围的聚合,在每个编排器实例上相同:在实例间使用 `MAX` 而不是 `SUM`。 |203| `claude_code_self_hosted_orchestrator_pool_active_sessions` | 当前分配给此环境中活跃运行器的会话。环境范围的聚合,在每个编排器实例上相同:在实例间使用 `MAX` 而不是 `SUM`。 |

184| `claude_code_self_hosted_orchestrator_spawn_hooks_total{result}` | 累积 `spawn-runner` 钩子结果:`ok`、`retryable`、`non_retryable`。计数编排器钩子调用,而不是运行器生成的会话子进程:与 `sessions_started_total` 不可比,因为容量高于 1、热池和为同一会话再次生成的运行器都使两者分散。 |204| `claude_code_self_hosted_orchestrator_spawn_hooks_total{result}` | 累积 `spawn-runner` 钩子结果:`ok`、`retryable`、`non_retryable`。计数编排器钩子调用,而不是运行器生成的会话子进程:与 `sessions_started_total` 不可比,因为容量高于 1、热池和为同一会话再次生成的运行器都使两者分散。 |


283 for: 1m303 for: 1m

284 labels: {severity: critical}304 labels: {severity: critical}

285 annotations:305 annotations:

286 summary: "{{ $value }} 个会话断路 — spawn-runner 钩子反复不可重试;修复基础设施然后从活动选项卡重试"306 summary: "被阻止生成的会话:{{ $value }}。在 Activity 选项卡中查看每个会话的错误,修复原因,然后选择 Retry"

287 - alert: ClaudeOrchestratorPollErrors307 - alert: ClaudeOrchestratorPollErrors

288 expr: sum by (pod) (rate(claude_code_self_hosted_orchestrator_poll_errors_total[5m])) > 0308 expr: sum by (pod) (rate(claude_code_self_hosted_orchestrator_poll_errors_total[5m])) > 0

289 for: 2m309 for: 2m


318 338 

319在 v2.1.260 之前,运行器终止达到其 `--kill-session-after-min` 限制的每个会话,并在 `sessions_interrupted_total` 中计数。339在 v2.1.260 之前,运行器终止达到其 `--kill-session-after-min` 限制的每个会话,并在 `sessions_interrupted_total` 中计数。

320 340 

321[`post-session` 钩子](/docs/zh-CN/self-hosted-environments-configuration#post-session)的 `CLAUDE_RUNNER_EXIT_REASON` 以不同方式分类干净交接。钩子将释放、启动超时和服务器取消分配报告为 `interrupted`,因为运行器停止了子进程。这些计数器记录与 `completed` 相同的事件,因为槽被干净地交还。341[`post-session` 钩子](/docs/zh-CN/self-hosted-environments-configuration#post-session)的 `CLAUDE_RUNNER_EXIT_REASON` 以不同方式分类干净交接。钩子将以下情况报告为 `interrupted`,因为运行器停止了子进程:释放、启动超时、服务器取消分配,以及轮询先注意到的存档或删除。这些计数器记录与 `completed` 相同的事件,因为槽被干净地交还。

322 342 

323如果您直接根据 `sessions_completed_total` 协调钩子收据,您会低估完成。对每个会话保证使用钩子,对聚合速率使用计数器。343如果您直接根据 `sessions_completed_total` 协调钩子收据,您会低估完成。对每个会话保证使用钩子,对聚合速率使用计数器。

324 344 

Details

87 87 

88`--environment` 和 `--ref` 分派标志需要在运行脚本的机器上使用 Claude Code v2.1.224 或更高版本,这与运行器本身的下限相同。安装 hook 并在此主机上启动运行器后,测试脚本:88`--environment` 和 `--ref` 分派标志需要在运行脚本的机器上使用 Claude Code v2.1.224 或更高版本,这与运行器本身的下限相同。安装 hook 并在此主机上启动运行器后,测试脚本:

89 89 

901. 使用 `claude -p "<prompt>" --environment <environment-id> --output-format json` 在测试环境上创建会话,从 git 检出运行,以便 CLI 可以从 `origin` 远程自动检测存储库。可选的 `--ref <branch>` 将会话的检出基于命名的 ref 而不是本地 HEAD。该命令创建会话,打印包含 `session_id` 的一行 JSON,并退出而不等待 Claude 的回复。901. 使用 `claude -p "<prompt>" --environment <environment-id> --output-format json` 在测试环境上创建会话。请从 git 检出中运行该命令,以便 CLI 可以从 `origin` 远程自动检测仓库。可选的 `--ref <branch>` 将会话的检出基于命名的 ref 而不是本地 HEAD。该命令退出时不会等待 Claude 的回复。其输出会告知脚本结果:

91 * **会话已创建**:一行 JSON,例如 `{"ok":true,"session_id":"session_...","title":"...","url":"...","pool_id":"..."}`

92 * **会话创建失败**:输出 `{"ok":false,"error":"..."}` 这一行,并且命令以状态 1 退出

93 * **某些较早发生的错误**,例如您的组织无法使用云端会话或缺少提示词:错误输出到 stderr,不输出 JSON 行,并且命令以状态 1 退出

912. 等待回复出现在 `$E2E_REPLY_DIR/<session_id>.txt` 中,由运行器上的 Stop hook 在回合完成后写入。942. 等待回复出现在 `$E2E_REPLY_DIR/<session_id>.txt` 中,由运行器上的 Stop hook 在回合完成后写入。

923. 使用 `claude -p "<message>" --cloud <session_id> --output-format json` 发送后续消息(请参阅[向运行中的会话发送后续消息](/docs/zh-CN/claude-code-on-the-web#send-follow-ups-from-the-cli)),它将用户事件发布到现有会话并退出。953. 使用 `claude -p "<message>" --cloud <session_id> --output-format json` 发送后续消息(请参阅[向运行中的会话发送后续消息](/docs/zh-CN/claude-code-on-the-web#send-follow-ups-from-the-cli)),它将用户事件发布到现有会话并退出。

934. 以与步骤 2 相同的方式等待后续回复。964. 以与步骤 2 相同的方式等待后续回复。


104 示例脚本107 示例脚本

105</h2>108</h2>

106 109 

107下面的脚本针对 `$CLAUDE_TEST_ENVIRONMENT_ID`(您的测试环境的 `ccpool_...` ID,显示在管理页面上的环境详细信息对话框中或由[创建环境调用](#create-a-dedicated-test-environment)返回)运行完整循环,并对每个回复中的哨兵短语进行断言。从您希望会话在其中工作的仓库的 git 检出运行它,在此主机上启动运行器后,安装捕获 hook 并导出 `E2E_REPLY_DIR`。首先,按照[从 CI 进行身份验证](#authenticate-from-ci)中的说明,在运行该脚本的机器上使用 claude.ai 账户登录。如果未登录,第一次分派将失败,并出现诸如 `Unable to get organization UUID for cloud session creation` 之类的错误。110示例脚本与测试运行器在同一台机器上运行。运行之前,请先准备好该机器:

111 

112* **仓库检出**:从您希望会话在其中工作的仓库的 git 检出运行该脚本。

113* **运行器**:在此主机上启动运行器,安装捕获 hook 并导出 `E2E_REPLY_DIR`。

114* **登录**:按照[从 CI 进行身份验证](#authenticate-from-ci)中的说明,在运行该脚本的机器上使用 claude.ai 账户登录。

115* **环境 ID**:将 `CLAUDE_TEST_ENVIRONMENT_ID` 设置为您的测试环境的 `ccpool_...` ID,该 ID 显示在管理页面上的环境详细信息对话框中,或由[创建环境调用](#create-a-dedicated-test-environment)返回。

116 

117下面的脚本针对 `$CLAUDE_TEST_ENVIRONMENT_ID` 运行完整循环,并对每个回复中的哨兵短语进行断言。

108 118 

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

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


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

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

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

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

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

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

158 168 


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

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

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

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

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

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

169 179 

sessions.md +43 −41

Details

6 6 

7> 命名、恢复、分支和在 Claude Code 对话之间切换。涵盖 `--continue`、`--resume`、`--from-pr`、`/resume` 选择器、会话命名、导出文本记录和文本记录存储位置。7> 命名、恢复、分支和在 Claude Code 对话之间切换。涵盖 `--continue`、`--resume`、`--from-pr`、`/resume` 选择器、会话命名、导出文本记录和文本记录存储位置。

8 8 

9会话是与项目目录关联的已保存对话。Claude Code 在您工作时将其本地存储,因此您可以从中断处恢复、分支以尝试不同的方法,或在任务之间切换。9[会话](/docs/zh-CN/glossary#session)是与项目目录关联的已保存对话。Claude Code 在您工作时将其本地存储,因此您可以从中断处恢复、分支以尝试不同的方法,或在任务之间切换。

10 10 

11[桌面应用](/docs/zh-CN/desktop#work-in-parallel-with-sessions)、[claude.ai/code](/docs/zh-CN/claude-code-on-the-web) 和 [VS Code 扩展](/docs/zh-CN/vs-code#resume-past-conversations)各自维护自己的会话列表,桌面应用还可以[恢复 CLI 会话](/docs/zh-CN/desktop#coming-from-the-cli)。本页涵盖 CLI。11[桌面应用](/docs/zh-CN/desktop#work-in-parallel-with-sessions)、[claude.ai/code](/docs/zh-CN/claude-code-on-the-web) 和 [VS Code 扩展](/docs/zh-CN/vs-code#resume-past-conversations)各自维护自己的会话列表,桌面应用还可以[恢复 CLI 会话](/docs/zh-CN/desktop#coming-from-the-cli)。本页涵盖 CLI。

12 12 


18 18 

19| 命令 | 功能 |19| 命令 | 功能 |

20| :- | :- |20| :- | :- |

21| `claude --continue` | 重新打开当前目录中最近的对话 |21| `claude --continue` | 重新打开当前目录中最近的会话 |

22| `claude --resume` | 打开[会话选择器](#use-the-session-picker) |22| `claude --resume` | 打开[会话选择器](#use-the-session-picker) |

23| `claude --resume <name>` | 直接恢复命名的会话 |23| `claude --resume <name>` | 直接恢复命名的会话 |

24| `claude --resume <transcript-path>` | 恢复存储在该绝对路径的 `.jsonl` [会话记录文件](#where-transcripts-are-stored)中的对话 |24| `claude --resume <transcript-path>` | 恢复存储在该绝对路径的 `.jsonl` [会话记录文件](#where-transcripts-are-stored)中的会话 |

25| `claude --from-pr <number>` | 打开会话选择器,筛选链接到该 Pull Request 的会话 |25| `claude --from-pr <number>` | 打开会话选择器,筛选链接到该 Pull Request 的会话 |

26| `/resume` | 从活跃会话内切换到不同的对话 |26| `/resume` | 从活跃会话内切换到不同的会话 |

27 

28Claude Code 将使用 [`claude -p`](/docs/zh-CN/headless) 或 [Agent SDK](/docs/zh-CN/agent-sdk/overview) 创建的会话排除在会话选择器和 `claude --continue` 之外。您仍然可以通过将其会话 ID 传递给 `claude --resume <session-id>` 来恢复它。使用 `claude --continue` 时,Claude Code 也会跳过[第一个提示词是 `/loop` 的会话](#where-the-session-picker-looks)。当您运行 [`claude -p --continue`](/docs/zh-CN/headless#continue-conversations) 时,Claude Code 包括 `-p`、SDK 和 `/loop` 会话。

29 

30您可以从任何目录运行 `claude --resume <session-id>`,因此可以恢复在其他地方启动或使用 [`/cd`](/docs/zh-CN/commands) 移动过的会话。Claude Code 按以下顺序查找该 ID:

31 

321. 当前项目目录及其 git worktrees

332. 此计算机上的所有其他项目

34 

35跨项目搜索仅在恰好一个其他项目持有具有该 ID 的消息的会话记录时解析 ID,因此手动复制的重复项会导致 Claude Code 报告未找到,而不是恢复任意副本。如果没有存储的会话与 ID 匹配,Claude Code 会报告 `No conversation found with session ID: <session-id>`。

36 

37在 v2.1.223 之前,查找在当前项目目录及其 git worktrees 处停止,因此您必须从会话最后工作的目录恢复。

38 

39`claude --continue` 打开已完成的[后台会话](/docs/zh-CN/agent-view),但不打开仍在运行的会话;打开已完成的后台会话需要 Claude Code v2.1.257 或更高版本。如果您最近的对话是您[移到后台](/docs/zh-CN/agent-view#send-the-session-to-the-background)的会话,并且它仍在那里运行,Claude Code 会以 `Your most recent conversation is running in the background` 和该会话的 ID 退出。从 [`claude agents`](/docs/zh-CN/agent-view#attach-to-a-session) 附加到会话,或运行 `claude --resume` 选择另一个。

40 27 

41<h3 id="resume-a-running-background-session">28<h3 id="resume-a-running-background-session">

42 恢复正在运行的后台会话29 恢复正在运行的后台会话


64 51 

65当 Claude Code 从其会话记录加载对话时,恢复的会话会恢复对话以及保存在其中的状态:52当 Claude Code 从其会话记录加载对话时,恢复的会话会恢复对话以及保存在其中的状态:

66 53 

67* 对话历史:完整历史,包括工具调用和结果。如果工具在上一个进程结束时仍在运行(例如在崩溃中),当您恢复时它不会完成或再次运行。Claude 会看到该调用被标记为在记录其结果之前被切断,并被告知在再次运行之前检查它是否已生效,除非设置了 [`CLAUDE_CODE_RESUME_INTERRUPTED_TURN`](/docs/zh-CN/env-vars#variables)。在 v2.1.281 之前,Claude Code 会从对话中删除被切断的调用,或将其作为您中断的调用显示给 Claude。54* 对话历史:完整历史,包括工具调用和结果。如果工具在上一个进程结束时仍在运行(例如在崩溃中),当您恢复时它不会完成或再次运行。Claude 会看到该调用被标记为在记录其结果之前被切断,并被告知在再次运行之前检查它是否已生效,除非设置了 [`CLAUDE_CODE_RESUME_INTERRUPTED_TURN`](/docs/zh-CN/env-vars#variables)。

68* 模型:会话继续使用它之前使用的模型,[设置模型](/docs/zh-CN/model-config#setting-your-model)中所述的情况除外。55* 模型:会话继续使用它之前使用的模型,[设置模型](/docs/zh-CN/model-config#setting-your-model)中所述的情况除外。

69* Agent:使用 [`--agent`](/docs/zh-CN/sub-agents#invoke-subagents-explicitly) 或 `agent` 设置启动的会话继续作为该 Agent 运行,保持其工具限制和模型。在恢复时传递 `--agent` 以选择不同的 Agent;关于任一情况下的系统提示词,请参阅[恢复对话中的系统提示词标志](/docs/zh-CN/cli-reference#system-prompt-flags-in-resumed-conversations)。Claude Code 在两个地方查找 Agent:会话的原始目录(前提是您已[信任该工作区](/docs/zh-CN/permissions#project-allow-rules-and-workspace-trust)),然后是您恢复时所在的目录,因此项目范围的 Agent 在您从另一个目录恢复时仍会加载。如果 Claude Code 在任一位置都找不到该 Agent,会话会以默认工具恢复并显示[指明该 Agent 的警告](/docs/zh-CN/errors#session-agent-no-longer-available)。56* Agent:使用 [`--agent`](/docs/zh-CN/sub-agents#invoke-subagents-explicitly) 或 `agent` 设置启动的会话继续作为该 Agent 运行,保持其工具限制和模型。在恢复时传递 `--agent` 以选择不同的 Agent;关于任一情况下的系统提示词,请参阅[恢复对话中的系统提示词标志](/docs/zh-CN/cli-reference#system-prompt-flags-in-resumed-conversations)。Claude Code 在两个地方查找 Agent:会话的原始目录(前提是您已[信任该工作区](/docs/zh-CN/permissions#project-allow-rules-and-workspace-trust)),然后是您恢复时所在的目录,因此项目范围的 Agent 在您从另一个目录恢复时仍会加载。如果 Claude Code 在任一位置都找不到该 Agent,会话会以默认工具恢复并显示[指明该 Agent 的警告](/docs/zh-CN/errors#session-agent-no-longer-available)。

70* 权限模式:如果您从终端使用 `claude --continue`、`claude --resume <session-id>` 或 `claude --resume <name>`(当名称与一个会话匹配时)恢复,且不带 `-p`,Claude Code 会恢复会话所在的权限模式,[恢复时的权限模式](#permission-mode-on-resume)中的情况除外,该部分也涵盖会话选择器、`/resume` 和使用 `claude -p` 恢复。传递 `--permission-mode` 或 `--dangerously-skip-permissions` 以覆盖恢复的模式。57* 权限模式:如果您从终端使用 `claude --continue`、`claude --resume <session-id>` 或 `claude --resume <name>`(当名称与一个会话匹配时)恢复,且不带 `-p`,Claude Code 会恢复会话所在的权限模式,[恢复时的权限模式](#permission-mode-on-resume)中的情况除外,该部分也涵盖会话选择器、`/resume` 和使用 `claude -p` 恢复。传递 `--permission-mode` 或 `--dangerously-skip-permissions` 以覆盖恢复的模式。


83* 终端:`claude --continue`、`claude --resume <session-id>` 或 `claude --resume <name>`(当名称与一个会话匹配时),不带 `-p`。Claude Code 恢复会话所在的权限模式,表中的情况除外。传递 `--permission-mode` 或 `--dangerously-skip-permissions` 以覆盖恢复的模式。70* 终端:`claude --continue`、`claude --resume <session-id>` 或 `claude --resume <name>`(当名称与一个会话匹配时),不带 `-p`。Claude Code 恢复会话所在的权限模式,表中的情况除外。传递 `--permission-mode` 或 `--dangerously-skip-permissions` 以覆盖恢复的模式。

84* 非交互式:`claude -p --resume` 或 `claude -p --continue`。Claude Code 以新的 `claude -p` 运行会启动的权限模式启动该运行,但在[下面的条件](#resume-in-plan-mode-with-p)下,以计划模式结束的会话会以计划模式恢复。71* 非交互式:`claude -p --resume` 或 `claude -p --continue`。Claude Code 以新的 `claude -p` 运行会启动的权限模式启动该运行,但在[下面的条件](#resume-in-plan-mode-with-p)下,以计划模式结束的会话会以计划模式恢复。

85* VS Code:扩展的对话面板。该表仅涵盖以计划模式结束的对话;其余情况请参阅[恢复过去的对话](/docs/zh-CN/vs-code#resume-past-conversations)。72* VS Code:扩展的对话面板。该表仅涵盖以计划模式结束的对话;其余情况请参阅[恢复过去的对话](/docs/zh-CN/vs-code#resume-past-conversations)。

86* 启动时的会话选择器:您从[会话选择器](#use-the-session-picker)中选择的会话,无论您是单独使用 `claude --resume`、使用 `claude --from-pr`,还是使用与多个会话匹配的名称打开它。Claude Code 以从同一命令行启动新会话时的权限模式启动该会话,但以计划模式结束的会话会以计划模式恢复,除非您传递 `--permission-mode`、`--dangerously-skip-permissions` 或 `--fork-session`。不会恢复其他存储的权限模式。73* 启动时的会话选择器:您从[会话选择器](#use-the-session-picker)中选择的会话,无论您是单独使用 `claude --resume`、使用 `claude --from-pr`,还是使用与多个会话匹配的名称打开它。Claude Code 以从同一命令行启动新会话时的权限模式启动该会话,但以计划模式结束的会话会以计划模式恢复。如果您传递 `--permission-mode`、`--dangerously-skip-permissions` 或 `--fork-session`,Claude Code 不会恢复计划模式。不会恢复其他存储的权限模式。

87* 会话内的 `/resume`,带或不带参数:您切换到的对话继续使用您当前会话所在的权限模式,但以计划模式结束的对话会以计划模式恢复,即使您使用 `--permission-mode` 或 `--dangerously-skip-permissions` 启动了 Claude Code。如果该对话在本次运行 Claude Code 期间已经打开过,例如您开始时的对话,或您通过 `/clear` 或 `/resume` 离开的对话,则它会改为继续使用您当前的权限模式。74* 会话内的 `/resume`,带或不带参数:您切换到的对话继续使用您当前会话所在的权限模式,但以计划模式结束的对话会以计划模式恢复,即使您使用 `--permission-mode` 或 `--dangerously-skip-permissions` 启动了 Claude Code。如果该对话在本次运行 Claude Code 期间已经打开过,例如您开始时的对话,或您通过 `/clear` 或 `/resume` 离开的对话,则它会改为继续使用您当前的权限模式。

88 75 

76如果某条[拒绝规则](/docs/zh-CN/permissions#manage-permissions)移除了 [`ExitPlanMode`](/docs/zh-CN/tools-reference) 工具,Claude 就无法呈现计划以供批准,因此 Claude Code 不会恢复计划模式。会话以从同一命令行启动新会话时的权限模式启动。使用 `/resume` 时,对话继续使用您当前的权限模式。

77 

89在非交互式和 VS Code 路径上恢复计划模式需要 Claude Code v2.1.246 或更高版本。每一行列出会话结束时的权限模式、您通过终端、非交互式和 VS Code 中的哪条路径恢复它,以及 Claude Code 启动恢复会话时的权限模式。78在非交互式和 VS Code 路径上恢复计划模式需要 Claude Code v2.1.246 或更高版本。每一行列出会话结束时的权限模式、您通过终端、非交互式和 VS Code 中的哪条路径恢复它,以及 Claude Code 启动恢复会话时的权限模式。

90 79 

91| 会话结束于 | 您如何恢复 | 恢复后的权限模式 |80| 会话结束于 | 您如何恢复 | 恢复后的权限模式 |

92| :- | :- | :- |81| :- | :- | :- |

93| `bypassPermissions` | 终端 | 新会话会启动的权限模式。要再次[绕过权限](/docs/zh-CN/permission-modes#skip-all-checks-with-bypasspermissions-mode),请在启动时使用其启动标志之一,或在[用户、`--settings` 或托管设置](/docs/zh-CN/settings-reference#permissions-defaultmode)中使用 `permissions.defaultMode: "bypassPermissions"` 启用它 |82| `bypassPermissions` | 终端 | 新会话会启动的权限模式。要再次[绕过权限](/docs/zh-CN/permission-modes#skip-all-checks-with-bypasspermissions-mode),请在启动时使用其启动标志之一,或在[用户、`--settings` 或托管设置](/docs/zh-CN/settings-reference#permissions-defaultmode)中使用 `permissions.defaultMode: "bypassPermissions"` 启用它 |

94| `plan` | 终端 | 计划模式。使用 `--fork-session` 时,为新会话会启动的权限模式 |83| `plan` | 终端 | 计划模式。使用 `--fork-session` 时,为新会话会启动的权限模式 |

84| `plan` | 终端,当拒绝规则移除了 `ExitPlanMode` 时 | 新会话会启动的权限模式 |

95| `auto` | 终端 | `auto`,仅当您的帐户仍然满足[自动模式要求](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode)时 |85| `auto` | 终端 | `auto`,仅当您的帐户仍然满足[自动模式要求](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode)时 |

96| Manual | 终端 | 当新会话会因[内置默认值](/docs/zh-CN/permission-modes#which-mode-a-session-starts-in)以自动模式启动时,为手动模式。当来自设置文件的 `defaultMode` [生效](/docs/zh-CN/permission-modes#which-mode-a-session-starts-in)时,Claude Code 改为以该模式启动恢复的会话 |86| Manual | 终端 | 当新会话会因[内置默认值](/docs/zh-CN/permission-modes#which-mode-a-session-starts-in)以自动模式启动时,为手动模式。当来自设置文件的 `defaultMode` [生效](/docs/zh-CN/permission-modes#which-mode-a-session-starts-in)时,Claude Code 改为以该模式启动恢复的会话 |

97| `plan` | 非交互式,在[下面的条件](#resume-in-plan-mode-with-p)下 | 计划模式 |87| `plan` | 非交互式,在[下面的条件](#resume-in-plan-mode-with-p)下 | 计划模式 |


110* 您不传递 `--permission-mode` 或 `--dangerously-skip-permissions`100* 您不传递 `--permission-mode` 或 `--dangerously-skip-permissions`

111* 您不传递 `--fork-session`101* 您不传递 `--fork-session`

112* 运行不是通过[频道](/docs/zh-CN/channels)启动的102* 运行不是通过[频道](/docs/zh-CN/channels)启动的

103* 没有[拒绝规则](/docs/zh-CN/permissions#manage-permissions)移除 `ExitPlanMode` 工具

113 104 

114<h3 id="resume-from-a-summary">105<h3 id="resume-from-a-summary">

115 从摘要恢复106 从摘要恢复


117 108 

118在 Pro 或 Max 计划上,当您恢复已不活跃超过约一小时且超过 100,000 个 token 的会话时,Claude Code 会恢复对话,然后在您发送第一条消息之前打开一个对话框。到那时,会话的[提示缓存](/docs/zh-CN/prompt-caching#cache-lifetime)已过期,因此无论您选择对话框的哪个选项,下一个请求都会处理一次完整历史。109在 Pro 或 Max 计划上,当您恢复已不活跃超过约一小时且超过 100,000 个 token 的会话时,Claude Code 会恢复对话,然后在您发送第一条消息之前打开一个对话框。到那时,会话的[提示缓存](/docs/zh-CN/prompt-caching#cache-lifetime)已过期,因此无论您选择对话框的哪个选项,下一个请求都会处理一次完整历史。

119 110 

120对话框提供三种继续会话的方式。它们的区别在于各自向后续请求携带多少对话内容,这是在保留每个细节与每个请求发送更少 token 之间的权衡:111对话框提供三种继续会话的方式:

121 112 

122* **从摘要恢复**:立即运行 [`/compact`](/docs/zh-CN/context-window#what-survives-compaction)。Claude Code 针对完整历史发送一个摘要请求,然后用摘要、您最近的交互和最多五个最近读取的文件替换历史。后续请求携带摘要而不是完整历史。113* **从摘要恢复**:立即运行 [`/compact`](/docs/zh-CN/context-window#what-survives-compaction)。后续请求携带摘要而不是完整历史。

123* **按原样恢复完整会话**:加载未更改的对话。在您发送第一条消息后,Claude Code 重新处理并重新缓存完整历史,然后在缓存保持有效期间,后续请求从缓存中重新读取它。114* **按原样恢复完整会话**:加载未更改的对话。

124* **不再询问**:恢复完整会话,并在以后所有恢复中不再显示该对话框。115* **不再询问**:恢复完整会话,并在以后所有恢复中不再显示该对话框。

125 116 

126按原样恢复会保持对话的每个细节可用,每个请求的成本随对话的大小而增长。从摘要恢复在每个后续请求上成本更低,因为它携带摘要而不是完整历史,但摘要遗漏的任何内容都不再位于 Claude 的上下文中。请参阅[为什么长会话中的使用量会增加](/docs/zh-CN/costs#why-usage-climbs-in-a-long-session)了解该每个请求成本的来源。117按原样恢复会保持对话的每个细节可用,每个请求的成本随对话的大小而增长。从摘要恢复在每个后续请求上成本更低,因为它携带摘要而不是完整历史,但摘要遗漏的任何内容都不再位于 Claude 的上下文中。请参阅[为什么长会话中的使用量会增加](/docs/zh-CN/costs#why-usage-climbs-in-a-long-session)了解该每个请求成本的来源。


136 127 

137使用 `Ctrl+W` 扩展到仓库的所有 worktrees,或使用 `Ctrl+A` 扩展到此计算机上的每个项目。128使用 `Ctrl+W` 扩展到仓库的所有 worktrees,或使用 `Ctrl+A` 扩展到此计算机上的每个项目。

138 129 

139第一个提示词是 [`/loop`](/docs/zh-CN/scheduled-tasks#run-a-prompt-repeatedly-with-%2Floop) 命令的会话不会出现在选择器中,`claude --continue` 也会跳过它们。在对话中稍后运行 `/loop` 不会隐藏会话。在 v2.1.211 之前,在对话早期运行 `/loop` 会使该会话永久从选择器中隐藏。130<h4 id="/loop-p-agent-sdk-and-background-sessions">

131 `/loop`、`-p`、Agent SDK 和后台会话

132</h4>

133 

134第一个提示词是 [`/loop`](/docs/zh-CN/scheduled-tasks#run-a-prompt-repeatedly-with-%2Floop) 命令的会话不会出现在选择器中,`claude --continue` 也会跳过它们。在对话中稍后运行 `/loop` 不会隐藏会话。

135 

136Claude Code 将使用 [`claude -p`](/docs/zh-CN/headless) 或 [Agent SDK](/docs/zh-CN/agent-sdk/overview) 创建的会话排除在会话选择器和 `claude --continue` 之外。您仍然可以通过将其会话 ID 传递给 `claude --resume <session-id>` 来恢复它。当您运行 [`claude -p --continue`](/docs/zh-CN/headless#continue-conversations) 时,Claude Code 包括 `-p`、SDK 和 `/loop` 会话。

140 137 

141使用 [`/cd`](/docs/zh-CN/commands) 移动会话会将其重新定位到新目录的项目存储,因此之后它会出现在该目录的选择器中。从 v2.1.196 开始,移动的会话即使在崩溃或强制退出后也不会出现在旧目录的选择器中。在较早的版本中,当旧路径包含下划线等特殊字符时,在非正常退出后,它也可能重新出现在旧目录的列表中。138`claude --continue` 打开已完成的[后台会话](/docs/zh-CN/agent-view),但不打开仍在运行的会话;打开已完成的后台会话需要 Claude Code v2.1.257 或更高版本。如果您最近的对话是您[移到后台](/docs/zh-CN/agent-view#send-the-session-to-the-background)的会话,并且它仍在那里运行,Claude Code 会以 `Your most recent conversation is running in the background` 和该会话的 ID 退出。从 [`claude agents`](/docs/zh-CN/agent-view#attach-to-a-session) 附加到会话,或运行 `claude --resume` 选择另一个。

139 

140<h4 id="sessions-in-other-worktrees-and-projects">

141 其他 worktrees 和项目中的会话

142</h4>

142 143 

143从同一仓库的另一个 worktree 选择会话时,Claude Code 会在原地恢复它;当会话自己的 worktree 不再存在时,Claude Code 会[在您的当前目录中恢复它](/docs/zh-CN/worktrees#resume-a-worktree-session)。从不相关项目选择会话时,Claude Code 会改为将 `cd` 和恢复命令复制到您的剪贴板。如果该项目的目录不再存在,Claude Code 会在您的当前目录中恢复会话,而不是复制会失败的 `cd` 命令。144从同一仓库的另一个 worktree 选择会话时,Claude Code 会在原地恢复它;当会话自己的 worktree 不再存在时,Claude Code 会[在您的当前目录中恢复它](/docs/zh-CN/worktrees#resume-a-worktree-session)。从不相关项目选择会话时,Claude Code 会改为将 `cd` 和恢复命令复制到您的剪贴板。如果该项目的目录不再存在,Claude Code 会在您的当前目录中恢复会话,而不是复制会失败的 `cd` 命令。

144 145 

146使用 [`/cd`](/docs/zh-CN/commands) 移动会话会将其重新定位到新目录的项目存储,因此之后它会出现在该目录的选择器中。

147 

148<h4 id="resume-by-session-id-or-name">

149 按会话 ID 或名称恢复

150</h4>

151 

152您可以从任何目录运行 `claude --resume <session-id>`,因此可以恢复在其他地方启动或使用 [`/cd`](/docs/zh-CN/commands) 移动过的会话。Claude Code 按以下顺序查找该 ID:

153 

1541. 当前项目目录及其 git worktrees

1552. 此计算机上的所有其他项目

156 

157跨项目搜索仅在恰好一个其他项目持有具有该 ID 的消息的会话记录时解析 ID,因此手动复制的重复项会导致 Claude Code 报告未找到,而不是恢复任意副本。如果没有存储的会话与 ID 匹配,Claude Code 会报告 `No conversation found with session ID: <session-id>`。

158 

145按名称恢复会在当前仓库及其 worktrees 范围内解析。两种形式都会查找精确匹配并直接恢复,即使它位于不同的 worktree 中:159按名称恢复会在当前仓库及其 worktrees 范围内解析。两种形式都会查找精确匹配并直接恢复,即使它位于不同的 worktree 中:

146 160 

147| 命令 | 精确匹配 | 模糊名称 |161| 命令 | 精确匹配 | 模糊名称 |


166 180 

167通过 CLI 路由或从 claude.ai 命名会话后,使用 `claude --resume <name>` 或 `/resume <name>` 返回到它;桌面应用会话在 [桌面应用](/docs/zh-CN/desktop#work-in-parallel-with-sessions) 中恢复。有关名称解析如何跨 worktrees 工作的信息,请参阅[恢复会话](#resume-a-session)。181通过 CLI 路由或从 claude.ai 命名会话后,使用 `claude --resume <name>` 或 `/resume <name>` 返回到它;桌面应用会话在 [桌面应用](/docs/zh-CN/desktop#work-in-parallel-with-sessions) 中恢复。有关名称解析如何跨 worktrees 工作的信息,请参阅[恢复会话](#resume-a-session)。

168 182 

169当您使用此计算机上另一个活跃会话已经使用的名称启动或恢复交互式会话,或将会话重命名为这样的名称时,Claude Code 会将该名称保留给已经拥有它的会话,将您的会话重命名为带有两个单词后缀的变体,例如 `auth-refactor-graceful-unicorn`,并告知您。如果您想自己选择一个名称,请使用新名称运行 `/rename`。在 v2.1.232 之前,两个会话都保留该名称。

170 

171在三种情况下,Claude Code 不会重命名重复项,因此您仍然可以在列表中看到两个具有相同名称的会话:

172 

173* 它不检查 AI 生成的标题或默认显示名称。

174* 它不检查启动时 [后台](/docs/zh-CN/agent-view#from-your-shell) 或 `-p` 会话的 `--name`。

175* 它无法重命名早期版本 Claude Code 上的会话。

176 

177您未命名的会话仍会获得 Claude Code 分配的两个标签。只有生成的标题可用作恢复句柄:183您未命名的会话仍会获得 Claude Code 分配的两个标签。只有生成的标题可用作恢复句柄:

178 184 

179* 默认显示名称:您从未命名的交互式会话在启动时仍会获得默认显示名称。需要 Claude Code v2.1.196 或更高版本。默认名称将工作目录的名称与两个字符的后缀组合在一起,例如 `my-app-3f`,并在运行会话的列表中标识会话,例如 [agent view](/docs/zh-CN/agent-view) 和 `claude agents --json` 输出。默认名称不是恢复句柄。如果您将其传递给 `claude --resume` 或 `/resume`,Claude Code 不会找到该会话。命名会话会替换这些列表中的默认名称,接受计划也会这样做。185* 默认显示名称:您从未命名的交互式会话在启动时仍会获得默认显示名称。需要 Claude Code v2.1.196 或更高版本。默认名称将工作目录的名称与两个字符的后缀组合在一起,例如 `my-app-3f`,并在运行会话的列表中标识会话,例如 [agent view](/docs/zh-CN/agent-view) 和 `claude agents --json` 输出。默认名称不是恢复句柄。如果您将其传递给 `claude --resume` 或 `/resume`,Claude Code 不会找到该会话。

180* 生成的标题:如果您不命名会话,Claude Code 会为其生成会话标题。该标题是您第一个提示的简短摘要,由对小型/快速模型(通常是 Haiku 级别的模型)的后台请求编写。您直接从 shell 或脚本启动的 `claude -p` 运行不会获得一个。186* 生成的标题:如果您不命名会话,Claude Code 会为其生成会话标题。该标题是您第一个提示的简短摘要,由对小型/快速模型(通常是 Haiku 级别的模型)的后台请求编写。您直接从 shell 或脚本启动的 `claude -p` 运行不会获得一个。

181 187 

182 接受计划会将生成的标题替换为基于计划的标题。命名会话也会替换它。188 接受计划会将生成的标题替换为基于计划的标题。您可以将任一标题传递给 `claude --resume` 或 `/resume`,Claude Code 会以与您设置的名称相同的方式解析它。

183 

184 您可以在 [会话选择器](#use-the-session-picker) 中和未设置名称时的状态行 [`session_name`](/docs/zh-CN/statusline) 字段中看到第一个提示标题。计划标题显示在相同的两个位置,也显示在运行会话的列表中,其中它取代了默认显示名称。

185 

186 您可以将任一标题传递给 `claude --resume` 或 `/resume`,Claude Code 会以与您设置的名称相同的方式解析它。

187 189 

188<h2 id="use-the-session-picker">190<h2 id="use-the-session-picker">

189 使用会话选择器191 使用会话选择器


205| `Ctrl+B` | 过滤到当前 git 分支的会话。再次按下以显示所有分支 |207| `Ctrl+B` | 过滤到当前 git 分支的会话。再次按下以显示所有分支 |

206| `Esc` | 退出会话选择器或搜索模式 |208| `Esc` | 退出会话选择器或搜索模式 |

207 209 

208每行显示会话名称(如果已设置),否则显示 AI 生成的会话标题、对话摘要或第一个提示,以及自上次活动以来的时间、git 分支和文件大小。使用 `Ctrl+A` 扩展到所有项目后,还会显示每个会话的项目路径。210每行显示会话名称(如果已设置),否则显示 AI 生成的会话标题、对话摘要或第一个提示词,以及自上次活动以来的时间、git 分支和文件大小。

209 211 

210使用 `/branch` 或 `--fork-session` 创建的会话会获得自己的会话 ID 并显示为单独的行。当选择器为同一会话找到多个条目时,它会将它们分组在单个行下。按 `→` 展开一个组。212使用 `/branch` 或 `--fork-session` 创建的会话会获得自己的会话 ID 并显示为单独的行。当选择器为同一会话找到多个条目时,它会将它们分组在单个行下。按 `→` 展开一个组。

211 213 


223/branch try-streaming-approach225/branch try-streaming-approach

224```226```

225 227 

226如果您省略名称,Claude Code 会根据对话中的第一个提示为新分支命名。从 v2.1.198 开始,这也适用于 [compaction](/docs/zh-CN/how-claude-code-works#when-context-fills-up) 之后;较早的版本会回退到字面名称 `Branched conversation`,而不是查看 compaction 摘要之外的原始第一个提示。228如果您省略名称,Claude Code 会根据对话中的第一个提示词为新分支命名。

227 229 

228从命令行,将 `--continue` 或 `--resume` 与 `--fork-session` 结合:230从命令行,将 `--continue` 或 `--resume` 与 `--fork-session` 结合:

229 231 


250 252 

251这些命令控制上下文窗口中的内容而不离开会话:253这些命令控制上下文窗口中的内容而不离开会话:

252 254 

253* **`/clear`**:以空上下文重新开始。Claude Code 保存之前的对话;可通过 `/resume` 恢复它,或在同一个 Claude Code 进程中,从[倒带菜单的上一个会话条目](/docs/zh-CN/checkpointing#rewind-past-a-cleared-conversation)恢复。不带参数时,新对话保留您使用 `--name` 或 `/rename` 设置的名称,但不保留 AI 生成的会话标题。要为您要离开的对话命名,请传递名称,如 `/clear release-prep`;新对话随后将以未命名状态开始255* **`/clear`**:以空上下文重新开始。Claude Code 保存之前的会话;可通过 `/resume` 恢复它,或在同一个 Claude Code 进程中,从[倒带菜单的上一个会话条目](/docs/zh-CN/checkpointing#rewind-past-a-cleared-conversation)恢复。不带参数时,新会话保留您使用 `--name` 或 `/rename` 设置的名称,但不保留 AI 生成的会话标题。若要改为给您即将离开的会话命名,请传递名称,如 `/clear release-prep`;新会话随后将以未命名状态开始

254* **`/compact [instructions]`**:用摘要替换历史记录,可选地专注于您指定的内容256* **`/compact [instructions]`**:用摘要替换历史记录,可选地专注于您指定的内容

255* **`/context`**:显示当前消耗的上下文257* **`/context`**:显示当前消耗的上下文

256 258 

settings.md +2 −2

Details

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 或更高版本。对于从桌面应用启动的 worktree 会话,请参阅[worktree 与主检出共享的内容](/docs/zh-CN/worktrees#what-worktrees-share-with-the-main-checkout)。

499 499 

500<span id="managed-settings-delivery" />500<span id="managed-settings-delivery" />

501 501 


767 767 

768两件事阻止 `.claude/settings.json` 中的键为克隆它的每个人应用:768两件事阻止 `.claude/settings.json` 中的键为克隆它的每个人应用:

769 769 

770* **Claude Code 忽略仓库文件中的键。** 在[设置索引](/docs/zh-CN/settings-reference#settings-index)的作用域列中查找 `User, local, or managed`、`User or managed`、`Managed` 或 `Global config`。这些键永远不会从共享文件应用,除了少数几个仓库文件仍然可以关闭的。每个这些条目在其作用域行上说明。`Global config` 键仅从 `~/.claude.json` 应用。770* **Claude Code 忽略仓库文件中的键。** 在[设置索引](/docs/zh-CN/settings-reference#settings-index)的作用域列中查找 `User, local, or managed`、`User or managed`、`User`、`Managed` 或 `Global config`。这些键永远不会从共享文件应用,除了少数几个仓库文件仍然可以关闭的。每个这些条目在其作用域行上说明。`Global config` 键仅从 `~/.claude.json` 应用。

771 771 

772 在 `env` 键内,遥测导出变量也永远不会从共享文件应用,除了少数关闭值;请参阅[Claude Code 在 `env` 中忽略的变量](/docs/zh-CN/settings-reference#variables-claude-code-ignores-in-env)。772 在 `env` 键内,遥测导出变量也永远不会从共享文件应用,除了少数关闭值;请参阅[Claude Code 在 `env` 中忽略的变量](/docs/zh-CN/settings-reference#variables-claude-code-ignores-in-env)。

773* **键等待信任。** `permissions.allow` 规则、`permissions.additionalDirectories`、`extraKnownMarketplaces` 和大多数 [`env`](/docs/zh-CN/settings-reference#env) 值仅在每个队友[信任文件夹](/docs/zh-CN/permissions#project-allow-rules-and-workspace-trust)后应用。在那之前他们仍然看到提示并不从文件声明的市场获得插件。`deny` 和 `ask` 规则立即应用。773* **键等待信任。** `permissions.allow` 规则、`permissions.additionalDirectories`、`extraKnownMarketplaces` 和大多数 [`env`](/docs/zh-CN/settings-reference#env) 值仅在每个队友[信任文件夹](/docs/zh-CN/permissions#project-allow-rules-and-workspace-trust)后应用。在那之前他们仍然看到提示并不从文件声明的市场获得插件。`deny` 和 `ask` 规则立即应用。

Details

582<ReferenceFilter582<ReferenceFilter

583 noun="settings"583 noun="settings"

584 placeholder="按键或用途筛选设置"584 placeholder="按键或用途筛选设置"

585 facetOrder={{ scope: ["Any file", "User, local, or managed", "User or managed", "Managed", "Global config"] }}585 facetOrder={{ scope: ["Any file", "User, local, or managed", "User or managed", "User", "Managed", "Global config"] }}

586 columnHelp={{586 columnHelp={{

587topic: "本页面中包含该条目的部分。使用排序方式按主题对表格进行分组。",587topic: "本页面中包含该条目的部分。使用排序方式按主题对表格进行分组。",

588scope: "哪些设置文件可以设置该键:用户 (~/.claude/settings.json)、项目 (.claude/settings.json)、本地 (.claude/settings.local.json) 或托管(由您的组织部署)。全局配置键位于 ~/.claude.json 中。",588scope: "哪些设置文件可以设置该键:用户 (~/.claude/settings.json)、项目 (.claude/settings.json)、本地 (.claude/settings.local.json) 或托管(由您的组织部署)。全局配置键位于 ~/.claude.json 中。",


638| [`claudeMdExcludes`](#claudemdexcludes) | 在内存加载时跳过特定的 [CLAUDE.md](/docs/zh-CN/memory#exclude-specific-claude-md-files) 文件 | 内存和上下文 | Any file |638| [`claudeMdExcludes`](#claudemdexcludes) | 在内存加载时跳过特定的 [CLAUDE.md](/docs/zh-CN/memory#exclude-specific-claude-md-files) 文件 | 内存和上下文 | Any file |

639| [`cleanupPeriodDays`](#cleanupperioddays) | 选择 Claude Code 在删除[记录](/docs/zh-CN/data-usage#data-retention)之前保留多少天 | 隐私和遥测 | Any file |639| [`cleanupPeriodDays`](#cleanupperioddays) | 选择 Claude Code 在删除[记录](/docs/zh-CN/data-usage#data-retention)之前保留多少天 | 隐私和遥测 | Any file |

640| [`companyAnnouncements`](#companyannouncements) | 在启动时显示您的组织的公告 | 界面和终端 | Any file |640| [`companyAnnouncements`](#companyannouncements) | 在启动时显示您的组织的公告 | 界面和终端 | Any file |

641| [`copyFullResponse`](#copyfullresponse) | 使 [`/copy`](/docs/zh-CN/commands) 复制完整响应而不显示代码块选择器 | 全局配置设置 | Global config |641| [`copyFullResponse`](#copyfullresponse) | 使 [`/copy`](/docs/zh-CN/commands) 复制完整回复而不显示选择器 | 全局配置设置 | Global config |

642| [`copyOnSelect`](#copyonselect) | 关闭在[全屏渲染](/docs/zh-CN/fullscreen#use-the-mouse)和代理视图中用鼠标选择的文本的自动复制 | 全局配置设置 | Global config |642| [`copyOnSelect`](#copyonselect) | 关闭在[全屏渲染](/docs/zh-CN/fullscreen#use-the-mouse)和代理视图中用鼠标选择的文本的自动复制 | 全局配置设置 | Global config |

643| [`crossSessionInbound`](#crosssessioninbound) | 选择 Claude Code 是否传递[来自您其他会话的消息](/docs/zh-CN/cross-session-messaging#control-inbound-messages)、显示通知而不传递它们,或拒绝它们 | 代理、会话和工作树 | Any file |643| [`crossSessionInbound`](#crosssessioninbound) | 选择 Claude Code 是否传递[来自您其他会话的消息](/docs/zh-CN/cross-session-messaging#control-inbound-messages)、显示通知而不传递它们,或拒绝它们 | 代理、会话和工作树 | Any file |

644| [`defaultShell`](#defaultshell) | 选择 Bash 或 PowerShell 是否运行您使用 [`!` 前缀](/docs/zh-CN/interactive-mode#shell-mode-with-prefix)键入的 shell 命令 | 界面和终端 | Any file |644| [`defaultShell`](#defaultshell) | 选择 Bash 或 PowerShell 是否运行您使用 [`!` 前缀](/docs/zh-CN/interactive-mode#shell-mode-with-prefix)键入的 shell 命令 | 界面和终端 | Any file |


684| [`fileCheckpointingEnabled`](#filecheckpointingenabled) | 打开或关闭 [`/rewind`](/docs/zh-CN/checkpointing) 恢复的文件快照 | 内存和上下文 | Any file |684| [`fileCheckpointingEnabled`](#filecheckpointingenabled) | 打开或关闭 [`/rewind`](/docs/zh-CN/checkpointing) 恢复的文件快照 | 内存和上下文 | Any file |

685| [`fileSuggestion`](#filesuggestion) | 从您自己的命令提供 [`@` 文件自动完成](/docs/zh-CN/interactive-mode#quick-commands) | 界面和终端 | Any file |685| [`fileSuggestion`](#filesuggestion) | 从您自己的命令提供 [`@` 文件自动完成](/docs/zh-CN/interactive-mode#quick-commands) | 界面和终端 | Any file |

686| [`footerLinksRegexes`](#footerlinksregexes) | 将输出中的问题或审查 ID 变成输入框下方的[可点击链接](/docs/zh-CN/statusline#clickable-links) | 界面和终端 | User or managed |686| [`footerLinksRegexes`](#footerlinksregexes) | 将输出中的问题或审查 ID 变成输入框下方的[可点击链接](/docs/zh-CN/statusline#clickable-links) | 界面和终端 | User or managed |

687| [`forceLoginGatewayUrl`](#forcelogingatewayurl) | 设置登录屏幕连接到的[网关 URL](/docs/zh-CN/claude-apps-gateway#set-the-gateway-url) | 身份验证和提供商 | Managed |687| [`forceLoginGatewayUrl`](#forcelogingatewayurl) | 设置登录屏幕连接到的[网关 URL](/docs/zh-CN/claude-apps-gateway#set-the-gateway-url) | 身份验证和提供商 | User or managed |

688| [`forceLoginMethod`](#forceloginmethod) | [限制登录](/docs/zh-CN/authentication#restrict-login-to-your-organization)到 claude.ai、Claude Console 或[云网关](/docs/zh-CN/claude-apps-gateway) | 身份验证和提供商 | Any file |688| [`forceLoginMethod`](#forceloginmethod) | [限制登录](/docs/zh-CN/authentication#restrict-login-to-your-organization)到 claude.ai、Claude Console 或[云网关](/docs/zh-CN/claude-apps-gateway) | 身份验证和提供商 | Any file |

689| [`forceLoginOrgUUID`](#forceloginorguuid) | [将 claude.ai 登录固定到您的组织](/docs/zh-CN/authentication#restrict-login-to-your-organization);仅托管源强制执行 | 身份验证和提供商 | Any file |689| [`forceLoginOrgUUID`](#forceloginorguuid) | [将 claude.ai 登录固定到您的组织](/docs/zh-CN/authentication#restrict-login-to-your-organization);仅托管源强制执行 | 身份验证和提供商 | Any file |

690| [`forceRemoteSettingsRefresh`](#forceremotesettingsrefresh) | 阻止启动,直到[服务器托管设置](/docs/zh-CN/server-managed-settings)被新鲜获取 | 企业和托管设置 | Managed |690| [`forceRemoteSettingsRefresh`](#forceremotesettingsrefresh) | 阻止启动,直到[服务器托管设置](/docs/zh-CN/server-managed-settings)被新鲜获取 | 企业和托管设置 | Managed |


831| [`worktree`](#worktree) | 配置 Claude Code 如何创建 git [worktrees](/docs/zh-CN/worktrees) | 代理、会话和工作树 | Any file |831| [`worktree`](#worktree) | 配置 Claude Code 如何创建 git [worktrees](/docs/zh-CN/worktrees) | 代理、会话和工作树 | Any file |

832| [`worktree.baseRef`](#worktree-baseref) | 从远程默认分支或本地 HEAD 分支新[worktrees](/docs/zh-CN/worktrees) | 代理、会话和工作树 | Any file |832| [`worktree.baseRef`](#worktree-baseref) | 从远程默认分支或本地 HEAD 分支新[worktrees](/docs/zh-CN/worktrees) | 代理、会话和工作树 | Any file |

833| [`worktree.bgIsolation`](#worktree-bgisolation) | 让后台会话编辑工作副本而无需[worktree](/docs/zh-CN/worktrees) | 代理、会话和工作树 | Any file |833| [`worktree.bgIsolation`](#worktree-bgisolation) | 让后台会话编辑工作副本而无需[worktree](/docs/zh-CN/worktrees) | 代理、会话和工作树 | Any file |

834| [`worktree.location`](#worktree-location) | 选择 [Desktop SSH 会话](/docs/zh-CN/desktop#ssh-sessions)在远程机器上创建 worktree 的位置 | Agent、会话和 worktree | User |

834| [`worktree.sparsePaths`](#worktree-sparsepaths) | 在每个[worktree](/docs/zh-CN/worktrees)中仅检出您需要的目录 | 代理、会话和工作树 | Any file |835| [`worktree.sparsePaths`](#worktree-sparsepaths) | 在每个[worktree](/docs/zh-CN/worktrees)中仅检出您需要的目录 | 代理、会话和工作树 | Any file |

835| [`worktree.symlinkDirectories`](#worktree-symlinkdirectories) | 将大型目录符号链接到每个[worktree](/docs/zh-CN/worktrees)中,而不是复制它们 | 代理、会话和工作树 | Any file |836| [`worktree.symlinkDirectories`](#worktree-symlinkdirectories) | 将大型目录符号链接到每个[worktree](/docs/zh-CN/worktrees)中,而不是复制它们 | 代理、会话和工作树 | Any file |

836| [`wslInheritsWindowsSettings`](#wslinheritswindowssettings) | 让 WSL 从 Windows 策略链读取[托管设置](/docs/zh-CN/managed-settings) | 企业和托管设置 | Managed |837| [`wslInheritsWindowsSettings`](#wslinheritswindowssettings) | 让 WSL 从 Windows 策略链读取[托管设置](/docs/zh-CN/managed-settings) | 企业和托管设置 | Managed |


1763 * `"acceptEdits"`: Claude Code 还运行文件编辑和常见文件系统命令(如 `mkdir` 和 `mv`)而不询问1764 * `"acceptEdits"`: Claude Code 还运行文件编辑和常见文件系统命令(如 `mkdir` 和 `mv`)而不询问

1764 * `"plan"`: Claude Code 读取和规划但阻止编辑直到您批准计划1765 * `"plan"`: Claude Code 读取和规划但阻止编辑直到您批准计划

1765 * `"auto"`: Claude Code 运行而不进行常规提示;在 shell 命令和网络请求等操作运行之前,后台分类器检查它们是否与您的请求一致1766 * `"auto"`: Claude Code 运行而不进行常规提示;在 shell 命令和网络请求等操作运行之前,后台分类器检查它们是否与您的请求一致

1766 * `"dontAsk"`: Claude Code 自动拒绝每个本应提示的调用;读取、不需要批准的其他操作以及预批准的工具仍然运行1767 * `"dontAsk"`: Claude Code 自动拒绝每个本应提示的调用;工作目录内的文件读取、不需要批准的其他操作以及预批准的工具仍然运行,但从[网络路径](/docs/zh-CN/permissions#network-paths)的读取除外

1767 * `"bypassPermissions"`: Claude Code 运行所有内容而不询问1768 * `"bypassPermissions"`: Claude Code 运行所有内容而不询问

1768 * `"manual"`: `"default"` 的别名1769 * `"manual"`: `"default"` 的别名

1769* **默认值**: 未设置1770* **默认值**: 未设置


2398 2399 

2399* `files` 或 `envVars` 中仍有有效 `path` 或 `name` 和 `mask` 或 `deny` 的 `mode` 的条目,例如其 `extract` 模式没有捕获组的条目,降级为 `mode: "deny"` 并带有警告,因此凭证保持阻止,而不是掩盖,直到您修复条目。降级的 `files` 条目像显式 `deny` 条目一样固定 [`filesystem.disabled`](/docs/zh-CN/sandboxing#disable-filesystem-isolation),警告注意如果托管设置关闭文件系统隔离,其读取块不被强制执行。2400* `files` 或 `envVars` 中仍有有效 `path` 或 `name` 和 `mask` 或 `deny` 的 `mode` 的条目,例如其 `extract` 模式没有捕获组的条目,降级为 `mode: "deny"` 并带有警告,因此凭证保持阻止,而不是掩盖,直到您修复条目。降级的 `files` 条目像显式 `deny` 条目一样固定 [`filesystem.disabled`](/docs/zh-CN/sandboxing#disable-filesystem-isolation),警告注意如果托管设置关闭文件系统隔离,其读取块不被强制执行。

2400* 具有未知 `mode` 或无效 `path` 或 `name` 的条目被删除。2401* 具有未知 `mode` 或无效 `path` 或 `name` 的条目被删除。

2401* 每种情况都会警告;无论条目是降级还是删除,其余有效条目仍然被强制执行,完全无效的 `credentials` 值被删除,同时 `sandbox` 的其余部分仍然适用。2402* 每种情况都会警告;无论条目是降级还是删除,其余有效条目仍然被强制执行。

2402 2403 

2403适用于 v2.1.191 及更高版本;在 v2.1.221 之前,每个无效条目都被删除。对于其他具有每字段处理的托管键,请参阅 [Invalid entries in managed settings](/docs/zh-CN/managed-settings#invalid-entries-in-managed-settings)。2404适用于 v2.1.191 及更高版本;在 v2.1.221 之前,每个无效条目都被删除。对于其他具有每字段处理的托管键,请参阅 [Invalid entries in managed settings](/docs/zh-CN/managed-settings#invalid-entries-in-managed-settings)。

2404 2405 


5681 5682 

5682在 git 存储库之外,失败的 [`WorktreeCreate` hook](/docs/zh-CN/worktrees#non-git-version-control) 释放块,以便会话可以就地编辑工作目录;该释放需要 Claude Code v2.1.203 或更高版本。5683在 git 存储库之外,失败的 [`WorktreeCreate` hook](/docs/zh-CN/worktrees#non-git-version-control) 释放块,以便会话可以就地编辑工作目录;该释放需要 Claude Code v2.1.203 或更高版本。

5683 5684 

5685<h3 id="worktree-location">

5686 `worktree.location`

5687</h3>

5688 

5689选择 [Desktop SSH 会话](/docs/zh-CN/desktop#choose-where-ssh-session-worktrees-go) 在远程机器上创建 worktree 的文件夹,以替代 `<project-root>/.claude/worktrees/`。只有桌面应用会读取此键:`--worktree`、`EnterWorktree` 工具、隔离的子代理和后台会话都会忽略它。需要 Claude Desktop v1.44121.0 或更高版本。

5690 

5691* **Scope**: [`User`](#scopes),位于远程机器上的 `~/.claude/settings.json` 中

5692* **Type**: string,绝对路径或以 `~/` 开头的路径

5693* **Default**: 未设置,因此 worktree 位于项目内

5694 

5695此示例将文件夹设置为 `~/worktrees`:

5696 

5697```json settings.json theme={null}

5698{

5699 "worktree": {

5700 "location": "~/worktrees"

5701 }

5702}

5703```

5704 

5705在 Desktop 中为 SSH 连接设置的 **Worktree folder** 优先于此键。如果您的组织限制了会话可以使用的文件夹,Desktop 会将 worktree 保留在项目内。

5706 

5684<h2 id="remote-desktop-and-notifications">5707<h2 id="remote-desktop-and-notifications">

5685 远程、桌面和通知5708 远程、桌面和通知

5686</h2>5709</h2>


5813 `enableArtifact`5836 `enableArtifact`

5814</h3>5837</h3>

5815 5838 

5816关闭 [Artifact](/docs/zh-CN/artifacts) 工具,该工具将会话输出发布为 claude.ai 上的私有网页。当你在 `/config` 中关闭**Artifacts** 行时,Claude Code 会将此键写入你的用户设置,因此你通常不需要手动编辑它。需要 Claude Code v2.1.196 或更高版本。5839关闭 [Artifact](/docs/zh-CN/artifacts) 工具,该工具将会话输出发布为 claude.ai 上的私有网页。当您在 `/config` 中关闭**Artifacts** 行时,Claude Code 会将此键写入您的用户设置,因此通常不需要手动编辑它。

5817 5840 

5818* **作用域**: [`任何文件`](#scopes)。每个文件都可以关闭工具,但没有文件可以将其打开。5841* **作用域**: [`任何文件`](#scopes)。每个文件都可以关闭工具,但没有文件可以将其打开。

5819* **类型**: 布尔值5842* **类型**: 布尔值


5920 `sshConfigs`5943 `sshConfigs`

5921</h3>5944</h3>

5922 5945 

5923将 SSH 连接添加到[桌面](/docs/zh-CN/desktop#pre-configure-ssh-connections-for-your-team)环境下拉列表。管理员使用它向团队分发共享连接。你在托管设置中定义的连接显示为托管,因此用户可以选择它们,但无法在应用中编辑或删除它们。5946将 SSH 连接添加到[桌面](/docs/zh-CN/desktop#pre-configure-ssh-connections-for-your-team)环境下拉列表。管理员使用它向团队分发共享连接。您在托管设置中定义的连接显示为托管。用户可以选择它们,并为其[设置自己的 **Worktree folder**](/docs/zh-CN/desktop#choose-where-ssh-session-worktrees-go),但无法在应用中编辑其他任何内容或删除它们。

5924 5947 

5925* **作用域**: [`用户或托管`](#scopes)。桌面应用读取此键。默认情况下,它从[一个托管源](/docs/zh-CN/managed-settings#how-claude-code-combines-managed-sources)读取托管连接。5948* **作用域**: [`用户或托管`](#scopes)。桌面应用读取此键。默认情况下,它从[一个托管源](/docs/zh-CN/managed-settings#how-claude-code-combines-managed-sources)读取托管连接。

5926* **类型**: 对象数组,每个都有必需的 `id`、`name` 和 `sshHost` 以及可选的 `sshPort` 和 `sshIdentityFile`5949* **类型**: 对象数组,每个都有必需的 `id`、`name` 和 `sshHost` 以及可选的 `sshPort` 和 `sshIdentityFile`


6085 6108 

6086限制人们可以使用哪种帐户登录。设置 `"claudeai"` 以仅允许 claude.ai 帐户,设置 `"console"` 以仅允许 Claude Console 帐户,或设置 `"gateway"` 以将人们引导至 [cloud gateway](/docs/zh-CN/claude-apps-gateway) 而不是第一方登录。管理员在托管设置中设置它,并将其与 [`forceLoginOrgUUID`](#forceloginorguuid) 配合使用,以将开发人员的 claude.ai 登录限制在一个组织内。如果您在任何设置文件中将其设置为 `"claudeai"` 或 `"console"`,Claude Code 也会在该文件适用的会话中停止提供[无密钥 Console 登录](/docs/zh-CN/authentication#sign-in-without-an-api-key)。6109限制人们可以使用哪种帐户登录。设置 `"claudeai"` 以仅允许 claude.ai 帐户,设置 `"console"` 以仅允许 Claude Console 帐户,或设置 `"gateway"` 以将人们引导至 [cloud gateway](/docs/zh-CN/claude-apps-gateway) 而不是第一方登录。管理员在托管设置中设置它,并将其与 [`forceLoginOrgUUID`](#forceloginorguuid) 配合使用,以将开发人员的 claude.ai 登录限制在一个组织内。如果您在任何设置文件中将其设置为 `"claudeai"` 或 `"console"`,Claude Code 也会在该文件适用的会话中停止提供[无密钥 Console 登录](/docs/zh-CN/authentication#sign-in-without-an-api-key)。

6087 6110 

6088* **Scope**: [`Any file`](#scopes)。Claude Code 仅接受来自机器上托管源(`managed-settings.json`、macOS plist 或 Windows HKLM 注册表或策略辅助程序)的 `"gateway"`。它在用户、项目、本地、HKCU 和服务器托管设置中将 `"gateway"` 视为未设置,与 [`forceLoginGatewayUrl`](#forcelogingatewayurl) 的规则相同。6111* **Scope**: [`Any file`](#scopes)。Claude Code 接受来自与 [`forceLoginGatewayUrl`](#forcelogingatewayurl) 相同来源的 `"gateway"`,在其他任何位置都将其视为未设置。

6089* **Type**: string,以下之一:6112* **Type**: string,以下之一:

6090 * `"claudeai"`:仅 claude.ai 帐户可以登录6113 * `"claudeai"`:仅 claude.ai 帐户可以登录

6091 * `"console"`:仅 Claude Console 帐户可以登录6114 * `"console"`:仅 Claude Console 帐户可以登录


6108 6131 

6109设置 `/login` Cloud gateway 屏幕连接到的网关 URL,以便人们无需输入地址即可访问您的 [cloud gateway](/docs/zh-CN/claude-apps-gateway)。该屏幕没有 URL 字段:设置此设置项后,它会显示您的网关 URL,并在用户按 Enter 时连接;未设置时,它会告诉用户联系其 IT 管理员。6132设置 `/login` Cloud gateway 屏幕连接到的网关 URL,以便人们无需输入地址即可访问您的 [cloud gateway](/docs/zh-CN/claude-apps-gateway)。该屏幕没有 URL 字段:设置此设置项后,它会显示您的网关 URL,并在用户按 Enter 时连接;未设置时,它会告诉用户联系其 IT 管理员。

6110 6133 

6111此设置项或 `forceLoginMethod: "gateway"` 都会使机器仅限网关,但使用 `CLAUDE_CODE_USE_*` 选择云提供商的会话除外。此时 `/login` 会直接打开 Cloud gateway 屏幕,没有登录方法选择器。请参阅[管理员策略需要 Cloud gateway 登录](/docs/zh-CN/errors#administrator-policy-requires-a-cloud-gateway-sign-in),了解遗留的第一方登录或 API 密钥会发生什么。请同时设置这两个设置项,以便屏幕能够连接而不是显示错误。6134在托管设置中,此设置项或 `forceLoginMethod: "gateway"` 都会使机器仅限网关,但使用 `CLAUDE_CODE_USE_*` 选择云提供商的会话除外。此时 `/login` 会直接打开 Cloud gateway 屏幕,没有登录方法选择器。请参阅[管理员策略需要 Cloud gateway 登录](/docs/zh-CN/errors#administrator-policy-requires-a-cloud-gateway-sign-in),了解遗留的第一方登录或 API 密钥会发生什么。请同时设置这两个设置项,以便屏幕能够连接而不是显示错误。

6112 6135 

6113* **Scope**: [`Managed`](#scopes)。仅从机器上的源读取:`managed-settings.json`、macOS plist 或 Windows HKLM 注册表或策略辅助程序。Claude Code 在 HKCU 和服务器托管设置中忽略它。6136* **Scope**: [`User or managed`](#scopes)。从机器上的托管源读取:`managed-settings.json`、macOS plist 或 Windows HKLM 注册表或策略辅助程序。在没有上述任何来源的机器上,Claude Code v2.1.295 或更高版本还会从[用户设置](/docs/zh-CN/claude-apps-gateway#set-the-gateway-url-in-user-settings)中读取它。Claude Code 在 HKCU 和服务器托管设置中忽略它。

6114* **Type**: string,包含协议方案的完整 URL6137* **Type**: string,包含协议方案的完整 URL

6115* **Default**: 未设置,因此 Cloud gateway 屏幕显示错误,告诉人们联系其 IT 管理员6138* **Default**: 未设置,因此 Cloud gateway 屏幕显示错误,告诉人们联系其 IT 管理员

6116 6139 


6140}6163}

6141```6164```

6142 6165 

6143如果托管源设置了空数组或 Claude Code 无法解析的值,Claude Code 会以配置错误消息阻止所有登录。6166如果托管源设置了空数组,或设置的值既不是字符串也不是字符串数组,使用 Anthropic 帐户登录的用户将无法启动 Claude Code 或完成登录。他们会看到一条消息,其中指明 `forceLoginOrgUUID` 并告知他们联系管理员。而输出错误类型值的 [`policyHelper`](#policyhelper) 则会[运行失败](#helper-failures)。

6144 6167 

6145请参阅[限制登录到您的组织](/docs/zh-CN/authentication#restrict-login-to-your-organization),了解 Claude Code 如何处理 Claude Console 登录、其他登录路径和环境凭据。6168请参阅[限制登录到您的组织](/docs/zh-CN/authentication#restrict-login-to-your-organization),了解 Claude Code 如何处理 Claude Console 登录、其他登录路径和环境凭据。

6146 6169 


6806 `copyFullResponse`6829 `copyFullResponse`

6807</h3>6830</h3>

6808 6831 

6809使 [`/copy`](/docs/zh-CN/commands) 每次都复制完整响应,而不显示当响应包含代码块时通常显示的选择器。在该选择器中选择**始终复制完整响应**会将此键设置为 `true`。在 `/config` 中显示为**跳过 /copy 选择器**。6832使 [`/copy`](/docs/zh-CN/commands) 每次都复制完整回复,而不显示选择器。在该选择器中选择**始终复制完整回复**会将此键设置为 `true`。在 `/config` 中显示为**跳过 /copy 选择器**。

6810 6833 

6811* **作用域**: [`全局配置`](#scopes)6834* **作用域**: [`全局配置`](#scopes)

6812* **类型**: 布尔值6835* **类型**: 布尔值

6813 * `true`: `/copy` 复制完整响应而不显示选择器6836 * `true`: `/copy` 复制完整回复而不显示选择器

6814 * `false`: 当响应包含代码块时,`/copy` 显示一个选择器,你可以在其中选择一个代码块或完整响应6837 * `false`: 当回复包含代码块或引用块时,`/copy` 显示一个选择器,您可以在其中选择一个块或完整回复

6815* **默认值**: `false`6838* **默认值**: `false`

6816 6839 

6817```json ~/.claude.json theme={null}6840```json ~/.claude.json theme={null}

skills.md +7 −7

Details

192 192 

193Claude Code 从启动它的目录和每个父目录(直到存储库根目录)中的 `.claude/skills/` 加载项目 skills,因此在 `packages/frontend/` 中启动仍会获取在根目录定义的 skills。当您在 v2.1.246 或更高版本上 [使用 `/cd` 移动会话](/docs/zh-CN/permissions#move-the-session-to-another-directory) 时,Claude Code 会添加新目录的项目 skills。193Claude Code 从启动它的目录和每个父目录(直到存储库根目录)中的 `.claude/skills/` 加载项目 skills,因此在 `packages/frontend/` 中启动仍会获取在根目录定义的 skills。当您在 v2.1.246 或更高版本上 [使用 `/cd` 移动会话](/docs/zh-CN/permissions#move-the-session-to-another-directory) 时,Claude Code 会添加新目录的项目 skills。

194 194 

195在链接的 [git worktree](/docs/zh-CN/worktrees) 中运行的会话中,Claude Code 仅在 worktree 根目录之前搜索父目录。在 Claude Code v2.1.277 或更高版本上,当 worktree 检出在其根目录没有 `.claude/skills` 目录时,Claude Code 会改为加载主检出的项目 skills。请参阅 [worktrees 与主检出共享的内容](/docs/zh-CN/worktrees#what-worktrees-share-with-the-main-checkout)。195在您使用 `--worktree` 或 `git worktree add` 创建的链接 [git worktree](/docs/zh-CN/worktrees) 中运行的会话中,Claude Code 仅在 worktree 根目录之前搜索父目录。在 Claude Code v2.1.277 或更高版本上,当 worktree 检出在其根目录没有 `.claude/skills` 目录时,Claude Code 会改为加载主检出的项目 skill。请参阅 [worktrees 与主检出共享的内容](/docs/zh-CN/worktrees#what-worktrees-share-with-the-main-checkout)。

196 196 

197`.claude/skills/` 目录中启动位置下方的 skills 在启动时不会加载。它们在 Claude 首次读取或编辑该子目录中的文件时加载,并在会话的其余时间保持可用。在此之前,它们不会出现在 `/` 菜单中,您也无法按名称调用它们。要更早加载它们,请使用子目录的路径运行 `/add-dir`,这需要 Claude Code v2.1.257 或更高版本。197`.claude/skills/` 目录中启动位置下方的 skill 在启动时不会加载。它们在 Claude 首次读取或编辑该子目录中的文件时加载,并在会话的其余时间保持可用。在此之前,它们不会出现在 `/` 菜单中,您也无法按名称调用它们。要更早加载它们,请使用子目录的路径运行 `/add-dir`,这需要 Claude Code v2.1.257 或更高版本。对于从桌面应用启动的 worktree 会话,请参阅 [worktrees 与主检出共享的内容](/docs/zh-CN/worktrees#what-worktrees-share-with-the-main-checkout)。

198 198 

199当嵌套 skill 的目录名称与另一个 skill 的名称匹配时,两者都保持可用。在存储库根目录有一个 `deploy` skill,在 `apps/web/.claude/skills/` 中有另一个:199当嵌套 skill 的目录名称与另一个 skill 的名称匹配时,两者都保持可用。在存储库根目录有一个 `deploy` skill,在 `apps/web/.claude/skills/` 中有另一个:

200 200 


235 235 

236如果 skill 仅存在于您机器上的 `~/.claude/skills/` 中,当 [routine](/docs/zh-CN/routines) 调用它时,Claude Code 会报告找不到该 skill,因为每个 routine 运行都作为新的云会话启动。要在这些会话中使用个人 skill:236如果 skill 仅存在于您机器上的 `~/.claude/skills/` 中,当 [routine](/docs/zh-CN/routines) 调用它时,Claude Code 会报告找不到该 skill,因为每个 routine 运行都作为新的云会话启动。要在这些会话中使用个人 skill:

237 237 

238* 对于 Cowork 和云会话,为您的 claude.ai 账户启用该 skill。238* 对于 Cowork 和云端会话,为您的 claude.ai 账户启用该 skill。[自托管环境中的某些会话](/docs/zh-CN/self-hosted-environments-configuration#how-each-session’s-config-is-assembled) 不会加载您账户的 skill。

239* 对于云会话,您可以改为将 skill 提交到存储库的 `.claude/skills/`。在存储库的 `.claude/settings.json` 中声明的插件和仅在您的用户设置中启用的插件 [不会在云会话中加载](/docs/zh-CN/cloud-environments#what-carries-over-from-your-setup)。239* 对于云会话,您可以改为将 skill 提交到存储库的 `.claude/skills/`。在存储库的 `.claude/settings.json` 中声明的插件和仅在您的用户设置中启用的插件 [不会在云会话中加载](/docs/zh-CN/cloud-environments#what-carries-over-from-your-setup)。

240 240 

241[Desktop 计划任务](/docs/zh-CN/desktop-scheduled-tasks) 在您的机器上本地运行,因此它们确实加载 `~/.claude/skills/`。241[Desktop 计划任务](/docs/zh-CN/desktop-scheduled-tasks) 在您的机器上本地运行,因此它们确实加载 `~/.claude/skills/`。


434| `when_to_use` | 否 | 关于 Claude 何时应调用该 skill 的附加上下文,例如触发短语或示例请求。在 skill 列表中附加到 `description` 之后,并计入 1,536 个字符的上限。 |434| `when_to_use` | 否 | 关于 Claude 何时应调用该 skill 的附加上下文,例如触发短语或示例请求。在 skill 列表中附加到 `description` 之后,并计入 1,536 个字符的上限。 |

435| `argument-hint` | 否 | 自动补全期间显示的提示,用于指示预期的参数。示例:`[issue-number]` 或 `[filename] [format]`。 |435| `argument-hint` | 否 | 自动补全期间显示的提示,用于指示预期的参数。示例:`[issue-number]` 或 `[filename] [format]`。 |

436| `arguments` | 否 | 用于 skill 内容中 [`$name` 替换](#available-string-substitutions)的命名位置参数。接受以空格分隔的字符串或 YAML 列表。名称按顺序映射到参数位置。 |436| `arguments` | 否 | 用于 skill 内容中 [`$name` 替换](#available-string-substitutions)的命名位置参数。接受以空格分隔的字符串或 YAML 列表。名称按顺序映射到参数位置。 |

437| `disable-model-invocation` | 否 | 设置为 `true` 可防止 Claude 自动加载此 skill。适用于您希望通过 `/name` 手动触发的工作流。还会阻止该 skill [预加载到子代理中](/docs/zh-CN/sub-agents#preload-skills-into-subagents)。从 v2.1.196 起,当以该 skill 作为提示词的[定时任务](/docs/zh-CN/scheduled-tasks)触发时,也会阻止该 skill 运行。默认值:`false`。 |437| `disable-model-invocation` | 否 | 设置为 `true` 可防止 Claude 自动加载此 skill。适用于您希望通过 `/name` 手动触发的工作流。还会阻止该 skill [预加载到子代理中](/docs/zh-CN/sub-agents#preload-skills-into-subagents),并在以该 skill 作为提示词的[定时任务](/docs/zh-CN/scheduled-tasks)触发时阻止其运行。默认值:`false`。 |

438| `user-invocable` | 否 | 当只有 Claude 应调用该 skill 时设置为 `false`:Claude Code 会将其从 `/` 菜单中隐藏,并且在您输入 `/name` 时不会运行它。适用于用户不应直接调用的背景知识。默认值:`true`。 |438| `user-invocable` | 否 | 当只有 Claude 应调用该 skill 时设置为 `false`:Claude Code 会将其从 `/` 菜单中隐藏,并且在您输入 `/name` 时不会运行它。适用于用户不应直接调用的背景知识。默认值:`true`。 |

439| `allowed-tools` | 否 | 在调用此 skill 的轮次中,Claude 无需请求权限即可使用的工具。当您发送下一条消息时,该授予即被清除。接受以空格或逗号分隔的字符串,或 YAML 列表。请参阅[为 skill 预先批准工具](#pre-approve-tools-for-a-skill)。 |439| `allowed-tools` | 否 | 在调用此 skill 的轮次中,Claude 无需请求权限即可使用的工具。当您发送下一条消息时,该授予即被清除。接受以空格或逗号分隔的字符串,或 YAML 列表。请参阅[为 skill 预先批准工具](#pre-approve-tools-for-a-skill)。 |

440| `disallowed-tools` | 否 | 在此 skill 处于活动状态时,从 Claude 可用工具池中移除的工具。适用于永远不应调用某些工具的自主 skill,例如对后台循环禁用 `AskUserQuestion`。接受以空格或逗号分隔的字符串,或 YAML 列表。当您发送下一条消息时,该限制即被清除。与拒绝规则一样,只要还有其他工具存在,该字段就无法移除 [`EndConversation`](/docs/zh-CN/tools-reference#endconversation-tool-behavior)。 |440| `disallowed-tools` | 否 | 在此 skill 处于活动状态时,从 Claude 可用工具池中移除的工具。适用于永远不应调用某些工具的自主 skill,例如对后台循环禁用 `AskUserQuestion`。接受以空格或逗号分隔的字符串,或 YAML 列表。当您发送下一条消息时,该限制即被清除。与拒绝规则一样,只要还有其他工具存在,该字段就无法移除 [`EndConversation`](/docs/zh-CN/tools-reference#endconversation-tool-behavior)。 |


528 528 

529如果此 skill 安装在 `~/.claude/skills/render-chart/`,则两处 `${CLAUDE_SKILL_DIR}` 都会展开为该目录。这样,`allowed-tools` 规则就会与 skill 正文指示 Claude 运行的命令完全匹配,因此脚本运行时无需提示。529如果此 skill 安装在 `~/.claude/skills/render-chart/`,则两处 `${CLAUDE_SKILL_DIR}` 都会展开为该目录。这样,`allowed-tools` 规则就会与 skill 正文指示 Claude 运行的命令完全匹配,因此脚本运行时无需提示。

530 530 

531`${CLAUDE_PROJECT_DIR}` 替换需要 Claude Code v2.1.196 或更高版本。

532 

533索引参数使用 shell 风格的引号规则,因此请将多词值用引号括起来,以将其作为单个参数传递。例如,`/my-skill "hello world" second` 会使 `$0` 展开为 `hello world`,`$1` 展开为 `second`。`$ARGUMENTS` 占位符始终展开为输入时的完整参数字符串。531索引参数使用 shell 风格的引号规则,因此请将多词值用引号括起来,以将其作为单个参数传递。例如,`/my-skill "hello world" second` 会使 `$0` 展开为 `hello world`,`$1` 展开为 `second`。`$ARGUMENTS` 占位符始终展开为输入时的完整参数字符串。

534 532 

535没有对应参数的索引占位符(例如仅传递了一个参数时的 `$2`)会原样保留在内容中。来自 [`arguments`](#frontmatter-reference) frontmatter 的命名占位符如果没有匹配的参数,则展开为空字符串。533没有对应参数的索引占位符(例如仅传递了一个参数时的 `$2`)会原样保留在内容中。来自 [`arguments`](#frontmatter-reference) frontmatter 的命名占位符如果没有匹配的参数,则展开为空字符串。


803 当注入命令失败时801 当注入命令失败时

804</h4>802</h4>

805 803 

806失败的命令中止整个技能调用,而不仅仅是其自己的占位符。Claude 永远看不到该调用的技能内容。中止显示 `Shell command failed for pattern "..."`。错误消息包括命令的输出在 `[stderr]` 下。804失败的命令会中止整个 skill 调用,而不仅仅是其自身的占位符。Claude 永远看不到该次调用的 skill 内容。中止时会显示 `Shell command failed for pattern "..."`。错误消息会在 `[stderr]` 下包含该命令的输出。

807 805 

808使用默认的 `bash` shell,任何非零退出代码都算作失败。一个例外适用:Claude Code 将来自[搜索和比较命令](/docs/zh-CN/tools-reference#output-limits)的退出代码 1 视为正常结果并注入其输出。退出代码 2 或更高的代码即使对于这些命令也会失败。806使用默认的 `bash` shell,任何非零退出代码都算作失败。一个例外适用:Claude Code 将来自[搜索和比较命令](/docs/zh-CN/tools-reference#output-limits)的退出代码 1 视为正常结果并注入其输出。退出代码 2 或更高的代码即使对于这些命令也会失败。

809 807 


843* 当你在同一技能的早期调用仍在运行时调用分叉技能时841* 当你在同一技能的早期调用仍在运行时调用分叉技能时

844* 当[计划任务](/docs/zh-CN/scheduled-tasks)以技能作为其提示触发时842* 当[计划任务](/docs/zh-CN/scheduled-tasks)以技能作为其提示触发时

845 843 

844当[动态工作流](/docs/zh-CN/workflows)中的 Agent 调用分叉 skill 时,即使该 skill 没有设置 `background: false`,该 Agent 也会等待并接收结果。在 v2.1.295 之前,Claude Code 在这种情况下不会等待,并且当 skill 在后台运行时,其结果会出现在您的主对话中,而不会到达该 Agent。

845 

846后台化的分叉也使用[适用于后台子代理的更窄工具集](/docs/zh-CN/sub-agents#run-subagents-in-foreground-or-background)运行:技能的子代理是常规代理类型,因此分叉对话的子代理的豁免不适用于它。如果你的技能的步骤依赖于该集合之外的工具,请设置 `background: false` 以保持完整的工具集。846后台化的分叉也使用[适用于后台子代理的更窄工具集](/docs/zh-CN/sub-agents#run-subagents-in-foreground-or-background)运行:技能的子代理是常规代理类型,因此分叉对话的子代理的豁免不适用于它。如果你的技能的步骤依赖于该集合之外的工具,请设置 `background: false` 以保持完整的工具集。

847 847 

848在后台运行的分叉技能在你的会话的[检查点](/docs/zh-CN/checkpointing)之外应用其编辑,因此 `/rewind` 不会撤销它们;使用 git 来恢复它们。848在后台运行的分叉技能在你的会话的[检查点](/docs/zh-CN/checkpointing)之外应用其编辑,因此 `/rewind` 不会撤销它们;使用 git 来恢复它们。

sub-agents.md +4 −6

Details

386* **主对话的模型属于该家族**:subagent 在主对话的确切模型上运行,包括任何 `[1m]` 后缀,因此它获得与主对话相同的 [extended context](/docs/zh-CN/model-config#extended-context) 窗口。386* **主对话的模型属于该家族**:subagent 在主对话的确切模型上运行,包括任何 `[1m]` 后缀,因此它获得与主对话相同的 [extended context](/docs/zh-CN/model-config#extended-context) 窗口。

387* **Claude Code 无法告诉主对话的模型家族,在 [a provider other than the Anthropic API](/docs/zh-CN/third-party-integrations) 上**:这可能发生在 Amazon Bedrock 上的 [application inference profile ARN](/docs/zh-CN/amazon-bedrock#iam-configuration),Claude Code 尚未解析为支持模型。这种情况仅涵盖 `opus` 别名,当您设置 [`ANTHROPIC_DEFAULT_OPUS_MODEL`](/docs/zh-CN/model-config#environment-variables) 时不适用,因为 `opus` 然后解析到您设置的模型。387* **Claude Code 无法告诉主对话的模型家族,在 [a provider other than the Anthropic API](/docs/zh-CN/third-party-integrations) 上**:这可能发生在 Amazon Bedrock 上的 [application inference profile ARN](/docs/zh-CN/amazon-bedrock#iam-configuration),Claude Code 尚未解析为支持模型。这种情况仅涵盖 `opus` 别名,当您设置 [`ANTHROPIC_DEFAULT_OPUS_MODEL`](/docs/zh-CN/model-config#environment-variables) 时不适用,因为 `opus` 然后解析到您设置的模型。

388 388 

389`CLAUDE_CODE_SUBAGENT_MODEL` 中的别名始终解析到别名指向的版本,即使它命名主对话的家族。389`CLAUDE_CODE_SUBAGENT_MODEL` 中的别名始终解析为该别名指向的版本,即使它指定的是主对话所属的系列。将该变量设置为 `inherit` 与不设置它相同。

390 390 

391设置 `CLAUDE_CODE_SUBAGENT_MODEL` 本身不会改变内置 Explore 和 Plan subagents 运行的模型。要改变它,请参阅 [Run every subagent on one model](#run-every-subagent-on-one-model)。391设置 `CLAUDE_CODE_SUBAGENT_MODEL` 本身不会改变内置 Explore 和 Plan subagents 运行的模型。要改变它,请参阅 [Run every subagent on one model](#run-every-subagent-on-one-model)。

392 392 

393在 v2.1.251 之前,`CLAUDE_CODE_SUBAGENT_MODEL` 在此顺序中排在第一位,并覆盖每次调用的参数和 frontmatter,包括 `model: inherit`。393在 v2.1.251 之前,`CLAUDE_CODE_SUBAGENT_MODEL` 在此顺序中排在第一位,并覆盖每次调用的参数和 frontmatter,包括 `model: inherit`。

394 394 

395将变量设置为 `inherit` 与不设置它相同。在 v2.1.196 之前,该值强制 subagents 使用主对话的模型并忽略其他来源。

396 

397Claude Code 根据您组织的 [`availableModels`](/docs/zh-CN/model-config#restrict-model-selection) 允许列表检查每次调用的参数、frontmatter 和环境变量值。对于被阻止的值,它替换另一个模型:395Claude Code 根据您组织的 [`availableModels`](/docs/zh-CN/model-config#restrict-model-selection) 允许列表检查每次调用的参数、frontmatter 和环境变量值。对于被阻止的值,它替换另一个模型:

398 396 

399* 当被阻止的值是家族别名(例如 `opus`)时,Claude Code 在允许列表允许的该家族的最新版本上运行 subagent,遵循与 `/model` 相同的 [substitution rules and provider scope](/docs/zh-CN/model-config#restrict-model-selection)。在 v2.1.222 之前,Claude Code 也在继承的模型上为被阻止的家族别名运行 subagent。397* 当被阻止的值是家族别名(例如 `opus`)时,Claude Code 在允许列表允许的该家族的最新版本上运行 subagent,遵循与 `/model` 相同的 [substitution rules and provider scope](/docs/zh-CN/model-config#restrict-model-selection)。在 v2.1.222 之前,Claude Code 也在继承的模型上为被阻止的家族别名运行 subagent。


620| `default` | 手动模式:提示权限 |618| `default` | 手动模式:提示权限 |

621| `acceptEdits` | 自动接受文件编辑和工作目录或 `additionalDirectories` 中路径的常见文件系统命令 |619| `acceptEdits` | 自动接受文件编辑和工作目录或 `additionalDirectories` 中路径的常见文件系统命令 |

622| `auto` | [Auto mode](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode):后台分类器审查命令和受保护目录的写入 |620| `auto` | [Auto mode](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode):后台分类器审查命令和受保护目录的写入 |

623| `dontAsk` | 自动拒绝权限提示。显式允许的工具仍然工作;`AskUserQuestion`、标记为 [`requiresUserInteraction`](/docs/zh-CN/mcp#require-approval-for-a-specific-tool) 的 MCP 工具,以及[您的组织设置为 `ask`](/docs/zh-CN/mcp#organization-controls-on-connector-tools) 的连接器工具(在该设置到达 Claude Code 的会话中)会被拒绝,即使您已允许它们 |621| `dontAsk` | 自动拒绝权限提示。显式允许的工具仍可使用;`AskUserQuestion`、标记为 [`requiresUserInteraction`](/docs/zh-CN/mcp#require-approval-for-a-specific-tool) 的 MCP 工具、[从网络路径读取](/docs/zh-CN/permissions#network-paths),以及[您的组织设置为 `ask`](/docs/zh-CN/mcp#organization-controls-on-connector-tools) 的连接器工具(在该设置传达到 Claude Code 的会话中)会被拒绝,即使您已允许它们 |

624| `bypassPermissions` | [Skip permission prompts](/docs/zh-CN/permission-modes#skip-all-checks-with-bypasspermissions-mode)。Subagent 仅在主对话也这样做时在此模式中运行 |622| `bypassPermissions` | [Skip permission prompts](/docs/zh-CN/permission-modes#skip-all-checks-with-bypasspermissions-mode)。Subagent 仅在主对话也这样做时在此模式中运行 |

625| `plan` | Plan mode(只读探索) |623| `plan` | Plan mode(只读探索) |

626 624 


682启用内存时:680启用内存时:

683 681 

684* Subagent 的系统提示包括读取和写入内存目录的说明。682* Subagent 的系统提示包括读取和写入内存目录的说明。

685* Subagent 的系统提示还包括内存目录中 `MEMORY.md` 的前 200 行或 25KB,以先到者为准,以及如果 `MEMORY.md` 超过该限制则策划 `MEMORY.md` 的说明。683* 子代理的系统提示词还包含记忆目录中 `MEMORY.md` 的前 200 行或前 25KB(以先达到者为准),以及在 `MEMORY.md` 超过该限制时对其进行整理的说明。

686* Read、Write 和 Edit 工具会自动启用,以便 subagent 可以管理其内存文件。684* Read、Write 和 Edit 工具会自动启用,以便 subagent 可以管理其内存文件。

687 685 

688<h5 id="persistent-memory-tips">686<h5 id="persistent-memory-tips">


1150* **系统提示词**:Agent 自身的提示词加上 Claude Code 附加的环境详情,而不是 Claude Code 系统提示词。自定义子代理在 [markdown 正文](#write-subagent-files)或 `prompt` 字段中定义其系统提示词。内置 Agent 具有预定义的提示词。1148* **系统提示词**:Agent 自身的提示词加上 Claude Code 附加的环境详情,而不是 Claude Code 系统提示词。自定义子代理在 [markdown 正文](#write-subagent-files)或 `prompt` 字段中定义其系统提示词。内置 Agent 具有预定义的提示词。

1151* **任务消息**:Claude 在移交工作时编写的委托提示词。1149* **任务消息**:Claude 在移交工作时编写的委托提示词。

1152* **CLAUDE.md 文件**:主对话所加载的 [CLAUDE.md 层级结构](/docs/zh-CN/memory#how-claude-md-files-load)中的每一级,包括 `~/.claude/CLAUDE.md`、项目规则、`CLAUDE.local.md`、托管策略文件,以及作为项目指令加载的任何 [`AGENTS.md` 文件](/docs/zh-CN/memory#agents-md)。内置的 Explore 和 Plan Agent 会跳过这些。定义中设置了 [`omitClaudeMd`](#supported-frontmatter-fields) 的子代理只加载托管策略文件;如果该定义来自[托管设置](#choose-the-subagent-scope),则一个也不加载。1150* **CLAUDE.md 文件**:主对话所加载的 [CLAUDE.md 层级结构](/docs/zh-CN/memory#how-claude-md-files-load)中的每一级,包括 `~/.claude/CLAUDE.md`、项目规则、`CLAUDE.local.md`、托管策略文件,以及作为项目指令加载的任何 [`AGENTS.md` 文件](/docs/zh-CN/memory#agents-md)。内置的 Explore 和 Plan Agent 会跳过这些。定义中设置了 [`omitClaudeMd`](#supported-frontmatter-fields) 的子代理只加载托管策略文件;如果该定义来自[托管设置](#choose-the-subagent-scope),则一个也不加载。

1153* **Git 状态**:子代理启动时 Claude Code 从您的仓库读取的快照。在 Git 仓库之外或快照被关闭时不存在;请参阅 [`includeGitInstructions`](/docs/zh-CN/settings-reference#includegitinstructions)。Explore 和 Plan 无论如何都会跳过它。1151* **Git 状态**:子代理启动时 Claude Code 从您的仓库读取的快照。对于在该仓库的[自有 worktree](/docs/zh-CN/worktrees#isolate-subagents-with-worktrees) 中运行的子代理,快照会显示该 worktree 的分支、状态和最近的提交。在 Git 仓库之外或快照被关闭时不存在;请参阅 [`includeGitInstructions`](/docs/zh-CN/settings-reference#includegitinstructions)。Explore 和 Plan 无论如何都会跳过它。

1154* **预加载的 skill**:Agent 的 [`skills` 字段](#preload-skills-into-subagents)中列出的每个 skill 的完整内容。内置 Agent 不预加载 skill。1152* **预加载的 skill**:Agent 的 [`skills` 字段](#preload-skills-into-subagents)中列出的每个 skill 的完整内容。内置 Agent 不预加载 skill。

1155* **同级名单**:一条[系统提醒](/docs/zh-CN/glossary#system-reminder),列出 `main` 以及会话中所有其他已命名的 Agent,每一个都是 [`SendMessage`](#resume-subagents) 的有效 `to` 值。需要 Claude Code v2.1.206 或更高版本。仅当子代理的工具包含 `SendMessage` 且至少有一个其他 Agent 拥有名称时才会出现该名单,无论该名称是 Claude 在生成时指定的,还是该 Agent 作为 [agent team](/docs/zh-CN/agent-teams) 队友运行。名单是子代理启动时拍摄的快照,因此之后命名的 Agent 不会出现在其中。1153* **同级名单**:一条[系统提醒](/docs/zh-CN/glossary#system-reminder),列出 `main` 以及会话中所有其他已命名的 Agent,每一个都是 [`SendMessage`](#resume-subagents) 的有效 `to` 值。需要 Claude Code v2.1.206 或更高版本。仅当子代理的工具包含 `SendMessage` 且至少有一个其他 Agent 拥有名称时才会出现该名单,无论该名称是 Claude 在生成时指定的,还是该 Agent 作为 [agent team](/docs/zh-CN/agent-teams) 队友运行。名单是子代理启动时拍摄的快照,因此之后命名的 Agent 不会出现在其中。

1156 1154 

Details

122}122}

123```123```

124 124 

125<h2 id="see-session-status-in-your-terminal">

126 在终端中查看会话状态

127</h2>

128 

129如果您的终端实现了 OSC 7501 Program Status Protocol,它可以显示每个交互式 Claude Code 会话是正在工作、正在等待您,还是已完成,这在您运行长时间任务或同时运行多个会话时很有帮助。Claude Code 中无需启用任何设置。要了解您的终端是否实现了该协议以及在何处显示状态,请查阅其文档。

130 

131如果终端已实现该协议,但您没有看到某个会话的状态,请逐一检查以下原因:

132 

133* **Claude Code 版本**:状态报告需要 Claude Code v2.1.295 或更高版本。在 shell 中运行 `claude --version` 进行检查。

134* **tmux**:在 tmux 中,Claude Code 会检查 tmux 而非您的终端是否支持该协议,且 [`allow-passthrough`](#configure-tmux) 对此没有影响。请在 tmux 之外启动会话。

135* **后台会话**:[后台会话](/docs/zh-CN/agent-view)不会向您的终端报告其状态,即使您已连接到该会话也是如此。Agent 视图会改为显示其状态。

136* **[`CLAUDE_CODE_DISABLE_TERMINAL_TITLE`](/docs/zh-CN/env-vars#variables)**:如果您将此变量设置为 `1`,Claude Code 将不会检查支持情况,也不会报告状态。请取消设置该变量。

137 

125<h2 id="configure-tmux">138<h2 id="configure-tmux">

126 配置 tmux139 配置 tmux

127</h2>140</h2>

tools-reference.md +32 −11

Details

279 279 

280Edit 工具执行精确字符串替换。它接受一个 `old_string` 和一个 `new_string`,并用后者替换前者。它不使用正则表达式或模糊匹配。280Edit 工具执行精确字符串替换。它接受一个 `old_string` 和一个 `new_string`,并用后者替换前者。它不使用正则表达式或模糊匹配。

281 281 

282编辑应用必须通过三项检查。在任何检查之前,与 [`Read` 拒绝规则](/docs/zh-CN/permissions#tool-specific-permission-rules)匹配的路径会被拒绝,包括在该路径创建新文件。此拒绝需要 Claude Code v2.1.208 或更高版本。282编辑应用必须通过以下检查。在任何检查之前,与 [`Read` 拒绝规则](/docs/zh-CN/permissions#tool-specific-permission-rules)匹配的路径会被拒绝,包括在该路径创建新文件。此拒绝需要 Claude Code v2.1.208 或更高版本。

283 283 

284* **编辑前读取**:Claude 在编辑文件前在当前对话中读取该文件,并且以 [`PARTIAL view` 通知](#read-tool-behavior)中断的读取不计数。Claude Opus 4.6、Claude Haiku 4.5 和更早的模型始终需要读取。较新的模型可以在读取不需要权限提示且 Read 工具可用时编辑未读文件。284* **编辑前读取**:Claude 在编辑文件前在当前对话中读取该文件,并且以 [`PARTIAL view` 通知](#large-files)中断的读取不计数。Claude Opus 4.6、Claude Haiku 4.5 和更早的模型始终需要读取。较新的模型可以在读取不需要权限提示且 Read 工具可用时编辑未读文件。

285* **匹配**:`old_string` 必须在文件中完全按照编写的方式出现。单个空格或缩进差异足以导致不匹配。285* **匹配**:`old_string` 必须在文件中完全按照编写的方式出现。单个空格或缩进差异足以导致不匹配。

286* **唯一性**:`old_string` 必须恰好出现一次。当它出现多次时,Claude 要么提供一个更长的字符串,其周围上下文足以确定一个出现位置,要么设置 `replace_all: true` 来替换所有出现位置。286* **唯一性**:`old_string` 必须恰好出现一次。当它出现多次时,Claude 要么提供一个更长的字符串,其周围上下文足以确定一个出现位置,要么设置 `replace_all: true` 来替换所有出现位置。

287 287 

288当 `old_string` 与当前内容完全匹配且明确无误,且 Claude Code 可以在不提示的情况下读取文件时,在 Claude 最后读取后在磁盘上更改的文件仍然可以编辑。针对文件的当前内容进行匹配可以保持安全,结果会注明该文件包含其他更改,以便 Claude 在依赖周围内容的编辑前重新读取它。在任何其他情况下,例如过时的 `old_string` 或在没有 `replace_all` 的情况下匹配多次的情况,Claude 在编辑前再次读取文件。对未读和已更改文件的宽松处理需要 Claude Code v2.1.208 或更高版本;在此之前,Claude Code 拒绝对它在对话中未读过或在读取后在磁盘上更改的任何文件进行编辑。288当 `old_string` 与当前内容完全匹配且明确无误,且 Claude Code 可以在不提示的情况下读取文件时,在 Claude 最后读取后在磁盘上更改的文件仍然可以编辑。针对文件的当前内容进行匹配可以保持安全,结果会注明该文件包含其他更改,以便 Claude 在依赖周围内容的编辑前重新读取它。在任何其他情况下,例如过时的 `old_string` 或在没有 `replace_all` 的情况下匹配多次的情况,Claude 在编辑前再次读取文件。对未读和已更改文件的宽松处理需要 Claude Code v2.1.208 或更高版本;在此之前,Claude Code 拒绝对它在对话中未读过或在读取后在磁盘上更改的任何文件进行编辑。

289 289 

290使用 Bash 查看文件也满足编辑前读取要求,当命令是 `cat`、`nl`、`bat`、`batcat`、`head`、`tail`、`sed -n 'X,Yp'`、`grep`、`egrep`、`fgrep` 或 `rg` 在单个文件上且没有管道或重定向时。管道输出和其他 Bash 命令不计入编辑前读取检查。290Claude 使用 `cat` 或 `grep` 等 Bash 命令查看文件后,也可以在不单独执行 Read 的情况下编辑该文件。这些命令是 `cat`、`nl`、`bat`、`batcat`、`head`、`tail`、`sed -n 'X,Yp'`、`grep`、`egrep`、`fgrep` 和 `rg`,且每个命令都需在单个文件上运行,没有管道或重定向。没有输出任何匹配的搜索不算作读取,此列表之外的任何命令也不算。

291 291 

292当 Claude 以这种方式查看文件时,Claude Code 还会加载适用于该文件的任何[子目录 `CLAUDE.md`](/docs/zh-CN/memory#how-claude-md-files-load) 和[路径范围规则](/docs/zh-CN/memory#path-specific-rules)。请参阅 [Read 和 Edit 权限规则](/docs/zh-CN/permissions#read-and-edit),了解您的 `Read` 和 `Edit` 拒绝规则涵盖哪些 Bash 命令。292当 Claude 以这种方式查看文件时,Claude Code 还会加载适用于该文件的任何[子目录 `CLAUDE.md`](/docs/zh-CN/memory#how-claude-md-files-load) 和[路径范围规则](/docs/zh-CN/memory#path-specific-rules)。请参阅 [Read 和 Edit 权限规则](/docs/zh-CN/permissions#read-and-edit),了解您的 `Read` 和 `Edit` 拒绝规则涵盖哪些 Bash 命令。

293 293 

294<h3 id="non-utf-8-files">

295 非 UTF-8 文件

296</h3>

297 

298Claude 无法对不是有效 UTF-8 的文件使用 [NotebookEdit](#notebookedit-tool-behavior)。Edit 也是如此,除非该文件以小端 UTF-16 字节顺序标记开头。当 Claude 尝试时,工具会拒绝更改,并保持文件不变。被拒绝的文件包括以 Windows-1252 或 Shift-JIS 等旧编码保存的非 ASCII 文本、二进制文件,以及包含无效字节序列的 UTF-8 文件。

299 

300这些工具之所以拒绝,是因为它们会将整个文件以 UTF-8 保存回去,这会把所有无法解码的字节都替换为替换字符 `U+FFFD`。相反,[Claude 收到的错误](/docs/zh-CN/errors#file-is-not-valid-utf-8)会告诉它使用一条保留文件编码的 shell 命令来进行更改,或者先询问您是否将文件转换为 UTF-8。

301 

302Claude 仍然可以使用 Write 替换此类文件,除非新内容包含 `U+FFFD`,即 Read 在无法解码的字节位置向 Claude 显示的字符。这一防护措施可防止 Claude 将其读取到的乱码文本写回。当 Write 确实替换文件时,它会将新内容保存为 UTF-8,因此文件的原始编码会丢失。

303 

294<h2 id="endconversation-tool-behavior">304<h2 id="endconversation-tool-behavior">

295 EndConversation 工具行为305 EndConversation 工具行为

296</h2>306</h2>


455* `insert`:在目标后添加新单元格。没有 `cell_id` 时,新单元格位于 notebook 的开始。需要 `cell_type` 设置为 `code` 或 `markdown`。465* `insert`:在目标后添加新单元格。没有 `cell_id` 时,新单元格位于 notebook 的开始。需要 `cell_type` 设置为 `code` 或 `markdown`。

456* `delete`:删除目标单元格。466* `delete`:删除目标单元格。

457 467 

468对于无法按 UTF-8 解码的 notebook 文件,NotebookEdit 会依照[与 Edit 相同的规则](#non-utf-8-files)拒绝处理,且不写入任何内容。

469 

458权限规则使用 `Edit(...)` 路径格式。像 `Edit(notebooks/**)` 这样的规则涵盖该目录中的 NotebookEdit 调用。470权限规则使用 `Edit(...)` 路径格式。像 `Edit(notebooks/**)` 这样的规则涵盖该目录中的 NotebookEdit 调用。

459 471 

460<h2 id="powershell-tool">472<h2 id="powershell-tool">


514* 单个 [command hooks](/docs/zh-CN/hooks#command-hook-fields) 上的 `"shell": "powershell"`:在 PowerShell 中运行该 hook。Hooks 直接生成 PowerShell,因此无论 `CLAUDE_CODE_USE_POWERSHELL_TOOL` 如何,这都有效。526* 单个 [command hooks](/docs/zh-CN/hooks#command-hook-fields) 上的 `"shell": "powershell"`:在 PowerShell 中运行该 hook。Hooks 直接生成 PowerShell,因此无论 `CLAUDE_CODE_USE_POWERSHELL_TOOL` 如何,这都有效。

515* [skill frontmatter](/docs/zh-CN/skills#frontmatter-reference) 中的 `shell: powershell`:在 PowerShell 中运行 `` !`command` `` 块。需要启用 PowerShell 工具。527* [skill frontmatter](/docs/zh-CN/skills#frontmatter-reference) 中的 `shell: powershell`:在 PowerShell 中运行 `` !`command` `` 块。需要启用 PowerShell 工具。

516 528 

517Bash 工具部分下描述的相同主会话工作目录重置行为适用于 PowerShell 命令,包括 `CLAUDE_BASH_MAINTAIN_PROJECT_WORKING_DIR` 环境变量。529PowerShell 命令遵循与 Bash 命令[相同的主会话工作目录重置行为](#what-persists-between-commands),包括 `CLAUDE_BASH_MAINTAIN_PROJECT_WORKING_DIR` 环境变量。

530 

531PowerShell 命令还会接收 hook 通过 `CLAUDE_ENV_FILE` 持久化的变量,具体条件请参阅 [PowerShell 命令中的持久化变量](/docs/zh-CN/hooks#persisted-variables-in-powershell-commands)。需要 Claude Code v2.1.296 或更高版本。

518 532 

519来自 `grep`、`rg`、`egrep`、`fgrep`、`findstr` 和 `git grep` 的退出码 1 表示没有匹配。来自 `git diff` 的退出码 1 表示存在差异。这两个结果都不会作为命令失败报告给 Claude。对于 `robocopy`,退出码 0 到 7 是信息性结果,例如复制的文件或检测到的额外文件。退出码 8 或更高被视为失败。533来自 `grep`、`rg`、`egrep`、`fgrep`、`findstr` 和 `git grep` 的退出码 1 表示没有匹配。来自 `git diff` 的退出码 1 表示存在差异。这两个结果都不会作为命令失败报告给 Claude。对于 `robocopy`,退出码 0 到 7 是信息性结果,例如复制的文件或检测到的额外文件。退出码 8 或更高被视为失败。

520 534 


547 561 

548Read 工具接收文件路径并返回带有行号的文件内容。Claude 被指示始终传递绝对路径。562Read 工具接收文件路径并返回带有行号的文件内容。Claude 被指示始终传递绝对路径。

549 563 

550默认情况下,Read 从文件开始处返回内容。当整个文件读取超过令牌限制时,Read 返回第一页并显示 `PARTIAL view` 通知,告诉 Claude 它接收了多少文件内容以及如何使用 `offset` 和 `limit` 读取更多内容。传递显式 `offset` 或 `limit` 的读取仍然超过令牌限制时会返回错误。

551 

552带有显式 `limit` 的读取会在选定的行数超过令牌限制可能容纳的内容时立即停止,并返回错误而不加载范围的其余部分。该错误告诉 Claude 使用更小的 `limit`,或者当单行非常大时改用 [Grep](#grep-tool-behavior) 搜索特定内容。在 v2.1.208 之前,Claude Code 在拒绝之前会将整个范围加载到内存中,因此读取包含极长单行的文件可能会导致内存不足。

553 

554读取空文件会返回一个通知,说明文件存在但内容为空,而 `offset` 超过最后一行会返回一个通知,给出文件的行数。在 v2.1.208 之前,读取空文件会返回超过末尾的通知。564读取空文件会返回一个通知,说明文件存在但内容为空,而 `offset` 超过最后一行会返回一个通知,给出文件的行数。在 v2.1.208 之前,读取空文件会返回超过末尾的通知。

555 565 

556Read 处理多种文件类型,不仅仅是纯文本:566Read 处理多种文件类型,不仅仅是纯文本:

557 567 

558* **图像**:PNG、JPG 和其他图像格式作为 Claude 可以看到的视觉内容返回,而不是原始字节。Claude Code 在发送大型图像之前会调整大小并重新压缩,以适应模型的图像大小限制,因此 Claude 可能会看到大型屏幕截图的缩小版本。在调整大小后仍然大于 500KB 的图像会被重新编码为质量降低的 JPEG,其像素尺寸保持不变。如果 Claude 在大型图像中遗漏了细微的像素级细节,请要求它先裁剪感兴趣的区域,例如通过 Bash 使用 ImageMagick。568* **图像**:PNG、JPG 和其他图像格式作为 Claude 可以看到的视觉内容返回,而不是原始字节。Claude Code 在发送大型图像之前会调整大小并重新压缩,以适应模型的图像大小限制,因此 Claude 可能会看到大型屏幕截图的缩小版本。在调整大小后仍然大于 500KB 的图像会被重新编码为质量降低的 JPEG,其像素尺寸保持不变。如果 Claude 在大型图像中遗漏了细微的像素级细节,请要求它先裁剪感兴趣的区域,例如通过 Bash 使用 ImageMagick。

559* **PDF**:Claude 完整读取短 `.pdf` 文件。对于超过 10 页的 PDF,它使用 `pages` 参数按范围读取,例如 `"1-5"`,一次最多 20 页。页面范围读取使用 poppler-utils 中的 `pdftoppm` 呈现页面,因此在 macOS 上使用 `brew install poppler` 安装,在 Debian 和 Ubuntu 上使用 `apt-get install poppler-utils` 安装。在 Windows 和其他平台上,安装一个将 `pdftoppm` 放在 `PATH` 上的 poppler 构建。没有它,页面范围读取会失败并显示 `pdftoppm is not installed`。569* **PDF**:Claude 完整读取短 `.pdf` 文件。对于超过 10 页的 PDF,它使用 `pages` 参数按范围读取,例如 `"1-5"`,一次最多 20 页。页面范围读取使用 poppler-utils 中的 `pdftoppm` 呈现页面,因此在 macOS 上使用 `brew install poppler` 安装,在 Debian 和 Ubuntu 上使用 `apt-get install poppler-utils` 安装。在 Windows 和其他平台上,安装一个将 `pdftoppm` 放在 `PATH` 上的 poppler 构建。没有它,页面范围读取会失败并显示 `pdftoppm is not installed`。

560* **Jupyter 笔记本**:`.ipynb` 文件返回所有单元格及其输出,包括代码、markdown 和可视化。Claude Code 拒绝读取超过 100 MB 的笔记本文件;错误会告诉 Claude 如何改为读取笔记本的一部分,例如使用 shell 命令读取单元格的一个切片。570* **Jupyter 笔记本**:`.ipynb` 文件返回所有单元格及其输出,包括代码、markdown 和可视化。如果笔记本的单元格总量超过 256 KB,或超过 [token 限制](#large-files),则会返回错误。Claude Code 拒绝读取超过 100 MB 的笔记本文件;错误会告诉 Claude 如何改为读取笔记本的一部分,例如使用 shell 命令读取单元格的一个切片。

561 571 

562Read 仅读取文件,不读取目录。Claude 使用 shell 命令(如 `ls`)列出目录内容。572Read 仅读取文件,不读取目录。Claude 使用 shell 命令(如 `ls`)列出目录内容。

563 573 

574<h3 id="large-files">

575 大型文件

576</h3>

577 

578Claude 可以读取大于单次 Read 调用所能返回内容的文本文件。默认情况下,单次调用最多返回 25,000 个 token,或您在 [`CLAUDE_CODE_FILE_READ_MAX_OUTPUT_TOKENS`](/docs/zh-CN/env-vars) 中设置的值,并且会拒绝读取超过 256 KB 的整个文件,因此 Claude 会使用 `offset` 和 `limit` 分页读取较大的文件。在 Claude Code v2.1.296 或更高版本中,Claude 可以在需要时(例如因为您要求读取整个文件)通过设置 `allow_large: true`,在一次调用中读取整个文件或较长的行范围。此类读取的大小依据会话[上下文窗口](/docs/zh-CN/context-window)中的剩余空间来确定,而不是依据默认限制。图像、PDF 和笔记本仍保留各自的限制。

579 

580当读取超过默认限制时,Claude 收到的内容:

581 

582* **整个文件超过 token 限制**:文件的第一页,并附带 `PARTIAL view` 通知,说明它接收了多少文件内容以及如何使用 `offset` 和 `limit` 读取更多内容

583* **整个文件超过 256 KB,或使用 `offset` 或 `limit` 的读取超过 token 限制**:一个错误,告诉它使用 `offset` 和 `limit` 读取一部分内容,或改用 [Grep](#grep-tool-behavior) 搜索特定内容

584 

564<h2 id="sendfeedback-tool-behavior">585<h2 id="sendfeedback-tool-behavior">

565 SendFeedback 工具行为586 SendFeedback 工具行为

566</h2>587</h2>


734 Write tool 行为755 Write tool 行为

735</h2>756</h2>

736 757 

737Write tool 创建一个新文件或用提供的完整内容覆盖现有文件。它不会追加或合并。758Write tool 创建一个新文件或用提供的完整内容覆盖现有文件。它不会追加或合并。对于字节无法解码的现有文件,Write 同样会将其覆盖,并将新内容保存为 UTF-8,详见[非 UTF-8 文件](#non-utf-8-files)。

738 759 

739Claude 是否必须在当前对话中读取现有文件后才能覆盖它取决于模型和文件:760Claude 是否必须在当前对话中读取现有文件后才能覆盖它取决于模型和文件:

740 761 

741* Claude Opus 4.6、Claude Haiku 4.5 和更早的模型始终需要读取,因此对未读的现有文件进行 Write 操作会失败并显示错误。762* Claude Opus 4.6、Claude Haiku 4.5 和更早的模型始终需要读取,因此对未读的现有文件进行 Write 操作会失败并显示错误。

742* 较新的模型可以在与[读取前编辑](#edit-tool-behavior)相同的条件下覆盖他们在此会话中从未读过的文件:读取它不需要权限提示,且 Read tool 可用。763* 较新的模型可以在与[读取前编辑](#edit-tool-behavior)相同的条件下覆盖他们在此会话中从未读过的文件:读取它不需要权限提示,且 Read tool 可用。

743* Jupyter notebooks 和 Claude 仅部分读取的文件(带有[`PARTIAL view` 通知](#read-tool-behavior))在每个模型上都需要读取。764* Jupyter notebooks 和 Claude 仅部分读取的文件(带有[`PARTIAL view` 通知](#large-files))在每个模型上都需要读取。

744 765 

745此约束不适用于新文件。在 v2.1.228 之前,每个模型都需要在覆盖现有文件前进行读取。766此约束不适用于新文件。在 v2.1.228 之前,每个模型都需要在覆盖现有文件前进行读取。

746 767 

Details

1212如果登录后看到 `API Error: 403 Request not allowed`:1212如果登录后看到 `API Error: 403 Request not allowed`:

1213 1213 

1214* **Claude Pro/Max 用户**:在 [claude.ai/settings](https://claude.ai/settings) 验证您的订阅是否有效1214* **Claude Pro/Max 用户**:在 [claude.ai/settings](https://claude.ai/settings) 验证您的订阅是否有效

1215* **Anthropic Console 用户**:确认您的账户具有"Claude Code"或"Developer"角色。管理员在 Anthropic Console 的"Settings → Members"中分配此角色。1215* **Anthropic Console 用户**:确认您的账户具有"Claude Code"或"Developer"角色。管理员在 Console 的 Members 页面 [platform.claude.com/settings/members](https://platform.claude.com/settings/members) 中分配此角色。

1216* **在代理后面**:企业代理可能干扰 API 请求。有关代理设置,请参阅 [network configuration](/docs/zh-CN/network-config)。1216* **在代理后面**:企业代理可能干扰 API 请求。有关代理设置,请参阅 [network configuration](/docs/zh-CN/network-config)。

1217 1217 

1218<h3 id="claude-code-access-has-not-been-granted-for-this-account">1218<h3 id="claude-code-access-has-not-been-granted-for-this-account">

vs-code.md +3 −2

Details

237 237 

238要恢复已归档的会话,请展开 **Archived sessions** 并点击 **Unarchive session**。要一次性恢复所有已归档的会话,请将鼠标悬停在活动栏会话列表中的 **Archived sessions** 标题上,然后点击其取消归档图标,这需要 Claude Code v2.1.277 或更高版本。在 v2.1.257 之前,该操作是 **Delete session**,它会隐藏会话且无法恢复。升级后,您当时删除的会话会出现在 **Archived sessions** 下。238要恢复已归档的会话,请展开 **Archived sessions** 并点击 **Unarchive session**。要一次性恢复所有已归档的会话,请将鼠标悬停在活动栏会话列表中的 **Archived sessions** 标题上,然后点击其取消归档图标,这需要 Claude Code v2.1.277 或更高版本。在 v2.1.257 之前,该操作是 **Delete session**,它会隐藏会话且无法恢复。升级后,您当时删除的会话会出现在 **Archived sessions** 下。

239 239 

240当您恢复的对话以计划模式结束时,Claude Code 会恢复计划模式。需要 Claude Code v2.1.246 或更高版本。在以下两种情况下,Claude Code 不会恢复计划模式:240当您恢复的对话以计划模式结束时,Claude Code 会恢复计划模式。需要 Claude Code v2.1.246 或更高版本。在以下情况下,Claude Code 不会恢复计划模式:

241 241 

242* 扩展根据 `claudeCode.initialPermissionMode` 或从先前对话沿用的选择来[选择初始权限模式](/docs/zh-CN/permission-modes#switch-permission-modes)242* 扩展根据 `claudeCode.initialPermissionMode` 或从先前对话沿用的选择来[选择初始权限模式](/docs/zh-CN/permission-modes#switch-permission-modes)

243* 您配置了 `claudeCode.claudeProcessWrapper`243* 您配置了 `claudeCode.claudeProcessWrapper`

244* 某条[拒绝规则](/docs/zh-CN/permissions#manage-permissions)移除了 [`ExitPlanMode`](/docs/zh-CN/tools-reference) 工具

244 245 

245<h3 id="resume-cloud-sessions-from-claude-ai">246<h3 id="resume-cloud-sessions-from-claude-ai">

246 从 Claude.ai 恢复云端会话247 从 Claude.ai 恢复云端会话


479 480 

480Claude 为浏览器任务打开新标签页并共享您浏览器的登录状态,因此它可以访问您已登录的任何网站。481Claude 为浏览器任务打开新标签页并共享您浏览器的登录状态,因此它可以访问您已登录的任何网站。

481 482 

482如需让每个会话在启动时自动连接到您的浏览器,而无需输入 `@browser`,请参阅[默认启用 Chrome](/docs/zh-CN/chrome#enable-chrome-by-default)。关于在以这种方式连接的会话中,Claude Code 在执行浏览器操作前询问您的情况,请参阅 [VS Code 会话中的权限提示](/docs/zh-CN/chrome#permission-prompts-in-vs-code-sessions)。483如需让每个会话在启动时自动连接到您的浏览器,而无需输入 `@browser`,请参阅[默认启用 Chrome](/docs/zh-CN/chrome#enable-chrome-by-default)。关于 Claude Code 在执行浏览器操作前询问您的情况,请参阅 [VS Code 会话中的权限提示](/docs/zh-CN/chrome#permission-prompts-in-vs-code-sessions)。

483 484 

484有关设置说明、完整的功能列表和故障排除,请参阅 [在 Chrome 中使用 Claude Code](/docs/zh-CN/chrome)。485有关设置说明、完整的功能列表和故障排除,请参阅 [在 Chrome 中使用 Claude Code](/docs/zh-CN/chrome)。

485 486 

workflows.md +1 −1

Details

511* 在大型运行前检查 `/model`,如果您通常为日常工作切换到较小的模型511* 在大型运行前检查 `/model`,如果您通常为日常工作切换到较小的模型

512* 当您描述任务时,要求 Claude 为不需要最强模型的阶段使用较小的模型512* 当您描述任务时,要求 Claude 为不需要最强模型的阶段使用较小的模型

513 513 

514当您组织的 [`availableModels` 允许列表](/docs/zh-CN/model-config#restrict-model-selection)阻止脚本为代理请求的模型时,该代理会改为在替代模型上运行,遵循与子代理相同的[替代规则](/docs/zh-CN/sub-agents#choose-a-model)。[`/workflows`](#watch-the-run) 中的运行进度视图显示一个警告,命名请求的和替代的模型。514当您组织的 [`availableModels` 允许列表](/docs/zh-CN/model-config#restrict-model-selection)阻止脚本为某个 Agent 请求的模型时,该 Agent 会改为在替代模型上运行,遵循与[子代理相同的替代规则](/docs/zh-CN/sub-agents#choose-a-model)。

515 515 

516<h3 id="set-a-size-guideline">516<h3 id="set-a-size-guideline">

517 设置大小指南517 设置大小指南

worktrees.md +3 −1

Details

268 268 

269 相同的读取覆盖也适用于 `.claude/agents` 和 `.claude/commands`。对于 skills,读取覆盖需要 Claude Code v2.1.277 或更高版本。269 相同的读取覆盖也适用于 `.claude/agents` 和 `.claude/commands`。对于 skills,读取覆盖需要 Claude Code v2.1.277 或更高版本。

270 270 

271无论您是使用 `--worktree`、使用 `git worktree add` 还是通过[桌面应用](/docs/zh-CN/desktop#work-in-parallel-with-sessions)创建 worktree,所有这些都适用。271无论您是使用 `--worktree` 还是使用 `git worktree add` 创建 worktree,所有这些都适用。

272 

273在从[桌面应用](/docs/zh-CN/desktop#work-in-parallel-with-sessions)启动的 worktree 会话中,Claude Code 从主检出的根目录而不是从 worktree 读取项目配置,例如设置、hook、skill、Agent、命令和 [`.mcp.json`](/docs/zh-CN/mcp#project-scope) 服务器。Hook 命令在该根目录中运行,`${CLAUDE_PROJECT_DIR}` 也指向该根目录。要访问 Claude 正在处理的文件,请从 hook 的 [`cwd` 输入字段](/docs/zh-CN/hooks#common-input-fields)读取 worktree 的路径。`CLAUDE.md` 文件和 `.claude/rules/` 仍从 worktree 加载。

272 274 

273<h2 id="manage-worktrees-manually">275<h2 id="manage-worktrees-manually">

274 手动管理 worktrees276 手动管理 worktrees