SpyBara
Go Premium

Documentation 2026-09-11 23:01 UTC to 2026-09-12 03:02 UTC

93 files changed +16,229 −2,155. View all changes and history on the product overview
2026
Fri 25 23:58 Thu 24 22:57 Wed 23 23:57 Tue 22 23:59 Mon 21 22:59 Sun 20 23:59 Sat 19 23:57 Fri 18 23:58 Tue 15 23:58 Mon 14 22:58 Sun 13 21:00 Sat 12 03:02 Thu 10 23:00 Wed 9 22:58 Tue 8 20:00 Tue 1 21:02

advisor.md +3 −3

Details

98顾问的能力必须至少与主模型相同。每个主模型接受的顾问是:98顾问的能力必须至少与主模型相同。每个主模型接受的顾问是:

99 99 

100| 主模型 | 接受的顾问 | 注释 |100| 主模型 | 接受的顾问 | 注释 |

101| ------------------- | ----------------------- | ----------------------------------------------------------------------------------------- |101| ------------------- | -------------------- | ----------------------------------------------------------------------------------------- |

102| Haiku 4.5 | Fable、Opus、Sonnet | Haiku 可以调用顾问但不能充当顾问 |102| Haiku 4.5 | Fable、Opus、Sonnet | Haiku 可以调用顾问但不能充当顾问 |

103| Sonnet 4.6 | Fable、Opus、Sonnet | |103| Sonnet 4.6 | Fable、Opus、Sonnet | |

104| Sonnet 5 | Fable、Opus、Sonnet 5 | Sonnet 4.6 顾问被拒绝 |104| Sonnet 5 | Fable、Opus、Sonnet 5 | Sonnet 4.6 顾问被拒绝 |

105| Opus 4.6 | Fable、Opus、Sonnet 5 | Sonnet 5 和 Opus 4.6 的能力排名相同,因此 Opus 4.6 主模型接受 Sonnet 5 顾问 |105| Opus 4.6 | Fable、Opus、Sonnet 5 | Sonnet 5 和 Opus 4.6 的能力排名相同,因此 Opus 4.6 主模型接受 Sonnet 5 顾问 |

106| Opus 4.7 或更高版本 | Fable、Opus 4.7 或更高版本 | Opus 4.7 和更高版本的 Opus 模型的能力排名相同,因此任何一个都可以接受另一个作为顾问。Opus 4.7 主模型与 Opus 4.6 或 Sonnet 5 顾问被拒绝 |106| Opus 4.7 或更高版本 | Fable、Opus 4.7 或更高版本 | Opus 4.7 和更高版本的 Opus 模型的能力排名相同,因此任何一个都可以接受另一个作为顾问。Opus 4.7 主模型与 Opus 4.6 或 Sonnet 5 顾问被拒绝 |

107| Fable 5.1 或 Fable 5 | Fable 5.1 或相同的 Fable 版本 | Opus 或 Sonnet 顾问被拒绝,Fable 5 顾问对于 Fable 5.1 主模型也被拒绝 |107| Fable 5.1 或 Fable 5 | Fable 5.1 或 Fable 5 | Opus 或 Sonnet 顾问被拒绝 |

108 108 

109Fable 5.1 需要 Claude Code v2.1.257 或更高版本,Fable 5 需要 v2.1.170 或更高版本。两者都需要 [Fable 访问权限](/docs/zh-CN/model-config#work-with-fable)。109Fable 5.1 需要 Claude Code v2.1.257 或更高版本。两个 Fable 模型都需要 [Fable 访问权限](/docs/zh-CN/model-config#work-with-fable)。

110 110 

111将顾问设置为 `fable`、`opus` 或 `sonnet`。这些别名解析为 Claude Code 为每个模型系列内置的默认版本,该版本随新的 Claude Code 版本而推进。您也可以传递完整的模型 ID,例如 `claude-opus-5`。111将顾问设置为 `fable`、`opus` 或 `sonnet`。这些别名解析为 Claude Code 为每个模型系列内置的默认版本,该版本随新的 Claude Code 版本而推进。您也可以传递完整的模型 ID,例如 `claude-opus-5`。

112 112 

Details

6 6 

7> 了解消息生命周期、工具执行、上下文窗口和支持 SDK 代理的架构。7> 了解消息生命周期、工具执行、上下文窗口和支持 SDK 代理的架构。

8 8 

9Agent SDK 让你能够在自己的应用程序中嵌入 Claude Code 的自主代理循环。SDK 是一个独立的包,让你能够以编程方式控制工具、权限、成本限制和输出。你不需要安装 Claude Code CLI 就能使用它。9Agent SDK 让你能够在自己的应用程序中嵌入 Claude Code 的自主代理循环。SDK 是一个独立的包,让你能够以编程方式控制工具、权限、成本限制和输出。

10 10 

11启动代理时,SDK 运行与 [Claude Code 相同的执行循环](/zh-CN/how-claude-code-works#the-agentic-loop):Claude 评估你的提示,调用工具采取行动,接收结果,然后重复直到任务完成。本页解释循环内部发生的情况,以便你能够有效地构建、调试和优化代理。11TypeScript 和 Python SDK 都捆绑了原生 Claude Code 二进制文件,因此大多数安装不需要单独安装 Claude Code。有关需要单独安装的情况,请参阅 [快速入门的安装说明](/docs/zh-CN/agent-sdk/quickstart)。

12 

13启动代理时,SDK 运行与 [Claude Code 相同的执行循环](/docs/zh-CN/how-claude-code-works#the-agentic-loop):Claude 评估你的提示,调用工具采取行动,接收结果,然后重复直到任务完成。本页解释循环内部发生的情况,以便你能够有效地构建、调试和优化代理。

12 14 

13<h2 id="the-loop-at-a-glance">15<h2 id="the-loop-at-a-glance">

14 循环概览16 循环概览


16 18 

17每个代理会话都遵循相同的周期:19每个代理会话都遵循相同的周期:

18 20 

19<img src="https://mintcdn.com/claude-code/ikqp3_70mqIahteV/images/agent-loop-diagram.svg?fit=max&auto=format&n=ikqp3_70mqIahteV&q=85&s=1c6e8f28d80dba14a7287419656f1237" alt="代理循环的图表:你的提示进入代理循环,Claude 评估并要么请求工具调用(其结果反馈到另一个评估中),要么返回最终答案" width="720" height="212" data-path="images/agent-loop-diagram.svg" />21<img src="https://mintcdn.com/claude-code/ikqp3_70mqIahteV/images/agent-loop-diagram.svg?fit=max&auto=format&n=ikqp3_70mqIahteV&q=85&s=1c6e8f28d80dba14a7287419656f1237" className="dark:hidden" alt="代理循环的图表:你的提示进入代理循环,Claude 评估并要么请求工具调用(其结果反馈到另一个评估中),要么返回最终答案" width="720" height="212" data-path="images/agent-loop-diagram.svg" />

22 

23<img src="https://mintcdn.com/claude-code/_xqph1dUOslCOwsj/images/agent-loop-diagram-dark.svg?fit=max&auto=format&n=_xqph1dUOslCOwsj&q=85&s=afe723c52a324d3c61fa72fb02432ab6" className="hidden dark:block" alt="代理循环的图表:你的提示进入代理循环,Claude 评估并要么请求工具调用(其结果反馈到另一个评估中),要么返回最终答案" width="720" height="212" data-path="images/agent-loop-diagram-dark.svg" />

20 24 

211. **接收提示。** Claude 接收你的提示,以及系统提示、工具定义和对话历史。SDK 产生一个 [`SystemMessage`](#message-types),子类型为 `"init"`,包含会话元数据。251. **接收提示。** Claude 接收你的提示,以及系统提示、工具定义和对话历史。SDK 产生一个 [`SystemMessage`](#message-types),子类型为 `"init"`,包含会话元数据。

222. **评估并响应。** Claude 评估当前状态并确定如何继续。它可能用文本响应、请求一个或多个工具调用,或两者都有。SDK 产生一个 [`AssistantMessage`](#message-types),包含文本和任何工具调用请求。262. **评估并响应。** Claude 评估当前状态并确定如何继续。它可能用文本响应、请求一个或多个工具调用,或两者都有。SDK 产生一个或多个 [`AssistantMessage`](#message-types) 对象,每个内容块一个,例如文本块或工具调用请求。

233. **执行工具。** SDK 运行每个请求的工具并收集结果。每组工具结果反馈给 Claude 以做出下一个决定。你可以使用 [hooks](/zh-CN/agent-sdk/hooks) 在工具运行前拦截、修改或阻止工具调用。273. **执行工具。** SDK 运行每个请求的工具并收集结果。每组工具结果反馈给 Claude 以做出下一个决定。你可以使用 [hooks](/docs/zh-CN/agent-sdk/hooks) 在工具运行前拦截、修改或阻止工具调用。

244. **重复。** 步骤 2 和 3 作为一个循环重复。每个完整循环是一个轮次。Claude 继续调用工具并处理结果,直到产生没有工具调用的响应。284. **重复。** 步骤 2 和 3 作为一个循环重复。每个完整循环是一个轮次。Claude 继续调用工具并处理结果,直到产生没有工具调用的响应。

255. **返回结果。** SDK 产生最终的 [`AssistantMessage`](#message-types),包含文本响应(无工具调用),然后是 [`ResultMessage`](#message-types),包含最终文本、令牌使用、成本和会话 ID。295. **返回结果。** SDK 产生最终的 [`AssistantMessage`](#message-types),包含文本响应(无工具调用),然后是 [`ResultMessage`](#message-types),包含最终文本、令牌使用、成本和会话 ID。

26 30 


37首先,SDK 将你的提示发送给 Claude 并产生一个 [`SystemMessage`](#message-types),包含会话元数据。然后循环开始:41首先,SDK 将你的提示发送给 Claude 并产生一个 [`SystemMessage`](#message-types),包含会话元数据。然后循环开始:

38 42 

391. **轮次 1:** Claude 调用 `Bash` 运行 `npm test`。SDK 产生一个 [`AssistantMessage`](#message-types),包含工具调用,执行命令,然后产生一个 [`UserMessage`](#message-types),包含输出(三个失败)。431. **轮次 1:** Claude 调用 `Bash` 运行 `npm test`。SDK 产生一个 [`AssistantMessage`](#message-types),包含工具调用,执行命令,然后产生一个 [`UserMessage`](#message-types),包含输出(三个失败)。

402. **轮次 2:** Claude 在 `auth.ts` 和 `auth.test.ts` 上调用 `Read`。SDK 返回文件内容并产生一个 `AssistantMessage`。442. **轮次 2:** Claude 在 `auth.ts` 和 `auth.test.ts` 上调用 `Read`。SDK 产生每个调用的 `AssistantMessage` 并返回文件内容。

413. **轮次 3:** Claude 调用 `Edit` 修复 `auth.ts`,然后调用 `Bash` 重新运行 `npm test`。所有三个测试都通过。SDK 产生一个 `AssistantMessage`。453. **轮次 3:** Claude 调用 `Edit` 修复 `auth.ts`,然后调用 `Bash` 重新运行 `npm test`。所有三个测试都通过。SDK 产生每个调用的 `AssistantMessage`。

424. **最后轮次:** Claude 产生仅包含文本的响应,没有工具调用:"修复了认证错误,所有三个测试现在都通过了。" SDK 产生最终的 `AssistantMessage`,包含此文本,然后是 [`ResultMessage`](#message-types),包含相同的文本加上成本和使用情况。464. **最后轮次:** Claude 产生仅包含文本的响应,没有工具调用:"修复了认证错误,所有三个测试现在都通过了。" SDK 产生最终的 `AssistantMessage`,包含此文本,然后是 [`ResultMessage`](#message-types),包含相同的文本加上成本和使用情况。

43 47 

44那是四个轮次:三个有工具调用,一个最终仅包含文本的响应。48那是四个轮次:三个有工具调用,一个最终仅包含文本的响应。


55 59 

56* **`SystemMessage`:** 会话生命周期事件。`subtype` 字段区分它们:60* **`SystemMessage`:** 会话生命周期事件。`subtype` 字段区分它们:

57 61 

58 * `"init"`:运行的会话元数据。当 `SessionStart` 或 `Setup` hook 在会话启动期间运行时,其 [hook 生命周期消息](/zh-CN/agent-sdk/typescript#sdkhookstartedmessage) 在 `init` 消息之前到达62 * `"init"`:运行的会话元数据。当 `SessionStart` 或 `Setup` hook 在会话启动期间运行时,其 [hook 生命周期消息](/docs/zh-CN/agent-sdk/typescript#sdkhookstartedmessage) 在 `init` 消息之前到达

59 * `"compact_boundary"`:在 [compaction](#automatic-compaction) 后触发63 * `"compact_boundary"`:在 [compaction](#automatic-compaction) 后触发

60 * `"informational"`:来自循环的纯文本状态横幅64 * `"informational"`:来自循环的纯文本状态横幅

61 * `"worker_shutting_down"`:循环将在当前轮次后结束,因为主机正在退出或 Remote Control 已断开连接65 * `"worker_shutting_down"`:循环将在当前轮次后结束,因为主机正在退出或 Remote Control 已断开连接

62 66 

63 在 TypeScript 中,除了 `"init"` 之外的每个 subtype 在 [`SDKMessage` union](/zh-CN/agent-sdk/typescript#sdkmessage) 中都是其自己的类型,而不是 `SDKSystemMessage` 的子类型。67 在 TypeScript 中,除了 `"init"` 之外的每个 subtype 在 [`SDKMessage` union](/docs/zh-CN/agent-sdk/typescript#sdkmessage) 中都是其自己的类型,而不是 `SDKSystemMessage` 的子类型。

64* **`AssistantMessage`:** 在每个 Claude 响应后发出,包括最终仅包含文本的响应。包含该轮次的文本内容块和工具调用块。68* **`AssistantMessage`:** 为 Claude 响应中的每个内容块发出,包括最终仅包含文本的块。每个块都包含单个内容块,例如文本或工具调用,来自一个响应的消息共享一个消息 ID。

65* **`UserMessage`:** 在每个工具执行后发出,包含发送回 Claude 的工具结果内容。也为你在循环中间流式传输的任何用户输入发出。69* **`UserMessage`:** 在每个工具执行后发出,包含发送回 Claude 的工具结果内容。也为你在循环中间流式传输的任何用户输入发出。

66* **`StreamEvent`:** 仅在启用部分消息时发出。包含原始 API 流事件(文本增量、工具输入块)。请参阅 [Stream responses](/zh-CN/agent-sdk/streaming-output)。70* **`StreamEvent`:** 仅在启用部分消息时发出。包含原始 API 流事件(文本增量、工具输入块)。请参阅 [Stream responses](/docs/zh-CN/agent-sdk/streaming-output)。

67* **`ResultMessage`:** 标记代理循环的结束。包含最终文本结果、令牌使用、成本和会话 ID。检查 `subtype` 字段以确定任务是否成功或达到限制。少数尾随系统事件(如 `prompt_suggestion`)可能在其后到达,因此迭代流直到完成,而不是在结果处中断。请参阅 [Handle the result](#handle-the-result)。71* **`ResultMessage`:** 标记代理循环的结束。包含最终文本结果、令牌使用、成本和会话 ID。检查 `subtype` 字段以确定任务是否成功或达到限制。少数尾随系统事件(如 `prompt_suggestion`)可能在其后到达,因此迭代流直到完成,而不是在结果处中断。请参阅 [Handle the result](#handle-the-result)。

68 72 

69这五种类型涵盖了两个 SDK 中完整的代理循环生命周期。TypeScript SDK 还产生额外的可观测性事件(hook 事件、工具进度、速率限制、任务通知),提供额外的细节,但不是驱动循环所必需的。有关完整列表,请参阅 [Python message types reference](/zh-CN/agent-sdk/python#message-types) 和 [TypeScript message types reference](/zh-CN/agent-sdk/typescript#message-types)。73这五种类型涵盖了完整的代理循环生命周期。两个 SDK 也产生可观测性事件,例如速率限制状态和任务通知,这些不是驱动循环所必需的。有关完整列表,请参阅 [Python message types reference](/docs/zh-CN/agent-sdk/python#message-types) 和 [TypeScript message types reference](/docs/zh-CN/agent-sdk/typescript#message-types)。

70 74 

71<h3 id="handle-messages">75<h3 id="handle-messages">

72 处理消息76 处理消息


76 80 

77* **仅最终结果:** 处理 `ResultMessage` 以获取输出、成本以及任务是否成功或达到限制。81* **仅最终结果:** 处理 `ResultMessage` 以获取输出、成本以及任务是否成功或达到限制。

78* **进度更新:** 处理 `AssistantMessage` 以查看 Claude 每个轮次在做什么,包括它调用了哪些工具。82* **进度更新:** 处理 `AssistantMessage` 以查看 Claude 每个轮次在做什么,包括它调用了哪些工具。

79* **实时流式传输:** 启用部分消息(Python 中的 `include_partial_messages`,TypeScript 中的 `includePartialMessages`)以实时获取 `StreamEvent` 消息。请参阅 [Stream responses in real-time](/zh-CN/agent-sdk/streaming-output)。83* **实时流式传输:** 启用部分消息(Python 中的 `include_partial_messages`,TypeScript 中的 `includePartialMessages`)以实时获取 `StreamEvent` 消息。请参阅 [Stream responses in real-time](/docs/zh-CN/agent-sdk/streaming-output)。

80 84 

81检查消息类型的方式取决于 SDK:85检查消息类型的方式取决于 SDK:

82 86 


87 <CodeGroup>91 <CodeGroup>

88 ```python Python theme={null}92 ```python Python theme={null}

89 import asyncio93 import asyncio

90 from claude_agent_sdk import query, AssistantMessage, ResultMessage94 from claude_agent_sdk import query, AssistantMessage, ResultMessage, TextBlock, ToolUseBlock

91 95 

92 96 

93 async def main():97 async def main():

94 try:98 try:

95 async for message in query(prompt="Summarize this project"):99 async for message in query(prompt="Summarize this project"):

96 if isinstance(message, AssistantMessage):100 if isinstance(message, AssistantMessage):

97 print(f"Turn completed: {len(message.content)} content blocks")101 # Each AssistantMessage carries one content block

102 for block in message.content:

103 if isinstance(block, TextBlock):

104 print(f"Claude: {block.text}")

105 elif isinstance(block, ToolUseBlock):

106 print(f"Tool call: {block.name}")

98 if isinstance(message, ResultMessage):107 if isinstance(message, ResultMessage):

99 if message.subtype == "success":108 if message.subtype == "success":

100 print(message.result)109 print(message.result)


116 try {125 try {

117 for await (const message of query({ prompt: "Summarize this project" })) {126 for await (const message of query({ prompt: "Summarize this project" })) {

118 if (message.type === "assistant") {127 if (message.type === "assistant") {

119 console.log(`Turn completed: ${message.message.content.length} content blocks`);128 // Each assistant message carries one content block

129 for (const block of message.message.content) {

130 if (block.type === "text") {

131 console.log(`Claude: ${block.text}`);

132 } else if (block.type === "tool_use") {

133 console.log(`Tool call: ${block.name}`);

134 }

135 }

120 }136 }

121 if (message.type === "result") {137 if (message.type === "result") {

122 if (message.subtype === "success") {138 if (message.subtype === "success") {


157| **发现** | `ToolSearch` | 动态查找和按需加载工具,而不是预加载所有工具 |173| **发现** | `ToolSearch` | 动态查找和按需加载工具,而不是预加载所有工具 |

158| **编排** | `Agent`、`Skill`、`AskUserQuestion`、`TaskCreate`、`TaskUpdate` | 生成子代理、调用技能、询问用户、跟踪任务 |174| **编排** | `Agent`、`Skill`、`AskUserQuestion`、`TaskCreate`、`TaskUpdate` | 生成子代理、调用技能、询问用户、跟踪任务 |

159 175 

176在[不支持任务跟踪工具的模型](/docs/zh-CN/agent-sdk/todo-tracking#model-availability)上,Claude Code 仅在你选择加入时才提供 `TaskCreate` 和 `TaskUpdate`。

177 

160除了内置工具,你还可以:178除了内置工具,你还可以:

161 179 

162* **使用 [MCP 服务器](/zh-CN/agent-sdk/mcp) 连接外部服务**(数据库、浏览器、API)180* **使用 [MCP 服务器](/docs/zh-CN/agent-sdk/mcp) 连接外部服务**(数据库、浏览器、API)

163* **使用 [自定义工具处理程序](/zh-CN/agent-sdk/custom-tools) 定义自定义工具**181* **使用 [自定义工具处理程序](/docs/zh-CN/agent-sdk/custom-tools) 定义自定义工具**

164* **通过 [设置源](/zh-CN/agent-sdk/claude-code-features) 加载项目技能**以实现可重用工作流182* **通过 [设置源](/docs/zh-CN/agent-sdk/claude-code-features) 加载项目技能**以实现可重用工作流

165 183 

166<h3 id="tool-permissions">184<h3 id="tool-permissions">

167 工具权限185 工具权限


169 187 

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

171 189 

172* **`allowed_tools` / `allowedTools`** 自动批准列出的工具。具有 `["Read", "Glob", "Grep"]` 在其允许工具列表中的只读代理运行这些工具而不提示。未列出的工具仍然可用但需要权限。190* **`allowed_tools` / `allowedTools`** 自动批准列出的工具。具有 `["Read", "Glob", "Grep"]` 在其允许工具列表中的只读代理运行这些工具而不提示。未列出的工具仍然可用,对它们的调用如果需要批准会转到权限模式和 `canUseTool`。

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

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

175 193 

176你也可以使用 `"Bash(npm *)"` 之类的规则来限制单个工具,以仅允许特定命令。有关完整规则语法,请参阅 [权限](/zh-CN/agent-sdk/permissions)。194你也可以使用 `"Bash(npm *)"` 之类的规则来限制单个工具,以仅允许特定命令。有关完整规则语法,请参阅 [权限](/docs/zh-CN/agent-sdk/permissions)。

177 195 

178当工具被拒绝时,Claude 接收拒绝消息作为工具结果,通常尝试不同的方法或报告它无法继续。196当工具被拒绝时,Claude 接收拒绝消息作为工具结果,通常尝试不同的方法或报告它无法继续。

179 197 


183 201 

184当 Claude 在单个轮次中请求多个工具调用时,两个 SDK 都可以根据工具并发或顺序运行它们。只读工具(如 `Read`、`Glob`、`Grep` 和标记为只读的 MCP 工具)可以并发运行。修改状态的工具(如 `Edit`、`Write` 和 `Bash`)顺序运行以避免冲突。202当 Claude 在单个轮次中请求多个工具调用时,两个 SDK 都可以根据工具并发或顺序运行它们。只读工具(如 `Read`、`Glob`、`Grep` 和标记为只读的 MCP 工具)可以并发运行。修改状态的工具(如 `Edit`、`Write` 和 `Bash`)顺序运行以避免冲突。

185 203 

186自定义工具默认为顺序执行。要为自定义工具启用并行执行,请在其注释中设置 `readOnlyHint`。[TypeScript](/zh-CN/agent-sdk/typescript#tool) 和 [Python](/zh-CN/agent-sdk/python#tool) SDK 都使用来自 MCP SDK 的此字段名。204自定义工具默认为顺序执行。要为自定义工具启用并行执行,请在其注释中设置 `readOnlyHint`。[TypeScript](/docs/zh-CN/agent-sdk/typescript#tool) 和 [Python](/docs/zh-CN/agent-sdk/python#tool) SDK 都使用来自 MCP SDK 的此字段名。

187 205 

188<h2 id="control-how-the-loop-runs">206<h2 id="control-how-the-loop-runs">

189 控制循环如何运行207 控制循环如何运行

190</h2>208</h2>

191 209 

192你可以限制循环进行多少轮次、成本多少、Claude 推理的深度,以及工具是否需要在运行前获得批准。所有这些都是 [`ClaudeAgentOptions`](/zh-CN/agent-sdk/python#claudeagentoptions)(Python)/ [`Options`](/zh-CN/agent-sdk/typescript#options)(TypeScript)上的字段。210你可以限制循环进行多少轮次、成本多少、Claude 推理的深度,以及工具是否需要在运行前获得批准。所有这些都是 [`ClaudeAgentOptions`](/docs/zh-CN/agent-sdk/python#claudeagentoptions)(Python)/ [`Options`](/docs/zh-CN/agent-sdk/typescript#options)(TypeScript)上的字段。

193 211 

194<h3 id="turns-and-budget">212<h3 id="turns-and-budget">

195 轮次和预算213 轮次和预算


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

201| 最大预算(`max_budget_usd` / `maxBudgetUsd`) | 停止前的最大成本 | 无限制 |219| 最大预算(`max_budget_usd` / `maxBudgetUsd`) | 停止前的最大成本 | 无限制 |

202 220 

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

222 

223预算上限涵盖 [子代理](/docs/zh-CN/agent-sdk/subagents):它们的支出计入总额。一旦支出达到上限,生成另一个子代理会失败并显示 `Budget limit reached`,Claude Code 会停止任何仍在运行的后台子代理。上限执行行为需要 Claude Code v2.1.217 或更高版本。

204 224 

205使用 [流式输入](/zh-CN/agent-sdk/streaming-vs-single-mode),当轮次在最大轮次限制处结束时,你在轮次仍在运行时发送的消息会保持排队状态,并在其自己的轮次中开始,具有自己的最大轮次限制。在 v2.1.205 之前,到达轮次最后迭代的消息可能会被消耗到结束轮次中并丢失,而不会到达模型。225使用 [流式输入](/docs/zh-CN/agent-sdk/streaming-vs-single-mode),当轮次在最大轮次限制处结束时,仍在队列中的消息保持排队。Claude Code 不会将其添加到该轮次的最后一次模型调用中。它为该消息启动新轮次,该轮次的最大轮次计数重新开始。

206 226 

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

208 努力级别228 努力级别


211`effort` 选项控制 Claude 应用多少推理。较低的努力级别每个轮次使用更少的令牌并降低成本。并非所有模型都支持努力参数。有关哪些模型支持它,请参阅 [Effort](https://platform.claude.com/docs/en/build-with-claude/effort)。231`effort` 选项控制 Claude 应用多少推理。较低的努力级别每个轮次使用更少的令牌并降低成本。并非所有模型都支持努力参数。有关哪些模型支持它,请参阅 [Effort](https://platform.claude.com/docs/en/build-with-claude/effort)。

212 232 

213| 级别 | 行为 | 适合 |233| 级别 | 行为 | 适合 |

214| :--------- | :-------- | :----------------------------------------- |234| :--------- | :-------- | :------------------------------------------------------------ |

215| `"low"` | 最小推理,快速响应 | 文件查找、列出目录 |235| `"low"` | 最小推理,快速响应 | 文件查找、列出目录 |

216| `"medium"` | 平衡推理 | 常规编辑、标准任务 |236| `"medium"` | 平衡推理 | 常规编辑、标准任务 |

217| `"high"` | 彻底分析 | 重构、调试 |237| `"high"` | 彻底分析 | 重构、调试 |

218| `"xhigh"` | 扩展推理深度 | 编码和代理任务;在 Fable 5、Opus 4.7+ 和 Sonnet 5 上推荐 |238| `"xhigh"` | 扩展推理深度 | 编码和代理任务,在 [支持它的模型](/docs/zh-CN/model-config#adjust-effort-level) 上 |

219| `"max"` | 最大推理深度 | 需要深度分析的多步骤问题 |239| `"max"` | 最大推理深度 | 需要深度分析的多步骤问题 |

220 240 

221如果你不设置 `effort`,两个 SDK 都会将参数保留未设置,并遵从模型的默认行为。241如果你不设置 `effort`,两个 SDK 都会将参数保留未设置,并遵从模型的默认行为。

222 242 

223<Note>243<Note>

224 `effort` 在每个响应内交换延迟和令牌成本以获得推理深度。[扩展思考](https://platform.claude.com/docs/en/build-with-claude/extended-thinking) 是一个单独的功能,在输出中产生可见的思维链块。它们是独立的:你可以设置 `effort: "low"` 并启用扩展思考,或 `effort: "max"` 而不启用它。244 `effort` 在每个响应内交换延迟和令牌成本以获得推理深度。[扩展思考](https://platform.claude.com/docs/en/build-with-claude/extended-thinking) 是一个单独的功能,在输出中产生 `thinking` 块,[Python](/docs/zh-CN/agent-sdk/python#thinkingconfig) 或 [TypeScript](/docs/zh-CN/agent-sdk/typescript#thinkingconfig) 上 `ThinkingConfig` 的 `display` 字段控制你是否接收它们的文本。它们是独立的:你可以设置 `effort: "low"` 并启用扩展思考,或 `effort: "max"` 而不启用它。

225</Note>245</Note>

226 246 

227对于执行简单、范围明确的任务(如列出文件或运行单个 grep)的代理,使用较低的努力来降低成本和延迟。在顶级 `query()` 选项中为整个会话设置 `effort`,或在 [`AgentDefinition`](/zh-CN/agent-sdk/subagents#agentdefinition-configuration) 上使用 `effort` 字段为每个子代理设置以覆盖会话级别。247对于执行简单、范围明确的任务(如列出文件或运行单个 grep)的代理,使用较低的努力来降低成本和延迟。在顶级 `query()` 选项中为整个会话设置 `effort`,或在 [`AgentDefinition`](/docs/zh-CN/agent-sdk/subagents#agentdefinition-configuration) 上使用 `effort` 字段为每个子代理设置以覆盖会话级别。

228 248 

229<h3 id="permission-mode">249<h3 id="permission-mode">

230 权限模式250 权限模式


232 252 

233权限模式选项(Python 中的 `permission_mode`,TypeScript 中的 `permissionMode`)控制代理是否在使用工具前请求批准:253权限模式选项(Python 中的 `permission_mode`,TypeScript 中的 `permissionMode`)控制代理是否在使用工具前请求批准:

234 254 

235| 模式 | 行为 |255| 模式 | 行为 | 用例 |

236| :-------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |256| :-------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------ |

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

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

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

240| `"dontAsk"` | 从不提示。由 [权限规则](/zh-CN/settings#permission-settings) 预批准的工具运行;其他一切被拒绝。`AskUserQuestion`、连接器工具 [你的组织设置为 `ask`](/zh-CN/mcp#organization-controls-on-connector-tools) 和标记为 [`requiresUserInteraction`](/zh-CN/mcp#require-approval-for-a-specific-tool) 的 MCP 工具即使你已允许它们也会被拒绝 |260| `"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` 缺失时的无声依赖 |

241| `"auto"` | 使用模型分类器批准或拒绝每个工具调用。有关可用性和行为,请参阅 [自动模式](/zh-CN/permission-modes#eliminate-prompts-with-auto-mode) |261| `"auto"` | 使用模型分类器批准或拒绝权限提示。有关可用性和行为,请参阅 [自动模式](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode) | 仍然想要工具使用安全防护的自主代理 |

242| `"bypassPermissions"` | 运行所有允许的工具而不询问,除了由显式 [`ask` 规则](/zh-CN/settings#permission-settings) 匹配的工具、连接器工具 [你的组织设置为 `ask`](/zh-CN/mcp#organization-controls-on-connector-tools) 和需要用户交互的工具;有关优先级顺序,请参阅 [权限如何被评估](/zh-CN/agent-sdk/permissions#how-permissions-are-evaluated)。在 Unix 上以 root 身份运行时无法使用。仅在隔离环境中使用,其中代理的操作无法影响你关心的系统 |262| `"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、容器或其他隔离环境 |

243 263 

244对于交互式应用程序,使用 `"default"` 和工具批准回调来显示批准提示。对于开发机器上的自主代理,`"acceptEdits"` 自动批准文件编辑和常见文件系统命令(`mkdir`、`touch`、`mv`、`cp` 等),同时仍然在允许规则后面限制其他 `Bash` 命令。为 CI、容器或其他隔离环境保留 `"bypassPermissions"`。有关完整详情,请参阅 [权限](/zh-CN/agent-sdk/permissions)。264对于交互式应用程序,使用 `"default"` 和工具批准回调来显示批准提示。对于开发机器上的自主代理,`"acceptEdits"` 自动批准文件编辑和常见文件系统命令(`mkdir`、`touch`、`mv`、`cp` 等),同时仍然在允许规则后面限制其他 `Bash` 命令。为 CI、容器或其他隔离环境保留 `"bypassPermissions"`。有关完整详情,请参阅 [权限](/docs/zh-CN/agent-sdk/permissions)。

245 265 

246<h3 id="model">266<h3 id="model">

247 模型267 模型


253 上下文窗口273 上下文窗口

254</h2>274</h2>

255 275 

256上下文窗口是会话期间可用于 Claude 的信息总量。它在会话内的轮次之间不重置。一切都累积:系统提示、工具定义、对话历史、工具输入和工具输出。在轮次之间保持相同的内容(系统提示、工具定义、CLAUDE.md)自动进行[提示缓存](https://platform.claude.com/docs/zh-CN/build-with-claude/prompt-caching),这减少了重复前缀的成本和延迟。276上下文窗口是会话期间可用于 Claude 的信息总量。它在会话内的轮次之间不重置。一切都累积:系统提示、工具定义、对话历史、工具输入和工具输出。在轮次之间保持相同的内容(系统提示、工具定义、CLAUDE.md)自动进行[提示缓存](https://platform.claude.com/docs/en/build-with-claude/prompt-caching),这减少了重复前缀的成本和延迟。有关自定义系统提示或 `append` 文本如何影响跨会话的缓存重用,请参阅[修改系统提示](/docs/zh-CN/agent-sdk/modifying-system-prompts#improve-prompt-caching-across-users-and-machines)。

257 277 

258<h3 id="what-consumes-context">278<h3 id="what-consumes-context">

259 什么消耗上下文279 什么消耗上下文


262以下是每个组件如何影响 SDK 中上下文的方式:282以下是每个组件如何影响 SDK 中上下文的方式:

263 283 

264| 源 | 何时加载 | 影响 |284| 源 | 何时加载 | 影响 |

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

266| **系统提示** | 每个请求 | 小的固定成本,始终存在 |286| **系统提示** | 每个请求 | 小的固定成本,始终存在 |

267| **CLAUDE.md 文件** | 会话开始,通过 [`settingSources`](/zh-CN/agent-sdk/claude-code-features) | 每个请求中的完整内容(但提示缓存,所以仅第一个请求支付全部成本) |287| **CLAUDE.md 文件** | 会话开始,通过 [`settingSources`](/docs/zh-CN/agent-sdk/claude-code-features) | 每个请求中的完整内容(但提示缓存,所以仅第一个请求支付全部成本) |

268| **工具定义** | 每个请求;MCP 架构默认延迟 | 内置工具架构在每个请求中加载。[工具搜索](/zh-CN/agent-sdk/mcp#mcp-tool-search)默认延迟 MCP 工具架构,在 Google Cloud 的 Agent Platform 或非第一方 `ANTHROPIC_BASE_URL` 上回退到预先加载。有关完整矩阵,请参阅[配置工具搜索](/zh-CN/agent-sdk/tool-search#configure-tool-search) |288| **工具定义** | 每个请求;MCP 架构默认延迟 | 内置工具架构在每个请求中加载。[工具搜索](/docs/zh-CN/agent-sdk/mcp#mcp-tool-search)默认延迟 MCP 工具架构,在不支持的模型和某些平台上回退到预先加载。有关完整矩阵,请参阅[配置工具搜索](/docs/zh-CN/agent-sdk/tool-search#configure-tool-search) |

269| **对话历史** | 在轮次中累积 | 随着每个轮次增长:提示、响应、工具输入、工具输出 |289| **对话历史** | 在轮次中累积 | 随着每个轮次增长:提示、响应、工具输入、工具输出 |

270| **技能描述** | 会话开始,通过设置源 | 简短摘要;完整内容仅在调用时加载 |290| **技能描述** | 会话开始,通过设置源 | 简短摘要;完整内容仅在调用时加载 |

271 291 


277 297 

278当上下文窗口接近其限制时,SDK 自动压缩对话:它总结较旧的历史以释放空间,保持你最近的交换和关键决定完整。当这发生时,SDK 在流中发出一条消息,其 `type: "system"` 和 `subtype: "compact_boundary"`(在 Python 中这是一个 `SystemMessage`;在 TypeScript 中它是一个单独的 `SDKCompactBoundaryMessage` 类型)。298当上下文窗口接近其限制时,SDK 自动压缩对话:它总结较旧的历史以释放空间,保持你最近的交换和关键决定完整。当这发生时,SDK 在流中发出一条消息,其 `type: "system"` 和 `subtype: "compact_boundary"`(在 Python 中这是一个 `SystemMessage`;在 TypeScript 中它是一个单独的 `SDKCompactBoundaryMessage` 类型)。

279 299 

280压缩用摘要替换较旧的消息,因此对话早期的特定指令可能不会被保留。持久规则属于 CLAUDE.md(通过 [`settingSources`](/zh-CN/agent-sdk/claude-code-features) 加载),而不是初始提示,因为 CLAUDE.md 内容在每个请求上重新注入。300压缩用摘要替换较旧的消息,因此对话早期的特定指令可能不会被保留。持久规则属于 CLAUDE.md(通过 [`settingSources`](/docs/zh-CN/agent-sdk/claude-code-features) 加载),而不是初始提示,因为 CLAUDE.md 内容在每个请求上重新注入。

281 301 

282你可以通过多种方式自定义压缩行为:302你可以通过多种方式自定义压缩行为:

283 303 

284* **CLAUDE.md 中的总结指令:** 压缩器像任何其他上下文一样读取你的 CLAUDE.md,所以你可以包含一个部分告诉它在总结时保留什么。部分标题是自由形式的(不是魔法字符串);压缩器根据意图匹配。304* **CLAUDE.md 中的总结指令:** 压缩器像任何其他上下文一样读取你的 CLAUDE.md,所以你可以包含一个部分告诉它在总结时保留什么。压缩器根据意图匹配,所以部分标题是自由形式的。

285* **`PreCompact` hook:** 在压缩发生前运行自定义逻辑,例如存档完整成绩单。hook 接收一个 `trigger` 字段(`manual` 或 `auto`)。请参阅 [hooks](/zh-CN/agent-sdk/hooks)。305* **`PreCompact` hook:** 在压缩发生前运行自定义逻辑,例如存档完整成绩单。hook 接收一个 `trigger` 字段(`manual` 或 `auto`)。请参阅 [hooks](/docs/zh-CN/agent-sdk/hooks)。

286* **手动压缩:** 发送 `/compact` 作为提示字符串以按需触发压缩。以这种方式发送的命令是 SDK 输入,而不是仅限 CLI 的快捷方式。请参阅 [SDK 中的命令](/zh-CN/agent-sdk/slash-commands)。306* **手动压缩:** 发送 `/compact` 作为提示字符串以按需触发压缩。以这种方式发送的命令是普通的 SDK 输入。请参阅[通过名称分派命令](/docs/zh-CN/agent-sdk/skills#dispatch-commands-by-name)。

287 307 

288<Accordion title="示例:CLAUDE.md 中的总结指令">308<Accordion title="示例:CLAUDE.md 中的总结指令">

289 向你的项目的 CLAUDE.md 添加一个部分,告诉压缩器保留什么。标题名称不特殊;使用任何清晰的标签。309 向你的项目的 CLAUDE.md 添加一个部分,告诉压缩器保留什么。标题名称不特殊;使用任何清晰的标签。


305 325 

306对于长时间运行的代理的几个策略:326对于长时间运行的代理的几个策略:

307 327 

308* **为子任务使用子代理。** 每个子代理以新鲜对话开始(没有先前的消息历史,尽管它确实加载自己的系统提示和项目级上下文,如 CLAUDE.md)。它看不到父级的轮次,只有其最终响应作为工具结果返回给父级。主代理的上下文增长该摘要,而不是完整的子任务成绩单。有关详情,请参阅[子代理继承什么](/zh-CN/agent-sdk/subagents#what-subagents-inherit)。328* **为子任务使用子代理。** 每个子代理以新鲜对话开始(没有先前的消息历史,尽管它确实加载自己的系统提示和项目级上下文,如 CLAUDE.md)。它看不到父级的轮次,只有其最终响应作为工具结果返回给父级。主代理的上下文增长该摘要,而不是完整的子任务成绩单。有关详情,请参阅[子代理继承什么](/docs/zh-CN/agent-sdk/subagents#what-subagents-inherit)。

309* **对工具有选择性。** 每个工具定义占用上下文空间。在 [`AgentDefinition`](/zh-CN/agent-sdk/subagents#agentdefinition-configuration) 上使用 `tools` 字段将子代理限制在它们需要的最小集合。329* **对工具有选择性。** 每个工具定义占用上下文空间。在 [`AgentDefinition`](/docs/zh-CN/agent-sdk/subagents#agentdefinition-configuration) 上使用 `tools` 字段将子代理限制在它们需要的最小集合。

310* **监视 MCP 服务器成本。** [MCP 工具搜索](/zh-CN/agent-sdk/mcp#mcp-tool-search)默认延迟 MCP 工具架构,并按需加载它们。当工具搜索关闭、在 Google Cloud 的 Agent Platform 上或在非第一方 `ANTHROPIC_BASE_URL` 后面时,每个 MCP 服务器将其所有工具架构添加到每个请求,因此具有许多工具的几个服务器可以在代理执行任何工作之前消耗大量上下文。330* **监视 MCP 服务器成本。** [MCP 工具搜索](/docs/zh-CN/agent-sdk/mcp#mcp-tool-search)默认延迟 MCP 工具架构,并按需加载它们。当工具搜索关闭或已回退到预先加载时,每个 MCP 服务器将其所有工具架构添加到每个请求,因此具有许多工具的几个服务器可以在代理执行任何工作之前消耗大量上下文。有关应用回退的配置,请参阅[配置工具搜索](/docs/zh-CN/agent-sdk/tool-search#configure-tool-search)。

311* **对常规任务使用较低的努力。** 为仅需要读取文件或列出目录的代理设置[努力](#effort-level)为 `"low"`。这减少了令牌使用和成本。331* **对常规任务使用较低的努力。** 为仅需要读取文件或列出目录的代理设置[努力](#effort-level)为 `"low"`。这减少了令牌使用和成本。

312 332 

313有关每个功能上下文成本的详细分解,请参阅[理解上下文成本](/zh-CN/features-overview#understand-context-costs)。333有关每个功能上下文成本的详细分解,请参阅[理解上下文成本](/docs/zh-CN/features-overview#understand-context-costs)。

314 334 

315<h2 id="sessions-and-continuity">335<h2 id="sessions-and-continuity">

316 会话和连续性336 会话和连续性


320 340 

321当你恢复时,来自先前轮次的完整上下文被恢复:读取的文件、执行的分析和采取的操作。你也可以分叉一个会话以分支到不同的方法而不修改原始方法。341当你恢复时,来自先前轮次的完整上下文被恢复:读取的文件、执行的分析和采取的操作。你也可以分叉一个会话以分支到不同的方法而不修改原始方法。

322 342 

323有关恢复、继续和分叉模式的完整指南,请参阅 [会话管理](/zh-CN/agent-sdk/sessions)。343有关恢复、继续和分叉模式的完整指南,请参阅 [会话管理](/docs/zh-CN/agent-sdk/sessions)。要在无状态容器或无服务器主机之间恢复会话,请传递一个 [`session_store` / `sessionStore` 适配器](/docs/zh-CN/agent-sdk/session-storage),以便 SDK 将记录镜像到你自己的后端,另一个主机可以恢复它们。Claude Code 子进程仍然首先写入本地磁盘。有关哪个副本在新会话与从存储恢复的运行中存活,以及如何保持本地副本临时的信息,请参阅 [双写架构](/docs/zh-CN/agent-sdk/session-storage#dual-write-architecture)。

324 344 

325<Note>345<Note>

326 在 Python 中,`ClaudeSDKClient` 跨多个调用自动处理会话 ID。有关详情,请参阅 [Python SDK 参考](/zh-CN/agent-sdk/python#choosing-between-query-and-claudesdkclient)。346 在 Python 中,`ClaudeSDKClient` 跨多个调用自动处理会话 ID。有关详情,请参阅 [Python SDK 参考](/docs/zh-CN/agent-sdk/python#choosing-between-query-and-claudesdkclient)。

327</Note>347</Note>

328 348 

329<h2 id="handle-the-result">349<h2 id="handle-the-result">


340| `error_during_execution` | 错误中断了循环(例如,API 失败或取消的请求) | 否 |360| `error_during_execution` | 错误中断了循环(例如,API 失败或取消的请求) | 否 |

341| `error_max_structured_output_retries` | 在配置的重试限制内没有生成有效的结构化输出:每次尝试都未通过验证,或者模型回退撤销了完成的输出且没有成功重试 | 否 |361| `error_max_structured_output_retries` | 在配置的重试限制内没有生成有效的结构化输出:每次尝试都未通过验证,或者模型回退撤销了完成的输出且没有成功重试 | 否 |

342 362 

343`result` 字段(最终文本输出)仅在 `success` 变体上存在,因此在读取它之前始终检查子类型。所有结果子类型都包含 `total_cost_usd`、`usage`、`num_turns` 和 `session_id`,因此你可以跟踪成本并在错误后恢复。在 Python 中,`total_cost_usd` 和 `usage` 被类型化为可选的,在某些错误路径上可能是 `None`,因此在格式化它们之前进行保护。有关解释 `usage` 字段的详情,请参阅 [跟踪成本和使用](/zh-CN/agent-sdk/cost-tracking)。363`result` 字段保存最终文本输出,仅在 `success` 变体上存在,因此在读取它之前始终检查子类型。

364 

365所有结果子类型都包含 `total_cost_usd`、`usage`、`num_turns` 和 `session_id`,因此你可以跟踪成本并在错误后恢复。需要防范两件事:

366 

367* 在会话崩溃后,最终结果是一个 `error_during_execution`,其成本字段可能被清零,其 `stop_reason` 为 `null`,进程在发出它后退出。请参阅 [会话崩溃后恢复总计](/docs/zh-CN/agent-sdk/cost-tracking#recover-totals-after-a-session-crash)。

368* 在 Python 中,`total_cost_usd`、`usage` 和 `model_usage` 被类型化为可选的,因此在读取它们之前检查它们不是 `None`。

369 

370`usage` 字段仅涵盖主代理循环。使用 `modelUsage` 或 Python 中的 `model_usage` 进行整个树的令牌和成本计算。有关解释 `usage` 字段的详情,请参阅 [跟踪成本和使用](/docs/zh-CN/agent-sdk/cost-tracking)。

344 371 

345<Note>372<Note>

346 当查询以错误结果结束时:373 当查询以错误结果结束时:

347 374 

348 * 单次 `query()` 调用会产生最终结果消息,然后抛出一个包含失败文本的错误,例如 `Reached maximum number of turns`。抛出是有意的——如果你的代码需要在其后继续,请将循环包装在 try 块中。底层 Claude Code 进程也会以非零代码退出。375 * 单次 `query()` 调用会产生最终结果消息,然后抛出一个包含失败文本的错误,例如 `Reached maximum number of turns`。抛出是有意的。如果你的代码需要在其后继续,请将循环包装在 try 块中。底层 Claude Code 进程也会以非零代码退出。

349 * 流式输入会话保持活跃,你可以继续发送消息。376 * 流式输入会话保持活跃,你可以继续发送消息,除了会话崩溃后,它会发出最终的 `error_during_execution` 结果并退出进程。

350</Note>377</Note>

351 378 

352结果还包括一个 `stop_reason` 字段(TypeScript 中的 `string | null`,Python 中的 `str | None`),指示模型为什么在其最后轮次停止生成。常见值是 `end_turn`(模型正常完成)、`max_tokens`(达到输出令牌限制)和 `refusal`(模型拒绝了请求)。在错误结果子类型上,`stop_reason` 携带循环结束前最后一个助手响应的值。要检测拒绝,检查 `stop_reason === "refusal"`(TypeScript)或 `stop_reason == "refusal"`(Python)。有关完整类型,请参阅 [`SDKResultMessage`](/zh-CN/agent-sdk/typescript#sdkresultmessage)(TypeScript)或 [`ResultMessage`](/zh-CN/agent-sdk/python#resultmessage)(Python)。379结果还包括一个 `stop_reason` 字段(TypeScript 中的 `string | null`,Python 中的 `str | None`),指示模型为什么在其最后轮次停止生成。常见值是 `end_turn`(模型正常完成)、`max_tokens`(达到输出令牌限制)和 `refusal`(模型拒绝了请求)。在循环产生的错误结果上,`stop_reason` 携带循环结束前最后一个助手响应的值;会话崩溃后 Claude Code 合成的结果携带 `null`。

380 

381要检测拒绝,检查 `stop_reason === "refusal"`(TypeScript)或 `stop_reason == "refusal"`(Python)。有关完整类型,请参阅 [`SDKResultMessage`](/docs/zh-CN/agent-sdk/typescript#sdkresultmessage)(TypeScript)或 [`ResultMessage`](/docs/zh-CN/agent-sdk/python#resultmessage)(Python)。

353 382 

354<h2 id="hooks">383<h2 id="hooks">

355 Hooks384 Hooks

356</h2>385</h2>

357 386 

358[Hooks](/zh-CN/agent-sdk/hooks) 是在循环中特定点触发的回调:在工具运行前、返回后、代理完成时等。一些常用的 hooks 是:387[Hooks](/docs/zh-CN/agent-sdk/hooks) 是在循环中特定点触发的回调:在工具运行前、返回后、代理完成时等。一些常用的 hooks 是:

359 388 

360| Hook | 何时触发 | 常见用途 |389| Hook | 何时触发 | 常见用途 |

361| :------------------------------- | :--------- | :---------- |390| :------------------------------- | :--------- | :---------- |


368 397 

369Hooks 在你的应用程序进程中运行,而不是在代理的上下文窗口内,因此它们不消耗上下文。Hooks 也可以短路循环:拒绝工具调用的 `PreToolUse` hook 防止它执行,Claude 接收拒绝消息。398Hooks 在你的应用程序进程中运行,而不是在代理的上下文窗口内,因此它们不消耗上下文。Hooks 也可以短路循环:拒绝工具调用的 `PreToolUse` hook 防止它执行,Claude 接收拒绝消息。

370 399 

371两个 SDK 都支持上述所有事件。TypeScript SDK 包括 Python 尚不支持的额外事件。有关完整事件列表、每个 SDK 的可用性和完整回调 API,请参阅 [使用 hooks 控制执行](/zh-CN/agent-sdk/hooks)。400两个 SDK 都支持上述所有事件。TypeScript SDK 包括 Python 尚不支持的额外事件。有关完整事件列表、每个 SDK 的可用性和完整回调 API,请参阅 [使用 hooks 控制执行](/docs/zh-CN/agent-sdk/hooks)。

372 401 

373<h2 id="put-it-all-together">402<h2 id="put-it-all-together">

374 将其全部放在一起403 将其全部放在一起


474 ```503 ```

475</CodeGroup>504</CodeGroup>

476 505 

506当代理成功完成时,该示例打印一行 `Done:` 及代理对修复的总结,然后打印一行类似 `Cost: $0.0312` 的内容。

507 

477<h2 id="next-steps">508<h2 id="next-steps">

478 后续步骤509 后续步骤

479</h2>510</h2>

480 511 

481现在你理解了循环,以下是根据你正在构建的内容去往的地方:512现在你理解了循环,以下是根据你正在构建的内容去往的地方:

482 513 

483* **还没有运行代理?** 从 [快速入门](/zh-CN/agent-sdk/quickstart) 开始,获取 SDK 安装并查看完整示例端到端运行。514* **还没有运行代理?** 从 [快速入门](/docs/zh-CN/agent-sdk/quickstart) 开始,获取 SDK 安装并查看完整示例端到端运行。

484* **准备好连接到你的项目?** [加载 CLAUDE.md、技能和文件系统 hooks](/zh-CN/agent-sdk/claude-code-features),以便代理自动遵循你的项目约定。515* **准备好连接到你的项目?** [加载 CLAUDE.md、技能和文件系统 hooks](/docs/zh-CN/agent-sdk/claude-code-features),以便代理自动遵循你的项目约定。

485* **构建交互式 UI?** 启用 [流式传输](/zh-CN/agent-sdk/streaming-output) 以在循环运行时显示实时文本和工具调用。516* **构建交互式 UI?** 启用 [流式传输](/docs/zh-CN/agent-sdk/streaming-output) 以在循环运行时显示实时文本和工具调用。

486* **需要对代理能做什么进行更严格的控制?** 使用 [权限](/zh-CN/agent-sdk/permissions) 锁定工具访问,并使用 [hooks](/zh-CN/agent-sdk/hooks) 在工具执行前审计、阻止或转换工具调用。517* **需要对代理能做什么进行更严格的控制?** 使用 [权限](/docs/zh-CN/agent-sdk/permissions) 锁定工具访问,并使用 [hooks](/docs/zh-CN/agent-sdk/hooks) 在工具执行前审计、阻止或转换工具调用。

487* **运行长期或昂贵的任务?** 将隔离的工作卸载到 [子代理](/zh-CN/agent-sdk/subagents) 以保持你的主上下文精简。518* **运行长期或昂贵的任务?** 将隔离的工作卸载到 [子代理](/docs/zh-CN/agent-sdk/subagents) 以保持你的主上下文精简。

519* **作为服务部署?** 查看 [托管 Agent SDK](/docs/zh-CN/agent-sdk/hosting) 了解容器和无服务器指导,以及 [会话存储](/docs/zh-CN/agent-sdk/session-storage) 以将会话持久化到你自己的后端。

488 520 

489有关代理循环的更广泛概念图(不是 SDK 特定的),请参阅 [Claude Code 如何工作](/zh-CN/how-claude-code-works)。有关在 Claude Code 中设计循环的实用指南,从轮次制到目标制和主动循环,请参阅博客上的 [Loop engineering: getting started with loops](https://claude.com/blog/getting-started-with-loops)。521有关代理循环的更广泛概念图(不是 SDK 特定的),请参阅 [Claude Code 如何工作](/docs/zh-CN/how-claude-code-works)。有关在 Claude Code 中设计循环的实用指南,从轮次制到目标制和主动循环,请参阅博客上的 [Loop engineering: getting started with loops](https://claude.com/blog/getting-started-with-loops)。

agent-sdk/examples.md +33 −0 created

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> 查找完整的、可运行的 Agent SDK 项目或 Claude Cookbook 中的指导食谱,以匹配您想要构建的内容。

8 

9本页面为您提供完整的、可运行的 Agent SDK 项目和指导性的 Claude Cookbook 食谱。TypeScript 应用程序位于 [`claude-agent-sdk-demos`](https://github.com/anthropics/claude-agent-sdk-demos) 仓库中,Python 食谱位于 [Claude Cookbook](https://platform.claude.com/cookbook) 中。

10 

11<h2 id="run-a-minimal-agent-first">

12 首先运行一个最小化的 agent

13</h2>

14 

15如果您还没有使用 SDK 构建过任何东西,请在完整应用程序之前从以下其中一个开始:

16 

17* [Agent SDK 快速入门](/docs/zh-CN/agent-sdk/quickstart):用 TypeScript 或 Python 构建您的第一个可工作的 agent,包括设置步骤。该 agent 在示例文件中查找并修复错误。

18 

19* [Hello World](https://github.com/anthropics/claude-agent-sdk-demos/tree/main/hello-world):当您想从仓库代码开始时要克隆的最小 TypeScript 项目

20 

21<h2 id="explore-a-typescript-application">

22 探索 TypeScript 应用程序

23</h2>

24 

25[`claude-agent-sdk-demos`](https://github.com/anthropics/claude-agent-sdk-demos) 中的 TypeScript 应用程序是本地开发的演示,从电子邮件客户端到多 agent 研究系统。克隆其形状与您正在构建的内容相匹配的演示。

26 

27<h2 id="work-through-a-python-recipe">

28 完成 Python 食谱

29</h2>

30 

31Claude Cookbook 的 Agent SDK 系列是一系列食谱,每个都是一个 Python 笔记本,从简单的研究 agent 逐步发展到复杂的多 agent 系统。每个笔记本都建立在前一个的基础上,引入新的概念和功能。从[单行研究 agent](https://platform.claude.com/cookbook/claude-agent-sdk-00-the-one-liner-research-agent) 开始并向前进行。

32 

33有关 Claude 产品的食谱,请参阅完整的 [Claude Cookbook](https://platform.claude.com/cookbook)。

Details

393 393 

394默认情况下,Claude Code 在会话的第一个请求时构建系统提示词一次,包括你的 `append` 文本或自定义提示词,并将其记录在会话中。在会话被压缩之前,每个后续请求都使用该记录的提示词,包括在你使用 `resume` 或 `continue` 返回会话后。如果你在该后续调用上传递不同的 `append` 或自定义提示词,它会在会话被压缩或在新会话中生效。394默认情况下,Claude Code 在会话的第一个请求时构建系统提示词一次,包括你的 `append` 文本或自定义提示词,并将其记录在会话中。在会话被压缩之前,每个后续请求都使用该记录的提示词,包括在你使用 `resume` 或 `continue` 返回会话后。如果你在该后续调用上传递不同的 `append` 或自定义提示词,它会在会话被压缩或在新会话中生效。

395 395 

396记录适用于 [fetch feature flags](/docs/zh-CN/env-vars#features-that-need-feature-flag-fetching) 的会话,因为使用 claude.ai 或 Console 账户的会话默认这样做。在 Amazon Bedrock、Google Cloud 的 Agent Platform、Microsoft Foundry 以及其他不获取它们的会话中,Claude Code 在每个请求上重建提示词。如果你通过 `extraArgs` 传递 `--bare` 或设置 `CLAUDE_CODE_SIMPLE=1` 在 [bare mode](/docs/zh-CN/headless#start-faster-with-bare-mode) 中启动 Claude Code,记录保持关闭,除非你在 `systemPrompt` 的对象形式上设置 `snapshot: true`。默认情况下记录 `append` 或自定义提示词需要 Claude Code v2.1.265 或更高版本,TypeScript Agent SDK 从 v0.3.265 捆绑。396如果你通过 `extraArgs` 传递 `--bare` 或设置 `CLAUDE_CODE_SIMPLE=1` 在 [bare mode](/docs/zh-CN/headless#start-faster-with-bare-mode) 中启动 Claude Code,记录保持关闭,除非你在 `systemPrompt` 的对象形式上设置 `snapshot: true`。默认情况下记录 `append` 或自定义提示词需要 Claude Code v2.1.265 或更高版本,TypeScript Agent SDK 从 v0.3.265 捆绑。在 Claude Code v2.1.268 之前,不 [fetch feature flags](/docs/zh-CN/env-vars#features-that-need-feature-flag-fetching) 的会话,包括 Amazon Bedrock、Google Cloud 的 Agent Platform 和 Microsoft Foundry 上的会话,在每个请求上重建提示词,`snapshot` 无效。

397 397 

398要改为在每个请求上重建提示词,请在 TypeScript SDK 中的 `systemPrompt` 的对象形式上设置 `snapshot: false`:`{ type: "preset", preset: "claude_code", append, snapshot: false }` 或 `{ type: "custom", prompt, snapshot: false }`。当你在迭代提示词措辞时或当你的应用程序在恢复相同会话的调用之间改变 `append` 时,使用此形式。`snapshot` 字段需要 `@anthropic-ai/claude-agent-sdk` v0.3.257 或更高版本,在不获取特性标志的会话中无效。398要改为在每个请求上重建提示词,请在 TypeScript SDK 中的 `systemPrompt` 的对象形式上设置 `snapshot: false`:`{ type: "preset", preset: "claude_code", append, snapshot: false }` 或 `{ type: "custom", prompt, snapshot: false }`。当你在迭代提示词措辞时或当你的应用程序在恢复相同会话的调用之间改变 `append` 时,使用此形式。`snapshot` 字段需要 `@anthropic-ai/claude-agent-sdk` v0.3.257 或更高版本。

399 399 

400<h2 id="compare-the-four-approaches">400<h2 id="compare-the-four-approaches">

401 比较四种方法401 比较四种方法

Details

41 </Step>41 </Step>

42 42 

43 <Step title="允许规则">43 <Step title="允许规则">

44 检查 `allow` 规则(来自 `allowed_tools` 和 settings.json)。如果规则匹配,工具被批准。针对 [关键路径](/docs/zh-CN/permission-modes#critical-paths) 的 `rm` 和 `rmdir` 删除永远不会被允许规则批准:它们在提示的模式下到达您的回调,在 Claude Code v2.1.218 或更高版本的 `auto` 模式下进入 [分类器](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode),并在 `dontAsk` 模式下被拒绝。44 检查 `allow` 规则(来自 `allowed_tools` 和 settings.json)。如果规则匹配,工具被批准。调用工具自身批准的是在此步骤解决的,无需规则:例如在您的工作目录内的文件读取或 [只读 Bash 命令](/docs/zh-CN/permissions#read-only-commands)。针对 [关键路径](/docs/zh-CN/permission-modes#critical-paths) 的 `rm` 和 `rmdir` 删除永远不会被允许规则批准:它们在提示的模式下到达您的回调,在 Claude Code v2.1.218 或更高版本的 `auto` 模式下进入 [分类器](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode),并在 `dontAsk` 模式下被拒绝。

45 </Step>45 </Step>

46 46 

47 <Step title="canUseTool 回调">47 <Step title="canUseTool 回调">


73 允许和拒绝规则73 允许和拒绝规则

74</h2>74</h2>

75 75 

76`allowed_tools` 和 `disallowed_tools`(TypeScript:`allowedTools` / `disallowedTools`)向上面评估流程中的允许和拒绝规则列表添加条目。如果您在 `allowed_tools` 中命名[任务跟踪工具](/docs/zh-CN/agent-sdk/todo-tracking#model-availability)之一,Claude Code 也会选择加入会话。任何其他未在 `allowed_tools` 中列出的工具仍然可供 Claude 使用,并继续进行权限模式。拒绝规则的行为取决于它们是命名工具还是在工具内范围化模式。76`allowed_tools` 和 `disallowed_tools`(TypeScript:`allowedTools` / `disallowedTools`)向上面评估流程中的允许和拒绝规则列表添加条目。如果您在 `allowed_tools` 中命名[任务跟踪工具](/docs/zh-CN/agent-sdk/todo-tracking#model-availability)之一,Claude Code 也会选择加入会话。任何其他未在 `allowed_tools` 中列出的工具仍然可供 Claude 使用,对其的调用如果需要批准,会继续进行权限模式。拒绝规则的行为取决于它们是命名工具还是在工具内范围化模式。

77 77 

78| 选项 | 效果 |78| 选项 | 效果 |

79| :-------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------- |79| :-------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------- |

80| `allowed_tools=["Read", "Grep"]` | `Read` 和 `Grep` 被自动批准。此处未列出的其他工具仍然存在并继续进行权限模式和 `canUseTool`。 |80| `allowed_tools=["Read", "Grep"]` | `Read` 和 `Grep` 被自动批准。此处未列出的其他工具仍然存在,对其的调用如果需要批准,会继续进行权限模式和 `canUseTool`。 |

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

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

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


91<Warning>91<Warning>

92 **自动批准的工具永远不会到达 `canUseTool`。** 在任何早期步骤中批准的工具调用,通过 `acceptEdits` 或 `bypassPermissions`,或通过允许规则,会跳过您的 `canUseTool` 回调,因此您在那里放置的权限检查对该工具被静默绕过。`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) 以及 `rm` 和 `rmdir` 移除针对[关键路径](/docs/zh-CN/permission-modes#critical-paths) 仍然到达回调,即使允许规则匹配。在 `auto` 模式中,关键路径移除转到[分类器](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode) 而不是回调,而上面列出的其他调用仍然到达它;分类器路由需要 Claude Code v2.1.218 或更高版本。在 `dontAsk` 模式中,这些调用被拒绝,不调用回调。92 **自动批准的工具永远不会到达 `canUseTool`。** 在任何早期步骤中批准的工具调用,通过 `acceptEdits` 或 `bypassPermissions`,或通过允许规则,会跳过您的 `canUseTool` 回调,因此您在那里放置的权限检查对该工具被静默绕过。`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) 以及 `rm` 和 `rmdir` 移除针对[关键路径](/docs/zh-CN/permission-modes#critical-paths) 仍然到达回调,即使允许规则匹配。在 `auto` 模式中,关键路径移除转到[分类器](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode) 而不是回调,而上面列出的其他调用仍然到达它;分类器路由需要 Claude Code v2.1.218 或更高版本。在 `dontAsk` 模式中,这些调用被拒绝,不调用回调。

93 93 

94 覆盖范围取决于条目的形式:像 `Read` 或 `mcp__github__get_issue` 这样的裸名称自动批准对该工具的每个调用,除了上面异常之外,而像 `Bash(ls *)` 这样的范围化规则仅自动批准匹配的调用,其他 `Bash` 调用仍然继续进行回调。对于必须在每个工具调用上运行的检查,请使用 [`PreToolUse` hook](/docs/zh-CN/agent-sdk/hooks):hooks 在每个其他步骤之前运行,hook 拒绝甚至在 `bypassPermissions` 模式中也适用。94 覆盖范围取决于条目的形式:像 `Read` 或 `mcp__github__get_issue` 这样的裸名称自动批准对该工具的每个调用,除了上面的异常之外,而像 `Bash(npm test *)` 这样的范围化规则仅自动批准匹配的调用,其他需要批准的 `Bash` 调用仍然会继续进行回调。对于必须在每个工具调用上运行的检查,请使用 [`PreToolUse` hook](/docs/zh-CN/agent-sdk/hooks):hooks 在每个其他步骤之前运行,hook 拒绝甚至在 `bypassPermissions` 模式中也适用。

95</Warning>95</Warning>

96 96 

97对于锁定的代理,将 `allowedTools` 与 `permissionMode: "dontAsk"` 配对。列出的工具被批准,除了上面警告中的始终提示工具;其他任何内容都被直接拒绝,而不是提示:97对于锁定的代理,将 `allowedTools` 与 `permissionMode: "dontAsk"` 配对:

98 98 

99```typescript theme={null}99```typescript theme={null}

100const options = {100const options = {


103};103};

104```104```

105 105 

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

107 

106<Warning>108<Warning>

107 **`allowed_tools` 不约束 `bypassPermissions`。** `allowed_tools` 仅预批准您列出的工具。未列出的工具不与任何允许规则匹配,并继续进行权限模式,其中 `bypassPermissions` 批准它们。设置 `allowed_tools=["Read"]` 与 `permission_mode="bypassPermissions"` 一起仍然批准每个工具,包括 `Bash`、`Write` 和 `Edit`。如果您需要 `bypassPermissions` 但想要阻止特定工具,请使用 `disallowed_tools`。109 **`allowed_tools` 不约束 `bypassPermissions`。** `allowed_tools` 仅预批准您列出的工具。未列出的工具不与任何允许规则匹配,并继续进行权限模式,其中 `bypassPermissions` 批准它们。设置 `allowed_tools=["Read"]` 与 `permission_mode="bypassPermissions"` 一起仍然批准每个工具,包括 `Bash`、`Write` 和 `Edit`。如果您需要 `bypassPermissions` 但想要阻止特定工具,请使用 `disallowed_tools`。

108</Warning>110</Warning>


122SDK 支持这些权限模式:124SDK 支持这些权限模式:

123 125 

124| 模式 | 描述 | 工具行为 |126| 模式 | 描述 | 工具行为 |

125| :------------------ | :------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |127| :------------------ | :------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

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

127| `dontAsk` | 拒绝而不是提示 | 任何未被 `allowed_tools` 或规则预批准的内容都被拒绝;连接器工具[您的组织设置为 `ask`](/docs/zh-CN/mcp#organization-controls-on-connector-tools)和需要用户交互的工具即使您已预批准它们也被拒绝,`rm` 和 `rmdir` 移除针对[关键路径](/docs/zh-CN/permission-modes#critical-paths)也被拒绝。`canUseTool` 永远不会被调用 |129| `dontAsk` | 拒绝而不是提示 | 任何会提示的调用都被拒绝。由 `allowed_tools` 或规则批准的调用会运行,在 `default` 模式下不需要批准的调用也会运行;连接器工具[您的组织设置为 `ask`](/docs/zh-CN/mcp#organization-controls-on-connector-tools)和需要用户交互的工具即使您已预批准它们也被拒绝,`rm` 和 `rmdir` 移除针对[关键路径](/docs/zh-CN/permission-modes#critical-paths)也被拒绝。`canUseTool` 永远不会被调用 |

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

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

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


271 不询问模式(`dontAsk`)273 不询问模式(`dontAsk`)

272</h4>274</h4>

273 275 

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

275 277 

276**使用时机:** 您想要为无头代理提供固定的、明确的工具表面,并且更喜欢硬拒绝而不是默默依赖 `canUseTool` 不存在。278**使用时机:** 您想要为无头代理提供固定的、明确的工具表面,并且更喜欢硬拒绝而不是默默依赖 `canUseTool` 不存在。

277 279 

Details

3164**工具名称:** `TodoWrite`3164**工具名称:** `TodoWrite`

3165 3165 

3166<Note>3166<Note>

3167 在 Python Agent SDK 0.2.139 及更高版本上,以下限制适用。

3168 

3169 The following tools are available by default only on Claude 3.x models, Opus 4 through 4.7, Sonnet 4 through 4.6, and Haiku 4.5. On every other model, including model IDs Claude Code doesn't recognize, they aren't available unless you opt in:3167 The following tools are available by default only on Claude 3.x models, Opus 4 through 4.7, Sonnet 4 through 4.6, and Haiku 4.5. On every other model, including model IDs Claude Code doesn't recognize, they aren't available unless you opt in:

3170 3168 

3171 * `TodoWrite`3169 * `TodoWrite`

Details

6 6 

7> 在 Agent SDK 会话中跟踪待办事项,并从结构化工具调用中呈现 Claude 的进度7> 在 Agent SDK 会话中跟踪待办事项,并从结构化工具调用中呈现 Claude 的进度

8 8 

9在[模型可用性](#model-availability)下列出的模型上,Claude 无需书面待办事项列表即可跟踪多步骤工作,Claude Code 默认会从会话中排除[任务跟踪工具](/docs/zh-CN/tools-reference#task-tool-availability)。对于这些模型上的多步骤任务,您不需要本页面上的任何内容即可让 Claude 完成工作。9Claude Code 默认仅在[模型可用性](#model-availability)下列出的模型上提供[任务跟踪工具](/docs/zh-CN/tools-reference#task-tool-availability)。较新的模型无需书面待办事项列表即可跟踪多步骤工作,因此在这些模型上,您不需要本页面上的任何内容即可让 Claude 完成多步骤任务。

10 10 

11在具有任务跟踪工具的会话中,Claude 保持书面待办事项列表,在工作时更新每个项目的状态。您在消息流中看到每个更改作为结构化工具调用。仅当您的应用程序读取这些工具调用时才选择加入会话,无论是记录任务活动还是呈现自己的进度显示。11在具有任务跟踪工具的会话中,Claude 保持书面待办事项列表,在工作时更新每个项目的状态。您在消息流中看到每个更改作为结构化工具调用。仅当您的应用程序读取这些工具调用时才选择加入会话,无论是记录任务活动还是呈现自己的进度显示。

12 12 


15</h2>15</h2>

16 16 

17<Note>17<Note>

18 在 TypeScript Agent SDK 0.3.233 及更高版本或 Python Agent SDK 0.2.139 及更高版本上,以下限制适用。

19 

20 The following tools are available by default only on Claude 3.x models, Opus 4 through 4.7, Sonnet 4 through 4.6, and Haiku 4.5. On every other model, including model IDs Claude Code doesn't recognize, they aren't available unless you opt in:18 The following tools are available by default only on Claude 3.x models, Opus 4 through 4.7, Sonnet 4 through 4.6, and Haiku 4.5. On every other model, including model IDs Claude Code doesn't recognize, they aren't available unless you opt in:

21 19 

22 * `TodoWrite`20 * `TodoWrite`


30 This default set applies in Claude Code v2.1.268 and later, which the TypeScript Agent SDK bundles from v0.3.268.28 This default set applies in Claude Code v2.1.268 and later, which the TypeScript Agent SDK bundles from v0.3.268.

31</Note>29</Note>

32 30 

33在列出的模型上,除非您选择加入会话,否则您在消息流中看不到这些工具的 `tool_use` 块。Agent SDK 通过它捆绑的 Claude Code 二进制文件应用这些默认值。如果您将 `pathToClaudeCodeExecutable`(TypeScript)或 `cli_path`(Python)指向您自己的 Claude Code 安装,您将获得该安装提供的任何工具,在其自己的默认值下。要查看运行中会话中的确切集合,请[检查哪些工具可用](/docs/zh-CN/tools-reference#check-which-tools-are-available)。要选择加入会话,请执行以下操作之一:31在默认情况下没有这些工具的模型上,除非您选择加入会话,否则您在消息流中看不到这些工具的 `tool_use` 块。Agent SDK 通过它捆绑的 Claude Code 二进制文件应用这些默认值。如果您将 `pathToClaudeCodeExecutable`(TypeScript)或 `cli_path`(Python)指向您自己的 Claude Code 安装,您将获得该安装提供的任何工具,在其自己的默认值下。要查看运行中会话中的确切集合,请[检查哪些工具可用](/docs/zh-CN/tools-reference#check-which-tools-are-available)。要选择加入会话,请执行以下操作之一:

34 32 

35* 在 [`allowedTools`](/docs/zh-CN/agent-sdk/permissions#allow-and-deny-rules)(TypeScript)或 `allowed_tools`(Python)选项中命名其中一个工具33* 在 [`allowedTools`](/docs/zh-CN/agent-sdk/permissions#allow-and-deny-rules)(TypeScript)或 `allowed_tools`(Python)选项中命名其中一个工具

36* 在 `tools` 选项中列出工具,该选项将会话的内置工具限制为它命名的工具。将您想要的工具与您使用的其他内置工具一起包括34* 在 `tools` 选项中列出工具,该选项将会话的内置工具限制为它命名的工具。将您想要的工具与您使用的其他内置工具一起包括

agent-sdk/troubleshooting.md +161 −0 created

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# Agent SDK 故障排除

6 

7> 通过您看到的确切错误消息修复 Agent SDK 错误,包括 TypeScript 和 Python SDK 中每个错误的原因和修复方法。

8 

9本页面的条目按您看到的错误进行分类。每个条目都说明了原因和解决方法。

10 

11<h2 id="cli-startup">

12 CLI 启动

13</h2>

14 

15<h3 id="clinotfounderror-claude-code-not-found">

16 CLINotFoundError: Claude Code not found

17</h3>

18 

19Python SDK 将 Claude Code CLI 作为子进程启动。当它找不到 `claude` 可执行文件时,连接会失败并显示 `CLINotFoundError`:

20 

21```

22Claude Code not found at: /your/configured/path

23```

24 

25当您设置 `ClaudeAgentOptions(cli_path=...)` 并且它指向一个不存在的文件时,消息会包含配置的路径。如果没有 `cli_path`,SDK 会搜索您的 `PATH` 和常见安装位置,消息会包含您平台的安装说明。

26 

27要修复它:

28 

29* 如果尚未安装 Claude Code,请安装它。请参阅 [安装 Claude Code](/docs/zh-CN/setup#install-claude-code) 了解您平台上的命令。

30* 如果您设置了 `cli_path`,请确认该文件存在且是 `claude` 可执行文件。

31* 如果您依赖 `PATH` 解析,请确认 `claude --version` 在您的应用程序运行的同一环境中有效。您从 IDE 或服务管理器等外部启动的进程通常使用不同的 `PATH`。

32 

33TypeScript SDK 在其捆绑的平台包和您在 `pathToClaudeCodeExecutable` 中设置的路径中查找 CLI。匹配您看到的消息:

34 

35* `Native CLI binary for <platform>-<arch> not found`:捆绑的平台包缺失,最常见的原因是安装跳过了可选依赖项。重新安装 `@anthropic-ai/claude-agent-sdk` 而不跳过可选依赖项,或将 `pathToClaudeCodeExecutable` 指向 [原生安装](/docs/zh-CN/setup#install-claude-code)。在使用 `bun build --compile` 构建的单文件可执行文件中,同一消息有不同的原因和修复方法。请参阅 [编译为单个可执行文件](/docs/zh-CN/agent-sdk/typescript#compile-to-a-single-executable)。

36* `Claude Code native binary not found at <path>` 或 `Claude Code executable not found at <path>. Is options.pathToClaudeCodeExecutable set?`:已解析路径处的文件缺失,或进程无法访问它。确认该文件存在于该路径处,并且进程可以访问它。

37 

38<h3 id="cliconnectionerror-refusing-to-execute-batch-script">

39 CLIConnectionError: Refusing to execute batch script

40</h3>

41 

42在 Windows 上,当 Python SDK 使用的 CLI 路径是 `.bat` 或 `.cmd` 批处理脚本(包括 npm 安装创建的 `claude.cmd` 垫片)时,连接会失败并显示 `CLIConnectionError`:

43 

44```

45Refusing to execute batch script 'C:\\Users\\you\\AppData\\Roaming\\npm\\claude.cmd': Windows runs .bat/.cmd files via cmd.exe, which can execute commands injected through CLI arguments, and no reliable escaping for cmd.exe exists. Use a native claude executable instead: install Claude Code natively (irm https://claude.ai/install.ps1 | iex), point ClaudeAgentOptions(cli_path=...) at a claude.exe, or install the claude-agent-sdk wheel for a platform that bundles claude.exe (e.g. Windows x64).

46```

47 

48这种拒绝是有意的安全加固,而不是破损的安装。Windows 通过将生成重写为 `cmd.exe /c` 调用来运行批处理脚本,而 `cmd.exe` 在执行时重新解析整个命令行,因此参数值可以执行注入的命令。

49 

50大多数 Windows 安装永远不会遇到此错误。Windows x64 版本的 `claude-agent-sdk` 捆绑了 `claude.exe`,SDK 优先使用捆绑的 CLI,然后是它可以发现的任何原生 `claude.exe`,最后才回退到批处理垫片。您在两种情况下会看到拒绝:

51 

52* 您将 `ClaudeAgentOptions(cli_path=...)` 设置为 `.bat` 或 `.cmd` 文件,例如 npm 的 `claude.cmd` 垫片。

53* 您的安装没有捆绑或原生 `claude.exe`,例如 ARM64 Windows 上的源代码安装,其中您的 `PATH` 上唯一的 `claude` 是 npm 垫片。

54 

55要修复它,请给 SDK 一个原生可执行文件而不是批处理脚本:

56 

57* 如果您设置了 `ClaudeAgentOptions(cli_path=...)`,请将其指向 `claude.exe` 或删除该选项。当设置了 `cli_path` 时,SDK 会跳过发现,因此仅原生安装无法生效。

58* 在 PowerShell 中原生安装 Claude Code:`irm https://claude.ai/install.ps1 | iex`

59* 在 x64 Windows 上,安装捆绑 `claude.exe` 的 `claude-agent-sdk` wheel。

60 

61在 `claude-agent-sdk` 0.2.124 之前,Python SDK 通过 `cmd.exe` 生成批处理脚本而没有此检查。

62 

63<h3 id="cliconnectionerror-failed-to-start-claude-code">

64 CLIConnectionError: Failed to start Claude Code

65</h3>

66 

67SDK 在已解析的路径处找到了一个文件,但无法启动它。Python 将这些失败作为 `CLIConnectionError` 引发。TypeScript 拒绝消息迭代并显示没有 SDK 类的错误。下表将每条消息映射到它告诉您的内容。匹配您看到的消息:

68 

69| 消息 | SDK | 它告诉您什么 |

70| ----------------------------------------------------------------- | ---------- | ------------------------ |

71| `Failed to start Claude Code: <detail>` | Python | 消息的其余部分是操作系统自己的错误 |

72| `Claude Code executable at <path> exists but failed to launch` | TypeScript | 配置路径处的脚本无法运行 |

73| `Claude Code native binary at <path> exists but failed to launch` | TypeScript | 二进制文件无法运行,消息后附加了 libc 建议 |

74| `Failed to spawn Claude Code process: <detail>` | TypeScript | 任何其他启动失败 |

75 

76在两个 SDK 中,通常的原因是已解析的路径指向无法运行的内容,例如文本文件、目录或没有执行权限的文件。将原生二进制消息的 libc 建议作为一个可能的原因来阅读。

77 

78要在任一 SDK 中修复它:

79 

80* 确认配置的路径指向 `claude` 可执行文件本身,并且该文件具有执行权限。

81* 如果您不需要自定义路径,请在 Python 中删除 `cli_path` 或在 TypeScript 中删除 `pathToClaudeCodeExecutable`,以便 SDK 自己找到 CLI,优先使用其捆绑的副本。

82* 当失败的二进制文件是容器镜像中 SDK 的捆绑副本时,在镜像构建期间重新安装 SDK,以便捆绑的二进制文件与容器的平台匹配,或为其运行的架构重建镜像。通常的原因是与容器架构或 libc 不匹配的二进制文件,或在镜像构建中失去执行权限的二进制文件。

83 

84<h3 id="cliconnectionerror-not-connected">

85 CLIConnectionError: Not connected

86</h3>

87 

88在客户端连接之前或断开连接之后,在 Python 中调用 `ClaudeSDKClient` 方法会引发带有此消息的 `CLIConnectionError`:

89 

90```

91Not connected. Call connect() first.

92```

93 

94按照消息所说的做。要么在任何其他客户端方法之前调用 `await client.connect()`,要么使用 `async with ClaudeSDKClient() as client:` 打开客户端,它在进入时连接。

95 

96<h2 id="cli-process-exit">

97 CLI 进程退出

98</h2>

99 

100本部分中的条目意味着 Claude Code 进程在您的应用程序使用它时结束。您看到的错误取决于 SDK 语言以及 CLI 在退出前是否报告了错误结果。

101 

102<h3 id="processerror-command-failed-with-exit-code">

103 ProcessError: Command failed with exit code

104</h3>

105 

106当 Claude Code 进程以非零代码退出时,Python SDK 会引发 `ProcessError`:

107 

108```

109Command failed with exit code 1 (exit code: 1)

110Error output: Check stderr output for details

111```

112 

113消息两次说明了退出代码,`Error output` 行是固定文本而不是您进程的错误输出。相同的固定文本填充异常的 `stderr` 属性。异常的 `exit_code` 属性携带代码。要捕获 CLI 实际写入 stderr 的内容,请在 `ClaudeAgentOptions` 中传递 `stderr` 回调并记录它接收的内容。

114 

115裸 `ProcessError` 意味着 CLI 退出时没有报告错误结果。当 CLI 确实报告了一个时,SDK 会改为引发 [`ResultError`](/docs/zh-CN/agent-sdk/python#resulterror),在 [Claude Code returned an error result](#claude-code-returned-an-error-result) 中介绍。`ResultError` 是 `ProcessError` 的子类,所以 `except ProcessError` 会捕获两者。要以不同方式处理它们,请先放置 `except ResultError` 子句。

116 

117在 `claude-agent-sdk` 0.2.140 之前,Python SDK 将错误结果退出作为普通 `Exception` 而不是 `ResultError` 引发。

118 

119<h3 id="claude-code-process-exited-with-code-n">

120 Claude Code process exited with code N

121</h3>

122 

123IDE 包装器也会打印此消息,[错误参考](/docs/zh-CN/errors#claude-code-process-exited-with-code-n) 为 VS Code 和其他启动器介绍了它。此条目介绍了您的 TypeScript SDK 代码接收的内容。SDK 将非零 CLI 退出作为普通 `Error` 显示,该错误拒绝 `query()` 消息上的 `for await` 循环。没有 SDK 错误类可以捕获,所以将循环包装在 `try`/`catch` 中并匹配消息:

124 

125```

126Claude Code process exited with code 1. stderr: <tail of the CLI's stderr>

127```

128 

129当 CLI 写入 stderr 时,消息以其尾部结尾。要捕获完整流,请在查询选项中传递 `stderr` 回调。被信号杀死的进程以相同的形式报告 `Claude Code process terminated by signal <name>`。

130 

131<h3 id="claude-code-returned-an-error-result">

132 Claude Code returned an error result

133</h3>

134 

135当 CLI 在退出前报告错误结果时,两个 SDK 都用此消息替换进程退出错误:

136 

137```

138Claude Code returned an error result: <the CLI's own error report>

139```

140 

141冒号后的文本是 CLI 对出错原因的报告,所以从那里开始而不是从退出本身开始。Python 将其作为 [`ResultError`](/docs/zh-CN/agent-sdk/python#resulterror) 引发,其 `data` 属性携带完整的错误结果。TypeScript 拒绝消息循环并显示携带相同消息形状的普通 `Error`。

142 

143<h2 id="structured-outputs">

144 结构化输出

145</h2>

146 

147<h3 id="structured_output-is-none-but-the-result-says-success">

148 structured\_output is None but the result says success

149</h3>

150 

151结果消息可以以 `subtype: "success"` 结尾,而在 Python 中 `structured_output` 是 `None` 或在 TypeScript 中是 `undefined`。运行完成,但不存在经过验证的输出。一种方式是模式无法满足任何输出,例如冲突的长度约束。运行结束时没有验证错误,唯一的信号是缺失的 `structured_output`。

152 

153在应用程序代码中将此结果视为失败。在使用 `structured_output` 之前,检查 `subtype` 是否为 `success` 以及 `structured_output` 是否存在。[错误处理](/docs/zh-CN/agent-sdk/structured-outputs#error-handling) 部分为两个 SDK 显示了此模式。

154 

155如果它使用您认为正确的模式重复发生,请验证模式是否可满足,然后简化它直到输出验证,并一次重新引入一个约束。

156 

157<h2 id="report-a-new-issue">

158 报告新问题

159</h2>

160 

161如果您的错误未在此处介绍,请检查开放问题或在 SDK 存储库中提交新问题:[claude-agent-sdk-typescript](https://github.com/anthropics/claude-agent-sdk-typescript/issues) 或 [claude-agent-sdk-python](https://github.com/anthropics/claude-agent-sdk-python/issues)。包括完整的错误文本和您的 SDK 版本。

agent-teams.md +5 −5

Details

252 Claude 如何启动 agent teams252 Claude 如何启动 agent teams

253</h3>253</h3>

254 254 

255要启动一个团队,请向 Claude 请求队友。当 Claude 在启用 agent teams 的情况下调用 [Agent tool](/docs/zh-CN/tools-reference) 并使用 [`name`](/docs/zh-CN/sub-agents#subagent-names) 时,Claude Code 不会要求你确认,Claude 就会启动一个队友。Claude 也会自动为普通 subagents 命名,以便稍后可以向它们发送消息,而当启用 agent teams 时,一个命名的 subagent 会作为队友启动,所以即使你没有请求,团队也可能形成。255要启动一个团队,请向 Claude 请求队友。当 Claude 在启用 agent teams 的情况下调用 [Agent tool](/docs/zh-CN/tools-reference) 并使用 [`name`](/docs/zh-CN/sub-agents#subagent-names) 时,除非该调用是一个 [fork](/docs/zh-CN/sub-agents#fork-the-current-conversation) 或在调用本身上传递 `isolation`,否则 Claude 会启动一个队友。Claude Code 不会要求你确认启动。

256 256 

257如果你想要 subagents 而不是 agent teams,请 [关闭 agent teams](#claude-spawns-teammates-instead-of-subagents)。257Claude 也会自动为普通 subagents 命名,以便稍后可以向它们发送消息。这些调用遵循相同的规则,所以即使你没有请求,团队也可能形成。如果你想要 subagents 而不是 agent teams,请 [关闭 agent teams](#claude-spawns-teammates-instead-of-subagents)。

258 258 

259<h3 id="architecture">259<h3 id="architecture">

260 架构260 架构


294 为队友使用 subagent 定义294 为队友使用 subagent 定义

295</h3>295</h3>

296 296 

297当生成队友时,你可以引用来自任何 [subagent 范围](/docs/zh-CN/sub-agents#choose-the-subagent-scope) 的 [subagent](/docs/zh-CN/sub-agents) 类型:项目、用户、插件或 CLI 定义。这让你定义一个角色一次,例如安全审查员或测试运行器,并将其同时重用为委派的 subagent 和 agent team 队友。297当在任一显示模式中生成队友时,你可以引用来自项目、用户或托管 [subagent 范围](/docs/zh-CN/sub-agents#choose-the-subagent-scope) 的 [subagent](/docs/zh-CN/sub-agents) 类型。这让你定义一个角色一次,例如安全审查员或测试运行器,并将其同时重用为委派的 subagent 和 agent team 队友。

298 298 

299要使用 subagent 定义,在要求 Claude 生成队友时按名称提及它:299要使用 subagent 定义,在要求 Claude 生成队友时按名称提及它:

300 300 


314 权限314 权限

315</h3>315</h3>

316 316 

317队友从负责人的权限设置开始。如果负责人使用 `--dangerously-skip-permissions` 运行,所有队友也会这样做。生成后,你可以更改个别队友模式,但在生成时无法设置每个队友的模式。317队友从负责人的权限模式开始,除了 [`dontAsk` 模式](/docs/zh-CN/permission-modes#allow-only-pre-approved-tools-with-dontask-mode),他们不继承该模式。如果负责人使用 `--dangerously-skip-permissions` 运行,所有队友也会这样做。生成后,你可以更改个别队友的权限模式,但在生成时无法设置每个队友的权限模式。

318 318 

319队友权限提示出现在负责人会话中,所以请在那里自己批准它们。[Plan approval](#have-teammates-plan-before-implementing) 是设计的例外:负责人会话授予队友计划批准,无需向你单独提示。319队友权限提示出现在负责人会话中,所以请在那里自己批准它们。[Plan approval](#have-teammates-plan-before-implementing) 是设计的例外:负责人会话授予队友计划批准,无需向你单独提示。

320 320 


549* **没有嵌套团队**:队友无法生成自己的队友。只有负责人可以管理团队。549* **没有嵌套团队**:队友无法生成自己的队友。只有负责人可以管理团队。

550* **没有来自 in-process 队友的后台子代理**:in-process 队友自己的子代理在前台运行,因为队友的后台工作无法超越负责人的进程。Claude Code 在队友生成定义设置 `background: true` 的子代理时返回错误。队友的 `run_in_background: true` 请求也会失败,要么返回错误,要么如 [Claude Code 如何选择前台或后台](/docs/zh-CN/sub-agents#run-subagents-in-foreground-or-background) 中所述在前台静默运行。从主对话启动的子代理遵循[后台默认值](/docs/zh-CN/sub-agents#run-subagents-in-foreground-or-background)。550* **没有来自 in-process 队友的后台子代理**:in-process 队友自己的子代理在前台运行,因为队友的后台工作无法超越负责人的进程。Claude Code 在队友生成定义设置 `background: true` 的子代理时返回错误。队友的 `run_in_background: true` 请求也会失败,要么返回错误,要么如 [Claude Code 如何选择前台或后台](/docs/zh-CN/sub-agents#run-subagents-in-foreground-or-background) 中所述在前台静默运行。从主对话启动的子代理遵循[后台默认值](/docs/zh-CN/sub-agents#run-subagents-in-foreground-or-background)。

551* **负责人是固定的**:主会话在其生命周期内是其团队的负责人。你无法将队友提升为负责人或转移领导权。551* **负责人是固定的**:主会话在其生命周期内是其团队的负责人。你无法将队友提升为负责人或转移领导权。

552* **权限在生成时设置**:所有队友从负责人的权限模式开始。你可以在生成后更改个别队友模式,但在生成时无法设置每个队友的模式。552* **权限在生成时设置**:队友从 [权限](#permissions) 下描述的权限模式开始。你可以在生成后更改个别队友的权限模式,但在生成时无法设置每个队友的权限模式。

553* **分割窗格需要 tmux 或 iTerm2**:默认 in-process 模式在任何终端中工作。VS Code 的集成终端、Windows Terminal 或 Ghostty 不支持分割窗格模式。553* **分割窗格需要 tmux 或 iTerm2**:默认 in-process 模式在任何终端中工作。VS Code 的集成终端、Windows Terminal 或 Ghostty 不支持分割窗格模式。

554 554 

555<h2 id="next-steps">555<h2 id="next-steps">

agent-view.md +479 −199

Details

19要比较 agent view 与 subagents、agent teams 和 worktrees,请参阅 [并行运行代理](/docs/zh-CN/agents)。19要比较 agent view 与 subagents、agent teams 和 worktrees,请参阅 [并行运行代理](/docs/zh-CN/agents)。

20 20 

21<Note>21<Note>

22 Agent view 是研究预览版,需要 Claude Code v2.1.139 或更高版本。使用 `claude --version` 检查你的版本。随着功能的发展,界面和快捷键可能会改变。22 Agent view 处于研究预览阶段。随着功能的发展,界面和快捷键可能会改变。

23</Note>23</Note>

24 24 

25本页涵盖:

26 

27* [快速开始](#quick-start):给 Claude 一个在后台处理的任务,检查它,并在需要时介入

28* [使用 agent view 监控会话](#monitor-sessions-with-agent-view),包括状态图标、窥视和回复、附加、组织和快捷键

29* [调度新代理](#dispatch-new-agents),从 agent view、从会话内部或从 shell

30* [从 shell 管理会话](#manage-sessions-from-the-shell),使用 `claude agents`、`claude attach` 和相关命令

31* [后台会话如何被托管](#how-background-sessions-are-hosted),由监督进程

32 

33<h2 id="quick-start">25<h2 id="quick-start">

34 快速开始26 快速开始

35</h2>27</h2>


44 claude agents36 claude agents

45 ```37 ```

46 38 

47 Agent view 打开,底部有一个输入框,当会话启动时表格会填充。随时按 `Esc` 返回你的 shell。你的会话在你离开时继续运行,下次打开 agent view 时会重新出现。39 如果你还没有接受该目录的[工作区信任对话框](/docs/zh-CN/permissions#project-allow-rules-and-workspace-trust),Claude Code 会在 agent view 打开前显示它,与 `claude` 显示的对话框相同。接受以保存工作区的信任并继续。如果你拒绝,Claude Code 会退出而不打开 agent view。

40 

41 Agent view 打开,底部有一个输入框,当会话启动时表格会填充。随时按 `Esc` 返回你的 shell;如果你通过后台会话 `←` 打开了 agent view,`Esc` 会返回到该对话框。你的会话在你离开时继续运行,下次打开 agent view 时会重新出现。

48 </Step>42 </Step>

49 43 

50 <Step title="调度一个会话">44 <Step title="调度一个会话">

51 输入描述任务的提示并按 `Enter`。一个新的后台会话在该任务上启动并显示为一行,显示它是否正在工作、等待你或已完成。新会话使用 agent view 标题中显示的模型和在该目录中运行 `claude` 时会获得的相同[权限模式](#permission-mode-model-and-effort)。45 输入描述任务的提示并按 `Enter`。一个新的后台会话在该任务上启动并显示为一行,显示它是否正在工作、等待你或已完成。新会话使用 agent view 标题中显示的模型。[它启动的权限模式](#permission-mode-model-and-effort)取决于你如何打开 agent view。

52 46 

53 你在此输入的每个提示都会启动自己的新会话。输入另一个提示并按 `Enter` 会启动第二个会话,与第一个会话并行运行,而不是向其发送后续消息。你可以通过这种方式并行运行多个会话。47 你在此输入的每个提示都会启动自己的新会话。输入另一个提示并按 `Enter` 会启动第二个会话,与第一个会话并行运行,而不是向其发送后续消息。你可以通过这种方式并行运行多个会话。

54 48 


64 </Step>58 </Step>

65 59 

66 <Step title="将现有会话引入">60 <Step title="将现有会话引入">

67 这一步需要一个运行中的会话。如果你遵循了之前的步骤,你在此终端中没有打开的会话,所以在另一个终端中打开一个常规 `claude` 会话并先向其发送一条消息。要将你已经打开的会话移入 agent view,在其中运行 `/bg`,或在空提示上按 `←` 以后台会话并在一步中打开 agent view。会话继续运行并显示为一行,与你调度的会话并排。61 这一步需要一个运行中的会话。如果你遵循了之前的步骤,你在此终端中没有打开的会话,所以在另一个终端中打开一个常规 `claude` 会话并先向其发送一条消息。

62 

63 要将你已经打开的会话移入 agent view,在其中运行 `/bg`,或在空提示上按 `←` 以后台会话并在一步中打开 agent view。在没有消息的新会话中,`/bg` 会要求你先发送一条消息,而 `←` 可以立即工作。会话继续运行并显示为一行,与你调度的会话并排。

68 </Step>64 </Step>

69</Steps>65</Steps>

70 66 

71你可以使用 `claude agents` 作为你的主要入口点而不是 `claude`:从 agent view 调度每个任务,当你想要完整对话时附加,按 `←` 返回表格。67你可以使用 `claude agents` 作为你的主要入口点而不是 `claude`:从 agent view 调度每个任务,当你想要完整对话时附加,按 `←` 返回表格。

72 68 

73在常规 `claude` 会话内,提示页脚的 `←` 提示计算正在等待你的后台 agent 数量,例如 `← 2 agents`,当没有 agent 需要输入时返回 `← for agents`。超过 99 的计数显示为 `99+`。当终端获得焦点时,计数大约每十秒刷新一次,当焦点返回时立即刷新。当计数移动和 agent 完成时,它会短暂改变颜色,除非启用了[`prefersReducedMotion` 设置](/docs/zh-CN/settings#available-settings),并且在[屏幕阅读器模式](/docs/zh-CN/accessibility)中隐藏。在 [Amazon Bedrock、Google Cloud 的 Agent Platform 和 Microsoft Foundry](/docs/zh-CN/third-party-integrations) 上,提示保持其纯 `← for agents` 形式,没有计数。需要 Claude Code v2.1.205 或更高版本。69在常规 `claude` 会话内,提示页脚的 `←` 提示计算正在等待你的后台 agent 数量,例如 `← 2 agents`,当没有 agent 需要输入时返回 `← for agents`。超过 99 的计数显示为 `99+`。当终端获得焦点时,计数大约每十秒刷新一次,当焦点返回时立即刷新。当计数移动和 agent 完成时,它会短暂改变颜色,当后台会话完成而没有 agent 需要你的输入时,它会短暂显示完成的数量,例如 `← 2 done`。当启用了[`prefersReducedMotion` 设置](/docs/zh-CN/settings-reference#prefersreducedmotion)时,两个闪烁都关闭,并且在[屏幕阅读器模式](/docs/zh-CN/accessibility)中隐藏提示。

74 70 

75<h2 id="monitor-sessions-with-agent-view">71<h2 id="monitor-sessions-with-agent-view">

76 使用 agent view 监控会话72 使用 agent view 监控会话


78 74 

79运行 `claude agents` 打开 agent view。它接管整个终端并列出按状态分组的每个会话,固定的会话和需要你的会话在顶部。每行显示会话的名称、当前活动和其年龄,从会话创建时开始计算;已完成的会话的年龄冻结在运行花费的时间。75运行 `claude agents` 打开 agent view。它接管整个终端并列出按状态分组的每个会话,固定的会话和需要你的会话在顶部。每行显示会话的名称、当前活动和其年龄,从会话创建时开始计算;已完成的会话的年龄冻结在运行花费的时间。

80 76 

81名称用该会话中由 [`/color`](/docs/zh-CN/commands) 设置的颜色着色。从 v2.1.199 开始,当你用 `←` 或 `/background` [后台会话](#from-inside-a-session)时,颜色会保留。77名称用该会话中由 [`/color`](/docs/zh-CN/commands) 设置的颜色着色。包括当你用 `←` 或 `/background` [后台会话](#from-inside-a-session)时。

82 78 

83默认情况下,列表显示你启动的每个后台会话,跨越所有项目。在一个存储库中工作的会话和在不同 worktree 中工作的另一个会话都会出现在这里,无论你从哪个目录打开 agent view。要将列表限制到一个项目,请传递 `--cwd`:79默认情况下,列表显示你启动的每个后台会话,跨越所有项目。在一个存储库中工作的会话和在不同 worktree 中工作的另一个会话都会出现在这里,无论你从哪个目录打开 agent view。要将列表限制到一个项目,请传递 `--cwd`:

84 80 


86claude agents --cwd ~/projects/my-app82claude agents --cwd ~/projects/my-app

87```83```

88 84 

89这只显示在该目录下启动的会话。已[移入 worktree](#how-file-edits-are-isolated) 到 `~/projects/my-app/.claude/worktrees/` 下的会话仍然算作属于 `~/projects/my-app`。85这只显示在该目录下启动的会话。它仍然列出已[移入 worktree](#how-file-edits-are-isolated) 到 `~/projects/my-app/.claude/worktrees/` 下的会话。

90 86 

91你在其他终端中打开的交互式会话不会出现,直到你[后台它们](#from-inside-a-session)。[Subagents](/docs/zh-CN/sub-agents) 和 [teammates](/docs/zh-CN/agent-teams) 会话生成的不会列为单独的行。87你在其他终端中打开的交互式会话不会出现,直到你[后台它们](#from-inside-a-session)。[Subagents](/docs/zh-CN/sub-agents) 和 [teammates](/docs/zh-CN/agent-teams) 会话生成的不会列为单独的行。

92 88 


117每行以一个图标开头,其颜色和动画显示会话的状态:113每行以一个图标开头,其颜色和动画显示会话的状态:

118 114 

119| 状态 | 图标显示为 | 含义 |115| 状态 | 图标显示为 | 含义 |

120| :--- | :---- | :------------------------------ |116| :--- | :---- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

121| 工作中 | 动画 | Claude 正在积极运行工具或生成响应 |117| 工作中 | 动画 | Claude 正在积极运行工具或生成响应 |

122| 需要输入 | 黄色 | Claude 等待你的特定问题或权限决定 |118| 需要输入 | 黄色 | Claude 等待你提供的特定内容:问题的答案、权限决定或只有你能回答的另一个提示,例如 [sandbox](/docs/zh-CN/sandboxing) 提示以允许网络主机或 MCP 服务器的[请求输入](/docs/zh-CN/mcp#respond-to-mcp-elicitation-requests)。需要附加终端的命令,例如 `/install-github-app` 或 `/mcp` 设置列表,[也在此处保持无人值守的会话](#attach-to-a-session) |

123| 空闲 | 暗淡 | 会话没有任何事情要做,准备好接收你的下一个提示 |119| 空闲 | 暗淡 | 会话没有任何事情要做,准备好接收你的下一个提示 |

124| 已完成 | 绿色 | 任务成功完成 |120| 已完成 | 绿色 | 任务成功完成 |

125| 失败 | 红色 | 任务以错误结束 |121| 失败 | 红色 | 任务以错误结束 |

126| 已停止 | 灰色 | 会话被 `Ctrl+X` 或 `claude stop` 停止 |122| 已停止 | 灰色 | 你用 `Ctrl+X` 或 `claude stop` 停止了会话,[其进程从 Claude Code 外部结束](#the-supervisor-process),或[它在后台服务关闭时结束](#sessions-show-as-failed-after-shutdown) |

127 123 

128另外,图标的形状显示底层进程是否正在运行:124另外,图标的形状显示底层进程是否正在运行:

129 125 

130| 形状 | 含义 |126| 形状 | 含义 |

131| :---------- | :----------------------------------------------------------- |127| :---------- | :----------------------------------------------------------- |

132| `✻` 或动画 `✽` | 会话进程处于活跃状态并立即回复 |128| `✻` 或动画 `✽` | 会话进程处于活跃状态并立即回复 |

133| `∙` | 进程已退出。你仍然可以窥视、回复或附加,Claude 从中断处重新启动 |129| `∙` | 进程已退出。你仍然可以窥视该行,当你回复或附加时,Claude 从中断处重新启动 |

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

135 131 

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

137 133 

138终端标签标题在 agent view 打开时显示等待输入的计数:当会话需要输入时显示 `2 awaiting input · claude agents`,或当没有会话需要输入时显示 `claude agents`。134终端标签标题在 agent view 打开时显示等待输入的计数:当会话需要输入时显示 `2 awaiting input · claude agents`,或当没有会话需要输入时显示 `claude agents`。

139 135 

140从 v2.1.198 开始,当 agent view 打开时,Claude Code 还会通过你配置的[终端通知频道](/docs/zh-CN/terminal-config#get-a-terminal-bell-or-notification)发送通知,当本地后台会话开始需要你的输入、完成或失败时。在计划上运行的会话,例如 [`/loop`](/docs/zh-CN/scheduled-tasks) 会话,仅在需要你的输入时通知。通知使用与 Claude Code 其余部分相同的 [`preferredNotifChannel` 设置](/docs/zh-CN/settings#available-settings),并使用 `agent_needs_input` 或 `agent_completed` 类型触发 [`Notification` hook](/docs/zh-CN/hooks#notification)。136要从脚本或另一个程序读取会话状态,请使用 [`claude agents --json`](#read-session-state-from-a-script) 而不是 `~/.claude/jobs/` 下的文件。

137 

138当 agent view 打开时,Claude Code 还会通过你配置的[终端通知频道](/docs/zh-CN/terminal-config#get-a-terminal-bell-or-notification)发送通知,当本地后台会话开始需要你的输入、完成或失败时。在计划上运行的会话,例如 [`/loop`](/docs/zh-CN/scheduled-tasks) 会话,仅在需要你的输入时通知。通知使用与 Claude Code 其余部分相同的 [`preferredNotifChannel` 设置](/docs/zh-CN/settings-reference#preferrednotifchannel),并使用 `agent_needs_input` 或 `agent_completed` 类型触发 [`Notification` hook](/docs/zh-CN/hooks#notification)。

141 139 

142后台会话不需要任何打开的终端来继续工作。一个单独的[监督进程](#the-supervisor-process)运行它们,所以你可以关闭 agent view、关闭你的 shell 或启动一个新的交互式会话,你的调度工作继续进行。140后台会话不需要任何打开的终端来继续工作。一个单独的[监督进程](#the-supervisor-process)运行它们,所以你可以关闭 agent view、关闭你的 shell 或启动一个新的交互式会话,你的调度工作继续进行。

143 141 

144会话状态通过自动更新和监督进程重启在磁盘上持久化。会话在你的机器休眠时也会被保留。它们的进程在唤醒时恢复,监督进程重新连接到它们,而不是将时间间隙视为空闲。关闭仍然会停止运行中的会话;请参阅[关闭后会话显示为失败](#sessions-show-as-failed-after-shutdown)了解如何恢复它们。142会话状态通过自动更新和监督进程重启在磁盘上持久化。会话在你的机器休眠时也会被保留。它们的进程在唤醒时恢复,监督进程重新连接到它们,而不是将时间间隙视为空闲。关闭仍然会停止运行中的会话;请参阅[关闭后会话显示为失败或停止](#sessions-show-as-failed-after-shutdown)了解如何恢复它们。

145 143 

146当你打开一个已停止响应的会话时,监督进程重启其进程,会话从中断处继续中断的响应。当机器在会话中途响应时休眠时,会话可能会陷入该状态。需要 Claude Code v2.1.200 或更高版本。144当机器在会话中途响应时休眠时,会话可能会陷入无响应状态。当你打开一个已停止响应的会话时,监督进程重启其进程,会话从中断处继续中断的响应。

147 145 

148<h3 id="row-summaries">146<h3 id="row-summaries">

149 行摘要147 行摘要


151 149 

152每行中的单行摘要由 [Haiku-class 模型](/docs/zh-CN/model-config)生成,所以该行可以告诉你会话正在做什么、需要什么或生成了什么,无需打开记录。当会话正在积极工作时,摘要最多每 15 秒从会话自己的最近输出刷新一次,无需发送模型请求,每个回合结束时模型写入新摘要。150每行中的单行摘要由 [Haiku-class 模型](/docs/zh-CN/model-config)生成,所以该行可以告诉你会话正在做什么、需要什么或生成了什么,无需打开记录。当会话正在积极工作时,摘要最多每 15 秒从会话自己的最近输出刷新一次,无需发送模型请求,每个回合结束时模型写入新摘要。

153 151 

154工作中的行显示会话说它正在做什么,被阻止的行显示它提出的问题。在长回合期间,模型也大约每分钟重写一次摘要,每次重写后等待时间加倍,最多四分钟,所以繁忙的行不会继续显示过时的摘要。在 v2.1.205 之前,工作中的行可能显示原始工具调用而不是报告,运行并行工作项的会话在文本之前显示 `done/total` 计数,例如 `2/5`。152工作中的行显示会话说它正在做什么,被阻止的行显示它提出的问题。在长回合期间,模型也大约每分钟重写一次摘要,所以繁忙的行不会继续显示过时的摘要。摘要文本填充行的剩余宽度;打开[窥视面板](#peek-and-reply)读取终端边缘裁剪的句子。

155 153 

156摘要文本填充行的剩余宽度,仅在终端的右边缘截断;打开[窥视面板](#peek-and-reply)读取边缘裁剪的句子。在 v2.1.206 之前,文本在 64 列处被切割,无论终端宽度如何。154当列表[按目录分组](#organize-the-list)时,摘要以会话的状态作为彩色单词开头,例如 `Needs input · double jump or wall climb?`。在默认状态分组中,组标题已经命名了状态,所以行只显示摘要。

157 155 

158当列表[按目录分组](#organize-the-list)时,摘要以会话的状态作为彩色单词开头,例如 `Needs input · double jump or wall climb?`。在默认状态分组中,组标题已经命名了状态,所以行只显示摘要。在 v2.1.205 之前,按目录分组的行不带状态单词。156结束回合摘要和每次中途重写是通过你的正常提供商的一个短 Haiku-class 请求,按与会话本身相同的[数据使用条款](/docs/zh-CN/data-usage)计费和处理。15 秒的模型重写之间的更新重用会话自己的输出,不发送请求。在没有配置 Haiku-class 模型的第三方提供商或网关上,请求使用会话的主模型;设置 [`ANTHROPIC_DEFAULT_HAIKU_MODEL`](/docs/zh-CN/model-config#environment-variables) 以选择一个。

159 

160整个输出不包含字母或数字的回合,例如打印单个符号的安静迭代的 [`/loop`](/docs/zh-CN/scheduled-tasks) 会话,保持行的前一个摘要和状态。在 v2.1.205 之前,该回合被重新分类,可能将等待你输入的会话翻转回 `Working`。

161 

162结束回合摘要和每次中途重写是通过你的正常提供商的一个短 Haiku-class 请求,按与会话本身相同的[数据使用条款](/docs/zh-CN/data-usage)计费和处理。15 秒的模型重写之间的更新重用会话自己的输出,不发送请求。在第三方提供商(如 Amazon Bedrock、Google Cloud 的 Agent Platform、Microsoft Foundry 和自定义网关)上,当没有配置 Haiku 模型时,请求会回退到会话的主模型。设置 [`ANTHROPIC_DEFAULT_HAIKU_MODEL`](/docs/zh-CN/model-config#environment-variables) 以在这些提供商上为这些摘要选择模型。

163 157 

164<h3 id="pull-request-status">158<h3 id="pull-request-status">

165 拉取请求状态159 拉取请求状态

166</h3>160</h3>

167 161 

168当会话打开拉取请求时,`#1234` 标签出现在行的右边缘,在支持超链接的终端中链接到拉取请求。当你向会话发送后续内容时标签保持,所以拉取请求在行恢复到实时进度时保持可见。在 worktree 中隔离其更改的后台会话自己打开这些拉取请求;[文件编辑如何隔离](#how-file-edits-are-isolated)涵盖何时发生以及会话在没有询问的情况下永远不会做什么。162当会话[打开拉取请求](#how-file-edits-are-isolated)时,Claude Code 在行的右边缘添加一个标签,链接到拉取请求:

169 163 

170处理现有拉取请求的会话以相同方式链接到它。使用 `gh` 编辑、评论、关闭或标记拉取请求为就绪链接命令自己的输出命名的拉取请求,所以捕获的输出不命名拉取请求的 `gh` 命令不创建链接;`gh pr merge` 是常见情况,因为它仅将其结果打印到交互式终端。使用 `gh pr checkout` 检出拉取请求,或推送到有打开拉取请求的分支,通过改为使用 `gh pr view` 查找该分支来链接它。在 v2.1.205 之前,仅会话创建或检出的拉取请求被链接,推送仅在本地分支名称匹配时链接一个。164* Claude Code 将标签写为 `#1234` 用于拉取请求,`!1234` 用于 GitLab 合并请求。

165* Claude Code 即使无法检测到超链接支持(例如通过 SSH 或 tmux)也会发出链接。设置 [`FORCE_HYPERLINK=0`](/docs/zh-CN/env-vars) 将标签呈现为纯文本。

166* 在你向会话发送后续内容后,Claude Code 保持标签,同时行返回到实时进度。

171 167 

172Claude Code 从完整命令输出读取拉取请求,包括当命令的输出超过内联限制时保存到文件的部分。在 v2.1.205 之前,在 Bash 调用中创建的拉取请求,其输出超过约 30,000 个字符,未被链接。168处理现有拉取请求的会话以相同方式链接到它。Claude Code 根据 Claude 运行的命令以不同方式查找拉取请求:

169 

170* 当 Claude 用 `gh` 编辑、评论、关闭或标记拉取请求为就绪时,Claude Code 链接命令自己的输出命名的拉取请求。捕获的输出不命名拉取请求的 `gh` 命令不创建链接;`gh pr merge` 是常见情况,因为它仅将其结果打印到交互式终端。

171* 当 Claude 用 `gh pr checkout` 检出拉取请求或推送到分支时,Claude Code 用 `gh pr view` 查找分支并链接其打开的拉取请求。

172* 当 Claude 推送时拉取请求不需要已存在:Claude Code 在同一目录中最多五个后续 `git`、`gh`、`glab` 或 `curl` 命令运行后重试分支查找,所以在推送后创建的拉取请求,包括 Claude 通过 GitHub REST API 创建的,在重试找到它时链接。

173 173 

174当会话链接到多个拉取请求时,标签显示计数,例如 `3 PRs`,按最需要关注的打开拉取请求着色。打开[窥视面板](#peek-and-reply)查看它们全部。174当会话链接到多个拉取请求时,标签显示计数,例如 `3 PRs`,按最需要关注的打开拉取请求着色。打开[窥视面板](#peek-and-reply)查看它们全部。

175 175 


182| 紫色 | 已合并 |182| 紫色 | 已合并 |

183| 灰色 | 草稿或已关闭 |183| 灰色 | 草稿或已关闭 |

184 184 

185对于大多数任务,这列是你收集结果的地方:当其编号变绿时审查和合并拉取请求。185对于以拉取请求结束的任务,检查此标签以获取结果:当其编号变绿时审查和合并拉取请求。

186 186 

187<h3 id="peek-and-reply">187<h3 id="peek-and-reply">

188 窥视和回复188 窥视和回复


198 198 

199大多数时候窥视面板就足够了,你不需要打开完整的记录。199大多数时候窥视面板就足够了,你不需要打开完整的记录。

200 200 

201在 v2.1.207 之前,每次窥视都以状态句子和裸时间戳打开,被阻止的会话的问题出现在它们下方,前缀为相同的时间戳第二次。201在窥视面板中输入回复并按 `Enter` 将其发送到该会话。当会话提出带有预定义选择的问题时,窥视面板将它们显示为编号列表,你可以按数字键选择一个。权限提示显示为描述会话想要运行的内容的文本,没有编号选项。输入回复以回答它,或附加以用标准提示回答。对于其他被阻止的会话,按 `Tab` 用建议的回复填充输入,你可以在发送前编辑。用 `!` 前缀回复以发送 Bash 命令。

202 202 

203在窥视面板中输入回复并按 `Enter` 将其发送到该会话。当会话提出多选问题时,窥视面板显示选项,你可以按数字键选择一个。对于其他被阻止的会话,按 `Tab` 用建议的回复填充输入,你可以在发送前编辑。用 `!` 前缀回复以发送 Bash 命令。203当 [`PermissionRequest`](/docs/zh-CN/hooks#permissionrequest) 或 [`PreToolUse`](/docs/zh-CN/hooks#pretooluse) hook 返回 Claude Code 无法为会话询问的调用验证的输出时,行显示 hook 事件和 `hook output invalid:` 以及验证错误,然后是待处理请求的文本。对于以其他方式失败的 hook,行说 hook 失败。会话仍然等待相同的请求。

204 204 

205无法传递的回复,因为后台服务无法访问或发送失败,会被保存并在其进程再次启动时作为其下一个提示发送到会话,错误消息说回复已保存。前缀为 `!` 的回复不会被保存,因为保存的文本会作为纯提示而不是 Bash 命令到达会话。205无法传递的回复,因为后台服务无法访问或发送失败,会被保存并在其进程再次启动时作为其下一个提示发送到会话,错误消息说回复已保存。前缀为 `!` 的回复不会被保存,因为保存的文本会作为纯提示而不是 Bash 命令到达会话。

206 206 


216 216 

217附加时,会话的行为像任何其他 Claude Code 会话:[命令](/docs/zh-CN/commands)、快捷键和功能都有效,除了下面的例外。217附加时,会话的行为像任何其他 Claude Code 会话:[命令](/docs/zh-CN/commands)、快捷键和功能都有效,除了下面的例外。

218 218 

219后台会话拒绝 `/install-github-app` 和 [`/mcp`](/docs/zh-CN/mcp) 设置列表,包括其身份验证操作,无论你是附加还是从窥视面板回复。消息指导你到常规 `claude` 会话,`/mcp reconnect <server>`、`/mcp enable` 和 `/mcp disable` 仍然有效。219当你附加时,`/install-github-app` 和 [`/mcp`](/docs/zh-CN/mcp) 设置列表正常工作,因为终端上有人可以完成它们的对话。当没有人附加时,这些命令无法打开它们的对话,所以会话在 agent view 中显示在 `Needs input` 下,行如 `open this session to manage MCP servers`,记录回复说相同的内容。附加并再次运行命令以继续;当你附加时需要输入的行清除。`/mcp reconnect <server>`、`/mcp enable` 和 `/mcp disable` 无论哪种方式都无需附加即可工作。

220 220 

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

222 222 

223在空提示上按 `←` 或运行 `/exit` 分离并返回 agent view。从 v2.1.198 开始,这的工作方式与你从 agent view 打开会话或从 shell 用 `claude attach <id>` 运行相同。223在空提示上按 `←` 或运行 `/exit` 分离并返回 agent view,无论你从 agent view 打开会话还是从 shell 用 `claude attach <id>` 运行。

224 

225当 [`/btw` overlay](/docs/zh-CN/interactive-mode#side-questions-with-%2Fbtw) 打开时,`←` 也分离。需要 Claude Code v2.1.257 或更高版本。仍在回答的侧问题在你离开时继续运行。下次你附加时,overlay 会重新打开它,或带有它的答案。

226 

227在 Windows 上,如果你在附加后约半秒内按 `←`,Claude Code 显示 `Ambiguous ←, press again to detach`,因为在该窗口中终端可以重新传递附加前的按压。再按一次 `←` 以分离。

224 228 

225`Ctrl+Z` 也分离但返回到你开始的地方:如果你从那里附加则返回 agent view,或如果你运行了 `claude attach` 则返回你的 shell。当对话有焦点且不响应 `←` 时使用 `Ctrl+Z`。229`Ctrl+Z` 也分离但返回到你开始的地方:如果你从那里附加则返回 agent view,或如果你运行了 `claude attach` 则返回你的 shell。当对话有焦点且不响应 `←` 时使用 `Ctrl+Z`。

226 230 


228 232 

229分离永远不会停止后台会话:`←`、`Ctrl+Z`、`/exit` 和双 `Ctrl+C` 或双 `Ctrl+D` 都让它运行。要从内部结束会话,运行 `/stop`。233分离永远不会停止后台会话:`←`、`Ctrl+Z`、`/exit` 和双 `Ctrl+C` 或双 `Ctrl+D` 都让它运行。要从内部结束会话,运行 `/stop`。

230 234 

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

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

237</h4>

238 

231在前台运行的会话中,一个你在终端中启动的而不是从 agent view 附加的,在空提示上按 `←` 会后台它并打开 agent view,该行被选中,所以你可以在不离开终端的情况下切换会话。同样的单次按压分离附加的会话。239在前台运行的会话中,一个你在终端中启动的而不是从 agent view 附加的,在空提示上按 `←` 会后台它并打开 agent view,该行被选中,所以你可以在不离开终端的情况下切换会话。同样的单次按压分离附加的会话。

232 240 

233如果在你按 `←` 时工具正在运行,Claude Code 会等待大约十秒钟让它完成,然后后台,响应在后台会话中继续。再按一次 `←` 以立即后台而不是等待。当进行中的工作无法转移到后台会话时,`Background this session?` 对话首先出现,与 [`/background`](#from-inside-a-session) 相同。241如果你在删除提示的最后文本或通过提示历史移动后立即按 `←`,Claude Code 会要求你确认:第一次按压显示 `Press ← again to open agents`,或在附加的会话中显示 `Press ← again to go back to agents`,第二次按压切换。

242 

243当 `←` 后台前台会话时,agent view 显示 `Your conversation moved to the background` 在列表上方,该会话的行已被选中。从那里:

244 

245* 按 `Enter` 重新打开对话。

246* 按 `Esc` 撤销切换并返回对话。如果 `Esc` 显示 `Still starting — try again in a moment`,后台会话还没有准备好,所以稍后再按一次 `Esc`。

247* 按 `Ctrl+C` 两次以退出到你的 shell。

248 

249当 Claude Code 无法重新打开对话时,它退出并打印一个 `claude --resume` 命令来恢复它。

250 

251[Claude 的任务列表](/docs/zh-CN/interactive-mode#task-list)随对话移动到后台会话,所以当你返回该行时清单是完整的。

252 

253你按 `←` 的行也在你用箭头键或鼠标移动选择后保持粗体、未暗淡的名称,所以你可以告诉你来自哪个会话。

254 

255如果在你按 `←` 时工具正在运行,Claude Code 会等待大约十秒钟让它完成后台,响应在后台会话中继续。再按一次 `←` 以立即后台而不是等待。当进行中的工作无法转移到后台会话时,Claude Code 首先显示 `Background this session?` 对话,与 [`/background`](#from-inside-a-session) 相同。

234 256 

235十秒限制在 [subagents](/docs/zh-CN/sub-agents) 运行时不适用。Claude Code 继续等待以便它们的工作转移,并在等待时显示 `Still backgrounding after the current tool` 通知;再按一次 `←` 以立即后台而不等待,这会从头重新启动 subagents。在 v2.1.203 之前,等待在十秒后结束,运行中的 subagents 在没有警告的情况下从头重新启动。257十秒限制在[前台 subagents](/docs/zh-CN/sub-agents#run-subagents-in-foreground-or-background) Claude 在对话中启动的仍在运行时不适用。Claude Code 继续等待以便它们的工作转移,并在等待时显示 `Still backgrounding after the current tool` 通知。再按一次 `←` 以立即后台而不等待,这会从头重新启动这些 subagents。Claude Code 不等待[动态工作流](/docs/zh-CN/workflows)正在运行的 subagents。当工作流有 subagents 运行时,Claude Code 显示 `Background this session?` 对话。

236 258 

237该行即使从没有对话历史的新会话也会被创建,所以 `→` 会返回到它。在 v2.1.203 之前,当该行是唯一的行时,agent view 在它下方显示一个入门提示。259Claude Code 不会在你的提示输入中有未发送的文本时后台会话,因为文本会留在你的终端输入框中,不会移动到后台会话。如果你在 Claude Code 等待后台会话时输入到输入中,它会用 `Backgrounding cancelled — you have unsent text in the input. Send it or clear it, then press ← again.` 取消切换。

260 

261按 `←` 创建会话的行,即使对话还没有消息,所以 `→` 仍然返回到它。

238 262 

239你可以在 `/config` 中用 `leftArrowOpensAgents` 设置关闭此快捷键。263你可以在 `/config` 中用 `leftArrowOpensAgents` 设置关闭此快捷键。

240 264 


255 279 

256要从列表中删除会话,按 `Ctrl+X` 停止它,在两秒内再按 `Ctrl+X` 删除它。在组标题上按 `Ctrl+X` 在确认后删除该组中的每个会话。280要从列表中删除会话,按 `Ctrl+X` 停止它,在两秒内再按 `Ctrl+X` 删除它。在组标题上按 `Ctrl+X` 在确认后删除该组中的每个会话。

257 281 

258删除会从 agent view 中删除会话。如果 Claude [为会话创建了 worktree](#how-file-edits-are-isolated),删除会删除该 worktree,包括其中的任何未提交的更改,所以在删除前推送或提交你想保留的工作。你自己创建的 worktree 并在其中启动会话的会被保留。对话记录保留在你的本地机器上,并且仍然可以通过 `claude --resume` 访问。282第二次按压删除会话,即使停止尝试失败,例如因为[后台服务没有响应](#agent-view-says-the-background-service-did-not-respond):确认保持活跃另外两秒,删除结束会话的进程本身。按 `Esc` 关闭确认而不删除。

283 

284除了[删除会话删除什么](#what-deleting-a-session-removes)中涵盖的保留情况外,删除会从列表中删除会话,Claude 为其创建的 worktree 会被删除、保留或留在原地,取决于你如何删除以及 worktree 保留什么。对话记录始终保留在你的本地机器上,可通过 `claude --resume` 访问。

285 

286要在 Claude Code v2.1.212 或更高版本上恢复会话,在调度输入中输入 `/resume`。一个选择器打开,显示你打开 agent view 的存储库的过去会话,最新的在前,包括你从列表中删除的会话;已有行的会话不会列出。`↑`/`↓` 移动选择,`Enter` 恢复选定的会话作为后台会话,所以它重新加入列表作为行,`Esc` 关闭选择器。

259 287 

260删除永远不会删除有未推送到任何地方的提交的 worktree,或另一个运行中的会话声称或已锁定的 worktree。Claude Code 保留 worktree 和会话,页脚命名保留的路径和原因。推送提交或关闭其他会话,然后再次删除。288选择器仅对裸 `/resume` 打开。有针对性的、作用域的或受限的恢复无法由选择器提供,所以当以下情况时 agent view 显示 `attach to a session to run it` 提示:

261 289 

262删除也会从[监督进程](#the-supervisor-process)的会话列表中清除会话,无论你用 `Ctrl+X` 删除还是从 shell 用 [`claude rm`](#manage-sessions-from-the-shell) 删除,所以删除在监督进程重启中保持。在 v2.1.206 之前,在监督进程重启或无法访问时删除会话会将其留在该列表中,下一个监督进程重启其进程并再次显示该行。290* `/resume` 命名一个 id 或搜索项

291* 视图用 `--cwd` 作用域

292* 视图用 [`--safe-mode`](/docs/zh-CN/cli-reference#cli-flags) 启动

293* 视图用 `--permission-mode` 或 `--settings` 等标志打开

263 294 

264不适合屏幕的已完成会话折叠成 `… N more` 行。失败和有打开拉取请求的会话始终保持可见。`Completed` 组填充活跃组之后剩余的垂直空间,在短终端上标题压缩为单个摘要行,以便正在工作或需要输入的会话保持可见。295不适合屏幕的已完成会话折叠成 `… N more` 行。失败和有打开拉取请求的会话始终保持可见。`Completed` 组填充活跃组之后剩余的垂直空间,在短终端上标题压缩为单个摘要行,以便正在工作或需要输入的会话保持可见。

265 296 


270在调度输入中输入以过滤而不是调度:301在调度输入中输入以过滤而不是调度:

271 302 

272| 过滤 | 显示 |303| 过滤 | 显示 |

273| :------------------- | :------------------------------------------------ |304| :----------------------- | :------------------------------------------------ |

274| `a:<name>` | 运行命名代理的会话 |305| `a:<name>` | 运行命名代理的会话 |

275| `s:<state>` | 给定状态的会话,例如 `s:working`。也接受 `s:blocked` 用于等待你的所有内容 |306| `s:<state>` | 给定状态的会话,例如 `s:working`。也接受 `s:blocked` 用于等待你的所有内容 |

276| `#<number>` 或 PR URL | 处理该拉取请求的会话 |307| `#<number>` 或拉取或合并请求 URL | 处理该拉取请求或合并请求的会话 |

277| 任何其他 URL | 其第一个提示包含该 URL 的会话 |308| 任何其他 URL | 其第一个提示包含该 URL 的会话 |

278 309 

279<h3 id="keyboard-shortcuts">310<h3 id="keyboard-shortcuts">


283在 agent view 中按 `?` 查看每个快捷键的上下文。下表总结了它们。314在 agent view 中按 `?` 查看每个快捷键的上下文。下表总结了它们。

284 315 

285| 快捷键 | 操作 |316| 快捷键 | 操作 |

286| :-------------------- | :-------------------------------- |317| :-------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

287| `↑` / `↓` | 在行之间移动 |318| `↑` / `↓` | 在行之间移动 |

288| `Enter` | 附加到选定的会话,或如果输入中有文本则调度 |319| `Enter` | 附加到选定的会话,或如果输入中有文本则调度 |

289| `Space` | 打开或关闭选定会话的窥视面板 |320| `Space` | 打开或关闭选定会话的窥视面板 |

290| `Shift+Enter` | 调度并立即附加 |321| `Shift+Enter` | 在调度输入中插入换行符,[如在主提示中](/docs/zh-CN/terminal-config#enter-multiline-prompts) |

322| `Ctrl+Enter` | 调度并立即附加,在终端中 `?` overlay 列出 `ctrl+enter to start and open` |

291| `→` | 附加到选定的会话 |323| `→` | 附加到选定的会话 |

292| `Alt+1`..`Alt+9` | 附加到当前目录中的第 1–9 个会话 |324| `Alt+1`..`Alt+9` | 附加到焦点会话目录中的第 1–9 个会话 |

293| `Tab` | 在空输入上浏览所有 subagents。否则应用突出显示的建议 |325| `Tab` | 在空输入上浏览所有 subagents。否则应用突出显示的建议 |

294| `Ctrl+S` | 在状态和目录之间切换分组 |326| `Ctrl+S` | 在状态和目录之间切换分组 |

295| `Ctrl+T` | 固定或取消固定选定的会话 |327| `Ctrl+T` | 固定或取消固定选定的会话 |

296| `Ctrl+R` | 重命名选定的会话 |328| `Ctrl+R` | 重命名选定的会话 |

297| `Ctrl+G` | 在你的 `$VISUAL` 或 `$EDITOR` 中打开调度提示 |329| `Ctrl+G` | 在你的 `$VISUAL` 或 `$EDITOR` 中打开调度提示 |

330| `Ctrl+J` | 在调度输入中插入换行符 |

298| `Ctrl+X` | 停止会话;在两秒内再按一次删除它 |331| `Ctrl+X` | 停止会话;在两秒内再按一次删除它 |

299| `Shift+↑` / `Shift+↓` | 重新排序选定的会话 |332| `Shift+↑` / `Shift+↓` | 重新排序选定的会话 |

300| `Esc` | 关闭窥视面板、清除输入或退出 |333| `Esc` | 关闭窥视面板、清除输入或退出。当你通过用 `←` 后台会话打开 agent view 时,最后的 `Esc` 返回该对话而不是退出。启用[vim 编辑器模式](/docs/zh-CN/interactive-mode#vim-editor-mode)时,在输入中按 `Esc` 从 INSERT 切换到 NORMAL 模式并保留你的文本,如在主提示中 |

301| `Ctrl+C` | 清除输入;按两次退出 |334| `Ctrl+C` | 清除输入;按两次退出 |

302| `?` | 显示所有快捷键 |335| `?` | 显示所有快捷键 |

303 336 

337`Ctrl+S`、`Ctrl+T` 和 `Ctrl+G` 遵循你的 [`keybindings.json`](/docs/zh-CN/keybindings)。在 [`Agents` 上下文](/docs/zh-CN/keybindings#agents-actions)中用 `agents:switchView` 和 `agents:togglePin` 操作重新绑定或取消绑定 `Ctrl+S` 和 `Ctrl+T`,以及通过 `Chat` 上下文的 `chat:externalEditor` 绑定的 `Ctrl+G`。表中的其他快捷键无法重新绑定。

338 

304<h2 id="dispatch-new-agents">339<h2 id="dispatch-new-agents">

305 调度新代理340 调度新代理

306</h2>341</h2>


313 348 

314在 agent view 底部的输入框中输入提示并按 `Enter` 启动新的后台会话。会话从提示自动命名;稍后可以用 `Ctrl+R` 重命名它。349在 agent view 底部的输入框中输入提示并按 `Enter` 启动新的后台会话。会话从提示自动命名;稍后可以用 `Ctrl+R` 重命名它。

315 350 

316会话稍后获得的名称也会出现在其行上,包括当你在该会话中 [接受计划](/docs/zh-CN/permission-modes#review-and-approve-a-plan) 时 Claude 推导的名称。在 v2.1.207 之前,通过接受计划命名的后台会话在 `/status` 中显示该名称,但在你自己重命名之前不会在其 agent-view 行上显示。351自动名称是由 [Haiku-class model](/docs/zh-CN/model-config) 编写的简短标签。会话稍后获得的名称也会出现在其行上,包括当你在该会话中 [接受计划](/docs/zh-CN/permission-modes#review-and-approve-a-plan) 时会话获得的 [生成的标题](/docs/zh-CN/sessions#name-your-sessions)。

317 352 

318将图像粘贴到提示中以包含任务的屏幕截图或图表。353将图像粘贴到提示中以包含任务的屏幕截图或图表。

319 354 

320粘贴的文本长度超过 800 个字符或超过两行会折叠为 `[Pasted text #N]` 占位符,以便输入保持在一行;完整文本在你调度时发送。要在调度前查看或编辑折叠的文本,再次粘贴相同的文本,占位符会展开回输入。在至少 90 列宽的终端上,粘贴后会在输入下方出现 `paste again to expand` 提醒几秒钟。在 v2.1.207 之前,再次粘贴相同的文本会添加第二个占位符而不是展开第一个。355粘贴的文本长度超过 800 个字符或超过三行会折叠为 `[Pasted text #N]` 占位符,以便输入保持在一行;完整文本在你调度时发送。要在调度前查看或编辑折叠的文本,再次粘贴相同的文本,占位符会展开回输入。

321 356 

322前缀或提及提示的部分以控制会话如何启动:357前缀或提及提示的部分以控制会话如何启动:

323 358 

324| 输入 | 效果 |359| 输入 | 效果 |

325| :---------------------- | :--------------------------------------------------------------------------------------- |360| :----------------------- | :--------------------------------------------------------------------------------------- |

326| `<agent-name> <prompt>` | 如果第一个单词匹配自定义 [subagent](/docs/zh-CN/sub-agents) 名称,该 subagent 作为会话的主代理运行,使用其 frontmatter 中的配置 |361| `<agent-name> <prompt>` | 如果第一个单词匹配自定义 [subagent](/docs/zh-CN/sub-agents) 名称,该 subagent 作为会话的主代理运行,使用其 frontmatter 中的配置 |

327| `@<agent-name>` | 在提示中的任何地方提及自定义 subagent 以作为主代理运行它 |362| `@<agent-name>` | 在提示中的任何地方提及自定义 subagent 以作为主代理运行它 |

328| `@<repo>` | 提及一个存储库以在那里运行会话。参见 [调度到特定目录](#dispatch-to-a-specific-directory) 了解列出了哪些存储库 |363| `@<repo>` | 提及一个存储库以在那里运行会话。参见 [调度到特定目录](#dispatch-to-a-specific-directory) 了解列出了哪些存储库 |

329| `/<command>` | 建议 [skills](/docs/zh-CN/skills) 和 [commands](/docs/zh-CN/commands) 作为提示调度 |364| `/<command>` | 建议 [skills](/docs/zh-CN/skills) 和 [commands](/docs/zh-CN/commands) 作为提示调度 |

330| `! <command>` | 运行 shell 命令作为后台作业而不是启动 Claude 会话。该作业显示为一行,你可以附加到、观看和分离 |365| `! <command>` | 运行 shell 命令作为后台作业而不是启动 Claude 会话。该作业显示为一行,你可以附加到、观看和分离 |

331| `#<number>` 或拉取请求 URL | 如果会话已在处理该 PR,选择它而不是调度 |366| `#<number>` 或拉取或合并请求 URL | 如果会话已在处理该拉取请求或合并请求,Claude Code 选择其行而不是调度新会话 |

332| `Shift+Enter` | 调度并立即附加到新会话 |

333 367 

334一小组命令在 agent view 本身中运行而不是调度:368一小组命令在 agent view 本身中运行而不是调度:

335 369 

336* `/exit` 和 `/quit` 关闭 agent view370* `/exit` 和 `/quit` 关闭 agent view

337* `/logout` 将你登出371* `/logout` 将你登出

338* `/model` 设置 [调度模型](#set-the-model)372* `/model` 设置 [调度模型](#set-the-model)

339* 从 v2.1.198 开始,`/login` 打开登录对话框,以便你可以在不附加到会话的情况下再次登录373* `/login` 打开登录对话框,以便你可以在不附加到会话的情况下再次登录

374* 裸 `/resume` 或其 `/continue` 别名打开存储库过去会话的选择器,以 [恢复一个](#organize-the-list) 作为后台会话。需要 Claude Code v2.1.212 或更高版本

340 375 

341Skills、你自己的命令和提示扩展内置命令如 `/init` 作为其第一个提示发送到新的后台会话。其他内置命令显示 `attach to a session to run it` 提示。你输入的所有内容都保留在提示旁边的输入中,以便你可以编辑它。在 v2.1.203 之前,提示清除了输入,输入的文本丢失了。376Skills、你自己的命令和提示扩展内置命令如 `/init` 作为其第一个提示发送到新的后台会话。其他内置命令显示 `attach to a session to run it` 提示。你输入的所有内容都保留在提示旁边的输入中,以便你可以编辑它。

342 377 

343将重复任务打包为 [skill](/docs/zh-CN/skills) 让你从 agent view 多次启动相同的工作流而无需重新输入提示。378将重复任务打包为 [skill](/docs/zh-CN/skills) 让你从 agent view 多次启动相同的工作流而无需重新输入提示。

344 379 


357 * 你启动的存储库的已注册 [git worktrees](/docs/zh-CN/worktrees),这些 worktrees 位于其目录树内,例如 Claude 在 `.claude/worktrees/` 下创建的那些,标记有其检出的分支。在存储库外添加的 worktrees,例如用 `git worktree add ../feature` 添加的,不会被列出392 * 你启动的存储库的已注册 [git worktrees](/docs/zh-CN/worktrees),这些 worktrees 位于其目录树内,例如 Claude 在 `.claude/worktrees/` 下创建的那些,标记有其检出的分支。在存储库外添加的 worktrees,例如用 `git worktree add ../feature` 添加的,不会被列出

358 * 任何已在列表中有会话的目录393 * 任何已在列表中有会话的目录

359 394 

360 名称包含空格的目录不会被列出。在 v2.1.203 之前,已注册的 worktrees 不会被列出,所以调度到其中意味着从该 worktree 的目录运行 `claude --bg`。395 名称包含空格的目录不会被列出。

361* 从 shell,`cd` 进入目录并运行 `claude --bg "<prompt>"`。396* 从 shell,`cd` 进入目录并运行 `claude --bg "<prompt>"`。

362 397 

363当 agent view 按目录分组时,突出显示的行的目录成为调度目标,所以你可以滚动到一个组并在不重新输入路径的情况下调度到它。398当 agent view 按目录分组时,调度会将提示发送到选定行的目录,所以你可以选择一个组并在不重新输入路径的情况下调度到它。

364 399 

365<h3 id="from-inside-a-session">400<h3 id="from-inside-a-session">

366 从会话内部401 从会话内部

367</h3>402</h3>

368 403 

404两个命令将工作从你所在的会话移动到后台:`/background` 将当前对话发送到那里并释放你的终端,`/fork` 在你继续工作的地方发送一个副本。

405 

406<h4 id="send-the-session-to-the-background">

407 将会话发送到后台

408</h4>

409 

369运行 `/background` 或其别名 `/bg` 将当前对话移动到后台会话。传递提示如 `/bg run the test suite and fix any failures` 以在后台化前先给出一个更多指令。如果 Claude 在你运行 `/bg` 时正在响应,响应会在后台会话中继续。410运行 `/background` 或其别名 `/bg` 将当前对话移动到后台会话。传递提示如 `/bg run the test suite and fix any failures` 以在后台化前先给出一个更多指令。如果 Claude 在你运行 `/bg` 时正在响应,响应会在后台会话中继续。

370 411 

371退出仍有后台工作运行的交互式会话,例如 subagents、后台 shell 命令、工作流或 [monitors](/docs/zh-CN/tools-reference#monitor-tool),会显示 `Background work is running` 对话而不是立即退出。从 v2.1.198 开始,对话提供 `Move to background and exit` 以及 `Exit anyway` 和 `Stay`。选择它会以与 `/background` 相同的方式将会话移动到后台,然后返回你的 shell,所以可以继续的工作保持运行,会话出现在 agent view 中。当 agent view 被 [关闭](#turn-off-agent-view) 时,不显示该选项。412退出仍有后台工作运行的会话,例如 subagents、后台 shell 命令、工作流或 [monitors](/docs/zh-CN/tools-reference#monitor-tool),会显示 `Background work is running` 对话而不是立即退出。选择 `Move to background and exit` 以与 `/background` 相同的方式将会话移动到后台并返回你的 shell。当 agent view 被 [关闭](#turn-off-agent-view) 时,不显示该选项。

413 

414如果后台会话列表上已有一个会话具有对话的名称,Claude Code 会对新行的名称进行编号,例如 `my-session (2)`,并保持现有行的名称不变。要重命名新行,在 agent view 中选择它并按 `Ctrl+R`。

415 

416<h4 id="copy-the-session-with-/fork">

417 使用 /fork 复制会话

418</h4>

419 

420运行 `/fork` 将当前对话复制到新的后台会话中,同时原始会话继续运行。副本从对话中到该点的所有内容开始;参见下面的项目符号了解副本运行的位置。它还会继承模型、权限模式、工作量以及你在会话期间添加的任何目录或"不再询问"权限授予。副本在 agent view 中显示为其自己的行。

421 

422在 fork 之后,两个对话是独立的:副本所做的任何事情都不会自动进入原始对话,尽管在启用了 [cross-session messaging](/docs/zh-CN/cross-session-messaging) 的会话中,任一会话的 Claude 都可以显式地向另一个会话发送消息。

423 

424复制会话需要 Claude Code v2.1.212 或更高版本;在 v2.1.161 到 v2.1.211 上,`/fork` 启动一个 [forked subagent](/docs/zh-CN/sub-agents#fork-the-current-conversation),现在是 `/subtask`。当 [agent view 被关闭](#turn-off-agent-view) 时,`/fork` 保持 forked-subagent 行为,`/subtask` 不可用。

425 

426传递提示如 `/fork open a draft pull request with the work so far`,副本立即开始处理它。没有提示的情况下,副本等待其第一个指令:在 `claude agents` 中选择其行并按 `Space` 发送一个,或运行 `claude attach <id>`。选定的行在等待时显示 `space to send it a prompt`。

372 427 

373从交互式会话后台化启动一个新的进程,该进程从保存的对话恢复,进行中的工作会转移到它:运行后台 shell 命令、后台 subagents、动态工作流和你用 [`/loop`](/docs/zh-CN/scheduled-tasks) 创建的计划任务会转移到后台会话并在那里继续运行。一个 subagent 与它启动的所有内容一起移动,所以它仅在所有工作都能转移时才转移,包括在 Windows 上。要停止进行中的工作而不是转移它,设置 [`CLAUDE_DISABLE_ADOPT=1`](/docs/zh-CN/env-vars#variables) 环境变量;Claude Code 随后会要求你在后台化前确认。428`/fork` 确认是一行,显示副本的状态,例如 `session running`、其 agent-view 行的名称和其会话 ID 用于 `claude attach`。点击名称以切换到副本:此会话移动到后台,与按 `←` 相同,agent view 打开副本的会话。

374 429 

375无法转移的工作,例如运行中的 [monitor](/docs/zh-CN/tools-reference#monitor-tool),会被停止。拥有监视器的后台 subagent 会与它一起被停止。当任何此类工作正在运行时,Claude Code 显示 `Background this session?` 对话,以便你可以在它被停止前确认。430除了副本 [就地编辑](#how-file-edits-are-isolated) 的情况外,Claude Code 指示它在进行代码更改前创建自己的 worktree。在 git 存储库外,只有从 hook 创建的 worktree 移出的副本才会获得该指令;没有 [`WorktreeCreate` hook](/docs/zh-CN/hooks#worktreecreate),副本就地编辑。从你的 worktree 移出的副本也被告知永远不要编辑、在其中运行命令或进入该 worktree,无论隔离设置如何。

431 

432副本开始的位置取决于当前会话运行的位置:

433 

434* 像任何调度的会话一样,副本 [在编辑文件前移动到其自己的 worktree](#how-file-edits-are-isolated)。在这种情况下,确认不会提及副本运行的位置。

435* 当你的会话在启动后移动到其链接的 [worktree](/docs/zh-CN/worktrees) 时,副本从会话移动前的位置开始,除非它 [就地编辑](#how-file-edits-are-isolated),在那里的自己的 worktree 中进行代码更改。当你的 worktree 在分支上检出时,该指令也告诉一个副本,其任务建立在你的工作基础上,以你的分支为基础创建其新分支,因为你的分支在你的 worktree 中保持检出。确认以 `runs in the origin tree` 结尾。

436* 当你在具有主工作树的存储库的链接 worktree 内启动会话时,副本在该主工作树中启动,具有相同的 worktree-of-its-own 规则但没有分支指令。确认也以 `runs in the origin tree` 结尾。

437* 在裸存储库布局的 worktree 内启动的会话没有主工作树可返回,所以副本保持在原地,确认以 `edits this checkout` 结尾。当 worktree 隔离在不在链接 worktree 内的会话中被 [关闭](#how-file-edits-are-isolated) 时,也会出现相同的注释,因为副本随后编辑你打开的文件。

438 

439使用启动标志启动的会话,副本不会继承,例如替换的系统提示或 `--tools` 允许列表,无法被 fork;Claude Code 会说明这一点而不是进行部分副本。从 agent view 调度的会话正常 fork:副本使用与其来自的会话相同的 [agent definition](/docs/zh-CN/sub-agents) 和附加指令启动。

440 

441<h4 id="what-carries-over-when-you-background">

442 后台化时会继承什么

443</h4>

444 

445后台化启动一个新进程,从保存的对话恢复,进行中的工作会转移到它:运行后台 shell 命令、后台 subagents、动态工作流、你用 [`/loop`](/docs/zh-CN/scheduled-tasks) 创建的计划任务,以及 Claude 对 [artifact comments 的自动回复](/docs/zh-CN/artifacts#let-claude-reply-to-comments-on-its-own) 都会继承并在那里继续运行。一个 subagent 与它启动的所有内容一起移动,所以它仅在所有工作都能转移时才转移。要停止进行中的工作而不是转移它,设置 [`CLAUDE_DISABLE_ADOPT=1`](/docs/zh-CN/env-vars#variables) 环境变量;Claude Code 随后会要求你在后台化前确认。

446 

447当 [dynamic workflow](/docs/zh-CN/workflows) 仍有 subagents 运行时,Claude Code 在后台化前用 `Background this session?` 对话询问,该对话说明有多少 subagents 会重新启动。选择 `Stay` 让它们先完成。如果你确认,Claude Code 在后台会话中重放运行:仍在运行的 subagents 从头开始,所以它们迄今为止使用的令牌会再次花费。参见 [Resume after a pause](/docs/zh-CN/workflows#resume-after-a-pause) 了解哪些已完成的 subagents 返回其保存的结果,哪些再次运行。

448 

449Claude Code 停止无法转移的工作,例如运行中的 [monitor](/docs/zh-CN/tools-reference#monitor-tool),并停止拥有监视器的后台 subagent 以及它。当任何此类工作正在运行时,Claude Code 显示 `Background this session?` 对话,以便你可以在它停止工作前确认。

376 450 

377一旦在后台,会话可以启动新的 subagents、monitors 和后台命令,这些会在后续的分离和重新附加中保持运行。451一旦在后台,会话可以启动新的 subagents、monitors 和后台命令,这些会在后续的分离和重新附加中保持运行。

378 452 


385* `--fallback-model`459* `--fallback-model`

386* `--allow-dangerously-skip-permissions`460* `--allow-dangerously-skip-permissions`

387 461 

388你在会话期间用 [`/add-dir`](/docs/zh-CN/permissions#additional-directories-grant-file-access-not-configuration) 添加的目录也会传递。462你在会话期间用 [`/add-dir`](/docs/zh-CN/permissions#additional-directories-grant-file-access-not-configuration) 添加的目录也会传递。传递 `--allow-dangerously-skip-permissions` 会在后台化的会话中保持 `bypassPermissions` 可访问,但它不会授予任何新权限:该模式仍然需要 [Permission mode, model, and effort](#permission-mode-model-and-effort) 中描述的一次性交互式接受。

389 

390传递 `--allow-dangerously-skip-permissions` 会在后台化的会话中保持 `bypassPermissions` 可访问,但它不会授予任何新权限。该模式仍然需要在任何会话使用它之前进行相同的一次性交互式接受,如 [权限模式、模型和工作量](#permission-mode-model-and-effort) 中所述。

391 463 

392<h3 id="from-your-shell">464<h3 id="from-your-shell">

393 从你的 shell465 从你的 shell


399claude --bg "investigate the flaky SettingsChangeDetector test"471claude --bg "investigate the flaky SettingsChangeDetector test"

400```472```

401 473 

402提示是位置参数,不是 `-p` 值。从 v2.1.198 开始,将 `--bg` 与 `-p` 或 `--print` 结合会在创建任何会话前被拒绝并显示错误,因为 `--print` 永远不会启动 `claude agents` 附加到的交互式会话。474提示是位置参数,不是 `-p` 值。Claude Code 拒绝 `--bg` 与 `-p` 或 `--print` 结合在任何会话创建前,因为 `--print` 永远不会启动 `claude agents` 附加到的交互式会话。

403 475 

404要运行特定的 subagent 作为会话的主代理,结合 `--bg` 和 `--agent`:476要运行特定的 [subagent](/docs/zh-CN/sub-agents)(你已定义的,例如 `code-reviewer`)作为会话的主代理,结合 `--bg` 和 `--agent`:

405 477 

406```bash theme={null}478```bash theme={null}

407claude --agent code-reviewer --bg "address review comments on PR 1234"479claude --agent code-reviewer --bg "address review comments on PR 1234"

408```480```

409 481 

482如果名称不匹配你的任何 subagents,启动失败:Claude Code 打印 `no agent named` 警告,仍然报告会话为后台化,但会话立即以 `--agent '<name>' not found` 错误退出。

483 

484当后台化的会话稍后恢复或重新启动时,Claude Code 恢复代理及其工具限制;对于其系统提示,参见 [System prompt flags in resumed conversations](/docs/zh-CN/cli-reference#system-prompt-flags-in-resumed-conversations)。它首先在会话自己的目录中搜索代理,前提是你已 [信任该工作区](/docs/zh-CN/permissions#project-allow-rules-and-workspace-trust),所以项目范围的代理在会话从另一个目录恢复时仍然加载。如果代理不再存在,会话继续使用默认工具,其记录以 [warning naming the agent](/docs/zh-CN/errors#session-agent-no-longer-available) 打开。

485 

486要在后台继续现有对话,用 `--resume` 传递其完整会话 ID:

487 

488```bash theme={null}

489claude --resume 1f0e2c9a-6d0b-4c11-9f39-2a77c1d4e8b5 --bg "pick up where you left off and finish the migration"

490```

491 

492在 Claude Code v2.1.257 或更高版本上,Claude Code 要么在相同 ID 下继续该会话,要么在新 ID 下启动副本并打印 `note:` 行解释为什么它无法就地继续。当会话就地继续时,`claude agents` 为其显示一行。

493 

494当你将 `--bg` 与 `--continue`、裸 `--resume` 或 `--resume` 与名称或文件路径结合时,Claude Code 总是启动这样的副本。添加 `--fork-session` 以有意启动副本,不带注释。

495 

410传递 `--name` 以在 agent view 中设置会话的显示名称而不是自动生成的名称:496传递 `--name` 以在 agent view 中设置会话的显示名称而不是自动生成的名称:

411 497 

412```bash theme={null}498```bash theme={null}


427 运行 shell 命令513 运行 shell 命令

428</h4>514</h4>

429 515 

430要运行 shell 命令作为后台作业而不是 Claude 会话,在 agent view 调度输入的第一个字符处输入 `!`。`!` 显示为前缀,你在它之后输入的所有内容都是命令。以下示例从 agent view 输入框调度 `pytest -x`:516要运行 shell 命令作为后台作业而不是 Claude 会话,传递 `--exec`。以下示例将 `pytest -x` 作为后台作业运行:

431 

432```text theme={null}

433! pytest -x

434```

435 

436按 `Enter` 启动作业。同一作业也可以直接从你的 shell 用 `--exec` 启动:

437 517 

438```bash theme={null}518```bash theme={null}

439claude --bg --exec 'pytest -x'519claude --bg --exec 'pytest -x'

440```520```

441 521 

522从 agent view,通过在调度输入的第一个字符处输入 `!` 调度相同类型的作业:`!` 显示为前缀,其后的所有内容都是命令,`Enter` 启动作业。

523 

442该命令作为 PTY 支持的作业运行,并在 agent view 中显示为一行,最近的输出行作为其状态。shell 作业运行命令代替 Claude,所以不调用任何模型,输出也不发送到任何会话。524该命令作为 PTY 支持的作业运行,并在 agent view 中显示为一行,最近的输出行作为其状态。shell 作业运行命令代替 Claude,所以不调用任何模型,输出也不发送到任何会话。

443 525 

444要查看输出,附加到该行,按 `Space` 以在不附加的情况下查看,或从你的 shell 运行 `claude logs <id>`。捕获的输出保留在内存中,不写入磁盘。该行及其输出在命令退出后约五分钟自动清理,所以如果你需要结果,请在那之前读取它。526要查看输出,附加到该行,按 `Space` 以在不附加的情况下查看,或从你的 shell 运行 `claude logs <id>`。捕获的输出保留在内存中,不写入磁盘。该行及其输出在命令退出后约五分钟自动清理,所以如果你需要结果,请在那之前读取它。


447 文件编辑如何隔离529 文件编辑如何隔离

448</h3>530</h3>

449 531 

450每个后台会话,无论是从 agent view、`/bg` 还是 `claude --bg` 启动,都在你的工作目录中启动。在编辑文件前,Claude 将会话移动到 `.claude/worktrees/` 下的隔离 [git worktree](/docs/zh-CN/worktrees) 中,所以并行会话可以读取相同的检出但每个都写入自己的。532每个后台会话,无论是从 agent view、`/bg` 还是 `claude --bg` 启动,都在你的工作目录中启动。在编辑文件前,Claude 将会话移动到 `.claude/worktrees/` 下的隔离 [git worktree](/docs/zh-CN/worktrees) 中,所以并行会话可以读取相同的检出但每个都写入自己的。一旦会话在其 worktree 中,Claude Code [enforces worktree isolation](/docs/zh-CN/worktrees#how-claude-code-enforces-isolation) 对会话和它生成的任何 subagents。

451 533 

452Claude 在以下情况下跳过 worktree:534Claude 在以下情况下跳过 worktree:

453 535 

454* 会话已经在链接的 git worktree 内,无论 Claude 是在 `.claude/worktrees/` 下创建的还是你用 `git worktree add` 在其他地方创建的536* 会话已经在链接的 git worktree 内,无论 Claude 是在 `.claude/worktrees/` 下创建的还是你用 `git worktree add` 在其他地方创建的

537* Claude 正在编辑的文件在链接的 git worktree 内,例如会话或其 subagent 用 `git worktree add` 创建的

455* 工作目录不是 git 存储库且没有配置 [`WorktreeCreate` hook](/docs/zh-CN/hooks#worktreecreate)538* 工作目录不是 git 存储库且没有配置 [`WorktreeCreate` hook](/docs/zh-CN/hooks#worktreecreate)

456* 写入在工作目录外539* 写入在工作目录外

457 540 

458要为 git worktree 不实用的存储库关闭 worktree 隔离,将 [`worktree.bgIsolation`](/docs/zh-CN/settings#worktree-settings) 设置为 `"none"`。后台会话随后直接编辑你的工作副本而不先移动到 worktree。将设置添加到项目的 `.claude/settings.json`:541要为 git worktrees 不实用的存储库关闭 worktree 隔离,将 [`worktree.bgIsolation`](/docs/zh-CN/settings-reference#worktree-bgisolation) 设置为 `"none"`。后台会话随后直接编辑你的工作副本而不先移动到 worktree。将设置添加到项目的 `.claude/settings.json`:

459 542 

460```json theme={null}543```json theme={null}

461{544{


467 550 

468在 git 存储库外,会话直接写入工作目录且彼此不隔离,所以避免调度编辑相同文件的并行会话。如果你使用不同的版本控制系统,配置一个 [`WorktreeCreate` hook](/docs/zh-CN/worktrees#non-git-version-control),Claude 会以与 git 相同的方式隔离编辑。551在 git 存储库外,会话直接写入工作目录且彼此不隔离,所以避免调度编辑相同文件的并行会话。如果你使用不同的版本控制系统,配置一个 [`WorktreeCreate` hook](/docs/zh-CN/worktrees#non-git-version-control),Claude 会以与 git 相同的方式隔离编辑。

469 552 

470当 hook 在不是 git 存储库的目录中失败时,会话跳过该目录的隔离并就地编辑工作目录。在 git 存储库内,写入保持被阻止,直到会话隔离。在 v2.1.203 之前,处于该状态的后台会话无法编辑任何文件:每次写入都被拒绝,直到它隔离,hook 永远无法隔离该目录。553当 hook 在不是 git 存储库的目录中失败时,Claude 跳过该目录的隔离并就地编辑工作目录。在 git 存储库内,Claude Code 阻止对共享检出的写入,直到 Claude 将会话移动到 worktree。

471 

472删除会话会删除或保留 Claude 为其创建的 worktree,取决于你如何删除它以及 worktree 包含的内容:

473 

474* 在 agent view 中用 `Ctrl+X` 两次删除会删除 worktree,包括任何未提交的更改,所以先提交你想保留的更改。

475* 从 shell 用 [`claude rm`](#manage-sessions-from-the-shell) 删除会保留有未提交更改的 worktree,以及其会话行。

476* 两种方式都不会删除有未推送到任何地方的提交的 worktree:worktree 会 [与其会话一起保留](#organize-the-list),输出会命名保留的路径和原因。

477* 你自己创建的 worktree 并在其中启动会话的,无论哪种方式都会保留在原地。

478 554 

479要找到会话的 worktree 路径,查看会话或附加并检查其工作目录。555要找到会话的 worktree 路径,查看会话或附加并检查其工作目录。

480 556 

481[subagent](/docs/zh-CN/sub-agents) 后台会话生成的继承会话的工作目录,所以其文件编辑落在会话的 worktree 中而不是你的工作副本。要给 subagent 其自己的单独 worktree,在其 frontmatter 中设置 [`isolation: worktree`](/docs/zh-CN/sub-agents#supported-frontmatter-fields) 或在生成它时传递 `isolation: "worktree"`。557[subagent](/docs/zh-CN/sub-agents) 后台会话生成的继承会话的工作目录,所以其文件编辑落在会话的 worktree 中而不是你的工作副本。要给 subagent 其自己的单独 worktree,在其 frontmatter 中设置 [`isolation: worktree`](/docs/zh-CN/sub-agents#supported-frontmatter-fields) 或在生成它时传递 `isolation: "worktree"`。

482 558 

483从 v2.1.198 开始,隔离其代码更改在 worktree 中的后台会话也会提交、推送其自己的分支,并打开草稿拉取请求而不停止询问。当拉取请求打开时,[`#N` 标签](#pull-request-status) 出现在其行上。它永远不会推送到 `main` 或 `master`,永远不会强制推送或合并,当你告诉它不要打开拉取请求或存储库没有远程时,它会跳过拉取请求。559当后台会话在 Claude 进入的 worktree 中进行了代码更改时,Claude Code 指示 Claude 在完成前保留工作,所以如果你删除会话及其 worktree,它会存活:

560 

561* **提交并推送**:Claude 无需询问即可提交,当存储库有远程时推送分支。

562* **草稿拉取请求**:当任务要求时 Claude 打开一个,[`#N` label](#pull-request-status) 出现在行上。

563* **永不**:推送到 `main` 或 `master`、强制推送和合并。

564* **你的 git 指令优先**:如果任务、`CLAUDE.md` 或 [memory](/docs/zh-CN/memory) 说你自己处理提交或推送,Claude 将 git 留给你。

484 565 

485编辑未自行隔离的检出的会话仍然会在提交或切换分支前询问。这适用于隔离设置为 `"none"` 时、worktree 移动失败时,或会话在已存在的 worktree 内启动时。566编辑未自行隔离的检出的会话仍然会在提交或切换分支前询问。这适用于隔离设置为 `"none"` 时、worktree 移动失败时,或会话在已存在的 worktree 内启动时。

486 567 

568无论任务如何,Claude 以报告结束作业,说明它做了什么以及工作在哪里:路径、分支、拉取请求或答案本身。

569 

570<h4 id="what-deleting-a-session-removes">

571 删除会话会移除什么

572</h4>

573 

574在 [agent view](#organize-the-list) 中用 `Ctrl+X` 两次或用 [`claude rm`](#manage-sessions-from-the-shell) 删除会话。除了下面保留的情况外,会话离开列表。其记录通过 `claude --resume` 保留在你的机器上,移除在监督者重新启动后存活。

575 

576Claude 为会话创建的 worktree 会发生什么:

577 

578* Agent view 删除它,包括未提交的更改,所以先提交你想保留的内容。

579* `claude rm` 当它有未提交的更改时保留它,以及会话行。

580* 当另一个运行中的会话正在使用或已锁定 worktree 时,agent view 和 `claude rm` 都不会删除它,再次删除不会改变这一点。Claude Code 保留 worktree 和会话,并命名保留的目录和原因;在 agent view 中,会话的行显示 `not deleted`。关闭另一个会话,然后再次删除。

581* 当你删除一个 worktree 有 Claude Code 无法确认保存在其他地方的提交的会话时,Claude Code 保留 worktree 和会话,消息命名 worktree 的分支和有多少未推送的提交。消息还提供两种前进方式:推送提交,或再次删除以丢弃它们。

582 

583 远程上的提交不会阻止删除。本地副本上的提交也不会,只要该分支在你的主检出(存储库目录本身而不是 worktree)中检出。

584 

585 在该拒绝后,你选择:

586 

587 * 要保留提交,推送它们或将它们合并到该默认分支,然后再次删除会话。

588 * 要丢弃它们,再次删除会话而不推送:在 agent view 中的其行上按 `Ctrl+X` 两次,或运行拒绝打印的 `claude rm <id> --discard-unpushed` 命令。这会删除会话和 worktree 以及其分支,丢弃未推送的提交和任何未提交的更改。

589 

590 当你再次删除时,Claude Code 仅丢弃拒绝显示的内容:如果 worktree 自那以后获得了提交,Claude Code 再次保留它并显示更新的状态。

591 

592 当另一个已完成会话的记录也命名 worktree 时,当你再次删除时它保留;推送提交,然后再次删除。

593* git 不再识别的 worktree,例如在 `git worktree prune` 后,不会阻止删除。Claude Code 删除会话并在磁盘上留下目录。

594* 当 git 或你的 [`WorktreeRemove` hook](/docs/zh-CN/hooks#worktreeremove) 无法删除 worktree 时,Claude Code 保留 worktree 和会话,消息命名原因。对于 hook,消息说它如何结束,例如 `exited 1`,并引用其 stderr 的开始。消息还告诉你接下来要做以下哪一个:

595 

596 * 再次删除会话以无论如何删除目录,在 agent view 中的其行上按 `Ctrl+X` 两次或运行 `claude rm` 拒绝打印的 `claude rm <id> --force-remove-worktree <worktree-id>` 命令。Claude Code 仅在它可以确认目录是存储库在 `.claude/worktrees/` 下的链接 worktrees 之一,没有对跟踪文件的未提交更改、其内没有嵌套存储库,没有其他会话的记录命名它时才提供此选项。worktree 的分支保留在存储库中。

597 * 修复阻碍的东西,例如提交或隐藏未提交的更改、关闭使用目录的任何东西或修复 hook,然后再次删除会话。

598 * 自己删除目录,然后再次删除会话。

599 

600你自己创建的 worktree 并在其中启动会话的,无论哪种方式都会保留在原地。

601 

602一个 worktree 目录不属于任何 git 存储库的会话,因为存储库被删除或 [`WorktreeCreate` hook](/docs/zh-CN/hooks#worktreecreate) 在其他地方创建了目录,仍然可以被删除。当文件保留在目录中时:

603 

604* Agent view 在丢弃它们前要求相同的 `Ctrl+X` 双按。对于 hook 创建的目录,它运行你的 [`WorktreeRemove` hook](/docs/zh-CN/hooks#worktreeremove),没有一个它拒绝删除并保留会话。

605* `claude rm` 保留会话和 worktree,并命名原因。

606 

607任一路径都保留另一个已完成会话的记录命名的目录。

608 

487<h3 id="set-the-model">609<h3 id="set-the-model">

488 设置模型610 设置模型

489</h3>611</h3>

490 612 

491agent view 标题中显示的模型名称是调度默认值。你从输入启动的新会话使用此模型,这来自你的用户设置中的 [`model` 设置](/docs/zh-CN/settings#available-settings)。通过在 [`/model` 选择器](/docs/zh-CN/model-config) 中选择模型来设置它,或直接编辑设置。613agent view 标题中显示的模型名称是调度默认值。你从输入启动的新会话使用此模型,这来自你的用户设置中的 [`model` 设置](/docs/zh-CN/settings-reference#model)。通过在 [`/model` 选择器](/docs/zh-CN/model-config) 中选择模型来设置它,或直接编辑设置。

492 614 

493要为整个 agent view 会话覆盖调度默认值,在打开 agent view 时传递 `--model`。参见 [权限模式、模型和工作量](#permission-mode-model-and-effort)。615要为整个 agent view 会话覆盖调度默认值,在打开 agent view 时传递 `--model`。参见 [Permission mode, model, and effort](#permission-mode-model-and-effort)。

494 616 

495要从 agent view 内部更改调度默认值,在调度输入中输入 `/model` 后跟模型名称并按 `Enter`。标题更新以显示该模型,带有 `(session)` 标记,之后调度的会话使用它。输入 `/model default` 以清除覆盖并返回调度默认值。此覆盖持续当前 `claude agents` 运行的其余部分,不写入你的设置文件。以下示例在 Opus 上调度一个会话,在 Sonnet 上调度下一个:617要从 agent view 内部更改调度默认值,在调度输入中输入 `/model` 后跟模型名称并按 `Enter`。标题更新以显示该模型,带有 `(session)` 标记,之后调度的会话使用它。输入 `/model default` 以清除覆盖并返回调度默认值。此覆盖持续当前 `claude agents` 运行的其余部分,不写入你的设置文件。以下示例在 Opus 上调度一个会话,在 Sonnet 上调度下一个:

496 618 


511 权限模式、模型和工作量633 权限模式、模型和工作量

512</h3>634</h3>

513 635 

514后台会话从它运行的目录读取其 [settings](/docs/zh-CN/settings),就像你在那里启动了 `claude` 一样。这包括项目设置中的 [`env` 值](/docs/zh-CN/settings#available-settings),所以在那里设置的 `ANTHROPIC_MODEL` 或提供商变量适用于该目录中的后台会话。636后台会话从它运行的位置和方式获取其设置、提供商、权限模式、模型和工作量。下面的小节涵盖每个来源,以及当监督者重新启动会话时什么持续。

637 

638<h4 id="settings-and-provider">

639 设置和提供商

640</h4>

641 

642后台会话从它运行的目录读取其 [settings](/docs/zh-CN/settings),就像你在那里启动了 `claude` 一样。这包括项目设置中的 [`env` 值](/docs/zh-CN/settings-reference#env),所以在那里设置的 `ANTHROPIC_MODEL` 或提供商变量适用于该目录中的每个后台会话。

643 

644后台会话也用你调度它的 shell 的 `PATH` 运行,所以它运行的命令找到与你的终端相同的工具。它也保留该 shell 的云提供商选择,例如 `CLAUDE_CODE_USE_BEDROCK` 或 `CLAUDE_CODE_USE_VERTEX`,以及其 `ANTHROPIC_DEFAULT_*_MODEL` 别名和任何 [`CLAUDE_CODE_EXTRA_BODY`](/docs/zh-CN/env-vars) 覆盖你在那里导出的。

645 

646<h4 id="llm-gateway">

647 LLM gateway

648</h4>

649 

650如果你通过 [LLM gateway](/docs/zh-CN/llm-gateway) 路由 Claude Code,将网关变量放在设置文件的 `env` 块中而不是在你的 shell 中导出它们,后台会话用其余设置读取它们。[Set in a settings file](/docs/zh-CN/llm-gateway-connect#set-in-a-settings-file) 显示块和要使用哪个设置文件用于凭证。

515 651 

516云提供商选择,如 `CLAUDE_CODE_USE_BEDROCK` 或 `CLAUDE_CODE_USE_VERTEX`,以及 `ANTHROPIC_DEFAULT_*_MODEL` 别名遵循调度会话的 shell。如果你在该 shell 中导出 [`CLAUDE_CODE_EXTRA_BODY`](/docs/zh-CN/env-vars) 请求体覆盖,它会以相同的方式到达会话。在 v2.1.206 之前,后台工作进程忽略了 shell 导出的 `CLAUDE_CODE_EXTRA_BODY`。652如果你仅在你的 shell 中导出网关 `ANTHROPIC_BASE_URL`,它到达后台会话,以及 `ANTHROPIC_CUSTOM_HEADERS` 和你与它导出的凭证,仅当 [supervisor](#the-supervisor-process) 本身从导出相同网关的 shell 启动时,仅在这些情况下:

517 653 

518如果你在调度 shell 中导出网关 `ANTHROPIC_BASE_URL`,它也会到达会话,以及 `ANTHROPIC_CUSTOM_HEADERS`,当监督者使用相同的网关环境运行且会话在你调度的目录中运行或是你自己的会话用 `←` 或 `/background` 后台化时。这是第一个 shell 打开 agent view 或调度后台会话时的正常情况,是网关 shell。用 `@repo` 或 `--cwd` 调度到不同目录不会携带 shell 的网关;该项目的 [settings](/docs/zh-CN/settings) 提供端点。参见 [监督者进程](#the-supervisor-process) 了解后台会话如何获取提供商设置和凭证。654* 你用 `←` 或 `/background` 后台化你自己的会话

655* 你调度一个会话到你所在的目录

656* 你通过附加或回复它唤醒你所在目录中的停止会话

519 657 

520[permission mode](/docs/zh-CN/permissions) 取决于你如何启动会话。用 `/bg` 或 `←` 后台化现有会话会保持当前权限模式,所以你切换到 `acceptEdits` 或 `auto` 的会话在分离后仍保持该模式。从 agent view 输入调度或从你的 shell 运行 `claude --bg` 使用该目录设置中的 `defaultMode`,或调度的 [subagent 的 frontmatter](/docs/zh-CN/sub-agents#supported-frontmatter-fields) 中的 `permissionMode`。658Claude Code 在云提供商前转发网关。如果你调度的 shell 选择提供商并用其 auth-bypass 标志导出其网关端点,Claude Code 在适用于 `ANTHROPIC_BASE_URL` 的条件下将端点和标志对转发到会话,以及 `ANTHROPIC_CUSTOM_HEADERS`。例如,导出 `CLAUDE_CODE_USE_VERTEX=1` 与 `ANTHROPIC_VERTEX_BASE_URL` 和 `CLAUDE_CODE_SKIP_VERTEX_AUTH=1`,Claude Code 转发该端点和标志。

521 659 

522后台会话启动时的权限模式、模型和工作量,以及它携带的 [配置标志](#from-inside-a-session),在监督者稍后 [停止并重新启动](#the-supervisor-process) 其进程时都会持续。你用 `claude --bg --dangerously-skip-permissions` 或 `claude --bg --permission-mode bypassPermissions` 启动的会话在该重新启动后仍保持 `bypassPermissions` 而不是回退到目录的 `defaultMode`,以及你在会话中期用 `/model` 或 `/effort` 更改的模型或工作量会被保留。660Claude Code 仅将转发的网关应用于该会话的运行进程,永远不会将其写入磁盘。

523 661 

524会话从 [`effortLevel` 设置](/docs/zh-CN/settings#available-settings) 而不是从 `--effort` 或 `/effort` 获取的工作量不会在调度时固定:为会话启动的每个进程都会再次读取设置,所以在 `settings.json` 中编辑 `effortLevel` 会到达你用 `←` 或 `/bg` 后台化的会话及其后续重新启动。在 v2.1.203 之前,后台化会话会记录其设置派生的工作量,就像你传递了 `--effort` 一样,所以后续的 `effortLevel` 编辑永远无法到达它。662<h4 id="permission-mode">

663 权限模式

664</h4>

665 

666[permission mode](/docs/zh-CN/permissions) 取决于你如何启动会话:

667 

668* **用 `/bg` 或 `←` 后台化**:Claude Code 保留会话所在的权限模式,所以你切换到 `acceptEdits` 或 `auto` 的会话在分离后仍保持该模式

669* **从你用 `←` 打开的 agent view 调度**:目标自己的配置优先,你来自的会话的权限模式在没有其他设置一个时适用

670* **从 shell 中启动的 `claude agents` 或用 `claude --bg` 调度**:新会话以新 `claude` 会话在该目录中的方式启动,除非你从用 [dispatch defaults](#dispatch-defaults) 打开的 agent view 调度它。[Which permission mode a session starts in](/docs/zh-CN/permission-modes#which-mode-a-session-starts-in) 列出顺序

671 

672对于你从用 `←` 打开的 agent view 调度的会话,Claude Code 从适用的第一个中获取权限模式:

673 

6741. 目标目录的 [`permissions.defaultMode`](/docs/zh-CN/settings-reference#permissions-defaultmode)。两个来源规则适用:

675 * `auto` 和 `bypassPermissions` [仅从托管设置、`--settings` 文件或 `~/.claude/settings.json` 生效](/docs/zh-CN/settings-reference#permissions-defaultmode)。

676 * Claude Code 拒绝来自项目的 `.claude/settings.json` 或 `.claude/settings.local.json` 的 `defaultMode`,该模式选择比你来自的会话所在的更宽松的模式。

6772. 你来自的会话的权限模式

525 678 

526你用 [`/rename`](/docs/zh-CN/commands) 或 `Ctrl+R` 设置的名称也会在该重新启动中持续,所以 [`claude --resume <name>`](/docs/zh-CN/sessions#name-your-sessions) 仍然解析会话。在 v2.1.202 之前,重新启动会将会话恢复为调度时的名称,新名称停止解析。679当 Claude Code 拒绝来源的模式太宽松时,列表中的下一个来源决定。例如,如果你从 plan-mode 会话调度到一个检入的设置要求 `acceptEdits` 的目录,新会话在 plan mode 中启动。如果你将该 `defaultMode` 移动到 `~/.claude/settings.json`,它无论你来自的会话的权限模式如何都适用。

680 

681宽松性运行 plan,然后 Manual 和 `dontAsk`,然后 `acceptEdits` 和 auto,它们彼此计为更宽松,然后 `bypassPermissions`。

682 

683<h4 id="dispatch-defaults">

684 调度默认值

685</h4>

527 686 

528要为从 agent view 调度的每个会话设置默认值,在打开它时传递 `--permission-mode`、`--model`、`--effort` 或 `--agent` 中的任何一个:687要为从 agent view 调度的每个会话设置默认值,在打开它时传递 `--permission-mode`、`--model`、`--effort` 或 `--agent` 中的任何一个:

529 688 


531claude agents --permission-mode plan --model opus --effort high690claude agents --permission-mode plan --model opus --effort high

532```691```

533 692 

534`--agent` 设置当调度提示未命名一个时使用的 [subagent](/docs/zh-CN/sub-agents),无论是用 `@name` 还是作为第一个单词。如果设置了一个,它默认为 [`agent` 设置](/docs/zh-CN/settings#available-settings),否则为内置的全能 `claude` 代理。在调度输入中命名 subagent 会覆盖两者。693`--effort` 这里接受与 [top-level `--effort` flag](/docs/zh-CN/cli-reference#cli-flags) 相同的值,包括 `ultracode`。

694 

695`--agent` 设置当调度提示未命名一个时使用的 [subagent](/docs/zh-CN/sub-agents),无论是用 `@name` 还是作为第一个单词。如果设置了一个,它默认为 [`agent` 设置](/docs/zh-CN/settings-reference#agent),否则为内置的全能 `claude` 代理。在调度输入中命名 subagent 会覆盖两者。

535 696 

536`claude agents` 也接受 `--dangerously-skip-permissions` 作为 `--permission-mode bypassPermissions` 的简写,以及 `--allow-dangerously-skip-permissions` 以在每个调度会话的 `Shift+Tab` 循环中使 `bypassPermissions` 可用而不带权限模式启动。两者都匹配 [顶级 CLI 标志](/docs/zh-CN/cli-reference)。697`claude agents` 也接受 `--dangerously-skip-permissions` 作为 `--permission-mode bypassPermissions` 的简写,以及 `--allow-dangerously-skip-permissions` 以在每个调度会话的 `Shift+Tab` 循环中使 `bypassPermissions` 可用而不带权限模式启动。两者都匹配 [top-level CLI flags](/docs/zh-CN/cli-reference)。

698 

699传递 `--restricted` 以在 [restricted mode](/docs/zh-CN/cli-reference#cli-flags) 中启动你从视图调度的每个会话,就像每个都用顶级 `--restricted` 标志启动一样。需要 Claude Code v2.1.248 或更高版本。

537 700 

538活跃的默认值出现在调度输入下方的页脚中。701活跃的默认值出现在调度输入下方的页脚中。

539 702 

540没有这些标志,会话使用该目录设置中的 `defaultMode` 或调度的 [subagent 的 frontmatter](/docs/zh-CN/sub-agents#supported-frontmatter-fields) 中的 `permissionMode`,以及 agent view 标题中显示的模型。703Claude Code 拒绝 `claude --bg --permission-mode bypassPermissions` 直到你通过交互式运行 `claude --dangerously-skip-permissions` 一次接受了绕过免责声明,因为该模式让你没有看到的会话无需批准就能行动。传递 `--dangerously-skip-permissions` 或 `--permission-mode bypassPermissions` 到 `claude agents` 在你之前没有接受它时显示相同的免责声明,接受会将 `bypassPermissions` 应用到你从视图启动的会话。传递 `--allow-dangerously-skip-permissions` 也显示相同的免责声明,接受会在这些会话的 `Shift+Tab` 循环中使 `bypassPermissions` 可用而不在其中启动它们。

704 

705<h4 id="what-persists-across-restarts">

706 重新启动时持续什么

707</h4>

708 

709你为后台会话选择的权限模式、模型和工作量,以及 [configuration flags it carries](#what-carries-over-when-you-background),在监督者稍后 [stops and restarts](#the-supervisor-process) 其进程时都会持续。你用 `claude --bg --dangerously-skip-permissions` 或 `claude --bg --permission-mode bypassPermissions` 启动的会话在该重新启动后仍保持 `bypassPermissions`。你在会话中期用 `/model` 或 `/effort` 更改的模型或工作量也被保留。

710 

711如果会话从你的设置而不是从 `--effort` 或 `/effort` 获取工作量,Claude Code 每次为会话启动进程时都会再次读取你的设置。所以当你在 `settings.json` 中编辑保存的工作量时,更改到达你用 `←` 或 `/bg` 后台化的会话及其后续重新启动。保存的工作量是 [`effortLevel`](/docs/zh-CN/settings-reference#effortlevel) 键或 [`modelSettings`](/docs/zh-CN/settings-reference#modelsettings) 条目。

541 712 

542使用 `bypassPermissions` 与 `claude --bg --permission-mode` 被拒绝,直到你通过交互式运行 `claude --dangerously-skip-permissions` 一次接受了绕过免责声明,因为该模式让你没有看到的会话无需批准就能行动。传递 `--dangerously-skip-permissions` 或 `--permission-mode bypassPermissions` 到 `claude agents` 在你之前没有接受它时显示相同的免责声明,接受会将 `bypassPermissions` 应用到你从视图启动的会话。传递 `--allow-dangerously-skip-permissions` 也显示相同的免责声明,接受会在这些会话的 `Shift+Tab` 循环中使 `bypassPermissions` 可用而不在其中启动它们。713Claude Code 也保留你用 [`/rename`](/docs/zh-CN/commands) 或 `Ctrl+R` 设置的名称在该重新启动中,所以你仍然可以运行 [`claude --resume <name>`](/docs/zh-CN/sessions#name-your-sessions) 以到达会话。

714 

715你在附加时用 [`Ctrl+S`](/docs/zh-CN/interactive-mode#general-controls) 隐藏的提示也与会话一起保留。在其进程被停止或重新启动后重新打开会话,`Ctrl+S` 恢复隐藏的文本。隐藏中的粘贴内容不会在重新启动中存活。

543 716 

544<h3 id="settings-plugins-and-mcp-servers">717<h3 id="settings-plugins-and-mcp-servers">

545 Settings、plugins 和 MCP servers718 Settings、plugins 和 MCP servers

546</h3>719</h3>

547 720 

548Agent view 接受与 `claude` 相同的配置标志以加载 settings、plugins、MCP servers 和额外目录。每个标志适用于 agent view 本身,并传递给你从它调度的每个会话,所以以这种方式加载的 plugin 或 MCP server 在这些会话中也可用。721Agent view 接受与 `claude` 相同的配置标志以加载 settings、plugins、MCP servers 和额外目录。Agent view 将 `--settings` 和 `--plugin-dir` 应用于自己,并将每个配置标志传递给你从它调度的会话,所以以这种方式加载的 plugin 或 MCP server 在这些会话中也可用。

549 722 

550| 标志 | 效果 |723| 标志 | 效果 |

551| :-------------------------------------------------------------------------------------------------- | :--------------------------------------------- |724| :-------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

552| [`--settings <file-or-json>`](/docs/zh-CN/settings) | 覆盖 agent view 和调度会话的 settings |725| [`--settings <file-or-json>`](/docs/zh-CN/settings) | 覆盖 agent view 和调度会话的 settings |

553| [`--add-dir <path>`](/docs/zh-CN/permissions#additional-directories-grant-file-access-not-configuration) | 授予对额外目录的文件访问权限 |726| [`--add-dir <path>`](/docs/zh-CN/permissions#additional-directories-grant-file-access-not-configuration) | 授予对额外目录的文件访问权限 |

554| [`--plugin-dir <path>`](/docs/zh-CN/plugins) | 从本地目录加载 plugin |727| [`--plugin-dir <path>`](/docs/zh-CN/plugins) | 从本地目录加载 plugin |

555| [`--mcp-config <file-or-json>`](/docs/zh-CN/mcp) | 从配置文件或 JSON 字符串加载 MCP servers |728| [`--mcp-config <file-or-json>`](/docs/zh-CN/mcp) | 从配置文件或 JSON 字符串加载 MCP servers |

556| `--strict-mcp-config` | 仅使用来自 `--mcp-config` 的 MCP servers,忽略其他 MCP 配置 |729| `--strict-mcp-config` | 仅使用来自 `--mcp-config` 的 MCP servers,忽略其他 MCP 配置。参见 [Exclusive control with managed-mcp.json](/docs/zh-CN/managed-mcp#exclusive-control-with-managed-mcp-json) 了解该标志在托管 MCP 文件下做什么 |

730 

731对每个值重复 `--add-dir`、`--plugin-dir` 或 `--mcp-config`。`claude agents` 不支持空格分隔的形式,例如 `--add-dir a b c`。

557 732 

558对每个值重复 `--add-dir`、`--plugin-dir` 或 `--mcp-config`。空格分隔的形式,如 `--add-dir a b c`,不支持与 `claude agents` 一起使用。733你可以将 `--settings` 和 `--plugin-dir` 放在 `agents` 之前或之后。将 `--add-dir` 和 `--mcp-config` 放在 `agents` 之后:如果你将其中任何一个放在 `agents` 之前,[`claude agents --json`](#manage-sessions-from-the-shell) 失败并显示 `unknown option` 错误。

559 734 

560以下示例使用 settings 覆盖和一个额外目录打开 agent view:735以下示例使用 settings 覆盖和一个额外目录打开 agent view:

561 736 


563claude agents --settings ./ci-settings.json --add-dir ../shared-lib738claude agents --settings ./ci-settings.json --add-dir ../shared-lib

564```739```

565 740 

741`--settings` 接受文件路径或内联 JSON 字符串。文件路径必须指向现有文件;如果不存在,Claude Code 以 `Settings file not found` 错误退出。

742 

566<h2 id="manage-sessions-from-the-shell">743<h2 id="manage-sessions-from-the-shell">

567 从 shell 管理会话744 从 shell 管理会话

568</h2>745</h2>


570每个后台会话有一个短 ID,你可以从 shell 使用。当你使用 `claude --bg` 启动会话时会打印该 ID,每个会话的 ID 是其在 `~/.claude/jobs/` 下的目录名。这些命令对于脚本编写或当你不想打开 agent view 时很有用。747每个后台会话有一个短 ID,你可以从 shell 使用。当你使用 `claude --bg` 启动会话时会打印该 ID,每个会话的 ID 是其在 `~/.claude/jobs/` 下的目录名。这些命令对于脚本编写或当你不想打开 agent view 时很有用。

571 748 

572| 命令 | 目的 |749| 命令 | 目的 |

573| :--------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |750| :--------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

574| `claude agents` | 打开 agent view |751| `claude agents` | 打开 agent view |

575| `claude agents --cwd <path>` | 打开 agent view,范围限定为在 `<path>` 下启动的会话 |752| `claude agents --cwd <path>` | 打开 agent view,范围限定为在 `<path>` 下启动的会话 |

576| `claude agents --json` | 将活跃会话打印为 JSON 数组并退出:每个活跃会话,加上仍在工作或被阻止的后台会话,即使其进程已退出。添加 `--all` 以也包括已完成的后台会话。每个条目都有 `cwd`、`kind` 和 `startedAt`。后台条目还有 `id`,可与 `claude attach`/`logs`/`stop` 一起使用,以及 `state`:`working`、`blocked`、`done`、`failed` 或 `stopped` 之一。`pid` 和 `status` 仅在进程活跃时出现,当 status 为 `waiting` 时出现 `waitingFor`,说明会话被阻止的原因,例如 `permission prompt` 或 `input needed`;当设置时出现 `sessionId` 和 `name`。与 `--cwd <path>` 结合使用以进行过滤 |753| `claude agents --json` | 将会话打印为 JSON 数组并退出。参见 [将会话列为 JSON](#list-sessions-as-json) |

577| `claude attach <id>` | 在此终端附加到会话 |754| `claude attach <id>` | 在此终端附加到会话 |

578| `claude logs <id>` | 打印会话的最近输出 |755| `claude logs <id>` | 打印会话的最近输出 |

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

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

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

582| `claude rm <id>` | 从列表中删除会话。如果没有未提交的更改和没有未推送的提交,会删除 Claude 为会话创建的 worktree;否则会话也会被保留,命令会打印 worktree 路径和原因,以便你可以解决它并再次运行 `claude rm`。保留你自己创建的 worktree。对话记录保存在你的本地机器上,并且仍然可以通过 `claude --resume` 访问 |759| `claude rm <id>` | 从列表中删除会话,以及 Claude 为其创建的 worktree(当安全删除时);参见 [删除会话会删除什么](#what-deleting-a-session-removes)。对话记录保存在你的本地机器上,并且仍然可以通过 `claude --resume` 访问 |

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

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

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

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

585 764 

586<h2 id="how-background-sessions-are-hosted">765<h3 id="list-sessions-as-json">

587 后台会话如何被托管766 将会话列为 JSON

588</h2>

589 

590agent view 中列出的每个会话都被视为后台会话,无论你当前是否连接到它。相比之下,通过直接运行 `claude` 启动的会话与该终端绑定,并在终端关闭时结束,除非你[将其发送到后台](#from-inside-a-session)。

591 

592<h3 id="the-supervisor-process">

593 监督进程

594</h3>767</h3>

595 768 

596后台会话由每用户监督进程托管,与你的终端和 agent view 分离。监督进程在你第一次后台会话或打开 agent view 时自动启动,你不直接管理它。769`claude agents --json` 将活跃会话打印为 JSON 数组并退出:每个活跃会话,加上仍在工作或被阻止的后台会话,即使其进程已退出。添加 `--all` 以也包括已完成的后台会话,添加 `--cwd <path>` 以将列表限制为在该目录下启动的会话。

597 

598当更新替换或移除了运行中的 Claude Code 进程启动时所用的二进制文件时,该进程会从另一个已安装的副本(如已安装的 `claude` 启动器或磁盘上的最新版本)启动监督进程。

599 

600监督进程保持一个预热的工作进程就绪,以便从 agent view 或 `claude --bg` 的调度启动时不会有冷启动的延迟。当你调度时,监督进程将预热的工作进程分配给你的会话,将该会话的目录、设置和凭证应用到它,然后为下一次调度启动一个替代进程。如果没有可用的健康预热工作进程,监督进程会改为启动一个新进程。

601 770 

602监督进程及其会话使用与你的交互式会话相同的凭证进行身份验证,并且除了模型 API 外不进行额外的网络连接。提供商选择变量如 `CLAUDE_CODE_USE_BEDROCK` 和 `ANTHROPIC_DEFAULT_*_MODEL` 别名从调度每个会话的 shell 中读取,并应用到其工作进程。771每个条目描述一个会话:

603 772 

604调度 shell 的 `PATH` 以相同的方式应用到工作进程,因此会话运行的 shell 命令会找到你的终端所拥有的相同工具。在 v2.1.203 之前,后台会话保持启动监督进程的 shell 的 `PATH`,因此自那时以来添加到你的 `PATH` 的工具可能会丢失,最常见的是在 Windows 上。773| 字段 | 出现时机 | 描述 |

774| :----------------------- | :----------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------- |

775| `cwd`、`kind`、`startedAt` | 总是 | 工作目录、`interactive` 或 `background`,以及 Unix 毫秒为单位的启动时间 |

776| `id` | 后台会话 | 短 ID,可与 `claude attach`、`claude logs` 和 `claude stop` 一起使用 |

777| `state` | 后台会话 | `working`、`blocked`、`done`、`failed` 或 `stopped` 之一。参见 [从脚本读取会话状态](#read-session-state-from-a-script) 了解每个值的含义 |

778| `pid`、`status` | 进程活跃时 | 进程 ID 和 `busy`、`waiting` 或 `idle` 之一 |

779| `waitingFor` | 当 `status` 为 `waiting` 时 | 会话被阻止的原因:`permission prompt` 表示需要批准,`input needed` 表示来自 Claude 或 MCP 服务器的输入请求的问题,`sandbox request`、`worker request` 或 `dialog open` |

780| `sessionId`、`name` | 当设置时 | `sessionId` 是完整的会话 UUID,可与 [`claude --resume`](/docs/zh-CN/sessions) 一起使用。交互式会话的 `name` 是其 [默认显示名称](/docs/zh-CN/sessions#name-your-sessions),直到你命名会话或在其中接受计划 |

605 781 

606后台会话不继承网关端点变量如 `ANTHROPIC_BASE_URL` 或等效的 Amazon Bedrock、Google Cloud 的 Agent Platform 和 Microsoft Foundry 基础 URL 变量,这些变量来自启动监督进程的 shell。如果没有在你调度的 shell 中导出网关,会话会使用你的存储凭证和项目目录的[设置](/docs/zh-CN/settings)中 `env` 块中的任何 `env` 值。要在项目中指向[LLM 网关](/docs/zh-CN/llm-gateway)的每个会话,在该项目的 `.claude/settings.json` `env` 块中设置 `ANTHROPIC_BASE_URL`。782<h3 id="read-session-state-from-a-script">

607 783 从脚本读取会话状态

608如果你在调度的 shell 中导出网关 `ANTHROPIC_BASE_URL`,它会到达该会话的工作进程。`ANTHROPIC_CUSTOM_HEADERS` 和与它们一起导出的凭证会随之转发。这发生在监督进程从具有相同网关的环境启动时。监督进程从打开 agent view 或调度后台会话的第一个 shell 中捕获其环境,因此从网关 shell 启动会给它该环境。转发也仅适用于调度到你调度的目录中的会话,或从你自己的会话用 `←` 或 `/background` 后台化的会话:用 `@repo` 或 `--cwd` 调度到不同目录不会携带 shell 的网关,该项目的 `settings.json` `env` 块会改为提供端点。当监督进程的环境携带不同的网关或没有网关时,工作进程会针对默认端点保持你的存储凭证,而不是混合一个环境的凭证与另一个环境的端点。在 v2.1.203 之前,调度 shell 的 `ANTHROPIC_BASE_URL` 被丢弃,而与它一起导出的 `ANTHROPIC_API_KEY` 被保留,因此网关的密钥被发送到默认端点,每个请求都以 401 失败。784</h3>

609 

610转发的端点仅适用于该活跃进程,永远不会写入磁盘。当监督进程停止空闲会话并稍后重新启动它时,重新启动的进程会从你的设置中再次读取其端点:使用网关 `ANTHROPIC_AUTH_TOKEN` 它会回退到你的存储凭证,使用网关颁发的 `ANTHROPIC_API_KEY` 它可能会失败进行身份验证,直到网关在设置中设置。

611 

612每个后台会话是其自己的 Claude Code 进程,由监督进程管理而不是与你的终端绑定。积极工作、等待你的输入或有终端连接的会话保持其进程运行。运行中的后台 shell 命令、子代理、动态工作流或监视器计为活跃工作,因此长时间运行的进程(如开发服务器)会保持会话活跃。

613 785 

614一旦会话完成并未连接地坐了大约一小时,监督进程停止其进程以释放资源。你用 `Ctrl+T` [固定](#organize-the-list)的会话是例外,在空闲时保持其进程运行。无论哪种方式,记录和状态都保留在磁盘上,下次你附加、窥视或回复停止的会话时,监督进程从中断处启动一个新进程。当每个会话都完成且没有终端连接时,监督进程本身退出,下次你需要它时再次启动。786`claude agents --json` 是从 Claude Code 外部读取会话状态的受支持方式,例如从状态栏、调度程序或监督后台工作的另一个 Claude 会话。轮询 `claude agents --json --all`,它会继续列出进程已退出的会话,并读取每个条目的 `state`、`status` 和 `waitingFor`。

615 787 

616会话在其进程被停止、重新启动或更新时启动的后台工作会被交付,包括在 Windows 上。为该会话启动的下一个进程会接管这项工作:788| `state` | 含义 |

789| :----------------- | :---------------------------------------------------------------------------------------------------- |

790| `working` | 一个回合正在运行,或会话在其自己驱动的工作步骤之间,例如 [`/loop`](/docs/zh-CN/scheduled-tasks) 迭代或对 CI 的等待。`status` 告诉你其进程现在是否 `busy` |

791| `blocked` | 会话在等待你:它提出的问题、权限或沙箱决定、只有你能清除的错误(例如过期的登录),或如果你在没有提示的情况下启动它,则为其第一个提示。当等待是活跃进程中的开放提示时,`waitingFor` 会命名它 |

792| `done` | 最后一个回合完成了你要求的内容,会话已准备好接收你的下一个提示,无论其进程是否仍然活跃 |

793| `failed`、`stopped` | 任务以错误结束,或会话被停止 |

617 794 

618* 在此期间完成的后台 shell 命令会报告为已完成及其输出795完成其回合并等待你的下一条指令的会话读取 `done`,而不是 `blocked`。`blocked` 总是意味着会话在继续之前需要你提供的东西。

619* 动态工作流从中断处恢复

620* [后台子代理](/docs/zh-CN/sub-agents#run-subagents-in-foreground-or-background)从其自己的记录恢复

621 796 

622从 v2.1.198 起,交付涵盖所有三项。在 v2.1.198 之前,它仅涵盖 shell 命令和工作流,因此后台子代理会随进程停止,并在下次唤醒时报告为失败。797`~/.claude/jobs/<id>/` 下的文件不是稳定的接口。会话或其他程序写入 `state`、`detail`、`tempo` 或 `needs` 的值会在下一次更新时被替换。

623 798 

624其状态仅存在于进程内部的工作会随之停止而不是被交付。那是子代理启动的 shell 命令,恢复的子代理可以再次启动,以及运行中的[监视器](/docs/zh-CN/tools-reference#monitor-tool),其事件流无法移动到另一个进程。799如果你想让会话用自己的话报告进度,让它写一个自己的文件,例如在 `$CLAUDE_JOB_DIR/tmp` 下,而不是编辑 `state.json`。

625 800 

626删除会话会停止它交付的所有内容。要让会话的所有后台工作随进程停止而不是被交付,将 [`CLAUDE_CODE_DISABLE_BG_EXIT_HANDOFF`](/docs/zh-CN/env-vars#variables) 环境变量设置为 `1`。801<h2 id="how-background-sessions-are-hosted">

802 后台会话如何被托管

803</h2>

627 804 

628重新启动的进程会找到[移入 worktree](#how-file-edits-are-isolated) 的会话的对话,该会话在任务中途移动:当记录不在会话启动的位置时,Claude Code 也会在存储库的已注册 worktree 下查找。在 v2.1.207 之前,在其进程停止后从 agent view 重新打开该会话可能会显示仅包含其原始提示的空对话,记录仍完整地保留在磁盘上;在 v2.1.207 或更高版本上再次打开会话会恢复它。805Claude Code 将 agent view 中列出的每个会话都视为后台会话,无论你当前是否连接到它。相比之下,通过直接运行 `claude` 启动的会话与该终端绑定,并在终端关闭时结束,除非你[将其发送到后台](#from-inside-a-session)。

629 806 

630如果重新启动的会话回来时仅显示其原始提示,因为 Claude Code 误读了其记录为空,对话记录会被重命名为 `.orphaned-` 后缀而不是删除,所以它保留在你的机器上。807要检查你所在的会话类型,请运行 [`/status`](/docs/zh-CN/commands)。在后台会话中,`Session kind` 行显示 `background job · attached` 或 `background job · unattended`,具体取决于是否连接了终端,在任何其他会话中显示 `interactive`。

631 808 

632从按 `←` 留下的空行从未给出提示符会在大约五分钟后被完全删除,以便列表自动清理。使用 `claude --bg` 启动的会话和等待设置提示符(如信任对话)的会话不会以这种方式被删除。809<h3 id="the-supervisor-process">

810 监督进程

811</h3>

633 812 

634当主机内存不足时,监督进程首先停止空闲的非固定会话,仅在释放任何内容时才停止空闲的固定会话。813监督进程是一个后台服务,运行你的后台会话,使其在你关闭 agent view 或终端后继续工作。Claude Code 在你第一次后台化会话或打开 agent view 时启动它,你不需要自己管理它。

635 814 

636监督进程监视磁盘上安装的 Claude Code 二进制文件,在常规[自动更新程序](/docs/zh-CN/setup#auto-updates)替换它后重新启动到新版本。这是本地文件监视,不是网络检查。后台会话是分离的进程,所以它们在重新启动期间继续运行,新的监督进程重新连接到它们。空闲的固定会话也会在原地重新启动到新版本,以便它获取更新而无需你重新附加。815每个会话都是监督进程下的自己的 Claude Code 进程,该进程发生的情况取决于会话的状态:

637 816 

638一旦新的监督进程接管,它也会将剩余的空闲会话重新启动到新版本,在后台一次几个,在短暂延迟后,让在重新启动期间连接的终端首先重新连接。积极工作、等待你的输入或有终端连接的会话不会被中断;它在其进程下次重新启动时移动到新版本。在 v2.1.206 之前,监督进程每分钟仅将几个空闲会话移动到新版本,因此会话可能在更新后继续运行旧版本一段时间。817* **工作中、暂停在权限提示或其他对话上,或已连接**:进程继续运行。运行中的子代理、工作流或监视器计为工作中。

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

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

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

639 821 

640这些重新启动仅将会话移动到较新版本。运行比会话进程启动时所用版本更旧的 Claude Code 版本的监督进程会单独保留该进程;会话继续运行较新版本,直到较新的监督进程接管。822当会话的进程停止或重新启动时,Claude 在其中启动的后台 shell 命令、动态工作流和后台子代理会转移到其下一个进程;运行中的监视器和子代理启动的 shell 命令会随进程停止。删除会话会停止它转移的所有内容。要改为让所有内容随进程停止而不是转移,请将 [`CLAUDE_CODE_DISABLE_BG_EXIT_HANDOFF`](/docs/zh-CN/env-vars#variables) 设置为 `1`。

641 823 

642在监督进程重新启动会话时运行 `claude attach`,无论是为了更新、停滞还是迁移,会等待替换进程而不是失败。状态行如 `Agent is updating to the new Claude Code…` 会命名它正在等待的内容并计算经过的秒数,命令在会话准备好后立即连接。大约 60 秒后它停止等待并报告错误。在 v2.1.205 之前,`claude attach` 在几秒后停止重试并在会话仍在重新启动时打印错误。824监督进程及其会话使用与你的交互式会话相同的存储凭证进行身份验证。关于哪些设置和 shell 变量到达会话(包括 `PATH`),请参阅[设置和提供商](#settings-and-provider)。关于网关端点,请参阅 [LLM 网关](#llm-gateway)。

643 825 

644<h3 id="where-state-is-stored">826<h3 id="where-state-is-stored">

645 状态存储位置827 状态存储位置

646</h3>828</h3>

647 829 

648会话状态存储在你的 Claude Code 配置目录下。如果你设置了 [`CLAUDE_CONFIG_DIR`](/docs/zh-CN/env-vars),监督进程使用该目录而不是 `~/.claude` 并作为单独的实例运行,具有其自己的会话。830会话状态存储在你的 Claude Code 配置目录下。如果你设置了 [`CLAUDE_CONFIG_DIR`](/docs/zh-CN/env-vars),监督进程使用该目录而不是 `~/.claude`,并作为单独的实例运行,具有其自己的会话。

649 831 

650| 路径 | 内容 |832| 路径 | 内容 |

651| :------------------------------- | :------------------------- |833| :------------------------------- | :------------------------------------------------------------------------------------------------ |

652| `~/.claude/daemon.log` | 监督进程日志 |834| `~/.claude/daemon.log` | 监督进程日志 |

653| `~/.claude/daemon/roster.json` | 运行中的后台会话列表,用于在重新启动后重新连接 |835| `~/.claude/daemon/roster.json` | 运行中的后台会话列表,用于在重新启动后重新连接 |

654| `~/.claude/jobs/<id>/state.json` | 在 agent view 中显示的每会话状态 |836| `~/.claude/jobs/<id>/state.json` | 在 agent view 中显示的每会话状态。通过 [`claude agents --json`](#read-session-state-from-a-script) 读取它,而不是解析文件 |

655| `~/.claude/jobs/<id>/tmp/` | 每会话临时目录。写入此处不会提示权限。会话删除时移除 |837| `~/.claude/jobs/<id>/tmp/` | 每会话临时目录。Claude 的 `Write` 和 `Edit` 调用此处不会提示权限。会话删除时移除 |

656 838 

657每个后台会话都设置了 `CLAUDE_JOB_DIR` 环境变量指向其 `~/.claude/jobs/<id>` 目录,因此会话运行的 shell 命令可以将临时文件写入 `$CLAUDE_JOB_DIR/tmp` 而不会与并行会话冲突。839每个后台会话都设置了 `CLAUDE_JOB_DIR` 环境变量指向其 `~/.claude/jobs/<id>` 目录,因此会话运行的 shell 命令可以将临时文件写入 `$CLAUDE_JOB_DIR/tmp` 而不会与并行会话冲突。

658 840 


660 842 

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

662 844 

663会话完整地保留该版本不匹配:更新会话 `state.json` 的较旧 Claude Code 版本会保留它不识别的字段并保持会话列出。`roster.json` 中的会话列表遵循相同的规则:重写它的较旧版本会保留较新版本写入的字段,因此由较新版本启动的会话保持可达并在监督进程重新启动后继续接受输入。在 v2.1.200 之前,较旧版本可能会在重写时删除这些字段。845会话完整地保留该版本不匹配:更新会话 `state.json` 的较旧 Claude Code 版本会保留它不识别的字段并保持会话列出。`roster.json` 中的会话列表遵循相同的规则,因此由较新版本启动的会话保持可达并在监督进程重新启动后继续接受输入。

664 

665在 Windows 上,当守护进程的管道密钥文件被锁定或无法读取时,`claude daemon status` 会显示底层文件错误,而不是报告通用连接失败。

666 846 

667<h3 id="turn-off-agent-view">847<h3 id="turn-off-agent-view">

668 关闭 agent view848 关闭 agent view

669</h3>849</h3>

670 850 

671要完全关闭后台代理和 agent view,将 `disableAgentView` [设置](/docs/zh-CN/settings)设为 `true` 或设置 `CLAUDE_CODE_DISABLE_AGENT_VIEW` 环境变量。管理员可以通过[托管设置](/docs/zh-CN/permissions#managed-settings)强制执行这个。851要完全关闭后台代理和 agent view,将 `disableAgentView` [设置](/docs/zh-CN/settings)设为 `true` 或设置 `CLAUDE_CODE_DISABLE_AGENT_VIEW` 环境变量。管理员可以通过[托管设置](/docs/zh-CN/managed-settings)强制执行这个。

672 852 

673<h2 id="troubleshooting">853<h2 id="troubleshooting">

674 故障排除854 Troubleshooting

675</h2>855</h2>

676 856 

677<h3 id="claude-agents-lists-subagents-instead-of-opening-agent-view">857<h3 id="claude-agents-lists-subagents-instead-of-opening-agent-view">

678 `claude agents` 列出子代理而不是打开代理视图858 `claude agents` 列出子代理而不是打开代理视图

679</h3>859</h3>

680 860 

681如果 `claude agents` 打印一个计数,然后是你配置的子代理,然后退出,说明代理视图在你的环境中不可用。运行 `claude update` 来安装最新版本。861如果 `claude agents` 打印一个计数,然后是您配置的子代理,然后退出,说明代理视图在您的环境中不可用。运行 `claude update` 来安装最新版本。

682 862 

683如果更新后代理视图仍然没有打开,检查它是否已被设置或环境变量[关闭](#turn-off-agent-view)。863如果更新后代理视图仍然没有打开,请检查它是否已被设置或环境变量[关闭](#turn-off-agent-view)。

684 864 

685<h3 id="agent-view-opens-with-no-sessions">865<h3 id="agent-view-opens-with-no-sessions">

686 Agent view 打开时没有会话866 代理视图打开时没有会话

687</h3>867</h3>

688 868 

689在你调度你的第一个会话之前,agent view 显示空的部分标题,每个标题下有一个描述,以及输入上方的单行说明,代替会话列表。在底部的输入框中输入提示并按 `Enter` 来调度你的第一个会话。869在您分派第一个会话之前,代理视图显示空的部分标题,每个标题下有一个描述,以及在输入上方有一行说明,代替会话列表。在底部的输入中输入提示,然后按 `Enter` 来分派您的第一个会话。

690 870 

691<h3 id="backgrounding-shows-a-background-this-session-dialog">871<h3 id="backgrounding-shows-a-background-this-session-dialog">

692 后台化显示 `Background this session?` 对话872 后台处理显示 `Background this session?` 对话框

693</h3>873</h3>

694 874 

695如果按 `←` 来后台当前会话显示 `Background this session?` 对话,会话有进行中的工作无法转移到后台会话,例如运行中的 [monitor](/docs/zh-CN/tools-reference#monitor-tool),Claude Code 不会默默停止它。对话命名将被停止的工作,并分别计算转移的任务。运行 `/tasks` 查看正在运行的内容,然后确认无论如何后台或选择 `Stay` 让工作先完成。参见[从会话内部](#from-inside-a-session)了解哪些任务类型转移,哪些被停止。875如果您按 `←` 来后台处理当前会话,而 Claude Code 显示 `Background this session?` 对话框,说明该会话有正在进行的工作,后台处理会停止、重新启动或让其无人值守地运行,Claude Code 在执行这些操作之前会询问:

876 

877* **无法移动的工作**:该会话有无法移动到后台会话的工作,例如正在运行的[监视器](/docs/zh-CN/tools-reference#monitor-tool)。对话框命名 Claude Code 会停止的工作,并分别计算转移的任务数。

878* **具有运行子代理的工作流**:[动态工作流](/docs/zh-CN/workflows)仍然有子代理在运行。工作流本身会转移,但其运行的子代理从头开始重新启动,对话框会说明有多少个。

879* **自动工件回复**:Claude [自动回复工件上的评论](/docs/zh-CN/artifacts#let-claude-reply-to-comments-on-its-own)。这些回复在后台会话中继续,对话框会说明这一点。

880 

881运行 `/tasks` 来查看正在运行的所有内容,然后确认后台处理或选择 `Stay` 来让工作先完成。请参阅[后台处理时转移的内容](#what-carries-over-when-you-background),了解哪些类型的工作会转移,哪些 Claude Code 会停止。

696 882 

697<h3 id="prompt-rejected-as-too-short">883<h3 id="prompt-rejected-as-too-short">

698 提示被拒绝,因为太短884 提示被拒绝为过短

699</h3>885</h3>

700 886 

701调度输入期望一个任务描述,而不是对话开场白。少于四个字符的提示会被拒绝,并显示 `Too short` 提示,这样随意的按键就不会启动会话。描述你希望会话执行的操作,例如 `investigate the flaky checkout test`。887分派输入期望一个任务描述,而不是对话开场白。短于四个字符的提示会被拒绝,并显示 `Too short` 提示,以防止误触发启动会话。描述您希望会话执行的操作,例如 `investigate the flaky checkout test`。

702 888 

703<h3 id="sessions-show-as-failed-after-shutdown">889<h3 id="sessions-show-as-failed-after-shutdown">

704 会话在关闭后显示为已失败890 会话在关闭后显示为失败或已停止

705</h3>891</h3>

706 892 

707关闭或重启你的机器会停止运行中的后台会话,所以当你下次打开 agent view 时,它们显示为已失败。附加、窥视或回复任何已失败的会话,会话从中断处重新启动。893关闭或重新启动您的机器会停止运行的后台会话。等待您输入的会话在您返回时仍会显示在 `Needs input` 下。对于任何其他运行的会话,代理视图显示的内容取决于它上次取得进展的时间:

894 

895* 在 48 小时内,会话显示为失败。附加或回复它,它会从中断的地方重新启动。

896* 超过 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>` 会在没有该页脚提示的情况下恢复它。

708 897 

709睡眠单独不会导致这种情况。会话在睡眠期间被保留,监督进程在唤醒时重新连接到它们。898当[转录清理](/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)。

899 

900仅睡眠不会停止会话。会话在睡眠中被保留,主管在唤醒时重新连接到它们。

710 901 

711<h3 id="opening-a-session-says-the-conversation-is-already-open">902<h3 id="opening-a-session-says-the-conversation-is-already-open">

712 打开会话说对话已经打开903 打开会话说对话已经打开

713</h3>904</h3>

714 905 

715打开一个已停止的行,其对话也由另一个运行中的非交互式 Claude Code 进程持有,例如同一对话的后台工作进程仍在关闭中,会显示 `This conversation is already open in another running Claude session` 而不是启动该行的进程,因为两个进程无法写入同一个记录。在已经持有对话的会话中回复,或退出它并再次打开该行。你在拒绝尝试中输入的回复不会丢失;它会在会话下次启动时发送。906两个进程不能写入同一个转录。当已停止会话的保存对话已在另一个活跃的 Claude Code 进程中打开时,Claude Code 拒绝启动该会话自己的进程。您看到的内容取决于什么持有对话:

907 

908* 您恢复对话的终端,例如使用 `claude --resume` 或 `/resume`:该行显示 `Open in a terminal`,并提示在那里继续,打开该行显示 `Can't open — this session is running in another terminal`。在该终端中继续,或退出它并再次打开该行。

909* 另一个非交互式 Claude Code 进程,例如同一对话的后台会话进程,尚未退出:打开该行显示 `This conversation is already open in another running Claude session`。使用该进程,或等待它退出并再次打开该行。

716 910 

717在 v2.1.203 之前,这种状态会启动第二个进程。该进程会以 `currently running as a background agent` 错误退出,该行显示为已失败。911Claude Code 保存您在拒绝的尝试中输入的回复,并在会话下次启动时发送它。

912 

913<h3 id="opening-a-session-says-it-has-no-saved-transcript">

914 打开会话说它没有保存的转录

915</h3>

916 

917已停止的会话[从另一个对话后台处理](#from-inside-a-session)并在其第一个响应完成之前停止,没有任何可恢复的内容:在该第一个响应完成之前,对话仍然只存在于它被后台处理的会话中。`claude attach` 拒绝打开它,显示 `This session has no saved transcript`。

918 

919在代理视图中,打开该行在列表下显示 `Press enter again to restart this session fresh`。在同一行上再次按 `Enter` 来使用空对话重新启动会话,或从 shell 运行 `claude respawn <id>`。

920 

921原始对话完整无损;使用 `claude --resume` 恢复它或继续在其中工作。有关详细信息,请参阅[错误参考](/docs/zh-CN/errors#this-session-has-no-saved-transcript)。

922 

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

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

925</h3>

926 

927[主管](#the-supervisor-process)在其自己的主机进程中运行每个后台会话的终端。当该进程死亡或停止响应时,Claude Code 显示原因并提供重新启动;在两种情况下,对话都被保存,重新启动会恢复它。[错误参考](/docs/zh-CN/errors#terminal-host-process-died)引用完整消息。

928 

929Claude Code 永远不会重新启动运行[shell 命令](#run-a-shell-command)的行,无论是从 `Enter` 还是从 `claude attach`,因为那样会再次运行该命令;该行的消息和 `claude attach` 都说该命令不会再次运行。

930 

931<h4 id="terminal-host-died">

932 终端主机已死亡

933</h4>

934 

935在 Linux 和 WSL 上,主管每隔几秒检查一次每个主机进程,无论您是否打开会话,当进程已退出但其与主管的连接从未关闭时,将会话标记为失败。

936 

937* 在代理视图中,该行显示 `terminal host process died — press Enter to restart`。在它上面按 `Enter`,Claude Code 在新的主机进程上重新启动会话。

938* 从 shell,`claude attach <id>` 重新启动已标记为失败的会话。否则它报告原因并退出,告诉您运行 `claude attach <id>`。

939 

940<h4 id="session-isn’t-responding">

941 会话没有响应

942</h4>

943 

944当主管接受打开但约十秒内没有输出到达时,Claude Code 结束尝试并提供重新启动。仅仅停滞的会话,例如跨机器睡眠,不会达到此提议:主管[在打开时自己重新启动它](#read-session-state)。

945 

946* 在代理视图中,页脚显示 `Press enter again to restart this session — it isn't responding (its conversation is saved and resumes).` 在同一行上再次按 `Enter`,Claude Code 停止无响应的进程并重新启动会话;没有第二次按下,它不会停止任何内容。

947* 从 shell,`claude attach <id>` 报告原因并退出,告诉您运行 `claude stop <id>`,然后 `claude attach <id>`。

718 948 

719<h3 id="a-session-fails-before-starting-with-a-possibly-low-memory-note">949<h3 id="a-session-fails-before-starting-with-a-possibly-low-memory-note">

720 会话在启动前失败,并显示 `possibly low memory` 注记950 会话在启动前失败,并显示 `possibly low memory` 注释

721</h3>951</h3>

722 952 

723从 v2.1.199 开始,当后台会话的进程在完成启动前退出,且主机内存不足时,该行的状态会命名退出并添加 `possibly low memory — free some up and retry`。早期版本仅显示此失败的原始退出原因。953当后台会话的进程在完成启动之前退出,且主机内存不足时,该行的状态命名退出并添加 `possibly low memory — free some up and retry`。

724 954 

725该注记是一个假设,而不是确认的原因。Claude Code 仅在进程无声退出(未写入错误且未被信号停止)且主机在该时刻报告内存不足时才添加它。当进程在退出前确实写入了错误时,该行显示该错误。955该注释是一个假设,而不是确认的原因。Claude Code 仅在进程无声退出时添加它,没有写入错误,也没有被信号停止,且主机在那一刻报告内存不足。当进程在退出前确实写入了错误时,该行显示该错误。

726 956 

727释放机器上的内存,然后附加、窥视或回复该行,监督进程为会话启动一个新进程。当内存保持不足时,监督进程也会[停止空闲会话](#the-supervisor-process)来自行释放资源。957释放机器上的内存,然后附加或回复该行,主管为会话启动新进程。当内存保持不足时,主管也会[停止空闲会话](#the-supervisor-process)来自行释放资源,如果停止其他会话没有释放任何内容,也会停止空闲的固定会话。

728 958 

729<h3 id="agent-view-says-the-background-service-did-not-respond">959<h3 id="agent-view-says-the-background-service-did-not-respond">

730 Agent view 说后台服务没有响应960 代理视图说后台服务没有响应

731</h3>961</h3>

732 962 

733如果附加、窥视或 `claude logs` 报告后台服务没有响应,监督进程可能已经停滞。停止它并让下一个 `claude agents` 启动一个新的。要在重启期间保持你的后台会话运行,请传递 `--keep-workers`:963如果附加、查看或 `claude logs` 报告后台服务没有响应,主管进程可能已停滞。停止它并让下一个 `claude agents` 启动新的。要在重新启动期间保持后台会话运行,请传递 `--keep-workers`:

734 964 

735```bash theme={null}965```bash theme={null}

736claude daemon stop --any --keep-workers966claude daemon stop --any --keep-workers

737```967```

738 968 

739新的监督进程重新连接到运行中的会话。没有 `--keep-workers`,该命令也会结束后台会话。`--any` 标志确认你想停止一个按需启动的监督进程,而不是作为已安装的服务启动的,这是默认的。969新的主管重新连接到运行的会话。没有 `--keep-workers`,该命令也会结束后台会话。`--any` 标志确认您想停止按需启动的主管,而不是作为已安装的服务,这是默认值。

740 970 

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

742 972 

743在 Windows 上,如果监督进程没有响应停止请求,该命令会打印其进程 ID。用 `taskkill /PID <pid>` 结束该进程以完成恢复。当你传递了 `--keep-workers` 时,后台会话仍然被保留。973如果该命令改为退出,说记录的进程无法验证为主管,请检查报告的进程 ID:如果它是您拥有的主管,自己停止它,然后删除 `~/.claude/daemon.lock`,以便下一个 `claude agents` 启动新的。

974 

975在 Windows 上,如果主管不响应停止请求,该命令会打印其进程 ID。使用 `taskkill /PID <pid>` 结束该进程以完成恢复。当您传递 `--keep-workers` 时,后台会话仍然被保留。

744 976 

745<h3 id="dispatch-fails-with-could-not-resolve-authentication-method">977<h3 id="dispatch-fails-with-could-not-resolve-authentication-method">

746 后台调度失败,出现 `Could not resolve authentication method`978 分派失败,显示 `Could not resolve authentication method`

747</h3>979</h3>

748 980 

749如果后台调度失败,出现 `Could not resolve authentication method`,而交互式会话正常进行身份验证,则接收调度的工作进程没有获取凭证。监督进程在将[预热工作进程](#the-supervisor-process)分配给调度时提供新的凭证快照,所以这个错误意味着监督进程本身没有可用的存储凭证。确认你已运行 `/login` 或配置了 API 密钥,然后停止监督进程:981如果后台分派失败,显示 `Could not resolve authentication method`,而交互式会话正常进行身份验证,接收分派的工作人员没有获取凭据。后台会话从[主管](#the-supervisor-process)获取其凭据,所以此错误意味着主管进程本身没有可用的存储凭据。确认您已运行 `/login` 或配置了 API 密钥,然后停止主管:

750 982 

751```bash theme={null}983```bash theme={null}

752claude daemon stop --any --keep-workers984claude daemon stop --any --keep-workers

753```985```

754 986 

755下一个 `claude agents` 或 `claude --bg` 启动一个新的监督进程,该进程读取你存储的凭证。如果你使用环境变量(如 `ANTHROPIC_API_KEY`)而不是 `/login` 进行身份验证,请从设置了该变量的 shell 运行下一个命令。987下一个 `claude agents` 或 `claude --bg` 启动读取您存储凭据的新主管。如果您使用环境变量(如 `ANTHROPIC_API_KEY`)而不是 `/login` 进行身份验证,请从设置了该变量的 shell 运行该下一个命令。

756 988 

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

758 990 

759<h3 id="background-sessions-can’t-read-desktop-documents-or-downloads-on-macos">991<h3 id="background-sessions-can’t-read-desktop-documents-or-downloads-on-macos">

760 后台会话无法在 macOS 上读取 Desktop、Documents 或 Downloads992 后台会话无法在 macOS 上读取 Desktop、Documents 或 Downloads

761</h3>993</h3>

762 994 

763在 macOS 上,后台会话主机作为其自己的进程运行,并与你的终端分开请求对受保护文件夹的访问。如果后台会话在读取 `~/Desktop`、`~/Documents`、`~/Downloads` 或其他受保护位置时报告 `Operation not permitted`,请在系统设置中的隐私与安全 > 文件和文件夹下授予访问权限,或为该条目启用完全磁盘访问。995在 macOS 上,后台会话主机作为其自己的进程运行,并与您的终端分别请求对受保护文件夹的访问。如果后台会话在读取 `~/Desktop`、`~/Documents`、`~/Downloads` 或其他受保护位置时报告 `Operation not permitted`,请在系统设置中的隐私和安全 > 文件和文件夹下授予访问权限,或为该条目启用完全磁盘访问。

764 996 

765使用原生安装程序,该条目显示为 Claude Code,授予在更新中持续。使用其他安装方法(如 Homebrew 或 npm),该条目显示二进制路径,在更新后可能需要再次授予。997使用本机安装程序,该条目显示为 Claude Code,授予在更新中持续。使用其他安装方法(如 Homebrew 或 npm),该条目显示二进制路径,更新后可能需要再次授予。

766 998 

767<h3 id="background-sessions-can’t-reach-local-network-hosts-on-macos">999<h3 id="background-sessions-can’t-reach-local-network-hosts-on-macos">

768 后台会话无法在 macOS 上访问本地网络主机1000 后台会话无法在 macOS 上访问本地网络主机

769</h3>1001</h3>

770 1002 

771在 macOS 15 及更高版本上,系统会阻止进程访问你本地网络上的设备,直到你授予本地网络权限。在 v2.1.198 之前,后台会话主机从未请求该权限,所以针对 LAN 地址的命令失败,出现 `connect: no route to host`,即使相同的命令在前台终端中有效。从 v2.1.198 开始,后台会话中连接到本地网络地址的第一个命令会触发 Claude Code 的 macOS 本地网络权限提示。授予一次,这些命令就能像在前台终端中一样访问 LAN 主机。1003在 macOS 15 及更高版本上,系统会阻止进程访问本地网络上的设备,直到您授予本地网络权限,因此针对 LAN 地址的命令可能在后台会话中失败,显示 `connect: no route to host`,即使它在前台终端中有效。后台会话中连接到本地网络地址的第一个命令会触发 Claude Code 的 macOS 本地网络权限提示。授予一次,这些命令就能像在前台终端中一样访问 LAN 主机。

772 1004 

773<h3 id="a-session-is-slow-to-respond-after-attaching">1005<h3 id="a-session-is-slow-to-respond-after-attaching">

774 附加后会话响应缓慢1006 附加后会话响应缓慢

775</h3>1007</h3>

776 1008 

777一旦会话完成并未连接地坐了大约一小时,监督进程停止其进程以释放资源。附加启动一个从中断处的新进程并立即切换到会话,而进程重新启动。工作或等待你的会话,或[固定](#organize-the-list)的会话永远不会以这种方式停止,所以用 `Ctrl+T` 固定一个会话来保持它的响应性。1009当已完成或等待您下一条消息的会话保持未附加约一小时时,主管停止其进程以释放资源。附加从中断的地方启动新进程,并在进程重新启动时立即切换到会话。正在工作、暂停在权限提示或其他对话上的会话,或[固定](#organize-the-list)的会话不会以这种方式停止,所以使用 `Ctrl+T` 固定会话以保持其响应性。

778 1010 

779当进程启动时,会话记录的最后一屏会显示,下面有一个 `Session is starting` 注记,当会话准备好时,实时会话会立即替换它。1011进程启动时,Claude Code 显示会话转录的尾部,格式化为实时会话呈现的方式,带有 markdown、突出显示的代码块和工具调用作为暗淡的行,上方是带有 `Session is starting` 注释的暗淡提示区域。实时会话在准备好后立即替换它。

780 1012 

781<h3 id="claude/worktrees/-is-filling-up">1013<h3 id="claude/worktrees/-is-filling-up">

782 `.claude/worktrees/` 填满了1014 `.claude/worktrees/` 正在填满

783</h3>1015</h3>

784 1016 

785在 agent view 中删除会话会删除 Claude 为其创建的 worktree,无法安全删除的 worktree [保持其会话行](#organize-the-list),这样它就不会被孤立。`claude rm` 保留具有未提交更改的 worktree 及其会话行,并打印保留的路径。在项目目录中用 `git worktree list` 列出剩余条目,并用 `git worktree remove <path>` 删除每个。参见[清理 worktrees](/docs/zh-CN/worktrees#clean-up-worktrees)。1017在代理视图中删除会话会删除 Claude 为其创建的 worktree,但[某些删除会保留 worktree 或在磁盘上留下其目录](#what-deleting-a-session-removes),所以剩余目录可能会累积。Git 不再识别的目录不会出现在 `git worktree list` 中,所以手动删除这些目录。

1018 

1019在项目目录中使用 `git worktree list` 列出剩余条目,并使用 `git worktree remove <path>` 删除每一个。请参阅[清理 worktrees](/docs/zh-CN/worktrees#clean-up-worktrees)。

786 1020 

787<h2 id="limitations">1021<h2 id="limitations">

788 限制1022 限制


792 1026 

793* **速率限制适用**:后台会话消耗你的订阅使用量,与交互式会话相同,因此并行运行十个代理的配额消耗速度大约是运行一个代理的十倍。1027* **速率限制适用**:后台会话消耗你的订阅使用量,与交互式会话相同,因此并行运行十个代理的配额消耗速度大约是运行一个代理的十倍。

794* **会话是本地的**:后台会话在你的机器上运行。它们在机器睡眠时保留,但在机器关闭时停止。1028* **会话是本地的**:后台会话在你的机器上运行。它们在机器睡眠时保留,但在机器关闭时停止。

795* **Claude 创建的 worktrees 在 agent view 中随会话删除**:在删除在其自己的 worktree 中编辑文件的会话之前,请提交更改。具有未推送任何地方的提交的 worktree 与会话一起保留。`claude rm` 也会将具有未提交更改的 worktree 与其会话一起保留,而你自己创建的 worktree 保持原位。1029* **Claude 创建的 worktrees 在 agent view 中随会话删除**:在删除在其自己的 worktree 中编辑文件的会话之前,请提交更改。[某些删除会保留 worktree](#what-deleting-a-session-removes)。

796 1030 

797<h2 id="related-resources">1031<h2 id="related-resources">

798 相关资源1032 相关资源

799</h2>1033</h2>

800 1034 

801有关以并行方式运行 Claude 的其他方法,请参阅:1035有关以并行方式运行 Claude 的其他方法,以及在运行的会话之间传递发现的方法,请参阅:

802 1036 

803* [并行运行代理](/docs/zh-CN/agents):比较 agent view 与 subagents、agent teams 和 worktrees1037* [并行运行代理](/docs/zh-CN/agents):比较 agent view 与 subagents、agent teams 和 worktrees

1038* [跨会话消息传递](/docs/zh-CN/cross-session-messaging):让您的会话相互传递发现

804* [Agent teams](/docs/zh-CN/agent-teams):协调相互发送消息的多个会话1039* [Agent teams](/docs/zh-CN/agent-teams):协调相互发送消息的多个会话

805* [Claude Code on the web](/docs/zh-CN/claude-code-on-the-web):在托管的云环境中运行会话而不是本地1040* [Claude Code on the web](/docs/zh-CN/claude-code-on-the-web):在托管的云环境中运行会话而不是本地

806 1041 


811Agent view 在研究预览期间发展迅速。如果你使用较旧的 Claude Code 版本,本页上的某些行为可能会有所不同;特别是,`claude agents` 拒绝它尚不支持的标志,出现 `unknown option` 错误。下表列出了何时添加每个标志和行为。1046Agent view 在研究预览期间发展迅速。如果你使用较旧的 Claude Code 版本,本页上的某些行为可能会有所不同;特别是,`claude agents` 拒绝它尚不支持的标志,出现 `unknown option` 错误。下表列出了何时添加每个标志和行为。

812 1047 

813| 版本 | 更改 |1048| 版本 | 更改 |

814| -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |1049| -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

815| v2.1.208 | 附加到一个进程已停止的会话会显示其记录的最后一屏,而进程启动,而不是仅显示 `Session is starting` 注记。无法传递的回复(因为后台服务无法访问或发送失败)会被保存,并在会话的进程再次启动时作为会话的下一个提示发送;在此版本之前,后台服务无法访问时丢失的回复会被丢弃。其自身二进制文件被更新替换的进程仍然可以从已安装的 `claude` 启动器或磁盘上的最新版本启动监督进程,而不是在 Claude Code 重新启动之前失败。运行较旧版本的监督进程永远不会将由较新版本启动的空闲会话重新启动到其自身的较旧二进制文件上。删除会话会删除其 worktree,即使会话将 worktree 移到了不同的分支,并在 worktree 有未推送到任何地方的提交或另一个会话声称它时将 worktree 与会话行保持在一起,而不是销毁提交或孤立 worktree。`/install-github-app` 和 `/mcp` 设置列表及其身份验证操作在后台会话中被拒绝,并显示替代方案的消息;仅在 v2.1.208 中,`/model` 选择器以相同方式被拒绝,键入的 `/model <name>` 仅切换该会话,而不是也保存你的默认模型。 |1050| v2.1.268 | 当[删除被拒绝](#what-deleting-a-session-removes)因为 git 或你的 `WorktreeRemove` hook 无法删除 worktree 时,消息会说明原因,包括 hook 如何结束以及其 stderr 的开始。对于位于存储库的 `.claude/worktrees/` 下的链接 worktree,没有对跟踪文件的未提交更改,其中没有嵌套存储库,也没有其他会话的记录命名它,再次删除会话会从 agent view 或使用 `claude rm <id> --force-remove-worktree <worktree-id>` 删除目录。在此版本之前,该行仅显示 `worktree could not be removed (WorktreeRemove hook failed)` 或 git 的错误,hook 的 stderr 仅进入调试日志,再次删除被以相同方式拒绝。 |

816| v2.1.207 | 窥视面板以行截断的句子打开,例如等待你的会话的确切问题,并显示被阻止的会话已等待多长时间作为单个 `waiting 3m` 行,而不是将相同的时间戳前缀添加到状态句子和问题。在调度输入中再次粘贴相同的文本会展开折叠的 `[Pasted text #N]` 占位符,而不是添加第二个。按名称接受计划的后台会话在其行上显示该名称。移入 worktree 的后台会话在其进程从 agent view 重新启动时保持其对话。 |1051| v2.1.260 | 当你[后台会话](#from-inside-a-session)时,你的其他会话的[代理列表](/docs/zh-CN/cross-session-messaging#see-which-sessions-claude-can-reach)显示对话一次,作为其后台会话,它们对它的消息不再到达你移动它的终端。在此版本之前,该终端可能在 `claude agents --json` 中显示为对话名称下的第二个交互式会话,在移动前已向对话发送消息的会话继续传递到该终端。 |

817| v2.1.206 | 行摘要填充行的剩余宽度,仅在终端的右边缘截断,而不是在 64 列处。监督进程重新启动到新的 Claude Code 版本后,它在后台将剩余的空闲后台会话重新启动到该版本,而不是每分钟几个。使用 `Ctrl+X` 或 `claude rm` 删除会话也会将其从监督进程的会话列表中清除,因此行在监督进程重新启动后不再重新出现。 |1052| v2.1.260 | 当[删除因未推送的提交被拒绝](#what-deleting-a-session-removes)时,消息会说明 worktree 的分支以及有多少提交未推送,再次删除会话会丢弃 worktree 及其提交。在此版本之前,拒绝仅说 `worktree has commits that are not pushed anywhere`,再次删除被以相同方式拒绝,删除会话需要推送提交或手动删除 worktree。 |

818| v2.1.205 | 行摘要显示会话自己的单行报告,在 64 列处截断,而不是原始工具调用或 `done/total` 计数;按目录分组的行以彩色状态词打开。窥视面板以完整状态句子打开,对于等待你的会话,其精确问题显示在回复输入上方。编辑、评论、关闭或使用 `gh` 标记拉取请求为就绪的会话与其关联,不仅仅是创建或检出拉取请求的会话,推送即使本地分支名称不匹配也会关联拉取请求,创建命令的输出超过内联限制的拉取请求也会关联。没有可读文本的转向保持会话的前一个状态,而不是将其翻转回 `Working`。`claude attach` 等待重新启动的会话长达约 60 秒,带有命名原因的状态行,而不是失败。 |1053| v2.1.257 | `←` [从附加的会话分离,即使 `/btw` 覆盖层打开](#attach-to-a-session),甚至在回答中途,覆盖层在你下次附加时重新打开。在此版本之前,当覆盖层打开时 `←` 不分离。 |

819| v2.1.203 | 在调度 shell 中导出的网关 `ANTHROPIC_BASE_URL` 当监督进程共享该网关环境时,会到达从它调度的会话进入同一目录,而不是在保留随之导出的 API 密钥时被丢弃。调度 shell 的 `PATH` 应用于每个会话的工作进程。在子代理运行时按 `←` 会等待它们,而不是在十秒后重新启动它们。空列表始终显示部分标题及其下方的描述。在调度输入中键入 `@` 也会列出启动存储库内其目录树中的已注册 git worktrees。从 `effortLevel` 设置继承的工作量在该设置的后续编辑后跟随,而不是在调度时固定。打开一个已停止的会话(其对话已在另一个运行中的会话中打开)会被拒绝并显示消息,而不是导致行失败。在 agent view 中不可用的命令会在输入中保留已键入的文本。在 git 存储库外失败的 `WorktreeCreate` hook 不再阻止会话编辑文件。 |1054| v2.1.257 | 当你运行 [`claude --resume <session-id> --bg`](#from-your-shell) 时,Claude Code 在其自己的 ID 下继续该会话,或在新 ID 下启动副本并打印 `note:` 行解释原因。`--continue`、裸 `--resume` 和带名称或路径的 `--resume` 启动具有相同注记的副本。在此版本之前,`--resume` 与 `--bg` 总是在新 ID 下启动副本且不说任何内容。 |

820| v2.1.202 | 使用 `/rename` 或 `Ctrl+R` 在后台会话上设置的名称在监督进程停止并重新启动时保持不变,而不是恢复为会话调度时的名称。 |1055| v2.1.257 | 当你从使用 `←` 打开的 agent view 调度会话时,Claude Code 在[目标目录通过 `permissions.defaultMode` 配置](#permission-mode)的权限模式下启动它。当目录未设置时,你来自的会话的权限模式适用。在此版本之前,调度的会话总是在你来自的会话的权限模式下启动,覆盖它。 |

821| v2.1.200 | 重写 `roster.json` 中会话列表的较旧 Claude Code 版本保留由较新版本写入的字段,与现有的 `state.json` 保证相匹配,因此由较新版本启动的会话在监督进程重新启动后继续接受输入。当你打开已停止响应的会话时,监督进程重新启动其进程,会话从中断处继续响应。 |1056| v2.1.257 | agent view 中的 `Ctrl+S`、`Ctrl+T` 和 `Ctrl+G` [遵循你的 `keybindings.json`](#keyboard-shortcuts):`Ctrl+S` 和 `Ctrl+T` 通过 `Agents` 上下文的 `agents:switchView` 和 `agents:togglePin` 操作,`Ctrl+G` 通过 `Chat` 上下文的 `chat:externalEditor` 绑定。在此版本之前,agent view 忽略 `keybindings.json`,这些键是固定的。 |

1057| v2.1.257 | 启动[后台服务](#the-supervisor-process)从两个失败原因恢复。在 macOS npm 安装上,自更新期间的启动[等待安装](/docs/zh-CN/errors#eacces-when-starting-a-background-session)而不是运行 npm 在替换二进制文件时放下的占位符。在 Windows 上,在机器上次启动前写入的陈旧 `daemon.lock`,或其记录的进程 ID 现在属于不同进程的,被替换。在此版本之前,macOS 启动在安装窗口期间失败,出现 `Error: claude native binary not installed.`,Windows 锁使每次启动都失败,出现 [`exited before it became reachable`](/docs/zh-CN/errors#background-service-exited-before-it-became-reachable),直到你删除 `~/.claude/daemon.lock`。 |

1058| v2.1.257 | 当你在另一个 Claude Code 进程下载 npm 更新时打开或调度后台会话时,Claude Code [继续等待长达两分钟](/docs/zh-CN/errors#eacces-when-starting-a-background-session),同时安装运行,然后失败,说 `Claude Code is being updated by npm on this machine`。在此版本之前,等待在十秒时停止,所以在下载仍在运行时打开失败,出现 `Couldn't start the background service`。 |

1059| v2.1.257 | 持有[跨会话消息](/docs/zh-CN/cross-session-messaging#control-inbound-messages)等待你批准的后台会话在其 `Needs input` 行上显示 `approve message from`,带有发送者的地址和发送者声称的名称。在此版本之前,该行移到 `Needs input` 但保留其前一个文本,所以 `claude agents` 中没有任何内容命名等待的消息或其发送者。 |

1060| v2.1.257 | 在打开的后台会话内使用 `Ctrl+S` 隐藏的提示[与会话一起保留](#what-persists-across-restarts),所以 `Ctrl+S` 在会话的进程停止并再次启动后恢复它。在此版本之前,隐藏仅存在于运行的进程中,当会话空闲足够长时间使其进程停止时丢失,或当它停止然后重新打开时丢失。 |

1061| v2.1.251 | 在尚未[移入 worktree](#how-file-edits-are-isolated) 的后台会话中,Claude 和它生成的子代理可以编辑链接 git worktree 内的文件。 |

1062| v2.1.251 | Claude Code 转发在你调度的 shell 中导出的云提供商网关,例如 `ANTHROPIC_VERTEX_BASE_URL` 或 `ANTHROPIC_BEDROCK_BASE_URL` 及其身份验证绕过标志,到[会话的工作进程](#llm-gateway),条件与 `ANTHROPIC_BASE_URL` 相同。在此版本之前,如果你仅通过此类网关进行身份验证后台或从 shell 调度,会话进行的每个请求都失败,因为端点和标志从其环境中删除。 |

1063| v2.1.251 | 当后台会话在另一个 Claude Code 进程刷新[插件市场](/docs/zh-CN/plugin-marketplaces)时启动,例如运行[市场自动更新](/docs/zh-CN/discover-plugins#configure-auto-updates)的同级会话,Claude Code 保持该市场的插件可用。在此版本之前,此类会话可能启动时没有该市场的任何 skills、agents、hooks 和 MCP 服务器,并在整个运行期间保持这样。 |

1064| v2.1.248 | 在[调度输入](#keyboard-shortcuts)中 `Shift+Enter` 插入换行符,与主提示匹配,`Ctrl+Enter` 在 `?` 覆盖层列出 `ctrl+enter to start and open` 的终端中立即调度并附加。在此版本之前,`Shift+Enter` 调度并附加。 |

1065| v2.1.248 | [删除会话](#what-deleting-a-session-removes)在 worktree 的提交已经在你的 `origin` 远程的默认分支的本地副本上且你的主检出已检出该分支时成功;在此版本之前,删除被拒绝,出现 `has commits that are not pushed anywhere`。 |

1066| v2.1.248 | 使用 `←` 或 `/background` 后台的会话在运行时在其 worktree 上持有 [`git worktree lock`](/docs/zh-CN/worktrees#clean-up-subagent-and-background-session-worktrees);在此版本之前,后台释放锁,清理或 `git worktree remove` 可以在运行的会话下删除 worktree。 |

1067| v2.1.248 | 未等待你的输入且在其最后活动后超过 48 小时被发现已死的后台会话,例如在机器关闭数天后,[显示为已停止](#sessions-show-as-failed-after-shutdown),出现 `ended while the background service was off`,`Enter` 在它上面询问后恢复其保存的对话。在此版本之前,此类会话重新出现为新鲜失败,排序到列表顶部,单个 `Enter` 将数周前的对话拉入前台。 |

1068| v2.1.248 | 打开一个已停止的行,其对话[你在另一个终端中恢复](#opening-a-session-says-the-conversation-is-already-open)被拒绝,出现 `Can't open — this session is running in another terminal`,该行显示 `Open in a terminal` 而不是显示在 `Working` 下。在此版本之前,打开该行启动第二个进程写入相同的对话。 |

1069| v2.1.248 | 等待权限决定的后台会话,同时 `PermissionRequest` 或 `PreToolUse` hook 打印了无效答案[在其行上命名 hook 事件和架构错误](#peek-and-reply)。在此版本之前,该行仅显示待处理请求。 |

1070| v2.1.248 | 在 Windows 上,`claude agents` 在早期程序留在 win32-input-mode 的终端标签中启动时响应键盘。在此版本之前,Claude Code 没有解码此类标签发送的关键记录。 |

1071| v2.1.247 | 在 Linux 和 WSL 上,[其终端主机进程已死](#the-terminal-host-died-or-the-session-stopped-responding)的会话在几秒内失败,出现原因。没有输出的打开在约十秒后以重启提议结束,行上的 `Enter` 使用其对话重启会话;`claude attach <id>` 报告原因并退出。在此版本之前,打开此类会话无限期显示 `opening… · esc to cancel`,`claude attach <id>` 等待而不报告错误。 |

1072| v2.1.246 | 在 npm 安装上,当[后台服务](#the-supervisor-process)在 `npm install -g @anthropic-ai/claude-code` 替换二进制文件时启动失败时,Claude Code 等待长达十秒以完成安装并重试,然后报告 [`EACCES: permission denied`](/docs/zh-CN/errors#eacces-when-starting-a-background-session)。 |

1073| v2.1.246 | 当[后台服务](#the-supervisor-process)进程在打印错误后死亡时,Claude Code 报告失败并[引用服务的第一个错误行](/docs/zh-CN/errors#background-service-exited-before-it-became-reachable)。 |

1074| v2.1.246 | 如果你的机器在[后台服务](#the-supervisor-process)启动时睡眠,Claude Code 重试启动一次而不是失败。 |

1075| v2.1.246 | Claude Code 等待约两分钟而不是 45 秒以获得新启动的[后台服务](#the-supervisor-process),该服务活跃但接受连接缓慢。 |

1076| v2.1.246 | [后台服务](#the-supervisor-process)从你的主目录启动,所以在 macOS 和 Linux 上已删除或移动的启动目录不再阻止启动。 |

1077| v2.1.246 | `/fork` [复制完整对话](#copy-the-session-with-%2Ffork)来自本身作为副本启动且未记录新提示的会话:你附加到的 `/fork` 副本、在 `←` 或 `/background` 将其移到后台后重新附加的会话,或使用 `claude --resume <id> --fork-session` 启动的会话。在此版本之前,如果你在此类会话中运行 `/fork` 然后向其发送新提示,Claude Code 打印正常确认但使用空对话启动副本。使用 `←` 或 `/background` 将此类会话移到后台以相同方式丢失对话。 |

1078| v2.1.246 | 当你打开刚调度的会话,同时其工作进程仍在启动时,例如通过按其行上的 `Enter`,Claude Code 等待进程然后附加。在此版本之前,如果你在进程仍在启动时按 `Enter`,Claude Code 可能停止会话,出现 [`Session <id> was stopped while the respawn was in flight`](/docs/zh-CN/errors#session-was-stopped-while-the-respawn-was-in-flight)。 |

1079| v2.1.246 | 当你[后台](#from-inside-a-session)一个命名的会话时,Claude Code 列出它一次,当你再次后台相同的对话时,它对新行的名称进行编号,例如 `my-session (2)`,现有行保留其名称。在此版本之前,你按 `←` 的终端可能在 `claude agents --json` 中显示为相同名称下的第二个会话,如果你再次后台相同的对话,Claude Code 在相同名称下添加另一行。 |

1080| v2.1.239 | 启用[vim 编辑器模式](/docs/zh-CN/interactive-mode#vim-editor-mode)时,在 agent view 的输入中按 `Esc` 从 INSERT 切换到 NORMAL 模式并保留你的文本,与主提示匹配;在 NORMAL 模式下,输入中仍有文本时,按 `Esc` 清除它,在空输入上按 `Esc` 退出,如[`Esc` 快捷键](#keyboard-shortcuts)描述。在此版本之前,`Esc` 清除输入。 |

1081| v2.1.233 | 对于链接到 GitLab 合并请求的会话,Claude Code 在 GitLab 的 `!1234` 参考语法中写入行的标签。你也可以将合并请求的 URL 粘贴到[调度输入](#filter-sessions)中以选择该会话。在此版本之前,标签呈现为 `#1234`,粘贴的合并请求 URL 仅在其第一个提示包含 URL 时与会话匹配。 |

1082| v2.1.227 | [删除会话](#what-deleting-a-session-removes)在另一个活跃的 Claude Code 会话在该 worktree 目录内运行时保留会话及其 worktree。Agent view 在行上显示 `not deleted` 和页脚中的原因,`claude rm` 打印 `kept <id>` 及原因,其命名另一个会话的进程 ID。在此版本之前,删除会话在另一个会话仍在其中工作时删除 worktree。 |

1083| v2.1.225 | 在你未信任的目录中 `claude agents` 显示与 `claude` 在启动时显示相同的[工作区信任对话框](/docs/zh-CN/permissions#project-allow-rules-and-workspace-trust),在 agent view 打开之前。接受保存该工作区的信任;拒绝退出而不打开 agent view。在此版本之前,`claude agents` 打开而不询问,所以你从它调度的会话在你从未被要求信任的目录中运行。<br /><br />列表按目录分组时,将鼠标悬停在行上突出显示它而不改变[调度目标](#dispatch-to-a-specific-directory);使用箭头键或点击选择行仍然改变目标。在此版本之前,将鼠标移到另一个项目中的会话上无声地改变下一个调度的会话启动的目录。 |

1084| v2.1.221 | `/status` 显示 `Session kind` 行:后台会话中的 `background job · attached` 或 `background job · unattended`,取决于是否附加了终端,任何其他会话中的 `interactive`。在此版本之前,`/status` 没有报告会话类型。<br /><br />`/fork`:Claude Code 指示[副本](#from-inside-a-session)隔离其工作与原始会话的:副本在进行代码更改前创建自己的 worktree,远离原始会话的 worktree,当其任务建立在该工作基础上时基于原始分支的新分支。查看链接部分了解确切条件。在此版本之前,副本没有收到隔离指令,可能最终编辑原始会话仍在工作的 worktree 或检出。<br /><br />启用[vim 编辑器模式](/docs/zh-CN/interactive-mode#vim-editor-mode)时,在使用 `u` 撤销提示回到空后立即按 `←` 要求与删除文本或通过提示历史移动相同的确认,仅在第二次按压时切换;在此版本之前按压立即切换。 |

1085| v2.1.219 | 启用[vim 编辑器模式](/docs/zh-CN/interactive-mode#vim-editor-mode)时,在空提示上按 `←` 从 NORMAL 模式以及 INSERT 打开 agent view,页脚的 `←` 提示在 NORMAL 模式中显示;在此版本之前手势和提示仅限 INSERT,在 NORMAL 模式中空提示上的 `←` 不做任何事。在 Claude Code 等待后台会话时在输入中键入取消切换,出现 `Backgrounding cancelled — you have unsent text in the input. Send it or clear it, then press ← again.` 所以键入的草稿不会丢失。 |

1086| v2.1.218 | 在清空提示的删除后两秒内或通过提示历史移动后按 `←` 显示 `Press ← again to open agents`,或在附加的会话中 `Press ← again to go back to agents`,仅在至少一秒后的第二次按压时切换;在此版本之前按压立即切换。在粘贴或脚本输入内到达的 `←` 不再触发切换。使用 `←` 后台前台会话显示 `Your conversation moved to the background` 在列表上方,agent view 根部的 `Esc` 返回到该对话而不是退出到 shell,双 `Ctrl+C` 保持退出;如果对话无法重新打开,Claude Code 退出并为其打印 `claude --resume` 命令。在 Windows 上,在附加后约半秒内按下的 `←` 显示 `Ambiguous ←, press again to detach` 并在第二次按压时分离。 |

1087| v2.1.217 | 会话行上的拉取请求徽章呈现为超链接,即使 Claude Code 无法检测到终端超链接支持,例如通过 SSH 或 tmux;设置 [`FORCE_HYPERLINK=0`](/docs/zh-CN/env-vars) 将其呈现为纯文本。在此版本之前,当未检测到支持时徽章呈现为纯文本。 |

1088| v2.1.216 | `/fork`:[确认](#from-inside-a-session)是一行,显示副本的状态、其 agent-view 行的名称和其会话 ID 用于 `claude attach`,仅当副本在主工作树中运行或编辑你打开的检出时以 `runs in the origin tree` 或 `edits this checkout` 结尾。点击名称后台此会话并在副本的会话中打开 agent view。确认不再重述副本的继承权限模式;早期版本打印了多行确认,没有可点击的名称。<br /><br />需要输入:`/install-github-app` 和 `/mcp` 设置列表,在没有人附加时运行,在 `Needs input` 下显示会话,带有命名命令的行,附加并重新运行命令继续;从 v2.1.208 到 v2.1.215 它们在该状态下被直接拒绝。<br /><br />`--agent` 恢复:恢复或重启[后台 `--agent` 会话](#from-your-shell)恢复代理的系统提示和工具限制,在会话自己的目录中搜索代理首先,当其工作区被信任时;代理不再存在的会话继续使用默认工具和系统提示,并以可见警告打开,而不是无声地恢复到默认代理。<br /><br />`Ctrl+X`:按两次删除会话,即使停止尝试失败,而不是失败的停止取消待处理删除,已删除的会话其工作进程已死不再在下一次刷新时重新出现。<br /><br />Worktree 删除:其 worktree 目录不属于任何 git 存储库的会话可以被删除;在此版本之前每次删除此类会话的尝试都被拒绝。已经消失的目录立即清除。agent view 双按删除仍有文件的目录,为 hook 创建的目录运行你的 `WorktreeRemove` hook,除非另一个会话的记录也命名它。`claude rm` 在文件仍然存在时保留此类目录。 |

1089| v2.1.214 | 使用 `←` 或 `/background` 后台的会话,空闲时没有任何运行,其进程停止,如同任何其他空闲会话,而不是保持其进程和后台服务无限期运行。已完成的会话可以在后台服务空闲后使用 `claude rm` 或从 agent view 删除,从不是 git 存储库的目录调度后进入 worktree 的会话,例如多存储库工作区文件夹,当 worktree 本身属于 git 存储库时可以从 agent view 删除,因为清理从 worktree 而不是会话调度的目录解决;两个删除在此版本之前都被拒绝。重新打开已停止的会话恢复其保存的对话,即使记录存储中的文件夹无法读取。 |

1090| v2.1.213 | `/install-github-app`、[`/mcp`](/docs/zh-CN/mcp) 设置列表和 MCP 身份验证操作在附加了终端的后台会话中工作,仅在没有人附加时被拒绝,带有告诉你附加并再次运行命令的消息;从 v2.1.208 到 v2.1.212 即使附加了终端也被拒绝。 |

1091| v2.1.212 | [交互式会话中的 `/fork`](#from-inside-a-session)将对话复制到显示为其自己行的新后台会话中,以来自的会话命名或,对于未命名会话的提示 fork,以 fork 提示命名,而原始保持运行;`/fork` 的早期 forked-subagent 行为移到 `/subtask`。启用[关闭 agent view](#turn-off-agent-view) 时,`/fork` 保持 forked-subagent 行为。等待其第一个提示的聚焦行显示 `space to send it a prompt`。`Ctrl+J` 在具有扩展键报告的终端上在调度输入中插入换行符,其中按键之前被忽略,`?` 覆盖层列出快捷键。当后台会话完成而没有任何需要你的输入时,交互式会话中的 `←` 页脚提示简要显示 `N done`。在 agent view 中键入裸 `/resume` 打开你打开 agent view 的存储库的过去会话的选择器,包括从列表中删除的会话,选择一个将其恢复为后台会话;在此版本之前 `/resume` 在 agent view 中不可用,已删除的会话仅通过 `claude --resume` 或交互式会话中的 `/resume` 可达。目标、范围和受限形式保留 `attach to a session to run it` 提示,早期版本为每个形式显示。等待沙箱网络主机提示、MCP 输入请求或托管设置提示的会话显示为 `Needs input` 而不是 `Working`,在 agent view 和 `claude agents --json` 中,Claude 的问题报告 `waitingFor: input needed` 而不是 `permission prompt`。附加到其进程已停止的会话显示其记录格式化为活跃会话呈现的方式,而不是原始文本。已停止的会话其记录在意外位置通过你保存的记录的最后手段扫描恢复,打开没有保存记录的行显示 `Press enter again to restart this session fresh`,在第二次按压时新鲜重启;v2.1.211 显示拒绝而没有从 agent view 重启的方式。 |

1092| v2.1.211 | 通过附加或从其运行的目录回复唤醒已停止的会话再次转发你的 shell 的网关 `ANTHROPIC_BASE_URL`,条件与新鲜调度相同,所以通过网关 `ANTHROPIC_AUTH_TOKEN` 身份验证的会话在网关上恢复而不是报告 `Not logged in`。附加到已停止的会话,该会话在其第一个响应完成前从另一个对话后台,被拒绝,出现 `This session has no saved transcript` 而不是无声地在相同会话 id 下启动空白对话;从 agent view 打开相同行显示页脚中的拒绝。从 Claude Code 外部结束 `←` 或 `/background` 会话的进程将其标记为已停止,而不是监督进程重新启动它,已记录在磁盘上的停止被尊重,除非你发送的回复仍在等待传递,崩溃后重新启动的会话被告知它被重新启动,重新启动的 `←` 或 `/background` 会话不恢复超过约一小时的中断响应。回答或拒绝提示而不是标记它的会话命名回复,例如对于主要是链接的提示,被丢弃,行保留从提示文本获取的名称。删除其 worktree git 不再识别的会话成功,在磁盘上留下 worktree 目录并命名其路径,而不是每次尝试都被拒绝。拒绝的删除在会话行上显示原因,包括 worktree 无法删除时的基础 git 错误,而不是行无声地重新出现。 |

1093| v2.1.210 | `claude attach` 在后台服务启动或重新连接时等待,而不是失败,出现 `job not found` 或 `still starting` 错误,报告在附加期间完成的会话为已退出,并应用在缓慢附加期间进行的终端调整大小,当附加完成时。提示页脚的 `←` 需要输入计数出现在每个提供商上,包括以前显示纯 `← for agents` 形式的第三方提供商。使用 `←` 后台会话将 Claude 的任务列表转移到后台会话,而不是丢弃它。你按 `←` 的行在选择移动后保留粗体、未变暗的名称。`claude agents --effort` 接受 `ultracode` 而不是无声地丢弃它。 |

1094| v2.1.208 | 附加到其进程已停止的会话显示其记录的最后屏幕,同时进程启动,而不是仅显示 `Session is starting` 注记。无法传递的回复,因为后台服务无法访问或发送失败,被保存并在其进程再次启动时作为会话的下一个提示发送;在此版本之前,后台服务无法访问时丢失的回复被丢弃。其自身二进制文件被更新替换的进程仍然可以从已安装的 `claude` 启动器或磁盘上的最新版本启动监督进程,而不是在 Claude Code 重新启动前失败。运行较旧版本的监督进程永远不会将由较新版本启动的空闲会话重新启动到其自身的较旧二进制文件上。删除会话删除其 worktree,即使会话将 worktree 移到了不同的分支,并在 worktree 有未推送到任何地方的提交或另一个会话声称它时将 worktree 与会话行保持在一起,而不是销毁提交或孤立 worktree。`/install-github-app` 和 `/mcp` 设置列表及其身份验证操作在后台会话中被拒绝,带有命名替代方案的消息;仅在 v2.1.208 中,`/model` 选择器以相同方式被拒绝,键入的 `/model <name>` 仅切换该会话,而不是也保存你的默认模型。 |

1095| v2.1.207 | 窥视面板以行截断的句子打开,例如等待你的会话的确切问题,并显示被阻止的会话已等待多长时间作为单个 `waiting 3m` 行,而不是将相同的时间戳前缀添加到状态句子和问题。在调度输入中再次粘贴相同的文本展开折叠的 `[Pasted text #N]` 占位符,而不是添加第二个。按名称接受计划的后台会话在其行上显示该名称。移入 worktree 的后台会话在其进程从 agent view 重新启动时保持其对话。 |

1096| v2.1.206 | 行摘要填充行的剩余宽度,仅在终端的右边缘截断,而不是在 64 列处。监督进程重新启动到新的 Claude Code 版本后,它在后台将剩余的空闲后台会话重新启动到该版本,而不是每分钟几个。使用 `Ctrl+X` 或 `claude rm` 删除会话也会将其从监督进程的会话列表中清除,所以行在监督进程重新启动后不再重新出现。在调度 shell 中导出的 `CLAUDE_CODE_EXTRA_BODY` 请求体覆盖到达后台会话,而不是被忽略。 |

1097| v2.1.205 | 提示页脚的 `←` 提示在常规 `claude` 会话中计数等待你的后台代理,例如 `← 2 agents`。行摘要显示会话自己的单行报告,在 64 列处截断,而不是原始工具调用或 `done/total` 计数;按目录分组的行以彩色状态词打开。窥视面板以完整状态句子打开,对于等待你的会话,其精确问题显示在回复输入上方。编辑、评论、关闭或使用 `gh` 标记拉取请求为就绪的会话与其关联,不仅仅是创建或检出拉取请求的会话,推送即使本地分支名称不匹配也会关联拉取请求,创建命令的输出超过内联限制的拉取请求也会关联。没有可读文本的转向保持会话的前一个状态,而不是将其翻转回 `Working`。`claude attach` 等待重新启动的会话长达约 60 秒,带有命名原因的状态行,而不是失败。 |

1098| v2.1.203 | 在调度 shell 中导出的网关 `ANTHROPIC_BASE_URL` 当监督进程共享该网关环境时,到达从它调度的会话进入同一目录,而不是在保留随之导出的 API 密钥时被丢弃。调度 shell 的 `PATH` 应用于每个会话的工作进程。在子代理运行时按 `←` 等待它们,而不是在十秒后重新启动它们。空列表始终显示部分标题及其下方的描述。在调度输入中键入 `@` 也列出启动存储库内其目录树中的已注册 git worktrees。从 `effortLevel` 设置继承的工作量在该设置的后续编辑后跟随,而不是在调度时固定。打开一个已停止的会话(其对话已在另一个运行中的会话中打开)被拒绝并显示消息,而不是导致行失败。在 agent view 中不可用的命令在输入中保留已键入的文本。在 git 存储库外失败的 `WorktreeCreate` hook 不再阻止会话编辑文件。 |

1099| v2.1.202 | 使用 `/rename` 或 `Ctrl+R` 在后台会话上设置的名称在监督进程停止并重新启动其进程时保持不变,而不是恢复为会话调度时的名称。 |

1100| v2.1.200 | 重写 `roster.json` 中会话列表的较旧 Claude Code 版本保留由较新版本写入的字段,与现有的 `state.json` 保证相匹配,因此由较新版本启动的会话在监督进程重新启动后继续接受输入。当你打开已停止响应的会话时,监督进程重新启动其进程,会话从中断处继续响应。Agent view 应用放在 `agents` 后的 `--plugin-dir` 标志到其自己的子代理和 skill 自动完成在调度输入中以及调度的会话。 |

822| v2.1.199 | 后台会话的进程在低内存主机上完成启动前退出时,其行状态显示 `possibly low memory — free some up and retry` 而不仅仅是裸退出原因。使用 `←` 或 `/background` 后台会话时将其 `/color` 转移到新行。 |1101| v2.1.199 | 后台会话的进程在低内存主机上完成启动前退出时,其行状态显示 `possibly low memory — free some up and retry` 而不仅仅是裸退出原因。使用 `←` 或 `/background` 后台会话时将其 `/color` 转移到新行。 |

823| v2.1.198 | Agent view 在后台会话需要输入、完成或失败时通过 `preferredNotifChannel` 发送通知,并使用 `agent_needs_input` 或 `agent_completed` 类型触发 `Notification` hook。`←` 和 `/exit` 在 `claude attach <id>` 内返回 agent view 而不是退出到 shell;`Ctrl+Z` 返回到 shell。后台会话在 worktree 中隔离其工作,提交、推送其自己的隔离分支,从不 `main` 或 `master`,并在完成时打开草稿拉取请求而不是先询问。`/login` 在 agent view 中运行并打开登录对话框。`Background work is running` 退出对话框提供 `Move to background and exit`。退出交付也涵盖后台子代理,它们在下次唤醒时从其记录恢复,而不是被报告为失败。`claude --bg` 与 `-p` 或 `--print` 结合被拒绝并出现错误。 |1102| v2.1.198 | Agent view 在后台会话需要输入、完成或失败时通过 `preferredNotifChannel` 发送通知,并使用 `agent_needs_input` 或 `agent_completed` 类型触发 `Notification` hook。`←` 和 `/exit` 在 `claude attach <id>` 内返回 agent view 而不是退出到 shell;`Ctrl+Z` 返回到 shell。后台会话在 worktree 中隔离其工作,提交、推送其自己的隔离分支,从不 `main` 或 `master`,并在完成时打开草稿拉取请求而不是先询问。`/login` 在 agent view 中运行并打开登录对话框。`Background work is running` 退出对话框提供 `Move to background and exit`。退出交付也涵盖后台子代理,它们在下次唤醒时从其记录恢复,而不是被报告为失败。`claude --bg` 与 `-p` 或 `--print` 结合被拒绝并出现错误。后台会话主机在首次 LAN 访问时请求 macOS 本地网络权限,而不是失败,出现 `connect: no route to host`。 |

824| v2.1.196 | 单次 `←` 按压后台前台会话;早期版本需要两次按压,带有页脚提示和确认。`--dangerously-skip-permissions` 传递给 `claude agents` 显示绕过免责声明而不是被默默丢弃。你从未命名的交互式会话在会话列表和 `claude agents --json` 中携带默认名称,例如 `my-app-3f`。后台 shell 命令和动态工作流在会话的进程被停止、重新启动或更新时存活,包括在 Windows 上;设置 `CLAUDE_CODE_DISABLE_BG_EXIT_HANDOFF=1` 关闭交付。在重新启动时误读为空的记录被重命名为 `.orphaned-` 后缀而不是删除。 |1103| v2.1.196 | 单次 `←` 按压后台前台会话;早期版本需要两次按压,带有页脚提示和确认。`--dangerously-skip-permissions` 传递给 `claude agents` 显示绕过免责声明,而不是被无声地丢弃。你从未命名的交互式会话在会话列表和 `claude agents --json` 中携带默认名称,例如 `my-app-3f`。后台 shell 命令和动态工作流在会话的进程被停止、重新启动或更新时存活,包括在 Windows 上;设置 `CLAUDE_CODE_DISABLE_BG_EXIT_HANDOFF=1` 关闭交付。在重新启动时误读为空的记录被重命名为 `.orphaned-` 后缀,而不是删除。 |

825| v2.1.195 | 进行中的工作在 Windows 上后台会话时也转移;设置 `CLAUDE_DISABLE_ADOPT=1` 改为停止它。`Completed` 组填充剩余的垂直空间,标题在短终端上压缩。较旧的 Claude Code 版本不再丢弃较新会话的 `state.json` 字段或从 `claude agents` 隐藏这些会话。附加到停止的会话立即切换而不是显示空白屏幕长达五秒。无法接受连接的监督进程自行退出并释放其锁。 |1104| v2.1.195 | 进行中的工作在 Windows 上后台会话时也转移;设置 `CLAUDE_DISABLE_ADOPT=1` 改为停止它。`Completed` 组填充剩余的垂直空间,标题在短终端上压缩。较旧的 Claude Code 版本不再丢弃较新会话的 `state.json` 字段或从 `claude agents` 隐藏这些会话。附加到停止的会话立即切换,而不是显示空白屏幕长达五秒。无法接受连接的监督进程自行退出并释放其锁。 |

1105| v2.1.191 | `claude --bg` 与不匹配你任何子代理的 `--agent` 名称失败启动:会话立即退出,出现 `--agent '<name>' not found` 错误,而不是使用默认代理运行。 |

826| v2.1.174 | 后台会话不再从监督进程的启动 shell 继承网关端点变量如 `ANTHROPIC_BASE_URL`;监督进程向预热工作进程提供新的凭证快照,修复虚假的 `Could not resolve authentication method` 错误。 |1106| v2.1.174 | 后台会话不再从监督进程的启动 shell 继承网关端点变量如 `ANTHROPIC_BASE_URL`;监督进程向预热工作进程提供新的凭证快照,修复虚假的 `Could not resolve authentication method` 错误。 |

827| v2.1.172 | 调度输入中的 `/model` 设置会话范围的调度模型覆盖。 |1107| v2.1.172 | 调度输入中的 `/model` 设置会话范围的调度模型覆盖。 |

828| v2.1.161 | 行摘要显示并行工作项的 `done/total` 计数;窥视面板命名最长运行的并行工作项。 |1108| v2.1.161 | 行摘要显示并行工作项的 `done/total` 计数;窥视面板命名最长运行的并行工作项。 |

agents.md +1 −1

Details

19 19 

20三个更多的工具支持这项工作,但它们本身不是运行代理的方式:20三个更多的工具支持这项工作,但它们本身不是运行代理的方式:

21 21 

22* [Worktrees](/docs/zh-CN/worktrees) 为每个会话提供单独的 git 检出,因此并行会话永远不会编辑相同的文件。将它们用于您自己运行的会话。代理视图会自动将每个分派的会话移到自己的 worktree 中,您生成的子代理也可以各自获得一个。22* [Worktrees](/docs/zh-CN/worktrees) 为每个会话提供单独的 git 检出,因此并行会话永远不会编辑相同的文件。将它们用于您自己运行的会话。代理视图会 [在编辑文件之前将分派的会话移到自己的 worktree 中](/docs/zh-CN/agent-view#how-file-edits-are-isolated),您生成的子代理也可以各自获得一个。

23* [跨会话消息传递](/docs/zh-CN/cross-session-messaging) 让 Claude 列出并消息传递您在这台机器上、另一台机器上或 [Claude Code on the web](/docs/zh-CN/claude-code-on-the-web) 上的其他 Claude Code 会话,因此您自己运行的会话可以在彼此之间传递发现和状态。23* [跨会话消息传递](/docs/zh-CN/cross-session-messaging) 让 Claude 列出并消息传递您在这台机器上、另一台机器上或 [Claude Code on the web](/docs/zh-CN/claude-code-on-the-web) 上的其他 Claude Code 会话,因此您自己运行的会话可以在彼此之间传递发现和状态。

24* [`/batch`](/docs/zh-CN/commands) 是一个 [skill](/docs/zh-CN/skills),它让 Claude 将一个大型更改分成 5 到 30 个 worktree 隔离的子代理,每个都打开一个拉取请求。它是子代理和 worktrees 的打包使用,不是一个单独的协调风格。24* [`/batch`](/docs/zh-CN/commands) 是一个 [skill](/docs/zh-CN/skills),它让 Claude 将一个大型更改分成 5 到 30 个 worktree 隔离的子代理,每个都打开一个拉取请求。它是子代理和 worktrees 的打包使用,不是一个单独的协调风格。

25 25 

Details

265 265 

266为 Claude Code 启用 Amazon Bedrock 时,请记住以下几点:266为 Claude Code 启用 Amazon Bedrock 时,请记住以下几点:

267 267 

268* 从 v2.1.172 开始,您只需设置 `AWS_REGION` 来覆盖您的 AWS 配置文件的区域或当您的配置文件没有区域时。Claude Code 按以下顺序解析区域:268* 您只需设置 `AWS_REGION` 来覆盖您的 AWS 配置文件的区域或当您的配置文件没有区域时。Claude Code 按以下顺序解析区域:

269 269 

270 * `AWS_REGION`270 * `AWS_REGION`

271 * `AWS_DEFAULT_REGION`271 * `AWS_DEFAULT_REGION`


276 276 

277 活跃配置文件是 `AWS_PROFILE`(如果已设置),否则为 `default`。设置 `AWS_SHARED_CREDENTIALS_FILE` 或 `AWS_CONFIG_FILE` 以指向非默认文件路径。277 活跃配置文件是 `AWS_PROFILE`(如果已设置),否则为 `default`。设置 `AWS_SHARED_CREDENTIALS_FILE` 或 `AWS_CONFIG_FILE` 以指向非默认文件路径。

278 278 

279 运行 `/status` 以查看解析的区域。当区域来自您的 AWS 配置文件或默认回退时,Claude Code 也会在 `/status` 输出中注明源。在 v2.1.171 及更早版本上,Claude Code 不读取 AWS 配置文件,因此请显式设置 `AWS_REGION`。279 运行 `/status` 以查看解析的区域。当区域来自您的 AWS 配置文件或默认回退时,Claude Code 也会在 `/status` 输出中注明源。

280* 使用 Amazon Bedrock 时,`/logout` 命令不可用,因为身份验证通过 AWS 凭证处理。280* 使用 Amazon Bedrock 时,`/logout` 命令不可用,因为身份验证通过 AWS 凭证处理。

281* WebSearch 工具在 Amazon Bedrock 上不可用。请参阅 [WebSearch 工具行为](/docs/zh-CN/tools-reference#websearch-tool-behavior)。281* WebSearch 工具在 Amazon Bedrock 上不可用。请参阅 [WebSearch 工具行为](/docs/zh-CN/tools-reference#websearch-tool-behavior)。

282* 您可以对不想泄露给其他进程的环境变量(如 `AWS_PROFILE`)使用设置文件。有关更多信息,请参阅[设置](/docs/zh-CN/settings)。282* 您可以对不想泄露给其他进程的环境变量(如 `AWS_PROFILE`)使用设置文件。有关更多信息,请参阅[设置](/docs/zh-CN/settings)。


531export AWS_REGION=us-east-1531export AWS_REGION=us-east-1

532```532```

533 533 

534Claude Code 从 AWS 区域构造端点 URL。从 v2.1.172 开始,区域的解析优先级与[上面的 Amazon Bedrock](#3-configure-claude-code) 相同;较早的版本仅使用 `AWS_REGION`。要为自定义端点或网关覆盖 URL,请设置 `ANTHROPIC_BEDROCK_MANTLE_BASE_URL`。534Claude Code 从 AWS 区域构造端点 URL,使用与[上面的 Amazon Bedrock](#3-configure-claude-code) 相同的优先级解析。要为自定义端点或网关覆盖 URL,请设置 `ANTHROPIC_BEDROCK_MANTLE_BASE_URL`。

535 535 

536在 Claude Code 内运行 `/status` 来确认。当 Mantle 处于活动状态时,提供者行显示 `Amazon Bedrock (Mantle)`。536在 Claude Code 内运行 `/status` 来确认。当 Mantle 处于活动状态时,提供者行显示 `Amazon Bedrock (Mantle)`。

537 537 

analytics.md +5 −11

Details

26* **排行榜**:按 Claude Code 使用情况排名的顶级贡献者26* **排行榜**:按 Claude Code 使用情况排名的顶级贡献者

27* **数据导出**:将贡献数据下载为 CSV 格式以进行自定义报告27* **数据导出**:将贡献数据下载为 CSV 格式以进行自定义报告

28 28 

29对于每个用户的令牌计数和成本估计,请配置 [OpenTelemetry 导出](/zh-CN/monitoring-usage),或从您组织的分析设置中导出 [支出报告](https://support.claude.com/en/articles/12883420-view-usage-analytics-for-team-and-enterprise-plans),其中列出了每个用户和每个模型的令牌使用情况和估计的使用额度支出。29对于每个用户的令牌计数和成本估计,请配置 [OpenTelemetry 导出](/docs/zh-CN/monitoring-usage),或从您组织的分析设置中导出 [支出报告](https://support.claude.com/en/articles/12883420-view-usage-analytics-for-team-and-enterprise-plans),其中列出了每个用户和每个模型的令牌使用情况和估计的使用额度支出。

30 30 

31<h3 id="enable-contribution-metrics">31<h3 id="enable-contribution-metrics">

32 启用贡献指标32 启用贡献指标


41您需要所有者角色来配置分析设置。GitHub 管理员必须安装 GitHub 应用。41您需要所有者角色来配置分析设置。GitHub 管理员必须安装 GitHub 应用。

42 42 

43<Warning>43<Warning>

44 启用了 [Zero Data Retention](/zh-CN/zero-data-retention) 的组织无法使用贡献指标。分析仪表板将仅显示使用指标。44 启用了 [Zero Data Retention](/docs/zh-CN/zero-data-retention) 的组织无法使用贡献指标。分析仪表板将仅显示使用指标。

45</Warning>45</Warning>

46 46 

47<Steps>47<Steps>


139 139 

140启用贡献指标后,Claude Code 会分析已合并的拉取请求,以确定哪些代码是使用 Claude Code 协助编写的。这是通过将 Claude Code 会话活动与每个 PR 中的代码进行匹配来完成的。140启用贡献指标后,Claude Code 会分析已合并的拉取请求,以确定哪些代码是使用 Claude Code 协助编写的。这是通过将 Claude Code 会话活动与每个 PR 中的代码进行匹配来完成的。

141 141 

142<h4 id="tagging-criteria">

143 标记标准

144</h4>

145 

146如果 PR 包含在 Claude Code 会话期间编写的至少一行代码,则将其标记为"带 Claude Code"。系统使用保守匹配:仅计算有高度信心涉及 Claude Code 的代码。

147 

148<h4 id="attribution-process">142<h4 id="attribution-process">

149 归属过程143 归属过程

150</h4>144</h4>


267 相关资源261 相关资源

268</h2>262</h2>

269 263 

270* [使用 OpenTelemetry 进行监控](/zh-CN/monitoring-usage):将实时指标和事件导出到您的可观测性堆栈264* [使用 OpenTelemetry 进行监控](/docs/zh-CN/monitoring-usage):将实时指标和事件导出到您的可观测性堆栈

271* [有效管理成本](/zh-CN/costs):设置支出限制并优化令牌使用265* [有效管理成本](/docs/zh-CN/costs):设置支出限制并优化令牌使用

272* [权限](/zh-CN/permissions):配置角色和权限266* [权限](/docs/zh-CN/permissions):配置角色和权限

artifacts.md +11 −9

Details

35 artifact 不是什么35 artifact 不是什么

36</h3>36</h3>

37 37 

38artifact 是工作的捕获:一个自包含的页面,没有后端,因此无法存储表单输入或提供多个路由,其在有人查看时访问外部数据的唯一途径是[调用 MCP 连接器](#pull-live-data-with-mcp-connectors)。对于具有后端的托管内部工具,请改为在您自己的基础设施上部署它。有关完整的限制集,请参阅[页面约束](#page-constraints)。38artifact 是工作的捕获:一个自包含的页面,没有后端,因此无法提供多个路由。对于具有后端的托管内部工具,请改为在您自己的基础设施上部署它。有关完整的限制集,请参阅[页面约束](#page-constraints)。

39 39 

40<h2 id="create-an-artifact">40<h2 id="create-an-artifact">

41 创建工件41 创建工件


328| 约束 | 效果 |328| 约束 | 效果 |

329| :---- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |329| :---- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

330| 外部请求 | 页面可以从 Google Fonts 加载字体,以及从[四个公共 CDN 主机](#allowlist-the-viewer-domain)加载脚本:cdnjs、Tailwind 和 jQuery CDN,以及 jsDelivr 上的选定路径,例如 `/npm/`。CSP 阻止所有外部图像和所有其他外部脚本、样式表和字体,并让 `fetch`、XHR 和 WebSocket 调用仅到达页面自身的源和 Google Fonts 主机。因此,Claude 从这些 CDN 之一加载页面需要的任何库,内联所有其他 CSS 和 JavaScript,并将图像嵌入为数据 URI。[连接器调用](#pull-live-data-with-mcp-connectors)通过 claude.ai 进行,它自己进行网络调用。 |330| 外部请求 | 页面可以从 Google Fonts 加载字体,以及从[四个公共 CDN 主机](#allowlist-the-viewer-domain)加载脚本:cdnjs、Tailwind 和 jQuery CDN,以及 jsDelivr 上的选定路径,例如 `/npm/`。CSP 阻止所有外部图像和所有其他外部脚本、样式表和字体,并让 `fetch`、XHR 和 WebSocket 调用仅到达页面自身的源和 Google Fonts 主机。因此,Claude 从这些 CDN 之一加载页面需要的任何库,内联所有其他 CSS 和 JavaScript,并将图像嵌入为数据 URI。[连接器调用](#pull-live-data-with-mcp-connectors)通过 claude.ai 进行,它自己进行网络调用。 |

331| 无后端 | 工件是一个静态页面。它无法存储通过表单提交的数据或自行对查看者进行身份验证。它在有人查看时获取数据的唯一方式是[调用 MCP 连接器](#pull-live-data-with-mcp-connectors),而不是它自己的 API。 |331| 无后端 | 工件是一个静态页面。它无法自行对查看者进行身份验证。 |

332| 下载 | 页面无法自行启动下载。为了让查看者保存页面生成的文件,Claude 声明下载功能。请参阅[提供文件下载](#offer-a-file-download)。 |332| 下载 | 页面无法自行启动下载。为了让查看者保存页面生成的文件,Claude 声明下载功能。请参阅[提供文件下载](#offer-a-file-download)。 |

333| 单页面 | 相对链接无法解析,因为页面旁边没有部署任何内容。对于多部分内容,Claude 使用页面内锚点而不是单独的文件。 |333| 单页面 | 相对链接无法解析,因为页面旁边没有部署任何内容。对于多部分内容,Claude 使用页面内锚点而不是单独的文件。 |

334| 源文件类型 | 发布的文件必须是 `.html`、`.htm` 或 `.md`。Markdown 文件呈现为样式化的 HTML。 |334| 源文件类型 | 发布的文件必须是 `.html`、`.htm` 或 `.md`,并且必须解码为 UTF-8,或通过其字节顺序标记解码为小端 UTF-16。Markdown 文件呈现为样式化的 HTML。无法解码或包含替换字符 `U+FFFD` 的文件会被[拒绝并显示要修复的行和列](/docs/zh-CN/errors#the-source-file-is-not-valid-utf-8-text)。 |

335| 呈现大小 | 呈现的页面必须为 16 MiB 或更小。大型嵌入图像通常是发布因大小而失败的原因。 |335| 呈现大小 | 呈现的页面必须为 16 MiB 或更小。大型嵌入图像通常是发布因大小而失败的原因。 |

336 336 

337生成工件使用输出令牌,就像任何其他响应一样,样式化页面比相同内容作为终端文本更耗费令牌。内联 CSS、用于交互控制的 JavaScript,尤其是嵌入为数据 URI 的图像是主要贡献者。要减少工件的令牌成本:337生成工件使用输出令牌,就像任何其他响应一样,样式化页面比相同内容作为终端文本更耗费令牌。内联 CSS、用于交互控制的 JavaScript,尤其是嵌入为数据 URI 的图像是主要贡献者。要减少工件的令牌成本:


358 禁用 artifacts358 禁用 artifacts

359</h2>359</h2>

360 360 

361要根据您组织的设置为您自己的会话关闭 artifacts,请使用以下任何一种:361要为您自己的会话关闭 artifacts,无论您的组织设置如何,请使用以下任何一种方法:

362 362 

363| 方法 | 设置 |363| 位置 | 操作 |

364| :--------------------------- | :---------------------------------------------------------------------------------------------------- |364| :----------------------------- | :---------------------------------------------------------------------------------------------------- |

365| [`/config`](/docs/zh-CN/commands) | 关闭 **Artifacts** 行,这会将 [`"enableArtifact": false`](/docs/zh-CN/settings-reference#enableartifact) 写入您的用户设置 |365| [`/config`](/docs/zh-CN/commands) | 关闭 **Artifacts** 行,这会将 [`"enableArtifact": false`](/docs/zh-CN/settings-reference#enableartifact) 写入您的用户设置 |

366| [设置文件](/docs/zh-CN/settings) | 设置 `"enableArtifact": false`。已弃用的 `"disableArtifact": true` 也会关闭 artifacts |366| [Settings 文件](/docs/zh-CN/settings) | 设置 `"enableArtifact": false`。已弃用的 `"disableArtifact": true` 也会关闭 artifacts |

367| [环境变量](/docs/zh-CN/env-vars) | 设置 `CLAUDE_CODE_DISABLE_ARTIFACT=1` |367| [环境变量](/docs/zh-CN/env-vars) | 设置 `CLAUDE_CODE_DISABLE_ARTIFACT=1` |

368| [权限规则](/docs/zh-CN/permissions) | 将 `Artifact` 添加到 `permissions.deny` |368| [权限规则](/docs/zh-CN/permissions) | 将 `Artifact` 添加到 `permissions.deny` |

369 369 

370在 [`--settings`](/docs/zh-CN/cli-reference#cli-flags) 文件中或使用 `CLAUDE_CODE_DISABLE_ARTIFACT` 关闭 artifacts 后,或您的管理员在[托管设置](/docs/zh-CN/server-managed-settings)中关闭它们后,没有设置文件可以将其重新打开。在 v2.1.242 之前,[优先级堆栈](/docs/zh-CN/settings#settings-precedence)中较高位置的文件可以重新打开 artifacts,即使较低优先级的文件设置了 `"enableArtifact": false`。370一旦您在 [`--settings`](/docs/zh-CN/cli-reference#cli-flags) 文件中或使用 `CLAUDE_CODE_DISABLE_ARTIFACT` 关闭 artifacts,或您的管理员在[托管设置](/docs/zh-CN/server-managed-settings)中关闭它们,任何设置文件都无法将其重新打开。在 v2.1.242 之前,[优先级堆栈](/docs/zh-CN/settings#settings-precedence)中较高位置的文件可能会重新打开 artifacts,即使较低优先级的文件设置了 `"enableArtifact": false`。

371 371 

372您也可以在项目的 `.claude/settings.json` 或 `.claude/settings.local.json` 中设置 `"enableArtifact": false` 来为该项目中的会话关闭 artifacts。任何文件中的 `"enableArtifact": true` 都不会将其重新打开。在项目和本地设置中支持该键需要 Claude Code v2.1.242 或更高版本。372您也可以在项目的 `.claude/settings.json` 或 `.claude/settings.local.json` 中设置 `"enableArtifact": false` 来为该项目中的会话关闭 artifacts。任何文件中的 `"enableArtifact": true` 都不会将其重新打开。在项目和本地设置中支持此键需要 Claude Code v2.1.242 或更高版本。

373 

374如果您添加了没有 `domain:` 部分的 `WebFetch` deny 或 ask 规则,它不会关闭 artifacts 或阻止 artifact 读取。[`permissions` 中 `deny` 或 `ask` 中的 `WebFetch(domain:claude.ai)` 规则确实适用于 artifact 读取](/docs/zh-CN/permissions#allow-or-deny-every-fetch)。

373 375 

374<h2 id="manage-artifacts-for-your-organization">376<h2 id="manage-artifacts-for-your-organization">

375 为您的组织管理 artifacts377 为您的组织管理 artifacts

authentication.md +117 −23

Details

12 登录 Claude Code12 登录 Claude Code

13</h2>13</h2>

14 14 

15[安装 Claude Code](/docs/zh-CN/setup#install-claude-code) 后,在终端中运行 `claude`。首次启动时,Claude Code 会打开浏览器窗口供您登录。15[安装 Claude Code](/docs/zh-CN/setup#install-claude-code) 后,在终端中运行 `claude`。首次启动时,Claude Code 会打开浏览器窗口供您登录。如果您已设置 `ANTHROPIC_API_KEY` 环境变量,Claude Code 会跳过登录提示,改为要求您批准该密钥。

16 16 

17如果浏览器没有自动打开,请按 `c` 将登录 URL 复制到剪贴板,然后将其粘贴到浏览器中。17如果浏览器没有自动打开,请按 `c` 将登录 URL 复制到剪贴板,然后将其粘贴到浏览器中。

18 18 


24 24 

25* **Claude Pro 或 Max 订阅**:使用您的 Claude.ai 账户登录。在 [claude.com/pricing](https://claude.com/pricing?utm_source=claude_code\&utm_medium=docs\&utm_content=authentication_pro_max) 订阅。25* **Claude Pro 或 Max 订阅**:使用您的 Claude.ai 账户登录。在 [claude.com/pricing](https://claude.com/pricing?utm_source=claude_code\&utm_medium=docs\&utm_content=authentication_pro_max) 订阅。

26* **Claude for Teams 或 Enterprise**:使用您的团队管理员邀请您的 Claude.ai 账户登录。26* **Claude for Teams 或 Enterprise**:使用您的团队管理员邀请您的 Claude.ai 账户登录。

27* **Claude Console**:使用您的 Console 凭证登录。您的管理员必须先 [邀请您](#claude-console-authentication)。27* **Claude Console**:使用您的 Console 凭证登录。您的管理员必须先 [邀请您](#claude-console-authentication)。您可以在有或没有 [创建 API 密钥](#sign-in-without-an-api-key) 的情况下登录。

28* **云提供商**:如果您的组织使用 [Amazon Bedrock](/docs/zh-CN/amazon-bedrock)、[Google Cloud's Agent Platform](/docs/zh-CN/google-vertex-ai) 或 [Microsoft Foundry](/docs/zh-CN/microsoft-foundry),请在运行 `claude` 之前设置所需的环境变量,或在登录提示符处选择 **3rd-party platform**,这将为 Bedrock 和 Vertex AI 启动交互式设置向导。不需要浏览器登录。28* **云提供商**:如果您的组织使用 [Amazon Bedrock](/docs/zh-CN/amazon-bedrock)、[Google Cloud's Agent Platform](/docs/zh-CN/google-vertex-ai) 或 [Microsoft Foundry](/docs/zh-CN/microsoft-foundry),请在运行 `claude` 之前设置所需的环境变量,或在登录提示符处选择 **3rd-party platform**,这将为 Bedrock 和 Vertex AI 启动交互式设置向导。不需要浏览器登录。

29* **云网关**:如果您的组织运行自托管的 [Claude apps gateway](/docs/zh-CN/claude-apps-gateway),请通过 `/login` 使用企业 SSO 登录。网关颁发的令牌是会话的唯一凭证。29* **云网关**:如果您的组织运行自托管的 [Claude apps gateway](/docs/zh-CN/claude-apps-gateway),请通过 `/login` 使用企业 SSO 登录。网关颁发的令牌是会话的唯一凭证。

30 30 

31管理员可以使用 [`forceLoginMethod` 和 `forceLoginOrgUUID`](/docs/zh-CN/settings#available-settings) 托管设置来限制交互式登录。当设置其中任何一个时,由 `ANTHROPIC_API_KEY`、`ANTHROPIC_AUTH_TOKEN` 或 `apiKeyHelper` 进行身份验证的会话在启动时会被阻止;云提供商会话不受影响。31管理员可以指导开发人员使用哪种登录方法,并要求 claude.ai 登录属于特定组织;请参阅 [限制登录到您的组织](#restrict-login-to-your-organization)。

32 32 

33要登出并重新身份验证,请在 Claude Code 提示符处输入 `/logout`。登出还会重置您的首次启动设置状态,因此下次运行 `claude` 时,它会再次引导您完成登录和设置。33要登出并重新身份验证,请在 Claude Code 提示符处输入 `/logout`。登出还会重置您的首次启动设置状态,因此下次运行 `claude` 时,它会再次引导您完成登录和设置。

34 34 


105 </Step>105 </Step>

106</Steps>106</Steps>

107 107 

108<h4 id="sign-in-without-an-api-key">

109 无需 API 密钥登录

110</h4>

111 

112您可以无需创建 API 密钥即可登录到您的 Console 账户,即使您的组织不允许开发人员创建 API 密钥。在 `/login` 提示符处选择 Anthropic Console 账户,Claude Code 会询问您想如何登录。需要 Claude Code v2.1.242 或更高版本。两种路由都会在浏览器中将您登录到 Console,但在 Claude Code 之后存储的内容不同:

113 

114* **使用您的 Console 账户登录**,标记为 `(recommended)`:Claude Code 保留该登录的 OAuth 令牌,并将其存储为 [Anthropic 配置文件](#anthropic-profiles-and-federation-credentials)。它不创建 API 密钥

115* **创建 API 密钥**,标记为 `(legacy)`:Claude Code 为您创建 Console API 密钥,并将其与您的其他凭证一起存储

116 

117实际上,配置文件存储 OAuth 登录,而 API 密钥是静态凭证:Claude Code 自动刷新配置文件的登录,当刷新失败时,请求会失败并显示 [Anthropic 配置文件登录已过期](/docs/zh-CN/errors#anthropic-profile-login-expired),直到您再次登录。

118 

119您不会在每台机器上都获得选择。Claude Code 在以下情况下会在不询问的情况下创建 API 密钥:

120 

121* 您针对云提供商运行,例如 [Amazon Bedrock、Google Cloud's Agent Platform 或 Microsoft Foundry](/docs/zh-CN/third-party-integrations) 或 [AWS 上的 Claude Platform](/docs/zh-CN/claude-platform-on-aws)

122* 任何设置文件设置 [`forceLoginOrgUUID`](#restrict-login-to-your-organization),或将 `forceLoginMethod` 设置为 `"claudeai"` 或 `"console"`

123* 您机器上存在托管设置源(例如托管设置文件、MDM 配置文件或缓存的服务器托管设置),但 Claude Code [无法读取它](/docs/zh-CN/managed-settings#invalid-entries-in-managed-settings),且没有其他托管源提供策略

124 

125在无密钥登录之前取消设置 `ANTHROPIC_API_KEY`。由 Claude Code 自己的 Console 登录或由 Claude Platform CLI 的 `ant auth login` 编写的配置文件是相同类型的凭证,因此再次登录会替换它。

126 

127无密钥登录后,您拥有配置文件而不是存储的 API 密钥:

128 

129* **它写入的配置文件**:Claude Code 写入由 `ANTHROPIC_PROFILE` 命名的配置文件,或您的活跃配置文件,或 `default`。如果该配置文件是联合配置文件,Claude Code 会拒绝登录而不是覆盖它

130* **它将您登出的内容**:Claude Code 将您登出存储在机器上的任何 claude.ai 登录

131* **如何撤销它**:运行 `/logout`,它会删除并撤销此登录写入的凭证

132 

133如果您的组织使用 [服务器托管设置](/docs/zh-CN/server-managed-settings),它们会在 Claude Code v2.1.257 或更高版本上应用于此登录。

134 

135关于配置文件的所有其他内容都适用于此登录,包括它在您的其他凭证中的排名、您在 `/status` 中获得的 `Profile` 行,以及需要 claude.ai 登录的功能。请参阅 [Anthropic 配置文件和联合凭证](#anthropic-profiles-and-federation-credentials)。

136 

108<h3 id="cloud-provider-authentication">137<h3 id="cloud-provider-authentication">

109 云提供商身份验证138 云提供商身份验证

110</h3>139</h3>


125 </Step>154 </Step>

126</Steps>155</Steps>

127 156 

157<h3 id="restrict-login-to-your-organization">

158 限制登录到您的组织

159</h3>

160 

161要求开发人员的 claude.ai 登录属于特定的 Anthropic 组织,请在 [托管设置](/docs/zh-CN/managed-settings) 中设置 [`forceLoginMethod`](/docs/zh-CN/settings-reference#forceloginmethod) 和 [`forceLoginOrgUUID`](/docs/zh-CN/settings-reference#forceloginorguuid)。将 `forceLoginOrgUUID` 设置为您的组织 ID,该 ID 显示在 [claude.ai 管理员设置](https://claude.ai/admin-settings/organization) 中,适用于 Claude for Teams 或 Enterprise 组织。Claude Code 会为任何其他组织的 claude.ai 登录报告错误,如果使用中的 claude.ai 凭证属于未列出的组织,则在启动时退出。

162 

163对于 Claude Console 登录,当您将其设置为单个 Console 组织 ID(显示在 [platform.claude.com/settings/organization](https://platform.claude.com/settings/organization))时,Claude Code 使用 `forceLoginOrgUUID` 在 Console 登录页面上预选组织。它不检查生成的 Console 凭证属于哪个组织,无论是在登录时还是在启动时,在您部署密钥之前使用 Console 账户登录的开发人员会保持登录状态。

164 

165如果您在任何设置文件中设置 `forceLoginOrgUUID`,Claude Code 会停止在该文件适用的会话中提供 [无密钥 Console 登录](#sign-in-without-an-api-key),而是创建 API 密钥。要将开发人员定向到 claude.ai 登录,请将 `forceLoginMethod` 设置为 `"claudeai"`。

166 

167开发人员可以从多个路径登录:终端 `/login` 流程、[VS Code 扩展](/docs/zh-CN/vs-code)、Agent SDK、`claude setup-token`、`/install-github-app` 和 [网关](/docs/zh-CN/claude-apps-gateway) 登录,适用于通过云网关路由的组织。在 Claude Code v2.1.212 或更高版本上,每个路径都应用 `forceLoginMethod`;在 v2.1.212 之前,只有终端登录应用任一密钥。在终端的交互式登录屏幕上,通过 `/login` 或首次运行入门到达,Claude Code 预选 `claudeai` 或 `console` 方法而不强制执行,因此即使设置了 `forceLoginMethod` 为 `"claudeai"`,开发人员仍然可以在那里完成 Console 登录。这些路径在 `forceLoginOrgUUID` 上有所不同:

168 

169* **终端、VS Code 扩展和 Agent SDK 登录**:验证 claude.ai 账户登录的 `forceLoginOrgUUID`

170* **`claude setup-token` 和 `/install-github-app`**:仅强制执行 `forceLoginMethod`,因此它们可以在不同的组织中铸造令牌

171* **[网关](/docs/zh-CN/claude-apps-gateway) 登录**:由 `forceLoginMethod: "gateway"` 选择而不是受其限制,并且不针对 Anthropic 组织进行身份验证,因此 `forceLoginOrgUUID` 不适用;使用您的网关身份提供商来限制访问

172 

173通过您的设备管理工具部署密钥。[服务器托管设置](/docs/zh-CN/server-managed-settings) 仅到达已经通过您的组织身份验证的账户,因此它们无法重定向开发人员的首次登录。如果您的组织也分发服务器托管设置,请在两个地方设置密钥:托管设置源 [不合并](/docs/zh-CN/server-managed-settings#settings-precedence),缓存的服务器托管设置替换设备托管文件,除了两种密钥仍然从失败的源填充:

174 

175* **`env` 块**:在 Claude Code v2.1.223 或更高版本中 [按密钥合并](/docs/zh-CN/server-managed-settings#per-key-exceptions-across-managed-sources)

176* **[跨源锁定密钥](/docs/zh-CN/server-managed-settings#per-key-exceptions-across-managed-sources)**:从任何管理员源获得认可

177 

178`forceLoginMethod` 和 `forceLoginOrgUUID` 都不是,所以在两个地方都保留它们。

179 

180这些密钥还决定不使用登录凭证的会话是否可以启动。有关完整行为,请参阅设置参考中的 [`forceLoginOrgUUID`](/docs/zh-CN/settings-reference#forceloginorguuid)。

181 

182* **`ANTHROPIC_API_KEY`、`ANTHROPIC_AUTH_TOKEN` 或 `apiKeyHelper`**:在启动时被阻止,因为无法验证环境凭证的组织成员身份

183* **云提供商会话,例如 Amazon Bedrock**:不被阻止,因为它们针对您的云提供商进行身份验证。通过您的云 IAM 策略限制这些

184* **[Anthropic 配置文件或联合凭证](#anthropic-profiles-and-federation-credentials)**:不被阻止,密钥不检查配置文件属于哪个组织

185 

128<h2 id="credential-management">186<h2 id="credential-management">

129 凭证管理187 凭证管理

130</h2>188</h2>


132Claude Code 安全地管理您的身份验证凭证:190Claude Code 安全地管理您的身份验证凭证:

133 191 

134* **存储位置**:192* **存储位置**:

135 * 在 macOS 上,凭证存储在加密的 macOS Keychain 中。193 * 在 macOS 上,凭证存储在加密的 macOS Keychain 中。当 Keychain 拒绝写入时,例如在 SSH 会话中被锁定时,Claude Code 会改为将您的登录存储在 `~/.claude/.credentials.json` 中,文件模式为 `0600`,这与它在 Linux 上使用的存储相同。使用 Console 登录创建 API 密钥的操作会失败,直到 Keychain 可写。要将您的登录移回 Keychain,请按照[恢复步骤](/docs/zh-CN/troubleshoot-install#not-logged-in-or-token-expired)进行操作。

136 * 在 Linux 上,凭证存储在 `~/.claude/.credentials.json` 中,文件模式为 `0600`。194 * 在 Linux 上,凭证存储在 `~/.claude/.credentials.json` 中,文件模式为 `0600`。

137 * 在 Windows 上,凭证存储在 `%USERPROFILE%\.claude\.credentials.json` 中,并继承您的用户配置文件目录的访问控制,默认情况下将文件限制为您的用户帐户。195 * 在 Windows 上,凭证存储在 `%USERPROFILE%\.claude\.credentials.json` 中,并继承您的用户配置文件目录的访问控制,默认情况下将文件限制为您的用户帐户。

138 * 如果您在 Linux 或 Windows 上设置了 `CLAUDE_CONFIG_DIR` 环境变量,`.credentials.json` 文件将位于该目录下。196 * 如果您设置了 `CLAUDE_CONFIG_DIR` 环境变量,Claude Code 会将 `.credentials.json` 文件保存在该目录下,包括 macOS 回退写入的文件,并且还会将 macOS Keychain 条目关键字设置为该目录,因此使用不同 `CLAUDE_CONFIG_DIR` 的会话会读取不同的条目。

139 * Claude Code 通过 `/login` 和 `/logout` 管理 `.credentials.json`。要通过自定义 API 端点路由请求,请改为设置 [`ANTHROPIC_BASE_URL`](/docs/zh-CN/env-vars) 环境变量。197 * Claude Code 通过 `/login` 和 `/logout` 管理 `.credentials.json`。要通过自定义 API 端点路由请求,请改为设置 [`ANTHROPIC_BASE_URL`](/docs/zh-CN/env-vars) 环境变量。

140* **支持的身份验证类型**:Claude.ai 凭证、Claude API 凭证、Microsoft Foundry Auth、Bedrock Auth、Vertex Auth 和 [Claude apps gateway](/docs/zh-CN/claude-apps-gateway) 会话令牌。198* **支持的身份验证类型**:Claude.ai 凭证、Claude API 凭证、Microsoft Foundry Auth、Bedrock Auth、Vertex Auth、Anthropic 配置文件和 [Workload Identity Federation](https://platform.claude.com/docs/en/manage-claude/workload-identity-federation) 凭证,以及 [Claude apps gateway](/docs/zh-CN/claude-apps-gateway) 会话令牌。

141* **自定义凭证脚本**:[`apiKeyHelper`](/docs/zh-CN/settings#available-settings) 设置可以配置为运行返回 API 密钥的 shell 脚本。199* **自定义凭证脚本**:配置 [`apiKeyHelper`](/docs/zh-CN/settings-reference#apikeyhelper) 设置以运行返回 API 密钥的 shell 脚本。

142* **刷新间隔**:默认情况下,`apiKeyHelper` 在 5 分钟后或在 HTTP 401 响应时调用。设置 `CLAUDE_CODE_API_KEY_HELPER_TTL_MS` 环境变量以获得自定义刷新间隔。200* **刷新间隔**:Claude Code 默认在五分钟后重新运行 `apiKeyHelper`。设置 `CLAUDE_CODE_API_KEY_HELPER_TTL_MS` 环境变量以获得自定义刷新间隔。有关 Claude Code 重新运行助手的其他情况,请参阅 [`apiKeyHelper`](/docs/zh-CN/settings-reference#apikeyhelper)。

143* **缓慢助手通知**:如果 `apiKeyHelper` 返回密钥需要超过 10 秒,Claude Code 会在提示栏中显示警告通知,显示经过的时间。如果您经常看到此通知,请检查您的凭证脚本是否可以优化。201* **缓慢助手通知**:如果 `apiKeyHelper` 返回密钥需要超过 10 秒,Claude Code 会在提示栏中显示警告通知,显示经过的时间。如果您经常看到此通知,请检查您的凭证脚本是否可以优化。

144* **助手失败**:当脚本以错误退出、超时或不输出任何内容时,请求在三次尝试内失败,并显示 [`Your apiKeyHelper script is failing`](/docs/zh-CN/errors#your-apikeyhelper-script-is-failing)。在 v2.1.208 之前,助手失败显示为通用 401,经过大约十次无声重试。202* **助手失败**:当脚本以错误退出、超时或不输出任何内容时,请求在三次尝试内失败,显示 [`Your apiKeyHelper script is failing`](/docs/zh-CN/errors#your-apikeyhelper-script-is-failing)。在 v2.1.208 之前,助手失败显示为通用 401,经过大约十次无声重试。

145 203 

146`apiKeyHelper`、`ANTHROPIC_API_KEY` 和 `ANTHROPIC_AUTH_TOKEN` 适用于 CLI 和包装它的表面,包括 VS Code 扩展、Agent SDK 和 GitHub Actions。Claude Desktop 和云会话不会调用 `apiKeyHelper` 或读取这些环境变量:它们使用 OAuth,除了运行 [第三方推理配置](/docs/zh-CN/llm-gateway-connect#desktop-app) 的桌面会话外,这些会话使用该配置的凭证进行身份验证。204`apiKeyHelper`、`ANTHROPIC_API_KEY` 和 `ANTHROPIC_AUTH_TOKEN` 适用于 CLI 和包装它的表面,包括 VS Code 扩展、Agent SDK 和 GitHub Actions。Claude Desktop 和云会话不会调用 `apiKeyHelper` 或读取这些环境变量:它们使用 OAuth,除了运行[第三方推理配置](/docs/zh-CN/llm-gateway-connect#desktop-app)的桌面会话外,这些会话使用该配置的凭证进行身份验证。

147 205 

148<h3 id="renew-an-expiring-login">206<h3 id="renew-an-expiring-login">

149 续期即将过期的登录207 续期即将过期的登录

150</h3>208</h3>

151 209 

152当您使用 `/login` 创建的登录在过期前五天内时,Claude Code 会在启动时显示警告:`您的登录将在 3 天后过期 · 运行 /login 以续期`。需要 Claude Code v2.1.203 或更高版本。210当您使用 `/login` 创建的登录在过期前三天内时,Claude Code 会在启动时显示警告:`Your login expires in 3 days · run /login to renew`。需要 Claude Code v2.1.203 或更高版本。在 v2.1.217 之前,警告在五天前出现。

153 211 

154运行 `/login` 以续期。该警告仅供参考,永远不会阻止请求:身份验证将继续工作,直到登录实际过期。登录生命周期本身不变;提前警告是 v2.1.203 添加的功能。212运行 `/login` 以续期。该警告仅供参考,永远不会阻止请求:身份验证将继续工作,直到登录实际过期。登录生命周期本身不变;提前警告是 v2.1.203 添加的功能。

155 213 

156一旦存储的登录过期且无法刷新,每个请求都会失败,显示 [`Login expired · Please run /login`](/docs/zh-CN/errors#login-expired),直到您再次登录。在 v2.1.206 之前,过期的登录显示为模型错误。214一旦存储的登录过期且无法刷新,每个模型请求都会失败,显示 [`Login expired · Please run /login`](/docs/zh-CN/errors#login-expired),直到您再次登录。在 v2.1.206 之前,Claude Code 将过期的登录报告为模型错误。

215 

216您可以在请求失败之前检查此状态:[`/status`](/docs/zh-CN/commands) 显示 `Login` 行,读取 `Expired — log in again`,加上它为过期登录保存的组织和电子邮件。该行仅在保存的 claude.ai 或 Claude Console 登录是活跃凭证时出现。该行需要 Claude Code v2.1.210 或更高版本。

157 217 

158该警告仅在 claude.ai 或 Claude Console 登录是活跃凭证时出现,而不是在云提供商、`ANTHROPIC_API_KEY`、`ANTHROPIC_AUTH_TOKEN` 或 `apiKeyHelper` 提供凭证时出现。218该警告仅在 claude.ai 或 Claude Console 登录是活跃凭证时出现,而不是在云提供商、`ANTHROPIC_API_KEY`、`ANTHROPIC_AUTH_TOKEN` 或 `apiKeyHelper` 提供凭证时出现。

159 219 

160对于运行无人值守的会话,提前续期最为重要。在 [agent view 中的后台会话](/docs/zh-CN/agent-view) 或 [Remote Control](/docs/zh-CN/remote-control) 会话一旦登录过期,就会停止进行,并且在您再次登录之前无法恢复。220对于运行无人值守的会话,提前续期最为重要。在 [agent view 中的后台会话](/docs/zh-CN/agent-view)或 [Remote Control](/docs/zh-CN/remote-control) 会话一旦凭证过期,就会停止进行,并且在您再次登录之前无法恢复。

161 221 

162<h3 id="authentication-precedence">222<h3 id="authentication-precedence">

163 身份验证优先级223 身份验证优先级


165 225 

166当存在多个凭证时,Claude Code 按以下顺序选择一个:226当存在多个凭证时,Claude Code 按以下顺序选择一个:

167 227 

1681. 云提供商凭证,当设置了 `CLAUDE_CODE_USE_BEDROCK`、`CLAUDE_CODE_USE_VERTEX` 或 `CLAUDE_CODE_USE_FOUNDRY` 时。有关设置,请参阅 [第三方集成](/docs/zh-CN/third-party-integrations)。2281. 云提供商凭证,当设置了 `CLAUDE_CODE_USE_BEDROCK`、`CLAUDE_CODE_USE_VERTEX` 或 `CLAUDE_CODE_USE_FOUNDRY` 时。有关设置,请参阅[第三方集成](/docs/zh-CN/third-party-integrations)。

1692. `ANTHROPIC_AUTH_TOKEN` 环境变量。作为 `Authorization: Bearer` 标头发送。当通过 [LLM 网关或代理](/docs/zh-CN/llm-gateway) 进行路由时使用此选项,该网关或代理使用持有者令牌而不是 Anthropic API 密钥进行身份验证。2292. `ANTHROPIC_AUTH_TOKEN` 环境变量。作为 `Authorization: Bearer` 标头发送。当通过[LLM 网关或代理](/docs/zh-CN/llm-gateway)进行路由时使用此选项,该网关或代理使用持有者令牌而不是 Anthropic API 密钥进行身份验证。

1703. `ANTHROPIC_API_KEY` 环境变量。作为 `X-Api-Key` 标头发送。用于直接 Anthropic API 访问,使用来自 [Claude Console](https://platform.claude.com) 的密钥。在交互模式下,系统会提示您一次批准或拒绝该密钥,您的选择会被记住。要稍后更改它,请使用 `/config` 中的"使用自定义 API 密钥"切换。该切换仅在 `ANTHROPIC_API_KEY` 在您的环境中设置时出现。在非交互模式(`-p`)下,当密钥存在时始终使用该密钥。2303. `ANTHROPIC_API_KEY` 环境变量。作为 `X-Api-Key` 标头发送。用于直接 Anthropic API 访问,使用来自 [Claude Console](https://platform.claude.com) 的密钥。在交互模式下,系统会提示您一次批准或拒绝该密钥,您的选择会被记住。要稍后更改它,请使用 `/config` 中的"使用自定义 API 密钥"切换。该切换仅在 `ANTHROPIC_API_KEY` 在您的环境中设置时出现。在非交互模式(`-p`)下,当密钥存在时始终使用该密钥。

1714. [`apiKeyHelper`](/docs/zh-CN/settings#available-settings) 脚本输出。用于动态或轮换凭证,例如从保管库获取的短期令牌。2314. [`apiKeyHelper`](/docs/zh-CN/settings-reference#apikeyhelper) 脚本输出。用于动态或轮换凭证,例如从保管库获取的短期令牌。

1725. `CLAUDE_CODE_OAUTH_TOKEN` 环境变量。由 [`claude setup-token`](#generate-a-long-lived-token) 生成的长期 OAuth 令牌。用于 CI 管道和脚本,其中浏览器登录不可用。2325. `CLAUDE_CODE_OAUTH_TOKEN` 环境变量。由 [`claude setup-token`](#generate-a-long-lived-token) 生成的长期 OAuth 令牌。用于 CI 管道和脚本,其中浏览器登录不可用。如果您在设置了该变量时运行 `/login`,Claude Code 会将当前会话切换到新登录,但在每个新会话中都会再次读取该变量,直到您从 shell 配置文件或[设置文件](/docs/zh-CN/settings)的 `env` 块中删除它。

1736. 来自 `/login` 的订阅 OAuth 凭证。这是 Claude Pro、Max、Team 和 Enterprise 用户的默认设置。2336. Anthropic 配置文件和联合凭证,即 `ant` CLI 和 Workload Identity Federation 使用的凭证。`ant auth login` 写入的配置文件仅在您在 `ANTHROPIC_PROFILE` 中命名它时才排在此处;否则它排在 `/login` 下方。请参阅 [Anthropic 配置文件和联合凭证](#anthropic-profiles-and-federation-credentials)。

2347. 来自 `/login` 的订阅 OAuth 凭证。这是 Claude Pro、Max、Team 和 Enterprise 用户的默认设置。

174 235 

175一个已签名的 [Claude apps gateway](/docs/zh-CN/claude-apps-gateway) 会话位于此列表之外:它是一个提供商选择,如 Amazon Bedrock 或 Google Cloud 的 Agent Platform,并且它优先于它们。当网关会话存在时,即使设置了 `CLAUDE_CODE_USE_BEDROCK`、`CLAUDE_CODE_USE_VERTEX` 或 `CLAUDE_CODE_USE_FOUNDRY`,CLI 也会使用网关令牌进行身份验证,上面的持有者令牌、API 密钥和 `apiKeyHelper` 条目不会被使用。236一个已签名的 [Claude apps gateway](/docs/zh-CN/claude-apps-gateway) 会话位于此列表之外:它是一个提供商选择,如 Amazon Bedrock 或 Google Cloud 的 Agent Platform,并且它优先于它们。当网关会话存在时,即使设置了 `CLAUDE_CODE_USE_BEDROCK`、`CLAUDE_CODE_USE_VERTEX` 或 `CLAUDE_CODE_USE_FOUNDRY`,CLI 也会使用网关令牌进行身份验证,上面的持有者令牌、API 密钥、`apiKeyHelper` 和配置文件等凭证源不会被使用。

176 237 

177如果您有活跃的 Claude 订阅,但环境中也设置了 `ANTHROPIC_API_KEY`,则 API 密钥在批准后优先。如果密钥属于已禁用或过期的组织,这可能会导致身份验证失败。运行 `unset ANTHROPIC_API_KEY` 以回退到您的订阅,并检查 `/status` 以确认哪种方法处于活跃状态。`Login method` 行显示您的订阅帐户,当 API 密钥在使用时会出现 `API key` 行。238如果您的机器的[托管设置](/docs/zh-CN/managed-settings)将 [`forceLoginMethod`](/docs/zh-CN/settings-reference#forceloginmethod) 设置为 `"gateway"` 或设置 [`forceLoginGatewayUrl`](/docs/zh-CN/settings-reference#forcelogingatewayurl),并且您没有通过 `CLAUDE_CODE_USE_BEDROCK` 或 `CLAUDE_CODE_USE_VERTEX` 等变量选择云提供商,您的会话仅使用网关登录。Claude Code 跳过其他凭证源并要求您使用 `/login` 登录。有关每个剩余凭证的情况,请参阅[管理员策略需要云网关登录](/docs/zh-CN/errors#administrator-policy-requires-a-cloud-gateway-sign-in)。在 v2.1.261 之前,或在仅设置 `forceLoginGatewayUrl` 的机器上在 v2.1.265 之前,Claude Code 在这些机器上使用剩余的保存登录,直到您登录到网关。

239 

240如果您有活跃的 Claude 订阅,但环境中也设置了 `ANTHROPIC_API_KEY`,Claude Code 会在您批准后使用 API 密钥。如果密钥属于已禁用或过期的组织,这可能会导致身份验证失败。

241 

242运行 `unset ANTHROPIC_API_KEY` 以回退到您的订阅,并检查 `/status` 以确认哪种方法处于活跃状态。当登录和 API 密钥都已配置时,`/status` 会标记未在使用的凭证。

178 243 

179[Claude Code on the Web](/docs/zh-CN/claude-code-on-the-web) 始终使用您的订阅凭证。如果您在沙箱环境中设置 `ANTHROPIC_API_KEY` 或 `ANTHROPIC_AUTH_TOKEN`,它不会覆盖您的订阅凭证。244[Claude Code on the Web](/docs/zh-CN/claude-code-on-the-web) 始终使用您的订阅凭证。如果您在沙箱环境中设置 `ANTHROPIC_API_KEY` 或 `ANTHROPIC_AUTH_TOKEN`,它不会覆盖您的订阅凭证。

180 245 

246<h4 id="anthropic-profiles-and-federation-credentials">

247 Anthropic 配置文件和联合凭证

248</h4>

249 

250配置文件是您的 [Anthropic 配置目录](https://platform.claude.com/docs/en/manage-claude/wif-reference#configuration-directory)中的命名凭证配置文件,在 macOS 和 Linux 上默认为 `~/.config/anthropic`,在 Windows 上为 `%APPDATA%\Anthropic`。当您为 [Workload Identity Federation (WIF)](https://platform.claude.com/docs/en/manage-claude/workload-identity-federation) 设置配置文件时,其身份验证模式为 `oidc_federation`,或当 [`ant auth login`](https://platform.claude.com/docs/en/cli-sdks-libraries/cli/authentication) 写入它或您[在没有 API 密钥的情况下登录到 Console 帐户](#sign-in-without-an-api-key)时为 `user_oauth`。

251 

252Claude Code 不在[裸模式](/docs/zh-CN/headless#start-faster-with-bare-mode)、Claude Desktop 或云会话中读取配置文件或联合变量。在这些会话中,`/status` 不显示 `Profile` 行。

253 

254Claude Code 按此顺序检查三个源,并在第一个设置的源处停止。该表显示设置每个源的内容以及它相对于您的 `/login` 凭证的排名。

255 

256| 源 | 设置者 | 相对于 `/login` 的排名 |

257| :----- | :-------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------- |

258| 命名配置文件 | `ANTHROPIC_PROFILE` | 上方,无论配置文件具有什么身份验证模式 |

259| 联合变量 | `ANTHROPIC_FEDERATION_RULE_ID` 和 `ANTHROPIC_ORGANIZATION_ID`,两者都设置 | 上方 |

260| 活跃配置文件 | 您的配置目录中的 [`active_config` 文件](https://platform.claude.com/docs/en/manage-claude/wif-reference#active-profile),或名为 `default` 的配置文件 | 当其身份验证模式为 `oidc_federation` 时上方;当其身份验证模式为 `user_oauth` 时在工作的 `/login` 凭证下方 |

261 

262`user_oauth` 规则防止剩余的 `ant auth login` 配置文件将您的请求移出您使用 `/login` 登录的帐户。对于联合变量,Claude Code 还会在交换您的身份令牌时读取 [WIF 参考](https://platform.claude.com/docs/en/manage-claude/wif-reference#environment-variables)中的其他变量,例如 `ANTHROPIC_IDENTITY_TOKEN_FILE`。对于配置文件格式,请参阅 [WIF 参考](https://platform.claude.com/docs/en/manage-claude/wif-reference#profile-configuration-file)。

263 

264要确认 Claude Code 选择了哪个源,请运行 `/status`。`Profile` 行用源名称代替 `Login method` 行。当配置文件是正在使用的凭证时,`Organization` 和 `Email` 行显示其帐户。

265 

266如果您使用 `--debug` 启动 Claude Code,它还会在 `~/.claude/debug/<session-id>.txt` 的调试日志中写入 `Using Anthropic profile auth` 行,其中包含源名称。当 Claude Code 因为您有工作的 `/login` 凭证而跳过 `user_oauth` 活跃配置文件时,它会向调试日志写入警告,说它改为使用 claude.ai 登录。

267 

268当 `user_oauth` 配置文件的登录已过期且 Claude Code 无法续期时,请求会失败,显示 [Anthropic 配置文件登录已过期](/docs/zh-CN/errors#anthropic-profile-login-expired)。

269 

270需要您的 claude.ai 登录的功能,例如 [claude.ai 连接器](/docs/zh-CN/mcp#use-mcp-servers-from-claude-ai)和 [`/schedule`](/docs/zh-CN/routines),在选择这些源之一时不可用。要停止 Claude Code 选择源:

271 

272* **命名配置文件或联合变量**:取消设置 `ANTHROPIC_PROFILE`,或取消设置任一联合变量

273* **活跃配置文件**:对于通过[在没有 API 密钥的情况下登录到 Console 帐户](#sign-in-without-an-api-key)写入当前凭证的 `user_oauth` 配置文件运行 `/logout`,对于 `ant auth login` 写入当前凭证的配置文件运行 `ant auth logout`,或对于任一身份验证模式从您的配置目录中的 `configs/` 删除配置文件的文件

274 

181<h3 id="generate-a-long-lived-token">275<h3 id="generate-a-long-lived-token">

182 生成长期令牌276 生成长期令牌

183</h3>277</h3>


188claude setup-token282claude setup-token

189```283```

190 284 

191该命令会引导您完成 OAuth 授权并将令牌打印到终端。它不会将令牌保存在任何地方;复制它并将其设置为 `CLAUDE_CODE_OAUTH_TOKEN` 环境变量,无论您想在何处进行身份验证:285该命令会打开与 `/login` 相同的浏览器授权流程,在您在浏览器中批准访问后,令牌会打印到终端。它不会将令牌保存在任何地方;复制它并将其设置为 `CLAUDE_CODE_OAUTH_TOKEN` 环境变量,无论您想在何处进行身份验证:

192 286 

193```bash theme={null}287```bash theme={null}

194export CLAUDE_CODE_OAUTH_TOKEN=your-token288export CLAUDE_CODE_OAUTH_TOKEN=your-token

195```289```

196 290 

197此令牌使用您的 Claude 订阅进行身份验证,需要 Pro、Max、Team 或 Enterprise 计划。它的范围仅限于推理,无法建立 [Remote Control](/docs/zh-CN/remote-control) 会话。291此令牌使用您的 Claude 订阅进行身份验证,需要 Pro、Max、Team 或 Enterprise 计划。它只能进行模型请求,因此无法建立 [Remote Control](/docs/zh-CN/remote-control) 会话或获取 [claude.ai 连接器](/docs/zh-CN/mcp#use-mcp-servers-from-claude-ai)。您在本地配置的 MCP 服务器仍然有效。

198 292 

199[Bare mode](/docs/zh-CN/headless#start-faster-with-bare-mode) 不读取 `CLAUDE_CODE_OAUTH_TOKEN`。如果您的脚本传递 `--bare`,请改用 `ANTHROPIC_API_KEY` 或 `apiKeyHelper` 进行身份验证。293[裸模式](/docs/zh-CN/headless#start-faster-with-bare-mode)不读取 `CLAUDE_CODE_OAUTH_TOKEN`。如果您的脚本传递 `--bare`,请改用 `ANTHROPIC_API_KEY` 或 `apiKeyHelper` 进行身份验证。

Details

393 393 

394要查看分类器阻止了什么,请在对话中找到工具调用。如果调用显示为缩短或折叠成摘要行(例如 `Ran 3 shell commands`),请按 `Ctrl+O` 打开[记录查看器](/docs/zh-CN/interactive-mode#transcript-viewer),它会展开它。394要查看分类器阻止了什么,请在对话中找到工具调用。如果调用显示为缩短或折叠成摘要行(例如 `Ran 3 shell commands`),请按 `Ctrl+O` 打开[记录查看器](/docs/zh-CN/interactive-mode#transcript-viewer),它会展开它。

395 395 

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

397 397 

398调用下方的文本告诉您是否有任何需要修复的内容。报告分类器本身问题的文本,例如 `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` 并带有 `Blocked by classifier` 等原因意味着分类器判断调用不安全,因此从调用试图到达或执行的内容中选择修复:398调用下方的文本告诉您是否有任何需要修复的内容。报告分类器本身问题的文本,例如 `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` 等原因意味着分类器判断调用不安全,因此从调用试图到达或执行的内容中选择修复:

399 399 

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

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


403 403 

404您可以从 `/permissions` 对话框的 [**Auto mode** 选项卡](#edit-rules-from-permissions)添加环境条目或 `allow` 规则。404您可以从 `/permissions` 对话框的 [**Auto mode** 选项卡](#edit-rules-from-permissions)添加环境条目或 `allow` 规则。

405 405 

406在大多数会话中,与调用一起显示的原因是固定文本 `Blocked by classifier`,在 Claude Code v2.1.208 及更高版本中:分类器在内部严重程度量表上对每个操作进行评分,而不是写出解释。某些会话运行一个分类器模型,该模型在 v2.1.193 及更高版本中写出简短解释;当出现一个时,将其视为关于分类器缺少哪个目标或意图的提示。Claude Code 选择分类器模型,因此您看到的原因不是您可以配置的。406在大多数会话中,原因名称分类器匹配的规则,在方括号中,例如 `[Data Exfiltration]` 或 `[Production Deploy]`,某些会话运行一个分类器模型,该模型添加简短解释。Claude Code 选择分类器模型,因此您看到的原因不是您可以配置的。

407 407 

408<h3 id="fix-repeated-denials">408<h3 id="fix-repeated-denials">

409 修复重复拒绝409 修复重复拒绝

best-practices.md +29 −29

Details

392 管理你的会话392 管理你的会话

393</h2>393</h2>

394 394 

395对话是持久的和可逆的。利用这一点!395对话是持久的且可逆的。充分利用这一点!

396 396 

397<h3 id="course-correct-early-and-often">397<h3 id="course-correct-early-and-often">

398 尽早且经常改正方向398 尽早且频繁地纠正方向

399</h3>399</h3>

400 400 

401<Tip>401<Tip>

402 一旦你注意到 Claude 偏离轨道,立即改正它。402 一旦发现 Claude 偏离轨道,立即纠正它。

403</Tip>403</Tip>

404 404 

405最好的结果来自紧密的反馈循环。虽然 Claude 有时会在第一次尝试时完美地解决问题,但快速改正它通常会更快地产生更好的解决方案。405最好的结果来自紧密的反馈循环。虽然 Claude 有时能在第一次尝试时完美解决问题,但快速纠正通常能更快地产生更好的解决方案。

406 406 

407* **`Esc`**:使用 `Esc` 键在中途停止 Claude。Context 被保留,所以你可以重定向。407* **`Esc`**:使用 `Esc` 键在 Claude 执行过程中停止它。上下文会被保留,所以你可以重新引导。

408* **`Esc + Esc` 或 `/rewind`**:按 `Esc` 两次或运行 `/rewind` 来打开 rewind 菜单并恢复之前的对话和代码状态,或从选定的消息进行总结。408* **`Esc + Esc` 或 `/rewind`**:按两次 `Esc` 或运行 `/rewind` 来打开 rewind 菜单,恢复之前的对话和代码状态,或从选定的消息进行总结。

409* **`"撤销那个"`**:让 Claude 恢复其更改。409* **`"Undo that"`**:让 Claude 撤销其更改。

410* **`/clear`**:在不相关的任务之间重置 context。长会话与无关的 context 可能会降低性能。410* **`/clear`**:在不相关的任务之间重置上下文。包含无关上下文的长会话可能会降低性能。

411 411 

412如果你在一个会话中对同一问题改正了 Claude 两次以上,context 就充满了失败的方法。运行 `/clear` 并使用更具体的提示重新开始,该提示包含你学到的东西。干净的会话与更好的提示几乎总是优于长会话与累积的改正。412如果你在一个会话中对同一问题纠正了 Claude 两次以上,上下文就会被失败的方法所污染。运行 `/clear` 并使用更具体的提示重新开始,该提示应该包含你学到的内容。一个干净的会话配合更好的提示几乎总是比一个积累了许多纠正的长会话表现更好。

413 413 

414<h3 id="manage-context-aggressively">414<h3 id="manage-context-aggressively">

415 积极管理 context415 积极管理上下文

416</h3>416</h3>

417 417 

418<Tip>418<Tip>

419 在不相关的任务之间频繁运行 `/clear` 来重置 context。419 在不相关的任务之间运行 `/clear` 来重置上下文。

420</Tip>420</Tip>

421 421 

422Claude Code 在你接近 context 限制时自动压缩对话历史,这保留了重要的代码和决策,同时释放空间。422当你接近上下文限制时,Claude Code 会自动压缩对话历史,这样可以保留重要的代码和决策,同时释放空间。

423 423 

424在长会话中,Claude 的 context window 可能会充满无关的对话、文件内容和命令。这可能会降低性能,有时会分散 Claude 的注意力。424在长会话期间,Claude 的上下文窗口可能会被无关的对话、文件内容和命令填满。这可能会降低性能,有时还会分散 Claude 的注意力。

425 425 

426* 在任务之间频繁使用 `/clear` 来完全重置 context window426* 在任务之间频繁使用 `/clear` 来完全重置上下文窗口

427* 当自动压缩触发时,Claude 总结最重要的东西,包括代码模式、文件状态和关键决策427* 当自动压缩触发时,Claude 会总结最重要的内容,包括代码模式、文件状态和关键决策

428* 为了更多控制,运行 `/compact <instructions>`,如 `/compact Focus on the API changes`428* 为了获得更多控制,运行 `/compact <instructions>`,例如 `/compact Focus on the API changes`

429* 要仅压缩对话的一部分,使用 `Esc + Esc` 或 `/rewind`,选择消息检查点,并选择 **从这里总结** 或 **总结到这里**。第一个会压缩从该点开始的消息,同时保持早期 context 完整;第二个会压缩早期消息,同时保持最近的消息完整。请参阅 [rewind 菜单的总结选项](/docs/zh-CN/checkpointing#rewind-and-summarize)。429* 要仅压缩对话的一部分,使用 `Esc + Esc` 或 `/rewind`,选择一个消息检查点,然后选择**从这里总结**或**总结到这里**。第一个选项会压缩从该点开始的消息,同时保留较早的上下文;第二个选项会压缩较早的消息,同时保留最近的消息完整。参见 [rewind 菜单的总结选项](/docs/zh-CN/checkpointing#rewind-and-summarize)。

430* 在 CLAUDE.md 中使用像 `"When compacting, always preserve the full list of modified files and any test commands"` 这样的指令来自定义压缩行为,以确保关键 context 在总结中存活430* 在 CLAUDE.md 中自定义压缩行为,使用诸如 `"When compacting, always preserve the full list of modified files and any test commands"` 这样的指令,以确保关键上下文在总结中得以保留

431* 对于不需要留在 context 中的问题,使用 [`/btw`](/docs/zh-CN/interactive-mode#side-questions-with-%2Fbtw)。答案永远不会进入对话历史,所以你可以检查细节而不增加 context。431* 对于不需要保留在上下文中的问题,使用 [`/btw`](/docs/zh-CN/interactive-mode#side-questions-with-%2Fbtw)。答案永远不会进入对话历史,所以你可以检查细节而不会增加上下文。

432 432 

433<h3 id="use-subagents-for-investigation">433<h3 id="use-subagents-for-investigation">

434 使用 subagents 进行调查434 使用子代理进行调查

435</h3>435</h3>

436 436 

437<Tip>437<Tip>

438 使用 `"use subagents to investigate X"` 委托研究。它们在单独的 context 中探索,为实现保持你的主对话干净。438 使用 `"use subagents to investigate X"` 委派研究。它们在单独的上下文中探索,保持你的主对话干净以供实现。

439</Tip>439</Tip>

440 440 

441由于 context 是你的基本约束,使用 subagents 来保持研究不进入它。当 Claude 研究代码库时,它读取许多文件,所有这些都消耗你的 context。Subagents 在单独的 context windows 中运行并报告摘要:441由于上下文是你的基本约束,使用子代理来保持研究不进入上下文。当 Claude 研究代码库时,它会读取大量文件,所有这些都会消耗你的上下文。子代理在单独的上下文窗口中运行并报告回总结:

442 442 

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

444Use subagents to investigate how our authentication system handles token444Use subagents to investigate how our authentication system handles token

445refresh, and whether we have any existing OAuth utilities I should reuse.445refresh, and whether we have any existing OAuth utilities I should reuse.

446```446```

447 447 

448你也可以在 Claude 实现某些东西后使用 subagents 进行验证。请参阅 [添加对抗性审查步骤](#add-an-adversarial-review-step)。448你也可以在 Claude 实现某些东西后使用子代理进行验证。参见 [添加对抗性审查步骤](#add-an-adversarial-review-step)。

449 449 

450<h3 id="rewind-with-checkpoints">450<h3 id="rewind-with-checkpoints">

451 使用检查点进行 Rewind451 使用检查点进行 Rewind

452</h3>452</h3>

453 453 

454<Tip>454<Tip>

455 Claude 进行的每个提示都会创建一个检查点。你可以将对话、代码或两者恢复到任何之前的检查点。455 你发送的每个开始一个轮次的提示都会创建一个检查点。你可以将对话、代码或两者都恢复到任何之前的检查点。

456</Tip>456</Tip>

457 457 

458Claude 在每次更改前自动对文件进行快照,以便检查点可以恢复它们。双击 `Escape` 或运行 `/rewind` 来打开 rewind 菜单。你可以仅恢复对话、仅恢复代码、恢复两者或从选定的消息进行总结。有关详细信息,请参阅 [Checkpointing](/docs/zh-CN/checkpointing)。458Claude 在每次更改前自动为文件创建快照,所以检查点可以将它们恢复。双击 `Escape` 或运行 `/rewind` 来打开 rewind 菜单。你可以仅恢复对话、仅恢复代码、同时恢复两者,或从选定的消息进行总结。参见 [Checkpointing](/docs/zh-CN/checkpointing) 了解详情。

459 459 

460与其仔细规划每一步,你可以告诉 Claude 尝试一些冒险的事情。如果不起作用,rewind 并尝试不同的方法。检查点在会话中持续,所以你可以关闭你的终端并稍后仍然 rewind。460与其仔细规划每一步,你可以告诉 Claude 尝试一些冒险的事情。如果它不起作用,rewind 并尝试不同的方法。检查点与对话一起保存,所以你可以关闭终端,稍后恢复会话,并仍然可以 rewind。

461 461 

462<Warning>462<Warning>

463 检查点仅跟踪 Claude 进行的更改,不跟踪外部进程。这不是 git 的替代品。463 检查点仅跟踪通过 Claude 的文件编辑工具所做的更改。通过 Bash 命令或外部进程所做的更改不会被捕获。这不是 git 的替代品。

464</Warning>464</Warning>

465 465 

466<h3 id="resume-conversations">466<h3 id="resume-conversations">


468</h3>468</h3>

469 469 

470<Tip>470<Tip>

471 使用 `/rename` 给会话命名,并像对待分支一样对待它们:每个工作流都有自己的持久 context。471 使用 `/rename` 命名会话,并将它们视为分支:每个工作流都有自己的持久上下文。

472</Tip>472</Tip>

473 473 

474Claude Code 在本地保存对话,所以当任务跨越多个会话时,你不必重新解释 context。运行 [`claude --continue`](/docs/zh-CN/sessions#resume-a-session) 来继续最近的会话,或 `claude --resume` 来从列表中选择。给会话起描述性名称,如 `oauth-migration`,以便你稍后可以找到它们。请参阅 [管理会话](/docs/zh-CN/sessions) 了解完整的恢复、分支和命名控制集。474Claude Code 在本地保存对话,所以当任务跨越多个会话时,你不必重新解释上下文。运行 [`claude --continue`](/docs/zh-CN/sessions#resume-a-session) 来从你停止的地方继续,或 `claude --resume` 来从列表中选择。给会话起描述性的名称,如 `oauth-migration`,这样你以后可以找到它们。参见 [管理会话](/docs/zh-CN/sessions) 了解完整的恢复、分支和命名控制。

475 475 

476***476***

477 477 

channels.md +2 −2

Details

47 * `Marketplace "claude-plugins-official" not found`:使用 `/plugin marketplace add anthropics/claude-plugins-official` 添加市场,然后重试安装。47 * `Marketplace "claude-plugins-official" not found`:使用 `/plugin marketplace add anthropics/claude-plugins-official` 添加市场,然后重试安装。

48 * 插件[在市场中找不到](/docs/zh-CN/discover-plugins#install-plugins):检查插件名称。48 * 插件[在市场中找不到](/docs/zh-CN/discover-plugins#install-plugins):检查插件名称。

49 49 

50 当安装要求选择安装范围时,选择用户范围选项,以便插件在所有项目中可用。检查安装摘要:如果它报告 `Run /reload-plugins to activate.`,运行该命令以激活插件的配置命令。50 当安装要求选择安装范围时,选择用户范围选项,以便插件在所有项目中可用。检查安装摘要:如果它报告 `Run /reload-plugins to activate.`,请参阅[在不重启的情况下应用插件更改](/docs/zh-CN/discover-plugins#apply-plugin-changes-without-restarting)以使插件的配置命令可用。

51 </Step>51 </Step>

52 52 

53 <Step title="配置您的令牌">53 <Step title="配置您的令牌">


125 * `Marketplace "claude-plugins-official" not found`:使用 `/plugin marketplace add anthropics/claude-plugins-official` 添加市场,然后重试安装。125 * `Marketplace "claude-plugins-official" not found`:使用 `/plugin marketplace add anthropics/claude-plugins-official` 添加市场,然后重试安装。

126 * 插件[在市场中找不到](/docs/zh-CN/discover-plugins#install-plugins):检查插件名称。126 * 插件[在市场中找不到](/docs/zh-CN/discover-plugins#install-plugins):检查插件名称。

127 127 

128 当安装要求选择安装范围时,选择用户范围选项,以便插件在所有项目中可用。检查安装摘要:如果它报告 `Run /reload-plugins to activate.`,运行该命令以激活插件的配置命令。128 当安装要求选择安装范围时,选择用户范围选项,以便插件在所有项目中可用。检查安装摘要:如果它报告 `Run /reload-plugins to activate.`,请参阅[在不重启的情况下应用插件更改](/docs/zh-CN/discover-plugins#apply-plugin-changes-without-restarting)以使插件的配置命令可用。

129 </Step>129 </Step>

130 130 

131 <Step title="配置您的令牌">131 <Step title="配置您的令牌">

Details

170 170 

171 如果事件没有到达,诊断取决于 `curl` 返回的内容:171 如果事件没有到达,诊断取决于 `curl` 返回的内容:

172 172 

173 * **`curl` 成功但没有任何内容到达 Claude**:在您的会话中运行 `/mcp` 以检查服务器的状态。`failed` 状态通常意味着您的服务器文件中存在依赖项或导入错误;检查 `~/.claude/debug/<session-id>.txt` 处的调试日志以获取 stderr 跟踪。173 * **`curl` 成功但没有任何内容到达 Claude**:在您的会话中运行 `/mcp` 以检查服务器的状态。`failed` 状态通常意味着您的服务器文件中存在依赖项或导入错误。要查看 stderr 跟踪,请使用 `claude --debug --dangerously-load-development-channels server:webhook` 重新启动,并检查 `~/.claude/debug/<session-id>.txt` 处的调试日志。

174 * **`curl` 失败,显示"connection refused"**:端口要么尚未绑定,要么来自较早运行的陈旧进程正在占用它。`lsof -i :<port>` 显示正在侦听的内容;在重新启动会话之前 `kill` 陈旧进程。174 * **`curl` 失败,显示"connection refused"**:端口要么尚未绑定,要么来自较早运行的陈旧进程正在占用它。`lsof -i :<port>` 显示正在侦听的内容;在重新启动会话之前 `kill` 陈旧进程。

175 </Step>175 </Step>

176</Steps>176</Steps>

checkpointing.md +11 −3

Details

12 checkpointing 如何工作12 checkpointing 如何工作

13</h2>13</h2>

14 14 

15当您与 Claude 合作时,checkpointing 会自动捕获每次用户提示前代码的状态。15当您与 Claude 合作时,checkpointing 会自动捕获每次您发送开始一个回合的提示前代码的状态。

16 16 

17<h3 id="automatic-tracking">17<h3 id="automatic-tracking">

18 自动跟踪18 自动跟踪


20 20 

21Claude Code 跟踪其文件编辑工具所做的所有更改:21Claude Code 跟踪其文件编辑工具所做的所有更改:

22 22 

23* 每个用户提示都会创建一个新的 checkpoint23* 每个您发送的开始一个回合的提示都会创建一个新的 checkpoint

24* Claude Code 在一个会话中保留最近 100 个 checkpoint 的文件快照。丢弃较旧的 checkpoint 会删除没有其他 checkpoint 引用的快照文件,除了每个文件的第一个快照,VS Code 扩展将其用作会话 diffs 的基线。24* Claude Code 在一个会话中保留最近 100 个 checkpoint 的文件快照。丢弃较旧的 checkpoint 会删除没有其他 checkpoint 引用的快照文件,除了每个文件的第一个快照,VS Code 扩展将其用作会话 diffs 的基线。

25* Claude Code 将 checkpoints 与对话一起保存,因此您可以在恢复会话后仍然运行 `/rewind`25* Claude Code 将 checkpoints 与对话一起保存,因此您可以在恢复会话后仍然运行 `/rewind`

26* Claude Code 在 [retention sweep](/docs/zh-CN/claude-directory#cleaned-up-automatically) 中删除会话的文件快照,默认情况下在会话最后一次保存后约 30 天。回溯到快照已消失的 checkpoint 可能会失败,出现 [`No files were restored`](/docs/zh-CN/errors#no-files-were-restored) 错误。要保留快照更长时间,请设置 [`cleanupPeriodDays`](/docs/zh-CN/settings-reference#cleanupperioddays)。26* Claude Code 在 [retention sweep](/docs/zh-CN/claude-directory#cleaned-up-automatically) 中删除会话的文件快照,默认情况下在会话最后一次保存后约 30 天。回溯到快照已消失的 checkpoint 可能会失败,出现 [`No files were restored`](/docs/zh-CN/errors#no-files-were-restored) 错误。要保留快照更长时间,请设置 [`cleanupPeriodDays`](/docs/zh-CN/settings-reference#cleanupperioddays)。


35 如果提示输入包含文本,双 `Esc` 会清除它而不是打开菜单。清除的文本会保存到您的输入历史记录中,因此在您完成回溯菜单后,按 `Up` 可以调用它。35 如果提示输入包含文本,双 `Esc` 会清除它而不是打开菜单。清除的文本会保存到您的输入历史记录中,因此在您完成回溯菜单后,按 `Up` 可以调用它。

36</Note>36</Note>

37 37 

38回溯菜单列出了您在会话期间发送的每个提示。选择您想要操作的点,然后选择一个操作:38回溯菜单列出了您在会话期间发送的每个提示,除了 [在回合中途发送的消息](#messages-sent-mid-turn-not-checkpointed)。选择您想要操作的点,然后选择一个操作:

39 39 

40* **恢复代码和对话**:将代码和对话都恢复到该点40* **恢复代码和对话**:将代码和对话都恢复到该点

41* **恢复对话**:回溯到该消息,同时保持当前代码41* **恢复对话**:回溯到该消息,同时保持当前代码


110 110 

111Checkpointing 仅跟踪在当前会话中编辑过的文件。您在 Claude Code 外部对文件所做的手动更改以及来自其他并发会话的编辑通常不会被捕获,除非它们碰巧修改了与当前会话相同的文件。111Checkpointing 仅跟踪在当前会话中编辑过的文件。您在 Claude Code 外部对文件所做的手动更改以及来自其他并发会话的编辑通常不会被捕获,除非它们碰巧修改了与当前会话相同的文件。

112 112 

113<h3 id="messages-sent-mid-turn-not-checkpointed">

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

115</h3>

116 

117当您在 Claude 工作时[排队的消息](/docs/zh-CN/interactive-mode#queue-messages-while-claude-works)在运行的回合中到达 Claude 时,它会加入该回合而不是开始新的回合。该消息会出现在对话中,但 Claude Code 不会为其创建检查点,回溯菜单也不会列出它。Claude Code 作为其自己的回合发送的排队消息会照常获得检查点。

118 

119要删除此类消息或撤销 Claude 在其后所做的编辑,请回溯到启动该回合的提示。这会回溯整个回合,包括 Claude 在您的消息到达之前所做的工作。

120 

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

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

115</h3>123</h3>

Details

170 170 

171 网关是一个单一的 Linux 二进制文件,读取配置,连接到 Postgres 并应用其架构迁移,针对您的 IdP 运行 OIDC 发现,构建上游客户端,并开始侦听。启动对配置、Postgres 连接(5 秒超时)、OIDC 发现和上游客户端构造是失败关闭的。如果其中任何一个无法访问或配置错误,网关会以错误退出,而不是以降级状态提供流量。171 网关是一个单一的 Linux 二进制文件,读取配置,连接到 Postgres 并应用其架构迁移,针对您的 IdP 运行 OIDC 发现,构建上游客户端,并开始侦听。启动对配置、Postgres 连接(5 秒超时)、OIDC 发现和上游客户端构造是失败关闭的。如果其中任何一个无法访问或配置错误,网关会以错误退出,而不是以降级状态提供流量。

172 172 

173 成功启动不会验证推理路径,因为 Bedrock 和 Google Cloud 的 Agent Platform 实例凭证在第一个请求时解析,而不是在启动时。173 成功启动不会验证推理路径,因为 Amazon Bedrock 和 Google Cloud 的 Agent Platform 实例凭证在第一个请求时解析,而不是在启动时。

174 174 

175 监视 stderr 以获取启动序列。日志行使用格式 `[gateway] <timestamp> <level> <message>`,审计事件是带有 `evt` 字段的单行 JSON,启动横幅(下面省略)在迁移和侦听行之间打印。新数据库每个架构迁移打印一行 `migration N applied`;已迁移的数据库不打印任何内容。您应该按顺序看到:175 监视 stderr 以获取启动序列。日志行使用格式 `[gateway] <timestamp> <level> <message>`,审计事件是带有 `evt` 字段的单行 JSON,启动横幅(下面省略)在迁移和侦听行之间打印。新数据库每个架构迁移打印一行 `migration N applied`;已迁移的数据库不打印任何内容。您应该按顺序看到:

176 176 


285}285}

286```286```

287 287 

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

289 289 

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

291 291 


295 295 

296Claude Desktop 在嵌入式 Claude Code 会话上运行其 Cowork 和 Code 选项卡,以及启用时的 Chat 选项卡,并通过网关发送其模型请求。它将策略传递给每个会话,从网关在 `/user/bootstrap` 处提供的配置构建:模型允许列表、禁用的工具和从匹配策略的 `cli` 块派生的出口允许列表,加上[`desktop` 覆盖](/docs/zh-CN/claude-apps-gateway-config#claude-desktop-overlay)。296Claude Desktop 在嵌入式 Claude Code 会话上运行其 Cowork 和 Code 选项卡,以及启用时的 Chat 选项卡,并通过网关发送其模型请求。它将策略传递给每个会话,从网关在 `/user/bootstrap` 处提供的配置构建:模型允许列表、禁用的工具和从匹配策略的 `cli` 块派生的出口允许列表,加上[`desktop` 覆盖](/docs/zh-CN/claude-apps-gateway-config#claude-desktop-overlay)。

297 297 

298其他 `cli` 密钥,例如 hooks、`env` 和作用域权限规则(如 `Bash(npm *)`),仅到达通过 `/login` 登录的客户端。Claude Desktop 从其自己的托管配置读取网关 URL,并使用其自己的流程登录,与[设置网关 URL](#set-the-gateway-url) 中的 `forceLoginMethod` 和 `forceLoginGatewayUrl` 密钥分开。298其他 `cli` 密钥,例如 hooks、`env` 和作用域权限规则(如 `Bash(npm *)`),仅到达通过 `/login` 登录的客户端。Claude Desktop 从其自己的托管配置读取网关 URL,并使用其自己的流程登录,与[设置网关 URL](#set-the-gateway-url)中的 `forceLoginMethod` 和 `forceLoginGatewayUrl` 密钥分开。

299 299 

300由启动过程传递的设置是父设置。Claude Code 在任何具有管理员部署的托管源的机器上忽略父设置,除非[传递策略的源](/docs/zh-CN/managed-settings#which-managed-source-claude-code-uses)设置 `parentSettingsBehavior: "merge"`。300由启动过程传递的设置是父设置。Claude Code 在任何具有管理员部署的托管源的机器上忽略父设置,除非[传递策略的源](/docs/zh-CN/managed-settings#which-managed-source-claude-code-uses)设置 `parentSettingsBehavior: "merge"`。

301 301 


313 设置选择加入313 设置选择加入

314</h4>314</h4>

315 315 

316从[设置网关 URL](#set-the-gateway-url) 部署托管设置片段,将其镜像到任何优先于文件的客户端源,然后验证。316从[设置网关 URL](#set-the-gateway-url)部署托管设置片段,将其镜像到任何优先于文件的客户端源,然后验证。

317 317 

318<Steps>318<Steps>

319 <Step title="在托管设置文件中部署选择加入">319 <Step title="在托管设置文件中部署选择加入">


421这些保证适用于每个通过 `/login` 登录的会话。Claude Desktop 启动的嵌入式会话按[将策略传递给 Claude Desktop 会话](#deliver-policy-to-claude-desktop-sessions)中所述获取其策略,遥测项目说明其导出的去向。421这些保证适用于每个通过 `/login` 登录的会话。Claude Desktop 启动的嵌入式会话按[将策略传递给 Claude Desktop 会话](#deliver-policy-to-claude-desktop-sessions)中所述获取其策略,遥测项目说明其导出的去向。

422 422 

423* **模型访问**:对策略未授予的模型的请求返回 400,`/model` 选择器被过滤到策略的 `availableModels` 允许列表。在策略中设置 [`enforceAvailableModels: true`](/docs/zh-CN/model-config#default-model-behavior),以便 Default 选项解析为 `availableModels` 内的模型,而不是 Claude Code 的内置默认值;没有它,Default 保持可选,如果该模型未被授予,则在请求时被拒绝。423* **模型访问**:对策略未授予的模型的请求返回 400,`/model` 选择器被过滤到策略的 `availableModels` 允许列表。在策略中设置 [`enforceAvailableModels: true`](/docs/zh-CN/model-config#default-model-behavior),以便 Default 选项解析为 `availableModels` 内的模型,而不是 Claude Code 的内置默认值;没有它,Default 保持可选,如果该模型未被授予,则在请求时被拒绝。

424* **遥测目标**:在通过 `/login` 登录的会话中,CLI 将其 OTLP/HTTP 导出发送到网关,无论任何本地设置的 `OTEL_EXPORTER_OTLP_ENDPOINT`,网关将它们中继到 [`telemetry.forward_to`](/docs/zh-CN/claude-apps-gateway-config#telemetry) 中的目标。在[Claude Desktop 启动](#connect-claude-desktop)的嵌入式会话中,CLI 将其导出发送到配置的 `OTEL_EXPORTER_OTLP_ENDPOINT`。CLI 仅当该端点指向网关本身时才将网关会话令牌附加到这些导出。没有为信号配置目标时,网关接受并丢弃它,因此如果您已直接收集 Claude Code 遥测,将您的收集器添加为 `forward_to` 目标。424* **遥测目标**:在通过 `/login` 登录的会话中,CLI 将其 OTLP/HTTP 导出发送到网关,而不是任何本地设置的 `OTEL_EXPORTER_OTLP_ENDPOINT`,除非策略[将您的收集器命名为端点](/docs/zh-CN/claude-apps-gateway-config#export-directly-to-your-collector)。网关将它接收的导出中继到 [`telemetry.forward_to`](/docs/zh-CN/claude-apps-gateway-config#telemetry) 中的目标。

425* **凭证**:网关令牌是会话的唯一凭证。`ANTHROPIC_AUTH_TOKEN`、`ANTHROPIC_API_KEY`、`apiKeyHelper`、[Anthropic 配置文件](/docs/zh-CN/authentication#anthropic-profiles-and-federation-credentials)和任何早期的 claude.ai 登录在登录时被忽略,因此开发人员不需要首先从 claude.ai 注销。425 * 在[Claude Desktop 启动](#connect-claude-desktop)的嵌入式会话中,CLI 将其导出发送到配置的 `OTEL_EXPORTER_OTLP_ENDPOINT`。CLI 仅当该端点指向网关本身时才将网关会话令牌附加到这些导出。

426 * 没有为信号配置目标时,网关接受并丢弃它。

427 * 如果您已直接收集 Claude Code 遥测,将您的收集器添加为 `forward_to` 目标,或在策略中命名它以跳过中继。

428* **凭证**:网关令牌是会话的唯一凭证。[Anthropic 配置文件](/docs/zh-CN/authentication#anthropic-profiles-and-federation-credentials)和任何早期的 claude.ai 登录在登录时被忽略,因此开发人员不需要首先从 claude.ai 注销。对于配置的 `ANTHROPIC_API_KEY`、`ANTHROPIC_AUTH_TOKEN` 或 `apiKeyHelper` 凭证,请参阅[管理员策略需要 Cloud 网关登录](/docs/zh-CN/errors#administrator-policy-requires-a-cloud-gateway-sign-in)。

426* **托管设置**:锁定的密钥无法在本地覆盖。CLI 在启动时应用策略,并在每个小时轮询时应用更改,除了[仅在下一次启动时应用的更改](/docs/zh-CN/server-managed-settings#fetch-and-caching-behavior)。429* **托管设置**:锁定的密钥无法在本地覆盖。CLI 在启动时应用策略,并在每个小时轮询时应用更改,除了[仅在下一次启动时应用的更改](/docs/zh-CN/server-managed-settings#fetch-and-caching-behavior)。

427* **启动时网关无法访问**:已登录的会话在启动时约 10 秒后以错误退出,而不是在没有其设置的情况下启动。430* **启动时网关无法访问**:已登录的会话在启动时约 10 秒后以错误退出,而不是在没有其设置的情况下启动。

428* **启动后网关结束会话**:请参阅[强制执行故障关闭启动](/docs/zh-CN/server-managed-settings#enforce-fail-closed-startup),了解哪些启动从网关登出打开,哪些在网关以 `401` 应答时退出。431* **启动后网关结束会话**:请参阅[强制执行故障关闭启动](/docs/zh-CN/server-managed-settings#enforce-fail-closed-startup),了解哪些启动从网关登出打开,哪些在网关以 `401` 应答时退出。


452| 按用户和按组支出限制 | 可用 | 请参阅[支出限制](/docs/zh-CN/claude-apps-gateway-spend-limits) |455| 按用户和按组支出限制 | 可用 | 请参阅[支出限制](/docs/zh-CN/claude-apps-gateway-spend-limits) |

453| 服务器端网络搜索 | 不可用 | CLI 无法看到网关路由到哪个上游提供商,因此无法验证网络搜索支持并在网关会话上禁用 WebSearch |456| 服务器端网络搜索 | 不可用 | CLI 无法看到网关路由到哪个上游提供商,因此无法验证网络搜索支持并在网关会话上禁用 WebSearch |

454| [Remote Control](/docs/zh-CN/remote-control) | 不可用 | CLI 显示[命名网关的错误](/docs/zh-CN/errors#remote-control-requires-the-anthropic-api) |457| [Remote Control](/docs/zh-CN/remote-control) | 不可用 | CLI 显示[命名网关的错误](/docs/zh-CN/errors#remote-control-requires-the-anthropic-api) |

455| 标准提示缓存 | 可用 | 网关将 `cache_control` 断点转发到每个上游,CLI 标记[系统上下文,它在对话中途追加](/docs/zh-CN/prompt-caching#where-the-cache-lives)以在网关会话上进行缓存,就像在其他每个提供商和连接上一样。 |458| [`/design-sync`](/docs/zh-CN/commands#all-commands) 和 `/design-login` | 不可用 | 两者都需要 claude.ai,CLI 在网关会话上不联系,因此两个命令都不会出现 |

459| 需要功能标志获取的功能,例如 `/import` 和 `claude import` | 不可用 | CLI 在网关会话上跳过标志获取。[需要功能标志获取的功能](/docs/zh-CN/env-vars#features-that-need-feature-flag-fetching)列出了关闭的内容 |

460| 标准提示缓存 | 可用 | 网关将 `cache_control` 断点转发到每个上游。[缓存位置](/docs/zh-CN/prompt-caching#where-the-cache-lives)涵盖 CLI 标记的块,包括它在对话中途追加的系统上下文 |

456| 1 小时缓存 TTL | 不可用 | CLI 在网关会话上省略扩展缓存 TTL beta,因为并非网关可以路由到的每个上游都支持 1 小时 TTL,因此通过网关的提示缓存使用 5 分钟 TTL;请参阅上面的 beta 标头注释 |461| 1 小时缓存 TTL | 不可用 | CLI 在网关会话上省略扩展缓存 TTL beta,因为并非网关可以路由到的每个上游都支持 1 小时 TTL,因此通过网关的提示缓存使用 5 分钟 TTL;请参阅上面的 beta 标头注释 |

457| Auto 模式 | 可用 | 遵循[第三方提供商规则](/docs/zh-CN/permission-modes#enable-auto-mode-on-bedrock-agent-platform-or-foundry):仅第三方提供商上符合条件的模型可以使用它。在 v2.1.207 之前,网关会话上的 auto 模式需要设置 `CLAUDE_CODE_ENABLE_AUTO_MODE=1`,可通过托管策略 `env` 块交付 |462| Auto 模式 | 可用 | 遵循[第三方提供商规则](/docs/zh-CN/permission-modes#enable-auto-mode-on-bedrock-agent-platform-or-foundry):仅第三方提供商上符合条件的模型可以使用它。在 v2.1.207 之前,网关会话上的 auto 模式需要设置 `CLAUDE_CODE_ENABLE_AUTO_MODE=1`,可通过托管策略 `env` 块交付 |

458| 仅第一方优化,如全局缓存范围和令牌高效工具 | 不可用 | CLI 在网关会话上不启用它们;请参阅上面的 beta 标头注释 |463| 仅第一方优化,如全局缓存范围和令牌高效工具 | 不可用 | CLI 在网关会话上不启用它们;请参阅上面的 beta 标头注释 |

Details

19 19 

20<Note>20<Note>

21 **在您的私有网络上部署。** Claude Code 仅连接到地址为私有的网关。这是一个安全防护,因为受信任的网关可以推送在开发者机器上运行命令的设置。将网关放在内部负载均衡器或 VPN 后面,并为其分配一个仅解析为私有 IP 的主机名。21 **在您的私有网络上部署。** Claude Code 仅连接到地址为私有的网关。这是一个安全防护,因为受信任的网关可以推送在开发者机器上运行命令的设置。将网关放在内部负载均衡器或 VPN 后面,并为其分配一个仅解析为私有 IP 的主机名。

22 

23 Anthropic 运营的公共网关端点是例外:`/login` 通过 `https://` 接受它们。这是一小组固定的由 Anthropic 本身运营的网关;它们不是您可以选择或配置的部署选项。该列表被编译到 Claude Code 中,因此没有配置可以向其添加主机名,您托管的任何网关都不符合豁免条件。在 v2.1.206 之前,`/login` 像拒绝任何其他公共地址一样拒绝这些端点。

24</Note>22</Note>

25 23 

26<h2 id="identity-provider-setup">24<h2 id="identity-provider-setup">


43* **Microsoft Entra ID**:`issuer` = `https://login.microsoftonline.com/<tenant-id>/v2.0`。Entra 发出组对象 ID 而不是名称,因此在 `managed.policies.match.groups` 中使用 GUID,或使用应用角色获得人类可读的名称。如果您的租户在 `roles` 而不是 `groups` 下发出角色,设置 `oidc.groups_claim: roles`。41* **Microsoft Entra ID**:`issuer` = `https://login.microsoftonline.com/<tenant-id>/v2.0`。Entra 发出组对象 ID 而不是名称,因此在 `managed.policies.match.groups` 中使用 GUID,或使用应用角色获得人类可读的名称。如果您的租户在 `roles` 而不是 `groups` 下发出角色,设置 `oidc.groups_claim: roles`。

44* **Google Workspace**:`issuer` = `https://accounts.google.com`。Google 的 id\_token 不包含组。要在 Google 作为 IdP 时使用基于组的 `allowed_groups` 或 `managed.policies`,配置 [`oidc.google_groups`](/docs/zh-CN/claude-apps-gateway-config#oidc),它使用具有域范围委派的服务账户通过 Admin SDK Directory API 查找每个用户的组。没有它,使用 `oidc.allowed_email_domains` 进行成员资格门控,使用 `managed.policies.match.email_domain` 进行策略分配。Google 也忽略标准 `offline_access` 作用域。对于刷新令牌,设置 `oidc.scopes: [openid, profile, email]` 和 `oidc.extra_auth_params: { access_type: offline, prompt: consent }`。42* **Google Workspace**:`issuer` = `https://accounts.google.com`。Google 的 id\_token 不包含组。要在 Google 作为 IdP 时使用基于组的 `allowed_groups` 或 `managed.policies`,配置 [`oidc.google_groups`](/docs/zh-CN/claude-apps-gateway-config#oidc),它使用具有域范围委派的服务账户通过 Admin SDK Directory API 查找每个用户的组。没有它,使用 `oidc.allowed_email_domains` 进行成员资格门控,使用 `managed.policies.match.email_domain` 进行策略分配。Google 也忽略标准 `offline_access` 作用域。对于刷新令牌,设置 `oidc.scopes: [openid, profile, email]` 和 `oidc.extra_auth_params: { access_type: offline, prompt: consent }`。

45 43 

46有关不在上述范围内的身份提供商的支持,请参阅[故障排除](#troubleshooting)。

47 

48<Warning>44<Warning>

49 刷新令牌让网关可以在不将开发者发送回浏览器的情况下无声地续订开发者的会话。它们也驱动取消配置,因为当 IdP 禁用用户时,下一次刷新失败,会话在 `ttl_hours` 内结束。网关默认请求 `offline_access` 以获取刷新令牌。如果您的 IdP 需要明确同意离线访问,配置 OAuth 客户端以允许它。45 刷新令牌让网关可以在不将开发者发送回浏览器的情况下无声地续订开发者的会话。它们也驱动取消配置,因为当 IdP 禁用用户时,下一次刷新失败,会话在 `ttl_hours` 内结束。网关默认请求 `offline_access` 以获取刷新令牌。如果您的 IdP 需要明确同意离线访问,配置 OAuth 客户端以允许它。

50 46 


55 部署51 部署

56</h2>52</h2>

57 53 

58网关是一个单一的 Linux 二进制文件。它水平扩展,因为副本是无状态的,Postgres 是共享协调层。按照您在环境中运行无状态服务的方式运行它。本部分的其余部分说明镜像需要什么,并为 Kubernetes 和 Cloud Run 提供简短说明。54网关是一个单一的无状态 Linux 二进制文件,通过 Postgres 进行协调,因此按照您在环境中部署任何其他无状态服务的方式部署它。将其保持在您的网络内,您的开发者和 IdP 可以通过 HTTPS 到达它,并将其视为任何持有生产凭证的服务。

59 

60网关设计为在您的网络内运行,因为它持有您的上游凭证并充当推理的单一出口点。它可以在您的开发者和您的 IdP 可以通过 HTTPS 到达的任何地方运行;将其视为任何其他持有生产凭证的服务。

61 55 

62除了运行位置外,还有一些决策塑造部署:56除了运行位置外,还有一些决策塑造部署:

63 57 

64* **成本**:网关没有单独的许可证或按座位费用;它是 `claude` 二进制文件的一部分。您通过现有的云或 Anthropic 承诺为推理付费,加上容器的计算和您的遥测收集器。58* **成本**:没有单独的许可证或按座位费用。网关是 `claude` 二进制文件的一部分,因此您通过现有承诺为推理付费,加上它运行的计算。

65* **绕过**:网关不强制执行通过它的唯一模型路由。具有自己凭证的开发者仍然可以直接调用提供商,因此关闭该路径是网络策略决策,例如阻止到 `api.anthropic.com` 的出口,除了来自网关的。阻止该出口也会破坏 [WebFetch 域安全检查](/docs/zh-CN/data-usage#webfetch-domain-safety-check),它从每个开发者的机器调用 `api.anthropic.com`;在托管策略中设置 `skipWebFetchPreflight: true` 以禁用它。59* **绕过**:网关不强制执行通过它的唯一模型路由。具有自己凭证的开发者仍然可以直接调用提供商,因此关闭该路径是网络策略决策,例如阻止到 `api.anthropic.com` 的出口,除了来自网关的。阻止该出口也会破坏 [WebFetch 域安全检查](/docs/zh-CN/data-usage#webfetch-domain-safety-check),它从每个开发者的机器调用 `api.anthropic.com`。在托管策略中设置 `skipWebFetchPreflight: true` 以禁用它。

66* **多个网关**:每个网关是一个单独的部署,有自己的配置。CLI 按网关主机名存储其信任指纹和凭证,因此不同的团队可以连接到不同的网关而不会冲突。要提供多个 OIDC 发行者,运行单独的实例。60* **多个网关**:每个是一个单独的部署,有自己的配置,CLI 按网关主机名存储信任和凭证,因此团队可以使用不同的网关而不会冲突。要提供多个 OIDC 发行者,运行单独的实例。

67* **无服务器**:Cloud Run 可以工作;设置 `min-instances: 1` 以避免冷 OIDC 发现。Lambda 和 Cloud Functions 不行,因为网关是一个长时间运行的 HTTP 服务器。61* **无服务器**:Cloud Run 可以工作,如果您设置 `min-instances: 1` 以避免冷 OIDC 发现。Lambda 和 Cloud Functions 不行,因为网关是一个长时间运行的 HTTP 服务器。

62 

63这里的每个生产拓扑都在普通 HTTP 副本前面放置一个 L7 代理,如 Ingress、Cloud Run 的前端或 ALB。设置 [`listen.trusted_proxies`](/docs/zh-CN/claude-apps-gateway-config#listen) 为代理的源范围,以便网关从 `X-Forwarded-For` 读取客户端 IP。网关仅在 TCP 对等体受信任时才遵守该标头。[Google Cloud](/docs/zh-CN/claude-apps-gateway-on-gcp) 和 [AWS](/docs/zh-CN/claude-apps-gateway-on-aws) 工作示例为每个拓扑提供具体值。没有受信任的代理,每个请求似乎都来自代理的 IP,这会将按 IP 速率限制折叠为一个共享桶,并在审计事件中记录代理的 IP。

68 64 

69这里的每个生产拓扑都在普通 HTTP 副本前面放置一个 L7 代理,如 Ingress、Cloud Run 的前端或 ALB。设置 [`listen.trusted_proxies`](/docs/zh-CN/claude-apps-gateway-config#listen) 为代理的源范围,以便网关从 `X-Forwarded-For` 读取客户端 IP。网关仅在 TCP 对等体受信任时才遵守该标头;[Google Cloud 工作示例](/docs/zh-CN/claude-apps-gateway-on-gcp) 为每个拓扑提供具体值。没有受信任的代理,每个请求似乎都来自代理的 IP,这会将按 IP 速率限制折叠为一个共享桶,并在审计事件中记录代理的 IP。65不要在网关的设备授权和令牌端点处重定向请求,例如在入口处使用 HTTP 到 HTTPS 或主机规范化重写。Claude Code 不会在这些请求上跟随重定向,因此会破坏登录和令牌刷新的入口规则。

66 

67给代理任何空闲超时时间长于网关的保活间隔,这取决于上游:

68 

69* 在除 `provider: anthropic` 之外的每个上游上,一旦流已经沉默约 15 秒,网关就会写入一个 SSE `ping`。

70* 在 `provider: anthropic` 上,网关原样传递响应,包括 Anthropic API 自己的 ping。

71 

72默认值(如 ALB 的 60 秒)足以保持安静的流打开。[AWS 工作示例](/docs/zh-CN/claude-apps-gateway-on-aws#troubleshooting) 无论如何将其提高到一小时,其故障排除行涵盖早于 v2.1.229 的网关,这些网关在现在获得 ping 的上游上的安静期间没有发送任何内容。

70 73 

71<h3 id="container-image">74<h3 id="container-image">

72 容器镜像75 容器镜像


96* 在 Ingress 处终止 TLS 并将 `listen.public_url` 设置为 Ingress 主机名99* 在 Ingress 处终止 TLS 并将 `listen.public_url` 设置为 Ingress 主机名

97* 将就绪探针指向 `GET /readyz`,将活跃探针指向 `GET /healthz`100* 将就绪探针指向 `GET /readyz`,将活跃探针指向 `GET /healthz`

98 101 

99<Note>102有关 AWS 上的完整工作示例,涵盖 ECS Fargate 或 EKS、Amazon RDS 和 AWS Secrets Manager,请参阅 [在 AWS 上部署](/docs/zh-CN/claude-apps-gateway-on-aws)。

100 **工作负载身份**

101 103 

102 优先使用平台的工作负载身份而不是静态密钥:EKS 上的 IRSA 用于 Bedrock 和 AWS 上的 Claude Platform,GKE 上的工作负载身份用于 Agent Platform,AKS 上的工作负载身份用于 Foundry。在上游块中设置 `auth: {}`,或对 Foundry 设置 `use_azure_ad: true`,网关通过该提供商的默认凭证链获取 pod 的身份。对于跨云配对,如 GKE 上的 Bedrock 上游,在上游的 `auth` 块中设置显式凭证。[`upstreams` 参考](/docs/zh-CN/claude-apps-gateway-config#upstreams) 有每个平台的设置详情。104优先使用平台的工作负载身份而不是静态密钥;[`upstreams` 参考](/docs/zh-CN/claude-apps-gateway-config#upstreams) 有每个平台的设置详情。对于跨云配对,如 GKE 上的 Amazon Bedrock 上游,在上游的 `auth` 块中设置显式凭证。

103</Note>

104 105 

105<h3 id="cloud-run">106<h3 id="cloud-run">

106 Cloud Run107 Cloud Run


113* 将配置作为密钥卷挂载114* 将配置作为密钥卷挂载

114* 设置 `min-instances: 1` 以避免首次请求时的冷 OIDC 发现115* 设置 `min-instances: 1` 以避免首次请求时的冷 OIDC 发现

115 116 

116<Note>117有关 Google Cloud 上的完整工作示例,涵盖 Cloud Run 或 GKE、Cloud SQL 和 Secret Manager,请参阅 [在 Google Cloud 上部署](/docs/zh-CN/claude-apps-gateway-on-gcp)。

117 有关 Google Cloud 上的完整工作示例,涵盖 Cloud Run 或 GKE、Cloud SQL 和 Secret Manager,请参阅 [在 Google Cloud 上部署](/docs/zh-CN/claude-apps-gateway-on-gcp)。

118</Note>

119 118 

120<h3 id="push-the-gateway-url-to-developer-machines">119<h3 id="push-the-gateway-url-to-developer-machines">

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

122</h3>121</h3>

123 122 

124一旦网关开始提供服务,通过托管设置、MDM 或直接写入每个操作系统的 `managed-settings.json` 将 `forceLoginMethod` 和 `forceLoginGatewayUrl` 推送到每个开发者的机器。没有这个,`/login` 显示标准账户选择器,没有网关选项。请参阅 [客户端托管设置](/docs/zh-CN/claude-apps-gateway-config#client-side-managed-settings) 了解文件路径。123一旦网关开始提供服务,通过托管设置、MDM 或直接写入每个操作系统的 `managed-settings.json` 将 `forceLoginMethod`、`forceLoginGatewayUrl` 和 `parentSettingsBehavior: "merge"` 推送到每个开发者的机器。没有这个,`/login` 显示标准账户选择器,没有网关选项。

124 

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

126 

127请参阅 [每个机制存储策略的位置](/docs/zh-CN/managed-settings#where-each-mechanism-stores-the-policy) 了解文件路径,以及 [客户端托管设置](/docs/zh-CN/claude-apps-gateway-config#client-side-managed-settings) 了解 Claude Desktop `bootstrapUrl` 等效项。

125 128 

126<h2 id="operations">129<h2 id="operations">

127 运维130 运维


135 138 

136网关向 stderr 写入两个流,都是 JSON 友好的:139网关向 stderr 写入两个流,都是 JSON 友好的:

137 140 

138* **审计事件**:每个安全相关事件一行 JSON。将 stderr 管道传输到您的日志聚合器。发出的事件包括 `config.load`、`session.mint`、`session.refresh`、`device.authorize`、`device.verify`、`auth.denied`、`access.denied`、`inference`、`managed.serve`、`spend.blocked` 和 `admin.denied`。字段因事件而异:141* **审计事件**:每个安全相关事件一行 JSON。将 stderr 管道传输到您的日志聚合器。发出的事件包括 `config.load`、`session.mint`、`session.refresh`、`device.authorize`、`device.verify`、`device.callback`、`auth.denied`、`access.denied`、`inference`、`managed.serve`、`desktop_bootstrap.serve`、`desktop_bootstrap.denied`、`spend.blocked`、`admin.denied`、`admin.limit.upsert` 和 `admin.limit.delete`。字段因事件而异:

139 * 成功的 mint 和 refresh 事件携带 `sub`、`email`、`client_ip` 和结果142 * 成功的 mint 和 refresh 事件携带 `sub`、`email`、`client_ip` 和结果

140 * 拒绝事件携带原因、路径和客户端 IP,因为拒绝时不存在身份143 * `auth.denied` 和 `access.denied` 携带原因和客户端 IP,加上 `auth.denied` 的请求路径,因为在这些拒绝时不存在用户身份。两个 `access.denied` 原因改变事件携带的内容:

144 * `xff_unparseable`:事件也携带无法读取的 `X-Forwarded-For` 条目

145 * `client_ip_unknown`:事件不携带客户端 IP,因为连接没有对等地址,而设置了 `access_control` 列表

141 * `inference` 记录哪个上游提供了请求以及响应状态146 * `inference` 记录哪个上游提供了请求以及响应状态

142 * `admin.denied` 记录被拒绝的管理员 API 身份验证尝试,包括原因(`invalid_key` 或 `no_credentials`)、客户端 IP、方法和路径,不包括呈现的密钥材料147 * `desktop_bootstrap.denied` 记录被拒绝的 Claude Desktop bootstrap 获取,包含原因(`not_configured`、`policy_not_opted_in` 或 `no_policy_matched`)和用户的身份

143* **运维日志**:人类可读的 `[gateway]` 前缀行,用于启动、警告和上游错误。`CLAUDE_GATEWAY_LOG_LEVEL` 环境变量控制详细程度,接受 `info`、`warn` 或 `error`,默认为 `info`。它不影响审计事件,这些事件总是被发出。148 * `admin.denied` 记录被拒绝的管理员 API 身份验证尝试,包括客户端 IP、方法、路径和原因,不包括呈现的密钥材料:当呈现了 `x-api-key` 但与配置的密钥不匹配时为 `invalid_key`,当仅呈现了 `Authorization` 标头且其未验证为 `admin.admin_groups` 中的网关会话时为 `bearer_rejected`,或当两个标头都未呈现时为 `no_credentials`

149* **运维日志**:人类可读的 `[gateway]` 前缀行,用于启动、警告和上游错误。`CLAUDE_GATEWAY_LOG_LEVEL` 环境变量控制详细程度,接受 `debug`、`info`、`warn` 或 `error`,默认为 `info`。在 `debug` 时,每次登录和刷新也记录 id\_token 中声明的名称(不是值),加上当 `userinfo_fallback` 提供任何时 userinfo 声明的名称,因此您可以诊断 `email_claim` 和 `groups_claim` 设置而不记录 PII。它不影响审计事件,这些事件总是被发出。

144 150 

145<h3 id="health">151<h3 id="health">

146 健康152 健康


150 156 

151`/.well-known/oauth-authorization-server` 处的 OAuth 发现文档也仅在配置加载、OIDC 发现、上游客户端构造和 Postgres 迁移全部成功后才返回 `200`,因此它也充当端到端启动检查。157`/.well-known/oauth-authorization-server` 处的 OAuth 发现文档也仅在配置加载、OIDC 发现、上游客户端构造和 Postgres 迁移全部成功后才返回 `200`,因此它也充当端到端启动检查。

152 158 

153运行中的网关还在 `<public_url>/protocol` 提供它接受的路径和请求形状的描述,与您运行的版本相匹配。内容在版本之间不稳定。

154 

155<h3 id="outage-behavior">159<h3 id="outage-behavior">

156 中断行为160 中断行为

157</h3>161</h3>


181 Postgres185 Postgres

182</h3>186</h3>

183 187 

184网关持有五个表,全部由其启动时迁移创建:188网关持有五个数据表加上一个 `_migrations` 表,全部由其启动时迁移创建:

185 189 

186| 表 | 内容 | 保留 |190| 表 | 内容 | 保留 |

187| ------------------ | ---------------------------------- | --------------------------------------------- |191| ------------------ | ---------------------------------- | --------------------------------------------- |


191| `admin_audit` | 管理员 API 变更跟踪 | `admin.audit_retention_days`,默认 365 |195| `admin_audit` | 管理员 API 变更跟踪 | `admin.audit_retention_days`,默认 365 |

192| `principal_emails` | 每个主体的最后看到的电子邮件、显示名称和 IdP 组。包含 PII。 | `admin.identity_retention_days` 自上次活动以来,默认 90 |196| `principal_emails` | 每个主体的最后看到的电子邮件、显示名称和 IdP 组。包含 PII。 | `admin.identity_retention_days` 自上次活动以来,默认 90 |

193 197 

194一个 30 秒的循环过期 `kv` 行超过其 TTL,一个每小时的扫描在支出表上强制保留窗口,因此没有什么无限增长。没有 [支出限制](/docs/zh-CN/claude-apps-gateway-spend-limits) 配置,只有 `kv` 被写入。如果您的安全策略禁止应用角色的 DDL,预先创建这些表和 `_migrations`,使用管理员角色,并授予应用角色 `SELECT, INSERT, UPDATE, DELETE` 在每个上。198一个 30 秒的循环过期 `kv` 行超过其 TTL,一个每小时的扫描在支出表上强制保留窗口,因此没有什么无限增长。没有 [支出限制](/docs/zh-CN/claude-apps-gateway-spend-limits) 配置,只有 `kv` 被写入。网关在启动时应用其自己的架构迁移,在每次升级时也是如此,因此其数据库角色需要创建和修改表的权限。将其指向专用于网关的数据库或架构,以保持该授权范围狭窄。

195 199 

196使用支出限制,丢失的数据库意味着丢失支出跟踪和上限,不仅仅是开发者重新登录,因此运行定期备份。要立即删除一个离职的开发者而不是等待保留,直接运行 `DELETE FROM principal_emails WHERE principal = '<sub>'`;这移除了唯一持有其电子邮件、名称和组的表。`spend` 和 `admin_audit` 行仅引用伪匿名 OIDC `sub`。200使用支出限制,丢失的数据库意味着丢失支出跟踪和上限,不仅仅是开发者重新登录,因此运行定期备份。要立即删除一个离职的开发者而不是等待保留,直接运行 `DELETE FROM principal_emails WHERE principal = '<sub>'`;这移除了唯一持有其电子邮件、名称和组的表。`spend` 和 `admin_audit` 行仅引用伪匿名 OIDC `sub`。

197 201 


199 升级203 升级

200</h3>204</h3>

201 205 

202副本是无状态的,因此滚动重启在任何时间都是安全的。网关在启动时运行架构迁移,这意味着部署新二进制文件会自动迁移数据库。如果数据库角色无法运行 DDL,预先创建架构,包括 `_migrations` 表,种子为当前版本;否则启动失败,尝试 `CREATE TABLE`。206副本是无状态的,因此滚动重启在任何时间都是安全的。网关在启动时运行架构迁移,这意味着部署新二进制文件会自动迁移数据库。并发副本在 Postgres 咨询锁上序列化,因此只有一个应用每个迁移。

203 207 

204迁移是仅追加的,因此回滚到知道较少迁移的先前二进制文件是安全的;它忽略额外的行。回滚也重新验证 YAML 针对较旧二进制文件的架构,因此采用由较新版本引入的密钥的配置在较旧版本上启动失败。在回滚前移除新密钥。208迁移是仅追加的,因此回滚到知道较少迁移的先前二进制文件是安全的;它忽略额外的行。回滚也重新验证 YAML 针对较旧二进制文件的架构,因此采用由较新版本引入的密钥的配置在较旧版本上启动失败。在回滚前移除新密钥。

205 209 


216</h3>220</h3>

217 221 

218| 数据 | 路径 | 由网关发送给 Anthropic |222| 数据 | 路径 | 由网关发送给 Anthropic |

219| ----------------------------------------------------------------------- | -------------------------------------- | ------------------------ |223| ----------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------ |

220| 推理(提示、完成) | CLI → 网关 → 您的上游 | 仅当 Anthropic API 是配置的上游时 |224| 推理(提示、完成) | CLI → 网关 → 您的上游 | 仅当 Anthropic API 是配置的上游时 |

221| 遥测(OTLP 指标,加上 [选择加入日志和跟踪](/docs/zh-CN/claude-apps-gateway-config#telemetry)) | CLI → 网关 → 您的收集器 | 从不 |225| 遥测(OTLP 指标,加上 [选择加入日志和跟踪](/docs/zh-CN/claude-apps-gateway-config#telemetry)) | CLI → 网关 → 您的收集器 | 从不 |

222| 身份(电子邮件、组、sub) | IdP → 网关 → JWT → CLI;CLI 在 OTLP 导出上标记它 | 从不 |226| 身份(电子邮件、组、sub) | IdP → 网关 → JWT → CLI;CLI 在 OTLP 导出上标记它。如果您打开 [`forward_user_identity`](/docs/zh-CN/claude-apps-gateway-config#per-user-identity-headers-for-a-proxy-you-run),网关也会将开发者的电子邮件和 IdP 主体作为标头发送到您的代理 | 从不 |

223| 托管设置 | 您的网关 YAML → CLI | 从不 |227| 托管设置 | 您的网关 YAML → CLI | 从不 |

224| 审计日志 | 网关 stderr → 您的聚合器 | 从不 |228| 审计日志 | 网关 stderr → 您的聚合器 | 从不 |

225 229 


231 235 

232* 开发者持有短期 JWT 而不是原始上游密钥。CLI 到网关的腿使用 RFC 8628 设备授权,网关与 IdP 的授权代码交换在默认配置中运行 PKCE,因此拦截的 IdP 授权代码是无用的。236* 开发者持有短期 JWT 而不是原始上游密钥。CLI 到网关的腿使用 RFC 8628 设备授权,网关与 IdP 的授权代码交换在默认配置中运行 PKCE,因此拦截的 IdP 授权代码是无用的。

233* 设备验证页面强制执行同源 POST 和每个 RFC 8628 §5.1 的每 IP 速率限制。请参阅 [用户代码暴力破解抵抗](#user-code-brute-force-resistance)。237* 设备验证页面强制执行同源 POST 和每个 RFC 8628 §5.1 的每 IP 速率限制。请参阅 [用户代码暴力破解抵抗](#user-code-brute-force-resistance)。

234* 出站请求通过服务器端请求伪造 (SSRF) 防护,解析 DNS,阻止链接本地和云元数据地址加上默认的本地环回,并将连接固定到解析的 IP,因此操作员影响的 URL(如 IdP 和 OTLP 目的地)无法重定向到云元数据端点。RFC 1918 私有范围被故意允许,因为 IdP 和 OTLP 收集器通常存在于私有 IP 上。对于针对本地环回 IdP 或收集器的本地开发,在网关的环境中设置 `CLAUDE_GATEWAY_ALLOW_LOOPBACK=1`;在生产中保持未设置。238* 出站请求通过服务器端请求伪造 (SSRF) 防护,解析 DNS,阻止链接本地和云元数据地址加上默认的本地环回,并将连接固定到解析的 IP,因此操作员影响的 URL(如 IdP 和 OTLP 目的地)无法重定向到云元数据端点。RFC 1918 私有范围被故意允许,因为 IdP 和 OTLP 收集器通常存在于私有 IP 上。仅当网关必须合法到达的某些内容存在于本地环回时(例如本地开发 IdP 或 `localhost` 上的 sidecar OTLP 收集器),在网关的环境中设置 `CLAUDE_GATEWAY_ALLOW_LOOPBACK=1`。该变量为每个操作员配置的 URL 放宽本地环回块,也跳过启动时警告,该警告检查 pod 是否可以到达云元数据端点,因此更倾向于为收集器提供其自己的内部地址。

235 239 

236如果您添加自己的出口控制,网关必须在使用实例元数据凭证(如工作负载身份)时到达元数据服务器。240如果您添加自己的出口控制,网关必须在使用实例元数据凭证(如工作负载身份)时到达元数据服务器。

237 241 

238两个威胁超出范围,因为它们是您的基础设施来保护:242两个威胁超出范围,因为它们是您的基础设施来保护:

239 243 

240* **受损的网关主机**:主机既持有上游凭证,又向每个连接的开发者分发 [托管设置](/docs/zh-CN/claude-apps-gateway-config#managed),因此对网关配置的控制与对您的 MDM 的控制相当。CLI 的一次性批准对话框用于 shell 能力设置限制无声更改,但不替代主机安全。244* **受损的网关主机**:主机既持有上游凭证,又向每个连接的开发者分发 [托管设置](/docs/zh-CN/claude-apps-gateway-config#managed),因此对网关配置的控制与对您的 MDM 的控制相当。CLI 的 [批准对话框](/docs/zh-CN/server-managed-settings#approval-memory) 用于 shell 能力设置限制无声更改,但不替代主机安全。

241* **恶意 OIDC 提供商**:提供商签署网关信任的 id\_tokens,因此它可以声称任何身份。审查和保护您的 IdP 是您的责任。245* **恶意 OIDC 提供商**:提供商签署网关信任的 id\_tokens,因此它可以声称任何身份。审查和保护您的 IdP 是您的责任。

242 246 

243<h3 id="user-code-brute-force-resistance">247<h3 id="user-code-brute-force-resistance">


253</h3>257</h3>

254 258 

255* **数据驻留**:网关自己的数据平面除非 Anthropic API 是配置的上游,否则不向 Anthropic 发送任何内容;当它是时,您现有的数据处理协议适用于推理路径。遥测、审计、身份和设置仅去往您配置的目的地。259* **数据驻留**:网关自己的数据平面除非 Anthropic API 是配置的上游,否则不向 Anthropic 发送任何内容;当它是时,您现有的数据处理协议适用于推理路径。遥测、审计、身份和设置仅去往您配置的目的地。

256* **主机进程流量**:主机进程是 Claude Code CLI,它可以向 Anthropic 发送启动分析和更新检查。对于严格出口部署,在网关的容器环境中设置 `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1`。260* **主机进程流量**:主机进程是 Claude Code CLI。`claude gateway` 在与 Amazon Bedrock 和 Google Cloud 的 Agent Platform 部署相同的第三方规则下运行,不向 Anthropic 发送任何内容。在 v2.1.227 之前,主机进程发送启动遥测,例如产品版本和平台,在容器环境中设置 `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1` 关闭。这些版本也在启动时发送一个 `HEAD` 请求,没有正文或凭证,到 `https://api.anthropic.com` 上的 `/api/hello`,或在环境设置时的 `ANTHROPIC_BASE_URL` 上,除非环境也设置了代理变量(如 `HTTPS_PROXY`)或 mTLS 客户端证书。它们忽略了响应,因此在出口防火墙处阻止该请求不影响网关。

257* **客户端分析**:CLI 在登录到网关时禁用自己的使用分析,错误报告在第三方 API 表面上默认关闭。261* **客户端分析**:CLI 在登录到网关时禁用自己的使用分析和错误报告。在第一次登录之前,CLI 仍然向 Anthropic 发送启动事件,包括在托管设置强制网关登录的机器上。要保持这些关闭,在强制网关登录的相同 [客户端托管设置](/docs/zh-CN/claude-apps-gateway-config#client-side-managed-settings) 中传递 [`DISABLE_TELEMETRY`](/docs/zh-CN/managed-settings#turn-telemetry-off-for-your-organization)。

262* **错误报告**:每当 CLI 的模型请求去往 Anthropic 的第一方 API 以外的任何端点(如 Amazon Bedrock 或自定义 `ANTHROPIC_BASE_URL`)时,CLI 关闭错误报告。

258* **客户端机器**:开发者的 CLI 仍然向 Anthropic 发送 WebFetch 主机名检查和版本检查,除非设置了 `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1` 和 `skipWebFetchPreflight: true`。请参阅 [数据使用](/docs/zh-CN/data-usage)。263* **客户端机器**:开发者的 CLI 仍然向 Anthropic 发送 WebFetch 主机名检查和版本检查,除非设置了 `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1` 和 `skipWebFetchPreflight: true`。请参阅 [数据使用](/docs/zh-CN/data-usage)。

259* **调查评分**:网关凭证禁用 Anthropic 绑定的评分接收器,因此评分不发送给 Anthropic。264* **调查评分**:在登录到网关时,CLI 禁用 Anthropic 绑定的评分上传以及分析流,因此它不向 Anthropic 发送评分。

260* **成绩单共享**:在调查的成绩单共享提示上选择"是"会在 `~/.claude/feedback-bundles/` 下写入本地文件,而不是上传到 Anthropic。265* **成绩单共享**:在调查的成绩单共享提示上选择"是"会在 `~/.claude/feedback-bundles/` 下写入本地文件,而不是上传到 Anthropic。

261* **客户端更新**:更新检查与网关流量分开。通过您自己的分发固定版本,如果笔记本电脑不得获取版本,设置 `DISABLE_UPDATES`。`DISABLE_AUTOUPDATER` 仅停止后台更新,而 `claude update` 仍然有效。266* **客户端更新**:更新检查与网关流量分开。通过您自己的分发固定版本,如果笔记本电脑不得获取版本,设置 `DISABLE_UPDATES`。`DISABLE_AUTOUPDATER` 仅停止后台更新,而 `claude update` 仍然有效。

262* **TLS**:在生产中通过 HTTPS 提供 `public_url`,要么从网关自己的监听器通过 `listen.tls`,要么从 TLS 终止入口在普通 HTTP 副本前面,设置 `listen.public_url`。网关不拒绝普通 HTTP。IdP 必须在生产中提供 HTTPS,Postgres 支持 `?sslmode=require`。在您的入口处设置 `Strict-Transport-Security`。267* **TLS**:在生产中通过 HTTPS 提供 `public_url`,要么从网关自己的监听器通过 `listen.tls`,要么从 TLS 终止入口在普通 HTTP 副本前面,在两种情况下都设置 `listen.public_url`。网关不拒绝普通 HTTP。IdP 必须在生产中提供 HTTPS,Postgres 支持 `?sslmode=require`。在您的入口处设置 `Strict-Transport-Security`。

263* **漏洞披露**:遵循 [报告安全问题](/docs/zh-CN/security#reporting-security-issues)268* **漏洞披露**:遵循 [报告安全问题](/docs/zh-CN/security#reporting-security-issues)

264 269 

265<h2 id="troubleshooting">270<h2 id="troubleshooting">


275网关的 stderr 包含审计事件流,审计日志记录开发者身份,调试文件记录来自开发者机器的 hook 和 MCP 服务器输出。在发布到公开问题前,请审查并隐去这些信息。280网关的 stderr 包含审计事件流,审计日志记录开发者身份,调试文件记录来自开发者机器的 hook 和 MCP 服务器输出。在发布到公开问题前,请审查并隐去这些信息。

276 281 

277| 症状 | 原因 | 修复 |282| 症状 | 原因 | 修复 |

278| ----------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |283| ----------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

279| 开发者的 `/login` 显示标准账户选择器而不是 **Cloud gateway** 屏幕 | `forceLoginMethod` 或 `forceLoginGatewayUrl` 未在该机器的托管设置中设置 | 将 [托管设置文件](/docs/zh-CN/claude-apps-gateway#set-the-gateway-url) 部署到设备;`/login` 从那里读取网关 URL |284| 开发者的 `/login` 显示标准账户选择器而不是 **Cloud gateway** 屏幕 | `forceLoginMethod` 或 `forceLoginGatewayUrl` 未在该机器的托管设置中设置 | 将 [托管设置文件](/docs/zh-CN/claude-apps-gateway#set-the-gateway-url) 部署到设备;`/login` 从那里读取网关 URL |

285| 开发者的请求失败,显示 `Not signed in to the Cloud gateway — run /login.` | 机器的托管设置设置 `forceLoginMethod: "gateway"` 或 `forceLoginGatewayUrl`,会话没有网关登录。剩余的 claude.ai 登录不满足要求。 | 让开发者运行 `/login` 并完成网关登录。另请参阅 [管理员策略需要 Cloud gateway 登录](/docs/zh-CN/errors#administrator-policy-requires-a-cloud-gateway-sign-in)。 |

286| Claude Desktop 报告其引导配置无法获取 | `/user/bootstrap` 返回 404:与用户匹配的策略不包含 `desktop` 密钥,或没有策略匹配。网关的审计日志将每个拒绝记录为 `desktop_bootstrap.denied`,并说明原因。 | 将 `desktop` 块添加到与用户匹配的策略,或添加到 `match: {}` 基础层;空的 `desktop: {}` 就足够了。请参阅 [Claude Desktop 覆盖](/docs/zh-CN/claude-apps-gateway-config#claude-desktop-overlay)。 |

280| 启动显示 `Gateway login is configured in managed settings, but this Claude Code build does not include Cloud gateway support.` | 安装的 Claude Code 构建早于网关支持 | 让开发者更新 Claude Code 到包括 Cloud gateway 支持的版本 |287| 启动显示 `Gateway login is configured in managed settings, but this Claude Code build does not include Cloud gateway support.` | 安装的 Claude Code 构建早于网关支持 | 让开发者更新 Claude Code 到包括 Cloud gateway 支持的版本 |

281| CLI `/login`:`Gateway hosts must be on your organization's private network; <host> resolves to the public (or unrecognized) address <ip>` | 网关主机名解析为至少一个公共 IP 地址。Claude Code 检查每个解析的地址,需要每一个都是私有的。常见原因是一个双栈名称,其中一个族解析为公共地址,包括 AWS 内部双栈负载均衡器,它们返回公共范围 AAAA 地址。Anthropic 运营的公共网关端点免于检查,`/login` 通过 `https://` 接受它们。在 v2.1.206 之前,`/login` 拒绝它们,就像任何其他公共地址一样 | 让网关名称在开发者机器上仅解析为私有地址。对于双栈名称,删除公共范围记录或提供单独的仅内部 DNS 名称。请参阅 [私有网络先决条件](/docs/zh-CN/claude-apps-gateway#prerequisites)。 |288| 启动或 `/login` 在托管设置加载上返回 403 后报告 `Claude Code may not be enabled for your organization` | 网关或其前面的某些东西用 403 回答了 `/managed/settings` 请求。网关自己的设置路由从不回答 403。状态来自 [`access_control`](/docs/zh-CN/claude-apps-gateway-config#http-tuning) IP 检查或网关前面的代理或 WAF。审计日志将 IP 检查拒绝记录为 `access.denied`,并说明原因。开发者保持登录状态。 | 检查审计日志中失败时的 `access.denied`,修复 `access_control` 列表或前端,然后让开发者再次启动 `claude` |

282| CLI `/login`:`Gateway login requires a direct connection and does not support connecting through an HTTP proxy` | `HTTPS_PROXY` 或 `HTTP_PROXY` 适用于网关主机,代理的主机名解析为公共地址。代理的主机解析为仅私有地址是允许的,不会触发此错误 | 在开发者的机器上将网关主机添加到 `NO_PROXY`,以便连接是直接的,或使用主机名解析为私有地址的代理 |289| CLI `/login`:`Gateway hosts must be on your organization's private network; <host> resolves to the public (or unrecognized) address <ip>` | 网关主机名解析为至少一个公共 IP 地址。Claude Code 检查每个解析的地址,需要每一个都是私有的。常见原因是一个双栈名称,其中一个族解析为公共地址,包括 AWS 内部双栈负载均衡器,它们返回公共范围 AAAA 地址。 | 让网关名称在开发者机器上仅解析为私有地址。对于双栈名称,删除公共范围记录或提供单独的仅内部 DNS 名称。请参阅 [私有网络先决条件](/docs/zh-CN/claude-apps-gateway#prerequisites)。 |

290| CLI `/login`:`Gateway login would go through proxy <proxy>, which is not on a private network` | `HTTPS_PROXY` 或 `HTTP_PROXY` 适用于网关主机,代理的主机名解析为公共地址。代理的主机解析为仅私有地址是允许的,不会触发此错误 | 在开发者的机器上将网关主机添加到 `NO_PROXY`,以便连接是直接的,或使用主机名解析为私有地址的代理。消息命名要添加的确切 `NO_PROXY` 条目 |

291| CLI `/login`:`Could not resolve the configured HTTP proxy` | `HTTPS_PROXY` 或 `HTTP_PROXY` 中的主机名无法从开发者的机器解析,通常是因为它未连接到公司网络 | 让开发者连接到您的网络或 VPN 并重试,或修复代理 URL |

283| CLI `/login`:`Could not resolve gateway host <host>` | 机器无法解析网关的内部 DNS 名称,通常是因为它不在公司网络上 | 让开发者连接到您的网络或 VPN,然后重试 `/login` |292| CLI `/login`:`Could not resolve gateway host <host>` | 机器无法解析网关的内部 DNS 名称,通常是因为它不在公司网络上 | 让开发者连接到您的网络或 VPN,然后重试 `/login` |

284| 启动退出,配置验证错误命名 `store.postgres_url` | 未配置 Postgres;网关需要 Postgres | 设置 `store.postgres_url`。对于本地开发,使用一次性容器:`docker run --rm -p 5432:5432 -e POSTGRES_HOST_AUTH_METHOD=trust postgres`。 |293| 启动退出,配置验证错误命名 `store.postgres_url` | 未配置 Postgres;网关需要 Postgres | 设置 `store.postgres_url`。对于本地开发,使用一次性容器:`docker run --rm -p 5432:5432 -e POSTGRES_HOST_AUTH_METHOD=trust postgres`。 |

285| 启动退出:`requires the native binary` | 在 Node 下运行而不是本机二进制文件 | 使用 [独立安装方法](/docs/zh-CN/setup) 之一安装 Claude Code |294| 启动退出:`requires the native binary` | 在 Node 下运行而不是本机二进制文件 | 使用 [独立安装方法](/docs/zh-CN/setup) 之一安装 Claude Code |

286| 启动退出,OIDC 发现错误在 `config.load` 之后 | `oidc.issuer` 无法到达,或 TLS 链不受信任 | 检查发行者是否可从 pod 到达并提供 `/.well-known/openid-configuration`。为私有 PKI 设置 `ca_cert_pem`。 |295| 启动退出,OIDC 发现错误在 `config.load` 之后 | `oidc.issuer` 无法到达,或 TLS 链不受信任 | 检查发行者是否可从 pod 到达并提供 `/.well-known/openid-configuration`。为私有 PKI 设置 `ca_cert_pem`。 如果 pod 仅通过前向代理到达 IdP,设置 [`oidc.use_proxy: true`](/docs/zh-CN/claude-apps-gateway-config#idp-requests-through-a-forward-proxy);在 v2.1.227 之前的版本上,改为给 pod 一条到 IdP 每个端点的直接路由。 |

287| 启动退出,Postgres 权限错误 | 应用角色缺少 `CREATE TABLE` | 使用管理员角色预先创建架构,并授予应用角色 DML,或临时授予 DDL 用于应用新迁移的启动 |296| 启动退出,Postgres 权限错误 | 数据库角色缺少其架构上的 DDL 权限 | 授予角色对网关架构的 `CREATE` 权限,以便它可以在启动时创建和更改其表 |

288| `/oauth/callback` 显示"Sign-in could not be completed" | 电子邮件域被拒绝,id\_token 验证失败,或 `email_verified` 明确为 `false`,网关总是拒绝,没有覆盖 | 检查 `allowed_email_domains` 和 IdP 返回验证的 `email` 声明。对于 `email_verified: false`,修复 IdP 端验证。如果您的 IdP 在不同的声明名称下发出电子邮件,设置 `oidc.email_claim`。 |297| `/oauth/callback` 显示"Sign-in could not be completed" | 电子邮件域被拒绝,id\_token 验证失败,或 `email_verified` 明确为 `false`,网关总是拒绝,没有覆盖 | 检查 `allowed_email_domains` 和 IdP 返回验证的 `email` 声明。对于 `email_verified: false`,修复 IdP 端验证。如果您的 IdP 在不同的声明名称下发出电子邮件,设置 `oidc.email_claim`。 |

289| 日志:`token exchange failed: id_token missing email claim` | IdP 默认不在 id\_token 中包含 `email`。此拒绝仅在设置 `allowed_email_domains` 时触发;没有它,缺失的电子邮件铸造没有电子邮件的会话 | 配置 IdP 在 id\_token 中发出 `email`。Okta:将 `email` 添加到自定义授权服务器的 ID 令牌声明。Entra:在应用注册上将 `email` 添加为可选声明。PingFederate:启用发出 `email` 的 OpenID Connect 策略。如果 IdP 从 userinfo 端点提供 `email` 但不会在 id\_token 中包含它,如 Okta 组织授权服务器,设置 `oidc.userinfo_fallback: true`。 |298| 日志:`token exchange failed request_id=<id>: id_token missing email claim` | IdP 默认不在 id\_token 中包含 `email`。此拒绝仅在设置 `allowed_email_domains` 时触发;没有它,缺失的电子邮件铸造没有电子邮件的会话 | 配置 IdP 在 id\_token 中发出 `email`。Okta:将 `email` 添加到自定义授权服务器的 ID 令牌声明。Entra:在应用注册上将 `email` 添加为可选声明。PingFederate:启用发出 `email` 的 OpenID Connect 策略。如果 IdP 从 userinfo 端点提供 `email` 但不会在 id\_token 中包含它,如 Okta 组织授权服务器,设置 `oidc.userinfo_fallback: true`。 |

299| 日志:`refresh failed request_id=<id>: invalid_token (…) (at userinfo_no_id_token, …)`,开发者每 `session.ttl_hours` 看到 `Cloud gateway session expired` | IdP 接受了刷新令牌但没有随之返回 id\_token,所以网关询问了 IdP 的 userinfo 端点以获取用户的声明。IdP 在那里拒绝了刷新的访问令牌。网关回答 `temporarily_unavailable`,所以 Claude Code 保留刷新令牌但无法续订会话。v2.1.260 之前的网关版本记录相同的行,但没有 `(at …)` 详情。 | 设置 [`oidc.scope_on_refresh: true`](/docs/zh-CN/claude-apps-gateway-config#oidc),在网关 v2.1.260 或更高版本中可用,以便刷新请求再次请求 `openid`。某些 IdP(如 Okta)仅在被要求时在刷新时返回 id\_token。在 PingFederate 上,改为在 **Applications > OAuth > OpenID Connect Policy Management** 下启用 **Return ID Token On Refresh Grant**。该密钥不会改变 PingFederate 的行为。对于仍然省略它的其他 IdP,检查 userinfo 端点是否接受由刷新发行的访问令牌。作为临时措施,提高 [`session.ttl_hours`](/docs/zh-CN/claude-apps-gateway-config#session)。请参阅 [身份提供者设置](#identity-provider-setup) 了解取消配置权衡。 |

290| 每个 Amazon Bedrock 请求返回 502;日志显示 `Could not load credentials from any providers` | 在 EC2 上,IMDSv2 的默认跳数限制为 1 阻止来自容器内的实例元数据请求。启动和 `/readyz` 通过,因为 AWS SDK 在第一个请求时解析实例凭证,而不是在客户端构造时 | 使用 `aws ec2 modify-instance-metadata-options --instance-id <id> --http-put-response-hop-limit 2` 提高跳数限制,或在启动模板中设置它。更改适用于实例上的每个容器。在可用的地方优先使用 ECS 任务角色,它从 ECS 容器凭证端点读取凭证,完全避免更改,或在专用网关实例上应用更改以限制暴露。 |300| 每个 Amazon Bedrock 请求返回 502;日志显示 `Could not load credentials from any providers` | 在 EC2 上,IMDSv2 的默认跳数限制为 1 阻止来自容器内的实例元数据请求。启动和 `/readyz` 通过,因为 AWS SDK 在第一个请求时解析实例凭证,而不是在客户端构造时 | 使用 `aws ec2 modify-instance-metadata-options --instance-id <id> --http-put-response-hop-limit 2` 提高跳数限制,或在启动模板中设置它。更改适用于实例上的每个容器。在可用的地方优先使用 ECS 任务角色,它从 ECS 容器凭证端点读取凭证,完全避免更改,或在专用网关实例上应用更改以限制暴露。 |

291| IdP 错误:unknown or unsupported scope | IdP 拒绝它不识别的作用域 | 将 `oidc.scopes` 设置为您的 IdP 接受的确切列表;它必须包括 `openid`。默认值为 `openid profile email offline_access`。 |301| IdP 错误:unknown or unsupported scope | IdP 拒绝它不识别的作用域 | 将 `oidc.scopes` 设置为您的 IdP 接受的确切列表;它必须包括 `openid`。默认值为 `openid profile email offline_access`。 |

292| 设置 `oidc.scopes` 后会话不无声续订 | `offline_access` 从覆盖中删除 | 如果您的 IdP 支持,添加 `offline_access` 回来。没有刷新令牌,开发者每 `session.ttl_hours` 重新运行浏览器登录。 |302| 设置 `oidc.scopes` 后会话不无声续订 | `offline_access` 从覆盖中删除 | 如果您的 IdP 支持,添加 `offline_access` 回来。没有刷新令牌,开发者每 `session.ttl_hours` 重新运行浏览器登录。 |

293| 浏览器显示"This request came from another site and was blocked" | 跨站点表单 POST,作为 CSRF 保护被阻止。对于嵌入或代理页面是预期的 | 直接打开验证链接 |303| 浏览器显示"This request came from another site and was blocked" | 跨站点表单 POST,作为 CSRF 保护被阻止。对于嵌入或代理页面是预期的 | 直接打开验证链接 |

294| Chrome 用"Refused to send form data … violates … Content Security Policy directive: form-action"阻止"批准"按钮,但相同页面在 Safari 或 Firefox 中工作 | Chrome 对整个重定向链强制执行 `form-action`。您的 IdP 重定向到第二个主机,该主机未被列入白名单。 | 在 `oidc.form_action_origins` 中添加重定向链中的每个额外源。在"批准"页面上打开 Chrome DevTools → 控制台以查看哪个源被阻止。 |304| Chrome 用"Refused to send form data … violates … Content Security Policy directive: form-action"阻止"批准"按钮,但相同页面在 Safari 或 Firefox 中工作 | Chrome 对整个重定向链强制执行 `form-action`。您的 IdP 重定向到第二个主机,该主机未被列入白名单。 | 在 `oidc.form_action_origins` 中添加重定向链中的每个额外源。在"批准"页面上打开 Chrome DevTools → 控制台以查看哪个源被阻止。 |

295| 登录在 IdP 处完成,但回调失败,Chrome 中出现 CSP 错误或 Safari 中出现"this sign-in link has expired" | IdP 通过 `response_mode=form_post` 返回代码,它通过 POST 自动提交到 `/oauth/callback`。Chrome 在严格 CSP 下阻止它;Safari 允许提交,但回调仅读取查询字符串。 | 确保您的 IdP 遵守 `response_mode=query`,网关明确请求它,以便回调是普通重定向 |305| 登录在 IdP 处完成,但回调失败,Chrome 中出现 CSP 错误或 Safari 中出现"this sign-in link has expired" | IdP 通过 `response_mode=form_post` 返回代码,它通过 POST 自动提交到 `/oauth/callback`。Chrome 在严格 CSP 下阻止它;Safari 允许提交,但回调仅读取查询字符串。 | 确保您的 IdP 遵守 `response_mode=query`,网关明确请求它,以便回调是普通重定向 |

296| 登录在本地工作,但在 ALB 后面失败 | `public_url` 未设置,因此 IdP 获取内部 `http://` 源作为 `redirect_uri` | 将 `listen.public_url` 设置为外部 `https://` 源 |306| 登录在本地工作,但在 ALB 后面失败 | `public_url` 仍然命名本地或内部 `http://` 源,所以 IdP 获取错误的 `redirect_uri` | 将 `listen.public_url` 设置为外部 `https://` 源并向 IdP 注册 `<public_url>/oauth/callback` |

297| 开发者重复看到信任提示 | TLS 证书每个副本或每个请求轮换 | 在入口处使用稳定的证书,或终止 TLS 一次并在内部通过普通 HTTP 运行副本 |307| 开发者重复看到信任提示 | TLS 证书每个副本或每个请求轮换 | 在入口处使用稳定的证书,或终止 TLS 一次并在内部通过普通 HTTP 运行副本 |

298| CLI `/login`:`"Could not verify the gateway's TLS certificate"` 或 `SELF_SIGNED_CERT_IN_CHAIN` | 网关的 TLS 链由 CLI 主机的信任存储中不存在的私有 CA 签署 | Claude Code 默认在本机二进制文件上读取 OS 信任存储,在 Node 22.15 或更高版本上;[`CLAUDE_CODE_CERT_STORE`](/docs/zh-CN/network-config#ca-certificate-store) 控制此行为。如果 CA 安装在 OS 信任存储中,确保开发者在当前运行时上。否则在启动前将 `NODE_EXTRA_CA_CERTS` 设置为 CA 证书 PEM。首次连接指纹提示仍然适用。 |308| CLI `/login`:"Could not verify the gateway's TLS certificate" 或 `SELF_SIGNED_CERT_IN_CHAIN` | 网关的 TLS 链由 CLI 主机的信任存储中不存在的私有 CA 签署 | Claude Code 默认在本机二进制文件上读取 OS 信任存储,在 Node 22.15 或更高版本上;[`CLAUDE_CODE_CERT_STORE`](/docs/zh-CN/network-config#ca-certificate-store) 控制此行为。如果 CA 安装在 OS 信任存储中,确保开发者在当前运行时上。否则在启动前将 `NODE_EXTRA_CA_CERTS` 设置为 CA 证书 PEM。首次连接指纹提示仍然适用。 |

309| CLI `/login` 完成浏览器登录,然后会话以 `Cloud gateway sign-in was not completed` 和 TLS 证书不匹配结束 | 在登录后的第一个请求上,网关呈现了与 Claude Code 固定的指纹不匹配的证书,所以 Claude Code 没有保留网关凭证。常见原因是一个地址后面的副本提供不同的证书,或网络路径上的某些东西拦截 TLS。 | 为主机名提供一个证书,例如在入口处终止 TLS 一次,然后让开发者再次运行 `/login`。如果该证书与固定的不同,Claude Code 在 [信任提示](/docs/zh-CN/claude-apps-gateway#connect-developers) 处显示警告证书已更改。 |

310| CLI `/login` 停止,显示 `The gateway's TLS certificate changed during sign-in: it no longer matches the one you trusted` | 登录请求到达了一个服务器,其证书与开发者在 `/login` 开始时接受的证书不匹配:一个地址后面的副本提供不同的证书,路径上的 TLS 拦截,或登录进行中的证书轮换。 | 为主机名提供一个证书,然后让开发者再次启动登录并在 [信任提示](/docs/zh-CN/claude-apps-gateway#connect-developers) 处审查新证书。 |

311 

312`Cloud gateway sign-in was not completed` 消息命名网关主机名。当 Claude Code 同时拥有固定指纹和呈现的指纹时,消息还显示每个的前 16 个字符。

313 

314如果 Claude Code 在网关登录后报告 `couldn't load your organization's managed settings`,Claude Code 命名原因,就地重启,并恢复对话。如果 Claude Code 无法重启,例如在后台会话中,Claude Code 结束会话并保留登录。

299 315 

300<h2 id="related">316<h2 id="related">

301 相关317 相关

claude-apps-gateway-on-aws.md +554 −0 created

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# 在 AWS 上部署 Claude apps gateway

6 

7> 在 AWS 上运行 Claude apps gateway 的完整示例:ECS Fargate 或 EKS、Amazon RDS for PostgreSQL、AWS Secrets Manager 和 IAM 角色身份验证到 Amazon Bedrock。

8 

9<Note>

10 本页介绍了在 AWS 上运行 Claude apps gateway 的一种方式。该配置是客户管理基础设施的工作示例,而不是受支持的生产部署;在将其调整到您自己的环境之前,使用它来了解各个部分如何组合在一起。有关平台无关的要求,请参阅[部署指南](/docs/zh-CN/claude-apps-gateway-deploy)。

11</Note>

12 

13此示例在 AWS 上配置 Claude apps gateway,使用 Amazon Bedrock 作为模型上游,计算资源使用 [Amazon ECS](https://aws.amazon.com/ecs/) 在 [AWS Fargate](https://aws.amazon.com/fargate/) 上或 [Amazon EKS](https://aws.amazon.com/eks/)。[Okta](https://www.okta.com/) 是示例身份提供商 (IdP),但任何符合 OpenID Connect (OIDC) 的 IdP 都可以工作;有关每个 IdP 的详细信息,请参阅[身份提供商设置](/docs/zh-CN/claude-apps-gateway-deploy#identity-provider-setup)。

14 

15<Note>

16 Bedrock 不是 AWS 上唯一的 Claude 上游。gateway 还支持 Claude Platform on AWS,这是由 Anthropic 运营的 Claude API,具有 AWS 身份验证和 AWS Marketplace 计费,可以代替 Bedrock 或与其一起使用。其上游条目、凭证和 IAM 权限与本页的 Bedrock 范围的权限不同;[Claude Platform on AWS 上游参考](/docs/zh-CN/claude-apps-gateway-config#claude-platform-on-aws)涵盖了哪些内容会改变,本页的其余部分保持不变。

17</Note>

18 

19<h2 id="architecture">

20 架构

21</h2>

22 

23<Frame caption="示例架构,以 Amazon Bedrock 作为模型上游。Claude Platform on AWS 上游占据相同的位置。">

24 <img src="https://mintcdn.com/claude-code/PHweeRmDUYEKff49/images/claude-gateway-aws-architecture.svg?fit=max&auto=format&n=PHweeRmDUYEKff49&q=85&s=8599cc34aa28522cde208ee831439bb4" alt="Claude apps gateway 在 AWS 上的图表:Claude Code 客户端通过 HTTPS 连接到内部应用负载均衡器,该均衡器位于 gateway(ECS Fargate 或 EKS)前面,gateway 在私有子网中运行,旁边是用于会话状态的 Amazon RDS for PostgreSQL 实例。gateway 通过 OIDC 让用户登录企业 IdP,从 AWS Secrets Manager 读取机密,使用其 IAM 角色将模型请求转发到 Amazon Bedrock,并在部署时从 Amazon ECR 拉取其镜像。" width="820" height="430" data-path="images/claude-gateway-aws-architecture.svg" />

25</Frame>

26 

27gateway 在您的网络上作为私有 HTTPS 端点运行,开发人员通过您的 IdP 登录。他们的 Claude Code 会话通过 gateway 的 IAM 角色到达 Amazon Bedrock 上的 Claude 模型,因此没有模型凭证落在开发人员机器上。参考配置配置:

28 

29* **Amazon ECS on AWS Fargate** 服务或 **Amazon EKS** Deployment 运行 gateway 容器

30* **Amazon ECR** 存储库用于 gateway 镜像

31* **Amazon RDS for PostgreSQL** 实例在私有子网中,不可公开访问,用于 gateway 的[存储](/docs/zh-CN/claude-apps-gateway-config#store)

32* **AWS Secrets Manager** 机密用于 JWT 签名密钥、OIDC 客户端机密和 Postgres URL

33* **IAM 角色**具有 `bedrock:InvokeModel`、`bedrock:InvokeModelWithResponseStream` 和 `bedrock:CountTokens`,作为 ECS 任务角色附加或通过 EKS 上的 IAM Roles for Service Accounts (IRSA) 绑定

34* **内部应用负载均衡器**用于 HTTPS

35 

36<h2 id="prerequisites">

37 前置条件

38</h2>

39 

40该演练创建 gateway 自己的资源,但它建立在您已有的网络和身份基础设施之上。在开始之前,您需要:

41 

42* 一个 AWS 账户,具有创建[上述资源](#architecture)的权限

43* 安装了 [AWS CLI v2](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) 并[已认证](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-authentication.html),以及本地安装了 [Docker](https://docs.docker.com/get-started/get-docker/)

44* 一个 [VPC](https://docs.aws.amazon.com/vpc/latest/userguide/what-is-amazon-vpc.html),至少有两个[私有子网](https://docs.aws.amazon.com/vpc/latest/userguide/configure-subnets.html)在不同的可用区中,通过 [NAT 网关](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html)具有出站互联网访问;内部负载均衡器需要两个 AZ 中的子网,gateway 需要到 Bedrock 和您的 IdP 的出站访问

45* 一个 Okta OIDC web 应用程序,重定向 URI 为 `https://<gateway-host>/oauth/callback`;请参阅[身份提供商设置](/docs/zh-CN/claude-apps-gateway-deploy#identity-provider-setup)

46* gateway 的 TLS 主机名,通常是 [Route 53 私有托管区域](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/hosted-zones-private.html)中的内部 DNS 名称,指向负载均衡器,具有该名称的 [ACM 证书](https://docs.aws.amazon.com/acm/latest/userguide/gs.html),由 [AWS Private CA](https://docs.aws.amazon.com/privateca/latest/userguide/PcaWelcome.html) 导入或颁发

47 

48<h3 id="set-your-environment-variables">

49 设置您的环境变量

50</h3>

51 

52本页上的每个命令都从您的 shell 读取四个值:`AWS_REGION`、`ACCOUNT_ID`、`VPC_ID` 和 `PRIVATE_SUBNETS`。

53 

54选择一个 Bedrock 提供您需要的 Claude 模型的美国区域。该演练依赖于 gateway 的内置模型目录,该目录解析为 `us.anthropic.*` 推理配置文件,IAM 策略授予这些 ARN。在非美国区域中,添加一个[`models:` 块](/docs/zh-CN/claude-apps-gateway-config#models),其中包含该地理位置的推理配置文件 ID,并更改 IAM 策略的 ARN 前缀以匹配。

55 

56如果您手边没有 VPC ID,请使用 `aws ec2 describe-vpcs` 列出您的 VPC,然后列出该 VPC 的子网以找到两个不同可用区中的私有子网:

57 

58```bash theme={null}

59aws ec2 describe-subnets --filters "Name=vpc-id,Values=<your-vpc-id>" \

60 --query 'Subnets[].{ID:SubnetId,AZ:AvailabilityZone,CIDR:CidrBlock}' --output table

61```

62 

63在继续之前导出所有四个:

64 

65```bash theme={null}

66export AWS_REGION=us-east-1 # 一个 Bedrock 提供您需要的 Claude 模型的美国区域

67export ACCOUNT_ID="$(aws sts get-caller-identity --query Account --output text)"

68export VPC_ID=<your-vpc-id>

69export PRIVATE_SUBNETS="<subnet-id-a> <subnet-id-b>"

70```

71 

72<h2 id="deploy-the-gateway">

73 部署 gateway

74</h2>

75 

76下面的步骤使用 `aws` 命令配置完整的部署。

77 

78<Steps>

79 <Step title="创建安全组">

80 三个安全组链接流量路径:您的企业网络在 443 上到达负载均衡器,负载均衡器在 8080 上到达 gateway,gateway 在 5432 上到达 Postgres。其他任何东西都无法到达。如何附加它们取决于计算轨道:

81 

82 * 在 ECS Fargate 上,部署步骤将 `$ALB_SG` 附加到负载均衡器,将 `$GW_SG` 附加到服务。

83 * 在 EKS 上,AWS Load Balancer Controller 为 ALB 创建自己的前端安全组,因此 `$ALB_SG` 和 `$GW_SG` 未使用:部署步骤的 `inbound-cidrs` 注解将侦听器限制为您的企业网络,数据库安全组允许集群的安全组而不是 `$GW_SG`。

84 

85 ```bash theme={null}

86 ALB_SG="$(aws ec2 create-security-group --group-name claude-gateway-alb \

87 --description "Claude gateway ALB" --vpc-id "$VPC_ID" \

88 --query GroupId --output text)"

89 GW_SG="$(aws ec2 create-security-group --group-name claude-gateway-svc \

90 --description "Claude gateway service" --vpc-id "$VPC_ID" \

91 --query GroupId --output text)"

92 DB_SG="$(aws ec2 create-security-group --group-name claude-gateway-db \

93 --description "Claude gateway Postgres" --vpc-id "$VPC_ID" \

94 --query GroupId --output text)"

95 

96 aws ec2 authorize-security-group-ingress --group-id "$ALB_SG" \

97 --protocol tcp --port 443 --cidr <your-corporate-cidr>

98 aws ec2 authorize-security-group-ingress --group-id "$GW_SG" \

99 --protocol tcp --port 8080 --source-group "$ALB_SG"

100 aws ec2 authorize-security-group-ingress --group-id "$DB_SG" \

101 --protocol tcp --port 5432 --source-group "$GW_SG"

102 ```

103 </Step>

104 

105 <Step title="创建 IAM 角色并提交用例表单">

106 gateway 使用专用任务角色运行,其唯一权限是在 Bedrock 上调用 Claude 模型。根据 [Bedrock 上游参考](/docs/zh-CN/claude-apps-gateway-config#amazon-bedrock),该策略必须涵盖跨区域推理配置文件 ARN 和底层基础模型 ARN:

107 

108 ```bash theme={null}

109 cat > bedrock-invoke.json <<EOF

110 {

111 "Version": "2012-10-17",

112 "Statement": [{

113 "Effect": "Allow",

114 "Action": ["bedrock:InvokeModel", "bedrock:InvokeModelWithResponseStream", "bedrock:CountTokens"],

115 "Resource": [

116 "arn:aws:bedrock:${AWS_REGION}:${ACCOUNT_ID}:inference-profile/us.anthropic.*",

117 "arn:aws:bedrock:*::foundation-model/anthropic.*"

118 ]

119 }]

120 }

121 EOF

122 cat > ecs-trust.json <<'EOF'

123 {

124 "Version": "2012-10-17",

125 "Statement": [{

126 "Effect": "Allow",

127 "Principal": { "Service": "ecs-tasks.amazonaws.com" },

128 "Action": "sts:AssumeRole"

129 }]

130 }

131 EOF

132 

133 aws iam create-role --role-name claude-gateway-task \

134 --assume-role-policy-document file://ecs-trust.json

135 aws iam put-role-policy --role-name claude-gateway-task \

136 --policy-name bedrock-invoke --policy-document file://bedrock-invoke.json

137 ```

138 

139 ECS 还需要一个执行角色,ECS 代理本身使用它从 ECR 拉取镜像并注入稍后创建的 Secrets Manager 值。它与 gateway 的 AWS SDK 在运行时使用的任务角色分开:

140 

141 ```bash theme={null}

142 aws iam create-role --role-name claude-gateway-execution \

143 --assume-role-policy-document file://ecs-trust.json

144 aws iam attach-role-policy --role-name claude-gateway-execution \

145 --policy-arn arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy

146 cat > secrets-read.json <<EOF

147 {

148 "Version": "2012-10-17",

149 "Statement": [{

150 "Effect": "Allow",

151 "Action": ["secretsmanager:GetSecretValue", "secretsmanager:DescribeSecret"],

152 "Resource": [

153 "arn:aws:secretsmanager:${AWS_REGION}:${ACCOUNT_ID}:secret:gateway-jwt-secret-??????",

154 "arn:aws:secretsmanager:${AWS_REGION}:${ACCOUNT_ID}:secret:gateway-oidc-client-secret-??????",

155 "arn:aws:secretsmanager:${AWS_REGION}:${ACCOUNT_ID}:secret:gateway-postgres-url-??????"

156 ]

157 }]

158 }

159 EOF

160 aws iam put-role-policy --role-name claude-gateway-execution \

161 --policy-name read-gateway-secrets --policy-document file://secrets-read.json

162 ```

163 

164 该策略为每个机密命名一个 ARN,而不是裸 `gateway-*` 通配符,在共享账户中,这也会匹配不相关的机密;尾部的 `-??????` 完全匹配 Secrets Manager 附加到每个机密 ARN 的随机六字符后缀。尾部的 `-*` 将是一个普通前缀 glob,也会匹配更长的名称,例如 `gateway-postgres-url-prod`。

165 

166 IAM 策略授予 gateway 调用 Bedrock 的权限,Bedrock 在商业区域中默认启用模型访问。剩余的账户级门槛是 Anthropic 的一次性用例表单:如果您账户中没有人提交过,请打开 [Amazon Bedrock 控制台](https://console.aws.amazon.com/bedrock/),从模型目录中选择一个 Anthropic 模型,并完成表单。提交后立即授予访问权限;有关 AWS Organizations 表单和提交者需要的 IAM 权限,请参阅 [Claude Code on Amazon Bedrock](/docs/zh-CN/amazon-bedrock#1-submit-use-case-details)。

167 

168 EKS 轨道改为在 IRSA 角色上重用两个策略文档,而不是两个 ECS 角色;请参阅部署步骤。

169 </Step>

170 

171 <Step title="配置 Amazon RDS for PostgreSQL">

172 该实例在私有子网中运行,没有公共地址,存储加密打开。引擎版本固定为 Postgres 16,满足 gateway 支持的 PostgreSQL 14 下限,并保证下面的参数组系列与实例匹配。

173 

174 首先,创建将数据库放在私有子网中的子网组,以及具有 `rds.force_ssl=1` 的参数组,以便服务器拒绝明文连接。引擎版本固定一次,因为参数组的系列必须与实例运行的引擎主版本匹配:

175 

176 ```bash theme={null}

177 aws rds create-db-subnet-group --db-subnet-group-name claude-gateway-db \

178 --db-subnet-group-description "Claude gateway" --subnet-ids $PRIVATE_SUBNETS

179 

180 PG_VERSION=16

181 PG_FAMILY="postgres${PG_VERSION}"

182 aws rds create-db-parameter-group --db-parameter-group-name claude-gateway-db \

183 --db-parameter-group-family "$PG_FAMILY" \

184 --description "Claude gateway - require TLS on every connection"

185 aws rds modify-db-parameter-group --db-parameter-group-name claude-gateway-db \

186 --parameters "ParameterName=rds.force_ssl,ParameterValue=1,ApplyMethod=immediate"

187 ```

188 

189 然后使用生成的主密码创建实例:

190 

191 ```bash theme={null}

192 PGPASS="$(openssl rand -hex 24)"

193 aws rds create-db-instance --db-instance-identifier claude-gateway-db \

194 --engine postgres --engine-version "$PG_VERSION" \

195 --db-instance-class db.t4g.micro \

196 --allocated-storage 20 --db-name claude_gateway \

197 --master-username gateway --master-user-password "$PGPASS" \

198 --db-subnet-group-name claude-gateway-db \

199 --db-parameter-group-name claude-gateway-db \

200 --vpc-security-group-ids "$DB_SG" \

201 --no-publicly-accessible --storage-encrypted

202 ```

203 

204 字面 `--master-user-password` 参数在命令运行时在进程表和审计/EDR 日志中可见,与机密步骤的注释涵盖的相同暴露。在共享或受监控的主机上,改为从 `0600` 文件通过 `--cli-input-json` 传递密码,就像 bundle 的 `setup.sh` 所做的那样。

205 

206 等待实例启动,这可能需要几分钟,然后读取其私有端点并组装 gateway 将使用的连接字符串:

207 

208 ```bash theme={null}

209 aws rds wait db-instance-available --db-instance-identifier claude-gateway-db

210 DB_HOST="$(aws rds describe-db-instances --db-instance-identifier claude-gateway-db \

211 --query 'DBInstances[0].Endpoint.Address' --output text)"

212 GATEWAY_POSTGRES_URL="postgres://gateway:${PGPASS}@${DB_HOST}:5432/claude_gateway?sslmode=verify-full"

213 ```

214 

215 `sslmode=verify-full` 使 gateway 验证 RDS 服务器证书的链和主机名,不仅仅是加密。信任锚是 [AWS RDS 证书包](https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem),镜像构建步骤下面将其复制到 `/etc/claude/rds-global-bundle.pem` 并通过 `NODE_EXTRA_CA_CERTS` 信任。不要将 libpq 风格的 `sslrootcert=` 参数附加到 URL:gateway 的驱动程序仅从查询字符串读取 `sslmode`,并会将 `sslrootcert` 转发给 Postgres 作为启动参数,服务器会拒绝。

216 

217 ECS 服务或 EKS pod 必须在此 VPC 中运行,以便它们可以到达实例的私有端点,`claude-gateway-db` 安全组仅允许 gateway 的安全组。

218 </Step>

219 

220 <Step title="编写 gateway.yaml">

221 `upstreams` 块使用 `auth: {}` 指向 Bedrock,因此 gateway 通过 ECS 上的任务角色或 EKS 上的 IRSA 角色从 AWS 默认凭证链进行身份验证。有关每个字段,请参阅[配置参考](/docs/zh-CN/claude-apps-gateway-config)。

222 

223 两个 `listen` 字段描述什么位于 gateway 前面:

224 

225 * `public_url`:外部 `https://` 源,对于任何非环回绑定都是必需的;请参阅 [`listen` 参考](/docs/zh-CN/claude-apps-gateway-config#listen)。gateway 仅从此值构建 IdP `redirect_uri` 和其发现文档,从不从 `X-Forwarded-*` 标头构建。

226 * `trusted_proxies`:前端的源范围。gateway 仅当 TCP 对等体在此列表中时才遵守 `X-Forwarded-For`,然后遍历链越过受信任的跳跃,因此每 IP 登录速率限制和审计事件记录开发人员 IP 而不是负载均衡器的。

227 

228 在两个轨道上,前端是内部 ALB,无论是直接创建还是由 AWS Load Balancer Controller 创建,ALB 的节点从它附加到的子网中获取地址,因此将 `trusted_proxies` 设置为这些子网的 CIDR。这将这些子网中的每个主机信任为代理。保持 ALB 的入站源(您的企业 CIDR)不与它们重叠,并且不要与可能通过 `X-Forwarded-For` 欺骗客户端 IP 的不受信任的工作负载共享子网。

229 

230 ALB 的客户端端口保留属性 `routing.http.xff_client_port.enabled` 可以保持任一设置:启用时,ALB 将客户端写为 `203.0.113.7:54321` 或 `[2001:db8::1]:54321`,gateway 读取两者并删除端口。

231 

232 ```yaml gateway.yaml theme={null}

233 listen:

234 host: 0.0.0.0

235 port: 8080

236 public_url: https://claude-gateway.internal.example.com

237 trusted_proxies: [<your-alb-subnet-cidrs>]

238 

239 oidc:

240 issuer: https://example.okta.com

241 client_id: 0oa1example2

242 client_secret: ${OIDC_CLIENT_SECRET} # EKS: ${file:/secrets/oidc-client-secret}

243 allowed_email_domains: [example.com]

244 # Okta org 授权服务器返回一个省略了

245 # 电子邮件和组的瘦 id_token;gateway 从 /userinfo 填充它们。

246 userinfo_fallback: true

247 # Okta 仅在请求 `groups` 范围且

248 # 应用的组声明过滤器允许它们时才发出组。

249 scopes: [openid, profile, email, offline_access, groups]

250 

251 session:

252 jwt_secret: ${GATEWAY_JWT_SECRET} # EKS: ${file:/secrets/jwt-secret}

253 ttl_hours: 8 # 限制取消配置延迟;降低

254 # 朝向 1 以获得更紧密的撤销

255 

256 store:

257 postgres_url: ${GATEWAY_POSTGRES_URL} # EKS: ${file:/secrets/postgres-url}

258 

259 upstreams:

260 - provider: bedrock

261 region: <your-region> # 匹配 $AWS_REGION 以便 IAM

262 # 策略的 ARN 涵盖它

263 auth: {} # AWS 默认凭证链:

264 # ECS 任务角色,或 EKS 上的 IRSA

265 ```

266 

267 <Note>

268 只有 `oidc` 块是 Okta 特定的。要改为使用 Microsoft Entra ID,请将 `issuer` 设置为 `https://login.microsoftonline.com/<tenant-id>/v2.0`,删除 `userinfo_fallback` 和 `groups` 范围,并注意 Entra 发出组对象 ID 而不是名称,因此 [`managed.policies`](/docs/zh-CN/claude-apps-gateway-config#managed) 必须匹配 GUID,或使用 `oidc.groups_claim: roles` 的应用角色。请参阅[身份提供商设置](/docs/zh-CN/claude-apps-gateway-deploy#identity-provider-setup)。

269 </Note>

270 </Step>

271 

272 <Step title="在 AWS Secrets Manager 中存储机密">

273 创建三个机密;IAM 步骤中的执行角色已经可以读取它们:

274 

275 ```bash theme={null}

276 aws secretsmanager create-secret --name gateway-jwt-secret \

277 --secret-string "$(openssl rand -base64 32)"

278 aws secretsmanager create-secret --name gateway-oidc-client-secret \

279 --secret-string '<your-okta-client-secret>'

280 aws secretsmanager create-secret --name gateway-postgres-url \

281 --secret-string "$GATEWAY_POSTGRES_URL"

282 ```

283 

284 注意每个调用打印的 ARN;ECS 任务定义通过 ARN 引用机密。

285 

286 <Note>

287 字面 `--secret-string` 参数在每个命令运行时在进程表和审计/EDR 日志中可见。在共享或受监控的主机上,将值放在 `0600` 文件中,改为传递 `--secret-string file://<path>`。bundle 的 `setup.sh` 以相同的方式将机密值保持在进程 argv 之外,将 `0600` 临时文件传递给 `--cli-input-json`。

288 </Note>

289 

290 与机密不同,`gateway.yaml` 本身不包含机密值,因为每个凭证在启动时通过 [`${VAR}` 或 `${file:...}` 扩展](/docs/zh-CN/claude-apps-gateway-config#secret-expansion)解析。一切如何到达容器因轨道而异:

291 

292 * 在 ECS 上,下一步的构建将 `gateway.yaml` 复制到镜像中的 `/etc/claude/gateway.yaml`,任务定义通过其 `secrets` 字段将三个机密作为环境变量注入,因此 YAML 引用 `${GATEWAY_JWT_SECRET}`、`${OIDC_CLIENT_SECRET}` 和 `${GATEWAY_POSTGRES_URL}`。

293 * 在 EKS 上,从 ConfigMap 挂载 `gateway.yaml` 并将机密作为文件挂载在 `/secrets`,引用为 `${file:/secrets/...}`。使用 External Secrets Operator 或 Secrets Store CSI 驱动程序的 AWS 提供程序从 Secrets Manager 获取 Kubernetes Secrets,或使用 `kubectl` 直接创建它们。

294 </Step>

295 

296 <Step title="构建镜像并将其推送到 Amazon ECR">

297 根据[容器镜像要求](/docs/zh-CN/claude-apps-gateway-deploy#container-image)构建镜像,将 `linux-x64` glibc 二进制文件放在构建上下文中的 `./claude`。根据这些要求编写您自己的 Dockerfile,或从 bundle 的 [`Dockerfile`](https://github.com/anthropics/claude-code/blob/main/examples/gateway/aws/Dockerfile) 开始,它将填充的 `gateway.yaml` 从前面的步骤复制到镜像中的 `/etc/claude/gateway.yaml`。在 ECS 上,该嵌入式副本是配置到达容器的方式,这就是为什么构建在文件被写入后进行。EKS 轨道改为在部署时从 ConfigMap 挂载 `gateway.yaml`,因此嵌入式副本在那里未使用。

298 

299 镜像还携带 AWS RDS 证书包作为连接字符串的 `sslmode=verify-full` 的信任锚,因此首先将其下载到构建上下文中。AWS 轮换 bundle(新的区域 CA 被附加),因此每次构建时下载它,而不是固定校验和或提交它:

300 

301 ```bash theme={null}

302 curl -fL --proto '=https' -o rds-global-bundle.pem \

303 https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem

304 ```

305 

306 容器镜像要求不涵盖 bundle,因此如果您编写自己的 Dockerfile,添加复制和信任它的两行;bundle 的 `Dockerfile` 已经包含两者:

307 

308 ```dockerfile theme={null}

309 COPY rds-global-bundle.pem /etc/claude/rds-global-bundle.pem

310 ENV NODE_EXTRA_CA_CERTS=/etc/claude/rds-global-bundle.pem

311 ```

312 

313 创建 ECR 存储库并将 Docker 登录到它。不可变标签意味着部署步骤固定的 `<version>` 标签以后不能被无声地重新指向不同的镜像:

314 

315 ```bash theme={null}

316 aws ecr create-repository --repository-name claude-gateway \

317 --image-tag-mutability IMMUTABLE \

318 --image-scanning-configuration scanOnPush=true

319 aws ecr get-login-password --region "$AWS_REGION" \

320 | docker login --username AWS --password-stdin \

321 "${ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com"

322 ```

323 

324 构建并推送镜像。下面的任务定义运行 `linux/amd64`,因此平台必须在这里匹配;对于 Fargate on ARM64 (Graviton),使用 `linux-arm64` 二进制文件构建 `linux/arm64` 并改为将 `cpuArchitecture` 设置为 `ARM64`:

325 

326 ```bash theme={null}

327 docker build --platform=linux/amd64 \

328 -t "${ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/claude-gateway:<version>" .

329 docker push "${ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/claude-gateway:<version>"

330 ```

331 </Step>

332 

333 <Step title="部署">

334 <Tabs>

335 <Tab title="ECS Fargate">

336 创建集群和 gateway 的日志组,用于其 stderr,其中包含其审计事件和操作日志。保留期需要通过单独的调用来设置;如果不设置,CloudWatch 会永远保留日志;将 90 天与您的审计保留策略对齐:

337 

338 ```bash theme={null}

339 aws ecs create-cluster --cluster-name claude-gateway

340 aws logs create-log-group --log-group-name /ecs/claude-gateway

341 aws logs put-retention-policy --log-group-name /ecs/claude-gateway \

342 --retention-in-days 90

343 ```

344 

345 编写任务定义。任务角色携带 Bedrock 权限,执行角色注入机密;使用 Secrets Manager 步骤中的机密 ARN:

346 

347 ```json claude-gateway-task.json theme={null}

348 {

349 "family": "claude-gateway",

350 "networkMode": "awsvpc",

351 "requiresCompatibilities": ["FARGATE"],

352 "cpu": "1024",

353 "memory": "2048",

354 "runtimePlatform": { "cpuArchitecture": "X86_64", "operatingSystemFamily": "LINUX" },

355 "executionRoleArn": "arn:aws:iam::<account-id>:role/claude-gateway-execution",

356 "taskRoleArn": "arn:aws:iam::<account-id>:role/claude-gateway-task",

357 "containerDefinitions": [

358 {

359 "name": "gateway",

360 "image": "<account-id>.dkr.ecr.<region>.amazonaws.com/claude-gateway:<version>",

361 "portMappings": [{ "containerPort": 8080 }],

362 "secrets": [

363 { "name": "GATEWAY_JWT_SECRET", "valueFrom": "<gateway-jwt-secret ARN>" },

364 { "name": "OIDC_CLIENT_SECRET", "valueFrom": "<gateway-oidc-client-secret ARN>" },

365 { "name": "GATEWAY_POSTGRES_URL", "valueFrom": "<gateway-postgres-url ARN>" }

366 ],

367 "logConfiguration": {

368 "logDriver": "awslogs",

369 "options": {

370 "awslogs-group": "/ecs/claude-gateway",

371 "awslogs-region": "<region>",

372 "awslogs-stream-prefix": "gateway"

373 }

374 }

375 }

376 ]

377 }

378 ```

379 

380 注册它:

381 

382 ```bash theme={null}

383 aws ecs register-task-definition --cli-input-json file://claude-gateway-task.json

384 ```

385 

386 在前面放一个内部 ALB,带有一个对 gateway 进行健康检查的目标组。`--ip-address-type ipv4` 很重要:内部双栈 ALB 发布公共范围 AAAA 记录,`/login` 私有网络检查拒绝:

387 

388 ```bash theme={null}

389 ALB_ARN="$(aws elbv2 create-load-balancer --name claude-gateway \

390 --scheme internal --type application --ip-address-type ipv4 \

391 --subnets $PRIVATE_SUBNETS --security-groups "$ALB_SG" \

392 --query 'LoadBalancers[0].LoadBalancerArn' --output text)"

393 

394 TG_ARN="$(aws elbv2 create-target-group --name claude-gateway \

395 --protocol HTTP --port 8080 --vpc-id "$VPC_ID" --target-type ip \

396 --health-check-path /readyz \

397 --query 'TargetGroups[0].TargetGroupArn' --output text)"

398 ```

399 

400 添加 HTTPS 侦听器。`--ssl-policy` 固定现代 TLS 下限,因为省略它会回退到遗留 `ELBSecurityPolicy-2016-08` 默认值,仍然接受 TLS 1.0/1.1。

401 

402 ALB 在默认情况下 60 秒无数据后关闭连接。gateway 的保活 ping 保持流在该默认值内,因此提高超时在 ping 节奏上方增加余量;[故障排除](#troubleshooting)行关于丢弃的流涵盖了机制和较旧的 gateway。下面的命令添加侦听器并提高超时:

403 

404 ```bash theme={null}

405 aws elbv2 create-listener --load-balancer-arn "$ALB_ARN" \

406 --protocol HTTPS --port 443 \

407 --ssl-policy ELBSecurityPolicy-TLS13-1-2-2021-06 \

408 --certificates CertificateArn=<your-acm-certificate-arn> \

409 --default-actions Type=forward,TargetGroupArn="$TG_ARN"

410 

411 aws elbv2 modify-load-balancer-attributes --load-balancer-arn "$ALB_ARN" \

412 --attributes Key=idle_timeout.timeout_seconds,Value=3600

413 ```

414 

415 创建服务。部署断路器将其任务持续失败的部署(来自坏镜像或无法启动的配置)回滚到最后的稳定状态,而不是永远重新启动失败的任务:

416 

417 ```bash theme={null}

418 aws ecs create-service --cluster claude-gateway --service-name claude-gateway \

419 --task-definition claude-gateway --desired-count 1 --launch-type FARGATE \

420 --deployment-configuration "deploymentCircuitBreaker={enable=true,rollback=true}" \

421 --health-check-grace-period-seconds 60 \

422 --network-configuration "awsvpcConfiguration={subnets=[$(echo $PRIVATE_SUBNETS | tr ' ' ',')],securityGroups=[$GW_SG],assignPublicIp=DISABLED}" \

423 --load-balancers "targetGroupArn=$TG_ARN,containerName=gateway,containerPort=8080"

424 ```

425 

426 60 秒的宽限期给冷任务时间拉取镜像、连接到存储并在 ECS 开始计算针对部署的失败之前回答其第一个健康检查。目标组对 `GET /readyz` 的健康检查验证存储是否可达,因此无法到达 Postgres 的任务永远不会进入轮换;有关权衡和 `/healthz` 替代方案,请参阅[中断行为](/docs/zh-CN/claude-apps-gateway-deploy#outage-behavior)。

427 

428 任务在私有子网中运行,没有公共 IP,因此所有出站(到 Bedrock、您的 IdP、Secrets Manager、ECR 和 CloudWatch Logs)都通过 NAT 网关。要将 Bedrock 流量保持在公共路径之外,创建一个 `bedrock-runtime` 接口 VPC 端点并将上游的 `base_url` 指向它,如 [Bedrock 上游参考](/docs/zh-CN/claude-apps-gateway-config#amazon-bedrock)所示;IdP 仍然需要互联网出站。

429 

430 通过在 Route 53 私有托管区域中为 gateway 的内部 DNS 名称别名到 ALB,并将 `listen.public_url` 设置为该主机名,为开发人员完成私有可解析主机名。ALB 自己的 `*.elb.amazonaws.com` 名称在内部 ALB 上解析为私有地址,但它不能携带您的 ACM 证书,因此使用您自己的名称。

431 

432 在第一次登录之前,将 OAuth 客户端的授权重定向 URI 更新为 `<public_url>/oauth/callback`。更改 `public_url` 后,在新标签下重建并推送镜像,注册新的任务定义修订版本,然后重新部署。在 ECS 上,该设置位于镜像的嵌入式 `gateway.yaml` 中,gateway 仅从该设置构建其公共源,忽略 `X-Forwarded-Host` 和 `X-Forwarded-Proto`。`X-Forwarded-For` 仅在设置 `listen.trusted_proxies` 时才被遵守用于客户端 IP。

433 </Tab>

434 

435 <Tab title="EKS">

436 此轨道需要本地安装 `kubectl` 和 `eksctl`,以及具有 IAM OIDC 提供程序和已安装 AWS Load Balancer Controller 的现有 EKS 集群。集群必须在 `$VPC_ID` 上,以便 pod 可以到达 RDS 私有端点,`claude-gateway-db` 安全组必须允许集群的 pod 或节点安全组而不是 `$GW_SG`。

437 

438 在 EKS 上,gateway 通过 IRSA 而不是 ECS 角色获得其 Bedrock 凭证。IAM 步骤中的 `ecs-tasks.amazonaws.com` 信任策略在这里不适用;IRSA 需要一个信任策略在集群的 OIDC 提供程序上联合的角色,范围为 `system:serviceaccount:claude-gateway:gateway`。`eksctl create iamserviceaccount` 在一个步骤中创建该角色、附加策略并使用角色 ARN 注解 Kubernetes 服务账户。将 IAM 步骤中的两个策略文档转换为它可以附加的托管策略:

439 

440 ```bash theme={null}

441 BEDROCK_POLICY_ARN="$(aws iam create-policy --policy-name claude-gateway-bedrock-invoke \

442 --policy-document file://bedrock-invoke.json --query Policy.Arn --output text)"

443 SECRETS_POLICY_ARN="$(aws iam create-policy --policy-name claude-gateway-secrets-read \

444 --policy-document file://secrets-read.json --query Policy.Arn --output text)"

445 

446 kubectl create namespace claude-gateway

447 eksctl create iamserviceaccount --cluster <your-cluster> --region "$AWS_REGION" \

448 --namespace claude-gateway --name gateway --role-name claude-gateway \

449 --attach-policy-arn "$BEDROCK_POLICY_ARN" \

450 --attach-policy-arn "$SECRETS_POLICY_ARN" \

451 --approve

452 ```

453 

454 机密策略仅在 pod 自己读取 Secrets Manager 时需要,如 Secrets Store CSI 驱动程序的 AWS 提供程序使用挂载 pod 的服务账户所做的那样;如果您以其他方式创建 Kubernetes Secrets,则删除它。提供程序需要策略的两个操作:它在协调轮换的机密时调用 `DescribeSecret`,因此仅 `GetSecretValue` 授予在第一次部署时挂载但停止拾取轮换。

455 

456 将 gateway 部署为标准 Deployment 加上 Service 和 Ingress,如[Kubernetes 部署](/docs/zh-CN/claude-apps-gateway-deploy#kubernetes)中所述,具有:

457 

458 * `serviceAccountName: gateway`

459 * 从 ConfigMap 挂载的 `gateway.yaml` 和在 `/secrets` 挂载的机密

460 * 就绪探针指向 `GET /readyz`

461 

462 对于前端,由 AWS Load Balancer Controller 管理的 Ingress 配置内部 ALB。使用以下注解:

463 

464 * `alb.ingress.kubernetes.io/scheme: internal` 和 `alb.ingress.kubernetes.io/target-type: ip`

465 * `alb.ingress.kubernetes.io/ip-address-type: ipv4`,因此不会发布会被 `/login` [私有网络检查](/docs/zh-CN/claude-apps-gateway#prerequisites)拒绝的公共范围 AAAA 记录

466 * `alb.ingress.kubernetes.io/inbound-cidrs: <your-corporate-cidr>`,因此控制器管理的前端安全组仅允许您的企业网络而不是其 `0.0.0.0/0` 默认值

467 * `alb.ingress.kubernetes.io/certificate-arn` 与 ACM 证书

468 * `alb.ingress.kubernetes.io/ssl-policy: ELBSecurityPolicy-TLS13-1-2-2021-06`,因此侦听器不会回退到接受 TLS 1.0 和 1.1 的遗留默认策略

469 * `alb.ingress.kubernetes.io/load-balancer-attributes: idle_timeout.timeout_seconds=3600`,gateway 流式保活上方的余量;请参阅[故障排除](#troubleshooting)

470 

471 使用 IRSA,AWS SDK 读取投影的服务账户令牌并与 AWS STS 交换它,因此 pod 永远不需要 EC2 实例元数据服务;出站 NetworkPolicy 可能会为 gateway pod 阻止 `169.254.169.254`。下面[故障排除](#troubleshooting)中的节点跳跃限制问题仅适用于跳过 IRSA 并依赖节点实例角色的集群。

472 </Tab>

473 </Tabs>

474 </Step>

475 

476 <Step title="将 gateway URL 推送到开发人员机器">

477 gateway 现在正在运行,但开发人员在通过 MDM 部署的[托管设置文件](/docs/zh-CN/claude-apps-gateway#set-the-gateway-url)中设置 `forceLoginMethod` 和 `forceLoginGatewayUrl` 之前无法从 `/login` 到达它。开发人员无法手动在登录选择器中选择 gateway 选项。

478 </Step>

479</Steps>

480 

481<h2 id="terraform-reference">

482 Terraform 参考

483</h2>

484 

485位于 [`examples/gateway/aws`](https://github.com/anthropics/claude-code/tree/main/examples/gateway/aws) 的伴随 bundle 将本页打包为代码:

486 

487* **`setup.sh`** 使用相同的 `aws` 命令在 ECS Fargate 轨道上编写上面的配置演练。它是幂等的:检测并跳过现有资源,因此重新运行它是安全的,任何默认值都可以通过环境变量覆盖。您仍然自己创建 Okta OIDC 客户端机密和 ACM 证书:没有它们的运行会跳过 ECS/ALB 部署,命名缺失的输入,并打印 `create-secret` 命令;创建两者并重新运行。Bedrock 用例表单和 Route 53 别名打印为下一步而不是自动运行,客户端 MDM 推送保持从本页的手动步骤。

488* **`gateway.yaml.example`** 是来自 gateway.yaml 步骤的配置模板,包含可选键注释掉。将其复制到 `gateway.yaml` 并在构建之前替换每个 `REPLACE_ME`。

489* **`Dockerfile`** 从预构建的 `linux-x64` 二进制文件构建运行时镜像,并将您填充的 `gateway.yaml` 复制到 `/etc/claude/gateway.yaml`,加上锚定存储 `sslmode=verify-full` 的 AWS RDS 证书包。`setup.sh` 仅在构建上下文中不存在文件时下载 bundle;删除文件并在新标签下重建以拾取 AWS CA 轮换。配置文件不包含机密值,因为每个凭证在启动时通过 `${VAR}` 扩展解析。因此配置编辑意味着在新标签下重建;`setup.sh` 通过使用文件的哈希标记镜像来自动化这一点。

490* **`terraform/`** 声明性地配置相同的 ECS Fargate 范围:安全组、IAM 角色、ECR 存储库、RDS 实例、Secrets Manager 机密和内部 ALB 后面的 ECS 服务。VPC 和私有子网保持前置条件,作为变量传入。Terraform 创建 ECR 存储库但不构建镜像,服务定义引用镜像,因此应用是两个通过:存储库的目标应用,然后构建和推送,然后完整应用。bundle 的 `terraform/README.md` 涵盖变量、远程状态和拆卸。

491 

492像本页一样,bundle 是客户管理基础设施的工作示例,而不是受支持的生产部署;在依赖它之前查看并将其调整到您自己的环境。

493 

494<h2 id="troubleshooting">

495 故障排除

496</h2>

497 

498有关 gateway 启动和登录错误,请参阅平台无关的[故障排除表](/docs/zh-CN/claude-apps-gateway-deploy#troubleshooting)。下面的条目特定于 AWS。

499 

500| 症状 | 原因 | 修复 |

501| ----------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

502| CLI `/login`:`Gateway hosts must be on your organization's private network; <host> resolves to the public (or unrecognized) address <ip>` | gateway 名称解析为至少一个公共地址。双栈内部 ALB 发布公共范围 AAAA 记录,[私有网络检查](/docs/zh-CN/claude-apps-gateway#prerequisites)要求每个解析的地址都是私有的 | 使用 `--ip-address-type ipv4` 创建 ALB,或提供没有公共 AAAA 记录的单独内部 DNS 名称 |

503| 每个 Bedrock 请求返回 502;日志显示 `Could not load credentials from any providers` | 任务在没有任务角色的 ECS EC2 启动类型上运行,或 pod 在没有 IRSA 的 EKS 节点上运行,因此凭证来自实例元数据,IMDSv2 的默认跳跃限制 1 在容器内停止。本页上的两个轨道都不受影响:Fargate 任务角色和 IRSA 不使用实例元数据 | 更喜欢任务角色和 IRSA。在实例凭证不可避免的地方,使用 `aws ec2 modify-instance-metadata-options --instance-id <id> --http-put-response-hop-limit 2` 提高跳跃限制;[平台无关表](/docs/zh-CN/claude-apps-gateway-deploy#troubleshooting)涵盖权衡 |

504| Bedrock 请求返回 `403 AccessDeniedException` | 账户未提交 Anthropic 的一次性用例表单,启动自动 AWS Marketplace 订阅的账户首次调用尚未完成,或任务角色的策略缺少推理配置文件或基础模型 ARN | 从 Bedrock 控制台的模型目录提交用例表单;如果刚刚提交或这是账户的首次调用,请在几分钟后重试。在两个 ARN 系列上授予 `bedrock:InvokeModel` 和 `bedrock:InvokeModelWithResponseStream`。 |

505| Bedrock 返回 `ValidationException` 说按需吞吐量不受支持 | 自定义 `models:` 条目映射到区域仅通过推理配置文件提供的裸基础模型 ID | 改为将模型映射到其跨区域推理配置文件 ID (`us.anthropic.*`);内置目录已经这样做了 |

506| ECS 任务在 gateway 记录任何内容之前以 `ResourceInitializationError` 停止 | 执行角色无法读取 Secrets Manager 机密,或私有子网没有到 Secrets Manager 或 ECR 的路径 | 在三个 `gateway-` 机密的 ARN 上向执行角色授予 `secretsmanager:GetSecretValue`,并通过 NAT 网关提供出站,或者没有一个,Secrets Manager、ECR 和 CloudWatch Logs 的接口端点,`awslogs` 驱动程序在同一阶段需要,加上 S3 网关端点 |

507| Gateway 启动退出,出现 Postgres 连接超时错误 | 数据库安全组不允许 gateway 的安全组在 5432 上,或服务在数据库的 VPC 之外运行;存储在 5 秒后停止等待 | 在数据库的安全组上允许来自 gateway 安全组的 5432,并在与 DB 子网组相同的 VPC 中运行服务 |

508| Gateway 启动退出,出现 Postgres TLS 证书验证错误 | 连接字符串设置 `sslmode=verify-full` 但镜像不信任 RDS CA 包:包未复制到镜像中,或 `NODE_EXTRA_CA_CERTS` 不指向它 | 添加构建步骤的两个 Dockerfile 行,复制包并设置 `NODE_EXTRA_CA_CERTS`,然后重建、在新标签下推送并重新部署 |

509| 流式响应在安静期间中途下降 | v2.1.229 之前的 gateway 在 Bedrock 或 Claude Platform on AWS 上游上在上游安静时不发送任何内容,例如在没有流式输出的扩展思考期间。ALB 在默认情况下 60 秒无数据后关闭连接,因此它在该间隙处切断流。v2.1.229 及更高版本的 gateway 在该超时内保持安静流:在这些上游上,gateway 在大约 15 秒无流数据后发出 SSE `ping` 事件,在 Anthropic API 上游上它中继 API 自己的 ping | 将 gateway 更新到 v2.1.229 或更高版本,或通过 `modify-load-balancer-attributes` 或 EKS 上的 `load-balancer-attributes` Ingress 注解将 `idle_timeout.timeout_seconds` 属性设置为 `3600` |

510 

511<h2 id="telemetry">

512 遥测

513</h2>

514 

515gateway 为您提供每个开发人员的使用指标,无需任何每台机器的 OTEL 配置。Claude Code 发出 OpenTelemetry (OTLP) 指标、日志和选择加入的跟踪;[监控使用](/docs/zh-CN/monitoring-usage)涵盖 CLI 报告的所有内容。在 gateway 会话上,CLI 使用经过身份验证的 IdP 身份属性 `user.id`、`user.email` 和 `user.groups` 标记每个导出,因此使用按开发人员汇总,无需 `OTEL_RESOURCE_ATTRIBUTES` 管道。

516 

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

518 

519客户端遥测默认关闭;配置 `telemetry.forward_to` 是为连接的开发人员打开它的原因,每个交互式客户端为推送的设置显示一次性安全批准对话框,如[配置参考](/docs/zh-CN/claude-apps-gateway-config#telemetry)中所述。在 AWS 上,每个信号映射到目标如下。

520 

521<h3 id="client-metrics-logs-and-traces">

522 客户端指标、日志和跟踪

523</h3>

524 

525将 `telemetry.forward_to` 指向 OpenTelemetry 收集器,例如 [AWS Distro for OpenTelemetry (ADOT) 收集器](https://aws-otel.github.io/),并从那里导出到 Amazon CloudWatch、Amazon Managed Service for Prometheus 或任何 OTLP 后端。

526 

527将收集器作为其自己的内部服务运行,可通过 `https://` 到达;[`telemetry` 参考](/docs/zh-CN/claude-apps-gateway-config#telemetry)涵盖环回异常和 `CLAUDE_GATEWAY_ALLOW_LOOPBACK`。

528 

529<h3 id="gateway-logs">

530 Gateway 日志

531</h3>

532 

533在 ECS Fargate 上,无需额外设置:`awslogs` 驱动程序将 gateway 的 stderr(包含其审计事件和操作日志)传递到上面创建的 `/ecs/claude-gateway` 日志组。在 EKS 上,pod 日志默认不到达 CloudWatch,因此审计跟踪丢失,直到您安装日志收集:启用容器日志捕获的 Amazon CloudWatch Observability 附加组件,或 Fluent Bit DaemonSet。在任一轨道上,使用 CloudWatch Logs Insights 查询日志并从指标过滤器驱动警报。

534 

535<h3 id="container-metrics">

536 容器指标

537</h3>

538 

539使用 `aws ecs update-cluster-settings --cluster claude-gateway --settings name=containerInsights,value=enabled` 在集群上启用 Container Insights 以获得每个任务的 CPU、内存和网络。在 EKS 上,安装 Amazon CloudWatch Observability 附加组件。

540 

541<h3 id="spend">

542 支出

543</h3>

544 

545遥测显示事后使用;[支出限制](/docs/zh-CN/claude-apps-gateway-spend-limits)是 gateway 在共享上游凭证之上的实时每个开发人员视图和执行。

546 

547<h2 id="next-steps">

548 后续步骤

549</h2>

550 

551* [配置参考](/docs/zh-CN/claude-apps-gateway-config):每个 `gateway.yaml` 选项,包括 `managed.policies` 和 `telemetry`

552* [部署和操作](/docs/zh-CN/claude-apps-gateway-deploy):IdP 设置、健康检查、JWT 机密轮换、升级和安全模型

553* [Claude apps gateway 概述](/docs/zh-CN/claude-apps-gateway):快速入门和连接开发人员

554* [Claude apps gateway 的 AWS 示例](https://github.com/aws-samples/anthropic-on-aws/tree/main/claude-apps-gateway):AWS 维护的部署示例,涵盖一系列客户环境

Details

42 42 

43云会话需要访问你的 GitHub 存储库来克隆代码和推送分支。你可以通过两种方式授予访问权限:43云会话需要访问你的 GitHub 存储库来克隆代码和推送分支。你可以通过两种方式授予访问权限:

44 44 

45| 方法 | 工作原理 | 最适合 |45| 方法 | 如何连接 | 会话可以访问的存储库 | 最适合 |

46| :--------------- | :---------------------------------------------------- | :----------------------------------------- |46| :--------------- | :----------------------------------------------------- | :------------------------------------- | :----------------------------------------- |

47| **GitHub App** | 在[网络入门](/docs/zh-CN/web-quickstart)期间授权 Claude GitHub App。 | 浏览器入门;想要[自动修复](#auto-fix-pull-requests)的团队 |47| **GitHub App** | 在[网络快速入门](/docs/zh-CN/web-quickstart)期间授权 Claude GitHub App | 任何公开存储库,以及安装了 Claude GitHub App 的私有存储库 | 浏览器入门;想要[自动修复](#auto-fix-pull-requests)的团队 |

48| **`/web-setup`** | 在终端中运行 `/web-setup` 以将本地 `gh` CLI 令牌同步到你的 Claude 账户。 | 已经使用 `gh` 的个人开发者 |48| **`/web-setup`** | 在终端中运行 `/web-setup` 以将本地 `gh` CLI 令牌发送到你的 Claude 账户 | 你的 `gh` 令牌可以访问的任何存储库,无论是否安装了 App | 已经使用 `gh` 的个人开发者 |

49 49 

50<Note>50在存储库上安装 Claude GitHub App 也会为其中的拉取请求启用[自动修复](#auto-fix-pull-requests)。

51 使用任一方法,云会话都可以访问连接的 GitHub 账户可以看到的任何存储库,而不仅仅是安装了 Claude GitHub App 的存储库。App 安装启用 PR webhooks 用于[自动修复](#auto-fix-pull-requests);它不是会话级别的访问控制。要限制你的团队可以从云会话访问哪些存储库,请在 GitHub 本身上限制访问,例如通过限制连接的 GitHub 账户的团队或存储库成员资格。

52</Note>

53 51 

54任一方法都可以。有关 `/schedule` 如何在创建 routine 之前检查访问权限,请参阅[存储库和分支权限](/docs/zh-CN/routines#repositories-and-branch-permissions)。有关 `/web-setup` 演练,请参阅[从终端连接](/docs/zh-CN/web-quickstart#connect-from-your-terminal)。52有关 `/schedule` 如何在创建 routine 之前检查存储库访问权限,请参阅[存储库和分支权限](/docs/zh-CN/routines#repositories-and-branch-permissions)。有关 `/web-setup` 演练(包括 `/web-setup` 存储的内容以及如何删除它),请参阅[从终端连接](/docs/zh-CN/web-quickstart#connect-from-your-terminal)。

55 53 

56快速网络设置是一个组织设置,允许成员使用 `/web-setup` 连接 GitHub,在浏览器入门期间跳过 Claude GitHub App 安装提示,并让浏览器入门为他们创建[**默认**环境](/docs/zh-CN/cloud-environments#the-default-environment),而不是显示环境表单。在 Team 和 Enterprise 计划上,默认情况下它是关闭的,这会隐藏 `/web-setup`。[所有者](/docs/zh-CN/server-managed-settings#access-control)可以在 [**Admin settings > Claude Code**](https://claude.ai/admin-settings/claude-code) 处使用**快速网络设置**切换来打开它。54快速网络设置是一个组织设置,允许成员使用 `/web-setup` 连接 GitHub,在浏览器入门期间跳过 Claude GitHub App 安装提示,并让浏览器入门为他们创建[**默认**环境](/docs/zh-CN/cloud-environments#the-default-environment),而不是显示环境表单。在 Team 和 Enterprise 计划上,默认情况下它是关闭的,这会隐藏 `/web-setup`。[所有者](/docs/zh-CN/server-managed-settings#access-control)可以在 [**Admin settings > Claude Code**](https://claude.ai/admin-settings/claude-code) 处使用**快速网络设置**切换来打开它。

57 55 


79claude --cloud "Fix the authentication bug in src/auth/login.ts"77claude --cloud "Fix the authentication bug in src/auth/login.ts"

80```78```

81 79 

82这在 claude.ai 上创建一个新的云会话。云 VM 在你的当前分支处克隆你当前目录的 GitHub 远程,而不是你的本地检出,所以如果你有本地提交,请先推送。`--cloud` 一次只能处理单个存储库。任务在云中运行,而你继续在本地工作。较旧的 `--remote` 拼写仍然作为 `--cloud` 的已弃用别名工作。80这在 claude.ai 上创建一个新的云会话。云 VM 在你的当前分支处克隆你当前目录的 GitHub 远程,而不是你的本地检出,所以如果你有本地提交,请先推送。有关 Claude Code 上传本地存储库而不是克隆的情况,请参阅[发送没有 GitHub 的本地存储库](#send-local-repositories-without-github)。

81 

82`--cloud` 一次只能处理单个存储库。任务在云中运行,而你继续在本地工作。较旧的 `--remote` 拼写仍然作为 `--cloud` 的已弃用别名工作。

83 83 

84当云容器启动时,CLI 显示设置步骤的实时清单,例如克隆存储库和运行你的[设置脚本](/docs/zh-CN/cloud-environments#setup-scripts)。它排队你在配置期间输入的消息,并在会话准备好后发送它们。84当云容器启动时,CLI 显示设置步骤的实时清单,例如克隆存储库和运行你的[设置脚本](/docs/zh-CN/cloud-environments#setup-scripts)。它排队你在配置期间输入的消息,并在会话准备好后发送它们。

85 85 


121 发送没有 GitHub 的本地存储库121 发送没有 GitHub 的本地存储库

122</h4>122</h4>

123 123 

124当你从未连接到 GitHub 的存储库运行 `claude --cloud` 时,Claude Code 会捆绑你的本地存储库并直接上传到云会话。捆绑包包括你的完整存储库历史,跨所有分支,加上对跟踪文件的任何未提交更改。124当你从未连接到 GitHub 的存储库运行 `claude --cloud` 时,或从 Claude GitHub App 未安装的 github.com 存储库运行时,Claude Code 会捆绑你的本地存储库并直接上传到云会话。即使你使用 `/web-setup` 连接了 GitHub,这也适用。捆绑包包括你的完整存储库历史,跨所有分支,加上对跟踪文件的任何未提交更改。

125 125 

126在 macOS、Linux 和 WSL 上,Claude Code 会将名称类似于凭证或密钥的文件的未提交更改排除在上传之外,并列出它排除的文件的名称。这涵盖 `.env` 文件、Terraform `*.tfvars` 文件和密钥文件,如 `id_rsa` 和 `*.pem`。会话以每个的已提交版本开始,或如果没有提交则没有文件。在链接的 worktree、submodule 或类似布局中,Claude Code 将这些更改与其余部分一起上传,并列出它上传的文件的名称。126在 macOS、Linux 和 WSL 上,Claude Code 会将名称类似于凭证或密钥的文件的未提交更改排除在上传之外,并列出它排除的文件的名称。这涵盖 `.env` 文件、Terraform `*.tfvars` 文件和密钥文件,如 `id_rsa` 和 `*.pem`。会话以每个的已提交版本开始,或如果没有提交则没有文件。在链接的 worktree、submodule 或类似布局中,Claude Code 将这些更改与其余部分一起上传,并列出它上传的文件的名称。

127 127 

128当 GitHub 访问不可用时,此回退会自动激活。要即使在 GitHub 已连接时也强制它,请设置 `CCR_FORCE_BUNDLE=1`:128要即使在 Claude Code 会克隆远程时也强制上传捆绑,请设置 `CCR_FORCE_BUNDLE=1`:

129 129 

130```bash theme={null}130```bash theme={null}

131CCR_FORCE_BUNDLE=1 claude --cloud "Run the test suite and fix any failures"131CCR_FORCE_BUNDLE=1 claude --cloud "Run the test suite and fix any failures"


136* 目录必须是具有至少一个提交的 git 存储库136* 目录必须是具有至少一个提交的 git 存储库

137* 捆绑的存储库必须在 100 MB 以下。较大的存储库回退到仅捆绑当前分支,然后回退到工作树的单个压缩快照,仅在快照仍然太大时失败137* 捆绑的存储库必须在 100 MB 以下。较大的存储库回退到仅捆绑当前分支,然后回退到工作树的单个压缩快照,仅在快照仍然太大时失败

138* 未跟踪的文件不包括;在你想要云会话看到的文件上运行 `git add`138* 未跟踪的文件不包括;在你想要云会话看到的文件上运行 `git add`

139* 从捆绑创建的会话无法推送回远程,除非你也配置了[GitHub 身份验证](#github-authentication-options)139* 从捆绑创建的会话只有在你的[GitHub 连接](#github-authentication-options)对该存储库具有推送访问权限时,才能推送回 GitHub 远程

140 140 

141<h3 id="send-follow-ups-from-the-cli">141<h3 id="send-follow-ups-from-the-cli">

142 从 CLI 发送后续消息142 从 CLI 发送后续消息


352每个云会话通过多个层与你的机器和其他会话分离:352每个云会话通过多个层与你的机器和其他会话分离:

353 353 

354* **隔离的虚拟机**:每个会话在隔离的、Anthropic 管理的 VM 中运行。你的组织路由到[自托管环境](/docs/zh-CN/self-hosted-environments)的会话改为在你自己的基础设施上运行,其中隔离是你的部署的责任354* **隔离的虚拟机**:每个会话在隔离的、Anthropic 管理的 VM 中运行。你的组织路由到[自托管环境](/docs/zh-CN/self-hosted-environments)的会话改为在你自己的基础设施上运行,其中隔离是你的部署的责任

355* **网络访问控制**:在 Anthropic 托管的环境中,网络访问默认受限,可以禁用。在自托管环境中,你在自己的网络边界处限制会话出口。当在禁用网络访问的情况下运行时,Claude Code 仍然可以与 Anthropic API 通信,这可能允许数据从 VM 中退出。355* <span id="default-allowed-domains" />**网络访问控制**:在 Anthropic 托管的环境中,网络访问默认受限,可以禁用。请参阅[网络访问](/docs/zh-CN/cloud-environments#network-access)了解访问级别、[默认允许的域](/docs/zh-CN/cloud-environments#default-allowed-domains)和不通过允许列表的流量。在自托管环境中,你在自己的网络边界处限制会话出口。当在禁用网络访问的情况下运行时,Claude Code 仍然可以与 Anthropic API 通信,这可能允许数据从 VM 中退出。

356* **凭证保护**:在 Anthropic 托管的环境中,git 凭证和签名密钥保持在沙箱外,代理使用作用域凭证代表会话进行身份验证。在自托管环境中,你的部署提供 git 凭证;请参阅[配置 git](/docs/zh-CN/self-hosted-environments-deploy#configure-git)356* **凭证保护**:在 Anthropic 托管的环境中,git 凭证和签名密钥保持在沙箱外,代理使用作用域凭证代表会话进行身份验证。在自托管环境中,你的部署提供 git 凭证;请参阅[配置 git](/docs/zh-CN/self-hosted-environments-deploy#configure-git)

357* **API 凭证**:在 Pro 和 Max 计划的 Anthropic 托管环境中,你[添加到云环境](/docs/zh-CN/cloud-environments#add-api-credentials)的密钥保持在沙箱外,以相同的方式,在它们离开会话后附加到匹配的请求。自托管环境没有 API 凭证,Team 和 Enterprise 计划还没有357* **API 凭证**:在 Pro 和 Max 计划的 Anthropic 托管环境中,你[添加到云环境](/docs/zh-CN/cloud-environments#add-api-credentials)的密钥保持在沙箱外,以相同的方式,在它们离开会话后附加到匹配的请求。自托管环境没有 API 凭证,Team 和 Enterprise 计划还没有

358* **安全分析**:代码在会话的隔离环境内分析和修改,然后创建 PR358* **安全分析**:代码在会话的隔离环境内分析和修改,然后创建 PR


371 371 

372* 检查 [status.claude.com](https://status.claude.com) 以了解云会话事件372* 检查 [status.claude.com](https://status.claude.com) 以了解云会话事件

373* 一分钟后重试,因为容量是按需配置的373* 一分钟后重试,因为容量是按需配置的

374* 确认你的存储库可访问。连接的 GitHub 账户必须通过 Claude GitHub App 授权或通过 `/web-setup` 同步的 `gh` 令牌在 GitHub 上拥有对存储库的访问权限。不需要在存储库上安装该应用。请参阅 [GitHub 身份验证选项](#github-authentication-options)。374* 通过遵循[连接 GitHub 后没有存储库出现](/docs/zh-CN/web-quickstart#no-repositories-appear-after-connecting-github)来确认你的 GitHub 连接可以访问存储库

375 375 

376<h3 id="unable-to-get-organization-uuid">376<h3 id="unable-to-get-organization-uuid">

377 无法获取组织 UUID377 无法获取组织 UUID


407 407 

408* **速率限制**:Claude Code on the web 与你账户内所有其他 Claude 和 Claude Code 使用共享速率限制。并行运行多个任务会按比例消耗更多速率限制。云 VM 没有单独的计算费用。408* **速率限制**:Claude Code on the web 与你账户内所有其他 Claude 和 Claude Code 使用共享速率限制。并行运行多个任务会按比例消耗更多速率限制。云 VM 没有单独的计算费用。

409* **存储库身份验证**:你只能在认证到相同账户时将会话从网络移动到本地409* **存储库身份验证**:你只能在认证到相同账户时将会话从网络移动到本地

410* **平台限制**:存储库克隆和拉取请求创建需要 GitHub。自托管[GitHub Enterprise Server](/docs/zh-CN/github-enterprise-server) 实例支持 Team 和 Enterprise 计划。GitLab、Bitbucket 和其他非 GitHub 存储库可以作为[本地捆绑](#send-local-repositories-without-github)发送到云会话,但会话无法将结果推送回远程410* **平台限制**:存储库克隆和拉取请求创建需要 GitHub。自托管[GitHub Enterprise Server](/docs/zh-CN/github-enterprise-server) 实例支持 Team 和 Enterprise 计划。你可以通过设置 `CCR_FORCE_BUNDLE=1` 将 GitLab、Bitbucket 或其他非 GitHub 存储库作为[本地捆绑](#send-local-repositories-without-github)发送到云会话,但会话无法将结果推送回该远程

411* **组织 IP 允许列表**:云会话从 Anthropic 管理的基础设施而不是你的网络调用 Anthropic API,而[自托管环境](/docs/zh-CN/self-hosted-environments)中的会话从你自己的网络调用它。如果你的组织启用了 [IP 允许列表](https://support.claude.com/en/articles/13200993-restrict-access-to-claude-with-ip-allowlisting),每个 Anthropic 托管的云会话都会失败,显示身份验证错误。这同样适用于[代码审查](/docs/zh-CN/code-review)和[routines](/docs/zh-CN/routines)在 Anthropic 托管的环境中运行;路由到自托管环境的 routine 从你自己的网络调用 API。联系 [Anthropic 支持](https://support.claude.com/)以从你的组织的 IP 允许列表中豁免 Anthropic 托管的服务。411* **组织 IP 允许列表**:云会话从 Anthropic 管理的基础设施而不是你的网络调用 Anthropic API,而[自托管环境](/docs/zh-CN/self-hosted-environments)中的会话从你自己的网络调用它。如果你的组织启用了 [IP 允许列表](https://support.claude.com/en/articles/13200993-restrict-access-to-claude-with-ip-allowlisting),每个 Anthropic 托管的云会话都会失败,显示身份验证错误。这同样适用于[代码审查](/docs/zh-CN/code-review)和[routines](/docs/zh-CN/routines)在 Anthropic 托管的环境中运行;路由到自托管环境的 routine 从你自己的网络调用 API。联系 [Anthropic 支持](https://support.claude.com/)以从你的组织的 IP 允许列表中豁免 Anthropic 托管的服务。

412 412 

413<h2 id="related-resources">413<h2 id="related-resources">

claude-security.md +171 −0 created

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 Security 插件以在 Claude Code 会话中扫描代码库中的漏洞,并将发现的问题转化为您可以审查和应用的补丁。

8 

9Claude Security 插件在 Claude Code 会话中运行代码库的多代理漏洞扫描。一个 Claude 代理团队映射您的架构、构建威胁模型、搜寻漏洞,并在编写报告前独立审查每个发现。使用该插件扫描整个存储库或[仅扫描一组更改](#scan-only-your-changes),例如分支的差异、拉取请求的差异或单个提交,然后将您选择的发现转化为您自己审查和应用的补丁。

10 

11该插件在您的会话中本地运行,使用您在 Claude Code 中有权访问的任何模型,每次扫描都会计入您的计划使用限额。如果您想要一个监控您的存储库的托管服务,或想要在 [Claude Mythos 5](https://platform.claude.com/docs/en/about-claude/models/introducing-claude-fable-5-and-claude-mythos-5) 上运行扫描,请参阅 [Claude Security](https://claude.com/product/claude-security) 产品,该产品在企业计划中可用。该插件可以访问托管产品无法访问的代码,例如托管在 GitLab 或 Bitbucket 上的存储库,或在不允许入站连接的网络上的存储库。

12 

13该插件也不同于 Claude Code 中已有的审查工具:[security guidance 插件](/docs/zh-CN/security-guidance)在 Claude 编写代码时审查代码,[`/security-review`](/docs/zh-CN/commands#all-commands) 对您的分支运行单次扫描,[Code Review](/docs/zh-CN/code-review) 审查拉取请求。有关这些层如何堆叠的信息,请参阅[该插件如何与其他安全工具配合](#how-the-plugin-fits-with-other-security-tools)。

14 

15<h2 id="prerequisites">

16 前置条件

17</h2>

18 

19要运行该插件,您需要:

20 

21* 付费计划,用于扫描用来编排其代理的[动态工作流](/docs/zh-CN/workflows)。在 Pro 上,从 `/config` 中的"动态工作流"行启用它们。

22* Python 3.9 或更高版本在您的 `PATH` 上可用,名称为 `python3`。使用 `python3 --version` 检查。该插件的工具仅使用 Python 标准库,因此不会安装任何内容。

23* Linux、macOS 或 Windows。

24* Git,用于更改扫描和将发现转化为补丁;这些任务不支持其他版本控制系统。完整扫描在任何目录中都有效,无论是否有版本控制。

25 

26<h2 id="install-the-plugin">

27 安装插件

28</h2>

29 

30在 Claude Code 会话中,从[官方 Anthropic 市场](/docs/zh-CN/discover-plugins#official-anthropic-marketplace)安装:

31 

32```text theme={null}

33/plugin install claude-security@claude-plugins-official

34```

35 

36该命令打开插件的详细信息,您可以在其中选择[安装范围](/docs/zh-CN/discover-plugins#install-plugins)来开始安装。

37 

38如果安装失败,修复方法取决于 Claude Code 报告的消息:

39 

40* 如果它报告 `Marketplace "claude-plugins-official" not found`,使用 `/plugin marketplace add anthropics/claude-plugins-official` 添加市场,然后重试安装。

41* 如果它报告[在市场中找不到该插件](/docs/zh-CN/discover-plugins#install-plugins),检查插件名称是否有拼写错误。

42 

43检查安装摘要。如果它报告 `Run /reload-plugins to activate.`,请参阅[应用插件更改而无需重启](/docs/zh-CN/discover-plugins#apply-plugin-changes-without-restarting)以在当前会话中激活插件。

44 

45一旦插件处于活跃状态,您已准备好[扫描和修复您的代码库](#scan-and-fix-your-codebase)。

46 

47<h3 id="uninstall-the-plugin">

48 卸载插件

49</h3>

50 

51要删除该插件,从 `/plugin` 菜单卸载它,或在您的终端中运行 `claude plugin uninstall claude-security`。

52 

53<h2 id="scan-and-fix-your-codebase">

54 扫描和修复您的代码库

55</h2>

56 

57该插件添加了一个命令 `/claude-security`,它打开其三个任务的菜单:扫描代码库、扫描一组更改和建议补丁。标准流程运行完整扫描,然后将其发现转化为补丁:

58 

59<Steps>

60 <Step title="打开 Claude Security 菜单">

61 运行 `/claude-security` 并选择 **Scan codebase**。

62 </Step>

63 

64 <Step title="选择要扫描的内容">

65 该插件首先读取您的存储库,然后提供整个存储库或聚焦区域,每个选项都说明了文件计数和相对成本。选择整个存储库,或回答"我不知道",插件会为您的存储库大小选择一个合理的默认值。

66 </Step>

67 

68 <Step title="确认运行">

69 扫描可能需要一段时间,可能使用大量令牌,并需要在完成期间保持 Claude Code 打开。在您确认之前,不会运行任何内容。

70 </Step>

71 

72 <Step title="阅读报告">

73 扫描运行时,它会在每个阶段开始时报告,详细信息可在 [`/workflows`](/docs/zh-CN/workflows) 下获得。结果进入您的存储库中的时间戳目录,在[阅读扫描结果](#read-the-scan-results)中描述。

74 </Step>

75 

76 <Step title="将发现转化为补丁">

77 再次运行 `/claude-security` 并选择 **Suggest patches**,然后选择要解决的发现。审查过的补丁进入报告的 `patches/` 文件夹;[修复发现](#fix-findings)涵盖了每个补丁如何构建和审查。

78 </Step>

79 

80 <Step title="应用您接受的补丁">

81 从您的 shell 中使用 `git apply` 应用每个补丁,在其自己的拉取请求中。补丁永远不会自动应用。

82 </Step>

83</Steps>

84 

85您不必从菜单开始:直接要求一个任务,作为命令的参数,例如 `/claude-security scan my branch`,或用纯语言,例如"scan commit abc1234"。该插件在[自动模式](/docs/zh-CN/permission-modes)中效果最佳,这允许扫描的代理在每一步都无需权限提示地进行。

86 

87<h3 id="scan-only-your-changes">

88 仅扫描您的更改

89</h3>

90 

91当您的分支有其基础没有的提交时,`/claude-security` 菜单会提供仅扫描该差异的选项,以便您可以在合并前检查分支。您也可以扫描您的一个开放拉取请求,或通过要求它来扫描单个提交,例如"scan commit abc1234"。仅扫描已提交的更改:首先提交或 stash 进行中的编辑,或运行完整扫描,它读取工作树。

92 

93更改扫描需要 git 存储库;未版本化目录的完整扫描仍然有效。查找您的开放拉取请求是唯一到达网络的步骤,仅当您的会话已有权限运行 GitHub CLI 且 `gh` 已登录时才提供。

94 

95<h3 id="scope-large-repositories">

96 限制大型存储库的范围

97</h3>

98 

99在大型存储库上,一次扫描一个区域而不是整个树。选择插件提供的聚焦范围之一,例如您的 API 层或您的身份验证代码,运行会根据您选择的内容调整大小。报告的覆盖部分说明了什么被检查了,什么没有。随时在不同区域运行另一次扫描。

100 

101<h3 id="read-the-scan-results">

102 阅读扫描结果

103</h3>

104 

105每次扫描都会将其结果写入您的存储库中的时间戳 `CLAUDE-SECURITY-<timestamp>/` 目录:

106 

107* **`CLAUDE-SECURITY-RESULTS.md`**:报告,包含每个发现的 ID,例如 `F1`,加上其影响、利用场景、严重性、置信度和建议

108* **`CLAUDE-SECURITY-RESULTS.jsonl`**:相同的发现以机器可读的形式,每行一个 JSON 对象

109* **`CLAUDE-SECURITY-RESULTS.sarif`**:相同的发现作为 [SARIF 2.1.0](https://docs.oasis-open.org/sarif/sarif/v2.1.0/sarif-v2.1.0.html) 日志,用于 GitHub 代码扫描和任何其他读取该标准的工具。扫描将发现分类在其 [CWE](https://cwe.mitre.org/) 弱点类别下

110* **`CLAUDE-SECURITY-REVISION-<commit>.json`**:修订戳,记录扫描了哪个提交、以什么工作量、未提交的更改是否是扫描树的一部分,以及运行的验证程度如何,因此报告始终与它描述的代码相关联。版本控制外的扫描在提交位置戳上 `UNVERSIONED`

111 

112该目录是扫描对您的检出所做的唯一更改,它有自己的 `.gitignore`,因此随意的 `git add` 永远不会将报告扫入提交。要在历史中保留报告以供审计跟踪,删除那一个 `.gitignore` 文件并像任何其他文件一样提交目录。

113 

114发现仅在独立验证代理分析它们后才出现在报告中,这使报告简短且值得阅读。扫描是非确定性的:同一代码的两次扫描可能会发现不同的发现。定期运行扫描,并使用修订戳将每个报告归属于它覆盖的确切代码和设置。

115 

116<h2 id="fix-findings">

117 修复发现

118</h2>

119 

120通过从 `/claude-security` 菜单选择 **Suggest patches** 开始修复流程,或用纯语言要求,例如"fix finding F3",然后选择要解决的报告中的哪些发现。补丁是针对已提交的代码构建的,报告必须仍然描述您拥有的代码:其代码已更改的发现会被跳过并附注,插件会提供新扫描而不是从陈旧报告修补。每个补丁都在您的存储库的临时副本中起草,因此您的源文件保持不变,直到您自己应用补丁。

121 

122在交付前,每个补丁都由独立于编写它的代理的代理审查,当代码有测试时它会针对更改运行您的项目测试,并自行读取差异以查看它可能引入的任何新内容。仅当该审查可以保证更改解决了一个发现、不引入新漏洞并保持其他行为不变时,才会编写补丁。当它无法保证所有三个时,您会得到一个简短的注释解释原因,而不是补丁。

123 

124<h3 id="patches-are-never-applied-automatically">

125 补丁永远不会自动应用

126</h3>

127 

128应用补丁始终是您的决定。补丁进入报告的 `patches/` 文件夹,每个发现一个 `F<n>.patch`,旁边有一个注释解释更改。从您的 shell 应用一个,或要求 Claude 应用它并打开拉取请求:

129 

130```bash theme={null}

131git apply CLAUDE-SECURITY-<timestamp>/patches/F1.patch

132```

133 

134当修补的代码没有测试时,补丁的注释会说明这一点,因此您知道其审查在没有测试通过的情况下运行。在其自己的拉取请求中应用每个补丁,以便可以独立审查和测试。

135 

136<h2 id="how-the-plugin-fits-with-other-security-tools">

137 该插件如何与其他安全工具配合

138</h2>

139 

140Claude Security 插件是深度扫描层,在纵深防御堆栈中,与[security guidance 插件](/docs/zh-CN/security-guidance)、[`/security-review`](/docs/zh-CN/commands#all-commands)、[Code Review](/docs/zh-CN/code-review)、托管的 [Claude Security](https://claude.com/product/claude-security) 产品和您现有的扫描器一起:

141 

142| 阶段 | 工具 | 覆盖内容 |

143| :------ | :-------------------------------------------------------------------------- | :-------------------------- |

144| 在会话中 | [Security guidance 插件](/docs/zh-CN/security-guidance) | Claude 编写的代码中的常见漏洞,在同一会话中修复 |

145| 按需,单次扫描 | [`/security-review`](/docs/zh-CN/commands#all-commands) | 当前分支上的一次性安全扫描 |

146| 按需,深度扫描 | Claude Security 插件 | 存储库或差异的多代理扫描,具有独立审查的发现和补丁 |

147| 在拉取请求上 | [Code Review](/docs/zh-CN/code-review),Team 和 Enterprise 计划 | 具有完整代码库上下文的多代理正确性和安全审查 |

148| 托管 | [Claude Security](https://claude.com/product/claude-security),Enterprise 计划 | 监控连接存储库的托管扫描 |

149| 在 CI 中 | 您现有的静态分析和依赖扫描器 | 特定于语言的规则、供应链检查和策略执行 |

150 

151该插件不会替换您现有的源代码安全工具。与静态分析、依赖扫描和代码审查一起运行它:它以人类安全研究人员的方式推理您的代码,这补充了这些工具提供的确定性检查。

152 

153<h2 id="troubleshooting">

154 故障排除

155</h2>

156 

157**`/claude-security` 菜单打开时出现 Python 警告。** 该插件需要 `python3` 3.9 或更高版本在您的 `PATH` 上。当它根本找不到 `python3` 时,菜单警告 Claude Security 在安装一个之前不会工作;当您的 `PATH` 上的第一个 `python3` 较旧时,警告会命名它找到的版本。安装 Python 3,或在您的 `PATH` 上放置一个较新的 `python3`,然后启动一个新会话。

158 

159**使用 Fable 模型扫描时,您可能会看到"safeguards flagged this message"通知。** 该消息命名模型,例如"Fable 5.1's safeguards flagged this message"。Fable 的网络安全安全分类器标记某些请求,Claude Code 通过[自动模型回退](/docs/zh-CN/model-config#automatic-model-fallback)在 Opus 模型上重新运行标记的请求。这是预期的,扫描应该仍然成功完成。

160 

161<h2 id="related-resources">

162 相关资源

163</h2>

164 

165要深入了解此页面涉及的部分:

166 

167* [Security guidance 插件](/docs/zh-CN/security-guidance):在同一会话中,在 Claude 编写代码时捕获问题

168* [Code Review](/docs/zh-CN/code-review):设置 PR 时间多代理审查

169* [Claude Security](https://claude.com/product/claude-security):监控连接存储库的托管服务

170* [Claude Code 安全](/docs/zh-CN/security):Claude Code 如何处理信任、权限和保护措施

171* [发现和安装插件](/docs/zh-CN/discover-plugins#official-anthropic-marketplace):浏览其他官方插件

claude-tag.md +11 −0 created

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# Claude Tag

6 

7> 通过 Claude Tag 将 Claude 引入您团队的 Slack 频道,并在 claude.com 上查找其设置和使用文档。

8 

9[Claude Tag](https://claude.com/product/tag) 是一个 Slack 集成,在您团队的频道中以您组织的共享身份运行 `@Claude`,具有管理员配置的访问权限。频道中的任何人都可以在线程中标记 `@Claude` 并为其分配任务。请阅读 claude.com 上的 [Claude Tag 文档](https://claude.com/docs/claude-tag/overview)来设置并开始使用它。

10 

11Claude Tag 在 Team 和 Enterprise 计划中可用,与早期的 [Claude Code in Slack](/docs/zh-CN/slack) 不同,后者在每个会话中以个人用户的账户运行。在 Pro 和 Max 计划中,Claude Tag 不可用,Claude Code in Slack 仍然是设置路径。

Details

13您可以使用这些命令启动会话、管道内容、恢复对话和管理更新:13您可以使用这些命令启动会话、管道内容、恢复对话和管理更新:

14 14 

15| 命令 | 描述 | 示例 |15| 命令 | 描述 | 示例 |

16| :------------------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------- |16| :------------------------------ | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------- |

17| `claude` | 启动交互式会话 | `claude` |17| `claude` | 启动交互式会话 | `claude` |

18| `claude "query"` | 使用初始提示启动交互式会话 | `claude "explain this project"` |18| `claude "query"` | 使用初始提示启动交互式会话 | `claude "explain this project"` |

19| `claude -p "query"` | 通过 SDK 查询,然后退出 | `claude -p "explain this function"` |19| `claude -p "query"` | 通过 SDK 查询,然后退出 | `claude -p "explain this function"` |


43| `claude project purge [path]` | 删除项目的所有本地 Claude Code 状态:记录、任务列表、调试日志、文件编辑历史、提示历史行和项目在 `~/.claude.json` 中的条目。省略 `[path]` 以从交互式列表中选择。标志:`--dry-run` 预览,`-y`/`--yes` 跳过确认,`-i`/`--interactive` 确认每一项,`--all` 用于每个项目。请参阅 [清除本地数据](/docs/zh-CN/claude-directory#clear-local-data) | `claude project purge ~/work/repo --dry-run` |43| `claude project purge [path]` | 删除项目的所有本地 Claude Code 状态:记录、任务列表、调试日志、文件编辑历史、提示历史行和项目在 `~/.claude.json` 中的条目。省略 `[path]` 以从交互式列表中选择。标志:`--dry-run` 预览,`-y`/`--yes` 跳过确认,`-i`/`--interactive` 确认每一项,`--all` 用于每个项目。请参阅 [清除本地数据](/docs/zh-CN/claude-directory#clear-local-data) | `claude project purge ~/work/repo --dry-run` |

44| `claude remote-control` | 启动 [Remote Control](/docs/zh-CN/remote-control) 服务器以从 Claude.ai 或 Claude 应用控制 Claude Code。在服务器模式下运行(无本地交互式会话)。请参阅 [服务器模式标志](/docs/zh-CN/remote-control#start-a-remote-control-session)。停止服务器后,您可以恢复它正在服务的会话。请参阅 [停止服务器后恢复会话](/docs/zh-CN/remote-control#resume-sessions-after-stopping-the-server) | `claude remote-control --name "My Project"` |44| `claude remote-control` | 启动 [Remote Control](/docs/zh-CN/remote-control) 服务器以从 Claude.ai 或 Claude 应用控制 Claude Code。在服务器模式下运行(无本地交互式会话)。请参阅 [服务器模式标志](/docs/zh-CN/remote-control#start-a-remote-control-session)。停止服务器后,您可以恢复它正在服务的会话。请参阅 [停止服务器后恢复会话](/docs/zh-CN/remote-control#resume-sessions-after-stopping-the-server) | `claude remote-control --name "My Project"` |

45| `claude respawn <id>` | 重启 [后台会话](/docs/zh-CN/agent-view#manage-sessions-from-the-shell),运行或已停止,保持其对话完整。使用 `--all` 重启每个运行中的会话,例如以获取更新的 Claude Code 二进制文件 | `claude respawn 7c5dcf5d` |45| `claude respawn <id>` | 重启 [后台会话](/docs/zh-CN/agent-view#manage-sessions-from-the-shell),运行或已停止,保持其对话完整。使用 `--all` 重启每个运行中的会话,例如以获取更新的 Claude Code 二进制文件 | `claude respawn 7c5dcf5d` |

46| `claude rm <id>` | 从列表中删除 [后台会话](/docs/zh-CN/agent-view#manage-sessions-from-the-shell)。接受 `--discard-unpushed <commit>@<worktree-id>` 以丢弃 worktree 及其提交;当 [delete is refused over unpushed commits](/docs/zh-CN/agent-view#what-deleting-a-session-removes) 时,拒绝会打印要传递的确切值。`--discard-unpushed` 需要 Claude Code v2.1.260 或更高版本。对话记录保留在您的本地计算机上,可通过 `claude --resume` 访问 | `claude rm 7c5dcf5d` |46| `claude rm <id>` | 从列表中删除 [后台会话](/docs/zh-CN/agent-view#manage-sessions-from-the-shell)。当删除被 [拒绝超过会话的 worktree](/docs/zh-CN/agent-view#what-deleting-a-session-removes) 且第二个 `claude rm` 可以解决它时,拒绝会打印要传递的确切标志和值:`--discard-unpushed <commit>@<worktree-id>` 丢弃具有未推送提交的 worktree 及其提交,`--force-remove-worktree <worktree-id>` 删除 git 或 `WorktreeRemove` 钩子无法删除的 worktree 目录。`--discard-unpushed` 需要 Claude Code v2.1.260 或更高版本,而 `--force-remove-worktree` 需要 v2.1.268 或更高版本。对话记录保留在您的本地计算机上,可通过 `claude --resume` 访问 | `claude rm 7c5dcf5d` |

47| `claude self-hosted-runner` | 启动运行程序进程,将此计算机或容器注册到 [self-hosted environment](/docs/zh-CN/self-hosted-environments),并在您的基础设施上托管 Claude Code 云会话。运行 `claude self-hosted-runner setup` 以获得引导式操作员演练,运行 `claude self-hosted-runner doctor` 以 [诊断已部署的运行程序](/docs/zh-CN/self-hosted-environments-deploy#troubleshooting),运行 `claude self-hosted-runner orchestrator` 以生成 [on-demand runners](/docs/zh-CN/self-hosted-environments-configuration#on-demand-runners)。需要 Claude Code v2.1.224 或更高版本 | `claude self-hosted-runner setup` |47| `claude self-hosted-runner` | 启动运行程序进程,将此计算机或容器注册到 [self-hosted environment](/docs/zh-CN/self-hosted-environments),并在您的基础设施上托管 Claude Code 云会话。运行 `claude self-hosted-runner setup` 以获得引导式操作员演练,运行 `claude self-hosted-runner doctor` 以 [诊断已部署的运行程序](/docs/zh-CN/self-hosted-environments-deploy#troubleshooting),运行 `claude self-hosted-runner orchestrator` 以生成 [on-demand runners](/docs/zh-CN/self-hosted-environments-configuration#on-demand-runners)。需要 Claude Code v2.1.224 或更高版本 | `claude self-hosted-runner setup` |

48| `claude setup-token` | 为 CI 和脚本生成长期 OAuth 令牌。将令牌打印到终端而不保存。需要 Claude 订阅。请参阅 [生成长期令牌](/docs/zh-CN/authentication#generate-a-long-lived-token) | `claude setup-token` |48| `claude setup-token` | 为 CI 和脚本生成长期 OAuth 令牌。将令牌打印到终端而不保存。需要 Claude 订阅。请参阅 [生成长期令牌](/docs/zh-CN/authentication#generate-a-long-lived-token) | `claude setup-token` |

49| `claude stop <id>` | 停止 [后台会话](/docs/zh-CN/agent-view#manage-sessions-from-the-shell)。也接受 `claude kill` | `claude stop 7c5dcf5d` |49| `claude stop <id>` | 停止 [后台会话](/docs/zh-CN/agent-view#manage-sessions-from-the-shell)。也接受 `claude kill` | `claude stop 7c5dcf5d` |


136| `--teleport` | 在本地终端中恢复 [网络会话](/docs/zh-CN/claude-code-on-the-web) | `claude --teleport` |136| `--teleport` | 在本地终端中恢复 [网络会话](/docs/zh-CN/claude-code-on-the-web) | `claude --teleport` |

137| `--teammate-mode` | 设置 [agent team](/docs/zh-CN/agent-teams) 队友的显示方式:`in-process`(默认)、`auto`、`tmux` 或 `iterm2`(在 v2.1.186 中添加)。覆盖此会话的 [`teammateMode`](/docs/zh-CN/settings-reference#teammatemode) 设置。请参阅 [选择显示模式](/docs/zh-CN/agent-teams#choose-a-display-mode) | `claude --teammate-mode auto` |137| `--teammate-mode` | 设置 [agent team](/docs/zh-CN/agent-teams) 队友的显示方式:`in-process`(默认)、`auto`、`tmux` 或 `iterm2`(在 v2.1.186 中添加)。覆盖此会话的 [`teammateMode`](/docs/zh-CN/settings-reference#teammatemode) 设置。请参阅 [选择显示模式](/docs/zh-CN/agent-teams#choose-a-display-mode) | `claude --teammate-mode auto` |

138| `--tmux` | 为 worktree 创建 tmux 会话。需要 `--worktree`。在可用时使用 iTerm2 原生窗格;传递 `--tmux=classic` 以使用传统 tmux | `claude -w feature-auth --tmux` |138| `--tmux` | 为 worktree 创建 tmux 会话。需要 `--worktree`。在可用时使用 iTerm2 原生窗格;传递 `--tmux=classic` 以使用传统 tmux | `claude -w feature-auth --tmux` |

139| `--tools` | 限制 Claude 可以使用的内置工具。使用 `""` 禁用所有,`"default"` 表示全部,或工具名称如 `"Bash,Edit,Read"`。如果您在此处命名 [任务跟踪工具](/docs/zh-CN/tools-reference#task-tool-availability) 之一,Claude Code 也会选择加入。标志不影响 MCP 工具;要拒绝这些工具,请改用 `--disallowedTools "mcp__*"`。省略 [`EndConversation`](/docs/zh-CN/tools-reference#endconversation-tool-behavior) 的列表不会删除它;`""` 仅在没有 MCP 工具保持时删除它 | `claude --tools "Bash,Edit,Read"` |139| `--tools` | 限制 Claude 可以使用的内置工具。使用 `""` 禁用所有,`"default"` 表示全部,或工具名称如 `"Bash,Edit,Read"`。在 macOS、Linux 和 WSL 上,默认集合排除 `Glob` 和 `Grep`,如 [Glob 工具行为](/docs/zh-CN/tools-reference#glob-tool-behavior) 中所述。如果您在此处命名 [任务跟踪工具](/docs/zh-CN/tools-reference#task-tool-availability) 之一,Claude Code 也会选择加入。标志不影响 MCP 工具;要拒绝这些工具,请改用 `--disallowedTools "mcp__*"`。省略 [`EndConversation`](/docs/zh-CN/tools-reference#endconversation-tool-behavior) 的列表不会删除它;`""` 仅在没有 MCP 工具保持时删除它 | `claude --tools "Bash,Edit,Read"` |

140| `--verbose` | 启用详细日志记录,显示完整的逐轮输出。覆盖此会话的 [`viewMode`](/docs/zh-CN/settings-reference#viewmode) 设置 | `claude --verbose` |140| `--verbose` | 启用详细日志记录,显示完整的逐轮输出。覆盖此会话的 [`viewMode`](/docs/zh-CN/settings-reference#viewmode) 设置 | `claude --verbose` |

141| `--version`, `-v` | 输出版本号 | `claude -v` |141| `--version`, `-v` | 输出版本号 | `claude -v` |

142| `--worktree`, `-w` | 在隔离的 [git worktree](/docs/zh-CN/worktrees) 中启动 Claude,位于 `<repo>/.claude/worktrees/<name>`。如果未给出名称,则自动生成一个。传递 `#<number>`、GitHub 拉取请求 URL 或 GitLab 合并请求 URL 以 [从 `origin` 获取该 PR 或 MR 并从其分支 worktree](/docs/zh-CN/worktrees#branch-from-a-pull-request)。从 GitLab 合并请求分支需要 Claude Code v2.1.233 或更高版本 | `claude -w feature-auth` |142| `--worktree`, `-w` | 在隔离的 [git worktree](/docs/zh-CN/worktrees) 中启动 Claude,位于 `<repo>/.claude/worktrees/<name>`。如果未给出名称,则自动生成一个。传递 `#<number>`、GitHub 拉取请求 URL 或 GitLab 合并请求 URL 以 [从 `origin` 获取该 PR 或 MR 并从其分支 worktree](/docs/zh-CN/worktrees#branch-from-a-pull-request)。从 GitLab 合并请求分支需要 Claude Code v2.1.233 或更高版本 | `claude -w feature-auth` |


167 167 

168默认情况下,Claude Code 在对话的第一个请求上构建系统提示一次,应用任何系统提示标志中的文本,并在会话中记录它。在对话被压缩之前,每个后续请求都使用该记录的提示,包括在您使用 `--resume` 或 `--continue` 返回对话后。如果您在该后续启动时传递不同的系统提示标志文本或无,它在对话被压缩或您启动新对话时生效。168默认情况下,Claude Code 在对话的第一个请求上构建系统提示一次,应用任何系统提示标志中的文本,并在会话中记录它。在对话被压缩之前,每个后续请求都使用该记录的提示,包括在您使用 `--resume` 或 `--continue` 返回对话后。如果您在该后续启动时传递不同的系统提示标志文本或无,它在对话被压缩或您启动新对话时生效。

169 169 

170记录适用于 [获取功能标志](/docs/zh-CN/env-vars#features-that-need-feature-flag-fetching) 的会话,因为默认情况下使用 claude.ai 或 Console 帐户登录的会话。在 Amazon Bedrock、Google Cloud 的 Agent Platform、Microsoft Foundry 和其他不获取它们的会话中,Claude Code 在每个请求上重建提示,`--system-prompt-snapshot` 无效。如果您通过传递 `--bare` 或设置 `CLAUDE_CODE_SIMPLE=1` 在 [bare mode](/docs/zh-CN/headless#start-faster-with-bare-mode) 中启动 Claude Code,记录保持关闭,除非您传递 `--system-prompt-snapshot on`。170如果您通过传递 `--bare` 或设置 `CLAUDE_CODE_SIMPLE=1` 在 [bare mode](/docs/zh-CN/headless#start-faster-with-bare-mode) 中启动 Claude Code,记录保持关闭,除非您传递 `--system-prompt-snapshot on`。在 v2.1.268 之前,不 [获取功能标志](/docs/zh-CN/env-vars#features-that-need-feature-flag-fetching) 的会话,包括 Amazon Bedrock、Google Cloud 的 Agent Platform 和 Microsoft Foundry 上的会话,在每个请求上重建提示,`--system-prompt-snapshot` 无效。

171 171 

172要改为在每个请求上重建提示,例如在您跨 `--continue` 运行迭代其措辞时,传递 `--system-prompt-snapshot off`。在 v2.1.265 之前,传递任何系统提示标志也会关闭记录,除非您传递 `--system-prompt-snapshot on`。172要改为在每个请求上重建提示,例如在您跨 `--continue` 运行迭代其措辞时,传递 `--system-prompt-snapshot off`。在 v2.1.265 之前,传递任何系统提示标志也会关闭记录,除非您传递 `--system-prompt-snapshot on`。

173 173 

cloud-environments.md +806 −0 created

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

10 云环境需要 [Claude Code on the web](/docs/zh-CN/claude-code-on-the-web),该功能目前处于研究预览阶段,适用于 Pro、Max 和 Team 用户,以及具有 [premium seats 或 Chat + Claude Code seats](https://support.claude.com/en/articles/11845131-use-claude-code-with-your-team-or-enterprise-plan) 的 Enterprise 用户。

11</Note>

12 

13每个[云会话](/docs/zh-CN/claude-code-on-the-web)都在云环境中运行。您可以配置环境以允许或拒绝[网络访问](#access-levels)、为会话[设置环境变量](#set-environment-variables)、在 Pro 和 Max 计划上存储会话使用的[API 凭证](#add-api-credentials)而不会看到它们,以及在 Claude 开始工作前运行[设置脚本](#setup-scripts)。

14 

15相同的环境适用于您启动云会话的任何地方:[Claude Code on the web](/docs/zh-CN/claude-code-on-the-web)、终端搭配 [`claude --cloud`](/docs/zh-CN/claude-code-on-the-web#from-terminal-to-web)、[Claude Tag](https://claude.com/docs/claude-tag/overview)、[例程](/docs/zh-CN/routines)、[Claude 移动应用](/docs/zh-CN/mobile)和 [Desktop 应用](/docs/zh-CN/desktop)。这些界面中的每一个也可以路由到[自托管环境](/docs/zh-CN/self-hosted-environments)。[可用性和限制](/docs/zh-CN/self-hosted-environments#availability-and-limitations)涵盖了当 Claude Tag 会话在其中运行时 Claude 还不能使用的内容。

16 

17<Info>

18 [Remote Control](/docs/zh-CN/remote-control) 会话将网页和移动界面连接到您自己机器上的会话,该会话使用您机器的网络和文件,而不是云环境。Claude Tag 频道会话仅使用组织级别的环境,即[共享环境](#organization-shared-environments)或[自托管环境](/docs/zh-CN/self-hosted-environments)。

19</Info>

20 

21<h2 id="the-default-environment">

22 Default 环境

23</h2>

24 

25如果您还没有环境,引导设置会为您设置 **Default** 环境。具体方式取决于您在哪里进行引导:

26 

27* **CLI 流程(例如 `/web-setup`)**:为您创建 **Default**

28* **Pro 和 Max 上的网页引导**:为您创建 **Default**

29* **Team 和 Enterprise 上的网页引导**:显示 **Create your first cloud environment** 表单,除非所有者已启用[快速网页设置](/docs/zh-CN/claude-code-on-the-web#github-authentication-options);保持表单的默认值并点击 **Create & finish** 以获得相同的 **Default** 环境

30 

31**Default** 本身不带有任何配置:

32 

33* [**Trusted** 网络访问](#access-levels):会话可以访问包注册表和其他[允许列表中的域](#default-allowed-domains),但无法通过会话的网络访问其他任何内容。

34* 无其他配置:**Default** 不定义任何环境变量或设置脚本,因此会话只以[预安装的工具](#installed-tools)开始。

35 

36只有 **Default** 可用时,每个会话都在其中运行。当您有多个环境时,会话会按界面选择一个:

37 

38* 在网页、Desktop 应用和移动应用上,会话使用[选择器](#configure-your-environment)中显示的环境。当您尚未选择时,所有者设置的[组织默认值](#organization-shared-environments)会填入选择。

39* 从 CLI,Claude Code 使用您的 [`/remote-env` 选择](#select-an-environment-from-the-cli),或在您的列表中有一个 Anthropic 托管环境时回退到该环境,否则回退到您列表中第一个不是桥接环境的环境,即 [Remote Control](/docs/zh-CN/remote-control) 注册的条目,用于代表您自己的机器而不是云环境。对于[自托管环境](/docs/zh-CN/self-hosted-environments),在[分派会话](/docs/zh-CN/self-hosted-environments-testing#run-the-test-loop)时使用其 `ccpool_` ID 传递 `--environment <environment-id>` 会覆盖该调用的 `/remote-env` 选择和回退。Claude Code 拒绝传递给该标志的 Anthropic 托管 `env_` ID,因此请使用 `/remote-env` 来定位这些。该标志需要 Claude Code v2.1.224 或更高版本。

40 

41当默认环境不够用时,请配置环境:当 Claude 需要访问[默认允许列表](#default-allowed-domains)之外的域、需要为其会话设置环境变量,或需要在开始工作前安装依赖项时。

42 

43<h2 id="configure-your-environment">

44 配置你的环境

45</h2>

46 

47在环境选择器中创建、编辑和归档环境,你可以在[网页快速入门](/docs/zh-CN/web-quickstart)后从[claude.ai/code](https://claude.ai/code)访问它,或从[桌面应用](/docs/zh-CN/desktop#cloud-sessions)的提示框中访问。你创建的环境是你账户的个人环境;由所有者创建的[共享环境](#organization-shared-environments)会出现在同一个选择器中。查看[已安装的工具](#installed-tools)了解无需任何配置即可使用的工具。

48 

49<Steps>

50 <Step title="打开环境选择器">

51 在[claude.ai/code](https://claude.ai/code)上,选择显示当前环境名称的云图标,它位于消息框上方的行中。选择器没有设置页面或直接URL。

52 

53 <Frame>

54 <img src="https://mintcdn.com/claude-code/ZFId6l95856c5LSw/images/cloud-environment-selector.png?fit=max&auto=format&n=ZFId6l95856c5LSw&q=85&s=cc2813a5664519eaf5a89d793ce5af26" alt="环境选择器在claude.ai/code的消息框上方打开。显示环境名称Default的云按钮位于消息框上方的行中。打开的菜单列出了一个带有Download和Desktop only标签的Local行、一个Cloud部分,其中Default环境被选中并显示一个复选标记,悬停时显示一个设置齿轮图标、一个Add cloud environment选项,以及一个带有设置说明的Remote Control部分。" width="1672" height="682" data-path="images/cloud-environment-selector.png" />

55 </Frame>

56 </Step>

57 

58 <Step title="添加或编辑环境">

59 选择**Add cloud environment**,或悬停在现有环境上并选择右侧出现的设置图标。对话框包括名称、网络访问级别、环境变量和设置脚本。当你在Pro或Max计划上编辑现有的云环境时,对话框还包括[API凭证](#add-api-credentials)。

60 

61 <Frame>

62 <img src="https://mintcdn.com/claude-code/ZFId6l95856c5LSw/images/cloud-environment-dialog.png?fit=max&auto=format&n=ZFId6l95856c5LSw&q=85&s=30d4478b31d1f879f7ee287ddab32505" alt="New cloud environment对话框。一个Name字段,占位符为Default,一个Network access选择器设置为Trusted,带有网络策略和访问级别的链接,一个Environment variables框显示.env格式占位符文本,并注明值对使用该环境的任何人都可见,一个Setup script框描述为在新会话启动时运行的Bash脚本,在Claude Code启动之前,以及Cancel和Create environment按钮。" width="874" height="1372" data-path="images/cloud-environment-dialog.png" />

63 </Frame>

64 </Step>

65</Steps>

66 

67<h3 id="set-environment-variables">

68 设置环境变量

69</h3>

70 

71环境变量使用`.env`格式,每行一个`KEY=value`对。普通值不需要引号,如果你用匹配的一对引号引用一个值,引号不会成为该值的一部分。引用跨越多行或包含`#`的值:在未引用的值中,`#`开始注释,该行的其余部分被丢弃。

72 

73以下示例定义了三个变量。

74 

75```text theme={null}

76NODE_ENV=development

77LOG_LEVEL=debug

78DATABASE_URL=postgres://localhost:5432/myapp

79```

80 

81每个会话在启动时将环境的值复制一次到普通环境变量中,Claude运行的任何命令都可以读取这些变量。因为运行中的会话不会重新读取配置,编辑或添加变量会影响你之后启动的会话;已经运行的会话保持它们启动时的值。

82 

83Claude Code网页版在启动会话时也会自己设置一些变量。对于[`CLAUDE_AUTOCOMPACT_PCT_OVERRIDE`](/docs/zh-CN/claude-code-on-the-web#manage-context),Claude Code网页版设置的值会覆盖你在这里添加的值,所以在这里添加该键没有效果。

84 

85使用该环境的任何人都可以读取这些值。在Pro和Max计划上,对于代理可以附加到请求的键,请改用[API凭证](#add-api-credentials)。[从不获得凭证的请求](#requests-that-never-get-the-credential)在那里列出。

86 

87<h3 id="add-api-credentials">

88 添加API凭证

89</h3>

90 

91API凭证是你存储在云环境上的API密钥或令牌,这样Claude可以从环境中的任何会话调用该API,而无需看到密钥。Anthropic的代理在每个请求离开会话的VM后,将密钥添加到你列出的主机的请求中。密钥永远不会到达Claude、它运行的命令或会话的环境变量。

92 

93API凭证在Pro和Max计划上可用。它们在Team和Enterprise计划上还不可用,所以**API credentials**部分不会出现在这些计划的环境对话框中。

94 

95<h4 id="requirements">

96 要求

97</h4>

98 

99其中两个决定你是否可以添加凭证,两个决定代理在添加后是否可以使用它:

100 

101* **Role**:你的claude.ai组织中的组织管理员角色

102 * 在Team和Enterprise上,所有者持有它,管理员没有

103 * 在Pro和Max上,你在自己的组织中持有它

104 * 没有它,你会看到一个注释而不是凭证列表,即使在你自己的环境上也是如此。请求所有者将凭证添加到共享环境并在那里运行你的会话

105* **Environment type**:一个已经存在的Anthropic托管的云环境。[自托管环境](/docs/zh-CN/self-hosted-environments)没有API凭证

106* **API reachability**:API接受来自互联网的连接,因为请求来自Anthropic的网络

107* **Encryption keys**:如果你的组织使用客户管理的加密密钥,你无法保存凭证

108 

109<h4 id="add-a-credential">

110 添加凭证

111</h4>

112 

113你从已经存在的环境的编辑器一次添加一个凭证。新环境的对话框不提供它们。也没有编辑。要更改凭证的主机或值,请删除它并再次添加。

114 

115<Steps>

116 <Step title="打开环境的API凭证">

117 在[claude.ai/code](https://claude.ai/code)[打开环境进行编辑](#configure-your-environment)。在**Update cloud environment**对话框中,在**Environment variables**下方找到**API credentials**。你会看到已经在环境上的凭证,每个都带有它适用的主机。

118 </Step>

119 

120 <Step title="添加凭证">

121 选择**Add credential**并填写表单。对于在请求头中传输的API密钥,保持默认的**Credential type**、**Bearer**,并填写这些字段:

122 

123 * **Name**:凭证的标签,例如`Internal billing API`

124 * **Allowed websites**:API的主机,例如`api.example.com`。前导`*.`匹配每个子域

125 * **Custom headers**:一行用于携带密钥的头。该行以`Authorization`作为头的**Name**和`Bearer`作为其**Prefix**开始;将密钥本身粘贴为**Value**。对于采用裸值的头(如`X-Api-Key`),更改名称并清除前缀

126 

127 对于以其他方式进行身份验证的API,选择不同的**Credential type**。该列表与[Claude Tag](https://claude.com/docs/claude-tag/overview)(Team和Enterprise计划的Slack集成)为[connections](https://claude.com/docs/claude-tag/admins/add-connections)提供的列表相同。

128 </Step>

129 

130 <Step title="保存凭证">

131 选择**Connect**。凭证出现在列表中,带有其主机,保存时不需要对话框的**Save changes**按钮。保存后你无法再次查看该值。

132 </Step>

133</Steps>

134 

135要确认凭证有效,请在环境中启动会话并要求Claude调用API,例如使用`curl`。API的响应就像密钥在请求中一样,密钥不会出现在会话的环境变量或任何文件中。如果列表将凭证标记为**Not sent**,其下方的注释会说明原因和解决方法。两个主机重叠但不完全匹配的凭证不会获得标记,代理只会发送其中一个。

136 

137<h4 id="which-requests-get-the-credential">

138 哪些请求获得凭证

139</h4>

140 

141当请求的主机与你在该凭证上列出的主机匹配时,代理会将凭证附加到请求。会话可以到达这些主机,即使环境的[网络访问级别](#access-levels)不允许,除了[从不获得凭证的主机](#requests-that-never-get-the-credential)。凭证适用于在环境中运行的每个会话,无论谁启动它,直到你删除它。

142 

143<h4 id="requests-that-never-get-the-credential">

144 从不获得凭证的请求

145</h4>

146 

147代理永远不会将你添加的凭证附加到这些请求:

148 

149* **GitHub**:[GitHub代理](#github-proxy)改为对GitHub的请求进行身份验证,所以你不需要为它提供API凭证

150* **Anthropic API和公共包注册表**:`api.anthropic.com`、`registry.npmjs.org`、`jsr.io`、`npm.jsr.io`、`pypi.org`、`files.pythonhosted.org`、`index.crates.io`和`proxy.golang.org`

151* **Setup script请求**:Claude Code在启动时连接到代理,在[setup script](#setup-scripts)运行后

152 

153<h3 id="select-an-environment-from-the-cli">

154 从CLI选择环境

155</h3>

156 

157在你的终端中运行`/remote-env`来为你从CLI创建的云会话(例如[`claude --cloud`](/docs/zh-CN/claude-code-on-the-web#from-terminal-to-web))选择默认环境。该命令打开你现有环境的选择器并将你的选择保存到你的[用户设置](/docs/zh-CN/settings#where-settings-live)中的`remote.defaultEnvironmentId`键,所以它适用于你机器上的每个项目,直到你更改它,除非在更高优先级的[设置层](/docs/zh-CN/settings#settings-precedence)(例如仓库的项目设置)上设置了相同的键。

158 

159[自托管环境](/docs/zh-CN/self-hosted-environments)ID的形式为`ccpool_...`,遵循更严格的源规则。查看[`remote.defaultEnvironmentId`](/docs/zh-CN/settings-reference#remote-defaultenvironmentid)了解Claude Code遵守它的设置层。

160 

161`/remote-env`仅设置默认值:它不启动会话,也不能添加或编辑环境。从[环境选择器](#configure-your-environment)管理它们。

162 

163<h3 id="archive-an-environment">

164 归档环境

165</h3>

166 

167要归档环境,请打开它进行编辑并选择**Archive**。你不能删除环境,只能归档它。

168 

169归档影响新会话,不影响运行中的会话:

170 

171* 已经在环境中运行的会话继续工作。

172* 环境从选择器和`/remote-env`中消失,所以你无法为新会话选择它。

173* 环境上的API凭证在其运行的会话中保持附加。删除你不再需要的任何凭证,然后再归档。

174* 没有新会话可以在任何表面上的归档环境中启动。如果该环境是你保存的[CLI默认值](#select-an-environment-from-the-cli),当你的列表有一个时,Claude Code会在Anthropic托管的环境中启动CLI云会话,否则在你列表中不是[Remote Control bridge环境](#the-default-environment)的第一个环境中启动。任何显式配置了该环境的东西,例如[routine](/docs/zh-CN/routines#environments-and-network-access),无法在其中启动新会话。将其指向另一个环境。

175 

176<h3 id="organization-shared-environments">

177 组织共享环境

178</h3>

179 

180在Team和Enterprise计划上,所有者可以创建与组织的每个成员共享的云环境。同一角色管理**Cloud environments**管理页面上的其他所有内容,包括[自托管环境](/docs/zh-CN/self-hosted-environments);管理员角色无法打开该页面。可以打开它的完整角色列表是[管理服务器管理的设置](/docs/zh-CN/server-managed-settings#access-control)的角色列表。共享环境出现在每个成员的环境选择器中,与他们的个人环境并排,所以团队可以标准化一个配置,而不是每个成员重新创建它。

181 

182从[admin settings](https://claude.ai/admin-settings)中的**Cloud environments**页面创建、编辑和归档共享环境。共享环境也可以从[claude.ai/code](https://claude.ai/code)的[环境选择器](#configure-your-environment)打开:所有者可以在那里编辑它。其他成员以只读方式看到它。每个共享环境都有一个名称、一个[网络访问级别](#access-levels)、`.env`格式的[环境变量](#set-environment-variables)和一个[setup script](#setup-scripts)。所有者在[claude.ai/admin-settings/claude-code](https://claude.ai/admin-settings/claude-code)单独选择组织的[默认环境](#the-default-environment)。

183 

184每个成员在共享环境中的会话都读取其变量,所以不要在其中包含秘密。[API凭证](#add-api-credentials)给予会话一个它们无法读取的密钥,在Team或Enterprise计划上还不可用。

185 

186<h3 id="set-the-environment-a-claude-tag-channel-uses">

187 设置Claude Tag频道使用的环境

188</h3>

189 

190在[Claude Tag](https://claude.com/docs/claude-tag/overview)频道中,Claude作为你组织的共享身份工作,而不是任何成员,所以频道会话仅使用组织级别的环境,要么是共享环境,要么是[自托管环境](/docs/zh-CN/self-hosted-environments)。要给频道一个不是[预安装](#installed-tools)的工具链,例如.NET,所有者可以从**Cloud environments**管理页面创建一个[共享环境](#organization-shared-environments),带有一个[setup script](#setup-scripts)来安装它。通过以下两种方式之一将频道指向一个环境:

191 

192* 在[claude.ai/admin-settings/claude-code](https://claude.ai/admin-settings/claude-code)将共享或自托管环境设置为组织的[默认环境](#the-default-environment)。

193* 在Claude Tag管理设置中[将一个固定到频道](https://claude.com/docs/claude-tag/admins/troubleshooting#channel-sessions-use-the-wrong-environment-or-can%E2%80%99t-find-one)。

194 

195<h2 id="network-access">

196 网络访问

197</h2>

198 

199每个环境都设置一个网络访问级别,控制其会话可以进行的出站连接。默认级别 **Trusted** 允许包注册表和其他[允许列表中的域](#default-allowed-domains);**Custom** 采用您自己的域列表。

200 

201要更改环境的网络访问,[打开它进行编辑](#configure-your-environment)并在对话框中使用 **Network access** 选择器。打开选择器的云图标出现在[Default 环境](#the-default-environment)下列出的应用界面上,以及[例程编辑器](/docs/zh-CN/routines#environments-and-network-access)中;个人环境在您的 claude.ai 账户设置中没有单独的页面。

202 

203<Note>

204 您在会话或例程上启用的 MCP 连接器无需将其主机添加到 **Allowed domains**,因为连接器流量通过 Anthropic 的服务器而不是会话的网络传输。您可以按会话或按例程配置连接器;移除任何您不需要的连接器,以限制 Claude 可以访问的工具。这依赖于[安全性和隔离](/docs/zh-CN/claude-code-on-the-web#security-and-isolation)下提到的同一条通往 Anthropic 的通道。

205</Note>

206 

207<h3 id="access-levels">

208 访问级别

209</h3>

210 

211[环境对话框](#configure-your-environment)中的 **Network access** 字段采用以下四个级别之一:

212 

213| 级别 | 出站连接 |

214| :---------- | :------------------------------------------------------ |

215| **None** | 通过会话的网络没有出站网络访问 |

216| **Trusted** | 仅限[允许列表中的域](#default-allowed-domains):包注册表、GitHub、云 SDK |

217| **Full** | 任何域 |

218| **Custom** | 您自己的允许列表,可选择包含默认值 |

219 

220无论您选择哪个级别,会话仍然可以访问这些,因为每一个都采用不经过会话的网络允许列表的路径:

221 

222* GitHub,通过其[单独的代理](#github-proxy)

223* 您启用的 [MCP 连接器](#network-access),其流量通过 Anthropic 的服务器传输

224* 您在环境的 [API 凭证](#add-api-credentials)上列出的主机,除了[代理跳过的主机](#requests-that-never-get-the-credential)

225* Anthropic API,用于 Claude Code 自己的请求,即使在 **None** 下也是如此,如[安全性和隔离](/docs/zh-CN/claude-code-on-the-web#security-and-isolation)下所述

226 

227<h3 id="allow-specific-domains">

228 允许特定域

229</h3>

230 

231要允许不在 Trusted 列表中的域,请在环境的网络访问设置中选择 **Custom**,然后在 **Allowed domains** 字段中每行列出一个域。此示例允许内部项目可能需要的三个主机。

232 

233```text theme={null}

234api.example.com

235*.internal.example.com

236registry.example.com

237```

238 

239此环境中的会话现在可以访问 `api.example.com`、`internal.example.com` 的任何子域和 `registry.example.com`,但无法通过会话的网络访问其他域。[GitHub 流量](#github-proxy)、[MCP 连接器流量](#network-access)和对环境 [API 凭证](#add-api-credentials)的主机的请求(除了[代理跳过的主机](#requests-that-never-get-the-credential))不经过此允许列表。前导 `*.` 匹配每个子域。要同时保留 [Trusted 域](#default-allowed-domains),请勾选 **Also include default list of common package managers**;不勾选则只允许您列出的内容。

240 

241如果您的组织使用[工件](/docs/zh-CN/artifacts#availability),会话读取工件时不需要在列表中包含 `*.frame.claudeusercontent.com`。当列表中没有该主机时,Claude Code 通过会话与 Anthropic 的连接读取工件内容。在两种情况下保留允许列表中的主机:

242 

243* **此环境中的会话打开另一个组织的公开工件**:Claude Code 直接从主机获取这些工件,因此将其添加到此列表。

244* **您正在配置本地 CLI 或自托管运行器**:在该允许列表中保留主机。请参阅[网络访问要求](/docs/zh-CN/network-config#network-access-requirements)和自托管[网络要求](/docs/zh-CN/self-hosted-environments-deploy#network-requirements)。

245 

246每个环境都有自己的允许域列表;没有组织级别的允许列表可供管理员推送到每个成员的环境。[服务器管理的设置](/docs/zh-CN/server-managed-settings)在云会话内仍然适用,但其中没有任何设置会将域添加到环境的网络允许列表。

247 

248<h3 id="github-proxy">

249 GitHub 代理

250</h3>

251 

252在 Anthropic 托管的环境中,所有 GitHub 操作都经过专用代理,使您的真实 GitHub 凭证保留在会话的 VM 之外,独立于环境的[访问级别](#access-levels)。自托管环境中的会话使用您的部署提供的凭证进行 git 操作身份验证;[配置 git](/docs/zh-CN/self-hosted-environments-deploy#configure-git)涵盖了选项,包括按会话生成的凭证和选择加入此同一代理。代理提供:

253 

254* **Git 凭证**:VM 内的 git 客户端使用范围受限的凭证,代理验证并将其交换为您的实际 GitHub 令牌。

255* **API 请求**:来自内置 GitHub 工具的请求,以及来自 [`proxy-injected` 占位符](#work-with-github-issues-and-pull-requests)下的 `gh` 的请求,会在替换为您的真实凭证后发出。

256* **推送保护**:`git push` 仅适用于会话的当前工作分支;克隆、获取和 PR 操作正常工作。

257* **存储库范围**:GitHub API 和发布资产请求仅能到达附加到会话的存储库,因此从未附加的存储库下载发布资产的设置脚本会收到 403。

258* **GraphQL 限制**:代理仅提供一组固定的 GraphQL 操作用于拉取请求工作流。代理在 GraphQL 端点上拒绝所有其他内容,返回 403,显示 `This GraphQL query is not enabled for this session`,并命名 REST 回退 `gh api repos/{owner}/{repo}/...`。无论您提供的凭证如何,限制都适用于通过代理的每个请求,因此您设置的 `GH_TOKEN` 会收到相同的 403。Claude 无法通过代理访问仅存在于 GraphQL 中的 GitHub API,例如 Projects v2。

259 

260来自公开存储库的已提交文件通过 `raw.githubusercontent.com` 到达,改由[安全代理](#security-proxy)处理。该域在默认 [Trusted 列表](#default-allowed-domains)中,因此除非环境的[访问级别](#access-levels)排除它,否则这些文件保持可访问。

261 

262<h3 id="security-proxy">

263 安全代理

264</h3>

265 

266Anthropic 托管环境中的云会话在 HTTP/HTTPS 网络代理后面运行,用于安全和滥用防范目的;在[自托管环境](/docs/zh-CN/self-hosted-environments-deploy#default-deny-egress)中,出站流量通过您自己的网络边界离开。来自 Anthropic 托管会话的所有出站互联网流量都经过此代理,它提供:

267 

268* 防范恶意请求

269* 速率限制和滥用防范

270* 增强安全性的内容过滤

271* 所请求主机名的 DNS 级审计踪迹

272 

273<h2 id="what’s-available-in-cloud-sessions">

274 云会话中可用的内容

275</h2>

276 

277在 Anthropic 托管的环境中,每个会话都会获得一台运行 Ubuntu 24.04 的全新虚拟机 (VM)(x86\_64 架构),无论您自己的操作系统和 CPU 架构是什么,您的存储库已克隆,常见的工具链已预安装。当依赖项提供预编译的二进制文件(例如具有本机扩展的 Ruby gem 或预构建的 Python wheel)时,请使用其 x86\_64 Linux 构建以匹配 VM。本节涵盖 Anthropic 托管的默认值、内置 GitHub 工具、如何[运行测试和服务](#run-tests-start-services-and-add-packages),以及每台 VM 获得的[资源限制](#resource-limits)。

278 

279<Note>

280 您的组织路由到[自托管环境](/docs/zh-CN/self-hosted-environments)的会话在您自己的运行器上运行,使用您的运行器镜像提供的工具。

281</Note>

282 

283<h3 id="what-carries-over-from-your-setup">

284 您的设置中会保留的内容

285</h3>

286 

287云会话从您存储库的全新克隆开始。您提交到存储库的任何内容都可用。您只在自己机器上安装或配置的任何内容在会话中都不可用。您组织的策略通过[服务器管理的设置](/docs/zh-CN/server-managed-settings)单独到达。

288 

289| | 在云会话中可用 | 原因 |

290| :-------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------ | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

291| 您的存储库的 `CLAUDE.md` | 是 | 克隆的一部分 |

292| 您的存储库的 `.claude/settings.json` hooks | 是 | 克隆的一部分 |

293| 您的存储库的 `.mcp.json` MCP 服务器 | 是 | 克隆的一部分 |

294| 您的存储库的 `.claude/rules/` | 是 | 克隆的一部分 |

295| 您的存储库的 `.claude/skills/`、`.claude/agents/`、`.claude/commands/` | 是 | 克隆的一部分 |

296| 在 `.claude/settings.json` 中声明的 Plugins | 是 | 在会话启动时从您声明的 [marketplace](/docs/zh-CN/plugin-marketplaces) 安装。需要网络访问以到达 marketplace 来源 |

297| 您组织的[服务器管理的设置](/docs/zh-CN/server-managed-settings) | 是 | 在会话启动时从 Anthropic 的服务器获取。请参阅 [Surface coverage](/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) |

298| 您的用户 `~/.claude/CLAUDE.md` | 否 | 位于您的机器上,不在存储库中 |

299| 您的用户 `~/.claude/skills/`、`~/.claude/agents/`、`~/.claude/commands/` | 否 | 位于您的机器上,不在存储库中。请改为将它们提交到存储库的 `.claude/` 目录。云会话会自动加载您在 claude.ai 上启用的技能 |

300| 仅在您的用户设置中启用的 Plugins | 否 | 用户范围的 `enabledPlugins` 位于 `~/.claude/settings.json`。请改为在存储库的 `.claude/settings.json` 中声明它们,或在您的 claude.ai 账户中启用它们,以便 Claude Code 将它们作为[同步 Plugins](/docs/zh-CN/plugins-reference#synced-plugins)加载 |

301| 您使用 `claude mcp add` 在默认本地范围或用户范围添加的 MCP 服务器 | 否 | 这些写入您机器上的 `~/.claude.json`,而不是存储库。请使用 `claude mcp add --scope project` 添加服务器,它会写入存储库的 [`.mcp.json`](/docs/zh-CN/mcp#project-scope),并提交该文件 |

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

303| Claude 调用的服务的 API 密钥和令牌 | 在 Pro 和 Max 计划中,作为 [API 凭证](#add-api-credentials) | 您在环境中添加一次密钥,代理会将其附加到您列出的主机的请求。代理[无法附加](#requests-that-never-get-the-credential)的密钥,或 Team 或 Enterprise 计划中的任何密钥,保留在环境变量中 |

304| 交互式身份验证,例如 AWS SSO | 否 | 不支持。SSO 需要基于浏览器的登录,无法在云会话中执行 |

305 

306要在云会话中提供您自己的配置,请将其提交到存储库。

307 

308任何使用环境的人都可以读取其环境变量和设置脚本。对话框在**环境变量**下的注释说明了这一点,并警告不要在那里放置密钥。在 Pro 和 Max 计划中,存储代理可以附加的密钥作为 [API 凭证](#add-api-credentials)。

309 

310<h3 id="installed-tools">

311 已安装的工具

312</h3>

313 

314云会话预安装了常见的语言运行时、构建工具和数据库。下表按类别总结了包含的内容。

315 

316| 类别 | 包含 |

317| :------------ | :------------------------------------------------------------ |

318| **Python** | Python 3.x,搭配 pip、poetry、uv、black、mypy、pytest、ruff |

319| **Node.js** | 20、21 和 22,搭配 npm、yarn、pnpm、bun¹、eslint、prettier、chromedriver |

320| **Ruby** | 3.1、3.2、3.3,搭配 gem、bundler、rbenv |

321| **PHP** | 8.3,搭配 Composer |

322| **Java** | OpenJDK 21,搭配 Maven 和 Gradle |

323| **Go** | Go,搭配模块支持 |

324| **Rust** | rustc 和 cargo |

325| **C/C++** | GCC、Clang、cmake、ninja、conan |

326| **Docker** | docker、dockerd、docker compose |

327| **Databases** | PostgreSQL 16、Redis 7.0 |

328| **Utilities** | git、gh、jq、yq、ripgrep、tmux、vim、nano |

329 

330¹ Bun 已安装,但在包获取时存在已知的[代理兼容性问题](#install-dependencies-with-a-sessionstart-hook)。

331 

332要获取此表中大多数工具的版本,请让 Claude 在云会话中运行 `check-tools`。它是安装在会话 VM 上的 shell 命令,不是斜杠命令;您让 Claude 运行是因为 [Claude 为您运行所有 VM 命令](#run-tests-start-services-and-add-packages)。对于它不报告的工具,例如 Ruby、PHP、bun、PostgreSQL 或 Redis,请让 Claude 运行该工具自己的版本命令,例如 `psql --version`。

333 

334Node.js 版本安装在 `/opt/node20`、`/opt/node21` 和 `/opt/node22`,默认情况下 22 在 `PATH` 上。要使用不同的版本,请让 Claude 将该版本的 `bin` 目录(例如 `/opt/node20/bin`)前置到 `PATH`。

335 

336此列表之外的工具链,例如 .NET SDK,即使其包注册表在[默认允许列表](#default-allowed-domains)上也不会预安装。请使用[设置脚本](#setup-scripts)安装它们。

337 

338<h3 id="work-with-github-issues-and-pull-requests">

339 使用 GitHub 问题和拉取请求

340</h3>

341 

342云会话包括内置 GitHub 工具,让 Claude 无需任何设置即可读取问题、列出拉取请求、获取差异和发布评论。这些工具通过 [GitHub 代理](#github-proxy),使用您在 [GitHub 身份验证选项](/docs/zh-CN/claude-code-on-the-web#github-authentication-options)下设置的任何方法进行身份验证,因此您的令牌永远不会进入容器。

343 

344您可以在[环境配置](#set-environment-variables)中自己设置 `GH_TOKEN` 或 `GITHUB_TOKEN`,或者两者都不设置,让 [GitHub 代理](#github-proxy)为您进行身份验证:

345 

346* 如果您设置了令牌,它会原封不动地传递到容器中,因此您的脚本和 GitHub 的 [`gh` CLI](https://cli.github.com) 会直接使用它。

347* 如果您都不设置,则由 [GitHub 代理](#github-proxy)为您的会话处理身份验证,这两个变量在 Claude 运行的命令中读取为占位符字符串 `proxy-injected`,代理在出站 GitHub 请求上替换为您的真实凭证。`gh` 无需您自己的令牌即可工作,但直接读取 `GITHUB_TOKEN` 的脚本会得到占位符,而不是可用的令牌。

348 

349您设置的令牌是普通环境变量,因此使用环境的任何人都可以读取它;代理路径将凭证保留在环境配置和会话 VM 之外。

350 

351要检查哪种情况适用于您的会话,请让 Claude 运行 `echo $GH_TOKEN`。

352 

353GitHub 的 [`gh` CLI](https://cli.github.com) 已预安装。如果您需要内置工具未涵盖的 `gh` 命令,例如 `gh release` 或 `gh workflow run`,请让 Claude 运行它。`gh` 会自动读取 `GH_TOKEN`,因此您不需要运行 `gh auth login`。

354 

355<h3 id="link-output-back-to-the-session">

356 将输出链接回会话

357</h3>

358 

359每个云会话在 claude.ai 上都有一个转录 URL,会话可以从 `CLAUDE_CODE_REMOTE_SESSION_ID` 环境变量读取自己的 ID。使用它在 PR 正文、提交消息、Slack 帖子或生成的报告中放置可追溯的链接,以便审阅者可以打开生成它们的运行。

360 

361Claude 在云会话中创建的提交包括 `Claude-Session: <url>` git 尾注,PR 正文在单独一行包括会话 URL。这需要 v2.1.179 或更新版本。要省略尾注和 PR 正文链接,请将 [`attribution.sessionUrl`](/docs/zh-CN/settings-reference#attribution-sessionurl) 设置为 `false`。此设置需要 v2.1.182 或更新版本。

362 

363要在提交或 PR 以外的内容中包含会话链接,例如 Claude 发布的 Slack 消息或它编写的报告文件,请让 Claude 运行以下命令并使用其输出。该命令将环境变量值中的 `cse_` 前缀转换为转录 URL 预期的 `session_` 前缀:

364 

365```bash theme={null}

366echo "https://claude.ai/code/${CLAUDE_CODE_REMOTE_SESSION_ID/#cse_/session_}"

367```

368 

369<h3 id="run-tests-start-services-and-add-packages">

370 运行测试、启动服务和添加包

371</h3>

372 

373您无法进入会话 VM 的 shell。Claude 为您运行每个命令,因此请将本节中的工作表述为您提示中的请求。

374 

375<h4 id="run-tests">

376 运行测试

377</h4>

378 

379Claude 在处理工作的过程中运行测试。在您的提示中提出要求,例如"修复 `tests/` 中的失败测试"或"在每次更改后运行 pytest"。随[预安装的工具链](#installed-tools)提供的测试运行器(例如 pytest 和 cargo test)无需额外设置即可工作。您的项目声明为依赖项的运行器(例如 jest)会随您的依赖项一起安装。

380 

381<h4 id="start-services">

382 启动服务

383</h4>

384 

385PostgreSQL 和 Redis 已预安装但默认不运行。让 Claude 启动您需要的任何一个;它运行的命令是:

386 

387```bash theme={null}

388service postgresql start

389```

390 

391```bash theme={null}

392service redis-server start

393```

394 

395Docker 可用于运行容器化服务。让 Claude 运行 `docker compose up` 以启动您项目的服务。拉取镜像的网络访问遵循您环境的[访问级别](#access-levels),[Trusted 默认值](#default-allowed-domains)包括 Docker Hub 和其他常见注册表。

396 

397如果您的镜像很大或拉取速度很慢,请将 `docker compose pull` 或 `docker compose build` 添加到您的[设置脚本](#setup-scripts)。[环境缓存](#environment-caching)保留拉取的镜像,因此每个新会话的磁盘上都有它们。缓存仅保存文件,不保存运行中的进程,因此 Claude 仍然在每个会话中启动容器。

398 

399<h4 id="add-packages">

400 添加包

401</h4>

402 

403要添加未预安装的包,请使用[设置脚本](#setup-scripts)。[环境缓存](#environment-caching)保留脚本安装的内容,因此您在那里安装的包在每个会话开始时都可用,无需每次重新安装。您也可以让 Claude 在会话中途安装包,但这些安装不会带到其他会话。

404 

405<h3 id="resource-limits">

406 资源限制

407</h3>

408 

409Anthropic 托管环境中的云会话运行时具有可能随时间变化的近似资源上限:

410 

411* 4 vCPU

412* 16 GB RAM

413* 30 GB 磁盘

414 

415VM 可能会停止需要明显更多内存的工作,例如大型构建工作或内存密集型测试。对于超出这些限制的工作负载,请使用 [Remote Control](/docs/zh-CN/remote-control) 在您自己的硬件上运行 Claude Code,或在[自托管环境](/docs/zh-CN/self-hosted-environments)中运行云会话,该环境在您的组织运营的计算上。

416 

417<h2 id="setup-scripts">

418 设置脚本

419</h2>

420 

421设置脚本是一个 Bash 脚本,在新的云会话启动时运行,在 Claude Code 启动之前运行。使用设置脚本来安装依赖项、配置工具,或获取会话需要但未预安装的任何内容。

422 

423脚本以 root 身份在 Ubuntu 24.04 上运行,因此 `apt install` 和大多数语言包管理器都能工作。

424 

425要添加设置脚本,请打开环境配置对话框,并在 **Setup script** 字段中输入您的脚本。

426 

427此示例安装 [ShellCheck](https://www.shellcheck.net/),它不是预安装的。

428 

429```bash theme={null}

430#!/bin/bash

431apt update && apt install -y shellcheck

432```

433 

434<h3 id="script-requirements">

435 脚本要求

436</h3>

437 

438设置脚本有三个需要考虑的约束:

439 

440* **以零退出**:如果脚本以非零状态结束,会话将无法启动。在非关键命令后附加 `|| true`,以便间歇性安装失败不会阻止会话。

441* **在五分钟内完成**:将脚本的总运行时间保持在大约五分钟以内,以便[环境缓存](#environment-caching)可以建立。使用 `&` 和 `wait` 并行运行独立的安装,并将任何无法容纳的单个下载移至 [SessionStart hook](#setup-scripts-vs-sessionstart-hooks),在后台启动它。

442* **安装需要网络访问**:包安装需要连接到注册表。默认的 **Trusted** 级别涵盖[常见包注册表](#default-allowed-domains),包括 npm、PyPI、RubyGems 和 crates.io;使用 **None** 网络访问时,安装会失败。

443 

444<h3 id="environment-caching">

445 环境缓存

446</h3>

447 

448设置脚本在您第一次在环境中启动会话时运行。完成后,Anthropic 会对文件系统进行快照,并将该快照重用作后续会话的起点。新会话以您的依赖项、工具和 Docker 镜像已在磁盘上的状态开始,并跳过设置脚本步骤。即使脚本安装大型工具链或拉取容器镜像,这也能保持启动速度快。

449 

450缓存是文件系统快照,因此它会保留设置脚本写入磁盘的内容,并丢失任何仅在运行中的内容。您安装的包、您拉取的 Docker 镜像和您写入的文件都会保留。脚本启动的数据库、`docker compose up` 堆栈或任何其他后台进程不会保留;请通过询问 Claude 或使用 [SessionStart hook](#setup-scripts-vs-sessionstart-hooks) 在每个会话中启动这些。

451 

452当您更改环境的设置脚本或允许的网络主机时,以及当缓存在大约七天后到期时,设置脚本会再次运行以重建缓存。恢复现有会话永远不会重新运行设置脚本。

453 

454您不需要自己启用缓存或管理快照。

455 

456<h3 id="setup-scripts-vs-sessionstart-hooks">

457 设置脚本与 SessionStart hooks

458</h3>

459 

460使用设置脚本来配备 VM 本身:未[预安装](#installed-tools)的工具链和 CLI 工具。使用 [SessionStart hook](/docs/zh-CN/hooks#sessionstart) 进行应在各处运行的项目设置,包括云端和本地,例如 `npm install`。

461 

462设置脚本和 SessionStart hooks 在云会话启动时按固定顺序运行。下表比较了您在哪里配置它们、何时运行以及在哪里运行。

463 

464| | 设置脚本 | SessionStart hooks |

465| ------------ | ------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------- |

466| **您在哪里配置它们** | [claude.ai/code](https://claude.ai/code) 的环境对话框,以及[共享环境](#organization-shared-environments)的 **Cloud environments** 管理页面 | [设置文件](/docs/zh-CN/settings#where-settings-live),例如您的存储库的 `.claude/settings.json`;请参阅[您的设置中会保留的内容](#what-carries-over-from-your-setup),了解哪些文件会到达云会话 |

467| **它们何时运行** | 在 Claude Code 启动之前,当存在[缓存环境](#environment-caching)时跳过 | 在 Claude Code 启动后,在每个会话(包括已恢复的会话)上 |

468| **它们在哪里运行** | 仅限云会话 | 本地和云会话 |

469 

470如果您在用户级 `~/.claude/settings.json` 中有 SessionStart hooks,不要期望它们在云端生效。用户级设置保留在您的机器上。其他 hooks 运行的位置取决于会话运行的位置:

471 

472* **Anthropic 托管环境**:Claude Code 运行来自存储库和您组织的[服务器管理的设置](/docs/zh-CN/server-managed-settings)的 hooks。

473* **[自托管环境](/docs/zh-CN/self-hosted-environments-configuration#permissions-and-tool-approval)**:Claude Code 还运行运行程序主机的 `~/.claude/` 中的运行程序操作员播种的 hooks,以及运行程序镜像的托管设置文件中的 hooks,当该文件是 [Claude Code 应用的托管源](/docs/zh-CN/managed-settings#how-claude-code-combines-managed-sources)之一时。

474 

475<h3 id="install-dependencies-with-a-sessionstart-hook">

476 使用 SessionStart hook 安装依赖项

477</h3>

478 

479要仅在云会话中安装依赖项,请将 SessionStart hook 与检查其运行位置的脚本配对。

480 

481首先,将 SessionStart hook 添加到您的存储库的 `.claude/settings.json`。此配置告诉 Claude Code 在会话启动或恢复时运行存储库中的 `scripts/install_pkgs.sh`:

482 

483```json theme={null}

484{

485 "hooks": {

486 "SessionStart": [

487 {

488 "matcher": "startup|resume",

489 "hooks": [

490 {

491 "type": "command",

492 "command": "bash \"$CLAUDE_PROJECT_DIR\"/scripts/install_pkgs.sh"

493 }

494 ]

495 }

496 ]

497 }

498}

499```

500 

501`matcher` 将 hook 限制为 `startup` 和 `resume` 事件,`$CLAUDE_PROJECT_DIR` 解析为存储库根目录,因此无论会话的工作目录是什么,hook 都能找到脚本。

502 

503接下来,在 `scripts/install_pkgs.sh` 创建脚本。它在云端之外立即退出,否则安装您的依赖项:

504 

505```bash theme={null}

506#!/bin/bash

507 

508if [ "$CLAUDE_CODE_REMOTE" != "true" ]; then

509 exit 0

510fi

511 

512npm install

513pip install -r requirements.txt

514exit 0

515```

516 

517`CLAUDE_CODE_REMOTE` 检查是将安装限制在云会话的关键:会话 VM 的环境将该变量设置为 `true`,在本地永远不会是 `true`,因此在您的笔记本电脑上,脚本会在安装任何内容之前退出。

518 

519这两个文件一起使每个云会话在启动时获得全新的 `npm install` 和 `pip install`,同时保持本地会话不受影响。

520 

521<h4 id="limitations-in-cloud-sessions">

522 云会话中的限制

523</h4>

524 

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

526 

527* **没有仅云端的范围**:hooks 在本地和云会话中都运行。要跳过本地运行,请检查 `CLAUDE_CODE_REMOTE` 环境变量,如上所示。

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

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

530* **增加启动延迟**:hooks 在每次会话启动或恢复时运行,不同于受益于[环境缓存](#environment-caching)的设置脚本。请通过在重新安装之前检查依赖项是否已存在来保持安装脚本快速。

531 

532要自定义基础镜像,请使用设置脚本在[提供的镜像](#installed-tools)上安装您需要的内容,或使用 `docker compose` 将您自己的镜像作为 Claude 旁边的容器运行。目前不支持完全替换基础镜像。

533 

534<h2 id="default-allowed-domains">

535 默认允许的域

536</h2>

537 

538使用 **Trusted** 网络访问,会话默认可以访问以下域。标记为 `*` 的域表示通配符子域匹配,因此 `*.gcr.io` 允许 `gcr.io` 的任何子域。

539 

540<AccordionGroup>

541 <Accordion title="Anthropic 服务">

542 * api.anthropic.com

543 * statsig.anthropic.com

544 * docs.claude.com

545 * platform.claude.com

546 * code.claude.com

547 * claude.ai

548 </Accordion>

549 

550 <Accordion title="版本控制">

551 * github.com

552 * [www.github.com](http://www.github.com)

553 * api.github.com

554 * npm.pkg.github.com

555 * raw\.githubusercontent.com

556 * pkg-npm.githubusercontent.com

557 * objects.githubusercontent.com

558 * release-assets.githubusercontent.com

559 * codeload.github.com

560 * avatars.githubusercontent.com

561 * camo.githubusercontent.com

562 * gist.github.com

563 * gitlab.com

564 * [www.gitlab.com](http://www.gitlab.com)

565 * registry.gitlab.com

566 * bitbucket.org

567 * [www.bitbucket.org](http://www.bitbucket.org)

568 * api.bitbucket.org

569 </Accordion>

570 

571 <Accordion title="容器注册表">

572 * registry-1.docker.io

573 * auth.docker.io

574 * index.docker.io

575 * hub.docker.com

576 * [www.docker.com](http://www.docker.com)

577 * production.cloudflare.docker.com

578 * download.docker.com

579 * gcr.io

580 * \*.gcr.io

581 * ghcr.io

582 * mcr.microsoft.com

583 * \*.data.mcr.microsoft.com

584 * public.ecr.aws

585 </Accordion>

586 

587 <Accordion title="云平台">

588 * cloud.google.com

589 * accounts.google.com

590 * gcloud.google.com

591 * \*.googleapis.com

592 * storage.googleapis.com

593 * compute.googleapis.com

594 * container.googleapis.com

595 * azure.com

596 * portal.azure.com

597 * microsoft.com

598 * [www.microsoft.com](http://www.microsoft.com)

599 * \*.microsoftonline.com

600 * packages.microsoft.com

601 * dotnet.microsoft.com

602 * dot.net

603 * visualstudio.com

604 * dev.azure.com

605 * \*.amazonaws.com

606 * \*.api.aws

607 * oracle.com

608 * [www.oracle.com](http://www.oracle.com)

609 * java.com

610 * [www.java.com](http://www.java.com)

611 * java.net

612 * [www.java.net](http://www.java.net)

613 * download.oracle.com

614 * yum.oracle.com

615 </Accordion>

616 

617 <Accordion title="JavaScript 和 Node 包管理器">

618 * registry.npmjs.org

619 * [www.npmjs.com](http://www.npmjs.com)

620 * [www.npmjs.org](http://www.npmjs.org)

621 * npmjs.com

622 * npmjs.org

623 * yarnpkg.com

624 * registry.yarnpkg.com

625 </Accordion>

626 

627 <Accordion title="Python 包管理器">

628 * pypi.org

629 * [www.pypi.org](http://www.pypi.org)

630 * files.pythonhosted.org

631 * pythonhosted.org

632 * test.pypi.org

633 * pypi.python.org

634 * pypa.io

635 * [www.pypa.io](http://www.pypa.io)

636 </Accordion>

637 

638 <Accordion title="Ruby 包管理器">

639 * rubygems.org

640 * [www.rubygems.org](http://www.rubygems.org)

641 * api.rubygems.org

642 * index.rubygems.org

643 * ruby-lang.org

644 * [www.ruby-lang.org](http://www.ruby-lang.org)

645 * rubyforge.org

646 * [www.rubyforge.org](http://www.rubyforge.org)

647 * rubyonrails.org

648 * [www.rubyonrails.org](http://www.rubyonrails.org)

649 * rvm.io

650 * get.rvm.io

651 </Accordion>

652 

653 <Accordion title="Rust 包管理器">

654 * crates.io

655 * [www.crates.io](http://www.crates.io)

656 * index.crates.io

657 * static.crates.io

658 * rustup.rs

659 * static.rust-lang.org

660 * [www.rust-lang.org](http://www.rust-lang.org)

661 </Accordion>

662 

663 <Accordion title="Go 包管理器">

664 * proxy.golang.org

665 * sum.golang.org

666 * index.golang.org

667 * golang.org

668 * [www.golang.org](http://www.golang.org)

669 * goproxy.io

670 * pkg.go.dev

671 </Accordion>

672 

673 <Accordion title="JVM 包管理器">

674 * maven.org

675 * repo.maven.org

676 * central.maven.org

677 * repo1.maven.org

678 * repo.maven.apache.org

679 * jcenter.bintray.com

680 * gradle.org

681 * [www.gradle.org](http://www.gradle.org)

682 * services.gradle.org

683 * plugins.gradle.org

684 * kotlinlang.org

685 * [www.kotlinlang.org](http://www.kotlinlang.org)

686 * spring.io

687 * repo.spring.io

688 </Accordion>

689 

690 <Accordion title="其他包管理器">

691 * packagist.org (PHP Composer)

692 * [www.packagist.org](http://www.packagist.org)

693 * repo.packagist.org

694 * nuget.org (.NET NuGet)

695 * [www.nuget.org](http://www.nuget.org)

696 * api.nuget.org

697 * pub.dev (Dart/Flutter)

698 * api.pub.dev

699 * hex.pm (Elixir/Erlang)

700 * [www.hex.pm](http://www.hex.pm)

701 * cpan.org (Perl CPAN)

702 * [www.cpan.org](http://www.cpan.org)

703 * metacpan.org

704 * [www.metacpan.org](http://www.metacpan.org)

705 * api.metacpan.org

706 * cocoapods.org (iOS/macOS)

707 * [www.cocoapods.org](http://www.cocoapods.org)

708 * cdn.cocoapods.org

709 * haskell.org

710 * [www.haskell.org](http://www.haskell.org)

711 * hackage.haskell.org

712 * swift.org

713 * [www.swift.org](http://www.swift.org)

714 </Accordion>

715 

716 <Accordion title="Linux 发行版">

717 * archive.ubuntu.com

718 * security.ubuntu.com

719 * ubuntu.com

720 * [www.ubuntu.com](http://www.ubuntu.com)

721 * \*.ubuntu.com

722 * ppa.launchpad.net

723 * launchpad.net

724 * [www.launchpad.net](http://www.launchpad.net)

725 * \*.nixos.org

726 </Accordion>

727 

728 <Accordion title="开发工具和平台">

729 * dl.k8s.io (Kubernetes)

730 * pkgs.k8s.io

731 * k8s.io

732 * [www.k8s.io](http://www.k8s.io)

733 * releases.hashicorp.com (HashiCorp)

734 * apt.releases.hashicorp.com

735 * rpm.releases.hashicorp.com

736 * archive.releases.hashicorp.com

737 * hashicorp.com

738 * [www.hashicorp.com](http://www.hashicorp.com)

739 * repo.anaconda.com (Anaconda/Conda)

740 * conda.anaconda.org

741 * anaconda.org

742 * [www.anaconda.com](http://www.anaconda.com)

743 * anaconda.com

744 * continuum.io

745 * apache.org (Apache)

746 * [www.apache.org](http://www.apache.org)

747 * archive.apache.org

748 * downloads.apache.org

749 * eclipse.org (Eclipse)

750 * [www.eclipse.org](http://www.eclipse.org)

751 * download.eclipse.org

752 * nodejs.org (Node.js)

753 * [www.nodejs.org](http://www.nodejs.org)

754 * developer.apple.com

755 * developer.android.com

756 * pkg.stainless.com

757 * binaries.prisma.sh

758 </Accordion>

759 

760 <Accordion title="云服务和监控">

761 * statsig.com

762 * [www.statsig.com](http://www.statsig.com)

763 * api.statsig.com

764 * sentry.io

765 * \*.sentry.io

766 * downloads.sentry-cdn.com

767 * http-intake.logs.datadoghq.com

768 * browser-intake-us5-datadoghq.com

769 * \*.datadoghq.com

770 * \*.datadoghq.eu

771 * api.honeycomb.io

772 </Accordion>

773 

774 <Accordion title="内容分发和镜像">

775 * sourceforge.net

776 * \*.sourceforge.net

777 * packagecloud.io

778 * \*.packagecloud.io

779 * fonts.googleapis.com

780 * fonts.gstatic.com

781 </Accordion>

782 

783 <Accordion title="架构和配置">

784 * json-schema.org

785 * [www.json-schema.org](http://www.json-schema.org)

786 * json.schemastore.org

787 * [www.schemastore.org](http://www.schemastore.org)

788 </Accordion>

789 

790 <Accordion title="Model Context Protocol">

791 * \*.modelcontextprotocol.io

792 </Accordion>

793</AccordionGroup>

794 

795<h2 id="related-resources">

796 相关资源

797</h2>

798 

799* [Claude Code on the web](/docs/zh-CN/claude-code-on-the-web):启动、管理和共享云会话

800* [Web quickstart](/docs/zh-CN/web-quickstart):连接 GitHub 并启动您的第一个云会话

801* [Claude Tag](https://claude.com/docs/claude-tag/overview):Claude 从 Slack 启动的会话在相同的环境中运行

802* [Routines](/docs/zh-CN/routines):计划运行使用相同的环境和网络访问级别

803* [Remote Control](/docs/zh-CN/remote-control):改为在您自己的机器的网络和文件上运行会话

804* [Self-hosted environments](/docs/zh-CN/self-hosted-environments):在您的组织自己的基础设施上运行云会话

805* [SessionStart hooks](/docs/zh-CN/hooks#sessionstart):存储库提交的设置,在本地和云会话中运行

806* [Server-managed settings](/docs/zh-CN/server-managed-settings):到达云会话的组织策略

commands.md +135 −111

Details

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt2> 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.3> Use this file to discover all available pages before exploring further.

4 4 

5# 命令5# Commands

6 6 

7> Claude Code 中可用命令的完整参考,包括内置命令和捆绑的 skills。7> Claude Code 中可用命令的完整参考,包括内置命令和捆绑的 skills。

8 8 

9命令在会话内控制 Claude Code。它们提供了一种快速的方式来切换模型、管理权限、清除上下文、运行工作流等。9Commands 从会话内部控制 Claude Code。它们提供了一种快速方式来切换模型、管理权限、清除上下文、运行工作流等。

10 10 

11输入 `/` 可以查看所有可用命令,或输入 `/` 后跟字母来筛选。11输入 `/` 查看可用的命令,或输入 `/` 后跟字母来筛选。[命令菜单如何匹配你输入的内容](#how-the-command-menu-matches-what-you-type)涵盖了高亮显示、拼写错误以及 Claude Code 在你输入完整名称之前隐藏的少数命令。

12 12 

13命令只在您的消息开头被识别。命令名称后面的文本作为参数传递给它。从 v2.1.199 开始,[skills](/docs/zh-CN/skills#pass-arguments-to-skills) 是例外:skill 调用后跟更多 skills,例如 `/skill-a /skill-b do XYZ`,会加载开头命名的每个 skill,并将尾部文本作为参数传递给每个 skill。最多可以链接六个 skills。13命令只在你的消息开头被识别。命令名称后面的文本成为其参数。从 v2.1.199 开始,[skills](/docs/zh-CN/skills#pass-arguments-to-skills)是例外:一个 skill 调用后跟更多 skills,例如 `/skill-a /skill-b do XYZ`,会加载开头命名的每个 skill,并将尾部文本作为参数传递给每个 skill。最多可以链接六个 skills。

14 14 

15如果您在 Claude 正在响应时发送命令,它会排队并在当前轮次完成后运行。某些命令,例如 `/status`、`/tasks` 和 `/usage`,会立即运行而不中断响应。15如果你在 Claude 响应时发送命令,Claude Code 会将其排队,并在当前轮次完成后运行。Claude Code 会立即运行某些命令而不中断响应,例如 `/status`、`/tasks` 和 `/usage`。在[全屏渲染](/docs/zh-CN/fullscreen)中,Claude Code 也会立即打开对话命令,例如 `/theme` 和 `/help`。在 v2.1.234 之前,Claude Code 会将这些对话排队直到轮次完成。

16 16 

17<h2 id="commands-across-a-typical-workflow">17<h2 id="commands-across-a-typical-workflow">

18 典型工作流程中的命令18 典型工作流程中的命令

19</h2>19</h2>

20 20 

21大多数命令在会话的特定点很有用,从设置项目到发布更改。21大多数命令在会话的特定阶段很有用,从设置项目到发布更改。

22 22 

23**首次在存储库中的会话。** 运行 `/init` 以生成启动器 `CLAUDE.md`,然后运行 `/memory` 以完善它。使用 `/mcp` 来设置项目需要的任何服务器,要求 Claude 创建您想要的任何 [subagents](/docs/zh-CN/sub-agents),并运行 `/permissions` 来设置您的批准规则。23**首次在仓库中的会话。** 运行 `/init` 生成一个启动 `CLAUDE.md`,然后运行 `/memory` 来完善它。使用 `/mcp` 设置项目需要的任何服务器,要求 Claude 创建你想要的任何 [subagents](/docs/zh-CN/sub-agents),并运行 `/permissions` 来设置你的批准规则。

24 24 

25**在任务期间。** `/plan` 在大型更改前切换到 Plan Mode。`/model` 和 `/effort` 调整您使用的模型以及它应用的推理量。当对话变长时,`/context` 显示窗口中填充的内容,`/compact` 将其总结以释放空间。使用 `/btw` 进行快速附加说明,不应该添加到对话历史记录中。25**执行任务期间。** `/plan` 在大型更改前切换到 plan mode。`/model` 和 `/effort` 调整你使用的模型以及它应用多少推理。当对话变得很长时,`/context` 显示什么在填充窗口,`/compact` 总结它以释放空间。使用 `/btw` 提出不应添加到对话历史的附带问题。

26 26 

27**并行运行工作。** Claude 将侧面任务委派给 [subagents](/docs/zh-CN/sub-agents),`/tasks` 列出当前会话的后台工作,包括已完成的 subagents。`/background` 分离整个会话以继续作为 [background agent](/docs/zh-CN/agent-view) 运行,并释放您的终端。对于跨越代码库的大型更改,`/batch` 将其分解为独立单元,并在其自己的 [worktree](/docs/zh-CN/worktrees) 中运行每个单元。请参阅 [Run agents in parallel](/docs/zh-CN/agents) 以了解这些方法如何相关联。27**并行运行工作。** Claude 将附带任务委派给 [subagents](/docs/zh-CN/sub-agents),`/tasks` 列出当前会话的后台工作,包括已完成的 subagents。`/background` 分离整个会话以继续作为 [background agent](/docs/zh-CN/agent-view) 运行并释放你的终端。对于跨越代码库的大型更改,`/batch` 将其分解为独立单元并在各自的 [worktree](/docs/zh-CN/worktrees) 中运行每个单元。请参阅 [Run agents in parallel](/docs/zh-CN/agents) 了解这些方法如何相关。

28 28 

29**在您发布之前。** `/diff` 显示更改的内容,`/code-review` 检查差异以查找正确性错误和清理,并可以使用 `--fix` 应用这些发现,`/review` 对 GitHub pull request 运行快速单遍只读审查,`/code-review <level> <pr#>` 对其运行多代理审查,`/security-review` 检查差异以查找安全漏洞。`/code-review ultra` 在云中运行多代理审查。29**在你发布之前。** `/diff` 显示更改的内容。`/code-review` 检查当前 diff 是否存在正确性错误和清理,并可以使用 `--fix` 应用发现的问题;传递 PR 号码,例如 `/code-review high 1234`,以改为审查拉取请求。`/review` 是一个别名。`/code-review ultra` 在云中运行多代理审查。`/security-review` 检查 diff 是否存在安全漏洞。

30 30 

31**在会话之间。** `/clear` 在保持项目内存的同时开始新任务。`/resume` 和 `/branch` 让您返回或分叉早期的对话。`/teleport` 将网络会话拉入此终端,`/remote-control` 让您从另一台设备继续此本地会话。31**会话之间。** `/clear` 在保持项目内存的同时开始新任务。`/resume` 返回到较早的对话,`/branch` 分支当前对话以尝试不同的方向,`/fork` 将其复制到新的 [background session](/docs/zh-CN/agent-view)。`/teleport` 将网络会话拉入此终端,`/remote-control` 让你从另一台设备继续此本地会话。

32 32 

33**当出现问题时。** `/rewind` 将代码和对话回滚到检查点,或总结对话的一部分。`/doctor` 运行设置检查以诊断安装和配置问题,并可以修复它们,`/debug` 诊断运行时问题,`/feedback` 报告附加会话上下文的错误。33**当出现问题时。** `/rewind` 将代码和对话回滚到检查点,或总结对话的一部分。`/doctor` 运行设置检查以诊断安装和配置问题并可以修复它们,`/debug` 诊断运行时问题,`/feedback` 报告附加会话上下文的错误。

34 34 

35<h2 id="all-commands">35<h2 id="all-commands">

36 所有命令36 所有命令


38 38 

39下表列出了 Claude Code 中包含的所有命令。大多数是内置命令,其行为被编码到 CLI 中。两种条目被标记:39下表列出了 Claude Code 中包含的所有命令。大多数是内置命令,其行为被编码到 CLI 中。两种条目被标记:

40 40 

41* **[Skill](/docs/zh-CN/skills#bundled-skills)**:一个捆绑的 skill。它的工作方式与您自己编写的 skills 相同:一个提示交给 Claude,Claude 也可以在相关时自动调用。41* **[Skill](/docs/zh-CN/skills#bundled-skills)**:一个捆绑的 skill。它的工作方式与你自己编写的 skill 相同:一个提示词交给 Claude。

42* **[Workflow](/docs/zh-CN/workflows#bundled-workflows)**:一个捆绑的[动态工作流](/docs/zh-CN/workflows),可以跨许多子代理展开工作并在后台运行。42 * `/verify` 仅在你调用它时运行。在 v2.1.215 之前,Claude 也可以自己运行 `/verify`。

43* **[Workflow](/docs/zh-CN/workflows#bundled-workflows)**:一个捆绑的[动态 workflow](/docs/zh-CN/workflows),它将工作分散到许多子代理中,并在后台运行。

44 * `/deep-research` 仅在你调用它时运行。在 v2.1.218 之前,Claude 也可以自己启动它。

43 45 

44要添加您自己的命令,请参阅 [skills](/docs/zh-CN/skills)。46要添加你自己的命令,请参阅 [skills](/docs/zh-CN/skills)。

45 47 

46在下表中,`<arg>` 表示必需的参数,`[arg]` 表示可选参数。48在下表中,`<arg>` 表示必需的参数,`[arg]` 表示可选参数。

47 49 

48<Note>50<Note>

49 并非每个命令都对每个用户显示。可用性取决于您的平台、计划和环境。例如,`/desktop` 仅在 macOS 和 Windows 上显示(当使用 Claude 订阅登录时),`/upgrade` 仅在 Pro 和 Max 计划上显示。51 并非每个命令都对每个用户显示。可用性取决于你的平台、计划和环境。例如,`/desktop` 仅在 macOS 和 x64 Windows 上使用 Claude 订阅登录时显示,`/upgrade` 在企业计划上不显示。

50</Note>52</Note>

51 53 

52| 命令 | 用途 |54| 命令 | 目的 |

53| :--------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |55| :----------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

54| `/add-dir <path>` | 为当前会话期间的文件访问添加工作目录。输入部分路径会显示匹配的目录建议;按 `Tab` 接受一个。大多数 `.claude/` 配置[不会从添加的目录中发现](/docs/zh-CN/permissions#additional-directories-grant-file-access-not-configuration)。您可以稍后使用 `--continue` 或 `--resume` 从添加的目录恢复会话 |56| `/add-dir <path>` | 添加一个工作目录以在当前会话期间进行文件访问。输入部分路径以查看匹配的目录建议;按 `Tab` 接受一个。大多数 `.claude/` 配置[不会从添加的目录中被发现](/docs/zh-CN/permissions#additional-directories-grant-file-access-not-configuration)。你无法添加大多数[网络路径](/docs/zh-CN/errors#working-directory-is-a-network-path),例如 `\\server\share`。成功添加后,你的 [`DirectoryAdded` hooks](/docs/zh-CN/hooks#directoryadded) 会运行。当你在 Claude 响应时运行它时,Claude Code 会要求你立即确认目录,一旦你确认,Claude 在同一轮中的下一个工具调用就可以访问它。在 v2.1.234 之前,Claude Code 会将命令排队直到轮次完成 |

55| `/advisor [model\|off]` | 启用或禁用[顾问工具](/docs/zh-CN/advisor),它在任务期间的关键时刻咨询第二个模型以获取指导。接受 `opus`、`sonnet`、`fable`(v2.1.170+)或完整模型 ID。不带参数时,打开选择器 |57| `/advisor [model\|off]` | 启用或禁用[顾问工具](/docs/zh-CN/advisor),它在任务期间的关键时刻咨询第二个模型以获得指导。接受 `fable`、`opus`、`sonnet` 或完整的模型 ID。`fable` 需要 [Fable 访问权限](/docs/zh-CN/advisor#choose-an-advisor-model)。没有参数时,打开一个选择器。在没有交互式终端的会话中,或通过 [Remote Control](/docs/zh-CN/remote-control#limitations),将模型或 `off` 作为参数传递;在那里没有参数时,命令将当前顾问打印为文本。这些形式需要 Claude Code v2.1.260 或更高版本 |

56| `/agents` | 从 v2.1.198 开始,运行 `/agents` 会打印一个提醒,要求您询问 Claude 创建或管理 [subagents](/docs/zh-CN/sub-agents),或直接编辑 `.claude/agents/` 或 `~/.claude/agents/`。在 v2.1.197 及更早版本中,打开用于创建和管理 subagent 配置的交互式界面 |58| `/agents` | 从 v2.1.198 开始,运行 `/agents` 会打印一个提醒,要求你要求 Claude 创建或管理[子代理](/docs/zh-CN/sub-agents),或直接编辑 `.claude/agents/` 或 `~/.claude/agents/`。在 v2.1.197 及更早版本上,打开一个交互式界面来创建和管理子代理配置 |

57| `/autofix-pr [prompt]` | 生成一个[网络版 Claude Code](/docs/zh-CN/claude-code-on-the-web#auto-fix-pull-requests) 会话,监视当前分支的 PR,并在 CI 失败或审阅者留下评论时推送修复。使用 `gh pr view` 检测已检出分支的开放 PR;要监视不同的 PR,请先检出其分支。默认情况下,远程会话被告知修复每个 CI 失败和审阅评论;传递一个提示以给它不同的说明,例如 `/autofix-pr only fix lint and type errors`。需要 `gh` CLI 和访问[网络版 Claude Code](/docs/zh-CN/claude-code-on-the-web) |59| `/artifacts` | 列出你拥有或与你共享的[工件](/docs/zh-CN/artifacts#find-an-artifact-again),然后将其附加到会话、在浏览器中打开或复制其链接。在[工件](/docs/zh-CN/artifacts#availability)可用的地方可用。需要 Claude Code v2.1.208 或更高版本;使用 `Enter` 附加需要 v2.1.216 |

58| `/background [prompt]` | 将当前会话分离以作为[后台 agent](/docs/zh-CN/agent-view) 运行并释放此终端。传递一个提示以在分离前发送一条更多指令。使用 `claude agents` 监视会话。别名:`/bg` |60| `/auto-mode-setup` | [从你的项目和最近的会话中起草 `autoMode.environment` 条目](/docs/zh-CN/auto-mode-config#generate-environment-entries),然后审查草稿并将其保存到你的用户设置。需要 Pro、Max 或 Team 计划以及 Claude Code v2.1.228 或更高版本。在原生 Windows 上,需要 v2.1.233 或更高版本 |

59| `/batch <instruction>` | **[Skill](/docs/zh-CN/skills#bundled-skills).** 在整个代码库中并行编排大规模更改。研究代码库,将工作分解为 5 到 30 个独立单元,并呈现一个计划。获得批准后,在隔离的 [git worktree](/docs/zh-CN/worktrees) 中为每个单元生成一个[后台 subagent](/docs/zh-CN/sub-agents#run-subagents-in-foreground-or-background)。每个 subagent 实现其单元、运行测试并打开一个 pull request。需要一个 git 存储库。示例:`/batch migrate src/ from Solid to React` |61| `/autocompact [auto\|<tokens>]` | 设置自动压缩窗口:在 Claude Code 自动压缩之前上下文窗口有多满。传递一个大小,例如 `500k`,或 `auto` 以返回为你的模型调整的窗口。Claude Code 将该值保存到用户设置并将其应用于当前会话。有关接受的值和覆盖它的内容,请参阅[设置自动压缩窗口](/docs/zh-CN/model-config#set-the-auto-compact-window)。没有参数时,打开一个显示当前窗口的对话框。需要 Claude Code v2.1.221 或更高版本 |

60| `/branch [name]` | 在此点创建当前对话的分支,以便您可以尝试不同的方向而不会丢失当前的对话。切换到分支并保留原始分支,您可以使用 `/resume` 返回。要将附加任务交给后台 subagent 而不是自己切换到副本,请使用 `/fork` |62| `/autofix-pr [prompt]` | 生成一个 [Claude Code on the web](/docs/zh-CN/claude-code-on-the-web#auto-fix-pull-requests) 会话,监视当前分支的 PR 并在 CI 失败或审阅者留下评论时推送修复。使用 `gh pr view` 从你的检出分支检测打开的 PR;要监视不同的 PR,请先检出其分支。默认情况下,云会话被告知修复每个 CI 失败和审阅评论;传递一个提示词以给它不同的指令,例如 `/autofix-pr only fix lint and type errors`。需要 `gh` CLI 和访问 [Claude Code on the web](/docs/zh-CN/claude-code-on-the-web) |

61| `/btw <question>` | 提出快速[附加问题](/docs/zh-CN/interactive-mode#side-questions-with-%2Fbtw),无需添加到对话中 |63| `/background [prompt]` | 分离当前会话以作为[后台代理](/docs/zh-CN/agent-view)运行并释放此终端。传递一个提示词以在分离前发送一个更多指令。使用 `claude agents` 监视会话。要将对话复制到新的后台会话中,同时此会话继续运行,请使用 `/fork`。别名:`/bg` |

62| `/cd <path>` | 将此会话移动到新的工作目录。对话的提示缓存被保留:新目录的 [`CLAUDE.md`](/docs/zh-CN/memory) 作为消息附加,而不是重建系统提示。会话被重新定位到新目录的项目存储,因此 `--resume` 和 `--continue` 从那里找到它。如果您之前未在该目录中工作过,会提示您信任该目录。输入部分路径会显示匹配的目录建议;按 `Tab` 接受一个。建议需要 Claude Code v2.1.206 或更高版本。要授予对额外目录的访问权限而不移动会话,请使用 `/add-dir`。使用 [`Cd` 权限规则](/docs/zh-CN/permissions#cd) 限制或禁用 `/cd` 目标。需要 Claude Code v2.1.169 或更高版本;早期版本报告 `Unknown command: /cd` |64| `/batch <instruction>` | **[Skill](/docs/zh-CN/skills#bundled-skills)。** 在整个代码库中并行编排大规模更改。研究代码库,将工作分解为 5 到 30 个独立单元,并呈现一个计划。获得批准后,在隔离的 [git worktree](/docs/zh-CN/worktrees) 中为每个单元生成一个[后台子代理](/docs/zh-CN/sub-agents#run-subagents-in-foreground-or-background)。每个子代理实现其单元,运行测试,并打开一个拉取请求。需要一个 git 存储库。示例:`/batch migrate src/ from JavaScript to TypeScript` |

65| `/branch [name]` | 在此点创建当前对话的一个分支,以便你可以尝试不同的方向而不会丢失对话。切换到分支并保留原始分支,你可以使用 `/resume` 返回到它。要运行一个副本作为单独的[后台会话](/docs/zh-CN/agent-view)而不是切换到它,请使用 `/fork`;要将一个侧面任务交给一个[子代理](/docs/zh-CN/sub-agents),它报告回这个对话,请使用 `/subtask` |

66| `/btw [question]` | 询问一个[侧面问题](/docs/zh-CN/interactive-mode#side-questions-with-%2Fbtw)关于当前会话而不添加到对话中。如果你运行 `/btw` 而没有问题,Claude Code 会显示你最近的侧面问题,以便你可以浏览早期的答案;如果你还没有问过,Claude Code 会打印一条使用行。在 v2.1.212 之前,`/btw` 需要一个问题 |

67| `/bug [report]` | 报告一个错误或分享你的对话。你选择要包含多少会话历史记录,并在发送任何内容之前在同意屏幕上确认。当你在第一方连接上登录到 Anthropic 时,报告会发送到 Anthropic;在第三方提供商上,或没有 Anthropic 凭证,Claude Code 会将报告写入一个[本地存档在 `~/.claude/feedback-bundles/`](/docs/zh-CN/data-usage#telemetry-services),你自己转发。在 [VS Code 扩展](/docs/zh-CN/vs-code#use-the-prompt-box)中,`/bug` 打开扩展自己的反馈对话框;需要 Claude Code v2.1.229 或更高版本。当你在 Claude 响应时运行它时,Claude Code 立即打开对话框。在 v2.1.232 之前,Claude Code 会将命令排队直到轮次完成。别名:`/share`。在 v2.1.212 之前,`/bug` 和 `/share` 是 `/feedback` 的别名 |

68| `/cd <path>` | 将此会话移动到新的工作目录,保持对话。输入部分路径以查看匹配的目录建议;按 `Tab` 接受一个。建议需要 Claude Code v2.1.206 或更高版本。有关 Claude Code 在移动时立即应用的内容,以及 `/cd` 与 `/add-dir` 的区别,请参阅[将会话移动到另一个目录](/docs/zh-CN/permissions#move-the-session-to-another-directory) |

63| `/chrome` | 配置 [Claude in Chrome](/docs/zh-CN/chrome) 设置 |69| `/chrome` | 配置 [Claude in Chrome](/docs/zh-CN/chrome) 设置 |

64| `/claude-api [migrate\|managed-agents-onboard]` | **[Skill](/docs/zh-CN/skills#bundled-skills).** 为您的项目语言(Python、TypeScript、Java、Go、Ruby、C#、PHP 或 cURL)和 Managed Agents 参考加载 Claude API 参考资料。涵盖工具使用、流式传输、批处理、结构化输出和常见陷阱。当您的代码导入 `anthropic` 或 `@anthropic-ai/sdk` 时也会自动激活。运行 `/claude-api migrate` 以将现有 Claude API 代码升级到更新的模型:Claude 询问要扫描哪些文件以及要针对哪个模型,然后更新在版本之间更改的模型 ID、thinking 配置和其他参数。运行 `/claude-api managed-agents-onboard` 以获得交互式演练,从头开始创建新的 Managed Agent |70| `/claude-api [migrate\|upgrade\|managed-agents-onboard\|prompt-audit\|cost-optimize\|build-eval\|hillclimb]` | **[Skill](/docs/zh-CN/skills#bundled-skills)。** 为你的项目的语言加载 [Claude API](https://platform.claude.com/docs/en/api/overview) 和 [Managed Agents](https://platform.claude.com/docs/en/managed-agents/overview) 参考资料。当你的代码导入 `anthropic` 或 `@anthropic-ai/sdk` 时也会自动激活。运行 `migrate` 以将现有 Claude API 代码更新到更新的模型。运行 `upgrade` 以跨主要版本移动你的项目的 Anthropic SDK 依赖项,目前是 Python `anthropic` 包从 0.x 到 1.x。运行 `managed-agents-onboard` 以获得创建新 Managed Agent 的演练。运行 `prompt-audit` 以标记为旧模型编写的指令在你的提示词、skill 和工具描述中,并提议修复作为差异。运行 `cost-optimize` 以分析你的项目的 Claude API 支出去向,并提议从选项(如 prompt caching、修剪不需要的输入和输出令牌、批处理、工作量和模型选择)中节省,一次一个更改。运行 `build-eval` 以为你的 Claude 驱动的应用构建一个 eval 集,运行 `hillclimb` 以针对现有 eval 迭代改进应用。`prompt-audit` 子命令需要 Claude Code v2.1.221 或更高版本,`upgrade` 需要 v2.1.236 或更高版本,`cost-optimize` 需要 v2.1.247 或更高版本,`build-eval` 和 `hillclimb` 需要 v2.1.259 或更高版本 |

65| `/clear [name]` | 使用空上下文启动新对话。传递一个名称以在 `/resume` 选择器中标记之前的对话。要在继续同一对话的同时释放上下文,请改用 `/compact`。使用 `/resume` 恢复之前的对话,或在同一 Claude Code 进程中,从[倒回菜单的上一个会话条目](/docs/zh-CN/checkpointing#rewind-past-a-cleared-conversation)恢复它。别名:`/reset`、`/new` |71| `/clear [name]` | 使用空上下文启动新对话。传递一个名称以在 `/resume` 选择器中标记上一个对话。要在继续同一对话的同时释放上下文,请改用 `/compact`。使用 `/resume` 恢复上一个对话,或在同一 Claude Code 进程中,从[倒带菜单的上一个会话条目](/docs/zh-CN/checkpointing#rewind-past-a-cleared-conversation)恢复它。倒带条目需要 Claude Code v2.1.191 或更高版本。别名:`/reset`、`/new` |

66| `/code-review [low\|medium\|high\|xhigh\|max\|ultra] [--fix] [--comment] [target]` | **[Skill](/docs/zh-CN/skills#bundled-skills).** 审阅当前差异以查找正确性错误以及重用、简化和效率清理。传递 `--fix` 以将发现应用到您的工作树,传递 `--comment` 以将其作为内联 GitHub PR 评论发布,或传递 `ultra` 以运行深度[云审阅](/docs/zh-CN/ultrareview)。从 v2.1.154 开始,`/simplify` 运行单独的仅清理审阅,应用修复而不寻找错误。有关工作量级别和目标,请参阅[本地审阅差异](/docs/zh-CN/code-review#review-a-diff-locally) |72| `/code-review [low\|medium\|high\|xhigh\|max\|ultra] [--fix] [--comment] [pr#\|branch\|path]` | **[Skill](/docs/zh-CN/skills#bundled-skills)。** 审查当前差异,或你传递的 PR 号、分支或路径,以查找正确性错误和清理机会。传递 `--fix` 以应用发现,`--comment` 以在 GitHub PR 或 GitLab 合并请求上发布它们,或 `ultra` 以运行深度[云审查](/docs/zh-CN/ultrareview)。发布到 GitLab 合并请求需要 Claude Code v2.1.257 或更高版本。在 `github.com` PR 目标上使用 `ultra` 时,传递 `--post` 以在启动对话框中预选[将完成的发现发布到 PR](/docs/zh-CN/ultrareview#post-findings-to-the-pull-request);`--post` 需要 Claude Code v2.1.227 或更高版本。有关工作量级别、目标和它与 `/simplify` 的关系,请参阅[本地审查差异](/docs/zh-CN/code-review#review-a-diff-locally)。别名:`/review` |

67| `/color [color\|default]` | 为当前会话设置提示栏颜色。可用颜色:`red`、`blue`、`green`、`yellow`、`purple`、`orange`、`pink`、`cyan`。使用 `default` 重置,或不带参数运行以选择随机颜色。当 [Remote Control](/docs/zh-CN/remote-control) 连接时,颜色同步到 claude.ai/code。也可在非交互模式(`-p`)中使用;需要 Claude Code v2.1.205 或更高版本 |73| `/color [color\|default]` | 为当前会话设置提示栏颜色。可用颜色:`red`、`blue`、`green`、`yellow`、`purple`、`orange`、`pink`、`cyan`。使用 `default` 重置,或运行不带参数以选择随机颜色。当 [Remote Control](/docs/zh-CN/remote-control) 连接时,颜色同步到 claude.ai/code。也可在非交互模式 (`-p`) 中使用;需要 Claude Code v2.1.205 或更高版本 |

68| `/compact [instructions]` | 通过总结到目前为止的对话来释放上下文。可选择性地传递焦点说明以进行总结。请参阅[压缩如何处理规则、skills 和内存文件](/docs/zh-CN/context-window#what-survives-compaction) |74| `/compact [instructions]` | 通过总结到目前为止的对话来释放上下文。可选地为摘要传递焦点指令。请参阅[压缩如何处理规则、skill 和内存文件](/docs/zh-CN/context-window#what-survives-compaction) |

69| `/config [key=value ...]` | 打开[设置](/docs/zh-CN/settings)界面以调整主题、模型、[输出样式](/docs/zh-CN/output-styles)和其他偏好设置。从 v2.1.181 开始,传递一个或多个 `key=value` 对以直接设置设置而无需打开界面,例如 `/config thinking=false`。从 v2.1.182 开始,也接受命名的简写键,例如 `/config theme=dark` 或 `/config model=sonnet`。`key=value` 形式也适用于非交互模式(`-p`)和[远程控制](/docs/zh-CN/remote-control)。运行 `/config --help` 以列出每个可设置的键及其选项。别名:`/settings` |75| `/config [key=value ...]` | 打开[设置](/docs/zh-CN/settings)界面以调整主题、模型、[输出样式](/docs/zh-CN/output-styles)和其他首选项。从 v2.1.181 开始,传递一个或多个 `key=value` 对以直接设置设置而不打开界面,例如 `/config thinking=false`。从 v2.1.182 开始,也接受命名的简写键,例如 `/config theme=dark` 或 `/config model=sonnet`。`key=value` 形式也适用于非交互模式 (`-p`) 和来自 Claude 移动应用的 [Remote Control](/docs/zh-CN/remote-control)。`key=value` 形式无法打开需要你在面板中确认的设置,例如 [`autoContinueAtUsageLimit`](/docs/zh-CN/interactive-mode#turn-automatic-continue-off),尽管它可以关闭一个。运行 `/config --help` 以列出它接受的键。别名:`/settings` |

70| `/context [all]` | 将当前上下文使用情况可视化为彩色网格。显示上下文密集型工具、内存膨胀和容量警告的优化建议。在[全屏模式](/docs/zh-CN/fullscreen)中,每项的分解被折叠以保持网格可见。传递 `all` 以展开它 |76| `/context [all]` | 将当前上下文使用情况可视化为彩色网格。显示上下文繁重工具、内存膨胀和容量警告的优化建议。当对话超过上下文窗口时,输出包括一个[警告](/docs/zh-CN/errors#context-exceeds-the-token-limit),显示你超过限制的距离以及哪个命令释放空间。在[全屏模式](/docs/zh-CN/fullscreen)中,`/context` 折叠每项细目以保持网格可见。传递 `all` 以展开它 |

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

72| `/cost` | `/usage` 的别名 |78| `/cost` | `/usage` 的别名 |

73| `/dataviz [request]` | **[Skill](/docs/zh-CN/skills#bundled-skills).** 为图表、图形和仪表板提供设计指导。Claude 为数据选择图表形式,按角色分配颜色,使用捆绑脚本验证调色板的色盲安全性和对比度,并应用标记、交互和可访问性规则。使用品牌中立的占位符调色板,您可以用自己的调色板替换。需要 Claude Code v2.1.198 或更高版本 |79| `/dataviz [request]` | **[Skill](/docs/zh-CN/skills#bundled-skills)。** 为图表、图形和仪表板提供设计指导。Claude 为数据选择图表形式,按角色分配颜色,使用捆绑脚本验证调色板的色盲安全性和对比度,并应用标记、交互和可访问性规则。使用一个品牌中立的占位符调色板,你用自己的替换。需要 Claude Code v2.1.198 或更高版本 |

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

75| `/deep-research <question>` | **[Workflow](/docs/zh-CN/workflows#bundled-workflows).** 在问题上展开网络搜索,获取并交叉检查来源,并综合一份引用的报告 |81| `/deep-research <question>` | **[Workflow](/docs/zh-CN/workflows#bundled-workflows)。** 在问题上扇出网络搜索,获取和交叉检查来源,并综合一个引用的报告 |

76| `/design-login` | 使用您的 claude.ai 账户授权设计系统访问权限以供 `/design-sync` 使用 |82| `/design [brief]` | **[Skill](/docs/zh-CN/skills#bundled-skills)。** 在一个画布上起草 UI 模型、屏幕流、登陆页面或海报作为画板,发布为一个[工件](/docs/zh-CN/artifacts#draft-a-design-canvas),运行 Claude Design 编辑器的研究预览,例如 `/design a settings screen for a mobile banking app`。在为你的账户启用保存的地方,你编辑画布上的画板并保存以发布新版本;否则你查看草稿并将其导出为 PNG 或 PDF。需要一个[工件可用](/docs/zh-CN/artifacts#availability)的会话和 Claude Code v2.1.234 或更高版本。在 Anthropic API 上可用。在 Amazon Bedrock、Google Cloud 的 Agent Platform、Microsoft Foundry 和 Claude Platform on AWS 上,工件不可用,所以命令在那里不可用 |

77| `/design-sync [hint]` | **[Skill](/docs/zh-CN/skills#bundled-skills).** 转换您的存储库的 React 设计系统并将其上传到 [Claude Design](https://claude.ai/design),以便它生成的设计使用您的真实组件。可选择性地命名设计系统,例如 `/design-sync Acme DS`。首次同步验证每个组件,在大型存储库上可能需要几个小时。在 Anthropic API 上可用;在 Amazon Bedrock、Google Cloud 的 Agent Platform、Microsoft Foundry 和 Claude Platform on AWS 上,底层工具无法访问 claude.ai,因此该命令不可用 |83| `/design-login` | 使用你的 claude.ai 账户授权 `/design-sync` 的设计系统访问 |

78| `/desktop` | 在 Claude Code Desktop 应用中继续当前会话。仅限 macOS 和 Windows,需要 Claude 订阅。别名:`/app` |84| `/design-sync [hint]` | **[Skill](/docs/zh-CN/skills#bundled-skills)。** 转换你的 repo 的 React 设计系统并将其上传到 [Claude Design](https://claude.ai/design),以便它生成的设计使用你的真实组件。可选地命名设计系统,例如 `/design-sync Acme DS`。首次同步验证每个组件,在大型 repo 上可能需要几个小时。在 Anthropic API 上可用。它需要 claude.ai,CLI 在 Amazon Bedrock、Google Cloud 的 Agent Platform、Microsoft Foundry 或 Claude Platform on AWS 上不联系,或通过 [Claude apps gateway](/docs/zh-CN/claude-apps-gateway#availability-and-limitations),所以命令在那里不可用 |

79| `/diff` | 打开交互式差异查看器,显示未提交的更改和每轮差异。使用左/右箭头在当前 git 差异和单个 Claude 轮次之间切换,使用上/下浏览文件。按 Enter 打开所选文件的差异,使用上/下或 PageUp/PageDown 滚动,按 Esc 返回文件列表。从 v2.1.198 开始,打开的查看器也会在存储库的 git 状态在会话外发生变化时自动刷新,例如在另一个终端中进行分支切换或提交 |85| `/desktop` | 在 Claude Code Desktop 应用中继续当前会话。需要 macOS 或 x64 Windows 和 Claude 订阅。别名:`/app` |

80| `/doctor` | **[Skill](/docs/zh-CN/skills#bundled-skills).** 运行设置检查以诊断问题并可以修复它们。检查安装健康状况,包括重复或遗留安装、`PATH` 问题和无法解析的设置文件。查找未使用的 skills、MCP servers 和 plugins 与其上下文成本,标记缓慢的 [hooks](/docs/zh-CN/hooks),并检查是否有更新版本。针对已检入的文件去重本地 `CLAUDE.md` 文件,通过删除 Claude 可以从代码库派生的内容来修剪已检入的 [`CLAUDE.md`](/docs/zh-CN/memory) 文件,并将保留的始终加载的指导迁移到 [skills](/docs/zh-CN/skills) 和按需加载的嵌套 `CLAUDE.md` 文件。修剪会删除目录布局、依赖列表和架构概览等部分,并保留陷阱、基本原理和与工具默认值不同的约定。还提供将 [auto mode](/docs/zh-CN/permissions#permission-modes) 设置为默认值的选项,以及[预先批准](/docs/zh-CN/permissions)经常被拒绝的只读命令。首先报告发现并在更改任何内容之前要求确认。从终端,`claude doctor` 打印只读安装诊断而不启动会话。别名:`/checkup`。CLAUDE.md 修剪检查需要 Claude Code v2.1.206 或更高版本。在 v2.1.206 之前,版本检查将 Homebrew 安装与 `autoUpdatesChannel` 设置进行比较,而不是[已安装 cask 的频道](/docs/zh-CN/setup#configure-release-channel)。在 v2.1.205 之前,`/doctor` 打开只读诊断屏幕,按 `f` 将报告发送给 Claude |86| `/diff` | 审查你的工作树中的更改,包括 Claude 到目前为止所做的编辑。请参阅[使用 /diff 审查更改](/docs/zh-CN/interactive-mode#review-changes-with-%2Fdiff) |

81| `/effort [level\|auto]` | 设置模型[工作量级别](/docs/zh-CN/model-config#adjust-effort-level)。接受 `low`、`medium`、`high`、`xhigh`、`max` 或 `ultracode`;可用级别取决于模型,`max` 和 `ultracode` 仅限会话。`ultracode` 是一个 Claude Code 设置,它结合了 `xhigh` 推理和自动[工作流](/docs/zh-CN/workflows#let-claude-decide-with-ultracode)编排。`auto` 重置为模型默认值。不带参数时,打开交互式滑块;使用左右箭头选择级别,按 `Enter` 应用。立即生效,无需等待当前响应完成。也可在非交互模式(`-p`)中使用级别参数,其中它仅适用于当前会话且不保存为您的默认值;需要 Claude Code v2.1.205 或更高版本。在 Fable 5、Opus 4.8 和 Opus 4.7 上,当[模型默认工作量级别保持](/docs/zh-CN/model-config#adjust-effort-level)生效时,非交互 `/effort` 报告 `Not applied`,因此改为在启动时传递 `--effort` |87| `/doctor` | **[Skill](/docs/zh-CN/skills#bundled-skills)。** 运行一个设置检查,诊断问题并可以修复它们。检查安装健康状况,包括重复或遗留安装、`PATH` 问题和无法解析的设置文件。查找未使用的 skill、MCP 服务器和插件与其上下文成本,标记缓慢的 [hooks](/docs/zh-CN/hooks),并检查你的[发布频道](/docs/zh-CN/setup#configure-release-channel)上是否有更新版本。根据检入的本地 `CLAUDE.md` 文件进行重复数据删除,通过削减 Claude 可以从代码库派生的内容来修剪检入的 [`CLAUDE.md`](/docs/zh-CN/memory#my-claude-md-is-too-large) 文件,并将保留的始终加载的指导迁移到[skill](/docs/zh-CN/skills) 和按需加载的嵌套 `CLAUDE.md` 文件中。还提供使[自动模式](/docs/zh-CN/permissions#permission-modes)成为你的默认值和[预先批准](/docs/zh-CN/permissions)经常被拒绝的只读命令。首先报告发现并在更改任何内容之前要求确认。从终端,`claude doctor` 打印只读安装诊断而不启动会话。别名:`/checkup`。`CLAUDE.md` 修剪检查需要 Claude Code v2.1.206 或更高版本。在 v2.1.205 之前,`/doctor` 打开一个只读诊断屏幕,按 `f` 将报告发送给 Claude |

82| `/exit` | 退出 CLI。在附加的[后台会话](/docs/zh-CN/agent-view#attach-to-a-session)中,这会分离并且会话继续运行。别名:`/quit` |88| `/effort [level\|auto\|status]` | 设置[工作量级别](/docs/zh-CN/model-config#adjust-effort-level):`low` 到 `xhigh`、`max`、[`ultracode`](/docs/zh-CN/workflows#let-claude-decide-with-ultracode) 或 `auto`;`status` 打印它。`max` 和 `ultracode` 仅限会话;[`ultracode`](/docs/zh-CN/settings-reference#ultracode) 键持久化。在 Claude 响应时运行它,一旦你确认[缓存警告](/docs/zh-CN/prompt-caching#changing-effort-level)(如果 Claude Code 显示一个),Claude Code 会将新级别应用于该轮中的下一个请求。在 v2.1.242 之前,Claude Code 从它从 Anthropic 获取的功能标志决定是在轮中期运行命令还是将其排队直到轮次完成,并始终在不[获取功能标志](/docs/zh-CN/env-vars#features-that-need-feature-flag-fetching)的会话中排队它,例如在[第三方提供商](/docs/zh-CN/third-party-integrations)上。在[工作量保持](/docs/zh-CN/model-config#adjust-effort-level)之外的 `-p` 中工作 |

83| `/export [filename]` | 将当前对话导出为纯文本。使用文件名时,直接写入该文件。不使用文件名时,打开对话框以复制到剪贴板或保存到文件 |89| `/exit` | 退出 CLI。在附加的[后台会话](/docs/zh-CN/agent-view#attach-to-a-session)中,这会分离,会话继续运行。别名:`/quit` |

84| `/fast [on\|off]` | 切换[快速模式](/docs/zh-CN/fast-mode)开启或关闭。在非交互模式(`-p`)中,`/fast` 仅在使用快速模式在其 [`--settings`](/docs/zh-CN/cli-reference#cli-flags) 值中启动的会话中工作,例如 `claude -p --settings '{"fastMode": true}'`;切换然后仅适用于当前会话且不保存为您的默认值,在任何其他非交互会话中,该命令报告快速模式不可用。需要 Claude Code v2.1.205 或更高版本 |90| `/export [filename]` | 将当前对话导出为纯文本。使用文件名,直接写入该文件。没有,打开一个对话框以复制到剪贴板或保存到文件 |

85| `/feedback [report]` | 提交反馈、报告错误或分享您的对话。发送给 Anthropic 需要[身份验证](/docs/zh-CN/authentication)。别名:`/bug`、`/share` |91| `/fast [on\|off]` | 切换[快速模式](/docs/zh-CN/fast-mode)打开或关闭。在 Claude 响应时运行它,Claude Code 切换快速模式而不等待轮次结束,尽管运行的轮次以其原始速度完成。在 v2.1.242 之前,Claude Code 从它从 Anthropic 获取的功能标志决定是在轮中期运行命令还是将其排队直到轮次完成,并始终在不[获取功能标志](/docs/zh-CN/env-vars#features-that-need-feature-flag-fetching)的会话中排队它。非交互模式中的可用性受限于 `-p`;请参阅[切换快速模式](/docs/zh-CN/fast-mode#toggle-fast-mode)。需要 Claude Code v2.1.205 或更高版本 |

86| `/fewer-permission-prompts` | **[Skill](/docs/zh-CN/skills#bundled-skills).** 扫描您的记录以查找常见的只读 Bash 和 MCP 工具调用,然后向项目 `.claude/settings.json` 添加优先级允许列表以减少权限提示 |92| `/feedback [report]` | 发送关于 Claude Code 的产品反馈。打开与 [`/bug`](#all-commands) 相同的对话框,具有相同的同意步骤、发送规则和轮中期行为。在具有 [Claude 起草的反馈](/docs/zh-CN/tools-reference#sendfeedback-tool-behavior)的会话中,不带参数的 `/feedback` 打开草稿队列,你可以在其中审查、编辑、发送或丢弃 Claude 排队的草稿;队列包括一个选项来在对话框中写入新报告。使用参数,对于 `/bug` 总是,对话框直接打开 |

87| `/focus` | 切换焦点视图,仅显示您的最后一个提示、带有编辑 diffstats 的单行工具调用摘要和最终响应。从 v2.1.198 开始,工具调用摘要也计算在轮次中启动的 subagents 数量,并将已完成的后台任务通知折叠为单个计数。选择在会话间保持;设置 [`viewMode`](/docs/zh-CN/settings#available-settings) 在设置中以覆盖它。仅在[全屏渲染](/docs/zh-CN/fullscreen)中可用 |93| `/fewer-permission-prompts` | **[Skill](/docs/zh-CN/skills#bundled-skills)。** 扫描你的记录以查找常见的只读 Bash 和 MCP 工具调用,然后将优先级允许列表添加到项目 `.claude/settings.json` 以减少权限提示 |

88| `/fork <directive>` | 生成一个[分叉的 subagent](/docs/zh-CN/sub-agents#fork-the-current-conversation):一个继承完整对话的后台 subagent,在您继续进行时处理该指令。其结果在完成时返回到您的对话。要自己切换到对话的副本,请使用 `/branch`。在 v2.1.161 之前,`/fork` 是 `/branch` 的别名 |94| `/focus` | 切换焦点视图,仅显示你的最后一个提示、一行工具调用摘要和最终响应。工具调用摘要也计算在轮中启动的子代理数量,并将完成的后台任务通知折叠为单个计数。选择在会话中持久化;在设置中设置 [`viewMode`](/docs/zh-CN/settings-reference#viewmode) 以覆盖它。仅在[全屏渲染](/docs/zh-CN/fullscreen)中可用。[VS Code 扩展](/docs/zh-CN/vs-code#use-the-prompt-box)提供其自己的焦点视图作为命令菜单切换,存储为扩展设置,独立于 `viewMode` |

89| `/goal [condition\|clear]` | 设置一个[目标](/docs/zh-CN/goal):Claude 在多个轮次中继续工作,直到满足条件。不带参数时,显示当前或最近实现的目标。`clear`、`stop`、`off`、`reset`、`none` 或 `cancel` 会提前移除活跃目标 |95| `/fork [prompt]` | [将当前对话复制](/docs/zh-CN/agent-view#copy-the-session-with-%2Ffork)到新的后台会话并继续在这里工作。传递一个提示词,副本立即开始处理它;没有它,它在代理视图中等待其第一个提示词。除非副本[就地编辑](/docs/zh-CN/agent-view#how-file-edits-are-isolated),Claude Code 指示它在进行代码更改之前创建自己的 worktree;隔离指令需要 Claude Code v2.1.221 或更高版本。要将侧面任务交给一个子代理,其结果返回到这个对话,请使用 `/subtask`;要自己切换到副本,请使用 `/branch`。需要 Claude Code v2.1.212 或更高版本;在 v2.1.161 到 v2.1.211,以及每当[代理视图关闭](/docs/zh-CN/agent-view#turn-off-agent-view)时,`/fork` 启动一个[分叉子代理](/docs/zh-CN/sub-agents#fork-the-current-conversation) |

90| `/heapdump` | 将 JavaScript 堆快照和内存分解写入 `~/Desktop`,或在 Linux 上没有 Desktop 文件夹的情况下写入您的主目录,以诊断高内存使用情况。`.heapsnapshot` 文件包含您的完整对话和凭证,所以不要分享它。请参阅[故障排除](/docs/zh-CN/troubleshooting#high-cpu-or-memory-usage) |96| `/goal [condition\|clear]` | 设置一个[目标](/docs/zh-CN/goal):Claude 跨轮继续工作直到条件满足或目标[因另一个原因清除](/docs/zh-CN/goal#how-evaluation-works)。没有参数时,显示当前或最近实现的目标。`clear`、`stop`、`off`、`reset`、`none` 或 `cancel` 提前移除活跃目标 |

97| `/heapdump` | 写入 JavaScript 堆快照和内存细目到 `~/Desktop`,或 Linux 上没有 Desktop 文件夹的主目录,用于诊断高内存使用。报告内存问题时仅附加 `-diagnostics.json` 文件;`.heapsnapshot` 包含你的完整对话和凭证,所以不要共享它。[从命令菜单隐藏](#how-the-command-menu-matches-what-you-type);完整输入它。请参阅[如何处理输出](/docs/zh-CN/troubleshooting#high-cpu-or-memory-usage) |

91| `/help` | 显示帮助和可用命令 |98| `/help` | 显示帮助和可用命令 |

92| `/hooks` | 查看工具事件的 [hook](/docs/zh-CN/hooks) 配置 |99| `/hooks` | 查看工具事件的 [hook](/docs/zh-CN/hooks) 配置 |

93| `/ide` | 管理 IDE 集成并显示状态 |100| `/ide` | 管理 IDE 集成并显示状态 |

94| `/init` | 使用 `CLAUDE.md` 指南初始化项目。设置 `CLAUDE_CODE_NEW_INIT=1` 以获得交互式流程,该流程还会引导您完成 skills、hooks 和个人内存文件 |101| `/import [codex\|gemini\|cursor] [--dry-run] [--yes]` | 将配置从你的机器上的 OpenAI Codex、Google Gemini CLI 或 Cursor 引入 Claude Code,包括指令文件、MCP 服务器、命令、子代理和 skill。在[非交互模式](/docs/zh-CN/headless)中使用 `-p`,`/import` 列出它找到的内容并给你确认导入的命令。添加 `--dry-run` 以预览而不写入任何内容,或 `--yes` 以跳过交互式选择器。在 Amazon Bedrock、Google Cloud 的 Agent Platform、Microsoft Foundry 或 Claude Platform on AWS 上不可用,或通过 [Claude apps gateway](/docs/zh-CN/claude-apps-gateway#availability-and-limitations)。当你关闭[功能标志获取](/docs/zh-CN/env-vars#features-that-need-feature-flag-fetching)时也不可用。需要 Claude Code v2.1.213 或更高版本。从 Cursor 导入需要 v2.1.265 或更高版本 |

95| `/insights` | 生成报告,分析您的 Claude Code 会话,包括项目领域、交互模式和摩擦点 |102| `/init` | 使用 `CLAUDE.md` 指南初始化项目。设置 `CLAUDE_CODE_NEW_INIT=1` 以获得交互式流程,也会引导你完成 skill、hook 和个人内存文件。如果 `/init` 找到 OpenAI Codex 或 Google Gemini CLI 配置,它提供使用 `/import` 进行转移 |

96| `/install-github-app` | 为存储库安装 Claude GitHub App,可选步骤设置 [GitHub Actions](/docs/zh-CN/github-actions) 工作流和密钥。引导您选择存储库并配置集成 |103| `/insights` | 生成一个 HTML 报告,分析你在这台机器上的最近会话:你在哪些项目中工作、你如何使用 Claude Code、事情出错的地方以及要尝试的功能。在[云会话](/docs/zh-CN/claude-code-on-the-web)中不可用。有关报告位置、保留和成本,请参阅[分析你的使用模式](/docs/zh-CN/costs#analyze-your-usage-patterns) |

104| `/install-github-app` | 为存储库安装 Claude GitHub App,可选步骤设置 [GitHub Actions](/docs/zh-CN/github-actions) 工作流和秘密。引导你完成选择 repo 和配置集成。仅适用于 github.com 存储库。当你的存储库的 git 远程在 gitlab.com 或 bitbucket.org 上时,命令打印通知并退出而不是启动设置。要从 GitLab 管道运行 Claude Code,请参阅 [GitLab CI/CD](/docs/zh-CN/gitlab-ci-cd) |

97| `/install-slack-app` | 安装 Claude Slack 应用。打开浏览器以完成 OAuth 流程 |105| `/install-slack-app` | 安装 Claude Slack 应用。打开浏览器以完成 OAuth 流程 |

98| `/keybindings` | 打开您的[快捷键](/docs/zh-CN/keybindings)文件 |106| `/keybindings` | 打开你的[快捷键](/docs/zh-CN/keybindings)文件 |

99| `/login` | 登录到您的 Anthropic 账户 |107| `/list-agents` | 列出子代理、[代理团队](/docs/zh-CN/agent-teams)队友和其他 Claude Code 会话 Claude 可以消息,以及每个要使用的名称。请参阅[跨会话消息](/docs/zh-CN/cross-session-messaging)。也可用作 `/peers`。需要 Claude Code v2.1.224 或更高版本;早期版本报告 `Unknown command: /list-agents`。队友行和显示此会话自己名称的第一行需要 v2.1.239 或更高版本。仅在[启用跨会话消息](/docs/zh-CN/cross-session-messaging#availability)的会话中可用 |

100| `/logout` | 从您的 Anthropic 账户登出 |108| `/login` | 登录到你的 Anthropic 账户 |

101| `/loop [interval] [prompt]` | **[Skill](/docs/zh-CN/skills#bundled-skills).** 在会话保持打开状态时重复运行提示。省略间隔,Claude 会在迭代之间自动调整步速。省略提示,[在可用的地方](/docs/zh-CN/scheduled-tasks#run-the-built-in-maintenance-prompt)Claude 运行自主维护检查或运行 `.claude/loop.md` 中的提示。示例:`/loop 5m check if the deploy finished`。请参阅[按计划运行提示](/docs/zh-CN/scheduled-tasks)。别名:`/proactive` |109| `/logout` | 从你的 Anthropic 账户登出 |

102| `/mcp [reconnect <server>\|enable\|disable [<server>\|all]]` | 管理 MCP server 连接和 OAuth 身份验证。不带参数运行以打开交互式列表,传递 `reconnect <server>` 以重新连接一个断开连接的 server,或传递 `enable`/`disable` 与 server 名称或 `all` 以更改连接状态而不打开对话框。也可在非交互模式(`-p`)中使用,其中不带参数运行它会打印 server 状态的文本摘要而不是打开列表;需要 Claude Code v2.1.205 或更高版本 |110| `/loop [interval] [prompt]` | **[Skill](/docs/zh-CN/skills#bundled-skills)。** 在会话保持打开时重复运行提示词。省略间隔,Claude [自我调整迭代之间的步伐](/docs/zh-CN/scheduled-tasks#let-claude-choose-the-interval)。省略提示词,Claude 运行[内置维护提示词](/docs/zh-CN/scheduled-tasks#run-the-built-in-maintenance-prompt)或你的 [`loop.md`](/docs/zh-CN/scheduled-tasks#customize-the-default-prompt-with-loop-md)。示例:`/loop 5m check if the deploy finished`。请参阅[按计划运行提示词](/docs/zh-CN/scheduled-tasks)。别名:`/proactive` |

103| `/memory` | 编辑 `CLAUDE.md` 内存文件,启用或禁用 [auto-memory](/docs/zh-CN/memory#auto-memory),并查看自动内存条目 |111| `/mcp [reconnect <server>\|enable\|disable [<server>\|all]]` | 管理 MCP 服务器连接和 OAuth 身份验证。运行不带参数以打开交互式列表,传递 `reconnect <server>` 以重新连接一个断开连接的服务器,或传递 `enable`/`disable` 带有服务器名称或 `all` 以更改连接状态而不打开对话框。也可在非交互模式 (`-p`) 中使用,其中运行不带参数会打印服务器状态的文本摘要而不是打开列表;需要 Claude Code v2.1.205 或更高版本 |

104| `/mobile` | 显示二维码以下载 Claude 移动应用。别名:`/ios`、`/android` |112| `/memory` | 编辑 `CLAUDE.md` 文件,启用或禁用[自动内存](/docs/zh-CN/memory#auto-memory),并查看自动内存条目 |

105| `/model [model]` | 切换 AI 模型并将其保存为新会话的默认值。对于支持的模型,使用左/右箭头[调整工作量级别](/docs/zh-CN/model-config#adjust-effort-level)。不带参数时,打开选择器;在一行上按 `s` 以仅为当前会话切换。当对话有先前输出时,选择器要求确认,因为下一个响应会重新读取完整历史记录而不使用缓存的上下文。确认后,更改立即生效,无需等待当前响应完成。也可在非交互模式(`-p`)中使用模型参数而不是选择器,其中它仅适用于当前会话且不保存为您的默认值;需要 Claude Code v2.1.205 或更高版本 |113| `/mobile` | 显示 QR 代码以下载 Claude 移动应用。别名:`/ios`、`/android` |

106| `/passes` | 与朋友分享一周免费的 Claude Code。仅在您的账户符合条件时可见 |114| `/model [model]` | 切换 AI 模型并将其保存为新会话的默认值。对于支持它的模型,使用左/右箭头来[调整工作量级别](/docs/zh-CN/model-config#adjust-effort-level)。没有参数时,打开选择器;在行上按 `s` 仅为当前会话切换。请参阅[当 Claude Code 要求你确认切换时](/docs/zh-CN/prompt-caching#switching-models)。一旦你确认切换,如果 Claude Code 要求,Claude Code 会应用更改而不等待当前响应完成。在 v2.1.242 之前,Claude Code 从它从 Anthropic 获取的功能标志决定是在轮中期运行命令还是将其排队直到轮次完成,并始终在不[获取功能标志](/docs/zh-CN/env-vars#features-that-need-feature-flag-fetching)的会话中排队它,例如在[第三方提供商](/docs/zh-CN/third-party-integrations)上。也可在非交互模式 (`-p`) 中使用模型参数而不是选择器,其中它仅应用于当前会话并不保存为你的默认值;需要 Claude Code v2.1.205 或更高版本 |

107| `/permissions` | 管理工具权限的允许、询问和拒绝规则。打开交互式对话框,您可以按范围查看规则、添加或删除规则、管理工作目录,以及查看[最近的自动模式拒绝](/docs/zh-CN/auto-mode-config#review-denials)。别名:`/allowed-tools` |115| `/passes` | 与朋友分享 Claude Code 的免费一周。仅在你的账户符合条件时可见 |

108| `/plan [description]` | 直接从提示进入 Plan Mode。传递可选描述以进入 Plan Mode 并立即开始该任务,例如 `/plan fix the auth bug` |116| `/permissions` | 管理工具权限的允许、询问和拒绝规则。打开一个交互式对话框,你可以按范围查看规则、添加或移除规则、管理工作目录,以及审查[最近的自动模式拒绝](/docs/zh-CN/auto-mode-config#review-denials)。你也可以从对话框的**自动模式**选项卡查看和编辑[自动模式分类器规则](/docs/zh-CN/auto-mode-config#edit-rules-from-permissions)。当你在 Claude 响应时运行它时,Claude Code 立即打开对话框并从 Claude 在同一轮中的下一个工具调用开始应用你的更改。在 v2.1.234 之前,Claude Code 会将命令排队直到轮次完成。别名:`/allowed-tools` |

109| `/plugin [subcommand]` | 管理 Claude Code [plugins](/docs/zh-CN/plugins)。不带参数运行以打开 plugin 菜单,或传递子命令如 `list`、`install`、`enable` 或 `disable` 以直接执行 |117| `/plan [description]` | 直接从提示词进入计划模式。传递可选描述以进入计划模式并立即开始该任务,例如 `/plan fix the auth bug` |

118| `/plugin [subcommand]` | 管理 Claude Code [plugins](/docs/zh-CN/plugins)。运行不带参数以打开插件菜单,或传递子命令如 `list`、`install`、`enable` 或 `disable` 以直接操作。Claude Code 可以在安装期间激活插件;[安装摘要](/docs/zh-CN/discover-plugins#install-plugins)告诉你它是否做了或是否运行 `/reload-plugins` |

110| `/powerup` | 通过带有动画演示的快速交互式课程发现 Claude Code 功能 |119| `/powerup` | 通过带有动画演示的快速交互式课程发现 Claude Code 功能 |

111| `/pr-comments [PR]` | 在 v2.1.91 中移除。改为直接询问 Claude 以查看 pull request 评论。在早期版本中,从 GitHub pull request 获取并显示评论;自动检测当前分支的 PR,或传递 PR URL 或编号。需要 `gh` CLI |120| `/pr-comments [PR]` | 在 v2.1.91 中移除。直接要求 Claude 查看拉取请求评论。在早期版本上,从 GitHub 拉取请求获取和显示评论;自动检测当前分支的 PR,或传递 PR URL 或号码。需要 `gh` CLI |

112| `/privacy-settings` | 查看和更新您的隐私设置。仅对 Pro 和 Max 计划订阅者可用 |121| `/privacy-settings` | 查看和更新你的隐私设置。仅对 Pro 和 Max 计划订阅者可用 |

113| `/radio` | 在浏览器中打开 Claude FM lo-fi 电台。当浏览器不可用时打印流 URL。在 Amazon Bedrock、Google Cloud 的 Agent Platform、Microsoft Foundry 或 Claude Platform on AWS 上不可用 |122| `/radio` | 在浏览器中打开 Claude FM lo-fi 电台。当没有浏览器可用时打印流 URL |

114| `/recap` | 按需生成当前会话的单行摘要。请参阅[会话摘要](/docs/zh-CN/interactive-mode#session-recap)以了解您离开后出现的自动摘要 |123| `/rate-limit-options` | 显示在 claude.ai 使用限制阻止请求时继续工作的方法:等待并[在限制重置时自动继续](/docs/zh-CN/interactive-mode#wait-for-a-usage-limit-to-reset)、添加[使用额度](/docs/zh-CN/costs#add-usage-credits-to-your-subscription)或升级你的计划。Claude Code 也可以在你在自己的终端上达到限制时自己打开此菜单。请参阅[关闭自动继续](/docs/zh-CN/interactive-mode#turn-automatic-continue-off)。需要 claude.ai 订阅。不出现在命令菜单中;完整输入它。等待和继续行需要 Claude Code v2.1.234 或更高版本 |

115| `/release-notes` | 在交互式版本选择器中查看更改日志。选择特定版本以查看其发布说明,或选择显示所有版本。这些说明出现在您的记录中,而不进入 Claude 看到的对话。在 v2.1.208 之前,查看的说明进入对话,包括显示所有版本时的整个更改日志 |124| `/recap` | 按需生成当前会话的一行摘要。请参阅[会话摘要](/docs/zh-CN/interactive-mode#session-recap)以获得你离开后出现的自动摘要 |

116| `/reload-plugins [--force]` | 重新加载所有活跃 [plugins](/docs/zh-CN/plugins) 以应用待处理的更改而无需重启。报告每个已重新加载组件的计数并标记任何加载错误。当重新加载会改变加载哪些 MCP 工具并使提示缓存失效时,该命令会警告并跳过,除非您传递 `--force` |125| `/release-notes` | 在交互式版本选择器中查看更改日志。选择特定版本以查看其发布说明,或选择显示所有版本。说明出现在你的记录中而不进入 Claude 看到的对话 |

117| `/reload-skills` | 重新扫描 [skill](/docs/zh-CN/skills) 和命令目录,以便在会话期间添加或更改的 skills 在磁盘上变得可用,无需重启。报告有多少 skills 可用以及添加或删除了多少 |126| `/reload-plugins [--force]` | 重新加载所有活跃[插件](/docs/zh-CN/plugins)以应用待处理更改而不重新启动。报告每个重新加载组件的计数并标记任何加载错误。当重新加载会改变加载哪些 MCP 工具并使提示词缓存失效时,命令警告并跳过,除非你传递 `--force`。也可在非交互模式 (`-p`)、Agent SDK 和桌面应用中使用,其中它仅在直接输入到会话的输入上运行,不应用插件 MCP 服务器更改;需要 Claude Code v2.1.260 或更高版本。请参阅[应用插件更改而不重新启动](/docs/zh-CN/discover-plugins#apply-plugin-changes-without-restarting) |

118| `/remote-control` | 使此会话可从 claude.ai 进行[远程控制](/docs/zh-CN/remote-control)。在未登录时运行它会打印远程控制需要 claude.ai 订阅并告诉您如何登录;在 v2.1.206 之前它报告 `Unknown command: /remote-control`。别名:`/rc` |127| `/reload-skills` | 重新扫描 [skill](/docs/zh-CN/skills) 和命令目录,以便在会话期间添加或更改的 skill 在磁盘上变得可用而不重新启动。报告有多少 skill 可用以及添加或移除了多少 |

119| `/remote-env` | 为[云 agents](/docs/zh-CN/claude-code-on-the-web#configure-your-environment) 选择默认环境 |128| `/remote-control` | 使此会话可从 claude.ai 进行 [Remote Control](/docs/zh-CN/remote-control)。在未登录时运行它会打印 Remote Control 需要 claude.ai 订阅并告诉你如何登录;在 v2.1.206 之前它报告 `Unknown command: /remote-control`。别名:`/rc` |

120| `/rename [name]` | 重命名当前会话并在提示栏上显示名称。不使用名称时,从对话历史记录自动生成一个。也可在非交互模式(`-p`)中使用;需要 Claude Code v2.1.205 或更高版本 |129| `/remote-env` | 为[云代理](/docs/zh-CN/cloud-environments#select-an-environment-from-the-cli)选择默认环境 |

121| `/resume [session]` | 按 ID 或名称恢复对话,或打开会话选择器。从 v2.1.144 起,[后台会话](/docs/zh-CN/agent-view)在选择器中显示,标记为 `bg`;仍在运行的会话无法在此处恢复,因此从 `claude agents` 附加到它或先在那里停止它。别名:`/continue` |130| `/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) |

122| `/review [PR]` | 按编号运行 GitHub pull request 的快速单遍、只读审阅。不带参数时,列出要选择的开放 PR;PR 编号后的文本成为额外的审阅说明。从 v2.1.186 到 v2.1.201,`/review` 改为运行与 `/code-review medium` 相同的多 agent 引擎。对于选定工作量级别的多 agent 审阅,使用 [`/code-review <level> <pr#>`](/docs/zh-CN/code-review#review-a-diff-locally);对于基于云的审阅,请参阅 [`/code-review ultra`](/docs/zh-CN/ultrareview) |131| `/resume [session]` | 按 ID 或名称恢复对话,或打开会话选择器。[后台会话](/docs/zh-CN/agent-view)在选择器中标记为 `bg` 出现;仍在运行的会话无法在此处恢复,所以从 `claude agents` 附加到它或先在那里停止它。别名:`/continue` |

123| `/rewind` | 将对话和/或代码倒回到上一个点,或从选定的消息进行总结。请参阅 [checkpointing](/docs/zh-CN/checkpointing)。别名:`/checkpoint`、`/undo` |132| `/review [low\|medium\|high\|xhigh\|max\|ultra] [--fix] [--comment] [pr#\|branch\|path]` | [`/code-review`](/docs/zh-CN/code-review#review-a-diff-locally) 的别名:审查当前差异,或你传递的 PR 号、分支或路径,例如 `/review 1234`,并采用相同的工作量级别和标志。没有给定级别时,审查重用你输入的最后一个 `low` 到 `max` 级别;有关确切规则,请参阅[本地审查差异](/docs/zh-CN/code-review#review-a-diff-locally)。对于深度云审查,使用 [`/code-review ultra`](/docs/zh-CN/ultrareview)。在 v2.1.223 之前,`/review` 是一个单独的命令,运行 GitHub 拉取请求号的单遍、只读审查,在运行不带参数时列出打开的 PR 以选择;从 v2.1.186 到 v2.1.201,它运行与 `/code-review medium` 相同的多代理引擎 |

124| `/run` | **[Skill](/docs/zh-CN/skills#bundled-skills).** 启动并驱动您的项目应用以在运行的应用中看到更改工作,而不仅仅是在测试中。请参阅[运行和验证您的应用](/docs/zh-CN/skills#run-and-verify-your-app)。需要 Claude Code v2.1.145 或更高版本 |133| `/rewind` | 倒带对话和/或代码到上一个点,或从选定的消息总结。请参阅[检查点](/docs/zh-CN/checkpointing)。别名:`/checkpoint`、`/undo` |

125| `/run-skill-generator` | **[Skill](/docs/zh-CN/skills#bundled-skills).** 通过从干净环境编写每个项目的 [skill](/docs/zh-CN/skills#run-and-verify-your-app),教 `/run` 和 `/verify` 如何构建、启动和驱动您的项目应用。需要 Claude Code v2.1.145 或更高版本 |134| `/run` | **[Skill](/docs/zh-CN/skills#bundled-skills)。** 启动并驱动你的项目应用以查看更改工作,而不仅仅是通过测试。请参阅[运行和验证你的应用](/docs/zh-CN/skills#run-and-verify-your-app) |

126| `/sandbox` | 切换 [sandbox mode](/docs/zh-CN/sandboxing)。仅在支持的平台上可用 |135| `/run-skill-generator` | **[Skill](/docs/zh-CN/skills#bundled-skills)。** 通过从干净环境编写每个项目的 [skill](/docs/zh-CN/skills#run-and-verify-your-app) 来教 `/run` 和 `/verify` 如何构建、启动和驱动你的项目应用 |

127| `/schedule [description]` | 创建、更新、列出或运行 [routines](/docs/zh-CN/routines),这些 routines 在 Anthropic 管理的云基础设施上执行。Claude 会以对话方式引导您完成设置。别名:`/routines` |136| `/sandbox` | 切换[沙箱模式](/docs/zh-CN/sandboxing)。仅在支持的平台上可用 |

128| `/scroll-speed` | 交互式调整鼠标滚轮[滚动速度](/docs/zh-CN/fullscreen#mouse-wheel-scrolling),使用标尺,您可以在对话框打开时滚动以预览更改。仅在[全屏渲染](/docs/zh-CN/fullscreen)中可用,在 JetBrains IDE 终端中不可用 |137| `/schedule [description]` | 创建、更新、列出或运行在云中执行的[例程](/docs/zh-CN/routines)。Claude 以对话方式引导你完成设置。你也可以询问[例程的最近运行](/docs/zh-CN/routines#manage-routines-from-the-cli)。别名:`/routines` |

129| `/security-review` | 分析当前分支上的待处理更改以查找安全漏洞。审查 git 差异并识别注入、身份验证问题和数据泄露等风险 |138| `/scroll-speed` | 交互式调整鼠标滚轮[滚动速度](/docs/zh-CN/fullscreen#mouse-wheel-scrolling),带有一个标尺,你可以在对话框打开时滚动以预览更改。仅在[全屏渲染](/docs/zh-CN/fullscreen)中可用,在 JetBrains IDE 终端中不可用 |

130| `/setup-bedrock` | 通过交互式向导配置 [Amazon Bedrock](/docs/zh-CN/amazon-bedrock) 身份验证、区域和模型固定。仅在设置 `CLAUDE_CODE_USE_BEDROCK=1` 时可见。首次 Amazon Bedrock 用户也可以从登录屏幕访问此向导 |139| `/security-review` | 分析当前分支上的更改以查找安全漏洞。审查你的分支和 origin 默认分支之间的差异,识别注入、身份验证问题和数据暴露等风险。需要 `origin` 远程;如果审查失败并出现 `ambiguous argument` 错误,请参阅[错误参考](/docs/zh-CN/errors#security-review-fails-without-origin-head) |

131| `/setup-vertex` | 通过交互式向导配置 [Google Cloud 的 Agent Platform](/docs/zh-CN/google-vertex-ai) 身份验证、项目、区域和模型固定。仅在设置 `CLAUDE_CODE_USE_VERTEX=1` 时可见。首次 Google Cloud 的 Agent Platform 用户也可以从登录屏幕访问此向导 |140| `/setup-bedrock` | 通过交互式向导配置 [Amazon Bedrock](/docs/zh-CN/amazon-bedrock) 身份验证、区域和模型引脚。[从命令菜单隐藏](#how-the-command-menu-matches-what-you-type)直到设置 `CLAUDE_CODE_USE_BEDROCK=1`;完整输入它。首次 Amazon Bedrock 用户也可以从登录屏幕访问此向导 |

132| `/simplify [target]` | **[Skill](/docs/zh-CN/skills#bundled-skills).** 审阅更改的代码以查找清理机会并应用修复。四个审阅 [agents](/docs/zh-CN/sub-agents) 并行运行,涵盖现有帮助程序的重用、简化、效率和更改是否处于正确的抽象级别。从 v2.1.154 开始,审阅不寻找正确性错误。使用 `/code-review` 查找错误。在早期版本中,`/simplify` 等同于 `/code-review --fix`。传递路径或 PR 参考以审阅特定目标 |141| `/setup-vertex` | 通过交互式向导配置 [Google Cloud 的 Agent Platform](/docs/zh-CN/google-vertex-ai) 身份验证、项目、区域和模型引脚。[从命令菜单隐藏](#how-the-command-menu-matches-what-you-type)直到设置 `CLAUDE_CODE_USE_VERTEX=1`;完整输入它。首次 Google Cloud 的 Agent Platform 用户也可以从登录屏幕访问此向导 |

133| `/skills` | 列出可用的 [skills](/docs/zh-CN/skills)。从 v2.1.121 开始,输入以按名称过滤列表。按 `t` 按令牌计数排序。按 `Space` 以[从 Claude 或 `/` 菜单中隐藏 skill](/docs/zh-CN/skills#override-skill-visibility-from-settings),然后按 `Enter` 保存 |142| `/simplify [target]` | **[Skill](/docs/zh-CN/skills#bundled-skills)。** 审查更改的代码以查找清理机会并应用修复。四个审查[代理](/docs/zh-CN/sub-agents)并行运行,涵盖现有帮助程序的重用、简化、效率以及更改是否处于正确的抽象级别。审查不查找正确性错误。使用 `/code-review` 查找错误。传递路径或 PR 参考以审查特定目标 |

134| `/stats` | `/usage` 的别名。在统计选项卡上打开 |143| `/skill-doctor` | 显示你的每个 [skill](/docs/zh-CN/skills) 在上下文中的成本以及它被使用的频率,以便你可以[找到要关闭的 skill](/docs/zh-CN/skills#find-unused-skills)。需要 Claude Code v2.1.252 或更高版本和[功能标志获取](/docs/zh-CN/env-vars#features-that-need-feature-flag-fetching) |

135| `/status` | 打开设置界面(状态选项卡),显示版本、模型、账户和连接性。在 Claude 响应时工作 |144| `/skills` | 列出可用的 [skill](/docs/zh-CN/skills)。输入以按名称、描述或来源过滤列表。按 `t` 按令牌计数排序,`Space` 或 `Enter` 以[循环 skill 对 Claude 和 `/` 菜单的可见性](/docs/zh-CN/skills#override-skill-visibility-from-settings),`Esc` 保存并关闭。你无法循环插件 skill、frontmatter 设置 `disable-model-invocation: true` 的 skill 或在托管设置或 `--settings` 标志中有 `skillOverrides` 条目的 skill |

136| `/statusline` | 配置 Claude Code 的[状态行](/docs/zh-CN/statusline)。描述您想要的内容,或不带参数运行以从您的 shell 提示自动配置 |145| `/stats` | `/usage` 的别名。在 Stats 选项卡上打开 |

146| `/status` | 在 Status 选项卡上打开设置界面,显示版本、模型、账户和连接性。一个 `Session kind` 行在[后台会话](/docs/zh-CN/agent-view)中读取 `background job · attached` 或 `background job · unattended`,取决于是否附加了终端,在任何其他会话中读取 `interactive`。在 v2.1.221 之前,`/status` 没有显示此行。在 Claude 响应时工作 |

147| `/statusline` | 配置 Claude Code 的[状态行](/docs/zh-CN/statusline)。描述你想要的内容,或运行不带参数以从你的 shell 提示符自动配置 |

137| `/stickers` | 订购 Claude Code 贴纸 |148| `/stickers` | 订购 Claude Code 贴纸 |

138| `/stop` | 停止当前[后台会话](/docs/zh-CN/agent-view)。仅在附加到后台会话时可用;记录和任何 worktree 都会保留。要分离而不停止,请使用 `/exit` 或按 `←` |149| `/stop` | 停止当前[后台会话](/docs/zh-CN/agent-view)。仅在附加到后台会话时可用;记录和任何 worktree 都被保留。要分离而不停止,请使用 `/exit` 或按 `←` |

139| `/tasks` | 查看和管理后台工作中的所有内容,包括已完成的 subagents。也可用作 `/bashes` |150| `/subtask <task>` | 生成一个[分叉子代理](/docs/zh-CN/sub-agents#fork-the-current-conversation):一个继承完整对话的后台子代理,在你继续工作时处理任务。其结果在完成时返回到这个对话。要将对话复制到单独的后台会话,请改用 `/fork`。需要 Claude Code v2.1.212 或更高版本;在 v2.1.161 到 v2.1.211,这个命令是 `/fork`。当[代理视图关闭](/docs/zh-CN/agent-view#turn-off-agent-view)时,`/subtask` 不可用,`/fork` 保持分叉子代理行为 |

140| `/team-onboarding` | 从您的 Claude Code 使用历史记录生成团队入职指南。Claude 分析您过去 30 天的会话、命令和 MCP server 使用情况,并生成一个 markdown 指南,团队成员可以粘贴为第一条消息以快速设置。对于 Pro、Max、Team 和 Enterprise 计划上的 claude.ai 订阅者,还返回一个共享链接,团队成员可以直接在 Claude Code 中打开 |151| `/tasks` | 查看和管理当前会话中的后台工作,包括已完成的子代理。也可用作 `/bashes` |

141| `/teleport` | 将[网络版 Claude Code](/docs/zh-CN/claude-code-on-the-web#from-web-to-terminal) 会话拉入此终端:打开选择器,然后获取分支和对话。也可用作 `/tp`。需要 claude.ai 订阅 |152| `/team-onboarding` | 从你的 Claude Code 使用历史生成团队入职指南。Claude 分析你过去 30 天的会话、命令和 MCP 服务器使用情况,并生成一个 markdown 指南,队友可以粘贴为第一条消息以快速设置。对于 Pro、Max、Team 和 Enterprise 计划上的 claude.ai 订阅者,也返回一个共享链接,队友可以直接在 Claude Code 中打开 |

142| `/terminal-setup` | 为 Shift+Enter 和其他快捷键配置终端快捷键。仅在需要它的终端中可见,如 VS Code、Cursor、Devin Desktop、Alacritty 或 Zed |153| `/teleport` | 将 [Claude Code on the web](/docs/zh-CN/claude-code-on-the-web#from-web-to-terminal) 会话拉入此终端。打开选择器,然后获取分支和对话。也可用作 `/tp`。需要 claude.ai 订阅 |

143| `/theme` | 更改颜色主题。包括跟随您终端深色或浅色背景的 `auto` 选项、浅色和深色变体、色盲友好(道尔顿化)主题、使用您终端颜色调色板的 ANSI 主题,以及来自 `~/.claude/themes/` 或 plugins 的任何[自定义主题](/docs/zh-CN/terminal-config#create-a-custom-theme)。选择\*\*新建自定义主题…\*\*以创建一个 |154| `/terminal-setup` | [在 VS Code、Cursor、Devin Desktop、Alacritty 或 Zed 中安装 Shift+Enter 快捷键以输入多行](/docs/zh-CN/terminal-config#enter-multiline-prompts)。在 Apple Terminal 中,[改为启用 Option+Enter 以输入多行并关闭可听铃声](/docs/zh-CN/terminal-config#enable-option-key-shortcuts-on-macos)。在 iTerm2 中,[打开剪贴板访问以便 `/copy` 工作](/docs/zh-CN/terminal-config#enable-option-key-shortcuts-on-macos) |

144| `/tui [default\|fullscreen]` | 设置终端 UI 渲染器并使用您的对话完整性重新启动到它。`fullscreen` 启用[无闪烁 alt-screen 渲染器](/docs/zh-CN/fullscreen)。不带参数时,打印活跃渲染器 |155| `/theme` | 更改颜色主题。包括与你的终端的浅色或深色背景匹配的 `auto` 选项、浅色和深色变体、色盲无障碍(daltonized)主题、使用你的终端颜色调色板的 ANSI 主题,以及来自 `~/.claude/themes/` 或插件的任何[自定义主题](/docs/zh-CN/terminal-config#create-a-custom-theme)。选择\*\*新建自定义主题…\*\*以创建一个 |

145| `/ultraplan <prompt>` | 在 [ultraplan](/docs/zh-CN/ultraplan) 会话中起草计划,在浏览器中审阅,然后远程执行或将其发送回您的终端 |156| `/tui [default\|fullscreen]` | 设置终端 UI 渲染器并使用你的对话完整地重新启动到它。`fullscreen` 启用[无闪烁 alt-screen 渲染器](/docs/zh-CN/fullscreen)。没有参数时,打印活跃渲染器 |

146| `/ultrareview [PR]` | 在云沙箱中运行深度、多 agent 代码审阅,使用 [ultrareview](/docs/zh-CN/ultrareview)。首选调用现在是 `/code-review ultra`,`/ultrareview` 仍然作为别名保留。Pro 和 Max 包括 3 次免费运行,然后需要[使用额度](https://support.claude.com/en/articles/12429409-extra-usage-for-paid-claude-plans) |157| `/ultraplan <prompt>` | 已移除。改用[计划模式](/docs/zh-CN/permission-modes#analyze-before-you-edit-with-plan-mode)。以前将规划任务发送到 [Claude Code on the web](/docs/zh-CN/claude-code-on-the-web) 会话以在你的浏览器中审查 |

147| `/upgrade` | 打开升级页面在您的浏览器中以切换到更高的计划层级。当浏览器无法打开时,该命令显示登录提示而不打印 URL |158| `/ultrareview [PR or branch]` | 在云沙箱中运行深度、多代理代码审查,使用 [ultrareview](/docs/zh-CN/ultrareview)。传递 PR 参考以审查该拉取请求,或分支名称以更改比较基础。首选调用现在是 `/code-review ultra`,`/ultrareview` 保留为别名。在 Pro 和 Max 上包括 3 次免费运行,然后需要[使用额度](https://support.claude.com/en/articles/12429409-extra-usage-for-paid-claude-plans) |

148| `/usage` | 显示会话成本、计划使用限制和活动统计。在 Pro、Max、Team 或 Enterprise 计划上,包括按 skill、subagent、plugin 和 MCP server 的使用情况分解。有关详细信息,请参阅[成本跟踪指南](/docs/zh-CN/costs#using-the-%2Fusage-command)。`/cost` 和 `/stats` 是别名 |159| `/upgrade` | 在浏览器中打开升级页面以切换到更高的计划层级。当浏览器无法打开时,命令显示登录提示而不打印 URL |

149| `/usage-credits` | 配置使用额度以在达到限制时继续工作。在 Pro 和 Max 计划上,打开[CLI 内对话框](/docs/zh-CN/costs#set-a-spend-limit-on-pro-and-max)以购买使用额度、设置每月支出限制和配置自动重新加载;在 Claude Code v2.1.207 之前的版本和其他计划上,打开使用额度计费页面在您的浏览器中,除了 Team 和 Enterprise 成员没有计费访问权限的情况下,改为从 CLI 向其管理员发送使用额度请求。当没有浏览器可以打开计费页面时,例如通过 SSH,该命令改为打印要访问的 URL;这需要 Claude Code v2.1.205 或更高版本,早期版本在这种情况下没有显示任何内容。之前为 `/extra-usage` |160| `/usage` | 显示会话成本、计划使用限制和活动统计。在 Pro、Max、Team 或 Enterprise 计划上,包括[计入你的计划限制的内容的细目](/docs/zh-CN/costs#plan-usage-breakdown)。`/cost` 和 `/stats` 是别名 |

150| `/verify` | **[Skill](/docs/zh-CN/skills#bundled-skills).** 通过构建您的项目应用、运行它并观察结果来确认代码更改是否按预期工作,而不是依赖测试或类型检查。请参阅[运行和验证您的应用](/docs/zh-CN/skills#run-and-verify-your-app)。需要 Claude Code v2.1.145 或更高版本 |161| `/usage-credits` | 配置使用额度,或在达到限制时从你的管理员请求它们。在浏览器中打开你的[使用额度计费设置](/docs/zh-CN/costs#add-usage-credits-to-your-subscription),除了没有计费访问权限的 Team 和 Enterprise 成员改为从 CLI 向其管理员发送使用额度请求,在对话框中确认请求通知其管理员后。当没有浏览器可以打开计费页面时,例如通过 SSH,命令改为打印 URL 以访问;这需要 Claude Code v2.1.205 或更高版本,早期版本在这种情况下没有显示任何内容。以前 `/extra-usage` |

151| `/vim` | 在 v2.1.92 中移除。要在 Vim 和普通编辑模式之间切换,请使用 `/config` → 编辑器模式 |162| `/verify` | **[Skill](/docs/zh-CN/skills#bundled-skills)。** 通过构建你的项目应用、运行它并观察结果来确认代码更改做了它应该做的事,而不是依赖测试或类型检查。请参阅[运行和验证你的应用](/docs/zh-CN/skills#run-and-verify-your-app) |

163| `/vim` | 在 v2.1.92 中移除。要在 Vim 和 Normal 编辑模式之间切换,请使用 `/config` → 编辑器模式 |

152| `/voice [hold\|tap\|off]` | 切换[语音听写](/docs/zh-CN/voice-dictation),或在特定模式下启用它。需要 Claude.ai 账户 |164| `/voice [hold\|tap\|off]` | 切换[语音听写](/docs/zh-CN/voice-dictation),或在特定模式下启用它。需要 Claude.ai 账户 |

153| `/web-setup` | 使用您的本地 `gh` CLI 凭证将您的 GitHub 账户连接到[网络版 Claude Code](/docs/zh-CN/web-quickstart#connect-from-your-terminal)。如果 GitHub 未连接,`/schedule` 会自动提示此操作 |165| `/web-setup` | 使用你的本地 `gh` CLI 凭证将你的 GitHub 账户连接到 [Claude Code on the web](/docs/zh-CN/web-quickstart#connect-from-your-terminal) |

154| `/workflows` | 打开[工作流](/docs/zh-CN/workflows#watch-the-run)进度视图以监视、暂停、恢复或保存运行中和已完成的工作流 |166| `/workflow-authoring` | **[Skill](/docs/zh-CN/skills#bundled-skills)。** 加载编写[动态 workflow](/docs/zh-CN/workflows) 脚本的参考:脚本 API、恢复行为、质量模式和工作示例。Claude 通常在编写脚本之前自己加载它;在[手动编辑保存的脚本](/docs/zh-CN/workflows#edit-a-saved-script)之前自己运行它。在启用动态 workflow 时可用,需要 Claude Code v2.1.248 或更高版本 |

167| `/workflows` | 打开 [workflow](/docs/zh-CN/workflows#watch-the-run) 进度视图以监视、暂停、恢复或保存运行和已完成的 workflow |

168 

169<h2 id="how-the-command-menu-matches-what-you-type">

170 命令菜单如何匹配你输入的内容

171</h2>

172 

173Claude Code 在你输入时过滤 `/` 菜单。下面的每个要点涵盖了你在过滤时可能注意到的一件事:

174 

175* **高亮显示**:Claude Code 仅当 `/` 后面的字母与命令的名称或别名匹配时才高亮显示顶部建议,匹配可以从名称的开头或名称内的某个单词开始,忽略 `:`、`_` 和 `-` 分隔符。输入 `/adddir` 会高亮显示 `/add-dir`,输入 `/new` 会通过其别名高亮显示 `/clear`。按 `Enter` 运行高亮显示的建议。这些高亮显示规则需要 Claude Code v2.1.236 或更高版本。

176* **打字错误后**:Claude Code 不高亮显示任何内容。接近的匹配项保持列出,你可以用 `Tab` 或箭头键选择一个,但 `Enter` 会按原样提交你的文本并报告[未知命令](/docs/zh-CN/errors#unknown-command)。

177* **你无法使用的命令**:Claude Code 将它们排除在菜单之外。当没有任何内容匹配时,Claude Code 显示 `No commands match "/name"`。大多数不可用的命令在你提交时会返回[未知命令](/docs/zh-CN/errors#unknown-command);少数几个,例如[`/schedule` 在 Console API 密钥上](/docs/zh-CN/routines#schedule-returns-unknown-command),会改为返回自己的可用性消息。当你的组织的策略禁用某些命令时,这些命令也会返回自己的消息。

178* **隐藏命令**:Claude Code 故意将一些可用命令(例如 `/heapdump`)排除在菜单之外。部分名称永远不会将隐藏命令带入菜单:如果部分匹配不到任何可见内容,Claude Code 会显示相同的不匹配消息。Claude Code 仅在你输入完整名称后才列出该命令,提交完整名称会运行它。

155 179 

156<h2 id="mcp-prompts">180<h2 id="mcp-prompts">

157 MCP prompts181 MCP prompts

158</h2>182</h2>

159 183 

160MCP servers 可以公开显示为命令的 prompts。这些使用格式 `/mcp__<server>__<prompt>`,并从连接的服务器动态发现。有关详细信息,请参阅 [MCP prompts](/docs/zh-CN/mcp#use-mcp-prompts-as-commands)。184MCP 服务器可以公开显示为命令的提示。有关详细信息,请参阅 [MCP prompts](/docs/zh-CN/mcp#use-mcp-prompts-as-commands)。

161 185 

162<h2 id="see-also">186<h2 id="see-also">

163 另请参阅187 另请参阅

Details

49 进程监视器中的辅助进程名称49 进程监视器中的辅助进程名称

50</h3>50</h3>

51 51 

52配置了启动器后,`ps` 和 Activity Monitor 显示后台辅助进程的版本化二进制名称,而不是 Claude Code 的 `claude bg-pty-host` 和 `claude bg-spare` 标签,因为启动器的 `exec` 重建了参数列表。重命名是副作用,不是隐瞒:进程在其他方面保持不变,Claude Code 通过二进制路径识别自己的进程,从不通过显示名称。52配置了启动器后,`ps` 和 Activity Monitor 不再显示后台辅助进程的 Claude Code 的 `claude bg-pty-host` 和 `claude bg-spare` 标签,因为启动器的 `exec` 重建了参数列表。丢失标签是副作用,而不是隐瞒:进程在其他方面保持不变,Claude Code 通过二进制路径识别自己的进程,从不通过显示名称。

53 53 

54<h2 id="set-up-the-launcher">54<h2 id="set-up-the-launcher">

55 设置启动器55 设置启动器

cross-session-messaging.md +405 −0 created

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# 消息传递到您的其他 Claude Code 会话

6 

7> 让 Claude 列出并消息传递到您在此机器上的其他 Claude Code 会话,并到达您在其他机器或网络上的会话。

8 

9<Note>

10 跨会话消息传递需要 macOS 和 Linux 上的 Claude Code v2.1.224 或更高版本,包括 WSL 2 内的 Linux。在原生 Windows 上,它需要 Claude Code v2.1.234 或更高版本。当会话满足要求时,消息传递功能默认启用,无需任何配置。请参阅[可用性](#availability)了解提供商要求以及如何确认会话具有此功能。

11</Note>

12 

13跨会话消息传递让 Claude 能够将消息从您的一个 Claude Code 会话传递到另一个。当一个会话中的更改破坏了另一个会话正在构建的内容时,Claude 可以在您注意到之前警告该会话。当一个会话解决了另一个会话被阻止的问题时,Claude 可以跨会话发送答案。

14 

15消息是一个 Claude 写给另一个 Claude 的文本片段,永远不包括发送者的对话历史或文件。要移动整个对话或其上下文,请[恢复会话](/docs/zh-CN/sessions#resume-a-session)。

16 

17Claude 为此使用两个工具:`ListAgents` 用于发现它可以到达的代理,`SendMessage` 用于按名称将消息传递给其中一个。使用相同的 `SendMessage` 工具,Claude 也可以在单个会话或团队内消息传递到[子代理](/docs/zh-CN/sub-agents#resume-subagents)和[代理团队](/docs/zh-CN/agent-teams)队友。本页涵盖您独立会话之间的消息。

18 

19<h2 id="when-to-use-cross-session-messaging">

20 何时使用跨会话消息传递

21</h2>

22 

23当您的一个会话有另一个会话在任务中期需要的内容时,使用消息传递。Claude 可以在看到需要时自动发送消息,例如在进行影响另一个会话正在进行的工作的更改后,或者您可以要求它发送一条。常见情况包括:

24 

25* **移交发现**:当一个会话发现破坏性更改或做出决定时,Claude 为处理受影响区域的会话总结它,而不是您在那里重新解释。

26* **协调并行 worktrees**:当会话在单独的 [worktrees](/docs/zh-CN/worktrees) 中处理同一存储库时,Claude 可以告诉其他会话已合并的内容。

27* **获取长期运行工作的状态**:让迁移或测试运行报告回您正在观看的会话,或从那里自己询问。如果该会话在此机器上,Claude 还可以[在它下次空闲或退出时要求一条通知](#get-a-notice-when-another-session-goes-idle)。

28* **跨机器发送消息**:到达您在另一台机器或网络上的一个会话。

29 

30在您自己启动和指导的独立会话之间使用消息传递。Claude Code 为运行或到达多个会话的其他每种方式都有专门的功能,因此请使用为您正在做的事情构建的功能:

31 

32* 要在另一个终端继续一个对话,或与新会话共享其上下文,请[恢复会话](/docs/zh-CN/sessions#resume-a-session)

33* 对于 Claude 生成和监督的协调团队会话,使用[代理团队](/docs/zh-CN/agent-teams)

34* 要从一个地方观看和指导许多会话,使用[代理视图](/docs/zh-CN/agent-view)

35* 要从您的手机或另一台设备自己指导会话,而不是让会话相互发送消息,使用[远程控制](/docs/zh-CN/remote-control)

36* 要将外部事件(如 CI 结果或聊天消息)推送到会话中,使用[频道](/docs/zh-CN/channels)

37 

38<h2 id="message-another-session">

39 向另一个会话发送消息

40</h2>

41 

42当你的一个会话学到另一个会话需要的东西时,比如一个发现、一个状态或一个决定,Claude 会将其传递过去,而不是让你在终端之间复制粘贴。Claude 使用 `ListAgents` 发现目标,并使用 `SendMessage` 发送,所以你永远不需要自己调用这两个工具。Claude 可以在没有被要求的情况下决定发送消息,你也可以提示它发送一条消息。

43 

44要自己提示一条消息,告诉 Claude 你想让另一个会话知道或做什么。这个例子是你输入的提示,而不是 Claude 发送的消息:

45 

46```text wrap theme={null}

47询问在我的另一个终端中运行的会话迁移是否完成

48```

49 

50Claude 会自己编写实际的消息,所以你的提示可以将内容留给 Claude。这个提示要求一个摘要而不指定其措辞,Claude 发送的内容会有所不同:

51 

52```text wrap theme={null}

53向处理支付 API 的会话解释我们刚刚做了什么

54```

55 

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

57 

58```text wrap theme={null}

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

60```

61 

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

63 

64* **这台机器之外的会话**:云会话或远程控制会话仅在 Claude 列出或向这台机器之外的会话发送消息后才会出现在类型提前中,所以请先要求 Claude 列出它们。

65* **名称中有空格或字母、数字、连字符和下划线之外的其他字符**:在双引号中输入,例如 `@"release notes"`。当你从类型提前中选择会话时,Claude Code 会为你插入引号。

66 

67你也可以在没有选择器的情况下输入提及。当多个活跃会话响应提及的名称时,Claude 会在发送前询问你指的是哪一个。

68 

69关于 Claude 编写的消息到达时的样子,包括一个例子,请参见 [消息看起来像什么](#what-a-message-looks-like)。

70 

71<h3 id="message-delivery">

72 消息传递

73</h3>

74 

75接收 Claude 在活跃轮次期间的工具调用之间读取消息,所以运行的工具永远不会被中断。当接收会话处于空闲状态时,Claude Code 会用消息启动一个新轮次。

76 

77来自另一个会话的消息以纯文本形式到达。如果它用 `@` 提及文件或 [MCP 资源](/docs/zh-CN/mcp#use-mcp-resources),Claude 会看到书写的提及,Claude Code 不会附加任何内容,无论消息是启动新轮次还是在轮次期间到达。Claude 仍然可以用自己的工具在接收机器上打开提及的路径,受该会话的权限限制。在 v2.1.251 之前,启动新轮次的消息中的 `@` 提及会在接收端附加文件或 MCP 资源。

78 

79Claude Code 在以下情况下拒绝消息:

80 

81* 消息 [超过大小限制](#limitations)。Claude Code 在发送会话中拒绝它,在它离开之前。

82* 对这台机器上的会话的快速突发已达到 [该会话的收件箱接受的内容](#limitations)。Claude Code 拒绝向该会话发送进一步的消息。

83* 这台机器上的回复目标未通过安全检查,例如符号链接目标或不是预期进程的端点。[拒绝发送跨会话消息](/docs/zh-CN/errors#refusing-to-send-a-cross-session-message) 列出了这些检查。

84* Claude 将消息寻址到此会话自己的名称,如 [查看 Claude 可以到达的会话](#see-which-sessions-claude-can-reach) 下所述。

85 

86接收会话根据自己的 [入站控制](#control-inbound-messages) 检查每条到达的消息,检查以三种结果之一结束:

87 

88* **已传递**:Claude Code 将消息传递给接收 Claude。

89* **已保留**:Claude Code 将消息搁置未传递。保留的消息仅在你批准它或稍后的模式或设置更改允许它时才到达 Claude。

90* **已拒绝**:Claude Code 在不传递的情况下丢弃消息。

91 

92一旦传递,消息就像你输入的提示一样计入 [使用情况](/docs/zh-CN/costs),接收 Claude 可以以相同的方式回复发送者,除了 [单向跨机器情况](#message-sessions-on-other-machines)。

93 

94权限边界保持每个会话。Claude 被指示永远不要要求另一个会话执行在其自己的会话中被拒绝或阻止的操作,或其自己的权限设置会阻止的操作,而是将该工作路由回你。在接收端,[接收会话自己的权限提示和规则仍然适用](#how-a-session-treats-an-incoming-message) 于消息要求的任何内容。

95 

96<h3 id="get-a-notice-when-another-session-goes-idle">

97 当另一个会话变为空闲时获得通知

98</h3>

99 

100Claude 可以要求你在这台机器上的一个会话在该会话下一次变为空闲或退出时发回一个通知。空闲在这里意味着会话完成了一个轮次,没有任何排队。当你在另一个会话中等待长任务并想听到它完成时而不是检查时使用它。需要两个会话中都有 Claude Code v2.1.236 或更高版本。

101 

102<h4 id="ask-for-a-notice">

103 请求通知

104</h4>

105 

106告诉 Claude 你在等待什么。这个提示要求来自迁移会话的通知:

107 

108```text wrap theme={null}

109告诉我迁移会话何时完成它正在处理的工作

110```

111 

112Claude 使用 `SendMessage` 工具的 `notify_when_idle` 输入进行订阅,要么附加到它正在发送的消息,要么单独进行。单独进行时,Claude Code 订阅而不在被监视的会话中启动轮次或花费令牌,如果该会话已经空闲,则立即发送通知。附加到消息时,Claude Code 首先传递消息,然后稍后发送通知。

113 

114<h4 id="what-each-session-shows">

115 每个会话显示什么

116</h4>

117 

118被监视的会话显示一行,说另一个进程要求在会话下一次空闲时被告知。要求会话显示通知为一行,命名被监视的会话。该行可以包括该会话轮次完成的时间和该轮次的单行状态。如果要求会话处于空闲状态,Claude Code 会用通知启动一个新轮次。

119 

120<h4 id="limits">

121 限制

122</h4>

123 

124通知是一次性的:Claude Code 从被监视的会话发送一次,两个会话都不会相互轮询。如果在 12 小时内没有通知到达,Claude Code 会删除订阅并告诉 Claude,所以它不会继续等待。

125 

126每一方的 [入站控制](#control-inbound-messages) 适用于像消息一样的通知:

127 

128* **任一方的 `refuse`**:什么都不会到达。被监视的会话在不记录或回答的情况下删除请求,所以订阅在 12 小时后无答复过期,具有 `refuse` 的要求会话永远不会订阅。

129* **任一方的 `hold`**:通知到达时内容较少。被监视的会话省略单行状态,要求会话在你的记录中显示通知而不将其传递给 Claude。

130 

131只有你主要对话中的 Claude 可以订阅,并且仅限于你在这台机器上的会话。当子代理或代理团队队友设置 `notify_when_idle` 时,Claude Code 不会进行订阅并告诉它这样做。当 Claude 要求来自任何其他代理的通知时,例如队友、子代理或这台机器之外的会话,Claude Code 拒绝整个调用,包括附加到它的任何消息,并向 Claude 报告拒绝,以便它可以在没有请求的情况下重新发送消息。

132 

133<h3 id="see-which-sessions-claude-can-reach">

134 查看 Claude 可以到达的会话

135</h3>

136 

137Claude 自己找到消息的目标,所以你不需要在要求它发送之前运行任何东西。要自己查看 Claude 可以到达的会话,请运行 `/list-agents` 命令。第一行(如果存在)是此会话自己的名称,你的其他会话用来向它发送消息的名称。下面的行是 Claude 可以到达的会话:

138 

139* **子代理**:在当前会话内运行的代理。

140* **队友**:此会话自己的 [代理团队](/docs/zh-CN/agent-teams) 队友。在 v2.1.239 之前,队友没有出现在列表中,尽管 Claude 已经可以按名称向他们发送消息。

141* **你的其他本地会话**:在同一台机器上运行的 Claude Code 会话,包括 [后台会话](/docs/zh-CN/agent-view)。会话仅在绑定 [收件箱套接字](#the-sessions-inbox-socket) 时才会出现。

142* **你的云会话**:你的 [Claude Code on the web](/docs/zh-CN/claude-code-on-the-web) 会话,在此会话连接到 [Remote Control](/docs/zh-CN/remote-control) 时显示。Claude Code 在列表中将它们标记为 `cloud`。

143* **你在其他机器上的 Remote Control 会话**:在此会话连接到 [Remote Control](/docs/zh-CN/remote-control) 时显示,并标记为 `Remote Control`。Claude Code 显示 `offline` 作为 Remote Control 连接已断开的会话的状态。

144 

145此会话不是行之一。如果 Claude 将消息寻址到此会话自己的名称,Claude Code 会拒绝它并告诉 Claude 目标是当前会话。在 v2.1.239 之前,列表没有显示此会话的名称,Claude Code 将发送到它的消息报告为它找不到的代理。

146 

147当此会话连接到 [Remote Control](/docs/zh-CN/remote-control) 时,Claude Code 从 `/list-agents` 输出中隐瞒你的本地会话的一些详细信息,而不改变 Claude 本身在寻找会话以发送消息时看到的内容:

148 

149* **工作目录**:它省略每个本地会话的工作目录。

150* **会话名称**:它省略任何它不能归因于一个人的会话名称,所以没有名称的行读作 `(unnamed session)`。

151* **第一行**:它省略此会话自己的名称行,除非你在此终端输入了该名称,使用 `--name` 或使用 `/rename` 和名称,因为你启动或最后恢复了会话。

152 

153当输出列出任何内容时,它以一个说明详细信息被隐瞒的注释结束。在会话自己的键盘上运行 `/rename` 后跟未使用的名称会给该会话一个出现在输出中的名称。

154 

155Claude Code 首先读取你的云和 Remote Control 会话列表最新的,并在每个会话后停止有界数量的页面。如果你的账户有超过适合的那些会话,Claude Code 不会列出较旧的,Claude 无法按名称向它们发送消息。当这种情况发生时,Claude Code 在列表中说明,Claude 在发送消息时看到相同的注释。

156 

157Claude 按名称寻址这台机器之外的会话,就像本地会话一样。有关这些消息如何传播,请参见 [向其他机器上的会话发送消息](#message-sessions-on-other-machines)。

158 

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

160 

161当你重命名会话时,Claude Code 也会更新你的其他会话用来查找会话名称的共享记录。如果它无法更新该记录,它会在 `/rename` 输出中警告你其他会话可能仍然显示旧名称。使用 [`--debug`](/docs/zh-CN/cli-reference#cli-flags) 运行会话,Claude Code 会记录失败更新的原因。

162 

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

164 

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

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

167 

168<h3 id="message-sessions-on-other-machines">

169 向其他机器上的会话发送消息

170</h3>

171 

172消息如何传播,以及它是否通过 Anthropic 服务器,取决于目标会话运行的位置:

173 

174| 其他会话运行的位置 | 消息如何传播 |

175| :---------------------------------------------------------- | :------------------------------------------------------------------------ |

176| 在这台机器上 | 在 macOS 和 Linux 上通过每个会话的套接字,或在本机 Windows 上通过每个会话的命名管道,永远不通过 Anthropic 服务器 |

177| 在你的另一台机器上 | 通过 Anthropic 服务器,通过该机器的 [Remote Control](/docs/zh-CN/remote-control) 连接到达 |

178| 在 [Claude Code on the web](/docs/zh-CN/claude-code-on-the-web) 上 | 通过 Anthropic 服务器,直接到云会话 |

179 

180与你另一台机器上的会话开始对话需要 Claude Code v2.1.225 或更高版本和一个 [出现在列表中](#see-which-sessions-claude-can-reach) 的目标。在 v2.1.225 之前,Claude 只能回复从一个到达的消息。

181 

182你可以向显示为 `offline` 的会话发送消息,其 [列表](#see-which-sessions-claude-can-reach) 中的一个,其 Remote Control 连接已断开。发送通过,但消息仅在该会话的机器重新连接后到达。Claude 在发送时被告知这一点。

183 

184同机器传递在启用该功能的任何地方都有效。每个会话在磁盘上的文件中注册自己。当 Claude 列出或向你的本地会话发送消息时,Claude Code 读取这些文件以找到会话,所以两个会话只有在能看到相同文件时才能相互到达。

185 

186容器有自己的文件系统,所以容器内的会话和主机上的会话无法相互到达。同一容器内的两个会话仍然可以相互发送消息,包括在 [自托管运行器](/docs/zh-CN/self-hosted-environments) 上。WSL 2 内的会话和同一计算机上的本机 Windows 会话也无法相互到达,因为它们在不同的主目录下注册并在不同的套接字类型上侦听。

187 

188当此会话连接到 Remote Control 时,当你向你另一台机器上的会话发送消息时,Claude Code 在该会话的对话中显示消息,在此会话的 Remote Control 名称下。该机器上的 Claude 可以回复该名称。例如,当此会话作为 `laptop-graceful-unicorn` 连接到 Remote Control 并且你向你的桌面发送消息时,你在桌面会话中看到消息在 `laptop-graceful-unicorn` 下。

189 

190如果此会话在 Claude 发送到这台机器之外的会话时未连接到 Remote Control,消息仍然通过,但没有 [回复地址](#what-a-message-looks-like),所以接收 Claude 无法回答它。Claude 在发送时被告知这一点。

191 

192要在任何消息超出此机器之前要求你的批准,请设置 [`isolatePeerMachines`](#require-approval-for-cross-machine-messages)。

193 

194<h2 id="how-a-session-treats-an-incoming-message">

195 会话如何处理传入消息

196</h2>

197 

198当会话 A 向会话 B 发送消息时,Claude Code 告诉 B 的 Claude 消息来自另一个会话,而不是来自您,并限制消息可以做什么:

199 

200* **它不能批准任何内容**:来自另一个会话的消息永远不计为您的同意,因此它不能代表您回答待处理的权限提示。

201* **它不能改变配置**:Claude Code 指示接收 Claude 永远不要改变权限设置、`CLAUDE.md` 或其他配置,因为另一个会话要求。

202* **命令不运行**:消息文本中的命令,如 `/compact`,作为纯文本到达。Claude Code 永远不执行它。

203* **权限提示仍然触发**:如果对消息进行操作需要接收会话没有的权限,您会看到与任何其他工作相同的提示。

204 

205<h3 id="what-a-message-looks-like">

206 消息的样子

207</h3>

208 

209当消息到达时,Claude Code 在对话中将其显示为暗淡的单行预览,预览行之后保留在对话中。预览包含发送者的名称和消息的第一行,当它很长时用 `…` 切割,如 `› Message from @api-worker: Schema migration finished (ctrl+o to expand)`。在 v2.1.247 之前,Claude Code 显示到达的消息的完整内容而不是预览。

210 

211这两个中的任何一个都显示您完整的文本:

212 

213* 按 `Ctrl+O` 打开[成绩单查看器](/docs/zh-CN/interactive-mode#transcript-viewer)并在发送者的会话名称下读取完整文本。

214* 在使用 [`--verbose`](/docs/zh-CN/cli-reference#cli-flags) 启动的会话中,Claude Code 显示完整文本而不是预览。

215 

216预览仅缩短您看到的内容。无论您是否展开它,Claude 都读取完整消息。

217 

218Claude 接收消息时带有发送者的名称和回复地址,除了[单向跨机器消息](#message-sessions-on-other-machines),它不携带回复地址。除了名称和回复地址,接收 Claude 获得消息的文本,永远不是发送者的对话历史或文件。[消息传递](#message-delivery)涵盖文本中的 `@` 提及。

219 

220[子代理](/docs/zh-CN/sub-agents)编写的消息在发送会话的名称下到达,消息文本中标识了子代理。对它的回复到达该会话的主要对话,而不是子代理。

221 

222这个例子是一个 Claude 写给另一个的消息,当您展开它时其完整文本读作:

223 

224```text wrap theme={null}

225架构迁移已完成

226新列是 tenant_id,在 main 上变基现在是安全的。

227```

228 

229<h3 id="control-inbound-messages">

230 控制入站消息

231</h3>

232 

233设置 [`crossSessionInbound`](/docs/zh-CN/settings-reference#crosssessioninbound) 以选择会话对来自您的其他会话的到达消息做什么:

234 

235| 值 | 行为 |

236| :------- | :---------------------------------------------------------------------------------------------------------------------- |

237| `accept` | Claude Code 将每条消息传递给 Claude |

238| `hold` | Claude Code 为每条消息显示通知,不传递它。如果稍后应用 `accept`,根据[优先级规则](/docs/zh-CN/settings-reference#crosssessioninbound),Claude Code 释放保留的消息 |

239| `refuse` | Claude Code 删除每条消息而不传递它 |

240 

241除了编辑设置文件,您可以在 `/config` 行**来自您的其他会话的消息**中选择值。Claude Code 将您选择的值写入您的用户设置。该行需要 Claude Code v2.1.232 或更高版本,当托管设置或 `--settings` 标志设置密钥时不出现,因为用户设置值不会应用。Claude Code 拒绝此密钥的 `/config crossSessionInbound=value` 快捷方式。

242 

243要查看哪个值适用,请遵循[设置参考](/docs/zh-CN/settings-reference#crosssessioninbound)中的 `crossSessionInbound` 优先级规则。当没有值适用时,Claude Code 根据两个会话的权限模式按消息决定。它将[绕过权限提示](/docs/zh-CN/permission-modes#skip-all-checks-with-bypasspermissions-mode)的会话分组为一个类,每个其他会话分组为另一个。Plan Mode 在具有可用绕过权限的会话中计为绕过,[auto](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode)、`acceptEdits` 和 `dontAsk` 计为提示:

244 

245* **接收会话提示权限**:Claude Code 传递每条消息。它仅当发送会话将自己标识为绕过权限提示时才为您的批准保留一条。

246* **接收会话绕过权限提示**:Claude Code 为您的批准保留每条消息。它仅当发送会话也标识为绕过时才传递一条。

247 

248当默认保留消息时,Claude Code 在接收会话中打开批准对话。对话显示发送者和预览:

249 

250* **批准**将该条消息传递给 Claude。

251* **拒绝**,或关闭对话,删除它。

252* 当对话在 [`dialogExpiry`](/docs/zh-CN/settings-reference#dialogexpiry) 截止日期后保持无答案时,Claude Code 关闭它并删除消息。截止日期默认为五分钟。

253* 当没有终端附加到[后台会话](/docs/zh-CN/agent-view)时,Claude Code 将对话保留在截止日期之后。在您附加后,如果对话在完整截止日期期间保持无答案,Claude Code 关闭它并删除消息。

254* 如果此会话的权限模式类在消息被保留时改变,Claude Code 重新应用入站规则,传递它们现在接受的消息,并显示通知。

255* 如果设置更改在消息被保留时使 `refuse` 适用,Claude Code 删除每条保留的消息并向它可以到达的每个发送者报告拒绝。

256 

257当发送者是同一机器上的交互式会话时,Claude Code 在接收者保留消息时在那里显示通知,以及当接收者稍后传递、拒绝或过期它时的后续通知。如果接收者拒绝它,Claude Code 在那里显示通知,接收者不接受跨会话消息,并告诉发送者的 Claude 不要等待或重新发送。

258 

259Claude Code 最多保留 100 条消息,与传递队列分开,超过那个删除最旧的。

260 

261<h3 id="non-interactive-sessions">

262 非交互式会话

263</h3>

264 

265Claude Code 为 [`claude -p`](/docs/zh-CN/headless) 会话绑定收件箱套接字,如交互式会话,因此长期运行的 `-p` 工作者可以接收消息并出现在列表中。当您在[裸模式](/docs/zh-CN/headless#start-faster-with-bare-mode)中启动会话时,Claude Code 不绑定套接字,因此该会话无法接收消息,不出现在代理列表中。

266 

267`-p` 会话无法显示批准对话。当[入站默认](#control-inbound-messages)在那里保留消息时,Claude Code 为相同的 [`dialogExpiry`](/docs/zh-CN/settings-reference#dialogexpiry) 截止日期保留它,对话使用的默认值为五分钟:

268 

269* **在截止日期之前**:如果模式或设置更改允许消息,Claude Code 传递它。

270* **在截止日期之后**:Claude Code 删除消息并向它可以到达的发送者报告它已过期。

271 

272设置 `dialogExpiry` 为 `"never"` 以保留默认保留的消息直到会话结束。由显式 `hold` 设置保留的消息不过期;Claude Code 仅当稍后应用 `accept` 时才传递它。

273 

274当会话以仍然保留的消息结束时,Claude Code 向它可以到达的每个发送者报告它们已过期。在 v2.1.225 之前,`-p` 会话中没有截止日期适用:保留的消息保持保留,除非运行期间的权限模式更改传递它,以及以保留的消息结束的会话不向其发送者报告任何内容。

275 

276要让 `-p` 工作者无人值守地接收消息,使用 `crossSessionInbound` 设置为 `accept` 在其 `--settings` 值中启动它。您的用户设置中的 `accept` 也有效,但适用于您运行的每个会话。

277 

278<h3 id="the-sessions-inbox-socket">

279 会话的收件箱套接字

280</h3>

281 

282当您期望的会话不在代理列表中时,当您想要脚本或钩子发布到会话中时,或当沙箱命令无法到达套接字时,阅读本部分。

283 

284Claude Code 为启用跨会话消息传递的每个会话绑定收件箱套接字,其他机器上的会话在其中传递消息。套接字是 macOS 和 Linux 上的 Unix 域套接字,包括 WSL 2 内的 Linux,以及原生 Windows 上的命名管道。对于哪些会话类型绑定一个,请参阅[非交互式会话](#non-interactive-sessions)。

285 

286您可以在两个地方找到套接字的路径:

287 

288* `/status` 在 `Peer address` 行中显示它。路径以 `uds:` 为前缀。

289* Claude Code 将其导出到[钩子](/docs/zh-CN/hooks)和 Bash 命令作为 [`CLAUDE_CODE_MESSAGING_SOCKET`](/docs/zh-CN/env-vars#variables) 环境变量:

290 * 在以消息传递启动的会话中,Claude Code 在任何钩子运行之前导出变量,包括 `SessionStart`。

291 * 每个会话导出自己的套接字,永远不是从父会话继承的。

292 

293在 macOS 和 Linux 上,Claude Code 将套接字限制为您的操作系统用户。在原生 Windows 上,它改为要求每个连接首先使用只有您的操作系统用户可以读取的密钥进行身份验证。无论哪种方式,在共享机器上,另一个用户的会话无法传递给它。

294 

295在 macOS 和 Linux 上,Claude Code 也拒绝在它无法接受的目录中创建套接字,例如另一个用户拥有的目录,并改为使用私有的每用户目录 `/tmp/cc-socks-<uid>`。当它无法接受任何目录时,会话运行而没有收件箱:Claude Code 显示通知,`/status` 在其 `Peer address` 行中显示 `unavailable` 和原因,[`--debug`](/docs/zh-CN/cli-reference#cli-flags) 日志记录完整拒绝。

296 

297除了套接字的路径,Claude Code 导出每个会话令牌作为 [`CLAUDE_CODE_MESSAGING_TOKEN`](/docs/zh-CN/env-vars#variables)。发布到自己会话的套接字的脚本可以发送 `{"type":"auth","token":"<token>"}` 作为其连接的第一行,其中 `<token>` 是 `CLAUDE_CODE_MESSAGING_TOKEN` 的值。Claude Code 是否需要该行取决于平台:

298 

299* **macOS 和 Linux,包括 WSL 2**:该行是可选的。Claude Code 接受有或没有它的连接。

300* **原生 Windows**:该行是必需的。Claude Code 关闭任何第一行不是有效身份验证行的连接,不从该连接传递任何内容。

301 

302仅在您发布的消息准备好时打开连接。Claude Code 关闭在 30 秒内未发送完整行的连接,因此首先捕获慢速命令的输出,然后打开连接以发送它。

303 

304下面的[自己的子消息规则](#own-child-messages)说明 Claude Code 何时查询令牌以及它如何处理它无法验证的消息。

305 

306<span id="own-child-messages" />Claude Code 通过套接字上到达的消息运行与任何其他对等消息相同的[入站控制](#control-inbound-messages),有一个例外和一个先决条件:

307 

308* **自己的子消息**:当没有 `crossSessionInbound` 值适用时,Claude Code 传递它验证来自会话自己的子进程的消息,如钩子或 Bash 命令发布回自己会话的套接字。

309 * 在 Linux 上,包括 WSL 2 内,Claude Code 可以通过进程证据验证,即使对于已经退出的子进程。在 macOS 上,它只能在发布进程仍在运行时通过这种方式验证,在 Claude Code 作为进程 ID 1 运行的容器中,它根本没有进程证据。在原生 Windows 上它也没有。

310 * 在 macOS 上发布进程已退出后,在 Claude Code 作为进程 ID 1 运行的容器中,该进程证据丢失,Claude Code 改为验证发送会话导出的 [`CLAUDE_CODE_MESSAGING_TOKEN`](/docs/zh-CN/env-vars#variables) 在打开其连接的身份验证行中的子进程。在原生 Windows 上,该令牌是 Claude Code 验证自己的子消息的唯一方式。

311 * 当 Claude Code 无法以任何方式验证时,它将消息视为任何其他声称没有权限类的消息,因此绕过权限提示的会话为您的批准保留它。

312* **沙箱会话**:使用沙箱的 Unix 套接字设置 [`sandbox.network.allowAllUnixSockets` 和 `sandbox.network.allowUnixSockets`](/docs/zh-CN/settings-reference#sandbox-settings) 控制 Bash 命令是否可以从[沙箱](/docs/zh-CN/sandboxing)内到达套接字。

313 

314<h2 id="restrict-cross-session-messaging">

315 限制跨会话消息传递

316</h2>

317 

318除了每条消息的默认值,您可以通过两种方式缩小消息传递。在任何消息离开机器之前要求您的批准,或为会话或组织关闭消息传递。

319 

320<h3 id="require-approval-for-cross-machine-messages">

321 要求批准跨机器消息

322</h3>

323 

324设置 [`isolatePeerMachines`](/docs/zh-CN/settings-reference#isolatepeermachines) 为 `true` 以要求您的明确批准,在任何 `SendMessage` 到达超出此机器的会话之前:

325 

326```json theme={null}

327{

328 "isolatePeerMachines": true

329}

330```

331 

332设置此项后,Claude Code 在 Claude 的消息到达超出此机器的会话之前要求您的批准,即使在 `bypassPermissions` 模式中,它跳过普通权限提示。任何设置范围中的 `true` 适用,因此检查的项目文件可以打开要求但不关闭。Claude Code 不提示同一机器上的会话之间的消息。

333 

334<h3 id="turn-off-cross-session-messaging">

335 关闭跨会话消息传递

336</h3>

337 

338接收和发送是单独的控制,因此关闭您需要的任何方向,或两者。对到达的消息使用 `crossSessionInbound`,对 Claude 可以发送或列出的内容使用权限规则:

339 

340* **停止接收**:设置 `crossSessionInbound` 为 `refuse`,Claude Code 删除入站对等消息而不传递它们。从项目或本地设置,`refuse` 适用于每个其他来源,从您的用户设置它适用,除非托管设置或 `--settings` 标志设置值。

341* **停止发送和列出**:添加[权限拒绝规则](/docs/zh-CN/permissions#tool-specific-permission-rules)命名 `SendMessage` 和 `ListAgents`。两者都采用没有说明符的裸工具名称。

342 

343管理员可以在[托管设置](/docs/zh-CN/managed-settings)中为组织关闭两个方向,结合拒绝规则与 `refuse`:

344 

345```json theme={null}

346{

347 "permissions": {

348 "deny": ["SendMessage", "ListAgents"]

349 },

350 "crossSessionInbound": "refuse"

351}

352```

353 

354设置此项后,Claude Code 仍然为每个会话绑定收件箱套接字,但删除到达它的每条消息而不向 Claude 传递任何内容。拒绝 `SendMessage` 也删除向子代理和代理团队队友的消息传递,因为相同的工具服务两者。拒绝的会话在其自己的 `/status` 或同一机器上其他会话的列表中显示无可见更改,因此要确认它,检查适用于该会话的设置文件而不是其状态。

355 

356<h2 id="availability">

357 可用性

358</h2>

359 

360跨会话消息传递需要 macOS、Linux 和 WSL 2 上的 Claude Code v2.1.224 或更高版本,以及原生 Windows 上的 v2.1.234 或更高版本。可用性以及 Claude 可以向其发送消息的会话也取决于您的操作系统、提供商和配置:

361 

362* **操作系统**:在 macOS、Windows 和 Linux 上可用,包括 WSL 2 内的 Linux。

363 

364* **此机器上的会话**:在每个提供商上可用,包括 Amazon Bedrock、Claude Platform on AWS、Google Cloud 的 Agent Platform 和 Microsoft Foundry,以及在[功能标志获取](/docs/zh-CN/env-vars#features-that-need-feature-flag-fetching)关闭的会话中运行。在这些提供商上,以及标志获取关闭时,同机器消息传递需要 Claude Code v2.1.248 或更高版本。Claude Code 通过您机器上的[每个会话套接字](#the-sessions-inbox-socket)传递这些消息,永远不通过 Anthropic 服务器。

365 

366 要停止会话接收它们,设置 [`crossSessionInbound`](#turn-off-cross-session-messaging) 为 `refuse`。

367 

368* **超出此机器的会话**:Claude 从连接到远程控制的会话找到您的[网络上的 Claude Code](/docs/zh-CN/claude-code-on-the-web) 会话和您在其他机器上的会话,这需要 claude.ai 登录作为此会话的活跃身份验证和其他[远程控制要求](/docs/zh-CN/remote-control#requirements)。Claude 无法在 Amazon Bedrock、Claude Platform on AWS、Google Cloud 的 Agent Platform 和 Microsoft Foundry 上使用 API 密钥或找到这些会话。

369 

370要检查会话,输入 `/list-agents`,也可用作 `/peers`。结果将没有该功能的会话与更窄的东西阻止消息的会话分开,如缺少 `SendMessage` 工具或拒绝的发送:

371 

372* **`/list-agents` 无法识别**:会话没有跨会话消息传递。通过上面的要求工作,从 `claude --version` 开始获取版本要求。

373* **`/list-agents` 有效但发送未到达**:消息传递启用,更窄的东西适用:

374 * **拒绝规则**:[权限拒绝规则](#turn-off-cross-session-messaging)删除 `SendMessage` 和 `ListAgents` 工具。

375 * **入站控制**:[接收会话的入站控制](#control-inbound-messages)可以保留或删除您发送给它的内容。

376 * **云会话缺失**:云会话仅在此会话连接到[远程控制](/docs/zh-CN/remote-control)时出现。

377 * **其他机器会话缺失**:您另一台机器上的会话仅在它使用[远程控制](/docs/zh-CN/remote-control)运行且此会话也连接时出现。

378 * **其他机器会话 `offline`**:向列为 `offline` 的会话发送消息通过,但[仅在该会话的机器重新连接后到达](#message-sessions-on-other-machines)。

379 * **较旧的云或其他机器会话缺失**:Claude Code [首先读取这些会话列表最新的并在有限数量的页面后停止](#see-which-sessions-claude-can-reach),因此 Claude 无法按名称向超过它们的会话发送消息。

380 * **启动对话**:[向其他机器上的会话发送消息](#message-sessions-on-other-machines)涵盖与超出此机器的会话启动对话。

381 

382在具有消息传递的会话中,`/status` 也显示 `Peer address` 行,带有会话自己的收件箱地址,或 `unavailable` 和原因,当 Claude Code [无法设置收件箱](#the-sessions-inbox-socket)时。

383 

384<h2 id="limitations">

385 限制

386</h2>

387 

388这里的限制是消息传递通道本身的属性,在该功能运行的任何地方适用。对于平台和提供商差距,请改为参阅[可用性](#availability)。

389 

390* **仅纯文本**:Claude 仅在会话之间发送纯文本。结构化[代理团队](/docs/zh-CN/agent-teams)协议消息保留在团队内。

391* **同机器消息大小有上限**:Claude Code 拒绝到此机器上的会话的消息,一旦其序列化形式超过约一百万个字符。拒绝[命名确切大小](/docs/zh-CN/errors#message-too-large-for-cross-session-delivery)。什么都不到达接收会话。

392* **对一个会话的快速突发在发送者处被拒绝**:一旦对此机器上的会话的快速突发消息达到该会话的收件箱接受的内容,Claude Code 拒绝发送会话中的进一步发送。[拒绝命名突发](/docs/zh-CN/errors#too-many-messages-to-this-session-just-now)并告诉 Claude 将其余的批处理为一条消息或等待。在 v2.1.236 之前,Claude Code 报告这些发送为已发送,而接收会话删除它们。

393* **消息循环被限制**:在接收会话中,Claude Code 对每个发送者的重复消息进行速率限制,删除在短窗口内到达的相同重复,并最多为 Claude 读取排队 50 条接受的消息。因此两个会话之间的消息循环自己停止。当速率限制、重复检查或队列上限从此机器上的交互式会话删除消息时,Claude Code 告诉该会话哪个删除了它,并告诉其 Claude 不要立即重新发送。

394 

395<h2 id="related-resources">

396 相关资源

397</h2>

398 

399* [子代理](/docs/zh-CN/sub-agents#resume-subagents)和[代理团队](/docs/zh-CN/agent-teams#messages-between-agents):单个会话或团队内的消息传递

400* [后台代理](/docs/zh-CN/agent-view):分派和监控您可能向其发送消息的并行会话

401* [远程控制](/docs/zh-CN/remote-control):连接此会话以到达您在其他机器上的会话

402* [设置](/docs/zh-CN/settings-reference#all-settings):`crossSessionInbound`、`isolatePeerMachines` 和 `dialogExpiry`

403* [权限模式](/docs/zh-CN/permission-modes):入站默认的两个类背后的模式

404* [工具参考](/docs/zh-CN/tools-reference):工具表中的 `ListAgents` 和 `SendMessage` 行

405* [并行运行代理](/docs/zh-CN/agents):比较 Claude Code 运行多个代理的方式

desktop-ios-simulator.md +176 −0 created

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# 在模拟器中测试 iOS 应用

6 

7> Claude Code Desktop 在 Claude 构建、运行或检查应用时,会在 iOS Simulator 窗格中打开你的应用,每个会话都有一个单独的模拟器。

8 

9<Note>

10 iOS Simulator 窗格在 macOS 上的 Claude Code Desktop 中处于公开测试版。它在 Pro、Max、Team 和 Enterprise 计划中可用,但在启用了 HIPAA 配置的 Enterprise 组织中不可用。

11</Note>

12 

13iOS Simulator 窗格在 Claude Code Desktop 中的对话旁边显示你的应用在 Apple 的 iOS Simulator 中运行。当 Claude 在模拟器中构建、安装、启动或检查你的应用时,该窗格会自动打开并实时流式传输设备屏幕。使用它来观看 Claude 运行和测试你的应用,或者在 Claude 继续工作时自己点击浏览应用。

14 

15模拟器窗格直接驱动模拟器,因此它不需要[计算机使用](/docs/zh-CN/desktop#let-claude-use-your-computer),也不会接管你的屏幕或隐藏其他窗口。从 CLI 中,Claude 通过[计算机使用](/docs/zh-CN/computer-use#test-a-simulator-flow)访问 iOS Simulator,它以与你使用鼠标相同的方式控制屏幕上的模拟器。

16 

17<h2 id="requirements">

18 要求

19</h2>

20 

21模拟器窗格使用 Apple 的模拟器工具,桌面应用不包含这些工具。在开始会话之前,请确保你有:

22 

23* Claude Desktop v1.24012.0 或更高版本

24* 一台 Mac,因为 Apple 的 iOS Simulator 仅在 macOS 上运行

25* [Xcode](https://developer.apple.com/xcode/),其中安装了 iOS 平台,它提供模拟器设备。如果 Xcode 还没有列出任何模拟器,请参阅[模拟器窗格显示未找到模拟器](#the-simulator-pane-says-no-simulators-were-found)

26 * 使用 Xcode 26.x。该窗格还不能与 Xcode 27 一起使用,Xcode 27 用 Device Hub 替换了 Simulator 应用。如果 `xcode-select` 在你的 Mac 上指向 Xcode 27,请参阅[模拟器窗格在 Xcode 27 中失败](#the-simulator-pane-fails-with-xcode-27)

27 

28<Note>

29 在本页上,"设备"指的是模拟的 iPhone 或 iPad,是你在 Xcode 中的**Window → Devices and Simulators** 下管理的相同模拟器设备之一,而不是物理硬件。

30</Note>

31 

32模拟器窗格仅在本地会话中可用。在[云](/docs/zh-CN/desktop#run-long-running-tasks-remotely)和 [SSH](/docs/zh-CN/desktop#ssh-sessions) 会话中,Claude 在无法访问 Mac 上模拟器的机器上运行。

33 

34<h2 id="run-your-app-in-the-simulator">

35 在模拟器中运行你的应用

36</h2>

37 

38你不需要命令或设置来打开模拟器窗格。当 Claude 在模拟器中运行你的应用时,它会打开该窗格。

39 

40<Steps>

41 <Step title="打开你的 iOS 项目">

42 在 Claude Code Desktop 中,打开**Code** 选项卡并使用你的应用项目作为[项目文件夹](/docs/zh-CN/desktop#start-a-session)启动会话。任何为 iOS Simulator 构建应用的项目都可以使用。

43 </Step>

44 

45 <Step title="要求 Claude 运行或测试应用">

46 围绕运行或验证应用来表述任务。例如:

47 

48 ```text theme={null}

49 构建应用并在模拟器中运行它以检查入门流程。

50 ```

51 </Step>

52 

53 <Step title="在模拟器窗格中观看应用">

54 当应用在模拟器中启动时,iOS Simulator 窗格会在对话旁边打开。Claude 第一次使用设备时,桌面应用会要求你允许它;请参阅[授予 Claude 对设备的访问权限](#grant-claude-access-to-a-device)。Claude 安装应用、点击浏览它,并读取屏幕以验证自己的更改,同时你观看。

55 </Step>

56</Steps>

57 

58模拟器窗格在 Claude 在会话中的任何时刻在模拟器中启动应用时打开。当你的请求是关于查看应用时,例如"新屏幕看起来对吗?",Claude 在开始工作之前启动模拟器。在 Claude 修复错误或更改屏幕后,要求它验证更改:重新启动应用会重新打开窗格(如果它未打开)。

59 

60模拟器窗格显示应用实际启动的任何设备。要在特定设备上测试,在你的请求中命名它,例如"在 iPhone SE 模拟器上运行它",Claude 在构建和启动时会针对该设备。

61 

62Claude 启动的设备也会出现在 Apple 的 Simulator 应用中,Claude 可以在你已经启动的设备上安装应用。

63 

64你也可以自己打开模拟器窗格。一旦会话有模拟器连接或已编辑 Swift 文件,会话工具栏中的**Views** 菜单会显示 **iOS Simulator** 条目。如果窗格还没有显示设备,请单击**Attach simulator**,或从它旁边的设备菜单中选择特定设备;选择关闭的设备会启动它。如果 Xcode 或其模拟器缺失,窗格会显示设置步骤,并在你完成每个步骤时检查它们。

65 

66<h2 id="control-the-simulator-yourself">

67 自己控制模拟器

68</h2>

69 

70模拟器窗格是交互式的,不仅仅是查看器。在 Claude 工作时或任务之间,你可以:

71 

72* 通过在设备屏幕上单击和拖动来点击和滑动

73* 使用与 Apple 的 Simulator 应用相同的快捷键按下硬件按钮:**Cmd+Shift+H** 表示主屏幕,**Cmd+L** 表示锁定,**Cmd+Up Arrow** 和 **Cmd+Down Arrow** 表示音量

74* 使用旋转按钮或 **Cmd+Right Arrow** 将设备顺时针旋转四分之一圈

75* 从设备菜单中切换窗格显示的设备,该菜单列出每个模拟器的操作系统版本以及它是否已启动

76* 使用 **Cmd+S** 保存屏幕截图或使用 **Cmd+R** 保存屏幕录制,使用窗格的捕获按钮或快捷键;文件保存到你的桌面

77* 通过单击**Detach simulator** 停止流式传输设备而不关闭它,这会将窗格返回到其**Attach simulator** 状态

78 

79设备名称下的行调整来自模拟器的视频流。如果窗格对你的 Mac 造成压力,请降低**Frame rate** 或**Resolution**,在 H.264 和 JPEG 之间切换**Encoding**,或检查**FPS** 以显示窗格接收的帧速率。这些设置改变窗格显示设备的方式,而不是应用运行的方式。

80 

81你和 Claude 驱动同一设备,因此你的点击会改变 Claude 看到的应用状态。要让 Claude 检查特定屏幕,通过点击导航到它,然后提出要求。当 Claude 驱动设备时,窗格在屏幕上方显示**Claude is using this device** 徽章;在徽章清除之前暂停点击,以便结果反映应用而不是你的输入。

82 

83<h2 id="how-sessions-manage-devices">

84 会话如何管理设备

85</h2>

86 

87每个设备属于启动它的会话,因此[并行会话](/docs/zh-CN/desktop#work-in-parallel-with-sessions)不共享设备:你在一个会话的窗格中看到的内容反映该会话的工作,而不是另一个的。在侧栏中切换会话会切换模拟器视图以及对话,切换回来会在它停止的地方恢复同一设备。如果 Claude 使用多个设备,每个都会打开自己的窗格,每个会话最多 4 个。

88 

89Claude Code Desktop 在模拟器不再使用时关闭它启动的模拟器:当你退出应用时、当你存档会话时,或在你从其窗格分离设备后 10 分钟。你自己启动的设备,无论是从窗格还是在 Apple 的 Simulator 应用中,永远不会自动关闭。要立即关闭连接的设备,请使用窗格中的关闭按钮。

90 

91<h2 id="grant-claude-access-to-a-device">

92 授予 Claude 对设备的访问权限

93</h2>

94 

95Claude 在控制设备之前要求你的同意,而构建应用或在其上打开 URL 遵循你的会话的权限模式。你或你的组织也可以完全关闭 Claude 的访问。

96 

97<h3 id="allow-a-device-the-first-time">

98 第一次允许设备

99</h3>

100 

101Claude 第一次使用模拟器时,桌面应用会要求你允许它。同意涵盖控制该设备和对其进行屏幕截图,你每个设备给予一次而不是每个会话一次。Claude 对设备的屏幕截图被发送到 Anthropic 并根据你的正常对话保留设置保留,因此不要在 Claude 使用的设备上登录真实账户。

102 

103在你允许设备后,Claude 对其的操作,例如点击、输入、启动应用和拍摄屏幕截图,无需进一步提示即可运行。它们具有与你在窗格中单击相同的信任,并且它们仅触及模拟设备,因此窗格不需要计算机使用所需的 macOS 辅助功能和屏幕录制权限。

104 

105如果你拒绝,设备仍会启动,窗格仍可用于你自己的点击;只有 Claude 的访问保持关闭。要稍后改变主意,请在窗格中单击**Let Claude use it**。

106 

107<h3 id="actions-that-follow-your-permission-mode">

108 遵循你的权限模式的操作

109</h3>

110 

111两个操作遵循你的会话的[权限模式](/docs/zh-CN/permissions#permission-modes)而不是一次性同意:

112 

113* 在设备上打开 URL,例如测试深层链接或在设备的 Safari 中加载页面,因为 URL 可以将数据从设备中携带出去。

114* 构建应用,因为 `xcodebuild` 在你的 Mac 上运行你的项目的构建脚本。检查已在进行的构建不会提示。

115 

116<h3 id="turn-off-simulator-access">

117 关闭模拟器访问

118</h3>

119 

120你可以在桌面应用的设置中关闭 Claude 的模拟器访问。组织有两种方式为所有人关闭它:

121 

122* `disableMobileSimulatorTools` [托管设置](/docs/zh-CN/desktop#managed-settings)阻止 Claude 的模拟器工具。模拟器窗格仍可用于你自己的点击,该设置无法从应用内覆盖。

123* `requireCoworkFullVmSandbox` 策略密钥,它在隔离的虚拟机内而不是在你的 Mac 上运行 Claude 的工具,禁用模拟器窗格和 Claude 的模拟器工具,因此当它被设置时窗格无法连接设备。

124 

125Claude 会告诉你何时应用任一情况。

126 

127<h2 id="limitations">

128 限制

129</h2>

130 

131Claude 仅驱动模拟设备,无法控制物理 iPhone 或 iPad。要在其上测试,从 Xcode 自己在其上运行应用,然后描述你看到的内容或将屏幕截图附加到对话中供 Claude 使用。

132 

133<h2 id="troubleshooting">

134 故障排除

135</h2>

136 

137<h3 id="the-simulator-pane-doesn’t-open-when-claude-runs-the-app">

138 当 Claude 运行应用时模拟器窗格不打开

139</h3>

140 

141Claude 可能没有识别出你想要运行或测试应用,或者模拟器工具可能缺失。检查以下内容:

142 

143* 明确说明目标,例如"在 iOS Simulator 中运行应用并点击浏览注册流程"。

144* 确认 Xcode 和 iOS 模拟器已安装,并且你的 Xcode 版本符合[要求](#requirements)。

145* 如果你的组织管理 Claude Code,[模拟器工具可能被策略禁用](#turn-off-simulator-access)。

146* 如果你在启用了 HIPAA 配置的 Enterprise 组织中,模拟器窗格对你不可用。

147* 模拟器窗格需要 Claude Desktop v1.24012.0 或更高版本。打开**Claude → Check for Updates**,然后重启应用。

148 

149<h3 id="the-simulator-pane-says-no-simulators-were-found">

150 模拟器窗格显示未找到模拟器

151</h3>

152 

153如果 `xcode-select` 指向 Xcode 27,窗格可能报告未找到模拟器,即使设备存在;请参阅[模拟器窗格在 Xcode 27 中失败](#the-simulator-pane-fails-with-xcode-27)。否则,Xcode 已安装但没有 iOS 模拟器可列出。模拟器窗格显示要遵循的设置步骤,并在每个步骤完成时检查它们。要手动安装缺失的部分,从 Xcode 的设置中下载 iOS 模拟器运行时,或运行 `xcodebuild -downloadPlatform iOS`。

154 

155<h3 id="the-simulator-pane-fails-with-xcode-27">

156 模拟器窗格在 Xcode 27 中失败

157</h3>

158 

159窗格还不能与 Xcode 27 一起使用,Xcode 27 用 Device Hub 替换了 Simulator 应用。选择 Xcode 27 后,连接设备失败,或窗格报告未找到模拟器,即使设备存在。

160 

161窗格使用 `xcode-select` 指向的任何 Xcode。如果 Xcode 27 是你唯一的安装,首先在其旁边安装 Xcode 26.x。然后通过其路径选择 26.x 安装。例如,如果它安装为 `/Applications/Xcode-26.4.app`:

162 

163```bash theme={null}

164sudo xcode-select -s /Applications/Xcode-26.4.app

165```

166 

167运行 `xcode-select -p` 以检查选择了哪个安装。

168 

169<h2 id="see-also">

170 另请参阅

171</h2>

172 

173* [Desktop 中的计算机使用](/docs/zh-CN/desktop#let-claude-use-your-computer):没有专用窗格的应用的屏幕控制

174* [CLI 中的计算机使用](/docs/zh-CN/computer-use):CLI 如何访问 iOS Simulator

175* [与会话并行工作](/docs/zh-CN/desktop#work-in-parallel-with-sessions):会话如何隔离更改

176* [开始使用 Claude Code Desktop](/docs/zh-CN/desktop-quickstart)

Details

9桌面应用为您提供具有图形界面的 Claude Code,专为并行运行多个会话而构建:用于管理并行工作的侧边栏、带有集成终端和文件编辑器的拖放布局、可视化差异审查、实时应用预览、GitHub PR 监控和自动合并以及计划任务。无需终端。9桌面应用为您提供具有图形界面的 Claude Code,专为并行运行多个会话而构建:用于管理并行工作的侧边栏、带有集成终端和文件编辑器的拖放布局、可视化差异审查、实时应用预览、GitHub PR 监控和自动合并以及计划任务。无需终端。

10 10 

11<CardGroup cols={3}>11<CardGroup cols={3}>

12 <Card title="Download for macOS" icon="apple" href="https://claude.ai/api/desktop/darwin/universal/dmg/latest/redirect?utm_source=claude_code&utm_medium=docs">12 <Card title="下载 macOS 版本" icon="apple" href="https://claude.ai/api/desktop/darwin/universal/dmg/latest/redirect?utm_source=claude_code&utm_medium=docs">

13 Universal build for Intel and Apple Silicon13 适用于 Intel 和 Apple Silicon 的通用版本

14 </Card>14 </Card>

15 15 

16 <Card title="Download for Windows" icon="windows" href="https://claude.ai/api/desktop/win32/x64/setup/latest/redirect?utm_source=claude_code&utm_medium=docs">16 <Card title="下载 Windows 版本" icon="windows" href="https://claude.ai/api/desktop/win32/x64/setup/latest/redirect?utm_source=claude_code&utm_medium=docs">

17 For x64 processors17 适用于 x64 处理器

18 </Card>18 </Card>

19 19 

20 <Card title="Get Claude for Linux (beta)" icon="linux" href="/docs/en/desktop-linux">20 <Card title="获取 Claude for Linux(测试版)" icon="linux" href="/docs/zh-CN/desktop-linux">

21 apt or .deb for Ubuntu and Debian21 Ubuntu 和 Debian 的 apt 或 .deb

22 </Card>22 </Card>

23</CardGroup>23</CardGroup>

24 24 

25For Windows ARM64, download the [ARM64 installer](https://claude.ai/api/desktop/win32/arm64/setup/latest/redirect?utm_source=claude_code\&utm_medium=docs). On Linux, install with apt; see [Claude Desktop on Linux](/docs/en/desktop-linux).25对于 Windows ARM64,请下载 [ARM64 安装程序](https://claude.ai/api/desktop/win32/arm64/setup/latest/redirect?utm_source=claude_code\&utm_medium=docs)。在 Linux 上,使用 apt 安装;请参阅 [Claude Desktop on Linux](/docs/zh-CN/desktop-linux)。

26 26 

27<Note>27<Note>

28 Claude Code 需要 [Pro、Max、Team 或 Enterprise 订阅](https://claude.com/pricing?utm_source=claude_code\&utm_medium=docs\&utm_content=desktop_quickstart_pricing)。28 Claude Code 需要 [Pro、Max、Team 或 Enterprise 订阅](https://claude.com/pricing?utm_source=claude_code\&utm_medium=docs\&utm_content=desktop_quickstart_pricing)。

Details

14 比较调度选项14 比较调度选项

15</h2>15</h2>

16 16 

17Claude Code offers three ways to schedule recurring or one-off work:17Claude Code 提供三种方式来安排定期或一次性工作:

18 18 

19| | [Cloud](/docs/en/routines) | [Desktop](/docs/en/desktop-scheduled-tasks) | [`/loop`](/docs/en/scheduled-tasks) |19| | [Cloud](/docs/zh-CN/routines) | [Desktop](/docs/zh-CN/desktop-scheduled-tasks) | [`/loop`](/docs/zh-CN/scheduled-tasks) |

20| :------------------------- | :---------------------------------- | :------------------------------------- | :------------------------------------------------------------------------- |20| :---------- | :----------------------- | :---------------------------------------- | :--------------------------------------------------------- |

21| Runs on | Cloud, Anthropic-managed by default | Your machine | Your machine |21| 运行位置 | Cloud,默认由 Anthropic 管理 | 您的机器 | 您的机器 |

22| Requires machine on | No | Yes | Yes |22| 需要机器开启 | 否 | 是 | 是 |

23| Requires open session | No | No | Yes |23| 需要打开会话 | 否 | 否 | 是 |

24| Persistent across restarts | Yes | Yes | Restored on `--resume`, with [exceptions](/docs/en/scheduled-tasks#limitations) |24| 重启后持久化 | 是 | 是 | 在 `--resume` 上恢复,有[例外](/docs/zh-CN/scheduled-tasks#limitations) |

25| Access to local files | No (fresh clone) | Yes | Yes |25| 访问本地文件 | 否(新克隆) | 是 | 是 |

26| MCP servers | Connectors configured per task | [Config files](/docs/en/mcp) and connectors | Inherits from session |26| MCP servers | 每个任务配置的连接器 | [配置文件](/docs/zh-CN/mcp)和连接器 | 从会话继承 |

27| Permission prompts | No (runs autonomously) | Configurable per task | Inherits from session |27| 权限提示 | 否(自主运行) | 每个任务可配置 | 从会话继承 |

28| Customizable schedule | Via `/schedule` in the CLI | Yes | Yes |28| 可自定义的计划 | 通过 CLI 中的 `/schedule` | 是 | 是 |

29| Minimum interval | 1 hour | 1 minute | 1 minute |29| 最小间隔 | 1 小时 | 1 分钟 | 1 分钟 |

30 30 

31<Tip>31<Tip>

32 Use **cloud tasks** for work that should run reliably without your machine. Use **Desktop tasks** when you need access to local files and tools. Use **`/loop`** for quick polling during a session.32 对于应该在没有您的机器的情况下可靠运行的工作,使用**云任务**。当您需要访问本地文件和工具时,使用**桌面任务**。对于会话期间的快速轮询,使用 **`/loop`**。

33</Tip>33</Tip>

34 34 

35<Note>35<Note>

Details

207 </Step>207 </Step>

208 208 

209 <Step title="使用您的新插件">209 <Step title="使用您的新插件">

210 检查安装摘要:如果它报告 `Run /reload-plugins to activate.`,运行 `/reload-plugins`,如果它警告重新加载将重新读取对话,将其重新运行为 `/reload-plugins --force`。210 如果安装摘要报告 `Run /reload-plugins to activate.`,Claude Code 随后会为您运行该重新加载。如果重新加载警告您的下一条消息会重新读取对话,请运行 `/reload-plugins --force` 来激活插件。

211 211 

212 插件 skills 由插件名称命名空间,因此 **commit-commands** 提供诸如 `/commit-commands:commit` 之类的 skills。212 插件 skills 由插件名称命名空间,因此 **commit-commands** 提供诸如 `/commit-commands:commit` 之类的 skills。

213 213 


349当您从 `/plugin` 界面安装时,安装摘要告诉您插件在当前会话中是否处于活跃状态:349当您从 `/plugin` 界面安装时,安装摘要告诉您插件在当前会话中是否处于活跃状态:

350 350 

351* `Plugin is now active.`:Claude Code 在安装过程中激活了插件。351* `Plugin is now active.`:Claude Code 在安装过程中激活了插件。

352* `Run /reload-plugins to activate.`:插件尚未处于活跃状态,因为激活它会[使提示缓存失效](/docs/zh-CN/prompt-caching#enabling-or-disabling-a-plugin)或因为激活尝试失败。运行该命令以激活插件。352* `Run /reload-plugins to activate.`:插件尚未处于活跃状态,因为激活它会[使提示缓存失效](/docs/zh-CN/prompt-caching#enabling-or-disabling-a-plugin)或因为激活尝试失败。Claude Code 随后会为您运行 `/reload-plugins`。如果该重新加载警告提示缓存,请运行 `/reload-plugins --force` 以[在不重启的情况下应用插件更改](#apply-plugin-changes-without-restarting)。

353* 如果插件加载失败,摘要会报告失败,`/plugin` **错误**选项卡显示详情。353* 如果插件加载失败,摘要会报告失败,`/plugin` **错误**选项卡显示详情。

354 354 

355在 v2.1.221 之前,在您运行 `/reload-plugins` 或重启之前,当前会话中没有安装生效。355在 v2.1.221 之前,在您运行 `/reload-plugins` 或重启之前,当前会话中没有安装生效。


393 393 

394您也可以使用直接命令管理插件:394您也可以使用直接命令管理插件:

395 395 

396* 当您运行 `/plugin disable`、`/plugin enable` 或 `/plugin uninstall` 时,Claude Code 会打开插件面板以应用更改并保持其打开。按 **Esc** 以在输入另一个命令之前关闭面板。396* 当您运行 `/plugin disable`、`/plugin enable` 或 `/plugin uninstall` 时,Claude Code 会打开插件面板以应用更改并保持其打开。按 **Esc** 以在输入另一个命令之前关闭面板。[应用插件更改而不重启](#apply-plugin-changes-without-restarting)描述了更改在您的会话中何时生效。

397* 对于脚本编写,请改用 `claude plugin` shell 命令,这些命令不会打开面板。397* 对于脚本编写,请改用 `claude plugin` shell 命令,这些命令不会打开面板。

398 398 

399列出已安装的插件而不打开菜单:399列出已安装的插件而不打开菜单:


437 应用插件更改而不重启437 应用插件更改而不重启

438</h3>438</h3>

439 439 

440当[安装摘要](#install-plugins)报告 `Plugin is now active.` 时,Claude Code 已经激活了插件,您可以跳过此步骤。对于其他所有情况,您在会话期间启用或禁用的插件以及安装摘要报告 `Run /reload-plugins to activate.` 的安装,应用所有更改而不重启:440当您关闭 `/plugin` 菜单时,Claude Code 会为您运行 `/reload-plugins` 以应用您在其中所做的更改,例如安装、启用、禁用和卸载插件。如果重新加载会[使 prompt cache 失效](/docs/zh-CN/prompt-caching#enabling-or-disabling-a-plugin),它会发出警告并改为保留更改待处理;运行 `/reload-plugins --force` 以无论如何应用它们。如果 Claude 在您关闭菜单时仍在响应,重新加载会在响应完成后运行。

441 441 

442```shell theme={null}442对于在菜单外发生的插件更改,请自己运行 `/reload-plugins`。这些更改包括:

443/reload-plugins443 

444```444* 您在另一个终端中运行的 `claude plugin` 命令

445* 编辑您使用 [`--plugin-dir`](/docs/zh-CN/plugins#test-your-plugins-locally) 加载的插件,同时您开发它

446* 插件[自动更新](#configure-auto-updates),其通知要求您重新加载

447* [`--plugin-dir` 文件夹](/docs/zh-CN/plugins#test-your-plugins-locally)中的更改,Claude Code 保留了该更改,因为应用它会使 prompt cache 失效

445 448 

446当重新加载会使 prompt cache 失效时,该命令会发出警告并跳过,直到您使用 `--force` 重新运行它。449在 v2.1.268 之前,您在菜单中启用、禁用或卸载的插件,以及在安装期间未激活的安装,保持待处理状态,直到您运行 `/reload-plugins`。

447 450 

448`/reload-plugins` 也在没有交互式终端的会话中运行,例如桌面应用、Agent SDK 和[非交互式模式](/docs/zh-CN/headless)与 `-p`。需要 Claude Code v2.1.260 或更高版本。这些会话中适用两个限制:451`/reload-plugins` 也在没有交互式终端的会话中运行,例如桌面应用、Agent SDK 和[非交互式模式](/docs/zh-CN/headless)与 `-p`。需要 Claude Code v2.1.260 或更高版本。这些会话中适用两个限制:

449 452 

env-vars.md +1 −1

Details

398| `CLAUDE_CODE_USE_POWERSHELL_TOOL` | 控制 PowerShell 工具。在没有 Git Bash 的 Windows 上,工具自动启用;设置为 `0` 以禁用它。在安装了 Git Bash 的 Windows 上,工具对 claude.ai 和 Console 帐户默认打开;设置为 `1` 以在 Amazon Bedrock、Google Cloud 的 Agent Platform 和 Microsoft Foundry 会话中启用它,或 `0` 以关闭它。在 Linux、macOS 和 WSL 上,设置为 `1` 以启用它,这需要您的 `PATH` 上的 `pwsh`。在 Windows 上启用时,Claude 可以本地运行 PowerShell 命令,而不是通过 Git Bash 路由。请参阅 [PowerShell 工具](/docs/zh-CN/tools-reference#powershell-tool) |398| `CLAUDE_CODE_USE_POWERSHELL_TOOL` | 控制 PowerShell 工具。在没有 Git Bash 的 Windows 上,工具自动启用;设置为 `0` 以禁用它。在安装了 Git Bash 的 Windows 上,工具对 claude.ai 和 Console 帐户默认打开;设置为 `1` 以在 Amazon Bedrock、Google Cloud 的 Agent Platform 和 Microsoft Foundry 会话中启用它,或 `0` 以关闭它。在 Linux、macOS 和 WSL 上,设置为 `1` 以启用它,这需要您的 `PATH` 上的 `pwsh`。在 Windows 上启用时,Claude 可以本地运行 PowerShell 命令,而不是通过 Git Bash 路由。请参阅 [PowerShell 工具](/docs/zh-CN/tools-reference#powershell-tool) |

399| `CLAUDE_CODE_USE_VERTEX` | 使用 [Google Cloud 的 Agent Platform](/docs/zh-CN/google-vertex-ai) |399| `CLAUDE_CODE_USE_VERTEX` | 使用 [Google Cloud 的 Agent Platform](/docs/zh-CN/google-vertex-ai) |

400| `CLAUDE_CODE_WEBFETCH_CACHE_TTL_MS` | 设置为 [WebFetch](/docs/zh-CN/tools-reference#webfetch-tool-behavior) 保持每个获取 URL 响应缓存的毫秒数。默认值为 `900000`,即 15 分钟。仅接受纯数字;`0`、小数或任何其他拼写保持默认值。Claude Code 每次启动读取一次值,因此设置 `env` 块中的更改在您下次启动 `claude` 时适用。需要 Claude Code v2.1.233 或更高版本 |400| `CLAUDE_CODE_WEBFETCH_CACHE_TTL_MS` | 设置为 [WebFetch](/docs/zh-CN/tools-reference#webfetch-tool-behavior) 保持每个获取 URL 响应缓存的毫秒数。默认值为 `900000`,即 15 分钟。仅接受纯数字;`0`、小数或任何其他拼写保持默认值。Claude Code 每次启动读取一次值,因此设置 `env` 块中的更改在您下次启动 `claude` 时适用。需要 Claude Code v2.1.233 或更高版本 |

401| `CLAUDE_CODE_WEBFETCH_DEADLINE_MS` | [WebFetch](/docs/zh-CN/tools-reference#webfetch-tool-behavior) 等待页面下载的上限(毫秒),包括它遵循的任何重定向。未在此时间内完成的下载失败,显示截止时间错误。默认值为 `300000`,即五分钟。设置为 `0` 以删除限制。仅接受纯数字;小数或任何其他拼写保持默认值。需要 Claude Code v2.1.268 或更高版本 |

401| `CLAUDE_CODE_WORKFLOW_PREFIX_STAGGER_MS` | [工作流](/docs/zh-CN/workflows) 代理等待同前缀兄弟的第一个响应开始的时间上限(毫秒),然后发送自己的第一个请求。当扇出启动共享 [提示缓存前缀](/docs/zh-CN/workflows#prompt-caching-in-a-fan-out) 的多个代理时,Claude Code 将除第一个代理外的所有代理保持最多这么长时间,以便其余代理读取缓存的前缀而不是每个未缓存处理它。默认 `5000`。设置为 `0` 以禁用等待。当 `DISABLE_PROMPT_CACHING` 被设置时,代理永远不会等待。需要 Claude Code v2.1.229 或更高版本 |402| `CLAUDE_CODE_WORKFLOW_PREFIX_STAGGER_MS` | [工作流](/docs/zh-CN/workflows) 代理等待同前缀兄弟的第一个响应开始的时间上限(毫秒),然后发送自己的第一个请求。当扇出启动共享 [提示缓存前缀](/docs/zh-CN/workflows#prompt-caching-in-a-fan-out) 的多个代理时,Claude Code 将除第一个代理外的所有代理保持最多这么长时间,以便其余代理读取缓存的前缀而不是每个未缓存处理它。默认 `5000`。设置为 `0` 以禁用等待。当 `DISABLE_PROMPT_CACHING` 被设置时,代理永远不会等待。需要 Claude Code v2.1.229 或更高版本 |

402| `CLAUDE_CONFIG_DIR` | 覆盖配置目录(默认值:`~/.claude`)。所有设置、会话历史和插件都存储在此路径下。对于凭证,请参阅 [Claude Code 存储凭证的位置](/docs/zh-CN/authentication#credential-management)。对于并行运行多个帐户很有用:例如,`alias claude-work='CLAUDE_CONFIG_DIR=~/.claude-work claude'`。在您的 shell、用户设置或托管设置中设置它。在 [项目和本地设置](/docs/zh-CN/settings-reference#variables-claude-code-ignores-in-env) 中被忽略 |403| `CLAUDE_CONFIG_DIR` | 覆盖配置目录(默认值:`~/.claude`)。所有设置、会话历史和插件都存储在此路径下。对于凭证,请参阅 [Claude Code 存储凭证的位置](/docs/zh-CN/authentication#credential-management)。对于并行运行多个帐户很有用:例如,`alias claude-work='CLAUDE_CONFIG_DIR=~/.claude-work claude'`。在您的 shell、用户设置或托管设置中设置它。在 [项目和本地设置](/docs/zh-CN/settings-reference#variables-claude-code-ignores-in-env) 中被忽略 |

403| `CLAUDE_DISABLE_ADOPT` | 设置为 `1` 以在通过按 `←` 或使用 [`/background`](/docs/zh-CN/agent-view#from-inside-a-session) 后台处理会话时停止进行中的后台工作,而不是将其进行。Claude Code 要求您在后台处理前确认,然后停止会进行的任务。需要 Claude Code v2.1.195 或更高版本 |404| `CLAUDE_DISABLE_ADOPT` | 设置为 `1` 以在通过按 `←` 或使用 [`/background`](/docs/zh-CN/agent-view#from-inside-a-session) 后台处理会话时停止进行中的后台工作,而不是将其进行。Claude Code 要求您在后台处理前确认,然后停止会进行的任务。需要 Claude Code v2.1.195 或更高版本 |


525* 默认为 claude.ai 和 Console 账户在安装了 Git Bash 的 Windows 上获取 [PowerShell 工具](/docs/zh-CN/tools-reference#powershell-tool);Claude Code 通过 Git Bash 路由 shell 命令,除非你设置 `CLAUDE_CODE_USE_POWERSHELL_TOOL=1`。在没有 Git Bash 的 Windows 上,该工具保持启用526* 默认为 claude.ai 和 Console 账户在安装了 Git Bash 的 Windows 上获取 [PowerShell 工具](/docs/zh-CN/tools-reference#powershell-tool);Claude Code 通过 Git Bash 路由 shell 命令,除非你设置 `CLAUDE_CODE_USE_POWERSHELL_TOOL=1`。在没有 Git Bash 的 Windows 上,该工具保持启用

526* 获取 [Claude 草拟的反馈](/docs/zh-CN/tools-reference#sendfeedback-tool-behavior),Claude Code 通过获取的标志来启用它527* 获取 [Claude 草拟的反馈](/docs/zh-CN/tools-reference#sendfeedback-tool-behavior),Claude Code 通过获取的标志来启用它

527* 让 Claude Code [排除 MCP 工具,其输入架构 API 会拒绝](/docs/zh-CN/mcp#tools-with-invalid-input-schemas);它仍然发送架构,包含它的请求失败并显示[按工具位置命名的 400 错误](/docs/zh-CN/errors#tool-input-schema-is-invalid)528* 让 Claude Code [排除 MCP 工具,其输入架构 API 会拒绝](/docs/zh-CN/mcp#tools-with-invalid-input-schemas);它仍然发送架构,包含它的请求失败并显示[按工具位置命名的 400 错误](/docs/zh-CN/errors#tool-input-schema-is-invalid)

528* 让恢复的对话[保留其记录的系统提示](/docs/zh-CN/cli-reference#system-prompt-flags-in-resumed-conversations);Claude Code 在每个请求上重建提示,`--system-prompt-snapshot` 无效

529 529 

530<h3 id="first-session-after-an-install-or-upgrade">530<h3 id="first-session-after-an-install-or-upgrade">

531 安装或升级后的第一个会话531 安装或升级后的第一个会话

Details

41* **MCP servers**:[来自 claude.ai 的连接器](/docs/zh-CN/mcp#use-mcp-servers-from-claude-ai)仅在您的 claude.ai 订阅是活跃身份验证方法时加载。[工具搜索](/docs/zh-CN/mcp#configure-tool-search)在 `ANTHROPIC_BASE_URL` 指向非第一方主机时默认关闭,在 Google Cloud's Agent Platform 上早于 Claude 4.5 代的模型或在 Microsoft Foundry [部署在 Azure 上](https://platform.claude.com/docs/en/build-with-claude/claude-in-microsoft-foundry#hosting-options)时不受支持41* **MCP servers**:[来自 claude.ai 的连接器](/docs/zh-CN/mcp#use-mcp-servers-from-claude-ai)仅在您的 claude.ai 订阅是活跃身份验证方法时加载。[工具搜索](/docs/zh-CN/mcp#configure-tool-search)在 `ANTHROPIC_BASE_URL` 指向非第一方主机时默认关闭,在 Google Cloud's Agent Platform 上早于 Claude 4.5 代的模型或在 Microsoft Foundry [部署在 Azure 上](https://platform.claude.com/docs/en/build-with-claude/claude-in-microsoft-foundry#hosting-options)时不受支持

42* **Subagents**:内置的 [Explore subagent](/docs/zh-CN/sub-agents#built-in-subagents) 在 Claude API 上将其继承的模型限制为 Opus,在任何其他提供商(包括 Claude Platform on AWS)上直接继承主对话的模型42* **Subagents**:内置的 [Explore subagent](/docs/zh-CN/sub-agents#built-in-subagents) 在 Claude API 上将其继承的模型限制为 Opus,在任何其他提供商(包括 Claude Platform on AWS)上直接继承主对话的模型

43* **[Commands](/docs/zh-CN/commands#all-commands)**:43* **[Commands](/docs/zh-CN/commands#all-commands)**:

44 * `/design-sync` 和 `/import` 及其 `claude import` 子命令形式在 Amazon Bedrock、Google Cloud's Agent Platform、Microsoft Foundry 和 Claude Platform on AWS 上不可用44 * `/design-sync` 和 `/import` 及其 `claude import` 子命令形式在 Amazon Bedrock、Google Cloud's Agent Platform、Microsoft Foundry 和 Claude Platform on AWS 上不可用,以及通过 [Claude apps gateway](/docs/zh-CN/claude-apps-gateway#availability-and-limitations)

45 * `/voice` 需要 claude.ai 账户45 * `/voice` 需要 claude.ai 账户

46 * `/list-agents` 及其别名 `/peers` 仅在[启用了跨会话消息传递](/docs/zh-CN/cross-session-messaging#availability)的会话中可用46 * `/list-agents` 及其别名 `/peers` 仅在[启用了跨会话消息传递](/docs/zh-CN/cross-session-messaging#availability)的会话中可用

47 47 

fullscreen.md +4 −2

Details

33 * 如果您倒带到第一条消息之前,Claude Code 会以空对话重新启动33 * 如果您倒带到第一条消息之前,Claude Code 会以空对话重新启动

34* 您的[权限模式](/docs/zh-CN/permission-modes)和[努力级别](/docs/zh-CN/model-config#adjust-effort-level)34* 您的[权限模式](/docs/zh-CN/permission-modes)和[努力级别](/docs/zh-CN/model-config#adjust-effort-level)

35* 您最后用 [`/model`](/docs/zh-CN/model-config#setting-your-model) 选择的模型35* 您最后用 [`/model`](/docs/zh-CN/model-config#setting-your-model) 选择的模型

36* 您用 [`--allowed-tools` 或 `--disallowed-tools`](/docs/zh-CN/cli-reference#cli-flags) 传递的规则,以及您的 `--agent`、`--agents` 和 `--append-system-prompt` 标志36* 您用 [`--allowed-tools` 或 `--disallowed-tools`](/docs/zh-CN/cli-reference#cli-flags) 传递的规则,以及您的 `--agent`、`--agents`、`--append-system-prompt` 和 `--system-prompt-snapshot` 标志

37 37 

38如果会话有一个限制条件无法传递到重新启动的进程,Claude Code 会拒绝重新启动。无法传递的限制条件包括:38如果会话有一个限制条件无法传递到重新启动的进程,Claude Code 会拒绝重新启动。无法传递的限制条件包括:

39 39 


149 149 

150这些操作可重新绑定。有关完整的操作名称列表(包括没有默认绑定的半页和全页变体),请参阅[滚动操作](/docs/zh-CN/keybindings#scroll-actions)。150这些操作可重新绑定。有关完整的操作名称列表(包括没有默认绑定的半页和全页变体),请参阅[滚动操作](/docs/zh-CN/keybindings#scroll-actions)。

151 151 

152当您向上滚动时,对话顶部的一个暗淡标题行显示已滚动到视图上方的最新提示。点击该行可跳转到该提示。

153 

152<h3 id="auto-follow">154<h3 id="auto-follow">

153 自动跟随155 自动跟随

154</h3>156</h3>


179 181 

180值 `3` 与 `vim` 和类似应用程序中的默认值匹配。该设置接受任何正值,最高为 20,包括低于 1 的分数值,例如 `0.25` 以减慢已经放大滚轮事件的终端中的加速触控板和滚轮滚动。182值 `3` 与 `vim` 和类似应用程序中的默认值匹配。该设置接受任何正值,最高为 20,包括低于 1 的分数值,例如 `0.25` 以减慢已经放大滚轮事件的终端中的加速触控板和滚轮滚动。

181 183 

182要交互式调整滚动速度,运行 `/scroll-speed`。对话框显示一个标尺,您可以在其打开时滚动以立即感受变化。按 `←` 和 `→` 调整速度,按 `r` 重置为自动检测的默认值,按 `Enter` 保存。对话框以整数步长增加到 10,在支持更精细控制的终端上,它还提供四分之一步长,最低为 0.25。四分之一步长需要 Claude Code v2.1.172 或更高版本。184要交互式调整滚动速度,运行 `/scroll-speed`。对话框显示一个标尺,您可以在其打开时滚动以立即感受变化。按 `←` 和 `→` 调整速度,按 `r` 重置为自动检测的默认值,按 `Enter` 保存。对话框以整数步长增加到 10,在支持更精细控制的终端上,它还提供四分之一步长,最低为 0.25。

183 185 

184该命令写入与 `CLAUDE_CODE_SCROLL_SPEED` 环境变量设置相同的值,持久化到 `~/.claude/settings.json`。对话框的最大值是 10:如果您通过环境变量设置更高的值,对话框显示 10,从对话框保存会持久化 10。该命令在 JetBrains IDE 终端中不可用。186该命令写入与 `CLAUDE_CODE_SCROLL_SPEED` 环境变量设置相同的值,持久化到 `~/.claude/settings.json`。对话框的最大值是 10:如果您通过环境变量设置更高的值,对话框显示 10,从对话框保存会持久化 10。该命令在 JetBrains IDE 终端中不可用。

185 187 

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# 通过云提供商使用 Claude Code GitHub Actions

6 

7> 通过 Amazon Bedrock、Google Cloud 的 Agent Platform 或 Microsoft Foundry 而不是 Claude API 运行 Claude Code GitHub Actions

8 

9[Claude Code GitHub Actions](/docs/zh-CN/github-actions) 默认调用 Claude API。要改为通过您自己的云账户路由推理,请设置 Claude Code GitHub Action 的 provider 输入,并配置您的云以信任工作流的 OpenID Connect (OIDC) 令牌。工作流使用该令牌进行身份验证,因此您无需在存储库中存储长期的云凭证。

10 

11<Info>

12 本页基于 [GitHub Actions 设置](/docs/zh-CN/github-actions#setup)。它假设您已经了解工作流文件和 `anthropics/claude-code-action` 步骤,仅涵盖云提供商所做的更改。

13</Info>

14 

15<h2 id="choose-your-provider">

16 选择您的提供商

17</h2>

18 

19Claude Code GitHub Action 支持三个提供商,下面的设置步骤仅在云端配置上有所不同。使用您的组织已经拥有 Claude 模型访问权限的提供商。您通过在 `anthropics/claude-code-action` 步骤的 `with:` 块中的一个输入来告诉 Claude Code GitHub Action 使用哪个提供商:

20 

21* **Amazon Bedrock**: `use_bedrock: "true"`

22* **Google Cloud 的 Agent Platform**: `use_vertex: "true"`

23* **Microsoft Foundry**: `use_foundry: "true"`

24 

25[设置集成](#set-up-the-integration) 下的完整工作流示例已经包含了每个提供商的输入。

26 

27<h2 id="prerequisites">

28 前置条件

29</h2>

30 

31在开始之前,您需要:

32 

33* 对运行 Claude Code GitHub Action 的存储库的管理员访问权限,以安装 GitHub App 并添加密钥

34* 在您的云账户中创建身份资源的权限:AWS 上的 IAM 角色和 OIDC 身份提供商、Google Cloud 上的 Workload Identity Federation 资源和服务账户,或 Azure 上的 Microsoft Entra 应用程序

35* 在您的提供商上拥有 Claude 模型访问权限:

36 * **Amazon Bedrock**: 获得对 Claude 模型的访问权限。跨区域推理配置文件,例如本页示例中的 `us.` 模型 ID,需要在其区域组的每个区域中获得访问权限。请参阅 [Amazon Bedrock 上的 Claude Code](/docs/zh-CN/amazon-bedrock)

37 * **Google Cloud 的 Agent Platform**: 一个启用了 Agent Platform API 的项目以及对 Claude 模型的访问权限。请参阅 [Google Cloud 的 Agent Platform 上的 Claude Code](/docs/zh-CN/google-vertex-ai)

38 * **Microsoft Foundry**: 一个具有 Claude 模型部署的 Foundry 资源。请参阅 [Microsoft Foundry 上的 Claude Code](/docs/zh-CN/microsoft-foundry)

39 

40<h2 id="set-up-the-integration">

41 设置集成

42</h2>

43 

44除了前置条件外,您需要创建四样东西:Claude Code GitHub Action 的 GitHub 身份、云端信任配置、存储库密钥和工作流文件。下面的步骤将逐一介绍每一项。

45 

46<Steps>

47 <Step title="选择 GitHub 身份">

48 Claude Code GitHub Action 通过 GitHub 身份推送提交和发布评论。[快速设置](/docs/zh-CN/github-actions#quick-setup) 为此安装了官方 Claude GitHub App。使用云提供商时,您可以自己选择身份:

49 

50 * **官方 [Claude GitHub App](https://github.com/apps/claude)**: 在存储库上安装它,或如果已经安装,请跳到下一步

51 * **自定义 GitHub App**: 当您只想要 Claude Code GitHub Action 使用的三个权限而不是[官方应用的完整权限集](/docs/zh-CN/github-actions#github-app-permissions)时,创建您自己的应用,如下所述

52 * **GitHub 的自动 `GITHUB_TOKEN`**: 无需创建或安装应用,但 GitHub 不会在使用它进行的提交上触发您的 CI 工作流

53 

54 第四步中的工作流示例使用自定义应用进行身份验证。该步骤还说明了如何为其他两个选项进行更改。

55 

56 要创建自定义应用,[注册一个新的 GitHub App](https://docs.github.com/en/apps/creating-github-apps/registering-a-github-app/registering-a-github-app),禁用 webhooks,因为此集成不使用它们。授予它三个存储库权限:

57 

58 * **Contents**: 读和写

59 * **Issues**: 读和写

60 * **Pull requests**: 读和写

61 

62 注册应用后,生成一个私钥并保留下载的 `.pem` 文件,从应用的设置页面记下应用 ID,并在运行 Claude Code GitHub Action 的存储库上[安装应用](https://docs.github.com/en/apps/using-github-apps/installing-your-own-github-app)。您将在第三步中将密钥和 ID 添加为密钥。

63 </Step>

64 

65 <Step title="配置云身份验证">

66 配置您的云以信任 GitHub 向工作流颁发的 OIDC 令牌,以便每个工作流运行都获得短期的云凭证。每个选项卡中的项目总结了要创建的内容,每个选项卡都链接到云供应商自己的控制台级步骤指南。

67 

68 <Tabs>

69 <Tab title="Amazon Bedrock">

70 在您的 AWS 账户中创建信任配置,遵循 [AWS 创建 OIDC 身份提供商指南](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_create_oidc.html):

71 

72 * 添加一个 GitHub OIDC 身份提供商,提供商 URL 为 `https://token.actions.githubusercontent.com`,受众为 `sts.amazonaws.com`

73 * 创建一个由该提供商作为 Web 身份信任的 IAM 角色,并附加来自 [IAM 配置](/docs/zh-CN/amazon-bedrock#iam-configuration) 的作用域调用策略,该策略授予 `bedrock:InvokeModel`、`bedrock:InvokeModelWithResponseStream`、`bedrock:ListInferenceProfiles` 和 `bedrock:GetInferenceProfile`,以及两个 `aws-marketplace` 订阅操作

74 * 使用主题条件(例如 `repo:your-org/your-repo:*`)将角色的信任策略限制在您的存储库。有关声明格式,请参阅 [GitHub 的 OIDC 加固指南](https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/about-security-hardening-with-openid-connect)

75 

76 记下角色的 ARN。您将在下一步中将其添加为密钥。

77 </Tab>

78 

79 <Tab title="Google Cloud 的 Agent Platform">

80 在您的 Google Cloud 项目中创建联合资源,遵循 [Workload Identity Federation 文档](https://cloud.google.com/iam/docs/workload-identity-federation):

81 

82 * 启用三个 API:IAM Credentials、Security Token Service (STS) 和 Agent Platform API,其服务名称为 `aiplatform.googleapis.com`

83 * 创建一个 Workload Identity Pool,其中包含一个 GitHub OIDC 提供商,其颁发者为 `https://token.actions.githubusercontent.com`,并添加一个属性条件,将池限制在您的存储库

84 * 创建一个仅具有 `Vertex AI User` 角色(即 `roles/aiplatform.user`)的专用服务账户,并允许池模拟它

85 

86 记下提供商的完整资源名称和服务账户的电子邮件地址。您将在下一步中将它们添加为密钥。

87 </Tab>

88 

89 <Tab title="Microsoft Foundry">

90 创建一个 Microsoft Entra 应用程序,其中包含您的存储库的联合凭证,遵循 [Microsoft 的 GitHub Actions 身份验证指南](https://learn.microsoft.com/en-us/azure/developer/github/connect-from-azure-openid-connect):

91 

92 * 注册一个 Microsoft Entra 应用程序,并添加一个联合身份凭证,该凭证信任 GitHub 向您的存储库颁发的令牌。用户分配的托管身份可以代替应用程序。两者都有您在下面记下的客户端 ID

93 * 在您的 Foundry 资源上为应用程序分配 `Azure AI User` 角色。有关更窄的自定义角色,请参阅 [Azure RBAC 配置](/docs/zh-CN/microsoft-foundry#azure-rbac-configuration)

94 

95 记下应用程序的客户端 ID、您的租户 ID 和您的订阅 ID。您将在下一步中将它们添加为密钥。

96 </Tab>

97 </Tabs>

98 </Step>

99 

100 <Step title="添加存储库密钥">

101 在运行 Claude Code GitHub Action 的存储库中,为您的提供商添加密钥,如果您在第一步中创建了自定义 GitHub App,还要添加两个应用密钥。请参阅 GitHub 的 [在 GitHub Actions 中使用密钥指南](https://docs.github.com/en/actions/security-guides/using-secrets-in-github-actions)。

102 

103 | 密钥 | 需要用于 | 值 |

104 | -------------------------------- | ----------------------------- | ------------------------ |

105 | `AWS_ROLE_TO_ASSUME` | Amazon Bedrock | IAM 角色的 ARN |

106 | `GCP_WORKLOAD_IDENTITY_PROVIDER` | Google Cloud 的 Agent Platform | 提供商的完整资源名称 |

107 | `GCP_SERVICE_ACCOUNT` | Google Cloud 的 Agent Platform | 服务账户的电子邮件地址 |

108 | `AZURE_CLIENT_ID` | Microsoft Foundry | Entra 应用程序的客户端 ID |

109 | `AZURE_TENANT_ID` | Microsoft Foundry | 您的 Microsoft Entra 租户 ID |

110 | `AZURE_SUBSCRIPTION_ID` | Microsoft Foundry | 您的 Azure 订阅 ID |

111 | `APP_ID` | 自定义 GitHub App | GitHub App 的 ID |

112 | `APP_PRIVATE_KEY` | 自定义 GitHub App | `.pem` 私钥文件的内容 |

113 </Step>

114 

115 <Step title="创建工作流文件">

116 为您的提供商创建一个工作流文件,例如 `.github/workflows/claude.yml`。每个示例都响应 `@claude` 提及,使用自定义应用向 GitHub 进行身份验证,并包含 `id-token: write` 权限,GitHub 需要此权限来颁发 OIDC 令牌,您的云提供商可以用它来交换凭证。

117 

118 如果您在第一步中选择了不同的 GitHub 身份,请调整示例:

119 

120 * **官方 Claude GitHub App**: 删除生成 GitHub App 令牌步骤和 `github_token` 行

121 * **GitHub 的自动令牌**: 删除令牌生成步骤,并将 `github_token` 行更改为 `github_token: ${{ secrets.GITHUB_TOKEN }}`

122 

123 <Warning>

124 在公共存储库上,来自任何用户的包含触发短语的评论会启动此工作流。凭证步骤在 Claude Code GitHub Action 检查评论者的写入访问权限之前运行,因此该操作仅在工作流生成应用令牌并登录到您的云提供商后才拒绝未授权用户,这会留下审计日志条目并消耗 Actions 分钟。为了避免这些运行,请添加一个步骤,在凭证步骤之前验证评论者的写入访问权限。

125 </Warning>

126 

127 <Tabs>

128 <Tab title="Amazon Bedrock">

129 将 `aws-region` 值替换为您自己的值。凭证步骤将其导出为 `AWS_REGION` 供作业的其余部分使用。

130 

131 ```yaml theme={null}

132 name: Claude PR Action

133 

134 permissions:

135 contents: write

136 pull-requests: write

137 issues: write

138 id-token: write

139 

140 on:

141 issue_comment:

142 types: [created]

143 pull_request_review_comment:

144 types: [created]

145 issues:

146 types: [opened]

147 

148 jobs:

149 claude-pr:

150 if: |

151 (github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) ||

152 (github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude')) ||

153 (github.event_name == 'issues' && (contains(github.event.issue.body, '@claude') || contains(github.event.issue.title, '@claude')))

154 runs-on: ubuntu-latest

155 steps:

156 - name: Checkout repository

157 uses: actions/checkout@v6

158 

159 - name: Generate GitHub App token

160 id: app-token

161 uses: actions/create-github-app-token@v2

162 with:

163 app-id: ${{ secrets.APP_ID }}

164 private-key: ${{ secrets.APP_PRIVATE_KEY }}

165 

166 - name: Configure AWS Credentials (OIDC)

167 uses: aws-actions/configure-aws-credentials@v4

168 with:

169 role-to-assume: ${{ secrets.AWS_ROLE_TO_ASSUME }}

170 aws-region: us-west-2

171 

172 - uses: anthropics/claude-code-action@v1

173 with:

174 github_token: ${{ steps.app-token.outputs.token }}

175 use_bedrock: "true"

176 claude_args: '--model us.anthropic.claude-sonnet-4-6'

177 ```

178 

179 <Tip>

180 Bedrock 模型 ID 包含跨区域推理配置文件前缀,例如 `us.`。使用您授予模型访问权限的区域组的前缀。

181 </Tip>

182 </Tab>

183 

184 <Tab title="Google Cloud 的 Agent Platform">

185 将 `CLOUD_ML_REGION` 值替换为您自己的值。您无需硬编码项目 ID,因为工作流从 `auth` 步骤的输出中读取它。

186 

187 ```yaml theme={null}

188 name: Claude PR Action

189 

190 permissions:

191 contents: write

192 pull-requests: write

193 issues: write

194 id-token: write

195 

196 on:

197 issue_comment:

198 types: [created]

199 pull_request_review_comment:

200 types: [created]

201 issues:

202 types: [opened]

203 

204 jobs:

205 claude-pr:

206 if: |

207 (github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) ||

208 (github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude')) ||

209 (github.event_name == 'issues' && (contains(github.event.issue.body, '@claude') || contains(github.event.issue.title, '@claude')))

210 runs-on: ubuntu-latest

211 steps:

212 - name: Checkout repository

213 uses: actions/checkout@v6

214 

215 - name: Generate GitHub App token

216 id: app-token

217 uses: actions/create-github-app-token@v2

218 with:

219 app-id: ${{ secrets.APP_ID }}

220 private-key: ${{ secrets.APP_PRIVATE_KEY }}

221 

222 - name: Authenticate to Google Cloud

223 id: auth

224 uses: google-github-actions/auth@v2

225 with:

226 workload_identity_provider: ${{ secrets.GCP_WORKLOAD_IDENTITY_PROVIDER }}

227 service_account: ${{ secrets.GCP_SERVICE_ACCOUNT }}

228 

229 - uses: anthropics/claude-code-action@v1

230 with:

231 github_token: ${{ steps.app-token.outputs.token }}

232 use_vertex: "true"

233 claude_args: '--model claude-sonnet-5'

234 env:

235 ANTHROPIC_VERTEX_PROJECT_ID: ${{ steps.auth.outputs.project_id }}

236 CLOUD_ML_REGION: us-east5

237 ```

238 </Tab>

239 

240 <Tab title="Microsoft Foundry">

241 将 `your-resource-name` 替换为您的 Foundry 资源名称。Claude Code 从它构建端点 URL。`azure/login` 步骤使用工作流的 OIDC 令牌登录,Claude Code 通过 Azure [默认凭证链](https://learn.microsoft.com/en-us/azure/developer/javascript/sdk/authentication/credential-chains#defaultazurecredential-overview) 获取凭证。

242 

243 ```yaml theme={null}

244 name: Claude PR Action

245 

246 permissions:

247 contents: write

248 pull-requests: write

249 issues: write

250 id-token: write

251 

252 on:

253 issue_comment:

254 types: [created]

255 pull_request_review_comment:

256 types: [created]

257 issues:

258 types: [opened]

259 

260 jobs:

261 claude-pr:

262 if: |

263 (github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) ||

264 (github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude')) ||

265 (github.event_name == 'issues' && (contains(github.event.issue.body, '@claude') || contains(github.event.issue.title, '@claude')))

266 runs-on: ubuntu-latest

267 steps:

268 - name: Checkout repository

269 uses: actions/checkout@v6

270 

271 - name: Generate GitHub App token

272 id: app-token

273 uses: actions/create-github-app-token@v2

274 with:

275 app-id: ${{ secrets.APP_ID }}

276 private-key: ${{ secrets.APP_PRIVATE_KEY }}

277 

278 - name: Authenticate to Azure

279 uses: azure/login@v2

280 with:

281 client-id: ${{ secrets.AZURE_CLIENT_ID }}

282 tenant-id: ${{ secrets.AZURE_TENANT_ID }}

283 subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}

284 

285 - uses: anthropics/claude-code-action@v1

286 with:

287 github_token: ${{ steps.app-token.outputs.token }}

288 use_foundry: "true"

289 claude_args: '--model claude-sonnet-5'

290 env:

291 ANTHROPIC_FOUNDRY_RESOURCE: your-resource-name

292 ```

293 

294 <Tip>

295 使用与您的 Foundry 资源中的 Claude 部署相匹配的模型 ID。有关模型配置和版本固定,请参阅 [Microsoft Foundry 上的 Claude Code](/docs/zh-CN/microsoft-foundry)。

296 </Tip>

297 </Tab>

298 </Tabs>

299 

300 对于任何提供商,您可以通过将 `--max-turns` 添加到 `claude_args` 来限制运行长度和成本。请参阅 [管理成本](/docs/zh-CN/github-actions#manage-costs)。

301 </Step>

302 

303 <Step title="测试设置">

304 在问题或 PR 评论中提及 `@claude`,然后在存储库的 Actions 选项卡中观看运行。Claude 在同一问题或 PR 上的评论中回复。

305 </Step>

306</Steps>

307 

308<h2 id="troubleshooting">

309 故障排除

310</h2>

311 

312失败的运行通常在以下两个地方之一中断:

313 

314* **身份验证错误**: 通常是 OIDC 配置错误。检查工作流是否包含 `id-token: write` 权限,信任配置的存储库条件是否与您的存储库完全匹配,以及工作流中的密钥名称是否与您添加的名称匹配

315* **触发和 CI 问题**: 这些的行为与 Claude Code GitHub Action 调用 Claude API 时相同。请参阅主页的[故障排除部分](/docs/zh-CN/github-actions#troubleshooting)和 Claude Code GitHub Action 的 [FAQ](https://github.com/anthropics/claude-code-action/blob/main/docs/faq.md)

316 

317<h2 id="what’s-next">

318 接下来

319</h2>

320 

321* [Claude Code GitHub Actions](/docs/zh-CN/github-actions) 获取示例、参数和最佳实践

322* [Amazon Bedrock 上的 Claude Code](/docs/zh-CN/amazon-bedrock) 获取 Bedrock 模型 ID 和区域

323* [Google Cloud 的 Agent Platform 上的 Claude Code](/docs/zh-CN/google-vertex-ai) 获取 Agent Platform 模型 ID 和区域

324* [Microsoft Foundry 上的 Claude Code](/docs/zh-CN/microsoft-foundry) 获取 Foundry 模型和端点配置

headless.md +1 −1

Details

298要为整个会话设置基线而不是列出单个工具,请传递 [权限模式](/docs/zh-CN/permission-modes)。对于 `-p`,[内置启动权限模式](/docs/zh-CN/permission-modes#which-mode-a-session-starts-in) 在每个计划上都是 Manual,因此传递您想要的权限模式:298要为整个会话设置基线而不是列出单个工具,请传递 [权限模式](/docs/zh-CN/permission-modes)。对于 `-p`,[内置启动权限模式](/docs/zh-CN/permission-modes#which-mode-a-session-starts-in) 在每个计划上都是 Manual,因此传递您想要的权限模式:

299 299 

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

301* **`dontAsk`**:Claude Code 拒绝您的 `permissions.allow` 规则或 [只读命令集](/docs/zh-CN/permissions#read-only-commands) 中未包含的任何内容,这对于锁定的 CI 运行很有用。`AskUserQuestion`、连接器工具 [您的组织设置为 `ask`](/docs/zh-CN/mcp#organization-controls-on-connector-tools) 和标记为 [`requiresUserInteraction`](/docs/zh-CN/mcp#require-approval-for-a-specific-tool) 的 MCP 工具即使当允许规则匹配时也被拒绝301* **`dontAsk`**:Claude Code 拒绝任何会提示的内容,除非 `permissions.allow` 规则或 [只读命令集](/docs/zh-CN/permissions#read-only-commands) 中包含它,这对于锁定的 CI 运行很有用。`AskUserQuestion`、连接器工具 [您的组织设置为 `ask`](/docs/zh-CN/mcp#organization-controls-on-connector-tools) 和标记为 [`requiresUserInteraction`](/docs/zh-CN/mcp#require-approval-for-a-specific-tool) 的 MCP 工具即使当允许规则匹配时也被拒绝

302* **`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)302* **`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)

303 303 

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

hooks-guide.md +41 −36

Details

499 499 

500Claude Code 在其生命周期中的特定点触发 hook 事件。当事件触发时,所有匹配的 hooks 并行运行;有关重复处理程序如何处理的信息,请参阅 [Hook 处理程序字段](/docs/zh-CN/hooks#hook-handler-fields)。下表显示每个事件及其触发时间:500Claude Code 在其生命周期中的特定点触发 hook 事件。当事件触发时,所有匹配的 hooks 并行运行;有关重复处理程序如何处理的信息,请参阅 [Hook 处理程序字段](/docs/zh-CN/hooks#hook-handler-fields)。下表显示每个事件及其触发时间:

501 501 

502| Event | When it fires |502| 事件 | 触发时机 |

503| :-------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |503| :-------------------- | :--------------------------------------------------------------------------------------------------------------------- |

504| `SessionStart` | When a session begins or resumes |504| `SessionStart` | 当会话开始或恢复时 |

505| `Setup` | When you start Claude Code with `--init-only`, or with `--init` or `--maintenance` in `-p` mode. For one-time preparation in CI or scripts |505| `Setup` | 当你使用 `--init-only` 启动 Claude Code,或在 `-p` 模式下使用 `--init` 或 `--maintenance` 时。用于 CI 或脚本中的一次性准备 |

506| `UserPromptSubmit` | When you submit a prompt, before Claude processes it |506| `UserPromptSubmit` | 当你提交提示词时,在 Claude 处理之前 |

507| `UserPromptExpansion` | When a user-typed command expands into a prompt, before it reaches Claude. Can block the expansion |507| `UserPromptExpansion` | 当用户输入的命令扩展为提示词时,在到达 Claude 之前。可以阻止扩展 |

508| `PreToolUse` | Before a tool call executes. Can block it |508| `PreToolUse` | 在工具调用执行之前。可以阻止它 |

509| `PermissionRequest` | When a tool call needs a permission decision |509| `PermissionRequest` | 当工具调用需要权限决策时 |

510| `PermissionDenied` | When auto mode denies a tool call, including denials without a classifier verdict. Use JSON `hookSpecificOutput.retry: true` to tell the model it may retry the denied tool call. Claude Code ignores `retry` when the classifier produced no verdict |510| `PermissionDenied` | 当自动模式拒绝工具调用时,包括没有分类器判决的拒绝。使用 JSON `hookSpecificOutput.retry: true` 来告诉模型它可以重试被拒绝的工具调用。Claude Code 在分类器未产生判决时忽略 `retry` |

511| `PostToolUse` | After a tool call succeeds |511| `PostToolUse` | 在工具调用成功后 |

512| `PostToolUseFailure` | After a tool call fails |512| `PostToolUseFailure` | 在工具调用失败后 |

513| `PostToolBatch` | After a full batch of parallel tool calls resolves, before the next model call |513| `PostToolBatch` | 在一整批并行工具调用解决后,在下一次模型调用之前 |

514| `Notification` | When Claude Code sends a notification |514| `Notification` | 当 Claude Code 发送通知时 |

515| `MessageDisplay` | While assistant message text is displayed |515| `MessageDisplay` | 当助手消息文本正在显示时 |

516| `SubagentStart` | When a subagent is spawned |516| `SubagentStart` | 当子代理被生成时 |

517| `SubagentStop` | When a subagent finishes |517| `SubagentStop` | 当子代理完成时 |

518| `TaskCreated` | When a task is being created via `TaskCreate` |518| `TaskCreated` | 当通过 `TaskCreate` 创建任务时 |

519| `TaskCompleted` | When a task is being marked as completed |519| `TaskCompleted` | 当任务被标记为已完成时 |

520| `Stop` | When Claude finishes responding |520| `Stop` | 当 Claude 完成响应时 |

521| `StopFailure` | When the turn ends due to an API error |521| `StopFailure` | 当轮次因 API 错误而结束时 |

522| `TeammateIdle` | When an [agent team](/docs/en/agent-teams) teammate is about to go idle |522| `TeammateIdle` | 当[代理团队](/docs/zh-CN/agent-teams)队友即将空闲时 |

523| `InstructionsLoaded` | When a CLAUDE.md or `.claude/rules/*.md` file is loaded into context. Fires at session start and when files are lazily loaded during a session |523| `InstructionsLoaded` | 当 CLAUDE.md 或 `.claude/rules/*.md` 文件被加载到上下文中时。在会话开始时和文件在会话期间被延迟加载时触发 |

524| `ConfigChange` | When a configuration file changes during a session |524| `ConfigChange` | 当配置文件在会话期间更改时 |

525| `CwdChanged` | When the working directory changes, for example when Claude executes a `cd` command. Useful for reactive environment management with tools like direnv |525| `CwdChanged` | 当工作目录更改时,例如当 Claude 执行 `cd` 命令时。对于使用 direnv 等工具的反应式环境管理很有用 |

526| `DirectoryAdded` | When a working directory is added mid-session via `/add-dir` or the SDK `register_repo_root` control request |526| `DirectoryAdded` | 当工作目录在会话中期通过 `/add-dir` 或 SDK `register_repo_root` 控制请求添加时 |

527| `FileChanged` | When a watched file changes on disk. The `matcher` field specifies which filenames to watch |527| `FileChanged` | 当监视的文件在磁盘上更改时。`matcher` 字段指定要监视的文件名 |

528| `WorktreeCreate` | When a worktree is being created via `--worktree`, `isolation: "worktree"`, or for a background session. Replaces default git behavior |528| `WorktreeCreate` | 当通过 `--worktree`、`isolation: "worktree"` 创建工作树时,或用于后台会话。替换默认的 git 行为 |

529| `WorktreeRemove` | When a worktree is being removed at session exit, when a subagent finishes, or when you delete a background session |529| `WorktreeRemove` | 当在会话退出时、子代理完成时或删除后台会话时移除工作树 |

530| `PreCompact` | Before context compaction |530| `PreCompact` | 在上下文压缩之前 |

531| `PostCompact` | After context compaction completes |531| `PostCompact` | 在上下文压缩完成后 |

532| `PreModelSwitch` | Before Claude Code applies a model switch that you or a client requested. Can block the switch |532| `PreModelSwitch` | 在 Claude Code 应用你或客户端请求的模型切换之前。可以阻止切换 |

533| `PostModelSwitch` | After the session's model changes, including changes Claude Code makes on its own, such as restoring the model when you resume a session |533| `PostModelSwitch` | 在会话的模型更改后,包括 Claude Code 自己进行的更改,例如在你恢复会话时恢复模型 |

534| `Elicitation` | When an MCP server requests user input during a tool call |534| `Elicitation` | 当 MCP 服务器在工具调用期间请求用户输入时 |

535| `ElicitationResult` | After a user responds to an MCP elicitation, before the response is sent back to the server |535| `ElicitationResult` | 在用户响应 MCP 引出后,在响应发送回服务器之前 |

536| `SessionEnd` | When a session terminates |536| `SessionEnd` | 当会话终止时 |

537 537 

538每个 hook 都有一个 `type` 来确定它如何运行。大多数 hooks 使用 `"type": "command"`,它运行 shell 命令。还有四种其他类型可用:538每个 hook 都有一个 `type` 来确定它如何运行。大多数 hooks 使用 `"type": "command"`,它运行 shell 命令。还有四种其他类型可用:

539 539 


1077 Hook JSON 无效果1077 Hook JSON 无效果

1078</h3>1078</h3>

1079 1079 

1080你的 hook 打印有效的 JSON,但决策没有生效,成绩单中没有出现错误。1080你的 hook 打印有效的 JSON,但决策没有生效,成绩单中没有出现错误。检查哪个原因适用:

1081 

1082* **JSON 前面有额外输出**:其他东西首先写入 stdout,通常是你的 shell 配置文件中的无条件 `echo`,所以输出不再以 `{` 开头,Claude Code 不会将其解析为 JSON。原因和修复如下所示。

1083* **字段在错误的级别**:将每个字段的位置与 [JSON 输出](/docs/zh-CN/hooks#json-output)格式进行比较。例如,`permissionDecision` 属于 `hookSpecificOutput` 内部,而不是顶级。

1081 1084 

1082当 Claude Code 运行 shell 形式的命令 hook(没有 `args` 的)时,它在 macOS 和 Linux 上生成 `sh -c`,在 Windows 上生成 Git Bash,或在默认情况下未安装 Git Bash 时生成 PowerShell。这个 shell 是非交互式的,但 Git Bash 和某些配置(例如 `BASH_ENV` 指向 `~/.bashrc`)仍然会源你的配置文件。如果该配置文件包含无条件的 `echo` 语句,输出会被添加到你的 hook 的 JSON 前面:1085当 Claude Code 运行 shell 形式的命令 hook(没有 `args` 的)时,它在 macOS 和 Linux 上生成 `sh -c`,在 Windows 上生成 Git Bash,或在默认情况下未安装 Git Bash 时生成 PowerShell。这个 shell 是非交互式的,但 Git Bash 和某些配置(例如 `BASH_ENV` 指向 `~/.bashrc`)仍然会源你的配置文件。如果该配置文件包含无条件的 `echo` 语句,输出会被添加到你的 hook 的 JSON 前面:

1083 1086 


1097 1100 

1098`$-` 变量包含 shell 标志,`i` 表示交互式。Hooks 在非交互式 shell 中运行,因此 echo 被跳过。1101`$-` 变量包含 shell 标志,`i` 表示交互式。Hooks 在非交互式 shell 中运行,因此 echo 被跳过。

1099 1102 

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

1104 

1100<h3 id="debug-techniques">1105<h3 id="debug-techniques">

1101 调试技术1106 调试技术

1102</h3>1107</h3>

Details

384* 在空提示上按 `Escape`、`Backspace` 或 `Ctrl+U` 退出384* 在空提示上按 `Escape`、`Backspace` 或 `Ctrl+U` 退出

385* 将以 `!` 开头的文本粘贴到空提示中会自动进入 shell 模式,与输入的 `!` 行为匹配385* 将以 `!` 开头的文本粘贴到空提示中会自动进入 shell 模式,与输入的 `!` 行为匹配

386 386 

387在常规交互式会话中,即使你已启用沙箱,你在 shell 模式中输入的命令也会在[沙箱](/docs/zh-CN/sandboxing)外运行,因为沙箱适用于 Claude 运行的命令。请参阅[严格沙箱模式](/docs/zh-CN/sandboxing#the-unsandboxed-retry-escape-hatch),了解 shell 模式命令也在沙箱中运行的会话,例如启用了严格沙箱模式的后台会话。387除非你的会话是[严格沙箱模式](/docs/zh-CN/sandboxing#the-unsandboxed-retry-escape-hatch)下列出的会话之一,即使你已启用沙箱,你在 shell 模式中输入的命令也会在[沙箱](/docs/zh-CN/sandboxing)外运行,因为沙箱适用于 Claude 运行的命令。

388 388 

389一旦命令输出出现在记录中,Claude 会自动响应,因此你可以运行 `! npm test` 并获得失败的解释,无需第二个提示。响应成本与发送普通提示相同。要恢复之前的行为,其中输出被添加到上下文而不响应,请在 `settings.json` 中将 [`respondToBashCommands`](/docs/zh-CN/settings-reference#respondtobashcommands) 设置为 `false`。在 v2.1.186 之前,shell 模式始终将输出添加到上下文而不响应。389一旦命令输出出现在记录中,Claude 会自动响应,因此你可以运行 `! npm test` 并获得失败的解释,无需第二个提示。响应成本与发送普通提示相同。要恢复之前的行为,其中输出被添加到上下文而不响应,请在 `settings.json` 中将 [`respondToBashCommands`](/docs/zh-CN/settings-reference#respondtobashcommands) 设置为 `false`。在 v2.1.186 之前,shell 模式始终将输出添加到上下文而不响应。

390 390 


679 679 

680任务列表是 Claude 的待办事项清单:Claude 创建的用于规划多步骤工作的项目,带有指示器显示待处理、进行中或已完成的状态。它与后台任务视图分开。要查看运行中的 shell 和子代理,请改用 [`/tasks`](/docs/zh-CN/commands)。680任务列表是 Claude 的待办事项清单:Claude 创建的用于规划多步骤工作的项目,带有指示器显示待处理、进行中或已完成的状态。它与后台任务视图分开。要查看运行中的 shell 和子代理,请改用 [`/tasks`](/docs/zh-CN/commands)。

681 681 

682在 [Opus 4.8、Sonnet 5、Fable 5、Mythos 5 以及这些系列的更高版本](/docs/zh-CN/tools-reference#task-tool-availability) 上,Claude 可以跟踪多步骤工作而无需书面清单,Claude Code 不提供填充此列表的工具,因此它保持为空。如果您仍然希望在这些模型上使用任务列表,可以使用 `CLAUDE_CODE_ENABLE_TODO_TOOLS=1` 或 [任务工具可用性](/docs/zh-CN/tools-reference#task-tool-availability) 下的其他方式选择加入。在 Opus 4.7 等早期模型上,以及在您选择加入后,任务列表的工作方式如下:682该列表仅在具有任务跟踪工具的会话中填充,Claude Code 在 [Claude 3.x 模型、Opus 4 至 4.7、Sonnet 4 至 4.6 以及 Haiku 4.5](/docs/zh-CN/tools-reference#task-tool-availability) 上默认提供。在任何其他模型上,包括 Claude Code 无法识别的模型 ID,除非您使用 `CLAUDE_CODE_ENABLE_TODO_TOOLS=1` 或 [任务工具可用性](/docs/zh-CN/tools-reference#task-tool-availability) 下的其他方式选择加入,否则列表保持为空。当会话具有这些工具时,任务列表的工作方式如下:

683 683 

684* 按 `Ctrl+T` 切换任务列表视图。显示一次最多显示五个任务。当 Claude 尚未创建任何清单项目时,切换没有可见效果,因为没有要显示的内容684* 按 `Ctrl+T` 切换任务列表视图。显示一次最多显示五个任务。当 Claude 尚未创建任何清单项目时,切换没有可见效果,因为没有要显示的内容

685* 如果您保持列表展开,Claude Code 会在下次启动仍有任务的会话时恢复展开视图,例如使用 `--resume` 或 `--continue`。当任务列表为空时,Claude Code 会将其启动为折叠状态685* 如果您保持列表展开,Claude Code 会在下次启动仍有任务的会话时恢复展开视图,例如使用 `--resume` 或 `--continue`。当任务列表为空时,Claude Code 会将其启动为折叠状态

keybindings.md +3 −1

Details

542 542 

543这也适用于和弦绑定。取消绑定共享前缀的每个和弦会释放该前缀以用作单键绑定。任何活跃上下文中的和弦都会保留其前缀,因此您必须在定义该和弦的上下文中取消绑定每个和弦。543这也适用于和弦绑定。取消绑定共享前缀的每个和弦会释放该前缀以用作单键绑定。任何活跃上下文中的和弦都会保留其前缀,因此您必须在定义该和弦的上下文中取消绑定每个和弦。

544 544 

545Claude Code 在 `ctrl+x` 前缀上绑定这些默认和弦:`Chat` 中的 `ctrl+x ctrl+k`、`ctrl+x ctrl+e` 和 `ctrl+x enter`,`Task` 中的 `ctrl+x ctrl+b`,以及 `DiffPanel` 中的 `ctrl+x b`。`ctrl+x enter` 和弦需要 v2.1.247 或更高版本,`ctrl+x b` 需要 v2.1.260 或更高版本。要将 `ctrl+x` 本身回收为单键绑定,请取消绑定所有这些:545Claude Code 在 `ctrl+x` 前缀上绑定这些默认和弦:`Chat` 中的 `ctrl+x ctrl+k`、`ctrl+x ctrl+e`、`ctrl+x enter`、`ctrl+x ctrl+a` 和 `ctrl+x tab`,`Task` 中的 `ctrl+x ctrl+b`,以及 `DiffPanel` 中的 `ctrl+x b`。`ctrl+x enter` 和弦需要 v2.1.247 或更高版本,`ctrl+x b`、`ctrl+x ctrl+a` 和 `ctrl+x tab` 需要 v2.1.260 或更高版本。要将 `ctrl+x` 本身回收为单键绑定,请取消绑定所有这些:

546 546 

547```json theme={null}547```json theme={null}

548{548{


565 "ctrl+x ctrl+k": null,565 "ctrl+x ctrl+k": null,

566 "ctrl+x ctrl+e": null,566 "ctrl+x ctrl+e": null,

567 "ctrl+x enter": null,567 "ctrl+x enter": null,

568 "ctrl+x ctrl+a": null,

569 "ctrl+x tab": null,

568 "ctrl+x": "chat:newline"570 "ctrl+x": "chat:newline"

569 }571 }

570 }572 }

Details

19 检查现有配置19 检查现有配置

20</h2>20</h2>

21 21 

22管理员可以通过[托管设置](/docs/zh-CN/settings#settings-files)、设备管理或 [`apiKeyHelper`](#rotate-credentials-with-apikeyhelper) 分发网关地址和凭证,以便 Claude Code 在启动时自动获取,无需您进行任何设置。要检查您的组织是否已这样做:22管理员可以通过[托管设置](/docs/zh-CN/managed-settings)、设备管理或 [`apiKeyHelper`](#rotate-credentials-with-apikeyhelper) 分发网关地址和凭证,以便 Claude Code 在启动时自动获取,无需您进行任何设置。要检查您的组织是否已这样做:

23 23 

24<Steps>24<Steps>

25 <Step title="启动 Claude Code">25 <Step title="启动 Claude Code">


101 </Tab>101 </Tab>

102</Tabs>102</Tabs>

103 103 

104Shell 导出仅适用于该终端会话和从它启动的程序;从 dock 或开始菜单启动的编辑器不会看到它们。要使它们在新终端中持续,请将相同的行添加到您的 shell 配置文件,例如 `~/.zshrc`、`~/.bashrc` 或您的 PowerShell `$PROFILE`,或改用设置文件。104Shell 导出仅适用于该终端会话和从它启动的程序。从 dock 或开始菜单启动的编辑器不会看到它们。要使值在新终端中持续,请将相同的行添加到您的 shell 配置文件,例如 `~/.zshrc`、`~/.bashrc` 或您的 PowerShell `$PROFILE`。

105 

106如果您仅在 shell 中导出网关,它不会可靠地到达由[主管程序](/docs/zh-CN/agent-view#how-background-sessions-are-hosted)托管的后台代理;请参阅[每个后台会话如何获取其网关](/docs/zh-CN/agent-view#llm-gateway)。对于后台代理必须始终路由的任何网关,请使用设置文件。

105 107 

106<h4 id="set-in-a-settings-file">108<h4 id="set-in-a-settings-file">

107 在设置文件中设置109 在设置文件中设置

108</h4>110</h4>

109 111 

110要使配置在 Claude Code 运行的任何地方应用而不依赖于您的 shell,请在[设置文件](/docs/zh-CN/settings)的 `env` 块中设置变量。设置文件有不同的范围:112要使配置在 Claude Code 运行的任何地方应用,包括[后台代理](/docs/zh-CN/agent-view#how-background-sessions-are-hosted),请在[设置文件](/docs/zh-CN/settings)的 `env` 块中设置变量,而不是依赖您的 shell。设置文件有不同的范围:

111 113 

112* `~/.claude/settings.json` 适用于您的所有项目。在 Windows 上,路径是 `%USERPROFILE%\.claude\settings.json`114* `~/.claude/settings.json` 适用于您的所有项目。在 Windows 上,路径是 `%USERPROFILE%\.claude\settings.json`

113* `.claude/settings.local.json` 适用于一个项目。Claude Code 在创建文件时将其添加到您的 gitignore;如果您自己创建它,请首先手动将其添加到您的 gitignore,以便您不会意外提交您的凭证115* `.claude/settings.local.json` 适用于一个项目。Claude Code 在保存设置时将其添加到您的全局 gitignore;如果您手动创建它或让 Claude 编写它,请首先自己将其添加到您的 gitignore,以便您不会意外提交您的凭证

114 116 

115<Warning>117<Warning>

116 不要将凭证放在项目的 `.claude/settings.json` 中。该文件被提交并与克隆存储库的每个人共享。118 不要将凭证放在项目的 `.claude/settings.json` 中。该文件被提交并与克隆存储库的每个人共享。


333}335}

334```336```

335 337 

338像这样的路由和租户标头名称计为[需要批准的标头](/docs/zh-CN/server-managed-settings#environment-variables-and-the-approval-dialog)。当标头来自项目设置文件时,Claude Code 在[应用 `env` 值的规则](/docs/zh-CN/settings-reference#when-claude-code-applies-env-values)下应用它们。

339 

336<h3 id="add-gateway-models-to-the-model-picker">340<h3 id="add-gateway-models-to-the-model-picker">

337 将网关模型添加到模型选择器341 将网关模型添加到模型选择器

338</h3>342</h3>

339 343 

340模型发现在启动时查询网关的模型列表,并将这些名称添加到 `/model` 选择器中,与内置条目一起。344启用模型发现后,Claude Code 在启动时查询网关的模型列表,并将这些名称添加到 `/model` 选择器中,与内置条目一起。如果您或您的管理员在 [`modelPicker`](/docs/zh-CN/settings-reference#modelpicker) 排列中设置了 `replaceBuiltInOptions`,Claude Code 也会隐藏发现的名称。它为会话已在使用的模型保留一行。

341 345 

342如果您的网关提供不在 Claude Code 内置列表中的模型名称,并且您想从选择器中选择它们,请启用它。如果内置模型是您使用的,您不需要发现;您的管理员也可能已通过托管设置启用它。346如果您的网关提供不在 Claude Code 内置列表中的模型名称,并且您想从选择器中选择它们,请启用它。如果内置模型是您使用的,您不需要发现;您的管理员也可能已通过托管设置启用它。

343 347 

344要启用它,请在您的 shell 或 `~/.claude/settings.json` 的 `env` 块中设置 `CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY=1`。发现需要 Claude Code v2.1.129 或更高版本。348要启用它,请在您的 shell 或 `~/.claude/settings.json` 的 `env` 块中设置 `CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY=1`。

345 349 

346发现的模型显示为标记为 `From gateway` 的其他 `/model` 条目。要确认发现运行,启动 `claude --debug` 并查找 `[gatewayDiscovery]` 行:成功记录缓存了多少模型,`404`、超时或重定向也记录在那里。有关发现何时运行、它过滤什么以及网关提供的响应格式,请参阅[模型发现参考](/docs/zh-CN/llm-gateway-protocol#model-discovery)。350发现的模型显示为其他 `/model` 条目。每个条目显示您的网关为模型提供的描述,或在它不提供描述时显示 `From gateway`。

351 

352要确认发现运行,启动 `claude --debug` 并在 `~/.claude/debug/<session-id>.txt` 的调试日志中查找 `[gatewayDiscovery]` 行。第一次发现成功时,Claude Code 记录它缓存了多少模型,仅当网关的列表更改时才再次记录。`404`、超时或重定向也会出现在那里。有关发现何时运行、它过滤什么以及网关提供的响应格式,请参阅[模型发现参考](/docs/zh-CN/llm-gateway-protocol#model-discovery)。

347 353 

348<h3 id="rotate-credentials-with-apikeyhelper">354<h3 id="rotate-credentials-with-apikeyhelper">

349 使用 apiKeyHelper 轮换凭证355 使用 apiKeyHelper 轮换凭证


353 359 

354当凭证按计划过期、来自保管库或 SSO 命令,或您的管理员告诉您配置一个时,使用助手。如果您的凭证是您设置一次的固定字符串,[凭证变量](#set-the-credential-variable)是您需要的全部,您可以跳过本部分。360当凭证按计划过期、来自保管库或 SSO 命令,或您的管理员告诉您配置一个时,使用助手。如果您的凭证是您设置一次的固定字符串,[凭证变量](#set-the-credential-variable)是您需要的全部,您可以跳过本部分。

355 361 

356助手是任何将当前凭证打印到 stdout 的 shell 命令。Claude Code 通过您的系统 shell 运行它,因此在 Windows 上它可以是可执行文件或 PowerShell 调用。编写脚本,使其可执行,并从您的[设置文件](/docs/zh-CN/settings)中的 `apiKeyHelper` 引用它:362助手是任何将当前凭证打印到 stdout 的 shell 命令。Claude Code 通过您的系统 shell 运行它,因此在 Windows 上它可以是可执行文件或 PowerShell 调用。使命令仅打印凭证,不打印其他内容。在 Claude Code v2.1.227 或更高版本上,与密钥一起打印的横幅或日志行会使[助手失败](/docs/zh-CN/errors#your-apikeyhelper-script-is-failing)。编写脚本,使其可执行,并从您的[设置文件](/docs/zh-CN/settings)中的 `apiKeyHelper` 引用它:

357 363 

358<Tabs>364<Tabs>

359 <Tab title="Bash or Zsh">365 <Tab title="Bash or Zsh">


390 </Tab>396 </Tab>

391</Tabs>397</Tabs>

392 398 

393Claude Code 默认缓存助手的输出五分钟,并在请求返回 HTTP 401 时重新运行它。要更改缓存生命周期,请以毫秒为单位设置 `CLAUDE_CODE_API_KEY_HELPER_TTL_MS`,例如 `CLAUDE_CODE_API_KEY_HELPER_TTL_MS=900000` 表示 15 分钟。399Claude Code 默认缓存助手的输出五分钟,并在缓存生命周期过期后重新运行助手。要更改生命周期,请以毫秒为单位设置 `CLAUDE_CODE_API_KEY_HELPER_TTL_MS`,例如 `CLAUDE_CODE_API_KEY_HELPER_TTL_MS=900000` 表示 15 分钟。

400 

401有关 Claude Code 重新运行助手的其他情况,请参阅 [`apiKeyHelper`](/docs/zh-CN/settings-reference#apikeyhelper)。

394 402 

395助手的值在 `Authorization` 和 `x-api-key` 标头中都发送,因此它适用于您的网关读取的任何标头。403助手的值在 `Authorization` 和 `x-api-key` 标头中都发送,因此它适用于您的网关读取的任何标头。

396 404 


398 关闭网关路径外的流量406 关闭网关路径外的流量

399</h3>407</h3>

400 408 

401网关承载模型请求,但 Claude Code 也向网关路径外发送非必要的后台流量,发送到 Anthropic 和第三方服务(如 GitHub):版本检查、遥测、错误报告、发行说明和类似请求。在仅允许出站到网关的网络上,这些请求失败,并可能在您的出站监控中显示为被阻止的连接。409网关承载模型请求,但 Claude Code 也向网关路径外发送非必要的后台流量,发送到 Anthropic 和第三方服务(如 GitHub):版本检查、遥测、发行说明和类似请求。在仅允许出站到网关的网络上,这些请求失败,并可能在您的出站监控中显示为被阻止的连接。

410 

411Claude Code 仅在请求发送到凭证所属的主机时才将凭证附加到遥测或使用指标请求。当 `ANTHROPIC_BASE_URL` 指向网关时,Claude Code 将其遥测事件发送到 Anthropic,不使用您的网关凭证。使用[凭证变量](#set-the-credential-variable)或 `apiKeyHelper` 时,Claude Code 不会向控制台[分析仪表板](/docs/zh-CN/analytics#access-analytics-for-api-customers)报告使用指标。在 v2.1.246 之前,Claude Code 可能会将网关凭证附加到发往 Anthropic 主机的遥测和使用指标请求;模型请求始终使用网关期望的凭证发送到网关。

402 412 

403要关闭该流量,请在与网关变量相同的 shell 导出或设置文件 `env` 块中设置 `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1`:413要关闭该流量,请在与网关变量相同的 shell 导出或设置文件 `env` 块中设置 `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1`:

404 414 


420 430 

421* 它禁用自动更新,因此请为另一个更新路径做计划,例如您的包管理器或托管分发。431* 它禁用自动更新,因此请为另一个更新路径做计划,例如您的包管理器或托管分发。

422* 它抑制 [fast mode](/docs/zh-CN/fast-mode) 可用性检查。除非之前的检查已在机器上启用了 fast mode,否则 `/fast` 报告 fast mode 不可用。432* 它抑制 [fast mode](/docs/zh-CN/fast-mode) 可用性检查。除非之前的检查已在机器上启用了 fast mode,否则 `/fast` 报告 fast mode 不可用。

423* 它关闭[网关模型发现](#add-gateway-models-to-the-model-picker),尽管发现查询网关本身。之前发现的模型从本地缓存保持可用,但列表不会刷新。433* 它不影响[网关模型发现](#add-gateway-models-to-the-model-picker),它仅查询您的网关。在 v2.1.257 之前,该变量也停止了发现刷新,因此选择器保留了之前缓存的列表。

424* WebFetch 工具的[域安全检查](/docs/zh-CN/data-usage#webfetch-domain-safety-check)不受影响,仍然调用 `api.anthropic.com`。如果您的网络阻止该主机,请在[设置](/docs/zh-CN/settings)中使用 `skipWebFetchPreflight: true` 单独关闭它。434* WebFetch 工具的[域安全检查](/docs/zh-CN/data-usage#webfetch-domain-safety-check)不受影响,仍然调用 `api.anthropic.com`。如果您的网络阻止该主机,请在[设置](/docs/zh-CN/settings)中使用 `skipWebFetchPreflight: true` 单独关闭它。

425* 对于每个遥测流及控制它的变量,请参阅[遥测服务](/docs/zh-CN/data-usage#telemetry-services)。435* 对于每个遥测流及控制它的变量,请参阅[遥测服务](/docs/zh-CN/data-usage#telemetry-services)。

426 436 


428 通过网关路由到云提供商438 通过网关路由到云提供商

429</h3>439</h3>

430 440 

431这些配置使用提供商特定的基础 URL 变量代替 `ANTHROPIC_BASE_URL` 将 Claude Code 指向通过网关的云提供商。Amazon Bedrock 和 Google Cloud 的 Agent Platform 网关接受这些提供商的本机请求格式;Microsoft Foundry 和 AWS 上的 Claude Platform 网关接受 Anthropic Messages 格式,仅在哪个基础 URL 变量到达它们方面有所不同。441这些配置使用提供商特定的基础 URL 变量代替 `ANTHROPIC_BASE_URL` 将 Claude Code 指向通过网关的云提供商。Amazon Bedrock 和 Google Cloud 的 Agent Platform 网关接受这些提供商的本机请求格式;Microsoft Foundry 和 AWS 上的 Claude Platform 网关接受 Anthropic Messages 格式。在 Amazon Bedrock 和 Google Cloud 的 Agent Platform 路由上,Claude Code 也将它发送的 beta 标头和请求字段限制为该提供商接受的集合。有关您的网关在每条路由上接收的内容,请参阅[网关兼容性指南](/docs/zh-CN/llm-gateway-protocol)。

432 442 

433仅在您的网关团队特别命名 Amazon Bedrock、Google Cloud 的 Agent Platform、Microsoft Foundry 或 AWS 上的 Claude Platform 时使用一个。如果上面的[验证请求](#verify-the-connection)返回 JSON,您可以跳过本部分。443仅在您的网关团队特别命名 Amazon Bedrock、Google Cloud 的 Agent Platform、Microsoft Foundry 或 AWS 上的 Claude Platform 时使用一个。如果上面的[验证请求](#verify-the-connection)返回 JSON,您可以跳过本部分。

434 444 

435为您的网关团队命名的提供商设置块。跳过身份验证变量告诉 Claude Code 不要使用提供商凭证签署请求,因为网关持有这些。如果网关需要自己的令牌,请在块后添加 `ANTHROPIC_AUTH_TOKEN`,除了 Microsoft Foundry,它使用 `ANTHROPIC_FOUNDRY_API_KEY`,如所示。期望持有者令牌的 Microsoft Foundry 网关可以改用 [`ANTHROPIC_FOUNDRY_AUTH_TOKEN`](/docs/zh-CN/env-vars);当两者都设置时,它优先于 `ANTHROPIC_FOUNDRY_API_KEY`。`ANTHROPIC_FOUNDRY_AUTH_TOKEN` 需要 Claude Code v2.1.203 或更高版本。445为您的网关团队命名的提供商设置块。Amazon Bedrock、Google Cloud 的 Agent Platform 和 AWS 上的 Claude Platform 块中的跳过身份验证变量告诉 Claude Code 不要使用提供商凭证签署请求,因为网关持有这些。如果网关也需要自己的令牌,您放置它的位置取决于提供商:

446 

447* **Amazon Bedrock、Google Cloud 的 Agent Platform 或 AWS 上的 Claude Platform**:在块后添加 `ANTHROPIC_AUTH_TOKEN`。Claude Code 将其作为 `Authorization: Bearer` 标头发送到网关。对于不同方案或标头中的凭证,请改用 [`ANTHROPIC_CUSTOM_HEADERS`](#send-additional-headers)。无论如何都保持跳过身份验证变量设置,因为没有它,Claude Code 会删除 `ANTHROPIC_AUTH_TOKEN`、[`apiKeyHelper`](#rotate-credentials-with-apikeyhelper) 或 `ANTHROPIC_CUSTOM_HEADERS` 会添加的任何 `Authorization` 标头。

448* **Microsoft Foundry**:使用 `ANTHROPIC_FOUNDRY_API_KEY`,如[其块](#microsoft-foundry)所示

436 449 

437<h4 id="amazon-bedrock">450<h4 id="amazon-bedrock">

438 Amazon Bedrock451 Amazon Bedrock

439</h4>452</h4>

440 453 

454当网关发出自己的凭证时,将 `AWS_BEARER_TOKEN_BEDROCK` 保留为未设置。如果您设置它,Claude Code 会将该 [Amazon Bedrock API 密钥](/docs/zh-CN/amazon-bedrock#2-configure-aws-credentials)作为 `Authorization` 标头发送,而不是您的网关令牌,即使设置了 `CLAUDE_CODE_SKIP_BEDROCK_AUTH`。

455 

441<Tabs>456<Tabs>

442 <Tab title="Bash or Zsh">457 <Tab title="Bash or Zsh">

443 ```bash theme={null}458 ```bash theme={null}


460 Google Cloud 的 Agent Platform475 Google Cloud 的 Agent Platform

461</h4>476</h4>

462 477 

478将项目 ID 和区域替换为您自己的值。Claude Code 在它发送到网关的每个请求的路径中包含两者:

479 

463<Tabs>480<Tabs>

464 <Tab title="Bash or Zsh">481 <Tab title="Bash or Zsh">

465 ```bash theme={null}482 ```bash theme={null}


482 </Tab>499 </Tab>

483</Tabs>500</Tabs>

484 501 

502该块涵盖路由和身份验证。来自 [Agent Platform 设置](/docs/zh-CN/google-vertex-ai#4-configure-claude-code)的区域覆盖和模型固定也通过网关应用:

503 

504* **按模型区域**:如果您的网关从 `CLOUD_ML_REGION` 以外的区域提供某些模型,请为每个设置匹配的 `VERTEX_REGION_CLAUDE_*` 变量,例如 `VERTEX_REGION_CLAUDE_4_6_SONNET=europe-west1`。[环境变量参考](/docs/zh-CN/env-vars)列出了确切的名称。

505* **模型版本**:如[固定模型版本](/docs/zh-CN/google-vertex-ai#5-pin-model-versions)中所示,固定 `ANTHROPIC_DEFAULT_OPUS_MODEL`、`ANTHROPIC_DEFAULT_SONNET_MODEL` 和 `ANTHROPIC_DEFAULT_HAIKU_MODEL`。设置 `ANTHROPIC_DEFAULT_HAIKU_MODEL` 也会将后台任务(如会话标题)移动到该模型,该部分解释了哪个模型在其他情况下运行它们。

506* **模型功能**:如果您固定您的 Claude Code 版本不识别的模型 ID,功能(如努力级别或扩展思考)可能在其上保持禁用。使用 [`ANTHROPIC_DEFAULT_OPUS_MODEL_SUPPORTED_CAPABILITIES`](/docs/zh-CN/model-config#customize-pinned-model-display-and-capabilities) 及其 Sonnet 和 Haiku 对应项声明模型支持的内容。

507 

485<h4 id="microsoft-foundry">508<h4 id="microsoft-foundry">

486 Microsoft Foundry509 Microsoft Foundry

487</h4>510</h4>


534 </Tab>557 </Tab>

535</Tabs>558</Tabs>

536 559 

560<h4 id="confirm-the-provider-route">

561 确认提供商路由

562</h4>

563 

564从您设置块的 shell 启动 `claude` 并运行 `/status`。使用 Amazon Bedrock 块,**Status** 标签页显示如下行:

565 

566```text theme={null}

567API provider: Amazon Bedrock

568Bedrock base URL: https://llm-gateway.example.com/bedrock

569AWS auth skipped

570```

571 

572其他块在其提供商的名称下产生相同的行,例如 Google Cloud 的 Agent Platform 的 `Vertex base URL` 和 `GCP auth skipped`;Microsoft Foundry 块仅在您设置 `CLAUDE_CODE_SKIP_FOUNDRY_AUTH` 时显示跳过身份验证行。如果您也通过公司代理路由,`Proxy` 行显示代理 URL。如果基础 URL 行缺失,该变量没有到达会话。

573 

537<h2 id="troubleshoot-gateway-errors">574<h2 id="troubleshoot-gateway-errors">

538 故障排除网关错误575 故障排除网关错误

539</h2>576</h2>


541这些是通过网关运行 Claude Code 时最常见的错误,包括网关端的原因和修复:578这些是通过网关运行 Claude Code 时最常见的错误,包括网关端的原因和修复:

542 579 

543| 错误 | 原因 | 修复 |580| 错误 | 原因 | 修复 |

544| :-------------------------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |581| :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

545| 启动警告命名两个凭证源并以 `auth may not work as expected` 结尾。较旧的版本显示 `Auth conflict: Both a token (SOURCE) and an API key (SOURCE) are set` 代替。 | 网关凭证和保存的登录都处于活动状态;变量用于请求,但过时的登录可能导致意外的身份验证行为 | 取消设置变量以使用保存的登录,或运行 `/logout` 以使用网关凭证 |582| 启动警告命名两个凭证源并以 `auth may not work as expected` 结尾。较旧的版本显示 `Auth conflict: Both a token (SOURCE) and an API key (SOURCE) are set` 代替。 | 网关凭证和保存的登录都处于活动状态;变量用于请求,但过时的登录可能导致意外的身份验证行为 | 取消设置变量以使用保存的登录,或运行 `/logout` 以使用网关凭证 |

546| `401` 错误命名无效或无法识别的令牌 | 凭证不是网关颁发的,或它处于网关不读取的标头中 | 确认变量与[凭证表](#set-the-credential-variable)中的凭证类型匹配,如果凭证被撤销,请在网关处重新生成密钥 |583| `401` 错误命名无效或无法识别的令牌 | 凭证不是网关颁发的,或它处于网关不读取的标头中 | 确认变量与[凭证表](#set-the-credential-variable)中的凭证类型匹配,如果凭证被撤销,请在网关处重新生成密钥 |

547| `Your apiKeyHelper script is failing` | [`apiKeyHelper`](/docs/zh-CN/settings#available-settings) 设置中的命令以错误退出、超时或未打印任何内容,因此请求携带占位符密钥 | 直接运行该命令以查看失败原因,如果报告会话过期,请使用您的凭证提供商重新身份验证;请参阅[错误参考](/docs/zh-CN/errors#your-apikeyhelper-script-is-failing) |584| `Your apiKeyHelper script is failing`,或在非交互模式下 stderr 上的 `apiKeyHelper failed:` | [`apiKeyHelper`](/docs/zh-CN/settings-reference#apikeyhelper) 设置中的命令未生成可用的密钥,因此请求携带占位符密钥 | 直接运行该命令以查看失败原因,如果报告会话过期,请使用您的凭证提供商重新身份验证;请参阅[错误参考](/docs/zh-CN/errors#your-apikeyhelper-script-is-failing) |

548| `Unable to connect to API (ConnectionRefused)`,或来自 npm 安装的 `(ECONNREFUSED)`,通常在 Claude Code [使用退避重试](/docs/zh-CN/errors#automatic-retries)时的静默暂停之后 | 没有任何东西在基础 URL 处应答:地址错误,或 VPN 或防火墙阻止了网关的路径 | 运行上面的 [curl 测试](#verify-the-connection),它会立即因相同原因失败,并与您的网关团队确认 URL 和网络路径 |585| 当没有任何东西在地址处应答时 `Connection refused — a firewall or proxy may be blocking it (ConnectionRefused)`,或当主机名无法解析时 `Can't reach the API server — check your internet or DNS (ENOTFOUND)`,通常在 Claude Code [使用退避重试](/docs/zh-CN/errors#automatic-retries)时的静默暂停之后。括号中的代码会变化;[Unable to connect to API](/docs/zh-CN/errors#unable-to-connect-to-api) 涵盖代码拼写和较早的措辞 | 没有任何东西在基础 URL 处应答:地址错误,或 VPN 或防火墙阻止了网关的路径 | 运行上面的 [curl 测试](#verify-the-connection),它会立即因相同原因失败,并与您的网关团队确认 URL 和网络路径 |

549| `API returned an empty or malformed response (HTTP 200)` | 网关或中间代理返回了非 API 响应,通常是 HTML 错误或登录页面 | 使用上面的 [curl 请求](#verify-the-connection)测试;修复返回非 JSON 的网关路由 |586| `API returned an empty or malformed response (HTTP 200)` | 网关或中间代理返回了非 API 响应,通常是 HTML 错误或登录页面 | 使用上面的 [curl 请求](#verify-the-connection)测试;修复返回非 Claude API 响应的网关路由。[错误参考](/docs/zh-CN/errors#api-returned-an-empty-or-malformed-response)解释了消息报告的详细信息 |

550| `400` 错误命名 `context_management`、`Extra inputs are not permitted` 或其他无法识别的字段 | 网关将请求转发到上游,该上游拒绝 Claude Code 发送到 Anthropic 格式端点的字段 | 设置 `CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1`,它抑制大多数预发布字段;请参阅[功能传递](/docs/zh-CN/llm-gateway-protocol#feature-pass-through)。某些 beta 不受此标志限制;对于那些,设置匹配的 `CLAUDE_CODE_USE_*` 提供商变量,以便 Claude Code 仅发送该提供商接受的内容 |587| `400` 错误命名 `context_management`、`Extra inputs are not permitted` 或其他无法识别的字段 | 网关将请求转发到上游,该上游拒绝 Claude Code 发送到 Anthropic 格式端点的字段 | 设置 `CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1`,它抑制大多数预发布字段;请参阅[功能传递](/docs/zh-CN/llm-gateway-protocol#feature-pass-through)。某些 beta 不受此标志限制;对于那些,设置匹配的 `CLAUDE_CODE_USE_*` 提供商变量,以便 Claude Code 仅发送该提供商接受的内容 |

551| `400` 错误命名 `thinking` 或 `adaptive`,例如 `Input tag 'adaptive' found` | 上游模型构建不接受自适应推理,Claude Code 为 Claude 4.6 及更高版本的模型请求 | 升级网关的上游。在 Opus 4.6 和 Sonnet 4.6 上,`CLAUDE_CODE_DISABLE_ADAPTIVE_THINKING=1` 代替有效。[模型配置](/docs/zh-CN/model-config)能力变量仅适用于提供商配置,例如 `CLAUDE_CODE_USE_BEDROCK` 和 `CLAUDE_CODE_USE_VERTEX`,不在 `ANTHROPIC_BASE_URL` 网关后面 |588| `400` 错误命名 `thinking` 或 `adaptive`,例如 `Input tag 'adaptive' found` | 上游模型构建不接受自适应推理,Claude Code 为 Claude 4.6 及更高版本的模型请求 | 升级网关的上游。在 Opus 4.6 和 Sonnet 4.6 上,`CLAUDE_CODE_DISABLE_ADAPTIVE_THINKING=1` 代替有效。[模型配置](/docs/zh-CN/model-config)能力变量仅适用于提供商配置,例如 `CLAUDE_CODE_USE_BEDROCK` 和 `CLAUDE_CODE_USE_VERTEX`,不在 `ANTHROPIC_BASE_URL` 网关后面 |

552| `400` 错误声明网关自己的措辞中的上下文或令牌限制,例如 `ContextWindowExceededError` 或 `prompt token count of N exceeds the limit of M` | 网关强制执行比模型的本机窗口更小的上下文,并重写上游错误,因此自动紧凑和重试(与 Anthropic 的 `prompt is too long` 措辞匹配)不会触发 | 运行 `/compact` 以恢复会话。要防止它,请将 `CLAUDE_CODE_AUTO_COMPACT_WINDOW` 设置为网关的限制;该值被限制在至少 100,000 令牌和最多模型的上下文窗口,因此低于 100,000 的网关限制无法匹配,`/compact` 仍然是那里的恢复。还要将 `CLAUDE_CODE_MAX_OUTPUT_TOKENS` 设置为低于网关模型的输出限制 |589| `400` 错误声明网关自己的措辞中的上下文或令牌限制,例如 `ContextWindowExceededError` 或 `prompt token count of N exceeds the limit of M` | 网关强制执行比模型的本机窗口更小的上下文,并重写上游错误,因此 Claude Code 不会将其识别为[过长错误](/docs/zh-CN/errors#prompt-is-too-long),也不会自动紧凑和重试 | 运行 `/compact` 以恢复会话。要防止它,请将 `CLAUDE_CODE_AUTO_COMPACT_WINDOW` 设置为网关的限制;Claude Code 将该值限制在至少 100,000 令牌和最多模型的上下文窗口,因此您无法匹配低于 100,000 的网关限制,`/compact` 仍然是那里的恢复。还要将 `CLAUDE_CODE_MAX_OUTPUT_TOKENS` 设置为低于网关模型的输出限制 |

553| 模型从 `/model` 选择器中缺失 | 网关模型名称不在 Claude Code 的内置列表中 | 启用[网关模型发现](#add-gateway-models-to-the-model-picker)或使用[模型配置](/docs/zh-CN/model-config)变量添加名称 |590| 模型从 `/model` 选择器中缺失 | 网关模型名称不在 Claude Code 的内置列表中,或 Claude Code 显示替换内置选项的 [`modelPicker`](/docs/zh-CN/settings-reference#modelpicker) 阵容 | 启用[网关模型发现](#add-gateway-models-to-the-model-picker)或使用[模型配置](/docs/zh-CN/model-config)变量添加名称。如果 Claude Code 显示替换 `modelPicker` 阵容,请将网关模型添加到其中,或在托管设置提供时要求您的管理员添加它们 |

554| Claude Code 要求您登录,即使 [curl 测试](#verify-the-connection)成功 | CLI 没有自己的凭证:可达的基础 URL 不是一个,项目的 `.claude/settings.json` 或 `.claude/settings.local.json` 中的 `env` 块仅在第一次运行向导和信任提示之后应用 | 在 Claude Code 在首次运行设置之前读取的某处设置 `ANTHROPIC_AUTH_TOKEN`:shell 导出、`~/.claude/settings.json` 中的 `env` 块或托管设置 |591| `/fast` 报告 `Fast mode unavailable due to network connectivity issues`,而推理请求有效 | [快速模式](/docs/zh-CN/fast-mode)可用性检查直接转到 `api.anthropic.com`,不遵循 `ANTHROPIC_BASE_URL`,因此阻止的直接出口会导致检查失败。当检查呈现来自 `ANTHROPIC_API_KEY` 或 `apiKeyHelper` 的网关颁发的密钥且 Anthropic 拒绝它时,在开放网络上也会出现相同的消息 | 如果出口被阻止,请将 `api.anthropic.com` 列入白名单,或设置跳过变量;对于被拒绝的网关密钥,只有跳过变量有帮助。请参阅[在代理和 LLM 网关后面使用快速模式](/docs/zh-CN/fast-mode#use-fast-mode-behind-proxies-and-llm-gateways) |

592| `/fast` 在使用 `ANTHROPIC_AUTH_TOKEN` 进行身份验证的会话中报告 `Fast mode has been disabled by your organization`,即使组织已启用快速模式 | 可用性检查需要 claude.ai 登录或 Anthropic API 密钥;仅使用持有者令牌,Claude Code 会将快速模式视为已禁用,而不发送检查 | 设置 `CLAUDE_CODE_SKIP_FAST_MODE_ORG_CHECK=1`;请参阅[在代理和 LLM 网关后面使用快速模式](/docs/zh-CN/fast-mode#use-fast-mode-behind-proxies-and-llm-gateways) |

593| Claude Code 要求您登录,即使 [curl 测试](#verify-the-connection)成功 | CLI 没有自己的凭证:可达的基础 URL 不是一个,在交互会话中,项目的 `.claude/settings.json` 或 `.claude/settings.local.json` 中的 `env` 块仅在首次运行向导和[信任提示](/docs/zh-CN/permissions#what-runs-before-you-trust-a-folder)之后应用 | 在 Claude Code 在首次运行设置之前读取的某处设置 `ANTHROPIC_AUTH_TOKEN`:shell 导出、`~/.claude/settings.json` 中的 `env` 块或托管设置 |

555| `ANTHROPIC_API_KEY` 已设置但被忽略,没有提示 | 密钥需要在交互会话中进行一次性批准,之前拒绝的密钥被忽略而不再询问 | 在 `/config` 下使用 `Use custom API key` 选项启用它 |594| `ANTHROPIC_API_KEY` 已设置但被忽略,没有提示 | 密钥需要在交互会话中进行一次性批准,之前拒绝的密钥被忽略而不再询问 | 在 `/config` 下使用 `Use custom API key` 选项启用它 |

556| `This machine's managed settings require a first-party login` | 托管设置包括 `forceLoginMethod` 或 `forceLoginOrgUUID`,在 Claude Code v2.1.146 及更高版本上不能与 `ANTHROPIC_API_KEY`、`ANTHROPIC_AUTH_TOKEN` 或 `apiKeyHelper` 共存 | 您的管理员必须从托管设置中删除 `forceLoginMethod` 和 `forceLoginOrgUUID` 以使用网关凭证,或删除网关凭证以使用第一方登录。两者不能组合 |595| `This machine's managed settings require a first-party login` | 托管设置包括 `forceLoginMethod` 或 `forceLoginOrgUUID`,不能与 `ANTHROPIC_API_KEY`、`ANTHROPIC_AUTH_TOKEN` 或 `apiKeyHelper` 共存 | 您的管理员必须从托管设置中删除 `forceLoginMethod` 和 `forceLoginOrgUUID` 以使用网关凭证,或删除网关凭证以使用第一方登录。两者不能组合 |

557| `403` 带有 HTML 正文,例如 `403 Forbidden`,当网关自己的日志显示没有收到请求时 | 网关前面的 Web 应用防火墙或反向代理在请求到达网关之前阻止了请求正文。Claude Code 提示包括 XML 样式标签和与跨站脚本正文规则匹配的源代码,因此短 curl 测试通过而实际会话不通过 | 从请求正文检查中豁免网关的 `/v1/messages` 路径。在 AWS WAF 上这是 `CrossSiteScripting_Body` 托管规则;在带有 ModSecurity 的 nginx 上它是等效的 OWASP CRS 正文规则 |596| `403` 带有 HTML 正文,例如 `403 Forbidden`,当网关自己的日志显示没有收到请求时 | 网关前面的 Web 应用防火墙或反向代理在请求到达网关之前阻止了请求正文。Claude Code 提示包括 XML 样式标签和与跨站脚本正文规则匹配的源代码,因此短 curl 测试通过而实际会话不通过 | 从请求正文检查中豁免网关的 `/v1/messages` 路径。在 AWS WAF 上这是 `CrossSiteScripting_Body` 托管规则;在带有 ModSecurity 的 nginx 上它是等效的 OWASP CRS 正文规则 |

558| 证书或 TLS 错误,例如 `SSL certificate verification failed` 或 `Self-signed certificate detected`,当 [curl 测试](#verify-the-connection)成功时 | Claude Code 的运行时不信任 `curl` 使用的相同证书颁发机构。常见于企业 TLS 检查代理后面 | 将 `NODE_EXTRA_CA_CERTS` 设置为 CA 包路径;请参阅 [CA 证书存储](/docs/zh-CN/network-config#ca-certificate-store) |597| 证书或 TLS 错误,例如 `SSL certificate verification failed` 或 `Self-signed certificate detected`,当 [curl 测试](#verify-the-connection)成功时 | Claude Code 的运行时不信任 `curl` 使用的相同证书颁发机构。常见于企业 TLS 检查代理后面 | 将 `NODE_EXTRA_CA_CERTS` 设置为 CA 包路径;请参阅 [CA 证书存储](/docs/zh-CN/network-config#ca-certificate-store) |

559 598 


565 604 

566* [LLM 网关概述](/docs/zh-CN/llm-gateway):什么是网关以及它如何与 claude.ai 订阅交互605* [LLM 网关概述](/docs/zh-CN/llm-gateway):什么是网关以及它如何与 claude.ai 订阅交互

567* [为您的组织推出 LLM 网关](/docs/zh-CN/llm-gateway-rollout):部署和分发网关配置的面向管理员的检查清单606* [为您的组织推出 LLM 网关](/docs/zh-CN/llm-gateway-rollout):部署和分发网关配置的面向管理员的检查清单

568* [网关协议参考](/docs/zh-CN/llm-gateway-protocol):Claude Code 发送到网关的内容,包括网关必须转发的标头和字段607* [网关兼容性指南](/docs/zh-CN/llm-gateway-protocol):Claude Code 发送到网关的内容,包括网关必须转发的标头和字段

569* [设置](/docs/zh-CN/settings):设置文件的位置以及如何读取 `env` 块608* [设置](/docs/zh-CN/settings):设置文件的位置以及如何读取 `env` 块

570* [身份验证](/docs/zh-CN/authentication):凭证变量、`apiKeyHelper` 和 OAuth 登录如何交互609* [身份验证](/docs/zh-CN/authentication):凭证变量、`apiKeyHelper` 和 OAuth 登录如何交互

Details

54 可选端点和启动流量54 可选端点和启动流量

55</h3>55</h3>

56 56 

57令牌计数端点是唯一可选的:当它们不存在时,Claude Code 会回退到通过推理端点计算上下文使用情况。推理请求发送到 `/v1/messages?beta=true`,因此请匹配路径,而不是完整 URL。Google Cloud 的 Agent Platform 方法后缀附加到发布者模型路径,如 `/projects/{project}/locations/{location}/publishers/anthropic/models/{model}:streamRawPredict`。57令牌计数端点是唯一可选的:当它们不存在时,Claude Code 会回退到基于字符的上下文使用情况估计。

58 

59按路径匹配,而不是完整 URL:

60 

61* 推理请求发送到 `/v1/messages?beta=true`

62* Google Cloud 的 Agent Platform 方法后缀附加到发布者模型路径,如 `/projects/{project}/locations/{location}/publishers/anthropic/models/{model}:streamRawPredict`

58 63 

59gateway 还会看到尽力而为的启动流量,它可以拒绝而不会破坏任何东西。Anthropic Messages 格式的 gateway 会收到 `HEAD /api/hello` 连接预热探针,当配置了 HTTP 代理或客户端证书时,Claude Code 会跳过此探针。Amazon Bedrock 格式的 gateway 会收到 `GET /inference-profiles?type=SYSTEM_DEFINED` 请求,以及当配置的模型是推理配置文件时,`GET /inference-profiles/{profile}` 查询。64gateway 还会看到尽力而为的启动流量,它可以拒绝而不会破坏任何东西。Anthropic Messages 格式的 gateway 会收到 `HEAD /api/hello` 连接预热探针,当配置了 HTTP 代理或客户端证书时,Claude Code 会跳过此探针。Amazon Bedrock 格式的 gateway 会收到 `GET /inference-profiles?type=SYSTEM_DEFINED` 请求,以及当配置的模型是推理配置文件时,`GET /inference-profiles/{profile}` 查询。

60 65 


152| Beta [工具字段](https://platform.claude.com/docs/en/agents-and-tools/tool-use/overview) | 工具相关的 beta 请求头与工具架构字段(如 `strict` 和 `defer_loading`)配对 | 当请求体通过而没有其请求头时,命名无法识别的工具架构字段的 `400` | 转发两者,或 [`CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1`](#disable-pre-release-capabilities) |157| Beta [工具字段](https://platform.claude.com/docs/en/agents-and-tools/tool-use/overview) | 工具相关的 beta 请求头与工具架构字段(如 `strict` 和 `defer_loading`)配对 | 当请求体通过而没有其请求头时,命名无法识别的工具架构字段的 `400` | 转发两者,或 [`CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1`](#disable-pre-release-capabilities) |

153| [努力](https://platform.claude.com/docs/en/build-with-claude/effort)和[结构化输出](https://platform.claude.com/docs/en/build-with-claude/structured-outputs) | `output_config` 请求体字段携带努力、结构化输出格式和任务预算设置;每个都与自己的 beta 请求头配对 | 在 Amazon Bedrock 和 Google Cloud 的 Agent Platform 上游上命名 `output_config` 的 `400`,通常是 `Extra inputs are not permitted` | 一起转发字段及其请求头 |158| [努力](https://platform.claude.com/docs/en/build-with-claude/effort)和[结构化输出](https://platform.claude.com/docs/en/build-with-claude/structured-outputs) | `output_config` 请求体字段携带努力、结构化输出格式和任务预算设置;每个都与自己的 beta 请求头配对 | 在 Amazon Bedrock 和 Google Cloud 的 Agent Platform 上游上命名 `output_config` 的 `400`,通常是 `Extra inputs are not permitted` | 一起转发字段及其请求头 |

154| [提示缓存](/docs/zh-CN/prompt-caching) | 无 beta 配对。Claude Code 将 `cache_control` 标记附加到 `system` 块和 `messages` 条目,包括在对话中途附加的 `role: "system"` 条目 | 无错误:对话在每个回合都作为未缓存的输入计费,在 `usage` 中可见为高 `input_tokens` 且缓存活动很少或没有 | 在任何地方原封不动地转发 `cache_control`,并且不要将块形式的 `system` 或消息内容转换为纯字符串 |159| [提示缓存](/docs/zh-CN/prompt-caching) | 无 beta 配对。Claude Code 将 `cache_control` 标记附加到 `system` 块和 `messages` 条目,包括在对话中途附加的 `role: "system"` 条目 | 无错误:对话在每个回合都作为未缓存的输入计费,在 `usage` 中可见为高 `input_tokens` 且缓存活动很少或没有 | 在任何地方原封不动地转发 `cache_control`,并且不要将块形式的 `system` 或消息内容转换为纯字符串 |

155| [令牌计数](https://platform.claude.com/docs/en/build-with-claude/token-counting) | 无 beta 配对;使用 `count_tokens` 端点 | Claude Code 回退到通过消息端点计数上下文使用情况 | 公开该端点,以便令牌计数不会消耗推理请求 |160| [令牌计数](https://platform.claude.com/docs/en/build-with-claude/token-counting) | 无 beta 配对;使用 `count_tokens` 端点 | 无错误:Claude Code 回退到基于字符的估计,因此 `/context` 显示近似计数 | 公开该端点以获得精确的令牌计数 |

156 161 

157`ANTHROPIC_DEFAULT_*_MODEL_SUPPORTED_CAPABILITIES` [变量](/docs/zh-CN/model-config)仅在提供商配置中声明模型功能:`CLAUDE_CODE_USE_BEDROCK`、`CLAUDE_CODE_USE_VERTEX`、`CLAUDE_CODE_USE_FOUNDRY` 和 [`CLAUDE_CODE_USE_MANTLE`](/docs/zh-CN/amazon-bedrock#use-the-mantle-endpoint)。它们在 `ANTHROPIC_BASE_URL` gateway 后面没有效果。162`ANTHROPIC_DEFAULT_*_MODEL_SUPPORTED_CAPABILITIES` [变量](/docs/zh-CN/model-config)仅在提供商配置中声明模型功能:`CLAUDE_CODE_USE_BEDROCK`、`CLAUDE_CODE_USE_VERTEX`、`CLAUDE_CODE_USE_FOUNDRY` 和 [`CLAUDE_CODE_USE_MANTLE`](/docs/zh-CN/amazon-bedrock#use-the-mantle-endpoint)。它们在 `ANTHROPIC_BASE_URL` gateway 后面没有效果。

158 163 


160 自动重试和错误转发165 自动重试和错误转发

161</h3>166</h3>

162 167 

163当上游拒绝 `thinking` 字段、[思考签名](https://platform.claude.com/docs/en/build-with-claude/extended-thinking)、中途对话系统消息或这些消息之一上的 `cache_control` 标记时,Claude Code 会重试请求并为对话的其余部分禁用被拒绝的功能。Claude Code 不重试上下文管理或工具架构字段拒绝;这些 `400` 错误到达开发者。168Claude Code 在上游拒绝后的操作取决于被拒绝的内容:

169 

170* 当上游拒绝 `thinking` 字段、中途对话系统消息或这些消息之一上的 `cache_control` 标记时,Claude Code 会重试请求并为对话的其余部分禁用被拒绝的功能

171* 当上游拒绝[思考签名](https://platform.claude.com/docs/en/build-with-claude/extended-thinking)时,Claude Code 会重试请求而不包含对话的早期思考块,并将其排除在每个后续请求之外。新响应仍然包括思考

172* Claude Code 不重试上下文管理或工具架构字段拒绝,因此这些 `400` 错误到达开发者

164 173 

165重试逻辑与上游的错误措辞匹配,因此原封不动地转发错误响应体。将上游错误包装在自己的信封中的 gateway 会破坏恢复路径,即使它保留了状态代码,除非信封的消息携带稳定的 `capability_rejected:` 令牌。[Claude apps gateway 为云提供商的错误措辞替换这些令牌](/docs/zh-CN/claude-apps-gateway-config#upstream-error-messages),例如 `capability_rejected: prompt_too_long`。174重试逻辑与上游的错误措辞匹配,因此原封不动地转发错误响应体。将上游错误包装在自己的信封中的 gateway 会破坏恢复路径,即使它保留了状态代码,除非信封的消息携带稳定的 `capability_rejected:` 令牌。[Claude apps gateway 为云提供商的错误措辞替换这些令牌](/docs/zh-CN/claude-apps-gateway-config#upstream-error-messages),例如 `capability_rejected: prompt_too_long`。

166 175 

Details

207 207 

208将表中的条件变量添加到相同的 `env` 块。托管的 `ANTHROPIC_BASE_URL` 被强制执行,不能被开发者的 shell 导出覆盖,因为 Claude Code 在进程环境和较低优先级设置上应用它。208将表中的条件变量添加到相同的 `env` 块。托管的 `ANTHROPIC_BASE_URL` 被强制执行,不能被开发者的 shell 导出覆盖,因为 Claude Code 在进程环境和较低优先级设置上应用它。

209 209 

210不要在托管设置中与网关凭证一起包括 `forceLoginMethod` 或 `forceLoginOrgUUID`。任一密钥,具有任何值,在启动时阻止 `ANTHROPIC_API_KEY`、`ANTHROPIC_AUTH_TOKEN` 和 `apiKeyHelper`,因此开发者看到 `This machine's managed settings require a first-party login` 并且无法继续。210不要在托管设置中与网关凭证一起包括 `forceLoginMethod` 或 `forceLoginOrgUUID`。任一密钥,具有任何值,在启动时阻止 `ANTHROPIC_API_KEY`、`ANTHROPIC_AUTH_TOKEN` 和 `apiKeyHelper`,开发者无法继续。他们看到 `This machine's managed settings require a first-party login`,或在 `"gateway"` 值下看到 [`Administrator policy requires a Cloud gateway sign-in`](/docs/zh-CN/errors#administrator-policy-requires-a-cloud-gateway-sign-in)。

211 211 

212[服务器管理的设置](/docs/zh-CN/server-managed-settings#platform-availability)交付需要直接连接到 `api.anthropic.com`,因此它不会到达网关路由的会话。网关部署使用这个基于文件的托管设置路径,它强制执行相同的密钥。212[服务器管理的设置](/docs/zh-CN/server-managed-settings#platform-availability)交付需要直接连接到 `api.anthropic.com`,因此它不会到达网关路由的会话。网关部署使用这个基于文件的托管设置路径,它强制执行相同的密钥。

213 213 

managed-settings.md +445 −0 created

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托管设置是您的组织部署到每个开发者机器上的设置。Claude Code 将它们应用于所有其他级别之上,因此没有用户、项目、本地或 `--settings` 值可以覆盖它们,除了少数[安全敏感的例外](/docs/zh-CN/settings#exceptions-to-managed-settings-precedence),其中来自较低级别的更严格值仍然适用。

10 

11本页面适用于部署托管设置或调试为什么某个设置未应用的管理员。要决定要强制执行什么,请从[决定要强制执行什么](/docs/zh-CN/admin-setup#decide-what-to-enforce)表开始。有关 claude.ai 控制台路径,请参阅[服务器托管设置](/docs/zh-CN/server-managed-settings)。有关开发者自己的值放在哪个文件中,请参阅[设置](/docs/zh-CN/settings)。

12 

13<h2 id="deploy-a-managed-settings-file">

14 部署托管设置文件

15</h2>

16 

17这是在每台机器上放置策略的最快方式:一个 `managed-settings.json` 文件。如果您还没有选择如何交付托管设置,或您的设备在 MDM 下或开发者运行云会话,请先阅读[选择交付机制](#choose-a-delivery-mechanism)。

18 

19<Steps>

20 <Step title="编写 managed-settings.json">

21 编写一个 `managed-settings.json`,其中包含您决定要强制执行的密钥,采用与 `settings.json` 相同的 JSON 形状。[决定要强制执行什么](/docs/zh-CN/admin-setup#decide-what-to-enforce)表列出了每个控制后面的密钥,[设置参考](/docs/zh-CN/settings-reference)中的每个条目都说明了托管源是否可以设置它。此文件阻止两个文件读取,关闭绕过模式,并使 Claude Code 忽略来自用户、项目和本地文件以及 `--allowedTools` 的权限规则:

22 

23 ```json managed-settings.json theme={null}

24 {

25 "permissions": {

26 "deny": [

27 "Read(./.env)",

28 "Read(./secrets/**)"

29 ],

30 "disableBypassPermissionsMode": "disable"

31 },

32 "allowManagedPermissionRulesOnly": true

33 }

34 ```

35 

36 有关显示更多托管密钥形状的更完整示例,包括登录方法、模型、MCP 服务器和市场,请参阅[组织的托管设置](/docs/zh-CN/settings-example#an-organizations-managed-settings)。

37 </Step>

38 

39 <Step title="将文件放在每台机器上">

40 将文件保存为 `managed-settings.json`,位于操作系统的系统目录中,使用已经在您的设备群上放置文件的任何工具:

41 

42 * **macOS**: `/Library/Application Support/ClaudeCode/managed-settings.json`

43 * **Linux 和 WSL**: `/etc/claude-code/managed-settings.json`

44 * **Windows**: `C:\Program Files\ClaudeCode\managed-settings.json`

45 </Step>

46 

47 <Step title="确认策略已应用">

48 在一台机器上,在 Claude Code 内运行 `/status`。`Setting sources` 行显示 `Enterprise managed settings (file)`。在此之后推出到设备群的其余部分;当该行缺失时,[检查策略是否有效](#check-that-a-policy-is-in-force)涵盖了要查看的内容。

49 </Step>

50</Steps>

51 

52<span id="managed-settings-delivery" />

53 

54<span id="delivery-mechanisms" />

55 

56<h2 id="choose-a-delivery-mechanism">

57 选择交付机制

58</h2>

59 

60上述步骤中的文件是将托管设置放到机器上的四种方式之一。每种机制都携带与 `settings.json` 文件相同的策略密钥,因此[设置参考](/docs/zh-CN/settings-reference)适用于所有这些。少数密钥与特定源相关联,每个条目的 Scope 行说明了哪些:

61 

62* **交付控制**:[`policyHelper`](/docs/zh-CN/settings-reference#policyhelper)、[`wslInheritsWindowsSettings`](/docs/zh-CN/settings-reference#wslinheritswindowssettings) 和 [`managedSourcesBehavior`](/docs/zh-CN/settings-reference#managedsourcesbehavior)

63* **网关登录密钥**:[`forceLoginGatewayUrl`](/docs/zh-CN/settings-reference#forcelogingatewayurl) 和 [`forceLoginMethod`](/docs/zh-CN/settings-reference#forceloginmethod) 的 `"gateway"` 值

64 

65托管设置文件、MDM 配置文件或 claude.ai 控制台对其到达的每个人应用一个策略。要为一组开发者提供不同的策略,请将不同的文件或配置文件部署到该组;claude.ai 控制台[还不能针对一个组](/docs/zh-CN/server-managed-settings#current-limitations),而自托管[Claude 应用网关](/docs/zh-CN/claude-apps-gateway)按 IdP 组交付托管设置。

66 

67当多个机制向同一台机器交付策略时,Claude Code 默认使用一个并忽略其他的。[Claude Code 如何组合托管源](#how-claude-code-combines-managed-sources)给出了顺序和适用于每个源的选择加入。

68 

69MDM 和文件行一起称为端点托管设置,因为策略存储在开发者的设备上,而不是服务器托管行,其中 Claude Code 获取它。

70 

71通过您已经管理设备的方式选择一个机制,使用下表。

72 

73| 机制 | 如何交付 | Claude Code 何时读取 | 何时使用 |

74| :---------------------------------------- | :------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------------------------------- | :---------------------------------- |

75| [服务器托管设置](/docs/zh-CN/server-managed-settings) | 在 claude.ai 管理控制台中,或在自托管[Claude 应用网关](/docs/zh-CN/claude-apps-gateway)上 | 在启动时获取并每小时轮询一次;请参阅[需要批准的更改](#where-and-when-a-policy-applies) | 您想要一个地方为 claude.ai 组织更改策略,而无需接触每台机器 |

76| MDM 或操作系统级策略 | 作为 macOS 配置文件或 Windows `HKLM` 注册表值,通过 Jamf、Intune、组策略或类似工具;请参阅[每个机制存储策略的位置](#where-each-mechanism-stores-the-policy) | 在启动时读取并每 30 分钟检查一次更改 | 您已经使用 MDM 或组策略管理设备 |

77| 基于文件 | 作为每台机器上系统目录中的 `managed-settings.json`;请参阅[每个机制存储策略的位置](#where-each-mechanism-stores-the-policy) | 在启动时读取并在文件更改时重新加载 | 没有 MDM 的机器、Linux 主机或您自己构建的镜像 |

78| HKCU 注册表,Windows 和 WSL | 作为 Windows `HKCU` 注册表值;请参阅[每个机制存储策略的位置](#where-each-mechanism-stores-the-policy) | 在启动时读取并每 30 分钟检查一次更改;Claude Code 仅在没有其他托管源交付策略密钥且没有[主机提供的父设置](#let-an-embedding-host-add-policy)提供限制性密钥时使用它 | 您无法写入机器级 `HKLM` 密钥 |

79 

80Jamf、Iru、Intune 和组策略的入门模板在[MDM 示例存储库](https://github.com/anthropics/claude-code/tree/main/examples/mdm)中。

81 

82对于托管 MCP 服务器,您通过 `managed-mcp.json` 与这些中的任何一个一起部署或通过 [`managedMcpServers`](/docs/zh-CN/settings-reference#managedmcpservers) 密钥提供,请参阅[托管 MCP 配置](/docs/zh-CN/managed-mcp)。

83 

84<h3 id="where-and-when-a-policy-applies">

85 策略应用的位置和时间

86</h3>

87 

88部署的策略到达开发者的会话如下:

89 

90* **表面**:在开发者的机器上,终端、VS Code 和 JetBrains 扩展、桌面应用的 Code 选项卡和[Agent SDK](/docs/zh-CN/agent-sdk/typescript)会话读取所有这些源。Agent SDK 会话即使在 `settingSources` 排除用户、项目和本地文件时也加载托管设置。

91* **云会话**:Anthropic 托管环境中的会话不读取设备的 MDM 配置文件或文件,因此其策略必须来自服务器托管设置。[自托管环境](/docs/zh-CN/self-hosted-environments)中的会话也读取其运行器镜像中的托管设置文件,默认情况下仅当服务器托管设置不交付策略密钥时,除了[Claude Code 从每个管理源读取的密钥](#keys-read-from-every-admin-source)。[Claude Code 如何组合托管源](#how-claude-code-combines-managed-sources)涵盖了适用于两者的选择加入。

92* **协作会话**:Claude Desktop 应用中的[协作](https://claude.com/docs/cowork/overview)在 Claude Code 上运行其会话。在协作会话中,Claude Code 永远不会从 claude.ai 管理控制台获取服务器托管设置,即使用户使用 Team 或 Enterprise 帐户登录,因此应用的策略取决于会话运行的位置:

93 

94 * **在用户的机器上**:默认情况下,协作会话中的 Claude Code 读取该设备上的 MDM 或操作系统级策略和托管设置文件,因此在那里部署策略。

95 * **在完整 VM 沙箱中**:当您的 Claude Desktop 托管配置设置 [`requireCoworkFullVmSandbox`](https://claude.com/docs/third-party/claude-desktop/configuration#requirecoworkfullvmsandbox) 时,Claude Code 在虚拟机内运行,其中设备的 MDM 策略和托管设置文件不存在。

96 * **远程协作会话**:这些在 Anthropic 托管的虚拟机上运行,其中 Claude Code 没有设备策略可读。

97 

98 [表面覆盖](/docs/zh-CN/model-config#surface-coverage)表比较了协作与其他表面。

99* **运行会话**:大多数更改在[交付机制表](#choose-a-delivery-mechanism)中的计划上到达运行会话,无需重启。

100 * 对 [`forceRemoteSettingsRefresh`](/docs/zh-CN/settings-reference#forceremotesettingsrefresh)、[`requiredMinimumVersion`](/docs/zh-CN/settings-reference#requiredminimumversion) 和[某些用户可编辑密钥](/docs/zh-CN/settings#when-edits-take-effect)的更改在下一个会话启动时生效。

101 * 新的或更改的 [`policyHelper`](/docs/zh-CN/settings-reference#policyhelper) 条目在下一次启动时生效。如果服务器托管设置在该启动时遮蔽了助手,助手会在获取报告这些设置被删除时立即运行。

102* **需要批准的更改**:除了[等待下一次启动的更新](/docs/zh-CN/server-managed-settings#fetch-and-caching-behavior),对需要[批准](/docs/zh-CN/server-managed-settings#security-approval-dialogs)的设置(如钩子或 `env` 变量)的服务器托管更改等待开发者在交互式会话中接受对话,并在 IDE 扩展或 Agent SDK 托管的会话中应用当前运行。其他服务器托管更改在下一次轮询时应用。

103* **长期会话**:保持打开数周的会话仍然可能滞后于推出。[`requiredMinimumVersion`](/docs/zh-CN/settings-reference#requiredminimumversion)阻止过时的二进制文件启动,不会结束已经运行的会话。

104 

105<span id="format-the-policy-for-each-platform" />

106 

107<h3 id="where-each-mechanism-stores-the-policy">

108 每个机制存储策略的位置

109</h3>

110 

111密钥在任何地方都是相同的,但每个机制以不同的位置和形状存储它们:

112 

113* **服务器托管**:Anthropic 的服务器或您的网关持有策略。Claude Code 保留一个本地缓存,在启动时应用它,并在每次成功获取时[替换](/docs/zh-CN/server-managed-settings#security-considerations)。

114* **macOS 配置文件**:`com.anthropic.claudecode` 托管首选项域。使用与 `managed-settings.json` 相同的顶级密钥,嵌套设置为字典,列表为 plist 数组。

115* **Windows HKLM 注册表**:JSON 作为 `HKLM\SOFTWARE\Policies\ClaudeCode` 下名为 `Settings` 的 `REG_SZ` 或 `REG_EXPAND_SZ` 值。

116* **基于文件**:`managed-settings.json`、可选的 `managed-settings.d/` 目录和 `managed-mcp.json` 在系统目录中:macOS 上的 `/Library/Application Support/ClaudeCode/`、Linux 和 WSL 上的 `/etc/claude-code/`,以及 Windows 上的 `C:\Program Files\ClaudeCode\`。Claude Code 不读取旧版 Windows 路径 `C:\ProgramData\ClaudeCode\managed-settings.json`。

117* **Windows HKCU 注册表**:`HKCU\SOFTWARE\Policies\ClaudeCode` 下的相同 `Settings` 值。

118 

119<h3 id="split-a-file-based-policy-across-teams">

120 跨团队拆分基于文件的策略

121</h3>

122 

123如果多个团队拥有一个策略的部分,将每个部分放在 `managed-settings.d/` 中的自己的文件中,位于与 `managed-settings.json` 相同的系统目录中,而不是编辑一个共享文件。

124 

125Claude Code 首先合并 `managed-settings.json`,然后按字母顺序合并目录中的每个 `*.json` 文件。使用数字前缀命名文件以控制顺序,例如 `10-telemetry.json` 和 `20-security.json`。Claude Code 忽略隐藏文件和不以 `.json` 结尾的文件。

126 

127当两个文件设置相同的密钥时,Claude Code 按这些规则组合它们:

128 

129* **单个值**,例如 `"model": "opus"` 或 `"cleanupPeriodDays": 7`:后面文件的值替换前面的值

130* **列表**,例如 `permissions.deny` 或 `sandbox.network.allowedDomains`:两个列表组合,删除重复项

131* **嵌套块**,例如 `env` 或 `sandbox`:两个块逐个密钥合并,每个密钥内遵循这些相同的规则

132* **`fallbackModel`**:后面的链整体替换前面的链

133* **[`extraKnownMarketplaces`](/docs/zh-CN/settings-reference#extraknownmarketplaces) 和 [`managedMcpServers`](/docs/zh-CN/settings-reference#managedmcpservers)**:具有相同名称的后面条目整体替换前面的条目

134* **[`modelPicker`](/docs/zh-CN/settings-reference#modelpicker)**:后面的阵容整体替换前面的阵容

135 

136<span id="precedence-within-the-managed-tier" />

137 

138<span id="which-managed-source-claude-code-uses" />

139 

140<h2 id="how-claude-code-combines-managed-sources">

141 Claude Code 如何组合托管源

142</h2>

143 

144当您的组织向同一台机器交付多个托管源时,[`managedSourcesBehavior`](/docs/zh-CN/settings-reference#managedsourcesbehavior) 密钥决定 Claude Code 对其他源的处理:

145 

146* **`"first-wins"`,默认值**:Claude Code 使用交付至少一个策略密钥的最高排名源,并忽略其余的,除了[从每个管理源读取的密钥](#keys-read-from-every-admin-source)中的少数几个。Claude Code 对跳过的源不显示警告;`/status`[命名它使用的源和跳过的源](#read-the-source-in-/status)。

147* **`"merge"`**:Claude Code 应用交付策略密钥的每个管理源,并按密钥类型组合它们:在大多数密钥上,最高排名源的值适用,列表联合,锁采用最严格的值。[组合每个托管源](#compose-every-managed-source)说明了在哪里设置密钥以及每种密钥类型如何组合。需要 Claude Code v2.1.242 或更高版本。

148 

149两个设置以相同的方式排名源。本节中重复出现两个术语:

150 

151* **策略密钥**:除了两个控制密钥 [`wslInheritsWindowsSettings`](/docs/zh-CN/settings-reference#wslinheritswindowssettings) 和 [`managedSourcesBehavior`](/docs/zh-CN/settings-reference#managedsourcesbehavior) 之外的任何设置密钥。仅包含这些的托管设置文件或 MDM 策略不计数,Claude Code 移动到下一个源。

152* **管理源**:下面前三个源之一。HKCU 注册表是用户可写的,不是一个。

153 

154Claude Code 按此顺序检查源,最高优先级优先:

155 

1561. 远程设置,从 claude.ai 作为[服务器托管设置](/docs/zh-CN/server-managed-settings)或由[Claude 应用网关](/docs/zh-CN/claude-apps-gateway)交付。Claude Code 仅在会话使用[符合条件的登录或密钥](/docs/zh-CN/server-managed-settings#platform-availability)直接向 Anthropic 的 API 进行身份验证,或使用 `/login` 登录网关时获取此源。在其他提供商上,或当 `ANTHROPIC_BASE_URL` 指向 Anthropic 的 API 以外的地方时,它从下一个源开始

1572. MDM 或操作系统级策略:macOS plist 或 HKLM 注册表密钥

1583. 托管设置文件,`managed-settings.d/*.json` 和 `managed-settings.json` 合并在一起

1594. HKCU 注册表,在 Windows 上,以及在 WSL 上一旦 HKLM 注册表或 Windows 托管设置文件打开 [`wslInheritsWindowsSettings`](/docs/zh-CN/settings-reference#wslinheritswindowssettings) 并且 HKCU 值也设置它。Claude Code 仅在上面没有源交付策略密钥且没有[主机提供的父设置](#let-an-embedding-host-add-policy)提供限制性密钥时读取它

160 

161此图显示了排名,以及 Claude Code 在任一设置下从前三个源读取的跨源密钥示例:

162 

163<img src="https://mintcdn.com/claude-code/zuWID2B-Rxm8DEC8/images/managed-source-precedence.svg?fit=max&auto=format&n=zuWID2B-Rxm8DEC8&q=85&s=53f6be49f06eff48e01422c8ae1bc2e6" className="dark:hidden" alt="显示四个托管设置源的图表,从顶部的远程设置排名到 MDM、托管设置文件和底部的 HKCU 注册表。默认情况下,具有策略密钥的第一个源提供策略,其余的被跳过;设置 managedSourcesBehavior 为 merge 时,具有策略密钥的每个管理源都有贡献,按密钥类型组合,HKCU 注册表保持不变。侧面板显示跨源密钥(如沙箱锁、forceRemoteSettingsRefresh 和每个变量 env 合并)从每个管理源读取,不包括 HKCU 注册表。" width="680" height="330" data-path="images/managed-source-precedence.svg" />

164 

165<img src="https://mintcdn.com/claude-code/zuWID2B-Rxm8DEC8/images/managed-source-precedence-dark.svg?fit=max&auto=format&n=zuWID2B-Rxm8DEC8&q=85&s=ae407a9a08a3d680e80cf1a2af845d71" className="hidden dark:block" alt="显示四个托管设置源的图表,从顶部的远程设置排名到 MDM、托管设置文件和底部的 HKCU 注册表。默认情况下,具有策略密钥的第一个源提供策略,其余的被跳过;设置 managedSourcesBehavior 为 merge 时,具有策略密钥的每个管理源都有贡献,按密钥类型组合,HKCU 注册表保持不变。侧面板显示跨源密钥(如沙箱锁、forceRemoteSettingsRefresh 和每个变量 env 合并)从每个管理源读取,不包括 HKCU 注册表。" width="680" height="330" data-path="images/managed-source-precedence-dark.svg" />

166 

167<h3 id="keys-read-from-every-admin-source">

168 从每个管理源读取的密钥

169</h3>

170 

171在默认的 `"first-wins"` 设置下,Claude Code 仅从[它选择的源](#how-claude-code-combines-managed-sources)读取大多数密钥,并忽略较低排名源中的值,即使选定的源未设置该密钥。

172 

173少数密钥的工作方式不同。Claude Code 从每个管理源读取它们,因此当选定的源不设置它们时,较低排名的 MDM 策略或托管设置文件仍然可以设置它们。Claude Code 将用户可写的 HKCU 注册表排除在该扫描之外;当 HKCU 是唯一的源且没有主机提供父设置时,HKCU 像任何选定的源一样应用。

174 

175跨源密钥包括:

176 

177* `sandbox.network.allowManagedDomainsOnly` 和 `sandbox.filesystem.allowManagedReadPathsOnly`:任何管理源中的 `true` 打开锁。当锁打开时,Claude Code 联合它锁定的允许列表,`sandbox.network.allowedDomains` 与 `WebFetch(domain:...)` 允许规则,或 `sandbox.filesystem.allowRead`,跨每个管理源。没有锁,Claude Code 将允许列表视为任何其他密钥,因此在 `"first-wins"` 下,未选定的管理源的允许列表被忽略

178* `allowAllClaudeAiMcps`

179* 沙箱二进制路径 `sandbox.bwrapPath` 和 `sandbox.socatPath`

180* 沙箱 `ripgrep` 二进制,[`sandbox.ripgrep`](/docs/zh-CN/settings-reference#sandbox-ripgrep)

181* `sandbox.filesystem.disabled` 和 `sandbox.network.strictAllowlist`

182* [`useAutoModeDuringPlan`](/docs/zh-CN/settings-reference#useautomodeduringplan) 和 [`syncClaudeAiSkills`](/docs/zh-CN/settings-reference#syncclaudeaiskills),其中任何管理源的 `false` 关闭行为。开发者的用户或本地设置中的 `false` 也关闭它;每个密钥只能拒绝

183* [`enableArtifact`](/docs/zh-CN/settings-reference#enableartifact),其中任何管理源的 `false` 关闭[Artifact 工具](/docs/zh-CN/artifacts)。开发者的用户、项目或本地设置中的 `false` 也关闭它,没有源打开它;请参阅[哪些较低级别的值仍然计数](/docs/zh-CN/settings#exceptions-to-managed-settings-precedence)。需要 Claude Code v2.1.242 或更高版本

184* [`maxEffortLevel`](/docs/zh-CN/settings-reference#maxeffortlevel),其中任何管理源中的最低上限适用。如果开发者在自己的设置或 `--settings` 中设置了较低的上限,Claude Code 应用那个;没有源可以提高上限。需要 Claude Code v2.1.267 或更高版本

185* `attribution` 中的提交预告片选择退出,或在已弃用的 `includeCoAuthoredBy` 中,来自任何层

186* [`forceRemoteSettingsRefresh`](/docs/zh-CN/server-managed-settings)

187* 跨管理源按变量合并的 `env`:每个变量来自定义它的最高优先级源,因此较低源填充较高源未设置的变量。少数变量遵循自己的规则;[跨托管源的每个密钥例外](/docs/zh-CN/server-managed-settings#per-key-exceptions-across-managed-sources)命名每一个。需要 Claude Code v2.1.223 或更高版本。在 v2.1.223 之前,Claude Code 仅应用选定源的整个 `env` 块

188 

189<h3 id="compose-every-managed-source">

190 组合每个托管源

191</h3>

192 

193要让 Claude Code 应用您的组织交付的每个管理源,在您部署的最高排名源中设置 [`managedSourcesBehavior`](/docs/zh-CN/settings-reference#managedsourcesbehavior) 为 `"merge"`。Claude Code 仅从携带密钥或策略密钥的最高排名源读取密钥,因此较低源无法选择自己与上面的源合并,从不接收服务器托管设置的机器也需要在其 MDM 配置文件中有密钥。用户可写的 HKCU 注册表永远不会与另一个源合并。需要 Claude Code v2.1.242 或更高版本。

194 

195在 `"merge"` 下,Claude Code 添加较低源的列表条目,例如 `permissions.allow` 规则和钩子,到策略,因此仅在排名在最高源下面的每个源都在管理员的控制下时打开它。

196 

197此表显示了 Claude Code 在 `"merge"` 下如何组合每种密钥。[`managedSourcesBehavior` 条目](/docs/zh-CN/settings-reference#managedsourcesbehavior)命名限制允许列表、值整体取用和仅最高源行中的每个密钥。

198 

199| 密钥类型 | Claude Code 如何组合它 | 示例 |

200| :----------- | :------------------------------------------------------------------- | :---------------------------------------------------------------------------------------------------------- |

201| 列表 | 组合来自每个源的条目 | `permissions.allow`、`hooks`、`sandbox.network.allowedDomains`、`deniedMcpServers` |

202| 锁 | 应用任何源设置的最严格值;较松散的值仅从最高排名源应用 | `allowManagedHooksOnly`、`permissions.disableBypassPermissionsMode`、`crossSessionInbound` |

203| 限制允许列表 | 从设置它的最高排名源整体取用列表,不添加来自较低源的条目 | `availableModels`、`allowedMcpServers`、`strictKnownMarketplaces`、`allowedChannelPlugins` 和 `fallbackModel` 链 |

204| 值整体取用 | 从设置它的最高排名源整体取用值,不组合来自较低源的条目或字段 | `sandbox.credentials.awsPairs`、`sandbox.ripgrep` |

205| 提供的 MCP 服务器 | 组合来自每个源的服务器名称;当两个源设置相同的名称时,应用最高排名源的整个条目 | `managedMcpServers` |

206| 仅从最高排名源读取的密钥 | 忽略每个较低源中的密钥,即使最高排名源未设置它 | 凭证助手,如 `apiKeyHelper`、登录 pin,如 `forceLoginOrgUUID`、`modelPicker`、`permissions.defaultMode` |

207| `env` | 在任一设置下按变量跨管理源合并,如[从每个管理源读取的密钥](#keys-read-from-every-admin-source)所述 | |

208| 每个其他密钥 | 从设置它的最高排名源取用值 | `model`、`cleanupPeriodDays` |

209 

210要确认哪些源在机器上组合,[读取 `/status` 中的 `Setting sources` 行](#read-the-source-in-/status);该部分说明了每个标签的含义。

211 

212<h3 id="compute-the-policy-with-a-helper-program">

213 使用助手程序计算策略

214</h3>

215 

216[`policyHelper`](/docs/zh-CN/settings-reference#policyhelper) 是您的 MDM 策略或托管设置文件命名的可执行文件,Claude Code 在启动时运行它来计算托管设置。当选定的源配置一个并且助手发出 `managedSettings` 对象时,该输出改变 Claude Code 读取的内容:

217 

218* **发出的 `managedSettings` 对象是会话的唯一托管设置**,包括[它否则从每个管理源读取的密钥](#keys-read-from-every-admin-source),除了[`forceRemoteSettingsRefresh`,它有自己的启动规则](/docs/zh-CN/settings-reference#forceremotesettingsrefresh)

219 

220有关哪些助手运行失败以及 Claude Code 在一个失败时的处理,请参阅[助手失败](/docs/zh-CN/settings-reference#helper-failures)。

221 

222<span id="parent-settings-from-embedding-hosts" />

223 

224<span id="control-policy-from-an-embedding-host" />

225 

226<span id="merge-policy-from-an-embedding-host" />

227 

228<h3 id="let-an-embedding-host-add-policy">

229 让嵌入主机添加策略

230</h3>

231 

232当另一个应用程序启动 Claude Code 时,例如 Claude Desktop、IDE 扩展或 Agent SDK 应用,该主机可以通过 SDK `managedSettings` 选项传递自己的托管设置。Claude Code 将这些称为父设置。

233 

234默认情况下,只要存在管理源,Claude Code 就忽略父设置:服务器托管设置、MDM 或操作系统级策略或托管设置文件。

235 

236要让 Claude Code 将父设置与管理源合并,在最高优先级托管源中设置 [`parentSettingsBehavior`](/docs/zh-CN/settings-reference#parentsettingsbehavior) 为 `"merge"`;Claude Code 仅从该源读取密钥。

237 

238Claude Code 然后仅保留主机的限制 Claude 可以做什么的值,有一个要了解的间隙:除非您也设置 `allowManaged*Only` 锁,主机的权限允许规则和沙箱允许列表仍然适用。请参阅[限制父设置](/docs/zh-CN/claude-apps-gateway#restrict-parent-settings)以获取锁。

239 

240[`policyHelper`](/docs/zh-CN/settings-reference#policyhelper) 可以关闭父合并,无论此密钥如何;其条目说明了何时。

241 

242Claude Code 也对父提供的值本身应用这些检查:

243 

244* 当任何管理源设置 `allowManagedPermissionRulesOnly` 时,Claude Code 在读取时删除[父提供的](/docs/zh-CN/claude-apps-gateway#restrict-parent-settings)权限允许规则和 `additionalDirectories`,即使较高优先级源未设置密钥。密钥对您自己的权限规则的影响来自 Claude Code 应用的托管设置,或来自您选择合并的父设置

245* Claude Code 强制执行它应用的托管设置中的 `forceLoginOrgUUID` 或 `allowedMcpServers` 值,并阻止父提供的值。较低管理源中的值,Claude Code 不应用既不应用也不阻止父的。[`managedSourcesBehavior`](/docs/zh-CN/settings-reference#managedsourcesbehavior) 条目说明了在 `"merge"` 下哪个源提供每个密钥。在 v2.1.223 之前,任何管理源中的值阻止了父的

246* `availableModels` 值遵循与 `allowedMcpServers` 相同的规则

247 

248<h4 id="keep-cowork-folder-access-when-only-managed-rules-apply">

249 当仅应用托管规则时保持协作文件夹访问

250</h4>

251 

252Claude Desktop 应用中的[协作](https://claude.com/docs/cowork/overview)在 Claude Code 上运行其会话,并通过它在启动会话时作为父设置提供的允许规则授予每个会话对其工作文件夹(如用户连接的文件夹)的访问权限。当您的托管策略设置 [`allowManagedPermissionRulesOnly`](/docs/zh-CN/settings-reference#allowmanagedpermissionrulesonly) 时,Claude Code 仅保留托管策略中的允许规则:它删除主机作为父设置、`--allowedTools` 或设置文件中提供的允许规则,因此对这些文件夹的写入失去其预批准。在要求编辑前提示的协作会话中,协作无法显示提示,Claude 将每个写入报告为被阻止,因为路径解析为受保护位置或连接文件夹外的路径。

253 

254要恢复写入,为这些文件夹添加允许规则到 Claude Code [选择](#precedence-within-the-managed-tier)的托管源在这些机器上:在 MDM 托管的设备群上,那是 MDM 策略而不是单独的托管设置文件。此示例使用文件形式,MDM 策略采用相同的密钥。它保持 `allowManagedPermissionRulesOnly` 设置并允许在每个用户的主目录中的 `CoworkProjects` 文件夹下编辑;用您的用户连接的文件夹替换路径:

255 

256```json managed-settings.json theme={null}

257{

258 "allowManagedPermissionRulesOnly": true,

259 "permissions": {

260 "allow": [

261 "Edit(~/CoworkProjects/**)"

262 ]

263 }

264}

265```

266 

267部署策略后,Claude 可以在新协作会话中保存该文件夹下的文件。[读和编辑规则](/docs/zh-CN/permissions#read-and-edit)涵盖路径语法,包括绝对路径的 `//` 形式。

268 

269<h3 id="what-a-developer-can-change">

270 开发者可以更改什么

271</h3>

272 

273开发者自己的设置文件、`--settings` 值和项目文件永远不会覆盖托管值;[例外](/docs/zh-CN/settings#exceptions-to-managed-settings-precedence)仅让更严格的较低级别值计数。四件事在该规则之外:

274 

275* **会话的模型**:托管 `model` 是默认值,不是锁。`--model` 和 `ANTHROPIC_MODEL` 仍然为该会话选择模型,因此部署 [`availableModels`](/docs/zh-CN/settings-reference#availablemodels) 来限制选择。

276* **本地管理员权限**:作为机器上的管理员的开发者可以编辑托管源本身,这就是为什么 MDM 工具可以按计划重新部署配置文件或文件,以及为什么 HKLM 注册表和 macOS 托管首选项域存在。

277* **服务器托管缓存**:服务器托管设置来自 Anthropic 的服务器,对本地缓存的编辑[仅持续到下一次成功获取](/docs/zh-CN/server-managed-settings#security-considerations)。

278* **其他工具**:托管设置仅绑定 Claude Code。从另一个工具调用 API 的开发者不在它们下。

279 

280<span id="verify-enforcement" />

281 

282<span id="verify-that-a-policy-is-in-force" />

283 

284<h2 id="check-that-a-policy-is-in-force">

285 检查策略是否生效

286</h2>

287 

288开发人员报告说某个策略未应用,或者您想在将其推送到整个设备群之前确认推出已完成。该机器上的两个命令可以回答这个问题:`/status` 显示 Claude Code 选择了哪个托管源,`claude doctor` 列出它丢弃了什么。

289 

290<h3 id="read-the-source-in-/status">

291 在 /status 中读取源

292</h3>

293 

294在开发人员的机器上,在 Claude Code 中运行 `/status` 并读取 `Setting sources` 行。当托管源生效时,该行列出 `Enterprise managed settings`,并在括号中显示 Claude Code 选择的源:

295 

296* `(remote)`:来自 claude.ai 或网关的服务器管理的设置

297* `(plist)` 或 `(HKLM)`:MDM 或操作系统策略

298* `(file)`、`(drop-ins)` 或 `(file + drop-ins)`:`managed-settings.json`、drop-in 目录或两者

299* `(remote + file, merged)` 或其他以 `, merged` 结尾的列表:您的组织[组合每个托管源](#compose-every-managed-source),Claude Code 将列出的源合并到策略中。较低的源仍然可以提供 `env` 变量而不出现在列表中。需要 Claude Code v2.1.242 或更高版本

300* `(HKCU)`:用户可写的注册表回退

301* `(parent process)`:[嵌入主机](#let-an-embedding-host-add-policy)提供的限制性设置

302* `(helper)`:由选定的 MDM 或文件源配置的 [`policyHelper`](/docs/zh-CN/settings-reference#policyhelper)

303 

304当 Claude Code 在机器上找到托管源但未选择它时,第二行 `Skipped sources` 会列出每个这样的源。读取它以区分策略从未到达机器和策略到达但被更高优先级源覆盖的情况。需要 Claude Code v2.1.242 或更高版本。

305 

306当策略未应用时,`Setting sources` 行告诉您有以下两个问题中的哪一个:

307 

308* **该行缺失**:Claude Code 未找到传递策略密钥的托管源。

309 

310 如果您部署了托管设置文件,请检查它是否位于操作系统的路径中,以及它是否包含[策略密钥](#how-claude-code-combines-managed-sources)而不仅仅是控制密钥。不是有效 JSON 的文件不会产生这种状态;Claude Code [拒绝启动](#find-entries-claude-code-dropped)。

311 

312 当您改为通过服务器管理的设置部署时,运行 `claude doctor`,它报告[获取结果](/docs/zh-CN/server-managed-settings#verify-settings-delivery)。

313* **该行命名的源不是您部署的源**:存在更高优先级的源,Claude Code 忽略了您的源,`Skipped sources` 列出了它。[Claude Code 如何组合托管源](#how-claude-code-combines-managed-sources)给出了顺序。

314 

315<span id="invalid-entries-in-managed-settings" />

316 

317<h3 id="find-entries-claude-code-dropped">

318 查找 Claude Code 丢弃的条目

319</h3>

320 

321当托管设置文件、MDM 配置文件、注册表值或服务器管理的有效负载未通过架构验证时,Claude Code 首先跳过它可以修复的单个条目(例如一个无效的权限规则),每个都带有警告,然后丢弃其值仍然失败的任何顶级密钥,并继续强制执行每个剩余的有效密钥。

322 

323Claude Code 对 [`policyHelper`](/docs/zh-CN/settings-reference#policyhelper) 发出的 `managedSettings` 更严格:它进行相同的条目修复,但任何幸存的架构违规都会导致整个 helper 运行失败,在启动时 Claude Code 拒绝启动,与 helper 以非零状态退出相同。

324 

325当托管设置文件、drop-in 文件、MDM plist 或 HKLM 注册表值存在但无法解析为 JSON 对象时,Claude Code 拒绝启动并打印[命名源的错误](/docs/zh-CN/errors#managed-settings-document-could-not-be-parsed),即使另一个管理员源传递有效策略。每个源在以下情况下以这种方式失败:

326 

327* **托管设置文件或 drop-in 文件**:文件不是有效的 JSON,或其顶级不是对象

328* **MDM plist**:macOS 的 `plutil` 报告 plist 格式错误,或其转换的内容不是 JSON 对象

329* **HKLM 注册表值**:`Settings` 值不是字符串、为空或不包含 JSON 对象

330 

331三种源状态不会导致此拒绝:

332 

333* 缺少的文件、配置文件或注册表值不是失败;Claude Code 在没有该源的情况下运行。

334* 空的托管设置文件计为 `{}`。

335* 用户可写的 HKCU 注册表密钥中的格式错误的值永远不会阻止启动。Claude Code 在 `/status` 和 `claude doctor` 中将其报告为通知。

336 

337如果无法读取托管设置文件、drop-in 文件或 `managed-settings.d/` 目录,且没有管理员源提供策略,使用 claude.ai 或 Claude Console 凭据登录的会话将在启动时退出,并显示联系管理员的消息。

338 

339要查找丢弃的条目,请查看以下三个位置之一:

340 

341* 交互式会话在启动时显示一个对话框,列出无效条目。

342* 使用 `-p` 的非交互式运行将摘要打印到 stderr。

343* [`claude doctor`](/docs/zh-CN/debug-your-config) 列出每个无效条目及其源和字段。

344 

345<h4 id="keys-that-fail-closed">

346 失败关闭的密钥

347</h4>

348 

349少数强制密钥在无效时不会被丢弃。Claude Code 强制执行更严格的回退,直到修复该值;该表显示了对每个密钥强制执行的内容:

350 

351| 字段 | 存在但无效时的行为 |

352| :---------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

353| `allowedMcpServers` | 强制执行为空的允许列表,直到修复该值,因此用户添加的 MCP 服务器都不被允许。您的组织通过 [`managedMcpServers`](/docs/zh-CN/settings-reference#managedmcpservers) 传递的服务器仍然加载,`managed-mcp.json` 服务器根据[如何评估服务器](/docs/zh-CN/managed-mcp#how-a-server-is-evaluated)加载。单个无效条目被剥离,有效子集被强制执行。 |

354| `allowedHttpHookUrls` | Claude Code 强制执行空的[允许列表](/docs/zh-CN/settings-reference#allowedhttphookurls),直到您修复该值,因此 HTTP hook 仅在另一个设置文件列出其 URL 时运行。如果只有单个条目无效,Claude Code 会剥离该条目并强制执行其余的。 |

355| `httpHookAllowedEnvVars` | Claude Code 强制执行空的[允许列表](/docs/zh-CN/settings-reference#httphookallowedenvvars),直到您修复该值,因此仅当另一个设置文件命名标头变量时才会插值。如果只有单个条目无效,Claude Code 会剥离该条目并强制执行其余的。 |

356| `allowedChannelPlugins` | Claude Code 强制执行空的允许列表,直到您修复该值,因此传递给 `--channels` 的任何通道插件都不被允许。如果只有单个条目无效,它会剥离该条目并强制执行其余的。 |

357| `allowManagedHooksOnly` | 视为 `true`,直到修复:[hook 限制](/docs/zh-CN/settings-reference#allowmanagedhooksonly)适用,除非 `disableCommandPluginSources` 明确为 `false`,否则命令源插件被禁用。 |

358| `allowManagedMcpServersOnly` | 视为 `true`。 |

359| `disableCommandPluginSources` | 视为 `true`,因此命令源插件保持禁用,直到修复该值。 |

360| `availableModels` | 强制执行为空的允许列表,直到修复,因此只有默认模型可用;非字符串条目被剥离,有效子集被强制执行。 |

361| `enforceAvailableModels` | 视为 `true`。 |

362| `forceLoginOrgUUID` | 在修复该值之前,不允许任何组织登录。 |

363| `crossSessionInbound` | 视为 `refuse`,最严格的值,因此入站[跨会话消息](/docs/zh-CN/cross-session-messaging#control-inbound-messages)被拒绝,直到修复该值。开发人员看到[警告](/docs/zh-CN/errors#crosssessioninbound-must-be-one-of-accept-hold-refuse)。 |

364| `deniedMcpServers` | 单个无效条目被剥离,有效子集被强制执行。完全无效的值被丢弃并带有警告,因为拒绝每个服务器会阻止策略从未命名的服务器。 |

365| `sandbox.credentials` | 可恢复的无效条目降级为 `mode: "deny"` 并带有警告;不可恢复的条目被剥离;有效条目保持强制执行。请参阅[托管设置中的无效凭据条目](/docs/zh-CN/settings-reference#invalid-credential-entries-in-managed-settings) |

366 

367`allowedHttpHookUrls` 和 `httpHookAllowedEnvVars` 跨设置文件合并,因此您的用户、项目或本地设置中的条目在托管列表为空时仍然适用。这两个密钥和 `allowedChannelPlugins` 的回退需要 Claude Code v2.1.267 或更高版本;早期版本在其值或任何条目无效时整体丢弃该密钥。

368 

369`requiredMinimumVersion` 和 `requiredMaximumVersion` 按设计失败开放:无效值被丢弃而不是强制执行。

370 

371此容限仅适用于托管设置。用户、项目和本地设置文件保持严格:JSON 或顶级形状验证失败的文件被整体拒绝并报告,失败的单个条目(例如格式错误的权限规则)被跳过并带有警告,而文件的其余部分适用。

372 

373<span id="managed-only-settings" />

374 

375<h2 id="keys-only-a-managed-source-can-set">

376 仅托管源可以设置的密钥

377</h2>

378 

379Claude Code 仅从托管源读取以下密钥;将它们放在用户或项目设置文件中无效。

380 

381大多数是锁:锁管理的值,例如权限规则或 `sandbox.network.allowedDomains`,是任何级别都可以设置的普通密钥,锁告诉 Claude Code 仅尊重托管值。

382 

383表涵盖权限、插件和交付控制。对于此处未列出的任何密钥,[设置参考](/docs/zh-CN/settings-reference#all-settings)索引的 Scope 列说明它是否仅托管;那里的剩余仅托管密钥包括网关登录 URL、版本、浏览器、移动模拟器、SSH 主机、Desktop 本地会话、沙箱二进制路径、模型定价和 CLAUDE.md 控制。

384 

385| 设置 | 描述 |

386| :----------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

387| [`allowAllClaudeAiMcps`](/docs/zh-CN/settings-reference#allowallclaudeaimcps) | 加载 Claude Code 自己获取的 claude.ai 连接器,与部署的 `managed-mcp.json` 一起,而不是抑制它们 |

388| [`allowedChannelPlugins`](/docs/zh-CN/settings-reference#allowedchannelplugins) | 可能推送消息的通道插件的允许列表。设置时替换默认 Anthropic 允许列表。需要 `channelsEnabled: true`。请参阅[限制哪些通道插件可以运行](/docs/zh-CN/channels#restrict-which-channel-plugins-can-run) |

389| [`allowManagedHooksOnly`](/docs/zh-CN/settings-reference#allowmanagedhooksonly) | 当 `true` 时,限制哪些钩子运行;请参阅[在 `allowManagedHooksOnly` 下运行什么](/docs/zh-CN/settings-reference#what-runs-under-allowmanagedhooksonly)以获取完整效果列表 |

390| [`allowManagedMcpServersOnly`](/docs/zh-CN/settings-reference#allowmanagedmcpserversonly) | 当 `true` 时,仅尊重来自托管设置的 `allowedMcpServers`。`deniedMcpServers` 仍然从所有源合并。请参阅[托管 MCP 配置](/docs/zh-CN/managed-mcp) |

391| [`allowManagedPermissionRulesOnly`](/docs/zh-CN/settings-reference#allowmanagedpermissionrulesonly) | 使托管设置成为权限规则的唯一设置源。条目列出它忽略的每个源 |

392| [`blockedMarketplaces`](/docs/zh-CN/settings-reference#blockedmarketplaces) | 市场源的阻止列表。被阻止的源在下载前被检查,因此它们永远不会接触文件系统。请参阅[托管市场限制](/docs/zh-CN/plugin-marketplaces#managed-marketplace-restrictions) |

393| [`channelsEnabled`](/docs/zh-CN/settings-reference#channelsenabled) | 允许组织的[通道](/docs/zh-CN/channels)。请参阅[企业控制](/docs/zh-CN/channels#enterprise-controls)以获取每个计划上的默认值 |

394| [`disableCommandPluginSources`](/docs/zh-CN/settings-reference#disablecommandpluginsources) | 当 `true` 时,完全阻止[`command` 插件源](/docs/zh-CN/plugin-marketplaces#command-sources),因此市场声明的命令永远不会运行。也阻止市场[`headersHelper` 命令](/docs/zh-CN/plugin-marketplaces#authenticate-archive-downloads),除了托管设置本身声明的市场。未设置时,遵循 `allowManagedHooksOnly`。需要 Claude Code v2.1.229 或更高版本,`headersHelper` 块需要 v2.1.238 或更高版本 |

395| [`disableSideloadFlags`](/docs/zh-CN/settings-reference#disablesideloadflags) | 在启动时拒绝 `--plugin-dir`、`--plugin-url`、`--agents` 和 `--mcp-config` 标志。在云会话中,Claude Code 删除服务器通过 `--mcp-config` 交付的 MCP 服务器,除了进程内 `type: "sdk"` 条目,并启动会话。需要 Claude Code v2.1.193 或更高版本 |

396| [`forceRemoteSettingsRefresh`](/docs/zh-CN/settings-reference#forceremotesettingsrefresh) | 当 `true` 时,阻止 CLI 启动,直到远程托管设置被新鲜获取,如果获取失败则退出。请参阅[失败关闭强制执行](/docs/zh-CN/server-managed-settings#enforce-fail-closed-startup) |

397| [`managedMcpServers`](/docs/zh-CN/settings-reference#managedmcpservers) | 提供给每个用户的远程 MCP 服务器,与他们自己的一起。它提供服务器而不是锁定任何东西。请参阅[通过托管设置提供服务器](/docs/zh-CN/managed-mcp#provide-servers-through-managed-settings)。需要 Claude Code v2.1.259 或更高版本 |

398| [`managedSourcesBehavior`](/docs/zh-CN/settings-reference#managedsourcesbehavior) | Claude Code 是仅应用最高优先级托管源还是[组合它们中的每一个](#compose-every-managed-source) |

399| [`parentSettingsBehavior`](/docs/zh-CN/settings-reference#parentsettingsbehavior) | 主机提供的父设置是否在托管策略下合并 |

400| [`pluginSuggestionMarketplaces`](/docs/zh-CN/settings-reference#pluginsuggestionmarketplaces) | Claude Code 可能向用户建议其插件的市场 |

401| [`pluginTrustMessage`](/docs/zh-CN/settings-reference#plugintrustmessage) | 附加到安装前显示的插件信任警告的自定义消息 |

402| [`policyHelper`](/docs/zh-CN/settings-reference#policyhelper) | 在启动时计算托管设置的可执行文件;请参阅[使用策略助手计算托管设置](/docs/zh-CN/settings-reference#policyhelper) |

403| [`sandbox.filesystem.allowManagedReadPathsOnly`](/docs/zh-CN/settings-reference#sandbox-filesystem-allowmanagedreadpathsonly) | 当 `true` 时,仅尊重来自托管设置的 `filesystem.allowRead` 路径。`denyRead` 仍然从所有源合并 |

404| [`sandbox.network.allowManagedDomainsOnly`](/docs/zh-CN/settings-reference#sandbox-network-allowmanageddomainsonly) | 仅尊重托管 `allowedDomains` 和 `WebFetch(domain:...)` 允许规则;阻止其他域而不提示 |

405| [`strictKnownMarketplaces`](/docs/zh-CN/settings-reference#strictknownmarketplaces) | 控制用户可以添加和安装插件的插件市场源。请参阅[托管市场限制](/docs/zh-CN/plugin-marketplaces#managed-marketplace-restrictions) |

406| [`strictPluginOnlyCustomization`](/docs/zh-CN/settings-reference#strictpluginonlycustomization) | 阻止来自用户和项目源的技能、代理、钩子和 MCP 服务器;`true` 锁定所有四个,数组命名哪些 |

407| [`wslInheritsWindowsSettings`](/docs/zh-CN/settings-reference#wslinheritswindowssettings) | 当在 HKLM 注册表或 `C:\Program Files\ClaudeCode` 下的文件中设置时,让 WSL 读取 Windows 策略链,仅当该目录下的托管设置文件或 drop-in 都不交付[策略密钥](#how-claude-code-combines-managed-sources)时读取 `/etc/claude-code`;条目给出顺序 |

408 

409<Note>

410 在 Team 和 Enterprise 计划上,Owner 在[Claude Code 管理设置](https://claude.ai/admin-settings/claude-code)中为组织启用或禁用[远程控制](/docs/zh-CN/remote-control)和[网络会话](/docs/zh-CN/claude-code-on-the-web)。远程控制可以另外通过 [`disableRemoteControl`](/docs/zh-CN/settings-reference#disableremotecontrol) 设置按设备禁用。网络会话没有按设备托管设置密钥。

411 

412 要检查这些组织设置是否到达给定机器,在那里运行 `claude doctor` 并读取 `Organization policy` 行,它说 Claude Code 从哪里加载策略或为什么它没有加载。需要 Claude Code v2.1.261 或更高版本。在运行会话中,当策略未加载时,`/status` 显示相同的行。

413</Note>

414 

415<h2 id="turn-telemetry-off-for-your-organization">

416 为您的组织关闭遥测

417</h2>

418 

419Claude Code 默认在使用 Anthropic API 的会话上发送 Anthropic 操作[遥测](/docs/zh-CN/data-usage#telemetry-services),无论是直接、通过 LLM 网关还是通过自定义 `ANTHROPIC_BASE_URL`;[按 API 提供商的默认行为](/docs/zh-CN/data-usage#default-behaviors-by-api-provider)说明哪些提供商发送它。要为每个开发者关闭它而不依赖每个人的 shell,通过托管设置的 `env` 块交付 `DISABLE_TELEMETRY`。此示例为策略到达的每个人设置 `DISABLE_TELEMETRY`:

420 

421```json theme={null}

422{

423 "env": {

424 "DISABLE_TELEMETRY": "1"

425 }

426}

427```

428 

429Claude Code 应用 `1` 的值而不向用户显示[批准对话](/docs/zh-CN/server-managed-settings#environment-variables-and-the-approval-dialog)。

430 

431如果您关闭遥测,Claude Code 停止发送为您的组织[分析仪表板](/docs/zh-CN/analytics)提供的使用数据,用于策略到达的开发者。变量也关闭功能标志获取,这使得远程控制、默认自动模式和其他[需要功能标志获取的功能](/docs/zh-CN/env-vars#features-that-need-feature-flag-fetching)对这些开发者不可用。

432 

433[策略应用的位置和时间](#where-and-when-a-policy-applies)说明哪个交付机制到达每个表面,[平台可用性](/docs/zh-CN/server-managed-settings#platform-availability)说明哪些会话跳过服务器托管设置获取。

434 

435如果您的组织使用客户托管的加密密钥并通过网关路由 Claude Code,[配置代理和网关](/docs/zh-CN/third-party-integrations#configure-proxies-and-gateways)说明为什么这些会话需要此变量。

436 

437<h2 id="see-also">

438 另请参阅

439</h2>

440 

441* [为您的组织设置 Claude Code](/docs/zh-CN/admin-setup):决定要强制执行什么以及如何强制执行

442* [服务器托管设置](/docs/zh-CN/server-managed-settings):从 claude.ai 控制台或网关交付策略

443* [托管 MCP 配置](/docs/zh-CN/managed-mcp):控制开发者可以使用哪些 MCP 服务器

444* [所有设置](/docs/zh-CN/settings-reference):每个密钥,以及托管源是否可以设置它

445* [示例设置文件](/docs/zh-CN/settings-example#an-organizations-managed-settings):显示托管密钥形状的完整 `managed-settings.json`

memory.md +3 −1

Details

53* 你在聊天中输入的相同更正或澄清是你上个会话输入的53* 你在聊天中输入的相同更正或澄清是你上个会话输入的

54* 新队友需要相同的上下文才能提高生产力54* 新队友需要相同的上下文才能提高生产力

55 55 

56将其保持为 Claude 应该在每个会话中保持的事实:构建命令、约定、项目布局、"总是做 X"规则。如果一个条目是多步骤过程或仅对代码库的一部分重要,将其移到 [skill](/docs/zh-CN/skills) 或 [路径范围规则](#organize-rules-with-claude/rules/) 中。[扩展概述](/docs/zh-CN/features-overview#build-your-setup-over-time)涵盖何时使用每种机制。56将其保持为 Claude 应该在每个会话中保持的事实:构建命令、约定、项目布局、"总是做 X"规则。如果一个条目是多步骤过程或仅对代码库的一部分重要,将其移到 [skill](/docs/zh-CN/skills) 或 [路径范围规则](#path-specific-rules) 中。[扩展概述](/docs/zh-CN/features-overview#build-your-setup-over-time)涵盖何时使用每种机制。

57 57 

58<h3 id="choose-where-to-put-claude-md-files">58<h3 id="choose-where-to-put-claude-md-files">

59 选择 CLAUDE.md 文件的位置59 选择 CLAUDE.md 文件的位置


277 277 

278`.claude/rules/` 目录支持符号链接,因此你可以维护一组共享规则并将它们链接到多个项目中。符号链接被解析并正常加载,循环符号链接被检测并优雅处理。278`.claude/rules/` 目录支持符号链接,因此你可以维护一组共享规则并将它们链接到多个项目中。符号链接被解析并正常加载,循环符号链接被检测并优雅处理。

279 279 

280Claude Code 将其目标在工作目录外的符号链接视为 [外部导入](#import-additional-files)。链接的规则在你批准项目的外部导入后才加载,之后仅没有 [`paths` 字段](#path-specific-rules) 的规则加载。Claude Code 仅在项目内存文件使用 `@path` 导入工作目录外的文件时要求该批准,而不是仅针对符号链接。要加载共享规则而不需要该批准,将它们保持在 [`~/.claude/rules/`](#user-level-rules) 中,它们适用于你机器上的每个项目。

281 

280此示例链接共享目录和单个文件:282此示例链接共享目录和单个文件:

281 283 

282```bash theme={null}284```bash theme={null}

mobile.md +104 −0 created

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# Claude Code 移动版

6 

7> 从您的手机使用 Claude 应用程序启动、监控和指导 Claude Code 任务,支持 iOS 和 Android。

8 

9Claude [iOS](https://apps.apple.com/us/app/claude-by-anthropic/id6473753684) 和 [Android](https://play.google.com/store/apps/details?id=com.anthropic.claude) 应用是 Claude Code 会话的客户端,而不是代码运行的地方。从您的手机,您可以访问云中的[云会话](#start-and-monitor-cloud-sessions)、通过[远程控制](#continue-a-local-session-with-remote-control)运行在您自己机器上的会话,或通过 [Dispatch](/docs/zh-CN/desktop#sessions-from-dispatch) 访问桌面应用。

10 

11<Note>

12 Claude Code 没有单独的移动应用:云会话和远程控制都位于 Claude 应用中的 **Code** 选项卡中,Dispatch 是您在应用中向其发送消息的任务。

13</Note>

14 

15<h2 id="get-the-app">

16 获取应用程序

17</h2>

18 

19<Steps>

20 <Step title="下载 Claude 应用程序">

21 为 [iOS](https://apps.apple.com/us/app/claude-by-anthropic/id6473753684) 或 [Android](https://play.google.com/store/apps/details?id=com.anthropic.claude) 安装 Claude 应用程序。在 iPad 上,安装相同的 iOS 应用程序。

22 

23 <Tip>

24 在 Claude Code 会话中运行 `/mobile` 以显示您可以扫描的下载二维码。`/ios` 和 `/android` 执行相同的操作。

25 </Tip>

26 </Step>

27 

28 <Step title="登录">

29 使用您用于 Claude Code 的相同 claude.ai 账户和组织登录。云会话和远程控制需要 claude.ai 账户,因此无法通过 Anthropic Console API 密钥或来自 Amazon Bedrock 等第三方提供商的方式访问。

30 </Step>

31 

32 <Step title="打开 Code 选项卡">

33 在应用程序的导航中点击 **Code** 以访问您的会话,或在您的手机上打开 [claude.ai/code/new](https://claude.ai/code/new) 以在应用程序中启动新的 Code 会话。如果您看不到 Code 选项卡,您的计划或组织可能不包括这些功能;请参阅[按订阅计划的可用性](/docs/zh-CN/feature-availability#availability-by-subscription-plan)。

34 </Step>

35</Steps>

36 

37<h2 id="work-from-your-phone">

38 从您的手机工作

39</h2>

40 

41从应用程序中,您可以启动云会话、驱动在您的计算机上运行的 Claude Code 会话,或向 Dispatch 消息传递任务。应用程序对所有三者都是相同的;它们在工作发生的位置上有所不同。

42 

43| 功能 | 您连接到的内容 | 何时使用 |

44| :------------------------------------------------ | :-------------------------- | :--------------------------------------------------------------------- |

45| [Claude Code 网页版](/docs/zh-CN/claude-code-on-the-web) | 云基础设施上的云会话,默认由 Anthropic 托管 | 您的存储库在 GitHub 上,任务应在您放下手机后继续运行。请参阅[网页快速入门](/docs/zh-CN/web-quickstart)进行设置。 |

46| [远程控制](/docs/zh-CN/remote-control) | 在您的计算机上运行的 Claude Code 会话 | 工作需要您的本地文件系统、工具或 MCP 服务器。 |

47| [Dispatch](/docs/zh-CN/desktop#sessions-from-dispatch) | 您计算机上的桌面应用程序 | 您想消息传递一个任务,让 Dispatch 决定如何运行它。需要 Pro 或 Max 计划。 |

48 

49如果您的计算机将关闭,请使用云会话,它们在云中运行,并在您的笔记本电脑关闭后继续运行。远程控制和 Dispatch 驱动您自己的机器,因此它需要保持打开状态并运行 Claude Code 或桌面应用程序。如果您的机器在远程控制会话期间进入睡眠状态,Claude Code 会在机器重新上线时重新连接。

50 

51有关更完整的比较,请参阅[当您远离终端时工作](/docs/zh-CN/platforms#work-when-you-are-away-from-your-terminal)。

52 

53云会话和远程控制从 **Code** 选项卡运行。对于 Dispatch(您在应用程序中作为任务消息传递),请参阅[来自 Dispatch 的会话](/docs/zh-CN/desktop#sessions-from-dispatch)。

54 

55<h3 id="start-and-monitor-cloud-sessions">

56 启动和监控云会话

57</h3>

58 

59Claude Code 网页版在云基础设施上运行任务,默认由 Anthropic 托管,因此会话在您放下手机后继续进行。从 Code 选项卡中,选择一个存储库和分支,描述任务,然后提交。会话在设备之间持久化:您在笔记本电脑上启动的任务已准备好从您的手机进行审查,您从手机启动的任务在您回到办公桌时正在等待。

60 

61在应用程序中打开会话以检查进度、回答 Claude 的问题或将其引导到新的方向。您也可以告诉 Claude [监视拉取请求](/docs/zh-CN/claude-code-on-the-web#auto-fix-pull-requests)并在 CI 失败或审查评论到达时修复它们。要连接 GitHub 并设置您的环境,请按照[网页快速入门](/docs/zh-CN/web-quickstart)进行操作,并查看[Claude Code 网页版](/docs/zh-CN/claude-code-on-the-web)了解云会话可以执行的所有操作。

62 

63<h3 id="continue-a-local-session-with-remote-control">

64 使用远程控制继续本地会话

65</h3>

66 

67远程控制将 Claude 应用程序连接到在您的机器上运行的 Claude Code 会话,因此代码执行和文件系统访问保持本地,而您从手机驱动会话。在您的计算机上使用 `claude remote-control` 启动会话,或在已打开的会话中运行 `/remote-control`。然后扫描终端可以显示的会话二维码,或打开 Claude 应用程序,点击 **Code**,然后从列表中选择会话。有关每个选项,请参阅[从另一个设备连接](/docs/zh-CN/remote-control#connect-from-another-device)。

68 

69当您在 Claude 应用程序中添加附件时,它也会到达本地会话:

70 

71* **照片**:Claude 直接将附加的照片视为您消息的一部分。Claude Code 还会将每张照片保存在 `~/.claude/uploads/` 下,并告诉 Claude 保存的文件路径,以便 Claude 可以将图像复制到它创建的文件中。

72* **其他文件**:Claude Code 将它们下载到您的机器,并将它们作为 `@` 文件引用传递给 Claude。

73 

74有关要求、调用模式和故障排除,请参阅[远程控制概述](/docs/zh-CN/remote-control)。

75 

76<h3 id="get-push-notifications">

77 获取推送通知

78</h3>

79 

80当远程控制处于活动状态时,Claude 可以向您的手机发送推送通知,通常在长时间运行的任务完成或需要您做出决定时。您也可以在提示中请求一个,例如 `notify me when the tests finish`。有关两个 `/config` 切换和交付故障排除,请参阅[移动推送通知](/docs/zh-CN/remote-control#mobile-push-notifications)。

81 

82Dispatch 在其生成的 Code 会话完成或需要您的批准时发送自己的通知,如[来自 Dispatch 的会话](/docs/zh-CN/desktop#sessions-from-dispatch)中所述。

83 

84<h2 id="limitations">

85 限制

86</h2>

87 

88移动客户端涵盖了会话需要的大部分内容,但有一些限制:

89 

90* **仅限本地命令**:仅在终端界面中运行的命令,例如 `/plugin` 和 `/resume`,无法从应用程序中工作。[远程控制限制](/docs/zh-CN/remote-control#limitations)列出了从移动设备工作的命令以及它们的行为如何不同。

91* **权限模式**:云会话在模式下拉菜单中提供接受编辑、Plan 和 Auto,远程控制会话提供 Manual、接受编辑和 Plan。在任何情况下,您都无法从应用程序中选择 Bypass permissions,也无法为远程控制会话选择 Auto。请参阅[切换权限模式](/docs/zh-CN/permission-modes#switch-permission-modes)。

92* **Dispatch 计划**:Dispatch 需要 Pro 或 Max 计划,在 Team 或 Enterprise 上不可用。

93 

94<h2 id="related-resources">

95 相关资源

96</h2>

97 

98* [平台和集成](/docs/zh-CN/platforms):比较 Claude Code 运行的每个表面

99* [Claude Code 网页版](/docs/zh-CN/claude-code-on-the-web):云会话如何运行以及如何在您的终端之间移动工作

100* [配置云环境](/docs/zh-CN/cloud-environments):云会话的网络访问级别、环境变量和设置脚本

101* [远程控制](/docs/zh-CN/remote-control):从任何设备继续本地会话

102* [来自 Dispatch 的会话](/docs/zh-CN/desktop#sessions-from-dispatch):Dispatch 任务如何在桌面应用程序中成为 Code 会话

103* [Channels](/docs/zh-CN/channels):通过 Telegram、Discord 或 iMessage 从您的手机询问 Claude 一些事情,同时工作在您的机器上运行

104* [Slack 中的 Claude Code](/docs/zh-CN/slack):通过提及 `@Claude` 从您的 Slack 工作区委派编码任务

model-config.md +13 −3

Details

91* **规划更大的任务**:给它你通常会分成几部分的工作。它能够维持长时间的会话而不失去思路。91* **规划更大的任务**:给它你通常会分成几部分的工作。它能够维持长时间的会话而不失去思路。

92 92 

93<Note>93<Note>

94 Fable 5.1 需要 Claude Code v2.1.257 或更高版本。如果来自较旧版本的请求失败,请参阅 [Claude Code does not support this model](/docs/zh-CN/errors#claude-code-does-not-support-this-model)。Fable 5 需要 v2.1.170 或更高版本。运行 `claude update` 进行升级。有关零数据保留下的可用性,请参阅 [Model availability under ZDR](/docs/zh-CN/zero-data-retention#model-availability-under-zdr)。94 Fable 5.1 需要 Claude Code v2.1.257 或更高版本。如果来自较旧版本的请求失败,请参阅 [Claude Code does not support this model](/docs/zh-CN/errors#claude-code-does-not-support-this-model)。运行 `claude update` 进行升级。有关零数据保留下的可用性,请参阅 [Model availability under ZDR](/docs/zh-CN/zero-data-retention#model-availability-under-zdr)。

95</Note>95</Note>

96 96 

97在 Anthropic API 上,`/model` 选择器仅在服务器报告它对你的组织可用后才列出 Fable 模型。当你输入 `/model fable` 或 Fable 模型 ID 时,Claude Code 直接与服务器检查可用性,所以即使选择器未列出该条目,输入的选择也可以成功。97在 Anthropic API 上,`/model` 选择器仅在服务器报告它对你的组织可用后才列出 Fable 模型。当你输入 `/model fable` 或 Fable 模型 ID 时,Claude Code 直接与服务器检查可用性,所以即使选择器未列出该条目,输入的选择也可以成功。


621 621 

622持久化的 `effortLevel` 设置和 `CLAUDE_CODE_EFFORT_LEVEL` 环境变量不接受 `ultracode`。当 `CLAUDE_CODE_EFFORT_LEVEL` 设置为 `xhigh` 以外的级别时,请求以该级别运行,ultracode 的工作流编排保持不活跃。选择 ultracode 然后显示警告,环境变量覆盖会话的努力。622持久化的 `effortLevel` 设置和 `CLAUDE_CODE_EFFORT_LEVEL` 环境变量不接受 `ultracode`。当 `CLAUDE_CODE_EFFORT_LEVEL` 设置为 `xhigh` 以外的级别时,请求以该级别运行,ultracode 的工作流编排保持不活跃。选择 ultracode 然后显示警告,环境变量覆盖会话的努力。

623 623 

624当 ultracode 不可用时,例如当[工作流被关闭](/docs/zh-CN/workflows#turn-workflows-off)时,`--effort ultracode` 仅设置 `xhigh` 努力。624<span id="when-ultracode-is-available" />

625 

626Ultracode 在以下情况下不可用:

627 

628* [工作流被关闭](/docs/zh-CN/workflows#turn-workflows-off)

629* 模型不支持 `xhigh` 努力

630* [努力上限](#organization-effort-limits)低于 `xhigh` 适用于模型

631 

632在这些情况下,`--effort ultracode` 启动会话时 ultracode 关闭,努力级别为模型和任何上限允许的最高级别,最高为 `xhigh`。

625 633 

626<h4 id="choose-an-effort-level">634<h4 id="choose-an-effort-level">

627 选择努力级别635 选择努力级别


660* **从连接的设备**:在[远程控制](/docs/zh-CN/remote-control#what-connected-devices-see)会话中,从您的手机或浏览器上的努力控制中选择级别。该级别仅适用于当前会话,尽管它也结束[对模型默认努力的保持](#adjust-effort-level)。需要 Claude Code v2.1.234 或更高版本668* **从连接的设备**:在[远程控制](/docs/zh-CN/remote-control#what-connected-devices-see)会话中,从您的手机或浏览器上的努力控制中选择级别。该级别仅适用于当前会话,尽管它也结束[对模型默认努力的保持](#adjust-effort-level)。需要 Claude Code v2.1.234 或更高版本

661* **Skill 和子代理 frontmatter**:在 [skill](/docs/zh-CN/skills#frontmatter-reference) 或[子代理](/docs/zh-CN/sub-agents#supported-frontmatter-fields) markdown 文件中设置 `effort` 以在该 skill 或子代理运行时覆盖努力级别669* **Skill 和子代理 frontmatter**:在 [skill](/docs/zh-CN/skills#frontmatter-reference) 或[子代理](/docs/zh-CN/sub-agents#supported-frontmatter-fields) markdown 文件中设置 `effort` 以在该 skill 或子代理运行时覆盖努力级别

662 670 

663Frontmatter 努力在该 skill 或子代理活跃时应用,覆盖会话级别但不覆盖环境变量。671Frontmatter 努力在该 skill 或子代理活跃时应用,覆盖会话级别但不覆盖环境变量。一个 [`maxEffortLevel`](/docs/zh-CN/settings-reference#maxeffortlevel) 或[组织努力上限](#organization-effort-limits)仍然限制 skill 或子代理运行的级别。

672 

673在 Fable 5、Opus 4.8 和 Opus 4.7 上,frontmatter 努力也在[对模型默认努力的保持](#adjust-effort-level)有效时应用。在 v2.1.267 之前,保持优先,Claude Code 在保持活跃时忽略 frontmatter 级别。

664 674 

665如果您在[托管设置](/docs/zh-CN/managed-settings)中设置 `effortLevel`,Claude Code 在[努力解析顺序](#adjust-effort-level)的设置步骤处应用它,用户仍然可以使用 `/effort` 或 `--effort` 更改级别。要将用户保持在或低于某个级别,设置 [`maxEffortLevel`](/docs/zh-CN/settings-reference#maxeffortlevel)。675如果您在[托管设置](/docs/zh-CN/managed-settings)中设置 `effortLevel`,Claude Code 在[努力解析顺序](#adjust-effort-level)的设置步骤处应用它,用户仍然可以使用 `/effort` 或 `--effort` 更改级别。要将用户保持在或低于某个级别,设置 [`maxEffortLevel`](/docs/zh-CN/settings-reference#maxeffortlevel)。

666 676 

Details

219**`claude_code.interaction`**219**`claude_code.interaction`**

220 220 

221| 属性 | 描述 | 门控条件 |221| 属性 | 描述 | 门控条件 |

222| ------------------------- | -------------------------------- | ----------------------- |222| ------------------------- | ----------------------------------------------------------------------------------------------------------- | ----------------------- |

223| `user_prompt` | 提示文本。除非设置了门控条件,否则值为 `<REDACTED>` | `OTEL_LOG_USER_PROMPTS` |223| `user_prompt` | 提示文本。除非设置了门控条件,否则值为 `<REDACTED>` | `OTEL_LOG_USER_PROMPTS` |

224| `user_prompt_length` | 提示长度(字符数) | |224| `user_prompt_length` | 提示长度(字符数) | |

225| `interaction.sequence` | 此会话中交互的基于 1 的计数器 | |225| `interaction.sequence` | 此会话中交互的基于 1 的计数器 | |

226| `parent.source` | Span 如何获得其 trace 父级:当它在入站 `TRACEPARENT` 下作为父级时为 `env`,当它启动自己的 trace 时为 `none`。需要 Claude Code v2.1.268 或更高版本 | |

226| `interaction.duration_ms` | 轮次的实际时钟持续时间 | |227| `interaction.duration_ms` | 轮次的实际时钟持续时间 | |

227 228 

228**`claude_code.llm_request`**229**`claude_code.llm_request`**

229 230 

230| 属性 | 描述 | 门控条件 |231| 属性 | 描述 | 门控条件 |

231| -------------------------------- | --------------------------------------------------------------------------------------------------- | ----------------------- |232| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------ |

232| `model` | 模型标识符 | |233| `model` | 模型标识符 | |

233| `gen_ai.system` | 始终为 `anthropic`。OpenTelemetry GenAI 语义约定 | |234| `gen_ai.system` | 始终为 `anthropic`。OpenTelemetry GenAI 语义约定 | |

234| `gen_ai.request.model` | 与 `model` 相同的值。OpenTelemetry GenAI 语义约定 | |235| `gen_ai.request.model` | 与 `model` 相同的值。OpenTelemetry GenAI 语义约定 | |

235| `query_source` | 发出请求的子系统,例如 `repl_main_thread` 或子代理名称 | |236| `query_source` | 发出请求的子系统,例如 `repl_main_thread` 或子代理名称 | `ENABLE_BETA_TRACING_DETAILED` |

237| `query_source_safe` | `query_source` 的有界形式,无论详细的测试版跟踪是否处于活动状态都会发出,具有 `repl_main_thread` 或 `agent.builtin.general-purpose` 等值。`:` 变为 `.`,用户命名的代理显示为 `agent.custom`。需要 Claude Code v2.1.268 或更高版本 | |

236| `agent_id` | 发出请求的子代理或队友的标识符。在主会话中不存在 | |238| `agent_id` | 发出请求的子代理或队友的标识符。在主会话中不存在 | |

237| `parent_agent_id` | 生成此代理的代理的标识符。对于主会话和直接从其生成的代理不存在 | |239| `parent_agent_id` | 生成此代理的代理的标识符。对于主会话和直接从其生成的代理不存在 | |

238| `workflow.run_id` | [Workflow](/docs/zh-CN/workflows) 工具运行的运行标识符,前缀为 `wf_`,生成此代理。对于不是由工作流生成的代理不存在 | |240| `workflow.run_id` | [Workflow](/docs/zh-CN/workflows) 工具运行的运行标识符,前缀为 `wf_`,生成此代理。对于不是由工作流生成的代理不存在 | |


241| `llm_request.context` | `interaction`、`tool` 或 `standalone`,取决于父 span | |243| `llm_request.context` | `interaction`、`tool` 或 `standalone`,取决于父 span | |

242| `duration_ms` | 包括重试的实际时钟持续时间 | |244| `duration_ms` | 包括重试的实际时钟持续时间 | |

243| `ttft_ms` | 首个令牌的时间(毫秒) | |245| `ttft_ms` | 首个令牌的时间(毫秒) | |

246| `first_content_ms` | 从请求开始到成功尝试的第一个内容块的时间(毫秒)。在回退到非流式传输路径的请求上不存在。需要 Claude Code v2.1.268 或更高版本 | |

244| `input_tokens` | API 使用块中的输入令牌计数 | |247| `input_tokens` | API 使用块中的输入令牌计数 | |

245| `output_tokens` | 输出令牌计数 | |248| `output_tokens` | 输出令牌计数 | |

246| `cache_read_tokens` | 从提示缓存读取的令牌 | |249| `cache_read_tokens` | 从提示缓存读取的令牌 | |


252| `success` | `true` 或 `false` | |255| `success` | `true` 或 `false` | |

253| `status_code` | 请求失败时的 HTTP 状态代码 | |256| `status_code` | 请求失败时的 HTTP 状态代码 | |

254| `error` | 请求失败时的错误消息 | |257| `error` | 请求失败时的错误消息 | |

258| `error_class` | 请求失败时的短错误类别令牌,例如 `api_timeout` 或 `server_overload`。需要 Claude Code v2.1.268 或更高版本 | |

255| `response.has_tool_call` | 当响应包含工具使用块时为 `true` | |259| `response.has_tool_call` | 当响应包含工具使用块时为 `true` | |

256| `stop_reason` | API 响应 `stop_reason`,例如 `end_turn`、`tool_use`、`max_tokens`、`stop_sequence`、`pause_turn` 或 `refusal` | |260| `stop_reason` | API 响应 `stop_reason`,例如 `end_turn`、`tool_use`、`max_tokens`、`stop_sequence`、`pause_turn` 或 `refusal` | |

257| `gen_ai.response.finish_reasons` | 与 `stop_reason` 相同的值,包装在字符串数组中。OpenTelemetry GenAI 语义约定 | |261| `gen_ai.response.finish_reasons` | 与 `stop_reason` 相同的值,包装在字符串数组中。OpenTelemetry GenAI 语义约定 | |


263| 属性 | 描述 | 门控条件 |267| 属性 | 描述 | 门控条件 |

264| --------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------- |268| --------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------- |

265| `tool_name` | 工具名称 | |269| `tool_name` | 工具名称 | |

270| `tool_name_safe` | `tool_name` 的形式,不携带任何用户选择的名称。内置工具名称逐字通过。MCP 工具名称显示为 `mcp_other`,除了与几个固定形状匹配的工具名称,例如名为 `browser_*` 的 playwright 工具,这些工具逐字通过。需要 Claude Code v2.1.268 或更高版本 | |

271| `bash_command_class` | 对于 Bash 工具:命令的第一个程序的类别,来自固定列表,例如 `vcs` 或 `package_manager`。`other` 用于列表外的程序,`unparsed` 当行无法解析时。需要 Claude Code v2.1.268 或更高版本 | |

272| `bash_argv0` | 对于 Bash 工具:当命令的第一个程序在同一固定列表上时,例如 `git` 或 `npm`。`other` 用于列表外的任何程序。需要 Claude Code v2.1.268 或更高版本 | |

266| `duration_ms` | 包括权限等待和执行的实际时钟持续时间 | |273| `duration_ms` | 包括权限等待和执行的实际时钟持续时间 | |

267| `result_tokens` | 工具结果的近似令牌大小 | |274| `result_tokens` | 工具结果的近似令牌大小 | |

268| `agent_id` | 运行工具的子代理或队友的标识符。在主会话中不存在 | |275| `agent_id` | 运行工具的子代理或队友的标识符。在主会话中不存在 | |


289**`claude_code.tool.execution`**296**`claude_code.tool.execution`**

290 297 

291| 属性 | 描述 | 门控条件 |298| 属性 | 描述 | 门控条件 |

292| --------------------- | ---------------------------------------------------------------- | ----------------------- |299| --------------------- | --------------------------------------------------------------------------------------------------------------------------- | ----------------------- |

293| `duration_ms` | 运行工具主体所花费的时间 | |300| `duration_ms` | 运行工具主体所花费的时间 | |

294| `tool_use_id` | 与父 `claude_code.tool` span 上的值相同 | |301| `tool_use_id` | 与父 `claude_code.tool` span 上的值相同 | |

295| `gen_ai.tool.call.id` | 与 `tool_use_id` 相同的值。OpenTelemetry GenAI 语义约定 | |302| `gen_ai.tool.call.id` | 与 `tool_use_id` 相同的值。OpenTelemetry GenAI 语义约定 | |

296| `success` | `true` 或 `false` | |303| `success` | `true` 或 `false` | |

297| `error` | 执行失败时的错误类别字符串,例如 `Error:ENOENT` 或 `ShellError`。当设置了门控条件时包含完整错误消息 | `OTEL_LOG_TOOL_DETAILS` |304| `error` | 执行失败时的错误类别字符串,例如 `Error:ENOENT` 或 `ShellError`。当设置了门控条件时包含完整错误消息 | `OTEL_LOG_TOOL_DETAILS` |

305| `error_class` | 标识符形式的错误类别,其中字母、数字和下划线之外的字符被替换为 `_`,例如 `Error_ENOENT` 或 `ShellError`。即使 `error` 携带完整消息,也会携带类别。需要 Claude Code v2.1.268 或更高版本 | |

298 306 

299**`claude_code.hook`**307**`claude_code.hook`**

300 308 


499| `user.account_uuid` | 账户 UUID(已认证时) | `OTEL_METRICS_INCLUDE_ACCOUNT_UUID`(默认:true) |507| `user.account_uuid` | 账户 UUID(已认证时) | `OTEL_METRICS_INCLUDE_ACCOUNT_UUID`(默认:true) |

500| `user.account_id` | 账户 ID,采用与 Anthropic 管理 API 匹配的标记格式(已认证时),例如 `user_01BWBeN28...` | `OTEL_METRICS_INCLUDE_ACCOUNT_UUID`(默认:true) |508| `user.account_id` | 账户 ID,采用与 Anthropic 管理 API 匹配的标记格式(已认证时),例如 `user_01BWBeN28...` | `OTEL_METRICS_INCLUDE_ACCOUNT_UUID`(默认:true) |

501| `user.id` | 在首次运行时生成并保存在 `~/.claude.json` 中的随机匿名标识符。它不包含任何个人信息,也不是从您的 Claude 账户派生的。删除该文件会在下次运行时生成新的无关值。 | 始终包含 |509| `user.id` | 在首次运行时生成并保存在 `~/.claude.json` 中的随机匿名标识符。它不包含任何个人信息,也不是从您的 Claude 账户派生的。删除该文件会在下次运行时生成新的无关值。 | 始终包含 |

502| `user.email` | 用户电子邮件地址(通过 OAuth 认证时) | 可用时始终包含 |510| `user.email` | 用户电子邮件地址,来自您的登录或在 [云会话](/docs/zh-CN/claude-code-on-the-web) 中来自会话自己的凭证 | 可用时始终包含 |

503| `terminal.type` | 终端类型,例如 `iTerm.app`、`vscode`、`cursor` 或 `tmux` | 检测到时始终包含 |511| `terminal.type` | 终端类型,例如 `iTerm.app`、`vscode`、`cursor` 或 `tmux` | 检测到时始终包含 |

504| `OTEL_RESOURCE_ATTRIBUTES` 中的键 | 您设置的自定义属性,例如 `department` 或 `team.id`。请参阅 [多团队组织支持](#multi-team-organization-support) | `OTEL_METRICS_INCLUDE_RESOURCE_ATTRIBUTES`(默认:true) |512| `OTEL_RESOURCE_ATTRIBUTES` 中的键 | 您设置的自定义属性,例如 `department` 或 `team.id`。请参阅 [多团队组织支持](#multi-team-organization-support) | `OTEL_METRICS_INCLUDE_RESOURCE_ATTRIBUTES`(默认:true) |

505 513 


1329 1337 

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

1331 1339 

1332事件上的 `attempt` 属性记录进行的总尝试次数。`CLAUDE_CODE_MAX_RETRIES` 默认为 10,上限为 15;从 v2.1.199 开始,`CLAUDE_CODE_RETRY_WATCHDOG` 提高了默认值并移除了上限。当请求在瞬时错误上耗尽所有重试时,`attempt` 等于该有效限制加一:默认为 11,除非设置了看门狗,否则永远不超过 16。较低的值表示不可重试的错误,例如 `400` 响应。1340事件上的 `attempt` 属性记录进行的总尝试次数。`CLAUDE_CODE_MAX_RETRIES` 默认为 10,上限为 15。在 v2.1.199 或更高版本上,您可以设置 `CLAUDE_CODE_RETRY_WATCHDOG` 来提高默认值并移除上限。

1341 

1342当请求在瞬时错误上耗尽所有重试时,`attempt` 等于该有效限制加一:默认为 11,除非设置了看门狗,否则永远不超过 16。较低的值表示不可重试的错误,例如 `400` 响应,或具有自己较小重试预算的原因。例如,Claude Code 最多重试两次加载 AWS 或 Google Cloud 凭证的失败。

1333 1343 

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

1335 1345 


1358 将属性操作归属于用户1368 将属性操作归属于用户

1359</h3>1369</h3>

1360 1370 

1361每个事件上的 [标准属性](#standard-attributes) 包括已认证用户的身份:`user.email`、`user.account_uuid`、`user.account_id` 和 `organization.id`(使用 Claude 账户登录时),加上 `user.id` 和每会话的 `session.id`。`user.id` 是安装范围的标识符,除了在 [Claude apps gateway](/docs/zh-CN/claude-apps-gateway) 会话上,其中它是来自网关颁发的令牌的 IdP 主体。1371每个事件上的 [标准属性](#standard-attributes) 包括已认证用户的身份:`user.email`、`user.account_uuid`、`user.account_id` 和 `organization.id`(使用 Claude 账户登录时或在 [云会话](/docs/zh-CN/claude-code-on-the-web) 中,当会话自己的凭证携带它们时),加上 `user.id` 和每会话的 `session.id`。`user.id` 是安装范围的标识符,除了在 [Claude apps gateway](/docs/zh-CN/claude-apps-gateway) 会话上,其中它是来自网关颁发的令牌的 IdP 主体。

1362 1372 

1363MCP 工具调用、Bash 命令和文件编辑因此归属于启动会话的开发人员。Claude Code 不在单独的服务账户下运行;每个事件上记录的身份是开发人员自己的 Claude 账户,或开发人员在 [Claude apps gateway](/docs/zh-CN/claude-apps-gateway) 会话上的 IdP 身份。1373MCP 工具调用、Bash 命令和文件编辑因此归属于启动会话的开发人员。Claude Code 不在单独的服务账户下运行;每个事件上记录的身份是开发人员自己的 Claude 账户,或开发人员在 [Claude apps gateway](/docs/zh-CN/claude-apps-gateway) 会话上的 IdP 身份。

1364 1374 


1486 1496 

1487* OpenTelemetry 导出到您的后端是可选的,需要显式配置。有关 Anthropic 的单独操作遥测以及如何禁用它,请参阅 [数据使用](/docs/zh-CN/data-usage#telemetry-services)1497* OpenTelemetry 导出到您的后端是可选的,需要显式配置。有关 Anthropic 的单独操作遥测以及如何禁用它,请参阅 [数据使用](/docs/zh-CN/data-usage#telemetry-services)

1488* 原始文件内容和代码片段不包含在指标或事件中。Trace spans 是一个单独的数据路径:请参阅下面的 `OTEL_LOG_TOOL_CONTENT` 项目符号1498* 原始文件内容和代码片段不包含在指标或事件中。Trace spans 是一个单独的数据路径:请参阅下面的 `OTEL_LOG_TOOL_CONTENT` 项目符号

1489* 通过 OAuth 认证时,`user.email` 包含在遥测属性中。如果这对您的组织是一个问题,请与您的遥测后端合作以过滤或编辑此字段1499* 通过 OAuth 认证时,`user.email` 包含在遥测属性中,仅发送到您配置的 OTel 端点,永远不会发送到 Anthropic。如果这对您的组织是一个问题,请与您的遥测后端合作以过滤或编辑此字段

1490* 默认情况下不收集用户提示内容。仅记录提示长度。要包含提示内容,请设置 `OTEL_LOG_USER_PROMPTS=1`1500* 默认情况下不收集用户提示内容。仅记录提示长度。要包含提示内容,请设置 `OTEL_LOG_USER_PROMPTS=1`

1491* 默认情况下不收集助手响应文本。仅记录响应长度。要包含响应文本,请设置 `OTEL_LOG_ASSISTANT_RESPONSES=1`。与来自 Claude Code 的所有 OpenTelemetry 数据一样,响应文本仅发送到您配置的 OTel 端点,永远不会发送到 Anthropic。当此变量未设置时,`OTEL_LOG_USER_PROMPTS` 用作后备,因此如果您想要提示内容而不要响应内容,请设置 `OTEL_LOG_ASSISTANT_RESPONSES=0`1501* 默认情况下不收集助手响应文本。仅记录响应长度。要包含响应文本,请设置 `OTEL_LOG_ASSISTANT_RESPONSES=1`。与来自 Claude Code 的所有 OpenTelemetry 数据一样,响应文本仅发送到您配置的 OTel 端点,永远不会发送到 Anthropic。当此变量未设置时,`OTEL_LOG_USER_PROMPTS` 用作后备,因此如果您想要提示内容而不要响应内容,请设置 `OTEL_LOG_ASSISTANT_RESPONSES=0`

1492* 默认情况下不记录工具输入参数和参数。要包含它们,请设置 `OTEL_LOG_TOOL_DETAILS=1`。对于 Claude Desktop 的内置服务器,在 Claude Desktop 拥有的会话中,`tool_decision` 和 `tool_result` 携带 `mcp_server_name`/`mcp_tool_name` 对,即主机编写的名称而非参数内容,即使关闭该标志也是如此。此异常需要 Claude Code v2.1.214 或更高版本。此数据仅发送到您配置的 OTEL 端点,永远不会发送到 Anthropic。参数仍可能包含敏感值,因此请根据需要配置您的遥测后端以过滤或编辑这些属性。启用后:1502* 默认情况下不记录工具输入参数和参数。要包含它们,请设置 `OTEL_LOG_TOOL_DETAILS=1`。对于 Claude Desktop 的内置服务器,在 Claude Desktop 拥有的会话中,`tool_decision` 和 `tool_result` 携带 `mcp_server_name`/`mcp_tool_name` 对,即主机编写的名称而非参数内容,即使关闭该标志也是如此。此异常需要 Claude Code v2.1.214 或更高版本。此数据仅发送到您配置的 OTEL 端点,永远不会发送到 Anthropic。参数仍可能包含敏感值,因此请根据需要配置您的遥测后端以过滤或编辑这些属性。启用后:

overview.md +13 −13

Details

22 <Tab title="Terminal">22 <Tab title="Terminal">

23 功能完整的 CLI,用于直接在终端中使用 Claude Code。编辑文件、运行命令,并从命令行管理整个项目。23 功能完整的 CLI,用于直接在终端中使用 Claude Code。编辑文件、运行命令,并从命令行管理整个项目。

24 24 

25 To install Claude Code, use one of the following methods:25 要安装 Claude Code,请使用以下方法之一:

26 26 

27 <Tabs>27 <Tabs>

28 <Tab title="Native Install (Recommended)">28 <Tab title="原生安装(推荐)">

29 **macOS, Linux, WSL:**29 **macOS、Linux、WSL:**

30 30 

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

32 curl -fsSL https://claude.ai/install.sh | bash32 curl -fsSL https://claude.ai/install.sh | bash

33 ```33 ```

34 34 

35 **Windows PowerShell:**35 **Windows PowerShell:**

36 36 

37 ```powershell theme={null}37 ```powershell theme={null}

38 irm https://claude.ai/install.ps1 | iex38 irm https://claude.ai/install.ps1 | iex

39 ```39 ```

40 40 

41 **Windows CMD:**41 **Windows CMD:**

42 42 

43 ```batch theme={null}43 ```batch theme={null}

44 curl -fsSL https://claude.ai/install.cmd -o install.cmd && install.cmd && del install.cmd44 curl -fsSL https://claude.ai/install.cmd -o install.cmd && install.cmd && del install.cmd

45 ```45 ```

46 46 

47 If you see `The token '&&' is not a valid statement separator`, you're in PowerShell, not CMD. If you see `'irm' is not recognized as an internal or external command`, you're in CMD, not PowerShell. Your prompt shows `PS C:\` when you're in PowerShell and `C:\` without the `PS` when you're in CMD.47 如果您看到 `The token '&&' is not a valid statement separator`,说明您在 PowerShell 中,而不是 CMD。如果您看到 `'irm' is not recognized as an internal or external command`,说明您在 CMD 中,而不是 PowerShell。当您在 PowerShell 中时,您的提示符显示 `PS C:\`,当您在 CMD 中时显示 `C:\`(没有 `PS`)。

48 48 

49 If the install command fails with `syntax error near unexpected token '<'`, a `403`, or another curl error, see [Troubleshoot installation](/docs/en/troubleshoot-install#find-your-error) to match the error to a fix and for alternative install methods.49 如果安装命令失败并显示 `syntax error near unexpected token '<'`、`403` 或其他 curl 错误,请参阅 [Troubleshoot installation](/docs/zh-CN/troubleshoot-install#find-your-error) 以匹配错误并获得修复方案和替代安装方法。

50 50 

51 [Git for Windows](https://git-scm.com/downloads/win) is recommended on native Windows so Claude Code can use the Bash tool. If Git for Windows is not installed, Claude Code uses PowerShell as the shell tool instead. WSL setups do not need Git for Windows.51 建议在原生 Windows 上安装 [Git for Windows](https://git-scm.com/downloads/win),以便 Claude Code 可以使用 Bash 工具。如果未安装 Git for Windows,Claude Code 将使用 PowerShell 作为 shell 工具。WSL 设置不需要 Git for Windows。

52 52 

53 <Info>53 <Info>

54 Native installations automatically update in the background to keep you on the latest version.54 原生安装会在后台自动更新,以保持您使用最新版本。

55 </Info>55 </Info>

56 </Tab>56 </Tab>

57 57 


60 brew install --cask claude-code60 brew install --cask claude-code

61 ```61 ```

62 62 

63 Homebrew offers two casks. `claude-code` tracks the stable release channel, which is typically about a week behind and skips releases with major regressions. `claude-code@latest` tracks the latest channel and receives new versions as soon as they ship.63 Homebrew 提供两个 casks。`claude-code` 跟踪稳定发布渠道,通常比最新版本晚约一周,并跳过有重大回归的版本。`claude-code@latest` 跟踪最新渠道,在新版本发布时立即接收。

64 64 

65 <Info>65 <Info>

66 Homebrew installations do not auto-update. Run `brew upgrade claude-code` or `brew upgrade claude-code@latest`, depending on which cask you installed, to get the latest features and security fixes.66 Homebrew 安装不会自动更新。运行 `brew upgrade claude-code` 或 `brew upgrade claude-code@latest`(取决于您安装的 cask)以获取最新功能和安全修复。

67 </Info>67 </Info>

68 </Tab>68 </Tab>

69 69 


73 ```73 ```

74 74 

75 <Info>75 <Info>

76 WinGet installations do not auto-update. Run `winget upgrade Anthropic.ClaudeCode` periodically to get the latest features and security fixes.76 WinGet 安装不会自动更新。定期运行 `winget upgrade Anthropic.ClaudeCode` 以获取最新功能和安全修复。

77 </Info>77 </Info>

78 </Tab>78 </Tab>

79 </Tabs>79 </Tabs>

80 80 

81 You can also install with [apt, dnf, or apk](/docs/en/setup#install-with-linux-package-managers) on Debian, Fedora, RHEL, and Alpine.81 您也可以在 Debian、Fedora、RHEL 和 Alpine 上使用 [apt、dnf 或 apk](/docs/zh-CN/setup#install-with-linux-package-managers) 进行安装。

82 82 

83 然后在任何项目中启动 Claude Code。将 `your-project` 替换为你机器上项目目录的路径:83 然后在任何项目中启动 Claude Code。将 `your-project` 替换为你机器上项目目录的路径:

84 84 

Details

11在 Pro、Max 和 Team 计划上,内置的起始权限模式是自动模式。[会话在哪个模式下启动](#which-mode-a-session-starts-in)涵盖了改变起始权限模式的表面和设置。您也可以随时更改正在运行的会话的权限模式。11在 Pro、Max 和 Team 计划上,内置的起始权限模式是自动模式。[会话在哪个模式下启动](#which-mode-a-session-starts-in)涵盖了改变起始权限模式的表面和设置。您也可以随时更改正在运行的会话的权限模式。

12 12 

13<h2 id="available-modes">13<h2 id="available-modes">

14 可用模式14 可用的模式

15</h2>15</h2>

16 16 

17每种模式在便利性和监督之间做出不同的权衡。下表显示了在每种模式下 Claude 无需权限提示即可执行的操作。Manual 模式显示在其配置值 `default` 下。17每种模式在便利性和监督之间做出不同的权衡。下表显示了在每种模式下 Claude 无需权限提示即可执行的操作。手动模式显示在其配置值 `default` 下。

18 18 

19| 模式 | 无需询问即可运行 | 最适合 |19| 模式 | 无需询问即可运行的内容 | 最适合 |

20| :------------------------------------------------------------------ | :--------------------------------------------------------- | :------------ |20| :------------------------------------------------------------------ | :-------------------------------------------------------------- | :------------ |

21| `default` | 仅读取 | 自己审查每个操作,敏感工作 |21| `default` | 仅读取 | 自己审查每项操作,敏感工作 |

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) | 读取,加上当[自动模式](#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 中、`claude --help` 中、VS Code 和 JetBrains 扩展中以及桌面应用中,审查每个操作的模式被命名为 **Manual**。其配置值为 `default`,这是 hooks 和 SDK 集成使用的值。CLI 在任何地方都接受 `manual` 作为别名,例如 `claude --permission-mode manual` 或 `"defaultMode": "manual"`。Manual 标签和 `manual` 别名需要 Claude Code v2.1.200 或更高版本。桌面应用的标签不依赖于您的 CLI 版本。28审查每项操作的模式在 CLI 中名为 **Manual**,在 `claude --help` 中、在 VS Code 和 JetBrains 扩展中以及在桌面应用中也是如此。其配置值是 `default`,这是 hooks 和 SDK 集成使用的。CLI 在您输入值的任何地方接受 `manual` 作为别名,例如 `claude --permission-mode manual` 或 `"defaultMode": "manual"`。Manual 标签和 `manual` 别名需要 Claude Code v2.1.200 或更高版本。桌面应用的标签不依赖于您的 CLI 版本。

29 29 

30对[受保护路径](#protected-paths)的写入永远不会自动批准,唯一的例外是 `bypassPermissions` 模式,以及可使用绕过权限的 plan 模式会话,也就是以[将 `bypassPermissions` 放入模式循环](#switch-permission-modes)的方式启动的会话。30对 [受保护路径](#protected-paths) 的写入永远不会自动批准,除非在 `bypassPermissions` 模式下以及在 plan 模式会话中,其中绕过权限可用,意味着会话以 [将 `bypassPermissions` 放入模式循环](#switch-permission-modes) 的方式启动。

31 31 

32模式设置基线。在顶部分层[权限规则](/docs/zh-CN/permissions#manage-permissions)以预先批准或阻止特定工具。拒绝规则在每种模式下都会阻止,包括 `bypassPermissions`。拒绝和询问规则不适用于 [`EndConversation`](/docs/zh-CN/tools-reference#endconversation-tool-behavior),只要 Claude 仍然有至少一个其他工具可以调用。允许规则在 `bypassPermissions` 中无效。32模式设置基线。在顶部分层 [权限规则](/docs/zh-CN/permissions#manage-permissions) 以预批准或阻止特定工具。拒绝规则在每种模式下都会阻止,包括 `bypassPermissions`。拒绝和询问规则不适用于 [`EndConversation`](/docs/zh-CN/tools-reference#endconversation-tool-behavior),只要 Claude 仍然至少有一个其他工具可以调用。允许规则在 `bypassPermissions` 中无效。

33 33 

34<h3 id="actions-no-mode-auto-approves">34<h3 id="actions-no-mode-auto-approves">

35 任何模式都不会自动批准的操作35 任何模式都不会自动批准的操作

36</h3>36</h3>

37 37 

38Claude Code 在任何模式下都不会自动批准以下操作,包括 `bypassPermissions`。每个项目链接到说明在每种模式下会发生什么的部分:38Claude Code 在任何模式下都不会自动批准以下内容,包括 `bypassPermissions`。每个项目符号链接到说明在每种模式下会发生什么的部分:

39 39 

40* 与显式[询问规则](/docs/zh-CN/permissions#manage-permissions)匹配的工具40* 与显式 [询问规则](/docs/zh-CN/permissions#manage-permissions) 匹配的工具

41* 您的组织[设置为 `ask`](/docs/zh-CN/mcp#organization-controls-on-connector-tools) 的连接器工具,在该设置到达 Claude Code 的会话中41* 您的组织 [设置为 `ask`](/docs/zh-CN/mcp#organization-controls-on-connector-tools) 的连接器工具,在该设置到达 Claude Code 的会话中

42* 需要用户交互的工具:内置的 `AskUserQuestion` 工具和标记为 [`requiresUserInteraction`](/docs/zh-CN/mcp#require-approval-for-a-specific-tool) 的 MCP 工具42* 需要用户交互的工具:内置 `AskUserQuestion` 工具和标记为 [`requiresUserInteraction`](/docs/zh-CN/mcp#require-approval-for-a-specific-tool) 的 MCP 工具

43* `rm` 和 `rmdir` 移除针对[关键路径](#critical-paths)的操作,没有允许规则或 `PreToolUse` hook `"allow"` 批准43* `rm` 和 `rmdir` 移除针对 [关键路径](#critical-paths),没有允许规则或 `PreToolUse` hook `"allow"` 批准

44* [跨会话消息传递保障](#skip-all-checks-with-bypasspermissions-mode)44* [跨会话消息传递保护措施](#skip-all-checks-with-bypasspermissions-mode)

45* 当 [`permissions.blockReadsOutsideWorkingDirectories`](/docs/zh-CN/settings-reference#permissions-blockreadsoutsideworkingdirectories) 打开时,在工作目录外读取:识别的文件读取 Bash 命令和任何[非沙箱化重试](/docs/zh-CN/sandboxing#the-unsandboxed-retry-escape-hatch),即使在自动模式和 `bypassPermissions` 模式下也需要批准才能在沙箱外运行。需要 Claude Code v2.1.257 或更高版本45* 在 [`permissions.blockReadsOutsideWorkingDirectories`](/docs/zh-CN/settings-reference#permissions-blockreadsoutsideworkingdirectories) 打开时在工作目录外读取:识别的文件读取 Bash 命令和任何需要批准才能在沙箱外运行的 [未沙箱化重试](/docs/zh-CN/sandboxing#the-unsandboxed-retry-escape-hatch),即使在 auto 模式和 `bypassPermissions` 模式下也会提示。需要 Claude Code v2.1.257 或更高版本

46 46 

47<h2 id="common-setups">47<h2 id="common-setups">

48 常见设置48 常见设置


473 473 

474 1. 与您的[允许、询问或拒绝规则](/docs/zh-CN/permissions#manage-permissions)匹配的操作立即解决。写入[受保护路径](#protected-paths)的操作即使允许规则匹配也会路由到分类器,Claude Code v2.1.218 及更高版本中针对[关键路径](#critical-paths)的 `rm` 和 `rmdir` 删除也是如此。标记为 [`requiresUserInteraction`](/docs/zh-CN/mcp#require-approval-for-a-specific-tool) 的 MCP 工具即使允许规则匹配也会直接提示您,您的组织在会话中设置为 `ask` 的[连接器工具](/docs/zh-CN/mcp#organization-controls-on-connector-tools)也是如此,其中该设置到达 Claude Code。与命令内容匹配的询问规则,例如 `Bash(git push *)`,回退到权限提示474 1. 与您的[允许、询问或拒绝规则](/docs/zh-CN/permissions#manage-permissions)匹配的操作立即解决。写入[受保护路径](#protected-paths)的操作即使允许规则匹配也会路由到分类器,Claude Code v2.1.218 及更高版本中针对[关键路径](#critical-paths)的 `rm` 和 `rmdir` 删除也是如此。标记为 [`requiresUserInteraction`](/docs/zh-CN/mcp#require-approval-for-a-specific-tool) 的 MCP 工具即使允许规则匹配也会直接提示您,您的组织在会话中设置为 `ask` 的[连接器工具](/docs/zh-CN/mcp#organization-controls-on-connector-tools)也是如此,其中该设置到达 Claude Code。与命令内容匹配的询问规则,例如 `Bash(git push *)`,回退到权限提示

475 2. 只读操作和工作目录中的文件编辑被自动批准,除了写入[受保护路径](#protected-paths)和[工作目录外的第一次读取](#first-read-outside-the-working-directories),这会提示您475 2. 只读操作和工作目录中的文件编辑被自动批准,除了写入[受保护路径](#protected-paths)和[工作目录外的第一次读取](#first-read-outside-the-working-directories),这会提示您

476 3. 其他所有内容都转到分类器。在步骤 1 中直接提示您的连接器工具和`requiresUserInteraction` MCP 工具永远不会到达分类器,因此组织要求的批准或同意步骤都不会被自动批准476 3. 其他所有内容都转到分类器。在步骤 1 中直接提示您的连接器工具和` requiresUserInteraction` MCP 工具永远不会到达分类器,因此组织要求的批准或同意步骤都不会被自动批准

477 4. 如果分类器阻止,Claude 接收原因并尝试替代方案。在大多数会话中,原因是固定文本 `Blocked by classifier` 而不是书面解释,在 Claude Code v2.1.208 及更高版本中;请参阅[审查拒绝](/docs/zh-CN/auto-mode-config#review-denials)477 4. 如果分类器阻止,Claude 接收原因并尝试替代方案。在大多数会话中,原因名称分类器匹配的规则,例如 `[Data Exfiltration]`,而不是给出书面解释;请参阅[审查拒绝](/docs/zh-CN/auto-mode-config#review-denials)

478 478 

479 进入自动模式时,授予任意代码执行的广泛允许规则被删除:479 进入自动模式时,授予任意代码执行的广泛允许规则被删除:

480 480 


518 使用 dontAsk 模式仅允许预先批准的工具518 使用 dontAsk 模式仅允许预先批准的工具

519</h2>519</h2>

520 520 

521如果您设置 `dontAsk` 模式,Claude Code 会自动拒绝所有原本会提示的工具调用。Claude 仅运行与您的 `permissions.allow` 规则、[只读 Bash 命令](/docs/zh-CN/permissions#read-only-commands)匹配的操作,以及由 [PreToolUse hook](/docs/zh-CN/permissions#extend-permissions-with-hooks) 批准的调用。在 CI 管道或受限环境中使用此模式,您可以预先定义 Claude 可以执行的操作;会话永远不会等待输入。当此模式处于活动状态时,状态栏显示 `⏵⏵ don't ask on`。521如果您设置 `dontAsk` 模式,Claude Code 会自动拒绝所有原本会提示的工具调用。Claude 仍然运行在 Manual 模式下不需要批准的操作,例如您工作目录内的文件读取和[只读 Bash 命令](/docs/zh-CN/permissions#read-only-commands),以及与您的 `permissions.allow` 规则匹配的操作和由 [PreToolUse hook](/docs/zh-CN/permissions#extend-permissions-with-hooks) 批准的调用。在 CI 管道或受限环境中使用此模式,您可以预先定义 Claude 可以执行的操作;会话永远不会等待输入。当此模式处于活动状态时,状态栏显示 `⏵⏵ don't ask on`。

522 522 

523Claude 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 工具,因为其批准卡需要此模式永远不会收集的答案;这需要 Claude Code v2.1.199 或更高版本。523Claude 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 工具,因为其批准卡需要此模式永远不会收集的答案;这需要 Claude Code v2.1.199 或更高版本。

524 524 

permissions.md +8 −4

Details

82Claude Code 支持多种权限模式来控制工具调用的批准方式。请参阅[权限模式](/docs/zh-CN/permission-modes)了解何时使用每种模式。要更改会话启动时的模式,请在您的[设置文件](/docs/zh-CN/settings#where-settings-live)中设置 `defaultMode`。[会话启动时的模式](/docs/zh-CN/permission-modes#which-mode-a-session-starts-in)涵盖了每个计划的内置默认值以及 VS Code 扩展读取的内容。82Claude Code 支持多种权限模式来控制工具调用的批准方式。请参阅[权限模式](/docs/zh-CN/permission-modes)了解何时使用每种模式。要更改会话启动时的模式,请在您的[设置文件](/docs/zh-CN/settings#where-settings-live)中设置 `defaultMode`。[会话启动时的模式](/docs/zh-CN/permission-modes#which-mode-a-session-starts-in)涵盖了每个计划的内置默认值以及 VS Code 扩展读取的内容。

83 83 

84| 模式 | 描述 |84| 模式 | 描述 |

85| :------------------ | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |85| :------------------ | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

86| `default` | 在首次使用每个工具时提示权限。在 CLI、VS Code 和 JetBrains 扩展以及桌面应用中标记为 Manual,Claude Code 接受 `manual` 作为别名。标签和别名需要 Claude Code v2.1.200 或更高版本。桌面应用的标签不依赖于您的 CLI 版本 |86| `default` | 在首次使用每个工具时提示权限。在 CLI、VS Code 和 JetBrains 扩展以及桌面应用中标记为 Manual,Claude Code 接受 `manual` 作为别名。标签和别名需要 Claude Code v2.1.200 或更高版本。桌面应用的标签不依赖于您的 CLI 版本 |

87| `acceptEdits` | 自动接受工作目录或 `additionalDirectories` 中路径的文件编辑和常见文件系统命令,例如 `mkdir`、`touch`、`mv` 和 `cp` |87| `acceptEdits` | 自动接受工作目录或 `additionalDirectories` 中路径的文件编辑和常见文件系统命令,例如 `mkdir`、`touch`、`mv` 和 `cp` |

88| `plan` | Claude 读取文件并运行只读 shell 命令来探索,但不编辑您的源文件;在[自动模式](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode)可用的情况下,分类器批准的命令也会运行。在 CLI 和 VS Code 扩展中标记为 Plan |88| `plan` | Claude 读取文件并运行只读 shell 命令来探索,但不编辑您的源文件;在[自动模式](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode)可用的情况下,分类器批准的命令也会运行。在 CLI 和 VS Code 扩展中标记为 Plan |

89| `auto` | 自动批准工具调用,并进行后台安全检查以验证操作与您的请求一致 |89| `auto` | 自动批准工具调用,并进行后台安全检查以验证操作与您的请求一致 |

90| `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)即使您已允许它们也会被拒绝 |90| `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 的会话中即使您已允许它们也会被拒绝 |

91| `bypassPermissions` | 跳过权限提示,除了[任何模式都不会自动批准的操作](/docs/zh-CN/permission-modes#actions-no-mode-auto-approves) |91| `bypassPermissions` | 跳过权限提示,除了[任何模式都不会自动批准的操作](/docs/zh-CN/permission-modes#actions-no-mode-auto-approves) |

92 92 

93<Warning>93<Warning>


455当 Claude 访问符号链接时,权限规则检查两个路径:符号链接本身和它解析到的文件。Allow 和 deny 规则对该对的处理方式不同:allow 规则回退到提示您,而 deny 规则直接阻止。455当 Claude 访问符号链接时,权限规则检查两个路径:符号链接本身和它解析到的文件。Allow 和 deny 规则对该对的处理方式不同:allow 规则回退到提示您,而 deny 规则直接阻止。

456 456 

457* **Allow 规则**:仅在符号链接路径及其目标都匹配时适用。允许目录内的符号链接指向其外部仍然会提示您。457* **Allow 规则**:仅在符号链接路径及其目标都匹配时适用。允许目录内的符号链接指向其外部仍然会提示您。

458* **Deny 规则**:当符号链接路径或其目标匹配时适用。指向被拒绝文件的符号链接本身被拒绝。458* **Deny 规则**:当符号链接路径或其目标匹配时适用。指向被拒绝文件的符号链接本身被拒绝。例如,使用 `Read(./project/**)` 允许和 `Read(~/.ssh/**)` 拒绝,`./project/key` 处的符号链接指向 `~/.ssh/id_rsa` 被阻止:目标未通过 allow 规则,并匹配 deny 规则。

459 459 

460例如,使用 `Read(./project/**)` 允许和 `Read(~/.ssh/**)` 拒绝,`./project/key` 处的符号链接指向 `~/.ssh/id_rsa` 被阻止:目标未通过 allow 规则,并匹配 deny 规则。460在 macOS 和 Linux 上,通过带有 `//`、`~/` 或 `/` 模式的符号链接目录编写的 deny 或 ask 规则也适用于该目录的真实位置。例如,在 macOS 上,其中 `/etc` 解析为 `/private/etc`,`Read(//etc/**)` 也阻止 `/private/etc/hosts`。在 v2.1.268 之前,通过符号链接目录编写的 deny 或 ask 规则不适用于其真实位置给出的路径。

461 461 

462当工具打开已批准的文件时,Claude Code [确认路径仍然解析到权限检查批准的位置](/docs/zh-CN/errors#refusing-after-a-symlink-changed)。462当工具打开已批准的文件时,Claude Code [确认路径仍然解析到权限检查批准的位置](/docs/zh-CN/errors#refusing-after-a-symlink-changed)。

463 463 


490| `WebFetch` | Claude 无需提示您即可获取。不改变沙箱命令可以到达的主机。 | Claude Code 移除 `WebFetch` 工具,因此 Claude 根本无法获取。不改变沙箱命令可以到达的主机。 |490| `WebFetch` | Claude 无需提示您即可获取。不改变沙箱命令可以到达的主机。 | Claude Code 移除 `WebFetch` 工具,因此 Claude 根本无法获取。不改变沙箱命令可以到达的主机。 |

491| `WebFetch(domain:*)` | Claude 无需提示您即可获取,沙箱命令可以到达任何主机。 | Claude Code 保留工具并拒绝每次获取,沙箱命令无法到达任何主机。 |491| `WebFetch(domain:*)` | Claude 无需提示您即可获取,沙箱命令可以到达任何主机。 | Claude Code 保留工具并拒绝每次获取,沙箱命令无法到达任何主机。 |

492 492 

493两种形式也在[工件](/docs/zh-CN/artifacts)的读取上有所不同,即 Artifact 工具在 claude.ai 上发布的页面。裸 `WebFetch` deny 或 ask 规则不适用于这些读取。覆盖 `claude.ai` 或 `*.claudeusercontent.com` 内容主机的 `domain:` 规则,如 `WebFetch(domain:claude.ai)` 或 `WebFetch(domain:*)`,拒绝每次读取或在读取前提示。[`Artifact` 规则](/docs/zh-CN/artifacts#disable-artifacts)也是如此。

494 

495当规则阻止读取时,拒绝命名规则。在 v2.1.268 之前,裸 `WebFetch` deny 规则阻止每次工件读取,裸 ask 规则在每次读取前提示。

496 

493要让 Claude 自由获取同时保持沙箱允许列表不变,请使用裸形式。此 `settings.json` 这样做:497要让 Claude 自由获取同时保持沙箱允许列表不变,请使用裸形式。此 `settings.json` 这样做:

494 498 

495```json theme={null}499```json theme={null}

platforms.md +10 −10

Details

48 远离终端时工作48 远离终端时工作

49</h2>49</h2>

50 50 

51Claude Code offers several ways to work when you're not at your terminal. They differ in what triggers the work, where Claude runs, and how much you need to set up.51Claude Code 提供了多种方式在您不在终端时进行工作。它们在触发工作的方式、Claude 运行的位置以及所需的设置量方面有所不同。

52 52 

53| | Trigger | Claude runs on | Setup | Best for |53| | 触发方式 | Claude 运行位置 | 设置 | 最适合 |

54| :------------------------------------------------------- | :--------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------ |54| :---------------------------------------------------------- | :---------------------------------------------------------------- | :--------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------- | :---------------------- |

55| [Dispatch](/docs/en/desktop#sessions-from-dispatch) | Message a task from the Claude mobile app | Your machine (Desktop) | [Pair the mobile app with Desktop](https://support.claude.com/en/articles/13947068) | Delegating work while you're away, minimal setup |55| [Dispatch](/docs/zh-CN/desktop#sessions-from-dispatch) | 从 Claude 移动应用发送任务消息 | 您的机器(Desktop) | [将移动应用与 Desktop 配对](https://support.claude.com/en/articles/13947068) | 在您离开时委派工作,最少设置 |

56| [Remote Control](/docs/en/remote-control) | Drive a running session from [claude.ai/code](https://claude.ai/code) or the Claude mobile app | Your machine (CLI or VS Code) | Run `claude remote-control` | Steering in-progress work from another device |56| [Remote Control](/docs/zh-CN/remote-control) | 从 [claude.ai/code](https://claude.ai/code) 或 Claude 移动应用驱动正在运行的会话 | 您的机器(CLI 或 VS Code) | 运行 `claude remote-control` | 从另一台设备控制进行中的工作 |

57| [Channels](/docs/en/channels) | Push events from a chat app like Telegram or Discord, or your own server | Your machine (CLI) | [Install a channel plugin](/docs/en/channels#quickstart) or [build your own](/docs/en/channels-reference) | Reacting to external events like CI failures or chat messages |57| [Channels](/docs/zh-CN/channels) | 从聊天应用(如 Telegram 或 Discord)或您自己的服务器推送事件 | 您的机器(CLI) | [安装频道插件](/docs/zh-CN/channels#quickstart) 或 [构建您自己的](/docs/zh-CN/channels-reference) | 对外部事件(如 CI 失败或聊天消息)做出反应 |

58| [Slack](/docs/en/slack) | Mention `@Claude` in a team channel | Anthropic cloud | [Install the Slack app](/docs/en/slack#setting-up-claude-code-in-slack) with [Claude Code on the web](/docs/en/claude-code-on-the-web) enabled | PRs and reviews from team chat |58| [Slack](/docs/zh-CN/slack) | 在团队频道中提及 `@Claude` | Anthropic 云 | [安装 Slack 应用](/docs/zh-CN/slack#setting-up-claude-code-in-slack),启用 [Claude Code on the web](/docs/zh-CN/claude-code-on-the-web) | 从团队聊天进行 PR 和审查 |

59| [Self-hosted environments](/docs/en/self-hosted-environments) | Start a [cloud session](/docs/en/claude-code-on-the-web) and pick your organization's environment | Your organization's infrastructure | [Deploy runners](/docs/en/self-hosted-environments-quickstart), on Team and Enterprise plans | Cloud sessions that must run inside your network |59| [Self-hosted environments](/docs/zh-CN/self-hosted-environments) | 启动 [云会话](/docs/zh-CN/claude-code-on-the-web)并选择您组织的环境 | 您组织的基础设施 | [部署运行器](/docs/zh-CN/self-hosted-environments-quickstart),在 Team 和 Enterprise 计划上 | 必须在您的网络内运行的云会话 |

60| [Scheduled tasks](/docs/en/scheduled-tasks) | Set a schedule | [CLI](/docs/en/scheduled-tasks), [Desktop](/docs/en/desktop-scheduled-tasks), or [cloud](/docs/en/routines) | Pick a frequency | Recurring automation like daily reviews |60| [Scheduled tasks](/docs/zh-CN/scheduled-tasks) | 设置计划 | [CLI](/docs/zh-CN/scheduled-tasks)、[Desktop](/docs/zh-CN/desktop-scheduled-tasks) 或 [云](/docs/zh-CN/routines) | 选择频率 | 定期自动化,如每日审查 |

61 61 

62如果您不确定从哪里开始,[安装 CLI](/docs/zh-CN/quickstart) 并在项目目录中运行它。如果您不想使用终端,[Desktop](/docs/zh-CN/desktop-quickstart) 为您提供相同的引擎和图形界面。62如果您不确定从哪里开始,[安装 CLI](/docs/zh-CN/quickstart) 并在项目目录中运行它。如果您不想使用终端,[Desktop](/docs/zh-CN/desktop-quickstart) 为您提供相同的引擎和图形界面。

63 63 

plugin-evals.md +705 −0 created

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# 使用 evals 测试插件

6 

7> 为您的 Claude Code 插件编写 eval 用例,使用 claude plugin eval 运行它们,对结果进行评分,与无插件基线进行比较,并在 CI 中基于分数进行门控。

8 

9`claude plugin eval` 针对一套测试用例运行您的[插件](/docs/zh-CN/plugins)并对结果进行评分。每个用例都是一个现实的提示加上一个或多个评分器。评分器是对 Claude 生成的内容的通过/失败检查,例如对回复的正则表达式、是否调用了特定工具,或者由第二个模型判断回复的评分标准。

10 

11您不必手动编写该套件;`claude plugin eval init` 会询问您关于您的插件的问题,提议用例和评分器,尝试它们,并编写文件。您也可以要求 Claude 从您已经打开的会话中执行相同操作。

12 

13使用 evals 来衡量您的插件可靠地引导 Claude 达到正确结果的程度,在您更改插件或发布新模型时捕捉回归,以及查看与无插件相比插件的贡献。

14 

15本页面适用于拥有可工作插件并想要测试其行为的插件和技能作者,以及在 CI 中对插件更改进行门控的团队。其用例格式与[技能创建者插件](/docs/zh-CN/skills#run-evals-with-skill-creator)使用的 `evals/evals.json` 文件分开。要创建插件,请参阅[创建插件](/docs/zh-CN/plugins);要检查插件文件的语法和架构错误而不是其行为,请使用 [`claude plugin validate`](/docs/zh-CN/plugins-reference#plugin-validate)。

16 

17<Note>

18 每次 eval 运行和每个评分器都是对您账户的真实模型调用,计入您计划的使用量或您的 API 账单,因此请先检查[要求](#requirements)。然后[创建您的第一个 eval 套件](#create-your-first-eval-suite),或者如果您已经有一个,请转到[在 CI 中运行 evals](#run-evals-in-ci)。

19</Note>

20 

21<h2 id="requirements">

22 要求

23</h2>

24 

25要运行插件 evals,你需要:

26 

27* Claude Code v2.1.269 或更高版本。运行 `claude --version` 检查,运行 `claude update` 升级。

28* 一个包含 `plugin.json` 或 `.claude-plugin/plugin.json` 清单的插件目录,或一个[技能目录插件](/docs/zh-CN/plugins-reference#skills-directory-plugins)。

29* 与你的常规 Claude Code 会话相同的身份验证和模型提供商。Eval 运行、评判评分器和 `claude plugin eval init` 使用你的凭证调用模型,因此它们计入你的计划使用限制或 API 账单。当命令报告成本时,该数字是这些调用的[列表价格估计](/docs/zh-CN/costs)。

30 

31<h2 id="how-an-eval-run-works">

32 eval 运行如何工作

33</h2>

34 

35一个 eval 套件位于插件内名为 `evals/` 的目录中,布局如[编写和完善用例](#write-and-refine-cases)所示。每个用例都是其自己的子目录,包含一个[提示](#set-run-limits-and-tools-in-prompt-md)和一个或多个[评分器](#grade-the-result)。提示是使用你的插件的人可能输入的内容,例如其中一个技能应该处理的请求。

36 

37<h3 id="what-happens-in-a-run">

38 运行中发生的情况

39</h3>

40 

41对于每次用例运行,Claude Code 启动一个新的、[隔离的](#how-runs-are-isolated)[非交互式会话](/docs/zh-CN/headless),仅加载你的插件,发送提示,并让 Claude 工作直到完成或达到用例的轮次或时间限制。然后每个评分器检查最终回复、完整记录或 Claude 创建的文件,并通过或失败。

42 

43<h3 id="how-a-case-is-scored">

44 用例如何评分

45</h3>

46 

47一次非确定性代理的运行告诉你很少,所以每个用例默认运行三次。运行的分数是其通过的评分器的比例,如果你设置了权重则加权,用例的分数是其运行的平均值。当用例的分数达到 [`--threshold`](#command-options)(默认为 1.0)时,用例通过。在模型调用中,一个套件大约进行 cases × runs 个代理运行,加上[无插件基线](#the-no-plugin-baseline)的相同数量,再加上每个 `llm` 或 `baseline` 评分器每次运行三个短评判调用。

48 

49<h3 id="the-no-plugin-baseline">

50 无插件基线

51</h3>

52 

53仅凭高分不能告诉你插件是否有帮助,因为 Claude 可能在没有插件的情况下也能做得很好。为了区分两者,默认情况下每个用例的运行会重复进行,不加载任何插件,你会得到两个分数,`WITH` 和 `W/OUT`。它们的差异 `Δ` 是插件贡献的内容。如果一个用例在有插件和没有插件的情况下都得分 1.0,那么插件不是使其通过的原因。这两组运行称为 with-arm 和 without-arm;[与无插件基线比较](#compare-against-a-no-plugin-baseline)涵盖了评分器如何在它们之间评分以及如何关闭基线。

54 

55<h2 id="create-your-first-eval-suite">

56 创建你的第一个 eval 套件

57</h2>

58 

59本演练为你自己的插件编写一个用例,运行它,并读取结果。在开始之前,请确保你有:

60 

61* Claude Code v2.1.269 或更高版本和其他[要求](#requirements)

62* 在你的插件根目录打开的终端,即包含 `plugin.json` 或 `.claude-plugin/plugin.json` 的目录

63* 插件中你想测试的一个技能,以及用户会输入的应该触发它的请求

64 

65<Steps>

66 <Step title="创建用例">

67 从插件根目录运行:

68 

69 ```bash theme={null}

70 claude plugin eval init

71 ```

72 

73 如果 Claude Code 还不信任此目录,它首先会询问 `Trust this plugin directory?`;回答 `y`。然后打开一个交互式 Claude Code 会话。Claude 读取你的插件并询问你好的结果是什么样的,提议应该和不应该触发插件的提示,为每个设计评分器,试运行一次以检查它们的行为,并在 `evals/` 下为每个提示写一个用例目录,每个都以其提示命名。当 Claude 告诉你套件已准备好时,使用 `/exit` 或 Ctrl+D 退出该会话以返回到你的 shell。

74 

75 如果你已经在插件根目录打开了 Claude Code 会话,你可以改为要求 Claude 在那里运行 `claude plugin eval init`。Claude 运行命令,然后在该对话中询问你相同的问题。

76 

77 如果你宁愿自己编写一个用例以准确查看文件包含的内容,请按照[手动编写用例](#write-a-case-manually)进行,然后回到这里运行它。

78 </Step>

79 

80 <Step title="运行套件">

81 回到你的 shell 中的插件根目录,运行 `evals/` 下的每个用例:

82 

83 ```bash theme={null}

84 claude plugin eval .

85 ```

86 

87 你已经在第 1 步中信任了此目录,所以运行立即开始。如果你改为手动编写了用例,运行首先会询问 `Trust this plugin directory? [y/N]`;回答 `y`。[运行可以访问什么](#security)解释了你同意的内容。

88 

89 每个用例使用你的插件运行三次,不使用插件运行三次,所以一个用例是六次运行。当每次运行完成时,会打印一条进度线,显示该运行的分数和每个评分器的判决。

90 </Step>

91 

92 <Step title="读取摘要">

93 当套件完成时,你会看到一个摘要表,然后是报告的位置:

94 

95 ```text theme={null}

96 CASE WITH W/OUT Δ RUNS COST NOTES

97 first-case 1.00 0.33 +0.67 6 $0.41

98 

99 1 case(s) · mean Δ +0.67 · 74s · $0.41

100 Report: /Users/you/my-plugin/evals/results/2026-09-10T17-02-11-482Z/report.html

101 Published: https://claude.ai/... · keep local next time with --no-publish

102 ```

103 

104 `WITH` 是加载你的插件的用例分数,`W/OUT` 是不加载插件的分数,正的 `Δ` 意味着插件提高了分数。`COST` 是模型调用的列表价格估计,`NOTES` 显示最高权重失败评分器的解释,或来自 with-arm 的运行错误。

105 </Step>

106 

107 <Step title="打开报告并迭代">

108 打开 `Published:` URL,或当没有 `Published:` 行出现时打开 `Report:` 路径,以查看每个评分器对每次运行的判决和解释,以及对于 `llm` 评分器的评判的投票和它评判的摘录。`Published:` 行仅在你的账户可以[发布报告](#html-report)时出现。

109 

110 最常见的第一个发现是 `Δ` 接近零,用例的 `tool_used: Skill` 评分器失败,这意味着 Claude 在自然措辞上没有选择你的技能。调整技能的 [`description`](/docs/zh-CN/skills#frontmatter-reference),再次运行 `claude plugin eval .`,并进行比较。

111 

112 要廉价地迭代单个用例,运行单个 arm 一次。单次运行噪声很大,所以在信任任何更改之前,在默认三次运行时确认它。使用一个 arm,表格显示 `SCORE` 和 `PASS%` 列而不是 `WITH`、`W/OUT` 和 `Δ`:

113 

114 ```bash theme={null}

115 claude plugin eval . --case <case-name> --runs 1 --ablation none

116 ```

117 

118 将 `<case-name>` 替换为 `evals/` 下的目录名之一。

119 </Step>

120</Steps>

121 

122<h2 id="write-and-refine-cases">

123 编写和完善用例

124</h2>

125 

126`claude plugin eval init` 编写的用例是你可以打开、更改和添加的纯文件。用例是插件 eval 目录下的一个目录,包含 `prompt.md`、`case.yaml` 或两者。要对用例进行分组,将它们嵌套在不是用例本身的目录下;用例目录内的任何内容,例如 `graders/` 和 fixture 文件,都属于该用例。

127 

128这是 `claude plugin eval init` 编写的布局,也是新套件要使用的布局。[eval 套件参考](#eval-suite-reference)有完整的树,包括 mocks 和结果:

129 

130```text theme={null}

131my-plugin/

132├── .claude-plugin/plugin.json

133├── skills/...

134└── evals/

135 ├── first-case/

136 │ ├── prompt.md # frontmatter: case fields; body: the prompt

137 │ ├── graders/

138 │ │ ├── criteria.md # frontmatter: type + options; body: rubric or pattern

139 │ │ └── skill-fired.md

140 │ └── case.yaml # optional: only for context.* fields

141 ├── ignores-unrelated-request/

142 │ └── ...

143 └── results/ # written by each run; add to .gitignore

144```

145 

146<h3 id="write-a-case-manually">

147 手动编写用例

148</h3>

149 

150让 Claude 使用 `claude plugin eval init` 编写用例是推荐的路径。要自己编写一个,请从空白模板开始。以下命令编写一个名为 `first-case` 的用例,带有占位符 `prompt.md` 和一个占位符评分器,并且不运行任何内容:

151 

152```bash theme={null}

153claude plugin eval init --bare first-case

154```

155 

156```text theme={null}

157evals/first-case/

158├── prompt.md # the prompt sent to Claude, plus run limits

159└── graders/

160 └── criteria.md # one grader: how to score the result

161```

162 

163在 `prompt.md` 中,你编写 Claude 在每次运行中接收的消息,并在其 frontmatter 中设置运行的限制和用例可能使用的工具。打开 `evals/first-case/prompt.md` 并用你的请求替换占位符正文,措辞方式应该是用户会输入的方式而不是命名技能。这个例子是针对起草提交消息的技能;使用你自己的请求:

164 

165```markdown theme={null}

166---

167max_turns: 10

168allowed_tools: [Read, Glob, Grep, Skill]

169---

170 

171Write me a commit message for this change: I renamed getUser to fetchUser and updated the three call sites.

172```

173 

174每次运行都在空工作目录中开始,所以将任务需要的任何内容放在提示本身中,或[首先设置工作区](#add-setup-or-history-with-case-yaml)。[frontmatter 字段的完整列表](#prompt-md-fields)涵盖了模型、超时、标签和环境变量。

175 

176`graders/` 下的每个文件都是运行后应用的一个检查。打开 `evals/first-case/graders/criteria.md` 并用评判模型的评分标准替换占位符,写成具体的 PASS 和 FAIL 条件:

177 

178```markdown theme={null}

179---

180type: llm

181---

182 

183PASS if <what a correct response contains>.

184FAIL if <what a wrong or missing response looks like>.

185```

186 

187然后添加第二个评分器来检查你的技能是否是产生答案的原因。创建 `evals/first-case/graders/skill-fired.md`,将 `your-skill-name` 替换为你的技能 `SKILL.md` 中的 `name`:

188 

189```markdown theme={null}

190---

191type: tool_used

192tool: Skill

193input_match: '"skill"\s*:\s*"(?:[\w-]+:)?your-skill-name"'

194---

195```

196 

197当 Claude 在运行期间至少调用一次该技能时,这会通过,包括通过其命名空间 `plugin-name:skill-name` 形式。[评分器类型](#grader-types)列出了其他可用的检查,例如匹配正则表达式或确认文件已创建。

198 

199保存两个文件后,按照[快速入门](#create-your-first-eval-suite)的方式运行用例,使用 `claude plugin eval .` 从插件根目录。

200 

201<h3 id="set-run-limits-and-tools-in-prompt-md">

202 在 prompt.md 中设置运行限制和工具

203</h3>

204 

205在 `prompt.md` frontmatter 中设置用例的 `max_turns`、`timeout_seconds`、`model`、`tags` 和它可能使用的 `allowed_tools`;[prompt.md frontmatter](#prompt-md-fields) 参考列出了每个字段及其默认值。Claude 接收正文完全按照你编写的方式。其中的 `@path` 提及不会扩展为文件附件,所以如果 Claude 需要读取文件,请在 `allowed_tools` 中为其授予工具。

206 

207<h3 id="grade-the-result">

208 选择和加权评分器

209</h3>

210 

211评分器的 frontmatter 设置其 `type`,以及可选的 `weight` 使其在运行分数中计数更多,以及一个[`arm`](#compare-against-a-no-plugin-baseline)来控制它如何针对基线评分。在六种类型中,`regex`、`tool_used`、`tool_order` 和 `file_exists` 从记录和文件计算,成本为零,而 `llm` 和 `baseline` 调用评判模型并增加运行成本。

212 

213没有自定义代码评分器。[评分器类型](#grader-types)列出了每种类型的选项和通过条件,[评分器可以查看什么](#what-a-grader-can-look-at)列出了 `target` 和 `focus` 接受的值。

214 

215`llm` 和 `baseline` 评分器的评判默认是一个小型快速模型。传递 `--judge-model sonnet` 或完整模型 ID 以对细致的评分标准使用更强大的模型。

216 

217<h4 id="choose-graders-that-give-a-stable-signal">

218 选择提供稳定信号的评分器

219</h4>

220 

221`llm` 评分器要求模型做出判决,所以其答案可能在运行之间不同,并且它读取的文本越长差异越大。这些习惯使套件的分数足够稳定以信任:

222 

223* 对于长输出(例如生成的文件),使用 `regex` 评分器对文件内容进行评分,它以相同的方式每次检查整个文件。为短输出保留 `llm` 评分器,使用具体的 PASS 和 FAIL 条件编写评分标准。

224* 为每个用例提供一个关于结果的评分器,例如最终消息或生成的文件,以及一个关于 Claude 如何到达那里的评分器,例如 `tool_used` 或 `tool_order`。它们一起告诉你答案是否正确以及你的插件是否产生了它。

225* 如果用例的 `tool_used: Skill` 评分器通过但 `Δ` 为负,怀疑评判而不是插件。小型评判模型可能会因为格式与评分标准描述的不同而将正确答案标记为错误。使用 `--judge-model sonnet` 重新运行,并收紧评分标准,使格式不会决定判决。

226* 要检查构建或测试在运行内通过,让提示要求 Claude 运行它并将结果写入文件,评分该文件,并使用 `tool_used` 评分器断言命令运行,其 `input_match` 命名该命令。

227 

228<h3 id="compare-against-a-no-plugin-baseline">

229 针对无插件基线评分

230</h3>

231 

232当插件处于测试中时,默认情况下每个用例在两个 arm 中运行。with-arm 是其加载插件的运行,without-arm 是相同数量的不加载任何插件的运行。摘要和报告显示两个分数和 `Δ`,即 with-arm 分数减去 without-arm 分数。传递 `--ablation none` 以仅运行 with-arm,当你不需要比较时(例如在迭代评分器时)将成本减半。

233 

234在两个 arm 运行中,某些评分器报告为 `scored: false`。像"技能被调用"这样的检查在没有插件的情况下永远无法通过,所以计数会将 without-arm 推向零并夸大 `Δ`。为了保持两个 arm 可比较,Claude Code 在两个 arm 中排除此类评分器的分数,并在 with-arm 中仅将其报告为通过/失败指示器。这包括:

235 

236* 每个 `tool_used` 评分器,其 `tool` 是 `Skill`

237* 任何你标记为 `arm: with-only` 的评分器

238 

239如果用例中的每个评分器都是其中之一,它们会被正常评分,因为没有什么可评分的。在评分器上设置 `arm: both` 以在两个 arm 中评分它,无论如何,这是你想要的"不得调用技能"检查,带有 `min: 0` 和 `max: 0`。在 `--ablation none` 下,没有任何内容被排除,所以相同的套件在两种模式中可能产生不同的绝对分数。

240 

241<h3 id="use-a-different-eval-directory">

242 使用不同的 eval 目录

243</h3>

244 

245如果 `evals/` 已被另一个工具占用,请将套件保留在不同的目录中。你可以在插件的 `plugin.json` 中记录该目录,以便每次运行和每个协作者都使用它,或在命令行上为单次运行传递它:

246 

247* **在 `plugin.json` 中**:添加 `"experimental": { "evals": "quality/evals" }`。

248* **在命令行上**:将 `--eval-dir quality/evals` 传递给 `claude plugin eval` 和 `claude plugin eval init`。

249 

250如果你同时设置两者,则使用标志的目录。给出相对路径,仅包含目录名称,例如 `qa` 或 `quality/evals`;包含 `..` 的绝对路径或路径被拒绝:作为标志值时是错误,而不可用的清单值会打印 `Warning:` 行,运行使用 `evals/` 代替。用例、结果和 `init` 输出都移动到该目录。

251 

252<h2 id="set-up-fixtures-and-mocks">

253 设置 fixtures 和 mocks

254</h2>

255 

256用例可能需要的不仅仅是提示:工作区中的文件或 git 存储库、要继续的早期对话,或来自你的插件与之通信的 MCP 服务器的答案。每个都在用例旁边设置,以便运行保持可重复。

257 

258<h3 id="add-setup-or-history-with-case-yaml">

259 播种工作区或对话

260</h3>

261 

262每次运行都在空工作目录中开始。当用例需要的不仅仅是提示时,在 `prompt.md` 旁边添加一个 `case.yaml`,带有 `context` 块。

263 

264要首先创建 fixture 文件或 git 存储库,在用例目录中编写 Bash 脚本并在 `context.scaffold_script` 中命名它。脚本作为你在代理沙箱外运行,仅当你传递 `--scaffold` 时,所以仅对你或你的组织编写的套件传递该标志。要继续早期对话,将记录保存为 `.jsonl` 文件并在 `context.history_file` 中命名它,用例的提示成为下一个用户轮次。要让 Claude 在运行期间读取用例中的 fixture 目录,在 `context.add_dirs` 中列出它们。

265 

266`case.yaml` 也需要 `schema_version: "1.1"` 和 `name`;[case.yaml 字段](#case-yaml-fields)参考有完整列表。

267 

268这个 `case.yaml` 从脚本播种工作区并让 Claude 从 `resources/` 目录读取 fixtures:

269 

270```yaml theme={null}

271schema_version: "1.1"

272name: changelog-from-diff

273tags: [smoke]

274context:

275 scaffold_script: fixture.sh

276 add_dirs: [resources]

277```

278 

279<h3 id="mock-mcp-servers">

280 Mock MCP 服务器

281</h3>

282 

283你可以评估一个插件,其技能调用 MCP 工具,而不需要它们后面的真实服务。在 `evals/mocks/<server>/<tool>.md` 下为整个套件放置一个 Markdown 文件,或在用例自己的 `mocks/` 目录下为一个用例,其中 `<server>` 是你的插件[MCP 配置](/docs/zh-CN/plugins-reference#mcp-servers)中服务器的名称。

284 

285运行永远不会启动你的插件的真实 MCP 服务器,除非你要求。Claude Code 在每个服务器自己的名称下注册一个替代品。带有 mock 文件的工具从它回答,并且无需 `--allow-tools` 授予即可允许,没有 mock 文件的工具对 Claude 不可用。完全没有 mocks 的服务器在用例的 `mocked:` 进度线中显示为 `plugin_<plugin>_<server>[not started: no mock]`。

286 

287文件的正文是工具返回给 Claude 的内容。这个 mock 代替了名为 `tracker` 的服务器上的 `create_issue` 工具,检查 Claude 发送的输入,并回显标题。将其保存为 `evals/mocks/tracker/create_issue.md`:

288 

289```markdown theme={null}

290---

291expect:

292 title: string

293 priority: [low, medium, high]

294---

295 

296Created issue #4821: {{input.title}}

297```

298 

299使用 `{{input.<field>}}` 从调用的输入插入字段,使用 `{{file:fixtures/{input.<field>}.json}}` 插入 mock 旁边的 fixture 文件的内容。`expect:` 块保护输入。如果调用违反它,运行以分数 0 中止并记录原因,以便用例可以断言你的插件要求服务器执行的操作。设置 `error: true` 以将正文作为工具错误返回,或 `type: agent` 以让小型模型从正文中的指令作为服务器回答。[mock 文件参考](#mock-files)列出了每个键和 `_server.md` 和 `_tools.json` 文件。

300 

301要评分调用本身,将评分器指向 `target: mock_calls`。

302 

303要改为针对插件的真实 MCP 服务器运行,传递这些标志之一。无论哪种方式,这些进程都作为你在代理沙箱外运行,它们的工具需要 [`--allow-tools` 授予](#grant-tools):

304 

305* **`--allow-real-servers`**:为你没有 mock 的每个服务器启动真实进程,并继续从它们的文件回答 mocked 工具

306* **`--mocks off`**:完全忽略 `mocks/` 并启动插件声明的每个服务器

307 

308<h4 id="replay-agent-mock-answers">

309 重放代理 mock 答案

310</h4>

311 

312`type: agent` mock 使用对 [`--judge-model`](#command-options) 的调用回答,所以其输出在运行之间变化并在你更改评判模型时改变。当运行完成而没有错误或中止时,Claude Code 在结果目录中的 `mock-recordings/` 下保存代理 mock 给出的每个答案。

313 

314打开那里的 `ADOPT.txt` 以查看每个记录和 `.replay/<server>/` 目录以复制到,在产生它的 mock 旁边。在你复制记录后,后续运行从它回答相同的调用,没有模型调用。将 `mocks/.replay/` 与 `mocks/` 的其余部分一起提交,以便 CI 运行是可重复的。

315 

316<h2 id="run-evals">

317 运行 evals

318</h2>

319 

320一旦套件存在,`claude plugin eval` 就会运行它。你可以使用 target 参数选择运行哪个插件和哪些用例,使用 `--allow-tools` 授予用例所需的任何工具(超出只读集合),并使用其他选项控制运行次数、模型、成本和输出。

321 

322<h3 id="choose-what-to-evaluate">

323 选择要评估的内容

324</h3>

325 

326大多数时候,你从插件根目录运行 `claude plugin eval .`,这会运行套件中的每个用例,并加载你所在的插件。要运行单个用例文件,或评估你安装的插件而不是你正在开发的插件,请传递不同的 target:

327 

328| Target | 运行内容 |

329| :-------------------------------------- | :------------------------------------------------------------------------------------------------ |

330| 插件的根目录,例如 `.` | 其 eval 目录下的每个用例,加载该插件 |

331| 单个 `prompt.md` 或 `case.yaml` 文件 | 该用例,加载其所在的插件 |

332| 已安装的插件(按名称),`name` 或 `name@marketplace` | 已安装副本的 eval 目录中的用例,加载已安装的副本。结果写入当前目录下的 `./evals/results/`,或使用 `--eval-dir` 时写入 `./<dir>/results/` |

333| `name@skills-dir` | 相同,用于 [skills-directory 插件](/docs/zh-CN/plugins-reference#skills-directory-plugins) |

334| 省略 | 当前目录作为路径 |

335 

336添加 `--case <glob>` 按用例名称过滤,添加 `--tag <tag>` 保留具有任何给定标签的用例。将 target 放在 `--tag`、`--allow-tools` 和 `--json` 之前。前两个接受列表,`--json` 接受可选路径,所以它们每个都读取后面的 target 作为自己的值。

337 

338<h3 id="grant-tools">

339 授予工具

340</h3>

341 

342运行永远不会停下来请求权限。需要授予但你没有授予的内置工具,例如 `Bash`、`Write`、`Edit`、`WebFetch` 和 `WebSearch`,会从会话中移除,所以 Claude 根本无法调用它们。允许列表是用例在 `allowed_tools` 中列出的只读工具,来自 `Read`、`Glob`、`Grep`、`NotebookRead`、`Skill`、`Agent`、`TodoWrite` 和任务工具 `TaskCreate`、`TaskGet`、`TaskList`、`TaskUpdate`、`TaskStop` 和 `TaskOutput`,加上你使用 `--allow-tools` 授予的任何工具,这适用于运行中的每个用例。要让用例使用 `Bash`、`Write`、`Edit`、`WebFetch` 或 `WebSearch`,请自己授予它们:

343 

344```bash theme={null}

345claude plugin eval . --allow-tools Write Edit "Bash(npm test *)"

346```

347 

348当用例请求你没有授予的工具时,运行会在 stderr 上将其列为 `not granted`。[模拟](#mock-mcp-servers) MCP 服务器上的工具不需要授予。真实插件 MCP 服务器上的工具需要服务器启动(使用 `--allow-real-servers` 或 `--mocks off`)和按名称授予,例如 `--allow-tools "mcp__plugin_my-plugin_github__*"`;插件的 MCP 工具命名为 `mcp__plugin_<plugin>_<server>__<tool>`。

349 

350当你以任何形式授予 `Bash` 时,每个命令都在 Claude Code 的 [OS 级沙箱](/docs/zh-CN/sandboxing) 下运行。写入被限制在运行的工作区,你的主目录和 Claude Code 配置不可读,网络访问限制为你使用 `--allow-tools "WebFetch(domain:example.com)"` 授予的域。如果你在没有沙箱后端的机器上授予 Bash 或 PowerShell,Claude Code 会拒绝每次运行而不是无限制地运行它,用例会显示运行错误,通常得分为 0。原生 Windows 没有后端,所以在 WSL2 下运行授予 shell 的套件;在 Linux 上,首先安装 `bubblewrap` 和 `socat`。请参阅 [沙箱先决条件](/docs/zh-CN/sandboxing)。

351 

352<h3 id="command-options">

353 命令选项

354</h3>

355 

356此表涵盖运行次数、模型、评分、成本、工具授予、模拟和输出的选项。运行 `claude plugin eval --help` 获取完整列表,其中还包括 `--case`、`--tag`、`--eval-dir`、`--no-scaffold`、`--report` 和 `--verbose`。

357 

358| 选项 | 默认值 | 效果 |

359| :------------------------- | :------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------- |

360| `--runs <n>` | 每个用例的 `runs`,否则为 3 | 每个用例每个分支的运行次数 |

361| `-j`, `--concurrency <n>` | `1` | 一次最多运行这么多个代理运行,从 1 到 8。它们共享你账户的速率限制,所以这缩短了实际时间而不是提高超过该限制的吞吐量。结果保持用例顺序 |

362| `--model <model>` | 每个用例的 `model`,否则为 `ANTHROPIC_MODEL`(如果设置),否则为 Claude Code 的默认值 | 被测试代理的模型。在 CI 中固定它,以便模型推出不会被误认为是插件回归 |

363| `--judge-model <model>` | 一个小的快速模型 | 用于 `llm` 和 `baseline` 评分器的模型 |

364| `--ablation <mode>` | 当插件解析时为 `with-without`,否则为 `none` | 是否也运行每个用例而不使用插件来衡量它添加了什么。`none` 运行一个分支;`with-without` 添加无插件基线 |

365| `--threshold <0..1>` | `1.0` | 当用例的 with 分支得分至少为此值时,用例通过。任何低于它的用例都会使命令退出 1 |

366| `--max-cost-usd <usd>` | 无上限 | 运行的列表价格成本估计的上限,不是计划使用的上限。在每次运行开始前检查。一旦花费,不会进一步启动任何内容;已在进行中的运行会完成,所以花费可能会超过这些运行的上限。如果任何运行未启动,命令会以部分结果退出 2 |

367| `--allow-tools <tools...>` | 无 | 授予超出只读集合的工具。请参阅 [授予工具](#grant-tools) |

368| `--scaffold` | 关闭 | 运行每个用例的 [`scaffold_script`](#add-setup-or-history-with-case-yaml) |

369| `--trust-plugin` | 关闭 | 跳过你会自己运行其代码和套件的插件的首次运行信任提示。在 CI 中传递它,以便作业永远不会被提示拒绝或等待。请参阅 [运行可以访问什么](#security) |

370| `--mocks <mode>` | `record` | `record` 从 [模拟](#mock-mcp-servers) 回答 MCP 工具调用,不启动插件的真实服务器,并保存代理-模拟答案以供重放。`off` 忽略模拟并启动插件的真实 MCP 服务器 |

371| `--allow-real-servers` | 关闭 | 使用 `--mocks record` 时,也为没有模拟的服务器启动插件的真实 MCP 服务器 |

372| `--json [path]` | 关闭 | 将 [结果文档](#json-result) 打印到 stdout,或将其写入以 `.json` 结尾的路径。运行是安静的:没有进度行或摘要表 |

373| `--output-dir <dir>` | `<eval dir>/results/<timestamp>/` | `aggregate-result.json` 和 `report.html` 的去向 |

374| `--no-publish` | | 保持 HTML 报告本地。请参阅 [HTML 报告](#html-report) |

375| `--publish-report` | | 发布报告,即使它会在默认情况下保持本地,例如 Claude Code 会话启动的运行 |

376| `--keep-temp` | 关闭 | 保持每次运行的沙箱目录并打印其路径,用于调试 Claude 生成的内容 |

377 

378<h3 id="run-evals-in-ci">

379 在 CI 中运行 evals

380</h3>

381 

382在你的 CI 作业中,使用 `--json` 运行套件以写入结果以供存档,并根据退出代码使构建失败。传递 `--trust-plugin` 以便作业永远不会在 [首次运行信任提示](#security) 处等待,固定两个模型以便得分在一段时间内可比较,保持报告本地,并设置成本上限作为上限:

383 

384```bash theme={null}

385claude plugin eval . \

386 --trust-plugin \

387 --json results.json \

388 --threshold 0.8 \

389 --model claude-sonnet-5 \

390 --judge-model claude-haiku-4-5 \

391 --no-publish \

392 --max-cost-usd 20

393```

394 

395作业的退出代码告诉你发生了什么:

396 

397| 退出代码 | 含义 |

398| :--- | :----------------------------------------------------------------------------------------- |

399| 0 | 每个用例得分在 `--threshold` 处或以上,每个用例文件都加载了 |

400| 1 | 用例得分低于阈值,用例文件加载失败,未找到用例,无法启动运行,插件目录不受信任且未传递 `--trust-plugin`,或选项无效 |

401| 2 | 部分运行:达到了 `--max-cost-usd` 上限,或你的凭证在首次运行前或首次运行时被拒绝。`results.json` 仍然以 `partial: true` 和原因写入 |

402| 130 | 中断。部分结果已写入 |

403| 143 | 已终止,例如由 CI 超时 |

404 

405写入或发布 HTML 报告的问题永远不会改变退出代码。要查看用例得分低的原因,请在本地运行它而不使用 `--json` 以便打印每次运行的进度和评分器行。

406 

407CI 运行程序需要 Claude Code 安装和 [环境中的凭证](/docs/zh-CN/authentication),例如 `ANTHROPIC_API_KEY`。没有 `--trust-plugin`,其检出目录 Claude Code 还不信任的作业在没有终端时被拒绝,退出 1,或在运行程序分配一个时在提示处等待。`claude plugin eval init` 需要终端来提出问题;在 CI 中,运行 `claude plugin eval init --bare <name>` 以获取空白模板。

408 

409要保持成本可预测,给快速的每次更改套件仅使用不调用评判者的评分器,在你不需要 `Δ` 的地方使用 `--ablation none`,并将 `partial: true` 文档和具有 `skippedPaidGraders` 的运行排除在你绘制的任何趋势之外。

410 

411<h2 id="read-the-results">

412 读取结果

413</h2>

414 

415每次至少有一个用例的运行都在 eval 目录内写入 `results/<timestamp>/` 目录,包含 `aggregate-result.json` 和 `report.html`。对于在插件下的路径目标;对于你命名的插件,它在你的当前目录下,如[目标表](#choose-what-to-evaluate)所示。摘要表、JSON 和报告都呈现相同的结果数据。

416 

417<h3 id="html-report">

418 HTML 报告

419</h3>

420 

421`report.html` 是一个单一的自包含文件,不进行外部请求,所以你可以将其附加到 CI 作业或从磁盘打开它。这个例子是使用 `--threshold 0.8` 运行的三用例套件报告的顶部;显示的成本是列表价格估计,随模型和用例数量而变化:

422 

423<img src="https://mintcdn.com/claude-code/qq7LHDi_F0aeFHgk/images/plugin-eval-report.png?fit=max&auto=format&n=qq7LHDi_F0aeFHgk&q=85&s=106eb6e6a70a6565f891ea3a4564f87d" alt="eval 报告的顶部:一条判决行读取&#x22;Plugin effect: +33.3 pts vs baseline, improved 2, flat 1, regressed 0 of 3 cases&#x22;,五个摘要瓷砖分别用于套件分数、消融增量、基线分数、通过阈值的用例和完美运行,然后是第一个用例及其增量、分数条和一次运行,其两个评分器都显示通过" width="1360" height="1032" data-path="images/plugin-eval-report.png" />

424 

425从上到下阅读:

426 

427* **判决行和瓷砖**回答插件是否在整个套件中有帮助。套件分数是每个用例 with-plugin 分数的平均值,Ablation Δ 是该分数高于或低于基线分数的程度,Cases 计数有多少个达到了阈值。Perfect runs 是 with-plugin 运行中每个评分器都通过的比例。

428* **每个用例卡**显示用例自己的 `Δ` 和 with-plugin 分数,在阈值处有一个刻度。`Δ` 为负的用例在左边缘获得红色,所以当你滚动时回归会突出显示。

429* **在用例内**,with-plugin 运行首先出现,基线运行之后。每次运行都列出其评分器及通过或失败芯片。失败的评分器已经展开并显示其解释,`llm` 评分器也显示评判的投票和它被显示的证据,这是你发现运行分数低的原因的地方。不计入分数的评分器,例如 `tool_used: Skill`,带有 `plugin-fired indicator` 徽章。

430* **Prompt 和 Graders**,在运行下方,显示用例的提示和每个评分器的评分标准或模式,所以没有套件的人阅读报告时可以看到被问了什么以及什么被认为是好的。

431 

432如果你使用 claude.ai 订阅登录,并且[工件](/docs/zh-CN/artifacts)可用于你的账户,Claude Code 也会将报告发布为私有工件并打印 `Published: <url>`。传递 `--no-publish` 以保持本地。如果没有 `Published:` 行出现,例如使用 API 密钥身份验证,本地文件是报告。

433 

434Claude Code 会话启动的运行,例如当你要求 Claude 为你运行套件时,也保持本地,其 `Report:` 行说 `kept local`。将 `--publish-report` 添加到该命令以发布它。

435 

436<h3 id="json-result">

437 JSON 结果

438</h3>

439 

440`aggregate-result.json` 和 `--json` 输出是一个版本化文档,带有 `schemaVersion: 1` 供 CI 脚本解析。字段名称是 camelCase,新字段在不重命名现有字段的情况下添加,所以编写你的脚本以忽略它不识别的字段。

441 

442这些是门控脚本通常读取的字段。文档还包含套件配置、每个评分器定义和每次运行的评分器结果及解释和证据:

443 

444| 字段 | 含义 |

445| :------------------------------------------------ | :-------------------------------------------------------------------------------------------------------------------- |

446| `partial`, `partialReason` | `true` 带有 `cost_ceiling`、`interrupted` 或 `auth_failed` 当套件未完成时。将部分结果排除在趋势图表之外 |

447| `aggregates.overallScore` | 套件中的平均用例分数 |

448| `aggregates.casesPassed`, `aggregates.casesTotal` | 在 `--threshold` 处或以上的用例,以及总数 |

449| `aggregates.meanDelta` | 用例中的平均 `Δ`,在两个 arm 模式下 |

450| `cases[].name` | 用例名称 |

451| `cases[].aggregates.score` | 用例的平均 with-arm 运行分数 |

452| `cases[].aggregates.delta` | With-arm 分数减去 without-arm 分数。当 arm 不可比较时省略 |

453| `cases[].arms.with[].error` | `null`,或运行异常结束的原因,例如 `timed out after 300s`。启动但结束不好的运行仍然在它生成的内容上评分,所以非空错误不意味着分数 0 |

454| `cases[].arms.with[].aborted` | 当[mock](#mock-mcp-servers) 的 `expect:` 或 `abort_when` 停止运行时出现,带有 `server`、`tool` 和 `reason`。运行分数为 0,`error` 保持 `null` |

455| `cases[].arms.with[].skippedPaidGraders` | `true` 当成本上限跳过此运行的评判评分器时,所以其分数不可比较 |

456| `costUsd`, `durationSeconds`, `claudeVersion` | 列表价格的估计成本,包括评判调用、挂钟秒数和运行套件的 Claude Code 版本 |

457 

458<h2 id="security">

459 一次运行可以访问什么

460</h2>

461 

462`claude plugin eval` 加载目标插件的 skills 和 hooks,并在你的机器上以你的身份运行其 eval 套件。指向一个插件与 `claude --plugin-dir` 的信任决定相同,所以只评估你信任的插件。本节描述的隔离限制了被测试的代理可以到达的内容;它不是针对插件自己代码的保护,通过的套件对插件是否安全没有任何说明。

463 

464<h3 id="trust-the-plugin-directory">

465 信任插件目录

466</h3>

467 

468第一次针对一个目录运行 `claude plugin eval` 时,Claude Code 会在加载任何内容之前询问 `Trust this plugin directory?`,除非你已经在交互式 `claude` 会话中接受了那里的信任提示。在 git 仓库内,回答是会信任整个仓库,对交互式会话也是如此。当 stdin 或 stdout 不是终端时,或在 `--json` 下,运行无法询问并被拒绝,退出代码为 1;传递 `--trust-plugin` 来自己声明信任,仅限于你会在自己机器上运行的插件。你命名而不是作为路径给出的目标,即已安装的插件或 skills 目录插件,会跳过提示。

469 

470插件和套件的某些部分仅在你为该运行传递其标志时才运行:一个案例的 [`scaffold_script`](#add-setup-or-history-with-case-yaml) 带有 `--scaffold`、[超出只读集合的工具](#grant-tools) 带有 `--allow-tools`,以及插件的[真实 MCP 服务器](#mock-mcp-servers) 带有 `--allow-real-servers` 或 `--mocks off`。一个案例的 `allowed_tools` 和一个 skill 自己的 `allowed-tools` frontmatter 无法扩展其中任何一个。当插件附带你没有编写的 hooks,或你启动其真实 MCP 服务器时,除非你在隔离环境(如容器或 CI 运行器)中运行它,否则将其分数视为建议性的,因为 hooks 和服务器在代理的沙箱外运行,可能会接触评分器读取的文件。

471 

472<h3 id="how-runs-are-isolated">

473 运行如何被隔离

474</h3>

475 

476每次运行都获得一个临时主目录、工作目录和 Claude Code 配置,被测试的代理在那里作为 `claude -p` 子进程运行,仅加载你的插件。在编写案例时,请记住这些后果:

477 

478* **不加载任何个人或项目级内容。** 你的用户设置、hooks、`CLAUDE.md` 文件、MCP 服务器、其他已安装的插件、memory 和 skills 都不存在,沙箱上方没有项目范围的 `.claude/` 或 `.mcp.json` 被读取。你的大部分 shell 环境也被隐瞒;只有[允许列表](#prompt-md-fields)和 `EVAL_*` 变量到达运行。如果插件需要设置,在插件中提供它,在 `scaffold_script` 中创建它,或传递 `EVAL_*` 变量。

479* **托管策略仍然可以限制运行。** 管理员部署到机器的[托管设置](/docs/zh-CN/managed-settings)中的限制适用于运行内部,所以托管机器上的结果可能因该策略而与非托管机器不同。

480* **Artifact 工具已关闭。** 发布[artifact](/docs/zh-CN/artifacts)的 skill 只能根据在该步骤之前产生的内容进行评分。

481* **案例定义对代理隐藏。** 运行无法读取 eval 目录,所以 Claude 看不到案例的提示、其评分器或兄弟案例。

482* **shell 命令外没有网络沙箱。** 你授予的 shell 命令在沙箱的网络规则下运行。一个 `WebFetch(domain:…)` 授予直接到达该域,插件自己的 hooks 和你启动的任何真实 MCP 服务器可以到达任何主机。

483 

484<h2 id="eval-suite-reference">

485 Eval 套件参考

486</h2>

487 

488eval 套件可以包含的所有内容都位于插件的 eval 目录下,`evals/` 除非你[配置了另一个](#use-a-different-eval-directory)。此树显示 `claude plugin eval` 在那里读取或写入的每个文件;仅 `prompt.md` 或 `case.yaml` 是用例存在所需的:

489 

490```text theme={null}

491evals/

492├── <case>/ # one directory per case; nest under a non-case directory to group

493│ ├── prompt.md # frontmatter: case and run fields; body: the prompt

494│ ├── case.yaml # optional: context.* fields, or the whole case in one file

495│ ├── graders/

496│ │ └── <name>.md # one grader per file; frontmatter: type and options; body: rubric

497│ ├── mocks/ # optional: mocks for this case only, same layout as below

498│ └── <fixtures, scripts, transcripts referenced by case.yaml>

499├── mocks/ # optional: suite-wide MCP mocks

500│ ├── <server>/

501│ │ ├── <tool>.md # one mocked tool; body: the tool result

502│ │ ├── _server.md # optional: one agent that answers several tools

503│ │ ├── _tools.json # optional: saved tools/list response for real descriptions and schemas

504│ │ └── fixtures/ # files inserted with {{file:fixtures/...}}

505│ └── .replay/<server>/ # adopted agent-mock recordings, answered without a model call

506└── results/<timestamp>/ # written by each run; add results/ to .gitignore

507 ├── aggregate-result.json

508 ├── report.html

509 └── mock-recordings/ # agent-mock answers from clean runs, with ADOPT.txt

510```

511 

512<h3 id="prompt-md-fields">

513 prompt.md frontmatter

514</h3>

515 

516`prompt.md` frontmatter 接受这些字段。未知键是错误:

517 

518| 字段 | 默认 | 目的 |

519| :--------------------- | :----------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

520| `schema_version` | `"1.1"`,为你设置 | 用例格式版本。写成 `prompt.md` 的用例会自动获得它,所以你很少设置它 |

521| `name` | 目录名称 | 用例名称。`--case` globs 匹配它,报告以它为键 |

522| `description` | | 对人类。运行时不使用 |

523| `tags` | `[]` | `--tag` 过滤的标签。如果任何标签匹配,用例运行 |

524| `plugins` | 最近的封闭插件 | 被测试的插件目录,相对于用例目录。当自动检测找不到你的插件时设置 `plugins: ["../.."]`;参见[插件未加载](#the-baseline-arm-shows-no-plugin-or-delta-is-zero) |

525| `runs` | `3` | 每个 arm 的运行,1 到 50。`--runs` 覆盖它 |

526| `expected_outcome` | | 对人类。运行时不使用 |

527| `model` | 子会话的默认值 | 被测试代理的模型。`--model` 覆盖它 |

528| `max_turns` | `10` | 轮次上限,最多 200。达到它被记录为运行错误,通常降低分数,所以慷慨地设置它 |

529| `timeout_seconds` | `300` | 每次运行的挂钟上限,最多 3600 |

530| `allowed_tools` | `[]` | 用例想要的工具,例如 `[Read, Glob, Grep, Skill]`。只读工具在列出时授予;对于其他任何内容,参见[授予工具](#grant-tools) |

531| `append_system_prompt` | | 附加到子会话系统提示的文本 |

532| `env` | `{}` | 子会话的额外环境变量。键必须匹配 `EVAL_[A-Z0-9_]*`;任何其他键使运行失败。运行仅从你的 shell 继承允许列表:基础知识如 `PATH` 和区域设置、代理和证书设置、选择和验证你的模型提供商的变量、大多数 `ANTHROPIC_*` 和 `CLAUDE_CODE_*` 配置,以及 `EVAL_*`。要将插件传递任何其他内容,例如工具链设置,将其导出为 `EVAL_*` 变量 |

533 

534<h3 id="case-yaml-fields">

535 case.yaml 字段

536</h3>

537 

538`case.yaml` 在 YAML 中描述相同的用例并添加指向其他文件的字段。它需要 `schema_version: "1.1"` 和 `name`。`prompt.md` 字段 `description`、`tags`、`plugins`、`runs` 和 `expected_outcome` 在顶级;`model`、`max_turns`、`timeout_seconds`、`allowed_tools`、`append_system_prompt` 和 `env` 在 `execution:` 下。当两个文件都存在时,`prompt.md` frontmatter 覆盖匹配的 `case.yaml` 字段,`prompt.md` 正文是提示,`graders/*.md` 在 `case.yaml` 中列出的任何评分器之后添加。

539 

540这些字段仅存在于 `case.yaml` 中:

541 

542| 字段 | 目的 |

543| :------------------------ | :------------------------------------------------------------------------------------------------------------------------- |

544| `context.scaffold_script` | 用例目录中的 Bash 脚本,在 Claude 启动前在空工作区中运行,以创建 fixture 文件或 git 存储库。仅当你传递 [`--scaffold`](#add-setup-or-history-with-case-yaml) 时运行 |

545| `context.history_file` | 用例目录中的 `.jsonl` 记录以恢复。用例的提示成为下一个用户轮次 |

546| `context.add_dirs` | 用例目录内 Claude 可能在运行期间读取的目录,授予只读 |

547| `execution.prompt` | 提示,当你将整个用例保留在 `case.yaml` 中并省略 `prompt.md` 时 |

548| `graders` | 评分器列表,每个带有 `name` 加上 `graders/*.md` 文件在 frontmatter 中采用的相同键。对于 `llm` 评分器,将评分标准放在 `criteria` 中 |

549 

550<h3 id="grader-frontmatter">

551 评分器 frontmatter

552</h3>

553 

554`graders/` 下的每个评分器文件在 frontmatter 中采用这些键,加上其类型的选项。评分器的名称是不带 `.md` 的文件名:

555 

556| 键 | 默认 | 目的 |

557| :------- | :-- | :------------------------------------------------------------------------------------------------------------------- |

558| `type` | 必需 | [评分器类型](#grader-types)之一 |

559| `weight` | `1` | 运行分数中的相对权重。任何正数 |

560| `arm` | 未设置 | `with-only` 在[两个 arm 运行](#compare-against-a-no-plugin-baseline)中排除评分器的评分;`both` 强制 `tool_used: Skill` 评分器在两个 arm 中评分 |

561 

562<h4 id="what-a-grader-can-look-at">

563 评分器可以查看什么

564</h4>

565 

566`regex` 评分器采用 `target`,`llm` 评分器采用 `focus`。两者接受相同的值:

567 

568| 值 | 评分器看到的内容 |

569| :------------------------------- | :----------------------------------------------------------------------------------------------------------------------- |

570| `last_message` | Claude 的最终响应文本。这是默认值 |

571| `trace` | 整个会话作为 JSON,每行一条消息。`regex` 评分器看到每条消息;`llm` 评判看到前 12 条和最后 12 条。其中的引号和换行符是 JSON 转义的,所以正则表达式匹配 `\"` 而不是 `"` |

572| `files` | Claude 在运行期间创建的路径列表,每行一个。不是它们的内容,也不是 scaffold 创建或 Claude 仅修改的文件 |

573| `{ source: file, path: <path> }` | 运行后工作区中一个文件的内容。使用此来评分插件生成的内容。PNG、JPEG、GIF 或 WebP 文件显示给 `llm` 评判作为图像。`llm` 评判拒绝其他二进制文件,例如 `.pptx` 或 PDF;将它们渲染为图像或写出为文本并评分 |

574| `mock_calls` | Claude 对[mocked MCP 工具](#mock-mcp-servers)的每个调用,带有其输入和 mock 的答案 |

575 

576<h4 id="grader-types">

577 评分器类型

578</h4>

579 

580下面的每个评分器类型列出其选项和何时通过:

581 

582| 类型 | 选项 | 通过条件 |

583| :------------ | :------------------------------------ | :----------------------------------------------------------------------------------------------------------------------------------- |

584| `regex` | `pattern`, `flags`, `match`, `target` | JavaScript 正则表达式 `pattern` 在目标中找到。设置 `match: not_contains` 以要求缺失或 `match: "count:N"` 以要求恰好 N 个匹配。将大小写不敏感放在 `flags: i` 中;不支持内联 `(?i)` |

585| `tool_used` | `tool`, `input_match`, `min`, `max` | 对 `tool` 的调用数,其 JSON 编码的输入匹配可选的 `input_match` 正则表达式,在 `min`(默认 1)和 `max`(默认无限)之间。要断言工具从未被调用,设置 `min: 0` 和 `max: 0` |

586| `tool_order` | `before`, `after` | 两个工具都被调用,第一个匹配的 `before` 调用先于第一个匹配的 `after` 调用。每个是工具名称或 `{ tool, input_match }` |

587| `file_exists` | `path`, `exists` | Claude 创建的文件匹配 `path` glob,或没有匹配 `exists: false`。仅在运行期间创建的文件计数 |

588| `llm` | `criteria`, `focus` | 评判模型在至少三次投票中的两次投票 PASS 评分标准。在 `.md` 布局中,文件正文是标准 |

589| `baseline` | `baseline_file`, `criteria` | 评判发现运行至少与 `baseline_file`(用例目录中的 `.jsonl`)处的参考记录一样满足标准 |

590 

591<h3 id="mock-files">

592 Mock 文件

593</h3>

594 

595`mocks/<server>/` 下的 `<tool>.md` 文件回答一个工具。其正文是工具结果,带有 `{{input.<field>}}` 和 `{{file:fixtures/<name>}}` 替换。其 frontmatter 接受这些键:

596 

597| 键 | 默认 | 目的 |

598| :----------- | :------ | :---------------------------------------------------------------------------------------------------------------------------------- |

599| `type` | `fixed` | `fixed` 按编写返回正文。`agent` 将正文视为小型模型的指令,该模型为运行扮演服务器并将早期调用视为历史 |

600| `expect` | 未设置 | 从点分输入路径到类型名称(例如 `string`、`number`、`boolean`、`array` 或 `object`)、`/regex/`、文字或允许的文字列表的映射。违反它的调用以分数 0 中止运行,并报告为 `aborted`,带有服务器、工具和原因 |

601| `error` | `false` | `fixed` 仅。将正文作为工具错误返回 |

602| `abort_when` | 未设置 | `agent` 仅。散文列出代理可能中止运行的唯一条件 |

603 

604两个可选文件位于服务器目录中的工具文件旁边:

605 

606* **`_server.md`**:单个 `type: agent` mock,在其 `tools:` frontmatter 键中列出的几个工具回答。相同工具的 `<tool>.md` 优先。在单个 `<tool>.md` 上放置 `expect:` 保护,不在这里

607* **`_tools.json`**:来自真实服务器的保存 `tools/list` 响应,所以 mocked 工具携带其真实描述和输入架构,而不是宽松的占位符

608 

609用例自己的 `mocks/` 目录使用相同的布局并逐文件覆盖套件的 mocks。

610 

611<h2 id="troubleshooting">

612 故障排除

613</h2>

614 

615这些是作者最常遇到的问题,按你看到的内容键入。

616 

617<h3 id="plugin-eval-is-currently-in-early-access">

618 "plugin eval is currently in early access"

619</h3>

620 

621你的构建早于命令的普遍可用性。运行 `claude update`,然后在新会话中再次运行命令。

622 

623<h3 id="plugin-eval-is-currently-unavailable">

624 "plugin eval is currently unavailable"

625</h3>

626 

627Anthropic 已在服务器端关闭命令。你的机器上没有任何内容将其打开;运行 `claude update` 并稍后在新会话中重试。

628 

629<h3 id="is-not-a-trusted-plugin-directory-and-this-run-cannot-stop-to-ask-you-about-it">

630 "is not a trusted plugin directory, and this run cannot stop to ask you about it"

631</h3>

632 

633这是针对 Claude Code 还不信任的目录的第一次运行,它无法询问因为 stdin 或 stdout 不是终端或你传递了 `--json`。在终端中运行 `claude plugin eval <dir>` 一次并回答提示,或如果你信任插件的代码和套件,传递 `--trust-plugin`。参见[运行可以访问什么](#security)。

634 

635<h3 id="no-eval-cases-found">

636 "No eval cases found"

637</h3>

638 

639eval 目录下没有 `<case>/prompt.md` 或 `<case>/case.yaml` 存在,或你的 `--case` 和 `--tag` 过滤器没有匹配任何用例。从插件根目录运行,或运行 `claude plugin eval init` 以创建套件。

640 

641<h3 id="the-baseline-arm-shows-no-plugin-or-delta-is-zero">

642 基线 arm 显示无插件,或 delta 为零

643</h3>

644 

645如果摘要没有 `W/OUT` 列,或用例失败,显示"ablation requested but no plugin resolved",没有为用例找到插件。将 `plugins: ["../.."]` 添加到用例,给出从用例目录到插件目录的路径。

646 

647如果插件确实加载,`Δ` 仍然接近零,你的 `tool_used: Skill` 评分器失败,这通常是真实发现,意味着技能的 `description` 不会在提示的措辞上触发。调整描述并重新运行相同的套件。

648 

649<h3 id="everything-scores-zero-although-the-right-files-were-produced">

650 尽管生成了正确的文件,但一切都得分为零

651</h3>

652 

653你的评分器目标 `files`(创建的路径列表),当你意思是文件的内容时。使用 `{ source: file, path: <path> }` 作为 `target` 或 `focus`。另外,`file_exists` 仅计数在运行期间创建的文件,所以 scaffold 创建或 Claude 仅编辑的文件对它不可见;评分其内容,或在 `Edit` 上使用 `tool_used`。

654 

655<h3 id="a-regex-over-the-trace-doesn’t-match-text-i-can-see">

656 对记录的正则表达式不匹配我能看到的文本

657</h3>

658 

659默认 `target` 是 `last_message`,不是记录。当你确实目标 `trace` 时,它是每行 JSON,所以引号显示为 `\"`。正则表达式使用 JavaScript 语法,所以在 `flags` 中放置 `i` 而不是写 `(?i)`。

660 

661<h3 id="tools-are-denied-mcp-tools-are-missing-or-bash-won’t-run">

662 工具被拒绝,MCP 工具丢失,或 Bash 不会运行

663</h3>

664 

665超过只读集的任何内容都需要你的授予,例如 `--allow-tools Bash Write`。你的个人 MCP 服务器永远不会在运行中加载。插件自己的服务器不启动,除非你[选择加入](#mock-mcp-servers),它们的工具然后也需要 `--allow-tools "mcp__plugin_<plugin>_<server>__*"` 授予;mocked 工具两者都不需要。

666 

667<h3 id="the-run-exits-1-but-the-results-look-fine">

668 运行退出 1 但结果看起来很好

669</h3>

670 

671默认 `--threshold` 是 1.0,所以当任何用例分数低于完美时命令退出 1。设置与你的标准匹配的阈值。退出 1 也涵盖加载失败的用例文件,在表上方的 stderr 上报告。

672 

673<h3 id="json-output-path-must-end-in-json">

674 "--json output path must end in .json"

675</h3>

676 

677你在 `--json` 后放置了目标,所以它被读作输出路径。首先放置目标,如 `claude plugin eval . --json`,或给 `--json` 一个显式的 `.json` 路径。

678 

679<h3 id="a-grader-shows-passed-false-under-a-run-that-scored-1-0">

680 评分器在得分 1.0 的运行下显示 passed: false

681</h3>

682 

683该评分器在两个 arm 运行中按设计从分数中排除,其 `scored` 字段是 `false`。参见[与无插件基线比较](#compare-against-a-no-plugin-baseline)。

684 

685<h3 id="runs-fail-with-a-usage-limit-or-rate-limit-error-partway-through">

686 运行在中途失败,出现使用限制或速率限制错误

687</h3>

688 

689如果你的账户在套件运行时达到其计划的使用限制或 API 速率限制,每个后续运行以该错误结束,在它生成的内容上评分,通常分数为 0。套件仍然完成,不标记为 `partial`,所以结果可能看起来像回归。在信任分数之前检查 `NOTES` 列或 JSON 中的 `cases[].arms.with[].error` 以获取限制消息,然后在限制重置后重新运行,如果你需要保持在它下面,使用 `--runs 1` 或 `--case` 过滤器。

690 

691<h3 id="runs-time-out-or-hit-the-turn-cap">

692 运行超时或达到轮次上限

693</h3>

694 

695默认值是 10 轮和 300 秒。为需要更多的任务在用例中提高 `max_turns` 和 `timeout_seconds`,并使用 `--max-cost-usd` 作为成本上限而不是紧的每次运行限制。

696 

697<h2 id="see-also">

698 另见

699</h2>

700 

701* [创建插件](/docs/zh-CN/plugins):构建你正在测试的插件,并在开发期间使用 `--plugin-dir` 加载它

702* [插件参考](/docs/zh-CN/plugins-reference#plugin-eval):`plugin eval` 和 `plugin eval init` 命令条目以及清单的 `experimental.evals` 键

703* [技能](/docs/zh-CN/skills):技能的描述如何决定 Claude 何时调用它,这是检查技能是否触发的用例测量的内容

704* [沙箱](/docs/zh-CN/sandboxing):当你授予 Bash 给运行时应用的操作系统级沙箱

705* [创建和分发插件市场](/docs/zh-CN/plugin-marketplaces):一旦其套件通过,发布插件

plugin-hints.md +1 −1

Details

36在环境变量上进行门控以发出提示,使标记不太可能在人类直接运行您的 CLI 时出现,然后将标签写入 stderr,单独占一行。选择要检查的变量:36在环境变量上进行门控以发出提示,使标记不太可能在人类直接运行您的 CLI 时出现,然后将标签写入 stderr,单独占一行。选择要检查的变量:

37 37 

38* `CLAUDECODE`:在每个 Claude Code 版本上设置,因此可以到达最多的会话。它也在 tmux 会话和 Claude Code 启动的 stdio MCP 服务器子进程中设置,IDE 扩展在其集成终端中设置它,人类可能在那里直接运行您的 CLI。38* `CLAUDECODE`:在每个 Claude Code 版本上设置,因此可以到达最多的会话。它也在 tmux 会话和 Claude Code 启动的 stdio MCP 服务器子进程中设置,IDE 扩展在其集成终端中设置它,人类可能在那里直接运行您的 CLI。

39* `CLAUDE_CODE_CHILD_SESSION`:仅在 Claude Code 本身生成的子进程中设置,例如工具调用、hook 命令和[状态行](/docs/zh-CN/statusline)命令,因此标签通常不会到达人类终端。在会话内启动的长期进程(例如 tmux 服务器)会捕获该变量,因此从该进程启动的后续 shell 仍然显示原始标签。需要 Claude Code v2.1.172 或更高版本,因此较旧版本上的会话会错过提示。39* `CLAUDE_CODE_CHILD_SESSION`:仅在 Claude Code 本身生成的子进程中设置,例如工具调用、hook 命令和[状态行](/docs/zh-CN/statusline)命令,因此标签通常不会到达人类终端。在会话内启动的长期进程(例如 tmux 服务器)会捕获该变量,因此从该进程启动的后续 shell 仍然显示原始标签。

40 40 

41以下示例在 `CLAUDECODE` 上进行门控以获得最大覆盖范围,并为官方市场中名为 `example-cli` 的插件发出提示:41以下示例在 `CLAUDECODE` 上进行门控以获得最大覆盖范围,并为官方市场中名为 `example-cli` 的插件发出提示:

42 42 

Details

63 {63 {

64 "name": "quality-review-plugin",64 "name": "quality-review-plugin",

65 "description": "Adds a quality-review skill for quick code reviews",65 "description": "Adds a quality-review skill for quick code reviews",

66 "version": "1.0.0"66 "version": "1.0.0",

67 "author": {

68 "name": "Your Name"

69 }

67 }70 }

68 ```71 ```

69 72 

70 <Note>73 <Note>

71 设置 `version` 意味着用户仅在你更改此字段时才会收到更新,因此在每次发布时都要提升版本号。如果你省略 `version` 并在 git 中托管此 marketplace,每次提交都会自动计为新版本。请参阅 [版本解析](#version-resolution-and-release-channels) 以选择正确的方法。74 设置 `version` 意味着用户仅在你更改此字段时才会收到更新,因此在每次发布时都要提升版本号。具有 command source 的 plugin 不会被此字段固定。如果你省略 `version`,版本来自 [版本管理](/docs/zh-CN/plugins-reference#version-management) 中的下一个来源。

72 </Note>75 </Note>

73 </Step>76 </Step>

74 77 


93 </Step>96 </Step>

94 97 

95 <Step title="添加和安装">98 <Step title="添加和安装">

96 添加 marketplace 并安装 plugin。99 从包含 `my-marketplace` 的目录启动 Claude Code 并运行以下命令。install 命令打开一个 plugin 详情视图,你可以在其中选择安装范围来确认安装。检查安装摘要:如果它报告 `Run /reload-plugins to activate.`,请参阅 [不重启应用而应用 plugin 更改](/docs/zh-CN/discover-plugins#apply-plugin-changes-without-restarting)。

97 100 

98 ```shell theme={null}101 ```shell theme={null}

99 /plugin marketplace add ./my-marketplace102 /plugin marketplace add ./my-marketplace


113要了解更多关于 plugins 可以做什么的信息,包括 hooks、agents、MCP servers 和 LSP servers,请参阅 [Plugins](/docs/zh-CN/plugins)。116要了解更多关于 plugins 可以做什么的信息,包括 hooks、agents、MCP servers 和 LSP servers,请参阅 [Plugins](/docs/zh-CN/plugins)。

114 117 

115<Note>118<Note>

116 **plugins 如何安装**:当用户安装 plugin 时,Claude Code 将 plugin 目录复制到缓存位置。这意味着 plugins 无法使用 `../shared-utils` 之类的路径引用其目录外的文件,因为这些文件不会被复制。119 **plugins 如何安装**:当用户安装 plugin 时,Claude Code 将 plugin 目录复制到缓存位置,除了 link mode 中的 command source,它被就地使用。复制的 plugins 无法使用 `../shared-utils` 之类的路径引用其目录外的文件,因为这些文件不会被复制。

117 120 

118 如果你需要在 plugins 之间共享文件,请使用符号链接。有关详细信息,请参阅 [Plugin 缓存和文件解析](/docs/zh-CN/plugins-reference#plugin-caching-and-file-resolution)。121 如果你需要在 plugins 之间共享文件,请使用符号链接。有关详细信息,请参阅 [Plugin 缓存和文件解析](/docs/zh-CN/plugins-reference#plugin-caching-and-file-resolution)。

119</Note>122</Note>


164</h3>167</h3>

165 168 

166| 字段 | 类型 | 描述 | 示例 |169| 字段 | 类型 | 描述 | 示例 |

167| :-------- | :----- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------- |170| :-------- | :----- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------- |

168| `name` | string | Marketplace 标识符(kebab-case,无空格)。这是面向公众的:用户在安装 plugins 时会看到它(例如,`/plugin install my-tool@your-marketplace`)。每个用户只能为每个名称注册一个 marketplace:添加第二个同名 marketplace 会替换第一个。要在一个 marketplace 名称下发布多个 plugins,请在[单个 `marketplace.json`](#create-the-marketplace-file) 中列出它们。 | `"acme-tools"` |171| `name` | string | Marketplace 标识符,采用 kebab-case 格式,不包含空格、控制字符或双向格式化字符。这是面向公众的:用户在安装 plugins 时会看到它(例如,`/plugin install my-tool@your-marketplace`)。每个用户只能为每个名称注册一个 marketplace:添加第二个同名 marketplace 时,Claude Code 会替换第一个。要在一个 marketplace 名称下发布多个 plugins,请在[单个 `marketplace.json`](#create-the-marketplace-file) 中列出它们。 | `"acme-tools"` |

169| `owner` | object | Marketplace 维护者信息([见下面的字段](#owner-fields)) | |172| `owner` | object | Marketplace 维护者信息([见下面的字段](#owner-fields)) | |

170| `plugins` | array | 可用 plugins 列表 | 见下文 |173| `plugins` | array | 可用 plugins 列表 | 见下文 |

171 174 

172<Note>175<Note>

173 **保留名称**:以下 marketplace 名称为 Anthropic 官方使用保留,第三方 marketplaces 无法使用:`claude-code-marketplace`、`claude-code-plugins`、`claude-plugins-official`、`claude-plugins-community`、`claude-community`、`anthropic-marketplace`、`anthropic-plugins`、`agent-skills`、`anthropic-agent-skills`、`knowledge-work-plugins`、`life-sciences`、`claude-for-legal`、`claude-for-financial-services`、`financial-services-plugins`、`first-party-plugins`、`healthcare`。冒充官方 marketplaces 的名称(如 `official-claude-plugins` 或 `anthropic-plugins-v2`)也被阻止。保留这些名称可防止第三方 marketplace 将自己呈现为 Anthropic 发布的来源。176 **保留名称**:以下 marketplace 名称为 Anthropic 官方使用保留,第三方 marketplaces 无法使用:`claude-code-marketplace`、`claude-code-plugins`、`claude-plugins-official`、`claude-plugins-community`、`claude-community`、`anthropic-marketplace`、`anthropic-plugins`、`agent-skills`、`anthropic-agent-skills`、`knowledge-work-plugins`、`life-sciences`、`claude-for-legal`、`claude-for-financial-services`、`financial-services-plugins`、`first-party-plugins`、`claude-tag-plugins`、`healthcare`。冒充官方 marketplaces 的名称(如 `official-claude-plugins` 或 `anthropic-plugins-v2`)也被阻止。保留这些名称可防止第三方 marketplace 将自己呈现为 Anthropic 发布的来源。

174 177 

175 Claude Code 每次加载 marketplace 时都会重新检查保留名称,而不仅仅是在添加时。在该名称成为保留名称之前以其中一个名称注册的 marketplace 停止加载,并报告它是[从不受信任的来源注册的](/docs/zh-CN/errors#marketplace-is-registered-from-an-untrusted-source)。移除该 marketplace 并从官方 Anthropic 来源重新添加它。受新保留名称影响的第三方 marketplace 在你以不同名称重新添加它后立即再次加载。在 v2.1.205 之前,`first-party-plugins` 和 `healthcare` 不是保留的,已在保留名称下注册的 marketplace 继续加载。178 Claude Code 每次加载 marketplace 时都会重新检查保留名称,而不仅仅是在添加时。在该名称成为保留名称之前以其中一个名称注册的 marketplace 停止加载,并报告它是[从不受信任的来源注册的](/docs/zh-CN/errors#marketplace-is-registered-from-an-untrusted-source)。移除该 marketplace 并从官方 Anthropic 来源重新添加它。受新保留名称影响的第三方 marketplace 在你以不同名称重新添加它后立即再次加载。在 v2.1.205 之前,`first-party-plugins` 和 `healthcare` 不是保留的,已在保留名称下注册的 marketplace 继续加载。在 v2.1.265 之前,`claude-tag-plugins` 不是保留的。

176</Note>179</Note>

177 180 

178<h3 id="owner-fields">181<h3 id="owner-fields">


180</h3>183</h3>

181 184 

182| 字段 | 类型 | 必需 | 描述 |185| 字段 | 类型 | 必需 | 描述 |

183| :------ | :----- | :- | :--------- |186| :------ | :----- | :- | :-------------------- |

184| `name` | string | 是 | 维护者或团队的名称 |187| `name` | string | 是 | 维护者或团队的名称 |

185| `email` | string | 否 | 维护者的联系电子邮件 |188| `email` | string | 否 | 维护者的联系电子邮件 |

189| `url` | string | 否 | 网站、GitHub 个人资料或组织 URL |

186 190 

187<h3 id="optional-fields">191<h3 id="optional-fields">

188 可选字段192 可选字段


193| `$schema` | string | 用于编辑器自动完成和验证的 JSON Schema URL。Claude Code 在加载时忽略此字段。 |197| `$schema` | string | 用于编辑器自动完成和验证的 JSON Schema URL。Claude Code 在加载时忽略此字段。 |

194| `description` | string | 简短的 marketplace 描述 |198| `description` | string | 简短的 marketplace 描述 |

195| `version` | string | Marketplace 清单版本 |199| `version` | string | Marketplace 清单版本 |

196| `metadata.pluginRoot` | string | 前置到相对 plugin 源路径的基目录(例如,`"./plugins"` 让你写 `"source": "formatter"` 而不是 `"source": "./plugins/formatter"`) |200| `metadata.pluginRoot` | string | Claude Code 解析裸 plugin 源名称的目录。见[相对路径](#relative-paths)。需要 Claude Code v2.1.239 或更高版本。 |

197| `allowCrossMarketplaceDependenciesOn` | array | 此 marketplace 中的 plugins 可能依赖的其他 marketplaces。来自此处未列出的 marketplace 的依赖项在安装时被阻止。见[依赖来自另一个 marketplace 的 plugin](/docs/zh-CN/plugin-dependencies#depend-on-a-plugin-from-another-marketplace)。 |201| `allowCrossMarketplaceDependenciesOn` | array | 此 marketplace 中的 plugins 可能依赖的其他 marketplaces。来自此处未列出的 marketplace 的依赖项在安装时被阻止。见[依赖来自另一个 marketplace 的 plugin](/docs/zh-CN/plugin-dependencies#depend-on-a-plugin-from-another-marketplace)。 |

198| `renames` | object | 从前一个 plugin `name` 到其当前名称的映射,或如果 plugin 被移除则映射到 `null`。当你重命名或移除 `plugins` 中的条目时,让现有用户自动迁移。见[重命名或移除 plugin](#rename-or-remove-a-plugin)。需要 Claude Code v2.1.193 或更高版本。 |202| `renames` | object | 从前一个 plugin `name` 到其当前名称的映射,或如果 plugin 被移除则映射到 `null`。当你重命名或移除 `plugins` 中的条目时,让现有用户自动迁移。见[重命名或移除 plugin](#rename-or-remove-a-plugin)。需要 Claude Code v2.1.193 或更高版本。 |

199 203 


203 Plugin 条目207 Plugin 条目

204</h2>208</h2>

205 209 

206`plugins` 数组中的每个 plugin 条目描述一个 plugin 及其位置。你可以包含 [plugin manifest 架构](/docs/zh-CN/plugins-reference#plugin-manifest-schema)中的任何字段,如 `description`、`version`、`author`、`commands` 和 `hooks`,加上这些 marketplace 特定的字段:`source`、`category`、`tags`、`strict` 和 `relevance`。210`plugins` 数组中的每个 plugin 条目描述一个 plugin 及其位置。你可以包含 [plugin manifest 架构](/docs/zh-CN/plugins-reference#plugin-manifest-schema)中的任何字段,如 `description`、`version`、`author`、`commands` 和 `hooks`,加上这些 marketplace 特定的字段:`source`、`category`、`tags`、`strict`、`relevance`、`headers` 和 `headersHelper`。

207 211 

208<h3 id="required-fields-2">212<h3 id="required-fields-2">

209 必需字段213 必需字段

210</h3>214</h3>

211 215 

212| 字段 | 类型 | 描述 |216| 字段 | 类型 | 描述 |

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

214| `name` | string | Plugin 标识符(kebab-case,无空格)。这是面向公众的:用户在安装时会看到它(例如,`/plugin install my-plugin@marketplace`)。 |218| `name` | string | Plugin 标识符(kebab-case,无空格、控制字符或双向格式化字符)。这是面向公众的:用户在安装时会看到它(例如,`/plugin install my-plugin@marketplace`)。 |

215| `source` | string\|object | 从哪里获取 plugin(见下面的 [Plugin 源](#plugin-sources)) |219| `source` | string\|object | 从哪里获取 plugin(见下面的 [Plugin 源](#plugin-sources)) |

216 220 

217<h3 id="optional-plugin-fields">221<h3 id="optional-plugin-fields">


221**标准元数据字段:**225**标准元数据字段:**

222 226 

223| 字段 | 类型 | 描述 |227| 字段 | 类型 | 描述 |

224| :--------------- | :------ | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |228| :--------------- | :------ | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

225| `displayName` | string | 在 UI 界面中显示的人类可读名称。当省略时回退到 `name`。可以包含空格和任何大小写。不用于命名空间或查找。需要 Claude Code v2.1.143 或更高版本。 |229| `displayName` | string | 在 UI 界面中显示的人类可读名称。当条目和 plugin 的 `plugin.json` 都未设置时,用户会看到 plugin 的 `name`。可以包含空格和任何大小写。不用于命名空间或查找。 |

226| `description` | string | 简短的 plugin 描述 |230| `description` | string | 简短的 plugin 描述 |

227| `version` | string | Plugin 版本。如果设置(在此处或在 `plugin.json` 中),plugin 将固定到此字符串,用户仅在其更改时才会收到更新。省略以回退到 git commit SHA。见 [版本解析](#version-resolution-and-release-channels)。 |231| `version` | string | Plugin 版本。如果设置(在此处或在 `plugin.json` 中),plugin 将固定到此字符串,用户仅在其更改时才会收到更新。具有 [`command` 源](#command-sources)的 plugin 不会被任一字段固定。如果在两个地方都未设置,版本来自 [版本管理](/docs/zh-CN/plugins-reference#version-management)中的下一个源。 |

228| `author` | object | Plugin 作者信息(`name` 必需,`email` 可选) |232| `author` | object | Plugin 作者信息(`name` 必需;`email` 和 `url` 可选) |

229| `homepage` | string | Plugin 主页或文档 URL |233| `homepage` | string | Plugin 主页或文档 URL |

230| `repository` | string | 源代码存储库 URL |234| `repository` | string | 源代码存储库 URL |

231| `license` | string | SPDX 许可证标识符(例如,MIT、Apache-2.0) |235| `license` | string | SPDX 许可证标识符(例如,MIT、Apache-2.0) |

232| `keywords` | array | 用于 plugin 发现和分类的标签 |236| `keywords` | array | 用于 plugin 发现和分类的标签 |

237| `metadata` | object | 自由格式对象,用于你自己的字段,如权利或目录数据。Claude Code 不读取它。在 v2.1.222 之前,`claude plugin validate` 将该键报告为无法识别的字段。 |

233| `category` | string | Plugin 类别以供组织 |238| `category` | string | Plugin 类别以供组织 |

234| `tags` | array | 用于可搜索性的标签 |239| `tags` | array | 用于可搜索性的标签 |

235| `strict` | boolean | 控制 `plugin.json` 是否是组件定义的权威(默认:true)。见下面的 [Strict 模式](#strict-mode)。 |240| `strict` | boolean | 控制 `plugin.json` 是否是组件定义的权威(默认:true)。见下面的 [Strict 模式](#strict-mode)。 |

236| `relevance` | object | 告诉 Claude Code 何时向用户建议此 plugin 的信号。仅对管理员在托管设置中允许列表的 marketplace 生效。见 [为你的组织推荐 plugin](/docs/zh-CN/plugin-relevance)。需要 Claude Code v2.1.152 或更高版本。 |241| `relevance` | object | 告诉 Claude Code 何时向用户建议此 plugin 的信号。仅对管理员在托管设置中允许列表的 marketplace 生效。见 [为你的组织推荐 plugin](/docs/zh-CN/plugin-relevance)。 |

237| `defaultEnabled` | boolean | plugin 安装后是否启用(默认:true)。设置为 `false` 以安装禁用的 plugin,直到用户选择启用。优先于 plugin 的 `plugin.json` 中的同一字段。见 [默认启用](/docs/zh-CN/plugins-reference#default-enablement)。需要 Claude Code v2.1.154 或更高版本。 |242| `defaultEnabled` | boolean | Plugin 安装后是否启用(默认:true)。设置为 `false` 以安装禁用的 plugin,直到用户选择启用。优先于 plugin 的 `plugin.json` 中的同一字段。见 [默认启用](/docs/zh-CN/plugins-reference#default-enablement)。 |

243 

244条目和 plugin 自己的 `plugin.json` 都可以设置显示字段 `displayName`、`description`、`author`、`homepage`、`repository`、`license` 和 `keywords`。在 plugin 列表和详情中,安装前后:

245 

246* 对于你在条目上设置的字段,用户会看到条目的值,即使 `plugin.json` 设置了不同的值。

247* 对于条目未设置的字段,用户会看到 `plugin.json` 的值。

248 

249安装前,Claude Code 只能为具有 [相对路径源](#relative-paths)的条目读取 `plugin.json`,其 plugin 文件位于 marketplace 内部。对于具有任何其他源类型的条目,用户在安装 plugin 之前只会看到条目自己的字段。

238 250 

239**组件配置字段:**251**组件配置字段:**

240 252 


247| `mcpServers` | string\|object | MCP server 配置或 MCP 配置的路径 |259| `mcpServers` | string\|object | MCP server 配置或 MCP 配置的路径 |

248| `lspServers` | string\|object | LSP server 配置或 LSP 配置的路径 |260| `lspServers` | string\|object | LSP server 配置或 LSP 配置的路径 |

249 261 

262**存档身份验证字段:**

263 

264当条目在需要凭证的服务器上具有 [`archive` 源](#zip-archives)时设置这些字段。

265 

266| 字段 | 类型 | 描述 |

267| :-------------- | :----- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------- |

268| `headers` | object | Claude Code 在下载此条目的存档时发送的 HTTP 标头。覆盖 marketplace 中相同名称的标头。需要 Claude Code v2.1.238 或更高版本。 |

269| `headersHelper` | string | 命令,将此条目的存档下载的 HTTP 标头打印为一个 JSON 对象,用于过期的凭证。见 [验证存档下载](#authenticate-archive-downloads)。条目还必须设置 [`"strict": false`](#strict-mode)。需要 Claude Code v2.1.238 或更高版本。 |

270 

250<h2 id="plugin-sources">271<h2 id="plugin-sources">

251 Plugin 源272 Plugin 源

252</h2>273</h2>

253 274 

254Plugin 源告诉 Claude Code 在你的 marketplace 中列出的每个单独 plugin 从哪里获取。这些在 `marketplace.json` 中每个 plugin 条目的 `source` 字段中设置。275Plugin 源告诉 Claude Code 在你的 marketplace 中列出的每个单独 plugin 从哪里获取。这些在 `marketplace.json` 中每个 plugin 条目的 `source` 字段中设置。

255 276 

256一旦 Claude Code 克隆或下载 plugin 到本地机器,它就会将 plugin 复制到本地版本化 plugin 缓存中,位置为 `~/.claude/plugins/cache`。277Claude Code 将每个已安装的 plugin 复制到本地版本化 plugin 缓存中,位置为 `~/.claude/plugins/cache`,除了[链接模式](#copy-mode-and-link-mode)中的 [`command` 源](#command-sources),Claude Code 会就地使用。Claude Code 还会[将 plugin 的符合条件的 Node.js 包依赖项安装](/docs/zh-CN/plugins-reference#node-js-package-dependencies)到缓存副本中。

257 278 

258| 源 | 类型 | 字段 | 注释 |279| 源 | 类型 | 字段 | 注释 |

259| ------------ | ---------------------------- | -------------------------------- | ---------------------------------------------------------------------------------- |280| ------------ | ---------------------------- | -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |

260| 相对路径 | `string`(例如 `"./my-plugin"`) | 无 | marketplace repo 中的本地目录。必须以 `./` 开头。相对于 marketplace 根目录解析,而不是 `.claude-plugin/` 目录 |281| 相对路径 | `string`(例如 `"./my-plugin"`) | 无 | marketplace repo 中的本地目录。必须以 `./` 开头,除非你在 [`metadata.pluginRoot`](#relative-paths) 下写一个[裸名](#relative-paths)。Claude Code 相对于 marketplace 根目录解析路径,而不是 `.claude-plugin/` 目录 |

261| `github` | object | `repo`、`ref?`、`sha?` | |282| `github` | object | `repo`、`ref?`、`sha?` | |

262| `url` | object | `url`、`ref?`、`sha?` | Git URL 源 |283| `url` | object | `url`、`ref?`、`sha?` | Git URL 源 |

263| `git-subdir` | object | `url`、`path`、`ref?`、`sha?` | git repo 中的子目录。稀疏克隆以最小化大型 monorepos 的带宽 |284| `git-subdir` | object | `url`、`path`、`ref?`、`sha?` | git repo 中的子目录。稀疏克隆以最小化大型 monorepos 的带宽 |

264| `npm` | object | `package`、`version?`、`registry?` | 通过 `npm install` 安装 |285| `npm` | object | `package`、`version?`、`registry?` | 通过 `npm install` 安装 |

286| `archive` | object | `url`、`sha256?` | 通过 HTTPS 下载的 Zip 存档。在用户机器上无需 git 或 npm 即可工作。需要 Claude Code v2.1.224 或更高版本 |

287| `command` | object | `command`、`timeout?`、`mode?` | 通过运行本地命令生成的 plugin 目录,每个会话重新运行一次以获取更改。需要 Claude Code v2.1.229 或更高版本 |

265 288 

266<Note>289<Note>

267 **Marketplace 源与 plugin 源**:这些是控制不同事物的不同概念。290 **Marketplace 源与 plugin 源**:这些是控制不同事物的不同概念。

268 291 

269 * **Marketplace 源**:从哪里获取 `marketplace.json` 目录本身。在用户运行 `/plugin marketplace add` 或在 `extraKnownMarketplaces` 设置中设置。支持 `ref`(分支/标签)但不支持 `sha`。292 * **Marketplace 源**:从哪里获取 `marketplace.json` 目录本身。在用户运行 `/plugin marketplace add` 或在 `extraKnownMarketplaces` 设置中设置。基于 Git 的 marketplace 源支持 `ref`(分支/标签)但不支持 `sha`。

270 * **Plugin 源**:从哪里获取 marketplace 中列出的单个 plugin。在 `marketplace.json` 内每个 plugin 条目的 `source` 字段中设置。支持 `ref`(分支/标签)和 `sha`(精确提交)。293 * **Plugin 源**:从哪里获取 marketplace 中列出的单个 plugin。在 `marketplace.json` 内每个 plugin 条目的 `source` 字段中设置。基于 Git 的 plugin 源支持 `ref`(分支/标签)和 `sha`(精确提交)。

271 294 

272 例如,托管在 `acme-corp/plugin-catalog` 的 marketplace(marketplace 源)可以列出从 `acme-corp/code-formatter` 获取的 plugin(plugin 源)。marketplace 源和 plugin 源指向不同的存储库,并独立固定。295 例如,托管在 `acme-corp/plugin-catalog` 的 marketplace(marketplace 源)可以列出从 `acme-corp/code-formatter` 获取的 plugin(plugin 源)。marketplace 源和 plugin 源指向不同的存储库,并独立固定。

273</Note>296</Note>

274 297 

275基于 git 的源类型如下所示为 `github`、`url` 和 `git-subdir`。当在其中任何一个上同时设置 `ref` 和 `sha` 时,`sha` 是有效的固定。Claude Code 直接获取并检出固定的提交。在大多数 git 主机上,包括 GitHub、GitLab 和 Bitbucket,这意味着即使上游的 `ref` 命名的分支或标签已被删除,只要提交仍然可从存储库到达,安装也会成功。某些服务器(如 AWS CodeCommit)不支持通过 SHA 获取提交。在这些服务器上,`ref` 必须仍然存在,固定的提交必须可从其到达。298下面的基于 git 的源类型是 `github`、`url` 和 `git-subdir`。当在其中任何一个上同时设置 `ref` 和 `sha` 时,`sha` 是有效的固定。Claude Code 直接获取并检出固定的提交。

299 

300在大多数 git 主机上,包括 GitHub、GitLab 和 Bitbucket,这意味着即使上游的 `ref` 命名的分支或标签已被删除,只要提交仍然可从存储库到达,安装也会成功。某些服务器(如 AWS CodeCommit)不支持通过 SHA 获取提交。在这些服务器上,`ref` 必须仍然存在,固定的提交必须可从其到达。

301 

302如果你通过**组织设置 > Plugins** 分发 plugins,只允许某些源类型。见[通过组织设置分发](#distribute-through-organization-settings)。

276 303 

277<h3 id="relative-paths">304<h3 id="relative-paths">

278 相对路径305 相对路径


287}314}

288```315```

289 316 

290路径相对于 marketplace 根目录解析,即包含 `.claude-plugin/` 的目录。在上面的示例中,`./plugins/my-plugin` 指向 `<repo>/plugins/my-plugin`,即使 `marketplace.json` 位于 `<repo>/.claude-plugin/marketplace.json`。不要使用 `../` 来引用 marketplace 根目录外的路径。317路径相对于 marketplace 根目录解析,即包含 `.claude-plugin/` 的目录。在上面的示例中,`./plugins/my-plugin` 指向 `<repo>/plugins/my-plugin`,即使 `marketplace.json` 位于 `<repo>/.claude-plugin/marketplace.json`。不要使用 `../` 来引用 marketplace 根目录外的路径。在 macOS 和 Linux 上,Claude Code 拒绝在前导 `./` 之后任何地方包含反斜杠的条目路径,所以在每个平台上将分隔符写为 `/`。

318 

319裸名是没有 `/` 的单个目录名,例如 `"formatter"`。要写裸名而不是 `./` 路径,请设置 [`metadata.pluginRoot`](#optional-fields) 为它们解析的目录。使用 `"pluginRoot": "./plugins"`,Claude Code 将 `"source": "formatter"` 解析为 `./plugins/formatter`。需要 Claude Code v2.1.239 或更高版本。

320 

321`metadata.pluginRoot` 本身必须是 marketplace 内的相对路径。Claude Code 对已经以 `./` 开头的源忽略它。包含 `/` 的源,例如 `team-a/formatter`,不是裸名,即使设置了 `metadata.pluginRoot`,仍然需要 `./` 前缀。

291 322 

292<Note>323<Note>

293 相对路径仅在用户通过 git 源或本地目录添加你的 marketplace 时有效。如果用户通过直接 URL 添加你的 marketplace 到 `marketplace.json` 文件,相对路径将无法解析,因为只有该文件被下载。对于基于 URL 的分发,请改用 GitHub、npm 或 git URL 源。有关详细信息,请参阅[故障排除](#plugins-with-relative-paths-fail-in-url-based-marketplaces)。324 Claude Code 相对于 marketplace 的本地副本解析相对路径,所以当用户从 git 源或本地目录添加你的 marketplace 时它们有效。如果用户通过直接 URL 添加你的 marketplace 到 `marketplace.json` 文件,相对路径将无法解析,因为 Claude Code 仅下载该文件。对于基于 URL 的分发,请改用任何其他[plugin 源](#plugin-sources)。见[故障排除](#plugins-with-relative-paths-fail-in-url-based-marketplaces)了解详情。

294</Note>325</Note>

295 326 

296<h3 id="github-repositories">327<h3 id="github-repositories">


451| `version` | string | 可选。版本或版本范围(例如,`2.1.0`、`^2.0.0`、`~1.5.0`) |482| `version` | string | 可选。版本或版本范围(例如,`2.1.0`、`^2.0.0`、`~1.5.0`) |

452| `registry` | string | 可选。自定义 npm registry URL。默认为系统 npm registry(通常为 npmjs.org) |483| `registry` | string | 可选。自定义 npm registry URL。默认为系统 npm registry(通常为 npmjs.org) |

453 484 

485<h3 id="zip-archives">

486 Zip 存档

487</h3>

488 

489使用 `archive` 将 plugin 分发为 Claude Code 通过 HTTPS 下载的 zip 文件,这样安装在用户机器上无需 git 或 npm 即可工作。在任何静态文件服务器或工件存储库上托管文件,例如 S3 bucket、Artifactory 通用存储库或 nginx。需要 Claude Code v2.1.224 或更高版本。在 v2.1.120 到 v2.1.223 版本上,安装 plugin 失败并显示 `This plugin uses a source type your Claude Code version does not support. Update Claude Code and try again.`;在更早的版本上,包含 `archive` 条目的 marketplace 完全无法加载。

490 

491此条目从工件服务器上的 zip 文件安装 plugin:

492 

493```json theme={null}

494{

495 "name": "my-plugin",

496 "source": {

497 "source": "archive",

498 "url": "https://artifacts.example.com/claude-plugins/my-plugin-2.1.0.zip"

499 }

500}

501```

502 

503构建 zip 时,你可以直接 zip plugin 的内容或 zip plugin 文件夹本身。Claude Code 在存档的顶部查找 `.claude-plugin/`,然后在单个顶级文件夹内查找,所以两种布局都可以安装:

504 

505```text theme={null}

506my-plugin.zip my-plugin.zip

507├── .claude-plugin/ └── my-plugin/

508│ └── plugin.json ├── .claude-plugin/

509└── commands/ │ └── plugin.json

510 └── commands/

511```

512 

513Claude Code 不会查找超过一个文件夹的深度,所以嵌套更深的 plugin 无法安装。Claude Code 拒绝大于 256 MiB 的存档。

514 

515要固定精确文件,请添加 `sha256` 字段,其中包含存档的摘要:

516 

517```json theme={null}

518{

519 "name": "my-plugin",

520 "source": {

521 "source": "archive",

522 "url": "https://artifacts.example.com/claude-plugins/my-plugin-2.1.0.zip",

523 "sha256": "6bfa50e3d2e00c052b46abe51fff89346ac803e45771f76dcf6df1ab74cca5e1"

524 }

525}

526```

527 

528如果下载的文件与固定不匹配,Claude Code 拒绝安装并报告 [`Plugin archive integrity check failed`](/docs/zh-CN/errors#plugin-archive-integrity-check-failed)。

529 

530存档源接受这些字段:

531 

532| 字段 | 类型 | 描述 |

533| :------- | :----- | :------------------------------------------------------------------------------------------------------ |

534| `url` | string | 必需。zip 存档的 HTTPS URL。Claude Code 拒绝 `http://` URL,以及环回、链接本地和云元数据主机。每个重定向跳转必须满足相同的规则,否则 Claude Code 拒绝下载 |

535| `sha256` | string | 可选。存档的 SHA-256 摘要,为 64 个十六进制字符,大写或小写。Claude Code 验证每次下载并在不匹配时拒绝安装 |

536 

537`sha256` 摘要也用作 plugin 的版本,当 `plugin.json` 和 marketplace 条目都未声明版本时。见[版本管理](/docs/zh-CN/plugins-reference#version-management)。如果你声明 `version`,该版本字符串是更新信号,所以在更改 zip 及其摘要后,也要提升版本,否则用户保留缓存副本。

538 

539<h4 id="authenticate-archive-downloads">

540 验证存档下载

541</h4>

542 

543要验证存档下载,例如从私有 registry 下载,请设置 Claude Code 随之发送的 HTTP 标头。在你注册 marketplace 的 `url` 源上设置 `headers`,例如 [`extraKnownMarketplaces`](/docs/zh-CN/settings-reference#extraknownmarketplaces) 条目。在 Claude Code v2.1.238 或更高版本上,你可以在 plugin 的条目上设置它,在 `source` 旁边。

544 

545如果你要放在 `headers` 中的值是短期的,例如你的 registry 按需生成的令牌,请在同一位置设置 `headersHelper` 命令。Claude Code 运行命令并将其打印的 JSON 对象作为该位置的标头发送。需要 Claude Code v2.1.238 或更高版本。

546 

547你选择的位置决定了哪些下载获得标头以及 Claude Code 何时运行命令:

548 

549| 位置 | 获得标头的下载 | Claude Code 何时运行设置在那里的 `headersHelper` |

550| :------------------ | :---------------------------------------- | :------------------------------------------------------------------------------------ |

551| Marketplace `url` 源 | 在 marketplace URL 的源上的存档下载,意味着相同的方案、主机和端口 | 在每次获取 marketplace 的 `marketplace.json` 之前和在该源上的每次存档下载之前。Claude Code 将一次运行的输出重用最多 60 秒 |

552| Plugin 条目 | 仅该条目的下载 | 仅当用户自己安装或更新该单个 plugin 时,并[接受命令](#how-users-accept-a-headershelper-command) |

553 

554当两个位置都设置相同名称的标头时,Claude Code 发送条目的值。在一个位置内,命令打印的标头覆盖相同名称的列出的标头。

555 

556<h5 id="add-a-headershelper-to-a-plugin-entry">

557 向 plugin 条目添加 headersHelper

558</h5>

559 

560此条目在 `source` 旁边设置 `headersHelper`。它还设置 `"strict": false`,这是 Claude Code 对设置 `headersHelper` 的 `marketplace.json` 条目所需的。使用 [`"strict": false`](#strict-mode),marketplace 条目是 plugin 的完整定义,所以用户可以在接受命令之前查看 plugin 包含的内容:

561 

562```json theme={null}

563{

564 "name": "my-plugin",

565 "description": "Formatting commands for internal services",

566 "strict": false,

567 "commands": "./commands",

568 "source": {

569 "source": "archive",

570 "url": "https://registry.example.com/plugins/my-plugin-2.1.0.zip"

571 },

572 "headersHelper": "/opt/bin/mint-registry-token.sh"

573}

574```

575 

576要检查条目,运行 `claude plugin install my-plugin@your-marketplace`。Claude Code 显示你命令和存档 URL,并在你接受后下载 zip。

577 

578在 v2.1.238 之前,Claude Code 下载条目的存档时不带其 `headers` 或 `headersHelper`,所以依赖它们的安装失败并显示 `HTTP 401 while downloading plugin archive from`,后跟 URL,registry 的状态代码代替 401。

579 

580<h4 id="write-the-headershelper-command">

581 编写 headersHelper 命令

582</h4>

583 

584无论你在 marketplace 的 `url` 源还是在 plugin 条目上设置 `headersHelper`,编写命令以满足这些要求:

585 

586* **命令文本**:最多 500 个可打印 ASCII 字符,没有四个或更多空格的运行。

587* **输出**:在 stdout 上打印一个标头名称和字符串值的 JSON 对象,然后在 10 秒内以 0 退出。

588* **Shell 和工作目录**:Claude Code 通过 `sh` 运行命令,或在 Windows 上通过 `cmd.exe`,从配置目录 `~/.claude` 或 [`CLAUDE_CONFIG_DIR`](/docs/zh-CN/env-vars#variables)。给出绝对路径或 `PATH` 上的命令,因为相对路径相对于该目录解析,而不是用户的项目。

589* **Claude Code 移除的变量**:从 `marketplace.json` 条目或项目的 `.claude/settings.json` 或 `.claude/settings.local.json` 中设置的命令的环境中,Claude Code 移除每个名称包含 `TOKEN`、`SECRET`、`KEY` 或 `AUTH` 等词的变量,包括 `ANTHROPIC_API_KEY`。Claude Code 不对用户设置、`--settings` 文件或托管设置中设置的命令应用此移除。

590* **Claude Code 设置的变量**:`CLAUDE_CODE_MARKETPLACE_URL` 和 `CLAUDE_CODE_MARKETPLACE_NAME` 用于 `url` 源的命令,以及 `CLAUDE_CODE_PLUGIN_NAME` 和 `CLAUDE_CODE_PLUGIN_ARCHIVE_URL` 用于条目的命令。`CLAUDE_CODE_MARKETPLACE_NAME` 在用户通过 URL 添加 marketplace 后的第一次获取时未设置,因为该获取是提供名称的。

591 

592生成持有者令牌的命令打印如下对象:

593 

594```json theme={null}

595{"Authorization": "Bearer eyJhbGciOiJSUzI1NiJ9"}

596```

597 

598<h4 id="when-claude-code-skips-a-headershelper-command-or-drops-its-output">

599 Claude Code 何时跳过 headersHelper 命令或丢弃其输出

600</h4>

601 

602Claude Code 不运行 `headersHelper` 命令,或在这些情况下丢弃来自 `headers` 或命令输出的标头:

603 

604* **命令失败**:如果命令以非零退出、运行超过 10 秒或打印除 JSON 字符串值对象之外的任何内容,Claude Code 不进行它运行命令的获取或下载。

605* **Marketplace URL 不以 `https://` 开头**:Claude Code 不运行该 `url` 源的命令,仅发送其 `headers` 字段中列出的标头。

606* **重定向离开源**:当下载被重定向离开存档 URL 的源时,Claude Code 丢弃 marketplace `url` 源和 plugin 条目的 `headers` 值和命令输出。

607* **条目设置路由或身份标头**:Claude Code 从条目的 `headers` 和命令输出中丢弃请求路由和客户端身份名称,例如 `Host`、`Cookie` 和 `X-Forwarded-*`,并保留身份验证名称,例如 `Authorization`。Claude Code 以这种方式过滤每个 `marketplace.json` 条目,以及[内联设置条目](/docs/zh-CN/settings-reference#extraknownmarketplaces)取决于哪个文件声明它。

608* **命令在 `--add-dir` 目录的设置中设置**:Claude Code 忽略它,在 `url` 源和[内联 plugin 条目](/docs/zh-CN/settings-reference#extraknownmarketplaces)上都一样,仅发送该文件的 `headers`。

609* **托管设置阻止命令**:将 [`disableCommandPluginSources`](/docs/zh-CN/settings-reference#disablecommandpluginsources) 设置为 `true` 阻止 `headersHelper` 命令,[`allowManagedHooksOnly`](/docs/zh-CN/settings-reference#allowmanagedhooksonly) 也阻止它们,除非 `disableCommandPluginSources` 明确为 `false`。在任一阻止下,Claude Code 仍然为托管设置本身声明的 marketplace 运行命令。

610 

611<h4 id="how-users-accept-a-headershelper-command">

612 用户如何接受 headersHelper 命令

613</h4>

614 

615用户每次从 plugin 的自己的视图在 `/plugin` 或使用 `claude plugin install` 或 `claude plugin update` 自己安装或更新该单个 plugin 时接受 plugin 条目的命令。Claude Code 显示命令和存档 URL,并仅在用户接受后运行命令。在非交互式 shell 中,传递 [`--yes`](/docs/zh-CN/plugins-reference#plugin-install) 以接受它。

616 

617Claude Code 仅运行它显示的命令,用于它显示的存档 URL。如果条目的命令或存档 URL 在此期间更改,Claude Code 拒绝安装或更新。仅查询字符串中的更改不计算。

618 

619<h5 id="installs-and-updates-that-refuse-the-command-instead-of-asking">

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

621</h5>

622 

623在任何其他操作上,而不是单个 plugin 安装或更新,Claude Code 既不运行条目的命令也不下载其存档,所以 plugin 保持其已安装版本或保持未安装。用户看到的取决于操作:

624 

625* **一次安装多个 plugins、从 plugin 建议或作为另一个 plugin 的依赖项**:Claude Code 拒绝具有命令的 plugin 并将用户指向该 plugin 在 `/plugin` 中的自己的视图。批量安装中的其他 plugins 仍然安装。依赖被拒绝 plugin 的 plugin 无法安装,直到用户自己安装被拒绝的 plugin。

626* **后台自动更新,或会话启动用于从未下载其存档的 plugin**:Claude Code 在 `/plugin` 错误选项卡中列出 plugin,以便用户知道手动安装或更新它。找到条目的自动更新仍然宣传已安装版本列表无。

627 

628<h5 id="when-a-marketplace-url-source’s-command-runs">

629 Marketplace `url` 源的命令何时运行

630</h5>

631 

632Marketplace `url` 源的 `headersHelper` 在设置文件中声明,例如 [`extraKnownMarketplaces`](/docs/zh-CN/settings-reference#extraknownmarketplaces) 条目,而不是在 marketplace 发布的目录中,所以 Claude Code 不会在每次安装或更新时要求用户接受它。声明它的设置文件决定了 Claude Code 何时运行它:

633 

634| 设置文件 | Claude Code 何时运行命令 |

635| :---------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------- |

636| 用户设置、`--settings` 文件或机器上的托管设置文件 | 无需询问,包括在后台 marketplace 刷新期间 |

637| 项目的 `.claude/settings.json` 或 `.claude/settings.local.json` | 仅在用户接受该文件夹本身的[工作区信任对话框](/docs/zh-CN/permissions#what-runs-before-you-trust-a-folder)后。`-p` 或 SDK 会话不计为接受它,父文件夹的信任也不计 |

638| 服务器托管设置 | 仅在用户在[安全批准对话框](/docs/zh-CN/server-managed-settings#security-approval-dialogs)中批准交付的设置后 |

639 

640在 `-p` 或 SDK 会话中,Claude Code 无法显示安全批准对话框。它应用其他交付的设置,但 marketplace 获取和任何需要命令的存档下载失败,直到用户在交互式会话中批准。

641 

642对于这些文件之一中的[内联 plugin 条目](/docs/zh-CN/settings-reference#extraknownmarketplaces),Claude Code 要求与该文件中 marketplace 级别命令相同的文件夹信任或设置批准,用户也在每次安装或更新时接受条目的命令。

643 

644<h3 id="command-sources">

645 Command 源

646</h3>

647 

648当本地安装的工具生成 plugin 目录时使用 `command`,例如为当前选定的工具链呈现其 plugin 的 IDE。Claude Code 在用户安装 plugin 时运行命令,并在后台每个会话重新运行一次,所以你的用户无需重新安装即可获取工具的更改输出。需要 Claude Code v2.1.229 或更高版本。在 v2.1.120 到 v2.1.228 上,安装 plugin 失败并显示 `This plugin uses a source type your Claude Code version does not support. Update Claude Code and try again.`,在更早的版本上整个 marketplace 无法加载。

649 

650此条目从工具打印的任何目录安装 plugin:

651 

652```json theme={null}

653{

654 "name": "my-plugin",

655 "source": {

656 "source": "command",

657 "command": "my-tool claude-plugin-path"

658 }

659}

660```

661 

662Claude Code 通过平台 shell 运行命令,macOS 和 Linux 上的 `sh` 或 Windows 上的 `cmd.exe`,从用户的主目录。命令必须在 stdout 上打印恰好一行并以代码 0 退出。该行是包含完整 plugin 的目录的绝对路径,在命令退出时,路径可能在运行之间更改。

663 

664Claude Code 停止运行超过 `timeout` 秒的命令,安装或更新失败。Claude Code 也在这些情况下拒绝打印的路径,安装或更新以相同方式失败:

665 

666* 目录在其顶级没有 plugin 内容,例如 `.claude-plugin/` 目录或 `skills/`、`commands/`、`agents/` 或 `hooks/` 目录

667* 目录是 Claude Code 启动的目录,或其父目录之一

668* 在 Windows 上,路径是 UNC 路径

669 

670Command 源接受这些字段:

671 

672| 字段 | 类型 | 描述 |

673| :-------- | :----- | :---------------------------------------------------------------------------------------------------------- |

674| `command` | string | 必需。Shell 命令,在 stdout 上打印 plugin 目录的绝对路径作为单行并以 0 退出。必须是可打印 ASCII,最多 500 字符,没有四个或更多空格的运行,所以用户可以查看他们被要求接受的整个命令 |

675| `timeout` | number | 可选。等待命令的整数秒数,然后放弃(默认:60,最大:600) |

676| `mode` | string | 可选。`"copy"`(默认)将打印的目录复制到 plugin 缓存中。`"link"` 就地使用打印的目录。见[复制模式和链接模式](#copy-mode-and-link-mode) |

677 

678<h4 id="copy-mode-and-link-mode">

679 复制模式和链接模式

680</h4>

681 

682使用默认的 `"mode": "copy"`,Claude Code 将打印的目录复制到版本化 plugin 缓存中,并从目录内容的哈希派生[plugin 版本](/docs/zh-CN/plugins-reference#version-management)。你的工具可以在命令退出后删除或重写目录,产生相同内容的重新运行计为最新。Claude Code 拒绝安装大于 256 MiB 或包含超过 20,000 个条目的目录。

683 

684为大型 plugin 目录设置 `"mode": "link"`,不应复制,例如呈现的 SDK 导出。Claude Code 用打印目录的每个顶级条目的链接填充 plugin 的缓存条目,并就地使用文件,所以没有复制、文件内容未哈希,大小限制不适用。如果顶级条目是指向打印目录外的符号链接,安装失败。Claude Code 也跳过链接模式 plugin 的[Node.js 包依赖项安装](/docs/zh-CN/plugins-reference#node-js-package-dependencies),所以打印已包含 plugin 需要的任何 `node_modules` 的目录。

685 

686保持打印的目录就位,只要 plugin 保持安装,因为 Claude Code 在每次启动时通过这些链接加载 plugin。Claude Code 从打印目录的真实路径及其顶级条目派生[plugin 版本](/docs/zh-CN/plugins-reference#version-management),而不是文件内部,所以打印不同的路径以表示新内容。在打印目录中或其下方启动的会话中,Claude Code 根本不加载 plugin。

687 

688Claude Code 不支持 Windows 上的链接模式,拒绝在那里安装链接模式 plugin。改为声明 `"mode": "copy"`。

689 

690<h4 id="how-users-accept-the-command">

691 用户如何接受命令

692</h4>

693 

694Claude Code 在用户的机器上运行你的命令,所以它将每次运行绑定到用户的明确接受:

695 

696* 当用户从 `/plugin` 中的 plugin 详情屏幕安装 plugin,或在交互式终端中使用 `claude plugin install` 或 `claude plugin update` 安装或更新它时,Claude Code 首先向他们显示确切的命令字符串,并为该安装记录接受的命令。可以在接受相同命令的记录接受上进行的 `claude plugin update` 显示无。在非交互式 shell 中,例如配置脚本,传递 `--yes` 到 `claude plugin install` 或 `claude plugin update` 以接受它打印的命令。

697* 每条其他路径仅运行用户已接受的命令。这包括从 `/plugin` 启动的更新和[何时 Claude Code 重新运行命令](#when-claude-code-re-runs-the-command)中描述的后台运行。当未接受任何内容时,Claude Code 拒绝运行命令并告诉用户如何查看它。Claude Code 从不将 command 源 plugin 安装为另一个 plugin 的依赖项,所以用户自己先安装它。

698* 如果你更改条目的 `command` 或切换其 `mode`,用户保留他们已有的版本,Claude Code 停止重新运行命令。在交互式会话中,`/plugin` 错误选项卡显示新命令,直到用户通过运行 `claude plugin update <plugin>@<marketplace>` 查看并接受它。

699 

700管理员可以使用托管设置 [`disableCommandPluginSources`](/docs/zh-CN/settings-reference#disablecommandpluginsources) 在整个组织中阻止 command 源。如果组织设置 [`allowManagedHooksOnly`](/docs/zh-CN/settings-reference#allowmanagedhooksonly),Claude Code 默认阻止 command 源。

701 

702<h4 id="when-claude-code-re-runs-the-command">

703 Claude Code 何时重新运行命令

704</h4>

705 

706打印的目录反映工具在命令运行时的状态,所以 Claude Code 在这些时间重新运行命令:

707 

708* 每次用户安装或更新 plugin 时

709* 每个会话一次用于每个启用的 command 源 plugin,在后台,会话启动后不久。此运行不通过 marketplace 自动更新,所以它不依赖 marketplace 的[自动更新设置](/docs/zh-CN/discover-plugins#configure-auto-updates)

710* 在启动或 `/reload-plugins` 时,当启用的 plugin 的已安装版本从 plugin 缓存中丢失时

711 

712当用户设置 [`CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC`](/docs/zh-CN/env-vars) 时,Claude Code 跳过两个后台运行。显式安装和更新仍然使用该变量集运行命令。

713 

714当命令的哈希输出已更改时,Claude Code 将结果安装为新版本并在运行的交互式会话中重新加载它,切换[`/reload-plugins` 切换的相同组件](/docs/zh-CN/plugins-reference#environment-variables)。用户看到 plugin 已重新加载的通知。如果就地重新加载会使会话的提示缓存失效,Claude Code 改为提示用户运行 `/reload-plugins`,它[警告缓存成本并在使用 `--force` 重新运行时应用](/docs/zh-CN/prompt-caching#enabling-or-disabling-a-plugin)。

715 

454<h3 id="advanced-plugin-entries">716<h3 id="advanced-plugin-entries">

455 高级 plugin 条目717 高级 plugin 条目

456</h3>718</h3>


506 768 

507需要注意的关键事项:769需要注意的关键事项:

508 770 

509* **`commands` 和 `agents`**:你可以指定多个目录或单个文件。路径相对于 plugin 根目录。771* **`commands` 和 `agents`**:你可以指定多个目录或单个文件。路径相对于 plugin 根目录,必须保持在其内部。

510* **`${CLAUDE_PLUGIN_ROOT}`**:在 hooks 和 MCP server 配置中使用此变量来引用 plugin 安装目录中的文件。这是必要的,因为 plugins 在安装时被复制到缓存位置。772 * Claude Code 拒绝解析到 plugin 目录外的路径,例如 `./../shared.md`,带有 [`path escapes plugin directory`](/docs/zh-CN/errors#path-escapes-plugin-directory) 错误,仍然加载 plugin 而不带该组件

773* **`${CLAUDE_PLUGIN_ROOT}`**:在 hook 命令和 MCP server 配置中使用此变量来引用 plugin 安装目录中的文件。

511 * 查看[替换表](/docs/zh-CN/plugins-reference#environment-variables)了解每个服务器类型在哪些配置字段中替换它774 * 查看[替换表](/docs/zh-CN/plugins-reference#environment-variables)了解每个服务器类型在哪些配置字段中替换它

512 * 对于应该在 plugin 更新后保留的依赖项或状态,请改用 [`${CLAUDE_PLUGIN_DATA}`](/docs/zh-CN/plugins-reference#persistent-data-directory)775 * 对于应该在 plugin 更新后保留的依赖项或状态,请改用 [`${CLAUDE_PLUGIN_DATA}`](/docs/zh-CN/plugins-reference#persistent-data-directory)

513* **`strict: false`**:由于这设置为 false,plugin 不需要自己的 `plugin.json`。marketplace 条目定义了一切。见下面的 [Strict 模式](#strict-mode)。776* **`strict: false`**:由于这设置为 false,plugin 不需要自己的 `plugin.json`。marketplace 条目定义了一切。见下面的 [Strict 模式](#strict-mode)。


573 私有存储库836 私有存储库

574</h3>837</h3>

575 838 

576Claude Code 支持从私有存储库安装 plugins。对于手动安装和更新,Claude Code 使用你现有的 git 凭证助手,所以通过 `gh auth login`、macOS Keychain 或 `git-credential-store` 的 HTTPS 访问工作方式与你的终端中相同。SSH 访问工作,只要主机已经在你的 `known_hosts` 文件中,并且密钥已加载到 `ssh-agent` 中,因为 Claude Code 会抑制主机指纹和密钥密码的交互式 SSH 提示。GitHub `owner/repo` 简写源默认通过 SSH 克隆;设置 [`CLAUDE_CODE_PLUGIN_PREFER_HTTPS=1`](/docs/zh-CN/env-vars#variables) 以改为通过 HTTPS 克隆它们。839Claude Code 支持从私有存储库安装 plugins。如果你通过[**组织设置 > Plugins**](https://claude.ai/admin-settings/plugins)分发你的 marketplace,你的 git 凭证不涉及:组织同步通过 Claude GitHub App 或你的组织的 GitHub Enterprise App 读取 marketplace 存储库,plugin 源如果无法进行身份验证必须是公开的。有关完整规则,请参阅[通过组织设置分发](#distribute-through-organization-settings)。

840 

841<h4 id="commands-you-run">

842 你运行的命令

843</h4>

577 844 

578后台自动更新的工作方式不同。默认情况下,后台刷新会为其 `git pull` 禁用 git 凭证助手,所以即使配置了助手,pull 也无法对 HTTPS 上的私有存储库进行身份验证。SSH 远程不受影响:加载到 `ssh-agent` 中的密钥以与手动操作相同的方式对后台 pulls 进行身份验证。当后台 pull 失败时,Claude Code 会回退到从头重新克隆 marketplace。重新克隆确实使用你存储的 git 凭证,但它可能在大型存储库上[超时](#git-operations-time-out),所以私有 marketplace 自动更新可能会间歇性失败。845当你运行 `/plugin marketplace add`、`/plugin install`、`/plugin update` 或 `/plugin marketplace update` 时,Claude Code 使用你现有的 git 凭证助手,所以通过 `gh auth login`、macOS Keychain 或 `git-credential-store` 的 HTTPS 访问工作方式与你的终端中相同。SSH 访问工作,只要主机已经在你的 `known_hosts` 文件中,并且密钥已加载到 `ssh-agent` 中,因为 Claude Code 会抑制主机指纹和密钥密码的交互式 SSH 提示。GitHub `owner/repo` 简写源默认通过 SSH 克隆;设置 [`CLAUDE_CODE_PLUGIN_PREFER_HTTPS=1`](/docs/zh-CN/env-vars#variables) 以改为通过 HTTPS 克隆它们。

846 

847<h4 id="background-auto-updates">

848 后台自动更新

849</h4>

850 

851默认情况下,后台刷新会为其 `git pull` 禁用 git 凭证助手,所以即使配置了助手,pull 也无法对 HTTPS 上的私有存储库进行身份验证。SSH 远程不受影响:加载到 `ssh-agent` 中的密钥以与你运行的命令相同的方式对后台 pulls 进行身份验证。当后台 pull 失败时,Claude Code 会回退到从头重新克隆 marketplace。重新克隆确实使用你存储的 git 凭证,但它可能在大型存储库上[超时](#git-operations-time-out),所以私有 marketplace 自动更新可能会间歇性失败。

579 852 

580两个设置使私有 marketplaces 的行为可预测:853两个设置使私有 marketplaces 的行为可预测:

581 854 


606 在 CI/CD 环境中,在从私有存储库安装 plugins 之前配置 git 凭证助手。在 GitHub Actions 上,导出对 marketplace 存储库具有读取访问权限的令牌作为 `GH_TOKEN`,然后运行 `gh auth setup-git`。默认工作流令牌只能访问工作流自己的存储库,所以另一个存储库中的私有 marketplace 需要个人访问令牌或应用令牌。在管道中配置的全局 URL 重写也直接对后台 pull 进行身份验证。879 在 CI/CD 环境中,在从私有存储库安装 plugins 之前配置 git 凭证助手。在 GitHub Actions 上,导出对 marketplace 存储库具有读取访问权限的令牌作为 `GH_TOKEN`,然后运行 `gh auth setup-git`。默认工作流令牌只能访问工作流自己的存储库,所以另一个存储库中的私有 marketplace 需要个人访问令牌或应用令牌。在管道中配置的全局 URL 重写也直接对后台 pull 进行身份验证。

607</Note>880</Note>

608 881 

609<h3 id="test-locally-before-distribution">882<h3 id="distribute-through-organization-settings">

610 在分发前本地测试883 通过组织设置分发

611</h3>884</h3>

612 885 

613在共享前本地测试你的 marketplace:886如果你在 Team 或 Enterprise 计划上通过[**组织设置 > Plugins**](https://claude.ai/admin-settings/plugins)分发 plugins,这些源规则适用:

614 887 

615```shell theme={null}888* marketplace 存储库必须是私有或内部的。组织同步通过 Claude GitHub App 或你的组织的 GitHub Enterprise App 读取它。

616/plugin marketplace add ./my-marketplace889* 每个 plugin 源必须是 `github`、`url` 或 `git-subdir` 类型,或[相对路径](#relative-paths),以 `./` 开头。如果你在 `metadata.pluginRoot` 下按裸名称列出 plugin,组织同步会将其拒绝为不支持的源,所以写出路径,例如 `./plugins/deploy-tools`。

617/plugin install quality-review-plugin@my-plugins890* plugin 源可以在两种情况下是私有的:

891 * 与 marketplace 存储库的所有者共享的 github.com 源

892 * 在你的组织的 GitHub Enterprise 主机上安装了 GHE App 的源

893* 组织同步在没有凭证的情况下获取所有其他源,所以不同所有者下的 github.com 存储库和其他主机上的存储库(例如 GitLab 或 Bitbucket)必须是公开的。

894 

895有关管理员工作流,请参阅[为你的组织管理 plugins](https://support.claude.com/en/articles/13837433)。

896 

897要包含私有 plugins,请将 plugin 文件夹放在 marketplace 存储库内,并使用[相对路径](#relative-paths)引用它们。组织同步在分发期间打包每个 plugin,所以用户永远不需要访问单独的源存储库。

898 

899例如,这个 `marketplace.json` plugin 条目引用你在 marketplace 存储库中的 `plugins/deploy-tools` 处提交的 plugin:

900 

901```json theme={null}

902{

903 "name": "deploy-tools",

904 "source": "./plugins/deploy-tools"

905}

618```906```

619 907 

620有关完整的添加命令范围(GitHub、Git URL、本地路径、远程 URL),请参阅[添加 marketplaces](/docs/zh-CN/discover-plugins#add-marketplaces)。908<h4 id="keep-executables-out-of-the-top-level-bin-directory">

909 将可执行文件保留在顶级 bin 目录之外

910</h4>

911 

912不要在你通过组织设置分发的任何 plugin 中包含顶级 `bin/` 目录。claude.ai 拒绝具有该目录的 plugin,无论 plugin 是通过 marketplace 同步还是直接上传到达:

913 

914* **Marketplace 同步**:组织同步拒绝该 plugin 并同步 marketplace 的其余部分。错误消息以 `Plugin contains a top-level bin/ directory` 开头。

915* **直接上传**:如果你改为在[**组织设置 > Plugins**](https://claude.ai/admin-settings/plugins)中上传 plugin,claude.ai 会以相同的消息拒绝上传。

916 

917将可执行文件保留在另一个目录中,例如 `scripts/`,并从你的[skills、hooks 或 MCP server 配置](/docs/zh-CN/plugins-reference#environment-variables)中将它们引用为 `${CLAUDE_PLUGIN_ROOT}/scripts/<name>`。

621 918 

622<h3 id="require-marketplaces-for-your-team">919<h3 id="require-marketplaces-for-your-team">

623 为你的团队要求 marketplaces920 为你的团队要求 marketplaces

624</h3>921</h3>

625 922 

626你可以配置你的存储库,以便当团队成员信任项目文件夹时,他们会自动被提示安装你的 marketplace。将你的 marketplace 添加到 `.claude/settings.json`:923你可以配置你的存储库,以便当团队成员[信任项目文件夹](/docs/zh-CN/permissions#what-runs-before-you-trust-a-folder)时,Claude Code 会为他们添加你的 marketplace,无需单独的提示。将你的 marketplace 添加到 `.claude/settings.json`:

627 924 

628```json theme={null}925```json theme={null}

629{926{


649}946}

650```947```

651 948 

652有关完整的配置选项,请参阅 [Plugin 设置](/docs/zh-CN/settings#plugin-settings)。949有关完整的配置选项,请参阅 [Plugin 设置](/docs/zh-CN/settings-reference#plugin-settings)。

653 950 

654<Note>951<Note>

655 如果你使用带有相对路径的本地 `directory` 或 `file` 源,路径将相对于你的存储库的主检出解析。当你从 git worktree 运行 Claude Code 时,路径仍然指向主检出,所以所有 worktrees 共享相同的 marketplace 位置。Marketplace 状态存储一次每个用户在 `~/.claude/plugins/known_marketplaces.json` 中,而不是每个项目。952 如果你使用带有相对路径的本地 `directory` 或 `file` 源,路径将相对于你的存储库的主检出解析。当你从 git worktree 运行 Claude Code 时,路径仍然指向主检出,所以所有 worktrees 共享相同的 marketplace 位置。Marketplace 状态存储一次每个用户在 `~/.claude/plugins/known_marketplaces.json` 中,而不是每个项目。


697 托管 marketplace 限制994 托管 marketplace 限制

698</h3>995</h3>

699 996 

700对于需要严格控制 plugin 源的组织,管理员可以使用托管设置中的 [`strictKnownMarketplaces`](/docs/zh-CN/settings#strictknownmarketplaces) 设置限制用户允许添加哪些 plugin marketplaces。要同时拒绝为单次运行 sideload plugins、agents 和 MCP servers 的 CLI 标志,请将其与 [`disableSideloadFlags`](/docs/zh-CN/settings#available-settings) 配对。要允许列表哪些 marketplaces 的 plugins 可以作为上下文安装建议出现,请设置 [`pluginSuggestionMarketplaces`](/docs/zh-CN/settings#available-settings)。997对于需要严格控制 plugin 源的组织,管理员可以使用托管设置中的 [`strictKnownMarketplaces`](/docs/zh-CN/settings-reference#strictknownmarketplaces) 设置限制用户允许添加哪些 plugin marketplaces。要同时拒绝为单次运行 sideload plugins、agents 和 MCP servers 的 CLI 标志,请将其与 [`disableSideloadFlags`](/docs/zh-CN/settings-reference#disablesideloadflags) 配对。要允许列表哪些 marketplaces 的 plugins 可以作为上下文安装建议出现,请设置 [`pluginSuggestionMarketplaces`](/docs/zh-CN/settings-reference#pluginsuggestionmarketplaces)。

998 

999`strictKnownMarketplaces` 匹配 plugin 来自的 marketplace,而不是其中的条目,所以用户仍然可以从允许的 marketplace 安装具有[`command` 源](#command-sources)的 plugin。要同时阻止 command 源,请设置 [`disableCommandPluginSources`](/docs/zh-CN/settings-reference#disablecommandpluginsources)。

701 1000 

702当在托管设置中配置 `strictKnownMarketplaces` 时,限制行为取决于值:1001当在托管设置中配置 `strictKnownMarketplaces` 时,限制行为取决于值:

703 1002 

704| 值 | 行为 |1003| 值 | 行为 |

705| -------- | ----------------------------- |1004| -------- | -------------------------------------------------- |

706| 未定义(默认) | 无限制。用户可以添加任何 marketplace |1005| 未定义(默认) | 无限制。用户可以添加任何 marketplace |

707| 空数组 `[]` | 完全锁定。用户无法添加任何新 marketplaces |1006| 空数组 `[]` | 完全锁定。阻止每个 marketplace 源,包括官方 Anthropic marketplace |

708| 源列表 | 用户只能添加与允许列表完全匹配的 marketplaces |1007| 源列表 | 允许列表强制执行。用户只能添加与条目匹配的 marketplaces |

709 1008 

710<h4 id="common-configurations">1009<h4 id="common-configurations">

711 常见配置1010 常见配置

712</h4>1011</h4>

713 1012 

714禁用所有 marketplace 添加:1013禁用所有 marketplace 添加,包括官方 Anthropic marketplace:

715 1014 

716```json theme={null}1015```json theme={null}

717{1016{


719}1018}

720```1019```

721 1020 

1021仅允许官方 Anthropic marketplace。单个存储库条目的匹配是精确的,所以此条目不涵盖同一存储库的 `ref` 或 `path` 变体:

1022 

1023```json theme={null}

1024{

1025 "strictKnownMarketplaces": [

1026 {

1027 "source": "github",

1028 "repo": "anthropics/claude-plugins-official"

1029 }

1030 ]

1031}

1032```

1033 

1034使用此条目,Claude Code 保持已注册的官方 marketplace 可用,在新机器上,在你首次以交互方式启动 Claude Code 时自动注册 marketplace。

1035 

1036自动注册不涵盖每台机器。它最常遗漏:

1037 

1038* 在机器首次交互启动之前运行的非交互环境。

1039* Claude Code 已在阻止 marketplace 的策略下以交互方式运行的机器,例如空数组锁定。Claude Code 记录被阻止的尝试,在策略更改后不重试。

1040 

1041在这些机器上,将 marketplace 添加到同一 `managed-settings.json` 中的 [`extraKnownMarketplaces`](/docs/zh-CN/settings-reference#extraknownmarketplaces),以便 Claude Code 自动注册它,或运行 `claude plugin marketplace add anthropics/claude-plugins-official`。

1042 

722仅允许特定 marketplaces:1043仅允许特定 marketplaces:

723 1044 

724```json theme={null}1045```json theme={null}


741}1062}

742```1063```

743 1064 

1065使用[所有者通配符](/docs/zh-CN/settings-reference#owner-wildcards)条目允许 GitHub 组织下的每个 marketplace 存储库。所有者通配符需要 Claude Code v2.1.223 或更高版本。

1066 

1067```json theme={null}

1068{

1069 "strictKnownMarketplaces": [

1070 {

1071 "source": "github",

1072 "repo": "acme-corp/*"

1073 }

1074 ]

1075}

1076```

1077 

744使用主机上的正则表达式模式匹配允许来自内部 git 服务器的所有 marketplaces。这是 [GitHub Enterprise Server](/docs/zh-CN/github-enterprise-server#plugin-marketplaces-on-ghes) 或自托管 GitLab 实例的推荐方法:1078使用主机上的正则表达式模式匹配允许来自内部 git 服务器的所有 marketplaces。这是 [GitHub Enterprise Server](/docs/zh-CN/github-enterprise-server#plugin-marketplaces-on-ghes) 或自托管 GitLab 实例的推荐方法:

745 1079 

746```json theme={null}1080```json theme={null}


770使用 `".*"` 作为 `pathPattern` 来允许任何文件系统路径,同时仍然使用 `hostPattern` 控制网络源。1104使用 `".*"` 作为 `pathPattern` 来允许任何文件系统路径,同时仍然使用 `hostPattern` 控制网络源。

771 1105 

772<Note>1106<Note>

773 `strictKnownMarketplaces` 限制用户可以添加的内容,但不会自行注册 marketplaces。要使允许的 marketplaces 自动可用而无需用户运行 `/plugin marketplace add`,请在同一 `managed-settings.json` 中将其与 [`extraKnownMarketplaces`](/docs/zh-CN/settings#extraknownmarketplaces) 配对。见[同时使用两者](/docs/zh-CN/settings#strictknownmarketplaces)。1107 `strictKnownMarketplaces` 限制用户可以添加的内容,但不会自行注册 marketplaces。要为用户自动注册允许的 marketplace,请在同一 `managed-settings.json` 中将其添加到 [`extraKnownMarketplaces`](/docs/zh-CN/settings-reference#extraknownmarketplaces)。

1108 

1109 官方 Anthropic marketplace 是唯一 Claude Code 自行注册的,仅当允许列表允许时。自动注册也遗漏一些机器,例如非交互环境和早期策略阻止它的机器。要覆盖这些机器,也将官方 marketplace 添加到 `extraKnownMarketplaces`。有关两个设置并排,请参阅 [`strictKnownMarketplaces` 参考](/docs/zh-CN/settings-reference#strictknownmarketplaces)。

774</Note>1110</Note>

775 1111 

776<h4 id="how-restrictions-work">1112<h4 id="how-restrictions-work">


779 1115 

780限制在任何网络或文件系统操作之前进行检查。检查在 marketplace 添加以及 plugin 安装、更新、刷新和自动更新时运行。如果 marketplace 在配置策略之前被添加,其源不再与允许列表匹配,Claude Code 会拒绝从中安装或更新 plugins。相同的强制执行也适用于 `blockedMarketplaces`。1116限制在任何网络或文件系统操作之前进行检查。检查在 marketplace 添加以及 plugin 安装、更新、刷新和自动更新时运行。如果 marketplace 在配置策略之前被添加,其源不再与允许列表匹配,Claude Code 会拒绝从中安装或更新 plugins。相同的强制执行也适用于 `blockedMarketplaces`。

781 1117 

782允许列表对大多数源类型使用精确匹配。要允许 marketplace,所有指定的字段必须完全匹配:1118要阻止 GitHub 所有者下的每个 marketplace 存储库,请在 `blockedMarketplaces` 条目中使用所有者通配符形式:`{ "source": "github", "repo": "untrusted-org/*" }`。需要 Claude Code v2.1.223 或更高版本。有关匹配规则(在阻止列表和允许列表之间不同),请参阅[所有者通配符](/docs/zh-CN/settings-reference#owner-wildcards)。

1119 

1120当用户添加 Claude Code [克隆而不是获取](/docs/zh-CN/discover-plugins#add-from-other-git-hosts)的 `https://` 存储库 URL(例如裸 `github.com` 或 `gitlab.com` 存储库 URL)时,Claude Code 也会根据 `blockedMarketplaces` 中的 `url` 条目检查它。如果条目命名相同的 URL,Claude Code 会阻止添加。在该比较中,Claude Code 忽略 `.git` 后缀和用户在 `#` 后附加的任何 ref。需要 Claude Code v2.1.232 或更高版本。在 v2.1.232 之前,Claude Code 仅针对它作为托管 `marketplace.json` 文件获取的 URL 匹配 `url` 条目。

783 1121 

784* 对于 GitHub 源:`repo` 是必需的,如果在允许列表中指定,`ref` 或 `path` 也必须匹配1122允许列表对大多数源类型使用精确匹配,除了所有者通配符 `github` 条目。要允许 marketplace,所有指定的字段必须匹配:

1123 

1124* 对于 GitHub 源:`repo` 是必需的,要么命名一个存储库,要么使用所有者通配符形式 `owner/*` 来覆盖该所有者下的每个存储库。有关通配符条目如何匹配(包括大小写规则),请参阅[所有者通配符](/docs/zh-CN/settings-reference#owner-wildcards)。对于单个存储库条目,`ref` 必须完全匹配或在 marketplace 源和允许列表条目中都不存在,相同的规则适用于 `path`

785* 对于 URL 源:完整 URL 必须完全匹配1125* 对于 URL 源:完整 URL 必须完全匹配

786* 对于 `hostPattern` 源:marketplace 主机与正则表达式模式匹配1126* 对于 `hostPattern` 源:marketplace 主机与正则表达式模式匹配

787* 对于 `pathPattern` 源:marketplace 的文件系统路径与正则表达式模式匹配1127* 对于 `pathPattern` 源:marketplace 的文件系统路径与正则表达式模式匹配

788 1128 

789精确匹配不规范化 URL:尾部斜杠、`.git` 后缀或 `ssh://` 与 `https://` 形式被视为不同的值。如果你的组织的 marketplace 可以通过多个 URL 形式克隆,优先使用 `hostPattern` 条目而不是字面 URL,以便所有形式都匹配。1129允许列表的精确匹配将仅因尾部斜杠、`.git` 后缀或 `ssh://` 和 `https://` 方案不同的 URL 视为不同的值。如果你的组织的 marketplace 可以通过多个 URL 形式克隆,优先使用 `hostPattern` 条目而不是字面 URL,以便 `https://`、`ssh://` 和 `user@host:path` 形式都匹配。

790 1130 

791因为 `strictKnownMarketplaces` 在[托管设置](/docs/zh-CN/settings#settings-files)中设置,个别用户和项目配置无法覆盖这些限制。1131因为 `strictKnownMarketplaces` 在[托管设置](/docs/zh-CN/managed-settings)中设置,个别用户和项目配置无法覆盖这些限制。

792 1132 

793有关完整的配置详细信息,包括所有支持的源类型和与 `extraKnownMarketplaces` 的比较,请参阅 [strictKnownMarketplaces 参考](/docs/zh-CN/settings#strictknownmarketplaces)。1133有关完整的配置详细信息,包括所有支持的源类型和与 `extraKnownMarketplaces` 的比较,请参阅 [strictKnownMarketplaces 参考](/docs/zh-CN/settings-reference#strictknownmarketplaces)。

794 1134 

795<h3 id="version-resolution-and-release-channels">1135<h3 id="version-resolution-and-release-channels">

796 版本解析和发布渠道1136 版本解析和发布渠道

797</h3>1137</h3>

798 1138 

799Plugin 版本确定缓存路径和更新检测:如果解析的版本与用户已有的版本匹配,`/plugin update` 和自动更新会跳过该 plugin。1139Plugin 版本确定缓存路径和更新检测:如果解析的版本与用户已有的版本匹配,`/plugin update` 和自动更新会跳过该 plugin。对于 git 源,如果你省略 `version`,Claude Code 使用源的解析提交 SHA,所以用户在该提交更改时获得更新;这是内部或积极开发的 plugins 的最简单设置。有关完整的解析顺序(包括 `archive` 源),请参阅[版本管理](/docs/zh-CN/plugins-reference#version-management)。

800 

801Claude Code 从以下第一个设置的内容解析 plugin 的版本:

802 

8031. plugin 的 `plugin.json` 中的 `version`

8042. plugin 的 marketplace 条目中的 `version`

8053. plugin 源的 git 提交 SHA

806 

807对于 git 源类型 `github`、`url`、`git-subdir` 和 git 托管 marketplace 内的相对路径,你可以完全省略 `version`,每个新提交都被视为新版本。这是内部或积极开发的 plugins 的最简单设置。

808 1140 

809<Warning>1141<Warning>

810 设置 `version` 会固定 plugin。如果 `plugin.json` 声明 `"version": "1.0.0"`,推送新提交而不改变该字符串对现有用户没有任何作用,因为 Claude Code 看到相同的版本并保留缓存副本。在每个发布时提升该字段,或省略它以使用提交 SHA。1142 设置 `version` 为除了 [`command`](#command-sources) 之外的每个源类型固定 plugin,其版本始终包括命令生成内容的哈希。如果你在 `plugin.json` 中声明 `"version": "1.0.0"` 并推送新提交而不改变该字符串,这些源的现有用户保留缓存副本,因为 Claude Code 看到相同的版本。在每个发布时提升该字段,或省略它以回退到解析的版本。

811 1143 

812 避免在 `plugin.json` 和 marketplace 条目中都设置 `version`。Claude Code 总是无声地使用 `plugin.json` 值,所以陈旧的 manifest 版本可能会掩盖你在 `marketplace.json` 中设置的版本。1144 避免在 `plugin.json` 和 marketplace 条目中都设置 `version`。Claude Code 总是无声地使用 `plugin.json` 值,所以陈旧的 manifest 版本可能会掩盖你在 `marketplace.json` 中设置的版本。

813</Warning>1145</Warning>


816 设置发布渠道1148 设置发布渠道

817</h4>1149</h4>

818 1150 

819要为你的 plugins 支持"稳定"和"最新"发布渠道,你可以设置两个指向同一 repo 的不同 refs 或 SHAs 的 marketplaces。然后,你可以通过[托管设置](/docs/zh-CN/settings#settings-files)将两个 marketplaces 分配给不同的用户组。1151要为你的 plugins 支持"稳定"和"最新"发布渠道,你可以设置两个指向同一 repo 的不同 refs 或 SHAs 的 marketplaces。然后你可以通过托管设置以两种方式之一将每个用户组分配给其自己的 marketplace:

1152 

1153* 部署单独的[端点管理设置](/docs/zh-CN/managed-settings#delivery-mechanisms)(例如托管设置文件或 MDM 配置文件)到每个组的设备。[Claude Code 如何组合托管源](/docs/zh-CN/managed-settings#precedence-within-the-managed-tier)说明每个组的文件或配置文件是否适用于也有组织范围源的设备。

1154* 为每个组定义一个 [Claude apps gateway 策略](/docs/zh-CN/claude-apps-gateway-config#managed)。网关应用第一个匹配规则适合用户的策略,所以对策略进行排序,以便每个用户到达其组的策略。组策略的 `extraKnownMarketplaces` 替换全局策略的映射而不是与其合并,所以在组的策略中列出组需要的每个 marketplace,而不仅仅是其渠道 marketplace。

1155 

1156来自管理控制台的服务器管理设置[适用于你的组织中的每个用户](/docs/zh-CN/server-managed-settings#current-limitations),所以它们无法进行每个组的分配。

820 1157 

821<Warning>1158<Warning>

822 每个渠道必须解析为不同的版本。如果你使用显式版本,`plugin.json` 必须在每个固定的 ref 处声明不同的 `version`。如果你省略 `version`,不同的提交 SHA 已经区分了渠道。如果两个 refs 解析为相同的版本字符串,Claude Code 会将它们视为相同并跳过更新。1159 每个渠道必须解析为不同的版本。如果你使用显式版本,`plugin.json` 必须在每个固定的 ref 处声明不同的 `version`。如果你省略 `version`,不同的提交 SHA 已经区分了渠道。如果两个 refs 解析为相同的版本字符串,Claude Code 会将它们视为相同并跳过更新。


862 将渠道分配给用户组1199 将渠道分配给用户组

863</h5>1200</h5>

864 1201 

865通过托管设置将每个 marketplace 分配给适当的用户组。例如,稳定组接收:1202通过上述[设置发布渠道](#set-up-release-channels)中描述的每个组端点管理设置或网关策略将每个 marketplace 分配给其用户组。例如,稳定组接收:

866 1203 

867```json theme={null}1204```json theme={null}

868{1205{


940 验证和测试1277 验证和测试

941</h2>1278</h2>

942 1279 

943在共享前测试你的 marketplace。1280在共享前测试你的 marketplace。验证检查文件结构;要测试 plugin 是否改变了 Claude 在实际提示上的行为,请在发布新版本前使用 [`claude plugin eval`](/docs/zh-CN/plugin-evals) 运行其 eval 套件。

944 1281 

945验证你的 marketplace JSON 语法:1282从你的 marketplace 目录验证 JSON 语法:

946 1283 

947```bash theme={null}1284```bash theme={null}

948claude plugin validate .1285claude plugin validate .


966/plugin install test-plugin@marketplace-name1303/plugin install test-plugin@marketplace-name

967```1304```

968 1305 

969有关完整的 plugin 测试工作流,请参阅[本地测试你的 plugins](/docs/zh-CN/plugins#test-your-plugins-locally)。有关技术故障排除,请参阅 [Plugins 参考](/docs/zh-CN/plugins-reference)。1306有关完整的 plugin 测试工作流,请参阅[本地测试你的 plugins](/docs/zh-CN/plugins#test-your-plugins-locally)。有关技术故障排除,请参阅[Plugins 参考](/docs/zh-CN/plugins-reference)。

970 1307 

971<h2 id="manage-marketplaces-from-the-cli">1308<h2 id="manage-marketplaces-from-the-cli">

972 从 CLI 管理 marketplaces1309 从 CLI 管理 marketplaces


1055| :------- | :------- |1392| :------- | :------- |

1056| `--json` | 输出为 JSON |1393| `--json` | 输出为 JSON |

1057 1394 

1058使用 `--json`,每个条目包括 `name`、`source` 和源特定字段:GitHub 源的 `repo`、git 和 URL 源的 `url`,以及本地源的 `path`。当 marketplace 使用固定分支或标签添加时,GitHub 和 git 源也包括 `ref` 字段。1395使用 `--json`,每个条目包括 `name`、`source`、一个包含 marketplace 存储的本地缓存路径的 `installLocation` 字段,以及源特定字段:GitHub 源的 `repo`、git 和 URL 源的 `url`,以及本地源的 `path`。当 marketplace 使用固定分支或标签添加时,GitHub 和 git 源也包括 `ref` 字段。

1059 1396 

1060<h3 id="plugin-marketplace-remove">1397<h3 id="plugin-marketplace-remove">

1061 Plugin marketplace remove1398 Plugin marketplace remove


1111 1448 

1112* 验证 marketplace URL 是否可访问1449* 验证 marketplace URL 是否可访问

1113* 检查 `.claude-plugin/marketplace.json` 是否存在于指定路径1450* 检查 `.claude-plugin/marketplace.json` 是否存在于指定路径

1114* 使用 `claude plugin validate` 或 `/plugin validate` 确保 JSON 语法有效。要检查 skill、agent 和 command frontmatter,请针对每个 plugin 目录运行该命令1451* 使用 `claude plugin validate .` 或 `/plugin validate .` 确保 JSON 语法有效。要检查 skill、agent 和 command frontmatter,请参阅[验证没有 manifest 的 plugin 或目录](#validate-a-plugin-or-a-directory-without-a-manifest)

1115* 对于私有存储库,确认你有访问权限1452* 对于私有存储库,确认你有访问权限

1116 1453 

1117<h3 id="marketplace-validation-errors">1454<h3 id="marketplace-validation-errors">


1128 1465 

1129早期版本跳过 marketplace 根目录中的 plugins,仅从 `.claude-plugin/marketplace.json` 开始下降。1466早期版本跳过 marketplace 根目录中的 plugins,仅从 `.claude-plugin/marketplace.json` 开始下降。

1130 1467 

1131要验证单个 plugin 的 `plugin.json` 及其 skill、agent、command 和 hook 文件,请针对 plugin 目录本身运行该命令,例如 `claude plugin validate ./plugins/my-plugin`。常见错误:1468从 marketplace 目录,Claude Code 不会打开 plugins 的 skill、agent、command 或 hook 文件。要查找这些文件中的错误,请参阅[验证没有 manifest 的 plugin 或目录](#validate-a-plugin-or-a-directory-without-a-manifest)。下表列出了从 marketplace 目录中最常见的错误,以及每个错误的原因和修复方法:

1132 1469 

1133| 错误 | 原因 | 解决方案 |1470| 错误 | 原因 | 解决方案 |

1134| :------------------------------------------------ | :--------------------------------- | :-------------------------------------------------------------------- |1471| :------------------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------- |

1135| `File not found: .claude-plugin/marketplace.json` | 缺少 manifest | 使用必需字段创建 `.claude-plugin/marketplace.json` |1472| `No manifest found in directory. Expected .claude-plugin/marketplace.json or .claude-plugin/plugin.json` | 你命名的目录没有 `.claude-plugin/marketplace.json` 或 `plugin.json`,也没有 skill、agent 或 command 文件可检查 | 从 marketplace 根目录运行,或使用必需字段创建 `.claude-plugin/marketplace.json` |

1136| `Invalid JSON syntax: Unexpected token...` | marketplace.json 中的 JSON 语法错误 | 检查缺少的逗号、多余的逗号或未引用的字符串 |1473| `Invalid JSON syntax: Unexpected token...` | marketplace.json 中的 JSON 语法错误 | 检查缺少的逗号、多余的逗号或未引用的字符串 |

1137| `Duplicate plugin name "x" found in marketplace` | 两个 plugins 共享相同的名称 | 给每个 plugin 一个唯一的 `name` 值 |1474| `Duplicate plugin name "x" found in marketplace` | 两个 plugins 共享相同的名称 | 给每个 plugin 一个唯一的 `name` 值 |

1138| `plugins[0].source: Path contains ".."` | 源路径包含 `..` | 使用相对于 marketplace 根目录的路径,不包含 `..`。见[相对路径](#relative-paths) |1475| `plugins[0].source: Path contains ".."` | 源路径包含 `..` | 使用相对于 marketplace 根目录的路径,不包含 `..`。见[相对路径](#relative-paths) |

1139| `YAML frontmatter failed to parse: ...` | skill、agent 或 command 文件中的 YAML 无效 | 修复 frontmatter 块中的 YAML 语法。在运行时,此文件加载时不带元数据。仅在验证 plugin 目录时报告 |1476| `Marketplace name cannot contain control or bidirectional-formatting characters` | marketplace `name` 包含 Unicode 双向格式化字符或控制字符,如转义或换行符 | 从名称中删除该字符。在 v2.1.247 之前,这些字符产生 `Marketplace name impersonates an official Anthropic/Claude marketplace` 错误 |

1140| `Invalid JSON syntax: ...`(hooks.json) | 格式错误的 `hooks/hooks.json` | 修复 JSON 语法。格式错误的 `hooks/hooks.json` 会阻止整个 plugin 加载。仅在验证 plugin 目录时报告 |1477| `Plugin name cannot contain control or bidirectional-formatting characters` | plugin `name` 包含 Unicode 双向格式化字符或控制字符,如转义或换行符 | 从名称中删除该字符。在 v2.1.247 之前,Claude Code 没有运行此检查 |

1141 1478 

1142**警告**(非阻止):1479**警告**(非阻止):

1143 1480 

1144* `Marketplace has no plugins defined`:将至少一个 plugin 添加到 `plugins` 数组1481* `Marketplace has no plugins defined`:将至少一个 plugin 添加到 `plugins` 数组

1145* `No marketplace description provided`:添加顶级 `description` 以帮助用户理解你的 marketplace1482* `No marketplace description provided`:添加顶级 `description` 以帮助用户理解你的 marketplace

1146* `Plugin name "x" is not kebab-case`:plugin 名称包含大写字母、空格或特殊字符。重命名为仅包含小写字母、数字和连字符(例如,`my-plugin`)。Claude Code 接受其他形式,但 claude.ai marketplace 同步会拒绝它们。1483* `Plugin name "x" is not kebab-case`:重命名为仅包含小写字母、数字和连字符(例如,`my-plugin`)。Claude Code 接受其他形式,但 claude.ai marketplace 同步会拒绝它们。

1484* `Marketplace name "x" is reserved in Claude Desktop`:marketplace 名称为 `org`、`org-provisioned` 或 `unknown`,任何大小写。Claude Code 接受这些名称,但 Claude Desktop 的托管 marketplace 同步会拒绝整个 marketplace。重命名 marketplace。在 v2.1.221 之前,`claude plugin validate` 没有运行此检查。

1485* `Marketplace name "x" is not accepted by Claude Desktop` 或 `Plugin name "x" is not accepted by Claude Desktop`:Claude Desktop 接受最多 128 个字符的名称,由字母、数字、`.`、`_` 和 `-` 组成,以字母或数字开头。Claude Code 接受其他形式,但 Claude Desktop 的托管 marketplace 同步会拒绝名称检查失败的 marketplace,并静默删除名称检查失败的 plugin 条目。重命名 marketplace 或 plugin。在 v2.1.221 之前,`claude plugin validate` 没有运行这些检查。

1486 

1487<h4 id="validate-a-plugin-or-a-directory-without-a-manifest">

1488 验证没有 manifest 的 plugin 或目录

1489</h4>

1490 

1491要查找 skill、agent 和 command 文件,其 frontmatter 无法解析,请运行 `claude plugin validate` 并命名包含它们的目录。Claude Code 不会查看你命名的目录之外。除了一次针对具有 `plugin.json` 的 plugin 的运行外,每次运行都需要 Claude Code v2.1.233 或更高版本。

1492 

1493<h5 id="pick-the-directory-to-name">

1494 选择要命名的目录

1495</h5>

1496 

1497Claude Code 根据你命名的目录检查不同的文件。在第一列中找到你想检查的内容,并运行该行的命令:

1498 

1499| 要检查 | 运行 | Claude Code 检查 |

1500| :------------------------------------------------------ | :-------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------ |

1501| 具有 `plugin.json` 的 plugin | `claude plugin validate ./plugins/my-plugin` | `plugin.json`、`hooks/hooks.json` 和 plugin 根目录下的 `skills`、`agents` 和 `commands` 目录 |

1502| 一个 skill、agent 或 command 目录,例如没有 `plugin.json` 的 plugin | `claude plugin validate .claude/skills`、`~/.claude/agents` 或 `./my-plugin/agents` | 该目录中的每个 skill、agent 或 command 文件 |

1503| 其 skill 是其根 `SKILL.md` 的文件夹 | `claude plugin validate ./skills`,命名包含该文件夹的 `skills` 目录 | 每个文件夹的根 `SKILL.md`。包含目录必须命名为 `skills`;位于另一个名称下的文件夹,如 `plugins/`,没有检查其根 `SKILL.md` 的运行 |

1504| 一个项目的三个目录一次 | `claude plugin validate .claude`,或当项目没有 `.claude-plugin/` manifest 时的项目根目录 | `.claude/skills`、`.claude/agents` 和 `.claude/commands` |

1505| 你的用户级目录 | `claude plugin validate ~/.claude` | `~/.claude/skills`、`~/.claude/agents` 和 `~/.claude/commands` |

1506 

1507<h5 id="check-a-plugin-whose-skill-is-its-root-skill-md">

1508 检查其 skill 是其根 `SKILL.md` 的 plugin

1509</h5>

1510 

1511当你针对 plugin 目录运行 `claude plugin validate` 时,Claude Code 不会检查 plugin 根目录下的 `SKILL.md`。当 plugin 位于名为 `skills` 的目录中时,运行该命令两次:

1512 

1513* 命名该 `skills` 目录以检查 plugin 的根 `SKILL.md`。

1514* 命名 plugin 目录以检查其余部分。

1515 

1516当 plugin 位于另一个名称下(如 `plugins/`)时,`skills` 目录运行不可用,没有运行检查其根 `SKILL.md`。

1517 

1518<h5 id="check-files-behind-symlinks">

1519 检查符号链接后面的文件

1520</h5>

1521 

1522当你运行 `claude plugin validate` 时,Claude Code 不会跟随你命名的目录内的符号链接。它所做的取决于链接的位置:

1523 

1524* **plugin 或 `.claude` 根目录下的链接 `skills`、`agents` 或 `commands` 目录**:Claude Code 警告其中没有任何内容被读取。

1525* **`skills`、`agents` 或 `commands` 目录内的链接条目**:Claude Code 跳过它并警告,每个目录,它跳过了多少条目,会话会加载。

1526* **你命名的 `skills`、`agents` 或 `commands` 目录本身是符号链接,或其父 `.claude` 目录是**:Claude Code 报告错误并检查其中的任何内容。改为命名真实目录。

1527 

1528在两个 skills 情况下,运行通过警告。要检查链接的文件,再次运行并命名直接包含它们的目录:

1529 

1530* **其 `skills` 目录[链接到同级 plugin 的 skills](/docs/zh-CN/plugins-reference#share-files-within-a-marketplace-with-symlinks) 的 plugin**:命名同级 plugin 的目录。

1531* **`~/.claude/skills` 或 `.claude/skills` 中的[符号链接 skill 条目](/docs/zh-CN/skills#where-skills-live)**:Claude Code 在会话中跟随该条目。要检查它,命名一个名为 `skills` 的目录,该目录包含真实文件夹。

1532 

1533<h5 id="read-the-validation-results">

1534 读取验证结果

1535</h5>

1536 

1537干净的运行以 `Validation passed` 结束。

1538 

1539`No manifest found in directory` 意味着 Claude Code 在那里找不到 `plugin.json` 或 `marketplace.json`,也找不到它在其下探测的目录中的 skill、agent 或 command 文件。改为命名包含你的文件的 `skills`、`agents` 或 `commands` 目录。

1540 

1541Claude Code 从这些运行中报告的两个错误,以及每个错误的修复:

1542 

1543* `YAML frontmatter failed to parse: ...`:修复 skill、agent 或 command 文件的 frontmatter 块中的 YAML。在你这样做之前,会话从文件中读取不到 frontmatter 字段

1544* `Invalid JSON syntax: ...` 在 `hooks/hooks.json` 上:修复 JSON 语法。在你这样做之前,会话加载 plugin 时不带该文件中的 hooks。Claude Code 仅在 plugin 运行中报告此错误

1545 

1546在 plugin 运行中,Claude Code 还会警告 plugin 根目录下的 `CLAUDE.md`。对于你通过 [component path fields](/docs/zh-CN/plugins-reference#component-path-fields) 在 `plugin.json` 中设置的路径,Claude Code 检查每个路径是否存在,但不读取那里的文件。

1147 1547 

1148<h3 id="plugin-installation-failures">1548<h3 id="plugin-installation-failures">

1149 Plugin 安装失败1549 Plugin 安装失败


1171 1571 

1172* 验证你已使用你的 git 提供商进行身份验证(例如,对于 GitHub 运行 `gh auth status`)1572* 验证你已使用你的 git 提供商进行身份验证(例如,对于 GitHub 运行 `gh auth status`)

1173* 检查你的凭证助手是否配置正确:`git config --global credential.helper`1573* 检查你的凭证助手是否配置正确:`git config --global credential.helper`

1174* 尝试手动克隆存储库以验证你的凭证有效1574* 运行 `git ls-remote <marketplace-url>` 来测试 git 是否可以自行进行身份验证。如果 git 要求输入用户名或密码,请先存储凭证:对于 GitHub over HTTPS,运行 `gh auth setup-git`,对于 SSH 远程,将你的密钥加载到 `ssh-agent`

1175 1575 

1176对于后台自动更新:1576对于后台自动更新:

1177 1577 


1196export CLAUDE_CODE_PLUGIN_KEEP_MARKETPLACE_ON_FAILURE=11596export CLAUDE_CODE_PLUGIN_KEEP_MARKETPLACE_ON_FAILURE=1

1197```1597```

1198 1598 

1199设置此变量后,Claude Code 在 `git pull` 失败时保留陈旧的 marketplace 克隆,并继续使用最后已知的良好状态。对于存储库永远无法访问的完全离线部署,请改用 [`CLAUDE_CODE_PLUGIN_SEED_DIR`](#pre-populate-plugins-for-containers) 在构建时预填充 plugins 目录。1599对于存储库永远无法访问的完全离线部署,请改用 [`CLAUDE_CODE_PLUGIN_SEED_DIR`](#pre-populate-plugins-for-containers) 在构建时预填充 plugins 目录。

1200 1600 

1201<h3 id="git-operations-time-out">1601<h3 id="git-operations-time-out">

1202 Git 操作超时1602 Git 操作超时


1216 相对路径 Plugins 在基于 URL 的 Marketplaces 中失败1616 相对路径 Plugins 在基于 URL 的 Marketplaces 中失败

1217</h3>1617</h3>

1218 1618 

1219**症状**:通过 URL(如 `https://example.com/marketplace.json`)添加了 marketplace,但具有相对路径源(如 `"./plugins/my-plugin"`)的 plugins 无法安装,出现"path not found"错误。1619**症状**:通过 URL(如 `https://example.com/marketplace.json`)添加了 marketplace,但具有相对路径源(如 `"./plugins/my-plugin"`)的 plugins 无法安装,出现 `its marketplace entry path does not stay inside the marketplace directory` 错误。已安装的 plugins 无法加载,出现 `Plugin source path refused` 错误。两条消息都有一个[错误参考条目](/docs/zh-CN/errors#marketplace-entry-path-does-not-stay-inside-the-marketplace-directory)。

1220 1620 

1221**原因**:基于 URL 的 marketplaces 仅下载 `marketplace.json` 文件本身。它们不从服务器下载 plugin 文件。marketplace 条目中的相对路径引用远程服务器上未下载的文件。1621**原因**:添加基于 URL 的 marketplace 仅下载 `marketplace.json` 文件本身,Claude Code 不会从该服务器按相对路径获取 plugin 文件。marketplace 条目中的相对路径引用远程服务器上未下载的文件。

1222 1622 

1223**解决方案**:1623**解决方案**:

1224 1624 

1225* **使用外部源**:将 plugin 条目更改为使用 GitHub、npm 或 git URL 源而不是相对路径:1625* **使用外部源**:将 plugin 条目更改为除相对路径外的任何 [plugin 源](#plugin-sources):

1226 ```json theme={null}1626 ```json theme={null}

1227 { "name": "my-plugin", "source": { "source": "github", "repo": "owner/repo" } }1627 { "name": "my-plugin", "source": { "source": "github", "repo": "owner/repo" } }

1228 ```1628 ```


1234 1634 

1235**症状**:Plugin 安装但对文件的引用失败,特别是 plugin 目录外的文件1635**症状**:Plugin 安装但对文件的引用失败,特别是 plugin 目录外的文件

1236 1636 

1237**原因**:Plugins 被复制到缓存目录而不是就地使用。引用 plugin 目录外文件的路径(如 `../shared-utils`)不会工作,因为这些文件不会被复制。1637**原因**:Plugins 被复制到缓存目录而不是就地使用,除了[链接模式中的 `command` 源](#copy-mode-and-link-mode)。引用 plugin 目录外文件的路径(如 `../shared-utils`)不会工作,因为这些文件不会被复制。

1238 1638 

1239**解决方案**:见 [Plugin 缓存和文件解析](/docs/zh-CN/plugins-reference#plugin-caching-and-file-resolution) 了解解决方法,包括符号链接和目录重组。1639**解决方案**:见 [Plugin 缓存和文件解析](/docs/zh-CN/plugins-reference#plugin-caching-and-file-resolution) 了解解决方法,包括符号链接和目录重组。

1240 1640 


1247* [发现和安装预构建的 plugins](/docs/zh-CN/discover-plugins) - 从现有 marketplaces 安装 plugins1647* [发现和安装预构建的 plugins](/docs/zh-CN/discover-plugins) - 从现有 marketplaces 安装 plugins

1248* [Plugins](/docs/zh-CN/plugins) - 创建你自己的 plugins1648* [Plugins](/docs/zh-CN/plugins) - 创建你自己的 plugins

1249* [Plugins 参考](/docs/zh-CN/plugins-reference) - 完整的技术规范和架构1649* [Plugins 参考](/docs/zh-CN/plugins-reference) - 完整的技术规范和架构

1250* [Plugin 设置](/docs/zh-CN/settings#plugin-settings) - Plugin 配置选项1650* [Plugin 设置](/docs/zh-CN/settings-reference#plugin-settings) - Plugin 配置选项

1251* [strictKnownMarketplaces 参考](/docs/zh-CN/settings#strictknownmarketplaces) - 托管 marketplace 限制1651* [strictKnownMarketplaces 参考](/docs/zh-CN/settings-reference#strictknownmarketplaces) - 托管 marketplace 限制

plugins.md +4 −1

Details

2344. Test coverage2344. Test coverage

235```235```

236 236 

237安装插件后,检查安装摘要:如果它报告 `Run /reload-plugins to activate.`,运行该命令以加载 Skills。有关完整的 Skill 编写指南,包括渐进式披露和工具限制,请参阅 [Agent Skills](/docs/zh-CN/skills)。237安装插件后,检查安装摘要:如果它报告 `Run /reload-plugins to activate.`,请参阅 [Apply plugin changes without restarting](/docs/zh-CN/discover-plugins#apply-plugin-changes-without-restarting) 以在当前会话中加载 Skills。有关完整的 Skill 编写指南,包括渐进式披露和工具限制,请参阅 [Agent Skills](/docs/zh-CN/skills)。

238 238 

239<h3 id="add-lsp-servers-to-your-plugin">239<h3 id="add-lsp-servers-to-your-plugin">

240 向你的插件添加 LSP servers240 向你的插件添加 LSP servers


340 要测试一个插件及其依赖的插件,请参阅 [Test a plugin and its dependency locally](/docs/zh-CN/plugin-dependencies#test-a-plugin-and-its-dependency-locally)。340 要测试一个插件及其依赖的插件,请参阅 [Test a plugin and its dependency locally](/docs/zh-CN/plugin-dependencies#test-a-plugin-and-its-dependency-locally)。

341</Tip>341</Tip>

342 342 

343使用 `--plugin-dir` 尝试插件会告诉你它可以工作。要找出 Claude 实际上多久会使用它一次并获得正确的结果,请使用 [`claude plugin eval`](/docs/zh-CN/plugin-evals) 针对一组测试提示运行它。每个提示会在加载和不加载插件的情况下运行多次,因此你可以看到插件的贡献并在你更改它或新模型发布时捕获回归。

344 

343要从一个地方加载多个插件,请传递一个包含它们的文件夹,例如 `--plugin-dir ./plugins`。加载一个插件文件夹需要 Claude Code v2.1.265 或更高版本。Claude Code 读取文件夹的顶级以决定哪些插件加载,在交互式会话中,它也会监视文件夹以查找后续更改:345要从一个地方加载多个插件,请传递一个包含它们的文件夹,例如 `--plugin-dir ./plugins`。加载一个插件文件夹需要 Claude Code v2.1.265 或更高版本。Claude Code 读取文件夹的顶级以决定哪些插件加载,在交互式会话中,它也会监视文件夹以查找后续更改:

344 346 

345* **加载的内容**:如果文件夹的顶级没有清单或插件组件,Claude Code 会将其视为插件文件夹。每个具有 `.claude-plugin/plugin.json` 清单的直接子文件夹作为单独的插件加载。Claude Code 跳过文件夹中的所有其他内容而不报告错误,包括没有清单的插件。347* **加载的内容**:如果文件夹的顶级没有清单或插件组件,Claude Code 会将其视为插件文件夹。每个具有 `.claude-plugin/plugin.json` 清单的直接子文件夹作为单独的插件加载。Claude Code 跳过文件夹中的所有其他内容而不报告错误,包括没有清单的插件。


515 对于插件开发者517 对于插件开发者

516</h3>518</h3>

517 519 

520* [使用 evals 测试插件](/docs/zh-CN/plugin-evals):测量你的插件改变了什么并在 CI 中进行门控

518* [创建和分发市场](/docs/zh-CN/plugin-marketplaces):打包和共享你的插件521* [创建和分发市场](/docs/zh-CN/plugin-marketplaces):打包和共享你的插件

519* [插件参考](/docs/zh-CN/plugins-reference):完整的技术规范522* [插件参考](/docs/zh-CN/plugins-reference):完整的技术规范

520* 深入了解特定的插件组件:523* 深入了解特定的插件组件:

Details

121 121 

122插件 hooks 响应与 [用户定义的 hooks](/docs/zh-CN/hooks) 相同的生命周期事件:122插件 hooks 响应与 [用户定义的 hooks](/docs/zh-CN/hooks) 相同的生命周期事件:

123 123 

124| Event | When it fires |124| 事件 | 触发时机 |

125| :-------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |125| :-------------------- | :--------------------------------------------------------------------------------------------------------------------- |

126| `SessionStart` | When a session begins or resumes |126| `SessionStart` | 当会话开始或恢复时 |

127| `Setup` | When you start Claude Code with `--init-only`, or with `--init` or `--maintenance` in `-p` mode. For one-time preparation in CI or scripts |127| `Setup` | 当你使用 `--init-only` 启动 Claude Code,或在 `-p` 模式下使用 `--init` 或 `--maintenance` 时。用于 CI 或脚本中的一次性准备 |

128| `UserPromptSubmit` | When you submit a prompt, before Claude processes it |128| `UserPromptSubmit` | 当你提交提示词时,在 Claude 处理之前 |

129| `UserPromptExpansion` | When a user-typed command expands into a prompt, before it reaches Claude. Can block the expansion |129| `UserPromptExpansion` | 当用户输入的命令扩展为提示词时,在到达 Claude 之前。可以阻止扩展 |

130| `PreToolUse` | Before a tool call executes. Can block it |130| `PreToolUse` | 在工具调用执行之前。可以阻止它 |

131| `PermissionRequest` | When a tool call needs a permission decision |131| `PermissionRequest` | 当工具调用需要权限决策时 |

132| `PermissionDenied` | When auto mode denies a tool call, including denials without a classifier verdict. Use JSON `hookSpecificOutput.retry: true` to tell the model it may retry the denied tool call. Claude Code ignores `retry` when the classifier produced no verdict |132| `PermissionDenied` | 当自动模式拒绝工具调用时,包括没有分类器判决的拒绝。使用 JSON `hookSpecificOutput.retry: true` 来告诉模型它可以重试被拒绝的工具调用。Claude Code 在分类器未产生判决时忽略 `retry` |

133| `PostToolUse` | After a tool call succeeds |133| `PostToolUse` | 在工具调用成功后 |

134| `PostToolUseFailure` | After a tool call fails |134| `PostToolUseFailure` | 在工具调用失败后 |

135| `PostToolBatch` | After a full batch of parallel tool calls resolves, before the next model call |135| `PostToolBatch` | 在一整批并行工具调用解决后,在下一次模型调用之前 |

136| `Notification` | When Claude Code sends a notification |136| `Notification` | 当 Claude Code 发送通知时 |

137| `MessageDisplay` | While assistant message text is displayed |137| `MessageDisplay` | 当助手消息文本正在显示时 |

138| `SubagentStart` | When a subagent is spawned |138| `SubagentStart` | 当子代理被生成时 |

139| `SubagentStop` | When a subagent finishes |139| `SubagentStop` | 当子代理完成时 |

140| `TaskCreated` | When a task is being created via `TaskCreate` |140| `TaskCreated` | 当通过 `TaskCreate` 创建任务时 |

141| `TaskCompleted` | When a task is being marked as completed |141| `TaskCompleted` | 当任务被标记为已完成时 |

142| `Stop` | When Claude finishes responding |142| `Stop` | 当 Claude 完成响应时 |

143| `StopFailure` | When the turn ends due to an API error |143| `StopFailure` | 当轮次因 API 错误而结束时 |

144| `TeammateIdle` | When an [agent team](/docs/en/agent-teams) teammate is about to go idle |144| `TeammateIdle` | 当[代理团队](/docs/zh-CN/agent-teams)队友即将空闲时 |

145| `InstructionsLoaded` | When a CLAUDE.md or `.claude/rules/*.md` file is loaded into context. Fires at session start and when files are lazily loaded during a session |145| `InstructionsLoaded` | 当 CLAUDE.md 或 `.claude/rules/*.md` 文件被加载到上下文中时。在会话开始时和文件在会话期间被延迟加载时触发 |

146| `ConfigChange` | When a configuration file changes during a session |146| `ConfigChange` | 当配置文件在会话期间更改时 |

147| `CwdChanged` | When the working directory changes, for example when Claude executes a `cd` command. Useful for reactive environment management with tools like direnv |147| `CwdChanged` | 当工作目录更改时,例如当 Claude 执行 `cd` 命令时。对于使用 direnv 等工具的反应式环境管理很有用 |

148| `DirectoryAdded` | When a working directory is added mid-session via `/add-dir` or the SDK `register_repo_root` control request |148| `DirectoryAdded` | 当工作目录在会话中期通过 `/add-dir` 或 SDK `register_repo_root` 控制请求添加时 |

149| `FileChanged` | When a watched file changes on disk. The `matcher` field specifies which filenames to watch |149| `FileChanged` | 当监视的文件在磁盘上更改时。`matcher` 字段指定要监视的文件名 |

150| `WorktreeCreate` | When a worktree is being created via `--worktree`, `isolation: "worktree"`, or for a background session. Replaces default git behavior |150| `WorktreeCreate` | 当通过 `--worktree`、`isolation: "worktree"` 创建工作树时,或用于后台会话。替换默认的 git 行为 |

151| `WorktreeRemove` | When a worktree is being removed at session exit, when a subagent finishes, or when you delete a background session |151| `WorktreeRemove` | 当在会话退出时、子代理完成时或删除后台会话时移除工作树 |

152| `PreCompact` | Before context compaction |152| `PreCompact` | 在上下文压缩之前 |

153| `PostCompact` | After context compaction completes |153| `PostCompact` | 在上下文压缩完成后 |

154| `PreModelSwitch` | Before Claude Code applies a model switch that you or a client requested. Can block the switch |154| `PreModelSwitch` | 在 Claude Code 应用你或客户端请求的模型切换之前。可以阻止切换 |

155| `PostModelSwitch` | After the session's model changes, including changes Claude Code makes on its own, such as restoring the model when you resume a session |155| `PostModelSwitch` | 在会话的模型更改后,包括 Claude Code 自己进行的更改,例如在你恢复会话时恢复模型 |

156| `Elicitation` | When an MCP server requests user input during a tool call |156| `Elicitation` | 当 MCP 服务器在工具调用期间请求用户输入时 |

157| `ElicitationResult` | After a user responds to an MCP elicitation, before the response is sent back to the server |157| `ElicitationResult` | 在用户响应 MCP 引出后,在响应发送回服务器之前 |

158| `SessionEnd` | When a session terminates |158| `SessionEnd` | 当会话终止时 |

159 159 

160**Hook 类型**:160**Hook 类型**:

161 161 


488 "lspServers": "./.lsp.json",488 "lspServers": "./.lsp.json",

489 "experimental": {489 "experimental": {

490 "themes": "./themes/",490 "themes": "./themes/",

491 "monitors": "./monitors.json"491 "monitors": "./monitors.json",

492 "evals": "quality/evals"

492 },493 },

493 "dependencies": [494 "dependencies": [

494 "helper-lib",495 "helper-lib",


564</h3>565</h3>

565 566 

566| 字段 | 类型 | 描述 | 示例 |567| 字段 | 类型 | 描述 | 示例 |

567| :---------------------- | :-------------------- | :------------------------------------------------------------------------------------------------------------ | :--------------------------------------------------- |568| :---------------------- | :-------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------- |

568| `skills` | string\|array | 包含 `<name>/SKILL.md` 的自定义 skill 目录。添加到默认 `skills/` 扫描。请参阅[路径行为规则](#path-behavior-rules)了解 marketplace-root 异常 | `"./custom/skills/"` |569| `skills` | string\|array | 包含 `<name>/SKILL.md` 的自定义 skill 目录。添加到默认 `skills/` 扫描。请参阅[路径行为规则](#path-behavior-rules)了解 marketplace-root 异常 | `"./custom/skills/"` |

569| `commands` | string\|array | 自定义平面 `.md` skill 文件或目录(替换默认 `commands/`) | `"./custom/cmd.md"` 或 `["./cmd1.md"]` |570| `commands` | string\|array | 自定义平面 `.md` skill 文件或目录(替换默认 `commands/`) | `"./custom/cmd.md"` 或 `["./cmd1.md"]` |

570| `agents` | string\|array | 自定义 agent 文件(替换默认 `agents/`) | `"./custom/agents/reviewer.md"` |571| `agents` | string\|array | 自定义 agent 文件(替换默认 `agents/`) | `"./custom/agents/reviewer.md"` |


575| `lspServers` | string\|array\|object | [Language Server Protocol](https://microsoft.github.io/language-server-protocol/) 配置,用于代码智能(转到定义、查找引用等) | `"./.lsp.json"` |576| `lspServers` | string\|array\|object | [Language Server Protocol](https://microsoft.github.io/language-server-protocol/) 配置,用于代码智能(转到定义、查找引用等) | `"./.lsp.json"` |

576| `experimental.themes` | string\|array | 颜色主题文件/目录(替换默认 `themes/`)。请参阅[主题](#themes) | `"./themes/"` |577| `experimental.themes` | string\|array | 颜色主题文件/目录(替换默认 `themes/`)。请参阅[主题](#themes) | `"./themes/"` |

577| `experimental.monitors` | string\|array | 后台[Monitor](/docs/zh-CN/tools-reference#monitor-tool) 配置,在 plugin 活跃时自动启动。请参阅[监视器](#monitors) | `"./monitors.json"` |578| `experimental.monitors` | string\|array | 后台[Monitor](/docs/zh-CN/tools-reference#monitor-tool) 配置,在 plugin 活跃时自动启动。请参阅[监视器](#monitors) | `"./monitors.json"` |

579| `experimental.evals` | string\|array | plugin 根目录下的目录,当不是默认 `evals/` 时,保存 plugin 的[eval cases](/docs/zh-CN/plugin-evals#use-a-different-eval-directory)。`claude plugin eval --eval-dir` 会覆盖它 | `"quality/evals"` |

578| `userConfig` | object | 在启用时提示的用户可配置值。请参阅[用户配置](#user-configuration) | 见下文 |580| `userConfig` | object | 在启用时提示的用户可配置值。请参阅[用户配置](#user-configuration) | 见下文 |

579| `channels` | array | 消息注入的频道声明(Telegram、Slack、Discord 风格)。请参阅[频道](#channels) | 见下文 |581| `channels` | array | 消息注入的频道声明(Telegram、Slack、Discord 风格)。请参阅[频道](#channels) | 见下文 |

580| `dependencies` | array | 此 plugin 需要的其他 plugin,可选择带有 semver 版本约束。请参阅[约束 plugin 依赖项版本](/docs/zh-CN/plugin-dependencies) | `[{ "name": "secrets-vault", "version": "~2.1.0" }]` |582| `dependencies` | array | 此 plugin 需要的其他 plugin,可选择带有 semver 版本约束。请参阅[约束 plugin 依赖项版本](/docs/zh-CN/plugin-dependencies) | `[{ "name": "secrets-vault", "version": "~2.1.0" }]` |


998claude plugin init <name> [options]1000claude plugin init <name> [options]

999```1001```

1000 1002 

1001**参数:**1003该命令接受这些参数:

1002 1004 

1003* `<name>`:插件名称。成为技能命名空间和 `~/.claude/skills/` 下的目录名称,因此不能包含空格或路径分隔符。1005* `<name>`:插件名称。成为技能命名空间和 `~/.claude/skills/` 下的目录名称,因此不能包含空格或路径分隔符。

1004 1006 

1005**选项:**1007该命令接受这些选项:

1006 1008 

1007| 选项 | 描述 | 默认值 |1009| 选项 | 描述 | 默认值 |

1008| :----------------------- | :--------------------------------------------------------------------------- | :---------------------- |1010| :----------------------- | :--------------------------------------------------------------------------- | :---------------------- |


1013| `-f, --force` | 覆盖目标处现有的 `.claude-plugin/` | |1015| `-f, --force` | 覆盖目标处现有的 `.claude-plugin/` | |

1014| `-h, --help` | 显示命令帮助 | |1016| `-h, --help` | 显示命令帮助 | |

1015 1017 

1016**别名:** `new`1018`claude plugin new` 是此命令的别名。

1017 1019 

1018每个 `--with` 值都会为该组件添加一个启动文件,准备好编辑:1020每个 `--with` 值都会为该组件添加一个启动文件,准备好编辑:

1019 1021 


1029 1031 

1030搭建的插件使用 `@skills-dir` 源而不是市场。管理员可以通过 `strictKnownMarketplaces` 或在 [managed settings](/docs/zh-CN/plugin-marketplaces#managed-marketplace-restrictions) 中添加 `{"source": "skills-dir"}` 到 `blockedMarketplaces` 来阻止此源。当被阻止时,`plugin init` 在写入前失败。1032搭建的插件使用 `@skills-dir` 源而不是市场。管理员可以通过 `strictKnownMarketplaces` 或在 [managed settings](/docs/zh-CN/plugin-marketplaces#managed-marketplace-restrictions) 中添加 `{"source": "skills-dir"}` 到 `blockedMarketplaces` 来阻止此源。当被阻止时,`plugin init` 在写入前失败。

1031 1033 

1032**示例:**1034这些示例显示常见的调用:

1033 1035 

1034```bash theme={null}1036```bash theme={null}

1035# 搭建最小插件1037# 搭建最小插件


1052claude plugin install <plugin> [options]1054claude plugin install <plugin> [options]

1053```1055```

1054 1056 

1055**参数:**1057该命令接受这些参数:

1056 1058 

1057* `<plugin>`:插件名称或 `plugin-name@marketplace-name` 用于特定市场1059* `<plugin>`:插件名称或 `plugin-name@marketplace-name` 用于特定市场

1058 1060 

1059**选项:**1061该命令接受这些选项:

1060 1062 

1061| 选项 | 描述 | 默认值 |1063| 选项 | 描述 | 默认值 |

1062| :--------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :----- |1064| :--------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :----- |

1063| `-s, --scope <scope>` | 安装范围:`user`、`project` 或 `local` | `user` |1065| `-s, --scope <scope>` | 安装范围:`user`、`project` 或 `local` | `user` |

1064| `--config <key=value>` | 设置插件清单中声明的 [`userConfig`](#user-configuration) 选项。重复该标志以设置多个选项 | |1066| `--config <key=value>` | 设置插件清单中声明的 [`userConfig`](#user-configuration) 选项。重复该标志以设置多个选项 | |

1065| `-y, --yes` | 接受插件市场声明的命令,无需确认提示:生成具有 [`command` source](/docs/zh-CN/plugin-marketplaces#command-sources) 的插件的命令,或验证存档下载的 [`headersHelper`](/docs/zh-CN/plugin-marketplaces#authenticate-archive-downloads)。接受 `headersHelper` 需要 Claude Code v2.1.238 或更高版本。Claude Code 仍会首先打印命令。当 stdin 或 stdout 不是 TTY 时需要。在 Claude Code 会话内无效,因此从您自己的终端运行命令 | |1067| `-y, --yes` | 接受插件市场声明的命令,无需确认提示:生成具有 [`command` source](/docs/zh-CN/plugin-marketplaces#command-sources) 的插件的命令,或验证存档下载的 [`headersHelper`](/docs/zh-CN/plugin-marketplaces#authenticate-archive-downloads)。接受 `headersHelper` 需要 Claude Code v2.1.238 或更高版本。Claude Code 仍会首先打印命令。当 stdin 或 stdout 不是 TTY 时需要。在 Claude Code 会话内无效,因此从您自己的终端运行命令 | |

1068| `--json` | 将结果作为 stdout 最后一行的一个 JSON 对象打印,用于脚本。请参阅 [JSON result format](#plugin-json-result)。需要 Claude Code v2.1.268 或更高版本 | |

1066| `-h, --help` | 显示命令帮助 | |1069| `-h, --help` | 显示命令帮助 | |

1067 1070 

1068范围决定了已安装插件添加到哪个设置文件。例如,`--scope project` 写入 .claude/settings.json 中的 `enabledPlugins`,使插件对克隆项目存储库的每个人都可用。1071范围决定了已安装插件添加到哪个设置文件。例如,`--scope project` 写入 .claude/settings.json 中的 `enabledPlugins`,使插件对克隆项目存储库的每个人都可用。

1069 1072 

1070**示例:**1073<span id="plugin-json-result" />使用 `--json`,stdout 的最后一行是一个 JSON 对象。仅解析该行,因为 Claude Code 会在其前面打印市场声明的任何命令。三个字段始终存在:

1074 

1075* `command`:运行的子命令,例如 `install`

1076* `outcome`:`ok` 或 `failed`

1077* `message`:结果的人类可读描述

1078 

1079其他字段,例如 `pluginId`、`scope` 和 `failureCode`,仅在适用时出现。`plugin uninstall`、`plugin update`、`plugin enable` 和 `plugin disable` 上的 `--json` 选项打印具有该子命令自己字段的相同对象。使用错误,例如无效的 `--scope`,不打印结果行并以 stderr 上的原因退出 1。

1080 

1081这些示例显示常见的调用:

1071 1082 

1072```bash theme={null}1083```bash theme={null}

1073# 安装到用户范围(默认)1084# 安装到用户范围(默认)


1090claude plugin uninstall <plugin> [options]1101claude plugin uninstall <plugin> [options]

1091```1102```

1092 1103 

1093**参数:**1104该命令接受这些参数:

1094 1105 

1095* `<plugin>`:插件名称或 `plugin-name@marketplace-name`1106* `<plugin>`:插件名称或 `plugin-name@marketplace-name`

1096 1107 

1097**选项:**1108该命令接受这些选项:

1098 1109 

1099| 选项 | 描述 | 默认值 |1110| 选项 | 描述 | 默认值 |

1100| :-------------------- | :------------------------------------------------------------ | :----- |1111| :-------------------- | :---------------------------------------------------------------------------------------------------------------------------------- | :----- |

1101| `-s, --scope <scope>` | 从范围卸载:`user`、`project` 或 `local` | `user` |1112| `-s, --scope <scope>` | 从范围卸载:`user`、`project` 或 `local` | `user` |

1102| `--keep-data` | 保留插件的 [persistent data directory](#persistent-data-directory) | |1113| `--keep-data` | 保留插件的 [persistent data directory](#persistent-data-directory) | |

1103| `--prune` | 同时删除没有其他插件需要的自动安装依赖项。请参阅 [plugin prune](#plugin-prune) | |1114| `--prune` | 同时删除没有其他插件需要的自动安装依赖项。请参阅 [plugin prune](#plugin-prune) | |

1104| `-y, --yes` | 跳过 `--prune` 确认提示。当 stdin 或 stdout 不是 TTY 时需要 | |1115| `-y, --yes` | 跳过 `--prune` 确认提示。当 stdin 或 stdout 不是 TTY 时需要 | |

1116| `--json` | 将结果作为 stdout 最后一行的一个 JSON 对象打印,格式与 [`plugin install --json`](#plugin-json-result) 相同。不能与 `--prune` 组合。需要 Claude Code v2.1.268 或更高版本 | |

1105| `-h, --help` | 显示命令帮助 | |1117| `-h, --help` | 显示命令帮助 | |

1106 1118 

1107**别名:** `remove`、`rm`1119`claude plugin remove` 和 `claude plugin rm` 是此命令的别名。

1108 1120 

1109默认情况下,从最后剩余的范围卸载也会删除插件的 `${CLAUDE_PLUGIN_DATA}` 目录。使用 `--keep-data` 保留它,例如在测试新版本后重新安装时。1121默认情况下,从最后剩余的范围卸载也会删除插件的 `${CLAUDE_PLUGIN_DATA}` 目录。使用 `--keep-data` 保留它,例如在测试新版本后重新安装时。

1110 1122 


1122claude plugin prune [options]1134claude plugin prune [options]

1123```1135```

1124 1136 

1125**选项:**1137该命令接受这些选项:

1126 1138 

1127| 选项 | 描述 | 默认值 |1139| 选项 | 描述 | 默认值 |

1128| :-------------------- | :--------------------------------- | :----- |1140| :-------------------- | :--------------------------------- | :----- |


1131| `-y, --yes` | 跳过确认提示。当 stdin 或 stdout 不是 TTY 时需要 | |1143| `-y, --yes` | 跳过确认提示。当 stdin 或 stdout 不是 TTY 时需要 | |

1132| `-h, --help` | 显示命令帮助 | |1144| `-h, --help` | 显示命令帮助 | |

1133 1145 

1134**别名:** `autoremove`1146`claude plugin autoremove` 是此命令的别名。

1135 1147 

1136该命令列出孤立的依赖项并在删除前请求确认。要在一个步骤中删除插件并清理其依赖项,请运行 `claude plugin uninstall <plugin> --prune`。1148该命令列出孤立的依赖项并在删除前请求确认。要在一个步骤中删除插件并清理其依赖项,请运行 `claude plugin uninstall <plugin> --prune`。

1137 1149 


1145claude plugin enable <plugin> [options]1157claude plugin enable <plugin> [options]

1146```1158```

1147 1159 

1148**参数:**1160该命令接受这些参数:

1149 1161 

1150* `<plugin>`:插件名称或 `plugin-name@marketplace-name`1162* `<plugin>`:插件名称或 `plugin-name@marketplace-name`

1151 1163 

1152**选项:**1164该命令接受这些选项:

1153 1165 

1154| 选项 | 描述 | 默认值 |1166| 选项 | 描述 | 默认值 |

1155| :-------------------- | :-------------------------------------------------------- | :--- |1167| :-------------------- | :----------------------------------------------------------------------------------------------------------------- | :--- |

1156| `-s, --scope <scope>` | 启用范围:`user`、`project` 或 `local`。省略时,Claude Code 检测安装插件的范围 | 自动检测 |1168| `-s, --scope <scope>` | 启用范围:`user`、`project` 或 `local`。省略时,Claude Code 检测安装插件的范围 | 自动检测 |

1169| `--json` | 将结果作为 stdout 最后一行的一个 JSON 对象打印,格式与 [`plugin install --json`](#plugin-json-result) 相同。需要 Claude Code v2.1.268 或更高版本 | |

1157| `-h, --help` | 显示命令帮助 | |1170| `-h, --help` | 显示命令帮助 | |

1158 1171 

1159<h3 id="plugin-disable">1172<h3 id="plugin-disable">


1166claude plugin disable [plugin] [options]1179claude plugin disable [plugin] [options]

1167```1180```

1168 1181 

1169**参数:**1182该命令接受这些参数:

1170 1183 

1171* `[plugin]`:插件名称或 `plugin-name@marketplace-name`。使用 `--all` 时可选1184* `[plugin]`:插件名称或 `plugin-name@marketplace-name`。使用 `--all` 时可选

1172 1185 

1173**选项:**1186该命令接受这些选项:

1174 1187 

1175| 选项 | 描述 | 默认值 |1188| 选项 | 描述 | 默认值 |

1176| :-------------------- | :-------------------------------------------------------- | :--- |1189| :-------------------- | :----------------------------------------------------------------------------------------------------------------- | :--- |

1177| `-a, --all` | 禁用所有启用的插件。不能与 `--scope` 组合 | |1190| `-a, --all` | 禁用所有启用的插件。不能与 `--scope` 组合 | |

1178| `-s, --scope <scope>` | 禁用范围:`user`、`project` 或 `local`。省略时,Claude Code 检测安装插件的范围 | 自动检测 |1191| `-s, --scope <scope>` | 禁用范围:`user`、`project` 或 `local`。省略时,Claude Code 检测安装插件的范围 | 自动检测 |

1192| `--json` | 将结果作为 stdout 最后一行的一个 JSON 对象打印,格式与 [`plugin install --json`](#plugin-json-result) 相同。需要 Claude Code v2.1.268 或更高版本 | |

1179| `-h, --help` | 显示命令帮助 | |1193| `-h, --help` | 显示命令帮助 | |

1180 1194 

1181<h3 id="plugin-update">1195<h3 id="plugin-update">


1188claude plugin update <plugin> [options]1202claude plugin update <plugin> [options]

1189```1203```

1190 1204 

1191**参数:**1205该命令接受这些参数:

1192 1206 

1193* `<plugin>`:插件名称或 `plugin-name@marketplace-name`1207* `<plugin>`:插件名称或 `plugin-name@marketplace-name`

1194 1208 

1195**选项:**1209该命令接受这些选项:

1196 1210 

1197| 选项 | 描述 | 默认值 |1211| 选项 | 描述 | 默认值 |

1198| :-------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :----- |1212| :-------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :----- |

1199| `-s, --scope <scope>` | 更新范围:`user`、`project`、`local` 或 `managed` | `user` |1213| `-s, --scope <scope>` | 更新范围:`user`、`project`、`local` 或 `managed` | `user` |

1200| `-y, --yes` | 接受插件市场声明的命令,无需确认提示:生成具有 [`command` source](/docs/zh-CN/plugin-marketplaces#command-sources) 的插件的命令,或验证存档下载的 [`headersHelper`](/docs/zh-CN/plugin-marketplaces#authenticate-archive-downloads)。接受 `headersHelper` 需要 Claude Code v2.1.238 或更高版本。Claude Code 仍会首先打印命令。当 stdin 或 stdout 不是 TTY 时需要。在 Claude Code 会话内无效,因此从您自己的终端运行命令 | |1214| `-y, --yes` | 接受插件市场声明的命令,无需确认提示:生成具有 [`command` source](/docs/zh-CN/plugin-marketplaces#command-sources) 的插件的命令,或验证存档下载的 [`headersHelper`](/docs/zh-CN/plugin-marketplaces#authenticate-archive-downloads)。接受 `headersHelper` 需要 Claude Code v2.1.238 或更高版本。Claude Code 仍会首先打印命令。当 stdin 或 stdout 不是 TTY 时需要。在 Claude Code 会话内无效,因此从您自己的终端运行命令 | |

1215| `--json` | 将结果作为 stdout 最后一行的一个 JSON 对象打印,格式与 [`plugin install --json`](#plugin-json-result) 相同。需要 Claude Code v2.1.268 或更高版本 | |

1201| `-h, --help` | 显示命令帮助 | |1216| `-h, --help` | 显示命令帮助 | |

1202 1217 

1203<Note>1218<Note>


1216claude plugin list [options]1231claude plugin list [options]

1217```1232```

1218 1233 

1219**选项:**1234该命令接受这些选项:

1220 1235 

1221| 选项 | 描述 | 默认值 |1236| 选项 | 描述 | 默认值 |

1222| :------------ | :--------------------- | :-- |1237| :------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------ | :-- |

1223| `--json` | 输出为 JSON | |1238| `--json` | 输出为 JSON。具有加载问题或创作警告的插件行携带 `errors` 或 `notes` 字符串数组。在 Claude Code v2.1.268 或更高版本上,并行 `errorDetails` 和 `noteDetails` 数组为每个条目提供诊断 `type` 和它引用的名称,例如插件、市场、服务器或文件 | |

1224| `--available` | 包括市场中的可用插件。需要 `--json` | |1239| `--available` | 包括市场中的可用插件。需要 `--json` | |

1225| `-h, --help` | 显示命令帮助 | |1240| `-h, --help` | 显示命令帮助 | |

1226 1241 


1242claude plugin details <name>1257claude plugin details <name>

1243```1258```

1244 1259 

1245**参数:**1260该命令接受这些参数:

1246 1261 

1247* `<name>`:插件名称或 `plugin-name@marketplace-name`1262* `<name>`:插件名称或 `plugin-name@marketplace-name`

1248 1263 

1249**选项:**1264该命令接受这些选项:

1250 1265 

1251| 选项 | 描述 | 默认值 |1266| 选项 | 描述 | 默认值 |

1252| :----------- | :----- | :-- |1267| :----------- | :----- | :-- |


1297claude plugin validate <path> [options]1312claude plugin validate <path> [options]

1298```1313```

1299 1314 

1300**参数:**1315该命令接受这些参数:

1301 1316 

1302* `<path>`:插件目录或市场目录的路径。请参阅 [Validate a plugin or a directory without a manifest](/docs/zh-CN/plugin-marketplaces#validate-a-plugin-or-a-directory-without-a-manifest) 了解插件运行涵盖的文件。1317* `<path>`:插件目录或市场目录的路径。请参阅 [Validate a plugin or a directory without a manifest](/docs/zh-CN/plugin-marketplaces#validate-a-plugin-or-a-directory-without-a-manifest) 了解插件运行涵盖的文件。

1303 1318 

1304**选项:**1319该命令接受这些选项:

1305 1320 

1306| 选项 | 描述 | 默认值 |1321| 选项 | 描述 | 默认值 |

1307| :----------- | :---------------------------------------------------------------------------------- | :-- |1322| :----------- | :---------------------------------------------------------------------------------- | :-- |


1321 1336 

1322在交互式会话中,`/plugin validate <path>` 内联运行相同的检查。1337在交互式会话中,`/plugin validate <path>` 内联运行相同的检查。

1323 1338 

1339<h3 id="plugin-eval">

1340 plugin eval

1341</h3>

1342 

1343运行插件的 [eval cases](/docs/zh-CN/plugin-evals) 并报告评分结果。需要 Claude Code v2.1.269 或更高版本。每个案例都是一个提示加评分器;Claude Code 在隔离会话中运行它多次,仅加载目标插件,默认情况下也不加载插件,以便报告显示差异。请参阅 [Test plugins with evals](/docs/zh-CN/plugin-evals) 了解案例格式、评分器、结果和 CI 使用。

1344 

1345```bash theme={null}

1346claude plugin eval [target] [options]

1347```

1348 

1349可选的 `target` 是一个插件目录、单个 `prompt.md` 或 `case.yaml` 文件、已安装的插件作为 `name` 或 `name@marketplace`,或 `name@skills-dir`,默认为当前目录。将其放在 `--tag`、`--allow-tools` 和 `--json` 之前。

1350 

1351此表列出大多数运行使用的选项。运行 `claude plugin eval --help` 以获取完整集合,包括 `--case`、`--tag`、`--output-dir`、`--report`、`--allow-real-servers`、`--keep-temp` 和 `--verbose`。

1352 

1353| 选项 | 描述 | 默认值 |

1354| :------------------------- | :----------------------------------------------------------------------------------------------------------------------------- | :----------------------------------------------------------- |

1355| `--runs <n>` | 每个案例每个分支的运行次数 | 每个案例的 `runs`,否则 3 |

1356| `-j, --concurrency <n>` | 一次运行的代理会话数,1 到 8。它们共享您的速率限制 | `1` |

1357| `--model <model>` | 被测试代理的模型 | 每个案例的 `model`,否则 `ANTHROPIC_MODEL`(如果设置),否则 Claude Code 的默认值 |

1358| `--judge-model <model>` | `llm` 和 `baseline` 评分器的模型 | 一个小的快速模型 |

1359| `--ablation <mode>` | `none` 或 `with-without`。请参阅 [Compare against a no-plugin baseline](/docs/zh-CN/plugin-evals#compare-against-a-no-plugin-baseline) | 当插件解析时为 `with-without`,否则为 `none` |

1360| `--threshold <0..1>` | 如果任何案例评分低于此值则退出 1 | `1.0` |

1361| `--max-cost-usd <usd>` | 一旦支出达到此值就停止下一次运行,退出 2,并报告部分结果 | 无上限 |

1362| `--allow-tools <tools...>` | 授予超出只读集合的工具,例如 `Bash`、`Write`、`Edit` 或 `"mcp__plugin_<plugin>_<server>__*"`。请参阅 [Grant tools](/docs/zh-CN/plugin-evals#grant-tools) | |

1363| `--scaffold` | 运行每个案例的 [`scaffold_script`](/docs/zh-CN/plugin-evals#add-setup-or-history-with-case-yaml) | 关闭 |

1364| `--trust-plugin` | 跳过首次运行信任提示,用于 CI。请参阅 [What a run can access](/docs/zh-CN/plugin-evals#security) | 关闭 |

1365| `--mocks <mode>` | `record` 或 `off`。请参阅 [Mock MCP servers](/docs/zh-CN/plugin-evals#mock-mcp-servers) | `record` |

1366| `--eval-dir <dir>` | 保存案例的插件下方的目录 | 清单的 `experimental.evals`,否则 `evals` |

1367| `--json [path]` | 将 [result document](/docs/zh-CN/plugin-evals#json-result) 打印到 stdout,或将其写入 `.json` 路径 | |

1368| `--no-publish` | 保持 HTML 报告本地 | |

1369| `-h, --help` | 显示命令帮助 | |

1370 

1371当每个案例都满足阈值时命令退出 0,在失败案例、加载错误或不受信任的插件目录时退出 1,在部分运行时退出 2,中断时退出 130,终止时退出 143。请参阅 [Run evals in CI](/docs/zh-CN/plugin-evals#run-evals-in-ci)。

1372 

1373<h3 id="plugin-eval-init">

1374 plugin eval init

1375</h3>

1376 

1377为当前目录中的插件创建一个 eval 套件。需要 Claude Code v2.1.269 或更高版本。在终端中,这会启动一个创作访谈,读取插件、提议案例和评分器、试验它们并写入文件。使用 `--bare`,或没有终端时,它会写入一个空白的单案例模板。从交互式 Claude Code 会话内运行,它会打印该会话要遵循的访谈说明,而不是写入模板。请参阅 [Create your first eval suite](/docs/zh-CN/plugin-evals#create-your-first-eval-suite)。

1378 

1379```bash theme={null}

1380claude plugin eval init [name] [options]

1381```

1382 

1383可选的 `name` 是一个案例名称:访谈不需要一个,而 `--bare` 和无终端模板路径需要一个。它接受这些选项:

1384 

1385| 选项 | 描述 | 默认值 |

1386| :------------------ | :------------------------------------------------------------- | :---------------------------------- |

1387| `--bare` | 为 `<name>` 写入一个空白的 `prompt.md` 和 `graders/criteria.md`,而不是运行访谈 | |

1388| `-i, --interactive` | 需要访谈。没有终端时失败,而不是写入模板 | |

1389| `--eval-dir <dir>` | 当前目录下方写入案例的目录 | 清单的 `experimental.evals`,否则 `evals` |

1390| `-h, --help` | 显示命令帮助 | |

1391 

1324<h3 id="plugin-tag">1392<h3 id="plugin-tag">

1325 plugin tag1393 plugin tag

1326</h3>1394</h3>


1331claude plugin tag [path] [options]1399claude plugin tag [path] [options]

1332```1400```

1333 1401 

1334**参数:**1402该命令接受这些参数:

1335 1403 

1336* `[path]`:插件目录的路径。默认为当前目录。1404* `[path]`:插件目录的路径。默认为当前目录。

1337 1405 

1338**选项:**1406该命令接受这些选项:

1339 1407 

1340| 选项 | 描述 | 默认值 |1408| 选项 | 描述 | 默认值 |

1341| :-------------------- | :---------------------- | :------- |1409| :-------------------- | :---------------------- | :------- |

prompt-caching.md +102 −96

Details

14 缓存的组织方式14 缓存的组织方式

15</h2>15</h2>

16 16 

17每次您在 Claude Code 中发送消息时,它都会发出新的 API 请求。模型在请求之间不记得任何东西,所以 Claude Code 重新发送完整的上下文:系统提示、您的项目上下文、每条先前的消息和工具结果,以及您的新消息。新内容附加在末尾,这意味着每个请求的大部分与前一个请求相同。Prompt caching 是 API 避免重新处理未更改部分的方式。17每次在 Claude Code 中发送消息时,它都会发出一个新的 API 请求。模型在请求之间不会记住任何内容,因此 Claude Code 会重新发送完整的上下文:系统提示、你的项目上下文、所有之前的消息和工具结果,以及你的新消息。新内容被附加在末尾,这意味着每个请求的大部分内容与前一个请求相同。Prompt caching 是 API 避免重新处理未更改部分的方式。

18 18 

19API 通过将每个请求的开始部分(称为前缀)与最近处理过的内容进行匹配来缓存。在正常回合中,前缀是整个先前请求,只有最新的交换是新的。匹配是精确的,所以前缀中任何地方的更改都会重新计算其后的所有内容。没有按文件或按段的缓存。有关底层机制,请参阅 API 参考中的[prompt caching 如何工作](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#how-prompt-caching-works)。19API 通过将每个请求的开始部分(称为前缀)与最近处理的内容进行匹配来进行缓存。在正常的回合中,前缀是整个前一个请求,只有最新的交互是新的。匹配是精确的,因此前缀中任何地方的更改都会重新计算其后的所有内容。没有按文件或按段的缓存。有关底层机制,请参阅 API 参考中的 [how prompt caching works](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#how-prompt-caching-works)。

20 20 

21<img src="https://mintcdn.com/claude-code/VbDJw--l6T9a9Wvm/images/prompt-caching-prefix.svg?fit=max&auto=format&n=VbDJw--l6T9a9Wvm&q=85&s=f2e8f0b8298a50305fe428ca3f1d1594" className="dark:hidden" alt="四个回合显示为增长的水平条。每个回合的请求包含前一个回合的所有内容加上最后附加的最新交换。在第二和第三个回合中,未更改的前缀从缓存中读取,只处理新的交换。在第四个回合中,系统提示更改了,所以前缀不再匹配,整个请求被重新处理并写入。" width="720" height="454" data-path="images/prompt-caching-prefix.svg" />21<img src="https://mintcdn.com/claude-code/VbDJw--l6T9a9Wvm/images/prompt-caching-prefix.svg?fit=max&auto=format&n=VbDJw--l6T9a9Wvm&q=85&s=f2e8f0b8298a50305fe428ca3f1d1594" className="dark:hidden" alt="Four turns shown as growing horizontal bars. Each turn's request contains everything from the previous turn plus the latest exchange appended at the end. On turns two and three, the unchanged prefix is read from cache and only the new exchange is processed. On turn four, the system prompt changed, so the prefix no longer matches and the entire request is reprocessed and written." width="720" height="454" data-path="images/prompt-caching-prefix.svg" />

22 22 

23<img src="https://mintcdn.com/claude-code/_xqph1dUOslCOwsj/images/prompt-caching-prefix-dark.svg?fit=max&auto=format&n=_xqph1dUOslCOwsj&q=85&s=297dc1c639f0915cae858d0c4b6f3be5" className="hidden dark:block" alt="四个回合显示为增长的水平条。每个回合的请求包含前一个回合的所有内容加上最后附加的最新交换。在第二和第三个回合中,未更改的前缀从缓存中读取,只处理新的交换。在第四个回合中,系统提示更改了,所以前缀不再匹配,整个请求被重新处理并写入。" width="720" height="454" data-path="images/prompt-caching-prefix-dark.svg" />23<img src="https://mintcdn.com/claude-code/_xqph1dUOslCOwsj/images/prompt-caching-prefix-dark.svg?fit=max&auto=format&n=_xqph1dUOslCOwsj&q=85&s=297dc1c639f0915cae858d0c4b6f3be5" className="hidden dark:block" alt="Four turns shown as growing horizontal bars. Each turn's request contains everything from the previous turn plus the latest exchange appended at the end. On turns two and three, the unchanged prefix is read from cache and only the new exchange is processed. On turn four, the system prompt changed, so the prefix no longer matches and the entire request is reprocessed and written." width="720" height="454" data-path="images/prompt-caching-prefix-dark.svg" />

24 24 

25为了充分利用前缀匹配,Claude Code 组织每个请求,使回合之间很少更改的内容首先出现:25为了充分利用前缀匹配,Claude Code 对每个请求进行排序,使得在回合之间很少更改的内容首先出现:

26 26 

27| 层 | 内容 | 更改时间 |27| Layer | Content | Changes when |

28| ----- | -------------------- | -------------------------------- |28| --------------- | ----------------------------------------------- | ----------------------------------------------- |

29| 系统提示 | 核心指令、工具定义 | 加载的工具定义集合更改,或 Claude Code 升级 |29| System prompt | Core instructions, tool definitions | The set of loaded tool definitions changes |

30| 项目上下文 | CLAUDE.md、自动内存、无范围规则 | 会话开始,或在 `/clear` 或 `/compact` 之后 |30| Project context | CLAUDE.md, auto memory, unscoped rules | Session starts, or after `/clear` or `/compact` |

31| 对话 | 您的消息、Claude 的响应、工具结果 | 每个回合 |31| Conversation | Your messages, Claude's responses, tool results | Every turn |

32 32 

33对对话层的更改会保留系统提示和项目上下文缓存。对系统提示的更改会使所有内容失效,因为所有后续内容现在位于不同的前缀后面。第三列给出常见触发器而不是详尽列表,下面的部分涵盖完整集合。33对对话层的更改会使系统提示和项目上下文保持缓存。对系统提示的更改会使所有内容失效,因为所有后续内容现在位于不同的前缀后面。第三列给出了常见的触发器,而不是详尽的列表,下面的部分涵盖了完整的集合。

34 34 

35前缀匹配规则解释了本页上的大多数行为。例如,[Plan mode](/docs/zh-CN/permission-modes#analyze-before-you-edit-with-plan-mode) 和[技能加载](/docs/zh-CN/skills)将其指令附加为对话消息,所以缓存的前缀保持完整。35前缀匹配规则解释了本页上的大多数行为。例如,[Plan mode](/docs/zh-CN/permission-modes#analyze-before-you-edit-with-plan-mode) 和 [skill loading](/docs/zh-CN/skills) 将其指令作为对话消息附加,因此缓存的前缀保持完整。

36 36 

37两个设置不出现在层表中,但仍然影响缓存的内容:37两个设置不在层表中出现,但仍然影响缓存的内容:

38 38 

39* **Model**:每个模型都有自己的缓存。切换模型会重新计算整个请求,即使内容相同。请参阅下面的[切换模型](#switching-models)。39* **Model**:每个模型都有自己的缓存。切换模型会重新计算整个请求,即使内容相同。请参阅下面的 [Switching models](#switching-models)。

40* **Effort level**:在大多数模型上,每个工作量级别都有自己的缓存,所以在会话中期更改工作量会重新计算整个请求。在带有 API 密钥或 Claude 订阅的 Fable 5.1 上,缓存默认保持完整。请参阅下面的[更改工作量级别](#changing-effort-level)。40* **Effort level**:在大多数模型上,每个努力级别都有自己的缓存,因此在会话中途更改努力级别会重新计算整个请求。在具有 API 密钥或 Claude 订阅的 Fable 5.1 上,缓存默认保持完整。请参阅下面的 [Changing effort level](#changing-effort-level)。

41 41 

42<Tip>42<Tip>

43 在会话顶部选择您的模型和工作量级别,然后在任务之间的自然中断处保存 `/compact`。您在任务中期进行的更改越少,缓存命中率就越高。43 在会话顶部选择你的模型和努力级别,然后在任务之间的自然中断处保存 `/compact`。你在任务中途进行的更改越少,缓存命中率就越高。

44</Tip>44</Tip>

45 45 

46<h3 id="where-the-cache-lives">46<h3 id="where-the-cache-lives">

47 缓存位置47 缓存的位置

48</h3>48</h3>

49 49 

50缓存发生在服务器端,在为您的模型提供服务的任何基础设施中。它的位置取决于您如何进行身份验证:50缓存发生在服务器端,在为你的模型提供服务的任何基础设施中。位置取决于你的身份验证方式:

51 51 

52* **API 密钥、Claude 订阅或 [Claude Platform on AWS](/docs/zh-CN/claude-platform-on-aws)**:缓存位于 Anthropic 的基础设施中,通过 [Claude API](https://platform.claude.com/docs) 访问52* **API key、Claude subscription 或 [Claude Platform on AWS](/docs/zh-CN/claude-platform-on-aws)**:缓存位于 Anthropic 的基础设施中,通过 [Claude API](https://platform.claude.com/docs) 访问

53* **Amazon Bedrock 或 Google Cloud 的 Agent Platform**:缓存位于您的云提供商的服务基础设施中53* **Amazon Bedrock 或 Google Cloud 的 Agent Platform**:缓存位于你的云提供商的服务基础设施中

54* **Microsoft Foundry**:取决于部署的[托管选项](https://platform.claude.com/docs/en/build-with-claude/claude-in-microsoft-foundry#hosting-options)。在 Azure 上托管的部署在 Azure 基础设施上提供;在 Anthropic 上托管的部署在 Anthropic 的基础设施上提供54* **Microsoft Foundry**:取决于部署的 [hosting option](https://platform.claude.com/docs/en/build-with-claude/claude-in-microsoft-foundry#hosting-options)。在 Azure 上托管的部署在 Azure 基础设施上提供;在 Anthropic 上托管的部署在 Anthropic 的基础设施上提供

55* **自定义 `ANTHROPIC_BASE_URL` 或 [LLM gateway](/docs/zh-CN/llm-gateway)**:缓存位于您的请求转发到的任何地方,缓存是否工作取决于网关55* **Custom `ANTHROPIC_BASE_URL` 或 [LLM gateway](/docs/zh-CN/llm-gateway)**:缓存位于你的请求被转发的地方,缓存是否有效取决于网关

56 56 

57Claude Code 还在对话中期附加系统上下文,例如文件更改通知,并在每个提供商和连接上标记该块以进行缓存。57Claude Code 还在对话中途附加系统上下文,例如文件更改通知,并在所有提供商和连接上标记该块以进行缓存,除非你设置了 [`CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS`](/docs/zh-CN/llm-gateway-protocol#disable-pre-release-capabilities),在这种情况下该块被发送为未缓存。

58 58 

59在提供商自己的端点、Amazon Bedrock 及其 [Mantle 端点](/docs/zh-CN/amazon-bedrock#use-the-mantle-endpoint)、Google Cloud 的 Agent Platform 和 Microsoft Foundry 上,缓存该块的方式与 Claude API 相同。59在提供商自己的端点、Amazon Bedrock 及其 [Mantle endpoint](/docs/zh-CN/amazon-bedrock#use-the-mantle-endpoint)、Google Cloud 的 Agent Platform 和 Microsoft Foundry 上,缓存该块的方式与 Claude API 相同。

60 60 

61当您的请求通过 [LLM gateway](/docs/zh-CN/llm-gateway)、自定义 `ANTHROPIC_BASE_URL` 或云提供商基础 URL 覆盖(例如 [`ANTHROPIC_BEDROCK_BASE_URL`](/docs/zh-CN/env-vars))时,缓存的内容取决于网关如何处理 Claude Code 发送的 [`cache_control` 标记](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#explicit-cache-breakpoints):61当你的请求通过 [LLM gateway](/docs/zh-CN/llm-gateway)、自定义 `ANTHROPIC_BASE_URL` 或云提供商基础 URL 覆盖(例如 [`ANTHROPIC_BEDROCK_BASE_URL`](/docs/zh-CN/env-vars))时,缓存的内容取决于网关如何处理 Claude Code 发送的 [`cache_control` markers](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#explicit-cache-breakpoints):

62 62 

63* **原样转发它们**:该块和您的对话缓存方式与在提供商自己的端点上相同。63* **原样转发它们**:该块和你的对话缓存方式与在提供商自己的端点上相同。

64* **拒绝标记的请求,返回命名 `cache_control` 的 `400` 错误**:Claude Code 重新发送请求,将标记从块移到您的最后一条对话消息上,并在对话的其余部分保持在那里。该块作为未缓存的输入计费;您的对话保持缓存。64* **使用命名 `cache_control` 的 `400` 错误拒绝标记的请求**:Claude Code 重新发送请求,将标记从块移到你的最后一条对话消息上,并在对话的其余部分保持在那里。该块作为未缓存的输入计费;你的对话保持缓存。

65* **在返回成功时删除标记**:您的整个对话历史在每个回合上都作为未缓存的输入计费。将块形式系统内容转换为纯字符串的网关以相同的方式删除标记。65* **在返回成功时删除标记**:你的整个对话历史在每个回合上都作为未缓存的输入计费。将块形式的系统内容转换为纯字符串的网关以相同的方式删除标记。

66 66 

67有关每个提供商存储和处理的内容,请参阅[数据使用](/docs/zh-CN/data-usage)。无论缓存位于何处,条目在不活动期间后过期,[缓存生命周期](#cache-lifetime)下面涵盖 TTL 以及如何延长它。67有关每个提供商存储和处理的内容,请参阅 [data usage](/docs/zh-CN/data-usage)。无论缓存位于何处,条目在不活动期间后过期,下面的 [Cache lifetime](#cache-lifetime) 涵盖了 TTL 以及如何延长它。

68 68 

69<h2 id="actions-that-invalidate-the-cache">69<h2 id="actions-that-invalidate-the-cache">

70 使缓存失效的操作70 使缓存失效的操作

71</h2>71</h2>

72 72 

73这些操作会导致下一个请求错过部分或全部缓存。您会看到一个一次性的较慢、更昂贵的回合,之后新的前缀被缓存。一旦您知道它们有成本,大多数都可以在任务中期避免。模型切换可能感觉是免费的,直到您注意到随后的较慢回合。73这些操作会导致下一个请求缓存未命中的部分或全部。您会看到一次速度较慢、成本更高的回合,之后新的前缀会被缓存。一旦您了解它们的成本,大多数操作都可以在任务中途避免。模型切换可能看起来没有成本,直到您注意到随后的速度较慢的回合。

74 74 

75* [切换模型](#switching-models)75* [切换模型](#switching-models)

76* [更改工作量级别](#changing-effort-level)76* [更改工作量级别](#changing-effort-level)


78* [连接或断开 MCP 服务器](#connecting-or-disconnecting-an-mcp-server)78* [连接或断开 MCP 服务器](#connecting-or-disconnecting-an-mcp-server)

79* [启用或禁用插件](#enabling-or-disabling-a-plugin)79* [启用或禁用插件](#enabling-or-disabling-a-plugin)

80* [拒绝整个工具](#denying-an-entire-tool)80* [拒绝整个工具](#denying-an-entire-tool)

81* [更改输出样式](#changing-output-style)

82* [压缩对话](#compacting-the-conversation)81* [压缩对话](#compacting-the-conversation)

83* [积累许多图像](#accumulating-many-images)82* [积累许多图像](#accumulating-many-images)

84* [升级 Claude Code](#upgrading-claude-code)83* [升级 Claude Code](#upgrading-claude-code)


87 切换模型86 切换模型

88</h3>87</h3>

89 88 

90每个模型都有自己的缓存。使用 [`/model`](/docs/zh-CN/model-config#setting-your-model) 切换意味着下一个请求读取整个对话历史记录而没有缓存命中,即使内容相同。89每个模型都有自己的缓存。使用 [`/model`](/docs/zh-CN/model-config#setting-your-model) 切换意味着下一个请求会读取整个对话历史记录而没有缓存命中,即使内容相同。

91 90 

92当您在终端运行 `/model` 时,Claude Code 仅在缓存仍然温暖时要求您确认切换。缓存在 Claude Code 在此对话中最后发送请求或 Claude 最后响应后的一个[缓存 TTL](#cache-lifetime) 内保持温暖。一旦该时间过去,缓存已过期,所以 Claude Code 无需询问即可切换。91当您在终端运行 `/model` 时,Claude Code 仅在缓存仍然温暖时要求您确认切换。缓存在 Claude Code 在此对话中最后一次发送请求或 Claude 最后一次响应后的一个[缓存 TTL](#cache-lifetime) 内保持温暖。一旦该时间过去,缓存就会过期,因此 Claude Code 会在不询问的情况下进行切换。

93 92 

94在 v2.1.238 之前,Claude Code 没有检查缓存 TTL,即使在缓存过期后也会询问。93在 v2.1.238 之前,Claude Code 没有检查缓存 TTL,即使在缓存过期后也会询问。

95 94 

96您也可以使用 [PreModelSwitch hook](/docs/zh-CN/hooks#premodelswitch-decision-control) 要求此确认或跳过它。95您也可以使用 [PreModelSwitch hook](/docs/zh-CN/hooks#premodelswitch-decision-control) 要求此确认或跳过它。

97 96 

98[`opusplan` 模型设置](/docs/zh-CN/model-config#opusplan-model-setting)在 Plan Mode 期间解析为 Opus,在执行期间解析为 Sonnet,所以每个 Plan Mode 切换都是模型切换并启动新缓存。97[`opusplan` 模型设置](/docs/zh-CN/model-config#opusplan-model-setting)在计划模式下解析为 Opus,在执行期间解析为 Sonnet,因此每个计划模式切换都是一个模型切换并启动新的缓存。

99 98 

100[Fable 模型和 Opus 5 上的自动模型回退](/docs/zh-CN/model-config#automatic-model-fallback)也是一个模型切换。当安全分类器标记具有回退模型的类别中的请求时,Claude Code 在该模型上重新运行请求,会话继续进行。99[自动模型回退](/docs/zh-CN/model-config#automatic-model-fallback)在 Fable 模型和 Opus 5 上也是一个模型切换。当安全分类器在具有回退模型的类别中标记请求时,Claude Code 会在该模型上重新运行请求,会话会在那里继续。

101 100 

102当 skill 或 command 的 frontmatter 命名一个[`model`](/docs/zh-CN/skills#frontmatter-reference)不同于会话当前模型的模型时,该回合也是一个模型切换:下一个请求读取整个对话历史记录而没有缓存命中。会话模型在您的下一个提示上恢复。`context: fork` skill 设置[分叉子代理的模型](/docs/zh-CN/skills#run-skills-in-a-subagent)。101当技能或命令的 frontmatter 命名一个[`model`](/docs/zh-CN/skills#frontmatter-reference)不同于会话当前模型的模型时,该回合也是一个模型切换:下一个请求会读取整个对话历史记录而没有缓存命中。会话模型在您的下一个提示时恢复。`context: fork` 技能会设置[分叉子代理的模型](/docs/zh-CN/skills#run-skills-in-a-subagent)。

103 102 

104<h3 id="changing-effort-level">103<h3 id="changing-effort-level">

105 更改工作量级别104 更改工作量级别

106</h3>105</h3>

107 106 

108在大多数模型上,在会话中期更改[工作量级别](/docs/zh-CN/model-config#adjust-effort-level)意味着下一个请求读取整个对话历史记录而没有缓存命中。当缓存仍然温暖时,Claude Code 会要求您首先确认更改。107在大多数模型上,在会话中途更改[工作量级别](/docs/zh-CN/model-config#adjust-effort-level)意味着下一个请求会读取整个对话历史记录而没有缓存命中。当缓存仍然温暖时,Claude Code 会要求您先确认更改。

109 108 

110在具有 API 密钥或 Claude 订阅的 Fable 5.1 上,更改工作量会保持缓存,Claude Code 无需询问即可应用新级别。这不适用于 Amazon Bedrock、Google Cloud 的 Agent Platform 或 [Claude apps gateway](/docs/zh-CN/claude-apps-gateway),或当您设置 [`CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS`](/docs/zh-CN/llm-gateway-protocol#disable-pre-release-capabilities) 或您的组织具有 HIPAA 配置时。109在具有 API 密钥或 Claude 订阅的 Fable 5.1 上,更改工作量会保持缓存,Claude Code 会在不询问的情况下应用新级别。这不适用于 Amazon Bedrock、Google Cloud 的 Agent Platform 或 [Claude 应用网关](/docs/zh-CN/claude-apps-gateway),或当您设置 [`CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS`](/docs/zh-CN/llm-gateway-protocol#disable-pre-release-capabilities) 或您的组织具有 HIPAA 配置时。

111 110 

112在 v2.1.260 之前,在具有 API 密钥或 Claude 订阅的 Fable 5.1 上更改工作量也会使缓存失效。111在 v2.1.260 之前,在具有 API 密钥或 Claude 订阅的 Fable 5.1 上更改工作量也会使缓存失效。

113 112 


115 启用快速模式114 启用快速模式

116</h3>115</h3>

117 116 

118启用[快速模式](/docs/zh-CN/fast-mode)会添加一个请求头,该请求头是缓存键的一部分,所以 Claude Code 发送的第一个启用快速模式的请求读取整个对话历史记录而没有缓存命中。Claude Code 在回合开始时设置该头一次,并为整个回合保持它,所以当您在 Claude 工作时启用快速模式时,头的缓存未命中发生在您下一个回合的第一个请求上。这些未缓存的输入令牌按[快速模式费率](/docs/zh-CN/fast-mode#understand-the-cost-tradeoff)计费,这就是为什么在会话开始时启用它的成本低于在长会话深处启用它的成本。如果您当前的模型不支持快速模式,启用快速模式也会[切换您的模型](#switching-models),该切换本身会从运行回合中的下一个请求启动新缓存。117启用[快速模式](/docs/zh-CN/fast-mode)会添加一个请求标头,该标头是缓存键的一部分,因此 Claude Code 发送的启用快速模式的第一个请求会读取整个对话历史记录而没有缓存命中。Claude Code 在回合开始时设置该标头一次,并为整个回合保持它,因此当您在 Claude 工作时启用快速模式时,标头的缓存未命中会在您下一个回合的第一个请求时发生。这些未缓存的输入令牌按[快速模式费率](/docs/zh-CN/fast-mode#understand-the-cost-tradeoff)计费,这就是为什么在会话开始时启用它的成本比在长会话深处启用它的成本要低。如果您当前的模型不支持快速模式,启用快速模式也会[切换您的模型](#switching-models),该切换从运行回合中的下一个请求开始启动新的缓存。

119 118 

120成本每个对话应用一次。在第一个快速模式回合之后,Claude Code 继续发送头,仅改变请求的速度设置,这不是缓存键的一部分。关闭快速模式、[在速率限制后自动回退到标准速度](/docs/zh-CN/fast-mode#handle-rate-limits)以及稍后重新启用它都保持缓存。如果您在会话中期[用完使用额度](/docs/zh-CN/fast-mode#handle-rate-limits),Claude Code 以相同方式在标准速度重试每个被拒绝的快速模式请求,所以此回退也保持缓存。`/clear` 和 `/compact` 重置这个,因为它们无论如何都在这些点重建缓存。119成本每个对话应用一次。在第一个快速模式回合之后,Claude Code 继续发送标头,仅改变请求的速度设置,这不是缓存键的一部分。关闭快速模式、[在速率限制后自动回退到标准速度](/docs/zh-CN/fast-mode#handle-rate-limits)以及稍后重新启用它都会保持缓存。如果您在会话中途[用完使用额度](/docs/zh-CN/fast-mode#handle-rate-limits),Claude Code 会以相同的方式在标准速度下重试每个被拒绝的快速模式请求,因此此回退也会保持缓存。`/clear` 和 `/compact` 会重置此设置,因为它们无论如何都会在这些点重建缓存。

121 120 

122<h3 id="connecting-or-disconnecting-an-mcp-server">121<h3 id="connecting-or-disconnecting-an-mcp-server">

123 连接或断开 MCP 服务器122 连接或断开 MCP 服务器

124</h3>123</h3>

125 124 

126工具定义位于系统提示层中,所以当请求之间的工具定义集合更改时,缓存会失效。切换[顾问工具](/docs/zh-CN/advisor)是一个例外:其定义位于缓存断点之后,所以启用或禁用 `/advisor` 会保持缓存的前缀完整。[MCP 服务器](/docs/zh-CN/mcp)更改是否执行此操作取决于其工具是否由[工具搜索](/docs/zh-CN/mcp#scale-with-mcp-tool-search)延迟或加载到前缀中:125工具定义位于系统提示层,因此当请求中的工具定义集在回合之间发生变化时,缓存会失效。切换[顾问工具](/docs/zh-CN/advisor)是一个例外:其定义位于缓存断点之后,因此启用或禁用 `/advisor` 会保持缓存的前缀完整。[MCP 服务器](/docs/zh-CN/mcp)更改是否执行此操作取决于其工具是否由[工具搜索](/docs/zh-CN/mcp#scale-with-mcp-tool-search)延迟或加载到前缀中:

127 126 

128* **延迟工具**,在支持的模型上是默认设置:服务器连接、断开连接或更改其工具列表仅附加新内容,不会扰乱已缓存的任何内容。127* **延迟工具**,在支持的模型上是默认值:服务器连接、断开连接或更改其工具列表只会追加新内容,不会扰乱已缓存的任何内容。

129* **加载到前缀中的工具**:对它们的任何更改都会使缓存失效。这发生在[工具搜索不可用或被禁用](/docs/zh-CN/mcp#configure-tool-search)时,例如在 Google Cloud 的 Agent Platform 上早于 Claude 4.5 代的模型、使用自定义 `ANTHROPIC_BASE_URL` 网关或在 Microsoft Foundry [部署在 Azure 上](https://platform.claude.com/docs/en/build-with-claude/claude-in-microsoft-foundry#hosting-options)一旦 Claude Code 检测到部署拒绝工具搜索时。它也发生在标记为 [`alwaysLoad`](/docs/zh-CN/mcp#exempt-a-server-from-deferral) 的服务器或工具上,以及由[基于阈值的加载](/docs/zh-CN/mcp#configure-tool-search)保持在前面的定义上。128* **加载到前缀中的工具**:对它们的任何更改都会使缓存失效。这发生在[工具搜索不可用或被禁用](/docs/zh-CN/mcp#configure-tool-search)时,例如在早于 Claude 4.5 代的 Google Cloud Agent Platform 模型上、使用自定义 `ANTHROPIC_BASE_URL` 网关或在 Microsoft Foundry [部署在 Azure 上](https://platform.claude.com/docs/en/build-with-claude/claude-in-microsoft-foundry#hosting-options)一旦 Claude Code 检测到部署拒绝工具搜索时。它也发生在标记为 [`alwaysLoad`](/docs/zh-CN/mcp#exempt-a-server-from-deferral) 的服务器或工具上,以及由[基于阈值的加载](/docs/zh-CN/mcp#configure-tool-search)保持在前面的定义上。

130 129 

131当工具加载到前缀中时,失效的最常见原因是服务器在会话中期连接或断开连接,这可能在没有您采取任何操作的情况下发生:stdio 服务器的进程退出、HTTP 会话过期或服务器[在暂时故障后自动重新连接](/docs/zh-CN/mcp#automatic-reconnection)。连接的服务器也可以推送[动态工具更新](/docs/zh-CN/mcp#dynamic-tool-updates)来更改其工具列表。130当工具加载到前缀中时,失效的最常见原因是服务器在会话中途连接或断开连接,这可能在没有您采取任何操作的情况下发生:stdio 服务器的进程退出、HTTP 会话过期或服务器[在暂时故障后自动重新连接](/docs/zh-CN/mcp#automatic-reconnection)。连接的服务器也可以推送[动态工具更新](/docs/zh-CN/mcp#dynamic-tool-updates)来更改其工具列表。

132 131 

133编辑您的 MCP 配置本身不会改变缓存。新配置仅在重启后生效,这是服务器连接或断开连接的时间。132编辑您的 MCP 配置本身不会改变缓存。新配置仅在重启后生效,这是服务器连接或断开连接的时候。

134 133 

135<h3 id="enabling-or-disabling-a-plugin">134<h3 id="enabling-or-disabling-a-plugin">

136 启用或禁用插件135 启用或禁用插件

137</h3>136</h3>

138 137 

139当您启用或禁用[插件](/docs/zh-CN/plugins)时,更改的成本取决于插件提供的组件类型。下面的情况涵盖每个组件类型、Claude Code 何时应用更改以及您在同一会话中再次禁用插件时会发生什么。138当您启用或禁用[插件](/docs/zh-CN/plugins)时,更改的成本取决于插件提供的组件类型。下面的情况涵盖每个组件类型、Claude Code 何时应用更改以及在同一会话中再次禁用插件时会发生什么。

140 139 

141<h4 id="plugin-components-that-keep-the-cache">140<h4 id="plugin-components-that-keep-the-cache">

142 保持缓存的插件组件141 保持缓存的插件组件

143</h4>142</h4>

144 143 

145Claude Code 永远不会为插件的 skills、commands、agents、hooks、monitors 或 themes 使缓存失效。它将其内容附加在现有对话之后,所以下一个请求为该内容付费,但仍然从缓存中读取它之前的所有内容。144Claude Code 永远不会为插件的技能、命令、代理、hooks、监视器或主题使缓存失效。它在现有对话之后追加其内容,因此下一个请求为该内容付费,并仍然从缓存中读取其之前的所有内容。

146 145 

147<h4 id="plugins-that-provide-mcp-servers">146<h4 id="plugins-that-provide-mcp-servers">

148 提供 MCP 服务器的插件147 提供 MCP 服务器的插件

149</h4>148</h4>

150 149 

151当您启用或禁用提供 [MCP 服务器](/docs/zh-CN/plugins-reference#mcp-servers)的插件时,Claude Code 遵循与[连接或断开 MCP 服务器](#connecting-or-disconnecting-an-mcp-server)相同的规则:150当您启用或禁用提供 [MCP 服务器](/docs/zh-CN/plugins-reference#mcp-servers) 的插件时,Claude Code 遵循与[连接或断开 MCP 服务器](#connecting-or-disconnecting-an-mcp-server)相同的规则:

152 151 

153* 如果 Claude Code 延迟服务器的工具,它会保持缓存。152* 如果 Claude Code 延迟服务器的工具,它会保持缓存。

154* 如果 Claude Code 将它们加载到前缀中,下一个请求重新读取整个对话。153* 如果 Claude Code 将它们加载到前缀中,下一个请求会重新读取整个对话。

155 154 

156<h4 id="code-intelligence-plugins">155<h4 id="code-intelligence-plugins">

157 代码智能插件156 代码智能插件

158</h4>157</h4>

159 158 

160当您启用[代码智能插件](/docs/zh-CN/discover-plugins#code-intelligence)时,Claude 获得 [LSP 工具](/docs/zh-CN/tools-reference#lsp-tool-behavior)。159当您启用[代码智能插件](/docs/zh-CN/discover-plugins#code-intelligence)时,Claude 会获得 [LSP 工具](/docs/zh-CN/tools-reference#lsp-tool-behavior)。

161 160 

162<h4 id="when-plugin-changes-apply">161<h4 id="when-plugin-changes-apply">

163 插件更改何时应用162 插件更改何时应用

164</h4>163</h4>

165 164 

166插件更改在您运行 [`/reload-plugins`](/docs/zh-CN/discover-plugins#apply-plugin-changes-without-restarting) 或启动新会话时应用,而不是当您运行 `/plugin enable` 或 `/plugin disable` 时。您支付成本(无论是附加的公告还是完整的重新读取)在更改应用后的第一个回合。Claude Code 也可以自己应用更改:165您在 `/plugin` 菜单中所做的更改会通过 [`/reload-plugins`](/docs/zh-CN/discover-plugins#apply-plugin-changes-without-restarting) 进行,Claude Code 在您关闭菜单时为您运行。您需要支付成本,无论是追加公告还是完整重新读取,都在更改应用后的第一个回合。Claude Code 也可以自行应用更改:

167 166 

168* 对于具有 `command` 源的插件,Claude Code [可以自己重新加载插件](/docs/zh-CN/plugin-marketplaces#when-claude-code-re-runs-the-command)。167* 对于具有 `command` 源的插件,Claude Code [可以自行重新加载插件](/docs/zh-CN/plugin-marketplaces#when-claude-code-re-runs-the-command)。

169* 当您[从 `/plugin` 界面安装插件](/docs/zh-CN/discover-plugins#install-plugins)时,Claude Code 可以在安装期间激活它。Claude Code 在安装摘要中告诉您它是否这样做或是否运行 `/reload-plugins`。168* 当您[从 `/plugin` 界面安装插件](/docs/zh-CN/discover-plugins#install-plugins)时,Claude Code 可以在安装期间激活它。安装摘要会告诉您它是否这样做了。

170* 当您在 v2.1.246 或更高版本上使用 `/cd` [移动会话](/docs/zh-CN/permissions#move-the-session-to-another-directory)时,Claude Code 将新目录的设置启用的插件应用为移动的一部分,而不需要保持 `/reload-plugins` 的完整重新读取警告。169* 当您在 v2.1.246 或更高版本上使用 `/cd` [移动会话](/docs/zh-CN/permissions#move-the-session-to-another-directory)时,Claude Code 会在移动过程中应用新目录的设置启用的插件,而不会出现保持 `/reload-plugins` 的完整重新读取警告。

171* 在交互式会话中,当您在使用 `--plugin-dir` 传递的[插件文件夹](/docs/zh-CN/plugins#test-your-plugins-locally)中添加或移除插件时,更改会立即应用。如果应用它会触发完整重新读取,Claude Code 会保持更改并显示运行 `/reload-plugins` 的通知。需要 Claude Code v2.1.265 或更高版本。170* 在交互式会话中,当您在使用 `--plugin-dir` 传递的[插件文件夹](/docs/zh-CN/plugins#test-your-plugins-locally)中添加或删除插件时,更改会立即应用。如果应用它会触发完整重新读取,Claude Code 会保持更改并显示运行 `/reload-plugins` 的通知。需要 Claude Code v2.1.265 或更高版本。

172 171 

173当您运行 `/reload-plugins` 且重新加载会触发完整重新读取时,Claude Code 会显示警告并不应用重新加载。使用 `--force` 重新运行以强制应用重新加载。172当 `/reload-plugins` 运行且重新加载会触发完整重新读取时,Claude Code 会显示警告并不应用重新加载。运行 `/reload-plugins --force` 以无论如何应用它。

174 173 

175`/reload-plugins` 也在没有交互式终端的会话中运行,例如桌面应用、Agent SDK 和[非交互式模式](/docs/zh-CN/headless)与 `-p`,当您直接将其输入到会话中时。需要 Claude Code v2.1.260 或更高版本。174`/reload-plugins` 也在没有交互式终端的会话中运行,例如桌面应用、Agent SDK 和[非交互式模式](/docs/zh-CN/headless)与 `-p`,当您直接将其输入到会话中时。需要 Claude Code v2.1.260 或更高版本。

176 175 

177在这些会话中,重新加载应用除了插件 MCP 服务器更改之外的所有内容,这些[在您的下一个会话中生效](/docs/zh-CN/discover-plugins#apply-plugin-changes-without-restarting),因此永远不会在会话中期造成完整重新读取的成本。176在这些会话中,重新加载应用除了插件 MCP 服务器更改之外的所有内容,这些[在您的下一个会话中生效](/docs/zh-CN/discover-plugins#apply-plugin-changes-without-restarting),因此在会话中途永远不会成本完整重新读取。

178 177 

179<h4 id="plugins-you-enable-and-then-disable-in-one-session">178<h4 id="plugins-you-enable-and-then-disable-in-one-session">

180 您在一个会话中启用然后禁用的插件179 您在一个会话中启用然后禁用的插件

181</h4>180</h4>

182 181 

183当您禁用您在会话早期启用的插件时,Claude Code 恢复之前的请求形状。如果该前缀仍在其[缓存生命周期](#cache-lifetime)内,下一个请求读取较旧的缓存条目而不是重建。182当您禁用您在会话中较早启用的插件时,Claude Code 会恢复之前的请求形状。如果该前缀仍在其[缓存生命周期](#cache-lifetime)内,下一个请求会读取较旧的缓存条目,而不是重建。

184 183 

185<h3 id="denying-an-entire-tool">184<h3 id="denying-an-entire-tool">

186 拒绝整个工具185 拒绝整个工具

187</h3>186</h3>

188 187 

189添加像 `Bash` 或 `WebFetch` 这样的裸工具名称作为[拒绝规则](/docs/zh-CN/permissions#manage-permissions)会将该工具从 Claude 的上下文中完全移除。Claude Code 将内置工具定义加载到系统提示层中,所以在会话中期添加或移除这些规则之一会使缓存失效。Claude Code 在下一个请求上应用更改,无论您通过 `/permissions` 添加它还是通过[直接编辑设置文件](/docs/zh-CN/settings#when-edits-take-effect)。这包括您在回合中期通过 `/permissions` 添加的规则。188添加像 `Bash` 或 `WebFetch` 这样的裸工具名称作为[拒绝规则](/docs/zh-CN/permissions#manage-permissions)会将该工具从 Claude 的上下文中完全删除。Claude Code 将内置工具定义加载到系统提示层,因此在会话中途添加或删除这些规则之一会使缓存失效。Claude Code 在下一个请求时应用更改,无论您通过 `/permissions` 添加规则还是通过[直接编辑设置文件](/docs/zh-CN/settings#when-edits-take-effect)。这包括您在回合中途通过 `/permissions` 添加的规则。

190 

191只有与工具名称位置匹配的拒绝规则才有这种效果:裸工具名称、等效的 `Bash(*)` 形式或[工具名称通配符](/docs/zh-CN/permissions#tool-name-wildcards)如 `"*"`。匹配仅 MCP 工具的通配符(如 `"mcp__*"`)以相同方式移除这些工具,但当匹配的工具被[延迟](#connecting-or-disconnecting-an-mcp-server)时保持缓存完整,这是默认设置,因为延迟定义从未在缓存的前缀中。作用域拒绝规则如 `Bash(rm *)`,以及所有允许和询问规则,都不会改变 Claude 看到的工具。Claude Code 在 Claude 尝试调用时检查它们,保持前缀完整。

192 

193<h3 id="changing-output-style">

194 更改输出样式

195</h3>

196 

197当您在会话中期使用 `/config` 或 `outputStyle` 设置切换[输出样式](/docs/zh-CN/output-styles)时,Claude 从您的下一条消息开始使用新样式。在[保持记录的系统提示](/docs/zh-CN/cli-reference#system-prompt-flags-in-resumed-conversations)的对话中,如使用 claude.ai 或 Console 账户登录的会话默认情况下所做的那样,Claude Code 将新样式的指令作为对话中的消息传递。该请求仍然从缓存中读取系统提示和较早的对话。

198 

199在不[获取功能标志](/docs/zh-CN/env-vars#features-that-need-feature-flag-fetching)的会话中,例如在 Amazon Bedrock、Google Cloud 的 Agent Platform 或 Microsoft Foundry 上,样式的指令是系统提示的一部分,所以切换后的请求读取整个对话历史记录而没有缓存命中。在那里,在会话中的第一条消息之前或在 `/clear` 或 `/compact` 之后立即切换样式,当对话历史记录很少或没有时。

200 189 

201在 v2.1.251 之前,会话中期的样式切换保持缓存,但在您运行 `/clear` 或启动新会话之前不应用。190只有在工具名称位置匹配的拒绝规则才有此效果:裸工具名称、等效的 `Bash(*)` 形式或[工具名称 glob](/docs/zh-CN/permissions#tool-name-wildcards) 如 `"*"`。仅匹配 MCP 工具的 glob,例如 `"mcp__*"`,会以相同的方式删除这些工具,但当匹配的工具是[延迟](#connecting-or-disconnecting-an-mcp-server)时保持缓存完整,这是默认值,因为延迟定义从未在缓存的前缀中。作用域拒绝规则如 `Bash(rm *)`,以及所有允许和询问规则,不会改变 Claude 看到的工具。Claude Code 在 Claude 尝试调用时检查它们,保持前缀完整。

202 191 

203<h3 id="compacting-the-conversation">192<h3 id="compacting-the-conversation">

204 压缩对话193 压缩对话

205</h3>194</h3>

206 195 

207[压缩](/docs/zh-CN/context-window#what-survives-compaction)用摘要替换您的消息历史记录。根据设计,这会使对话层失效,因为下一个请求有一个新的、更短的历史记录,与旧的历史记录不共享前缀。Claude Code 重用系统提示层并从磁盘重新加载项目上下文,只有在 CLAUDE.md 和内存自会话开始以来未更改时才缓存命中。196[压缩](/docs/zh-CN/context-window#what-survives-compaction)用摘要替换您的消息历史记录。根据设计,这会使对话层失效,因为下一个请求具有新的、更短的历史记录,不与旧历史记录共享前缀。Claude Code 重用系统提示层,除非对话是[在保持会话的同时恢复的,该会话会以其他方式改变](#resuming-a-session);在这种情况下,第一次压缩会切换到当前提示,该层会重建一次。它从磁盘重新加载项目上下文,仅当 CLAUDE.md 和内存自会话开始以来未更改时才缓存命中。

208 197 

209为了生成摘要,Claude Code 发送一个一次性请求,其系统提示、工具和历史记录与您的对话相同,加上作为最终用户消息附加的摘要指令。当缓存温暖时,该请求从缓存中读取您的前缀,所以会话中期的 `/compact` 成本是上下文大小建议的一小部分,并花费大部分时间生成摘要。198为了生成摘要,Claude Code 会发送一个单独的请求,其系统提示、工具和历史记录与您的对话相同,加上作为最终用户消息追加的摘要指令。当缓存温暖时,该请求从缓存中读取您的前缀,因此中会话 `/compact` 的成本是上下文大小建议的一小部分,并花费大部分时间生成摘要。

210 199 

211在超过[缓存生命周期](#cache-lifetime)的中断后,没有缓存可读,所以摘要请求重新处理完整历史记录作为未缓存的输入。这就是为什么当您[恢复旧会话](/docs/zh-CN/sessions#resume-from-a-summary)时 `/compact` 成本最高。在温暖和冷的情况下,压缩后的回合仅为更短的摘要重建对话缓存,所以该回合不是缓慢的部分。200在长于[缓存生命周期](#cache-lifetime)的中断后,没有缓存可读,因此摘要请求会重新处理完整历史记录作为未缓存输入。这就是为什么当您[恢复旧会话](/docs/zh-CN/sessions#resume-from-a-summary)时 `/compact` 成本最高。在温暖和冷的情况下,压缩后的回合仅为更短的摘要重建对话缓存,因此该回合不是缓慢的部分。

212 201 

213<Tip>202<Tip>

214 当您丢弃的上下文是您不再需要的内容时,压缩对您有利。要选择其开销何时发生,请在工作中的自然中断处(例如任务之间)运行 `/compact`,而不是等待自动压缩在任务中期触发。如果您走上了想要完全放弃的路径,请改为[`/rewind`](#rewinding-the-conversation)到较早的回合。重绕会截断回到已经缓存的前缀,而不是像压缩那样构建新的前缀。203 当您丢弃的上下文是您不再需要的内容时,压缩对您有利。要选择其开销何时发生,请在工作中的自然中断处(例如任务之间)运行 `/compact`,而不是等待自动压缩在任务中途触发。如果您走上了一条想要完全放弃的路径,请改为[`/rewind`](#rewinding-the-conversation)到较早的回合。重新绕过会截断回到已缓存的前缀,而不是像压缩那样构建新的前缀。

215</Tip>204</Tip>

216 205 

217<h3 id="accumulating-many-images">206<h3 id="accumulating-many-images">

218 积累许多图像207 积累许多图像

219</h3>208</h3>

220 209 

221API 限制每个请求可以携带多少图像和 PDF。有关当前数字,请参阅 API 文档中的[请求限制](https://platform.claude.com/docs/en/build-with-claude/vision#request-limits)。Claude Code 也限制请求中图像和 PDF 的总大小,所以大型屏幕截图以比小型屏幕截图更少的图像达到限制。210API 限制每个请求可以携带多少图像和 PDF。有关当前数字,请参阅 API 文档中的[请求限制](https://platform.claude.com/docs/en/build-with-claude/vision#request-limits)。Claude Code 也限制了请求中图像和 PDF 的总大小,因此大型屏幕截图比小型屏幕截图更快达到限制。

222 211 

223当下一个请求会超过任一限制时,Claude Code 从它发送的内容中移除一批最旧的图像和 PDF,这为更多内容腾出空间,然后才需要再次移除任何内容。Claude 不再能看到移除的图像。如果 Claude 再次需要其中一个,请再次共享它。212当下一个请求会超过任一限制时,Claude Code 会从它发送的内容中删除一批最旧的图像和 PDF,这为更多内容腾出空间,然后才需要再次删除任何内容。Claude 不再能看到删除的图像。如果 Claude 再次需要其中一个,请再次共享它。

224 213 

225移除图像会改变保存它们的消息,所以下一个请求从这些消息中最早的消息开始重新处理对话。因为 Claude Code 一次移除一批,您会看到每批一个较慢的回合,而不是每个新屏幕截图一个。214删除图像会改变保存它们的消息,因此下一个请求会从这些消息中最早的消息开始重新处理对话。因为 Claude Code 一次删除一批,您会看到每批一个较慢的回合,而不是每个新屏幕截图一个。

226 215 

227<h3 id="upgrading-claude-code">216<h3 id="upgrading-claude-code">

228 升级 Claude Code217 升级 Claude Code

229</h3>218</h3>

230 219 

231新的 Claude Code 版本通常会更新系统提示或工具定义,所以升级后的第一个请求从顶部重建缓存。[自动更新](/docs/zh-CN/setup#auto-updates)在后台下载新版本,但在下次启动时应用它们,从不在会话中期,所以您会看到这是重启后的一个未缓存的第一个回合,而不是会话期间的惊喜。设置 `DISABLE_AUTOUPDATER=1` 来控制何时应用升级。220新的 Claude Code 版本通常会更新系统提示或工具定义,因此升级后启动的第一个对话会从顶部构建其缓存。[自动更新](/docs/zh-CN/setup#auto-updates)在后台下载新版本,但在下一次启动时应用它们,从不在会话中途,因此您会看到这是重启后的未缓存第一个回合,而不是会话期间的惊喜。设置 `DISABLE_AUTOUPDATER=1` 来控制何时应用升级。

232 221 

233<Note>222<Note>

234 升级后[恢复会话](/docs/zh-CN/sessions#resume-a-session)会重新处理整个对话历史记录而没有缓存命中,因为历史记录现在位于不同的系统提示后面。成本随着恢复的对话有多长而扩展,所以回到长会话的第一个回合可能是您发送的最昂贵的请求。223 有关恢复您在升级前启动的对话的成本,请参阅[恢复会话](#resuming-a-session)。

235</Note>224</Note>

236 225 

237<h2 id="actions-that-keep-the-cache">226<h2 id="actions-that-keep-the-cache">

238 保持缓存的操作227 保持缓存的操作

239</h2>228</h2>

240 229 

241这些操作要么附加到对话的末尾,要么根本不接触请求。其中一些,例如编辑 CLAUDE.md,保持缓存的原因与更改在执行会话中不生效直到 `/clear`、`/compact` 或重启的原因相同。230这些操作要么追加到对话的末尾,要么根本不触及请求。其中一些操作(例如编辑 CLAUDE.md)保持缓存的原因与该更改在运行会话中不会生效直到 `/clear`、`/compact` 或重启的原因相同。

242 231 

243* [编辑存储库中的文件](#editing-files-in-your-repository)232* [编辑存储库中的文件](#editing-files-in-your-repository)

244* [在会话中期编辑 CLAUDE.md](#editing-claude-md-mid-session)233* [在会话中编辑 CLAUDE.md](#editing-claude-md-mid-session)

245* [更改权限模式](#changing-permission-mode)234* [更改权限模式](#changing-permission-mode)

246* [调用技能和命令](#invoking-skills-and-commands)235* [更改输出样式](#changing-output-style)

236* [调用 skills 和命令](#invoking-skills-and-commands)

247* [运行 `/recap`](#running-%2Frecap)237* [运行 `/recap`](#running-%2Frecap)

248* [重绕对话](#rewinding-the-conversation)238* [回溯对话](#rewinding-the-conversation)

249* [生成子代理](#subagents-and-the-cache)239* [生成子代理](#subagents-and-the-cache)

250 240 

251<h3 id="editing-files-in-your-repository">241<h3 id="editing-files-in-your-repository">

252 编辑存储库中的文件242 编辑存储库中的文件

253</h3>243</h3>

254 244 

255文件内容仅在 Claude 读取它们时进入上下文,读取附加到对话。编辑 Claude 之前读过的文件不会追溯更改历史记录中的较早读取。相反,Claude Code 附加一个 `<system-reminder>` 注意文件已更改,如果需要,Claude 会重新读取它。245文件内容仅在 Claude 读取文件时进入上下文,而读取操作会追加到对话中。编辑 Claude 之前读过的文件不会追溯性地改变历史记录中的早期读取。相反,Claude Code 会追加一条 `<system-reminder>` 注明文件已更改,Claude 会在需要时重新读取该文件。

256 246 

257<h3 id="editing-claude-md-mid-session">247<h3 id="editing-claude-md-mid-session">

258 在会话中期编辑 CLAUDE.md248 在会话中编辑 CLAUDE.md

259</h3>249</h3>

260 250 

261您的项目根目录和用户级 CLAUDE.md 文件在会话开始时读取一次并保存在内存中。在会话中期编辑它们不会使缓存失效,但编辑也不适用。Claude 继续使用在会话开始时加载的版本。新内容在下一个 `/clear`、`/compact` 或重启时加载。251您的项目根目录和用户级 CLAUDE.md 文件在会话开始时读取一次并保存在内存中。在会话中编辑它们不会使缓存失效,但编辑也不会应用。Claude 继续使用在会话开始时加载的版本。新内容在下一次 `/clear`、`/compact` 或重启时加载。

262 252 

263[子目录中的嵌套 CLAUDE.md 文件](/docs/zh-CN/memory)和[带有 `paths:` frontmatter 的规则](/docs/zh-CN/memory#path-specific-rules)稍后加载,当 Claude 首次读取匹配文件时。在加载前编辑一个确实会生效。加载后,内容是对话历史记录的一部分,所以中期编辑不会追溯更改它。253[子目录中的嵌套 CLAUDE.md 文件](/docs/zh-CN/memory)和[带有 `paths:` frontmatter 的规则](/docs/zh-CN/memory#path-specific-rules)稍后加载,当 Claude 首次读取匹配的文件时。在加载前编辑它确实会生效。加载后,内容成为对话历史的一部分,所以中途编辑不会追溯性地改变它。

264 254 

265<h3 id="changing-permission-mode">255<h3 id="changing-permission-mode">

266 更改权限模式256 更改权限模式

267</h3>257</h3>

268 258 

269在[权限模式](/docs/zh-CN/permission-modes)之间切换,例如从手动到接受编辑,不会改变系统提示或工具定义,所以模式更改是缓存安全的。例外是带有 [`opusplan`](/docs/zh-CN/model-config#opusplan-model-setting) 模型设置的 Plan Mode,它在进入或离开 Plan Mode 时在 Opus 和 Sonnet 之间切换模型。这使模式切换成为[模型切换](#switching-models)。259在[权限模式](/docs/zh-CN/permission-modes)之间切换,例如从手动模式切换到接受编辑,不会改变系统提示或工具定义,所以模式更改是缓存安全的。例外是使用 [`opusplan`](/docs/zh-CN/model-config#opusplan-model-setting) 模型设置的计划模式,它在您进入或离开计划模式时在 Opus 和 Sonnet 之间切换模型。这使得模式切换成为[模型切换](#switching-models)。

260 

261<h3 id="changing-output-style">

262 更改输出样式

263</h3>

264 

265当您在会话中使用 `/config` 或 `outputStyle` 设置切换[输出样式](/docs/zh-CN/output-styles)时,Claude 从您的下一条消息开始使用新样式。Claude Code 将新样式的指令作为对话中的消息传递,所以该请求仍然从缓存中读取系统提示和早期对话。

266 

267在 v2.1.251 之前,中途样式切换保持缓存但直到您运行 `/clear` 或启动新会话时才应用。

270 268 

271<h3 id="invoking-skills-and-commands">269<h3 id="invoking-skills-and-commands">

272 调用技能和命令270 调用 skills 和命令

273</h3>271</h3>

274 272 

275[技能](/docs/zh-CN/skills)和[命令](/docs/zh-CN/commands)在调用点将其指令注入为用户消息。对话中较早的任何内容都不会改变。其 frontmatter 命名 `model` 的技能或命令可以是该回合的[模型切换](#switching-models)。273[Skills](/docs/zh-CN/skills) 和[命令](/docs/zh-CN/commands)在调用点将其指令作为用户消息注入。对话中早期的任何内容都不会改变。frontmatter 中命名 `model` 的 skill 或命令可以是该轮的[模型切换](#switching-models)。

276 274 

277<h3 id="running-/recap">275<h3 id="running-/recap">

278 运行 `/recap`276 运行 `/recap`

279</h3>277</h3>

280 278 

281[`/recap`](/docs/zh-CN/interactive-mode#session-recap) 生成一个摘要以在您的终端中显示。与 `/compact` 不同,它将摘要附加为命令输出而不是替换您的消息历史记录,所以缓存的前缀保持完整。279[`/recap`](/docs/zh-CN/interactive-mode#session-recap) 生成一个摘要以在您的终端中显示。与 `/compact` 不同,它将摘要作为命令输出追加而不是替换您的消息历史,所以缓存的前缀保持完整。

282 280 

283<h3 id="rewinding-the-conversation">281<h3 id="rewinding-the-conversation">

284 重绕对话282 回溯对话

285</h3>283</h3>

286 284 

287[`/rewind`](/docs/zh-CN/checkpointing) 将您的对话截断回较早的回合。剩余的历史记录是缓存在该点构建时的相同内容,系统提示和项目上下文层未更改,所以下一个请求命中较早的缓存条目。自那时以来的每个回合都通过该前缀读取,即使原始回合比 TTL 更久远,也保持条目温暖。285[`/rewind`](/docs/zh-CN/checkpointing) 将您的对话截断回到较早的轮次。剩余的历史是缓存在该点构建时的相同内容,系统提示和项目上下文层保持不变,所以下一个请求会命中较早的缓存条目。从那时起的每一轮都读过该前缀,即使原始轮次比 TTL 更久远,也保持了该条目的活跃。

286 

287恢复文件检查点与对话一起对缓存没有单独的影响。文件内容仅在 Claude 读取文件时进入上下文,与[编辑存储库中的文件](#editing-files-in-your-repository)相同。

288 

289<h2 id="resuming-a-session">

290 恢复会话

291</h2>

292 

293当你[恢复会话](/docs/zh-CN/sessions#resume-a-session)时,Claude Code 会重新发送整个对话,请求会从缓存中读取其前缀中未更改且仍在[缓存生命周期](#cache-lifetime)内的任何部分。本页顶部的层表说明了每一层的变化。

288 294 

289恢复文件检查点与对话一起对缓存没有单独的影响。文件内容仅在 Claude 读取它们时进入上下文,与[编辑存储库中的文件](#editing-files-in-your-repository)相同。295系统提示词会在[Claude Code 升级](#upgrading-claude-code)后或在恢复时使用不同的[`--append-system-prompt`](/docs/zh-CN/cli-reference#system-prompt-flags)文本时发生变化。默认情况下,恢复的对话会保持其启动时的系统提示词,因此其历史记录仍然位于相同的提示词后面,更改会在对话被压缩或在新对话中生效。[恢复的对话中的系统提示词标志](/docs/zh-CN/cli-reference#system-prompt-flags-in-resumed-conversations)涵盖了`--system-prompt-snapshot off`和裸模式,其中这不适用。

290 296 

291<h2 id="cache-lifetime">297<h2 id="cache-lifetime">

292 缓存生命周期298 缓存生命周期


346 缓存范围352 缓存范围

347</h2>353</h2>

348 354 

349在 Claude Code 中,缓存有效地限定在一台机器和目录。系统提示嵌入工作目录、平台、shell、OS 版本和自动内存路径,所以两个不同目录中的会话构建不同的前缀并错过彼此的缓存。这包括同一存储库的 worktrees,因为每个 worktree 都有自己的工作目录。355在 Claude Code 中,缓存有效地限定在一台机器和目录。每个对话都携带工作目录、平台、shell 和 OS 版本,系统提示命名您的自动内存路径,所以两个不同目录中的会话构建不同的前缀并错过彼此的缓存。这包括同一存储库的 worktrees,因为每个 worktree 都有自己的工作目录。

350 356 

351您在同一目录中并行运行的会话构建匹配的前缀并读取彼此的缓存。顺序会话仅当启动时的 git 状态快照匹配时才共享前缀,因为系统提示也捕获分支和最近的提交。357您在同一目录中并行运行的会话构建匹配的前缀并读取彼此的缓存。顺序会话仅当启动时的 git 状态快照匹配时才共享前缀,因为每个对话也携带该快照中的分支和最近的提交。

352 358 

353底层 API 缓存更广泛。缓存在组织之间隔离,在某些提供商上,[在组织内的工作区之间隔离](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#cache-storage-and-sharing)。在这些边界内,任何两个具有相同模型和前缀的请求读取相同的缓存。对于运行自动化流程队列的 Agent SDK 调用者,请参阅[改进跨用户和机器的 prompt caching](/docs/zh-CN/agent-sdk/modifying-system-prompts#improve-prompt-caching-across-users-and-machines)以抑制系统提示的按机器部分并跨机器共享缓存。359底层 API 缓存更广泛。缓存在组织之间隔离,在某些提供商上,[在组织内的工作区之间隔离](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#cache-storage-and-sharing)。在这些边界内,任何两个具有相同模型和前缀的请求读取相同的缓存。对于运行自动化流程队列的 Agent SDK 调用者,请参阅[改进跨用户和机器的 prompt caching](/docs/zh-CN/agent-sdk/modifying-system-prompts#improve-prompt-caching-across-users-and-machines)以抑制系统提示的按机器部分并跨机器共享缓存。

354 360 

quickstart.md +13 −13

Details

31 步骤 1:安装 Claude Code31 步骤 1:安装 Claude Code

32</h2>32</h2>

33 33 

34To install Claude Code, use one of the following methods:34要安装 Claude Code,请使用以下方法之一:

35 35 

36<Tabs>36<Tabs>

37 <Tab title="Native Install (Recommended)">37 <Tab title="原生安装(推荐)">

38 **macOS, Linux, WSL:**38 **macOS、Linux、WSL:**

39 39 

40 ```bash theme={null}40 ```bash theme={null}

41 curl -fsSL https://claude.ai/install.sh | bash41 curl -fsSL https://claude.ai/install.sh | bash

42 ```42 ```

43 43 

44 **Windows PowerShell:**44 **Windows PowerShell:**

45 45 

46 ```powershell theme={null}46 ```powershell theme={null}

47 irm https://claude.ai/install.ps1 | iex47 irm https://claude.ai/install.ps1 | iex

48 ```48 ```

49 49 

50 **Windows CMD:**50 **Windows CMD:**

51 51 

52 ```batch theme={null}52 ```batch theme={null}

53 curl -fsSL https://claude.ai/install.cmd -o install.cmd && install.cmd && del install.cmd53 curl -fsSL https://claude.ai/install.cmd -o install.cmd && install.cmd && del install.cmd

54 ```54 ```

55 55 

56 If you see `The token '&&' is not a valid statement separator`, you're in PowerShell, not CMD. If you see `'irm' is not recognized as an internal or external command`, you're in CMD, not PowerShell. Your prompt shows `PS C:\` when you're in PowerShell and `C:\` without the `PS` when you're in CMD.56 如果您看到 `The token '&&' is not a valid statement separator`,说明您在 PowerShell 中,而不是 CMD。如果您看到 `'irm' is not recognized as an internal or external command`,说明您在 CMD 中,而不是 PowerShell。当您在 PowerShell 中时,您的提示符显示 `PS C:\`,当您在 CMD 中时显示 `C:\`(没有 `PS`)。

57 57 

58 If the install command fails with `syntax error near unexpected token '<'`, a `403`, or another curl error, see [Troubleshoot installation](/docs/en/troubleshoot-install#find-your-error) to match the error to a fix and for alternative install methods.58 如果安装命令失败并显示 `syntax error near unexpected token '<'`、`403` 或其他 curl 错误,请参阅 [Troubleshoot installation](/docs/zh-CN/troubleshoot-install#find-your-error) 以匹配错误并获得修复方案和替代安装方法。

59 59 

60 [Git for Windows](https://git-scm.com/downloads/win) is recommended on native Windows so Claude Code can use the Bash tool. If Git for Windows is not installed, Claude Code uses PowerShell as the shell tool instead. WSL setups do not need Git for Windows.60 建议在原生 Windows 上安装 [Git for Windows](https://git-scm.com/downloads/win),以便 Claude Code 可以使用 Bash 工具。如果未安装 Git for Windows,Claude Code 将使用 PowerShell 作为 shell 工具。WSL 设置不需要 Git for Windows。

61 61 

62 <Info>62 <Info>

63 Native installations automatically update in the background to keep you on the latest version.63 原生安装会在后台自动更新,以保持您使用最新版本。

64 </Info>64 </Info>

65 </Tab>65 </Tab>

66 66 


69 brew install --cask claude-code69 brew install --cask claude-code

70 ```70 ```

71 71 

72 Homebrew offers two casks. `claude-code` tracks the stable release channel, which is typically about a week behind and skips releases with major regressions. `claude-code@latest` tracks the latest channel and receives new versions as soon as they ship.72 Homebrew 提供两个 casks。`claude-code` 跟踪稳定发布渠道,通常比最新版本晚约一周,并跳过有重大回归的版本。`claude-code@latest` 跟踪最新渠道,在新版本发布时立即接收。

73 73 

74 <Info>74 <Info>

75 Homebrew installations do not auto-update. Run `brew upgrade claude-code` or `brew upgrade claude-code@latest`, depending on which cask you installed, to get the latest features and security fixes.75 Homebrew 安装不会自动更新。运行 `brew upgrade claude-code` 或 `brew upgrade claude-code@latest`(取决于您安装的 cask)以获取最新功能和安全修复。

76 </Info>76 </Info>

77 </Tab>77 </Tab>

78 78 


82 ```82 ```

83 83 

84 <Info>84 <Info>

85 WinGet installations do not auto-update. Run `winget upgrade Anthropic.ClaudeCode` periodically to get the latest features and security fixes.85 WinGet 安装不会自动更新。定期运行 `winget upgrade Anthropic.ClaudeCode` 以获取最新功能和安全修复。

86 </Info>86 </Info>

87 </Tab>87 </Tab>

88</Tabs>88</Tabs>

89 89 

90You can also install with [apt, dnf, or apk](/docs/en/setup#install-with-linux-package-managers) on Debian, Fedora, RHEL, and Alpine.90您也可以在 Debian、Fedora、RHEL 和 Alpine 上使用 [apt、dnf 或 apk](/docs/zh-CN/setup#install-with-linux-package-managers) 进行安装。

91 91 

92要确认安装成功,请运行:92要确认安装成功,请运行:

93 93 

remote-control.md +17 −13

Details

132 检查连接状态132 检查连接状态

133</h3>133</h3>

134 134 

135在交互式终端会话中,当连接处于活动状态时,`/rc active` 指示器位于输入框下方的页脚中,如果终端太窄无法容纳它,则隐藏。指示器文本是指向 claude.ai 上会话的链接。使用向下箭头键选择它并按 Enter,或再次运行 `/remote-control`,打开状态面板,其中包含会话 URL 和 QR 码,您可以使用它从[另一个设备连接](#connect-from-another-device)。状态面板还提供断开连接选项。选择它以关闭 Remote Control;您的本地会话继续在终端中运行。135在交互式终端会话中,当连接处于活动状态时,`/rc active` 指示器显示,如果终端太窄无法容纳它,则隐藏。使用[全屏渲染](/docs/zh-CN/fullscreen)时,它位于启动标头中的工作目录行的末尾,没有它时,位于输入框下方的页脚中。

136 136 

137如果连接失败,Claude Code 会显示一条通知,说明失败原因,并将指示器切换到保留在页脚中的失败状态。要再次读取原因,请使用向下箭头键选择指示器并按 Enter。要重新连接,请运行 `/remote-control`,除非[原因说会话在其他地方被接管或结束,或服务器找不到它](#session-ended-elsewhere)。137指示器文本是指向 claude.ai 上会话的链接。再次运行 `/remote-control` 以打开状态面板,其中包含会话 URL 和 QR 码,用于[从另一个设备连接](#connect-from-another-device)。当指示器在页脚中时,您也可以使用向下箭头键选择指示器并按 Enter 来打开面板。面板还提供断开连接选项,该选项关闭 Remote Control,同时您的本地会话继续在终端中运行。

138 138 

139在重新连接之前读取原因。<span id="session-ended-elsewhere" />当会话从另一个设备、应用或 Claude Code 会话被接管或结束,或服务器找不到它时,原因会说明是哪种情况,Claude Code 会省略其通常的建议来运行 `/remote-control`:139如果连接失败,Claude Code 会显示一条通知,说明失败原因,向对话添加一条带有原因的警告行,并将指示器切换到保留在原位的失败状态。要重新连接,请运行 `/remote-control`,除非[原因说会话在其他地方被接管或结束,或服务器找不到它](#session-ended-elsewhere)。

140 

141在重新连接之前读取原因。当会话从另一个设备、应用或 Claude Code 会话被接管或结束,或服务器找不到它时,原因会说明是哪种情况,Claude Code 会省略其通常的建议来运行 `/remote-control`:

142 

143<span id="session-ended-elsewhere" />

140 144 

141* **另一个设备或 Claude Code 会话接管了会话**:仅当您想从该设备收回它时才运行 `/remote-control`。145* **另一个设备或 Claude Code 会话接管了会话**:仅当您想从该设备收回它时才运行 `/remote-control`。

142* **您从另一个设备或应用结束或存档了会话**:仅当您想要它回来时才运行 `/remote-control`;Claude Code 会重新打开存档的会话。146* **您从另一个设备或应用结束或存档了会话**:仅当您想要它回来时才运行 `/remote-control`;Claude Code 会重新打开存档的会话。


241 245 

242您的本地 Claude Code 会话仅发出出站 HTTPS 请求,从不在您的机器上打开入站端口。当您启动 Remote Control 时,它向 Anthropic API 注册并轮询工作。当您从另一个设备连接时,服务器通过流连接在网络或移动客户端和您的本地会话之间路由消息。246您的本地 Claude Code 会话仅发出出站 HTTPS 请求,从不在您的机器上打开入站端口。当您启动 Remote Control 时,它向 Anthropic API 注册并轮询工作。当您从另一个设备连接时,服务器通过流连接在网络或移动客户端和您的本地会话之间路由消息。

243 247 

244所有流量都通过 Anthropic API 通过 TLS 传输,与任何 Claude Code 会话的传输安全相同。连接使用多个短期凭证,每个凭证的范围限定为单一目的并独立过期。248所有流量都通过 Anthropic API 通过 TLS 传输,与任何 Claude Code 会话的传输安全相同。连接使用多个短期凭证,每个凭证的范围限定为单一目的并独立过期。当 `claude remote-control` 服务器的注册凭证过期时,服务器会再次向 Anthropic API 注册并继续为其会话提供服务。

245 249 

246Remote Control 连接时,会话记录(包括您的消息、Claude 的响应和工具活动)存储在 Anthropic 服务器上。存储的记录保持您的设备之间的对话同步,并让会话在网络中断后重新连接。执行和文件系统访问保留在您的机器上,存储的记录根据[数据使用](/docs/zh-CN/data-usage)政策保留。250Remote Control 连接时,会话记录(包括您的消息、Claude 的响应和工具活动)存储在 Anthropic 服务器上。存储的记录保持您的设备之间的对话同步,并让会话在网络中断后重新连接。执行和文件系统访问保留在您的机器上,存储的记录根据[数据使用](/docs/zh-CN/data-usage)政策保留。

247 251 


518 选择正确的方法522 选择正确的方法

519</h2>523</h2>

520 524 

521Claude Code offers several ways to work when you're not at your terminal. They differ in what triggers the work, where Claude runs, and how much you need to set up.525Claude Code 提供了多种方式在您不在终端时进行工作。它们在触发工作的方式、Claude 运行的位置以及所需的设置量方面有所不同。

522 526 

523| | Trigger | Claude runs on | Setup | Best for |527| | 触发方式 | Claude 运行位置 | 设置 | 最适合 |

524| :------------------------------------------------------- | :--------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------ |528| :---------------------------------------------------------- | :---------------------------------------------------------------- | :--------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------- | :---------------------- |

525| [Dispatch](/docs/en/desktop#sessions-from-dispatch) | Message a task from the Claude mobile app | Your machine (Desktop) | [Pair the mobile app with Desktop](https://support.claude.com/en/articles/13947068) | Delegating work while you're away, minimal setup |529| [Dispatch](/docs/zh-CN/desktop#sessions-from-dispatch) | 从 Claude 移动应用发送任务消息 | 您的机器(Desktop) | [将移动应用与 Desktop 配对](https://support.claude.com/en/articles/13947068) | 在您离开时委派工作,最少设置 |

526| [Remote Control](/docs/en/remote-control) | Drive a running session from [claude.ai/code](https://claude.ai/code) or the Claude mobile app | Your machine (CLI or VS Code) | Run `claude remote-control` | Steering in-progress work from another device |530| [Remote Control](/docs/zh-CN/remote-control) | 从 [claude.ai/code](https://claude.ai/code) 或 Claude 移动应用驱动正在运行的会话 | 您的机器(CLI 或 VS Code) | 运行 `claude remote-control` | 从另一台设备控制进行中的工作 |

527| [Channels](/docs/en/channels) | Push events from a chat app like Telegram or Discord, or your own server | Your machine (CLI) | [Install a channel plugin](/docs/en/channels#quickstart) or [build your own](/docs/en/channels-reference) | Reacting to external events like CI failures or chat messages |531| [Channels](/docs/zh-CN/channels) | 从聊天应用(如 Telegram 或 Discord)或您自己的服务器推送事件 | 您的机器(CLI) | [安装频道插件](/docs/zh-CN/channels#quickstart) 或 [构建您自己的](/docs/zh-CN/channels-reference) | 对外部事件(如 CI 失败或聊天消息)做出反应 |

528| [Slack](/docs/en/slack) | Mention `@Claude` in a team channel | Anthropic cloud | [Install the Slack app](/docs/en/slack#setting-up-claude-code-in-slack) with [Claude Code on the web](/docs/en/claude-code-on-the-web) enabled | PRs and reviews from team chat |532| [Slack](/docs/zh-CN/slack) | 在团队频道中提及 `@Claude` | Anthropic 云 | [安装 Slack 应用](/docs/zh-CN/slack#setting-up-claude-code-in-slack),启用 [Claude Code on the web](/docs/zh-CN/claude-code-on-the-web) | 从团队聊天进行 PR 和审查 |

529| [Self-hosted environments](/docs/en/self-hosted-environments) | Start a [cloud session](/docs/en/claude-code-on-the-web) and pick your organization's environment | Your organization's infrastructure | [Deploy runners](/docs/en/self-hosted-environments-quickstart), on Team and Enterprise plans | Cloud sessions that must run inside your network |533| [Self-hosted environments](/docs/zh-CN/self-hosted-environments) | 启动 [云会话](/docs/zh-CN/claude-code-on-the-web)并选择您组织的环境 | 您组织的基础设施 | [部署运行器](/docs/zh-CN/self-hosted-environments-quickstart),在 Team 和 Enterprise 计划上 | 必须在您的网络内运行的云会话 |

530| [Scheduled tasks](/docs/en/scheduled-tasks) | Set a schedule | [CLI](/docs/en/scheduled-tasks), [Desktop](/docs/en/desktop-scheduled-tasks), or [cloud](/docs/en/routines) | Pick a frequency | Recurring automation like daily reviews |534| [Scheduled tasks](/docs/zh-CN/scheduled-tasks) | 设置计划 | [CLI](/docs/zh-CN/scheduled-tasks)、[Desktop](/docs/zh-CN/desktop-scheduled-tasks) 或 [云](/docs/zh-CN/routines) | 选择频率 | 定期自动化,如每日审查 |

531 535 

532<h2 id="related-resources">536<h2 id="related-resources">

533 相关资源537 相关资源

Details

181 181 

182[Claude Code on the web](/docs/zh-CN/claude-code-on-the-web) 在隔离的、由 Anthropic 管理的虚拟机中运行每个会话。网络代理强制执行默认允许列表,单独的代理在沙箱外保存您的 GitHub 令牌,同时在其内部为存储库访问发出作用域凭据。您的组织路由到[自托管环境](/docs/zh-CN/self-hosted-environments)的会话在您配置的基础设施上运行,其中隔离、出站控制和 git 凭据是您部署的责任。182[Claude Code on the web](/docs/zh-CN/claude-code-on-the-web) 在隔离的、由 Anthropic 管理的虚拟机中运行每个会话。网络代理强制执行默认允许列表,单独的代理在沙箱外保存您的 GitHub 令牌,同时在其内部为存储库访问发出作用域凭据。您的组织路由到[自托管环境](/docs/zh-CN/self-hosted-environments)的会话在您配置的基础设施上运行,其中隔离、出站控制和 git 凭据是您部署的责任。

183 183 

184当您想要完整的虚拟机隔离而无需自己配置基础设施,或当您从没有本地开发环境的设备委派任务时,使用此方法。它需要 Claude 订阅。当您从 Web 界面启动会话时,您还需要一个连接的 GitHub 账户,以便沙箱可以克隆您的存储库。当您使用 `--cloud` 从 CLI 启动时,如果未连接 GitHub,Claude Code 可以[捆绑并上传您的本地存储库](/docs/zh-CN/claude-code-on-the-web#send-local-repositories-without-github)。有关计划可用性和 GitHub 身份验证选项,请参阅 [Claude Code on the web](/docs/zh-CN/claude-code-on-the-web)。184当您想要完整的虚拟机隔离而无需自己配置基础设施,或当您从没有本地开发环境的设备委派任务时,使用此方法。它需要 Claude 订阅。当您从 Web 界面启动会话时,您还需要一个连接的 GitHub 账户,以便沙箱可以克隆您的存储库。当您使用 `--cloud` 从 CLI 启动时,Claude Code 可以[捆绑并上传您的本地存储库](/docs/zh-CN/claude-code-on-the-web#send-local-repositories-without-github)。有关计划可用性和 GitHub 身份验证选项,请参阅 [Claude Code on the web](/docs/zh-CN/claude-code-on-the-web)。

185 185 

186<h2 id="enforce-isolation-across-an-organization">186<h2 id="enforce-isolation-across-an-organization">

187 在整个组织中强制实施隔离187 在整个组织中强制实施隔离

sandboxing.md +6 −0

Details

52 52 

53在面板中选择一个模式时,Claude Code 会将其保存到你的项目的本地设置 `.claude/settings.local.json`,这些设置适用于当前项目。Claude Code 在那里保存设置时会将该文件添加到你的全局 gitignore。要在所有项目中启用沙箱,请在 `~/.claude/settings.json` 的用户设置中将 [`sandbox.enabled`](/docs/zh-CN/settings-reference#sandbox-enabled) 设置为 `true`。要为组织中的每个开发者强制执行沙箱,请使用 [托管设置](#enforce-sandboxing-with-managed-settings)。53在面板中选择一个模式时,Claude Code 会将其保存到你的项目的本地设置 `.claude/settings.local.json`,这些设置适用于当前项目。Claude Code 在那里保存设置时会将该文件添加到你的全局 gitignore。要在所有项目中启用沙箱,请在 `~/.claude/settings.json` 的用户设置中将 [`sandbox.enabled`](/docs/zh-CN/settings-reference#sandbox-enabled) 设置为 `true`。要为组织中的每个开发者强制执行沙箱,请使用 [托管设置](#enforce-sandboxing-with-managed-settings)。

54 54 

55要在一个会话中更改沙箱而不写入设置文件,请使用 [`--settings`](/docs/zh-CN/settings#change-a-setting-for-one-session) 启动 Claude Code。例如,此命令启动一个沙箱化会话,其中 Claude 无法在沙箱外重试被阻止的命令:

56 

57```bash theme={null}

58claude --settings '{"sandbox": {"enabled": true, "allowUnsandboxedCommands": false}}'

59```

60 

55<Warning>61<Warning>

56 默认情况下,如果沙箱因缺少依赖项或不支持的平台而无法启动,Claude Code 会显示警告并在没有沙箱的情况下运行命令。要使其成为硬失败,请将 [`sandbox.failIfUnavailable`](/docs/zh-CN/settings-reference#sandbox-failifunavailable) 设置为 `true`。这适用于需要沙箱作为安全门的托管部署。62 默认情况下,如果沙箱因缺少依赖项或不支持的平台而无法启动,Claude Code 会显示警告并在没有沙箱的情况下运行命令。要使其成为硬失败,请将 [`sandbox.failIfUnavailable`](/docs/zh-CN/settings-reference#sandbox-failifunavailable) 设置为 `true`。这适用于需要沙箱作为安全门的托管部署。

57</Warning>63</Warning>

scheduled-tasks.md +15 −15

Details

8 8 

9计划任务让 Claude 按间隔自动重新运行提示词。使用它们来轮询部署、监督 PR、检查长时间运行的构建,或在会话中稍后提醒自己做某事。要对事件进行实时反应而不是轮询,请参阅 [Channels](/docs/zh-CN/channels):您的 CI 可以直接将失败推送到会话中。要保持会话工作转向转向直到满足条件而不是按间隔,请参阅 [`/goal`](/docs/zh-CN/goal)。9计划任务让 Claude 按间隔自动重新运行提示词。使用它们来轮询部署、监督 PR、检查长时间运行的构建,或在会话中稍后提醒自己做某事。要对事件进行实时反应而不是轮询,请参阅 [Channels](/docs/zh-CN/channels):您的 CI 可以直接将失败推送到会话中。要保持会话工作转向转向直到满足条件而不是按间隔,请参阅 [`/goal`](/docs/zh-CN/goal)。

10 10 

11任务是会话范围的:它们存在于当前对话中,当您启动新对话时就会停止。使用 `--resume` 或 `--continue` 恢复会带回任何尚未[过期](#seven-day-expiry)的任务:在过去 7 天内创建的重复任务,或计划时间尚未到达的一次性任务。对于独立于任何会话而存在的调度,请使用 [Routines](/docs/zh-CN/routines) 在云上创建例程、设置 [Desktop 计划任务](/docs/zh-CN/desktop-scheduled-tasks),或使用 [GitHub Actions](/docs/zh-CN/github-actions)。11任务是会话范围的:它们存在于当前对话中,当您启动新对话时就会停止。使用 `--resume` 或 `--continue` 恢复会带回任何尚未[过期](#seven-day-expiry)的任务,除了[限制](#limitations)下列出的任务。对于独立于任何会话而存在的调度,请使用 [Routines](/docs/zh-CN/routines) 在云上创建例程、设置 [Desktop 计划任务](/docs/zh-CN/desktop-scheduled-tasks),或使用 [GitHub Actions](/docs/zh-CN/github-actions)。

12 12 

13<h2 id="compare-scheduling-options">13<h2 id="compare-scheduling-options">

14 比较调度选项14 比较调度选项

15</h2>15</h2>

16 16 

17Claude Code offers three ways to schedule recurring or one-off work:17Claude Code 提供三种方式来安排定期或一次性工作:

18 18 

19| | [Cloud](/docs/en/routines) | [Desktop](/docs/en/desktop-scheduled-tasks) | [`/loop`](/docs/en/scheduled-tasks) |19| | [Cloud](/docs/zh-CN/routines) | [Desktop](/docs/zh-CN/desktop-scheduled-tasks) | [`/loop`](/docs/zh-CN/scheduled-tasks) |

20| :------------------------- | :---------------------------------- | :------------------------------------- | :------------------------------------------------------------------------- |20| :---------- | :----------------------- | :---------------------------------------- | :--------------------------------------------------------- |

21| Runs on | Cloud, Anthropic-managed by default | Your machine | Your machine |21| 运行位置 | Cloud,默认由 Anthropic 管理 | 您的机器 | 您的机器 |

22| Requires machine on | No | Yes | Yes |22| 需要机器开启 | 否 | 是 | 是 |

23| Requires open session | No | No | Yes |23| 需要打开会话 | 否 | 否 | 是 |

24| Persistent across restarts | Yes | Yes | Restored on `--resume`, with [exceptions](/docs/en/scheduled-tasks#limitations) |24| 重启后持久化 | 是 | 是 | 在 `--resume` 上恢复,有[例外](/docs/zh-CN/scheduled-tasks#limitations) |

25| Access to local files | No (fresh clone) | Yes | Yes |25| 访问本地文件 | 否(新克隆) | 是 | 是 |

26| MCP servers | Connectors configured per task | [Config files](/docs/en/mcp) and connectors | Inherits from session |26| MCP servers | 每个任务配置的连接器 | [配置文件](/docs/zh-CN/mcp)和连接器 | 从会话继承 |

27| Permission prompts | No (runs autonomously) | Configurable per task | Inherits from session |27| 权限提示 | 否(自主运行) | 每个任务可配置 | 从会话继承 |

28| Customizable schedule | Via `/schedule` in the CLI | Yes | Yes |28| 可自定义的计划 | 通过 CLI 中的 `/schedule` | 是 | 是 |

29| Minimum interval | 1 hour | 1 minute | 1 minute |29| 最小间隔 | 1 小时 | 1 分钟 | 1 分钟 |

30 30 

31<Tip>31<Tip>

32 Use **cloud tasks** for work that should run reliably without your machine. Use **Desktop tasks** when you need access to local files and tools. Use **`/loop`** for quick polling during a session.32 对于应该在没有您的机器的情况下可靠运行的工作,使用**云任务**。当您需要访问本地文件和工具时,使用**桌面任务**。对于会话期间的快速轮询,使用 **`/loop`**。

33</Tip>33</Tip>

34 34 

35<h2 id="run-a-prompt-repeatedly-with-/loop">35<h2 id="run-a-prompt-repeatedly-with-/loop">


237 237 

238* 任务仅在 Claude Code 运行且空闲时触发。关闭终端或让会话退出会停止它们触发。[将会话放在后台](/docs/zh-CN/agent-view#from-inside-a-session)会将 `/loop` 任务转移到后台会话,该会话继续运行而无需终端。238* 任务仅在 Claude Code 运行且空闲时触发。关闭终端或让会话退出会停止它们触发。[将会话放在后台](/docs/zh-CN/agent-view#from-inside-a-session)会将 `/loop` 任务转移到后台会话,该会话继续运行而无需终端。

239* 没有错过触发的追赶。如果任务的计划时间在 Claude 忙于长时间运行的请求时经过,它会在 Claude 变为空闲时触发一次,而不是每个错过的间隔触发一次。239* 没有错过触发的追赶。如果任务的计划时间在 Claude 忙于长时间运行的请求时经过,它会在 Claude 变为空闲时触发一次,而不是每个错过的间隔触发一次。

240* 启动新对话会清除所有会话范围的任务。使用 `claude --resume` 或 `claude --continue` 恢复会恢复尚未[过期](#seven-day-expiry)的重复任务和计划时间尚未到达的一次性任务。后台 Bash 和监视器任务在恢复时永远不会被恢复。240* 启动新对话会清除所有会话范围的任务。当您使用 `claude --resume` 或 `claude --continue` 恢复会话时,Claude Code 会恢复使用 `CronCreate` 调度的任务,除了已[过期](#seven-day-expiry)的重复任务和计划时间已经过去的一次性任务。[自定步调的 `/loop`](#let-claude-choose-the-interval)不会被恢复,因此请再次运行 `/loop` 以重新启动它。后台 Bash 和监视器任务在恢复时永远不会被恢复。

241* 当[功能标志获取关闭](/docs/zh-CN/env-vars#features-that-need-feature-flag-fetching)时,Claude Code 会将您要求在会话间保留的任务存储在项目的 `.claude` 目录中。当该目录或其中的任务文件是符号链接时,Claude Code 会返回错误而不是调度任务。241* 当[功能标志获取关闭](/docs/zh-CN/env-vars#features-that-need-feature-flag-fetching)时,Claude Code 会将您要求在会话间保留的任务存储在项目的 `.claude` 目录中。当该目录或其中的任务文件是符号链接时,Claude Code 会返回错误而不是调度任务。

242 242 

243对于需要无人值守运行的 cron 驱动自动化:243对于需要无人值守运行的 cron 驱动自动化:

Details

43* `Marketplace "claude-plugins-official" not found`:使用 `/plugin marketplace add anthropics/claude-plugins-official` 添加市场,然后重试安装。43* `Marketplace "claude-plugins-official" not found`:使用 `/plugin marketplace add anthropics/claude-plugins-official` 添加市场,然后重试安装。

44* 插件 [在市场中找不到](/docs/zh-CN/discover-plugins#install-plugins):检查插件名称。44* 插件 [在市场中找不到](/docs/zh-CN/discover-plugins#install-plugins):检查插件名称。

45 45 

46检查安装摘要。如果它报告 `Run /reload-plugins to activate.`,应用待处理的更改而无需重启:46检查安装摘要。如果它报告 `Run /reload-plugins to activate.`,请参阅 [无需重启即可应用插件更改](/docs/zh-CN/discover-plugins#apply-plugin-changes-without-restarting) 以在当前会话中激活插件。

47 

48```text theme={null}

49/reload-plugins

50```

51 47 

52<h3 id="enable-in-cloud-sessions-and-shared-repositories">48<h3 id="enable-in-cloud-sessions-and-shared-repositories">

53 在云会话和共享存储库中启用49 在云会话和共享存储库中启用

self-hosted-environments.md +164 −0 created

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

10 自托管环境在 Team 和 Enterprise 计划上处于公开测试阶段,默认关闭。请参阅[可用性和限制](#availability-and-limitations)了解启用路径和排除的内容。

11</Note>

12 

13自托管环境在您的组织运营的基础设施上执行 Claude Code 云会话。[云会话](/docs/zh-CN/claude-code-on-the-web)是指在开发者机器以外的任何地方运行的会话:开发者可以从 claude.ai、移动和桌面应用、带有 [`claude --cloud`](/docs/zh-CN/claude-code-on-the-web#from-terminal-to-web) 的终端以及[计划例程](/docs/zh-CN/routines)启动这些会话,默认情况下它们在 Anthropic 的基础设施上执行。在自托管环境中,这些相同的会话在您的网络内执行,开发者体验基本相同,除了[可用性和限制](#availability-and-limitations)中的差异以及部署页面的[已知问题](/docs/zh-CN/self-hosted-environments-deploy#known-issues-and-limitations)。

14 

15如果您的团队不使用云会话,这里没有什么需要配置的:终端或 IDE 中的会话始终在开发者自己的机器上运行。如果您想在自己的常开机器上运行 Claude Code 并从其他设备驱动它,请使用[远程控制](/docs/zh-CN/remote-control),它也可在 Pro 和 Max 计划上使用。当您准备好设置时,直接转到[快速入门](/docs/zh-CN/self-hosted-environments-quickstart);如果您想先审查安全态势,请从[部署到生产](/docs/zh-CN/self-hosted-environments-deploy)开始。本页的其余部分解释自托管的工作原理以及何时选择它。

16 

17<h2 id="how-self-hosted-environments-work">

18 自托管环境如何工作

19</h2>

20 

21自托管有三个部分:

22 

23* **环境**:云会话可以发送到的命名目标。您的组织在 claude.ai 管理员设置中创建环境,每个环境都组织一组运行器。

24* **运行器**:在您网络内的主机上运行的程序。运行器执行会话;其思想与自托管 CI 运行器相同。

25* **会话**:开发者启动的一个 Claude Code 任务。

26 

27当开发者启动云会话时,会话启动 UI 显示一个环境选择器,列出 Anthropic 托管的环境以及您的组织创建的任何环境。如果他们选择您的环境,Anthropic 的控制平面将会话放在您的环境队列上,运行器声称它,克隆开发者选择的存储库,并在您的主机上启动 Claude Code 进程来运行它。运行器使用您配置的凭证向您的 git 主机进行身份验证;[配置 git](/docs/zh-CN/self-hosted-environments-deploy#configure-git)涵盖了这些选项。会话从您网络内部到达您的内部服务,当它是内部的时,也以相同的方式到达您的 git 主机;到 Anthropic 的流量、队列轮询、会话的事件流和模型推理是到 `api.anthropic.com` 的出站 HTTPS,以及会话可以在[网络要求](/docs/zh-CN/self-hosted-environments-deploy#network-requirements)中到达的简短主机列表。Anthropic 从不连接到您的网络。

28 

29<div style={{maxWidth: "640px", margin: "0 auto"}}>

30 <Frame>

31 <img src="https://mintcdn.com/claude-code/Y0sJ2uDoOVbOVZrQ/images/self-hosted-network-paths.svg?fit=max&auto=format&n=Y0sJ2uDoOVbOVZrQ&q=85&s=8056103fc1c5564c7f0ef219d260b99d" className="dark:hidden" alt="自托管环境的架构图:您的网络边界包含一个运行器、其中的两个 Claude Code 会话进程和您的 git 主机,api.anthropic.com 在外部持有队列、会话流和推理。运行器轮询队列并到达 git 主机,每个会话进程打开自己的流、推理和 git 连接,每个连接都是从您的网络出站的,没有入站的。" width="680" height="320" data-path="images/self-hosted-network-paths.svg" />

32 

33 <img src="https://mintcdn.com/claude-code/Y0sJ2uDoOVbOVZrQ/images/self-hosted-network-paths-dark.svg?fit=max&auto=format&n=Y0sJ2uDoOVbOVZrQ&q=85&s=fec6aef3b0740d80eaf6d6a7000a2233" className="hidden dark:block" alt="自托管环境的架构图:您的网络边界包含一个运行器、其中的两个 Claude Code 会话进程和您的 git 主机,api.anthropic.com 在外部持有队列、会话流和推理。运行器轮询队列并到达 git 主机,每个会话进程打开自己的流、推理和 git 连接,每个连接都是从您的网络出站的,没有入站的。" width="680" height="320" data-path="images/self-hosted-network-paths-dark.svg" />

34 </Frame>

35</div>

36 

37图中的两个 Claude Code 框是会话进程:一个运行器同时执行两个会话,达到其配置的容量。运行器一次为一个[所有者](#key-concepts)服务,并在声称其第一个会话时锁定到该所有者,因此检出的代码永远不会在所有者之间混合;[运行器生命周期](#runner-lifecycle)涵盖了这个规则。

38 

39您可以自己启动运行器并保持它们运行,或运行[自动扩展编排器](/docs/zh-CN/self-hosted-environments-configuration#on-demand-runners),这是您托管的第二个进程,它在会话排队时启动运行器;每个运行器在其工作完成时自行退出。无论哪种方式,您都设置一次环境,它会出现在每个支持的表面上的选择器中。

40 

41<h2 id="availability-and-limitations">

42 可用性和限制

43</h2>

44 

45在规划推出之前检查这些:

46 

47* **计划**:Team 和 Enterprise 组织的公开测试版。自托管环境默认关闭;[所有者](/docs/zh-CN/cloud-environments#organization-shared-environments)在[**云环境**管理页面](https://claude.ai/admin-settings/cloud-environments)上打开**允许自托管环境**,这需要为组织启用 [Claude Code on the web](/docs/zh-CN/claude-code-on-the-web)。

48* **零数据保留**:对于启用了[零数据保留](/docs/zh-CN/zero-data-retention)的组织不可用。

49* **模型推理**:会话使用 Anthropic API,推理不能通过 [Amazon Bedrock、Google Cloud 的 Agent Platform、Microsoft Foundry](/docs/zh-CN/third-party-integrations) 或 [LLM 网关](/docs/zh-CN/llm-gateway)路由。

50* **表面**:从 [Claude Code on the web](/docs/zh-CN/claude-code-on-the-web)、移动和桌面应用、[计划例程](/docs/zh-CN/routines)以及终端启动的会话,带有 [`claude --cloud`](/docs/zh-CN/claude-code-on-the-web#from-terminal-to-web) 或 [`--environment` 调度](/docs/zh-CN/self-hosted-environments-testing#run-the-test-loop),可以在自托管环境中运行。[Claude Tag](https://claude.com/docs/claude-tag/overview) 会话也可以在其中运行,但 Claude 还不能在这些会话中使用[访问包](https://claude.com/docs/claude-tag/concepts/glossary#access-bundle)。[Claude Security](/docs/zh-CN/claude-security) 和[代码审查](/docs/zh-CN/code-review)会话还不能路由到它们。对这两个表面的支持将单独跟进。

51* **存储库**:会话从 GitHub 检出存储库;请参阅 [GitHub 身份验证选项](/docs/zh-CN/claude-code-on-the-web#github-authentication-options)。

52* **计费**:自托管环境中的会话消耗您的组织的 Claude Code 使用情况,与 Anthropic 托管环境中的会话相同。

53 

54<h2 id="why-self-host">

55 为什么选择自托管

56</h2>

57 

58大多数团队由 Anthropic 托管的环境更好地服务,这不需要基础设施来运行或维护。自托管适用于网络、工具或合规要求要求在其控制的基础设施上保持会话执行的团队。如果是这样,请为其承载的运营所有权做好计划:您构建和维护运行器镜像、运营舰队并控制其网络。

59 

60作为交换,自托管为您提供网络访问、自定义工具和合规控制:

61 

62* **网络访问**:会话在您的网络内运行,可以到达内部服务、数据库和注册表,而无需将它们暴露给公网

63* **自定义工具**:在您的运行器镜像中预安装编译器、SDK 和内部 CLI,以便每个会话都准备好构建

64* **合规**:存储库检出和构建工件保留在您控制的基础设施上。会话内容仍然发送到 `api.anthropic.com` 进行模型推理。

65 

66<h2 id="environments-runners-and-sessions">

67 环境、运行器和会话

68</h2>

69 

70环境在 claude.ai 管理员设置中的**云环境**页面上管理;运行器是您在自己的基础设施上启动和管理的进程。

71 

72<h3 id="key-concepts">

73 关键概念

74</h3>

75 

76这些术语在整个自托管页面中出现:

77 

78| 术语 | 它是什么 |

79| :--- | :--------------------------------------------------------------------------------------------- |

80| 环境 | 您的运行器的命名组,在 claude.ai 设置中创建。会话被路由到环境,而不是单个运行器。 |

81| 环境密钥 | 运行器用来向环境进行身份验证和注册的单个共享凭证。在环境创建时显示一次,在管理 UI 中标记为**环境密钥**。 |

82| 运行器 | 您部署的长期进程。运行器向环境注册、接收运行器令牌并轮询会话。 |

83| 会话 | 一个 Claude Code 任务,从 claude.ai、移动应用或其他 Anthropic 表面(如计划例程或代理)启动。每个会话作为运行器生成的子 Claude Code 进程运行。 |

84 

85在 API 字段、令牌声明和指标名称中,环境显示为 `pool`,环境 ID 是 `pool_id`。[参考](/docs/zh-CN/self-hosted-environments-reference)映射两个拼写,包括已弃用的 `pool` 标志名称。

86 

87运行器一次为一个所有者服务。运行器拾取的第一个会话将运行器锁定到该会话的所有者,然后运行器仅为该所有者运行会话,达到配置的容量。所有者是谁取决于会话如何启动:

88 

89* **用户启动的会话**:所有者是该用户的帐户。

90* **Claude Tag 频道会话**:Claude 运行它们时没有附加用户帐户,因此所有者是启动会话的 [Claude Tag 代理](https://claude.com/docs/claude-tag/concepts/glossary#agent-identity)。该代理启动的每个频道会话都有相同的所有者,无论谁发送了 Slack 消息,因此当您在 `--capacity` 大于 1 或正 `--drain-grace-sec` 时运行它时,锁定到它的运行器为不同的人启动的会话服务。锁定到用户的运行器永远不会拾取这些,锁定到 Claude Tag 代理的运行器永远不会拾取用户的会话。

91 

92因此,最小舰队大小是您期望同时活跃的所有者数量,计算用户和 Claude Tag 代理。

93 

94<h3 id="session-lifecycle">

95 会话生命周期

96</h3>

97 

98当开发者启动会话并选择您的环境时,Anthropic 的控制平面将会话放在环境的队列上。从那里:

99 

1001. 具有可用容量的运行器声称会话并对其持有租约。

1012. 运行器将存储库克隆到其工作目录中并生成子 Claude Code 进程。

1023. 子进程通过 HTTPS 流回事件,而运行器继续轮询;每次轮询刷新租约并充当心跳。

1034. 如果运行器停止轮询约 60 秒,服务器会将会话重新排队给另一个运行器。

104 

105运行器给每个轮询请求 10 秒。当请求超时、丢失或获得运行器无法解析的响应时,运行器继续为其活跃会话服务,并在一两秒后重试,而不是等待下一个计划的轮询。例如,一个拦截代理用自己的页面回答轮询会产生运行器无法解析的响应。每次另一个请求以这些方式之一失败时,运行器会将下一次重试前的间隔加倍,最多 20 秒,并在租约即将过期时缩短间隔。

106 

107<h3 id="runner-lifecycle">

108 运行器生命周期

109</h3>

110 

111运行器拾取的第一个会话将运行器锁定到该会话的所有者,运行器为该所有者运行最多 `--capacity` 个并发会话。当运行器有活跃会话且未收到关闭信号或达到其退休时间时,运行器继续声称锁定所有者的排队工作。一旦它们完成会发生什么取决于 [`--drain-grace-sec`](/docs/zh-CN/self-hosted-environments-reference#runner-cli-flags):

112 

113* **在默认值 `0` 处**:运行器在其活跃会话完成后立即退出,不轮询更多,因此您部署它的编排器(如 Kubernetes)可以用新鲜磁盘重启它,准备为任何所有者服务。

114* **在正值处**:运行器在退出前继续轮询锁定所有者的队列那么多秒。

115 

116这个生命周期隔离了每个所有者的检出代码,而无需运行器在所有者之间删除磁盘状态。

117 

118您的基础设施停止运行器的方式决定了您是否需要 `--retire-at`。传递 `SIGTERM` 的杀死不需要标志:运行器按照[关闭时序](/docs/zh-CN/self-hosted-environments-deploy#shutdown-timing)描述的方式排水,或当您设置 [`--defer-shutdown-max-min`](/docs/zh-CN/self-hosted-environments-deploy#defer-the-drain-past-the-first-signal) 时保持为其已持有的会话服务。如果您的基础设施改为在已知的挂钟时间销毁主机而不发送信号,或者宽限期太短而无法排水,例如沙箱生命周期上限或现场实例回收,请传递 `--retire-at <epoch-seconds>` 设置为该时间前几分钟。在退休时间:

119 

1201. 运行器停止接受新工作。

1212. 运行器通过 [`--release-idle-session-min`](/docs/zh-CN/self-hosted-environments-reference#runner-cli-flags) 标志使用的相同释放路径释放每个活跃会话,因此当用户发送下一条消息时,会话在新运行器上恢复。运行器何时释放每个会话取决于其状态:

122 * 运行器在会话中途转时立即释放它。

123 * 当转完成并留下后台任务运行时,运行器等待最多 60 秒,然后释放会话,即使它们仍在运行。如果任务已完成但读取其结果的后续转还未运行,运行器保持会话直到该转完成,并等待不超过 [`SELF_HOSTED_RUNNER_BG_RESULT_GRACE_MS`](/docs/zh-CN/self-hosted-environments-reference#environment-variable-only-settings) 以便该转开始。

1243. 运行器在所有会话都被释放后以 0 退出。

125 

126超过杀死的转仍然丢失;[关闭时序](/docs/zh-CN/self-hosted-environments-deploy#shutdown-timing)涵盖了调整边距的大小。没有 `--retire-at`,无信号主机杀死与崩溃无法区分:控制平面记录丢失的工作者而不是干净释放,会话重新排队给另一个运行器。

127 

128<h3 id="network-paths">

129 网络路径

130</h3>

131 

132运行器及其会话进行多种出站连接,不需要来自 Anthropic 的入站连接:

133 

134* **控制平面**:运行器轮询 `api.anthropic.com` 以获取工作并发布设置进度和失败事件,全部出站 HTTPS。轮询充当运行器的心跳。

135* **SCM 连接器**:可选的编排器 [SCM 连接器](/docs/zh-CN/self-hosted-environments-reference#scm-connector-flags)隧道是唯一的 WebSocket 连接。

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。

137* **会话子进程**:子 Claude Code 进程将会话的事件流保持到 `api.anthropic.com`,并为模型推理和会话期间运行的 git 命令进行自己的出站调用。请参阅[网络要求](/docs/zh-CN/self-hosted-environments-deploy#network-requirements)了解完整的出站列表。[上面的图](#how-self-hosted-environments-work)显示了这些路径,除了可选的 SCM 连接器。

138 

139模型推理使用 Anthropic API。控制平面将 API 端点传递给每个会话,会话使用 Anthropic 颁发的会话范围的 OAuth 令牌进行身份验证,因此推理不能在自托管环境中通过 [Amazon Bedrock、Google Cloud 的 Agent Platform、Microsoft Foundry](/docs/zh-CN/third-party-integrations) 或 [LLM 网关](/docs/zh-CN/llm-gateway)路由。

140 

141支持企业出站代理。运行器和可选的[自动扩展编排器](/docs/zh-CN/self-hosted-environments-configuration#on-demand-runners)遵守[网络配置](/docs/zh-CN/network-config)中描述的代理和 mTLS 环境变量,例如 `HTTPS_PROXY` 和 `NO_PROXY`;在每个进程的环境中设置它们。这些变量涵盖控制平面调用、编排器的 [SCM 连接器](/docs/zh-CN/self-hosted-environments-reference#scm-connector-flags) WebSocket 和 HTTPS 远程的内置克隆,会话从运行器继承它们。会话流使用 HTTPS 上的服务器发送事件,因此路径中的代理不能缓冲响应。

142 

143如果您的代理还需要 `Proxy-Authorization` 标头,运行器可以将其添加到它打开到代理的每个连接;请参阅[向出站代理进行身份验证](/docs/zh-CN/self-hosted-environments-deploy#authenticate-to-an-egress-proxy)。

144 

145<h2 id="what-stays-on-your-infrastructure">

146 保留在您的基础设施上的内容

147</h2>

148 

149存储库检出、构建工件、密钥和会话创建或修改的任何文件保留在您配置的机器上。对话本身,包括提示、响应和工具结果,发送到 `api.anthropic.com` 进行模型推理,Anthropic 存储会话记录,以便您可以从另一个[支持的表面](#availability-and-limitations)恢复会话。

150 

151自托管环境将会话执行移到您的网络中。控制平面仍然是 Anthropic 托管的:会话编排、队列和 claude.ai 界面继续在 Anthropic 的基础设施上运行。

152 

153<h2 id="get-started">

154 开始使用

155</h2>

156 

157自托管环境页面按您正在做的事情组织:

158 

159* [快速入门](/docs/zh-CN/self-hosted-environments-quickstart):安装 Claude Code、创建环境、启动运行器并路由您的第一个会话

160* [部署到生产](/docs/zh-CN/self-hosted-environments-deploy):安全加固、网络出站、git 凭证、Kubernetes 和 Compose 配方、已知问题和故障排除

161* [自定义会话](/docs/zh-CN/self-hosted-environments-configuration):每个会话凭证的包装脚本、生命周期钩子、按需运行器、MCP 服务器和权限

162* [端到端测试](/docs/zh-CN/self-hosted-environments-testing):CI 烟雾测试,在您推广运行器镜像之前验证它

163* [参考](/docs/zh-CN/self-hosted-environments-reference):每个 CLI 标志、环境变量、指标和健康端点

164* [验证会话身份](/docs/zh-CN/self-hosted-environments-identity):在授予访问权限之前从您自己的服务验证会话令牌

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> 使用包装脚本在自托管环境会话中自定义每个会话的凭证、生命周期钩子和按需运行程序生成。

8 

9<Note>

10 自托管环境在 Team 和 Enterprise 计划中处于公开测试阶段;[Owner](/docs/zh-CN/cloud-environments#organization-shared-environments) 通过在 [**Cloud environments** 管理页面](https://claude.ai/admin-settings/cloud-environments) 上打开 **Allow self-hosted environments** 来启用它们。本页面假设您已有一个正常运行的运行程序;有关设置,请参阅 [quickstart](/docs/zh-CN/self-hosted-environments-quickstart),有关 fleet recipes,请参阅 [Deploy to production](/docs/zh-CN/self-hosted-environments-deploy)。

11</Note>

12 

13[self-hosted environment](/docs/zh-CN/self-hosted-environments) 在您自己的基础设施上运行 Claude Code [cloud sessions](/docs/zh-CN/claude-code-on-the-web),由您部署的运行程序进程执行。在没有配置的情况下,该运行程序克隆会话的存储库,生成 Claude Code,然后进行清理。本页面适用于操作运行程序的平台工程师:它涵盖了当这些默认值不适用时的扩展点,从每个会话的凭证配置到完全替换检出。包装脚本和钩子作为运行程序主机上的可执行文件运行,该主机是 Linux 或 macOS,本页面上的示例假设使用 POSIX shell。

14 

15本页面上的一些钩子环境变量仍然使用 `pool`,例如 `CLAUDE_RUNNER_POOL_ID`;CLI 标志和环境变量名称使用 `environment`,例如 `--environment-secret-file`。

16 

17<h2 id="wrapper-scripts">

18 包装脚本

19</h2>

20 

21当每个会话需要运行器无法自行完成的设置时,使用包装脚本:为会话创建者配置作用域的短期凭证、导出特定于环境的密钥、准备语言工具链或围绕子进程应用资源限制。运行器每个会话启动一次您的包装脚本,而不是 Claude Code 二进制文件。通过 `exec` 进入 `$CLAUDE_RUNNER_CLAUDE_BIN`(运行器自己的二进制文件)来结束包装脚本,以便信号和退出代码正确传播。

22 

23启动运行器时,使用 `--exec-path` 或 `SELF_HOSTED_RUNNER_EXEC_PATH` 指向包装脚本:

24 

25```bash theme={null}

26claude self-hosted-runner --environment-secret-file /etc/claude/environment-secret --exec-path /etc/claude/session-wrapper.sh

27```

28 

29运行器在包装脚本的环境中设置以下内容:

30 

31| 变量 | 描述 |

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

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` 声明中预先提取,无需签名验证。适合用于标记,例如提交预告片。当电子邮件控制凭证发放时,验证令牌并从中读取声明;请参阅 [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 在会话创建时记录该值一次,因此包装脚本和每个生命周期钩子都看到相同的值。仅将其用于采用分析和标记,不用作授权信号。当会话没有记录或识别的表面时未设置,因此在 `set -u` 下将其引用为 `${CLAUDE_RUNNER_CLIENT_PLATFORM:-}`。需要 Claude Code v2.1.229 或更高版本。 |

36| `CLAUDE_RUNNER_CLAUDE_BIN` | 运行器自己的 Claude Code 二进制文件的绝对路径。使用 `exec "$CLAUDE_RUNNER_CLAUDE_BIN" "$@"` 结束您的包装脚本,以移交到固定的二进制文件,而无需硬编码安装路径。 |

37| `CLAUDE_CODE_REMOTE_SESSION_ID` | 会话 ID,采用标记的 `cse_...` 形式。这与[生命周期钩子](#lifecycle-hooks)以 `session_...` 形式在 `CLAUDE_RUNNER_SESSION_ID` 中看到的是同一个会话;UUID 变量在两者之间匹配,将 `cse_` 前缀替换为 `session_` 会产生会话 URL 中显示的 ID。 |

38| `CLAUDE_CODE_REMOTE_SESSION_UUID` | 相同的会话 ID,采用规范 UUID 形式。 |

39| `CLAUDE_SESSION_INGRESS_TOKEN_FILE` | 绝对路径,指向保存当前会话 JWT 的按会话文件,在令牌刷新时保持最新。Shell 子进程在下载用户添加到会话的附件时从中读取其 `Authorization` 标头。`exec` 自动保留该变量;重建子进程环境的包装脚本必须携带该变量,否则附件下载会无声地停止工作。 |

40| `CLAUDE_CONFIG_DIR` | 按会话 Claude 配置目录,在会话启动时从运行器在启动时捕获的运行器主机配置快照中写入;请参阅 [Permissions and tool approval](#permissions-and-tool-approval)。此处的写入仅限于此会话。 |

41| `ANTHROPIC_BASE_URL` | 子进程将使用的 API 基础 URL,由控制平面按会话交付,通常为 `https://api.anthropic.com`。不要覆盖它:会话的推理凭证是 Anthropic 颁发的 OAuth 令牌,其他提供者不接受,因此自托管环境中的推理无法路由到其他地方。 |

42| `CLAUDE_CODE_OAUTH_TOKEN` | 子进程用于模型推理的短期 OAuth 访问令牌,作用域仅限于模型推理和文件上传,生命周期约为 30 分钟。运行器在过期前重新生成它,并通过子进程的 stdin 交付轮换,因此不 [keep stdin attached](#keep-stdin-and-file-descriptor-3-attached) 的包装脚本只看到初始值。不要依赖您的组织 IP 允许列表来限制此令牌的使用:将其视为持有者凭证,如果泄露,大约 30 分钟内仍可使用,不要记录它、写入磁盘或在会话容器外转发它。 |

43 

44包装脚本还继承子进程的其余托管环境,包括任何服务器提供的环境变量。`exec` 自动传播所有内容;如果您的包装脚本以其他方式生成子进程,请转发完整环境。

45 

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

47 保持 stdin 和文件描述符 3 的连接

48</h3>

49 

50子进程的 stdin 是运行器的控制通道。令牌轮换和会话结束信号在其上到达。运行器还在文件描述符 3 上打开一个管道,并从中读取子进程的活动信号以驱动空闲和启动超时。普通的 `exec "$CLAUDE_RUNNER_CLAUDE_BIN" "$@"` 自动保留两者。

51 

52如果您的包装脚本使用裸 `&` 在后台运行子进程,它会切断子进程的 stdin:会话看起来健康,直到初始 OAuth 令牌的大约 30 分钟生命周期过期,然后每个 API 调用都失败,出现 `401 authentication_error`。如果您的包装脚本必须在后台运行子进程,例如保持拆卸陷阱活跃,请在文件描述符 4 或更高版本上保存 stdin 并显式重新连接它:

53 

54```bash theme={null}

55exec 4<&0

56"$CLAUDE_RUNNER_CLAUDE_BIN" "$@" <&4 4<&- &

57CHILD=$!

58trap 'teardown' EXIT

59wait "$CHILD"

60```

61 

62不要在包装脚本中关闭或重用文件描述符 3。重定向子进程的 stdout 和 stderr 是可以的。

63 

64<h3 id="provision-credentials-scoped-to-the-session-creator">

65 配置作用域限定为会话创建者的凭证

66</h3>

67 

68使用 `decode-token` 子命令从会话 JWT 读取声明。它从参数、`CLAUDE_CODE_SESSION_ACCESS_TOKEN` 或 stdin 读取令牌,按该顺序;请参阅 [Verify the token inside the session](/docs/zh-CN/self-hosted-environments-identity#verify-the-token-inside-the-session) 了解它检查的内容。下面的示例解码创建者身份,将其交换为短期 AWS 凭证,并 exec 进入 Claude Code:

69 

70```bash theme={null}

71#!/bin/bash

72# Key on the stable Anthropic user ID and require a human creator.

73CREATOR_SUB=$("$CLAUDE_RUNNER_CLAUDE_BIN" self-hosted-runner decode-token \

74 | jq -re '.act.sub // "" | select(startswith("user:"))') \

75 || { echo "decode-token: verification failed or no human creator" >&2; exit 1; }

76 

77creds=$(your-sts-helper assume-role --subject "$CREATOR_SUB") \

78 || { echo "credential exchange failed" >&2; exit 1; }

79eval "$creds"

80 

81exec "$CLAUDE_RUNNER_CLAUDE_BIN" "$@"

82```

83 

84在提取的声明控制身份验证决策时,使用 `jq -re` 而不是 `jq -r`,以便缺失的声明以非零状态退出,而不是将字面字符串 `null` 传递给下游。由组织服务身份(例如机器人和代理会话)创建的会话携带 `agent:` 主题而不是 `user:`,因此此示例拒绝它们;如果您的环境为这些会话提供服务,请明确决定包装脚本是否为它们回退到默认凭证,而不是退出。当您的凭证交换需要 SSO 主题或电子邮件时,读取 `.act.attested_by.sub` 或 `.act.email` 并处理它们的缺失:令牌仅在创建表面记录它们时才携带它们,[CLI 分派的会话](/docs/zh-CN/self-hosted-environments-testing#run-the-test-loop) 可能两者都缺少。有关完整的声明参考和来自运行器外部服务的验证,请参阅 [Verify session identity](/docs/zh-CN/self-hosted-environments-identity)。

85 

86<h2 id="lifecycle-hooks">

87 生命周期钩子

88</h2>

89 

90生命周期钩子用您自己的脚本替换运行器按会话管道的阶段。使用 `--hooks-dir <path>` 或 `SELF_HOSTED_RUNNER_HOOKS_DIR` 将运行器指向钩子目录。运行器查找具有众所周知名称的可执行文件;任何不存在的钩子都会回退到内置行为,因此您只需编写需要的钩子。钩子以运行器自己的权限运行,会话子进程共享该 UID,因此请以只读方式挂载钩子目录,或将其烘焙到镜像中,以便会话代码无法修改它;请参阅 [hardening section](/docs/zh-CN/self-hosted-environments-deploy#harden-your-deployment)。

91 

92这些钩子不同于 [Claude Code hooks](/docs/zh-CN/hooks),后者在会话内运行;生命周期钩子在运行器上运行,围绕会话。

93 

94<h3 id="checkout">

95 checkout

96</h3>

97 

98每个存储库运行一次,代替运行器的内置克隆和获取。使用钩子从读通镜像克隆、从存档为工作树设置种子或应用按会话 git 身份验证。运行器设置:

99 

100| 变量 | 描述 |

101| :--------------------------------- | :--------------------------------------------------------------------- |

102| `CLAUDE_RUNNER_REPO_URL` | 要克隆的存储库 URL,在应用任何 `--git-host-rewrite` 和 `--git-ssh-rewrite` 之后 |

103| `CLAUDE_RUNNER_REPO_REF` | 要检出的修订版本:分支、标签或提交 SHA,如会话请求的那样。空表示存储库的默认分支。 |

104| `CLAUDE_RUNNER_CHECKOUT_PATH` | 必须留下工作树的绝对路径 |

105| `CLAUDE_RUNNER_SESSION_ID` | 会话 ID,采用标记的 `session_...` 形式,用于日志记录和关联 |

106| `CLAUDE_RUNNER_SESSION_UUID` | 相同的会话 ID,采用规范 UUID 形式 |

107| `CLAUDE_RUNNER_API_BASE_URL` | Anthropic API 基础 URL,用于会话范围的调用 |

108| `CLAUDE_RUNNER_CLIENT_PLATFORM` | 创建会话的客户端表面,例如 `web_claude_ai`、`desktop_app` 或 `ios`。当会话没有记录或识别的表面时未设置。 |

109| `CLAUDE_CODE_SESSION_ACCESS_TOKEN` | 会话访问令牌,用于会话范围的 API 调用 |

110 

111脚本必须在 `CLAUDE_RUNNER_CHECKOUT_PATH` 处留下一个工作树,检出到请求的修订版本。分离的 HEAD 是可以的;运行器在其上创建会话的工作分支。运行器之后验证路径包含 `.git`;如果您的钩子具体化非 git 源(例如 Perforce 或解包的 tarball),请在运行器的环境中设置 `CLAUDE_RUNNER_SKIP_GIT_VERIFY=1` 以跳过该检查。基于 Git 的流程(例如工作分支创建和推送结果)需要 git 检出,因此使用 [`post-session` 钩子](#post-session) 从非 git 树导出结果。

112 

113运行器不会将 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`)也是一个选项。

114 

115当钩子以非零状态退出,或以 0 退出但没有留下可用的检出时,运行器的行为取决于存储库:

116 

117* **会话推送结果的存储库**:运行器失败会话,在非零退出时将脚本的 stderr 尾部呈现给用户。

118* **会话仅从中读取的存储库**,例如添加到运行会话的存储库:运行器记录带有失败详情的 `[runner:warn]` 行,向会话发布 `Skipped` 步骤,删除钩子在检出路径处留下的任何内容,并继续处理其余存储库。当运行器无法立即删除路径时,它会在会话结束时重试删除。如果跳过使会话完全没有存储库,运行器仍然会失败会话。

119 

120在 v2.1.228 之前,运行器对任何存储库的钩子失败都会失败会话,因此钩子无法提供的只读存储库在会话恢复到的每个新运行器上再次失败会话。

121 

122运行器在会话结束后删除检出路径。

123 

124<h3 id="post-session">

125 post-session

126</h3>

127 

128每个会话运行一次,在 Claude Code 子进程退出后和运行器拆卸工作区之前。此钩子是保存未提交工作的唯一机会:在 `--capacity` 高于 1 时,运行器在钩子返回后立即删除按会话工作树,在 `--capacity 1` 时重用的 [canonical clone](/docs/zh-CN/self-hosted-environments-deploy#reuse-a-pre-warmed-checkout) 在下一个会话启动时硬重置,因此未提交的跟踪更改在两条路径上都不会存活。典型用途是推送未提交更改的快照分支、存档日志或向您自己的系统发出会话结束事件。

129 

130钩子在每个会话结束时触发,其中生成了子进程,无论原因如何;下面的 `CLAUDE_RUNNER_EXIT_REASON` 值枚举了这些情况。当运行器突然终止时(例如 VM 抢占或断电)它无法触发;如果您需要针对突然终止的保证,请改为使用 Claude Code `PostToolUse` 钩子从会话内定期快照。运行器设置:

131 

132| 变量 | 描述 |

133| :--------------------------------- | :--------------------------------------------------------------------------------------------------- |

134| `CLAUDE_RUNNER_SESSION_ID` | 会话 ID,采用标记的 `session_...` 形式 |

135| `CLAUDE_RUNNER_SESSION_UUID` | 相同的会话 ID,采用规范 UUID 形式 |

136| `CLAUDE_RUNNER_EXIT_REASON` | 会话如何结束;请参阅表下方的值 |

137| `CLAUDE_RUNNER_WORKSPACE_PATHS` | 会话工作树的冒号分隔绝对路径。对于零存储库会话为空。 |

138| `CLAUDE_RUNNER_DEBUG_LOG_PATH` | 会话的调试日志的路径,在钩子运行时仍在磁盘上 |

139| `CLAUDE_RUNNER_API_BASE_URL` | Anthropic API 基础 URL,用于会话范围的调用 |

140| `CLAUDE_RUNNER_CLIENT_PLATFORM` | 创建会话的客户端表面,例如 `web_claude_ai`、`desktop_app` 或 `ios`。当会话没有记录或识别的表面时未设置。需要 Claude Code v2.1.229 或更高版本。 |

141| `CLAUDE_CODE_SESSION_ACCESS_TOKEN` | 会话访问令牌,用于会话范围的 API 调用 |

142 

143`CLAUDE_RUNNER_EXIT_REASON` 采用四个值之一:

144 

145* `completed`:会话干净地结束。Claude Code 进程正常退出,或会话在仍在运行时被存档或删除。

146* `failed`:Claude Code 进程崩溃,或在启动后设置失败。

147* `interrupted`:运行器停止了会话。它释放了会话以释放插槽、会话在启动时超时、服务器将会话移出此运行器、运行器正在排空,或会话超过了其 [`--kill-session-after-min`](/docs/zh-CN/self-hosted-environments-reference#runner-cli-flags) 限制。

148* `abandoned`:为另一个运行器声称的会话保留。钩子目前在这种情况下不触发。

149 

150[session lifecycle counters](/docs/zh-CN/self-hosted-environments-reference#session-lifecycle-counter-semantics) 将释放、启动超时和服务器移动计为 `completed` 而不是 `interrupted`,因为运行器干净地交还了插槽。如果您将钩子收据与计数器进行比较,请预期这种差异。

151 

152钩子的退出状态永远不会影响会话结果;失败被记录并忽略。运行器在每个会话结束(包括运行器关闭)时等待最多 `--post-session-hook-timeout-sec`(默认 60 秒)。此示例将未提交的工作保存到救援分支:

153 

154```bash theme={null}

155#!/usr/bin/env bash

156set -u

157IFS=':'

158# Pin config the session could have planted in the checkout's .git/config:

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

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

161# privileges. Repo-local credential.helper, core.sshCommand, and pushurl

162# still apply; if the hook holds credentials the session didn't, pin the

163# push URL and helper too (see the note below the script).

164g() { git -c core.fsmonitor=false -c core.hooksPath=/dev/null \

165 -c commit.gpgsign=false "$@"; }

166for ws in $CLAUDE_RUNNER_WORKSPACE_PATHS; do

167 cd "$ws" 2>/dev/null || continue

168 [ -z "$(g status --porcelain 2>/dev/null)" ] && continue

169 g add -A

170 g commit -q -m "runner snapshot: $CLAUDE_RUNNER_SESSION_ID ($CLAUDE_RUNNER_EXIT_REASON)" || continue

171 g push -q origin "HEAD:refs/heads/rescue/$CLAUDE_RUNNER_SESSION_ID" || true

172done

173```

174 

175钩子使用运行器主机上其自己环境中可用的任何 git 凭证进行推送。在 [no-credentials-in-the-image posture](/docs/zh-CN/self-hosted-environments-deploy#configure-git) 下,包括当内置克隆通过 Anthropic git 代理时,没有凭证,因此在推送前在钩子内生成短期推送凭证:将钩子在 `CLAUDE_CODE_SESSION_ACCESS_TOKEN` 中接收的会话令牌与您自己的令牌服务交换,如 [Verify session identity](/docs/zh-CN/self-hosted-environments-identity) 所述进行验证,然后让您的凭证服务为令牌的 `act` 声明中的身份发放短期推送凭证。当钩子持有会话没有的凭证时,也要固定它推送的位置:将 `origin` 替换为操作员提供的 URL,并传递 `-c credential.helper=` 加上您自己的助手,以便会话写入的 repo-local 配置无法重定向凭证推送。

176 

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

178 运行器释放会话时的钩子时序

179</h4>

180 

181已释放的会话可以在另一个运行器上恢复。在 v2.1.236 或更高版本的运行器上,会话在释放时所做的事情决定了它是否可以在此钩子完成前在另一个运行器上恢复:

182 

183* **在轮次后空闲,或在启动时超时**:运行器停止子进程并运行此钩子至完成。只有这样它才会释放会话。在钩子运行时发送的用户消息无法在钩子完成前在另一个运行器上恢复会话。

184* **等待用户回答提示,例如权限提示**:运行器首先释放会话,然后运行此钩子。在钩子运行时发送的用户消息可以在钩子完成前在另一个运行器上恢复会话。

185 

186这适用于运行器释放会话的任何时候:在空闲超时、在 [`--retire-at`](/docs/zh-CN/self-hosted-environments-reference#runner-cli-flags) 时间,以及 在 v2.1.260 或更高版本的运行器上,在会话的 [`--kill-session-after-min`](/docs/zh-CN/self-hosted-environments-reference#runner-cli-flags) 限制。其轮次已结束且仅持有后台任务的会话在此处计为空闲。在 v2.1.236 之前,运行器在两种情况下都首先释放会话,然后运行此钩子。

187 

188在 `SIGTERM` 排空期间,运行器持有会话租约直到钩子完成;请参阅 [Shutdown timing](/docs/zh-CN/self-hosted-environments-deploy#shutdown-timing)。

189 

190<h3 id="command">

191 command

192</h3>

193 

194每个会话在检出后运行一次,代替内置子进程生成。钩子接收与 [wrapper script](#wrapper-scripts) 相同的环境,应该以相同的方式 `exec` 进入 `"$CLAUDE_RUNNER_CLAUDE_BIN"`。使用 `command` 钩子将所有自定义保留在一个钩子目录中;当包装脚本在其他地方时使用 `--exec-path`。如果也设置了 `--exec-path`,标志优先,`command` 钩子被忽略。

195 

196始终 `exec` 运行器自己的二进制文件,而不是 PATH 解析的 `claude`;否则您会破坏 [version pinning](/docs/zh-CN/self-hosted-environments-deploy#pin-the-version)。

197 

198<h2 id="on-demand-runners">

199 按需运行器

200</h2>

201 

202您可以为每个会话启动一个运行器,而不是运行固定的队列。编排器是一个单独的、无状态的子命令,它轮询 Anthropic 以获取生成请求(每个没有可用运行器的排队会话一个),并为每个运行您的 `spawn-runner` 钩子。您的钩子向您的平台提交工作负载:Kubernetes Job、EC2 实例、Nomad dispatch。

203 

204按需运行器改进了凭证卫生。在固定队列上,环境密钥存在于每个运行器主机上,这是运行用户会话的同一主机。使用编排器,环境密钥仅保留在编排器主机上,该主机从不运行用户代码;每个生成的运行器接收一个单次使用的工作单,恰好注册一个运行器,然后过期。

205 

206要启动编排器,请传递环境密钥和包含可执行 `spawn-runner` 脚本的钩子目录:

207 

208```bash theme={null}

209claude self-hosted-runner orchestrator \

210 --environment-secret-file /etc/claude/environment-secret \

211 --hooks-dir /etc/claude/hooks

212```

213 

214编排器在轮询之间保持无状态,因此您可以针对同一环境运行两个或多个副本以实现可用性。每个生成请求由服务器端的恰好一个副本声称。所有副本必须使用相同的 `--expected-spawn-seconds` 值;请参阅 [hook contract](#the-spawn-runner-hook)。

215 

216<h3 id="the-spawn-runner-hook">

217 spawn-runner 钩子

218</h3>

219 

220编排器为每个生成请求运行一次 `${hooks-dir}/spawn-runner`。钩子必须异步提交工作,不等待运行器启动,并在 `--hook-timeout`(默认 60 秒)内返回。钩子接收:

221 

222| 变量 | 描述 |

223| :------------------------------------ | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

224| `CLAUDE_RUNNER_WORK_ORDER_FILE` | 包含新运行器注册的已签名工作单 JWT 的临时文件的路径。钩子退出后删除。不要记录文件的内容。 |

225| `CLAUDE_RUNNER_ORDER_ID` | 不透明的幂等性密钥,每个生成请求唯一,对 Kubernetes 资源名称安全。将其用作您的配置器的去重密钥。 |

226| `CLAUDE_RUNNER_SESSION_ID` | 此请求所针对的会话。对于预热请求为空,当设置 [`--min-idle`](/docs/zh-CN/self-hosted-environments-reference#orchestrator-cli-flags) 时启动待命运行器,在任何特定会话之前,因此不要假设变量已设置。 |

227| `CLAUDE_RUNNER_SESSION_UUID` | 相同的会话 ID,采用规范 UUID 形式。对于预热请求为空。 |

228| `CLAUDE_RUNNER_ATTEMPT` | 此会话已有多少个生成请求。对于预热请求为 `0`。 |

229| `CLAUDE_RUNNER_ORDER_SERVER_TIME` | 来自轮询响应的 HTTP `Date` 标头的服务器时间。当钩子验证工作单 JWT 的 `exp` 时,与此值进行比较而不是本地时钟,以容忍时钟偏差。当网关省略标头时为空。 |

230| `CLAUDE_RUNNER_POOL_ID` | 新运行器应加入的环境的 ID,采用 `ccpool_...` 形式 |

231| `CLAUDE_RUNNER_ACCOUNT_ID` | 排队会话的帐户的标记 ID,用于按帐户路由、配额或退款。当不可用时为空,对于 Claude Tag 频道会话始终为空,这些会话没有帐户排队。 |

232| `CLAUDE_RUNNER_ACCOUNT_EMAIL` | 排队会话的帐户的电子邮件。当不可用时为空。将电子邮件视为个人可识别信息,不要记录它。 |

233| `CLAUDE_RUNNER_PRIMARY_REPO_URL` | 会话的第一个 git 源的 URL,用于路由到具有该存储库预热的运行器。当会话没有 git 源时为空。 |

234| `CLAUDE_RUNNER_PRIMARY_REPO_REVISION` | 会话的第一个 git 源的修订版本:分支、SHA 或标签。当未指定时为空。 |

235| `CLAUDE_RUNNER_REPO_SOURCES` | 所有会话的 git 源的 `{url, revision}` 的 JSON 数组,用于在辅助存储库上路由的钩子。当没有源时为空。 |

236| `CLAUDE_RUNNER_CORRELATION_ID` | 在会话创建时提供的关联 ID,回显以便钩子可以将此工作单映射到创建会话的请求。当会话没有时为空。 |

237| `CLAUDE_RUNNER_CLIENT_PLATFORM` | 创建会话的客户端表面,例如 `web_claude_ai`、`desktop_app`、`ios` 或 `scheduled_trigger`,用于采用分析。当会话没有记录或识别的表面时未设置,对于预热请求也未设置;使用 `[ -n "${CLAUDE_RUNNER_CLIENT_PLATFORM:-}" ]` 检查它,这在 `set -u` 下保持安全。 |

238 

239生成的运行器使用工作单代替环境密钥进行注册:

240 

241* **使用工作单启动它**:将 [`--environment-secret-file`](/docs/zh-CN/self-hosted-environments-reference#runner-cli-flags) 指向包含工作单 JWT 的文件,或将 `SELF_HOSTED_RUNNER_ENVIRONMENT_SECRET` 设置为 JWT 值。

242* **在钩子退出前复制 JWT**:编排器在钩子退出后删除工作单文件,因此将 JWT 复制到您提交的工作负载中,例如生成的 Job 上的 Kubernetes Secret,而不是通过文件路径。

243* **在生成的运行器上使用 `--capacity 1`**:会话绑定的工作单恰好注册一个绑定到该会话的运行器,因此更高的容量添加永远不会接收工作的插槽,运行器在启动时记录警告。

244* **预热工作单注册未绑定**:待命运行器未绑定到会话,并像固定队列运行器一样声称排队的工作。

245 

246合同有四个配置器不可知的规则:

247 

2481. **在 `CLAUDE_RUNNER_ORDER_ID` 上是幂等的。** 相同请求的重新交付必须最多生成一个运行器。从 ID 派生确定性资源名称,让您的平台拒绝重复。

2492. **不要重试工作负载。** 一个订单 ID 意味着最多创建一个工作负载。如果运行器从不注册,Anthropic 在 `--expected-spawn-seconds` 后使用新订单 ID 重新请求。

2503. **使用退出代码合同。** 退出 0 表示已提交。退出 1 表示可重试失败;会话退避并被重新提供。退出 2 或更高表示不可重试;会话被阻止再次生成,直到 [Owner](/docs/zh-CN/cloud-environments#organization-shared-environments) 在环境的 **Activity** 标签中选择 **Retry**。在非零退出时,钩子的 stderr 尾部出现在那里作为失败原因,因此将可操作的错误写入 stderr,永远不要写密钥。对于预热请求,没有会话失败:编排器仅在本地记录非零退出,服务器在租约后重新请求生成。

2514. **将 `--expected-spawn-seconds` 设置为至少您的 p99 启动时间。** 这是服务器端租约。所有编排器副本必须使用相同的值。

252 

253钩子写入 stdout 或 stderr 的所有内容都出现在编排器的日志中,凭证自动删除。如果会话保持排队,检查编排器的 `/healthz` 正文以获取队列计数,然后在 [**Cloud environments** 管理页面](https://claude.ai/admin-settings/cloud-environments) 上打开您的环境的 **Activity** 标签:在那里展开失败的会话以获取其生成错误,并选择 **Retry** 以重新请求它。

254 

255<h2 id="mcp-servers">

256 MCP 服务器

257</h2>

258 

259要在每个会话中提供 [MCP servers](/docs/zh-CN/mcp),请在镜像构建时使用与桌面安装上使用的相同 `claude mcp add` 命令添加它们。如果您的运行器是裸进程而不是容器,请在主机上以运行器的用户身份运行相同的命令,然后重启运行器:它在启动时读取主机配置一次。`--scope user` 标志是必需的;默认本地作用域写入运行器不播种的按目录密钥下。例如,在您的 Dockerfile 中:

260 

261```dockerfile theme={null}

262RUN claude mcp add --scope user sidecar -- /usr/local/bin/mcp-sidecar

263RUN claude mcp add --scope user --transport http internal http://mcp-gateway.svc.cluster.local:8080

264```

265 

266运行器在启动时快照主机的配置一次。快照从主机的 `.claude.json` 捕获 `mcpServers` 密钥,该密钥位于 `~/.claude/` 旁边而不是内部,运行器仅将该密钥播种到每个会话的隔离配置中;帐户状态和项目历史被删除。要确认服务器到达会话,请在环境上启动会话并要求 Claude 列出其 MCP 工具;运行器还为任何捕获的条目记录启动警告,其 `type` 它不识别并删除条目,因此您可以看到为什么该服务器从会话中丢失。当设置 `SELF_HOSTED_RUNNER_HOST_CONFIG_DIR` 时,运行器从该目录读取 `.claude.json` 而不是,因此将变量指向空目录也禁用 MCP 播种。

267 

268Claude Code 还从其他源加载 MCP 服务器:

269 

270* 企业范围的 [managed MCP file](/docs/zh-CN/managed-mcp) 在其标准系统路径:Linux 运行器主机上的 `/etc/claude-code/managed-mcp.json`,macOS 主机上的 `/Library/Application Support/ClaudeCode/managed-mcp.json`。将其用于锁定的队列,其中只有管理员列出的服务器可能加载。有关优先级规则,请参阅 [exclusive control with managed-mcp.json](/docs/zh-CN/managed-mcp#exclusive-control-with-managed-mcp-json)。当此文件在运行器主机上时,Claude Code 跳过 Anthropic 的控制平面交付给会话的 MCP 服务器(包括 claude.ai 连接器),并在会话子进程的 stderr 上命名它们,运行器在 `debug` 日志级别记录。在 v2.1.229 之前,这些会话在启动时以 `You cannot dynamically configure MCP servers when an enterprise MCP config is present` 退出。

271* 运行器主机上 [managed settings](/docs/zh-CN/managed-settings) 中的 [`managedMcpServers`](/docs/zh-CN/settings-reference#managedmcpservers) 密钥:提供 HTTP 和 SSE 服务器而不获得独占控制,因此来自其他源的服务器仍然加载。需要 Claude Code v2.1.259 或更高版本。

272* `<repo>/.mcp.json`:项目范围。将文件提交到存储库;其服务器在云会话中自动批准。

273 

274当为您的组织启用连接器交付时,Anthropic 的控制平面将您在 claude.ai 上配置的连接器交付给通过服务器提供的 MCP 配置路由的交互式创建的会话,通过 `api.anthropic.com` 路由。以编程方式创建的会话(例如 [CLI dispatches](/docs/zh-CN/self-hosted-environments-testing#run-the-test-loop))不接收连接器交付;通过本节列出的任何其他源为它们提供 MCP 服务器。子进程的 OAuth 令牌不携带直接获取连接器的作用域,因此子进程不尝试该获取本身;交付是服务器驱动的。

275 

276`settings.json` 不携带 MCP 服务器定义,设置架构中没有顶级 `mcpServers` 字段。在托管设置中,使用 [`managedMcpServers`](/docs/zh-CN/settings-reference#managedmcpservers) 密钥提供服务器。

277 

278会话继承运行器的环境,因此在那里设置 [`ENABLE_TOOL_SEARCH`](/docs/zh-CN/mcp#scale-with-mcp-tool-search) 以控制运行器生成的每个会话的 MCP 工具搜索;MCP 页面涵盖了这些值。

279 

280<h2 id="prompt-sessions-to-push-their-work">

281 提示会话推送其工作

282</h2>

283 

284Anthropic 托管的会话运行 [`Stop` hook](/docs/zh-CN/hooks#stop),Claude Code 钩子在 Claude 完成响应时运行,提示 Claude 提交并推送其工作。运行器不安装一个。没有它,以未提交更改结束的会话仅在运行器的磁盘上留下该工作,claude.ai/code 中的 **Create PR** 按钮保持不活跃,直到分支存在于远程。

285 

286下面的参考实现有两部分。将设置块合并到运行器主机上的 `~/.claude/settings.json` 中,运行器将其播种到每个会话中,并将脚本保存为运行器主机上的 `~/.claude/hooks/stop-hook-nudge.sh` 并使其可执行:

287 

288```json theme={null}

289{

290 "hooks": {

291 "Stop": [

292 {

293 "hooks": [

294 {

295 "type": "command",

296 "timeout": 10,

297 "command": "\"$CLAUDE_CONFIG_DIR/hooks/stop-hook-nudge.sh\""

298 }

299 ]

300 }

301 ]

302 }

303}

304```

305 

306```sh theme={null}

307#!/bin/sh

308# Stop-hook reference implementation for self-hosted runners.

309#

310# Nudges Claude once per turn if the project directory has uncommitted

311# changes OR unpushed commits, so work isn't lost when an idle session

312# is released and so the "Create PR" button on claude.ai/code lights up.

313#

314# Runner-level (no repo changes): drop this file at ~/.claude/hooks/ on

315# the runner host and merge the accompanying Stop-hook settings block

316# into ~/.claude/settings.json — the runner seeds both into every session.

317# Repo-level alternative: commit to <repo>/.claude/hooks/ and change the

318# settings.json command path to $CLAUDE_PROJECT_DIR/.claude/hooks/.

319#

320# stdin: hook JSON payload (see https://code.claude.com/docs/en/hooks)

321# stdout: {"decision":"block","reason":"..."} to nudge, or nothing to allow stop.

322 

323# Re-entry guard: the harness sets stop_hook_active=true when re-invoking

324# the Stop hook after a block. Bail so we only nudge once per turn. The

325# harness emits compact JSON (no space after the colon), which this

326# pattern relies on; use jq if you need a whitespace-tolerant check.

327in=$(cat)

328case "$in" in *'"stop_hook_active":true'*) exit 0 ;; esac

329 

330d="$CLAUDE_PROJECT_DIR"

331 

332# Not a git repo → nothing to nudge.

333git -C "$d" rev-parse --git-dir >/dev/null 2>&1 || exit 0

334 

335# No remote → "push to the remote" is unsatisfiable; bail.

336[ -z "$(git -C "$d" remote 2>/dev/null)" ] && exit 0

337 

338# Uncommitted changes (staged, unstaged, or untracked). Exclude .claude/

339# entirely — operator-seeded settings and CLI-written runtime state

340# (scheduler lock, worktrees, routine state) live there and neither is

341# "uncommitted work" the model needs to push.

342s=$(git -C "$d" status --porcelain -- . ':(exclude).claude/' 2>/dev/null)

343if [ -n "$s" ]; then

344 printf '{"decision":"block","reason":"There are uncommitted changes in the repository. Please commit and push these changes to the remote branch."}'

345 exit 0

346fi

347 

348# Unpushed commits. Count commits on HEAD not reachable from any

349# remote-tracking ref or FETCH_HEAD. This works uniformly for:

350# - init+fetch checkouts (runner default: only FETCH_HEAD exists)

351# - clone-based checkouts (origin/* exist)

352# - the runner default: the child starts on the session's outcome

353# branch, which the runner creates after checkout

354# - detached HEAD, when a custom setup skips that branch creation

355# With no reference point at all (never fetched), stay silent rather

356# than false-positive on a read-only turn.

357base=""

358git -C "$d" rev-parse --verify -q FETCH_HEAD >/dev/null && base="FETCH_HEAD"

359if [ -z "$base" ] && [ -z "$(git -C "$d" for-each-ref --count=1 refs/remotes/origin 2>/dev/null)" ]; then

360 exit 0

361fi

362# shellcheck disable=SC2086 # $base is either "" or "FETCH_HEAD", intentional word-split

363unpushed=$(git -C "$d" rev-list HEAD --not $base --remotes=origin --count 2>/dev/null) || unpushed=0

364if [ "$unpushed" -gt 0 ]; then

365 branch=$(git -C "$d" symbolic-ref --short -q HEAD)

366 if [ -n "$branch" ]; then

367 # $branch is attacker-influenced — git-check-ref-format(1) allows `"`

368 # in ref names. `\` is forbidden (rule 10) but escaped anyway as cheap

369 # defense-in-depth.

370 # Escape JSON metacharacters before interpolating into the hand-built

371 # payload so a branch like x","continue":false can't inject keys into

372 # the hook-output JSON the harness parses. $unpushed is safe — the

373 # -gt guard above rejects anything that isn't a plain integer.

374 branch_esc=$(printf '%s' "$branch" | sed 's/\\/\\\\/g; s/"/\\"/g')

375 printf '{"decision":"block","reason":"There are %s unpushed commit(s) on branch '\''%s'\''. Please push these changes to the remote repository."}' "$unpushed" "$branch_esc"

376 else

377 printf '{"decision":"block","reason":"There are %s unpushed commit(s) on a detached HEAD. Please create a branch and push it to the remote repository."}' "$unpushed"

378 fi

379 exit 0

380fi

381 

382exit 0

383```

384 

385钩子在会话结束前提示 Claude 提交并推送,当目录不是 git 存储库或没有远程时保持沉默。

386 

387<h2 id="permissions-and-tool-approval">

388 权限和工具批准

389</h2>

390 

391自托管会话没有连接的终端,因此未回答的权限提示会停止轮次,直到用户在 UI 中响应。Anthropic 的控制平面使用工作负载发送每个会话的工具列表和权限规则;默认配置预批准例行工具调用(包括 `Bash`),云会话 [pre-approve file edits regardless of mode](/docs/zh-CN/permission-modes#switch-permission-modes)。没有任何东西预批准的调用通过会话 UI 提示。

392 

393<Note>

394 仅在会话容器运行 [default-deny network egress](/docs/zh-CN/self-hosted-environments-deploy#default-deny-egress) 和 [hardening section](/docs/zh-CN/self-hosted-environments-deploy#harden-your-deployment) 中其余部分的环境上固定自动模式。例行工具调用(包括 `Bash` 网络请求)在默认预批准工具集和自动模式中都无需人工干预运行,因此网络边界是限制这些调用可以到达的位置的原因。

395</Note>

396 

397要无论控制平面发送什么都将提示保持在最低限度,请从您的包装脚本或 [`command` 钩子](#command) 固定 [auto mode](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode)。自动模式让会话无需例行权限提示运行:单独的分类器模型在运行前审查操作并阻止它拒绝的操作,显式询问规则仍然强制提示;权限模式页面涵盖分类器检查的内容。运行器在调用包装脚本前追加服务器计算的标志,对于单值标志(如 `--permission-mode`),解析器尊重最后出现的标志,因此您在 `"$@"` 后追加的标志覆盖服务器发送的值:

398 

399```bash theme={null}

400#!/bin/bash

401exec "$CLAUDE_RUNNER_CLAUDE_BIN" "$@" --permission-mode auto

402```

403 

404要预批准特定工具,请改为追加 `--allowed-tools` 和您的规则,例如 `--allowed-tools "Bash(bazel *) Bash(yarn *) mcp__internal__*"`。列表标志(如 `--allowed-tools` 和 `--disallowed-tools`)在出现时累积而不是覆盖,因此您的规则应用在控制平面发送的任何规则之上。要缩小范围,请追加 `--disallowed-tools`,即使另一个规则允许工具也拒绝工具。

405 

406<h3 id="how-each-session’s-config-is-assembled">

407 每个会话的配置如何组装

408</h3>

409 

410运行器为每个会话提供自己的配置目录,从运行器在启动时捕获的主机 `~/.claude/` 的内存快照中播种:`settings.json`、`CLAUDE.md`、钩子、代理、命令和技能在您的运行器镜像中应用于每个会话作为用户级基线。因为快照在启动时获取,运行主机上的配置更改仅在运行器重启后生效。设置 `SELF_HOSTED_RUNNER_HOST_CONFIG_DIR` 以从不同路径播种,或将其指向空目录以禁用播种。

411 

412存储库提交的 `.claude/settings.json` 作为项目设置分层。会话还从运行器镜像中的标准系统路径读取 [`managed-settings.json`](/docs/zh-CN/settings#where-settings-live)。其密钥是否与 [server-managed settings](/docs/zh-CN/server-managed-settings) 一起应用遵循 [how Claude Code combines managed sources](/docs/zh-CN/managed-settings#how-claude-code-combines-managed-sources):默认情况下,当您的组织交付任何服务器管理的密钥时,会话忽略运行器镜像的文件,除了 [keys Claude Code reads from every admin source](/docs/zh-CN/managed-settings#keys-read-from-every-admin-source),例如 `env` 块、沙箱锁、沙箱二进制路径和 `forceRemoteSettingsRefresh`。请参阅 [settings precedence](/docs/zh-CN/settings#settings-precedence)。

413 

414当 Anthropic 的控制平面为会话提供 [Claude Code hooks](/docs/zh-CN/hooks) 时,运行器将它们安装在旁边,而不是覆盖您自己的配置。需要 Claude Code v2.1.229 或更高版本。

415 

416* **它们落在哪里**:运行器将每个提供的钩子脚本写入会话配置目录的保留 `hooks/.ccr-launcher/` 子目录,并在单独的设置文件中注册脚本,它使用 `--settings` 传递给会话,保留播种的 `settings.json` 和您自己的脚本在 `hooks/<name>` 不变。运行器为每个会话重新创建保留的子目录,不播种主机内容在 `~/.claude/hooks/.ccr-launcher/` 到会话。

417* **谁编写它们**:控制平面从其自己部署中的固定常量填充脚本,永远不从按会话或第三方输入。

418* **什么仍然管理它们**:通过 `--settings` 交付的钩子进入普通合并的钩子配置,而不是托管层,因此您的托管设置仍然适用。`disableAllHooks` 禁用它们,它们不在 [`allowManagedHooksOnly`](/docs/zh-CN/settings-reference#allowmanagedhooksonly) 保持加载的类别中。

419 

420<h3 id="repository-committed-permission-rules">

421 存储库提交的权限规则

422</h3>

423 

424不要在存储库提交的 `permissions.allow` 中放置裸 `"Edit"`、`"Write"` 或 `"NotebookEdit"` 条目。裸文件工具规则匹配工具,无论路径如何,授予主机任何地方的写入而不仅仅是工作区,因此运行器的写入范围限制守卫标记会话;使用 [`--confine-repo-settings enforce`](/docs/zh-CN/self-hosted-environments-reference#runner-cli-flags) 它拒绝生成会话而不是记录并继续。请参阅 [hardening section](/docs/zh-CN/self-hosted-environments-deploy#harden-your-deployment)。

425 

426存储库根本不需要文件工具规则:云会话 [pre-approve file edits regardless of mode](/docs/zh-CN/permission-modes#switch-permission-modes)。如果您确实提交规则,将其作用域限制到工作区,例如 `"Edit(/**)"`;单个前导斜杠相对于项目根目录,这是会话的工作区。裸文件工具规则在操作员的主机级 `settings.json` 中很好,因为该文件不是存储库提交的。

427 

428`defaultMode` 为 `auto` 仅从镜像范围或用户级设置文件中受尊重,因此检出的存储库无法为自己授予自动模式。有关云会话接受的模式和完整规则语法,请参阅 [permission modes](/docs/zh-CN/permission-modes)。

429 

430<h2 id="what’s-next">

431 接下来

432</h2>

433 

434* [Reference](/docs/zh-CN/self-hosted-environments-reference):每个 CLI 标志、环境变量和指标

435* [Verify session identity](/docs/zh-CN/self-hosted-environments-identity):从运行器外部的服务验证会话令牌

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> 在生产环境中运行自托管运行器:安全加固、网络出站流量控制、git 凭证、Kubernetes 和 Compose 配方以及故障排除。

8 

9<Note>

10 自托管环境在 Team 和 Enterprise 计划上处于公开测试阶段;[可用性和限制](/docs/zh-CN/self-hosted-environments#availability-and-limitations)涵盖启用路径。本页面涵盖在生产环境中运行队列;有关首个运行器和会话,请参阅[快速入门](/docs/zh-CN/self-hosted-environments-quickstart)。

11</Note>

12 

13[自托管环境](/docs/zh-CN/self-hosted-environments)在您部署在网络内的运行器上运行 Claude Code [云会话](/docs/zh-CN/claude-code-on-the-web),在生产环境中,这些会话代表所有可以向环境分派会话的人执行模型指导的代码。本页面适用于将工作环境投入生产的操作员。它按部署顺序进行:在连接真实系统之前要锁定什么、队列需要的出站流量、会话如何向您的 git 主机进行身份验证、部署配方本身,以及会话出现故障时要检查什么。

14 

15<h2 id="harden-your-deployment">

16 加固您的部署

17</h2>

18 

19自托管运行器代表所有可以向其环境分派会话的人在您的基础设施上执行任意的、模型指导的代码。这是您 Anthropic 组织的任何成员,以及任何可以在所有者路由到环境的范围内启动 [Claude Tag](https://claude.com/docs/claude-tag/overview) 频道会话的人。在将环境连接到生产系统之前,请逐项完成以下操作:

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)设置中,并且永远不要跨所有者。

22* **镜像中没有广泛的凭证**:不要包含长期的 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* **将环境密钥保持在运行会话的主机之外**:环境密钥可以注册运行器并获取在环境上排队的任何会话。在固定队列上,它存在于每个运行器主机上,任何会话的代码都可以读取密钥文件。优先使用[按需运行器](/docs/zh-CN/self-hosted-environments-configuration#on-demand-runners),其中密钥保留在编排器主机上,该主机从不运行用户代码,每个运行器接收单次使用的工作单,恰好注册一个运行器。在固定队列上,将环境密钥文件视为可由每个会话读取,并在任何可疑会话泄露后轮换密钥。

24* **默认拒绝网络出站流量**:在每个环境上限制运行器和会话容器的出站流量在您自己的网络边界;[默认拒绝出站流量](#default-deny-egress)涵盖允许什么以及原因。

25* **最小权限主机 IAM**:附加到运行器主机的计算身份(例如实例配置文件或节点服务帐户)应仅授予运行器本身需要的内容。会话应通过您的包装脚本而不是继承主机的身份获取自己的凭证。

26* **阻止会话访问云元数据端点**:保持会话不访问主机身份需要阻止它们访问云元数据端点,子网级出站策略不会拦截链接本地元数据流量,因此在容器本身中阻止它:

27 

28 * IMDSv2,跳数限制为 1

29 * GKE Workload Identity,隐藏元数据

30 * 会话容器网络命名空间中 `169.254.169.254` 的显式拒绝

31 

32 该块也适用于您的包装脚本和生命周期钩子,因为它们共享容器。使用[会话 JWT](/docs/zh-CN/self-hosted-environments-identity)针对您自己的令牌服务通过允许列表出站流量验证任何令牌交换,或使用基于文件的 Web 身份,例如 Amazon EKS 上的 IAM Roles for Service Accounts (IRSA)。

33* **按运行器文件系统隔离**:每个运行器进程获得自己的工作目录,主机上的其他进程无法读取或写入。使 `--hooks-dir`、包装脚本和主机的 `~/.claude/` 对会话只读,无论是内置在镜像中还是以只读方式挂载。

34* **分派没有按环境的访问控制**:您 Anthropic 组织的任何成员都可以向其任何环境分派会话。如果所有者[将 Claude Tag 频道路由到环境](/docs/zh-CN/cloud-environments#set-the-environment-a-claude-tag-channel-uses),[Claude Tag 访问设置](https://claude.com/docs/claude-tag/admins/restrict-access#restrict-who-can-use-claude)允许的任何人都可以启动在那里运行的频道会话。默认情况下,这是连接的 Slack 工作区中的任何人,无论是否有 Claude 帐户。将每个运行器主机视为可由所有可以向其分派的人访问以执行代码,并仅在运行器主机上放置所有这些人都被允许读取的数据和凭证。[`--lock-to-account`](/docs/zh-CN/self-hosted-environments-reference#runner-cli-flags)限制给定主机执行哪个帐户的会话,但它不会缩小谁可以分派到环境中。要使自托管环境成为唯一的选择器选项,[所有者](/docs/zh-CN/cloud-environments#organization-shared-environments)可以从[**云环境**页面](https://claude.ai/admin-settings/cloud-environments)为整个组织隐藏 Anthropic 托管的环境。

35* **强制执行 repo-settings 保护**:使用 [`--confine-repo-settings`](/docs/zh-CN/self-hosted-environments-reference#runner-cli-flags) 选择保护模式。默认的 `warn` 记录违规并仍然生成会话,`enforce` 拒绝会话,`off` 禁用扫描。运行器扫描每个存储库的提交设置以查找:

36 

37 * 在该会话自己的工作区之外解析的授予:`additionalDirectories` 条目、`permissions.allow` 中的 `Edit`、`Write` 或 `NotebookEdit` 规则,或 `sandbox.filesystem.allowWrite` 或 `allowRead` 条目

38 * 非空的 `env` 块

39 * 操作员态势覆盖,例如 `sandbox.enabled: false`

40 

41 无论 [`--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)了解这些授予的位置。

42 

43<Note>

44 您组织的 IP 允许列表默认不涵盖自托管运行器流量。不要将其作为运行器或会话流量的网络控制;而是在您自己的网络边界应用默认拒绝出站流量,如果您想为您的组织强制执行 IP 允许列表,请联系您的 Anthropic 帐户团队。

45</Note>

46 

47<h2 id="network-requirements">

48 网络要求

49</h2>

50 

51运行器及其生成的会话子进程向以下主机进行出站连接。将会话容器出站流量限制为这些主机和会话需要到达的特定内部服务;[默认拒绝出站流量](#default-deny-egress)涵盖如何以及为什么。

52 

53这些主机始终是必需的:

54 

55| 主机 | 端口 | 用途 |

56| :------------------------------------------------- | :----------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

57| `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)隧道 |

58| 您的 git 主机,例如 `github.com` 或您的 GitHub Enterprise 主机 | 443 或 22 | 克隆和推送存储库。如果运行器使用 `--use-anthropic-git-proxy`(通过 `api.anthropic.com` 路由 git 流量)则不需要。 |

59 

60这些主机是否需要取决于您的配置:

61 

62| 主机 | 端口 | 何时需要 |

63| :----------------------------------- | :-- | :---------------------------------------------------------------------------------------------------------------------------------- |

64| `downloads.claude.ai` | 443 | 在安装时,当您使用本机安装程序在主机上安装或更新 Claude Code 时;`install.sh` 脚本本身从 `claude.ai` 提供。在会话运行时,仅当会话从官方 Anthropic 市场安装插件时。 |

65| `storage.googleapis.com` | 443 | 在会话运行时,用于 `/plugin` 中显示的插件安装计数和元数据。 |

66| `code.claude.com` 和 `claude.com` | 443 | 内置 claude-code-guide 代理的文档查找和会话期间预批准的 WebFetch 请求。阻止这些主机仅影响文档查找。 |

67| `*.frame.claudeusercontent.com` | 443 | 仅当[工件工具](/docs/zh-CN/artifacts#availability)对您组织中的会话可用时;默认值因计划而异,请参阅那里的可用性表。在运行器上设置 `CLAUDE_CODE_DISABLE_ARTIFACT=1` 以保持工具禁用,无论组织设置如何。 |

68| `registry.npmjs.org` | 443 | 当会话安装插件时,用于获取 npm 源插件包和安装插件的 Node.js 依赖项,或当 `npx` 启动的 MCP 服务器运行时 |

69| `http-intake.logs.us5.datadoghq.com` | 443 | Anthropic 操作指标。仅当设置 `CLAUDE_CODE_BYOC_ENABLE_DATADOG=1` 时;在自托管环境中默认关闭。 |

70| `browser-intake-us5-datadoghq.com` | 443 | Anthropic 错误报告上传,仅在为会话帐户启用[错误报告](/docs/zh-CN/data-usage#telemetry-services)时发送。由 `DISABLE_ERROR_REPORTING=1` 或 `DISABLE_TELEMETRY=1` 抑制。 |

71 

72运行器不会到达 `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)。

73 

74<h3 id="default-deny-egress">

75 默认拒绝出站流量

76</h3>

77 

78在网络段或命名空间中部署运行器和会话容器,其出站流量限制为[网络要求表](#network-requirements)中的主机、您的 git 主机和会话需要到达的特定内部服务。该产品无法验证或强制执行此操作,因此在每个环境的您自己的网络边界应用它。会话代码是模型指导的,可以尝试连接到任意主机;网络层的默认拒绝出站流量限制这些尝试可以到达的位置。这适用于任何权限模式:默认预批准工具集已包括 `Bash`,因此 shell 出站流量在没有[自动模式](/docs/zh-CN/self-hosted-environments-configuration#permissions-and-tool-approval)的情况下运行而不提示。

79 

80有关每个会话发出的遥测详情以及如何关闭它,请参阅[遥测](/docs/zh-CN/self-hosted-environments-reference#telemetry)。

81 

82<h3 id="authenticate-to-an-egress-proxy">

83 向出站代理进行身份验证

84</h3>

85 

86某些企业出站代理在每个连接上需要 `Proxy-Authorization` 标头。该标头中的令牌通常轮换太快而无法写入您在 `HTTPS_PROXY` 中设置的代理 URL。像往常一样将 `HTTPS_PROXY` 或 `HTTP_PROXY` 设置为您的代理 URL,然后设置 `--proxy-authorization-command` 或 `--proxy-authorization-file` 以告诉运行器从何处读取标头值。两个标志都需要 Claude Code v2.1.238 或更高版本。

87 

88<h4 id="choose-where-the-proxy-authorization-value-comes-from">

89 选择 `Proxy-Authorization` 值的来源

90</h4>

91 

92选择与您生成 `Proxy-Authorization` 令牌的方式相匹配的标志:

93 

94* **[`--proxy-authorization-command <command>`](/docs/zh-CN/self-hosted-environments-reference#runner-cli-flags)**:为您按需生成的令牌选择此选项。运行器运行 shell 命令并使用其修剪的 stdout 作为标头值,例如 `Bearer <token>`。

95* **[`--proxy-authorization-file <path>`](/docs/zh-CN/self-hosted-environments-reference#runner-cli-flags)**:为另一个进程轮换到位的令牌选择此选项。运行器读取文件并使用其修剪的内容作为标头值。

96 

97<h4 id="configurations-the-runner-refuses-to-start-with">

98 运行器拒绝启动的配置

99</h4>

100 

101每个标志也有一个环境变量形式,在[运行器 CLI 标志参考](/docs/zh-CN/self-hosted-environments-reference#runner-cli-flags)中列在其旁边。在运行器联系您的代理或控制平面之前,它检查标志及其变量,并在三种情况下拒绝启动:

102 

103* **两个标志都设置**:一个标志加上另一个标志的环境变量计为设置两个。

104* **没有代理 URL**:`HTTPS_PROXY` 和 `HTTP_PROXY` 都不包含 `http://` 或 `https://` URL。运行器以大写或小写读取两个变量,不查询 `ALL_PROXY`。

105* **任一标志传递给编排器子命令**:`self-hosted-runner orchestrator` 不接受标志或其环境变量。改为将标志传递给编排器启动的每个运行器。

106 

107<h4 id="what-the-runner-changes-while-a-proxy-authorization-flag-is-set">

108 设置代理授权标志时运行器更改的内容

109</h4>

110 

111设置任一标志后,运行器启动自己的侦听器并通过该侦听器发送来自自身、其生命周期钩子和其会话的代理流量。侦听器在到达您的代理的途中添加 `Proxy-Authorization` 标头。

112 

113* **侦听器**:侦听器是 `127.0.0.1` 上的转发代理。运行器在向控制平面注册之前启动侦听器,如果侦听器无法启动则在启动时退出。

114* **代理变量**:运行器重写您设置的 `HTTPS_PROXY` 和 `HTTP_PROXY` 中的任何一个,使其指向侦听器。该重写的值到达运行器本身、其生命周期钩子和它运行的每个会话。

115* **令牌轮换**:轮换的令牌无需重启即可生效。对于侦听器打开到您的代理的每个连接,运行器再次运行您的命令或读取您的文件并将结果添加为标头。

116* **会话环境**:会话仅通过侦听器到达您的代理。在每个会话的环境中,运行器删除 `ALL_PROXY`,删除您未设置的 `HTTPS_PROXY` 或 `HTTP_PROXY` 的任何拼写,并将 `NO_PROXY` 固定到运行器自己的值。

117* **日志**:运行器从不记录标头值。

118 

119<h2 id="configure-git">

120 配置 git

121</h2>

122 

123运行器管理存储库检出但默认不配置 git 身份或凭证。您控制运行器的镜像和进程环境,因此您控制 git 配置。选择两种方法之一:

124 

125* **让运行器配置 git**:使用 `--configure-git` 启动运行器,使其写入 Anthropic 托管会话使用的相同身份和提交签名配置

126* **在镜像中提供 git 配置**:自己设置身份和推送凭证,例如在您自己的机器人身份下提交

127 

128运行器主机上的 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 就足够了。

129 

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

131 让运行器配置 git

132</h3>

133 

134使用 `--configure-git` 启动运行器,或设置 `SELF_HOSTED_RUNNER_CONFIGURE_GIT=1`,使其在启动时写入全局 git 配置:

135 

136* `user.name = Claude` 和 `user.email = noreply@anthropic.com`,与 Anthropic 托管会话匹配

137* SSH 格式提交和标签签名,通过运行器管理的垫片路由,使用会话自己的凭证通过 Anthropic 的签名服务签署每个提交。签名可在 GitHub 上针对 Anthropic 的已发布 SSH 签名密钥进行验证。

138* `push.negotiate = true`,所以 git 在打包推送之前询问您的 git 主机它已经拥有哪些提交。需要 Claude Code v2.1.257 或更高版本。

139* `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]` 警告。

140 

141提交签名需要 git 2.34 或更高版本;运行器在启动时检查并在您的 git 较旧时以错误退出。此标志不配置推送凭证,您仍然在镜像中提供。

142 

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

144 在镜像中提供 git 配置

145</h3>

146 

147git 身份对任何提交都是必需的。在您的 Dockerfile 中系统范围设置它,以便配置适用于运行器进程运行的任何用户:

148 

149```dockerfile theme={null}

150RUN git config --system user.name "Claude" && \

151 git config --system user.email "noreply@anthropic.com"

152```

153 

154没有身份,`git commit` 失败并显示 `Please tell me who you are`,会话无法取得进展。您可以改用自己的机器人身份;运行器不会覆盖这些值。

155 

156不要将长期或广泛范围的推送凭证烘焙到共享运行器镜像中:镜像中的凭证可用于镜像运行的每个会话,无论谁启动它。相反,从您的[包装脚本](/docs/zh-CN/self-hosted-environments-configuration#wrapper-scripts)按会话铸造短期、最小范围的令牌,使用从会话 JWT 解码的会话创建者的身份。将其与临时的按会话容器配对,这需要 `--capacity 1`,因此没有凭证超过铸造它的会话;请参阅[加固部分](#harden-your-deployment)。

157 

158如果您必须在镜像级别配置推送凭证,例如对于只读部署密钥,请尽可能紧密地限制它们:

159 

160* SSH 部署密钥限制为一个存储库,带有 `url.<base>.insteadOf` 重写

161* 返回最小范围令牌的 `credential.helper`

162* `GIT_SSH_COMMAND` 指向狭义范围的密钥

163 

164您配置的任何机制都必须无需提示即可工作,因为运行器的内置克隆和获取禁用 git、SSH 和 Git Credential Manager 否则会显示的提示:

165 

166* 运行器设置 `GIT_TERMINAL_PROMPT=0`,所以 git 不要求用户名或密码。

167* 运行器使用 `BatchMode=yes` 运行 SSH,如果您设置了一个,则附加到您的 `GIT_SSH_COMMAND`,所以 SSH 不要求密码短语或主机确认。

168* 运行器设置 `GCM_INTERACTIVE=never`,所以 Git Credential Manager 不打开登录对话框。

169* 运行器清除 `core.askPass`,所以如果您使用 askpass 助手,改为通过 `GIT_ASKPASS` 环境变量设置它。

170 

171如果您的 git 主机拒绝凭证,或您没有配置凭证,运行器重试几次然后失败存储库准备。运行器不会将这些设置传递到会话的环境中。

172 

173如果检出目录由与运行器进程不同的 uid 拥有,git 拒绝对其进行操作;添加 `safe.directory`:

174 

175```dockerfile theme={null}

176RUN git config --system --add safe.directory '*'

177```

178 

179<h3 id="use-the-anthropic-git-proxy">

180 使用 Anthropic git 代理

181</h3>

182 

183使用 `--use-anthropic-git-proxy` 启动运行器,或设置 `CLAUDE_RUNNER_USE_GIT_PROXY=1`,使其通过 Anthropic 的 git 代理克隆,使用会话自己的短期令牌进行身份验证。对于普通用户会话,代理使用为会话创建者存储的 GitHub 或 GitHub Enterprise OAuth 令牌;对于机器人和代理会话,它使用您组织的 GitHub App 安装令牌。无论哪种方式,运行器镜像根本不需要 git 凭证:没有 SSH 密钥、没有凭证助手、没有 `.netrc`。这是 Anthropic 托管环境使用的相同身份验证路径。

184 

185代理需要 `--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 主机。

186 

187运行器还在注册时向 Anthropic 报告选择加入,在启动时打印 `Registering as opted in to Anthropic-managed git (--use-anthropic-git-proxy)`。选择加入运行器上的每个会话然后使用 Anthropic 管理的 git 或按会话代理 URL。当会话使用按会话代理 URL 时,运行器记录一行 `[runner:warn]` 说明这一点。

188 

189<h3 id="rewrite-git-urls-for-private-networks">

190 为专用网络重写 git URL

191</h3>

192 

193存储库 URL 从控制平面作为 HTTPS 到达,带有您的 git 主机的主机名;对于 GitHub Enterprise,这是您在 claude.ai 上的 Claude Code 管理设置中为 [GitHub Enterprise 集成](/docs/zh-CN/github-enterprise-server)配置的主机名。两个可重复的标志在克隆之前重写这些 URL:

194 

195* `--git-host-rewrite <from>=<to>`:对于分割视界 DNS,其中 Anthropic 通过外部主机名到达您的 git 主机,但运行器必须使用内部主机名

196* `--git-ssh-rewrite <host>`:对于仅接受 SSH 的 git 主机,将 `https://<host>/owner/repo` 重写为 `git@<host>:owner/repo`

197 

198主机重写首先运行,因此如果您需要两者,请在 `--git-ssh-rewrite` 中列出内部主机名。为了完全控制检出,使用 [`checkout` 生命周期钩子](/docs/zh-CN/self-hosted-environments-configuration#checkout)。

199 

200<h2 id="build-the-runner-image">

201 构建运行器镜像

202</h2>

203 

204Anthropic 不发布预构建的运行器镜像。围绕 `claude` 二进制文件构建您自己的,分层您的存储库需要的任何工具链:语言运行时、编译器、包管理器和 [MCP](/docs/zh-CN/mcp) 边车。

205 

206下面的配方使用 `--capacity 4`,所以一个容器为来自同一锁定所有者的最多四个并发会话服务。这不提供[加固部分](#harden-your-deployment)中的按会话容器隔离:在将环境连接到生产系统之前,要么以 `--capacity 1` 运行配方,每个会话一个容器,要么使用[按需运行器](/docs/zh-CN/self-hosted-environments-configuration#on-demand-runners),它也将环境密钥保持在会话运行主机之外。

207 

208这个 Dockerfile 是一个最小的起点:

209 

210```dockerfile theme={null}

211FROM debian:bookworm-slim

212ARG CLAUDE_CODE_VERSION

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

214 && rm -rf /var/lib/apt/lists/*

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

216 -o /usr/local/bin/claude && chmod +x /usr/local/bin/claude

217RUN git config --system user.name "Claude" \

218 && git config --system user.email "noreply@anthropic.com" \

219 && git config --system --add safe.directory '*'

220ENTRYPOINT ["claude"]

221```

222 

223如果您的节点是 ARM,将 `linux-x64` 交换为 `linux-arm64`,或在 Alpine 等 musl 基础镜像上交换为 `linux-x64-musl` 或 `linux-arm64-musl`;请参阅 [Alpine Linux 设置](/docs/zh-CN/setup#alpine-linux-and-musl-based-distributions)了解 musl 镜像需要的额外包。URL 是标准 Claude Code 发布位置,因此您可以根据[二进制完整性和代码签名](/docs/zh-CN/setup#binary-integrity-and-code-signing)中描述的发布的已签名清单验证下载的二进制文件。使用 Claude Code 版本 2.1.224 或更高版本构建镜像,然后将其推送到您的注册表并在下面的配方中引用它:

224 

225```bash theme={null}

226docker build --build-arg CLAUDE_CODE_VERSION=2.1.224 -t <your-registry>/claude-runner:latest .

227```

228 

229<h2 id="size-cpu-and-memory-for-sessions">

230 为会话调整 CPU 和内存大小

231</h2>

232 

233为运行器运行的会话而不是运行器进程调整运行器的容器或主机大小。运行器本身轮询工作、准备每个会话的检出、运行您的[生命周期钩子](/docs/zh-CN/self-hosted-environments-configuration#lifecycle-hooks),以及启动和监督会话进程。负载来自会话:每个都是一个 Claude Code 进程加上它启动的任何东西,例如构建、测试套件、包安装和 [MCP 服务器](/docs/zh-CN/mcp)。

234 

235对于一个会话,从以下值开始,表示为 Kubernetes 请求和限制或您平台的等效值,并将它们视为起点而不是要求:

236 

237* **内存**:请求和限制各 4 GiB,满足 Claude Code [系统要求](/docs/zh-CN/setup#system-requirements)中的 4 GB 最小值。保持两者相等,以便调度程序考虑容器的完整内存。当容器达到其内存限制时,内核杀死其中的进程,这可能会结束会话中途。

238* **CPU**:请求 2 个 CPU,限制 4 个 CPU,所以会话可以在构建期间突发超过请求。内核在其 CPU 限制处限制容器,而不是杀死其中的进程,所以会话在限制处运行较慢但继续运行。

239 

240在 Kubernetes 容器规范中,使用以下 `resources` 块设置这些起始值:

241 

242```yaml theme={null}

243resources:

244 requests:

245 cpu: "2"

246 memory: 4Gi

247 limits:

248 cpu: "4"

249 memory: 4Gi

250```

251 

252构建和测试通常是会话负载中最大和最可变的部分,因此运行您的存储库的代表性构建,测量其峰值 CPU 和内存,并提高任何在该峰值之上没有为 Claude Code 进程留出空间的起始值。

253 

254运行器使用 `--capacity` 来限制它一次运行多少个会话。它不在它们之间分割 CPU 或内存,所以运行器上的会话共享容器的 CPU 和内存。要限制一个会话的份额,从您的[包装脚本](/docs/zh-CN/self-hosted-environments-configuration#wrapper-scripts)应用限制。因此,给一个容器什么取决于它一次服务多少个会话:

255 

256* **每个运行器一个会话**:给每个容器一个会话的值。在 `--capacity 1` 使用此大小,[加固部分](#harden-your-deployment)推荐,以及对于[按需运行器](/docs/zh-CN/self-hosted-environments-configuration#on-demand-runners),您在您的 [`spawn-runner` 钩子](/docs/zh-CN/self-hosted-environments-configuration#the-spawn-runner-hook)提交的工作负载上设置值,例如 Kubernetes Job 的 pod 模板。

257* **每个运行器多个会话**:在 `--capacity` 高于 1 时,将一个会话的值乘以容量,因为最多那么多会话可以在容器中同时运行。[Kubernetes](#kubernetes) 和 [Docker Compose](#docker-compose) 配方以 `--capacity 4` 运行,没有 CPU 或内存限制,因此添加为您运行的容量调整大小的限制。

258 

259<h2 id="kubernetes">

260 Kubernetes

261</h2>

262 

263运行器默认在端口 8080 上提供 `GET /healthz`,可使用 `--health-port` 配置,因此 Kubernetes 探针无需额外设置即可工作。端点在进程活着时返回 `200`,所以下面的探针检测死进程,而不是卡住的进程;要捕获停止轮询的运行器,请在 [`/metrics`](/docs/zh-CN/self-hosted-environments-reference#prometheus-metrics) 的 `last_poll_age_seconds` 系列上发出警报。下面的 Deployment 从 Kubernetes Secret 挂载环境密钥,将活跃度和就绪探针指向 `/healthz`,并设置 90 秒的终止宽限期。请参阅[关闭时序](#shutdown-timing)了解为什么宽限期很重要。

264 

265清单在运行器容器上设置没有 CPU 或内存 `resources`。添加为您运行的容量调整大小的块,如[为会话调整 CPU 和内存大小](#size-cpu-and-memory-for-sessions)所述。

266 

267```yaml theme={null}

268apiVersion: apps/v1

269kind: Deployment

270metadata:

271 name: claude-runner

272 namespace: claude-runners

273spec:

274 replicas: 3

275 selector:

276 matchLabels:

277 app: claude-runner

278 template:

279 metadata:

280 labels:

281 app: claude-runner

282 app.kubernetes.io/part-of: claude-code-self-hosted-runner

283 spec:

284 terminationGracePeriodSeconds: 90

285 containers:

286 - name: runner

287 image: <your-registry>/claude-runner:latest

288 args:

289 - self-hosted-runner

290 - --environment-secret-file

291 - /etc/claude/environment-secret

292 - --capacity

293 - "4"

294 volumeMounts:

295 - name: environment-secret

296 mountPath: /etc/claude

297 readOnly: true

298 ports:

299 - name: health

300 containerPort: 8080

301 readinessProbe:

302 httpGet:

303 path: /healthz

304 port: 8080

305 initialDelaySeconds: 5

306 periodSeconds: 10

307 livenessProbe:

308 httpGet:

309 path: /healthz

310 port: 8080

311 initialDelaySeconds: 30

312 periodSeconds: 30

313 volumes:

314 - name: environment-secret

315 secret:

316 secretName: claude-runner-environment-secret

317```

318 

319上面的 Deployment 存在于 `claude-runners` 命名空间中。首先创建命名空间:

320 

321```bash theme={null}

322kubectl create namespace claude-runners

323```

324 

325从保存您在管理 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 并删除文件:

326 

327```bash theme={null}

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

329```

330 

331<h2 id="docker-compose">

332 Docker Compose

333</h2>

334 

335下面的 Compose 服务在运行器退出时重启它,这涵盖崩溃和正常退出后的 drain。Docker 重启策略重启同一容器及其可写层完整,所以运行器以重用的文件系统而不是[加固态势](#harden-your-deployment)推荐的新文件系统回来;为评估使用此配方,对于生产要么每次运行重新创建容器,要么使用执行此操作的编排器。

336 

337```yaml theme={null}

338services:

339 claude-runner:

340 image: <your-registry>/claude-runner:latest

341 command:

342 - self-hosted-runner

343 - --environment-secret-file

344 - /run/secrets/environment-secret

345 - --capacity

346 - "4"

347 secrets:

348 - environment-secret

349 restart: always

350 stop_grace_period: 90s

351 

352secrets:

353 environment-secret:

354 file: ./environment-secret

355```

356 

357<h2 id="shutdown-timing">

358 关闭时序

359</h2>

360 

361在 `SIGTERM` 上,运行器停止接收新工作,除非你设置了 [`--defer-shutdown-max-min`](#defer-the-drain-past-the-first-signal),否则最多等待 `--drain-wait-sec`(默认为零)以完成进行中的轮次,终止每个会话的进程树,并运行 [`post-session` 生命周期钩子](/docs/zh-CN/self-hosted-environments-configuration#post-session)。该进程树包括 Claude 仍在会话中运行的命令。

362 

363完整的排空路径最多需要 `--session-stop-grace-sec` + `--drain-wait-sec` + `--post-session-hook-timeout-sec`,加上 15 秒的固定进程清理开销,加上当设置 [`--push-outcome-on-release`](/docs/zh-CN/self-hosted-environments-reference#runner-cli-flags) 时的额外 30 秒。在默认设置下为 80 秒,运行器在启动时记录总时间。会话在这一个预算下并行排空,因此总时间不会随 `--capacity` 增长。

364 

365在默认的 `--drain-wait-sec 0` 下,滚动重启会中断进行中的轮次;每个会话在另一个运行器上恢复,丧失未推送的工作,如 [已知问题](#additional-limitations) 中所述。设置 `--drain-wait-sec`,并提高宽限期以匹配,以让轮次先完成。

366 

367在整个路径中,运行器以零容量持续向控制平面发送心跳,因此会话租约不会过期并被重新排队到另一个运行器,同时 `post-session` 钩子仍在写出未提交的工作。心跳在运行器注销前停止。

368 

369在主机停止运行器之前,至少给运行器启动时记录的总时间。你在哪里设置这个取决于你的主机如何停止:

370 

371* **使用 `SIGTERM` 宽限期**:在 Kubernetes 上设置 `terminationGracePeriodSeconds`,在 Docker Compose 上设置 `stop_grace_period`,或你的编排器的等效项至少为该总时间。Kubernetes 的默认值 30 秒短于运行器的排空路径,因此 Kubernetes 在运行器完成排空前停止 pod。

372* **使用 [`--retire-at`](/docs/zh-CN/self-hosted-environments-reference#runner-cli-flags)**:调整退休时间和主机停止时间之间的边距以覆盖典型轮次,加上 [Runner lifecycle](/docs/zh-CN/self-hosted-environments#runner-lifecycle) 描述的后台任务保持,加上相同的总时间。在每次启动时计算退休时间,例如 `date +%s` 加上运行器的预期生命周期。

373* **使用 [`--defer-shutdown-max-min`](#defer-the-drain-past-the-first-signal)**:向排空路径总时间添加两个额外部分。第一个是你配置的分钟数。第二个是 [Defer the drain past the first signal](#defer-the-drain-past-the-first-signal) 描述的发布后宽限期,默认为 75 秒。设置该标志后,运行器也会在启动时打印组合数字,在排空路径总时间之后。

374 

375<h3 id="defer-the-drain-past-the-first-signal">

376 延迟排空超过第一个信号

377</h3>

378 

379如果你想要重启的运行器继续为其持有的会话服务长达 `n` 分钟,而不是在第一个信号上排空它们,请设置 [`--defer-shutdown-max-min <n>`](/docs/zh-CN/self-hosted-environments-reference#runner-cli-flags)。在第一个 `SIGTERM` 或 `SIGINT` 上,运行器停止接收新工作并继续为其持有的会话服务。它持续轮询,以便控制平面不会重新排队这些会话。需要 Claude Code v2.1.238 或更高版本。

380 

381<h4 id="what-happens-to-the-sessions-the-runner-holds-after-the-first-signal">

382 第一个信号后运行器持有的会话会发生什么

383</h4>

384 

385在信号后的前两个阶段,运行器释放会话,释放的会话在其用户发送下一条消息时在新运行器上恢复。从第一个信号开始计数,运行器经过三个阶段:

386 

387* **在前 `n` 分钟内**:运行器正常为其会话服务,并继续强制执行 `--startup-timeout-min` 和 `--kill-session-after-min`。如果你也设置了 [`--release-idle-session-min`](/docs/zh-CN/self-hosted-environments-reference#runner-cli-flags),运行器会释放任何用户空闲该长时间的会话;没有它,空闲会话保留在运行器上。

388* **当 `n` 分钟用完时**:运行器释放它仍然持有的每个会话,无论是否空闲。运行器等待中途轮次的轮次结束,以及最多 60 秒的轮次后台任务,然后释放该会话。

389* **当发布后宽限期用完时**:运行器排空它仍然持有的任何会话,控制平面立即将每个排空的会话重新排队到另一个运行器。发布后宽限期从 `n` 分钟用完时开始,默认为 75 秒。如果你设置 `--drain-wait-sec` 超过 60 秒,发布后宽限期是 `--drain-wait-sec` 加 15 秒。

390 

391在任何阶段,运行器一旦不持有任何会话就以 0 退出。第二个信号缩短阶段:运行器立即排空,就像在没有 `--defer-shutdown-max-min` 的第一个信号上一样。一旦排空开始,下一个信号强制退出运行器。这适用于第二个信号或发布后宽限期用完是否启动了排空。

392 

393<h4 id="size-the-stop-timeout">

394 调整停止超时

395</h4>

396 

397给你的主机停止超时至少三个部分的总和:你配置的 `n` 分钟、发布后宽限期和 [Shutdown timing](#shutdown-timing) 描述的完整排空路径。使用默认设置,发布后宽限期为 75 秒,排空路径为 80 秒,因此允许 `n` 分钟加 155 秒。当设置 `--defer-shutdown-max-min` 时,运行器在启动时打印此总和。

398 

399如果停止超时在运行器完成前用完,主机会杀死运行器。它仍然持有的会话不会获得 `post-session` 钩子。运行器不会注销,控制平面大约一分钟后重新排队会话。如果你无法给停止超时该总和,请不设置 `--defer-shutdown-max-min`,以便运行器在第一个信号上排空。

400 

401<h3 id="what-reaches-a-running-post-session-hook">

402 什么到达运行的 post-session 钩子

403</h3>

404 

405`post-session` 钩子和 Claude 会话子进程各自在自己的 POSIX 进程组中运行,与运行器分离,因此停止机制以不同方式到达它们:

406 

407* **运行器已在排空时的 `SIGTERM`**:立即强制退出运行器,跳过排空路径的任何剩余部分。没有 [`--defer-shutdown-max-min`](#defer-the-drain-past-the-first-signal),那是运行器接收的第二个 `SIGTERM`。没有信号发送到正在运行的 `post-session` 钩子,因此在采用孤儿的初始进程的裸主机上,它自行完成,但不受监督:其超时预算不再适用,写入关闭的日志管道可以用 `SIGPIPE` 杀死它,因此需要在强制退出时存活的钩子应该将其自己的输出重定向到文件。在此页面的容器配方中,运行器是容器的 PID 1,其退出结束容器,在 systemd 的默认 `KillMode=control-group` 下,cgroup 范围的杀死到达钩子,如 **Cgroup-wide kills** 条目所述;在两者中,将强制退出视为对钩子致命,并依赖宽限期。

408* **进程组范围的信号**,例如包装脚本中的 `kill -- -<pid>`、shell 作业控制或组范围的看门狗:到达运行器和正在进行的 `checkout` 钩子子进程(故意保持组附加),但不到达正在运行的 `post-session` 钩子或会话子进程。

409* **Cgroup 范围的杀死**,例如 systemd 的默认 `KillMode=control-group` 或当 `terminationGracePeriodSeconds` 过期时 Kubernetes 传递给整个容器的 `SIGKILL`:到达一切,包括钩子。进程组隔离不能防止这些,这就是为什么宽限期必须覆盖完整排空路径。

410* **钩子自己的超时**:当钩子超过 `--post-session-hook-timeout-sec` 时,运行器向钩子的整个进程组发送 `SIGTERM`,然后两秒后发送 `SIGKILL`,因此钩子分叉的工作进程(例如 tar、rsync 或 git)与包装 shell 一起终止,而不是作为孤儿存活。运行器的监督在钩子的 stdio 关闭后结束:将其自己的输出重定向到文件并在 `SIGTERM` 阶段后存活的工作进程超出运行器的范围。

411 

412当排空开始时,以及在强制退出时,运行器记录仍在运行的 `post-session` 钩子数量,因此你可以区分安静的排空和正在进行快照的排空。

413 

414<h2 id="keep-the-base-directory-and-capacity-identical-across-runners">

415 在运行器之间保持基目录和容量相同

416</h2>

417 

418如果运行器在会话中途死亡,服务器重新排队会话,环境中的另一个运行器获取它。该运行器从其自己的 `--base-dir` 和 `--capacity` 派生检出路径:`--capacity 1` 直接在 `--base-dir` 下检出,`--capacity` 高于 1 改用按会话 worktrees。当同一环境中的运行器对任一标志使用不同的值时,恢复的会话的工作目录更改,代理之前记录的绝对路径(在编辑、工具调用或其自己的笔记中)指向不再存在的位置。

419 

420在环境中的每个运行器上使用相同的 `--base-dir` 和 `--capacity`,并且不要使用按主机的值,例如实例 ID 或主机名。

421 

422基目录默认为 `/workspace`,除了 [`--base-dir` 参考行](/docs/zh-CN/self-hosted-environments-reference#runner-cli-flags)记录的例外。运行器需要对其的写入访问。在启动时,在注册之前,运行器创建目录并确认它可以写入,当它不能时以 `cannot create or write to base directory` 退出。以 root 身份启动的运行器自己创建默认 `/workspace`。对于非 root 运行器,在启动运行器之前创建目录并给运行器的用户所有权,或将 `--base-dir` 指向该用户已拥有的目录。

423 

424<h2 id="reuse-a-pre-warmed-checkout">

425 重用预热的检出

426</h2>

427 

428对于大型仓库,克隆可能会主导会话启动。在 `--capacity 1` 且没有 [`checkout` hook](/docs/zh-CN/self-hosted-environments-configuration#checkout) 的情况下,运行器在 `<base-dir>/<repo-owner>/<repo>` 处为每个仓库保持一个规范克隆,并在会话间重用它:它获取请求的引用,分离 `HEAD`,并硬重置到该引用,当变化不大时这几乎是瞬间完成的。要跳过冷克隆,可以通过以下两种方式之一提供克隆:

429 

430* **在镜像中克隆**:在该路径处将克隆构建到运行器镜像中。每个新容器随后都会以预热克隆启动,而无需重用磁盘。

431* **在持久卷上克隆**:在使用 [`--lock-to-account`](/docs/zh-CN/self-hosted-environments-reference#runner-cli-flags) 预锁定到一个用户账户的运行器上,将 `--base-dir` 指向持久卷,这样磁盘只为该账户服务。预锁定的运行器永远不会接收 Claude Tag 频道会话,因此此选项不适用于为其服务的运行器。

432 

433重用路径的保证和不保证的内容:

434 

435* **任何克隆形状都可以工作**:路径处的完整、浅层或单分支克隆按原样使用。运行器在获取到现有克隆时永远不会传递 `--depth`,因此完整的预热保持其完整历史,浅层克隆保持浅层。`CLAUDE_RUNNER_FETCH_DEPTH`(`full`、`0` 或一个数字;默认 50)仅控制当尚不存在克隆时运行器进行的冷克隆。

436* **跟踪的更改重置,未跟踪的文件保留**:每个会话从硬重置开始,该重置会清除前一个会话的跟踪修改,但运行器永远不会运行 `git clean`,因此来自锁定所有者早期会话的未跟踪文件保留在树中。

437* **使用 git 代理时,重置变成检出**:使用 [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy),运行器在每个会话前清理克隆的 `.git/`,保留对象存储、引用和浅层状态,但删除索引,因此每个会话需要进行完整的工作树检出而不是近乎瞬间的重置;它仍然永远不会重新克隆。代理下不支持子模块预热。

438* **长克隆不需要解决方法**:运行器使用 120 秒无进度监视器和 30 分钟硬上限来限制每个 git 操作,而不是平面超时,因此保持报告进度的缓慢冷克隆会完成。

439 

440<h2 id="pin-the-version">

441 固定版本

442</h2>

443 

444每个会话的子 Claude Code 进程运行运行器自己的二进制文件,运行器在它生成的会话内关闭自动更新,所以每个会话运行您在主机上安装或构建到镜像中的版本。主机级更新在运行器下次启动时生效。

445 

446* **将队列保持在一个版本上**:使用固定版本构建镜像,或在裸主机上安装特定版本并[禁用自动更新](/docs/zh-CN/setup#disable-auto-updates)

447* **升级**:安装较新版本或重建镜像,然后重启运行器

448* **插件**:插件市场也不自动更新;在运行器的环境中设置 `FORCE_AUTOUPDATE_PLUGINS=1` 以让插件自动更新,同时二进制保持固定

449 

450<h2 id="scale-the-fleet">

451 扩展队列

452</h2>

453 

454您的编排器决定何时添加或删除运行器。由于[每个运行器一个所有者锁](/docs/zh-CN/self-hosted-environments#runner-lifecycle),最小副本计数是您期望并发活跃的用户和 Claude Tag 代理数;`--capacity` 控制一个所有者内的并行性,而不是跨所有者。

455 

456两种扩展方法可用:

457 

458* **固定队列**:运行静态运行器副本集并在每个运行器提供的 [Prometheus 指标](/docs/zh-CN/self-hosted-environments-reference#prometheus-metrics)上扩展

459* **按需运行器**:运行 `claude self-hosted-runner orchestrator` 子命令,它轮询 Anthropic 以查找没有可用运行器排队的会话,并调用您的 `spawn-runner` 钩子为每个会话启动一个。请参阅[按需运行器](/docs/zh-CN/self-hosted-environments-configuration#on-demand-runners)。

460 

461<h2 id="known-issues-and-limitations">

462 已知问题和限制

463</h2>

464 

465以下是此版本中的限制,其中存在解决方法。

466 

467<h3 id="connector-traffic-leaves-your-network">

468 连接器流量离开您的网络

469</h3>

470 

471Anthropic 从其自己的基础设施而不是从您的运行器调用连接器工具。连接器工具是 claude.ai 连接器,例如 GitHub、Slack 和 Linear。当 Claude 在自托管会话中使用连接器时,该流量通过 `api.anthropic.com` 而不是源自您的网络边界内。

472 

473要将连接器排除在自托管会话之外,使用 [`allowedMcpServers` 和 `deniedMcpServers` 策略设置](/docs/zh-CN/managed-mcp#policy-based-control-with-allowlists-and-denylists)过滤它。Claude Code 将这些设置应用于 Anthropic 交付的连接器以及您从运行器主机播种的服务器和用户添加的服务器,所以如果您为其他服务器部署允许列表,Claude Code 也会阻止交付的连接器。要在 URL 基础允许列表旁边保持连接器可用,添加与 Anthropic 代理路径匹配的条目以获得交付的连接器:

474 

475* `https://api.anthropic.com/v2/ccr-sessions/*`

476* `https://api.anthropic.com/v1/code/sessions/*`

477* `https://api.anthropic.com/v1/code/mcp/*`

478 

479如果工具流量必须保留在您的网络内,改为在运行器镜像上作为本地 MCP 服务器运行等效工具。请参阅 [MCP 服务器](/docs/zh-CN/self-hosted-environments-configuration#mcp-servers)。

480 

481<h3 id="some-sessions-don’t-count-as-idle">

482 某些会话不计为空闲

483</h3>

484 

485持有永不完成的后台任务的会话不计为空闲,所以 `--release-idle-session-min` 不会释放该会话的槽。等待从运行中工具调用内请求的批准的会话也不计为空闲。始终将 `--kill-session-after-min` 与其一起设置作为硬后挡,以便没有会话可以无限期地持有槽。

486 

487`--kill-session-after-min` 是失控会话的后挡。在 v2.1.260 或更高版本的运行器上,达到限制的会话不会立即终止。运行器给它一个宽限窗口,默认 15 分钟,您可以使用 [`SELF_HOSTED_RUNNER_MAX_LIFETIME_GRACE_MS`](/docs/zh-CN/self-hosted-environments-reference#environment-variable-only-settings) 更改:

488 

489* 如果会话等待其用户,或其转向已结束并仅持有后台任务,运行器立即释放它。会话在其用户发送下一条消息时恢复。

490* 如果转向仍在运行,运行器等待转向完成,或会话下一次等待其用户,然后释放它。

491* 如果会话在宽限窗口结束时仍在运行器上,运行器终止它,任何运行转向的工作丢失。等待从运行中工具调用内请求的批准的转向是会话超过窗口的一种方式。

492 

493释放的会话从新克隆恢复,所以它未推送的工作无论如何都消失了;请参阅[恢复的会话丢失未推送的工作](#additional-limitations)。在 v2.1.260 之前,运行器在限制处终止每个会话,最多等待宽限窗口以完成运行转向。

494 

495将该标志设置为高于您预期的最长会话时长,例如 `--kill-session-after-min 480` 为 8 小时。要从空闲的对话释放槽,改用 `--release-idle-session-min`。

496 

497<h3 id="additional-limitations">

498 其他限制

499</h3>

500 

501* **恢复的会话丢失未推送的工作**:当会话被释放或其运行器重启,用户发送另一条消息时,会话在新运行器上恢复,该运行器从其起始分支再次克隆存储库,所以会话未推送的工作消失。设置 [`--push-outcome-on-release`](/docs/zh-CN/self-hosted-environments-reference#runner-cli-flags) 使运行器在释放之前尽力推送会话的结果分支,所以恢复的会话从这些提交开始;这保留提交的工作,而不是脏工作树。在启用之前,限制谁可以推送到源远程上的 `claude/*` refs,例如使用分支规则集:在恢复时,运行器获取之前推送的分支而不验证谁推送了它,所以任何有推送访问这些 refs 的人都可以将内容放入恢复的工作区。运行器也在恢复时丢弃按会话配置,意味着会话的 Claude 配置目录和会话写入的任何 shell 状态;`--push-outcome-on-release` 不涵盖这些。

502* **私有存储库无法在会话中途添加**:在自托管运行器上,添加到已启动会话的存储库不使用凭证克隆,所以添加失败。创建会话时选择会话需要的每个存储库。

503* **某些连接器不出现在自托管会话中**:您在 claude.ai Settings 中尚未连接的连接器不在自托管会话中列出,会话不会提示您连接它。首先在 Settings 中连接它,然后启动新会话。向已运行的会话添加连接器也不会使其工具对 Claude 可用;启动新会话以获取新添加的连接器。

504 

505<h3 id="report-an-issue">

506 报告问题

507</h3>

508 

509对于自托管环境的问题,请联系您的 Anthropic 帐户团队。

510 

511<h2 id="troubleshooting">

512 故障排除

513</h2>

514 

515为了获得引导诊断,在运行器主机上运行 doctor 子命令。doctor 子命令启动交互式 Claude Code 会话,附加运行器的日志和状态。首先在该主机上使用 `claude auth login` 登录,以便会话可以查询您的环境、其运行器和其排队的会话。没有该登录,例如当主机使用 API 密钥进行身份验证时,它仅限于本地健康端点、指标和运行器的日志,并且仅在您使用 `--log-file` 启动运行器时读取日志。

516 

517```bash theme={null}

518claude self-hosted-runner doctor

519```

520 

521常见问题:

522 

523* **运行器不出现在环境中**:确认主机可以通过 HTTPS 到达 `api.anthropic.com`,环境密钥是最新的,主机时钟在真实时间的五分钟内;更大的偏差导致身份验证失败。运行器在身份验证失败时使用拒绝原因记录 `[runner:fatal]`。

524* **运行器在启动时以 `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 之前,运行器在启动时不检查基目录,此错误配置在获取后失败会话。

525* **会话保持排队**:每个在线运行器可能被锁定到不同的所有者。检查每个运行器的 `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`,这告诉您运行器被锁定但不是对哪个所有者。添加副本,或等待现有运行器 drain 并重启。如果环境使用按需运行器,改为检查编排器;请参阅[按需运行器](/docs/zh-CN/self-hosted-environments-configuration#on-demand-runners)。

526* **会话在获取后立即失败**:在 claude.ai/code 中打开会话以查看错误。最常见的原因是运行器镜像中缺少 [git 凭证](#configure-git)和未安装的构建工具。不可写的基目录在启动时停止运行器,而不是失败会话。请参阅此列表中的**运行器在启动时以 `cannot create or write to base directory` 退出**条目。

527* **会话无法通过身份验证的出站代理到达网络**:当您使用 [`--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` 退出,它无法打开其环回侦听器。

528* **运行器记录 `Poll failed` 行包含 `rejecting the malformed poll response`**:运行器接收工作轮询响应,其主体不是队列的预期 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 之前,运行器将此类响应读取为空工作队列,这可能会结束其活跃会话或使其退出。

529* **会话的分支不再存在于远程**:对于会话仅从中读取的 git 源,运行器跳过该源并继续其余的。对于会话推送结果的源,删除的分支(通常因为它被合并和自动删除)使会话失败,错误命名存储库和分支,并要求您恢复分支并重试。当跳过会使其没有存储库时,运行器使用相同的错误使会话失败。在 v2.1.228 之前,此类会话在空目录中启动。

530* **会话需要数分钟才能启动**:初始克隆通常主导。观看 `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` 切割克隆。

531* **Pod 在 drain 中途被杀死**:将 `terminationGracePeriodSeconds` 提高到至少运行器在启动时记录的值。请参阅[关闭时序](#shutdown-timing)。

532 

533日志初始化后,运行器将其生命周期日志(包括 `[runner:fatal]` 行)写入 stdout,调试输出写入 stderr,都作为纯文本行而不是 JSON。上面故障排除条目中描述的启动失败在该点之前打印到 stderr。使用 `--log-file` 捕获两个流,这也让 `self-hosted-runner doctor` 尾随它们,或使用您的平台的日志收集。每个会话的子进程写入单独的调试日志。失败时运行器保留日志,在运行器日志中打印日志的路径,并在 claude.ai/code 中的会话旁边显示日志的尾部。

534 

535<h2 id="what’s-next">

536 接下来

537</h2>

538 

539* [自定义会话](/docs/zh-CN/self-hosted-environments-configuration):包装脚本、生命周期钩子、按需运行器、MCP 服务器和权限

540* [端到端测试](/docs/zh-CN/self-hosted-environments-testing):在推广新运行器镜像之前从 CI 验证它

541* [参考](/docs/zh-CN/self-hosted-environments-reference):每个 CLI 标志、环境变量和指标

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_SESSION_ACCESS_TOKEN JWT,以便网络上的服务可以信任来自自托管环境中会话的请求。

8 

9<Note>

10 自托管环境在 Team 和 Enterprise 计划上处于公开测试阶段;[所有者](/docs/zh-CN/cloud-environments#organization-shared-environments)可以通过在[**云环境**管理页面](https://claude.ai/admin-settings/cloud-environments)上打开**允许自托管环境**来启用它们。本页面涵盖会话身份验证;有关设置,请参阅[快速入门](/docs/zh-CN/self-hosted-environments-quickstart),有关舰队配方,请参阅[部署到生产](/docs/zh-CN/self-hosted-environments-deploy)。

11</Note>

12 

13[自托管环境](/docs/zh-CN/self-hosted-environments)让[网络上的 Claude Code](/docs/zh-CN/claude-code-on-the-web) 会话在您运营的基础设施上运行,而不是在 Anthropic 的基础设施上运行。由于会话在您的网络内运行,Claude 可以直接调用您的内部服务。这些服务需要一种方式来确认请求来自您环境中的 Claude Code 会话,并识别创建该会话的用户或服务身份。

14 

15自托管环境中的每个会话都会在 `CLAUDE_CODE_SESSION_ACCESS_TOKEN` 环境变量中收到一个签名的 JSON Web Token (JWT)。会话像任何持有者凭证一样呈现令牌;例如,Claude 运行的脚本可以使用 `curl -H "Authorization: Bearer $CLAUDE_CODE_SESSION_ACCESS_TOKEN"` 调用您的服务。Anthropic 对令牌进行签名,并在公开 JWKS 端点发布验证密钥。您的服务获取这些密钥,验证签名,并读取声明以决定授予什么访问权限。

16 

17<h2 id="the-session-token">

18 会话令牌

19</h2>

20 

21在编写验证代码之前,了解令牌建立的内容以及 JWT 库将看到的形状。

22 

23<h3 id="what-the-token-proves">

24 令牌证明的内容

25</h3>

26 

27有效的令牌建立了一些事实,但故意不建立其他事实:

28 

29* **证明**:Anthropic 为特定环境中的特定会话发布了令牌,以及会话的创建方式:由您组织中的用户创建,或由您组织的服务身份创建,这是 [Claude Tag 频道会话](https://claude.com/docs/claude-tag/concepts/agent-identity)的启动方式

30* **不证明**:运行程序主机上的哪个进程呈现它。令牌位于会话内的环境变量中,因此 Claude 运行的任何代码以及会话启动的任何工具或 MCP 服务器都可以读取并呈现它。

31 

32对您的服务的两个后果:

33 

34* 根据您的环境 ID(在[**云环境**管理页面](https://claude.ai/admin-settings/cloud-environments)上与您的环境一起显示的 `ccpool_...` 值)验证 `aud` 声明,以拒绝发布给任何其他组织环境的令牌。

35* 将从令牌派生的凭证范围限制在单个编码会话应该能够做的事情,而不是会话创建者能够做的一切。请参阅[范围派生凭证](#scope-derived-credentials)。

36 

37<h3 id="token-format">

38 令牌格式

39</h3>

40 

41`CLAUDE_CODE_SESSION_ACCESS_TOKEN` 的值具有 `sk-ant-cc-` 前缀,后跟标准的三部分 JWT:

42 

43```text theme={null}

44sk-ant-cc-<base64url header>.<base64url payload>.<base64url signature>

45```

46 

47在将值传递给 JWT 库之前,请删除前缀。发布给 Anthropic 托管云会话的令牌改为携带 `sk-ant-si-` 前缀,并由不同的密钥集签名,因此拒绝任何不以 `sk-ant-cc-` 开头的值。

48 

49签名算法是 `ES256`,这是 P-256 曲线上的 ECDSA,带有 SHA-256。令牌头部携带一个 `kid`,用于标识 JWKS 中的哪个密钥对其进行了签名。

50 

51<h2 id="verify-the-token">

52 验证令牌

53</h2>

54 

55验证在两个地方之一运行。网络上的服务根据 Anthropic 发布的密钥对令牌进行加密验证,会话内的包装脚本可以改为使用运行程序二进制文件的内置解码器。

56 

57<h3 id="verify-the-token-from-your-service">

58 从您的服务验证令牌

59</h3>

60 

61Anthropic 在公开的、未经身份验证的端点发布验证密钥:

62 

63```text theme={null}

64https://api.anthropic.com/v1/code/.well-known/jwks.json

65```

66 

67响应是标准的 [JSON Web Key Set](https://www.rfc-editor.org/rfc/rfc7517)。Anthropic 定期轮换签名密钥,轮换前的密钥在集合中保留足够长的时间,以便它们签名的令牌继续验证,因此不要固定单个密钥。端点设置 `Cache-Control: public, max-age=300`,因此缓存密钥集并每五分钟重新获取一次是安全的。

68 

69根据以下检查验证每个传入令牌:

70 

71<Steps>

72 <Step title="检查前缀">

73 如果值不以 `sk-ant-cc-` 开头,则拒绝该值,然后删除该前缀。其余部分是标准的紧凑 JWT。

74 </Step>

75 

76 <Step title="验证签名">

77 获取 JWKS,选择 `kid` 与令牌头部匹配的密钥,并验证 `ES256` 签名。拒绝 `alg` 头部不是 `ES256` 的令牌。如果令牌到达时带有缓存密钥集中没有的 `kid`,在拒绝之前重新获取 JWKS 一次:轮换后,新令牌使用缓存集还没有的密钥进行签名。

78 </Step>

79 

80 <Step title="验证发行者">

81 如果 `iss` 不完全是 `ccr`,则拒绝令牌。

82 </Step>

83 

84 <Step title="根据您的环境验证受众">

85 `aud` 声明是一个数组。除非它包含您的环境 ID(形式为 `ccpool_...`),否则拒绝令牌。环境 ID 显示在[**云环境**管理页面](https://claude.ai/admin-settings/cloud-environments)上您的环境的详细信息对话框中,并在任何环境的会话令牌中显示为 `ccr:pool_id` 声明。此检查是将令牌范围限制到您的环境并拒绝发布给其他组织的令牌的内容。

86 </Step>

87 

88 <Step title="验证角色">

89 如果 `ccr:role` 不完全是 `session_worker`,则拒绝令牌。为自托管环境发布的其他令牌,例如环境机密、运行程序令牌和工作订单,由同一密钥集签名,但携带不同的角色。

90 </Step>

91 

92 <Step title="验证过期">

93 如果 `exp` 在过去,则拒绝令牌。Anthropic 默认发布生命周期为四小时、最长为八小时的会话令牌。运行程序在过期前刷新令牌,并将新值推送到会话,因此 Claude 在刷新后启动的子进程继承它。因此,一个会话在其生命周期内可以向您的服务呈现多个不同的有效令牌。

94 </Step>

95 

96 <Step title="读取身份">

97 创建用户的身份在 `act` 声明中:`act.sub` 是他们的 Anthropic 用户 ID,采用前缀形式 `user:<id>`,`act.email`(当创建表面记录了一个时)是他们的电子邮件地址。您组织的服务身份创建的会话(包括 Claude Tag 频道会话)改为在 `act.sub` 中携带 `agent:` 主题,因此仅当 `act.sub` 携带 `user:` 前缀时才将会话视为用户创建的,而不是测试身份声明是否不存在。有关完整结构和平面重复声明,请参阅[声明参考](#claims-reference)。

98 </Step>

99</Steps>

100 

101这些检查直接映射到标准 JWT 库。下面的示例使用 [`jose`](https://www.npmjs.com/package/jose) 在 Node.js 中实现完整序列,它处理 JWKS 获取、缓存和 `kid` 选择,以及使用 [`PyJWT`](https://pyjwt.readthedocs.io/) 及其内置 JWKS 客户端在 Python 中实现。

102 

103<Tabs>

104 <Tab title="Node.js (jose)">

105 ```typescript theme={null}

106 import { createRemoteJWKSet, jwtVerify } from "jose";

107 

108 const JWKS = createRemoteJWKSet(

109 new URL("https://api.anthropic.com/v1/code/.well-known/jwks.json")

110 );

111 

112 const PREFIX = "sk-ant-cc-";

113 const EXPECTED_POOL_ID = "ccpool_...";

114 

115 export async function verifySessionToken(raw: string) {

116 if (!raw.startsWith(PREFIX)) {

117 throw new Error("not a self-hosted runner session token");

118 }

119 const jwt = raw.slice(PREFIX.length);

120 

121 const { payload } = await jwtVerify(jwt, JWKS, {

122 issuer: "ccr",

123 audience: EXPECTED_POOL_ID,

124 algorithms: ["ES256"],

125 });

126 

127 if (payload["ccr:role"] !== "session_worker") {

128 throw new Error("token is not a session_worker token");

129 }

130 

131 const act = payload.act as { email?: string; sub?: string };

132 return {

133 sessionId: payload["ccr:session_id"] as string,

134 poolId: payload["ccr:pool_id"] as string,

135 orgId: payload["ccr:org_id"] as string,

136 creatorEmail: act?.email,

137 creatorSub: act?.sub,

138 };

139 }

140 ```

141 </Tab>

142 

143 <Tab title="Python (PyJWT)">

144 ```python theme={null}

145 import jwt

146 from jwt import PyJWKClient

147 

148 JWKS_URL = "https://api.anthropic.com/v1/code/.well-known/jwks.json"

149 PREFIX = "sk-ant-cc-"

150 EXPECTED_POOL_ID = "ccpool_..."

151 

152 jwks = PyJWKClient(JWKS_URL)

153 

154 

155 def verify_session_token(raw: str) -> dict:

156 if not raw.startswith(PREFIX):

157 raise ValueError("not a self-hosted runner session token")

158 token = raw.removeprefix(PREFIX)

159 

160 signing_key = jwks.get_signing_key_from_jwt(token)

161 payload = jwt.decode(

162 token,

163 signing_key.key,

164 algorithms=["ES256"],

165 issuer="ccr",

166 audience=EXPECTED_POOL_ID,

167 )

168 

169 if payload.get("ccr:role") != "session_worker":

170 raise ValueError("token is not a session_worker token")

171 

172 act = payload.get("act") or {}

173 return {

174 "session_id": payload["ccr:session_id"],

175 "pool_id": payload["ccr:pool_id"],

176 "org_id": payload["ccr:org_id"],

177 "creator_email": act.get("email"),

178 "creator_sub": act.get("sub"),

179 }

180 ```

181 </Tab>

182</Tabs>

183 

184<h3 id="verify-the-token-inside-the-session">

185 在会话内验证令牌

186</h3>

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 中读取它们并明确比较它们。

189 

190此命令提取创建者身份,优先选择 SSO 提供程序的主题,然后是电子邮件地址,然后是创建者的 `act.sub` 主题 `user:<id>` 或 `agent:<id>`:

191 

192```bash theme={null}

193"$CLAUDE_RUNNER_CLAUDE_BIN" self-hosted-runner decode-token | jq -re '.act.attested_by.sub // .act.email // .act.sub'

194```

195 

196包装脚本在 `CLAUDE_RUNNER_CLAUDE_BIN` 中接收运行程序自身二进制文件的绝对路径;使用该路径而不是 PATH 解析的 `claude`,以便解码在运行程序本身使用的同一二进制文件上运行。

197 

198使用 `jq -re` 而不是 `jq -r`,以便缺少的声明导致非零退出。仅使用 `-r`,缺少的声明会打印文字字符串 `null` 并以零退出,这会以静默方式将坏值传递给下游。仅在 JWKS 端点无法访问的离线检查中将 `--no-verify` 传递给 `decode-token`。

199 

200<h2 id="claims-reference">

201 声明参考

202</h2>

203 

204下表列出了与验证相关的会话令牌声明。从 `ccr:*` 命名空间和 `act` 链读取身份;平面 `account_email`、`organization_uuid` 和 `account_uuid` 声明是可能被删除的向后兼容性重复项。您组织的服务身份创建的会话(包括 Claude Tag 频道会话)在 `act.sub` 中携带 `agent:` 主题,并省略 `act.email`、`ccr:account_id`、`account_email` 和 `account_uuid`。两个电子邮件声明对于用户创建的会话也是可选的:Anthropic 仅在创建请求的凭证携带电子邮件时在会话创建时记录它们,从 CLI 分派的会话可能两者都缺少,因此根据 `act.sub` 或 `ccr:account_id` 而不是电子邮件来确定身份。令牌也可以携带此表之外的其他声明;忽略您不认识的声明。

205 

206| 声明 | 类型 | 描述 |

207| :------------------ | :---- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |

208| `iss` | 字符串 | 始终为 `ccr`。 |

209| `sub` | 字符串 | `ccr:session:<session_id>`。 |

210| `aud` | 字符串数组 | 始终包含 `anthropic-api`。对于自托管环境中的会话,数组还包含您的环境 ID,例如 `ccpool_...`。验证环境 ID,而不是 `anthropic-api`。 |

211| `exp` | 数字 | 过期时间为 Unix 时间戳。四小时默认生命周期,八小时最大值。 |

212| `iat` | 数字 | 发布时间为 Unix 时间戳。 |

213| `jti` | 字符串 | 唯一令牌标识符。 |

214| `ccr:role` | 字符串 | 对于会话令牌始终为 `session_worker`。 |

215| `ccr:session_id` | 字符串 | 会话 ID。与 `sub` 的后缀相同的值。 |

216| `ccr:pool_id` | 字符串 | 您的环境 ID。与出现在 `aud` 中的值相同。 |

217| `ccr:org_id` | 字符串 | 您的 Anthropic 组织 ID。 |

218| `ccr:account_id` | 字符串 | 创建用户的 Anthropic 账户 ID:`act.sub` 的值去掉 `user:` 前缀,一个标记的 `user_...` ID。与[spawn-runner hook](/docs/zh-CN/self-hosted-environments-configuration#the-spawn-runner-hook) 的 `CLAUDE_RUNNER_ACCOUNT_ID` 携带的值相同,以及 [`--lock-to-account`](/docs/zh-CN/self-hosted-environments-reference#runner-cli-flags) 接受的值,因此三者作为相等的字符串进行比较。 |

219| `account_email` | 字符串 | `act.email` 的重复;每当 `act.email` 不存在时就不存在。 |

220| `organization_uuid` | 字符串 | 您的 Anthropic 组织 UUID。 |

221| `account_uuid` | 字符串 | 创建用户的 Anthropic 账户 UUID。 |

222| `act` | 对象 | [RFC 8693](https://www.rfc-editor.org/rfc/rfc8693) 委托链。请参阅[`act` 链](#the-act-chain)。 |

223 

224<h3 id="the-act-chain">

225 `act` 链

226</h3>

227 

228`act` 声明记录从创建会话的用户或服务身份到[环境](/docs/zh-CN/self-hosted-environments#key-concepts)(其机密允许运行程序)以及创建该机密的身份的完整委托路径。创建者是最外层的参与者,因此 `act.sub` 直接标识他们。

229 

230| 路径 | 描述 |

231| :---------------- | :-------------------------------------------------------------------------------------------------------------------- |

232| `act.sub` | 创建用户的 Anthropic 用户 ID,形式为 `user:<id>`,或当您组织的服务身份创建会话时为 `agent:<id>`,就像它对 Claude Tag 频道会话所做的那样。 |

233| `act.email` | 创建用户的电子邮件地址,当在会话创建时记录了一个时。不要求它;根据 `act.sub` 确定身份。 |

234| `act.attested_by` | 上游身份提供程序对创建用户的证明,当可用时。`act.attested_by.sub` 是您的 SSO 提供程序(例如 Google 或 Okta)发布的主题。在映射到您自己系统中的身份时,优先选择这个而不是 `act.email`。 |

235| `act.act` | 生成会话的运行程序。`act.act.sub` 是 `ccr:runner:<runner_id>`。 |

236| `act.act.act` | 环境。`act.act.act.sub` 是 `ccr:pool:<pool_id>`。 |

237| `act.act.act.act` | 创建运行程序注册的环境机密的身份。链在此处结束。 |

238 

239<h2 id="scope-derived-credentials">

240 范围派生凭证

241</h2>

242 

243会话令牌标识创建会话的用户或服务身份,但不要将其视为等同于该创建者直接登录。令牌位于会话内的环境变量中,因此 Claude 运行的任何代码以及会话启动的任何工具或 MCP 服务器都可以读取并呈现它。

244 

245验证也是离线的:根据 JWKS 验证的令牌在其 `exp` 之前保持有效,无论自那以后会话发生了什么,Anthropic 不为会话令牌发布撤销源。相应地绑定您从令牌派生的任何内容。

246 

247当您的服务将令牌交换为内部凭证时,发布范围限制在一个编码会话应该能够到达的凭证:

248 

249* **限制功能**:授予对会话编码任务所需资源的读写访问权限,而不是创建者在其他地方持有的管理功能。

250* **限制生命周期**:将派生凭证绑定到令牌的 `exp` 或更短。

251* **作为会话审计**:记录 `ccr:session_id` 和 `jti` 以及创建者身份,以便您可以将操作追踪回特定会话。

252 

253<h2 id="related-environment-variables">

254 相关环境变量

255</h2>

256 

257创建者身份也以纯环境变量的形式出现在两个从不验证令牌的表面上:

258 

259* **[`spawn-runner` hook](/docs/zh-CN/self-hosted-environments-configuration#the-spawn-runner-hook),在编排器上**:hook 在任何运行程序存在于排队会话之前运行,并在 `CLAUDE_RUNNER_ACCOUNT_EMAIL` 和 `CLAUDE_RUNNER_ACCOUNT_ID` 等变量中接收创建者身份。编排器从工作订单(授权生成一个运行程序的签名单次使用令牌)读取它们,而不验证工作订单的签名本身;声明是受信任的,因为工作订单通过编排器与 Anthropic 的连接到达,环境机密对其进行身份验证。

260* **[包装脚本](/docs/zh-CN/self-hosted-environments-configuration#wrapper-scripts),在会话内**:包装脚本接收 `CCR_SESSION_ACCOUNT_EMAIL`,创建者的电子邮件从令牌中预提取,无需签名验证。该变量适合用于标记,例如提交预告片,而不是用于身份验证决定。

261 

262使用纯变量进行编排器端决定,例如选择机器映像。当下游服务需要独立的加密证明而不是信任运行程序的环境时,使用 `CLAUDE_CODE_SESSION_ACCESS_TOKEN`。

263 

264<h2 id="what’s-next">

265 接下来

266</h2>

267 

268* [自托管环境](/docs/zh-CN/self-hosted-environments):环境、运行程序和会话模型;[快速入门](/docs/zh-CN/self-hosted-environments-quickstart)和[部署到生产](/docs/zh-CN/self-hosted-environments-deploy)包含设置和操作

269* [自定义会话](/docs/zh-CN/self-hosted-environments-configuration):使用令牌的包装脚本和 `spawn-runner` hook

270* [参考](/docs/zh-CN/self-hosted-environments-reference):CLI 标志、环境变量和指标

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

10 自托管环境在 Team 和 Enterprise 计划上处于公开测试阶段;[可用性和限制](/docs/zh-CN/self-hosted-environments#availability-and-limitations)涵盖了启用路径。本页面让您的第一个会话运行;有关它们是什么,请参阅[自托管环境](/docs/zh-CN/self-hosted-environments),有关强化和部队配方,请参阅[部署到生产环境](/docs/zh-CN/self-hosted-environments-deploy)。

11</Note>

12 

13[自托管环境](/docs/zh-CN/self-hosted-environments)在您的组织运营的基础设施上运行 Claude Code [云会话](/docs/zh-CN/claude-code-on-the-web),由您部署的运行器进程执行。本快速入门建立您的第一个环境,这是最小的可行配置:一个主机上的一个运行器,运行一个测试会话。有两个步骤:[创建环境、启动运行器并将会话路由到该环境](#set-up-an-environment-and-runner),然后[从您的终端向该会话发送后续消息](#send-a-follow-up-message-to-a-running-session)。您将在两个界面之间切换:claude.ai 用于创建环境、检查其状态和路由会话,以及主机上的终端用于运行器执行的所有操作。

14 

15完成后,您将在[**Cloud environments** 管理页面](https://claude.ai/admin-settings/cloud-environments)上拥有一个环境、一个轮询工作的运行器,以及在您的主机上运行的会话。在连接真实存储库或内部系统之前,请完成[部署到生产环境](/docs/zh-CN/self-hosted-environments-deploy),其中涵盖了安全态势、出口控制、git 凭证和编排。

16 

17<h2 id="prerequisites">

18 前置条件

19</h2>

20 

21<h3 id="organization-and-roles">

22 组织和角色

23</h3>

24 

25claude.ai 端需要:

26 

27* **Allow self-hosted environments** 由[所有者](/docs/zh-CN/cloud-environments#organization-shared-environments)在[**Cloud environments** 管理页面](https://claude.ai/admin-settings/cloud-environments)上启用;在启用之前,**New** 按钮不会出现。如果您不拥有该角色,拥有该角色的人可以创建环境并将其密钥交给您;本页面上的运行器和终端步骤不需要 claude.ai 角色,当步骤在管理 UI 中检查状态时,运行器自己的日志行会给您相同的信号。

28* 您的组织的 [GitHub 连接](/docs/zh-CN/claude-code-on-the-web#github-authentication-options),以便开发人员在启动会话时可以选择存储库。

29 

30<h3 id="host-and-network">

31 主机和网络

32</h3>

33 

34运行器主机需要:

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 启动。

37* 与实时同步的时钟,例如使用 NTP。当时钟偏离超过五分钟时,身份验证失败;请参阅[故障排除](/docs/zh-CN/self-hosted-environments-deploy#troubleshooting)。

38 

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

40 运行器主机上的软件

41</h3>

42 

43在启动之前在主机上安装:

44 

45* **Claude Code v2.1.224 或更高版本**,使用任何[标准安装方法](/docs/zh-CN/setup)。运行器是标准 `claude` 二进制文件的一部分,较早的版本不识别 `self-hosted-runner` 子命令。本机安装程序的默认 `latest` 频道在发布后立即携带每个版本;`stable` 频道、Homebrew `claude-code` cask 和稳定的 apt、dnf 和 apk 存储库滞后约一周。要固定您的部队运行的确切版本,请参阅[安装特定版本](/docs/zh-CN/setup#install-a-specific-version)。对于容器镜像,请参阅[部署到生产环境](/docs/zh-CN/self-hosted-environments-deploy#build-the-runner-image)中的 Dockerfile。

46* **Git 2.24 或更高版本**。部署页面上的某些 git 选项需要更高版本;[配置 git](/docs/zh-CN/self-hosted-environments-deploy#configure-git)说明了每个下限。

47 

48确认主机已准备好:

49 

50```bash theme={null}

51claude self-hosted-runner --help

52```

53 

54准备好的主机打印运行器的使用文本,列出诸如 `--environment-secret-file` 之类的标志。在 2.1.224 之前的版本上,该命令改为打印常规 `claude --help` 输出;使用 `claude update` 升级或从 `latest` 频道重新安装。

55 

56<h2 id="set-up-an-environment-and-runner">

57 设置环境和运行器

58</h2>

59 

60Claude Code 包括一个引导式设置:一个交互式 Claude Code 会话,引导您在管理 UI 中创建环境、使用您保存的密钥文件启动本地运行器、确认运行器注册,并将速查表写入 `./runner-setup/CHEAT-SHEET.md`。在您已使用拥有所有者角色的帐户使用 `claude auth login` 登录的机器上运行它;它不适用于 API 密钥或第三方模型提供商。在无法进行交互式会话的主机上,改为使用下面的手动步骤。首先确认[版本检查](#software-on-the-runner-host)通过:在 2.1.224 之前的版本上,此命令启动一个普通的 Claude 会话,将这些词作为提示而不是引导式设置。要启动引导式设置,请运行设置子命令并按照提示进行:

61 

62```bash theme={null}

63claude self-hosted-runner setup

64```

65 

66要改为手动设置:

67 

68<Steps>

69 <Step title="创建环境">

70 转到管理设置中的[**Cloud environments** 页面](https://claude.ai/admin-settings/cloud-environments)。在 **Self-hosted environments** 下,选择 **New**,命名环境,然后选择 **Create**。在向导的第二步,选择 **Copy environment key** 以复制环境密钥,管理 UI 将其标记为环境密钥。claude.ai 仅显示一次密钥,您之后无法检索它;它在创建后 365 天过期。环境的 `ccpool_...` ID 在其详细信息对话框中保持可见;您需要它用于[令牌验证](/docs/zh-CN/self-hosted-environments-identity)中的 `aud` 检查,以及用于从 CI [分派测试会话](/docs/zh-CN/self-hosted-environments-testing#run-the-test-loop)。

71 

72 如果您丢失了密钥或需要轮换它,请从环境的 **Configuration** 选项卡创建新密钥,将新密钥推出到您的运行器,然后撤销旧密钥。持有已撤销密钥的运行器在其下一次经过身份验证的轮询时失败并退出,记录 `poll auth failed`,您的编排器使用新密钥重新启动它们。

73 </Step>

74 

75 <Step title="启动运行器">

76 创建密钥目录。此步骤和下一步需要 root 用于 `/etc/claude` 路径;运行器进程可以读取的任何路径都有效,因此如果您使用不同的路径,请一起调整两个命令和 `--environment-secret-file` 值。

77 

78 ```bash theme={null}

79 mkdir -p /etc/claude

80 ```

81 

82 将环境密钥写入文件。下面的命令从您的终端读取,以便密钥保持在 shell 历史记录之外:粘贴您复制的值,按 Enter,然后按 Ctrl-D,子 shell 的 `umask` 使文件仅可由其所有者读取。

83 

84 ```bash theme={null}

85 (umask 077 && cat > /etc/claude/environment-secret)

86 ```

87 

88 选择一个基目录,将下面运行器命令中的 `<writable-dir>` 替换为运行器可以写入或创建的绝对路径。运行器在启动时创建目录,然后检查存储库并在其下创建每个会话的目录。没有 `--base-dir`,它使用 `/workspace`,这仅在该目录已存在且可写或您以 root 身份启动运行器时有效。

89 

90 如果运行器无法创建或写入路径,它在启动时以命名目录的错误退出,而不是注册。请参阅[故障排除](/docs/zh-CN/self-hosted-environments-deploy#troubleshooting)。

91 

92 然后使用 `--environment-secret-file` 和 `--base-dir` 启动运行器。运行器向您的环境注册并开始轮询工作。如果运行器退出,请手动重新启动它。生产部署在编排器下运行运行器,该编排器重新启动已退出的运行器,通常每次重新启动时使用新的文件系统;[重用预热的检查](/docs/zh-CN/self-hosted-environments-deploy#reuse-a-pre-warmed-checkout)涵盖了支持的持久磁盘设置。

93 

94 ```bash theme={null}

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

96 ```

97 </Step>

98 

99 <Step title="验证运行器出现">

100 返回[**Cloud environments** 页面](https://claude.ai/admin-settings/cloud-environments)。您的环境状态在运行器启动后几秒内从 **No runners deployed** 更改为 **Healthy**;打开环境并选择 **Activity** 以查看运行器本身。

101 </Step>

102 

103 <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)。

105 </Step>

106</Steps>

107 

108运行器在其活跃会话完成后按设计退出;请参阅[运行器生命周期](/docs/zh-CN/self-hosted-environments#runner-lifecycle)。对于生产,在编排器下部署它,该编排器在退出时重新启动它。请参阅[部署到生产环境](/docs/zh-CN/self-hosted-environments-deploy)。

109 

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

111 向运行中的会话发送后续消息

112</h2>

113 

114一旦会话在您的环境上运行,从任何您使用 `claude auth login` 登录的机器上的 `claude` CLI 向其发送后续消息;该命令不需要从启动会话的机器运行。该命令发布一条消息:

115 

116```bash theme={null}

117claude -p "your message" --cloud <session-id>

118```

119 

120对于 `<session-id>`,传递裸 `session_...` 或 `cse_...` ID 或会话的 claude.ai/code URL。成功发送打印 `Sent to cloud session.` 以及会话 ID 和查看链接。接受的 ID 形式、JSON 输出、帐户和策略要求以及错误参考在[从 CLI 发送后续消息](/docs/zh-CN/claude-code-on-the-web#send-follow-ups-from-the-cli)上,因为该命令对 Anthropic 托管的会话的工作方式相同。

121 

122<h2 id="what’s-next">

123 接下来的步骤

124</h2>

125 

126* [部署到生产环境](/docs/zh-CN/self-hosted-environments-deploy):强化部署、控制出口、配置 git 凭证,并在 Kubernetes 或 Compose 下运行部队

127* [自定义会话](/docs/zh-CN/self-hosted-environments-configuration):包装脚本、生命周期钩子、按需运行器、MCP 服务器和权限

128* [端到端测试](/docs/zh-CN/self-hosted-environments-testing):一个 CI 烟雾测试,分派会话并读取 Claude 的回复

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> 自托管运行器和编排器的完整参考:CLI 标志、环境变量和 Prometheus 指标。

8 

9<Note>

10 自托管环境在 Team 和 Enterprise 计划上处于公开测试阶段;[所有者](/docs/zh-CN/cloud-environments#organization-shared-environments)通过在[**云环境**管理页面](https://claude.ai/admin-settings/cloud-environments)上打开**允许自托管环境**来启用它们。本页面是标志和指标参考;有关设置,请参阅[快速入门](/docs/zh-CN/self-hosted-environments-quickstart),有关舰队配方,请参阅[部署到生产](/docs/zh-CN/self-hosted-environments-deploy)。

11</Note>

12 

13本页面是您在[自托管环境](/docs/zh-CN/self-hosted-environments)中运行的两个进程的参考:运行器,它在您的主机上执行 Claude Code [云会话](/docs/zh-CN/claude-code-on-the-web),以及可选的自动扩展编排器,它在会话队列时启动运行器。每个都有自己的标志表。两者都在 Linux 或 macOS 主机上运行,默认值如 `/workspace` 和 `~/.claude` 假设。运行 `claude self-hosted-runner --help` 以获取已安装版本上的权威列表。

14 

15指标系列和一些 API 字段仍然使用 `pool` 来表示这些页面所称的环境;两个术语都指同一事物。环境 ID 是 `pool_id` 字段,形式为 `ccpool_...`:无论这些页面在哪里显示 `pool` 标识符,它都命名环境。CLI 标志和环境变量将其拼写为 `environment`,例如 `--environment-secret-file`;已弃用的 `pool` 拼写仍然有效,如[`--environment-secret-file` 行](#runner-cli-flags)所述。

16 

17<h2 id="runner-cli-flags">

18 Runner CLI 标志

19</h2>

20 

21大多数标志都有相应的环境变量。当两者都设置时,标志优先。持续时间标志在 CLI 上采用分钟或秒,但配对的环境变量始终以毫秒为单位,由 `_MS` 后缀表示,默认列显示标志的单位:`--exit-if-unused-min 10` 等同于 `SELF_HOSTED_RUNNER_IDLE_SHUTDOWN_MS=600000`,而 Helm 值如 `SELF_HOSTED_RUNNER_STARTUP_TIMEOUT_MS: "15"` 表示 15 毫秒,而不是 15 分钟的默认值。

22 

23| 标志 | 环境变量 | 默认值 | 描述 |

24| :---------------------------------------- | :------------------------------------------------ | :-------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

25| `--api-url <url>` | 无 | `https://api.anthropic.com` | API 基础 URL。仅为测试覆盖。 |

26| `--base-dir <path>` | `SELF_HOSTED_RUNNER_BASE_DIR` | `/workspace`;Windows 上无 | 用于存储库检出和每个会话工作目录的目录。运行器需要对此路径或其父路径的写入访问权限。运行器在启动时创建目录,当无法创建或写入时以 `cannot create or write to base directory` 退出。在 v2.1.225 之前,运行器在第一个会话启动时创建目录,因此不可用的路径会导致会话失败而不是启动失败。在 Windows 上(不是受支持的运行器主机),没有默认值:除非您传递标志或设置变量,否则运行器在启动时退出。在环境中的每个运行器上使用相同的值。请参阅[在运行器之间保持基础目录和容量相同](/docs/zh-CN/self-hosted-environments-deploy#keep-the-base-directory-and-capacity-identical-across-runners)。 |

27| `--capacity <n>` | 无 | `1` | 此运行器处理的最大并发会话数。所有会话都属于同一个锁定的[所有者](/docs/zh-CN/self-hosted-environments#key-concepts)。在环境中的每个运行器上使用相同的值;请参阅[在运行器之间保持基础目录和容量相同](/docs/zh-CN/self-hosted-environments-deploy#keep-the-base-directory-and-capacity-identical-across-runners)。 |

28| `--client-label <label>` | `SELF_HOSTED_RUNNER_CLIENT_LABEL` | 主机的主机名 | 运行器注册时发送的标签。运行器还将其报告为 [`claude_code_self_hosted_runner_info`](#prometheus-metrics) 的 `client_label` 标签。需要 Claude Code v2.1.248 或更高版本。 |

29| `--configure-git` | `SELF_HOSTED_RUNNER_CONFIGURE_GIT=1` | 关闭 | 在启动时,写入全局 git 身份,启用 Anthropic 提交签名,打开 git push 协商,并安装追加 `Co-authored-by:` 预告片的提交钩子。Push 协商需要 Claude Code v2.1.257 或更高版本。请参阅[配置 git](/docs/zh-CN/self-hosted-environments-deploy#configure-git)。 |

30| `--confine-repo-settings <mode>` | `SELF_HOSTED_RUNNER_CONFINE_REPO_SETTINGS` | `warn` | 设置保护的模式,当存储库的已提交设置尝试授予对该会话自己的工作区之外的写入或读取访问权限、设置环境变量或覆盖操作员的沙箱或钩子姿态(例如 `sandbox.enabled: false` 或 `disableAllHooks`)时标记会话。默认 `warn` 记录违规并仍然启动会话,`enforce` 拒绝会话,`off` 禁用扫描。请参阅[加强您的部署](/docs/zh-CN/self-hosted-environments-deploy#harden-your-deployment)。 |

31| `--debug-token-dir <path>` | `SELF_HOSTED_RUNNER_DEBUG_TOKEN_DIR` | 未设置 | 将实时令牌写入磁盘以供检查。仅用于调试;不要在生产中使用。 |

32| `--defer-shutdown-max-min <n>` | `SELF_HOSTED_RUNNER_DEFER_SHUTDOWN_MAX_MS` | `0` | 在第一个 `SIGTERM` 或 `SIGINT` 上,继续为已附加的会话提供服务而不是排空它们,然后在 N 分钟后释放仍然附加的任何内容并退出。在设置此值之前提高主机的停止超时。请参阅[将排空推迟到第一个信号之后](/docs/zh-CN/self-hosted-environments-deploy#defer-the-drain-past-the-first-signal)。`0` 禁用。需要 Claude Code v2.1.238 或更高版本。 |

33| `--drain-grace-sec <n>` | `SELF_HOSTED_RUNNER_DRAIN_GRACE_MS` | `0` | 在运行器接收到关闭信号或达到其退休时间之前,控制运行器在其活跃会话完成后何时退出:`0` 立即退出而不轮询更多内容,正值使运行器保持活跃并首先重新轮询锁定所有者的队列那么多秒,代价是[加强部分](/docs/zh-CN/self-hosted-environments-deploy#harden-your-deployment)中描述的每个会话容器隔离。在您使用 [`--defer-shutdown-max-min`](/docs/zh-CN/self-hosted-environments-deploy#defer-the-drain-past-the-first-signal) 推迟的第一个信号之后,运行器在不持有任何会话时立即退出,无论您在此处设置什么。 |

34| `--drain-wait-sec <n>` | `SELF_HOSTED_RUNNER_DRAIN_WAIT_MS` | `0` | 一旦排空开始(在 `SIGTERM` 上,除非您设置 [`--defer-shutdown-max-min`](/docs/zh-CN/self-hosted-environments-deploy#defer-the-drain-past-the-first-signal)),等待最多 N 秒以完成每个会话的进行中的轮次和后台任务,然后终止子进程。在此等待期间,运行器将刚刚完成的后台任务计为仍在运行,直到读取其结果的后续轮次开始,最多为 [`SELF_HOSTED_RUNNER_BG_RESULT_GRACE_MS`](#environment-variable-only-settings) 窗口。 |

35| `--environment-secret-file <path>` | `SELF_HOSTED_RUNNER_ENVIRONMENT_SECRET` | 必需 | 包含环境密钥的文件的路径,或对于由[编排器](/docs/zh-CN/self-hosted-environments-configuration#on-demand-runners)生成的运行器,单次使用的工作订单 JWT。`SELF_HOSTED_RUNNER_ENVIRONMENT_SECRET` 直接携带密钥值,而不是文件路径。较旧的 `--pool-secret-file` 标志和 `SELF_HOSTED_RUNNER_POOL_SECRET` 变量仍然有效并向 stderr 打印弃用通知;早于 2.1.216 的预览程序运行器构建仅识别这些较旧的名称。 |

36| `--exec-path <path>` | `SELF_HOSTED_RUNNER_EXEC_PATH` | 自己的二进制文件 | 为每个会话生成的二进制文件或包装脚本。请参阅[包装脚本](/docs/zh-CN/self-hosted-environments-configuration#wrapper-scripts)。 |

37| `--exit-if-unused-min <n>` | `SELF_HOSTED_RUNNER_IDLE_SHUTDOWN_MS` | `0` | 在 N 分钟的轮询后退出,没有任何工作被分配,用于自动扩展器缩小。`0` 禁用。 |

38| `--git-host-rewrite <from>=<to>` | 无 | 未设置 | 在克隆之前将 `https://<from>/...` 源 URL 重写为 `https://<to>/...`,用于分割视界 DNS。可重复;仅标志。 |

39| `--git-ssh-rewrite <host>` | 无 | 未设置 | 在克隆之前将 `https://<host>/...` 源 URL 重写为 `git@<host>:...`,用于仅 SSH git 主机。可重复;仅标志。 |

40| `--health-port <port>` | `SELF_HOSTED_RUNNER_HEALTH_PORT` | `8080` | `/healthz` 和 `/metrics` 侦听器的端口。设置 `0` 以禁用。 |

41| `--hooks-dir <path>` | `SELF_HOSTED_RUNNER_HOOKS_DIR` | 未设置 | 生命周期钩子脚本的目录。请参阅[生命周期钩子](/docs/zh-CN/self-hosted-environments-configuration#lifecycle-hooks)。 |

42| `--kill-session-after-min <n>` | `SELF_HOSTED_RUNNER_MAX_LIFETIME_MS` | `0` | 将会话限制为 N 分钟的挂钟时间,作为卡住会话的安全限制。在 v2.1.260 或更高版本上,运行器释放达到限制的会话,以便它可以在其用户的下一条消息上恢复,仅当它在 [`SELF_HOSTED_RUNNER_MAX_LIFETIME_GRACE_MS`](#environment-variable-only-settings) 宽限期结束时仍在运行器上时才终止它。在 v2.1.260 之前,运行器在限制处终止会话。请参阅[某些会话不计为空闲](/docs/zh-CN/self-hosted-environments-deploy#some-sessions-don%E2%80%99t-count-as-idle)了解详情以及如何选择值。`0` 禁用。 |

43| `--lock-to-account <id>` | `SELF_HOSTED_RUNNER_LOCK_TO_ACCOUNT` | 未设置 | 在启动时将运行器预锁定到特定帐户,而不是在第一个会话上锁定。接受环境组织中的电子邮件地址或 `user_...` ID。预锁定的运行器永远不会拾取 Claude Tag 频道会话,这些会话没有帐户。 |

44| `--log-file <path>` | `SELF_HOSTED_RUNNER_LOG_FILE` | 未设置 | 除了 stdout 和 stderr 之外,还将运行器日志镜像到文件,使用 `0600` 权限创建。`self-hosted-runner doctor` 需要在本地尾部日志。 |

45| `--log-level <level>` | 无 | `info` | `info` 或 `debug` |

46| `--post-session-hook-timeout-sec <n>` | `SELF_HOSTED_RUNNER_POST_SESSION_HOOK_TIMEOUT_MS` | `60` | 每个会话结束(包括运行器关闭)时 [`post-session` 钩子](/docs/zh-CN/self-hosted-environments-configuration#post-session)的预算 |

47| `--proxy-authorization-command <command>` | `SELF_HOSTED_RUNNER_PROXY_AUTHORIZATION_COMMAND` | 未设置 | 运行器为每个到您的出口代理的连接运行的 shell 命令,使用其修剪的 stdout 作为 `Proxy-Authorization` 标头值。需要 `HTTPS_PROXY` 或 `HTTP_PROXY`,不能与 `--proxy-authorization-file` 结合。请参阅[向出口代理进行身份验证](/docs/zh-CN/self-hosted-environments-deploy#authenticate-to-an-egress-proxy)。需要 Claude Code v2.1.238 或更高版本。 |

48| `--proxy-authorization-file <path>` | `SELF_HOSTED_RUNNER_PROXY_AUTHORIZATION_FILE` | 未设置 | 运行器为每个到您的出口代理的连接读取的文件,使用其修剪的内容作为 `Proxy-Authorization` 标头值。对另一个进程轮换到位的令牌使用此标志。与 `--proxy-authorization-command` 具有相同的要求,不能与其结合。请参阅[向出口代理进行身份验证](/docs/zh-CN/self-hosted-environments-deploy#authenticate-to-an-egress-proxy)。需要 Claude Code v2.1.238 或更高版本。 |

49| `--push-outcome-on-release` | `SELF_HOSTED_RUNNER_PUSH_OUTCOME_ON_RELEASE` | 关闭 | 在运行器启动的会话结束(例如排空或空闲释放)时,在删除工作区之前将跟踪的结果分支推送到 `origin`,以便进行中的提交在重新启动后存活。尽力而为;向关闭预算添加 30 秒,需要 git 2.29 或更高版本以从推送的分支恢复。在启用之前限制对 `claude/*` refs 的推送访问;请参阅[恢复的会话丢失未推送的工作](/docs/zh-CN/self-hosted-environments-deploy#additional-limitations)。通过 `checkout` 生命周期钩子检出的存储库不会被推送;改为从 [`post-session` 钩子](/docs/zh-CN/self-hosted-environments-configuration#post-session)快照这些。 |

50| `--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` 禁用。 |

51| `--retire-at <epoch-seconds>` | `SELF_HOSTED_RUNNER_RETIRE_AT` | 未设置 | 在绝对 Unix 时间戳(以秒为单位)处退休运行器,用于在已知时间杀死运行器的基础设施;[运行器生命周期](/docs/zh-CN/self-hosted-environments#runner-lifecycle)描述释放序列以及如何调整边距。2001 年之前或 5138 年之后的值被标志拒绝,被环境变量忽略。 |

52| `--session-stop-grace-sec <n>` | `SELF_HOSTED_RUNNER_SESSION_STOP_GRACE_MS` | `5` | 会话结束后等待 Claude 进程干净退出的时间,然后强制杀死它。如果子进程自己的 `SessionEnd` 钩子需要更多时间,请提高该值。 |

53| `--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` 禁用。 |

54| `--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)无论此标志如何都扫描它们。 |

55| `--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 或更高版本;运行器否则拒绝启动。取代重写标志。 |

56 

57大多数持续时间标志都有最大值,选择以将每个超时保持在运行时的 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` 无上限。超过上限的行为因表面而异:

58 

59* **标志**:启动失败并出现错误。

60* **环境变量**:运行器将值夹紧到计时器上限,而不是拒绝它。

61 

62<h2 id="orchestrator-cli-flags">

63 Orchestrator CLI 标志

64</h2>

65 

66`self-hosted-runner orchestrator` 子命令(生成[按需运行器](/docs/zh-CN/self-hosted-environments-configuration#on-demand-runners))接受 `--api-url`、`--environment-secret-file`、`--hooks-dir`、`--health-port` 和 `--log-level`,与运行器具有相同的默认值,以及运行器的标志具有的相同环境变量(除了 `--hooks-dir` 是必需的,必须包含 `spawn-runner` 钩子)。它还采用自己的标志:

67 

68| 标志 | 默认值 | 描述 |

69| :------------------------------- | :---- | :----------------------------------------------------------------------------------------------------- |

70| `--hook-concurrency <n>` | `4` | 最大 `spawn-runner` 钩子并行运行。还限制每次轮询声称的生成请求数。 |

71| `--hook-timeout <sec>` | `60` | 在这么多秒后终止钩子的进程树。超时加其 5 秒杀死宽限期必须保持在 `--expected-spawn-seconds` 以下;编排器在启动时强制执行此操作。 |

72| `--expected-spawn-seconds <sec>` | `120` | 生成的运行器的预期 p99 启动时间,在服务器强制的范围 10 到 3600 内。在每次轮询时发送作为服务器端租约;如果没有运行器在其过期前注册,会话将使用新的订单 ID 重新提供。所有副本必须共享此值。 |

73| `--min-idle <n>` | `0` | 通过主动生成待命运行器来保持至少 N 个空闲会话槽。`0` 禁用预热。与运行器的 `--exit-if-unused-min` 配对,以便多余的待命运行器回收自己。 |

74| `--debug-dir <path>` | 未设置 | 将每个生成请求的工作订单和钩子 stderr 写入磁盘。仅用于调试;永远不要在生产中设置。 |

75 

76<h3 id="scm-connector-flags">

77 SCM 连接器标志

78</h3>

79 

80编排器可以与 Anthropic 的控制平面保持一个常设 WebSocket 连接,以便托管的预会话流(例如存储库选择器和分支或 ref 解析器)可以到达仅从您的网络内部可路由的 GitHub Enterprise Server 主机。除非您设置 `--scm-connector-host`,否则连接器保持关闭。

81 

82| 标志 | 默认值 | 描述 |

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

84| `--scm-connector-host <host[:port]>` | 未设置 | GitHub Enterprise Server 主机名以转发请求。端口默认为 `443`。设置此标志启用连接器。 |

85| `--scm-connector-id <n>` | 与 `--scm-connector-host` 一起需要 | 您的组织的 GitHub Enterprise Server 连接的数字 ID。启用连接器时,请与您的 Anthropic 帐户团队联系以获取该值。 |

86| `--scm-connector-provider <slug>` | `ghe` | 标识提供程序的路径段,匹配 `^[a-z0-9-]{1,32}$`。 |

87| `--scm-connector-ca-file <path>` | 未设置 | 额外的 CA 包,PEM 格式,用于到 GitHub Enterprise Server 主机的 TLS 连接。 |

88| `--scm-connector-host-rewrite <from>=<to_host:to_port>` | 未设置 | 仅用于端到端测试:重定向 TCP 连接,同时将 Host 标头和 TLS SNI 保持为 `--scm-connector-host`。 |

89 

90连接器使用编排器的现有环境密钥进行身份验证并自动重新连接:在连接断开时使用指数退避,或当控制平面关闭连接因为另一个编排器副本已持有它时使用固定的 30 秒延迟。

91 

92<h2 id="environment-variable-only-settings">

93 仅环境变量设置

94</h2>

95 

96这些运行器设置仅从环境读取,涵盖大多数部署保留在默认值的行为:

97 

98| 环境变量 | 默认值 | 描述 |

99| :----------------------------------------- | :---------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

100| `SELF_HOSTED_RUNNER_BG_RESULT_GRACE_MS` | `30000` | 运行器在后台任务完成后认为会话繁忙的时间,而读取结果的后续轮次尚未开始。[`--drain-wait-sec` 和 `--release-idle-session-min` 行](#runner-cli-flags)描述了保持在排空和空闲释放时的应用位置,[运行器生命周期](/docs/zh-CN/self-hosted-environments#runner-lifecycle)描述了它在 `--retire-at` 退休时的应用位置。`0` 或不可用的值回退到默认值,因此无法关闭保持。需要 Claude Code v2.1.228 或更高版本。 |

101| `SELF_HOSTED_RUNNER_HOST_CONFIG_DIR` | `~/.claude` | 捕获到运行器启动快照中并播种到每个会话的 `CLAUDE_CONFIG_DIR` 的目录;磁盘上的更改在运行器重新启动后应用。设置变量也会移动运行器读取 `.claude.json` 的位置以进行 [MCP 播种](/docs/zh-CN/self-hosted-environments-configuration#mcp-servers),因此设置它(包括其自己的默认值)会重新定位该查找;指向空目录以完全禁用播种。 |

102| `SELF_HOSTED_RUNNER_MAX_LIFETIME_GRACE_MS` | `900000` | 运行器在会话达到其 `--kill-session-after-min` 限制后等待的时间,以便运行中的轮次完成或释放完成,然后才终止会话 |

103| `SELF_HOSTED_RUNNER_SIGKILL_GRACE_MS` | `30000` | 运行器等待操作系统向陷入不可中断 I/O 的子进程传递 `SIGKILL` 的时间,然后自己退出。下限为 `--post-session-hook-timeout-sec` 加 15 秒,设置 `--push-outcome-on-release` 时再加 30 秒,因此有效最小值在默认值处为 75 秒。 |

104| `CLAUDE_RUNNER_FETCH_DEPTH` | `50` | 新克隆的 git 获取深度。设置正整数,或 `full` 或 `0` 以进行完整获取。工作区中已存在的存储库保持其现有深度。 |

105| `CLAUDE_RUNNER_SKIP_GIT_VERIFY` | 未设置 | 当为 `1` 时,跳过 `checkout` 钩子运行后的 `.git` 存在检查。当您的钩子物化非 git 源时设置此项。 |

106| `FORCE_AUTOUPDATE_PLUGINS` | 未设置 | 当为 `1` 时,让插件市场自动更新,即使二进制文件被固定 |

107| `CLAUDE_CODE_DISABLE_ARTIFACT` | 未设置 | 当为 `1` 时,无论组织的管理员设置如何,都在会话中禁用 Artifact 工具,并删除 `*.frame.claudeusercontent.com` 出口要求 |

108 

109<h2 id="telemetry">

110 遥测

111</h2>

112 

113会话子进程向 Anthropic 发送操作遥测,除非您关闭它。不发送代码或存储库内容。在运行器进程上设置遥测变量;运行器在应用服务器提供的环境变量后重新声明它们,因此操作员的设置始终优先。

114 

115一个控制特定于自托管环境:`CLAUDE_CODE_BYOC_ENABLE_DATADOG=1` 选择加入 Datadog 操作指标,这在自托管环境中默认关闭。一般 Claude Code 遥测控制 `DISABLE_TELEMETRY`、`DO_NOT_TRACK`、`DISABLE_ERROR_REPORTING` 和 `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC` 适用于会话子进程,如[环境变量参考](/docs/zh-CN/env-vars)中所述。`DISABLE_GROWTHBOOK` 相关但不同:设置 `DISABLE_GROWTHBOOK=1` 禁用功能标志获取,遥测保持开启,除非也设置了 `DISABLE_TELEMETRY`。

116 

117`CLAUDE_CODE_ENABLE_TELEMETRY` 无关:它启用 OpenTelemetry 导出到您自己的收集器,如[监控](/docs/zh-CN/monitoring-usage)中所述,不控制 Anthropic 的分析。

118 

119<h2 id="health-endpoint">

120 健康端点

121</h2>

122 

123运行器在配置的健康端口上提供 `GET /healthz`。只要进程活跃,响应就是 `200 OK`,无论轮询循环处于什么状态,因此此端点上的 HTTP 探针仅检测死进程。JSON 正文描述当前状态:

124 

125```json theme={null}

126{

127 "status": "ok",

128 "runner_id": "ccrunner_...",

129 "active_sessions": 2,

130 "last_poll_at": "2026-03-31T18:04:11.220Z",

131 "last_poll_age_ms": 842

132}

133```

134 

135在自定义探针中使用 `last_poll_age_ms` 作为活跃信号;无限增长的值表示轮询循环卡住。`last_poll_at` 和 `last_poll_age_ms` 都是 `null`,直到第一次轮询完成。

136 

137编排器在其健康端口上提供自己的 `/healthz`。其端点始终返回 `200`,正文携带报告最近一次轮询是否成功的 `connected` 字段,加上 `queue_counts` 中的每个状态生成队列计数。在自定义探针中使用 `connected` 而不是状态代码来控制就绪和警报。

138 

139当[SCM 连接器](#scm-connector-flags)被配置时,编排器的 `/healthz` 正文也携带 `scm_connector_connected` 和一个 `scm_connector` 对象,包含 `connected`、`last_connected_at`、`last_error`、`reconnects` 和 `requests_forwarded`。当未设置 `--scm-connector-host` 时,两个字段都是 `null`。

140 

141<h2 id="prometheus-metrics">

142 Prometheus 指标

143</h2>

144 

145每个运行器在与 `/healthz` 相同的端口上的 `GET /metrics` 处提供 Prometheus 指标。关键系列:

146 

147| 系列 | 注释 |

148| :-------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

149| `claude_code_self_hosted_runner_info{runner_id,version,client_label}` | 始终为 `1`;对舰队库存和版本漂移检测有用 |

150| `claude_code_self_hosted_runner_capacity` | 配置的 `--capacity` |

151| `claude_code_self_hosted_runner_active_sessions` | 当前运行的会话 |

152| `claude_code_self_hosted_runner_locked_account{email}` | 一旦运行器锁定到用户并发出携带 `act.email` 声明的会话令牌,就存在。该系列在锁定到 Claude Tag 代理的运行器上不存在,其会话令牌不携带 `act.email`。标签值是帐户电子邮件;如果您的指标存储被广泛读取,在抓取时删除或哈希标签,例如使用 Prometheus `metric_relabel_configs`。 |

153| `claude_code_self_hosted_runner_last_poll_age_seconds` | 自上次成功轮询以来的秒数。如果超过 60,则发出警报。 |

154| `claude_code_self_hosted_runner_poll_errors_total{error_kind}` | 按类型累积 PollWork 失败:`transport`、`timeout`、`5xx`、`429` 或 `4xx`。所有五个系列从进程启动时存在;在 `rate(...[5m]) > 0` 时发出警报。 |

155| `claude_code_self_hosted_runner_sessions_started_total{client_platform}` | 在运行器的生命周期内生成的会话子进程,每个会话来源一个系列,例如 `web_claude_ai`、`ios`、`android`、`desktop_app` 或 `claude_code_cli`,或当服务器未发送时为 `unknown`。Slack 会话根据哪个 Slack 集成创建它们,携带 `claude_in_slack` 或 `claude-in-slack`,因此使用正则表达式选择器(例如 `{client_platform=~"claude[-_]in[-_]slack"}` 匹配两者。对舰队总数使用 `sum()`。 |

156| `claude_code_self_hosted_runner_sessions_completed_total{client_platform}` | 干净结束的会话,标签方式相同。比普通干净退出更广泛:请参阅[会话生命周期计数器语义](#session-lifecycle-counter-semantics)了解计数内容。 |

157| `claude_code_self_hosted_runner_sessions_failed_total{client_platform}` | 以失败结束的会话,标签方式相同。相同的注意事项:请参阅[会话生命周期计数器语义](#session-lifecycle-counter-semantics)。 |

158| `claude_code_self_hosted_runner_sessions_interrupted_total{client_platform}` | 运行器因操作原因而不是会话结果终止的会话,标签方式相同。请参阅[会话生命周期计数器语义](#session-lifecycle-counter-semantics)。 |

159| `claude_code_self_hosted_runner_initializing_sessions` | 当前处于初始化阶段的会话,从分配到子进程的初始化事件 |

160| `claude_code_self_hosted_runner_session_init_duration_seconds` | 会话初始化持续时间的直方图 |

161| `claude_code_self_hosted_runner_session_init_errors_total` | 在达到初始化前失败的会话:checkout 钩子失败、git 准备、令牌问题或初始化前子进程崩溃 |

162| `claude_code_self_hosted_runner_session_start_hook_errors_total` | 报告错误结果的 `SessionStart` 钩子,每个失败的钩子执行一个 |

163| `claude_code_self_hosted_runner_session_idle_seconds{session_id,client_platform}` | 每个会话的仪表,显示会话空闲以来的秒数。对于终止卡在未回答权限提示上的会话很有用。 |

164 

165编排器在与其 `/healthz` 相同的端口上的 `GET /metrics` 处提供自己的系列:

166 

167| 系列 | 注释 |

168| :-------------------------------------------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------- |

169| `claude_code_self_hosted_orchestrator_info{version,pool_id,orchestrator_uuid,hostname}` | 始终为 `1` |

170| `claude_code_self_hosted_orchestrator_connected` | 当最近一次轮询成功时为 `1`;在任何失败的轮询后下降到 `0`,无论失败类型如何 |

171| `claude_code_self_hosted_orchestrator_last_poll_age_seconds` | 自上次轮询尝试以来的秒数,成功或失败,与运行器的同名指标不同,后者测量自上次成功以来;与 `connected` 配对以捕获失败的轮询。编排器的轮询循环等待钩子执行,因此在 `--hook-timeout` 加边距(默认值约 90 秒)之上发出警报,而不是固定的 60。 |

172| `claude_code_self_hosted_orchestrator_poll_errors_total{error_kind}` | 按类型累积 PollSpawnHints 失败:`transport`、`timeout`、`5xx`、`429` 或 `4xx`。所有五个系列从进程启动时存在;在 `rate(...[5m]) > 0` 时发出警报。 |

173| `claude_code_self_hosted_orchestrator_queue_pending_sessions` | 现在可声称的生成请求 |

174| `claude_code_self_hosted_orchestrator_queue_backing_off_sessions` | 在可重试钩子失败后处于重试退避中的生成请求 |

175| `claude_code_self_hosted_orchestrator_queue_circuit_broken_sessions` | 被阻止的生成请求,直到所有者从环境的**活动**选项卡重试它们;如果高于零则发出警报 |

176| `claude_code_self_hosted_orchestrator_pool_pending_sessions` | 等待此环境中的运行器的总会话。环境范围的聚合,在每个编排器实例上相同:在实例间使用 `MAX` 而不是 `SUM`。 |

177| `claude_code_self_hosted_orchestrator_pool_active_sessions` | 当前分配给此环境中活跃运行器的会话。环境范围的聚合,在每个编排器实例上相同:在实例间使用 `MAX` 而不是 `SUM`。 |

178| `claude_code_self_hosted_orchestrator_spawn_hooks_total{result}` | 累积 `spawn-runner` 钩子结果:`ok`、`retryable`、`non_retryable`。计数编排器钩子调用,而不是运行器生成的会话子进程:与 `sessions_started_total` 不可比,因为容量高于 1、热池和为同一会话再次生成的运行器都使两者分散。 |

179| `claude_code_self_hosted_orchestrator_spawn_hook_duration_seconds` | 钩子持续时间的直方图 |

180| `claude_code_self_hosted_orchestrator_warm_hints_dispatched_total` | 自进程启动以来分派的待命生成请求 |

181| `claude_code_self_hosted_orchestrator_session_queue_wait_seconds` | 每个会话在队列中等待的秒数的直方图,然后编排器声称它用于生成,从控制平面与每个会话的生成请求一起发送的队列等待时间戳记录。用于 p50/p99 队列时间警报。预热生成不被采样。 |

182| `claude_code_self_hosted_orchestrator_clock_skew_seconds` | 本地减去服务器时钟偏差;诊断,一旦测量就存在 |

183| `claude_code_self_hosted_orchestrator_scm_connector_connected` | 当 [SCM 连接器](#scm-connector-flags) 的 WebSocket 打开时为 `1`;在拨号或退避时为 `0`。当未设置 `--scm-connector-host` 时不存在。 |

184| `claude_code_self_hosted_orchestrator_scm_connector_requests_forwarded_total` | 自进程启动以来代理到配置的 SCM 主机的累积 HTTP 请求。当未设置 `--scm-connector-host` 时不存在。 |

185 

186对于自动扩展,选择与您的扩展风格匹配的系列,并在将其馈送到扩展器之前对其进行门控:

187 

188* **队列深度扩展**:将 `claude_code_self_hosted_orchestrator_pool_pending_sessions` 馈送到您的 HPA 或 KEDA 扩展器,而不是 `queue_pending_sessions`。

189* **容量扩展**:按运行器的 `active_sessions` 与 `capacity` 的比率进行扩展。

190* **在 `connected` 上门控**:使用 `claude_code_self_hosted_orchestrator_connected == 1` 按实例过滤查询,以便断开连接的副本的陈旧值不会馈送到扩展器。

191 

192在完整轮询中断期间,每个副本都断开连接,门控查询返回无数据。HPA 在缺少指标时保持当前副本计数,但 KEDA 的 Prometheus 扩展器在其默认 `ignoreNullValues: "true"` 处将空结果读取为零并缩小;在 ScaledObject 上设置 `ignoreNullValues: "false"`,可选择使用 `fallback` 副本下限。

193 

194以下 Prometheus Operator `PodMonitor` 涵盖两个进程。它通过 `app.kubernetes.io/part-of: claude-code-self-hosted-runner` 标签和[Kubernetes 配方](/docs/zh-CN/self-hosted-environments-deploy#kubernetes)设置的命名 `health` 端口选择 pod;调整命名空间以匹配您的部署:

195 

196```yaml theme={null}

197# Claude Code 自托管运行器 + 编排器的示例 Prometheus Operator PodMonitor。

198# 调整命名空间和标签选择器以匹配您的部署。运行器和编排器都在其

199# --health-port(默认 8080)上提供 /metrics。

200apiVersion: monitoring.coreos.com/v1

201kind: PodMonitor

202metadata:

203 name: claude-code-self-hosted-runner

204 namespace: monitoring

205spec:

206 namespaceSelector:

207 matchNames:

208 - claude-runners

209 selector:

210 matchExpressions:

211 # 匹配 Kubernetes 配方中的运行器部署,加上您标记相同方式的任何

212 # 按需运行器作业和编排器 pod,并给予命名的"health"containerPort。

213 - key: app.kubernetes.io/part-of

214 operator: In

215 values: [claude-code-self-hosted-runner]

216 podMetricsEndpoints:

217 - port: health

218 path: /metrics

219 interval: 30s

220```

221 

222这些示例警报规则是一个起点;为您的舰队大小调整阈值:

223 

224```yaml theme={null}

225# Claude Code 自托管运行器 + 编排器的示例 Prometheus 警报规则。

226# 为您的舰队大小和 SLO 调整阈值。

227groups:

228 - name: claude-code-self-hosted-runner

229 rules:

230 - alert: ClaudeRunnerPollStale

231 expr: claude_code_self_hosted_runner_last_poll_age_seconds > 60

232 for: 2m

233 labels: {severity: warning}

234 annotations:

235 summary: "运行器 {{ $labels.pod }} 已超过 60 秒未轮询"

236 - alert: ClaudeRunnerVersionDrift

237 expr: count(count by (version) (claude_code_self_hosted_runner_info)) > 1

238 for: 30m

239 labels: {severity: info}

240 annotations:

241 summary: "运行器正在运行混合版本"

242 - alert: ClaudeRunnerInitErrorsHigh

243 expr: increase(claude_code_self_hosted_runner_session_init_errors_total[10m]) > 3

244 for: 5m

245 labels: {severity: warning}

246 annotations:

247 summary: "运行器 {{ $labels.pod }}:10 分钟内 >3 个会话初始化失败(checkout 钩子 / git / 令牌 / 初始化前崩溃)"

248 - alert: ClaudeRunnerPollErrors

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

250 for: 2m

251 labels: {severity: warning}

252 annotations:

253 summary: "运行器 {{ $labels.pod }}:PollWork 失败({{ $value | humanize }}/s 超过 5m)"

254 - alert: ClaudeRunnerSessionStartHookErrors

255 expr: increase(claude_code_self_hosted_runner_session_start_hook_errors_total[10m]) > 3

256 for: 5m

257 labels: {severity: warning}

258 annotations:

259 summary: "运行器 {{ $labels.pod }}:10 分钟内 >3 个 SessionStart 钩子失败"

260 

261 - name: claude-code-self-hosted-orchestrator

262 rules:

263 - alert: ClaudeOrchestratorDisconnected

264 expr: claude_code_self_hosted_orchestrator_connected == 0

265 for: 2m

266 labels: {severity: critical}

267 annotations:

268 summary: "编排器 {{ $labels.pod }} 无法到达 Anthropic 控制平面"

269 - alert: ClaudeOrchestratorPollStale

270 expr: claude_code_self_hosted_orchestrator_last_poll_age_seconds > 90

271 for: 2m

272 labels: {severity: warning}

273 annotations:

274 summary: "编排器 {{ $labels.pod }} 已超过 90 秒未轮询(轮询循环等待钩子执行)"

275 - alert: ClaudeOrchestratorCircuitBroken

276 expr: claude_code_self_hosted_orchestrator_queue_circuit_broken_sessions > 0

277 for: 1m

278 labels: {severity: critical}

279 annotations:

280 summary: "{{ $value }} 个会话断路 — spawn-runner 钩子反复不可重试;修复基础设施然后从活动选项卡重试"

281 - alert: ClaudeOrchestratorPollErrors

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

283 for: 2m

284 labels: {severity: warning}

285 annotations:

286 summary: "编排器 {{ $labels.pod }}:PollSpawnHints 失败({{ $value | humanize }}/s 超过 5m)"

287 - alert: ClaudeOrchestratorSpawnHookFailing

288 expr: sum by (pod) (increase(claude_code_self_hosted_orchestrator_spawn_hooks_total{result!="ok"}[5m])) > 3

289 for: 5m

290 labels: {severity: warning}

291 annotations:

292 summary: "编排器 {{ $labels.pod }}:5 分钟内 >3 个 spawn-runner 钩子失败"

293```

294 

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

296 传递会话子进程指标

297</h3>

298 

299每个会话在其自己的子进程中运行,具有自己的 OpenTelemetry 指标;在 `--capacity` 高于 1 时,运行器重写这些子指标的公开方式。在运行器主机上设置 `OTEL_METRICS_EXPORTER=prometheus` 和会话环境中的 `CLAUDE_CODE_ENABLE_TELEMETRY=1`(例如从您的[包装脚本](/docs/zh-CN/self-hosted-environments-configuration#wrapper-scripts)或运行器自己的环境,会话继承),重新公开每个子进程的计数器和仪表工具在运行器自己的 `/metrics` 端点上,与运行器的系列一起。运行器将子进程的导出器重写为通过 OTLP 推送到健康端口上的仅环回接收器,用 `session_id` 和 `client_platform` 标签标记每个系列,并在该会话结束时驱逐会话的系列。直方图不通过,子指标名称与运行器自己的前缀冲突的会被删除。

300 

301在默认 `--capacity 1` 处,重写不适用:会话的子进程照常在端口 9464 上绑定自己的 Prometheus 端点。

302 

303<h3 id="session-lifecycle-counter-semantics">

304 会话生命周期计数器语义

305</h3>

306 

307`sessions_started_total`、`sessions_completed_total`、`sessions_failed_total` 和 `sessions_interrupted_total` 计数器按会话如何结束对其进行分类。每个生成的会话子进程在生成时增加 `sessions_started_total`,并且在退出时恰好增加其他三个中的一个,因此 `sessions_started_total` 减去其他三个的总和等于当前运行的会话子进程数。

308 

309* `completed`:会话干净结束。这涵盖子进程以代码 `0` 自行退出、会话在子进程仍连接时被存档或删除,以及运行器干净地交还槽:在空闲超时、退休时间或 `--kill-session-after-min` 限制处释放会话;启动超时;或轮询循环在子进程退出前注意到的服务器端取消分配。增加 `sessions_completed_total`。

310* `failed`:子进程以非零代码自行退出,要么是崩溃,要么是生成后的设置失败。增加 `sessions_failed_total`。

311* `interrupted`:运行器因既不是会话成功也不是运行器故障的操作原因终止子进程,例如排空,或终止在 [`SELF_HOSTED_RUNNER_MAX_LIFETIME_GRACE_MS`](#environment-variable-only-settings) 宽限期结束时仍在运行器上的会话,在其 `--kill-session-after-min` 限制之后。Kubernetes 滚动重启发送 `SIGTERM` 是排空的一个示例。增加 `sessions_interrupted_total`。

312 

313在 v2.1.260 之前,运行器终止达到其 `--kill-session-after-min` 限制的每个会话,并在 `sessions_interrupted_total` 中计数。

314 

315[`post-session` 钩子](/docs/zh-CN/self-hosted-environments-configuration#post-session)的 `CLAUDE_RUNNER_EXIT_REASON` 以不同方式分类干净交接。钩子将释放、启动超时和服务器取消分配报告为 `interrupted`,因为运行器停止了子进程。这些计数器记录与 `completed` 相同的事件,因为槽被干净地交还。

316 

317如果您直接根据 `sessions_completed_total` 协调钩子收据,您会低估完成。对每个会话保证使用钩子,对聚合速率使用计数器。

318 

319在一次性环境中,`--capacity 1` 与默认 `--drain-grace-sec 0`,每个运行器进程在其一个会话结束后片刻退出。`sessions_completed_total`、`sessions_failed_total` 和 `sessions_interrupted_total` 仅在会话结束时增加,在该退出之前,因此每 15 到 60 秒轮询一次 Prometheus 很少在运行器的系列消失前捕获增加;这三个会话结束计数器是本节其余部分所指的终端计数器。`sessions_started_total` 在生成时增加并在会话的生命周期内保持可见,因此它可靠地显示,但在一次性环境中它读取更接近"当前运行的会话"而不是累积计数。

320 

321对应目标使用此表中的系列而不是终端计数器:

322 

323| 目标 | 使用 |

324| :-- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

325| 吞吐量 | `claude_code_self_hosted_orchestrator_spawn_hooks_total{result="ok"}`,长期编排器上的计数器,每个成功的 `spawn-runner` 钩子增加一次,在 `rate()` 下保持有意义。它计数钩子调用而不是会话,因此预热和为同一会话重复生成使其与会话计数分散。 |

326| 利用率 | `sum(claude_code_self_hosted_runner_active_sessions)` 对 `sum(claude_code_self_hosted_runner_capacity)`,两个仪表在每次抓取时有效,无论运行器生命周期如何 |

327| 积压 | `claude_code_self_hosted_orchestrator_pool_pending_sessions` 用于队列深度,以及 `claude_code_self_hosted_orchestrator_queue_circuit_broken_sessions`,如果高于零则发出警报 |

328| 失败 | `claude_code_self_hosted_runner_sessions_failed_total`,尽力而为:生成后的真实崩溃确实增加它,`rate()` 在运行器上有意义,这些运行器以 `--drain-grace-sec` 高于 `0` 的方式超过其会话。一次性环境与其他终端计数器具有相同的抓取窗口问题,因此将您看到的任何非零值视为值得调查。生成前的失败,例如 checkout 钩子失败、git 准备或令牌问题,仅出现在 `session_init_errors_total` 中。 |

329 

330`orchestrator_*` 行仅存在于运行[按需编排器](/docs/zh-CN/self-hosted-environments-configuration#on-demand-runners)的环境中。在固定舰队上,其运行器以 `--drain-grace-sec` 高于 `0` 的方式超过其会话,对吞吐量使用 `sum(rate(claude_code_self_hosted_runner_sessions_started_total[5m]))`;在一次性舰队上,该系列与终端计数器具有相同的抓取窗口问题,因此依赖排队会话计数。在环境的**活动**选项卡上检查积压,在[**云环境**管理页面](https://claude.ai/admin-settings/cloud-environments)上:运行器不导出队列深度系列。

331 

332对于每个会话结果报告,改为使用 [`post-session` 钩子](/docs/zh-CN/self-hosted-environments-configuration#post-session):它在每个会话结束处触发,其中生成了子进程,除了突然的运行器终止(例如 VM 抢占),根据[钩子自己的合同](/docs/zh-CN/self-hosted-environments-configuration#post-session)。

333 

334<h2 id="what’s-next">

335 接下来

336</h2>

337 

338* [自托管环境](/docs/zh-CN/self-hosted-environments):环境、运行器和会话模型;[快速入门](/docs/zh-CN/self-hosted-environments-quickstart)和[部署到生产](/docs/zh-CN/self-hosted-environments-deploy)包含设置和操作

339* [自定义会话](/docs/zh-CN/self-hosted-environments-configuration):包装脚本、生命周期钩子和按需运行器

340* [验证会话身份](/docs/zh-CN/self-hosted-environments-identity):会话令牌、其声明以及如何验证它

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> 从 CI 验证自托管运行器镜像:使用 CLI 分派会话,通过 Stop hook 读取 Claude 的回复,并编写完整循环脚本。

8 

9<Note>

10 自托管环境在 Team 和 Enterprise 计划上处于公开测试阶段;[可用性和限制](/docs/zh-CN/self-hosted-environments#availability-and-limitations)涵盖启用路径。本页面是 CI 测试方案;有关设置,请参阅[快速入门](/docs/zh-CN/self-hosted-environments-quickstart),有关群组方案,请参阅[部署到生产环境](/docs/zh-CN/self-hosted-environments-deploy)。

11</Note>

12 

13在[自托管环境](/docs/zh-CN/self-hosted-environments)中,Claude Code [云会话](/docs/zh-CN/claude-code-on-the-web)在您构建和维护的运行器镜像上运行。在将新镜像推送到生产环境之前,从脚本对测试环境驱动完整会话:创建会话、读取 Claude 的回复、发送后续问题,并读取该回复。这是 CI 烟雾测试的形式,用于验证您的运行器镜像、git 访问和任何自定义工具,然后再推广更改。

14 

15此方案假设您已经[设置了环境和运行器](/docs/zh-CN/self-hosted-environments-quickstart#set-up-an-environment-and-runner),并且您的 CI 作业在与测试脚本相同的主机上启动运行器进程,这是测试新运行器镜像的自然设置。您在运行器上安装的 Stop hook 将每个回合的最终回复写入本地文件,脚本从那里读取它,因此对 Anthropic API 的唯一调用是两个分派本身。如果您的测试运行器在单独的基础设施上,请参阅[远程测试运行器](#remote-test-runners)。

16 

17<h2 id="install-the-capture-hook-on-your-test-runner">

18 在测试运行器上安装捕获 hook

19</h2>

20 

21读回通过 Claude Code [Stop hook](/docs/zh-CN/hooks#stop)工作:当 Claude 完成一个回合时,hook 在其 stdin JSON 中接收最终助手消息作为 `last_assistant_message`,并将其附加到 `$E2E_REPLY_DIR/<session_id>.txt`。以与[commit-nudge Stop hook](/docs/zh-CN/self-hosted-environments-configuration#prompt-sessions-to-push-their-work)相同的方式安装它,在运行器主机的 `~/.claude/` 上,运行器将其种子化到每个会话中。

22 

23<h3 id="save-the-hook-files">

24 保存 hook 文件

25</h3>

26 

27在运行器主机上保存以下两个文件:

28 

29* 设置块:合并到运行器主机上的 `~/.claude/settings.json`

30* 脚本:保存为运行器主机上的 `~/.claude/hooks/e2e-stop-hook-capture.sh` 并使其可执行

31 

32```json theme={null}

33{

34 "hooks": {

35 "Stop": [

36 {

37 "hooks": [

38 {

39 "type": "command",

40 "timeout": 10,

41 "command": "\"$CLAUDE_CONFIG_DIR/hooks/e2e-stop-hook-capture.sh\""

42 }

43 ]

44 }

45 ]

46 }

47}

48```

49 

50```sh theme={null}

51#!/bin/sh

52# Stop hook for testing a self-hosted environment end to end: writes each

53# turn's final assistant reply to $E2E_REPLY_DIR/<session_id>.txt so a

54# co-located test driver can read it without calling the Anthropic API.

55# Install on the TEST runner only. Requires jq.

56 

57# No-op unless the driver is listening. Never fail the turn.

58[ -n "${E2E_REPLY_DIR:-}" ] && [ -d "$E2E_REPLY_DIR" ] || exit 0

59 

60# CLAUDE_CODE_REMOTE_SESSION_ID is exported in cse_... form; the session

61# id the dispatch CLI prints is in session_... form. Same id, different

62# prefix.

63sid=$(printf '%s' "${CLAUDE_CODE_REMOTE_SESSION_ID:-}" | sed 's/^cse_/session_/')

64[ -n "$sid" ] || exit 0

65 

66# last_assistant_message is absent when the final assistant turn had no

67# text, such as a tool-use-only turn. The `// empty` filter makes that a

68# zero-byte write rather than the literal string "null".

69jq -r '.last_assistant_message // empty' >> "$E2E_REPLY_DIR/$sid.txt" 2>/dev/null

70exit 0

71```

72 

73<h3 id="before-you-start-the-runner">

74 启动运行器之前

75</h3>

76 

77hook 依赖的两件事:

78 

79* 在启动运行器之前安装它。运行器在启动时对 `~/.claude/` 进行快照,因此添加到运行中的运行器的 hook 仅在重新启动后才生效。

80* 将 `E2E_REPLY_DIR` 导出到运行器进程。当变量未设置或目录不存在时,hook 是无操作的,因此在启动运行器的任何地方设置它,例如 systemd 单元、pod 规范或 CI 步骤。下面的测试脚本也需要它。

81 

82仅在为测试环境提供服务的运行器上安装此 hook。每当 `E2E_REPLY_DIR` 存在时,它会将每个会话的最终回复写入磁盘,这在一次性 CI 运行器上是无害的,但不应该进入生产环境运行器镜像,其中变量可能会被意外设置。

83 

84<h2 id="run-the-test-loop">

85 运行测试循环

86</h2>

87 

88`--environment` 和 `--ref` 分派标志需要在运行脚本的机器上使用 Claude Code v2.1.224 或更高版本,这与运行器本身的下限相同。安装 hook 并在此主机上启动运行器后,测试脚本:

89 

901. 使用 `claude -p "<prompt>" --environment <environment-id> --output-format json` 在测试环境上创建会话,从 git 检出运行,以便 CLI 可以从 `origin` 远程自动检测存储库。可选的 `--ref <branch>` 将会话的检出基于命名的 ref 而不是本地 HEAD。该命令创建会话,打印包含 `session_id` 的一行 JSON,并退出而不等待 Claude 的回复。

912. 等待回复出现在 `$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)),它将用户事件发布到现有会话并退出。

934. 以与步骤 2 相同的方式等待后续回复。

94 

95<h3 id="environment-dispatch-behavior">

96 `--environment` 分派行为

97</h3>

98 

99Claude Code 创建会话,打印会话 ID 和指向它的链接,然后退出。

100 

101该标志优先于 [`remote.defaultEnvironmentId`](/docs/zh-CN/settings-reference#remote-defaultenvironmentid) 设置。它不支持 `--output-format stream-json`,不能与恢复、附加到或预配置会话的标志组合,例如 `--resume`、`--continue`、`--teleport`、`--session-id` 或 `--init-only`。`--cloud` 在使用会话 ID 或 URL 时被拒绝,在非交互式运行中当它带有描述时也被拒绝。裸 `--cloud` 被视为不存在。从终端,您可以将任务作为 `--cloud` 描述而不是位置提示传递。

102 

103<h2 id="example-script">

104 示例脚本

105</h2>

106 

107下面的脚本针对 `$CLAUDE_TEST_ENVIRONMENT_ID`(您的测试环境的 `ccpool_...` ID,显示在管理页面上的环境详细信息对话框中或由[创建环境调用](#create-a-dedicated-test-environment)返回)运行完整循环,并对每个回复中的哨兵短语进行断言。从您希望会话在其中工作的存储库的 git 检出运行它,在此主机上启动运行器后,安装捕获 hook 并导出 `E2E_REPLY_DIR`。

108 

109```bash theme={null}

110#!/usr/bin/env bash

111# End-to-end test against a self-hosted environment, using Stop-hook read-back.

112# Prereqs: `claude auth login` has been run on this machine (see "Authenticate

113# from CI" below); jq is installed; CLAUDE_TEST_ENVIRONMENT_ID names an

114# environment whose runner is the one on this host, with the capture hook

115# installed and E2E_REPLY_DIR in its environment.

116 

117set -euo pipefail

118 

119: "${CLAUDE_TEST_ENVIRONMENT_ID:=${CLAUDE_TEST_POOL_ID:-}}" # CLAUDE_TEST_POOL_ID is the legacy spelling

120: "${CLAUDE_TEST_ENVIRONMENT_ID:?set CLAUDE_TEST_ENVIRONMENT_ID to a ccpool_... id served by a runner on this host}"

121: "${E2E_REPLY_DIR:?set E2E_REPLY_DIR to the directory the Stop hook on your test runner writes to, and export it to the runner process}"

122: "${TEST_REPO_REF:=main}"

123 

124[ -d "$E2E_REPLY_DIR" ] || {

125 echo "FAIL: E2E_REPLY_DIR ($E2E_REPLY_DIR) does not exist. The Stop hook on the runner needs it." >&2

126 exit 1

127}

128 

129# Waits until $E2E_REPLY_DIR/<session_id>.txt contains $2, or fails after

130# 90 seconds. Tune the timeout to your environment's cold-start time. The

131# file is written by the Stop hook on the runner.

132await_reply() {

133 local expect="$2" f="$E2E_REPLY_DIR/$1.txt"

134 local deadline=$(($(date +%s) + 90))

135 while :; do

136 if [ -f "$f" ] && grep -qF -- "$expect" "$f"; then

137 return

138 fi

139 [ "$(date +%s)" -lt "$deadline" ] || {

140 echo "FAIL: '$expect' not in $f within 90s. The Stop hook on the runner did not write it." >&2

141 echo "-- $E2E_REPLY_DIR contents --" >&2; ls -la "$E2E_REPLY_DIR" >&2

142 [ -f "$f" ] && { echo "-- $f --" >&2; cat "$f" >&2; }

143 exit 1

144 }

145 sleep 1

146 done

147}

148 

149# 1. Create the session on the test environment. Run from a git checkout

150# so the CLI can auto-detect the repo. --ref pins the checkout to a named

151# ref regardless of local HEAD.

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

153EXPECT1="ok: custom tools are reachable"

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

155 --ref "$TEST_REPO_REF" --output-format json)

156echo "create: $create_json"

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

158 

159# 2. Wait for the turn-1 reply.

160await_reply "$SESSION_ID" "$EXPECT1"

161echo "turn-1 reply ok"

162 

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

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

165EXPECT2="ok: follow-up delivered"

166followup_json=$(claude -p "$TURN2" --cloud "$SESSION_ID" --output-format json)

167echo "followup: $followup_json"

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

169 

170# 4. Wait for the turn-2 reply.

171await_reply "$SESSION_ID" "$EXPECT2"

172echo "turn-2 reply ok"

173 

174echo "PASS: test-environment round-trip (session $SESSION_ID)"

175```

176 

177将 `TURN1`/`TURN2` 提示和 `EXPECT1`/`EXPECT2` 哨兵替换为任何练习您的设置的内容,例如要求 Claude 运行您的一个自定义 MCP 工具并对其输出进行断言。

178 

179<h2 id="remote-test-runners">

180 远程测试运行器

181</h2>

182 

183如果您的测试运行器在单独的基础设施上,例如您的 CI 作业无法共享文件系统的持久 Kubernetes 集群,请将 Stop hook 中的文件写入交换为 POST 到您的驱动程序侦听的端点:

184 

185```sh theme={null}

186#!/bin/sh

187# Variant of the capture hook for runners on separate infrastructure.

188# Set E2E_REPLY_URL on the runner to an endpoint the driver controls.

189[ -n "${E2E_REPLY_URL:-}" ] || exit 0

190sid=$(printf '%s' "${CLAUDE_CODE_REMOTE_SESSION_ID:-}" | sed 's/^cse_/session_/')

191[ -n "$sid" ] || exit 0

192jq -r '.last_assistant_message // empty' | \

193 curl -fsS -X POST --data-binary @- "$E2E_REPLY_URL/$sid" >/dev/null 2>&1

194exit 0

195```

196 

197在驱动程序端,运行任何接受 POST 并保持回复直到测试要求它的内容,例如 CI 作业内的小型 HTTP 侦听器或您已经运行的 webhook 接收器。hook 在您的基础设施上运行,因此端点只需要从您的运行器可达。

198 

199<h2 id="authenticate-from-ci">

200 从 CI 进行身份验证

201</h2>

202 

203`claude -p ... --environment` 和 `claude -p ... --cloud` 都使用 claude.ai OAuth 令牌进行身份验证;API 密钥(例如 `sk-ant-xxxxx`)对于任何一个调用都不被接受。两种方法使令牌在 CI 中可用。

204 

205<h3 id="long-lived-ci-host">

206 长期 CI 主机

207</h3>

208 

209在执行脚本的机器上使用专用自动化用户帐户交互式运行一次 `claude auth login`。Claude Code 在 macOS 上将令牌存储在 OS 密钥链中,或在 Linux 和 Windows 上存储在 `~/.claude/.credentials.json` 中。在 macOS 主机上,其密钥链无法写入(如 SSH 会话中的典型情况,其中登录密钥链保持锁定),Claude Code 也将令牌存储在 `~/.claude/.credentials.json` 中。请参阅[凭证管理](/docs/zh-CN/authentication#credential-management)。

210 

211CLI 在每次调用时自动刷新短期访问令牌,但基础刷新令牌授予从初始登录起限制为 30 天,因此每 30 天在该主机上交互式重新运行一次 `claude auth login`。

212 

213<h3 id="ephemeral-ci-runners">

214 临时 CI 运行器

215</h3>

216 

217目前没有针对此的长期 CI 令牌。授予远程会话控制的范围 `user:sessions:claude_code` 在服务器端限制为 30 天,因此 `claude setup-token`(它铸造一年推理令牌)不涵盖它。[环境秘密](/docs/zh-CN/self-hosted-environments-quickstart#set-up-an-environment-and-runner)也不被接受,因为它仅授权运行器向环境注册,而不是创建会话。

218 

219要在临时运行器上配置存储的登录,请设置 [`CLAUDE_CODE_OAUTH_REFRESH_TOKEN` 和 `CLAUDE_CODE_OAUTH_SCOPES`](/docs/zh-CN/env-vars#variables),以便 `claude auth login` 交换令牌而不需要浏览器;相同的 30 天上限适用于刷新授予。如果您需要不受人类帐户约束的机器身份路径,请联系您的 Anthropic 帐户团队。

220 

221<h2 id="create-a-dedicated-test-environment">

222 创建专用测试环境

223</h2>

224 

225以编程方式创建和删除环境,以便每个 CI 运行都获得一个干净的环境;您的 CI 作业启动的运行器注册到新环境中。下面的创建和删除调用是 claude.ai 上的**云环境**管理页面使用的相同端点,它们需要 `anthropic-beta: ccr-byoc-2025-07-29` 标头。

226 

227<h3 id="mint-the-admin-token">

228 铸造管理令牌

229</h3>

230 

231`$ADMIN_TOKEN` 是持有 Owner 角色的帐户的 claude.ai OAuth 访问令牌,以与[从 CI 进行身份验证](#authenticate-from-ci)相同的方式铸造:

232 

233* **铸造它**:使用持有 Owner 角色的帐户运行 `claude auth login`,然后从[长期 CI 主机](#long-lived-ci-host)说 Claude Code 存储它的任何地方读取当前访问令牌。

234* **每次运行时读取新鲜的**:CLI 轮换访问令牌,相同的 30 天刷新授予上限适用,因此不要存储副本。

235* **通过 stdin 传递它**:如示例所示,以便令牌永远不会进入 curl 的参数列表或您的构建日志。

236 

237<h3 id="create-the-environment">

238 创建环境

239</h3>

240 

241捕获响应而不回显它:`pool_secret` 是一个长期凭证,可以将运行器注册到环境中,因此将其存储为掩蔽 CI 秘密并仅打印环境 ID。保持令牌不在进程列表中的 `-H @-` 形式需要 curl 7.55 或更高版本;较旧的 curl 将 `@-` 视为文字标头并在没有授权的情况下发送请求。

242 

243```bash theme={null}

244create=$(curl -fsS -X POST -H @- \

245 -H "anthropic-beta: ccr-byoc-2025-07-29" -H "anthropic-version: 2023-06-01" \

246 -H "content-type: application/json" \

247 -d '{"name":"ci-test-environment"}' \

248 https://api.anthropic.com/v1/code/runners/self-hosted/pools \

249 <<<"Authorization: Bearer $ADMIN_TOKEN")

250ENVIRONMENT_ID=$(jq -er .pool.pool_id <<<"$create")

251ENVIRONMENT_SECRET=$(jq -er .pool_secret <<<"$create")

252```

253 

254在[所有者为组织启用**允许自托管环境**](/docs/zh-CN/self-hosted-environments#availability-and-limitations)之前,调用失败,出现 `403` `permission_error`,读取 `self-hosted runners are disabled by your organization's policy`。

255 

256在此主机上启动运行器,使用 `SELF_HOSTED_RUNNER_ENVIRONMENT_SECRET=$ENVIRONMENT_SECRET`,加上捕获 hook 和 `E2E_REPLY_DIR`,根据[在测试运行器上安装捕获 hook](#install-the-capture-hook-on-your-test-runner),然后运行测试脚本。

257 

258<h3 id="delete-the-environment">

259 删除环境

260</h3>

261 

262运行完成后删除环境,以便每个 CI 运行都从干净状态开始:

263 

264```bash theme={null}

265curl -fsS -X DELETE -H @- \

266 -H "anthropic-beta: ccr-byoc-2025-07-29" -H "anthropic-version: 2023-06-01" \

267 "https://api.anthropic.com/v1/code/runners/self-hosted/pools/$ENVIRONMENT_ID" \

268 <<<"Authorization: Bearer $ADMIN_TOKEN"

269```

Details

291* 如果您登出并重新登录,或切换到另一个组织,稍后返回,当这些设置未更改时,Claude Code 不会再次显示对话框,除非另一个账户在同一配置目录中为该组织批准了它们。291* 如果您登出并重新登录,或切换到另一个组织,稍后返回,当这些设置未更改时,Claude Code 不会再次显示对话框,除非另一个账户在同一配置目录中为该组织批准了它们。

292* 如果您使用不同的账户登录到同一组织,即使设置未更改,Claude Code 也会再次显示对话框。该账户的批准替换前一个,因此当您切换回来时,Claude Code 会再次显示对话框。292* 如果您使用不同的账户登录到同一组织,即使设置未更改,Claude Code 也会再次显示对话框。该账户的批准替换前一个,因此当您切换回来时,Claude Code 会再次显示对话框。

293 293 

294对于 `sandbox.credentials` 或 `sandbox.network.tlsTerminate` 的批准也涵盖这些相同传递设置中的 [`sandbox.network.allowedDomains`](/docs/zh-CN/settings-reference#sandbox-network-alloweddomains) 条目,因为两个设置都作用于该允许列表。当您的管理员添加或移除其中一个条目时,对话框会再次出现,即使 `sandbox.network.allowedDomains` 本身不需要批准。

295 

294Claude Code 无法始终显示对话框。下面的每种情况说明当它无法显示时哪些设置适用,以及您何时下次看到对话框:296Claude Code 无法始终显示对话框。下面的每种情况说明当它无法显示时哪些设置适用,以及您何时下次看到对话框:

295 297 

296* **无法显示对话框的交互式会话**:Claude Code 不应用传递的设置,保留最后批准的设置。对话框在下一个可以显示它的会话中出现。需要 Claude Code v2.1.211 或更高版本。298* **无法显示对话框的交互式会话**:Claude Code 不应用传递的设置,保留最后批准的设置。对话框在下一个可以显示它的会话中出现。需要 Claude Code v2.1.211 或更高版本。

settings.md +637 −1059

Details

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt2> 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.3> Use this file to discover all available pages before exploring further.

4 4 

5# Claude Code 设置5# 设置文件和优先级

6 6 

7> 使用全局和项目级设置以及环境变量配置 Claude Code。7> 更改 Claude Code 设置,选择键所属的作用域,验证更改,并了解当键在多个位置设置时 Claude Code 使用哪个值。

8 8 

9Claude Code 提供多种设置来配置其行为以满足您的需求。您可以通过运行 `/config` 命令来配置 Claude Code,这会打开一个选项卡式设置界面,您可以在其中查看状态信息并修改配置选项。从 v2.1.181 开始,您可以通过向 `/config` 传递 `key=value` 来更改单个选项而无需打开界面,例如 `/config verbose=true`。9export const SettingsPrecedence = () => {

10 10 const LEVELS = [{

11<h2 id="configuration-scopes">11 n: 1,

12 配置作用域12 name: 'Managed settings',

13</h2>13 file: 'managed-settings.json, MDM, or the claude.ai console',

14 14 who: 'Your organization',

15Claude Code 使用作用域系统来确定配置应用的位置以及与谁共享。了解作用域可以帮助您决定如何为个人使用、团队协作或企业部署配置 Claude Code。15 w: 390

16 16 }, {

17<h3 id="available-scopes">17 n: 2,

18 可用作用域18 name: 'Command line',

19</h3>19 file: 'claude --settings',

20 who: 'You, this session',

21 w: 420

22 }, {

23 n: 3,

24 name: 'Project local',

25 file: '.claude/settings.local.json',

26 who: 'You, this project',

27 w: 480

28 }, {

29 n: 4,

30 name: 'Shared project',

31 file: '.claude/settings.json',

32 who: 'Everyone in the project',

33 w: 540

34 }, {

35 n: 5,

36 name: 'User',

37 file: '~/.claude/settings.json',

38 who: 'You, every project',

39 w: 600

40 }];

41 const W = 760;

42 const ROW = 58;

43 const GAP = 8;

44 const TOP = 34;

45 const H = TOP + LEVELS.length * (ROW + GAP) + 30;

46 const cx = W / 2;

47 const mono = 'var(--font-mono, ui-monospace, SFMono-Regular, Menlo, monospace)';

48 const sans = 'var(--font-sans, system-ui, -apple-system, sans-serif)';

49 return <div className="sp-root not-prose" role="img" aria-label="Settings precedence, highest first: managed settings, command line, project local, shared project, user. A key set at a higher level overrides the same key set lower down.">

50 <style>{`

51 .sp-root { --sp-text: #1A1918; --sp-sub: #5E5D59; --sp-faint: #8A8880; --sp-fill: #F5F4EF; --sp-stroke: rgba(0,0,0,0.12); --sp-top: #D97757; --sp-top-fill: rgba(217,119,87,0.14); --sp-arrow: #8A8880; margin: 1.25rem 0; }

52 .dark .sp-root { --sp-text: #F1EFE9; --sp-sub: #B8B5AD; --sp-faint: #8A8880; --sp-fill: #24231F; --sp-stroke: rgba(255,255,255,0.12); --sp-top-fill: rgba(217,119,87,0.22); --sp-arrow: #8A8880; }

53 .sp-root svg { width: 100%; height: auto; display: block; max-width: ${W}px; margin: 0 auto; }

54 `}</style>

55 <svg viewBox={`0 0 ${W} ${H}`} xmlns="http://www.w3.org/2000/svg">

56 <text x={cx} y={18} textAnchor="middle" fontFamily={sans} fontSize="12.5" fontWeight="600" fill="var(--sp-sub)">Highest precedence</text>

57 {LEVELS.map((l, i) => {

58 const y = TOP + i * (ROW + GAP);

59 const x = cx - l.w / 2;

60 const top = i === 0;

61 return <g key={l.n}>

62 <rect x={x} y={y} width={l.w} height={ROW} rx={10} fill={top ? 'var(--sp-top-fill)' : 'var(--sp-fill)'} stroke={top ? 'var(--sp-top)' : 'var(--sp-stroke)'} strokeWidth={top ? 1.5 : 1} />

63 <text x={x + 14} y={y + 24} fontFamily={sans} fontSize="14" fontWeight="600" fill="var(--sp-text)">{l.n}. {l.name}</text>

64 <text x={x + 14} y={y + 43} fontFamily={mono} fontSize="11.5" fill="var(--sp-sub)">{l.file}</text>

65 <text x={x + l.w - 14} y={y + 24} textAnchor="end" fontFamily={sans} fontSize="12" fill="var(--sp-faint)">{l.who}</text>

66 </g>;

67 })}

68 <text x={cx} y={H - 10} textAnchor="middle" fontFamily={sans} fontSize="12.5" fontWeight="600" fill="var(--sp-sub)">Lowest precedence</text>

69 <g stroke="var(--sp-arrow)" strokeWidth="1.5" fill="none">

70 <line x1={W - 40} y1={TOP + 10} x2={W - 40} y2={H - 38} />

71 <path d={`M ${W - 46} ${TOP + 18} L ${W - 40} ${TOP + 10} L ${W - 34} ${TOP + 18}`} />

72 </g>

73 <text x={W - 40} y={H - 22} textAnchor="middle" fontFamily={sans} fontSize="10.5" fill="var(--sp-faint)">overrides</text>

74 </svg>

75 </div>;

76};

77 

78export const SettingsScope = ({defaultSelected = 'project'}) => {

79 const FILES = [{

80 id: 'user',

81 path: '~/.claude/settings.json'

82 }, {

83 id: 'project',

84 path: 'acme-app/.claude/settings.json'

85 }, {

86 id: 'local',

87 path: 'acme-app/.claude/settings.local.json'

88 }, {

89 id: 'managed',

90 path: 'Managed settings',

91 ring: 'managed-settings.json, MDM, or the claude.ai console'

92 }];

93 const SHORT = {

94 user: '~/.claude/settings.json',

95 project: 'acme-app/.claude/settings.json',

96 local: 'acme-app/.claude/settings.local.json',

97 managed: 'managed-settings.json, MDM, or the claude.ai console'

98 };

99 const TILE_MARK = {

100 project: 'settings.json',

101 local: 'settings.local.json'

102 };

103 const initial = FILES.some(f => f.id === defaultSelected) ? defaultSelected : 'project';

104 const [sel, setSel] = useState(initial);

105 const [scale, setScale] = useState(1);

106 const [isFullscreen, setIsFullscreen] = useState(false);

107 const rootRef = useRef(null);

108 const frameRef = useRef(null);

109 const CANVAS_W = 862;

110 const CANVAS_H = 240;

111 useEffect(() => {

112 const el = frameRef.current;

113 if (!el) return;

114 const measure = () => setScale(Math.min(1, el.clientWidth / CANVAS_W));

115 measure();

116 if (typeof ResizeObserver === 'undefined') {

117 window.addEventListener('resize', measure);

118 return () => window.removeEventListener('resize', measure);

119 }

120 const ro = new ResizeObserver(measure);

121 ro.observe(el);

122 return () => ro.disconnect();

123 }, []);

124 useEffect(() => {

125 const onFsChange = () => setIsFullscreen(!!document.fullscreenElement);

126 document.addEventListener('fullscreenchange', onFsChange);

127 return () => document.removeEventListener('fullscreenchange', onFsChange);

128 }, []);

129 const toggleFullscreen = () => {

130 if (!rootRef.current) return;

131 if (document.fullscreenElement) document.exitFullscreen(); else rootRef.current.requestFullscreen().catch(() => {});

132 };

133 const COVERAGE = {

134 user: ['website', 'api', 'yacme'],

135 project: ['yacme', 'tacme', 'cacme'],

136 local: ['yacme'],

137 managed: ['website', 'api', 'yacme', 'tacme', 'cacme']

138 };

139 const RINGS = {

140 local: {

141 l: 282,

142 t: 50,

143 w: 142,

144 h: 124

145 },

146 project: {

147 l: 282,

148 t: 50,

149 w: 560,

150 h: 124

151 },

152 user: {

153 l: 2,

154 t: 34,

155 w: 446,

156 h: 198

157 },

158 managed: {

159 l: 0,

160 t: 32,

161 w: 862,

162 h: 204

163 }

164 };

165 const TILES = [{

166 id: 'website',

167 name: 'website/',

168 left: 30,

169 caption: ''

170 }, {

171 id: 'api',

172 name: 'api/',

173 left: 160,

174 caption: ''

175 }, {

176 id: 'yacme',

177 name: 'acme-app/',

178 left: 290,

179 caption: ''

180 }, {

181 id: 'tacme',

182 name: 'acme-app/',

183 left: 497,

184 caption: sel === 'project' ? 'their clone, once you commit the file' : 'their clone'

185 }, {

186 id: 'cacme',

187 name: 'acme-app/',

188 left: 704,

189 caption: sel === 'project' ? 'fresh clone, once you commit the file' : sel === 'managed' ? 'server-managed only' : 'fresh clone'

190 }];

191 const FILE_AT = {

192 user: {

193 machine: 'you',

194 tiles: []

195 },

196 project: {

197 machine: null,

198 tiles: ['yacme', 'tacme', 'cacme']

199 },

200 local: {

201 machine: null,

202 tiles: ['yacme']

203 },

204 managed: {

205 machine: null,

206 tiles: []

207 }

208 };

209 const fileAt = FILE_AT[sel];

210 const coverage = COVERAGE[sel];

211 const ring = RINGS[sel];

212 const selFile = FILES.find(f => f.id === sel);

213 const FolderIcon = ({open}) => <svg width="15" height="15" viewBox="0 0 16 16" fill="none" stroke="currentColor" strokeWidth="1.3" strokeLinejoin="round" aria-hidden="true">

214 <path d="M1.5 4.5a1 1 0 0 1 1-1h3.2l1.3 1.5h6a1 1 0 0 1 1 1V12a1 1 0 0 1-1 1h-10.5a1 1 0 0 1-1-1z" />

215 {open && <path d="M1.5 7.5h13" />}

216 </svg>;

217 const FileIcon = () => <svg width="10" height="10" viewBox="0 0 16 16" fill="none" stroke="currentColor" strokeWidth="1.3" strokeLinejoin="round" aria-hidden="true">

218 <path d="M4 1.5h5.5L13 5v9.5H4z" />

219 <path d="M9.5 1.5V5H13" />

220 </svg>;

221 const CloudIcon = () => <svg width="16" height="16" viewBox="0 0 16 16" fill="none" stroke="currentColor" strokeWidth="1.3" strokeLinejoin="round" aria-hidden="true">

222 <path d="M4.5 12.5h7a2.5 2.5 0 0 0 .4-4.97A3.5 3.5 0 0 0 5.2 6.6 3 3 0 0 0 4.5 12.5z" />

223 </svg>;

224 const LaptopIcon = () => <svg width="16" height="16" viewBox="0 0 16 16" fill="none" stroke="currentColor" strokeWidth="1.3" strokeLinejoin="round" aria-hidden="true">

225 <rect x="2.5" y="3" width="11" height="7.5" rx="1" />

226 <path d="M1 12.5h14" />

227 </svg>;

228 return <div ref={rootRef} className={'ssc-root not-prose' + (isFullscreen ? ' ssc-fs' : '')}>

229 <style>{`

230 .ssc-root {

231 --ssc-bg: #FFFFFF;

232 --ssc-text: #1A1918;

233 --ssc-sub: #5E5D59;

234 --ssc-faint: #8A8880;

235 --ssc-border: rgba(0,0,0,0.12);

236 --ssc-panel: #F5F4EF;

237 --ssc-tile: #FAFAF8;

238 --ssc-clay: #D97757;

239 --ssc-clay-bg: rgba(217,119,87,0.14);

240 --ssc-label: #B0562F;

241 --ssc-hover: rgba(115,114,108,0.10);

242 font-family: var(--font-sans, system-ui, -apple-system, sans-serif);

243 background: var(--ssc-bg);

244 color: var(--ssc-text);

245 border: 1px solid var(--ssc-border);

246 border-radius: 16px;

247 padding: 20px 24px 24px;

248 margin: 1.5rem 0;

249 box-sizing: border-box;

250 }

251 .dark .ssc-root {

252 --ssc-bg: #1B1A18;

253 --ssc-text: #F1EFE9;

254 --ssc-sub: #B8B5AD;

255 --ssc-faint: #8A8880;

256 --ssc-border: rgba(255,255,255,0.12);

257 --ssc-panel: #24231F;

258 --ssc-tile: #2A2925;

259 --ssc-clay-bg: rgba(217,119,87,0.20);

260 --ssc-label: #EBC9B7;

261 }

262 .ssc-fs { display: flex; flex-direction: column; justify-content: center; align-items: center; margin: 0; border-radius: 0; height: 100vh; }

263 .ssc-fs .ssc-head { width: 100%; max-width: ${CANVAS_W}px; }

264 .ssc-fs .ssc-frame { width: 100%; }

265 .ssc-mono { font-family: var(--font-mono, ui-monospace, SFMono-Regular, Menlo, monospace); }

266 .ssc-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; margin-bottom: 20px; }

267 .ssc-files { display: flex; gap: 8px; flex-wrap: wrap; }

268 .ssc-file {

269 font-size: 12.5px; font-weight: 430; padding: 8px 13px; border-radius: 10px; cursor: pointer;

270 border: 0.5px solid var(--ssc-border); background: var(--ssc-tile); color: var(--ssc-text);

271 white-space: nowrap; transition: background 0.2s, border-color 0.2s;

272 }

273 .ssc-file:hover { filter: brightness(0.97); }

274 .ssc-file[aria-pressed="true"] { font-weight: 600; border: 1.5px solid var(--ssc-clay); background: var(--ssc-clay-bg); }

275 .ssc-fsbtn {

276 display: flex; align-items: center; justify-content: center; width: 28px; height: 28px; flex-shrink: 0;

277 border: none; background: none; border-radius: 6px; cursor: pointer; color: var(--ssc-faint); font-size: 15px;

278 }

279 .ssc-fsbtn:hover { background: var(--ssc-hover); }

280 .ssc-frame { width: 100%; max-width: ${CANVAS_W}px; margin: 0 auto; }

281 .ssc-canvas { position: relative; width: ${CANVAS_W}px; height: ${CANVAS_H}px; transform-origin: top left; }

282 .ssc-machine { position: absolute; top: 42px; height: 182px; background: var(--ssc-panel); border-radius: 16px; }

283 .ssc-machine-label { position: absolute; top: 192px; display: flex; align-items: center; gap: 8px; font-size: 13.5px; font-weight: 600; }

284 .ssc-tile {

285 position: absolute; top: 58px; width: 126px; height: 108px; border-radius: 12px; padding: 11px 12px; box-sizing: border-box;

286 background: var(--ssc-tile); border: 0.5px solid var(--ssc-border); opacity: 0.6;

287 transition: background 0.25s, border-color 0.25s, opacity 0.25s;

288 }

289 .ssc-tile.ssc-on { background: var(--ssc-clay-bg); border: 1px solid var(--ssc-clay); opacity: 1; }

290 .ssc-tile-name { display: flex; align-items: center; gap: 6px; color: var(--ssc-faint); }

291 .ssc-tile.ssc-on .ssc-tile-name { color: var(--ssc-clay); }

292 .ssc-tile-name span { font-size: 12px; font-weight: 430; white-space: nowrap; color: var(--ssc-text); }

293 .ssc-tile.ssc-on .ssc-tile-name span { font-weight: 600; }

294 .ssc-tile-caption { font-size: 10.5px; color: var(--ssc-sub); margin-top: 5px; line-height: 1.35; }

295 .ssc-filemark {

296 position: absolute; left: 5px; right: 5px; bottom: 8px; display: inline-flex; align-items: center; justify-content: center; gap: 2px;

297 font-size: 8.5px; color: var(--ssc-label); background: var(--ssc-bg); border: 1px solid var(--ssc-clay);

298 border-radius: 6px; padding: 2px 3px; white-space: nowrap; overflow: hidden;

299 }

300 .ssc-filemark svg { flex-shrink: 0; }

301 .ssc-machine-filemark { display: inline-flex; align-items: center; gap: 4px; margin-left: 10px; font-size: 10.5px; font-weight: 500; color: var(--ssc-label); }

302 .ssc-ring {

303 position: absolute; border: 2px solid var(--ssc-clay); border-radius: 18px; pointer-events: none;

304 transition: left 0.35s ease, top 0.35s ease, width 0.35s ease, height 0.35s ease;

305 }

306 .ssc-ring-label {

307 position: absolute; font-size: 12px; font-weight: 600; color: var(--ssc-label); white-space: nowrap; pointer-events: none;

308 transition: left 0.35s ease, top 0.35s ease;

309 }

310 `}</style>

311 

312 <div className="ssc-head">

313 <div className="ssc-files" role="group" aria-label="Settings file">

314 {FILES.map(f => <button key={f.id} type="button" className="ssc-file ssc-mono" aria-pressed={f.id === sel} onClick={() => setSel(f.id)}>{f.path}</button>)}

315 </div>

316 <button type="button" className="ssc-fsbtn" onClick={toggleFullscreen} aria-label={isFullscreen ? 'Exit fullscreen' : 'Enter fullscreen'} title={isFullscreen ? 'Exit fullscreen' : 'Fullscreen'}>{isFullscreen ? '⤡' : '⛶'}</button>

317 </div>

318 

319 <div ref={frameRef} className="ssc-frame" style={{

320 height: CANVAS_H * scale + 'px'

321 }}>

322 <div className="ssc-canvas" style={{

323 transform: 'scale(' + scale + ')'

324 }}>

325 <div className="ssc-machine" style={{

326 left: '10px',

327 width: '430px'

328 }} />

329 <span className="ssc-machine-label" style={{

330 left: '30px'

331 }}><LaptopIcon />Your machine{fileAt.machine === 'you' && <span className="ssc-machine-filemark ssc-mono"><FileIcon />{selFile.path}</span>}</span>

332 <div className="ssc-machine" style={{

333 left: '460px',

334 width: '200px'

335 }} />

336 <span className="ssc-machine-label" style={{

337 left: '470px'

338 }}><LaptopIcon />A teammate’s machine</span>

339 <div className="ssc-machine" style={{

340 left: '682px',

341 width: '170px'

342 }} />

343 <span className="ssc-machine-label" style={{

344 left: '692px'

345 }}><CloudIcon />A cloud session</span>

346 

347 {TILES.map(t => {

348 const on = coverage.includes(t.id);

349 return <div key={t.id} className={'ssc-tile' + (on ? ' ssc-on' : '')} style={{

350 left: t.left + 'px'

351 }}>

352 <div className="ssc-tile-name"><FolderIcon open={on} /><span className="ssc-mono">{t.name}</span></div>

353 {t.caption && <div className="ssc-tile-caption">{t.caption}</div>}

354 {fileAt.tiles.includes(t.id) && <span className="ssc-filemark ssc-mono" title={SHORT[sel]}><FileIcon />{TILE_MARK[sel]}</span>}

355 </div>;

356 })}

357 

358 <div className="ssc-ring" style={{

359 left: ring.l + 'px',

360 top: ring.t + 'px',

361 width: ring.w + 'px',

362 height: ring.h + 'px'

363 }} />

364 <span className="ssc-ring-label ssc-mono" style={{

365 left: ring.l + 14 + 'px',

366 top: ring.t - 26 + 'px'

367 }}>{selFile.ring || selFile.path}</span>

368 </div>

369 </div>

370 </div>;

371};

372 

373设置是改变 Claude Code 行为方式的 JSON 键:它启动时使用的模型、它可以在不询问的情况下运行的内容、它无法读取的文件、它在终端中的外观,以及您的组织强制执行的内容。

374 

375<Tip>

376 要查找特定键,请转到[所有设置](/docs/zh-CN/settings-reference),其中列出了每个键、设置它的文件、其默认值和示例。

377</Tip>

378 

379Claude Code 从 JSON 设置文件(如 `~/.claude/settings.json`)读取设置。它在几个位置查找它们,[它读取设置的文件决定了设置适用于谁](#settings-files-and-who-they-affect)。本页涵盖这些文件:将设置放在哪个文件中、如何更改设置并确认它已应用,以及当同一键在多个文件中设置时 Claude Code 使用哪个值。[配置权限](/docs/zh-CN/permissions)涵盖 Claude Code 可以在不询问的情况下运行的内容以及如何编写 `allow`、`ask` 和 `deny` 规则。

20 380 

21| 作用域 | 位置 | 影响范围 | 与团队共享? |381<Note>

22| :---------- | :----------------------------------------------- | :---------------------------------------------------------- | :------------ |382 本页涵盖在您的机器上运行的 Claude Code:终端、[VS Code](/docs/zh-CN/vs-code) 和 [JetBrains](/docs/zh-CN/jetbrains) 扩展,以及[桌面应用](/docs/zh-CN/desktop),它们都读取相同的设置文件。[Claude Code on the web](/docs/zh-CN/claude-code-on-the-web) 上的云会话在不同的机器上运行并仅读取其中一些;请参阅[云会话中的设置](#settings-in-cloud-sessions)。

23| **Managed** | 服务器管理的设置、plist / 注册表或系统级 `managed-settings.json` | 服务器管理交付的所有组织成员;plist、HKLM 注册表和文件交付的机器上的所有用户;HKCU 注册表交付的当前用户 | 是(由 IT 部署) |383</Note>

24| **User** | `~/.claude/` 目录 | 您,跨所有项目 | 否 |

25| **Project** | 存储库中的 `.claude/` | 此存储库上的所有协作者 | 是(提交到 git) |

26| **Local** | `.claude/settings.local.json` | 您,仅在此存储库中 | 否(gitignored) |

27 384 

28<h3 id="when-to-use-each-scope">385<span id="settings-files" />

29 何时使用每个作用域

30</h3>

31 386 

32**Managed 作用域**用于:387<span id="configuration-scopes" />

33 388 

34* 必须在整个组织范围内强制执行的安全策略389<span id="available-scopes" />

35* 无法被覆盖的合规要求

36* 由 IT/DevOps 部署的标准化配置

37 390 

38**User 作用域**最适合:391<span id="when-to-use-each-scope" />

39 392 

40* 您想在任何地方使用的个人偏好设置(主题、编辑器设置)393<span id="what-uses-scopes" />

41* 您在所有项目中使用的工具和插件

42* API 密钥和身份验证(安全存储)

43 394 

44**Project 作用域**最适合:395<span id="subagent-configuration" />

45 396 

46* 团队共享的设置(权限、hooks、MCP servers)397<span id="where-settings-live" />

47* 整个团队应该拥有的插件

48* 跨协作者标准化工具

49 398 

50**Local 作用域**最适合:399<h2 id="settings-files-and-who-they-affect">

400 设置文件及其影响范围

401</h2>

51 402 

52* 特定项目的个人覆盖403Claude Code 从四个文件读取设置,组织也可以从 claude.ai 控制台提供托管设置。每个来源都有一个范围:设置应用的人员和项目集合,可能是仅你、项目中的所有人或组织中的所有人。

53* 在与团队共享之前测试配置

54* 对其他人不适用的特定于机器的设置

55 404 

56<h3 id="how-scopes-interact">405| 范围 | 文件 | 影响对象 | 用途 |

57 作用域如何相互作用406| :--- | :----------------------------------------------------------------------------- | :----------------------------------------------------------------------------------- | :-------------------------- |

58</h3>407| 用户 | `~/.claude/settings.json` | 你,在这台机器上的每个项目中 | 个人偏好:主题、编辑器模式、默认模型、你自己的权限规则 |

408| 共享项目 | `.claude/settings.json` | 所有在包含该文件的文件夹中工作的人。在 git 仓库中,提交它以便队友获得它 | 团队权限、hooks、插件和项目需要的环境变量 |

409| 项目本地 | `.claude/settings.local.json` | 仅你,在这个项目中。Claude Code 在创建文件时将其排除在 git 之外;如果你手动创建它,自己将其添加到 `.gitignore` | 一个项目的个人覆盖,以及在共享前的测试 |

410| 托管 | `managed-settings.json` 和其他[托管来源](/docs/zh-CN/managed-settings#delivery-mechanisms) | 你的组织部署到的所有人;你设置的任何内容都不会覆盖它,除了少数[安全敏感的例外](#exceptions-to-managed-settings-precedence) | 安全策略和合规要求 |

59 411 

60当在多个作用域中出现相同的设置时,Claude Code 按优先级顺序应用它们:412在"文件"列中,`~/.claude` 是你主目录中的 `.claude` 文件夹,而单独的 `.claude` 是项目内的 `.claude` 文件夹。

61 413 

621. **Managed**(最高)- 无法被任何内容覆盖414<span id="where-each-file-applies" />

632. **命令行参数** - 临时会话覆盖

643. **Local** - 覆盖项目和用户设置

654. **Project** - 覆盖用户设置

665. **User**(最低)- 当没有其他内容指定设置时应用

67 415 

68例如,如果您的用户设置将 `spinnerTipsEnabled` 设置为 `true`,而项目设置将其设置为 `false`,则项目值适用。权限规则的行为不同,因为它们跨作用域合并而不是覆盖。请参阅 [Settings precedence](#settings-precedence)。416<span id="compare-what-each-file-reaches" />

69 417 

70<h3 id="what-uses-scopes">418<h3 id="compare-the-scope-of-each-settings-file">

71 哪些功能使用作用域419 比较每个设置文件的范围

72</h3>420</h3>

73 421 

74作用域适用于许多 Claude Code 功能:422假设你的机器上有三个项目 `website/`、`api/` 和 `acme-app/`,一个队友有他们自己的 `acme-app/` 克隆,你在 `acme-app/` 上启动了一个[云会话](#settings-in-cloud-sessions)。

75 

76| 功能 | User 位置 | Project 位置 | Local 位置 |

77| :-------------- | :------------------------ | :-------------------------------- | :---------------------------- |

78| **Settings** | `~/.claude/settings.json` | `.claude/settings.json` | `.claude/settings.local.json` |

79| **Subagents** | `~/.claude/agents/` | `.claude/agents/` | 无 |

80| **MCP servers** | `~/.claude.json` | `.mcp.json` | `~/.claude.json`(每个项目) |

81| **Plugins** | `~/.claude/settings.json` | `.claude/settings.json` | `.claude/settings.local.json` |

82| **CLAUDE.md** | `~/.claude/CLAUDE.md` | `CLAUDE.md` 或 `.claude/CLAUDE.md` | `CLAUDE.local.md` |

83 

84在 Windows 上,显示为 `~/.claude` 的路径解析为 `%USERPROFILE%\.claude`。

85 423 

86***424下面的图表显示当你从这些文件夹启动 Claude Code 时,设置应用在哪些文件夹中。点击一个设置文件以查看它到达的文件夹。

87 425 

88<h2 id="settings-files">426<SettingsScope />

89 设置文件

90</h2>

91 

92`settings.json` 文件是通过分层设置配置 Claude Code 的官方机制:

93 

94* **用户设置**在 `~/.claude/settings.json` 中定义,适用于所有项目。

95* **项目设置**保存在您的项目目录中:

96 * `.claude/settings.json` 用于检入源代码管理并与您的团队共享的设置

97 * `.claude/settings.local.json` 用于未检入的设置,适用于个人偏好和实验。Claude Code 创建 `.claude/settings.local.json` 时,会配置 git 以忽略该文件。如果您自己创建该文件,请手动将其添加到 gitignore。

98 

99 因为此文件属于您而不是存储库,其权限 `allow` 规则生效时无需 [workspace trust](/docs/zh-CN/permissions#project-allow-rules-and-workspace-trust) 步骤,而 `.claude/settings.json` allow 规则需要此步骤。如果存储库提供该文件,例如通过提交它,workspace trust 仍然适用。

100* **Managed 设置**:对于需要集中控制的组织,Claude Code 支持多种 managed 设置的交付机制。所有机制都使用相同的 JSON 格式,无法被用户或项目设置覆盖:

101 

102 * **服务器管理的设置**:通过 Anthropic 的服务器从 claude.ai 管理员控制台交付,或从自托管的 [Claude apps gateway](/docs/zh-CN/claude-apps-gateway)。请参阅[服务器管理的设置](/docs/zh-CN/server-managed-settings)。

103 * **MDM/OS 级别策略**:通过 macOS 和 Windows 上的本机设备管理交付:

104 * macOS:`com.anthropic.claudecode` managed preferences 域。plist 的顶级键镜像 `managed-settings.json`,嵌套设置为字典,数组为 plist 数组。通过 Jamf、Iru (Kandji) 或类似 MDM 工具中的配置文件部署。

105 * Windows:`HKLM\SOFTWARE\Policies\ClaudeCode` 注册表项,带有包含 JSON 的 `Settings` 值(REG\_SZ 或 REG\_EXPAND\_SZ)(通过组策略或 Intune 部署)

106 * Windows(用户级):`HKCU\SOFTWARE\Policies\ClaudeCode`(最低策略优先级,仅在不存在管理员级源时使用)

107 * **基于文件**:`managed-settings.json` 和 `managed-mcp.json` 部署到系统目录:

108 427 

109 * macOS:`/Library/Application Support/ClaudeCode/`428* **`~/.claude/settings.json`**:你机器上的每个项目,以及队友或云会话中的任何内容都不会

110 * Linux 和 WSL:`/etc/claude-code/`429* **`acme-app/.claude/settings.json`**:你的 `acme-app/`。只有当你将文件提交到版本控制时,它才会到达你队友的克隆和云会话;在此之前,它就像任何其他文件一样在你的磁盘上,没有人有它

111 * Windows:`C:\Program Files\ClaudeCode\`430* **`acme-app/.claude/settings.local.json`**:仅你的 `acme-app/`。Claude Code 第一次写入文件时将其添加到你的全局 git 排除项,所以它不会进入你的提交;如果你手动创建文件,[自己将其添加到 `.gitignore`](#keep-personal-settings-out-of-a-repository)

431* **托管设置**,无论是 `managed-settings.json` 文件、MDM 策略还是来自 claude.ai 控制台的[服务器托管设置](/docs/zh-CN/server-managed-settings):你的组织部署到的每台机器上的每个项目,或你使用组织账户登录的地方。只有服务器托管设置才能到达云会话

112 432 

113 <Warning>433<span id="which-files-you-have" />

114 自 v2.1.75 起,不再支持旧的 Windows 路径 `C:\ProgramData\ClaudeCode\managed-settings.json`。已将设置部署到该位置的管理员必须将文件迁移到 `C:\Program Files\ClaudeCode\managed-settings.json`。

115 </Warning>

116 434 

117 基于文件的 managed 设置还支持在与 `managed-settings.json` 相同的系统目录中的 `managed-settings.d/` 放入目录。这让独立的团队可以部署独立的策略片段,而无需协调对单个文件的编辑。435<h3 id="find-or-create-your-settings-files">

118 436 查找或创建你的设置文件

119 遵循 systemd 约定,`managed-settings.json` 首先作为基础合并,然后放入目录中的所有 `*.json` 文件按字母顺序排序并合并在顶部。对于标量值,后面的文件覆盖前面的文件;数组被连接和去重;对象被深度合并。以 `.` 开头的隐藏文件被忽略。437</h3>

120 

121 使用数字前缀来控制合并顺序,例如 `10-telemetry.json` 和 `20-security.json`。

122 438 

123 请参阅 [managed 设置](/docs/zh-CN/permissions#managed-only-settings) 和 [Managed MCP 配置](/docs/zh-CN/managed-mcp) 了解详情。439安装 Claude Code 不会创建任何设置文件。如果你的机器或项目已经有一个,它来自以下来源之一:

124 440 

125 此[存储库](https://github.com/anthropics/claude-code/tree/main/examples/mdm)包含 Jamf、Iru (Kandji)、Intune 和组策略的启动部署模板。使用这些作为起点并根据您的需求进行调整。441* **托管**:你的组织部署它。你不创建或编辑它。

442* **共享项目**:已经使用 Claude Code 的项目可能有一个已提交。如果没有,在项目文件夹中的 `.claude/settings.json` 处创建它。

443* **用户**和**项目本地**:自己创建它们,或让 Claude Code 创建它们。当你在 `/config` 菜单中更改存储在用户设置中的选项(如主题)时,它会写入 `~/.claude/settings.json`,当你在权限提示上给予常设批准时(如对 Bash 命令的"是的,不要再问"),它会写入 `.claude/settings.local.json`。一些 `/config` 选项,包括**显示提示**,保存到 `.claude/settings.local.json` 而不是用户文件。

126 444 

127 <Note>445<Info>

128 Managed 部署还可以使用 `strictKnownMarketplaces` 限制**插件市场添加**。有关更多信息,请参阅 [Managed 市场限制](/docs/zh-CN/plugin-marketplaces#managed-marketplace-restrictions)。446 在 Windows 上,`~/.claude` 表示 `%USERPROFILE%\.claude`。要将主目录文件保存在其他地方,设置 [`CLAUDE_CONFIG_DIR`](/docs/zh-CN/env-vars);Claude Code 然后将你的设置、会话历史和插件存储在那里。

129 </Note>447</Info>

130* **其他配置**存储在 `~/.claude.json` 中。此文件包含您的 OAuth 会话、[MCP server](/docs/zh-CN/mcp) 配置(用于用户和本地作用域)、每个项目的状态(允许的工具、信任设置)和各种缓存。项目作用域的 MCP servers 单独存储在 `.mcp.json` 中。

131 448 

132<Note>449Claude Code 还保留第五个文件 [`~/.claude.json`](/docs/zh-CN/claude-directory#ce-claude-json),它为自己写入;你不需要编辑它。它保存你的登录会话、[MCP 服务器](/docs/zh-CN/mcp)配置、每个项目的状态(如信任决定)和 `/config` 为你写入的[全局配置键](/docs/zh-CN/settings-reference#global-config-settings)。

133 Claude Code 自动创建配置文件的时间戳备份,并保留最近五个备份以防止数据丢失。

134</Note>

135 450 

136```JSON Example settings.json theme={null}451<h3 id="share-settings-with-your-team">

137{452 与你的团队共享设置

138 "$schema": "https://json.schemastore.org/claude-code-settings.json",453</h3>

139 "permissions": {

140 "allow": [

141 "Bash(npm run lint)",

142 "Bash(npm run test *)",

143 "Read(~/.zshrc)"

144 ],

145 "deny": [

146 "Bash(curl *)",

147 "Read(./.env)",

148 "Read(./.env.*)",

149 "Read(./secrets/**)"

150 ]

151 },

152 "env": {

153 "CLAUDE_CODE_ENABLE_TELEMETRY": "1",

154 "OTEL_METRICS_EXPORTER": "otlp"

155 },

156 "companyAnnouncements": [

157 "Welcome to Acme Corp! Review our code guidelines at docs.acme.com",

158 "Reminder: Code reviews required for all PRs",

159 "New security policy in effect"

160 ]

161}

162```

163 454 

164上面示例中的 `$schema` 行指向 Claude Code 设置的[官方 JSON 架构](https://json.schemastore.org/claude-code-settings.json)。将其添加到您的 `settings.json` 可在 VS Code、Cursor 和任何其他支持 JSON 架构验证的编辑器中启用自动完成和内联验证。455提交 `.claude/settings.json` 以便克隆仓库的每个人都获得相同的权限、hooks、遥测和插件。每个队友仍然可以在他们自己的 `.claude/settings.local.json` 中为自己覆盖它,所以个人例外不需要提交。有关完整的团队文件,请参阅[团队的共享设置](/docs/zh-CN/settings-example#a-teams-shared-settings)。

165 456 

166已发布的架构会定期更新,可能不包括最近 CLI 版本中添加的设置,因此最近记录的字段上的验证警告不一定意味着您的配置无效。457你提交的一些内容等待每个队友[信任文件夹](/docs/zh-CN/permissions#project-allow-rules-and-workspace-trust),少数键永远不会从仓库文件生效;[排查不适用的设置](#common-cases)涵盖两者。

167 458 

168<h3 id="when-edits-take-effect">459<span id="local-settings-file" />

169 编辑何时生效

170</h3>

171 460 

172Claude Code 监视您的设置文件,并在它们更改时重新加载它们,因此对大多数键的编辑会在运行的会话中应用,无需重启。这包括 `permissions`、`hooks` 和凭证助手(如 `apiKeyHelper`)。重新加载涵盖用户、项目、本地和 managed 设置,并为每个检测到的更改触发 [`ConfigChange` hook](/docs/zh-CN/hooks#configchange)。461<span id="where-claude-code-saves-the-project-local-file" />

173 462 

174少数几个键在会话启动时读取一次,并在下次重启时应用:463<span id="the-project-local-file" />

175 464 

176* `model`:使用 [`/model`](/docs/zh-CN/model-config#setting-your-model) 在会话中切换465<span id="keep-personal-settings-out-of-the-repository" />

177* [`outputStyle`](/docs/zh-CN/output-styles):系统提示的一部分,在 `/clear` 或重启时重建

178 466 

179<h3 id="invalid-entries-in-managed-settings">467<h3 id="keep-personal-settings-out-of-a-repository">

180 Managed 设置中的无效条目468 将个人设置保留在仓库之外

181</h3>469</h3>

182 470 

183Managed 设置宽容地解析。当 managed 配置包含验证架构失败的条目时,Claude Code 会删除该条目,记录警告,并强制执行所有剩余的有效策略。单个拼写错误无法禁用组织的其余策略。运行 [`/doctor`](/docs/zh-CN/debug-your-config#check-resolved-settings) 以列出被删除的条目及其源文件和字段。此行为在所有三种交付机制中一致:[服务器管理的设置](/docs/zh-CN/server-managed-settings)、通过 MDM 部署的 plist 和注册表策略,以及 `managed-settings.json` 文件。需要 Claude Code v2.1.169 或更高版本。471要在一个项目中为自己更改设置而不为队友更改它,将其保存在项目内的 `.claude/settings.local.json` 中。Claude Code 在提交的 `.claude/settings.json` 上应用该文件,所以如果你的团队文件设置 `"model": "claude-sonnet-5"` 而你想要 Opus,在你的本地文件中放入 `"model": "claude-opus-4-8"`,只有你的会话会改变。

184 472 

185安全强制字段按字段处理,而不是在存在但无效时被整体删除:473关于本地文件有三件事要知道:

186 474 

187| 字段 | 存在但无效时的行为 |475* **Claude Code 也写入它。** 当 Claude 要求权限运行 Bash 命令而你选择"是的,不要再问"时,Claude Code 将该[权限批准](/docs/zh-CN/permissions#permission-system)保存为 `allow` 规则。

188| :--------------------------- | :------------------------------------------------------------------------------------------------------------------------ |476* **你不需要自己 gitignore 它,除非你手动创建了它。** Claude Code 第一次在不已经忽略它的 git 仓库中写入文件时,它将 `**/.claude/settings.local.json` 添加到你的全局 git 排除文件,所以该文件在每个仓库中都不会进入你的提交。该文件是 `core.excludesFile`,当你的全局 git 配置将其设置为绝对路径或 `~` 前缀路径时;否则它是 `$XDG_CONFIG_HOME/git/ignore`,或当 `XDG_CONFIG_HOME` 未设置时是 `~/.config/git/ignore`。如果你手动创建了文件而 Claude Code 还没有写入它,自己将其添加到 `.gitignore`。

189| `allowedMcpServers` | 作为空允许列表强制执行,因此在修复值之前不允许任何 MCP servers。单个无效条目被删除,有效子集被强制执行。 |477* **其 allow 规则在文件保持未跟踪时不等待信任。** 因为文件是你的而不是仓库的,Claude Code 应用其 `allow` 规则而不需要它对提交文件要求的[工作区信任](/docs/zh-CN/permissions#project-allow-rules-and-workspace-trust)步骤。如果文件由 git 跟踪,信任步骤也适用于它;请参阅[当你的本地设置文件需要信任](/docs/zh-CN/permissions#when-your-local-settings-file-needs-trust)。

190| `allowManagedMcpServersOnly` | 视为 `true`。 |

191| `availableModels` | 作为空允许列表强制执行,因此在修复值之前仅默认模型可用。单个非字符串条目被删除,有效子集被强制执行。适用于 v2.1.175 及更高版本。 |

192| `enforceAvailableModels` | 视为 `true`。适用于 v2.1.175 及更高版本。 |

193| `forceLoginOrgUUID` | 在修复值之前不允许任何组织登录。 |

194| `deniedMcpServers` | 单个无效条目被删除,有效子集被强制执行。完全无效的值被丢弃并显示警告,因为拒绝每个 server 会阻止策略从未命名的 servers。 |

195| `sandbox.credentials` | 在 `files` 或 `envVars` 中的单个无效条目被删除并显示警告,有效子集被强制执行。完全无效的 `credentials` 值被丢弃并显示警告,同时 `sandbox` 的其余部分仍然适用。适用于 v2.1.191 及更高版本。 |

196 478 

197`requiredMinimumVersion` 和 `requiredMaximumVersion` 通过设计失败开放:无效值被删除而不是强制执行,因此坏策略推送无法阻止 Claude Code 启动。479<span id="where-claude-code-looks-for-each-file" />

198 480 

199验证错误出现在三个地方:481<span id="how-claude-code-keeps-the-local-file-out-of-git" />

200 482 

201* 交互式会话在启动时显示列出无效条目的对话框。483<span id="local-allow-rules-dont-wait-for-workspace-trust" />

202* 使用 `-p` 的无头运行将摘要打印到 stderr。

203* [`claude doctor`](/docs/zh-CN/debug-your-config) 列出每个无效条目及其源和字段。

204 484 

205在将策略更改部署到整个机队之前,在测试机器上运行 `claude doctor` 来验证策略更改。485<h4 id="where-claude-code-keeps-the-local-file-in-a-git-repository">

486 Claude Code 在 git 仓库中保留本地文件的位置

487</h4>

206 488 

207此容限仅适用于 managed 设置。用户、项目和本地设置文件保持严格:验证失败的文件被整体拒绝并报告。489当 Claude 要求权限运行 Bash 命令而你选择"是的,不要再问"时,Claude Code 将该批准保存为 `.claude/settings.local.json` 中的 `allow` 规则。如果你在 git 仓库的子目录中启动 Claude Code,它在仓库根目录读取和写入该文件,并在整个仓库中应用批准。在[工作树](/docs/zh-CN/worktrees)中,它使用主检出根目录处的文件。

208 490 

209<h3 id="available-settings">491两条规则限定根位置:

210 可用设置

211</h3>

212 492 

213`settings.json` 支持多个选项:493* **当文件与 `.claude/settings.json` 保持在一起时**:在 git 仓库外,当仓库根是你的主目录时,在 Windows 上,或当仓库根或其 `.git` 或 `.claude` 条目不由你的用户拥有时。

214 494* **文件中的路径不在仓库根处锚定**:以 `/` 开头的权限规则或相对沙箱路径[在会话的主工作目录处锚定](/docs/zh-CN/permissions#read-and-edit)。

215| 键 | 描述 | 示例 |

216| :--------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | :------------------------------------------------------------------------------------------------------------------------------ |

217| `advisorModel` | 服务器端 [advisor tool](/docs/zh-CN/advisor) 的模型。接受模型别名,如 `"opus"`、`"sonnet"` 或 `"fable"`(v2.1.170+),或完整模型 ID。当您运行 `/advisor` 时自动写入。取消设置以禁用 advisor | `"opus"` |

218| `agent` | 将主线程作为命名 subagent 运行,并为从 `claude agents` 分派的会话设置默认 agent。应用该 subagent 的系统提示、工具限制和模型。请参阅[显式调用 subagents](/docs/zh-CN/sub-agents#invoke-subagents-explicitly) | `"code-reviewer"` |

219| `agentPushNotifEnabled` | **默认**:`false`。当[远程控制](/docs/zh-CN/remote-control)已连接时,允许 Claude 向您的手机发送主动推送通知,例如当长任务完成时。在 `/config` 中显示为**Claude 决定时推送**。请参阅[移动推送通知](/docs/zh-CN/remote-control#mobile-push-notifications)。需要 Claude Code v2.1.119 或更高版本 | `true` |

220| `allowAllClaudeAiMcps` | (仅 Managed 设置)加载 claude.ai connectors 与部署的 `managed-mcp.json` 一起,否则后者会获得独占控制并抑制它们。请参阅 [Managed MCP 配置](/docs/zh-CN/managed-mcp) | `true` |

221| `allowedChannelPlugins` | (仅 Managed 设置)可能推送消息的频道插件的允许列表。设置后替换默认 Anthropic 允许列表。未定义 = 回退到默认值,空数组 = 阻止所有频道插件。需要 `channelsEnabled: true`。请参阅[限制哪些频道插件可以运行](/docs/zh-CN/channels#restrict-which-channel-plugins-can-run) | `[{ "marketplace": "claude-plugins-official", "plugin": "telegram" }]` |

222| `allowedHttpHookUrls` | HTTP hooks 可能针对的 URL 模式的允许列表。支持 `*` 作为通配符。设置后,具有不匹配 URL 的 hooks 被阻止。未定义 = 无限制,空数组 = 阻止所有 HTTP hooks。数组跨设置源合并。请参阅 [Hook 配置](#hook-configuration) | `["https://hooks.example.com/*"]` |

223| `allowedMcpServers` | 在 managed-settings.json 中设置时,用户可以配置的 MCP servers 的允许列表。未定义 = 无限制,空数组 = 锁定。适用于所有作用域。拒绝列表优先。请参阅 [Managed MCP 配置](/docs/zh-CN/managed-mcp) | `[{ "serverName": "github" }]` |

224| `allowManagedHooksOnly` | (仅 Managed 设置)仅加载 managed hooks、SDK hooks 和在 managed 设置 `enabledPlugins` 中强制启用的插件中的 hooks。用户、项目和所有其他插件 hooks 被阻止。请参阅 [Hook 配置](#hook-configuration) | `true` |

225| `allowManagedMcpServersOnly` | (仅 Managed 设置)仅尊重来自 managed 设置的 `allowedMcpServers`。`deniedMcpServers` 仍从所有源合并。用户仍可以添加 MCP servers,但仅应用管理员定义的允许列表。请参阅 [Managed MCP 配置](/docs/zh-CN/managed-mcp) | `true` |

226| `allowManagedPermissionRulesOnly` | (仅 Managed 设置)防止用户和项目设置定义 `allow`、`ask` 或 `deny` 权限规则。仅应用 managed 设置中的规则。请参阅 [Managed 专用设置](/docs/zh-CN/permissions#managed-only-settings) | `true` |

227| `alwaysThinkingEnabled` | 为所有会话默认启用[扩展思考](/docs/zh-CN/model-config#extended-thinking)。通常通过 `/config` 命令而不是直接编辑来配置。要强制禁用思考,无论此设置如何,请在 `env` 中设置 [`MAX_THINKING_TOKENS=0`](/docs/zh-CN/env-vars),这会禁用 Anthropic API 上的思考,除了 Fable 5,它无法关闭思考。在[第三方提供商](/docs/zh-CN/third-party-integrations)上,这会省略 `thinking` 参数,自适应推理模型仍可能思考 | `true` |

228| `apiKeyHelper` | 自定义脚本,在系统 shell(macOS 和 Linux 上为 `/bin/sh`,Windows 上为 `cmd`)中运行,以生成身份验证值。此值将作为 `X-Api-Key` 和 `Authorization: Bearer` 标头发送用于模型请求。使用 [`CLAUDE_CODE_API_KEY_HELPER_TTL_MS`](/docs/zh-CN/env-vars) 设置刷新间隔 | `/bin/generate_temp_api_key.sh` |

229| `askUserQuestionTimeout` | **默认**:`"never"`。未回答的 [`AskUserQuestion`](/docs/zh-CN/tools-reference) 对话框自动继续的空闲时间,使用您已选择的任何选项。接受 `"60s"`、`"5m"`、`"10m"` 或 `"never"`。使用默认值,问题等待您回答。在 `/config` 中显示为**问题自动继续超时**,将此键写入用户设置。不从项目或本地设置读取。需要 Claude Code v2.1.200 或更高版本 | `"5m"` |

230| `attribution` | 自定义 git 提交和拉取请求的归属。请参阅[归属设置](#attribution-settings) | `{"commit": "🤖 Generated with Claude Code", "pr": ""}` |

231| `autoCompactEnabled` | **默认**:`true`。当上下文接近限制时自动压缩对话。在 `/config` 中显示为**自动压缩**。要通过环境变量禁用,请在 `env` 中设置 [`DISABLE_AUTO_COMPACT`](/docs/zh-CN/env-vars) | `false` |

232| `autoMemoryDirectory` | [自动内存](/docs/zh-CN/memory#storage-location)存储的自定义目录。接受绝对路径或 `~/` 前缀的路径。从项目或本地设置接受,仅在您接受工作区信任对话框后,因为克隆的存储库可能提供此文件 | `"~/my-memory-dir"` |

233| `autoMemoryEnabled` | **默认**:`true`。启用[自动内存](/docs/zh-CN/memory#enable-or-disable-auto-memory)。当为 `false` 时,Claude 不从自动内存目录读取或写入。您也可以在会话期间使用 `/memory` 切换此选项。要通过环境变量禁用,请在 `env` 中设置 [`CLAUDE_CODE_DISABLE_AUTO_MEMORY`](/docs/zh-CN/env-vars) | `false` |

234| `autoMode` | 自定义[自动模式](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode)分类器阻止和允许的内容。包含 `environment`、`allow`、`soft_deny` 和 `hard_deny` 散文规则数组。在数组中包含字面字符串 `"$defaults"` 以在该位置继承内置规则。请参阅[配置自动模式](/docs/zh-CN/auto-mode-config)。仅从用户设置、`--settings` 标志和 managed 设置读取。在项目 `.claude/settings.json` 和本地 `.claude/settings.local.json` 中被忽略。在 v2.1.207 之前,`.claude/settings.local.json` 也被读取 | `{"soft_deny": ["$defaults", "Never run terraform apply"]}` |

235| `autoMode.classifyAllShell` | **默认**:`false`。当为 `true` 时,在自动模式活跃时暂停每个 Bash 和 PowerShell 允许规则,以便所有 shell 命令通过分类器路由,而不仅仅是匹配任意代码执行模式的规则。请参阅[通过分类器路由所有 shell 命令](/docs/zh-CN/auto-mode-config#route-all-shell-commands-through-the-classifier)。需要 Claude Code v2.1.193 或更高版本 | `true` |

236| `autoScrollEnabled` | **默认**:`true`。在[全屏渲染](/docs/zh-CN/fullscreen)中,跟随新输出到对话的底部。在 `/config` 中显示为**自动滚动**。权限提示仍在此关闭时滚动到视图中 | `false` |

237| `autoUpdatesChannel` | **默认**:`"latest"`。遵循更新的发布渠道。使用 `"stable"` 获取通常约一周前的版本并跳过有主要回归的版本,或使用 `"latest"` 获取最新版本。要完全禁用自动更新,请在 `env` 中设置 [`DISABLE_AUTOUPDATER`](/docs/zh-CN/setup#disable-auto-updates) | `"stable"` |

238| `availableModels` | 限制用户可以为主会话、[subagents](/docs/zh-CN/sub-agents)、[skills](/docs/zh-CN/skills) 和 [advisor](/docs/zh-CN/advisor) 选择的模型。不影响默认选项,除非 `enforceAvailableModels` 也被设置。请参阅[限制模型选择](/docs/zh-CN/model-config#restrict-model-selection) | `["sonnet", "haiku"]` |

239| `awaySummaryEnabled` | 在您离开终端几分钟后返回时显示单行会话回顾。设置为 `false` 或在 `/config` 中关闭会话回顾以禁用。与 [`CLAUDE_CODE_ENABLE_AWAY_SUMMARY`](/docs/zh-CN/env-vars) 相同 | `true` |

240| `awsAuthRefresh` | 修改 `.aws` 目录的自定义脚本(请参阅[高级凭证配置](/docs/zh-CN/amazon-bedrock#advanced-credential-configuration)) | `aws sso login --profile myprofile` |

241| `awsCredentialExport` | 输出包含 AWS 凭证的 JSON 的自定义脚本(请参阅[高级凭证配置](/docs/zh-CN/amazon-bedrock#advanced-credential-configuration)) | `/bin/generate_aws_grant.sh` |

242| `axScreenReader` | 渲染屏幕阅读器友好的输出:没有装饰性边框或动画的平面文本。屏幕阅读器模式使用经典渲染器,因此在其活跃时 `tui` 设置无效;附加的[后台会话](/docs/zh-CN/agent-view)仍渲染全屏。[`CLAUDE_AX_SCREEN_READER`](/docs/zh-CN/env-vars) 环境变量和 [`--ax-screen-reader`](/docs/zh-CN/cli-reference#cli-flags) 标志优先。需要 Claude Code v2.1.181 或更高版本 | `true` |

243| `blockedMarketplaces` | (仅 Managed 设置)市场源的阻止列表。在市场添加和插件安装、更新、刷新和自动更新时强制执行,因此在设置策略之前添加的市场无法用于获取插件。被阻止的源在下载前被检查,因此它们永远不会接触文件系统。请参阅 [Managed 市场限制](/docs/zh-CN/plugin-marketplaces#managed-marketplace-restrictions) | `[{ "source": "github", "repo": "untrusted/plugins" }]` |

244| `browserExternalPageTools` | (仅 Managed 设置)设置为 `"disabled"` 以防止 Claude 使用工具读取或作用于桌面应用[浏览器窗格](/docs/zh-CN/desktop#browse-external-sites)中的外部页面。用户仍可以自己导航到外部站点,本地开发服务器预览不受影响 | `"disabled"` |

245| `channelsEnabled` | (仅 Managed 设置)为组织允许 [channels](/docs/zh-CN/channels)。在 claude.ai Team 和 Enterprise 计划上,当此项未设置或为 `false` 时,channels 被阻止。对于使用 API 密钥身份验证的 [Anthropic Console](/docs/zh-CN/authentication#claude-console-authentication) 账户,channels 默认被允许,除非您的组织部署 managed 设置,在这种情况下此键必须设置为 `true` | `true` |

246| `claudeMd` | (仅 Managed 设置)CLAUDE.md 风格的说明,作为组织管理的内存注入。仅在 managed 或策略设置中设置时被尊重,在用户、项目和本地设置中被忽略。请参阅[组织范围的 CLAUDE.md](/docs/zh-CN/memory#deploy-organization-wide-claude-md) | `"Always run make lint before committing."` |

247| `claudeMdExcludes` | 加载[内存](/docs/zh-CN/memory)时要跳过的 `CLAUDE.md` 文件的 Glob 模式或绝对路径。模式与绝对文件路径匹配。仅适用于用户、项目和本地内存;managed 策略文件无法被排除 | `["**/vendor/**/CLAUDE.md"]` |

248| `cleanupPeriodDays` | **默认**:`30` 天,最少 `1`。Claude Code 删除[会话文件和其他应用程序数据](/docs/zh-CN/claude-directory#cleaned-up-automatically)早于此期间的在启动时。设置 `0` 会被拒绝并显示验证错误。相同的年龄截止也适用于[孤立 worktrees](/docs/zh-CN/worktrees#clean-up-worktrees) 在启动时自动删除。如果 Claude Code 无法读取或解析设置文件,它会暂停保留清理扫描并在 `/status` 中显示警告,直到您修复文件,除非 [managed 设置](/docs/zh-CN/server-managed-settings)提供 `cleanupPeriodDays`,在这种情况下扫描以 managed 值运行。在 v2.1.203 之前,清理以 30 天默认值在该状态下运行,可能删除较长 `cleanupPeriodDays` 打算保留的记录;30 天以上的文件从未被删除。要完全禁用记录写入,请设置 [`CLAUDE_CODE_SKIP_PROMPT_HISTORY`](/docs/zh-CN/env-vars) 环境变量。在非交互模式中,与 `-p` 一起传递 `--no-session-persistence` 或在 Agent SDK 中设置 `persistSession: false`。 | `20` |

249| `companyAnnouncements` | 在启动时显示给用户的公告。如果提供多个公告,它们将随机循环显示。 | `["Welcome to Acme Corp! Review our code guidelines at docs.acme.com"]` |

250| `defaultShell` | **默认**:`"bash"`,或在 Bash 不可用时在 Windows 上为 `"powershell"`。输入框 `!` 命令的默认 shell。接受 `"bash"` 或 `"powershell"`。设置 `"powershell"` 会在 Windows 上通过 PowerShell 路由交互式 `!` 命令。需要 `CLAUDE_CODE_USE_POWERSHELL_TOOL=1`。请参阅 [PowerShell tool](/docs/zh-CN/tools-reference#powershell-tool) | `"powershell"` |

251| `deniedMcpServers` | 在 managed-settings.json 中设置时,明确阻止的 MCP servers 的拒绝列表。适用于所有作用域,包括 managed servers。拒绝列表优先于允许列表。请参阅 [Managed MCP 配置](/docs/zh-CN/managed-mcp) | `[{ "serverName": "filesystem" }]` |

252| `disableAgentView` | 设置为 `true` 以关闭[后台代理和代理视图](/docs/zh-CN/agent-view):`claude agents`、`--bg`、`/background` 和按需主管。通常在 [managed 设置](/docs/zh-CN/permissions#managed-settings)中设置。等同于将 `CLAUDE_CODE_DISABLE_AGENT_VIEW` 设置为 `1` | `true` |

253| `disableAllHooks` | 禁用所有 [hooks](/docs/zh-CN/hooks) 和任何自定义[状态行](/docs/zh-CN/statusline) | `true` |

254| `disableArtifact` | 设置为 `true` 以禁用 [Artifact](/docs/zh-CN/artifacts) 工具,该工具将会话输出发布为 claude.ai 上的私有网页。等同于将 `CLAUDE_CODE_DISABLE_ARTIFACT` 设置为 `1` | `true` |

255| `disableAutoMode` | 设置为 `"disable"` 以防止[自动模式](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode)被激活。从 `Shift+Tab` 循环中删除 `auto` 并在启动时拒绝 `--permission-mode auto`。在[managed 设置](/docs/zh-CN/permissions#managed-settings)中最有用,用户无法覆盖它 | `"disable"` |

256| `disableBrowserExternalNavigation` | (仅 Managed 设置)设置为 `true` 以关闭桌面应用[浏览器窗格](/docs/zh-CN/desktop#browse-external-sites)中的外部浏览。用户和 Claude 都无法导航到外部站点,localhost 开发服务器预览不受影响。值必须是 JSON 布尔值 `true`;字符串 `"true"` 被忽略 | `true` |

257| `disableBundledSkills` | 设置为 `true` 以禁用 Claude Code 附带的 [skills](/docs/zh-CN/skills) 和工作流:捆绑的 skills 和工作流被完全删除,而内置斜杠命令(如 `/init`)保持可键入但对模型隐藏。`/doctor` 保持可键入,如内置命令;用 [`DISABLE_DOCTOR_COMMAND`](/docs/zh-CN/env-vars) 隐藏它。来自插件、`.claude/skills/` 和 `.claude/commands/` 的 skills 不受影响。等同于将 `CLAUDE_CODE_DISABLE_BUNDLED_SKILLS` 设置为 `1` | `true` |

258| `disableClaudeAiConnectors` | 禁用 [claude.ai MCP connectors](/docs/zh-CN/mcp#use-mcp-servers-from-claude-ai),以便它们不被自动获取或连接。在任何设置作用域中设置。任何源中的 `true` 优先,因此已检入的项目 `.claude/settings.json` 可以选择存储库退出云连接器,但项目级 `false` 无法覆盖用户或策略级 `true`。通过 `--mcp-config` 显式传递的 servers 不受影响。要拒绝单个连接器而不是所有连接器,请改用 [`deniedMcpServers`](/docs/zh-CN/managed-mcp)。需要 Claude Code v2.1.182 或更高版本 | `true` |

259| `disableDeepLinkRegistration` | 设置为 `"disable"` 以防止 Claude Code 在启动时向操作系统注册 `claude-cli://` 协议处理程序。[深链接](/docs/zh-CN/deep-links)让外部工具通过预填充的提示打开 Claude Code 会话。在协议处理程序注册受限或单独管理的环境中很有用 | `"disable"` |

260| `disabledMcpjsonServers` | 要拒绝的 `.mcp.json` 文件中特定 MCP servers 的列表 | `["filesystem"]` |

261| `disableRemoteControl` | 禁用[远程控制](/docs/zh-CN/remote-control):阻止 `claude remote-control`、`--remote-control` 标志、自动启动和会话内切换。通常放在[managed 设置](/docs/zh-CN/permissions#managed-settings)中用于每设备 MDM 强制执行,但适用于任何作用域。需要 Claude Code v2.1.128 或更高版本 | `true` |

262| `disableSideloadFlags` | (仅 Managed 设置)在启动时拒绝 `--plugin-dir`、`--plugin-url`、`--agents` 和 `--mcp-config` CLI 标志,用户可能会传递这些标志以绕过单次运行的 [`strictKnownMarketplaces`](#strictknownmarketplaces)。也拒绝从任何内部生成带有它们的 CLI 的表面这些标志,当前 [Cowork](/docs/zh-CN/desktop) 桌面应用中的本地会话。其服务器都是进程内 `type: "sdk"` 条目的 `--mcp-config` 仍被接受,因此 Agent SDK 和 VS Code 扩展保持工作。不阻止 `claude mcp add`、`.mcp.json` 或 SDK `setMcpServers()`;与 [`allowedMcpServers`](/docs/zh-CN/managed-mcp) 配对以获得每个 server 的 MCP 控制。需要 Claude Code v2.1.193 或更高版本 | `true` |

263| `disableSkillShellExecution` | 禁用 [skills](/docs/zh-CN/skills) 和来自用户、项目、插件或额外目录源的自定义命令中的 `` !`...` `` 和 ` ```! ` 块的内联 shell 执行。命令被替换为 `[shell command execution disabled by policy]` 而不是被运行。捆绑和 managed skills 不受影响。在[managed 设置](/zh-CN/permissions#managed-settings)中最有用,用户无法覆盖它 | `true` |

264| `disableWorkflows` | **默认**:`false`。禁用[动态工作流](/docs/zh-CN/workflows#turn-workflows-off)和捆绑的工作流命令。等同于将 `CLAUDE_CODE_DISABLE_WORKFLOWS` 设置为 `1` | `true` |

265| `editorMode` | **默认**:`"normal"`。输入提示的快捷键模式:`"normal"` 或 `"vim"`。在 `/config` 中显示为**快捷键模式** | `"vim"` |

266| `effortLevel` | 跨会话持久化[努力级别](/docs/zh-CN/model-config#adjust-effort-level)。接受 `"low"`、`"medium"`、`"high"` 或 `"xhigh"`。当您运行 `/effort` 时自动写入,带有这些值之一。`--effort` 和 [`CLAUDE_CODE_EFFORT_LEVEL`](/docs/zh-CN/env-vars) 覆盖此用于一个会话。请参阅[调整努力级别](/docs/zh-CN/model-config#adjust-effort-level)了解支持的模型 | `"xhigh"` |

267| `enableAllProjectMcpServers` | 自动批准项目 `.mcp.json` 文件中定义的所有 MCP servers。从 v2.1.196 开始,`claude mcp list` 和 `claude mcp get` 仅在[未检入存储库的设置文件](/docs/zh-CN/mcp#managing-your-servers)中的不受信任的文件夹中尊重此键 | `true` |

268| `enableArtifact` | 为此用户启用或禁用 [Artifact](/docs/zh-CN/artifacts) 工具。未设置时,默认遵循该功能对您账户的[可用性](/docs/zh-CN/artifacts#availability)。`/config` 中的**Artifacts** 行写入此键。managed `disableArtifact` 和您的组织的[管理员设置](/docs/zh-CN/artifacts#manage-artifacts-for-your-organization)优先,该键在项目和本地设置(`.claude/settings.json`、`.claude/settings.local.json`)中被忽略,存储库可能会检入。需要 Claude Code v2.1.196 或更高版本 | `true` |

269| `enabledMcpjsonServers` | 要批准的 `.mcp.json` 文件中特定 MCP servers 的列表。从 v2.1.196 开始,`claude mcp list` 和 `claude mcp get` 仅在[未检入存储库的设置文件](/docs/zh-CN/mcp#managing-your-servers)中的不受信任的文件夹中尊重此键 | `["memory", "github"]` |

270| `enforceAvailableModels` | 将 `availableModels` 允许列表扩展到默认模型。当在 managed 设置中为 `true` 且 `availableModels` 是非空数组时,默认选项回退到第一个可用的允许列表条目,但仅当默认模型会解析为的模型(当应用[组织默认](/docs/zh-CN/model-config#organization-default-model)时,否则账户类型默认)不在允许列表中时;允许列表默认保持原样。当 `availableModels` 未设置或为空时无效。请参阅[为默认模型强制执行允许列表](/docs/zh-CN/model-config#enforce-the-allowlist-for-the-default-model)。需要 Claude Code v2.1.175 或更高版本 | `true` |

271| `env` | 应用于每个会话和 Claude Code 从其生成的子进程的环境变量。将变量设置为 `""` 以用空字符串覆盖 shell 导出,Claude Code 将其视为未设置用于提供商选择。子进程仍继承空值。`NO_COLOR` 和 `FORCE_COLOR` 在此处设置仅到达子进程;要改变 Claude Code 自己的界面颜色,在启动 `claude` 前在您的 shell 中设置它们。从 v2.1.195 开始,Claude Code 的托管环境设置的身份变量,例如 `CLAUDE_CODE_REMOTE` 和 `CLAUDE_CODE_ACCOUNT_UUID`,在此处设置时被忽略 | `{"FOO": "bar"}` |

272| `fallbackModel` | 当主模型过载或不可用时按顺序尝试的备用模型。Claude Code 为该轮的其余部分切换到链中的下一个可用模型并显示通知。`"default"` 扩展为默认模型。链限制为三个模型;额外条目被忽略。与大多数数组设置不同,此键不跨设置文件合并:定义它的最高优先级文件提供整个链。[`--fallback-model`](/docs/zh-CN/cli-reference#cli-flags) 标志覆盖此用于一个会话。请参阅[备用模型链](/docs/zh-CN/model-config#fallback-model-chains) | `["claude-sonnet-5", "claude-haiku-4-5"]` |

273| `fastMode` | 为可用的会话打开[快速模式](/docs/zh-CN/fast-mode)。使用 `/fast` 切换会在用户设置中写入 `true`,当您关闭快速模式时删除键 | `true` |

274| `fastModePerSessionOptIn` | 当为 `true` 时,快速模式不会跨会话持久化。每个会话都以快速模式关闭开始,需要用户使用 `/fast` 启用它。用户的快速模式偏好仍被保存。请参阅[需要每个会话的选择加入](/docs/zh-CN/fast-mode#require-per-session-opt-in) | `true` |

275| `feedbackSurveyRate` | 概率(0–1)[会话质量调查](/docs/zh-CN/data-usage#session-quality-surveys)在符合条件时出现。设置为 `0` 以完全抑制,或在 `env` 中设置 [`CLAUDE_CODE_DISABLE_FEEDBACK_SURVEY`](/docs/zh-CN/env-vars)。在使用 Amazon Bedrock、Google Cloud 的 Agent Platform 或 Microsoft Foundry 时很有用,其中默认采样率不适用 | `0.05` |

276| `fileCheckpointingEnabled` | **默认**:`true`。在每次编辑前快照文件,以便 [`/rewind`](/docs/zh-CN/checkpointing) 可以恢复它们。在 `/config` 中显示为**回退代码(checkpoints)**。要通过环境变量禁用,请在 `env` 中设置 [`CLAUDE_CODE_DISABLE_FILE_CHECKPOINTING`](/docs/zh-CN/env-vars) | `false` |

277| `fileSuggestion` | 为 `@` 文件自动完成配置自定义脚本。请参阅[文件建议设置](#file-suggestion-settings) | `{"type": "command", "command": "~/.claude/file-suggestion.sh"}` |

278| `footerLinksRegexes` | 当正则表达式匹配轮次输出时渲染额外的可点击徽章在页脚中。每个条目有一个 `pattern`、一个 URL 模板,其中 `{name}` 占位符从命名捕获组填充,以及一个可选的 `label`。仅从用户、`--settings` 标志和 managed 设置读取。请参阅[页脚链接徽章](#footer-link-badges)了解 URL 约束、方案允许列表和限制。需要 Claude Code v2.1.176 或更高版本 | `[{"type": "regex", "pattern": "\\b(?<key>PROJ-\\d+)\\b", "url": "https://issues.example.com/browse/{key}", "label": "{key}"}]` |

279| `forceLoginMethod` | 使用 `claudeai` 限制登录到 Claude.ai 账户,`console` 限制登录到 Claude Console 账户,或 `gateway` 限制登录到云网关;请参阅 [Claude apps gateway](/docs/zh-CN/claude-apps-gateway)。在 managed 设置中设置为任何值时,由 `ANTHROPIC_API_KEY`、`ANTHROPIC_AUTH_TOKEN` 或 `apiKeyHelper` 进行身份验证的会话在启动时被阻止,因为环境凭证无法满足所需的登录方法。第三方提供商会话(如 Amazon Bedrock、Google Cloud 的 Agent Platform 和 Microsoft Foundry)不被阻止:它们针对您的云提供商而不是 Anthropic 进行身份验证 | `claudeai` |

280| `forceLoginGatewayUrl` | 在 `/login` 云网关屏幕上预填充并锁定网关 URL。此键或 `forceLoginMethod: "gateway"` 中的任一个都会显示该屏幕;同时设置两者以便 URL 被填充。仅在 managed 策略层受尊重;在用户和项目设置中被忽略。请参阅 [Claude apps gateway](/docs/zh-CN/claude-apps-gateway#set-the-gateway-url) | `"https://claude-gateway.example.com"` |

281| `forceLoginOrgUUID` | 要求登录属于特定 Anthropic 组织。接受单个 UUID 字符串(也在登录期间预选该组织)或 UUID 数组,其中任何列出的组织都被接受而无需预选。在 managed 设置中设置时,如果经过身份验证的账户不属于列出的组织,登录失败;由 `ANTHROPIC_API_KEY`、`ANTHROPIC_AUTH_TOKEN` 或 `apiKeyHelper` 进行身份验证的会话在启动时被阻止,因为无法为它们验证组织成员身份。第三方提供商会话(如 Amazon Bedrock、Google Cloud 的 Agent Platform 和 Microsoft Foundry)不被阻止:使用您的云 IAM 限制哪些云账户可以被使用。空数组失败关闭并使用配置错误消息阻止登录 | `"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"` 或 `["xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy"]` |

282| `forceRemoteSettingsRefresh` | (仅 Managed 设置)阻止 CLI 启动,直到从服务器新鲜获取远程 managed 设置。如果获取失败,CLI 退出而不是继续使用缓存或无设置。未设置时,启动继续而不等待远程设置。请参阅[失败关闭强制执行](/docs/zh-CN/server-managed-settings#enforce-fail-closed-startup) | `true` |

283| `gcpAuthRefresh` | 当 GCP Application Default Credentials 过期或无法加载时刷新它们的自定义脚本。请参阅[高级凭证配置](/docs/zh-CN/google-vertex-ai#advanced-credential-configuration) | `gcloud auth application-default login` |

284| `hooks` | 配置自定义命令以在生命周期事件处运行。请参阅 [hooks 文档](/docs/zh-CN/hooks) 了解格式 | 请参阅 [hooks](/docs/zh-CN/hooks) |

285| `httpHookAllowedEnvVars` | HTTP hooks 可能插入到标头中的环境变量名称的允许列表。设置后,每个 hook 的有效 `allowedEnvVars` 是与此列表的交集。未定义 = 无限制。数组跨设置源合并。请参阅 [Hook 配置](#hook-configuration) | `["MY_TOKEN", "HOOK_SECRET"]` |

286| `includeGitInstructions` | **默认**:`true`。在 Claude 的系统提示中包含内置提交和 PR 工作流说明和 git 状态快照。设置为 `false` 以删除这两者,例如在使用您自己的 git 工作流 skills 时。`CLAUDE_CODE_DISABLE_GIT_INSTRUCTIONS` 环境变量在设置时优先于此设置 | `false` |

287| `inputNeededNotifEnabled` | **默认**:`false`。当[远程控制](/docs/zh-CN/remote-control)已连接时,当权限提示或问题等待您的输入时向您的手机发送推送通知。在 `/config` 中显示为**需要操作时推送**。请参阅[移动推送通知](/docs/zh-CN/remote-control#mobile-push-notifications)。需要 Claude Code v2.1.119 或更高版本 | `true` |

288| `language` | 配置 Claude 的首选响应语言(例如 `"japanese"`、`"spanish"`、`"french"`)。Claude 将默认以此语言响应。也设置[语音听写](/docs/zh-CN/voice-dictation#change-the-dictation-language)语言和自动生成的会话标题。从 v2.1.176 开始,未设置时,会话标题与您的对话语言匹配 | `"japanese"` |

289| `minimumVersion` | 防止后台自动更新和 `claude update` 安装低于此版本的版本。从 `"latest"` 渠道切换到 `"stable"` 时通过 `/config` 提示您保持在当前版本或允许降级。选择保持设置此值。也在[managed 设置](/docs/zh-CN/permissions#managed-settings)中有用,以固定组织范围的最低版本。对于阻止启动的硬下限,请参阅 `requiredMinimumVersion` | `"2.1.100"` |

290| `model` | 覆盖用于 Claude Code 的默认模型。`--model` 和 [`ANTHROPIC_MODEL`](/docs/zh-CN/model-config#environment-variables) 覆盖此用于一个会话 | `"claude-sonnet-5"` |

291| `modelOverrides` | 将 Anthropic 模型 ID 映射到特定于提供商的模型 ID,例如 Amazon Bedrock 推理配置文件 ARN。每个模型选择器条目在调用提供商 API 时使用其映射值。请参阅[按版本覆盖模型 ID](/docs/zh-CN/model-config#override-model-ids-per-version) | `{"claude-opus-4-6": "arn:aws:bedrock:..."}` |

292| `otelHeadersHelper` | 生成动态 OpenTelemetry 标头的脚本。在启动时和定期运行。使用 [`CLAUDE_CODE_OTEL_HEADERS_HELPER_DEBOUNCE_MS`](/docs/zh-CN/env-vars) 设置刷新间隔。请参阅[动态标头](/docs/zh-CN/monitoring-usage#dynamic-headers) | `/bin/generate_otel_headers.sh` |

293| `outputStyle` | 配置输出样式以调整系统提示。请参阅[输出样式文档](/docs/zh-CN/output-styles) | `"Explanatory"` |

294| `parentSettingsBehavior` | (仅 Managed 设置)**默认**:`"first-wins"`。控制由嵌入主机进程(例如 Agent SDK 或 IDE 扩展)以编程方式提供的 managed 设置在同时存在管理员部署的 managed 层时是否应用。`"first-wins"`:父级提供的设置被丢弃,仅应用管理员层。`"merge"`:父级提供的设置在管理员层下应用,经过筛选以便它们可以收紧策略但不能放松策略。当未部署管理员层时无效。需要 Claude Code v2.1.133 或更高版本 | `"merge"` |

295| `permissions` | 请参阅下表了解权限的结构。 | |

296| `plansDirectory` | **默认**:`~/.claude/plans`。自定义 Plan Mode 文件的存储位置。路径相对于项目根目录。 | `"./plans"` |

297| `pluginSuggestionMarketplaces` | (仅 Managed 设置)其插件可以显示为上下文安装建议的市场名称。无市场声明的建议出现而不需要此允许列表;内置的第一方前端设计提示不受影响。建议来自每个插件在其市场条目中的 `relevance` 声明。名称仅在市场在机器上注册且其注册源也在 managed 设置中声明时才生效,作为该名称的 `extraKnownMarketplaces` 条目或 `strictKnownMarketplaces` 的条目。从不同源注册的市场在允许列表名称下被忽略。官方市场豁免于源要求:仅允许列表其名称就足够了,因为该名称只能从官方 Anthropic 源注册。 | `["acme-corp-plugins"]` |

298| `pluginTrustMessage` | (仅 Managed 设置)在安装前显示的插件信任警告中附加的自定义消息。使用此添加组织特定的上下文,例如确认来自您内部市场的插件已获批准。 | `"All plugins from our marketplace are approved by IT"` |

299| `policyHelper` | 管理员部署的可执行文件,在启动时动态计算 managed 设置。仅从 MDM 或系统 `managed-settings.json` 文件受尊重。请参阅[使用策略助手计算 managed 设置](#compute-managed-settings-with-a-policy-helper)。需要 Claude Code v2.1.136 或更高版本 | `{"path": "/usr/local/bin/claude-policy"}` |

300| `preferredNotifChannel` | **默认**:`"auto"`。任务完成和权限提示通知的方法:`"auto"`、`"terminal_bell"`、`"iterm2"`、`"iterm2_with_bell"`、`"kitty"`、`"ghostty"` 或 `"notifications_disabled"`。`"auto"` 在 iTerm2、Ghostty 和 Kitty 中发送桌面通知,在其他终端中不执行任何操作。设置 `"terminal_bell"` 以在任何终端中响铃。在 `/config` 中显示为**通知**。请参阅[获取终端铃声或通知](/docs/zh-CN/terminal-config#get-a-terminal-bell-or-notification) | `"terminal_bell"` |

301| `prefersReducedMotion` | 减少或禁用 UI 动画(微调器、闪烁、闪光效果)以实现可访问性 | `true` |

302| `prUrlTemplate` | PR 徽章的 URL 模板,显示在页脚和工具结果摘要中。替换来自 `gh` 报告的 PR URL 中的 `{host}`、`{owner}`、`{repo}`、`{number}` 和 `{url}`。使用指向内部代码审查工具而不是 `github.com` 的 PR 链接。不影响 Claude 散文中的 `#123` 自动链接 | `"https://reviews.example.com/{owner}/{repo}/pull/{number}"` |

303| `remoteControlAtStartup` | 当每个交互式会话启动时自动连接[远程控制](/docs/zh-CN/remote-control),而不是等待 `/remote-control`。设置为 `true` 以始终自动连接,`false` 以从不自动连接,或保留未设置以遵循您的组织的默认值。在 `/config` 中显示为**为所有会话启用远程控制**。请参阅[为所有会话启用远程控制](/docs/zh-CN/remote-control#enable-remote-control-for-all-sessions) | `false` |

304| `requiredMaximumVersion` | 仅 Managed 设置。允许启动的最大 Claude Code 版本。如果运行版本较新,Claude Code 在启动时退出并指示用户通过组织的批准方法安装批准的版本;`claude install <version>` 也可能有效。后台自动更新和 `claude update` 跳过高于上限的版本,因此在范围内的安装保持在范围内。`claude update`、`claude install` 和 `claude doctor` 在上限以上保持工作,以便用户可以恢复。早于此设置的版本忽略它 | `"2.1.150"` |

305| `requiredMinimumVersion` | 仅 Managed 设置。启动所需的最小 Claude Code 版本。如果运行版本较旧,Claude Code 在启动时退出并指示用户通过组织的批准方法更新。`claude update`、`claude install` 和 `claude doctor` 在下限以下保持工作,以便用户可以恢复。与 `minimumVersion` 不同,后者防止降级但从不阻止启动。早于此设置的版本忽略它 | `"2.1.150"` |

306| `respectGitignore` | **默认**:`true`。控制 `@` 文件选择器是否尊重 `.gitignore` 模式。当为 `true` 时,匹配 `.gitignore` 模式的文件被排除在建议之外 | `false` |

307| `respondToBashCommands` | **默认**:`true`。Claude 在输入框 `!` shell 命令运行后是否响应。设置为 `false` 以将命令输出添加到上下文而不响应。请参阅[带 `!` 前缀的 Shell 模式](/docs/zh-CN/interactive-mode#shell-mode-with-prefix)。需要 Claude Code v2.1.186 或更高版本 | `false` |

308| `showClearContextOnPlanAccept` | **默认**:`false`。在 Plan Mode 接受屏幕上显示"清除上下文"选项。设置为 `true` 以恢复该选项 | `true` |

309| `showThinkingSummaries` | **默认**:`false`。在交互式会话中显示[扩展思考](/docs/zh-CN/model-config#extended-thinking)摘要。未设置或 `false` 时,思考块由 API 编辑并显示为折叠的存根。编辑仅改变您看到的内容,而不是模型生成的内容:要减少思考支出,[降低预算或禁用思考](/docs/zh-CN/model-config#extended-thinking)。此设置在非交互模式(`-p`)、Agent SDK 或 IDE 扩展(如 VS Code)中无效 | `true` |

310| `showTurnDuration` | **默认**:`true`。在响应后显示轮次持续时间消息,例如"Cooked for 1m 6s"。在 `/config` 中显示为**显示轮次持续时间** | `false` |

311| `skillListingBudgetFraction` | **默认**:`0.01`。为[skill 列表](/docs/zh-CN/skills#skill-descriptions-are-cut-short)预留的模型上下文窗口的分数,Claude 每轮看到。当列表超过预算时,最少使用的 skills 的描述被删除,仅列出其名称,以便 Claude 仍可以调用它们但不会看到它们的作用。提高以保持更多描述可见,代价是每轮更多上下文。`/doctor` 估计列表成本与预算 | `0.02` |

312| `skillListingMaxDescChars` | **默认**:`1536`。[skill 列表](/docs/zh-CN/skills#skill-descriptions-are-cut-short)中每个 skill 的 `description` 和 `when_to_use` 文本组合的字符上限。超过此长度的文本被截断。提高以保持长描述完整,代价是每轮更多上下文;降低以在 [`skillListingBudgetFraction`](#available-settings) 下适应更多 skills | `2048` |

313| `skillOverrides` | 按 skill 名称键入的每个 skill 可见性覆盖。值为 `"on"`、`"name-only"`、`"user-invocable-only"` 或 `"off"`。让您隐藏或折叠 skill 而无需编辑其 SKILL.md。不适用于插件 skills,这些通过 `/plugin` 管理。`/skills` 菜单将这些写入 `.claude/settings.local.json`。请参阅[从设置覆盖 skill 可见性](/docs/zh-CN/skills#override-skill-visibility-from-settings)。需要 Claude Code v2.1.129 或更高版本 | `{"legacy-context": "name-only", "deploy": "off"}` |

314| `skipWebFetchPreflight` | 跳过[WebFetch 域安全检查](/docs/zh-CN/data-usage#webfetch-domain-safety-check),该检查在获取前将每个请求的主机名发送到 `api.anthropic.com`。在阻止到 Anthropic 的流量的环境中设置为 `true`,例如 Amazon Bedrock、Google Cloud 的 Agent Platform 或 Microsoft Foundry 部署,具有限制性出站。跳过时,WebFetch 尝试任何 URL 而不咨询阻止列表 | `true` |

315| `spinnerTipsEnabled` | **默认**:`true`。在 Claude 工作时在微调器中显示提示。设置为 `false` 以禁用提示 | `false` |

316| `spinnerTipsOverride` | 使用自定义字符串覆盖微调器提示。`tips`:提示字符串数组。`excludeDefault`:如果为 `true`,仅显示自定义提示;如果为 `false` 或不存在,自定义提示与内置提示合并 | `{ "excludeDefault": true, "tips": ["Use our internal tool X"] }` |

317| `spinnerVerbs` | 自定义在微调器中显示的操作动词。将 `mode` 设置为 `"replace"` 以仅使用您的动词,或 `"append"` 以将它们添加到默认值 | `{"mode": "append", "verbs": ["Pondering", "Crafting"]}` |

318| `sshConfigs` | 要在[桌面](/docs/zh-CN/desktop#pre-configure-ssh-connections-for-your-team)环境下拉菜单中显示的 SSH 连接。每个条目需要 `id`、`name` 和 `sshHost`;`sshPort`、`sshIdentityFile` 和 `startDirectory` 是可选的。在 managed 设置中设置时,连接对用户是只读的。仅从 managed 和用户设置读取 | `[{"id": "dev-vm", "name": "Dev VM", "sshHost": "user@dev.example.com"}]` |

319| `statusLine` | 配置自定义状态行以显示上下文。对象的可选 `padding`、`refreshInterval` 和 `hideVimModeIndicator` 字段控制间距、定期重新运行和是否隐藏提示下方的内置 vim 模式指示器。请参阅[`statusLine` 文档](/docs/zh-CN/statusline#manually-configure-a-status-line) | `{"type": "command", "command": "~/.claude/statusline.sh"}` |

320| `strictKnownMarketplaces` | (仅 Managed 设置)插件市场源的允许列表。未定义 = 无限制,空数组 = 锁定。在市场添加和插件安装、更新、刷新和自动更新时强制执行,因此在设置策略之前添加的市场无法用于获取插件。请参阅 [Managed 市场限制](/docs/zh-CN/plugin-marketplaces#managed-marketplace-restrictions) | `[{ "source": "github", "repo": "acme-corp/plugins" }]` |

321| `strictPluginOnlyCustomization` | (仅 Managed 设置)阻止 skills、agents、hooks 和 MCP servers 来自用户和项目源,因此它们只能来自插件或 managed 设置。`true` 锁定所有四个表面;数组仅锁定命名的表面。请参阅 [`strictPluginOnlyCustomization`](#strictpluginonlycustomization) | `["skills", "hooks"]` |

322| `syntaxHighlightingDisabled` | 禁用 diffs、代码块和文件预览中的语法高亮 | `true` |

323| `teammateMode` | **默认**:`in-process`。[agent team](/docs/zh-CN/agent-teams) 队友的显示方式:`in-process`、`auto`(在 tmux 或 iTerm2 中选择分割窗格,否则进程内)、`tmux`(使用 tmux 或 iTerm2 选择分割窗格,从您的终端检测)或 }`iterm2`(iTerm2 本机分割窗格通过 `it2` CLI,在 v2.1.186 中添加)。默认在 v2.1.179 中从 `auto` 更改。`--teammate-mode` 覆盖此用于一个会话。请参阅[选择显示模式](/docs/zh-CN/agent-teams#choose-a-display-mode) | `"auto"` |

324| `terminalProgressBarEnabled` | **默认**:`true`。在支持的终端中显示终端进度条:ConEmu、Ghostty 1.2.0+ 和 iTerm2 3.6.6+。在 `/config` 中显示为**终端进度条** | `false` |

325| `theme` | **默认**:`"dark"`。界面的颜色主题:`"auto"`、`"dark"`、`"light"`、`"dark-daltonized"`、`"light-daltonized"`、`"dark-ansi"`、`"light-ansi"` 或自定义主题参考,如 `"custom:<slug>"` 或 `"custom:<plugin-name>:<slug>"`。请参阅[创建自定义主题](/docs/zh-CN/terminal-config#create-a-custom-theme)。在 `/config` 中显示为**主题** | `"dark"` |

326| `tui` | 终端 UI 渲染器。使用 `"fullscreen"` 获取无闪烁的[替代屏幕渲染器](/docs/zh-CN/fullscreen),具有虚拟化滚动条。使用 `"default"` 获取经典主屏幕渲染器。通过 `/tui` 设置。您也可以设置 [`CLAUDE_CODE_NO_FLICKER`](/docs/zh-CN/env-vars) 环境变量。后台会话从[代理视图](/docs/zh-CN/agent-view)打开始终使用全屏渲染器,无论此设置如何 | `"fullscreen"` |

327| `ultracode` | 为会话打开 [ultracode](/docs/zh-CN/workflows#let-claude-decide-with-ultracode)。此键不从 `settings.json` 读取。通过 `/effort ultracode`、`--settings` 或 Agent SDK 控制请求设置。要启动已打开 ultracode 的会话,使用 `claude --effort ultracode` 启动,需要 Claude Code v2.1.203 或更高版本 | `true` |

328| `useAutoModeDuringPlan` | **默认**:`true`。Plan Mode 在自动模式可用时是否使用自动模式语义。不从共享项目设置读取。在 `/config` 中显示为"在计划期间使用自动模式" | `false` |

329| `verbose` | **默认**:`false`。显示完整工具输出而不是截断的摘要。在 `/config` 中显示为**详细输出**。`--verbose` 标志覆盖此用于一个会话 | `true` |

330| `viewMode` | 启动时的默认记录视图模式:`"default"`、`"verbose"` 或 `"focus"`。设置时覆盖粘性 `/focus` 选择。`--verbose` 标志覆盖此用于一个会话 | `"verbose"` |

331| `vimInsertModeRemaps` | 将两键 INSERT 模式序列映射到 Escape 在[vim 编辑器模式](/docs/zh-CN/interactive-mode#vim-editor-mode)中。每个键恰好是两个按顺序键入的可打印字符,`"<Esc>"` 是唯一支持的目标;其他条目被忽略。仅从用户、`--settings` 标志和 managed 设置读取,因此存储库的已检入设置无法重新映射您的按键。除非 `editorMode` 为 `"vim"`,否则无效。请参阅[重新映射 INSERT 模式键序列](/docs/zh-CN/interactive-mode#remap-insert-mode-key-sequences)。需要 Claude Code v2.1.208 或更高版本 | `{"jj": "<Esc>"}` |

332| `voice` | [语音听写](/docs/zh-CN/voice-dictation)设置:`enabled` 打开听写,`mode` 选择 `"hold"` 或 `"tap"`,`autoSubmit` 在保持模式下按键释放时发送提示。当您运行 `/voice` 时自动写入。需要 Claude.ai 账户 | `{ "enabled": true, "mode": "tap" }` |

333| `voiceEnabled` | `voice.enabled` 的旧别名。优先使用 `voice` 对象 | `true` |

334| `wheelScrollAccelerationEnabled` | **默认**:`true`。在[全屏渲染](/docs/zh-CN/fullscreen#mouse-wheel-scrolling)中,加速鼠标滚轮滚动速度在快速滚动期间。设置为 `false` 以获得每个滚轮缺口的恒定滚动速率。需要 Claude Code v2.1.174 或更高版本 | `false` |

335| `workflowKeywordTriggerEnabled` | **默认**:`true`。提示中的单词 `ultracode` 是否触发[动态工作流](/docs/zh-CN/workflows#ask-for-a-workflow-in-your-prompt)。设置为 `false` 以键入单词而不触发一个。Ultracode 努力设置、`/workflows` 和保存的工作流命令不受影响。在 `/config` 中显示为**Ultracode 关键字触发**。在 v2.1.157 中添加;在 v2.1.160 之前触发关键字是 `workflow` | `false` |

336| `wslInheritsWindowsSettings` | (仅 Windows managed 设置)当为 `true` 时,WSL 上的 Claude Code 除了 `/etc/claude-code` 外还从 Windows 策略链读取 managed 设置,Windows 源优先。仅在 HKLM 注册表项或 `C:\Program Files\ClaudeCode\managed-settings.json` 中设置时被尊重,两者都需要 Windows 管理员权限才能写入。为了让 HKCU 策略也在 WSL 上应用,该标志还必须在 HKCU 本身中设置。对本机 Windows 无效 | `true` |

337 

338<h3 id="global-config-settings">

339 全局配置设置

340</h3>

341 495 

342这些设置存储在 `~/.claude.json` 中,而不是 `settings.json`。将它们添加到 `settings.json` 将触发架构验证错误。496在 v2.1.211 之前,Claude Code 在启动目录中保留文件。它仍然读取早期版本在根文件旁边留下的文件;当两者都设置相同的键时,根的值适用,两个文件的权限规则都适用。Agent SDK 的 [`resolveSettings()`](/docs/zh-CN/agent-sdk/typescript#resolvesettings) 助手总是从启动目录读取文件。

343 497 

344<Note>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 或更高版本。

345 v2.1.119 之前的版本也在此处而不是在 `settings.json` 中存储多个 `/config` 偏好键,包括 `theme`、`verbose`、`editorMode`、`autoCompactEnabled` 和 `preferredNotifChannel`。

346</Note>

347 499 

348| 键 | 描述 | 示例 |500<span id="managed-settings-delivery" />

349| :--------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :--------- |

350| `autoConnectIde` | **默认**:`false`。当 Claude Code 从外部终端启动时自动连接到运行的 IDE。在 VS Code 或 JetBrains 终端外运行时在 `/config` 中显示为**自动连接到 IDE(外部终端)**。[`CLAUDE_CODE_AUTO_CONNECT_IDE`](/docs/zh-CN/env-vars) 环境变量在设置时覆盖此 | `true` |

351| `autoInstallIdeExtension` | **默认**:`true`。从 VS Code 终端运行时自动安装 Claude Code IDE 扩展。在 VS Code 或 JetBrains 终端内运行时在 `/config` 中显示为**自动安装 IDE 扩展**。您也可以设置 [`CLAUDE_CODE_IDE_SKIP_AUTO_INSTALL`](/docs/zh-CN/env-vars) 环境变量 | `false` |

352| `externalEditorContext` | **默认**:`false`。当您使用 `Ctrl+G` 打开外部编辑器时,将 Claude 的上一个响应作为 `#` 注释上下文前置。在 `/config` 中显示为**在外部编辑器中显示最后响应** | `true` |

353| `permissionExplainerEnabled` | **默认**:`true`。当您在 Bash 或 PowerShell 权限提示上按 `Ctrl+E` 时显示模型生成的[命令说明](/docs/zh-CN/permissions#permission-system)。设置为 `false` 以关闭快捷键 | `false` |

354| `teammateDefaultModel` | [agent team](/docs/zh-CN/agent-teams) 队友的默认模型,当生成提示未指定时。设置为模型别名(如 `"sonnet"`),或 `null` 以继承主导的当前 `/model` 选择。在 `/config` 中显示为**默认队友模型** | `"sonnet"` |

355| `workflowSizeGuideline` | **默认**:`unrestricted`,不发送指南。设置[动态工作流](/docs/zh-CN/workflows#set-a-size-guideline)中 Claude 针对的[代理计数](/docs/zh-CN/workflows#set-a-size-guideline)。Claude Code 将值作为建议而不是强制上限发送给 Claude。接受 `unrestricted`、`small`、`medium` 或 `large`。在 `/config` 中显示为**动态工作流大小**。您也可以使用 `/config workflowSizeGuideline=small` 直接设置它。需要 Claude Code v2.1.202 或更高版本。指南的代理计数也替换[`Large workflow` 警告](/docs/zh-CN/workflows#cost)的默认阈值;该行为需要 Claude Code v2.1.203 或更高版本 | `"small"` |

356 

357<h3 id="worktree-settings">

358 Worktree 设置

359</h3>

360 501 

361配置 `--worktree` 如何创建和管理 git worktrees。502<span id="precedence-within-the-managed-tier" />

362 503 

363| 键 | 描述 | 示例 |504<span id="parent-settings-from-embedding-hosts" />

364| :---------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------ |

365| `worktree.baseRef` | 新 worktrees 分支的参考。`"fresh"`(默认)从 `origin/<default-branch>` 分支以获得与远程匹配的干净树。`"head"` 从您当前的本地 `HEAD` 分支,因此未推送的提交和特性分支状态存在于 worktree 中。在 linked worktree 内,`"head"` 解析为该 worktree 的 `HEAD`,而不是主检出的。适用于 `--worktree`、`EnterWorktree` 工具和 subagent 隔离 | `"head"` |

366| `worktree.symlinkDirectories` | 要从主存储库符号链接到每个 worktree 的目录,以避免在磁盘上复制大型目录。默认情况下不符号链接任何目录 | `["node_modules", ".cache"]` |

367| `worktree.sparsePaths` | 通过 git sparse-checkout 在每个 worktree 中检出的目录。仅将列出的目录加上根级文件写入磁盘,在大型 monorepos 中更快。当 sparse worktree 存在时,git 在存储库的共享 `.git/config` 中启用 `extensions.worktreeConfig`;请参阅[仅检出您需要的目录](/docs/zh-CN/large-codebases#check-out-only-the-directories-you-need) | `["packages/my-app", "shared/utils"]` |

368| `worktree.bgIsolation` | [后台会话](/docs/zh-CN/agent-view#how-file-edits-are-isolated)的隔离模式。`"worktree"`(默认)在调用 `EnterWorktree` 之前阻止主检出中的 `Edit`/`Write`。在 git 存储库外,失败的 [`WorktreeCreate` hook](/docs/zh-CN/worktrees#non-git-version-control) 释放块,以便会话可以就地编辑工作目录;需要 Claude Code v2.1.203 或更高版本。`"none"` 让后台作业直接编辑工作副本。需要 Claude Code v2.1.143 或更高版本 | `"none"` |

369 505 

370要将 gitignored 文件(如 `.env`)复制到新的 worktrees,请在项目根目录中使用 [`.worktreeinclude` 文件](/docs/zh-CN/worktrees#copy-gitignored-files-into-worktrees),而不是设置。506<span id="enforce-settings-for-an-organization" />

371 507 

372<h3 id="permission-settings">508<span id="settings-your-organization-manages" />

373 权限设置

374</h3>

375 509 

376| 键 | 描述 | 示例 |510<h3 id="check-what-your-organization-enforces">

377| :---------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------- |511 检查你的组织强制执行的内容

378| `allow` | 允许工具使用的权限规则数组。工具名称 globs 仅在字面 `mcp__<server>__` 前缀后的工具位置支持,例如 `mcp__github__get_*`;server 段必须无 glob。请参阅下面的[权限规则语法](#permission-rule-syntax)了解模式匹配详情 | `[ "Bash(git diff *)" ]` |

379| `ask` | 在工具使用时要求确认的权限规则数组。请参阅下面的[权限规则语法](#permission-rule-syntax) | `[ "Bash(git push *)" ]` |

380| `deny` | 拒绝工具使用的权限规则数组。使用此排除敏感文件不被 Claude Code 访问。工具名称接受 glob 模式:`"*"` 拒绝每个工具,`"mcp__*"` 拒绝所有 MCP 工具。请参阅[权限规则语法](#permission-rule-syntax)和 [Bash 权限限制](/docs/zh-CN/permissions#tool-specific-permission-rules) | `[ "WebFetch", "Bash(curl *)", "Read(./.env)", "Read(./secrets/**)" ]` |

381| `additionalDirectories` | Claude 有权访问的额外[工作目录](/docs/zh-CN/permissions#working-directories)。大多数 `.claude/` 配置[未从这些目录发现](/docs/zh-CN/permissions#additional-directories-grant-file-access-not-configuration) | `[ "../docs/" ]` |

382| `defaultMode` | 打开 Claude Code 时的默认[权限模式](/docs/zh-CN/permission-modes)。有效值:`default`、`acceptEdits`、`plan`、`auto`、`dontAsk`、`bypassPermissions` 和 }`manual` 作为 `default` 的别名,CLI、VS Code 和 JetBrains 扩展以及桌面应用中标记为 Manual 的模式。`manual` 别名需要 Claude Code v2.1.200 或更高版本。从 Claude Code v2.1.142 开始,当在项目或本地设置(`.claude/settings.json`、`.claude/settings.local.json`)中设置时,`auto` 被忽略,因此存储库无法授予自己自动模式。改为在 `~/.claude/settings.json` 中设置它。在 v2.1.142 之前,项目设置可以设置 `auto`。`--permission-mode` CLI 标志覆盖此设置用于单个会话 | `"acceptEdits"` |

383| `disableBypassPermissionsMode` | 设置为 `"disable"` 以防止激活 `bypassPermissions` 模式。禁用 `--dangerously-skip-permissions` 标志。通常放在[managed 设置](/docs/zh-CN/permissions#managed-settings)中以强制执行组织策略,但适用于任何作用域 | `"disable"` |

384| `skipDangerousModePermissionPrompt` | 跳过通过 `--dangerously-skip-permissions` 或 `defaultMode: "bypassPermissions"` 进入 bypass permissions 模式前显示的确认提示。在项目设置(`.claude/settings.json`)中设置时被忽略,以防止不受信任的存储库自动绕过提示 | `true` |

385 

386<h3 id="permission-rule-syntax">

387 权限规则语法

388</h3>512</h3>

389 513 

390权限规则遵循 `Tool` 或 `Tool(specifier)` 的格式。规则按顺序评估:首先是拒绝规则,然后是询问,最后是允许。第一个匹配的规则确定结果,无论规则特异性如何。请参阅[权限规则评估顺序](/docs/zh-CN/permissions#manage-permissions)了解详情。514如果你的组织管理 Claude Code,某些设置是为你决定的,你在自己的文件中放入的任何内容都不会改变它们。要查看哪些,运行 `/status`:`Setting sources` 行命名适用于你的托管来源。托管设置在这台机器上 Claude Code 运行的任何地方都适用;[开发人员可以更改的内容](/docs/zh-CN/managed-settings#what-a-developer-can-change)涵盖本地管理员权限和 Claude Code 以外的工具。

391 

392快速示例:

393 

394| 规则 | 效果 |

395| :----------------------------- | :-------------------- |

396| `Bash` | 匹配所有 Bash 命令 |

397| `Bash(npm run *)` | 匹配以 `npm run` 开头的命令 |

398| `Read(./.env)` | 匹配读取 `.env` 文件 |

399| `WebFetch(domain:example.com)` | 匹配对 example.com 的获取请求 |

400 

401有关完整的规则语法参考,包括通配符行为、Read、Edit、WebFetch、MCP 和 Agent 规则的工具特定模式,以及 Bash 模式的安全限制,请参阅[权限规则语法](/docs/zh-CN/permissions#permission-rule-syntax)。

402 

403<h3 id="sandbox-settings">

404 Sandbox 设置

405</h3>

406 515 

407配置高级 sandboxing 行为。Sandboxing 将 bash 命令与您的文件系统和网络隔离。请参阅 [Sandboxing](/docs/zh-CN/sandboxing) 了解详情。516托管设置通过托管设置页面上的[交付机制](/docs/zh-CN/managed-settings#delivery-mechanisms)到达你,最常见的是:

408 

409| 键 | 描述 | 示例 |

410| :------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | :--------------------------------------------------- |

411| `enabled` | 启用 bash sandboxing(macOS、Linux 和 WSL2)。默认:false | `true` |

412| `failIfUnavailable` | 如果 `sandbox.enabled` 为 true 但 sandbox 无法启动(缺少依赖项或不支持的平台),则在启动时以错误退出。当为 false(默认)时,显示警告,命令无 sandbox 运行。用于需要 sandboxing 作为硬门的 managed 设置部署 | `true` |

413| `autoAllowBashIfSandboxed` | 当 sandboxed 时自动批准 bash 命令。默认:true | `true` |

414| `excludedCommands` | 应在 sandbox 外运行的命令 | `["docker *"]` |

415| `allowUnsandboxedCommands` | 允许命令通过 `dangerouslyDisableSandbox` 参数在 sandbox 外运行。当设置为 `false` 时,`dangerouslyDisableSandbox` 逃生舱口完全禁用,所有命令必须 sandboxed(或在 `excludedCommands` 中)。对于需要严格 sandboxing 的企业策略很有用。默认:true | `false` |

416| `filesystem.allowWrite` | sandboxed 命令可以写入的额外路径。数组跨所有设置作用域合并:用户、项目和 managed 路径组合,不替换。也与 `Edit(...)` 允许权限规则中的路径合并。请参阅下面的[路径前缀](#sandbox-path-prefixes)。 | `["/tmp/build", "~/.kube"]` |

417| `filesystem.denyWrite` | sandboxed 命令无法写入的路径。数组跨所有设置作用域合并。也与 `Edit(...)` 拒绝权限规则中的路径合并。 | `["/etc", "/usr/local/bin"]` |

418| `filesystem.denyRead` | sandboxed 命令无法读取的路径。数组跨所有设置作用域合并。也与 `Read(...)` 拒绝权限规则中的路径合并。 | `["~/.aws/credentials"]` |

419| `filesystem.allowRead` | 在 `denyRead` 区域内重新允许读取的路径。`allowRead` 路径在更广泛的 `denyRead` 区域内重新打开读取,`denyRead` 中的精确路径在更广泛的 `allowRead` 内保持被阻止;请参阅[重叠表](/docs/zh-CN/sandboxing#configure-sandboxing)了解示例。数组跨所有设置作用域合并。使用此创建仅工作区读取访问模式。 | `["."]` |

420| `filesystem.allowManagedReadPathsOnly` | (仅 Managed 设置)仅尊重来自 managed 设置的 `filesystem.allowRead` 路径。`denyRead` 仍从所有源合并。默认:false | `true` |

421| `credentials.files` | Credential 文件或目录,sandboxed 命令无法读取。应用与 `filesystem.denyRead` 相同的读取块;单独的键将凭证路径与 `credentials.envVars` 分组,与一般文件系统规则分开。每个条目是 `{ "path": "...", "mode": "deny" }`,仅支持 `deny`。路径使用与 `filesystem.*` 设置相同的[前缀](#sandbox-path-prefixes)。数组跨所有设置作用域合并。需要 Claude Code v2.1.187 或更高版本。 | `[{ "path": "~/.aws/credentials", "mode": "deny" }]` |

422| `credentials.envVars` | 要[保护免受 sandboxed 命令](/docs/zh-CN/sandboxing#protect-credentials)的环境变量。每个条目有一个 `name` 和一个 `mode`;名称必须以字母或下划线开头,仅包含字母、数字和下划线。`deny` 从 sandboxed 命令的环境中删除变量。需要 Claude Code v2.1.187 或更高版本。}`mask` 在 sandbox 内用每个会话的哨兵值替换变量,同时 sandbox 代理在对该条目的 `injectHosts` 的出站请求上替换真实值;它需要 `network.tlsTerminate` 和 Claude Code v2.1.199 或更高版本。`mask` 条目仅从用户、managed 或 CLI `--settings` 设置受尊重,不从 `.claude/settings.json` 或 `.claude/settings.local.json`。数组跨所有设置作用域合并,当同一变量同时出现两种模式时 `deny` 优先。 | `[{ "name": "GITHUB_TOKEN", "mode": "deny" }]` |

423| `credentials.envVars[].injectHosts` | sandbox 代理替换 `mask` 条目真实值的主机。每个主机也必须由 `network.allowedDomains` 覆盖,要么完全要么通过通配符。未设置时,代理在对 `network.allowedDomains` 中每个主机的请求上替换值。当 `mode` 为 `deny` 时被接受但忽略。需要 Claude Code v2.1.199 或更高版本。} | `["api.github.com"]` |

424| `credentials.allowPlaintextInject` | 允许 `mask` 替换在纯 HTTP 请求以及 TLS 终止的 HTTPS 上。在纯 HTTP 上上游身份未验证,凭证以明文形式传输,因此在受信任的测试网络外保持此关闭。仅从用户、managed 或 CLI `--settings` 设置受尊重,不从 `.claude/settings.json` 或 `.claude/settings.local.json`。默认:false。需要 Claude Code v2.1.199 或更高版本。} | `true` |

425| `network.allowUnixSockets` | (仅 macOS)sandbox 中可访问的 Unix socket 路径。在 Linux 和 WSL2 上被忽略,其中 seccomp 过滤器无法检查 socket 路径;改用 `allowAllUnixSockets`。 | `["~/.ssh/agent-socket"]` |

426| `network.allowAllUnixSockets` | 允许 sandbox 中的所有 Unix socket 连接。在 Linux 和 WSL2 上这是允许 Unix sockets 的唯一方式,因为它跳过了 seccomp 过滤器,否则会阻止 `socket(AF_UNIX, ...)` 调用。默认:false | `true` |

427| `network.allowLocalBinding` | 允许绑定到 localhost 端口(仅 macOS)。默认:false | `true` |

428| `network.allowMachLookup` | sandbox 可能查找的额外 XPC/Mach 服务名称(仅 macOS)。支持单个尾部 `*` 用于前缀匹配。对于通过 XPC 通信的工具(如 iOS 模拟器或 Playwright)是必需的。 | `["com.apple.coresimulator.*"]` |

429| `network.allowedDomains` | 允许出站网络流量的域数组。支持通配符(例如 `*.example.com`)。 | `["github.com", "*.npmjs.org"]` |

430| `network.deniedDomains` | 阻止出站网络流量的域数组。支持与 `allowedDomains` 相同的通配符语法。当两者都匹配时优先于 `allowedDomains`。无论 `allowManagedDomainsOnly` 如何,都从所有设置源合并。 | `["sensitive.cloud.example.com"]` |

431| `network.allowManagedDomainsOnly` | (仅 Managed 设置)仅尊重来自 managed 设置的 `allowedDomains` 和 `WebFetch(domain:...)` 允许规则。来自用户、项目和本地设置的域被忽略。非允许的域自动被阻止,不提示用户。拒绝的域仍从所有源受尊重。默认:false | `true` |

432| `network.httpProxyPort` | 如果您想自带代理,使用的 HTTP 代理端口。如果未指定,Claude 将运行自己的代理。 | `8080` |

433| `network.socksProxyPort` | 如果您想自带代理,使用的 SOCKS5 代理端口。如果未指定,Claude 将运行自己的代理。 | `8081` |

434| `network.tlsTerminate` | 实验性。在 sandbox 代理内终止 TLS,以便它可以读取 HTTPS 请求的内容。[凭证替换](/docs/zh-CN/sandboxing#protect-credentials)的 `mask` 需要。设置 `{}` 以为会话生成临时证书颁发机构,或设置 `caCertPath` 和 `caKeyPath` 以使用您自己的。仅从用户、managed 或 CLI `--settings` 设置受尊重,不从 `.claude/settings.json` 或 `.claude/settings.local.json`。需要 Claude Code v2.1.199 或更高版本。} | `{}` |

435| `enableWeakerNestedSandbox` | 为无特权 Docker 环境启用较弱的 sandbox(仅 Linux 和 WSL2)。**降低安全性。** 默认:false | `true` |

436| `enableWeakerNetworkIsolation` | (仅 macOS)允许在 sandbox 中访问系统 TLS 信任服务(`com.apple.trustd.agent`)。对于 Go 基础工具(如 `gh`、`gcloud` 和 `terraform`)在使用 `httpProxyPort` 与 MITM 代理和自定义 CA 时验证 TLS 证书是必需的。**通过打开潜在的数据泄露路径降低安全性**。默认:false | `true` |

437| `allowAppleEvents` | (仅 macOS)允许 sandboxed 命令发送 Apple Events。对于 `open`、`osascript` 和在浏览器中打开 URL 的工具是必需的,否则会失败并显示错误 `-600`。**删除代码执行隔离。** Sandboxed 命令可以无用户提示地启动其他应用程序无 sandbox;它们也可以向运行的应用程序(如 Terminal)发送 AppleScript 命令,受每个应用程序 macOS 自动化同意提示(TCC)的约束。仅从用户、managed 或 CLI 设置受尊重,不从项目设置。默认:false | `true` |

438| `bwrapPath` | (仅 Managed 设置,Linux/WSL2)bubblewrap (`bwrap`) 二进制文件的绝对路径。覆盖通过 `PATH` 的自动检测。仅从 [managed 设置](/docs/zh-CN/settings#settings-precedence)受尊重,不从用户或项目设置。在 managed 环境中 `bwrap` 安装在非标准位置时很有用。 | `/opt/admin/bwrap` |

439| `socatPath` | (仅 Managed 设置,Linux/WSL2)用于 sandbox 网络代理的 `socat` 二进制文件的绝对路径。覆盖通过 `PATH` 的自动检测。仅从 managed 设置受尊重。 | `/opt/admin/socat` |

440 

441<h4 id="sandbox-path-prefixes">

442 Sandbox 路径前缀

443</h4>

444 517 

445`filesystem.allowWrite`、`filesystem.denyWrite`、`filesystem.denyRead`、`filesystem.allowRead` 和 `credentials.files` 中的路径支持这些前缀:518* [服务器托管设置](/docs/zh-CN/server-managed-settings),Claude Code 从 claude.ai 管理控制台或自托管的[Claude 应用网关](/docs/zh-CN/claude-apps-gateway)获取

519* MDM 或操作系统级别的策略,以及系统目录中的 `managed-settings.json` 文件

520* 嵌入主机(如 Claude Desktop),通过 SDK `managedSettings` 选项;请参阅[从嵌入主机控制策略](/docs/zh-CN/managed-settings#parent-settings-from-embedding-hosts)

446 521 

447| 前缀 | 含义 | 示例 |522在在 Claude Desktop 应用中在你的机器上运行的 [Cowork](https://claude.com/docs/cowork/overview) 会话中,Claude Code 不从 claude.ai 管理控制台获取服务器托管设置,它读取部署到你的设备的策略,除非你的组织的 Claude Desktop 配置设置 `requireCoworkFullVmSandbox`。[策略应用的位置和时间](/docs/zh-CN/managed-settings#where-and-when-a-policy-applies)涵盖 Cowork 和云会话。

448| :-------- | :---------------------------------- | :---------------------------------------------------------------- |

449| `/` | 从文件系统根目录的绝对路径 | `/tmp/build` 保持 `/tmp/build` |

450| `~/` | 相对于主目录 | `~/.kube` 变为 `$HOME/.kube` |

451| `./` 或无前缀 | 相对于项目设置的项目根目录,或相对于用户设置的 `~/.claude` | `./output` 在 `.claude/settings.json` 中解析为 `<project-root>/output` |

452 523 

453较旧的 `//path` 前缀用于绝对路径仍然有效。如果您之前使用单斜杠 `/path` 期望项目相对解析,请切换到 `./path`。此语法与[读取和编辑权限规则](/docs/zh-CN/permissions#read-and-edit)不同,后者使用 `//path` 用于绝对和 `/path` 用于项目相对。Sandbox 文件系统路径使用标准约定:`/tmp/build` 是绝对路径。524如果你是管理员,[为你的组织设置 Claude Code](/docs/zh-CN/admin-setup) 会指导你选择要强制执行的内容,[部署托管设置](/docs/zh-CN/managed-settings)涵盖交付以及如何确认策略生效。

454 525 

455**配置示例:**526<h2 id="change-a-setting">

527 更改设置

528</h2>

456 529 

457```json theme={null}530您可以从 `/config` 菜单、通过编辑设置文件或对一个会话从命令行更改设置。

458{

459 "sandbox": {

460 "enabled": true,

461 "autoAllowBashIfSandboxed": true,

462 "excludedCommands": ["docker *"],

463 "filesystem": {

464 "allowWrite": ["/tmp/build", "~/.kube"],

465 "denyRead": ["~/.aws/credentials"]

466 },

467 "network": {

468 "allowedDomains": ["github.com", "*.npmjs.org", "registry.yarnpkg.com"],

469 "deniedDomains": ["uploads.github.com"],

470 "allowUnixSockets": [

471 "/var/run/docker.sock"

472 ],

473 "allowLocalBinding": true

474 }

475 }

476}

477```

478 531 

479**文件系统和网络限制**可以通过两种合并在一起的方式配置:532<span id="system-prompt" />

480 533 

481* **`sandbox.filesystem` 设置**(如上所示):在 OS 级 sandbox 边界处控制路径。这些限制适用于所有子进程命令(例如 `kubectl`、`terraform`、`npm`),而不仅仅是 Claude 的文件工具。534Claude Code 的系统提示未发布。要给 Claude 常设指令,使用 [`CLAUDE.md` 文件](/docs/zh-CN/memory)或 `--append-system-prompt` 标志。

482* **权限规则**:使用 `Edit` 允许/拒绝规则控制 Claude 的文件工具访问,`Read` 拒绝规则阻止读取,`WebFetch` 允许/拒绝规则控制网络域。这些规则中的路径也合并到 sandbox 配置中。

483 535 

484<h3 id="attribution-settings">536<h3 id="use-the-/config-menu">

485 归属设置537 使用 /config 菜单

486</h3>538</h3>

487 539 

488Claude Code 为 git 提交和拉取请求添加归属。这些分别配置:540在 Claude Code 内运行 `/config` 并打开**配置**选项卡。它列出了一小组个人选项,如主题、编辑器模式和详细输出,而不是每个设置键。选择一个选项来更改它;Claude Code 为您保存它:

489 

490* 提交默认使用 [git trailers](https://git-scm.com/docs/git-interpret-trailers)(如 `Co-Authored-By`),可以自定义或禁用

491* 拉取请求描述是纯文本

492 541 

493| 键 | 描述 |542* **大多数选项**:`~/.claude/settings.json`

494| :----------- | :------------------------------------------------------------------------------------------------------------- |543* **一些选项,如显示提示**:`.claude/settings.local.json`

495| `commit` | git 提交的归属,包括任何 trailers。空字符串隐藏提交归属 |544* **[全局配置选项](/docs/zh-CN/settings-reference#global-config-settings)**:`~/.claude.json`

496| `pr` | 拉取请求描述的归属。空字符串隐藏拉取请求归属 |

497| `sessionUrl` | 当从 web 或远程控制会话运行时,是否将 claude.ai 会话链接作为提交上的 `Claude-Session` trailer 和拉取请求描述中的链接附加。默认为 `true`。设置为 `false` 以省略链接 |

498 545 

499**默认提交归属:**546要设置一个选项而不使用菜单,传递 `key=value`,例如 `/config verbose=true`。

500 

501```text theme={null}

502Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

503```

504 

505会话的活跃模型在 trailer 中反映。

506 

507**默认拉取请求归属:**

508 

509```text theme={null}

510🤖 Generated with [Claude Code](https://claude.com/claude-code)

511```

512 

513**示例:**

514 

515```json theme={null}

516{

517 "attribution": {

518 "commit": "Generated with AI\n\nCo-Authored-By: AI <ai@example.com>",

519 "pr": ""

520 }

521}

522```

523 547 

524<Note>548<Note>

525 `attribution` 设置优先于已弃用的 `includeCoAuthoredBy` 设置。要隐藏所有归属,将 `commit` 和 `pr` 设置为空字符串,并将 `sessionUrl` 设置为 `false`。549 `/config` 是终端界面的一部分。[VS Code](/docs/zh-CN/vs-code) 聊天面板和[桌面应用](/docs/zh-CN/desktop)不打开它;通过编辑设置文件或通过这些应用自己的设置在那里更改设置。

526</Note>550</Note>

527 551 

528<h3 id="file-suggestion-settings">552<h3 id="edit-a-settings-file">

529 文件建议设置553 编辑设置文件

530</h3>

531 

532为 `@` 文件路径自动完成配置自定义命令。内置文件建议使用快速文件系统遍历,但大型 monorepos 可能受益于项目特定的索引,例如预构建的文件索引或自定义工具。

533 

534```json theme={null}

535{

536 "fileSuggestion": {

537 "type": "command",

538 "command": "~/.claude/file-suggestion.sh"

539 }

540}

541```

542 

543该命令使用与 [hooks](/docs/zh-CN/hooks) 相同的环境变量运行,包括 `CLAUDE_PROJECT_DIR`。它通过 stdin 接收包含 `query` 字段的 JSON:

544 

545```json theme={null}

546{"query": "src/comp"}

547```

548 

549将换行符分隔的文件路径输出到 stdout(当前限制为 15):

550 

551```text theme={null}

552src/components/Button.tsx

553src/components/Modal.tsx

554src/components/Form.tsx

555```

556 

557**示例:**

558 

559```bash theme={null}

560#!/bin/bash

561query=$(cat | jq -r '.query')

562# 用您自己的文件搜索命令替换 your-repo-file-index

563your-repo-file-index --query "$query" | head -20

564```

565 

566<h3 id="footer-link-badges">

567 页脚链接徽章

568</h3>554</h3>

569 555 

570`footerLinksRegexes` 设置在输入框下方的页脚中渲染额外的可点击徽章。使用它将项目 CLI 打印的 ID(如审查工具和问题跟踪器)转换为会话链接。556在您的编辑器中打开您想要的作用域的设置文件并添加或更改键。设置文件是严格的 JSON:`//` 注释或尾部逗号是语法错误,Claude Code 在下次启动时将文件报告为[设置错误](#fix-a-broken-settings-file)。例如,要让 Claude Code 在不询问的情况下运行您的 lint 和测试命令并阻止它读取 `.env` 文件,将此添加到 `~/.claude/settings.json`:

571 

572每个条目的 `pattern` 正则表达式与轮次输出匹配:工具结果,包括文件内容和获取的页面,以及 Claude 自己的响应。`url` 和 `label` 中的 `{name}` 占位符从模式中的命名捕获组填充。

573 

574以下示例在问题键(如 `PROJ-1234`)出现在轮次输出中时渲染徽章。`(?<key>...)` 命名组捕获键,`{key}` 将其替换到 URL 和标签中:

575 557 

576```json ~/.claude/settings.json theme={null}558```json ~/.claude/settings.json theme={null}

577{559{

578 "footerLinksRegexes": [560 "$schema": "https://json.schemastore.org/claude-code-settings.json",

579 {561 "permissions": {

580 "type": "regex",562 "allow": [

581 "pattern": "\\b(?<key>PROJ-\\d+)\\b",563 "Bash(npm run lint)",

582 "url": "https://issues.example.com/browse/{key}",564 "Bash(npm run test *)"

583 "label": "{key}"565 ],

584 }566 "deny": [

567 "Read(./.env)",

568 "Read(./.env.*)"

585 ]569 ]

570 }

586}571}

587```572```

588 573 

589配置此后,当 `PROJ-1234` 出现在工具结果或 Claude 的回复中时,一个 `PROJ-1234` 徽章出现在页脚中,链接到 `https://issues.example.com/browse/PROJ-1234`。574`permissions` 下的每个条目是一个命名工具及其可能做什么的规则;[配置权限](/docs/zh-CN/permissions)解释语法。`$schema` 行指向 Claude Code 设置的[已发布 JSON 架构](https://json.schemastore.org/claude-code-settings.json),它在 VS Code、Cursor 和任何其他支持 JSON 架构的编辑器中为您提供自动完成和内联验证。架构可能滞后于最新的 CLI 版本,因此最近记录的键上的验证警告并不意味着您的配置无效。

590 

591以下约束适用于每个条目:

592 575 

593| 约束 | 行为 |576保存后,在 Claude Code 内运行 `/status` 以确认文件已加载;[确认已加载的内容](#check-what-loaded)说明 `Setting sources` 行显示什么以及如何报告损坏的文件。

594| :----- | :-------------------------------------------------------------------------------------------------------------------------------------------- |

595| URL 源 | 捕获的值是 URL 编码的,构造的 URL 必须与模板的字面源共享。捕获可以填充路径段或查询值,但无法改变链接指向的位置 |

596| URL 长度 | 超过 2048 字符的构造 URL 被丢弃 |

597| URL 方案 | 必须是 `https`、`http` 或公认的编辑器或工作区深链接方案:`vscode`、`vscode-insiders`、`cursor`、`windsurf`、`zed`、`jetbrains`、`idea`、`slack`、`linear`、`notion`、`figma` |

598| 标签 | 默认为匹配的文本,截断为 28 个显示列 |

599| 徽章计数 | 最多 5 个徽章渲染。最旧的被较新的匹配替换,`/clear` 删除它们 |

600| 设置作用域 | 仅从用户设置、`--settings` 标志和 managed 设置读取。在项目 `.claude/settings.json` 和本地 `.claude/settings.local.json` 中被忽略 |

601 577 

602当轮次完成时,Claude Code 在主线程上将每个条目的 `pattern` 正则表达式与轮次输出匹配,因此缓慢的正则表达式会阻止 UI,直到完成。嵌套量词(如 `(a+)+$`)可能对某些输入花费指数级长时间并冻结会话,因此保持每个 `pattern` 线性并避免嵌套 `+` 或 `*`。578有关完整的个人文件、团队文件和组织文件,每个都带有每个键的注释,请参阅[示例设置文件](/docs/zh-CN/settings-example)。

603 579 

604页脚徽章与[自定义状态行](/docs/zh-CN/statusline)一起渲染,当配置了一个时;两者都不替换另一个。使用状态行用于从会话数据计算自己内容的脚本驱动行,使用页脚徽章将对话中的 ID 转换为链接,无需脚本。580<span id="pass-settings-for-one-session" />

605 581 

606<h3 id="hook-configuration">582<h3 id="change-a-setting-for-one-session">

607 Hook 配置583 为一个会话更改设置

608</h3>584</h3>

609 585 

610这些设置控制允许运行哪些 hooks 以及 HTTP hooks 可以访问什么。`allowManagedHooksOnly` 设置只能在 [managed 设置](#settings-files)中配置。URL 和环境变量允许列表可以在任何设置级别设置并跨源合并。586要尝试一个值而不保存它,在启动 Claude Code 时设置它。该值适用于该会话,您的设置文件保持原样。您有三种方式做到:

611 

612**当 `allowManagedHooksOnly` 为 `true` 时的行为:**

613 587 

614* 加载 Managed hooks 和 SDK hooks588* **`--settings`**:将键作为 JSON 传递,内联或作为文件路径。Claude Code 在您的用户、项目和本地文件上方以及托管设置下方应用它。它可以设置您的用户设置文件可以设置的任何键;它不能设置 `Managed` 或 `Global config` 键。

615* 从在 managed 设置 `enabledPlugins` 中强制启用的插件加载 Hooks。这让管理员通过组织市场分发经过审查的 hooks,同时阻止其他所有内容。信任由完整的 `plugin@marketplace` ID 授予,因此来自不同市场的同名插件保持被阻止589* **该键的标志**:某些键有自己的标志,如 `--model` 用于 `model` 和 `--effort` 用于 `effortLevel` 和 `modelSettings`。

616* 用户 hooks、项目 hooks 和所有其他插件 hooks 被阻止590* **环境变量**:在运行 `claude` 之前导出键的配对变量,如 `ANTHROPIC_MODEL` 用于 `model`。

617 591 

618**限制 HTTP hook URL:**592每个键在[设置参考](/docs/zh-CN/settings-reference)上的条目列出其每个会话覆盖以及哪个优先,因此检查您想更改的键的条目。

619 593 

620限制 HTTP hooks 可以针对的 URL。支持 `*` 作为匹配的通配符。定义数组后,针对不匹配 URL 的 HTTP hooks 被静默阻止。主机名匹配不区分大小写,忽略尾部 FQDN 点,匹配 DNS 语义。594您在会话内运行的命令大多保存您的选择:当您在 `/config` 中更改设置时,Claude Code 将其写入您的设置文件,`/model` 将值保存为您新会话的默认值。

621 

622```json theme={null}

623{

624 "allowedHttpHookUrls": ["https://hooks.example.com/*", "http://localhost:*"]

625}

626```

627 595 

628**限制 HTTP hook 环境变量:**596如果您在 `/model` 选择器中按 `s`,Claude Code 切换模型而不将其保存为您的用户默认值。[调整努力级别](/docs/zh-CN/model-config#adjust-effort-level)说明哪些 `/effort` 选择 Claude Code 保存为您使用的模型的默认值,哪些仅适用于当前会话。

629 597 

630限制 HTTP hooks 可以插入到标头值中的环境变量名称。每个 hook 的有效 `allowedEnvVars` 是其自己列表与此设置的交集。598例如,要在 Opus 上启动一个会话而不更改您的默认值:

631 599 

632```json theme={null}600```bash theme={null}

633{601claude --settings '{"model": "claude-opus-4-8"}'

634 "httpHookAllowedEnvVars": ["MY_TOKEN", "HOOK_SECRET"]

635}

636```602```

637 603 

638<h3 id="compute-managed-settings-with-a-policy-helper">604<h3 id="when-edits-take-effect">

639 使用策略助手计算 managed 设置605 编辑何时生效

640</h3>606</h3>

641 607 

642`policyHelper` 设置指向一个可执行文件,在启动时动态计算 managed 设置,因此管理员可以从设备状态、身份或远程服务而不是静态文件派生策略。从 MDM 或系统 `managed-settings.json` 文件配置它。Claude Code 在 `policyHelper` 出现在任何其他作用域时忽略它,包括用户设置、项目设置、HKCU 注册表配置单元和[服务器管理的设置](/docs/zh-CN/server-managed-settings)。608Claude Code 监视您的设置文件并在它们更改时重新加载它们,因此它在运行的会话中应用大多数编辑而不需要重启,包括对 `permissions`、`hooks` 和凭证助手(如 `apiKeyHelper`)的编辑。Claude Code 也在会话中期加载您创建的设置文件,如果其文件夹在会话启动时存在。对于项目的 `.claude/` 文件夹,即使您在同一会话中创建文件夹,它也加载文件。

643 609 

644该设置接受这些键:610重新加载涵盖用户、项目、本地和托管设置,Claude Code 为每个它检测到的设置文件更改运行 [`ConfigChange` hook](/docs/zh-CN/hooks#configchange),而不是来自 MDM 或 claude.ai 控制台的托管设置。来自 MDM 或 claude.ai 控制台的托管设置按计划而不是保存时到达运行的会话;[传递表](/docs/zh-CN/managed-settings#choose-a-delivery-mechanism)给出每个来源的。

645 611 

646| 键 | 类型 | 描述 |612Claude Code 仅在会话启动时读取某些键一次,因此对其中一个的编辑不会到达运行的会话。也等待重启的管理员端键,如 `requiredMinimumVersion`,在[策略适用的位置和时间](/docs/zh-CN/managed-settings#where-and-when-a-policy-applies)下列出。您最可能在会话中期编辑的:

647| ------------------- | ------ | -------------------------------------- |

648| `path` | string | 助手可执行文件的绝对路径 |

649| `timeoutMs` | number | 在将运行视为失败之前等待助手多长时间 |

650| `refreshIntervalMs` | number | 在后台重新运行助手的频率。设置为 `0` 以禁用刷新,或至少 `60000` |

651 613 

652助手将 JSON 信封写入 stdout。将设置放在 `managedSettings` 键下而不是顶级,因为裸设置对象解析时 `managedSettings` 未定义并应用任何内容:614* [`model`](/docs/zh-CN/settings-reference#model):使用 [`/model`](/docs/zh-CN/model-config#setting-your-model) 在会话中期切换。每个模型有自己的提示缓存,因此切换后的第一个请求重新读取整个对话未缓存;请参阅[切换模型](/docs/zh-CN/prompt-caching#switching-models)

615* [`effortLevel`](/docs/zh-CN/settings-reference#effortlevel) 和 [`modelSettings`](/docs/zh-CN/settings-reference#modelsettings):使用 [`/effort`](/docs/zh-CN/model-config#adjust-effort-level) 在会话中期更改努力

653 616 

654```json theme={null}617<span id="verify-active-settings" />

655{

656 "managedSettings": {

657 "permissions": { "deny": ["Read(//etc/secrets/**)"] }

658 },

659 "claudeMd": "# Organization context\n...",

660 "appendSystemPrompt": "Always cite the internal style guide."

661}

662```

663 618 

664当助手发出 `managedSettings` 时,该对象替换该运行的基于文件的 managed 设置。当助手在启动时以非零状态退出时,Claude Code 打印错误并拒绝启动,因此需要中断恢复的助手应从其自己的缓存提供并以 `0` 退出。619<span id="check-what-loaded" />

665 620 

666<h3 id="settings-precedence">621<h3 id="confirm-what-loaded">

667 设置优先级622 确认已加载的内容

668</h3>623</h3>

669 624 

670设置按优先级顺序应用。从最高到最低:625在 Claude Code 内运行 `/status` 以查看哪些设置来源处于活跃状态。**状态**选项卡包含一个 `Setting sources` 行,列出 Claude Code 为当前会话加载的每个设置文件,如 `User settings` 或 `Project local settings`。当[托管设置](/docs/zh-CN/admin-setup#decide-how-settings-reach-devices)生效时,托管设置条目在括号中显示它们如何到达您的机器。

671 

6721. **Managed 设置**([服务器管理](/docs/zh-CN/server-managed-settings)、[MDM/OS 级别策略](#configuration-scopes) 或 [managed 设置](#settings-files))

673 * 由 IT 通过服务器交付、MDM 配置文件、注册表策略或 managed 设置文件部署的策略

674 * 无法被任何其他级别覆盖,包括命令行参数

675 * 在 managed 层内,仅使用一个源,其他源被忽略而不是合并。优先级,从最高到最低:

676 * [`policyHelper`](#compute-managed-settings-with-a-policy-helper) 输出:当配置时,这是唯一使用的 managed 源

677 * 远程(claude.ai [服务器管理](/docs/zh-CN/server-managed-settings) 或 [Claude apps gateway](/docs/zh-CN/claude-apps-gateway) 交付)

678 * MDM/OS 级别策略

679 * 基于文件(`managed-settings.d/*.json` 和 `managed-settings.json`,合并在一起)

680 * HKCU 注册表(仅 Windows)

681 * 少数几个键是例外,当任何管理员控制的 managed 源设置它们时被尊重,而不仅仅是获胜的源。用户可写的 HKCU 注册表源被排除。例外键是:

682 * sandbox 锁定键 `sandbox.network.allowManagedDomainsOnly` 和 `sandbox.filesystem.allowManagedReadPathsOnly`,带有其关联的允许列表

683 * `allowAllClaudeAiMcps`

684 * sandbox 二进制路径 `sandbox.bwrapPath` 和 `sandbox.socatPath`

685 * [`forceRemoteSettingsRefresh`](/docs/zh-CN/server-managed-settings)

686 * 嵌入主机(如 Claude Desktop)可以通过 SDK `managedSettings` 选项提供策略。默认情况下,当存在任何管理员部署的 managed 源时,这被忽略:服务器管理的设置、MDM 或 OS 级别策略或 managed 设置文件。用户可写的 HKCU 注册表回退不计为管理员部署的源。管理员可以通过将 [`parentSettingsBehavior`](#available-settings) 设置为 `"merge"` 来选择加入。嵌入器的值被筛选,以便它们可以收紧 managed 策略但不能放松它。

687 626 

6882. **命令行参数**627该行确认 Claude Code 读取了哪些文件;它不显示哪个文件提供了每个键。要列出 Claude Code 拒绝的条目,运行 [`claude doctor`](/docs/zh-CN/debug-your-config);对于项目或托管设置设置的模型,启动标头命名设置它的文件。`/status` 和 `/config` 在不同选项卡上打开相同的对话框,**配置**选项卡不是您的 `settings.json` 内容的视图。

689 * 特定会话的临时覆盖。通过 `--settings <file-or-json>` 传递的 JSON 使用与其他层相同的规则与基于文件的设置合并:此处设置的键覆盖本地、项目或用户设置中的相同键,省略键会保留较低层的值

690 628 

6913. **本地项目设置**(`.claude/settings.local.json`)629<h3 id="fix-a-broken-settings-file">

692 * 个人项目特定设置630 修复损坏的设置文件

631</h3>

693 632 

6944. **共享项目设置**(`.claude/settings.json`)633如果您拼错 JSON 或将键设置为 Claude Code 不接受的值,Claude Code 在交互式会话启动时告诉您。它显示的内容取决于文件受影响的程度:

695 * 源代码管理中的团队共享项目设置

696 634 

6975. **用户设置**(`~/.claude/settings.json`)635* **设置错误**:用户、项目或本地文件有无效的 JSON 或架构拒绝的值。在交互式会话启动时,Claude Code 显示一个对话框,让您在 Claude 的帮助下修复文件、退出或继续使用损坏的设置。

698 * 个人全局设置636* **设置警告**:仅单个条目失败,如格式错误的权限规则或未知的 hook 事件名称。Claude Code 跳过这些值并保持文件的其余部分生效。

637* **托管设置**:Claude Code 继续强制执行文件的其余部分。[托管设置中的无效条目](/docs/zh-CN/managed-settings#invalid-entries-in-managed-settings)说明它删除什么以及哪些键回退到更严格的值,直到您修复它们。对于不是有效 JSON 的托管设置文档,请参阅[托管设置文档无法解析](/docs/zh-CN/errors#managed-settings-document-could-not-be-parsed)。

638* **配置错误**:`~/.claude.json` 无法解析。Claude Code 将损坏的文件复制到 `~/.claude/backups/.claude.json.corrupted.<timestamp>` 并询问是否退出并手动修复它或重置为默认配置;`-p` 运行打印错误并退出。要恢复您之前的状态,复制回 `~/.claude/backups/` 中最近五个 `.claude.json.backup.<timestamp>` 文件之一,Claude Code 在写入文件前保存。

699 639 

700此层次结构确保组织策略始终被强制执行,同时仍允许团队和个人自定义其体验。无论您从 CLI、[VS Code 扩展](/docs/zh-CN/vs-code) 还是 [JetBrains IDE](/docs/zh-CN/jetbrains) 运行 Claude Code,相同的优先级都适用。640在您继续后,运行 `/status` 以查看受影响的文件,`claude doctor` 以查看每个错误的详情。

701 641 

702例如,如果您的用户设置将 `permissions.defaultMode` 设置为 `acceptEdits`,而项目的共享设置将其设置为 `default`,则项目值适用。下面的示例涵盖了数组值设置(如权限规则)如何组合的方式。642`-p` 运行显示无对话框。除非[托管设置文档无法解析](/docs/zh-CN/errors#managed-settings-document-could-not-be-parsed),Claude Code 跳过损坏的文件或值并继续其余的,因此在忽略设置的 `-p` 运行后,运行 `claude doctor` 以查看它删除了什么。

703 643 

704<Note>644<span id="how-scopes-interact" />

705 **数组设置跨作用域合并。** 当相同的数组值设置(例如 `sandbox.filesystem.allowWrite` 或 `permissions.allow`)出现在多个作用域中时,数组被**连接和去重**,而不是替换。这意味着较低优先级的作用域可以添加条目而不覆盖由较高优先级作用域设置的条目,反之亦然。例如,如果 managed 设置将 `allowWrite` 设置为 `["/opt/company-tools"]`,用户添加 `["~/.kube"]`,则最终配置中包含两个路径。

706 645 

707 两个数组设置不以这种方式合并:646<span id="key-points-about-the-configuration-system" />

708 647 

709 * [`fallbackModel`](#available-settings) 是一个有序链,其中位置具有意义:定义它的最高优先级文件提供整个值。648<span id="which-value-claude-code-uses" />

710 * [`availableModels`](#available-settings):当[最高优先级 managed 源](/docs/zh-CN/server-managed-settings#settings-precedence)定义它时,该列表按原样应用,用户、项目和本地条目无法扩展它。跨非 managed 作用域,数组照常合并。请参阅[合并行为](/docs/zh-CN/model-config#merge-behavior)。

711</Note>

712 649 

713<h3 id="verify-active-settings">650<span id="which-value-wins" />

714 验证活跃设置

715</h3>

716 651 

717在 Claude Code 中运行 `/status` 以查看哪些设置源处于活跃状态。在菜单中,**状态**选项卡包含一个 `Setting sources` 行,列出 Claude Code 为当前会话加载的每个层,例如 `User settings` 或 `Project local settings`。当[managed 设置](/docs/zh-CN/admin-setup#decide-how-settings-reach-devices)生效时,该条目在括号中显示交付渠道,例如 `Enterprise managed settings (remote)`、`(plist)`、`(HKLM)`、`(HKCU)` 或 `(file)`。仅当该源被加载且至少有一个键时,层才出现在列表中,因此空列表意味着未找到设置源。652<h2 id="settings-precedence">

653 设置优先级

654</h2>

718 655 

719`Setting sources` 行确认正在读取哪些源。它不显示哪一层提供了每个单独的键。同一对话框中的**配置**选项卡是一个编辑器,用于一组固定的切换,例如主题和详细输出,而不是您的 `settings.json` 内容的视图。656当同一键出现在多个位置时,Claude Code 使用设置它的最高级别的值。下面的堆栈显示级别,最高在顶部;更高级别的键覆盖它在下面任何地方的相同键。

720 657 

721如果设置文件包含错误,例如无效的 JSON 或验证失败的值,`/status` 列出受影响的文件。运行 `/doctor` 以查看每个错误的详情。658<SettingsPrecedence />

722 659 

723<h3 id="key-points-about-the-configuration-system">660按顺序,最高优先级优先:

724 配置系统的关键点

725</h3>

726 661 

727* **内存文件(`CLAUDE.md`)**:包含 Claude 在启动时加载的说明和上下文6621. **托管设置**:您的组织部署的设置,通过 `managed-settings.json` 文件、MDM 策略或来自 claude.ai 控制台的[服务器管理设置](/docs/zh-CN/server-managed-settings)。您设置的任何内容都不会覆盖它们:您使用 `--settings` 传递的键不会覆盖相同的托管键,`--model` 等标志仅从您的组织允许的模型中选择。托管 `model` 设置每个会话启动的模型,您仍然可以使用 `/model` 切换;锁定是 [`availableModels`](/docs/zh-CN/settings-reference#availablemodels),它限制 `/model`、`--model` 和您自己文件中的 `model` 键。当您的组织传递多个托管来源时,[托管层内的优先级](/docs/zh-CN/managed-settings#precedence-within-the-managed-tier)的规则说 Claude Code 从每个读取什么。

728* **设置文件(JSON)**:配置权限、环境变量和工具行为6632. **命令行参数**:您在从终端启动 `claude` 时传递的标志,用于一个会话;请参阅[为一个会话更改设置](#change-a-setting-for-one-session)。Claude Code 使用与其他级别相同的规则将您使用 `--settings <file-or-json>` 传递的 JSON 与您的设置文件合并:它在此处设置的键优先于本地、项目或用户设置中的相同键,省略的键保持较低级别的值。

729* **Skills**:可以使用 `/skill-name` 调用或由 Claude 自动加载的自定义提示6643. **项目本地设置** (`.claude/settings.local.json`):您对此项目的个人设置。

730* **MCP servers**:使用额外的工具和集成扩展 Claude Code6654. **共享项目设置** (`.claude/settings.json`):您的团队检入源代码管理的设置。

731* **优先级**:更高级别的配置(Managed)覆盖较低级别的配置(User/Project)6665. **用户设置** (`~/.claude/settings.json`):您对每个项目的个人设置。

732* **继承**:设置被合并跨作用域;来自较高优先级作用域的标量值覆盖,数组连接,有两个例外,如[数组合并注释](#settings-precedence)中所述

733 667 

734<h3 id="system-prompt">668环境变量不是此堆栈中的级别。当行为同时有 shell 变量和设置键时,哪个适用是按对决定的,而不是按级别:在您的 shell 中导出的 `ANTHROPIC_MODEL` 适用于任何文件中的 `model` 键,而 `ANTHROPIC_DEFAULT_MODEL` 仅当没有文件设置 `model` 时适用。[环境变量参考](/docs/zh-CN/env-vars#precedence)说哪些键有对以及 Claude Code 首先读取哪个。设置文件内的 `env` 块是普通键并遵循上面的级别。

735 系统提示

736</h3>

737 669 

738Claude Code 的内部系统提示未发布。要添加自定义说明,请使用 `CLAUDE.md` 文件或 `--append-system-prompt` 标志。670对于少数安全敏感的键,Claude Code 尊重来自较低级别的更严格值而不是托管值;[托管设置优先级的例外](#exceptions-to-managed-settings-precedence)列出它们。

739 671 

740<h3 id="exclude-sensitive-files">672<h3 id="lists-merge-instead-of-overriding">

741 排除敏感文件673 列表合并而不是覆盖

742</h3>674</h3>

743 675 

744要防止 Claude Code 访问包含敏感信息(如 API 密钥、secrets 和环境文件)的文件,请在您的 `.claude/settings.json` 文件中使用 `permissions.deny` 设置:676当您在多个文件中设置相同的列表键(如 `permissions.allow`)时,Claude Code 组合列表而不是选择一个,因此每个文件可以添加条目而不删除另一个文件的。四个保存模型列表或每个模型条目的键遵循自己的规则:

745 

746```json theme={null}

747{

748 "permissions": {

749 "deny": [

750 "Read(./.env)",

751 "Read(./.env.*)",

752 "Read(./secrets/**)",

753 "Read(./config/credentials.json)",

754 "Read(./build)"

755 ]

756 }

757}

758```

759 

760这替代了已弃用的 `ignorePatterns` 配置。匹配这些模式的文件被排除在文件发现和搜索结果之外,这些文件上的读取操作被拒绝。

761 

762<h2 id="subagent-configuration">

763 Subagent 配置

764</h2>

765 677 

766Claude Code 支持可在用户和项目级别配置的自定义 AI subagents。这些 subagents 存储为带有 YAML frontmatter 的 Markdown 文件:678* [`fallbackModel`](/docs/zh-CN/settings-reference#fallbackmodel) 是一个有序链,其中位置具有意义,因此 Claude Code 从定义它的最高优先级文件获取整个值。

679* [`modelPicker`](/docs/zh-CN/settings-reference#modelpicker) 保存一个有序的行列表加上替换标志,因此 Claude Code 永远不会合并来自两个来源的行。它从托管设置、`--settings` 和用户设置中定义它的最高获取整个值,并忽略项目和本地设置中的键。需要 Claude Code v2.1.242 或更高版本。

680* [`availableModels`](/docs/zh-CN/settings-reference#availablemodels):当 Claude Code 应用的托管设置定义它时,Claude Code 按原样应用该列表并忽略您在用户、项目或本地设置中添加的条目,除非嵌入 Claude Code 的应用提供自己的模型列表;请参阅[托管设置优先级的例外](#exceptions-to-managed-settings-precedence)。跨托管来源列表也永远不会合并;[Claude Code 如何组合托管来源](/docs/zh-CN/managed-settings#how-claude-code-combines-managed-sources)说哪个来源的列表适用。跨非托管作用域 Claude Code 照常合并数组。

681* [`modelSettings`](/docs/zh-CN/settings-reference#modelsettings):Claude Code 一次解决它一个模型,与 [`effortLevel`](/docs/zh-CN/settings-reference#effortlevel) 一起。`modelSettings` 条目说明哪个文件的值适用于模型。

767 682 

768* **用户 subagents**:`~/.claude/agents/`,在所有项目中可用683<span id="examples" />

769* **项目 subagents**:`.claude/agents/`,特定于您的项目,可与您的团队共享

770 684 

771Subagent 文件定义具有自定义提示和工具权限的专门 AI 助手。在 [subagents 文档](/docs/zh-CN/sub-agents)中了解有关创建和使用 subagents 的更多信息。685<h3 id="precedence-examples">

772 686 优先级示例

773<h2 id="plugin-configuration">

774 插件配置

775</h2>

776 

777Claude Code 支持一个插件系统,让您可以使用 skills、agents、hooks 和 MCP servers 扩展功能。插件通过市场分发,可以在用户和存储库级别配置。

778 

779<h3 id="plugin-settings">

780 插件设置

781</h3>687</h3>

782 688 

783`settings.json` 中的插件相关设置:689当 Claude 工作时,Claude Code 在微调器下显示一行提示,如"使用 /config 更改您的默认权限模式(包括 Plan Mode)"。假设您想关闭这些提示,因此您在 `~/.claude/settings.json` 中将 [`spinnerTipsEnabled`](/docs/zh-CN/settings-reference#spinnertipsenabled) 设置为 `false`。下面的每个场景是可以打开它们的东西,以及您可以做什么。

784 

785```json theme={null}

786{

787 "enabledPlugins": {

788 "formatter@acme-tools": true,

789 "deployer@acme-tools": true,

790 "analyzer@security-plugins": false

791 },

792 "extraKnownMarketplaces": {

793 "acme-tools": {

794 "source": {

795 "source": "github",

796 "repo": "acme-corp/claude-plugins"

797 }

798 }

799 }

800}

801```

802 690 

803<h4 id="enabledplugins">691<h4 id="team-settings-override-personal-settings">

804 `enabledPlugins`692 团队设置覆盖个人设置

805</h4>693</h4>

806 694 

807控制启用哪些插件。格式:`"plugin-name@marketplace-name": true/false`。没有在任何作用域中有条目的插件会回退到其 [`defaultEnabled`](/docs/zh-CN/plugins-reference#default-enablement) 值。695您的团队的 `.claude/settings.json` 将其设置为 `true`。Claude Code 使用项目值,因为共享项目位于用户上方,因此您在该项目中看到提示,其他地方都没有。

808 696 

809**作用域**:697您可以恢复您的值:在该项目中的 `.claude/settings.local.json` 中添加 `"spinnerTipsEnabled": false`。项目本地位于共享项目上方,因此您的会话停止显示提示,您队友的会话不改变。

810 

811* **用户设置**(`~/.claude/settings.json`):个人插件偏好

812* **项目设置**(`.claude/settings.json`):与团队共享的项目特定插件

813* **本地设置**(`.claude/settings.local.json`):每台机器的覆盖,Claude Code 创建时被 gitignored

814* **Managed 设置**(`managed-settings.json`):组织范围的策略覆盖,在所有作用域中阻止安装并从市场隐藏插件

815 

816<Note>

817 项目设置优先于用户设置,因此在 `~/.claude/settings.json` 中将插件设置为 `false` 不会禁用项目的 `.claude/settings.json` 启用的插件。要在您的机器上选择退出项目启用的插件,请改为在 `.claude/settings.local.json` 中将其设置为 `false`。

818 

819 由 managed 设置强制启用的插件无法以这种方式禁用,因为 managed 设置会覆盖本地设置。

820 

821 从外部源(如 GitHub 存储库或 npm 包)在项目的 `.claude/settings.json` 中启用插件不会为其他人安装它。从 Claude Code v2.1.195 开始,加载插件的每条路径都会要求每个用户在运行前[安装并信任插件](/docs/zh-CN/discover-plugins#configure-team-marketplaces)。

822</Note>

823 

824**示例**:

825 

826```json theme={null}

827{

828 "enabledPlugins": {

829 "code-formatter@team-tools": true,

830 "deployment-tools@team-tools": true,

831 "experimental-features@personal": false

832 }

833}

834```

835 698 

836<h4 id="pluginconfigs">699<h4 id="organization-settings-override-everything">

837 `pluginConfigs`700 组织设置覆盖一切

838</h4>701</h4>

839 702 

840存储插件的 [`userConfig`](/docs/zh-CN/plugins-reference#user-configuration) 提示收集的非敏感选项值,按插件 ID 键入。当您填写插件的配置对话框时,Claude Code 会将此键写入用户设置,因此您无需手动编辑它。敏感选项存储在 macOS Keychain 中,或在没有支持的 keychain 的平台上存储在 `~/.claude/.credentials.json` 中。703您的组织的托管设置将其设置为 `true`。您在用户、项目或本地设置中放入的任何内容都不会关闭提示,`--settings` 也不会。托管是最高级别。

841 

842此示例为从 `acme-tools` 市场安装的插件存储一个选项:

843 

844```json theme={null}

845{

846 "pluginConfigs": {

847 "deployer@acme-tools": {

848 "options": {

849 "api_endpoint": "https://api.example.com"

850 }

851 }

852 }

853}

854```

855 704 

856`pluginConfigs` 仅从用户设置、`--settings` 标志和 managed 设置中读取。项目的 `.claude/settings.json` 或 `.claude/settings.local.json` 中的条目被忽略,因为这些值被替换到插件 hook、MCP 和 LSP 配置中,克隆的存储库不得能够提供它们。在 v2.1.207 之前,项目和本地设置也被读取。705您无法恢复您的值。运行 `/status` 以查看哪个托管来源适用,并询问您的管理员策略是否应改变。

857 706 

858<h4 id="extraknownmarketplaces">707<h4 id="the-command-line-overrides-your-files-for-one-session">

859 `extraKnownMarketplaces`708 命令行为一个会话覆盖您的文件

860</h4>709</h4>

861 710 

862定义应为存储库提供的额外市场。通常在存储库级别设置中使用,以确保团队成员有权访问所需的插件源。711您使用 `claude --settings '{"spinnerTipsEnabled": true}'` 启动了会话。命令行位于除托管外的每个文件上方,因此该会话显示提示,即使您的文件说 `false`。

863 

864**当存储库包含 `extraKnownMarketplaces` 时**:

865 

8661. 当他们信任文件夹时,团队成员被提示安装市场

8672. 然后团队成员被提示从该市场安装插件

8683. 用户可以跳过不需要的市场或插件(存储在用户设置中)

8694. 安装尊重信任边界并需要明确同意

870 

871**示例**:

872 

873```json theme={null}

874{

875 "extraKnownMarketplaces": {

876 "acme-tools": {

877 "source": {

878 "source": "github",

879 "repo": "acme-corp/claude-plugins"

880 }

881 },

882 "security-plugins": {

883 "source": {

884 "source": "git",

885 "url": "https://git.example.com/security/plugins.git"

886 }

887 }

888 }

889}

890```

891 

892**市场源类型**:

893 

894* `github`:GitHub 存储库(使用 `repo`)

895* `git`:任何 git URL(使用 `url`)

896* `directory`:本地文件系统路径(使用 `path`,仅用于开发)

897* `hostPattern`:正则表达式模式以匹配市场主机(使用 `hostPattern`)

898* `settings`:直接在 settings.json 中声明的内联市场,无需单独的托管存储库(使用 `name` 和 `plugins`)

899 

900`git` 源类型适用于任何 git 托管服务,包括自托管的 GitLab 和 Bitbucket。Claude Code 使用与该机器上 `git clone` 相同的身份验证克隆存储库:配置的凭证助手或 SSH 密钥。提供者令牌(如 `GITHUB_TOKEN`)仅通过读取它的凭证助手生效。有关设置详情,请参阅[私有存储库](/docs/zh-CN/plugin-marketplaces#private-repositories)。

901 712 

902对于 `github` 和 `git` 源,在 `source` 对象内设置 `"skipLfs": true`(与 `repo` 或 `url` 一起)以在 Claude Code 克隆或更新市场存储库时跳过 Git LFS 下载。LFS 指针文件保持为指针而不是下载其内容。当存储库包含与插件内容无关的大型 LFS 对象时,使用此选项。需要 Claude Code v2.1.153 或更高版本。713您在下一个会话上恢复您的值;`--settings` 持续一个会话并不写入任何文件。

903 

904每个市场条目还接受可选的 `autoUpdate` 布尔值。在 `source` 旁边设置 `"autoUpdate": true` 以使 Claude Code 在启动时刷新该市场并更新其已安装的插件。省略时,官方 Anthropic 市场默认为 `true`,所有其他市场默认为 `false`。请参阅[配置自动更新](/docs/zh-CN/discover-plugins#configure-auto-updates)。

905 

906使用 `source: 'settings'` 声明一小组插件内联,无需设置托管市场存储库。此处列出的插件必须引用外部源,例如 GitHub 或 npm。您仍需要在 `enabledPlugins` 中单独启用每个插件。

907 

908```json theme={null}

909{

910 "extraKnownMarketplaces": {

911 "team-tools": {

912 "source": {

913 "source": "settings",

914 "name": "team-tools",

915 "plugins": [

916 {

917 "name": "code-formatter",

918 "source": {

919 "source": "github",

920 "repo": "acme-corp/code-formatter"

921 }

922 }

923 ]

924 }

925 }

926 }

927}

928```

929 714 

930<h4 id="strictknownmarketplaces">715<h4 id="a-flag-or-environment-variable-sets-the-same-thing">

931 `strictKnownMarketplaces`716 标志或环境变量设置相同的东西

932</h4>717</h4>

933 718 

934**仅 Managed 设置**:控制用户允许添加和安装插件的插件市场。此设置只能在 [managed 设置](/docs/zh-CN/settings#settings-files) 中配置,为管理员提供对市场源的严格控制。719某些键有命令行标志或环境变量,无论哪个文件设置它都覆盖设置值:`ANTHROPIC_MODEL` 覆盖 [`model`](/docs/zh-CN/settings-reference#model) 设置,`--model` 为一个会话覆盖两者。

935 

936**Managed 设置文件位置**:

937 

938* **macOS**:`/Library/Application Support/ClaudeCode/managed-settings.json`

939* **Linux 和 WSL**:`/etc/claude-code/managed-settings.json`

940* **Windows**:`C:\Program Files\ClaudeCode\managed-settings.json`

941 

942**关键特征**:

943 

944* 仅在 managed 设置(`managed-settings.json`)中可用

945* 无法被用户或项目设置覆盖(最高优先级)

946* 在网络/文件系统操作之前强制执行(被阻止的源永远不会执行)

947* 对源规范使用精确匹配(包括 `ref`、`path` 用于 git 源),除了 `hostPattern` 和 `pathPattern`,它们使用正则表达式匹配

948 

949**允许列表行为**:

950 

951* `undefined`(默认):无限制 - 用户可以添加任何市场

952* 空数组 `[]`:完全锁定 - 用户无法添加任何新市场

953* 源列表:用户只能添加与之完全匹配的市场

954 

955**所有支持的源类型**:

956 

957允许列表支持多种市场源类型。大多数源使用精确匹配,而 `hostPattern` 和 `pathPattern` 分别使用正则表达式匹配市场主机和文件系统路径。

958 

9591. **GitHub 存储库**:

960 

961```json theme={null}

962{ "source": "github", "repo": "acme-corp/approved-plugins" }

963{ "source": "github", "repo": "acme-corp/security-tools", "ref": "v2.0" }

964{ "source": "github", "repo": "acme-corp/plugins", "ref": "main", "path": "marketplace" }

965```

966 

967字段:`repo`(必需)、`ref`(可选:分支或标签)、`path`(可选:子目录)

968 

9692. **Git 存储库**:

970 

971```json theme={null}

972{ "source": "git", "url": "https://gitlab.example.com/tools/plugins.git" }

973{ "source": "git", "url": "https://bitbucket.org/acme-corp/plugins.git", "ref": "production" }

974{ "source": "git", "url": "ssh://git@git.example.com/plugins.git", "ref": "v3.1", "path": "approved" }

975```

976 

977字段:`url`(必需)、`ref`(可选:分支或标签)、`path`(可选:子目录)

978 

9793. **基于 URL 的市场**:

980 

981```json theme={null}

982{ "source": "url", "url": "https://plugins.example.com/marketplace.json" }

983{ "source": "url", "url": "https://cdn.example.com/marketplace.json", "headers": { "Authorization": "Bearer ${TOKEN}" } }

984```

985 

986字段:`url`(必需)、`headers`(可选:用于身份验证访问的 HTTP 标头)

987 

988<Note>

989 基于 URL 的市场仅下载 `marketplace.json` 文件。它们不从服务器下载插件文件。基于 URL 的市场中的插件必须使用外部源(GitHub、npm 或 git URL)而不是相对路径。对于具有相对路径的插件,改用基于 Git 的市场。请参阅[故障排除](/docs/zh-CN/plugin-marketplaces#plugins-with-relative-paths-fail-in-url-based-marketplaces)了解详情。

990</Note>

991 

9924. **NPM 包**:

993 

994```json theme={null}

995{ "source": "npm", "package": "@acme-corp/claude-plugins" }

996{ "source": "npm", "package": "@acme-corp/approved-marketplace" }

997```

998 

999字段:`package`(必需,支持作用域包)

1000 

10015. **文件路径**:

1002 

1003```json theme={null}

1004{ "source": "file", "path": "/usr/local/share/claude/acme-marketplace.json" }

1005{ "source": "file", "path": "/opt/acme-corp/plugins/marketplace.json" }

1006```

1007 

1008字段:`path`(必需:marketplace.json 文件的绝对路径)

1009 

10106. **目录路径**:

1011 

1012```json theme={null}

1013{ "source": "directory", "path": "/usr/local/share/claude/acme-plugins" }

1014{ "source": "directory", "path": "/opt/acme-corp/approved-marketplaces" }

1015```

1016 

1017字段:`path`(必需:包含 `.claude-plugin/marketplace.json` 的目录的绝对路径)

1018 

10197. **主机模式匹配**:

1020 

1021```json theme={null}

1022{ "source": "hostPattern", "hostPattern": "^github\\.example\\.com$" }

1023{ "source": "hostPattern", "hostPattern": "^gitlab\\.internal\\.example\\.com$" }

1024```

1025 

1026字段:`hostPattern`(必需:与市场主机匹配的正则表达式模式)

1027 

1028当您想允许来自特定主机的所有市场而不枚举每个存储库时,使用主机模式匹配。这对于具有内部 GitHub Enterprise 或 GitLab 服务器的组织很有用,开发人员在其中创建自己的市场。

1029 

1030按源类型的主机提取:

1031 

1032* `github`:始终与 `github.com` 匹配

1033* `git`:从 URL 提取主机名(支持 HTTPS 和 SSH 格式)

1034* `url`:从 URL 提取主机名

1035* `npm`、`file`、`directory`:不支持主机模式匹配

1036 

10378. **路径模式匹配**:

1038 

1039```json theme={null}

1040{ "source": "pathPattern", "pathPattern": "^/opt/approved/" }

1041{ "source": "pathPattern", "pathPattern": ".*" }

1042```

1043 

1044字段:`pathPattern`(必需:与 `file` 和 `directory` 源的 `path` 字段匹配的正则表达式模式)

1045 

1046使用路径模式匹配来允许基于文件系统的市场与网络源的 `hostPattern` 限制一起使用。设置 `".*"` 以允许所有本地路径,或使用更窄的模式来限制特定目录。

1047 

1048**配置示例**:

1049 

1050示例:仅允许特定市场:

1051 

1052```json theme={null}

1053{

1054 "strictKnownMarketplaces": [

1055 {

1056 "source": "github",

1057 "repo": "acme-corp/approved-plugins"

1058 },

1059 {

1060 "source": "github",

1061 "repo": "acme-corp/security-tools",

1062 "ref": "v2.0"

1063 },

1064 {

1065 "source": "url",

1066 "url": "https://plugins.example.com/marketplace.json"

1067 },

1068 {

1069 "source": "npm",

1070 "package": "@acme-corp/compliance-plugins"

1071 }

1072 ]

1073}

1074```

1075 

1076示例:禁用所有市场添加:

1077 

1078```json theme={null}

1079{

1080 "strictKnownMarketplaces": []

1081}

1082```

1083 

1084示例:允许来自内部 git 服务器的所有市场:

1085 

1086```json theme={null}

1087{

1088 "strictKnownMarketplaces": [

1089 {

1090 "source": "hostPattern",

1091 "hostPattern": "^github\\.example\\.com$"

1092 }

1093 ]

1094}

1095```

1096 

1097**精确匹配要求**:

1098 

1099市场源必须精确匹配才能允许用户的添加。对于基于 git 的源(`github` 和 `git`),这包括所有可选字段:

1100 

1101* `repo` 或 `url` 必须精确匹配

1102* `ref` 字段必须精确匹配(或两者都未定义)

1103* `path` 字段必须精确匹配(或两者都未定义)

1104 720 

1105不匹配的源示例:721您是否可以恢复您的值取决于键:取消设置变量或删除标志,并检查[设置参考](/docs/zh-CN/settings-reference)上的键条目和[环境变量参考](/docs/zh-CN/env-vars)上的变量行,了解 Claude Code 使用哪个。

1106 722 

1107```json theme={null}723<span id="keys-ignored-in-a-repository-file" />

1108// 这些是不同的源:

1109{ "source": "github", "repo": "acme-corp/plugins" }

1110{ "source": "github", "repo": "acme-corp/plugins", "ref": "main" }

1111 724 

1112// 这些也是不同的:725<span id="keys-only-you-or-your-organization-can-set" />

1113{ "source": "github", "repo": "acme-corp/plugins", "path": "marketplace" }

1114{ "source": "github", "repo": "acme-corp/plugins" }

1115```

1116 

1117**与 `extraKnownMarketplaces` 的比较**:

1118 

1119| 方面 | `strictKnownMarketplaces` | `extraKnownMarketplaces` |

1120| ---------- | ------------------------- | ------------------------ |

1121| **目的** | 组织策略强制执行 | 团队便利 |

1122| **设置文件** | 仅 `managed-settings.json` | 任何设置文件 |

1123| **行为** | 阻止非允许列表的添加 | 自动安装缺失的市场 |

1124| **何时强制执行** | 在网络/文件系统操作之前 | 在用户信任提示之后 |

1125| **可以被覆盖** | 否(最高优先级) | 是(由更高优先级设置) |

1126| **源格式** | 直接源对象 | 具有嵌套源的命名市场 |

1127| **用例** | 合规、安全限制 | 入职、标准化 |

1128 726 

1129**格式差异**:727<span id="common-cases" />

1130 728 

1131`strictKnownMarketplaces` 使用直接源对象:729<span id="which-value-applies-in-common-situations" />

1132 730 

1133```json theme={null}731<h3 id="troubleshoot-a-setting-that-doesn’t-apply">

1134{732 排除不适用的设置

1135 "strictKnownMarketplaces": [733</h3>

1136 { "source": "github", "repo": "acme-corp/plugins" }

1137 ]

1138}

1139```

1140 734 

1141`extraKnownMarketplaces` 需要命名市场:735当您设置键而 Claude Code 不表现得好像您有时,从 `/status` 开始以查看它加载了哪些文件,然后在下面找到您的症状。[调试您的配置](/docs/zh-CN/debug-your-config)涵盖更广泛的检查,包括干净配置测试。

1142 736 

1143```json theme={null}737<h4 id="a-value-you-set-is-ignored">

1144{738 您设置的值被忽略

1145 "extraKnownMarketplaces": {739</h4>

1146 "acme-tools": {

1147 "source": { "source": "github", "repo": "acme-corp/plugins" }

1148 }

1149 }

1150}

1151```

1152 740 

1153**同时使用两者**:741其他东西设置相同的键,文件无法设置该值,或文件没有加载:

1154 742 

1155`strictKnownMarketplaces` 是一个策略门:它控制用户可能添加什么,但不注册任何市场。要同时限制和为所有用户预注册市场,请在 `managed-settings.json` 中设置两者:743* **更高级别设置它。** 另一个设置文件、`--settings` 标志或托管来源在您的上方设置键;[堆栈](#settings-precedence)说哪个。标志或环境变量也可以自己覆盖键,按键决定;[设置参考](/docs/zh-CN/settings-reference)上的键条目说 Claude Code 使用哪个,[`env` 条目](/docs/zh-CN/settings-reference#env)涵盖托管 `env` 值与 shell 导出。

744* **安全键保持其严格值。** 对于少数几个键 Claude Code 尊重任何文件的限制值,因此项目 `true` 用于 [`disableClaudeAiConnectors`](/docs/zh-CN/settings-reference#disableclaudeaiconnectors) 保持开启;请参阅[托管设置优先级的例外](#exceptions-to-managed-settings-precedence)。

745* **文件无法设置该值。** [`permissions.defaultMode`](/docs/zh-CN/settings-reference#permissions-defaultmode) 值 `auto` 和 `bypassPermissions` 不从项目或本地设置生效;改为在用户或托管设置中设置它们,或为一个会话传递 `--permission-mode`。在 v2.1.257 之前,`bypassPermissions` 从任何文件生效。

746* **文件损坏。** 无效的 JSON 或拒绝的值使 Claude Code 跳过文件或条目;请参阅[修复损坏的设置文件](#fix-a-broken-settings-file)。

1156 747 

1157```json theme={null}748<h4 id="a-change-you-made-in-claude-code-is-lost-in-new-sessions">

1158{749 您在 Claude Code 中所做的更改在新会话中丢失

1159 "strictKnownMarketplaces": [750</h4>

1160 { "source": "github", "repo": "acme-corp/plugins" }

1161 ],

1162 "extraKnownMarketplaces": {

1163 "acme-tools": {

1164 "source": { "source": "github", "repo": "acme-corp/plugins" }

1165 }

1166 }

1167}

1168```

1169 751 

1170仅设置 `strictKnownMarketplaces` 时,用户仍可以通过 `/plugin marketplace add` 手动添加允许的市场,但它不会自动可用。752当您从 Claude Code 内保存新会话的选择时,如使用 `/model` 的默认模型,Claude Code 将其写入您的用户设置文件 `~/.claude/settings.json`。如果您无法写入该文件,例如因为另一个工具生成它或将其链接到只读副本,更改适用于当前会话并在下一个会话中消失。在生成文件的工具中设置键,或用您可以写入的文件替换文件。

1171 753 

1172**重要说明**:754如果您可以写入文件而更改仍然不持续,检查更改是否[仅用于一个会话](#change-a-setting-for-one-session)或[更高级别设置相同的键](#a-value-you-set-is-ignored)。对于 `model` 键,[新会话在与您选择的不同的模型上启动](/docs/zh-CN/model-config#a-new-session-starts-on-a-different-model-than-you-picked)列出更多原因。

1173 755 

1174* 限制在任何网络请求或文件系统操作之前检查756<h4 id="a-managed-change-hasn’t-reached-you">

1175* 被阻止时,用户看到清晰的错误消息,指示源被 managed 策略阻止757 托管更改还没有到达您

1176* 限制在市场添加和插件安装、更新、刷新和自动更新时强制执行。在策略设置之前添加的市场一旦其源不再与允许列表匹配,就无法用于安装或更新插件758</h4>

1177* Managed 设置具有最高优先级,无法被覆盖

1178 759 

1179请参阅 [Managed 市场限制](/docs/zh-CN/plugin-marketplaces#managed-marketplace-restrictions)了解面向用户的文档。760托管来源按[传递表](/docs/zh-CN/managed-settings#choose-a-delivery-mechanism)中的计划到达运行的会话,因此首先重启会话。如果 `/status` 然后命名与您的管理员更改的不同的来源,更高优先级的来源适用;[Claude Code 如何组合托管来源](/docs/zh-CN/managed-settings#how-claude-code-combines-managed-sources)给出顺序。

1180 761 

1181<h4 id="strictpluginonlycustomization">762<h4 id="a-committed-key-doesn’t-reach-teammates">

1182 `strictPluginOnlyCustomization`763 提交的键不到达队友

1183</h4>764</h4>

1184 765 

1185**仅 Managed 设置**:阻止 skills、agents、hooks 和 MCP servers 来自用户和项目源,因此它们只能来自插件或 managed 设置。将其与 `strictKnownMarketplaces` 结合以控制完整的自定义供应链:市场允许列表控制用户可以安装哪些插件,此设置阻止所有不来自插件或 managed 设置的内容。766两件事阻止 `.claude/settings.json` 中的键为克隆它的每个人应用:

1186 

1187该值要么是 `true` 以锁定所有四个表面,要么是命名要锁定的表面的数组:

1188 767 

1189```json theme={null}768* **Claude Code 忽略存储库文件中的键。** 在[设置索引](/docs/zh-CN/settings-reference#settings-index)的作用域列中查找 `User, local, or managed`、`User or managed`、`Managed` 或 `Global config`;这些键永远不会从共享文件应用,除了 [`autoContinueAtUsageLimit`](/docs/zh-CN/settings-reference#autocontinueatusagelimit),存储库文件仍然可以关闭:当文件设置键而没有用户、`--settings` 或托管值时,Claude Code 读取设置为关闭。`Global config` 键仅从 `~/.claude.json` 应用。

1190{769* **键等待信任。** `permissions.allow` 规则、`permissions.additionalDirectories`、`extraKnownMarketplaces` 和大多数 [`env`](/docs/zh-CN/settings-reference#env) 值仅在每个队友[信任文件夹](/docs/zh-CN/permissions#project-allow-rules-and-workspace-trust)后应用。在那之前他们仍然看到提示并不从文件声明的市场获得插件。`deny` 和 `ask` 规则立即应用。

1191 "strictPluginOnlyCustomization": ["skills", "hooks"]

1192}

1193```

1194 770 

1195对于每个锁定的表面,Claude Code 跳过用户级和项目级源,仅加载插件提供的和 managed 源:771<h4 id="permission-rules-combine-differently-than-you-expected">

772 权限规则组合方式与您预期不同

773</h4>

1196 774 

1197| 表面 | 锁定时被阻止 | 仍然加载 |775* **您在权限提示上选择了"是的,不要再问"但仍然为相同的工具获得提示。** 该选择将 `allow` 规则保存到您的本地文件,本地的 `allow` 规则不优先于项目或托管文件中的 `ask` 规则;[权限规则如何组合](/docs/zh-CN/permissions#settings-precedence)解释顺序。在 VS Code 扩展中,批准卡让您选择目标文件,包括项目的共享文件,这改变了每个人的规则;在 CLI 中,Claude Code 仅写入您的本地文件。

1198| :------- | :------------------------------------ | :---------------------------------------------------------- |776* **您的组织的允许规则仍然与您的一起应用。** 这是预期的:Claude Code 跨作用域合并 [`permissions.allow`](/docs/zh-CN/settings-reference#permissions-allow),除非您的组织设置 [`allowManagedPermissionRulesOnly`](/docs/zh-CN/settings-reference#allowmanagedpermissionrulesonly)。

1199| `skills` | `~/.claude/skills/`、`.claude/skills/` | 插件 skills、捆绑 skills、managed 策略目录中的 skills |

1200| `agents` | `~/.claude/agents/`、`.claude/agents/` | 插件 agents、内置 agents、managed 策略目录中的 agents |

1201| `hooks` | 用户、项目和本地 `settings.json` 中的 hooks | 插件 hooks、managed 设置中的 hooks |

1202| `mcp` | `~/.claude.json` 和 `.mcp.json` 中的服务器 | 插件 MCP servers、[`managed-mcp.json`](/docs/zh-CN/managed-mcp) 服务器 |

1203 777 

1204Claude Code 版本不识别的表面名称被忽略而不是导致设置文件失败,因此您可以在所有客户端更新之前添加新的表面名称。778<span id="security-keys-where-the-stricter-value-applies" />

1205 779 

1206<h3 id="manage-plugins">780<h3 id="exceptions-to-managed-settings-precedence">

1207 管理插件781 托管设置优先级的例外

1208</h3>782</h3>

1209 783 

1210使用 `/plugin` 命令以交互方式管理插件:784对于少数几个值限制会话的键,Claude Code 尊重来自否则无法覆盖托管设置的作用域的限制值。在此表中找到键以查看它尊重哪个值以及从哪里。

1211 785 

1212* 浏览市场中的可用插件786| 键 | Claude Code 尊重的值 | 注释 |

1213* 安装/卸载插件787| :--------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------- |

1214* 启用/禁用插件788| [`disableClaudeAiConnectors`](/docs/zh-CN/settings-reference#disableclaudeaiconnectors) | 来自任何作用域的 `true` | 即使托管来源设置 `false` 也被尊重 |

1215* 查看插件详情(提供的 skills、agents、hooks)789| [`enableArtifact`](/docs/zh-CN/settings-reference#enableartifact) | 来自任何作用域的 `false`,以及来自任何作用域的 `disableArtifact: true` | 即使托管来源设置 `true` 也被尊重;没有什么打开[Artifact 工具](/docs/zh-CN/artifacts#disable-artifacts)。需要 Claude Code v2.1.242 或更高版本 |

1216* 添加/删除市场790| [`isolatePeerMachines`](/docs/zh-CN/settings-reference#isolatepeermachines) | 来自任何作用域的 `true` | 即使托管来源设置 `false` 也被尊重 |

791| [`remoteControlAtStartup`](/docs/zh-CN/settings-reference#remotecontrolatstartup) | 来自 `.claude/settings.json` 或 `.claude/settings.local.json` 的 `false` | 即使托管来源设置 `true` 也被尊重;项目或本地 `true` 被忽略 |

792| [`crossSessionInbound`](/docs/zh-CN/settings-reference#crosssessioninbound) | 来自 `.claude/settings.json` 或 `.claude/settings.local.json` 的更严格值,在 `accept` \< `hold` \< `refuse` 梯形上 | 在托管、`--settings` 和用户值上被尊重;不是更严格的项目或本地值被忽略 |

793| [`useAutoModeDuringPlan`](/docs/zh-CN/settings-reference#useautomodeduringplan) | 来自任何托管来源、`--settings`、`~/.claude/settings.json` 或 `.claude/settings.local.json` 的 `false` | 即使获胜的托管来源设置 `true` 也被尊重;`.claude/settings.json` 中的 `false` 被忽略 |

794| [`syncClaudeAiSkills`](/docs/zh-CN/settings-reference#syncclaudeaiskills) | 来自任何托管来源、`--settings`、`~/.claude/settings.json` 或 `.claude/settings.local.json` 的 `false` | 即使获胜的托管来源设置 `true` 也被尊重;`.claude/settings.json` 中的 `false` 被忽略 |

795| [`maxEffortLevel`](/docs/zh-CN/settings-reference#maxeffortlevel) | 来自任何作用域(包括 `--settings`)的较低上限 | 即使 Claude Code 应用的托管设置设置更高的上限也被尊重;最低的上限适用。需要 Claude Code v2.1.267 或更高版本 |

1217 796 

1218在[插件文档](/docs/zh-CN/plugins)中了解有关插件系统的更多信息。797运行 Claude Code 的应用并设置 [`CLAUDE_CODE_PROVIDER_MANAGED_BY_HOST`](/docs/zh-CN/env-vars) 也是例外。Claude Code 从该应用的模型配置优先于来自每个托管来源的 `model`、`fallbackModel`、`modelPicker` 和 `modelOverrides` 键,以及托管 `env` 块中的模型选择变量,如 `ANTHROPIC_MODEL` 和 `ANTHROPIC_DEFAULT_*_MODEL` 系列。Claude Code 保持托管 [`availableModels`](/docs/zh-CN/settings-reference#availablemodels) 允许列表生效,除非应用提供自己的。

1219 798 

1220<h2 id="environment-variables">799<h2 id="settings-in-cloud-sessions">

1221 环境变量800 云会话中的设置

1222</h2>801</h2>

1223 802 

1224环境变量让您可以控制 Claude Code 行为而无需编辑设置文件。任何变量也可以在 [`settings.json`](#available-settings) 中的 `env` 键下配置,以将其应用于每个会话或将其推出到您的团队。803云会话,在 [Claude Code on the web](/docs/zh-CN/claude-code-on-the-web) 或从 [`claude --cloud`](/docs/zh-CN/claude-code-on-the-web#from-terminal-to-web),在[云环境](/docs/zh-CN/cloud-environments)中运行在您的存储库的新克隆上,而不是在您的机器上。这改变了哪些设置到达它:

1225 

1226请参阅[环境变量参考](/docs/zh-CN/env-vars)了解完整列表。

1227 

1228<h2 id="tools-available-to-claude">

1229 Claude 可用的工具

1230</h2>

1231 804 

1232Claude Code 可以访问一组用于读取、编辑、搜索、运行命令和编排 subagents 的工具。工具名称是您在权限规则和 hook 匹配器中使用的确切字符串。805* **共享项目设置** (`.claude/settings.json`):读取,因为文件是克隆的一部分。在那里提交设置以在云会话中应用它。

806* **用户和项目本地设置** (`~/.claude/settings.json` 和 `.claude/settings.local.json`):不读取。两者都保持在您的机器上,本地文件不在克隆中。

807* **托管设置**:仅[服务器管理设置](/docs/zh-CN/server-managed-settings)到达云会话;您设备上的 `managed-settings.json` 文件或 MDM 配置文件不会。[自托管环境](/docs/zh-CN/self-hosted-environments)也读取其运行器镜像中的托管设置文件。[Claude Code 如何组合托管来源](/docs/zh-CN/managed-settings#how-claude-code-combines-managed-sources)说该文件何时适用。

808* **`/config`**:在网络上,打开您的 claude.ai 设置的 Claude Code 部分而不是更改值。要为云会话更改设置,在环境上设置[环境变量](/docs/zh-CN/cloud-environments#set-environment-variables)或将键提交到存储库的 `.claude/settings.json`。

1233 809 

1234请参阅[工具参考](/docs/zh-CN/tools-reference)了解完整列表和 Bash 工具行为详情。810[从您的设置中携带什么](/docs/zh-CN/cloud-environments#what-carries-over-from-your-setup)列出其余的:`CLAUDE.md`、skills、MCP 服务器、插件和凭证。

1235 811 

1236<h2 id="see-also">812<h2 id="what’s-next">

1237 另请参阅813 接下来是什么

1238</h2>814</h2>

1239 815 

1240* [权限](/docs/zh-CN/permissions):权限系统、规则语法、工具特定模式和 managed 策略816* [所有设置](/docs/zh-CN/settings-reference):每个键,以及您在哪里设置它和示例

1241* [身份验证](/docs/zh-CN/authentication):设置用户对 Claude Code 的访问817* [示例设置文件](/docs/zh-CN/settings-example):个人文件、团队文件和组织的托管文件

1242* [调试您的配置](/docs/zh-CN/debug-your-config):诊断为什么设置、hook 或 MCP 服务器没有生效818* [配置权限](/docs/zh-CN/permissions):允许、询问和拒绝规则,以及 Claude Code 在不询问的情况下运行什么

1243* [故障排除安装和登录](/docs/zh-CN/troubleshoot-install):安装、身份验证和平台问题819* [环境变量](/docs/zh-CN/env-vars):Claude Code 读取的变量和 `env` 块

820* [调试您的配置](/docs/zh-CN/debug-your-config):当设置不适用时

821* [Claude 目录参考](/docs/zh-CN/claude-directory):Claude Code 读取的每个文件,包括 subagents、MCP 服务器、插件和 `CLAUDE.md`

settings-example.md +396 −0 created

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> 为开发者、团队和组织提供的现实 settings.json 文件:复制一个,保留你想要的键,并更改值。

8 

9本页包含三个示例 `settings.json` 文件,每个文件对应一个保存设置的位置:

10 

11* 开发者的 `~/.claude/settings.json`

12* 团队的 `.claude/settings.json`,提交到仓库

13* 组织的 `managed-settings.json`

14 

15每个文件都是该读者的合理文件,因此你可以看到其结构并复制你想要的部分。它们都不是推荐的基线。每个值都来自 [settings reference](/docs/zh-CN/settings-reference) 上的键条目,该条目包含其类型、默认值和可以设置的位置。

16 

17每个示例有两个选项卡。**Copyable settings file** 是你保存的文件。**What each key does** 是同一个文件,每个键上方都有注释;Claude Code 不接受设置文件中的注释,因此请从第一个选项卡复制。

18 

19<h2 id="your-own-settings">

20 你自己的设置

21</h2>

22 

23一个开发者的个人设置。它选择一个模型和工作量级别,调整终端,并预先批准一个只读命令和一个文件读取。未列出的所有内容都保持其默认值。这样的文件放在 `~/.claude/settings.json` 中,它适用于你打开的每个项目。

24 

25<Tabs>

26 <Tab title="Copyable settings file">

27 将其保存为 `~/.claude/settings.json`。这是有效的 JSON,没有注释,因此你可以按原样粘贴它并删除你不想要的键。

28 

29 ```json ~/.claude/settings.json theme={null}

30 {

31 "model": "claude-sonnet-5",

32 "effortLevel": "xhigh",

33 "editorMode": "vim",

34 "theme": "light-daltonized",

35 "statusLine": {

36 "type": "command",

37 "command": "jq -r '\"[\\(.model.display_name)] \\(.context_window.used_percentage // 0)% context\"'",

38 "padding": 2

39 },

40 "spinnerTipsEnabled": false,

41 "preferredNotifChannel": "terminal_bell",

42 "permissions": {

43 "allow": [

44 "Bash(git diff *)",

45 "Read(~/.zshrc)"

46 ]

47 },

48 "autoUpdatesChannel": "stable",

49 "cleanupPeriodDays": 20

50 }

51 ```

52 </Tab>

53 

54 <Tab title="What each key does">

55 同一个文件,每个键上方都有注释。在这里阅读;从另一个选项卡复制,因为 Claude Code 不接受设置文件中的注释。

56 

57 ```jsonc ~/.claude/settings.json theme={null}

58 {

59 // 在 Sonnet 5 上启动每个会话

60 "model": "claude-sonnet-5",

61 // 在没有保存级别的模型上比默认高级别进行更深入的推理;/effort 为每个模型保存一个级别,--effort 为单个会话设置一个级别

62 "effortLevel": "xhigh",

63 // 提示中的 Vim 快捷键

64 "editorMode": "vim",

65 // 色盲友好的浅色主题

66 "theme": "light-daltonized",

67 // 提示下方的状态行:模型名称和使用的上下文

68 "statusLine": {

69 "type": "command",

70 "command": "jq -r '\"[\\(.model.display_name)] \\(.context_window.used_percentage // 0)% context\"'",

71 "padding": 2

72 },

73 // 隐藏在加载器下旋转的提示

74 "spinnerTipsEnabled": false,

75 // 为通知(例如完成的任务或等待的权限提示)响铃终端铃声

76 "preferredNotifChannel": "terminal_bell",

77 // 让 Claude Code 运行 git diff 并读取你的 .zshrc,无需询问

78 "permissions": {

79 "allow": [

80 "Bash(git diff *)",

81 "Read(~/.zshrc)"

82 ]

83 },

84 // 从稳定频道获取更新

85 "autoUpdatesChannel": "stable",

86 // 删除超过 20 天的会话记录和其他本地会话数据

87 "cleanupPeriodDays": 20

88 }

89 ```

90 </Tab>

91</Tabs>

92 

93<h2 id="a-teams-shared-settings">

94 团队的共享设置

95</h2>

96 

97一个团队的共享设置,提交到仓库,以便克隆它的每个人都获得相同的权限、hooks、遥测和插件市场。在仓库顶部的 `.claude/settings.json` 处保存这样的文件。在提交之前需要了解的内容:

98 

99* **云会话也会读取它。** Claude Code 网页版上的 [cloud session](/docs/zh-CN/settings#settings-in-cloud-sessions) 从仓库的克隆开始,因此提交的文件也适用于那里。

100* **Allow 规则等待信任。** Allow 规则和 `extraKnownMarketplaces` 条目在每个人 [信任此文件夹本身](/docs/zh-CN/permissions#project-allow-rules-and-workspace-trust) 后生效,而不仅仅是父文件夹;deny 和 ask 规则在每个会话中应用,无论是否受信任。

101* **hook 是仓库中的脚本。** 此文件的 hook 运行 `.claude/hooks/block-rm.sh`;[How a hook resolves](/docs/zh-CN/hooks#how-a-hook-resolves) 介绍了如何编写它。

102* **规则匹配按写入的命令和路径。** `Bash(git push *)` 不匹配 [`git -C . push`](/docs/zh-CN/permissions#bash-rule-limits)。`Read(./.env)` 单独停止文件工具和命名文件的命令,例如 `cat .env`,但不停止 [`grep -r` 在目录上运行](/docs/zh-CN/permissions#read-and-edit);此文件中的 `sandbox` 块关闭了该间隙,因为 sandbox [添加你的 `Read` deny 路径](/docs/zh-CN/settings-reference#sandbox-filesystem-denyread) 到每个沙箱命令无法读取的内容。

103 

104<Tabs>

105 <Tab title="Copyable settings file">

106 将其保存为仓库顶部的 `.claude/settings.json` 并提交。这是有效的 JSON,没有注释,因此你可以按原样粘贴它并删除你不想要的键。

107 

108 ```json .claude/settings.json theme={null}

109 {

110 "permissions": {

111 "allow": [

112 "Bash(npm run *)"

113 ],

114 "ask": [

115 "Bash(git push *)"

116 ],

117 "deny": [

118 "Read(./.env)",

119 "Read(./.env.*)",

120 "Read(./secrets/**)"

121 ]

122 },

123 "env": {

124 "CLAUDE_CODE_ENABLE_TELEMETRY": "1",

125 "OTEL_METRICS_EXPORTER": "otlp",

126 "OTEL_EXPORTER_OTLP_PROTOCOL": "grpc",

127 "OTEL_EXPORTER_OTLP_ENDPOINT": "http://collector.example.com:4317"

128 },

129 "hooks": {

130 "PreToolUse": [

131 {

132 "matcher": "Bash",

133 "hooks": [

134 {

135 "type": "command",

136 "command": "${CLAUDE_PROJECT_DIR}/.claude/hooks/block-rm.sh"

137 }

138 ]

139 }

140 ]

141 },

142 "extraKnownMarketplaces": {

143 "acme-tools": {

144 "source": {

145 "source": "github",

146 "repo": "acme-corp/claude-plugins"

147 }

148 }

149 },

150 "enabledPlugins": {

151 "code-formatter@acme-tools": true

152 },

153 "sandbox": {

154 "enabled": true,

155 "filesystem": {

156 "allowWrite": [

157 "/tmp/build"

158 ]

159 },

160 "network": {

161 "allowedDomains": [

162 "registry.npmjs.org",

163 "*.example.com"

164 ]

165 }

166 },

167 "plansDirectory": "./plans"

168 }

169 ```

170 </Tab>

171 

172 <Tab title="What each key does">

173 同一个文件,每个键上方都有注释。在这里阅读;从另一个选项卡复制,因为 Claude Code 不接受设置文件中的注释。

174 

175 ```jsonc .claude/settings.json theme={null}

176 {

177 "permissions": {

178 // 无需询问即可运行 npm 脚本

179 "allow": [

180 "Bash(npm run *)"

181 ],

182 // 在 git push 命令前确认

183 "ask": [

184 "Bash(git push *)"

185 ],

186 // 拒绝文件工具和文件读取命令读取 env 文件和 secrets 文件夹

187 "deny": [

188 "Read(./.env)",

189 "Read(./.env.*)",

190 "Read(./secrets/**)"

191 ]

192 },

193 // 通过 gRPC 将 OpenTelemetry 指标发送到团队的收集器;将端点替换为你的收集器的 URL

194 "env": {

195 "CLAUDE_CODE_ENABLE_TELEMETRY": "1",

196 "OTEL_METRICS_EXPORTER": "otlp",

197 "OTEL_EXPORTER_OTLP_PROTOCOL": "grpc",

198 "OTEL_EXPORTER_OTLP_ENDPOINT": "http://collector.example.com:4317"

199 },

200 // 在每个 Bash 命令之前,运行仓库中可以阻止它的脚本

201 "hooks": {

202 "PreToolUse": [

203 {

204 "matcher": "Bash",

205 "hooks": [

206 {

207 "type": "command",

208 "command": "${CLAUDE_PROJECT_DIR}/.claude/hooks/block-rm.sh"

209 }

210 ]

211 }

212 ]

213 },

214 // 在每个克隆上注册团队的插件市场

215 "extraKnownMarketplaces": {

216 "acme-tools": {

217 "source": {

218 "source": "github",

219 "repo": "acme-corp/claude-plugins"

220 }

221 }

222 },

223 // 启用该市场中的一个插件;来自外部源(例如 GitHub 仓库)的插件仍然需要每个人安装一次

224 "enabledPlugins": {

225 "code-formatter@acme-tools": true

226 },

227 // 沙箱命令:可写的构建目录;npm 和 example.com 预先允许,其他主机仍然提示

228 "sandbox": {

229 "enabled": true,

230 "filesystem": {

231 "allowWrite": [

232 "/tmp/build"

233 ]

234 },

235 "network": {

236 "allowedDomains": [

237 "registry.npmjs.org",

238 "*.example.com"

239 ]

240 }

241 },

242 // 将计划文件保存在仓库内

243 "plansDirectory": "./plans"

244 }

245 ```

246 </Tab>

247</Tabs>

248 

249<h2 id="an-organizations-managed-settings">

250 组织的托管设置

251</h2>

252 

253一个 `managed-settings.json` 文件,显示托管键的形状,每个键都有一个合理的值。这不是推荐的策略:选择与你自己的要求相匹配的键并设置你自己的值。该示例设置这些键:

254 

255* `forceLoginMethod` 和 `forceLoginOrgUUID` 固定登录方法和组织

256* `availableModels` 和 `enforceAvailableModels` 限制会话可以使用的模型

257* `permissions.deny` 拒绝两个文件读取和 `curl` 命令 [如 Claude 编写的那样](/docs/zh-CN/permissions#bash-rule-limits),`disableBypassPermissionsMode` 删除绕过权限模式

258* [`allowManagedPermissionRulesOnly`](/docs/zh-CN/settings-reference#allowmanagedpermissionrulesonly) 和 [`allowManagedMcpServersOnly`](/docs/zh-CN/settings-reference#allowmanagedmcpserversonly) 使托管权限和 MCP 允许列表成为唯一适用的列表

259* `allowedMcpServers` 通过 URL 固定 MCP 服务器

260* `strictKnownMarketplaces` 允许一个插件市场

261* `sandbox` 使用固定的网络允许列表对命令进行沙箱处理,无需无沙箱重试

262* `requiredMinimumVersion` 设置最低 Claude Code 版本

263* `cleanupPeriodDays` 将会话记录和其他本地数据的保留期缩短为七天

264* `companyAnnouncements` 在启动时显示消息

265 

266管理员将这样的文件部署为 `managed-settings.json`,或通过 MDM 或 [server-managed settings](/docs/zh-CN/server-managed-settings) 部署相同的 JSON。一个部署的文件适用于它到达的每台机器或帐户。要为一个组提供不同的值,请将不同的文件或配置文件部署到该组,因为 [server-managed settings 还不支持按组策略](/docs/zh-CN/server-managed-settings#current-limitations)。

267 

268<Tabs>

269 <Tab title="Copyable settings file">

270 将其部署为 `managed-settings.json`,或通过 MDM 或 claude.ai 控制台部署相同的 JSON。这是有效的 JSON,没有注释;将示例组织 UUID、服务器 URL 和市场替换为你自己的,并删除你不想要的键。

271 

272 ```json managed-settings.json theme={null}

273 {

274 "forceLoginMethod": "claudeai",

275 "forceLoginOrgUUID": [

276 "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

277 ],

278 "availableModels": [

279 "opus",

280 "sonnet"

281 ],

282 "enforceAvailableModels": true,

283 "permissions": {

284 "deny": [

285 "Bash(curl *)",

286 "Read(./.env)",

287 "Read(./secrets/**)"

288 ],

289 "disableBypassPermissionsMode": "disable"

290 },

291 "allowManagedPermissionRulesOnly": true,

292 "allowedMcpServers": [

293 {

294 "serverUrl": "https://api.githubcopilot.com/*"

295 }

296 ],

297 "allowManagedMcpServersOnly": true,

298 "strictKnownMarketplaces": [

299 {

300 "source": "github",

301 "repo": "acme-corp/approved-plugins"

302 }

303 ],

304 "sandbox": {

305 "enabled": true,

306 "failIfUnavailable": true,

307 "allowUnsandboxedCommands": false,

308 "network": {

309 "allowedDomains": [

310 "registry.npmjs.org",

311 "github.com"

312 ],

313 "allowManagedDomainsOnly": true

314 }

315 },

316 "requiredMinimumVersion": "2.1.150",

317 "cleanupPeriodDays": 7,

318 "companyAnnouncements": [

319 "Welcome to Acme Corp! Review our code guidelines at docs.example.com"

320 ]

321 }

322 ```

323 </Tab>

324 

325 <Tab title="What each key does">

326 同一个文件,每个键上方都有注释。在这里阅读;从另一个选项卡复制,因为 Claude Code 不接受设置文件中的注释。

327 

328 ```jsonc managed-settings.json theme={null}

329 {

330 // 仅 claude.ai 登录,且仅在此组织中

331 "forceLoginMethod": "claudeai",

332 "forceLoginOrgUUID": [

333 "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

334 ],

335 // 仅 Opus 和 Sonnet 模型;使用 enforceAvailableModels,默认选项也遵守列表

336 "availableModels": [

337 "opus",

338 "sonnet"

339 ],

340 "enforceAvailableModels": true,

341 "permissions": {

342 // 在每台机器上拒绝 curl 命令和读取项目的 .env 文件和 secrets 文件夹

343 "deny": [

344 "Bash(curl *)",

345 "Read(./.env)",

346 "Read(./secrets/**)"

347 ],

348 // 从每个会话中删除绕过权限模式

349 "disableBypassPermissionsMode": "disable"

350 },

351 // 忽略来自用户、项目和本地设置的权限规则

352 "allowManagedPermissionRulesOnly": true,

353 // 仅 GitHub MCP 服务器,通过 URL 而不是名称匹配,因为用户可以

354 // 将任何服务器命名为 "github"。不匹配的用户添加的服务器不会加载,包括

355 // 当列表仅有 URL 条目时的每个 stdio 服务器。下面的 allowManagedMcpServersOnly

356 // 键使此托管列表成为唯一适用的允许列表

357 "allowedMcpServers": [

358 {

359 "serverUrl": "https://api.githubcopilot.com/*"

360 }

361 ],

362 "allowManagedMcpServersOnly": true,

363 // 插件只能来自此市场

364 "strictKnownMarketplaces": [

365 {

366 "source": "github",

367 "repo": "acme-corp/approved-plugins"

368 }

369 ],

370 // 对 Claude 运行的每个命令进行沙箱处理,如果无法设置沙箱则拒绝启动,

371 // 并且永远不要让被阻止的命令在沙箱外重试;网络

372 // 限制为 npm 和 GitHub,用户无法添加域

373 "sandbox": {

374 "enabled": true,

375 "failIfUnavailable": true,

376 "allowUnsandboxedCommands": false,

377 "network": {

378 "allowedDomains": [

379 "registry.npmjs.org",

380 "github.com"

381 ],

382 "allowManagedDomainsOnly": true

383 }

384 },

385 // 拒绝在 2.1.150 之前的版本上启动

386 "requiredMinimumVersion": "2.1.150",

387 // 7 天后删除会话记录和其他本地会话数据

388 "cleanupPeriodDays": 7,

389 // 每个用户在启动时看到的消息

390 "companyAnnouncements": [

391 "Welcome to Acme Corp! Review our code guidelines at docs.example.com"

392 ]

393 }

394 ```

395 </Tab>

396</Tabs>

setup.md +15 −13

Details

41 初次使用终端?请参阅[终端指南](/docs/zh-CN/terminal-guide)获取分步说明。41 初次使用终端?请参阅[终端指南](/docs/zh-CN/terminal-guide)获取分步说明。

42</Tip>42</Tip>

43 43 

44To install Claude Code, use one of the following methods:44要安装 Claude Code,请使用以下方法之一:

45 45 

46<Tabs>46<Tabs>

47 <Tab title="Native Install (Recommended)">47 <Tab title="原生安装(推荐)">

48 **macOS, Linux, WSL:**48 **macOS、Linux、WSL:**

49 49 

50 ```bash theme={null}50 ```bash theme={null}

51 curl -fsSL https://claude.ai/install.sh | bash51 curl -fsSL https://claude.ai/install.sh | bash

52 ```52 ```

53 53 

54 **Windows PowerShell:**54 **Windows PowerShell:**

55 55 

56 ```powershell theme={null}56 ```powershell theme={null}

57 irm https://claude.ai/install.ps1 | iex57 irm https://claude.ai/install.ps1 | iex

58 ```58 ```

59 59 

60 **Windows CMD:**60 **Windows CMD:**

61 61 

62 ```batch theme={null}62 ```batch theme={null}

63 curl -fsSL https://claude.ai/install.cmd -o install.cmd && install.cmd && del install.cmd63 curl -fsSL https://claude.ai/install.cmd -o install.cmd && install.cmd && del install.cmd

64 ```64 ```

65 65 

66 If you see `The token '&&' is not a valid statement separator`, you're in PowerShell, not CMD. If you see `'irm' is not recognized as an internal or external command`, you're in CMD, not PowerShell. Your prompt shows `PS C:\` when you're in PowerShell and `C:\` without the `PS` when you're in CMD.66 如果您看到 `The token '&&' is not a valid statement separator`,说明您在 PowerShell 中,而不是 CMD。如果您看到 `'irm' is not recognized as an internal or external command`,说明您在 CMD 中,而不是 PowerShell。当您在 PowerShell 中时,您的提示符显示 `PS C:\`,当您在 CMD 中时显示 `C:\`(没有 `PS`)。

67 67 

68 If the install command fails with `syntax error near unexpected token '<'`, a `403`, or another curl error, see [Troubleshoot installation](/docs/en/troubleshoot-install#find-your-error) to match the error to a fix and for alternative install methods.68 如果安装命令失败并显示 `syntax error near unexpected token '<'`、`403` 或其他 curl 错误,请参阅 [Troubleshoot installation](/docs/zh-CN/troubleshoot-install#find-your-error) 以匹配错误并获得修复方案和替代安装方法。

69 69 

70 [Git for Windows](https://git-scm.com/downloads/win) is recommended on native Windows so Claude Code can use the Bash tool. If Git for Windows is not installed, Claude Code uses PowerShell as the shell tool instead. WSL setups do not need Git for Windows.70 建议在原生 Windows 上安装 [Git for Windows](https://git-scm.com/downloads/win),以便 Claude Code 可以使用 Bash 工具。如果未安装 Git for Windows,Claude Code 将使用 PowerShell 作为 shell 工具。WSL 设置不需要 Git for Windows。

71 71 

72 <Info>72 <Info>

73 Native installations automatically update in the background to keep you on the latest version.73 原生安装会在后台自动更新,以保持您使用最新版本。

74 </Info>74 </Info>

75 </Tab>75 </Tab>

76 76 


79 brew install --cask claude-code79 brew install --cask claude-code

80 ```80 ```

81 81 

82 Homebrew offers two casks. `claude-code` tracks the stable release channel, which is typically about a week behind and skips releases with major regressions. `claude-code@latest` tracks the latest channel and receives new versions as soon as they ship.82 Homebrew 提供两个 casks。`claude-code` 跟踪稳定发布渠道,通常比最新版本晚约一周,并跳过有重大回归的版本。`claude-code@latest` 跟踪最新渠道,在新版本发布时立即接收。

83 83 

84 <Info>84 <Info>

85 Homebrew installations do not auto-update. Run `brew upgrade claude-code` or `brew upgrade claude-code@latest`, depending on which cask you installed, to get the latest features and security fixes.85 Homebrew 安装不会自动更新。运行 `brew upgrade claude-code` 或 `brew upgrade claude-code@latest`(取决于您安装的 cask)以获取最新功能和安全修复。

86 </Info>86 </Info>

87 </Tab>87 </Tab>

88 88 


92 ```92 ```

93 93 

94 <Info>94 <Info>

95 WinGet installations do not auto-update. Run `winget upgrade Anthropic.ClaudeCode` periodically to get the latest features and security fixes.95 WinGet 安装不会自动更新。定期运行 `winget upgrade Anthropic.ClaudeCode` 以获取最新功能和安全修复。

96 </Info>96 </Info>

97 </Tab>97 </Tab>

98</Tabs>98</Tabs>

99 99 

100You can also install with [apt, dnf, or apk](/docs/en/setup#install-with-linux-package-managers) on Debian, Fedora, RHEL, and Alpine.100您也可以在 Debian、Fedora、RHEL 和 Alpine 上使用 [apt、dnf 或 apk](/docs/zh-CN/setup#install-with-linux-package-managers) 进行安装。

101 101 

102安装完成后,在您要使用的项目中打开终端并启动 Claude Code:102安装完成后,在您要使用的项目中打开终端并启动 Claude Code:

103 103 


296}296}

297```297```

298 298 

299在原生或 npm 安装上,通过运行 `claude doctor` 并检查 `Auto-updates` 行是否显示 `disabled (set by env: DISABLE_AUTOUPDATER)` 而不是 `enabled` 来确认更改已生效。

300 

299`DISABLE_AUTOUPDATER` 仅停止后台检查;`claude update` 和 `claude install` 仍然有效。要阻止所有更新路径(包括手动更新),请改为设置 [`DISABLE_UPDATES`](/docs/zh-CN/env-vars)。当您通过自己的渠道分发 Claude Code 并需要用户保持在您提供的版本上时,请使用此选项。301`DISABLE_AUTOUPDATER` 仅停止后台检查;`claude update` 和 `claude install` 仍然有效。要阻止所有更新路径(包括手动更新),请改为设置 [`DISABLE_UPDATES`](/docs/zh-CN/env-vars)。当您通过自己的渠道分发 Claude Code 并需要用户保持在您提供的版本上时,请使用此选项。

300 302 

301<h3 id="update-manually">303<h3 id="update-manually">

skills.md +26 −17

Details

28 28 

29大多数捆绑技能在每个会话中都可用。少数技能取决于特定功能:例如,`/workflow-authoring` 仅在[动态工作流](/docs/zh-CN/workflows)启用时可用。29大多数捆绑技能在每个会话中都可用。少数技能取决于特定功能:例如,`/workflow-authoring` 仅在[动态工作流](/docs/zh-CN/workflows)启用时可用。

30 30 

31要关闭捆绑技能,请使用 [`disableBundledSkills`](/docs/zh-CN/settings-reference#disablebundledskills) 设置,该设置会禁用除 `/doctor` 外的所有捆绑技能。31要关闭捆绑技能,请使用 [`disableBundledSkills`](/docs/zh-CN/settings-reference#disablebundledskills) 设置。

32 32 

33<Note>33<Note>

34 在 Claude Code v2.1.205 及更高版本中,当 `disableBundledSkills` 打开时,[`/doctor`](/docs/zh-CN/commands#all-commands) 设置检查仍然可以输入。要隐藏它,请设置 `DISABLE_DOCTOR_COMMAND` 环境变量或 [`skillOverrides`](#override-skill-visibility-from-settings) 条目 `"doctor": "off"`。在 v2.1.205 之前,`/doctor` 是内置命令而不是捆绑技能。34 在 Claude Code v2.1.205 及更高版本中,当 `disableBundledSkills` 打开时,[`/doctor`](/docs/zh-CN/commands#all-commands) 设置检查仍然可以输入。要隐藏它,请设置 `DISABLE_DOCTOR_COMMAND` 环境变量或 [`skillOverrides`](#override-skill-visibility-from-settings) 条目 `"doctor": "off"`。在 v2.1.205 之前,`/doctor` 是内置命令而不是捆绑技能。


136 136 

137* **符号链接文件夹**:enterprise、personal 或 project 位置中的 `<skill-name>` 条目可以是指向磁盘上其他位置的目录的符号链接。Claude Code 从目标读取 `SKILL.md` 并加载 skill,即使多个位置指向同一目标也只加载一次。插件 skills [以不同方式处理符号链接](/docs/zh-CN/plugins-reference#share-files-within-a-marketplace-with-symlinks)。137* **符号链接文件夹**:enterprise、personal 或 project 位置中的 `<skill-name>` 条目可以是指向磁盘上其他位置的目录的符号链接。Claude Code 从目标读取 `SKILL.md` 并加载 skill,即使多个位置指向同一目标也只加载一次。插件 skills [以不同方式处理符号链接](/docs/zh-CN/plugins-reference#share-files-within-a-marketplace-with-symlinks)。

138* **保留名称**:不要将 skill 文件夹命名为 `synced`,无论大小写如何。Claude Code 使用 `~/.claude/skills/synced/` 来[存储从 claude.ai 下载的 skills](#where-synced-skills-load),并跳过在 enterprise、personal 和 project 位置中以该名称创建的 skill。138* **保留名称**:不要将 skill 文件夹命名为 `synced`,无论大小写如何。Claude Code 使用 `~/.claude/skills/synced/` 来[存储从 claude.ai 下载的 skills](#where-synced-skills-load),并跳过在 enterprise、personal 和 project 位置中以该名称创建的 skill。

139* **命令文件**:`.claude/commands/` 中的 Markdown 文件是较旧的格式,仍然有效。它支持相同的[前置元数据](#frontmatter-reference),除了 `name` 和 `paths`,并且通过其文件名调用它。对于新工作,优先使用 skill,因为 skills 还支持[支持文件](#add-supporting-files)。139* **命令文件**:`.claude/commands/` 中的 Markdown 文件是较旧的格式,仍然有效。它支持相同的[前置元数据](#frontmatter-reference),除了 `name` 和 `paths`。要找到您键入以调用它的名称,请参阅[skill 如何获得其命令名称](#how-a-skill-gets-its-command-name)。对于新工作,优先使用 skill,因为 skills 还支持[支持文件](#add-supporting-files)。

140* **Skill 文件夹作为插件**:将 `.claude-plugin/plugin.json` 添加到 skill 文件夹,它将作为[插件](/docs/zh-CN/plugins-reference#skills-directory-plugins)加载,名称为 `<name>@skills-dir`,因此它可以捆绑代理、hooks 和 MCP 服务器。在项目的 `.claude/skills/` 中,这需要首先接受工作区信任对话框。140* **Skill 文件夹作为插件**:将 `.claude-plugin/plugin.json` 添加到 skill 文件夹,它将作为[插件](/docs/zh-CN/plugins-reference#skills-directory-plugins)加载,名称为 `<name>@skills-dir`,因此它可以捆绑代理、hooks 和 MCP 服务器。在项目的 `.claude/skills/` 中,这需要首先接受工作区信任对话框。

141 141 

142<h3 id="discovery-from-parent-and-nested-directories">142<h3 id="discovery-from-parent-and-nested-directories">


234 234 

235Claude Code 标记同步 skills,以便您可以告诉它们来自何处。`/skills` 菜单和 `/context` 在 `claude.ai sync` 下分组同步 skills,`/` 命令菜单将它们标记为来自 claude.ai。235Claude Code 标记同步 skills,以便您可以告诉它们来自何处。`/skills` 菜单和 `/context` 在 `claude.ai sync` 下分组同步 skills,`/` 命令菜单将它们标记为来自 claude.ai。

236 236 

237比较名称时,Claude Code 忽略大小写、间距和不可见字符,并将兼容性形式(如全宽字母和破折号变体)视为其纯等效形式,因此同步的 `Commit` 无法与本地 `commit` 并排加载。仅因来自另一个字母表的相似字母而不同的名称计为不同的名称,`claude.ai sync` 标签是您区分两者的方式。237比较名称时,Claude Code 忽略大小写、间距和不可见字符,并将兼容性形式(如全宽字母和破折号变体)视为其纯等效形式,因此同步的 `Commit` 无法与本地 `commit` 并排加载。仅因来自另一个字母表的相似字母而不同的名称计为不同的名称,`claude.ai sync` 标签是您区分两者的方式。这些检查和标签需要 Claude Code v2.1.228 或更高版本。

238 238 

239<h4 id="how-claude-code-handles-the-frontmatter-of-a-synced-skill">239<h4 id="how-claude-code-handles-the-frontmatter-of-a-synced-skill">

240 Claude Code 如何处理同步 skill 的前置元数据240 Claude Code 如何处理同步 skill 的前置元数据


243Claude Code 对同步 skill 的前置元数据应用两个规则:243Claude Code 对同步 skill 的前置元数据应用两个规则:

244 244 

245* Claude Code 在每种会话中都遵守前置元数据,因此 `allowed-tools` 授予通过正常[权限流](/docs/zh-CN/permissions)。245* Claude Code 在每种会话中都遵守前置元数据,因此 `allowed-tools` 授予通过正常[权限流](/docs/zh-CN/permissions)。

246* Claude Code 清理 skill 提供的显示文本,例如其描述。它删除控制字符,在到达 Claude 的文本(如描述)中,它还转义角括号,以便文本无法模仿 Claude Code 的内部格式。246* Claude Code 清理 skill 提供的显示文本,例如其描述。它删除控制字符,在到达 Claude 的文本(如描述)中,它还转义角括号,以便文本无法模仿 Claude Code 的内部格式。这种清理需要 Claude Code v2.1.228 或更高版本。

247 247 

248<h4 id="how-claude-code-handles-the-body-of-a-synced-skill">248<h4 id="how-claude-code-handles-the-body-of-a-synced-skill">

249 Claude Code 如何处理同步 skill 的正文249 Claude Code 如何处理同步 skill 的正文


253 253 

254* 在云会话中,正文保持本地 skill 具有的行为,因为会话在隔离容器中运行。254* 在云会话中,正文保持本地 skill 具有的行为,因为会话在隔离容器中运行。

255* 在您桌面上的 Cowork 会话中,正文保持本地 skill 具有的行为,除了 Claude Code 将每个 `!` 命令行替换为[`disableSkillShellExecution` 占位符](#inject-dynamic-context),就像它对您在那里提供的每个 skill 所做的那样。255* 在您桌面上的 Cowork 会话中,正文保持本地 skill 具有的行为,除了 Claude Code 将每个 `!` 命令行替换为[`disableSkillShellExecution` 占位符](#inject-dynamic-context),就像它对您在那里提供的每个 skill 所做的那样。

256* 在您机器上的任何其他会话中,Claude Code 不运行[`!` 命令](#inject-dynamic-context),不附加 `@` 引用命名的文件(就像它对本地 skill 所做的那样),不替换 `${CLAUDE_PROJECT_DIR}` 和 `${CLAUDE_SESSION_ID}` 占位符,因此 `@` 引用和两个占位符都作为文字文本到达 Claude。`!` 命令行也作为文字文本到达 Claude,或当 `disableSkillShellExecution` 打开时作为该占位符。256* 在您机器上的任何其他会话中,Claude Code 不运行[`!` 命令](#inject-dynamic-context),不附加 `@` 引用命名的文件(就像它对本地 skill 所做的那样),不替换 `${CLAUDE_PROJECT_DIR}` 和 `${CLAUDE_SESSION_ID}` 占位符,因此 `@` 引用和两个占位符都作为文字文本到达 Claude。`!` 命令行也作为文字文本到达 Claude,或当 `disableSkillShellExecution` 打开时作为该占位符。这种处理需要 Claude Code v2.1.228 或更高版本。

257 257 

258<h3 id="live-change-detection">258<h3 id="live-change-detection">

259 在会话期间编辑 skill259 在会话期间编辑 skill


271 271 

272* **Personal 或 project skill**:删除 skill 的目录,`~/.claude/skills/<skill-name>/` 或 `.claude/skills/<skill-name>/`。Claude Code [在当前会话中从 `/skills` 中删除它](#live-change-detection);Claude Code 已从中加载的内容遵循[skill 内容生命周期](#skill-content-lifecycle)。272* **Personal 或 project skill**:删除 skill 的目录,`~/.claude/skills/<skill-name>/` 或 `.claude/skills/<skill-name>/`。Claude Code [在当前会话中从 `/skills` 中删除它](#live-change-detection);Claude Code 已从中加载的内容遵循[skill 内容生命周期](#skill-content-lifecycle)。

273* **Enterprise skill**:管理员从[托管设置目录](/docs/zh-CN/managed-settings#delivery-mechanisms)内的 `.claude/skills/` 删除 skill 的目录,例如 Linux 上的 `/etc/claude-code/.claude/skills/<skill-name>/`。273* **Enterprise skill**:管理员从[托管设置目录](/docs/zh-CN/managed-settings#delivery-mechanisms)内的 `.claude/skills/` 删除 skill 的目录,例如 Linux 上的 `/etc/claude-code/.claude/skills/<skill-name>/`。

274* **Plugin skill**:从 `/plugin` 菜单禁用或卸载提供它的插件,或使用 `/plugin uninstall <plugin-name>@<marketplace-name>`。Claude Code 在您运行 `/reload-plugins` 或重新启动后卸载插件的 skills;请参阅[不重新启动应用插件更改](/docs/zh-CN/discover-plugins#apply-plugin-changes-without-restarting)。274* **Plugin skill**:从 `/plugin` 菜单禁用或卸载提供它的插件,或使用 `/plugin uninstall <plugin-name>@<marketplace-name>`。Claude Code 在[更改应用](/docs/zh-CN/discover-plugins#apply-plugin-changes-without-restarting)时或重新启动后卸载插件的 skills。

275* **从 claude.ai 同步的 Skill**:在[启用它](#skills-in-cowork-and-cloud-sessions)的同一位置为您的 claude.ai 账户关闭该 skill。Claude Code 在下次[同步您的 skills](#where-synced-skills-load)时将其从 `~/.claude/skills/synced/` 中删除。如果您改为手动删除目录,下次同步会在 skill 在 claude.ai 上保持启用时再次下载它。275* **从 claude.ai 同步的 Skill**:在[启用它](#skills-in-cowork-and-cloud-sessions)的同一位置为您的 claude.ai 账户关闭该 skill。Claude Code 在下次[同步您的 skills](#where-synced-skills-load)时将其从 `~/.claude/skills/synced/` 中删除。如果您改为手动删除目录,下次同步会在 skill 在 claude.ai 上保持启用时再次下载它。

276* **捆绑 skill**:设置 [`disableBundledSkills`](#bundled-skills) 为 `true` 以关闭除 `/doctor` 外的每个捆绑 skill,或在 [`skillOverrides`](#override-skill-visibility-from-settings) 中将一个 skill 设置为 `"off"` 以隐藏它。276* **捆绑 skill**:设置 [`disableBundledSkills`](#bundled-skills) 为 `true` 以关闭捆绑 skills,或在 [`skillOverrides`](#override-skill-visibility-from-settings) 中将一个 skill 设置为 `"off"` 以隐藏它。

277 277 

278要保留 personal 或 project skill 但阻止 Claude 自动调用它,在其前置元数据中设置 [`disable-model-invocation: true`](#control-who-invokes-a-skill),或在 [`skillOverrides`](#override-skill-visibility-from-settings) 中设置 `"user-invocable-only"`(当您不想编辑文件时)。278要保留 personal 或 project skill 但阻止 Claude 自动调用它,在其前置元数据中设置 [`disable-model-invocation: true`](#control-who-invokes-a-skill),或在 [`skillOverrides`](#override-skill-visibility-from-settings) 中设置 `"user-invocable-only"`(当您不想编辑文件时)。

279 279 


397下表显示了每个布局的命令名称来自何处:397下表显示了每个布局的命令名称来自何处:

398 398 

399| Skill 位置 | 命令名称来源 | 示例 |399| Skill 位置 | 命令名称来源 | 示例 |

400| :------------------------------------------------------------- | :------------------------------- | :--------------------------------------------------------------------------------------------------------------------- |400| :------------------------------------------------------------- | :------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------- |

401| `~/.claude/skills/` 或 `.claude/skills/` 下的 Skill 目录 | 目录名称 | `.claude/skills/deploy-staging/SKILL.md` → `/deploy-staging` |401| `~/.claude/skills/` 或 `.claude/skills/` 下的 Skill 目录 | 目录名称 | `.claude/skills/deploy-staging/SKILL.md` → `/deploy-staging` |

402| [嵌套](#where-skills-live)`.claude/skills/` 目录,当名称与另一个 skill 冲突时 | 相对于工作目录的子目录路径,然后是 skill 目录名称 | `apps/web/.claude/skills/deploy/SKILL.md` → `/apps/web:deploy` |402| [嵌套](#where-skills-live)`.claude/skills/` 目录,当名称与另一个 skill 冲突时 | 相对于工作目录的子目录路径,然后是 skill 目录名称 | `apps/web/.claude/skills/deploy/SKILL.md` → `/apps/web:deploy` |

403| `.claude/commands/` 下的文件 | 文件名(不含扩展名) | `.claude/commands/deploy.md` → `/deploy` |403| `.claude/commands/` 下的文件 | 文件名(不含扩展名) | `.claude/commands/deploy.md` → `/deploy` |

404| `.claude/commands/` 的子目录中的文件 | 相对于 `commands/` 的子目录路径,每个 `/` 替换为 `:`,然后是不含扩展名的文件名 | `.claude/commands/frontend/component.md` → `/frontend:component` |

404| 插件 `skills/` 子目录 | Frontmatter `name` 或目录名称,由插件命名空间 | `my-plugin/skills/review/SKILL.md` → `/my-plugin:review`,或使用 `name: fancy` 时为 `/my-plugin:fancy` |405| 插件 `skills/` 子目录 | Frontmatter `name` 或目录名称,由插件命名空间 | `my-plugin/skills/review/SKILL.md` → `/my-plugin:review`,或使用 `name: fancy` 时为 `/my-plugin:fancy` |

405| 插件根 `SKILL.md` | Frontmatter `name`,以插件目录名称作为后备 | `my-plugin/SKILL.md` 带有 `name: review` → `/my-plugin:review`。请参阅[路径行为规则](/docs/zh-CN/plugins-reference#path-behavior-rules) |406| 插件根 `SKILL.md` | Frontmatter `name`,以插件目录名称作为后备 | `my-plugin/SKILL.md` 带有 `name: review` → `/my-plugin:review`。请参阅[路径行为规则](/docs/zh-CN/plugins-reference#path-behavior-rules) |

406 407 


630 注入动态上下文631 注入动态上下文

631</h3>632</h3>

632 633 

633`` !`<command>` `` 语法在技能内容发送给 Claude 之前运行 shell 命令。命令输出替换占位符,因此 Claude 接收实际数据,而不是命令本身。当技能从你的 claude.ai 账户[同步](#how-claude-code-handles-the-body-of-a-synced-skill)时,Claude Code 不会在你的机器上运行这些命令。634`` !`<command>` `` 语法在技能内容发送给 Claude 之前运行 shell 命令。命令输出替换占位符,因此 Claude 接收实际数据,而不是命令本身。当技能从你的 claude.ai 账户[同步](#how-claude-code-handles-the-body-of-a-synced-skill)时,Claude Code 不会在你的机器上运行这些命令。这个限制需要 Claude Code v2.1.228 或更高版本。

634 635 

635这个技能通过使用 GitHub CLI 获取实时 PR 数据来总结拉取请求。`` !`gh pr diff` `` 和其他命令首先运行,它们的输出被插入到提示中:636这个技能通过使用 GitHub CLI 获取实时 PR 数据来总结拉取请求。`` !`gh pr diff` `` 和其他命令首先运行,它们的输出被插入到提示中:

636 637 


668 669 

669要为来自用户、项目、插件或[附加目录](#skills-from-additional-directories)源的技能和自定义命令禁用此行为,请在[设置](/docs/zh-CN/settings)中设置 `"disableSkillShellExecution": true`。每个命令都被替换为 `[shell command execution disabled by policy]` 而不是被运行。捆绑和托管技能不受影响。此设置在[托管设置](/docs/zh-CN/managed-settings)中最有用,用户无法覆盖它。670要为来自用户、项目、插件或[附加目录](#skills-from-additional-directories)源的技能和自定义命令禁用此行为,请在[设置](/docs/zh-CN/settings)中设置 `"disableSkillShellExecution": true`。每个命令都被替换为 `[shell command execution disabled by policy]` 而不是被运行。捆绑和托管技能不受影响。此设置在[托管设置](/docs/zh-CN/managed-settings)中最有用,用户无法覆盖它。

670 671 

671当命令出现在从你的 claude.ai 账户[同步](#how-synced-skills-behave)的技能中时,Claude Code 永远不会在你的机器上运行这些命令,无论此设置如何。[Claude Code 如何处理同步技能的主体](#how-claude-code-handles-the-body-of-a-synced-skill)说明了在每种会话中 Claude 接收什么来代替命令。672当命令出现在从你的 claude.ai 账户[同步](#how-synced-skills-behave)的技能中时,Claude Code 永远不会在你的机器上运行这些命令,无论此设置如何。这个限制需要 Claude Code v2.1.228 或更高版本。[Claude Code 如何处理同步技能的主体](#how-claude-code-handles-the-body-of-a-synced-skill)说明了在每种会话中 Claude 接收什么来代替命令。

672 673 

673<Tip>674<Tip>

674 要在技能运行时请求更深入的推理,请在技能内容中的任何地方包含 `ultrathink`。请参阅[使用 ultrathink 进行一次性深入推理](/docs/zh-CN/model-config#use-ultrathink-for-one-off-deep-reasoning)。675 要在技能运行时请求更深入的推理,请在技能内容中的任何地方包含 `ultrathink`。请参阅[使用 ultrathink 进行一次性深入推理](/docs/zh-CN/model-config#use-ultrathink-for-one-off-deep-reasoning)。


716 在子代理中运行技能717 在子代理中运行技能

717</h3>718</h3>

718 719 

719当你希望技能在隔离中运行时,将 `context: fork` 添加到你的 frontmatter。技能内容成为驱动子代理的提示。它将无法访问你的对话历史。720当你希望技能在隔离中运行时,将 `context: fork` 添加到你的 frontmatter。Claude Code 启动 `agent` 字段中设置的类型的新子代理,并将技能内容作为其提示提供给它。子代理看不到你的对话历史,因此技能的说明必须独立存在。

721 

722<Note>

723 尽管名称如此,具有 `context: fork` 的技能不会在[当前对话的分叉](/docs/zh-CN/sub-agents#fork-the-current-conversation)中运行,这会将你迄今为止讨论的所有内容交给子代理。当任务依赖于该历史时,分叉对话而不是使用 `context: fork`。

724</Note>

720 725 

721分叉的子代理在[后台](/docs/zh-CN/sub-agents#run-subagents-in-foreground-or-background)运行:你继续工作,而它运行,其结果在完成时到达你的对话。在 frontmatter 中设置 `background: false` 以改为在调用技能的轮次中等待结果。在 v2.1.218 之前,分叉的技能总是阻止轮次直到它们完成。726分叉的子代理在[后台](/docs/zh-CN/sub-agents#run-subagents-in-foreground-or-background)运行:你继续工作,而它运行,其结果在完成时到达你的对话。在 frontmatter 中设置 `background: false` 以改为在调用技能的轮次中等待结果。在 v2.1.218 之前,分叉的技能总是阻止轮次直到它们完成。

722 727 


866 871 

867两者的检查都是基线比较。收集几个现实的提示,在启用技能的新会话中运行每个提示,然后在[禁用](#override-skill-visibility-from-settings)技能的情况下再运行一次,并比较结果。新会话很重要,因为编写技能时留下的上下文会掩盖书面说明中的差距。872两者的检查都是基线比较。收集几个现实的提示,在启用技能的新会话中运行每个提示,然后在[禁用](#override-skill-visibility-from-settings)技能的情况下再运行一次,并比较结果。新会话很重要,因为编写技能时留下的上下文会掩盖书面说明中的差距。

868 873 

874两个工具可以自动化该比较。对于在[插件](/docs/zh-CN/plugins)中发布的技能,[`claude plugin eval`](/docs/zh-CN/plugin-evals)在隔离会话中运行每个提示,既有插件也没有插件,使用你定义的或它为你编写的评分器对其进行评分,并在低于阈值时以非零状态退出,以便你可以在 CI 上对其进行门控。对于在 Claude Code 对话中迭代单个技能,下面的 skill-creator 插件使用其自己的 `evals/evals.json` 格式运行类似的循环。这两种格式不可互换。

875 

869<h3 id="run-evals-with-skill-creator">876<h3 id="run-evals-with-skill-creator">

870 使用 skill-creator 运行评估877 使用 skill-creator 运行评估

871</h3>878</h3>


881* `Marketplace "claude-plugins-official" not found`:使用 `/plugin marketplace add anthropics/claude-plugins-official` 添加市场,然后重试安装。888* `Marketplace "claude-plugins-official" not found`:使用 `/plugin marketplace add anthropics/claude-plugins-official` 添加市场,然后重试安装。

882* [插件在市场中找不到](/docs/zh-CN/discover-plugins#install-plugins):检查插件名称。889* [插件在市场中找不到](/docs/zh-CN/discover-plugins#install-plugins):检查插件名称。

883 890 

884如果安装摘要报告 `Run /reload-plugins to activate.`,运行该命令以在当前会话中激活插件的技能。然后要求 Claude 评估现有技能,例如 `evaluate my summarize-changes skill with skill-creator`。该插件会引导你编写测试用例并运行循环:891如果安装摘要报告 `Run /reload-plugins to activate.`,Claude Code 随后会为你运行该重新加载。如果重新加载警告你的下一条消息会重新读取对话,请运行 `/reload-plugins --force` 以在当前会话中使插件的技能可用。然后要求 Claude 评估现有技能,例如 `evaluate my summarize-changes skill with skill-creator`。该插件会引导你编写测试用例并运行循环:

885 892 

886* **测试用例**:在技能目录内的 `evals/evals.json` 中存储提示、输入文件和预期行为893* **测试用例**:在技能目录内的 `evals/evals.json` 中存储提示、输入文件和预期行为

887* **隔离运行**:为每个测试用例生成一个[子代理](/docs/zh-CN/sub-agents),以便每次运行都从干净的上下文开始,并记录令牌计数和持续时间894* **隔离运行**:为每个测试用例生成一个[子代理](/docs/zh-CN/sub-agents),以便每次运行都从干净的上下文开始,并记录令牌计数和持续时间


11113. 尝试重新表述你的请求以更接近描述11183. 尝试重新表述你的请求以更接近描述

11124. 如果 skill 是用户可调用的,使用 `/skill-name` 直接调用它11194. 如果 skill 是用户可调用的,使用 `/skill-name` 直接调用它

1113 1120 

1114如果 frontmatter YAML 格式不正确,Claude Code 会加载 skill 主体但元数据为空,所以 `/skill-name` 仍然有效,但 Claude 没有 `description` 来匹配。使用 `--debug` 运行以查看解析错误。1121如果 frontmatter YAML 格式不正确,Claude Code 会加载 skill 主体但元数据为空,所以 `/skill-name` 仍然有效,但 Claude 无法匹配你的 `description`。使用 `--debug` 运行以查看解析错误。

1122 

1123如果 skill 在 plugin 中,你可以在现实提示中测量它触发的频率,而不是逐个检查:使用 [`tool_used: Skill` grader](/docs/zh-CN/plugin-evals#create-your-first-eval-suite) 编写一个 eval case,并在每次描述更改后使用 `claude plugin eval` 运行它。

1115 1124 

1116要找到 frontmatter 无法解析的 `SKILL.md` 文件,请在 skills 目录上运行 [`claude plugin validate`](/docs/zh-CN/plugin-marketplaces#validate-a-plugin-or-a-directory-without-a-manifest),例如对于项目 skills 运行 `claude plugin validate .claude/skills`,或对于个人 skills 运行 `claude plugin validate ~/.claude/skills`。需要 Claude Code v2.1.233 或更高版本。1125要找到 frontmatter 无法解析的 `SKILL.md` 文件,在 skills 目录上运行 [`claude plugin validate`](/docs/zh-CN/plugin-marketplaces#validate-a-plugin-or-a-directory-without-a-manifest),例如对于项目 skills 运行 `claude plugin validate .claude/skills`,或对于个人 skills 运行 `claude plugin validate ~/.claude/skills`。需要 Claude Code v2.1.233 或更高版本。

1117 1126 

1118<h3 id="skill-triggers-too-often">1127<h3 id="skill-triggers-too-often">

1119 Skill 触发过于频繁1128 Skill 触发过于频繁


1128 Skill 描述被截断1137 Skill 描述被截断

1129</h3>1138</h3>

1130 1139 

1131Claude Code 将 skill 名称和描述的列表加载到上下文中,以便 Claude 知道有哪些可用。列表始终包含每个 skill 名称,但如果你有很多 skills,Claude Code 会缩短描述以适应列表的字符预算,这可能会删除 Claude 需要匹配你的请求的关键词。预算按模型上下文窗口的 1% 进行缩放。当列表溢出时,Claude Code 会从你调用最少的 skills 开始删除描述,因此你使用最多的 skills 会保留其完整文本。1140Claude Code 将 skill 名称和描述的列表加载到上下文中,以便 Claude 知道有哪些可用。列表始终包含每个 skill 名称,但如果你有很多 skills,Claude Code 会缩短描述以适应列表的字符预算,这可能会删除 Claude 需要匹配你的请求的关键词。预算按模型上下文窗口的 1% 进行缩放。当列表溢出时,Claude Code 从你调用最少的 skills 开始删除描述,所以你使用最多的 skills 保持其完整文本。

1132 1141 

1133运行 `/doctor` 以估计列表的上下文成本及其最大贡献者。要找到值得关闭的 skills,请运行 [`/skill-doctor`](#find-unused-skills)。当列表超过其预算时,Claude Code 也会向调试日志写入警告,可通过 [`--debug`](/docs/zh-CN/cli-reference#cli-flags) 查看。1142运行 `/doctor` 以估计列表的上下文成本及其最大贡献者。要找到值得关闭的 skills,运行 [`/skill-doctor`](#find-unused-skills)。当列表超过其预算时,Claude Code 也会向调试日志写入警告,可通过 [`--debug`](/docs/zh-CN/cli-reference#cli-flags) 查看。

1134 1143 

1135`/context` 中的 Skills 行报告应用预算后列表的大小,因此它与模型接收的内容相匹配。在 v2.1.196 之前,该行计算每个描述的完整文本,可能显示的值比配置的预算大几倍。1144`/context` 中的 Skills 行报告应用预算后列表的大小,因此它与模型接收的内容相匹配。在 v2.1.196 之前,该行计算每个描述的完整文本,可能显示的值比配置的预算大几倍。

1136 1145 

1137要提高预算,请设置 [`skillListingBudgetFraction`](/docs/zh-CN/settings-reference#skilllistingbudgetfraction) 设置(例如 `0.02` = 2%)或 `SLASH_COMMAND_TOOL_CHAR_BUDGET` 环境变量为固定字符数。要为其他 skills 释放预算,请在 [`skillOverrides`](#override-skill-visibility-from-settings) 中将低优先级条目设置为 `"name-only"`,以便它们在没有描述的情况下列出。你也可以在源处修剪 `description` 和 `when_to_use` 文本:将关键用例放在首位,因为每个条目的组合文本被限制在 1,536 个字符,无论预算如何。该上限可通过 [`skillListingMaxDescChars`](/docs/zh-CN/settings-reference#skilllistingmaxdescchars) 配置。1146要提高预算,设置 [`skillListingBudgetFraction`](/docs/zh-CN/settings-reference#skilllistingbudgetfraction) 设置(例如 `0.02` = 2%)或 `SLASH_COMMAND_TOOL_CHAR_BUDGET` 环境变量为固定字符数。要为其他 skills 释放预算,在 [`skillOverrides`](#override-skill-visibility-from-settings) 中将低优先级条目设置为 `"name-only"`,以便它们在没有描述的情况下列出。你也可以在源处修剪 `description` 和 `when_to_use` 文本:将关键用例放在首位,因为每个条目的组合文本被限制在 1,536 个字符,无论预算如何。该上限可通过 [`skillListingMaxDescChars`](/docs/zh-CN/settings-reference#skilllistingmaxdescchars) 配置。

1138 1147 

1139<h2 id="related-resources">1148<h2 id="related-resources">

1140 相关资源1149 相关资源

sub-agents.md +5 −3

Details

304| `name` | 是 | 使用小写字母和连字符的唯一标识符。[Hooks](/docs/zh-CN/hooks#subagentstart) 将此值作为 `agent_type` 接收。文件名不必匹配。名称不能包含 `:`,这是为 [plugin-scoped identifiers](/docs/zh-CN/plugins) 保留的,例如 `my-plugin:reviewer`。Claude Code 不加载名称包含一个的文件,并向调试日志记录错误。在 v2.1.218 之前,这样的名称被接受 |304| `name` | 是 | 使用小写字母和连字符的唯一标识符。[Hooks](/docs/zh-CN/hooks#subagentstart) 将此值作为 `agent_type` 接收。文件名不必匹配。名称不能包含 `:`,这是为 [plugin-scoped identifiers](/docs/zh-CN/plugins) 保留的,例如 `my-plugin:reviewer`。Claude Code 不加载名称包含一个的文件,并向调试日志记录错误。在 v2.1.218 之前,这样的名称被接受 |

305| `description` | 是 | Claude 何时应该委托给此 subagent |305| `description` | 是 | Claude 何时应该委托给此 subagent |

306| `tools` | 否 | [Tools](#available-tools) subagent 可以使用。如果省略,继承 subagents 可用的每个工具。如果列表中没有条目解析为工具,subagent 通常 [fails to launch](/docs/zh-CN/errors#agent-would-be-spawned-with-zero-tools) 并出现错误,命名条目。要将 Skills 预加载到上下文中,请使用 `skills` 字段而不是在此处列出 `Skill` |306| `tools` | 否 | [Tools](#available-tools) subagent 可以使用。如果省略,继承 subagents 可用的每个工具。如果列表中没有条目解析为工具,subagent 通常 [fails to launch](/docs/zh-CN/errors#agent-would-be-spawned-with-zero-tools) 并出现错误,命名条目。要将 Skills 预加载到上下文中,请使用 `skills` 字段而不是在此处列出 `Skill` |

307| `disallowedTools` | 否 | 要拒绝的工具,从继承或指定的列表中删除 |307| `disallowedTools` | 否 | 要拒绝的工具,从继承或指定的列表中删除。带有说明符的条目,例如 `Bash(git push *)`,仍然 [removes the whole tool](#available-tools) |

308| `model` | 否 | [Model](#choose-a-model) 使用:`sonnet`、`opus`、`haiku`、`fable`、完整模型 ID(例如,`claude-opus-5`)或 `inherit`。当您省略它时,Claude Code 在 [subagent model order](#choose-a-model) 中选择模型 |308| `model` | 否 | [Model](#choose-a-model) 使用:`sonnet`、`opus`、`haiku`、`fable`、完整模型 ID(例如,`claude-opus-5`)或 `inherit`。当您省略它时,Claude Code 在 [subagent model order](#choose-a-model) 中选择模型 |

309| `permissionMode` | 否 | [Permission mode](#permission-modes):`default`、`acceptEdits`、`auto`、`dontAsk`、`bypassPermissions`、`plan` 或 `manual` 作为 `default` 的别名。`manual` 别名需要 Claude Code v2.1.200 或更高版本。对于 [plugin subagents](#choose-the-subagent-scope) 被忽略 |309| `permissionMode` | 否 | [Permission mode](#permission-modes):`default`、`acceptEdits`、`auto`、`dontAsk`、`bypassPermissions`、`plan` 或 `manual` 作为 `default` 的别名。`manual` 别名需要 Claude Code v2.1.200 或更高版本。对于 [plugin subagents](#choose-the-subagent-scope) 被忽略 |

310| `maxTurns` | 否 | subagent 停止前的最大代理轮数。当 subagent 达到限制时,Claude Code 返回其输出标记为部分,Claude 可以 [resume it](#resume-subagents) 继续。部分标记需要 Claude Code v2.1.246 或更高版本 |310| `maxTurns` | 否 | subagent 停止前的最大代理轮数。当 subagent 达到限制时,Claude Code 返回其输出标记为部分,Claude 可以 [resume it](#resume-subagents) 继续。部分标记需要 Claude Code v2.1.246 或更高版本 |


427 可用工具427 可用工具

428</h4>428</h4>

429 429 

430Subagents 继承主对话中可用的 [built-in tools](/docs/zh-CN/tools-reference) 和 MCP 工具,由两个过滤器缩小:第一个从每个 subagent 删除工具的短列表,第二个为在 [background](#run-subagents-in-foreground-or-background) 中运行的 subagents 减少内置工具集,这是默认值。[Forks](#fork-the-current-conversation) 跳过两个过滤器并接收主对话的确切工具池。第一个过滤器删除这些工具,即使在 `tools` 字段中列出:430Subagents 继承主对话中可用的 [built-in tools](/docs/zh-CN/tools-reference) 和 MCP 工具,由两个过滤器缩小:第一个从每个 subagent 删除工具的短列表,第二个为在 [background](#run-subagents-in-foreground-or-background) 中运行的 subagents 减少内置工具集,这是默认值。在 macOS、Linux 和 WSL 上,当主对话没有 Glob 和 Grep 工具时,subagent 也可以接收它们,如 [Glob tool behavior](/docs/zh-CN/tools-reference#glob-tool-behavior) 下所述。[Forks](#fork-the-current-conversation) 跳过两个过滤器并接收主对话的确切工具池。第一个过滤器删除这些工具,即使在 `tools` 字段中列出:

431 431 

432* `Agent`,当 subagent 在 [depth limit](#let-subagents-spawn-their-own-subagents);在 [fork](#fork-the-current-conversation) 中工具保持列出但返回错误而不是生成432* `Agent`,当 subagent 在 [depth limit](#let-subagents-spawn-their-own-subagents);在 [fork](#fork-the-current-conversation) 中工具保持列出但返回错误而不是生成

433* `AskUserQuestion`433* `AskUserQuestion`


481---481---

482```482```

483 483 

484一个 `disallowedTools` 条目带有说明符,例如 `Bash(git push *)`,仍然从 subagent 删除整个工具,而不仅仅是匹配的命令。要保留 Bash 并阻止特定命令,请在您的设置中向 `permissions.deny` 添加 [Bash deny rule](/docs/zh-CN/permissions#bash),例如 `Bash(git push *)`。该规则适用于主对话和 subagents。

485 

484<h4 id="restrict-which-subagents-can-be-spawned">486<h4 id="restrict-which-subagents-can-be-spawned">

485 限制可以生成哪些 subagents487 限制可以生成哪些 subagents

486</h4>488</h4>


572 权限模式574 权限模式

573</h4>575</h4>

574 576 

575设置 `permissionMode` 以选择 subagent 运行的权限模式。使用模式的配置值,因此手动模式是 `default`。如果您不设置它,subagent 继承主对话的模式;在 Pro、Max 和 Team 计划上,该模式一开始是 [auto mode](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode),除非您的设置或您的组织更改了它。577设置 `permissionMode` 以选择 subagent 运行的权限模式。使用模式的配置值,因此手动模式是 `default`。如果您不设置它,subagent 继承主对话的模式,该模式在 Pro、Max 和 Team 计划上一开始是 [auto mode](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode),除非您的设置或您的组织更改了它。

576 578 

577主对话的权限模式决定 Claude Code 是否使用您设置的值:579主对话的权限模式决定 Claude Code 是否使用您设置的值:

578 580 

Details

226 在消息和指示器中发出成功、失败和警告状态的信号。226 在消息和指示器中发出成功、失败和警告状态的信号。

227 227 

228 | 令牌 | 控制 |228 | 令牌 | 控制 |

229 | :-------- | :------------- |229 | :-------- | :-------------- |

230 | `success` | 成功消息和通过的检查 |230 | `success` | 成功消息和通过的检查 |

231 | `error` | 错误消息和失败 |231 | `error` | 错误消息和失败 |

232 | `warning` | 警告、注意消息和自动模式边框 |232 | `warning` | 警告、注意消息和自动模式指示器 |

233 | `merged` | 合并的拉取请求状态 |233 | `merged` | 合并的拉取请求状态 |

234 234 

235 <h4 id="input-box-and-mode-indicators">235 <h4 id="input-box-and-mode-indicators">


240 240 

241 | 令牌 | 控制 |241 | 令牌 | 控制 |

242 | :------------- | :--------------------------------------------------------------------------------------------------------------------- |242 | :------------- | :--------------------------------------------------------------------------------------------------------------------- |

243 | `promptBorder` | Manual mode 中的输入框边框 |243 | `promptBorder` | 输入框边框 |

244 | `planMode` | Plan Mode 强调和边框 |244 | `planMode` | Plan Mode 强调、Plan Mode 消息和 Plan Mode 对话框 |

245 | `autoAccept` | Accept-edits mode 强调和边框 |245 | `autoAccept` | Accept-edits mode 强调 |

246 | `bashBorder` | 输入 `!` shell 命令时的输入框边框 |246 | `bashBorder` | 输入 `!` shell 命令时的输入框边框 |

247 | `ide` | IDE 连接指示器 |247 | `ide` | IDE 连接指示器 |

248 | `fastMode` | Fast mode 指示器 |248 | `fastMode` | Fast mode 指示器 |

Details

227 投资文档和内存227 投资文档和内存

228</h3>228</h3>

229 229 

230我们强烈建议投资文档,以便 Claude Code 理解您的代码库。组织可以在多个级别部署 CLAUDE.md 文件:230我们强烈建议投资文档,以便 Claude Code 理解您的代码库。组织可以在多个级别部署 CLAUDE.md 文件。请参阅[CLAUDE.md 文件可以存放的位置](/docs/zh-CN/memory#choose-where-to-put-claude-md-files)和[如何部署组织范围的 CLAUDE.md](/docs/zh-CN/memory#deploy-organization-wide-claude-md)。

231 

232* **组织范围**:部署到系统目录,如 `/Library/Application Support/ClaudeCode/CLAUDE.md`(macOS)、`/etc/claude-code/CLAUDE.md`(Linux 和 WSL)或 `C:\Program Files\ClaudeCode\CLAUDE.md`(Windows),用于公司范围的标准

233* **存储库级别**:在存储库根目录中创建 `CLAUDE.md` 文件,包含项目架构、构建命令和贡献指南。将这些检入源代码控制,以便所有用户受益

234 

235在[内存和 CLAUDE.md 文件](/docs/zh-CN/memory)中了解更多。

236 231 

237<h3 id="simplify-deployment">232<h3 id="simplify-deployment">

238 简化部署233 简化部署

tools-reference.md +22 −16

Details

50| `SendUserFile` | 从会话向您发送文件,带有可选标题,以便生成的报告、图表、屏幕截图或构建的工件到达您的设备,而不仅仅在成绩单中提及。从 v2.1.196 开始,可选的 `display` 输入控制呈现:`render` 在客户端中内联打开文件,`attach` 仅显示下载卡,未设置时客户端按文件类型决定。在连接[远程控制](/docs/zh-CN/remote-control)客户端或会话在托管云环境(例如[网络版 Claude Code](/docs/zh-CN/claude-code-on-the-web))中运行时可用。传递通过 Anthropic 托管的基础设施运行,因此该工具在 Amazon Bedrock、Google Cloud 的 Agent Platform 或 Microsoft Foundry 上不可用 | 否 |50| `SendUserFile` | 从会话向您发送文件,带有可选标题,以便生成的报告、图表、屏幕截图或构建的工件到达您的设备,而不仅仅在成绩单中提及。从 v2.1.196 开始,可选的 `display` 输入控制呈现:`render` 在客户端中内联打开文件,`attach` 仅显示下载卡,未设置时客户端按文件类型决定。在连接[远程控制](/docs/zh-CN/remote-control)客户端或会话在托管云环境(例如[网络版 Claude Code](/docs/zh-CN/claude-code-on-the-web))中运行时可用。传递通过 Anthropic 托管的基础设施运行,因此该工具在 Amazon Bedrock、Google Cloud 的 Agent Platform 或 Microsoft Foundry 上不可用 | 否 |

51| `ShareOnboardingGuide` | 上传 `ONBOARDING.md` 并返回队友可以在 Claude Code 中打开的共享链接。在编写指南后从 `/team-onboarding` 调用。适用于 Pro、Max、Team 和 Enterprise 计划上的 claude.ai 订阅者 | 是 |51| `ShareOnboardingGuide` | 上传 `ONBOARDING.md` 并返回队友可以在 Claude Code 中打开的共享链接。在编写指南后从 `/team-onboarding` 调用。适用于 Pro、Max、Team 和 Enterprise 计划上的 claude.ai 订阅者 | 是 |

52| `Skill` | 在主对话中执行[skill](/docs/zh-CN/skills#control-who-invokes-a-skill) | 是 |52| `Skill` | 在主对话中执行[skill](/docs/zh-CN/skills#control-who-invokes-a-skill) | 是 |

53| `TaskCreate` | 在任务列表中创建新任务。Claude Code 在[任务工具可用性](#task-tool-availability)下列出的模型上将其排除,除非您选择加入 | 否 |53| `TaskCreate` | 在任务列表中创建新任务。仅在[任务工具可用性](#task-tool-availability)下列出的模型上默认提供,在其他模型上当您选择加入时提供 | 否 |

54| `TaskGet` | 检索特定任务的完整详细信息。Claude Code 在[任务工具可用性](#task-tool-availability)下列出的模型上将其排除,除非您选择加入 | 否 |54| `TaskGet` | 检索特定任务的完整详细信息。仅在[任务工具可用性](#task-tool-availability)下列出的模型上默认提供,在其他模型上当您选择加入时提供 | 否 |

55| `TaskList` | 列出所有任务及其当前状态。Claude Code 在[任务工具可用性](#task-tool-availability)下列出的模型上将其排除,除非您选择加入 | 否 |55| `TaskList` | 列出所有任务及其当前状态。仅在[任务工具可用性](#task-tool-availability)下列出的模型上默认提供,在其他模型上当您选择加入时提供 | 否 |

56| `TaskOutput` | 从后台任务检索输出。已弃用,改为在任务的输出文件路径上使用 `Read`。当没有任务与 ID 匹配时,错误按 ID 和描述列出运行的后台代理。在 v2.1.203 之前,错误仅命名缺失的 ID | 否 |56| `TaskOutput` | 从后台任务检索输出。已弃用,改为在任务的输出文件路径上使用 `Read`。当没有任务与 ID 匹配时,错误按 ID 和描述列出运行的后台代理。在 v2.1.203 之前,错误仅命名缺失的 ID | 否 |

57| `TaskStop` | 按 ID 停止运行的后台任务。它还接受[代理团队队友](/docs/zh-CN/agent-teams)或按代理 ID 或名称命名的后台代理。在 v2.1.198 之前,它仅接受后台任务 ID。当没有任务与 ID 匹配时,错误按 ID 和描述列出运行的后台代理,包括另一个代理生成的代理。在 v2.1.203 之前,错误列出了运行的队友和命名的代理,但不是另一个代理生成的后台代理,因此无法从主对话中识别或停止这些代理 | 否 |57| `TaskStop` | 按 ID 停止运行的后台任务。它还接受[代理团队队友](/docs/zh-CN/agent-teams)或按代理 ID 或名称命名的后台代理。在 v2.1.198 之前,它仅接受后台任务 ID。当没有任务与 ID 匹配时,错误按 ID 和描述列出运行的后台代理,包括另一个代理生成的代理。在 v2.1.203 之前,错误列出了运行的队友和命名的代理,但不是另一个代理生成的后台代理,因此无法从主对话中识别或停止这些代理 | 否 |

58| `TaskUpdate` | 更新任务状态、依赖项、详细信息或删除任务。Claude Code 在[任务工具可用性](#task-tool-availability)下列出的模型上将其排除,除非您选择加入 | 否 |58| `TaskUpdate` | 更新任务状态、依赖项、详细信息或删除任务。仅在[任务工具可用性](#task-tool-availability)下列出的模型上默认提供,在其他模型上当您选择加入时提供 | 否 |

59| `TodoWrite` | 管理会话任务清单。默认禁用,改为使用 `TaskCreate`、`TaskGet`、`TaskList` 和 `TaskUpdate`。设置 `CLAUDE_CODE_ENABLE_TASKS=0` 以在[具有任务跟踪工具的会话](#task-tool-availability)中重新启用它 | 否 |59| `TodoWrite` | 管理会话任务清单。默认禁用,改为使用 `TaskCreate`、`TaskGet`、`TaskList` 和 `TaskUpdate`。设置 `CLAUDE_CODE_ENABLE_TASKS=0` 以在[具有任务跟踪工具的会话](#task-tool-availability)中重新启用它 | 否 |

60| `ToolSearch` | 当[工具搜索](/docs/zh-CN/mcp#scale-with-mcp-tool-search)启用时,搜索并加载延迟工具 | 否 |60| `ToolSearch` | 当[工具搜索](/docs/zh-CN/mcp#scale-with-mcp-tool-search)启用时,搜索并加载延迟工具 | 否 |

61| `WaitForMcpServers` | 等待一个或多个仍在后台连接的 [MCP 服务器](/docs/zh-CN/mcp),以便请求可以使用它们的工具而无需重启会话。当所需的服务器尚未连接时,Claude 会调用它。仅在[工具搜索](/docs/zh-CN/mcp#scale-with-mcp-tool-search)禁用时出现,因为启用时 `ToolSearch` 处理等待 | 否 |61| `WaitForMcpServers` | 等待一个或多个仍在后台连接的 [MCP 服务器](/docs/zh-CN/mcp),以便请求可以使用它们的工具而无需重启会话。当所需的服务器尚未连接时,Claude 会调用它。仅在[工具搜索](/docs/zh-CN/mcp#scale-with-mcp-tool-search)禁用时出现,因为启用时 `ToolSearch` 处理等待 | 否 |


73* 在设置中的 [`permissions.allow`](/docs/zh-CN/settings-reference#permissions-allow) 和 [`permissions.deny`](/docs/zh-CN/settings-reference#permissions-deny),以及 `/permissions` 界面73* 在设置中的 [`permissions.allow`](/docs/zh-CN/settings-reference#permissions-allow) 和 [`permissions.deny`](/docs/zh-CN/settings-reference#permissions-deny),以及 `/permissions` 界面

74* 在 [`--allowedTools` 和 `--disallowedTools`](/docs/zh-CN/cli-reference) CLI 标志中74* 在 [`--allowedTools` 和 `--disallowedTools`](/docs/zh-CN/cli-reference) CLI 标志中

75* 在 Agent SDK 的 [`allowedTools` 和 `disallowedTools`](/docs/zh-CN/agent-sdk/permissions#allow-and-deny-rules) 选项中75* 在 Agent SDK 的 [`allowedTools` 和 `disallowedTools`](/docs/zh-CN/agent-sdk/permissions#allow-and-deny-rules) 选项中

76* 在 [subagent 的 `tools` 或 `disallowedTools`](/docs/zh-CN/sub-agents#supported-frontmatter-fields) frontmatter 中

77* 在 [skill 的 `allowed-tools`](/docs/zh-CN/skills#frontmatter-reference) frontmatter 中76* 在 [skill 的 `allowed-tools`](/docs/zh-CN/skills#frontmatter-reference) frontmatter 中

78* 在 hook 的 [`if` 条件](/docs/zh-CN/hooks-guide#filter-by-tool-name-and-arguments-with-the-if-field)中77* 在 hook 的 [`if` 条件](/docs/zh-CN/hooks-guide#filter-by-tool-name-and-arguments-with-the-if-field)中

79 78 


197 196 

198[前台子代理](/docs/zh-CN/sub-agents#run-subagents-in-foreground-or-background)启动的命令在该子代理给出最终响应时停止。主对话或后台子代理启动的命令在最终响应后继续运行。在使用 `-p` 标志的非交互模式下,[后台命令在运行的最终结果后不久结束](/docs/zh-CN/headless#background-tasks-at-exit)。197[前台子代理](/docs/zh-CN/sub-agents#run-subagents-in-foreground-or-background)启动的命令在该子代理给出最终响应时停止。主对话或后台子代理启动的命令在最终响应后继续运行。在使用 `-p` 标志的非交互模式下,[后台命令在运行的最终结果后不久结束](/docs/zh-CN/headless#background-tasks-at-exit)。

199 198 

200当命令在完成前达到其超时时,Claude Code 会将其移到后台而不是停止它。Claude 在命令继续时继续工作。Claude Code 对移动的命令应用与任何其他后台命令相同的生命周期规则,因此它仍然在该子代理的最终响应时结束前台子代理的命令。设置 [`CLAUDE_CODE_DISABLE_BACKGROUND_TASKS=1`](/docs/zh-CN/env-vars#variables) 禁用自动后台处理以及其余后台任务功能。199当命令在完成前达到其超时时,Claude Code 会将其移到后台而不是停止它,除非命令以 `sleep` 开头。Claude 在命令继续时继续工作。Claude Code 对移动的命令应用与任何其他后台命令相同的生命周期规则,因此它仍然在该子代理的最终响应时结束前台子代理的命令。设置 [`CLAUDE_CODE_DISABLE_BACKGROUND_TASKS=1`](/docs/zh-CN/env-vars#variables) 禁用自动后台处理以及其余后台任务功能。

201 

202Claude Code 永远不会自动后台处理三种命令。它在超时时停止它们:

203 

204* 以 `sleep` 开头的命令。

205* 在其中任何地方运行 `git` 的命令。

206* Claude Code 无法完全解析为简单命令的复合命令。Claude Code 将参数扩展(例如 `${VAR}`)视为无法解析,因此它在超时时停止以 `; exit "${PIPESTATUS[0]}"` 结尾的命令,即使该命令的其余部分可以解析。

207 200 

208移到后台的命令的结果说明发生了什么:201移到后台的命令的结果说明发生了什么:

209 202 


292 Glob 工具行为285 Glob 工具行为

293</h2>286</h2>

294 287 

295Glob 工具通过名称模式查找文件。它支持标准 glob 语法,包括用于递归目录匹配的 `**`:288Glob 工具通过名称模式查找文件。在 Windows 上,它是默认工具集的一部分。在 macOS、Linux 和 WSL 上,Claude Code 将 Glob 和 [Grep](#grep-tool-behavior) 排除在默认工具集之外,Claude 改为通过 Bash 工具使用 `find` 和 `grep` 进行搜索。在 Claude 的 shell 中,这两个命令运行 `bfs` 和 `ugrep` 的嵌入式版本,搜索通过 `Bash` 调用到达你的 hooks 和权限规则。

289 

290在 macOS、Linux 和 WSL 上,你可以在以下情况下恢复 Glob 和 Grep 工具:

291 

292* 你在启动会话时在 [`--tools` 或 `--allowedTools`](/docs/zh-CN/cli-reference#cli-flags) 中命名 `Glob` 或 `Grep`,或在等效的 [Agent SDK](/docs/zh-CN/agent-sdk/overview) 选项中命名。使用 `--tools` 时,你会获得列出的工具,在 `--allowedTools` 中命名任一工具会恢复两者。设置文件中的允许规则没有这种效果。

293* 权限 [拒绝规则](/docs/zh-CN/permissions#match-all-uses-of-a-tool)、`--disallowedTools` 标志或 [`--restricted`](/docs/zh-CN/cli-reference#cli-flags) 从会话中移除 `Bash`。

294* [子代理](/docs/zh-CN/sub-agents#available-tools) 在其 `tools` 字段中列出 `Glob` 或 `Grep` 并排除 `Bash`。列出的工具仅对该子代理返回,或在通过 [`--agent`](/docs/zh-CN/sub-agents#invoke-subagents-explicitly) 或 `agent` 设置作为主会话代理运行时对整个会话返回。

295 

296Glob 支持标准 glob 语法,包括用于递归目录匹配的 `**`:

296 297 

297* `**/*.js` 匹配任何深度的所有 `.js` 文件298* `**/*.js` 匹配任何深度的所有 `.js` 文件

298* `src/**/*.ts` 匹配 `src/` 下的所有 `.ts` 文件299* `src/**/*.ts` 匹配 `src/` 下的所有 `.ts` 文件


310 Grep 工具行为311 Grep 工具行为

311</h2>312</h2>

312 313 

313Grep 工具在文件内容中搜索模式。[Glob](#glob-tool-behavior) 按名称查找文件,而 Grep 在文件内部查找行。314Grep 工具在文件内容中搜索模式。[Glob](#glob-tool-behavior) 按名称查找文件,而 Grep 在文件内部查找行。在 macOS、Linux 和 WSL 上,Grep 在与 Glob 相同的条件下默认不可用。有关两个工具何时可用的信息,请参阅 [Glob 工具行为](#glob-tool-behavior)。

314 315 

315Grep 基于 [ripgrep](https://github.com/BurntSushi/ripgrep) 构建,使用 ripgrep 的正则表达式语法,而不是 POSIX grep。包含正则表达式元字符的模式需要转义。例如,在 Go 代码中查找 `interface{}` 需要使用模式 `interface\{\}`。316Grep 基于 [ripgrep](https://github.com/BurntSushi/ripgrep) 构建,使用 ripgrep 的正则表达式语法,而不是 POSIX grep。包含正则表达式元字符的模式需要转义。例如,在 Go 代码中查找 `interface{}` 需要使用模式 `interface\{\}`。

316 317 


581 Task 工具可用性582 Task 工具可用性

582</h2>583</h2>

583 584 

584在 Claude Code v2.1.233 及更高版本中,除非您选择加入,否则以下工具在 Opus 4.8、Sonnet 5、Fable 5、Mythos 5 或这些系列的更高版本上不可用:`TodoWrite`、`TaskCreate`、`TaskGet`、`TaskUpdate` 和 `TaskList`。这些模型可以在没有书面清单的情况下跟踪多步骤工作,而这些工具的定义和提醒会占用上下文,因此 Claude Code 会将其排除。没有它们,Claude 在工作时不会向[任务列表](/docs/zh-CN/interactive-mode#task-list)添加任何内容。在任何其他模型上,例如 Opus 4.7,Claude Code 默认提供四个 Task 工具,仅当您设置 [`CLAUDE_CODE_ENABLE_TASKS=0`](/docs/zh-CN/env-vars) 时才提供 `TodoWrite`。585Task 跟踪工具 `TaskCreate`、`TaskGet`、`TaskUpdate`、`TaskList` 和 `TodoWrite` 默认仅在 Claude 3.x 模型、Opus 4 至 4.7、Sonnet 4 至 4.6 和 Haiku 4.5 上可用。只要这些工具可用,您就会获得四个 Task 工具,或者当您设置 [`CLAUDE_CODE_ENABLE_TASKS=0`](/docs/zh-CN/env-vars) 时改为获得 `TodoWrite`。

586 

587在所有其他模型上,Claude Code 会排除这些工具,除非您选择加入。这同样适用于 Claude Code 无法识别的模型 ID,例如通过 [LLM 网关](/docs/zh-CN/llm-gateway)提供的自定义模型名称。在较新的模型上,Claude 可以在没有书面清单的情况下跟踪多步骤工作,而这些工具的定义和提醒会占用上下文。没有这些工具,Claude 在工作时不会向[任务列表](/docs/zh-CN/interactive-mode#task-list)添加任何内容。

585 588 

586如果您仍想在列出的模型之一上使用这些工具,请执行以下操作之一:589如果您想在默认情况下没有这些工具的模型上使用它们,请执行以下操作之一:

587 590 

588* 在启动 Claude Code 之前导出 [`CLAUDE_CODE_ENABLE_TODO_TOOLS=1`](/docs/zh-CN/env-vars),例如 `CLAUDE_CODE_ENABLE_TODO_TOOLS=1 claude`。Claude Code 随后会在每个模型和每个提供商上提供相同的工具591* 在启动 Claude Code 之前导出 [`CLAUDE_CODE_ENABLE_TODO_TOOLS=1`](/docs/zh-CN/env-vars),例如 `CLAUDE_CODE_ENABLE_TODO_TOOLS=1 claude`。Claude Code 随后会在每个模型和每个提供商上提供相同的工具

589* 在 [`--allowedTools`](/docs/zh-CN/cli-reference#cli-flags) 中命名其中一个工具,例如 `claude --allowedTools TaskCreate`592* 在 [`--allowedTools`](/docs/zh-CN/cli-reference#cli-flags) 中命名其中一个工具,例如 `claude --allowedTools TaskCreate`


594 597 

595Claude Code 仅在您的会话拥有这些工具时才会将其提供给子代理,即使子代理运行不同的模型也是如此。进程内[代理团队](/docs/zh-CN/agent-teams)队友以相同的方式跟随您的会话,而在其自己的[分割窗格](/docs/zh-CN/agent-teams#choose-a-display-mode)中的队友作为单独的 Claude Code 进程运行,因此其自己的模型决定。没有 Task 工具,代理通过消息而不是[共享任务列表](/docs/zh-CN/agent-teams#assign-and-claim-tasks)与其团队协调。598Claude Code 仅在您的会话拥有这些工具时才会将其提供给子代理,即使子代理运行不同的模型也是如此。进程内[代理团队](/docs/zh-CN/agent-teams)队友以相同的方式跟随您的会话,而在其自己的[分割窗格](/docs/zh-CN/agent-teams#choose-a-display-mode)中的队友作为单独的 Claude Code 进程运行,因此其自己的模型决定。没有 Task 工具,代理通过消息而不是[共享任务列表](/docs/zh-CN/agent-teams#assign-and-claim-tasks)与其团队协调。

596 599 

600此处描述的默认集合适用于 Claude Code v2.1.268 及更高版本。

601 

597<h2 id="webfetch-tool-behavior">602<h2 id="webfetch-tool-behavior">

598 WebFetch 工具行为603 WebFetch 工具行为

599</h2>604</h2>


607* HTTP URL 会自动升级到 HTTPS。612* HTTP URL 会自动升级到 HTTPS。

608* 大型页面在处理前会被截断到固定的字符限制。613* 大型页面在处理前会被截断到固定的字符限制。

609* WebFetch 默认缓存每个响应 15 分钟,所以重复获取同一 URL 会快速返回。在 Claude Code v2.1.233 或更高版本上,设置 [`CLAUDE_CODE_WEBFETCH_CACHE_TTL_MS`](/docs/zh-CN/env-vars#variables) 以更改 WebFetch 保留每个响应的时长。614* WebFetch 默认缓存每个响应 15 分钟,所以重复获取同一 URL 会快速返回。在 Claude Code v2.1.233 或更高版本上,设置 [`CLAUDE_CODE_WEBFETCH_CACHE_TTL_MS`](/docs/zh-CN/env-vars#variables) 以更改 WebFetch 保留每个响应的时长。

615* 一个页面如果在五分钟内未完成下载,包括 WebFetch 跟随的任何重定向,则会因截止期限错误而失败。在 Claude Code v2.1.268 或更高版本上,设置 [`CLAUDE_CODE_WEBFETCH_DEADLINE_MS`](/docs/zh-CN/env-vars#variables) 以更改限制,或设置为 `0` 以移除它。

610* 当 URL 重定向到不同的主机时,WebFetch 返回一个文本结果,命名原始 URL 和重定向目标,而不是跟随它。Claude 然后使用第二个 WebFetch 调用获取新 URL。616* 当 URL 重定向到不同的主机时,WebFetch 返回一个文本结果,命名原始 URL 和重定向目标,而不是跟随它。Claude 然后使用第二个 WebFetch 调用获取新 URL。

611* 当提取步骤遇到过载的 API 时,Claude Code 会使用退避重试它;仍然失败的获取会返回错误结果。在 v2.1.212 之前,API 错误文本可能会作为提取的页面内容到达 Claude。617* 当提取步骤遇到过载的 API 时,Claude Code 会使用退避重试它;仍然失败的获取会返回错误结果。在 v2.1.212 之前,API 错误文本可能会作为提取的页面内容到达 Claude。

612 618 

Details

110 110 

111要让管道命令直接到达剪贴板,请将 `pbcopy *`、`wl-copy *` 或 `xclip *` 添加到 [`excludedCommands`](/docs/zh-CN/settings-reference#sandbox-excludedcommands),以便命令在沙箱外运行。111要让管道命令直接到达剪贴板,请将 `pbcopy *`、`wl-copy *` 或 `xclip *` 添加到 [`excludedCommands`](/docs/zh-CN/settings-reference#sandbox-excludedcommands),以便命令在沙箱外运行。

112 112 

113<h3 id="copied-text-doesn’t-reach-your-local-clipboard-over-ssh">

114 复制的文本在 SSH 上无法到达您的本地剪贴板

115</h3>

116 

117当 Claude Code 通过 SSH 在远程机器上运行时,它无法在您的本地机器上运行剪贴板工具。在 tmux 外,当您在[全屏渲染](/docs/zh-CN/fullscreen)中选择文本或运行 `/copy` 时,Claude Code 会将文本作为 OSC 52 转义序列发送到您的终端。您的终端决定是否将其放在您的剪贴板上。`/copy` 报告 `Copied to clipboard`,无论文本是否到达,在 tmux 外,选择通知读取 `sent N chars via OSC 52`。

118 

119某些终端不对 OSC 52 进行操作。iTerm2 忽略它,直到您打开**Settings > General > Selection > Applications in terminal may access clipboard**,macOS Terminal.app 不支持它。

120 

121要在没有 OSC 52 的情况下获取文本:

122 

123* 按住您的终端的本机选择键同时拖动,然后使用您的终端的常用快捷方式复制,例如 `Cmd+C`。该键在 Terminal.app 中是 `Fn`,在 iTerm2 中是 `Option`。[保持本机文本选择](/docs/zh-CN/fullscreen#keep-native-text-selection)为其他终端列出了它。

124* 在远程机器上设置 [`CLAUDE_CODE_DISABLE_MOUSE=1`](/docs/zh-CN/env-vars),以便您的终端为整个会话处理选择。

125 

113<h3 id="search-and-discovery-issues">126<h3 id="search-and-discovery-issues">

114 搜索和发现问题127 搜索和发现问题

115</h3>128</h3>

vs-code.md +32 −6

Details

56 56 

57 打开 Claude Code 的其他方式:57 打开 Claude Code 的其他方式:

58 58 

59 * **活动栏**:点击左侧边栏中的 Spark 图标以打开会话列表。点击任何会话以将其作为完整编辑器选项卡打开,或开始新的会话。此图标在活动栏中始终可见。59 * **活动栏**:点击左侧边栏中的 Spark 图标以打开会话列表。点击任何会话以在您的[首选位置](#extension-settings)中打开它,或开始新的会话。此图标在活动栏中始终可见。

60 * **命令面板**:`Cmd+Shift+P`(Mac)或 `Ctrl+Shift+P`(Windows/Linux),输入"Claude Code",然后选择一个选项,如"在新选项卡中打开"60 * **命令面板**:`Cmd+Shift+P`(Mac)或 `Ctrl+Shift+P`(Windows/Linux),输入"Claude Code",然后选择一个选项,如"在新选项卡中打开"

61 * **状态栏**:如果您已将 [`preferredLocation`](#extension-settings) 设置为 `sidebar`,或使用**Claude Code: Open in Side Bar** 打开了 Claude,请点击窗口右下角的 **✱ Claude Code**。即使没有打开文件,这也有效。61 * **状态栏**:如果您已将 [`preferredLocation`](#extension-settings) 设置为 `sidebar`,或使用**Claude Code: Open in Side Bar** 打开了 Claude,请点击窗口右下角的 **✱ Claude Code**。即使没有打开文件,这也有效。

62 62 


110 * **Manual**:Claude 在文件编辑和大多数 shell 命令之前请求权限。110 * **Manual**:Claude 在文件编辑和大多数 shell 命令之前请求权限。

111 * **Plan**:Claude 描述它将做什么,并在进行更改之前等待批准。VS Code 自动将计划作为完整的 Markdown 文档打开,您可以在其中添加内联注释以在 Claude 开始之前提供反馈。111 * **Plan**:Claude 描述它将做什么,并在进行更改之前等待批准。VS Code 自动将计划作为完整的 Markdown 文档打开,您可以在其中添加内联注释以在 Claude 开始之前提供反馈。

112 * **Edit automatically**:Claude 进行编辑而不询问。112 * **Edit automatically**:Claude 进行编辑而不询问。

113* **Model**:从命令菜单中选择 **Switch model…** 以在会话中途更改模型。您也可以点击提示框底部的模型名称来打开相同的选择器。当当前模型支持[工作量级别](/docs/zh-CN/model-config#adjust-effort-level)时,选择器还会显示 **Effort** 行。模型名称按钮和 **Effort** 行需要 Claude Code v2.1.257 或更高版本。113* **Model**:从命令菜单中选择 **Switch model…** 以在会话中途更改模型。您也可以点击提示框底部的模型名称来打开相同的选择器。当当前模型支持[工作量级别](/docs/zh-CN/model-config#adjust-effort-level)时,选择器还会显示 **Effort** 行和模型名称按钮显示选定的级别。模型名称按钮和 **Effort** 行需要 Claude Code v2.1.257 或更高版本。

114* **Command menu**:点击 `/` 或输入 `/` 来打开命令菜单。选项包括附加文件、切换模型和切换扩展思考。Customize 部分提供对 MCP 服务器、slash commands、输出样式、hooks、memory、权限和插件的访问。带有终端图标的项目在集成终端中打开。114* **Command menu**:点击 `/` 或输入 `/` 来打开命令菜单。选项包括附加文件、切换模型和切换扩展思考。Customize 部分提供对 MCP 服务器、slash commands、输出样式、hooks、memory、权限和插件的访问。带有终端图标的项目在集成终端中打开。

115 * 要浏览 `/usage` 或 [`/remote-control`](/docs/zh-CN/remote-control) 等命令,请在 Customize 部分中选择 **Slash commands**。对话框会列出它们并带有过滤框。选择一个来运行它。在提示框中输入 `/` 仍会内联建议命令。需要 Claude Code v2.1.257 或更高版本。115 * 要浏览 `/usage` 或 [`/remote-control`](/docs/zh-CN/remote-control) 等命令,请在 Customize 部分中选择 **Slash commands**。对话框会列出它们并带有过滤框。选择一个来运行它。在提示框中输入 `/` 仍会内联建议命令。需要 Claude Code v2.1.257 或更高版本。

116 * 在 Customize 部分中选择 **Output styles** 来选择[输出样式](/docs/zh-CN/output-styles),包括您的自定义样式。需要 Claude Code v2.1.257 或更高版本。116 * 在 Customize 部分中选择 **Output styles** 来选择[输出样式](/docs/zh-CN/output-styles),包括您的自定义样式。需要 Claude Code v2.1.257 或更高版本。


141 141 

142当您在编辑器中选择文本时,Claude 可以自动看到您突出显示的代码。提示框页脚显示选择了多少行。按 `Option+K`(Mac)/ `Alt+K`(Windows/Linux)来插入带有文件路径和行号的 @-mention(例如 `@app.ts#5-10`)。点击选择指示器来切换 Claude 是否可以看到您突出显示的文本 - 眼睛斜线图标表示选择对 Claude 隐藏。142当您在编辑器中选择文本时,Claude 可以自动看到您突出显示的代码。提示框页脚显示选择了多少行。按 `Option+K`(Mac)/ `Alt+K`(Windows/Linux)来插入带有文件路径和行号的 @-mention(例如 `@app.ts#5-10`)。点击选择指示器来切换 Claude 是否可以看到您突出显示的文本 - 眼睛斜线图标表示选择对 Claude 隐藏。

143 143 

144您也可以在将文件拖入提示框时按住 `Shift` 来将它们添加为附件。点击任何附件上的 X 来从上下文中删除它。144要附加图像,请从剪贴板将其粘贴到提示框中。您也可以在将文件拖入提示框时按住 `Shift` 来将它们添加为附件。点击任何附件上的 X 来从上下文中删除它。

145 145 

146<h3 id="resume-past-conversations">146<h3 id="resume-past-conversations">

147 恢复过去的对话147 恢复过去的对话

148</h3>148</h3>

149 149 

150点击 Claude Code 面板顶部的 **Session history** 按钮来访问您的对话历史。您可以按关键字搜索或按时间浏览。点击任何对话来恢复它,包含完整的消息历史。有关恢复会话的更多信息,请参阅[管理会话](/docs/zh-CN/sessions)。150点击 Claude Code 面板顶部的 **Session history** 按钮来访问您的对话历史。您可以按关键字搜索或按时间浏览。

151 

152点击任何对话来恢复它,包含完整的消息历史。如果对话已在当前窗口的另一个选项卡中打开,点击它会切换到该选项卡。有关恢复会话的更多信息,请参阅[管理会话](/docs/zh-CN/sessions)。

151 153 

152* **Session titles**:新会话根据您的第一条消息接收 AI 生成的标题。154* **Session titles**:新会话根据您的第一条消息接收 AI 生成的标题。

153* **Rename and archive**:将鼠标悬停在会话上以显示这些操作。重命名以给它一个描述性标题,或存档以将其移动到列表底部的 **Archived sessions** 组。155* **Rename and archive**:将鼠标悬停在会话上以显示这些操作。重命名以给它一个描述性标题,或存档以将其移动到列表底部的 **Archived sessions** 组。


274* **为此项目安装**:与项目协作者共享(项目范围)276* **为此项目安装**:与项目协作者共享(项目范围)

275* **本地安装**:仅供您使用,仅在此存储库中(本地范围)277* **本地安装**:仅供您使用,仅在此存储库中(本地范围)

276 278 

279<h3 id="share-a-plugin-install-link">

280 分享插件安装链接

281</h3>

282 

283要直接向某人发送特定插件的安装链接,请给他们扩展的 `install-plugin` URL。打开它会启动或聚焦 VS Code,打开 Claude Code 面板,并在该插件的范围选择上打开**管理插件**对话框。在该人选择范围之前,不会安装任何内容。如果该插件的市场在他们的 Claude Code 中尚未配置,对话框首先会要求他们添加它。

284 

285```text theme={null}

286vscode://anthropic.claude-code/install-plugin?plugin=code-review&marketplace=anthropics/claude-plugins-official

287```

288 

289该 URL 接受两个查询参数:

290 

291| 参数 | 描述 |

292| ------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |

293| `plugin` | 插件的名称,如其市场所列。必需。 |

294| `marketplace` | 插件的来源,采用 [Marketplaces 选项卡](#manage-marketplaces) 接受的任何形式,例如 GitHub `owner/repo` 或 git URL。如果包含 `&` 等字符,请对其进行 URL 编码。省略时默认为 `anthropics/claude-plugins-official`。 |

295 

296两种情况在对话框中以消息结束,而不是范围选择:

297 

298* **市场中没有列出该名称的插件**:对话框报告未找到该插件。根据市场的列表检查 `plugin` 值。

299* **插件已安装**:对话框会说明这一点,不会发生任何更改。

300 

301GitHub README、问题和某些其他 Markdown 主机会删除其方案不是 `http` 或 `https` 的链接,因此 `vscode://` 链接在那里呈现为纯文本。在这些主机上将 URL 放在代码块中,如 [链接呈现为纯文本而不是可点击的](/docs/zh-CN/deep-links#the-link-renders-as-plain-text-instead-of-being-clickable) 对 `claude-cli://` 链接所描述的那样。

302 

277<h3 id="manage-marketplaces">303<h3 id="manage-marketplaces">

278 管理市场304 管理市场

279</h3>305</h3>


284* 点击刷新图标以更新市场的插件列表310* 点击刷新图标以更新市场的插件列表

285* 点击垃圾桶图标以删除市场311* 点击垃圾桶图标以删除市场

286 312 

287进行更改后,横幅会提示您重启 Claude Code 以应用更改。313您在对话框中所做的插件更改会立即应用到该 VS Code 窗口中打开的 Claude Code 会话。如果您打开对话框的会话无法重新加载其插件,对话框会提供重试或在该会话中重启 Claude 的选项。

288 314 

289<Note>315<Note>

290 VS Code 中的插件管理在底层使用相同的 CLI 命令。您在扩展中配置的插件和市场也可在 CLI 中使用,反之亦然。316 VS Code 中的插件管理在底层使用相同的 CLI 命令。您在扩展中配置的插件和市场也可在 CLI 中使用,反之亦然。


390vscode://anthropic.claude-code/open?prompt=review%20my%20changes416vscode://anthropic.claude-code/open?prompt=review%20my%20changes

391```417```

392 418 

393要启动终端会话而不是 VS Code 选项卡,请使用 CLI 的 `claude-cli://` 处理程序。请参阅[从链接启动会话](/docs/zh-CN/deep-links)。419该扩展还处理 `vscode://anthropic.claude-code/install-plugin`,它[在一个插件上打开插件对话框](#share-a-plugin-install-link)。要启动终端会话而不是 VS Code 选项卡,请使用 CLI 的 `claude-cli://` 处理程序。请参阅[从链接启动会话](/docs/zh-CN/deep-links)。

394 420 

395<h2 id="configure-settings">421<h2 id="configure-settings">

396 配置设置422 配置设置

web-quickstart.md +31 −15

Details

58 连接 GitHub58 连接 GitHub

59</h2>59</h2>

60 60 

61连接 GitHub 是一次性步骤。如果您已经使用 GitHub CLI,您可以[从您的终端执行此操作](#connect-from-your-terminal)而不是浏览器。61连接 GitHub 是一次性步骤。如果您已经使用 GitHub CLI,可以[从终端执行此操作](#connect-from-your-terminal),而不是使用浏览器。

62 62 

63<Note>63<Note>

64 在 Team 和 Enterprise 计划上,**Sign in with GitHub** 步骤仅在您的 Claude 组织的[所有者](/docs/zh-CN/server-managed-settings#access-control)在[**Admin settings > Connectors**](https://claude.ai/admin-settings/connectors)处打开 GitHub 连接器后才有效。在此之前,该步骤显示"GitHub access is required for Claude Code on the web"而不是登录按钮。连接器打开后,重新加载 [claude.ai/code](https://claude.ai/code) 并从第一步重新开始。第二个切换开关[Quick web setup](/docs/zh-CN/claude-code-on-the-web#github-authentication-options)位于[**Admin settings > Claude Code**](https://claude.ai/admin-settings/claude-code),是可选的:打开它后,`/web-setup` 可以工作,入门流程会为成员创建环境。64 在 Team 和 Enterprise 计划上,**Sign in with GitHub** 步骤仅在您的 Claude 组织的[所有者](/docs/zh-CN/server-managed-settings#access-control)在[**Admin settings > Connectors**](https://claude.ai/admin-settings/connectors)处打开 GitHub 连接器后才有效。在此之前,该步骤显示"GitHub access is required for Claude Code on the web"而不是登录按钮。连接器打开后,重新加载 [claude.ai/code](https://claude.ai/code)并从第一步重新开始。第二个切换开关[Quick web setup](/docs/zh-CN/claude-code-on-the-web#github-authentication-options)位于[**Admin settings > Claude Code**](https://claude.ai/admin-settings/claude-code),是可选的:打开它后,`/web-setup` 可以工作,入门流程会为成员创建环境。

65</Note>65</Note>

66 66 

67<Steps>67<Steps>

68 <Step title="访问 claude.ai/code">68 <Step title="访问 claude.ai/code">

69 转到 [claude.ai/code](https://claude.ai/code) 并使用您的 claude.ai 账户登录。在 macOS 或 Windows 上,第一个屏幕提供 Claude Code 桌面应用和其他安装 Claude Code 的方式。要留在浏览器中,请单击页面底部的**Continue on web**。69 转到 [claude.ai/code](https://claude.ai/code)并使用您的 claude.ai 账户登录。在 macOS 或 Windows 上,第一个屏幕提供 Claude Code 桌面应用和其他安装 Claude Code 的方式。要留在浏览器中,请单击页面底部的**Continue on web**。

70 </Step>70 </Step>

71 71 

72 <Step title="Sign in with GitHub">72 <Step title="使用 GitHub 登录">

73 登录后,claude.ai/code 会提示您连接 GitHub。按照提示操作,claude.ai/code 会将您发送到 GitHub 的授权页面。批准授权请求,GitHub 会将您返回到 claude.ai/code。云会话适用于现有的 GitHub 仓库,可以访问您的 GitHub 账户可以看到的任何仓库。要启动新项目,请先[在 GitHub 上创建一个空仓库](https://github.com/new)。73 登录后,claude.ai/code 会提示您连接 GitHub。按照提示操作,claude.ai/code 会将您发送到 GitHub 的授权页面。批准授权请求,GitHub 会将您返回到 claude.ai/code。云会话可以与现有 GitHub 存储库配合使用。要启动新项目,请先[在 GitHub 上创建一个空存储库](https://github.com/new)。

74 74 

75 当 Quick web setup 关闭时(在 Team 和 Enterprise 计划上默认关闭),claude.ai/code 会要求您在仓库上安装 Claude GitHub App,除非已经安装。如果您想要[Auto-fix](/docs/zh-CN/claude-code-on-the-web#auto-fix-pull-requests)(允许 Claude 响应 CI 失败并审查这些仓库中的拉取请求注释),请安装它;否则单击**Skip**。无论哪种方式,会话都可以访问相同的仓库。75 通过此连接,会话可以克隆任何公共存储库,但只有在 Claude GitHub App 安装在私有存储库上时,才能在私有存储库中工作。[安装应用](https://github.com/apps/claude/installations/new)到您想要使用其私有存储库的每个 GitHub 账户或组织。在 GitHub 组织上,组织所有者可能需要批准安装。安装应用还会启用[Auto-fix](/docs/zh-CN/claude-code-on-the-web#auto-fix-pull-requests),这让 Claude 能够响应这些存储库中拉取请求的 CI 失败和审查评论。

76 

77 如果入门流程在此时提示您安装应用,而您想稍后再做,请单击**Skip**。

76 </Step>78 </Step>

77 79 

78 <Step title="设置您的默认环境">80 <Step title="设置您的默认环境">

79 [云环境](/docs/zh-CN/cloud-environments)是保存的配置,控制 Claude 在会话期间可以访问的网络以及会话启动时运行的内容。连接 GitHub 后发生的情况取决于您的计划:81 [云环境](/docs/zh-CN/cloud-environments)是保存的配置,控制会话期间 Claude 拥有的网络访问权限以及会话启动时运行的内容。连接 GitHub 后发生的情况取决于您的计划:

80 82 

81 * **Pro 和 Max**:入门流程为您创建一个名为**Default**的环境。83 * **Pro 和 Max**:入门流程为您创建一个名为**Default**的环境。

82 * **Team 和 Enterprise**:入门流程显示**Create your first cloud environment**表单。保持预填充的名称和网络访问不变,单击**Create & finish**以创建**Default**环境。如果所有者已打开[Quick web setup](/docs/zh-CN/claude-code-on-the-web#github-authentication-options),入门流程会为您创建**Default**。84 * **Team 和 Enterprise**:入门流程显示**Create your first cloud environment**表单。保持预填充的名称和网络访问不变,然后单击**Create & finish**以创建**Default**环境。如果所有者已打开[Quick web setup](/docs/zh-CN/claude-code-on-the-web#github-authentication-options),入门流程会为您创建**Default**。

83 85 

84 **Default** 使用[`Trusted` 网络访问](/docs/zh-CN/cloud-environments#access-levels):会话可以访问[常见包注册表](/docs/zh-CN/cloud-environments#default-allowed-domains)和其他允许列表中的域,以及通过会话网络的其他任何内容。请参阅[已安装的工具](/docs/zh-CN/cloud-environments#installed-tools)了解无需任何配置即可使用的内容。86 **Default** 使用[`Trusted` 网络访问](/docs/zh-CN/cloud-environments#access-levels):会话可以访问[常见包注册表](/docs/zh-CN/cloud-environments#default-allowed-domains)和其他允许列表中的域,以及通过会话网络的其他任何内容都无法访问。有关无需任何配置即可使用的内容,请参阅[已安装的工具](/docs/zh-CN/cloud-environments#installed-tools)。

85 87 

86 对于第一个项目,**Default** 环境可以按原样使用。要更改其网络访问、添加环境变量或在会话启动前运行[设置脚本](/docs/zh-CN/cloud-environments#setup-scripts),请[编辑它或创建其他环境](/docs/zh-CN/cloud-environments#configure-your-environment)。88 对于第一个项目,**Default** 环境可以按原样使用。要更改其网络访问、添加环境变量或在会话启动前运行[设置脚本](/docs/zh-CN/cloud-environments#setup-scripts),请[编辑它或创建其他环境](/docs/zh-CN/cloud-environments#configure-your-environment)。

87 </Step>89 </Step>

88</Steps>90</Steps>

89 91 

90<h3 id="connect-from-your-terminal">92<h3 id="connect-from-your-terminal">

91 从您的终端连接93 从终端连接

92</h3>94</h3>

93 95 

94如果您已经使用 GitHub CLI (`gh`),您可以在不打开浏览器的情况下设置 Claude Code on the web。这需要 [Claude Code CLI](/docs/zh-CN/quickstart)。当您运行 `/web-setup` 时,Claude Code 读取您的本地 `gh` 令牌,将其链接到您的 claude.ai 账户,如果您没有云环境,则创建**Default**云环境。在 Team 和 Enterprise 计划上,`/web-setup` 仅在所有者打开[Quick web setup](/docs/zh-CN/claude-code-on-the-web#github-authentication-options)后才可用。96如果您已经使用 GitHub CLI (`gh`),可以在不打开浏览器的情况下在网络上设置 Claude Code。这需要[Claude Code CLI](/docs/zh-CN/quickstart)。在 Team 和 Enterprise 计划上,只有在所有者打开[Quick web setup](/docs/zh-CN/claude-code-on-the-web#github-authentication-options)后,`/web-setup` 才可用。

97 

98运行 `/web-setup` 时,Claude Code 读取 `gh auth token` 打印的令牌,要求您确认,并将令牌发送给 Anthropic。Anthropic 使用您的 claude.ai 账户加密存储它,您的云会话使用它进行 GitHub 访问,直到您[删除它](#remove-the-web-setup-token)。云会话随后可以访问该令牌可以访问的任何存储库,无需安装 Claude GitHub App。

99 

100如果您已经在浏览器中连接了 GitHub,`/web-setup` 会警告您继续将替换您的云会话的该连接。

95 101 

96<Note>102<Note>

97 启用了[零数据保留](/docs/zh-CN/zero-data-retention)的组织无法使用 `/web-setup` 或其他云会话功能。如果未安装或验证 GitHub CLI,Claude Code 会打开浏览器入门流程。103 启用了[零数据保留](/docs/zh-CN/zero-data-retention)的组织无法使用 `/web-setup` 或其他云会话功能。如果未安装 GitHub CLI 或未进行身份验证,Claude Code 会打开浏览器入门流程。

98</Note>104</Note>

99 105 

100<Steps>106<Steps>


107 </Step>113 </Step>

108 114 

109 <Step title="登录到 Claude">115 <Step title="登录到 Claude">

110 在 Claude Code CLI 中,运行 `/login` 以使用您的 claude.ai 账户登录。如果您已经登录,请跳过此步骤。使用 API 密钥进行身份验证不计数。要检查,请运行 `/status` 并确认**Login method**行显示 claude.ai 账户。116 在 Claude Code CLI 中,运行 `/login` 以使用您的 claude.ai 账户登录。如果您已经使用 claude.ai 账户登录,请跳过此步骤。使用 API 密钥进行身份验证不计数。要检查,请运行 `/status` 并确认**Login method**行显示 claude.ai 账户。

111 </Step>117 </Step>

112 118 

113 <Step title="运行 /web-setup">119 <Step title="运行 /web-setup">


117 /web-setup123 /web-setup

118 ```124 ```

119 125 

120 这会将您的 `gh` 令牌同步到您的 Claude 账户。成功后,Claude Code 会打印 `Connected as <your-github-username>` 并在您的浏览器中打开 [claude.ai/code](https://claude.ai/code)。如果您还没有云环境,`/web-setup` 会创建一个具有 Trusted 网络访问和无设置脚本的环境。您可以[稍后编辑环境或添加变量](/docs/zh-CN/cloud-environments#configure-your-environment)。一旦 `/web-setup` 完成,您可以从您的终端使用 [`--cloud`](/docs/zh-CN/claude-code-on-the-web#from-terminal-to-web) 启动云会话,或使用 [`/schedule`](/docs/zh-CN/routines) 设置定期任务。126 确认提示以将您的 `gh` 令牌发送到您的 Claude 账户。成功后,Claude Code 打印 `Connected as <your-github-username>` 并在您的浏览器中打开 [claude.ai/code](https://claude.ai/code)。如果您还没有云环境,`/web-setup` 会创建一个具有 Trusted 网络访问且没有设置脚本的环境。您可以[稍后编辑环境或添加变量](/docs/zh-CN/cloud-environments#configure-your-environment)。`/web-setup` 完成后,您可以使用 [`--cloud`](/docs/zh-CN/claude-code-on-the-web#from-terminal-to-web) 从终端启动云会话,或使用 [`/schedule`](/docs/zh-CN/routines) 设置定期任务。

121 </Step>127 </Step>

122</Steps>128</Steps>

123 129 

130<h4 id="remove-the-web-setup-token">

131 删除 `/web-setup` 令牌

132</h4>

133 

134要从您的 Claude 账户中删除令牌,请在 [claude.ai/customize/connectors](https://claude.ai/customize/connectors) 处断开 GitHub 连接。断开连接会删除您的云会话使用的 GitHub 凭据,无论它们来自浏览器还是 `/web-setup`,因此云会话会失去 GitHub 访问权限,直到您再次连接。您的本地 `gh` 保持登录状态,令牌在 GitHub 上保持有效。

135 

136要使令牌本身失效,请在 GitHub 上撤销它。如果您通过浏览器登录到 `gh`,令牌属于 GitHub 上[**Settings > Applications > Authorized OAuth Apps**](https://github.com/settings/applications)下的**GitHub CLI**条目,撤销该条目也会在您的机器上将 GitHub CLI 注销。云会话随后会失去 GitHub 访问权限,直到您再次运行 `gh auth login` 和 `/web-setup`。

137 

124<h2 id="start-a-task">138<h2 id="start-a-task">

125 开始任务139 开始任务

126</h2>140</h2>


204 连接 GitHub 后没有仓库出现218 连接 GitHub 后没有仓库出现

205</h3>219</h3>

206 220 

207云会话可以使用连接的 GitHub 账户可以看到的任何仓库,无论 Claude GitHub App 安装在哪些仓库上。如果仓库丢失,请验证连接的 GitHub 账户在 GitHub 上有权访问它。如果您还想为仓库启用[自动修复](/docs/zh-CN/claude-code-on-the-web#auto-fix-pull-requests),请在其上安装应用:在 github.com 上,打开**Settings → Applications → Claude → Configure** 并验证仓库是否列在**Repository access** 下。私有仓库需要与公共仓库相同的授权。221如果您在浏览器中连接了 GitHub,会话可以克隆任何公共仓库,但私有仓库仅在 Claude GitHub App 安装在拥有该仓库的账户或组织上,且安装的仓库访问权限包括该仓库时才会出现。[安装 Claude GitHub App](https://github.com/apps/claude/installations/new),或要求组织所有者安装或批准它。

222 

223如果您使用 `/web-setup` 连接,会话可以访问您的 `gh` 令牌可以访问的每个仓库。在您的 shell 中运行 `gh repo view OWNER/REPO` 以检查您的 GitHub CLI 登录是否可以看到该仓库,如果您自连接以来已切换 `gh` 账户,请再次运行 `/web-setup`。

208 224 

209<h3 id="the-page-only-shows-a-github-login-button">225<h3 id="the-page-only-shows-a-github-login-button">

210 页面仅显示 GitHub 登录按钮226 页面仅显示 GitHub 登录按钮

whats-new/2026-w29.md +70 −0 created

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# 第29周 · 2026年7月13–17日

6 

7> 通过MCP连接器将实时数据拉入已发布的工件中,并在新的屏幕阅读器模式下使用Claude Code。

8 

9<div className="digest-meta">

10 <span>发布版本 <a href="/docs/en/changelog#2-1-207">v2.1.207 → v2.1.212</a></span>

11 <span>2项功能 · 7月13–17</span>

12</div>

13 

14<div className="digest-feature">

15 <div className="digest-feature-header">

16 <span className="digest-feature-title">工件调用您的MCP连接器</span>

17 <span className="digest-feature-pill">web</span>

18 </div>

19 

20 <p className="digest-feature-lede">已发布的工件现在可以在每次有人查看时调用MCP连接器,因此仪表板显示实时数据并可以按需执行操作,而不是构建它的会话中的快照。每次调用都通过查看者自己的连接运行,查看者在页面首次连接器调用前批准访问。本周还添加了公开共享链接、Team和Enterprise计划上的编辑者角色,以及从Claude Tag会话创建的工件。</p>

21 

22 <Frame>

23 <video autoPlay muted loop playsInline className="w-full" src="https://mintcdn.com/claude-code/ItzF3QVI6L0QypjJ/images/whats-new/artifacts-mcp.mp4?fit=max&auto=format&n=ItzF3QVI6L0QypjJ&q=85&s=ff8b81ed52b26c773899dc28cec959e6" data-path="images/whats-new/artifacts-mcp.mp4" />

24 </Frame>

25 

26 <p className="digest-feature-try">在您的提示中命名连接器和您想要的数据:</p>

27 

28 ```text title="Claude Code" wrap theme={null}

29 Build a dashboard artifact of open pull requests that pulls the live list through my GitHub connector when the page loads.

30 ```

31 

32 <a className="digest-feature-link" href="/docs/zh-CN/artifacts#pull-live-data-with-mcp-connectors">使用MCP连接器拉取实时数据</a>

33</div>

34 

35<div className="digest-feature">

36 <div className="digest-feature-header">

37 <span className="digest-feature-title">屏幕阅读器模式</span>

38 <span className="digest-feature-pill">CLI</span>

39 </div>

40 

41 <p className="digest-feature-lede">屏幕阅读器模式用纯文本、线性文本替换可视化终端界面:不使用框、旋转器和原地重绘,Claude Code打印标记的行,屏幕阅读器(如VoiceOver或NVDA)按顺序读取,因此您可以批准权限并端到端审查输出。使用标志按会话打开它,使用<code>CLAUDE\_AX\_SCREEN\_READER</code>环境变量按shell打开它,或使用<code>axScreenReader</code>设置在任何地方打开它。</p>

42 

43 <p className="digest-feature-try">在屏幕阅读器模式下启动会话:</p>

44 

45 ```bash terminal theme={null}

46 claude --ax-screen-reader

47 ```

48 

49 <a className="digest-feature-link" href="/docs/zh-CN/accessibility#turn-on-screen-reader-mode">打开屏幕阅读器模式</a>

50</div>

51 

52<div className="digest-wins">

53 <p className="digest-wins-title">其他改进</p>

54 

55 <div className="digest-wins-grid">

56 <div><code>/fork</code>现在将您的对话复制到新的后台会话中,在<code>claude agents</code>中有自己的行,同时您继续工作;它曾经启动的会话内分叉子代理现在是<code>/subtask</code></div>

57 <div><a href="/docs/zh-CN/permission-modes#enable-auto-mode-on-bedrock-agent-platform-or-foundry">自动模式</a>在Amazon Bedrock、Google Cloud的Agent Platform和Microsoft Foundry上不再需要<code>CLAUDE\_CODE\_ENABLE\_AUTO\_MODE</code>选择加入;管理员可以使用<code>disableAutoMode</code>关闭它</div>

58 <div>运行时间超过两分钟的MCP工具调用现在自动移到后台,以便会话保持可用;使用<code>CLAUDE\_CODE\_MCP\_AUTO\_BACKGROUND\_MS</code>调整或禁用阈值</div>

59 <div>新的<code>claude auto-mode reset</code>恢复默认自动模式配置,`--yes`跳过确认提示</div>

60 <div>新的<a href="/docs/zh-CN/corporate-launcher">企业启动器</a>支持:<code>CLAUDE\_CODE\_PROCESS\_WRAPPER</code>或<code>processWrapper</code>设置通过必需的包装器可执行文件运行Claude Code从其自己的二进制文件启动的进程,例如后台服务和代理视图会话</div>

61 <div><code>vimInsertModeRemaps</code>设置将两键插入模式序列(如<code>jj</code>)映射到vim模式中的Escape</div>

62 <div>`--forward-subagent-text`和<code>CLAUDE\_CODE\_FORWARD\_SUBAGENT\_TEXT</code>在<a href="/docs/zh-CN/headless">stream-json输出</a>中包含子代理文本和思考块</div>

63 <div>会话范围的上限停止失控循环:WebSearch调用和子代理生成各默认为200,可使用<code>CLAUDE\_CODE\_MAX\_WEB\_SEARCHES\_PER\_SESSION</code>和<code>CLAUDE\_CODE\_MAX\_SUBAGENTS\_PER\_SESSION</code>调整</div>

64 <div>"始终允许"权限规则保存在存储库根目录,因此在git worktree中授予的批准在会话和worktree中持续</div>

65 <div>Amazon Bedrock、Google Cloud的Agent Platform和AWS上的Claude Platform现在默认为Claude Opus 4.8</div>

66 <div>折叠的工具摘要行显示实时经过时间计数器,因此长时间运行的工具调用可见地计时,而不是看起来卡住</div>

67 </div>

68</div>

69 

70[v2.1.207–v2.1.212的完整更新日志 →](/docs/en/changelog#2-1-207)

whats-new/2026-w30.md +91 −0 created

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# 第 30 周 · 7 月 20–24 日,2026 年

6 

7> Opus 5 成为默认的 Opus 模型,Claude Code Desktop 添加了 iOS 模拟器窗格,Claude Security 插件扫描您的代码以查找漏洞。

8 

9<div className="digest-meta">

10 <span>发布版本 <a href="/docs/en/changelog#2-1-214">v2.1.214 → v2.1.219</a></span>

11 <span>3 项功能 · 7 月 20–24 日</span>

12</div>

13 

14<div className="digest-feature">

15 <div className="digest-feature-header">

16 <span className="digest-feature-title">Claude Opus 5</span>

17 <span className="digest-feature-pill">新模型</span>

18 </div>

19 

20 <p className="digest-feature-lede">Claude Opus 5 是 Claude Code 中新的默认 Opus 模型。它是 Max、Team Premium、Enterprise 按量付费以及 Anthropic API 上的默认模型,也是 AWS 上的 Claude Platform、Amazon Bedrock 和 Google Cloud 的 Agent Platform 上的默认模型。在 Anthropic API 以及 Max、Team 和 Enterprise 计划上,Opus 5 运行时具有 <a href="/docs/zh-CN/model-config#extended-context">100 万令牌上下文窗口</a>;在 Amazon Bedrock 和 Google Cloud 的 Agent Platform 上,选择 100 万模型变体。快速模式转移到 Opus 5,价格为每百万令牌 $10/$50。需要 v2.1.219 或更高版本。</p>

21 

22 <Frame>

23 <video autoPlay muted loop playsInline className="w-full" src="https://mintcdn.com/claude-code/N3yEaTYPXMXFrF6k/images/whats-new/opus-5.mp4?fit=max&auto=format&n=N3yEaTYPXMXFrF6k&q=85&s=8536b1cb3180e539008f39930403e47b" data-path="images/whats-new/opus-5.mp4" />

24 </Frame>

25 

26 <p className="digest-feature-try">按名称切换到 Opus 5,或从模型选择器中选择它:</p>

27 

28 ```text Claude Code theme={null}

29 > /model claude-opus-5

30 ```

31 

32 <a className="digest-feature-link" href="/docs/zh-CN/model-config#available-models">模型配置</a>

33</div>

34 

35<div className="digest-feature">

36 <div className="digest-feature-header">

37 <span className="digest-feature-title">Claude Code Desktop 中的 iOS 模拟器</span>

38 <span className="digest-feature-pill">Desktop</span>

39 </div>

40 

41 <p className="digest-feature-lede">macOS 上的 Claude Code Desktop 获得了 iOS 模拟器窗格,在 Pro、Max 和 Team 计划上处于公开测试版。当 Claude 在模拟器中构建、启动或检查您的应用时,该窗格会在对话旁边打开并实时流式传输设备屏幕,因此您可以观看 Claude 点击应用以验证其更改或自己驱动设备。需要安装了 iOS 平台的 Xcode 以及 Claude Desktop v1.24012.0 或更高版本。</p>

42 

43 <Frame>

44 <img className="w-full" src="https://mintcdn.com/claude-code/N3yEaTYPXMXFrF6k/images/whats-new/ios-simulator.jpg?fit=max&auto=format&n=N3yEaTYPXMXFrF6k&q=85&s=6c88418ed14ed0fb12cc1af75b17f2ee" alt="Claude Code Desktop 显示 iOS 模拟器窗格,在对话旁边显示 iPhone 应用" width="2048" height="1152" data-path="images/whats-new/ios-simulator.jpg" />

45 </Frame>

46 

47 <p className="digest-feature-try">要求 Claude 运行或测试您的应用,当应用启动时窗格会打开:</p>

48 

49 ```text Claude Code theme={null}

50 > Build the app and run it in the simulator to check the onboarding flow.

51 ```

52 

53 <a className="digest-feature-link" href="/docs/zh-CN/desktop-ios-simulator#run-your-app-in-the-simulator">在模拟器中测试 iOS 应用</a>

54</div>

55 

56<div className="digest-feature">

57 <div className="digest-feature-header">

58 <span className="digest-feature-title">Claude Security 插件</span>

59 <span className="digest-feature-pill">plugin</span>

60 </div>

61 

62 <p className="digest-feature-lede">Claude Security 插件在 Claude Code 会话内运行代码库的多代理漏洞扫描:代理映射您的架构、构建威胁模型、搜索漏洞,并在将报告写入 <code>CLAUDE-SECURITY-\<timestamp>/</code> 目录之前独立审查每项发现。扫描整个存储库或仅扫描分支的差异、拉取请求或单个提交,然后将您选择的发现转换为经过审查的补丁,您可以自己应用。</p>

63 

64 <p className="digest-feature-try">从官方 Anthropic 市场安装插件,运行 <code>/reload-plugins</code>,然后使用 <code>/claude-security</code> 启动扫描:</p>

65 

66 ```text Claude Code theme={null}

67 > /plugin install claude-security@claude-plugins-official

68 ```

69 

70 <a className="digest-feature-link" href="/docs/zh-CN/claude-security#scan-and-fix-your-codebase">扫描并修复您的代码库</a>

71</div>

72 

73<div className="digest-wins">

74 <p className="digest-wins-title">其他改进</p>

75 

76 <div className="digest-wins-grid">

77 <div><a href="/docs/zh-CN/code-review#review-a-diff-locally"><code>/code-review</code></a> 现在作为具有自己上下文窗口的后台子代理运行,因此审查工作不会进入您的对话,发现会在完成时到达</div>

78 <div><code>/verify</code>、<code>/code-review</code> 和 <code>/deep-research</code> 仅在您调用时运行;Claude 不再自动启动它们</div>

79 <div><a href="/docs/zh-CN/interactive-mode#emoji-shortcodes">Emoji 快捷代码</a>在提示输入中自动完成:输入 <code>:heart:</code> 以插入 emoji,或在 <code>:</code> 后输入两个或更多字符以获得建议;使用 <code>emojiCompletionEnabled</code> 关闭它</div>

80 <div>具有 <code>context: fork</code> 的 Skills <a href="/docs/zh-CN/skills#run-skills-in-a-subagent">默认在后台运行</a>,skill 的 frontmatter 中的 <code>background: false</code> 在同一轮中等待结果</div>

81 <div>会话默认运行最多 20 个子代理并发;使用 <code>CLAUDE\_CODE\_MAX\_CONCURRENT\_SUBAGENTS</code> 更改 <a href="/docs/zh-CN/sub-agents#concurrent-subagent-limit">限制</a></div>

82 <div>`--max-budget-usd` 现在对子代理强制执行上限:一旦支出达到上限,Claude 无法启动更多,运行中的后台子代理会停止</div>

83 <div>新的 <a href="/docs/zh-CN/sandboxing#disable-filesystem-isolation"><code>sandbox.filesystem.disabled</code></a> 设置跳过文件系统隔离,同时保持网络出口控制</div>

84 <div>在自动模式下,对危险 <code>rm</code> 命令、后台作业和可疑 Windows 路径的检查不再打开权限对话框;自动模式分类器会对其进行判决</div>

85 <div>Bash 权限检查在更多 shell 形式上失败关闭,包括文件描述符重定向、<code>\[\[</code> 比较中的 Zsh 变量下标、可能运行不安全选项的 <code>help</code> 和 <code>man</code> 调用,以及超过 10,000 个字符的命令</div>

86 <div><a href="/docs/zh-CN/fast-mode">快速模式</a>不再支持 Opus 4.7:<code>/fast</code> 现在适用于 Opus 5 和 Opus 4.8</div>

87 <div>长时间运行的工具调用会发出定期进度心跳,而不是保持沉默</div>

88 </div>

89</div>

90 

91[v2.1.214–v2.1.219 的完整更新日志 →](/docs/en/changelog#2-1-214)

whats-new/2026-w32.md +103 −0 created

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# 第 32 周 · 2026 年 8 月 3–7 日

6 

7> Claude Code 会话可以相互发送消息,自托管环境在您的基础设施上运行云会话,自动模式成为默认权限模式。

8 

9<div className="digest-meta">

10 <span>发布版本 <a href="/docs/en/changelog#2-1-220">v2.1.220 → v2.1.224</a></span>

11 <span>3 项功能 · 8 月 3–7 日</span>

12</div>

13 

14<div className="digest-feature">

15 <div className="digest-feature-header">

16 <span className="digest-feature-title">跨会话消息传递</span>

17 <span className="digest-feature-pill">v2.1.224</span>

18 </div>

19 

20 <p className="digest-feature-lede">您的 Claude Code 会话现在可以相互发送消息。Claude 使用 <code>ListAgents</code> 工具发现您的其他会话,并使用 <code>SendMessage</code> 发送消息,可以在您要求时发送,也可以自动发送,例如在一个会话中的更改影响另一个会话的工作后。消息是 Claude 为另一个会话编写的文本,永远不会是您的对话历史或文件。在 macOS 和 Linux 上可用。需要 v2.1.224 或更高版本。</p>

21 

22 <Frame>

23 <video autoPlay muted loop playsInline className="w-full" src="https://mintcdn.com/claude-code/N3yEaTYPXMXFrF6k/images/whats-new/cross-session-messaging.mp4?fit=max&auto=format&n=N3yEaTYPXMXFrF6k&q=85&s=8f33c3390f78660a4a26dc980f46159f" data-path="images/whats-new/cross-session-messaging.mp4" />

24 </Frame>

25 

26 <p className="digest-feature-try">在同一台机器上打开两个会话,要求其中一个会话传递一些内容:</p>

27 

28 ```text title="Claude Code" wrap theme={null}

29 告诉处理支付 API 的会话 users.name 现在是 users.display_name

30 ```

31 

32 <p className="digest-feature-try">一旦 Claude 读取了消息,另一个会话会显示一个 <code>Message from</code> 行;按 <code>Ctrl+O</code> 展开它。要查看 Claude 可以访问哪些会话,请运行 <code>/list-agents</code>。</p>

33 

34 <a className="digest-feature-link" href="/docs/zh-CN/cross-session-messaging#message-another-session">向另一个会话发送消息</a>

35</div>

36 

37<div className="digest-feature">

38 <div className="digest-feature-header">

39 <span className="digest-feature-title">自托管环境</span>

40 <span className="digest-feature-pill">v2.1.224</span>

41 </div>

42 

43 <p className="digest-feature-lede">自托管环境在您组织自己的基础设施上运行 Claude Code 云会话,在 Team 和 Enterprise 计划上处于公开测试阶段。在您的机器或容器上运行 <code>claude self-hosted-runner</code> 将它们转变为运行器。当有人在从 claude.ai、移动或桌面应用程序或 `claude --cloud` 启动会话时选择您的环境时,该会话在您的网络内运行,可以访问您的内部服务。所有者首先在 <a href="https://claude.ai/admin-settings/cloud-environments">管理设置</a> 中打开 <strong>允许自托管环境</strong>。</p>

44 

45 <Frame>

46 <img className="w-full" src="https://mintcdn.com/claude-code/N3yEaTYPXMXFrF6k/images/whats-new/self-hosted-environments.jpg?fit=max&auto=format&n=N3yEaTYPXMXFrF6k&q=85&s=ae9152cb1670c8af517d1aee57689b14" alt="自托管环境管理页面,列出了 linux-dev 和 macos-prod 等环境及其状态和活跃会话计数" width="2048" height="1152" data-path="images/whats-new/self-hosted-environments.jpg" />

47 </Frame>

48 

49 <p className="digest-feature-try">以所有者身份登录,运行引导式设置,它将引导您创建环境并启动运行器:</p>

50 

51 ```bash terminal theme={null}

52 claude self-hosted-runner setup

53 ```

54 

55 <p className="digest-feature-try">运行器注册后,该环境在管理设置中显示 <strong>健康</strong>。</p>

56 

57 <a className="digest-feature-link" href="/docs/zh-CN/self-hosted-environments-quickstart#set-up-an-environment-and-runner">自托管环境快速入门</a>

58</div>

59 

60<div className="digest-feature">

61 <div className="digest-feature-header">

62 <span className="digest-feature-title">自动模式成为默认值</span>

63 <span className="digest-feature-pill">CLI</span>

64 </div>

65 

66 <p className="digest-feature-lede">从 8 月 14 日开始,自动模式是 Pro、Max 和 Team 计划上新会话的默认权限模式。如果您自己设置了默认模式,它将保持不变,除非您接受一次性切换提示,而您的组织管理的默认值不会改变。您仍然可以随时切换模式。已在这些计划上生效:自动模式进行的分类器调用不再计入您的使用限制。</p>

67 

68 <p className="digest-feature-try">在切换前以自动模式启动每个会话,请在您的用户设置中将其设置为默认值:</p>

69 

70 ```json ~/.claude/settings.json {3} theme={null}

71 {

72 "permissions": {

73 "defaultMode": "auto"

74 }

75 }

76 ```

77 

78 <p className="digest-feature-try">新会话随后在状态栏中显示 <code>auto mode on</code>。</p>

79 

80 <a className="digest-feature-link" href="/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode">自动模式要求和控制</a>

81</div>

82 

83<div className="digest-wins">

84 <p className="digest-wins-title">其他改进</p>

85 

86 <div className="digest-wins-grid">

87 <div>VS Code 扩展获得 <a href="/docs/zh-CN/vs-code#extension-settings">焦点视图</a>,它在每个轮次后面隐藏一个可展开行中的工具活动;从命令菜单或使用 <code>Ctrl+Alt+F</code>(Mac 上为 <code>Ctrl+Option+F</code>)切换它</div>

88 <div>沙箱凭证文件在 Linux 和 WSL2 上接受 <a href="/docs/zh-CN/sandboxing#mask-credential-files"><code>mode: "mask"</code></a>,因此沙箱命令读取哨兵副本,而沙箱代理在出口时替换真实值;凭证掩蔽还获得 <code>extract</code>、JWT 感知的 <code>decode</code> 和 AWS SigV4 重新签名选项</div>

89 <div>市场可以使用新的 <code>archive</code> 源将插件分发为 <a href="/docs/zh-CN/plugin-marketplaces#zip-archives">zip 存档</a>,通过 HTTPS 下载,带有可选的 SHA-256 引脚,因此安装无需 git 或 npm</div>

90 <div><code>/review</code> 现在是 <a href="/docs/zh-CN/code-review#review-a-diff-locally"><code>/code-review</code></a> 的别名,<code>/code-review</code> 不带努力级别会重用您上次输入的级别</div>

91 <div>您使用 <a href="/docs/zh-CN/agent-view#copy-the-session-with-%2Ffork"><code>/fork</code></a> 复制的会话现在在其自己的 worktree 中进行代码更改,而不是原始会话的检出</div>

92 <div>您从 <a href="/docs/zh-CN/discover-plugins#install-plugins"><code>/plugin</code></a> 安装的插件在当前会话中激活,当这样做是安全的时;安装摘要报告 <code>Plugin is now active.</code> 或告诉您运行 <code>/reload-plugins</code></div>

93 <div><a href="/docs/zh-CN/agent-view#how-file-edits-are-isolated">后台会话</a> 在 worktree 中更改代码现在在完成前提交和推送,仅当任务需要时才打开草稿拉取请求,并遵循您的 <code>CLAUDE.md</code> 中的 git 指令</div>

94 <div>每个会话 200 个子代理的上限被移除,因此长时间运行的会话不再拒绝新的子代理;<a href="/docs/zh-CN/sub-agents#concurrent-subagent-limit">并发</a> 和深度限制仍然适用</div>

95 <div>存储库的签入设置不再能打开 <a href="/docs/zh-CN/remote-control#enable-remote-control-for-all-sessions">远程控制自动连接</a>;改为在您的用户或托管设置中设置 <code>remoteControlAtStartup</code>,项目和本地设置只能将其关闭</div>

96 <div><a href="/docs/zh-CN/worktrees#how-claude-code-enforces-isolation">Worktree 隔离</a> 现在不仅阻止文件编辑,还阻止 Bash 命令和 git 重定向到达主检出,在每种会话类型和会话的子代理中</div>

97 <div>Bash 命令不再能从权限检查中隐藏其自身的一部分,制表符或不可见的 Unicode 填充不再从批准对话框中隐藏命令的一部分</div>

98 <div>PreToolUse 自动允许钩子不再绕过 Claude Code 内部侧任务(如摘要和压缩)中的工具限制</div>

99 <div><a href="/docs/zh-CN/ultraplan">Ultraplan</a> 研究预览被移除,包括 <code>/ultraplan</code> 命令和 <code>ultraplan</code> 关键字;改为使用计划模式或网络上的 Claude Code</div>

100 </div>

101</div>

102 

103[v2.1.220–v2.1.224 的完整更新日志 →](/docs/en/changelog#2-1-220)

whats-new/2026-w33.md +87 −0 created

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# 第 33 周 · 2026 年 8 月 10–14 日

6 

7> Claude Code Desktop 在使用限制重置后自动继续,fork 模式默认启用,GitLab 合并请求和市场加入 GitHub。

8 

9<div className="digest-meta">

10 <span>发布版本 <a href="/docs/en/changelog#2-1-225">v2.1.225 → v2.1.233</a></span>

11 <span>3 项功能 · 8 月 10–14</span>

12</div>

13 

14<div className="digest-feature">

15 <div className="digest-feature-header">

16 <span className="digest-feature-title">Desktop 上限制重置后自动继续</span>

17 <span className="digest-feature-pill">Desktop</span>

18 </div>

19 

20 <p className="digest-feature-lede">当您在 Claude Code Desktop 的 Code 选项卡中达到会话限制时,限制卡现在提供一个<strong>限制重置时自动继续</strong>复选框。勾选它,Desktop 应用将在重置后重试中断的轮次。该卡显示重试时间。每周限制卡不提供此选项。</p>

21 

22 <Frame>

23 <video autoPlay muted loop playsInline className="w-full" src="https://mintcdn.com/claude-code/2SnAdpL4dJ18nKb3/images/whats-new/desktop-auto-continue.mp4?fit=max&auto=format&n=2SnAdpL4dJ18nKb3&q=85&s=1937f489695feaea715e48ecfd7e62cd" data-path="images/whats-new/desktop-auto-continue.mp4" />

24 </Frame>

25 

26 <p className="digest-feature-try">下次出现会话限制卡时,勾选<strong>限制重置时自动继续</strong>并保持会话打开。该卡显示 <code>Auto-resuming at</code> 后跟重置时间,一旦限制重置,轮次将自动继续。</p>

27 

28 <a className="digest-feature-link" href="/docs/zh-CN/errors#youve-hit-your-session-limit">达到使用限制时该怎么办</a>

29</div>

30 

31<div className="digest-feature">

32 <div className="digest-feature-header">

33 <span className="digest-feature-title">Fork 模式默认启用</span>

34 <span className="digest-feature-pill">v2.1.232</span>

35 </div>

36 

37 <p className="digest-feature-lede">Fork 模式现在在交互式会话中默认启用。Claude 可以请求 <code>fork</code> 子代理类型,它继承完整的对话和提示缓存,而不是从头开始,因此您不必为辅助任务重新解释上下文。子代理 Claude 在交互式会话中生成的,除了代理团队队友生成的,也默认在后台运行。</p>

38 

39 <p className="digest-feature-try">使用需要您迄今为止讨论的所有内容的任务自己启动 fork:</p>

40 

41 ```text Claude Code theme={null}

42 > /subtask draft unit tests for the parser changes so far

43 ```

44 

45 <p className="digest-feature-try">fork 出现在您的提示下方的面板中,其结果在完成时到达您的对话。要关闭 fork 模式,请设置 <code>CLAUDE\_CODE\_FORK\_SUBAGENT=0</code>。</p>

46 

47 <a className="digest-feature-link" href="/docs/zh-CN/sub-agents#turn-fork-mode-on-or-off">启用或关闭 fork 模式</a>

48</div>

49 

50<div className="digest-feature">

51 <div className="digest-feature-header">

52 <span className="digest-feature-title">GitLab 合并请求和市场</span>

53 <span className="digest-feature-pill">v2.1.232</span>

54 </div>

55 

56 <p className="digest-feature-lede">插件市场克隆裸 <code>gitlab.com</code> URL,包括嵌套子组。在 v2.1.233 或更高版本上,将 GitLab 合并请求 URL 传递给 <code>--worktree</code> 以从其分支,<code>claude agents</code> 视图将链接到合并请求的会话标记为 <code>!N</code>。Claude Code 还会编辑 GitLab 令牌族,如 <code>glpat-</code> 和 <code>glrt-</code>,并以与保护 <code>gh</code> 相同的方式保护 <code>glab</code> CLI 的配置存储。</p>

57 

58 <p className="digest-feature-try">在从合并请求分支的 worktree 中启动会话:</p>

59 

60 ```bash terminal theme={null}

61 claude --worktree https://gitlab.com/group/project/-/merge_requests/42

62 ```

63 

64 <p className="digest-feature-try">当 <code>origin</code> 在 gitlab.com 上时,Claude Code 获取 <code>merge-requests/42/head</code> 并在其自己的 worktree 中的该分支上打开会话。</p>

65 

66 <a className="digest-feature-link" href="/docs/zh-CN/worktrees#branch-from-a-pull-request">从拉取或合并请求分支 worktree</a>

67</div>

68 

69<div className="digest-wins">

70 <p className="digest-wins-title">其他改进</p>

71 

72 <div className="digest-wins-grid">

73 <div>在提示中键入 <code>@</code> 以<a href="/docs/zh-CN/cross-session-messaging#message-another-session">提及另一个 Claude 会话</a>的名称,Claude 使用 <code>SendMessage</code> 直接向其发送消息;与恰好一个活跃会话完全匹配的裸名称现在无需确认步骤即可传递</div>

74 <div>一台机器上的交互式会话保持<a href="/docs/zh-CN/cross-session-messaging#see-which-sessions-claude-can-reach">唯一名称</a>:如果您启动或重命名会话时使用另一个活跃会话已在使用的名称,Claude Code 会为您的会话提供 <code>name-word-word</code> 变体并告知您</div>

75 <div>插件市场接受<a href="/docs/zh-CN/plugin-marketplaces#command-sources"><code>command</code> 源</a>:本地命令打印插件目录,Claude Code 在每个会话中重新解析并应用,无需重启</div>

76 <div>在 Linux 和 WSL 上,设置<a href="/docs/zh-CN/tools-reference#memory-limit-on-linux-and-wsl"><code>CLAUDE\_CODE\_TOOL\_MEMORY\_LIMIT</code></a> 为大小(如 <code>4G</code>)以限制 Bash 和 PowerShell 工具命令可以使用的内存</div>

77 <div>任务跟踪工具,如 <code>TaskCreate</code>、<code>TaskUpdate</code> 和 <code>TodoWrite</code>,<a href="/docs/zh-CN/tools-reference#task-tool-availability">在 Opus 4.8、Sonnet 5、Fable 5、Mythos 5 及这些系列中的更高版本上不再可用</a>;设置 <code>CLAUDE\_CODE\_ENABLE\_TODO\_TOOLS=1</code> 以重新启用它们</div>

78 <div><a href="/docs/zh-CN/code-review#review-a-diff-locally"><code>/code-review</code></a> 在高、超高和最大努力级别现在像其他级别一样在后台代理中运行</div>

79 <div><a href="/docs/zh-CN/discover-plugins#install-plugins"><code>/plugin install plugin\@marketplace</code></a> 首先刷新市场,因此新发布的插件无需手动市场更新即可安装</div>

80 <div>设置接受<a href="/docs/zh-CN/settings-reference#marketplace-key-aliases"><code>additionalMarketplaces</code> 和 <code>allowedMarketplaces</code></a> 作为 <code>extraKnownMarketplaces</code> 和 <code>strictKnownMarketplaces</code> 的别名</div>

81 <div>在较新的模型上,Claude 可以<a href="/docs/zh-CN/tools-reference#write-tool-behavior">使用 Write 工具覆盖现有文件</a>而无需在此会话中首先读取它,与 Edit 工具的规则匹配;较旧的模型需要读取</div>

82 <div>VS Code 扩展可以<a href="/docs/zh-CN/vs-code#organize-sessions-into-groups">将会话列表组织成组</a>:右键单击以创建、重命名或删除组,使用 Cmd/Ctrl- 或 Shift-单击一次移动多个会话</div>

83 <div>如果您的组织通过<a href="/docs/zh-CN/claude-apps-gateway-spend-limits">具有支出限制的 Claude 应用网关</a>路由 Claude Code,Claude Code 会在您达到限制时显示限制期间、其重置时间和运营商的消息</div>

84 </div>

85</div>

86 

87[v2.1.225–v2.1.233 的完整更新日志 →](/docs/en/changelog#2-1-225)

whats-new/2026-w34.md +105 −0 created

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# 第 34 周 · 2026 年 8 月 17–21 日

6 

7> 使用 /design skill 草拟可编辑的 UI 画板,设置 Concise 输出样式,并从手机在您的机器上启动 Claude Code 会话。

8 

9<div className="digest-meta">

10 <span>发布版本 <a href="/docs/en/changelog#2-1-234">v2.1.234 → v2.1.239</a></span>

11 <span>3 项功能 · 8 月 17–21</span>

12</div>

13 

14<div className="digest-feature">

15 <div className="digest-feature-header">

16 <span className="digest-feature-title">/design</span>

17 <span className="digest-feature-pill">research preview</span>

18 </div>

19 

20 <p className="digest-feature-lede"><code>/design</code> skill 将 Claude Design 的画板工作流程引入 CLI 和 Claude Code Desktop,基于 artifacts 构建。使用简要说明运行它,Claude 会发布一个可编辑画板的画布供您的 UI 使用。选择一个,调整它,然后让 Claude 实现它。适用于 Pro、Max、Team 和 Enterprise。需要 v2.1.234 或更高版本。</p>

21 

22 <Frame>

23 <video autoPlay muted loop playsInline className="w-full" src="https://mintcdn.com/claude-code/2SnAdpL4dJ18nKb3/images/whats-new/design-skill.mp4?fit=max&auto=format&n=2SnAdpL4dJ18nKb3&q=85&s=0b376a94227c14a4204af89c4c9fd7ac" data-path="images/whats-new/design-skill.mp4" />

24 </Frame>

25 

26 <p className="digest-feature-try">描述您想要设计的内容,让 Claude 草拟选项:</p>

27 

28 ```text Claude Code theme={null}

29 > /design redesign the composer based on what people actually use it for

30 ```

31 

32 <p className="digest-feature-try">Claude 打印已发布画布的链接。打开它,选择一个画板,并告诉 Claude 要实现哪个选项。</p>

33 

34 <a className="digest-feature-link" href="/docs/zh-CN/artifacts#availability">artifacts 可用的位置</a>

35</div>

36 

37<div className="digest-feature">

38 <div className="digest-feature-header">

39 <span className="digest-feature-title">Concise 输出样式</span>

40 <span className="digest-feature-pill">v2.1.237</span>

41 </div>

42 

43 <p className="digest-feature-lede">Concise 是一种新的内置输出样式。Claude 以结果开头,跳过前言和叙述,同时以与默认样式相同的彻底程度完成工作。当您要求解释或更多详细信息时,Claude 会完整回答。错误报告、安全警告和破坏性操作的确认保持其完整内容。</p>

44 

45 <Frame>

46 <video autoPlay muted loop playsInline className="w-full" src="https://mintcdn.com/claude-code/2SnAdpL4dJ18nKb3/images/whats-new/concise-output-style.mp4?fit=max&auto=format&n=2SnAdpL4dJ18nKb3&q=85&s=dfb40ec8921ed1bc82eb629042a8ec17" data-path="images/whats-new/concise-output-style.mp4" />

47 </Frame>

48 

49 <p className="digest-feature-try">在 <code>/config</code> 中的 <strong>Output style</strong> 下打开它,或在您的设置文件中设置它:</p>

50 

51 ```json ~/.claude/settings.json {2} theme={null}

52 {

53 "outputStyle": "Concise"

54 }

55 ```

56 

57 <p className="digest-feature-try">运行 <code>/clear</code> 或启动新会话,Claude 的回复以结果开头。</p>

58 

59 <a className="digest-feature-link" href="/docs/zh-CN/output-styles#built-in-output-styles">内置输出样式</a>

60</div>

61 

62<div className="digest-feature">

63 <div className="digest-feature-header">

64 <span className="digest-feature-title">从手机在您的机器上启动会话</span>

65 <span className="digest-feature-pill">mobile</span>

66 </div>

67 

68 <p className="digest-feature-lede">任何运行 <code>claude remote-control</code> 的机器现在都会在 Claude 应用的 Code 标签页顶部显示为设备卡片。Remote Control 也已退出研究预览。</p>

69 

70 <Frame>

71 <img className="w-full" src="https://mintcdn.com/claude-code/2SnAdpL4dJ18nKb3/images/whats-new/remote-control-phone-start.jpg?fit=max&auto=format&n=2SnAdpL4dJ18nKb3&q=85&s=9f0ebedab23aa0e1732cc37782573907" alt="Claude 移动应用中的 Code 标签页,其中 Devices 部分显示连接的 MacBook 作为设备卡片,位于会话列表上方" width="1206" height="895" data-path="images/whats-new/remote-control-phone-start.jpg" />

72 </Frame>

73 

74 <p className="digest-feature-try">在您想要访问的机器上启动 Remote Control,然后在手机上打开 Code 标签页:</p>

75 

76 ```bash terminal theme={null}

77 claude remote-control

78 ```

79 

80 <p className="digest-feature-try">您的机器显示为 Code 标签页顶部的设备卡片。点击它以选择目录并在那里启动会话。</p>

81 

82 <a className="digest-feature-link" href="/docs/zh-CN/remote-control#start-a-remote-control-session">启动 Remote Control 会话</a>

83</div>

84 

85<div className="digest-wins">

86 <p className="digest-wins-title">其他改进</p>

87 

88 <div className="digest-wins-grid">

89 <div>Claude Code 现在在 claude.ai 使用限制重置时自动继续您的会话;从 <code>/config</code> 中的 <strong>Continue automatically at usage limit</strong> 行关闭它</div>

90 <div>可选的 <a href="/docs/zh-CN/interactive-mode#check-spelling-as-you-type"><code>spellcheck</code> 设置</a>在您键入时在提示输入中为拼写错误的单词加下划线,使用您安装的 <code>aspell</code>、<code>hunspell</code> 或 <code>ispell</code></div>

91 <div>在具有开放 GitLab 合并请求的分支上,使用通过 <code>glab auth login</code> 进行身份验证的 <code>glab</code> CLI,页脚显示一个 <a href="/docs/zh-CN/interactive-mode#gitlab-merge-requests"><code>MR !N</code> 徽章</a>,其颜色取决于合并请求是草稿、开放还是可合并</div>

92 <div>从手机或 claude.ai/code 更改工作量级别,它 <a href="/docs/zh-CN/remote-control#what-connected-devices-see">应用于您机器上的会话</a>;由 Desktop 或 VS Code 托管的 Remote Control 会话也向连接的设备显示会话的当前权限模式</div>

93 <div>您可以在 Claude 工作时打开 <a href="/docs/zh-CN/permissions#manage-permissions"><code>/permissions</code></a> 或运行 <code>/add-dir \<path></code>;权限规则更改适用于当前轮次的其余部分</div>

94 <div>当后台任务使 <a href="/docs/zh-CN/goal#background-work-defers-evaluation"><code>/goal</code></a> 等待时,Claude 在 30 分钟后检查它们,而不是无限期等待,并继续检查,在会话空闲时以更长的间隔检查;设置 <code>CLAUDE\_CODE\_GOAL\_CHECKIN\_MINUTES=0</code> 以选择退出</div>

95 <div>您自己的提示现在在成绩单中呈现 markdown,具有突出显示的代码块、内联代码和列表,与回复的方式相同</div>

96 <div>新的 <a href="/docs/zh-CN/model-config#set-a-default-model-for-new-sessions"><code>ANTHROPIC\_DEFAULT\_MODEL</code></a> 环境变量设置新会话启动的模型;<code>/model</code> 选择仍会覆盖它并在重启后保持</div>

97 <div>使用 <code>SendMessage</code> 上的 <code>notify\_when\_idle</code> 输入,Claude 可以要求同一机器上的另一个 Claude Code 会话 <a href="/docs/zh-CN/cross-session-messaging#get-a-notice-when-another-session-goes-idle">在它下次空闲时发送一个通知</a></div>

98 <div>将 <a href="/docs/zh-CN/interactive-mode#make-ctrl-w-delete-back-to-whitespace"><code>keybindingFlavor</code></a> 设置为 <code>"readline"</code>,使提示中的 <code>Ctrl+W</code> 删除回到前一个空格,如 Bash 所做的那样,而不是在标点符号(如 <code>/</code>)处停止</div>

99 <div>在本机 Windows 上,您的 Claude Code 会话现在可以 <a href="/docs/zh-CN/cross-session-messaging#availability">相互消息</a>,使用 <code>SendMessage</code> 并使用 <code>ListAgents</code> 找到彼此,如在 macOS 和 Linux 上一样</div>

100 <div>自托管运行器接受 `--defer-shutdown-max-min`,它 <a href="/docs/zh-CN/self-hosted-environments-deploy#defer-the-drain-past-the-first-signal">在 SIGTERM 后的设定分钟数内继续为附加会话提供服务</a></div>

101 <div>自托管运行器接受 `--proxy-authorization-command` 或 `--proxy-authorization-file` 为 <a href="/docs/zh-CN/self-hosted-environments-deploy#authenticate-to-an-egress-proxy">需要一个的出口代理提供新的 `Proxy-Authorization` 标头</a></div>

102 </div>

103</div>

104 

105[v2.1.234–v2.1.239 的完整更新日志 →](/docs/en/changelog#2-1-234)

workflows.md +2 −2

Details

173 173 

174启用 ultracode 后,Claude 决定任务何时值得工作流。单个请求可以变成一系列工作流:一个理解代码,一个进行更改,一个验证它。这适用于会话中的每个任务,所以每个请求使用更多令牌并花费比较低努力级别更长的时间。174启用 ultracode 后,Claude 决定任务何时值得工作流。单个请求可以变成一系列工作流:一个理解代码,一个进行更改,一个验证它。这适用于会话中的每个任务,所以每个请求使用更多令牌并花费比较低努力级别更长的时间。

175 175 

176`/effort ultracode` 持续当前会话;要让每个会话都以它开始,设置 [`ultracode`](/docs/zh-CN/settings-reference#ultracode) 设置。当您返回日常工作时,使用 `/effort high` 下降。它在支持 `xhigh` [努力](/docs/zh-CN/model-config#adjust-effort-level)的模型上可用;在其他模型上,`/effort` 菜单不提供它。176`/effort ultracode` 持续当前会话;要让每个会话都以它开始,设置 [`ultracode`](/docs/zh-CN/settings-reference#ultracode) 设置。当您返回日常工作时,使用 `/effort high` 下降。`/effort` 菜单仅在 [ultracode 可用时](/docs/zh-CN/model-config#when-ultracode-is-available)提供它。

177 177 

178<h3 id="approve-the-plan-before-it-runs">178<h3 id="approve-the-plan-before-it-runs">

179 在运行前批准计划179 在运行前批准计划


348 348 

349主体是带有顶级 `await` 的纯 JavaScript。`agent()` 生成一个子代理,`pipeline()` 为列表中的每个项目运行一个,`parallel()` 同时运行一组代理任务并等待所有任务完成。349主体是带有顶级 `await` 的纯 JavaScript。`agent()` 生成一个子代理,`pipeline()` 为列表中的每个项目运行一个,`parallel()` 同时运行一组代理任务并等待所有任务完成。

350 350 

351如果您在运行中途停止 `agent()` 调用或它遇到不可恢复的 API 错误,则 `agent()` 调用解析为 `null`。`pipeline()` 在结果数组中保留该 `null`,这就是为什么示例以 `.filter(Boolean)` 结尾以删除这些条目。351如果您在运行中途停止 `agent()` 调用或它遇到不可恢复的 API 错误,则 `agent()` 调用解析为 `null`。在[自动模式](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode)中,分类器可以在子代理启动之前阻止 `agent()` 调用。被阻止的调用解析为 `null` 并在运行的进度视图中显示原因。`pipeline()` 在结果数组中保留每个 `null`,这就是为什么示例以 `.filter(Boolean)` 结尾以删除这些条目。

352 352 

353如果您在 `agent()` 调用上传递 `schema`,该子代理将返回与形状匹配的 JSON 而不是散文。Claude Code 在启动子代理之前检查架构:当它可以证明架构自相矛盾时,调用失败并显示一个错误,命名矛盾,子代理永远不会启动。它可以证明的一个矛盾是 `additionalProperties: false` 排除的 `required` 键。353如果您在 `agent()` 调用上传递 `schema`,该子代理将返回与形状匹配的 JSON 而不是散文。Claude Code 在启动子代理之前检查架构:当它可以证明架构自相矛盾时,调用失败并显示一个错误,命名矛盾,子代理永远不会启动。它可以证明的一个矛盾是 `additionalProperties: false` 排除的 `required` 键。

354 354