SpyBara
Go Premium

Documentation 2026-10-23 22:59 UTC to 2026-10-24 22:59 UTC

31 files changed +676 −99. View all changes and history on the product overview
2026
Fri 30 23:01 Thu 29 23:57 Wed 28 23:57 Tue 27 22:59 Mon 26 22:57 Sun 25 23:58 Sat 24 22:59 Fri 23 22:59 Thu 22 22:58 Wed 21 23:02 Tue 20 23:00 Mon 19 23:58 Sat 17 23:57 Fri 16 22:59 Thu 15 23:58 Wed 14 22:58 Tue 13 23:57 Sun 11 23:57 Sat 10 23:01 Fri 9 23:02 Thu 8 22:58 Wed 7 23:59 Tue 6 23:59 Mon 5 23:58 Sun 4 23:58 Sat 3 23:57 Fri 2 22:59 Thu 1 23:59

artifacts.md +1 −3

Details

340 340 

341Claude Docs 作为 claude.ai [连接器](https://code.claude.com/docs/zh-CN/mcp.md#use-mcp-servers-from-claude-ai)而不是命令到达 Claude Code。连接后,`/mcp` 将其列为 `claude.ai Claude Docs`。针对供其他人使用的文档的请求随后转到 Claude Docs 而不是工件页面:规范、提案或您在会话中完成的计划的写入。Claude 在草拟文档时给您文档的链接。341Claude Docs 作为 claude.ai [连接器](https://code.claude.com/docs/zh-CN/mcp.md#use-mcp-servers-from-claude-ai)而不是命令到达 Claude Code。连接后,`/mcp` 将其列为 `claude.ai Claude Docs`。针对供其他人使用的文档的请求随后转到 Claude Docs 而不是工件页面:规范、提案或您在会话中完成的计划的写入。Claude 在草拟文档时给您文档的链接。

342 342 

343属于代码库的文档(例如 README)保持为文件。要为 Claude 否则会放在 Claude Docs 中的内容获取文件,请命名格式,例如 `.docx` 或存储库中的 Markdown 文件。343属于代码库的文档(例如 README)保持为文件。要为 Claude 否则会放在 Claude Docs 中的内容获取文件,请命名格式,例如 `.docx` 或仓库中的 Markdown 文件。要仅关闭 `claude.ai Claude Docs` 连接器,请参阅[禁用 claude.ai 连接器](https://code.claude.com/docs/zh-CN/mcp.md#disable-claude-ai-connectors)。

344 

345要关闭连接器,请将 `claude.ai Claude Docs` 添加到 `deniedMcpServers` 或使用 `/mcp` 切换,两者都在[禁用 claude.ai 连接器](https://code.claude.com/docs/zh-CN/mcp.md#disable-claude-ai-connectors)中描述。

346 344 

347## 页面约束345## 页面约束

348 346 

Details

458 458 

459#### 父设置中的 hook 和 skill 键如何生效459#### 父设置中的 hook 和 skill 键如何生效

460 460 

461如果您通过 Agent SDK 的 `managedSettings` 选项将 `disableAllHooks: true` 作为父设置传递,并非所有 hook 都会停止。您的 [SDK hook 回调](https://code.claude.com/docs/zh-CN/agent-sdk/hooks.md)仍会运行,管理员的 hook 也会运行,您的应用程序无法将其关闭。461您的应用程序在 Agent SDK 的 [`managedSettings`](https://code.claude.com/docs/zh-CN/agent-sdk/typescript#options) 选项中传递的键属于父设置。在管理员部署了托管设置的机器上,Claude Code 会忽略父设置,除非管理员[允许嵌入宿主添加策略](https://code.claude.com/docs/zh-CN/managed-settings.md#let-an-embedding-host-add-policy)。

462 462 

463在管理员部署了托管设置的机器上,Claude Code 会忽略父设置,除非管理员[允许嵌入宿主添加策略](https://code.claude.com/docs/zh-CN/managed-settings.md#let-an-embedding-host-add-policy)。463如果您在 `managedSettings` 中传递 [`disableAllHooks: true`](https://code.claude.com/docs/zh-CN/settings-reference#disableallhooks):

464 

465* **停止**:用户、项目和本地 hook,以及在 Agent frontmatter 或 SDK 的 [`settings` 选项](https://code.claude.com/docs/zh-CN/agent-sdk/typescript#options)中声明的 hook。

466* **继续运行**:您的应用程序的 [SDK hook 回调](https://code.claude.com/docs/zh-CN/agent-sdk/hooks.md)以及来自托管设置的管理员 hook。您的应用程序无法关闭管理员的 hook。

464 467 

465| 您传递的内容 | 结果 |468| 您传递的内容 | 结果 |

466| :- | :- |469| :- | :- |

467| `disableAllHooks: true` | 被视为 `allowManagedHooksOnly: true`,因此列为[在 `allowManagedHooksOnly` 下被阻止](https://code.claude.com/docs/zh-CN/settings-reference#what-runs-under-allowmanagedhooksonly)的 hook 会停止,SDK [`settings` 选项](https://code.claude.com/docs/zh-CN/agent-sdk/typescript#options)中的 hook 也会停止。 |470| `hooks`,或包含条目的 `allowedHttpHookUrls` 或 `httpHookAllowedEnvVars` | Claude Code 会忽略该键。请改用 SDK 的 `settings` 选项。 |

468| [`disableSkillShellExecution: true`](https://code.claude.com/docs/zh-CN/settings-reference#disableskillshellexecution) | 生效。 |

469| `allowedHttpHookUrls: []` | 生效,除非管理员定义了 `hooks` 或启用了插件。不会运行任何 HTTP hook,但其他设置来源列出的 URL 除外。 |471| `allowedHttpHookUrls: []` | 生效,除非管理员定义了 `hooks` 或启用了插件。不会运行任何 HTTP hook,但其他设置来源列出的 URL 除外。 |

470| `httpHookAllowedEnvVars: []` | 生效,除非管理员定义了 `hooks` 或启用了插件。HTTP hook 标头只能包含其他设置来源列出的环境变量。 |472| `httpHookAllowedEnvVars: []` | 生效,除非管理员定义了 `hooks` 或启用了插件。HTTP hook 标头只能包含其他设置来源列出的环境变量。 |

471| 包含条目的 `allowedHttpHookUrls` 或 `httpHookAllowedEnvVars` | Claude Code 会忽略它,因为合并会扩大管理员的列表。请改用 SDK 的 `settings` 选项。 |473| [`disableSkillShellExecution: true`](https://code.claude.com/docs/zh-CN/settings-reference#disableskillshellexecution) | 生效。 |

472 474 

473在 `managedSettings` 中传递这些键需要 Claude Code v2.1.309 或更高版本,或 TypeScript Agent SDK v0.3.309 或更高版本。475在 `managedSettings` 中传递这些键需要 Claude Code v2.1.309 或更高版本,或 TypeScript Agent SDK v0.3.309 或更高版本。

474 476 

Details

8 8 

9> [!NOTE]9> [!NOTE]

10>10>

11> 云端会话在 Pro、Max 和 Team 计划上可用,以及拥有高级席位或 Chat + Claude Code 席位的 Enterprise 用户。如果您的 Enterprise 组织通过[自定义角色](https://support.claude.com/en/articles/13930452)管理您的访问权限,您还需要一个包含云端会话权限的角色。如果缺少该权限,请让 Owner 检查您的角色,并在 [**Organization settings > Roles**](https://claude.ai/admin-settings/roles) 中添加。11> 云端会话在 Pro、Max 和 Team 计划上可用,以及拥有高级席位或 Chat + Claude Code 席位的 Enterprise 用户。如果[自定义角色](https://support.claude.com/en/articles/13930452)管理您的访问权限,您还需要一个包含云端会话权限的角色,才能从浏览器、应用或终端在 Anthropic 的基础设施上启动会话。请让 Owner 在 [**Organization settings > Roles**](https://claude.ai/admin-settings/roles) 中将该权限添加到您的某个角色。

12 12 

13云端会话是在云基础设施上运行的 Claude Code 会话,而不是在您的机器上运行。默认情况下,它在 Anthropic 管理的基础设施上运行,或在路由到您的组织的[自托管环境](https://code.claude.com/docs/zh-CN/self-hosted-environments)时在那里运行。即使关闭笔记本电脑后,会话也会继续运行,您可以从任何设备检查或控制它。它会与您的其他 Claude 和 Claude Code 使用量一起计入您计划的用量限制,云端 VM 不会单独收费。13云端会话是在云基础设施上运行的 Claude Code 会话,而不是在您的机器上运行。默认情况下,它在 Anthropic 管理的基础设施上运行,或在路由到您的组织的[自托管环境](https://code.claude.com/docs/zh-CN/self-hosted-environments)时在那里运行。即使关闭笔记本电脑后,会话也会继续运行,您可以从任何设备检查或控制它。它会与您的其他 Claude 和 Claude Code 使用量一起计入您计划的用量限制,云端 VM 不会单独收费。

14 14 

Details

109 109 

110#### 添加机密110#### 添加机密

111 111 

112机密需要逐个添加,添加后无法编辑。要更改机密的主机或值,请将其删除后重新添加。112机密需要逐个添加。要更改机密的主机或值,请将其删除后重新添加。

113 113 

114要向[共享环境](#organization-shared-environments)添加机密,请从[管理设置](https://claude.ai/admin-settings)中的 **Cloud environments** 页面打开该环境进行编辑,然后在其 **Network secrets** 部分从步骤 2 继续。如果您使用的是 Team 计划且不持有[组织管理员角色](#requirements),请在您自己的环境中执行步骤 1,然后[填写简化表单](#add-a-secret-without-the-role)。114要向[共享环境](#organization-shared-environments)添加机密,请从[管理设置](https://claude.ai/admin-settings)中的 **Cloud environments** 页面打开该环境进行编辑,然后在其 **Network secrets** 部分从步骤 2 继续。如果您使用的是 Team 计划且不持有[组织管理员角色](#requirements),请在您自己的环境中执行步骤 1,然后[填写简化表单](#add-a-secret-without-the-role)。

115 115 


119 119 

120**2. 添加机密**120**2. 添加机密**

121 121 

122选择 **Add secret** 并填写表单。对于在请求头中传输的 API 密钥,保留默认的 **Secret type**,即 **Bearer**,并填写以下字段:122选择 **Add secret**(在管理设置中标记为 **Add**)并填写表单。对于在请求头中传输的 API 密钥,保留默认的 **Secret type**,即 **Bearer**,并填写以下字段:

123 123 

124* **Name**:机密的标签,例如 `Internal billing API`124* **Name**:机密的标签,例如 `Internal billing API`

125* **Allowed websites**:API 的主机,例如 `api.example.com`。前导 `*.` 匹配所有子域125* **Allowed websites**:API 的主机,例如 `api.example.com`。前导 `*.` 匹配所有子域


443 443 

444### 脚本要求444### 脚本要求

445 445 

446设置脚本有三个需要考虑的约束:446设置脚本有四个需要考虑的约束:

447 447 

448* **以零退出**:如果脚本以非零状态结束,会话将无法启动。在非关键命令后附加 `|| true`,以便间歇性安装失败不会阻止会话。448* **以零退出**:如果脚本以非零状态结束,会话将无法启动。在非关键命令后附加 `|| true`,以便间歇性安装失败不会阻止会话。

449* **在五分钟内完成**:将脚本的总运行时间保持在大约五分钟以内,以便[环境缓存](#environment-caching)可以建立。当设置耗时超过五分钟时,环境不会被缓存。使用 `&` 和 `wait` 并行运行独立的安装,并将任何无法容纳的单个下载移至 [SessionStart hook](#setup-scripts-vs-sessionstart-hooks),在后台启动它。如果新会话在设置期间停滞或失败,请参阅[新会话在设置期间挂起或超时](https://code.claude.com/docs/zh-CN/web-quickstart.md#new-sessions-hang-or-time-out-during-setup)。449* **在五分钟内完成**:将脚本的总运行时间保持在大约五分钟以内,以便[环境缓存](#environment-caching)可以建立。当设置耗时超过五分钟时,环境不会被缓存。使用 `&` 和 `wait` 并行运行独立的安装,并将任何无法容纳的单个下载移至 [SessionStart hook](#setup-scripts-vs-sessionstart-hooks),在后台启动它。如果新会话在设置期间停滞或失败,请参阅[新会话在设置期间挂起或超时](https://code.claude.com/docs/zh-CN/web-quickstart.md#new-sessions-hang-or-time-out-during-setup)。

450* **安装需要网络访问**:包安装需要连接到注册表。默认的 **Trusted** 级别涵盖[常见包注册表](#default-allowed-domains),包括 npm、PyPI、RubyGems 和 crates.io;使用 **None** 网络访问时,安装会失败。450* **安装需要网络访问**:包安装需要连接到注册表。默认的 **Trusted** 级别涵盖[常见包注册表](#default-allowed-domains),包括 npm、PyPI、RubyGems 和 crates.io;使用 **None** 网络访问时,安装会失败。

451* **环境的变量尚未设置**:脚本在会话设置环境的[环境变量](#set-environment-variables)之前运行。请在脚本本身中设置脚本所需的任何值。

451 452 

452### 环境缓存453### 环境缓存

453 454 

Details

123 123 

124当审查未应用被包含的文件时,请逐项检查以下内容:124当审查未应用被包含的文件时,请逐项检查以下内容:

125 125 

126* **位置**:将文件移至仓库根目录。指向子目录的路径(例如 `@docs/review-rules.md`)不会被包含。126* **位置**:将文件移至仓库根目录。除 [skill 文件](#include-a-skill-file)外,指向子目录的路径(例如 `@docs/review-rules.md`)不会被包含。

127* **名称**:文件名须完全匹配(包括大小写),并使用不含空格的名称。如果某行中的名称与 `REVIEW.md` 同级的任何文件都不匹配,该行会作为纯文本保留在 `REVIEW.md` 中,且检查运行不会将其报告为被跳过的包含项。127* **名称**:文件名须完全匹配(包括大小写),并使用不含空格的名称。如果某行中的名称与 `REVIEW.md` 同级的任何文件都不匹配,该行会作为纯文本保留在 `REVIEW.md` 中,且检查运行不会将其报告为被跳过的包含项。

128* **仅限一层**:在根目录的 `REVIEW.md` 中列出所有文件。被包含文件或子目录 `REVIEW.md` 中的 `@` 行会保留为纯文本,而指向其他文件的 Markdown 链接不属于包含项。128* **仅限一层**:在根目录的 `REVIEW.md` 中列出所有文件。被包含文件或子目录 `REVIEW.md` 中的 `@` 行会保留为纯文本([skill 文件有所不同](#include-a-skill-file)),而指向其他文件的 Markdown 链接不属于包含项。

129* **限制**:最多包含八个不同的文件,并使 `REVIEW.md` 及其包含的文件合计小于 150,000 字节。会达到字节上限的文件将被整体跳过,而不会被截断。检查运行会报告因任一限制而跳过了多少个包含行。129* **限制**:最多包含八个不同的文件,并使 `REVIEW.md` 及其包含的文件合计小于 150,000 字节。会达到字节上限的文件将被整体跳过,而不会被截断。检查运行会报告因任一限制而跳过了多少个包含行。

130* **链接**:`REVIEW.md` 及其包含的文件中的 Markdown 链接总数应不超过 64 个。指向 `http`、`https` 或 `mailto` 地址以及 `#` 锚点的链接不计入。超过该上限时,审查会跳过您的整个根目录 `REVIEW.md`,而不仅仅是被包含的文件。此时检查运行会[说明指令未被应用](https://code.claude.com/docs/zh-CN/code-review-troubleshooting.md#the-check-run-mentions-review-md)。130* **链接**:`REVIEW.md` 及其包含的文件中的 Markdown 链接总数应不超过 64 个。指向 `http`、`https` 或 `mailto` 地址以及 `#` 锚点的链接不计入,[skill 文件](#include-a-skill-file)中的链接也不计入。超过该上限时,审查会跳过您的整个根目录 `REVIEW.md`,而不仅仅是被包含的文件。此时检查运行会[说明指令未被应用](https://code.claude.com/docs/zh-CN/code-review-troubleshooting.md#the-check-run-mentions-review-md)。

131* **已合并的副本**:将被包含的文件合并到[读取 `REVIEW.md` 的分支](#which-branch-review-md-is-read-from)中。审查会从同一个提交中读取两者,从不从 Pull Request 自身的更改中读取。131* **已合并的副本**:将被包含的文件合并到[读取 `REVIEW.md` 的分支](#which-branch-review-md-is-read-from)中。审查会从同一个提交中读取两者,从不从 Pull Request 自身的更改中读取。

132 132 

133### 包含 Skill 文件

134 

135要让审查遵循您在 [skill](https://code.claude.com/docs/zh-CN/skills.md) 中维护的指导,请在根目录的 `REVIEW.md` 中包含该 skill 的 `SKILL.md`。Code Review 不会运行 skill。

136 

137在单独的一行中添加 `@` 和 `SKILL.md` 的路径,格式为 `.claude/skills/<folder>/SKILL.md`:

138 

139```markdown theme={null}

140# Review instructions

141 

142Report at most five Nits per review.

143 

144@.claude/skills/api-review/SKILL.md

145 

146Treat any change under `migrations/` as Important.

147```

148 

149请保护[读取 `REVIEW.md` 的分支](#which-branch-review-md-is-read-from),因为 Code Review 仅在从受保护分支读取 `REVIEW.md` 时才会包含 skill 文件。skill 文件计入八个文件和 150,000 字节的限制,并且有其自身 30,000 字节的限制。

150 

151#### 编写能被 Code Review 包含的 Skill 行

152 

153请使用不含空格的文件夹名称。路径中含有空格的行会作为纯文本保留在 `REVIEW.md` 中,且检查运行不会将其报告为被跳过的包含项。

154 

155如果某个 skill 的 `@` 行违反了以下任一规则,Code Review 不会从该行包含该 skill:

156 

157* **路径**:从仓库根目录以 `.claude/skills/<folder>/SKILL.md` 的形式写出路径,skill 的文件夹须直接位于 `skills/` 下。与根目录下的文件名不同,此形式的路径如果不匹配任何文件,会被跳过并计数。

158* **来源**:将 `.claude/` 下任何其他文件中的指导,或[内置、个人或插件 skill](https://code.claude.com/docs/zh-CN/skills.md#where-skills-live) 中的指导,复制到与 `REVIEW.md` 同级的文件中。您无法直接包含这些内容。

159* **文件**:将 `SKILL.md` 作为常规文本文件提交。Code Review 不会跟随符号链接,无论该链接是文件本身还是其路径中的某个文件夹。

160* **大小**:使 `SKILL.md` 不超过 30,000 字节(包括 frontmatter)

161* **数量**:最多编写八个 skill 行。重复的行会再次计入这八个。

162* **`REVIEW.md` 中的块**:不要将 `@` 行放在代码围栏内。关闭其上方的每个 HTML 注释以及每个 `<pre>`、`<script>`、`<style>` 或 `<textarea>` 块。

163 

164当 Code Review 因违反文件、大小、数量或块规则而跳过某个 skill 行时,检查运行中[关于被跳过包含行的消息](https://code.claude.com/docs/zh-CN/code-review-troubleshooting.md#the-check-run-mentions-review-md)会将其计入。仅当审查从受保护分支应用 `REVIEW.md` 时,才会显示该消息。

165 

166#### 检查审查从 Skill 中获得的内容

167 

168当 skill 被包含时,审查只会获得 `SKILL.md` 的正文,而不会获得该 skill 的其他任何内容,因此请对照以下列表检查该 skill。

169 

170* **Frontmatter**:在正文中重复审查所需的 [frontmatter](https://code.claude.com/docs/zh-CN/skills.md#frontmatter-reference) 内容,例如 `description` 给出的使用该 skill 的条件

171* **注入的命令**:写出 [`!` 命令](https://code.claude.com/docs/zh-CN/skills#inject-dynamic-context)本应提供的内容。Code Review 不会运行该命令,并会用占位符替换包含该命令的整行或整个块。

172* **替换变量**:将 `$ARGUMENTS` 和其他[替换变量](https://code.claude.com/docs/zh-CN/skills.md#available-string-substitutions)替换为固定文本,因为审查不传递任何参数,并会将它们原样保留

173* **支持文件**:将审查所需的内容复制到 `SKILL.md` 中,因为 Code Review 不会加载脚本、链接的文件或 `@file` 引用

174* **排除项和 Nit 上限**:将排除发现或限制 Nit 数量的指令写在 `REVIEW.md` 或与其同级的文件中,而不是写在 skill 中。Code Review 不接受以 skill 的文本作为这两者的依据。

175* **指向仓库文件的链接**:用文字说明链接或 `@file` 引用所指向的内容。审查会将该路径视为纯文本或占位符。

176 

177如果您编辑 skill 的 `!` 命令、`$ARGUMENTS` 或链接,也会改变它在 Claude Code 中的工作方式。如果您的团队依赖这些功能,请将指导复制到与 `REVIEW.md` 同级的文件中,并包含该文件来代替 skill。

178 

179#### Code Review 在 Skill 文本中更改的字符

180 

181Code Review 会更改 skill 文本中的某些字符,因此您的代码示例会以下面的形式传达给审查。

182 

183```text theme={null}

184In SKILL.md: Use `items[0]`, never `List<String>`.

185The review reads: Use ˋitems(0)ˋ, never ˋList< String>ˋ.

186 

187In SKILL.md: Run `ps | grep api` and ask @alice.

188The review reads: Run ˋps ¦ grep apiˋ and ask @ alice.

189```

190 

191如果某条规则依赖于其中某个字符,也请用文字加以说明。

192 

133### 从哪个分支读取 REVIEW\.md193### 从哪个分支读取 REVIEW\.md

134 194 

135Code Review 从 Pull Request 的基础分支或默认分支读取 `REVIEW.md`,从不从 Pull Request 自身的更改中读取。如需更改审查行为,请先合并对 `REVIEW.md` 的更改。195Code Review 从 Pull Request 的基础分支或默认分支读取 `REVIEW.md`,从不从 Pull Request 自身的更改中读取。如需更改审查行为,请先合并对 `REVIEW.md` 的更改。


140* 排除路径、文件或问题类别200* 排除路径、文件或问题类别

141* 限制 nit 评论数量201* 限制 nit 评论数量

142 202 

203请将排除项和 Nit 上限写在 `REVIEW.md` 或与其同级的文件中,而不是写在[被包含的 skill](#include-a-skill-file) 中。

204 

143#### 哪些设置算作分支保护205#### 哪些设置算作分支保护

144 206 

145Code Review 将以下设置视为保护:207Code Review 将以下设置视为保护:

Details

67 67 

68## 检查运行提到 REVIEW\.md68## 检查运行提到 REVIEW\.md

69 69 

70检查运行可能携带的关于 `REVIEW.md` 的消息中,有以下三条:70检查运行可能携带的关于 `REVIEW.md` 的消息中,有以下四条:

71 71 

72* **"This review applied the repository's review instructions (REVIEW\.md) from its default branch, which is not protected against direct pushes."**:该审查仅读取了根目录下的文件。请参阅[从哪个分支读取 REVIEW.md](https://code.claude.com/docs/zh-CN/code-review-customize.md#which-branch-review-md-is-read-from),了解保护该分支会带来哪些变化。72* **"This review applied the repository's review instructions (REVIEW\.md) from its default branch, which is not protected against direct pushes."**:该审查仅读取了根目录下的文件。请参阅[从哪个分支读取 REVIEW.md](https://code.claude.com/docs/zh-CN/code-review-customize.md#which-branch-review-md-is-read-from),了解保护该分支会带来哪些变化。

73* **"were not applied to this review: branch protection could not be confirmed"**:该审查没有读取任何 `REVIEW.md`。73* **"were not applied to this review: branch protection could not be confirmed"**:该审查没有读取任何 `REVIEW.md`。


75 * **链接过多**:文件包含超过 64 个 Markdown 链接。请将链接削减至 [64 个或更少](https://code.claude.com/docs/zh-CN/code-review-customize.md#include-other-files-in-review-md)。75 * **链接过多**:文件包含超过 64 个 Markdown 链接。请将链接削减至 [64 个或更少](https://code.claude.com/docs/zh-CN/code-review-customize.md#include-other-files-in-review-md)。

76 * **审查无法解析的链接**:文件中有格式错误的 Markdown 链接。请修复或删除该链接。76 * **审查无法解析的链接**:文件中有格式错误的 Markdown 链接。请修复或删除该链接。

77 * **指向已更改文件的链接**:文件链接到此 Pull Request 更改的文件或文件夹,且审查无法仅排除包含该链接的行。请直接在 `REVIEW.md` 中编写该规则。77 * **指向已更改文件的链接**:文件链接到此 Pull Request 更改的文件或文件夹,且审查无法仅排除包含该链接的行。请直接在 `REVIEW.md` 中编写该规则。

78* **"include line(s) in the root REVIEW\.md were skipped on this review"**:根目录下的 `REVIEW.md` 已应用,但这些行所指定的文件未被应用。请查看[在 REVIEW.md 中包含其他文件](https://code.claude.com/docs/zh-CN/code-review-customize.md#include-other-files-in-review-md)下的列表;对于 skill,还需查看[包含 skill 文件](https://code.claude.com/docs/zh-CN/code-review-customize.md#include-a-skill-file)下的列表。

78 79 

79## 设置问题80## 设置问题

80 81 

desktop.md +2 −2

Details

844| [`CLAUDE_CONFIG_DIR`](https://code.claude.com/docs/zh-CN/env-vars#variables) 或 [`CLAUDE_CODE_TMPDIR`](https://code.claude.com/docs/zh-CN/env-vars#variables) | 在[为开发服务器设置变量的位置之一](#set-environment-variables-for-dev-servers)中设置它,然后退出并重新打开 Desktop |844| [`CLAUDE_CONFIG_DIR`](https://code.claude.com/docs/zh-CN/env-vars#variables) 或 [`CLAUDE_CODE_TMPDIR`](https://code.claude.com/docs/zh-CN/env-vars#variables) | 在[为开发服务器设置变量的位置之一](#set-environment-variables-for-dev-servers)中设置它,然后退出并重新打开 Desktop |

845| `API_TIMEOUT_MS`、`ANTHROPIC_BASE_URL` 或 Desktop 自行设置的其他变量 | 请参阅 [Desktop 自行设置的环境变量](#environment-variables-desktop-sets-itself) |845| `API_TIMEOUT_MS`、`ANTHROPIC_BASE_URL` 或 Desktop 自行设置的其他变量 | 请参阅 [Desktop 自行设置的环境变量](#environment-variables-desktop-sets-itself) |

846 846 

847在 macOS 或 Linux 上,如果您已经在 `~/.zshrc` 或 `~/.bashrc` 中使用 `export` 设置了变量,请参阅[Claude 运行的命令中缺少导出的变量或变量值错误](#exported-variable-missing-or-wrong-in-commands-claude-runs)。847在 macOS 或 Linux 上,如果您使用 `export` 设置的变量在 Claude 运行的命令中缺失或值不正确,请参阅[导出的变量在 Claude 运行的命令中缺失或不正确](#exported-variable-missing-or-wrong-in-commands-claude-runs)。

848 848 

849#### 为本地会话设置环境变量849#### 为本地会话设置环境变量

850 850 


908 908 

909**4. 使用已保存的环境**909**4. 使用已保存的环境**

910 910 

911将变量添加到[已保存的本地环境](#set-environment-variables-for-local-sessions),然后从该环境启动新会话。对于 `PATH` 或 `CLAUDE_CONFIG_DIR` 等变量,请改为遵循[其各自的说明](#environment-variables-in-local-sessions)。911将该变量添加到[已保存的本地环境](#set-environment-variables-for-local-sessions),然后从该环境启动新会话。对于 `PATH`、`CLAUDE_CONFIG_DIR` 或 `API_TIMEOUT_MS` 等变量,请改为按照[其各自的说明](#environment-variables-in-local-sessions)操作。

912 912 

913在 v2.1.304 之前,Claude Code 不会将导出的变量传递给命令,因此请[检查会话运行的版本](#claude-code-version-in-the-code-tab)。913在 v2.1.304 之前,Claude Code 不会将导出的变量传递给命令,因此请[检查会话运行的版本](#claude-code-version-in-the-code-tab)。

914 914 

Details

15 15 

16本页面涵盖本地定时任务;有关云端定时任务及其触发选项,请参阅[使用定时任务自动化工作](https://code.claude.com/docs/zh-CN/routines.md)。16本页面涵盖本地定时任务;有关云端定时任务及其触发选项,请参阅[使用定时任务自动化工作](https://code.claude.com/docs/zh-CN/routines.md)。

17 17 

18> [!NOTE]

19>

20> 如果您的应用以其[旧名称](https://code.claude.com/docs/zh-CN/routines.md#where-the-name-routines-still-appears)显示此功能,请在本页面提到 **Scheduled** 的地方点击 **Routines**,在提到 **New task** 的地方点击 **New routine**。

21 

18## 比较调度选项22## 比较调度选项

19 23 

20Claude Code 提供三种方式来安排定期或一次性工作:24Claude Code 提供三种方式来安排定期或一次性工作:


45 49 

46**1. 打开 Scheduled tasks 页面**50**1. 打开 Scheduled tasks 页面**

47 51 

48在 [**Code** 选项卡](https://code.claude.com/docs/zh-CN/desktop.md)中,单击侧边栏中的 **Scheduled**,或侧边栏 **More** 菜单中的 **Scheduled**。52在 [**Code** 选项卡](https://code.claude.com/docs/zh-CN/desktop.md)中,单击侧边栏中的 **Scheduled**,或侧边栏 **More** 菜单中的 **Scheduled**。如果侧边栏显示的是 **Routines** 而不是 **Scheduled**,请单击 **Routines**,然后单击 **New routine**,并继续参阅[整页表单](#full-page-form)。

49 53 

50**2. 开始新任务**54**2. 开始新任务**

51 55 

52单击 **New task**。如果弹出包含 **Create with Claude** 和 **Set up manually** 的菜单,请选择 **Set up manually**。此时会打开 **New scheduled task** 对话框。如果 **Only on this computer** 位于对话框顶部,请在输入任何内容之前,转到[顶部带有 Only on this computer 的对话框](#dialog-with-only-on-this-computer-at-the-top)。56单击 **New task** 以打开 **New scheduled task** 对话框。在继续之前,请检查是否出现以下界面:

57 

58* 如果弹出包含 **Create with Claude** 和 **Set up manually** 的菜单,请选择 **Set up manually** 以打开该对话框。

59* 如果 **Only on this computer** 位于对话框顶部,请在输入任何内容之前,转到[顶部带有 Only on this computer 的对话框](#dialog-with-only-on-this-computer-at-the-top)。

60* 如果弹出包含 **Local** 和 **Cloud** 的菜单,或者打开的是整个页面而不是对话框,请转到[整页表单](#full-page-form)。

53 61 

54**3. 为任务命名**62**3. 为任务命名**

55 63 


99 107 

100单击 **Create**。随后将打开该任务的详情页面。108单击 **Create**。随后将打开该任务的详情页面。

101 109 

110### 整页表单

111 

112如果弹出包含 **Local** 和 **Cloud** 的菜单,请选择 **Local**。此时会打开标题为 **New local routine** 或 **New local scheduled task** 的页面。请填写其中的字段:

113 

114* **Name**:输入在您的所有任务中唯一的名称。

115* **Description**:输入描述。

116* **Instructions**:输入任务运行时 Claude 应该执行的操作。在同一输入框中,选择权限模式、模型以及任务运行所在的文件夹。

117* **Schedule**:选择一个[计划选项](#schedule-options)。

118 

119如果 **Create** 不可用,请将鼠标悬停在其上方,查看表单还缺少哪些内容。单击 **Create**,随后将打开该任务的详情页面。

120 

102## 调度选项121## 调度选项

103 122 

104当您在 **Advanced settings** 下启用 **Only on this computer** 时,**Trigger** 卡片提供 Hourly、Daily、Weekdays 和 Weekly 选项。若要为此类任务使用 **Manual** 或 **Custom**,请在创建任务后打开其 [**Edit** 表单](#manage-scheduled-tasks)。该表单以及[顶部带有 **Only on this computer** 的对话框](#dialog-with-only-on-this-computer-at-the-top)提供以下六个选项:123当您在 **Advanced settings** 下启用 **Only on this computer** 时,**Trigger** 卡片提供 Hourly、Daily、Weekdays 和 Weekly 选项。若要为此类任务使用 **Manual** 或 **Custom**,请在创建任务后打开其 [**Edit** 表单](#manage-scheduled-tasks)。该表单、[顶部带有 **Only on this computer** 的对话框](#dialog-with-only-on-this-computer-at-the-top)以及[整页表单](#full-page-form)提供以下六个选项:

105 124 

106* **Hourly**:每小时运行一次125* **Hourly**:每小时运行一次

107* **Daily**:每天在您选择的本地时间运行126* **Daily**:每天在您选择的本地时间运行

env-vars.md +1 −1

Details

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

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

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

301| `CLAUDE_CODE_FORCE_TERMINAL_IMAGES` | 当您的终端使用 Unicode 占位符绘制 kitty 图形协议图像,但您仍看到 `Image` 的灰显 `alt` 文本时,设置为 `1` 可将 [mod `Image` 元素](https://code.claude.com/docs/zh-CN/plugins/mods/reference#elements)绘制为图片。请参阅[哪些终端会绘制 `Image`](https://code.claude.com/docs/zh-CN/plugins/mods/gallery#image-and-client),以及为什么此变量在 tmux 或 screen 中无效 |301| `CLAUDE_CODE_FORCE_TERMINAL_IMAGES` | 当您的终端使用 Unicode 占位符绘制 kitty 图形协议图像,而您仍看到 `Image` 的灰显 `alt` 文本时,设置为 `1` 可将 [mod `Image` 元素](https://code.claude.com/docs/zh-CN/plugins/mods/reference#elements)绘制为图片。请参阅[哪些终端会绘制 `Image` 以及在哪些情况下不应设置此变量](https://code.claude.com/docs/zh-CN/plugins/mods/gallery#image-and-client) |

302| `CLAUDE_CODE_FORK_SUBAGENT` | 控制 fork 模式,该模式默认开启,允许 Claude 自行启动 [fork](https://code.claude.com/docs/zh-CN/sub-agents.md#fork-the-current-conversation)。在 fork 模式开启时,Claude 在您机器上的交互式终端、VS Code 或桌面会话中也无法[等待子代理](https://code.claude.com/docs/zh-CN/sub-agents.md#run-subagents-in-foreground-or-background)。设置为 `0` 可关闭 fork 模式。有关版本信息,请参阅[关闭 fork 模式](https://code.claude.com/docs/zh-CN/sub-agents.md#turn-fork-mode-on-or-off) |302| `CLAUDE_CODE_FORK_SUBAGENT` | 控制 fork 模式,该模式默认开启,允许 Claude 自行启动 [fork](https://code.claude.com/docs/zh-CN/sub-agents.md#fork-the-current-conversation)。在 fork 模式开启时,Claude 在您机器上的交互式终端、VS Code 或桌面会话中也无法[等待子代理](https://code.claude.com/docs/zh-CN/sub-agents.md#run-subagents-in-foreground-or-background)。设置为 `0` 可关闭 fork 模式。有关版本信息,请参阅[关闭 fork 模式](https://code.claude.com/docs/zh-CN/sub-agents.md#turn-fork-mode-on-or-off) |

303| `CLAUDE_CODE_FORWARD_SUBAGENT_TEXT` | 设置为 `1` 可在 `claude -p --output-format stream-json` 输出中发出[子代理](https://code.claude.com/docs/zh-CN/sub-agents.md)的文本和思考块,行为与 [`--forward-subagent-text`](https://code.claude.com/docs/zh-CN/cli-reference#cli-flags) 标志相同。当调用 `claude` 的外部框架无法自行传递该标志时,请使用此变量。该标志在"使用 stream-json 输出的非交互模式"之外会报错退出,而此变量在这些情况下会被忽略,因此在进程范围内设置时,嵌套调用仍能正常工作。需要 Claude Code v2.1.211 或更高版本 |303| `CLAUDE_CODE_FORWARD_SUBAGENT_TEXT` | 设置为 `1` 可在 `claude -p --output-format stream-json` 输出中发出[子代理](https://code.claude.com/docs/zh-CN/sub-agents.md)的文本和思考块,行为与 [`--forward-subagent-text`](https://code.claude.com/docs/zh-CN/cli-reference#cli-flags) 标志相同。当调用 `claude` 的外部框架无法自行传递该标志时,请使用此变量。该标志在"使用 stream-json 输出的非交互模式"之外会报错退出,而此变量在这些情况下会被忽略,因此在进程范围内设置时,嵌套调用仍能正常工作。需要 Claude Code v2.1.211 或更高版本 |

304| `CLAUDE_CODE_GATEWAY_HINT_HEADERS` | 设置为 `1` 可在自定义代理或第三方提供商(例如 Amazon Bedrock 或 Claude Platform on AWS)上发送[网关提示标头](https://code.claude.com/docs/zh-CN/llm-gateway-protocol.md#gateway-hint-headers),例如 `x-claude-code-request-class` 和 `x-claude-code-compaction`。设置为 `0` 可在所有连接上停止发送这些标头,包括直接连接到 Anthropic API 的情况(Claude Code 默认会在此类连接上发送这些标头)。需要 Claude Code v2.1.273 或更高版本 |304| `CLAUDE_CODE_GATEWAY_HINT_HEADERS` | 设置为 `1` 可在自定义代理或第三方提供商(例如 Amazon Bedrock 或 Claude Platform on AWS)上发送[网关提示标头](https://code.claude.com/docs/zh-CN/llm-gateway-protocol.md#gateway-hint-headers),例如 `x-claude-code-request-class` 和 `x-claude-code-compaction`。设置为 `0` 可在所有连接上停止发送这些标头,包括直接连接到 Anthropic API 的情况(Claude Code 默认会在此类连接上发送这些标头)。需要 Claude Code v2.1.273 或更高版本 |

errors.md +66 −9

Details

317| `Skipping connection (recent failure cached; retries automatically in 15 min, or edit the plugin config to retry now)` | [Plugin 错误](#skipping-connection-recent-failure-cached) |317| `Skipping connection (recent failure cached; retries automatically in 15 min, or edit the plugin config to retry now)` | [Plugin 错误](#skipping-connection-recent-failure-cached) |

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

319| `MCP server "<name>" connection closed before the tool call was answered` | [工具错误](#connection-closed-before-the-tool-call-was-answered) |319| `MCP server "<name>" connection closed before the tool call was answered` | [工具错误](#connection-closed-before-the-tool-call-was-answered) |

320| `MCP server "<name>" is disabled — re-enable it via /mcp to use its tools` | [工具错误](#mcp-server-is-disabled) |

321| `MCP server "<name>" tool "<tool>" timed out after <N>s. The server asked the user a question, and no answer came before the time limit.` | [工具错误](#mcp-tool-call-timed-out-with-the-servers-question-unanswered) |

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

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

322| `cannot contain null bytes (\0)` | [工具错误](#path-cannot-contain-null-bytes) |324| `cannot contain null bytes (\0)` | [工具错误](#path-cannot-contain-null-bytes) |


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

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

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

353| `git is not installed on this Mac. To install it, run xcode-select --install, then try again.` | [工具错误](#git-is-not-installed-on-this-mac) |

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

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

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


487 490 

488当 Claude 咨询 [advisor](https://code.claude.com/docs/zh-CN/advisor.md) 时,横幅在 90 秒无数据后出现,而不是 20 秒,因为长时间的顾问审查可能在远超 20 秒的时间内不发送任何数据。在 v2.1.214 之前,20 秒阈值也适用于顾问调用,所以横幅在顾问审查期间出现,即使没有任何问题。491当 Claude 咨询 [advisor](https://code.claude.com/docs/zh-CN/advisor.md) 时,横幅在 90 秒无数据后出现,而不是 20 秒,因为长时间的顾问审查可能在远超 20 秒的时间内不发送任何数据。在 v2.1.214 之前,20 秒阈值也适用于顾问调用,所以横幅在顾问审查期间出现,即使没有任何问题。

489 492 

493#### 通过网关连接时等待横幅时隐时现

494 

495如果您通过网关连接,且在 Claude 思考时 `Waiting for API response` 横幅时隐时现,请[更新 Claude Code](https://code.claude.com/docs/zh-CN/setup.md#update-claude-code) 到 v2.1.309 或更高版本。在以下连接上,横幅会在 45 秒无数据后出现:

496 

497* [`ANTHROPIC_BASE_URL`](https://code.claude.com/docs/zh-CN/env-vars) 设置为 Anthropic API 以外的主机,例如 [LLM 网关](https://code.claude.com/docs/zh-CN/llm-gateway)

498* [Claude apps gateway](https://code.claude.com/docs/zh-CN/claude-apps-gateway) 会话

499* 设置了 `ANTHROPIC_AWS_BASE_URL` 的 [Claude Platform on AWS](https://code.claude.com/docs/zh-CN/claude-platform-on-aws.md)

500 

501在 v2.1.309 之前,这些连接上的横幅会在 20 秒后出现。

502 

490### 调整重试行为503### 调整重试行为

491 504 

492您可以使用这些环境变量调整重试行为:505您可以使用这些环境变量调整重试行为:


3256 3269 

3257**解决方法:**3270**解决方法:**

3258 3271 

3259* 在脚本或 CI 任务中,追加 `--trust-workspace` 以仅在该次运行中信任检出内容:`claude ultrareview --trust-workspace`。请只对您信任的代码追加此标志,因为这样一来,检出内容的 git 配置和 Claude Code 项目设置就可以运行程序。若要审查您不信任其代码的 Pull Request,请参阅[如何从您信任的检出内容中审查它](https://code.claude.com/docs/zh-CN/ultrareview.md#trust-the-folder-before-the-review-runs)。3272* 在脚本或 CI 作业中,追加 `--trust-workspace` 以在该次运行中信任该文件夹:`claude ultrareview --trust-workspace`。仅对您信任的代码追加此标志,因为 git 和 Claude Code 随后可能会运行该文件夹的 git 配置和项目设置中指定的程序。对于您不信任其代码的 Pull Request,请[从您信任的分支运行审查](https://code.claude.com/docs/zh-CN/ultrareview.md#trust-the-folder-before-the-review-runs)。

3260* 在您自己的机器上,在该文件夹中运行 `claude` 并接受[工作区信任对话框](https://code.claude.com/docs/zh-CN/permissions.md#project-allow-rules-and-workspace-trust),然后再次运行您原来的命令3273* 在您自己的机器上,在该文件夹中运行 `claude` 并接受[工作区信任对话框](https://code.claude.com/docs/zh-CN/permissions.md#project-allow-rules-and-workspace-trust),然后再次运行您原来的命令

3261 3274 

3262`claude ultrareview` 的以下每条消息都表示没有启动任何审查,且退出码为 1:3275`claude ultrareview` 的以下每条消息都表示没有启动任何审查,且退出码为 1:


3265* **`Error: Workspace not trusted. <folder> is your home directory`**:由于主目录的信任从不保存,先在那里运行 `claude` 也无济于事。请改为在项目目录中运行 `claude ultrareview`(先在那里运行一次 `claude` 以接受信任对话框),或追加 `--trust-workspace`。3278* **`Error: Workspace not trusted. <folder> is your home directory`**:由于主目录的信任从不保存,先在那里运行 `claude` 也无济于事。请改为在项目目录中运行 `claude ultrareview`(先在那里运行一次 `claude` 以接受信任对话框),或追加 `--trust-workspace`。

3266* **`No answer in time.` 后跟 `Error: Workspace not trusted`**:`Trust <folder>? [y/N]` 问题在 5 分钟内未得到回答。再次运行 `claude ultrareview` 并回答该问题。3279* **`No answer in time.` 后跟 `Error: Workspace not trusted`**:`Trust <folder>? [y/N]` 问题在 5 分钟内未得到回答。再次运行 `claude ultrareview` 并回答该问题。

3267* **`Ultrareview did not start: <folder> is not trusted`**:您在 `Trust <folder>? [y/N]` 问题处拒绝了,例如回答 `n` 或按 Enter。若要开始审查,请再次运行 `claude ultrareview` 并回答 `y`。3280* **`Ultrareview did not start: <folder> is not trusted`**:您在 `Trust <folder>? [y/N]` 问题处拒绝了,例如回答 `n` 或按 Enter。若要开始审查,请再次运行 `claude ultrareview` 并回答 `y`。

3268* **``Ultrareview did not start: `--trust-workspace` takes no value``**:`--trust-workspace` 后面跟了非标志的内容,例如 PR 编号或 `false`。如果您不信任该文件夹,请不要使用此标志。若要在本次运行中信任它,请将 PR 编号或基础分支放在该标志之前:`claude ultrareview 1234 --trust-workspace`。3281* **``Ultrareview did not start: `--trust-workspace` takes no value``**:`--trust-workspace` 后面跟着的不是标志,例如 PR 编号或 `false`。如果您不信任该文件夹,请省略该标志。若要在此次运行中信任它,请将 PR 编号或基础分支放在标志之前:`claude ultrareview 1234 --trust-workspace`。

3269 3282 

3270在 v2.1.309 之前,`claude ultrareview` 不接受 `--trust-workspace`。3283在 v2.1.309 之前,`claude ultrareview` 不接受 `--trust-workspace`。

3271 3284 


3526 3539 

3527以下相关消息会在命令运行之前就出现:3540以下相关消息会在命令运行之前就出现:

3528 3541 

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

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

3531* `No shell command in <name> was run`:该文件中的某个 `!` 命令包含除制表符或换行符以外的原始控制字符,因此其中的命令都不会运行。请参阅[如何查找并删除该字符](#no-shell-command-was-run)3544* `No shell command in <name> was run`:文件中某个 `!` 命令包含除制表符或换行符之外的原始控制字符,因此所有命令都不会运行。请参阅[如何查找并移除该字符](#no-shell-command-was-run)

3532 3545 

3533**解决方法:**3546**解决方法:**

3534 3547 


3678 3691 

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

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

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

3682 3695 

3683**解决方法:**3696**解决方法:**

3684 3697 


4419* 如果该操作未发生,请让 Claude 再次运行该工具。您无需先重新连接服务器,因为 Claude Code 会在下一次调用该服务器的某个工具时重新连接它。如果该连接也失败,请参阅[远程服务器在会话中途断开](https://code.claude.com/docs/zh-CN/mcp.md#mid-session-drops-of-a-remote-server)。4432* 如果该操作未发生,请让 Claude 再次运行该工具。您无需先重新连接服务器,因为 Claude Code 会在下一次调用该服务器的某个工具时重新连接它。如果该连接也失败,请参阅[远程服务器在会话中途断开](https://code.claude.com/docs/zh-CN/mcp.md#mid-session-drops-of-a-remote-server)。

4420* 如果您是该服务器的构建者,且该工具可以安全地调用两次,请[将其标记为可安全重复](https://code.claude.com/docs/zh-CN/mcp.md#tool-calls-pending-when-a-connection-closes),以便 Claude Code 可以重复丢失的调用4433* 如果您是该服务器的构建者,且该工具可以安全地调用两次,请[将其标记为可安全重复](https://code.claude.com/docs/zh-CN/mcp.md#tool-calls-pending-when-a-connection-closes),以便 Claude Code 可以重复丢失的调用

4421 4434 

4435### MCP server is disabled

4436 

4437工具结果中出现这条消息,表示 Claude 调用了一个已[关闭](https://code.claude.com/docs/zh-CN/mcp.md#disable-a-server-without-removing-it)的 [MCP 服务器](https://code.claude.com/docs/zh-CN/mcp.md)上的工具。Claude Code 没有连接到该服务器,因此该工具没有运行,Claude 收到的是以下文本而不是结果:

4438 

4439```text wrap theme={null}

4440MCP server "<name>" is disabled — re-enable it via /mcp to use its tools

4441```

4442 

4443**处理方法:**

4444 

4445* 如果您本来就打算关闭该服务器,则无需任何操作

4446* 如果 Claude 需要该服务器的工具,请在 Claude Code 输入框中通过 `/mcp` 重新启用它

4447* 在 [Agent SDK](https://code.claude.com/docs/zh-CN/agent-sdk/overview.md) 应用程序中,如需重新启用该服务器,请在 TypeScript 中调用 [`toggleMcpServer()`](https://code.claude.com/docs/zh-CN/agent-sdk/typescript#togglemcpserver) 并将 `enabled` 设置为 `true`,或在 Python 中调用 [`toggle_mcp_server()`](https://code.claude.com/docs/zh-CN/agent-sdk/python#claudesdkclient) 并将 `enabled` 设置为 `True`

4448 

4449### MCP tool call timed out with the server's question unanswered

4450 

4451在[非交互模式](https://code.claude.com/docs/zh-CN/headless.md)下,某个 [MCP 服务器](https://code.claude.com/docs/zh-CN/mcp.md)在工具调用期间通过 [elicitation](https://code.claude.com/docs/zh-CN/mcp.md#respond-to-mcp-elicitation-requests) 请求输入,而在收到回答之前,该调用的时间限制已用尽:

4452 

4453```text theme={null}

4454MCP server "<name>" tool "<tool>" timed out after <N>s. The server asked the user a question, and no answer came before the time limit. Do not call this tool again in this turn. Tell the user that the server's question got no answer, and wait for their reply.

4455```

4456 

4457在 v2.1.310 之前,结果以 `timed out after <N>s` 结尾,不会提及该问题。

4458 

4459**处理方法:**

4460 

4461* 设置一个用于回答服务器请求的 [`Elicitation` hook](https://code.claude.com/docs/zh-CN/hooks#elicitation)

4462* 在 TypeScript Agent SDK 应用程序中,让您的 [`onElicitation`](https://code.claude.com/docs/zh-CN/agent-sdk/typescript#options) 回调在限制用尽之前返回其回答

4463* 如需给回答留出更多时间,请在该服务器的配置条目中设置更长的 [`timeout`](https://code.claude.com/docs/zh-CN/mcp#time-limits-on-mcp-tool-calls)(以毫秒为单位),例如 `"timeout": 600000` 表示 10 分钟

4464* 改为在交互式会话中运行该任务,并自行回答服务器的[对话框](https://code.claude.com/docs/zh-CN/mcp.md#respond-to-mcp-elicitation-requests)

4465 

4422### Agent would be spawned with zero tools4466### Agent would be spawned with zero tools

4423 4467 

4424子代理 [`tools` 列表](https://code.claude.com/docs/zh-CN/sub-agents#supported-frontmatter-fields)中的每个条目都未能匹配到可用工具,因此 Claude Code 拒绝启动该子代理:没有任何工具,它无法执行操作。该消息按问题类型对您的条目进行分组:4468子代理 [`tools` 列表](https://code.claude.com/docs/zh-CN/sub-agents#supported-frontmatter-fields)中的每个条目都未能匹配到可用工具,因此 Claude Code 拒绝启动该子代理:没有任何工具,它无法执行操作。该消息按问题类型对您的条目进行分组:


4741The command was not started: this computer's disk is full (ENOSPC) on the volume holding /tmp/claude-501 (Claude Code's temporary directory), so the file that captures command output could not be created there and nothing ran. Free space on that volume, or restart Claude Code with CLAUDE_CODE_TMPDIR set to a directory on another one, then retry. If this is the user's own computer, tell them before deleting anything to make room.4785The command was not started: this computer's disk is full (ENOSPC) on the volume holding /tmp/claude-501 (Claude Code's temporary directory), so the file that captures command output could not be created there and nothing ran. Free space on that volume, or restart Claude Code with CLAUDE_CODE_TMPDIR set to a directory on another one, then retry. If this is the user's own computer, tell them before deleting anything to make room.

4742```4786```

4743 4787 

4744另外三条消息出现在命令已运行并以非零代码退出之后。此示例为 `Disk full:` 形式:4788`Disk full:`、`Disk quota used up:` 和 `Nearly out of inodes:` 消息出现在命令已运行并以非零代码退出之后。例如:

4745 4789 

4746```text wrap theme={null}4790```text wrap theme={null}

4747Disk full: this computer's volume holding /tmp/claude-501 (Claude Code's temporary directory) has 3 MB free, so whatever this command printed was lost and its own writes may have failed with "No space left on device". Free space on that volume, or restart Claude Code with CLAUDE_CODE_TMPDIR set to a directory on another one, then retry. If this is the user's own computer, tell them before deleting anything to make room.4791Disk full: this computer's volume holding /tmp/claude-501 (Claude Code's temporary directory) has 3 MB free, so whatever this command printed was lost and its own writes may have failed with "No space left on device". Free space on that volume, or restart Claude Code with CLAUDE_CODE_TMPDIR set to a directory on another one, then retry. If this is the user's own computer, tell them before deleting anything to make room.


4751 4795 

4752* 在 macOS 和 Linux 上,在 shell 中运行 `df -h <dir>`,查看哪个卷存放该目录以及其已用程度。`df -i <dir>` 会显示剩余的 inode 数量。`<dir>` 是您的消息中指出的目录,例如 `df -i /tmp/claude-501`4796* 在 macOS 和 Linux 上,在 shell 中运行 `df -h <dir>`,查看哪个卷存放该目录以及其已用程度。`df -i <dir>` 会显示剩余的 inode 数量。`<dir>` 是您的消息中指出的目录,例如 `df -i /tmp/claude-501`

4753* **`Disk full: this computer's volume` 或 `disk is full (ENOSPC)`**:在该卷上的任意位置删除您不需要的文件4797* **`Disk full: this computer's volume` 或 `disk is full (ENOSPC)`**:在该卷上的任意位置删除您不需要的文件

4754* **`Disk quota used up:` 或 `Disk full: a test write`**:删除您自己在该卷上的文件,即使该卷仍显示有可用空间4798* **`Disk quota used up:`、`disk quota is used up (EDQUOT)` 或 `Disk full: a test write`**:删除您自己在该卷上的文件,即使该卷仍显示有可用空间

4755* **`disk quota is used up (EDQUOT)`**:删除您自己在该卷上的文件

4756* **`Nearly out of inodes:`**:删除该卷上的大量文件。无论大小,每个文件都占用一个 inode,因此重要的是文件数量,而不是文件大小4799* **`Nearly out of inodes:`**:删除该卷上的大量文件。无论大小,每个文件都占用一个 inode,因此重要的是文件数量,而不是文件大小

4757* 或者将 [`CLAUDE_CODE_TMPDIR`](https://code.claude.com/docs/zh-CN/env-vars) 设置为有空间的卷上的目录,然后重新启动 Claude Code4800* 或者将 [`CLAUDE_CODE_TMPDIR`](https://code.claude.com/docs/zh-CN/env-vars) 设置为有空间的卷上的目录,然后重新启动 Claude Code

4758* 然后让 Claude 再次运行该命令4801* 然后让 Claude 再次运行该命令


4766 4809 

4767在 v2.1.305 之前,因磁盘已满而无法由 Claude Code 启动的命令只会返回操作系统的错误文本。该文本例如为 `ENOSPC: no space left on device, open <path>.output`。4810在 v2.1.305 之前,因磁盘已满而无法由 Claude Code 启动的命令只会返回操作系统的错误文本。该文本例如为 `ENOSPC: no space left on device, open <path>.output`。

4768 4811 

4812### git is not installed on this Mac

4813 

4814此消息表示 Claude Code 中的某个步骤需要 git,而它找到的 git 是 Apple 位于 `/usr/bin/git` 的占位程序。提供 git 的开发者工具尚未安装。

4815 

4816Claude Code 不会启动该占位程序,而是显示以下文本,例如出现在一条较长的消息中:

4817 

4818```text wrap theme={null}

4819git is not installed on this Mac. To install it, run xcode-select --install, then try again.

4820```

4821 

4822**处理方法:**

4823 

4824* 在终端中运行 `xcode-select --install`,完成它启动的安装,然后在 Claude Code 中重试您之前进行的操作

4825 

4769### File is not valid UTF-84826### File is not valid UTF-8

4770 4827 

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

fast-mode.md +21 −11

Details

155 155 

156在提供快速模式之前,Claude Code 会通过直接请求 `api.anthropic.com` 来检查您的组织的快速模式可用性。该检查不遵循 [`ANTHROPIC_BASE_URL`](https://code.claude.com/docs/zh-CN/llm-gateway-connect#set-the-base-url-and-credential),因此在通过 [LLM 网关](https://code.claude.com/docs/zh-CN/llm-gateway)路由 Claude 流量并阻止直接出站到 `api.anthropic.com` 的网络上,即使推理请求有效,检查也会失败。该检查确实使用配置的 [HTTP 代理](https://code.claude.com/docs/zh-CN/network-config.md#proxy-configuration),因此网络块仅在 `api.anthropic.com` 即使通过代理也无法到达的地方才会导致检查失败。156在提供快速模式之前,Claude Code 会通过直接请求 `api.anthropic.com` 来检查您的组织的快速模式可用性。该检查不遵循 [`ANTHROPIC_BASE_URL`](https://code.claude.com/docs/zh-CN/llm-gateway-connect#set-the-base-url-and-credential),因此在通过 [LLM 网关](https://code.claude.com/docs/zh-CN/llm-gateway)路由 Claude 流量并阻止直接出站到 `api.anthropic.com` 的网络上,即使推理请求有效,检查也会失败。该检查确实使用配置的 [HTTP 代理](https://code.claude.com/docs/zh-CN/network-config.md#proxy-configuration),因此网络块仅在 `api.anthropic.com` 即使通过代理也无法到达的地方才会导致检查失败。

157 157 

158当检查失败时,`/fast` 报告"Fast mode unavailable due to network connectivity issues",请求以标准速度运行,即使您的组织已启用快速模式。过去成功的检查会从其缓存结果继续工作,因此被阻止的检查主要影响新安装。158如果您的组织已启用快速模式,而 `/fast` 显示的结果与之不符,请在以下情况中查找它显示的消息。

159 159 

160当检查到达 `api.anthropic.com` 但呈现 Anthropic 拒绝的凭证时,同样的连接消息也会出现在开放网络上。其解析的密钥是网关颁发的凭证的会话,保存在 [`ANTHROPIC_API_KEY`](https://code.claude.com/docs/zh-CN/llm-gateway-connect#set-the-base-url-and-credential) 中或由 [`apiKeyHelper`](https://code.claude.com/docs/zh-CN/settings-reference#apikeyhelper) 生成,会使用该密钥发送检查,被拒绝的请求会被报告为连接失败。160#### Fast mode unavailable due to network connectivity issues

161 161 

162要恢复快速模式,在网络块是原因的地方允许直接出站到 `api.anthropic.com`,或设置与检查失败方式相匹配的任何变量:162可用性检查失败(例如因为您的网络阻止了 `api.anthropic.com`),请求以标准速度运行。过去成功的检查会从其缓存结果继续工作,因此被阻止的检查主要影响新安装。

163 163 

164* `CLAUDE_CODE_SKIP_FAST_MODE_NETWORK_ERRORS=1` 将失败的检查视为可用,并仍然遵守"disabled by your organization"响应。当您的网络拒绝连接或 Anthropic 拒绝网关凭证时使用它;允许列表对凭证情况没有帮助,因为没有任何东西被阻止。164要恢复快速模式,请在允许列表中允许直接出站到 `api.anthropic.com`,或设置 `CLAUDE_CODE_SKIP_FAST_MODE_NETWORK_ERRORS=1`,它会将失败的检查视为可用,并仍然遵守"disabled by your organization"响应。

165* `CLAUDE_CODE_SKIP_FAST_MODE_ORG_CHECK=1` 完全跳过检查。当您的网络拦截请求而不是拒绝它时使用它。

166 165 

167两个网关配置报告"Fast mode has been disabled by your organization"而不是连接消息,即使您的组织已启用快速模式:166#### Fast mode is currently unavailable

168 167 

169* 仅使用 [`ANTHROPIC_AUTH_TOKEN`](https://code.claude.com/docs/zh-CN/llm-gateway-connect#set-the-base-url-and-credential) 进行身份验证的会话会跳过检查:没有 claude.ai 登录或 Anthropic API 密钥,也没有缓存的成功检查,Claude Code 会将快速模式视为由您的组织禁用,而不发送请求。168在网关后面时,请检查是否存在以下配置,在这些配置中 Claude Code 不会发送可用性检查,且没有缓存之前的成功检查:

170* 拦截检查并用自己的页面回答的代理,例如返回 HTTP 200 阻止页面的 TLS 检查代理,被读取为响应说您的组织已禁用快速模式。

171 169 

172在这两种情况下,设置 `CLAUDE_CODE_SKIP_FAST_MODE_ORG_CHECK=1` 来恢复快速模式。`CLAUDE_CODE_SKIP_FAST_MODE_NETWORK_ERRORS` 不适用于任何一种情况,因为它仅绕过失败的检查,而这两种情况都会产生禁用响应。允许列表对承载者令牌情况没有帮助,它从不发送请求。170* 您将 `ANTHROPIC_BASE_URL` 指向您的网关,并将 [`ANTHROPIC_API_KEY`](https://code.claude.com/docs/zh-CN/llm-gateway-connect#set-the-base-url-and-credential) 设置为网关颁发的、不符合 Anthropic API 密钥格式的密钥。Claude Code 不会将此类密钥发送到 `api.anthropic.com`。

171* 您设置了 [`CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC`](https://code.claude.com/docs/zh-CN/env-vars),因此 Claude Code 会跳过该检查。

173 172 

174这些变量仅影响客户端检查。当您的组织禁用了快速模式时,API 会拒绝快速模式请求,无论是否设置了这些变量。来自 API 的拒绝即使设置了跳过变量也会成立。Claude Code 会以标准速度重试被拒绝的请求,关闭快速模式,并且 `/fast` 报告您的组织已禁用快速模式。173要在上述任一配置中恢复快速模式,请设置 `CLAUDE_CODE_SKIP_FAST_MODE_NETWORK_ERRORS=1`。

175 174 

176设置 `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC` 也会抑制可用性检查。没有之前缓存的成功检查,`/fast` 报告"Fast mode is currently unavailable";两个跳过变量在该配置中也会恢复快速模式。175#### Fast mode has been disabled by your organization

176 

177在网关后面时,即使您的组织已启用快速模式,在以下任一配置中您也可能看到此消息:

178 

179* 您仅使用 [`ANTHROPIC_AUTH_TOKEN`](https://code.claude.com/docs/zh-CN/llm-gateway-connect#set-the-base-url-and-credential) 进行身份验证,没有 claude.ai 登录、没有 API 密钥,也没有缓存的成功检查。此时 Claude Code 会将快速模式视为由您的组织禁用,而不发送请求。

180* 代理拦截了检查并用自己的页面进行回答,例如返回 HTTP 200 阻止页面的 TLS 检查代理。Claude Code 会将该页面读取为表明您的组织已禁用快速模式的响应。

181 

182在这两种情况下,请设置 `CLAUDE_CODE_SKIP_FAST_MODE_ORG_CHECK=1`(它会完全跳过检查),而不是 `CLAUDE_CODE_SKIP_FAST_MODE_NETWORK_ERRORS`(它不适用于其中任何一种情况)。

183 

184> [!NOTE]

185>

186> 跳过变量仅更改客户端检查。当您的组织禁用了快速模式时,无论是否设置了这些变量,API 都会拒绝快速模式请求。随后 Claude Code 会以标准速度重试该请求,关闭快速模式,并且 `/fast` 报告您的组织已禁用快速模式。

177 187 

178### 要求每个会话选择加入188### 要求每个会话选择加入

179 189 

hooks.md +16 −5

Details

961blocking because Git Bash wasn't found, so only exit code 0 or 2 counts as this hook's verdict.961blocking because Git Bash wasn't found, so only exit code 0 or 2 counts as this hook's verdict.

962```962```

963 963 

964要查明 hook 失败的原因,请检查[调试日志](#debug-hooks)。请选择与您的 hook 匹配的修复方法:964如果错误中还包含 `PowerShell started no program`,请先参阅[针对仅由带引号字符串组成的 `command` 的修复方法](#powershell-started-no-program),PowerShell 会打印这类 `command` 而不是运行它。

965 

966在未安装 Git Bash 的情况下,该 hook 返回的 0 或 2 以外的任何退出码都算作[失败](#block-the-action-when-a-hook-fails),即使它打印了不拒绝该调用的 JSON。要查明 hook 失败的原因,请检查[调试日志](#debug-hooks)。然后选择与您的 hook 匹配的修复方法:

965 967 

966* **hook 失败时操作应继续进行**:为 hook 添加 [`"onFailure": "continue"`](#block-the-action-when-a-hook-fails)968* **hook 失败时操作应继续进行**:为 hook 添加 [`"onFailure": "continue"`](#block-the-action-when-a-hook-fails)

967* **hook 是为 Bash 编写的**:未设置 `shell` 的 [shell 形式](#exec-form-and-shell-form) hook 在未安装 Git Bash 时会在 PowerShell 中运行,而为 Bash 编写的脚本在那里可能无法按原样运行。安装 [Git for Windows](https://git-scm.com/downloads/win),或者(如果 Git Bash 已安装但 Claude Code 找不到它)设置 [`CLAUDE_CODE_GIT_BASH_PATH`](https://code.claude.com/docs/zh-CN/env-vars),然后启动新会话969* **hook 以退出码 1 发出警告,但在崩溃时必须阻止**:使用 `"onFailure": "continue"` 时,无论是警告还是崩溃,退出码 1 都会让调用继续进行。请改为添加 `"onFailure": "block"`,并在脚本发出警告的位置以退出码 0 结束,使这些调用继续进行。要在 `PreToolUse` 上仍然显示警告,请将其打印到 stdout 中单个 JSON 对象的 [`systemMessage`](#json-output) 字段中。

970* **hook 是为 Bash 编写的**:在未安装 Git Bash 时,未设置 `shell` 的 [shell 形式](#exec-form-and-shell-form) hook 会在 PowerShell 中运行,并可能在那里失败。安装 [Git for Windows](https://git-scm.com/downloads/win),或者如果 Git Bash 已安装在 Claude Code 找不到的位置,请设置 [`CLAUDE_CODE_GIT_BASH_PATH`](https://code.claude.com/docs/zh-CN/env-vars)。然后启动新会话。

968* **hook 运行单个 `.exe`,而不是 `.cmd` 或 `.bat` 文件**:将程序放在 `command` 中,将其参数放在 `args` 中,以使用 exec 形式,并添加 `"onFailure": "block"`。这样 Claude Code 会在不使用 shell 的情况下启动该程序。如果没有 `"onFailure": "block"`,当程序失败、缺失或超时时,调用可能会继续进行971* **hook 运行单个 `.exe`,而不是 `.cmd` 或 `.bat` 文件**:将程序放在 `command` 中,将其参数放在 `args` 中,以使用 exec 形式,并添加 `"onFailure": "block"`。这样 Claude Code 会在不使用 shell 的情况下启动该程序。如果没有 `"onFailure": "block"`,当程序失败、缺失或超时时,调用可能会继续进行

969* **hook 以退出码 1 发出警告,但在崩溃时必须阻止**:使用 `"onFailure": "continue"` 时,无论是警告还是崩溃,退出码 1 都会让调用继续进行。请改为添加 `"onFailure": "block"`,并在脚本发出警告的位置以退出码 0 结束,使这些调用继续进行。要在 `PreToolUse` 上以退出码 0 退出后显示警告,请将其打印到 stdout 中单个 JSON 对象的 [`systemMessage`](#json-output) 字段中

970* **必须在失败时阻止的 PowerShell 防护 hook**:如果未设置 `onFailure`,一旦安装了 Git for Windows 且 Claude Code 找到 Git Bash,它就不再阻止。添加 `"onFailure": "block"`,使失败或超时无论是否有 Git Bash 都会阻止调用。同时设置 `"shell": "powershell"`,使该 hook 此后继续在 PowerShell 中运行,而不是在 Git Bash 中运行972* **必须在失败时阻止的 PowerShell 防护 hook**:如果未设置 `onFailure`,一旦安装了 Git for Windows 且 Claude Code 找到 Git Bash,它就不再阻止。添加 `"onFailure": "block"`,使失败或超时无论是否有 Git Bash 都会阻止调用。同时设置 `"shell": "powershell"`,使该 hook 此后继续在 PowerShell 中运行,而不是在 Git Bash 中运行

971 973 

972对于显示此错误的 hook,0 或 2 以外的任何退出码都算作[失败](#block-the-action-when-a-hook-fails),即使 hook 打印了不拒绝该调用的 JSON。

973 

974在 v2.1.309 之前,该消息为 `blocking because Git Bash wasn't found and this hook doesn't set "shell" to "powershell", so only exit code 0 or 2 counts as its verdict.`974在 v2.1.309 之前,该消息为 `blocking because Git Bash wasn't found and this hook doesn't set "shell" to "powershell", so only exit code 0 or 2 counts as its verdict.`

975 975 

976#### PowerShell started no program

977 

978出现此错误的 hook 在 PowerShell 中运行,而 PowerShell 会打印仅由带引号字符串组成的 `command`(例如 `"command": "\"C:\\Tools\\guard.exe\""`),而不是运行它。

979 

980* **要打印文本(如 JSON)**:设置 `"shell": "powershell"`,hook 会以 0 退出

981* **要运行 `.ps1`、`.cmd` 或 `.bat` 文件,或路径中包含变量的 `.exe`**:设置 `"shell": "powershell"`,并在带引号的路径前加上 `&`。保持 `$HOME` 原样,并按照 [`check.ps1` 示例](#reference-scripts-by-path-in-powershell-hooks)书写 `$env:CLAUDE_PROJECT_DIR` 的方式书写环境变量

982* **要运行路径中不含 `$` 的单个 `.exe`**:从 `command` 中删除内层引号,然后应用[针对运行单个 `.exe` 的 hook 的修复方法](#failed-hooks-on-windows-without-git-bash),如果程序不接受参数,则写入 `"args": []`

983* **要运行为 Bash 编写的脚本**:应用[针对为 Bash 编写的 hook 的修复方法](#failed-hooks-on-windows-without-git-bash)

984 

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

977 986 

978退出码 2 是 hook 发出"停止,不要这样做"信号的方式。效果取决于事件,因为某些事件代表可以被阻止的操作(如尚未发生的工具调用),而其他事件代表已经发生或无法防止的事情。987退出码 2 是 hook 发出"停止,不要这样做"信号的方式。效果取决于事件,因为某些事件代表可以被阻止的操作(如尚未发生的工具调用),而其他事件代表已经发生或无法防止的事情。


4185}4194}

4186```4195```

4187 4196 

4197### 在 PowerShell hook 中按路径引用脚本

4198 

4188要从 PowerShell shell 形式命令引用项目根目录,请写入 `${CLAUDE_PROJECT_DIR}` 或 `$env:CLAUDE_PROJECT_DIR`。Claude Code 会将 PowerShell shell 形式命令中的 `${CLAUDE_PROJECT_DIR}`、`${CLAUDE_PLUGIN_ROOT}` 和 `${CLAUDE_PLUGIN_DATA}` 占位符重写为 PowerShell 的 `${env:NAME}` 形式,无论 hook 是在 `settings.json`、插件还是 skill 中定义。PowerShell 随后在解析后从导出的环境中解析该值,因此占位符在双引号字符串内有效,但在单引号字符串内无效,PowerShell 在单引号字符串中永远不会展开变量。4199要从 PowerShell shell 形式命令引用项目根目录,请写入 `${CLAUDE_PROJECT_DIR}` 或 `$env:CLAUDE_PROJECT_DIR`。Claude Code 会将 PowerShell shell 形式命令中的 `${CLAUDE_PROJECT_DIR}`、`${CLAUDE_PLUGIN_ROOT}` 和 `${CLAUDE_PLUGIN_DATA}` 占位符重写为 PowerShell 的 `${env:NAME}` 形式,无论 hook 是在 `settings.json`、插件还是 skill 中定义。PowerShell 随后在解析后从导出的环境中解析该值,因此占位符在双引号字符串内有效,但在单引号字符串内无效,PowerShell 在单引号字符串中永远不会展开变量。

4189 4200 

4190不要在 PowerShell hook 中写入裸 `$CLAUDE_PROJECT_DIR` 拼写。PowerShell 将其解析为未定义的本地变量,并将其解析为 `$null`,这会导致脚本路径没有其项目根前缀。Claude Code 不会重写该形式;它会在 [debug log](#debug-hooks) 中记录警告。4201不要在 PowerShell hook 中写入裸 `$CLAUDE_PROJECT_DIR` 拼写。PowerShell 将其解析为未定义的本地变量,并将其解析为 `$null`,这会导致脚本路径没有其项目根前缀。Claude Code 不会重写该形式;它会在 [debug log](#debug-hooks) 中记录警告。

jetbrains.md +1 −1

Details

61/ide61/ide

62```62```

63 63 

64当连接成功时,Claude Code 会确认一条消息,例如 `Connected to IntelliJ IDEA.`。如果 Claude Code 检测到正在运行的 IDE 没有该插件,`/ide` 将为您安装该插件并要求您重新启动 IDE。64当连接成功时,Claude Code 会确认一条消息,例如 `Connected to IntelliJ IDEA.`

65 65 

66如果您希望 Claude 能够访问与 IDE 相同的文件,请从与 IDE 项目根目录相同的目录启动 Claude Code。66如果您希望 Claude 能够访问与 IDE 相同的文件,请从与 IDE 项目根目录相同的目录启动 Claude Code。

67 67 

Details

519| `400` 错误在每个请求上,在网关自己的措辞中拒绝工具的输入架构或其 `pattern`,在 Claude Code v2.1.265 到 v2.1.267 上 | 在这些版本的逐步推出中,[Artifact 工具](https://code.claude.com/docs/zh-CN/artifacts.md#availability)架构携带带有 `\p{...}` Unicode 字符类的正则表达式。Anthropic API 接受它,但检查每个工具架构的 `pattern` 的网关或上游使用其自己的正则表达式引擎拒绝整个请求 | 更新到 v2.1.268 或更高版本,它不发送正则表达式。在受影响的版本上,[关闭 artifacts](https://code.claude.com/docs/zh-CN/artifacts.md#disable-artifacts),这会从请求中删除工具及其架构 |519| `400` 错误在每个请求上,在网关自己的措辞中拒绝工具的输入架构或其 `pattern`,在 Claude Code v2.1.265 到 v2.1.267 上 | 在这些版本的逐步推出中,[Artifact 工具](https://code.claude.com/docs/zh-CN/artifacts.md#availability)架构携带带有 `\p{...}` Unicode 字符类的正则表达式。Anthropic API 接受它,但检查每个工具架构的 `pattern` 的网关或上游使用其自己的正则表达式引擎拒绝整个请求 | 更新到 v2.1.268 或更高版本,它不发送正则表达式。在受影响的版本上,[关闭 artifacts](https://code.claude.com/docs/zh-CN/artifacts.md#disable-artifacts),这会从请求中删除工具及其架构 |

520| `400` 错误在每个请求上,在网关自己的措辞中拒绝无法识别的工具类型,例如 `Input tag 'advisor_20260301'`,在 Claude Code v2.1.275 上 | 在该版本的逐步推出中,即使关闭了 advisor,请求也会携带 [advisor 工具](https://code.claude.com/docs/zh-CN/advisor.md)条目。Anthropic API 接受它,但验证工具类型的网关或上游拒绝整个请求;一个[按原样转发请求正文字段](https://code.claude.com/docs/zh-CN/llm-gateway-protocol.md#forward-as-open-lists)的网关不受影响地通过它。该条目是一个不携带任何对话内容的声明 | 更新到 v2.1.276 或更高版本,除非您打开 advisor,否则它不会在 `ANTHROPIC_BASE_URL` 网关后面发送该条目。在 v2.1.275 上,设置 [`CLAUDE_CODE_DISABLE_ADVISOR_TOOL=1`](https://code.claude.com/docs/zh-CN/env-vars),这会从请求中删除该条目 |520| `400` 错误在每个请求上,在网关自己的措辞中拒绝无法识别的工具类型,例如 `Input tag 'advisor_20260301'`,在 Claude Code v2.1.275 上 | 在该版本的逐步推出中,即使关闭了 advisor,请求也会携带 [advisor 工具](https://code.claude.com/docs/zh-CN/advisor.md)条目。Anthropic API 接受它,但验证工具类型的网关或上游拒绝整个请求;一个[按原样转发请求正文字段](https://code.claude.com/docs/zh-CN/llm-gateway-protocol.md#forward-as-open-lists)的网关不受影响地通过它。该条目是一个不携带任何对话内容的声明 | 更新到 v2.1.276 或更高版本,除非您打开 advisor,否则它不会在 `ANTHROPIC_BASE_URL` 网关后面发送该条目。在 v2.1.275 上,设置 [`CLAUDE_CODE_DISABLE_ADVISOR_TOOL=1`](https://code.claude.com/docs/zh-CN/env-vars),这会从请求中删除该条目 |

521| 模型从 `/model` 选择器中缺失 | 网关模型名称不在 Claude Code 的内置列表中,或 Claude Code 显示替换内置选项的 [`modelPicker`](https://code.claude.com/docs/zh-CN/settings-reference#modelpicker) 阵容 | 启用[网关模型发现](#add-gateway-models-to-the-model-picker)或使用[模型配置](https://code.claude.com/docs/zh-CN/model-config.md)变量添加名称。如果 Claude Code 显示替换 `modelPicker` 阵容,请将网关模型添加到其中,或在托管设置提供时要求您的管理员添加它们 |521| 模型从 `/model` 选择器中缺失 | 网关模型名称不在 Claude Code 的内置列表中,或 Claude Code 显示替换内置选项的 [`modelPicker`](https://code.claude.com/docs/zh-CN/settings-reference#modelpicker) 阵容 | 启用[网关模型发现](#add-gateway-models-to-the-model-picker)或使用[模型配置](https://code.claude.com/docs/zh-CN/model-config.md)变量添加名称。如果 Claude Code 显示替换 `modelPicker` 阵容,请将网关模型添加到其中,或在托管设置提供时要求您的管理员添加它们 |

522| `/fast` 报告 `Fast mode unavailable due to network connectivity issues`,而推理请求有效 | [快速模式](https://code.claude.com/docs/zh-CN/fast-mode.md)可用性检查直接转到 `api.anthropic.com`,不遵循 `ANTHROPIC_BASE_URL`,因此阻止的直接出口会导致检查失败。当检查呈现来自 `ANTHROPIC_API_KEY` 或 `apiKeyHelper` 的网关颁发的密钥且 Anthropic 拒绝它时,在开放网络上也会出现相同的消息 | 如果出口被阻止,请将 `api.anthropic.com` 列入白名单,或设置跳过变量;对于被拒绝的网关密钥,只有跳过变量有帮助。请参阅[在代理和 LLM 网关后面使用快速模式](https://code.claude.com/docs/zh-CN/fast-mode.md#use-fast-mode-behind-proxies-and-llm-gateways) |522| `/fast` 报告 `Fast mode unavailable due to network connectivity issues`,而推理请求有效 | [快速模式](https://code.claude.com/docs/zh-CN/fast-mode.md)可用性检查直接转到 `api.anthropic.com`,不遵循 `ANTHROPIC_BASE_URL`,因此阻止的直接出口会导致检查失败 | 如果出口被阻止,请将 `api.anthropic.com` 加入允许列表,或设置跳过变量。请参阅[在代理和 LLM 网关后面使用快速模式](https://code.claude.com/docs/zh-CN/fast-mode.md#use-fast-mode-behind-proxies-and-llm-gateways) |

523| `/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 网关后面使用快速模式](https://code.claude.com/docs/zh-CN/fast-mode.md#use-fast-mode-behind-proxies-and-llm-gateways) |523| `/fast` 在使用 `ANTHROPIC_API_KEY` 中网关颁发的密钥进行身份验证的会话中报告 `Fast mode is currently unavailable` | 当 `ANTHROPIC_BASE_URL` 指向您的网关时,Claude Code 不会将不符合 Anthropic API 密钥格式的密钥发送到 `api.anthropic.com`。因此[快速模式](https://code.claude.com/docs/zh-CN/fast-mode.md)可用性检查不会被发送,并且在没有缓存先前成功检查结果的情况下,Claude Code 会将快速模式视为不可用 | 设置 `CLAUDE_CODE_SKIP_FAST_MODE_NETWORK_ERRORS=1`;请参阅[在代理和 LLM 网关后面使用快速模式](https://code.claude.com/docs/zh-CN/fast-mode.md#use-fast-mode-behind-proxies-and-llm-gateways) |

524| `/fast` 在使用 `ANTHROPIC_AUTH_TOKEN` 进行身份验证的会话中报告 `Fast mode has been disabled by your organization`,即使组织已启用快速模式 | 可用性检查需要 claude.ai 登录或 API 密钥;仅使用持有者令牌,Claude Code 会将快速模式视为已禁用,而不发送检查 | 设置 `CLAUDE_CODE_SKIP_FAST_MODE_ORG_CHECK=1`;请参阅[在代理和 LLM 网关后面使用快速模式](https://code.claude.com/docs/zh-CN/fast-mode.md#use-fast-mode-behind-proxies-and-llm-gateways) |

524| Claude Code 要求您登录,即使 [curl 测试](#verify-the-connection)成功 | CLI 没有自己的凭证:可达的基础 URL 不是一个,在交互会话中,项目的 `.claude/settings.json` 或 `.claude/settings.local.json` 中的 `env` 块仅在首次运行向导和[信任提示](https://code.claude.com/docs/zh-CN/permissions.md#what-runs-before-you-trust-a-folder)之后应用 | 在 Claude Code 在首次运行设置之前读取的某处设置 `ANTHROPIC_AUTH_TOKEN`:shell 导出、`~/.claude/settings.json` 中的 `env` 块或托管设置 |525| Claude Code 要求您登录,即使 [curl 测试](#verify-the-connection)成功 | CLI 没有自己的凭证:可达的基础 URL 不是一个,在交互会话中,项目的 `.claude/settings.json` 或 `.claude/settings.local.json` 中的 `env` 块仅在首次运行向导和[信任提示](https://code.claude.com/docs/zh-CN/permissions.md#what-runs-before-you-trust-a-folder)之后应用 | 在 Claude Code 在首次运行设置之前读取的某处设置 `ANTHROPIC_AUTH_TOKEN`:shell 导出、`~/.claude/settings.json` 中的 `env` 块或托管设置 |

525| `ANTHROPIC_API_KEY` 已设置但被忽略,没有提示 | 密钥需要在交互会话中进行一次性批准,之前拒绝的密钥被忽略而不再询问 | 在 `/config` 下使用 `Use custom API key` 选项启用它 |526| `ANTHROPIC_API_KEY` 已设置但被忽略,没有提示 | 密钥需要在交互会话中进行一次性批准,之前拒绝的密钥被忽略而不再询问 | 在 `/config` 下使用 `Use custom API key` 选项启用它 |

526| `This machine's managed settings require a first-party login`,或当托管设置将 `forceLoginMethod` 设置为 `"gateway"` 或也设置 `forceLoginGatewayUrl` 时 [`Administrator policy requires a Cloud gateway sign-in`](https://code.claude.com/docs/zh-CN/errors#administrator-policy-requires-a-cloud-gateway-sign-in) | 托管设置包括 `forceLoginMethod` 或 `forceLoginOrgUUID`,不能与 `ANTHROPIC_API_KEY`、`ANTHROPIC_AUTH_TOKEN` 或 `apiKeyHelper` 共存 | 您的管理员必须从托管设置中删除 `forceLoginMethod`、`forceLoginOrgUUID` 和 `forceLoginGatewayUrl` 以使用网关凭证,或删除网关凭证以使用托管设置要求的登录。两者不能组合 |527| `This machine's managed settings require a first-party login`,或当托管设置将 `forceLoginMethod` 设置为 `"gateway"` 或也设置 `forceLoginGatewayUrl` 时 [`Administrator policy requires a Cloud gateway sign-in`](https://code.claude.com/docs/zh-CN/errors#administrator-policy-requires-a-cloud-gateway-sign-in) | 托管设置包括 `forceLoginMethod` 或 `forceLoginOrgUUID`,不能与 `ANTHROPIC_API_KEY`、`ANTHROPIC_AUTH_TOKEN` 或 `apiKeyHelper` 共存 | 您的管理员必须从托管设置中删除 `forceLoginMethod`、`forceLoginOrgUUID` 和 `forceLoginGatewayUrl` 以使用网关凭证,或删除网关凭证以使用托管设置要求的登录。两者不能组合 |

mcp.md +4 −4

Details

250 250 

251此列表中的状态报告配置决策而不是连接尝试,因此 Claude Code 在不连接到服务器的情况下打印它们:251此列表中的状态报告配置决策而不是连接尝试,因此 Claude Code 在不连接到服务器的情况下打印它们:

252 252 

253* ``⏸ Pending approval (run `claude` to approve)``:来自 `.mcp.json` 的项目作用域服务器,您尚未批准。Claude Code 会在 `claude mcp list` 和 `claude mcp get <name>` 中都显示它。以交互方式运行 `claude` 以查看并批准它。253* ``⏸ Pending approval (run `claude` to approve)``:来自 `.mcp.json` 且您尚未批准的项目作用域服务器。Claude Code 会在 `claude mcp list` 和 `claude mcp get <name>` 中都显示它。以交互方式运行 `claude` 来查看并批准它。

254* `✘ Rejected (see disabledMcpjsonServers in settings)`:由 [`disabledMcpjsonServers`](https://code.claude.com/docs/zh-CN/settings-reference#disabledmcpjsonservers) 条目拒绝的 `.mcp.json` 服务器。Claude Code 仅在 `claude mcp get <name>` 中显示它。254* `✘ Rejected (see disabledMcpjsonServers in settings)`:由 [`disabledMcpjsonServers`](https://code.claude.com/docs/zh-CN/settings-reference#disabledmcpjsonservers) 条目拒绝的 `.mcp.json` 服务器。Claude Code 仅在 `claude mcp get <name>` 中显示它。

255* `⊘ Disabled for this project (re-enable via /mcp)`:项目的 [`disabledMcpServers`](#disable-a-server-without-removing-it) 列表命名的服务器。Claude Code 在 `claude mcp list` 和 `claude mcp get <name>` 中都显示它。从 `/mcp` 面板重新打开服务器。255* `⊘ Disabled for this project (re-enable via /mcp)`:项目的 [`disabledMcpServers`](#disable-a-server-without-removing-it) 列表命名的服务器。Claude Code 在 `claude mcp list` 和 `claude mcp get <name>` 中都显示它。从 `/mcp` 面板重新打开服务器。

256 256 


384这些重试在以下情况下不适用:384这些重试在以下情况下不适用:

385 385 

386* stdio 服务器的首次连接。要再次尝试,请参阅 [退出或无法启动的 stdio 服务器](#stdio-servers-that-exit-or-fail-to-start)386* stdio 服务器的首次连接。要再次尝试,请参阅 [退出或无法启动的 stdio 服务器](#stdio-servers-that-exit-or-fail-to-start)

387* WebSocket 服务器的首次连接387* WebSocket 服务器的首次连接。要在交互式终端会话中再次尝试,请从 `/mcp` 中该服务器的菜单选择 **Reconnect**

388* 身份验证或未找到错误,因为它需要配置更改来解决。当 [`headersHelper`](#use-dynamic-headers-for-custom-authentication) 是服务器唯一的 `Authorization` 标头来源时,Claude Code 仍然重试身份验证错误,因为它在每次尝试时重新运行助手并可以获取新凭据388* 身份验证或未找到错误,因为它需要配置更改来解决。当 [`headersHelper`](#use-dynamic-headers-for-custom-authentication) 是服务器唯一的 `Authorization` 标头来源时,Claude Code 仍然重试身份验证错误,因为它在每次尝试时重新运行助手并可以获取新凭据

389 389 

390#### 退出或无法启动的 stdio 服务器390#### 退出或无法启动的 stdio 服务器


403 403 

404#### 自行重试失败的服务器404#### 自行重试失败的服务器

405 405 

406要重试所有失败或需要身份验证的服务器,请运行 `/mcp reconnect all`。在交互式终端中,这需要 Claude Code v2.1.284 或更高版本,较早的版本会在此处打印 `MCP server "all" not found`。406要重试每个失败或需要身份验证的服务器,请在交互式终端会话中的 Claude Code 输入框运行 `/mcp reconnect all`。这需要 Claude Code v2.1.284 或更高版本。较早的版本会打印 `MCP server "all" not found`。

407 407 

408#### Claude 如何了解服务器失败408#### Claude 如何了解服务器失败

409 409 


1332 1332 

1333来自 claude.ai 的服务器会出现在列表中,并带有指示符显示它们来自 claude.ai。1333来自 claude.ai 的服务器会出现在列表中,并带有指示符显示它们来自 claude.ai。

1334 1334 

1335Anthropic 本身也提供一些 connectors,无需您或管理员添加。在 [Claude Docs](https://code.claude.com/docs/zh-CN/artifacts.md#write-a-document-with-claude-docs) 可用的账户上,`/mcp` 列出 `claude.ai Claude Docs`,无需设置,当您要求创建供他人使用的文档时,Claude 会使用它。要关闭它,请将 `"claude.ai Claude Docs"` 的 `serverName` 条目添加到 `deniedMcpServers`,或使用 `/mcp` 切换,两者都在 [禁用 claude.ai connectors](#disable-claude-ai-connectors) 中描述。1335Anthropic 本身也提供一些 connectors,无需您或管理员添加。在 [Claude Docs](https://code.claude.com/docs/zh-CN/artifacts.md#write-a-document-with-claude-docs) 可用的账户上,`/mcp` 列出 `claude.ai Claude Docs`,无需设置,当您要求创建供他人使用的文档时,Claude 会使用它。要仅关闭此 connector,请参阅[禁用 claude.ai connectors](#disable-claude-ai-connectors)。

1336 1336 

1337当您的组织在 claude.ai 中管理其身份验证时,Claude Code 在 `/mcp` 和 [`/plugin`](https://code.claude.com/docs/zh-CN/plugins/install) 管理器中将 connector 标记为 `managed`。Managed 状态不会改变 Claude Code 连接到 connector 的方式或应用您组织的 [工具控制](#organization-controls-on-connector-tools)。1337当您的组织在 claude.ai 中管理其身份验证时,Claude Code 在 `/mcp` 和 [`/plugin`](https://code.claude.com/docs/zh-CN/plugins/install) 管理器中将 connector 标记为 `managed`。Managed 状态不会改变 Claude Code 连接到 connector 的方式或应用您组织的 [工具控制](#organization-controls-on-connector-tools)。

1338 1338 

model-config.md +7 −2

Details

349 349 

350当 Claude Code 应用的托管设置定义 `availableModels` 时,该列表单独适用,除了[提供自己的主机平台](https://code.claude.com/docs/zh-CN/settings.md#exceptions-to-managed-settings-precedence):用户、项目或本地设置中的条目无法扩展它,Claude Code 也永远不会跨托管源合并 `availableModels`;[Claude Code 如何组合托管源](https://code.claude.com/docs/zh-CN/managed-settings.md#how-claude-code-combines-managed-sources)说明了哪个源的列表适用。否则,来自用户、项目和本地设置的列表像其他数组设置一样[连接和去重](https://code.claude.com/docs/zh-CN/settings.md#settings-precedence)。在 Claude Code v2.1.175 之前,来自较低优先级作用域的条目合并到托管列表中,而不是被它替换。350当 Claude Code 应用的托管设置定义 `availableModels` 时,该列表单独适用,除了[提供自己的主机平台](https://code.claude.com/docs/zh-CN/settings.md#exceptions-to-managed-settings-precedence):用户、项目或本地设置中的条目无法扩展它,Claude Code 也永远不会跨托管源合并 `availableModels`;[Claude Code 如何组合托管源](https://code.claude.com/docs/zh-CN/managed-settings.md#how-claude-code-combines-managed-sources)说明了哪个源的列表适用。否则,来自用户、项目和本地设置的列表像其他数组设置一样[连接和去重](https://code.claude.com/docs/zh-CN/settings.md#settings-precedence)。在 Claude Code v2.1.175 之前,来自较低优先级作用域的条目合并到托管列表中,而不是被它替换。

351 351 

352在有效列表中,命名系列中特定模型的条目(无论是版本前缀还是完整模型 ID)禁用该系列的通配符条目:`["sonnet", "claude-sonnet-4-5"]` 仅允许 Sonnet 4.5 版本,而不是每个 Sonnet 模型。352在有效列表中,命名系列中特定模型的条目(无论是版本前缀还是完整模型 ID)禁用该系列的通配符条目。例如,使用 `["sonnet", "claude-sonnet-4-5"]` 时,用户只能选择 `claude-sonnet-4-5` [匹配](#restrict-model-selection)的模型 ID,而不是每个 Sonnet 模型。

353 353 

354### Mantle 模型 ID354### Mantle 模型 ID

355 355 


946>946>

947> 通过 [MDM 或托管设置文件](https://code.claude.com/docs/zh-CN/managed-settings.md#delivery-mechanisms) 提供的 `availableModels` 允许列表在使用第三方提供商时仍然适用;[服务器托管设置不会在那里提供](https://code.claude.com/docs/zh-CN/server-managed-settings.md#platform-availability)。947> 通过 [MDM 或托管设置文件](https://code.claude.com/docs/zh-CN/managed-settings.md#delivery-mechanisms) 提供的 `availableModels` 允许列表在使用第三方提供商时仍然适用;[服务器托管设置不会在那里提供](https://code.claude.com/docs/zh-CN/server-managed-settings.md#platform-availability)。

948>948>

949> 过滤与模型别名(如 `opus`)、版本前缀(如 `claude-opus-4-8`)或完整提供商形式的模型 ID 匹配。提供商特定的前缀(如 `us.anthropic.`)不会被删除,因此要允许特定模型,请列出其完整提供商形式 ID,或通过 [`modelOverrides`](#override-model-ids-per-version) 映射它。对于固定模型,该 ID 是您在其 `ANTHROPIC_DEFAULT_*_MODEL` 变量中设置的值。任何 `[1m]` 后缀在匹配前都会从允许列表条目和请求的模型中删除。949> 过滤与模型别名(如 `opus`)、版本前缀(如 `claude-opus-4-8`)或完整提供商形式的模型 ID 匹配。提供商特定的前缀(如 `us.anthropic.`)不会被删除,因此要允许特定模型,请通过 [`modelOverrides`](#override-model-ids-per-version) 映射它,或列出其完整提供商形式 ID:

950>

951> * **Google Cloud's Agent Platform**:当 Claude Code 请求的 ID 带有 `@` 日期(如 `claude-sonnet-4-5@20250929`)时,请在允许列表条目中包含该日期。单独的 `claude-sonnet-4-5` 在任一 [`availableModelsMatch`](https://code.claude.com/docs/zh-CN/settings-reference#availablemodelsmatch) 设置下都不会匹配该 ID。

952> * **固定模型**:列出您在该模型的 `ANTHROPIC_DEFAULT_*_MODEL` 变量中设置的值

953>

954> 任何 `[1m]` 后缀在匹配前都会从允许列表条目和请求的模型中删除。

950 955 

951### 自定义固定模型显示和功能956### 自定义固定模型显示和功能

952 957 

Details

605 605 

606* `prompt.id`:将用户提示词与其后直到下一个提示词之前的所有事件关联起来的 UUID。请参阅[事件关联属性](#event-correlation-attributes)。606* `prompt.id`:将用户提示词与其后直到下一个提示词之前的所有事件关联起来的 UUID。请参阅[事件关联属性](#event-correlation-attributes)。

607* `workspace.host_paths`:在桌面应用中选择的主机工作区目录,以字符串数组形式表示607* `workspace.host_paths`:在桌面应用中选择的主机工作区目录,以字符串数组形式表示

608* `workflow.run_id`:运行标识符,以 `wf_` 为前缀,出现在属于某次 [Workflow](https://code.claude.com/docs/zh-CN/workflows.md) 工具运行的 Agent 所发出的 API 和工具事件上。按某个 `workflow.run_id` 过滤事件即可重建该次运行的 API 请求和工具结果。该标识符涵盖工作流脚本生成的 Agent,以及这些 Agent 进一步生成的任何 Agent,例如 skill 调用。它与 Workflow 工具结果中报告的运行标识符一致。其他所有事件上均不存在该属性。608* `workflow.run_id`:运行标识符,前缀为 `wf_`,出现在属于某次 [Workflow](https://code.claude.com/docs/zh-CN/workflows.md) 工具运行的 Agent 所发出的 API 和工具事件上。按某个 `workflow.run_id` 筛选事件,即可重建该次运行的 API 请求和工具结果。该标识符涵盖工作流脚本生成的 Agent,以及这些 Agent 进一步生成的任何 Agent(例如 skill 调用)。它与 Workflow 工具结果中报告的运行标识符一致。

609* `workflow.name`:工作流的名称,即其脚本的 `meta.name`,与 `workflow.run_id` 一起发出。当运行执行未经修改的内置脚本时,内置工作流名称按原样显示。用户编写的名称(包括内置脚本的编辑副本)会被替换为 `custom`,除非设置了 `OTEL_LOG_TOOL_DETAILS=1`。609* `workflow.name`:工作流的名称,即其脚本的 `meta.name`,与 `workflow.run_id` 一起发出。当运行执行未经修改的内置脚本时,内置工作流名称按原样显示。用户编写的名称(包括内置脚本的编辑副本)会被替换为 `custom`,除非设置了 `OTEL_LOG_TOOL_DETAILS=1`。

610* `agent_id`:引发该事件的[子代理](https://code.claude.com/docs/zh-CN/sub-agents.md)的标识符,例如 `a3f2c1b4d5e6f7a80`。携带该属性的事件包括子代理的 API 和工具事件、其 [`assistant_response`](#assistant-response-event) 事件,以及已完成子代理的 [`subagent_completed`](#subagent-completed-event)。主会话事件和[进程内队友](https://code.claude.com/docs/zh-CN/agent-teams.md#choose-a-display-mode)事件上不包含该属性。子代理的 [span `agent_id`](#span-attributes) 与此值相同,或在开头的 `a` 之后添加一个标签,如 `acompact-3f2c1b4d5e6f7a80`。需要 Claude Code v2.1.310 或更高版本

611* `parent_agent_id`:生成或最近一次恢复引发该事件的子代理的 Agent 的 `agent_id`。当该 Agent 为主会话时不包含此属性。需要 Claude Code v2.1.310 或更高版本

610 612 

611#### 仓库属性613#### 仓库属性

612 614 


755| `prompt.id` | UUID v4 标识符,关联处理单个用户提示词期间产生的所有事件 |757| `prompt.id` | UUID v4 标识符,关联处理单个用户提示词期间产生的所有事件 |

756| `event.sequence` | 用于对事件排序的从 0 开始的计数器,按 Claude Code 进程计数,而不是按会话计数 |758| `event.sequence` | 用于对事件排序的从 0 开始的计数器,按 Claude Code 进程计数,而不是按会话计数 |

757| `message.uuid` | 持久保存在会话记录(`~/.claude/projects/*/*.jsonl` 文件)中的消息的 UUID。出现在 `assistant_response`、`api_response_body` 以及 `user_prompt` 上,但命令分派除外,因为命令分派可能产生零条或多条消息。在 `assistant_response` 和 `api_response_body` 上,这是该响应的最后一条会话记录条目,下一轮的 `parentUuid` 从它链接。在 `api_response_body` 上需要 Claude Code v2.1.274 或更高版本 |759| `message.uuid` | 持久保存在会话记录(`~/.claude/projects/*/*.jsonl` 文件)中的消息的 UUID。出现在 `assistant_response`、`api_response_body` 以及 `user_prompt` 上,但命令分派除外,因为命令分派可能产生零条或多条消息。在 `assistant_response` 和 `api_response_body` 上,这是该响应的最后一条会话记录条目,下一轮的 `parentUuid` 从它链接。在 `api_response_body` 上需要 Claude Code v2.1.274 或更高版本 |

758| `request_id` | 服务器分配的 API 请求 ID,从 `request-id` 响应头读取,例如 `req_011...`。对于没有 `request-id` 头的响应(如在 [Amazon Bedrock](https://code.claude.com/docs/zh-CN/amazon-bedrock.md) 上),该值改为来自 `x-amzn-requestid` 头。当响应携带任一头时,出现在 `api_request`、`api_error`、`api_refusal`、`assistant_response` 和 `api_response_body` 上。与 `llm_request` 追踪 span 上的同名属性相匹配。`x-amzn-requestid` 来源需要 Claude Code v2.1.282 或更高版本 |760| `request_id` | 服务器分配的 API 请求 ID,从 `request-id` 响应头读取,例如 `req_011...`。对于没有 `request-id` 响应头的响应(如在 [Amazon Bedrock](https://code.claude.com/docs/zh-CN/amazon-bedrock.md) 上),该值改为取自 `x-amzn-requestid` 响应头。当响应携带其中任一响应头时,出现在 `api_request`、`api_error`、`api_refusal`、`assistant_response`、`api_response_body`、[`tool_result`](#tool-result-event) 和 [`tool_decision`](#tool-decision-event) 上。与 `llm_request` 追踪 span 上的同名属性一致。`x-amzn-requestid` 来源需要 Claude Code v2.1.282 或更高版本 |

759| `client_request_id` | 客户端生成的 UUID,作为 `x-client-request-id` 请求头发送。在第一方 API 连接上出现于 `api_request` 和 `api_error`;在第三方提供商后端上,以及当请求通过非流式回退方式重试时不存在。它将请求与其响应配对,并且对于超时等从未产生服务器 `request_id` 的失败仍然可用。与 `llm_request` 追踪 span 上的同名属性一致 |761| `client_request_id` | 客户端生成的 UUID,作为 `x-client-request-id` 请求头发送。在第一方 API 连接上出现于 `api_request` 和 `api_error`;在第三方提供商后端上,以及当请求通过非流式回退方式重试时不存在。它将请求与其响应配对,并且对于超时等从未产生服务器 `request_id` 的失败仍然可用。与 `llm_request` 追踪 span 上的同名属性一致 |

760 762 

761要追踪由单个提示词触发的所有活动,请按特定的 `prompt.id` 值过滤您的事件。这会返回处理该提示词期间发生的 user\_prompt 事件、所有 api\_request 事件以及所有 tool\_result 事件。763要追踪由单个提示词触发的所有活动,请按特定的 `prompt.id` 值过滤您的事件。这会返回处理该提示词期间发生的 user\_prompt 事件、所有 api\_request 事件以及所有 tool\_result 事件。


820* `event.sequence`:用于对事件排序的按进程计数器,详见[事件关联属性](#event-correlation-attributes)822* `event.sequence`:用于对事件排序的按进程计数器,详见[事件关联属性](#event-correlation-attributes)

821* `tool_name`:工具的名称823* `tool_name`:工具的名称

822* `tool_use_id`:此次工具调用的唯一标识符。与传递给 hook 的 `tool_use_id` 相匹配,从而可以在 OTel 事件和 hook 捕获的数据之间建立关联。824* `tool_use_id`:此次工具调用的唯一标识符。与传递给 hook 的 `tool_use_id` 相匹配,从而可以在 OTel 事件和 hook 捕获的数据之间建立关联。

825* `request_id`:包含此工具调用的 API 响应的 [`request_id`](#event-correlation-attributes),以便您将该调用与该响应的 API 事件关联起来。当该响应没有请求 ID,或没有任何 API 响应包含该调用时不包含。需要 Claude Code v2.1.310 或更高版本

823* `success`:`"true"` 或 `"false"`826* `success`:`"true"` 或 `"false"`

824* `duration_ms`:执行时间(以毫秒为单位)827* `duration_ms`:执行时间(以毫秒为单位)

825* `error_type`:工具失败时的错误类别字符串,例如 `"Error:ENOENT"` 或 `"ShellError"`828* `error_type`:工具失败时的错误类别字符串,例如 `"Error:ENOENT"` 或 `"ShellError"`


972* `event.sequence`:用于对事件排序的按进程计数器,详见[事件关联属性](#event-correlation-attributes)975* `event.sequence`:用于对事件排序的按进程计数器,详见[事件关联属性](#event-correlation-attributes)

973* `tool_name`:工具的名称(例如 "Read"、"Edit"、"Write"、"NotebookEdit")976* `tool_name`:工具的名称(例如 "Read"、"Edit"、"Write"、"NotebookEdit")

974* `tool_use_id`:此次工具调用的唯一标识符。与传递给 hook 的 `tool_use_id` 相匹配,从而可以在 OTel 事件和 hook 捕获的数据之间建立关联。977* `tool_use_id`:此次工具调用的唯一标识符。与传递给 hook 的 `tool_use_id` 相匹配,从而可以在 OTel 事件和 hook 捕获的数据之间建立关联。

978* `request_id`:包含此工具调用的 API 响应的 [`request_id`](#event-correlation-attributes),以便您将该调用与该响应的 API 事件关联起来。当该响应没有请求 ID,或没有任何 API 响应包含该调用时不包含。需要 Claude Code v2.1.310 或更高版本

975* `decision`:`"accept"` 或 `"reject"`979* `decision`:`"accept"` 或 `"reject"`

976* `tool_source`:始终存在。工具的来源,是由 CLI 定义的封闭值集合:980* `tool_source`:始终存在。工具的来源,是由 CLI 定义的封闭值集合:

977 * `"builtin"`:CLI 自身的工具981 * `"builtin"`:CLI 自身的工具


1024 * 对于 Skill 工具:包括 `skill_name`1028 * 对于 Skill 工具:包括 `skill_name`

1025 * 对于 Agent 工具或旧版 Task 工具:包括 `subagent_type`1029 * 对于 Agent 工具或旧版 Task 工具:包括 `subagent_type`

1026 1030 

1027如果您将 OpenTelemetry SDK 的 `OTEL_LOGRECORD_ATTRIBUTE_COUNT_LIMIT` 调低到低于 `tool_decision` 事件上的属性数量,SDK 会丢弃 Claude Code 最后设置的属性。SDK 会首先丢弃 `permission_mode`,其次是 `classifier_category`,再次是 `classifier_verdict`,只有在丢弃这三个属性之后才会丢弃事件的其他属性。此顺序需要 Claude Code v2.1.302 或更高版本。1031如果您将 OpenTelemetry SDK 的 `OTEL_LOGRECORD_ATTRIBUTE_COUNT_LIMIT` 降低到低于 `tool_decision` 事件上的属性数量,SDK 会丢弃 Claude Code 最后设置的属性。SDK 会先于任何其他属性按以下顺序丢弃这些属性,并跳过事件未携带的属性:

1032 

10331. `parent_agent_id`

10342. `agent_id`

10353. `request_id`

10364. `permission_mode`

10375. `classifier_category`

10386. `classifier_verdict`

1039 

1040在 Claude Code v2.1.302 或更高版本上,`permission_mode`、`classifier_category` 和 `classifier_verdict` 按此顺序丢弃。`parent_agent_id`、`agent_id` 和 `request_id` 需要 v2.1.310 或更高版本。

1028 1041 

1029#### 安全事件1042#### 安全事件

1030 1043 

Details

240 240 

241两个 Datadog 摄取主机仅携带可选的操作遥测,设置 [`CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC`](https://code.claude.com/docs/zh-CN/env-vars) 会禁用两者。第三方提供商上的会话永远不会发送到这些主机,即使平台设置了 [`CLAUDE_CODE_PROVIDER_MANAGED_BY_HOST`](https://code.claude.com/docs/zh-CN/env-vars) 且遥测指标默认启用。有关 Claude Code 发送的所有内容以及如何在最终确定白名单之前禁用它,请参阅[遥测服务](https://code.claude.com/docs/zh-CN/data-usage.md#telemetry-services)。241两个 Datadog 摄取主机仅携带可选的操作遥测,设置 [`CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC`](https://code.claude.com/docs/zh-CN/env-vars) 会禁用两者。第三方提供商上的会话永远不会发送到这些主机,即使平台设置了 [`CLAUDE_CODE_PROVIDER_MANAGED_BY_HOST`](https://code.claude.com/docs/zh-CN/env-vars) 且遥测指标默认启用。有关 Claude Code 发送的所有内容以及如何在最终确定白名单之前禁用它,请参阅[遥测服务](https://code.claude.com/docs/zh-CN/data-usage.md#telemetry-services)。

242 242 

243### 云提供商和 LLM 网关路由

244 

243使用 [Amazon Bedrock](https://code.claude.com/docs/zh-CN/amazon-bedrock.md)、[Google Cloud 的 Agent Platform](https://code.claude.com/docs/zh-CN/google-vertex-ai.md)、[Microsoft Foundry](https://code.claude.com/docs/zh-CN/microsoft-foundry.md) 或已登录的 [Claude 应用网关](https://code.claude.com/docs/zh-CN/claude-apps-gateway)会话时,模型流量和身份验证转到您的提供商或网关,而不是 `api.anthropic.com`、`claude.ai` 或 `platform.claude.com`。WebFetch 工具仍会调用 `api.anthropic.com` 进行其[域名安全检查](https://code.claude.com/docs/zh-CN/data-usage.md#webfetch-domain-safety-check),除非您在[设置](https://code.claude.com/docs/zh-CN/settings.md)中设置 `skipWebFetchPreflight: true`。245使用 [Amazon Bedrock](https://code.claude.com/docs/zh-CN/amazon-bedrock.md)、[Google Cloud 的 Agent Platform](https://code.claude.com/docs/zh-CN/google-vertex-ai.md)、[Microsoft Foundry](https://code.claude.com/docs/zh-CN/microsoft-foundry.md) 或已登录的 [Claude 应用网关](https://code.claude.com/docs/zh-CN/claude-apps-gateway)会话时,模型流量和身份验证转到您的提供商或网关,而不是 `api.anthropic.com`、`claude.ai` 或 `platform.claude.com`。WebFetch 工具仍会调用 `api.anthropic.com` 进行其[域名安全检查](https://code.claude.com/docs/zh-CN/data-usage.md#webfetch-domain-safety-check),除非您在[设置](https://code.claude.com/docs/zh-CN/settings.md)中设置 `skipWebFetchPreflight: true`。

244 246 

245通过带有 [`ANTHROPIC_BASE_URL`](https://code.claude.com/docs/zh-CN/llm-gateway-connect#set-the-base-url-and-credential) 的 [LLM 网关](https://code.claude.com/docs/zh-CN/llm-gateway)路由时,[快速模式](https://code.claude.com/docs/zh-CN/fast-mode.md)可用性检查仍会调用 `api.anthropic.com` 而不是网关基础 URL。检查确实遵守配置的 HTTP 代理,因此当网络阻止是原因时,代理中 `api.anthropic.com` 的白名单条目是修复。网络阻止仅在主机即使通过代理也无法访问时才会导致检查失败,快速模式随后会报告连接错误。当检查呈现网关颁发的凭证而 Anthropic 拒绝时,也会出现相同的连接错误;白名单在那里无法帮助,因为没有任何内容被阻止。有关恢复它的变量,请参阅[在代理和 LLM 网关后面使用快速模式](https://code.claude.com/docs/zh-CN/fast-mode.md#use-fast-mode-behind-proxies-and-llm-gateways)。247如果您的开发人员在通过 [`ANTHROPIC_BASE_URL`](https://code.claude.com/docs/zh-CN/llm-gateway-connect#set-the-base-url-and-credential) 设置的 [LLM 网关](https://code.claude.com/docs/zh-CN/llm-gateway)后面使用[快速模式](https://code.claude.com/docs/zh-CN/fast-mode.md),请确保通过您的代理可以访问 `api.anthropic.com`。当 Claude Code 发送快速模式可用性检查时,该检查会通过任何已配置的 HTTP 代理发送到该主机,而永远不会发送到网关。有关何时不发送该检查,以及在每种情况下恢复快速模式的变量,请参阅[在代理和 LLM 网关后面使用快速模式](https://code.claude.com/docs/zh-CN/fast-mode.md#use-fast-mode-behind-proxies-and-llm-gateways)。

246 248 

247### 组织 IP 白名单和代理出口249### 组织 IP 白名单和代理出口

248 250 

Details

106 106 

107hook 模块中的代码嵌套过深,或其导入链过长,导致 Claude Code 无法加载它。该行以 mod 的名称和 `hooks module did not load:` 开头,然后给出某个文件的名称以及此原因。107hook 模块中的代码嵌套过深,或其导入链过长,导致 Claude Code 无法加载它。该行以 mod 的名称和 `hooks module did not load:` 开头,然后给出某个文件的名称以及此原因。

108 108 

109请在该文件以及通过其导入所到达的文件中查找嵌套最深的部分,并重写该部分以减少嵌套,或缩短导入链。如果该 mod 是您安装的而非您编写的,请让其作者进行修改。109请在该文件以及通过其导入所到达的文件中查找嵌套最深的部分,并重写该部分以减少嵌套,或缩短导入链。如果该 mod 不是您编写的,请让其作者进行修复。

110 110 

111### `the parser stopped` 或 `the engine ran out of stack loading the file`111### `the parser stopped` 或 `the engine ran out of stack loading the file`

112 112 

routines.md +20 −2

Details

25* 仅有 API 触发器的任务会在您调用其端点时运行。25* 仅有 API 触发器的任务会在您调用其端点时运行。

26* 仅有 GitHub 触发器的任务会在发生匹配的仓库事件时运行。26* 仅有 GitHub 触发器的任务会在发生匹配的仓库事件时运行。

27 27 

28定时任务适用于 Pro、Max、Team 和 Enterprise 套餐。您可以在 [claude.ai/code/routines](https://claude.ai/code/routines) 创建和管理它们,也可以在 CLI 中使用 `/schedule`。旧名称 Routine [仍会出现](#where-the-name-routines-still-appears)在网址、CLI 和 API 中。28定时任务适用于 Pro、Max、Team 和 Enterprise 套餐。您可以在 [claude.ai/code/routines](https://claude.ai/code/routines) 创建和管理它们,也可以在 CLI 中使用 `/schedule`。旧名称 Routine [仍会出现](#where-the-name-routines-still-appears)。

29 29 

30> [!NOTE]30> [!NOTE]

31>31>


66 66 

67**1. 打开创建对话框**67**1. 打开创建对话框**

68 68 

69访问 [claude.ai/code/routines](https://claude.ai/code/routines) 并点击 **New task**。如果先打开了一个菜单,请选择 **Set up manually**。随后会打开 **New scheduled task** 对话框。该菜单中的另一个选项 **Create with Claude** 允许您在聊天中描述任务,由 Claude 为您创建。69访问 [claude.ai/code/routines](https://claude.ai/code/routines) 并点击 **New task**,以打开 **New scheduled task** 对话框。继续之前,请留意以下界面:

70 

71* 如果按钮显示为 **New routine** 而不是 **New task**,请点击 **New routine**,并继续按照[完整页面表单](#full-page-form)进行操作。

72* 在 Desktop 应用中,如果打开了包含 **Local** 和 **Cloud** 的菜单,请转到[完整页面表单](#full-page-form)。

73* 如果打开了包含 **Create with Claude** 和 **Set up manually** 的菜单,请选择 **Set up manually** 以打开对话框。**Create with Claude** 则允许您在聊天中描述任务,由 Claude 为您创建。

74* 如果打开的是完整页面而不是对话框,请转到[完整页面表单](#full-page-form)。

70 75 

71如果对话框打开时已显示 **Repositories** 和 **Environment**,请参阅[该对话框有何不同](#dialog-with-repositories-and-environment-in-the-main-view)。否则,此对话框也可用于创建 claude.ai 聊天的定时任务。要将您的任务设为对话框中所称的 Claude Code 任务,请在后续步骤中选择一个仓库,或添加 GitHub 事件触发器或 API 触发器。此类任务会在云端会话中运行 Claude Code。76如果对话框打开时已显示 **Repositories** 和 **Environment**,请参阅[该对话框有何不同](#dialog-with-repositories-and-environment-in-the-main-view)。否则,此对话框也可用于创建 claude.ai 聊天的定时任务。要将您的任务设为对话框中所称的 Claude Code 任务,请在后续步骤中选择一个仓库,或添加 GitHub 事件触发器或 API 触发器。此类任务会在云端会话中运行 Claude Code。

72 77 


126 131 

127请在添加 GitHub 事件触发器之前选择仓库,因为在选择仓库之前该触发器不可用。132请在添加 GitHub 事件触发器之前选择仓库,因为在选择仓库之前该触发器不可用。

128 133 

134#### 完整页面表单

135 

136在 Desktop 应用中,如果打开了包含 **Local** 和 **Cloud** 的菜单,请选择 **Cloud**。随后会打开一个标题为 **New routine** 或 **New scheduled task** 的页面。填写其中的字段:

137 

138* **Name**:输入一个名称。

139* **Instructions**:输入提示词。在同一个输入框中,选择模型、仓库和环境。有关每一项所控制的内容,请参阅[从 Web 创建](#create-from-the-web)下的步骤。

140* **Select a trigger**:选择 **Schedule**、**GitHub event** 或 **API**。对于计划,请参阅[添加计划触发器](#add-a-schedule-trigger)。对于 [GitHub 事件](#add-a-github-trigger),请选择一个仓库。对于 [API 触发器](#add-an-api-trigger),请从点击 **Create** 后打开的 **API token** 对话框中复制令牌,因为它只显示一次。要组合多个触发器,请点击 **Add another trigger**。

141* **Connectors**:默认包含您所有已连接的连接器,因此请移除任务不需要的连接器。

142 

143如果 **Create** 不可用,请将鼠标悬停在其上,查看表单还需要填写哪些内容。点击 **Create**,任务的详情页随即打开。

144 

129### 从 CLI 创建145### 从 CLI 创建

130 146 

131在任意会话中运行 `/schedule`,即可通过对话方式创建定时任务。您也可以直接传入描述,例如定期任务 `/schedule daily PR review at 9am` 或一次性任务 `/schedule clean up feature flag in one week`。Claude 会逐步收集与 Web 对话框相同的信息,然后将任务保存到您的账户。该命令也可以通过别名 `/routines` 使用。147在任意会话中运行 `/schedule`,即可通过对话方式创建定时任务。您也可以直接传入描述,例如定期任务 `/schedule daily PR review at 9am` 或一次性任务 `/schedule clean up feature flag in one week`。Claude 会逐步收集与 Web 对话框相同的信息,然后将任务保存到您的账户。该命令也可以通过别名 `/routines` 使用。


152* **整点运行**:如果您将运行安排在整点(例如 9:00),它可能会晚几分钟才开始。要在接近计划时间时开始,请选择整点后几分钟,例如 9:07。168* **整点运行**:如果您将运行安排在整点(例如 9:00),它可能会晚几分钟才开始。要在接近计划时间时开始,请选择整点后几分钟,例如 9:07。

153* **自定义间隔**:如果预设中没有您需要的节奏,请先创建任务,然后在其[编辑对话框](#edit-and-control-scheduled-tasks)中选择 **Custom**。接着输入 cron 表达式,例如 `0 */2 * * *` 表示每两小时运行一次。要在 CLI 中设置,请运行 [`/schedule update`](#manage-scheduled-tasks-from-the-cli)。运行频率高于每小时一次的表达式会被拒绝。169* **自定义间隔**:如果预设中没有您需要的节奏,请先创建任务,然后在其[编辑对话框](#edit-and-control-scheduled-tasks)中选择 **Custom**。接着输入 cron 表达式,例如 `0 */2 * * *` 表示每两小时运行一次。要在 CLI 中设置,请运行 [`/schedule update`](#manage-scheduled-tasks-from-the-cli)。运行频率高于每小时一次的表达式会被拒绝。

154* **时区**:选择预设频率时,请以您的本地时区输入时间。170* **时区**:选择预设频率时,请以您的本地时区输入时间。

171* **Cron 表达式时区**:当表达式仅由五个字段组成时,请以 UTC 填写小时,因此 `0 9 * * 1-5` 会在工作日的 UTC 上午 9:00 运行。如果该字段以 `CRON_TZ=` 前缀开头,请保留该前缀并以其指定的时区填写小时,或者删除该前缀并以 UTC 填写小时。

155 172 

156#### 安排一次性运行173#### 安排一次性运行

157 174 


455 472 

456定时任务以前称为 Routine,以下位置仍保留这一旧名称。它们指的都是同一项功能:473定时任务以前称为 Routine,以下位置仍保留这一旧名称。它们指的都是同一项功能:

457 474 

475* **应用**:在某些账户中,侧边栏条目和页面标题显示为 **Routines**,按钮显示为 **New routine**,其他标签也使用 routine 一词。如需在此处创建任务,请参阅[完整页面表单](#full-page-form)。

458* **网址**:`claude.ai/code/routines`476* **网址**:`claude.ai/code/routines`

459* **CLI**:`/schedule` 的别名 `/routines`、该命令的描述,以及 Claude 在设置任务时的回复477* **CLI**:`/schedule` 的别名 `/routines`、该命令的描述,以及 Claude 在设置任务时的回复

460* **API**:`/fire` 端点路径、其 beta 标头、其响应中的 `type`、`<routine-fire-payload>` 标签,以及 [Trigger a routine through the API](https://platform.claude.com/docs/en/api/claude-code/routines-fire) 参考页面478* **API**:`/fire` 端点路径、其 beta 标头、其响应中的 `type`、`<routine-fire-payload>` 标签,以及 [Trigger a routine through the API](https://platform.claude.com/docs/en/api/claude-code/routines-fire) 参考页面

sandboxing.md +13 −1

Details

537 537 

538* **在您的工作目录及其上级目录中**:`.claude` 设置文件,`.claude/skills`、`.claude/agents`、`.claude/commands` 和 `.claude/hooks` 目录,`.mcp.json`,以及 Claude Code 自行运行的文件,例如 `.claude/workflows` 和 `.claude/scheduled_tasks.json`538* **在您的工作目录及其上级目录中**:`.claude` 设置文件,`.claude/skills`、`.claude/agents`、`.claude/commands` 和 `.claude/hooks` 目录,`.mcp.json`,以及 Claude Code 自行运行的文件,例如 `.claude/workflows` 和 `.claude/scheduled_tasks.json`

539* **仅在您的工作目录中**:shell 启动文件(例如 `.bashrc` 和 `.zshrc`)、`.gitconfig`、`.vscode` 和 `.idea` 目录,以及 `.git` 内的 `hooks` 和 `config`539* **仅在您的工作目录中**:shell 启动文件(例如 `.bashrc` 和 `.zshrc`)、`.gitconfig`、`.vscode` 和 `.idea` 目录,以及 `.git` 内的 `hooks` 和 `config`

540* **会将您的工作目录变成裸 git 仓库的文件**:顶层的 `HEAD`、`objects` 和 `refs`,以及当旁边存在 `HEAD` 时,该处已有的 `config` 和 `hooks` 条目。即使没有 `HEAD`,名为 `config` 的文件也会被拒绝。在 Linux 和 WSL2 上,如果沙箱化命令运行期间出现顶层 `HEAD` 文件或 `objects`、`refs` 目录,沙箱会将其删除540* **会将您的工作目录变成裸 git 仓库的文件**:顶层的 `HEAD`、`objects` 和 `refs`,以及当旁边存在 `HEAD` 文件或符号链接时,该处已有的 `config` 和 `hooks` 条目。即使没有 `HEAD`,名为 `config` 的文件也会被拒绝。[之后出现的 `HEAD`、`objects` 或 `refs` 可能会被删除](#when-the-sandbox-deletes-head-objects-or-refs)。在 Linux 和 WSL2 上,沙箱化命令可以在其不存在的位置创建一个。

541* **在 `~/.claude` 或 `CLAUDE_CONFIG_DIR` 所指向的目录中**:其中的大部分内容,以及 `~/.claude.json` 和 `.credentials.json` 凭据存储541* **在 `~/.claude` 或 `CLAUDE_CONFIG_DIR` 所指向的目录中**:其中的大部分内容,以及 `~/.claude.json` 和 `.credentials.json` 凭据存储

542 542 

543如果会话期间在受保护设置文件的路径上出现符号链接,沙箱还会从下一条命令开始拒绝写入该符号链接所指向的文件。543如果会话期间在受保护设置文件的路径上出现符号链接,沙箱还会从下一条命令开始拒绝写入该符号链接所指向的文件。


552 552 

553如果 `git merge` 或 `git checkout` 在这些路径之一上因 `unable to unlink old` 而失败,请参阅[git 命令因 `unable to unlink old` 而失败](#a-git-command-fails-with-unable-to-unlink-old)。553如果 `git merge` 或 `git checkout` 在这些路径之一上因 `unable to unlink old` 而失败,请参阅[git 命令因 `unable to unlink old` 而失败](#a-git-command-fails-with-unable-to-unlink-old)。

554 554 

555#### 沙箱何时删除 `HEAD`、`objects` 或 `refs`

556 

557沙箱化命令结束后,工作目录中较新的顶层 `HEAD`、`objects` 或 `refs` 条目会被删除,除非它是包含内容的文件夹。"较新"是指沙箱上次构建其配置时该条目并不存在:即会话开始时,或在 [`/cd`](https://code.claude.com/docs/zh-CN/commands) 等更改之后。

558 

559如果沙箱上次构建其配置时存在 `HEAD` 文件或符号链接,那么较新的包含内容的 `objects` 或 `refs` 文件夹也会连同其内容一起被删除。要保留某个文件夹,请参阅[命令执行后名为 `objects` 或 `refs` 的文件夹消失](#a-folder-named-objects-or-refs-disappears-after-a-command)。

560 

555#### 经过符号链接的被拒绝路径561#### 经过符号链接的被拒绝路径

556 562 

557在 macOS 上,当被拒绝的路径经过符号链接时(例如 `~/.claude` 是一个指向 dotfiles 仓库的链接),沙箱也会拒绝该路径的真实位置。这涵盖沙箱自身的拒绝,以及您按字面写出的 `denyWrite` 和 `denyRead` 条目。563在 macOS 上,当被拒绝的路径经过符号链接时(例如 `~/.claude` 是一个指向 dotfiles 仓库的链接),沙箱也会拒绝该路径的真实位置。这涵盖沙箱自身的拒绝,以及您按字面写出的 `denyWrite` 和 `denyRead` 条目。


881 887 

882失败后,Claude 可能会[提议在沙箱外重新运行该命令](#the-unsandboxed-retry-escape-hatch)。批准该重试,或在另一个终端中自行运行该 git 命令。如果您已将 `allowUnsandboxedCommands` 设置为 `false`,Claude 无法提供重试,因此请自行运行该命令。888失败后,Claude 可能会[提议在沙箱外重新运行该命令](#the-unsandboxed-retry-escape-hatch)。批准该重试,或在另一个终端中自行运行该 git 命令。如果您已将 `allowUnsandboxedCommands` 设置为 `false`,Claude 无法提供重试,因此请自行运行该命令。

883 889 

890### 名为 `objects` 或 `refs` 的文件夹在命令执行后消失

891 

892会话期间出现的顶层 `objects` 或 `refs` 文件夹可能会[在沙箱化命令结束后被删除](#when-the-sandbox-deletes-head-objects-or-refs)。无论它是由命令、Claude 还是您创建的,都是如此。要保留某个文件夹,请在其中放入一些内容。如果会话期间顶层曾存在 `HEAD` 文件或符号链接,请将其移走,然后重新启动在该位置打开的每个 Claude Code 会话。

893 

894在 v2.1.307 之前,即使文件夹中有内容且不存在 `HEAD`,该文件夹也会被删除。如果您使用的是更早的版本,请[更新 Claude Code](https://code.claude.com/docs/zh-CN/setup.md#update-claude-code)。

895 

884### Bubblewrap 在容器内启动失败896### Bubblewrap 在容器内启动失败

885 897 

886在无特权容器中,[bubblewrap](#os-level-enforcement) 无法挂载新的 `/proc` 文件系统,因此沙箱化命令会因 `bwrap` 错误(如 `Can't mount proc on /newroot/proc: Operation not permitted`)而失败。将 [`enableWeakerNestedSandbox`](https://code.claude.com/docs/zh-CN/settings-reference#sandbox-enableweakernestedsandbox) 设置为 `true`,以便沙箱改为绑定挂载容器现有的 `/proc`。仅当外部容器已提供您需要的隔离边界时才使用此设置,因为该设置会向沙箱化命令公开进程信息,而新的 `/proc` 挂载会隐藏这些信息。898在无特权容器中,[bubblewrap](#os-level-enforcement) 无法挂载新的 `/proc` 文件系统,因此沙箱化命令会因 `bwrap` 错误(如 `Can't mount proc on /newroot/proc: Operation not permitted`)而失败。将 [`enableWeakerNestedSandbox`](https://code.claude.com/docs/zh-CN/settings-reference#sandbox-enableweakernestedsandbox) 设置为 `true`,以便沙箱改为绑定挂载容器现有的 `/proc`。仅当外部容器已提供您需要的隔离边界时才使用此设置,因为该设置会向沙箱化命令公开进程信息,而新的 `/proc` 挂载会隐藏这些信息。

Details

30 30 

31图中的两个 Claude Code 框是会话进程:一个运行器同时执行两个会话,达到其配置的容量。运行器一次为一个[所有者](#key-concepts)服务,并在声称其第一个会话时锁定到该所有者,因此检出的代码永远不会在所有者之间混合;[运行器生命周期](#runner-lifecycle)涵盖了这个规则。31图中的两个 Claude Code 框是会话进程:一个运行器同时执行两个会话,达到其配置的容量。运行器一次为一个[所有者](#key-concepts)服务,并在声称其第一个会话时锁定到该所有者,因此检出的代码永远不会在所有者之间混合;[运行器生命周期](#runner-lifecycle)涵盖了这个规则。

32 32 

33您可以自己启动运行器并保持它们运行,或运行[自动扩展编排器](https://code.claude.com/docs/zh-CN/self-hosted-environments-configuration.md#on-demand-runners),这是您托管的第二个进程,它在会话排队时启动运行器;每个运行器在其工作完成时自行退出。无论哪种方式,您都设置一次环境,它会出现在每个支持的表面上的选择器中。33您可以自己启动运行器并保持它们运行,或运行[自动扩展编排器](https://code.claude.com/docs/zh-CN/self-hosted-environments-configuration.md#on-demand-runners),这是您托管的第二个进程,它在会话排队时启动运行器。无论哪种方式,您都只需设置一次环境,它会出现在每个支持的使用入口上的选择器中。

34 34 

35## 可用性和限制35## 可用性和限制

36 36 


122 122 

123支持企业出站代理。运行器和可选的[自动扩展编排器](https://code.claude.com/docs/zh-CN/self-hosted-environments-configuration.md#on-demand-runners)遵守[网络配置](https://code.claude.com/docs/zh-CN/network-config.md)中描述的代理和 mTLS 环境变量,例如 `HTTPS_PROXY` 和 `NO_PROXY`;在每个进程的环境中设置它们。这些变量涵盖控制平面调用、编排器的 [SCM 连接器](https://code.claude.com/docs/zh-CN/self-hosted-environments-reference.md#scm-connector-flags) WebSocket 和 HTTPS 远程的内置克隆,会话从运行器继承它们。会话流使用 HTTPS 上的服务器发送事件,因此路径中的代理不能缓冲响应。123支持企业出站代理。运行器和可选的[自动扩展编排器](https://code.claude.com/docs/zh-CN/self-hosted-environments-configuration.md#on-demand-runners)遵守[网络配置](https://code.claude.com/docs/zh-CN/network-config.md)中描述的代理和 mTLS 环境变量,例如 `HTTPS_PROXY` 和 `NO_PROXY`;在每个进程的环境中设置它们。这些变量涵盖控制平面调用、编排器的 [SCM 连接器](https://code.claude.com/docs/zh-CN/self-hosted-environments-reference.md#scm-connector-flags) WebSocket 和 HTTPS 远程的内置克隆,会话从运行器继承它们。会话流使用 HTTPS 上的服务器发送事件,因此路径中的代理不能缓冲响应。

124 124 

125如果您的代理还需要 `Proxy-Authorization` 标头,运行器可以将其添加到它打开到代理的每个连接;请参阅[向出站代理进行身份验证](https://code.claude.com/docs/zh-CN/self-hosted-environments-deploy.md#authenticate-to-an-egress-proxy)。125* **代理身份验证**:如果您的代理还需要 `Proxy-Authorization` 标头,运行器可以将其添加到它打开到代理的每个连接;请参阅[向出站代理进行身份验证](https://code.claude.com/docs/zh-CN/self-hosted-environments-deploy.md#authenticate-to-an-egress-proxy)。

126* **长连接响应**:如果运行器拾取了会话,但 Claude 始终没有回答其第一条消息,原因可能在于您的代理。请参阅[会话已被拾取,但 Claude 始终没有回答其第一条消息](https://code.claude.com/docs/zh-CN/self-hosted-environments-deploy.md#when-a-sessions-first-message-is-never-answered)。

126 127 

127## 保留在您的基础设施上的内容128## 保留在您的基础设施上的内容

128 129 

Details

36| `CLAUDE_CODE_REMOTE_SESSION_UUID` | 相同的会话 ID,采用规范 UUID 形式,供以 UUID 作为键的系统使用。 |36| `CLAUDE_CODE_REMOTE_SESSION_UUID` | 相同的会话 ID,采用规范 UUID 形式,供以 UUID 作为键的系统使用。 |

37| `CLAUDE_CODE_REMOTE_SLACK_THREAD_URL` | 对于属于某个 Slack 线程的 [Claude Tag](https://claude.com/docs/claude-tag/overview) 会话,为该线程的链接。其他会话未设置此变量,线程会话也可能未设置。 |37| `CLAUDE_CODE_REMOTE_SLACK_THREAD_URL` | 对于属于某个 Slack 线程的 [Claude Tag](https://claude.com/docs/claude-tag/overview) 会话,为该线程的链接。其他会话未设置此变量,线程会话也可能未设置。 |

38| `CLAUDE_CODE_REMOTE_SLACK_THREAD_TS` | 对于属于某个 Slack 线程的 Claude Tag 会话,为该线程的 Slack 时间戳,例如 `1700000000.000100`。可能未设置,也可能在 `CLAUDE_CODE_REMOTE_SLACK_THREAD_URL` 未设置时被设置,因此请分别检查每个变量。 |38| `CLAUDE_CODE_REMOTE_SLACK_THREAD_TS` | 对于属于某个 Slack 线程的 Claude Tag 会话,为该线程的 Slack 时间戳,例如 `1700000000.000100`。可能未设置,也可能在 `CLAUDE_CODE_REMOTE_SLACK_THREAD_URL` 未设置时被设置,因此请分别检查每个变量。 |

39| `CLAUDE_CODE_REMOTE_SLACK_CHANNEL_ID` | 对于 Claude Tag 会话,为该会话所服务的、或其线程所在的 Slack 频道或私信的 ID,例如 `C0123ABCDE`。Slack 时间戳只在单个频道内标识一条消息,因此请将此 ID 与 `CLAUDE_CODE_REMOTE_SLACK_THREAD_TS` 一起记录。其他会话未设置此变量,Claude Tag 会话也可能未设置。 |

39| `CLAUDE_SESSION_INGRESS_TOKEN_FILE` | 绝对路径,指向保存当前会话 JWT 的按会话文件,在令牌刷新时保持最新。Shell 子进程在下载用户添加到会话的附件时从中读取其 `Authorization` 标头。`exec` 自动保留该变量;重建子进程环境的包装脚本必须携带该变量,否则附件下载会无声地停止工作。 |40| `CLAUDE_SESSION_INGRESS_TOKEN_FILE` | 绝对路径,指向保存当前会话 JWT 的按会话文件,在令牌刷新时保持最新。Shell 子进程在下载用户添加到会话的附件时从中读取其 `Authorization` 标头。`exec` 自动保留该变量;重建子进程环境的包装脚本必须携带该变量,否则附件下载会无声地停止工作。 |

40| `CLAUDE_CONFIG_DIR` | 按会话 Claude 配置目录,在会话启动时从运行器在启动时捕获的运行器主机配置快照中写入;请参阅 [Permissions and tool approval](#permissions-and-tool-approval)。此处的写入仅限于此会话。除非您使用 [`--remove-session-state`](https://code.claude.com/docs/zh-CN/self-hosted-environments-reference#runner-cli-flags) 启动运行器,否则会话结束后该目录仍会保留在 `<base-dir>/_sessions/` 下;请参阅 [Reuse a pre-warmed checkout](https://code.claude.com/docs/zh-CN/self-hosted-environments-deploy.md#reuse-a-pre-warmed-checkout)。 |41| `CLAUDE_CONFIG_DIR` | 按会话 Claude 配置目录,在会话启动时从运行器在启动时捕获的运行器主机配置快照中写入;请参阅 [Permissions and tool approval](#permissions-and-tool-approval)。此处的写入仅限于此会话。除非您使用 [`--remove-session-state`](https://code.claude.com/docs/zh-CN/self-hosted-environments-reference#runner-cli-flags) 启动运行器,否则会话结束后该目录仍会保留在 `<base-dir>/_sessions/` 下;请参阅 [Reuse a pre-warmed checkout](https://code.claude.com/docs/zh-CN/self-hosted-environments-deploy.md#reuse-a-pre-warmed-checkout)。 |

41| `CLAUDE_CODE_REMOTE_MCP_CONFIG` | 指向 `CLAUDE_CONFIG_DIR` 中某个文件的路径,该文件保存 Anthropic 控制平面为此会话交付的 MCP 服务器定义。如果您的包装脚本重建子进程的环境,请携带此变量。如果缺少此变量,当控制平面更新交付的服务器时,子进程会关闭您的包装脚本通过 [`--mcp-config`](https://code.claude.com/docs/zh-CN/cli-reference#cli-flags) 添加但不在更新中的任何 stdio、HTTP 或 SSE 服务器。需要 Claude Code v2.1.299 或更高版本。 |42| `CLAUDE_CODE_REMOTE_MCP_CONFIG` | 指向 `CLAUDE_CONFIG_DIR` 中某个文件的路径,该文件保存 Anthropic 控制平面为此会话交付的 MCP 服务器定义。如果您的包装脚本重建子进程的环境,请携带此变量。如果缺少此变量,当控制平面更新交付的服务器时,子进程会关闭您的包装脚本通过 [`--mcp-config`](https://code.claude.com/docs/zh-CN/cli-reference#cli-flags) 添加但不在更新中的任何 stdio、HTTP 或 SSE 服务器。需要 Claude Code v2.1.299 或更高版本。 |


44 45 

45包装脚本还继承子进程的其余托管环境,包括任何服务器提供的环境变量。`exec` 自动传播所有内容;如果您的包装脚本以其他方式生成子进程,请转发完整环境。46包装脚本还继承子进程的其余托管环境,包括任何服务器提供的环境变量。`exec` 自动传播所有内容;如果您的包装脚本以其他方式生成子进程,请转发完整环境。

46 47 

47`CLAUDE_CODE_REMOTE_SLACK_THREAD_URL` 和 `CLAUDE_CODE_REMOTE_SLACK_THREAD_TS` 会传递到您的包装脚本或 [`command` hook](#command)。它们也会传递到会话运行的内容,例如 shell 命令、git 钩子和 Claude Code hook。`checkout`、`post-session` 和 `spawn-runner` hook 不会接收它们。48您可以在包装脚本或 [`command` hook](#command) 中读取 `CLAUDE_CODE_REMOTE_SLACK_*` 变量,也可以在会话运行的内容中读取它们,例如 shell 命令、git 钩子和 Claude Code hook。`checkout`、`post-session` 和 `spawn-runner` hook 不会接收它们。

48 49 

49### 为可能未设置的变量提供默认值50### 为可能未设置的变量提供默认值

50 51 

51`CCR_SESSION_ACCOUNT_EMAIL`、`CLAUDE_RUNNER_CLIENT_PLATFORM`、`CLAUDE_CODE_REMOTE_SLACK_THREAD_URL` 和 `CLAUDE_CODE_REMOTE_SLACK_THREAD_TS` 都可能未设置。如果您的脚本使用 `set -u`,Bash 在展开其中未设置的变量时会以 `unbound variable` 停止,因此请使用默认值展开它们,例如 `"${CCR_SESSION_ACCOUNT_EMAIL:-}"`。52如果您的脚本使用 `set -u`,请使用默认值展开 `CCR_SESSION_ACCOUNT_EMAIL`、`CLAUDE_RUNNER_CLIENT_PLATFORM`、`CLAUDE_CODE_REMOTE_SLACK_THREAD_URL`、`CLAUDE_CODE_REMOTE_SLACK_THREAD_TS` 和 `CLAUDE_CODE_REMOTE_SLACK_CHANNEL_ID`,例如 `"${CCR_SESSION_ACCOUNT_EMAIL:-}"`。它们都可能未设置,而在 `set -u` 下,Bash 在展开未设置的变量时会以 `unbound variable` 停止。

52 53 

53### 为脚本展开的参数和变量加引号54### 为脚本展开的参数和变量加引号

54 55 


89* **透传它们**:使用 `exec "$CLAUDE_RUNNER_CLAUDE_BIN" "$@"` 结束包装脚本,这会将文件标志与其他所有参数一起转发。不要丢弃或改写它们。如果会话丢失了某个提示词文件标志,它将在没有控制平面为其发送的指令的情况下运行。90* **透传它们**:使用 `exec "$CLAUDE_RUNNER_CLAUDE_BIN" "$@"` 结束包装脚本,这会将文件标志与其他所有参数一起转发。不要丢弃或改写它们。如果会话丢失了某个提示词文件标志,它将在没有控制平面为其发送的指令的情况下运行。

90* **在 v2.1.281 或更高版本的运行器上,您追加的文件标志会替换服务器的标志,而不会叠加**:每个提示词文件标志只接受单个值,Claude Code 保留最后一次出现的值,因此如果您在 `"$@"` 之后追加 `--append-system-prompt-file <path>`,您文件的内容将替换服务器追加的指令。要在服务器指令之上添加指令,请将其放入运行器镜像的 `CLAUDE.md` 中,运行器会将其[植入每个会话的用户级配置](#how-each-session’s-config-is-assembled)。91* **在 v2.1.281 或更高版本的运行器上,您追加的文件标志会替换服务器的标志,而不会叠加**:每个提示词文件标志只接受单个值,Claude Code 保留最后一次出现的值,因此如果您在 `"$@"` 之后追加 `--append-system-prompt-file <path>`,您文件的内容将替换服务器追加的指令。要在服务器指令之上添加指令,请将其放入运行器镜像的 `CLAUDE.md` 中,运行器会将其[植入每个会话的用户级配置](#how-each-session’s-config-is-assembled)。

91 92 

93#### 修复会话启动时的 `Argument list too long`

94 

95在 Linux 上,如果您将控制平面的提示词和您自己的文本合并为一个 `--append-system-prompt` 参数,一旦该参数达到 128 KB,运行器就会记录如下一行日志:

96 

97```text theme={null}

98Session <id> finished: failed — reason: child exited 126: /opt/wrapper.sh: line 9: /usr/local/bin/claude: Argument list too long

99```

100 

101Linux 将每个单独的参数限制为 32 个内存页,在通常的 4 KB 页大小下即 128 KB。`getconf ARG_MAX` 给出的数值(通常为 2 MB)是另一项限制,针对的是所有参数和环境的总和。

102 

103在 Claude Code v2.1.283 或更高版本上,请将文件标志保留在 `"$@"` 中,并仅将您自己的文本作为 `--append-system-prompt` 传递。Claude Code 会[同时使用两者](https://code.claude.com/docs/zh-CN/cli-reference.md#system-prompt-flags),先是控制平面的提示词,然后是您自己的文本:

104 

105```bash theme={null}

106exec "$CLAUDE_RUNNER_CLAUDE_BIN" "$@" --append-system-prompt "$(cat /opt/team-instructions.md)"

107```

108 

109在 Linux 上,如果您自己的文本达到 128 KB,请将其移到运行器镜像的 `CLAUDE.md` 中,因为它仍然是一个参数。

110 

111在 v2.1.281 或 v2.1.282 上,该命令会以 `Cannot use both --append-system-prompt and --append-system-prompt-file` 退出。在更早的版本上,您的文本会替换控制平面的提示词,且不报错。无论哪种版本,请先更新,或将您自己的文本移到 `CLAUDE.md` 中。

112 

92### 配置作用域限定为会话创建者的凭据113### 配置作用域限定为会话创建者的凭据

93 114 

94使用 `decode-token` 子命令从会话 JWT 读取声明。它从参数、`CLAUDE_CODE_SESSION_ACCESS_TOKEN` 或 stdin 读取令牌,按该顺序;请参阅 [Verify the token inside the session](https://code.claude.com/docs/zh-CN/self-hosted-environments-identity.md#verify-the-token-inside-the-session) 了解它检查的内容。下面的示例解码创建者身份,将其交换为短期 AWS 凭据,并 exec 进入 Claude Code:115使用 `decode-token` 子命令从会话 JWT 读取声明。它从参数、`CLAUDE_CODE_SESSION_ACCESS_TOKEN` 或 stdin 读取令牌,按该顺序;请参阅 [Verify the token inside the session](https://code.claude.com/docs/zh-CN/self-hosted-environments-identity.md#verify-the-token-inside-the-session) 了解它检查的内容。下面的示例解码创建者身份,将其交换为短期 AWS 凭据,并 exec 进入 Claude Code:


122| 变量 | 描述 |143| 变量 | 描述 |

123| :- | :- |144| :- | :- |

124| `CLAUDE_RUNNER_REPO_URL` | 要克隆的存储库 URL,在应用任何 `--git-host-rewrite` 和 `--git-ssh-rewrite` 之后 |145| `CLAUDE_RUNNER_REPO_URL` | 要克隆的存储库 URL,在应用任何 `--git-host-rewrite` 和 `--git-ssh-rewrite` 之后 |

125| `CLAUDE_RUNNER_REPO_REF` | 要检出的修订版本,即会话所请求的形式:分支、标签、提交 SHA,或完整引用名称(例如 `refs/pull/<number>/head`)。为空表示仓库的默认分支。 |146| `CLAUDE_RUNNER_REPO_REF` | 要检出的修订版本,即会话所请求的形式:分支、标签、提交 SHA,或完整引用名称(例如 `refs/heads/<branch>` 或 `refs/pull/<number>/head`)。为空表示仓库的默认分支。 |

126| `CLAUDE_RUNNER_CHECKOUT_PATH` | 必须留下工作树的绝对路径 |147| `CLAUDE_RUNNER_CHECKOUT_PATH` | 必须留下工作树的绝对路径 |

127| `CLAUDE_RUNNER_SESSION_ID` | 会话 ID,采用标记的 `session_...` 形式,用于日志记录和关联 |148| `CLAUDE_RUNNER_SESSION_ID` | 会话 ID,采用标记的 `session_...` 形式,用于日志记录和关联 |

128| `CLAUDE_RUNNER_SESSION_UUID` | 相同的会话 ID,采用规范 UUID 形式 |149| `CLAUDE_RUNNER_SESSION_UUID` | 相同的会话 ID,采用规范 UUID 形式 |


303 324 

304无论您的 hook 在哪个平台上配置资源,约定都有四条规则:325无论您的 hook 在哪个平台上配置资源,约定都有四条规则:

305 326 

3061. **在 `CLAUDE_RUNNER_ORDER_ID` 上保持幂等。** 相同请求的重新交付必须最多生成一个运行器。从订单 ID 派生确定性资源名称,让您的平台拒绝重复。不要改为以 `CLAUDE_RUNNER_SESSION_ID` 作为键。会话的每次重新请求都携带相同的会话 ID 和新的订单 ID,因此按会话 ID 命名或去重的工作负载只会创建一次,之后该会话再也不会创建。3271. **在 `CLAUDE_RUNNER_ORDER_ID` 上保持幂等。** 相同请求的重新交付必须最多生成一个运行器。从订单 ID 派生确定性资源名称,让您的平台拒绝重复。不要改为以 `CLAUDE_RUNNER_SESSION_ID` 作为键。会话的每次重新请求都携带相同的会话 ID 和新的订单 ID。按会话 ID 命名或去重的工作负载,在第一个工作负载仍存在期间不会再次创建。

3072. **不要重试工作负载。** 一个订单 ID 意味着最多创建一个工作负载。如果运行器从不注册,Anthropic 在 `--expected-spawn-seconds` 后使用新订单 ID 重新请求。3282. **不要重试工作负载。** 一个订单 ID 意味着最多创建一个工作负载。如果运行器从不注册,Anthropic 在 `--expected-spawn-seconds` 后使用新订单 ID 重新请求。

3083. **使用退出码约定。** 以与结果相匹配的状态退出:3293. **使用退出码约定。** 以与结果相匹配的状态退出:

309 330 

310 * **退出 0**:已提交。331 * **退出 0**:已提交。

311 * **退出 1,或在 `--hook-timeout` 结束时仍在运行**:可重试失败。会话退避并被重新提供。332 * **退出 1,或在 `--hook-timeout` 结束时仍在运行**:可重试失败。会话退避并被重新提供。连续 10 次请求失败后,会话会像退出 2 或更高时一样被阻止。

312 * **退出 2 或更高**:不可重试失败。会话被阻止再次生成,直到用户向其发送新消息,或 [Owner](https://code.claude.com/docs/zh-CN/cloud-environments.md#organization-shared-environments) 在环境的 **Activity** 标签中对其选择 **Retry**。333 * **退出 2 或更高**:不可重试失败。会话被阻止再次生成,直到用户向其发送新消息,或 [Owner](https://code.claude.com/docs/zh-CN/cloud-environments.md#organization-shared-environments) 在环境的 **Activity** 标签中对其选择 **Retry**。

313 334 

314 会话退避期间,它在 **Activity** 标签中显示为 **Queued**,且没有生成错误,因此请在编排器的日志中查看 hook 的输出。会话被阻止后,会显示为 **Failed**。展开该会话即可查看生成错误,该错误取自 hook 的 stderr 的最后 512 个字符。请将可操作的错误写入 stderr,并且不要写入任何密钥。在 shell hook 中,请[保持暂时性失败可重试](#keep-transient-failures-retryable-in-a-shell-hook)。335 会话退避期间,它在 **Activity** 标签中显示为 **Queued**,且没有生成错误,因此请在编排器的日志中查看 hook 的输出。会话被阻止后,会显示为 **Failed**。展开该会话即可查看生成错误,该错误取自 hook 的 stderr 的最后 512 个字符。请将可操作的错误写入 stderr,并且不要写入任何密钥。在 shell hook 中,请[保持暂时性失败可重试](#keep-transient-failures-retryable-in-a-shell-hook)。


318 339 

319hook 写入 stdout 或 stderr 的所有内容都出现在编排器的日志中,凭据会自动脱敏。如果会话保持排队,检查编排器的 `/healthz` 正文以获取队列计数,然后在 [**Cloud environments** 管理页面](https://claude.ai/admin-settings/cloud-environments) 上打开您的环境的 **Activity** 标签:在那里展开失败的会话以获取其生成错误,并选择 **Retry** 以重新请求它。340hook 写入 stdout 或 stderr 的所有内容都出现在编排器的日志中,凭据会自动脱敏。如果会话保持排队,检查编排器的 `/healthz` 正文以获取队列计数,然后在 [**Cloud environments** 管理页面](https://claude.ai/admin-settings/cloud-environments) 上打开您的环境的 **Activity** 标签:在那里展开失败的会话以获取其生成错误,并选择 **Retry** 以重新请求它。

320 341 

321如果会话保持排队,且 **Activity** 标签中没有生成错误,可能意味着 hook 以会话 ID 作为键。要确认这一点,请检查您的平台是否存在该会话第一次生成请求对应的工作负载,而重新请求却没有对应的工作负载。如果是这样,请改为以 `CLAUDE_RUNNER_ORDER_ID` 作为工作负载的键。342#### 修复保持 Queued 或显示 Failed 的重新打开的会话

343 

344如果重新打开的会话保持 **Queued** 或显示 **Failed**,或者您的 hook 在处理这些会话时超时,原因之一可能是 hook 按会话 ID 命名或去重工作负载。当会话的运行器退出后,其用户又向该会话发送消息时,该会话即被重新打开。例如,假设某个 hook 按如下方式构建每个工作负载的名称:

345 

346```bash theme={null}

347name="runner-${CLAUDE_RUNNER_SESSION_ID}"

348```

349 

3501. 在会话的第一次生成请求时,hook 以该名称创建工作负载,并启动一个运行器

3512. 运行器退出(例如在 [`--release-idle-session-min`](#make-on-demand-runners-exit-when-idle) 之后),用户之后重新打开该会话

3523. 会话的下一次生成请求携带相同的会话 ID 和新的订单 ID,因此 hook 构建出相同的名称

3534. 如果您的平台仍保留着第一次请求的工作负载(因为在其运行器退出时没有任何机制[移除](#make-on-demand-runners-exit-when-idle)它),hook 不会创建新的工作负载,也不会启动运行器

3545. 该会话之后的每次生成请求都以同样的方式结束

355 

356打开您自己的 hook,查看它在工作负载已存在时(例如您的平台拒绝重复名称时)的行为。在第一列中找到该行为,即可了解重新打开的会话在 **Activity** 标签中显示什么:

357 

358| 当工作负载已存在时,您的 hook | **Queued** 变为 **Failed** | 生成错误 |

359| :- | :- | :- |

360| 以 0 退出且未创建任何内容 | 连续 10 次此类请求之后 | `runner did not register within ETA after max attempts` |

361| 以 1 退出 | 连续 10 次此类请求之后 | 您的 hook 的 stderr 末尾内容;如果它未向 stderr 写入任何内容,则为 `exit 1` |

362| 以 2 或更高退出 | 立即 | 您的 hook 的 stderr 末尾内容;如果它未向 stderr 写入任何内容,则为 `exit` 加上退出码,例如 `exit 2` |

363| 一直等待到 `--hook-timeout` 结束 | 连续 10 次此类请求之后 | 您的 hook 的 stderr 末尾内容;如果它未向 stderr 写入任何内容,则为 `spawn-runner hook timed out after 60000ms` |

364 

365在最后一行的生成错误中,`60000` 是以毫秒为单位的 `--hook-timeout`。当 hook 一直等待到 `--hook-timeout` 结束时,编排器的日志中还会出现一行 `timed out after`。

366 

367要修复 hook,请按照 [hook 约定的第 1 条规则](#the-spawn-runner-hook)的要求,以 `CLAUDE_RUNNER_ORDER_ID` 构建每个名称或键。在该示例中,名称变为:

368 

369```bash theme={null}

370name="runner-${CLAUDE_RUNNER_ORDER_ID}"

371```

372 

373如果您的 hook 会等待,还请让它在提交工作负载后立即退出,因为等待中的 hook 会[延迟其编排器的后续 hook](https://code.claude.com/docs/zh-CN/self-hosted-environments-reference.md#orchestrator-cli-flags)。修改 hook 后,请在 **Activity** 标签中检查每个卡住会话的状态:

374 

375* **Queued**:会话会自动获得下一次生成请求

376* **Failed**:以 Owner 身份对其选择 **Retry**,或让其用户向其发送新消息

322 377 

323#### 让按需运行器在空闲时退出378#### 让按需运行器在空闲时退出

324 379 


740 795 

741运行器对主机 `~/.claude/` 的快照不包含 `projects/` 目录。自动记忆的默认存储位置就在该目录下。如果您将记忆文件放在那里,运行器不会将它们填充到会话中,它们也不会启用自动记忆。796运行器对主机 `~/.claude/` 的快照不包含 `projects/` 目录。自动记忆的默认存储位置就在该目录下。如果您将记忆文件放在那里,运行器不会将它们填充到会话中,它们也不会启用自动记忆。

742 797 

798### 在获取服务器托管设置失败时阻止会话启动

799 

800要在获取[服务器托管设置](https://code.claude.com/docs/zh-CN/server-managed-settings.md)失败时阻止执行该获取的会话启动,请在运行器镜像中的 [`managed-settings.json`](https://code.claude.com/docs/zh-CN/settings#where-settings-live) 里将 [`forceRemoteSettingsRefresh`](https://code.claude.com/docs/zh-CN/settings-reference#forceremotesettingsrefresh) 设置为 `true`。如果 Anthropic 的 API 回复您的组织没有服务器托管设置,这也算作获取成功。

801 

802在添加该键之前,请检查该环境是否运行 Claude Tag 频道会话,或是否将模型请求发送到 Bedrock 或 Agent Platform:

803 

804* **Claude Tag 频道会话**:对于 Owner [将 Claude Tag 频道路由到](https://code.claude.com/docs/zh-CN/cloud-environments.md#set-the-environment-a-claude-tag-channel-uses)的环境中的运行器,请不要设置该键。Anthropic 的 API 会拒绝这些会话获取服务器托管设置的请求,因此设置该键后它们将无法启动。请将它们的规则放在运行器镜像的 `managed-settings.json` 中,[它们仍会读取该文件](https://code.claude.com/docs/zh-CN/managed-settings.md#where-and-when-a-policy-applies)。要为其他会话使用该键,请在单独的环境中运行这些会话。

805* **Bedrock 或 Agent Platform**:使用这些提供商的会话[不会获取服务器托管设置](#what-differs-from-sessions-on-the-anthropic-api),因此无论是否设置该键,它们都会启动。请改为通过同一个 `managed-settings.json` 强制执行您的规则。

806 

807以下 `managed-settings.json` 设置了该键:

808 

809```json managed-settings.json theme={null}

810{

811 "forceRemoteSettingsRefresh": true

812}

813```

814 

815即使您也在 claude.ai 管理控制台中设置了该键,也请在该文件中设置它。新会话没有您的服务器托管设置的[缓存副本](https://code.claude.com/docs/zh-CN/server-managed-settings.md#fetch-and-caching-behavior),因此如果您只在控制台中设置该键,会话尚不具备该设置。如果此时获取失败,会话将在没有这些设置的情况下运行,直到后续获取成功为止。

816 

817要确认会话未启动是因为设置获取失败,请查看会话中或运行器日志中 [Claude Code 的最后输出](#keep-stdin-and-file-descriptor-3-attached)。其中会包含 `Your organization requires remote managed settings to load, but they could not be loaded.`

818 

743### 包含多个仓库的会话中的仓库设置819### 包含多个仓库的会话中的仓库设置

744 820 

745在[项目](https://code.claude.com/docs/zh-CN/claude-projects.md#what-threads-pick-up-from-your-repositories)中的线程里,无论线程在何处启动,都没有任何仓库的 `.claude/settings.json` 作为项目设置生效,也没有任何仓库的 `.mcp.json` 或 skill 会被加载。要为这些线程提供 skill,请将其添加到您的运行器镜像中。821在[项目](https://code.claude.com/docs/zh-CN/claude-projects.md#what-threads-pick-up-from-your-repositories)中的线程里,无论线程在何处启动,都没有任何仓库的 `.claude/settings.json` 作为项目设置生效,也没有任何仓库的 `.mcp.json` 或 skill 会被加载。要为这些线程提供 skill,请将其添加到您的运行器镜像中。

Details

313 313 

314对于使用 Anthropic 管理的 git 的每个会话,运行器还记录一行 `[runner:warn]` 开始于 `governed git: GIT_SSL_CAINFO is set` 或 `governed git: GIT_SSL_NO_VERIFY is set`。该行说明运行器对其自己的 git、会话内的 git 和您的生命周期钩子对该变量所做的操作。它以您是否需要更改任何内容结束。314对于使用 Anthropic 管理的 git 的每个会话,运行器还记录一行 `[runner:warn]` 开始于 `governed git: GIT_SSL_CAINFO is set` 或 `governed git: GIT_SSL_NO_VERIFY is set`。该行说明运行器对其自己的 git、会话内的 git 和您的生命周期钩子对该变量所做的操作。它以您是否需要更改任何内容结束。

315 315 

316### 将 github.com 仓库添加到 Claude Tag 频道会话

317 

318如果 Claude 无法将 github.com 仓库添加到 Claude Tag 频道会话,请确保该频道有权访问该仓库,即使您的运行器可以克隆它也是如此。该访问权限来自 GitHub 上和您的 Claude 组织中的设置,而不是来自运行器的 git 凭据。

319 

320**1. 安装 Claude GitHub App**

321 

322在拥有该仓库的 GitHub 组织或账户上安装 [Claude GitHub App](https://github.com/apps/claude),并在安装中包含该仓库。

323 

324**2. 关联 GitHub 组织或账户**

325 

326在 [**Organization settings > Git providers**](https://claude.ai/admin-settings/source-control) 中,将该组织或账户关联到您的 Claude 组织。同时也是该 GitHub 组织所有者的 Claude 组织 Owner 可以关联它。请参阅[关联您的 GitHub 组织](https://claude.com/docs/claude-tag/admins/configure-github#link-your-github-organization)。

327 

328**3. 授予仓库访问权限**

329 

330在 [Claude Tag 管理设置](https://claude.ai/admin-settings/claude-tag)中,将该仓库授予该频道,或授予包含该频道的更大作用域:其 Slack 工作区或整个 Slack。拥有 Owner 角色或 Claude Tag Admin 权限的人员可以授予它。如果频道管理员的 GitHub 账户是该仓库的管理员,频道管理员也可以将其添加到自己的频道。请参阅[授予仓库访问权限](https://claude.com/docs/claude-tag/admins/configure-github#grant-repository-access)。

331 

332然后在该频道中开始一个新会话串,并在您的第一条消息中[指明该仓库](https://claude.com/docs/claude-tag/admins/configure-github#how-granted-repositories-reach-a-session)。

333 

334如果 Claude 仍然无法添加该仓库,请参阅[如果 Claude 无法访问仓库](https://claude.com/docs/claude-tag/admins/configure-github#if-claude-can%E2%80%99t-reach-a-repository),了解在何处检查 GitHub 关联和仓库授权。

335 

316### 为专用网络重写 git URL336### 为专用网络重写 git URL

317 337 

318仓库 URL 从控制平面作为 HTTPS 到达,带有您的 git 主机的主机名;对于 GitHub Enterprise,这是您在 claude.ai 上为 [GitHub Enterprise 集成](https://code.claude.com/docs/zh-CN/github-enterprise-server.md)配置的主机名。两个可重复的标志在克隆之前重写这些 URL:338仓库 URL 从控制平面作为 HTTPS 到达,带有您的 git 主机的主机名;对于 GitHub Enterprise,这是您在 claude.ai 上为 [GitHub Enterprise 集成](https://code.claude.com/docs/zh-CN/github-enterprise-server.md)配置的主机名。两个可重复的标志在克隆之前重写这些 URL:


376 396 

377构建和测试通常是会话负载中最大和最可变的部分,因此运行您的存储库的代表性构建,测量其峰值 CPU 和内存,并提高任何在该峰值之上没有为 Claude Code 进程留出空间的起始值。397构建和测试通常是会话负载中最大和最可变的部分,因此运行您的存储库的代表性构建,测量其峰值 CPU 和内存,并提高任何在该峰值之上没有为 Claude Code 进程留出空间的起始值。

378 398 

379运行器使用 `--capacity` 来限制它一次运行多少个会话。它不在它们之间分割 CPU 或内存,所以运行器上的会话共享容器的 CPU 和内存。要限制一个会话的份额,从您的[包装脚本](https://code.claude.com/docs/zh-CN/self-hosted-environments-configuration.md#wrapper-scripts)应用限制。因此,给一个容器什么取决于它一次服务多少个会话:399运行器使用 `--capacity` 来限制它一次运行多少个会话。它不在它们之间分割 CPU 或内存,所以运行器上的会话共享容器的 CPU 和内存。为防止一个会话的内存使用导致其他会话结束,请每个运行器运行一个会话,并为其设置[独立的内存限制](#give-each-session-its-own-memory-limit)。

380 400 

381* **每个运行器一个会话**:给每个容器一个会话的值。在 `--capacity 1` 使用此大小,[加固部分](#harden-your-deployment)推荐,以及对于[按需运行器](https://code.claude.com/docs/zh-CN/self-hosted-environments-configuration.md#on-demand-runners),您在您的 [`spawn-runner` 钩子](https://code.claude.com/docs/zh-CN/self-hosted-environments-configuration#the-spawn-runner-hook)提交的工作负载上设置值,例如 Kubernetes Job 的 pod 模板。401* **每个运行器一个会话**:给每个容器一个会话的值。在 `--capacity 1` 使用此大小,[加固部分](#harden-your-deployment)推荐,以及对于[按需运行器](https://code.claude.com/docs/zh-CN/self-hosted-environments-configuration.md#on-demand-runners),您在您的 [`spawn-runner` 钩子](https://code.claude.com/docs/zh-CN/self-hosted-environments-configuration#the-spawn-runner-hook)提交的工作负载上设置值,例如 Kubernetes Job 的 pod 模板。

382* **每个运行器多个会话**:在 `--capacity` 高于 1 时,将一个会话的值乘以容量,因为最多那么多会话可以在容器中同时运行。[Kubernetes](#kubernetes) 和 [Docker Compose](#docker-compose) 配方以 `--capacity 4` 运行,没有 CPU 或内存限制,因此添加为您运行的容量调整大小的限制。402* **每个运行器多个会话**:在 `--capacity` 高于 1 时,将一个会话的值乘以容量,因为最多那么多会话可以在容器中同时运行。[Kubernetes](#kubernetes) 和 [Docker Compose](#docker-compose) 配方以 `--capacity 4` 运行,没有 CPU 或内存限制,因此添加为您运行的容量调整大小的限制。

403* **一台主机上多个运行器容器**:按各运行器容量之和调整主机大小,因为每个运行器只将自己的会话计入 `--capacity`:

404 

405 * **内存**:将一个会话的内存乘以该总和,再加上主机自身进程使用的内存

406 * **CPU**:将一个会话的 CPU 请求乘以该总和。若要让所有会话同时突发,则改为乘以其 CPU 限制。

407 

408 为每个运行器提供独立的容器。在每个容器中使用[相同的 `--base-dir` 路径](#keep-the-base-directory-and-capacity-identical-across-runners),并将其放在没有其他运行器容器挂载的存储上,以便每个运行器拥有[自己的工作目录](#harden-your-deployment)。

409 

410### 为每个会话设置独立的内存限制

411 

412为防止内存耗尽时一个会话导致其他会话结束,请让每个运行器以 `--capacity 1` 运行,并置于其独立的内存限制之下,该限制设为一个会话的内存:

413 

414* **在容器中**:每个容器运行一个运行器,并设置容器的内存限制,例如 Kubernetes 上的 `limits.memory`、Docker 上的 `--memory` 或 Compose 文件中的 `mem_limit`。保持各容器限制之和低于主机内存,因为当主机本身内存耗尽时,内核可能会杀死主机上任何位置的进程。

415* **在不使用容器的 systemd 下**:在运行器的 unit 上设置 `MemoryMax`,并且每台主机运行一个运行器,因为在同一文件系统上[使用相同 `--base-dir`](#keep-the-base-directory-and-capacity-identical-across-runners) 的运行器会共享克隆在那里的仓库。例如,在 `--capacity 1` 且没有 `checkout` 钩子的情况下,它们在同一仓库上的会话可能同时在同一个检出中工作。若要在一台主机上运行多个运行器,请为每个运行器提供一个容器。

416 

417当容器或 unit 达到其内存限制时,内核只杀死其内部的进程。如果您将 `--capacity` 设置为大于 1,会话将共享同一个限制。当它们达到该限制时,内核不会按会话选择要杀死的进程,因此一个会话的内存使用可能导致其他会话结束。

418 

419在 Kubernetes 上,kubelet 的 `singleProcessOOMKill` 设置无论取哪个值都无法将会话隔离开。您也无法在[包装脚本](https://code.claude.com/docs/zh-CN/self-hosted-environments-configuration.md#wrapper-scripts)中使用内存 `ulimit` 来限制一个会话的总内存。内核会对每个进程单独应用诸如 `ulimit -v` 之类的值。

420 

421### 在进程和线程限制下留出余量

422 

423要确定进程和线程限制的大小,请测量一个会话所需的数量,并乘以共享该限制的会话数。当这些会话达到限制时,内核会拒绝创建新的进程和线程,因此其中任何会话中的命令、构建和测试都可能失败。被拒绝的调用返回 `EAGAIN`,其标准消息为 `Resource temporarily unavailable`。

424 

425假设一个会话的进程和线程峰值为 300 个,且有四个会话共享该限制。它们总共需要 1,200 个,若将限制设为 2,400,则可为需要两倍数量的构建留出余量。

426 

427#### 各限制的设置位置

428 

429此表中的每个限制都同时计算线程和进程,`pids.max` 是保存 cgroup 限制的文件:

430 

431| 限制 | 设置位置 | 共享范围 |

432| :- | :- | :- |

433| Kubernetes 上的 `pids.max` | 运行运行器的节点的 kubelet 配置中的 `podPidsLimit`。无法在 Pod spec 中设置。 | 一个 Pod 的所有容器 |

434| Docker 上的 `pids.max` | `--pids-limit`,或 Compose 文件中的 `pids_limit` | 一个容器 |

435| systemd 下的 `pids.max` | 运行器 unit 上的 `TasksMax` | 一个 unit |

436| `ulimit -u` | 启动运行器的 shell 或服务 | 主机上以运行器用户 ID 运行的所有内容。对 root 不强制执行。 |

437 

438当您未设置 `TasksMax` 时,systemd 会应用 `DefaultTasksMax`,其默认值为 `kernel.pid_max`、`kernel.threads-max` 和根 cgroup 的 `pids.max` 中最小值的 15%。

439 

440#### 测量一个会话的峰值

441 

442要获取您自己运行器的数值,请在其主机上测量一个会话,在 Kubernetes 上主机即为节点:

443 

444**1. 单独启动一个运行器**

445 

446以 `--capacity 1` 启动一个运行器,其容器或 systemd unit 中没有其他任何内容,并且在其主机和环境中都是唯一的:

447 

448* **其主机**:使用不运行其他运行器的主机。这样您可以在下一步中找出它的进程。

449* **其环境**:使其成为该环境中唯一的运行器,例如在您[为测试创建](https://code.claude.com/docs/zh-CN/self-hosted-environments-quickstart.md#set-up-manually)的环境中。会话是路由到环境而不是路由到运行器的。

450 

451暂时不要启动会话,因为在构建开始之前您需要下一步中的目录。

452 

453**2. 找到运行器的 cgroup 目录**

454 

455在主机上(而不是在容器内)找到运行器的进程 ID,例如使用 `ps`。读取该 ID 对应的 `/proc/<pid>/cgroup`:

456 

457* **某行包含 `:pids:`**:主机使用 cgroup v1,目录为 `/sys/fs/cgroup/pids` 后接 `:pids:` 之后的文本

458* **唯一的一行以 `0::` 开头**:主机使用 cgroup v2,目录为 `/sys/fs/cgroup` 后接 `0::` 之后的文本

459 

460**3. 运行代表性构建并记录峰值**

461 

462让一个会话运行一次代表性构建,并从运行器的 cgroup 目录中获取峰值:

463 

464* **目录中有 `pids.peak`**:在构建完成后读取该文件

465* **目录中没有 `pids.peak`**:在构建运行期间每秒读取一次 `pids.current`,并保留最高值。两次读取之间出现的峰值无法被观测到,因此请将该值视为偏低的估计。

466 

467**4. 乘以共享该限制的会话数**

468 

469* **一个运行器的 Pod、容器或 unit**:将峰值乘以运行器的 `--capacity`

470* **多个运行器共享的限制**:将峰值乘以它们容量之和

471 

472然后加上共享该限制的其他任何内容的峰值,例如 Pod 中的另一个容器。

473 

474**5. 将限制设置为高于结果**

475 

476限制越高,为更重的构建留出的余量越多;限制越低,越能更早地阻止 fork 炸弹。

477 

478#### 检查 `pids.max` 限制

479 

480* **检查是否达到了 `pids.max`**:在主机的内核日志中(例如使用 `dmesg`)搜索包含 `cgroup: fork rejected by pids controller in` 和某个 cgroup 路径的行。内核仅在第一次拒绝该 cgroup 中的进程或线程时记录此日志,因此请搜索整个日志。

481* **查看生效的限制**:读取运行器 cgroup 目录及其上每一级目录中的 `pids.max`。最小值即为生效的限制,`max` 表示该级别没有限制。

383 482 

384## Kubernetes483## Kubernetes

385 484 


577 676 

578重用路径的保证和不保证的内容:677重用路径的保证和不保证的内容:

579 678 

580* **任何克隆形状都可以工作**:路径处的完整、浅层或单分支克隆按原样使用。运行器在获取到现有克隆时永远不会传递 `--depth`,因此完整的预热保持其完整历史,浅层克隆保持浅层。`CLAUDE_RUNNER_FETCH_DEPTH`(`full`、`0` 或一个数字;默认 50)仅控制当尚不存在克隆时运行器进行的冷克隆。679* **克隆深度**:构建克隆时不要使用 `--depth`,是否使用 `--single-branch` 均可。当运行器获取到带有 `origin` 远程的克隆中时,永远不会传递 `--depth`,即使您设置了 [`CLAUDE_RUNNER_FETCH_DEPTH`](https://code.claude.com/docs/zh-CN/self-hosted-environments-reference#environment-variable-only-settings) 也是如此。使用完整克隆时,每个会话只下载克隆所缺少的提交。使用浅层克隆时,如果会话所在的分支是在克隆最旧的提交之前分叉的,该会话会下载该分支的完整历史。

581* **跟踪的更改重置,未跟踪的文件保留**:在 `--capacity 1` 时,每个会话从硬重置开始,该重置会清除前一个会话的跟踪修改,但运行器永远不会运行 `git clean`,因此来自锁定所有者早期会话的未跟踪文件保留在树中。680* **跟踪的更改重置,未跟踪的文件保留**:在 `--capacity 1` 时,每个会话从硬重置开始,该重置会清除前一个会话的跟踪修改,但运行器永远不会运行 `git clean`,因此来自锁定所有者早期会话的未跟踪文件保留在树中。

582* **按会话目录也会保留**:在检出旁边,运行器在 `<base-dir>/_sessions/` 下为其运行的每个会话创建按会话条目。会话的 Claude 配置目录保存对话记录的本地副本。在其旁边是会话的上传文件,当会话有任何文件时。会话目录也在那里:它保存会话运行时的任何按会话工作树和 `checkout` hook 检出,以及 Claude 在其中写入的任何其他内容。681* **按会话目录也会保留**:在检出旁边,运行器在 `<base-dir>/_sessions/` 下为其运行的每个会话创建按会话条目。会话的 Claude 配置目录保存对话记录的本地副本。在其旁边是会话的上传文件,当会话有任何文件时。会话目录也在那里:它保存会话运行时的任何按会话工作树和 `checkout` hook 检出,以及 Claude 在其中写入的任何其他内容。

583 682 


587* **使用 git 代理时,`reftable` 预热会丢失其引用**:当运行器在每个会话前清理 `.git/` 时,它会保留 `.git/refs/` 并删除 `.git/reftable/` 目录。以 git 的 `reftable` 引用格式预热的克隆会因此丢失其引用,因此请改为以 git 的 `files` 引用格式预热克隆。686* **使用 git 代理时,`reftable` 预热会丢失其引用**:当运行器在每个会话前清理 `.git/` 时,它会保留 `.git/refs/` 并删除 `.git/reftable/` 目录。以 git 的 `reftable` 引用格式预热的克隆会因此丢失其引用,因此请改为以 git 的 `files` 引用格式预热克隆。

588* **长克隆不需要解决方法**:运行器使用 120 秒无进度监视器和 30 分钟硬上限来限制每个 git 操作,而不是平面超时,因此保持报告进度的缓慢冷克隆会完成。687* **长克隆不需要解决方法**:运行器使用 120 秒无进度监视器和 30 分钟硬上限来限制每个 git 操作,而不是平面超时,因此保持报告进度的缓慢冷克隆会完成。

589 688 

689### 确认运行器使用您的克隆

690 

691要确认运行器使用您的克隆,请使用 [`--log-level debug`](https://code.claude.com/docs/zh-CN/self-hosted-environments-reference#runner-cli-flags) 启动运行器,并在该仓库上启动一个会话。运行器会记录 `Prefetched repo found at` 以及克隆的路径。如果它记录的是 `No prefetched repo, fresh init at`,则说明它在该行中的路径处未找到可用的克隆。请检查您的克隆是否位于该路径、是否归运行器的用户所有,以及是否具有名为 `origin` 的远程。

692 

693如果运行器找到了您的克隆,但会话启动仍然缓慢,请检查该克隆是否为浅层克隆。

694 

590## 固定版本695## 固定版本

591 696 

592默认情况下,每个会话的子进程运行运行器自己的二进制文件,并且运行器会在它生成的会话内关闭自动更新。在此默认设置下,每个会话都运行您在主机上安装或构建到镜像中的版本。主机级更新在运行器下次启动时生效。697默认情况下,每个会话的子进程运行运行器自己的二进制文件,并且运行器会在它生成的会话内关闭自动更新。在此默认设置下,每个会话都运行您在主机上安装或构建到镜像中的版本。主机级更新在运行器下次启动时生效。


609* **固定队列**:运行静态运行器副本集并在每个运行器提供的 [Prometheus 指标](https://code.claude.com/docs/zh-CN/self-hosted-environments-reference.md#prometheus-metrics)上扩展714* **固定队列**:运行静态运行器副本集并在每个运行器提供的 [Prometheus 指标](https://code.claude.com/docs/zh-CN/self-hosted-environments-reference.md#prometheus-metrics)上扩展

610* **按需运行器**:运行 `claude self-hosted-runner orchestrator` 子命令,它轮询 Anthropic 以查找没有可用运行器排队的会话,并调用您的 `spawn-runner` 钩子为每个会话启动一个。请参阅[按需运行器](https://code.claude.com/docs/zh-CN/self-hosted-environments-configuration.md#on-demand-runners)。715* **按需运行器**:运行 `claude self-hosted-runner orchestrator` 子命令,它轮询 Anthropic 以查找没有可用运行器排队的会话,并调用您的 `spawn-runner` 钩子为每个会话启动一个。请参阅[按需运行器](https://code.claude.com/docs/zh-CN/self-hosted-environments-configuration.md#on-demand-runners)。

611 716 

717### 在固定队列上释放空闲会话

718 

719如果在每个运行器都在线的情况下,固定队列上的会话仍然处于排队状态,原因可能是空闲会话。默认情况下,会话在其轮次结束后仍会保留其槽位,其运行器也会保持锁定到该会话的[所有者](https://code.claude.com/docs/zh-CN/self-hosted-environments#key-concepts)。如果您团队的[云端定时任务](https://code.claude.com/docs/zh-CN/routines.md)每次运行都会启动一个新会话,其空闲会话可能会占满所有槽位。

720 

721要进行检查,请读取每个运行器 [Prometheus 指标](https://code.claude.com/docs/zh-CN/self-hosted-environments-reference.md#prometheus-metrics)中的 `claude_code_self_hosted_runner_session_idle_seconds`。运行器持有的每个会话都有自己的序列:会话繁忙时为 `0`,否则为自其进入空闲以来的秒数。选择您允许的空闲时间:要长于人们在任务中途的停顿时间,并且足够短,使每次运行都能在定时任务的下一次运行开始之前被释放。将序列与该时间进行比较。

722 

723* **序列高于该时间,例如 30 分钟对应 `1800`**:空闲会话占用了这些槽位,因此请设置 `--release-idle-session-min`

724* **所有序列都低于该时间**:没有会话空闲那么久。请添加运行器,或针对[从不进入空闲的会话](#some-sessions-don’t-count-as-idle)设置 [`--kill-session-after-min`](https://code.claude.com/docs/zh-CN/self-hosted-environments-reference#runner-cli-flags)。

725* **没有序列的运行器**:没有会话持有它。请参阅[故障排除](#troubleshooting)下的**会话保持排队**。

726* **指标无响应的运行器**:其进程可能已退出。请参阅[运行器退出时](#when-the-runner-exits)下的**看起来健康的环境**。

727 

728要释放空闲会话,请使用 [`--release-idle-session-min`](https://code.claude.com/docs/zh-CN/self-hosted-environments-reference#runner-cli-flags) 及以分钟为单位的该时间启动每个运行器,例如 `--release-idle-session-min 30`。之后,运行器会释放任何空闲达到该时长的会话,无论该会话是由定时任务还是由人启动的。

729 

730* **未推送的工作**:被释放的会话会在收到下一条消息时恢复,但不包含其尚未推送的工作。要保留其提交,请参阅[恢复的会话会丢失未推送的工作](#additional-limitations)。

731* **运行器退出**:释放其最后一个会话的运行器会开始[正常退出](#when-the-runner-exits)。请让您的监管程序在全新的文件系统上重新启动它,如[加固您的部署](#harden-your-deployment)所述。

732* **从不进入空闲的会话**:还需设置 [`--kill-session-after-min`](https://code.claude.com/docs/zh-CN/self-hosted-environments-reference#runner-cli-flags),因为[某些会话不计为空闲](#some-sessions-don’t-count-as-idle)

733 

612## 已知问题和限制734## 已知问题和限制

613 735 

614以下是此版本中的限制,其中存在解决方法。736以下是此版本中的限制,其中存在解决方法。


642### 其他限制764### 其他限制

643 765 

644* **恢复的会话丢失未推送的工作**:新的运行器会从其起始分支重新克隆仓库,因此会话未推送的工作会丢失。766* **恢复的会话丢失未推送的工作**:新的运行器会从其起始分支重新克隆仓库,因此会话未推送的工作会丢失。

645 * **要保留已提交的工作**:在环境中的每个运行器上设置 [`--push-outcome-on-release`](https://code.claude.com/docs/zh-CN/self-hosted-environments-reference#runner-cli-flags),因为未设置该标志的运行器会从起始分支恢复会话。设置了该标志的运行器会在释放之前尽力推送会话的结果分支,恢复的会话将从这些提交开始。推送使用运行器主机自身的 git 凭据,在使用 [Anthropic 托管 git](#use-the-anthropic-git-proxy) 的运行器上也是如此。未提交的更改仍会丢失。767 * **要保留已提交的工作**:在环境中的每个运行器上设置 [`--push-outcome-on-release`](https://code.claude.com/docs/zh-CN/self-hosted-environments-reference#runner-cli-flags),因为未设置该标志的运行器会从起始分支恢复会话。设置了该标志的运行器会在释放之前尽力推送会话的结果分支,恢复的会话将从这些提交开始。推送使用运行器主机自身的 git 凭据,在使用 [Anthropic 托管 git](#use-the-anthropic-git-proxy) 的运行器上也是如此。

646 * **使用 `checkout` hook 时**:通过 [`checkout` 生命周期 hook](https://code.claude.com/docs/zh-CN/self-hosted-environments-configuration#checkout) 检出的仓库不会被推送。请改为从 [`post-session` hook](https://code.claude.com/docs/zh-CN/self-hosted-environments-configuration#post-session) 对其进行快照。768 * **使用 `checkout` hook 时**:通过 [`checkout` 生命周期 hook](https://code.claude.com/docs/zh-CN/self-hosted-environments-configuration#checkout) 检出的仓库不会被推送。请改为从 [`post-session` hook](https://code.claude.com/docs/zh-CN/self-hosted-environments-configuration#post-session) 对其进行快照。

647 * **启用该标志之前**:限制谁可以推送到源远程上的 `claude/*` refs。在恢复时,运行器会获取之前推送的分支,而不验证是谁推送的。769 * **启用该标志之前**:限制谁可以推送到源远程上的 `claude/*` refs。在恢复时,运行器会获取之前推送的分支,而不验证是谁推送的。

770 * **未提交的更改仍会丢失**:要提示 Claude 在完成响应时提交并推送,请参阅[提示会话推送其工作](https://code.claude.com/docs/zh-CN/self-hosted-environments-configuration.md#prompt-sessions-to-push-their-work)

648* **会话中途添加的仓库可能无法克隆**:Claude 通过 HTTPS 使用 `git clone` 克隆它。在未启用 [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy) 的运行器上,如果主机上没有任何内容能够读取该仓库,克隆会因 git 身份验证错误而失败。如有可能,请在创建会话时选择会话所需的每个仓库。771* **会话中途添加的仓库可能无法克隆**:Claude 通过 HTTPS 使用 `git clone` 克隆它。在未启用 [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy) 的运行器上,如果主机上没有任何内容能够读取该仓库,克隆会因 git 身份验证错误而失败。如有可能,请在创建会话时选择会话所需的每个仓库。

649* **某些连接器不出现在自托管会话中**:您在 claude.ai Settings 中尚未连接的连接器不在自托管会话中列出,会话不会提示您连接它。首先在 Settings 中连接它,然后启动新会话。向已运行的会话添加连接器也不会使其工具对 Claude 可用;启动新会话以获取新添加的连接器。772* **某些连接器不出现在自托管会话中**:您在 claude.ai Settings 中尚未连接的连接器不在自托管会话中列出,会话不会提示您连接它。首先在 Settings 中连接它,然后启动新会话。向已运行的会话添加连接器也不会使其工具对 Claude 可用;启动新会话以获取新添加的连接器。

650* **当有人归档或删除会话,或从会话菜单中释放其运行器时**:不要依赖 [`--push-outcome-on-release`](https://code.claude.com/docs/zh-CN/self-hosted-environments-reference#runner-cli-flags) 的推送。要在这些情况下保存提交,请从 [`post-session` hook](https://code.claude.com/docs/zh-CN/self-hosted-environments-configuration#post-session) 将 `HEAD` 推送到一个救援分支。如果您以那里的示例为基础,请让它在没有任何未提交内容时也执行推送,因为该示例仅在创建快照提交之后才推送。773* **当有人归档或删除会话,或从会话菜单中释放其运行器时**:不要依赖 [`--push-outcome-on-release`](https://code.claude.com/docs/zh-CN/self-hosted-environments-reference#runner-cli-flags) 的推送。要在这些情况下保存提交,请从 [`post-session` hook](https://code.claude.com/docs/zh-CN/self-hosted-environments-configuration#post-session) 将 `HEAD` 推送到一个救援分支。如果您以那里的示例为基础,请让它在没有任何未提交内容时也执行推送,因为该示例仅在创建快照提交之后才推送。


684* **会话在拾取后立即失败**:在 claude.ai/code 中打开会话以查看错误。如果错误显示 git 无法进行身份验证,请检查运行器的 [git 凭据](#configure-git)。对于使用 `--use-anthropic-git-proxy` 启动的运行器,请参阅 [当会话在使用 git 代理的运行器上无法启动时](#when-anthropic-doesnt-serve-a-session)。807* **会话在拾取后立即失败**:在 claude.ai/code 中打开会话以查看错误。如果错误显示 git 无法进行身份验证,请检查运行器的 [git 凭据](#configure-git)。对于使用 `--use-anthropic-git-proxy` 启动的运行器,请参阅 [当会话在使用 git 代理的运行器上无法启动时](#when-anthropic-doesnt-serve-a-session)。

685 808 

686 不可写的基础目录会在启动时停止运行器,而不是使会话失败。请参阅此列表中的 **运行器在启动时退出,显示 `cannot create or write to base directory`** 条目。809 不可写的基础目录会在启动时停止运行器,而不是使会话失败。请参阅此列表中的 **运行器在启动时退出,显示 `cannot create or write to base directory`** 条目。

810* **会话已被拾取,但 Claude 从未回答其第一条消息**:如果您的运行器通过代理访问 `api.anthropic.com`,请将代理配置为在会话的 `/worker/events/stream` 响应到达时立即将其传递出去。提高运行器的超时时间没有帮助。要在运行器的日志中确认原因,请参阅 [会话已被拾取,但 Claude 从未回答其第一条消息](#when-a-sessions-first-message-is-never-answered)。

687* **在设置了 `--use-anthropic-git-proxy` 的运行器上会话无法启动**:在运行器的日志中查找 `access denied by the git proxy`,或查找指明包含 `/git_proxy/` 的 `api.anthropic.com` 地址的 git 错误。要判断 Anthropic 是否提供了该会话并修复原因,请参阅 [当会话在使用 git 代理的运行器上无法启动时](#when-anthropic-doesnt-serve-a-session)。811* **在设置了 `--use-anthropic-git-proxy` 的运行器上会话无法启动**:在运行器的日志中查找 `access denied by the git proxy`,或查找指明包含 `/git_proxy/` 的 `api.anthropic.com` 地址的 git 错误。要判断 Anthropic 是否提供了该会话并修复原因,请参阅 [当会话在使用 git 代理的运行器上无法启动时](#when-anthropic-doesnt-serve-a-session)。

688* **会话无法通过身份验证出口代理到达网络**:当您使用 [`--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`,则它无法打开其环回监听器。812* **会话无法通过身份验证出口代理到达网络**:当您使用 [`--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`,则它无法打开其环回监听器。

689* **运行器记录包含 `rejecting the malformed poll response` 的 `Poll failed` 行**:运行器收到的工作轮询响应的正文不是队列的预期 JSON。原因之一是拦截代理或强制门户用自己的页面进行了应答。如果运行器通过代理连接,请配置代理以将来自 `api.anthropic.com` 的响应原封不动地传递。813* **运行器记录包含 `rejecting the malformed poll response` 的 `Poll failed` 行**:运行器收到的工作轮询响应的正文不是队列的预期 JSON。原因之一是拦截代理或强制门户用自己的页面进行了应答。如果运行器通过代理连接,请配置代理以将来自 `api.anthropic.com` 的响应原封不动地传递。


708* **会话启动失败,显示 `This runner couldn't read`**:运行器使用其 [git 凭据](#configure-git) 向 git 主机请求某个仓库,但得到了未找到的答复。该仓库不存在,或者这些凭据无法访问该仓库。832* **会话启动失败,显示 `This runner couldn't read`**:运行器使用其 [git 凭据](#configure-git) 向 git 主机请求某个仓库,但得到了未找到的答复。该仓库不存在,或者这些凭据无法访问该仓库。

709 * **如果您管理该运行器**:为其 git 凭据授予该仓库的读取权限,然后启动新会话。833 * **如果您管理该运行器**:为其 git 凭据授予该仓库的读取权限,然后启动新会话。

710 * **如果您启动了该会话**:如果该仓库不存在,请使用正确的仓库启动新会话。如果运行器无法访问该仓库,请让运行器的管理员授予访问权限,然后启动新会话。834 * **如果您启动了该会话**:如果该仓库不存在,请使用正确的仓库启动新会话。如果运行器无法访问该仓库,请让运行器的管理员授予访问权限,然后启动新会话。

711* **会话需要数分钟才能启动**:初始克隆通常占主导地位。观察 `claude_code_self_hosted_runner_session_init_duration_seconds` [指标](https://code.claude.com/docs/zh-CN/self-hosted-environments-reference.md#prometheus-metrics) 以确认,并使用 [预热检出](#reuse-a-pre-warmed-checkout) 或更小的 `CLAUDE_RUNNER_FETCH_DEPTH` 减少克隆。835* **会话需要数分钟才能启动或恢复**:原因之一是全新克隆。在每个运行器都从空磁盘启动、且没有 [`checkout` hook](https://code.claude.com/docs/zh-CN/self-hosted-environments-configuration#checkout) 的机群上,运行器会在启动 Claude Code 之前重新克隆会话的仓库。在空磁盘上恢复的会话会再次等待同样的克隆。

836 

837 要跳过全新克隆,请提供 [预热检出](#reuse-a-pre-warmed-checkout)。如果您已经提供了预热检出,请 [确认运行器使用了它](#confirm-that-the-runner-uses-your-clone)。如果运行器自行进行克隆并在一个会话后退出,请将 [`CLAUDE_RUNNER_FETCH_DEPTH`](https://code.claude.com/docs/zh-CN/self-hosted-environments-reference#environment-variable-only-settings) 从默认的 50 个提交调低,以获取更少的历史记录。

838 

839 如果您使用 hook,它会代替运行器的克隆运行,因此请改为检查您的 hook 执行的操作。观察 `claude_code_self_hosted_runner_session_init_duration_seconds` [指标](https://code.claude.com/docs/zh-CN/self-hosted-environments-reference.md#prometheus-metrics) 以了解启动需要多长时间。

712* **轮次以 401 失败**:当轮次以来自 Anthropic API 的 401 或 403 结束时,运行器从 Anthropic 获取新的 [`CLAUDE_CODE_OAUTH_TOKEN`](https://code.claude.com/docs/zh-CN/self-hosted-environments-configuration#wrapper-scripts) 并将其传递给会话。失败的轮次不会重试。此令牌是短期的,运行器通过会话的 stdin 轮换它。840* **轮次以 401 失败**:当轮次以来自 Anthropic API 的 401 或 403 结束时,运行器从 Anthropic 获取新的 [`CLAUDE_CODE_OAUTH_TOKEN`](https://code.claude.com/docs/zh-CN/self-hosted-environments-configuration#wrapper-scripts) 并将其传递给会话。失败的轮次不会重试。此令牌是短期的,运行器通过会话的 stdin 轮换它。

713 841 

714 当获取失败时,运行器记录一条 `inference_token refresh failed` 行,说明何时重试,并在会话运行期间继续重试。842 当获取失败时,运行器记录一条 `inference_token refresh failed` 行,说明何时重试,并在会话运行期间继续重试。


788 916 

789如需在运行器主机上进行引导式诊断,请运行 [doctor 子命令](#troubleshooting)。917如需在运行器主机上进行引导式诊断,请运行 [doctor 子命令](#troubleshooting)。

790 918 

919### 会话已被拾取,但 Claude 从未回答其第一条消息

920 

921如果运行器拾取了会话,但 Claude 从未回答第一条消息,并且您的运行器通过代理访问 `api.anthropic.com`,则原因可能是该代理。Anthropic 通过一个保持打开的流式响应向会话发送其消息。如果您的代理缓冲该响应,或在传递任何内容之前就将其结束,第一条消息就永远不会到达。来自该会话的其他请求仍会成功。

922 

923要修复此问题,请更改代理处理此请求的方式:

924 

925```text theme={null}

926GET https://api.anthropic.com/v1/code/sessions/<session-id>/worker/events/stream

927```

928 

929* **不要缓冲该响应**:在响应到达时立即将其传递出去。其内容类型为 `text/event-stream`。

930* **让该响应保持打开**:它最长可以保持打开一小时。如果代理有空闲超时,请将其设置为远高于 15 秒,因为默认情况下 Anthropic 至少每隔这么长时间发送一次保活消息。

931 

932然后启动一个新会话,并检查 Claude 是否回答。提高运行器的超时时间没有帮助:您只会在运行器停止会话之前等待更长时间。

933 

934#### 在运行器的日志中确认原因

935 

936这些步骤适用于 Claude Code v2.1.287 或更高版本、使用默认 `--log-level info` 的运行器。较旧的运行器会更晚记录这些行,或者根本不记录。

937 

9381. 等待 [`--startup-timeout-min`](https://code.claude.com/docs/zh-CN/self-hosted-environments-reference#runner-cli-flags) 过去,默认为 15 分钟。之后运行器会停止该会话,并记录一行包含 `no child output for` 且以 `— releasing` 结尾的内容。

9392. 在运行器的日志中搜索 `SDKStartup: SSE`。这些行位于一条 `finished: interrupted` 行之后,在第 1 步中那一行之后的几行。大多数这样的行没有时间戳,因此日志收集器可能会将它们显示在其他位置。

9403. 在下表中找到该行:

941 

942| 日志行包含 | 应采取的操作 |

943| :- | :- |

944| `SSE connect failed (no response in 30s)` 或 `SSE liveness timeout` | 检查代理是否转发该请求、是否在响应的标头和数据到达时立即将其传递,以及是否没有断开连接 |

945| `SSE connect failed (HTTP` 和一个状态码 | 检查代理自身的日志。如果是代理自己应答了该请求,请让该请求通过代理。 |

946| `SSE connect failed (` 和任何其他文本 | 括号中的文本就是错误。在代理自身的日志中查找同一个连接。 |

947| `SSE stream ended by server`,反复出现 | 检查代理对长时间存在的响应的时间限制。单独一条这样的行是正常的。 |

948| `SSE reconnected after` | 在其后查找其他行之一。这一行并不表示有任何内容到达了会话。 |

949 

950如果日志中没有这些行,或者代理的日志显示没有任何问题,请[报告问题](#report-an-issue)。

951 

952#### 阻止会话再次尝试

953 

954会话会将该消息保持为待处理状态,能够为该会话的所有者提供服务的运行器会再次拾取该会话。在您更改代理之前,该会话每次都会以相同的方式等待。要阻止这种情况,请在 claude.ai/code 中归档该会话。

955 

791## 接下来956## 接下来

792 957 

793* [自定义会话](https://code.claude.com/docs/zh-CN/self-hosted-environments-configuration.md):包装脚本、生命周期钩子、按需运行器、MCP 服务器和权限958* [自定义会话](https://code.claude.com/docs/zh-CN/self-hosted-environments-configuration.md):包装脚本、生命周期钩子、按需运行器、MCP 服务器和权限

Details

121* **会话因 git 错误而无法启动**:如果错误包含 git 的 `could not read Username for`,后跟您的 git 主机的 URL,则说明运行器没有该主机的 HTTPS 凭据。121* **会话因 git 错误而无法启动**:如果错误包含 git 的 `could not read Username for`,后跟您的 git 主机的 URL,则说明运行器没有该主机的 HTTPS 凭据。

122 * **提供 HTTPS 凭据**:请参阅[配置 git](https://code.claude.com/docs/zh-CN/self-hosted-environments-deploy.md#configure-git)122 * **提供 HTTPS 凭据**:请参阅[配置 git](https://code.claude.com/docs/zh-CN/self-hosted-environments-deploy.md#configure-git)

123 * **改为通过 SSH 克隆**:如果运行器主机已有 SSH 密钥,请参阅[为私有网络重写 git URL](https://code.claude.com/docs/zh-CN/self-hosted-environments-deploy.md#rewrite-git-urls-for-private-networks)123 * **改为通过 SSH 克隆**:如果运行器主机已有 SSH 密钥,请参阅[为私有网络重写 git URL](https://code.claude.com/docs/zh-CN/self-hosted-environments-deploy.md#rewrite-git-urls-for-private-networks)

124 * **完成任一修复后**:再次启动运行器并观察失败的会话,而不是启动新会话。如果该会话已失败多次,请等待几分钟,直到运行器记录 `Picked up session`。

125 * **改为使用其他仓库**:[归档](https://code.claude.com/docs/zh-CN/claude-code-on-the-web.md#archive-sessions)或[删除](https://code.claude.com/docs/zh-CN/claude-code-on-the-web.md#delete-sessions)失败的会话,然后再次启动运行器并启动新会话。否则,运行器可能会拾取失败的会话而不是新会话。

124 126 

125### 如果运行器退出127### 如果运行器退出

126 128 

Details

83 83 

84| 标志 | 默认值 | 描述 |84| 标志 | 默认值 | 描述 |

85| :- | :- | :- |85| :- | :- | :- |

86| `--hook-concurrency <n>` | `4` | 最大 `spawn-runner` 钩子并行运行。还限制每次轮询声称的生成请求数。 |86| `--hook-concurrency <n>` | `4` | 并行运行的 `spawn-runner` hook 的最大数量。同时限制每次轮询认领的生成请求数。编排器仅在其启动的每个 hook 都完成后才会检查新的生成请求,因此一个缓慢的 hook 会延迟该编排器的后续 hook。 |

87| `--hook-timeout <sec>` | `60` | 在这么多秒后终止钩子的进程树。超时加其 5 秒杀死宽限期必须保持在 `--expected-spawn-seconds` 以下;编排器在启动时强制执行此操作。 |87| `--hook-timeout <sec>` | `60` | 在这么多秒后终止钩子的进程树。超时加其 5 秒杀死宽限期必须保持在 `--expected-spawn-seconds` 以下;编排器在启动时强制执行此操作。 |

88| `--expected-spawn-seconds <sec>` | `120` | 从编排器收到生成请求到运行器注册的预期 p99 时间,包括在您的平台上等待容量的任何时间。服务器强制的范围为 10 到 3600。在每次轮询时作为服务器端租约发送;如果没有运行器在其过期前注册,会话将使用新的订单 ID 重新提供。所有副本必须共享此值。 |88| `--expected-spawn-seconds <sec>` | `120` | 从编排器收到生成请求到运行器注册的预期 p99 时间,包括在您的平台上等待容量的任何时间。服务器强制的范围为 10 到 3600。在每次轮询时作为服务器端租约发送;如果没有运行器在其过期前注册,会话将使用新的订单 ID 重新提供。所有副本必须共享此值。 |

89| `--min-idle <n>` | `0` | 通过主动生成待命运行器来保持至少 N 个空闲会话槽。`0` 禁用预热。与运行器的 `--exit-if-unused-min` 配对,以便多余的待命运行器回收自己。 |89| `--min-idle <n>` | `0` | 通过主动生成待命运行器来保持至少 N 个空闲会话槽。`0` 禁用预热。与运行器的 `--exit-if-unused-min` 配对,以便多余的待命运行器回收自己。 |


116| `SELF_HOSTED_RUNNER_MAX_LIFETIME_GRACE_MS` | `900000` | 运行器在会话达到其 `--kill-session-after-min` 限制后等待的时间,以便运行中的轮次完成或释放完成,然后才终止会话 |116| `SELF_HOSTED_RUNNER_MAX_LIFETIME_GRACE_MS` | `900000` | 运行器在会话达到其 `--kill-session-after-min` 限制后等待的时间,以便运行中的轮次完成或释放完成,然后才终止会话 |

117| `SELF_HOSTED_RUNNER_POST_TURN_SETTLE_MS` | `7000` | 运行器在轮次完成后计算会话繁忙的时间上限,用于 `--drain-wait-sec` 排空,而会话的进程向 Anthropic 报告轮次的结束。`0` 或不可用的值回退到默认值,因此无法关闭保持。需要 Claude Code v2.1.275 或更高版本。 |117| `SELF_HOSTED_RUNNER_POST_TURN_SETTLE_MS` | `7000` | 运行器在轮次完成后计算会话繁忙的时间上限,用于 `--drain-wait-sec` 排空,而会话的进程向 Anthropic 报告轮次的结束。`0` 或不可用的值回退到默认值,因此无法关闭保持。需要 Claude Code v2.1.275 或更高版本。 |

118| `SELF_HOSTED_RUNNER_SIGKILL_GRACE_MS` | `30000` | 运行器等待操作系统向陷入不可中断 I/O 的子进程传递 `SIGKILL` 的时间,然后自己退出。下限为 `--post-session-hook-timeout-sec` 加 15 秒,设置 `--push-outcome-on-release` 时再加 30 秒,因此有效最小值在默认值处为 75 秒。 |118| `SELF_HOSTED_RUNNER_SIGKILL_GRACE_MS` | `30000` | 运行器等待操作系统向陷入不可中断 I/O 的子进程传递 `SIGKILL` 的时间,然后自己退出。下限为 `--post-session-hook-timeout-sec` 加 15 秒,设置 `--push-outcome-on-release` 时再加 30 秒,因此有效最小值在默认值处为 75 秒。 |

119| `CLAUDE_RUNNER_FETCH_DEPTH` | `50` | 新克隆的 git 获取深度。设置正整数,或 `full` 或 `0` 以进行完整获取。工作区中已存在的存储库保持其现有深度。 |119| `CLAUDE_RUNNER_FETCH_DEPTH` | `50` | 新克隆的 git 获取深度。设置正整数,或 `full` 或 `0` 以进行完整获取。对于工作区中已存在的克隆,请参阅[复用预热的检出](https://code.claude.com/docs/zh-CN/self-hosted-environments-deploy.md#reuse-a-pre-warmed-checkout)。 |

120| `CLAUDE_RUNNER_FETCH_SERVER_PROGRESS_CAP_MS` | `600000` | 在 git 服务器自身的进度数字持续上升期间(例如服务器为大型仓库准备 pack 时),每次尝试中 git 获取等待首批数据的最长时间(以毫秒为单位)。`0` 或 `off` 会关闭此等待:此类获取在两分钟内没有收到数据时将被中断。任何其他整数都会被限制在 `120000` 到 `1800000` 之间,即 2 到 30 分钟。需要 Claude Code v2.1.295 或更高版本。 |120| `CLAUDE_RUNNER_FETCH_SERVER_PROGRESS_CAP_MS` | `600000` | 在 git 服务器自身的进度数字持续上升期间(例如服务器为大型仓库准备 pack 时),每次尝试中 git 获取等待首批数据的最长时间(以毫秒为单位)。`0` 或 `off` 会关闭此等待:此类获取在两分钟内没有收到数据时将被中断。任何其他整数都会被限制在 `120000` 到 `1800000` 之间,即 2 到 30 分钟。需要 Claude Code v2.1.295 或更高版本。 |

121| `CLAUDE_RUNNER_SKIP_GIT_VERIFY` | 未设置 | 当为 `1` 时,跳过 `checkout` 钩子运行后的 `.git` 存在检查。当您的钩子物化非 git 源时设置此项。 |121| `CLAUDE_RUNNER_SKIP_GIT_VERIFY` | 未设置 | 当为 `1` 时,跳过 `checkout` 钩子运行后的 `.git` 存在检查。当您的钩子物化非 git 源时设置此项。 |

122| `FORCE_AUTOUPDATE_PLUGINS` | 未设置 | 当为 `1` 时,让插件市场自动更新,即使二进制文件被固定 |122| `FORCE_AUTOUPDATE_PLUGINS` | 未设置 | 当为 `1` 时,让插件市场自动更新,即使二进制文件被固定 |


229 interval: 30s229 interval: 30s

230```230```

231 231 

232### 示例警报规则

233 

232这些示例警报规则是一个起点;为您的舰队大小调整阈值:234这些示例警报规则是一个起点;为您的舰队大小调整阈值:

233 235 

234```yaml theme={null}236```yaml theme={null}


250 annotations:252 annotations:

251 summary: "运行器正在运行混合版本"253 summary: "运行器正在运行混合版本"

252 - alert: ClaudeRunnerInitErrorsHigh254 - alert: ClaudeRunnerInitErrorsHigh

253 expr: increase(claude_code_self_hosted_runner_session_init_errors_total[10m]) > 3255 expr: sum by (namespace) (increase(claude_code_self_hosted_runner_session_init_errors_total[10m])) > 3

254 for: 5m256 for: 5m

255 labels: {severity: warning}257 labels: {severity: warning}

256 annotations:258 annotations:

257 summary: "运行器 {{ $labels.pod }}:10 分钟内 >3 个会话初始化失败(checkout hook / git / 令牌 / 初始化前崩溃)"259 summary: "会话在初始化前失败(checkout hook / git / 令牌 / 初始化前崩溃)"

258 - alert: ClaudeRunnerPollErrors260 - alert: ClaudeRunnerPollErrors

259 expr: sum by (pod) (rate(claude_code_self_hosted_runner_poll_errors_total[5m])) > 0261 expr: sum by (pod) (rate(claude_code_self_hosted_runner_poll_errors_total[5m])) > 0

260 for: 2m262 for: 2m


262 annotations:264 annotations:

263 summary: "运行器 {{ $labels.pod }}:PollWork 失败({{ $value | humanize }}/s 超过 5m)"265 summary: "运行器 {{ $labels.pod }}:PollWork 失败({{ $value | humanize }}/s 超过 5m)"

264 - alert: ClaudeRunnerSessionStartHookErrors266 - alert: ClaudeRunnerSessionStartHookErrors

265 expr: increase(claude_code_self_hosted_runner_session_start_hook_errors_total[10m]) > 3267 expr: sum by (namespace) (increase(claude_code_self_hosted_runner_session_start_hook_errors_total[10m])) > 3

266 for: 5m268 for: 5m

267 labels: {severity: warning}269 labels: {severity: warning}

268 annotations:270 annotations:

269 summary: "运行器 {{ $labels.pod }}:10 分钟内 >3 个 SessionStart hook 失败"271 summary: "SessionStart hook 正在失败"

270 272 

271 - name: claude-code-self-hosted-orchestrator273 - name: claude-code-self-hosted-orchestrator

272 rules:274 rules:


283 annotations:285 annotations:

284 summary: "编排器 {{ $labels.pod }} 已超过 90 秒未轮询(轮询循环等待 hook 执行)"286 summary: "编排器 {{ $labels.pod }} 已超过 90 秒未轮询(轮询循环等待 hook 执行)"

285 - alert: ClaudeOrchestratorCircuitBroken287 - alert: ClaudeOrchestratorCircuitBroken

286 expr: claude_code_self_hosted_orchestrator_queue_circuit_broken_sessions > 0288 expr: max by (namespace) (claude_code_self_hosted_orchestrator_queue_circuit_broken_sessions and on (instance) max_over_time(claude_code_self_hosted_orchestrator_connected[2m]) == 1) > 0

287 for: 1m289 for: 1m

288 labels: {severity: critical}290 labels: {severity: critical}

289 annotations:291 annotations:


302 summary: "编排器 {{ $labels.pod }}:5 分钟内 >3 个 spawn-runner hook 失败"304 summary: "编排器 {{ $labels.pod }}:5 分钟内 >3 个 spawn-runner hook 失败"

303```305```

304 306 

307### 针对丢失的运行器和等待中的会话发出警报

308 

309在[固定舰队](https://code.claude.com/docs/zh-CN/self-hosted-environments-deploy.md#scale-the-fleet)上,加载 `ClaudeRunnersBelowFloor`。使用[按需运行器](https://code.claude.com/docs/zh-CN/self-hosted-environments-configuration.md#on-demand-runners)时,改为加载 `ClaudeOrchestratorSessionsWaiting` 和 `ClaudeOrchestratorQueueWaitHigh`。

310 

311#### 固定舰队丢失运行器时发出警报

312 

313当剩余的已注册且已被抓取的运行器数量低于下限并持续 10 分钟时,`ClaudeRunnersBelowFloor` 会触发:

314 

315```yaml theme={null}

316groups:

317 # 仅适用于固定舰队。使用按需运行器时,计数随需求变化,

318 # 因此 ClaudeRunnersBelowFloor 会在需求较低时触发。

319 - name: claude-code-self-hosted-fixed-fleet-capacity

320 rules:

321 - alert: ClaudeRunnersBelowFloor

322 expr: (count(claude_code_self_hosted_runner_info{namespace="claude-runners"}) or vector(0)) < 2

323 for: 10m

324 labels: {severity: critical, namespace: claude-runners}

325 annotations:

326 summary: "已注册并被抓取的运行器:{{ $value }},低于下限。请先检查运行器工作负载,如果全部在运行,再检查抓取目标。"

327```

328 

329* **下限**:将 `expr` 中的 `2` 设置为副本数的一半左右,向上取整。有三个副本时保留 `2`,当只剩一个运行器或没有运行器时警报会触发。

330* **命名空间**:替换匹配器中和 `labels` 中的 `claude-runners`,并为每个其他命名空间复制该警报。如果您的目标没有 `namespace` 标签,请删除该匹配器和该标签,否则警报读数为 0 并触发。

331* **`ClaudeRunnerPollStale` 和 `ClaudeRunnerPollErrors`**:保持从[示例警报规则](#sample-alert-rules)中加载它们,因为 `ClaudeRunnersBelowFloor` 仍会计入无法轮询的运行器

332 

333#### 会话等待按需运行器时发出警报

334 

335当等待运行器的会话数持续 10 分钟高于 0 时,`ClaudeOrchestratorSessionsWaiting` 会触发。当过去 10 分钟内超过 1% 的队列等待超过 160 秒,且该情况持续 5 分钟时,`ClaudeOrchestratorQueueWaitHigh` 会触发:

336 

337```yaml theme={null}

338groups:

339 # 仅适用于按需运行器。无需针对命名空间进行编辑。

340 - name: claude-code-self-hosted-on-demand-capacity

341 rules:

342 - alert: ClaudeOrchestratorSessionsWaiting

343 expr: |

344 max by (namespace) (

345 claude_code_self_hosted_orchestrator_pool_pending_sessions

346 and on (instance)

347 max_over_time(claude_code_self_hosted_orchestrator_connected[2m]) == 1

348 ) > 0

349 for: 10m

350 labels: {severity: warning}

351 annotations:

352 summary: "等待运行器的会话:{{ $value }},已连续 10 分钟高于阈值。请按 result 检查 claude_code_self_hosted_orchestrator_spawn_hooks_total,然后检查未能启动的运行器工作负载。"

353 - alert: ClaudeOrchestratorQueueWaitHigh

354 expr: |

355 histogram_quantile(0.99, sum by (namespace, le) (

356 rate(claude_code_self_hosted_orchestrator_session_queue_wait_seconds_bucket[10m])

357 )) > 160

358 for: 5m

359 labels: {severity: warning}

360 annotations:

361 summary: "过去 10 分钟内超过 1% 的队列等待超过 160 秒。请检查 ClaudeOrchestratorDisconnected 是否正在触发,然后按 result 检查 claude_code_self_hosted_orchestrator_spawn_hooks_total 以及 claude_code_self_hosted_orchestrator_spawn_hook_duration_seconds。"

362```

363 

364* **阈值**:如果始终有会话在等待,请将 `ClaudeOrchestratorSessionsWaiting` 中的 `> 0` 提高到您通常看到的数值之上

365* **`ClaudeOrchestratorDisconnected`**:保持从[示例警报规则](#sample-alert-rules)中加载它,因为在命名空间中最后一个编排器断开连接约 2 分钟后,`ClaudeOrchestratorSessionsWaiting` 会停止触发

366 

305### 传递会话子进程指标367### 传递会话子进程指标

306 368 

307每个会话在其自己的子进程中运行,具有自己的 OpenTelemetry 指标;在 `--capacity` 高于 1 时,运行器重写这些子指标的公开方式。在运行器主机上设置 `OTEL_METRICS_EXPORTER=prometheus` 和会话环境中的 `CLAUDE_CODE_ENABLE_TELEMETRY=1`(例如从您的[包装脚本](https://code.claude.com/docs/zh-CN/self-hosted-environments-configuration.md#wrapper-scripts)或运行器自己的环境,会话继承),重新公开每个子进程的计数器和仪表工具在运行器自己的 `/metrics` 端点上,与运行器的系列一起。运行器将子进程的导出器重写为通过 OTLP 推送到健康端口上的仅环回接收器,用 `session_id` 和 `client_platform` 标签标记每个系列,并在该会话结束时驱逐会话的系列。直方图不通过,子指标名称与运行器自己的前缀冲突的会被删除。369每个会话在其自己的子进程中运行,具有自己的 OpenTelemetry 指标;在 `--capacity` 高于 1 时,运行器重写这些子指标的公开方式。在运行器主机上设置 `OTEL_METRICS_EXPORTER=prometheus` 和会话环境中的 `CLAUDE_CODE_ENABLE_TELEMETRY=1`(例如从您的[包装脚本](https://code.claude.com/docs/zh-CN/self-hosted-environments-configuration.md#wrapper-scripts)或运行器自己的环境,会话继承),重新公开每个子进程的计数器和仪表工具在运行器自己的 `/metrics` 端点上,与运行器的系列一起。运行器将子进程的导出器重写为通过 OTLP 推送到健康端口上的仅环回接收器,用 `session_id` 和 `client_platform` 标签标记每个系列,并在该会话结束时驱逐会话的系列。直方图不通过,子指标名称与运行器自己的前缀冲突的会被删除。

Details

324}324}

325```325```

326 326 

327诸如 `"claude-opus-5"` 之类的模型 ID 条目也会允许在其基础上扩展的后续版本,例如 Opus 5.5。要阻止其中某个版本,请使用 [`deniedModels`](#deniedmodels)。要让每个模型 ID 条目只允许其指定的版本,请使用 [`availableModelsMatch`](#availablemodelsmatch)。请参阅[限制模型选择](https://code.claude.com/docs/zh-CN/model-config.md#restrict-model-selection)。327诸如 `"claude-opus-5"` 之类的模型 ID 条目也会允许在其基础上扩展的后续版本,例如 Opus 5.5。要阻止其中某个版本,请使用 [`deniedModels`](#deniedmodels)。要让每个模型 ID 条目只允许其指定的版本,请使用 [`availableModelsMatch`](#availablemodelsmatch)。请参阅[限制模型选择](https://code.claude.com/docs/zh-CN/model-config.md#restrict-model-selection)。有关第三方提供商 ID,请参阅[为第三方部署固定模型](https://code.claude.com/docs/zh-CN/model-config.md#pin-models-for-third-party-deployments)。

328 328 

329### `availableModelsMatch`329### `availableModelsMatch`

330 330 


333* **作用域**:[`Managed`](#scopes)。Claude Code 会忽略用户、项目和本地设置以及 `--settings` 中的此键,并给出警告333* **作用域**:[`Managed`](#scopes)。Claude Code 会忽略用户、项目和本地设置以及 `--settings` 中的此键,并给出警告

334* **类型**:字符串,可选值之一:334* **类型**:字符串,可选值之一:

335 * `"prefix"`:模型 ID 条目允许其对应版本以及在其基础上再扩展一个段的任何模型 ID335 * `"prefix"`:模型 ID 条目允许其对应版本以及在其基础上再扩展一个段的任何模型 ID

336 * `"exact"`:模型 ID 条目只允许其指定的版本(包括该版本带日期的 ID),因此 `"claude-opus-5"` 允许 Opus 5 但不允许 `claude-opus-5-5`。诸如 `"opus"` 之类的系列别名仍允许整个系列,而 `best`、`opusplan` 和 `default` 条目会被忽略336 * `"exact"`:模型 ID 条目只允许其指定的版本,因此 `"claude-opus-5"` 允许 Opus 5 但不允许 `claude-opus-5-5`。诸如 `"claude-opus-4-5"` 之类的条目还会允许其带日期的 Anthropic 模型 ID `claude-opus-4-5-20251101`。诸如 `"opus"` 之类的系列别名仍允许整个系列,而 `best`、`opusplan` 和 `default` 条目会被忽略

337* **默认值**:`"prefix"`337* **默认值**:`"prefix"`

338 338 

339此示例允许 Opus 5 和 Sonnet 5,但不允许两者的任何后续版本:339此示例允许 Opus 5 和 Sonnet 5,但不允许两者的任何后续版本:


1371 1371 

1372Claude Code 会去除目录路径末尾的斜杠,因此 `~/.aws` 和 `~/.aws/` 匹配同一目录。在 v2.1.224 之前,Claude Code 会将末尾斜杠原样传递给沙箱,对于带末尾斜杠写法的 `denyRead` 或 `denyWrite` 条目,Claude 仍可能读取或写入其下的路径。1372Claude Code 会去除目录路径末尾的斜杠,因此 `~/.aws` 和 `~/.aws/` 匹配同一目录。在 v2.1.224 之前,Claude Code 会将末尾斜杠原样传递给沙箱,对于带末尾斜杠写法的 `denyRead` 或 `denyWrite` 条目,Claude 仍可能读取或写入其下的路径。

1373 1373 

1374Claude Code 还会去除末尾的 `/**`,因此 `~/build/**` 和 `~/build` 覆盖同一目录。`*` 等通配符是否有效取决于条目所在的列表以及平台:1374##### 通配符在沙箱路径中的适用位置

1375 1375 

1376* **`allowWrite` 和 `denyWrite`**:在 macOS 上,通配符有效。在 Linux 和 WSL2 上,沙箱挂载的是具体路径,因此去除末尾 `/**` 后仍包含 `*`、`?` 或 `[` 的条目会被 Claude Code 跳过,该条目不起作用。Claude Code 会将您的 `Edit` 权限规则中的路径添加到这些列表中,因此同样的限制也适用于它们,`/sandbox` 的 **Config** 选项卡会对包含通配符的 `Edit` 和 `Read` 权限规则发出警告。1376通配符 `*`、`?` 和 `**` 在 macOS 上适用于全部四个 `sandbox.filesystem` 路径列表,在 Linux 和 WSL2 上则适用的位置较少:

1377* **`denyRead` 和 `allowRead`**:通配符在所有平台上都有效。在 Linux 和 WSL2 上,Claude Code 会将读取条目展开为其匹配的具体路径,而对写入列表不会这样做。

1378 1377 

1379花括号在名称中按普通字符匹配,因此 `~/data/{keys,tokens}` 覆盖的是字面名为 `{keys,tokens}` 的目录,而不是两个备选项。要覆盖 `~/data/keys` 和 `~/data/tokens`,请将它们分别添加为单独的条目。1378| `sandbox.filesystem` 列表 | 在 Linux 和 WSL2 上有效的写法 | 在 Linux 和 WSL2 上无效的示例 | 替代写法 |

1379| :- | :- | :- | :- |

1380| `denyRead`、`allowRead` | 末尾的 `/**` 有效,因此 `~/build/**` 与 `~/build` 覆盖同一目录。其他任何通配符只有出现在条目[完整路径](#sandbox-path-prefixes)的第一个目录名之后才有效。 | `denyRead` 中的 `/**/*.pem` 不覆盖任何内容,因此不会阻止任何读取 | `/srv/**/*.pem`,每个顶层目录各写一个条目 |

1381| `allowWrite`、`denyWrite` | 只有末尾的 `/**` 有效,因此 `~/build/**` 与 `~/build` 覆盖同一目录 | `./src/*` 只覆盖 `src` 中本身名为 `*` 的文件或目录,若不存在则不覆盖任何内容 | `./src`,它覆盖 `src` 下的所有内容,或者每个路径各写一个条目 |

1382 

1383在 `~/keys/*.pem` 中,通配符位于第一个目录名之后;对于主目录为 `/home/alice` 的情况,第一个目录名是 `home`:

1384 

1385```text theme={null}

1386~/keys/*.pem the entry

1387/home/alice/keys/*.pem its full path

1388 ^^^^ the first directory name, home

1389```

1390 

1391在 Linux 和 WSL2 上,会话中 `/sandbox` 的 **Config** 选项卡会针对包含末尾 `/**` 以外通配符的 `Edit` 权限规则发出警告。这些通配符对沙箱化命令无效。请将该规则应覆盖的每个路径或包含这些路径的目录添加到 `allowWrite`(对于允许规则)或 `denyWrite`(对于拒绝规则)。

1392 

1393##### 包含方括号、花括号或圆括号的目录名

1394 

1395要允许或阻止名称中包含方括号的目录,请按原样写出名称,例如 `./app/[slug]`。在该条目中,`[slug]` 是目录的真实名称,包括方括号:

1396 

1397```text theme={null}

1398app/

1399└── [slug]/

1400 └── page.tsx

1401```

1402 

1403该条目覆盖该目录下的所有内容,因此不要添加末尾的 `/**`。在 macOS 以及 Linux 和 WSL2 上,`app/[slug]` 目录必须在沙箱化命令启动时已存在。

1404 

1405* **方括号,例如 `[slug]`**:在 macOS 的所有列表中,以及 Linux 和 WSL2 的 `denyRead` 和 `allowRead` 中,`./app/[slug]` 中的方括号同时也是一个模式。该条目还会匹配 `app` 下以 `slug` 中某一个字符命名的任何路径,例如 `app/s` 或 `app/g`。如果该条目位于 `allowRead` 中,或在 macOS 上位于 `allowWrite` 中,沙箱化命令也可以访问这些路径。请重命名任何不应被它们访问的路径。

1406* **方括号,例如 `[user-id]` 或 `[post-id]`,其中连字符左侧字符的排序位于右侧字符之后**:在所有平台的所有列表中,`./app/[user-id]` 只覆盖恰好具有该名称的目录。在 v2.1.304 之前,当 `denyRead` 或 `allowRead` 包含此类条目时,Linux 和 WSL2 上的沙箱化命令无法启动。

1407* **花括号和圆括号**:它们是普通字符,因此 `~/data/{keys,tokens}` 覆盖的是一个名为 `{keys,tokens}` 的目录,而不是两个备选项。要覆盖 `~/data/keys` 和 `~/data/tokens`,请将它们分别添加为单独的条目。

1380 1408 

1381### `sandbox.filesystem.allowWrite`1409### `sandbox.filesystem.allowWrite`

1382 1410 


3470 3498 

3471主机名匹配不区分大小写,并且会将 `hooks.example.com.`(末尾带有表示完全限定域名的点)视为与 `hooks.example.com` 相同,这与 DNS 的处理方式一致。此允许列表适用于所有来源的 hook,包括托管设置。3499主机名匹配不区分大小写,并且会将 `hooks.example.com.`(末尾带有表示完全限定域名的点)视为与 `hooks.example.com` 相同,这与 DNS 的处理方式一致。此允许列表适用于所有来源的 hook,包括托管设置。

3472 3500 

3473在 Agent SDK 的 `managedSettings` 选项中,如果此键的列表包含条目,Claude Code 会忽略此键,因此请改为在 SDK 的 `settings` 选项中传入该列表。请参阅[各个值在父级设置中的作用](https://code.claude.com/docs/zh-CN/claude-apps-gateway#how-hook-and-skill-keys-in-parent-settings-take-effect)。3501在 Agent SDK 的 `managedSettings` 选项中,如果此键的列表包含条目,Claude Code 会忽略此键,因此请改为在 SDK 的 [`settings` 选项](https://code.claude.com/docs/zh-CN/agent-sdk/typescript#options)中传入该列表。请参阅[空列表在父级设置中的作用](https://code.claude.com/docs/zh-CN/claude-apps-gateway#how-hook-and-skill-keys-in-parent-settings-take-effect)。

3474 3502 

3475### `allowManagedHooksOnly`3503### `allowManagedHooksOnly`

3476 3504 


3520其影响范围取决于哪个文件包含此键:3548其影响范围取决于哪个文件包含此键:

3521 3549 

3522* **在托管设置中**:Claude Code 会禁用所有已配置的 hook(包括托管 hook),但会继续运行 [Agent SDK](https://code.claude.com/docs/zh-CN/agent-sdk/overview.md) 在进程内注册的 hook3550* **在托管设置中**:Claude Code 会禁用所有已配置的 hook(包括托管 hook),但会继续运行 [Agent SDK](https://code.claude.com/docs/zh-CN/agent-sdk/overview.md) 在进程内注册的 hook

3523* **在 Agent SDK 的 `managedSettings` 选项中**:Claude Code 会将此键视为 `allowManagedHooksOnly: true`,因此有关哪些 hook 会停止,请参阅 [`allowManagedHooksOnly` 下会运行哪些内容](#what-runs-under-allowmanagedhooksonly)。在管理员部署了托管设置的机器上,除非管理员[允许嵌入宿主添加策略](https://code.claude.com/docs/zh-CN/managed-settings.md#let-an-embedding-host-add-policy),否则 Claude Code 会忽略此键。需要 Claude Code v2.1.309 或更高版本。3551* **在 Agent SDK 的 `managedSettings` 选项中**:在管理员部署了托管设置的机器上,除非管理员[允许嵌入宿主添加策略](https://code.claude.com/docs/zh-CN/managed-settings.md#let-an-embedding-host-add-policy),否则 Claude Code 会忽略此键。在此键生效的情况下,用户、项目、本地和插件 hook 会停止,SDK 的 `settings` 选项中的 hook 也会停止。管理员的托管 hook、[强制启用](#enabledplugins)的插件中的 hook 以及您的 [SDK hook 回调](https://code.claude.com/docs/zh-CN/agent-sdk/hooks.md)会继续运行。需要 Claude Code v2.1.309 或更高版本。

3524* **在任何其他设置文件中**:Claude Code 会禁用用户、项目、本地和插件 hook;托管 hook、Agent SDK hook 以及在托管 [`enabledPlugins`](#enabledplugins) 中强制启用的插件中的 hook 会继续运行3552* **在任何其他设置文件中**:Claude Code 会禁用用户、项目、本地和插件 hook;托管 hook、Agent SDK hook 以及在托管 [`enabledPlugins`](#enabledplugins) 中强制启用的插件中的 hook 会继续运行

3525 3553 

3526此键还会停止 [mod](https://code.claude.com/docs/zh-CN/plugins/mods/overview.md),即其代码会注册 hook 的插件:3554此键还会停止 [mod](https://code.claude.com/docs/zh-CN/plugins/mods/overview.md),即其代码会注册 hook 的插件:


3624 3652 

3625此允许列表适用于所有来源的 hook,包括托管设置。3653此允许列表适用于所有来源的 hook,包括托管设置。

3626 3654 

3627在 Agent SDK 的 `managedSettings` 选项中,如果此键的列表包含条目,Claude Code 会忽略此键,因此请改为在 SDK 的 `settings` 选项中传入该列表。请参阅[各个值在父级设置中的作用](https://code.claude.com/docs/zh-CN/claude-apps-gateway#how-hook-and-skill-keys-in-parent-settings-take-effect)。3655在 Agent SDK 的 `managedSettings` 选项中,如果此键的列表包含条目,Claude Code 会忽略此键,因此请改为在 SDK 的 [`settings` 选项](https://code.claude.com/docs/zh-CN/agent-sdk/typescript#options)中传入该列表。请参阅[空列表在父级设置中的作用](https://code.claude.com/docs/zh-CN/claude-apps-gateway#how-hook-and-skill-keys-in-parent-settings-take-effect)。

3628 3656 

3629### `workflowKeywordTriggerEnabled`3657### `workflowKeywordTriggerEnabled`

3630 3658 


3841* **类型**:Boolean3869* **类型**:Boolean

3842 * `true`:Claude Code 永远不会运行市场声明的命令,不会安装或更新来自命令来源的插件,并停止加载已安装的此类插件3870 * `true`:Claude Code 永远不会运行市场声明的命令,不会安装或更新来自命令来源的插件,并停止加载已安装的此类插件

3843 * `false`:Claude Code 显式允许来自命令来源的插件3871 * `false`:Claude Code 显式允许来自命令来源的插件

3844* **默认值**:未设置,因此 Claude Code 遵循 [`allowManagedHooksOnly`](#allowmanagedhooksonly):将 hook 执行限制为托管设置的组织也会禁用命令来源3872* **默认值**:未设置,因此 Claude Code 遵循 [`allowManagedHooksOnly`](#allowmanagedhooksonly):将 hook 执行限制为托管设置的组织也会禁用命令来源。在 Agent SDK 的 `managedSettings` 选项中传入 [`disableAllHooks: true`](#disableallhooks) 的应用程序,其本身并不会禁用命令来源。

3845 3873 

3846```json managed-settings.json theme={null}3874```json managed-settings.json theme={null}

3847{3875{

Details

127 127 

128```bash ~/.tmux.conf theme={null}128```bash ~/.tmux.conf theme={null}

129set -g allow-passthrough on129set -g allow-passthrough on

130set -g focus-events on

130set -s extended-keys on131set -s extended-keys on

131set -as terminal-features 'xterm*:extkeys'132set -as terminal-features 'xterm*:extkeys'

132```133```

133 134 

134`allow-passthrough` 行允许通知和进度更新到达外部终端,而不是被 tmux 吞掉。`extended-keys` 行让 tmux 区分 Shift+Enter 和普通 Enter,这样换行快捷键就能工作。135`allow-passthrough` 行允许通知和进度更新到达外部终端,而不是被 tmux 吞掉。`extended-keys` 行让 tmux 区分 Shift+Enter 和普通 Enter,这样换行快捷键就能工作。

135 136 

137[mod 的 `Image`](https://code.claude.com/docs/zh-CN/plugins/mods/reference#elements) 需要 `allow-passthrough` 和 `focus-events` 行,以及其他[在 tmux 中绘制的要求](https://code.claude.com/docs/zh-CN/plugins/mods/gallery.md#draw-an-image-inside-tmux)。添加这些行后,还需要从 tmux 分离、重新连接,然后重启 Claude Code。

138 

136## 修复 Windows 上 Backspace 删除整个单词的问题139## 修复 Windows 上 Backspace 删除整个单词的问题

137 140 

138在 Windows 上,Claude Code 将到达的 Backspace 读取为 `^H`,将其解释为 Ctrl+Backspace,这会[删除前一个单词](https://code.claude.com/docs/zh-CN/interactive-mode.md#text-editing),除非 `TERM_PROGRAM` 是 `mintty` 或 `TERM` 是 `cygwin`。在 macOS 和 Linux 上,Claude Code 将其读取为普通 Backspace。141在 Windows 上,Claude Code 将到达的 Backspace 读取为 `^H`,将其解释为 Ctrl+Backspace,这会[删除前一个单词](https://code.claude.com/docs/zh-CN/interactive-mode.md#text-editing),除非 `TERM_PROGRAM` 是 `mintty` 或 `TERM` 是 `cygwin`。在 macOS 和 Linux 上,Claude Code 将其读取为普通 Backspace。

ultrareview.md +2 −2

Details

176该子命令会以以下三种退出码之一退出:176该子命令会以以下三种退出码之一退出:

177 177 

178* **0**:审查已完成,无论是否有发现结果178* **0**:审查已完成,无论是否有发现结果

179* **1**:审查启动失败或在完成前被停止、云端会话出错,或已超时。当[文件夹未被信任](#trust-the-folder-before-the-review-runs)时,退出码也为 1,包括您在信任询问处回答 `n` 或按下 Ctrl-C 的情况。179* **1**:审查启动失败或在完成前被停止、云端会话出错,或已超时。当[文件夹未被信任](#trust-the-folder-before-the-review-runs)时,退出码也为 1,包括您在信任询问处回答 `n`、按下 Enter 或按下 Ctrl-C 的情况。

180* **130**:您在该子命令启动审查、等待发现结果或发送 `--post` 评论期间按下了 Ctrl-C,而不是在信任询问处按下180* **130**:您在该子命令启动审查、等待发现结果或发送 `--post` 评论期间按下了 Ctrl-C,而不是在信任询问处按下

181 181 

182如果子命令在发现结果返回之前退出,这些结果将永远不会到达您的终端。审查可能仍在云端运行。再次运行该子命令会启动一次新的审查,而不是恢复之前那次,并且新的审查会[使用一次免费运行或按使用额度计费](#pricing-and-free-runs)。182如果子命令在发现结果返回之前退出,这些结果将永远不会到达您的终端。审查可能仍在云端运行。再次运行该子命令会启动一次新的审查,而不是恢复之前那次,并且新的审查会[使用一次免费运行或按使用额度计费](#pricing-and-free-runs)。


198claude ultrareview 1234 --trust-workspace198claude ultrareview 1234 --trust-workspace

199```199```

200 200 

201要审查不受信任的 Pull Request,请在您信任的分支上运行 `claude ultrareview <PR number> --trust-workspace`。与回答 `y` 不同,该标志不会保存任何内容。该 PR 会[在云端克隆](#review-a-pull-request),因此您无需在本地拥有其分支。201要审查不受信任的 Pull Request,请在您信任的分支上运行 `claude ultrareview <PR number> --trust-workspace`。该 PR 会[在云端克隆](#review-a-pull-request),因此您无需在本地拥有其分支。

202 202 

203## ultrareview 与 /code-review 的比较203## ultrareview 与 /code-review 的比较

204 204 

vs-code.md +6 −1

Details

1001 1001 

1002### 在执行 TLS 检查的代理后方,听写或 Web 标签页失败1002### 在执行 TLS 检查的代理后方,听写或 Web 标签页失败

1003 1003 

1004当听写或 Web 标签页因证书错误(例如 `unable to get local issuer certificate`)而失败时,请在 `~/.claude/settings.json` 的 `env` 块中设置 [`NODE_EXTRA_CA_CERTS`](https://code.claude.com/docs/zh-CN/network-config#custom-ca-certificates)。将其设置为包含代理根 CA 证书的 PEM 文件的路径,该文件可向您的 IT 团队索取。该错误文本显示在麦克风按钮上或扩展的日志中:1004当听写或 Web 标签页因证书错误(例如 `unable to get local issuer certificate`)而失败时,请在 `~/.claude/settings.json` 的 `env` 块中设置 [`NODE_EXTRA_CA_CERTS`](https://code.claude.com/docs/zh-CN/network-config#custom-ca-certificates)。将其设置为包含代理根 CA 证书的 PEM 文件的路径,该文件可向您的 IT 团队索取。该失败会显示在麦克风按钮或 Web 标签页上,或显示在日志中:

1005 1005 

1006* **听写**:麦克风按钮会在 `Dictation error: WebSocket error:` 之后显示错误文本。1006* **听写**:麦克风按钮会在 `Dictation error: WebSocket error:` 之后显示错误文本。

1007* **Web 标签页**:列出[云端会话](#resume-cloud-sessions-from-claude-ai)的标签页会显示 `Remote server is not connected`,但不显示错误文本。要在日志中查看错误文本:1007* **Web 标签页**:列出[云端会话](#resume-cloud-sessions-from-claude-ai)的标签页会显示 `Remote server is not connected`,但不显示错误文本。要在日志中查看错误文本:

1008 1. 从[命令面板](#vs-code-commands-and-shortcuts)运行 **Claude Code: Show Logs**,打开 `Claude VSCode` 输出频道。1008 1. 从[命令面板](#vs-code-commands-and-shortcuts)运行 **Claude Code: Show Logs**,打开 `Claude VSCode` 输出频道。

1009 2. 点击该标签页上的 **Reconnect**,等待其不再显示 `Connecting…`。1009 2. 点击该标签页上的 **Reconnect**,等待其不再显示 `Connecting…`。

1010 3. 在该频道中搜索 `Error fetching remote sessions:` 或 `Failed to fetch organization UUID:`,然后在最新的匹配行中查看该前缀之后的错误文本。1010 3. 在该频道中搜索 `Error fetching remote sessions:` 或 `Failed to fetch organization UUID:`,然后在最新的匹配行中查看该前缀之后的错误文本。

1011* **日志警告**:提及 `an authority that Claude Code does not trust` 的警告表示出现了证书错误。在执行 TLS 检查的代理后方,请在 `~/.claude/settings.json` 的 `env` 中设置 `NODE_EXTRA_CA_CERTS`。v2.1.309 之前的版本不会记录此警告。

1011 1012 

1012此修复需要扩展版本 2.1.307 或更高版本,因此请先更新扩展。然后将 `NODE_EXTRA_CA_CERTS` 设置为证书文件的完整路径,且不要使用 `~`。对于 Windows 路径,在 `settings.json` 中每个反斜杠需要写两次,例如 `C:\\certs\\example-ca.pem`。1013此修复需要扩展版本 2.1.307 或更高版本,因此请先更新扩展。然后将 `NODE_EXTRA_CA_CERTS` 设置为证书文件的完整路径,且不要使用 `~`。对于 Windows 路径,在 `settings.json` 中每个反斜杠需要写两次,例如 `C:\\certs\\example-ca.pem`。

1013 1014 

1015> [!NOTE]

1016>

1017> 在连接到 WSL、SSH 主机、开发容器或其他系统的窗口中,请在该系统上(而不是在您的本地计算机上)保存证书文件并编辑 `~/.claude/settings.json`。

1018 

1014以下示例指定了位于 Linux 或 macOS 路径 `/etc/ssl/certs/example-ca.pem` 的证书文件:1019以下示例指定了位于 Linux 或 macOS 路径 `/etc/ssl/certs/example-ca.pem` 的证书文件:

1015 1020 

1016```json ~/.claude/settings.json theme={null}1021```json ~/.claude/settings.json theme={null}