SpyBara
Go Premium

Documentation 2026-05-02 18:14 UTC to 2026-05-04 22:58 UTC

99 files changed +47,108 −0. View all changes and history on the product overview
2026
Tue 19 06:34 Mon 18 23:59 Sun 17 01:01 Fri 15 22:58 Thu 14 17:02 Wed 13 23:01 Tue 12 22:57 Mon 11 23:00 Sun 10 23:03 Sat 9 04:57 Fri 8 22:00 Thu 7 22:59 Tue 5 23:00 Mon 4 22:58

admin-setup.md +130 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 为您的组织设置 Claude Code

6 

7> 针对部署 Claude Code 的管理员的决策地图,涵盖 API 提供商、托管设置、策略执行、使用情况监控和数据处理。

8 

9Claude Code 通过托管设置强制执行组织策略,这些设置优先于本地开发人员配置。您可以从 Claude 管理控制台、移动设备管理 (MDM) 系统或磁盘上的文件传递这些设置。这些设置控制 Claude 可以访问的工具、命令、服务器和网络目标。

10 

11本页按顺序介绍部署决策。每一行都链接到下面的部分和该区域的参考页面。

12 

13<Note>

14 SSO、SCIM 预配和座位分配在 Claude 账户级别配置。有关这些步骤,请参阅 [Claude 企业管理员指南](https://claude.com/resources/tutorials/claude-enterprise-administrator-guide) 和 [座位分配](https://support.claude.com/en/articles/11845131-use-claude-code-with-your-team-or-enterprise-plan)。

15</Note>

16 

17| 决策 | 您的选择 | 参考 |

18| :----------------------------------------------- | :----------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------ |

19| [选择您的 API 提供商](#choose-your-api-provider) | Claude Code 的身份验证位置和计费方式 | [Authentication](/zh-CN/authentication)、[Bedrock](/zh-CN/amazon-bedrock)、[Vertex AI](/zh-CN/google-vertex-ai)、[Foundry](/zh-CN/microsoft-foundry) |

20| [决定设置如何到达设备](#decide-how-settings-reach-devices) | 托管策略如何到达开发人员机器 | [Server-managed settings](/zh-CN/server-managed-settings)、[Settings files](/zh-CN/settings#settings-files) |

21| [决定要强制执行的内容](#decide-what-to-enforce) | 允许哪些工具、命令和集成 | [Permissions](/zh-CN/permissions)、[Sandboxing](/zh-CN/sandboxing) |

22| [设置使用情况可见性](#set-up-usage-visibility) | 如何跟踪支出和采用情况 | [Analytics](/zh-CN/analytics)、[Monitoring](/zh-CN/monitoring-usage)、[Costs](/zh-CN/costs) |

23| [审查数据处理](#review-data-handling) | 数据保留和合规性态势 | [Data usage](/zh-CN/data-usage)、[Security](/zh-CN/security) |

24 

25## 选择您的 API 提供商

26 

27Claude Code 通过多个 API 提供商之一连接到 Claude。您的选择会影响计费、身份验证和您继承的合规性态势。

28 

29| 提供商 | 何时选择 |

30| :---------------------------- | :----------------------------------------------------- |

31| Claude for Teams / Enterprise | 您希望 Claude Code 和 claude.ai 在一个按座位订阅下,无需运行基础设施。这是默认建议。 |

32| Claude Console | 您是 API 优先或希望按使用量付费 |

33| Amazon Bedrock | 您希望继承现有的 AWS 合规控制和计费 |

34| Google Vertex AI | 您希望继承现有的 GCP 合规控制和计费 |

35| Microsoft Foundry | 您希望继承现有的 Azure 合规控制和计费 |

36 

37有关涵盖身份验证、区域和功能奇偶性的完整提供商比较,请参阅 [企业部署概述](/zh-CN/third-party-integrations)。每个提供商的身份验证设置在 [Authentication](/zh-CN/authentication) 中。

38 

39[Network configuration](/zh-CN/network-config) 中的代理和防火墙要求适用于所有提供商。如果您想要在多个提供商前面有单个端点或集中式请求日志记录,请参阅 [LLM gateway](/zh-CN/llm-gateway)。

40 

41## 决定设置如何到达设备

42 

43托管设置定义优先于本地开发人员配置的策略。Claude Code 在四个位置查找它们,并使用在给定设备上找到的第一个。

44 

45| 机制 | 传递 | 优先级 | 平台 |

46| :---------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :-- | :------------ |

47| Server-managed | Claude.ai 管理控制台 | 最高 | 全部 |

48| plist / registry policy | macOS: `com.anthropic.claudecode` plist<br />Windows: `HKLM\SOFTWARE\Policies\ClaudeCode` | 高 | macOS、Windows |

49| File-based managed | macOS: `/Library/Application Support/ClaudeCode/managed-settings.json`<br />Linux 和 WSL: `/etc/claude-code/managed-settings.json`<br />Windows: `C:\Program Files\ClaudeCode\managed-settings.json` | 中 | 全部 |

50| Windows user registry | `HKCU\SOFTWARE\Policies\ClaudeCode` | 最低 | 仅 Windows |

51 

52Server-managed 设置在身份验证时到达设备,并在活跃会话期间每小时刷新一次,无需端点基础设施。它们需要 Claude for Teams 或 Enterprise 计划,因此在其他提供商上的部署需要改用基于文件或操作系统级别的机制之一。

53 

54如果您的组织混合使用提供商,请为 Claude.ai 用户配置 [server-managed settings](/zh-CN/server-managed-settings) 加上 [file-based 或 plist/registry 回退](/zh-CN/settings#settings-files),以便其他用户仍然接收托管策略。

55 

56plist 和 HKLM 注册表位置适用于任何提供商,并且由于需要管理员权限才能写入,因此可以抵抗篡改。Windows 用户注册表中的 HKCU 可以在没有提升权限的情况下写入,因此将其视为便利默认值而不是执行通道。

57 

58无论您选择哪种机制,托管值都优先于用户和项目设置。数组设置(如 `permissions.allow` 和 `permissions.deny`)合并来自所有源的条目,因此开发人员可以扩展托管列表但不能从中删除。

59 

60请参阅 [Server-managed settings](/zh-CN/server-managed-settings) 和 [Settings files and precedence](/zh-CN/settings#settings-files)。

61 

62## 决定要强制执行的内容

63 

64托管设置可以锁定工具、沙箱执行、限制 MCP 服务器和插件源,以及控制哪些 hooks 运行。每一行都是一个控制表面,具有驱动它的设置键。

65 

66| 控制 | 它的作用 | 关键设置 |

67| :---------------------------------------------------------------------------------------- | :-------------------------------------------- | :--------------------------------------------------------------------------- |

68| [Permission rules](/zh-CN/permissions) | 允许、询问或拒绝特定工具和命令 | `permissions.allow`、`permissions.deny` |

69| [Permission lockdown](/zh-CN/permissions#managed-only-settings) | 仅托管权限规则适用;禁用 `--dangerously-skip-permissions` | `allowManagedPermissionRulesOnly`、`permissions.disableBypassPermissionsMode` |

70| [Sandboxing](/zh-CN/sandboxing) | 具有域允许列表的操作系统级文件系统和网络隔离 | `sandbox.enabled`、`sandbox.network.allowedDomains` |

71| [Managed policy CLAUDE.md](/zh-CN/memory#deploy-organization-wide-claude-md) | 在每个会话中加载的组织范围指令,无法排除 | 托管策略路径处的文件 |

72| [MCP server control](/zh-CN/mcp#managed-mcp-configuration) | 限制用户可以添加或连接的 MCP 服务器 | `allowedMcpServers`、`deniedMcpServers`、`allowManagedMcpServersOnly` |

73| [Plugin marketplace control](/zh-CN/plugin-marketplaces#managed-marketplace-restrictions) | 限制用户可以添加和安装的市场来源 | `strictKnownMarketplaces`、`blockedMarketplaces` |

74| [Hook restrictions](/zh-CN/settings#hook-configuration) | 仅托管 hooks 加载;限制 HTTP hook URL | `allowManagedHooksOnly`、`allowedHttpHookUrls` |

75| [Version floor](/zh-CN/settings) | 防止自动更新安装低于组织范围最小值的版本 | `minimumVersion` |

76 

77权限规则和沙箱覆盖不同的层。拒绝 WebFetch 会阻止 Claude 的 fetch 工具,但如果允许 Bash,`curl` 和 `wget` 仍然可以到达任何 URL。沙箱通过在操作系统级别强制执行的网络域允许列表来弥补这一差距。

78 

79有关这些控制防御的威胁模型,请参阅 [Security](/zh-CN/security)。

80 

81## 设置使用情况可见性

82 

83根据您需要报告的内容选择监控。

84 

85| 功能 | 您获得的内容 | 可用性 | 从何处开始 |

86| :------------------ | :------------------------- | :---------- | :------------------------------------------ |

87| Usage monitoring | 会话、工具和令牌的 OpenTelemetry 导出 | 所有提供商 | [Monitoring usage](/zh-CN/monitoring-usage) |

88| Analytics dashboard | 每用户指标、贡献跟踪、排行榜 | 仅 Anthropic | [Analytics](/zh-CN/analytics) |

89| Cost tracking | 支出限制、速率限制和使用情况归属 | 仅 Anthropic | [Costs](/zh-CN/costs) |

90 

91云提供商通过 AWS Cost Explorer、GCP Billing 或 Azure Cost Management 公开支出。Claude for Teams 和 Enterprise 计划在 [claude.ai/analytics/claude-code](https://claude.ai/analytics/claude-code) 包含使用情况仪表板。

92 

93## 审查数据处理

94 

95在 Team、Enterprise、Claude API 和云提供商计划上,Anthropic 不会在您的代码或提示上训练模型。您的 API 提供商决定保留和合规性态势。

96 

97| 主题 | 需要了解的内容 | 从何处开始 |

98| :------------------------ | :--------------------------------------- | :------------------------------------------------ |

99| Data usage policy | Anthropic 收集的内容、保留多长时间、永远不会用于训练的内容 | [Data usage](/zh-CN/data-usage) |

100| Zero Data Retention (ZDR) | 请求完成后不存储任何内容。在 Claude for Enterprise 上可用 | [Zero data retention](/zh-CN/zero-data-retention) |

101| Security architecture | 网络模型、加密、身份验证、审计跟踪 | [Security](/zh-CN/security) |

102 

103如果您需要请求级别的审计日志或按数据敏感性路由流量,请在开发人员和您的提供商之间放置 [LLM gateway](/zh-CN/llm-gateway)。有关监管要求和认证,请参阅 [Legal and compliance](/zh-CN/legal-and-compliance)。

104 

105## 验证和入职

106 

107配置托管设置后,让开发人员在 Claude Code 中运行 `/status`。输出包括以 `Enterprise managed settings` 开头的一行,后跟括号中的源,为 `(remote)`、`(plist)`、`(HKLM)`、`(HKCU)` 或 `(file)` 之一。请参阅 [验证活跃设置](/zh-CN/settings#verify-active-settings)。

108 

109分享这些资源以帮助开发人员入门:

110 

111* [快速入门](/zh-CN/quickstart):从安装到使用项目的首次会话演练

112* [常见工作流](/zh-CN/common-workflows):代码审查、重构和调试等日常任务的模式

113* [Claude 101](https://anthropic.skilljar.com/claude-101) 和 [Claude Code in Action](https://anthropic.skilljar.com/claude-code-in-action):自定进度的 Anthropic Academy 课程

114 

115对于登录问题,请将开发人员指向 [身份验证故障排除](/zh-CN/troubleshoot-install#login-and-authentication)。最常见的修复是:

116 

117* 运行 `/logout` 然后 `/login` 以切换账户

118* 如果缺少企业身份验证选项,运行 `claude update`

119* 更新后重启终端

120 

121如果开发人员看到"您还没有被添加到您的组织",他们的座位不包括 Claude Code 访问权限,需要在管理控制台中更新。

122 

123## 后续步骤

124 

125选择提供商和传递机制后,继续进行详细配置:

126 

127* [Server-managed settings](/zh-CN/server-managed-settings):从 Claude 管理控制台传递托管策略

128* [Settings reference](/zh-CN/settings):每个设置键、文件位置和优先级规则

129* [Amazon Bedrock](/zh-CN/amazon-bedrock)、[Google Vertex AI](/zh-CN/google-vertex-ai)、[Microsoft Foundry](/zh-CN/microsoft-foundry):提供商特定部署

130* [Claude 企业管理员指南](https://claude.com/resources/tutorials/claude-enterprise-administrator-guide):SSO、SCIM、座位管理和推出手册

Details

1> ## Documentation Index

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

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

4 

5# 在 SDK 中使用 Claude Code 功能

6 

7> 将项目说明、skills、hooks 和其他 Claude Code 功能加载到您的 SDK 代理中。

8 

9Agent SDK 建立在与 Claude Code 相同的基础之上,这意味着您的 SDK 代理可以访问相同的基于文件系统的功能:项目说明(`CLAUDE.md` 和规则)、skills、hooks 等。

10 

11当您省略 `settingSources` 时,`query()` 读取与 Claude Code CLI 相同的文件系统设置:用户、项目和本地设置、CLAUDE.md 文件以及 `.claude/` skills、代理和命令。要在没有这些的情况下运行,请传递 `settingSources: []`,这会将代理限制为您以编程方式配置的内容。无论此选项如何,都会读取托管策略设置和全局 `~/.claude.json` 配置。请参阅 [settingSources 不控制的内容](#what-settingsources-does-not-control)。

12 

13有关每个功能的概念概述以及何时使用它,请参阅 [扩展 Claude Code](/zh-CN/features-overview)。

14 

15## 使用 settingSources 控制文件系统设置

16 

17设置源选项(Python 中的 [`setting_sources`](/zh-CN/agent-sdk/python#claude-agent-options)、TypeScript 中的 [`settingSources`](/zh-CN/agent-sdk/typescript#setting-source))控制 SDK 加载哪些基于文件系统的设置。传递显式列表以选择加入特定源,或传递空数组以禁用用户、项目和本地设置。

18 

19此示例通过将 `settingSources` 设置为 `["user", "project"]` 来加载用户级和项目级设置:

20 

21<CodeGroup>

22 ```python Python theme={null}

23 from claude_agent_sdk import query, ClaudeAgentOptions, AssistantMessage, ResultMessage

24 

25 async for message in query(

26 prompt="Help me refactor the auth module",

27 options=ClaudeAgentOptions(

28 # "user" loads from ~/.claude/, "project" loads from ./.claude/ in cwd.

29 # Together they give the agent access to CLAUDE.md, skills, hooks, and

30 # permissions from both locations.

31 setting_sources=["user", "project"],

32 allowed_tools=["Read", "Edit", "Bash"],

33 ),

34 ):

35 if isinstance(message, AssistantMessage):

36 for block in message.content:

37 if hasattr(block, "text"):

38 print(block.text)

39 if isinstance(message, ResultMessage) and message.subtype == "success":

40 print(f"\nResult: {message.result}")

41 ```

42 

43 ```typescript TypeScript theme={null}

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

45 

46 for await (const message of query({

47 prompt: "Help me refactor the auth module",

48 options: {

49 // "user" loads from ~/.claude/, "project" loads from ./.claude/ in cwd.

50 // Together they give the agent access to CLAUDE.md, skills, hooks, and

51 // permissions from both locations.

52 settingSources: ["user", "project"],

53 allowedTools: ["Read", "Edit", "Bash"]

54 }

55 })) {

56 if (message.type === "assistant") {

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

58 if (block.type === "text") console.log(block.text);

59 }

60 }

61 if (message.type === "result" && message.subtype === "success") {

62 console.log(`\nResult: ${message.result}`);

63 }

64 }

65 ```

66</CodeGroup>

67 

68每个源从特定位置加载设置,其中 `<cwd>` 是您通过 `cwd` 选项传递的工作目录(如果未设置,则为进程的当前目录)。有关完整的类型定义,请参阅 [`SettingSource`](/zh-CN/agent-sdk/typescript#setting-source)(TypeScript)或 [`SettingSource`](/zh-CN/agent-sdk/python#setting-source)(Python)。

69 

70| 源 | 加载的内容 | 位置 |

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

72| `"project"` | 项目 CLAUDE.md、`.claude/rules/*.md`、项目 skills、项目 hooks、项目 `settings.json` | `<cwd>/.claude/` 以及每个父目录直到文件系统根目录(当找到 `.claude/` 或不再有父目录时停止) |

73| `"user"` | 用户 CLAUDE.md、`~/.claude/rules/*.md`、用户 skills、用户设置 | `~/.claude/` |

74| `"local"` | CLAUDE.local.md(gitignored)、`.claude/settings.local.json` | `<cwd>/` |

75 

76省略 `settingSources` 等同于 `["user", "project", "local"]`。

77 

78`cwd` 选项确定 SDK 查找项目设置的位置。如果 `cwd` 及其任何父目录都不包含 `.claude/` 文件夹,则项目级功能将不会加载。

79 

80### settingSources 不控制的内容

81 

82`settingSources` 涵盖用户、项目和本地设置。无论其值如何,都会读取一些输入:

83 

84| 输入 | 行为 | 禁用方式 |

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

86| 托管策略设置 | 主机上存在时始终加载 | 删除托管设置文件 |

87| `~/.claude.json` 全局配置 | 始终读取 | 使用 `env` 中的 `CLAUDE_CONFIG_DIR` 重新定位 |

88| `~/.claude/projects/<project>/memory/` 处的自动内存 | 默认加载到系统提示中 | 在设置中设置 `autoMemoryEnabled: false`,或在 `env` 中设置 `CLAUDE_CODE_DISABLE_AUTO_MEMORY=1` |

89 

90<Warning>

91 不要依赖默认 `query()` 选项进行多租户隔离。因为上述输入无论 `settingSources` 如何都会被读取,SDK 进程可能会获取主机级配置和按目录内存。对于多租户部署,在自己的文件系统中运行每个租户,并设置 `settingSources: []` 加上 `env` 中的 `CLAUDE_CODE_DISABLE_AUTO_MEMORY=1`。请参阅 [安全部署](/zh-CN/agent-sdk/secure-deployment)。

92</Warning>

93 

94## 项目说明(CLAUDE.md 和规则)

95 

96`CLAUDE.md` 文件和 `.claude/rules/*.md` 文件为您的代理提供关于您的项目的持久上下文:编码约定、构建命令、架构决策和说明。当 `settingSources` 包含 `"project"`(如上面的示例)时,SDK 在会话开始时将这些文件加载到上下文中。然后代理遵循您的项目约定,而无需在每个提示中重复它们。

97 

98### CLAUDE.md 加载位置

99 

100| 级别 | 位置 | 加载时间 |

101| :------------- | :-------------------------------------------- | :------------------------------------------------ |

102| 项目(根) | `<cwd>/CLAUDE.md` 或 `<cwd>/.claude/CLAUDE.md` | `settingSources` 包含 `"project"` |

103| 项目规则 | `<cwd>/.claude/rules/*.md` | `settingSources` 包含 `"project"` |

104| 项目(父目录) | `cwd` 上方目录中的 `CLAUDE.md` 文件 | `settingSources` 包含 `"project"`,在会话开始时加载 |

105| 项目(子目录) | `cwd` 子目录中的 `CLAUDE.md` 文件 | `settingSources` 包含 `"project"`,当代理读取该子树中的文件时按需加载 |

106| 本地(gitignored) | `<cwd>/CLAUDE.local.md` | `settingSources` 包含 `"local"` |

107| 用户 | `~/.claude/CLAUDE.md` | `settingSources` 包含 `"user"` |

108| 用户规则 | `~/.claude/rules/*.md` | `settingSources` 包含 `"user"` |

109 

110所有级别都是累加的:如果项目和用户 CLAUDE.md 文件都存在,代理会看到两者。级别之间没有硬优先级规则;如果说明冲突,结果取决于 Claude 如何解释它们。编写不冲突的规则,或在更具体的文件中明确说明优先级("这些项目说明覆盖任何冲突的用户级默认值")。

111 

112<Tip>

113 您也可以通过 `systemPrompt` 直接注入上下文,而无需使用 CLAUDE.md 文件。请参阅 [修改系统提示](/zh-CN/agent-sdk/modifying-system-prompts)。当您希望在交互式 Claude Code 会话和 SDK 代理之间共享相同的上下文时,使用 CLAUDE.md。

114</Tip>

115 

116有关如何构建和组织 CLAUDE.md 内容,请参阅 [管理 Claude 的内存](/zh-CN/memory)。

117 

118## Skills

119 

120Skills 是 markdown 文件,为您的代理提供专业知识和可调用的工作流。与 `CLAUDE.md`(每个会话都加载)不同,skills 按需加载。代理在启动时接收 skill 描述,并在相关时加载完整内容。

121 

122Skills 通过 `settingSources` 从文件系统中发现。使用默认选项,用户和项目 skills 会自动加载。当您不指定 `allowedTools` 时,`Skill` 工具默认启用。如果您使用 `allowedTools` 允许列表,请明确包含 `"Skill"`。

123 

124<CodeGroup>

125 ```python Python theme={null}

126 from claude_agent_sdk import query, ClaudeAgentOptions, ResultMessage

127 

128 # Skills in .claude/skills/ are discovered automatically

129 # when settingSources includes "project"

130 async for message in query(

131 prompt="Review this PR using our code review checklist",

132 options=ClaudeAgentOptions(

133 setting_sources=["user", "project"],

134 allowed_tools=["Skill", "Read", "Grep", "Glob"],

135 ),

136 ):

137 if isinstance(message, ResultMessage) and message.subtype == "success":

138 print(message.result)

139 ```

140 

141 ```typescript TypeScript theme={null}

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

143 

144 // Skills in .claude/skills/ are discovered automatically

145 // when settingSources includes "project"

146 for await (const message of query({

147 prompt: "Review this PR using our code review checklist",

148 options: {

149 settingSources: ["user", "project"],

150 allowedTools: ["Skill", "Read", "Grep", "Glob"]

151 }

152 })) {

153 if (message.type === "result" && message.subtype === "success") {

154 console.log(message.result);

155 }

156 }

157 ```

158</CodeGroup>

159 

160<Note>

161 Skills 必须创建为文件系统工件(`.claude/skills/<name>/SKILL.md`)。SDK 没有用于注册 skills 的编程 API。有关完整详情,请参阅 [SDK 中的 Agent Skills](/zh-CN/agent-sdk/skills)。

162</Note>

163 

164有关创建和使用 skills 的更多信息,请参阅 [SDK 中的 Agent Skills](/zh-CN/agent-sdk/skills)。

165 

166## Hooks

167 

168SDK 支持两种定义 hooks 的方式,它们并行运行:

169 

170* **文件系统 hooks:** 在 `settings.json` 中定义的 shell 命令,当 `settingSources` 包含相关源时加载。这些与您为 [交互式 Claude Code 会话](/zh-CN/hooks-guide) 配置的 hooks 相同。

171* **编程 hooks:** 直接传递给 `query()` 的回调函数。这些在您的应用程序进程中运行,可以返回结构化决策。请参阅 [使用 hooks 控制执行](/zh-CN/agent-sdk/hooks)。

172 

173两种类型在相同的 hook 生命周期中执行。如果您已经在项目的 `.claude/settings.json` 中有 hooks,并且您设置 `settingSources: ["project"]`,那些 hooks 会在 SDK 中自动运行,无需额外配置。

174 

175Hook 回调接收工具输入并返回决策字典。返回 `{}`(空字典)意味着允许工具继续。返回 `{"decision": "block", "reason": "..."}` 会阻止执行,原因会作为工具结果发送给 Claude。有关完整的回调签名和返回类型,请参阅 [hooks 指南](/zh-CN/agent-sdk/hooks)。

176 

177<CodeGroup>

178 ```python Python theme={null}

179 from claude_agent_sdk import query, ClaudeAgentOptions, HookMatcher, ResultMessage

180 

181 

182 # PreToolUse hook callback. Positional args:

183 # input_data: HookInput dict with tool_name, tool_input, hook_event_name

184 # tool_use_id: str | None, the ID of the tool call being intercepted

185 # context: HookContext, carries session metadata

186 async def audit_bash(input_data, tool_use_id, context):

187 command = input_data.get("tool_input", {}).get("command", "")

188 if "rm -rf" in command:

189 return {"decision": "block", "reason": "Destructive command blocked"}

190 return {} # Empty dict: allow the tool to proceed

191 

192 

193 # Filesystem hooks from .claude/settings.json run automatically

194 # when settingSources loads them. You can also add programmatic hooks:

195 async for message in query(

196 prompt="Refactor the auth module",

197 options=ClaudeAgentOptions(

198 setting_sources=["project"], # Loads hooks from .claude/settings.json

199 hooks={

200 "PreToolUse": [

201 HookMatcher(matcher="Bash", hooks=[audit_bash]),

202 ]

203 },

204 ),

205 ):

206 if isinstance(message, ResultMessage) and message.subtype == "success":

207 print(message.result)

208 ```

209 

210 ```typescript TypeScript theme={null}

211 import { query, type HookInput, type HookJSONOutput } from "@anthropic-ai/claude-agent-sdk";

212 

213 // PreToolUse hook callback. HookInput is a discriminated union on

214 // hook_event_name, so narrowing on it gives TypeScript the right

215 // tool_input shape for this event.

216 const auditBash = async (input: HookInput): Promise<HookJSONOutput> => {

217 if (input.hook_event_name !== "PreToolUse") return {};

218 const toolInput = input.tool_input as { command?: string };

219 if (toolInput.command?.includes("rm -rf")) {

220 return { decision: "block", reason: "Destructive command blocked" };

221 }

222 return {}; // Empty object: allow the tool to proceed

223 };

224 

225 // Filesystem hooks from .claude/settings.json run automatically

226 // when settingSources loads them. You can also add programmatic hooks:

227 for await (const message of query({

228 prompt: "Refactor the auth module",

229 options: {

230 settingSources: ["project"], // Loads hooks from .claude/settings.json

231 hooks: {

232 PreToolUse: [{ matcher: "Bash", hooks: [auditBash] }]

233 }

234 }

235 })) {

236 if (message.type === "result" && message.subtype === "success") {

237 console.log(message.result);

238 }

239 }

240 ```

241</CodeGroup>

242 

243### 何时使用哪种 hook 类型

244 

245| Hook 类型 | 最适合 |

246| :------------------------ | :---------------------------------------------------------------------------------------------------------------------------------------------------------------- |

247| **文件系统**(`settings.json`) | 在 CLI 和 SDK 会话之间共享 hooks。支持 `"command"`(shell 脚本)、`"http"`(POST 到端点)、`"mcp_tool"`(调用连接的 MCP 服务器的工具)、`"prompt"`(LLM 评估提示)和 `"agent"`(生成验证器代理)。这些在主代理和它生成的任何子代理中触发。 |

248| **编程**(`query()` 中的回调) | 应用程序特定的逻辑;返回结构化决策;进程内集成。仅限于主会话。 |

249 

250<Note>

251 TypeScript SDK 支持超出 Python 的其他 hook 事件,包括 `SessionStart`、`SessionEnd`、`TeammateIdle` 和 `TaskCompleted`。有关完整的事件兼容性表,请参阅 [hooks 指南](/zh-CN/agent-sdk/hooks)。

252</Note>

253 

254有关编程 hooks 的完整详情,请参阅 [使用 hooks 控制执行](/zh-CN/agent-sdk/hooks)。有关文件系统 hook 语法,请参阅 [Hooks](/zh-CN/hooks)。

255 

256## 选择正确的功能

257 

258Agent SDK 为您提供了多种方式来扩展代理的行为。如果您不确定使用哪种,此表将常见目标映射到正确的方法。

259 

260| 您想要... | 使用 | SDK 表面 |

261| :-------------------------------------- | :--------------------------------------- | :------------------------------------------------------ |

262| 设置代理始终遵循的项目约定 | [CLAUDE.md](/zh-CN/memory) | `settingSources: ["project"]` 自动加载它 |

263| 为代理提供它在相关时加载的参考材料 | [Skills](/zh-CN/agent-sdk/skills) | `settingSources` + `allowedTools: ["Skill"]` |

264| 运行可重用的工作流(部署、审查、发布) | [用户可调用的 skills](/zh-CN/agent-sdk/skills) | `settingSources` + `allowedTools: ["Skill"]` |

265| 将隔离的子任务委托给新的上下文(研究、审查) | [子代理](/zh-CN/agent-sdk/subagents) | `agents` 参数 + `allowedTools: ["Agent"]` |

266| 协调多个 Claude Code 实例,具有共享任务列表和直接的代理间消息传递 | [代理团队](/zh-CN/agent-teams) | 不直接通过 SDK 选项配置。代理团队是一个 CLI 功能,其中一个会话充当团队负责人,协调独立队友之间的工作 |

267| 在工具调用上运行确定性逻辑(审计、阻止、转换) | [Hooks](/zh-CN/agent-sdk/hooks) | `hooks` 参数带回调,或通过 `settingSources` 加载的 shell 脚本 |

268| 为 Claude 提供对外部服务的结构化工具访问 | [MCP](/zh-CN/agent-sdk/mcp) | `mcpServers` 参数 |

269 

270<Tip>

271 **子代理与代理团队:** 子代理是临时的和隔离的:新对话、一个任务、摘要返回给父代理。代理团队协调多个独立的 Claude Code 实例,这些实例共享任务列表并直接相互消息传递。代理团队是一个 CLI 功能。有关详情,请参阅 [子代理继承的内容](/zh-CN/agent-sdk/subagents#what-subagents-inherit) 和 [代理团队比较](/zh-CN/agent-teams#compare-with-subagents)。

272</Tip>

273 

274您启用的每个功能都会增加代理的上下文窗口。有关每个功能的成本以及这些功能如何分层组合,请参阅 [扩展 Claude Code](/zh-CN/features-overview#understand-context-costs)。

275 

276## 相关资源

277 

278* [扩展 Claude Code](/zh-CN/features-overview):所有扩展功能的概念概述,包含比较表和上下文成本分析

279* [SDK 中的 Skills](/zh-CN/agent-sdk/skills):使用 skills 的完整指南

280* [子代理](/zh-CN/agent-sdk/subagents):为隔离的子任务定义和调用子代理

281* [Hooks](/zh-CN/agent-sdk/hooks):在关键执行点拦截和控制代理行为

282* [权限](/zh-CN/agent-sdk/permissions):使用模式、规则和回调控制工具访问

283* [系统提示](/zh-CN/agent-sdk/modifying-system-prompts):在不使用 CLAUDE.md 文件的情况下注入上下文

agent-sdk/cost-tracking.md +263 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 跟踪成本和使用情况

6 

7> 了解如何跟踪令牌使用情况、估计成本,以及使用 Claude Agent SDK 配置提示缓存。

8 

9Claude Agent SDK 为与 Claude 的每次交互提供详细的令牌使用信息。本指南说明如何正确跟踪使用情况和理解成本报告,特别是在处理并行工具使用和多步骤对话时。

10 

11有关完整的 API 文档,请参阅 [TypeScript SDK 参考](/zh-CN/agent-sdk/typescript) 和 [Python SDK 参考](/zh-CN/agent-sdk/python)。

12 

13<Warning>

14 `total_cost_usd` 和 `costUSD` 字段是客户端估计值,不是权威的计费数据。SDK 从构建时捆绑的价格表在本地计算它们,因此当以下情况发生时,它们可能与您实际被计费的金额不同:

15 

16 * 定价发生变化

17 * 已安装的 SDK 版本无法识别某个模型

18 * 应用了客户端无法建模的计费规则

19 

20 使用这些字段进行开发洞察和大致预算编制。对于权威计费,请使用 [使用情况和成本 API](https://platform.claude.com/docs/en/build-with-claude/usage-cost-api) 或 [Claude 控制台](https://platform.claude.com/usage) 中的使用情况页面。不要从这些字段向最终用户计费或触发财务决策。

21</Warning>

22 

23## 理解令牌使用情况

24 

25TypeScript 和 Python SDK 使用不同的字段名称公开相同的使用数据:

26 

27* **TypeScript** 在每个助手消息上提供每步令牌细分(`message.message.id`、`message.message.usage`),通过结果消息上的 `modelUsage` 提供每个模型的成本,以及结果消息上的累积总计。

28* **Python** 在每个助手消息上提供每步令牌细分(`message.usage`、`message.message_id`),通过结果消息上的 `model_usage` 提供每个模型的成本,以及结果消息上的累积总计(`total_cost_usd` 和 `usage` 字典)。

29 

30两个 SDK 使用相同的底层成本模型并公开相同的粒度。区别在于字段命名和每步使用情况的嵌套位置。

31 

32成本跟踪取决于理解 SDK 如何确定使用数据的范围:

33 

34* **`query()` 调用:** SDK 的 `query()` 函数的一次调用。单个调用可能涉及多个步骤(Claude 响应、使用工具、获取结果、再次响应)。每个调用在末尾产生一条 [`result`](/zh-CN/agent-sdk/typescript#sdk-result-message) 消息。

35* **步骤:** `query()` 调用中的单个请求/响应周期。每个步骤产生带有令牌使用情况的助手消息。

36* **会话:** 由会话 ID 链接的一系列 `query()` 调用(使用 `resume` 选项)。会话中的每个 `query()` 调用独立报告其自己的成本。

37 

38下图显示了单个 `query()` 调用的消息流,在每个步骤报告令牌使用情况,末尾显示累积估计:

39 

40<img src="https://mintcdn.com/claude-code/Dujg43sxTkuhSELI/images/agent-sdk/message-usage-flow.svg?fit=max&auto=format&n=Dujg43sxTkuhSELI&q=85&s=c542f51ff58547ef9c0e57b16d03f33c" alt="显示查询产生两个步骤消息的图表。步骤 1 有四个共享相同 ID 和使用情况的助手消息(计数一次),步骤 2 有一个具有新 ID 的助手消息,最终结果消息显示估计的 total_cost_usd。" width="760" height="520" data-path="images/agent-sdk/message-usage-flow.svg" />

41 

42<Steps>

43 <Step title="每个步骤产生助手消息">

44 当 Claude 响应时,它发送一条或多条助手消息。在 TypeScript 中,每条助手消息包含一个嵌套的 `BetaMessage`(通过 `message.message` 访问),具有 `id` 和一个 [`usage`](https://platform.claude.com/docs/en/api/messages) 对象,其中包含令牌计数(`input_tokens`、`output_tokens`)。在 Python 中,`AssistantMessage` 数据类通过 `message.usage` 和 `message.message_id` 直接公开相同的数据。当 Claude 在一个回合中使用多个工具时,该回合中的所有消息共享相同的 ID,因此按 ID 去重以避免重复计数。

45 </Step>

46 

47 <Step title="结果消息提供累积估计">

48 当 `query()` 调用完成时,SDK 发出一条结果消息,其中包含 `total_cost_usd` 和累积 `usage`。这在 TypeScript([`SDKResultMessage`](/zh-CN/agent-sdk/typescript#sdk-result-message))和 Python([`ResultMessage`](/zh-CN/agent-sdk/python#result-message))中都可用。如果您进行多个 `query()` 调用(例如,在多轮会话中),每个结果仅反映该单个调用的成本。如果您只需要估计的总计,可以忽略每步使用情况并读取此单个值。

49 </Step>

50</Steps>

51 

52## 获取查询的总成本

53 

54结果消息([TypeScript](/zh-CN/agent-sdk/typescript#sdk-result-message)、[Python](/zh-CN/agent-sdk/python#result-message))标记 `query()` 调用的代理循环的结束。它包括 `total_cost_usd`,即该调用中所有步骤的累积估计成本。这适用于成功和错误结果。如果您使用会话进行多个 `query()` 调用,每个结果仅反映该单个调用的成本。

55 

56以下示例遍历 `query()` 调用的消息流,并在 `result` 消息到达时打印总成本:

57 

58<CodeGroup>

59 ```typescript TypeScript theme={null}

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

61 

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

63 if (message.type === "result") {

64 console.log(`Total cost: $${message.total_cost_usd}`);

65 }

66 }

67 ```

68 

69 ```python Python theme={null}

70 from claude_agent_sdk import query, ResultMessage

71 import asyncio

72 

73 

74 async def main():

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

76 if isinstance(message, ResultMessage):

77 print(f"Total cost: ${message.total_cost_usd or 0}")

78 

79 

80 asyncio.run(main())

81 ```

82</CodeGroup>

83 

84## 跟踪每步和每个模型的使用情况

85 

86本部分中的示例使用 TypeScript 字段名称。在 Python 中,等效字段是 [`AssistantMessage.usage`](/zh-CN/agent-sdk/python#assistant-message) 和 `AssistantMessage.message_id` 用于每步使用情况,以及 [`ResultMessage.model_usage`](/zh-CN/agent-sdk/python#result-message) 用于每个模型的细分。

87 

88### 跟踪每步使用情况

89 

90每条助手消息包含一个嵌套的 `BetaMessage`(通过 `message.message` 访问),具有 `id` 和 `usage` 对象,其中包含令牌计数。当 Claude 并行使用工具时,多条消息共享相同的 `id` 和相同的使用数据。跟踪您已经计数的 ID,并跳过重复项以避免膨胀的总计。

91 

92<Warning>

93 并行工具调用产生多条助手消息,其嵌套的 `BetaMessage` 共享相同的 `id` 和相同的使用情况。始终按 ID 去重以获得准确的每步令牌计数。

94</Warning>

95 

96以下示例累积所有步骤中的输入和输出令牌,仅计数每个唯一消息 ID 一次:

97 

98```typescript theme={null}

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

100 

101const seenIds = new Set<string>();

102let totalInputTokens = 0;

103let totalOutputTokens = 0;

104 

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

106 if (message.type === "assistant") {

107 const msgId = message.message.id;

108 

109 // Parallel tool calls share the same ID, only count once

110 if (!seenIds.has(msgId)) {

111 seenIds.add(msgId);

112 totalInputTokens += message.message.usage.input_tokens;

113 totalOutputTokens += message.message.usage.output_tokens;

114 }

115 }

116}

117 

118console.log(`Steps: ${seenIds.size}`);

119console.log(`Input tokens: ${totalInputTokens}`);

120console.log(`Output tokens: ${totalOutputTokens}`);

121```

122 

123### 按模型细分使用情况

124 

125结果消息包括 [`modelUsage`](/zh-CN/agent-sdk/typescript#model-usage),这是一个模型名称到每个模型令牌计数和成本的映射。当您运行多个模型(例如,为子代理使用 Haiku,为主代理使用 Opus)并想查看令牌的去向时,这很有用。

126 

127以下示例运行查询并打印所使用的每个模型的成本和令牌细分:

128 

129```typescript theme={null}

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

131 

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

133 if (message.type !== "result") continue;

134 

135 for (const [modelName, usage] of Object.entries(message.modelUsage)) {

136 console.log(`${modelName}: $${usage.costUSD.toFixed(4)}`);

137 console.log(` Input tokens: ${usage.inputTokens}`);

138 console.log(` Output tokens: ${usage.outputTokens}`);

139 console.log(` Cache read: ${usage.cacheReadInputTokens}`);

140 console.log(` Cache creation: ${usage.cacheCreationInputTokens}`);

141 }

142}

143```

144 

145## 累积多个调用的成本

146 

147每个 `query()` 调用返回其自己的 `total_cost_usd`。SDK 不提供会话级别的总计,因此如果您的应用程序进行多个 `query()` 调用(例如,在多轮会话中或跨不同用户),请自己累积总计。

148 

149以下示例按顺序运行两个 `query()` 调用,将每个调用的 `total_cost_usd` 添加到运行总计,并打印每个调用和合并的成本:

150 

151<CodeGroup>

152 ```typescript TypeScript theme={null}

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

154 

155 // Track cumulative cost across multiple query() calls

156 let totalSpend = 0;

157 

158 const prompts = [

159 "Read the files in src/ and summarize the architecture",

160 "List all exported functions in src/auth.ts"

161 ];

162 

163 for (const prompt of prompts) {

164 for await (const message of query({ prompt })) {

165 if (message.type === "result") {

166 totalSpend += message.total_cost_usd;

167 console.log(`This call: $${message.total_cost_usd}`);

168 }

169 }

170 }

171 

172 console.log(`Total spend: $${totalSpend.toFixed(4)}`);

173 ```

174 

175 ```python Python theme={null}

176 from claude_agent_sdk import query, ResultMessage

177 import asyncio

178 

179 

180 async def main():

181 # Track cumulative cost across multiple query() calls

182 total_spend = 0.0

183 

184 prompts = [

185 "Read the files in src/ and summarize the architecture",

186 "List all exported functions in src/auth.ts",

187 ]

188 

189 for prompt in prompts:

190 async for message in query(prompt=prompt):

191 if isinstance(message, ResultMessage):

192 cost = message.total_cost_usd or 0

193 total_spend += cost

194 print(f"This call: ${cost}")

195 

196 print(f"Total spend: ${total_spend:.4f}")

197 

198 

199 asyncio.run(main())

200 ```

201</CodeGroup>

202 

203## 处理错误、缓存和令牌差异

204 

205为了准确的成本跟踪,需要考虑失败的对话、缓存令牌定价和偶发的报告不一致。

206 

207### 解决输出令牌差异

208 

209在极少数情况下,您可能会观察到具有相同 ID 的消息的 `output_tokens` 值不同。当这种情况发生时:

210 

2111. **使用最高值:** 一组中的最终消息通常包含准确的总计。

2122. **优先使用结果消息:** 结果消息中的 `total_cost_usd` 反映 SDK 在所有步骤中的累积估计,因此比自己求和每步值更可靠。它仍然是一个估计值,可能与您的实际账单不同。

2133. **报告不一致:** 在 [Claude Code GitHub 存储库](https://github.com/anthropics/claude-code/issues) 提交问题。

214 

215### 跟踪失败对话的成本

216 

217成功和错误结果消息都包括 `usage` 和 `total_cost_usd`。如果对话在中途失败,您仍然消耗了到失败点为止的令牌。无论其 `subtype` 如何,始终从结果消息读取成本数据。

218 

219### 跟踪缓存令牌

220 

221Agent SDK 自动使用 [提示缓存](https://platform.claude.com/docs/en/build-with-claude/prompt-caching) 来减少重复内容的成本。您不需要自己配置缓存。使用对象包括两个额外的字段用于缓存跟踪:

222 

223* `cache_creation_input_tokens`:用于创建新缓存条目的令牌(按比标准输入令牌更高的速率计费)。

224* `cache_read_input_tokens`:从现有缓存条目读取的令牌(按降低的速率计费)。

225 

226将这些与 `input_tokens` 分开跟踪以了解缓存节省。在 TypeScript 中,这些字段在 [`Usage`](/zh-CN/agent-sdk/typescript#usage) 对象上进行类型化。在 Python 中,它们作为 [`ResultMessage.usage`](/zh-CN/agent-sdk/python#result-message) 字典中的键出现(例如,`message.usage.get("cache_read_input_tokens", 0)`)。

227 

228### 将提示缓存 TTL 扩展到一小时

229 

230当您使用 API 密钥进行身份验证或在 Amazon Bedrock、Google Cloud Vertex AI 或 Microsoft Foundry 上运行时,SDK 写入的缓存条目默认使用 5 分钟 TTL。如果您的工作负载针对相同的系统提示和上下文运行许多短会话,且会话之间的间隔超过 5 分钟,缓存会在会话之间过期,每个新会话都会支付完整的输入价格。

231 

232要请求缓存写入的 1 小时 TTL,请设置 [`ENABLE_PROMPT_CACHING_1H`](/zh-CN/env-vars) 环境变量。您可以在 shell 或容器环境中导出它,或通过 `options.env` 传递它。

233 

234以下示例为在 Bedrock 上运行的代理启用 1 小时 TTL:

235 

236<CodeGroup>

237 ```python Python theme={null}

238 options = ClaudeAgentOptions(

239 env={

240 "CLAUDE_CODE_USE_BEDROCK": "1",

241 "ENABLE_PROMPT_CACHING_1H": "1",

242 },

243 )

244 ```

245 

246 ```typescript TypeScript theme={null}

247 const options = {

248 env: {

249 ...process.env,

250 CLAUDE_CODE_USE_BEDROCK: "1",

251 ENABLE_PROMPT_CACHING_1H: "1",

252 },

253 };

254 ```

255</CodeGroup>

256 

257具有 1 小时 TTL 的缓存写入按比 5 分钟写入更高的速率计费,因此启用此功能会用更高的写入成本换取更多的缓存读取。有关详细信息,请参阅 [提示缓存定价](https://platform.claude.com/docs/en/build-with-claude/prompt-caching)。Claude 订阅用户已自动获得 1 小时 TTL,不需要设置此变量。

258 

259## 相关文档

260 

261* [TypeScript SDK 参考](/zh-CN/agent-sdk/typescript) - 完整的 API 文档

262* [SDK 概述](/zh-CN/agent-sdk/overview) - SDK 入门

263* [SDK 权限](/zh-CN/agent-sdk/permissions) - 管理工具权限

agent-sdk/hooks.md +819 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 使用 hooks 拦截和控制代理行为

6 

7> 在代理执行的关键点使用 hooks 拦截和自定义代理行为

8 

9Hooks 是回调函数,用于响应代理事件(如工具被调用、会话启动或执行停止)运行您的代码。使用 hooks,您可以:

10 

11* **阻止危险操作**在执行前进行,如破坏性 shell 命令或未授权的文件访问

12* **记录和审计**每个工具调用,用于合规性、调试或分析

13* **转换输入和输出**以清理数据、注入凭证或重定向文件路径

14* **要求人工批准**敏感操作,如数据库写入或 API 调用

15* **跟踪会话生命周期**以管理状态、清理资源或发送通知

16 

17本指南涵盖 hooks 的工作原理、如何配置它们,并提供常见模式的示例,如阻止工具、修改输入和转发通知。

18 

19## Hooks 如何工作

20 

21<Steps>

22 <Step title="事件触发">

23 代理执行期间发生某事,SDK 触发事件:工具即将被调用(`PreToolUse`)、工具返回结果(`PostToolUse`)、子代理启动或停止、代理空闲或执行完成。请参阅[完整事件列表](#available-hooks)。

24 </Step>

25 

26 <Step title="SDK 收集已注册的 hooks">

27 SDK 检查为该事件类型注册的 hooks。这包括您在 `options.hooks` 中传递的回调 hooks 和来自设置文件的 shell 命令 hooks,当相应的 [`settingSources`](/zh-CN/agent-sdk/typescript#setting-source) 或 [`setting_sources`](/zh-CN/agent-sdk/python#setting-source) 条目启用时(默认 `query()` 选项就是这样)。

28 </Step>

29 

30 <Step title="匹配器过滤哪些 hooks 运行">

31 如果 hook 有 [`matcher`](#matchers) 模式(如 `"Write|Edit"`),SDK 会针对事件的目标(例如工具名称)测试它。没有匹配器的 hooks 对该类型的每个事件都运行。

32 </Step>

33 

34 <Step title="回调函数执行">

35 每个匹配的 hook 的[回调函数](#callback-functions)接收有关正在发生的事情的输入:工具名称、其参数、会话 ID 和其他事件特定的详细信息。

36 </Step>

37 

38 <Step title="您的回调返回决定">

39 执行任何操作(日志记录、API 调用、验证)后,您的回调返回一个[输出对象](#outputs),告诉代理该做什么:允许操作、阻止它、修改输入或将上下文注入到对话中。

40 </Step>

41</Steps>

42 

43以下示例将这些步骤组合在一起。它注册一个 `PreToolUse` hook(步骤 1),带有 `"Write|Edit"` 匹配器(步骤 3),因此回调仅对文件写入工具触发。触发时,回调接收工具的输入(步骤 4),检查文件路径是否针对 `.env` 文件,并返回 `permissionDecision: "deny"` 以阻止操作(步骤 5):

44 

45<CodeGroup>

46 ```python Python theme={null}

47 import asyncio

48 from claude_agent_sdk import (

49 AssistantMessage,

50 ClaudeSDKClient,

51 ClaudeAgentOptions,

52 HookMatcher,

53 ResultMessage,

54 )

55 

56 

57 # 定义一个接收工具调用详细信息的 hook 回调

58 async def protect_env_files(input_data, tool_use_id, context):

59 # 从工具的输入参数中提取文件路径

60 file_path = input_data["tool_input"].get("file_path", "")

61 file_name = file_path.split("/")[-1]

62 

63 # 如果针对 .env 文件,阻止操作

64 if file_name == ".env":

65 return {

66 "hookSpecificOutput": {

67 "hookEventName": input_data["hook_event_name"],

68 "permissionDecision": "deny",

69 "permissionDecisionReason": "Cannot modify .env files",

70 }

71 }

72 

73 # 返回空对象以允许操作

74 return {}

75 

76 

77 async def main():

78 options = ClaudeAgentOptions(

79 hooks={

80 # 为 PreToolUse 事件注册 hook

81 # 匹配器仅过滤 Write 和 Edit 工具调用

82 "PreToolUse": [HookMatcher(matcher="Write|Edit", hooks=[protect_env_files])]

83 }

84 )

85 

86 async with ClaudeSDKClient(options=options) as client:

87 await client.query("Update the database configuration")

88 async for message in client.receive_response():

89 # 过滤助手和结果消息

90 if isinstance(message, (AssistantMessage, ResultMessage)):

91 print(message)

92 

93 

94 asyncio.run(main())

95 ```

96 

97 ```typescript TypeScript theme={null}

98 import { query, HookCallback, PreToolUseHookInput } from "@anthropic-ai/claude-agent-sdk";

99 

100 // 使用 HookCallback 类型定义 hook 回调

101 const protectEnvFiles: HookCallback = async (input, toolUseID, { signal }) => {

102 // 将输入转换为特定 hook 类型以获得类型安全

103 const preInput = input as PreToolUseHookInput;

104 

105 // 转换 tool_input 以访问其属性(在 SDK 中类型为 unknown)

106 const toolInput = preInput.tool_input as Record<string, unknown>;

107 const filePath = toolInput?.file_path as string;

108 const fileName = filePath?.split("/").pop();

109 

110 // 如果针对 .env 文件,阻止操作

111 if (fileName === ".env") {

112 return {

113 hookSpecificOutput: {

114 hookEventName: preInput.hook_event_name,

115 permissionDecision: "deny",

116 permissionDecisionReason: "Cannot modify .env files"

117 }

118 };

119 }

120 

121 // 返回空对象以允许操作

122 return {};

123 };

124 

125 for await (const message of query({

126 prompt: "Update the database configuration",

127 options: {

128 hooks: {

129 // 为 PreToolUse 事件注册 hook

130 // 匹配器仅过滤 Write 和 Edit 工具调用

131 PreToolUse: [{ matcher: "Write|Edit", hooks: [protectEnvFiles] }]

132 }

133 }

134 })) {

135 // 过滤助手和结果消息

136 if (message.type === "assistant" || message.type === "result") {

137 console.log(message);

138 }

139 }

140 ```

141</CodeGroup>

142 

143## 可用的 hooks

144 

145SDK 为代理执行的不同阶段提供 hooks。某些 hooks 在两个 SDK 中都可用,而其他 hooks 仅在 TypeScript 中可用。

146 

147| Hook 事件 | Python SDK | TypeScript SDK | 触发条件 | 示例用例 |

148| -------------------- | ---------- | -------------- | ------------------------- | ---------------------------- |

149| `PreToolUse` | 是 | 是 | 工具调用请求(可以阻止或修改) | 阻止危险的 shell 命令 |

150| `PostToolUse` | 是 | 是 | 工具执行结果 | 将所有文件更改记录到审计跟踪 |

151| `PostToolUseFailure` | 是 | 是 | 工具执行失败 | 处理或记录工具错误 |

152| `PostToolBatch` | 否 | 是 | 一整批工具调用解决,每批一次,在下一个模型调用之前 | 为整个批次注入约定 |

153| `UserPromptSubmit` | 是 | 是 | 用户提示提交 | 将额外上下文注入到提示中 |

154| `Stop` | 是 | 是 | 代理执行停止 | 在退出前保存会话状态 |

155| `SubagentStart` | 是 | 是 | 子代理初始化 | 跟踪并行任务生成 |

156| `SubagentStop` | 是 | 是 | 子代理完成 | 聚合来自并行任务的结果 |

157| `PreCompact` | 是 | 是 | 对话压缩请求 | 在总结前存档完整记录 |

158| `PermissionRequest` | 是 | 是 | 权限对话将显示 | 自定义权限处理 |

159| `SessionStart` | 否 | 是 | 会话初始化 | 初始化日志记录和遥测 |

160| `SessionEnd` | 否 | 是 | 会话终止 | 清理临时资源 |

161| `Notification` | 是 | 是 | 代理状态消息 | 将代理状态更新发送到 Slack 或 PagerDuty |

162| `Setup` | 否 | 是 | 会话设置/维护 | 运行初始化任务 |

163| `TeammateIdle` | 否 | 是 | 队友变为空闲 | 重新分配工作或通知 |

164| `TaskCompleted` | 否 | 是 | 后台任务完成 | 聚合来自并行任务的结果 |

165| `ConfigChange` | 否 | 是 | 配置文件更改 | 动态重新加载设置 |

166| `WorktreeCreate` | 否 | 是 | Git worktree 创建 | 跟踪隔离的工作区 |

167| `WorktreeRemove` | 否 | 是 | Git worktree 移除 | 清理工作区资源 |

168 

169## 配置 hooks

170 

171要配置 hook,请在您的代理选项的 `hooks` 字段中传递它(Python 中的 `ClaudeAgentOptions`,TypeScript 中的 `options` 对象):

172 

173<CodeGroup>

174 ```python Python theme={null}

175 options = ClaudeAgentOptions(

176 hooks={"PreToolUse": [HookMatcher(matcher="Bash", hooks=[my_callback])]}

177 )

178 

179 async with ClaudeSDKClient(options=options) as client:

180 await client.query("Your prompt")

181 async for message in client.receive_response():

182 print(message)

183 ```

184 

185 ```typescript TypeScript theme={null}

186 for await (const message of query({

187 prompt: "Your prompt",

188 options: {

189 hooks: {

190 PreToolUse: [{ matcher: "Bash", hooks: [myCallback] }]

191 }

192 }

193 })) {

194 console.log(message);

195 }

196 ```

197</CodeGroup>

198 

199`hooks` 选项是一个字典(Python)或对象(TypeScript),其中:

200 

201* **键**是 [hook 事件名称](#available-hooks)(例如 `'PreToolUse'`、`'PostToolUse'`、`'Stop'`)

202* **值**是[匹配器](#matchers)数组,每个包含可选的过滤模式和您的[回调函数](#callback-functions)

203 

204### 匹配器

205 

206使用匹配器来过滤您的回调何时触发。`matcher` 字段是一个正则表达式字符串,根据 hook 事件类型匹配不同的值。例如,基于工具的 hooks 匹配工具名称,而 `Notification` hooks 匹配通知类型。请参阅 [Claude Code hooks 参考](/zh-CN/hooks#matcher-patterns)以获取每个事件类型的匹配器值的完整列表。

207 

208| 选项 | 类型 | 默认值 | 描述 |

209| --------- | ---------------- | ----------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

210| `matcher` | `string` | `undefined` | 针对事件的过滤字段匹配的正则表达式模式。对于工具 hooks,这是工具名称。内置工具包括 `Bash`、`Read`、`Write`、`Edit`、`Glob`、`Grep`、`WebFetch`、`Agent` 等(请参阅[工具输入类型](/zh-CN/agent-sdk/typescript#tool-input-types)以获取完整列表)。MCP 工具使用模式 `mcp__<server>__<action>`。 |

211| `hooks` | `HookCallback[]` | - | 必需。当模式匹配时执行的回调函数数组 |

212| `timeout` | `number` | `60` | 超时时间(秒) |

213 

214尽可能使用 `matcher` 模式来针对特定工具。带有 `'Bash'` 的匹配器仅对 Bash 命令运行,而省略模式会为事件的每次出现运行您的回调。请注意,对于基于工具的 hooks,匹配器仅按**工具名称**过滤,而不是按文件路径或其他参数。要按文件路径过滤,请在回调内检查 `tool_input.file_path`。

215 

216<Tip>

217 **发现工具名称:** 请参阅[工具输入类型](/zh-CN/agent-sdk/typescript#tool-input-types)以获取内置工具名称的完整列表,或添加没有匹配器的 hook 来记录您的会话进行的所有工具调用。

218 

219 **MCP 工具命名:** MCP 工具始终以 `mcp__` 开头,后跟服务器名称和操作:`mcp__<server>__<action>`。例如,如果您配置一个名为 `playwright` 的服务器,其工具将被命名为 `mcp__playwright__browser_screenshot`、`mcp__playwright__browser_click` 等。服务器名称来自您在 `mcpServers` 配置中使用的键。

220</Tip>

221 

222### 回调函数

223 

224#### 输入

225 

226每个 hook 回调接收三个参数:

227 

228* **输入数据:** 一个包含事件详细信息的类型化对象。每个 hook 类型都有自己的输入形状(例如,`PreToolUseHookInput` 包括 `tool_name` 和 `tool_input`,而 `NotificationHookInput` 包括 `message`)。请参阅 [TypeScript](/zh-CN/agent-sdk/typescript#hook-input) 和 [Python](/zh-CN/agent-sdk/python#hook-input) SDK 参考中的完整类型定义。

229 * 所有 hook 输入共享 `session_id`、`cwd` 和 `hook_event_name`。

230 * 当 hook 在子代理内触发时,`agent_id` 和 `agent_type` 被填充。在 TypeScript 中,这些在基础 hook 输入上,对所有 hook 类型都可用。在 Python 中,它们仅在 `PreToolUse`、`PostToolUse` 和 `PostToolUseFailure` 上。

231* **工具使用 ID**(`str | None` / `string | undefined`):关联同一工具调用的 `PreToolUse` 和 `PostToolUse` 事件。

232* **上下文:** 在 TypeScript 中,包含用于取消的 `signal` 属性(`AbortSignal`)。在 Python 中,此参数保留供将来使用。

233 

234#### 输出

235 

236您的回调返回一个具有两类字段的对象:

237 

238* **顶级字段**控制对话:`systemMessage` 将消息注入到对话中,对模型可见,`continue`(Python 中的 `continue_`)确定代理在此 hook 后是否继续运行。

239* **`hookSpecificOutput`** 控制当前操作。内部的字段取决于 hook 事件类型。对于 `PreToolUse` hooks,这是您设置 `permissionDecision`(`"allow"`、`"deny"` 或 `"ask"`)、`permissionDecisionReason` 和 `updatedInput` 的地方。在 TypeScript SDK 中,`permissionDecision` 也接受 `"defer"` 以结束查询并[稍后恢复](/zh-CN/hooks#defer-a-tool-call-for-later);此值在 Python SDK 中不可用。对于 `PostToolUse` hooks,您可以设置 `additionalContext` 以将信息附加到工具结果。

240 

241返回 `{}` 以允许操作而不进行更改。SDK 回调 hooks 使用与 [Claude Code shell 命令 hooks](/zh-CN/hooks#json-output) 相同的 JSON 输出格式,其中记录了每个字段和事件特定的选项。对于 SDK 类型定义,请参阅 [TypeScript](/zh-CN/agent-sdk/typescript#sync-hook-json-output) 和 [Python](/zh-CN/agent-sdk/python#sync-hook-json-output) SDK 参考。

242 

243<Note>

244 当多个 hooks 或权限规则适用时,**deny** 优先于 **defer**,**defer** 优先于 **ask**,**ask** 优先于 **allow**。如果任何 hook 返回 `deny`,操作将被阻止,无论其他 hooks 如何。

245</Note>

246 

247#### 异步输出

248 

249默认情况下,代理在您的 hook 返回前等待。如果您的 hook 执行副作用(日志记录、发送 webhook)并且不需要影响代理的行为,您可以改为返回异步输出。这告诉代理立即继续,而不等待 hook 完成:

250 

251<CodeGroup>

252 ```python Python theme={null}

253 async def async_hook(input_data, tool_use_id, context):

254 # 启动后台任务,然后立即返回

255 asyncio.create_task(send_to_logging_service(input_data))

256 return {"async_": True, "asyncTimeout": 30000}

257 ```

258 

259 ```typescript TypeScript theme={null}

260 const asyncHook: HookCallback = async (input, toolUseID, { signal }) => {

261 // 启动后台任务,然后立即返回

262 sendToLoggingService(input).catch(console.error);

263 return { async: true, asyncTimeout: 30000 };

264 };

265 ```

266</CodeGroup>

267 

268| 字段 | 类型 | 描述 |

269| -------------- | -------- | ------------------------------------------------ |

270| `async` | `true` | 表示异步模式。代理继续而不等待。在 Python 中,使用 `async_` 以避免保留关键字。 |

271| `asyncTimeout` | `number` | 后台操作的可选超时时间(毫秒) |

272 

273<Note>

274 异步输出无法阻止、修改或将上下文注入到操作中,因为代理已经继续。仅将它们用于日志记录、指标或通知等副作用。

275</Note>

276 

277## 示例

278 

279### 修改工具输入

280 

281此示例拦截 Write 工具调用并重写 `file_path` 参数以添加 `/sandbox` 前缀,将所有文件写入重定向到沙箱目录。回调返回带有修改路径的 `updatedInput` 和 `permissionDecision: 'allow'` 以自动批准重写的操作:

282 

283<CodeGroup>

284 ```python Python theme={null}

285 async def redirect_to_sandbox(input_data, tool_use_id, context):

286 if input_data["hook_event_name"] != "PreToolUse":

287 return {}

288 

289 if input_data["tool_name"] == "Write":

290 original_path = input_data["tool_input"].get("file_path", "")

291 return {

292 "hookSpecificOutput": {

293 "hookEventName": input_data["hook_event_name"],

294 "permissionDecision": "allow",

295 "updatedInput": {

296 **input_data["tool_input"],

297 "file_path": f"/sandbox{original_path}",

298 },

299 }

300 }

301 return {}

302 ```

303 

304 ```typescript TypeScript theme={null}

305 const redirectToSandbox: HookCallback = async (input, toolUseID, { signal }) => {

306 if (input.hook_event_name !== "PreToolUse") return {};

307 

308 const preInput = input as PreToolUseHookInput;

309 const toolInput = preInput.tool_input as Record<string, unknown>;

310 if (preInput.tool_name === "Write") {

311 const originalPath = toolInput.file_path as string;

312 return {

313 hookSpecificOutput: {

314 hookEventName: preInput.hook_event_name,

315 permissionDecision: "allow",

316 updatedInput: {

317 ...toolInput,

318 file_path: `/sandbox${originalPath}`

319 }

320 }

321 };

322 }

323 return {};

324 };

325 ```

326</CodeGroup>

327 

328<Note>

329 使用 `updatedInput` 时,您还必须包括 `permissionDecision: 'allow'`。始终返回新对象而不是改变原始 `tool_input`。

330</Note>

331 

332### 添加上下文并阻止工具

333 

334此示例阻止任何尝试写入 `/etc` 目录的操作,并将两个输出字段一起使用:`permissionDecision: 'deny'` 停止工具调用,而 `systemMessage` 将提醒注入到对话中,以便代理接收有关操作被阻止原因的上下文并避免重试:

335 

336<CodeGroup>

337 ```python Python theme={null}

338 async def block_etc_writes(input_data, tool_use_id, context):

339 file_path = input_data["tool_input"].get("file_path", "")

340 

341 if file_path.startswith("/etc"):

342 return {

343 # 顶级字段:将指导注入到对话中

344 "systemMessage": "Remember: system directories like /etc are protected.",

345 # hookSpecificOutput:阻止操作

346 "hookSpecificOutput": {

347 "hookEventName": input_data["hook_event_name"],

348 "permissionDecision": "deny",

349 "permissionDecisionReason": "Writing to /etc is not allowed",

350 },

351 }

352 return {}

353 ```

354 

355 ```typescript TypeScript theme={null}

356 const blockEtcWrites: HookCallback = async (input, toolUseID, { signal }) => {

357 const preInput = input as PreToolUseHookInput;

358 const toolInput = preInput.tool_input as Record<string, unknown>;

359 const filePath = toolInput?.file_path as string;

360 

361 if (filePath?.startsWith("/etc")) {

362 return {

363 // 顶级字段:将指导注入到对话中

364 systemMessage: "Remember: system directories like /etc are protected.",

365 // hookSpecificOutput:阻止操作

366 hookSpecificOutput: {

367 hookEventName: preInput.hook_event_name,

368 permissionDecision: "deny",

369 permissionDecisionReason: "Writing to /etc is not allowed"

370 }

371 };

372 }

373 return {};

374 };

375 ```

376</CodeGroup>

377 

378### 自动批准特定工具

379 

380默认情况下,代理可能在使用某些工具前提示权限。此示例通过返回 `permissionDecision: 'allow'` 自动批准只读文件系统工具(Read、Glob、Grep),让它们无需用户确认即可运行,同时让所有其他工具受到正常权限检查:

381 

382<CodeGroup>

383 ```python Python theme={null}

384 async def auto_approve_read_only(input_data, tool_use_id, context):

385 if input_data["hook_event_name"] != "PreToolUse":

386 return {}

387 

388 read_only_tools = ["Read", "Glob", "Grep"]

389 if input_data["tool_name"] in read_only_tools:

390 return {

391 "hookSpecificOutput": {

392 "hookEventName": input_data["hook_event_name"],

393 "permissionDecision": "allow",

394 "permissionDecisionReason": "Read-only tool auto-approved",

395 }

396 }

397 return {}

398 ```

399 

400 ```typescript TypeScript theme={null}

401 const autoApproveReadOnly: HookCallback = async (input, toolUseID, { signal }) => {

402 if (input.hook_event_name !== "PreToolUse") return {};

403 

404 const preInput = input as PreToolUseHookInput;

405 const readOnlyTools = ["Read", "Glob", "Grep"];

406 if (readOnlyTools.includes(preInput.tool_name)) {

407 return {

408 hookSpecificOutput: {

409 hookEventName: preInput.hook_event_name,

410 permissionDecision: "allow",

411 permissionDecisionReason: "Read-only tool auto-approved"

412 }

413 };

414 }

415 return {};

416 };

417 ```

418</CodeGroup>

419 

420### 链接多个 hooks

421 

422Hooks 按它们在数组中出现的顺序执行。保持每个 hook 专注于单一责任,并为复杂逻辑链接多个 hooks:

423 

424<CodeGroup>

425 ```python Python theme={null}

426 options = ClaudeAgentOptions(

427 hooks={

428 "PreToolUse": [

429 HookMatcher(hooks=[rate_limiter]), # 首先:检查速率限制

430 HookMatcher(hooks=[authorization_check]), # 其次:验证权限

431 HookMatcher(hooks=[input_sanitizer]), # 第三:清理输入

432 HookMatcher(hooks=[audit_logger]), # 最后:记录操作

433 ]

434 }

435 )

436 ```

437 

438 ```typescript TypeScript theme={null}

439 const options = {

440 hooks: {

441 PreToolUse: [

442 { hooks: [rateLimiter] }, // 首先:检查速率限制

443 { hooks: [authorizationCheck] }, // 其次:验证权限

444 { hooks: [inputSanitizer] }, // 第三:清理输入

445 { hooks: [auditLogger] } // 最后:记录操作

446 ]

447 }

448 };

449 ```

450</CodeGroup>

451 

452### 使用正则表达式匹配器过滤

453 

454使用正则表达式模式匹配多个工具。此示例注册三个具有不同范围的匹配器:第一个仅对文件修改工具触发 `file_security_hook`,第二个对任何 MCP 工具(名称以 `mcp__` 开头的工具)触发 `mcp_audit_hook`,第三个对每个工具调用(无论名称如何)触发 `global_logger`:

455 

456<CodeGroup>

457 ```python Python theme={null}

458 options = ClaudeAgentOptions(

459 hooks={

460 "PreToolUse": [

461 # 匹配文件修改工具

462 HookMatcher(matcher="Write|Edit|Delete", hooks=[file_security_hook]),

463 # 匹配所有 MCP 工具

464 HookMatcher(matcher="^mcp__", hooks=[mcp_audit_hook]),

465 # 匹配所有内容(无匹配器)

466 HookMatcher(hooks=[global_logger]),

467 ]

468 }

469 )

470 ```

471 

472 ```typescript TypeScript theme={null}

473 const options = {

474 hooks: {

475 PreToolUse: [

476 // 匹配文件修改工具

477 { matcher: "Write|Edit|Delete", hooks: [fileSecurityHook] },

478 

479 // 匹配所有 MCP 工具

480 { matcher: "^mcp__", hooks: [mcpAuditHook] },

481 

482 // 匹配所有内容(无匹配器)

483 { hooks: [globalLogger] }

484 ]

485 }

486 };

487 ```

488</CodeGroup>

489 

490### 跟踪子代理活动

491 

492使用 `SubagentStop` hooks 监控子代理何时完成其工作。请参阅 [TypeScript](/zh-CN/agent-sdk/typescript#hook-input) 和 [Python](/zh-CN/agent-sdk/python#hook-input) SDK 参考中的完整输入类型。此示例在每次子代理完成时记录摘要:

493 

494<CodeGroup>

495 ```python Python theme={null}

496 async def subagent_tracker(input_data, tool_use_id, context):

497 # 子代理完成时记录子代理详细信息

498 print(f"[SUBAGENT] Completed: {input_data['agent_id']}")

499 print(f" Transcript: {input_data['agent_transcript_path']}")

500 print(f" Tool use ID: {tool_use_id}")

501 print(f" Stop hook active: {input_data.get('stop_hook_active')}")

502 return {}

503 

504 

505 options = ClaudeAgentOptions(

506 hooks={"SubagentStop": [HookMatcher(hooks=[subagent_tracker])]}

507 )

508 ```

509 

510 ```typescript TypeScript theme={null}

511 import { HookCallback, SubagentStopHookInput } from "@anthropic-ai/claude-agent-sdk";

512 

513 const subagentTracker: HookCallback = async (input, toolUseID, { signal }) => {

514 // 转换为 SubagentStopHookInput 以访问子代理特定字段

515 const subInput = input as SubagentStopHookInput;

516 

517 // 子代理完成时记录子代理详细信息

518 console.log(`[SUBAGENT] Completed: ${subInput.agent_id}`);

519 console.log(` Transcript: ${subInput.agent_transcript_path}`);

520 console.log(` Tool use ID: ${toolUseID}`);

521 console.log(` Stop hook active: ${subInput.stop_hook_active}`);

522 return {};

523 };

524 

525 const options = {

526 hooks: {

527 SubagentStop: [{ hooks: [subagentTracker] }]

528 }

529 };

530 ```

531</CodeGroup>

532 

533### 从 hooks 发出 HTTP 请求

534 

535Hooks 可以执行异步操作,如 HTTP 请求。在您的 hook 内捕获错误,而不是让它们传播,因为未处理的异常可能会中断代理。

536 

537此示例在每个工具完成后发送 webhook,记录哪个工具运行以及何时运行。hook 捕获错误,以便失败的 webhook 不会中断代理:

538 

539<CodeGroup>

540 ```python Python theme={null}

541 import asyncio

542 import json

543 import urllib.request

544 from datetime import datetime

545 

546 

547 def _send_webhook(tool_name):

548 """同步辅助函数,将工具使用数据 POST 到外部 webhook。"""

549 data = json.dumps(

550 {

551 "tool": tool_name,

552 "timestamp": datetime.now().isoformat(),

553 }

554 ).encode()

555 req = urllib.request.Request(

556 "https://api.example.com/webhook",

557 data=data,

558 headers={"Content-Type": "application/json"},

559 method="POST",

560 )

561 urllib.request.urlopen(req)

562 

563 

564 async def webhook_notifier(input_data, tool_use_id, context):

565 # 仅在工具完成后触发(PostToolUse),而不是之前

566 if input_data["hook_event_name"] != "PostToolUse":

567 return {}

568 

569 try:

570 # 在线程中运行阻塞 HTTP 调用以避免阻塞事件循环

571 await asyncio.to_thread(_send_webhook, input_data["tool_name"])

572 except Exception as e:

573 # 记录错误但不抛出。失败的 webhook 不应停止代理

574 print(f"Webhook request failed: {e}")

575 

576 return {}

577 ```

578 

579 ```typescript TypeScript theme={null}

580 import { query, HookCallback, PostToolUseHookInput } from "@anthropic-ai/claude-agent-sdk";

581 

582 const webhookNotifier: HookCallback = async (input, toolUseID, { signal }) => {

583 // 仅在工具完成后触发(PostToolUse),而不是之前

584 if (input.hook_event_name !== "PostToolUse") return {};

585 

586 try {

587 await fetch("https://api.example.com/webhook", {

588 method: "POST",

589 headers: { "Content-Type": "application/json" },

590 body: JSON.stringify({

591 tool: (input as PostToolUseHookInput).tool_name,

592 timestamp: new Date().toISOString()

593 }),

594 // 传递 signal 以便在 hook 超时时请求取消

595 signal

596 });

597 } catch (error) {

598 // 分别处理取消和其他错误

599 if (error instanceof Error && error.name === "AbortError") {

600 console.log("Webhook request cancelled");

601 }

602 // 不重新抛出。失败的 webhook 不应停止代理

603 }

604 

605 return {};

606 };

607 

608 // 注册为 PostToolUse hook

609 for await (const message of query({

610 prompt: "Refactor the auth module",

611 options: {

612 hooks: {

613 PostToolUse: [{ hooks: [webhookNotifier] }]

614 }

615 }

616 })) {

617 console.log(message);

618 }

619 ```

620</CodeGroup>

621 

622### 将通知转发到 Slack

623 

624使用 `Notification` hooks 从代理接收系统通知并将其转发到外部服务。通知针对特定事件类型触发:`permission_prompt`(Claude 需要权限)、`idle_prompt`(Claude 等待输入)、`auth_success`(身份验证完成)和 `elicitation_dialog`(Claude 提示用户)。每个通知包括一个带有人类可读描述的 `message` 字段,以及可选的 `title`。

625 

626此示例将每个通知转发到 Slack 频道。它需要一个 [Slack 传入 webhook URL](https://api.slack.com/messaging/webhooks),您可以通过将应用添加到您的 Slack 工作区并启用传入 webhooks 来创建:

627 

628<CodeGroup>

629 ```python Python theme={null}

630 import asyncio

631 import json

632 import urllib.request

633 

634 from claude_agent_sdk import ClaudeSDKClient, ClaudeAgentOptions, HookMatcher

635 

636 

637 def _send_slack_notification(message):

638 """同步辅助函数,通过传入 webhook 向 Slack 发送消息。"""

639 data = json.dumps({"text": f"Agent status: {message}"}).encode()

640 req = urllib.request.Request(

641 "https://hooks.slack.com/services/YOUR/WEBHOOK/URL",

642 data=data,

643 headers={"Content-Type": "application/json"},

644 method="POST",

645 )

646 urllib.request.urlopen(req)

647 

648 

649 async def notification_handler(input_data, tool_use_id, context):

650 try:

651 # 在线程中运行阻塞 HTTP 调用以避免阻塞事件循环

652 await asyncio.to_thread(_send_slack_notification, input_data.get("message", ""))

653 except Exception as e:

654 print(f"Failed to send notification: {e}")

655 

656 # 返回空对象。通知 hooks 不修改代理行为

657 return {}

658 

659 

660 async def main():

661 options = ClaudeAgentOptions(

662 hooks={

663 # 为通知事件注册 hook(不需要匹配器)

664 "Notification": [HookMatcher(hooks=[notification_handler])],

665 },

666 )

667 

668 async with ClaudeSDKClient(options=options) as client:

669 await client.query("Analyze this codebase")

670 async for message in client.receive_response():

671 print(message)

672 

673 

674 asyncio.run(main())

675 ```

676 

677 ```typescript TypeScript theme={null}

678 import { query, HookCallback, NotificationHookInput } from "@anthropic-ai/claude-agent-sdk";

679 

680 // 定义一个将通知发送到 Slack 的 hook 回调

681 const notificationHandler: HookCallback = async (input, toolUseID, { signal }) => {

682 // 转换为 NotificationHookInput 以访问消息字段

683 const notification = input as NotificationHookInput;

684 

685 try {

686 // 将通知消息 POST 到 Slack 传入 webhook

687 await fetch("https://hooks.slack.com/services/YOUR/WEBHOOK/URL", {

688 method: "POST",

689 headers: { "Content-Type": "application/json" },

690 body: JSON.stringify({

691 text: `Agent status: ${notification.message}`

692 }),

693 // 传递 signal 以便在 hook 超时时请求取消

694 signal

695 });

696 } catch (error) {

697 if (error instanceof Error && error.name === "AbortError") {

698 console.log("Notification cancelled");

699 } else {

700 console.error("Failed to send notification:", error);

701 }

702 }

703 

704 // 返回空对象。通知 hooks 不修改代理行为

705 return {};

706 };

707 

708 // 为通知事件注册 hook(不需要匹配器)

709 for await (const message of query({

710 prompt: "Analyze this codebase",

711 options: {

712 hooks: {

713 Notification: [{ hooks: [notificationHandler] }]

714 }

715 }

716 })) {

717 console.log(message);

718 }

719 ```

720</CodeGroup>

721 

722## 修复常见问题

723 

724### Hook 未触发

725 

726* 验证 hook 事件名称正确且区分大小写(`PreToolUse`,而不是 `preToolUse`)

727* 检查您的匹配器模式是否与工具名称完全匹配

728* 确保 hook 在 `options.hooks` 中的正确事件类型下

729* 对于非工具 hooks,如 `Stop` 和 `SubagentStop`,匹配器匹配不同的字段(请参阅[匹配器模式](/zh-CN/hooks#matcher-patterns))

730* 当代理达到 [`max_turns`](/zh-CN/agent-sdk/python#claude-agent-options) 限制时,hooks 可能不会触发,因为会话在 hooks 可以执行前结束

731 

732### 匹配器未按预期过滤

733 

734匹配器仅匹配**工具名称**,而不是文件路径或其他参数。要按文件路径过滤,请在您的 hook 内检查 `tool_input.file_path`:

735 

736```typescript theme={null}

737const myHook: HookCallback = async (input, toolUseID, { signal }) => {

738 const preInput = input as PreToolUseHookInput;

739 const toolInput = preInput.tool_input as Record<string, unknown>;

740 const filePath = toolInput?.file_path as string;

741 if (!filePath?.endsWith(".md")) return {}; // 跳过非 markdown 文件

742 // 处理 markdown 文件...

743 return {};

744};

745```

746 

747### Hook 超时

748 

749* 增加 `HookMatcher` 配置中的 `timeout` 值

750* 在 TypeScript 中使用第三个回调参数中的 `AbortSignal` 来优雅地处理取消

751 

752### 工具意外被阻止

753 

754* 检查所有 `PreToolUse` hooks 是否返回 `permissionDecision: 'deny'`

755* 向您的 hooks 添加日志记录以查看它们返回的 `permissionDecisionReason`

756* 验证匹配器模式不会太宽泛(空匹配器匹配所有工具)

757 

758### 修改的输入未应用

759 

760* 确保 `updatedInput` 在 `hookSpecificOutput` 内,而不是在顶级:

761 

762 ```typescript theme={null}

763 return {

764 hookSpecificOutput: {

765 hookEventName: "PreToolUse",

766 permissionDecision: "allow",

767 updatedInput: { command: "new command" }

768 }

769 };

770 ```

771 

772* 您还必须返回 `permissionDecision: 'allow'` 以使输入修改生效

773 

774* 在 `hookSpecificOutput` 中包括 `hookEventName` 以识别输出针对的 hook 类型

775 

776### Python 中不可用会话 hooks

777 

778`SessionStart` 和 `SessionEnd` 可以在 TypeScript 中注册为 SDK 回调 hooks,但在 Python SDK 中不可用(`HookEvent` 省略了它们)。在 Python 中,它们仅作为[shell 命令 hooks](/zh-CN/hooks#hook-events) 在设置文件中定义(例如 `.claude/settings.json`)。要从您的 SDK 应用程序加载 shell 命令 hooks,请使用 [`setting_sources`](/zh-CN/agent-sdk/python#setting-source) 或 [`settingSources`](/zh-CN/agent-sdk/typescript#setting-source) 包括适当的设置源:

779 

780<CodeGroup>

781 ```python Python theme={null}

782 options = ClaudeAgentOptions(

783 setting_sources=["project"], # 加载 .claude/settings.json 包括 hooks

784 )

785 ```

786 

787 ```typescript TypeScript theme={null}

788 const options = {

789 settingSources: ["project"] // 加载 .claude/settings.json 包括 hooks

790 };

791 ```

792</CodeGroup>

793 

794要改为运行初始化逻辑作为 Python SDK 回调,请使用 `client.receive_response()` 的第一条消息作为您的触发器。

795 

796### 子代理权限提示倍增

797 

798生成多个子代理时,每个子代理可能会单独请求权限。子代理不会自动继承父代理权限。要避免重复提示,请使用 `PreToolUse` hooks 自动批准特定工具,或配置适用于子代理会话的权限规则。

799 

800### 子代理的递归 hook 循环

801 

802生成子代理的 `UserPromptSubmit` hook 如果这些子代理触发相同的 hook,可能会创建无限循环。要防止这种情况:

803 

804* 在生成子代理前检查 hook 输入中的子代理指示符

805* 使用共享变量或会话状态来跟踪您是否已在子代理内

806* 将 hooks 范围限制为仅对顶级代理会话运行

807 

808### systemMessage 未出现在输出中

809 

810`systemMessage` 字段将上下文添加到模型看到的对话中,但它可能不会出现在所有 SDK 输出模式中。如果您需要将 hook 决定呈现给您的应用程序,请单独记录它们或使用专用输出通道。

811 

812## 相关资源

813 

814* [Claude Code hooks 参考](/zh-CN/hooks):完整的 JSON 输入/输出架构、事件文档和匹配器模式

815* [Claude Code hooks 指南](/zh-CN/hooks-guide):shell 命令 hook 示例和演练

816* [TypeScript SDK 参考](/zh-CN/agent-sdk/typescript):hook 类型、输入/输出定义和配置选项

817* [Python SDK 参考](/zh-CN/agent-sdk/python):hook 类型、输入/输出定义和配置选项

818* [权限](/zh-CN/agent-sdk/permissions):控制您的代理可以做什么

819* [自定义工具](/zh-CN/agent-sdk/custom-tools):构建工具以扩展代理功能

agent-sdk/hosting.md +142 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 托管 Agent SDK

6 

7> 在生产环境中部署和托管 Claude Agent SDK

8 

9Claude Agent SDK 与传统的无状态 LLM API 不同,它维护对话状态并在持久环境中执行命令。本指南涵盖了在生产环境中部署基于 SDK 的代理的架构、托管考虑因素和最佳实践。

10 

11<Info>

12 有关超越基本 sandboxing 的安全加固(包括网络控制、凭证管理和隔离选项),请参阅 [Secure Deployment](/zh-CN/agent-sdk/secure-deployment)。

13</Info>

14 

15## 托管要求

16 

17### 基于容器的 Sandboxing

18 

19为了安全性和隔离,SDK 应在沙箱容器环境中运行。这提供了进程隔离、资源限制、网络控制和临时文件系统。

20 

21SDK 还支持 [programmatic sandbox configuration](/zh-CN/agent-sdk/typescript#sandbox-settings) 用于命令执行。

22 

23### 系统要求

24 

25每个 SDK 实例需要:

26 

27* **运行时依赖**

28 * Python 3.10+ 用于 Python SDK,或 Node.js 18+ 用于 TypeScript SDK

29 * 两个 SDK 包都为主机平台捆绑了本地 Claude Code 二进制文件,因此不需要为生成的 CLI 单独安装 Claude Code 或 Node.js

30 

31* **资源分配**

32 * 推荐:1GiB RAM、5GiB 磁盘和 1 个 CPU(根据您的任务需要调整)

33 

34* **网络访问**

35 * 出站 HTTPS 到 `api.anthropic.com`

36 * 可选:访问 MCP 服务器或外部工具

37 

38## 理解 SDK 架构

39 

40与无状态 API 调用不同,Claude Agent SDK 作为 **长运行进程** 运行,该进程:

41 

42* **在持久 shell 环境中执行命令**

43* **在工作目录中管理文件操作**

44* **处理工具执行**,包含来自先前交互的上下文

45 

46## Sandbox 提供商选项

47 

48几个提供商专门提供用于 AI 代码执行的安全容器环境:

49 

50* **[Modal Sandbox](https://modal.com/docs/guide/sandbox)** - [demo implementation](https://modal.com/docs/examples/claude-slack-gif-creator)

51* **[Cloudflare Sandboxes](https://github.com/cloudflare/sandbox-sdk)**

52* **[Daytona](https://www.daytona.io/)**

53* **[E2B](https://e2b.dev/)**

54* **[Fly Machines](https://fly.io/docs/machines/)**

55* **[Vercel Sandbox](https://vercel.com/docs/functions/sandbox)**

56 

57有关自托管选项(Docker、gVisor、Firecracker)和详细的隔离配置,请参阅 [Isolation Technologies](/zh-CN/agent-sdk/secure-deployment#isolation-technologies)。

58 

59## 生产部署模式

60 

61### 模式 1:临时会话

62 

63为每个用户任务创建一个新容器,然后在完成时销毁它。

64 

65最适合一次性任务,用户可能在任务完成时仍与 AI 交互,但一旦完成,容器就会被销毁。

66 

67**示例:**

68 

69* Bug 调查和修复:使用相关上下文调试和解决特定问题

70* 发票处理:从收据/发票中提取和结构化数据用于会计系统

71* 翻译任务:在语言之间翻译文档或内容批次

72* 图像/视频处理:对媒体文件应用转换、优化或提取元数据

73 

74### 模式 2:长运行会话

75 

76为长运行任务维护持久容器实例。通常在容器内根据需求运行 **多个** Claude Agent 进程。

77 

78最适合主动代理,这些代理在没有用户输入的情况下采取行动,提供内容的代理或处理大量消息的代理。

79 

80**示例:**

81 

82* 电子邮件代理:监控传入电子邮件并根据内容自主分类、响应或采取行动

83* 网站构建器:为每个用户托管自定义网站,具有通过容器端口提供的实时编辑功能

84* 高频聊天机器人:处理来自 Slack 等平台的连续消息流,其中需要快速响应时间

85 

86### 模式 3:混合会话

87 

88临时容器,使用历史和状态进行补充,可能来自数据库或 SDK 的会话恢复功能。

89 

90最适合与用户进行间歇性交互的容器,启动工作并在工作完成时关闭,但可以继续。

91 

92**示例:**

93 

94* 个人项目管理器:帮助管理进行中的项目,进行间歇性检查,维护任务、决策和进度的上下文

95* 深度研究:进行多小时的研究任务,保存发现并在用户返回时恢复调查

96* 客户支持代理:处理跨越多个交互的支持票证,加载票证历史和客户上下文

97 

98### 模式 4:单个容器

99 

100在一个全局容器中运行多个 Claude Agent SDK 进程。

101 

102最适合必须紧密协作的代理。这可能是最不受欢迎的模式,因为您必须防止代理相互覆盖。

103 

104**示例:**

105 

106* **模拟**:在模拟中相互交互的代理,例如视频游戏。

107 

108## 常见问题

109 

110### 我如何与我的 sandboxes 通信?

111 

112在容器中托管时,暴露端口以与您的 SDK 实例通信。您的应用程序可以为外部客户端暴露 HTTP/WebSocket 端点,而 SDK 在容器内部运行。

113 

114### 托管容器的成本是多少?

115 

116提供代理的主要成本是令牌;容器根据您配置的内容而异,但最低成本大约是每小时运行 5 美分。

117 

118### 我应该何时关闭空闲容器与保持它们温暖?

119 

120这可能取决于提供商,不同的 sandbox 提供商将让您为空闲超时设置不同的条件,之后 sandbox 可能会关闭。

121您需要根据您认为用户响应可能的频率来调整此超时。

122 

123### 我应该多久更新一次 Claude Code CLI?

124 

125Claude Code CLI 使用 semver 进行版本控制,因此任何破坏性更改都将被版本化。

126 

127### 我如何监控容器健康和代理性能?

128 

129由于容器只是服务器,您用于后端的相同日志记录基础设施将适用于容器。

130 

131### 代理会话在超时前可以运行多长时间?

132 

133代理会话不会超时,但考虑设置 'maxTurns' 属性以防止 Claude 陷入循环。

134 

135## 后续步骤

136 

137* [Secure Deployment](/zh-CN/agent-sdk/secure-deployment) - 网络控制、凭证管理和隔离加固

138* [TypeScript SDK - Sandbox Settings](/zh-CN/agent-sdk/typescript#sandbox-settings) - 以编程方式配置 sandbox

139* [Sessions Guide](/zh-CN/agent-sdk/sessions) - 了解会话管理

140* [Permissions](/zh-CN/agent-sdk/permissions) - 配置工具权限

141* [Cost Tracking](/zh-CN/agent-sdk/cost-tracking) - 监控 API 使用情况

142* [MCP Integration](/zh-CN/agent-sdk/mcp) - 使用自定义工具扩展

agent-sdk/overview.md +607 −0 created

Details

1> ## Documentation Index

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

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

4 

5# Agent SDK 概览

6 

7> 使用 Claude Code 作为库构建生产级 AI 代理

8 

9<Note>

10 Claude Code SDK 已重命名为 Claude Agent SDK。如果您正在从旧 SDK 迁移,请参阅[迁移指南](/zh-CN/agent-sdk/migration-guide)。

11</Note>

12 

13构建能够自主读取文件、运行命令、搜索网络、编辑代码等的 AI 代理。Agent SDK 为您提供了与 Claude Code 相同的工具、代理循环和上下文管理,可在 Python 和 TypeScript 中编程。

14 

15<Note>

16 Opus 4.7 (`claude-opus-4-7`) 需要 Agent SDK v0.2.111 或更高版本。如果您看到 `thinking.type.enabled` API 错误,请参阅[故障排除](/zh-CN/agent-sdk/quickstart#troubleshooting)。

17</Note>

18 

19<CodeGroup>

20 ```python Python theme={null}

21 import asyncio

22 from claude_agent_sdk import query, ClaudeAgentOptions

23 

24 

25 async def main():

26 async for message in query(

27 prompt="Find and fix the bug in auth.py",

28 options=ClaudeAgentOptions(allowed_tools=["Read", "Edit", "Bash"]),

29 ):

30 print(message) # Claude reads the file, finds the bug, edits it

31 

32 

33 asyncio.run(main())

34 ```

35 

36 ```typescript TypeScript theme={null}

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

38 

39 for await (const message of query({

40 prompt: "Find and fix the bug in auth.ts",

41 options: { allowedTools: ["Read", "Edit", "Bash"] }

42 })) {

43 console.log(message); // Claude reads the file, finds the bug, edits it

44 }

45 ```

46</CodeGroup>

47 

48Agent SDK 包含用于读取文件、运行命令和编辑代码的内置工具,因此您的代理可以立即开始工作,无需您实现工具执行。深入了解快速入门或探索使用 SDK 构建的真实代理:

49 

50<CardGroup cols={2}>

51 <Card title="快速入门" icon="play" href="/zh-CN/agent-sdk/quickstart">

52 在几分钟内构建一个 bug 修复代理

53 </Card>

54 

55 <Card title="示例代理" icon="star" href="https://github.com/anthropics/claude-agent-sdk-demos">

56 电子邮件助手、研究代理等

57 </Card>

58</CardGroup>

59 

60## 开始使用

61 

62<Steps>

63 <Step title="安装 SDK">

64 <Tabs>

65 <Tab title="TypeScript">

66 ```bash theme={null}

67 npm install @anthropic-ai/claude-agent-sdk

68 ```

69 </Tab>

70 

71 <Tab title="Python">

72 ```bash theme={null}

73 pip install claude-agent-sdk

74 ```

75 </Tab>

76 </Tabs>

77 

78 <Note>

79 TypeScript SDK 为您的平台捆绑了一个本地 Claude Code 二进制文件作为可选依赖项,因此您无需单独安装 Claude Code。

80 </Note>

81 </Step>

82 

83 <Step title="设置您的 API 密钥">

84 从[控制台](https://platform.claude.com/)获取 API 密钥,然后将其设置为环境变量:

85 

86 ```bash theme={null}

87 export ANTHROPIC_API_KEY=your-api-key

88 ```

89 

90 SDK 还支持通过第三方 API 提供商进行身份验证:

91 

92 * **Amazon Bedrock**:设置 `CLAUDE_CODE_USE_BEDROCK=1` 环境变量并配置 AWS 凭证

93 * **Google Vertex AI**:设置 `CLAUDE_CODE_USE_VERTEX=1` 环境变量并配置 Google Cloud 凭证

94 * **Microsoft Azure**:设置 `CLAUDE_CODE_USE_FOUNDRY=1` 环境变量并配置 Azure 凭证

95 

96 有关详细信息,请参阅 [Bedrock](/zh-CN/amazon-bedrock)、[Vertex AI](/zh-CN/google-vertex-ai) 或 [Azure AI Foundry](/zh-CN/microsoft-foundry) 的设置指南。

97 

98 <Note>

99 除非事先获得批准,否则 Anthropic 不允许第三方开发人员为其产品(包括基于 Claude Agent SDK 构建的代理)提供 claude.ai 登录或速率限制。请改用本文档中描述的 API 密钥身份验证方法。

100 </Note>

101 </Step>

102 

103 <Step title="运行您的第一个代理">

104 此示例创建一个代理,该代理使用内置工具列出当前目录中的文件。

105 

106 <CodeGroup>

107 ```python Python theme={null}

108 import asyncio

109 from claude_agent_sdk import query, ClaudeAgentOptions

110 

111 

112 async def main():

113 async for message in query(

114 prompt="What files are in this directory?",

115 options=ClaudeAgentOptions(allowed_tools=["Bash", "Glob"]),

116 ):

117 if hasattr(message, "result"):

118 print(message.result)

119 

120 

121 asyncio.run(main())

122 ```

123 

124 ```typescript TypeScript theme={null}

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

126 

127 for await (const message of query({

128 prompt: "What files are in this directory?",

129 options: { allowedTools: ["Bash", "Glob"] }

130 })) {

131 if ("result" in message) console.log(message.result);

132 }

133 ```

134 </CodeGroup>

135 </Step>

136</Steps>

137 

138**准备好构建了吗?** 按照[快速入门](/zh-CN/agent-sdk/quickstart)在几分钟内创建一个查找和修复 bug 的代理。

139 

140## 功能

141 

142使 Claude Code 强大的一切都可在 SDK 中使用:

143 

144<Tabs>

145 <Tab title="内置工具">

146 您的代理可以开箱即用地读取文件、运行命令和搜索代码库。关键工具包括:

147 

148 | 工具 | 功能 |

149 | ------------------------------------------------------------------------------ | -------------------------------- |

150 | **Read** | 读取工作目录中的任何文件 |

151 | **Write** | 创建新文件 |

152 | **Edit** | 对现有文件进行精确编辑 |

153 | **Bash** | 运行终端命令、脚本、git 操作 |

154 | **Monitor** | 监视后台脚本并对每个输出行作为事件做出反应 |

155 | **Glob** | 按模式查找文件(`**/*.ts`、`src/**/*.py`) |

156 | **Grep** | 使用正则表达式搜索文件内容 |

157 | **WebSearch** | 搜索网络以获取当前信息 |

158 | **WebFetch** | 获取并解析网页内容 |

159 | **[AskUserQuestion](/zh-CN/agent-sdk/user-input#handle-clarifying-questions)** | 向用户提出带有多选选项的澄清问题 |

160 

161 此示例创建一个代理,该代理在您的代码库中搜索 TODO 注释:

162 

163 <CodeGroup>

164 ```python Python theme={null}

165 import asyncio

166 from claude_agent_sdk import query, ClaudeAgentOptions

167 

168 

169 async def main():

170 async for message in query(

171 prompt="Find all TODO comments and create a summary",

172 options=ClaudeAgentOptions(allowed_tools=["Read", "Glob", "Grep"]),

173 ):

174 if hasattr(message, "result"):

175 print(message.result)

176 

177 

178 asyncio.run(main())

179 ```

180 

181 ```typescript TypeScript theme={null}

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

183 

184 for await (const message of query({

185 prompt: "Find all TODO comments and create a summary",

186 options: { allowedTools: ["Read", "Glob", "Grep"] }

187 })) {

188 if ("result" in message) console.log(message.result);

189 }

190 ```

191 </CodeGroup>

192 </Tab>

193 

194 <Tab title="Hooks">

195 在代理生命周期的关键点运行自定义代码。SDK hooks 使用回调函数来验证、记录、阻止或转换代理行为。

196 

197 **可用 hooks:** `PreToolUse`、`PostToolUse`、`Stop`、`SessionStart`、`SessionEnd`、`UserPromptSubmit` 等。

198 

199 此示例将所有文件更改记录到审计文件:

200 

201 <CodeGroup>

202 ```python Python theme={null}

203 import asyncio

204 from datetime import datetime

205 from claude_agent_sdk import query, ClaudeAgentOptions, HookMatcher

206 

207 

208 async def log_file_change(input_data, tool_use_id, context):

209 file_path = input_data.get("tool_input", {}).get("file_path", "unknown")

210 with open("./audit.log", "a") as f:

211 f.write(f"{datetime.now()}: modified {file_path}\n")

212 return {}

213 

214 

215 async def main():

216 async for message in query(

217 prompt="Refactor utils.py to improve readability",

218 options=ClaudeAgentOptions(

219 permission_mode="acceptEdits",

220 hooks={

221 "PostToolUse": [

222 HookMatcher(matcher="Edit|Write", hooks=[log_file_change])

223 ]

224 },

225 ),

226 ):

227 if hasattr(message, "result"):

228 print(message.result)

229 

230 

231 asyncio.run(main())

232 ```

233 

234 ```typescript TypeScript theme={null}

235 import { query, HookCallback } from "@anthropic-ai/claude-agent-sdk";

236 import { appendFile } from "fs/promises";

237 

238 const logFileChange: HookCallback = async (input) => {

239 const filePath = (input as any).tool_input?.file_path ?? "unknown";

240 await appendFile("./audit.log", `${new Date().toISOString()}: modified ${filePath}\n`);

241 return {};

242 };

243 

244 for await (const message of query({

245 prompt: "Refactor utils.py to improve readability",

246 options: {

247 permissionMode: "acceptEdits",

248 hooks: {

249 PostToolUse: [{ matcher: "Edit|Write", hooks: [logFileChange] }]

250 }

251 }

252 })) {

253 if ("result" in message) console.log(message.result);

254 }

255 ```

256 </CodeGroup>

257 

258 [了解更多关于 hooks →](/zh-CN/agent-sdk/hooks)

259 </Tab>

260 

261 <Tab title="子代理">

262 生成专门的代理来处理专注的子任务。您的主代理委派工作,子代理报告结果。

263 

264 定义具有专门说明的自定义代理。在 `allowedTools` 中包含 `Agent`,因为子代理通过 Agent 工具调用:

265 

266 <CodeGroup>

267 ```python Python theme={null}

268 import asyncio

269 from claude_agent_sdk import query, ClaudeAgentOptions, AgentDefinition

270 

271 

272 async def main():

273 async for message in query(

274 prompt="Use the code-reviewer agent to review this codebase",

275 options=ClaudeAgentOptions(

276 allowed_tools=["Read", "Glob", "Grep", "Agent"],

277 agents={

278 "code-reviewer": AgentDefinition(

279 description="Expert code reviewer for quality and security reviews.",

280 prompt="Analyze code quality and suggest improvements.",

281 tools=["Read", "Glob", "Grep"],

282 )

283 },

284 ),

285 ):

286 if hasattr(message, "result"):

287 print(message.result)

288 

289 

290 asyncio.run(main())

291 ```

292 

293 ```typescript TypeScript theme={null}

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

295 

296 for await (const message of query({

297 prompt: "Use the code-reviewer agent to review this codebase",

298 options: {

299 allowedTools: ["Read", "Glob", "Grep", "Agent"],

300 agents: {

301 "code-reviewer": {

302 description: "Expert code reviewer for quality and security reviews.",

303 prompt: "Analyze code quality and suggest improvements.",

304 tools: ["Read", "Glob", "Grep"]

305 }

306 }

307 }

308 })) {

309 if ("result" in message) console.log(message.result);

310 }

311 ```

312 </CodeGroup>

313 

314 来自子代理上下文内的消息包含 `parent_tool_use_id` 字段,让您可以跟踪哪些消息属于哪个子代理执行。

315 

316 [了解更多关于子代理 →](/zh-CN/agent-sdk/subagents)

317 </Tab>

318 

319 <Tab title="MCP">

320 通过 Model Context Protocol 连接到外部系统:数据库、浏览器、API 和[数百个更多](https://github.com/modelcontextprotocol/servers)。

321 

322 此示例连接 [Playwright MCP 服务器](https://github.com/microsoft/playwright-mcp)以为您的代理提供浏览器自动化功能:

323 

324 <CodeGroup>

325 ```python Python theme={null}

326 import asyncio

327 from claude_agent_sdk import query, ClaudeAgentOptions

328 

329 

330 async def main():

331 async for message in query(

332 prompt="Open example.com and describe what you see",

333 options=ClaudeAgentOptions(

334 mcp_servers={

335 "playwright": {"command": "npx", "args": ["@playwright/mcp@latest"]}

336 }

337 ),

338 ):

339 if hasattr(message, "result"):

340 print(message.result)

341 

342 

343 asyncio.run(main())

344 ```

345 

346 ```typescript TypeScript theme={null}

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

348 

349 for await (const message of query({

350 prompt: "Open example.com and describe what you see",

351 options: {

352 mcpServers: {

353 playwright: { command: "npx", args: ["@playwright/mcp@latest"] }

354 }

355 }

356 })) {

357 if ("result" in message) console.log(message.result);

358 }

359 ```

360 </CodeGroup>

361 

362 [了解更多关于 MCP →](/zh-CN/agent-sdk/mcp)

363 </Tab>

364 

365 <Tab title="权限">

366 精确控制您的代理可以使用哪些工具。允许安全操作、阻止危险操作或要求对敏感操作进行批准。

367 

368 <Note>

369 对于交互式批准提示和 `AskUserQuestion` 工具,请参阅[处理批准和用户输入](/zh-CN/agent-sdk/user-input)。

370 </Note>

371 

372 此示例创建一个只读代理,可以分析但不能修改代码。`allowed_tools` 预先批准 `Read`、`Glob` 和 `Grep`。

373 

374 <CodeGroup>

375 ```python Python theme={null}

376 import asyncio

377 from claude_agent_sdk import query, ClaudeAgentOptions

378 

379 

380 async def main():

381 async for message in query(

382 prompt="Review this code for best practices",

383 options=ClaudeAgentOptions(

384 allowed_tools=["Read", "Glob", "Grep"],

385 ),

386 ):

387 if hasattr(message, "result"):

388 print(message.result)

389 

390 

391 asyncio.run(main())

392 ```

393 

394 ```typescript TypeScript theme={null}

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

396 

397 for await (const message of query({

398 prompt: "Review this code for best practices",

399 options: {

400 allowedTools: ["Read", "Glob", "Grep"]

401 }

402 })) {

403 if ("result" in message) console.log(message.result);

404 }

405 ```

406 </CodeGroup>

407 

408 [了解更多关于权限 →](/zh-CN/agent-sdk/permissions)

409 </Tab>

410 

411 <Tab title="会话">

412 在多次交换中保持上下文。Claude 记住读取的文件、完成的分析和对话历史。稍后恢复会话,或分叉它们以探索不同的方法。

413 

414 此示例从第一个查询中捕获会话 ID,然后恢复以继续完整上下文:

415 

416 <CodeGroup>

417 ```python Python theme={null}

418 import asyncio

419 from claude_agent_sdk import query, ClaudeAgentOptions, SystemMessage, ResultMessage

420 

421 

422 async def main():

423 session_id = None

424 

425 # First query: capture the session ID

426 async for message in query(

427 prompt="Read the authentication module",

428 options=ClaudeAgentOptions(allowed_tools=["Read", "Glob"]),

429 ):

430 if isinstance(message, SystemMessage) and message.subtype == "init":

431 session_id = message.data["session_id"]

432 

433 # Resume with full context from the first query

434 async for message in query(

435 prompt="Now find all places that call it", # "it" = auth module

436 options=ClaudeAgentOptions(resume=session_id),

437 ):

438 if isinstance(message, ResultMessage):

439 print(message.result)

440 

441 

442 asyncio.run(main())

443 ```

444 

445 ```typescript TypeScript theme={null}

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

447 

448 let sessionId: string | undefined;

449 

450 // First query: capture the session ID

451 for await (const message of query({

452 prompt: "Read the authentication module",

453 options: { allowedTools: ["Read", "Glob"] }

454 })) {

455 if (message.type === "system" && message.subtype === "init") {

456 sessionId = message.session_id;

457 }

458 }

459 

460 // Resume with full context from the first query

461 for await (const message of query({

462 prompt: "Now find all places that call it", // "it" = auth module

463 options: { resume: sessionId }

464 })) {

465 if ("result" in message) console.log(message.result);

466 }

467 ```

468 </CodeGroup>

469 

470 [了解更多关于会话 →](/zh-CN/agent-sdk/sessions)

471 </Tab>

472</Tabs>

473 

474### Claude Code 功能

475 

476SDK 还支持 Claude Code 的基于文件系统的配置。使用默认选项,SDK 从您的工作目录中的 `.claude/` 和 `~/.claude/` 加载这些。要限制加载哪些源,请在您的选项中设置 `setting_sources`(Python)或 `settingSources`(TypeScript)。

477 

478| 功能 | 描述 | 位置 |

479| --------------------------------------------------- | --------------------- | --------------------------------- |

480| [Skills](/zh-CN/agent-sdk/skills) | 在 Markdown 中定义的专门功能 | `.claude/skills/*/SKILL.md` |

481| [Slash commands](/zh-CN/agent-sdk/slash-commands) | 用于常见任务的自定义命令 | `.claude/commands/*.md` |

482| [Memory](/zh-CN/agent-sdk/modifying-system-prompts) | 项目上下文和说明 | `CLAUDE.md` 或 `.claude/CLAUDE.md` |

483| [Plugins](/zh-CN/agent-sdk/plugins) | 使用自定义命令、代理和 MCP 服务器扩展 | 通过 `plugins` 选项编程 |

484 

485## 将 Agent SDK 与其他 Claude 工具进行比较

486 

487Claude 平台提供了多种使用 Claude 构建的方式。以下是 Agent SDK 的适用场景:

488 

489<Tabs>

490 <Tab title="Agent SDK vs Client SDK">

491 [Anthropic Client SDK](https://platform.claude.com/docs/zh-CN/api/client-sdks) 为您提供直接 API 访问:您发送提示并自己实现工具执行。**Agent SDK** 为您提供具有内置工具执行的 Claude。

492 

493 使用 Client SDK,您实现工具循环。使用 Agent SDK,Claude 处理它:

494 

495 <CodeGroup>

496 ```python Python theme={null}

497 # Client SDK: You implement the tool loop

498 response = client.messages.create(...)

499 while response.stop_reason == "tool_use":

500 result = your_tool_executor(response.tool_use)

501 response = client.messages.create(tool_result=result, **params)

502 

503 # Agent SDK: Claude handles tools autonomously

504 async for message in query(prompt="Fix the bug in auth.py"):

505 print(message)

506 ```

507 

508 ```typescript TypeScript theme={null}

509 // Client SDK: You implement the tool loop

510 let response = await client.messages.create({ ...params });

511 while (response.stop_reason === "tool_use") {

512 const result = yourToolExecutor(response.tool_use);

513 response = await client.messages.create({ tool_result: result, ...params });

514 }

515 

516 // Agent SDK: Claude handles tools autonomously

517 for await (const message of query({ prompt: "Fix the bug in auth.ts" })) {

518 console.log(message);

519 }

520 ```

521 </CodeGroup>

522 </Tab>

523 

524 <Tab title="Agent SDK vs Claude Code CLI">

525 相同的功能,不同的界面:

526 

527 | 用例 | 最佳选择 |

528 | -------- | ---- |

529 | 交互式开发 | CLI |

530 | CI/CD 管道 | SDK |

531 | 自定义应用程序 | SDK |

532 | 一次性任务 | CLI |

533 | 生产自动化 | SDK |

534 

535 许多团队同时使用两者:CLI 用于日常开发,SDK 用于生产。工作流在它们之间直接转换。

536 </Tab>

537 

538 <Tab title="Agent SDK vs Managed Agents">

539 [Managed Agents](https://platform.claude.com/docs/zh-CN/managed-agents/overview) 是一个托管的 REST API:Anthropic 运行代理和沙箱,您的应用程序发送事件并流回结果。**Agent SDK** 是一个在您自己的进程内运行代理循环的库。

540 

541 | | Agent SDK | Managed Agents |

542 | --------- | -------------------------- | ---------------------------- |

543 | **运行位置** | 您的进程,您的基础设施 | Anthropic 管理的基础设施 |

544 | **界面** | Python 或 TypeScript 库 | REST API |

545 | **代理工作于** | 您的基础设施上的文件 | 每个会话的托管沙箱 |

546 | **会话状态** | 您的文件系统上的 JSONL | Anthropic 托管的事件日志 |

547 | **自定义工具** | 进程内 Python 或 TypeScript 函数 | Claude 触发工具;您执行并返回结果 |

548 | **最适合** | 本地原型设计,直接在您的文件系统和服务上工作的代理 | 生产代理,无需操作沙箱或会话基础设施,长期运行和异步会话 |

549 

550 一个常见的路径是先使用 Agent SDK 在本地进行原型设计,然后为生产环境迁移到 Managed Agents。

551 </Tab>

552</Tabs>

553 

554## 更新日志

555 

556查看完整的更新日志以了解 SDK 更新、bug 修复和新功能:

557 

558* **TypeScript SDK**:[查看 CHANGELOG.md](https://github.com/anthropics/claude-agent-sdk-typescript/blob/main/CHANGELOG.md)

559* **Python SDK**:[查看 CHANGELOG.md](https://github.com/anthropics/claude-agent-sdk-python/blob/main/CHANGELOG.md)

560 

561## 报告 bug

562 

563如果您在 Agent SDK 中遇到 bug 或问题:

564 

565* **TypeScript SDK**:[在 GitHub 上报告问题](https://github.com/anthropics/claude-agent-sdk-typescript/issues)

566* **Python SDK**:[在 GitHub 上报告问题](https://github.com/anthropics/claude-agent-sdk-python/issues)

567 

568## 品牌指南

569 

570对于集成 Claude Agent SDK 的合作伙伴,使用 Claude 品牌是可选的。在您的产品中引用 Claude 时:

571 

572**允许:**

573 

574* "Claude Agent"(首选用于下拉菜单)

575* "Claude"(当已在标记为"Agents"的菜单中时)

576* "{YourAgentName} Powered by Claude"(如果您有现有的代理名称)

577 

578**不允许:**

579 

580* "Claude Code" 或 "Claude Code Agent"

581* Claude Code 品牌的 ASCII 艺术或模仿 Claude Code 的视觉元素

582 

583您的产品应保持自己的品牌,不应显示为 Claude Code 或任何 Anthropic 产品。如有关于品牌合规性的问题,请联系 Anthropic [销售团队](https://www.anthropic.com/contact-sales)。

584 

585## 许可证和条款

586 

587Claude Agent SDK 的使用受 [Anthropic 商业服务条款](https://www.anthropic.com/legal/commercial-terms)管制,包括当您使用它为您自己的客户和最终用户提供的产品和服务时,除非特定组件或依赖项由该组件的 LICENSE 文件中指示的不同许可证覆盖。

588 

589## 后续步骤

590 

591<CardGroup cols={2}>

592 <Card title="快速入门" icon="play" href="/zh-CN/agent-sdk/quickstart">

593 构建一个在几分钟内查找和修复 bug 的代理

594 </Card>

595 

596 <Card title="示例代理" icon="star" href="https://github.com/anthropics/claude-agent-sdk-demos">

597 电子邮件助手、研究代理等

598 </Card>

599 

600 <Card title="TypeScript SDK" icon="code" href="/zh-CN/agent-sdk/typescript">

601 完整的 TypeScript API 参考和示例

602 </Card>

603 

604 <Card title="Python SDK" icon="code" href="/zh-CN/agent-sdk/python">

605 完整的 Python API 参考和示例

606 </Card>

607</CardGroup>

agent-sdk/plugins.md +342 −0 created

Details

1> ## Documentation Index

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

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

4 

5# SDK 中的 Plugins

6 

7> 通过 Agent SDK 加载自定义 plugins,使用命令、agents、skills 和 hooks 扩展 Claude Code

8 

9Plugins 允许你使用可在项目间共享的自定义功能来扩展 Claude Code。通过 Agent SDK,你可以以编程方式从本地目录加载 plugins,以便向 agent 会话添加自定义 slash commands、agents、skills、hooks 和 MCP servers。

10 

11## 什么是 plugins?

12 

13Plugins 是 Claude Code 扩展的包,可以包括:

14 

15* **Skills**:Claude 自主使用的模型调用功能(也可以使用 `/skill-name` 调用)

16* **Agents**:用于特定任务的专门子 agents

17* **Hooks**:响应工具使用和其他事件的事件处理程序

18* **MCP servers**:通过 Model Context Protocol 的外部工具集成

19 

20<Note>

21 `commands/` 目录是旧版格式。对于新 plugins,请使用 `skills/`。Claude Code 继续支持两种格式以实现向后兼容性。

22</Note>

23 

24有关 plugin 结构和如何创建 plugins 的完整信息,请参阅 [Plugins](/zh-CN/plugins)。

25 

26## 加载 plugins

27 

28通过在选项配置中提供本地文件系统路径来加载 plugins。`type` 字段必须是 `"local"`,这是 SDK 接受的唯一值。要使用通过 [marketplace](/zh-CN/plugin-marketplaces) 或远程存储库分发的 plugin,请先下载它并提供本地目录路径。SDK 支持从不同位置加载多个 plugins。

29 

30<CodeGroup>

31 ```typescript TypeScript theme={null}

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

33 

34 for await (const message of query({

35 prompt: "Hello",

36 options: {

37 plugins: [

38 { type: "local", path: "./my-plugin" },

39 { type: "local", path: "/absolute/path/to/another-plugin" }

40 ]

41 }

42 })) {

43 // Plugin commands, agents, and other features are now available

44 }

45 ```

46 

47 ```python Python theme={null}

48 import asyncio

49 from claude_agent_sdk import query

50 

51 

52 async def main():

53 async for message in query(

54 prompt="Hello",

55 options={

56 "plugins": [

57 {"type": "local", "path": "./my-plugin"},

58 {"type": "local", "path": "/absolute/path/to/another-plugin"},

59 ]

60 },

61 ):

62 # Plugin commands, agents, and other features are now available

63 pass

64 

65 

66 asyncio.run(main())

67 ```

68</CodeGroup>

69 

70### 路径规范

71 

72Plugin 路径可以是:

73 

74* **相对路径**:相对于你的当前工作目录解析(例如,`"./plugins/my-plugin"`)

75* **绝对路径**:完整文件系统路径(例如,`"/home/user/plugins/my-plugin"`)

76 

77<Note>

78 路径应指向 plugin 的根目录(包含 `.claude-plugin/plugin.json` 的目录)。

79</Note>

80 

81## 验证 plugin 安装

82 

83当 plugins 成功加载时,它们会出现在系统初始化消息中。你可以验证你的 plugins 是否可用:

84 

85<CodeGroup>

86 ```typescript TypeScript theme={null}

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

88 

89 for await (const message of query({

90 prompt: "Hello",

91 options: {

92 plugins: [{ type: "local", path: "./my-plugin" }]

93 }

94 })) {

95 if (message.type === "system" && message.subtype === "init") {

96 // Check loaded plugins

97 console.log("Plugins:", message.plugins);

98 // Example: [{ name: "my-plugin", path: "./my-plugin" }]

99 

100 // Check available commands from plugins

101 console.log("Commands:", message.slash_commands);

102 // Example: ["/help", "/compact", "my-plugin:custom-command"]

103 }

104 }

105 ```

106 

107 ```python Python theme={null}

108 import asyncio

109 from claude_agent_sdk import query

110 

111 

112 async def main():

113 async for message in query(

114 prompt="Hello", options={"plugins": [{"type": "local", "path": "./my-plugin"}]}

115 ):

116 if message.type == "system" and message.subtype == "init":

117 # Check loaded plugins

118 print("Plugins:", message.data.get("plugins"))

119 # Example: [{"name": "my-plugin", "path": "./my-plugin"}]

120 

121 # Check available commands from plugins

122 print("Commands:", message.data.get("slash_commands"))

123 # Example: ["/help", "/compact", "my-plugin:custom-command"]

124 

125 

126 asyncio.run(main())

127 ```

128</CodeGroup>

129 

130## 使用 plugin skills

131 

132来自 plugins 的 skills 会自动使用 plugin 名称进行命名空间划分,以避免冲突。当作为 slash commands 调用时,格式为 `plugin-name:skill-name`。

133 

134<CodeGroup>

135 ```typescript TypeScript theme={null}

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

137 

138 // Load a plugin with a custom /greet skill

139 for await (const message of query({

140 prompt: "/my-plugin:greet", // Use plugin skill with namespace

141 options: {

142 plugins: [{ type: "local", path: "./my-plugin" }]

143 }

144 })) {

145 // Claude executes the custom greeting skill from the plugin

146 if (message.type === "assistant") {

147 console.log(message.message.content);

148 }

149 }

150 ```

151 

152 ```python Python theme={null}

153 import asyncio

154 from claude_agent_sdk import query, AssistantMessage, TextBlock

155 

156 

157 async def main():

158 # Load a plugin with a custom /greet skill

159 async for message in query(

160 prompt="/demo-plugin:greet", # Use plugin skill with namespace

161 options={"plugins": [{"type": "local", "path": "./plugins/demo-plugin"}]},

162 ):

163 # Claude executes the custom greeting skill from the plugin

164 if isinstance(message, AssistantMessage):

165 for block in message.content:

166 if isinstance(block, TextBlock):

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

168 

169 

170 asyncio.run(main())

171 ```

172</CodeGroup>

173 

174<Note>

175 如果你通过 CLI 安装了 plugin(例如,`/plugin install my-plugin@marketplace`),你仍然可以通过提供其安装路径在 SDK 中使用它。检查 `~/.claude/plugins/` 以查找 CLI 安装的 plugins。

176</Note>

177 

178## 完整示例

179 

180这是一个演示 plugin 加载和使用的完整示例:

181 

182<CodeGroup>

183 ```typescript TypeScript theme={null}

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

185 import * as path from "path";

186 

187 async function runWithPlugin() {

188 const pluginPath = path.join(__dirname, "plugins", "my-plugin");

189 

190 console.log("Loading plugin from:", pluginPath);

191 

192 for await (const message of query({

193 prompt: "What custom commands do you have available?",

194 options: {

195 plugins: [{ type: "local", path: pluginPath }],

196 maxTurns: 3

197 }

198 })) {

199 if (message.type === "system" && message.subtype === "init") {

200 console.log("Loaded plugins:", message.plugins);

201 console.log("Available commands:", message.slash_commands);

202 }

203 

204 if (message.type === "assistant") {

205 console.log("Assistant:", message.message.content);

206 }

207 }

208 }

209 

210 runWithPlugin().catch(console.error);

211 ```

212 

213 ```python Python theme={null}

214 #!/usr/bin/env python3

215 """Example demonstrating how to use plugins with the Agent SDK."""

216 

217 from pathlib import Path

218 import anyio

219 from claude_agent_sdk import (

220 AssistantMessage,

221 ClaudeAgentOptions,

222 TextBlock,

223 query,

224 )

225 

226 

227 async def run_with_plugin():

228 """Example using a custom plugin."""

229 plugin_path = Path(__file__).parent / "plugins" / "demo-plugin"

230 

231 print(f"Loading plugin from: {plugin_path}")

232 

233 options = ClaudeAgentOptions(

234 plugins=[{"type": "local", "path": str(plugin_path)}],

235 max_turns=3,

236 )

237 

238 async for message in query(

239 prompt="What custom commands do you have available?", options=options

240 ):

241 if message.type == "system" and message.subtype == "init":

242 print(f"Loaded plugins: {message.data.get('plugins')}")

243 print(f"Available commands: {message.data.get('slash_commands')}")

244 

245 if isinstance(message, AssistantMessage):

246 for block in message.content:

247 if isinstance(block, TextBlock):

248 print(f"Assistant: {block.text}")

249 

250 

251 if __name__ == "__main__":

252 anyio.run(run_with_plugin)

253 ```

254</CodeGroup>

255 

256## Plugin 结构参考

257 

258Plugin 目录必须包含 `.claude-plugin/plugin.json` 清单文件。它可以选择性地包括:

259 

260```text theme={null}

261my-plugin/

262├── .claude-plugin/

263│ └── plugin.json # Required: plugin manifest

264├── skills/ # Agent Skills (invoked autonomously or via /skill-name)

265│ └── my-skill/

266│ └── SKILL.md

267├── commands/ # Legacy: use skills/ instead

268│ └── custom-cmd.md

269├── agents/ # Custom agents

270│ └── specialist.md

271├── hooks/ # Event handlers

272│ └── hooks.json

273└── .mcp.json # MCP server definitions

274```

275 

276有关创建 plugins 的详细信息,请参阅:

277 

278* [Plugins](/zh-CN/plugins) - 完整的 plugin 开发指南

279* [Plugins reference](/zh-CN/plugins-reference) - 技术规范和架构

280 

281## 常见用例

282 

283### 开发和测试

284 

285在开发期间加载 plugins,无需全局安装它们:

286 

287```typescript theme={null}

288plugins: [{ type: "local", path: "./dev-plugins/my-plugin" }];

289```

290 

291### 项目特定的扩展

292 

293在你的项目存储库中包含 plugins,以实现团队范围的一致性:

294 

295```typescript theme={null}

296plugins: [{ type: "local", path: "./project-plugins/team-workflows" }];

297```

298 

299### 多个 plugin 源

300 

301组合来自不同位置的 plugins:

302 

303```typescript theme={null}

304plugins: [

305 { type: "local", path: "./local-plugin" },

306 { type: "local", path: "~/.claude/custom-plugins/shared-plugin" }

307];

308```

309 

310## 故障排除

311 

312### Plugin 未加载

313 

314如果你的 plugin 未出现在初始化消息中:

315 

3161. **检查路径**:确保路径指向 plugin 根目录(包含 `.claude-plugin/`)

3172. **验证 plugin.json**:确保你的清单文件具有有效的 JSON 语法

3183. **检查文件权限**:确保 plugin 目录可读

319 

320### Skills 未出现

321 

322如果 plugin skills 不起作用:

323 

3241. **使用命名空间**:作为 slash commands 调用时,plugin skills 需要 `plugin-name:skill-name` 格式

3252. **检查初始化消息**:验证 skill 是否以正确的命名空间出现在 `slash_commands` 中

3263. **验证 skill 文件**:确保每个 skill 在 `skills/` 下的自己的子目录中都有一个 `SKILL.md` 文件(例如,`skills/my-skill/SKILL.md`)

327 

328### 路径解析问题

329 

330如果相对路径不起作用:

331 

3321. **检查工作目录**:相对路径从你的当前工作目录解析

3332. **使用绝对路径**:为了可靠性,考虑使用绝对路径

3343. **规范化路径**:使用路径实用程序正确构造路径

335 

336## 另请参阅

337 

338* [Plugins](/zh-CN/plugins) - 完整的 plugin 开发指南

339* [Plugins reference](/zh-CN/plugins-reference) - 技术规范

340* [Slash Commands](/zh-CN/agent-sdk/slash-commands) - 在 SDK 中使用 slash commands

341* [Subagents](/zh-CN/agent-sdk/subagents) - 使用专门的 agents

342* [Skills](/zh-CN/agent-sdk/skills) - 使用 Agent Skills

agent-sdk/python.md +3274 −0 created

Details

1> ## Documentation Index

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

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

4 

5# Agent SDK 参考 - Python

6 

7> Python Agent SDK 的完整 API 参考,包括所有函数、类型和类。

8 

9## 安装

10 

11```bash theme={null}

12pip install claude-agent-sdk

13```

14 

15## 在 `query()` 和 `ClaudeSDKClient` 之间选择

16 

17Python SDK 提供了两种与 Claude Code 交互的方式:

18 

19### 快速比较

20 

21| 功能 | `query()` | `ClaudeSDKClient` |

22| :-------- | :-------- | :---------------- |

23| **会话** | 每次创建新会话 | 重用同一会话 |

24| **对话** | 单次交换 | 同一上下文中的多次交换 |

25| **连接** | 自动管理 | 手动控制 |

26| **流式输入** | ✅ 支持 | ✅ 支持 |

27| **中断** | ❌ 不支持 | ✅ 支持 |

28| **hooks** | ✅ 支持 | ✅ 支持 |

29| **自定义工具** | ✅ 支持 | ✅ 支持 |

30| **继续聊天** | ❌ 每次新会话 | ✅ 保持对话 |

31| **用例** | 一次性任务 | 持续对话 |

32 

33### 何时使用 `query()`(每次新会话)

34 

35**最适合:**

36 

37* 不需要对话历史的一次性问题

38* 不需要来自之前交换的上下文的独立任务

39* 简单的自动化脚本

40* 当你想每次都重新开始时

41 

42### 何时使用 `ClaudeSDKClient`(持续对话)

43 

44**最适合:**

45 

46* **继续对话** - 当你需要 Claude 记住上下文时

47* **后续问题** - 基于之前的响应进行构建

48* **交互式应用程序** - 聊天界面、REPL

49* **响应驱动的逻辑** - 当下一步操作取决于 Claude 的响应时

50* **会话控制** - 显式管理对话生命周期

51 

52## 函数

53 

54### `query()`

55 

56为每次与 Claude Code 的交互创建一个新会话。返回一个异步迭代器,当消息到达时产生消息。每次调用 `query()` 都会重新开始,不记得之前的交互。

57 

58```python theme={null}

59async def query(

60 *,

61 prompt: str | AsyncIterable[dict[str, Any]],

62 options: ClaudeAgentOptions | None = None,

63 transport: Transport | None = None

64) -> AsyncIterator[Message]

65```

66 

67#### 参数

68 

69| 参数 | 类型 | 描述 |

70| :---------- | :--------------------------- | :------------------------------------------ |

71| `prompt` | `str \| AsyncIterable[dict]` | 输入提示,可以是字符串或用于流式模式的异步可迭代对象 |

72| `options` | `ClaudeAgentOptions \| None` | 可选配置对象(如果为 None,默认为 `ClaudeAgentOptions()`) |

73| `transport` | `Transport \| None` | 用于与 CLI 进程通信的可选自定义传输 |

74 

75#### 返回

76 

77返回一个 `AsyncIterator[Message]`,从对话中产生消息。

78 

79#### 示例 - 带选项

80 

81```python theme={null}

82import asyncio

83from claude_agent_sdk import query, ClaudeAgentOptions

84 

85 

86async def main():

87 options = ClaudeAgentOptions(

88 system_prompt="You are an expert Python developer",

89 permission_mode="acceptEdits",

90 cwd="/home/user/project",

91 )

92 

93 async for message in query(prompt="Create a Python web server", options=options):

94 print(message)

95 

96 

97asyncio.run(main())

98```

99 

100### `tool()`

101 

102用于定义具有类型安全的 MCP 工具的装饰器。

103 

104```python theme={null}

105def tool(

106 name: str,

107 description: str,

108 input_schema: type | dict[str, Any],

109 annotations: ToolAnnotations | None = None

110) -> Callable[[Callable[[Any], Awaitable[dict[str, Any]]]], SdkMcpTool[Any]]

111```

112 

113#### 参数

114 

115| 参数 | 类型 | 描述 |

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

117| `name` | `str` | 工具的唯一标识符 |

118| `description` | `str` | 工具功能的人类可读描述 |

119| `input_schema` | `type \| dict[str, Any]` | 定义工具输入参数的模式(见下文) |

120| `annotations` | [`ToolAnnotations`](#tool-annotations)` \| None` | 可选的 MCP 工具注解,为客户端提供行为提示 |

121 

122#### 输入模式选项

123 

1241. **简单类型映射**(推荐):

125 

126 ```python theme={null}

127 {"text": str, "count": int, "enabled": bool}

128 ```

129 

1302. **JSON Schema 格式**(用于复杂验证):

131 ```python theme={null}

132 {

133 "type": "object",

134 "properties": {

135 "text": {"type": "string"},

136 "count": {"type": "integer", "minimum": 0},

137 },

138 "required": ["text"],

139 }

140 ```

141 

142#### 返回

143 

144一个装饰器函数,包装工具实现并返回一个 `SdkMcpTool` 实例。

145 

146#### 示例

147 

148```python theme={null}

149from claude_agent_sdk import tool

150from typing import Any

151 

152 

153@tool("greet", "Greet a user", {"name": str})

154async def greet(args: dict[str, Any]) -> dict[str, Any]:

155 return {"content": [{"type": "text", "text": f"Hello, {args['name']}!"}]}

156```

157 

158#### `ToolAnnotations`

159 

160从 `mcp.types` 重新导出(也可以从 `claude_agent_sdk` 导入)。所有字段都是可选的提示;客户端不应依赖它们做出安全决策。

161 

162| 字段 | 类型 | 默认值 | 描述 |

163| :---------------- | :------------- | :------ | :------------------------------------------------------------- |

164| `title` | `str \| None` | `None` | 工具的人类可读标题 |

165| `readOnlyHint` | `bool \| None` | `False` | 如果为 `True`,工具不修改其环境 |

166| `destructiveHint` | `bool \| None` | `True` | 如果为 `True`,工具可能执行破坏性更新(仅当 `readOnlyHint` 为 `False` 时有意义) |

167| `idempotentHint` | `bool \| None` | `False` | 如果为 `True`,使用相同参数的重复调用没有额外效果(仅当 `readOnlyHint` 为 `False` 时有意义) |

168| `openWorldHint` | `bool \| None` | `True` | 如果为 `True`,工具与外部实体交互(例如网络搜索)。如果为 `False`,工具的域是封闭的(例如内存工具) |

169 

170```python theme={null}

171from claude_agent_sdk import tool, ToolAnnotations

172from typing import Any

173 

174 

175@tool(

176 "search",

177 "Search the web",

178 {"query": str},

179 annotations=ToolAnnotations(readOnlyHint=True, openWorldHint=True),

180)

181async def search(args: dict[str, Any]) -> dict[str, Any]:

182 return {"content": [{"type": "text", "text": f"Results for: {args['query']}"}]}

183```

184 

185### `create_sdk_mcp_server()`

186 

187创建在 Python 应用程序中运行的进程内 MCP 服务器。

188 

189```python theme={null}

190def create_sdk_mcp_server(

191 name: str,

192 version: str = "1.0.0",

193 tools: list[SdkMcpTool[Any]] | None = None

194) -> McpSdkServerConfig

195```

196 

197#### 参数

198 

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

200| :-------- | :------------------------------ | :-------- | :---------------------- |

201| `name` | `str` | - | 服务器的唯一标识符 |

202| `version` | `str` | `"1.0.0"` | 服务器版本字符串 |

203| `tools` | `list[SdkMcpTool[Any]] \| None` | `None` | 使用 `@tool` 装饰器创建的工具函数列表 |

204 

205#### 返回

206 

207返回一个 `McpSdkServerConfig` 对象,可以传递给 `ClaudeAgentOptions.mcp_servers`。

208 

209#### 示例

210 

211```python theme={null}

212from claude_agent_sdk import tool, create_sdk_mcp_server

213 

214 

215@tool("add", "Add two numbers", {"a": float, "b": float})

216async def add(args):

217 return {"content": [{"type": "text", "text": f"Sum: {args['a'] + args['b']}"}]}

218 

219 

220@tool("multiply", "Multiply two numbers", {"a": float, "b": float})

221async def multiply(args):

222 return {"content": [{"type": "text", "text": f"Product: {args['a'] * args['b']}"}]}

223 

224 

225calculator = create_sdk_mcp_server(

226 name="calculator",

227 version="2.0.0",

228 tools=[add, multiply], # Pass decorated functions

229)

230 

231# Use with Claude

232options = ClaudeAgentOptions(

233 mcp_servers={"calc": calculator},

234 allowed_tools=["mcp__calc__add", "mcp__calc__multiply"],

235)

236```

237 

238### `list_sessions()`

239 

240列出带有元数据的过去会话。按项目目录过滤或列出所有项目中的会话。同步;立即返回。

241 

242```python theme={null}

243def list_sessions(

244 directory: str | None = None,

245 limit: int | None = None,

246 include_worktrees: bool = True

247) -> list[SDKSessionInfo]

248```

249 

250#### 参数

251 

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

253| :------------------ | :------------ | :----- | :-------------------------------------------- |

254| `directory` | `str \| None` | `None` | 列出会话的目录。省略时,返回所有项目中的会话 |

255| `limit` | `int \| None` | `None` | 返回的最大会话数 |

256| `include_worktrees` | `bool` | `True` | 当 `directory` 在 git 仓库内时,包括所有 worktree 路径中的会话 |

257 

258#### 返回类型:`SDKSessionInfo`

259 

260| 属性 | 类型 | 描述 |

261| :-------------- | :------------ | :------------------------------------------- |

262| `session_id` | `str` | 唯一会话标识符 |

263| `summary` | `str` | 显示标题:自定义标题、自动生成的摘要或第一个提示 |

264| `last_modified` | `int` | 上次修改时间(自纪元以来的毫秒数) |

265| `file_size` | `int \| None` | 会话文件大小(字节)(远程存储后端为 `None`) |

266| `custom_title` | `str \| None` | 用户设置的会话标题 |

267| `first_prompt` | `str \| None` | 会话中的第一个有意义的用户提示 |

268| `git_branch` | `str \| None` | 会话结束时的 Git 分支 |

269| `cwd` | `str \| None` | 会话的工作目录 |

270| `tag` | `str \| None` | 用户设置的会话标签(见 [`tag_session()`](#tag-session)) |

271| `created_at` | `int \| None` | 会话创建时间(自纪元以来的毫秒数) |

272 

273#### 示例

274 

275打印项目的 10 个最近会话。结果按 `last_modified` 降序排序,所以第一项是最新的。省略 `directory` 以搜索所有项目。

276 

277```python theme={null}

278from claude_agent_sdk import list_sessions

279 

280for session in list_sessions(directory="/path/to/project", limit=10):

281 print(f"{session.summary} ({session.session_id})")

282```

283 

284### `get_session_messages()`

285 

286从过去的会话中检索消息。同步;立即返回。

287 

288```python theme={null}

289def get_session_messages(

290 session_id: str,

291 directory: str | None = None,

292 limit: int | None = None,

293 offset: int = 0

294) -> list[SessionMessage]

295```

296 

297#### 参数

298 

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

300| :----------- | :------------ | :----- | :------------------ |

301| `session_id` | `str` | 必需 | 要检索消息的会话 ID |

302| `directory` | `str \| None` | `None` | 要查看的项目目录。省略时,搜索所有项目 |

303| `limit` | `int \| None` | `None` | 返回的最大消息数 |

304| `offset` | `int` | `0` | 从开始跳过的消息数 |

305 

306#### 返回类型:`SessionMessage`

307 

308| 属性 | 类型 | 描述 |

309| :------------------- | :----------------------------- | :------ |

310| `type` | `Literal["user", "assistant"]` | 消息角色 |

311| `uuid` | `str` | 唯一消息标识符 |

312| `session_id` | `str` | 会话标识符 |

313| `message` | `Any` | 原始消息内容 |

314| `parent_tool_use_id` | `None` | 保留供将来使用 |

315 

316#### 示例

317 

318```python theme={null}

319from claude_agent_sdk import list_sessions, get_session_messages

320 

321sessions = list_sessions(limit=1)

322if sessions:

323 messages = get_session_messages(sessions[0].session_id)

324 for msg in messages:

325 print(f"[{msg.type}] {msg.uuid}")

326```

327 

328### `get_session_info()`

329 

330按 ID 读取单个会话的元数据,无需扫描完整项目目录。同步;立即返回。

331 

332```python theme={null}

333def get_session_info(

334 session_id: str,

335 directory: str | None = None,

336) -> SDKSessionInfo | None

337```

338 

339#### 参数

340 

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

342| :----------- | :------------ | :----- | :------------------ |

343| `session_id` | `str` | 必需 | 要查找的会话的 UUID |

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

345 

346返回 [`SDKSessionInfo`](#return-type-sdk-session-info),如果找不到会话则返回 `None`。

347 

348#### 示例

349 

350查找单个会话的元数据,无需扫描项目目录。当你已经从之前的运行中获得会话 ID 时很有用。

351 

352```python theme={null}

353from claude_agent_sdk import get_session_info

354 

355info = get_session_info("550e8400-e29b-41d4-a716-446655440000")

356if info:

357 print(f"{info.summary} (branch: {info.git_branch}, tag: {info.tag})")

358```

359 

360### `rename_session()`

361 

362通过追加自定义标题条目来重命名会话。重复调用是安全的;最新的标题获胜。同步。

363 

364```python theme={null}

365def rename_session(

366 session_id: str,

367 title: str,

368 directory: str | None = None,

369) -> None

370```

371 

372#### 参数

373 

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

375| :----------- | :------------ | :----- | :------------------ |

376| `session_id` | `str` | 必需 | 要重命名的会话的 UUID |

377| `title` | `str` | 必需 | 新标题。去除空格后必须非空 |

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

379 

380如果 `session_id` 不是有效的 UUID 或 `title` 为空,则抛出 `ValueError`;如果找不到会话,则抛出 `FileNotFoundError`。

381 

382#### 示例

383 

384重命名最近的会话,使其更容易找到。新标题在后续读取时出现在 [`SDKSessionInfo.custom_title`](#return-type-sdk-session-info) 中。

385 

386```python theme={null}

387from claude_agent_sdk import list_sessions, rename_session

388 

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

390if sessions:

391 rename_session(sessions[0].session_id, "Refactor auth module")

392```

393 

394### `tag_session()`

395 

396标记会话。传递 `None` 以清除标签。重复调用是安全的;最新的标签获胜。同步。

397 

398```python theme={null}

399def tag_session(

400 session_id: str,

401 tag: str | None,

402 directory: str | None = None,

403) -> None

404```

405 

406#### 参数

407 

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

409| :----------- | :------------ | :----- | :---------------------------------- |

410| `session_id` | `str` | 必需 | 要标记的会话的 UUID |

411| `tag` | `str \| None` | 必需 | 标签字符串,或 `None` 以清除。存储前进行 Unicode 清理 |

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

413 

414如果 `session_id` 不是有效的 UUID 或 `tag` 在清理后为空,则抛出 `ValueError`;如果找不到会话,则抛出 `FileNotFoundError`。

415 

416#### 示例

417 

418标记会话,然后在稍后的读取中按该标签过滤。传递 `None` 以清除现有标签。

419 

420```python theme={null}

421from claude_agent_sdk import list_sessions, tag_session

422 

423# Tag a session

424tag_session("550e8400-e29b-41d4-a716-446655440000", "needs-review")

425 

426# Later: find all sessions with that tag

427for session in list_sessions(directory="/path/to/project"):

428 if session.tag == "needs-review":

429 print(session.summary)

430```

431 

432## 类

433 

434### `ClaudeSDKClient`

435 

436**在多次交换中维持对话会话。** 这是 TypeScript SDK 的 `query()` 函数内部工作方式的 Python 等价物 - 它创建一个可以继续对话的客户端对象。

437 

438#### 关键特性

439 

440* **会话连续性**:在多个 `query()` 调用中维持对话上下文

441* **同一对话**:会话保留之前的消息

442* **中断支持**:可以在任务中途停止执行

443* **显式生命周期**:你控制会话何时开始和结束

444* **响应驱动的流程**:可以对响应做出反应并发送后续消息

445* **自定义工具和 hooks**:支持自定义工具(使用 `@tool` 装饰器创建)和 hooks

446 

447```python theme={null}

448class ClaudeSDKClient:

449 def __init__(self, options: ClaudeAgentOptions | None = None, transport: Transport | None = None)

450 async def connect(self, prompt: str | AsyncIterable[dict] | None = None) -> None

451 async def query(self, prompt: str | AsyncIterable[dict], session_id: str = "default") -> None

452 async def receive_messages(self) -> AsyncIterator[Message]

453 async def receive_response(self) -> AsyncIterator[Message]

454 async def interrupt(self) -> None

455 async def set_permission_mode(self, mode: str) -> None

456 async def set_model(self, model: str | None = None) -> None

457 async def rewind_files(self, user_message_id: str) -> None

458 async def get_mcp_status(self) -> McpStatusResponse

459 async def reconnect_mcp_server(self, server_name: str) -> None

460 async def toggle_mcp_server(self, server_name: str, enabled: bool) -> None

461 async def stop_task(self, task_id: str) -> None

462 async def get_server_info(self) -> dict[str, Any] | None

463 async def disconnect(self) -> None

464```

465 

466#### 方法

467 

468| 方法 | 描述 |

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

470| `__init__(options)` | 使用可选配置初始化客户端 |

471| `connect(prompt)` | 连接到 Claude,可选初始提示或消息流 |

472| `query(prompt, session_id)` | 以流式模式发送新请求 |

473| `receive_messages()` | 以异步迭代器形式接收来自 Claude 的所有消息 |

474| `receive_response()` | 接收消息直到并包括 ResultMessage |

475| `interrupt()` | 发送中断信号(仅在流式模式下工作) |

476| `set_permission_mode(mode)` | 更改当前会话的权限模式 |

477| `set_model(model)` | 更改当前会话的模型。传递 `None` 以重置为默认值 |

478| `rewind_files(user_message_id)` | 将文件恢复到指定用户消息时的状态。需要 `enable_file_checkpointing=True`。见 [文件检查点](/zh-CN/agent-sdk/file-checkpointing) |

479| `get_mcp_status()` | 获取所有配置的 MCP 服务器的状态。返回 [`McpStatusResponse`](#mcp-status-response) |

480| `reconnect_mcp_server(server_name)` | 重试连接到失败或断开连接的 MCP 服务器 |

481| `toggle_mcp_server(server_name, enabled)` | 在会话中启用或禁用 MCP 服务器。禁用会移除其工具 |

482| `stop_task(task_id)` | 停止运行的后台任务。一个状态为 `"stopped"` 的 [`TaskNotificationMessage`](#task-notification-message) 随后在消息流中出现 |

483| `get_server_info()` | 获取服务器信息,包括会话 ID 和功能 |

484| `disconnect()` | 从 Claude 断开连接 |

485 

486#### 上下文管理器支持

487 

488客户端可以用作异步上下文管理器以自动管理连接:

489 

490```python theme={null}

491async with ClaudeSDKClient() as client:

492 await client.query("Hello Claude")

493 async for message in client.receive_response():

494 print(message)

495```

496 

497> **重要:** 迭代消息时,避免使用 `break` 提前退出,因为这可能导致 asyncio 清理问题。相反,让迭代自然完成或使用标志来跟踪何时找到了你需要的内容。

498 

499#### 示例 - 继续对话

500 

501```python theme={null}

502import asyncio

503from claude_agent_sdk import ClaudeSDKClient, AssistantMessage, TextBlock, ResultMessage

504 

505 

506async def main():

507 async with ClaudeSDKClient() as client:

508 # First question

509 await client.query("What's the capital of France?")

510 

511 # Process response

512 async for message in client.receive_response():

513 if isinstance(message, AssistantMessage):

514 for block in message.content:

515 if isinstance(block, TextBlock):

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

517 

518 # Follow-up question - the session retains the previous context

519 await client.query("What's the population of that city?")

520 

521 async for message in client.receive_response():

522 if isinstance(message, AssistantMessage):

523 for block in message.content:

524 if isinstance(block, TextBlock):

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

526 

527 # Another follow-up - still in the same conversation

528 await client.query("What are some famous landmarks there?")

529 

530 async for message in client.receive_response():

531 if isinstance(message, AssistantMessage):

532 for block in message.content:

533 if isinstance(block, TextBlock):

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

535 

536 

537asyncio.run(main())

538```

539 

540#### 示例 - 使用 ClaudeSDKClient 进行流式输入

541 

542```python theme={null}

543import asyncio

544from claude_agent_sdk import ClaudeSDKClient

545 

546 

547async def message_stream():

548 """Generate messages dynamically."""

549 yield {

550 "type": "user",

551 "message": {"role": "user", "content": "Analyze the following data:"},

552 }

553 await asyncio.sleep(0.5)

554 yield {

555 "type": "user",

556 "message": {"role": "user", "content": "Temperature: 25°C, Humidity: 60%"},

557 }

558 await asyncio.sleep(0.5)

559 yield {

560 "type": "user",

561 "message": {"role": "user", "content": "What patterns do you see?"},

562 }

563 

564 

565async def main():

566 async with ClaudeSDKClient() as client:

567 # Stream input to Claude

568 await client.query(message_stream())

569 

570 # Process response

571 async for message in client.receive_response():

572 print(message)

573 

574 # Follow-up in same session

575 await client.query("Should we be concerned about these readings?")

576 

577 async for message in client.receive_response():

578 print(message)

579 

580 

581asyncio.run(main())

582```

583 

584#### 示例 - 使用中断

585 

586```python theme={null}

587import asyncio

588from claude_agent_sdk import ClaudeSDKClient, ClaudeAgentOptions, ResultMessage

589 

590 

591async def interruptible_task():

592 options = ClaudeAgentOptions(allowed_tools=["Bash"], permission_mode="acceptEdits")

593 

594 async with ClaudeSDKClient(options=options) as client:

595 # Start a long-running task

596 await client.query("Count from 1 to 100 slowly, using the bash sleep command")

597 

598 # Let it run for a bit

599 await asyncio.sleep(2)

600 

601 # Interrupt the task

602 await client.interrupt()

603 print("Task interrupted!")

604 

605 # Drain the interrupted task's messages (including its ResultMessage)

606 async for message in client.receive_response():

607 if isinstance(message, ResultMessage):

608 print(f"Interrupted task finished with subtype={message.subtype!r}")

609 # subtype is "error_during_execution" for interrupted tasks

610 

611 # Send a new command

612 await client.query("Just say hello instead")

613 

614 # Now receive the new response

615 async for message in client.receive_response():

616 if isinstance(message, ResultMessage) and message.subtype == "success":

617 print(f"New result: {message.result}")

618 

619 

620asyncio.run(interruptible_task())

621```

622 

623<Note>

624 **中断后的缓冲行为:** `interrupt()` 发送停止信号但不清除消息缓冲区。被中断任务已产生的消息,包括其 `ResultMessage`(带 `subtype="error_during_execution"`),保留在流中。你必须在读取新查询的响应之前用 `receive_response()` 清空它们。如果在 `interrupt()` 之后立即发送新查询并仅调用一次 `receive_response()`,你将收到被中断任务的消息,而不是新查询的响应。

625</Note>

626 

627#### 示例 - 高级权限控制

628 

629```python theme={null}

630from claude_agent_sdk import ClaudeSDKClient, ClaudeAgentOptions

631from claude_agent_sdk.types import (

632 PermissionResultAllow,

633 PermissionResultDeny,

634 ToolPermissionContext,

635)

636 

637 

638async def custom_permission_handler(

639 tool_name: str, input_data: dict, context: ToolPermissionContext

640) -> PermissionResultAllow | PermissionResultDeny:

641 """Custom logic for tool permissions."""

642 

643 # Block writes to system directories

644 if tool_name == "Write" and input_data.get("file_path", "").startswith("/system/"):

645 return PermissionResultDeny(

646 message="System directory write not allowed", interrupt=True

647 )

648 

649 # Redirect sensitive file operations

650 if tool_name in ["Write", "Edit"] and "config" in input_data.get("file_path", ""):

651 safe_path = f"./sandbox/{input_data['file_path']}"

652 return PermissionResultAllow(

653 updated_input={**input_data, "file_path": safe_path}

654 )

655 

656 # Allow everything else

657 return PermissionResultAllow(updated_input=input_data)

658 

659 

660async def main():

661 options = ClaudeAgentOptions(

662 can_use_tool=custom_permission_handler, allowed_tools=["Read", "Write", "Edit"]

663 )

664 

665 async with ClaudeSDKClient(options=options) as client:

666 await client.query("Update the system config file")

667 

668 async for message in client.receive_response():

669 # Will use sandbox path instead

670 print(message)

671 

672 

673asyncio.run(main())

674```

675 

676## 类型

677 

678<Note>

679 **`@dataclass` vs `TypedDict`:** 此 SDK 使用两种类型。用 `@dataclass` 装饰的类(如 `ResultMessage`、`AgentDefinition`、`TextBlock`)在运行时是对象实例,支持属性访问:`msg.result`。用 `TypedDict` 定义的类(如 `ThinkingConfigEnabled`、`McpStdioServerConfig`、`SyncHookJSONOutput`)在运行时是**普通字典**,需要键访问:`config["budget_tokens"]`,而不是 `config.budget_tokens`。`ClassName(field=value)` 调用语法对两者都有效,但只有数据类产生具有属性的对象。

680</Note>

681 

682### `SdkMcpTool`

683 

684使用 `@tool` 装饰器创建的 SDK MCP 工具的定义。

685 

686```python theme={null}

687@dataclass

688class SdkMcpTool(Generic[T]):

689 name: str

690 description: str

691 input_schema: type[T] | dict[str, Any]

692 handler: Callable[[T], Awaitable[dict[str, Any]]]

693 annotations: ToolAnnotations | None = None

694```

695 

696| 属性 | 类型 | 描述 |

697| :------------- | :----------------------------------------- | :------------------------------------------------------------------------------- |

698| `name` | `str` | 工具的唯一标识符 |

699| `description` | `str` | 人类可读的描述 |

700| `input_schema` | `type[T] \| dict[str, Any]` | 输入验证的模式 |

701| `handler` | `Callable[[T], Awaitable[dict[str, Any]]]` | 处理工具执行的异步函数 |

702| `annotations` | `ToolAnnotations \| None` | 可选的 MCP 工具注解(例如 `readOnlyHint`、`destructiveHint`、`openWorldHint`)。来自 `mcp.types` |

703 

704### `Transport`

705 

706自定义传输实现的抽象基类。使用此类通过自定义通道与 Claude 进程通信(例如,远程连接而不是本地子进程)。

707 

708<Warning>

709 这是一个低级内部 API。接口可能在未来版本中更改。自定义实现必须更新以匹配任何接口更改。

710</Warning>

711 

712```python theme={null}

713from abc import ABC, abstractmethod

714from collections.abc import AsyncIterator

715from typing import Any

716 

717 

718class Transport(ABC):

719 @abstractmethod

720 async def connect(self) -> None: ...

721 

722 @abstractmethod

723 async def write(self, data: str) -> None: ...

724 

725 @abstractmethod

726 def read_messages(self) -> AsyncIterator[dict[str, Any]]: ...

727 

728 @abstractmethod

729 async def close(self) -> None: ...

730 

731 @abstractmethod

732 def is_ready(self) -> bool: ...

733 

734 @abstractmethod

735 async def end_input(self) -> None: ...

736```

737 

738| 方法 | 描述 |

739| :---------------- | :----------------------- |

740| `connect()` | 连接传输并准备通信 |

741| `write(data)` | 将原始数据(JSON + 换行符)写入传输 |

742| `read_messages()` | 异步迭代器,产生解析的 JSON 消息 |

743| `close()` | 关闭连接并清理资源 |

744| `is_ready()` | 如果传输可以发送和接收,返回 `True` |

745| `end_input()` | 关闭输入流(例如,为子进程传输关闭 stdin) |

746 

747导入:`from claude_agent_sdk import Transport`

748 

749### `ClaudeAgentOptions`

750 

751Claude Code 查询的配置数据类。

752 

753```python theme={null}

754@dataclass

755class ClaudeAgentOptions:

756 tools: list[str] | ToolsPreset | None = None

757 allowed_tools: list[str] = field(default_factory=list)

758 system_prompt: str | SystemPromptPreset | None = None

759 mcp_servers: dict[str, McpServerConfig] | str | Path = field(default_factory=dict)

760 permission_mode: PermissionMode | None = None

761 continue_conversation: bool = False

762 resume: str | None = None

763 max_turns: int | None = None

764 max_budget_usd: float | None = None

765 disallowed_tools: list[str] = field(default_factory=list)

766 model: str | None = None

767 fallback_model: str | None = None

768 betas: list[SdkBeta] = field(default_factory=list)

769 output_format: dict[str, Any] | None = None

770 permission_prompt_tool_name: str | None = None

771 cwd: str | Path | None = None

772 cli_path: str | Path | None = None

773 settings: str | None = None

774 add_dirs: list[str | Path] = field(default_factory=list)

775 env: dict[str, str] = field(default_factory=dict)

776 extra_args: dict[str, str | None] = field(default_factory=dict)

777 max_buffer_size: int | None = None

778 debug_stderr: Any = sys.stderr # Deprecated

779 stderr: Callable[[str], None] | None = None

780 can_use_tool: CanUseTool | None = None

781 hooks: dict[HookEvent, list[HookMatcher]] | None = None

782 user: str | None = None

783 include_partial_messages: bool = False

784 fork_session: bool = False

785 agents: dict[str, AgentDefinition] | None = None

786 setting_sources: list[SettingSource] | None = None

787 sandbox: SandboxSettings | None = None

788 plugins: list[SdkPluginConfig] = field(default_factory=list)

789 max_thinking_tokens: int | None = None # Deprecated: use thinking instead

790 thinking: ThinkingConfig | None = None

791 effort: Literal["low", "medium", "high", "max"] | None = None

792 enable_file_checkpointing: bool = False

793 session_store: SessionStore | None = None

794```

795 

796| 属性 | 类型 | 默认值 | 描述 |

797| :---------------------------- | :---------------------------------------------------------------------------------------- | :------------------ | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

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

799| `allowed_tools` | `list[str]` | `[]` | 无需提示即可自动批准的工具。这不会限制 Claude 仅使用这些工具;未列出的工具会通过 `permission_mode` 和 `can_use_tool` 处理。使用 `disallowed_tools` 阻止工具。见 [权限](/zh-CN/agent-sdk/permissions#allow-and-deny-rules) |

800| `system_prompt` | `str \| SystemPromptPreset \| None` | `None` | 系统提示配置。传递字符串以获取自定义提示,或使用 `{"type": "preset", "preset": "claude_code"}` 获取 Claude Code 的系统提示。添加 `"append"` 以扩展预设 |

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

802| `permission_mode` | `PermissionMode \| None` | `None` | 工具使用的权限模式 |

803| `continue_conversation` | `bool` | `False` | 继续最近的对话 |

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

805| `max_turns` | `int \| None` | `None` | 最大代理轮次(工具使用往返) |

806| `max_budget_usd` | `float \| None` | `None` | 当客户端成本估计达到此 USD 值时停止查询。与 `total_cost_usd` 的相同估计进行比较;见 [跟踪成本和使用](/zh-CN/agent-sdk/cost-tracking) 了解准确性注意事项 |

807| `disallowed_tools` | `list[str]` | `[]` | 始终拒绝的工具。拒绝规则首先检查并覆盖 `allowed_tools` 和 `permission_mode`(包括 `bypassPermissions`) |

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

809| `model` | `str \| None` | `None` | 要使用的 Claude 模型 |

810| `fallback_model` | `str \| None` | `None` | 主模型失败时使用的备用模型 |

811| `betas` | `list[SdkBeta]` | `[]` | 要启用的测试功能。见 [`SdkBeta`](#sdk-beta) 了解可用选项 |

812| `output_format` | `dict[str, Any] \| None` | `None` | 结构化响应的输出格式(例如 `{"type": "json_schema", "schema": {...}}`)。见 [结构化输出](/zh-CN/agent-sdk/structured-outputs) 了解详情 |

813| `permission_prompt_tool_name` | `str \| None` | `None` | 权限提示的 MCP 工具名称 |

814| `cwd` | `str \| Path \| None` | `None` | 当前工作目录 |

815| `cli_path` | `str \| Path \| None` | `None` | Claude Code CLI 可执行文件的自定义路径 |

816| `settings` | `str \| None` | `None` | 设置文件的路径 |

817| `add_dirs` | `list[str \| Path]` | `[]` | Claude 可以访问的其他目录 |

818| `env` | `dict[str, str]` | `{}` | 环境变量合并到继承的进程环境之上。见 [环境变量](/zh-CN/env-vars) 了解底层 CLI 读取的变量 |

819| `extra_args` | `dict[str, str \| None]` | `{}` | 直接传递给 CLI 的其他 CLI 参数 |

820| `max_buffer_size` | `int \| None` | `None` | 缓冲 CLI stdout 时的最大字节数 |

821| `debug_stderr` | `Any` | `sys.stderr` | *已弃用* - 用于调试输出的类文件对象。改用 `stderr` 回调 |

822| `stderr` | `Callable[[str], None] \| None` | `None` | CLI 中 stderr 输出的回调函数 |

823| `can_use_tool` | [`CanUseTool`](#can-use-tool) ` \| None` | `None` | 工具权限回调函数。见 [权限类型](#can-use-tool) 了解详情 |

824| `hooks` | `dict[HookEvent, list[HookMatcher]] \| None` | `None` | 用于拦截事件的 hooks 配置 |

825| `user` | `str \| None` | `None` | 用户标识符 |

826| `include_partial_messages` | `bool` | `False` | 包括部分消息流式事件。启用时,会产生 [`StreamEvent`](#stream-event) 消息 |

827| `fork_session` | `bool` | `False` | 使用 `resume` 恢复时,分叉到新会话 ID 而不是继续原始会话 |

828| `agents` | `dict[str, AgentDefinition] \| None` | `None` | 以编程方式定义的子代理 |

829| `plugins` | `list[SdkPluginConfig]` | `[]` | 从本地路径加载自定义插件。见 [Plugins](/zh-CN/agent-sdk/plugins) 了解详情 |

830| `sandbox` | [`SandboxSettings`](#sandbox-settings) ` \| None` | `None` | 以编程方式配置沙箱行为。见 [沙箱设置](#sandbox-settings) 了解详情 |

831| `setting_sources` | `list[SettingSource] \| None` | `None`(CLI 默认值:所有源) | 控制加载哪些文件系统设置。传递 `[]` 以禁用用户、项目和本地设置。无论如何都会加载托管策略设置。见 [使用 Claude Code 功能](/zh-CN/agent-sdk/claude-code-features#what-settingsources-does-not-control) |

832| `max_thinking_tokens` | `int \| None` | `None` | *已弃用* - 思考块的最大令牌数。改用 `thinking` |

833| `thinking` | [`ThinkingConfig`](#thinking-config) ` \| None` | `None` | 控制扩展思考行为。优先于 `max_thinking_tokens` |

834| `effort` | `Literal["low", "medium", "high", "max"] \| None` | `None` | 思考深度的努力级别 |

835| `session_store` | [`SessionStore`](/zh-CN/agent-sdk/session-storage#the-session-store-interface) ` \| None` | `None` | 将会话记录镜像到外部后端,以便任何主机都可以恢复它们。见 [将会话持久化到外部存储](/zh-CN/agent-sdk/session-storage) |

836 

837### `OutputFormat`

838 

839结构化输出验证的配置。将其作为 `dict` 传递给 `ClaudeAgentOptions` 上的 `output_format` 字段:

840 

841```python theme={null}

842# Expected dict shape for output_format

843{

844 "type": "json_schema",

845 "schema": {...}, # Your JSON Schema definition

846}

847```

848 

849| 字段 | 必需 | 描述 |

850| :------- | :- | :------------------------------------ |

851| `type` | 是 | 必须是 `"json_schema"` 用于 JSON Schema 验证 |

852| `schema` | 是 | 用于输出验证的 JSON Schema 定义 |

853 

854### `SystemPromptPreset`

855 

856使用 Claude Code 的预设系统提示和可选添加的配置。

857 

858```python theme={null}

859class SystemPromptPreset(TypedDict):

860 type: Literal["preset"]

861 preset: Literal["claude_code"]

862 append: NotRequired[str]

863 exclude_dynamic_sections: NotRequired[bool]

864```

865 

866| 字段 | 必需 | 描述 |

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

868| `type` | 是 | 必须是 `"preset"` 以使用预设系统提示 |

869| `preset` | 是 | 必须是 `"claude_code"` 以使用 Claude Code 的系统提示 |

870| `append` | 否 | 要追加到预设系统提示的其他说明 |

871| `exclude_dynamic_sections` | 否 | 将每个会话的上下文(如工作目录、git 状态和内存路径)从系统提示移到第一条用户消息。改进跨用户和机器的提示缓存重用。见 [修改系统提示](/zh-CN/agent-sdk/modifying-system-prompts#improve-prompt-caching-across-users-and-machines) |

872 

873### `SettingSource`

874 

875控制 SDK 从哪些基于文件系统的配置源加载设置。

876 

877```python theme={null}

878SettingSource = Literal["user", "project", "local"]

879```

880 

881| 值 | 描述 | 位置 |

882| :---------- | :----------------- | :---------------------------- |

883| `"user"` | 全局用户设置 | `~/.claude/settings.json` |

884| `"project"` | 共享项目设置(版本控制) | `.claude/settings.json` |

885| `"local"` | 本地项目设置(gitignored) | `.claude/settings.local.json` |

886 

887#### 默认行为

888 

889当 `setting_sources` 被省略或为 `None` 时,`query()` 加载与 Claude Code CLI 相同的文件系统设置:用户、项目和本地。无论如何都会加载托管策略设置。见 [settingSources 不控制什么](/zh-CN/agent-sdk/claude-code-features#what-settingsources-does-not-control) 了解无论此选项如何都会读取的输入,以及如何禁用它们。

890 

891#### 为什么使用 setting\_sources

892 

893**禁用文件系统设置:**

894 

895```python theme={null}

896# Do not load user, project, or local settings from disk

897from claude_agent_sdk import query, ClaudeAgentOptions

898 

899async for message in query(

900 prompt="Analyze this code",

901 options=ClaudeAgentOptions(

902 setting_sources=[]

903 ),

904):

905 print(message)

906```

907 

908<Note>

909 在 Python SDK 0.1.59 及更早版本中,空列表的处理方式与省略选项相同,因此 `setting_sources=[]` 不会禁用文件系统设置。如果你需要空列表生效,请升级到较新版本。TypeScript SDK 不受影响。

910</Note>

911 

912**显式加载所有文件系统设置:**

913 

914```python theme={null}

915from claude_agent_sdk import query, ClaudeAgentOptions

916 

917async for message in query(

918 prompt="Analyze this code",

919 options=ClaudeAgentOptions(

920 setting_sources=["user", "project", "local"]

921 ),

922):

923 print(message)

924```

925 

926**仅加载特定设置源:**

927 

928```python theme={null}

929# Load only project settings, ignore user and local

930async for message in query(

931 prompt="Run CI checks",

932 options=ClaudeAgentOptions(

933 setting_sources=["project"] # Only .claude/settings.json

934 ),

935):

936 print(message)

937```

938 

939**测试和 CI 环境:**

940 

941```python theme={null}

942# Ensure consistent behavior in CI by excluding local settings

943async for message in query(

944 prompt="Run tests",

945 options=ClaudeAgentOptions(

946 setting_sources=["project"], # Only team-shared settings

947 permission_mode="bypassPermissions",

948 ),

949):

950 print(message)

951```

952 

953**仅 SDK 应用程序:**

954 

955```python theme={null}

956# Define everything programmatically.

957# Pass [] to opt out of filesystem setting sources.

958async for message in query(

959 prompt="Review this PR",

960 options=ClaudeAgentOptions(

961 setting_sources=[],

962 agents={...},

963 mcp_servers={...},

964 allowed_tools=["Read", "Grep", "Glob"],

965 ),

966):

967 print(message)

968```

969 

970**加载 CLAUDE.md 项目说明:**

971 

972```python theme={null}

973# Load project settings to include CLAUDE.md files

974async for message in query(

975 prompt="Add a new feature following project conventions",

976 options=ClaudeAgentOptions(

977 system_prompt={

978 "type": "preset",

979 "preset": "claude_code", # Use Claude Code's system prompt

980 },

981 setting_sources=["project"], # Loads CLAUDE.md from project

982 allowed_tools=["Read", "Write", "Edit"],

983 ),

984):

985 print(message)

986```

987 

988#### 设置优先级

989 

990加载多个源时,设置按此优先级合并(从高到低):

991 

9921. 本地设置(`.claude/settings.local.json`)

9932. 项目设置(`.claude/settings.json`)

9943. 用户设置(`~/.claude/settings.json`)

995 

996编程选项(如 `agents` 和 `allowed_tools`)覆盖用户、项目和本地文件系统设置。托管策略设置优先于编程选项。

997 

998### `AgentDefinition`

999 

1000以编程方式定义的子代理的配置。

1001 

1002```python theme={null}

1003@dataclass

1004class AgentDefinition:

1005 description: str

1006 prompt: str

1007 tools: list[str] | None = None

1008 disallowedTools: list[str] | None = None

1009 model: str | None = None

1010 skills: list[str] | None = None

1011 memory: Literal["user", "project", "local"] | None = None

1012 mcpServers: list[str | dict[str, Any]] | None = None

1013 initialPrompt: str | None = None

1014 maxTurns: int | None = None

1015 background: bool | None = None

1016 effort: Literal["low", "medium", "high", "max"] | int | None = None

1017 permissionMode: PermissionMode | None = None

1018```

1019 

1020| 字段 | 必需 | 描述 |

1021| :---------------- | :- | :----------------------------------------------------------------------------- |

1022| `description` | 是 | 何时使用此代理的自然语言描述 |

1023| `prompt` | 是 | 代理的系统提示 |

1024| `tools` | 否 | 允许的工具名称数组。如果省略,继承所有工具 |

1025| `disallowedTools` | 否 | 要从代理的工具集中移除的工具名称数组 |

1026| `model` | 否 | 此代理的模型覆盖。接受别名如 `"sonnet"`、`"opus"`、`"haiku"` 或 `"inherit"`,或完整模型 ID。如果省略,使用主模型 |

1027| `skills` | 否 | 此代理可用的技能名称列表 |

1028| `memory` | 否 | 此代理的内存源:`"user"`、`"project"` 或 `"local"` |

1029| `mcpServers` | 否 | 此代理可用的 MCP 服务器。每个条目是服务器名称或内联 `{name: config}` 字典 |

1030| `initialPrompt` | 否 | 当此代理作为主线程代理运行时自动提交为第一个用户轮次 |

1031| `maxTurns` | 否 | 代理停止前的最大代理轮次数 |

1032| `background` | 否 | 调用时将此代理作为非阻塞后台任务运行 |

1033| `effort` | 否 | 此代理的推理努力级别。接受命名级别或整数 |

1034| `permissionMode` | 否 | 此代理内工具执行的权限模式。见 [`PermissionMode`](#permission-mode) |

1035 

1036<Note>

1037 `AgentDefinition` 字段名称使用 camelCase,如 `disallowedTools`、`permissionMode` 和 `maxTurns`。这些名称直接映射到与 TypeScript SDK 共享的线路格式。这与 `ClaudeAgentOptions` 不同,后者对等效的顶级字段(如 `disallowed_tools` 和 `permission_mode`)使用 Python snake\_case。因为 `AgentDefinition` 是数据类,传递 snake\_case 关键字在构造时会引发 `TypeError`。

1038</Note>

1039 

1040### `PermissionMode`

1041 

1042用于控制工具执行的权限模式。

1043 

1044```python theme={null}

1045PermissionMode = Literal[

1046 "default", # Standard permission behavior

1047 "acceptEdits", # Auto-accept file edits

1048 "plan", # Planning mode - no execution

1049 "dontAsk", # Deny anything not pre-approved instead of prompting

1050 "bypassPermissions", # Bypass all permission checks (use with caution)

1051]

1052```

1053 

1054### `CanUseTool`

1055 

1056工具权限回调函数的类型别名。

1057 

1058```python theme={null}

1059CanUseTool = Callable[

1060 [str, dict[str, Any], ToolPermissionContext], Awaitable[PermissionResult]

1061]

1062```

1063 

1064回调接收:

1065 

1066* `tool_name`:被调用的工具的名称

1067* `input_data`:工具的输入参数

1068* `context`:带有附加信息的 `ToolPermissionContext`

1069 

1070返回 `PermissionResult`(`PermissionResultAllow` 或 `PermissionResultDeny`)。

1071 

1072### `ToolPermissionContext`

1073 

1074传递给工具权限回调的上下文信息。

1075 

1076```python theme={null}

1077@dataclass

1078class ToolPermissionContext:

1079 signal: Any | None = None # Future: abort signal support

1080 suggestions: list[PermissionUpdate] = field(default_factory=list)

1081```

1082 

1083| 字段 | 类型 | 描述 |

1084| :------------ | :----------------------- | :------------- |

1085| `signal` | `Any \| None` | 保留供将来中止信号支持 |

1086| `suggestions` | `list[PermissionUpdate]` | 来自 CLI 的权限更新建议 |

1087 

1088### `PermissionResult`

1089 

1090权限回调结果的联合类型。

1091 

1092```python theme={null}

1093PermissionResult = PermissionResultAllow | PermissionResultDeny

1094```

1095 

1096### `PermissionResultAllow`

1097 

1098指示应允许工具调用的结果。

1099 

1100```python theme={null}

1101@dataclass

1102class PermissionResultAllow:

1103 behavior: Literal["allow"] = "allow"

1104 updated_input: dict[str, Any] | None = None

1105 updated_permissions: list[PermissionUpdate] | None = None

1106```

1107 

1108| 字段 | 类型 | 默认值 | 描述 |

1109| :-------------------- | :------------------------------- | :-------- | :---------------- |

1110| `behavior` | `Literal["allow"]` | `"allow"` | 必须是 "allow" |

1111| `updated_input` | `dict[str, Any] \| None` | `None` | 要使用的修改后的输入而不是原始输入 |

1112| `updated_permissions` | `list[PermissionUpdate] \| None` | `None` | 要应用的权限更新 |

1113 

1114### `PermissionResultDeny`

1115 

1116指示应拒绝工具调用的结果。

1117 

1118```python theme={null}

1119@dataclass

1120class PermissionResultDeny:

1121 behavior: Literal["deny"] = "deny"

1122 message: str = ""

1123 interrupt: bool = False

1124```

1125 

1126| 字段 | 类型 | 默认值 | 描述 |

1127| :---------- | :---------------- | :------- | :----------- |

1128| `behavior` | `Literal["deny"]` | `"deny"` | 必须是 "deny" |

1129| `message` | `str` | `""` | 解释为什么拒绝工具的消息 |

1130| `interrupt` | `bool` | `False` | 是否中断当前执行 |

1131 

1132### `PermissionUpdate`

1133 

1134用于以编程方式更新权限的配置。

1135 

1136```python theme={null}

1137@dataclass

1138class PermissionUpdate:

1139 type: Literal[

1140 "addRules",

1141 "replaceRules",

1142 "removeRules",

1143 "setMode",

1144 "addDirectories",

1145 "removeDirectories",

1146 ]

1147 rules: list[PermissionRuleValue] | None = None

1148 behavior: Literal["allow", "deny", "ask"] | None = None

1149 mode: PermissionMode | None = None

1150 directories: list[str] | None = None

1151 destination: (

1152 Literal["userSettings", "projectSettings", "localSettings", "session"] | None

1153 ) = None

1154```

1155 

1156| 字段 | 类型 | 描述 |

1157| :------------ | :---------------------------------------- | :-------------- |

1158| `type` | `Literal[...]` | 权限更新操作的类型 |

1159| `rules` | `list[PermissionRuleValue] \| None` | 用于添加/替换/移除操作的规则 |

1160| `behavior` | `Literal["allow", "deny", "ask"] \| None` | 基于规则的操作的行为 |

1161| `mode` | `PermissionMode \| None` | setMode 操作的模式 |

1162| `directories` | `list[str] \| None` | 用于添加/移除目录操作的目录 |

1163| `destination` | `Literal[...] \| None` | 应用权限更新的位置 |

1164 

1165### `PermissionRuleValue`

1166 

1167要在权限更新中添加、替换或移除的规则。

1168 

1169```python theme={null}

1170@dataclass

1171class PermissionRuleValue:

1172 tool_name: str

1173 rule_content: str | None = None

1174```

1175 

1176### `ToolsPreset`

1177 

1178使用 Claude Code 的默认工具集的预设工具配置。

1179 

1180```python theme={null}

1181class ToolsPreset(TypedDict):

1182 type: Literal["preset"]

1183 preset: Literal["claude_code"]

1184```

1185 

1186### `ThinkingConfig`

1187 

1188控制扩展思考行为。三种配置的联合:

1189 

1190```python theme={null}

1191class ThinkingConfigAdaptive(TypedDict):

1192 type: Literal["adaptive"]

1193 

1194 

1195class ThinkingConfigEnabled(TypedDict):

1196 type: Literal["enabled"]

1197 budget_tokens: int

1198 

1199 

1200class ThinkingConfigDisabled(TypedDict):

1201 type: Literal["disabled"]

1202 

1203 

1204ThinkingConfig = ThinkingConfigAdaptive | ThinkingConfigEnabled | ThinkingConfigDisabled

1205```

1206 

1207| 变体 | 字段 | 描述 |

1208| :--------- | :---------------------- | :--------------- |

1209| `adaptive` | `type` | Claude 自适应决定何时思考 |

1210| `enabled` | `type`, `budget_tokens` | 启用具有特定令牌预算的思考 |

1211| `disabled` | `type` | 禁用思考 |

1212 

1213因为这些是 `TypedDict` 类,它们在运行时是普通字典。要么将它们构造为字典字面量,要么调用类作为构造函数;两者都产生 `dict`。使用 `config["budget_tokens"]` 访问字段,而不是 `config.budget_tokens`:

1214 

1215```python theme={null}

1216from claude_agent_sdk import ClaudeAgentOptions, ThinkingConfigEnabled

1217 

1218# Option 1: dict literal (recommended, no import needed)

1219options = ClaudeAgentOptions(thinking={"type": "enabled", "budget_tokens": 20000})

1220 

1221# Option 2: constructor-style (returns a plain dict)

1222config = ThinkingConfigEnabled(type="enabled", budget_tokens=20000)

1223print(config["budget_tokens"]) # 20000

1224# config.budget_tokens would raise AttributeError

1225```

1226 

1227### `SdkBeta`

1228 

1229SDK 测试功能的字面类型。

1230 

1231```python theme={null}

1232SdkBeta = Literal["context-1m-2025-08-07"]

1233```

1234 

1235与 `ClaudeAgentOptions` 中的 `betas` 字段一起使用以启用测试功能。

1236 

1237<Warning>

1238 `context-1m-2025-08-07` 测试版自 2026 年 4 月 30 日起已停用。使用 Claude Sonnet 4.5 或 Sonnet 4 传递此标头无效,超过标准 200k 令牌上下文窗口的请求返回错误。要使用 1M 令牌上下文窗口,请迁移到 [Claude Sonnet 4.6、Claude Opus 4.6 或 Claude Opus 4.7](https://platform.claude.com/docs/en/about-claude/models/overview),它们以标准定价包括 1M 上下文,无需测试版标头。

1239</Warning>

1240 

1241### `McpSdkServerConfig`

1242 

1243使用 `create_sdk_mcp_server()` 创建的 SDK MCP 服务器的配置。

1244 

1245```python theme={null}

1246class McpSdkServerConfig(TypedDict):

1247 type: Literal["sdk"]

1248 name: str

1249 instance: Any # MCP Server instance

1250```

1251 

1252### `McpServerConfig`

1253 

1254MCP 服务器配置的联合类型。

1255 

1256```python theme={null}

1257McpServerConfig = (

1258 McpStdioServerConfig | McpSSEServerConfig | McpHttpServerConfig | McpSdkServerConfig

1259)

1260```

1261 

1262#### `McpStdioServerConfig`

1263 

1264```python theme={null}

1265class McpStdioServerConfig(TypedDict):

1266 type: NotRequired[Literal["stdio"]] # Optional for backwards compatibility

1267 command: str

1268 args: NotRequired[list[str]]

1269 env: NotRequired[dict[str, str]]

1270```

1271 

1272#### `McpSSEServerConfig`

1273 

1274```python theme={null}

1275class McpSSEServerConfig(TypedDict):

1276 type: Literal["sse"]

1277 url: str

1278 headers: NotRequired[dict[str, str]]

1279```

1280 

1281#### `McpHttpServerConfig`

1282 

1283```python theme={null}

1284class McpHttpServerConfig(TypedDict):

1285 type: Literal["http"]

1286 url: str

1287 headers: NotRequired[dict[str, str]]

1288```

1289 

1290### `McpServerStatusConfig`

1291 

1292由 [`get_mcp_status()`](#methods) 报告的 MCP 服务器的配置。这是所有 [`McpServerConfig`](#mcp-server-config) 传输变体加上用于通过 claude.ai 代理的服务器的仅输出 `claudeai-proxy` 变体的联合。

1293 

1294```python theme={null}

1295McpServerStatusConfig = (

1296 McpStdioServerConfig

1297 | McpSSEServerConfig

1298 | McpHttpServerConfig

1299 | McpSdkServerConfigStatus

1300 | McpClaudeAIProxyServerConfig

1301)

1302```

1303 

1304`McpSdkServerConfigStatus` 是 [`McpSdkServerConfig`](#mcp-sdk-server-config) 的可序列化形式,仅包含 `type`(`"sdk"`)和 `name`(`str`)字段;进程内 `instance` 被省略。`McpClaudeAIProxyServerConfig` 具有 `type`(`"claudeai-proxy"`)、`url`(`str`)和 `id`(`str`)字段。

1305 

1306### `McpStatusResponse`

1307 

1308来自 [`ClaudeSDKClient.get_mcp_status()`](#methods) 的响应。在 `mcpServers` 键下包装服务器状态列表。

1309 

1310```python theme={null}

1311class McpStatusResponse(TypedDict):

1312 mcpServers: list[McpServerStatus]

1313```

1314 

1315### `McpServerStatus`

1316 

1317连接的 MCP 服务器的状态,包含在 [`McpStatusResponse`](#mcp-status-response) 中。

1318 

1319```python theme={null}

1320class McpServerStatus(TypedDict):

1321 name: str

1322 status: McpServerConnectionStatus # "connected" | "failed" | "needs-auth" | "pending" | "disabled"

1323 serverInfo: NotRequired[McpServerInfo]

1324 error: NotRequired[str]

1325 config: NotRequired[McpServerStatusConfig]

1326 scope: NotRequired[str]

1327 tools: NotRequired[list[McpToolInfo]]

1328```

1329 

1330| 字段 | 类型 | 描述 |

1331| :----------- | :------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------- |

1332| `name` | `str` | 服务器名称 |

1333| `status` | `str` | `"connected"`、`"failed"`、`"needs-auth"`、`"pending"` 或 `"disabled"` 之一 |

1334| `serverInfo` | `dict`(可选) | 服务器名称和版本(`{"name": str, "version": str}`) |

1335| `error` | `str`(可选) | 服务器连接失败时的错误消息 |

1336| `config` | [`McpServerStatusConfig`](#mcp-server-status-config)(可选) | 服务器配置。与 [`McpServerConfig`](#mcp-server-config) 形状相同(stdio、SSE、HTTP 或 SDK),加上通过 claude.ai 连接的服务器的 `claudeai-proxy` 变体 |

1337| `scope` | `str`(可选) | 配置范围 |

1338| `tools` | `list`(可选) | 此服务器提供的工具,每个都有 `name`、`description` 和 `annotations` 字段 |

1339 

1340### `SdkPluginConfig`

1341 

1342SDK 中加载插件的配置。

1343 

1344```python theme={null}

1345class SdkPluginConfig(TypedDict):

1346 type: Literal["local"]

1347 path: str

1348```

1349 

1350| 字段 | 类型 | 描述 |

1351| :----- | :----------------- | :----------------------- |

1352| `type` | `Literal["local"]` | 必须是 `"local"`(目前仅支持本地插件) |

1353| `path` | `str` | 插件目录的绝对或相对路径 |

1354 

1355**示例:**

1356 

1357```python theme={null}

1358plugins = [

1359 {"type": "local", "path": "./my-plugin"},

1360 {"type": "local", "path": "/absolute/path/to/plugin"},

1361]

1362```

1363 

1364有关创建和使用插件的完整信息,见 [Plugins](/zh-CN/agent-sdk/plugins)。

1365 

1366## 消息类型

1367 

1368### `Message`

1369 

1370所有可能消息的联合类型。

1371 

1372```python theme={null}

1373Message = (

1374 UserMessage

1375 | AssistantMessage

1376 | SystemMessage

1377 | ResultMessage

1378 | StreamEvent

1379 | RateLimitEvent

1380)

1381```

1382 

1383### `UserMessage`

1384 

1385用户输入消息。

1386 

1387```python theme={null}

1388@dataclass

1389class UserMessage:

1390 content: str | list[ContentBlock]

1391 uuid: str | None = None

1392 parent_tool_use_id: str | None = None

1393 tool_use_result: dict[str, Any] | None = None

1394```

1395 

1396| 字段 | 类型 | 描述 |

1397| :------------------- | :-------------------------- | :--------------------- |

1398| `content` | `str \| list[ContentBlock]` | 消息内容为文本或内容块 |

1399| `uuid` | `str \| None` | 唯一消息标识符 |

1400| `parent_tool_use_id` | `str \| None` | 如果此消息是工具结果响应,则为工具使用 ID |

1401| `tool_use_result` | `dict[str, Any] \| None` | 工具结果数据(如果适用) |

1402 

1403### `AssistantMessage`

1404 

1405带有内容块的助手响应消息。

1406 

1407```python theme={null}

1408@dataclass

1409class AssistantMessage:

1410 content: list[ContentBlock]

1411 model: str

1412 parent_tool_use_id: str | None = None

1413 error: AssistantMessageError | None = None

1414 usage: dict[str, Any] | None = None

1415 message_id: str | None = None

1416```

1417 

1418| 字段 | 类型 | 描述 |

1419| :------------------- | :------------------------------------------------------------- | :----------------------------------------------------------- |

1420| `content` | `list[ContentBlock]` | 响应中的内容块列表 |

1421| `model` | `str` | 生成响应的模型 |

1422| `parent_tool_use_id` | `str \| None` | 如果这是嵌套响应,则为工具使用 ID |

1423| `error` | [`AssistantMessageError`](#assistant-message-error) ` \| None` | 如果响应遇到错误,则为错误类型 |

1424| `usage` | `dict[str, Any] \| None` | 每条消息的令牌使用情况(与 [`ResultMessage.usage`](#result-message) 相同的键) |

1425| `message_id` | `str \| None` | API 消息 ID。来自一个轮次的多条消息共享相同的 ID |

1426 

1427### `AssistantMessageError`

1428 

1429助手消息的可能错误类型。

1430 

1431```python theme={null}

1432AssistantMessageError = Literal[

1433 "authentication_failed",

1434 "billing_error",

1435 "rate_limit",

1436 "invalid_request",

1437 "server_error",

1438 "max_output_tokens",

1439 "unknown",

1440]

1441```

1442 

1443### `SystemMessage`

1444 

1445带有元数据的系统消息。

1446 

1447```python theme={null}

1448@dataclass

1449class SystemMessage:

1450 subtype: str

1451 data: dict[str, Any]

1452```

1453 

1454### `ResultMessage`

1455 

1456带有成本和使用信息的最终结果消息。

1457 

1458```python theme={null}

1459@dataclass

1460class ResultMessage:

1461 subtype: str

1462 duration_ms: int

1463 duration_api_ms: int

1464 is_error: bool

1465 num_turns: int

1466 session_id: str

1467 total_cost_usd: float | None = None

1468 usage: dict[str, Any] | None = None

1469 result: str | None = None

1470 stop_reason: str | None = None

1471 structured_output: Any = None

1472 model_usage: dict[str, Any] | None = None

1473```

1474 

1475`usage` 字典在存在时包含以下键:

1476 

1477| 键 | 类型 | 描述 |

1478| ----------------------------- | ----- | ------------- |

1479| `input_tokens` | `int` | 消耗的总输入令牌。 |

1480| `output_tokens` | `int` | 生成的总输出令牌。 |

1481| `cache_creation_input_tokens` | `int` | 用于创建新缓存条目的令牌。 |

1482| `cache_read_input_tokens` | `int` | 从现有缓存条目读取的令牌。 |

1483 

1484`model_usage` 字典将模型名称映射到每个模型的使用情况。内部字典键使用 camelCase,因为该值从底层 CLI 进程未修改地传递,匹配 TypeScript [`ModelUsage`](/zh-CN/agent-sdk/typescript#model-usage) 类型:

1485 

1486| 键 | 类型 | 描述 |

1487| -------------------------- | ------- | ------------------------------------------------------------------------ |

1488| `inputTokens` | `int` | 此模型的输入令牌。 |

1489| `outputTokens` | `int` | 此模型的输出令牌。 |

1490| `cacheReadInputTokens` | `int` | 此模型的缓存读取令牌。 |

1491| `cacheCreationInputTokens` | `int` | 此模型的缓存创建令牌。 |

1492| `webSearchRequests` | `int` | 此模型进行的网络搜索请求。 |

1493| `costUSD` | `float` | 此模型的估计成本(美元),客户端计算。见 [跟踪成本和使用](/zh-CN/agent-sdk/cost-tracking) 了解计费注意事项。 |

1494| `contextWindow` | `int` | 此模型的上下文窗口大小。 |

1495| `maxOutputTokens` | `int` | 此模型的最大输出令牌限制。 |

1496 

1497### `StreamEvent`

1498 

1499流式事件,用于流式传输期间的部分消息更新。仅在 `ClaudeAgentOptions` 中 `include_partial_messages=True` 时接收。通过 `from claude_agent_sdk.types import StreamEvent` 导入。

1500 

1501```python theme={null}

1502@dataclass

1503class StreamEvent:

1504 uuid: str

1505 session_id: str

1506 event: dict[str, Any] # The raw Claude API stream event

1507 parent_tool_use_id: str | None = None

1508```

1509 

1510| 字段 | 类型 | 描述 |

1511| :------------------- | :--------------- | :-------------------- |

1512| `uuid` | `str` | 此事件的唯一标识符 |

1513| `session_id` | `str` | 会话标识符 |

1514| `event` | `dict[str, Any]` | 原始 Claude API 流事件数据 |

1515| `parent_tool_use_id` | `str \| None` | 如果此事件来自子代理,则为父工具使用 ID |

1516 

1517### `RateLimitEvent`

1518 

1519当速率限制状态更改时发出(例如,从 `"allowed"` 到 `"allowed_warning"`)。使用此来在用户达到硬限制之前警告他们,或在状态为 `"rejected"` 时退避。

1520 

1521```python theme={null}

1522@dataclass

1523class RateLimitEvent:

1524 rate_limit_info: RateLimitInfo

1525 uuid: str

1526 session_id: str

1527```

1528 

1529| 字段 | 类型 | 描述 |

1530| :---------------- | :---------------------------------- | :------- |

1531| `rate_limit_info` | [`RateLimitInfo`](#rate-limit-info) | 当前速率限制状态 |

1532| `uuid` | `str` | 唯一事件标识符 |

1533| `session_id` | `str` | 会话标识符 |

1534 

1535### `RateLimitInfo`

1536 

1537由 [`RateLimitEvent`](#rate-limit-event) 携带的速率限制状态。

1538 

1539```python theme={null}

1540RateLimitStatus = Literal["allowed", "allowed_warning", "rejected"]

1541RateLimitType = Literal[

1542 "five_hour", "seven_day", "seven_day_opus", "seven_day_sonnet", "overage"

1543]

1544 

1545 

1546@dataclass

1547class RateLimitInfo:

1548 status: RateLimitStatus

1549 resets_at: int | None = None

1550 rate_limit_type: RateLimitType | None = None

1551 utilization: float | None = None

1552 overage_status: RateLimitStatus | None = None

1553 overage_resets_at: int | None = None

1554 overage_disabled_reason: str | None = None

1555 raw: dict[str, Any] = field(default_factory=dict)

1556```

1557 

1558| 字段 | 类型 | 描述 |

1559| :------------------------ | :------------------------ | :-------------------------------------------------- |

1560| `status` | `RateLimitStatus` | 当前状态。`"allowed_warning"` 表示接近限制;`"rejected"` 表示达到限制 |

1561| `resets_at` | `int \| None` | 速率限制窗口重置的 Unix 时间戳 |

1562| `rate_limit_type` | `RateLimitType \| None` | 哪个速率限制窗口适用 |

1563| `utilization` | `float \| None` | 消耗的速率限制的分数(0.0 到 1.0) |

1564| `overage_status` | `RateLimitStatus \| None` | 按需付费超额使用的状态(如果适用) |

1565| `overage_resets_at` | `int \| None` | 超额窗口重置的 Unix 时间戳 |

1566| `overage_disabled_reason` | `str \| None` | 为什么超额不可用,如果状态为 `"rejected"` |

1567| `raw` | `dict[str, Any]` | 来自 CLI 的完整原始字典,包括上面未建模的字段 |

1568 

1569### `TaskStartedMessage`

1570 

1571当后台任务启动时发出。后台任务是在主轮次之外跟踪的任何内容:后台 Bash 命令、[Monitor](#monitor) 监视、通过 Agent 工具生成的子代理或远程代理。`task_type` 字段告诉你是哪一个。此命名与 `Task` 到 `Agent` 工具重命名无关。

1572 

1573```python theme={null}

1574@dataclass

1575class TaskStartedMessage(SystemMessage):

1576 task_id: str

1577 description: str

1578 uuid: str

1579 session_id: str

1580 tool_use_id: str | None = None

1581 task_type: str | None = None

1582```

1583 

1584| 字段 | 类型 | 描述 |

1585| :------------ | :------------ | :------------------------------------------------------------------------------ |

1586| `task_id` | `str` | 任务的唯一标识符 |

1587| `description` | `str` | 任务的描述 |

1588| `uuid` | `str` | 唯一消息标识符 |

1589| `session_id` | `str` | 会话标识符 |

1590| `tool_use_id` | `str \| None` | 关联的工具使用 ID |

1591| `task_type` | `str \| None` | 哪种后台任务:`"local_bash"` 用于后台 Bash 和 Monitor 监视,`"local_agent"` 或 `"remote_agent"` |

1592 

1593### `TaskUsage`

1594 

1595后台任务的令牌和计时数据。

1596 

1597```python theme={null}

1598class TaskUsage(TypedDict):

1599 total_tokens: int

1600 tool_uses: int

1601 duration_ms: int

1602```

1603 

1604### `TaskProgressMessage`

1605 

1606定期为运行的后台任务发出进度更新。

1607 

1608```python theme={null}

1609@dataclass

1610class TaskProgressMessage(SystemMessage):

1611 task_id: str

1612 description: str

1613 usage: TaskUsage

1614 uuid: str

1615 session_id: str

1616 tool_use_id: str | None = None

1617 last_tool_name: str | None = None

1618```

1619 

1620| 字段 | 类型 | 描述 |

1621| :--------------- | :------------ | :------------- |

1622| `task_id` | `str` | 任务的唯一标识符 |

1623| `description` | `str` | 当前状态描述 |

1624| `usage` | `TaskUsage` | 此任务迄今为止的令牌使用情况 |

1625| `uuid` | `str` | 唯一消息标识符 |

1626| `session_id` | `str` | 会话标识符 |

1627| `tool_use_id` | `str \| None` | 关联的工具使用 ID |

1628| `last_tool_name` | `str \| None` | 任务使用的最后一个工具的名称 |

1629 

1630### `TaskNotificationMessage`

1631 

1632当后台任务完成、失败或停止时发出。后台任务包括 `run_in_background` Bash 命令、Monitor 监视和后台子代理。

1633 

1634```python theme={null}

1635@dataclass

1636class TaskNotificationMessage(SystemMessage):

1637 task_id: str

1638 status: TaskNotificationStatus # "completed" | "failed" | "stopped"

1639 output_file: str

1640 summary: str

1641 uuid: str

1642 session_id: str

1643 tool_use_id: str | None = None

1644 usage: TaskUsage | None = None

1645```

1646 

1647| 字段 | 类型 | 描述 |

1648| :------------ | :----------------------- | :---------------------------------------- |

1649| `task_id` | `str` | 任务的唯一标识符 |

1650| `status` | `TaskNotificationStatus` | `"completed"`、`"failed"` 或 `"stopped"` 之一 |

1651| `output_file` | `str` | 任务输出文件的路径 |

1652| `summary` | `str` | 任务结果的摘要 |

1653| `uuid` | `str` | 唯一消息标识符 |

1654| `session_id` | `str` | 会话标识符 |

1655| `tool_use_id` | `str \| None` | 关联的工具使用 ID |

1656| `usage` | `TaskUsage \| None` | 任务的最终令牌使用情况 |

1657 

1658## 内容块类型

1659 

1660### `ContentBlock`

1661 

1662所有内容块的联合类型。

1663 

1664```python theme={null}

1665ContentBlock = TextBlock | ThinkingBlock | ToolUseBlock | ToolResultBlock

1666```

1667 

1668### `TextBlock`

1669 

1670文本内容块。

1671 

1672```python theme={null}

1673@dataclass

1674class TextBlock:

1675 text: str

1676```

1677 

1678### `ThinkingBlock`

1679 

1680思考内容块(用于具有思考能力的模型)。

1681 

1682```python theme={null}

1683@dataclass

1684class ThinkingBlock:

1685 thinking: str

1686 signature: str

1687```

1688 

1689### `ToolUseBlock`

1690 

1691工具使用请求块。

1692 

1693```python theme={null}

1694@dataclass

1695class ToolUseBlock:

1696 id: str

1697 name: str

1698 input: dict[str, Any]

1699```

1700 

1701### `ToolResultBlock`

1702 

1703工具执行结果块。

1704 

1705```python theme={null}

1706@dataclass

1707class ToolResultBlock:

1708 tool_use_id: str

1709 content: str | list[dict[str, Any]] | None = None

1710 is_error: bool | None = None

1711```

1712 

1713## 错误类型

1714 

1715### `ClaudeSDKError`

1716 

1717所有 SDK 错误的基础异常类。

1718 

1719```python theme={null}

1720class ClaudeSDKError(Exception):

1721 """Base error for Claude SDK."""

1722```

1723 

1724### `CLINotFoundError`

1725 

1726当 Claude Code CLI 未安装或找不到时引发。

1727 

1728```python theme={null}

1729class CLINotFoundError(CLIConnectionError):

1730 def __init__(

1731 self, message: str = "Claude Code not found", cli_path: str | None = None

1732 ):

1733 """

1734 Args:

1735 message: Error message (default: "Claude Code not found")

1736 cli_path: Optional path to the CLI that was not found

1737 """

1738```

1739 

1740### `CLIConnectionError`

1741 

1742当连接到 Claude Code 失败时引发。

1743 

1744```python theme={null}

1745class CLIConnectionError(ClaudeSDKError):

1746 """Failed to connect to Claude Code."""

1747```

1748 

1749### `ProcessError`

1750 

1751当 Claude Code 进程失败时引发。

1752 

1753```python theme={null}

1754class ProcessError(ClaudeSDKError):

1755 def __init__(

1756 self, message: str, exit_code: int | None = None, stderr: str | None = None

1757 ):

1758 self.exit_code = exit_code

1759 self.stderr = stderr

1760```

1761 

1762### `CLIJSONDecodeError`

1763 

1764当 JSON 解析失败时引发。

1765 

1766```python theme={null}

1767class CLIJSONDecodeError(ClaudeSDKError):

1768 def __init__(self, line: str, original_error: Exception):

1769 """

1770 Args:

1771 line: The line that failed to parse

1772 original_error: The original JSON decode exception

1773 """

1774 self.line = line

1775 self.original_error = original_error

1776```

1777 

1778## Hook 类型

1779 

1780有关使用 hooks 的综合指南,包括示例和常见模式,见 [Hooks 指南](/zh-CN/agent-sdk/hooks)。

1781 

1782### `HookEvent`

1783 

1784支持的 hook 事件类型。

1785 

1786```python theme={null}

1787HookEvent = Literal[

1788 "PreToolUse", # Called before tool execution

1789 "PostToolUse", # Called after tool execution

1790 "PostToolUseFailure", # Called when a tool execution fails

1791 "UserPromptSubmit", # Called when user submits a prompt

1792 "Stop", # Called when stopping execution

1793 "SubagentStop", # Called when a subagent stops

1794 "PreCompact", # Called before message compaction

1795 "Notification", # Called for notification events

1796 "SubagentStart", # Called when a subagent starts

1797 "PermissionRequest", # Called when a permission decision is needed

1798]

1799```

1800 

1801<Note>

1802 TypeScript SDK 支持 Python 中尚未提供的其他 hook 事件:`SessionStart`、`SessionEnd`、`Setup`、`TeammateIdle`、`TaskCompleted`、`ConfigChange`、`WorktreeCreate`、`WorktreeRemove` 和 `PostToolBatch`。

1803</Note>

1804 

1805### `HookCallback`

1806 

1807hook 回调函数的类型定义。

1808 

1809```python theme={null}

1810HookCallback = Callable[[HookInput, str | None, HookContext], Awaitable[HookJSONOutput]]

1811```

1812 

1813参数:

1814 

1815* `input`:强类型 hook 输入,具有基于 `hook_event_name` 的判别联合(见 [`HookInput`](#hook-input))

1816* `tool_use_id`:可选工具使用标识符(用于工具相关的 hooks)

1817* `context`:带有附加信息的 hook 上下文

1818 

1819返回可能包含以下内容的 [`HookJSONOutput`](#hook-json-output):

1820 

1821* `decision`:`"block"` 以阻止操作

1822* `systemMessage`:要添加到记录的系统消息

1823* `hookSpecificOutput`:hook 特定的输出数据

1824 

1825### `HookContext`

1826 

1827传递给 hook 回调的上下文信息。

1828 

1829```python theme={null}

1830class HookContext(TypedDict):

1831 signal: Any | None # Future: abort signal support

1832```

1833 

1834### `HookMatcher`

1835 

1836用于将 hooks 匹配到特定事件或工具的配置。

1837 

1838```python theme={null}

1839@dataclass

1840class HookMatcher:

1841 matcher: str | None = (

1842 None # Tool name or pattern to match (e.g., "Bash", "Write|Edit")

1843 )

1844 hooks: list[HookCallback] = field(

1845 default_factory=list

1846 ) # List of callbacks to execute

1847 timeout: float | None = (

1848 None # Timeout in seconds for all hooks in this matcher (default: 60)

1849 )

1850```

1851 

1852### `HookInput`

1853 

1854所有 hook 输入类型的联合类型。实际类型取决于 `hook_event_name` 字段。

1855 

1856```python theme={null}

1857HookInput = (

1858 PreToolUseHookInput

1859 | PostToolUseHookInput

1860 | PostToolUseFailureHookInput

1861 | UserPromptSubmitHookInput

1862 | StopHookInput

1863 | SubagentStopHookInput

1864 | PreCompactHookInput

1865 | NotificationHookInput

1866 | SubagentStartHookInput

1867 | PermissionRequestHookInput

1868)

1869```

1870 

1871### `BaseHookInput`

1872 

1873所有 hook 输入类型中存在的基础字段。

1874 

1875```python theme={null}

1876class BaseHookInput(TypedDict):

1877 session_id: str

1878 transcript_path: str

1879 cwd: str

1880 permission_mode: NotRequired[str]

1881```

1882 

1883| 字段 | 类型 | 描述 |

1884| :---------------- | :-------- | :-------- |

1885| `session_id` | `str` | 当前会话标识符 |

1886| `transcript_path` | `str` | 会话记录文件的路径 |

1887| `cwd` | `str` | 当前工作目录 |

1888| `permission_mode` | `str`(可选) | 当前权限模式 |

1889 

1890### `PreToolUseHookInput`

1891 

1892`PreToolUse` hook 事件的输入数据。

1893 

1894```python theme={null}

1895class PreToolUseHookInput(BaseHookInput):

1896 hook_event_name: Literal["PreToolUse"]

1897 tool_name: str

1898 tool_input: dict[str, Any]

1899 tool_use_id: str

1900 agent_id: NotRequired[str]

1901 agent_type: NotRequired[str]

1902```

1903 

1904| 字段 | 类型 | 描述 |

1905| :---------------- | :---------------------- | :----------------------- |

1906| `hook_event_name` | `Literal["PreToolUse"]` | 始终为 "PreToolUse" |

1907| `tool_name` | `str` | 即将执行的工具的名称 |

1908| `tool_input` | `dict[str, Any]` | 工具的输入参数 |

1909| `tool_use_id` | `str` | 此工具使用的唯一标识符 |

1910| `agent_id` | `str`(可选) | 子代理标识符,当 hook 在子代理内触发时存在 |

1911| `agent_type` | `str`(可选) | 子代理类型,当 hook 在子代理内触发时存在 |

1912 

1913### `PostToolUseHookInput`

1914 

1915`PostToolUse` hook 事件的输入数据。

1916 

1917```python theme={null}

1918class PostToolUseHookInput(BaseHookInput):

1919 hook_event_name: Literal["PostToolUse"]

1920 tool_name: str

1921 tool_input: dict[str, Any]

1922 tool_response: Any

1923 tool_use_id: str

1924 agent_id: NotRequired[str]

1925 agent_type: NotRequired[str]

1926```

1927 

1928| 字段 | 类型 | 描述 |

1929| :---------------- | :----------------------- | :----------------------- |

1930| `hook_event_name` | `Literal["PostToolUse"]` | 始终为 "PostToolUse" |

1931| `tool_name` | `str` | 已执行的工具的名称 |

1932| `tool_input` | `dict[str, Any]` | 使用的输入参数 |

1933| `tool_response` | `Any` | 工具执行的响应 |

1934| `tool_use_id` | `str` | 此工具使用的唯一标识符 |

1935| `agent_id` | `str`(可选) | 子代理标识符,当 hook 在子代理内触发时存在 |

1936| `agent_type` | `str`(可选) | 子代理类型,当 hook 在子代理内触发时存在 |

1937 

1938### `PostToolUseFailureHookInput`

1939 

1940`PostToolUseFailure` hook 事件的输入数据。当工具执行失败时调用。

1941 

1942```python theme={null}

1943class PostToolUseFailureHookInput(BaseHookInput):

1944 hook_event_name: Literal["PostToolUseFailure"]

1945 tool_name: str

1946 tool_input: dict[str, Any]

1947 tool_use_id: str

1948 error: str

1949 is_interrupt: NotRequired[bool]

1950 agent_id: NotRequired[str]

1951 agent_type: NotRequired[str]

1952```

1953 

1954| 字段 | 类型 | 描述 |

1955| :---------------- | :------------------------------ | :----------------------- |

1956| `hook_event_name` | `Literal["PostToolUseFailure"]` | 始终为 "PostToolUseFailure" |

1957| `tool_name` | `str` | 失败的工具的名称 |

1958| `tool_input` | `dict[str, Any]` | 使用的输入参数 |

1959| `tool_use_id` | `str` | 此工具使用的唯一标识符 |

1960| `error` | `str` | 失败执行的错误消息 |

1961| `is_interrupt` | `bool`(可选) | 失败是否由中断引起 |

1962| `agent_id` | `str`(可选) | 子代理标识符,当 hook 在子代理内触发时存在 |

1963| `agent_type` | `str`(可选) | 子代理类型,当 hook 在子代理内触发时存在 |

1964 

1965### `UserPromptSubmitHookInput`

1966 

1967`UserPromptSubmit` hook 事件的输入数据。

1968 

1969```python theme={null}

1970class UserPromptSubmitHookInput(BaseHookInput):

1971 hook_event_name: Literal["UserPromptSubmit"]

1972 prompt: str

1973```

1974 

1975| 字段 | 类型 | 描述 |

1976| :---------------- | :---------------------------- | :--------------------- |

1977| `hook_event_name` | `Literal["UserPromptSubmit"]` | 始终为 "UserPromptSubmit" |

1978| `prompt` | `str` | 用户提交的提示 |

1979 

1980### `StopHookInput`

1981 

1982`Stop` hook 事件的输入数据。

1983 

1984```python theme={null}

1985class StopHookInput(BaseHookInput):

1986 hook_event_name: Literal["Stop"]

1987 stop_hook_active: bool

1988```

1989 

1990| 字段 | 类型 | 描述 |

1991| :----------------- | :---------------- | :------------- |

1992| `hook_event_name` | `Literal["Stop"]` | 始终为 "Stop" |

1993| `stop_hook_active` | `bool` | stop hook 是否活跃 |

1994 

1995### `SubagentStopHookInput`

1996 

1997`SubagentStop` hook 事件的输入数据。

1998 

1999```python theme={null}

2000class SubagentStopHookInput(BaseHookInput):

2001 hook_event_name: Literal["SubagentStop"]

2002 stop_hook_active: bool

2003 agent_id: str

2004 agent_transcript_path: str

2005 agent_type: str

2006```

2007 

2008| 字段 | 类型 | 描述 |

2009| :---------------------- | :------------------------ | :----------------- |

2010| `hook_event_name` | `Literal["SubagentStop"]` | 始终为 "SubagentStop" |

2011| `stop_hook_active` | `bool` | stop hook 是否活跃 |

2012| `agent_id` | `str` | 子代理的唯一标识符 |

2013| `agent_transcript_path` | `str` | 子代理的记录文件路径 |

2014| `agent_type` | `str` | 子代理的类型 |

2015 

2016### `PreCompactHookInput`

2017 

2018`PreCompact` hook 事件的输入数据。

2019 

2020```python theme={null}

2021class PreCompactHookInput(BaseHookInput):

2022 hook_event_name: Literal["PreCompact"]

2023 trigger: Literal["manual", "auto"]

2024 custom_instructions: str | None

2025```

2026 

2027| 字段 | 类型 | 描述 |

2028| :-------------------- | :-------------------------- | :--------------- |

2029| `hook_event_name` | `Literal["PreCompact"]` | 始终为 "PreCompact" |

2030| `trigger` | `Literal["manual", "auto"]` | 什么触发了压缩 |

2031| `custom_instructions` | `str \| None` | 压缩的自定义说明 |

2032 

2033### `NotificationHookInput`

2034 

2035`Notification` hook 事件的输入数据。

2036 

2037```python theme={null}

2038class NotificationHookInput(BaseHookInput):

2039 hook_event_name: Literal["Notification"]

2040 message: str

2041 title: NotRequired[str]

2042 notification_type: str

2043```

2044 

2045| 字段 | 类型 | 描述 |

2046| :------------------ | :------------------------ | :----------------- |

2047| `hook_event_name` | `Literal["Notification"]` | 始终为 "Notification" |

2048| `message` | `str` | 通知消息内容 |

2049| `title` | `str`(可选) | 通知标题 |

2050| `notification_type` | `str` | 通知类型 |

2051 

2052### `SubagentStartHookInput`

2053 

2054`SubagentStart` hook 事件的输入数据。

2055 

2056```python theme={null}

2057class SubagentStartHookInput(BaseHookInput):

2058 hook_event_name: Literal["SubagentStart"]

2059 agent_id: str

2060 agent_type: str

2061```

2062 

2063| 字段 | 类型 | 描述 |

2064| :---------------- | :------------------------- | :------------------ |

2065| `hook_event_name` | `Literal["SubagentStart"]` | 始终为 "SubagentStart" |

2066| `agent_id` | `str` | 子代理的唯一标识符 |

2067| `agent_type` | `str` | 子代理的类型 |

2068 

2069### `PermissionRequestHookInput`

2070 

2071`PermissionRequest` hook 事件的输入数据。允许 hooks 以编程方式处理权限决策。

2072 

2073```python theme={null}

2074class PermissionRequestHookInput(BaseHookInput):

2075 hook_event_name: Literal["PermissionRequest"]

2076 tool_name: str

2077 tool_input: dict[str, Any]

2078 permission_suggestions: NotRequired[list[Any]]

2079```

2080 

2081| 字段 | 类型 | 描述 |

2082| :----------------------- | :----------------------------- | :---------------------- |

2083| `hook_event_name` | `Literal["PermissionRequest"]` | 始终为 "PermissionRequest" |

2084| `tool_name` | `str` | 请求权限的工具的名称 |

2085| `tool_input` | `dict[str, Any]` | 工具的输入参数 |

2086| `permission_suggestions` | `list[Any]`(可选) | 来自 CLI 的建议权限更新 |

2087 

2088### `HookJSONOutput`

2089 

2090hook 回调返回值的联合类型。

2091 

2092```python theme={null}

2093HookJSONOutput = AsyncHookJSONOutput | SyncHookJSONOutput

2094```

2095 

2096#### `SyncHookJSONOutput`

2097 

2098具有控制和决策字段的同步 hook 输出。

2099 

2100```python theme={null}

2101class SyncHookJSONOutput(TypedDict):

2102 # Control fields

2103 continue_: NotRequired[bool] # Whether to proceed (default: True)

2104 suppressOutput: NotRequired[bool] # Hide stdout from transcript

2105 stopReason: NotRequired[str] # Message when continue is False

2106 

2107 # Decision fields

2108 decision: NotRequired[Literal["block"]]

2109 systemMessage: NotRequired[str] # Warning message for user

2110 reason: NotRequired[str] # Feedback for Claude

2111 

2112 # Hook-specific output

2113 hookSpecificOutput: NotRequired[HookSpecificOutput]

2114```

2115 

2116<Note>

2117 在 Python 代码中使用 `continue_`(带下划线)。发送到 CLI 时会自动转换为 `continue`。

2118</Note>

2119 

2120#### `HookSpecificOutput`

2121 

2122包含 hook 事件名称和事件特定字段的 `TypedDict`。形状取决于 `hookEventName` 值。有关每个 hook 事件的可用字段的完整详情,见 [使用 hooks 控制执行](/zh-CN/agent-sdk/hooks#outputs)。

2123 

2124事件特定输出类型的判别联合。`hookEventName` 字段确定哪些字段有效。

2125 

2126```python theme={null}

2127class PreToolUseHookSpecificOutput(TypedDict):

2128 hookEventName: Literal["PreToolUse"]

2129 permissionDecision: NotRequired[Literal["allow", "deny", "ask"]]

2130 permissionDecisionReason: NotRequired[str]

2131 updatedInput: NotRequired[dict[str, Any]]

2132 additionalContext: NotRequired[str]

2133 

2134 

2135class PostToolUseHookSpecificOutput(TypedDict):

2136 hookEventName: Literal["PostToolUse"]

2137 additionalContext: NotRequired[str]

2138 updatedMCPToolOutput: NotRequired[Any]

2139 

2140 

2141class PostToolUseFailureHookSpecificOutput(TypedDict):

2142 hookEventName: Literal["PostToolUseFailure"]

2143 additionalContext: NotRequired[str]

2144 

2145 

2146class UserPromptSubmitHookSpecificOutput(TypedDict):

2147 hookEventName: Literal["UserPromptSubmit"]

2148 additionalContext: NotRequired[str]

2149 

2150 

2151class NotificationHookSpecificOutput(TypedDict):

2152 hookEventName: Literal["Notification"]

2153 additionalContext: NotRequired[str]

2154 

2155 

2156class SubagentStartHookSpecificOutput(TypedDict):

2157 hookEventName: Literal["SubagentStart"]

2158 additionalContext: NotRequired[str]

2159 

2160 

2161class PermissionRequestHookSpecificOutput(TypedDict):

2162 hookEventName: Literal["PermissionRequest"]

2163 decision: dict[str, Any]

2164 

2165 

2166HookSpecificOutput = (

2167 PreToolUseHookSpecificOutput

2168 | PostToolUseHookSpecificOutput

2169 | PostToolUseFailureHookSpecificOutput

2170 | UserPromptSubmitHookSpecificOutput

2171 | NotificationHookSpecificOutput

2172 | SubagentStartHookSpecificOutput

2173 | PermissionRequestHookSpecificOutput

2174)

2175```

2176 

2177#### `AsyncHookJSONOutput`

2178 

2179延迟 hook 执行的异步 hook 输出。

2180 

2181```python theme={null}

2182class AsyncHookJSONOutput(TypedDict):

2183 async_: Literal[True] # Set to True to defer execution

2184 asyncTimeout: NotRequired[int] # Timeout in milliseconds

2185```

2186 

2187<Note>

2188 在 Python 代码中使用 `async_`(带下划线)。发送到 CLI 时会自动转换为 `async`。

2189</Note>

2190 

2191### Hook 使用示例

2192 

2193此示例注册两个 hooks:一个阻止危险的 bash 命令(如 `rm -rf /`),另一个记录所有工具使用以进行审计。安全 hook 仅在 Bash 命令上运行(通过 `matcher`),而日志 hook 在所有工具上运行。

2194 

2195```python theme={null}

2196from claude_agent_sdk import query, ClaudeAgentOptions, HookMatcher, HookContext

2197from typing import Any

2198 

2199 

2200async def validate_bash_command(

2201 input_data: dict[str, Any], tool_use_id: str | None, context: HookContext

2202) -> dict[str, Any]:

2203 """Validate and potentially block dangerous bash commands."""

2204 if input_data["tool_name"] == "Bash":

2205 command = input_data["tool_input"].get("command", "")

2206 if "rm -rf /" in command:

2207 return {

2208 "hookSpecificOutput": {

2209 "hookEventName": "PreToolUse",

2210 "permissionDecision": "deny",

2211 "permissionDecisionReason": "Dangerous command blocked",

2212 }

2213 }

2214 return {}

2215 

2216 

2217async def log_tool_use(

2218 input_data: dict[str, Any], tool_use_id: str | None, context: HookContext

2219) -> dict[str, Any]:

2220 """Log all tool usage for auditing."""

2221 print(f"Tool used: {input_data.get('tool_name')}")

2222 return {}

2223 

2224 

2225options = ClaudeAgentOptions(

2226 hooks={

2227 "PreToolUse": [

2228 HookMatcher(

2229 matcher="Bash", hooks=[validate_bash_command], timeout=120

2230 ), # 2 min for validation

2231 HookMatcher(

2232 hooks=[log_tool_use]

2233 ), # Applies to all tools (default 60s timeout)

2234 ],

2235 "PostToolUse": [HookMatcher(hooks=[log_tool_use])],

2236 }

2237)

2238 

2239async for message in query(prompt="Analyze this codebase", options=options):

2240 print(message)

2241```

2242 

2243## 工具输入/输出类型

2244 

2245所有内置 Claude Code 工具的输入/输出模式文档。虽然 Python SDK 不将这些导出为类型,但它们代表消息中工具输入和输出的结构。

2246 

2247### Agent

2248 

2249**工具名称:** `Agent`(之前为 `Task`,仍然接受作为别名)

2250 

2251**输入:**

2252 

2253```python theme={null}

2254{

2255 "description": str, # A short (3-5 word) description of the task

2256 "prompt": str, # The task for the agent to perform

2257 "subagent_type": str, # The type of specialized agent to use

2258}

2259```

2260 

2261**输出:**

2262 

2263```python theme={null}

2264{

2265 "result": str, # Final result from the subagent

2266 "usage": dict | None, # Token usage statistics

2267 "total_cost_usd": float | None, # Estimated total cost in USD

2268 "duration_ms": int | None, # Execution duration in milliseconds

2269}

2270```

2271 

2272### AskUserQuestion

2273 

2274**工具名称:** `AskUserQuestion`

2275 

2276在执行期间向用户提出澄清问题。见 [处理批准和用户输入](/zh-CN/agent-sdk/user-input#handle-clarifying-questions) 了解使用详情。

2277 

2278**输入:**

2279 

2280```python theme={null}

2281{

2282 "questions": [ # Questions to ask the user (1-4 questions)

2283 {

2284 "question": str, # The complete question to ask the user

2285 "header": str, # Very short label displayed as a chip/tag (max 12 chars)

2286 "options": [ # The available choices (2-4 options)

2287 {

2288 "label": str, # Display text for this option (1-5 words)

2289 "description": str, # Explanation of what this option means

2290 }

2291 ],

2292 "multiSelect": bool, # Set to true to allow multiple selections

2293 }

2294 ],

2295 "answers": dict | None, # User answers populated by the permission system

2296}

2297```

2298 

2299**输出:**

2300 

2301```python theme={null}

2302{

2303 "questions": [ # The questions that were asked

2304 {

2305 "question": str,

2306 "header": str,

2307 "options": [{"label": str, "description": str}],

2308 "multiSelect": bool,

2309 }

2310 ],

2311 "answers": dict[str, str], # Maps question text to answer string

2312 # Multi-select answers are comma-separated

2313}

2314```

2315 

2316### Bash

2317 

2318**工具名称:** `Bash`

2319 

2320**输入:**

2321 

2322```python theme={null}

2323{

2324 "command": str, # The command to execute

2325 "timeout": int | None, # Optional timeout in milliseconds (max 600000)

2326 "description": str | None, # Clear, concise description (5-10 words)

2327 "run_in_background": bool | None, # Set to true to run in background

2328}

2329```

2330 

2331**输出:**

2332 

2333```python theme={null}

2334{

2335 "output": str, # Combined stdout and stderr output

2336 "exitCode": int, # Exit code of the command

2337 "killed": bool | None, # Whether command was killed due to timeout

2338 "shellId": str | None, # Shell ID for background processes

2339}

2340```

2341 

2342### Monitor

2343 

2344**工具名称:** `Monitor`

2345 

2346运行后台脚本并将每个 stdout 行作为事件传递给 Claude,以便它可以做出反应而无需轮询。Monitor 遵循与 Bash 相同的权限规则。见 [Monitor 工具参考](/zh-CN/tools-reference#monitor-tool) 了解行为和提供商可用性。

2347 

2348**输入:**

2349 

2350```python theme={null}

2351{

2352 "command": str, # Shell script; each stdout line is an event, exit ends the watch

2353 "description": str, # Short description shown in notifications

2354 "timeout_ms": int | None, # Kill after this deadline (default 300000, max 3600000)

2355 "persistent": bool | None, # Run for the lifetime of the session; stop with TaskStop

2356}

2357```

2358 

2359**输出:**

2360 

2361```python theme={null}

2362{

2363 "taskId": str, # ID of the background monitor task

2364 "timeoutMs": int, # Timeout deadline in milliseconds (0 when persistent)

2365 "persistent": bool | None, # True when running until TaskStop or session end

2366}

2367```

2368 

2369### Edit

2370 

2371**工具名称:** `Edit`

2372 

2373**输入:**

2374 

2375```python theme={null}

2376{

2377 "file_path": str, # The absolute path to the file to modify

2378 "old_string": str, # The text to replace

2379 "new_string": str, # The text to replace it with

2380 "replace_all": bool | None, # Replace all occurrences (default False)

2381}

2382```

2383 

2384**输出:**

2385 

2386```python theme={null}

2387{

2388 "message": str, # Confirmation message

2389 "replacements": int, # Number of replacements made

2390 "file_path": str, # File path that was edited

2391}

2392```

2393 

2394### Read

2395 

2396**工具名称:** `Read`

2397 

2398**输入:**

2399 

2400```python theme={null}

2401{

2402 "file_path": str, # The absolute path to the file to read

2403 "offset": int | None, # The line number to start reading from

2404 "limit": int | None, # The number of lines to read

2405}

2406```

2407 

2408**输出(文本文件):**

2409 

2410```python theme={null}

2411{

2412 "content": str, # File contents with line numbers

2413 "total_lines": int, # Total number of lines in file

2414 "lines_returned": int, # Lines actually returned

2415}

2416```

2417 

2418**输出(图像):**

2419 

2420```python theme={null}

2421{

2422 "image": str, # Base64 encoded image data

2423 "mime_type": str, # Image MIME type

2424 "file_size": int, # File size in bytes

2425}

2426```

2427 

2428### Write

2429 

2430**工具名称:** `Write`

2431 

2432**输入:**

2433 

2434```python theme={null}

2435{

2436 "file_path": str, # The absolute path to the file to write

2437 "content": str, # The content to write to the file

2438}

2439```

2440 

2441**输出:**

2442 

2443```python theme={null}

2444{

2445 "message": str, # Success message

2446 "bytes_written": int, # Number of bytes written

2447 "file_path": str, # File path that was written

2448}

2449```

2450 

2451### Glob

2452 

2453**工具名称:** `Glob`

2454 

2455**输入:**

2456 

2457```python theme={null}

2458{

2459 "pattern": str, # The glob pattern to match files against

2460 "path": str | None, # The directory to search in (defaults to cwd)

2461}

2462```

2463 

2464**输出:**

2465 

2466```python theme={null}

2467{

2468 "matches": list[str], # Array of matching file paths

2469 "count": int, # Number of matches found

2470 "search_path": str, # Search directory used

2471}

2472```

2473 

2474### Grep

2475 

2476**工具名称:** `Grep`

2477 

2478**输入:**

2479 

2480```python theme={null}

2481{

2482 "pattern": str, # The regular expression pattern

2483 "path": str | None, # File or directory to search in

2484 "glob": str | None, # Glob pattern to filter files

2485 "type": str | None, # File type to search

2486 "output_mode": str | None, # "content", "files_with_matches", or "count"

2487 "-i": bool | None, # Case insensitive search

2488 "-n": bool | None, # Show line numbers

2489 "-B": int | None, # Lines to show before each match

2490 "-A": int | None, # Lines to show after each match

2491 "-C": int | None, # Lines to show before and after

2492 "head_limit": int | None, # Limit output to first N lines/entries

2493 "multiline": bool | None, # Enable multiline mode

2494}

2495```

2496 

2497**输出(content 模式):**

2498 

2499```python theme={null}

2500{

2501 "matches": [

2502 {

2503 "file": str,

2504 "line_number": int | None,

2505 "line": str,

2506 "before_context": list[str] | None,

2507 "after_context": list[str] | None,

2508 }

2509 ],

2510 "total_matches": int,

2511}

2512```

2513 

2514**输出(files\_with\_matches 模式):**

2515 

2516```python theme={null}

2517{

2518 "files": list[str], # Files containing matches

2519 "count": int, # Number of files with matches

2520}

2521```

2522 

2523### NotebookEdit

2524 

2525**工具名称:** `NotebookEdit`

2526 

2527**输入:**

2528 

2529```python theme={null}

2530{

2531 "notebook_path": str, # Absolute path to the Jupyter notebook

2532 "cell_id": str | None, # The ID of the cell to edit

2533 "new_source": str, # The new source for the cell

2534 "cell_type": "code" | "markdown" | None, # The type of the cell

2535 "edit_mode": "replace" | "insert" | "delete" | None, # Edit operation type

2536}

2537```

2538 

2539**输出:**

2540 

2541```python theme={null}

2542{

2543 "message": str, # Success message

2544 "edit_type": "replaced" | "inserted" | "deleted", # Type of edit performed

2545 "cell_id": str | None, # Cell ID that was affected

2546 "total_cells": int, # Total cells in notebook after edit

2547}

2548```

2549 

2550### WebFetch

2551 

2552**工具名称:** `WebFetch`

2553 

2554**输入:**

2555 

2556```python theme={null}

2557{

2558 "url": str, # The URL to fetch content from

2559 "prompt": str, # The prompt to run on the fetched content

2560}

2561```

2562 

2563**输出:**

2564 

2565```python theme={null}

2566{

2567 "response": str, # AI model's response to the prompt

2568 "url": str, # URL that was fetched

2569 "final_url": str | None, # Final URL after redirects

2570 "status_code": int | None, # HTTP status code

2571}

2572```

2573 

2574### WebSearch

2575 

2576**工具名称:** `WebSearch`

2577 

2578**输入:**

2579 

2580```python theme={null}

2581{

2582 "query": str, # The search query to use

2583 "allowed_domains": list[str] | None, # Only include results from these domains

2584 "blocked_domains": list[str] | None, # Never include results from these domains

2585}

2586```

2587 

2588**输出:**

2589 

2590```python theme={null}

2591{

2592 "results": [{"title": str, "url": str, "snippet": str, "metadata": dict | None}],

2593 "total_results": int,

2594 "query": str,

2595}

2596```

2597 

2598### TodoWrite

2599 

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

2601 

2602**输入:**

2603 

2604```python theme={null}

2605{

2606 "todos": [

2607 {

2608 "content": str, # The task description

2609 "status": "pending" | "in_progress" | "completed", # Task status

2610 "activeForm": str, # Active form of the description

2611 }

2612 ]

2613}

2614```

2615 

2616**输出:**

2617 

2618```python theme={null}

2619{

2620 "message": str, # Success message

2621 "stats": {"total": int, "pending": int, "in_progress": int, "completed": int},

2622}

2623```

2624 

2625### BashOutput

2626 

2627**工具名称:** `BashOutput`

2628 

2629**输入:**

2630 

2631```python theme={null}

2632{

2633 "bash_id": str, # The ID of the background shell

2634 "filter": str | None, # Optional regex to filter output lines

2635}

2636```

2637 

2638**输出:**

2639 

2640```python theme={null}

2641{

2642 "output": str, # New output since last check

2643 "status": "running" | "completed" | "failed", # Current shell status

2644 "exitCode": int | None, # Exit code when completed

2645}

2646```

2647 

2648### KillBash

2649 

2650**工具名称:** `KillBash`

2651 

2652**输入:**

2653 

2654```python theme={null}

2655{

2656 "shell_id": str # The ID of the background shell to kill

2657}

2658```

2659 

2660**输出:**

2661 

2662```python theme={null}

2663{

2664 "message": str, # Success message

2665 "shell_id": str, # ID of the killed shell

2666}

2667```

2668 

2669### ExitPlanMode

2670 

2671**工具名称:** `ExitPlanMode`

2672 

2673**输入:**

2674 

2675```python theme={null}

2676{

2677 "plan": str # The plan to run by the user for approval

2678}

2679```

2680 

2681**输出:**

2682 

2683```python theme={null}

2684{

2685 "message": str, # Confirmation message

2686 "approved": bool | None, # Whether user approved the plan

2687}

2688```

2689 

2690### ListMcpResources

2691 

2692**工具名称:** `ListMcpResources`

2693 

2694**输入:**

2695 

2696```python theme={null}

2697{

2698 "server": str | None # Optional server name to filter resources by

2699}

2700```

2701 

2702**输出:**

2703 

2704```python theme={null}

2705{

2706 "resources": [

2707 {

2708 "uri": str,

2709 "name": str,

2710 "description": str | None,

2711 "mimeType": str | None,

2712 "server": str,

2713 }

2714 ],

2715 "total": int,

2716}

2717```

2718 

2719### ReadMcpResource

2720 

2721**工具名称:** `ReadMcpResource`

2722 

2723**输入:**

2724 

2725```python theme={null}

2726{

2727 "server": str, # The MCP server name

2728 "uri": str, # The resource URI to read

2729}

2730```

2731 

2732**输出:**

2733 

2734```python theme={null}

2735{

2736 "contents": [

2737 {"uri": str, "mimeType": str | None, "text": str | None, "blob": str | None}

2738 ],

2739 "server": str,

2740}

2741```

2742 

2743## ClaudeSDKClient 的高级功能

2744 

2745### 构建持续对话界面

2746 

2747```python theme={null}

2748from claude_agent_sdk import (

2749 ClaudeSDKClient,

2750 ClaudeAgentOptions,

2751 AssistantMessage,

2752 TextBlock,

2753)

2754import asyncio

2755 

2756 

2757class ConversationSession:

2758 """Maintains a single conversation session with Claude."""

2759 

2760 def __init__(self, options: ClaudeAgentOptions | None = None):

2761 self.client = ClaudeSDKClient(options)

2762 self.turn_count = 0

2763 

2764 async def start(self):

2765 await self.client.connect()

2766 print("Starting conversation session. Claude will remember context.")

2767 print(

2768 "Commands: 'exit' to quit, 'interrupt' to stop current task, 'new' for new session"

2769 )

2770 

2771 while True:

2772 user_input = input(f"\n[Turn {self.turn_count + 1}] You: ")

2773 

2774 if user_input.lower() == "exit":

2775 break

2776 elif user_input.lower() == "interrupt":

2777 await self.client.interrupt()

2778 print("Task interrupted!")

2779 continue

2780 elif user_input.lower() == "new":

2781 # Disconnect and reconnect for a fresh session

2782 await self.client.disconnect()

2783 await self.client.connect()

2784 self.turn_count = 0

2785 print("Started new conversation session (previous context cleared)")

2786 continue

2787 

2788 # Send message - the session retains all previous messages

2789 await self.client.query(user_input)

2790 self.turn_count += 1

2791 

2792 # Process response

2793 print(f"[Turn {self.turn_count}] Claude: ", end="")

2794 async for message in self.client.receive_response():

2795 if isinstance(message, AssistantMessage):

2796 for block in message.content:

2797 if isinstance(block, TextBlock):

2798 print(block.text, end="")

2799 print() # New line after response

2800 

2801 await self.client.disconnect()

2802 print(f"Conversation ended after {self.turn_count} turns.")

2803 

2804 

2805async def main():

2806 options = ClaudeAgentOptions(

2807 allowed_tools=["Read", "Write", "Bash"], permission_mode="acceptEdits"

2808 )

2809 session = ConversationSession(options)

2810 await session.start()

2811 

2812 

2813# Example conversation:

2814# Turn 1 - You: "Create a file called hello.py"

2815# Turn 1 - Claude: "I'll create a hello.py file for you..."

2816# Turn 2 - You: "What's in that file?"

2817# Turn 2 - Claude: "The hello.py file I just created contains..." (remembers!)

2818# Turn 3 -You: "Add a main function to it"

2819# Turn 3 - Claude: "I'll add a main function to hello.py..." (knows which file!)

2820 

2821asyncio.run(main())

2822```

2823 

2824### 使用 Hooks 进行行为修改

2825 

2826```python theme={null}

2827from claude_agent_sdk import (

2828 ClaudeSDKClient,

2829 ClaudeAgentOptions,

2830 HookMatcher,

2831 HookContext,

2832)

2833import asyncio

2834from typing import Any

2835 

2836 

2837async def pre_tool_logger(

2838 input_data: dict[str, Any], tool_use_id: str | None, context: HookContext

2839) -> dict[str, Any]:

2840 """Log all tool usage before execution."""

2841 tool_name = input_data.get("tool_name", "unknown")

2842 print(f"[PRE-TOOL] About to use: {tool_name}")

2843 

2844 # You can modify or block the tool execution here

2845 if tool_name == "Bash" and "rm -rf" in str(input_data.get("tool_input", {})):

2846 return {

2847 "hookSpecificOutput": {

2848 "hookEventName": "PreToolUse",

2849 "permissionDecision": "deny",

2850 "permissionDecisionReason": "Dangerous command blocked",

2851 }

2852 }

2853 return {}

2854 

2855 

2856async def post_tool_logger(

2857 input_data: dict[str, Any], tool_use_id: str | None, context: HookContext

2858) -> dict[str, Any]:

2859 """Log results after tool execution."""

2860 tool_name = input_data.get("tool_name", "unknown")

2861 print(f"[POST-TOOL] Completed: {tool_name}")

2862 return {}

2863 

2864 

2865async def user_prompt_modifier(

2866 input_data: dict[str, Any], tool_use_id: str | None, context: HookContext

2867) -> dict[str, Any]:

2868 """Add context to user prompts."""

2869 original_prompt = input_data.get("prompt", "")

2870 

2871 # Add a timestamp as additional context for Claude to see

2872 from datetime import datetime

2873 

2874 timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")

2875 

2876 return {

2877 "hookSpecificOutput": {

2878 "hookEventName": "UserPromptSubmit",

2879 "additionalContext": f"[Submitted at {timestamp}] Original prompt: {original_prompt}",

2880 }

2881 }

2882 

2883 

2884async def main():

2885 options = ClaudeAgentOptions(

2886 hooks={

2887 "PreToolUse": [

2888 HookMatcher(hooks=[pre_tool_logger]),

2889 HookMatcher(matcher="Bash", hooks=[pre_tool_logger]),

2890 ],

2891 "PostToolUse": [HookMatcher(hooks=[post_tool_logger])],

2892 "UserPromptSubmit": [HookMatcher(hooks=[user_prompt_modifier])],

2893 },

2894 allowed_tools=["Read", "Write", "Bash"],

2895 )

2896 

2897 async with ClaudeSDKClient(options=options) as client:

2898 await client.query("List files in current directory")

2899 

2900 async for message in client.receive_response():

2901 # Hooks will automatically log tool usage

2902 pass

2903 

2904 

2905asyncio.run(main())

2906```

2907 

2908### 实时进度监控

2909 

2910```python theme={null}

2911from claude_agent_sdk import (

2912 ClaudeSDKClient,

2913 ClaudeAgentOptions,

2914 AssistantMessage,

2915 ToolUseBlock,

2916 ToolResultBlock,

2917 TextBlock,

2918)

2919import asyncio

2920 

2921 

2922async def monitor_progress():

2923 options = ClaudeAgentOptions(

2924 allowed_tools=["Write", "Bash"], permission_mode="acceptEdits"

2925 )

2926 

2927 async with ClaudeSDKClient(options=options) as client:

2928 await client.query("Create 5 Python files with different sorting algorithms")

2929 

2930 # Monitor progress in real-time

2931 async for message in client.receive_response():

2932 if isinstance(message, AssistantMessage):

2933 for block in message.content:

2934 if isinstance(block, ToolUseBlock):

2935 if block.name == "Write":

2936 file_path = block.input.get("file_path", "")

2937 print(f"Creating: {file_path}")

2938 elif isinstance(block, ToolResultBlock):

2939 print("Completed tool execution")

2940 elif isinstance(block, TextBlock):

2941 print(f"Claude says: {block.text[:100]}...")

2942 

2943 print("Task completed!")

2944 

2945 

2946asyncio.run(monitor_progress())

2947```

2948 

2949## 示例用法

2950 

2951### 基本文件操作(使用 query)

2952 

2953```python theme={null}

2954from claude_agent_sdk import query, ClaudeAgentOptions, AssistantMessage, ToolUseBlock

2955import asyncio

2956 

2957 

2958async def create_project():

2959 options = ClaudeAgentOptions(

2960 allowed_tools=["Read", "Write", "Bash"],

2961 permission_mode="acceptEdits",

2962 cwd="/home/user/project",

2963 )

2964 

2965 async for message in query(

2966 prompt="Create a Python project structure with setup.py", options=options

2967 ):

2968 if isinstance(message, AssistantMessage):

2969 for block in message.content:

2970 if isinstance(block, ToolUseBlock):

2971 print(f"Using tool: {block.name}")

2972 

2973 

2974asyncio.run(create_project())

2975```

2976 

2977### 错误处理

2978 

2979```python theme={null}

2980from claude_agent_sdk import query, CLINotFoundError, ProcessError, CLIJSONDecodeError

2981 

2982try:

2983 async for message in query(prompt="Hello"):

2984 print(message)

2985except CLINotFoundError:

2986 print(

2987 "Claude Code CLI not found. Try reinstalling: pip install --force-reinstall claude-agent-sdk"

2988 )

2989except ProcessError as e:

2990 print(f"Process failed with exit code: {e.exit_code}")

2991except CLIJSONDecodeError as e:

2992 print(f"Failed to parse response: {e}")

2993```

2994 

2995### 使用客户端的流式模式

2996 

2997```python theme={null}

2998from claude_agent_sdk import ClaudeSDKClient

2999import asyncio

3000 

3001 

3002async def interactive_session():

3003 async with ClaudeSDKClient() as client:

3004 # Send initial message

3005 await client.query("What's the weather like?")

3006 

3007 # Process responses

3008 async for msg in client.receive_response():

3009 print(msg)

3010 

3011 # Send follow-up

3012 await client.query("Tell me more about that")

3013 

3014 # Process follow-up response

3015 async for msg in client.receive_response():

3016 print(msg)

3017 

3018 

3019asyncio.run(interactive_session())

3020```

3021 

3022### 使用 ClaudeSDKClient 的自定义工具

3023 

3024```python theme={null}

3025from claude_agent_sdk import (

3026 ClaudeSDKClient,

3027 ClaudeAgentOptions,

3028 tool,

3029 create_sdk_mcp_server,

3030 AssistantMessage,

3031 TextBlock,

3032)

3033import asyncio

3034from typing import Any

3035 

3036 

3037# Define custom tools with @tool decorator

3038@tool("calculate", "Perform mathematical calculations", {"expression": str})

3039async def calculate(args: dict[str, Any]) -> dict[str, Any]:

3040 try:

3041 result = eval(args["expression"], {"__builtins__": {}})

3042 return {"content": [{"type": "text", "text": f"Result: {result}"}]}

3043 except Exception as e:

3044 return {

3045 "content": [{"type": "text", "text": f"Error: {str(e)}"}],

3046 "is_error": True,

3047 }

3048 

3049 

3050@tool("get_time", "Get current time", {})

3051async def get_time(args: dict[str, Any]) -> dict[str, Any]:

3052 from datetime import datetime

3053 

3054 current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")

3055 return {"content": [{"type": "text", "text": f"Current time: {current_time}"}]}

3056 

3057 

3058async def main():

3059 # Create SDK MCP server with custom tools

3060 my_server = create_sdk_mcp_server(

3061 name="utilities", version="1.0.0", tools=[calculate, get_time]

3062 )

3063 

3064 # Configure options with the server

3065 options = ClaudeAgentOptions(

3066 mcp_servers={"utils": my_server},

3067 allowed_tools=["mcp__utils__calculate", "mcp__utils__get_time"],

3068 )

3069 

3070 # Use ClaudeSDKClient for interactive tool usage

3071 async with ClaudeSDKClient(options=options) as client:

3072 await client.query("What's 123 * 456?")

3073 

3074 # Process calculation response

3075 async for message in client.receive_response():

3076 if isinstance(message, AssistantMessage):

3077 for block in message.content:

3078 if isinstance(block, TextBlock):

3079 print(f"Calculation: {block.text}")

3080 

3081 # Follow up with time query

3082 await client.query("What time is it now?")

3083 

3084 async for message in client.receive_response():

3085 if isinstance(message, AssistantMessage):

3086 for block in message.content:

3087 if isinstance(block, TextBlock):

3088 print(f"Time: {block.text}")

3089 

3090 

3091asyncio.run(main())

3092```

3093 

3094## 沙箱配置

3095 

3096### `SandboxSettings`

3097 

3098沙箱行为的配置。使用此来启用命令沙箱和以编程方式配置网络限制。

3099 

3100```python theme={null}

3101class SandboxSettings(TypedDict, total=False):

3102 enabled: bool

3103 autoAllowBashIfSandboxed: bool

3104 excludedCommands: list[str]

3105 allowUnsandboxedCommands: bool

3106 network: SandboxNetworkConfig

3107 ignoreViolations: SandboxIgnoreViolations

3108 enableWeakerNestedSandbox: bool

3109```

3110 

3111| 属性 | 类型 | 默认值 | 描述 |

3112| :-------------------------- | :------------------------------------------------------ | :------ | :------------------------------------------------------------------------------------------------------------------------------- |

3113| `enabled` | `bool` | `False` | 为命令执行启用沙箱模式 |

3114| `autoAllowBashIfSandboxed` | `bool` | `True` | 启用沙箱时自动批准 bash 命令 |

3115| `excludedCommands` | `list[str]` | `[]` | 始终绕过沙箱限制的命令(例如 `["docker"]`)。这些自动运行沙箱外,无需模型参与 |

3116| `allowUnsandboxedCommands` | `bool` | `True` | 允许模型请求在沙箱外运行命令。当为 `True` 时,模型可以在工具输入中设置 `dangerouslyDisableSandbox`,这会回退到 [权限系统](#permissions-fallback-for-unsandboxed-commands) |

3117| `network` | [`SandboxNetworkConfig`](#sandbox-network-config) | `None` | 网络特定的沙箱配置 |

3118| `ignoreViolations` | [`SandboxIgnoreViolations`](#sandbox-ignore-violations) | `None` | 配置要忽略的沙箱违规 |

3119| `enableWeakerNestedSandbox` | `bool` | `False` | 启用较弱的嵌套沙箱以实现兼容性 |

3120 

3121#### 示例用法

3122 

3123```python theme={null}

3124from claude_agent_sdk import query, ClaudeAgentOptions, SandboxSettings

3125 

3126sandbox_settings: SandboxSettings = {

3127 "enabled": True,

3128 "autoAllowBashIfSandboxed": True,

3129 "network": {"allowLocalBinding": True},

3130}

3131 

3132async for message in query(

3133 prompt="Build and test my project",

3134 options=ClaudeAgentOptions(sandbox=sandbox_settings),

3135):

3136 print(message)

3137```

3138 

3139<Warning>

3140 **Unix socket 安全性**:`allowUnixSockets` 选项可以授予对强大系统服务的访问权限。例如,允许 `/var/run/docker.sock` 实际上通过 Docker API 授予完整的主机系统访问权限,绕过沙箱隔离。仅允许严格必要的 Unix sockets,并理解每个的安全含义。

3141</Warning>

3142 

3143### `SandboxNetworkConfig`

3144 

3145沙箱模式的网络特定配置。

3146 

3147```python theme={null}

3148class SandboxNetworkConfig(TypedDict, total=False):

3149 allowedDomains: list[str]

3150 deniedDomains: list[str]

3151 allowManagedDomainsOnly: bool

3152 allowUnixSockets: list[str]

3153 allowAllUnixSockets: bool

3154 allowLocalBinding: bool

3155 allowMachLookup: list[str]

3156 httpProxyPort: int

3157 socksProxyPort: int

3158```

3159 

3160| 属性 | 类型 | 默认值 | 描述 |

3161| :------------------------ | :---------- | :------ | :----------------------------------------------------------- |

3162| `allowedDomains` | `list[str]` | `[]` | 沙箱化进程可以访问的域名 |

3163| `deniedDomains` | `list[str]` | `[]` | 沙箱化进程无法访问的域名。优先于 `allowedDomains` |

3164| `allowManagedDomainsOnly` | `bool` | `False` | 仅限托管设置:在托管设置中设置时,忽略来自非托管设置源的 `allowedDomains`。通过 SDK 选项设置时无效 |

3165| `allowUnixSockets` | `list[str]` | `[]` | 进程可以访问的 Unix socket 路径(例如 Docker socket) |

3166| `allowAllUnixSockets` | `bool` | `False` | 允许访问所有 Unix sockets |

3167| `allowLocalBinding` | `bool` | `False` | 允许进程绑定到本地端口(例如开发服务器) |

3168| `allowMachLookup` | `list[str]` | `[]` | 仅限 macOS:允许的 XPC/Mach 服务名称。支持尾部通配符 |

3169| `httpProxyPort` | `int` | `None` | 网络请求的 HTTP 代理端口 |

3170| `socksProxyPort` | `int` | `None` | 网络请求的 SOCKS 代理端口 |

3171 

3172<Note>

3173 内置沙箱代理基于请求的主机名强制执行网络允许列表,不会终止或检查 TLS 流量,因此 [域名前置](https://en.wikipedia.org/wiki/Domain_fronting) 等技术可能会绕过它。有关详细信息,请参阅 [沙箱安全限制](/zh-CN/sandboxing#security-limitations),以及 [安全部署](/zh-CN/agent-sdk/secure-deployment#traffic-forwarding) 以配置 TLS 终止代理。

3174</Note>

3175 

3176### `SandboxIgnoreViolations`

3177 

3178用于忽略特定沙箱违规的配置。

3179 

3180```python theme={null}

3181class SandboxIgnoreViolations(TypedDict, total=False):

3182 file: list[str]

3183 network: list[str]

3184```

3185 

3186| 属性 | 类型 | 默认值 | 描述 |

3187| :-------- | :---------- | :--- | :----------- |

3188| `file` | `list[str]` | `[]` | 要忽略违规的文件路径模式 |

3189| `network` | `list[str]` | `[]` | 要忽略违规的网络模式 |

3190 

3191### 沙箱外命令的权限回退

3192 

3193当 `allowUnsandboxedCommands` 启用时,模型可以通过在工具输入中设置 `dangerouslyDisableSandbox: True` 来请求在沙箱外运行命令。这些请求回退到现有权限系统,意味着你的 `can_use_tool` 处理程序将被调用,允许你实现自定义授权逻辑。

3194 

3195<Note>

3196 **`excludedCommands` vs `allowUnsandboxedCommands`:**

3197 

3198 * `excludedCommands`:始终自动绕过沙箱的命令的静态列表(例如 `["docker"]`)。模型对此无控制权。

3199 * `allowUnsandboxedCommands`:让模型在运行时通过在工具输入中设置 `dangerouslyDisableSandbox: True` 来决定是否请求沙箱外执行。

3200</Note>

3201 

3202```python theme={null}

3203from claude_agent_sdk import (

3204 query,

3205 ClaudeAgentOptions,

3206 HookMatcher,

3207 PermissionResultAllow,

3208 PermissionResultDeny,

3209 ToolPermissionContext,

3210)

3211 

3212 

3213async def can_use_tool(

3214 tool: str, input: dict, context: ToolPermissionContext

3215) -> PermissionResultAllow | PermissionResultDeny:

3216 # Check if the model is requesting to bypass the sandbox

3217 if tool == "Bash" and input.get("dangerouslyDisableSandbox"):

3218 # The model is requesting to run this command outside the sandbox

3219 print(f"Unsandboxed command requested: {input.get('command')}")

3220 

3221 if is_command_authorized(input.get("command")):

3222 return PermissionResultAllow()

3223 return PermissionResultDeny(

3224 message="Command not authorized for unsandboxed execution"

3225 )

3226 return PermissionResultAllow()

3227 

3228 

3229# Required: dummy hook keeps the stream open for can_use_tool

3230async def dummy_hook(input_data, tool_use_id, context):

3231 return {"continue_": True}

3232 

3233 

3234async def prompt_stream():

3235 yield {

3236 "type": "user",

3237 "message": {"role": "user", "content": "Deploy my application"},

3238 }

3239 

3240 

3241async def main():

3242 async for message in query(

3243 prompt=prompt_stream(),

3244 options=ClaudeAgentOptions(

3245 sandbox={

3246 "enabled": True,

3247 "allowUnsandboxedCommands": True, # Model can request unsandboxed execution

3248 },

3249 permission_mode="default",

3250 can_use_tool=can_use_tool,

3251 hooks={"PreToolUse": [HookMatcher(matcher=None, hooks=[dummy_hook])]},

3252 ),

3253 ):

3254 print(message)

3255```

3256 

3257此模式使你能够:

3258 

3259* **审计模型请求**:记录模型何时请求沙箱外执行

3260* **实现允许列表**:仅允许特定命令在沙箱外运行

3261* **添加批准工作流**:需要显式授权以进行特权操作

3262 

3263<Warning>

3264 使用 `dangerouslyDisableSandbox: True` 运行的命令具有完整的系统访问权限。确保你的 `can_use_tool` 处理程序仔细验证这些请求。

3265 

3266 如果 `permission_mode` 设置为 `bypassPermissions` 且 `allow_unsandboxed_commands` 启用,模型可以自主执行沙箱外的命令,无需任何批准提示。此组合实际上允许模型无声地逃离沙箱隔离。

3267</Warning>

3268 

3269## 另见

3270 

3271* [SDK 概述](/zh-CN/agent-sdk/overview) - 一般 SDK 概念

3272* [TypeScript SDK 参考](/zh-CN/agent-sdk/typescript) - TypeScript SDK 文档

3273* [CLI 参考](/zh-CN/cli-reference) - 命令行界面

3274* [常见工作流](/zh-CN/common-workflows) - 分步指南

agent-sdk/quickstart.md +333 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 快速开始

6 

7> 使用 Python 或 TypeScript Agent SDK 开始构建能够自主工作的 AI 代理

8 

9使用 Agent SDK 构建一个 AI 代理,它可以读取你的代码、发现错误并修复它们,所有这一切都无需手动干预。

10 

11**你将做什么:**

12 

131. 使用 Agent SDK 设置一个项目

142. 创建一个包含一些有缺陷代码的文件

153. 运行一个代理,自动查找并修复错误

16 

17## 前置条件

18 

19* **Node.js 18+** 或 **Python 3.10+**

20* 一个 **Anthropic 账户**([在此注册](https://platform.claude.com/))

21 

22## 设置

23 

24<Steps>

25 <Step title="创建项目文件夹">

26 为此快速开始创建一个新目录:

27 

28 ```bash theme={null}

29 mkdir my-agent && cd my-agent

30 ```

31 

32 对于你自己的项目,你可以从任何文件夹运行 SDK;默认情况下,它将有权访问该目录及其子目录中的文件。

33 </Step>

34 

35 <Step title="安装 SDK">

36 为你的语言安装 Agent SDK 包:

37 

38 <Tabs>

39 <Tab title="TypeScript">

40 ```bash theme={null}

41 npm install @anthropic-ai/claude-agent-sdk

42 ```

43 </Tab>

44 

45 <Tab title="Python (uv)">

46 [uv Python 包管理器](https://docs.astral.sh/uv/)是一个快速的 Python 包管理器,可以自动处理虚拟环境:

47 

48 ```bash theme={null}

49 uv init && uv add claude-agent-sdk

50 ```

51 </Tab>

52 

53 <Tab title="Python (pip)">

54 首先创建一个虚拟环境,然后安装:

55 

56 ```bash theme={null}

57 python3 -m venv .venv && source .venv/bin/activate

58 pip3 install claude-agent-sdk

59 ```

60 </Tab>

61 </Tabs>

62 

63 <Note>

64 TypeScript SDK 为你的平台捆绑了一个本地 Claude Code 二进制文件作为可选依赖项,所以你不需要单独安装 Claude Code。

65 </Note>

66 </Step>

67 

68 <Step title="设置你的 API 密钥">

69 从 [Claude 控制台](https://platform.claude.com/)获取 API 密钥,然后在你的项目目录中创建一个 `.env` 文件:

70 

71 ```bash theme={null}

72 ANTHROPIC_API_KEY=your-api-key

73 ```

74 

75 SDK 还支持通过第三方 API 提供商进行身份验证:

76 

77 * **Amazon Bedrock**:设置 `CLAUDE_CODE_USE_BEDROCK=1` 环境变量并配置 AWS 凭证

78 * **Google Vertex AI**:设置 `CLAUDE_CODE_USE_VERTEX=1` 环境变量并配置 Google Cloud 凭证

79 * **Microsoft Azure**:设置 `CLAUDE_CODE_USE_FOUNDRY=1` 环境变量并配置 Azure 凭证

80 

81 有关详细信息,请参阅 [Bedrock](/zh-CN/amazon-bedrock)、[Vertex AI](/zh-CN/google-vertex-ai) 或 [Azure AI Foundry](/zh-CN/microsoft-foundry) 的设置指南。

82 

83 <Note>

84 除非事先获得批准,否则 Anthropic 不允许第三方开发者提供 claude.ai 登录或对其产品的速率限制,包括基于 Claude Agent SDK 构建的代理。请改用本文档中描述的 API 密钥身份验证方法。

85 </Note>

86 </Step>

87</Steps>

88 

89## 创建一个有缺陷的文件

90 

91此快速开始将引导你构建一个可以查找和修复代码中错误的代理。首先,你需要一个包含一些有意错误的文件供代理修复。在 `my-agent` 目录中创建 `utils.py` 并粘贴以下代码:

92 

93```python theme={null}

94def calculate_average(numbers):

95 total = 0

96 for num in numbers:

97 total += num

98 return total / len(numbers)

99 

100 

101def get_user_name(user):

102 return user["name"].upper()

103```

104 

105此代码有两个错误:

106 

1071. `calculate_average([])` 会因除以零而崩溃

1082. `get_user_name(None)` 会因 TypeError 而崩溃

109 

110## 构建一个查找和修复错误的代理

111 

112如果你使用 Python SDK,创建 `agent.py`,或者如果使用 TypeScript,创建 `agent.ts`:

113 

114<CodeGroup>

115 ```python Python theme={null}

116 import asyncio

117 from claude_agent_sdk import query, ClaudeAgentOptions, AssistantMessage, ResultMessage

118 

119 

120 async def main():

121 # Agentic loop: streams messages as Claude works

122 async for message in query(

123 prompt="Review utils.py for bugs that would cause crashes. Fix any issues you find.",

124 options=ClaudeAgentOptions(

125 allowed_tools=["Read", "Edit", "Glob"], # Tools Claude can use

126 permission_mode="acceptEdits", # Auto-approve file edits

127 ),

128 ):

129 # Print human-readable output

130 if isinstance(message, AssistantMessage):

131 for block in message.content:

132 if hasattr(block, "text"):

133 print(block.text) # Claude's reasoning

134 elif hasattr(block, "name"):

135 print(f"Tool: {block.name}") # Tool being called

136 elif isinstance(message, ResultMessage):

137 print(f"Done: {message.subtype}") # Final result

138 

139 

140 asyncio.run(main())

141 ```

142 

143 ```typescript TypeScript theme={null}

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

145 

146 // Agentic loop: streams messages as Claude works

147 for await (const message of query({

148 prompt: "Review utils.py for bugs that would cause crashes. Fix any issues you find.",

149 options: {

150 allowedTools: ["Read", "Edit", "Glob"], // Tools Claude can use

151 permissionMode: "acceptEdits" // Auto-approve file edits

152 }

153 })) {

154 // Print human-readable output

155 if (message.type === "assistant" && message.message?.content) {

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

157 if ("text" in block) {

158 console.log(block.text); // Claude's reasoning

159 } else if ("name" in block) {

160 console.log(`Tool: ${block.name}`); // Tool being called

161 }

162 }

163 } else if (message.type === "result") {

164 console.log(`Done: ${message.subtype}`); // Final result

165 }

166 }

167 ```

168</CodeGroup>

169 

170此代码有三个主要部分:

171 

1721. **`query`**:创建 agentic 循环的主入口点。它返回一个异步迭代器,所以你使用 `async for` 来流式传输 Claude 工作时的消息。查看 [Python](/zh-CN/agent-sdk/python#query) 或 [TypeScript](/zh-CN/agent-sdk/typescript#query) SDK 参考中的完整 API。

173 

1742. **`prompt`**:你想让 Claude 做什么。Claude 根据任务确定要使用哪些工具。

175 

1763. **`options`**:代理的配置。此示例使用 `allowedTools` 预先批准 `Read`、`Edit` 和 `Glob`,以及 `permissionMode: "acceptEdits"` 来自动批准文件更改。其他选项包括 `systemPrompt`、`mcpServers` 等。查看 [Python](/zh-CN/agent-sdk/python#claude-agent-options) 或 [TypeScript](/zh-CN/agent-sdk/typescript#options) 的所有选项。

177 

178`async for` 循环在 Claude 思考、调用工具、观察结果并决定下一步做什么时继续运行。每次迭代都会产生一条消息:Claude 的推理、工具调用、工具结果或最终结果。SDK 处理编排(工具执行、上下文管理、重试),所以你只需使用流。当 Claude 完成任务或遇到错误时,循环结束。

179 

180循环内的消息处理过滤人类可读的输出。如果没有过滤,你会看到原始消息对象,包括系统初始化和内部状态,这对调试很有用,但通常很冗长。

181 

182<Note>

183 此示例使用流式传输来实时显示进度。如果你不需要实时输出(例如,对于后台作业或 CI 管道),你可以一次性收集所有消息。有关详细信息,请参阅[流式传输与单轮模式](/zh-CN/agent-sdk/streaming-vs-single-mode)。

184</Note>

185 

186### 运行你的代理

187 

188你的代理已准备好。使用以下命令运行它:

189 

190<Tabs>

191 <Tab title="Python">

192 ```bash theme={null}

193 python3 agent.py

194 ```

195 </Tab>

196 

197 <Tab title="TypeScript">

198 ```bash theme={null}

199 npx tsx agent.ts

200 ```

201 </Tab>

202</Tabs>

203 

204运行后,检查 `utils.py`。你会看到处理空列表和空用户的防御性代码。你的代理自主地:

205 

2061. **读取** `utils.py` 以理解代码

2072. **分析**了逻辑并识别了会导致崩溃的边界情况

2083. **编辑**了文件以添加适当的错误处理

209 

210这就是 Agent SDK 的与众不同之处:Claude 直接执行工具,而不是要求你实现它们。

211 

212<Note>

213 如果你看到"API key not found",请确保你已在 `.env` 文件或 shell 环境中设置了 `ANTHROPIC_API_KEY` 环境变量。有关更多帮助,请参阅[完整故障排除指南](/zh-CN/troubleshooting)。

214</Note>

215 

216### 尝试其他提示

217 

218现在你的代理已设置好,尝试一些不同的提示:

219 

220* `"Add docstrings to all functions in utils.py"`

221* `"Add type hints to all functions in utils.py"`

222* `"Create a README.md documenting the functions in utils.py"`

223 

224### 自定义你的代理

225 

226你可以通过更改选项来修改代理的行为。以下是一些示例:

227 

228**添加网络搜索功能:**

229 

230<CodeGroup>

231 ```python Python theme={null}

232 options = ClaudeAgentOptions(

233 allowed_tools=["Read", "Edit", "Glob", "WebSearch"], permission_mode="acceptEdits"

234 )

235 ```

236 

237 ```typescript TypeScript hidelines={1,-1} theme={null}

238 const _ = {

239 options: {

240 allowedTools: ["Read", "Edit", "Glob", "WebSearch"],

241 permissionMode: "acceptEdits"

242 }

243 };

244 ```

245</CodeGroup>

246 

247**给 Claude 一个自定义系统提示:**

248 

249<CodeGroup>

250 ```python Python theme={null}

251 options = ClaudeAgentOptions(

252 allowed_tools=["Read", "Edit", "Glob"],

253 permission_mode="acceptEdits",

254 system_prompt="You are a senior Python developer. Always follow PEP 8 style guidelines.",

255 )

256 ```

257 

258 ```typescript TypeScript hidelines={1,-1} theme={null}

259 const _ = {

260 options: {

261 allowedTools: ["Read", "Edit", "Glob"],

262 permissionMode: "acceptEdits",

263 systemPrompt: "You are a senior Python developer. Always follow PEP 8 style guidelines."

264 }

265 };

266 ```

267</CodeGroup>

268 

269**在终端中运行命令:**

270 

271<CodeGroup>

272 ```python Python theme={null}

273 options = ClaudeAgentOptions(

274 allowed_tools=["Read", "Edit", "Glob", "Bash"], permission_mode="acceptEdits"

275 )

276 ```

277 

278 ```typescript TypeScript hidelines={1,-1} theme={null}

279 const _ = {

280 options: {

281 allowedTools: ["Read", "Edit", "Glob", "Bash"],

282 permissionMode: "acceptEdits"

283 }

284 };

285 ```

286</CodeGroup>

287 

288启用 `Bash` 后,尝试:`"Write unit tests for utils.py, run them, and fix any failures"`

289 

290## 关键概念

291 

292**工具**控制你的代理可以做什么:

293 

294| 工具 | 代理可以做什么 |

295| ---------------------------------- | ------- |

296| `Read`、`Glob`、`Grep` | 只读分析 |

297| `Read`、`Edit`、`Glob` | 分析和修改代码 |

298| `Read`、`Edit`、`Bash`、`Glob`、`Grep` | 完全自动化 |

299 

300**权限模式**控制你想要多少人工监督:

301 

302| 模式 | 行为 | 用例 |

303| -------------------- | -------------------------- | -------------- |

304| `acceptEdits` | 自动批准文件编辑和常见文件系统命令,询问其他操作 | 受信任的开发工作流 |

305| `dontAsk` | 拒绝不在 `allowedTools` 中的任何内容 | 锁定的无头代理 |

306| `auto`(仅 TypeScript) | 模型分类器批准或拒绝每个工具调用 | 具有安全防护的自主代理 |

307| `bypassPermissions` | 运行每个工具而不提示 | 沙箱 CI、完全受信任的环境 |

308| `default` | 需要 `canUseTool` 回调来处理批准 | 自定义批准流程 |

309 

310上面的示例使用 `acceptEdits` 模式,它自动批准文件操作,以便代理可以在没有交互式提示的情况下运行。如果你想提示用户批准,使用 `default` 模式并提供一个 [`canUseTool` 回调](/zh-CN/agent-sdk/user-input)来收集用户输入。为了获得更多控制,请参阅[权限](/zh-CN/agent-sdk/permissions)。

311 

312## 故障排除

313 

314### API 错误 `thinking.type.enabled` 不支持此模型

315 

316Claude Opus 4.7 用 `thinking.type.adaptive` 替换了 `thinking.type.enabled`。当你选择 `claude-opus-4-7` 时,较旧的 Agent SDK 版本会失败,出现以下 API 错误:

317 

318```text theme={null}

319API Error: 400 {"type":"invalid_request_error","message":"\"thinking.type.enabled\" is not supported for this model. Use \"thinking.type.adaptive\" and \"output_config.effort\" to control thinking behavior."}

320```

321 

322升级到 Agent SDK v0.2.111 或更高版本以使用 Opus 4.7。

323 

324## 后续步骤

325 

326现在你已经创建了你的第一个代理,学习如何扩展其功能并将其定制到你的用例:

327 

328* **[权限](/zh-CN/agent-sdk/permissions)**:控制你的代理可以做什么以及何时需要批准

329* **[Hooks](/zh-CN/agent-sdk/hooks)**:在工具调用之前或之后运行自定义代码

330* **[会话](/zh-CN/agent-sdk/sessions)**:构建维护上下文的多轮代理

331* **[MCP 服务器](/zh-CN/agent-sdk/mcp)**:连接到数据库、浏览器、API 和其他外部系统

332* **[托管](/zh-CN/agent-sdk/hosting)**:将代理部署到 Docker、云和 CI/CD

333* **[示例代理](https://github.com/anthropics/claude-agent-sdk-demos)**:查看完整示例:电子邮件助手、研究代理等

agent-sdk/slash-commands.md +444 −0 created

Details

1> ## Documentation Index

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

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

4 

5# SDK 中的 slash commands

6 

7> 学习如何通过 SDK 使用 slash commands 来控制 Claude Code 会话

8 

9Slash commands 提供了一种方式来控制 Claude Code 会话,使用以 `/` 开头的特殊命令。这些命令可以通过 SDK 发送,以执行诸如压缩上下文、列出上下文使用情况或调用自定义命令等操作。只有在不需要交互式终端的情况下工作的命令才能通过 SDK 分派;`system/init` 消息列出了在您的会话中可用的命令。

10 

11## 发现可用的 Slash Commands

12 

13Claude Agent SDK 在系统初始化消息中提供有关可用 slash commands 的信息。在您的会话开始时访问此信息:

14 

15<CodeGroup>

16 ```typescript TypeScript theme={null}

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

18 

19 for await (const message of query({

20 prompt: "Hello Claude",

21 options: { maxTurns: 1 }

22 })) {

23 if (message.type === "system" && message.subtype === "init") {

24 console.log("Available slash commands:", message.slash_commands);

25 // Example output: ["/compact", "/context", "/usage"]

26 }

27 }

28 ```

29 

30 ```python Python theme={null}

31 import asyncio

32 from claude_agent_sdk import query, ClaudeAgentOptions, SystemMessage

33 

34 

35 async def main():

36 async for message in query(prompt="Hello Claude", options=ClaudeAgentOptions(max_turns=1)):

37 if isinstance(message, SystemMessage) and message.subtype == "init":

38 print("Available slash commands:", message.data["slash_commands"])

39 # Example output: ["/compact", "/context", "/usage"]

40 

41 

42 asyncio.run(main())

43 ```

44</CodeGroup>

45 

46## 发送 Slash Commands

47 

48通过在您的提示字符串中包含 slash commands 来发送它们,就像常规文本一样:

49 

50<CodeGroup>

51 ```typescript TypeScript theme={null}

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

53 

54 // Send a slash command

55 for await (const message of query({

56 prompt: "/compact",

57 options: { maxTurns: 1 }

58 })) {

59 if (message.type === "result") {

60 console.log("Command executed:", message.result);

61 }

62 }

63 ```

64 

65 ```python Python theme={null}

66 import asyncio

67 from claude_agent_sdk import query, ClaudeAgentOptions, ResultMessage

68 

69 

70 async def main():

71 # Send a slash command

72 async for message in query(prompt="/compact", options=ClaudeAgentOptions(max_turns=1)):

73 if isinstance(message, ResultMessage):

74 print("Command executed:", message.result)

75 

76 

77 asyncio.run(main())

78 ```

79</CodeGroup>

80 

81## 常见的 Slash Commands

82 

83### `/compact` - 压缩对话历史

84 

85`/compact` 命令通过总结较早的消息同时保留重要上下文来减少您的对话历史的大小:

86 

87<CodeGroup>

88 ```typescript TypeScript theme={null}

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

90 

91 for await (const message of query({

92 prompt: "/compact",

93 options: { maxTurns: 1 }

94 })) {

95 if (message.type === "system" && message.subtype === "compact_boundary") {

96 console.log("Compaction completed");

97 console.log("Pre-compaction tokens:", message.compact_metadata.pre_tokens);

98 console.log("Trigger:", message.compact_metadata.trigger);

99 }

100 }

101 ```

102 

103 ```python Python theme={null}

104 import asyncio

105 from claude_agent_sdk import query, ClaudeAgentOptions, SystemMessage

106 

107 

108 async def main():

109 async for message in query(prompt="/compact", options=ClaudeAgentOptions(max_turns=1)):

110 if isinstance(message, SystemMessage) and message.subtype == "compact_boundary":

111 print("Compaction completed")

112 print("Pre-compaction tokens:", message.data["compact_metadata"]["pre_tokens"])

113 print("Trigger:", message.data["compact_metadata"]["trigger"])

114 

115 

116 asyncio.run(main())

117 ```

118</CodeGroup>

119 

120### 清除对话

121 

122交互式 `/clear` 命令在 SDK 中不可用。每个 `query()` 调用已经开始一个新的对话,所以要清除上下文,请结束当前的 `query()` 并开始一个新的。之前的对话保存在磁盘上,可以通过将其会话 ID 传递给 [`resume` 选项](/zh-CN/agent-sdk/sessions#resume-by-id) 来返回。

123 

124## 创建自定义 Slash Commands

125 

126除了使用内置 slash commands 外,您还可以创建自己的自定义命令,这些命令可通过 SDK 使用。自定义命令定义为特定目录中的 markdown 文件,类似于 subagents 的配置方式。

127 

128<Note>

129 `.claude/commands/` 目录是旧版格式。推荐的格式是 `.claude/skills/<name>/SKILL.md`,它支持相同的 slash command 调用(`/name`)加上 Claude 的自主调用。有关当前格式,请参阅 [Skills](/zh-CN/agent-sdk/skills)。CLI 继续支持两种格式,下面的示例对于 `.claude/commands/` 仍然准确。

130</Note>

131 

132### 文件位置

133 

134自定义 slash commands 根据其范围存储在指定的目录中:

135 

136* **项目命令**:`.claude/commands/` - 仅在当前项目中可用(旧版;优先使用 `.claude/skills/`)

137* **个人命令**:`~/.claude/commands/` - 在您的所有项目中可用(旧版;优先使用 `~/.claude/skills/`)

138 

139### 文件格式

140 

141每个自定义命令都是一个 markdown 文件,其中:

142 

143* 文件名(不带 `.md` 扩展名)成为命令名称

144* 文件内容定义命令的功能

145* 可选的 YAML frontmatter 提供配置

146 

147#### 基本示例

148 

149创建 `.claude/commands/refactor.md`:

150 

151```markdown theme={null}

152Refactor the selected code to improve readability and maintainability.

153Focus on clean code principles and best practices.

154```

155 

156这创建了 `/refactor` 命令,您可以通过 SDK 使用它。

157 

158#### 带有 Frontmatter

159 

160创建 `.claude/commands/security-check.md`:

161 

162```markdown theme={null}

163---

164allowed-tools: Read, Grep, Glob

165description: Run security vulnerability scan

166model: claude-opus-4-7

167---

168 

169Analyze the codebase for security vulnerabilities including:

170- SQL injection risks

171- XSS vulnerabilities

172- Exposed credentials

173- Insecure configurations

174```

175 

176### 在 SDK 中使用自定义命令

177 

178一旦在文件系统中定义,自定义命令就会自动通过 SDK 可用:

179 

180<CodeGroup>

181 ```typescript TypeScript theme={null}

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

183 

184 // Use a custom command

185 for await (const message of query({

186 prompt: "/refactor src/auth/login.ts",

187 options: { maxTurns: 3 }

188 })) {

189 if (message.type === "assistant") {

190 console.log("Refactoring suggestions:", message.message);

191 }

192 }

193 

194 // Custom commands appear in the slash_commands list

195 for await (const message of query({

196 prompt: "Hello",

197 options: { maxTurns: 1 }

198 })) {

199 if (message.type === "system" && message.subtype === "init") {

200 // Will include both built-in and custom commands

201 console.log("Available commands:", message.slash_commands);

202 // Example: ["/compact", "/context", "/usage", "/refactor", "/security-check"]

203 }

204 }

205 ```

206 

207 ```python Python theme={null}

208 import asyncio

209 from claude_agent_sdk import query, ClaudeAgentOptions, AssistantMessage, SystemMessage

210 

211 

212 async def main():

213 # Use a custom command

214 async for message in query(

215 prompt="/refactor src/auth/login.py", options=ClaudeAgentOptions(max_turns=3)

216 ):

217 if isinstance(message, AssistantMessage):

218 for block in message.content:

219 if hasattr(block, "text"):

220 print("Refactoring suggestions:", block.text)

221 

222 # Custom commands appear in the slash_commands list

223 async for message in query(prompt="Hello", options=ClaudeAgentOptions(max_turns=1)):

224 if isinstance(message, SystemMessage) and message.subtype == "init":

225 # Will include both built-in and custom commands

226 print("Available commands:", message.data["slash_commands"])

227 # Example: ["/compact", "/context", "/usage", "/refactor", "/security-check"]

228 

229 

230 asyncio.run(main())

231 ```

232</CodeGroup>

233 

234### 高级功能

235 

236#### 参数和占位符

237 

238自定义命令支持使用占位符的动态参数:

239 

240创建 `.claude/commands/fix-issue.md`:

241 

242```markdown theme={null}

243---

244argument-hint: [issue-number] [priority]

245description: Fix a GitHub issue

246---

247 

248Fix issue #$1 with priority $2.

249Check the issue description and implement the necessary changes.

250```

251 

252在 SDK 中使用:

253 

254<CodeGroup>

255 ```typescript TypeScript theme={null}

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

257 

258 // Pass arguments to custom command

259 for await (const message of query({

260 prompt: "/fix-issue 123 high",

261 options: { maxTurns: 5 }

262 })) {

263 // Command will process with $1="123" and $2="high"

264 if (message.type === "result") {

265 console.log("Issue fixed:", message.result);

266 }

267 }

268 ```

269 

270 ```python Python theme={null}

271 import asyncio

272 from claude_agent_sdk import query, ClaudeAgentOptions, ResultMessage

273 

274 

275 async def main():

276 # Pass arguments to custom command

277 async for message in query(prompt="/fix-issue 123 high", options=ClaudeAgentOptions(max_turns=5)):

278 # Command will process with $1="123" and $2="high"

279 if isinstance(message, ResultMessage):

280 print("Issue fixed:", message.result)

281 

282 

283 asyncio.run(main())

284 ```

285</CodeGroup>

286 

287#### Bash 命令执行

288 

289自定义命令可以执行 bash 命令并包含其输出:

290 

291创建 `.claude/commands/git-commit.md`:

292 

293```markdown theme={null}

294---

295allowed-tools: Bash(git add *), Bash(git status *), Bash(git commit *)

296description: Create a git commit

297---

298 

299## Context

300 

301- Current status: !`git status`

302- Current diff: !`git diff HEAD`

303 

304## Task

305 

306Create a git commit with appropriate message based on the changes.

307```

308 

309#### 文件引用

310 

311使用 `@` 前缀包含文件内容:

312 

313创建 `.claude/commands/review-config.md`:

314 

315```markdown theme={null}

316---

317description: Review configuration files

318---

319 

320Review the following configuration files for issues:

321- Package config: @package.json

322- TypeScript config: @tsconfig.json

323- Environment config: @.env

324 

325Check for security issues, outdated dependencies, and misconfigurations.

326```

327 

328### 使用命名空间进行组织

329 

330在子目录中组织命令以获得更好的结构:

331 

332```bash theme={null}

333.claude/commands/

334├── frontend/

335│ ├── component.md # Creates /component (project:frontend)

336│ └── style-check.md # Creates /style-check (project:frontend)

337├── backend/

338│ ├── api-test.md # Creates /api-test (project:backend)

339│ └── db-migrate.md # Creates /db-migrate (project:backend)

340└── review.md # Creates /review (project)

341```

342 

343子目录出现在命令描述中,但不影响命令名称本身。

344 

345### 实际示例

346 

347#### 代码审查命令

348 

349创建 `.claude/commands/code-review.md`:

350 

351```markdown theme={null}

352---

353allowed-tools: Read, Grep, Glob, Bash(git diff *)

354description: Comprehensive code review

355---

356 

357## Changed Files

358!`git diff --name-only HEAD~1`

359 

360## Detailed Changes

361!`git diff HEAD~1`

362 

363## Review Checklist

364 

365Review the above changes for:

3661. Code quality and readability

3672. Security vulnerabilities

3683. Performance implications

3694. Test coverage

3705. Documentation completeness

371 

372Provide specific, actionable feedback organized by priority.

373```

374 

375#### 测试运行器命令

376 

377创建 `.claude/commands/test.md`:

378 

379```markdown theme={null}

380---

381allowed-tools: Bash, Read, Edit

382argument-hint: [test-pattern]

383description: Run tests with optional pattern

384---

385 

386Run tests matching pattern: $ARGUMENTS

387 

3881. Detect the test framework (Jest, pytest, etc.)

3892. Run tests with the provided pattern

3903. If tests fail, analyze and fix them

3914. Re-run to verify fixes

392```

393 

394通过 SDK 使用这些命令:

395 

396<CodeGroup>

397 ```typescript TypeScript theme={null}

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

399 

400 // Run code review

401 for await (const message of query({

402 prompt: "/code-review",

403 options: { maxTurns: 3 }

404 })) {

405 // Process review feedback

406 }

407 

408 // Run specific tests

409 for await (const message of query({

410 prompt: "/test auth",

411 options: { maxTurns: 5 }

412 })) {

413 // Handle test results

414 }

415 ```

416 

417 ```python Python theme={null}

418 import asyncio

419 from claude_agent_sdk import query, ClaudeAgentOptions

420 

421 

422 async def main():

423 # Run code review

424 async for message in query(prompt="/code-review", options=ClaudeAgentOptions(max_turns=3)):

425 # Process review feedback

426 pass

427 

428 # Run specific tests

429 async for message in query(prompt="/test auth", options=ClaudeAgentOptions(max_turns=5)):

430 # Handle test results

431 pass

432 

433 

434 asyncio.run(main())

435 ```

436</CodeGroup>

437 

438## 另请参阅

439 

440* [Slash Commands](/zh-CN/skills) - 完整的 slash command 文档

441* [SDK 中的 Subagents](/zh-CN/agent-sdk/subagents) - 类似的基于文件系统的 subagents 配置

442* [TypeScript SDK 参考](/zh-CN/agent-sdk/typescript) - 完整的 API 文档

443* [SDK 概述](/zh-CN/agent-sdk/overview) - 一般 SDK 概念

444* [CLI 参考](/zh-CN/cli-reference) - 命令行界面

agent-sdk/typescript.md +2975 −0 created

Details

1> ## Documentation Index

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

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

4 

5# Agent SDK 参考 - TypeScript

6 

7> TypeScript Agent SDK 的完整 API 参考,包括所有函数、类型和接口。

8 

9<script src="/components/typescript-sdk-type-links.js" defer />

10 

11<Note>

12 **尝试新的 V2 接口(预览版):** 现已推出简化的接口,具有 `send()` 和 `stream()` 模式,使多轮对话更加容易。[了解有关 TypeScript V2 预览版的更多信息](/zh-CN/agent-sdk/typescript-v2-preview)

13</Note>

14 

15## 安装

16 

17```bash theme={null}

18npm install @anthropic-ai/claude-agent-sdk

19```

20 

21<Note>

22 SDK 为您的平台捆绑了一个本地 Claude Code 二进制文件,作为可选依赖项,例如 `@anthropic-ai/claude-agent-sdk-darwin-arm64`。您无需单独安装 Claude Code。如果您的包管理器跳过可选依赖项,SDK 会抛出 `Native CLI binary for <platform> not found`;改为将 [`pathToClaudeCodeExecutable`](#options) 设置为单独安装的 `claude` 二进制文件。

23</Note>

24 

25## 函数

26 

27### `query()`

28 

29与 Claude Code 交互的主要函数。创建一个异步生成器,在消息到达时流式传输消息。

30 

31```typescript theme={null}

32function query({

33 prompt,

34 options

35}: {

36 prompt: string | AsyncIterable<SDKUserMessage>;

37 options?: Options;

38}): Query;

39```

40 

41#### 参数

42 

43| 参数 | 类型 | 描述 |

44| :-------- | :---------------------------------------------------------------- | :-------------------------- |

45| `prompt` | `string \| AsyncIterable<`[`SDKUserMessage`](#sdkuser-message)`>` | 输入提示,可以是字符串或异步可迭代对象(用于流式模式) |

46| `options` | [`Options`](#options) | 可选配置对象(请参阅下面的 Options 类型) |

47 

48#### 返回值

49 

50返回一个 [`Query`](#query-object) 对象,该对象扩展 `AsyncGenerator<`[`SDKMessage`](#sdk-message)`, void>`,并具有其他方法。

51 

52### `startup()`

53 

54通过生成 CLI 子进程并在提示可用之前完成初始化握手来预热 CLI 子进程。返回的 [`WarmQuery`](#warm-query) 句柄稍后接受提示并将其写入已准备好的进程,因此第一个 `query()` 调用解析时无需支付子进程生成和初始化成本。

55 

56```typescript theme={null}

57function startup(params?: {

58 options?: Options;

59 initializeTimeoutMs?: number;

60}): Promise<WarmQuery>;

61```

62 

63#### 参数

64 

65| 参数 | 类型 | 描述 |

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

67| `options` | [`Options`](#options) | 可选配置对象。与 `query()` 的 `options` 参数相同 |

68| `initializeTimeoutMs` | `number` | 等待子进程初始化的最长时间(毫秒)。默认为 `60000`。如果初始化未在规定时间内完成,promise 将以超时错误拒绝 |

69 

70#### 返回值

71 

72返回一个 `Promise<`[`WarmQuery`](#warm-query)`>`,在子进程生成并完成其初始化握手后解析。

73 

74#### 示例

75 

76早期调用 `startup()`,例如在应用程序启动时,然后在提示准备好后在返回的句柄上调用 `.query()`。这会将子进程生成和初始化移出关键路径。

77 

78```typescript theme={null}

79import { startup } from "@anthropic-ai/claude-agent-sdk";

80 

81// 提前支付启动成本

82const warm = await startup({ options: { maxTurns: 3 } });

83 

84// 稍后,当提示准备好时,这是立即的

85for await (const message of warm.query("What files are here?")) {

86 console.log(message);

87}

88```

89 

90### `tool()`

91 

92为与 SDK MCP 服务器一起使用创建类型安全的 MCP 工具定义。

93 

94```typescript theme={null}

95function tool<Schema extends AnyZodRawShape>(

96 name: string,

97 description: string,

98 inputSchema: Schema,

99 handler: (args: InferShape<Schema>, extra: unknown) => Promise<CallToolResult>,

100 extras?: { annotations?: ToolAnnotations }

101): SdkMcpToolDefinition<Schema>;

102```

103 

104#### 参数

105 

106| 参数 | 类型 | 描述 |

107| :------------ | :------------------------------------------------------------------ | :--------------------------------- |

108| `name` | `string` | 工具的名称 |

109| `description` | `string` | 工具功能的描述 |

110| `inputSchema` | `Schema extends AnyZodRawShape` | 定义工具输入参数的 Zod 架构(支持 Zod 3 和 Zod 4) |

111| `handler` | `(args, extra) => Promise<`[`CallToolResult`](#call-tool-result)`>` | 执行工具逻辑的异步函数 |

112| `extras` | `{ annotations?: `[`ToolAnnotations`](#tool-annotations)` }` | 可选的 MCP 工具注释,为客户端提供行为提示 |

113 

114#### `ToolAnnotations`

115 

116从 `@modelcontextprotocol/sdk/types.js` 重新导出。所有字段都是可选提示;客户端不应依赖它们做出安全决策。

117 

118| 字段 | 类型 | 默认值 | 描述 |

119| :---------------- | :-------- | :---------- | :------------------------------------------------------------- |

120| `title` | `string` | `undefined` | 工具的人类可读标题 |

121| `readOnlyHint` | `boolean` | `false` | 如果为 `true`,工具不会修改其环境 |

122| `destructiveHint` | `boolean` | `true` | 如果为 `true`,工具可能执行破坏性更新(仅在 `readOnlyHint` 为 `false` 时有意义) |

123| `idempotentHint` | `boolean` | `false` | 如果为 `true`,使用相同参数的重复调用没有额外效果(仅在 `readOnlyHint` 为 `false` 时有意义) |

124| `openWorldHint` | `boolean` | `true` | 如果为 `true`,工具与外部实体交互(例如,网络搜索)。如果为 `false`,工具的域是封闭的(例如,内存工具) |

125 

126```typescript theme={null}

127import { tool } from "@anthropic-ai/claude-agent-sdk";

128import { z } from "zod";

129 

130const searchTool = tool(

131 "search",

132 "Search the web",

133 { query: z.string() },

134 async ({ query }) => {

135 return { content: [{ type: "text", text: `Results for: ${query}` }] };

136 },

137 { annotations: { readOnlyHint: true, openWorldHint: true } }

138);

139```

140 

141### `createSdkMcpServer()`

142 

143创建在与应用程序相同的进程中运行的 MCP 服务器实例。

144 

145```typescript theme={null}

146function createSdkMcpServer(options: {

147 name: string;

148 version?: string;

149 tools?: Array<SdkMcpToolDefinition<any>>;

150}): McpSdkServerConfigWithInstance;

151```

152 

153#### 参数

154 

155| 参数 | 类型 | 描述 |

156| :---------------- | :---------------------------- | :----------------------------- |

157| `options.name` | `string` | MCP 服务器的名称 |

158| `options.version` | `string` | 可选版本字符串 |

159| `options.tools` | `Array<SdkMcpToolDefinition>` | 使用 [`tool()`](#tool) 创建的工具定义数组 |

160 

161### `listSessions()`

162 

163发现并列出具有轻量级元数据的过去会话。按项目目录筛选或列出所有项目中的会话。

164 

165```typescript theme={null}

166function listSessions(options?: ListSessionsOptions): Promise<SDKSessionInfo[]>;

167```

168 

169#### 参数

170 

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

172| :------------------------- | :-------- | :---------- | :---------------------------------------- |

173| `options.dir` | `string` | `undefined` | 列出会话的目录。省略时,返回所有项目中的会话 |

174| `options.limit` | `number` | `undefined` | 要返回的最大会话数 |

175| `options.includeWorktrees` | `boolean` | `true` | 当 `dir` 在 git 存储库内时,包括来自所有 worktree 路径的会话 |

176 

177#### 返回类型:`SDKSessionInfo`

178 

179| 属性 | 类型 | 描述 |

180| :------------- | :-------------------- | :-------------------------------------------- |

181| `sessionId` | `string` | 唯一会话标识符 (UUID) |

182| `summary` | `string` | 显示标题:自定义标题、自动生成的摘要或第一个提示 |

183| `lastModified` | `number` | 上次修改时间(自纪元以来的毫秒数) |

184| `fileSize` | `number \| undefined` | 会话文件大小(字节)。仅对本地 JSONL 存储进行填充 |

185| `customTitle` | `string \| undefined` | 用户设置的会话标题(通过 `/rename`) |

186| `firstPrompt` | `string \| undefined` | 会话中的第一个有意义的用户提示 |

187| `gitBranch` | `string \| undefined` | 会话结束时的 git 分支 |

188| `cwd` | `string \| undefined` | 会话的工作目录 |

189| `tag` | `string \| undefined` | 用户设置的会话标签(请参阅 [`tagSession()`](#tag-session)) |

190| `createdAt` | `number \| undefined` | 创建时间(自纪元以来的毫秒数),来自第一个条目的时间戳 |

191 

192#### 示例

193 

194打印项目的 10 个最近会话。结果按 `lastModified` 降序排序,因此第一项是最新的。省略 `dir` 以搜索所有项目。

195 

196```typescript theme={null}

197import { listSessions } from "@anthropic-ai/claude-agent-sdk";

198 

199const sessions = await listSessions({ dir: "/path/to/project", limit: 10 });

200 

201for (const session of sessions) {

202 console.log(`${session.summary} (${session.sessionId})`);

203}

204```

205 

206### `getSessionMessages()`

207 

208从过去的会话记录中读取用户和助手消息。

209 

210```typescript theme={null}

211function getSessionMessages(

212 sessionId: string,

213 options?: GetSessionMessagesOptions

214): Promise<SessionMessage[]>;

215```

216 

217#### 参数

218 

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

220| :--------------- | :------- | :---------- | :-------------------------------- |

221| `sessionId` | `string` | 必需 | 要读取的会话 UUID(请参阅 `listSessions()`) |

222| `options.dir` | `string` | `undefined` | 查找会话的项目目录。省略时,搜索所有项目 |

223| `options.limit` | `number` | `undefined` | 要返回的最大消息数 |

224| `options.offset` | `number` | `undefined` | 从开始跳过的消息数 |

225 

226#### 返回类型:`SessionMessage`

227 

228| 属性 | 类型 | 描述 |

229| :------------------- | :---------------------- | :------------ |

230| `type` | `"user" \| "assistant"` | 消息角色 |

231| `uuid` | `string` | 唯一消息标识符 |

232| `session_id` | `string` | 此消息所属的会话 |

233| `message` | `unknown` | 来自记录的原始消息有效负载 |

234| `parent_tool_use_id` | `null` | 保留 |

235 

236#### 示例

237 

238```typescript theme={null}

239import { listSessions, getSessionMessages } from "@anthropic-ai/claude-agent-sdk";

240 

241const [latest] = await listSessions({ dir: "/path/to/project", limit: 1 });

242 

243if (latest) {

244 const messages = await getSessionMessages(latest.sessionId, {

245 dir: "/path/to/project",

246 limit: 20

247 });

248 

249 for (const msg of messages) {

250 console.log(`[${msg.type}] ${msg.uuid}`);

251 }

252}

253```

254 

255### `getSessionInfo()`

256 

257按 ID 读取单个会话的元数据,无需扫描完整项目目录。

258 

259```typescript theme={null}

260function getSessionInfo(

261 sessionId: string,

262 options?: GetSessionInfoOptions

263): Promise<SDKSessionInfo | undefined>;

264```

265 

266#### 参数

267 

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

269| :------------ | :------- | :---------- | :------------------ |

270| `sessionId` | `string` | 必需 | 要查找的会话 UUID |

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

272 

273返回 [`SDKSessionInfo`](#return-type-sdk-session-info),如果找不到会话,则返回 `undefined`。

274 

275### `renameSession()`

276 

277通过附加自定义标题条目来重命名会话。重复调用是安全的;最新的标题获胜。

278 

279```typescript theme={null}

280function renameSession(

281 sessionId: string,

282 title: string,

283 options?: SessionMutationOptions

284): Promise<void>;

285```

286 

287#### 参数

288 

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

290| :------------ | :------- | :---------- | :------------------ |

291| `sessionId` | `string` | 必需 | 要重命名的会话 UUID |

292| `title` | `string` | 必需 | 新标题。修剪空格后必须非空 |

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

294 

295### `tagSession()`

296 

297标记会话。传递 `null` 以清除标签。重复调用是安全的;最新的标签获胜。

298 

299```typescript theme={null}

300function tagSession(

301 sessionId: string,

302 tag: string | null,

303 options?: SessionMutationOptions

304): Promise<void>;

305```

306 

307#### 参数

308 

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

310| :------------ | :--------------- | :---------- | :------------------ |

311| `sessionId` | `string` | 必需 | 要标记的会话 UUID |

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

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

314 

315## 类型

316 

317### `Options`

318 

319`query()` 函数的配置对象。

320 

321| 属性 | 类型 | 默认值 | 描述 |

322| :-------------------------------- | :------------------------------------------------------------------------------------------------------- | :---------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

323| `abortController` | `AbortController` | `new AbortController()` | 用于取消操作的控制器 |

324| `additionalDirectories` | `string[]` | `[]` | Claude 可以访问的其他目录 |

325| `agent` | `string` | `undefined` | 主线程的代理名称。代理必须在 `agents` 选项或设置中定义 |

326| `agents` | `Record<string, [`AgentDefinition`](#agent-definition)>` | `undefined` | 以编程方式定义子代理 |

327| `allowDangerouslySkipPermissions` | `boolean` | `false` | 启用绕过权限。使用 `permissionMode: 'bypassPermissions'` 时需要 |

328| `allowedTools` | `string[]` | `[]` | 无需提示即可自动批准的工具。这不会将 Claude 限制为仅这些工具;未列出的工具会通过 `permissionMode` 和 `canUseTool` 进行处理。使用 `disallowedTools` 阻止工具。请参阅[权限](/zh-CN/agent-sdk/permissions#allow-and-deny-rules) |

329| `betas` | [`SdkBeta`](#sdk-beta)`[]` | `[]` | 启用测试功能 |

330| `canUseTool` | [`CanUseTool`](#can-use-tool) | `undefined` | 工具使用的自定义权限函数 |

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

332| `cwd` | `string` | `process.cwd()` | 当前工作目录 |

333| `debug` | `boolean` | `false` | 为 Claude Code 进程启用调试模式 |

334| `debugFile` | `string` | `undefined` | 将调试日志写入特定文件路径。隐式启用调试模式 |

335| `disallowedTools` | `string[]` | `[]` | 始终拒绝的工具。拒绝规则首先检查并覆盖 `allowedTools` 和 `permissionMode`(包括 `bypassPermissions`) |

336| `effort` | `'low' \| 'medium' \| 'high' \| 'xhigh' \| 'max'` | `'high'` | 控制 Claude 在其响应中投入的努力程度。与自适应思考一起工作以指导思考深度 |

337| `enableFileCheckpointing` | `boolean` | `false` | 启用文件更改跟踪以进行回滚。请参阅[文件检查点](/zh-CN/agent-sdk/file-checkpointing) |

338| `env` | `Record<string, string \| undefined>` | `process.env` | 环境变量。请参阅[环境变量](/zh-CN/env-vars)了解底层 CLI 读取的变量。设置 `CLAUDE_AGENT_SDK_CLIENT_APP` 以在 User-Agent 标头中标识您的应用 |

339| `executable` | `'bun' \| 'deno' \| 'node'` | 自动检测 | 要使用的 JavaScript 运行时 |

340| `executableArgs` | `string[]` | `[]` | 传递给可执行文件的参数 |

341| `extraArgs` | `Record<string, string \| null>` | `{}` | 其他参数 |

342| `fallbackModel` | `string` | `undefined` | 主模型失败时使用的模型 |

343| `forkSession` | `boolean` | `false` | 使用 `resume` 恢复时,分叉到新会话 ID 而不是继续原始会话 |

344| `hooks` | `Partial<Record<`[`HookEvent`](#hook-event)`, `[`HookCallbackMatcher`](#hook-callback-matcher)`[]>>` | `{}` | 事件的 Hook 回调 |

345| `includePartialMessages` | `boolean` | `false` | 包括部分消息事件 |

346| `maxBudgetUsd` | `number` | `undefined` | 当客户端成本估计达到此 USD 值时停止查询。与 `total_cost_usd` 的相同估计进行比较;请参阅[跟踪成本和使用情况](/zh-CN/agent-sdk/cost-tracking)了解准确性注意事项 |

347| `maxThinkingTokens` | `number` | `undefined` | *已弃用:* 改用 `thinking`。思考过程的最大令牌数 |

348| `maxTurns` | `number` | `undefined` | 最大代理轮次(工具使用往返) |

349| `mcpServers` | `Record<string, [`McpServerConfig`](#mcp-server-config)>` | `{}` | MCP 服务器配置 |

350| `model` | `string` | CLI 的默认值 | 要使用的 Claude 模型 |

351| `outputFormat` | `{ type: 'json_schema', schema: JSONSchema }` | `undefined` | 为代理结果定义输出格式。请参阅[结构化输出](/zh-CN/agent-sdk/structured-outputs)了解详情 |

352| `pathToClaudeCodeExecutable` | `string` | 从捆绑的本地二进制文件自动解析 | Claude Code 可执行文件的路径。仅在安装期间跳过可选依赖项或您的平台不在支持的集合中时需要 |

353| `permissionMode` | [`PermissionMode`](#permission-mode) | `'default'` | 会话的权限模式 |

354| `permissionPromptToolName` | `string` | `undefined` | 权限提示的 MCP 工具名称 |

355| `persistSession` | `boolean` | `true` | 当为 `false` 时,禁用会话持久化到磁盘。会话之后无法恢复 |

356| `plugins` | [`SdkPluginConfig`](#sdk-plugin-config)`[]` | `[]` | 从本地路径加载自定义插件。请参阅[插件](/zh-CN/agent-sdk/plugins)了解详情 |

357| `promptSuggestions` | `boolean` | `false` | 启用提示建议。在每个轮次后发出 `prompt_suggestion` 消息,包含预测的下一个用户提示 |

358| `resume` | `string` | `undefined` | 要恢复的会话 ID |

359| `resumeSessionAt` | `string` | `undefined` | 在特定消息 UUID 处恢复会话 |

360| `sandbox` | [`SandboxSettings`](#sandbox-settings) | `undefined` | 以编程方式配置沙箱行为。请参阅[沙箱设置](#sandbox-settings)了解详情 |

361| `sessionId` | `string` | 自动生成 | 为会话使用特定的 UUID 而不是自动生成一个 |

362| `sessionStore` | [`SessionStore`](/zh-CN/agent-sdk/session-storage#the-session-store-interface) | `undefined` | 将会话记录镜像到外部后端,以便任何主机都可以恢复它们。请参阅[将会话持久化到外部存储](/zh-CN/agent-sdk/session-storage) |

363| `settingSources` | [`SettingSource`](#setting-source)`[]` | CLI 默认值(所有源) | 控制加载哪些文件系统设置。传递 `[]` 以禁用用户、项目和本地设置。无论如何都会加载托管策略设置。请参阅[使用 Claude Code 功能](/zh-CN/agent-sdk/claude-code-features#what-settingsources-does-not-control) |

364| `spawnClaudeCodeProcess` | `(options: SpawnOptions) => SpawnedProcess` | `undefined` | 用于生成 Claude Code 进程的自定义函数。用于在 VM、容器或远程环境中运行 Claude Code |

365| `stderr` | `(data: string) => void` | `undefined` | stderr 输出的回调 |

366| `strictMcpConfig` | `boolean` | `false` | 强制执行严格的 MCP 验证 |

367| `systemPrompt` | `string \| { type: 'preset'; preset: 'claude_code'; append?: string; excludeDynamicSections?: boolean }` | `undefined`(最小提示) | 系统提示配置。传递字符串以获取自定义提示,或 `{ type: 'preset', preset: 'claude_code' }` 以使用 Claude Code 的系统提示。使用预设对象形式时,添加 `append` 以使用其他说明扩展它,并设置 `excludeDynamicSections: true` 以将每个会话上下文移到第一条用户消息中,以便[更好地跨机器重用提示缓存](/zh-CN/agent-sdk/modifying-system-prompts#improve-prompt-caching-across-users-and-machines) |

368| `thinking` | [`ThinkingConfig`](#thinking-config) | 支持的模型为 `{ type: 'adaptive' }` | 控制 Claude 的思考/推理行为。请参阅 [`ThinkingConfig`](#thinking-config) 了解选项 |

369| `toolConfig` | [`ToolConfig`](#tool-config) | `undefined` | 内置工具行为的配置。请参阅 [`ToolConfig`](#tool-config) 了解详情 |

370| `tools` | `string[] \| { type: 'preset'; preset: 'claude_code' }` | `undefined` | 工具配置。传递工具名称数组或使用预设获取 Claude Code 的默认工具 |

371 

372### `Query` 对象

373 

374由 `query()` 函数返回的接口。

375 

376```typescript theme={null}

377interface Query extends AsyncGenerator<SDKMessage, void> {

378 interrupt(): Promise<void>;

379 rewindFiles(

380 userMessageId: string,

381 options?: { dryRun?: boolean }

382 ): Promise<RewindFilesResult>;

383 setPermissionMode(mode: PermissionMode): Promise<void>;

384 setModel(model?: string): Promise<void>;

385 setMaxThinkingTokens(maxThinkingTokens: number | null): Promise<void>;

386 initializationResult(): Promise<SDKControlInitializeResponse>;

387 supportedCommands(): Promise<SlashCommand[]>;

388 supportedModels(): Promise<ModelInfo[]>;

389 supportedAgents(): Promise<AgentInfo[]>;

390 mcpServerStatus(): Promise<McpServerStatus[]>;

391 accountInfo(): Promise<AccountInfo>;

392 reconnectMcpServer(serverName: string): Promise<void>;

393 toggleMcpServer(serverName: string, enabled: boolean): Promise<void>;

394 setMcpServers(servers: Record<string, McpServerConfig>): Promise<McpSetServersResult>;

395 streamInput(stream: AsyncIterable<SDKUserMessage>): Promise<void>;

396 stopTask(taskId: string): Promise<void>;

397 close(): void;

398}

399```

400 

401#### 方法

402 

403| 方法 | 描述 |

404| :------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------ |

405| `interrupt()` | 中断查询(仅在流式输入模式下可用) |

406| `rewindFiles(userMessageId, options?)` | 将文件恢复到指定用户消息时的状态。传递 `{ dryRun: true }` 以预览更改。需要 `enableFileCheckpointing: true`。请参阅[文件检查点](/zh-CN/agent-sdk/file-checkpointing) |

407| `setPermissionMode()` | 更改权限模式(仅在流式输入模式下可用) |

408| `setModel()` | 更改模型(仅在流式输入模式下可用) |

409| `setMaxThinkingTokens()` | *已弃用:* 改用 `thinking` 选项。更改最大思考令牌数 |

410| `initializationResult()` | 返回完整的初始化结果,包括支持的命令、模型、帐户信息和输出样式配置 |

411| `supportedCommands()` | 返回可用的 slash commands |

412| `supportedModels()` | 返回具有显示信息的可用模型 |

413| `supportedAgents()` | 返回可用的子代理作为 [`AgentInfo`](#agent-info)`[]` |

414| `mcpServerStatus()` | 返回连接的 MCP 服务器的状态 |

415| `accountInfo()` | 返回帐户信息 |

416| `reconnectMcpServer(serverName)` | 按名称重新连接 MCP 服务器 |

417| `toggleMcpServer(serverName, enabled)` | 按名称启用或禁用 MCP 服务器 |

418| `setMcpServers(servers)` | 动态替换此会话的 MCP 服务器集。返回有关添加、删除的服务器和任何错误的信息 |

419| `streamInput(stream)` | 将输入消息流式传输到查询以进行多轮对话 |

420| `stopTask(taskId)` | 按 ID 停止运行的后台任务 |

421| `close()` | 关闭查询并终止底层进程。强制结束查询并清理所有资源 |

422 

423### `WarmQuery`

424 

425由 [`startup()`](#startup) 返回的句柄。子进程已生成并初始化,因此在此句柄上调用 `query()` 会直接将提示写入准备好的进程,无需启动延迟。

426 

427```typescript theme={null}

428interface WarmQuery extends AsyncDisposable {

429 query(prompt: string | AsyncIterable<SDKUserMessage>): Query;

430 close(): void;

431}

432```

433 

434#### 方法

435 

436| 方法 | 描述 |

437| :-------------- | :------------------------------------------------------------ |

438| `query(prompt)` | 向预热的子进程发送提示并返回 [`Query`](#query-object)。每个 `WarmQuery` 只能调用一次 |

439| `close()` | 关闭子进程而不发送提示。使用此方法丢弃不再需要的预热查询 |

440 

441`WarmQuery` 实现 `AsyncDisposable`,因此可以与 `await using` 一起使用以进行自动清理。

442 

443### `SDKControlInitializeResponse`

444 

445`initializationResult()` 的返回类型。包含会话初始化数据。

446 

447```typescript theme={null}

448type SDKControlInitializeResponse = {

449 commands: SlashCommand[];

450 agents: AgentInfo[];

451 output_style: string;

452 available_output_styles: string[];

453 models: ModelInfo[];

454 account: AccountInfo;

455 fast_mode_state?: "off" | "cooldown" | "on";

456};

457```

458 

459### `AgentDefinition`

460 

461以编程方式定义的子代理的配置。

462 

463```typescript theme={null}

464type AgentDefinition = {

465 description: string;

466 tools?: string[];

467 disallowedTools?: string[];

468 prompt: string;

469 model?: string;

470 mcpServers?: AgentMcpServerSpec[];

471 skills?: string[];

472 initialPrompt?: string;

473 maxTurns?: number;

474 background?: boolean;

475 memory?: "user" | "project" | "local";

476 effort?: "low" | "medium" | "high" | "xhigh" | "max" | number;

477 permissionMode?: PermissionMode;

478 criticalSystemReminder_EXPERIMENTAL?: string;

479};

480```

481 

482| 字段 | 必需 | 描述 |

483| :------------------------------------ | :- | :------------------------------------------------------------------------------------------ |

484| `description` | 是 | 何时使用此代理的自然语言描述 |

485| `tools` | 否 | 允许的工具名称数组。如果省略,继承父级的所有工具 |

486| `disallowedTools` | 否 | 要为此代理明确禁止的工具名称数组 |

487| `prompt` | 是 | 代理的系统提示 |

488| `model` | 否 | 此代理的模型覆盖。接受别名,如 `'sonnet'`、`'opus'`、`'haiku'`、`'inherit'`,或完整的模型 ID。如果省略或 `'inherit'`,使用主模型 |

489| `mcpServers` | 否 | 此代理的 MCP 服务器规范 |

490| `skills` | 否 | 要预加载到代理上下文中的技能名称数组 |

491| `initialPrompt` | 否 | 当此代理作为主线程代理运行时,自动提交为第一个用户轮次 |

492| `maxTurns` | 否 | 停止前的最大代理轮次数(API 往返) |

493| `background` | 否 | 调用时将此代理作为非阻塞后台任务运行 |

494| `memory` | 否 | 此代理的内存源:`'user'`、`'project'` 或 `'local'` |

495| `effort` | 否 | 此代理的推理努力级别。接受命名级别或整数 |

496| `permissionMode` | 否 | 此代理内工具执行的权限模式。请参阅 [`PermissionMode`](#permission-mode) |

497| `criticalSystemReminder_EXPERIMENTAL` | 否 | 实验性:添加到系统提示的关键提醒 |

498 

499### `AgentMcpServerSpec`

500 

501指定子代理可用的 MCP 服务器。可以是服务器名称(字符串,引用父级 `mcpServers` 配置中的服务器)或内联服务器配置记录,将服务器名称映射到配置。

502 

503```typescript theme={null}

504type AgentMcpServerSpec = string | Record<string, McpServerConfigForProcessTransport>;

505```

506 

507其中 `McpServerConfigForProcessTransport` 是 `McpStdioServerConfig | McpSSEServerConfig | McpHttpServerConfig | McpSdkServerConfig`。

508 

509### `SettingSource`

510 

511控制 SDK 从哪些基于文件系统的配置源加载设置。

512 

513```typescript theme={null}

514type SettingSource = "user" | "project" | "local";

515```

516 

517| 值 | 描述 | 位置 |

518| :---------- | :----------------- | :---------------------------- |

519| `'user'` | 全局用户设置 | `~/.claude/settings.json` |

520| `'project'` | 共享项目设置(版本控制) | `.claude/settings.json` |

521| `'local'` | 本地项目设置(gitignored) | `.claude/settings.local.json` |

522 

523#### 默认行为

524 

525当 `settingSources` 被省略或 `undefined` 时,`query()` 加载与 Claude Code CLI 相同的文件系统设置:用户、项目和本地。在所有情况下都会加载托管策略设置。请参阅[settingSources 不控制的内容](/zh-CN/agent-sdk/claude-code-features#what-settingsources-does-not-control)了解无论此选项如何都会读取的输入,以及如何禁用它们。

526 

527#### 为什么使用 settingSources

528 

529**禁用文件系统设置:**

530 

531```typescript theme={null}

532// 不从磁盘加载用户、项目或本地设置

533const result = query({

534 prompt: "Analyze this code",

535 options: { settingSources: [] }

536});

537```

538 

539**显式加载所有文件系统设置:**

540 

541```typescript theme={null}

542const result = query({

543 prompt: "Analyze this code",

544 options: {

545 settingSources: ["user", "project", "local"] // 加载所有设置

546 }

547});

548```

549 

550**仅加载特定设置源:**

551 

552```typescript theme={null}

553// 仅加载项目设置,忽略用户和本地

554const result = query({

555 prompt: "Run CI checks",

556 options: {

557 settingSources: ["project"] // 仅 .claude/settings.json

558 }

559});

560```

561 

562**测试和 CI 环境:**

563 

564```typescript theme={null}

565// 通过排除本地设置确保 CI 中的一致行为

566const result = query({

567 prompt: "Run tests",

568 options: {

569 settingSources: ["project"], // 仅团队共享设置

570 permissionMode: "bypassPermissions"

571 }

572});

573```

574 

575**仅 SDK 应用程序:**

576 

577```typescript theme={null}

578// 以编程方式定义所有内容。

579// 传递 [] 以选择退出文件系统设置源。

580const result = query({

581 prompt: "Review this PR",

582 options: {

583 settingSources: [],

584 agents: {

585 /* ... */

586 },

587 mcpServers: {

588 /* ... */

589 },

590 allowedTools: ["Read", "Grep", "Glob"]

591 }

592});

593```

594 

595**加载 CLAUDE.md 项目说明:**

596 

597```typescript theme={null}

598// 加载项目设置以包括 CLAUDE.md 文件

599const result = query({

600 prompt: "Add a new feature following project conventions",

601 options: {

602 systemPrompt: {

603 type: "preset",

604 preset: "claude_code" // 使用 Claude Code 的系统提示

605 },

606 settingSources: ["project"], // 从项目目录加载 CLAUDE.md

607 allowedTools: ["Read", "Write", "Edit"]

608 }

609});

610```

611 

612#### 设置优先级

613 

614加载多个源时,设置按此优先级合并(从高到低):

615 

6161. 本地设置(`.claude/settings.local.json`)

6172. 项目设置(`.claude/settings.json`)

6183. 用户设置(`~/.claude/settings.json`)

619 

620编程选项(如 `agents` 和 `allowedTools`)覆盖用户、项目和本地文件系统设置。托管策略设置优先于编程选项。

621 

622### `PermissionMode`

623 

624```typescript theme={null}

625type PermissionMode =

626 | "default" // 标准权限行为

627 | "acceptEdits" // 自动接受文件编辑

628 | "bypassPermissions" // 绕过所有权限检查

629 | "plan" // 规划模式 - 无执行

630 | "dontAsk" // 不提示权限,如果未预先批准则拒绝

631 | "auto"; // 使用模型分类器批准或拒绝每个工具调用

632```

633 

634### `CanUseTool`

635 

636用于控制工具使用的自定义权限函数类型。

637 

638```typescript theme={null}

639type CanUseTool = (

640 toolName: string,

641 input: Record<string, unknown>,

642 options: {

643 signal: AbortSignal;

644 suggestions?: PermissionUpdate[];

645 blockedPath?: string;

646 decisionReason?: string;

647 toolUseID: string;

648 agentID?: string;

649 }

650) => Promise<PermissionResult>;

651```

652 

653| 选项 | 类型 | 描述 |

654| :--------------- | :------------------------------------------- | :--------------------- |

655| `signal` | `AbortSignal` | 如果应中止操作,则发出信号 |

656| `suggestions` | [`PermissionUpdate`](#permission-update)`[]` | 建议的权限更新,以便用户不会再次被提示此工具 |

657| `blockedPath` | `string` | 触发权限请求的文件路径(如果适用) |

658| `decisionReason` | `string` | 解释为什么触发此权限请求 |

659| `toolUseID` | `string` | 此特定工具调用在助手消息中的唯一标识符 |

660| `agentID` | `string` | 如果在子代理中运行,子代理的 ID |

661 

662### `PermissionResult`

663 

664权限检查的结果。

665 

666```typescript theme={null}

667type PermissionResult =

668 | {

669 behavior: "allow";

670 updatedInput?: Record<string, unknown>;

671 updatedPermissions?: PermissionUpdate[];

672 toolUseID?: string;

673 }

674 | {

675 behavior: "deny";

676 message: string;

677 interrupt?: boolean;

678 toolUseID?: string;

679 };

680```

681 

682### `ToolConfig`

683 

684内置工具行为的配置。

685 

686```typescript theme={null}

687type ToolConfig = {

688 askUserQuestion?: {

689 previewFormat?: "markdown" | "html";

690 };

691};

692```

693 

694| 字段 | 类型 | 描述 |

695| :------------------------------ | :--------------------- | :---------------------------------------------------------------------------------------------------------------- |

696| `askUserQuestion.previewFormat` | `'markdown' \| 'html'` | 选择加入 [`AskUserQuestion`](/zh-CN/agent-sdk/user-input#question-format) 选项上的 `preview` 字段并设置其内容格式。未设置时,Claude 不发出预览 |

697 

698### `McpServerConfig`

699 

700MCP 服务器的配置。

701 

702```typescript theme={null}

703type McpServerConfig =

704 | McpStdioServerConfig

705 | McpSSEServerConfig

706 | McpHttpServerConfig

707 | McpSdkServerConfigWithInstance;

708```

709 

710#### `McpStdioServerConfig`

711 

712```typescript theme={null}

713type McpStdioServerConfig = {

714 type?: "stdio";

715 command: string;

716 args?: string[];

717 env?: Record<string, string>;

718};

719```

720 

721#### `McpSSEServerConfig`

722 

723```typescript theme={null}

724type McpSSEServerConfig = {

725 type: "sse";

726 url: string;

727 headers?: Record<string, string>;

728};

729```

730 

731#### `McpHttpServerConfig`

732 

733```typescript theme={null}

734type McpHttpServerConfig = {

735 type: "http";

736 url: string;

737 headers?: Record<string, string>;

738};

739```

740 

741#### `McpSdkServerConfigWithInstance`

742 

743```typescript theme={null}

744type McpSdkServerConfigWithInstance = {

745 type: "sdk";

746 name: string;

747 instance: McpServer;

748};

749```

750 

751#### `McpClaudeAIProxyServerConfig`

752 

753```typescript theme={null}

754type McpClaudeAIProxyServerConfig = {

755 type: "claudeai-proxy";

756 url: string;

757 id: string;

758};

759```

760 

761### `SdkPluginConfig`

762 

763SDK 中加载插件的配置。

764 

765```typescript theme={null}

766type SdkPluginConfig = {

767 type: "local";

768 path: string;

769};

770```

771 

772| 字段 | 类型 | 描述 |

773| :----- | :-------- | :----------------------- |

774| `type` | `'local'` | 必须为 `'local'`(目前仅支持本地插件) |

775| `path` | `string` | 插件目录的绝对或相对路径 |

776 

777**示例:**

778 

779```typescript theme={null}

780plugins: [

781 { type: "local", path: "./my-plugin" },

782 { type: "local", path: "/absolute/path/to/plugin" }

783];

784```

785 

786有关创建和使用插件的完整信息,请参阅[插件](/zh-CN/agent-sdk/plugins)。

787 

788## 消息类型

789 

790### `SDKMessage`

791 

792查询返回的所有可能消息的联合类型。

793 

794```typescript theme={null}

795type SDKMessage =

796 | SDKAssistantMessage

797 | SDKUserMessage

798 | SDKUserMessageReplay

799 | SDKResultMessage

800 | SDKSystemMessage

801 | SDKPartialAssistantMessage

802 | SDKCompactBoundaryMessage

803 | SDKStatusMessage

804 | SDKLocalCommandOutputMessage

805 | SDKHookStartedMessage

806 | SDKHookProgressMessage

807 | SDKHookResponseMessage

808 | SDKPluginInstallMessage

809 | SDKToolProgressMessage

810 | SDKAuthStatusMessage

811 | SDKTaskNotificationMessage

812 | SDKTaskStartedMessage

813 | SDKTaskProgressMessage

814 | SDKTaskUpdatedMessage

815 | SDKFilesPersistedEvent

816 | SDKToolUseSummaryMessage

817 | SDKRateLimitEvent

818 | SDKPromptSuggestionMessage;

819```

820 

821### `SDKAssistantMessage`

822 

823助手响应消息。

824 

825```typescript theme={null}

826type SDKAssistantMessage = {

827 type: "assistant";

828 uuid: UUID;

829 session_id: string;

830 message: BetaMessage; // 来自 Anthropic SDK

831 parent_tool_use_id: string | null;

832 error?: SDKAssistantMessageError;

833};

834```

835 

836`message` 字段是来自 Anthropic SDK 的 [`BetaMessage`](https://platform.claude.com/docs/zh-CN/api/messages/create)。它包括 `id`、`content`、`model`、`stop_reason` 和 `usage` 等字段。

837 

838`SDKAssistantMessageError` 是以下之一:`'authentication_failed'`、`'oauth_org_not_allowed'`、`'billing_error'`、`'rate_limit'`、`'invalid_request'`、`'server_error'`、`'max_output_tokens'` 或 `'unknown'`。

839 

840### `SDKUserMessage`

841 

842用户输入消息。

843 

844```typescript theme={null}

845type SDKUserMessage = {

846 type: "user";

847 uuid?: UUID;

848 session_id: string;

849 message: MessageParam; // 来自 Anthropic SDK

850 parent_tool_use_id: string | null;

851 isSynthetic?: boolean;

852 shouldQuery?: boolean;

853 tool_use_result?: unknown;

854 origin?: SDKMessageOrigin;

855};

856```

857 

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

859 

860### `SDKUserMessageReplay`

861 

862具有必需 UUID 的重放用户消息。

863 

864```typescript theme={null}

865type SDKUserMessageReplay = {

866 type: "user";

867 uuid: UUID;

868 session_id: string;

869 message: MessageParam;

870 parent_tool_use_id: string | null;

871 isSynthetic?: boolean;

872 tool_use_result?: unknown;

873 origin?: SDKMessageOrigin;

874 isReplay: true;

875};

876```

877 

878### `SDKResultMessage`

879 

880最终结果消息。

881 

882```typescript theme={null}

883type SDKResultMessage =

884 | {

885 type: "result";

886 subtype: "success";

887 uuid: UUID;

888 session_id: string;

889 duration_ms: number;

890 duration_api_ms: number;

891 is_error: boolean;

892 num_turns: number;

893 result: string;

894 stop_reason: string | null;

895 total_cost_usd: number;

896 usage: NonNullableUsage;

897 modelUsage: { [modelName: string]: ModelUsage };

898 permission_denials: SDKPermissionDenial[];

899 structured_output?: unknown;

900 deferred_tool_use?: { id: string; name: string; input: Record<string, unknown> };

901 origin?: SDKMessageOrigin;

902 }

903 | {

904 type: "result";

905 subtype:

906 | "error_max_turns"

907 | "error_during_execution"

908 | "error_max_budget_usd"

909 | "error_max_structured_output_retries";

910 uuid: UUID;

911 session_id: string;

912 duration_ms: number;

913 duration_api_ms: number;

914 is_error: boolean;

915 num_turns: number;

916 stop_reason: string | null;

917 total_cost_usd: number;

918 usage: NonNullableUsage;

919 modelUsage: { [modelName: string]: ModelUsage };

920 permission_denials: SDKPermissionDenial[];

921 errors: string[];

922 origin?: SDKMessageOrigin;

923 };

924```

925 

926`origin` 字段转发触发此结果的用户消息的 [`SDKMessageOrigin`](#sdkmessageorigin)。当后台任务完成且 SDK 注入合成后续轮次时,生成的 `SDKResultMessage` 携带 `origin: { kind: "task-notification" }`。检查此字段以区分回答您的提示的结果与为后台任务后续操作发出的结果,以便您可以路由或抑制后者。对于在任何用户轮次之前发出的结果(例如启动错误),该字段不存在。

927 

928当 `PreToolUse` hook 返回 `permissionDecision: "defer"` 时,结果具有 `stop_reason: "tool_deferred"` 和 `deferred_tool_use` 携带待处理工具的 `id`、`name` 和 `input`。读取此字段以在您自己的 UI 中显示请求,然后使用相同的 `session_id` 恢复以继续。有关完整的往返过程,请参阅[稍后延迟工具调用](/zh-CN/hooks#defer-a-tool-call-for-later)。

929 

930### `SDKSystemMessage`

931 

932系统初始化消息。

933 

934```typescript theme={null}

935type SDKSystemMessage = {

936 type: "system";

937 subtype: "init";

938 uuid: UUID;

939 session_id: string;

940 agents?: string[];

941 apiKeySource: ApiKeySource;

942 betas?: string[];

943 claude_code_version: string;

944 cwd: string;

945 tools: string[];

946 mcp_servers: {

947 name: string;

948 status: string;

949 }[];

950 model: string;

951 permissionMode: PermissionMode;

952 slash_commands: string[];

953 output_style: string;

954 skills: string[];

955 plugins: { name: string; path: string }[];

956};

957```

958 

959### `SDKPartialAssistantMessage`

960 

961流式部分消息(仅当 `includePartialMessages` 为 true 时)。

962 

963```typescript theme={null}

964type SDKPartialAssistantMessage = {

965 type: "stream_event";

966 event: BetaRawMessageStreamEvent; // 来自 Anthropic SDK

967 parent_tool_use_id: string | null;

968 uuid: UUID;

969 session_id: string;

970};

971```

972 

973### `SDKCompactBoundaryMessage`

974 

975指示对话压缩边界的消息。

976 

977```typescript theme={null}

978type SDKCompactBoundaryMessage = {

979 type: "system";

980 subtype: "compact_boundary";

981 uuid: UUID;

982 session_id: string;

983 compact_metadata: {

984 trigger: "manual" | "auto";

985 pre_tokens: number;

986 };

987};

988```

989 

990### `SDKPluginInstallMessage`

991 

992插件安装进度事件。当设置 [`CLAUDE_CODE_SYNC_PLUGIN_INSTALL`](/zh-CN/env-vars) 时发出,以便您的 Agent SDK 应用程序可以在第一个轮次之前跟踪市场插件安装。`started` 和 `completed` 状态括起整体安装。`installed` 和 `failed` 状态报告单个市场并包括 `name`。

993 

994```typescript theme={null}

995type SDKPluginInstallMessage = {

996 type: "system";

997 subtype: "plugin_install";

998 status: "started" | "installed" | "failed" | "completed";

999 name?: string;

1000 error?: string;

1001 uuid: UUID;

1002 session_id: string;

1003};

1004```

1005 

1006### `SDKPermissionDenial`

1007 

1008有关被拒绝的工具使用的信息。

1009 

1010```typescript theme={null}

1011type SDKPermissionDenial = {

1012 tool_name: string;

1013 tool_use_id: string;

1014 tool_input: Record<string, unknown>;

1015};

1016```

1017 

1018### `SDKMessageOrigin`

1019 

1020用户角色消息的来源。这在 [`SDKUserMessage`](#sdkusermessage) 上显示为 `origin`,并转发到相应的 [`SDKResultMessage`](#sdkresultmessage),以便您可以判断给定轮次的触发因素。

1021 

1022```typescript theme={null}

1023type SDKMessageOrigin =

1024 | { kind: "human" }

1025 | { kind: "channel"; server: string }

1026 | { kind: "peer"; from: string; name?: string }

1027 | { kind: "task-notification" }

1028 | { kind: "coordinator" };

1029```

1030 

1031| `kind` | 含义 |

1032| ------------------- | ------------------------------------------------------------------------------- |

1033| `human` | 来自最终用户的直接输入。在用户消息上,缺少的 `origin` 也表示人工输入。 |

1034| `channel` | 消息到达[频道](/zh-CN/channels)。`server` 是源 MCP 服务器名称。 |

1035| `peer` | 来自另一个代理会话的消息,通过 `SendMessage`。`from` 是发送者地址;`name` 是发送者的显示名称(如果可用)。 |

1036| `task-notification` | 后台任务完成后注入的合成轮次。请参阅 [`SDKTaskNotificationMessage`](#sdktasknotificationmessage)。 |

1037| `coordinator` | 来自[代理团队](/zh-CN/agent-teams)中的团队协调员的消息。 |

1038 

1039## Hook 类型

1040 

1041有关使用 hooks 的综合指南,包括示例和常见模式,请参阅 [Hooks 指南](/zh-CN/agent-sdk/hooks)。

1042 

1043### `HookEvent`

1044 

1045可用的 hook 事件。

1046 

1047```typescript theme={null}

1048type HookEvent =

1049 | "PreToolUse"

1050 | "PostToolUse"

1051 | "PostToolUseFailure"

1052 | "PostToolBatch"

1053 | "Notification"

1054 | "UserPromptSubmit"

1055 | "SessionStart"

1056 | "SessionEnd"

1057 | "Stop"

1058 | "SubagentStart"

1059 | "SubagentStop"

1060 | "PreCompact"

1061 | "PermissionRequest"

1062 | "Setup"

1063 | "TeammateIdle"

1064 | "TaskCompleted"

1065 | "ConfigChange"

1066 | "WorktreeCreate"

1067 | "WorktreeRemove";

1068```

1069 

1070### `HookCallback`

1071 

1072Hook 回调函数类型。

1073 

1074```typescript theme={null}

1075type HookCallback = (

1076 input: HookInput, // 所有 hook 输入类型的联合

1077 toolUseID: string | undefined,

1078 options: { signal: AbortSignal }

1079) => Promise<HookJSONOutput>;

1080```

1081 

1082### `HookCallbackMatcher`

1083 

1084带有可选匹配器的 Hook 配置。

1085 

1086```typescript theme={null}

1087interface HookCallbackMatcher {

1088 matcher?: string;

1089 hooks: HookCallback[];

1090 timeout?: number; // 此匹配器中所有 hooks 的超时时间(秒)

1091}

1092```

1093 

1094### `HookInput`

1095 

1096所有 hook 输入类型的联合类型。

1097 

1098```typescript theme={null}

1099type HookInput =

1100 | PreToolUseHookInput

1101 | PostToolUseHookInput

1102 | PostToolUseFailureHookInput

1103 | PostToolBatchHookInput

1104 | NotificationHookInput

1105 | UserPromptSubmitHookInput

1106 | SessionStartHookInput

1107 | SessionEndHookInput

1108 | StopHookInput

1109 | SubagentStartHookInput

1110 | SubagentStopHookInput

1111 | PreCompactHookInput

1112 | PermissionRequestHookInput

1113 | SetupHookInput

1114 | TeammateIdleHookInput

1115 | TaskCompletedHookInput

1116 | ConfigChangeHookInput

1117 | WorktreeCreateHookInput

1118 | WorktreeRemoveHookInput;

1119```

1120 

1121### `BaseHookInput`

1122 

1123所有 hook 输入类型扩展的基本接口。

1124 

1125```typescript theme={null}

1126type BaseHookInput = {

1127 session_id: string;

1128 transcript_path: string;

1129 cwd: string;

1130 permission_mode?: string;

1131 agent_id?: string;

1132 agent_type?: string;

1133};

1134```

1135 

1136#### `PreToolUseHookInput`

1137 

1138```typescript theme={null}

1139type PreToolUseHookInput = BaseHookInput & {

1140 hook_event_name: "PreToolUse";

1141 tool_name: string;

1142 tool_input: unknown;

1143 tool_use_id: string;

1144};

1145```

1146 

1147#### `PostToolUseHookInput`

1148 

1149```typescript theme={null}

1150type PostToolUseHookInput = BaseHookInput & {

1151 hook_event_name: "PostToolUse";

1152 tool_name: string;

1153 tool_input: unknown;

1154 tool_response: unknown;

1155 tool_use_id: string;

1156 duration_ms?: number;

1157};

1158```

1159 

1160#### `PostToolUseFailureHookInput`

1161 

1162```typescript theme={null}

1163type PostToolUseFailureHookInput = BaseHookInput & {

1164 hook_event_name: "PostToolUseFailure";

1165 tool_name: string;

1166 tool_input: unknown;

1167 tool_use_id: string;

1168 error: string;

1169 is_interrupt?: boolean;

1170 duration_ms?: number;

1171};

1172```

1173 

1174#### `PostToolBatchHookInput`

1175 

1176在批处理中的每个工具调用都已解决后触发一次,在下一个模型请求之前。`tool_response` 携带序列化的 `tool_result` 内容,模型会看到该内容;其形状与 `PostToolUseHookInput` 的结构化 `Output` 对象不同。

1177 

1178```typescript theme={null}

1179type PostToolBatchHookInput = BaseHookInput & {

1180 hook_event_name: "PostToolBatch";

1181 tool_calls: PostToolBatchToolCall[];

1182};

1183 

1184type PostToolBatchToolCall = {

1185 tool_name: string;

1186 tool_input: unknown;

1187 tool_use_id: string;

1188 tool_response?: unknown;

1189};

1190```

1191 

1192#### `NotificationHookInput`

1193 

1194```typescript theme={null}

1195type NotificationHookInput = BaseHookInput & {

1196 hook_event_name: "Notification";

1197 message: string;

1198 title?: string;

1199 notification_type: string;

1200};

1201```

1202 

1203#### `UserPromptSubmitHookInput`

1204 

1205```typescript theme={null}

1206type UserPromptSubmitHookInput = BaseHookInput & {

1207 hook_event_name: "UserPromptSubmit";

1208 prompt: string;

1209};

1210```

1211 

1212#### `SessionStartHookInput`

1213 

1214```typescript theme={null}

1215type SessionStartHookInput = BaseHookInput & {

1216 hook_event_name: "SessionStart";

1217 source: "startup" | "resume" | "clear" | "compact";

1218 agent_type?: string;

1219 model?: string;

1220};

1221```

1222 

1223#### `SessionEndHookInput`

1224 

1225```typescript theme={null}

1226type SessionEndHookInput = BaseHookInput & {

1227 hook_event_name: "SessionEnd";

1228 reason: ExitReason; // EXIT_REASONS 数组中的字符串

1229};

1230```

1231 

1232#### `StopHookInput`

1233 

1234```typescript theme={null}

1235type StopHookInput = BaseHookInput & {

1236 hook_event_name: "Stop";

1237 stop_hook_active: boolean;

1238 last_assistant_message?: string;

1239};

1240```

1241 

1242#### `SubagentStartHookInput`

1243 

1244```typescript theme={null}

1245type SubagentStartHookInput = BaseHookInput & {

1246 hook_event_name: "SubagentStart";

1247 agent_id: string;

1248 agent_type: string;

1249};

1250```

1251 

1252#### `SubagentStopHookInput`

1253 

1254```typescript theme={null}

1255type SubagentStopHookInput = BaseHookInput & {

1256 hook_event_name: "SubagentStop";

1257 stop_hook_active: boolean;

1258 agent_id: string;

1259 agent_transcript_path: string;

1260 agent_type: string;

1261 last_assistant_message?: string;

1262};

1263```

1264 

1265#### `PreCompactHookInput`

1266 

1267```typescript theme={null}

1268type PreCompactHookInput = BaseHookInput & {

1269 hook_event_name: "PreCompact";

1270 trigger: "manual" | "auto";

1271 custom_instructions: string | null;

1272};

1273```

1274 

1275#### `PermissionRequestHookInput`

1276 

1277```typescript theme={null}

1278type PermissionRequestHookInput = BaseHookInput & {

1279 hook_event_name: "PermissionRequest";

1280 tool_name: string;

1281 tool_input: unknown;

1282 permission_suggestions?: PermissionUpdate[];

1283};

1284```

1285 

1286#### `SetupHookInput`

1287 

1288```typescript theme={null}

1289type SetupHookInput = BaseHookInput & {

1290 hook_event_name: "Setup";

1291 trigger: "init" | "maintenance";

1292};

1293```

1294 

1295#### `TeammateIdleHookInput`

1296 

1297```typescript theme={null}

1298type TeammateIdleHookInput = BaseHookInput & {

1299 hook_event_name: "TeammateIdle";

1300 teammate_name: string;

1301 team_name: string;

1302};

1303```

1304 

1305#### `TaskCompletedHookInput`

1306 

1307```typescript theme={null}

1308type TaskCompletedHookInput = BaseHookInput & {

1309 hook_event_name: "TaskCompleted";

1310 task_id: string;

1311 task_subject: string;

1312 task_description?: string;

1313 teammate_name?: string;

1314 team_name?: string;

1315};

1316```

1317 

1318#### `ConfigChangeHookInput`

1319 

1320```typescript theme={null}

1321type ConfigChangeHookInput = BaseHookInput & {

1322 hook_event_name: "ConfigChange";

1323 source:

1324 | "user_settings"

1325 | "project_settings"

1326 | "local_settings"

1327 | "policy_settings"

1328 | "skills";

1329 file_path?: string;

1330};

1331```

1332 

1333#### `WorktreeCreateHookInput`

1334 

1335```typescript theme={null}

1336type WorktreeCreateHookInput = BaseHookInput & {

1337 hook_event_name: "WorktreeCreate";

1338 name: string;

1339};

1340```

1341 

1342#### `WorktreeRemoveHookInput`

1343 

1344```typescript theme={null}

1345type WorktreeRemoveHookInput = BaseHookInput & {

1346 hook_event_name: "WorktreeRemove";

1347 worktree_path: string;

1348};

1349```

1350 

1351### `HookJSONOutput`

1352 

1353Hook 返回值。

1354 

1355```typescript theme={null}

1356type HookJSONOutput = AsyncHookJSONOutput | SyncHookJSONOutput;

1357```

1358 

1359#### `AsyncHookJSONOutput`

1360 

1361```typescript theme={null}

1362type AsyncHookJSONOutput = {

1363 async: true;

1364 asyncTimeout?: number;

1365};

1366```

1367 

1368#### `SyncHookJSONOutput`

1369 

1370```typescript theme={null}

1371type SyncHookJSONOutput = {

1372 continue?: boolean;

1373 suppressOutput?: boolean;

1374 stopReason?: string;

1375 decision?: "approve" | "block";

1376 systemMessage?: string;

1377 reason?: string;

1378 hookSpecificOutput?:

1379 | {

1380 hookEventName: "PreToolUse";

1381 permissionDecision?: "allow" | "deny" | "ask" | "defer";

1382 permissionDecisionReason?: string;

1383 updatedInput?: Record<string, unknown>;

1384 additionalContext?: string;

1385 }

1386 | {

1387 hookEventName: "UserPromptSubmit";

1388 additionalContext?: string;

1389 }

1390 | {

1391 hookEventName: "SessionStart";

1392 additionalContext?: string;

1393 }

1394 | {

1395 hookEventName: "Setup";

1396 additionalContext?: string;

1397 }

1398 | {

1399 hookEventName: "SubagentStart";

1400 additionalContext?: string;

1401 }

1402 | {

1403 hookEventName: "PostToolUse";

1404 additionalContext?: string;

1405 updatedToolOutput?: unknown;

1406 /** @deprecated 使用 `updatedToolOutput`,它适用于所有工具。 */

1407 updatedMCPToolOutput?: unknown;

1408 }

1409 | {

1410 hookEventName: "PostToolUseFailure";

1411 additionalContext?: string;

1412 }

1413 | {

1414 hookEventName: "PostToolBatch";

1415 additionalContext?: string;

1416 }

1417 | {

1418 hookEventName: "Notification";

1419 additionalContext?: string;

1420 }

1421 | {

1422 hookEventName: "PermissionRequest";

1423 decision:

1424 | {

1425 behavior: "allow";

1426 updatedInput?: Record<string, unknown>;

1427 updatedPermissions?: PermissionUpdate[];

1428 }

1429 | {

1430 behavior: "deny";

1431 message?: string;

1432 interrupt?: boolean;

1433 };

1434 };

1435};

1436```

1437 

1438## 工具输入类型

1439 

1440所有内置 Claude Code 工具的输入架构文档。这些类型从 `@anthropic-ai/claude-agent-sdk` 导出,可用于类型安全的工具交互。

1441 

1442### `ToolInputSchemas`

1443 

1444所有工具输入类型的联合,从 `@anthropic-ai/claude-agent-sdk` 导出。

1445 

1446```typescript theme={null}

1447type ToolInputSchemas =

1448 | AgentInput

1449 | AskUserQuestionInput

1450 | BashInput

1451 | TaskOutputInput

1452 | EnterWorktreeInput

1453 | ExitPlanModeInput

1454 | FileEditInput

1455 | FileReadInput

1456 | FileWriteInput

1457 | GlobInput

1458 | GrepInput

1459 | ListMcpResourcesInput

1460 | McpInput

1461 | MonitorInput

1462 | NotebookEditInput

1463 | ReadMcpResourceInput

1464 | SubscribeMcpResourceInput

1465 | SubscribePollingInput

1466 | TaskStopInput

1467 | TodoWriteInput

1468 | UnsubscribeMcpResourceInput

1469 | UnsubscribePollingInput

1470 | WebFetchInput

1471 | WebSearchInput;

1472```

1473 

1474### Agent

1475 

1476**工具名称:** `Agent`(之前为 `Task`,仍然接受作为别名)

1477 

1478```typescript theme={null}

1479type AgentInput = {

1480 description: string;

1481 prompt: string;

1482 subagent_type: string;

1483 model?: "sonnet" | "opus" | "haiku";

1484 resume?: string;

1485 run_in_background?: boolean;

1486 max_turns?: number;

1487 name?: string;

1488 team_name?: string;

1489 mode?: "acceptEdits" | "bypassPermissions" | "default" | "dontAsk" | "plan";

1490 isolation?: "worktree";

1491};

1492```

1493 

1494启动新代理以自主处理复杂的多步骤任务。

1495 

1496### AskUserQuestion

1497 

1498**工具名称:** `AskUserQuestion`

1499 

1500```typescript theme={null}

1501type AskUserQuestionInput = {

1502 questions: Array<{

1503 question: string;

1504 header: string;

1505 options: Array<{ label: string; description: string; preview?: string }>;

1506 multiSelect: boolean;

1507 }>;

1508};

1509```

1510 

1511在执行期间向用户提出澄清问题。请参阅[处理批准和用户输入](/zh-CN/agent-sdk/user-input#handle-clarifying-questions)了解使用详情。

1512 

1513### Bash

1514 

1515**工具名称:** `Bash`

1516 

1517```typescript theme={null}

1518type BashInput = {

1519 command: string;

1520 timeout?: number;

1521 description?: string;

1522 run_in_background?: boolean;

1523 dangerouslyDisableSandbox?: boolean;

1524};

1525```

1526 

1527在持久 shell 会话中执行 bash 命令,支持可选超时和后台执行。

1528 

1529### Monitor

1530 

1531**工具名称:** `Monitor`

1532 

1533```typescript theme={null}

1534type MonitorInput = {

1535 command: string;

1536 description: string;

1537 timeout_ms?: number;

1538 persistent?: boolean;

1539};

1540```

1541 

1542运行后台脚本并将每个 stdout 行作为事件传递给 Claude,以便它可以做出反应而无需轮询。为会话长度的监视(如日志尾部)设置 `persistent: true`。Monitor 遵循与 Bash 相同的权限规则。请参阅 [Monitor 工具参考](/zh-CN/tools-reference#monitor-tool)了解行为和提供商可用性。

1543 

1544### TaskOutput

1545 

1546**工具名称:** `TaskOutput`

1547 

1548```typescript theme={null}

1549type TaskOutputInput = {

1550 task_id: string;

1551 block: boolean;

1552 timeout: number;

1553};

1554```

1555 

1556从运行中或已完成的后台任务检索输出。

1557 

1558### Edit

1559 

1560**工具名称:** `Edit`

1561 

1562```typescript theme={null}

1563type FileEditInput = {

1564 file_path: string;

1565 old_string: string;

1566 new_string: string;

1567 replace_all?: boolean;

1568};

1569```

1570 

1571在文件中执行精确字符串替换。

1572 

1573### Read

1574 

1575**工具名称:** `Read`

1576 

1577```typescript theme={null}

1578type FileReadInput = {

1579 file_path: string;

1580 offset?: number;

1581 limit?: number;

1582 pages?: string;

1583};

1584```

1585 

1586从本地文件系统读取文件,包括文本、图像、PDF 和 Jupyter 笔记本。对 PDF 页面范围使用 `pages`(例如,`"1-5"`)。

1587 

1588### Write

1589 

1590**工具名称:** `Write`

1591 

1592```typescript theme={null}

1593type FileWriteInput = {

1594 file_path: string;

1595 content: string;

1596};

1597```

1598 

1599将文件写入本地文件系统,如果存在则覆盖。

1600 

1601### Glob

1602 

1603**工具名称:** `Glob`

1604 

1605```typescript theme={null}

1606type GlobInput = {

1607 pattern: string;

1608 path?: string;

1609};

1610```

1611 

1612快速文件模式匹配,适用于任何代码库大小。

1613 

1614### Grep

1615 

1616**工具名称:** `Grep`

1617 

1618```typescript theme={null}

1619type GrepInput = {

1620 pattern: string;

1621 path?: string;

1622 glob?: string;

1623 type?: string;

1624 output_mode?: "content" | "files_with_matches" | "count";

1625 "-i"?: boolean;

1626 "-n"?: boolean;

1627 "-B"?: number;

1628 "-A"?: number;

1629 "-C"?: number;

1630 context?: number;

1631 head_limit?: number;

1632 offset?: number;

1633 multiline?: boolean;

1634};

1635```

1636 

1637基于 ripgrep 的强大搜索工具,支持正则表达式。

1638 

1639### TaskStop

1640 

1641**工具名称:** `TaskStop`

1642 

1643```typescript theme={null}

1644type TaskStopInput = {

1645 task_id?: string;

1646 shell_id?: string; // 已弃用:使用 task_id

1647};

1648```

1649 

1650按 ID 停止运行的后台任务或 shell。

1651 

1652### NotebookEdit

1653 

1654**工具名称:** `NotebookEdit`

1655 

1656```typescript theme={null}

1657type NotebookEditInput = {

1658 notebook_path: string;

1659 cell_id?: string;

1660 new_source: string;

1661 cell_type?: "code" | "markdown";

1662 edit_mode?: "replace" | "insert" | "delete";

1663};

1664```

1665 

1666编辑 Jupyter 笔记本文件中的单元格。

1667 

1668### WebFetch

1669 

1670**工具名称:** `WebFetch`

1671 

1672```typescript theme={null}

1673type WebFetchInput = {

1674 url: string;

1675 prompt: string;

1676};

1677```

1678 

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

1680 

1681### WebSearch

1682 

1683**工具名称:** `WebSearch`

1684 

1685```typescript theme={null}

1686type WebSearchInput = {

1687 query: string;

1688 allowed_domains?: string[];

1689 blocked_domains?: string[];

1690};

1691```

1692 

1693搜索网络并返回格式化的结果。

1694 

1695### TodoWrite

1696 

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

1698 

1699```typescript theme={null}

1700type TodoWriteInput = {

1701 todos: Array<{

1702 content: string;

1703 status: "pending" | "in_progress" | "completed";

1704 activeForm: string;

1705 }>;

1706};

1707```

1708 

1709创建和管理结构化任务列表以跟踪进度。

1710 

1711### ExitPlanMode

1712 

1713**工具名称:** `ExitPlanMode`

1714 

1715```typescript theme={null}

1716type ExitPlanModeInput = {

1717 allowedPrompts?: Array<{

1718 tool: "Bash";

1719 prompt: string;

1720 }>;

1721};

1722```

1723 

1724退出规划模式。可选地指定实现计划所需的基于提示的权限。

1725 

1726### ListMcpResources

1727 

1728**工具名称:** `ListMcpResources`

1729 

1730```typescript theme={null}

1731type ListMcpResourcesInput = {

1732 server?: string;

1733};

1734```

1735 

1736列出来自连接服务器的可用 MCP 资源。

1737 

1738### ReadMcpResource

1739 

1740**工具名称:** `ReadMcpResource`

1741 

1742```typescript theme={null}

1743type ReadMcpResourceInput = {

1744 server: string;

1745 uri: string;

1746};

1747```

1748 

1749从服务器读取特定的 MCP 资源。

1750 

1751### EnterWorktree

1752 

1753**工具名称:** `EnterWorktree`

1754 

1755```typescript theme={null}

1756type EnterWorktreeInput = {

1757 name?: string;

1758 path?: string;

1759};

1760```

1761 

1762创建并进入临时 git worktree 以进行隔离工作。传递 `path` 以切换到当前存储库的现有 worktree 而不是创建新的。`name` 和 `path` 互斥。

1763 

1764## 工具输出类型

1765 

1766所有内置 Claude Code 工具的输出架构文档。这些类型从 `@anthropic-ai/claude-agent-sdk` 导出,代表每个工具返回的实际响应数据。

1767 

1768### `ToolOutputSchemas`

1769 

1770所有工具输出类型的联合。

1771 

1772```typescript theme={null}

1773type ToolOutputSchemas =

1774 | AgentOutput

1775 | AskUserQuestionOutput

1776 | BashOutput

1777 | EnterWorktreeOutput

1778 | ExitPlanModeOutput

1779 | FileEditOutput

1780 | FileReadOutput

1781 | FileWriteOutput

1782 | GlobOutput

1783 | GrepOutput

1784 | ListMcpResourcesOutput

1785 | MonitorOutput

1786 | NotebookEditOutput

1787 | ReadMcpResourceOutput

1788 | TaskStopOutput

1789 | TodoWriteOutput

1790 | WebFetchOutput

1791 | WebSearchOutput;

1792```

1793 

1794### Agent

1795 

1796**工具名称:** `Agent`(之前为 `Task`,仍然接受作为别名)

1797 

1798```typescript theme={null}

1799type AgentOutput =

1800 | {

1801 status: "completed";

1802 agentId: string;

1803 content: Array<{ type: "text"; text: string }>;

1804 totalToolUseCount: number;

1805 totalDurationMs: number;

1806 totalTokens: number;

1807 usage: {

1808 input_tokens: number;

1809 output_tokens: number;

1810 cache_creation_input_tokens: number | null;

1811 cache_read_input_tokens: number | null;

1812 server_tool_use: {

1813 web_search_requests: number;

1814 web_fetch_requests: number;

1815 } | null;

1816 service_tier: ("standard" | "priority" | "batch") | null;

1817 cache_creation: {

1818 ephemeral_1h_input_tokens: number;

1819 ephemeral_5m_input_tokens: number;

1820 } | null;

1821 };

1822 prompt: string;

1823 }

1824 | {

1825 status: "async_launched";

1826 agentId: string;

1827 description: string;

1828 prompt: string;

1829 outputFile: string;

1830 canReadOutputFile?: boolean;

1831 }

1832 | {

1833 status: "sub_agent_entered";

1834 description: string;

1835 message: string;

1836 };

1837```

1838 

1839返回来自子代理的结果。在 `status` 字段上进行区分:`"completed"` 表示已完成的任务,`"async_launched"` 表示后台任务,`"sub_agent_entered"` 表示交互式子代理。

1840 

1841### AskUserQuestion

1842 

1843**工具名称:** `AskUserQuestion`

1844 

1845```typescript theme={null}

1846type AskUserQuestionOutput = {

1847 questions: Array<{

1848 question: string;

1849 header: string;

1850 options: Array<{ label: string; description: string; preview?: string }>;

1851 multiSelect: boolean;

1852 }>;

1853 answers: Record<string, string>;

1854};

1855```

1856 

1857返回提出的问题和用户的答案。

1858 

1859### Bash

1860 

1861**工具名称:** `Bash`

1862 

1863```typescript theme={null}

1864type BashOutput = {

1865 stdout: string;

1866 stderr: string;

1867 rawOutputPath?: string;

1868 interrupted: boolean;

1869 isImage?: boolean;

1870 backgroundTaskId?: string;

1871 backgroundedByUser?: boolean;

1872 dangerouslyDisableSandbox?: boolean;

1873 returnCodeInterpretation?: string;

1874 structuredContent?: unknown[];

1875 persistedOutputPath?: string;

1876 persistedOutputSize?: number;

1877};

1878```

1879 

1880返回命令输出,stdout/stderr 分开。后台命令包括 `backgroundTaskId`。

1881 

1882### Monitor

1883 

1884**工具名称:** `Monitor`

1885 

1886```typescript theme={null}

1887type MonitorOutput = {

1888 taskId: string;

1889 timeoutMs: number;

1890 persistent?: boolean;

1891};

1892```

1893 

1894返回运行监视器的后台任务 ID。使用此 ID 与 `TaskStop` 一起提前取消监视。

1895 

1896### Edit

1897 

1898**工具名称:** `Edit`

1899 

1900```typescript theme={null}

1901type FileEditOutput = {

1902 filePath: string;

1903 oldString: string;

1904 newString: string;

1905 originalFile: string;

1906 structuredPatch: Array<{

1907 oldStart: number;

1908 oldLines: number;

1909 newStart: number;

1910 newLines: number;

1911 lines: string[];

1912 }>;

1913 userModified: boolean;

1914 replaceAll: boolean;

1915 gitDiff?: {

1916 filename: string;

1917 status: "modified" | "added";

1918 additions: number;

1919 deletions: number;

1920 changes: number;

1921 patch: string;

1922 };

1923};

1924```

1925 

1926返回编辑操作的结构化差异。

1927 

1928### Read

1929 

1930**工具名称:** `Read`

1931 

1932```typescript theme={null}

1933type FileReadOutput =

1934 | {

1935 type: "text";

1936 file: {

1937 filePath: string;

1938 content: string;

1939 numLines: number;

1940 startLine: number;

1941 totalLines: number;

1942 };

1943 }

1944 | {

1945 type: "image";

1946 file: {

1947 base64: string;

1948 type: "image/jpeg" | "image/png" | "image/gif" | "image/webp";

1949 originalSize: number;

1950 dimensions?: {

1951 originalWidth?: number;

1952 originalHeight?: number;

1953 displayWidth?: number;

1954 displayHeight?: number;

1955 };

1956 };

1957 }

1958 | {

1959 type: "notebook";

1960 file: {

1961 filePath: string;

1962 cells: unknown[];

1963 };

1964 }

1965 | {

1966 type: "pdf";

1967 file: {

1968 filePath: string;

1969 base64: string;

1970 originalSize: number;

1971 };

1972 }

1973 | {

1974 type: "parts";

1975 file: {

1976 filePath: string;

1977 originalSize: number;

1978 count: number;

1979 outputDir: string;

1980 };

1981 };

1982```

1983 

1984返回适合文件类型的格式的文件内容。在 `type` 字段上进行区分。

1985 

1986### Write

1987 

1988**工具名称:** `Write`

1989 

1990```typescript theme={null}

1991type FileWriteOutput = {

1992 type: "create" | "update";

1993 filePath: string;

1994 content: string;

1995 structuredPatch: Array<{

1996 oldStart: number;

1997 oldLines: number;

1998 newStart: number;

1999 newLines: number;

2000 lines: string[];

2001 }>;

2002 originalFile: string | null;

2003 gitDiff?: {

2004 filename: string;

2005 status: "modified" | "added";

2006 additions: number;

2007 deletions: number;

2008 changes: number;

2009 patch: string;

2010 };

2011};

2012```

2013 

2014返回写入结果,包含结构化差异信息。

2015 

2016### Glob

2017 

2018**工具名称:** `Glob`

2019 

2020```typescript theme={null}

2021type GlobOutput = {

2022 durationMs: number;

2023 numFiles: number;

2024 filenames: string[];

2025 truncated: boolean;

2026};

2027```

2028 

2029返回与 glob 模式匹配的文件路径,按修改时间排序。

2030 

2031### Grep

2032 

2033**工具名称:** `Grep`

2034 

2035```typescript theme={null}

2036type GrepOutput = {

2037 mode?: "content" | "files_with_matches" | "count";

2038 numFiles: number;

2039 filenames: string[];

2040 content?: string;

2041 numLines?: number;

2042 numMatches?: number;

2043 appliedLimit?: number;

2044 appliedOffset?: number;

2045};

2046```

2047 

2048返回搜索结果。形状因 `mode` 而异:文件列表、带匹配的内容或匹配计数。

2049 

2050### TaskStop

2051 

2052**工具名称:** `TaskStop`

2053 

2054```typescript theme={null}

2055type TaskStopOutput = {

2056 message: string;

2057 task_id: string;

2058 task_type: string;

2059 command?: string;

2060};

2061```

2062 

2063停止后台任务后返回确认。

2064 

2065### NotebookEdit

2066 

2067**工具名称:** `NotebookEdit`

2068 

2069```typescript theme={null}

2070type NotebookEditOutput = {

2071 new_source: string;

2072 cell_id?: string;

2073 cell_type: "code" | "markdown";

2074 language: string;

2075 edit_mode: string;

2076 error?: string;

2077 notebook_path: string;

2078 original_file: string;

2079 updated_file: string;

2080};

2081```

2082 

2083返回笔记本编辑的结果,包含原始和更新的文件内容。

2084 

2085### WebFetch

2086 

2087**工具名称:** `WebFetch`

2088 

2089```typescript theme={null}

2090type WebFetchOutput = {

2091 bytes: number;

2092 code: number;

2093 codeText: string;

2094 result: string;

2095 durationMs: number;

2096 url: string;

2097};

2098```

2099 

2100返回获取的内容,包含 HTTP 状态和元数据。

2101 

2102### WebSearch

2103 

2104**工具名称:** `WebSearch`

2105 

2106```typescript theme={null}

2107type WebSearchOutput = {

2108 query: string;

2109 results: Array<

2110 | {

2111 tool_use_id: string;

2112 content: Array<{ title: string; url: string }>;

2113 }

2114 | string

2115 >;

2116 durationSeconds: number;

2117};

2118```

2119 

2120返回来自网络的搜索结果。

2121 

2122### TodoWrite

2123 

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

2125 

2126```typescript theme={null}

2127type TodoWriteOutput = {

2128 oldTodos: Array<{

2129 content: string;

2130 status: "pending" | "in_progress" | "completed";

2131 activeForm: string;

2132 }>;

2133 newTodos: Array<{

2134 content: string;

2135 status: "pending" | "in_progress" | "completed";

2136 activeForm: string;

2137 }>;

2138};

2139```

2140 

2141返回之前和更新的任务列表。

2142 

2143### ExitPlanMode

2144 

2145**工具名称:** `ExitPlanMode`

2146 

2147```typescript theme={null}

2148type ExitPlanModeOutput = {

2149 plan: string | null;

2150 isAgent: boolean;

2151 filePath?: string;

2152 hasTaskTool?: boolean;

2153 awaitingLeaderApproval?: boolean;

2154 requestId?: string;

2155};

2156```

2157 

2158返回退出规划模式后的计划状态。

2159 

2160### ListMcpResources

2161 

2162**工具名称:** `ListMcpResources`

2163 

2164```typescript theme={null}

2165type ListMcpResourcesOutput = Array<{

2166 uri: string;

2167 name: string;

2168 mimeType?: string;

2169 description?: string;

2170 server: string;

2171}>;

2172```

2173 

2174返回可用 MCP 资源的数组。

2175 

2176### ReadMcpResource

2177 

2178**工具名称:** `ReadMcpResource`

2179 

2180```typescript theme={null}

2181type ReadMcpResourceOutput = {

2182 contents: Array<{

2183 uri: string;

2184 mimeType?: string;

2185 text?: string;

2186 }>;

2187};

2188```

2189 

2190返回请求的 MCP 资源的内容。

2191 

2192### EnterWorktree

2193 

2194**工具名称:** `EnterWorktree`

2195 

2196```typescript theme={null}

2197type EnterWorktreeOutput = {

2198 worktreePath: string;

2199 worktreeBranch?: string;

2200 message: string;

2201};

2202```

2203 

2204返回有关 git worktree 的信息。

2205 

2206## 权限类型

2207 

2208### `PermissionUpdate`

2209 

2210用于更新权限的操作。

2211 

2212```typescript theme={null}

2213type PermissionUpdate =

2214 | {

2215 type: "addRules";

2216 rules: PermissionRuleValue[];

2217 behavior: PermissionBehavior;

2218 destination: PermissionUpdateDestination;

2219 }

2220 | {

2221 type: "replaceRules";

2222 rules: PermissionRuleValue[];

2223 behavior: PermissionBehavior;

2224 destination: PermissionUpdateDestination;

2225 }

2226 | {

2227 type: "removeRules";

2228 rules: PermissionRuleValue[];

2229 behavior: PermissionBehavior;

2230 destination: PermissionUpdateDestination;

2231 }

2232 | {

2233 type: "setMode";

2234 mode: PermissionMode;

2235 destination: PermissionUpdateDestination;

2236 }

2237 | {

2238 type: "addDirectories";

2239 directories: string[];

2240 destination: PermissionUpdateDestination;

2241 }

2242 | {

2243 type: "removeDirectories";

2244 directories: string[];

2245 destination: PermissionUpdateDestination;

2246 };

2247```

2248 

2249### `PermissionBehavior`

2250 

2251```typescript theme={null}

2252type PermissionBehavior = "allow" | "deny" | "ask";

2253```

2254 

2255### `PermissionUpdateDestination`

2256 

2257```typescript theme={null}

2258type PermissionUpdateDestination =

2259 | "userSettings" // 全局用户设置

2260 | "projectSettings" // 每个目录的项目设置

2261 | "localSettings" // Gitignored 本地设置

2262 | "session" // 仅当前会话

2263 | "cliArg"; // CLI 参数

2264```

2265 

2266### `PermissionRuleValue`

2267 

2268```typescript theme={null}

2269type PermissionRuleValue = {

2270 toolName: string;

2271 ruleContent?: string;

2272};

2273```

2274 

2275## 其他类型

2276 

2277### `ApiKeySource`

2278 

2279```typescript theme={null}

2280type ApiKeySource = "user" | "project" | "org" | "temporary" | "oauth";

2281```

2282 

2283### `SdkBeta`

2284 

2285可通过 `betas` 选项启用的可用测试功能。请参阅 [Beta 标头](https://platform.claude.com/docs/zh-CN/api/beta-headers)了解更多信息。

2286 

2287```typescript theme={null}

2288type SdkBeta = "context-1m-2025-08-07";

2289```

2290 

2291<Warning>

2292 `context-1m-2025-08-07` beta 自 2026 年 4 月 30 日起已停用。使用 Claude Sonnet 4.5 或 Sonnet 4 传递此值无效,超过标准 200k 令牌上下文窗口的请求返回错误。要使用 1M 令牌上下文窗口,请迁移到 [Claude Sonnet 4.6、Claude Opus 4.6 或 Claude Opus 4.7](https://platform.claude.com/docs/zh-CN/about-claude/models/overview),它们以标准定价包括 1M 上下文,无需 beta 标头。

2293</Warning>

2294 

2295### `SlashCommand`

2296 

2297有关可用 slash command 的信息。

2298 

2299```typescript theme={null}

2300type SlashCommand = {

2301 name: string;

2302 description: string;

2303 argumentHint: string;

2304 aliases?: string[];

2305};

2306```

2307 

2308### `ModelInfo`

2309 

2310有关可用模型的信息。

2311 

2312```typescript theme={null}

2313type ModelInfo = {

2314 value: string;

2315 displayName: string;

2316 description: string;

2317 supportsEffort?: boolean;

2318 supportedEffortLevels?: ("low" | "medium" | "high" | "xhigh" | "max")[];

2319 supportsAdaptiveThinking?: boolean;

2320 supportsFastMode?: boolean;

2321};

2322```

2323 

2324### `AgentInfo`

2325 

2326有关可通过 Agent 工具调用的可用子代理的信息。

2327 

2328```typescript theme={null}

2329type AgentInfo = {

2330 name: string;

2331 description: string;

2332 model?: string;

2333};

2334```

2335 

2336| 字段 | 类型 | 描述 |

2337| :------------ | :-------------------- | :------------------------------------------ |

2338| `name` | `string` | 代理类型标识符(例如,`"Explore"`、`"general-purpose"`) |

2339| `description` | `string` | 何时使用此代理的描述 |

2340| `model` | `string \| undefined` | 此代理使用的模型别名。如果省略,继承父级的模型 |

2341 

2342### `McpServerStatus`

2343 

2344连接的 MCP 服务器的状态。

2345 

2346```typescript theme={null}

2347type McpServerStatus = {

2348 name: string;

2349 status: "connected" | "failed" | "needs-auth" | "pending" | "disabled";

2350 serverInfo?: {

2351 name: string;

2352 version: string;

2353 };

2354 error?: string;

2355 config?: McpServerStatusConfig;

2356 scope?: string;

2357 tools?: {

2358 name: string;

2359 description?: string;

2360 annotations?: {

2361 readOnly?: boolean;

2362 destructive?: boolean;

2363 openWorld?: boolean;

2364 };

2365 }[];

2366};

2367```

2368 

2369### `McpServerStatusConfig`

2370 

2371由 `mcpServerStatus()` 报告的 MCP 服务器的配置。这是所有 MCP 服务器传输类型的联合。

2372 

2373```typescript theme={null}

2374type McpServerStatusConfig =

2375 | McpStdioServerConfig

2376 | McpSSEServerConfig

2377 | McpHttpServerConfig

2378 | McpSdkServerConfig

2379 | McpClaudeAIProxyServerConfig;

2380```

2381 

2382请参阅 [`McpServerConfig`](#mcp-server-config)了解每种传输类型的详情。

2383 

2384### `AccountInfo`

2385 

2386经过身份验证的用户的帐户信息。

2387 

2388```typescript theme={null}

2389type AccountInfo = {

2390 email?: string;

2391 organization?: string;

2392 subscriptionType?: string;

2393 tokenSource?: string;

2394 apiKeySource?: string;

2395};

2396```

2397 

2398### `ModelUsage`

2399 

2400结果消息中返回的每个模型使用统计。`costUSD` 值是客户端估计。请参阅[跟踪成本和使用情况](/zh-CN/agent-sdk/cost-tracking)了解计费注意事项。

2401 

2402```typescript theme={null}

2403type ModelUsage = {

2404 inputTokens: number;

2405 outputTokens: number;

2406 cacheReadInputTokens: number;

2407 cacheCreationInputTokens: number;

2408 webSearchRequests: number;

2409 costUSD: number;

2410 contextWindow: number;

2411 maxOutputTokens: number;

2412};

2413```

2414 

2415### `ConfigScope`

2416 

2417```typescript theme={null}

2418type ConfigScope = "local" | "user" | "project";

2419```

2420 

2421### `NonNullableUsage`

2422 

2423[`Usage`](#usage) 的版本,所有可空字段都变为非可空。

2424 

2425```typescript theme={null}

2426type NonNullableUsage = {

2427 [K in keyof Usage]: NonNullable<Usage[K]>;

2428};

2429```

2430 

2431### `Usage`

2432 

2433令牌使用统计(来自 `@anthropic-ai/sdk`)。

2434 

2435```typescript theme={null}

2436type Usage = {

2437 input_tokens: number | null;

2438 output_tokens: number | null;

2439 cache_creation_input_tokens?: number | null;

2440 cache_read_input_tokens?: number | null;

2441};

2442```

2443 

2444### `CallToolResult`

2445 

2446MCP 工具结果类型(来自 `@modelcontextprotocol/sdk/types.js`)。

2447 

2448```typescript theme={null}

2449type CallToolResult = {

2450 content: Array<{

2451 type: "text" | "image" | "resource";

2452 // 其他字段因类型而异

2453 }>;

2454 isError?: boolean;

2455};

2456```

2457 

2458### `ThinkingConfig`

2459 

2460控制 Claude 的思考/推理行为。优先于已弃用的 `maxThinkingTokens`。

2461 

2462```typescript theme={null}

2463type ThinkingConfig =

2464 | { type: "adaptive" } // 模型确定何时以及多少推理(Opus 4.6+)

2465 | { type: "enabled"; budgetTokens?: number } // 固定思考令牌预算

2466 | { type: "disabled" }; // 无扩展思考

2467```

2468 

2469### `SpawnedProcess`

2470 

2471自定义进程生成的接口(与 `spawnClaudeCodeProcess` 选项一起使用)。`ChildProcess` 已满足此接口。

2472 

2473```typescript theme={null}

2474interface SpawnedProcess {

2475 stdin: Writable;

2476 stdout: Readable;

2477 readonly killed: boolean;

2478 readonly exitCode: number | null;

2479 kill(signal: NodeJS.Signals): boolean;

2480 on(

2481 event: "exit",

2482 listener: (code: number | null, signal: NodeJS.Signals | null) => void

2483 ): void;

2484 on(event: "error", listener: (error: Error) => void): void;

2485 once(

2486 event: "exit",

2487 listener: (code: number | null, signal: NodeJS.Signals | null) => void

2488 ): void;

2489 once(event: "error", listener: (error: Error) => void): void;

2490 off(

2491 event: "exit",

2492 listener: (code: number | null, signal: NodeJS.Signals | null) => void

2493 ): void;

2494 off(event: "error", listener: (error: Error) => void): void;

2495}

2496```

2497 

2498### `SpawnOptions`

2499 

2500传递给自定义生成函数的选项。

2501 

2502```typescript theme={null}

2503interface SpawnOptions {

2504 command: string;

2505 args: string[];

2506 cwd?: string;

2507 env: Record<string, string | undefined>;

2508 signal: AbortSignal;

2509}

2510```

2511 

2512### `McpSetServersResult`

2513 

2514`setMcpServers()` 操作的结果。

2515 

2516```typescript theme={null}

2517type McpSetServersResult = {

2518 added: string[];

2519 removed: string[];

2520 errors: Record<string, string>;

2521};

2522```

2523 

2524### `RewindFilesResult`

2525 

2526`rewindFiles()` 操作的结果。

2527 

2528```typescript theme={null}

2529type RewindFilesResult = {

2530 canRewind: boolean;

2531 error?: string;

2532 filesChanged?: string[];

2533 insertions?: number;

2534 deletions?: number;

2535};

2536```

2537 

2538### `SDKStatusMessage`

2539 

2540状态更新消息(例如,压缩)。

2541 

2542```typescript theme={null}

2543type SDKStatusMessage = {

2544 type: "system";

2545 subtype: "status";

2546 status: "compacting" | null;

2547 permissionMode?: PermissionMode;

2548 uuid: UUID;

2549 session_id: string;

2550};

2551```

2552 

2553### `SDKTaskNotificationMessage`

2554 

2555后台任务完成、失败或停止时的通知。后台任务包括 `run_in_background` Bash 命令、[Monitor](#monitor) 监视和后台子代理。

2556 

2557```typescript theme={null}

2558type SDKTaskNotificationMessage = {

2559 type: "system";

2560 subtype: "task_notification";

2561 task_id: string;

2562 tool_use_id?: string;

2563 status: "completed" | "failed" | "stopped";

2564 output_file: string;

2565 summary: string;

2566 usage?: {

2567 total_tokens: number;

2568 tool_uses: number;

2569 duration_ms: number;

2570 };

2571 uuid: UUID;

2572 session_id: string;

2573};

2574```

2575 

2576### `SDKToolUseSummaryMessage`

2577 

2578对话中工具使用的摘要。

2579 

2580```typescript theme={null}

2581type SDKToolUseSummaryMessage = {

2582 type: "tool_use_summary";

2583 summary: string;

2584 preceding_tool_use_ids: string[];

2585 uuid: UUID;

2586 session_id: string;

2587};

2588```

2589 

2590### `SDKHookStartedMessage`

2591 

2592当 hook 开始执行时发出。

2593 

2594```typescript theme={null}

2595type SDKHookStartedMessage = {

2596 type: "system";

2597 subtype: "hook_started";

2598 hook_id: string;

2599 hook_name: string;

2600 hook_event: string;

2601 uuid: UUID;

2602 session_id: string;

2603};

2604```

2605 

2606### `SDKHookProgressMessage`

2607 

2608在 hook 运行时发出,包含 stdout/stderr 输出。

2609 

2610```typescript theme={null}

2611type SDKHookProgressMessage = {

2612 type: "system";

2613 subtype: "hook_progress";

2614 hook_id: string;

2615 hook_name: string;

2616 hook_event: string;

2617 stdout: string;

2618 stderr: string;

2619 output: string;

2620 uuid: UUID;

2621 session_id: string;

2622};

2623```

2624 

2625### `SDKHookResponseMessage`

2626 

2627当 hook 完成执行时发出。

2628 

2629```typescript theme={null}

2630type SDKHookResponseMessage = {

2631 type: "system";

2632 subtype: "hook_response";

2633 hook_id: string;

2634 hook_name: string;

2635 hook_event: string;

2636 output: string;

2637 stdout: string;

2638 stderr: string;

2639 exit_code?: number;

2640 outcome: "success" | "error" | "cancelled";

2641 uuid: UUID;

2642 session_id: string;

2643};

2644```

2645 

2646### `SDKToolProgressMessage`

2647 

2648在工具执行时定期发出,以指示进度。

2649 

2650```typescript theme={null}

2651type SDKToolProgressMessage = {

2652 type: "tool_progress";

2653 tool_use_id: string;

2654 tool_name: string;

2655 parent_tool_use_id: string | null;

2656 elapsed_time_seconds: number;

2657 task_id?: string;

2658 uuid: UUID;

2659 session_id: string;

2660};

2661```

2662 

2663### `SDKAuthStatusMessage`

2664 

2665在身份验证流程中发出。

2666 

2667```typescript theme={null}

2668type SDKAuthStatusMessage = {

2669 type: "auth_status";

2670 isAuthenticating: boolean;

2671 output: string[];

2672 error?: string;

2673 uuid: UUID;

2674 session_id: string;

2675};

2676```

2677 

2678### `SDKTaskStartedMessage`

2679 

2680当后台任务开始时发出。`task_type` 字段对于后台 Bash 命令和 [Monitor](#monitor) 监视为 `"local_bash"`,对于子代理为 `"local_agent"`,或 `"remote_agent"`。

2681 

2682```typescript theme={null}

2683type SDKTaskStartedMessage = {

2684 type: "system";

2685 subtype: "task_started";

2686 task_id: string;

2687 tool_use_id?: string;

2688 description: string;

2689 task_type?: string;

2690 uuid: UUID;

2691 session_id: string;

2692};

2693```

2694 

2695### `SDKTaskProgressMessage`

2696 

2697在后台任务运行时定期发出。

2698 

2699```typescript theme={null}

2700type SDKTaskProgressMessage = {

2701 type: "system";

2702 subtype: "task_progress";

2703 task_id: string;

2704 tool_use_id?: string;

2705 description: string;

2706 usage: {

2707 total_tokens: number;

2708 tool_uses: number;

2709 duration_ms: number;

2710 };

2711 last_tool_name?: string;

2712 uuid: UUID;

2713 session_id: string;

2714};

2715```

2716 

2717### `SDKTaskUpdatedMessage`

2718 

2719当后台任务的状态发生变化时发出,例如当它从 `running` 转换为 `completed` 时。将 `patch` 合并到按 `task_id` 键入的本地任务映射中。`end_time` 字段是 Unix 纪元时间戳(以毫秒为单位),可与 `Date.now()` 比较。

2720 

2721```typescript theme={null}

2722type SDKTaskUpdatedMessage = {

2723 type: "system";

2724 subtype: "task_updated";

2725 task_id: string;

2726 patch: {

2727 status?: "pending" | "running" | "completed" | "failed" | "killed";

2728 description?: string;

2729 end_time?: number;

2730 total_paused_ms?: number;

2731 error?: string;

2732 is_backgrounded?: boolean;

2733 };

2734 uuid: UUID;

2735 session_id: string;

2736};

2737```

2738 

2739### `SDKFilesPersistedEvent`

2740 

2741当文件检查点持久化到磁盘时发出。

2742 

2743```typescript theme={null}

2744type SDKFilesPersistedEvent = {

2745 type: "system";

2746 subtype: "files_persisted";

2747 files: { filename: string; file_id: string }[];

2748 failed: { filename: string; error: string }[];

2749 processed_at: string;

2750 uuid: UUID;

2751 session_id: string;

2752};

2753```

2754 

2755### `SDKRateLimitEvent`

2756 

2757当会话遇到速率限制时发出。

2758 

2759```typescript theme={null}

2760type SDKRateLimitEvent = {

2761 type: "rate_limit_event";

2762 rate_limit_info: {

2763 status: "allowed" | "allowed_warning" | "rejected";

2764 resetsAt?: number;

2765 utilization?: number;

2766 };

2767 uuid: UUID;

2768 session_id: string;

2769};

2770```

2771 

2772### `SDKLocalCommandOutputMessage`

2773 

2774来自本地 slash command 的输出(例如,`/voice` 或 `/usage`)。在记录中显示为助手样式的文本。

2775 

2776```typescript theme={null}

2777type SDKLocalCommandOutputMessage = {

2778 type: "system";

2779 subtype: "local_command_output";

2780 content: string;

2781 uuid: UUID;

2782 session_id: string;

2783};

2784```

2785 

2786### `SDKPromptSuggestionMessage`

2787 

2788当启用 `promptSuggestions` 时在每个轮次后发出。包含预测的下一个用户提示。

2789 

2790```typescript theme={null}

2791type SDKPromptSuggestionMessage = {

2792 type: "prompt_suggestion";

2793 suggestion: string;

2794 uuid: UUID;

2795 session_id: string;

2796};

2797```

2798 

2799### `AbortError`

2800 

2801用于中止操作的自定义错误类。

2802 

2803```typescript theme={null}

2804class AbortError extends Error {}

2805```

2806 

2807## 沙箱配置

2808 

2809### `SandboxSettings`

2810 

2811沙箱行为的配置。使用此选项以编程方式启用命令沙箱和配置网络限制。

2812 

2813```typescript theme={null}

2814type SandboxSettings = {

2815 enabled?: boolean;

2816 autoAllowBashIfSandboxed?: boolean;

2817 excludedCommands?: string[];

2818 allowUnsandboxedCommands?: boolean;

2819 network?: SandboxNetworkConfig;

2820 filesystem?: SandboxFilesystemConfig;

2821 ignoreViolations?: Record<string, string[]>;

2822 enableWeakerNestedSandbox?: boolean;

2823 ripgrep?: { command: string; args?: string[] };

2824};

2825```

2826 

2827| 属性 | 类型 | 默认值 | 描述 |

2828| :-------------------------- | :------------------------------------------------------ | :---------- | :------------------------------------------------------------------------------------------------------------------------------ |

2829| `enabled` | `boolean` | `false` | 为命令执行启用沙箱模式 |

2830| `autoAllowBashIfSandboxed` | `boolean` | `true` | 启用沙箱时自动批准 bash 命令 |

2831| `excludedCommands` | `string[]` | `[]` | 始终绕过沙箱限制的命令(例如,`['docker']`)。这些自动运行在沙箱外,无需模型参与 |

2832| `allowUnsandboxedCommands` | `boolean` | `true` | 允许模型请求在沙箱外运行命令。当为 `true` 时,模型可以在工具输入中设置 `dangerouslyDisableSandbox`,这会回退到[权限系统](#permissions-fallback-for-unsandboxed-commands) |

2833| `network` | [`SandboxNetworkConfig`](#sandbox-network-config) | `undefined` | 网络特定的沙箱配置 |

2834| `filesystem` | [`SandboxFilesystemConfig`](#sandbox-filesystem-config) | `undefined` | 用于读/写限制的文件系统特定沙箱配置 |

2835| `ignoreViolations` | `Record<string, string[]>` | `undefined` | 违规类别到要忽略的模式的映射(例如,`{ file: ['/tmp/*'], network: ['localhost'] }`) |

2836| `enableWeakerNestedSandbox` | `boolean` | `false` | 为兼容性启用较弱的嵌套沙箱 |

2837| `ripgrep` | `{ command: string; args?: string[] }` | `undefined` | 沙箱环境中的自定义 ripgrep 二进制配置 |

2838 

2839#### 示例用法

2840 

2841```typescript theme={null}

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

2843 

2844for await (const message of query({

2845 prompt: "Build and test my project",

2846 options: {

2847 sandbox: {

2848 enabled: true,

2849 autoAllowBashIfSandboxed: true,

2850 network: {

2851 allowLocalBinding: true

2852 }

2853 }

2854 }

2855})) {

2856 if ("result" in message) console.log(message.result);

2857}

2858```

2859 

2860<Warning>

2861 **Unix socket 安全性:** `allowUnixSockets` 选项可以授予对强大系统服务的访问权限。例如,允许 `/var/run/docker.sock` 实际上通过 Docker API 授予对主机系统的完全访问权限,绕过沙箱隔离。仅允许严格必要的 Unix sockets 并了解每个的安全含义。

2862</Warning>

2863 

2864### `SandboxNetworkConfig`

2865 

2866沙箱模式的网络特定配置。

2867 

2868```typescript theme={null}

2869type SandboxNetworkConfig = {

2870 allowedDomains?: string[];

2871 deniedDomains?: string[];

2872 allowManagedDomainsOnly?: boolean;

2873 allowLocalBinding?: boolean;

2874 allowUnixSockets?: string[];

2875 allowAllUnixSockets?: boolean;

2876 httpProxyPort?: number;

2877 socksProxyPort?: number;

2878};

2879```

2880 

2881| 属性 | 类型 | 默认值 | 描述 |

2882| :------------------------ | :--------- | :---------- | :--------------------------------------- |

2883| `allowedDomains` | `string[]` | `[]` | 沙箱进程可以访问的域名 |

2884| `deniedDomains` | `string[]` | `[]` | 沙箱进程无法访问的域名。优先于 `allowedDomains` |

2885| `allowManagedDomainsOnly` | `boolean` | `false` | 将网络访问限制为仅 `allowedDomains` 中的域 |

2886| `allowLocalBinding` | `boolean` | `false` | 允许进程绑定到本地端口(例如,用于开发服务器) |

2887| `allowUnixSockets` | `string[]` | `[]` | 进程可以访问的 Unix socket 路径(例如,Docker socket) |

2888| `allowAllUnixSockets` | `boolean` | `false` | 允许访问所有 Unix sockets |

2889| `httpProxyPort` | `number` | `undefined` | 网络请求的 HTTP 代理端口 |

2890| `socksProxyPort` | `number` | `undefined` | 网络请求的 SOCKS 代理端口 |

2891 

2892<Note>

2893 内置沙箱代理基于请求的主机名强制执行 `allowedDomains`,不会终止或检查 TLS 流量,因此[域前置](https://en.wikipedia.org/wiki/Domain_fronting)等技术可能会绕过它。有关详细信息,请参阅[沙箱安全限制](/zh-CN/sandboxing#security-limitations),以及[安全部署](/zh-CN/agent-sdk/secure-deployment#traffic-forwarding)以配置 TLS 终止代理。

2894</Note>

2895 

2896### `SandboxFilesystemConfig`

2897 

2898沙箱模式的文件系统特定配置。

2899 

2900```typescript theme={null}

2901type SandboxFilesystemConfig = {

2902 allowWrite?: string[];

2903 denyWrite?: string[];

2904 denyRead?: string[];

2905};

2906```

2907 

2908| 属性 | 类型 | 默认值 | 描述 |

2909| :----------- | :--------- | :--- | :------------ |

2910| `allowWrite` | `string[]` | `[]` | 允许写入访问的文件路径模式 |

2911| `denyWrite` | `string[]` | `[]` | 拒绝写入访问的文件路径模式 |

2912| `denyRead` | `string[]` | `[]` | 拒绝读取访问的文件路径模式 |

2913 

2914### 沙箱外命令的权限回退

2915 

2916启用 `allowUnsandboxedCommands` 时,模型可以通过在工具输入中设置 `dangerouslyDisableSandbox: true` 来请求在沙箱外运行命令。这些请求回退到现有权限系统,意味着您的 `canUseTool` 处理程序被调用,允许您实现自定义授权逻辑。

2917 

2918<Note>

2919 **`excludedCommands` vs `allowUnsandboxedCommands`:**

2920 

2921 * `excludedCommands`:始终自动绕过沙箱的命令的静态列表(例如,`['docker']`)。模型对此无法控制。

2922 * `allowUnsandboxedCommands`:让模型在运行时通过在工具输入中设置 `dangerouslyDisableSandbox: true` 来决定是否请求沙箱外执行。

2923</Note>

2924 

2925```typescript theme={null}

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

2927 

2928for await (const message of query({

2929 prompt: "Deploy my application",

2930 options: {

2931 sandbox: {

2932 enabled: true,

2933 allowUnsandboxedCommands: true // 模型可以请求沙箱外执行

2934 },

2935 permissionMode: "default",

2936 canUseTool: async (tool, input) => {

2937 // 检查模型是否请求绕过沙箱

2938 if (tool === "Bash" && input.dangerouslyDisableSandbox) {

2939 // 模型请求在沙箱外运行此命令

2940 console.log(`Unsandboxed command requested: ${input.command}`);

2941 

2942 if (isCommandAuthorized(input.command)) {

2943 return { behavior: "allow" as const, updatedInput: input };

2944 }

2945 return {

2946 behavior: "deny" as const,

2947 message: "Command not authorized for unsandboxed execution"

2948 };

2949 }

2950 return { behavior: "allow" as const, updatedInput: input };

2951 }

2952 }

2953})) {

2954 if ("result" in message) console.log(message.result);

2955}

2956```

2957 

2958此模式使您能够:

2959 

2960* **审计模型请求:** 记录模型何时请求沙箱外执行

2961* **实现允许列表:** 仅允许特定命令在沙箱外运行

2962* **添加批准工作流:** 需要对特权操作进行明确授权

2963 

2964<Warning>

2965 使用 `dangerouslyDisableSandbox: true` 运行的命令具有完整的系统访问权限。确保您的 `canUseTool` 处理程序仔细验证这些请求。

2966 

2967 如果 `permissionMode` 设置为 `bypassPermissions` 且 `allowUnsandboxedCommands` 启用,模型可以自主执行沙箱外的命令,无需任何批准提示。此组合实际上允许模型以静默方式逃离沙箱隔离。

2968</Warning>

2969 

2970## 另请参阅

2971 

2972* [SDK 概述](/zh-CN/agent-sdk/overview) - 常规 SDK 概念

2973* [Python SDK 参考](/zh-CN/agent-sdk/python) - Python SDK 文档

2974* [CLI 参考](/zh-CN/cli-reference) - 命令行界面

2975* [常见工作流](/zh-CN/common-workflows) - 分步指南

Details

1> ## Documentation Index

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

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

4 

5# TypeScript SDK V2 interface (preview)

6 

7> 简化的 V2 TypeScript Agent SDK 预览,具有用于多轮对话的基于会话的 send/stream 模式。

8 

9<Warning>

10 V2 interface 是一个**不稳定的预览版**。在变得稳定之前,API 可能会根据反馈而改变。某些功能(如会话分叉)仅在 [V1 SDK](/zh-CN/agent-sdk/typescript) 中可用。

11</Warning>

12 

13V2 Claude Agent TypeScript SDK 消除了对异步生成器和 yield 协调的需求。这使多轮对话更简单,而不是在各轮之间管理生成器状态,每一轮都是一个单独的 `send()`/`stream()` 周期。API 表面简化为三个概念:

14 

15* `createSession()` / `resumeSession()`:启动或继续对话

16* `session.send()`:发送消息

17* `session.stream()`:获取响应

18 

19## 安装

20 

21V2 interface 包含在现有的 SDK 包中:

22 

23```bash theme={null}

24npm install @anthropic-ai/claude-agent-sdk

25```

26 

27<Note>

28 SDK 为您的平台捆绑了一个本地 Claude Code 二进制文件作为可选依赖项,因此您无需单独安装 Claude Code。

29</Note>

30 

31## 快速开始

32 

33### 单次提示

34 

35对于不需要维护会话的简单单轮查询,使用 `unstable_v2_prompt()`。此示例发送一个数学问题并记录答案:

36 

37```typescript theme={null}

38import { unstable_v2_prompt } from "@anthropic-ai/claude-agent-sdk";

39 

40const result = await unstable_v2_prompt("What is 2 + 2?", {

41 model: "claude-opus-4-7"

42});

43if (result.subtype === "success") {

44 console.log(result.result);

45}

46```

47 

48<details>

49 <summary>查看 V1 中的相同操作</summary>

50 

51 ```typescript theme={null}

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

53 

54 const q = query({

55 prompt: "What is 2 + 2?",

56 options: { model: "claude-opus-4-7" }

57 });

58 

59 for await (const msg of q) {

60 if (msg.type === "result" && msg.subtype === "success") {

61 console.log(msg.result);

62 }

63 }

64 ```

65</details>

66 

67### 基本会话

68 

69对于超出单个提示的交互,创建一个会话。V2 将发送和流式传输分为不同的步骤:

70 

71* `send()` 分派您的消息

72* `stream()` 流式传输响应

73 

74这种明确的分离使得在轮次之间添加逻辑变得更容易(例如在发送后续消息之前处理响应)。

75 

76下面的示例创建一个会话,向 Claude 发送"Hello!",并打印文本响应。它使用 [`await using`](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-5-2.html#using-declarations-and-explicit-resource-management)(TypeScript 5.2+)在块退出时自动关闭会话。您也可以手动调用 `session.close()`。

77 

78```typescript theme={null}

79import { unstable_v2_createSession } from "@anthropic-ai/claude-agent-sdk";

80 

81await using session = unstable_v2_createSession({

82 model: "claude-opus-4-7"

83});

84 

85await session.send("Hello!");

86for await (const msg of session.stream()) {

87 // Filter for assistant messages to get human-readable output

88 if (msg.type === "assistant") {

89 const text = msg.message.content

90 .filter((block) => block.type === "text")

91 .map((block) => block.text)

92 .join("");

93 console.log(text);

94 }

95}

96```

97 

98<details>

99 <summary>查看 V1 中的相同操作</summary>

100 

101 在 V1 中,输入和输出都通过单个异步生成器流动。对于基本提示,这看起来很相似,但添加多轮逻辑需要重新构造以使用输入生成器。

102 

103 ```typescript theme={null}

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

105 

106 const q = query({

107 prompt: "Hello!",

108 options: { model: "claude-opus-4-7" }

109 });

110 

111 for await (const msg of q) {

112 if (msg.type === "assistant") {

113 const text = msg.message.content

114 .filter((block) => block.type === "text")

115 .map((block) => block.text)

116 .join("");

117 console.log(text);

118 }

119 }

120 ```

121</details>

122 

123### 多轮对话

124 

125会话在多个交换中保持上下文。要继续对话,请在同一会话上再次调用 `send()`。Claude 会记住之前的轮次。

126 

127此示例提出一个数学问题,然后提出一个引用前一个答案的后续问题:

128 

129```typescript theme={null}

130import { unstable_v2_createSession } from "@anthropic-ai/claude-agent-sdk";

131 

132await using session = unstable_v2_createSession({

133 model: "claude-opus-4-7"

134});

135 

136// Turn 1

137await session.send("What is 5 + 3?");

138for await (const msg of session.stream()) {

139 // Filter for assistant messages to get human-readable output

140 if (msg.type === "assistant") {

141 const text = msg.message.content

142 .filter((block) => block.type === "text")

143 .map((block) => block.text)

144 .join("");

145 console.log(text);

146 }

147}

148 

149// Turn 2

150await session.send("Multiply that by 2");

151for await (const msg of session.stream()) {

152 if (msg.type === "assistant") {

153 const text = msg.message.content

154 .filter((block) => block.type === "text")

155 .map((block) => block.text)

156 .join("");

157 console.log(text);

158 }

159}

160```

161 

162<details>

163 <summary>查看 V1 中的相同操作</summary>

164 

165 ```typescript theme={null}

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

167 

168 // Must create an async iterable to feed messages

169 async function* createInputStream() {

170 yield {

171 type: "user",

172 session_id: "",

173 message: { role: "user", content: [{ type: "text", text: "What is 5 + 3?" }] },

174 parent_tool_use_id: null

175 };

176 // Must coordinate when to yield next message

177 yield {

178 type: "user",

179 session_id: "",

180 message: { role: "user", content: [{ type: "text", text: "Multiply by 2" }] },

181 parent_tool_use_id: null

182 };

183 }

184 

185 const q = query({

186 prompt: createInputStream(),

187 options: { model: "claude-opus-4-7" }

188 });

189 

190 for await (const msg of q) {

191 if (msg.type === "assistant") {

192 const text = msg.message.content

193 .filter((block) => block.type === "text")

194 .map((block) => block.text)

195 .join("");

196 console.log(text);

197 }

198 }

199 ```

200</details>

201 

202### 会话恢复

203 

204如果您有来自之前交互的会话 ID,您可以稍后恢复它。这对于长时间运行的工作流或当您需要在应用程序重新启动时保持对话时很有用。

205 

206此示例创建一个会话,存储其 ID,关闭它,然后恢复对话:

207 

208```typescript theme={null}

209import {

210 unstable_v2_createSession,

211 unstable_v2_resumeSession,

212 type SDKMessage

213} from "@anthropic-ai/claude-agent-sdk";

214 

215// Helper to extract text from assistant messages

216function getAssistantText(msg: SDKMessage): string | null {

217 if (msg.type !== "assistant") return null;

218 return msg.message.content

219 .filter((block) => block.type === "text")

220 .map((block) => block.text)

221 .join("");

222}

223 

224// Create initial session and have a conversation

225const session = unstable_v2_createSession({

226 model: "claude-opus-4-7"

227});

228 

229await session.send("Remember this number: 42");

230 

231// Get the session ID from any received message

232let sessionId: string | undefined;

233for await (const msg of session.stream()) {

234 sessionId = msg.session_id;

235 const text = getAssistantText(msg);

236 if (text) console.log("Initial response:", text);

237}

238 

239console.log("Session ID:", sessionId);

240session.close();

241 

242// Later: resume the session using the stored ID

243await using resumedSession = unstable_v2_resumeSession(sessionId!, {

244 model: "claude-opus-4-7"

245});

246 

247await resumedSession.send("What number did I ask you to remember?");

248for await (const msg of resumedSession.stream()) {

249 const text = getAssistantText(msg);

250 if (text) console.log("Resumed response:", text);

251}

252```

253 

254<details>

255 <summary>查看 V1 中的相同操作</summary>

256 

257 ```typescript theme={null}

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

259 

260 // Create initial session

261 const initialQuery = query({

262 prompt: "Remember this number: 42",

263 options: { model: "claude-opus-4-7" }

264 });

265 

266 // Get session ID from any message

267 let sessionId: string | undefined;

268 for await (const msg of initialQuery) {

269 sessionId = msg.session_id;

270 if (msg.type === "assistant") {

271 const text = msg.message.content

272 .filter((block) => block.type === "text")

273 .map((block) => block.text)

274 .join("");

275 console.log("Initial response:", text);

276 }

277 }

278 

279 console.log("Session ID:", sessionId);

280 

281 // Later: resume the session

282 const resumedQuery = query({

283 prompt: "What number did I ask you to remember?",

284 options: {

285 model: "claude-opus-4-7",

286 resume: sessionId

287 }

288 });

289 

290 for await (const msg of resumedQuery) {

291 if (msg.type === "assistant") {

292 const text = msg.message.content

293 .filter((block) => block.type === "text")

294 .map((block) => block.text)

295 .join("");

296 console.log("Resumed response:", text);

297 }

298 }

299 ```

300</details>

301 

302### 清理

303 

304会话可以手动关闭或使用 [`await using`](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-5-2.html#using-declarations-and-explicit-resource-management)(TypeScript 5.2+ 功能用于自动资源清理)自动关闭。如果您使用的是较旧的 TypeScript 版本或遇到兼容性问题,请改用手动清理。

305 

306**自动清理(TypeScript 5.2+):**

307 

308```typescript theme={null}

309import { unstable_v2_createSession } from "@anthropic-ai/claude-agent-sdk";

310 

311await using session = unstable_v2_createSession({

312 model: "claude-opus-4-7"

313});

314// Session closes automatically when the block exits

315```

316 

317**手动清理:**

318 

319```typescript theme={null}

320import { unstable_v2_createSession } from "@anthropic-ai/claude-agent-sdk";

321 

322const session = unstable_v2_createSession({

323 model: "claude-opus-4-7"

324});

325// ... use the session ...

326session.close();

327```

328 

329## API 参考

330 

331### `unstable_v2_createSession()`

332 

333为多轮对话创建新会话。

334 

335```typescript theme={null}

336function unstable_v2_createSession(options: {

337 model: string;

338 // Additional options supported

339}): SDKSession;

340```

341 

342### `unstable_v2_resumeSession()`

343 

344按 ID 恢复现有会话。

345 

346```typescript theme={null}

347function unstable_v2_resumeSession(

348 sessionId: string,

349 options: {

350 model: string;

351 // Additional options supported

352 }

353): SDKSession;

354```

355 

356### `unstable_v2_prompt()`

357 

358用于单轮查询的单次便利函数。

359 

360```typescript theme={null}

361function unstable_v2_prompt(

362 prompt: string,

363 options: {

364 model: string;

365 // Additional options supported

366 }

367): Promise<SDKResultMessage>;

368```

369 

370### SDKSession interface

371 

372```typescript theme={null}

373interface SDKSession {

374 readonly sessionId: string;

375 send(message: string | SDKUserMessage): Promise<void>;

376 stream(): AsyncGenerator<SDKMessage, void>;

377 close(): void;

378}

379```

380 

381## 功能可用性

382 

383并非所有 V1 功能在 V2 中都可用。以下功能需要使用 [V1 SDK](/zh-CN/agent-sdk/typescript):

384 

385* 会话分叉(`forkSession` 选项)

386* 某些高级流式输入模式

387 

388## 反馈

389 

390在 V2 interface 变得稳定之前分享您的反馈。通过 [GitHub Issues](https://github.com/anthropics/claude-code/issues) 报告问题和建议。

391 

392## 另请参阅

393 

394* [TypeScript SDK 参考(V1)](/zh-CN/agent-sdk/typescript) - 完整的 V1 SDK 文档

395* [SDK 概述](/zh-CN/agent-sdk/overview) - 常规 SDK 概念

396* [GitHub 上的 V2 示例](https://github.com/anthropics/claude-agent-sdk-demos/tree/main/hello-world-v2) - 工作代码示例

agent-teams.md +424 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 协调 Claude Code 会话团队

6 

7> 协调多个 Claude Code 实例作为一个团队一起工作,具有共享任务、代理间消息传递和集中管理。

8 

9<Warning>

10 Agent teams 是实验性功能,默认禁用。通过将 `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS` 添加到你的 [settings.json](/zh-CN/settings) 或环境变量来启用它们。Agent teams 在 [已知限制](#limitations) 中存在关于会话恢复、任务协调和关闭行为的问题。

11</Warning>

12 

13Agent teams 让你协调多个 Claude Code 实例一起工作。一个会话充当团队负责人,协调工作、分配任务和综合结果。队友独立工作,每个都在自己的 context window 中,并直接相互通信。

14 

15与 [subagents](/zh-CN/sub-agents) 不同,subagents 在单个会话中运行,只能向主代理报告,你也可以直接与个别队友互动,无需通过负责人。

16 

17<Note>

18 Agent teams 需要 Claude Code v2.1.32 或更高版本。使用 `claude --version` 检查你的版本。

19</Note>

20 

21本页涵盖:

22 

23* [何时使用 agent teams](#when-to-use-agent-teams),包括最佳用例以及它们与 subagents 的比较

24* [启动团队](#start-your-first-agent-team)

25* [控制队友](#control-your-agent-team),包括显示模式、任务分配和委派

26* [并行工作的最佳实践](#best-practices)

27 

28## 何时使用 agent teams

29 

30Agent teams 最适合用于并行探索能增加真实价值的任务。有关完整场景,请参阅 [用例示例](#use-case-examples)。最强的用例是:

31 

32* **研究和审查**:多个队友可以同时调查问题的不同方面,然后分享和质疑彼此的发现

33* **新模块或功能**:队友可以各自拥有一个独立的部分,不会相互干扰

34* **使用竞争假设进行调试**:队友并行测试不同的理论,更快地收敛到答案

35* **跨层协调**:跨越前端、后端和测试的更改,每个由不同的队友负责

36 

37Agent teams 增加了协调开销,使用的令牌数量明显多于单个会话。当队友可以独立运作时,它们效果最好。对于顺序任务、同一文件编辑或有许多依赖关系的工作,单个会话或 [subagents](/zh-CN/sub-agents) 更有效。

38 

39### 与 subagents 比较

40 

41Agent teams 和 [subagents](/zh-CN/sub-agents) 都让你并行化工作,但它们的运作方式不同。根据你的工作人员是否需要相互通信来选择:

42 

43<Frame caption="Subagents 仅向主代理报告结果,彼此不交谈。在 agent teams 中,队友共享任务列表、认领工作并直接相互通信。">

44 <img src="https://mintcdn.com/claude-code/nsvRFSDNfpSU5nT7/images/subagents-vs-agent-teams-light.png?fit=max&auto=format&n=nsvRFSDNfpSU5nT7&q=85&s=2f8db9b4f3705dd3ab931fbe2d96e42a" className="dark:hidden" alt="比较 subagent 和 agent team 架构的图表。Subagents 由主代理生成、执行工作并报告结果。Agent teams 通过共享任务列表进行协调,队友彼此直接通信。" width="4245" height="1615" data-path="images/subagents-vs-agent-teams-light.png" />

45 

46 <img src="https://mintcdn.com/claude-code/nsvRFSDNfpSU5nT7/images/subagents-vs-agent-teams-dark.png?fit=max&auto=format&n=nsvRFSDNfpSU5nT7&q=85&s=d573a037540f2ada6a9ae7d8285b46fd" className="hidden dark:block" alt="比较 subagent 和 agent team 架构的图表。Subagents 由主代理生成、执行工作并报告结果。Agent teams 通过共享任务列表进行协调,队友彼此直接通信。" width="4245" height="1615" data-path="images/subagents-vs-agent-teams-dark.png" />

47</Frame>

48 

49| | Subagents | Agent teams |

50| :---------- | :-------------------------- | :---------------------- |

51| **Context** | 自己的 context window;结果返回给调用者 | 自己的 context window;完全独立 |

52| **通信** | 仅向主代理报告结果 | 队友直接相互发送消息 |

53| **协调** | 主代理管理所有工作 | 具有自我协调的共享任务列表 |

54| **最适合** | 只有结果重要的专注任务 | 需要讨论和协作的复杂工作 |

55| **令牌成本** | 较低:结果汇总回主 context | 较高:每个队友是一个独立的 Claude 实例 |

56 

57当你需要快速、专注的工作人员报告结果时,使用 subagents。当队友需要分享发现、相互质疑和自我协调时,使用 agent teams。

58 

59## 启用 agent teams

60 

61Agent teams 默认禁用。通过将 `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS` 环境变量设置为 `1`,在你的 shell 环境中或通过 [settings.json](/zh-CN/settings) 来启用它:

62 

63```json settings.json theme={null}

64{

65 "env": {

66 "CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS": "1"

67 }

68}

69```

70 

71## 启动你的第一个 agent team

72 

73启用 agent teams 后,告诉 Claude 创建一个 agent team,并用自然语言描述你想要的任务和团队结构。Claude 创建团队、生成队友并根据你的提示协调工作。

74 

75这个例子效果很好,因为三个角色是独立的,可以在不相互等待的情况下探索问题:

76 

77```text theme={null}

78I'm designing a CLI tool that helps developers track TODO comments across

79their codebase. Create an agent team to explore this from different angles: one

80teammate on UX, one on technical architecture, one playing devil's advocate.

81```

82 

83从那里,Claude 创建一个具有 [共享任务列表](/zh-CN/interactive-mode#task-list) 的团队,为每个角度生成队友,让他们探索问题,综合发现,并在完成时尝试 [清理团队](#clean-up-the-team)。

84 

85负责人的终端列出所有队友及其正在处理的工作。使用 Shift+Down 循环浏览队友并直接向他们发送消息。在最后一个队友之后,Shift+Down 会回到负责人。

86 

87如果你想让每个队友在自己的分割窗格中,请参阅 [选择显示模式](#choose-a-display-mode)。

88 

89## 控制你的 agent team

90 

91用自然语言告诉负责人你想要什么。它根据你的指示处理团队协调、任务分配和委派。

92 

93### 选择显示模式

94 

95Agent teams 支持两种显示模式:

96 

97* **In-process**:所有队友在你的主终端内运行。使用 Shift+Down 循环浏览队友并输入以直接向他们发送消息。在任何终端中工作,无需额外设置。

98* **Split panes**:每个队友获得自己的窗格。你可以同时看到每个人的输出,并点击窗格直接交互。需要 tmux 或 iTerm2。

99 

100<Note>

101 `tmux` 在某些操作系统上有已知限制,传统上在 macOS 上效果最好。在 iTerm2 中使用 `tmux -CC` 是进入 `tmux` 的建议入口点。

102</Note>

103 

104默认值是 `"auto"`,如果你已经在 tmux 会话中运行,则使用分割窗格,否则使用 in-process。`"tmux"` 设置启用分割窗格模式,并根据你的终端自动检测是使用 tmux 还是 iTerm2。要覆盖,在 `~/.claude/settings.json` 中设置 [`teammateMode`](/zh-CN/settings#available-settings):

105 

106```json theme={null}

107{

108 "teammateMode": "in-process"

109}

110```

111 

112要为单个会话强制 in-process 模式,将其作为标志传递:

113 

114```bash theme={null}

115claude --teammate-mode in-process

116```

117 

118分割窗格模式需要 [tmux](https://github.com/tmux/tmux/wiki) 或 iTerm2 与 [`it2` CLI](https://github.com/mkusaka/it2)。手动安装:

119 

120* **tmux**:通过你的系统包管理器安装。有关特定于平台的说明,请参阅 [tmux wiki](https://github.com/tmux/tmux/wiki/Installing)。

121* **iTerm2**:安装 [`it2` CLI](https://github.com/mkusaka/it2),然后在 **iTerm2 → Settings → General → Magic → Enable Python API** 中启用 Python API。

122 

123### 指定队友和模型

124 

125Claude 根据你的任务决定要生成的队友数量,或者你可以指定你想要的确切内容:

126 

127```text theme={null}

128Create a team with 4 teammates to refactor these modules in parallel.

129Use Sonnet for each teammate.

130```

131 

132### 要求队友的计划批准

133 

134对于复杂或有风险的任务,你可以要求队友在实施前进行规划。队友在只读计划模式下工作,直到负责人批准他们的方法:

135 

136```text theme={null}

137Spawn an architect teammate to refactor the authentication module.

138Require plan approval before they make any changes.

139```

140 

141当队友完成规划时,它向负责人发送计划批准请求。负责人审查计划并批准或拒绝并提供反馈。如果被拒绝,队友保持在计划模式,根据反馈进行修订并重新提交。一旦批准,队友退出计划模式并开始实施。

142 

143负责人自主做出批准决定。要影响负责人的判断,在你的提示中给出标准,例如"仅批准包括测试覆盖的计划"或"拒绝修改数据库架构的计划"。

144 

145### 直接与队友交谈

146 

147每个队友都是一个完整的、独立的 Claude Code 会话。你可以直接向任何队友发送消息,以提供额外的指示、提出后续问题或改变他们的方法。

148 

149* **In-process 模式**:使用 Shift+Down 循环浏览队友,然后输入向他们发送消息。按 Enter 查看队友的会话,然后按 Escape 中断他们的当前轮次。按 Ctrl+T 切换任务列表。

150* **Split-pane 模式**:点击队友的窗格以直接与他们的会话交互。每个队友都有自己终端的完整视图。

151 

152### 分配和认领任务

153 

154共享任务列表协调整个团队的工作。负责人创建任务,队友完成它们。任务有三种状态:待处理、进行中和已完成。任务也可以依赖其他任务:具有未解决依赖关系的待处理任务在这些依赖关系完成之前无法被认领。

155 

156负责人可以显式分配任务,或队友可以自我认领:

157 

158* **负责人分配**:告诉负责人将哪个任务分配给哪个队友

159* **自我认领**:完成任务后,队友自己选择下一个未分配、未阻止的任务

160 

161任务认领使用文件锁定来防止多个队友同时尝试认领同一任务时的竞态条件。

162 

163### 关闭队友

164 

165要优雅地结束队友的会话:

166 

167```text theme={null}

168Ask the researcher teammate to shut down

169```

170 

171负责人发送关闭请求。队友可以批准并优雅地退出,或拒绝并提供解释。

172 

173### 清理团队

174 

175完成后,要求负责人清理:

176 

177```text theme={null}

178Clean up the team

179```

180 

181这会删除共享的团队资源。当负责人运行清理时,它会检查活跃的队友,如果仍有任何队友在运行,则失败,所以先关闭他们。

182 

183<Warning>

184 始终使用负责人进行清理。队友不应该运行清理,因为他们的团队 context 可能无法正确解析,可能会使资源处于不一致的状态。

185</Warning>

186 

187### 使用 hooks 强制质量门

188 

189使用 [hooks](/zh-CN/hooks) 在队友完成工作或任务创建或完成时强制执行规则:

190 

191* [`TeammateIdle`](/zh-CN/hooks#teammateidle):当队友即将空闲时运行。以代码 2 退出以发送反馈并保持队友工作。

192* [`TaskCreated`](/zh-CN/hooks#taskcreated):当任务被创建时运行。以代码 2 退出以防止创建并发送反馈。

193* [`TaskCompleted`](/zh-CN/hooks#taskcompleted):当任务被标记为完成时运行。以代码 2 退出以防止完成并发送反馈。

194 

195## Agent teams 如何工作

196 

197本部分涵盖 agent teams 背后的架构和机制。如果你想开始使用它们,请参阅上面的 [控制你的 agent team](#control-your-agent-team)。

198 

199### Claude 如何启动 agent teams

200 

201Agent teams 有两种启动方式:

202 

203* **你请求一个团队**:给 Claude 一个受益于并行工作的任务,并明确要求一个 agent team。Claude 根据你的指示创建一个。

204* **Claude 提议一个团队**:如果 Claude 确定你的任务将受益于并行工作,它可能会建议创建一个团队。你在它继续之前确认。

205 

206在这两种情况下,你都保持控制。Claude 不会在没有你的批准的情况下创建团队。

207 

208### 架构

209 

210Agent team 由以下部分组成:

211 

212| 组件 | 角色 |

213| :------------ | :------------------------------ |

214| **Team lead** | 创建团队、生成队友并协调工作的主 Claude Code 会话 |

215| **Teammates** | 各自处理分配任务的独立 Claude Code 实例 |

216| **Task list** | 队友认领和完成的共享工作项列表 |

217| **Mailbox** | 代理之间通信的消息系统 |

218 

219有关显示配置选项,请参阅 [选择显示模式](#choose-a-display-mode)。队友消息自动到达负责人。

220 

221系统自动管理任务依赖关系。当队友完成其他任务依赖的任务时,被阻止的任务会自动解除阻止。

222 

223团队和任务存储在本地:

224 

225* **Team config**:`~/.claude/teams/{team-name}/config.json`

226* **Task list**:`~/.claude/tasks/{team-name}/`

227 

228Claude Code 在你创建团队时自动生成这两个,并在队友加入、空闲或离开时更新它们。团队配置保存运行时状态,例如会话 ID 和 tmux 窗格 ID,所以不要手动编辑它或预先编写它:你的更改会在下一次状态更新时被覆盖。

229 

230要定义可重用的队友角色,请改用 [subagent 定义](#use-subagent-definitions-for-teammates)。

231 

232团队配置包含一个 `members` 数组,其中包含每个队友的名称、代理 ID 和代理类型。队友可以读取此文件以发现其他团队成员。

233 

234没有项目级别的团队配置等效项。项目目录中的 `.claude/teams/teams.json` 之类的文件不被识别为配置;Claude 将其视为普通文件。

235 

236### 为队友使用 subagent 定义

237 

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

239 

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

241 

242```text theme={null}

243Spawn a teammate using the security-reviewer agent type to audit the auth module.

244```

245 

246队友遵守该定义的 `tools` 允许列表和 `model`,定义的主体被附加到队友的系统提示作为额外指示,而不是替换它。Team coordination tools 例如 `SendMessage` 和任务管理工具始终对队友可用,即使 `tools` 限制其他工具。

247 

248<Note>

249 subagent 定义中的 `skills` 和 `mcpServers` frontmatter 字段在该定义作为队友运行时不被应用。队友从你的项目和用户设置加载 skills 和 MCP servers,与常规会话相同。

250</Note>

251 

252### 权限

253 

254队友从负责人的权限设置开始。如果负责人使用 `--dangerously-skip-permissions` 运行,所有队友也会这样做。生成后,你可以更改个别队友模式,但在生成时无法设置每个队友的模式。

255 

256### Context 和通信

257 

258每个队友都有自己的 context window。生成时,队友加载与常规会话相同的项目 context:CLAUDE.md、MCP servers 和 skills。它还接收来自负责人的生成提示。负责人的对话历史不会继承。

259 

260**队友如何共享信息:**

261 

262* **自动消息传递**:当队友发送消息时,它们会自动传递给收件人。负责人不需要轮询更新。

263* **空闲通知**:当队友完成并停止时,他们会自动通知负责人。

264* **共享任务列表**:所有代理都可以看到任务状态并认领可用工作。

265* **队友消息传递**:按名称向一个特定的队友发送消息。要联系所有人,请为每个收件人发送一条消息。

266 

267负责人在生成队友时为其分配一个名称,任何队友都可以按该名称向任何其他队友发送消息。要获得可预测的名称,你可以在后续提示中引用,在你的生成指令中告诉负责人如何称呼每个队友。

268 

269### 令牌使用

270 

271Agent teams 使用的令牌数量明显多于单个会话。每个队友都有自己的 context window,令牌使用量随活跃队友数量而增加。对于研究、审查和新功能工作,额外的令牌通常是值得的。对于日常任务,单个会话更具成本效益。有关使用指导,请参阅 [agent team 令牌成本](/zh-CN/costs#agent-team-token-costs)。

272 

273## 用例示例

274 

275这些示例展示了 agent teams 如何处理并行探索增加价值的任务。

276 

277### 运行并行代码审查

278 

279单个审查者往往一次只关注一种类型的问题。将审查标准分解为独立的领域意味着安全性、性能和测试覆盖都同时获得彻底的关注。提示为每个队友分配一个不同的视角,以便他们不重叠:

280 

281```text theme={null}

282Create an agent team to review PR #142. Spawn three reviewers:

283- One focused on security implications

284- One checking performance impact

285- One validating test coverage

286Have them each review and report findings.

287```

288 

289每个审查者从同一个 PR 工作,但应用不同的过滤器。负责人在他们完成后综合所有三个的发现。

290 

291### 使用竞争假设进行调查

292 

293当根本原因不清楚时,单个代理往往会找到一个看似合理的解释并停止寻找。提示通过让队友明确对抗来对抗这一点:每个队友的工作不仅是调查自己的理论,还要质疑其他队友的理论。

294 

295```text theme={null}

296Users report the app exits after one message instead of staying connected.

297Spawn 5 agent teammates to investigate different hypotheses. Have them talk to

298each other to try to disprove each other's theories, like a scientific

299debate. Update the findings doc with whatever consensus emerges.

300```

301 

302辩论结构是这里的关键机制。顺序调查受到锚定的影响:一旦探索了一个理论,后续调查就会偏向于它。

303 

304有多个独立的调查者积极尝试相互反驳,存活下来的理论更有可能是实际的根本原因。

305 

306## 最佳实践

307 

308### 给队友足够的 context

309 

310队友自动加载项目 context,包括 CLAUDE.md、MCP servers 和 skills,但他们不继承负责人的对话历史。有关详细信息,请参阅 [Context 和通信](#context-and-communication)。在生成提示中包含特定于任务的详细信息:

311 

312```text theme={null}

313Spawn a security reviewer teammate with the prompt: "Review the authentication module

314at src/auth/ for security vulnerabilities. Focus on token handling, session

315management, and input validation. The app uses JWT tokens stored in

316httpOnly cookies. Report any issues with severity ratings."

317```

318 

319### 选择适当的团队规模

320 

321队友数量没有硬限制,但实际限制适用:

322 

323* **令牌成本线性增加**:每个队友都有自己的 context window 并独立消耗令牌。有关详细信息,请参阅 [agent team 令牌成本](/zh-CN/costs#agent-team-token-costs)。

324* **协调开销增加**:更多队友意味着更多通信、任务协调和潜在冲突

325* **收益递减**:超过一定点,额外的队友不会按比例加快工作

326 

327对于大多数工作流,从 3-5 个队友开始。这平衡了并行工作和可管理的协调。本指南中的示例使用 3-5 个队友,因为该范围在不同任务类型中效果很好。

328 

329每个队友有 5-6 个 [tasks](/zh-CN/agent-teams#architecture) 可以让每个人保持生产力,而不会过度的上下文切换。如果你有 15 个独立任务,3 个队友是一个很好的起点。

330 

331仅当工作真正受益于队友同时工作时才扩展。三个专注的队友通常胜过五个分散的队友。

332 

333### 适当调整任务大小

334 

335* **太小**:协调开销超过收益

336* **太大**:队友长时间工作而不进行检查,增加浪费努力的风险

337* **恰到好处**:自包含的单位,产生清晰的可交付成果,例如函数、测试文件或审查

338 

339<Tip>

340 负责人将工作分解为任务并自动分配给队友。如果它没有创建足够的任务,要求它将工作分成更小的部分。每个队友有 5-6 个任务可以让每个人保持生产力,并让负责人在有人卡住时重新分配工作。

341</Tip>

342 

343### 等待队友完成

344 

345有时负责人开始自己实施任务,而不是等待队友。如果你注意到这一点:

346 

347```text theme={null}

348Wait for your teammates to complete their tasks before proceeding

349```

350 

351### 从研究和审查开始

352 

353如果你是 agent teams 的新手,从具有明确边界且不需要编写代码的任务开始:审查 PR、研究库或调查错误。这些任务展示了并行探索的价值,而不会带来并行实施所带来的协调挑战。

354 

355### 避免文件冲突

356 

357两个队友编辑同一文件会导致覆盖。分解工作,使每个队友拥有不同的文件集。

358 

359### 监控和指导

360 

361检查队友的进度,重定向不起作用的方法,并在发现时综合发现。让团队无人值守运行太长时间会增加浪费努力的风险。

362 

363## 故障排除

364 

365### 队友未出现

366 

367如果在你要求 Claude 创建团队后队友没有出现:

368 

369* 在 in-process 模式中,队友可能已经在运行但不可见。按 Shift+Down 循环浏览活跃的队友。

370* 检查你给 Claude 的任务是否足够复杂以保证一个团队。Claude 根据任务决定是否生成队友。

371* 如果你明确要求分割窗格,请确保 tmux 已安装并在你的 PATH 中可用:

372 ```bash theme={null}

373 which tmux

374 ```

375* 对于 iTerm2,验证 `it2` CLI 已安装,并在 iTerm2 偏好设置中启用了 Python API。

376 

377### 过多权限提示

378 

379队友权限请求冒泡到负责人,这可能会造成摩擦。在生成队友之前,在你的 [权限设置](/zh-CN/permissions) 中预批准常见操作,以减少中断。

380 

381### 队友在错误后停止

382 

383队友可能在遇到错误后停止,而不是恢复。在 in-process 模式中使用 Shift+Down 或在分割模式中点击窗格来检查他们的输出,然后:

384 

385* 直接给他们额外的指示

386* 生成一个替代队友来继续工作

387 

388### 负责人在工作完成前关闭

389 

390负责人可能会在所有任务实际完成之前决定团队已完成。如果发生这种情况,告诉它继续。你也可以告诉负责人在继续之前等待队友完成,如果它开始做工作而不是委派。

391 

392### 孤立的 tmux 会话

393 

394如果 tmux 会话在团队结束后仍然存在,它可能没有被完全清理。列出会话并杀死由团队创建的会话:

395 

396```bash theme={null}

397tmux ls

398tmux kill-session -t <session-name>

399```

400 

401## 限制

402 

403Agent teams 是实验性的。需要注意的当前限制:

404 

405* **In-process 队友没有会话恢复**:`/resume` 和 `/rewind` 不会恢复 in-process 队友。恢复会话后,负责人可能会尝试向不再存在的队友发送消息。如果发生这种情况,告诉负责人生成新队友。

406* **任务状态可能滞后**:队友有时无法将任务标记为已完成,这会阻止依赖任务。如果任务似乎卡住,检查工作是否实际完成,并手动更新任务状态或告诉负责人推动队友。

407* **关闭可能很慢**:队友在关闭前完成他们的当前请求或工具调用,这可能需要时间。

408* **每个会话一个团队**:负责人一次只能管理一个团队。在启动新团队之前清理当前团队。

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

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

411* **权限在生成时设置**:所有队友从负责人的权限模式开始。你可以在生成后更改个别队友模式,但在生成时无法设置每个队友的模式。

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

413 

414<Tip>

415 **`CLAUDE.md` 正常工作**:队友从他们的工作目录读取 `CLAUDE.md` 文件。使用这个为所有队友提供项目特定的指导。

416</Tip>

417 

418## 后续步骤

419 

420探索用于并行工作和委派的相关方法:

421 

422* **轻量级委派**:[subagents](/zh-CN/sub-agents) 在你的会话中为研究或验证生成辅助代理,更适合不需要代理间协调的任务

423* **手动并行会话**:[Git worktrees](/zh-CN/common-workflows#run-parallel-claude-code-sessions-with-git-worktrees) 让你自己运行多个 Claude Code 会话,无需自动化团队协调

424* **比较方法**:有关并排分解,请参阅 [subagent vs agent team](/zh-CN/features-overview#compare-similar-features) 比较

amazon-bedrock.md +589 −0 created

Details

1> ## Documentation Index

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

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

4 

5# Amazon Bedrock 上的 Claude Code

6 

7> 了解如何通过 Amazon Bedrock 配置 Claude Code,包括设置、IAM 配置和故障排除。

8 

9export const ContactSalesCard = ({surface}) => {

10 const utm = content => `utm_source=claude_code&utm_medium=docs&utm_content=${surface}_${content}`;

11 const iconArrowRight = (size = 13) => <svg width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.5" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true">

12 <line x1="5" y1="12" x2="19" y2="12" />

13 <polyline points="12 5 19 12 12 19" />

14 </svg>;

15 const STYLES = `

16.cc-cs {

17 --cs-slate: #141413;

18 --cs-clay: #d97757;

19 --cs-clay-deep: #c6613f;

20 --cs-gray-000: #ffffff;

21 --cs-gray-700: #3d3d3a;

22 --cs-border-default: rgba(31, 30, 29, 0.15);

23 font-family: inherit;

24}

25.dark .cc-cs {

26 --cs-slate: #f0eee6;

27 --cs-gray-000: #262624;

28 --cs-gray-700: #bfbdb4;

29 --cs-border-default: rgba(240, 238, 230, 0.14);

30}

31.cc-cs-card {

32 display: flex; align-items: center; justify-content: space-between;

33 gap: 16px; padding: 14px 16px; margin: 0;

34 background: var(--cs-gray-000); border: 0.5px solid var(--cs-border-default);

35 border-radius: 8px; flex-wrap: wrap;

36}

37.cc-cs-text { font-size: 13px; color: var(--cs-gray-700); line-height: 1.5; flex: 1; min-width: 240px; }

38.cc-cs-text strong { font-weight: 550; color: var(--cs-slate); }

39.cc-cs-actions { display: flex; align-items: center; gap: 8px; flex-shrink: 0; }

40.cc-cs-btn-clay {

41 display: inline-flex; align-items: center; gap: 8px;

42 background: var(--cs-clay-deep); color: #fff; border: none;

43 border-radius: 8px; padding: 8px 14px;

44 font-size: 13px; font-weight: 500;

45 transition: background-color 0.15s; white-space: nowrap;

46}

47.cc-cs-btn-clay:hover { background: var(--cs-clay); }

48.cc-cs-btn-ghost {

49 display: inline-flex; align-items: center; gap: 8px;

50 background: transparent; color: var(--cs-gray-700);

51 border: 0.5px solid var(--cs-border-default);

52 border-radius: 8px; padding: 8px 14px;

53 font-size: 13px; font-weight: 500;

54}

55.cc-cs-btn-ghost:hover { background: rgba(0, 0, 0, 0.04); }

56.dark .cc-cs-btn-ghost:hover { background: rgba(255, 255, 255, 0.04); }

57@media (max-width: 720px) {

58 .cc-cs-actions { width: 100%; }

59}

60`;

61 return <div className="cc-cs not-prose">

62 <style>{STYLES}</style>

63 <div className="cc-cs-card">

64 <div className="cc-cs-text">

65 <strong>Deploying Claude Code across your organization?</strong> Talk to sales about enterprise plans, SSO, and centralized billing.

66 </div>

67 <div className="cc-cs-actions">

68 <a href={`https://claude.com/pricing?${utm('view_plans')}#plans-business`} className="cc-cs-btn-ghost">

69 View plans

70 </a>

71 <a href={`https://claude.com/contact-sales?${utm('contact_sales')}`} className="cc-cs-btn-clay">

72 Contact sales {iconArrowRight()}

73 </a>

74 </div>

75 </div>

76 </div>;

77};

78 

79export const Experiment = ({flag, treatment, children}) => {

80 const VID_KEY = 'exp_vid';

81 const CONSENT_COUNTRIES = new Set(['AT', 'BE', 'BG', 'HR', 'CY', 'CZ', 'DK', 'EE', 'FI', 'FR', 'DE', 'GR', 'HU', 'IE', 'IT', 'LV', 'LT', 'LU', 'MT', 'NL', 'PL', 'PT', 'RO', 'SK', 'SI', 'ES', 'SE', 'RE', 'GP', 'MQ', 'GF', 'YT', 'BL', 'MF', 'PM', 'WF', 'PF', 'NC', 'AW', 'CW', 'SX', 'FO', 'GL', 'AX', 'GB', 'UK', 'AI', 'BM', 'IO', 'VG', 'KY', 'FK', 'GI', 'MS', 'PN', 'SH', 'TC', 'GG', 'JE', 'IM', 'CA', 'BR', 'IN']);

82 const fnv1a = s => {

83 let h = 0x811c9dc5;

84 for (let i = 0; i < s.length; i++) {

85 h ^= s.charCodeAt(i);

86 h += (h << 1) + (h << 4) + (h << 7) + (h << 8) + (h << 24);

87 }

88 return h >>> 0;

89 };

90 const bucket = (seed, vid) => fnv1a(fnv1a(seed + vid) + '') % 10000 < 5000 ? 'control' : 'treatment';

91 const [decision] = useState(() => {

92 const params = new URLSearchParams(location.search);

93 const preBucketed = document.documentElement.dataset['gb_' + flag.replace(/-/g, '_')];

94 const force = params.get('gb-force');

95 if (force) {

96 for (const p of force.split(',')) {

97 const [k, v] = p.split(':');

98 if (k === flag) return {

99 variant: v || 'treatment',

100 track: false

101 };

102 }

103 }

104 if (navigator.globalPrivacyControl) {

105 return {

106 variant: 'control',

107 track: false

108 };

109 }

110 const prefsMatch = document.cookie.match(/(?:^|; )anthropic-consent-preferences=([^;]+)/);

111 if (prefsMatch) {

112 try {

113 if (JSON.parse(decodeURIComponent(prefsMatch[1])).analytics !== true) {

114 return {

115 variant: 'control',

116 track: false

117 };

118 }

119 } catch {

120 return {

121 variant: 'control',

122 track: false

123 };

124 }

125 } else {

126 const country = params.get('country')?.toUpperCase() || (document.cookie.match(/(?:^|; )cf_geo=([A-Z]{2})/) || [])[1];

127 if (!country || CONSENT_COUNTRIES.has(country)) {

128 return {

129 variant: 'control',

130 track: false

131 };

132 }

133 }

134 let vid;

135 try {

136 const ajsMatch = document.cookie.match(/(?:^|; )ajs_anonymous_id=([^;]+)/);

137 if (ajsMatch) {

138 vid = decodeURIComponent(ajsMatch[1]).replace(/^"|"$/g, '');

139 } else {

140 vid = localStorage.getItem(VID_KEY);

141 if (!vid) {

142 vid = crypto.randomUUID();

143 }

144 document.cookie = `ajs_anonymous_id=${vid}; domain=.claude.com; path=/; Secure; SameSite=Lax; max-age=31536000`;

145 }

146 try {

147 localStorage.setItem(VID_KEY, vid);

148 } catch {}

149 } catch {

150 return {

151 variant: 'control',

152 track: false

153 };

154 }

155 const variant = preBucketed === '1' ? 'treatment' : preBucketed === '0' ? 'control' : bucket(flag, vid);

156 return {

157 variant,

158 track: true,

159 vid

160 };

161 });

162 useEffect(() => {

163 if (!decision.track) return;

164 fetch('https://api.anthropic.com/api/event_logging/v2/batch', {

165 method: 'POST',

166 headers: {

167 'Content-Type': 'application/json',

168 'x-service-name': 'claude_code_docs'

169 },

170 body: JSON.stringify({

171 events: [{

172 event_type: 'GrowthbookExperimentEvent',

173 event_data: {

174 device_id: decision.vid,

175 anonymous_id: decision.vid,

176 timestamp: new Date().toISOString(),

177 experiment_id: flag,

178 variation_id: decision.variant === 'treatment' ? 1 : 0,

179 environment: 'production'

180 }

181 }]

182 }),

183 keepalive: true

184 }).catch(() => {});

185 }, []);

186 return decision.variant === 'treatment' ? treatment : children;

187};

188 

189<Experiment flag="docs-contact-sales-cta" treatment={<ContactSalesCard surface="bedrock" />} />

190 

191## 前置条件

192 

193在使用 Bedrock 配置 Claude Code 之前,请确保您拥有:

194 

195* 启用了 Bedrock 访问权限的 AWS 账户

196* 在 Bedrock 中访问所需的 Claude 模型(例如 Claude Sonnet 4.6)

197* 已安装并配置 AWS CLI(可选 - 仅在您没有其他获取凭证的机制时需要)

198* 适当的 IAM 权限

199 

200要使用您自己的 Bedrock 凭证登录,请按照下面的[使用 Bedrock 登录](#sign-in-with-bedrock)进行操作。要在团队中部署 Claude Code,请使用[手动设置](#set-up-manually)步骤并在推出前[固定您的模型版本](#4-pin-model-versions)。

201 

202## 使用 Bedrock 登录

203 

204如果您拥有 AWS 凭证并想开始通过 Bedrock 使用 Claude Code,登录向导会引导您完成整个过程。您每个账户完成一次 AWS 端的前置条件;向导处理 Claude Code 端。

205 

206<Steps>

207 <Step title="在您的 AWS 账户中启用 Anthropic 模型">

208 在 [Amazon Bedrock 控制台](https://console.aws.amazon.com/bedrock/)中,打开模型目录,选择一个 Anthropic 模型,并提交用例表单。提交后立即授予访问权限。有关 AWS Organizations,请参阅[提交用例详情](#1-submit-use-case-details),有关权限,请参阅 [IAM 配置](#iam-configuration)。

209 </Step>

210 

211 <Step title="启动 Claude Code 并选择 Bedrock">

212 运行 `claude`。在登录提示处,选择 **3rd-party platform**,然后选择 **Amazon Bedrock**。

213 </Step>

214 

215 <Step title="按照向导提示操作">

216 选择您如何向 AWS 进行身份验证:从您的 `~/.aws` 目录检测到的 AWS 配置文件、Bedrock API 密钥、访问密钥和密钥,或已在您的环境中的凭证。向导会获取您的区域,验证您的账户可以调用哪些 Claude 模型,并让您固定它们。它将结果保存到您的[用户设置文件](/zh-CN/settings)的 `env` 块中,因此您无需自己导出环境变量。

217 </Step>

218</Steps>

219 

220登录后,随时运行 `/setup-bedrock` 重新打开向导并更改您的凭证、区域或模型固定。

221 

222## 手动设置

223 

224要通过环境变量而不是向导配置 Bedrock,例如在 CI 或脚本化企业推出中,请按照下面的步骤操作。

225 

226### 1. 提交用例详情

227 

228Anthropic 模型的首次用户需要在调用模型之前提交用例详情。这是每个 AWS 账户执行一次的操作。

229 

2301. 确保您拥有下面描述的正确 IAM 权限

2312. 导航到 [Amazon Bedrock 控制台](https://console.aws.amazon.com/bedrock/)

2323. 从**模型目录**中选择一个 Anthropic 模型

2334. 完成用例表单。提交后立即授予访问权限。

234 

235如果您使用 AWS Organizations,您可以使用 [`PutUseCaseForModelAccess` API](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_PutUseCaseForModelAccess.html) 从管理账户提交一次表单。此调用需要 `bedrock:PutUseCaseForModelAccess` IAM 权限。批准自动扩展到子账户。

236 

237### 2. 配置 AWS 凭证

238 

239Claude Code 使用默认的 AWS SDK 凭证链。使用以下方法之一设置您的凭证:

240 

241**选项 A:AWS CLI 配置**

242 

243```bash theme={null}

244aws configure

245```

246 

247**选项 B:环境变量(访问密钥)**

248 

249```bash theme={null}

250export AWS_ACCESS_KEY_ID=your-access-key-id

251export AWS_SECRET_ACCESS_KEY=your-secret-access-key

252export AWS_SESSION_TOKEN=your-session-token

253```

254 

255**选项 C:环境变量(SSO 配置文件)**

256 

257```bash theme={null}

258aws sso login --profile=<your-profile-name>

259 

260export AWS_PROFILE=your-profile-name

261```

262 

263**选项 D:AWS 管理控制台凭证**

264 

265```bash theme={null}

266aws login

267```

268 

269[了解更多](https://docs.aws.amazon.com/signin/latest/userguide/command-line-sign-in.html)关于 `aws login`。

270 

271**选项 E:Bedrock API 密钥**

272 

273```bash theme={null}

274export AWS_BEARER_TOKEN_BEDROCK=your-bedrock-api-key

275```

276 

277Bedrock API 密钥提供了一种更简单的身份验证方法,无需完整的 AWS 凭证。[了解更多关于 Bedrock API 密钥](https://aws.amazon.com/blogs/machine-learning/accelerate-ai-development-with-amazon-bedrock-api-keys/)。

278 

279#### 高级凭证配置

280 

281Claude Code 支持 AWS SSO 和企业身份提供商的自动凭证刷新。将这些设置添加到您的 Claude Code 设置文件(请参阅[设置](/zh-CN/settings)了解文件位置)。

282 

283当 Claude Code 检测到您的 AWS 凭证已过期(基于本地时间戳或当 Bedrock 返回凭证错误时),它将自动运行您配置的 `awsAuthRefresh` 和/或 `awsCredentialExport` 命令来获取新凭证,然后重试请求。

284 

285##### 示例配置

286 

287```json theme={null}

288{

289 "awsAuthRefresh": "aws sso login --profile myprofile",

290 "env": {

291 "AWS_PROFILE": "myprofile"

292 }

293}

294```

295 

296##### 配置设置说明

297 

298**`awsAuthRefresh`**:用于修改 `.aws` 目录的命令,例如更新凭证、SSO 缓存或配置文件。命令的输出显示给用户,但不支持交互式输入。这适用于基于浏览器的 SSO 流,其中 CLI 显示 URL 或代码,您在浏览器中完成身份验证。

299 

300**`awsCredentialExport`**:仅在您无法修改 `.aws` 且必须直接返回凭证时使用。输出被静默捕获,不显示给用户。命令必须以此格式输出 JSON:

301 

302```json theme={null}

303{

304 "Credentials": {

305 "AccessKeyId": "value",

306 "SecretAccessKey": "value",

307 "SessionToken": "value"

308 }

309}

310```

311 

312### 3. 配置 Claude Code

313 

314设置以下环境变量以启用 Bedrock:

315 

316```bash theme={null}

317# 启用 Bedrock 集成

318export CLAUDE_CODE_USE_BEDROCK=1

319export AWS_REGION=us-east-1 # 或您首选的区域

320 

321# 可选:覆盖小型/快速模型 (Haiku) 的区域。

322# 也适用于 Bedrock Mantle。

323export ANTHROPIC_SMALL_FAST_MODEL_AWS_REGION=us-west-2

324 

325# 可选:覆盖 Bedrock 端点 URL 以用于自定义端点或网关

326# export ANTHROPIC_BEDROCK_BASE_URL=https://bedrock-runtime.us-east-1.amazonaws.com

327```

328 

329为 Claude Code 启用 Bedrock 时,请记住以下几点:

330 

331* `AWS_REGION` 是必需的环境变量。Claude Code 不会从 `.aws` 配置文件中读取此设置。

332* 使用 Bedrock 时,`/login` 和 `/logout` 命令被禁用,因为身份验证通过 AWS 凭证处理。

333* 您可以使用设置文件来处理环境变量,如 `AWS_PROFILE`,您不希望泄露给其他进程。请参阅[设置](/zh-CN/settings)了解更多信息。

334 

335### 4. 固定模型版本

336 

337<Warning>

338 在部署到多个用户时固定特定的模型版本。如果不固定,模型别名(如 `sonnet` 和 `opus`)会解析为最新版本,当 Anthropic 发布更新时,您的 Bedrock 账户中可能还没有该版本。Claude Code 在启动时会[回退](#startup-model-checks)到上一个版本(如果最新版本不可用),但固定让您可以控制用户何时迁移到新模型。

339</Warning>

340 

341将这些环境变量设置为特定的 Bedrock 模型 ID。

342 

343如果没有 `ANTHROPIC_DEFAULT_OPUS_MODEL`,Bedrock 上的 `opus` 别名会解析为 Opus 4.6。将其设置为 Opus 4.7 ID 以使用最新模型:

344 

345```bash theme={null}

346export ANTHROPIC_DEFAULT_OPUS_MODEL='us.anthropic.claude-opus-4-7'

347export ANTHROPIC_DEFAULT_SONNET_MODEL='us.anthropic.claude-sonnet-4-6'

348export ANTHROPIC_DEFAULT_HAIKU_MODEL='us.anthropic.claude-haiku-4-5-20251001-v1:0'

349```

350 

351这些变量使用跨区域推理配置文件 ID(带有 `us.` 前缀)。如果您使用不同的区域前缀或应用推理配置文件,请相应调整。有关当前和旧版模型 ID,请参阅[模型概览](https://platform.claude.com/docs/en/about-claude/models/overview)。请参阅[模型配置](/zh-CN/model-config#pin-models-for-third-party-deployments)了解完整的环境变量列表。

352 

353当未设置固定变量时,Claude Code 使用这些默认模型:

354 

355| 模型类型 | 默认值 |

356| :------ | :--------------------------------------------- |

357| 主模型 | `us.anthropic.claude-sonnet-4-5-20250929-v1:0` |

358| 小型/快速模型 | `us.anthropic.claude-haiku-4-5-20251001-v1:0` |

359 

360要进一步自定义模型,请使用以下方法之一:

361 

362```bash theme={null}

363# 使用推理配置文件 ID

364export ANTHROPIC_MODEL='global.anthropic.claude-sonnet-4-6'

365export ANTHROPIC_DEFAULT_HAIKU_MODEL='us.anthropic.claude-haiku-4-5-20251001-v1:0'

366 

367# 使用应用推理配置文件 ARN

368export ANTHROPIC_MODEL='arn:aws:bedrock:us-east-2:your-account-id:application-inference-profile/your-model-id'

369 

370# 可选:如果需要,禁用 prompt caching

371export DISABLE_PROMPT_CACHING=1

372 

373# 可选:请求 1 小时 prompt cache TTL 而不是 5 分钟默认值

374export ENABLE_PROMPT_CACHING_1H=1

375```

376 

377<Note>[Prompt caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching) 可能在所有区域都不可用。具有 1 小时 TTL 的缓存写入的计费费率高于 5 分钟写入。</Note>

378 

379#### 将每个模型版本映射到推理配置文件

380 

381`ANTHROPIC_DEFAULT_*_MODEL` 环境变量为每个模型系列配置一个推理配置文件。如果您的组织需要在 `/model` 选择器中公开同一系列的多个版本,每个版本路由到其自己的应用推理配置文件 ARN,请改用[设置文件](/zh-CN/settings#settings-files)中的 `modelOverrides` 设置。

382 

383此示例将四个 Opus 版本映射到不同的 ARN,以便用户可以在它们之间切换,而无需绕过您组织的推理配置文件:

384 

385```json theme={null}

386{

387 "modelOverrides": {

388 "claude-opus-4-7": "arn:aws:bedrock:us-east-2:123456789012:application-inference-profile/opus-47-prod",

389 "claude-opus-4-6": "arn:aws:bedrock:us-east-2:123456789012:application-inference-profile/opus-46-prod",

390 "claude-opus-4-5-20251101": "arn:aws:bedrock:us-east-2:123456789012:application-inference-profile/opus-45-prod",

391 "claude-opus-4-1-20250805": "arn:aws:bedrock:us-east-2:123456789012:application-inference-profile/opus-41-prod"

392 }

393}

394```

395 

396当用户在 `/model` 中选择其中一个版本时,Claude Code 使用映射的 ARN 调用 Bedrock。没有覆盖的版本回退到内置的 Bedrock 模型 ID 或启动时发现的任何匹配推理配置文件。请参阅[按版本覆盖模型 ID](/zh-CN/model-config#override-model-ids-per-version)了解覆盖如何与 `availableModels` 和其他模型设置交互的详情。

397 

398## 启动模型检查

399 

400当 Claude Code 启动并配置了 Bedrock 时,它会验证它打算使用的模型在您的账户中是否可访问。此检查需要 Claude Code v2.1.94 或更高版本。

401 

402如果您固定了一个比当前 Claude Code 默认值更旧的模型版本,并且您的账户可以调用较新版本,Claude Code 会提示您更新固定。接受会将新模型 ID 写入您的[用户设置文件](/zh-CN/settings)并重启 Claude Code。拒绝会被记住,直到下一个默认版本更改。指向[应用推理配置文件 ARN](#map-each-model-version-to-an-inference-profile) 的固定会被跳过,因为这些由您的管理员管理。

403 

404如果您没有固定模型,并且当前默认值在您的账户中不可用,Claude Code 会在当前会话中回退到上一个版本并显示通知。回退不会被持久化。在您的 Bedrock 账户中启用较新的模型或[固定一个版本](#4-pin-model-versions)以使选择永久化。

405 

406## IAM 配置

407 

408创建具有 Claude Code 所需权限的 IAM 策略:

409 

410```json theme={null}

411{

412 "Version": "2012-10-17",

413 "Statement": [

414 {

415 "Sid": "AllowModelAndInferenceProfileAccess",

416 "Effect": "Allow",

417 "Action": [

418 "bedrock:InvokeModel",

419 "bedrock:InvokeModelWithResponseStream",

420 "bedrock:ListInferenceProfiles",

421 "bedrock:GetInferenceProfile"

422 ],

423 "Resource": [

424 "arn:aws:bedrock:*:*:inference-profile/*",

425 "arn:aws:bedrock:*:*:application-inference-profile/*",

426 "arn:aws:bedrock:*:*:foundation-model/*"

427 ]

428 },

429 {

430 "Sid": "AllowMarketplaceSubscription",

431 "Effect": "Allow",

432 "Action": [

433 "aws-marketplace:ViewSubscriptions",

434 "aws-marketplace:Subscribe"

435 ],

436 "Resource": "*",

437 "Condition": {

438 "StringEquals": {

439 "aws:CalledViaLast": "bedrock.amazonaws.com"

440 }

441 }

442 }

443 ]

444}

445```

446 

447为了获得更严格的权限,您可以将资源限制为特定的推理配置文件 ARN。

448 

449`bedrock:GetInferenceProfile` 让 Claude Code 能够将[应用推理配置文件 ARN](#map-each-model-version-to-an-inference-profile) 解析为其支持的基础模型,该模型用于为该模型选择正确的请求形状。

450 

451如果令牌缺少此权限,Claude Code 会通过使用备用形状重试一次来自动恢复,因此请求仍然会成功,但每个新模型都会增加一个额外的往返。授予该权限可以避免重试。这最常适用于 `AWS_BEARER_TOKEN_BEDROCK` 部署,其中令牌的策略通常比完整的 IAM 角色更窄。

452 

453有关详情,请参阅 [Bedrock IAM 文档](https://docs.aws.amazon.com/bedrock/latest/userguide/security-iam.html)。

454 

455<Note>

456 为 Claude Code 创建一个专用的 AWS 账户,以简化成本跟踪和访问控制。

457</Note>

458 

459## 1M 令牌上下文窗口

460 

461Claude Opus 4.7、Opus 4.6 和 Sonnet 4.6 在 Amazon Bedrock 上支持 [1M 令牌上下文窗口](https://platform.claude.com/docs/en/build-with-claude/context-windows#1m-token-context-window)。当您选择 1M 模型变体时,Claude Code 会自动启用扩展上下文窗口。

462 

463[设置向导](#sign-in-with-bedrock)在固定模型时提供 1M 上下文选项。要为手动固定的模型启用它,请在模型 ID 后附加 `[1m]`。请参阅[为第三方部署固定模型](/zh-CN/model-config#pin-models-for-third-party-deployments)了解详情。

464 

465## AWS Guardrails

466 

467[Amazon Bedrock Guardrails](https://docs.aws.amazon.com/bedrock/latest/userguide/guardrails.html) 让您为 Claude Code 实现内容过滤。在 [Amazon Bedrock 控制台](https://console.aws.amazon.com/bedrock/)中创建 Guardrail,发布一个版本,然后将 Guardrail 标头添加到您的[设置文件](/zh-CN/settings)。如果您使用跨区域推理配置文件,请在您的 Guardrail 上启用跨区域推理。

468 

469示例配置:

470 

471```json theme={null}

472{

473 "env": {

474 "ANTHROPIC_CUSTOM_HEADERS": "X-Amzn-Bedrock-GuardrailIdentifier: your-guardrail-id\nX-Amzn-Bedrock-GuardrailVersion: 1"

475 }

476}

477```

478 

479## 使用 Mantle 端点

480 

481Mantle 是一个 Amazon Bedrock 端点,通过原生 Anthropic API 形状而不是 Bedrock Invoke API 提供 Claude 模型。它使用相同的 AWS 凭证、IAM 权限和本页面前面描述的 `awsAuthRefresh` 配置。

482 

483<Note>

484 Mantle 需要 Claude Code v2.1.94 或更高版本。运行 `claude --version` 来检查。

485</Note>

486 

487### 启用 Mantle

488 

489配置了 AWS 凭证后,设置 `CLAUDE_CODE_USE_MANTLE` 以将请求路由到 Mantle 端点:

490 

491```bash theme={null}

492export CLAUDE_CODE_USE_MANTLE=1

493export AWS_REGION=us-east-1

494```

495 

496Claude Code 从 `AWS_REGION` 构造端点 URL。要为自定义端点或网关覆盖它,请设置 `ANTHROPIC_BEDROCK_MANTLE_BASE_URL`。

497 

498在 Claude Code 内运行 `/status` 来确认。当 Mantle 处于活动状态时,提供者行显示 `Amazon Bedrock (Mantle)`。

499 

500### 选择 Mantle 模型

501 

502Mantle 使用以 `anthropic.` 为前缀且没有版本后缀的模型 ID,例如 `anthropic.claude-haiku-4-5`。您的账户可用的模型取决于您的组织被授予的内容;其他模型 ID 列在您来自 AWS 的入职材料中。联系您的 AWS 账户团队以请求访问允许列表中的模型。

503 

504使用 `--model` 标志或在 Claude Code 内使用 `/model` 设置模型:

505 

506```bash theme={null}

507claude --model anthropic.claude-haiku-4-5

508```

509 

510### 在 Invoke API 旁边运行 Mantle

511 

512您在 Mantle 上可用的模型可能不包括您今天使用的每个模型。设置 `CLAUDE_CODE_USE_BEDROCK` 和 `CLAUDE_CODE_USE_MANTLE` 让 Claude Code 从同一会话调用两个端点。与 Mantle 格式匹配的模型 ID 被路由到 Mantle,所有其他模型 ID 转到 Bedrock Invoke API。

513 

514```bash theme={null}

515export CLAUDE_CODE_USE_BEDROCK=1

516export CLAUDE_CODE_USE_MANTLE=1

517```

518 

519要在 `/model` 选择器中显示 Mantle 模型,请在您的[设置文件](/zh-CN/settings)中的 `availableModels` 中列出其 ID。此设置也将选择器限制为列出的条目,因此包括您想保持可用的每个别名:

520 

521```json theme={null}

522{

523 "availableModels": ["opus", "sonnet", "haiku", "anthropic.claude-haiku-4-5"]

524}

525```

526 

527带有 `anthropic.` 前缀的条目被添加为自定义选择器选项并路由到 Mantle。将 `anthropic.claude-haiku-4-5` 替换为您的账户被授予的模型 ID。请参阅[限制模型选择](/zh-CN/model-config#restrict-model-selection)了解 `availableModels` 如何与其他模型设置交互。

528 

529当两个提供商都处于活动状态时,`/status` 显示 `Amazon Bedrock + Amazon Bedrock (Mantle)`。

530 

531### 通过网关路由 Mantle

532 

533如果您的组织通过集中式 [LLM 网关](/zh-CN/llm-gateway)路由模型流量,该网关在服务器端注入 AWS 凭证,请禁用客户端身份验证,以便 Claude Code 发送没有 SigV4 签名或 `x-api-key` 标头的请求:

534 

535```bash theme={null}

536export CLAUDE_CODE_USE_MANTLE=1

537export CLAUDE_CODE_SKIP_MANTLE_AUTH=1

538export ANTHROPIC_BEDROCK_MANTLE_BASE_URL=https://your-gateway.example.com

539```

540 

541### Mantle 环境变量

542 

543这些变量特定于 Mantle 端点。请参阅[环境变量](/zh-CN/env-vars)了解完整列表。

544 

545| 变量 | 目的 |

546| :-------------------------------------- | :--------------------------------- |

547| `CLAUDE_CODE_USE_MANTLE` | 启用 Mantle 端点。设置为 `1` 或 `true`。 |

548| `ANTHROPIC_BEDROCK_MANTLE_BASE_URL` | 覆盖默认 Mantle 端点 URL |

549| `CLAUDE_CODE_SKIP_MANTLE_AUTH` | 跳过客户端身份验证以用于代理设置 |

550| `ANTHROPIC_SMALL_FAST_MODEL_AWS_REGION` | 覆盖 Haiku 类模型的 AWS 区域(与 Bedrock 共享) |

551 

552## 故障排除

553 

554### 使用 SSO 和企业代理的身份验证循环

555 

556如果在使用 AWS SSO 时浏览器标签页反复生成,请从您的[设置文件](/zh-CN/settings)中删除 `awsAuthRefresh` 设置。这可能发生在企业 VPN 或 TLS 检查代理中断 SSO 浏览器流时。Claude Code 将中断的连接视为身份验证失败,重新运行 `awsAuthRefresh`,并无限循环。

557 

558如果您的网络环境干扰自动基于浏览器的 SSO 流,请在启动 Claude Code 之前手动使用 `aws sso login`,而不是依赖 `awsAuthRefresh`。

559 

560### 区域问题

561 

562如果您遇到区域问题:

563 

564* 检查模型可用性:`aws bedrock list-inference-profiles --region your-region`

565* 切换到支持的区域:`export AWS_REGION=us-east-1`

566* 考虑使用推理配置文件进行跨区域访问

567 

568如果您收到错误"不支持按需吞吐量":

569 

570* 将模型指定为[推理配置文件](https://docs.aws.amazon.com/bedrock/latest/userguide/inference-profiles-support.html) ID

571 

572Claude Code 使用 Bedrock [Invoke API](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_InvokeModelWithResponseStream.html),不支持 Converse API。

573 

574### Mantle 端点错误

575 

576如果在设置 `CLAUDE_CODE_USE_MANTLE` 后 `/status` 没有显示 `Amazon Bedrock (Mantle)`,则该变量没有到达进程。确认它在您启动 `claude` 的 shell 中被导出,或在您的[设置文件](/zh-CN/settings)的 `env` 块中设置它。

577 

578来自 Mantle 端点的 `403`(具有有效凭证)意味着您的 AWS 账户没有被授予访问您请求的模型的权限。联系您的 AWS 账户团队以请求访问。

579 

580命名模型 ID 的 `400` 意味着该模型不在 Mantle 上提供。Mantle 有其自己的模型阵容,与标准 Bedrock 目录分开,因此推理配置文件 ID(如 `us.anthropic.claude-sonnet-4-6`)将不起作用。使用 Mantle 格式的 ID,或启用[两个端点](#run-mantle-alongside-the-invoke-api),以便 Claude Code 将每个请求路由到模型可用的端点。

581 

582## 其他资源

583 

584* [Bedrock 文档](https://docs.aws.amazon.com/bedrock/)

585* [Bedrock 定价](https://aws.amazon.com/bedrock/pricing/)

586* [Bedrock 推理配置文件](https://docs.aws.amazon.com/bedrock/latest/userguide/inference-profiles-support.html)

587* [Bedrock 令牌消耗和配额](https://docs.aws.amazon.com/bedrock/latest/userguide/quotas-token-burndown.html)

588* [Amazon Bedrock 上的 Claude Code:快速设置指南](https://community.aws/content/2tXkZKrZzlrlu0KfH8gST5Dkppq/claude-code-on-amazon-bedrock-quick-setup-guide)

589* [Claude Code 监控实现 (Bedrock)](https://github.com/aws-solutions-library-samples/guidance-for-claude-code-with-amazon-bedrock/blob/main/assets/docs/MONITORING.md)

analytics.md +224 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 使用分析跟踪团队使用情况

6 

7> 在分析仪表板中查看 Claude Code 使用指标、跟踪采用情况并衡量工程速度。

8 

9Claude Code 提供分析仪表板,帮助组织了解开发者使用模式、跟踪贡献指标,并衡量 Claude Code 对工程速度的影响。访问您计划的仪表板:

10 

11| 计划 | 仪表板 URL | 包含内容 | 了解更多 |

12| ----------------------------- | -------------------------------------------------------------------------- | ------------------------------ | ------------------------------------------------ |

13| Claude for Teams / Enterprise | [claude.ai/analytics/claude-code](https://claude.ai/analytics/claude-code) | 使用指标、带 GitHub 集成的贡献指标、排行榜、数据导出 | [详情](#access-analytics-for-teams-and-enterprise) |

14| API (Claude Console) | [platform.claude.com/claude-code](https://platform.claude.com/claude-code) | 使用指标、支出跟踪、团队洞察 | [详情](#access-analytics-for-api-customers) |

15 

16## 访问 Teams 和 Enterprise 分析

17 

18导航到 [claude.ai/analytics/claude-code](https://claude.ai/analytics/claude-code)。管理员和所有者可以查看仪表板。

19 

20Teams 和 Enterprise 仪表板包括:

21 

22* **使用指标**:接受的代码行数、建议接受率、日活跃用户和会话数

23* **贡献指标**:使用 Claude Code 协助的 PR 和已发布的代码行数,带有 [GitHub 集成](#enable-contribution-metrics)

24* **排行榜**:按 Claude Code 使用情况排名的顶级贡献者

25* **数据导出**:将贡献数据下载为 CSV 格式以进行自定义报告

26 

27### 启用贡献指标

28 

29<Note>

30 贡献指标处于公开测试版,可用于 Claude for Teams 和 Claude for Enterprise 计划。这些指标仅涵盖您 claude.ai 组织内的用户。通过 Claude Console API 或第三方集成的使用不包括在内。

31</Note>

32 

33使用和采用数据可用于所有 Claude for Teams 和 Claude for Enterprise 账户。贡献指标需要额外设置来连接您的 GitHub 组织。

34 

35您需要所有者角色来配置分析设置。GitHub 管理员必须安装 GitHub 应用。

36 

37<Warning>

38 启用了 [Zero Data Retention](/zh-CN/zero-data-retention) 的组织无法使用贡献指标。分析仪表板将仅显示使用指标。

39</Warning>

40 

41<Steps>

42 <Step title="安装 GitHub 应用">

43 GitHub 管理员在您组织的 GitHub 账户上安装 Claude GitHub 应用,地址为 [github.com/apps/claude](https://github.com/apps/claude)。

44 </Step>

45 

46 <Step title="启用 Claude Code 分析">

47 Claude 所有者导航到 [claude.ai/admin-settings/claude-code](https://claude.ai/admin-settings/claude-code) 并启用 Claude Code 分析功能。

48 </Step>

49 

50 <Step title="启用 GitHub 分析">

51 在同一页面上,启用"GitHub 分析"切换。

52 </Step>

53 

54 <Step title="使用 GitHub 进行身份验证">

55 完成 GitHub 身份验证流程并选择要包含在分析中的 GitHub 组织。

56 </Step>

57</Steps>

58 

59启用后,数据通常在 24 小时内出现,并进行每日更新。如果没有数据出现,您可能会看到以下消息之一:

60 

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

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

63 

64贡献指标支持 GitHub Cloud 和 GitHub Enterprise Server。

65 

66### 查看摘要指标

67 

68<Note>

69 这些指标故意保守,代表对 Claude Code 实际影响的低估。仅计算有高度信心涉及 Claude Code 的代码行和 PR。

70</Note>

71 

72仪表板在顶部显示这些摘要指标:

73 

74* **带 CC 的 PR**:包含至少一行使用 Claude Code 编写的代码的已合并拉取请求的总计数

75* **带 CC 的代码行**:所有已合并 PR 中使用 Claude Code 协助编写的代码行总数。仅计算"有效行":规范化后超过 3 个字符的行,不包括空行和仅包含括号或琐碎标点符号的行。

76* **带 Claude Code 的 PR (%)**:包含 Claude Code 协助代码的所有已合并 PR 的百分比

77* **建议接受率**:用户接受 Claude Code 代码编辑建议的次数百分比,包括 Edit、Write 和 NotebookEdit 工具使用

78* **接受的代码行**:Claude Code 编写且用户在其会话中接受的代码行总数。这不包括被拒绝的建议,也不跟踪后续删除。

79 

80### 探索图表

81 

82仪表板包括多个图表来可视化一段时间内的趋势。

83 

84#### 跟踪采用

85 

86采用图表显示每日使用趋势:

87 

88* **用户**:日活跃用户

89* **会话**:每天的活跃 Claude Code 会话数

90 

91#### 衡量每个用户的 PR

92 

93此图表显示一段时间内的个人开发者活动:

94 

95* **每个用户的 PR**:每天合并的 PR 总数除以日活跃用户

96* **用户**:日活跃用户

97 

98使用此功能了解随着 Claude Code 采用增加,个人生产力如何变化。

99 

100#### 查看拉取请求分解

101 

102拉取请求图表显示已合并 PR 的每日分解:

103 

104* **带 CC 的 PR**:包含 Claude Code 协助代码的拉取请求

105* **不带 CC 的 PR**:不包含 Claude Code 协助代码的拉取请求

106 

107切换到**代码行**视图以按代码行而不是 PR 计数查看相同的分解。

108 

109#### 查找顶级贡献者

110 

111排行榜显示按贡献量排名的前 10 个用户。在以下之间切换:

112 

113* **拉取请求**:显示每个用户的带 Claude Code 的 PR 与所有 PR

114* **代码行**:显示每个用户的带 Claude Code 的行与所有行

115 

116单击**导出所有用户**以将所有用户的完整贡献数据下载为 CSV 文件。导出包括所有用户,而不仅仅是显示的前 10 个。

117 

118### PR 归属

119 

120启用贡献指标后,Claude Code 会分析已合并的拉取请求,以确定哪些代码是使用 Claude Code 协助编写的。这是通过将 Claude Code 会话活动与每个 PR 中的代码进行匹配来完成的。

121 

122#### 标记标准

123 

124如果 PR 包含在 Claude Code 会话期间编写的至少一行代码,则将其标记为"带 Claude Code"。系统使用保守匹配:仅计算有高度信心涉及 Claude Code 的代码。

125 

126#### 归属过程

127 

128当拉取请求被合并时:

129 

1301. 从 PR diff 中提取添加的行

1312. 识别在时间窗口内编辑匹配文件的 Claude Code 会话

1323. 使用多种策略将 PR 行与 Claude Code 输出进行匹配

1334. 计算 AI 协助行和总行的指标

134 

135在比较之前,行被规范化:空格被修剪、多个空格被折叠、引号被标准化、文本被转换为小写。

136 

137包含 Claude Code 协助行的已合并拉取请求在 GitHub 中被标记为 `claude-code-assisted`。

138 

139#### 时间窗口

140 

141PR 合并日期前 21 天到后 2 天的会话被考虑用于归属匹配。

142 

143#### 排除的文件

144 

145某些文件会自动从分析中排除,因为它们是自动生成的:

146 

147* 锁定文件:package-lock.json、yarn.lock、Cargo.lock 等

148* 生成的代码:Protobuf 输出、构建工件、缩小的文件

149* 构建目录:dist/、build/、node\_modules/、target/

150* 测试夹具:快照、磁带、模拟数据

151* 超过 1,000 个字符的行,可能是缩小或生成的

152 

153#### 归属说明

154 

155在解释归属数据时,请记住这些额外的细节:

156 

157* 由开发者大幅重写的代码(差异超过 20%)不归属于 Claude Code

158* 不考虑 21 天窗口外的会话

159* 该算法在执行归属时不考虑 PR 源或目标分支

160 

161### 从分析中获得最大收益

162 

163使用贡献指标来展示 ROI、识别采用模式,并找到可以帮助他人入门的团队成员。

164 

165#### 监控采用

166 

167跟踪采用图表和用户计数以识别:

168 

169* 可以分享最佳实践的活跃用户

170* 整个组织的整体采用趋势

171* 可能表示摩擦或问题的使用下降

172 

173#### 衡量 ROI

174 

175贡献指标帮助回答"这个工具值得投资吗?",使用来自您自己代码库的数据:

176 

177* 随着采用增加,跟踪一段时间内每个用户的 PR 变化

178* 比较使用和不使用 Claude Code 发布的 PR 和代码行

179* 与 [DORA 指标](https://dora.dev/)、冲刺速度或其他工程 KPI 一起使用,以了解采用 Claude Code 的变化

180 

181#### 识别超级用户

182 

183排行榜帮助您找到具有高 Claude Code 采用率的团队成员,他们可以:

184 

185* 与团队分享提示技术和工作流

186* 提供关于什么运行良好的反馈

187* 帮助新用户入门

188 

189#### 以编程方式访问数据

190 

191要通过 GitHub 查询此数据,请搜索标记为 `claude-code-assisted` 的 PR。

192 

193## 访问 API 客户的分析

194 

195使用 Claude Console 的 API 客户可以在 [platform.claude.com/claude-code](https://platform.claude.com/claude-code) 访问分析。您需要 UsageView 权限来访问仪表板,该权限授予开发者、计费、管理员、所有者和主要所有者角色。

196 

197<Note>

198 贡献指标与 GitHub 集成目前不可用于 API 客户。Console 仪表板仅显示使用和支出指标。

199</Note>

200 

201Console 仪表板显示:

202 

203* **接受的代码行**:Claude Code 编写且用户在其会话中接受的代码行总数。这不包括被拒绝的建议,也不跟踪后续删除。

204* **建议接受率**:用户接受代码编辑工具使用的次数百分比,包括 Edit、Write 和 NotebookEdit 工具。

205* **活动**:图表上显示的日活跃用户和会话。

206* **支出**:每日 API 成本(美元)与用户计数一起显示。

207 

208### 查看团队洞察

209 

210团队洞察表显示每个用户的指标:

211 

212* **成员**:所有已向 Claude Code 进行身份验证的用户。API 密钥用户按密钥标识符显示,OAuth 用户按电子邮件地址显示。

213* **本月支出**:每个用户当前月份的 API 成本总计。

214* **本月代码行**:每个用户当前月份接受的代码行总数。

215 

216<Note>

217 Console 仪表板中的支出数字是用于分析目的的估计值。有关实际成本,请参阅您的计费页面。

218</Note>

219 

220## 相关资源

221 

222* [使用 OpenTelemetry 进行监控](/zh-CN/monitoring-usage):将实时指标和事件导出到您的可观测性堆栈

223* [有效管理成本](/zh-CN/costs):设置支出限制并优化令牌使用

224* [权限](/zh-CN/permissions):配置角色和权限

authentication.md +155 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 身份验证

6 

7> 登录 Claude Code 并为个人、团队和组织配置身份验证。

8 

9Claude Code 支持多种身份验证方法,具体取决于您的设置。个人用户可以使用 Claude.ai 账户登录,而团队可以使用 Claude for Teams 或 Enterprise、Claude Console 或云提供商(如 Amazon Bedrock、Google Vertex AI 或 Microsoft Foundry)。

10 

11## 登录 Claude Code

12 

13[安装 Claude Code](/zh-CN/setup#install-claude-code) 后,在终端中运行 `claude`。首次启动时,Claude Code 会打开浏览器窗口供您登录。

14 

15如果浏览器没有自动打开,请按 `c` 将登录 URL 复制到剪贴板,然后将其粘贴到浏览器中。

16 

17如果您的浏览器在您登录后显示登录代码而不是重定向回来,请将其粘贴到终端的 `Paste code here if prompted` 提示符处。这种情况在浏览器无法访问 Claude Code 的本地回调服务器时会发生,这在 WSL2、SSH 会话和容器中很常见。

18 

19您可以使用以下任何账户类型进行身份验证:

20 

21* **Claude Pro 或 Max 订阅**:使用您的 Claude.ai 账户登录。在 [claude.com/pricing](https://claude.com/pricing?utm_source=claude_code\&utm_medium=docs\&utm_content=authentication_pro_max) 订阅。

22* **Claude for Teams 或 Enterprise**:使用您的团队管理员邀请您的 Claude.ai 账户登录。

23* **Claude Console**:使用您的 Console 凭证登录。您的管理员必须先 [邀请您](#claude-console-authentication)。

24* **云提供商**:如果您的组织使用 [Amazon Bedrock](/zh-CN/amazon-bedrock)、[Google Vertex AI](/zh-CN/google-vertex-ai) 或 [Microsoft Foundry](/zh-CN/microsoft-foundry),请在运行 `claude` 之前设置所需的环境变量。不需要浏览器登录。

25 

26要登出并重新身份验证,请在 Claude Code 提示符处输入 `/logout`。

27 

28如果您在登录时遇到问题,请参阅 [身份验证故障排除](/zh-CN/troubleshoot-install#login-and-authentication)。

29 

30## 设置团队身份验证

31 

32对于团队和组织,您可以通过以下方式之一配置 Claude Code 访问:

33 

34* [Claude for Teams 或 Enterprise](#claude-for-teams-or-enterprise),推荐用于大多数团队

35* [Claude Console](#claude-console-authentication)

36* [Amazon Bedrock](/zh-CN/amazon-bedrock)

37* [Google Vertex AI](/zh-CN/google-vertex-ai)

38* [Microsoft Foundry](/zh-CN/microsoft-foundry)

39 

40### Claude for Teams 或 Enterprise

41 

42[Claude for Teams](https://claude.com/pricing?utm_source=claude_code\&utm_medium=docs\&utm_content=authentication_teams#team-&-enterprise) 和 [Claude for Enterprise](https://anthropic.com/contact-sales?utm_source=claude_code\&utm_medium=docs\&utm_content=authentication_enterprise) 为使用 Claude Code 的组织提供最佳体验。团队成员可以访问 Claude Code 和网络版 Claude,具有集中式计费和团队管理。

43 

44* **Claude for Teams**:自助服务计划,具有协作功能、管理工具和计费管理。最适合较小的团队。

45* **Claude for Enterprise**:添加 SSO、域名捕获、基于角色的权限、合规性 API 和托管策略设置,用于组织范围的 Claude Code 配置。最适合具有安全和合规性要求的大型组织。

46 

47<Steps>

48 <Step title="订阅">

49 订阅 [Claude for Teams](https://claude.com/pricing?utm_source=claude_code\&utm_medium=docs\&utm_content=authentication_teams_step#team-&-enterprise) 或联系销售部门了解 [Claude for Enterprise](https://anthropic.com/contact-sales?utm_source=claude_code\&utm_medium=docs\&utm_content=authentication_enterprise_step)。

50 </Step>

51 

52 <Step title="邀请团队成员">

53 从管理员仪表板邀请团队成员。

54 </Step>

55 

56 <Step title="安装并登录">

57 团队成员安装 Claude Code 并使用其 Claude.ai 账户登录。

58 </Step>

59</Steps>

60 

61### Claude Console 身份验证

62 

63对于偏好基于 API 的计费的组织,您可以通过 Claude Console 设置访问权限。

64 

65<Steps>

66 <Step title="创建或使用 Console 账户">

67 使用您现有的 Claude Console 账户或创建新账户。

68 </Step>

69 

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

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

72 

73 * 从 Console 内批量邀请用户:Settings -> Members -> Invite

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

75 </Step>

76 

77 <Step title="分配角色">

78 邀请用户时,分配以下角色之一:

79 

80 * **Claude Code** 角色:用户只能创建 Claude Code API 密钥

81 * **Developer** 角色:用户可以创建任何类型的 API 密钥

82 </Step>

83 

84 <Step title="用户完成设置">

85 每个受邀用户需要:

86 

87 * 接受 Console 邀请

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

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

90 * 使用 Console 账户凭证登录

91 </Step>

92</Steps>

93 

94### 云提供商身份验证

95 

96对于使用 Amazon Bedrock、Google Vertex AI 或 Microsoft Foundry 的团队:

97 

98<Steps>

99 <Step title="遵循提供商设置">

100 遵循 [Bedrock 文档](/zh-CN/amazon-bedrock)、[Vertex 文档](/zh-CN/google-vertex-ai) 或 [Microsoft Foundry 文档](/zh-CN/microsoft-foundry)。

101 </Step>

102 

103 <Step title="分发配置">

104 将环境变量和生成云凭证的说明分发给您的用户。阅读有关如何 [在此处管理配置](/zh-CN/settings) 的更多信息。

105 </Step>

106 

107 <Step title="安装 Claude Code">

108 用户可以 [安装 Claude Code](/zh-CN/setup#install-claude-code)。

109 </Step>

110</Steps>

111 

112## 凭证管理

113 

114Claude Code 安全地管理您的身份验证凭证:

115 

116* **存储位置**:在 macOS 上,凭证存储在加密的 macOS Keychain 中。在 Linux 和 Windows 上,凭证存储在 `~/.claude/.credentials.json` 中,或在设置了 `$CLAUDE_CONFIG_DIR` 变量的情况下存储在该变量下。在 Linux 上,文件以 `0600` 模式写入;在 Windows 上,它继承您的用户配置文件目录的访问控制。

117* **支持的身份验证类型**:Claude.ai 凭证、Claude API 凭证、Azure Auth、Bedrock Auth 和 Vertex Auth。

118* **自定义凭证脚本**:[`apiKeyHelper`](/zh-CN/settings#available-settings) 设置可以配置为运行返回 API 密钥的 shell 脚本。

119* **刷新间隔**:默认情况下,`apiKeyHelper` 在 5 分钟后或在 HTTP 401 响应时调用。设置 `CLAUDE_CODE_API_KEY_HELPER_TTL_MS` 环境变量以获得自定义刷新间隔。

120* **缓慢助手通知**:如果 `apiKeyHelper` 返回密钥需要超过 10 秒,Claude Code 会在提示栏中显示警告通知,显示经过的时间。如果您经常看到此通知,请检查您的凭证脚本是否可以优化。

121 

122`apiKeyHelper`、`ANTHROPIC_API_KEY` 和 `ANTHROPIC_AUTH_TOKEN` 仅适用于终端 CLI 会话。Claude Desktop 和远程会话仅使用 OAuth,不会调用 `apiKeyHelper` 或读取 API 密钥环境变量。

123 

124### 身份验证优先级

125 

126当存在多个凭证时,Claude Code 按以下顺序选择一个:

127 

1281. 云提供商凭证,当设置了 `CLAUDE_CODE_USE_BEDROCK`、`CLAUDE_CODE_USE_VERTEX` 或 `CLAUDE_CODE_USE_FOUNDRY` 时。有关设置,请参阅 [第三方集成](/zh-CN/third-party-integrations)。

1292. `ANTHROPIC_AUTH_TOKEN` 环境变量。作为 `Authorization: Bearer` 标头发送。当通过 [LLM 网关或代理](/zh-CN/llm-gateway) 进行路由时使用此选项,该网关或代理使用持有者令牌而不是 Anthropic API 密钥进行身份验证。

1303. `ANTHROPIC_API_KEY` 环境变量。作为 `X-Api-Key` 标头发送。用于直接 Anthropic API 访问,使用来自 [Claude Console](https://platform.claude.com) 的密钥。在交互模式下,系统会提示您一次批准或拒绝该密钥,您的选择会被记住。要稍后更改它,请使用 `/config` 中的"使用自定义 API 密钥"切换。在非交互模式(`-p`)下,当密钥存在时始终使用该密钥。

1314. [`apiKeyHelper`](/zh-CN/settings#available-settings) 脚本输出。用于动态或轮换凭证,例如从保管库获取的短期令牌。

1325. `CLAUDE_CODE_OAUTH_TOKEN` 环境变量。由 [`claude setup-token`](#generate-a-long-lived-token) 生成的长期 OAuth 令牌。用于 CI 管道和脚本,其中浏览器登录不可用。

1336. 来自 `/login` 的订阅 OAuth 凭证。这是 Claude Pro、Max、Team 和 Enterprise 用户的默认设置。

134 

135如果您有活跃的 Claude 订阅,但环境中也设置了 `ANTHROPIC_API_KEY`,则 API 密钥在批准后优先。如果密钥属于已禁用或过期的组织,这可能会导致身份验证失败。运行 `unset ANTHROPIC_API_KEY` 以回退到您的订阅,并检查 `/status` 以确认哪种方法处于活跃状态。

136 

137[Claude Code on the Web](/zh-CN/claude-code-on-the-web) 始终使用您的订阅凭证。沙箱环境中的 `ANTHROPIC_API_KEY` 和 `ANTHROPIC_AUTH_TOKEN` 不会覆盖它们。

138 

139### 生成长期令牌

140 

141对于 CI 管道、脚本或其他不可用交互式浏览器登录的环境,使用 `claude setup-token` 生成一年期 OAuth 令牌:

142 

143```bash theme={null}

144claude setup-token

145```

146 

147该命令会引导您完成 OAuth 授权并将令牌打印到终端。它不会将令牌保存在任何地方;复制它并将其设置为 `CLAUDE_CODE_OAUTH_TOKEN` 环境变量,无论您想在何处进行身份验证:

148 

149```bash theme={null}

150export CLAUDE_CODE_OAUTH_TOKEN=your-token

151```

152 

153此令牌使用您的 Claude 订阅进行身份验证,需要 Pro、Max、Team 或 Enterprise 计划。它的范围仅限于推理,无法建立 [Remote Control](/zh-CN/remote-control) 会话。

154 

155[Bare mode](/zh-CN/headless#start-faster-with-bare-mode) 不读取 `CLAUDE_CODE_OAUTH_TOKEN`。如果您的脚本传递 `--bare`,请改用 `ANTHROPIC_API_KEY` 或 `apiKeyHelper` 进行身份验证。

auto-mode-config.md +178 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 配置自动模式

6 

7> 告诉自动模式分类器您的组织信任哪些代码库、存储桶和域。设置环境上下文,覆盖默认的阻止和允许规则,并使用自动模式 CLI 子命令检查您的有效配置。

8 

9[自动模式](/zh-CN/permission-modes#eliminate-prompts-with-auto-mode)让 Claude Code 无需权限提示即可运行,通过将每个工具调用路由到一个分类器,该分类器会阻止任何不可逆、破坏性或针对您环境外的操作。使用 `autoMode` 设置块告诉该分类器您的组织信任哪些代码库、存储桶和域,以便它停止阻止常规内部操作。

10 

11<Note>

12 自动模式可通过 Anthropic API 在 Max、Team、Enterprise 和 API 计划上使用。它在 Pro 上或在 Bedrock、Vertex 或 Foundry 上不可用。如果 Claude Code 报告您的账户无法使用自动模式,请检查[完整要求](/zh-CN/permission-modes#eliminate-prompts-with-auto-mode),其中还涵盖了支持的模型和 Team 及 Enterprise 计划上的管理员启用。

13</Note>

14 

15开箱即用,分类器仅信任工作目录和当前代码库的已配置远程。推送到您公司的源代码控制组织或写入团队云存储桶等操作会被阻止,直到您将它们添加到 `autoMode.environment`。

16 

17有关如何启用自动模式以及它默认阻止什么的信息,请参阅[权限模式](/zh-CN/permission-modes#eliminate-prompts-with-auto-mode)。本页是配置参考。

18 

19本页涵盖以下内容:

20 

21* [选择在何处设置规则](#where-the-classifier-reads-configuration)跨 CLAUDE.md、用户设置和托管设置

22* [定义受信任的基础设施](#define-trusted-infrastructure)使用 `autoMode.environment`

23* [覆盖阻止和允许规则](#override-the-block-and-allow-rules)当默认值不适合您的管道时

24* [检查您的有效配置](#inspect-the-defaults-and-your-effective-config)使用 `claude auto-mode` 子命令

25* [查看拒绝](#review-denials)以便您知道接下来要添加什么

26 

27## 分类器读取配置的位置

28 

29分类器读取与 Claude 本身加载的相同的 [CLAUDE.md](/zh-CN/memory) 内容,因此您项目的 CLAUDE.md 中的"从不强制推送"之类的指令同时指导 Claude 和分类器。从那里开始了解项目约定和行为规则。

30 

31对于跨项目应用的规则,例如受信任的基础设施或组织范围的拒绝规则,请使用 `autoMode` 设置块。分类器从以下范围读取 `autoMode`:

32 

33| 范围 | 文件 | 用途 |

34| :------------------------- | :------------------------------------- | :----------------------- |

35| 一个开发者 | `~/.claude/settings.json` | 个人受信任的基础设施 |

36| 一个项目,一个开发者 | `.claude/settings.local.json` | 按项目的受信任存储桶或服务,gitignored |

37| 组织范围 | [托管设置](/zh-CN/server-managed-settings) | 分发给所有开发者的受信任基础设施 |

38| `--settings` 标志或 Agent SDK | 内联 JSON | 用于自动化的按调用覆盖 |

39 

40分类器不从 `.claude/settings.json` 中的共享项目设置读取 `autoMode`,因此已检入的代码库无法注入其自己的允许规则。

41 

42来自每个范围的条目被合并。开发者可以使用个人条目扩展 `environment`、`allow` 和 `soft_deny`,但无法删除托管设置提供的条目。因为允许规则在分类器内充当阻止规则的例外,开发者添加的 `allow` 条目可以覆盖组织 `soft_deny` 条目:组合是累加的,而不是硬策略边界。

43 

44<Note>

45 分类器是在[权限系统](/zh-CN/permissions)之后运行的第二道门。对于无论用户意图或分类器配置如何都必须永远不运行的操作,请在托管设置中使用 `permissions.deny`,它在咨询分类器之前阻止操作,无法被覆盖。

46</Note>

47 

48## 定义受信任的基础设施

49 

50对于大多数组织,`autoMode.environment` 是您唯一需要设置的字段。它告诉分类器哪些代码库、存储桶和域是受信任的:分类器使用它来决定"外部"的含义,因此任何未列出的目标都是潜在的数据泄露目标。

51 

52默认环境列表信任工作代码库及其配置的远程。要在该默认值旁边添加您自己的条目,请在数组中包含字面字符串 `"$defaults"`。默认条目会在该位置被拼接进去,因此您的自定义条目可以在它们之前或之后。

53 

54```json theme={null}

55{

56 "autoMode": {

57 "environment": [

58 "$defaults",

59 "Source control: github.example.com/acme-corp and all repos under it",

60 "Trusted cloud buckets: s3://acme-build-artifacts, gs://acme-ml-datasets",

61 "Trusted internal domains: *.corp.example.com, api.internal.example.com",

62 "Key internal services: Jenkins at ci.example.com, Artifactory at artifacts.example.com"

63 ]

64 }

65}

66```

67 

68条目是散文,不是正则表达式或工具模式。分类器将它们读作自然语言规则。按照您向新工程师描述基础设施的方式编写它们。一个全面的环境部分涵盖:

69 

70* **组织**:您的公司名称以及 Claude Code 的主要用途,例如软件开发、基础设施自动化或数据工程

71* **源代码控制**:您的开发者推送到的每个 GitHub、GitLab 或 Bitbucket 组织

72* **云提供商和受信任的存储桶**:Claude 应该能够读取和写入的存储桶名称或前缀

73* **受信任的内部域**:您网络内的 API、仪表板和服务的主机名,例如 `*.internal.example.com`

74* **关键内部服务**:CI、工件注册表、内部包索引、事件工具

75* **其他上下文**:受管制行业的约束、多租户基础设施或影响分类器应将什么视为风险的合规要求

76 

77一个有用的起始模板:填入括号中的字段并删除任何不适用的行。

78 

79```json theme={null}

80{

81 "autoMode": {

82 "environment": [

83 "$defaults",

84 "Organization: {COMPANY_NAME}. Primary use: {PRIMARY_USE_CASE, e.g. software development, infrastructure automation}",

85 "Source control: {SOURCE_CONTROL, e.g. GitHub org github.example.com/acme-corp}",

86 "Cloud provider(s): {CLOUD_PROVIDERS, e.g. AWS, GCP, Azure}",

87 "Trusted cloud buckets: {TRUSTED_BUCKETS, e.g. s3://acme-builds, gs://acme-datasets}",

88 "Trusted internal domains: {TRUSTED_DOMAINS, e.g. *.internal.example.com, api.example.com}",

89 "Key internal services: {SERVICES, e.g. Jenkins at ci.example.com, Artifactory at artifacts.example.com}",

90 "Additional context: {EXTRA, e.g. regulated industry, multi-tenant infrastructure, compliance requirements}"

91 ]

92 }

93}

94```

95 

96您提供的上下文越具体,分类器就越能区分常规内部操作和数据泄露尝试。

97 

98您不需要一次性填写所有内容。合理的推出方式:从默认值开始,添加您的源代码控制组织和关键内部服务,这解决了最常见的误报,例如推送到您自己的代码库。接下来添加受信任的域和云存储桶。当出现阻止时填写其余部分。

99 

100## 覆盖阻止和允许规则

101 

102两个额外的字段让您替换分类器的内置规则列表:`autoMode.soft_deny` 控制被阻止的内容,`autoMode.allow` 控制应用哪些例外。每个都是散文描述的数组,读作自然语言规则。没有 `autoMode.deny` 字段;要硬阻止一个操作而不管意图,请使用 [`permissions.deny`](/zh-CN/permissions),它在分类器之前运行。

103 

104在分类器内,优先级分为三个层级:

105 

106* `soft_deny` 规则首先阻止

107* `allow` 规则然后覆盖匹配的阻止作为例外

108* 明确的用户意图覆盖两者:如果用户的消息直接且具体地描述 Claude 即将采取的确切操作,分类器允许它,即使 `soft_deny` 规则匹配

109 

110一般请求不算作明确意图。要求 Claude"清理代码库"不授权强制推送,但要求 Claude"强制推送此分支"则授权。

111 

112要放松,当分类器重复标记默认例外不涵盖的常规模式时,添加到 `allow`。要收紧,为您的环境特定的风险添加到 `soft_deny`,默认值会遗漏。要保持内置规则同时添加您自己的规则,请在数组中包含字面字符串 `"$defaults"`。默认规则会在该位置拼接,因此您的自定义规则可以在它们之前或之后,并且当内置列表在版本发布中更改时,您继续继承更新。

113 

114```json theme={null}

115{

116 "autoMode": {

117 "environment": [

118 "$defaults",

119 "Source control: github.example.com/acme-corp and all repos under it"

120 ],

121 "allow": [

122 "$defaults",

123 "Deploying to the staging namespace is allowed: staging is isolated from production and resets nightly",

124 "Writing to s3://acme-scratch/ is allowed: ephemeral bucket with a 7-day lifecycle policy"

125 ],

126 "soft_deny": [

127 "$defaults",

128 "Never run database migrations outside the migrations CLI, even against dev databases",

129 "Never modify files under infra/terraform/prod/: production infrastructure changes go through the review workflow"

130 ]

131 }

132}

133```

134 

135<Danger>

136 设置 `environment`、`allow` 或 `soft_deny` 中的任何一个而不包含 `"$defaults"` 会替换该部分的整个默认列表。如果您设置 `soft_deny` 为单个条目并省略 `"$defaults"`,每个内置阻止规则都会被丢弃:强制推送、数据泄露、`curl | bash`、生产部署以及所有其他默认阻止规则都变为允许。仅在您打算完全拥有该列表时才省略 `"$defaults"`。在这种情况下,运行 `claude auto-mode defaults` 打印内置规则,将它们复制到您的设置文件中,然后根据您自己的管道和风险容限审查每条规则。

137</Danger>

138 

139每个部分独立评估,因此单独设置 `environment` 会保持默认 `allow` 和 `soft_deny` 列表完整。

140 

141## 检查默认值和您的有效配置

142 

143三个 CLI 子命令帮助您检查和验证您的配置。

144 

145将内置 `environment`、`allow` 和 `soft_deny` 规则打印为 JSON:

146 

147```bash theme={null}

148claude auto-mode defaults

149```

150 

151打印分类器实际使用的内容作为 JSON,应用您的设置(如果设置)或使用默认值:

152 

153```bash theme={null}

154claude auto-mode config

155```

156 

157获取关于您的自定义 `allow` 和 `soft_deny` 规则的 AI 反馈:

158 

159```bash theme={null}

160claude auto-mode critique

161```

162 

163保存设置后运行 `claude auto-mode config` 以确认有效规则是您期望的,其中 `"$defaults"` 已展开到位。如果您编写了自定义规则,`claude auto-mode critique` 会审查它们并标记模糊、冗余或可能导致误报的条目。如果您需要删除或重写内置规则而不是在其旁边添加,请将 `claude auto-mode defaults` 的输出保存到文件,编辑列表,并将结果粘贴到您的设置文件中以替换 `"$defaults"`。

164 

165## 查看拒绝

166 

167当自动模式拒绝工具调用时,拒绝被记录在 `/permissions` 下的"最近拒绝"选项卡中。在被拒绝的操作上按 `r` 将其标记为重试:当您退出对话框时,Claude Code 发送一条消息告诉模型它可能重试该工具调用并恢复对话。

168 

169对同一目标的重复拒绝通常意味着分类器缺少上下文。将该目标添加到 `autoMode.environment`,然后运行 `claude auto-mode config` 确认它生效。

170 

171要以编程方式对拒绝做出反应,请使用 [`PermissionDenied` hook](/zh-CN/hooks#permissiondenied)。

172 

173## 另请参阅

174 

175* [权限模式](/zh-CN/permission-modes#eliminate-prompts-with-auto-mode):自动模式是什么、它默认阻止什么以及如何启用它

176* [托管设置](/zh-CN/server-managed-settings):在您的组织中部署 `autoMode` 配置

177* [权限](/zh-CN/permissions):在分类器运行之前应用的允许、询问和拒绝规则

178* [设置](/zh-CN/settings):完整的设置参考,包括 `autoMode` 键

best-practices.md +583 −0 created

Details

1> ## Documentation Index

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

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

4 

5# Claude Code 最佳实践

6 

7> 从配置环境到跨并行会话扩展,充分利用 Claude Code 的提示和模式。

8 

9Claude Code 是一个代理式编码环境。与等待回答问题的聊天机器人不同,Claude Code 可以读取你的文件、运行命令、进行更改,并在你观看、重定向或完全离开的情况下自主解决问题。

10 

11这改变了你的工作方式。与其自己编写代码并要求 Claude 审查,不如描述你想要什么,让 Claude 弄清楚如何构建它。Claude 会探索、规划和实现。

12 

13但这种自主性仍然伴随着学习曲线。Claude 在某些约束条件下工作,你需要理解这些约束。

14 

15本指南涵盖了在 Anthropic 内部团队和在各种代码库、语言和环境中使用 Claude Code 的工程师中已被证明有效的模式。有关代理循环如何在幕后工作的信息,请参阅 [Claude Code 如何工作](/zh-CN/how-claude-code-works)。

16 

17***

18 

19大多数最佳实践都基于一个约束:Claude 的 context window 填充速度很快,随着填充,性能会下降。

20 

21Claude 的 context window 保存你的整个对话,包括每条消息、Claude 读取的每个文件和每个命令输出。但这可能会很快填满。单个调试会话或代码库探索可能会生成并消耗数万个 token。

22 

23这很重要,因为当 context 填充时,LLM 性能会下降。当 context window 即将满时,Claude 可能会开始"遗忘"早期的指令或犯更多错误。context window 是最重要的资源。要查看会话在实践中如何填充,请 [观看交互式演练](/zh-CN/context-window),了解启动时加载的内容以及每个文件读取的成本。使用 [自定义状态行](/zh-CN/statusline) 持续跟踪 context 使用情况,并查看 [减少 token 使用](/zh-CN/costs#reduce-token-usage) 了解减少 token 使用的策略。

24 

25***

26 

27## 给 Claude 一种验证其工作的方式

28 

29<Tip>

30 包括测试、屏幕截图或预期输出,以便 Claude 可以检查自己。这是你能做的最高杠杆的事情。

31</Tip>

32 

33当 Claude 能够验证自己的工作时,例如运行测试、比较屏幕截图和验证输出,它的表现会显著提高。

34 

35没有明确的成功标准,它可能会产生看起来正确但实际上不起作用的东西。你成为唯一的反馈循环,每个错误都需要你的关注。

36 

37| 策略 | 之前 | 之后 |

38| ----------------- | ------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |

39| **提供验证标准** | *"实现一个验证电子邮件地址的函数"* | *"编写一个 validateEmail 函数。示例测试用例:[user@example.com](mailto:user@example.com) 为真,invalid 为假,[user@.com](mailto:user@.com) 为假。实现后运行测试"* |

40| **以视觉方式验证 UI 更改** | *"让仪表板看起来更好"* | *"\[粘贴屏幕截图] 实现此设计。对结果进行屏幕截图并与原始设计进行比较。列出差异并修复它们"* |

41| **解决根本原因,而不是症状** | *"构建失败"* | *"构建失败,出现此错误:\[粘贴错误]。修复它并验证构建成功。解决根本原因,不要抑制错误"* |

42 

43UI 更改可以使用 [Chrome 中的 Claude 扩展](/zh-CN/chrome) 进行验证。它在浏览器中打开新标签页,测试 UI,并迭代直到代码工作。

44 

45你的验证也可以是测试套件、linter 或检查输出的 Bash 命令。投资使你的验证非常可靠。

46 

47***

48 

49## 先探索,再规划,最后编码

50 

51<Tip>

52 将研究和规划与实现分开,以避免解决错误的问题。

53</Tip>

54 

55让 Claude 直接跳到编码可能会产生解决错误问题的代码。使用 [Plan Mode](/zh-CN/common-workflows#use-plan-mode-for-safe-code-analysis) 将探索与执行分开。

56 

57推荐的工作流有四个阶段:

58 

59<Steps>

60 <Step title="探索">

61 进入 Plan Mode。Claude 读取文件并回答问题,不进行任何更改。

62 

63 ```txt claude (Plan Mode) theme={null}

64 read /src/auth and understand how we handle sessions and login.

65 also look at how we manage environment variables for secrets.

66 ```

67 </Step>

68 

69 <Step title="规划">

70 要求 Claude 创建详细的实现计划。

71 

72 ```txt claude (Plan Mode) theme={null}

73 I want to add Google OAuth. What files need to change?

74 What's the session flow? Create a plan.

75 ```

76 

77 按 `Ctrl+G` 在文本编辑器中打开计划进行直接编辑,然后 Claude 继续。

78 </Step>

79 

80 <Step title="实现">

81 切换回 Normal Mode 并让 Claude 编码,根据其计划进行验证。

82 

83 ```txt claude (Normal Mode) theme={null}

84 implement the OAuth flow from your plan. write tests for the

85 callback handler, run the test suite and fix any failures.

86 ```

87 </Step>

88 

89 <Step title="提交">

90 要求 Claude 使用描述性消息进行提交并创建 PR。

91 

92 ```txt claude (Normal Mode) theme={null}

93 commit with a descriptive message and open a PR

94 ```

95 </Step>

96</Steps>

97 

98<Callout>

99 Plan Mode 很有用,但也增加了开销。

100 

101 对于范围明确且修复很小的任务(如修复拼写错误、添加日志行或重命名变量),要求 Claude 直接执行。

102 

103 当你对方法不确定、更改修改多个文件或你不熟悉被修改的代码时,规划最有用。如果你能用一句话描述 diff,跳过计划。

104</Callout>

105 

106***

107 

108## 在提示中提供具体的上下文

109 

110<Tip>

111 你的指令越精确,你需要的更正就越少。

112</Tip>

113 

114Claude 可以推断意图,但它不能读心术。引用特定文件、提及约束,并指出示例模式。

115 

116| 策略 | 之前 | 之后 |

117| ------------------------------- | ------------------------------------ | ------------------------------------------------------------------------------------------------------------------- |

118| **限定任务范围。** 指定哪个文件、什么场景和测试偏好。 | *"为 foo.py 添加测试"* | *"为 foo.py 编写测试,涵盖用户已注销的边界情况。避免 mock。"* |

119| **指向来源。** 指导 Claude 到可以回答问题的来源。 | *"为什么 ExecutionFactory 有这样奇怪的 api?"* | *"查看 ExecutionFactory 的 git 历史并总结其 api 是如何形成的"* |

120| **参考现有模式。** 指向代码库中的模式。 | *"添加日历小部件"* | *"查看主页上现有小部件的实现方式以了解模式。HotDogWidget.php 是一个很好的例子。按照模式实现一个新的日历小部件,让用户选择月份并向前/向后分页以选择年份。从头开始构建,除了代码库中已使用的库外,不使用其他库。"* |

121| **描述症状。** 提供症状、可能的位置以及"修复"的样子。 | *"修复登录错误"* | *"用户报告会话超时后登录失败。检查 src/auth/ 中的身份验证流程,特别是 token 刷新。编写一个失败的测试来重现问题,然后修复它"* |

122 

123当你在探索并能够改正方向时,模糊的提示可能很有用。像 `"你会改进这个文件的什么?"` 这样的提示可以表面你不会想到要问的东西。

124 

125### 提供丰富的内容

126 

127<Tip>

128 使用 `@` 引用文件、粘贴屏幕截图/图像或直接管道数据。

129</Tip>

130 

131你可以通过多种方式向 Claude 提供丰富的数据:

132 

133* **使用 `@` 引用文件**,而不是描述代码的位置。Claude 在响应前读取文件。

134* **直接粘贴图像**。复制/粘贴或拖放图像到提示中。

135* **提供 URL** 用于文档和 API 参考。使用 `/permissions` 来允许列表经常使用的域。

136* **管道数据** 通过运行 `cat error.log | claude` 直接发送文件内容。

137* **让 Claude 获取它需要的东西**。告诉 Claude 使用 Bash 命令、MCP 工具或通过读取文件来自己拉取上下文。

138 

139***

140 

141## 配置你的环境

142 

143一些设置步骤使 Claude Code 在所有会话中显著更有效。有关扩展功能的完整概述和何时使用每个功能,请参阅 [扩展 Claude Code](/zh-CN/features-overview)。

144 

145### 编写有效的 CLAUDE.md

146 

147<Tip>

148 运行 `/init` 根据你的当前项目结构生成启动 CLAUDE.md 文件,然后随时间精化。

149</Tip>

150 

151CLAUDE.md 是一个特殊文件,Claude 在每次对话开始时读取。包括 Bash 命令、代码风格和工作流规则。这给 Claude 提供了它无法从代码中推断的持久上下文。

152 

153`/init` 命令分析你的代码库以检测构建系统、测试框架和代码模式,为你提供坚实的基础来精化。

154 

155CLAUDE.md 文件没有必需的格式,但保持简短和易读。例如:

156 

157```markdown CLAUDE.md theme={null}

158# Code style

159- Use ES modules (import/export) syntax, not CommonJS (require)

160- Destructure imports when possible (eg. import { foo } from 'bar')

161 

162# Workflow

163- Be sure to typecheck when you're done making a series of code changes

164- Prefer running single tests, and not the whole test suite, for performance

165```

166 

167CLAUDE.md 在每个会话中加载,所以只包括广泛适用的东西。对于仅有时相关的域知识或工作流,改用 [skills](/zh-CN/skills)。Claude 按需加载它们,不会使每次对话都膨胀。

168 

169保持简洁。对于每一行,问自己:*"删除这个会导致 Claude 犯错吗?"* 如果不会,删除它。膨胀的 CLAUDE.md 文件会导致 Claude 忽略你的实际指令!

170 

171| ✅ 包括 | ❌ 排除 |

172| -------------------- | ----------------------- |

173| Claude 无法猜测的 Bash 命令 | Claude 可以通过读取代码弄清楚的任何东西 |

174| 与默认值不同的代码风格规则 | Claude 已经知道的标准语言约定 |

175| 测试指令和首选测试运行器 | 详细的 API 文档(改为链接到文档) |

176| 存储库礼仪(分支命名、PR 约定) | 经常变化的信息 |

177| 特定于你的项目的架构决策 | 长解释或教程 |

178| 开发者环境怪癖(必需的环境变量) | 自明的实践,如"编写干净的代码" |

179| 常见陷阱或非显而易见的行为 | 文件逐个描述代码库 |

180 

181如果 Claude 继续做你不想要的事情,尽管有反对的规则,该文件可能太长,规则被遗漏了。如果 Claude 问你在 CLAUDE.md 中回答的问题,措辞可能不明确。像对待代码一样对待 CLAUDE.md:当事情出错时审查它,定期修剪它,并通过观察 Claude 的行为是否实际改变来测试更改。

182 

183你可以通过添加强调(例如"IMPORTANT"或"YOU MUST")来调整指令以改进遵守。将文件检入 git,以便你的团队可以贡献。该文件随时间增加价值。

184 

185CLAUDE.md 文件可以使用 `@path/to/import` 语法导入其他文件:

186 

187```markdown CLAUDE.md theme={null}

188See @README.md for project overview and @package.json for available npm commands.

189 

190# Additional Instructions

191- Git workflow: @docs/git-instructions.md

192- Personal overrides: @~/.claude/my-project-instructions.md

193```

194 

195你可以在多个位置放置 CLAUDE.md 文件:

196 

197* **主文件夹(`~/.claude/CLAUDE.md`)**:适用于所有 Claude 会话

198* **项目根目录(`./CLAUDE.md`)**:检入 git 以与你的团队共享

199* **项目根目录(`./CLAUDE.local.md`)**:个人项目特定的笔记;将此文件添加到你的 `.gitignore`,以便它不会与你的团队共享

200* **父目录**:对于 monorepos 有用,其中 `root/CLAUDE.md` 和 `root/foo/CLAUDE.md` 都会自动拉入

201* **子目录**:当处理这些目录中的文件时,Claude 按需拉入子 CLAUDE.md 文件

202 

203### 配置权限

204 

205<Tip>

206 使用 [auto mode](/zh-CN/permission-modes#eliminate-prompts-with-auto-mode) 让分类器处理批准,使用 `/permissions` 来允许列表特定命令,或使用 `/sandbox` 进行操作系统级隔离。每种方式都减少中断,同时让你保持控制。

207</Tip>

208 

209默认情况下,Claude Code 请求可能修改你的系统的操作的权限:文件写入、Bash 命令、MCP 工具等。这是安全的但繁琐。在第十次批准后,你不是真的在审查,你只是点击通过。有三种方式来减少这些中断:

210 

211* **Auto mode**:一个单独的分类器模型审查命令并仅阻止看起来有风险的东西:范围升级、未知基础设施或由敌对内容驱动的操作。最适合当你信任任务的总体方向但不想点击通过每一步时

212* **权限允许列表**:允许你知道是安全的特定工具,如 `npm run lint` 或 `git commit`

213* **沙箱**:启用操作系统级隔离,限制文件系统和网络访问,允许 Claude 在定义的边界内更自由地工作

214 

215阅读更多关于 [权限模式](/zh-CN/permission-modes)、[权限规则](/zh-CN/permissions) 和 [沙箱](/zh-CN/sandboxing)。

216 

217### 使用 CLI 工具

218 

219<Tip>

220 告诉 Claude Code 在与外部服务交互时使用 CLI 工具,如 `gh`、`aws`、`gcloud` 和 `sentry-cli`。

221</Tip>

222 

223CLI 工具是与外部服务交互的最 context 高效的方式。如果你使用 GitHub,安装 `gh` CLI。Claude 知道如何使用它来创建问题、打开拉取请求和读取评论。没有 `gh`,Claude 仍然可以使用 GitHub API,但未认证的请求经常会触发速率限制。

224 

225Claude 也有效地学习它不知道的 CLI 工具。尝试像 `Use 'foo-cli-tool --help' to learn about foo tool, then use it to solve A, B, C.` 这样的提示。

226 

227### 连接 MCP 服务器

228 

229<Tip>

230 运行 `claude mcp add` 来连接外部工具,如 Notion、Figma 或你的数据库。

231</Tip>

232 

233使用 [MCP servers](/zh-CN/mcp),你可以要求 Claude 从问题跟踪器实现功能、查询数据库、分析监控数据、集成来自 Figma 的设计并自动化工作流。

234 

235### 设置 hooks

236 

237<Tip>

238 使用 hooks 来处理必须每次发生且没有例外的操作。

239</Tip>

240 

241[Hooks](/zh-CN/hooks-guide) 在 Claude 工作流中的特定点自动运行脚本。与 CLAUDE.md 指令不同,hooks 是确定性的,保证操作发生。

242 

243Claude 可以为你编写 hooks。尝试像 *"编写一个在每次文件编辑后运行 eslint 的 hook"* 或 *"编写一个阻止写入迁移文件夹的 hook"* 这样的提示。编辑 `.claude/settings.json` 直接配置 hooks,并运行 `/hooks` 来浏览配置的内容。

244 

245### 创建 skills

246 

247<Tip>

248 在 `.claude/skills/` 中创建 `SKILL.md` 文件,为 Claude 提供域知识和可重用工作流。

249</Tip>

250 

251[Skills](/zh-CN/skills) 使用特定于你的项目、团队或域的信息扩展 Claude 的知识。Claude 在相关时自动应用它们,或者你可以使用 `/skill-name` 直接调用它们。

252 

253通过向 `.claude/skills/` 添加带有 `SKILL.md` 的目录来创建 skill:

254 

255```markdown .claude/skills/api-conventions/SKILL.md theme={null}

256---

257name: api-conventions

258description: REST API design conventions for our services

259---

260# API Conventions

261- Use kebab-case for URL paths

262- Use camelCase for JSON properties

263- Always include pagination for list endpoints

264- Version APIs in the URL path (/v1/, /v2/)

265```

266 

267Skills 也可以定义你直接调用的可重复工作流:

268 

269```markdown .claude/skills/fix-issue/SKILL.md theme={null}

270---

271name: fix-issue

272description: Fix a GitHub issue

273disable-model-invocation: true

274---

275Analyze and fix the GitHub issue: $ARGUMENTS.

276 

2771. Use `gh issue view` to get the issue details

2782. Understand the problem described in the issue

2793. Search the codebase for relevant files

2804. Implement the necessary changes to fix the issue

2815. Write and run tests to verify the fix

2826. Ensure code passes linting and type checking

2837. Create a descriptive commit message

2848. Push and create a PR

285```

286 

287运行 `/fix-issue 1234` 来调用它。对于具有你想手动触发的副作用的工作流,使用 `disable-model-invocation: true`。

288 

289### 创建自定义 subagents

290 

291<Tip>

292 在 `.claude/agents/` 中定义专门的助手,Claude 可以委托给它们来处理隔离的任务。

293</Tip>

294 

295[Subagents](/zh-CN/sub-agents) 在自己的 context 中运行,拥有自己的一组允许的工具。它们对于读取许多文件或需要专门关注而不会使你的主对话混乱的任务很有用。

296 

297```markdown .claude/agents/security-reviewer.md theme={null}

298---

299name: security-reviewer

300description: Reviews code for security vulnerabilities

301tools: Read, Grep, Glob, Bash

302model: opus

303---

304You are a senior security engineer. Review code for:

305- Injection vulnerabilities (SQL, XSS, command injection)

306- Authentication and authorization flaws

307- Secrets or credentials in code

308- Insecure data handling

309 

310Provide specific line references and suggested fixes.

311```

312 

313明确告诉 Claude 使用 subagents:*"使用 subagent 来审查此代码的安全问题。"*

314 

315### 安装 plugins

316 

317<Tip>

318 运行 `/plugin` 来浏览市场。Plugins 添加 skills、工具和集成,无需配置。

319</Tip>

320 

321[Plugins](/zh-CN/plugins) 将 skills、hooks、subagents 和 MCP 服务器捆绑到来自社区和 Anthropic 的单个可安装单元中。如果你使用类型化语言,安装 [代码智能 plugin](/zh-CN/discover-plugins#code-intelligence) 来为 Claude 提供精确的符号导航和编辑后的自动错误检测。

322 

323有关在 skills、subagents、hooks 和 MCP 之间选择的指导,请参阅 [扩展 Claude Code](/zh-CN/features-overview#match-features-to-your-goal)。

324 

325***

326 

327## 有效沟通

328 

329你与 Claude Code 沟通的方式显著影响结果的质量。

330 

331### 提出代码库问题

332 

333<Tip>

334 问 Claude 你会问资深工程师的问题。

335</Tip>

336 

337当加入新代码库时,使用 Claude Code 进行学习和探索。你可以问 Claude 你会问另一个工程师的相同类型的问题:

338 

339* 日志如何工作?

340* 我如何创建新的 API 端点?

341* `foo.rs` 第 134 行的 `async move { ... }` 做什么?

342* `CustomerOnboardingFlowImpl` 处理哪些边界情况?

343* 为什么这段代码在第 333 行调用 `foo()` 而不是 `bar()`?

344 

345以这种方式使用 Claude Code 是一个有效的入职工作流,改进了加入时间并减少了对其他工程师的负担。无需特殊提示:直接提问。

346 

347### 让 Claude 采访你

348 

349<Tip>

350 对于更大的功能,让 Claude 先采访你。从最小的提示开始,要求 Claude 使用 `AskUserQuestion` 工具采访你。

351</Tip>

352 

353Claude 会问你可能还没有考虑过的东西,包括技术实现、UI/UX、边界情况和权衡。

354 

355```text theme={null}

356I want to build [brief description]. Interview me in detail using the AskUserQuestion tool.

357 

358Ask about technical implementation, UI/UX, edge cases, concerns, and tradeoffs. Don't ask obvious questions, dig into the hard parts I might not have considered.

359 

360Keep interviewing until we've covered everything, then write a complete spec to SPEC.md.

361```

362 

363一旦规范完成,启动新会话来执行它。新会话有干净的 context,完全专注于实现,你有一个书面规范可以参考。

364 

365***

366 

367## 管理你的会话

368 

369对话是持久的和可逆的。利用这一点!

370 

371### 尽早且经常改正方向

372 

373<Tip>

374 一旦你注意到 Claude 偏离轨道,立即改正它。

375</Tip>

376 

377最好的结果来自紧密的反馈循环。虽然 Claude 有时会在第一次尝试时完美地解决问题,但快速改正它通常会更快地产生更好的解决方案。

378 

379* **`Esc`**:使用 `Esc` 键在中途停止 Claude。Context 被保留,所以你可以重定向。

380* **`Esc + Esc` 或 `/rewind`**:按 `Esc` 两次或运行 `/rewind` 来打开 rewind 菜单并恢复之前的对话和代码状态,或从选定的消息进行总结。

381* **`"撤销那个"`**:让 Claude 恢复其更改。

382* **`/clear`**:在不相关的任务之间重置 context。长会话与无关的 context 可能会降低性能。

383 

384如果你在一个会话中对同一问题改正了 Claude 两次以上,context 就充满了失败的方法。运行 `/clear` 并使用更具体的提示重新开始,该提示包含你学到的东西。干净的会话与更好的提示几乎总是优于长会话与累积的改正。

385 

386### 积极管理 context

387 

388<Tip>

389 在不相关的任务之间频繁运行 `/clear` 来重置 context。

390</Tip>

391 

392Claude Code 在你接近 context 限制时自动压缩对话历史,这保留了重要的代码和决策,同时释放空间。

393 

394在长会话中,Claude 的 context window 可能会充满无关的对话、文件内容和命令。这可能会降低性能,有时会分散 Claude 的注意力。

395 

396* 在任务之间频繁使用 `/clear` 来完全重置 context window

397* 当自动压缩触发时,Claude 总结最重要的东西,包括代码模式、文件状态和关键决策

398* 为了更多控制,运行 `/compact <instructions>`,如 `/compact Focus on the API changes`

399* 要仅压缩对话的一部分,使用 `Esc + Esc` 或 `/rewind`,选择消息检查点,并选择 **从这里总结**。这会压缩从该点开始的消息,同时保持早期 context 完整。

400* 在 CLAUDE.md 中使用像 `"When compacting, always preserve the full list of modified files and any test commands"` 这样的指令来自定义压缩行为,以确保关键 context 在总结中存活

401* 对于不需要留在 context 中的快速问题,使用 [`/btw`](/zh-CN/interactive-mode#side-questions-with-%2Fbtw)。答案出现在可关闭的覆盖层中,永远不会进入对话历史,所以你可以检查细节而不增加 context。

402 

403### 使用 subagents 进行调查

404 

405<Tip>

406 使用 `"use subagents to investigate X"` 委托研究。它们在单独的 context 中探索,为实现保持你的主对话干净。

407</Tip>

408 

409由于 context 是你的基本约束,subagents 是可用的最强大的工具之一。当 Claude 研究代码库时,它读取许多文件,所有这些都消耗你的 context。Subagents 在单独的 context windows 中运行并报告摘要:

410 

411```text theme={null}

412Use subagents to investigate how our authentication system handles token

413refresh, and whether we have any existing OAuth utilities I should reuse.

414```

415 

416subagent 探索代码库、读取相关文件并报告发现,所有这些都不会使你的主对话混乱。

417 

418你也可以在 Claude 实现某些东西后使用 subagents 进行验证:

419 

420```text theme={null}

421use a subagent to review this code for edge cases

422```

423 

424### 使用检查点进行 Rewind

425 

426<Tip>

427 Claude 进行的每个操作都会创建一个检查点。你可以将对话、代码或两者恢复到任何之前的检查点。

428</Tip>

429 

430Claude 在更改前自动检查点。双击 `Escape` 或运行 `/rewind` 来打开 rewind 菜单。你可以仅恢复对话、仅恢复代码、恢复两者或从选定的消息进行总结。有关详细信息,请参阅 [Checkpointing](/zh-CN/checkpointing)。

431 

432与其仔细规划每一步,你可以告诉 Claude 尝试一些冒险的事情。如果不起作用,rewind 并尝试不同的方法。检查点在会话中持续,所以你可以关闭你的终端并稍后仍然 rewind。

433 

434<Warning>

435 检查点仅跟踪 Claude 进行的更改,不跟踪外部进程。这不是 git 的替代品。

436</Warning>

437 

438### 恢复对话

439 

440<Tip>

441 运行 `claude --continue` 来继续你离开的地方,或 `--resume` 来从最近的会话中选择。

442</Tip>

443 

444Claude Code 在本地保存对话。当任务跨越多个会话时,你不必重新解释 context:

445 

446```bash theme={null}

447claude --continue # Resume the most recent conversation

448claude --resume # Select from recent conversations

449```

450 

451使用 `/rename` 给会话起描述性名称,如 `"oauth-migration"` 或 `"debugging-memory-leak"`,以便你稍后可以找到它们。像对待分支一样对待会话:不同的工作流可以有单独的、持久的 context。

452 

453***

454 

455## 自动化和扩展

456 

457一旦你对一个 Claude 有效,通过并行会话、非交互模式和扇出模式来增加你的输出。

458 

459到目前为止,一切都假设一个人、一个 Claude 和一个对话。但 Claude Code 水平扩展。本部分中的技术展示了你如何能做更多。

460 

461### 运行非交互模式

462 

463<Tip>

464 在 CI、pre-commit hooks 或脚本中使用 `claude -p "prompt"`。添加 `--output-format stream-json` 用于流式 JSON 输出。

465</Tip>

466 

467使用 `claude -p "your prompt"`,你可以非交互地运行 Claude,不需要会话。非交互模式是你将 Claude 集成到 CI 管道、pre-commit hooks 或任何自动化工作流中的方式。输出格式让你以编程方式解析结果:纯文本、JSON 或流式 JSON。

468 

469```bash theme={null}

470# One-off queries

471claude -p "Explain what this project does"

472 

473# Structured output for scripts

474claude -p "List all API endpoints" --output-format json

475 

476# Streaming for real-time processing

477claude -p "Analyze this log file" --output-format stream-json

478```

479 

480### 运行多个 Claude 会话

481 

482<Tip>

483 并行运行多个 Claude 会话以加快开发、运行隔离的实验或启动复杂的工作流。

484</Tip>

485 

486有三种主要方式来运行并行会话:

487 

488* [Claude Code 桌面应用](/zh-CN/desktop#work-in-parallel-with-sessions):以视觉方式管理多个本地会话。每个会话获得自己的隔离 worktree。

489* [Claude Code 在网络上](/zh-CN/claude-code-on-the-web):在 Anthropic 的安全云基础设施中的隔离 VM 上运行。

490* [Agent teams](/zh-CN/agent-teams):具有共享任务、消息和团队主管的多个会话的自动协调。

491 

492除了并行化工作,多个会话启用了质量关注的工作流。新鲜的 context 改进了代码审查,因为 Claude 不会偏向于它刚刚编写的代码。

493 

494例如,使用 Writer/Reviewer 模式:

495 

496| 会话 A(Writer) | 会话 B(Reviewer) |

497| -------------------------- | ------------------------------------------------------------------------- |

498| `为我们的 API 端点实现速率限制器` | |

499| | `审查 @src/middleware/rateLimiter.ts 中的速率限制器实现。查找边界情况、竞态条件和与我们现有中间件模式的一致性。` |

500| `这是审查反馈:[会话 B 输出]。解决这些问题。` | |

501 

502你可以用测试做类似的事情:让一个 Claude 编写测试,然后另一个编写代码来通过它们。

503 

504### 跨文件扇出

505 

506<Tip>

507 循环遍历任务,为每个调用 `claude -p`。使用 `--allowedTools` 来限定批量操作的权限。

508</Tip>

509 

510对于大型迁移或分析,你可以跨许多并行 Claude 调用分配工作:

511 

512<Steps>

513 <Step title="生成任务列表">

514 让 Claude 列出所有需要迁移的文件(例如,`list all 2,000 Python files that need migrating`)

515 </Step>

516 

517 <Step title="编写脚本来循环遍历列表">

518 ```bash theme={null}

519 for file in $(cat files.txt); do

520 claude -p "Migrate $file from React to Vue. Return OK or FAIL." \

521 --allowedTools "Edit,Bash(git commit *)"

522 done

523 ```

524 </Step>

525 

526 <Step title="在几个文件上测试,然后大规模运行">

527 根据前 2-3 个文件出错的情况精化你的提示,然后在完整集合上运行。`--allowedTools` 标志限制 Claude 能做什么,这在你无人值守运行时很重要。

528 </Step>

529</Steps>

530 

531你也可以将 Claude 集成到现有的数据/处理管道中:

532 

533```bash theme={null}

534claude -p "<your prompt>" --output-format json | your_command

535```

536 

537在开发期间使用 `--verbose` 进行调试,在生产中关闭它。

538 

539### 使用 auto mode 自主运行

540 

541为了不间断的执行和后台安全检查,使用 [auto mode](/zh-CN/permission-modes#eliminate-prompts-with-auto-mode)。分类器模型在命令运行前审查它们,阻止范围升级、未知基础设施和由敌对内容驱动的操作,同时让常规工作无提示进行。

542 

543```bash theme={null}

544claude --permission-mode auto -p "fix all lint errors"

545```

546 

547对于使用 `-p` 标志的非交互运行,如果分类器重复阻止操作,auto mode 会中止,因为没有用户可以回退到。请参阅 [auto mode 何时回退](/zh-CN/permission-modes#when-auto-mode-falls-back) 了解阈值。

548 

549***

550 

551## 避免常见失败模式

552 

553这些是常见的错误。尽早识别它们可以节省时间:

554 

555* **厨房水槽会话。** 你从一个任务开始,然后问 Claude 一些不相关的东西,然后回到第一个任务。Context 充满了无关的信息。

556 > **修复**:在不相关的任务之间 `/clear`。

557* **一次又一次地改正。** Claude 做错了什么,你改正它,它仍然是错的,你再改正。Context 被失败的方法污染。

558 > **修复**:在两次失败的改正后,`/clear` 并编写一个更好的初始提示,包含你学到的东西。

559* **过度指定的 CLAUDE.md。** 如果你的 CLAUDE.md 太长,Claude 会忽略一半,因为重要的规则在噪音中丢失。

560 > **修复**:无情地修剪。如果 Claude 已经在没有指令的情况下正确地做某事,删除它或将其转换为 hook。

561* **信任然后验证的差距。** Claude 产生一个看起来合理的实现,但不处理边界情况。

562 > **修复**:始终提供验证(测试、脚本、屏幕截图)。如果你不能验证它,不要发布它。

563* **无限探索。** 你要求 Claude "调查"某些东西而不限定范围。Claude 读取数百个文件,填充 context。

564 > **修复**:狭隘地限定调查或使用 subagents,以便探索不会消耗你的主 context。

565 

566***

567 

568## 培养你的直觉

569 

570本指南中的模式不是一成不变的。它们是通常效果很好的起点,但可能不是每种情况的最优选择。

571 

572有时你\_应该\_让 context 累积,因为你深入一个复杂的问题,历史很有价值。有时你应该跳过规划,让 Claude 弄清楚,因为任务是探索性的。有时模糊的提示正是你想要的,因为你想看看 Claude 如何解释问题,然后再限制它。

573 

574注意什么有效。当 Claude 产生很好的输出时,注意你做了什么:提示结构、你提供的 context、你所在的模式。当 Claude 遇到困难时,问为什么。Context 太嘈杂了吗?提示太模糊了吗?任务对于一次通过来说太大了吗?

575 

576随着时间的推移,你会培养没有指南能捕捉的直觉。你会知道何时具体,何时开放,何时规划,何时探索,何时清除 context,何时让它累积。

577 

578## 相关资源

579 

580* [Claude Code 如何工作](/zh-CN/how-claude-code-works):代理循环、工具和 context 管理

581* [扩展 Claude Code](/zh-CN/features-overview):skills、hooks、MCP、subagents 和 plugins

582* [常见工作流](/zh-CN/common-workflows):调试、测试、PR 等的分步配方

583* [CLAUDE.md](/zh-CN/memory):存储项目约定和持久 context

champion-kit.md +191 −0 created

Details

1> ## Documentation Index

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

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

4 

5# Champion kit

6 

7> 工程师在内部倡导 Claude Code 的行动手册:分享什么、如何回答问题以及如何在团队中推动采用。

8 

9本页面适用于已经在使用 Claude Code 并希望帮助团队采用它的个人工程师。它涵盖了要分享的内容、如何回答你将收到的问题、三十天行动计划以及对常见顾虑的回应。

10 

11开发者工具的采用很少是因为推出公告而发生的。它发生在团队中有人开始很好地使用该工具、公开谈论它,并使其他人容易跟随的时候。你作为倡导者所做的工作具有不成比例的效果:你分享的每个例子都会缩短后来工程师的学习曲线,你公开回答的每个问题都会将一个人的经验转化为整个团队可以建立的东西。你是在充当团队的倍增器,而不是帮助台,本指南的结构是为了保持这个角色在这些条件下的可持续性。

12 

13## 倡导者角色

14 

15该角色由三种相互强化的行为组成。

16 

17| 行为 | 实际表现 | 为什么重要 |

18| --------- | ----------------------------------------------- | --------------------------------------------------------- |

19| 分享你的发现 | 在你的团队已经阅读的地方发布提示、截图和小胜利,例如工程频道、站会线程或拉取请求描述。 | 从你自己的代码库中提取的例子比任何外部文档都更有说服力,因为同事可以看到该工具如何准确地应用于他们与你共享的问题。 |

20| 成为人们提问的对象 | 当同事问你如何完成某事时,用你实际使用的提示来回应,这样他们可以直接将其应用于自己的任务。 | 一个具体的、可运行的例子消除了好奇心和第一次成功使用之间的差距,这是大多数采用工作停滞的地方。 |

21| 扩大圈子 | 建立少量轻量级的、定期的习惯,例如专用频道或每周线程,这样即使你的注意力在别处,势头也会继续。 | 依赖于单个人的采用是脆弱的。由共享习惯承载的采用会继续自我复合。 |

22 

23大多数这些工作自然地适应你已经在做的工作中。区别在于对你的发现发布位置和你的答案如何传播的少量额外意图。

24 

25### 这应该花费你多少

26 

27与自己和你的主管设定期望。下面的活动旨在适应正常的工作周,该角色应该保持为你现有工作的倍增器,而不是额外的支持责任。

28 

29| 活动 | 每周时间 | 指导 |

30| ----------- | --------- | ------------------------------------------------------------ |

31| 发布胜利和提示 | 约 15 分钟 | 用截图和一两句话在当时捕捉这些;避免将它们变成正式的写作。 |

32| 在共享频道中回答问题 | 约 20 分钟 | 公开回答一次,然后当问题再次出现时链接回该答案。 |

33| 主持每周展示和讲述线程 | 约 5 分钟 | 你发布开场提示;团队提供内容。 |

34| 可选的配对或演练 | 0 到 30 分钟 | 为真正被阻挡的同事保留此项,并在安排时间之前提供 [Quickstart](/zh-CN/quickstart) 链接。 |

35 

36## 分享你的发现

37 

38你自己的经验是你的同事将遇到的最有说服力的材料,因为它特定于你们都共享的代码库、工作流和问题。文档告诉人们什么是可能的;你的帖子向他们展示在你的环境中实际工作的东西。

39 

40### 什么值得分享

41 

42最有用的帖子描述了同事明天可以重用的技术,而不是已经完成的结果。技术在团队中传播时会复合;状态更新则不会。

43 

44可重用技术的例子:

45 

46* "我了解到 @-提及目录有效。将其指向 `@src/components/` 并询问哪些缺少测试,这暴露了我忽略的两个。"

47* "Plan mode (`Shift+Tab`) 显示在进行任何编辑之前将触及哪些文件,这就是为什么我对在共享代码上使用它感到满意。"

48* "我配置了一个 Stop hook,以便在长任务完成时收到桌面通知。配置在线程中。"

49* "运行 `/init` 从存储库生成 `CLAUDE.md`,这样助手就不会再次询问我们的约定。"

50 

51### 在哪里分享

52 

53在你的团队已经阅读的地方发布。目标是将例子放在正常工作的路径中,而不是创建一个目的地。

54 

55| 位置 | 最适合 | 推荐格式 |

56| ---------------------- | --------------------------- | -------------------------------- |

57| `#claude-code` 或一般工程频道 | 发现、提示和"今天我学到"的时刻 | 一个截图,附带一两句上下文 |

58| 拉取请求描述 | 在审查者已经阅读的真实代码上演示该方法 | 一行,例如"Claude 和我做了这个重构;很乐意讲解该方法。" |

59| 站会或每周书面更新 | 与主管和跳级经理规范化使用 | 一句话描述一个具体的结果 |

60| 团队 wiki 或内部文档 | 持久的模式、自定义技能和 `CLAUDE.md` 示例 | 一个短页面,从频道主题链接,以便它保持可发现性 |

61 

62### 有效的格式

63 

64一个截图附带一行上下文,或简短的前后描述,通常是正确的细节级别。保持每个帖子足够短,以便浏览的人仍然能够吸收要点。长篇写作往往会被保存以供以后使用并被遗忘,而带有截图的短帖子往往会被复制和尝试。

65 

66下面的示例帖子说明了语气和长度;适应它们而不是逐字复制。

67 

68```text theme={null}

69今天学到 @-提及目录有效。我将其指向 @src/components/ 并询问哪些组件缺少测试,

70它暴露了我忘记的两个。

71```

72 

73```text theme={null}

74我配置了一个 Stop hook,以便在长任务完成时收到桌面通知。我开始了一个重构,

75走开了,当它完成时收到了通知。配置在线程中。

76```

77 

78```text theme={null}

79Plan mode 是我对在重要代码上使用它感到满意的原因。按 Shift+Tab 直到你看到

80"plan";它准确地列出了它打算触及的文件,然后再改变任何东西。

81```

82 

83## 成为人们提问的对象

84 

85一旦你分享了几个例子,问题就会随之而来。这是倡导者角色具有最大杠杆作用的地方,因为对一个人的好答案经常会解除其他几个在同一频道中观看的人的阻碍。

86 

87### 用提示而不是解释来回答

88 

89当同事问你如何完成某事时,最有用的回应是你实际使用的提示。他们会从针对自己的问题运行该提示中学到更多,而不是从你能写的任何描述中学到,它给了他们可以立即采取行动的东西。

90 

91```text theme={null}

92同事:你是如何找到那个竞态条件的?

93 

94倡导者:我问,"@tests/scheduler.test.ts 中的测试不稳定,找出原因,"

95它追踪了调度程序中的两个未加入的承诺。在你的测试上尝试相同的措辞。

96```

97 

98### 指向功能而不是文档

99 

100"尝试 plan mode,按 `Shift+Tab` 直到你看到它"这样的回应在当时比文档链接更有用。如果这个人稍后需要更深入的内容,他们会自己找到;现在他们需要解除阻碍他们的单一东西。

101 

102### 你可能会听到的问题

103 

104| 问题 | 建议的回应 | 后续资源 |

105| --------------- | ------------------------------------------------------------------------- | ------------------------------------------------------------- |

106| "我应该首先在什么上尝试它?" | 推荐一个真实但有限的任务,最好是一个你一直在推迟的错误或琐事,因为它很繁琐而不是困难。 | [Common workflows](/zh-CN/common-workflows) |

107| "我如何相信它处理我的代码?" | 介绍 plan mode:按 `Shift+Tab` 循环进入它,Claude 准确地提议它打算改变什么,在用户批准之前不会修改任何东西。 | [Permissions](/zh-CN/permissions) |

108| "设置值得付出努力吗?" | 安装大约需要两分钟,在终端中运行,不需要 IDE 扩展。运行一次 `/init` 足以开始工作。 | [Quickstart](/zh-CN/quickstart) |

109| "它产生了不正确的结果。" | 鼓励他们将失败提供给 Claude。粘贴错误消息或失败的测试远比重新表述原始请求更有效。 | [Common workflows](/zh-CN/common-workflows) |

110| "它不理解我们的代码库约定。" | 建议运行 `/init` 生成 `CLAUDE.md` 文件,然后添加团队的约定、测试命令和任何应该避免的目录。 | [Memory](/zh-CN/memory) |

111| "这只是自动完成吗?" | 提供一个简短的演示,其中 Claude 解释一个不熟悉的文件、跨服务追踪一个错误或起草迁移计划。这些任务需要在存储库中进行推理,而不是完成单一行。 | 一个两分钟的现场演示 |

112| "安全和数据处理呢?" | 将此问题转介给你的管理员。你的组织的部署和数据处理政策已经配置,倡导者不应该即兴回答这个问题。 | [Security](/zh-CN/security) · [Data usage](/zh-CN/data-usage) |

113 

114## 扩大圈子

115 

116目标不是建立一个程序或拥有一个推出。它是建立少量轻量级的习惯,允许势头在你停止主动推动它之后继续。当频道中的问题被除你之外的人回答时,该角色已经完成了它的工作。

117 

118### 倾向于有效的模式

119 

120| 模式 | 如何运行它 | 所需的努力 |

121| ------------- | ------------------------------------------------------------------------------------------------------------- | -------------- |

122| 专用频道 | 创建一个 `#claude-code` 频道(或现有频道中的定期线程),固定 [Quickstart](/zh-CN/quickstart) 链接和一个强大的例子,并公开回答问题,以便每个答案都能使观看的每个人受益。 | 大约五分钟的设置,然后是环境 |

123| 每周展示和讲述线程 | 每个星期五,发布"Claude 本周帮助你做了什么?"不需要准备、幻灯片或会议;截图和简短描述就足够了。 | 每周约两分钟 |

124| 分享自定义技能 | 发布你最有用的 `.claude/skills/<name>/SKILL.md` 文件,例如一个 `/ship` 技能,在提交前运行测试和 lint,附带一行描述。因为技能是纯 Markdown,同事可以立即采用它们。 | 每个技能约五分钟 |

125| 从你自己的使用生成设置指南 | 在你花费了真实时间的项目中运行 `/team-onboarding`。Claude 扫描你最近的会话、命令和 MCP 服务器,然后生成一个新队友可以粘贴为他们的第一条消息以重放你的设置的指南。在频道中固定它。 | 约两分钟 |

126| 在第一个任务上配对 | 为任何入门的人提供一个单一的十五分钟配对会话。他们自己代码上的一个成功结果比任何演示都更有说服力。 | 每人约十五分钟 |

127| 识别下一个倡导者 | 问你最多问题的同事通常已经准备好承担这个角色。将此页面转发给他们,并在你之间分担频道责任。 | 可忽略不计 |

128 

129### 三十天行动计划

130 

131如果一个宽松的计划有帮助,下面的序列反映了在大多数团队中倾向于有效的东西。根据你的背景自由调整。

132 

133<Steps>

134 <Step title="第 1 周:为频道播种">

135 创建频道,固定 [Quickstart](/zh-CN/quickstart),并发布两三个你自己的例子,包括提示。

136 

137 **表明它有效的信号:** 几个同事做出反应或回复,至少有一个问题在频道中被提出。

138 </Step>

139 

140 <Step title="第 2 周:开始节奏">

141 开始每周展示和讲述线程,公开回答每个问题,并分享一个自定义技能或 `CLAUDE.md` 片段。

142 

143 **表明它有效的信号:** 除你之外的人发布了他们自己的例子。

144 </Step>

145 

146 <Step title="第 3 周:配对和巩固">

147 提供两三个短配对会话,并将最常见的问题和答案整合到一个固定的常见问题解答消息中。

148 

149 **表明它有效的信号:** 你看到重复使用,同样的同事返回而不是尝试一次然后停止。

150 </Step>

151 

152 <Step title="第 4 周:交接">

153 识别第二个倡导者,并与你的主管或管理员分享一个关于什么有效和什么无效的简要总结。

154 

155 **表明它有效的信号:** 频道中的问题由除你之外的人回答。

156 </Step>

157</Steps>

158 

159### 当有人想深入了解时

160 

161你是温暖的介绍而不是入职计划。当同事从"我应该尝试这个吗"进入"我如何有效地使用它"时,将他们指向 [Quickstart](/zh-CN/quickstart) 和 [Common workflows](/zh-CN/common-workflows) 页面。它们包含涵盖真正有用但难以自己发现的功能的短部分。

162 

163## 回应常见顾虑

164 

165健康的怀疑是预期的;工程师应该对接触他们代码的工具保持谨慎。最有效的回应很少是论证一般情况。相反,承认顾虑,提供简短的重新框架,并在这个人自己的代码上提议一个具体的演示。大多数顾虑通过一次成功的经历得到解决。

166 

167| 顾虑 | 建议的回应 | 提供的证据 |

168| ----------------- | ------------------------------------------------------------------------ | ------------------------- |

169| "我没有它会更快。" | 这对于这个人日常编写的代码可能是真的。建议在他们倾向于避免的工作上尝试它:遗留文件、不熟悉的服务或测试脚手架,其中杠杆最高。 | 以两种方式计时一个繁琐的任务并比较。 |

170| "我不相信 AI 接触生产代码。" | 同意没有变化应该在未读的情况下登陆。Plan mode 结合正常的 diff 审查意味着没有应用工程师没有检查的东西,与任何拉取请求相同的标准。 | 在真实文件上演示 plan mode。 |

171| "它会使初级工程师变弱。" | 使用得当,它是一个有效的解释器。鼓励初级工程师在要求它改变任何东西之前要求 Claude 解释一个文件及其调用站点。 | 一起运行"解释 @file 以及它从哪里被调用"。 |

172| "我尝试过一次,它产生了幻觉。" | 这通常是上下文问题而不是模型问题。@-提及相关文件、运行 `/init` 和提供实际错误输出通常会解决它。 | 用适当的 `@` 上下文重新运行他们的原始提示。 |

173| "我们没有时间学习另一个工具。" | Claude Code 是一个终端命令而不是一个平台。如果它在第一个会话中没有返回价值,将其搁置是合理的。 | 两分钟的安装,然后是一个真实的错误。 |

174 

175## 快速参考表

176 

177下面的技术是最可靠地将某人从第一次试验转移到日常使用的技术。在频道中固定此表或单独分享它。

178 

179| 技术 | 如何应用它 |

180| ---------- | ----------------------------------------------------------------------------------------------- |

181| 提供正确的上下文 | 使用 `@file` 或 `@directory/` 引用,或直接粘贴错误或日志输出。提供相关上下文比精心设计的提示更有效。 |

182| 在编辑前审查计划 | 按 `Shift+Tab` 进入 plan mode。Claude 将在执行之前描述预期的更改以供你批准。 |

183| 教它你的存储库 | 运行 `/init` 生成 `CLAUDE.md` 文件,然后添加你的约定、测试命令和任何不应该修改的目录。参见 [Memory](/zh-CN/memory)。 |

184| 重用工作流 | 在 `.claude/skills/<name>/` 中保存 `SKILL.md` 文件以创建整个团队可以使用的 `/name` 技能。参见 [Skills](/zh-CN/skills)。 |

185| 在长任务期间保持知情 | 配置一个 Stop hook 以在长时间运行的任务完成时收到桌面通知。参见 [Hooks](/zh-CN/hooks-guide)。 |

186| 从不正确的结果中恢复 | 与其重新表述请求,不如将失败的测试或堆栈跟踪粘贴回 Claude,并要求它解决该特定失败。 |

187| 保持编辑手术性 | 要求一个 diff,或指定"仅改变 X。"Claude 在陈述范围时尊重范围。 |

188 

189<Tip>

190 Claude Code 经常更新。在内部分发此材料之前,根据 [documentation home page](/zh-CN/overview) 验证版本特定的详细信息。

191</Tip>

channels.md +357 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 使用 channels 将事件推送到运行中的会话

6 

7> 使用 channels 从 MCP 服务器将消息、警报和 webhooks 推送到您的 Claude Code 会话中。转发 CI 结果、聊天消息和监控事件,以便 Claude 在您离开时做出反应。

8 

9<Note>

10 Channels 处于[研究预览](#research-preview)阶段,需要 Claude Code v2.1.80 或更高版本。它们需要 claude.ai 登录。不支持控制台和 API 密钥身份验证。Team 和 Enterprise 组织必须[明确启用它们](#enterprise-controls)。

11</Note>

12 

13Channel 是一个 MCP 服务器,它将事件推送到您运行中的 Claude Code 会话中,以便 Claude 可以对您不在终端时发生的事情做出反应。Channels 可以是双向的:Claude 读取事件并通过同一 channel 回复,就像聊天桥接一样。事件仅在会话打开时到达,因此对于始终在线的设置,您可以在后台进程或持久终端中运行 Claude。

14 

15与生成新的云会话或等待被轮询的集成不同,事件到达您已经打开的会话中:请参阅 [channels 如何比较](#how-channels-compare)。

16 

17您将 channel 作为插件安装并使用您自己的凭据配置它。Telegram、Discord 和 iMessage 包含在研究预览中。

18 

19当 Claude 通过 channel 回复时,您会在终端中看到入站消息,但看不到回复文本。终端显示工具调用和确认(如"已发送"),实际回复出现在其他平台上。

20 

21本页涵盖:

22 

23* [支持的 channels](#supported-channels):Telegram、Discord 和 iMessage 设置

24* [安装并运行 channel](#quickstart),使用 fakechat(本地主机演示)

25* [谁可以推送消息](#security):发送者允许列表以及如何配对

26* [为您的组织启用 channels](#enterprise-controls)(Team 和 Enterprise)

27* [channels 如何比较](#how-channels-compare)与网络会话、Slack、MCP 和远程控制

28 

29要构建您自己的 channel,请参阅 [Channels 参考](/zh-CN/channels-reference)。

30 

31## 支持的 channels

32 

33每个支持的 channel 都是一个需要 [Bun](https://bun.sh) 的插件。在连接真实平台之前,要获得插件流程的实际演示,请尝试 [fakechat 快速入门](#quickstart)。

34 

35<Tabs>

36 <Tab title="Telegram">

37 查看完整的 [Telegram 插件源代码](https://github.com/anthropics/claude-plugins-official/tree/main/external_plugins/telegram)。

38 

39 <Steps>

40 <Step title="创建 Telegram 机器人">

41 在 Telegram 中打开 [BotFather](https://t.me/BotFather) 并发送 `/newbot`。给它一个显示名称和一个以 `bot` 结尾的唯一用户名。复制 BotFather 返回的令牌。

42 </Step>

43 

44 <Step title="安装插件">

45 在 Claude Code 中,运行:

46 

47 ```

48 /plugin install telegram@claude-plugins-official

49 ```

50 

51 如果 Claude Code 报告在任何市场中都找不到该插件,您的市场可能缺失或已过期。运行 `/plugin marketplace update claude-plugins-official` 来刷新它,或者如果您之前没有添加过,运行 `/plugin marketplace add anthropics/claude-plugins-official`。然后重试安装。

52 

53 安装后,运行 `/reload-plugins` 来激活插件的配置命令。

54 </Step>

55 

56 <Step title="配置您的令牌">

57 使用来自 BotFather 的令牌运行配置命令:

58 

59 ```

60 /telegram:configure <token>

61 ```

62 

63 这会将其保存到 `~/.claude/channels/telegram/.env`。您也可以在启动 Claude Code 之前在 shell 环境中设置 `TELEGRAM_BOT_TOKEN`。

64 </Step>

65 

66 <Step title="重启并启用 channels">

67 退出 Claude Code 并使用 channel 标志重启。这会启动 Telegram 插件,它开始轮询来自您的机器人的消息:

68 

69 ```bash theme={null}

70 claude --channels plugin:telegram@claude-plugins-official

71 ```

72 </Step>

73 

74 <Step title="配对您的账户">

75 打开 Telegram 并向您的机器人发送任何消息。机器人会回复一个配对代码。

76 

77 <Note>如果您的机器人没有响应,请确保 Claude Code 正在使用上一步中的 `--channels` 运行。机器人只能在 channel 处于活动状态时回复。</Note>

78 

79 回到 Claude Code,运行:

80 

81 ```

82 /telegram:access pair <code>

83 ```

84 

85 然后锁定访问权限,以便只有您的账户可以发送消息:

86 

87 ```

88 /telegram:access policy allowlist

89 ```

90 </Step>

91 </Steps>

92 </Tab>

93 

94 <Tab title="Discord">

95 查看完整的 [Discord 插件源代码](https://github.com/anthropics/claude-plugins-official/tree/main/external_plugins/discord)。

96 

97 <Steps>

98 <Step title="创建 Discord 机器人">

99 转到 [Discord 开发者门户](https://discord.com/developers/applications),点击**新应用程序**,并为其命名。在**机器人**部分中,创建用户名,然后点击**重置令牌**并复制令牌。

100 </Step>

101 

102 <Step title="启用消息内容意图">

103 在您的机器人设置中,滚动到**特权网关意图**并启用**消息内容意图**。

104 </Step>

105 

106 <Step title="邀请机器人加入您的服务器">

107 转到 **OAuth2 > URL 生成器**。选择 `bot` 范围并启用这些权限:

108 

109 * 查看频道

110 * 发送消息

111 * 在线程中发送消息

112 * 读取消息历史记录

113 * 附加文件

114 * 添加反应

115 

116 打开生成的 URL 以将机器人添加到您的服务器。

117 </Step>

118 

119 <Step title="安装插件">

120 在 Claude Code 中,运行:

121 

122 ```

123 /plugin install discord@claude-plugins-official

124 ```

125 

126 如果 Claude Code 报告在任何市场中都找不到该插件,您的市场可能缺失或已过期。运行 `/plugin marketplace update claude-plugins-official` 来刷新它,或者如果您之前没有添加过,运行 `/plugin marketplace add anthropics/claude-plugins-official`。然后重试安装。

127 

128 安装后,运行 `/reload-plugins` 来激活插件的配置命令。

129 </Step>

130 

131 <Step title="配置您的令牌">

132 使用您复制的机器人令牌运行配置命令:

133 

134 ```

135 /discord:configure <token>

136 ```

137 

138 这会将其保存到 `~/.claude/channels/discord/.env`。您也可以在启动 Claude Code 之前在 shell 环境中设置 `DISCORD_BOT_TOKEN`。

139 </Step>

140 

141 <Step title="重启并启用 channels">

142 退出 Claude Code 并使用 channel 标志重启。这会连接 Discord 插件,以便您的机器人可以接收和响应消息:

143 

144 ```bash theme={null}

145 claude --channels plugin:discord@claude-plugins-official

146 ```

147 </Step>

148 

149 <Step title="配对您的账户">

150 在 Discord 上向您的机器人发送私信。机器人会回复一个配对代码。

151 

152 <Note>如果您的机器人没有响应,请确保 Claude Code 正在使用上一步中的 `--channels` 运行。机器人只能在 channel 处于活动状态时回复。</Note>

153 

154 回到 Claude Code,运行:

155 

156 ```

157 /discord:access pair <code>

158 ```

159 

160 然后锁定访问权限,以便只有您的账户可以发送消息:

161 

162 ```

163 /discord:access policy allowlist

164 ```

165 </Step>

166 </Steps>

167 </Tab>

168 

169 <Tab title="iMessage">

170 查看完整的 [iMessage 插件源代码](https://github.com/anthropics/claude-plugins-official/tree/main/external_plugins/imessage)。

171 

172 iMessage channel 直接读取您的消息数据库,并通过 AppleScript 发送回复。它需要 macOS,不需要机器人令牌或外部服务。

173 

174 <Steps>

175 <Step title="授予完全磁盘访问权限">

176 位于 `~/Library/Messages/chat.db` 的消息数据库受 macOS 保护。服务器第一次读取它时,macOS 会提示访问权限:点击**允许**。提示会命名启动 Bun 的应用程序,例如终端、iTerm 或您的 IDE。

177 

178 如果提示没有出现或您点击了"不允许",请在**系统设置 > 隐私和安全 > 完全磁盘访问**下手动授予访问权限,并添加您的终端。没有这个,服务器会立即退出,显示 `authorization denied`。

179 </Step>

180 

181 <Step title="安装插件">

182 在 Claude Code 中,运行:

183 

184 ```

185 /plugin install imessage@claude-plugins-official

186 ```

187 

188 如果 Claude Code 报告在任何市场中都找不到该插件,您的市场可能缺失或已过期。运行 `/plugin marketplace update claude-plugins-official` 来刷新它,或者如果您之前没有添加过,运行 `/plugin marketplace add anthropics/claude-plugins-official`。然后重试安装。

189 </Step>

190 

191 <Step title="重启并启用 channels">

192 退出 Claude Code 并使用 channel 标志重启:

193 

194 ```bash theme={null}

195 claude --channels plugin:imessage@claude-plugins-official

196 ```

197 </Step>

198 

199 <Step title="给自己发短信">

200 在任何登录到您的 Apple ID 的设备上打开消息,并向自己发送消息。它立即到达 Claude:自聊天绕过访问控制,无需设置。

201 

202 <Note>Claude 发送的第一条回复会触发 macOS 自动化提示,询问您的终端是否可以控制消息。点击**确定**。</Note>

203 </Step>

204 

205 <Step title="允许其他发送者">

206 默认情况下,只有您自己的消息通过。要让另一个联系人到达 Claude,请添加他们的句柄:

207 

208 ```

209 /imessage:access allow +15551234567

210 ```

211 

212 句柄是 `+country` 格式的电话号码或 Apple ID 电子邮件,如 `user@example.com`。

213 </Step>

214 </Steps>

215 </Tab>

216</Tabs>

217 

218您也可以[构建您自己的 channel](/zh-CN/channels-reference),用于尚未有插件的系统。

219 

220## 快速入门

221 

222Fakechat 是一个官方支持的演示 channel,在 localhost 上运行聊天 UI,无需身份验证,也无需配置外部服务。

223 

224安装并启用 fakechat 后,您可以在浏览器中输入,消息会到达您的 Claude Code 会话。Claude 回复,回复会显示在浏览器中。测试了 fakechat 界面后,尝试 [Telegram](https://github.com/anthropics/claude-plugins-official/tree/main/external_plugins/telegram)、[Discord](https://github.com/anthropics/claude-plugins-official/tree/main/external_plugins/discord) 或 [iMessage](https://github.com/anthropics/claude-plugins-official/tree/main/external_plugins/imessage)。

225 

226要尝试 fakechat 演示,您需要:

227 

228* Claude Code [已安装并使用 claude.ai 账户进行身份验证](/zh-CN/quickstart#step-1-install-claude-code)

229* [Bun](https://bun.sh) 已安装。预构建的 channel 插件是 Bun 脚本。使用 `bun --version` 检查;如果失败,[安装 Bun](https://bun.sh/docs/installation)。

230* **Team/Enterprise 用户**:您的组织管理员必须在托管设置中[启用 channels](#enterprise-controls)

231 

232<Steps>

233 <Step title="安装 fakechat channel 插件">

234 启动 Claude Code 会话并运行安装命令:

235 

236 ```text theme={null}

237 /plugin install fakechat@claude-plugins-official

238 ```

239 

240 如果 Claude Code 报告在任何市场中都找不到该插件,您的市场可能缺失或已过期。运行 `/plugin marketplace update claude-plugins-official` 来刷新它,或者如果您之前没有添加过,运行 `/plugin marketplace add anthropics/claude-plugins-official`。然后重试安装。

241 </Step>

242 

243 <Step title="重启并启用 channel">

244 退出 Claude Code,然后使用 `--channels` 重启并传递您安装的 fakechat 插件:

245 

246 ```bash theme={null}

247 claude --channels plugin:fakechat@claude-plugins-official

248 ```

249 

250 fakechat 服务器会自动启动。

251 

252 <Tip>

253 您可以将多个插件传递给 `--channels`,用空格分隔。

254 </Tip>

255 </Step>

256 

257 <Step title="推送消息进来">

258 在 [http://localhost:8787](http://localhost:8787) 打开 fakechat UI 并输入消息:

259 

260 ```text theme={null}

261 hey, what's in my working directory?

262 ```

263 

264 消息作为 `<channel source="fakechat">` 事件到达您的 Claude Code 会话。Claude 读取它,完成工作,并调用 fakechat 的 `reply` 工具。答案显示在聊天 UI 中。

265 </Step>

266</Steps>

267 

268如果 Claude 在您离开终端时遇到权限提示,会话会暂停,直到您响应。声明[权限中继功能](/zh-CN/channels-reference#relay-permission-prompts)的 Channel 服务器可以将这些提示转发给您,以便您可以远程批准或拒绝。对于无人值守使用,[`--dangerously-skip-permissions`](/zh-CN/permission-modes#skip-all-checks-with-bypasspermissions-mode) 完全绕过提示,但仅在您信任的环境中使用。

269 

270## 安全性

271 

272每个批准的 channel 插件都维护一个发送者允许列表:只有您添加的 ID 可以推送消息,其他所有人都会被静默丢弃。

273 

274Telegram 和 Discord 通过配对来引导列表:

275 

2761. 在 Telegram 或 Discord 中找到您的机器人并向其发送任何消息

2772. 机器人回复一个配对代码

2783. 在您的 Claude Code 会话中,在提示时批准代码

2794. 您的发送者 ID 被添加到允许列表

280 

281iMessage 的工作方式不同:给自己发短信会自动绕过门禁,您可以使用 `/imessage:access allow` 通过句柄添加其他联系人。

282 

283除此之外,您可以使用 `--channels` 控制每个会话启用哪些服务器,在 Team 和 Enterprise 计划上,您的组织可以使用 [`channelsEnabled`](#enterprise-controls) 控制可用性。

284 

285仅在 `.mcp.json` 中还不足以推送消息:服务器还必须在 `--channels` 中命名。

286 

287允许列表也会限制[权限中继](/zh-CN/channels-reference#relay-permission-prompts)(如果 channel 声明了它)。任何可以通过 channel 回复的人都可以批准或拒绝您会话中的工具使用,因此只允许列表您信任具有该权限的发送者。

288 

289## Enterprise 控制

290 

291在 Team 和 Enterprise 计划上,channels 默认关闭。管理员通过两个[托管设置](/zh-CN/settings)控制可用性,用户无法覆盖:

292 

293| 设置 | 目的 | 未配置时 |

294| :---------------------- | :------------------------------------------------------------------------------------------------------------------------------------------ | :---------------- |

295| `channelsEnabled` | 主开关。必须为 `true` 才能让任何 channel 传递消息。通过 [claude.ai 管理员控制台](https://claude.ai/admin-settings/claude-code)切换或直接在托管设置中设置。关闭时阻止所有 channels,包括开发标志。 | Channels 被阻止 |

296| `allowedChannelPlugins` | 启用 channels 后哪些插件可以注册。设置时替换 Anthropic 维护的列表。仅在 `channelsEnabled` 为 `true` 时适用。 | 应用 Anthropic 默认列表 |

297 

298没有组织的 Pro 和 Max 用户完全跳过这些检查:channels 可用,用户使用 `--channels` 按会话选择加入。

299 

300### 为您的组织启用 channels

301 

302管理员可以从 [**claude.ai → 管理员设置 → Claude Code → Channels**](https://claude.ai/admin-settings/claude-code) 启用 channels,或通过在托管设置中将 `channelsEnabled` 设置为 `true`。

303 

304启用后,您组织中的用户可以使用 `--channels` 将 channel 服务器选择加入到各个会话中。如果设置被禁用或未设置,MCP 服务器仍会连接,其工具可以工作,但 channel 消息不会到达。启动警告会告诉用户让管理员启用该设置。

305 

306### 限制哪些 channel 插件可以运行

307 

308默认情况下,Anthropic 维护的允许列表上的任何插件都可以注册为 channel。Team 和 Enterprise 计划上的管理员可以通过在托管设置中设置 `allowedChannelPlugins` 来替换该允许列表。使用此功能来限制允许哪些官方插件、批准来自您自己的内部市场的 channels,或两者兼有。每个条目命名一个插件及其来自的市场:

309 

310```json theme={null}

311{

312 "channelsEnabled": true,

313 "allowedChannelPlugins": [

314 { "marketplace": "claude-plugins-official", "plugin": "telegram" },

315 { "marketplace": "claude-plugins-official", "plugin": "discord" },

316 { "marketplace": "acme-corp-plugins", "plugin": "internal-alerts" }

317 ]

318}

319```

320 

321设置 `allowedChannelPlugins` 时,它完全替换 Anthropic 允许列表:只有列出的插件可以注册。保持未设置以回退到默认 Anthropic 允许列表。空数组阻止所有 channel 插件从允许列表中,但 `--dangerously-load-development-channels` 仍可以为本地测试绕过它。要完全阻止 channels,包括开发标志,请改为保持 `channelsEnabled` 未设置。

322 

323此设置需要 `channelsEnabled: true`。如果用户将不在您列表中的插件传递给 `--channels`,Claude Code 会正常启动,但 channel 不会注册,启动通知会解释该插件不在组织的批准列表中。

324 

325## 研究预览

326 

327Channels 是一个研究预览功能。可用性正在逐步推出,`--channels` 标志语法和协议契约可能会根据反馈而改变。

328 

329在预览期间,`--channels` 仅接受来自 Anthropic 维护的允许列表的插件,或来自您组织的允许列表(如果管理员已设置 [`allowedChannelPlugins`](#restrict-which-channel-plugins-can-run))。[claude-plugins-official](https://github.com/anthropics/claude-plugins-official/tree/main/external_plugins) 中的 channel 插件是默认批准的集合。如果您传递不在有效允许列表中的内容,Claude Code 会正常启动,但 channel 不会注册,启动通知会告诉您原因。

330 

331要测试您正在构建的 channel,请使用 `--dangerously-load-development-channels`。有关测试您构建的自定义 channels 的信息,请参阅[在研究预览期间测试](/zh-CN/channels-reference#test-during-the-research-preview)。

332 

333在 [Claude Code GitHub 存储库](https://github.com/anthropics/claude-code/issues)上报告问题或反馈。

334 

335## channels 如何比较

336 

337几个 Claude Code 功能连接到终端外的系统,每个都适合不同类型的工作:

338 

339| 功能 | 它做什么 | 适合 |

340| ------------------------------------------------- | ------------------------------------ | --------------------- |

341| [网络上的 Claude Code](/zh-CN/claude-code-on-the-web) | 在新的云沙箱中运行任务,从 GitHub 克隆 | 委派您稍后检查的自包含异步工作 |

342| [Slack 中的 Claude](/zh-CN/slack) | 从频道或线程中的 `@Claude` 提及生成网络会话 | 直接从团队对话上下文启动任务 |

343| 标准 [MCP 服务器](/zh-CN/mcp) | Claude 在任务期间查询它;没有任何内容被推送到会话 | 给 Claude 按需访问以读取或查询系统 |

344| [远程控制](/zh-CN/remote-control) | 您从 claude.ai 或 Claude 移动应用程序驱动您的本地会话 | 在离开您的办公桌时指导进行中的会话 |

345 

346Channels 通过将来自非 Claude 源的事件推送到您已经运行的本地会话中,填补了该列表中的空白。

347 

348* **聊天桥接**:通过 Telegram、Discord 或 iMessage 从您的手机向 Claude 询问某事,答案会在同一聊天中返回,而工作在您的机器上针对您的真实文件运行。

349* **[Webhook 接收器](/zh-CN/channels-reference#example-build-a-webhook-receiver)**:来自 CI、您的错误跟踪器、部署管道或其他外部服务的 webhook 到达 Claude 已经打开您的文件并记得您正在调试的内容的地方。

350 

351## 后续步骤

352 

353一旦您有一个 channel 运行,请探索这些相关功能:

354 

355* [构建您自己的 channel](/zh-CN/channels-reference),用于尚未有插件的系统

356* [远程控制](/zh-CN/remote-control),从您的手机驱动本地会话,而不是将事件转发到其中

357* [计划任务](/zh-CN/scheduled-tasks),按计时器轮询而不是对推送事件做出反应

channels-reference.md +749 −0 created

Details

1> ## Documentation Index

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

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

4 

5# Channels 参考

6 

7> 构建一个 MCP 服务器,将 webhooks、警报和聊天消息推送到 Claude Code 会话中。频道合约的参考:能力声明、通知事件、回复工具、发送者门控和权限中继。

8 

9<Note>

10 Channels 处于[研究预览](/zh-CN/channels#research-preview)阶段,需要 Claude Code v2.1.80 或更高版本。它们需要 claude.ai 登录。不支持控制台和 API 密钥身份验证。Team 和 Enterprise 组织必须[明确启用它们](/zh-CN/channels#enterprise-controls)。

11</Note>

12 

13Channel 是一个 MCP 服务器,它将事件推送到 Claude Code 会话中,以便 Claude 可以对终端外发生的事情做出反应。

14 

15您可以构建单向或双向频道。单向频道转发警报、webhooks 或监控事件供 Claude 处理。双向频道(如聊天桥接)也[公开回复工具](#expose-a-reply-tool),以便 Claude 可以发送消息回复。具有受信任发送者路径的频道也可以选择加入[中继权限提示](#relay-permission-prompts),以便您可以远程批准或拒绝工具使用。

16 

17本页涵盖:

18 

19* [概述](#overview):频道如何工作

20* [您需要什么](#what-you-need):要求和一般步骤

21* [示例:构建 webhook 接收器](#example-build-a-webhook-receiver):最小单向演练

22* [服务器选项](#server-options):构造函数字段

23* [通知格式](#notification-format):事件有效负载

24* [公开回复工具](#expose-a-reply-tool):让 Claude 发送消息回复

25* [门控入站消息](#gate-inbound-messages):发送者检查以防止提示注入

26* [中继权限提示](#relay-permission-prompts):将工具批准提示转发到远程频道

27 

28要使用现有频道而不是构建一个,请参阅 [Channels](/zh-CN/channels)。Telegram、Discord、iMessage 和 fakechat 包含在研究预览中。

29 

30## 概述

31 

32Channel 是一个在与 Claude Code 相同的机器上运行的 [MCP](https://modelcontextprotocol.io) 服务器。Claude Code 将其作为子进程生成并通过 stdio 进行通信。您的频道服务器是外部系统和 Claude Code 会话之间的桥梁:

33 

34* **聊天平台**(Telegram、Discord):您的插件在本地运行并轮询平台的 API 以获取新消息。当有人向您的机器人发送 DM 时,插件接收消息并将其转发给 Claude。无需公开 URL。

35* **Webhooks**(CI、监控):您的服务器在本地 HTTP 端口上侦听。外部系统 POST 到该端口,您的服务器将有效负载推送到 Claude。

36 

37<img src="https://mintlify.s3.us-west-1.amazonaws.com/claude-code/zh-CN/images/channel-architecture.svg" alt="架构图显示外部系统连接到您的本地频道服务器,该服务器通过 stdio 与 Claude Code 通信" />

38 

39## 您需要什么

40 

41唯一的硬性要求是 [`@modelcontextprotocol/sdk`](https://www.npmjs.com/package/@modelcontextprotocol/sdk) 包和 Node.js 兼容的运行时。[Bun](https://bun.sh)、[Node](https://nodejs.org) 和 [Deno](https://deno.com) 都可以工作。研究预览中的预构建插件使用 Bun,但您的频道不一定要使用。

42 

43您的服务器需要:

44 

451. 声明 `claude/channel` 能力,以便 Claude Code 注册通知侦听器

462. 当发生某事时发出 `notifications/claude/channel` 事件

473. 通过 [stdio transport](https://modelcontextprotocol.io/docs/concepts/transports#standard-io) 连接(Claude Code 将您的服务器作为子进程生成)

48 

49[服务器选项](#server-options)和[通知格式](#notification-format)部分详细介绍了每一项。有关完整演练,请参阅[示例:构建 webhook 接收器](#example-build-a-webhook-receiver)。

50 

51在研究预览期间,自定义频道不在[批准的允许列表](/zh-CN/channels#supported-channels)上。使用 `--dangerously-load-development-channels` 在本地测试。有关详细信息,请参阅[在研究预览期间测试](#test-during-the-research-preview)。

52 

53## 示例:构建 webhook 接收器

54 

55本演练构建一个单文件服务器,该服务器侦听 HTTP 请求并将其转发到您的 Claude Code 会话中。最后,任何可以发送 HTTP POST 的东西,如 CI 管道、监控警报或 `curl` 命令,都可以将事件推送到 Claude。

56 

57此示例使用 [Bun](https://bun.sh) 作为运行时,用于其内置的 HTTP 服务器和 TypeScript 支持。您可以改用 [Node](https://nodejs.org) 或 [Deno](https://deno.com);唯一的要求是 [MCP SDK](https://www.npmjs.com/package/@modelcontextprotocol/sdk)。

58 

59<Steps>

60 <Step title="创建项目">

61 创建一个新目录并安装 MCP SDK:

62 

63 ```bash theme={null}

64 mkdir webhook-channel && cd webhook-channel

65 bun add @modelcontextprotocol/sdk

66 ```

67 </Step>

68 

69 <Step title="编写频道服务器">

70 创建一个名为 `webhook.ts` 的文件。这是您的整个频道服务器:它通过 stdio 连接到 Claude Code,并在端口 8788 上侦听 HTTP POST。当请求到达时,它将主体作为频道事件推送到 Claude。

71 

72 ```ts title="webhook.ts" theme={null}

73 #!/usr/bin/env bun

74 import { Server } from '@modelcontextprotocol/sdk/server/index.js'

75 import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'

76 

77 // 创建 MCP 服务器并将其声明为频道

78 const mcp = new Server(

79 { name: 'webhook', version: '0.0.1' },

80 {

81 // 这个键使其成为频道 — Claude Code 为其注册侦听器

82 capabilities: { experimental: { 'claude/channel': {} } },

83 // 添加到 Claude 的系统提示,以便它知道如何处理这些事件

84 instructions: 'Events from the webhook channel arrive as <channel source="webhook" ...>. They are one-way: read them and act, no reply expected.',

85 },

86 )

87 

88 // 通过 stdio 连接到 Claude Code(Claude Code 生成此进程)

89 await mcp.connect(new StdioServerTransport())

90 

91 // 启动一个 HTTP 服务器,将每个 POST 转发给 Claude

92 Bun.serve({

93 port: 8788, // 任何开放端口都可以

94 // 仅限本地主机:此机器外的任何东西都无法 POST

95 hostname: '127.0.0.1',

96 async fetch(req) {

97 const body = await req.text()

98 await mcp.notification({

99 method: 'notifications/claude/channel',

100 params: {

101 content: body, // 成为 <channel> 标签的主体

102 // 每个键都成为标签属性,例如 <channel path="/" method="POST">

103 meta: { path: new URL(req.url).pathname, method: req.method },

104 },

105 })

106 return new Response('ok')

107 },

108 })

109 ```

110 

111 该文件按顺序执行三项操作:

112 

113 * **服务器配置**:使用 `claude/channel` 在其能力中创建 MCP 服务器,这是告诉 Claude Code 这是一个频道的原因。[`instructions`](#server-options) 字符串进入 Claude 的系统提示:告诉 Claude 期望什么事件、是否回复以及如果应该回复,使用哪个工具和传回哪个属性。

114 * **Stdio 连接**:通过 stdin/stdout 连接到 Claude Code。这对任何 [MCP 服务器](https://modelcontextprotocol.io/docs/concepts/transports#standard-io) 都是标准的:Claude Code 将其作为子进程生成。

115 * **HTTP 侦听器**:在端口 8788 上启动本地 Web 服务器。每个 POST 主体都通过 `mcp.notification()` 作为频道事件转发给 Claude。`content` 成为事件主体,每个 `meta` 条目成为 `<channel>` 标签上的属性。侦听器需要访问 `mcp` 实例,因此它在同一进程中运行。对于更大的项目,您可以将其拆分为单独的模块。

116 </Step>

117 

118 <Step title="向 Claude Code 注册您的服务器">

119 将服务器添加到您的 MCP 配置中,以便 Claude Code 知道如何启动它。对于同一目录中的项目级 `.mcp.json`,使用相对路径。对于 `~/.claude.json` 中的用户级配置,使用完整的绝对路径,以便可以从任何项目找到服务器:

120 

121 ```json title=".mcp.json" theme={null}

122 {

123 "mcpServers": {

124 "webhook": { "command": "bun", "args": ["./webhook.ts"] }

125 }

126 }

127 ```

128 

129 Claude Code 在启动时读取您的 MCP 配置并将每个服务器作为子进程生成。

130 </Step>

131 

132 <Step title="测试它">

133 在研究预览期间,自定义频道不在允许列表上,因此使用开发标志启动 Claude Code:

134 

135 ```bash theme={null}

136 claude --dangerously-load-development-channels server:webhook

137 ```

138 

139 当 Claude Code 启动时,它读取您的 MCP 配置,将您的 `webhook.ts` 作为子进程生成,HTTP 侦听器自动在您配置的端口上启动(此示例中为 8788)。您不需要自己运行服务器。

140 

141 如果您看到"被组织政策阻止",您的 Team 或 Enterprise 管理员需要[启用频道](/zh-CN/channels#enterprise-controls)。

142 

143 在单独的终端中,通过向您的服务器发送带有消息的 HTTP POST 来模拟 webhook。此示例向端口 8788 发送 CI 失败警报(或您配置的任何端口):

144 

145 ```bash theme={null}

146 curl -X POST localhost:8788 -d "build failed on main: https://ci.example.com/run/1234"

147 ```

148 

149 有效负载作为 `<channel>` 标签到达您的 Claude Code 会话中:

150 

151 ```text theme={null}

152 <channel source="webhook" path="/" method="POST">build failed on main: https://ci.example.com/run/1234</channel>

153 ```

154 

155 在您的 Claude Code 终端中,您会看到 Claude 接收消息并开始响应:读取文件、运行命令或消息要求的任何操作。这是一个单向频道,因此 Claude 在您的会话中行动,但不会通过 webhook 发送任何内容回复。要添加回复,请参阅[公开回复工具](#expose-a-reply-tool)。

156 

157 如果事件没有到达,诊断取决于 `curl` 返回的内容:

158 

159 * **`curl` 成功但没有任何内容到达 Claude**:在您的会话中运行 `/mcp` 以检查服务器的状态。"Failed to connect"通常意味着您的服务器文件中存在依赖项或导入错误;检查 `~/.claude/debug/<session-id>.txt` 处的调试日志以获取 stderr 跟踪。

160 * **`curl` 失败,显示"connection refused"**:端口要么尚未绑定,要么来自较早运行的陈旧进程正在占用它。`lsof -i :<port>` 显示正在侦听的内容;在重新启动会话之前 `kill` 陈旧进程。

161 </Step>

162</Steps>

163 

164[fakechat 服务器](https://github.com/anthropics/claude-plugins-official/tree/main/external_plugins/fakechat)使用 Web UI、文件附件和用于双向聊天的回复工具扩展此模式。

165 

166## 在研究预览期间测试

167 

168在研究预览期间,每个频道都必须在[批准的允许列表](/zh-CN/channels#research-preview)上才能注册。开发标志在确认提示后绕过特定条目的允许列表。此示例显示两种条目类型:

169 

170```bash theme={null}

171# 测试您正在开发的插件

172claude --dangerously-load-development-channels plugin:yourplugin@yourmarketplace

173 

174# 测试裸 .mcp.json 服务器(尚无插件包装器)

175claude --dangerously-load-development-channels server:webhook

176```

177 

178绕过是按条目的。将此标志与 `--channels` 结合不会将绕过扩展到 `--channels` 条目。在研究预览期间,批准的允许列表由 Anthropic 策划,因此您的频道在您构建和测试时保持在开发标志上。

179 

180<Note>

181 此标志仅跳过允许列表。`channelsEnabled` 组织政策仍然适用。不要使用它来运行来自不受信任来源的频道。

182</Note>

183 

184## 服务器选项

185 

186频道在 [`Server`](https://modelcontextprotocol.io/docs/concepts/servers) 构造函数中设置这些选项。`instructions` 和 `capabilities.tools` 字段是[标准 MCP](https://modelcontextprotocol.io/docs/concepts/servers);`capabilities.experimental['claude/channel']` 和 `capabilities.experimental['claude/channel/permission']` 是频道特定的添加:

187 

188| 字段 | 类型 | 描述 |

189| :------------------------------------------------------- | :------- | :---------------------------------------------------------------------------------------------------------------- |

190| `capabilities.experimental['claude/channel']` | `object` | 必需。始终为 `{}`。存在注册通知侦听器。 |

191| `capabilities.experimental['claude/channel/permission']` | `object` | 可选。始终为 `{}`。声明此频道可以接收权限中继请求。声明后,Claude Code 将工具批准提示转发到您的频道,以便您可以远程批准或拒绝它们。请参阅[中继权限提示](#relay-permission-prompts)。 |

192| `capabilities.tools` | `object` | 仅双向。始终为 `{}`。标准 MCP 工具能力。请参阅[公开回复工具](#expose-a-reply-tool)。 |

193| `instructions` | `string` | 推荐。添加到 Claude 的系统提示。告诉 Claude 期望什么事件、`<channel>` 标签属性的含义、是否回复,如果是,使用哪个工具以及传回哪个属性(如 `chat_id`)。 |

194 

195要创建单向频道,请省略 `capabilities.tools`。此示例显示双向设置,其中频道能力、工具和说明已设置:

196 

197```ts theme={null}

198import { Server } from '@modelcontextprotocol/sdk/server/index.js'

199 

200const mcp = new Server(

201 { name: 'your-channel', version: '0.0.1' },

202 {

203 capabilities: {

204 experimental: { 'claude/channel': {} }, // 注册频道侦听器

205 tools: {}, // 对于单向频道省略

206 },

207 // 添加到 Claude 的系统提示,以便它知道如何处理您的事件

208 instructions: 'Messages arrive as <channel source="your-channel" ...>. Reply with the reply tool.',

209 },

210)

211```

212 

213要推送事件,请使用方法 `notifications/claude/channel` 调用 `mcp.notification()`。参数在下一部分中。

214 

215## 通知格式

216 

217您的服务器使用两个参数发出 `notifications/claude/channel`:

218 

219| 字段 | 类型 | 描述 |

220| :-------- | :----------------------- | :--------------------------------------------------------------------------------------------- |

221| `content` | `string` | 事件主体。作为 `<channel>` 标签的主体传递。 |

222| `meta` | `Record<string, string>` | 可选。每个条目成为 `<channel>` 标签上的属性,用于路由上下文,如聊天 ID、发送者名称或警报严重性。键必须是标识符:仅字母、数字和下划线。包含连字符或其他字符的键会被静默删除。 |

223 

224您的服务器通过在 `Server` 实例上调用 `mcp.notification()` 来推送事件。此示例推送带有两个元键的 CI 失败警报:

225 

226```ts theme={null}

227await mcp.notification({

228 method: 'notifications/claude/channel',

229 params: {

230 content: 'build failed on main: https://ci.example.com/run/1234',

231 meta: { severity: 'high', run_id: '1234' },

232 },

233})

234```

235 

236事件在 Claude 的上下文中到达,包装在 `<channel>` 标签中。`source` 属性从您的服务器配置的名称自动设置:

237 

238```text theme={null}

239<channel source="your-channel" severity="high" run_id="1234">

240build failed on main: https://ci.example.com/run/1234

241</channel>

242```

243 

244## 公开回复工具

245 

246如果您的频道是双向的,如聊天桥接而不是警报转发器,请公开一个标准 [MCP 工具](https://modelcontextprotocol.io/docs/concepts/tools),Claude 可以调用它来发送消息回复。关于工具注册的任何内容都不是频道特定的。回复工具有三个组件:

247 

2481. 您的 `Server` 构造函数能力中的 `tools: {}` 条目,以便 Claude Code 发现工具

2492. 定义工具的架构并实现发送逻辑的工具处理程序

2503. 您的 `Server` 构造函数中的 `instructions` 字符串,告诉 Claude 何时以及如何调用工具

251 

252要将这些添加到上面的[webhook 接收器](#example-build-a-webhook-receiver):

253 

254<Steps>

255 <Step title="启用工具发现">

256 在您的 `Server` 构造函数中的 `webhook.ts` 中,将 `tools: {}` 添加到能力中,以便 Claude Code 知道您的服务器提供工具:

257 

258 ```ts theme={null}

259 capabilities: {

260 experimental: { 'claude/channel': {} },

261 tools: {}, // 启用工具发现

262 },

263 ```

264 </Step>

265 

266 <Step title="注册回复工具">

267 将以下内容添加到 `webhook.ts`。`import` 与您的其他导入一起位于文件顶部;两个处理程序位于 `Server` 构造函数和 `mcp.connect()` 之间。这注册了一个 `reply` 工具,Claude 可以使用 `chat_id` 和 `text` 调用它:

268 

269 ```ts theme={null}

270 // 在 webhook.ts 顶部添加此导入

271 import { ListToolsRequestSchema, CallToolRequestSchema } from '@modelcontextprotocol/sdk/types.js'

272 

273 // Claude 在启动时查询此项以发现您的服务器提供什么工具

274 mcp.setRequestHandler(ListToolsRequestSchema, async () => ({

275 tools: [{

276 name: 'reply',

277 description: 'Send a message back over this channel',

278 // inputSchema 告诉 Claude 要传递什么参数

279 inputSchema: {

280 type: 'object',

281 properties: {

282 chat_id: { type: 'string', description: 'The conversation to reply in' },

283 text: { type: 'string', description: 'The message to send' },

284 },

285 required: ['chat_id', 'text'],

286 },

287 }],

288 }))

289 

290 // Claude 想要调用工具时调用此项

291 mcp.setRequestHandler(CallToolRequestSchema, async req => {

292 if (req.params.name === 'reply') {

293 const { chat_id, text } = req.params.arguments as { chat_id: string; text: string }

294 // send() 是您的出站:POST 到您的聊天平台,或用于本地

295 // 测试下面完整示例中显示的 SSE 广播。

296 send(`Reply to ${chat_id}: ${text}`)

297 return { content: [{ type: 'text', text: 'sent' }] }

298 }

299 throw new Error(`unknown tool: ${req.params.name}`)

300 })

301 ```

302 </Step>

303 

304 <Step title="更新说明">

305 更新您的 `Server` 构造函数中的 `instructions` 字符串,以便 Claude 知道通过工具将回复路由回去。此示例告诉 Claude 从入站标签传递 `chat_id`:

306 

307 ```ts theme={null}

308 instructions: 'Messages arrive as <channel source="webhook" chat_id="...">. Reply with the reply tool, passing the chat_id from the tag.'

309 ```

310 </Step>

311</Steps>

312 

313这是完整的 `webhook.ts`,具有双向支持。出站回复通过 `GET /events` 使用 [Server-Sent Events](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events) (SSE) 流式传输,因此 `curl -N localhost:8788/events` 可以实时观看它们;入站聊天到达 `POST /`:

314 

315```ts title="Full webhook.ts with reply tool' expandable theme={null}

316#!/usr/bin/env bun

317import { Server } from '@modelcontextprotocol/sdk/server/index.js'

318import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'

319import { ListToolsRequestSchema, CallToolRequestSchema } from '@modelcontextprotocol/sdk/types.js'

320 

321// --- 出站:写入 /events 上的任何 curl -N 侦听器 ---

322// 真实的桥接会改为 POST 到您的聊天平台。

323const listeners = new Set<(chunk: string) => void>()

324function send(text: string) {

325 const chunk = text.split('\n').map(l => `data: ${l}\n`).join('') + '\n'

326 for (const emit of listeners) emit(chunk)

327}

328 

329const mcp = new Server(

330 { name: 'webhook', version: '0.0.1' },

331 {

332 capabilities: {

333 experimental: { 'claude/channel': {} },

334 tools: {},

335 },

336 instructions: 'Messages arrive as <channel source="webhook" chat_id="...">. Reply with the reply tool, passing the chat_id from the tag.',

337 },

338)

339 

340mcp.setRequestHandler(ListToolsRequestSchema, async () => ({

341 tools: [{

342 name: 'reply',

343 description: 'Send a message back over this channel',

344 inputSchema: {

345 type: 'object',

346 properties: {

347 chat_id: { type: 'string', description: 'The conversation to reply in' },

348 text: { type: 'string', description: 'The message to send' },

349 },

350 required: ['chat_id', 'text'],

351 },

352 }],

353}))

354 

355mcp.setRequestHandler(CallToolRequestSchema, async req => {

356 if (req.params.name === 'reply') {

357 const { chat_id, text } = req.params.arguments as { chat_id: string; text: string }

358 send(`Reply to ${chat_id}: ${text}`)

359 return { content: [{ type: 'text', text: 'sent' }] }

360 }

361 throw new Error(`unknown tool: ${req.params.name}`)

362})

363 

364await mcp.connect(new StdioServerTransport())

365 

366let nextId = 1

367Bun.serve({

368 port: 8788,

369 hostname: '127.0.0.1',

370 idleTimeout: 0, // 不要关闭空闲 SSE 流

371 async fetch(req) {

372 const url = new URL(req.url)

373 

374 // GET /events:SSE 流,以便 curl -N 可以实时观看 Claude 的回复

375 if (req.method === 'GET' && url.pathname === '/events') {

376 const stream = new ReadableStream({

377 start(ctrl) {

378 ctrl.enqueue(': connected\n\n') // 所以 curl 立即显示一些内容

379 const emit = (chunk: string) => ctrl.enqueue(chunk)

380 listeners.add(emit)

381 req.signal.addEventListener('abort', () => listeners.delete(emit))

382 },

383 })

384 return new Response(stream, {

385 headers: { 'Content-Type': 'text/event-stream', 'Cache-Control': 'no-cache' },

386 })

387 }

388 

389 // POST:作为频道事件转发给 Claude

390 const body = await req.text()

391 const chat_id = String(nextId++)

392 await mcp.notification({

393 method: 'notifications/claude/channel',

394 params: {

395 content: body,

396 meta: { chat_id, path: url.pathname, method: req.method },

397 },

398 })

399 return new Response('ok')

400 },

401})

402```

403 

404[fakechat 服务器](https://github.com/anthropics/claude-plugins-official/tree/main/external_plugins/fakechat)显示了一个更完整的示例,具有文件附件和消息编辑。

405 

406## 门控入站消息

407 

408未门控的频道是提示注入向量。任何可以到达您的端点的人都可以在 Claude 前面放置文本。侦听聊天平台或公共端点的频道需要在发出任何内容之前进行真正的发送者检查。

409 

410在调用 `mcp.notification()` 之前,根据允许列表检查发送者。此示例删除来自不在集合中的发送者的任何消息:

411 

412```ts theme={null}

413const allowed = new Set(loadAllowlist()) // 从您的 access.json 或等效项

414 

415// 在您的消息处理程序中,在发出之前:

416if (!allowed.has(message.from.id)) { // 发送者,不是房间

417 return // 静默删除

418}

419await mcp.notification({ ... })

420```

421 

422根据发送者的身份而不是聊天或房间身份进行门控:示例中的 `message.from.id`,而不是 `message.chat.id`。在群组聊天中,这些不同,根据房间进行门控会让允许列表中的任何人向会话注入消息。

423 

424[Telegram](https://github.com/anthropics/claude-plugins-official/tree/main/external_plugins/telegram) 和 [Discord](https://github.com/anthropics/claude-plugins-official/tree/main/external_plugins/discord) 频道以相同的方式在发送者允许列表上进行门控。它们通过配对引导列表:用户向机器人发送 DM,机器人回复配对代码,用户在其 Claude Code 会话中批准它,其平台 ID 被添加。有关完整配对流程,请参阅任一实现。[iMessage](https://github.com/anthropics/claude-plugins-official/tree/main/external_plugins/imessage) 频道采用不同的方法:它在启动时从 Messages 数据库检测用户自己的地址,并自动让它们通过,其他发送者通过句柄添加。

425 

426## 中继权限提示

427 

428<Note>

429 权限中继需要 Claude Code v2.1.81 或更高版本。较早的版本忽略 `claude/channel/permission` 能力。

430</Note>

431 

432当 Claude 调用需要批准的工具时,本地终端对话打开,会话等待。双向频道可以选择加入以在并行接收相同的提示,并将其中继到您的另一台设备。两者都保持活动:您可以在终端或手机上回答,Claude Code 应用先到达的任何答案并关闭另一个。

433 

434中继涵盖工具使用批准,如 Bash、Write 和 Edit。项目信任和 MCP 服务器同意对话不中继;这些仅在本地终端中出现。

435 

436### 中继如何工作

437 

438当权限提示打开时,中继循环有四个步骤:

439 

4401. Claude Code 生成一个短请求 ID 并通知您的服务器

4412. 您的服务器将提示和 ID 转发到您的聊天应用

4423. 远程用户使用该 ID 回复是或否

4434. 您的入站处理程序将回复解析为判决,Claude Code 仅在 ID 匹配开放请求时应用它

444 

445本地终端对话在所有这一切中保持打开。如果终端上的某人在远程判决到达之前回答,该答案将被应用,待处理的远程请求将被删除。

446 

447<img src="https://mintlify.s3.us-west-1.amazonaws.com/claude-code/zh-CN/images/channel-permission-relay.svg" alt="序列图:Claude Code 向频道服务器发送 permission_request 通知,服务器格式化并将提示发送到聊天应用,人类使用判决回复,服务器将该回复解析为权限通知回到 Claude Code" />

448 

449### 权限请求字段

450 

451来自 Claude Code 的出站通知是 `notifications/claude/channel/permission_request`。与[频道通知](#notification-format)一样,传输是标准 MCP,但方法和架构是 Claude Code 扩展。`params` 对象有四个字符串字段,您的服务器将其格式化为出站提示:

452 

453| 字段 | 描述 |

454| --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |

455| `request_id` | 从 `a`-`z` 中抽取的五个小写字母,不包括 `l`,因此在手机上输入时永远不会读作 `1` 或 `I`。将其包含在您的出站提示中,以便可以在回复中回显。Claude Code 仅接受携带其发出的 ID 的判决。本地终端对话不显示此 ID,因此您的出站处理程序是了解它的唯一方式。 |

456| `tool_name` | Claude 想要使用的工具的名称,例如 `Bash` 或 `Write`。 |

457| `description` | 此特定工具调用执行的操作的人类可读摘要,与本地终端对话显示的文本相同。对于 Bash 调用,这是 Claude 对命令的描述,或者如果没有给出,则是命令本身。 |

458| `input_preview` | 工具的参数作为 JSON 字符串,截断为 200 个字符。对于 Bash,这是命令;对于 Write,这是文件路径和内容的前缀。如果您只有一行消息的空间,请从您的提示中省略它。您的服务器决定显示什么。 |

459 

460您的服务器发送回的判决是 `notifications/claude/channel/permission`,有两个字段:`request_id` 回显上面的 ID,`behavior` 设置为 `'allow'` 或 `'deny'`。允许让工具调用继续;拒绝拒绝它,与在本地对话中回答"否"相同。两个判决都不影响未来的调用。

461 

462### 向聊天桥接添加中继

463 

464向双向频道添加权限中继需要三个组件:

465 

4661. 您的 `Server` 构造函数中 `experimental` 能力下的 `claude/channel/permission: {}` 条目,以便 Claude Code 知道转发提示

4672. `notifications/claude/channel/permission_request` 的通知处理程序,格式化提示并通过您的平台 API 发送它

4683. 您的入站消息处理程序中的检查,识别 `yes <id>` 或 `no <id>` 并发出 `notifications/claude/channel/permission` 判决通知,而不是将文本转发给 Claude

469 

470仅在您的频道[验证发送者](#gate-inbound-messages)时声明该能力,因为任何可以通过您的频道回复的人都可以批准或拒绝您会话中的工具使用。

471 

472要将这些添加到在[公开回复工具](#expose-a-reply-tool)中组装的双向聊天桥接:

473 

474<Steps>

475 <Step title="声明权限能力">

476 在您的 `Server` 构造函数中,在 `experimental` 下的 `claude/channel` 旁边添加 `claude/channel/permission: {}`:

477 

478 ```ts theme={null}

479 capabilities: {

480 experimental: {

481 'claude/channel': {},

482 'claude/channel/permission': {}, // 选择加入权限中继

483 },

484 tools: {},

485 },

486 ```

487 </Step>

488 

489 <Step title="处理传入请求">

490 在您的 `Server` 构造函数和 `mcp.connect()` 之间注册一个通知处理程序。当权限对话打开时,Claude Code 使用[四个请求字段](#permission-request-fields)调用它。您的处理程序为您的平台格式化提示,并包括使用 ID 回复的说明:

491 

492 ```ts theme={null}

493 import { z } from 'zod'

494 

495 // setNotificationHandler 通过 z.literal 在方法字段上路由,

496 // 所以这个架构既是验证器又是调度键

497 const PermissionRequestSchema = z.object({

498 method: z.literal('notifications/claude/channel/permission_request'),

499 params: z.object({

500 request_id: z.string(), // 五个小写字母,在您的提示中逐字包含

501 tool_name: z.string(), // 例如 "Bash"、"Write"

502 description: z.string(), // 此调用的人类可读摘要

503 input_preview: z.string(), // 工具参数作为 JSON,截断为 ~200 个字符

504 }),

505 })

506 

507 mcp.setNotificationHandler(PermissionRequestSchema, async ({ params }) => {

508 // send() 是您的出站:POST 到您的聊天平台,或用于本地

509 // 测试下面完整示例中显示的 SSE 广播。

510 send(

511 `Claude wants to run ${params.tool_name}: ${params.description}\n\n` +

512 // 说明中的 ID 是您的入站处理程序在步骤 3 中解析的内容

513 `Reply "yes ${params.request_id}" or "no ${params.request_id}"`,

514 )

515 })

516 ```

517 </Step>

518 

519 <Step title="在您的入站处理程序中拦截判决">

520 您的入站处理程序是接收来自您的平台的消息的循环或回调:与您[根据发送者进行门控](#gate-inbound-messages)和发出 `notifications/claude/channel` 以将聊天转发给 Claude 的地方相同。在聊天转发调用之前添加一个检查,识别判决格式并改为发出权限通知。

521 

522 正则表达式匹配 Claude Code 生成的 ID 格式:五个字母,永远不是 `l`。`/i` 标志容忍手机自动更正将回复大写;在将其发送回之前将捕获的 ID 小写。

523 

524 ```ts theme={null}

525 // 匹配 "y abcde"、"yes abcde"、"n abcde"、"no abcde"

526 // [a-km-z] 是 Claude Code 使用的 ID 字母表(小写,跳过 'l')

527 // /i 容忍手机自动更正;在发送前小写捕获

528 const PERMISSION_REPLY_RE = /^\s*(y|yes|n|no)\s+([a-km-z]{5})\s*$/i

529 

530 async function onInbound(message: PlatformMessage) {

531 if (!allowed.has(message.from.id)) return // 首先根据发送者进行门控

532 

533 const m = PERMISSION_REPLY_RE.exec(message.text)

534 if (m) {

535 // m[1] 是判决词,m[2] 是请求 ID

536 // 将判决通知发出回 Claude Code,而不是聊天

537 await mcp.notification({

538 method: 'notifications/claude/channel/permission',

539 params: {

540 request_id: m[2].toLowerCase(), // 在自动更正大写的情况下规范化

541 behavior: m[1].toLowerCase().startsWith('y') ? 'allow' : 'deny',

542 },

543 })

544 return // 作为判决处理,不要也转发为聊天

545 }

546 

547 // 不匹配判决格式:落入正常聊天路径

548 await mcp.notification({

549 method: 'notifications/claude/channel',

550 params: { content: message.text, meta: { chat_id: String(message.chat.id) } },

551 })

552 }

553 ```

554 </Step>

555</Steps>

556 

557Claude Code 也保持本地终端对话打开,因此您可以在任一地方回答,第一个到达的答案被应用。不完全匹配预期格式的远程回复以两种方式之一失败,在两种情况下对话都保持打开:

558 

559* **不同格式**:您的入站处理程序的正则表达式无法匹配,因此 `approve it` 或 `yes` 之类的文本(没有 ID)会作为正常消息落入 Claude。

560* **正确格式,错误的 ID**:您的服务器发出判决,但 Claude Code 找不到具有该 ID 的开放请求并静默删除它。

561 

562### 完整示例

563 

564下面组装的 `webhook.ts` 结合了本页的所有三个扩展:回复工具、发送者门控和权限中继。如果您从这里开始,您还需要初始演练中的[项目设置和 `.mcp.json` 条目](#example-build-a-webhook-receiver)。

565 

566为了使两个方向都可以从 curl 测试,HTTP 侦听器提供两个路径:

567 

568* **`GET /events`**:保持 SSE 流打开并将每个出站消息作为 `data:` 行推送,因此 `curl -N` 可以实时观看 Claude 的回复和权限提示到达。

569* **`POST /`**:入站端,与之前相同的处理程序,现在在聊天转发分支之前插入了判决格式检查。

570 

571```ts title="Full webhook.ts with permission relay' expandable theme={null}

572#!/usr/bin/env bun

573import { Server } from '@modelcontextprotocol/sdk/server/index.js'

574import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'

575import { ListToolsRequestSchema, CallToolRequestSchema } from '@modelcontextprotocol/sdk/types.js'

576import { z } from 'zod'

577 

578// --- 出站:写入 /events 上的任何 curl -N 侦听器 ---

579// 真实的桥接会改为 POST 到您的聊天平台。

580const listeners = new Set<(chunk: string) => void>()

581function send(text: string) {

582 const chunk = text.split('\n').map(l => `data: ${l}\n`).join('') + '\n'

583 for (const emit of listeners) emit(chunk)

584}

585 

586// 发送者允许列表。对于本地演练,我们信任单个 X-Sender

587// 标头值 "dev";真实的桥接会检查平台的用户 ID。

588const allowed = new Set(['dev'])

589 

590const mcp = new Server(

591 { name: 'webhook', version: '0.0.1' },

592 {

593 capabilities: {

594 experimental: {

595 'claude/channel': {},

596 'claude/channel/permission': {}, // 选择加入权限中继

597 },

598 tools: {},

599 },

600 instructions:

601 'Messages arrive as <channel source="webhook" chat_id="...">. ' +

602 'Reply with the reply tool, passing the chat_id from the tag.',

603 },

604)

605 

606// --- 回复工具:Claude 调用此项以发送消息回复 ---

607mcp.setRequestHandler(ListToolsRequestSchema, async () => ({

608 tools: [{

609 name: 'reply',

610 description: 'Send a message back over this channel',

611 inputSchema: {

612 type: 'object',

613 properties: {

614 chat_id: { type: 'string', description: 'The conversation to reply in' },

615 text: { type: 'string', description: 'The message to send' },

616 },

617 required: ['chat_id', 'text'],

618 },

619 }],

620}))

621 

622mcp.setRequestHandler(CallToolRequestSchema, async req => {

623 if (req.params.name === 'reply') {

624 const { chat_id, text } = req.params.arguments as { chat_id: string; text: string }

625 send(`Reply to ${chat_id}: ${text}`)

626 return { content: [{ type: 'text', text: 'sent' }] }

627 }

628 throw new Error(`unknown tool: ${req.params.name}`)

629})

630 

631// --- 权限中继:当对话打开时,Claude Code(不是 Claude)调用此项

632const PermissionRequestSchema = z.object({

633 method: z.literal('notifications/claude/channel/permission_request'),

634 params: z.object({

635 request_id: z.string(),

636 tool_name: z.string(),

637 description: z.string(),

638 input_preview: z.string(),

639 }),

640})

641 

642mcp.setNotificationHandler(PermissionRequestSchema, async ({ params }) => {

643 send(

644 `Claude wants to run ${params.tool_name}: ${params.description}\n\n` +

645 `Reply "yes ${params.request_id}" or "no ${params.request_id}"`,

646 )

647})

648 

649await mcp.connect(new StdioServerTransport())

650 

651// --- HTTP on :8788:GET /events 流出站,POST 路由入站 ---

652const PERMISSION_REPLY_RE = /^\s*(y|yes|n|no)\s+([a-km-z]{5})\s*$/i

653let nextId = 1

654 

655Bun.serve({

656 port: 8788,

657 hostname: '127.0.0.1',

658 idleTimeout: 0, // 不要关闭空闲 SSE 流

659 async fetch(req) {

660 const url = new URL(req.url)

661 

662 // GET /events:SSE 流,以便 curl -N 可以实时观看回复和提示

663 if (req.method === 'GET' && url.pathname === '/events') {

664 const stream = new ReadableStream({

665 start(ctrl) {

666 ctrl.enqueue(': connected\n\n') // 所以 curl 立即显示一些内容

667 const emit = (chunk: string) => ctrl.enqueue(chunk)

668 listeners.add(emit)

669 req.signal.addEventListener('abort', () => listeners.delete(emit))

670 },

671 })

672 return new Response(stream, {

673 headers: { 'Content-Type': 'text/event-stream', 'Cache-Control': 'no-cache' },

674 })

675 }

676 

677 // 其他一切都是入站:首先根据发送者进行门控

678 const body = await req.text()

679 const sender = req.headers.get('X-Sender') ?? ''

680 if (!allowed.has(sender)) return new Response('forbidden', { status: 403 })

681 

682 // 在将其视为聊天之前检查判决格式

683 const m = PERMISSION_REPLY_RE.exec(body)

684 if (m) {

685 await mcp.notification({

686 method: 'notifications/claude/channel/permission',

687 params: {

688 request_id: m[2].toLowerCase(),

689 behavior: m[1].toLowerCase().startsWith('y') ? 'allow' : 'deny',

690 },

691 })

692 return new Response('verdict recorded')

693 }

694 

695 // 正常聊天:作为频道事件转发给 Claude

696 const chat_id = String(nextId++)

697 await mcp.notification({

698 method: 'notifications/claude/channel',

699 params: { content: body, meta: { chat_id, path: url.pathname } },

700 })

701 return new Response('ok')

702 },

703})

704```

705 

706在三个终端中测试判决路径。第一个是您的 Claude Code 会话,使用[开发标志](#test-during-the-research-preview)启动,以便它生成 `webhook.ts`:

707 

708```bash theme={null}

709claude --dangerously-load-development-channels server:webhook

710```

711 

712在第二个中,流出站端,以便您可以看到 Claude 的回复和任何权限提示在它们触发时到达:

713 

714```bash theme={null}

715curl -N localhost:8788/events

716```

717 

718在第三个中,发送一条消息,使 Claude 尝试运行命令:

719 

720```bash theme={null}

721curl -d "list the files in this directory" -H "X-Sender: dev" localhost:8788

722```

723 

724本地权限对话在您的 Claude Code 终端中打开。片刻后,提示出现在 `/events` 流中,包括五字母 ID。从远程端批准它:

725 

726```bash theme={null}

727curl -d "yes <id>" -H "X-Sender: dev" localhost:8788

728```

729 

730本地对话关闭,工具运行。Claude 的回复通过 `reply` 工具返回并也在流中着陆。

731 

732此文件中的三个频道特定部分:

733 

734* **`Server` 构造函数中的能力**:`claude/channel` 注册通知侦听器,`claude/channel/permission` 选择加入权限中继,`tools` 让 Claude 发现回复工具。

735* **出站路径**:`reply` 工具处理程序是 Claude 为会话响应调用的;`PermissionRequestSchema` 通知处理程序是当权限对话打开时 Claude Code 调用的。两者都调用 `send()` 通过 `/events` 广播,但它们由系统的不同部分触发。

736* **HTTP 处理程序**:`GET /events` 保持 SSE 流打开,以便 curl 可以实时观看出站;`POST` 是入站,根据 `X-Sender` 标头进行门控。`yes <id>` 或 `no <id>` 主体作为判决通知进入 Claude Code,永远不会到达 Claude;其他任何东西都作为频道事件转发给 Claude。

737 

738## 打包为插件

739 

740要使您的频道可安装和可共享,请将其包装在[插件](/zh-CN/plugins)中并将其发布到[市场](/zh-CN/plugin-marketplaces)。用户使用 `/plugin install` 安装它,然后使用 `--channels plugin:<name>@<marketplace>` 按会话启用它。

741 

742发布到您自己的市场的频道仍然需要 `--dangerously-load-development-channels` 来运行,因为它不在[批准的允许列表](/zh-CN/channels#supported-channels)上。要将其添加,[将其提交到官方市场](/zh-CN/plugins#submit-your-plugin-to-the-official-marketplace)。频道插件在被批准之前经过安全审查。在 Team 和 Enterprise 计划上,管理员可以改为将您的插件包含在组织自己的 [`allowedChannelPlugins`](/zh-CN/channels#restrict-which-channel-plugins-can-run) 列表中,该列表替换默认的 Anthropic 允许列表。

743 

744## 另请参阅

745 

746* [Channels](/zh-CN/channels) 安装和使用 Telegram、Discord、iMessage 或 fakechat 演示,以及为 Team 或 Enterprise 组织启用频道

747* [工作频道实现](https://github.com/anthropics/claude-plugins-official/tree/main/external_plugins)用于具有配对流、回复工具和文件附件的完整服务器代码

748* [MCP](/zh-CN/mcp) 用于频道服务器实现的基础协议

749* [Plugins](/zh-CN/plugins) 打包您的频道,以便用户可以使用 `/plugin install` 安装它

checkpointing.md +89 −0 created

Details

1> ## Documentation Index

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

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

4 

5# checkpointing

6 

7> 跟踪、回溯和总结 Claude 的编辑和对话以管理会话状态。

8 

9Claude Code 自动跟踪 Claude 在工作时所做的文件编辑,允许您快速撤销更改并回溯到之前的状态,以防任何事情出现偏差。

10 

11## checkpointing 如何工作

12 

13当您与 Claude 合作时,checkpointing 会自动捕获每次编辑前代码的状态。这个安全网让您可以放心地执行雄心勃勃的大规模任务,因为您始终可以返回到之前的代码状态。

14 

15### 自动跟踪

16 

17Claude Code 跟踪其文件编辑工具所做的所有更改:

18 

19* 每个用户提示都会创建一个新的 checkpoint

20* Checkpoints 在会话之间持久存在,因此您可以在恢复的对话中访问它们

21* 在 30 天后自动清理(可配置)

22 

23### 回溯和总结

24 

25按两次 `Esc`(`Esc` + `Esc`)或使用 `/rewind` 命令打开回溯菜单。一个可滚动的列表显示会话中的每个提示。选择您想要操作的点,然后选择一个操作:

26 

27* **恢复代码和对话**:将代码和对话都恢复到该点

28* **恢复对话**:回溯到该消息,同时保持当前代码

29* **恢复代码**:恢复文件更改,同时保持对话

30* **从此处总结**:将此点之后的对话压缩为摘要,释放 context window 空间

31* **算了**:返回消息列表而不做任何更改

32 

33恢复对话或总结后,所选消息的原始提示会恢复到输入字段中,以便您可以重新发送或编辑它。

34 

35#### 恢复与总结

36 

37三个恢复选项恢复状态:它们撤销代码更改、对话历史或两者。"从此处总结"的工作方式不同:

38 

39* 所选消息之前的消息保持不变

40* 所选消息及其后的所有消息被替换为紧凑的 AI 生成的摘要

41* 磁盘上的文件不会改变

42* 原始消息保存在会话记录中,因此 Claude 可以在需要时参考详细信息

43 

44这类似于 `/compact`,但更有针对性:您不是总结整个对话,而是保持早期上下文的完整细节,只压缩占用空间的部分。您可以输入可选说明来指导摘要的重点。

45 

46<Note>

47 总结将您保持在同一会话中并压缩上下文。如果您想尝试不同的方法,同时保持原始会话完整,请改用 [fork](/zh-CN/how-claude-code-works#resume-or-fork-sessions)(`claude --continue --fork-session`)。

48</Note>

49 

50## 常见用例

51 

52Checkpoints 在以下情况下特别有用:

53 

54* **探索替代方案**:尝试不同的实现方法,而不会丢失起点

55* **从错误中恢复**:快速撤销引入错误或破坏功能的更改

56* **迭代功能**:进行变体实验,知道您可以恢复到工作状态

57* **释放上下文空间**:从中点开始总结冗长的调试会话,保持初始说明完整

58 

59## 限制

60 

61### Bash 命令更改未跟踪

62 

63Checkpointing 不跟踪由 bash 命令修改的文件。例如,如果 Claude Code 运行:

64 

65```bash theme={null}

66rm file.txt

67mv old.txt new.txt

68cp source.txt dest.txt

69```

70 

71这些文件修改无法通过回溯撤销。只有通过 Claude 的文件编辑工具进行的直接文件编辑才会被跟踪。

72 

73### 外部更改未跟踪

74 

75Checkpointing 仅跟踪在当前会话中编辑过的文件。您在 Claude Code 外部对文件所做的手动更改以及来自其他并发会话的编辑通常不会被捕获,除非它们碰巧修改了与当前会话相同的文件。

76 

77### 不是版本控制的替代品

78 

79Checkpoints 设计用于快速的会话级恢复。对于永久版本历史和协作:

80 

81* 继续使用版本控制(例如 Git)进行提交、分支和长期历史

82* Checkpoints 补充但不替代适当的版本控制

83* 将 checkpoints 视为"本地撤销",将 Git 视为"永久历史"

84 

85## 另请参阅

86 

87* [Interactive mode](/zh-CN/interactive-mode) - 快捷键和会话控制

88* [Built-in commands](/zh-CN/commands) - 使用 `/rewind` 访问 checkpoints

89* [CLI reference](/zh-CN/cli-reference) - 命令行选项

chrome.md +232 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 在 Chrome 中使用 Claude Code(测试版)

6 

7> 将 Claude Code 连接到 Chrome 浏览器,以测试网络应用、使用控制台日志进行调试、自动填充表单以及从网页中提取数据。

8 

9Claude Code 与 [Claude in Chrome 浏览器扩展程序](https://chromewebstore.google.com/detail/claude/fcoeoabgfenejglbffodgkkbkcdhcgfn) 集成,为您提供从 CLI 或 [VS Code 扩展程序](/zh-CN/vs-code#automate-browser-tasks-with-chrome) 进行浏览器自动化的功能。构建您的代码,然后在浏览器中测试和调试,无需切换上下文。

10 

11Claude 为浏览器任务打开新标签页,并共享您浏览器的登录状态,因此它可以访问您已登录的任何网站。浏览器操作在实时可见的 Chrome 窗口中运行。当 Claude 遇到登录页面或 CAPTCHA 时,它会暂停并要求您手动处理。

12 

13<Note>

14 Chrome 集成处于测试版阶段,目前适用于 Google Chrome 和 Microsoft Edge。尚不支持 Brave、Arc 或其他基于 Chromium 的浏览器。也不支持 WSL(Windows 子系统 for Linux)。

15</Note>

16 

17## 功能

18 

19连接 Chrome 后,您可以在单个工作流中链接浏览器操作和编码任务:

20 

21* **实时调试**:直接读取控制台错误和 DOM 状态,然后修复导致这些错误的代码

22* **设计验证**:从 Figma 模型构建 UI,然后在浏览器中打开它以验证它是否匹配

23* **网络应用测试**:测试表单验证、检查视觉回归或验证用户流程

24* **已认证的网络应用**:与 Google Docs、Gmail、Notion 或您已登录的任何应用交互,无需 API 连接器

25* **数据提取**:从网页中提取结构化信息并将其保存到本地

26* **任务自动化**:自动化重复的浏览器任务,如数据输入、表单填充或多站点工作流

27* **会话录制**:将浏览器交互录制为 GIF,以记录或分享发生的情况

28 

29## 前置条件

30 

31在使用 Claude Code 与 Chrome 之前,您需要:

32 

33* [Google Chrome](https://www.google.com/chrome/) 或 [Microsoft Edge](https://www.microsoft.com/edge) 浏览器

34* [Claude in Chrome 扩展程序](https://chromewebstore.google.com/detail/claude/fcoeoabgfenejglbffodgkkbkcdhcgfn) 版本 1.0.36 或更高版本,可在 Chrome Web Store 中为两个浏览器获得

35* [Claude Code](/zh-CN/quickstart#step-1-install-claude-code) 版本 2.0.73 或更高版本

36* 直接 Anthropic 计划(Pro、Max、Team 或 Enterprise)

37 

38<Note>

39 Chrome 集成不可通过 Amazon Bedrock、Google Cloud Vertex AI 或 Microsoft Foundry 等第三方提供商获得。如果您仅通过第三方提供商访问 Claude,则需要单独的 claude.ai 账户来使用此功能。

40</Note>

41 

42## 在 CLI 中开始

43 

44<Steps>

45 <Step title="使用 Chrome 启动 Claude Code">

46 使用 `--chrome` 标志启动 Claude Code:

47 

48 ```bash theme={null}

49 claude --chrome

50 ```

51 

52 您也可以通过在现有会话中运行 `/chrome` 来启用 Chrome。

53 </Step>

54 

55 <Step title="要求 Claude 使用浏览器">

56 此示例导航到页面、与其交互并报告其发现,全部来自您的终端或编辑器:

57 

58 ```text theme={null}

59 Go to code.claude.com/docs, click on the search box,

60 type "hooks", and tell me what results appear

61 ```

62 </Step>

63</Steps>

64 

65随时运行 `/chrome` 以检查连接状态、管理权限或重新连接扩展程序。

66 

67对于 VS Code,请参阅 [VS Code 中的浏览器自动化](/zh-CN/vs-code#automate-browser-tasks-with-chrome)。

68 

69### 默认启用 Chrome

70 

71为了避免每个会话都传递 `--chrome`,运行 `/chrome` 并选择"默认启用"。

72 

73在 [VS Code 扩展程序](/zh-CN/vs-code#automate-browser-tasks-with-chrome) 中,只要安装了 Chrome 扩展程序,Chrome 就可用。无需额外标志。

74 

75<Note>

76 在 CLI 中默认启用 Chrome 会增加上下文使用,因为浏览器工具始终被加载。如果您注意到上下文消耗增加,请禁用此设置,仅在需要时使用 `--chrome`。

77</Note>

78 

79### 管理网站权限

80 

81网站级权限从 Chrome 扩展程序继承。在 Chrome 扩展程序设置中管理权限,以控制 Claude 可以浏览、点击和输入的网站。

82 

83## 示例工作流

84 

85这些示例展示了将浏览器操作与编码任务结合的常见方式。运行 `/mcp` 并选择 `claude-in-chrome` 以查看可用浏览器工具的完整列表。

86 

87### 测试本地网络应用

88 

89在开发网络应用时,要求 Claude 验证您的更改是否正常工作:

90 

91```text theme={null}

92I just updated the login form validation. Can you open localhost:3000,

93try submitting the form with invalid data, and check if the error

94messages appear correctly?

95```

96 

97Claude 导航到您的本地服务器、与表单交互并报告其观察到的内容。

98 

99### 使用控制台日志进行调试

100 

101Claude 可以读取控制台输出以帮助诊断问题。告诉 Claude 要查找的模式,而不是要求所有控制台输出,因为日志可能很冗长:

102 

103```text theme={null}

104Open the dashboard page and check the console for any errors when

105the page loads.

106```

107 

108Claude 读取控制台消息,可以过滤特定模式或错误类型。

109 

110### 自动填充表单

111 

112加快重复数据输入任务的速度:

113 

114```text theme={null}

115I have a spreadsheet of customer contacts in contacts.csv. For each row,

116go to the CRM at crm.example.com, click "Add Contact", and fill in the

117name, email, and phone fields.

118```

119 

120Claude 读取您的本地文件、导航网络界面并为每条记录输入数据。

121 

122### 在 Google Docs 中起草内容

123 

124使用 Claude 直接在您的文档中写入,无需 API 设置:

125 

126```text theme={null}

127Draft a project update based on the recent commits and add it to my

128Google Doc at docs.google.com/document/d/abc123

129```

130 

131Claude 打开文档、点击编辑器并输入内容。这适用于您已登录的任何网络应用:Gmail、Notion、Sheets 等。

132 

133### 从网页中提取数据

134 

135从网站中提取结构化信息:

136 

137```text theme={null}

138Go to the product listings page and extract the name, price, and

139availability for each item. Save the results as a CSV file.

140```

141 

142Claude 导航到页面、读取内容并将数据编译成结构化格式。

143 

144### 运行多站点工作流

145 

146协调多个网站之间的任务:

147 

148```text theme={null}

149Check my calendar for meetings tomorrow, then for each meeting with

150an external attendee, look up their company website and add a note

151about what they do.

152```

153 

154Claude 跨标签页工作以收集信息并完成工作流。

155 

156### 录制演示 GIF

157 

158创建浏览器交互的可共享录制:

159 

160```text theme={null}

161Record a GIF showing how to complete the checkout flow, from adding

162an item to the cart through to the confirmation page.

163```

164 

165Claude 录制交互序列并将其保存为 GIF 文件。

166 

167## 故障排除

168 

169### 未检测到扩展程序

170 

171如果 Claude Code 显示"未检测到 Chrome 扩展程序":

172 

1731. 验证 Chrome 扩展程序已安装并在 `chrome://extensions` 中启用

1742. 通过运行 `claude --version` 验证 Claude Code 是最新的

1753. 检查 Chrome 是否正在运行

1764. 运行 `/chrome` 并选择"重新连接扩展程序"以重新建立连接

1775. 如果问题仍然存在,请重新启动 Claude Code 和 Chrome

178 

179第一次启用 Chrome 集成时,Claude Code 会安装本机消息传递主机配置文件。Chrome 在启动时读取此文件,因此如果扩展程序在您的第一次尝试中未被检测到,请重新启动 Chrome 以获取新配置。

180 

181如果连接仍然失败,请验证主机配置文件是否存在于:

182 

183对于 Chrome:

184 

185* **macOS**:`~/Library/Application Support/Google/Chrome/NativeMessagingHosts/com.anthropic.claude_code_browser_extension.json`

186* **Linux**:`~/.config/google-chrome/NativeMessagingHosts/com.anthropic.claude_code_browser_extension.json`

187* **Windows**:检查 Windows 注册表中的 `HKCU\Software\Google\Chrome\NativeMessagingHosts\`

188 

189对于 Edge:

190 

191* **macOS**:`~/Library/Application Support/Microsoft Edge/NativeMessagingHosts/com.anthropic.claude_code_browser_extension.json`

192* **Linux**:`~/.config/microsoft-edge/NativeMessagingHosts/com.anthropic.claude_code_browser_extension.json`

193* **Windows**:检查 Windows 注册表中的 `HKCU\Software\Microsoft\Edge\NativeMessagingHosts\`

194 

195### 浏览器无响应

196 

197如果 Claude 的浏览器命令停止工作:

198 

1991. 检查是否有模态对话框(alert、confirm、prompt)阻止页面。JavaScript 对话框阻止浏览器事件并防止 Claude 接收命令。手动关闭对话框,然后告诉 Claude 继续。

2002. 要求 Claude 创建新标签页并重试

2013. 通过在 `chrome://extensions` 中禁用并重新启用来重新启动 Chrome 扩展程序

202 

203### 长会话期间连接断开

204 

205Chrome 扩展程序的 service worker 在扩展会话期间可能会进入空闲状态,这会破坏连接。如果浏览器工具在一段时间不活动后停止工作,请运行 `/chrome` 并选择"重新连接扩展程序"。

206 

207### Windows 特定问题

208 

209在 Windows 上,您可能会遇到:

210 

211* **命名管道冲突 (EADDRINUSE)**:如果另一个进程正在使用相同的命名管道,请重新启动 Claude Code。关闭任何可能使用 Chrome 的其他 Claude Code 会话。

212* **本机消息传递主机错误**:如果本机消息传递主机在启动时崩溃,请尝试重新安装 Claude Code 以重新生成主机配置。

213 

214### 常见错误消息

215 

216这些是最常见的错误及其解决方法:

217 

218| 错误 | 原因 | 修复 |

219| ------------ | -------------------------- | ---------------------------------------------- |

220| "浏览器扩展程序未连接" | 本机消息传递主机无法到达扩展程序 | 重新启动 Chrome 和 Claude Code,然后运行 `/chrome` 以重新连接 |

221| "未检测到扩展程序" | Chrome 扩展程序未安装或已禁用 | 在 `chrome://extensions` 中安装或启用扩展程序 |

222| "没有可用的标签页" | Claude 在标签页准备好之前尝试操作 | 要求 Claude 创建新标签页并重试 |

223| "接收端不存在" | 扩展程序 service worker 进入空闲状态 | 运行 `/chrome` 并选择"重新连接扩展程序" |

224 

225## 另请参阅

226 

227* [计算机使用](/zh-CN/computer-use):当任务无法在浏览器中完成时控制本机 macOS 应用

228* [在 VS Code 中使用 Claude Code](/zh-CN/vs-code#automate-browser-tasks-with-chrome):VS Code 扩展程序中的浏览器自动化

229* [CLI 参考](/zh-CN/cli-reference):命令行标志,包括 `--chrome`

230* [常见工作流](/zh-CN/common-workflows):更多使用 Claude Code 的方式

231* [数据和隐私](/zh-CN/data-usage):Claude Code 如何处理您的数据

232* [Claude in Chrome 入门](https://support.claude.com/en/articles/12012173-getting-started-with-claude-in-chrome):Chrome 扩展程序的完整文档,包括快捷键、计划和权限

claude-code-on-the-web.md +773 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 在网络上使用 Claude Code

6 

7> 配置云环境、设置脚本、网络访问和 Docker,在 Anthropic 的沙箱中运行。使用 `--remote` 和 `--teleport` 在网络和终端之间移动会话。

8 

9<Note>

10 Claude Code on the web 处于研究预览阶段,适用于 Pro、Max 和 Team 用户,以及拥有高级席位或 Chat + Claude Code 席位的 Enterprise 用户。

11</Note>

12 

13Claude Code on the web 在 [claude.ai/code](https://claude.ai/code) 的 Anthropic 管理的云基础设施上运行任务。会话即使在关闭浏览器后也会持续,你可以从 Claude 移动应用监控它们。

14 

15<Tip>

16 初次使用 Claude Code on the web?从[入门](/zh-CN/web-quickstart)开始,连接你的 GitHub 账户并提交你的第一个任务。

17</Tip>

18 

19本页涵盖:

20 

21* [GitHub 身份验证选项](#github-authentication-options):两种连接 GitHub 的方式

22* [云环境](#the-cloud-environment):哪些配置会保留、安装了哪些工具以及如何配置环境

23* [设置脚本](#setup-scripts)和依赖管理

24* [网络访问](#network-access):级别、代理和默认允许列表

25* [在网络和终端之间移动任务](#move-tasks-between-web-and-terminal),使用 `--remote` 和 `--teleport`

26* [处理会话](#work-with-sessions):审查、共享、归档、删除

27* [自动修复拉取请求](#auto-fix-pull-requests):自动响应 CI 失败和审查评论

28* [安全和隔离](#security-and-isolation):会话如何隔离

29* [限制](#limitations):速率限制和平台限制

30 

31## GitHub 身份验证选项

32 

33云会话需要访问你的 GitHub 存储库来克隆代码和推送分支。你可以通过两种方式授予访问权限:

34 

35| 方法 | 工作原理 | 最适合 |

36| :--------------- | :----------------------------------------------------------------------------- | :--------------- |

37| **GitHub App** | 在[网络入门](/zh-CN/web-quickstart)期间在特定存储库上安装 Claude GitHub App。访问权限按存储库限定。 | 希望明确的按存储库授权的团队 |

38| **`/web-setup`** | 在终端中运行 `/web-setup` 以将本地 `gh` CLI 令牌同步到你的 Claude 账户。访问权限与你的 `gh` 令牌可以看到的内容相匹配。 | 已经使用 `gh` 的个人开发者 |

39 

40两种方法都可以。[`/schedule`](/zh-CN/routines)检查任一形式的访问权限,如果都未配置,会提示你运行 `/web-setup`。有关 `/web-setup` 演练,请参阅[从终端连接](/zh-CN/web-quickstart#connect-from-your-terminal)。

41 

42GitHub App 是[自动修复](#auto-fix-pull-requests)所必需的,它使用该 App 接收 PR webhooks。如果你使用 `/web-setup` 连接,稍后想要自动修复,请在这些存储库上安装该 App。

43 

44Team 和 Enterprise 管理员可以在 [claude.ai/admin-settings/claude-code](https://claude.ai/admin-settings/claude-code) 处使用快速网络设置切换来禁用 `/web-setup`。

45 

46<Note>

47 启用了[零数据保留](/zh-CN/zero-data-retention)的组织无法使用 `/web-setup` 或其他云会话功能。

48</Note>

49 

50## 云环境

51 

52每个会话在一个新的 Anthropic 管理的 VM 中运行,其中克隆了你的存储库。本节涵盖会话启动时可用的内容以及如何自定义它。

53 

54### 云会话中可用的内容

55 

56云会话从你的存储库的新克隆开始。任何提交到存储库的内容都可用。任何你仅在自己的机器上安装或配置的内容都不可用。

57 

58| | 在云会话中可用 | 原因 |

59| :------------------------------------------------------------- | :------ | :------------------------------------------------------------------------------------------- |

60| 你的存储库的 `CLAUDE.md` | 是 | 克隆的一部分 |

61| 你的存储库的 `.claude/settings.json` hooks | 是 | 克隆的一部分 |

62| 你的存储库的 `.mcp.json` MCP 服务器 | 是 | 克隆的一部分 |

63| 你的存储库的 `.claude/rules/` | 是 | 克隆的一部分 |

64| 你的存储库的 `.claude/skills/`、`.claude/agents/`、`.claude/commands/` | 是 | 克隆的一部分 |

65| 在 `.claude/settings.json` 中声明的插件 | 是 | 在会话启动时从你声明的[市场](/zh-CN/plugin-marketplaces)安装。需要网络访问才能到达市场源 |

66| 你的用户 `~/.claude/CLAUDE.md` | 否 | 存在于你的机器上,不在存储库中 |

67| 仅在你的用户设置中启用的插件 | 否 | 用户范围的 `enabledPlugins` 存在于 `~/.claude/settings.json` 中。改为在存储库的 `.claude/settings.json` 中声明它们 |

68| 你使用 `claude mcp add` 添加的 MCP 服务器 | 否 | 这些写入你的本地用户配置,不是存储库。改为在[`.mcp.json`](/zh-CN/mcp#project-scope)中声明服务器 |

69| 静态 API 令牌和凭证 | 否 | 尚不存在专用的秘密存储。见下文 |

70| 交互式身份验证,如 AWS SSO | 否 | 不支持。SSO 需要无法在云会话中运行的基于浏览器的登录 |

71 

72要使配置在云会话中可用,请将其提交到存储库。尚不存在专用的秘密存储。环境变量和设置脚本都存储在环境配置中,对任何可以编辑该环境的人可见。如果你需要云会话中的秘密,请将它们添加为环境变量,并考虑这种可见性。

73 

74### 已安装的工具

75 

76云会话预装了常见的语言运行时、构建工具和数据库。下表按类别总结了包含的内容。

77 

78| 类别 | 包含 |

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

80| **Python** | Python 3.x,带有 pip、poetry、uv、black、mypy、pytest、ruff |

81| **Node.js** | 20、21 和 22(通过 nvm),带有 npm、yarn、pnpm、bun¹、eslint、prettier、chromedriver |

82| **Ruby** | 3.1、3.2、3.3,带有 gem、bundler、rbenv |

83| **PHP** | 8.4,带有 Composer |

84| **Java** | OpenJDK 21,带有 Maven 和 Gradle |

85| **Go** | 最新稳定版本,带有模块支持 |

86| **Rust** | rustc 和 cargo |

87| **C/C++** | GCC、Clang、cmake、ninja、conan |

88| **Docker** | docker、dockerd、docker compose |

89| **数据库** | PostgreSQL 16、Redis 7.0 |

90| **实用工具** | git、jq、yq、ripgrep、tmux、vim、nano |

91 

92¹ Bun 已安装,但对于包获取有已知的[代理兼容性问题](#install-dependencies-with-a-sessionstart-hook)。

93 

94要了解确切版本,请要求 Claude 在云会话中运行 `check-tools`。此命令仅存在于云会话中。

95 

96### 处理 GitHub 问题和拉取请求

97 

98云会话包括内置的 GitHub 工具,让 Claude 可以读取问题、列出拉取请求、获取 diffs 和发布评论,无需任何设置。这些工具通过[GitHub 代理](#github-proxy)进行身份验证,使用你在[GitHub 身份验证选项](#github-authentication-options)下配置的任何方法,所以你的令牌永远不会进入容器。

99 

100`gh` CLI 未预装。如果你需要内置工具不涵盖的 `gh` 命令,如 `gh release` 或 `gh workflow run`,请自己安装和身份验证:

101 

102<Steps>

103 <Step title="在设置脚本中安装 gh">

104 将 `apt update && apt install -y gh` 添加到你的[设置脚本](#setup-scripts)。

105 </Step>

106 

107 <Step title="提供令牌">

108 将 `GH_TOKEN` 环境变量添加到你的[环境设置](#configure-your-environment),使用 GitHub 个人访问令牌。`gh` 会自动读取 `GH_TOKEN`,所以不需要 `gh auth login` 步骤。

109 </Step>

110</Steps>

111 

112### 将工件链接回会话

113 

114每个云会话在 claude.ai 上都有一个成绩单 URL,会话可以从 `CLAUDE_CODE_REMOTE_SESSION_ID` 环境变量读取自己的 ID。使用这个在 PR 正文、提交消息、Slack 帖子或生成的报告中放置可追踪的链接,以便审查者可以打开生成它们的运行。

115 

116要求 Claude 从环境变量构造链接。以下命令打印 URL:

117 

118```bash theme={null}

119echo "https://claude.ai/code/${CLAUDE_CODE_REMOTE_SESSION_ID}"

120```

121 

122### 运行测试、启动服务和添加包

123 

124Claude 作为处理任务的一部分运行测试。在你的提示中要求它,如"修复 `tests/` 中的失败测试"或"在每次更改后运行 pytest"。测试运行器如 pytest、jest 和 cargo test 开箱即用,因为它们已预装。

125 

126PostgreSQL 和 Redis 已预装但默认不运行。在会话期间要求 Claude 启动每一个:

127 

128```bash theme={null}

129service postgresql start

130```

131 

132```bash theme={null}

133service redis-server start

134```

135 

136Docker 可用于运行容器化服务。要求 Claude 运行 `docker compose up` 来启动你的项目的服务。拉取镜像的网络访问遵循你的环境的[访问级别](#access-levels),[受信任的默认值](#default-allowed-domains)包括 Docker Hub 和其他常见注册表。

137 

138如果你的镜像很大或拉取速度很慢,请将 `docker compose pull` 或 `docker compose build` 添加到你的[设置脚本](#setup-scripts)。拉取的镜像保存在[缓存的环境](#environment-caching)中,所以每个新会话都在磁盘上有它们。缓存仅存储文件,不存储运行的进程,所以 Claude 仍然在每个会话中启动容器。

139 

140要添加未预装的包,请使用[设置脚本](#setup-scripts)。脚本的输出被[缓存](#environment-caching),所以你在那里安装的包在每个会话开始时都可用,无需每次重新安装。你也可以要求 Claude 在会话期间安装包,但这些安装不会在会话之间持续。

141 

142### 资源限制

143 

144云会话运行时具有可能随时间变化的近似资源上限:

145 

146* 4 个 vCPU

147* 16 GB RAM

148* 30 GB 磁盘

149 

150需要明显更多内存的任务,如大型构建作业或内存密集型测试,可能会失败或被终止。对于超出这些限制的工作负载,使用[远程控制](/zh-CN/remote-control)在你自己的硬件上运行 Claude Code。

151 

152### 配置你的环境

153 

154环境控制[网络访问](#network-access)、环境变量和在会话启动前运行的[设置脚本](#setup-scripts)。有关不需要任何配置即可使用的内容,请参阅[已安装的工具](#installed-tools)。你可以从网络界面或终端管理环境:

155 

156| 操作 | 如何操作 |

157| :----------------- | :------------------------------------------------------------------------------ |

158| 添加环境 | 选择当前环境以打开选择器,然后选择**添加环境**。对话框包括名称、网络访问级别、环境变量和设置脚本。 |

159| 编辑环境 | 选择环境名称右侧的设置图标。 |

160| 归档环境 | 打开环境进行编辑并选择**归档**。归档的环境从选择器中隐藏,但现有会话继续运行。 |

161| 为 `--remote` 设置默认值 | 在终端中运行 `/remote-env`。如果你有单个环境,此命令显示你的当前配置。`/remote-env` 仅选择默认值;从网络界面添加、编辑和归档环境。 |

162 

163环境变量使用 `.env` 格式,每行一个 `KEY=value` 对。不要用引号包装值,因为引号会存储为值的一部分。

164 

165```text theme={null}

166NODE_ENV=development

167LOG_LEVEL=debug

168DATABASE_URL=postgres://localhost:5432/myapp

169```

170 

171## 设置脚本

172 

173设置脚本是一个 Bash 脚本,在新的云会话启动时运行,在 Claude Code 启动之前。使用设置脚本来安装依赖、配置工具或获取会话需要的任何未预装的内容。

174 

175脚本在 Ubuntu 24.04 上以 root 身份运行,所以 `apt install` 和大多数语言包管理器都可以工作。

176 

177要添加设置脚本,请打开环境设置对话框并在**设置脚本**字段中输入你的脚本。

178 

179此示例安装 `gh` CLI,它未预装:

180 

181```bash theme={null}

182#!/bin/bash

183apt update && apt install -y gh

184```

185 

186如果脚本以非零值退出,会话将无法启动。将 `|| true` 附加到非关键命令以避免在不稳定的安装失败时阻止会话。

187 

188<Note>

189 安装包的设置脚本需要网络访问才能到达注册表。默认**受信任**网络访问允许连接到[常见包注册表](#default-allowed-domains),包括 npm、PyPI、RubyGems 和 crates.io。如果你的环境使用**无**网络访问,脚本将无法安装包。

190</Note>

191 

192### 环境缓存

193 

194设置脚本在你首次在环境中启动会话时运行。完成后,Anthropic 会对文件系统进行快照,并将该快照重用作为后续会话的起点。新会话以你的依赖、工具和 Docker 镜像已在磁盘上开始,设置脚本步骤被跳过。这即使在脚本安装大型工具链或拉取容器镜像时也能保持启动速度快。

195 

196缓存捕获文件,不捕获运行的进程。设置脚本写入磁盘的任何内容都会保留。它启动的服务或容器不会,所以通过要求 Claude 或使用[SessionStart hook](#setup-scripts-vs-sessionstart-hooks)按会话启动这些。

197 

198当你更改环境的设置脚本或允许的网络主机时,以及当缓存在大约七天后达到过期时间时,设置脚本会再次运行以重建缓存。恢复现有会话永远不会重新运行设置脚本。

199 

200你不需要启用缓存或自己管理快照。

201 

202### 设置脚本与 SessionStart hooks

203 

204使用设置脚本来安装云需要但你的笔记本电脑已有的东西,如语言运行时或 CLI 工具。使用[SessionStart hook](/zh-CN/hooks#sessionstart)进行应该在任何地方运行的项目设置,云和本地,如 `npm install`。

205 

206两者都在会话开始时运行,但它们属于不同的地方:

207 

208| | 设置脚本 | SessionStart hooks |

209| --- | ------------------------- | -------------------------------- |

210| 附加到 | 云环境 | 你的存储库 |

211| 配置在 | 云环境 UI | 你的存储库中的 `.claude/settings.json` |

212| 运行 | 在 Claude Code 启动之前,仅在新会话上 | 在 Claude Code 启动之后,在每个会话上,包括已恢复的 |

213| 范围 | 仅云环境 | 本地和云 |

214 

215SessionStart hooks 也可以在你的用户级 `~/.claude/settings.json` 中本地定义,但用户级设置不会传送到云会话。在云中,仅提交到存储库的 hooks 运行。

216 

217### 使用 SessionStart hook 安装依赖

218 

219要仅在云会话中安装依赖,请将 SessionStart hook 添加到你的存储库的 `.claude/settings.json`:

220 

221```json theme={null}

222{

223 "hooks": {

224 "SessionStart": [

225 {

226 "matcher": "startup|resume",

227 "hooks": [

228 {

229 "type": "command",

230 "command": "\"$CLAUDE_PROJECT_DIR\"/scripts/install_pkgs.sh"

231 }

232 ]

233 }

234 ]

235 }

236}

237```

238 

239在 `scripts/install_pkgs.sh` 创建脚本并使用 `chmod +x` 使其可执行。`CLAUDE_CODE_REMOTE` 环境变量在云会话中设置为 `true`,所以你可以使用它来跳过本地执行:

240 

241```bash theme={null}

242#!/bin/bash

243 

244if [ "$CLAUDE_CODE_REMOTE" != "true" ]; then

245 exit 0

246fi

247 

248npm install

249pip install -r requirements.txt

250exit 0

251```

252 

253SessionStart hooks 在云会话中有一些限制:

254 

255* **无云专用范围**:hooks 在本地和云会话中都运行。要跳过本地执行,请检查脚本中的 `CLAUDE_CODE_REMOTE` 环境变量,如上所示。

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

257* **代理兼容性**:所有出站流量都通过[安全代理](#security-proxy)。某些包管理器不能与此代理正确配合使用。Bun 是一个已知的例子。

258* **增加启动延迟**:hooks 在每次会话启动或恢复时运行,不像设置脚本那样受益于[环境缓存](#environment-caching)。通过在重新安装之前检查依赖是否已存在来保持安装脚本快速。

259 

260要为后续 Bash 命令持久化环境变量,请写入 `$CLAUDE_ENV_FILE` 处的文件。有关详情,请参阅[SessionStart hooks](/zh-CN/hooks#sessionstart)。

261 

262用你自己的 Docker 镜像替换基础镜像尚不支持。使用设置脚本在[提供的镜像](#installed-tools)之上安装你需要的内容,或使用 `docker compose` 与 Claude 并行运行你的镜像作为容器。

263 

264## 网络访问

265 

266网络访问控制来自云环境的出站连接。每个环境指定一个访问级别,你可以使用自定义允许的域来扩展它。默认值是**受信任**,它允许包注册表和其他[允许列表域](#default-allowed-domains)。

267 

268### 访问级别

269 

270在创建或编辑环境时选择访问级别:

271 

272| 级别 | 出站连接 |

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

274| **无** | 无出站网络访问 |

275| **受信任** | [允许列表域](#default-allowed-domains)仅:包注册表、GitHub、云 SDK |

276| **完全** | 任何域 |

277| **自定义** | 你自己的允许列表,可选地包括默认值 |

278 

279GitHub 操作使用独立于此设置的[单独代理](#github-proxy)。

280 

281### 允许特定域

282 

283要允许不在受信任列表中的域,在环境的网络访问设置中选择**自定义**。出现**允许的域**字段。每行输入一个域:

284 

285```text theme={null}

286api.example.com

287*.internal.example.com

288registry.example.com

289```

290 

291使用 `*.` 进行通配符子域匹配。检查**也包括常见包管理器的默认列表**以在自定义条目旁边保留[受信任的域](#default-allowed-domains),或将其取消选中以仅允许你列出的内容。

292 

293### GitHub 代理

294 

295为了安全起见,所有 GitHub 操作都通过专用代理服务进行,该服务透明地处理所有 git 交互。在沙箱内,git 客户端使用自定义构建的作用域凭证进行身份验证。此代理:

296 

297* 安全地管理 GitHub 身份验证:git 客户端在沙箱内使用作用域凭证,代理验证并将其转换为你的实际 GitHub 身份验证令牌

298* 限制 git push 操作到当前工作分支以确保安全

299* 启用克隆、获取和 PR 操作,同时维护安全边界

300 

301### 安全代理

302 

303环境在 HTTP/HTTPS 网络代理后面运行,用于安全和滥用防止目的。所有出站互联网流量都通过此代理,该代理提供:

304 

305* 防止恶意请求

306* 速率限制和滥用防止

307* 增强安全性的内容过滤

308 

309### 默认允许的域

310 

311使用**受信任**网络访问时,默认允许以下域。标记为 `*` 的域表示通配符子域匹配,所以 `*.gcr.io` 允许 `gcr.io` 的任何子域。

312 

313<AccordionGroup>

314 <Accordion title="Anthropic 服务">

315 * api.anthropic.com

316 * statsig.anthropic.com

317 * docs.claude.com

318 * platform.claude.com

319 * code.claude.com

320 * claude.ai

321 </Accordion>

322 

323 <Accordion title="版本控制">

324 * github.com

325 * [www.github.com](http://www.github.com)

326 * api.github.com

327 * npm.pkg.github.com

328 * raw\.githubusercontent.com

329 * pkg-npm.githubusercontent.com

330 * objects.githubusercontent.com

331 * release-assets.githubusercontent.com

332 * codeload.github.com

333 * avatars.githubusercontent.com

334 * camo.githubusercontent.com

335 * gist.github.com

336 * gitlab.com

337 * [www.gitlab.com](http://www.gitlab.com)

338 * registry.gitlab.com

339 * bitbucket.org

340 * [www.bitbucket.org](http://www.bitbucket.org)

341 * api.bitbucket.org

342 </Accordion>

343 

344 <Accordion title="容器注册表">

345 * registry-1.docker.io

346 * auth.docker.io

347 * index.docker.io

348 * hub.docker.com

349 * [www.docker.com](http://www.docker.com)

350 * production.cloudflare.docker.com

351 * download.docker.com

352 * gcr.io

353 * \*.gcr.io

354 * ghcr.io

355 * mcr.microsoft.com

356 * \*.data.mcr.microsoft.com

357 * public.ecr.aws

358 </Accordion>

359 

360 <Accordion title="云平台">

361 * cloud.google.com

362 * accounts.google.com

363 * gcloud.google.com

364 * \*.googleapis.com

365 * storage.googleapis.com

366 * compute.googleapis.com

367 * container.googleapis.com

368 * azure.com

369 * portal.azure.com

370 * microsoft.com

371 * [www.microsoft.com](http://www.microsoft.com)

372 * \*.microsoftonline.com

373 * packages.microsoft.com

374 * dotnet.microsoft.com

375 * dot.net

376 * visualstudio.com

377 * dev.azure.com

378 * \*.amazonaws.com

379 * \*.api.aws

380 * oracle.com

381 * [www.oracle.com](http://www.oracle.com)

382 * java.com

383 * [www.java.com](http://www.java.com)

384 * java.net

385 * [www.java.net](http://www.java.net)

386 * download.oracle.com

387 * yum.oracle.com

388 </Accordion>

389 

390 <Accordion title="JavaScript 和 Node 包管理器">

391 * registry.npmjs.org

392 * [www.npmjs.com](http://www.npmjs.com)

393 * [www.npmjs.org](http://www.npmjs.org)

394 * npmjs.com

395 * npmjs.org

396 * yarnpkg.com

397 * registry.yarnpkg.com

398 </Accordion>

399 

400 <Accordion title="Python 包管理器">

401 * pypi.org

402 * [www.pypi.org](http://www.pypi.org)

403 * files.pythonhosted.org

404 * pythonhosted.org

405 * test.pypi.org

406 * pypi.python.org

407 * pypa.io

408 * [www.pypa.io](http://www.pypa.io)

409 </Accordion>

410 

411 <Accordion title="Ruby 包管理器">

412 * rubygems.org

413 * [www.rubygems.org](http://www.rubygems.org)

414 * api.rubygems.org

415 * index.rubygems.org

416 * ruby-lang.org

417 * [www.ruby-lang.org](http://www.ruby-lang.org)

418 * rubyforge.org

419 * [www.rubyforge.org](http://www.rubyforge.org)

420 * rubyonrails.org

421 * [www.rubyonrails.org](http://www.rubyonrails.org)

422 * rvm.io

423 * get.rvm.io

424 </Accordion>

425 

426 <Accordion title="Rust 包管理器">

427 * crates.io

428 * [www.crates.io](http://www.crates.io)

429 * index.crates.io

430 * static.crates.io

431 * rustup.rs

432 * static.rust-lang.org

433 * [www.rust-lang.org](http://www.rust-lang.org)

434 </Accordion>

435 

436 <Accordion title="Go 包管理器">

437 * proxy.golang.org

438 * sum.golang.org

439 * index.golang.org

440 * golang.org

441 * [www.golang.org](http://www.golang.org)

442 * goproxy.io

443 * pkg.go.dev

444 </Accordion>

445 

446 <Accordion title="JVM 包管理器">

447 * maven.org

448 * repo.maven.org

449 * central.maven.org

450 * repo1.maven.org

451 * repo.maven.apache.org

452 * jcenter.bintray.com

453 * gradle.org

454 * [www.gradle.org](http://www.gradle.org)

455 * services.gradle.org

456 * plugins.gradle.org

457 * kotlinlang.org

458 * [www.kotlinlang.org](http://www.kotlinlang.org)

459 * spring.io

460 * repo.spring.io

461 </Accordion>

462 

463 <Accordion title="其他包管理器">

464 * packagist.org (PHP Composer)

465 * [www.packagist.org](http://www.packagist.org)

466 * repo.packagist.org

467 * nuget.org (.NET NuGet)

468 * [www.nuget.org](http://www.nuget.org)

469 * api.nuget.org

470 * pub.dev (Dart/Flutter)

471 * api.pub.dev

472 * hex.pm (Elixir/Erlang)

473 * [www.hex.pm](http://www.hex.pm)

474 * cpan.org (Perl CPAN)

475 * [www.cpan.org](http://www.cpan.org)

476 * metacpan.org

477 * [www.metacpan.org](http://www.metacpan.org)

478 * api.metacpan.org

479 * cocoapods.org (iOS/macOS)

480 * [www.cocoapods.org](http://www.cocoapods.org)

481 * cdn.cocoapods.org

482 * haskell.org

483 * [www.haskell.org](http://www.haskell.org)

484 * hackage.haskell.org

485 * swift.org

486 * [www.swift.org](http://www.swift.org)

487 </Accordion>

488 

489 <Accordion title="Linux 发行版">

490 * archive.ubuntu.com

491 * security.ubuntu.com

492 * ubuntu.com

493 * [www.ubuntu.com](http://www.ubuntu.com)

494 * \*.ubuntu.com

495 * ppa.launchpad.net

496 * launchpad.net

497 * [www.launchpad.net](http://www.launchpad.net)

498 * \*.nixos.org

499 </Accordion>

500 

501 <Accordion title="开发工具和平台">

502 * dl.k8s.io (Kubernetes)

503 * pkgs.k8s.io

504 * k8s.io

505 * [www.k8s.io](http://www.k8s.io)

506 * releases.hashicorp.com (HashiCorp)

507 * apt.releases.hashicorp.com

508 * rpm.releases.hashicorp.com

509 * archive.releases.hashicorp.com

510 * hashicorp.com

511 * [www.hashicorp.com](http://www.hashicorp.com)

512 * repo.anaconda.com (Anaconda/Conda)

513 * conda.anaconda.org

514 * anaconda.org

515 * [www.anaconda.com](http://www.anaconda.com)

516 * anaconda.com

517 * continuum.io

518 * apache.org (Apache)

519 * [www.apache.org](http://www.apache.org)

520 * archive.apache.org

521 * downloads.apache.org

522 * eclipse.org (Eclipse)

523 * [www.eclipse.org](http://www.eclipse.org)

524 * download.eclipse.org

525 * nodejs.org (Node.js)

526 * [www.nodejs.org](http://www.nodejs.org)

527 * developer.apple.com

528 * developer.android.com

529 * pkg.stainless.com

530 * binaries.prisma.sh

531 </Accordion>

532 

533 <Accordion title="云服务和监控">

534 * statsig.com

535 * [www.statsig.com](http://www.statsig.com)

536 * api.statsig.com

537 * sentry.io

538 * \*.sentry.io

539 * downloads.sentry-cdn.com

540 * http-intake.logs.datadoghq.com

541 * \*.datadoghq.com

542 * \*.datadoghq.eu

543 * api.honeycomb.io

544 </Accordion>

545 

546 <Accordion title="内容交付和镜像">

547 * sourceforge.net

548 * \*.sourceforge.net

549 * packagecloud.io

550 * \*.packagecloud.io

551 * fonts.googleapis.com

552 * fonts.gstatic.com

553 </Accordion>

554 

555 <Accordion title="架构和配置">

556 * json-schema.org

557 * [www.json-schema.org](http://www.json-schema.org)

558 * json.schemastore.org

559 * [www.schemastore.org](http://www.schemastore.org)

560 </Accordion>

561 

562 <Accordion title="Model Context Protocol">

563 * \*.modelcontextprotocol.io

564 </Accordion>

565</AccordionGroup>

566 

567## 在网络和终端之间移动任务

568 

569这些工作流需要[Claude Code CLI](/zh-CN/quickstart)登录到相同的 claude.ai 账户。你可以从终端启动新的云会话,或将云会话拉入终端以在本地继续。云会话即使在关闭笔记本电脑后也会持续,你可以从任何地方(包括 Claude 移动应用)监控它们。

570 

571<Note>

572 从 CLI,会话切换是单向的:你可以使用 `--teleport` 将云会话拉入终端,但不能将现有的终端会话推送到网络。`--remote` 标志为你的当前存储库创建一个新的云会话。[Desktop 应用](/zh-CN/desktop#continue-in-another-surface)提供了一个"在...中继续"菜单,可以将本地会话发送到网络。

573</Note>

574 

575### 从终端到网络

576 

577使用 `--remote` 标志从命令行启动云会话:

578 

579```bash theme={null}

580claude --remote "Fix the authentication bug in src/auth/login.ts"

581```

582 

583这在 claude.ai 上创建一个新的云会话。会话克隆你当前目录的 GitHub 远程,位于你的当前分支,所以如果你有本地提交,请先推送,因为 VM 从 GitHub 而不是你的机器克隆。`--remote` 一次只能处理单个存储库。任务在云中运行,而你继续在本地工作。

584 

585<Note>

586 `--remote` 创建云会话。`--remote-control` 无关:它公开本地 CLI 会话以从网络进行监控。请参阅[远程控制](/zh-CN/remote-control)。

587</Note>

588 

589在 Claude Code CLI 中使用 `/tasks` 检查进度,或在 claude.ai 或 Claude 移动应用上打开会话以直接交互。从那里你可以引导 Claude、提供反馈或回答问题,就像任何其他对话一样。

590 

591#### 云任务的提示

592 

593**在本地规划,远程执行**:对于复杂的任务,在 Plan Mode 中启动 Claude 以协作制定方法,然后将工作发送到云:

594 

595```bash theme={null}

596claude --permission-mode plan

597```

598 

599在 Plan Mode 中,Claude 读取文件、运行命令来探索并提出计划,而不编辑源代码。一旦你满意,将计划保存到存储库、提交和推送,以便云 VM 可以克隆它。然后为自主执行启动云会话:

600 

601```bash theme={null}

602claude --remote "Execute the migration plan in docs/migration-plan.md"

603```

604 

605这种模式让你可以控制策略,同时让 Claude 在云中自主执行。

606 

607**在云中使用 ultraplan 规划**:要在网络会话中起草和审查计划本身,请使用[ultraplan](/zh-CN/ultraplan)。Claude 在 Claude Code on the web 上生成计划,而你继续工作,然后你在浏览器中对部分进行评论,并选择远程执行或将计划发送回终端。

608 

609**并行运行任务**:每个 `--remote` 命令创建自己的云会话,独立运行。你可以启动多个任务,它们都将在单独的会话中同时运行:

610 

611```bash theme={null}

612claude --remote "Fix the flaky test in auth.spec.ts"

613claude --remote "Update the API documentation"

614claude --remote "Refactor the logger to use structured output"

615```

616 

617使用 Claude Code CLI 中的 `/tasks` 监控所有会话。当会话完成时,你可以从网络界面创建 PR 或[传送](#from-web-to-terminal)会话到终端以继续工作。

618 

619#### 发送没有 GitHub 的本地存储库

620 

621当你从未连接到 GitHub 的存储库运行 `claude --remote` 时,Claude Code 会捆绑你的本地存储库并直接上传到云会话。捆绑包包括你的完整存储库历史,跨所有分支,加上对跟踪文件的任何未提交更改。

622 

623当 GitHub 访问不可用时,此回退会自动激活。要即使在 GitHub 已连接时也强制它,请设置 `CCR_FORCE_BUNDLE=1`:

624 

625```bash theme={null}

626CCR_FORCE_BUNDLE=1 claude --remote "Run the test suite and fix any failures"

627```

628 

629捆绑的存储库必须满足这些限制:

630 

631* 目录必须是具有至少一个提交的 git 存储库

632* 捆绑的存储库必须在 100 MB 以下。较大的存储库回退到仅捆绑当前分支,然后回退到工作树的单个压缩快照,仅在快照仍然太大时失败

633* 未跟踪的文件不包括;在你想要云会话看到的文件上运行 `git add`

634* 从捆绑创建的会话无法推送回远程,除非你也配置了[GitHub 身份验证](#github-authentication-options)

635 

636### 从网络到终端

637 

638使用以下任何方式将云会话拉入终端:

639 

640* **使用 `--teleport`**:从命令行,运行 `claude --teleport` 以获得交互式会话选择器,或 `claude --teleport <session-id>` 以直接恢复特定会话。如果你有未提交的更改,系统会提示你先隐藏它们。

641* **使用 `/teleport`**:在现有 CLI 会话内,运行 `/teleport`(或 `/tp`)以打开相同的会话选择器,无需重启 Claude Code。

642* **从 `/tasks`**:运行 `/tasks` 以查看你的后台会话,然后按 `t` 传送到其中一个

643* **从网络界面**:选择**在 CLI 中打开**以复制可以粘贴到终端中的命令

644 

645当你传送一个会话时,Claude 验证你在正确的存储库中,从云会话获取并检出分支,并将完整的对话历史加载到终端中。

646 

647`--teleport` 不同于 `--resume`。`--resume` 从此机器的本地历史重新打开对话,不列出云会话;`--teleport` 拉取云会话及其分支。

648 

649#### 传送要求

650 

651传送在恢复会话之前检查这些要求。如果任何要求未满足,你会看到错误或被提示解决问题。

652 

653| 要求 | 详情 |

654| ---------- | ------------------------------------- |

655| 干净的 git 状态 | 你的工作目录必须没有未提交的更改。如果需要,传送会提示你隐藏更改。 |

656| 正确的存储库 | 你必须从同一存储库的检出运行 `--teleport`,而不是从分叉运行。 |

657| 分支可用 | 云会话中的分支必须已被推送到远程。传送会自动获取并检出它。 |

658| 相同账户 | 你必须认证到云会话中使用的相同 claude.ai 账户。 |

659 

660#### `--teleport` 不可用

661 

662传送需要 claude.ai 订阅身份验证。如果你通过 API 密钥、Bedrock、Vertex AI 或 Microsoft Foundry 进行身份验证,请运行 `/login` 以改为使用你的 claude.ai 账户登录。如果你已通过 claude.ai 登录,`--teleport` 仍不可用,你的组织可能已禁用云会话。

663 

664## 处理会话

665 

666会话出现在 claude.ai/code 的侧边栏中。从那里你可以审查更改、与队友共享、归档完成的工作或永久删除会话。

667 

668### 管理上下文

669 

670云会话支持产生文本输出的[内置命令](/zh-CN/commands)。打开交互式终端选择器的命令,如 `/model` 或 `/config`,不可用。

671 

672对于上下文管理特别是:

673 

674| 命令 | 在云会话中工作 | 注释 |

675| :--------- | :------ | :----------------------------------------------------- |

676| `/compact` | 是 | 总结对话以释放上下文。接受可选的焦点指令,如 `/compact keep the test output` |

677| `/context` | 是 | 显示当前在上下文窗口中的内容 |

678| `/clear` | 否 | 从侧边栏启动新会话 |

679 

680自动压缩在上下文窗口接近容量时自动运行,与 CLI 中相同。要更早触发它,在你的[环境变量](#configure-your-environment)中设置 [`CLAUDE_AUTOCOMPACT_PCT_OVERRIDE`](/zh-CN/env-vars)。例如,`CLAUDE_AUTOCOMPACT_PCT_OVERRIDE=70` 在 70% 容量而不是默认 \~95% 时压缩。要更改压缩计算的有效窗口大小,请使用 [`CLAUDE_CODE_AUTO_COMPACT_WINDOW`](/zh-CN/env-vars)。

681 

682[Subagents](/zh-CN/sub-agents)的工作方式与本地相同。Claude 可以使用 Task 工具生成它们,以将研究或并行工作卸载到单独的上下文窗口中,保持主对话更轻。在你的存储库的 `.claude/agents/` 中定义的 Subagents 会自动被拾取。[Agent teams](/zh-CN/agent-teams)默认关闭,但可以通过将 `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1` 添加到你的[环境变量](#configure-your-environment)来启用。

683 

684### 审查更改

685 

686每个会话显示一个 diff 指示器,显示添加和删除的行数,如 `+42 -18`。选择它以打开 diff 视图,在特定行上留下内联评论,并使用你的下一条消息将它们发送给 Claude。有关完整演练(包括 PR 创建),请参阅[审查和迭代](/zh-CN/web-quickstart#review-and-iterate)。要让 Claude 自动监控 PR 以查找 CI 失败和审查评论,请参阅[自动修复拉取请求](#auto-fix-pull-requests)。

687 

688### 共享会话

689 

690要共享会话,请根据下面的账户类型切换其可见性。之后,按原样共享会话链接。打开链接时,收件人会看到最新状态,但他们的视图不会实时更新。

691 

692#### 从 Enterprise 或 Team 账户共享

693 

694对于 Enterprise 和 Team 账户,两个可见性选项是**私有**和**团队**。团队可见性使会话对你的 claude.ai 组织的其他成员可见。默认情况下启用存储库访问验证,基于连接到收件人账户的 GitHub 账户。你的账户显示名称对所有有访问权限的收件人可见。[Claude in Slack](/zh-CN/slack) 会话会自动以团队可见性共享。

695 

696#### 从 Max 或 Pro 账户共享

697 

698对于 Max 和 Pro 账户,两个可见性选项是**私有**和**公开**。公开可见性使会话对任何登录到 claude.ai 的用户可见。

699 

700在共享之前检查你的会话是否包含敏感内容。会话可能包含来自私有 GitHub 存储库的代码和凭证。默认情况下不启用存储库访问验证。

701 

702要要求收件人拥有存储库访问权限,或从共享会话中隐藏你的名称,请转到设置 > Claude Code > 共享设置。

703 

704### 归档会话

705 

706你可以归档会话以保持你的会话列表有序。归档的会话从默认会话列表中隐藏,但可以通过筛选已归档会话来查看。

707 

708要归档会话,请在侧边栏中悬停在会话上并选择归档图标。

709 

710### 删除会话

711 

712删除会话会永久删除会话及其数据。此操作无法撤销。你可以通过两种方式删除会话:

713 

714* **从侧边栏**:筛选已归档会话,然后悬停在你想删除的会话上并选择删除图标

715* **从会话菜单**:打开会话,选择会话标题旁的下拉菜单,然后选择**删除**

716 

717删除会话前会要求你确认。

718 

719## 自动修复拉取请求

720 

721Claude 可以监视拉取请求并自动响应 CI 失败和审查评论。Claude 订阅 PR 上的 GitHub 活动,当检查失败或审查者留下评论时,Claude 会调查并推送修复(如果有明确的修复)。

722 

723<Note>

724 自动修复需要在你的存储库上安装 Claude GitHub App。如果你还没有,请从 [GitHub App 页面](https://github.com/apps/claude)安装它,或在[设置](/zh-CN/web-quickstart#connect-github-and-create-an-environment)期间出现提示时安装。

725</Note>

726 

727根据 PR 来自何处以及你使用的设备,有几种方法可以打开自动修复:

728 

729* **在 Claude Code on the web 中创建的 PR**:打开 CI 状态栏并选择**自动修复**

730* **从终端**:在 PR 的分支上运行 [`/autofix-pr`](/zh-CN/commands)。Claude Code 使用 `gh` 检测打开的 PR,生成网络会话,并一步启用自动修复

731* **从移动应用**:告诉 Claude 自动修复 PR,例如"监视此 PR 并修复任何 CI 失败或审查评论"

732* **任何现有 PR**:将 PR URL 粘贴到会话中并告诉 Claude 自动修复它

733 

734### Claude 如何响应 PR 活动

735 

736当自动修复处于活动状态时,Claude 接收 PR 的 GitHub 事件,包括新的审查评论和 CI 检查失败。对于每个事件,Claude 调查并决定如何进行:

737 

738* **明确的修复**:如果 Claude 对修复有信心且不与早期指令冲突,Claude 会进行更改、推送它,并在会话中解释所做的工作

739* **模糊的请求**:如果审查者的评论可以以多种方式解释或涉及架构上重要的内容,Claude 会在采取行动前询问你

740* **重复或无操作事件**:如果事件是重复的或不需要更改,Claude 会在会话中记录它并继续

741 

742Claude 可能会作为解决审查评论线程的一部分在 GitHub 上回复它们。这些回复使用你的 GitHub 账户发布,所以它们出现在你的用户名下,但每个回复都标记为来自 Claude Code,以便审查者知道它是由代理编写的,而不是由你直接编写的。

743 

744<Warning>

745 如果你的存储库使用注释触发的自动化,例如 Atlantis、Terraform Cloud 或在 `issue_comment` 事件上运行的自定义 GitHub Actions,请注意 Claude 可以代表你回复,这可能会触发这些工作流。在启用自动修复之前审查你的存储库的自动化,并考虑为可能部署基础设施或运行特权操作的 PR 注释的存储库禁用自动修复。

746</Warning>

747 

748## 安全和隔离

749 

750每个云会话通过多个层与你的机器和其他会话分离:

751 

752* **隔离的虚拟机**:每个会话在隔离的、Anthropic 管理的 VM 中运行

753* **网络访问控制**:网络访问默认受限,可以禁用。在禁用网络访问的情况下运行时,Claude Code 仍然可以与 Anthropic API 通信,这可能允许数据从 VM 中退出。

754* **凭证保护**:敏感凭证(如 git 凭证或签名密钥)永远不会在沙箱内与 Claude Code 一起。身份验证通过使用作用域凭证的安全代理处理。

755* **安全分析**:代码在隔离的 VM 内分析和修改,然后创建 PR

756 

757## 限制

758 

759在依赖云会话进行工作流之前,请考虑这些约束:

760 

761* **速率限制**:Claude Code on the web 与你账户内所有其他 Claude 和 Claude Code 使用共享速率限制。并行运行多个任务会按比例消耗更多速率限制。云 VM 没有单独的计算费用。

762* **存储库身份验证**:你只能在认证到相同账户时将会话从网络移动到本地

763* **平台限制**:存储库克隆和拉取请求创建需要 GitHub。自托管[GitHub Enterprise Server](/zh-CN/github-enterprise-server) 实例支持 Team 和 Enterprise 计划。GitLab、Bitbucket 和其他非 GitHub 存储库可以作为[本地捆绑](#send-local-repositories-without-github)发送到云会话,但会话无法将结果推送回远程

764 

765## 相关资源

766 

767* [Ultraplan](/zh-CN/ultraplan):在云会话中起草计划并在浏览器中审查

768* [Ultrareview](/zh-CN/ultrareview):在云沙箱中运行深度多代理代码审查

769* [Routines](/zh-CN/routines):按计划、通过 API 调用或响应 GitHub 事件自动化工作

770* [Hooks 配置](/zh-CN/hooks):在会话生命周期事件处运行脚本

771* [设置参考](/zh-CN/settings):所有配置选项

772* [安全](/zh-CN/security):隔离保证和数据处理

773* [数据使用](/zh-CN/data-usage):Anthropic 从云会话保留的内容

claude-directory.md +1583 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 探索 .claude 目录

6 

7> Claude Code 读取 CLAUDE.md、settings.json、hooks、skills、commands、subagents、rules 和自动内存的位置。探索项目中的 .claude 目录和主目录中的 ~/.claude。

8 

9export const ClaudeExplorer = () => {

10 const A = useMemo(() => ({href, children}) => <a href={href} style={{

11 color: 'var(--ce-accent)',

12 textDecoration: 'none',

13 borderBottom: '1px dotted var(--ce-accent)'

14 }}>{children}</a>, []);

15 const C = useMemo(() => ({children}) => <code style={{

16 fontFamily: 'var(--ce-mono)',

17 fontSize: '0.92em',

18 padding: '1px 4px',

19 borderRadius: '3px',

20 background: 'var(--ce-surface)',

21 border: '0.5px solid var(--ce-border-subtle)'

22 }}>{children}</code>, []);

23 const commandsNote = useMemo(() => <>Commands and skills are now the same mechanism. For new workflows, use <A href="/en/skills">skills/</A> instead: same <C>/name</C> invocation, plus you can bundle supporting files.</>, []);

24 const FILE_TREE = useMemo(() => ({

25 project: {

26 label: 'your-project/',

27 children: [{

28 id: 'claude-md',

29 label: 'CLAUDE.md',

30 type: 'file',

31 icon: 'md',

32 color: '#6A9BCC',

33 badge: 'committed',

34 oneLiner: 'Project instructions Claude reads every session',

35 when: 'Loaded into context at the start of every session',

36 description: 'Project-specific instructions that shape how Claude works in this repository. Put your conventions, common commands, and architectural context here so Claude operates with the same assumptions your team does.',

37 tips: ['Target under 200 lines. Longer files still load in full but may reduce adherence', <>CLAUDE.md loads into every session. If something only matters for specific tasks, move it to a <A href="/en/skills">skill</A> or a path-scoped <A href="/en/memory#organize-rules-with-claude/rules/">rule</A> so it loads only when needed</>, 'List the commands you run most, like build, test, and format, so Claude knows them without you spelling them out each time', <>Run <C>/memory</C> to open and edit CLAUDE.md from within a session</>, <>Also works at <C>.claude/CLAUDE.md</C> if you prefer to keep the project root clean</>],

38 exampleIntro: 'This example is for a TypeScript and React project. It lists the build and test commands, the framework conventions Claude should follow, and project-specific rules like export style and file layout.',

39 example: `# Project conventions

40 

41## Commands

42- Build: \`npm run build\`

43- Test: \`npm test\`

44- Lint: \`npm run lint\`

45 

46## Stack

47- TypeScript with strict mode

48- React 19, functional components only

49 

50## Rules

51- Named exports, never default exports

52- Tests live next to source: \`foo.ts\` -> \`foo.test.ts\`

53- All API routes return \`{ data, error }\` shape`,

54 docsLink: '/en/memory'

55 }, {

56 id: 'mcp-json',

57 label: '.mcp.json',

58 type: 'file',

59 icon: 'json',

60 color: '#9B7BC4',

61 badge: 'committed',

62 oneLiner: 'Project-scoped MCP servers, shared with your team',

63 when: <>Servers connect when the session begins. Tool schemas are deferred by default and load on demand via <A href="/en/mcp#scale-with-mcp-tool-search">tool search</A></>,

64 description: <>Configures Model Context Protocol (MCP) servers that give Claude access to external tools: databases, APIs, browsers, and more. This file holds the project-scoped servers your whole team uses. Personal servers you want to keep to yourself go in <C>~/.claude.json</C> instead.</>,

65 tips: [<>Use environment variable references for secrets: <C>{'${GITHUB_TOKEN}'}</C></>, <>Lives at the project root, not inside <C>.claude/</C></>, <>For servers only you need, run <C>claude mcp add --scope user</C>. This writes to <C>~/.claude.json</C> instead of <C>.mcp.json</C></>],

66 exampleIntro: <>This example configures the GitHub MCP server so Claude can read issues and open pull requests. The <C>{'${GITHUB_TOKEN}'}</C> reference is read from your shell environment when Claude Code starts the server, so the token never lands in the file.</>,

67 example: `{

68 "mcpServers": {

69 "github": {

70 "command": "npx",

71 "args": ["-y", "@modelcontextprotocol/server-github"],

72 "env": {

73 "GITHUB_TOKEN": "\${GITHUB_TOKEN}"

74 }

75 }

76 }

77}`,

78 docsLink: '/en/mcp'

79 }, {

80 id: 'worktreeinclude',

81 label: '.worktreeinclude',

82 type: 'file',

83 icon: 'md',

84 color: '#8FA876',

85 badge: 'committed',

86 oneLiner: 'Gitignored files to copy into new worktrees',

87 when: <>Read when Claude creates a git worktree via <C>--worktree</C>, the <C>EnterWorktree</C> tool, or subagent <C>isolation: worktree</C></>,

88 description: <>Lists gitignored files to copy from your main repository into each new worktree. Worktrees are fresh checkouts, so untracked files like <C>.env</C> are missing by default. Patterns here use <C>.gitignore</C> syntax. Only files that match a pattern and are also gitignored get copied, so tracked files are never duplicated.</>,

89 tips: [<>Lives at the project root, not inside <C>.claude/</C></>, <>Git-only: if you configure a <A href="/en/hooks#worktreecreate">WorktreeCreate hook</A> for a different VCS, this file is not read. Copy files inside your hook script instead</>, <>Also applies to parallel sessions in the <A href="/en/desktop#work-in-parallel-with-sessions">desktop app</A></>],

90 exampleIntro: 'This example copies your local environment files and a secrets config into every worktree Claude creates. Comments start with # and blank lines are ignored, same as .gitignore.',

91 example: `# Local environment

92.env

93.env.local

94 

95# API credentials

96config/secrets.json`,

97 docsLink: '/en/worktrees#copy-gitignored-files-into-worktrees'

98 }, {

99 id: 'dot-claude',

100 label: '.claude/',

101 type: 'folder',

102 icon: 'folder',

103 color: 'var(--ce-accent)',

104 oneLiner: 'Project-level configuration, rules, and extensions',

105 description: 'Everything Claude Code reads that is specific to this project. If you use git, commit most files here so your team shares them; a few, like settings.local.json, are automatically gitignored. Each file badge shows which.',

106 children: [{

107 id: 'settings-json',

108 label: 'settings.json',

109 type: 'file',

110 icon: 'json',

111 color: 'var(--ce-text-3)',

112 badge: 'committed',

113 oneLiner: 'Permissions, hooks, and configuration',

114 when: <>Overrides global <C>~/.claude/settings.json</C>. Local settings, CLI flags, and managed settings override this</>,

115 description: 'Settings that Claude Code applies directly. Permissions control which commands and tools Claude can use; hooks run your scripts at specific points in a session. Unlike CLAUDE.md, which Claude reads as guidance, these are enforced whether Claude follows them or not.',

116 contains: [<><A href="/en/permissions">permissions</A>: allow, deny, or prompt before Claude uses specific tools or commands</>, <><A href="/en/hooks">hooks</A>: run your own scripts on events like before a tool call or after a file edit</>, <><A href="/en/statusline">statusLine</A>: customize the line shown at the bottom while Claude works</>, <><A href="/en/settings#available-settings">model</A>: pick a default model for this project</>, <><A href="/en/settings#environment-variables">env</A>: environment variables set in every session</>, <><A href="/en/output-styles">outputStyle</A>: select a custom system-prompt style from output-styles/</>],

117 tips: [<>Bash permission patterns support wildcards: <C>Bash(npm test *)</C> matches any command starting with <C>npm test</C></>, <>Array settings like <C>permissions.allow</C> combine across all scopes; scalar settings like <C>model</C> use the most specific value</>],

118 exampleIntro: <>This example allows <C>npm test</C> and <C>npm run</C> commands without prompting, blocks <C>rm -rf</C>, and runs Prettier on files after Claude edits or writes them.</>,

119 example: `{

120 "permissions": {

121 "allow": [

122 "Bash(npm test *)",

123 "Bash(npm run *)"

124 ],

125 "deny": [

126 "Bash(rm -rf *)"

127 ]

128 },

129 "hooks": {

130 "PostToolUse": [{

131 "matcher": "Edit|Write",

132 "hooks": [{

133 "type": "command",

134 "command": "jq -r '.tool_input.file_path' | xargs npx prettier --write"

135 }]

136 }]

137 }

138}`,

139 docsLink: '/en/settings'

140 }, {

141 id: 'settings-local-json',

142 label: 'settings.local.json',

143 type: 'file',

144 icon: 'json',

145 color: 'var(--ce-text-3)',

146 badge: 'gitignored',

147 oneLiner: 'Your personal settings overrides for this project',

148 when: 'Highest of the user-editable settings files; CLI flags and managed settings still take precedence',

149 description: 'Personal settings that take precedence over the project defaults. Same JSON format as settings.json, but not committed. Use this when you need different permissions or defaults than the team config.',

150 tips: [<>Same schema as settings.json. Array settings like <C>permissions.allow</C> combine across scopes; scalar settings like <C>model</C> use the local value</>, <>Claude Code adds this file to <C>~/.config/git/ignore</C> the first time it writes one. If you use a custom <C>core.excludesFile</C>, add the pattern there too. To share the ignore rule with your team, also add it to the project <C>.gitignore</C></>],

151 exampleIntro: 'This example adds Docker permissions on top of whatever the team settings.json allows.',

152 example: `{

153 "permissions": {

154 "allow": [

155 "Bash(docker *)"

156 ]

157 }

158}`,

159 docsLink: '/en/settings'

160 }, {

161 id: 'rules',

162 label: 'rules/',

163 type: 'folder',

164 icon: 'folder',

165 color: '#9B7BC4',

166 oneLiner: 'Topic-scoped instructions, optionally gated by file paths',

167 when: <>Rules without <C>paths:</C> load at session start. Rules with <C>paths:</C> load when a matching file enters context</>,

168 description: [<>Project instructions split into topic files that can load conditionally based on file paths. A rule without <C>paths:</C> frontmatter loads at session start like CLAUDE.md; a rule with <C>paths:</C> loads only when Claude reads a matching file.</>, <>Like CLAUDE.md, rules are guidance Claude reads, not configuration Claude Code enforces. For guaranteed behavior use <A href="/en/hooks">hooks</A> or <A href="/en/permissions">permissions</A>.</>],

169 tips: [<>Use <C>paths:</C> frontmatter with globs to scope rules to directories or file types</>, <>Subdirectories work: <C>.claude/rules/frontend/react.md</C> is discovered automatically</>, 'When CLAUDE.md approaches 200 lines, start splitting into rules'],

170 docsLink: '/en/memory#organize-rules-with-claude/rules/',

171 children: [{

172 id: 'rule-testing',

173 label: 'testing.md',

174 type: 'file',

175 icon: 'md',

176 color: '#9B7BC4',

177 badge: 'committed',

178 oneLiner: 'Test conventions scoped to test files',

179 when: <>Loaded when Claude reads a file matching the <C>paths:</C> globs below</>,

180 description: <>An example rule that only loads when Claude is working on test files. The <C>paths:</C> globs in the frontmatter define which files trigger it; here, anything ending in .test.ts or .test.tsx. For other files, this rule is not loaded into context.</>,

181 example: `---

182paths:

183 - "**/*.test.ts"

184 - "**/*.test.tsx"

185---

186 

187# Testing Rules

188 

189- Use descriptive test names: "should [expected] when [condition]"

190- Mock external dependencies, not internal modules

191- Clean up side effects in afterEach`

192 }, {

193 id: 'rule-api',

194 label: 'api-design.md',

195 type: 'file',

196 icon: 'md',

197 color: '#9B7BC4',

198 badge: 'committed',

199 oneLiner: 'API conventions scoped to backend code',

200 when: <>Loaded when Claude reads a file matching the <C>paths:</C> glob below</>,

201 description: <>A second example showing a rule scoped to backend code. The <C>paths:</C> glob matches files under src/api/, so these conventions load only when Claude is editing API routes.</>,

202 example: `---

203paths:

204 - "src/api/**/*.ts"

205---

206 

207# API Design Rules

208 

209- All endpoints must validate input with Zod schemas

210- Return shape: { data: T } | { error: string }

211- Rate limit all public endpoints`

212 }]

213 }, {

214 id: 'skills',

215 label: 'skills/',

216 type: 'folder',

217 icon: 'folder',

218 color: '#D4A843',

219 oneLiner: 'Reusable prompts you or Claude invoke by name',

220 when: <>Invoked with <C>/skill-name</C> or when Claude matches the task to a skill</>,

221 description: <>Each skill is a folder with a SKILL.md file plus any supporting files it needs. By default, both you and Claude can invoke a skill. Use frontmatter to control that: <C>disable-model-invocation: true</C> for user-only workflows like <C>/deploy</C>, or <C>user-invocable: false</C> to hide from the <C>/</C> menu while Claude can still invoke it.</>,

222 tips: [<>Skills accept arguments: <C>/deploy staging</C> passes "staging" as <C>$ARGUMENTS</C>. Use <C>$0</C>, <C>$1</C>, and so on for positional access</>, <>The <C>description</C> frontmatter determines when Claude auto-invokes the skill</>, 'Bundle reference docs alongside SKILL.md. Claude knows the skill directory path and can read supporting files when you mention them'],

223 docsLink: '/en/skills',

224 children: [{

225 id: 'skill-review',

226 label: 'security-review/',

227 type: 'folder',

228 icon: 'folder',

229 color: '#D4A843',

230 oneLiner: 'A skill bundling SKILL.md with supporting files',

231 children: [{

232 id: 'skill-review-md',

233 label: 'SKILL.md',

234 type: 'file',

235 icon: 'md',

236 color: '#D4A843',

237 badge: 'committed',

238 oneLiner: 'Entrypoint: trigger, invocability, instructions',

239 when: <>User types <C>/security-review &lt;target&gt;</C>; Claude cannot auto-invoke this skill</>,

240 description: [<>This skill uses <C>disable-model-invocation: true</C> so only you can trigger it; Claude never invokes it on its own.</>, <>The <C>!`...`</C> line runs a shell command and injects its output into the prompt. <C>$ARGUMENTS</C> substitutes whatever you typed after the skill name. Claude sees the skill directory path, so mentioning a bundled file like checklist.md lets Claude read it.</>],

241 example: `---

242description: Reviews code changes for security vulnerabilities, authentication gaps, and injection risks

243disable-model-invocation: true

244argument-hint: <branch-or-path>

245---

246 

247## Diff to review

248 

249!\`git diff $ARGUMENTS\`

250 

251Audit the changes above for:

252 

2531. Injection vulnerabilities (SQL, XSS, command)

2542. Authentication and authorization gaps

2553. Hardcoded secrets or credentials

256 

257Use checklist.md in this skill directory for the full review checklist.

258 

259Report findings with severity ratings and remediation steps.`

260 }, {

261 id: 'skill-checklist',

262 label: 'checklist.md',

263 type: 'file',

264 icon: 'md',

265 color: '#D4A843',

266 badge: 'committed',

267 oneLiner: 'Supporting file bundled with the skill',

268 when: 'Claude reads it on demand while running the skill',

269 description: <>Skills can bundle any supporting files: reference docs, templates, scripts. The skill directory path is prepended to SKILL.md, so Claude can read bundled files by name. For scripts in bash injection commands, use the <C>{'${CLAUDE_SKILL_DIR}'}</C> placeholder.</>,

270 example: `# Security Review Checklist

271 

272## Input Validation

273- [ ] All user input sanitized before DB queries

274- [ ] File upload MIME types validated

275- [ ] Path traversal prevented on file operations

276 

277## Authentication

278- [ ] JWT tokens expire after 24 hours

279- [ ] API keys stored in environment variables

280- [ ] Passwords hashed with bcrypt or argon2`

281 }]

282 }]

283 }, {

284 id: 'commands',

285 label: 'commands/',

286 type: 'folder',

287 icon: 'folder',

288 color: '#788C5D',

289 oneLiner: <>Single-file prompts invoked with <C>/name</C></>,

290 note: commandsNote,

291 when: <>User types <C>/command-name</C></>,

292 description: <>A file at <C>commands/deploy.md</C> creates <C>/deploy</C> the same way a skill at <C>skills/deploy/SKILL.md</C> does, and both can be auto-invoked by Claude. Skills use a directory with SKILL.md, letting you bundle reference docs, templates, or scripts alongside the prompt.</>,

293 tips: [<>Use <C>$ARGUMENTS</C> in the file to accept parameters: <C>/fix-issue 123</C></>, 'If a skill and command share a name, the skill takes precedence', 'New commands should usually be skills instead; commands remain supported'],

294 docsLink: '/en/skills',

295 children: [{

296 id: 'cmd-example',

297 label: 'fix-issue.md',

298 type: 'file',

299 icon: 'md',

300 color: '#788C5D',

301 badge: 'committed',

302 oneLiner: <>Invoked as <C>/fix-issue &lt;number&gt;</C></>,

303 note: commandsNote,

304 description: [<>An example command for fixing a GitHub issue. Type <C>/fix-issue 123</C> and the <C>!`...`</C> line runs <C>gh issue view 123</C> in your shell, injecting the output into the prompt before Claude sees it.</>, <><C>$ARGUMENTS</C> substitutes whatever you typed after the command name. For positional access, use <C>$0</C> <C>$1</C> and so on.</>],

305 example: `---

306argument-hint: <issue-number>

307---

308 

309!\`gh issue view $ARGUMENTS\`

310 

311Investigate and fix the issue above.

312 

3131. Trace the bug to its root cause

3142. Implement the fix

3153. Write or update tests

3164. Summarize what you changed and why`

317 }]

318 }, {

319 id: 'output-styles',

320 label: 'output-styles/',

321 type: 'folder',

322 icon: 'folder',

323 color: '#5AA7A7',

324 oneLiner: 'Project-scoped output styles, if your team shares any',

325 when: 'Applied at session start when selected via the outputStyle setting',

326 description: <>Output styles are usually personal, so most live in <C>~/.claude/output-styles/</C>. Put one here if your team shares a style, like a review mode everyone uses. See <A href="#ce-global-output-styles">the Global tab</A> for the full explanation and example.</>,

327 docsLink: '/en/output-styles',

328 children: []

329 }, {

330 id: 'agents',

331 label: 'agents/',

332 type: 'folder',

333 icon: 'folder',

334 color: '#C46686',

335 oneLiner: 'Specialized subagents with their own context window',

336 when: 'Runs in its own context window when you or Claude invoke it',

337 description: 'Each markdown file defines a subagent with its own system prompt, tool access, and optionally its own model. Subagents run in a fresh context window, keeping the main conversation clean. Useful for parallel work or isolated tasks.',

338 tips: ['Each agent gets a fresh context window, separate from your main session', <>Restrict tool access per agent with the <C>tools:</C> frontmatter field</>, 'Type @ and pick an agent from the autocomplete to delegate directly'],

339 docsLink: '/en/sub-agents',

340 children: [{

341 id: 'agent-reviewer',

342 label: 'code-reviewer.md',

343 type: 'file',

344 icon: 'md',

345 color: '#C46686',

346 badge: 'committed',

347 oneLiner: 'Subagent for isolated code review',

348 when: 'Claude spawns it for review tasks, or you @-mention it from the autocomplete',

349 description: <>An example subagent restricted to read-only tools. The <C>description</C> frontmatter tells Claude when to delegate to it automatically; <C>tools:</C> limits it to Read, Grep, and Glob so it can inspect code but never edit. The body becomes the subagent's system prompt.</>,

350 example: `---

351name: code-reviewer

352description: Reviews code for correctness, security, and maintainability

353tools: Read, Grep, Glob

354---

355 

356You are a senior code reviewer. Review for:

357 

3581. Correctness: logic errors, edge cases, null handling

3592. Security: injection, auth bypass, data exposure

3603. Maintainability: naming, complexity, duplication

361 

362Every finding must include a concrete fix.`

363 }]

364 }, {

365 id: 'agent-memory',

366 label: 'agent-memory/',

367 type: 'folder',

368 icon: 'folder',

369 color: '#C46686',

370 badge: 'committed',

371 autogen: true,

372 oneLiner: 'Subagent persistent memory, separate from your main session auto memory',

373 when: 'First 200 lines (capped at 25KB) of MEMORY.md loaded into the subagent system prompt when it runs',

374 description: <>Subagents with <C>memory: project</C> in their frontmatter get a dedicated memory directory here. This is distinct from your <A href="/en/memory#auto-memory">main session auto memory</A> at <C>~/.claude/projects/</C>: each subagent reads and writes its own MEMORY.md, not yours.</>,

375 tips: [<>Only created for subagents that set the <C>memory:</C> frontmatter field</>, <>This directory holds project-scoped subagent memory, meant to be shared with your team. To keep memory out of version control use <C>memory: local</C>, which writes to <C>.claude/agent-memory-local/</C> instead. For cross-project memory use <C>memory: user</C>, which writes to <C>~/.claude/agent-memory/</C></>, <>The main session auto memory is a different feature; see <C>~/.claude/projects/</C> in the Global tab</>],

376 docsLink: '/en/sub-agents#enable-persistent-memory',

377 children: [{

378 id: 'agent-memory-sub',

379 label: '<agent-name>/',

380 type: 'folder',

381 icon: 'folder',

382 color: '#C46686',

383 autogen: true,

384 children: [{

385 id: 'agent-memory-md',

386 label: 'MEMORY.md',

387 type: 'file',

388 icon: 'md',

389 color: '#C46686',

390 badge: 'committed',

391 autogen: true,

392 oneLiner: 'The subagent writes and maintains this file automatically',

393 when: 'Loaded into the subagent system prompt when the subagent starts',

394 description: <>Works the same as your <A href="/en/memory#auto-memory">main auto memory</A>: the subagent creates and updates this file itself. You do not write it. The subagent reads it at the start of each task and writes back what it learns.</>,

395 example: `# code-reviewer memory

396 

397## Patterns seen

398- Project uses custom Result<T, E> type, not exceptions

399- Auth middleware expects Bearer token in Authorization header

400- Tests use factory functions in test/factories/

401 

402## Recurring issues

403- Missing null checks on API responses (src/api/*)

404- Unhandled promise rejections in background jobs`

405 }]

406 }]

407 }]

408 }]

409 },

410 global: {

411 label: '~/',

412 children: [{

413 id: 'claude-json',

414 label: '.claude.json',

415 type: 'file',

416 icon: 'json',

417 color: 'var(--ce-text-3)',

418 badge: 'local',

419 oneLiner: 'App state and UI preferences',

420 when: <>Read at session start for your preferences and MCP servers. Claude Code writes back to it when you change settings in <C>/config</C> or approve trust prompts</>,

421 description: <>Holds state that does not belong in settings.json: theme, OAuth session, per-project trust decisions, your personal MCP servers, and UI toggles. Mostly managed through <C>/config</C> rather than editing directly.</>,

422 tips: [<>IDE toggles like <C>autoConnectIde</C> and <C>externalEditorContext</C> live here, not in settings.json</>, <>The <C>projects</C> key tracks per-project state like trust-dialog acceptance and last-session metrics. Permission rules you approve in-session go to <C>.claude/settings.local.json</C> instead</>, <>MCP servers here are yours only: user scope applies across all projects, local scope is per-project but not committed. Team-shared servers go in <C>.mcp.json</C> at the project root instead</>],

423 example: `{

424 "autoConnectIde": true,

425 "externalEditorContext": true,

426 "mcpServers": {

427 "my-tools": {

428 "command": "npx",

429 "args": ["-y", "@example/mcp-server"]

430 }

431 }

432}`,

433 docsLink: '/en/settings#global-config-settings'

434 }, {

435 id: 'global-dot-claude',

436 label: '.claude/',

437 type: 'folder',

438 icon: 'folder',

439 color: 'var(--ce-accent)',

440 oneLiner: 'Your personal configuration across all projects',

441 description: 'The global counterpart to your project .claude/ directory. Files here apply to every project you work in and are never committed to any repository.',

442 children: [{

443 id: 'global-claude-md',

444 label: 'CLAUDE.md',

445 type: 'file',

446 icon: 'md',

447 color: '#6A9BCC',

448 badge: 'local',

449 oneLiner: 'Personal preferences across every project',

450 when: 'Loaded at the start of every session, in every project',

451 description: 'Your global instruction file. Loaded alongside the project CLAUDE.md at session start, so both are in context together. When instructions conflict, project-level instructions take priority. Keep this to preferences that apply everywhere: response style, commit format, personal conventions.',

452 tips: ['Keep it short since it loads into context for every project, alongside that project\'s own CLAUDE.md', 'Good for response style, commit format, and personal conventions'],

453 example: `# Global preferences

454 

455- Keep explanations concise

456- Use conventional commit format

457- Show the terminal command to verify changes

458- Prefer composition over inheritance`,

459 docsLink: '/en/memory'

460 }, {

461 id: 'global-settings',

462 label: 'settings.json',

463 type: 'file',

464 icon: 'json',

465 color: 'var(--ce-text-3)',

466 badge: 'local',

467 oneLiner: 'Default settings for all projects',

468 when: 'Your defaults. Project and local settings.json override any keys you also set there',

469 description: [<>Same keys as project <C>settings.json</C>: permissions, hooks, model, environment variables, and the rest. Put settings here that you want in every project, like permissions you always allow, a preferred model, or a notification hook that runs regardless of which project you're in.</>, <>Settings follow a precedence order: project <C>settings.json</C> overrides any matching keys you set here. This is different from CLAUDE.md, where global and project files are both loaded into context rather than merged key by key.</>],

470 example: `{

471 "permissions": {

472 "allow": [

473 "Bash(git log *)",

474 "Bash(git diff *)"

475 ]

476 }

477}`,

478 docsLink: '/en/settings'

479 }, {

480 id: 'keybindings',

481 label: 'keybindings.json',

482 type: 'file',

483 icon: 'json',

484 color: 'var(--ce-text-3)',

485 badge: 'local',

486 oneLiner: 'Custom keyboard shortcuts',

487 when: 'Read at session start and hot-reloaded when you edit the file',

488 description: <>Rebind keyboard shortcuts in the interactive CLI. Run <C>/keybindings</C> to create or open this file with a schema reference. Ctrl+C, Ctrl+D, Ctrl+M, and Caps Lock are reserved and cannot be rebound.</>,

489 exampleIntro: <>This example binds <C>Ctrl+E</C> to open your external editor and unbinds <C>Ctrl+U</C> by setting it to <C>null</C>. The <C>context</C> field scopes bindings to a specific part of the CLI, here the main chat input.</>,

490 example: `{

491 "$schema": "https://www.schemastore.org/claude-code-keybindings.json",

492 "$docs": "https://code.claude.com/docs/en/keybindings",

493 "bindings": [

494 {

495 "context": "Chat",

496 "bindings": {

497 "ctrl+e": "chat:externalEditor",

498 "ctrl+u": null

499 }

500 }

501 ]

502}`,

503 docsLink: '/en/keybindings'

504 }, {

505 id: 'themes',

506 label: 'themes/',

507 type: 'folder',

508 icon: 'folder',

509 color: '#5AA7A7',

510 oneLiner: 'Custom color themes',

511 when: <>Read at session start and hot-reloaded when files change. Listed in <C>/theme</C></>,

512 description: <>Each <C>.json</C> file defines a custom color theme: a built-in <C>base</C> preset plus an <C>overrides</C> map of color tokens. Create one interactively with <C>/theme</C> or write the JSON by hand. Selecting a custom theme stores <C>custom:&lt;slug&gt;</C> as your theme preference.</>,

513 example: `{

514 "name": "Dracula",

515 "base": "dark",

516 "overrides": {

517 "claude": "#bd93f9",

518 "error": "#ff5555",

519 "success": "#50fa7b"

520 }

521}`,

522 docsLink: '/en/terminal-config#create-a-custom-theme',

523 children: []

524 }, {

525 id: 'global-projects',

526 label: 'projects/',

527 type: 'folder',

528 icon: 'folder',

529 color: '#E8A45C',

530 autogen: true,

531 oneLiner: "Auto memory: Claude's notes to itself, per project",

532 when: 'MEMORY.md loaded at session start; topic files read on demand',

533 description: 'Auto memory lets Claude accumulate knowledge across sessions without you writing anything. Claude saves notes as it works: build commands, debugging insights, architecture notes. Each project gets its own memory directory keyed by the repository path.',

534 tips: [<>On by default. Toggle with <C>/memory</C> or <C>autoMemoryEnabled</C> in settings</>, 'MEMORY.md is the index loaded each session. The first 200 lines, or 25KB, whichever comes first, are read', 'Topic files like debugging.md are read on demand, not at startup', 'These are plain markdown. Edit or delete them anytime'],

535 docsLink: '/en/memory#auto-memory',

536 children: [{

537 id: 'memory-dir',

538 label: '<project>/memory/',

539 type: 'folder',

540 icon: 'folder',

541 color: '#E8A45C',

542 autogen: true,

543 oneLiner: "Claude's accumulated knowledge for one project",

544 children: [{

545 id: 'memory-md',

546 label: 'MEMORY.md',

547 type: 'file',

548 icon: 'md',

549 color: '#E8A45C',

550 badge: 'local',

551 autogen: true,

552 oneLiner: 'Claude writes and maintains this file automatically',

553 when: 'First 200 lines (capped at 25KB) loaded at session start',

554 description: 'Claude creates and updates this file as it works; you do not write it yourself. It acts as an index that Claude reads at the start of every session, pointing to topic files for detail. You can edit or delete it, but Claude will keep updating it.',

555 example: `# Memory Index

556 

557## Project

558- [build-and-test.md](build-and-test.md): npm run build (~45s), Vitest, dev server on 3001

559- [architecture.md](architecture.md): API client singleton, refresh-token auth

560 

561## Reference

562- [debugging.md](debugging.md): auth token rotation and DB connection troubleshooting`,

563 docsLink: '/en/memory'

564 }, {

565 id: 'memory-topic',

566 label: 'debugging.md',

567 type: 'file',

568 icon: 'md',

569 color: '#E8A45C',

570 badge: 'local',

571 autogen: true,

572 oneLiner: 'Topic notes Claude writes when MEMORY.md gets long',

573 when: 'Claude reads this when a related task comes up',

574 description: 'An example of a topic file Claude creates when MEMORY.md grows too long. Claude picks the filename based on what it splits out: debugging.md, architecture.md, build-commands.md, or similar. You never create these yourself. Claude reads a topic file back only when the current task relates to it.',

575 example: `---

576name: Debugging patterns

577description: Auth token rotation and database connection troubleshooting for this project

578type: reference

579---

580 

581## Auth Token Issues

582- Refresh token rotation: old token invalidated immediately

583- If 401 after refresh: check clock skew between client and server

584 

585## Database Connection Drops

586- Connection pool: max 10 in dev, 50 in prod

587- Always check \`docker compose ps\` first`

588 }]

589 }]

590 }, {

591 id: 'global-rules',

592 label: 'rules/',

593 type: 'folder',

594 icon: 'folder',

595 color: '#9B7BC4',

596 oneLiner: 'User-level rules that apply to every project',

597 when: <>Rules without <C>paths:</C> load at session start. Rules with <C>paths:</C> load when a matching file enters context</>,

598 description: 'Same as project .claude/rules/ but applies everywhere. Use this for conventions you want across all your work, like personal code style or commit message format.',

599 docsLink: '/en/memory#organize-rules-with-claude/rules/',

600 children: []

601 }, {

602 id: 'global-skills',

603 label: 'skills/',

604 type: 'folder',

605 icon: 'folder',

606 color: '#D4A843',

607 oneLiner: 'Personal skills available in every project',

608 when: <>Invoked with <C>/skill-name</C> in any project</>,

609 description: 'Skills you built for yourself that work everywhere. Same structure as project skills: each is a folder with SKILL.md, scoped to your user account instead of a single project.',

610 docsLink: '/en/skills',

611 children: []

612 }, {

613 id: 'global-commands',

614 label: 'commands/',

615 type: 'folder',

616 icon: 'folder',

617 color: '#788C5D',

618 oneLiner: 'Personal single-file commands available in every project',

619 note: commandsNote,

620 when: <>User types <C>/command-name</C> in any project</>,

621 description: 'Same as project commands/ but scoped to your user account. Each markdown file becomes a command available everywhere.',

622 docsLink: '/en/skills',

623 children: []

624 }, {

625 id: 'global-output-styles',

626 label: 'output-styles/',

627 type: 'folder',

628 icon: 'folder',

629 color: '#5AA7A7',

630 oneLiner: 'Custom system-prompt sections that adjust how Claude works',

631 when: 'Applied at session start when selected via the outputStyle setting',

632 description: [<>Each markdown file defines an output style: a section appended to the system prompt that, by default, also drops the built-in software-engineering task instructions. Use this to adapt Claude Code for uses beyond coding, or to add teaching or review modes.</>, <>Select a built-in or custom style with <C>/config</C> or the <C>outputStyle</C> key in settings. Styles here are available in every project; project-level styles with the same name take precedence.</>],

633 tips: ['Built-in styles Explanatory and Learning are included with Claude Code; custom styles go here', <>Set <C>keep-coding-instructions: true</C> in frontmatter to keep the default task instructions alongside your additions</>, 'Changes take effect on the next session since the system prompt is fixed at startup for caching'],

634 docsLink: '/en/output-styles',

635 children: [{

636 id: 'output-style-example',

637 label: 'teaching.md',

638 type: 'file',

639 icon: 'md',

640 color: '#5AA7A7',

641 badge: 'local',

642 oneLiner: 'Example style that adds explanations and leaves small changes for you',

643 when: <>Active when <C>outputStyle</C> in settings is set to <C>teaching</C></>,

644 description: <>This style appends instructions to the system prompt: Claude adds a "Why this approach" note after each task and leaves TODO(human) markers for changes under 10 lines instead of writing them itself. Select it by setting <C>outputStyle</C> to the filename without .md, or to the <C>name</C> field if you set one in frontmatter.</>,

645 example: `---

646description: Explains reasoning and asks you to implement small pieces

647keep-coding-instructions: true

648---

649 

650After completing each task, add a brief "Why this approach" note

651explaining the key design decision.

652 

653When a change is under 10 lines, ask the user to implement it

654themselves by leaving a TODO(human) marker instead of writing it.`

655 }]

656 }, {

657 id: 'global-agents',

658 label: 'agents/',

659 type: 'folder',

660 icon: 'folder',

661 color: '#C46686',

662 oneLiner: 'Personal subagents available in every project',

663 when: 'Claude delegates or you @-mention in any project',

664 description: 'Subagents defined here are available across all your projects. Same format as project agents.',

665 docsLink: '/en/sub-agents',

666 children: []

667 }, {

668 id: 'global-agent-memory',

669 label: 'agent-memory/',

670 type: 'folder',

671 icon: 'folder',

672 color: '#C46686',

673 autogen: true,

674 oneLiner: <>Persistent memory for subagents with <C>memory: user</C></>,

675 when: 'Loaded into the subagent system prompt when the subagent starts',

676 description: <>Subagents with <C>memory: user</C> in their frontmatter store knowledge here that persists across all projects. For project-scoped subagent memory, see <C>.claude/agent-memory/</C> instead.</>,

677 docsLink: '/en/sub-agents#enable-persistent-memory',

678 children: []

679 }]

680 }]

681 }

682 }), []);

683 const BADGE_STYLES = useMemo(() => ({

684 committed: {

685 bg: 'rgba(85,138,66,0.08)',

686 color: 'var(--ce-badge-committed)',

687 border: 'rgba(85,138,66,0.15)',

688 label: 'committed'

689 },

690 gitignored: {

691 bg: 'rgba(217,119,87,0.06)',

692 color: 'var(--ce-badge-gitignored)',

693 border: 'rgba(217,119,87,0.15)',

694 label: 'gitignored'

695 },

696 local: {

697 bg: 'rgba(115,114,108,0.06)',

698 color: 'var(--ce-badge-local)',

699 border: 'rgba(115,114,108,0.12)',

700 label: 'local only'

701 },

702 autogen: {

703 bg: 'rgba(232,164,92,0.1)',

704 color: 'var(--ce-badge-autogen)',

705 border: 'rgba(232,164,92,0.2)',

706 label: 'Claude writes'

707 }

708 }), []);

709 const allNodes = useMemo(() => {

710 const flatten = (nodes, acc, path, parentId) => {

711 for (const node of nodes) {

712 const nextPath = [...path, node.label];

713 acc[node.id] = {

714 ...node,

715 path: nextPath,

716 parentId

717 };

718 if (node.children) flatten(node.children, acc, nextPath, node.id);

719 }

720 return acc;

721 };

722 const project = flatten(FILE_TREE.project.children, {}, [FILE_TREE.project.label]);

723 const global = flatten(FILE_TREE.global.children, {}, [FILE_TREE.global.label]);

724 for (const id in project) project[id].root = 'project';

725 for (const id in global) global[id].root = 'global';

726 return {

727 ...project,

728 ...global

729 };

730 }, [FILE_TREE]);

731 const allFolderIds = useMemo(() => Object.keys(allNodes).filter(id => allNodes[id].type === 'folder'), [allNodes]);

732 const DEFAULT_EXPANDED = ['dot-claude', 'rules', 'skills', 'skill-review', 'commands', 'agents', 'agent-memory', 'agent-memory-sub', 'global-dot-claude', 'global-output-styles', 'global-projects', 'memory-dir'];

733 const [mounted, setMounted] = useState(false);

734 const [activeRoot, setActiveRoot] = useState('project');

735 const [selectedId, setSelectedId] = useState('claude-md');

736 const [expandedFolders, setExpandedFolders] = useState(() => new Set(DEFAULT_EXPANDED));

737 const [forceMobile, setForceMobile] = useState(false);

738 const [copiedId, setCopiedId] = useState(null);

739 const [isFullscreen, setIsFullscreen] = useState(false);

740 const copyTimeoutRef = useRef(null);

741 const rootRef = useRef(null);

742 useEffect(() => {

743 setMounted(true);

744 const applyHash = scroll => {

745 const hash = window.location.hash.slice(1);

746 if (!hash.startsWith('ce-')) return;

747 const id = hash.slice(3);

748 const node = allNodes[id];

749 if (!node) return;

750 setActiveRoot(node.root);

751 setSelectedId(id);

752 setExpandedFolders(new Set(allFolderIds));

753 if (scroll && rootRef.current) rootRef.current.scrollIntoView({

754 behavior: 'smooth',

755 block: 'start'

756 });

757 };

758 applyHash(false);

759 const onHashChange = () => applyHash(true);

760 const onFsChange = () => setIsFullscreen(!!document.fullscreenElement);

761 window.addEventListener('hashchange', onHashChange);

762 document.addEventListener('fullscreenchange', onFsChange);

763 return () => {

764 if (copyTimeoutRef.current) clearTimeout(copyTimeoutRef.current);

765 window.removeEventListener('hashchange', onHashChange);

766 document.removeEventListener('fullscreenchange', onFsChange);

767 };

768 }, []);

769 useEffect(() => {

770 if (!mounted || !rootRef.current) return;

771 const hash = window.location.hash.slice(1);

772 if (hash.startsWith('ce-') && allNodes[hash.slice(3)]) {

773 rootRef.current.scrollIntoView({

774 behavior: 'smooth',

775 block: 'start'

776 });

777 }

778 }, [mounted]);

779 if (!mounted) return null;

780 const selected = allNodes[selectedId];

781 const tree = FILE_TREE[activeRoot];

782 const isCopied = copiedId === selected.id;

783 const toggleFolder = id => {

784 const next = new Set(expandedFolders);

785 next.has(id) ? next.delete(id) : next.add(id);

786 setExpandedFolders(next);

787 };

788 const switchRoot = root => {

789 if (root === activeRoot) return;

790 setActiveRoot(root);

791 const firstId = FILE_TREE[root].children[0].id;

792 setSelectedId(firstId);

793 try {

794 history.replaceState(null, '', '#ce-' + firstId);

795 } catch (e) {}

796 };

797 const toggleFullscreen = () => {

798 if (!rootRef.current) return;

799 if (document.fullscreenElement) document.exitFullscreen(); else rootRef.current.requestFullscreen().catch(() => {});

800 };

801 const selectNode = n => {

802 setSelectedId(n.id);

803 if (n.type === 'folder' && !expandedFolders.has(n.id)) toggleFolder(n.id);

804 try {

805 history.replaceState(null, '', '#ce-' + n.id);

806 } catch (e) {}

807 };

808 const iconBtn = {

809 width: 28,

810 flexShrink: 0,

811 borderRadius: '6px',

812 border: 'none',

813 cursor: 'pointer',

814 background: 'transparent',

815 color: 'var(--ce-text-4)',

816 display: 'flex',

817 alignItems: 'center',

818 justifyContent: 'center'

819 };

820 const visibleFolderIds = allFolderIds.filter(id => allNodes[id].root === activeRoot);

821 const allExpanded = visibleFolderIds.every(id => expandedFolders.has(id));

822 const toggleAllFolders = () => {

823 const next = new Set(expandedFolders);

824 visibleFolderIds.forEach(id => allExpanded ? next.delete(id) : next.add(id));

825 setExpandedFolders(next);

826 };

827 const onTreeKeyDown = e => {

828 if (!['ArrowDown', 'ArrowUp', 'ArrowRight', 'ArrowLeft'].includes(e.key)) return;

829 const visible = [];

830 const walk = nodes => {

831 for (const n of nodes) {

832 visible.push(n.id);

833 if (n.children && expandedFolders.has(n.id)) walk(n.children);

834 }

835 };

836 walk(tree.children);

837 const i = visible.indexOf(selectedId);

838 if (i === -1) return;

839 e.preventDefault();

840 if (e.key === 'ArrowDown' && i < visible.length - 1) selectNode(allNodes[visible[i + 1]]); else if (e.key === 'ArrowUp' && i > 0) selectNode(allNodes[visible[i - 1]]); else if (e.key === 'ArrowRight' && selected.type === 'folder') {

841 if (!expandedFolders.has(selectedId)) toggleFolder(selectedId); else if (selected.children && selected.children.length) selectNode(allNodes[selected.children[0].id]);

842 } else if (e.key === 'ArrowLeft') {

843 if (selected.type === 'folder' && expandedFolders.has(selectedId)) toggleFolder(selectedId); else if (selected.parentId) selectNode(allNodes[selected.parentId]);

844 }

845 };

846 const copyExample = (id, text) => {

847 const done = () => {

848 setCopiedId(id);

849 if (copyTimeoutRef.current) clearTimeout(copyTimeoutRef.current);

850 copyTimeoutRef.current = setTimeout(() => setCopiedId(null), 2000);

851 };

852 const fallback = () => {

853 const ta = document.createElement('textarea');

854 ta.value = text;

855 ta.style.position = 'fixed';

856 ta.style.opacity = '0';

857 document.body.appendChild(ta);

858 ta.select();

859 try {

860 if (document.execCommand('copy')) done();

861 } catch (e) {}

862 document.body.removeChild(ta);

863 };

864 if (navigator.clipboard) {

865 navigator.clipboard.writeText(text).then(done, fallback);

866 } else {

867 fallback();

868 }

869 };

870 const renderIcon = (icon, color, size) => {

871 const sz = size || 14;

872 if (icon === 'folder') {

873 return <svg width={sz} height={sz} viewBox="0 0 14 14" fill="none">

874 <path d="M1.5 3.5a1 1 0 0 1 1-1h2.6l1 1.2h5.4a1 1 0 0 1 1 1v5.8a1 1 0 0 1-1 1h-9a1 1 0 0 1-1-1V3.5z" fill={color} fillOpacity="0.15" stroke={color} strokeWidth="1" />

875 </svg>;

876 }

877 if (icon === 'json') {

878 return <svg width={sz} height={sz} viewBox="0 0 14 14" fill="none">

879 <rect x="2" y="1.5" width="10" height="11" rx="1.5" fill={color} fillOpacity="0.15" stroke={color} strokeWidth="1" />

880 <text x="7" y="9" fontSize="6" fontFamily="monospace" fill={color} textAnchor="middle" fontWeight="700">{'{}'}</text>

881 </svg>;

882 }

883 return <svg width={sz} height={sz} viewBox="0 0 14 14" fill="none">

884 <rect x="2" y="1.5" width="10" height="11" rx="1.5" fill={color} fillOpacity="0.15" stroke={color} strokeWidth="1" />

885 <line x1="4.5" y1="5" x2="9.5" y2="5" stroke={color} strokeWidth="1" />

886 <line x1="4.5" y1="7" x2="9.5" y2="7" stroke={color} strokeWidth="1" />

887 <line x1="4.5" y1="9" x2="8" y2="9" stroke={color} strokeWidth="1" />

888 </svg>;

889 };

890 const renderNode = (node, depth) => {

891 const isFolder = node.type === 'folder';

892 const isExpanded = expandedFolders.has(node.id);

893 const isSelected = selectedId === node.id;

894 return <div key={node.id}>

895 <button role="treeitem" tabIndex={-1} onClick={() => selectNode(node)} aria-selected={isSelected} aria-expanded={isFolder ? isExpanded : undefined} style={{

896 display: 'flex',

897 alignItems: 'center',

898 gap: '5px',

899 width: '100%',

900 padding: `4px 8px 4px ${8 + depth * 16}px`,

901 background: isSelected ? 'var(--ce-accent-bg)' : 'transparent',

902 borderTop: 'none',

903 borderRight: 'none',

904 borderBottom: 'none',

905 borderLeft: isSelected ? '2px solid var(--ce-accent)' : '2px solid transparent',

906 outline: 'none',

907 cursor: 'pointer',

908 textAlign: 'left',

909 fontFamily: 'var(--ce-mono)',

910 fontSize: '13.5px',

911 color: isSelected ? 'var(--ce-accent)' : 'var(--ce-text-2)',

912 fontWeight: isSelected ? 550 : 400,

913 transition: 'all 0.1s'

914 }}>

915 {isFolder ? <span onClick={e => {

916 e.stopPropagation();

917 toggleFolder(node.id);

918 }} style={{

919 fontSize: '14px',

920 color: 'var(--ce-text-4)',

921 width: '20px',

922 height: '20px',

923 display: 'inline-flex',

924 alignItems: 'center',

925 justifyContent: 'center',

926 cursor: 'pointer',

927 borderRadius: '4px',

928 marginLeft: '-6px',

929 flexShrink: 0

930 }} onMouseEnter={e => {

931 e.currentTarget.style.background = 'var(--ce-arrow-hover)';

932 e.currentTarget.style.color = 'var(--ce-text-2)';

933 }} onMouseLeave={e => {

934 e.currentTarget.style.background = 'transparent';

935 e.currentTarget.style.color = 'var(--ce-text-4)';

936 }}>{isExpanded ? '▾' : '▸'}</span> : <span style={{

937 width: '14px',

938 flexShrink: 0

939 }} />}

940 {renderIcon(node.icon, node.color)}

941 <span style={{

942 flex: 1,

943 overflow: 'hidden',

944 textOverflow: 'ellipsis',

945 whiteSpace: 'nowrap'

946 }}>{node.label}</span>

947 {node.badge && BADGE_STYLES[node.badge] && <span title={BADGE_STYLES[node.badge].label} style={{

948 width: 6,

949 height: 6,

950 borderRadius: '50%',

951 background: BADGE_STYLES[node.badge].color,

952 flexShrink: 0,

953 opacity: 0.7

954 }} />}

955 </button>

956 {isFolder && isExpanded && node.children && <div role="group">{node.children.map(child => renderNode(child, depth + 1))}</div>}

957 </div>;

958 };

959 return <>

960 <style>{`

961 .ce-root {

962 --ce-mono: var(--font-mono, ui-monospace, monospace);

963 --ce-accent: #D97757;

964 --ce-accent-bg: rgba(217,119,87,0.06);

965 --ce-accent-border: rgba(217,119,87,0.12);

966 --ce-bg: #fff;

967 --ce-surface: #FAFAF7;

968 --ce-surface-hover: #F0EEE6;

969 --ce-border: #E8E6DC;

970 --ce-border-subtle: #F0EEE6;

971 --ce-text: #141413;

972 --ce-text-2: #5E5D59;

973 --ce-text-3: #73726C;

974 --ce-text-4: #9C9A92;

975 --ce-text-5: #B8B6AE;

976 --ce-sep: #D1CFC5;

977 --ce-code-header: #F5F4ED;

978 --ce-code-bg: #1A1918;

979 --ce-arrow-hover: rgba(0,0,0,0.08);

980 --ce-badge-committed: #3d6b2e;

981 --ce-badge-gitignored: #b85c3a;

982 --ce-badge-local: #5e5d59;

983 --ce-badge-autogen: #b07520;

984 --ce-when-text: #4a7fb5;

985 }

986 .dark .ce-root {

987 --ce-bg: #1a1918;

988 --ce-surface: #232221;

989 --ce-surface-hover: #2e2d2b;

990 --ce-border: #3a3936;

991 --ce-border-subtle: #2e2d2b;

992 --ce-text: #e8e6dc;

993 --ce-text-2: #c4c2b8;

994 --ce-text-3: #9c9a92;

995 --ce-text-4: #73726c;

996 --ce-text-5: #5e5d59;

997 --ce-sep: #4a4946;

998 --ce-code-header: #2e2d2b;

999 --ce-code-bg: #0d0d0c;

1000 --ce-arrow-hover: rgba(255,255,255,0.08);

1001 --ce-badge-committed: #6fa85c;

1002 --ce-badge-gitignored: #e08a60;

1003 --ce-badge-local: #9c9a92;

1004 --ce-badge-autogen: #e8a45c;

1005 --ce-when-text: #8bb4e0;

1006 }

1007 .ce-mobile-fallback { display: none; border: 1px solid rgba(0,0,0,0.1); background: rgba(0,0,0,0.03); }

1008 .dark .ce-mobile-fallback { border-color: rgba(255,255,255,0.15); background: rgba(255,255,255,0.04); }

1009 @media (max-width: 700px) {

1010 .ce-root:not(.ce-force) { display: none !important; }

1011 .ce-mobile-fallback { display: block; }

1012 }

1013 `}</style>

1014 {!forceMobile && <div className="ce-mobile-fallback" style={{

1015 padding: '14px 16px',

1016 borderRadius: '8px',

1017 fontSize: '14px'

1018 }}>

1019 The interactive explorer works best on a larger screen. See the <a href="#file-reference" style={{

1020 color: '#D97757'

1021 }}>file reference table</a> below, or <button onClick={() => setForceMobile(true)} style={{

1022 border: 'none',

1023 background: 'none',

1024 padding: 0,

1025 color: '#D97757',

1026 textDecoration: 'underline',

1027 cursor: 'pointer',

1028 font: 'inherit'

1029 }}>show the explorer anyway</button>.

1030 </div>}

1031 <div ref={rootRef} className={forceMobile ? 'ce-root ce-force' : 'ce-root'} style={{

1032 borderRadius: isFullscreen ? 0 : '12px',

1033 border: '1px solid var(--ce-border)',

1034 background: 'var(--ce-bg)',

1035 display: 'flex',

1036 alignItems: 'stretch',

1037 overflow: 'hidden',

1038 fontFamily: 'var(--font-sans, -apple-system, sans-serif)',

1039 ...isFullscreen && ({

1040 height: '100vh'

1041 })

1042 }}>

1043 {}

1044 <div style={{

1045 width: 'min(240px, 35%)',

1046 minWidth: '180px',

1047 flexShrink: 0,

1048 borderRight: '1px solid var(--ce-border-subtle)',

1049 background: 'var(--ce-surface)',

1050 display: 'flex',

1051 flexDirection: 'column'

1052 }}>

1053 <div style={{

1054 padding: '8px 8px 4px',

1055 borderBottom: '1px solid var(--ce-border-subtle)',

1056 display: 'flex',

1057 gap: '4px'

1058 }}>

1059 {['project', 'global'].map(root => <button key={root} onClick={() => switchRoot(root)} style={{

1060 flex: 1,

1061 padding: '6px 0',

1062 borderRadius: '6px',

1063 border: 'none',

1064 cursor: 'pointer',

1065 fontFamily: 'var(--ce-mono)',

1066 fontSize: '11.5px',

1067 background: activeRoot === root ? 'var(--ce-accent-bg)' : 'transparent',

1068 color: activeRoot === root ? 'var(--ce-accent)' : 'var(--ce-text-4)',

1069 fontWeight: activeRoot === root ? 600 : 430

1070 }}>

1071 {root === 'project' ? 'Project' : 'Global (~/)'}

1072 </button>)}

1073 <button onClick={toggleAllFolders} title={allExpanded ? 'Collapse all' : 'Expand all'} style={{

1074 ...iconBtn,

1075 fontSize: 11

1076 }}>

1077 {allExpanded ? '⊟' : '⊞'}

1078 </button>

1079 <button onClick={toggleFullscreen} title={isFullscreen ? 'Exit fullscreen' : 'Fullscreen'} style={{

1080 ...iconBtn,

1081 fontSize: 13

1082 }}>

1083 {isFullscreen ? '⤡' : '⛶'}

1084 </button>

1085 </div>

1086 <div role="tree" aria-label="Configuration files" tabIndex={0} onKeyDown={onTreeKeyDown} style={{

1087 padding: '6px 0',

1088 overflowY: 'auto',

1089 flex: 1,

1090 outline: 'none'

1091 }}>

1092 {tree.children.map(node => renderNode(node, 0))}

1093 </div>

1094 </div>

1095 

1096 {}

1097 <div style={{

1098 flex: 1,

1099 minWidth: 0,

1100 padding: '20px 24px',

1101 minHeight: '400px',

1102 overflowY: 'auto'

1103 }}>

1104 <span aria-live="polite" style={{

1105 position: 'absolute',

1106 width: 1,

1107 height: 1,

1108 overflow: 'hidden',

1109 clip: 'rect(0 0 0 0)'

1110 }}>{selected.label} selected</span>

1111 {}

1112 <div style={{

1113 fontFamily: 'var(--ce-mono)',

1114 fontSize: '11px',

1115 color: 'var(--ce-text-4)',

1116 marginBottom: '10px',

1117 cursor: 'default'

1118 }}>

1119 {selected.path.map((seg, i) => <span key={i}>

1120 <span style={{

1121 color: i === selected.path.length - 1 ? 'var(--ce-accent)' : 'var(--ce-text-4)'

1122 }}>{seg.replace(/\/$/, '')}</span>

1123 {i < selected.path.length - 1 && <span style={{

1124 color: 'var(--ce-sep)'

1125 }}> / </span>}

1126 </span>)}

1127 </div>

1128 

1129 {}

1130 <div style={{

1131 display: 'flex',

1132 alignItems: 'flex-start',

1133 gap: '10px',

1134 marginBottom: '10px'

1135 }}>

1136 <span style={{

1137 flexShrink: 0,

1138 display: 'flex'

1139 }}>{renderIcon(selected.icon, selected.color, 24)}</span>

1140 <div style={{

1141 flex: 1,

1142 minWidth: 0

1143 }}>

1144 <div style={{

1145 fontSize: '22px',

1146 fontWeight: 600,

1147 color: 'var(--ce-text)',

1148 letterSpacing: '-0.3px',

1149 lineHeight: '26px'

1150 }}>{selected.label}</div>

1151 {selected.oneLiner && <div style={{

1152 fontSize: '15px',

1153 color: 'var(--ce-text-3)',

1154 marginTop: '3px'

1155 }}>{selected.oneLiner}</div>}

1156 </div>

1157 <div style={{

1158 display: 'flex',

1159 gap: '4px',

1160 flexShrink: 0

1161 }}>

1162 {[selected.autogen && 'autogen', selected.badge].filter(Boolean).map(k => {

1163 const s = BADGE_STYLES[k];

1164 if (!s) return null;

1165 return <span key={k} style={{

1166 fontFamily: 'var(--ce-mono)',

1167 fontSize: '10px',

1168 fontWeight: 600,

1169 textTransform: 'uppercase',

1170 letterSpacing: '0.3px',

1171 padding: '2px 6px',

1172 borderRadius: '4px',

1173 background: s.bg,

1174 color: s.color,

1175 border: `0.5px solid ${s.border}`

1176 }}>{s.label}</span>;

1177 })}

1178 </div>

1179 </div>

1180 

1181 {}

1182 {selected.note && <div style={{

1183 padding: '10px 12px',

1184 borderRadius: '8px',

1185 marginBottom: '14px',

1186 background: 'rgba(217,119,87,0.06)',

1187 border: '1px solid rgba(217,119,87,0.2)',

1188 borderLeft: '3px solid var(--ce-accent)',

1189 fontSize: '15px',

1190 color: 'var(--ce-text-2)',

1191 lineHeight: 1.6

1192 }}>

1193 {selected.note}

1194 </div>}

1195 

1196 {}

1197 {selected.when && <div style={{

1198 padding: '8px 12px',

1199 borderRadius: '6px',

1200 background: 'rgba(106,155,204,0.06)',

1201 border: '0.5px solid rgba(106,155,204,0.12)',

1202 fontSize: '15px',

1203 color: 'var(--ce-when-text)',

1204 marginBottom: '16px'

1205 }}>

1206 <div style={{

1207 fontSize: '10px',

1208 fontWeight: 700,

1209 textTransform: 'uppercase',

1210 letterSpacing: '0.4px',

1211 opacity: 0.65,

1212 marginBottom: '3px'

1213 }}>When it loads</div>

1214 <div style={{

1215 fontWeight: 500

1216 }}>{selected.when}</div>

1217 </div>}

1218 

1219 {}

1220 {selected.description && <div style={{

1221 fontSize: '16px',

1222 color: 'var(--ce-text-2)',

1223 lineHeight: 1.65,

1224 marginBottom: '16px'

1225 }}>

1226 {Array.isArray(selected.description) ? selected.description.map((para, i) => <div key={i} style={{

1227 marginBottom: i < selected.description.length - 1 ? '12px' : 0

1228 }}>{para}</div>) : selected.description}

1229 </div>}

1230 

1231 {}

1232 {selected.contains && selected.contains.length > 0 && <div style={{

1233 marginBottom: '16px'

1234 }}>

1235 <div style={{

1236 fontSize: '11px',

1237 fontWeight: 700,

1238 color: 'var(--ce-text-4)',

1239 textTransform: 'uppercase',

1240 letterSpacing: '0.4px',

1241 marginBottom: '8px'

1242 }}>Common keys</div>

1243 {selected.contains.map((item, i) => <div key={i} style={{

1244 display: 'flex',

1245 gap: '7px',

1246 fontSize: '15px',

1247 color: 'var(--ce-text-2)',

1248 lineHeight: 1.5,

1249 marginBottom: '5px'

1250 }}>

1251 <span style={{

1252 fontSize: '7px',

1253 color: 'var(--ce-text-4)',

1254 marginTop: '6px'

1255 }}>●</span>

1256 <span>{item}</span>

1257 </div>)}

1258 </div>}

1259 

1260 {}

1261 {selected.tips && selected.tips.length > 0 && <div style={{

1262 padding: '12px 14px',

1263 borderRadius: '8px',

1264 background: 'var(--ce-surface)',

1265 border: '1px solid var(--ce-border-subtle)',

1266 marginBottom: '16px'

1267 }}>

1268 <div style={{

1269 fontSize: '11px',

1270 fontWeight: 700,

1271 color: 'var(--ce-accent)',

1272 textTransform: 'uppercase',

1273 letterSpacing: '0.4px',

1274 marginBottom: '6px'

1275 }}>Tips</div>

1276 {selected.tips.map((tip, i) => <div key={i} style={{

1277 display: 'flex',

1278 gap: '7px',

1279 fontSize: '14.5px',

1280 color: 'var(--ce-text-2)',

1281 marginBottom: i < selected.tips.length - 1 ? '5px' : 0

1282 }}>

1283 <span style={{

1284 fontSize: '7px',

1285 color: 'var(--ce-accent)',

1286 marginTop: '6px'

1287 }}>●</span>

1288 <span>{tip}</span>

1289 </div>)}

1290 </div>}

1291 

1292 {}

1293 {selected.example && <div style={{

1294 marginBottom: '16px'

1295 }}>

1296 {selected.exampleIntro && <div style={{

1297 fontSize: '15px',

1298 color: 'var(--ce-text-2)',

1299 lineHeight: 1.6,

1300 marginBottom: '10px'

1301 }}>

1302 {selected.exampleIntro}

1303 </div>}

1304 <div style={{

1305 display: 'flex',

1306 justifyContent: 'space-between',

1307 alignItems: 'center',

1308 padding: '6px 10px',

1309 background: 'var(--ce-code-header)',

1310 border: '1px solid var(--ce-border)',

1311 borderRadius: '8px 8px 0 0'

1312 }}>

1313 <span style={{

1314 fontFamily: 'var(--ce-mono)',

1315 fontSize: '11px',

1316 fontWeight: 600,

1317 color: 'var(--ce-text-3)'

1318 }}>{selected.label}</span>

1319 <button onClick={() => copyExample(selected.id, selected.example)} style={{

1320 padding: '3px 8px',

1321 borderRadius: '4px',

1322 fontSize: '11px',

1323 fontWeight: 600,

1324 cursor: 'pointer',

1325 transition: 'all 0.15s',

1326 background: isCopied ? 'rgba(85,138,66,0.08)' : 'var(--ce-code-header)',

1327 border: isCopied ? '0.5px solid rgba(85,138,66,0.2)' : '0.5px solid var(--ce-border)',

1328 color: isCopied ? '#558A42' : 'var(--ce-text-3)'

1329 }}>

1330 {isCopied ? '✓ Copied' : 'Copy'}

1331 </button>

1332 </div>

1333 <pre style={{

1334 margin: 0,

1335 padding: '12px 14px',

1336 background: 'var(--ce-code-bg)',

1337 color: '#E8E6DC',

1338 fontFamily: 'var(--ce-mono)',

1339 fontSize: '13px',

1340 lineHeight: 1.65,

1341 borderRadius: '0 0 8px 8px',

1342 overflowX: 'auto',

1343 whiteSpace: 'pre'

1344 }}>{selected.example}</pre>

1345 </div>}

1346 

1347 {}

1348 {selected.docsLink && <a href={selected.docsLink} style={{

1349 display: 'inline-flex',

1350 padding: '5px 12px',

1351 borderRadius: '6px',

1352 background: 'var(--ce-accent-bg)',

1353 border: '1px solid var(--ce-accent-border)',

1354 color: 'var(--ce-accent)',

1355 fontSize: '12px',

1356 fontWeight: 600,

1357 textDecoration: 'none'

1358 }}>Full docs →</a>}

1359 

1360 {}

1361 {selected.children && selected.children.length > 0 && <div style={{

1362 marginTop: '20px'

1363 }}>

1364 <div style={{

1365 fontSize: '11px',

1366 fontWeight: 700,

1367 color: 'var(--ce-text-4)',

1368 textTransform: 'uppercase',

1369 letterSpacing: '0.4px',

1370 marginBottom: '8px'

1371 }}>Contents</div>

1372 <div style={{

1373 display: 'flex',

1374 flexDirection: 'column',

1375 gap: '4px'

1376 }}>

1377 {selected.children.map(child => <button key={child.id} onClick={() => selectNode(child)} style={{

1378 display: 'flex',

1379 alignItems: 'center',

1380 gap: '8px',

1381 padding: '6px 8px',

1382 width: '100%',

1383 background: 'var(--ce-surface)',

1384 borderRadius: '6px',

1385 border: 'none',

1386 cursor: 'pointer',

1387 textAlign: 'left',

1388 transition: 'background 0.1s'

1389 }} onMouseEnter={e => e.currentTarget.style.background = 'var(--ce-surface-hover)'} onMouseLeave={e => e.currentTarget.style.background = 'var(--ce-surface)'}>

1390 {renderIcon(child.icon, child.color, 13)}

1391 <span style={{

1392 fontFamily: 'var(--ce-mono)',

1393 fontSize: '12px',

1394 color: 'var(--ce-text-2)'

1395 }}>{child.label}</span>

1396 {child.oneLiner && <span style={{

1397 fontSize: '11px',

1398 color: 'var(--ce-text-4)',

1399 overflow: 'hidden',

1400 textOverflow: 'ellipsis',

1401 whiteSpace: 'nowrap'

1402 }}>{child.oneLiner}</span>}

1403 </button>)}

1404 </div>

1405 </div>}

1406 </div>

1407 </div>

1408 </>;

1409};

1410 

1411Claude Code 从您的项目目录和主目录中的 `~/.claude` 读取指令、设置、skills、subagents 和内存。将项目文件提交到 git 以与您的团队共享;`~/.claude` 中的文件是个人配置,适用于您的所有项目。

1412 

1413在 Windows 上,`~/.claude` 解析为 `%USERPROFILE%\.claude`。如果您设置了 [`CLAUDE_CONFIG_DIR`](/zh-CN/env-vars),此页面上的每个 `~/.claude` 路径都将位于该目录下。

1414 

1415大多数用户只编辑 `CLAUDE.md` 和 `settings.json`。目录的其余部分是可选的:根据需要添加 skills、rules 或 subagents。

1416 

1417## 探索目录

1418 

1419单击树中的文件以查看每个文件的作用、何时加载以及示例。

1420 

1421<ClaudeExplorer />

1422 

1423## 未显示的内容

1424 

1425浏览器涵盖您创作和编辑的文件。一些相关文件位于其他位置:

1426 

1427| 文件 | 位置 | 用途 |

1428| ----------------------- | ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |

1429| `managed-settings.json` | 系统级别,因操作系统而异 | 企业强制执行的设置,您无法覆盖。请参阅[服务器管理的设置](/zh-CN/server-managed-settings)。 |

1430| `CLAUDE.local.md` | 项目根目录 | 您对此项目的私人偏好,与 CLAUDE.md 一起加载。手动创建它并将其添加到 `.gitignore`。 |

1431| 已安装的 plugins | `~/.claude/plugins` | 克隆的市场、已安装的 plugin 版本和每个 plugin 的数据,由 `claude plugin` 命令管理。孤立版本在 plugin 更新或卸载后 7 天被删除。请参阅 [plugin 缓存](/zh-CN/plugins-reference#plugin-caching-and-file-resolution)。 |

1432 

1433`~/.claude` 还保存 Claude Code 在您工作时写入的数据:记录、提示历史、文件快照、缓存和日志。请参阅下面的[应用数据](#application-data)。

1434 

1435## 选择正确的文件

1436 

1437不同类型的自定义位于不同的文件中。使用此表找到更改应该放在哪里。

1438 

1439| 您想要 | 编辑 | 范围 | 参考 |

1440| :-------------------- | :-------------------------------------- | :---- | :--------------------------------------------- |

1441| 为 Claude 提供项目上下文和约定 | `CLAUDE.md` | 项目或全局 | [内存](/zh-CN/memory) |

1442| 允许或阻止特定工具调用 | `settings.json` `permissions` 或 `hooks` | 项目或全局 | [权限](/zh-CN/permissions)、[Hooks](/zh-CN/hooks) |

1443| 在工具调用前后运行脚本 | `settings.json` `hooks` | 项目或全局 | [Hooks](/zh-CN/hooks) |

1444| 为会话设置环境变量 | `settings.json` `env` | 项目或全局 | [设置](/zh-CN/settings#available-settings) |

1445| 将个人覆盖保留在 git 之外 | `settings.local.json` | 仅项目 | [设置范围](/zh-CN/settings#settings-files) |

1446| 添加使用 `/name` 调用的提示或功能 | `skills/<name>/SKILL.md` | 项目或全局 | [Skills](/zh-CN/skills) |

1447| 定义具有自己工具的专门 subagent | `agents/*.md` | 项目或全局 | [Subagents](/zh-CN/sub-agents) |

1448| 通过 MCP 连接外部工具 | `.mcp.json` | 仅项目 | [MCP](/zh-CN/mcp) |

1449| 更改 Claude 格式化响应的方式 | `output-styles/*.md` | 项目或全局 | [输出样式](/zh-CN/output-styles) |

1450 

1451## 文件参考

1452 

1453此表列出浏览器涵盖的每个文件。项目范围的文件位于您的仓库中的 `.claude/` 下(或 `CLAUDE.md`、`.mcp.json` 和 `.worktreeinclude` 的根目录)。全局范围的文件位于 `~/.claude/` 中,适用于所有项目。

1454 

1455<Note>

1456 有几件事可以覆盖您在这些文件中放入的内容:

1457 

1458 * 您的组织部署的[托管设置](/zh-CN/server-managed-settings)优先于所有内容

1459 * CLI 标志(如 `--permission-mode` 或 `--settings`)在该会话中覆盖 `settings.json`

1460 * 某些环境变量优先于其等效设置,但这会有所不同:检查[环境变量参考](/zh-CN/env-vars)以了解每个变量

1461 

1462 请参阅[设置优先级](/zh-CN/settings#settings-precedence)以了解完整顺序。

1463</Note>

1464 

1465单击文件名以在上面的浏览器中打开该节点。

1466 

1467| 文件 | 范围 | 提交 | 作用 | 参考 |

1468| --------------------------------------------------- | ----- | -- | ----------------------------- | ----------------------------------------------------------------------- |

1469| [`CLAUDE.md`](#ce-claude-md) | 项目和全局 | ✓ | 每个会话加载的指令 | [内存](/zh-CN/memory) |

1470| [`rules/*.md`](#ce-rules) | 项目和全局 | ✓ | 主题范围的指令,可选择路径门控 | [Rules](/zh-CN/memory#organize-rules-with-claude/rules/) |

1471| [`settings.json`](#ce-settings-json) | 项目和全局 | ✓ | 权限、hooks、环境变量、模型默认值 | [设置](/zh-CN/settings) |

1472| [`settings.local.json`](#ce-settings-local-json) | 仅项目 | | 您的个人覆盖,自动 gitignored | [设置范围](/zh-CN/settings#settings-files) |

1473| [`.mcp.json`](#ce-mcp-json) | 仅项目 | ✓ | 团队共享的 MCP 服务器 | [MCP 范围](/zh-CN/mcp#mcp-installation-scopes) |

1474| [`.worktreeinclude`](#ce-worktreeinclude) | 仅项目 | ✓ | Gitignored 文件以复制到新的 worktrees | [Worktrees](/zh-CN/common-workflows#copy-gitignored-files-to-worktrees) |

1475| [`skills/<name>/SKILL.md`](#ce-skills) | 项目和全局 | ✓ | 可重用的提示,使用 `/name` 调用或自动调用 | [Skills](/zh-CN/skills) |

1476| [`commands/*.md`](#ce-commands) | 项目和全局 | ✓ | 单文件提示;与 skills 相同的机制 | [Skills](/zh-CN/skills) |

1477| [`output-styles/*.md`](#ce-output-styles) | 项目和全局 | ✓ | 自定义系统提示部分 | [输出样式](/zh-CN/output-styles) |

1478| [`agents/*.md`](#ce-agents) | 项目和全局 | ✓ | Subagent 定义及其自己的提示和工具 | [Subagents](/zh-CN/sub-agents) |

1479| [`agent-memory/<name>/`](#ce-agent-memory) | 项目和全局 | ✓ | Subagents 的持久内存 | [持久内存](/zh-CN/sub-agents#enable-persistent-memory) |

1480| [`~/.claude.json`](#ce-claude-json) | 仅全局 | | 应用状态、OAuth、UI 切换、个人 MCP 服务器 | [全局配置](/zh-CN/settings#global-config-settings) |

1481| [`projects/<project>/memory/`](#ce-global-projects) | 仅全局 | | 自动内存:Claude 在会话间对自己的笔记 | [自动内存](/zh-CN/memory#auto-memory) |

1482| [`keybindings.json`](#ce-keybindings) | 仅全局 | | 自定义快捷键 | [快捷键](/zh-CN/keybindings) |

1483| [`themes/*.json`](#ce-themes) | 仅全局 | | 自定义颜色主题 | [自定义主题](/zh-CN/terminal-config#create-a-custom-theme) |

1484 

1485## 排查配置问题

1486 

1487如果设置、hook 或文件未生效,请参阅[调试您的配置](/zh-CN/debug-your-config)以获取检查命令和症状优先查找表。

1488 

1489## 应用数据

1490 

1491除了您创作的配置外,`~/.claude` 还保存 Claude Code 在会话期间写入的数据。这些文件是纯文本。通过工具传递的任何内容都会在磁盘上的记录中:文件内容、命令输出、粘贴的文本。

1492 

1493### 自动清理

1494 

1495下面路径中的文件在启动时被删除,一旦它们的年龄超过 [`cleanupPeriodDays`](/zh-CN/settings#available-settings)。默认值为 30 天。

1496 

1497| `~/.claude/` 下的路径 | 内容 |

1498| -------------------------------------------- | -------------------------------------------------------------------------------- |

1499| `projects/<project>/<session>.jsonl` | 完整的对话记录:每条消息、工具调用和工具结果 |

1500| `projects/<project>/<session>/tool-results/` | 大型工具输出溢出到单独的文件 |

1501| `file-history/<session>/` | Claude 更改的文件的编辑前快照,用于[检查点恢复](/zh-CN/checkpointing) |

1502| `plans/` | 在[计划模式](/zh-CN/permission-modes#analyze-before-you-edit-with-plan-mode)期间写入的计划文件 |

1503| `debug/` | 每个会话的调试日志,仅在您使用 `--debug` 启动或运行 `/debug` 时写入 |

1504| `paste-cache/`、`image-cache/` | 大型粘贴和附加图像的内容 |

1505| `session-env/` | 每个会话的环境元数据 |

1506| `tasks/` | 由任务工具写入的每个会话的任务列表 |

1507| `shell-snapshots/` | 由 Bash 工具使用的捕获的 shell 环境。在正常退出时删除。扫描清理任何在崩溃后留下的内容。 |

1508| `backups/` | 在配置迁移前获取的 `~/.claude.json` 的时间戳副本 |

1509 

1510### 保留直到您删除它们

1511 

1512以下路径不受自动清理覆盖,并无限期保留。

1513 

1514| `~/.claude/` 下的路径 | 内容 |

1515| ------------------ | ----------------------------- |

1516| `history.jsonl` | 您输入的每个提示,带有时间戳和项目路径。用于向上箭头回忆。 |

1517| `stats-cache.json` | 由 `/usage` 显示的聚合令牌和成本计数 |

1518| `todos/` | 旧版每个会话的任务列表。不再由当前版本写入;可以安全删除。 |

1519 

1520其他小缓存和锁定文件根据您使用的功能而出现,可以安全删除。

1521 

1522### 纯文本存储

1523 

1524记录和历史在静止时未加密。操作系统文件权限是唯一的保护。如果工具读取 `.env` 文件或命令打印凭证,该值将写入 `projects/<project>/<session>.jsonl`。要减少暴露:

1525 

1526* 降低 `cleanupPeriodDays` 以缩短记录的保留时间

1527* 设置 [`CLAUDE_CODE_SKIP_PROMPT_HISTORY`](/zh-CN/env-vars) 环境变量以跳过在任何模式下写入记录和提示历史。在非交互模式下,您可以改为在 `-p` 旁边传递 `--no-session-persistence`,或在 Agent SDK 中设置 `persistSession: false`。

1528* 使用[权限规则](/zh-CN/permissions)拒绝读取凭证文件

1529 

1530### 清除本地数据

1531 

1532运行 `claude project purge` 以删除 Claude Code 为一个项目保存的状态:

1533 

1534* `projects/` 下的记录和自动内存

1535* 每个会话的 `tasks/`、`debug/` 和 `file-history/` 条目

1536* `history.jsonl` 中的匹配提示行

1537* `~/.claude.json` 中的项目条目

1538 

1539该命令打印完整的删除计划,并在删除任何内容之前要求确认。

1540 

1541预览计划而不删除任何内容:

1542 

1543```bash theme={null}

1544claude project purge ~/work/my-repo --dry-run

1545```

1546 

1547通过单个确认提示删除:

1548 

1549```bash theme={null}

1550claude project purge ~/work/my-repo

1551```

1552 

1553省略路径以从交互式列表中选择项目。

1554 

1555跳过确认提示以在脚本中使用:

1556 

1557```bash theme={null}

1558claude project purge ~/work/my-repo --yes

1559```

1560 

1561传递 `--all` 而不是路径以一次清除所有项目的状态,这会直接删除 `history.jsonl` 而不是过滤它。传递 `-i` 以逐项逐步执行删除计划。

1562 

1563该命令不理会 `shell-snapshots/` 和 `backups/`,因为这些不是项目范围的,并在计划输出中警告它们。如果没有状态与给定路径匹配,它以状态 1 退出。

1564 

1565您也可以手动删除上面的任何应用数据路径。新会话不受影响。下表显示您对过去会话失去的内容。

1566 

1567| 删除 | 您失去 |

1568| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------ |

1569| `~/.claude/projects/` | 恢复、继续和倒回过去的会话 |

1570| `~/.claude/history.jsonl` | 向上箭头提示回忆 |

1571| `~/.claude/file-history/` | 过去会话的检查点恢复 |

1572| `~/.claude/stats-cache.json` | 由 `/usage` 显示的历史总计 |

1573| `~/.claude/debug/`、`~/.claude/plans/`、`~/.claude/paste-cache/`、`~/.claude/image-cache/`、`~/.claude/session-env/`、`~/.claude/tasks/`、`~/.claude/shell-snapshots/`、`~/.claude/backups/` | 没有面向用户的内容 |

1574| `~/.claude/todos/` | 没有。旧版目录不由当前版本写入。 |

1575 

1576不要删除 `~/.claude.json`、`~/.claude/settings.json` 或 `~/.claude/plugins/`:这些保存您的身份验证、偏好和已安装的 plugins。

1577 

1578## 相关资源

1579 

1580* [管理 Claude 的内存](/zh-CN/memory):编写和组织 CLAUDE.md、rules 和自动内存

1581* [配置设置](/zh-CN/settings):设置权限、hooks、环境变量和模型默认值

1582* [创建 skills](/zh-CN/skills):构建可重用的提示和工作流

1583* [配置 subagents](/zh-CN/sub-agents):定义具有自己上下文的专门代理

cli-reference.md +129 −0 created

Details

1> ## Documentation Index

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

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

4 

5# CLI 参考

6 

7> Claude Code 命令行界面的完整参考,包括命令和标志。

8 

9## CLI 命令

10 

11您可以使用这些命令启动会话、管道内容、恢复对话和管理更新:

12 

13| 命令 | 描述 | 示例 |

14| :------------------------------ | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------- |

15| `claude` | 启动交互式会话 | `claude` |

16| `claude "query"` | 使用初始提示启动交互式会话 | `claude "explain this project"` |

17| `claude -p "query"` | 通过 SDK 查询,然后退出 | `claude -p "explain this function"` |

18| `cat file \| claude -p "query"` | 处理管道内容 | `cat logs.txt \| claude -p "explain"` |

19| `claude -c` | 在当前目录中继续最近的对话 | `claude -c` |

20| `claude -c -p "query"` | 通过 SDK 继续 | `claude -c -p "Check for type errors"` |

21| `claude -r "<session>" "query"` | 按 ID 或名称恢复会话 | `claude -r "auth-refactor" "Finish this PR"` |

22| `claude update` | 更新到最新版本 | `claude update` |

23| `claude install [version]` | 安装或重新安装本机二进制文件。接受版本号如 `2.1.118`、`stable` 或 `latest`。请参阅 [安装特定版本](/zh-CN/setup#install-a-specific-version) | `claude install stable` |

24| `claude auth login` | 登录您的 Anthropic 账户。使用 `--email` 预填充您的电子邮件地址,使用 `--sso` 强制 SSO 身份验证,使用 `--console` 使用 Anthropic Console 登录以进行 API 使用计费而不是 Claude 订阅 | `claude auth login --console` |

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

26| `claude auth status` | 以 JSON 格式显示身份验证状态。使用 `--text` 获取人类可读的输出。如果已登录,则以代码 0 退出,如果未登录,则以代码 1 退出 | `claude auth status` |

27| `claude agents` | 列出所有已配置的 [subagents](/zh-CN/sub-agents),按来源分组 | `claude agents` |

28| `claude auto-mode defaults` | 以 JSON 格式打印内置 [auto mode](/zh-CN/permission-modes#eliminate-prompts-with-auto-mode) 分类器规则。使用 `claude auto-mode config` 查看应用了设置的有效配置 | `claude auto-mode defaults > rules.json` |

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

30| `claude plugin` | 管理 Claude Code [plugins](/zh-CN/plugins)。别名:`claude plugins`。请参阅 [plugin 参考](/zh-CN/plugins-reference#cli-commands-reference) 了解子命令 | `claude plugin install code-review@claude-plugins-official` |

31| `claude project purge [path]` | 删除项目的所有本地 Claude Code 状态:记录、任务列表、调试日志、文件编辑历史、提示历史行和项目在 `~/.claude.json` 中的条目。省略 `[path]` 以从交互式列表中选择。标志:`--dry-run` 预览,`-y`/`--yes` 跳过确认,`-i`/`--interactive` 确认每一项,`--all` 用于每个项目。请参阅 [清除本地数据](/zh-CN/claude-directory#clear-local-data) | `claude project purge ~/work/repo --dry-run` |

32| `claude remote-control` | 启动 [Remote Control](/zh-CN/remote-control) 服务器以从 Claude.ai 或 Claude 应用控制 Claude Code。在服务器模式下运行(无本地交互式会话)。请参阅 [服务器模式标志](/zh-CN/remote-control#start-a-remote-control-session) | `claude remote-control --name "My Project"` |

33| `claude setup-token` | 为 CI 和脚本生成长期 OAuth 令牌。将令牌打印到终端而不保存。需要 Claude 订阅。请参阅 [生成长期令牌](/zh-CN/authentication#generate-a-long-lived-token) | `claude setup-token` |

34| `claude ultrareview [target]` | 非交互式运行 [ultrareview](/zh-CN/ultrareview#run-ultrareview-non-interactively)。将发现结果打印到标准输出,成功时退出代码 0,失败时退出代码 1。使用 `--json` 获取原始有效负载,使用 `--timeout <minutes>` 覆盖 30 分钟的默认值 | `claude ultrareview 1234 --json` |

35 

36如果您输入错误的子命令,Claude Code 会建议最接近的匹配项并退出而不启动会话。例如,`claude udpate` 会打印 `Did you mean claude update?`。

37 

38## CLI 标志

39 

40使用这些命令行标志自定义 Claude Code 的行为。`claude --help` 不会列出每个标志,因此标志在 `--help` 中的缺失并不意味着它不可用。

41 

42| 标志 | 描述 | 示例 |

43| :---------------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------- |

44| `--add-dir` | 为 Claude 添加额外的工作目录以读取和编辑文件。授予文件访问权限;大多数 `.claude/` 配置 [不会从这些目录中发现](/zh-CN/permissions#additional-directories-grant-file-access-not-configuration)。验证每个路径是否存在为目录 | `claude --add-dir ../apps ../lib` |

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

46| `--agents` | 通过 JSON 动态定义自定义 subagents。使用与 subagent [frontmatter](/zh-CN/sub-agents#supported-frontmatter-fields) 相同的字段名称,加上代理指令的 `prompt` 字段 | `claude --agents '{"reviewer":{"description":"Reviews code","prompt":"You are a code reviewer"}}'` |

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

48| `--allowedTools` | 无需提示权限即可执行的工具。请参阅 [权限规则语法](/zh-CN/settings#permission-rule-syntax) 了解模式匹配。要限制哪些工具可用,请改用 `--tools` | `"Bash(git log *)" "Bash(git diff *)" "Read"` |

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

50| `--append-system-prompt-file` | 从文件加载额外的系统提示文本并附加到默认提示 | `claude --append-system-prompt-file ./extra-rules.txt` |

51| `--bare` | 最小模式:跳过 hooks、skills、plugins、MCP 服务器、自动内存和 CLAUDE.md 的自动发现,以便脚本化调用启动更快。Claude 可以访问 Bash、文件读取和文件编辑工具。设置 [`CLAUDE_CODE_SIMPLE`](/zh-CN/env-vars)。请参阅 [bare mode](/zh-CN/headless#start-faster-with-bare-mode) | `claude --bare -p "query"` |

52| `--betas` | 要包含在 API 请求中的 Beta 标头(仅限 API 密钥用户) | `claude --betas interleaved-thinking` |

53| `--channels` | (研究预览)MCP 服务器,其 [channel](/zh-CN/channels) 通知 Claude 应在此会话中侦听。以空格分隔的 `plugin:<name>@<marketplace>` 条目列表。需要 Claude.ai 身份验证 | `claude --channels plugin:my-notifier@my-marketplace` |

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

55| `--continue`, `-c` | 加载当前目录中最近的对话。包括使用 `/add-dir` 添加此目录的会话 | `claude --continue` |

56| `--dangerously-load-development-channels` | 启用不在批准的允许列表中的 [channels](/zh-CN/channels-reference#test-during-the-research-preview),用于本地开发。接受 `plugin:<name>@<marketplace>` 和 `server:<name>` 条目。提示确认 | `claude --dangerously-load-development-channels server:webhook` |

57| `--dangerously-skip-permissions` | 跳过权限提示。等同于 `--permission-mode bypassPermissions`。请参阅 [权限模式](/zh-CN/permission-modes#skip-all-checks-with-bypasspermissions-mode) 了解此操作跳过和不跳过的内容 | `claude --dangerously-skip-permissions` |

58| `--debug` | 启用调试模式,可选类别过滤(例如,`"api,hooks"` 或 `"!statsig,!file"`) | `claude --debug "api,mcp"` |

59| `--debug-file <path>` | 将调试日志写入特定文件路径。隐式启用调试模式。优先于 `CLAUDE_CODE_DEBUG_LOGS_DIR` | `claude --debug-file /tmp/claude-debug.log` |

60| `--disable-slash-commands` | 为此会话禁用所有 skills 和命令 | `claude --disable-slash-commands` |

61| `--disallowedTools` | 从模型的上下文中删除的工具,无法使用 | `"Bash(git log *)" "Bash(git diff *)" "Edit"` |

62| `--effort` | 为当前会话设置 [工作量级别](/zh-CN/model-config#adjust-effort-level)。选项:`low`、`medium`、`high`、`xhigh`、`max`;可用级别取决于模型。会话范围内,不会持久化到设置 | `claude --effort high` |

63| `--enable-auto-mode` | {/* max-version: 2.1.110 */}在 v2.1.111 中移除。Auto mode 现在默认在 `Shift+Tab` 循环中;使用 `--permission-mode auto` 以它开始 | `claude --permission-mode auto` |

64| `--exclude-dynamic-system-prompt-sections` | 将每台机器的部分从系统提示(工作目录、环境信息、内存路径、git 状态)移到第一条用户消息中。改进在运行相同任务的不同用户和机器之间的提示缓存重用。仅适用于默认系统提示;当设置 `--system-prompt` 或 `--system-prompt-file` 时忽略。与 `-p` 一起用于脚本化的多用户工作负载 | `claude -p --exclude-dynamic-system-prompt-sections "query"` |

65| `--fallback-model` | 当默认模型过载时启用自动回退到指定模型(仅打印模式) | `claude -p --fallback-model sonnet "query"` |

66| `--fork-session` | 恢复时,创建新的会话 ID 而不是重用原始 ID(与 `--resume` 或 `--continue` 一起使用) | `claude --resume abc123 --fork-session` |

67| `--from-pr` | 恢复链接到特定拉取请求的会话。接受 PR 号、GitHub 或 GitHub Enterprise PR URL、GitLab 合并请求 URL 或 Bitbucket 拉取请求 URL。当 Claude 创建拉取请求时会自动链接会话 | `claude --from-pr 123` |

68| `--ide` | 如果恰好有一个有效的 IDE 可用,则在启动时自动连接到 IDE | `claude --ide` |

69| `--init` | 在会话前运行带有 `init` 匹配器的 [Setup hooks](/zh-CN/hooks#setup)(仅打印模式) | `claude -p --init "query"` |

70| `--init-only` | 运行 [Setup](/zh-CN/hooks#setup) 和 `SessionStart` hooks,然后退出而不启动对话 | `claude --init-only` |

71| `--include-hook-events` | 在输出流中包含所有 hook 生命周期事件。需要 `--output-format stream-json` | `claude -p --output-format stream-json --include-hook-events "query"` |

72| `--include-partial-messages` | 在输出中包含部分流事件。需要 `--print` 和 `--output-format stream-json` | `claude -p --output-format stream-json --include-partial-messages "query"` |

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

74| `--json-schema` | 在代理完成其工作流后获得与 JSON Schema 匹配的验证 JSON 输出(仅打印模式,请参阅 [结构化输出](/zh-CN/agent-sdk/structured-outputs)) | `claude -p --json-schema '{"type":"object","properties":{...}}' "query"` |

75| `--maintenance` | 在会话前运行带有 `maintenance` 匹配器的 [Setup hooks](/zh-CN/hooks#setup)(仅打印模式) | `claude -p --maintenance "query"` |

76| `--max-budget-usd` | API 调用前停止的最大美元金额(仅打印模式) | `claude -p --max-budget-usd 5.00 "query"` |

77| `--max-turns` | 限制代理转数(仅打印模式)。达到限制时以错误退出。默认无限制 | `claude -p --max-turns 3 "query"` |

78| `--mcp-config` | 从 JSON 文件或字符串加载 MCP 服务器(以空格分隔) | `claude --mcp-config ./mcp.json` |

79| `--model` | 为当前会话设置模型,使用最新模型的别名(`sonnet` 或 `opus`)或模型的完整名称 | `claude --model claude-sonnet-4-6` |

80| `--name`, `-n` | 为会话设置显示名称,显示在 `/resume` 和终端标题中。您可以使用 `claude --resume <name>` 恢复命名会话。<br /><br />[`/rename`](/zh-CN/commands) 在会话中更改名称,也会在提示栏中显示 | `claude -n "my-feature-work"` |

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

82| `--no-session-persistence` | 禁用会话持久化,以便会话不会保存到磁盘且无法恢复(仅打印模式) | `claude -p --no-session-persistence "query"` |

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

84| `--permission-mode` | 以指定的 [权限模式](/zh-CN/permission-modes) 开始。接受 `default`、`acceptEdits`、`plan`、`auto`、`dontAsk` 或 `bypassPermissions`。覆盖设置文件中的 `defaultMode` | `claude --permission-mode plan` |

85| `--permission-prompt-tool` | 指定 MCP 工具以在非交互模式下处理权限提示 | `claude -p --permission-prompt-tool mcp_auth_tool "query"` |

86| `--plugin-dir` | 仅为此会话从目录加载插件。每个标志采用一个路径。重复该标志以获取多个目录:`--plugin-dir A --plugin-dir B` | `claude --plugin-dir ./my-plugins` |

87| `--print`, `-p` | 打印响应而不进入交互模式(请参阅 [Agent SDK 文档](/zh-CN/agent-sdk/overview) 了解编程使用详情) | `claude -p "query"` |

88| `--remote` | 在 claude.ai 上创建新的 [网络会话](/zh-CN/claude-code-on-the-web),提供任务描述 | `claude --remote "Fix the login bug"` |

89| `--remote-control`, `--rc` | 启动启用了 [Remote Control](/zh-CN/remote-control#start-a-remote-control-session) 的交互式会话,以便您也可以从 claude.ai 或 Claude 应用控制它。可选地为会话传递名称 | `claude --remote-control "My Project"` |

90| `--remote-control-session-name-prefix <prefix>` | 当未设置显式名称时,[Remote Control](/zh-CN/remote-control) 自动生成会话名称的前缀。默认为您的机器的主机名,生成名称如 `myhost-graceful-unicorn`。设置 `CLAUDE_REMOTE_CONTROL_SESSION_NAME_PREFIX` 以获得相同效果 | `claude remote-control --remote-control-session-name-prefix dev-box` |

91| `--replay-user-messages` | 从 stdin 重新发出用户消息到 stdout 以进行确认。需要 `--input-format stream-json` 和 `--output-format stream-json` | `claude -p --input-format stream-json --output-format stream-json --replay-user-messages` |

92| `--resume`, `-r` | 按 ID 或名称恢复特定会话,或显示交互式选择器以选择会话。包括使用 `/add-dir` 添加此目录的会话 | `claude --resume auth-refactor` |

93| `--session-id` | 为对话使用特定的会话 ID(必须是有效的 UUID) | `claude --session-id "550e8400-e29b-41d4-a716-446655440000"` |

94| `--setting-sources` | 逗号分隔的设置源列表以加载(`user`、`project`、`local`) | `claude --setting-sources user,project` |

95| `--settings` | 设置 JSON 文件的路径或 JSON 字符串以加载其他设置 | `claude --settings ./settings.json` |

96| `--strict-mcp-config` | 仅使用来自 `--mcp-config` 的 MCP 服务器,忽略所有其他 MCP 配置 | `claude --strict-mcp-config --mcp-config ./mcp.json` |

97| `--system-prompt` | 用自定义文本替换整个系统提示 | `claude --system-prompt "You are a Python expert"` |

98| `--system-prompt-file` | 从文件加载系统提示,替换默认提示 | `claude --system-prompt-file ./custom-prompt.txt` |

99| `--teleport` | 在本地终端中恢复 [网络会话](/zh-CN/claude-code-on-the-web) | `claude --teleport` |

100| `--teammate-mode` | 设置 [agent team](/zh-CN/agent-teams) 队友的显示方式:`auto`(默认)、`in-process` 或 `tmux`。请参阅 [选择显示模式](/zh-CN/agent-teams#choose-a-display-mode) | `claude --teammate-mode in-process` |

101| `--tmux` | 为 worktree 创建 tmux 会话。需要 `--worktree`。在可用时使用 iTerm2 原生窗格;传递 `--tmux=classic` 以使用传统 tmux | `claude -w feature-auth --tmux` |

102| `--tools` | 限制 Claude 可以使用的内置工具。使用 `""` 禁用所有,`"default"` 表示全部,或工具名称如 `"Bash,Edit,Read"` | `claude --tools "Bash,Edit,Read"` |

103| `--verbose` | 启用详细日志记录,显示完整的逐轮输出 | `claude --verbose` |

104| `--version`, `-v` | 输出版本号 | `claude -v` |

105| `--worktree`, `-w` | 在隔离的 [git worktree](/zh-CN/common-workflows#run-parallel-claude-code-sessions-with-git-worktrees) 中启动 Claude,位于 `<repo>/.claude/worktrees/<name>`。如果未给出名称,则自动生成一个 | `claude -w feature-auth` |

106 

107### 系统提示标志

108 

109Claude Code 提供四个标志用于自定义系统提示。所有四个都在交互和非交互模式下工作。

110 

111| 标志 | 行为 | 示例 |

112| :---------------------------- | :----------- | :------------------------------------------------------ |

113| `--system-prompt` | 替换整个默认提示 | `claude --system-prompt "You are a Python expert"` |

114| `--system-prompt-file` | 用文件内容替换 | `claude --system-prompt-file ./prompts/review.txt` |

115| `--append-system-prompt` | 附加到默认提示 | `claude --append-system-prompt "Always use TypeScript"` |

116| `--append-system-prompt-file` | 将文件内容附加到默认提示 | `claude --append-system-prompt-file ./style-rules.txt` |

117 

118`--system-prompt` 和 `--system-prompt-file` 互斥。附加标志可以与任一替换标志组合。

119 

120对于大多数用例,使用附加标志。附加保留 Claude Code 的内置功能,同时添加您的要求。仅当您需要对系统提示进行完全控制时,才使用替换标志。

121 

122## 另请参阅

123 

124* [Chrome 扩展](/zh-CN/chrome) - 浏览器自动化和网络测试

125* [交互模式](/zh-CN/interactive-mode) - 快捷键、输入模式和交互功能

126* [快速入门指南](/zh-CN/quickstart) - Claude Code 入门

127* [常见工作流](/zh-CN/common-workflows) - 高级工作流和模式

128* [设置](/zh-CN/settings) - 配置选项

129* [Agent SDK 文档](/zh-CN/agent-sdk/overview) - 编程使用和集成

code-review.md +274 −0 created

Details

1> ## Documentation Index

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

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

4 

5# Code Review

6 

7> 设置自动化 PR 审查,通过对完整代码库的多代理分析来捕获逻辑错误、安全漏洞和回归问题

8 

9<Note>

10 Code Review 处于研究预览阶段,仅适用于 [Team 和 Enterprise](https://claude.ai/admin-settings/claude-code) 订阅。对于启用了 [Zero Data Retention](/zh-CN/zero-data-retention) 的组织,此功能不可用。

11</Note>

12 

13Code Review 分析您的 GitHub pull request,并在发现问题的代码行上发布内联评论。一支由专业代理组成的团队在完整代码库的上下文中检查代码更改,寻找逻辑错误、安全漏洞、破损的边界情况和微妙的回归问题。

14 

15发现结果按严重程度标记,不会批准或阻止您的 PR,因此现有的审查工作流保持不变。您可以通过向存储库添加 `CLAUDE.md` 或 `REVIEW.md` 文件来调整 Claude 标记的内容。

16 

17要在您自己的 CI 基础设施中运行 Claude 而不是使用此托管服务,请参阅 [GitHub Actions](/zh-CN/github-actions) 或 [GitLab CI/CD](/zh-CN/gitlab-ci-cd)。对于自托管 GitHub 实例上的存储库,请参阅 [GitHub Enterprise Server](/zh-CN/github-enterprise-server)。

18 

19本页涵盖:

20 

21* [审查工作原理](#how-reviews-work)

22* [设置](#set-up-code-review)

23* [手动触发审查](#manually-trigger-reviews),使用 `@claude review` 和 `@claude review once`

24* [自定义审查](#customize-reviews),使用 `CLAUDE.md` 和 `REVIEW.md`

25* [定价](#pricing)

26* [故障排除](#troubleshooting)失败的运行和缺失的评论

27 

28## 审查工作原理

29 

30一旦管理员为您的组织[启用 Code Review](#set-up-code-review),审查将在 PR 打开时、每次推送时或手动请求时触发,具体取决于存储库的配置行为。在任何模式下,注释 `@claude review` 可以[在 PR 上启动审查](#manually-trigger-reviews)。

31 

32当审查运行时,多个代理在 Anthropic 基础设施上并行分析差异和周围代码。每个代理寻找不同类别的问题,然后验证步骤检查候选项是否与实际代码行为相符,以过滤掉误报。结果被去重、按严重程度排序,并作为内联评论发布在发现问题的特定行上,并在审查正文中包含摘要。如果未发现问题,Claude 会在 PR 上发布简短的确认评论。

33 

34审查成本随 PR 大小和复杂性而扩展,平均在 20 分钟内完成。管理员可以通过[分析仪表板](#view-usage)监控审查活动和支出。

35 

36### 严重程度级别

37 

38每个发现都标有严重程度级别:

39 

40| 标记 | 严重程度 | 含义 |

41| :- | :--- | :------------------- |

42| 🔴 | 重要 | 应在合并前修复的错误 |

43| 🟡 | 小问题 | 轻微问题,值得修复但不阻止 |

44| 🟣 | 预先存在 | 代码库中存在但不是由此 PR 引入的错误 |

45 

46发现包括可折叠的扩展推理部分,您可以展开以了解 Claude 为什么标记该问题以及它如何验证问题。

47 

48### 对发现进行评分和回复

49 

50Claude 的每条审查评论都已附加 👍 和 👎,因此两个按钮都会在 GitHub UI 中出现,以便一键评分。如果发现有用,请点击 👍;如果发现错误或嘈杂,请点击 👎。Anthropic 在 PR 合并后收集反应计数,并使用它们来调整审查者。反应不会触发重新审查或更改 PR 上的任何内容。

51 

52回复内联评论不会提示 Claude 响应或更新 PR。要对发现采取行动,请修复代码并推送。如果 PR 订阅了推送触发的审查,下一次运行将在问题修复时解决线程。要请求新审查而不推送,请作为[顶级 PR 评论](#manually-trigger-reviews)注释 `@claude review once`。

53 

54### 检查运行输出

55 

56除了内联审查评论外,每次审查都会填充 **Claude Code Review** 检查运行,该运行与您的 CI 检查一起出现。展开其 **Details** 链接以在一个地方查看每个发现的摘要,按严重程度排序:

57 

58| 严重程度 | 文件:行 | 问题 |

59| ------ | ------------------------- | ----------------------------- |

60| 🔴 重要 | `src/auth/session.ts:142` | 令牌刷新与登出竞争,导致过期会话保持活跃 |

61| 🟡 小问题 | `src/auth/session.ts:88` | `parseExpiry` 在格式错误的输入上静默返回 0 |

62 

63每个发现也作为 **Files changed** 选项卡中的注释出现,直接标记在相关的差异行上。重要发现用红色标记呈现,小问题用黄色警告,预先存在的错误用灰色通知。注释和严重程度表独立于内联审查评论写入检查运行,因此即使 GitHub 拒绝在移动的行上的内联评论,它们仍然可用。

64 

65检查运行始终以中立结论完成,因此它永远不会通过分支保护规则阻止合并。如果您想根据 Code Review 发现来限制合并,请在您自己的 CI 中读取检查运行输出中的严重程度分解。Details 文本的最后一行是一个机器可读的评论,您的工作流可以使用 `gh` 和 jq 解析:

66 

67```bash theme={null}

68gh api repos/OWNER/REPO/check-runs/CHECK_RUN_ID \

69 --jq '.output.text | split("bughunter-severity: ")[1] | split(" -->")[0] | fromjson'

70```

71 

72这返回一个 JSON 对象,其中包含每个严重程度的计数,例如 `{"normal": 2, "nit": 1, "pre_existing": 0}`。`normal` 键保存重要发现的计数;非零值意味着 Claude 发现了至少一个在合并前值得修复的错误。

73 

74### Code Review 检查的内容

75 

76默认情况下,Code Review 专注于正确性:会破坏生产的错误,而不是格式偏好或缺失的测试覆盖。您可以通过[向存储库添加指导文件](#customize-reviews)来扩展其检查范围。

77 

78## 设置 Code Review

79 

80管理员为组织启用一次 Code Review,并选择要包含的存储库。

81 

82<Steps>

83 <Step title="打开 Claude Code 管理员设置">

84 转到 [claude.ai/admin-settings/claude-code](https://claude.ai/admin-settings/claude-code) 并找到 Code Review 部分。您需要对 Claude 组织具有管理员访问权限,并有权在 GitHub 组织中安装 GitHub Apps。

85 </Step>

86 

87 <Step title="开始设置">

88 点击**设置**。这将开始 GitHub App 安装流程。

89 </Step>

90 

91 <Step title="安装 Claude GitHub App">

92 按照提示将 Claude GitHub App 安装到您的 GitHub 组织。该应用请求这些存储库权限:

93 

94 * **Contents**:读写

95 * **Issues**:读写

96 * **Pull requests**:读写

97 

98 Code Review 使用对内容的读取访问权限和对 pull request 的写入访问权限。更广泛的权限集也支持 [GitHub Actions](/zh-CN/github-actions),如果您稍后启用的话。

99 </Step>

100 

101 <Step title="选择存储库">

102 选择要为 Code Review 启用的存储库。如果您看不到存储库,请确保在安装期间为 Claude GitHub App 提供了对其的访问权限。您可以稍后添加更多存储库。

103 </Step>

104 

105 <Step title="为每个存储库设置审查触发器">

106 设置完成后,Code Review 部分在表格中显示您的存储库。对于每个存储库,使用**审查行为**下拉菜单选择何时运行审查:

107 

108 * **PR 创建后一次**:当 PR 打开或标记为准备审查时运行一次审查

109 * **每次推送后**:在每次推送到 PR 分支时运行审查,在 PR 演变时捕获新问题,并在您修复标记的问题时自动解决线程

110 * **手动**:仅当有人[在 PR 上注释 `@claude review` 或 `@claude review once`](#manually-trigger-reviews) 时才启动审查;`@claude review` 也会将 PR 订阅到后续推送的审查

111 

112 每次推送时审查会运行最多审查并花费最多。手动模式对于高流量存储库很有用,您可以选择特定 PR 进行审查,或仅在 PR 准备好后才开始审查。

113 </Step>

114</Steps>

115 

116存储库表还显示每个存储库基于最近活动的平均审查成本。使用行操作菜单为每个存储库打开或关闭 Code Review,或完全删除存储库。

117 

118要验证设置,请打开测试 PR。如果您选择了自动触发器,在几分钟内会出现名为 **Claude Code Review** 的检查运行。如果您选择了手动,在 PR 上注释 `@claude review` 以启动第一次审查。如果没有出现检查运行,请确认存储库在您的管理员设置中列出,并且 Claude GitHub App 有权访问它。

119 

120## 手动触发审查

121 

122两个注释命令按需启动审查。无论存储库的配置触发器如何,两者都有效,因此您可以使用它们在手动模式下选择特定 PR 进行审查,或在其他模式下获得立即重新审查。

123 

124| 命令 | 作用 |

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

126| `@claude review` | 启动审查并将 PR 订阅到今后的推送触发审查 |

127| `@claude review once` | 启动单次审查,不订阅未来推送 |

128 

129当您想要对 PR 的当前状态获得反馈但不希望每次后续推送都产生审查时,使用 `@claude review once`。这对于具有频繁推送的长期运行 PR 很有用,或者当您想要一次性第二意见而不改变 PR 的审查行为时。

130 

131对于任一命令触发审查:

132 

133* 将其作为顶级 PR 评论发布,而不是差异行上的内联评论

134* 在注释开头放置命令,如果您使用一次性形式,则在同一行上放置 `once`

135* 您必须对存储库具有所有者、成员或协作者访问权限

136* PR 必须打开

137 

138与自动触发不同,手动触发在草稿 PR 上运行,因为显式请求表示您想要现在的审查,无论草稿状态如何。

139 

140如果该 PR 上已有审查正在运行,请求将排队等待进行中的审查完成。您可以通过 PR 上的检查运行监控进度。

141 

142## 自定义审查

143 

144Code Review 从您的存储库读取两个文件来指导它标记的内容。它们在如何强烈影响审查方面有所不同:

145 

146* **`CLAUDE.md`**:共享项目说明,Claude Code 用于所有任务,不仅仅是审查。Code Review 将其作为项目上下文读取,并将新引入的违规标记为小问题。

147* **`REVIEW.md`**:仅审查说明,直接注入到审查管道中的每个代理中作为最高优先级。使用它来改变标记的内容、严重程度以及如何报告发现。

148 

149### CLAUDE.md

150 

151Code Review 读取您的存储库的 `CLAUDE.md` 文件,并将新引入的违规视为[小问题级别](#severity-levels)的发现。这是双向工作的:如果您的 PR 以使 `CLAUDE.md` 语句过时的方式更改代码,Claude 会标记文档需要更新。

152 

153Claude 在目录层次结构的每个级别读取 `CLAUDE.md` 文件,因此子目录的 `CLAUDE.md` 中的规则仅适用于该路径下的文件。有关 `CLAUDE.md` 如何工作的更多信息,请参阅[内存文档](/zh-CN/memory)。

154 

155对于您不想应用于常规 Claude Code 会话的仅审查指导,请改用 [`REVIEW.md`](#review-md)。

156 

157### REVIEW\.md

158 

159`REVIEW.md` 是位于您的存储库根目录的文件,它覆盖 Code Review 在您的存储库上的行为方式。其内容被注入到审查管道中每个代理的系统提示中,作为最高优先级指令块,优先于默认审查指导。

160 

161因为它是逐字粘贴的,`REVIEW.md` 是纯说明:[`@` 导入语法](/zh-CN/memory#import-additional-files)不会展开,引用的文件不会读入提示。将您想要强制执行的规则直接放在文件中。

162 

163#### 您可以调整的内容

164 

165`REVIEW.md` 是自由格式的 markdown,因此任何您可以表达为审查说明的内容都在范围内。下面的模式在实践中影响最大。

166 

167**严重程度**:为您的存储库重新定义 🔴 重要的含义。默认校准针对生产代码;文档存储库、配置存储库或原型可能想要更窄的定义。明确说明哪些类别的发现是重要的,哪些最多是小问题。您也可以向另一个方向升级,例如将任何 `CLAUDE.md` 违规视为重要而不是默认小问题。

168 

169**小问题数量**:限制单次审查发布的 🟡 小问题评论数量。散文和配置文件可以永远被打磨。像"最多报告五个小问题,在摘要中提及其余的计数"这样的上限使审查可操作。

170 

171**跳过规则**:列出 Claude 应该不发布任何发现的路径、分支模式和发现类别。常见候选是生成的代码、lockfiles、供应商依赖和机器创作的分支,以及您的 CI 已经强制执行的任何内容,如 linting 或拼写检查。对于值得一些审查但不需要完全审查的路径,设置更高的标准而不是完全跳过:"在 `scripts/` 中,仅在接近确定且严重时报告。"

172 

173**存储库特定检查**:添加您想在每个 PR 上标记的规则,如"新 API 路由必须有集成测试。"因为 `REVIEW.md` 被注入为最高优先级,这些比长 `CLAUDE.md` 中的相同规则更可靠地着陆。

174 

175**验证标准**:在发布发现类别之前需要证据。例如,"行为声明需要源中的 `file:line` 引用,而不是从命名推断"会减少否则会花费作者往返的误报。

176 

177**重新审查收敛**:告诉 Claude 当 PR 已经被审查时如何表现。像"在第一次审查后,抑制新的小问题并仅发布重要发现"这样的规则会阻止单行修复仅因风格而达到第七轮。

178 

179**摘要形状**:要求审查正文以一行计数开头,如 `2 factual, 4 style`,并在这种情况下以"没有事实问题"开头。作者想在详细信息之前知道工作的形状。

180 

181#### 示例

182 

183这个 `REVIEW.md` 为后端服务重新校准严重程度,限制小问题,跳过生成的文件,并添加存储库特定检查。

184 

185```markdown theme={null}

186# 审查说明

187 

188## 重要在这里的含义

189 

190保留重要用于会破坏行为、泄露数据或阻止回滚的发现:不正确的逻辑、无范围的数据库查询、日志或错误消息中的 PII,以及不向后兼容的迁移。风格、命名和重构建议最多是小问题。

191 

192## 限制小问题

193 

194每次审查最多报告五个小问题。如果您发现了更多,请在摘要中说"加上 N 个类似项目"而不是内联发布它们。如果您发现的一切都是小问题,请以"没有阻止问题"开头摘要。

195 

196## 不要报告

197 

198- CI 已经强制执行的任何内容:lint、格式化、类型错误

199- `src/gen/` 下生成的文件和任何 `*.lock` 文件

200- 故意违反生产规则的仅测试代码

201 

202## 始终检查

203 

204- 新 API 路由有集成测试

205- 日志行不包括电子邮件地址、用户 ID 或请求正文

206- 数据库查询的范围限定为调用者的租户

207```

208 

209#### 保持专注

210 

211长度有成本:长 `REVIEW.md` 会稀释最重要的规则。将其保持为改变审查行为的说明,并将常规项目上下文留在 `CLAUDE.md` 中。

212 

213## 查看使用情况

214 

215转到 [claude.ai/analytics/code-review](https://claude.ai/analytics/code-review) 以查看整个组织的 Code Review 活动。仪表板显示:

216 

217| 部分 | 显示内容 |

218| :----- | :--------------------------- |

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

220| 每周成本 | Code Review 的每周支出 |

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

222| 存储库分解 | 每个存储库的审查 PR 计数和已解决评论 |

223 

224管理员设置中的存储库表也显示每个存储库的平均审查成本。仪表板成本数字是用于监控活动的估计;对于发票准确的支出,请参考您的 Anthropic 账单。

225 

226## 定价

227 

228Code Review 根据令牌使用情况计费。审查平均花费 \$15-25,随 PR 大小、代码库复杂性和需要验证的问题数量而扩展。Code Review 使用通过[额外使用](https://support.claude.com/en/articles/12429409-extra-usage-for-paid-claude-plans)单独计费,不计入您的计划包含的使用。

229 

230您选择的审查触发器影响总成本:

231 

232* **PR 创建后一次**:每个 PR 运行一次

233* **每次推送后**:在每次推送时运行,将成本乘以推送次数

234* **手动**:在有人在 PR 上注释 `@claude review` 之前没有审查

235 

236在任何模式下,注释 `@claude review` [选择 PR 进入推送触发审查](#manually-trigger-reviews),因此在该注释后每次推送都会产生额外成本。要运行单次审查而不订阅未来推送,请改为注释 `@claude review once`。

237 

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

239 

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

241 

242## 故障排除

243 

244审查运行是尽力而为的。失败的运行永远不会阻止您的 PR,但它也不会自动重试。本部分介绍如何从失败的运行中恢复,以及当检查运行报告您找不到的问题时在哪里查看。

245 

246### 重新触发失败或超时的审查

247 

248当审查基础设施遇到内部错误或超过时间限制时,检查运行完成,标题为 **Code review encountered an error** 或 **Code review timed out**。结论仍然是中立的,因此没有任何东西阻止您的合并,但没有发现被发布。

249 

250要再次运行审查,在 PR 上注释 `@claude review once`。这启动一个新的审查,不订阅 PR 到未来推送。如果 PR 已订阅推送触发审查,推送新提交也会启动新审查。

251 

252GitHub 检查选项卡中的**重新运行**按钮不会重新触发 Code Review。改用注释命令或新推送。

253 

254### 审查未运行,PR 显示支出上限消息

255 

256当您的组织的每月支出上限达到时,Code Review 在 PR 上发布单条评论,解释审查被跳过。审查在下一个计费周期开始时自动恢复,或当管理员在 [claude.ai/admin-settings/usage](https://claude.ai/admin-settings/usage) 提高上限时立即恢复。

257 

258### 查找未显示为内联评论的问题

259 

260如果检查运行标题说发现了问题但您在差异上看不到内联审查评论,请在这些其他位置查看发现的位置:

261 

262* **检查运行 Details**:在检查选项卡中的 Claude Code Review 检查旁边点击 **Details**。严重程度表列出每个发现及其文件、行和摘要,无论内联评论是否被接受。

263* **Files changed 注释**:在 PR 上打开 **Files changed** 选项卡。发现呈现为直接附加到差异行的注释,与审查评论分开。

264* **审查正文**:如果您在审查运行时推送到 PR,某些发现可能引用当前差异中不再存在的行。这些出现在审查正文文本中的 **Additional findings** 标题下,而不是作为内联评论。

265 

266## 相关资源

267 

268Code Review 旨在与 Claude Code 的其余部分一起工作。如果您想在打开 PR 之前在本地运行审查、需要自托管设置或想深入了解 `CLAUDE.md` 如何在工具中塑造 Claude 的行为,这些页面是很好的下一步:

269 

270* [Plugins](/zh-CN/discover-plugins):浏览插件市场,包括用于在推送前本地运行按需审查的 `code-review` 插件

271* [GitHub Actions](/zh-CN/github-actions):在您自己的 GitHub Actions 工作流中运行 Claude,以实现超越代码审查的自定义自动化

272* [GitLab CI/CD](/zh-CN/gitlab-ci-cd):GitLab 管道的自托管 Claude 集成

273* [Memory](/zh-CN/memory):`CLAUDE.md` 文件如何在 Claude Code 中工作

274* [Analytics](/zh-CN/analytics):跟踪超越代码审查的 Claude Code 使用情况

commands.md +113 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 命令

6 

7> Claude Code 中可用命令的完整参考,包括内置命令和捆绑的 skills。

8 

9命令在会话内控制 Claude Code。它们提供了一种快速的方式来切换模型、管理权限、清除上下文、运行工作流等。

10 

11输入 `/` 可以查看所有可用命令,或输入 `/` 后跟字母来筛选。

12 

13下表列出了 Claude Code 中包含的所有命令。标记为 **[Skill](/zh-CN/skills#bundled-skills)** 的条目是捆绑的 skills。它们使用与您自己编写的 skills 相同的机制:一个提示交给 Claude,Claude 也可以在相关时自动调用。其他所有内容都是内置命令,其行为被编码到 CLI 中。要添加您自己的命令,请参阅 [skills](/zh-CN/skills)。

14 

15并非每个命令都对每个用户显示。可用性取决于您的平台、计划和环境。例如,`/desktop` 仅在 macOS 和 Windows 上显示,`/upgrade` 仅在 Pro 和 Max 计划上显示。

16 

17在下表中,`<arg>` 表示必需的参数,`[arg]` 表示可选参数。

18 

19| 命令 | 用途 |

20| :---------------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

21| `/add-dir <path>` | 为当前会话期间的文件访问添加工作目录。大多数 `.claude/` 配置[不会从添加的目录中发现](/zh-CN/permissions#additional-directories-grant-file-access-not-configuration)。您可以稍后使用 `--continue` 或 `--resume` 从添加的目录恢复会话 |

22| `/agents` | 管理 [agent](/zh-CN/sub-agents) 配置 |

23| `/autofix-pr [prompt]` | 生成一个[网络版 Claude Code](/zh-CN/claude-code-on-the-web#auto-fix-pull-requests) 会话,监视当前分支的 PR,并在 CI 失败或审阅者留下评论时推送修复。使用 `gh pr view` 检测已检出分支的开放 PR;要监视不同的 PR,请先检出其分支。默认情况下,远程会话被告知修复每个 CI 失败和审阅评论;传递一个提示以给它不同的说明,例如 `/autofix-pr only fix lint and type errors`。需要 `gh` CLI 和访问[网络版 Claude Code](/zh-CN/claude-code-on-the-web#who-can-use-claude-code-on-the-web) |

24| `/batch <instruction>` | **[Skill](/zh-CN/skills#bundled-skills).** 在整个代码库中并行编排大规模更改。研究代码库,将工作分解为 5 到 30 个独立单元,并呈现一个计划。获得批准后,在隔离的 [git worktree](/zh-CN/common-workflows#run-parallel-claude-code-sessions-with-git-worktrees) 中为每个单元生成一个后台 agent。每个 agent 实现其单元、运行测试并打开一个 pull request。需要一个 git 存储库。示例:`/batch migrate src/ from Solid to React` |

25| `/branch [name]` | 在此点创建当前对话的分支。切换到分支并保留原始分支,您可以使用 `/resume` 返回。别名:`/fork`。当设置 [`CLAUDE_CODE_FORK_SUBAGENT`](/zh-CN/env-vars) 时,`/fork` 改为生成一个[分叉的 subagent](/zh-CN/sub-agents#fork-the-current-conversation),不再是此命令的别名 |

26| `/btw <question>` | 提出快速[附加问题](/zh-CN/interactive-mode#side-questions-with-%2Fbtw),无需添加到对话中 |

27| `/chrome` | 配置 [Claude in Chrome](/zh-CN/chrome) 设置 |

28| `/claude-api [migrate\|managed-agents-onboard]` | **[Skill](/zh-CN/skills#bundled-skills).** 为您的项目语言(Python、TypeScript、Java、Go、Ruby、C#、PHP 或 cURL)和 Managed Agents 参考加载 Claude API 参考资料。涵盖工具使用、流式传输、批处理、结构化输出和常见陷阱。当您的代码导入 `anthropic` 或 `@anthropic-ai/sdk` 时也会自动激活。运行 `/claude-api migrate` 以将现有 Claude API 代码升级到更新的模型:Claude 询问要扫描哪些文件以及要针对哪个模型,然后更新在版本之间更改的模型 ID、thinking 配置和其他参数。运行 `/claude-api managed-agents-onboard` 以获得交互式演练,从头开始创建新的 Managed Agent |

29| `/clear` | 使用空上下文启动新对话。之前的对话在 `/resume` 中保持可用。要在继续同一对话的同时释放上下文,请改用 `/compact`。别名:`/reset`、`/new` |

30| `/color [color\|default]` | 为当前会话设置提示栏颜色。可用颜色:`red`、`blue`、`green`、`yellow`、`purple`、`orange`、`pink`、`cyan`。使用 `default` 重置。当 [Remote Control](/zh-CN/remote-control) 连接时,颜色同步到 claude.ai/code |

31| `/compact [instructions]` | 通过总结到目前为止的对话来释放上下文。可选择性地传递焦点说明以进行总结。请参阅[压缩如何处理规则、skills 和内存文件](/zh-CN/context-window#what-survives-compaction) |

32| `/config` | 打开[设置](/zh-CN/settings)界面以调整主题、模型、[输出样式](/zh-CN/output-styles)和其他偏好设置。别名:`/settings` |

33| `/context` | 将当前上下文使用情况可视化为彩色网格。显示上下文密集型工具、内存膨胀和容量警告的优化建议 |

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

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

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

37| `/desktop` | 在 Claude Code Desktop 应用中继续当前会话。仅限 macOS 和 Windows。别名:`/app` |

38| `/diff` | 打开交互式差异查看器,显示未提交的更改和每轮差异。使用左/右箭头在当前 git 差异和单个 Claude 轮次之间切换,使用上/下浏览文件 |

39| `/doctor` | 诊断并验证您的 Claude Code 安装和设置。结果显示状态图标。按 `f` 让 Claude 修复任何报告的问题 |

40| `/effort [level\|auto]` | 设置模型[工作量级别](/zh-CN/model-config#adjust-effort-level)。接受 `low`、`medium`、`high`、`xhigh` 或 `max`;可用级别取决于模型,`max` 仅限会话。`auto` 重置为模型默认值。不带参数时,打开交互式滑块;使用左右箭头选择级别,按 `Enter` 应用。立即生效,无需等待当前响应完成 |

41| `/exit` | 退出 CLI。别名:`/quit` |

42| `/export [filename]` | 将当前对话导出为纯文本。使用文件名时,直接写入该文件。不使用文件名时,打开对话框以复制到剪贴板或保存到文件 |

43| `/extra-usage` | 配置额外使用量以在达到速率限制时继续工作 |

44| `/fast [on\|off]` | 切换[快速模式](/zh-CN/fast-mode)开启或关闭 |

45| `/feedback [report]` | 提交关于 Claude Code 的反馈。别名:`/bug` |

46| `/fewer-permission-prompts` | **[Skill](/zh-CN/skills#bundled-skills).** 扫描您的记录以查找常见的只读 Bash 和 MCP 工具调用,然后向项目 `.claude/settings.json` 添加优先级允许列表以减少权限提示 |

47| `/focus` | 切换焦点视图,仅显示您的最后一个提示、带有编辑 diffstats 的单行工具调用摘要和最终响应。选择在会话间保持。仅在[全屏渲染](/zh-CN/fullscreen)中可用 |

48| `/heapdump` | 将 JavaScript 堆快照和内存分解写入 `~/Desktop`,或在 Linux 上没有 Desktop 文件夹的情况下写入您的主目录,以诊断高内存使用情况。请参阅[故障排除](/zh-CN/troubleshooting#high-cpu-or-memory-usage) |

49| `/help` | 显示帮助和可用命令 |

50| `/hooks` | 查看工具事件的 [hook](/zh-CN/hooks) 配置 |

51| `/ide` | 管理 IDE 集成并显示状态 |

52| `/init` | 使用 `CLAUDE.md` 指南初始化项目。设置 `CLAUDE_CODE_NEW_INIT=1` 以获得交互式流程,该流程还会引导您完成 skills、hooks 和个人内存文件 |

53| `/insights` | 生成报告,分析您的 Claude Code 会话,包括项目领域、交互模式和摩擦点 |

54| `/install-github-app` | 为存储库设置 [Claude GitHub Actions](/zh-CN/github-actions) 应用。引导您选择存储库并配置集成 |

55| `/install-slack-app` | 安装 Claude Slack 应用。打开浏览器以完成 OAuth 流程 |

56| `/keybindings` | 打开或创建您的快捷键配置文件 |

57| `/login` | 登录到您的 Anthropic 账户 |

58| `/logout` | 从您的 Anthropic 账户登出 |

59| `/loop [interval] [prompt]` | **[Skill](/zh-CN/skills#bundled-skills).** 在会话保持打开状态时重复运行提示。省略间隔,Claude 会在迭代之间自动调整步速。省略提示,Claude 运行自主维护检查,或运行 `.claude/loop.md` 中的提示(如果存在)。示例:`/loop 5m check if the deploy finished`。请参阅[按计划运行提示](/zh-CN/scheduled-tasks)。别名:`/proactive` |

60| `/mcp` | 管理 MCP server 连接和 OAuth 身份验证 |

61| `/memory` | 编辑 `CLAUDE.md` 内存文件,启用或禁用 [auto-memory](/zh-CN/memory#auto-memory),并查看自动内存条目 |

62| `/mobile` | 显示二维码以下载 Claude 移动应用。别名:`/ios`、`/android` |

63| `/model [model]` | 选择或更改 AI 模型。对于支持的模型,使用左/右箭头[调整工作量级别](/zh-CN/model-config#adjust-effort-level)。不带参数时,打开一个选择器,当对话有先前输出时要求确认,因为下一个响应会重新读取完整历史记录而不使用缓存的上下文。确认后,更改立即生效,无需等待当前响应完成 |

64| `/passes` | 与朋友分享一周免费的 Claude Code。仅在您的账户符合条件时可见 |

65| `/permissions` | 管理工具权限的允许、询问和拒绝规则。打开交互式对话框,您可以按范围查看规则、添加或删除规则、管理工作目录,以及查看[最近的自动模式拒绝](/zh-CN/auto-mode-config#review-denials)。别名:`/allowed-tools` |

66| `/plan [description]` | 直接从提示进入 Plan Mode。传递可选描述以进入 Plan Mode 并立即开始该任务,例如 `/plan fix the auth bug` |

67| `/plugin` | 管理 Claude Code [plugins](/zh-CN/plugins) |

68| `/powerup` | 通过带有动画演示的快速交互式课程发现 Claude Code 功能 |

69| `/pr-comments [PR]` | {/* max-version: 2.1.90 */}在 v2.1.91 中移除。改为直接询问 Claude 以查看 pull request 评论。在早期版本中,从 GitHub pull request 获取并显示评论;自动检测当前分支的 PR,或传递 PR URL 或编号。需要 `gh` CLI |

70| `/privacy-settings` | 查看和更新您的隐私设置。仅对 Pro 和 Max 计划订阅者可用 |

71| `/recap` | 按需生成当前会话的单行摘要。请参阅[会话摘要](/zh-CN/interactive-mode#session-recap)以了解您离开后出现的自动摘要 |

72| `/release-notes` | 在交互式版本选择器中查看更改日志。选择特定版本以查看其发布说明,或选择显示所有版本 |

73| `/reload-plugins` | 重新加载所有活跃 [plugins](/zh-CN/plugins) 以应用待处理的更改,无需重启。报告每个已重新加载组件的计数并标记任何加载错误 |

74| `/remote-control` | 使此会话可从 claude.ai 进行[远程控制](/zh-CN/remote-control)。别名:`/rc` |

75| `/remote-env` | 为[使用 `--remote` 启动的网络会话](/zh-CN/claude-code-on-the-web#configure-your-environment)配置默认远程环境 |

76| `/rename [name]` | 重命名当前会话并在提示栏上显示名称。不使用名称时,从对话历史记录自动生成一个 |

77| `/resume [session]` | 按 ID 或名称恢复对话,或打开会话选择器。别名:`/continue` |

78| `/review [PR]` | 在当前会话中本地审阅 pull request。要进行更深入的基于云的审阅,请参阅 [`/ultrareview`](/zh-CN/ultrareview) |

79| `/rewind` | 将对话和/或代码倒回到上一个点,或从选定的消息进行总结。请参阅 [checkpointing](/zh-CN/checkpointing)。别名:`/checkpoint`、`/undo` |

80| `/sandbox` | 切换 [sandbox mode](/zh-CN/sandboxing)。仅在支持的平台上可用 |

81| `/schedule [description]` | 创建、更新、列出或运行 [routines](/zh-CN/routines)。Claude 会以对话方式引导您完成设置。别名:`/routines` |

82| `/security-review` | 分析当前分支上的待处理更改以查找安全漏洞。审查 git 差异并识别注入、身份验证问题和数据泄露等风险 |

83| `/setup-bedrock` | 通过交互式向导配置 [Amazon Bedrock](/zh-CN/amazon-bedrock) 身份验证、区域和模型固定。仅在设置 `CLAUDE_CODE_USE_BEDROCK=1` 时可见。首次 Bedrock 用户也可以从登录屏幕访问此向导 |

84| `/setup-vertex` | 通过交互式向导配置 [Google Vertex AI](/zh-CN/google-vertex-ai) 身份验证、项目、区域和模型固定。仅在设置 `CLAUDE_CODE_USE_VERTEX=1` 时可见。首次 Vertex AI 用户也可以从登录屏幕访问此向导 |

85| `/simplify [focus]` | **[Skill](/zh-CN/skills#bundled-skills).** 审阅您最近更改的文件以查找代码重用、质量和效率问题,然后修复它们。并行生成三个审阅 agent,聚合其发现,并应用修复。传递文本以集中关注特定问题:`/simplify focus on memory efficiency` |

86| `/skills` | 列出可用的 [skills](/zh-CN/skills)。按 `t` 按令牌计数排序 |

87| `/stats` | `/usage` 的别名。在统计选项卡上打开 |

88| `/status` | 打开设置界面(状态选项卡),显示版本、模型、账户和连接性。在 Claude 响应时工作,无需等待当前响应完成 |

89| `/statusline` | 配置 Claude Code 的[状态行](/zh-CN/statusline)。描述您想要的内容,或不带参数运行以从您的 shell 提示自动配置 |

90| `/stickers` | 订购 Claude Code 贴纸 |

91| `/tasks` | 列出并管理后台任务。也可用作 `/bashes` |

92| `/team-onboarding` | 从您的 Claude Code 使用历史记录生成团队入职指南。Claude 分析您过去 30 天的会话、命令和 MCP server 使用情况,并生成一个 markdown 指南,团队成员可以粘贴为第一条消息以快速设置 |

93| `/teleport` | 将[网络版 Claude Code](/zh-CN/claude-code-on-the-web#from-web-to-terminal) 会话拉入此终端:打开选择器,然后获取分支和对话。也可用作 `/tp`。需要 claude.ai 订阅 |

94| `/terminal-setup` | 为 Shift+Enter 和其他快捷键配置终端快捷键。仅在需要它的终端中可见,如 VS Code、Cursor、Windsurf、Alacritty 或 Zed |

95| `/theme` | 更改颜色主题。包括跟随您终端深色或浅色背景的 `auto` 选项、浅色和深色变体、色盲友好(道尔顿化)主题、使用您终端颜色调色板的 ANSI 主题,以及来自 `~/.claude/themes/` 或 plugins 的任何[自定义主题](/zh-CN/terminal-config#create-a-custom-theme)。选择\*\*新建自定义主题…\*\*以创建一个 |

96| `/tui [default\|fullscreen]` | 设置终端 UI 渲染器并使用您的对话完整性重新启动到它。`fullscreen` 启用[无闪烁 alt-screen 渲染器](/zh-CN/fullscreen)。不带参数时,打印活跃渲染器 |

97| `/ultraplan <prompt>` | 在 [ultraplan](/zh-CN/ultraplan) 会话中起草计划,在浏览器中审阅,然后远程执行或将其发送回您的终端 |

98| `/ultrareview [PR]` | 在云沙箱中运行深度、多 agent 代码审阅,使用 [ultrareview](/zh-CN/ultrareview)。Pro 和 Max 包括 3 次免费运行,截至 2026 年 5 月 5 日,然后需要[额外使用](https://support.claude.com/en/articles/12429409-extra-usage-for-paid-claude-plans) |

99| `/upgrade` | 打开升级页面以切换到更高的计划层级 |

100| `/usage` | 显示会话成本、计划使用限制和活动统计。有关订阅特定的详细信息,请参阅[成本跟踪指南](/zh-CN/costs#using-the-%2Fusage-command)。`/cost` 和 `/stats` 是别名 |

101| `/vim` | {/* max-version: 2.1.91 */}在 v2.1.92 中移除。要在 Vim 和普通编辑模式之间切换,请使用 `/config` → 编辑器模式 |

102| `/voice [hold\|tap\|off]` | 切换[语音听写](/zh-CN/voice-dictation),或在特定模式下启用它。需要 Claude.ai 账户 |

103| `/web-setup` | 使用您的本地 `gh` CLI 凭证将您的 GitHub 账户连接到[网络版 Claude Code](/zh-CN/web-quickstart#connect-from-your-terminal)。如果 GitHub 未连接,`/schedule` 会自动提示此操作 |

104 

105## MCP prompts

106 

107MCP servers 可以公开显示为命令的 prompts。这些使用格式 `/mcp__<server>__<prompt>`,并从连接的服务器动态发现。有关详细信息,请参阅 [MCP prompts](/zh-CN/mcp#use-mcp-prompts-as-commands)。

108 

109## 另请参阅

110 

111* [Skills](/zh-CN/skills):创建您自己的命令

112* [Interactive mode](/zh-CN/interactive-mode):快捷键、Vim 模式和命令历史记录

113* [CLI reference](/zh-CN/cli-reference):启动时标志

common-workflows.md +1030 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 常见工作流程

6 

7> 使用 Claude Code 探索代码库、修复错误、重构、测试和其他日常任务的分步指南。

8 

9本页涵盖日常开发的实用工作流程:探索陌生代码、调试、重构、编写测试、创建 PR 和管理会话。每个部分都包含示例提示,您可以根据自己的项目进行调整。有关更高级的模式和提示,请参阅[最佳实践](/zh-CN/best-practices)。

10 

11## 理解新的代码库

12 

13### 快速获取代码库概览

14 

15假设您刚加入一个新项目,需要快速了解其结构。

16 

17<Steps>

18 <Step title="导航到项目根目录">

19 ```bash theme={null}

20 cd /path/to/project

21 ```

22 </Step>

23 

24 <Step title="启动 Claude Code">

25 ```bash theme={null}

26 claude

27 ```

28 </Step>

29 

30 <Step title="请求高级概览">

31 ```text theme={null}

32 give me an overview of this codebase

33 ```

34 </Step>

35 

36 <Step title="深入了解特定组件">

37 ```text theme={null}

38 explain the main architecture patterns used here

39 ```

40 

41 ```text theme={null}

42 what are the key data models?

43 ```

44 

45 ```text theme={null}

46 how is authentication handled?

47 ```

48 </Step>

49</Steps>

50 

51<Tip>

52 提示:

53 

54 * 从广泛的问题开始,然后缩小到特定领域

55 * 询问项目中使用的编码约定和模式

56 * 请求项目特定术语的词汇表

57</Tip>

58 

59### 查找相关代码

60 

61假设您需要定位与特定功能相关的代码。

62 

63<Steps>

64 <Step title="要求 Claude 查找相关文件">

65 ```text theme={null}

66 find the files that handle user authentication

67 ```

68 </Step>

69 

70 <Step title="获取有关组件如何交互的上下文">

71 ```text theme={null}

72 how do these authentication files work together?

73 ```

74 </Step>

75 

76 <Step title="理解执行流程">

77 ```text theme={null}

78 trace the login process from front-end to database

79 ```

80 </Step>

81</Steps>

82 

83<Tip>

84 提示:

85 

86 * 明确说明您要查找的内容

87 * 使用项目中的领域语言

88 * 为您的语言安装[代码智能插件](/zh-CN/discover-plugins#code-intelligence),以便 Claude 能够精确地进行"转到定义"和"查找引用"导航

89</Tip>

90 

91***

92 

93## 高效修复错误

94 

95假设您遇到了错误消息,需要找到并修复其来源。

96 

97<Steps>

98 <Step title="与 Claude 分享错误">

99 ```text theme={null}

100 I'm seeing an error when I run npm test

101 ```

102 </Step>

103 

104 <Step title="请求修复建议">

105 ```text theme={null}

106 suggest a few ways to fix the @ts-ignore in user.ts

107 ```

108 </Step>

109 

110 <Step title="应用修复">

111 ```text theme={null}

112 update user.ts to add the null check you suggested

113 ```

114 </Step>

115</Steps>

116 

117<Tip>

118 提示:

119 

120 * 告诉 Claude 重现问题的命令并获取堆栈跟踪

121 * 提及重现错误的任何步骤

122 * 让 Claude 知道错误是间歇性的还是持续的

123</Tip>

124 

125***

126 

127## 重构代码

128 

129假设您需要更新旧代码以使用现代模式和实践。

130 

131<Steps>

132 <Step title="识别用于重构的遗留代码">

133 ```text theme={null}

134 find deprecated API usage in our codebase

135 ```

136 </Step>

137 

138 <Step title="获取重构建议">

139 ```text theme={null}

140 suggest how to refactor utils.js to use modern JavaScript features

141 ```

142 </Step>

143 

144 <Step title="安全地应用更改">

145 ```text theme={null}

146 refactor utils.js to use ES2024 features while maintaining the same behavior

147 ```

148 </Step>

149 

150 <Step title="验证重构">

151 ```text theme={null}

152 run tests for the refactored code

153 ```

154 </Step>

155</Steps>

156 

157<Tip>

158 提示:

159 

160 * 要求 Claude 解释现代方法的优势

161 * 在需要时请求更改保持向后兼容性

162 * 以小的、可测试的增量进行重构

163</Tip>

164 

165***

166 

167## 使用专门的 subagents

168 

169假设您想使用专门的 AI subagents 来更有效地处理特定任务。

170 

171<Steps>

172 <Step title="查看可用的 subagents">

173 ```text theme={null}

174 /agents

175 ```

176 

177 这显示所有可用的 subagents 并让您创建新的。

178 </Step>

179 

180 <Step title="自动使用 subagents">

181 Claude Code 自动将适当的任务委派给专门的 subagents:

182 

183 ```text theme={null}

184 review my recent code changes for security issues

185 ```

186 

187 ```text theme={null}

188 run all tests and fix any failures

189 ```

190 </Step>

191 

192 <Step title="明确请求特定的 subagents">

193 ```text theme={null}

194 use the code-reviewer subagent to check the auth module

195 ```

196 

197 ```text theme={null}

198 have the debugger subagent investigate why users can't log in

199 ```

200 </Step>

201 

202 <Step title="为您的工作流程创建自定义 subagents">

203 ```text theme={null}

204 /agents

205 ```

206 

207 然后选择"Create New subagent"并按照提示定义:

208 

209 * 描述 subagent 目的的唯一标识符(例如,`code-reviewer`、`api-designer`)。

210 * Claude 何时应该使用此代理

211 * 它可以访问哪些工具

212 * 描述代理角色和行为的系统提示

213 </Step>

214</Steps>

215 

216<Tip>

217 提示:

218 

219 * 在 `.claude/agents/` 中创建项目特定的 subagents 以供团队共享

220 * 使用描述性的 `description` 字段来启用自动委派

221 * 限制工具访问权限为每个 subagent 实际需要的内容

222 * 查看[subagents 文档](/zh-CN/sub-agents)了解详细示例

223</Tip>

224 

225***

226 

227## 使用 Plan Mode 进行安全的代码分析

228 

229Plan Mode 指示 Claude 通过使用只读操作分析代码库来创建计划,非常适合探索代码库、规划复杂更改或安全地审查代码。在 Plan Mode 中,Claude 使用 [`AskUserQuestion`](/zh-CN/tools-reference) 在提出计划之前收集需求并澄清您的目标。

230 

231### 何时使用 Plan Mode

232 

233* **多步骤实现**:当您的功能需要对许多文件进行编辑时

234* **代码探索**:当您想在更改任何内容之前彻底研究代码库时

235* **交互式开发**:当您想与 Claude 迭代方向时

236 

237### 如何使用 Plan Mode

238 

239**在会话期间打开 Plan Mode**

240 

241您可以在会话期间使用 **Shift+Tab** 循环切换权限模式来切换到 Plan Mode。

242 

243如果您处于 Normal Mode,**Shift+Tab** 首先切换到 Auto-Accept Mode,在终端底部显示 `⏵⏵ accept edits on`。随后的 **Shift+Tab** 将切换到 Plan Mode,显示 `⏸ plan mode on`。

244 

245**在 Plan Mode 中启动新会话**

246 

247要在 Plan Mode 中启动新会话,请使用 `--permission-mode plan` 标志:

248 

249```bash theme={null}

250claude --permission-mode plan

251```

252 

253**在 Plan Mode 中运行"无头"查询**

254 

255您也可以使用 `-p` 直接在 Plan Mode 中运行查询(即在["无头模式"](/zh-CN/headless)中):

256 

257```bash theme={null}

258claude --permission-mode plan -p "Analyze the authentication system and suggest improvements"

259```

260 

261### 示例:规划复杂的重构

262 

263```bash theme={null}

264claude --permission-mode plan

265```

266 

267```text theme={null}

268I need to refactor our authentication system to use OAuth2. Create a detailed migration plan.

269```

270 

271Claude 分析当前实现并创建全面的计划。通过后续问题进行细化:

272 

273```text theme={null}

274What about backward compatibility?

275```

276 

277```text theme={null}

278How should we handle database migration?

279```

280 

281<Tip>按 `Ctrl+G` 在默认文本编辑器中打开计划,您可以在 Claude 继续之前直接编辑它。</Tip>

282 

283当您接受计划时,Claude 会自动从计划内容为会话命名。该名称显示在提示栏和会话选择器中。如果您已经使用 `--name` 或 `/rename` 设置了名称,接受计划不会覆盖它。

284 

285### 将 Plan Mode 配置为默认值

286 

287```json theme={null}

288// .claude/settings.json

289{

290 "permissions": {

291 "defaultMode": "plan"

292 }

293}

294```

295 

296有关更多配置选项,请参阅[设置文档](/zh-CN/settings#available-settings)。

297 

298***

299 

300## 使用测试

301 

302假设您需要为未覆盖的代码添加测试。

303 

304<Steps>

305 <Step title="识别未测试的代码">

306 ```text theme={null}

307 find functions in NotificationsService.swift that are not covered by tests

308 ```

309 </Step>

310 

311 <Step title="生成测试脚手架">

312 ```text theme={null}

313 add tests for the notification service

314 ```

315 </Step>

316 

317 <Step title="添加有意义的测试用例">

318 ```text theme={null}

319 add test cases for edge conditions in the notification service

320 ```

321 </Step>

322 

323 <Step title="运行并验证测试">

324 ```text theme={null}

325 run the new tests and fix any failures

326 ```

327 </Step>

328</Steps>

329 

330Claude 可以生成遵循您项目现有模式和约定的测试。请求测试时,请明确说明您想验证的行为。Claude 检查您现有的测试文件以匹配已在使用的样式、框架和断言模式。

331 

332为了获得全面的覆盖,要求 Claude 识别您可能遗漏的边界情况。Claude 可以分析您的代码路径并建议测试错误条件、边界值和容易被忽视的意外输入。

333 

334***

335 

336## 创建拉取请求

337 

338您可以通过直接要求 Claude 创建拉取请求("create a pr for my changes"),或逐步指导 Claude:

339 

340<Steps>

341 <Step title="总结您的更改">

342 ```text theme={null}

343 summarize the changes I've made to the authentication module

344 ```

345 </Step>

346 

347 <Step title="生成拉取请求">

348 ```text theme={null}

349 create a pr

350 ```

351 </Step>

352 

353 <Step title="审查和细化">

354 ```text theme={null}

355 enhance the PR description with more context about the security improvements

356 ```

357 </Step>

358</Steps>

359 

360当您使用 `gh pr create` 创建 PR 时,会话会自动链接到该 PR。您可以稍后使用 `claude --from-pr <number>` 恢复它。

361 

362<Tip>

363 在提交前审查 Claude 生成的 PR,并要求 Claude 突出显示潜在的风险或注意事项。

364</Tip>

365 

366## 处理文档

367 

368假设您需要为代码添加或更新文档。

369 

370<Steps>

371 <Step title="识别未记录的代码">

372 ```text theme={null}

373 find functions without proper JSDoc comments in the auth module

374 ```

375 </Step>

376 

377 <Step title="生成文档">

378 ```text theme={null}

379 add JSDoc comments to the undocumented functions in auth.js

380 ```

381 </Step>

382 

383 <Step title="审查和增强">

384 ```text theme={null}

385 improve the generated documentation with more context and examples

386 ```

387 </Step>

388 

389 <Step title="验证文档">

390 ```text theme={null}

391 check if the documentation follows our project standards

392 ```

393 </Step>

394</Steps>

395 

396<Tip>

397 提示:

398 

399 * 指定您想要的文档样式(JSDoc、docstrings 等)

400 * 请求文档中的示例

401 * 请求公共 API、接口和复杂逻辑的文档

402</Tip>

403 

404***

405 

406## 在笔记和非代码文件夹中工作

407 

408Claude Code 可以在任何目录中工作。在笔记库、文档文件夹或任何 markdown 文件集合中运行它,以搜索、编辑和重新组织内容,就像处理代码一样。

409 

410`.claude/` 目录和 `CLAUDE.md` 与其他工具的配置目录并排存在,不会产生冲突。Claude 在每次工具调用时都会重新读取文件,因此它会在下次读取该文件时看到您在另一个应用程序中所做的编辑。

411 

412***

413 

414## 使用图像

415 

416假设您需要在代码库中使用图像,并希望 Claude 帮助分析图像内容。

417 

418<Steps>

419 <Step title="将图像添加到对话中">

420 您可以使用以下任何方法:

421 

422 1. 将图像拖放到 Claude Code 窗口中

423 2. 复制图像并使用 ctrl+v 将其粘贴到 CLI 中(不要使用 cmd+v)

424 3. 向 Claude 提供图像路径。例如,"Analyze this image: /path/to/your/image.png"

425 </Step>

426 

427 <Step title="要求 Claude 分析图像">

428 ```text theme={null}

429 What does this image show?

430 ```

431 

432 ```text theme={null}

433 Describe the UI elements in this screenshot

434 ```

435 

436 ```text theme={null}

437 Are there any problematic elements in this diagram?

438 ```

439 </Step>

440 

441 <Step title="使用图像获取上下文">

442 ```text theme={null}

443 Here's a screenshot of the error. What's causing it?

444 ```

445 

446 ```text theme={null}

447 This is our current database schema. How should we modify it for the new feature?

448 ```

449 </Step>

450 

451 <Step title="从视觉内容获取代码建议">

452 ```text theme={null}

453 Generate CSS to match this design mockup

454 ```

455 

456 ```text theme={null}

457 What HTML structure would recreate this component?

458 ```

459 </Step>

460</Steps>

461 

462<Tip>

463 提示:

464 

465 * 当文本描述不清楚或繁琐时使用图像

466 * 包含错误、UI 设计或图表的屏幕截图以获得更好的上下文

467 * 您可以在对话中使用多个图像

468 * 图像分析适用于图表、屏幕截图、模型等

469 * 当 Claude 引用图像时(例如,`[Image #1]`),`Cmd+Click`(Mac)或 `Ctrl+Click`(Windows/Linux)链接以在默认查看器中打开图像

470</Tip>

471 

472***

473 

474## 引用文件和目录

475 

476使用 @ 快速包含文件或目录,无需等待 Claude 读取它们。

477 

478<Steps>

479 <Step title="引用单个文件">

480 ```text theme={null}

481 Explain the logic in @src/utils/auth.js

482 ```

483 

484 这在对话中包含文件的完整内容。

485 </Step>

486 

487 <Step title="引用目录">

488 ```text theme={null}

489 What's the structure of @src/components?

490 ```

491 

492 这提供了带有文件信息的目录列表。

493 </Step>

494 

495 <Step title="引用 MCP 资源">

496 ```text theme={null}

497 Show me the data from @github:repos/owner/repo/issues

498 ```

499 

500 这使用 @server:resource 格式从连接的 MCP 服务器获取数据。有关详细信息,请参阅 [MCP 资源](/zh-CN/mcp#use-mcp-resources)。

501 </Step>

502</Steps>

503 

504<Tip>

505 提示:

506 

507 * 文件路径可以是相对的或绝对的

508 * @ 文件引用在文件的目录和父目录中添加 `CLAUDE.md` 到上下文

509 * 目录引用显示文件列表,而不是内容

510 * 您可以在单个消息中引用多个文件(例如,"@file1.js and @file2.js")

511</Tip>

512 

513***

514 

515## 使用扩展思考(Thinking Mode)

516 

517[扩展思考](https://platform.claude.com/docs/en/build-with-claude/extended-thinking)默认启用,为 Claude 提供空间在响应前逐步推理复杂问题。此推理在详细模式中可见,您可以使用 `Ctrl+O` 切换。在扩展思考期间,进度提示会出现在指示器下方,显示 Claude 正在积极工作。

518 

519此外,[支持努力级别的模型](/zh-CN/model-config#adjust-effort-level)使用自适应推理:不是固定的思考令牌预算,而是模型根据您的努力级别设置和手头的任务动态决定是否以及如何思考。自适应推理让 Claude 能够更快地响应常规提示,并为受益于深度思考的步骤保留更深层的思考。

520 

521扩展思考对于复杂的架构决策、具有挑战性的错误、多步骤实现规划和评估不同方法之间的权衡特别有价值。

522 

523<Note>

524 "think"、"think hard" 和 "think more" 等短语被解释为常规提示指令,不分配思考令牌。

525</Note>

526 

527### 配置 Thinking Mode

528 

529思考默认启用,但您可以调整或禁用它。

530 

531| 范围 | 如何配置 | 详细信息 |

532| -------------------- | ----------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- |

533| **努力级别** | 运行 `/effort`,在 `/model` 中调整,或设置 [`CLAUDE_CODE_EFFORT_LEVEL`](/zh-CN/env-vars) | 控制[支持的模型](/zh-CN/model-config#adjust-effort-level)上的思考深度 |

534| **`ultrathink` 关键字** | 在提示中的任何地方包含 "ultrathink" | 添加上下文内指令,告诉模型在该轮进行更多推理。不改变努力级别本身;有关详细信息,请参阅[调整努力级别](/zh-CN/model-config#adjust-effort-level) |

535| **切换快捷键** | 按 `Option+T`(macOS)或 `Alt+T`(Windows/Linux) | 为当前会话切换思考开/关(所有模型)。可能需要[终端配置](/zh-CN/terminal-config)来启用 Option 键快捷键 |

536| **全局默认值** | 使用 `/config` 切换 Thinking Mode | 在所有项目中设置默认值(所有模型)。<br />保存为 `~/.claude/settings.json` 中的 `alwaysThinkingEnabled` |

537| **限制令牌预算** | 设置 [`MAX_THINKING_TOKENS`](/zh-CN/env-vars) 环境变量 | 将思考预算限制为特定数量的令牌。在具有自适应推理的模型上,仅当设置为 `0` 时才适用,除非禁用自适应推理。示例:`export MAX_THINKING_TOKENS=10000` |

538 

539要查看 Claude 的思考过程,按 `Ctrl+O` 切换详细模式,并查看显示为灰色斜体文本的内部推理。

540 

541### 扩展思考如何工作

542 

543扩展思考控制 Claude 在响应前执行多少内部推理。更多思考提供更多空间来探索解决方案、分析边界情况和自我纠正错误。

544 

545在[支持努力级别的模型](/zh-CN/model-config#adjust-effort-level)上,思考使用自适应推理:模型根据您选择的努力级别动态分配思考令牌。这是调整速度和推理深度之间权衡的推荐方式。如果您希望 Claude 比您的努力级别通常会产生的更多或更少地思考,您也可以直接在提示中或在 `CLAUDE.md` 中说明。

546 

547对于较旧的模型,思考使用从您的输出分配中提取的固定令牌预算。预算因模型而异;有关详细信息,请参阅 [`MAX_THINKING_TOKENS`](/zh-CN/env-vars)。您可以使用该环境变量限制预算,或通过 `/config` 或 `Option+T`/`Alt+T` 切换完全禁用思考。

548 

549在具有自适应推理的模型上,`MAX_THINKING_TOKENS` 仅在设置为 `0` 以禁用思考时适用,或当 `CLAUDE_CODE_DISABLE_ADAPTIVE_THINKING=1` 将模型恢复为固定预算时。`CLAUDE_CODE_DISABLE_ADAPTIVE_THINKING` 仅适用于 Opus 4.6 和 Sonnet 4.6。Opus 4.7 始终使用自适应推理,不支持固定思考预算。请参阅[环境变量](/zh-CN/env-vars)。

550 

551<Warning>

552 您需要为所有使用的思考令牌付费,即使思考摘要被编辑。在交互模式中,思考默认显示为折叠的存根。在 `settings.json` 中设置 `showThinkingSummaries: true` 以显示完整摘要。

553</Warning>

554 

555***

556 

557## 恢复以前的对话

558 

559启动 Claude Code 时,您可以恢复以前的会话:

560 

561* `claude --continue` 继续当前目录中最近的对话

562* `claude --resume` 打开对话选择器或按名称恢复

563* `claude --from-pr 123` 恢复链接到特定拉取请求的会话

564 

565从活跃会话内,使用 `/resume` 切换到不同的对话。

566 

567当选定的会话足够旧且足够大,以至于重新阅读它会消耗您使用限额的大部分时,`--resume`、`--continue` 和 `/resume` 会提供从摘要恢复而不是加载完整记录的选项。此提示在 Amazon Bedrock、Google Cloud Vertex AI 或 Microsoft Foundry 上不可用。

568 

569会话按项目目录存储。默认情况下,`/resume` 选择器显示来自当前 worktree 的交互式会话,带有键盘快捷键来扩展列表到其他 worktrees 或项目、搜索、预览和重命名。有关完整的快捷键参考,请参阅下面的[使用会话选择器](#use-the-session-picker)。

570 

571当您从同一存储库的另一个 worktree 选择会话时,Claude Code 直接恢复它,无需您首先切换目录。从不相关项目选择会话会将 `cd` 和恢复命令复制到您的剪贴板。

572 

573按名称恢复在当前存储库及其 worktrees 中解析。`claude --resume <name>` 和 `/resume <name>` 都查找精确匹配并直接恢复它,即使会话位于不同的 worktree 中。

574 

575当名称不明确时,`claude --resume <name>` 打开选择器,名称预填充为搜索词。`/resume <name>` 从活跃会话内报告错误,因此运行 `/resume` 不带参数来打开选择器并选择。

576 

577由 `claude -p` 或 SDK 调用创建的会话不会出现在选择器中,但您仍然可以通过将其会话 ID 直接传递给 `claude --resume <session-id>` 来恢复它。

578 

579### 命名您的会话

580 

581给会话起描述性名称以便稍后找到它们。这是在处理多个任务或功能时的最佳实践。

582 

583<Steps>

584 <Step title="命名会话">

585 在启动时使用 `-n` 命名会话:

586 

587 ```bash theme={null}

588 claude -n auth-refactor

589 ```

590 

591 或在会话期间使用 `/rename`,这也会在提示栏上显示名称:

592 

593 ```text theme={null}

594 /rename auth-refactor

595 ```

596 

597 您也可以从选择器重命名任何会话:运行 `/resume`,导航到会话,然后按 `Ctrl+R`。

598 </Step>

599 

600 <Step title="稍后按名称恢复">

601 从命令行:

602 

603 ```bash theme={null}

604 claude --resume auth-refactor

605 ```

606 

607 或从活跃会话内:

608 

609 ```text theme={null}

610 /resume auth-refactor

611 ```

612 </Step>

613</Steps>

614 

615### 使用会话选择器

616 

617`/resume` 命令(或 `claude --resume` 不带参数)打开具有以下功能的交互式会话选择器:

618 

619**选择器中的键盘快捷键:**

620 

621| 快捷键 | 操作 |

622| :------------------------ | :------------------------------------------------------------- |

623| `↑` / `↓` | 在会话之间导航 |

624| `→` / `←` | 展开或折叠分组的会话 |

625| `Enter` | 选择并恢复突出显示的会话 |

626| `Space` | 预览会话内容。`Ctrl+V` 也适用于不将其捕获为粘贴的终端 |

627| `Ctrl+R` | 重命名突出显示的会话 |

628| `/` 或任何可打印字符(除 `Space` 外) | 进入搜索模式并过滤会话 |

629| `Ctrl+A` | 显示此机器上所有项目的会话。再次按下以恢复当前存储库 |

630| `Ctrl+W` | 显示当前存储库所有 worktrees 的会话。再次按下以恢复当前 worktree。仅在多 worktree 存储库中显示 |

631| `Ctrl+B` | 过滤到来自当前 git 分支的会话。再次按下以显示所有分支的会话 |

632| `Esc` | 退出选择器或搜索模式 |

633 

634**会话组织:**

635 

636选择器显示带有有用元数据的会话:

637 

638* 会话名称(如果设置),否则对话摘要或第一个用户提示

639* 自上次活动以来经过的时间

640* 消息计数

641* Git 分支(如果适用)

642* 项目路径,在使用 `Ctrl+A` 扩展到所有项目后显示

643 

644分叉的会话(使用 `/branch`、`/rewind` 或 `--fork-session` 创建)在其根会话下分组,使查找相关对话更容易。

645 

646<Tip>

647 提示:

648 

649 * **尽早命名会话**:在开始处理不同任务时使用 `/rename`——稍后找到"payment-integration"比"explain this function"容易得多

650 * 使用 `--continue` 快速访问当前目录中最近的对话

651 * 当您知道需要哪个会话时使用 `--resume session-name`

652 * 当您需要浏览和选择时使用 `--resume`(不带名称)

653 * 对于脚本,使用 `claude --continue --print "prompt"` 以非交互模式恢复

654 * 在选择器中按 `Space` 在恢复前预览会话

655 * 恢复的对话以与原始对话相同的模型和配置开始

656 

657 工作原理:

658 

659 1. **对话存储**:所有对话都自动保存在本地,包含完整的消息历史

660 2. **消息反序列化**:恢复时,整个消息历史被恢复以保持上下文

661 3. **工具状态**:来自以前对话的工具使用和结果被保留

662 4. **上下文恢复**:对话以所有以前的上下文完整恢复

663</Tip>

664 

665***

666 

667## 使用 Git worktrees 运行并行 Claude Code 会话

668 

669当同时处理多个任务时,您需要每个 Claude 会话都有自己的代码库副本,以便更改不会冲突。Git worktrees 通过创建单独的工作目录来解决这个问题,每个目录都有自己的文件和分支,同时共享相同的存储库历史和远程连接。这意味着您可以让 Claude 在一个 worktree 中处理功能,同时在另一个 worktree 中修复错误,而不会相互干扰。

670 

671使用 `--worktree`(`-w`)标志创建隔离的 worktree 并在其中启动 Claude。您传递的值成为 worktree 目录名称和分支名称:

672 

673```bash theme={null}

674# 在名为 "feature-auth" 的 worktree 中启动 Claude

675# 创建 .claude/worktrees/feature-auth/ 和新分支

676claude --worktree feature-auth

677 

678# 在单独的 worktree 中启动另一个会话

679claude --worktree bugfix-123

680```

681 

682如果您省略名称,Claude 会自动生成一个随机名称:

683 

684```bash theme={null}

685# 自动生成名称如 "bright-running-fox"

686claude --worktree

687```

688 

689Worktrees 在 `<repo>/.claude/worktrees/<name>` 创建,并从默认远程分支分支。worktree 分支命名为 `worktree-<name>`。

690 

691基础分支不能通过 Claude Code 标志或设置进行配置。`origin/HEAD` 是存储在您本地 `.git` 目录中的引用,Git 在您克隆时设置一次。如果存储库的默认分支稍后在 GitHub 或 GitLab 上更改,您的本地 `origin/HEAD` 会继续指向旧的,worktrees 将从那里分支。要重新同步您的本地引用与远程当前认为的默认值:

692 

693```bash theme={null}

694git remote set-head origin -a

695```

696 

697这是一个标准的 Git 命令,仅更新您的本地 `.git` 目录。远程服务器上没有任何更改。如果您希望 worktrees 基于特定分支而不是远程的默认值,请使用 `git remote set-head origin your-branch-name` 显式设置它。

698 

699为了完全控制 worktrees 的创建方式,包括为每次调用选择不同的基础,配置 [WorktreeCreate hook](/zh-CN/hooks#worktreecreate)。该 hook 完全替换 Claude Code 的默认 `git worktree` 逻辑,因此您可以从您需要的任何 ref 获取和分支。

700 

701您也可以在会话期间要求 Claude "work in a worktree" 或 "start a worktree",它会自动创建一个。

702 

703### Subagent worktrees

704 

705Subagents 也可以使用 worktree 隔离来并行工作而不会冲突。要求 Claude "use worktrees for your agents" 或在[自定义 subagent](/zh-CN/sub-agents#supported-frontmatter-fields) 中通过在代理的 frontmatter 中添加 `isolation: worktree` 来配置它。每个 subagent 获得自己的 worktree,当 subagent 完成而没有更改时自动清理。

706 

707### Worktree 清理

708 

709当您退出 worktree 会话时,Claude 根据您是否进行了更改来处理清理:

710 

711* **无更改**:worktree 及其分支自动删除

712* **存在更改或提交**:Claude 提示您保留或删除 worktree。保留会保留目录和分支,以便您稍后可以返回。删除会删除 worktree 目录及其分支,丢弃所有未提交的更改和提交

713 

714Subagent worktrees 由崩溃或中断的并行运行孤立的,在启动时会自动删除,一旦它们超过您的 [`cleanupPeriodDays`](/zh-CN/settings#available-settings) 设置,前提是它们没有未提交的更改、没有未跟踪的文件和没有未推送的提交。使用 `--worktree` 创建的 Worktrees 永远不会被此扫描删除。

715 

716要在 Claude 会话外清理 worktrees,请使用[手动 worktree 管理](#manage-worktrees-manually)。

717 

718<Tip>

719 将 `.claude/worktrees/` 添加到您的 `.gitignore` 以防止 worktree 内容在主存储库中显示为未跟踪的文件。

720</Tip>

721 

722### 复制 gitignored 文件到 worktrees

723 

724Git worktrees 是新鲜检出,所以它们不包括来自主存储库的未跟踪文件,如 `.env` 或 `.env.local`。要在 Claude 创建 worktree 时自动复制这些文件,请将 `.worktreeinclude` 文件添加到项目根目录。

725 

726该文件使用 `.gitignore` 语法列出要复制的文件。只有匹配模式且也被 gitignored 的文件才会被复制,因此跟踪的文件永远不会被复制。

727 

728```text .worktreeinclude theme={null}

729.env

730.env.local

731config/secrets.json

732```

733 

734这适用于使用 `--worktree` 创建的 worktrees、subagent worktrees 和[桌面应用](/zh-CN/desktop#work-in-parallel-with-sessions)中的并行会话。

735 

736### 手动管理 worktrees

737 

738为了更好地控制 worktree 位置和分支配置,直接使用 Git 创建 worktrees。当您需要检出特定的现有分支或将 worktree 放在存储库外时,这很有用。

739 

740```bash theme={null}

741# 使用新分支创建 worktree

742git worktree add ../project-feature-a -b feature-a

743 

744# 使用现有分支创建 worktree

745git worktree add ../project-bugfix bugfix-123

746 

747# 在 worktree 中启动 Claude

748cd ../project-feature-a && claude

749 

750# 完成时清理

751git worktree list

752git worktree remove ../project-feature-a

753```

754 

755在[官方 Git worktree 文档](https://git-scm.com/docs/git-worktree)中了解更多。

756 

757<Tip>

758 记住根据您的项目设置在每个新 worktree 中初始化您的开发环境。根据您的堆栈,这可能包括运行依赖项安装(`npm install`、`yarn`)、设置虚拟环境或遵循您的项目标准设置过程。

759</Tip>

760 

761### 非 git 版本控制

762 

763Worktree 隔离默认使用 git。对于其他版本控制系统如 SVN、Perforce 或 Mercurial,配置 [WorktreeCreate 和 WorktreeRemove hooks](/zh-CN/hooks#worktreecreate) 以提供自定义 worktree 创建和清理逻辑。配置后,这些 hooks 在您使用 `--worktree` 时替换默认的 git 行为,因此[`.worktreeinclude`](#copy-gitignored-files-to-worktrees) 不被处理。在您的 hook 脚本中复制任何本地配置文件。

764 

765对于具有共享任务和消息的并行会话的自动协调,请参阅[代理团队](/zh-CN/agent-teams)。

766 

767***

768 

769## 在 Claude 需要您的注意时获得通知

770 

771当您启动长时间运行的任务并切换到另一个窗口时,您可以设置桌面通知,以便在 Claude 完成或需要您的输入时了解。这使用 `Notification` [hook 事件](/zh-CN/hooks-guide#get-notified-when-claude-needs-input),每当 Claude 等待权限、空闲并准备好新提示或完成身份验证时触发。

772 

773<Steps>

774 <Step title="将 hook 添加到您的设置">

775 打开 `~/.claude/settings.json` 并添加一个 `Notification` hook,该 hook 调用您的平台的本机通知命令:

776 

777 <Tabs>

778 <Tab title="macOS">

779 ```json theme={null}

780 {

781 "hooks": {

782 "Notification": [

783 {

784 "matcher": "",

785 "hooks": [

786 {

787 "type": "command",

788 "command": "osascript -e 'display notification \"Claude Code needs your attention\" with title \"Claude Code\"'"

789 }

790 ]

791 }

792 ]

793 }

794 }

795 ```

796 </Tab>

797 

798 <Tab title="Linux">

799 ```json theme={null}

800 {

801 "hooks": {

802 "Notification": [

803 {

804 "matcher": "",

805 "hooks": [

806 {

807 "type": "command",

808 "command": "notify-send 'Claude Code' 'Claude Code needs your attention'"

809 }

810 ]

811 }

812 ]

813 }

814 }

815 ```

816 </Tab>

817 

818 <Tab title="Windows">

819 ```json theme={null}

820 {

821 "hooks": {

822 "Notification": [

823 {

824 "matcher": "",

825 "hooks": [

826 {

827 "type": "command",

828 "command": "powershell.exe -Command \"[System.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms'); [System.Windows.Forms.MessageBox]::Show('Claude Code needs your attention', 'Claude Code')\""

829 }

830 ]

831 }

832 ]

833 }

834 }

835 ```

836 </Tab>

837 </Tabs>

838 

839 如果您的设置文件已经有 `hooks` 键,请将 `Notification` 条目合并到其中,而不是覆盖。您也可以通过在 CLI 中描述您想要的内容来要求 Claude 为您编写 hook。

840 </Step>

841 

842 <Step title="可选地缩小匹配器范围">

843 默认情况下,hook 在所有通知类型上触发。要仅针对特定事件触发,请将 `matcher` 字段设置为以下值之一:

844 

845 | 匹配器 | 触发时机 |

846 | :--------------------- | :------------------ |

847 | `permission_prompt` | Claude 需要您批准工具使用 |

848 | `idle_prompt` | Claude 完成并等待您的下一个提示 |

849 | `auth_success` | 身份验证完成 |

850 | `elicitation_dialog` | MCP 服务器打开一个引出表单 |

851 | `elicitation_complete` | MCP 引出表单被提交或关闭 |

852 | `elicitation_response` | MCP 引出响应被发送回服务器 |

853 </Step>

854 

855 <Step title="验证 hook">

856 输入 `/hooks` 并选择 `Notification` 以确认 hook 出现。选择它显示将运行的命令。要端到端测试它,要求 Claude 运行需要权限的命令并切换离开终端,或要求 Claude 直接触发通知。

857 </Step>

858</Steps>

859 

860有关完整的事件架构和通知类型,请参阅[通知参考](/zh-CN/hooks#notification)。

861 

862***

863 

864## 将 Claude 用作 unix 风格的实用程序

865 

866### 将 Claude 添加到您的验证过程

867 

868假设您想将 Claude Code 用作 linter 或代码审查工具。

869 

870**将 Claude 添加到您的构建脚本:**

871 

872```json theme={null}

873// package.json

874{

875 ...

876 "scripts": {

877 ...

878 "lint:claude": "claude -p 'you are a linter. please look at the changes vs. main and report any issues related to typos. report the filename and line number on one line, and a description of the issue on the second line. do not return any other text.'"

879 }

880}

881```

882 

883<Tip>

884 提示:

885 

886 * 在您的 CI/CD 管道中使用 Claude 进行自动代码审查

887 * 自定义提示以检查与您的项目相关的特定问题

888 * 考虑为不同类型的验证创建多个脚本

889</Tip>

890 

891### 管道进入、管道输出

892 

893假设您想将数据管道输入 Claude,并获得结构化格式的数据。

894 

895**通过 Claude 管道数据:**

896 

897```bash theme={null}

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

899```

900 

901<Tip>

902 提示:

903 

904 * 使用管道将 Claude 集成到现有的 shell 脚本中

905 * 与其他 Unix 工具结合以实现强大的工作流程

906 * 考虑使用 `--output-format` 获得结构化输出

907</Tip>

908 

909### 控制输出格式

910 

911假设您需要 Claude 的输出采用特定格式,特别是在将 Claude Code 集成到脚本或其他工具时。

912 

913<Steps>

914 <Step title="使用文本格式(默认)">

915 ```bash theme={null}

916 cat data.txt | claude -p 'summarize this data' --output-format text > summary.txt

917 ```

918 

919 这仅输出 Claude 的纯文本响应(默认行为)。

920 </Step>

921 

922 <Step title="使用 JSON 格式">

923 ```bash theme={null}

924 cat code.py | claude -p 'analyze this code for bugs' --output-format json > analysis.json

925 ```

926 

927 这输出包含元数据(包括成本和持续时间)的消息的 JSON 数组。

928 </Step>

929 

930 <Step title="使用流式 JSON 格式">

931 ```bash theme={null}

932 cat log.txt | claude -p 'parse this log file for errors' --output-format stream-json

933 ```

934 

935 这在 Claude 处理请求时实时输出一系列 JSON 对象。每条消息都是有效的 JSON 对象,但如果连接,整个输出不是有效的 JSON。

936 </Step>

937</Steps>

938 

939<Tip>

940 提示:

941 

942 * 对于简单集成(您只需要 Claude 的响应),使用 `--output-format text`

943 * 当您需要完整的对话日志时使用 `--output-format json`

944 * 对于每个对话轮次的实时输出,使用 `--output-format stream-json`

945</Tip>

946 

947***

948 

949## 按计划运行 Claude

950 

951假设您想让 Claude 自动定期处理任务,如每天早上审查开放的 PR、每周审计依赖项或在夜间检查 CI 失败。

952 

953根据您希望任务运行的位置选择调度选项:

954 

955| 选项 | 运行位置 | 最适合 |

956| :--------------------------------------- | :---------------- | :---------------------------------------------------------------------------------------------------------------- |

957| [Routines](/zh-CN/routines) | Anthropic 管理的基础设施 | 即使您的计算机关闭也应该运行的任务。也可以在 API 调用或 GitHub 事件上触发,除了计划。在 [claude.ai/code/routines](https://claude.ai/code/routines) 配置。 |

958| [桌面计划任务](/zh-CN/desktop-scheduled-tasks) | 您的机器,通过桌面应用 | 需要直接访问本地文件、工具或未提交更改的任务。 |

959| [GitHub Actions](/zh-CN/github-actions) | 您的 CI 管道 | 与存储库事件(如打开的 PR)相关的任务,或应该与工作流配置一起存在的 cron 计划。 |

960| [`/loop`](/zh-CN/scheduled-tasks) | 当前 CLI 会话 | 会话打开时的快速轮询。任务在您开始新对话时停止;`--resume` 和 `--continue` 恢复未过期的任务。 |

961 

962<Tip>

963 为计划任务编写提示时,明确说明成功是什么样的以及如何处理结果。任务自主运行,所以它不能提出澄清问题。例如:"审查标记为 `needs-review` 的开放 PR,对任何问题留下内联评论,并在 `#eng-reviews` Slack 频道中发布摘要。"

964</Tip>

965 

966***

967 

968## 询问 Claude 关于其功能

969 

970Claude 内置访问其文档,可以回答关于其自身功能和限制的问题。

971 

972### 示例问题

973 

974```text theme={null}

975can Claude Code create pull requests?

976```

977 

978```text theme={null}

979how does Claude Code handle permissions?

980```

981 

982```text theme={null}

983what skills are available?

984```

985 

986```text theme={null}

987how do I use MCP with Claude Code?

988```

989 

990```text theme={null}

991how do I configure Claude Code for Amazon Bedrock?

992```

993 

994```text theme={null}

995what are the limitations of Claude Code?

996```

997 

998<Note>

999 Claude 基于文档提供对这些问题的答案。有关可执行示例和实际演示,请运行 `/powerup` 以获得带有动画演示的交互式课程,或参考上面的特定工作流程部分。

1000</Note>

1001 

1002<Tip>

1003 提示:

1004 

1005 * Claude 始终可以访问最新的 Claude Code 文档,无论您使用的版本如何

1006 * 提出具体问题以获得详细答案

1007 * Claude 可以解释复杂的功能,如 MCP 集成、企业配置和高级工作流程

1008</Tip>

1009 

1010***

1011 

1012## 后续步骤

1013 

1014<CardGroup cols={2}>

1015 <Card title="最佳实践" icon="lightbulb" href="/zh-CN/best-practices">

1016 充分利用 Claude Code 的模式

1017 </Card>

1018 

1019 <Card title="Claude Code 如何工作" icon="gear" href="/zh-CN/how-claude-code-works">

1020 理解代理循环和上下文管理

1021 </Card>

1022 

1023 <Card title="扩展 Claude Code" icon="puzzle-piece" href="/zh-CN/features-overview">

1024 添加 skills、hooks、MCP、subagents 和插件

1025 </Card>

1026 

1027 <Card title="参考实现" icon="code" href="https://github.com/anthropics/claude-code/tree/main/.devcontainer">

1028 克隆开发容器参考实现

1029 </Card>

1030</CardGroup>

communications-kit.md +437 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 通信工具包

6 

7> 推出公告、滴灌式营销信息和常见问题解答,用于在您的工程组织中推出 Claude Code。

8 

9本页面适用于在团队中推出 Claude Code 的管理员和工程主管。它提供了即用型的推出公告、技巧和窍门滴灌式营销活动,以及针对您最常被问到的问题的单行常见问题解答。

10 

11<Note>

12 将此处的所有内容视为草稿副本,而不是最终副本。用您组织的语气重写每条消息,用您自己代码库中的真实错误和模块替换示例任务,并在发送前替换 `[括号占位符]`。推动采用的公告是那些看起来像您公司某人写的公告。

13</Note>

14 

15## 推出通信

16 

17一个公告分为两种格式,加上两个可选变体。选择最适合您的推出方式的版本,然后从那里开始重写。

18 

19### 发送前

20 

21在公告发出前,请完成此清单。每一项都会关闭一个差距,否则会变成推出当天的支持线程。

22 

23| 项目 | 为什么重要 |

24| ------------------------------------------------- | -------------------------------------- |

25| `#claude-code` 频道已创建并在消息中链接 | 为问题提供一个统一的落地点 |

26| 在您环境中至少一台机器上测试了安装命令 | 在所有人同时遇到代理或防火墙问题之前捕获它们 |

27| 安全和数据处理链接已准备好([数据使用](/zh-CN/data-usage) 或您的内部等效项) | "我的代码去哪里了?" 将是第一个回复 |

28| 已选择一个具体的首个任务,您代码库中的真实错误或文件 | 通用示例不会转化;"修复 `auth_test.go` 中的不稳定测试" 会 |

29| 为前 48 小时指定的频道所有者 | 未回答的推出当天问题会杀死势头 |

30| 已安排一位 C 级高管赞助商发送或共同签署公告 | 由高管发送的推出在第一周采用率上始终比由管理员或工具团队发送的相同消息更高 |

31 

32### 公告

33 

34将此用作您的标准组织范围推出消息。它涵盖了 Claude Code 是什么,提供了两分钟的安装路径,为读者提供了一个具体的任务来尝试,并在任何人必须询问之前回答了"我的代码去哪里了?"。

35 

36<Tabs>

37 <Tab title="电子邮件">

38 ```text theme={null}

39 主题:Claude Code 现已为 [工程部门 / 您的团队] 推出

40 

41 团队,

42 

43 从今天开始,您可以访问 Claude Code,这是一个在您的终端中运行、读取您的实际代码库并端到端处理真实任务的 AI 编码代理:调试、重构、测试、PR。它不是自动完成,也不是聊天窗口。它编辑文件、运行您的命令,并在任何有风险的事情之前请求许可。

44 

45 在两分钟内开始运行:

46 

47 curl -fsSL https://claude.ai/install.sh | bash

48 cd <your-repo>

49 claude

50 

51 然后运行 /init 一次。Claude 读取您的项目并写入一个 CLAUDE.md,其中包含您的构建命令和约定,因此您不再需要重新解释基础知识。

52 

53 然后在您已经在的仓库上尝试以下其中之一:

54 

55 - "文件 [file] 中的测试不稳定。找出原因并修复它"

56 - "向我介绍 [module] 如何处理 [X]"

57 - "查看我的工作差异并告诉我在我推送之前什么是有风险的"

58 

59 您的代码去哪里了:Claude Code 在您的终端中运行,直接与 Anthropic 的 API 通信,循环中没有第三方服务器。它在编辑文件或运行命令之前请求许可。根据我们的企业协议,Anthropic 不使用您的代码或提示来训练其模型。

60 详情:https://code.claude.com/docs/en/data-usage

61 https://code.claude.com/docs/en/security

62 

63 有问题去哪里:#claude-code。[所有者名称] 本周在关注它。

64 

65 - [名称]

66 

67 附注:更喜欢您的编辑器?有一个 VS Code 扩展和一个 JetBrains 插件。相同的代理,不需要终端。

68 ```

69 </Tab>

70 

71 <Tab title="Slack 或 Teams">

72 ```markdown theme={null}

73 🚀 *Claude Code 现已为 [团队] 推出*

74 

75 AI 编码代理,在您的终端中运行,读取您的仓库,完成真实工作:

76 错误、重构、测试、PR。在触及任何东西之前请求许可。

77 

78 `curl -fsSL https://claude.ai/install.sh | bash` → `cd your-repo` → `claude`

79 

80 *首先尝试的事情* → 运行 `/init`,然后:"文件 [file] 中的测试不稳定,

81 找出原因并修复它。"

82 

83 🔒 在您的终端中运行,仅与 Anthropic 的 API 通信。根据我们的

84 企业计划,您的代码和提示不用于训练模型。

85 数据使用 → https://code.claude.com/docs/en/data-usage

86 

87 📚 快速入门 · VS Code · 免费 1 小时课程

88 https://code.claude.com/docs/en/quickstart

89 https://code.claude.com/docs/en/vs-code

90 https://anthropic.skilljar.com/claude-code-in-action

91 

92 问题 → 此线程。[所有者] 在处理。

93 ```

94 </Tab>

95</Tabs>

96 

97### 执行赞助商变体

98 

99从您的赞助执行官(如 CTO、CIO 或 SVP 工程)的名义和他们的账户发送此消息。以高管名义发出的推出在开启率和第一周激活速度上始终比来自管理员或工具团队的相同消息更高。它表示公司优先级而不是可选实验。

100 

101此版本故意精简为一个要求:安装它并在一个真实任务上运行它。高管的工作是让要求落地;标准公告和 `#claude-code` 处理方式。

102 

103<Tabs>

104 <Tab title="电子邮件">

105 ```text theme={null}

106 主题:我希望每位工程师本周尝试的一件事

107 

108 团队,

109 

110 我们已为所有工程部门启用了 Claude Code。这是一个直接在您的终端中工作、在您的实际代码库上工作的 AI 代理,已经使用它的团队的早期结果足够强劲,我希望每个人本周都使用它。

111 

112 我要求十分钟:

113 

114 curl -fsSL https://claude.ai/install.sh | bash

115 cd <your-repo>

116 claude

117 

118 然后给它一个真实的任务:您一直在推迟的错误,或"向我介绍 [module] 如何工作"。

119 

120 这就是全部要求。[所有者名称] 和团队在 #claude-code 中处理您遇到的任何问题。

121 

122 - [执行官名称]

123 [职位]

124 ```

125 </Tab>

126 

127 <Tab title="Slack 或 Teams">

128 ```markdown theme={null}

129 📣 *来自 [执行官名称]:本周尝试的一件事*

130 

131 我们已为所有工程部门启用了 *Claude Code*。早期结果足够强劲,我要求每个人本周在真实工作上给它十分钟。

132 

133 `curl -fsSL https://claude.ai/install.sh | bash` → `cd your-repo` →

134 `claude` → 给它一个真实的任务。

135 

136 就这样。问题 → #claude-code。

137 ```

138 </Tab>

139</Tabs>

140 

141### 试点组变体

142 

143用于分阶段推出。仅发送给试点队列。

144 

145```text theme={null}

146主题:您在 Claude Code 试点中

147 

148[名称 / 团队],

149 

150您在 [公司] 的 Claude Code 第一波中。我们选择了这个小组,因为您会在真实问题上使用它,并告诉我们关于它的真实情况。

151 

152要求:本周在至少一个真实任务上使用它,然后在 #claude-code-pilot 中留下一条说明,涵盖什么有效、什么令人烦恼以及什么让您感到惊讶。该反馈决定了我们如何向其他人推出。

153 

154[继续标准公告中的"在两分钟内开始运行"]

155 

156试点的一个额外事项:在您的第一个多文件更改时,按 Shift+Tab 直到您看到"plan"。Claude 将在触及任何文件之前准确说明它打算做什么。这是校准您应该信任多少的最快方式。

157```

158 

159### 冠军招募直接消息

160 

161推出后,直接消息给在 `#claude-code` 中最活跃的两三个人。

162 

163```text theme={null}

164嘿 [名称],您的 #claude-code 帖子对采用的推动比我的公告做得更多。几个人告诉我您的 [线程 / 截图] 是他们实际尝试它的原因。

165 

166想让这成为半官方的吗?低投入:主要是继续发布您正在发布的内容,加上新功能的第一次尝试和与 Anthropic 团队的直接联系。如果您有兴趣,我可以分享一个简短的剧本。

167```

168 

169## 技巧和窍门营销活动

170 

171设计用于在推出后推动功能激活的即用型 Slack 或 Teams 消息。每个都遵循相同的模式:一个钩子、收益、一个"现在尝试"提示和一个文档链接。每周在 `#claude-code` 中滴灌一个或两个,或选择与您团队差距相匹配的少数几个。它们独立存在,没有必需的顺序。

172 

173直接从每个块中复制消息正文到 Slack 或 Teams。在发送前替换 `[括号占位符]`。

174 

175### 开始

176 

177**选择正确的模型**

178 

179```markdown theme={null}

180🎯 *技巧:将模型与时刻相匹配*

181 

182使用 Opus 修复打字错误会浪费计算。使用 Haiku 进行 12 文件重构

183是在要求重做。

184 

185Claude Code 在与 Claude 应用相同的模型上运行,您可以在会话中间切换。*Sonnet* 是日常功能工作、错误、测试和审查的主力默认值。在大型重构、复杂调试或任何高风险的事情上使用 *Opus*。对于快速问题、格式化和速度获胜的机械编辑,降低到 *Haiku*。

186 

187*现在尝试:* 输入 `/model` 并选择 Sonnet(如果您还没有的话)。它是大多数任务的正确默认值。

188 

189📖 模型配置 → https://code.claude.com/docs/en/model-config

190```

191 

192| 模型 | 最适合 |

193| ------ | ----------------------------- |

194| Opus | 大规模重构、复杂调试、架构决策、高风险更改 |

195| Sonnet | 日常功能工作、错误修复、测试、文档、代码审查。推荐默认值。 |

196| Haiku | 快速问题、格式化、机械编辑、快速迭代 |

197 

198**快速赢得尝试首先**

199 

200```markdown theme={null}

201🚀 *技巧:在您的前 10 分钟尝试的三件事*

202 

203安装了 Claude Code 但不确定实际要求什么?从一直困扰您整周的东西开始。

204 

205 - 修复令人烦恼的东西:"文件 [file] 中的测试不稳定,找出原因"

206 - 在您没有写的代码中定向:"向我介绍 [module] 如何工作"

207 - 在您推送前进行理智检查:"查看我的工作差异并告诉我什么看起来有风险"

208 

209这些都不需要设置。只需 `cd` 进入您的仓库并运行 `claude`。

210 

211*现在尝试:* 选择您一直在避免的错误并粘贴错误消息。

212 

213📖 快速入门 → https://code.claude.com/docs/en/quickstart

214```

215 

216### 项目记忆

217 

218**`/init` 和 CLAUDE.md**

219 

220```markdown theme={null}

221📁 *技巧:停止每个会话重新解释您的仓库*

222 

223第五次告诉 Claude "我们使用 pnpm,而不是 npm"?有一个一次性修复。

224 

225每个仓库运行一次 `/init`。Claude 读取您的项目结构并写入一个 CLAUDE.md 文件,其中包含您的构建命令、架构和约定。该仓库中的每个未来会话都会自动从此文件开始。保持在两个屏幕以下。这是一个速查表,不是文档。

226 

227*现在尝试:* 打开您的主仓库,运行 `claude`,输入 `/init`。三十秒,在之后的每个会话中都有回报。

228 

229📖 CLAUDE.md 和项目记忆 → https://code.claude.com/docs/en/memory

230```

231 

232**@-引用**

233 

234```markdown theme={null}

235📎 *技巧:停止将文件内容粘贴到聊天中*

236 

237将一个组件的 200 行复制到您的提示中,以便 Claude 可以"看到"它?您不必这样做。

238 

239输入 `@` 然后是文件路径。Claude 直接将文件拉入上下文。也适用于整个目录。

240 

241> @src/components/Button.tsx 中的样式看起来不对,检查 @docs/design-system.md

242 

243*现在尝试:* 输入 `@` 然后 Tab。自动完成显示您可以到达的每个文件。

244 

245📖 引用文件 → https://code.claude.com/docs/en/common-workflows

246```

247 

248### 控制和安全

249 

250**权限模式**

251 

252```markdown theme={null}

253🛡️ *技巧:一个按键在"看但不要触及"和"就做吧"之间*

254 

255有时您希望 Claude 在每次编辑之前请求许可。有时您只是希望它发货。您不应该永远选择一个。

256 

257*Shift+Tab* 循环通过 Claude 获得多少自由度:*default* 在有风险的东西之前请求,*acceptEdits* 让文件编辑和常见文件系统命令流通,同时仍在其他 shell 命令之前检查,*plan* 在触及任何东西之前为您的批准提议更改。Plan 模式是信任构建者,所以对于任何触及多个文件的东西,从那里开始。

258 

259*现在尝试:* 在您的下一个重构上,按 Shift+Tab 直到您看到"plan",然后描述更改。您将在单个文件移动之前获得完整的提议。

260 

261📖 权限模式 → https://code.claude.com/docs/en/permissions

262```

263 

264**Checkpointing 和 `/rewind`**

265 

266```markdown theme={null}

267⏪ *技巧:整个对话有一个撤销按钮*

268 

269Claude 三轮前走错了路,现在您在解开它?您不必向前修复。

270 

271`/rewind` 回滚到对话中的较早点,包括 Claude 沿途所做的文件更改。Checkpointing 是自动的;您不需要设置任何东西。

272 

273*现在尝试:* 按 *Esc* 两次打开倒带菜单,或输入 `/rewind`。选择事情变得不对劲之前的点。

274 

275📖 Checkpointing → https://code.claude.com/docs/en/checkpointing

276```

277 

278### 连接您的工具

279 

280**MCP 连接器**

281 

282```markdown theme={null}

283🔌 *技巧:让 Claude 读取您的问题跟踪器,这样您就不必粘贴票证*

284 

285将 Jira 票证复制粘贴到终端感觉像是向后退一步。确实是。

286 

287一个配置文件(您的项目根目录中的 `.mcp.json`)将 Claude 连接到 GitHub、Jira、Linear 或您使用的任何跟踪器。然后"分配给我的最高优先级问题是什么?"和"继续修复它"在同一对话中发生。

288 

289*现在尝试:* 问 Claude "在这个仓库中为 [GitHub/Jira/Linear] 设置一个 MCP 连接器"。它将为您写配置。

290 

291📖 MCP 连接器 → https://code.claude.com/docs/en/mcp

292```

293 

294### 自动化您的工作流

295 

296**Skills**

297 

298```markdown theme={null}

299⚡ *技巧:将您一直重新输入的提示变成命令*

300 

301本周三次输入"从 git log 总结我今天所做的工作,为站立会议格式化"?那是一个等待发生的斜杠命令。

302 

303`.claude/skills/<name>/` 中的 SKILL.md 文件变成可重用的提示;输入 `/name` 来运行它。第二次输入您之前输入过的多步骤提示时制作一个。最简单的路径:要求 Claude 为您制作它。

304 

305*现在尝试:* 输入"为我制作一个 /standup skill,从 git log 总结我今天所做的工作",然后明天早上运行 `/standup`。

306 

307📖 Skills → https://code.claude.com/docs/en/skills

308```

309 

310**Hooks**

311 

312```markdown theme={null}

313🔔 *技巧:当您的重构完成时获得通知*

314 

315坐在您的办公桌前看 Claude 完成一个长任务?您在接下来的八分钟内有更好的事情要做。

316 

317Hooks 是在 Claude Code 事件上触发的 shell 命令。一个发送桌面通知的 Stop hook 意味着您可以启动一个长重构、走开,并在完成的那一刻获得通知。

318 

319*现在尝试:* 问 Claude "添加一个 Stop hook,当您完成时发送桌面通知"。它将写脚本并连接它。

320 

321📖 Hooks 指南 → https://code.claude.com/docs/en/hooks-guide

322```

323 

324### 日常开发

325 

326**截图和图像**

327 

328```markdown theme={null}

329📸 *技巧:停止描述错误对话框。只需显示它。*

330 

331输入"有一个红色框说关于空引用的东西,它指向第 47 行左右"?截图它。

332 

333直接将截图拖到终端中,Claude 看到它:错误对话框、UI 模型、白板照片、Figma 导出。*Ctrl+V* 从剪贴板粘贴(在 macOS 上也使用 Ctrl+V,而不是 Cmd+V)。

334 

335*现在尝试:* 下次视觉上出现问题时,截图并直接粘贴到提示中。然后只需输入"这里出了什么问题?"

336 

337📖 使用图像 → https://code.claude.com/docs/en/common-workflows

338```

339 

340**Git 工作流**

341 

342```markdown theme={null}

343🌿 *技巧:交接整个 git 仪式*

344 

345修复花了 5 分钟。提交消息、分支和 PR 描述花了 15 分钟。这个比例是错误的。

346 

347Claude 处理完整的 git 流:带有常规消息的提交、分支、带有适当摘要的 PR。一个要求:"修复偏差一,用常规提交消息提交,并打开一个 PR。"审查别人的工作?粘贴 PR URL 并要求 Claude 向您介绍差异。

348 

349*现在尝试:* 在您的下一个修复后,而不是切换到您的 git 客户端,只需输入"用一个好消息提交这个并打开一个 PR"。

350 

351📖 创建拉取请求 → https://code.claude.com/docs/en/common-workflows

352```

353 

354### 分享和扩展

355 

356**Plugins**

357 

358```markdown theme={null}

359📦 *技巧:有人可能已经构建了那个 skill*

360 

361即将花一个小时构建一个 `/deploy` 命令?检查它是否已经存在。

362 

363Skills 被捆绑并作为插件共享。`/plugin` 浏览可用的内容并在一个步骤中安装。五分钟的浏览可以节省一小时的构建。

364 

365*现在尝试:* 输入 `/plugin` 并滚动浏览。您会找到至少一件您不知道自己想要的东西。

366 

367📖 Plugins → https://code.claude.com/docs/en/plugins

368```

369 

370### 安全和管理

371 

372**安全架构**

373 

374```markdown theme={null}

375🔐 *技巧:下次被问到时"这安全吗?"的答案*

376 

377您团队中的某个人会问"等等,我的代码去哪里了?"

378这是您可以粘贴的简短版本。

379 

380权限优先设计。每个文件编辑、shell 命令和外部调用都由您的批准门控。CLI 在您的终端中运行,直接与 Anthropic 的 API 通信,没有第三方服务器,并支持 shell 命令的可选操作系统级沙箱。根据我们的企业计划,Anthropic 不使用您的代码或提示来训练其模型。

381 

382*现在尝试:* 保存这两个链接以备下次问题出现。它们回答了大多数安全审查问题。

383 

384📖 https://code.claude.com/docs/en/security

385📖 https://code.claude.com/docs/en/data-usage

386```

387 

388**最佳实践**

389 

390```markdown theme={null}

391✅ *技巧:分离"尝试一次"和"每天使用"的 4 个习惯*

392 

393大多数从 Claude Code 反弹的人跳过了其中之一。大多数坚持的人在第一周做了全部四个。

394 

395 - 对于任何触及多个文件的东西,从 plan 模式开始

396 - 早期运行 /init;上下文复合

397 - 在提交前审查差异;Claude 可以自信地错误

398 - 验证触及关键路径的更改;将其视为锐利的初级,而不是预言家

399 

400*现在尝试:* 如果您只做了其中一两个,选择您缺少的那个并在您的下一个任务上做。在 #claude-code 中发布什么改变了。

401 

402📖 最佳实践 → https://code.claude.com/docs/en/best-practices

403```

404 

405## 快速参考

406 

407### 常见问题解答回复

408 

409针对您最常被问到的问题的单行回复。

410 

411| 问题 | 回复 |

412| ------------------- | ------------------------------------------------------------------------------------------------------- |

413| "它在 VS Code 中工作吗?" | 是的。有一个 VS Code 扩展和一个 JetBrains 插件,具有相同的功能,嵌入在您的编辑器中。[VS Code →](/zh-CN/vs-code) |

414| "我必须先配置什么吗?" | 不。安装,然后在任何仓库中运行 `claude`。运行一次 `/init`,您就设置好了。[快速入门 →](/zh-CN/quickstart) |

415| "我的代码去哪里了?" | CLI 在您的终端中运行,并将上下文发送到 Anthropic 的 API 进行推理,没有第三方服务器。根据您的企业计划,您的代码和提示不用于训练模型。[数据使用 →](/zh-CN/data-usage) |

416| "它能看到我的整个仓库吗?" | 它读取您给它访问权限的内容。您工作目录内的文件读取不提示;权限提示门控编辑、shell 命令和该目录外的任何东西。[权限 →](/zh-CN/permissions) |

417| "这与 Copilot 有什么不同?" | Copilot 自动完成行。Claude Code 是一个读取文件、运行命令和进行多文件编辑的代理。[概述 →](/zh-CN/overview) |

418| "我应该首先尝试什么?" | 您一直在推迟的错误,因为它很乏味。"文件 \[file] 中的测试不稳定,找出原因。" [快速入门 →](/zh-CN/quickstart) |

419 

420### 提示模板

421 

422与已安装但不确定要求什么的工程师分享这些入门提示。每一个都以它在真实会话中输入的方式表述;用您自己仓库中的文件替换括号部分。

423 

424| 任务 | 提示 |

425| -------- | -------------------------------------------- |

426| 修复错误 | "文件 \[file] 中的测试失败,找出原因并修复它" |

427| 理解代码 | "向我介绍 \[module] 如何工作,然后告诉我入口点在哪里" |

428| 安全重构 | "重构 \[module] 到 \[goal],使用 plan 模式,以便我可以先审查" |

429| 编写测试 | "为 \[file] 编写测试,涵盖 \[scenario] 周围的边界情况" |

430| 提交前审查 | "查看我的工作差异并告诉我什么看起来有风险" |

431| 打开 PR | "修复 \[issue],写一个常规提交,并用摘要打开一个 PR" |

432| 制作 skill | "为我制作一个 /ship skill,在提交前运行测试和 lint" |

433| 调试堆栈跟踪 | "这是堆栈跟踪,找到根本原因,不要只是掩盖它" |

434 

435<Tip>

436 Claude Code 频繁发货。在内部分发前,根据[文档主页](/zh-CN/overview)验证版本特定的详情。

437</Tip>

computer-use.md +205 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 让 Claude 从 CLI 使用您的计算机

6 

7> 在 Claude Code CLI 中启用 computer use,使 Claude 能够在 macOS 上打开应用、点击、输入和查看您的屏幕。测试原生应用、调试视觉问题,以及自动化仅限 GUI 的工具,无需离开您的终端。

8 

9<Note>

10 {/* plan-availability: feature=computer-use plans=pro,max */}

11 

12 Computer use 是 macOS 上的研究预览版,需要 Pro 或 Max 计划。它在 Team 或 Enterprise 计划上不可用。它需要 Claude Code v2.1.85 或更高版本以及交互式会话,因此在使用 `-p` 标志的非交互式模式下不可用。

13</Note>

14 

15Computer use 让 Claude 能够打开应用、控制您的屏幕,并以您的方式在您的机器上工作。从 CLI 中,Claude 可以编译 Swift 应用、启动它、点击每个按钮,并截图结果,所有这些都在编写代码的同一对话中进行。

16 

17本页面介绍 computer use 在 CLI 中的工作原理。对于桌面应用,请参阅 [Desktop 中的 computer use](/zh-CN/desktop#let-claude-use-your-computer)。

18 

19## 您可以用 computer use 做什么

20 

21Computer use 处理需要 GUI 的任务:任何您通常必须离开终端并手动完成的事情。

22 

23* **构建和验证原生应用**:要求 Claude 构建 macOS 菜单栏应用。Claude 编写 Swift、编译它、启动它,并点击每个控件来验证它是否有效,然后您才打开它。

24* **端到端 UI 测试**:将 Claude 指向本地 Electron 应用并说"测试入门流程"。Claude 打开应用、点击注册,并截图每一步。无需 Playwright 配置,无需测试工具。

25* **调试视觉和布局问题**:告诉 Claude"模态框在小窗口上被裁剪"。Claude 调整窗口大小、重现错误、截图、修补 CSS,并验证修复。Claude 看到您看到的内容。

26* **驱动仅限 GUI 的工具**:与设计工具、硬件控制面板、iOS 模拟器或没有 CLI 或 API 的专有应用交互。

27 

28## Computer use 何时适用

29 

30Claude 有多种方式与应用或服务交互。Computer use 是最广泛和最慢的,所以 Claude 首先尝试最精确的工具:

31 

32* 如果您有该服务的 [MCP server](/zh-CN/mcp),Claude 会使用它。

33* 如果任务是 shell 命令,Claude 会使用 Bash。

34* 如果任务是浏览器工作且您已设置 [Claude in Chrome](/zh-CN/chrome),Claude 会使用它。

35* 如果以上都不适用,Claude 会使用 computer use。

36 

37屏幕控制保留用于其他工具无法到达的事物:原生应用、模拟器和没有 API 的工具。

38 

39## 启用 computer use

40 

41Computer use 作为称为 `computer-use` 的内置 MCP server 可用。默认情况下它是关闭的,直到您启用它。

42 

43<Steps>

44 <Step title="打开 MCP 菜单">

45 在交互式 Claude Code 会话中,运行:

46 

47 ```text theme={null}

48 /mcp

49 ```

50 

51 在服务器列表中找到 `computer-use`。它显示为已禁用。

52 </Step>

53 

54 <Step title="启用服务器">

55 选择 `computer-use` 并选择**启用**。该设置按项目持久化,因此您只需为每个想要 computer use 的项目执行一次此操作。

56 </Step>

57 

58 <Step title="授予 macOS 权限">

59 Claude 第一次尝试使用您的计算机时,您会看到一个提示来授予两个 macOS 权限:

60 

61 * **Accessibility**:让 Claude 点击、输入和滚动

62 * **Screen Recording**:让 Claude 看到您屏幕上的内容

63 

64 该提示包括打开相关系统设置窗格的链接。授予两者,然后在提示中选择**重试**。授予 Screen Recording 后,macOS 可能需要您重启 Claude Code。

65 </Step>

66</Steps>

67 

68设置后,要求 Claude 做需要 GUI 的事情:

69 

70```text theme={null}

71构建应用目标、启动它,并点击每个选项卡以确保

72没有任何内容崩溃。截图您找到的任何错误状态。

73```

74 

75## 按会话批准应用

76 

77启用 `computer-use` 服务器不会授予 Claude 访问您机器上每个应用的权限。Claude 在会话中第一次需要特定应用时,您的终端中会出现一个提示,显示:

78 

79* Claude 想要控制哪些应用

80* 任何额外请求的权限,例如剪贴板访问

81* Claude 工作时将隐藏多少其他应用

82 

83选择**允许此会话**或**拒绝**。批准持续当前会话。当 Claude 一起请求多个应用时,您可以一次批准多个应用。

84 

85具有广泛影响的应用在提示中显示额外警告,以便您知道批准它们授予什么:

86 

87| 警告 | 适用于 |

88| :----------- | :------------------------------------- |

89| 等同于 shell 访问 | Terminal、iTerm、VS Code、Warp 和其他终端和 IDE |

90| 可以读取或写入任何文件 | Finder |

91| 可以更改系统设置 | System Settings |

92 

93这些应用不被阻止。警告让您决定任务是否值得那个级别的访问。

94 

95Claude 的控制级别也因应用类别而异:浏览器和交易平台是仅查看的,终端和 IDE 是仅点击的,其他所有内容都获得完全控制。有关完整的分层细分,请参阅 [Desktop 中的应用权限](/zh-CN/desktop#app-permissions)。

96 

97## Claude 如何在您的屏幕上工作

98 

99理解流程有助于您预期 Claude 将做什么以及如何干预。

100 

101### 一次一个会话

102 

103Computer use 在活动时持有机器范围的锁。如果另一个 Claude Code 会话已在使用您的计算机,新的尝试会失败并显示一条消息,告诉您哪个会话持有锁。首先完成或退出该会话。

104 

105### Claude 工作时应用被隐藏

106 

107当 Claude 开始控制您的屏幕时,其他可见应用被隐藏,以便 Claude 仅与批准的应用交互。您的终端窗口保持可见并被排除在屏幕截图之外,因此您可以观看会话,Claude 永远看不到自己的输出。

108 

109当 Claude 完成轮次时,隐藏的应用会自动恢复。

110 

111### 随时停止

112 

113当 Claude 获取锁时,会出现 macOS 通知:"Claude is using your computer · press Esc to stop"。在任何地方按 `Esc` 立即中止当前操作,或在终端中按 `Ctrl+C`。无论哪种方式,Claude 都会释放锁、取消隐藏您的应用,并将控制权返回给您。

114 

115当 Claude 完成时,会出现第二个通知。

116 

117## 安全性和信任边界

118 

119<Warning>

120 与 [sandboxed Bash tool](/zh-CN/sandboxing) 不同,computer use 在您的实际桌面上运行,可以访问您批准的应用。Claude 检查每个操作并标记来自屏幕内容的潜在提示注入,但信任边界是不同的。有关最佳实践,请参阅 [computer use 安全指南](https://support.claude.com/en/articles/14128542)。

121</Warning>

122 

123内置的护栏在不需要配置的情况下降低风险:

124 

125* **按应用批准**:Claude 只能控制您在当前会话中批准的应用。

126* **哨兵警告**:授予 shell、文件系统或系统设置访问权限的应用在您批准之前被标记。

127* **终端被排除在屏幕截图之外**:Claude 永远看不到您的终端窗口,因此您会话中的屏幕提示无法反馈到模型中。

128* **全局转义**:`Esc` 键从任何地方中止 computer use,并且按键被消耗,因此提示注入无法使用它来关闭对话框。

129* **锁文件**:一次只有一个会话可以控制您的机器。

130 

131## 示例工作流

132 

133这些示例展示了将 computer use 与编码任务结合的常见方式。

134 

135### 验证原生构建

136 

137对 macOS 或 iOS 应用进行更改后,让 Claude 在一次通过中编译和验证:

138 

139```text theme={null}

140构建 MenuBarStats 目标、启动它、打开首选项窗口,

141并验证间隔滑块更新标签。完成后截图首选项窗口。

142```

143 

144Claude 运行 `xcodebuild`、启动应用、与 UI 交互,并报告它发现的内容。

145 

146### 重现布局错误

147 

148当视觉错误仅在某些窗口大小下出现时,让 Claude 找到它:

149 

150```text theme={null}

151设置模态框在窄窗口上裁剪其页脚。调整应用窗口大小

152直到您可以重现它、截图裁剪状态,然后检查模态框容器的 CSS。

153```

154 

155Claude 调整窗口大小、捕获损坏的状态,并读取相关的样式表。

156 

157### 测试模拟器流程

158 

159无需编写 XCTest 即可驱动 iOS 模拟器:

160 

161```text theme={null}

162打开 iOS 模拟器、启动应用、点击入门屏幕,

163并告诉我是否有任何屏幕加载时间超过一秒。

164```

165 

166Claude 以您使用鼠标的方式控制模拟器。

167 

168## 与 Desktop 应用的差异

169 

170CLI 和 Desktop 表面共享相同的 computer use 引擎。一些 Desktop 特定的控件在 CLI 中还不可用:

171 

172| 功能 | Desktop | CLI |

173| :---------- | :----------------------------------------------- | :-------------------------- |

174| 启用 | **Settings > General** 中的切换(在 **Desktop app** 下) | 在 `/mcp` 中启用 `computer-use` |

175| 拒绝应用列表 | 在设置中可配置 | 尚不可用 |

176| 自动取消隐藏切换 | 可选 | 始终开启 |

177| Dispatch 集成 | Dispatch 生成的会话可以使用 computer use | 不适用 |

178 

179## 故障排除

180 

181### "Computer use is in use by another Claude session"

182 

183另一个 Claude Code 会话持有锁。完成该会话中的任务或退出它。如果另一个会话崩溃,当 Claude 检测到该进程不再运行时,锁会自动释放。

184 

185### macOS 权限提示不断重新出现

186 

187授予 Screen Recording 后,macOS 有时需要重启请求进程。完全退出 Claude Code 并启动新会话。如果提示仍然存在,打开 **System Settings > Privacy & Security > Screen Recording** 并确认您的终端应用已列出并启用。

188 

189### `computer-use` 不出现在 `/mcp` 中

190 

191服务器仅在符合条件的设置上出现。检查:

192 

193* 您在 macOS 上。Computer use 在 Linux 或 Windows 上不可用。

194* 您运行的是 Claude Code v2.1.85 或更高版本。运行 `claude --version` 来检查。

195* 您在 Pro 或 Max 计划上。运行 `/status` 来确认您的订阅。

196* 您通过 claude.ai 进行身份验证。Computer use 不适用于第三方提供商,如 Amazon Bedrock、Google Cloud Vertex AI 或 Microsoft Foundry。如果您仅通过第三方提供商访问 Claude,您需要单独的 claude.ai 账户来使用此功能。

197* 您在交互式会话中。Computer use 在使用 `-p` 标志的非交互式模式下不可用。

198 

199## 另请参阅

200 

201* [Desktop 中的 Computer use](/zh-CN/desktop#let-claude-use-your-computer):具有图形设置页面的相同功能

202* [Claude in Chrome](/zh-CN/chrome):用于基于网络的任务的浏览器自动化

203* [MCP](/zh-CN/mcp):将 Claude 连接到结构化工具和 API

204* [Sandboxing](/zh-CN/sandboxing):Claude 的 Bash 工具如何隔离文件系统和网络访问

205* [Computer use 安全指南](https://support.claude.com/en/articles/14128542):安全 computer use 的最佳实践

costs.md +203 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 有效管理成本

6 

7> 跟踪令牌使用情况,设置团队支出限制,并通过上下文管理、模型选择、扩展思考设置和预处理 hooks 来降低 Claude Code 成本。

8 

9Claude Code 按 API 令牌消耗收费。有关订阅计划定价(Pro、Max、Team、Enterprise),请参阅 [claude.com/pricing](https://claude.com/pricing)。每个开发者的成本差异很大,取决于模型选择、代码库大小和使用模式,例如运行多个实例或自动化。

10 

11在企业部署中,平均成本约为每个开发者每个活跃日 $13,每个开发者每月 $150-250,90% 的用户每个活跃日成本保持在 \$30 以下。要估计您自己团队的支出,请从一个小的试点团体开始,并使用下面的跟踪工具建立基线,然后再进行更广泛的推出。

12 

13本页面介绍如何[跟踪成本](#track-your-costs)、[管理团队成本](#managing-costs-for-teams)和[减少令牌使用](#reduce-token-usage)。

14 

15## 跟踪成本

16 

17### 使用 `/usage` 命令

18 

19<Note>

20 `/usage` 中的 Session 块显示 API 令牌使用情况,适用于 API 用户。Claude Max 和 Pro 订阅者的使用情况包含在订阅中,因此会话成本数据与计费无关。订阅者在同一屏幕上看到计划使用条和活动统计。

21</Note>

22 

23`/usage` 命令为您的当前会话提供详细的令牌使用统计。美元数字是从令牌计数本地计算的估计值,可能与您的实际账单不同。有关权威计费,请参阅 [Claude Console](https://platform.claude.com/usage) 中的使用情况页面。

24 

25```text theme={null}

26Total cost: $0.55

27Total duration (API): 6m 19.7s

28Total duration (wall): 6h 33m 10.2s

29Total code changes: 0 lines added, 0 lines removed

30```

31 

32## 管理团队成本

33 

34使用 Claude API 时,您可以在 Claude Code 工作区上[设置工作区支出限制](https://platform.claude.com/docs/zh-CN/build-with-claude/workspaces#workspace-limits)。管理员可以在 Console 中[查看成本和使用情况报告](https://platform.claude.com/docs/zh-CN/build-with-claude/workspaces#usage-and-cost-tracking)。

35 

36<Note>

37 当您首次使用 Claude Console 账户对 Claude Code 进行身份验证时,会自动为您创建一个名为"Claude Code"的工作区。此工作区为您的组织中的所有 Claude Code 使用情况提供集中式成本跟踪和管理。您无法为此工作区创建 API 密钥;它专门用于 Claude Code 身份验证和使用。

38 

39 对于具有自定义速率限制的组织,此工作区中的 Claude Code 流量计入您的组织整体 API 速率限制。您可以在 Claude Console 的此工作区的 Limits 页面上设置[工作区速率限制](https://platform.claude.com/docs/zh-CN/api/rate-limits#setting-lower-limits-for-workspaces),以限制 Claude Code 的份额并保护其他生产工作负载。

40</Note>

41 

42在 Bedrock、Vertex 和 Foundry 上,Claude Code 不会从您的云中发送指标。为了获取成本指标,几家大型企业报告使用[LiteLLM](/zh-CN/llm-gateway#litellm-configuration),这是一个开源工具,可帮助公司[按密钥跟踪支出](https://docs.litellm.ai/docs/proxy/virtual_keys#tracking-spend)。此项目与 Anthropic 无关,尚未进行安全审计。

43 

44### 速率限制建议

45 

46为团队设置 Claude Code 时,请根据您的组织规模考虑这些每用户的令牌/分钟 (TPM) 和请求/分钟 (RPM) 建议:

47 

48| 团队规模 | 每用户 TPM | 每用户 RPM |

49| ---------- | --------- | --------- |

50| 1-5 用户 | 200k-300k | 5-7 |

51| 5-20 用户 | 100k-150k | 2.5-3.5 |

52| 20-50 用户 | 50k-75k | 1.25-1.75 |

53| 50-100 用户 | 25k-35k | 0.62-0.87 |

54| 100-500 用户 | 15k-20k | 0.37-0.47 |

55| 500+ 用户 | 10k-15k | 0.25-0.35 |

56 

57例如,如果您有 200 个用户,您可能会为每个用户请求 20k TPM,或总共 400 万 TPM (200\*20,000 = 400 万)。

58 

59随着团队规模的增长,每用户的 TPM 会减少,因为在较大的组织中,往往较少的用户同时使用 Claude Code。这些速率限制在组织级别应用,而不是按个人用户应用,这意味着当其他人未积极使用该服务时,个人用户可以暂时消耗超过其计算份额的资源。

60 

61<Note>

62 如果您预期会出现异常高的并发使用情况(例如与大型团体进行的实时培训会话),您可能需要更高的每用户 TPM 分配。

63</Note>

64 

65### Agent 团队令牌成本

66 

67[Agent 团队](/zh-CN/agent-teams)生成多个 Claude Code 实例,每个实例都有自己的上下文窗口。令牌使用情况随活跃队友的数量和每个队友运行的时间长度而扩展。

68 

69为了保持 agent 团队成本可控:

70 

71* 为队友使用 Sonnet。它为协调任务平衡了能力和成本。

72* 保持团队规模小。每个队友运行自己的上下文窗口,因此令牌使用大致与团队规模成正比。

73* 保持生成提示的重点。队友会自动加载 CLAUDE.md、MCP servers 和 skills,但生成提示中的所有内容都会从一开始就添加到其上下文中。

74* 工作完成后清理团队。活跃的队友即使处于空闲状态也会继续消耗令牌。

75* Agent 团队默认被禁用。在您的[settings.json](/zh-CN/settings)或环境中设置 `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1` 以启用它们。请参阅[启用 agent 团队](/zh-CN/agent-teams#enable-agent-teams)。

76 

77## 减少令牌使用

78 

79令牌成本随上下文大小而扩展:Claude 处理的上下文越多,您使用的令牌就越多。Claude Code 通过 prompt caching(减少重复内容(如系统提示)的成本)和 auto-compact(在接近上下文限制时总结对话历史)自动优化成本。

80 

81以下策略可帮助您保持上下文较小并降低每条消息的成本。

82 

83### 主动管理上下文

84 

85使用 `/usage` 检查您当前的令牌使用情况,或[配置您的状态行](/zh-CN/statusline#context-window-usage)以连续显示它。

86 

87* **在任务之间清除**:使用 `/clear` 在切换到不相关的工作时重新开始。陈旧的上下文会在随后的每条消息上浪费令牌。在清除之前使用 `/rename` 以便您稍后可以轻松找到会话,然后使用 `/resume` 返回到它。

88* **添加自定义 compaction 指令**:`/compact Focus on code samples and API usage` 告诉 Claude 在总结期间保留什么。

89 

90您还可以在 CLAUDE.md 中自定义 compaction 行为:

91 

92```markdown theme={null}

93# Compact instructions

94 

95When you are using compact, please focus on test output and code changes

96```

97 

98### 选择正确的模型

99 

100Sonnet 处理大多数编码任务效果很好,成本低于 Opus。为复杂的架构决策或多步推理保留 Opus。使用 `/model` 在会话中途切换模型,或在 `/config` 中设置默认值。对于简单的 subagent 任务,在您的[subagent 配置](/zh-CN/sub-agents#choose-a-model)中指定 `model: haiku`。

101 

102### 减少 MCP server 开销

103 

104MCP 工具定义[默认被延迟](/zh-CN/mcp#scale-with-mcp-tool-search),因此只有工具名称进入上下文,直到 Claude 使用特定工具。运行 `/context` 查看占用空间的内容。

105 

106* **在可用时优先使用 CLI 工具**:`gh`、`aws`、`gcloud` 和 `sentry-cli` 等工具比 MCP servers 更节省上下文,因为它们不添加任何每工具列表。Claude 可以直接运行 CLI 命令。

107* **禁用未使用的 servers**:运行 `/mcp` 查看配置的 servers 并禁用您未积极使用的任何 servers。

108 

109### 为类型化语言安装代码智能插件

110 

111[代码智能插件](/zh-CN/discover-plugins#code-intelligence)为 Claude 提供精确的符号导航,而不是基于文本的搜索,减少在探索不熟悉的代码时不必要的文件读取。单个"转到定义"调用替代了可能需要的 grep 后跟读取多个候选文件。已安装的语言服务器还会在编辑后自动报告类型错误,因此 Claude 无需运行编译器即可捕获错误。

112 

113### 将处理卸载到 hooks 和 skills

114 

115自定义[hooks](/zh-CN/hooks)可以在 Claude 看到数据之前对其进行预处理。Claude 不是读取 10,000 行日志文件来查找错误,hook 可以 grep `ERROR` 并仅返回匹配的行,将上下文从数万个令牌减少到数百个。

116 

117[skill](/zh-CN/skills)可以为 Claude 提供领域知识,这样它就不必进行探索。例如,"codebase-overview" skill 可以描述您的项目架构、关键目录和命名约定。当 Claude 调用该 skill 时,它会立即获得此上下文,而不是花费令牌读取多个文件来理解结构。

118 

119例如,此 PreToolUse hook 过滤测试输出以仅显示失败:

120 

121<Tabs>

122 <Tab title="settings.json">

123 将此添加到您的[settings.json](/zh-CN/settings#settings-files)以在每个 Bash 命令之前运行 hook:

124 

125 ```json theme={null}

126 {

127 "hooks": {

128 "PreToolUse": [

129 {

130 "matcher": "Bash",

131 "hooks": [

132 {

133 "type": "command",

134 "command": "~/.claude/hooks/filter-test-output.sh"

135 }

136 ]

137 }

138 ]

139 }

140 }

141 ```

142 </Tab>

143 

144 <Tab title="filter-test-output.sh">

145 hook 调用此脚本,该脚本检查命令是否为测试运行器并修改它以仅显示失败:

146 

147 ```bash theme={null}

148 #!/bin/bash

149 input=$(cat)

150 cmd=$(echo "$input" | jq -r '.tool_input.command')

151 

152 # If running tests, filter to show only failures

153 if [[ "$cmd" =~ ^(npm test|pytest|go test) ]]; then

154 filtered_cmd="$cmd 2>&1 | grep -A 5 -E '(FAIL|ERROR|error:)' | head -100"

155 echo "{\"hookSpecificOutput\":{\"hookEventName\":\"PreToolUse\",\"permissionDecision\":\"allow\",\"updatedInput\":{\"command\":\"$filtered_cmd\"}}}"

156 else

157 echo "{}"

158 fi

159 ```

160 </Tab>

161</Tabs>

162 

163### 将指令从 CLAUDE.md 移动到 skills

164 

165您的[CLAUDE.md](/zh-CN/memory)文件在会话开始时加载到上下文中。如果它包含特定工作流的详细指令(如 PR 审查或数据库迁移),即使您在做不相关的工作时,这些令牌也会存在。[Skills](/zh-CN/skills)仅在调用时按需加载,因此将专门指令移动到 skills 中可以保持您的基础上下文较小。目标是通过仅包含必要内容来将 CLAUDE.md 保持在 200 行以下。

166 

167### 调整扩展思考

168 

169扩展思考默认启用,因为它显著改进了复杂规划和推理任务的性能。思考令牌作为输出令牌计费,默认预算可能是每个请求数万个令牌,具体取决于模型。对于不需要深度推理的更简单任务,您可以通过在 `/effort` 中或在 `/model` 中降低[努力级别](/zh-CN/model-config#adjust-effort-level)、在 `/config` 中禁用思考或使用 `MAX_THINKING_TOKENS=8000` 降低预算来降低成本。

170 

171### 将冗长的操作委托给 subagents

172 

173运行测试、获取文档或处理日志文件可能会消耗大量上下文。将这些委托给[subagents](/zh-CN/sub-agents#isolate-high-volume-operations),以便冗长的输出保留在 subagent 的上下文中,而只有摘要返回到您的主对话。

174 

175### 管理 agent 团队成本

176 

177当队友在 plan mode 中运行时,Agent 团队使用的令牌大约是标准会话的 7 倍,因为每个队友维护自己的上下文窗口并作为单独的 Claude 实例运行。保持团队任务小且独立,以限制每个队友的令牌使用。有关详细信息,请参阅[agent 团队](/zh-CN/agent-teams)。

178 

179### 编写具体的提示

180 

181模糊的请求(如"改进此代码库")会触发广泛扫描。具体的请求(如"向 auth.ts 中的登录函数添加输入验证")让 Claude 能够以最少的文件读取高效地工作。

182 

183### 高效处理复杂任务

184 

185对于较长或更复杂的工作,这些习惯有助于避免因走错路而浪费的令牌:

186 

187* **对复杂任务使用 plan mode**:按 Shift+Tab 进入[plan mode](/zh-CN/common-workflows#use-plan-mode-for-safe-code-analysis),然后再进行实现。Claude 探索代码库并提出一个方法供您批准,防止当初始方向错误时的昂贵返工。

188* **尽早纠正方向**:如果 Claude 开始朝错误的方向发展,按 Escape 立即停止。使用 `/rewind` 或双击 Escape 将对话和代码恢复到之前的 checkpoint。

189* **给出验证目标**:在您的提示中包含测试用例、粘贴屏幕截图或定义预期输出。当 Claude 可以验证自己的工作时,它会在您需要请求修复之前捕获问题。

190* **增量测试**:编写一个文件,测试它,然后继续。这会在问题便宜时尽早捕获问题。

191 

192## 后台令牌使用

193 

194Claude Code 即使在空闲时也会为某些后台功能使用令牌:

195 

196* **对话总结**:为 `claude --resume` 功能总结以前对话的后台作业

197* **命令处理**:某些命令(如 `/usage`)可能会生成请求以检查状态

198 

199这些后台进程即使没有活跃交互也会消耗少量令牌(通常每个会话不到 \$0.04)。

200 

201## 了解 Claude Code 行为的变化

202 

203Claude Code 定期接收可能改变功能工作方式的更新,包括成本报告。运行 `claude --version` 检查您的当前版本。如有具体计费问题,请通过您的[Console 账户](https://platform.claude.com/login)联系 Anthropic 支持。

data-usage.md +124 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 数据使用

6 

7> 了解 Anthropic 对 Claude 数据使用的政策

8 

9## 数据政策

10 

11### 数据训练政策

12 

13**消费者用户(Free、Pro 和 Max 计划)**:

14我们给您选择是否允许您的数据用于改进未来的 Claude 模型。当此设置打开时,我们将使用来自 Free、Pro 和 Max 账户的数据来训练新模型(包括当您从这些账户使用 Claude Code 时)。

15 

16**商业用户**:(Team 和 Enterprise 计划、API、第三方平台和 Claude Gov)维持现有政策:除非客户选择向我们提供数据以改进模型(例如,[开发者合作伙伴计划](https://support.claude.com/en/articles/11174108-about-the-development-partner-program)),否则 Anthropic 不会使用商业条款下发送到 Claude Code 的代码或提示来训练生成模型。

17 

18### 开发者合作伙伴计划

19 

20如果您明确选择加入通过[开发者合作伙伴计划](https://support.claude.com/en/articles/11174108-about-the-development-partner-program)等方式向我们提供训练材料的方法,我们可能会使用这些提供的材料来训练我们的模型。组织管理员可以明确选择为其组织加入开发者合作伙伴计划。请注意,此计划仅适用于 Anthropic 第一方 API,不适用于 Bedrock 或 Vertex 用户。

21 

22### 使用 `/feedback` 命令的反馈

23 

24如果您选择使用 `/feedback` 命令向我们发送有关 Claude Code 的反馈,我们可能会使用您的反馈来改进我们的产品和服务。通过 `/feedback` 共享的记录保留 5 年。

25 

26### 会话质量调查

27 

28当您在 Claude Code 中看到"Claude 在本次会话中表现如何?"提示时,对此调查的回应(包括选择"关闭")仅记录您的评分。作为此评分提示本身的一部分,我们不收集或存储任何对话记录、输入、输出或其他会话数据。与竖起大拇指/竖起大拇指向下反馈或 `/feedback` 报告不同,此会话质量调查是一个简单的产品满意度指标。

29 

30在评分提示之后,您可能会看到一个单独的后续问题,询问"Anthropic 可以查看您的会话记录以帮助我们改进 Claude Code 吗?"。这是一个与评分不同的可选第二步:

31 

32* **是**:将您的对话记录、任何子代理记录和来自磁盘的原始会话日志文件上传到 Anthropic。已知的 API 密钥和令牌模式在上传前被编辑。源代码、文件内容和其他对话内容按原样上传。共享的记录保留最多 6 个月。

33* **否**:拒绝而不发送任何内容

34* **不再询问**:拒绝并停止此后续在未来会话中出现

35 

36除非您明确选择**是**,否则不会上传任何内容。具有[零数据保留](/zh-CN/zero-data-retention)的组织,或组织政策禁用产品反馈的组织,永远不会看到此后续。您对此调查的回应(包括评分提示后提交的会话记录)不会影响您的数据训练偏好,也不能用于训练我们的 AI 模型。

37 

38要禁用这些调查,请设置 `CLAUDE_CODE_DISABLE_FEEDBACK_SURVEY=1`。当设置 `DISABLE_TELEMETRY` 或 `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC` 时,调查也会被禁用。要控制频率而不是禁用,请在您的设置文件中将 [`feedbackSurveyRate`](/zh-CN/settings#available-settings) 设置为 `0` 到 `1` 之间的概率。

39 

40### 数据保留

41 

42Anthropic 根据您的账户类型和偏好保留 Claude Code 数据。

43 

44**消费者用户(Free、Pro 和 Max 计划)**:

45 

46* 允许数据用于模型改进的用户:5 年保留期,以支持模型开发和安全改进

47* 不允许数据用于模型改进的用户:30 天保留期

48* 隐私设置可以随时在 [claude.ai/settings/data-privacy-controls](https://claude.ai/settings/data-privacy-controls) 更改。

49 

50**商业用户(Team、Enterprise 和 API)**:

51 

52* 标准:30 天保留期

53* [零数据保留](/zh-CN/zero-data-retention):适用于 Claude for Enterprise 上的 Claude Code。ZDR 按组织启用;每个新组织必须由您的账户团队单独启用 ZDR

54* 本地缓存:Claude Code 客户端在 `~/.claude/projects/` 下以纯文本形式本地存储会话记录,默认保留 30 天以启用会话恢复。使用 `cleanupPeriodDays` 调整期限。请参阅[应用程序数据](/zh-CN/claude-directory#application-data)了解存储的内容以及如何清除它。

55 

56您可以随时删除网络上的单个 Claude Code 会话。删除会话会永久删除该会话的事件数据。有关如何删除会话的说明,请参阅[删除会话](/zh-CN/claude-code-on-the-web#delete-sessions)。

57 

58在我们的[隐私中心](https://privacy.anthropic.com/)了解更多关于数据保留实践的信息。

59 

60有关完整详情,请查看我们的[商业服务条款](https://www.anthropic.com/legal/commercial-terms)(适用于 Team、Enterprise 和 API 用户)或[消费者条款](https://www.anthropic.com/legal/consumer-terms)(适用于 Free、Pro 和 Max 用户)和[隐私政策](https://www.anthropic.com/legal/privacy)。

61 

62## 数据访问

63 

64对于所有第一方用户,您可以了解更多关于为[本地 Claude Code](#local-claude-code-data-flow-and-dependencies) 和[远程 Claude Code](#cloud-execution-data-flow-and-dependencies) 记录的数据。[Remote Control](/zh-CN/remote-control) 会话遵循本地数据流,因为所有执行都发生在您的机器上。请注意,对于远程 Claude Code,Claude 访问您启动 Claude Code 会话的存储库。Claude 不访问您已连接但未在其中启动会话的存储库。

65 

66## 本地 Claude Code:数据流和依赖关系

67 

68下面的图表显示了 Claude Code 在安装和正常操作期间如何连接到外部服务。实线表示必需的连接,而虚线表示可选或用户启动的数据流。

69 

70<img src="https://mintcdn.com/claude-code/YcBW2H7CArGcduPb/images/claude-code-data-flow.svg?fit=max&auto=format&n=YcBW2H7CArGcduPb&q=85&s=b600a89f84fc86f9ff7be00a466c0635" alt="显示 Claude Code 外部连接的图表:安装/更新连接到分发服务器,用户请求连接到 Anthropic 服务,包括 Console 身份验证、public-api,以及可选的 Statsig、Sentry 和错误报告" width="720" height="520" data-path="images/claude-code-data-flow.svg" />

71 

72Claude Code 在本地运行。为了与 LLM 交互,Claude Code 通过网络发送数据。此数据包括所有用户提示和模型输出,通过 TLS 1.2+ 在传输中加密。Claude Code 与大多数流行的 VPN 和 LLM 代理兼容。

73 

74静止时的加密取决于您的模型提供商:

75 

76| 提供商 | 静止时加密 |

77| ---------------------- | ------------------------------------------------------------------------------------- |

78| Anthropic API | 基础设施级磁盘加密 (AES-256)。启用 [Zero Data Retention](/zh-CN/zero-data-retention) 以实现无服务器端持久化。 |

79| Amazon Bedrock | AES-256,使用 AWS 管理的密钥。可通过 AWS KMS 获得客户管理的密钥。 |

80| Google Cloud Vertex AI | Google 管理的加密密钥。CMEK 可用。 |

81| Microsoft Foundry | 请求路由到 Anthropic 基础设施,使用 AES-256 磁盘加密。 |

82 

83Claude Code 基于 Anthropic 的 API 构建。有关 API 安全控制的详情,包括 API 日志记录程序,请参阅 [Anthropic 信任中心](https://trust.anthropic.com)中的合规工件。

84 

85### 云执行:数据流和依赖关系

86 

87使用[网络上的 Claude Code](/zh-CN/claude-code-on-the-web) 时,会话在 Anthropic 管理的虚拟机中运行,而不是在本地运行。在云环境中:

88 

89* \*\*代码和数据存储:\*\*您的存储库被克隆到隔离的 VM。代码和会话数据受您的账户类型的保留和使用政策约束(请参阅上面的数据保留部分)

90* \*\*凭证:\*\*GitHub 身份验证通过安全代理处理;您的 GitHub 凭证永远不会进入沙箱

91* \*\*网络流量:\*\*所有出站流量都通过安全代理进行审计日志记录和滥用防止

92* \*\*会话数据:\*\*提示、代码更改和输出遵循与本地 Claude Code 使用相同的数据政策

93 

94有关云执行的安全详情,请参阅[安全](/zh-CN/security#cloud-execution-security)。

95 

96## 遥测服务

97 

98Claude Code 从用户的机器连接到 Statsig 服务,以记录操作指标,例如延迟、可靠性和使用模式。此日志记录不包括任何代码或文件路径。数据使用 TLS 在传输中加密,使用 256 位 AES 加密在静止时加密。在 [Statsig 安全文档](https://www.statsig.com/trust/security)中了解更多。要选择退出 Statsig 遥测,请设置 `DISABLE_TELEMETRY` 环境变量。

99 

100Claude Code 从用户的机器连接到 Sentry 以进行操作错误日志记录。数据使用 TLS 在传输中加密,使用 256 位 AES 加密在静止时加密。在 [Sentry 安全文档](https://sentry.io/security/)中了解更多。要选择退出错误日志记录,请设置 `DISABLE_ERROR_REPORTING` 环境变量。

101 

102当用户运行 `/feedback` 命令时,他们的完整对话历史记录(包括代码)的副本被发送到 Anthropic。数据在传输中使用 TLS 加密。可选地,在公共存储库中创建 GitHub 问题。要选择退出,请设置 `DISABLE_FEEDBACK_COMMAND` 环境变量为 `1`。

103 

104## 按 API 提供商的默认行为

105 

106默认情况下,当使用 Bedrock、Vertex 或 Foundry 时,错误报告、遥测和错误报告被禁用。会话质量调查和 WebFetch 域安全检查是例外,无论提供商如何都会运行。您可以通过设置 `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC` 一次选择退出所有非必需的流量,包括调查。此变量不影响 WebFetch 检查,它有自己的选择退出选项。以下是完整的默认行为:

107 

108| 服务 | Claude API | Vertex API | Bedrock API | Foundry API |

109| ------------------------------ | -------------------------------------------------------------------------- | -------------------------------------------------------------------------- | -------------------------------------------------------------------------- | -------------------------------------------------------------------------- |

110| **Statsig(指标)** | 默认开启。<br />`DISABLE_TELEMETRY=1` 禁用。 | 默认关闭。<br />`CLAUDE_CODE_USE_VERTEX` 必须为 1。 | 默认关闭。<br />`CLAUDE_CODE_USE_BEDROCK` 必须为 1。 | 默认关闭。<br />`CLAUDE_CODE_USE_FOUNDRY` 必须为 1。 |

111| **Sentry(错误)** | 默认开启。<br />`DISABLE_ERROR_REPORTING=1` 禁用。 | 默认关闭。<br />`CLAUDE_CODE_USE_VERTEX` 必须为 1。 | 默认关闭。<br />`CLAUDE_CODE_USE_BEDROCK` 必须为 1。 | 默认关闭。<br />`CLAUDE_CODE_USE_FOUNDRY` 必须为 1。 |

112| **Claude API(`/feedback` 报告)** | 默认开启。<br />`DISABLE_FEEDBACK_COMMAND=1` 禁用。 | 默认关闭。<br />`CLAUDE_CODE_USE_VERTEX` 必须为 1。 | 默认关闭。<br />`CLAUDE_CODE_USE_BEDROCK` 必须为 1。 | 默认关闭。<br />`CLAUDE_CODE_USE_FOUNDRY` 必须为 1。 |

113| **会话质量调查** | 默认开启。<br />`CLAUDE_CODE_DISABLE_FEEDBACK_SURVEY=1` 禁用。 | 默认开启。<br />`CLAUDE_CODE_DISABLE_FEEDBACK_SURVEY=1` 禁用。 | 默认开启。<br />`CLAUDE_CODE_DISABLE_FEEDBACK_SURVEY=1` 禁用。 | 默认开启。<br />`CLAUDE_CODE_DISABLE_FEEDBACK_SURVEY=1` 禁用。 |

114| **WebFetch 域安全检查** | 默认开启。<br />[settings](/zh-CN/settings) 中 `skipWebFetchPreflight: true` 禁用。 | 默认开启。<br />[settings](/zh-CN/settings) 中 `skipWebFetchPreflight: true` 禁用。 | 默认开启。<br />[settings](/zh-CN/settings) 中 `skipWebFetchPreflight: true` 禁用。 | 默认开启。<br />[settings](/zh-CN/settings) 中 `skipWebFetchPreflight: true` 禁用。 |

115 

116所有环境变量都可以检查到 `settings.json`(请参阅 [settings 参考](/zh-CN/settings))。

117 

118从 v2.1.126 开始,当主机平台设置 `CLAUDE_CODE_PROVIDER_MANAGED_BY_HOST` 时,Statsig 指标对于 Vertex、Bedrock 和 Foundry 默认开启,并遵循标准的 `DISABLE_TELEMETRY` 选择退出。Sentry 错误报告和 `/feedback` 报告在这些提供商上仍然默认关闭。

119 

120### WebFetch 域安全检查

121 

122在获取 URL 之前,WebFetch 工具将请求的主机名发送到 `api.anthropic.com` 以根据 Anthropic 维护的安全阻止列表进行检查。仅发送主机名,不发送完整 URL、路径或页面内容。结果按主机名缓存五分钟。

123 

124无论您使用哪个模型提供商,此检查都会运行,不受 `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC` 影响。如果您的网络阻止 `api.anthropic.com`,WebFetch 请求将失败,直到您允许列表该域或在 [settings](/zh-CN/settings) 中设置 `skipWebFetchPreflight: true`。禁用检查意味着 WebFetch 尝试检索任何 URL 而不咨询阻止列表,因此如果您需要限制 Claude 可以访问的域,请将其与 [`WebFetch` 权限规则](/zh-CN/permissions#webfetch) 结合使用。

debug-your-config.md +97 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 调试你的配置

6 

7> 诊断为什么 CLAUDE.md、settings、hooks、MCP 服务器或 skills 没有生效。使用 /context、/doctor、/hooks 和 /mcp 来查看实际加载了什么。

8 

9当 Claude 忽略了一条指令或你配置的功能没有出现时,通常是因为文件没有加载、从你预期之外的位置加载,或者被另一个文件覆盖了。本指南展示了如何检查 Claude Code 实际加载了什么,以便你能够缩小范围。

10 

11对于安装、身份验证和连接问题,请参阅[故障排除安装和登录](/zh-CN/troubleshoot-install)。

12 

13## 查看加载到上下文中的内容

14 

15`/context` 命令显示当前会话中占用上下文窗口的所有内容,按类别分解:系统提示、内存文件、skills、MCP 工具和对话消息。首先运行它来确认你的 `CLAUDE.md`、规则或 skill 描述是否存在。

16 

17对于特定类别的详细信息,请使用专用命令:

18 

19| 命令 | 显示内容 |

20| :------------- | :------------------------------- |

21| `/memory` | 加载了哪些 `CLAUDE.md` 和规则文件,加上自动内存条目 |

22| `/skills` | 来自项目、用户和插件源的可用 skills |

23| `/agents` | 配置的子代理及其设置 |

24| `/hooks` | 活跃的 hook 配置 |

25| `/mcp` | 连接的 MCP 服务器及其状态 |

26| `/permissions` | 当前生效的已解析允许和拒绝规则 |

27| `/doctor` | 配置诊断:无效的键、schema 错误、安装健康状况 |

28| `/status` | 活跃的设置源,包括是否启用了托管设置 |

29 

30如果内存文件在 `/memory` 中缺失,请根据[CLAUDE.md 文件如何加载](/zh-CN/memory#how-claude-md-files-load)检查其位置。子目录 `CLAUDE.md` 文件在 Claude 使用 Read 工具读取该目录中的文件时按需加载,而不是在会话开始时加载。

31 

32如果 `/memory` 确认文件已加载但 Claude 仍然没有遵循特定指令,问题可能在于指令的编写方式,而不是是否加载。CLAUDE.md 适用于你会给新队友的指导类型,例如项目约定、构建命令和文件位置。

33 

34当指令足够模糊以至于可以多种方式解释、两个文件给出相互矛盾的方向,或者文件变得足够长以至于单个规则获得较少关注时,遵守度会下降。[编写有效的指令](/zh-CN/memory#write-effective-instructions)涵盖了保持高遵守度的特异性、大小和结构模式。

35 

36<Note>

37 CLAUDE.md 和权限解决不同的问题。CLAUDE.md 告诉 Claude 你的项目如何工作,以便它做出好的决定。[权限](/zh-CN/permissions)和[hooks](/zh-CN/hooks)无论 Claude 决定什么都强制执行限制。对于"我们在这里这样做"使用 CLAUDE.md。对于安全边界和任何必须永远不会发生的事情,使用权限或 hooks,你需要一个保证而不是指导。

38</Note>

39 

40## 检查已解析的设置

41 

42设置在托管、用户、项目和本地范围内合并。当存在时,托管设置总是优先。在其余的中,更接近的范围按本地、项目、用户的顺序覆盖更广泛的范围。某些设置也可以由命令行标志或[环境变量](/zh-CN/env-vars)设置,它们充当另一个覆盖层。当设置似乎不适用时,你设置的值通常被另一个范围或环境变量覆盖。

43 

44运行 `/doctor` 来验证你的配置文件并显示无效的键或 schema 错误。运行 `/status` 来查看哪些设置源是活跃的,包括是否启用了托管设置。要了解给定键哪个范围优先,请参阅[范围如何交互](/zh-CN/settings#how-scopes-interact)。

45 

46## 检查 MCP 服务器

47 

48运行 `/mcp` 来查看每个配置的服务器、其连接状态以及你是否为当前项目批准了它。服务器可以定义正确但仍然不提供工具,原因有几个常见的:

49 

50* `.mcp.json` 中的项目范围服务器需要一次性批准。如果提示被关闭,服务器将保持禁用状态,直到你从 `/mcp` 批准它。

51* 启动失败的服务器在 `/mcp` 中显示为失败。`command` 或 `args` 中的相对文件路径是一个常见原因,因为它们相对于你启动 Claude Code 的目录而不是 `.mcp.json` 的位置进行解析。

52* 显示为已连接但列出零个工具的服务器已成功启动但没有返回工具列表。从 `/mcp` 选择**重新连接**。如果计数保持为零,运行 `claude --debug mcp` 来查看服务器的 stderr 输出。

53 

54对于配置位置和范围规则,请参阅[MCP](/zh-CN/mcp)。

55 

56## 检查 hooks

57 

58运行 `/hooks` 来列出当前会话注册的每个 hook,按事件分组。如果你定义的 hook 没有出现,它没有被读取:hooks 在设置文件中的 `"hooks"` 键下,而不是在独立文件中。

59 

60如果 hook 出现但没有触发,匹配器通常是原因。`matcher` 字段是一个使用 `|` 来匹配多个工具名称的单个字符串,例如 `"Edit|Write"`。拼写错误的工具名称会无声地失败,因为匹配器永远不会匹配。数组值是一个 schema 错误:Claude Code 显示设置错误通知,`/doctor` 报告验证失败,hook 条目被删除,所以它不会出现在 `/hooks` 中。

61 

62对 `settings.json` 的编辑在短暂的文件稳定延迟后在运行的会话中生效。你不需要重新启动。如果保存后几秒钟 `/hooks` 仍然显示旧定义,再次运行 `/hooks` 来刷新视图。

63 

64如果 `/hooks` 显示 hook 但它仍然没有触发,下一步是实时观察 hook 评估。使用 `claude --debug hooks` 启动会话并触发工具调用。调试日志记录每个事件、检查了哪些匹配器以及 hook 的退出代码和输出。有关日志格式,请参阅[调试 hooks](/zh-CN/hooks#debug-hooks),有关常见失败模式,请参阅[hooks 故障排除](/zh-CN/hooks-guide#limitations-and-troubleshooting)。

65 

66## 常见原因

67 

68大多数配置意外可以追溯到一小组位置和语法规则。在假设存在错误之前检查这些:

69 

70| 症状 | 原因 | 修复 |

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

72| Hook 永远不触发 | `matcher` 是 JSON 数组而不是字符串 | 使用单个字符串,其中 `\|` 匹配多个工具,例如 `"Edit\|Write"`。请参阅[匹配器模式](/zh-CN/hooks#matcher-patterns)。 |

73| Hook 永远不触发 | `matcher` 值是小写的,例如 `"bash"` | 匹配是区分大小写的。工具名称是大写的:`Bash`、`Edit`、`Write`、`Read`。 |

74| Hook 永远不触发 | Hooks 在独立的 `.claude/hooks.json` 文件中 | 没有独立的 hooks 文件。在 `settings.json` 中的 `"hooks"` 键下定义 hooks。请参阅[hook 配置](/zh-CN/hooks)。 |

75| 全局设置的权限、hooks 或 env 被忽略 | 配置被添加到 `~/.claude.json` | `~/.claude.json` 保存应用状态和 UI 切换。`permissions`、`hooks` 和 `env` 属于 `~/.claude/settings.json`。这是两个不同的文件。 |

76| `settings.json` 值似乎被忽略 | 相同的键在 `settings.local.json` 中设置 | `settings.local.json` 覆盖 `settings.json`,两者都覆盖 `~/.claude/settings.json`。请参阅[设置优先级](/zh-CN/settings#how-scopes-interact)。 |

77| Skill 没有出现在 `/skills` 中 | Skill 文件在 `.claude/skills/name.md` 而不是在文件夹中 | 使用包含 `SKILL.md` 的文件夹:`.claude/skills/name/SKILL.md`。 |

78| Skill 出现在 `/skills` 中但 Claude 从不调用它 | Skill 在其 frontmatter 中有 `disable-model-invocation: true`,或其描述与你表述请求的方式不匹配 | 检查 `/skills` 中的徽章:一个"user-only"标签意味着 Claude 不会自动触发它。请参阅[skill 调用](/zh-CN/skills)。 |

79| 子目录 `CLAUDE.md` 指令似乎被忽略 | 子目录文件按需加载,而不是在会话开始时加载 | 它们在 Claude 使用 Read 工具读取该目录中的文件时加载,而不是在启动时,也不是在写入或创建文件时。请参阅[CLAUDE.md 文件如何加载](/zh-CN/memory#how-claude-md-files-load)。 |

80| 子代理忽略 `CLAUDE.md` 指令 | 子代理不总是继承项目内存 | 将关键规则放在代理文件体中,它成为子代理的系统提示。请参阅[子代理配置](/zh-CN/sub-agents)。 |

81| 清理逻辑在会话结束时永远不运行 | 没有配置 `SessionEnd` hook | 在 `settings.json` 中添加 `SessionEnd` hook。请参阅[hook 事件列表](/zh-CN/hooks#hook-events)。 |

82| `.mcp.json` 中的 MCP 服务器永远不加载 | 文件在 `.claude/` 下或使用 Claude Desktop 的配置格式 | 项目 MCP 配置在存储库根目录下作为 `.mcp.json`,而不是在 `.claude/` 内。请参阅[MCP 配置](/zh-CN/mcp)。 |

83| 添加的项目 MCP 服务器没有出现 | 一次性批准提示被关闭 | 项目范围的服务器需要批准。运行 `/mcp` 来查看状态并批准。 |

84| MCP 服务器从某些目录启动失败 | `command` 或 `args` 使用相对文件路径 | 对本地脚本使用绝对路径。你的 `PATH` 上的可执行文件如 `npx` 或 `uvx` 可以按原样工作。 |

85| MCP 服务器启动时没有预期的环境变量 | 变量在 `settings.json` `env` 中,不会传播到 MCP 子进程 | 在 `.mcp.json` 中设置每个服务器的 `env`。 |

86| `Bash(rm *)` 拒绝规则不阻止 `/bin/rm` 或 `find -delete` | 前缀规则匹配字面命令字符串,而不是底层可执行文件 | 为每个变体添加显式模式,或使用[PreToolUse hook](/zh-CN/hooks-guide)或[sandbox](/zh-CN/sandboxing)来获得硬保证。 |

87 

88## 相关资源

89 

90有关每个配置表面的完整参考,请参阅专用页面:

91 

92* **[`.claude` 目录参考](/zh-CN/claude-directory)**:每个配置文件位置及其读取方式

93* **[Settings](/zh-CN/settings)**:优先级顺序和完整的键列表

94* **[Hooks 参考](/zh-CN/hooks)**:事件名称、有效负载和 `--debug hooks` 输出格式

95* **[MCP](/zh-CN/mcp)**:服务器配置、批准和 `/mcp` 输出

96* **[故障排除安装和登录](/zh-CN/troubleshoot-install)**:`command not found`、PATH 和身份验证问题

97* **[故障排除](/zh-CN/troubleshooting)**:性能、挂起和搜索问题

desktop.md +761 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 使用 Claude Code Desktop

6 

7> 充分利用 Claude Code Desktop:使用 Git 隔离的并行会话、拖放窗格布局、集成终端和文件编辑器、侧边聊天、计算机使用、从手机 Dispatch 会话、可视化 diff 审查、应用预览、PR 监控、连接器和企业配置。

8 

9Claude Desktop 应用有三个选项卡:**Chat** 用于对话,**Cowork** 用于 [Dispatch 和更长的代理工作](https://claude.com/product/cowork),**Code** 用于软件开发。本页是 Code 选项卡的参考。

10 

11<CardGroup cols={2}>

12 <Card title="Download for macOS" icon="apple" href="https://claude.ai/api/desktop/darwin/universal/dmg/latest/redirect?utm_source=claude_code&utm_medium=docs">

13 Universal build for Intel and Apple Silicon

14 </Card>

15 

16 <Card title="Download for Windows" icon="windows" href="https://claude.ai/api/desktop/win32/x64/setup/latest/redirect?utm_source=claude_code&utm_medium=docs">

17 For x64 processors

18 </Card>

19</CardGroup>

20 

21For Windows ARM64, download the [ARM64 installer](https://claude.ai/api/desktop/win32/arm64/setup/latest/redirect?utm_source=claude_code\&utm_medium=docs). The desktop app is not available on Linux; use the [CLI](/en/quickstart) instead.

22 

23安装后,启动 Claude,登录,然后点击 **Code** 选项卡。第一次在 Windows 上打开它时,你需要安装 [Git for Windows](https://git-scm.com/downloads/win);安装后重启应用。有关首次会话的演练,请参阅[快速开始指南](/zh-CN/desktop-quickstart)。

24 

25在 Code 选项卡中,每个对话都是一个**会话**:它有自己的聊天历史、项目文件夹和代码更改,独立于任何其他会话。侧边栏列出你的会话,让你可以并行运行多个会话。在一个会话中,你可以:

26 

27* [使用 diff 视图审查和评论更改](#review-changes-with-diff-view),然后[通过 CI 监控生成的 PR](#monitor-pull-request-status)

28* [在嵌入式浏览器中预览你的运行应用](#preview-your-app),同时 Claude 验证自己的更改

29* [整理窗格](#arrange-your-workspace),将聊天、diff、预览、终端和文件编辑器并排放置

30* 提出[侧边问题](#ask-a-side-question-without-derailing-the-session),使用会话的上下文而不偏离主线

31* [连接外部工具](#connect-external-tools),如 GitHub、Slack 和 Linear

32* 让 Claude [打开应用和控制你的屏幕](#let-claude-use-your-computer)

33* 在你的机器上、[云中](#run-long-running-tasks-remotely)或通过 [SSH](#ssh-sessions) 运行

34 

35有关[计划的定期工作](/zh-CN/desktop-scheduled-tasks)、[快捷键](#keyboard-shortcuts)或[从手机发送任务](#sessions-from-dispatch),请参阅链接的页面和部分。如果你已经使用基于终端的 CLI,请参阅 [CLI 比较](#coming-from-the-cli)了解哪些内容可以继续使用。

36 

37## 启动会话

38 

39在发送第一条消息之前,在提示区域配置四件事:

40 

41* **环境**:选择 Claude 运行的位置。选择 **Local** 用于你的机器,**Remote** 用于 Anthropic 托管的云会话,或[**SSH 连接**](#ssh-sessions)用于你管理的远程机器。请参阅[环境配置](#environment-configuration)。

42* **项目文件夹**:选择 Claude 工作的文件夹或存储库。对于远程会话,你可以添加[多个存储库](#run-long-running-tasks-remotely)。

43* **模型**:从发送按钮旁的下拉菜单中选择一个[模型](/zh-CN/model-config#available-models)。你可以在会话期间更改此设置。

44* **权限模式**:从[模式选择器](#choose-a-permission-mode)中选择 Claude 拥有多少自主权。你可以在会话期间更改此设置。

45 

46输入你的任务并按 **Enter** 启动。每个会话独立跟踪其自己的上下文和更改。

47 

48## 使用代码

49 

50为 Claude 提供正确的上下文,控制它自己做多少工作,并审查它更改的内容。

51 

52### 使用提示框

53 

54输入你想让 Claude 做的事情并按 **Enter** 发送。Claude 读取你的项目文件,进行更改,并根据你的[权限模式](#choose-a-permission-mode)运行命令。你可以随时中断 Claude:点击停止按钮或输入你的更正并按 **Enter**。Claude 停止正在做的事情并根据你的输入进行调整。

55 

56提示框旁的 **+** 按钮让你可以访问文件附件、[skills](#use-skills)、[连接器](#connect-external-tools) 和[插件](#install-plugins)。

57 

58### 向提示添加文件和上下文

59 

60提示框支持两种方式来引入外部上下文:

61 

62* **@mention 文件**:输入 `@` 后跟文件名,将文件添加到对话上下文。Claude 然后可以读取和引用该文件。@mention 在远程会话中不可用。

63* **附加文件**:使用附件按钮将图像、PDF 和其他文件附加到你的提示,或直接将文件拖放到提示中。这对于共享错误的屏幕截图、设计模型或参考文档很有用。

64 

65### 选择权限模式

66 

67权限模式控制 Claude 在会话期间拥有多少自主权:它是否在编辑文件、运行命令或两者之前询问。你可以随时使用发送按钮旁的模式选择器切换模式。从"询问权限"开始以准确查看 Claude 的操作,然后随着你变得更舒适,转移到"自动接受编辑"或 Plan Mode。

68 

69| 模式 | 设置键 | 行为 |

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

71| **询问权限** | `default` | Claude 在编辑文件或运行命令之前询问。你会看到一个 diff,可以接受或拒绝每个更改。推荐给新用户。 |

72| **自动接受编辑** | `acceptEdits` | Claude 自动接受文件编辑和常见的文件系统命令,如 `mkdir`、`touch` 和 `mv`,但在运行其他终端命令之前仍然询问。当你信任文件更改并想要更快的迭代时,使用此选项。 |

73| **Plan Mode** | `plan` | Claude 读取文件并运行命令来探索,然后提出计划而不编辑你的源代码。适合复杂任务,你想先审查方法。 |

74| **Auto** | `auto` | Claude 执行所有操作,并进行后台安全检查以验证与你的请求的一致性。减少权限提示,同时保持监督。在你的设置 → Claude Code 中启用。请参阅下面的[可用性要求](#auto-mode-availability)。 |

75| **绕过权限** | `bypassPermissions` | Claude 运行时没有任何权限提示,等同于 CLI 中的 `--dangerously-skip-permissions`。在设置 → Claude Code 中的"允许绕过权限模式"下启用。仅在沙箱容器或虚拟机中使用。企业管理员可以禁用此选项。 |

76 

77`dontAsk` 权限模式仅在 [CLI](/zh-CN/permission-modes#allow-only-pre-approved-tools-with-dontask-mode) 中可用。

78 

79<span id="auto-mode-availability" />

80 

81Auto mode 是一个研究预览版,在 Max、Team、Enterprise 和 API 计划上可用。在 Pro 计划或第三方提供商上不可用。在 Team、Enterprise 和 API 计划上,它需要 Claude Sonnet 4.6、Opus 4.6 或 Opus 4.7。在 Max 计划上,它需要 Claude Opus 4.7。

82 

83<Tip title="最佳实践">

84 在 Plan Mode 中启动复杂任务,以便 Claude 在进行更改之前制定方法。一旦你批准计划,切换到"自动接受编辑"或"询问权限"来执行它。有关此工作流的更多信息,请参阅[先探索,然后计划,然后编码](/zh-CN/best-practices#explore-first-then-plan-then-code)。

85</Tip>

86 

87远程会话支持"自动接受编辑"和 Plan Mode。"询问权限"不可用,因为远程会话默认自动接受文件编辑,"绕过权限"不可用,因为远程环境已经是沙箱化的。

88 

89企业管理员可以限制哪些权限模式可用。有关详细信息,请参阅[企业配置](#enterprise-configuration)。

90 

91### 预览你的应用

92 

93Claude 可以启动开发服务器并打开嵌入式浏览器来验证其更改。这适用于前端 Web 应用以及后端服务器:Claude 可以测试 API 端点、查看服务器日志并迭代它发现的问题。在大多数情况下,Claude 在编辑项目文件后自动启动服务器。你也可以随时要求 Claude 预览。默认情况下,Claude [自动验证](#auto-verify-changes)每次编辑后的更改。

94 

95预览窗格也可以打开项目中的静态 HTML 文件、PDF、图像和视频。点击聊天中的 HTML、PDF、图像或视频路径在预览中打开它。

96 

97从预览窗格,你可以:

98 

99* 在嵌入式浏览器中直接与你运行的应用交互

100* 观看 Claude 自动验证其自己的更改:它拍摄屏幕截图、检查 DOM、点击元素、填充表单并修复它发现的问题

101* 从会话工具栏中的 **Preview** 下拉菜单启动或停止服务器

102* 通过在下拉菜单中选择 **Persist sessions** 来在服务器重启时保持 cookie 和本地存储,这样你就不必在开发期间重新登录

103* 编辑服务器配置或一次停止所有服务器

104 

105Claude 根据你的项目创建初始服务器配置。如果你的应用使用自定义开发命令,编辑 `.claude/launch.json` 以匹配你的设置。有关完整参考,请参阅[配置预览服务器](#configure-preview-servers)。

106 

107要清除保存的会话数据,在设置 → Claude Code 中切换 **Persist preview sessions** 关闭。要完全禁用预览,在设置 → Claude Code 中切换 **Preview** 关闭。

108 

109### 使用 diff 视图审查更改

110 

111Claude 对你的代码进行更改后,diff 视图让你在创建拉取请求之前逐个文件审查修改。

112 

113当 Claude 更改文件时,会出现一个 diff 统计指示器,显示添加和删除的行数,例如 `+12 -1`。点击此指示器打开 diff 查看器,它在左侧显示文件列表,在右侧显示每个文件的更改。

114 

115要对特定行进行注释,点击 diff 中的任何行以打开注释框。输入你的反馈并按 **Enter** 添加注释。在多行添加注释后,一次提交所有注释:

116 

117* **macOS**:按 **Cmd+Enter**

118* **Windows**:按 **Ctrl+Enter**

119 

120Claude 读取你的注释并进行请求的更改,这些更改显示为你可以审查的新 diff。

121 

122### 审查你的代码

123 

124在 diff 视图中,点击右上角工具栏中的 **Review code** 来要求 Claude 在你提交之前评估更改。Claude 检查当前 diff 并直接在 diff 视图中留下注释。你可以回复任何注释或要求 Claude 修改。

125 

126审查侧重于高信号问题:编译错误、明确的逻辑错误、安全漏洞和明显的错误。它不标记样式、格式、预先存在的问题或 linter 会捕获的任何内容。

127 

128### 监控拉取请求状态

129 

130打开拉取请求后,CI 状态栏出现在会话中。Claude Code 使用 GitHub CLI 轮询检查结果并显示失败。

131 

132* **自动修复**:启用后,Claude 通过读取失败输出并迭代来自动尝试修复失败的 CI 检查。

133* **自动合并**:启用后,Claude 在所有检查通过后合并 PR。合并方法是压缩。自动合并必须在你的 GitHub 存储库设置中[启用](https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/configuring-pull-request-merges/managing-auto-merge-for-pull-requests-in-your-repository)才能工作。

134 

135使用 CI 状态栏中的 **Auto-fix** 和 **Auto-merge** 切换来启用任一选项。Claude Code 还在 CI 完成时发送桌面通知。要在 PR 合并或关闭后自动存档会话,在设置 → Claude Code 中打开[自动存档](#work-in-parallel-with-sessions)。

136 

137<Note>

138 PR 监控需要在你的机器上安装并验证 [GitHub CLI (`gh`)](https://cli.github.com/)。如果未安装 `gh`,Desktop 会在你第一次尝试创建 PR 时提示你安装它。

139</Note>

140 

141## 整理工作区

142 

143Code 选项卡围绕你可以以任何布局排列的窗格构建:聊天、diff、预览、终端、文件、plan、tasks 和 subagent。通过其标题拖动窗格来重新定位它,或拖动窗格边缘来调整大小。在 macOS 上按 **Cmd+\\** 或在 Windows 上按 **Ctrl+\\** 来关闭焦点窗格。从会话工具栏中的 **Views** 菜单打开其他窗格。

144 

145<Note>

146 本部分中的窗格布局、终端、文件编辑器和视图模式需要 Claude Desktop v1.2581.0 或更高版本。在 macOS 上打开 **Claude → Check for Updates** 或在 Windows 上打开 **Help → Check for Updates** 来更新。

147</Note>

148 

149### 在终端中运行命令

150 

151集成终端让你在不切换到另一个应用的情况下运行命令。从 **Views** 菜单打开它,或在 macOS 或 Windows 上按 **Ctrl+\`**。终端在你的会话工作目录中打开,并与 Claude 共享相同的环境,因此 `npm test` 或 `git status` 等命令看到 Claude 正在编辑的相同文件。终端仅在本地会话中可用。

152 

153### 打开和编辑文件

154 

155点击聊天或 diff 查看器中的文件路径在文件窗格中打开它。HTML、PDF、图像和视频路径改为在[预览窗格](#preview-your-app)中打开。进行现场编辑并点击 **Save** 来写回。如果文件自你打开它以来在磁盘上更改,窗格会警告你并让你覆盖或丢弃。点击 **Discard** 来恢复你的编辑,或点击窗格标题中的路径来复制绝对路径。

156 

157文件窗格在本地和 SSH 会话中可用。对于远程会话,要求 Claude 进行更改。

158 

159### 在其他应用中打开文件

160 

161右键点击聊天、diff 查看器或文件窗格中的任何文件路径来打开上下文菜单:

162 

163* **Attach as context**:将文件添加到你的下一个提示

164* **Open in**:在已安装的编辑器(如 VS Code、Cursor 或 Zed)中打开文件

165* **Show in Finder**(macOS)、**Show in Explorer**(Windows):打开包含文件夹

166* **Copy path**:将绝对路径复制到你的剪贴板

167 

168### 切换视图模式

169 

170视图模式控制聊天记录中显示多少详细信息。从发送按钮旁的 **Transcript view** 下拉菜单切换模式,或在 macOS 或 Windows 上按 **Ctrl+O** 来循环浏览它们。

171 

172| 模式 | 显示内容 |

173| ----------- | -------------------------- |

174| **Normal** | 工具调用折叠成摘要,带有完整文本响应 |

175| **Verbose** | Claude 采取的每个工具调用、文件读取和中间步骤 |

176| **Summary** | 仅 Claude 的最终响应和它所做的更改 |

177 

178在调试 Claude 为什么采取特定操作时使用 Verbose。当你运行多个会话并想快速扫描结果时使用 Summary。

179 

180### 快捷键

181 

182在 macOS 上按 **Cmd+/** 或在 Windows 上按 **Ctrl+/** 来查看 Code 选项卡中可用的所有快捷键。在 Windows 上,对下面的快捷键使用 **Ctrl** 代替 **Cmd**。会话循环、终端切换和视图模式切换在每个平台上使用 **Ctrl**。

183 

184| 快捷键 | 操作 |

185| ------------------------------------- | ------------- |

186| `Cmd` `/` | 显示快捷键 |

187| `Cmd` `N` | 新会话 |

188| `Cmd` `W` | 关闭会话 |

189| `Ctrl` `Tab` / `Ctrl` `Shift` `Tab` | 下一个或上一个会话 |

190| `Cmd` `Shift` `]` / `Cmd` `Shift` `[` | 下一个或上一个会话 |

191| `Esc` | 停止 Claude 的响应 |

192| `Cmd` `Shift` `D` | 切换 diff 窗格 |

193| `Cmd` `Shift` `P` | 切换预览窗格 |

194| `Cmd` `Shift` `S` | 在预览中选择元素 |

195| `Ctrl` `` ` `` | 切换终端窗格 |

196| `Cmd` `\` | 关闭焦点窗格 |

197| `Cmd` `;` | 打开侧边聊天 |

198| `Ctrl` `O` | 循环视图模式 |

199| `Cmd` `Shift` `M` | 打开权限模式菜单 |

200| `Cmd` `Shift` `I` | 打开模型菜单 |

201| `Cmd` `Shift` `E` | 打开工作量菜单 |

202| `1`–`9` | 在打开的菜单中选择项目 |

203 

204这些快捷键仅适用于 Code 选项卡。基于终端的[交互模式快捷键](/zh-CN/interactive-mode#keyboard-shortcuts)(如 `Shift+Tab` 来循环模式)在 Desktop 中不适用。

205 

206### 检查使用情况

207 

208点击模型选择器旁的使用环形图来查看你当前的上下文窗口使用情况和你的计划在该期间的使用情况。上下文使用是按会话的;计划使用在所有 Claude Code 表面上共享。

209 

210## 让 Claude 使用你的计算机

211 

212计算机使用让 Claude 打开你的应用、控制你的屏幕,并像你一样直接在你的机器上工作。要求 Claude 在移动模拟器中测试原生应用、与没有 CLI 的桌面工具交互,或自动化只能通过 GUI 工作的东西。

213 

214<Note>

215 计算机使用是 macOS 和 Windows 上的研究预览版,需要 Pro 或 Max 计划。它在 Team 或 Enterprise 计划上不可用。Claude Desktop 应用必须运行。

216</Note>

217 

218计算机使用默认关闭。[在设置中启用它](#enable-computer-use),然后 Claude 才能控制你的屏幕。在 macOS 上,你还需要授予辅助功能和屏幕录制权限。

219 

220<Warning>

221 与[沙箱化 Bash 工具](/zh-CN/sandboxing)不同,计算机使用在你的实际桌面上运行,可以访问你批准的任何内容。Claude 检查每个操作并标记来自屏幕内容的潜在提示注入,但信任边界不同。有关最佳实践,请参阅[计算机使用安全指南](https://support.claude.com/en/articles/14128542)。

222</Warning>

223 

224### 何时应用计算机使用

225 

226Claude 有多种方式与应用或服务交互,计算机使用是最广泛和最慢的。它首先尝试最精确的工具:

227 

228* 如果你有一个服务的[连接器](#connect-external-tools),Claude 使用连接器。

229* 如果任务是 shell 命令,Claude 使用 Bash。

230* 如果任务是浏览器工作且你已设置[Chrome 中的 Claude](/zh-CN/chrome),Claude 使用那个。

231* 如果以上都不适用,Claude 使用计算机使用。

232 

233[按应用访问层](#app-permissions)强化了这一点:浏览器限制为仅查看,终端和 IDE 限制为仅点击,即使计算机使用处于活跃状态,也会引导 Claude 使用专用工具。屏幕控制保留给其他工具无法到达的东西,如原生应用、硬件控制面板、移动模拟器或没有 API 的专有工具。

234 

235### 启用计算机使用

236 

237计算机使用默认关闭。如果你要求 Claude 做需要它的事情而它关闭时,Claude 会告诉你如果在设置中启用计算机使用,它可以完成任务。

238 

239<Steps>

240 <Step title="更新桌面应用">

241 确保你有最新版本的 Claude Desktop。在 [claude.com/download](https://claude.com/download) 下载或更新,然后重启应用。

242 </Step>

243 

244 <Step title="打开切换">

245 在桌面应用中,转到**设置 > 常规**(在**桌面应用**下)。找到**计算机使用**切换并打开它。在 Windows 上,切换立即生效,设置完成。在 macOS 上,继续下一步。

246 

247 如果你看不到切换,确认你在 macOS 或 Windows 上使用 Pro 或 Max 计划,然后更新并重启应用。

248 </Step>

249 

250 <Step title="授予 macOS 权限">

251 在 macOS 上,在切换生效之前授予两个系统权限:

252 

253 * **Accessibility**:让 Claude 点击、输入和滚动

254 * **Screen Recording**:让 Claude 看到你屏幕上的内容

255 

256 设置页面显示每个权限的当前状态。如果任一被拒绝,点击徽章打开相关的系统设置窗格。

257 </Step>

258</Steps>

259 

260### 应用权限

261 

262Claude 第一次需要使用应用时,会话中会出现提示。点击**允许此会话**或**拒绝**。批准持续当前会话,或在 [Dispatch 生成的会话](#sessions-from-dispatch)中持续 30 分钟。

263 

264提示还显示 Claude 为该应用获得的控制级别。这些层由应用类别固定,无法更改:

265 

266| 层 | Claude 可以做什么 | 适用于 |

267| :--- | :---------------- | :------- |

268| 仅查看 | 在屏幕截图中看到应用 | 浏览器、交易平台 |

269| 仅点击 | 点击和滚动,但不能输入或使用快捷键 | 终端、IDE |

270| 完全控制 | 点击、输入、拖动和使用快捷键 | 其他所有内容 |

271 

272像终端、Finder 或文件浏览器以及系统设置或设置这样具有广泛影响的应用在提示中显示额外警告,以便你知道批准它们授予什么。

273 

274你可以在**设置 > 常规**(在**桌面应用**下)中配置两个设置:

275 

276* **拒绝的应用**:在此处添加应用以拒绝它们而不提示。Claude 可能仍然通过允许应用中的操作间接影响被拒绝的应用,但它无法直接与被拒绝的应用交互。

277* **Claude 完成时取消隐藏应用**:当 Claude 工作时,你的其他窗口被隐藏,以便它仅与批准的应用交互。当 Claude 完成时,隐藏的窗口被恢复,除非你关闭此设置。

278 

279## 管理会话

280 

281每个会话是一个独立的对话,拥有自己的上下文和更改。你可以并行运行多个会话、分支侧边聊天、将工作发送到云,或让 Dispatch 从你的手机为你启动会话。

282 

283### 使用会话并行工作

284 

285点击侧边栏中的 **+ New session**,或在 macOS 上按 **Cmd+N** 或在 Windows 上按 **Ctrl+N**,来并行处理多个任务。按 **Ctrl+Tab** 和 **Ctrl+Shift+Tab** 来循环侧边栏中的会话。对于 Git 存储库,每个会话使用 [Git worktrees](/zh-CN/common-workflows#run-parallel-claude-code-sessions-with-git-worktrees) 获得自己的项目隔离副本,因此一个会话中的更改不会影响其他会话,直到你提交它们。

286 

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

288 

289要在新 worktrees 中包含 gitignored 文件(如 `.env`),在你的项目根目录中创建一个[`.worktreeinclude` 文件](/zh-CN/common-workflows#copy-gitignored-files-to-worktrees)。

290 

291<Note>

292 会话隔离需要 [Git](https://git-scm.com/downloads)。大多数 Mac 默认包含 Git。在终端中运行 `git --version` 来检查。在 Windows 上,Git 是 Code 选项卡工作所必需的:[下载 Git for Windows](https://git-scm.com/downloads/win),安装它,然后重启应用。如果你遇到 Git 错误,请在 [Cowork 选项卡](https://claude.com/product/cowork) 中询问 Claude 来帮助排除你的设置。

293</Note>

294 

295使用侧边栏顶部的控制来按状态、项目或环境过滤会话,并按项目分组会话。要重命名会话,点击活跃会话顶部工具栏中的会话标题。要检查上下文使用情况,请参阅[检查使用情况](#check-usage)。当上下文填满时,Claude 自动总结对话并继续工作。你也可以输入 `/compact` 来更早触发总结并释放上下文空间。有关压缩工作原理的详细信息,请参阅[上下文窗口](/zh-CN/how-claude-code-works#the-context-window)。

296 

297### 在不偏离会话的情况下提出侧边问题

298 

299侧边聊天让你提出一个使用你的会话上下文的问题,但不会添加任何内容回到主对话。当你想要理解一段代码、检查一个假设或探索一个想法而不引导会话偏离时,使用它。

300 

301在 macOS 上按 **Cmd+;** 或在 Windows 上按 **Ctrl+;** 来打开侧边聊天,或在提示框中输入 `/btw`。侧边聊天可以读取主线程中到该点为止的所有内容。完成后,关闭侧边聊天并在你离开的地方继续主会话。侧边聊天在本地和 SSH 会话中可用。

302 

303### 观看后台任务

304 

305任务窗格显示在当前会话内运行的后台工作:子代理、后台 shell 命令和工作流。从 **Views** 菜单打开它或将其拖入你的布局。

306 

307点击任何条目来在子代理窗格中查看其输出或停止它。要查看其他会话在做什么,使用[侧边栏](#work-in-parallel-with-sessions)。

308 

309### 远程运行长时间运行的任务

310 

311对于大型重构、测试套件、迁移或其他长时间运行的任务,在启动会话时选择 **Remote** 而不是 **Local**。远程会话在 Anthropic 的云基础设施上运行,即使你关闭应用或关闭计算机,也会继续运行。随时检查进度或引导 Claude 朝不同方向发展。你也可以从 [claude.ai/code](https://claude.ai/code) 或 Claude iOS 应用监控远程会话。

312 

313远程会话也支持多个存储库。选择云环境后,点击存储库 pill 旁的 **+** 按钮向会话添加其他存储库。每个存储库都有自己的分支选择器。这对于跨越多个代码库的任务很有用,例如更新共享库及其使用者。

314 

315有关远程会话如何工作的更多信息,请参阅[Web 上的 Claude Code](/zh-CN/claude-code-on-the-web)。

316 

317### 在另一个表面继续

318 

319**Continue in** 菜单,可从会话工具栏右下角的 VS Code 图标访问,让你将会话移动到另一个表面:

320 

321* **Web 上的 Claude Code**:将你的本地会话发送到远程继续运行。Desktop 推送你的分支,生成对话摘要,并创建具有完整上下文的新远程会话。你可以然后选择存档本地会话或保留它。这需要干净的工作树,对于 SSH 会话不可用。

322* **你的 IDE**:在当前工作目录的支持的 IDE 中打开你的项目。

323 

324### 来自 Dispatch 的会话

325 

326[Dispatch](https://support.claude.com/en/articles/13947068) 是一个与 Claude 的持久对话,存在于 [Cowork](https://claude.com/product/cowork#dispatch-and-computer-use) 选项卡中。你向 Dispatch 发送任务消息,它决定如何处理。

327 

328任务可以通过两种方式成为 Code 会话:你直接要求一个,例如"打开 Claude Code 会话并修复登录错误",或 Dispatch 决定任务是开发工作并自己生成一个。通常路由到 Code 的任务包括修复错误、更新依赖项、运行测试或打开拉取请求。研究、文档编辑和电子表格工作保留在 Cowork 中。

329 

330无论哪种方式,Code 会话都会在 Code 选项卡的侧边栏中出现,带有 **Dispatch** 徽章。当它完成或需要你的批准时,你会在手机上收到推送通知。

331 

332如果你启用了[计算机使用](#let-claude-use-your-computer),Dispatch 生成的 Code 会话也可以使用它。这些会话中的应用批准在 30 分钟后过期并重新提示,而不是像常规 Code 会话那样持续整个会话。

333 

334有关设置、配对和 Dispatch 设置,请参阅 [Dispatch 帮助文章](https://support.claude.com/en/articles/13947068)。Dispatch 需要 Pro 或 Max 计划,在 Team 或 Enterprise 计划上不可用。

335 

336Dispatch 是远离终端时与 Claude 合作的几种方式之一。请参阅[平台和集成](/zh-CN/platforms#work-when-you-are-away-from-your-terminal)来比较它与远程控制、Channels、Slack 和计划任务。

337 

338## 扩展 Claude Code

339 

340连接外部服务、添加可重用工作流、自定义 Claude 的行为并配置预览服务器。要在一个地方管理连接器、skills 和插件,请点击侧边栏中的**自定义**。

341 

342### 连接外部工具

343 

344对于本地和 [SSH](#ssh-sessions) 会话,点击提示框旁的 **+** 按钮并选择 **Connectors** 来添加集成,如 Google Calendar、Slack、GitHub、Linear、Notion 等。你可以在会话之前或期间添加连接器。**+** 按钮在远程会话中不可用,但[例程](/zh-CN/routines)在例程创建时配置连接器。

345 

346要管理或断开连接器,请在桌面应用中转到设置 → Connectors,或从提示框中的 Connectors 菜单中选择 **Manage connectors**。

347 

348连接后,Claude 可以读取你的日历、发送消息、创建问题并直接与你的工具交互。你可以询问 Claude 在你的会话中配置了哪些连接器。

349 

350连接器是[MCP servers](/zh-CN/mcp),具有图形设置流程。使用它们快速与支持的服务集成。对于连接器中未列出的集成,通过[设置文件](/zh-CN/mcp#installing-mcp-servers)手动添加 MCP servers。你也可以[创建自定义连接器](https://support.claude.com/en/articles/11175166-getting-started-with-custom-connectors-using-remote-mcp)。

351 

352### 使用 skills

353 

354[Skills](/zh-CN/skills)扩展 Claude 可以做的事情。Claude 在相关时自动加载它们,或者你可以直接调用一个:在提示框中输入 `/` 或点击 **+** 按钮并选择 **Slash commands** 来浏览可用的内容。这包括[内置命令](/zh-CN/commands)、你的[自定义 skills](/zh-CN/skills#create-your-first-skill)、来自你的代码库的项目 skills 以及来自任何[已安装插件](/zh-CN/plugins)的 skills。选择一个,它会在输入字段中突出显示。在它之后输入你的任务并照常发送。

355 

356### 安装插件

357 

358[Plugins](/zh-CN/plugins)是可重用的包,为 Claude Code 添加 skills、agents、hooks、MCP servers 和 LSP 配置。你可以从桌面应用安装插件,而无需使用终端。

359 

360对于本地和 [SSH](#ssh-sessions) 会话,点击提示框旁的 **+** 按钮并选择 **Plugins** 来查看你已安装的插件及其 skills。要添加插件,从子菜单中选择 **Add plugin** 来打开插件浏览器,它显示来自你配置的[市场](/zh-CN/plugin-marketplaces)的可用插件,包括官方 Anthropic 市场。选择 **Manage plugins** 来启用、禁用或卸载插件。

361 

362插件可以限定到你的用户账户、特定项目或仅本地。如果你的组织集中管理插件,这些插件在桌面会话中的可用方式与在 CLI 中相同。插件在远程会话中不可用。有关完整的插件参考,包括创建你自己的插件,请参阅[插件](/zh-CN/plugins)。

363 

364### 配置预览服务器

365 

366Claude 自动检测你的开发服务器设置并将配置存储在启动会话时选择的文件夹根目录的 `.claude/launch.json` 中。Preview 使用此文件夹作为其工作目录,因此如果你选择了父文件夹,具有自己开发服务器的子文件夹将不会自动检测。要使用子文件夹的服务器,要么直接在该文件夹中启动会话,要么手动添加配置。

367 

368要自定义服务器的启动方式,例如使用 `yarn dev` 而不是 `npm run dev` 或更改端口,手动编辑文件或点击 Preview 下拉菜单中的 **Edit configuration** 在你的代码编辑器中打开它。该文件支持带注释的 JSON。

369 

370```json theme={null}

371{

372 "version": "0.0.1",

373 "configurations": [

374 {

375 "name": "my-app",

376 "runtimeExecutable": "npm",

377 "runtimeArgs": ["run", "dev"],

378 "port": 3000

379 }

380 ]

381}

382```

383 

384你可以定义多个配置来从同一项目运行不同的服务器,例如前端和 API。请参阅下面的[示例](#examples)。

385 

386#### 自动验证更改

387 

388启用 `autoVerify` 时,Claude 在编辑文件后自动验证代码更改。它拍摄屏幕截图、检查错误并在完成响应之前确认更改有效。

389 

390自动验证默认打开。通过在 `.claude/launch.json` 中添加 `"autoVerify": false` 来按项目禁用它,或从 **Preview** 下拉菜单切换它。

391 

392```json theme={null}

393{

394 "version": "0.0.1",

395 "autoVerify": false,

396 "configurations": [...]

397}

398```

399 

400禁用时,预览工具仍然可用,你可以随时要求 Claude 验证。自动验证使其在每次编辑后自动进行。

401 

402#### 配置字段

403 

404`configurations` 数组中的每个条目接受以下字段:

405 

406| 字段 | 类型 | 描述 |

407| ------------------- | --------- | ------------------------------------------------------------------------------------------------------------------------ |

408| `name` | string | 此服务器的唯一标识符 |

409| `runtimeExecutable` | string | 要运行的命令,例如 `npm`、`yarn` 或 `node` |

410| `runtimeArgs` | string\[] | 传递给 `runtimeExecutable` 的参数,例如 `["run", "dev"]` |

411| `port` | number | 你的服务器监听的端口。默认为 3000 |

412| `cwd` | string | 相对于你的项目根目录的工作目录。默认为项目根目录。使用 `${workspaceFolder}` 显式引用项目根目录 |

413| `env` | object | 其他环境变量作为键值对,例如 `{ "NODE_ENV": "development" }`。不要在这里放置秘密,因为此文件被提交到你的存储库。要将秘密传递给你的开发服务器,在[本地环境编辑器](#local-sessions)中设置它们。 |

414| `autoPort` | boolean | 如何处理端口冲突。见下文 |

415| `program` | string | 用 `node` 运行的脚本。请参阅[何时使用 `program` vs `runtimeExecutable`](#when-to-use-program-vs-runtimeexecutable) |

416| `args` | string\[] | 传递给 `program` 的参数。仅在设置 `program` 时使用 |

417 

418##### 何时使用 `program` vs `runtimeExecutable`

419 

420使用 `runtimeExecutable` 和 `runtimeArgs` 通过包管理器启动开发服务器。例如,`"runtimeExecutable": "npm"` 和 `"runtimeArgs": ["run", "dev"]` 运行 `npm run dev`。

421 

422当你有一个想用 `node` 直接运行的独立脚本时,使用 `program`。例如,`"program": "server.js"` 运行 `node server.js`。使用 `args` 传递其他标志。

423 

424#### 端口冲突

425 

426`autoPort` 字段控制当你的首选端口已在使用时会发生什么:

427 

428* **`true`**:Claude 自动查找并使用空闲端口。适合大多数开发服务器。

429* **`false`**:Claude 失败并出现错误。当你的服务器必须使用特定端口时使用此选项,例如 OAuth 回调或 CORS 允许列表。

430* **未设置(默认)**:Claude 询问服务器是否需要该确切端口,然后保存你的答案。

431 

432当 Claude 选择不同的端口时,它通过 `PORT` 环境变量将分配的端口传递给你的服务器。

433 

434#### 示例

435 

436这些配置显示了不同项目类型的常见设置:

437 

438<Tabs>

439 <Tab title="Next.js">

440 此配置使用 Yarn 在端口 3000 上运行 Next.js 应用:

441 

442 ```json theme={null}

443 {

444 "version": "0.0.1",

445 "configurations": [

446 {

447 "name": "web",

448 "runtimeExecutable": "yarn",

449 "runtimeArgs": ["dev"],

450 "port": 3000

451 }

452 ]

453 }

454 ```

455 </Tab>

456 

457 <Tab title="多个服务器">

458 对于具有前端和 API 服务器的 monorepo,定义多个配置。前端使用 `autoPort: true`,因此如果 3000 被占用,它会选择空闲端口,而 API 服务器需要端口 8080:

459 

460 ```json theme={null}

461 {

462 "version": "0.0.1",

463 "configurations": [

464 {

465 "name": "frontend",

466 "runtimeExecutable": "npm",

467 "runtimeArgs": ["run", "dev"],

468 "cwd": "apps/web",

469 "port": 3000,

470 "autoPort": true

471 },

472 {

473 "name": "api",

474 "runtimeExecutable": "npm",

475 "runtimeArgs": ["run", "start"],

476 "cwd": "server",

477 "port": 8080,

478 "env": { "NODE_ENV": "development" },

479 "autoPort": false

480 }

481 ]

482 }

483 ```

484 </Tab>

485 

486 <Tab title="Node.js 脚本">

487 要直接运行 Node.js 脚本而不是使用包管理器命令,使用 `program` 字段:

488 

489 ```json theme={null}

490 {

491 "version": "0.0.1",

492 "configurations": [

493 {

494 "name": "server",

495 "program": "server.js",

496 "args": ["--verbose"],

497 "port": 4000

498 }

499 ]

500 }

501 ```

502 </Tab>

503</Tabs>

504 

505## 环境配置

506 

507你在[启动会话](#start-a-session)时选择的环境决定了 Claude 执行的位置以及你如何连接:

508 

509* **Local**:在你的机器上运行,直接访问你的文件

510* **Remote**:在 Anthropic 的云基础设施上运行。即使你关闭应用,会话也会继续。

511* **SSH**:在你通过 SSH 连接的远程机器上运行,例如你自己的服务器、云虚拟机或开发容器

512 

513### 本地会话

514 

515桌面应用并不总是继承你的完整 shell 环境。在 macOS 上,当你从 Dock 或 Finder 启动应用时,它读取你的 shell 配置文件,例如 `~/.zshrc` 或 `~/.bashrc`,来提取 `PATH` 和一组固定的 Claude Code 变量,但你在那里导出的其他变量不会被拾取。在 Windows 上,应用继承用户和系统环境变量,但不读取 PowerShell 配置文件。

516 

517要在任何平台上为本地会话和开发服务器设置环境变量,在提示框中打开环境下拉菜单,将鼠标悬停在 **Local** 上,然后点击齿轮图标来打开本地环境编辑器。你在此处保存的变量在你的机器上加密存储,并适用于你启动的每个本地会话和预览服务器。你也可以将变量添加到你的 `~/.claude/settings.json` 文件中的 `env` 键,尽管这些仅到达 Claude 会话而不是开发服务器。有关支持的变量的完整列表,请参阅[环境变量](/zh-CN/env-vars)。

518 

519[扩展思考](/zh-CN/common-workflows#use-extended-thinking-thinking-mode)默认启用,这改进了复杂推理任务的性能,但使用额外的令牌。要完全禁用思考,在本地环境编辑器中将 `MAX_THINKING_TOKENS` 设置为 `0`。在具有[自适应推理](/zh-CN/model-config#adjust-effort-level)的模型上,任何其他 `MAX_THINKING_TOKENS` 值都被忽略,因为自适应推理控制思考深度。在 Opus 4.6 和 Sonnet 4.6 上,设置 `CLAUDE_CODE_DISABLE_ADAPTIVE_THINKING` 为 `1` 来使用固定思考预算;Opus 4.7 始终使用自适应推理,没有固定预算模式。

520 

521### 远程会话

522 

523远程会话即使在你关闭应用后也会在后台继续。使用计入你的[订阅计划限制](/zh-CN/costs),没有单独的计算费用。

524 

525你可以创建具有不同网络访问级别和环境变量的自定义云环境。在启动远程会话时选择环境下拉菜单并选择 **Add environment**。有关配置网络访问和环境变量的详细信息,请参阅[云环境](/zh-CN/claude-code-on-the-web#the-cloud-environment)。

526 

527### SSH 会话

528 

529SSH 会话让你在远程机器上运行 Claude Code,同时使用桌面应用作为你的界面。这对于使用存在于云虚拟机、开发容器或具有特定硬件或依赖项的服务器上的代码库很有用。

530 

531要添加 SSH 连接,在启动会话之前点击环境下拉菜单并选择 **+ Add SSH connection**。对话框要求:

532 

533* **Name**:此连接的友好标签

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

535* **SSH Port**:如果留空,默认为 22,或使用你的 SSH 配置中的端口

536* **Identity File**:你的私钥的路径,例如 `~/.ssh/id_rsa`。留空以使用默认密钥或你的 SSH 配置。

537 

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

539 

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

541 

542#### 为你的团队预配置 SSH 连接

543 

544管理员可以通过将 `sshConfigs` 添加到[托管设置](/zh-CN/settings#settings-precedence)文件来向团队成员分发 SSH 连接。以这种方式定义的连接会自动出现在每个用户的环境下拉菜单中,并显示为托管的,因此用户可以选择它们,但不能在应用中编辑或删除它们。

545 

546以下示例预配置了一个在远程主机上的 `~/projects` 中打开的单个连接:

547 

548```json theme={null}

549{

550 "sshConfigs": [

551 {

552 "id": "shared-dev-vm",

553 "name": "Shared Dev VM",

554 "sshHost": "user@dev.example.com",

555 "sshPort": 22,

556 "sshIdentityFile": "~/.ssh/id_ed25519",

557 "startDirectory": "~/projects"

558 }

559 ]

560}

561```

562 

563每个条目需要 `id`、`name` 和 `sshHost`。`sshPort`、`sshIdentityFile` 和 `startDirectory` 字段是可选的。用户也可以将 `sshConfigs` 添加到他们自己的 `~/.claude/settings.json`,这是通过对话框添加的连接存储的位置。

564 

565## 企业配置

566 

567Teams 或 Enterprise 计划上的组织可以通过管理员控制台控制、托管设置文件和设备管理策略来管理桌面应用行为。

568 

569### 管理员控制台控制

570 

571这些设置通过[管理员设置控制台](https://claude.ai/admin-settings/claude-code)配置:

572 

573* **Desktop 中的 Code**:控制你的组织中的用户是否可以在桌面应用中访问 Claude Code

574* **Web 中的 Code**:为你的组织启用或禁用[Web 会话](/zh-CN/claude-code-on-the-web)

575* **Remote Control**:为你的组织启用或禁用[远程控制](/zh-CN/remote-control)

576* **禁用绕过权限模式**:防止你的组织中的用户启用绕过权限模式

577 

578### 托管设置

579 

580托管设置覆盖项目和用户设置,并在 Desktop 生成 CLI 会话时应用。你可以在你的组织的[托管设置](/zh-CN/settings#settings-precedence)文件中设置这些键,或通过管理员控制台远程推送它们。

581 

582| 键 | 描述 |

583| ------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------- |

584| `permissions.disableBypassPermissionsMode` | 设置为 `"disable"` 以防止用户启用绕过权限模式。 |

585| `disableAutoMode` | 设置为 `"disable"` 以防止用户启用 [Auto](/zh-CN/permission-modes#eliminate-prompts-with-auto-mode) 模式。从模式选择器中删除 Auto。也在 `permissions` 下接受。 |

586| `autoMode` | 自定义 auto 模式分类器在你的组织中信任和阻止的内容。请参阅[配置 auto 模式](/zh-CN/auto-mode-config)。 |

587| `sshConfigs` | 预配置[SSH 连接](#pre-configure-ssh-connections-for-your-team),在环境下拉菜单中显示。用户无法编辑或删除托管连接。 |

588 

589部署到每台机器上磁盘的托管设置文件适用于 Desktop 会话。通过管理员控制台远程推送的托管设置目前仅适用于 CLI 和 IDE 会话,因此对于 Desktop 部署,要么通过 MDM 分发文件,要么使用上面的[管理员控制台控制](#admin-console-controls)。

590 

591`permissions.disableBypassPermissionsMode` 和 `disableAutoMode` 也在用户和项目设置中工作,但将它们放在托管设置中可防止用户覆盖它们。`autoMode` 从用户设置、`.claude/settings.local.json` 和托管设置中读取,但不从已检入的 `.claude/settings.json` 中读取:克隆的存储库无法注入其自己的分类器规则。有关托管专用设置的完整列表,包括 `allowManagedPermissionRulesOnly` 和 `allowManagedHooksOnly`,请参阅[托管专用设置](/zh-CN/permissions#managed-only-settings)。

592 

593### 设备管理策略

594 

595IT 团队可以通过 macOS 上的 MDM 或 Windows 上的组策略管理桌面应用。可用的策略包括启用或禁用 Claude Code 功能、控制自动更新和设置自定义部署 URL。

596 

597* **macOS**:通过使用 Jamf 或 Kandji 等工具的 `com.anthropic.Claude` 偏好域配置

598* **Windows**:通过 `SOFTWARE\Policies\Claude` 处的注册表配置

599 

600### 身份验证和 SSO

601 

602企业组织可以要求所有用户使用 SSO。有关计划级别的详细信息,请参阅[身份验证](/zh-CN/authentication),有关 SAML 和 OIDC 配置,请参阅[设置 SSO](https://support.claude.com/en/articles/13132885-setting-up-single-sign-on-sso)。

603 

604### 数据处理

605 

606Claude Code 在本地会话中本地处理你的代码,或在远程会话中在 Anthropic 的云基础设施上处理。对话和代码上下文被发送到 Anthropic 的 API 进行处理。有关数据保留、隐私和合规性的详细信息,请参阅[数据处理](/zh-CN/data-usage)。

607 

608### 部署

609 

610Desktop 可以通过企业部署工具分发:

611 

612* **macOS**:通过 MDM(如 Jamf 或 Kandji)使用 `.dmg` 安装程序分发

613* **Windows**:通过 MSIX 包或 `.exe` 安装程序部署。有关企业部署选项(包括静默安装),请参阅[为 Windows 部署 Claude Desktop](https://support.claude.com/en/articles/12622703-deploy-claude-desktop-for-windows)

614 

615有关网络配置,如代理设置、防火墙允许列表和 LLM 网关,请参阅[网络配置](/zh-CN/network-config)。

616 

617有关完整的企业配置参考,请参阅[企业配置指南](https://support.claude.com/en/articles/12622667-enterprise-configuration)。

618 

619## 来自 CLI?

620 

621如果你已经使用 Claude Code CLI,Desktop 运行相同的底层引擎,具有图形界面。你可以在同一机器上同时运行两者,甚至在同一项目上。每个维护单独的会话历史,但它们通过 CLAUDE.md 文件共享配置和项目内存。

622 

623要将 CLI 会话移动到 Desktop,在终端中运行 `/desktop`。Claude 保存你的会话并在桌面应用中打开它,然后退出 CLI。此命令仅在 macOS 和 Windows 上可用。

624 

625<Tip>

626 何时使用 Desktop vs CLI:当你想要管理一个窗口中的并行会话、并排排列窗格或可视化审查更改时,使用 Desktop。当你需要脚本、自动化或更喜欢终端工作流时,使用 CLI。

627</Tip>

628 

629### CLI 标志等效项

630 

631此表显示了常见 CLI 标志的桌面应用等效项。未列出的标志没有桌面等效项,因为它们是为脚本或自动化设计的。

632 

633| CLI | Desktop 等效项 |

634| ------------------------------------- | ------------------------------------------------------ |

635| `--model sonnet` | 发送按钮旁的模型下拉菜单 |

636| `--resume`, `--continue` | 点击侧边栏中的会话 |

637| `--permission-mode` | 发送按钮旁的模式选择器 |

638| `--dangerously-skip-permissions` | 绕过权限模式。在设置 → Claude Code → "允许绕过权限模式"中启用。企业管理员可以禁用此设置。 |

639| `--add-dir` | 在远程会话中使用 **+** 按钮添加多个存储库 |

640| `--allowedTools`, `--disallowedTools` | 无每个会话的等效项。[设置文件](/zh-CN/settings)中的权限规则仍然适用。 |

641| `--verbose` | [Verbose 视图模式](#switch-view-modes)在 Transcript 视图下拉菜单中 |

642| `--print`, `--output-format` | 不可用。Desktop 仅是交互式的。 |

643| `ANTHROPIC_MODEL` 环境变量 | 发送按钮旁的模型下拉菜单 |

644| `MAX_THINKING_TOKENS` 环境变量 | 在本地环境编辑器中设置。请参阅[环境配置](#environment-configuration)。 |

645 

646### 共享配置

647 

648Desktop 和 CLI 读取相同的配置文件,因此你的设置会转移:

649 

650* **[CLAUDE.md](/zh-CN/memory)** 和 `CLAUDE.local.md` 文件在你的项目中被两者使用

651* **[MCP servers](/zh-CN/mcp)** 在 `~/.claude.json` 或 `.mcp.json` 中配置在两者中工作

652* **[Hooks](/zh-CN/hooks)** 和 **[skills](/zh-CN/skills)** 在设置中定义适用于两者

653* **[Settings](/zh-CN/settings)** 在 `~/.claude.json` 和 `~/.claude/settings.json` 中是共享的。权限规则、允许的工具和 `settings.json` 中的其他设置适用于 Desktop 会话。

654* **Models**:Sonnet、Opus 和 Haiku 在两者中都可用。在 Desktop 中,从发送按钮旁的下拉菜单中选择模型。你可以在会话期间从相同的下拉菜单更改模型。

655 

656<Note>

657 **MCP servers:桌面聊天应用 vs Claude Code**:在 `claude_desktop_config.json` 中为 Claude Desktop 聊天应用配置的 MCP servers 与 Claude Code 分开,不会出现在 Code 选项卡中。要在 Claude Code 中使用 MCP servers,在 `~/.claude.json` 或你的项目的 `.mcp.json` 文件中配置它们。有关详细信息,请参阅 [MCP 配置](/zh-CN/mcp#installing-mcp-servers)。

658</Note>

659 

660### 功能比较

661 

662此表比较了 CLI 和 Desktop 之间的核心功能。有关 CLI 标志的完整列表,请参阅 [CLI 参考](/zh-CN/cli-reference)。

663 

664| 功能 | CLI | Desktop |

665| ----------------------------------------- | -------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |

666| 权限模式 | 所有模式,包括 `dontAsk` | 询问权限、自动接受编辑、Plan Mode、Auto 和通过设置的绕过权限 |

667| `--dangerously-skip-permissions` | CLI 标志 | 绕过权限模式。在设置 → Claude Code → "允许绕过权限模式"中启用 |

668| [第三方提供商](/zh-CN/third-party-integrations) | Bedrock、Vertex、Foundry | Anthropic 的 API 默认。企业部署可以配置 Vertex AI 和网关提供商。请参阅[企业配置指南](https://support.claude.com/en/articles/12622667-enterprise-configuration)。 |

669| [MCP servers](/zh-CN/mcp) | 在设置文件中配置 | 本地和 SSH 会话的连接器 UI,或设置文件 |

670| [Plugins](/zh-CN/plugins) | `/plugin` 命令 | 插件管理器 UI |

671| @mention 文件 | 基于文本 | 带自动完成;仅本地和 SSH 会话 |

672| 文件附件 | 不可用 | 图像、PDF |

673| 会话隔离 | [`--worktree`](/zh-CN/cli-reference) 标志 | 自动 worktrees |

674| 多个会话 | 单独的终端 | 侧边栏选项卡 |

675| 定期任务 | Cron 作业、CI 管道 | [计划任务](/zh-CN/desktop-scheduled-tasks) |

676| 计算机使用 | [通过 `/mcp` 在 macOS 上启用](/zh-CN/computer-use) | [应用和屏幕控制](#let-claude-use-your-computer)在 macOS 和 Windows 上 |

677| Dispatch 集成 | 不可用 | [Dispatch 会话](#sessions-from-dispatch)在侧边栏中 |

678| 脚本和自动化 | [`--print`](/zh-CN/cli-reference)、[Agent SDK](/zh-CN/headless) | 不可用 |

679 

680### Desktop 中不可用的内容

681 

682以下功能仅在 CLI 或 VS Code 扩展中可用:

683 

684* **第三方提供商**:Desktop 默认连接到 Anthropic 的 API。企业部署可以配置 Vertex AI 和网关提供商,通过[托管设置](https://support.claude.com/en/articles/12622667-enterprise-configuration)。对于 Bedrock 或 Foundry,使用 [CLI](/zh-CN/quickstart)。

685* **Linux**:桌面应用仅在 macOS 和 Windows 上可用。在 Linux 上,使用 [CLI](/zh-CN/quickstart)。

686* **内联代码建议**:Desktop 不提供自动完成风格的建议。它通过对话提示和显式代码更改工作。

687* **Agent teams**:多 agent 编排通过 [CLI](/zh-CN/agent-teams) 和 [Agent SDK](/zh-CN/headless) 可用,不在 Desktop 中。

688 

689## 故障排除

690 

691下面的部分涵盖特定于桌面应用的问题。对于出现在聊天中的运行时 API 错误,如 `API Error: 500`、`529 Overloaded`、`429` 或 `Prompt is too long`,请参阅[错误参考](/zh-CN/errors)。这些错误及其修复在 CLI、Desktop 和 Web 中是相同的。

692 

693### 检查你的版本

694 

695要查看你运行的桌面应用版本:

696 

697* **macOS**:点击菜单栏中的 **Claude**,然后点击 **About Claude**

698* **Windows**:点击 **Help**,然后点击 **About**

699 

700点击版本号将其复制到你的剪贴板。

701 

702### Code 选项卡中的 403 或身份验证错误

703 

704如果在使用 Code 选项卡时看到 `Error 403: Forbidden` 或其他身份验证失败:

705 

7061. 从应用菜单中注销并重新登录。这是最常见的修复。

7072. 验证你有活跃的付费订阅:Pro、Max、Team 或 Enterprise。

7083. 如果 CLI 工作但 Desktop 不工作,完全退出桌面应用,而不仅仅是关闭窗口,然后重新打开并登录。

7094. 检查你的互联网连接和代理设置。

710 

711### 启动时屏幕空白或卡住

712 

713如果应用打开但显示空白或无响应的屏幕:

714 

7151. 重启应用。

7162. 检查待处理的更新。应用在启动时自动更新。

7173. 在 Windows 上,在 **Windows 日志 → 应用程序** 下的事件查看器中检查崩溃日志。

718 

719### "Failed to load session"

720 

721如果你看到 `Failed to load session`,选定的文件夹可能不再存在,Git 存储库可能需要未安装的 Git LFS,或文件权限可能阻止访问。尝试选择不同的文件夹或重启应用。

722 

723### 会话找不到已安装的工具

724 

725如果 Claude 找不到 `npm`、`node` 或其他 CLI 命令等工具,验证工具在你的常规终端中工作,检查你的 shell 配置文件是否正确设置 PATH,并重启桌面应用以重新加载环境变量。

726 

727### Git 和 Git LFS 错误

728 

729在 Windows 上,Git 是启动本地会话的 Code 选项卡所必需的。如果你看到"Git is required",安装 [Git for Windows](https://git-scm.com/downloads/win) 并重启应用。

730 

731如果你看到"Git LFS is required by this repository but is not installed",从 [git-lfs.com](https://git-lfs.com/) 安装 Git LFS,运行 `git lfs install`,并重启应用。

732 

733### MCP servers 在 Windows 上不工作

734 

735如果 MCP server 切换不响应或服务器在 Windows 上连接失败,检查服务器在你的设置中是否正确配置,重启应用,验证服务器进程在任务管理器中运行,并查看服务器日志以获取连接错误。

736 

737### 应用无法退出

738 

739* **macOS**:按 Cmd+Q。如果应用不响应,使用 Cmd+Option+Esc 强制退出,选择 Claude,然后点击强制退出。

740* **Windows**:使用 Ctrl+Shift+Esc 的任务管理器来结束 Claude 进程。

741 

742### Windows 特定问题

743 

744* **安装后 PATH 未更新**:打开新的终端窗口。PATH 更新仅适用于新的终端会话。

745* **并发安装错误**:如果你看到关于另一个安装正在进行的错误,但实际上没有,尝试以管理员身份运行安装程序。

746 

747### 在 CLI 中打开时"Branch doesn't exist yet"

748 

749远程会话可以创建在你的本地机器上不存在的分支。点击会话工具栏中的分支名称来复制它,然后在本地获取它:

750 

751```bash theme={null}

752git fetch origin <branch-name>

753git checkout <branch-name>

754```

755 

756### 仍然卡住?

757 

758* 在 [GitHub Issues](https://github.com/anthropics/claude-code/issues) 上搜索或提交错误

759* 访问 [Claude 支持中心](https://support.claude.com/)

760 

761提交错误时,包括你的桌面应用版本、你的操作系统、确切的错误消息和相关日志。在 macOS 上,检查 Console.app。在 Windows 上,检查事件查看器 → Windows 日志 → 应用程序。

desktop-quickstart.md +129 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 开始使用桌面应用

6 

7> 在桌面上安装 Claude Code 并开始您的第一个编码会话

8 

9桌面应用为您提供具有图形界面的 Claude Code,专为并行运行多个会话而构建:用于管理并行工作的侧边栏、带有集成终端和文件编辑器的拖放布局、可视化差异审查、实时应用预览、GitHub PR 监控和自动合并以及计划任务。无需终端。

10 

11<CardGroup cols={2}>

12 <Card title="Download for macOS" icon="apple" href="https://claude.ai/api/desktop/darwin/universal/dmg/latest/redirect?utm_source=claude_code&utm_medium=docs">

13 Universal build for Intel and Apple Silicon

14 </Card>

15 

16 <Card title="Download for Windows" icon="windows" href="https://claude.ai/api/desktop/win32/x64/setup/latest/redirect?utm_source=claude_code&utm_medium=docs">

17 For x64 processors

18 </Card>

19</CardGroup>

20 

21For Windows ARM64, download the [ARM64 installer](https://claude.ai/api/desktop/win32/arm64/setup/latest/redirect?utm_source=claude_code\&utm_medium=docs). The desktop app is not available on Linux; use the [CLI](/en/quickstart) instead.

22 

23<Note>

24 Claude Code 需要 [Pro、Max、Team 或 Enterprise 订阅](https://claude.com/pricing?utm_source=claude_code\&utm_medium=docs\&utm_content=desktop_quickstart_pricing)。

25</Note>

26 

27本页面将指导您安装应用并开始您的第一个会话。如果您已经设置完成,请参阅[使用 Claude Code Desktop](/zh-CN/desktop)了解完整参考。

28 

29桌面应用有三个选项卡:

30 

31* **Chat**:无文件访问权限的常规对话,类似于 claude.ai。

32* **Cowork**:一个自主后台代理,在云虚拟机中处理任务,拥有自己的环境。它可以独立运行,而您可以进行其他工作。

33* **Code**:一个交互式编码助手,可直接访问您的本地文件。您可以实时审查和批准每项更改。

34 

35Chat 和 Cowork 在 [Claude Desktop 支持文章](https://support.claude.com/en/collections/16163169-claude-desktop)中有介绍。本页面重点关注 **Code** 选项卡。

36 

37## 安装

38 

39<Steps>

40 <Step title="安装并登录">

41 从上面的链接下载您的平台的安装程序并运行它。在 macOS 上从应用程序文件夹启动 Claude,或在 Windows 上从开始菜单启动,然后使用您的 Anthropic 账户登录。

42 </Step>

43 

44 <Step title="打开 Code 选项卡">

45 点击顶部中心的 **Code** 选项卡。如果点击 Code 提示您升级,您需要先[订阅付费计划](https://claude.com/pricing?utm_source=claude_code\&utm_medium=docs\&utm_content=desktop_quickstart_upgrade)。如果提示您在线登录,请完成登录并重启应用。如果您看到 403 错误,请参阅[身份验证故障排除](/zh-CN/desktop#403-or-authentication-errors-in-the-code-tab)。

46 </Step>

47</Steps>

48 

49桌面应用包含 Claude Code。您无需单独安装 Node.js 或 CLI。要从终端使用 `claude`,请单独安装 CLI。请参阅[开始使用 CLI](/zh-CN/quickstart)。

50 

51## 开始您的第一个会话

52 

53打开 Code 选项卡后,选择一个项目并告诉 Claude 要做什么。

54 

55<Steps>

56 <Step title="选择环境和文件夹">

57 选择 **Local** 以在您的机器上运行 Claude,直接使用您的文件。点击 **Select folder** 并选择您的项目目录。

58 

59 <Tip>

60 从一个您熟悉的小项目开始。这是查看 Claude Code 能做什么的最快方式。在 Windows 上,必须安装 [Git](https://git-scm.com/downloads/win) 才能使本地会话正常工作。大多数 Mac 默认包含 Git。

61 </Tip>

62 

63 您也可以选择:

64 

65 * **Remote**:在 Anthropic 的云基础设施上运行会话,即使关闭应用也会继续。远程会话使用与 [Claude Code on the web](/zh-CN/claude-code-on-the-web) 相同的基础设施。

66 * **SSH**:通过 SSH 连接到远程机器(您自己的服务器、云虚拟机或开发容器)。必须在远程机器上安装 Claude Code。

67 </Step>

68 

69 <Step title="选择模型">

70 从发送按钮旁的下拉菜单中选择模型。请参阅[模型](/zh-CN/model-config#available-models)了解 Opus、Sonnet 和 Haiku 的比较。您可以稍后从同一下拉菜单更改模型。

71 </Step>

72 

73 <Step title="告诉 Claude 要做什么">

74 输入您希望 Claude 做的事情:

75 

76 * `Find a TODO comment and fix it`

77 * `Add tests for the main function`

78 * `Create a CLAUDE.md with instructions for this codebase`

79 

80 一个[会话](/zh-CN/desktop#work-in-parallel-with-sessions)是与 Claude 关于您的代码的对话。每个会话跟踪自己的上下文和更改,因此您可以处理多个任务而不会相互干扰。

81 </Step>

82 

83 <Step title="审查并接受更改">

84 默认情况下,Code 选项卡以[询问权限模式](/zh-CN/desktop#choose-a-permission-mode)启动,其中 Claude 提议更改并等待您的批准后再应用。您将看到:

85 

86 1. 一个[差异视图](/zh-CN/desktop#review-changes-with-diff-view),显示每个文件中将发生的确切更改

87 2. 接受/拒绝按钮以批准或拒绝每项更改

88 3. Claude 处理您的请求时的实时更新

89 

90 如果您拒绝更改,Claude 将询问您希望如何以不同的方式进行。在您接受之前,您的文件不会被修改。

91 </Step>

92</Steps>

93 

94## 接下来呢?

95 

96您已经进行了第一次编辑。有关 Desktop 可以做的所有事情的完整参考,请参阅[使用 Claude Code Desktop](/zh-CN/desktop)。以下是一些接下来可以尝试的事情。

97 

98**中断并引导。** 您可以随时中断 Claude。如果它走错了方向,点击停止按钮或输入您的更正并按 **Enter**。Claude 停止正在做的事情并根据您的输入进行调整。您无需等待它完成或重新开始。

99 

100**为 Claude 提供更多上下文。** 在提示框中输入 `@filename` 以将特定文件拉入对话,使用附件按钮附加图像和 PDF,或直接将文件拖放到提示中。Claude 拥有的上下文越多,结果越好。请参阅[添加文件和上下文](/zh-CN/desktop#add-files-and-context-to-prompts)。

101 

102**使用 skills 处理可重复的任务。** 输入 `/` 或点击 **+** → **Slash commands** 以浏览[内置命令](/zh-CN/commands)、[自定义 skills](/zh-CN/skills) 和插件 skills。Skills 是可重用的提示,您可以在需要时调用,例如代码审查清单或部署步骤。

103 

104**在提交前审查更改。** Claude 编辑文件后,会出现 `+12 -1` 指示器。点击它以打开[差异视图](/zh-CN/desktop#review-changes-with-diff-view),逐个文件审查修改,并对特定行进行评论。Claude 会读取您的评论并进行修订。点击 **Review code** 让 Claude 自己评估差异并留下内联建议。

105 

106**调整您拥有的控制量。** 您的[权限模式](/zh-CN/desktop#choose-a-permission-mode)控制平衡。询问权限(默认)在每次编辑前需要批准。自动接受编辑会自动接受文件编辑以加快迭代。Plan mode 让 Claude 在不接触任何文件的情况下规划方法,这在大型重构前很有用。

107 

108**添加插件以获得更多功能。** 点击提示框旁的 **+** 按钮并选择 **Plugins** 以浏览和安装[插件](/zh-CN/desktop#install-plugins),这些插件添加 skills、代理、MCP servers 等。

109 

110**整理您的工作区。** 将聊天、差异、终端、文件和预览窗格拖放到您想要的任何布局中。使用 **Ctrl+\`** 打开终端以在会话旁运行命令,或点击文件路径以在文件窗格中打开它。请参阅[整理您的工作区](/zh-CN/desktop#arrange-your-workspace)。

111 

112**预览您的应用。** 点击 **Preview** 下拉菜单以直接在桌面中运行您的开发服务器。Claude 可以查看正在运行的应用、测试端点、检查日志并对其看到的内容进行迭代。请参阅[预览您的应用](/zh-CN/desktop#preview-your-app)。

113 

114**跟踪您的拉取请求。** 打开 PR 后,Claude Code 监控 CI 检查结果,可以自动修复失败或在所有检查通过后合并 PR。请参阅[监控拉取请求状态](/zh-CN/desktop#monitor-pull-request-status)。

115 

116**将 Claude 放在日程上。** 设置[计划任务](/zh-CN/desktop-scheduled-tasks)以定期自动运行 Claude:每天早上进行代码审查、每周进行依赖审计,或从您连接的工具中提取信息的简报。

117 

118**准备好时扩展。** 从侧边栏打开[并行会话](/zh-CN/desktop#work-in-parallel-with-sessions)以同时处理多个任务,每个任务都在自己的 Git worktree 中,并打开[任务窗格](/zh-CN/desktop#watch-background-tasks)以观看会话正在运行的子代理和后台命令。打开[侧边聊天](/zh-CN/desktop#ask-a-side-question-without-derailing-the-session)以提出问题而不会偏离主线程。将[长期运行的工作发送到云](/zh-CN/desktop#run-long-running-tasks-remotely),以便即使关闭应用也能继续,或者如果任务花费的时间比预期长,[在网络或 IDE 中继续会话](/zh-CN/desktop#continue-in-another-surface)。[连接外部工具](/zh-CN/desktop#extend-claude-code),如 GitHub、Slack 和 Linear,以整合您的工作流。

119 

120## 来自 CLI?

121 

122Desktop 运行与 CLI 相同的引擎,但具有图形界面。您可以在同一项目上同时运行两者,它们共享配置(CLAUDE.md 文件、MCP servers、hooks、skills 和设置)。有关功能、标志等效项和 Desktop 中不可用内容的完整比较,请参阅 [CLI 比较](/zh-CN/desktop#coming-from-the-cli)。

123 

124## 接下来是什么

125 

126* [使用 Claude Code Desktop](/zh-CN/desktop):权限模式、并行会话、差异视图、连接器和企业配置

127* [故障排除](/zh-CN/desktop#troubleshooting):常见错误和设置问题的解决方案

128* [最佳实践](/zh-CN/best-practices):编写有效提示和充分利用 Claude Code 的提示

129* [常见工作流](/zh-CN/common-workflows):调试、重构、测试等教程

devcontainer.md +194 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 开发容器

6 

7> 在开发容器中运行 Claude Code,为您的团队提供一致、隔离的环境。

8 

9[开发容器](https://containers.dev/)(或 dev container)让您定义一个相同的、隔离的环境,团队中的每个工程师都可以运行。在该容器中安装 Claude Code 后,Claude 运行的命令会在容器内执行,而不是在主机上执行,同时对项目文件的编辑会在您工作时显示在本地存储库中。

10 

11本页涵盖[在开发容器中安装 Claude Code](#add-claude-code-to-your-dev-container) 以及随后的配置主题。每个主题都是独立的,因此请跳转到与您需要设置的内容相匹配的主题:

12 

13* [在重建过程中保持身份验证和设置](#persist-authentication-and-settings-across-rebuilds)

14* [强制执行组织策略](#enforce-organization-policy)

15* [限制网络出站流量](#restrict-network-egress)

16* [无需权限提示即可运行](#run-without-permission-prompts)

17 

18<Warning>

19 虽然开发容器提供了实质性的保护,但没有任何系统能够完全免疫所有攻击。

20 当使用 `--dangerously-skip-permissions` 执行时,开发容器不会阻止恶意项目泄露容器内可访问的任何内容,包括存储在 [`~/.claude`](/zh-CN/claude-directory) 中的 Claude Code 凭证。

21 仅在使用受信任的存储库进行开发时使用开发容器,并监控 Claude 的活动。

22 避免将主机密钥(如 `~/.ssh` 或云凭证文件)挂载到容器中;优先使用存储库范围或短期令牌。

23</Warning>

24 

25<Accordion title="开发容器如何与您的编辑器配合工作">

26 <img src="https://mintcdn.com/claude-code/YvJyjZfd9yMihr0i/images/devcontainer-architecture.svg?fit=max&auto=format&n=YvJyjZfd9yMihr0i&q=85&s=9017b1d16a446c6cc37ba562f35b9aae" className="dark:hidden" alt="显示主机上的编辑器连接到 Docker 开发容器的图表。Claude Code、终端和构建工具在容器内运行。主机存储库绑定挂载到容器中作为工作区。" width="640" height="300" data-path="images/devcontainer-architecture.svg" />

27 

28 <img src="https://mintcdn.com/claude-code/YvJyjZfd9yMihr0i/images/devcontainer-architecture-dark.svg?fit=max&auto=format&n=YvJyjZfd9yMihr0i&q=85&s=ef00c8e25b1ea7a3a152895f1488831b" className="hidden dark:block" alt="显示主机上的编辑器连接到 Docker 开发容器的图表。Claude Code、终端和构建工具在容器内运行。主机存储库绑定挂载到容器中作为工作区。" width="640" height="300" data-path="images/devcontainer-architecture-dark.svg" />

29 

30 开发容器作为 Docker 容器运行,可以在您的机器上或云主机(如 GitHub Codespaces)上运行。支持 Dev Containers 规范的编辑器(如 VS Code、GitHub Codespaces、JetBrains IDE 或 Cursor)连接到该容器:您可以像往常一样在编辑器中浏览和编辑文件,但集成终端、语言服务器和构建工具都在容器内运行,而不是在主机上。不支持开发容器的编辑器(如纯 Vim)不属于此工作流。

31 

32 Claude Code 在容器内运行,因此它看到与项目工具链其余部分相同的文件、依赖项和工具。在 VS Code 中,您可以使用 [Claude Code 扩展面板](/zh-CN/vs-code) 或在集成终端中运行 `claude`;两者都在容器内运行并共享相同的 `~/.claude` 配置。

33</Accordion>

34 

35## 在开发容器中添加 Claude Code

36 

37Claude Code 通过 [Claude Code Dev Container Feature](https://github.com/anthropics/devcontainer-features/tree/main/src/claude-code) 安装到任何开发容器中。

38 

39这些设置适用于任何支持 Dev Containers 规范的工具,如 VS Code、GitHub Codespaces 或 JetBrains IDE。下面的步骤以 VS Code 为例。

40 

41当您在 VS Code 或 Codespaces 中打开容器时,该功能还会添加 Claude Code VS Code 扩展;其他编辑器会忽略该部分。

42 

43<Tip>

44 初次接触开发容器?[VS Code Dev Containers 教程](https://code.visualstudio.com/docs/devcontainers/tutorial) 会指导您安装 Docker、扩展和打开第一个容器。有关更完整的加固示例(包含防火墙和持久卷),请参阅[尝试参考容器](#try-the-reference-container)。

45</Tip>

46 

47<Steps>

48 <Step title="创建或更新 devcontainer.json">

49 将以下内容保存为存储库中的 `.devcontainer/devcontainer.json`,或将 `features` 块添加到现有文件中。

50 

51 末尾的版本标签(如 `:1.0`)固定了功能的安装脚本,而不是 Claude Code 版本。该功能安装最新的 Claude Code,Claude Code 默认在容器内自动更新。

52 

53 要固定 CLI 版本或禁用自动更新,请参阅[强制执行组织策略](#enforce-organization-policy)。

54 

55 ```json .devcontainer/devcontainer.json theme={null}

56 {

57 "image": "mcr.microsoft.com/devcontainers/base:ubuntu",

58 "features": {

59 "ghcr.io/anthropics/devcontainer-features/claude-code:1.0": {}

60 }

61 }

62 ```

63 

64 将 `image` 行替换为您项目的基础镜像,或如果现有文件使用 Dockerfile,则将其删除。

65 </Step>

66 

67 <Step title="重建容器">

68 在 Mac 上使用 `Cmd+Shift+P` 或在 Windows 和 Linux 上使用 `Ctrl+Shift+P` 打开 VS Code 命令面板,然后运行 **Dev Containers: Rebuild Container**。

69 

70 对于其他工具,请按照该工具的重建操作:参阅 [GitHub Codespaces 中的重建](https://docs.github.com/en/codespaces/developing-in-a-codespace/rebuilding-the-container-in-a-codespace)、[Dev Containers CLI](https://github.com/devcontainers/cli) 或您的 IDE 的开发容器文档。

71 </Step>

72 

73 <Step title="登录 Claude Code">

74 在重建的容器中打开终端并运行 `claude`,然后按照身份验证提示进行操作。

75 </Step>

76</Steps>

77 

78您在身份验证提示处看到的内容取决于您的提供商:

79 

80* **Anthropic**:通过浏览器使用您的 Claude 或 Anthropic Console 账户登录

81* **[Amazon Bedrock、Google Vertex AI 或 Microsoft Foundry](/zh-CN/third-party-integrations)**:Claude Code 使用您的云提供商凭证,无需浏览器提示

82 

83对于云提供商,通过 `containerEnv`、Codespaces 密钥或您的云的工作负载身份将凭证传递到容器中,而不是从主机挂载凭证文件。有关凭证链的详细信息,请参阅 [Amazon Bedrock](/zh-CN/amazon-bedrock)、[Google Vertex AI](/zh-CN/google-vertex-ai) 或 [Microsoft Foundry](/zh-CN/microsoft-foundry),Claude Code 会读取这些信息。

84 

85请参阅[选择您的 API 提供商](/zh-CN/admin-setup#choose-your-api-provider)以决定哪条路径适合您的组织。

86 

87<Note>

88 如果浏览器登录完成但回调从未到达容器,请复制浏览器中显示的代码并将其粘贴到终端中的 `Paste code here if prompted` 提示处。当编辑器的端口转发不路由 localhost 回调时,可能会发生这种情况。

89</Note>

90 

91## 在重建过程中保持身份验证和设置

92 

93默认情况下,容器的主目录在重建时会被丢弃,因此工程师必须每次都重新登录。Claude Code 将其身份验证令牌、用户设置和会话历史存储在 [`~/.claude`](/zh-CN/claude-directory) 下。在该路径挂载一个命名卷以在重建过程中保持此状态。

94 

95以下示例在 `node` 用户的主目录处挂载一个卷:

96 

97```json devcontainer.json theme={null}

98"mounts": [

99 "source=claude-code-config,target=/home/node/.claude,type=volume"

100]

101```

102 

103将 `/home/node` 替换为容器的 `remoteUser` 的主目录。如果您在 `~/.claude` 以外的位置挂载卷,请设置 [`CLAUDE_CONFIG_DIR`](/zh-CN/env-vars) 为挂载路径,以便 Claude Code 在那里读取和写入。

104 

105要按项目隔离状态而不是在所有存储库中共享一个卷,请在源名称中包含 `${devcontainerId}` 变量。[参考配置](https://github.com/anthropics/claude-code/blob/main/.devcontainer/devcontainer.json) 为此目的使用 `source=claude-code-config-${devcontainerId}`。

106 

107在 GitHub Codespaces 中,`~/.claude` 在停止和启动 codespace 时会保持,但在重建容器时仍会被清除,因此上面的卷挂载也适用于此。要在 codespace 之间进行身份验证,请将 `ANTHROPIC_API_KEY` 或来自 [`claude setup-token`](/zh-CN/authentication#generate-a-long-lived-token) 的 `CLAUDE_CODE_OAUTH_TOKEN` 存储为 [Codespaces 密钥](https://docs.github.com/en/codespaces/managing-your-codespaces/managing-your-account-specific-secrets-for-github-codespaces);Codespaces 会自动将密钥作为环境变量提供给容器内部。

108 

109## 强制执行组织策略

110 

111开发容器是应用组织策略的便利场所,因为相同的镜像和配置在每个工程师的机器上运行。

112 

113Claude Code 在 Linux 上读取 `/etc/claude-code/managed-settings.json` 并在[设置层次结构](/zh-CN/settings#how-scopes-interact)中以最高优先级应用它,因此那里的值会覆盖工程师在 `~/.claude` 或项目的 `.claude/` 目录中设置的任何内容。从您的 Dockerfile 复制文件到位:

114 

115```dockerfile Dockerfile theme={null}

116RUN mkdir -p /etc/claude-code

117COPY managed-settings.json /etc/claude-code/managed-settings.json

118```

119 

120因为 Dockerfile 存在于存储库中,任何具有写入权限的人都可以更改或删除此步骤。对于工程师无法通过编辑存储库文件来绕过的策略,请通过[服务器管理的设置](/zh-CN/server-managed-settings)或您的 MDM 提供托管设置。有关可用的键和其他交付路径,请参阅[托管设置文件](/zh-CN/settings#settings-files)。

121 

122要设置适用于容器中每个 Claude Code 会话的[环境变量](/zh-CN/env-vars),请将它们添加到 `devcontainer.json` 中的 `containerEnv`。以下示例选择退出遥测和错误报告,并防止 Claude Code 在安装后自动更新:

123 

124```json devcontainer.json theme={null}

125"containerEnv": {

126 "CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": "1",

127 "DISABLE_AUTOUPDATER": "1"

128}

129```

130 

131Dev Container Feature 始终安装最新的 Claude Code 版本。要为可重现的构建固定特定的 Claude Code 版本,请从您的 Dockerfile 使用 `npm install -g @anthropic-ai/claude-code@X.Y.Z` 安装它,而不是使用该功能,并设置 `DISABLE_AUTOUPDATER`,如上所示。

132 

133有关完整的策略控制列表,包括权限规则、工具限制和 MCP 服务器允许列表,请参阅[为您的组织设置 Claude Code](/zh-CN/admin-setup)。

134 

135要在容器内提供 [MCP 服务器](/zh-CN/mcp),请在存储库根目录的 `.mcp.json` 文件中的[项目范围](/zh-CN/mcp#mcp-installation-scopes)定义它们,以便它们与您的开发容器配置一起签入。在您的 Dockerfile 中安装本地 stdio 服务器依赖的任何二进制文件,并将远程服务器域添加到您的网络允许列表。

136 

137## 限制网络出站流量

138 

139您可以将容器的出站流量限制为仅 Claude Code 需要的域。有关推理和身份验证域,请参阅[网络访问要求](/zh-CN/network-config#network-access-requirements),有关可选的遥测和错误报告连接以及如何禁用它们,请参阅[遥测服务](/zh-CN/data-usage#telemetry-services)。

140 

141参考容器包含一个 [`init-firewall.sh`](https://github.com/anthropics/claude-code/blob/main/.devcontainer/init-firewall.sh) 脚本,该脚本阻止除 Claude Code 和您的开发工具需要的域之外的所有出站流量。在容器内运行防火墙需要额外的权限,因此参考通过 `runArgs` 添加 `NET_ADMIN` 和 `NET_RAW` 功能。防火墙脚本和这些功能对于 Claude Code 本身不是必需的:您可以将其省略并改为依赖您自己的网络控制。

142 

143## 无需权限提示即可运行

144 

145因为容器以非 root 用户身份运行 Claude Code 并将命令执行限制在容器内,您可以传递 `--dangerously-skip-permissions` 以进行无人值守操作。当以 root 身份启动时,CLI 会拒绝此标志,因此请确认 `remoteUser` 设置为非 root 账户。

146 

147跳过权限提示会移除您在工具调用运行前审查它们的机会。Claude 仍然可以修改绑定挂载的工作区中的任何文件(这直接显示在您的主机上),并访问容器的网络策略允许的任何内容。将此标志与上面的[网络出站流量限制](#restrict-network-egress)配对,以限制绕过的会话可以访问的内容。

148 

149如果您想要更少的提示而不禁用安全检查,请考虑改为[自动模式](/zh-CN/permission-modes#eliminate-prompts-with-auto-mode),它有一个分类器在运行前审查操作。要完全防止工程师使用 `--dangerously-skip-permissions`,请在[托管设置](/zh-CN/settings#permission-settings)中将 `permissions.disableBypassPermissionsMode` 设置为 `"disable"`。

150 

151## 尝试参考容器

152 

153[`anthropics/claude-code`](https://github.com/anthropics/claude-code/tree/main/.devcontainer) 存储库包含一个示例开发容器,它结合了 CLI、出站防火墙、持久卷和基于 Zsh 的 shell。它作为工作示例而不是维护的基础镜像提供;在将其应用到您自己的配置之前,使用它来查看这些部分如何组合在一起。

154 

155<Steps>

156 <Step title="安装先决条件">

157 安装 VS Code 和 [Dev Containers 扩展](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers)。

158 </Step>

159 

160 <Step title="克隆参考">

161 克隆 [Claude Code 存储库](https://github.com/anthropics/claude-code) 并在 VS Code 中打开它。

162 </Step>

163 

164 <Step title="在容器中重新打开">

165 出现提示时,点击 **Reopen in Container**,或从命令面板运行 **Dev Containers: Reopen in Container**。

166 </Step>

167 

168 <Step title="启动 Claude Code">

169 容器完成构建后,使用 `` Ctrl+` `` 打开终端并运行 `claude` 以登录并启动您的第一个会话。

170 </Step>

171</Steps>

172 

173要将此配置用于您自己的项目,请将 `.devcontainer/` 目录复制到您的存储库中并为您的工具链调整 Dockerfile,或返回[在开发容器中添加 Claude Code](#add-claude-code-to-your-dev-container) 以仅将功能添加到您已有的设置中。

174 

175参考配置由三个文件组成。当您通过功能将 Claude Code 添加到您自己的开发容器时,这些文件都不是必需的,但它们展示了一种组合这些部分的方式。

176 

177| 文件 | 目的 |

178| ---------------------------------------------------------------------------------------------------------- | ------------------------------------------- |

179| [`devcontainer.json`](https://github.com/anthropics/claude-code/blob/main/.devcontainer/devcontainer.json) | 卷挂载、`runArgs` 功能、VS Code 扩展和 `containerEnv` |

180| [`Dockerfile`](https://github.com/anthropics/claude-code/blob/main/.devcontainer/Dockerfile) | 基础镜像、开发工具和 Claude Code 安装 |

181| [`init-firewall.sh`](https://github.com/anthropics/claude-code/blob/main/.devcontainer/init-firewall.sh) | 阻止除允许的域之外的所有出站网络流量 |

182 

183## 后续步骤

184 

185Claude Code 在您的开发容器中运行后,下面的页面涵盖了组织推出的其余部分:选择身份验证路径、在存储库外交付托管策略、监控使用情况以及了解 Claude Code 存储和发送的内容。

186 

187* [为您的组织设置 Claude Code](/zh-CN/admin-setup):选择身份验证提供商、决定策略如何到达设备以及规划推出

188* [服务器管理的设置](/zh-CN/server-managed-settings):从 Claude.ai 管理控制台交付托管策略,以便工程师无法通过编辑存储库文件来绕过它

189* [监控使用情况和审计活动](/zh-CN/monitoring-usage):导出 OpenTelemetry 指标并查看您的团队正在运行的内容

190* [网络访问要求](/zh-CN/network-config#network-access-requirements):代理和防火墙的完整域允许列表

191* [遥测服务和选择退出](/zh-CN/data-usage#telemetry-services):Claude Code 默认发送的内容以及禁用它的环境变量

192* [探索 `.claude` 目录](/zh-CN/claude-directory):卷挂载包含的内容,包括凭证、设置和会话历史

193* [安全模型](/zh-CN/security):Claude Code 的权限系统、沙箱和提示注入保护如何组合在一起

194* [权限模式](/zh-CN/permission-modes):从计划模式到自动模式再到绕过的完整范围,以及何时使用每种模式

discover-plugins.md +427 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 通过市场发现和安装预构建插件

6 

7> 从市场发现和安装插件,以使用新命令、代理和功能扩展 Claude Code。

8 

9插件通过 skills、agents、hooks 和 MCP servers 扩展 Claude Code。插件市场是帮助您发现和安装这些扩展的目录,无需自己构建。

10 

11想要创建和分发自己的市场?请参阅[创建和分发插件市场](/zh-CN/plugin-marketplaces)。

12 

13## 市场如何工作

14 

15市场是他人创建和共享的插件目录。使用市场是一个两步过程:

16 

17<Steps>

18 <Step title="添加市场">

19 这会向 Claude Code 注册目录,以便您可以浏览可用内容。尚未安装任何插件。

20 </Step>

21 

22 <Step title="安装单个插件">

23 浏览目录并安装您想要的插件。

24 </Step>

25</Steps>

26 

27可以将其视为添加应用商店:添加商店让您可以访问浏览其集合,但您仍然需要单独选择要下载的应用。

28 

29## 官方 Anthropic 市场

30 

31官方 Anthropic 市场(`claude-plugins-official`)在您启动 Claude Code 时自动可用。运行 `/plugin` 并转到**发现**选项卡以浏览可用内容,或在 [claude.com/plugins](https://claude.com/plugins) 查看目录。

32 

33要从官方市场安装插件,请使用 `/plugin install <name>@claude-plugins-official`。例如,要安装 GitHub 集成:

34 

35```shell theme={null}

36/plugin install github@claude-plugins-official

37```

38 

39<Note>

40 官方市场由 Anthropic 维护。要向官方市场提交插件,请使用应用内提交表单之一:

41 

42 * **Claude.ai**: [claude.ai/settings/plugins/submit](https://claude.ai/settings/plugins/submit)

43 * **Console**: [platform.claude.com/plugins/submit](https://platform.claude.com/plugins/submit)

44 

45 要独立分发插件,请[创建您自己的市场](/zh-CN/plugin-marketplaces)并与用户共享。

46</Note>

47 

48官方市场包括多个插件类别:

49 

50### 代码智能

51 

52代码智能插件启用 Claude Code 的内置 LSP 工具,使 Claude 能够跳转到定义、查找引用并在编辑后立即查看类型错误。这些插件配置[语言服务器协议](https://microsoft.github.io/language-server-protocol/)连接,这是为 VS Code 代码智能提供支持的相同技术。

53 

54这些插件需要在您的系统上安装语言服务器二进制文件。如果您已经安装了语言服务器,当您打开项目时,Claude 可能会提示您安装相应的插件。

55 

56| 语言 | 插件 | 所需二进制文件 |

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

58| C/C++ | `clangd-lsp` | `clangd` |

59| C# | `csharp-lsp` | `csharp-ls` |

60| Go | `gopls-lsp` | `gopls` |

61| Java | `jdtls-lsp` | `jdtls` |

62| Kotlin | `kotlin-lsp` | `kotlin-language-server` |

63| Lua | `lua-lsp` | `lua-language-server` |

64| PHP | `php-lsp` | `intelephense` |

65| Python | `pyright-lsp` | `pyright-langserver` |

66| Rust | `rust-analyzer-lsp` | `rust-analyzer` |

67| Swift | `swift-lsp` | `sourcekit-lsp` |

68| TypeScript | `typescript-lsp` | `typescript-language-server` |

69 

70您也可以[为其他语言创建自己的 LSP 插件](/zh-CN/plugins-reference#lsp-servers)。

71 

72<Note>

73 如果在安装插件后在 `/plugin` 错误选项卡中看到 `Executable not found in $PATH`,请从上表安装所需的二进制文件。

74</Note>

75 

76#### Claude 从代码智能插件获得的功能

77 

78安装代码智能插件并且其语言服务器二进制文件可用后,Claude 获得两项功能:

79 

80* **自动诊断**:在 Claude 进行的每次文件编辑后,语言服务器分析更改并自动报告错误和警告。Claude 看到类型错误、缺失导入和语法问题,无需运行编译器或 linter。如果 Claude 引入错误,它会注意到并在同一轮中修复问题。这不需要除安装插件外的任何配置。当"发现诊断"指示器出现时,您可以按 **Ctrl+O** 来内联查看诊断。

81* **代码导航**:Claude 可以使用语言服务器跳转到定义、查找引用、获取悬停时的类型信息、列出符号、查找实现和追踪调用层次结构。这些操作为 Claude 提供比基于 grep 的搜索更精确的导航,尽管可用性可能因语言和环境而异。

82 

83如果遇到问题,请参阅[代码智能故障排除](#code-intelligence-issues)。

84 

85### 外部集成

86 

87这些插件捆绑预配置的 [MCP servers](/zh-CN/mcp),以便您可以连接 Claude 到外部服务,无需手动设置:

88 

89* **源代码控制**:`github`、`gitlab`

90* **项目管理**:`atlassian`(Jira/Confluence)、`asana`、`linear`、`notion`

91* **设计**:`figma`

92* **基础设施**:`vercel`、`firebase`、`supabase`

93* **通信**:`slack`

94* **监控**:`sentry`

95 

96### 开发工作流

97 

98为常见开发任务添加命令和代理的插件:

99 

100* **commit-commands**:Git 提交工作流,包括提交、推送和 PR 创建

101* **pr-review-toolkit**:用于审查拉取请求的专门代理

102* **agent-sdk-dev**:使用 Claude Agent SDK 构建的工具

103* **plugin-dev**:用于创建您自己的插件的工具包

104 

105### 输出样式

106 

107自定义 Claude 的响应方式:

108 

109* **explanatory-output-style**:关于实现选择的教育见解

110* **learning-output-style**:用于技能构建的交互式学习模式

111 

112## 尝试:添加演示市场

113 

114Anthropic 还维护一个[演示插件市场](https://github.com/anthropics/claude-code/tree/main/plugins)(`claude-code-plugins`),其中包含展示插件系统可能性的示例插件。与官方市场不同,您需要手动添加此市场。

115 

116<Steps>

117 <Step title="添加市场">

118 在 Claude Code 中,为 `anthropics/claude-code` 市场运行 `plugin marketplace add` 命令:

119 

120 ```shell theme={null}

121 /plugin marketplace add anthropics/claude-code

122 ```

123 

124 这会下载市场目录并使其插件对您可用。

125 </Step>

126 

127 <Step title="浏览可用插件">

128 运行 `/plugin` 打开插件管理器。这会打开一个选项卡式界面,有四个选项卡,您可以使用 **Tab** 循环切换(或使用 **Shift+Tab** 向后切换):

129 

130 * **发现**:从所有市场浏览可用插件

131 * **已安装**:查看和管理已安装的插件

132 * **市场**:添加、删除或更新已添加的市场

133 * **错误**:查看任何插件加载错误

134 

135 转到**发现**选项卡以查看您刚添加的市场中的插件。

136 </Step>

137 

138 <Step title="安装插件">

139 选择一个插件以查看其详细信息,然后选择安装范围:

140 

141 * **用户范围**:在所有项目中为自己安装

142 * **项目范围**:为此存储库上的所有协作者安装

143 * **本地范围**:仅在此存储库中为自己安装

144 

145 例如,选择 **commit-commands**(添加 git 工作流命令的插件)并将其安装到您的用户范围。

146 

147 您也可以从命令行直接安装:

148 

149 ```shell theme={null}

150 /plugin install commit-commands@anthropics-claude-code

151 ```

152 

153 请参阅[配置范围](/zh-CN/settings#configuration-scopes)以了解有关范围的更多信息。

154 </Step>

155 

156 <Step title="使用您的新插件">

157 安装后,运行 `/reload-plugins` 以激活插件。插件命令由插件名称命名空间,因此 **commit-commands** 提供诸如 `/commit-commands:commit` 之类的命令。

158 

159 通过对文件进行更改并运行来尝试:

160 

161 ```shell theme={null}

162 /commit-commands:commit

163 ```

164 

165 这会暂存您的更改、生成提交消息并创建提交。

166 

167 每个插件的工作方式不同。检查**发现**选项卡中的插件描述或其主页以了解它提供的命令和功能。

168 </Step>

169</Steps>

170 

171本指南的其余部分涵盖了添加市场、安装插件和管理配置的所有方式。

172 

173## 添加市场

174 

175使用 `/plugin marketplace add` 命令从不同来源添加市场。

176 

177<Tip>

178 **快捷方式**:您可以使用 `/plugin market` 代替 `/plugin marketplace`,以及使用 `rm` 代替 `remove`。

179</Tip>

180 

181* **GitHub 存储库**:`owner/repo` 格式(例如,`anthropics/claude-code`)

182* **Git URL**:任何 git 存储库 URL(GitLab、Bitbucket、自托管)

183* **本地路径**:目录或 `marketplace.json` 文件的直接路径

184* **远程 URL**:托管 `marketplace.json` 文件的直接 URL

185 

186### 从 GitHub 添加

187 

188使用 `owner/repo` 格式添加包含 `.claude-plugin/marketplace.json` 文件的 GitHub 存储库,其中 `owner` 是 GitHub 用户名或组织,`repo` 是存储库名称。

189 

190例如,`anthropics/claude-code` 指的是由 `anthropics` 拥有的 `claude-code` 存储库:

191 

192```shell theme={null}

193/plugin marketplace add anthropics/claude-code

194```

195 

196### 从其他 Git 主机添加

197 

198通过提供完整 URL 添加任何 git 存储库。这适用于任何 Git 主机,包括 GitLab、Bitbucket 和自托管服务器:

199 

200使用 HTTPS:

201 

202```shell theme={null}

203/plugin marketplace add https://gitlab.com/company/plugins.git

204```

205 

206使用 SSH:

207 

208```shell theme={null}

209/plugin marketplace add git@gitlab.com:company/plugins.git

210```

211 

212要添加特定分支或标签,请在 `#` 后附加 ref:

213 

214```shell theme={null}

215/plugin marketplace add https://gitlab.com/company/plugins.git#v1.0.0

216```

217 

218### 从本地路径添加

219 

220添加包含 `.claude-plugin/marketplace.json` 文件的本地目录:

221 

222```shell theme={null}

223/plugin marketplace add ./my-marketplace

224```

225 

226您也可以添加 `marketplace.json` 文件的直接路径:

227 

228```shell theme={null}

229/plugin marketplace add ./path/to/marketplace.json

230```

231 

232### 从远程 URL 添加

233 

234通过 URL 添加远程 `marketplace.json` 文件:

235 

236```shell theme={null}

237/plugin marketplace add https://example.com/marketplace.json

238```

239 

240<Note>

241 与基于 Git 的市场相比,基于 URL 的市场有一些限制。如果在安装插件时遇到"路径未找到"错误,请参阅[故障排除](/zh-CN/plugin-marketplaces#plugins-with-relative-paths-fail-in-url-based-marketplaces)。

242</Note>

243 

244## 安装插件

245 

246添加市场后,您可以直接安装插件(默认安装到用户范围):

247 

248```shell theme={null}

249/plugin install plugin-name@marketplace-name

250```

251 

252要选择不同的[安装范围](/zh-CN/settings#configuration-scopes),请使用交互式 UI:运行 `/plugin`,转到**发现**选项卡,然后在插件上按 **Enter**。您将看到以下选项:

253 

254* **用户范围**(默认):在所有项目中为自己安装

255* **项目范围**:为此存储库上的所有协作者安装(添加到 `.claude/settings.json`)

256* **本地范围**:仅在此存储库中为自己安装(不与协作者共享)

257 

258您也可能看到具有**托管**范围的插件——这些由管理员通过[托管设置](/zh-CN/settings#settings-files)安装,无法修改。

259 

260运行 `/plugin` 并转到**已安装**选项卡以查看按范围分组的插件。

261 

262<Warning>

263 在安装插件之前,请确保您信任该插件。Anthropic 不控制插件中包含的 MCP servers、文件或其他软件,也无法验证它们是否按预期工作。检查每个插件的主页以获取更多信息。

264</Warning>

265 

266## 管理已安装的插件

267 

268运行 `/plugin` 并转到**已安装**选项卡以查看、启用、禁用或卸载您的插件。键入以按插件名称或描述筛选列表。

269 

270您也可以使用直接命令管理插件。

271 

272禁用插件而不卸载:

273 

274```shell theme={null}

275/plugin disable plugin-name@marketplace-name

276```

277 

278重新启用已禁用的插件:

279 

280```shell theme={null}

281/plugin enable plugin-name@marketplace-name

282```

283 

284完全删除插件:

285 

286```shell theme={null}

287/plugin uninstall plugin-name@marketplace-name

288```

289 

290`--scope` 选项允许您使用 CLI 命令针对特定范围:

291 

292```shell theme={null}

293claude plugin install formatter@your-org --scope project

294claude plugin uninstall formatter@your-org --scope project

295```

296 

297### 应用插件更改而不重启

298 

299当您在会话期间安装、启用或禁用插件时,运行 `/reload-plugins` 以在不重启的情况下获取所有更改:

300 

301```shell theme={null}

302/reload-plugins

303```

304 

305Claude Code 重新加载所有活跃插件,并显示重新加载的命令、skills、agents、hooks、插件 MCP servers 和插件 LSP servers 的计数。

306 

307## 管理市场

308 

309您可以通过交互式 `/plugin` 界面或 CLI 命令管理市场。

310 

311### 使用交互式界面

312 

313运行 `/plugin` 并转到**市场**选项卡以:

314 

315* 查看所有已添加的市场及其来源和状态

316* 添加新市场

317* 更新市场列表以获取最新插件

318* 删除您不再需要的市场

319 

320### 使用 CLI 命令

321 

322您也可以使用直接命令管理市场。

323 

324列出所有配置的市场:

325 

326```shell theme={null}

327/plugin marketplace list

328```

329 

330刷新市场的插件列表:

331 

332```shell theme={null}

333/plugin marketplace update marketplace-name

334```

335 

336删除市场:

337 

338```shell theme={null}

339/plugin marketplace remove marketplace-name

340```

341 

342<Warning>

343 删除市场将卸载您从中安装的任何插件。

344</Warning>

345 

346### 配置自动更新

347 

348Claude Code 可以在启动时自动更新市场及其已安装的插件。为市场启用自动更新后,Claude Code 会刷新市场数据并将已安装的插件更新到最新版本。如果任何插件已更新,您将看到提示您运行 `/reload-plugins` 的通知。

349 

350通过 UI 为单个市场切换自动更新:

351 

3521. 运行 `/plugin` 打开插件管理器

3532. 选择**市场**

3543. 从列表中选择市场

3554. 选择**启用自动更新**或**禁用自动更新**

356 

357官方 Anthropic 市场默认启用自动更新。第三方和本地开发市场默认禁用自动更新。

358 

359要完全禁用 Claude Code 和所有插件的所有自动更新,请设置 `DISABLE_AUTOUPDATER` 环境变量。有关详细信息,请参阅[自动更新](/zh-CN/setup#auto-updates)。

360 

361要在禁用 Claude Code 自动更新的同时保持插件自动更新启用,请设置 `FORCE_AUTOUPDATE_PLUGINS=1` 以及 `DISABLE_AUTOUPDATER`:

362 

363```bash theme={null}

364export DISABLE_AUTOUPDATER=1

365export FORCE_AUTOUPDATE_PLUGINS=1

366```

367 

368当您想手动管理 Claude Code 更新但仍接收自动插件更新时,这很有用。

369 

370## 配置团队市场

371 

372团队管理员可以通过将市场配置添加到 `.claude/settings.json` 来为项目设置自动市场安装。当团队成员信任存储库文件夹时,Claude Code 会提示他们安装这些市场和插件。

373 

374将 `extraKnownMarketplaces` 添加到您项目的 `.claude/settings.json`:

375 

376```json theme={null}

377{

378 "extraKnownMarketplaces": {

379 "my-team-tools": {

380 "source": {

381 "source": "github",

382 "repo": "your-org/claude-plugins"

383 }

384 }

385 }

386}

387```

388 

389有关完整配置选项(包括 `extraKnownMarketplaces` 和 `enabledPlugins`),请参阅[插件设置](/zh-CN/settings#plugin-settings)。

390 

391## 安全性

392 

393插件和市场是高度受信任的组件,可以使用您的用户权限在您的机器上执行任意代码。仅从您信任的来源安装插件和添加市场。组织可以使用[托管市场限制](/zh-CN/plugin-marketplaces#managed-marketplace-restrictions)限制用户允许添加的市场。

394 

395## 故障排除

396 

397### /plugin 命令无法识别

398 

399如果您看到"未知命令"或 `/plugin` 命令未出现:

400 

4011. **检查您的版本**:运行 `claude --version` 以查看安装的内容。

4022. **更新 Claude Code**:

403 * **Homebrew**:`brew upgrade claude-code`

404 * **npm**:`npm update -g @anthropic-ai/claude-code`

405 * **本地安装程序**:从[设置](/zh-CN/setup)重新运行安装命令

4063. **重启 Claude Code**:更新后,重启您的终端并再次运行 `claude`。

407 

408### 常见问题

409 

410* **市场未加载**:验证 URL 是否可访问以及 `.claude-plugin/marketplace.json` 是否存在于该路径

411* **插件安装失败**:检查插件源 URL 是否可访问以及存储库是否公开(或您有访问权限)

412* **安装后找不到文件**:插件被复制到缓存,因此引用插件目录外文件的路径将不起作用

413* **插件 skills 未出现**:使用 `rm -rf ~/.claude/plugins/cache` 清除缓存,重启 Claude Code,然后重新安装插件。

414 

415有关详细的故障排除和解决方案,请参阅市场指南中的[故障排除](/zh-CN/plugin-marketplaces#troubleshooting)。有关调试工具,请参阅[调试和开发工具](/zh-CN/plugins-reference#debugging-and-development-tools)。

416 

417### 代码智能问题

418 

419* **语言服务器未启动**:验证二进制文件已安装且在您的 `$PATH` 中可用。检查 `/plugin` 错误选项卡以获取详细信息。

420* **高内存使用**:`rust-analyzer` 和 `pyright` 等语言服务器在大型项目上可能消耗大量内存。如果您遇到内存问题,请使用 `/plugin disable <plugin-name>` 禁用插件,并改为依赖 Claude 的内置搜索工具。

421* **monorepos 中的误报诊断**:如果工作区配置不正确,语言服务器可能会报告内部包的未解析导入错误。这些不会影响 Claude 编辑代码的能力。

422 

423## 后续步骤

424 

425* **构建您自己的插件**:请参阅[插件](/zh-CN/plugins)以创建 skills、agents 和 hooks

426* **创建市场**:请参阅[创建插件市场](/zh-CN/plugin-marketplaces)以将插件分发给您的团队或社区

427* **技术参考**:请参阅[插件参考](/zh-CN/plugins-reference)以获取完整规范

env-vars.md +238 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 环境变量

6 

7> 控制 Claude Code 行为的环境变量完整参考。

8 

9Claude Code 支持以下环境变量来控制其行为。在启动 `claude` 之前在 shell 中设置它们,或在 [`settings.json`](/zh-CN/settings#available-settings) 中的 `env` 键下配置它们,以将其应用于每个会话或在团队中推出。

10 

11| 变量 | 目的 |

12| :------------------------------------------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

13| `ANTHROPIC_API_KEY` | 作为 `X-Api-Key` 标头发送的 API 密钥。设置后,即使您已登录,此密钥也会用于替代您的 Claude Pro、Max、Team 或 Enterprise 订阅。在非交互模式(`-p`)中,存在时始终使用该密钥。在交互模式中,系统会提示您在密钥覆盖订阅之前批准一次。要改用您的订阅,请运行 `unset ANTHROPIC_API_KEY` |

14| `ANTHROPIC_AUTH_TOKEN` | `Authorization` 标头的自定义值(您在此处设置的值将以 `Bearer ` 为前缀) |

15| `ANTHROPIC_BASE_URL` | 覆盖 API 端点以通过代理或网关路由请求。设置为非第一方主机时,[MCP 工具搜索](/zh-CN/mcp#scale-with-mcp-tool-search)默认禁用。如果您的代理转发 `tool_reference` 块,请设置 `ENABLE_TOOL_SEARCH=true` |

16| `ANTHROPIC_BEDROCK_BASE_URL` | 覆盖 Bedrock 端点 URL。用于自定义 Bedrock 端点或通过 [LLM 网关](/zh-CN/llm-gateway)路由时。请参阅 [Amazon Bedrock](/zh-CN/amazon-bedrock) |

17| `ANTHROPIC_BEDROCK_MANTLE_BASE_URL` | 覆盖 Bedrock Mantle 端点 URL。请参阅 [Mantle 端点](/zh-CN/amazon-bedrock#use-the-mantle-endpoint) |

18| `ANTHROPIC_BEDROCK_SERVICE_TIER` | Bedrock [服务层](https://docs.aws.amazon.com/bedrock/latest/userguide/service-tiers-inference.html)(`default`、`flex` 或 `priority`)。作为 `X-Amzn-Bedrock-Service-Tier` 标头发送。请参阅 [Amazon Bedrock](/zh-CN/amazon-bedrock#service-tiers) |

19| `ANTHROPIC_BETAS` | 逗号分隔的其他 `anthropic-beta` 标头值列表,以包含在 API 请求中。Claude Code 已发送其需要的 beta 标头;使用此选项可在 Claude Code 添加原生支持之前选择加入 [Anthropic API beta](https://platform.claude.com/docs/en/api/beta-headers)。与需要 API 密钥身份验证的 [`--betas` 标志](/zh-CN/cli-reference#cli-flags)不同,此变量适用于所有身份验证方法,包括 Claude.ai 订阅 |

20| `ANTHROPIC_CUSTOM_HEADERS` | 要添加到请求的自定义标头(`Name: Value` 格式,多个标头用换行符分隔) |

21| `ANTHROPIC_CUSTOM_MODEL_OPTION` | 要在 `/model` 选择器中添加为自定义条目的模型 ID。使用此选项可以使非标准或网关特定的模型可选择,而无需替换内置别名。请参阅[模型配置](/zh-CN/model-config#add-a-custom-model-option) |

22| `ANTHROPIC_CUSTOM_MODEL_OPTION_DESCRIPTION` | `/model` 选择器中自定义模型条目的显示描述。未设置时默认为 `Custom model (<model-id>)` |

23| `ANTHROPIC_CUSTOM_MODEL_OPTION_NAME` | `/model` 选择器中自定义模型条目的显示名称。未设置时默认为模型 ID |

24| `ANTHROPIC_CUSTOM_MODEL_OPTION_SUPPORTED_CAPABILITIES` | 请参阅[模型配置](/zh-CN/model-config#customize-pinned-model-display-and-capabilities) |

25| `ANTHROPIC_DEFAULT_HAIKU_MODEL` | 请参阅[模型配置](/zh-CN/model-config#environment-variables) |

26| `ANTHROPIC_DEFAULT_HAIKU_MODEL_DESCRIPTION` | 请参阅[模型配置](/zh-CN/model-config#customize-pinned-model-display-and-capabilities) |

27| `ANTHROPIC_DEFAULT_HAIKU_MODEL_NAME` | 请参阅[模型配置](/zh-CN/model-config#customize-pinned-model-display-and-capabilities) |

28| `ANTHROPIC_DEFAULT_HAIKU_MODEL_SUPPORTED_CAPABILITIES` | 请参阅[模型配置](/zh-CN/model-config#customize-pinned-model-display-and-capabilities) |

29| `ANTHROPIC_DEFAULT_OPUS_MODEL` | 请参阅[模型配置](/zh-CN/model-config#environment-variables) |

30| `ANTHROPIC_DEFAULT_OPUS_MODEL_DESCRIPTION` | 请参阅[模型配置](/zh-CN/model-config#customize-pinned-model-display-and-capabilities) |

31| `ANTHROPIC_DEFAULT_OPUS_MODEL_NAME` | 请参阅[模型配置](/zh-CN/model-config#customize-pinned-model-display-and-capabilities) |

32| `ANTHROPIC_DEFAULT_OPUS_MODEL_SUPPORTED_CAPABILITIES` | 请参阅[模型配置](/zh-CN/model-config#customize-pinned-model-display-and-capabilities) |

33| `ANTHROPIC_DEFAULT_SONNET_MODEL` | 请参阅[模型配置](/zh-CN/model-config#environment-variables) |

34| `ANTHROPIC_DEFAULT_SONNET_MODEL_DESCRIPTION` | 请参阅[模型配置](/zh-CN/model-config#customize-pinned-model-display-and-capabilities) |

35| `ANTHROPIC_DEFAULT_SONNET_MODEL_NAME` | 请参阅[模型配置](/zh-CN/model-config#customize-pinned-model-display-and-capabilities) |

36| `ANTHROPIC_DEFAULT_SONNET_MODEL_SUPPORTED_CAPABILITIES` | 请参阅[模型配置](/zh-CN/model-config#customize-pinned-model-display-and-capabilities) |

37| `ANTHROPIC_FOUNDRY_API_KEY` | Microsoft Foundry 身份验证的 API 密钥(请参阅 [Microsoft Foundry](/zh-CN/microsoft-foundry)) |

38| `ANTHROPIC_FOUNDRY_BASE_URL` | Foundry 资源的完整基础 URL(例如,`https://my-resource.services.ai.azure.com/anthropic`)。`ANTHROPIC_FOUNDRY_RESOURCE` 的替代方案(请参阅 [Microsoft Foundry](/zh-CN/microsoft-foundry)) |

39| `ANTHROPIC_FOUNDRY_RESOURCE` | Foundry 资源名称(例如,`my-resource`)。如果未设置 `ANTHROPIC_FOUNDRY_BASE_URL`,则为必需(请参阅 [Microsoft Foundry](/zh-CN/microsoft-foundry)) |

40| `ANTHROPIC_MODEL` | 要使用的模型设置的名称(请参阅[模型配置](/zh-CN/model-config#environment-variables)) |

41| `ANTHROPIC_SMALL_FAST_MODEL` | \[已弃用] [用于后台任务的 Haiku 级模型](/zh-CN/costs)的名称 |

42| `ANTHROPIC_SMALL_FAST_MODEL_AWS_REGION` | 使用 Bedrock 或 Bedrock Mantle 时覆盖 Haiku 级模型的 AWS 区域 |

43| `ANTHROPIC_VERTEX_BASE_URL` | 覆盖 Vertex AI 端点 URL。用于自定义 Vertex 端点或通过 [LLM 网关](/zh-CN/llm-gateway)路由时。请参阅 [Google Vertex AI](/zh-CN/google-vertex-ai) |

44| `ANTHROPIC_VERTEX_PROJECT_ID` | Vertex AI 的 GCP 项目 ID。使用 [Google Vertex AI](/zh-CN/google-vertex-ai) 时为必需 |

45| `API_TIMEOUT_MS` | API 请求的超时时间(以毫秒为单位)(默认值:600000,或 10 分钟;最大值:2147483647)。在缓慢网络上请求超时或通过代理路由时增加此值。超过最大值的值会导致底层计时器溢出,导致请求立即失败 |

46| `AWS_BEARER_TOKEN_BEDROCK` | 用于身份验证的 Bedrock API 密钥(请参阅 [Bedrock API 密钥](https://aws.amazon.com/blogs/machine-learning/accelerate-ai-development-with-amazon-bedrock-api-keys/)) |

47| `BASH_DEFAULT_TIMEOUT_MS` | 长时间运行的 bash 命令的默认超时(默认值:120000,或 2 分钟) |

48| `BASH_MAX_OUTPUT_LENGTH` | bash 输出中的最大字符数,超过此数字后将进行中间截断 |

49| `BASH_MAX_TIMEOUT_MS` | 模型可以为长时间运行的 bash 命令设置的最大超时(默认值:600000,或 10 分钟) |

50| `CCR_FORCE_BUNDLE` | 设置为 `1` 以强制 [`claude --remote`](/zh-CN/claude-code-on-the-web#send-local-repositories-without-github) 捆绑并上传您的本地存储库,即使 GitHub 访问可用 |

51| `CLAUDECODE` | 在 Claude Code 生成的 shell 环境中设置为 `1`(Bash 工具、tmux 会话)。在 [hooks](/zh-CN/hooks) 或[状态行](/zh-CN/statusline)命令中未设置。用于检测脚本何时在 Claude Code 生成的 shell 内运行 |

52| `CLAUDE_AGENT_SDK_DISABLE_BUILTIN_AGENTS` | 设置为 `1` 以禁用所有内置 [subagent](/zh-CN/sub-agents) 类型,如 Explore 和 Plan。仅适用于非交互模式(`-p` 标志)。对于想要空白状态的 SDK 用户很有用 |

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

54| `CLAUDE_AUTOCOMPACT_PCT_OVERRIDE` | 设置触发自动压缩的上下文容量百分比(1-100)。默认情况下,自动压缩在大约 95% 容量时触发。使用较低的值(如 `50`)可更早进行压缩。高于默认阈值的值无效。适用于主对话和 subagents。此百分比与[状态行](/zh-CN/statusline)中可用的 `context_window.used_percentage` 字段一致 |

55| `CLAUDE_AUTO_BACKGROUND_TASKS` | 设置为 `1` 以强制启用长时间运行的代理任务的自动后台处理。启用后,subagents 在运行约两分钟后会移到后台 |

56| `CLAUDE_BASH_MAINTAIN_PROJECT_WORKING_DIR` | 在主会话中每个 Bash 或 PowerShell 命令后返回到原始工作目录 |

57| `CLAUDE_CODE_ACCESSIBILITY` | 设置为 `1` 以保持原生终端光标可见并禁用反向文本光标指示器。允许 macOS Zoom 等屏幕放大镜跟踪光标位置 |

58| `CLAUDE_CODE_ADDITIONAL_DIRECTORIES_CLAUDE_MD` | 设置为 `1` 以从使用 `--add-dir` 指定的目录加载内存文件。加载 `CLAUDE.md`、`.claude/CLAUDE.md`、`.claude/rules/*.md` 和 `CLAUDE.local.md`。默认情况下,其他目录不加载内存文件 |

59| `CLAUDE_CODE_API_KEY_HELPER_TTL_MS` | 应刷新凭证的间隔(以毫秒为单位)(使用 [`apiKeyHelper`](/zh-CN/settings#available-settings) 时) |

60| `CLAUDE_CODE_ATTRIBUTION_HEADER` | 设置为 `0` 以从系统提示的开头省略归属块(客户端版本和提示指纹)。禁用它会改善通过 [LLM 网关](/zh-CN/llm-gateway)路由时的 prompt caching 命中率。Anthropic API 缓存不受影响 |

61| `CLAUDE_CODE_AUTO_COMPACT_WINDOW` | 设置用于自动压缩计算的上下文容量(以令牌为单位)。默认为模型的上下文窗口:标准模型为 200K,或[扩展上下文](/zh-CN/model-config#extended-context)模型为 1M。在 1M 模型上使用较低的值(如 `500000`)可将窗口视为 500K 用于压缩目的。该值上限为模型的实际上下文窗口。`CLAUDE_AUTOCOMPACT_PCT_OVERRIDE` 作为此值的百分比应用。设置此变量会将压缩阈值与状态行的 `used_percentage` 解耦,后者始终使用模型的完整上下文窗口 |

62| `CLAUDE_CODE_AUTO_CONNECT_IDE` | 覆盖自动 [IDE 连接](/zh-CN/vs-code)。默认情况下,在支持的 IDE 的集成终端内启动时,Claude Code 会自动连接。设置为 `false` 以防止这种情况。设置为 `true` 以在自动检测失败时强制连接尝试,例如当 tmux 遮挡父终端时 |

63| `CLAUDE_CODE_CERT_STORE` | TLS 连接的 CA 证书源的逗号分隔列表。`bundled` 是 Claude Code 附带的 Mozilla CA 集。`system` 是操作系统信任存储。默认为 `bundled,system`。系统存储集成需要原生二进制分发。在 Node.js 运行时上,无论此值如何,仅使用捆绑集 |

64| `CLAUDE_CODE_CLIENT_CERT` | 用于 mTLS 身份验证的客户端证书文件的路径 |

65| `CLAUDE_CODE_CLIENT_KEY` | 用于 mTLS 身份验证的客户端私钥文件的路径 |

66| `CLAUDE_CODE_CLIENT_KEY_PASSPHRASE` | 加密 CLAUDE\_CODE\_CLIENT\_KEY 的密码短语(可选) |

67| `CLAUDE_CODE_DEBUG_LOGS_DIR` | 覆盖调试日志文件路径。尽管名称如此,这是文件路径,而不是目录。需要通过 `--debug` 或 `/debug` 单独启用调试模式:仅设置此变量不会启用日志记录。[`--debug-file`](/zh-CN/cli-reference#cli-flags) 标志同时执行两者。默认为 `~/.claude/debug/<session-id>.txt` |

68| `CLAUDE_CODE_DEBUG_LOG_LEVEL` | 写入调试日志文件的最小日志级别。值:`verbose`、`debug`(默认)、`info`、`warn`、`error`。设置为 `verbose` 以包含高容量诊断(如完整状态行命令输出),或提高到 `error` 以减少噪音 |

69| `CLAUDE_CODE_DISABLE_1M_CONTEXT` | 设置为 `1` 以禁用[1M 上下文窗口](/zh-CN/model-config#extended-context)支持。设置后,1M 模型变体在模型选择器中不可用。对于具有合规要求的企业环境很有用 |

70| `CLAUDE_CODE_DISABLE_ADAPTIVE_THINKING` | 设置为 `1` 以禁用 Opus 4.6 和 Sonnet 4.6 的[自适应推理](/zh-CN/model-config#adjust-effort-level)并回退到由 `MAX_THINKING_TOKENS` 控制的固定思考预算。对 Opus 4.7 无效,它始终使用自适应推理 |

71| `CLAUDE_CODE_DISABLE_ATTACHMENTS` | 设置为 `1` 以禁用附件处理。带有 `@` 语法的文件提及作为纯文本发送,而不是扩展为文件内容 |

72| `CLAUDE_CODE_DISABLE_AUTO_MEMORY` | 设置为 `1` 以禁用[自动内存](/zh-CN/memory#auto-memory)。设置为 `0` 以在逐步推出期间强制启用自动内存。禁用后,Claude 不会创建或加载自动内存文件 |

73| `CLAUDE_CODE_DISABLE_BACKGROUND_TASKS` | 设置为 `1` 以禁用所有后台任务功能,包括 Bash 和 subagent 工具上的 `run_in_background` 参数、自动后台处理和 Ctrl+B 快捷键 |

74| `CLAUDE_CODE_DISABLE_CLAUDE_MDS` | 设置为 `1` 以防止将任何 CLAUDE.md 内存文件加载到上下文中,包括用户、项目和自动内存文件 |

75| `CLAUDE_CODE_DISABLE_CRON` | 设置为 `1` 以禁用[计划任务](/zh-CN/scheduled-tasks)。`/loop` skill 和 cron 工具变为不可用,任何已计划的任务停止触发,包括已在会话中运行的任务 |

76| `CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS` | 设置为 `1` 以从 API 请求中删除 Anthropic 特定的 `anthropic-beta` 请求标头和 beta 工具架构字段(如 `defer_loading` 和 `eager_input_streaming`)。当代理网关拒绝请求并出现"Unexpected value(s) for the `anthropic-beta` header"或"Extra inputs are not permitted"之类的错误时,请使用此选项。标准字段(`name`、`description`、`input_schema`、`cache_control`)被保留。 |

77| `CLAUDE_CODE_DISABLE_FAST_MODE` | 设置为 `1` 以禁用[快速模式](/zh-CN/fast-mode) |

78| `CLAUDE_CODE_DISABLE_FEEDBACK_SURVEY` | 设置为 `1` 以禁用"Claude 表现如何?"会话质量调查。在设置 `DISABLE_TELEMETRY` 或 `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC` 时也会禁用调查。请参阅[会话质量调查](/zh-CN/data-usage#session-quality-surveys) |

79| `CLAUDE_CODE_DISABLE_FILE_CHECKPOINTING` | 设置为 `1` 以禁用文件 [checkpointing](/zh-CN/checkpointing)。`/rewind` 命令将无法恢复代码更改 |

80| `CLAUDE_CODE_DISABLE_GIT_INSTRUCTIONS` | 设置为 `1` 以从 Claude 的系统提示中删除内置的提交和 PR 工作流说明和 git 状态快照。在使用您自己的 git 工作流 skills 时很有用。设置后优先于 [`includeGitInstructions`](/zh-CN/settings#available-settings) 设置 |

81| `CLAUDE_CODE_DISABLE_LEGACY_MODEL_REMAP` | 设置为 `1` 以防止在 Anthropic API 上自动重新映射 Opus 4.0 和 4.1 到当前 Opus 版本。当您想要有意固定较旧的模型时使用。重新映射不在 Bedrock、Vertex 或 Foundry 上运行 |

82| `CLAUDE_CODE_DISABLE_MOUSE` | 设置为 `1` 以禁用[全屏渲染](/zh-CN/fullscreen)中的鼠标跟踪。使用 `PgUp` 和 `PgDn` 的键盘滚动仍然有效。使用此选项可保持终端的原生选择复制行为 |

83| `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC` | 等同于设置 `DISABLE_AUTOUPDATER`、`DISABLE_FEEDBACK_COMMAND`、`DISABLE_ERROR_REPORTING` 和 `DISABLE_TELEMETRY` |

84| `CLAUDE_CODE_DISABLE_NONSTREAMING_FALLBACK` | 设置为 `1` 以禁用流式请求在中途失败时的非流式回退。流式错误会传播到重试层。当代理或网关导致回退产生重复的工具执行时很有用 |

85| `CLAUDE_CODE_DISABLE_OFFICIAL_MARKETPLACE_AUTOINSTALL` | 设置为 `1` 以跳过首次运行时官方插件市场的自动添加 |

86| `CLAUDE_CODE_DISABLE_POLICY_SKILLS` | 设置为 `1` 以跳过从系统范围的托管 skills 目录加载 skills。对于不应加载操作员配置的 skills 的容器或 CI 会话很有用 |

87| `CLAUDE_CODE_DISABLE_TERMINAL_TITLE` | 设置为 `1` 以禁用基于对话上下文的自动终端标题更新 |

88| `CLAUDE_CODE_DISABLE_THINKING` | 设置为 `1` 以强制禁用[扩展思考](https://platform.claude.com/docs/en/build-with-claude/extended-thinking),无论模型支持或其他设置如何。比 `MAX_THINKING_TOKENS=0` 更直接 |

89| `CLAUDE_CODE_DISABLE_VIRTUAL_SCROLL` | 设置为 `1` 以禁用[全屏渲染](/zh-CN/fullscreen)中的虚拟滚动并渲染转录中的每条消息。如果全屏模式中的滚动显示应该出现消息的空白区域,请使用此选项 |

90| `CLAUDE_CODE_EFFORT_LEVEL` | 为支持的模型设置努力级别。值:`low`、`medium`、`high`、`xhigh`、`max` 或 `auto` 以使用模型默认值。可用级别取决于模型。优先于 `/effort` 和 `effortLevel` 设置。请参阅[调整努力级别](/zh-CN/model-config#adjust-effort-level) |

91| `CLAUDE_CODE_ENABLE_AWAY_SUMMARY` | 覆盖[会话回顾](/zh-CN/interactive-mode#session-recap)可用性。设置为 `0` 以强制关闭回顾,无论 `/config` 切换如何。设置为 `1` 以在 [`awaySummaryEnabled`](/zh-CN/settings#available-settings) 为 `false` 时强制启用回顾。优先于设置和 `/config` 切换 |

92| `CLAUDE_CODE_ENABLE_BACKGROUND_PLUGIN_REFRESH` | 设置为 `1` 以在[非交互模式](/zh-CN/headless)中的转换边界处刷新插件状态,在后台安装完成后。默认关闭,因为刷新会在会话中途更改系统提示,这会使该转换的 [prompt caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching) 失效 |

93| `CLAUDE_CODE_ENABLE_FINE_GRAINED_TOOL_STREAMING` | 设置为 `1` 以强制启用细粒度工具输入流式传输。没有这个,API 会在发送 delta 事件之前完全缓冲工具输入参数,这可能会延迟大型工具输入的显示。仅限 Anthropic API:对 Bedrock、Vertex 或 Foundry 无效 |

94| `CLAUDE_CODE_ENABLE_PROMPT_SUGGESTION` | 设置为 `false` 以禁用提示建议(`/config` 中的"提示建议"切换)。这些是在 Claude 响应后出现在提示输入中的灰显预测。请参阅[提示建议](/zh-CN/interactive-mode#prompt-suggestions) |

95| `CLAUDE_CODE_ENABLE_TASKS` | 设置为 `1` 以在非交互模式(`-p` 标志)中启用任务跟踪系统。任务在交互模式中默认启用。请参阅[任务列表](/zh-CN/interactive-mode#task-list) |

96| `CLAUDE_CODE_ENABLE_TELEMETRY` | 设置为 `1` 以启用 OpenTelemetry 数据收集以获取指标和日志。在配置 OTel 导出器之前需要。请参阅[监控](/zh-CN/monitoring-usage) |

97| `CLAUDE_CODE_EXIT_AFTER_STOP_DELAY` | 查询循环变为空闲后自动退出前等待的时间(以毫秒为单位)。对于使用 SDK 模式的自动化工作流和脚本很有用 |

98| `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS` | 设置为 `1` 以启用[代理团队](/zh-CN/agent-teams)。代理团队是实验性的,默认禁用 |

99| `CLAUDE_CODE_EXTRA_BODY` | JSON 对象以合并到每个 API 请求体的顶级。对于传递 Claude Code 不直接公开的提供商特定参数很有用 |

100| `CLAUDE_CODE_FILE_READ_MAX_OUTPUT_TOKENS` | 覆盖文件读取的默认令牌限制。当您需要完整读取较大文件时很有用 |

101| `CLAUDE_CODE_FORK_SUBAGENT` | 设置为 `1` 以启用[分叉 subagents](/zh-CN/sub-agents#fork-the-current-conversation)。分叉的 subagent 从主会话继承完整的对话上下文,而不是从头开始。启用后,`/fork` 生成分叉的 subagent 而不是充当 [`/branch`](/zh-CN/commands) 的别名,所有 subagent 生成在后台运行。在交互模式和通过 SDK 或 `claude -p` 中工作 |

102| `CLAUDE_CODE_GIT_BASH_PATH` | 仅限 Windows:Git Bash 可执行文件 (`bash.exe`) 的路径。当 Git Bash 已安装但不在您的 PATH 中时使用。请参阅 [Windows 设置](/zh-CN/setup#set-up-on-windows) |

103| `CLAUDE_CODE_GLOB_HIDDEN` | 设置为 `false` 以在 Claude 调用 [Glob 工具](/zh-CN/tools-reference)时从结果中排除点文件。默认包含。不影响 `@` 文件自动完成、`ls`、Grep 或 Read |

104| `CLAUDE_CODE_GLOB_NO_IGNORE` | 设置为 `false` 以使 [Glob 工具](/zh-CN/tools-reference)尊重 `.gitignore` 模式。默认情况下,Glob 返回所有匹配的文件,包括被 gitignore 的文件。不影响 `@` 文件自动完成,它有自己的 [`respectGitignore` 设置](/zh-CN/settings#available-settings) |

105| `CLAUDE_CODE_GLOB_TIMEOUT_SECONDS` | Glob 工具文件发现的超时时间(以秒为单位)。在大多数平台上默认为 20 秒,在 WSL 上默认为 60 秒 |

106| `CLAUDE_CODE_HIDE_CWD` | 设置为 `1` 以在启动徽标中隐藏工作目录。对于屏幕共享或录制(其中路径暴露您的操作系统用户名)很有用 |

107| `CLAUDE_CODE_IDE_HOST_OVERRIDE` | 覆盖用于连接到 IDE 扩展的主机地址。默认情况下,Claude Code 自动检测正确的地址,包括 WSL 到 Windows 的路由 |

108| `CLAUDE_CODE_IDE_SKIP_AUTO_INSTALL` | 跳过 IDE 扩展的自动安装。等同于将 [`autoInstallIdeExtension`](/zh-CN/settings#global-config-settings) 设置为 `false` |

109| `CLAUDE_CODE_IDE_SKIP_VALID_CHECK` | 设置为 `1` 以跳过连接期间 IDE 锁定文件条目的验证。当自动连接无法找到您的 IDE 时使用,尽管它正在运行 |

110| `CLAUDE_CODE_MAX_CONTEXT_TOKENS` | 覆盖 Claude Code 为活动模型假设的上下文窗口大小。仅在同时设置 `DISABLE_COMPACT` 时生效。当通过 `ANTHROPIC_BASE_URL` 路由到上下文窗口与其名称的内置大小不匹配的模型时使用 |

111| `CLAUDE_CODE_MAX_OUTPUT_TOKENS` | 设置大多数请求的最大输出令牌数。默认值和上限因模型而异;请参阅[最大输出令牌](https://platform.claude.com/docs/en/about-claude/models/overview#latest-models-comparison)。增加此值会减少在[自动压缩](/zh-CN/costs#reduce-token-usage)触发之前可用的有效上下文窗口。 |

112| `CLAUDE_CODE_MAX_RETRIES` | 覆盖重试失败 API 请求的次数(默认值:10) |

113| `CLAUDE_CODE_MAX_TOOL_USE_CONCURRENCY` | 可以并行执行的只读工具和 subagents 的最大数量(默认值:10)。更高的值增加并行性但消耗更多资源 |

114| `CLAUDE_CODE_MCP_ALLOWLIST_ENV` | 设置为 `1` 以使用仅安全基线环境加上服务器的配置 `env` 生成 stdio MCP 服务器,而不是继承您的 shell 环境 |

115| `CLAUDE_CODE_NEW_INIT` | 设置为 `1` 以使 `/init` 运行交互式设置流程。该流程会询问要生成哪些文件,包括 CLAUDE.md、skills 和 hooks,然后再探索代码库并编写它们。没有此变量,`/init` 会自动生成 CLAUDE.md 而不提示。 |

116| `CLAUDE_CODE_NO_FLICKER` | 设置为 `1` 以启用[全屏渲染](/zh-CN/fullscreen),这是一个研究预览,可减少闪烁并在长对话中保持内存平坦。等同于 [`tui`](/zh-CN/settings#available-settings) 设置;您也可以使用 `/tui fullscreen` 切换 |

117| `CLAUDE_CODE_OAUTH_REFRESH_TOKEN` | Claude.ai 身份验证的 OAuth 刷新令牌。设置后,`claude auth login` 直接交换此令牌,而不是打开浏览器。需要 `CLAUDE_CODE_OAUTH_SCOPES`。对于在自动化环境中配置身份验证很有用 |

118| `CLAUDE_CODE_OAUTH_SCOPES` | 刷新令牌颁发时使用的空格分隔的 OAuth 作用域,例如 `"user:profile user:inference user:sessions:claude_code"`。设置 `CLAUDE_CODE_OAUTH_REFRESH_TOKEN` 时为必需 |

119| `CLAUDE_CODE_OAUTH_TOKEN` | Claude.ai 身份验证的 OAuth 访问令牌。`/login` 对于 SDK 和自动化环境的替代方案。优先于钥匙链存储的凭证。使用 [`claude setup-token`](/zh-CN/authentication#generate-a-long-lived-token) 生成一个 |

120| `CLAUDE_CODE_OTEL_FLUSH_TIMEOUT_MS` | 刷新待处理 OpenTelemetry spans 的超时时间(以毫秒为单位)(默认值:5000)。请参阅[监控](/zh-CN/monitoring-usage) |

121| `CLAUDE_CODE_OTEL_HEADERS_HELPER_DEBOUNCE_MS` | 刷新动态 OpenTelemetry 标头的间隔(以毫秒为单位)(默认值:1740000 / 29 分钟)。请参阅[动态标头](/zh-CN/monitoring-usage#dynamic-headers) |

122| `CLAUDE_CODE_OTEL_SHUTDOWN_TIMEOUT_MS` | OpenTelemetry 导出器在关闭时完成的超时时间(以毫秒为单位)(默认值:2000)。如果在退出时丢弃指标,请增加此值。请参阅[监控](/zh-CN/monitoring-usage) |

123| `CLAUDE_CODE_PERFORCE_MODE` | 设置为 `1` 以启用 Perforce 感知的写入保护。设置后,如果目标文件缺少所有者写入位(Perforce 在同步文件上清除,直到 `p4 edit` 打开它们),Edit、Write 和 NotebookEdit 会失败并显示 `p4 edit <file>` 提示。这可防止 Claude Code 绕过 Perforce 变更跟踪 |

124| `CLAUDE_CODE_PLUGIN_CACHE_DIR` | 覆盖插件根目录。尽管名称如此,这设置的是父目录,而不是缓存本身:市场和插件缓存位于此路径下的子目录中。默认为 `~/.claude/plugins` |

125| `CLAUDE_CODE_PLUGIN_GIT_TIMEOUT_MS` | 安装或更新插件时 git 操作的超时(以毫秒为单位)(默认值:120000)。对于大型存储库或网络连接缓慢的情况,请增加此值。请参阅[Git 操作超时](/zh-CN/plugin-marketplaces#git-operations-time-out) |

126| `CLAUDE_CODE_PLUGIN_KEEP_MARKETPLACE_ON_FAILURE` | 设置为 `1` 以在 `git pull` 失败时保留现有市场缓存,而不是擦除并重新克隆。在离线或隔离环境中很有用,其中重新克隆会以相同方式失败。请参阅[市场更新在离线环境中失败](/zh-CN/plugin-marketplaces#marketplace-updates-fail-in-offline-environments) |

127| `CLAUDE_CODE_PLUGIN_SEED_DIR` | 一个或多个只读插件种子目录的路径,在 Unix 上用 `:` 分隔,在 Windows 上用 `;` 分隔。使用此选项可将预填充的插件目录捆绑到容器镜像中。Claude Code 在启动时从这些目录注册市场,并使用预缓存的插件而无需重新克隆。请参阅[为容器预填充插件](/zh-CN/plugin-marketplaces#pre-populate-plugins-for-containers) |

128| `CLAUDE_CODE_PROVIDER_MANAGED_BY_HOST` | 由嵌入 Claude Code 的主机平台设置,并代表其管理模型提供商路由。设置后,提供商选择、端点和身份验证变量(如 `CLAUDE_CODE_USE_BEDROCK`、`ANTHROPIC_BASE_URL` 和 `ANTHROPIC_API_KEY`)在设置文件中被忽略,以便用户设置无法覆盖主机的路由。Bedrock、Vertex 和 Foundry 的自动遥测选择退出也被跳过,因此遥测遵循标准 `DISABLE_TELEMETRY` 选择退出。请参阅[按 API 提供商的默认行为](/zh-CN/data-usage#default-behaviors-by-api-provider) |

129| `CLAUDE_CODE_PROXY_RESOLVES_HOSTS` | 设置为 `1` 以允许代理执行 DNS 解析而不是调用者。对于代理应处理主机名解析的环境选择加入 |

130| `CLAUDE_CODE_REMOTE` | 当 Claude Code 作为[云会话](/zh-CN/claude-code-on-the-web)运行时自动设置为 `true`。从 hook 或设置脚本读取此值以检测您是否在云环境中 |

131| `CLAUDE_CODE_REMOTE_SESSION_ID` | 在[云会话](/zh-CN/claude-code-on-the-web)中自动设置为当前会话的 ID。读取此值以构造返回会话转录的链接。请参阅[将工件链接回会话](/zh-CN/claude-code-on-the-web#link-artifacts-back-to-the-session) |

132| `CLAUDE_CODE_RESUME_INTERRUPTED_TURN` | 设置为 `1` 以在上一个会话在中途结束时自动恢复。在 SDK 模式中使用,以便模型继续而无需 SDK 重新发送提示 |

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

134| `CLAUDE_CODE_SCROLL_SPEED` | 在[全屏渲染](/zh-CN/fullscreen)中设置鼠标滚轮滚动倍数。接受 1 到 20 的值。设置为 `3` 以匹配 `vim`(如果您的终端每个刻度线发送一个滚轮事件而不进行放大) |

135| `CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS` | [SessionEnd](/zh-CN/hooks#sessionend) hooks 的时间预算(以毫秒为单位)。适用于会话退出、`/clear` 和通过交互式 `/resume` 切换会话。默认预算为 1.5 秒,自动提高到设置文件中配置的最高每个 hook `timeout`,最高 60 秒。插件提供的 hooks 上的超时不会提高预算 |

136| `CLAUDE_CODE_SHELL` | 覆盖自动 shell 检测。当您的登录 shell 与您的首选工作 shell 不同时很有用(例如,`bash` 与 `zsh`) |

137| `CLAUDE_CODE_SHELL_PREFIX` | 命令前缀以包装 Claude Code 生成的所有 bash 命令:Bash 工具调用、[hook](/zh-CN/hooks) 命令和 stdio [MCP server](/zh-CN/mcp) 启动命令。对于日志记录或审计很有用。示例:设置 `/path/to/logger.sh` 将每个命令作为 `/path/to/logger.sh <command>` 运行 |

138| `CLAUDE_CODE_SIMPLE` | 设置为 `1` 以使用最小系统提示和仅 Bash、文件读取和文件编辑工具运行。MCP 工具来自 `--mcp-config` 仍然可用。禁用 hooks、skills、plugins、MCP servers、自动内存和 CLAUDE.md 的自动发现。[`--bare`](/zh-CN/headless#start-faster-with-bare-mode) CLI 标志设置此选项 |

139| `CLAUDE_CODE_SIMPLE_SYSTEM_PROMPT` | 设置为 `1` 以在 Opus 4.7 上使用较短的系统提示和缩写的工具描述。对其他模型无效。完整的工具集、hooks、MCP 服务器和 CLAUDE.md 发现保持启用 |

140| `CLAUDE_CODE_SKIP_BEDROCK_AUTH` | 跳过 Bedrock 的 AWS 身份验证(例如,使用 LLM 网关时) |

141| `CLAUDE_CODE_SKIP_FOUNDRY_AUTH` | 跳过 Microsoft Foundry 的 Azure 身份验证(例如,使用 LLM 网关时) |

142| `CLAUDE_CODE_SKIP_MANTLE_AUTH` | 跳过 Bedrock Mantle 的 AWS 身份验证(例如,使用 LLM 网关时) |

143| `CLAUDE_CODE_SKIP_PROMPT_HISTORY` | 设置为 `1` 以跳过将提示历史和会话转录写入磁盘。使用此变量启动的会话不会出现在 `--resume`、`--continue` 或向上箭头历史中。对于临时脚本会话很有用 |

144| `CLAUDE_CODE_SKIP_VERTEX_AUTH` | 跳过 Vertex 的 Google 身份验证(例如,使用 LLM 网关时) |

145| `CLAUDE_CODE_SUBAGENT_MODEL` | 请参阅[模型配置](/zh-CN/model-config) |

146| `CLAUDE_CODE_SUBPROCESS_ENV_SCRUB` | 设置为 `1` 以从子进程环境(Bash 工具、hooks、MCP stdio 服务器)中删除 Anthropic 和云提供商凭证。父 Claude 进程为 API 调用保留这些凭证,但子进程无法读取它们,减少了通过 shell 扩展尝试窃取机密的提示注入攻击的暴露。在 Linux 上,这也在隔离的 PID 命名空间中运行 Bash 子进程,以便它们无法通过 `/proc` 读取主机进程环境;作为副作用,`ps`、`pgrep` 和 `kill` 无法看到或信号主机进程。当配置了 `allowed_non_write_users` 时,`claude-code-action` 会自动设置此选项 |

147| `CLAUDE_CODE_SYNC_PLUGIN_INSTALL` | 设置为 `1` 在非交互模式(`-p` 标志)中等待插件安装完成后再进行第一个查询。没有这个,插件在后台安装,可能在第一个回合不可用。与 `CLAUDE_CODE_SYNC_PLUGIN_INSTALL_TIMEOUT_MS` 结合以限制等待时间 |

148| `CLAUDE_CODE_SYNC_PLUGIN_INSTALL_TIMEOUT_MS` | 同步插件安装的超时时间(以毫秒为单位)。超过时,Claude Code 继续而不使用插件并记录错误。无默认值:没有此变量,同步安装会等待直到完成 |

149| `CLAUDE_CODE_SYNTAX_HIGHLIGHT` | 设置为 `false` 以禁用 diff 输出中的语法突出显示。当颜色干扰您的终端设置时很有用 |

150| `CLAUDE_CODE_TASK_LIST_ID` | 跨会话共享任务列表。在多个 Claude Code 实例中设置相同的 ID 以协调共享任务列表。请参阅[任务列表](/zh-CN/interactive-mode#task-list) |

151| `CLAUDE_CODE_TEAM_NAME` | 此队友所属的代理团队的名称。在[代理团队](/zh-CN/agent-teams)成员上自动设置 |

152| `CLAUDE_CODE_TMPDIR` | 覆盖用于内部临时文件的临时目录。Claude Code 将 `/claude-{uid}/`(Unix)或 `/claude/`(Windows)附加到此路径。默认值:macOS 上为 `/tmp`,Linux/Windows 上为 `os.tmpdir()` |

153| `CLAUDE_CODE_TMUX_TRUECOLOR` | 设置为 `1` 以允许 tmux 内的 24 位真彩色输出。默认情况下,当设置 `$TMUX` 时,Claude Code 限制为 256 色,因为 tmux 不会通过真彩色转义序列,除非配置为这样做。在将 `set -ga terminal-overrides ',*:Tc'` 添加到您的 `~/.tmux.conf` 后设置此选项。请参阅[终端配置](/zh-CN/terminal-config)了解其他 tmux 设置 |

154| `CLAUDE_CODE_USE_BEDROCK` | 使用 [Bedrock](/zh-CN/amazon-bedrock) |

155| `CLAUDE_CODE_USE_FOUNDRY` | 使用 [Microsoft Foundry](/zh-CN/microsoft-foundry) |

156| `CLAUDE_CODE_USE_MANTLE` | 使用 Bedrock [Mantle 端点](/zh-CN/amazon-bedrock#use-the-mantle-endpoint) |

157| `CLAUDE_CODE_USE_NATIVE_FILE_SEARCH` | 设置为 `1` 以使用 Node.js 文件 API 而不是 ripgrep 发现自定义命令、subagents 和输出样式。如果捆绑的 ripgrep 二进制文件在您的环境中不可用或被阻止,请设置此选项。不影响 Grep 或文件搜索工具 |

158| `CLAUDE_CODE_USE_POWERSHELL_TOOL` | 控制 PowerShell 工具。在没有 Git Bash 的 Windows 上,该工具会自动启用;设置为 `0` 以禁用它。在安装了 Git Bash 的 Windows 上,该工具正在逐步推出:设置为 `1` 以选择加入或 `0` 以选择退出。在 Linux、macOS 和 WSL 上,设置为 `1` 以启用它,这需要您的 `PATH` 上有 `pwsh`。在 Windows 上启用时,Claude 可以本地运行 PowerShell 命令,而不是通过 Git Bash 路由。请参阅 [PowerShell 工具](/zh-CN/tools-reference#powershell-tool) |

159| `CLAUDE_CODE_USE_VERTEX` | 使用 [Vertex](/zh-CN/google-vertex-ai) |

160| `CLAUDE_CONFIG_DIR` | 覆盖配置目录(默认值:`~/.claude`)。所有设置、凭证、会话历史和插件都存储在此路径下。对于并行运行多个帐户很有用:例如,`alias claude-work='CLAUDE_CONFIG_DIR=~/.claude-work claude'` |

161| `CLAUDE_ENABLE_BYTE_WATCHDOG` | 设置为 `1` 以强制启用字节级流式空闲监视程序,或设置为 `0` 以强制禁用它。未设置时,监视程序对 Anthropic API 连接默认启用。字节监视程序在 `CLAUDE_STREAM_IDLE_TIMEOUT_MS` 设置的持续时间内没有字节到达线路时中止连接,最少 5 分钟,独立于事件级监视程序 |

162| `CLAUDE_ENABLE_STREAM_WATCHDOG` | 设置为 `1` 以启用事件级流式空闲监视程序。默认关闭。对于 Bedrock、Vertex 和 Foundry,这是唯一可用的空闲监视程序。使用 `CLAUDE_STREAM_IDLE_TIMEOUT_MS` 配置超时 |

163| `CLAUDE_ENV_FILE` | Claude Code 在每个 Bash 命令之前在同一 shell 进程中运行的 shell 脚本的路径,因此文件中的导出对命令可见。用于在命令之间保持 virtualenv 或 conda 激活。也由 [SessionStart](/zh-CN/hooks#persist-environment-variables)、[Setup](/zh-CN/hooks#setup)、[CwdChanged](/zh-CN/hooks#cwdchanged) 和 [FileChanged](/zh-CN/hooks#filechanged) hooks 动态填充 |

164| `CLAUDE_REMOTE_CONTROL_SESSION_NAME_PREFIX` | 当未提供显式名称时,自动生成的[远程控制](/zh-CN/remote-control)会话名称的前缀。默认为您的机器的主机名,生成名称如 `myhost-graceful-unicorn`。`--remote-control-session-name-prefix` CLI 标志为单个调用设置相同的值 |

165| `CLAUDE_STREAM_IDLE_TIMEOUT_MS` | 流式空闲监视程序关闭停滞连接前的超时(以毫秒为单位)。默认和最小 `300000`(5 分钟)对于字节级和事件级监视程序;较低的值被静默限制以吸收扩展思考暂停和代理缓冲。对于第三方提供商,需要 `CLAUDE_ENABLE_STREAM_WATCHDOG=1` |

166| `DISABLE_AUTOUPDATER` | 设置为 `1` 以禁用自动后台更新。手动 `claude update` 仍然有效。使用 `DISABLE_UPDATES` 以阻止两者 |

167| `DISABLE_AUTO_COMPACT` | 设置为 `1` 以禁用接近上下文限制时的自动压缩。手动 `/compact` 命令仍然可用。当您想要明确控制何时进行压缩时使用 |

168| `DISABLE_COMPACT` | 设置为 `1` 以禁用所有压缩:自动压缩和手动 `/compact` 命令 |

169| `DISABLE_COST_WARNINGS` | 设置为 `1` 以禁用成本警告消息 |

170| `DISABLE_DOCTOR_COMMAND` | 设置为 `1` 以隐藏 `/doctor` 命令。对于用户不应运行安装诊断的托管部署很有用 |

171| `DISABLE_ERROR_REPORTING` | 设置为 `1` 以选择退出 Sentry 错误报告 |

172| `DISABLE_EXTRA_USAGE_COMMAND` | 设置为 `1` 以隐藏 `/extra-usage` 命令,该命令允许用户购买超过速率限制的额外使用量 |

173| `DISABLE_FEEDBACK_COMMAND` | 设置为 `1` 以禁用 `/feedback` 命令。也接受较旧的名称 `DISABLE_BUG_COMMAND` |

174| `DISABLE_GROWTHBOOK` | 设置为 `1` 以禁用 GrowthBook 功能标志获取并对每个标志使用代码默认值。除非同时设置 `DISABLE_TELEMETRY`,否则遥测事件日志记录保持启用 |

175| `DISABLE_INSTALLATION_CHECKS` | 设置为 `1` 以禁用安装警告。仅在手动管理安装位置时使用,因为这可能会掩盖标准安装的问题 |

176| `DISABLE_INSTALL_GITHUB_APP_COMMAND` | 设置为 `1` 以隐藏 `/install-github-app` 命令。使用第三方提供商(Bedrock、Vertex 或 Foundry)时已隐藏 |

177| `DISABLE_INTERLEAVED_THINKING` | 设置为 `1` 以防止发送交错思考 beta 标头。当您的 LLM 网关或提供商不支持[交错思考](https://platform.claude.com/docs/en/build-with-claude/extended-thinking#interleaved-thinking)时很有用 |

178| `DISABLE_LOGIN_COMMAND` | 设置为 `1` 以隐藏 `/login` 命令。当身份验证通过 API 密钥或 `apiKeyHelper` 外部处理时很有用 |

179| `DISABLE_LOGOUT_COMMAND` | 设置为 `1` 以隐藏 `/logout` 命令 |

180| `DISABLE_PROMPT_CACHING` | 设置为 `1` 以禁用所有模型的 prompt caching(优先于每个模型的设置) |

181| `DISABLE_PROMPT_CACHING_HAIKU` | 设置为 `1` 以禁用 Haiku 模型的 prompt caching |

182| `DISABLE_PROMPT_CACHING_OPUS` | 设置为 `1` 以禁用 Opus 模型的 prompt caching |

183| `DISABLE_PROMPT_CACHING_SONNET` | 设置为 `1` 以禁用 Sonnet 模型的 prompt caching |

184| `DISABLE_TELEMETRY` | 设置为 `1` 以选择退出 Statsig 遥测(请注意,Statsig 事件不包括用户数据,如代码、文件路径或 bash 命令) |

185| `DISABLE_UPDATES` | 设置为 `1` 以阻止所有更新,包括手动 `claude update` 和 `claude install`。比 `DISABLE_AUTOUPDATER` 更严格。当通过您自己的渠道分发 Claude Code 且用户不应自行更新时使用 |

186| `DISABLE_UPGRADE_COMMAND` | 设置为 `1` 以隐藏 `/upgrade` 命令 |

187| `ENABLE_CLAUDEAI_MCP_SERVERS` | 设置为 `false` 以禁用 Claude Code 中的 [claude.ai MCP servers](/zh-CN/mcp#use-mcp-servers-from-claude-ai)。对于已登录的用户默认启用 |

188| `ENABLE_PROMPT_CACHING_1H` | 设置为 `1` 以请求 1 小时的 prompt cache TTL 而不是默认的 5 分钟。适用于 API 密钥、[Bedrock](/zh-CN/amazon-bedrock)、[Vertex](/zh-CN/google-vertex-ai) 和 [Foundry](/zh-CN/microsoft-foundry) 用户。订阅用户自动获得 1 小时 TTL。1 小时缓存写入按更高费率计费 |

189| `ENABLE_PROMPT_CACHING_1H_BEDROCK` | 已弃用。改用 `ENABLE_PROMPT_CACHING_1H` |

190| `ENABLE_TOOL_SEARCH` | 控制 [MCP 工具搜索](/zh-CN/mcp#scale-with-mcp-tool-search)。未设置:默认延迟所有 MCP 工具,但在 Vertex AI 上或当 `ANTHROPIC_BASE_URL` 指向非第一方主机时提前加载。值:`true`(始终延迟,包括代理和 Vertex AI)、`auto`(阈值模式:如果工具适合在上下文的 10% 内则提前加载)、`auto:N`(自定义阈值,例如 `auto:5` 表示 5%)、`false`(提前加载所有) |

191| `FALLBACK_FOR_ALL_PRIMARY_MODELS` | 设置为任何非空值以在任何主模型上重复过载错误后触发回退到 [`--fallback-model`](/zh-CN/cli-reference#cli-flags)。默认情况下,仅 Opus 模型触发回退 |

192| `FORCE_AUTOUPDATE_PLUGINS` | 设置为 `1` 以强制插件自动更新,即使主自动更新程序通过 `DISABLE_AUTOUPDATER` 禁用 |

193| `FORCE_PROMPT_CACHING_5M` | 设置为 `1` 以强制 5 分钟的 prompt cache TTL,即使 1 小时 TTL 会以其他方式应用。覆盖 `ENABLE_PROMPT_CACHING_1H` |

194| `HTTP_PROXY` | 为网络连接指定 HTTP 代理服务器 |

195| `HTTPS_PROXY` | 为网络连接指定 HTTPS 代理服务器 |

196| `IS_DEMO` | 设置为 `1` 以启用演示模式:隐藏标头中的电子邮件和组织名称以及 `/status` 输出,并跳过入门。对于流式传输或录制会话很有用 |

197| `MAX_MCP_OUTPUT_TOKENS` | MCP 工具响应中允许的最大令牌数。Claude Code 在输出超过 10,000 个令牌时显示警告。声明 [`anthropic/maxResultSizeChars`](/zh-CN/mcp#raise-the-limit-for-a-specific-tool) 的工具对文本内容使用该字符限制,但来自这些工具的图像内容仍受此变量约束(默认值:25000) |

198| `MAX_STRUCTURED_OUTPUT_RETRIES` | 当模型的响应无法针对非交互模式(`-p` 标志)中的 [`--json-schema`](/zh-CN/cli-reference#cli-flags) 进行验证时重试的次数。默认为 5 |

199| `MAX_THINKING_TOKENS` | 覆盖[扩展思考](https://platform.claude.com/docs/en/build-with-claude/extended-thinking)令牌预算。上限是模型的[最大输出令牌](https://platform.claude.com/docs/en/about-claude/models/overview#latest-models-comparison)减一。设置为 `0` 以完全禁用思考。在具有[自适应推理](/zh-CN/model-config#adjust-effort-level)的模型上,除非通过 `CLAUDE_CODE_DISABLE_ADAPTIVE_THINKING` 禁用自适应推理,否则预算被忽略 |

200| `MCP_CLIENT_SECRET` | 需要[预配置凭证](/zh-CN/mcp#use-pre-configured-oauth-credentials)的 MCP 服务器的 OAuth 客户端密钥。在使用 `--client-secret` 添加服务器时避免交互式提示 |

201| `MCP_CONNECTION_NONBLOCKING` | 设置为 `true` 在非交互模式(`-p`)中完全跳过 MCP 连接等待。对于不需要 MCP 工具的脚本化管道很有用。没有此变量,第一个查询会等待最多 5 秒以获得 `--mcp-config` 服务器连接 |

202| `MCP_OAUTH_CALLBACK_PORT` | OAuth 重定向回调的固定端口,作为在使用[预配置凭证](/zh-CN/mcp#use-pre-configured-oauth-credentials)添加 MCP 服务器时 `--callback-port` 的替代方案 |

203| `MCP_REMOTE_SERVER_CONNECTION_BATCH_SIZE` | 启动期间并行连接的远程 MCP 服务器(HTTP/SSE)的最大数量(默认值:20) |

204| `MCP_SERVER_CONNECTION_BATCH_SIZE` | 启动期间并行连接的本地 MCP 服务器(stdio)的最大数量(默认值:3) |

205| `MCP_TIMEOUT` | MCP 服务器启动的超时(以毫秒为单位)(默认值:30000,或 30 秒) |

206| `MCP_TOOL_TIMEOUT` | MCP 工具执行的超时(以毫秒为单位)(默认值:100000000,约 28 小时) |

207| `NO_PROXY` | 域和 IP 列表,对其的请求将直接发出,绕过代理 |

208| `OTEL_LOG_RAW_API_BODIES` | 设置为 `1` 以将完整的 Anthropic Messages API 请求和响应 JSON 作为 `api_request_body` / `api_response_body` 日志事件发出,或 `file:<dir>` 以将未截断的主体写入磁盘并发出 `body_ref` 路径。默认禁用;主体包括整个对话历史。请参阅[监控](/zh-CN/monitoring-usage#api-request-body-event) |

209| `OTEL_LOG_TOOL_CONTENT` | 设置为 `1` 以在 OpenTelemetry span 事件中包含工具输入和输出内容。默认禁用以保护敏感数据。请参阅[监控](/zh-CN/monitoring-usage) |

210| `OTEL_LOG_TOOL_DETAILS` | 设置为 `1` 以在 OpenTelemetry 跟踪和日志中包含工具输入参数、MCP 服务器名称、工具失败时的原始错误字符串和其他工具详情。默认禁用以保护 PII。请参阅[监控](/zh-CN/monitoring-usage) |

211| `OTEL_LOG_USER_PROMPTS` | 设置为 `1` 以在 OpenTelemetry 跟踪和日志中包含用户提示文本。默认禁用(提示被编辑)。请参阅[监控](/zh-CN/monitoring-usage) |

212| `OTEL_METRICS_INCLUDE_ACCOUNT_UUID` | 设置为 `false` 以从指标属性中排除帐户 UUID(默认值:包含)。请参阅[监控](/zh-CN/monitoring-usage) |

213| `OTEL_METRICS_INCLUDE_SESSION_ID` | 设置为 `false` 以从指标属性中排除会话 ID(默认值:包含)。请参阅[监控](/zh-CN/monitoring-usage) |

214| `OTEL_METRICS_INCLUDE_VERSION` | 设置为 `true` 以在指标属性中包含 Claude Code 版本(默认值:排除)。请参阅[监控](/zh-CN/monitoring-usage) |

215| `SLASH_COMMAND_TOOL_CHAR_BUDGET` | 覆盖显示给 [Skill tool](/zh-CN/skills#control-who-invokes-a-skill) 的 skill 元数据的字符预算。预算在上下文窗口的 1% 处动态扩展,回退为 8,000 个字符。为了向后兼容而保留的旧名称 |

216| `TASK_MAX_OUTPUT_LENGTH` | [subagent](/zh-CN/sub-agents) 输出中的最大字符数,超过此数字后将进行截断(默认值:32000,最大值:160000)。截断时,完整输出保存到磁盘,路径包含在截断的响应中 |

217| `USE_BUILTIN_RIPGREP` | 设置为 `0` 以使用系统安装的 `rg` 而不是 Claude Code 附带的 `rg` |

218| `VERTEX_REGION_CLAUDE_3_5_HAIKU` | 使用 Vertex AI 时覆盖 Claude 3.5 Haiku 的区域 |

219| `VERTEX_REGION_CLAUDE_3_5_SONNET` | 使用 Vertex AI 时覆盖 Claude 3.5 Sonnet 的区域 |

220| `VERTEX_REGION_CLAUDE_3_7_SONNET` | 使用 Vertex AI 时覆盖 Claude 3.7 Sonnet 的区域 |

221| `VERTEX_REGION_CLAUDE_4_0_OPUS` | 使用 Vertex AI 时覆盖 Claude 4.0 Opus 的区域 |

222| `VERTEX_REGION_CLAUDE_4_0_SONNET` | 使用 Vertex AI 时覆盖 Claude 4.0 Sonnet 的区域 |

223| `VERTEX_REGION_CLAUDE_4_1_OPUS` | 使用 Vertex AI 时覆盖 Claude 4.1 Opus 的区域 |

224| `VERTEX_REGION_CLAUDE_4_5_OPUS` | 使用 Vertex AI 时覆盖 Claude Opus 4.5 的区域 |

225| `VERTEX_REGION_CLAUDE_4_5_SONNET` | 使用 Vertex AI 时覆盖 Claude Sonnet 4.5 的区域 |

226| `VERTEX_REGION_CLAUDE_4_6_OPUS` | 使用 Vertex AI 时覆盖 Claude Opus 4.6 的区域 |

227| `VERTEX_REGION_CLAUDE_4_6_SONNET` | 使用 Vertex AI 时覆盖 Claude Sonnet 4.6 的区域 |

228| `VERTEX_REGION_CLAUDE_4_7_OPUS` | 使用 Vertex AI 时覆盖 Claude Opus 4.7 的区域 |

229| `VERTEX_REGION_CLAUDE_HAIKU_4_5` | 使用 Vertex AI 时覆盖 Claude Haiku 4.5 的区域 |

230 

231标准 OpenTelemetry 导出器变量(`OTEL_METRICS_EXPORTER`、`OTEL_LOGS_EXPORTER`、`OTEL_EXPORTER_OTLP_ENDPOINT`、`OTEL_EXPORTER_OTLP_PROTOCOL`、`OTEL_EXPORTER_OTLP_HEADERS`、`OTEL_METRIC_EXPORT_INTERVAL`、`OTEL_RESOURCE_ATTRIBUTES` 和信号特定变体)也受支持。请参阅[监控](/zh-CN/monitoring-usage)了解配置详情。

232 

233## 另请参阅

234 

235* [设置](/zh-CN/settings):在 `settings.json` 中配置环境变量,使其应用于每个会话

236* [CLI 参考](/zh-CN/cli-reference):启动时标志

237* [网络配置](/zh-CN/network-config):代理和 TLS 设置

238* [监控](/zh-CN/monitoring-usage):OpenTelemetry 配置

errors.md +536 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 错误参考

6 

7> 查找 Claude Code 运行时错误消息,了解每个错误的含义以及如何修复。

8 

9本页列出了 Claude Code 显示的运行时错误以及如何从每个错误中恢复,以及当响应似乎有问题但没有错误时要检查的内容。对于安装错误(如 `command not found` 或设置期间的 TLS 故障),请参阅[故障排除安装和登录](/zh-CN/troubleshoot-install)。

10 

11这些错误和恢复命令适用于 CLI、[桌面应用](/zh-CN/desktop)和[网络上的 Claude Code](/zh-CN/claude-code-on-the-web),因为这三个都包装了相同的 Claude Code CLI。对于特定于表面的问题,请参阅该表面页面上的故障排除部分。

12 

13<Note>

14 Claude Code 调用 Claude API 获取模型响应,因此大多数运行时错误映射到底层 API 错误代码。本页介绍了每个错误在 Claude Code 中的含义以及如何恢复。有关原始 HTTP 状态代码定义,请参阅 [Claude Platform 错误参考](https://platform.claude.com/docs/en/api/errors)。

15</Note>

16 

17## 查找您的错误

18 

19将您在终端中看到的消息与下面的部分相匹配。

20 

21| 消息 | 部分 |

22| :----------------------------------------------------------------------------------- | :--------------------------------------------------------------------------- |

23| `API Error: 500 ... Internal server error` | [服务器错误](#api-error-500-internal-server-error) |

24| `API Error: Repeated 529 Overloaded errors` | [服务器错误](#api-error-repeated-529-overloaded-errors) |

25| `Request timed out` | [服务器错误](#request-timed-out),或如果消息提到您的互联网连接,则为[网络](#unable-to-connect-to-api) |

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

27| `You've hit your session limit` / `You've hit your weekly limit` | [使用限制](#youve-hit-your-session-limit) |

28| `Server is temporarily limiting requests` | [使用限制](#server-is-temporarily-limiting-requests) |

29| `Request rejected (429)` | [使用限制](#request-rejected-429) |

30| `Credit balance is too low` | [使用限制](#credit-balance-is-too-low) |

31| `Not logged in · Please run /login` | [身份验证](#not-logged-in) |

32| `Invalid API key` | [身份验证](#invalid-api-key) |

33| `This organization has been disabled` | [身份验证](#this-organization-has-been-disabled) |

34| `OAuth token revoked` / `OAuth token has expired` | [身份验证](#oauth-token-revoked-or-expired) |

35| `does not meet scope requirement user:profile` | [身份验证](#oauth-scope-requirement) |

36| `Unable to connect to API` | [网络](#unable-to-connect-to-api) |

37| `SSL certificate verification failed` | [网络](#ssl-certificate-errors) |

38| `Prompt is too long` | [请求错误](#prompt-is-too-long) |

39| `Error during compaction: Conversation too long` | [请求错误](#error-during-compaction-conversation-too-long) |

40| `Request too large` | [请求错误](#request-too-large) |

41| `Image was too large` | [请求错误](#image-was-too-large) |

42| `PDF too large` / `PDF is password protected` | [请求错误](#pdf-errors) |

43| `Extra inputs are not permitted` | [请求错误](#extra-inputs-are-not-permitted) |

44| `There's an issue with the selected model` | [请求错误](#theres-an-issue-with-the-selected-model) |

45| `Claude Opus is not available with the Claude Pro plan` | [请求错误](#claude-opus-is-not-available-with-the-claude-pro-plan) |

46| `thinking.type.enabled is not supported for this model` | [请求错误](#thinking-type-enabled-is-not-supported-for-this-model) |

47| `max_tokens must be greater than thinking.budget_tokens` | [请求错误](#thinking-budget-exceeds-output-limit) |

48| `API Error: 400 due to tool use concurrency issues` | [请求错误](#tool-use-or-thinking-block-mismatch) |

49| 响应质量似乎低于平常 | [响应质量](#responses-seem-lower-quality-than-usual) |

50 

51## 自动重试

52 

53Claude Code 在向您显示错误之前会重试瞬时故障。服务器错误、过载响应、请求超时、临时 429 限流和断开的连接都会以指数退避方式重试最多 10 次。重试时,微调器显示 `Retrying in Ns · attempt x/y` 倒计时。

54 

55当您看到本页上的错误之一时,这些重试已经用尽。您可以使用两个环境变量调整行为:

56 

57| 变量 | 默认值 | 效果 |

58| :------------------------------------------- | :----- | :-------------------------------- |

59| [`CLAUDE_CODE_MAX_RETRIES`](/zh-CN/env-vars) | 10 | 重试次数。降低它以在脚本中更快地显示故障;提高它以等待更长的事件。 |

60| [`API_TIMEOUT_MS`](/zh-CN/env-vars) | 600000 | 每个请求的超时时间(毫秒)。为慢速网络或代理提高它。 |

61 

62## 服务器错误

63 

64这些错误来自 Anthropic 基础设施,而不是您的帐户或请求。

65 

66### API Error: 500 Internal server error

67 

68Claude Code 为任何 5xx 状态显示原始 API 响应体。下面的示例显示了 500 响应:

69 

70```text theme={null}

71API Error: 500 {"type":"error","error":{"type":"api_error","message":"Internal server error"}} · check status.claude.com

72```

73 

74这表示 API 内部出现意外故障。它不是由您的提示、设置或帐户引起的。

75 

76**要做什么:**

77 

78* 检查 [status.claude.com](https://status.claude.com) 以了解活跃事件

79* 等待一分钟,然后再次发送您的消息。您的原始消息仍在对话中,因此对于长提示,您可以输入 `try again` 而不是粘贴整个内容。

80* 如果错误持续存在且没有发布的事件,请运行 `/feedback`,以便 Anthropic 可以使用您的请求详情进行调查。如果您的提供商上 `/feedback` 不可用,请参阅[报告错误](#report-an-error)。

81 

82### API Error: Repeated 529 Overloaded errors

83 

84API 在所有用户中暂时处于容量限制。Claude Code 在显示此消息之前已经重试了多次:

85 

86```text theme={null}

87API Error: Repeated 529 Overloaded errors · check status.claude.com

88```

89 

90529 不是您的使用限制,也不会计入您的配额。

91 

92**要做什么:**

93 

94* 检查 [status.claude.com](https://status.claude.com) 以了解容量通知

95* 几分钟后重试

96* 运行 `/model` 并切换到不同的模型以继续工作,因为容量是按模型跟踪的。当一个模型处于特别高的负载下时,Claude Code 会提示您这样做,例如 `Opus is experiencing high load, please use /model to switch to Sonnet`。

97 

98### Request timed out

99 

100API 在连接截止时间之前没有响应。

101 

102```text theme={null}

103Request timed out

104```

105 

106这可能在高负载期间或生成非常大的响应时发生。默认请求超时为 10 分钟。

107 

108**要做什么:**

109 

110* 重试请求

111* 对于长时间运行的任务,将工作分解为较小的提示

112* 如果是慢速网络或代理导致的,请按照[自动重试](#automatic-retries)中的说明提高 `API_TIMEOUT_MS`

113* 如果超时频繁且您的网络状况良好,请参阅下面的[网络和连接错误](#network-and-connection-errors)

114 

115### Auto mode cannot determine the safety of an action

116 

117[auto mode](/zh-CN/permission-modes#eliminate-prompts-with-auto-mode) 用来分类操作的模型已过载,因此 auto mode 阻止了该操作而不是无检查地批准它。

118 

119```text theme={null}

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

121```

122 

123在您的工作目录中的读取、搜索和编辑会跳过分类器,因此它们在中断期间继续工作。

124 

125**要做什么:**

126 

127* 几秒钟后重试;Claude 看到相同的消息,通常会自动重试

128* 如果重试继续失败,继续进行只读任务,稍后再回到被阻止的操作

129* 这是暂时的,与 [auto mode 资格](/zh-CN/permission-modes#eliminate-prompts-with-auto-mode)无关;您不需要更改设置

130 

131## 使用限制

132 

133这些错误意味着与您的帐户或计划相关的配额已达到。它们与影响所有人的[服务器错误](#server-errors)不同。

134 

135### You've hit your session limit

136 

137订阅计划包括滚动使用额度。当它用完时,您会看到以下消息之一:

138 

139```text theme={null}

140You've hit your session limit · resets 3:45pm

141You've hit your weekly limit · resets Mon 12:00am

142You've hit your Opus limit · resets 3:45pm

143```

144 

145Claude Code 阻止进一步的请求,直到消息中显示的重置时间。

146 

147**要做什么:**

148 

149* 等待错误中显示的重置时间

150* 运行 `/usage` 以查看您的计划限制以及它们何时重置

151* 运行 `/extra-usage` 以在 Pro 和 Max 上购买额外使用,或在 Team 和 Enterprise 上向您的管理员请求。有关如何计费的信息,请参阅[付费计划的额外使用](https://support.claude.com/en/articles/12429409-extra-usage-for-paid-claude-plans)。

152* 要升级您的计划以获得更高的基础限制,请参阅 [claude.com/pricing](https://claude.com/pricing)

153 

154要在达到限制之前监视您的剩余额度,请将 `rate_limits` 字段添加到[自定义状态行](/zh-CN/statusline#rate-limit-usage),或在桌面应用中单击模型选择器旁边的[使用环](/zh-CN/desktop#check-usage)。

155 

156### Server is temporarily limiting requests

157 

158API 应用了与您的计划配额无关的短期限流。

159 

160```text theme={null}

161API Error: Server is temporarily limiting requests (not your usage limit)

162```

163 

164这在显示之前会[自动重试](#automatic-retries)。

165 

166**要做什么:**

167 

168* 等待片刻后重试

169* 如果持续存在,请检查 [status.claude.com](https://status.claude.com)

170 

171### Request rejected (429)

172 

173您已达到为您的 API 密钥、Amazon Bedrock 项目或 Google Vertex AI 项目配置的速率限制。

174 

175```text theme={null}

176API Error: Request rejected (429) · this may be a temporary capacity issue

177```

178 

179**要做什么:**

180 

181* 运行 `/status` 并确认活跃凭证是您期望的凭证。环境中的流浪 `ANTHROPIC_API_KEY` 可能会通过低层密钥而不是您的订阅路由请求。

182* 检查您的提供商控制台以了解活跃限制,如果需要,请请求更高的层级

183* 对于 Anthropic API 密钥,请参阅[速率限制参考](https://platform.claude.com/docs/en/api/rate-limits)以了解层级如何工作以及如何设置每个工作区的上限

184* 降低并发:降低 [`CLAUDE_CODE_MAX_TOOL_USE_CONCURRENCY`](/zh-CN/env-vars),避免运行许多并行子代理,或使用 `/model` 切换到较小的模型以进行高容量脚本运行

185 

186### Credit balance is too low

187 

188您的 Console 组织已用完预付信用。

189 

190```text theme={null}

191Credit balance is too low

192```

193 

194**要做什么:**

195 

196* 在 [platform.claude.com/settings/billing](https://platform.claude.com/settings/billing) 添加信用,并考虑在那里启用自动重新加载,以便在余额达到零之前重新填充

197* 如果您有 Pro、Max、Team 或 Enterprise 计划,请使用 `/login` 切换到订阅身份验证

198* 在 Console 中设置每个工作区的支出上限,以防止单个项目耗尽组织余额。请参阅[有效管理成本](/zh-CN/costs)。

199 

200## 身份验证错误

201 

202这些错误意味着 Claude Code 无法向 API 证明您的身份。随时运行 `/status` 以查看当前活跃的凭证。

203 

204### Not logged in

205 

206此会话没有有效的凭证可用。

207 

208```text theme={null}

209Not logged in · Please run /login

210```

211 

212**要做什么:**

213 

214* 运行 `/login` 以使用您的 Claude 订阅或 Console 帐户进行身份验证

215* 如果您期望环境变量对您进行身份验证,请确认 `ANTHROPIC_API_KEY` 已在您启动 `claude` 的 shell 中设置和导出

216* 对于 CI 或无法进行交互式登录的自动化,配置一个[`apiKeyHelper`](/zh-CN/settings#available-settings) 脚本,在启动时获取密钥

217* 请参阅[身份验证优先级](/zh-CN/authentication#authentication-precedence)以了解当存在多个凭证时哪个凭证获胜

218 

219如果您被重复提示登录,请参阅[未登录或令牌过期](/zh-CN/troubleshoot-install#not-logged-in-or-token-expired)以了解系统时钟和 macOS Keychain 修复。

220 

221### Invalid API key

222 

223`ANTHROPIC_API_KEY` 环境变量或 `apiKeyHelper` 脚本返回了 API 拒绝的密钥。

224 

225```text theme={null}

226Invalid API key · Fix external API key

227```

228 

229**要做什么:**

230 

231* 检查拼写错误,并确认密钥未在 [Console](https://platform.claude.com/settings/keys) 中被撤销

232* 在同一 shell 中运行 `env | grep ANTHROPIC`。direnv、dotenv shell 插件和 IDE 终端等工具可以从项目中的 `.env` 文件加载过时的密钥,而无需您显式设置它。

233* 取消设置 `ANTHROPIC_API_KEY` 并运行 `/login` 以改用订阅身份验证

234* 如果密钥来自 [`apiKeyHelper`](/zh-CN/settings#available-settings) 脚本,请直接运行脚本以确认它在 stdout 上打印有效的密钥

235* 运行 `/status` 以确认 Claude Code 实际使用的凭证源

236 

237### This organization has been disabled

238 

239来自禁用的 Console 组织的过时 `ANTHROPIC_API_KEY` 正在覆盖您的订阅登录。

240 

241```text theme={null}

242Your ANTHROPIC_API_KEY belongs to a disabled organization · Unset the environment variable to use your other credentials

243API Error: 400 ... This organization has been disabled.

244```

245 

246环境变量优先于 `/login`,因此在您的 shell 配置文件中导出或从 `.env` 文件加载的密钥即使您有有效的 Pro 或 Max 订阅也会被使用。在非交互模式 (`-p`) 中,当存在密钥时总是使用该密钥。

247 

248**要做什么:**

249 

250* 在当前 shell 中取消设置 `ANTHROPIC_API_KEY` 并从您的 shell 配置文件中删除它,然后重新启动 `claude`

251* 之后运行 `/status` 以确认活跃凭证是您的订阅

252* 如果未设置环境变量且错误仍然存在,则禁用的组织是与您的 `/login` 相关联的组织。联系支持或使用不同的帐户登录。

253 

254### OAuth token revoked or expired

255 

256您保存的登录不再有效。撤销的令牌意味着您在任何地方都签出或管理员删除了访问权限;过期的令牌意味着自动刷新在会话中途失败。

257 

258```text theme={null}

259OAuth token revoked · Please run /login

260OAuth token has expired · Please run /login

261API Error: 401 ... authentication_error

262```

263 

264**要做什么:**

265 

266* 运行 `/login` 以再次登录

267* 如果在重新身份验证后错误在同一会话中返回,请先运行 `/logout` 以完全清除存储的令牌,然后运行 `/login`

268* 对于跨启动的重复登录提示,请参阅[故障排除](/zh-CN/troubleshoot-install#not-logged-in-or-token-expired)中的系统时钟和 macOS Keychain 检查

269* 对于其他故障,包括 `403 Forbidden` 和 OAuth 浏览器问题,请参阅[登录和身份验证](/zh-CN/troubleshoot-install#login-and-authentication)

270 

271### OAuth scope requirement

272 

273存储的令牌早于较新功能所需的权限范围。您最常从 `/usage` 和状态行使用指示器看到这一点:

274 

275```text theme={null}

276OAuth token does not meet scope requirement: user:profile

277```

278 

279**要做什么:**

280 

281* 运行 `/login` 以使用当前范围铸造新令牌。您不需要先登出。

282 

283## 网络和连接错误

284 

285这些错误意味着 Claude Code 根本无法到达 API。它们几乎总是源于您的本地网络、代理或防火墙,而不是 Anthropic 基础设施。

286 

287### Unable to connect to API

288 

289到 API 的 TCP 连接失败或从未完成。

290 

291```text theme={null}

292Unable to connect to API. Check your internet connection

293Unable to connect to API (ECONNREFUSED)

294Unable to connect to API (ECONNRESET)

295Unable to connect to API (ETIMEDOUT)

296fetch failed

297Request timed out. Check your internet connection and proxy settings

298```

299 

300常见原因包括没有互联网访问、阻止 `api.anthropic.com` 的 VPN 或未配置的必需公司代理。

301 

302**要做什么:**

303 

304* 通过从同一 shell 运行 `curl -I https://api.anthropic.com` 来确认您可以到达 API 主机。在 Windows PowerShell 上使用 `curl.exe -I https://api.anthropic.com`,以便不使用内置的 `Invoke-WebRequest` 别名。

305* 如果您在公司代理后面,请在启动 Claude Code 之前设置 `HTTPS_PROXY` 并参阅[网络配置](/zh-CN/network-config)

306* 如果您通过 LLM 网关或中继路由,请将 [`ANTHROPIC_BASE_URL`](/zh-CN/env-vars) 设置为其地址。有关设置,请参阅 [LLM 网关配置](/zh-CN/llm-gateway)。

307* 确保您的防火墙允许[网络访问要求](/zh-CN/network-config#network-access-requirements)中列出的主机

308* 间歇性故障会[自动重试](#automatic-retries);持续故障指向本地网络问题

309 

310如果 `curl` 成功但 Claude Code 仍然失败,原因通常是 Node.js 和网络之间的某些东西,而不是网络本身:

311 

312* 在 Linux 和 WSL 上,检查 `/etc/resolv.conf` 是否有无法到达的名称服务器。特别是 WSL 可以从主机继承损坏的解析器。

313* 在 macOS 上,已断开连接或卸载的 VPN 客户端可能会留下隧道接口或路由规则。检查 `ifconfig` 以查找过时的 `utun` 接口,并在系统设置中删除 VPN 的网络扩展。

314* Docker Desktop 和类似的容器运行时可以拦截出站流量。退出它们并重试以排除这一点。

315 

316### SSL certificate errors

317 

318您网络上的代理或安全设备正在使用其自己的证书拦截 TLS 流量,而 Node.js 不信任它。

319 

320```text theme={null}

321Unable to connect to API: SSL certificate verification failed. Check your proxy or corporate SSL certificates

322Unable to connect to API: Self-signed certificate detected

323```

324 

325**要做什么:**

326 

327* 导出您组织的 CA 包并使用 `NODE_EXTRA_CA_CERTS=/path/to/ca-bundle.pem` 指向 Node

328* 有关完整设置说明,请参阅[网络配置](/zh-CN/network-config#custom-ca-certificates)

329* 不要设置 `NODE_TLS_REJECT_UNAUTHORIZED=0`,这会完全禁用证书验证

330 

331## 请求错误

332 

333这些错误意味着 API 收到了您的请求但拒绝了其内容。

334 

335### Prompt is too long

336 

337对话加上附加文件超过了模型的上下文窗口。

338 

339```text theme={null}

340Prompt is too long

341```

342 

343**要做什么:**

344 

345* 运行 `/compact` 以总结早期轮次并释放空间,或运行 `/clear` 以重新开始

346* 运行 `/context` 以查看消耗窗口的内容的分解:系统提示、工具、内存文件和消息

347* 使用 `/mcp disable <name>` 禁用您未使用的 MCP 服务器,以从上下文中删除其工具定义

348* 修剪大型 `CLAUDE.md` 内存文件,或将说明移到仅在相关时加载的[路径范围规则](/zh-CN/memory#path-specific-rules)中

349* 子代理从父会话继承每个 MCP 工具定义,这可能在第一轮之前填满它们的上下文窗口。在生成子代理之前禁用您未使用的 MCP 服务器。

350* 自动压缩默认启用,通常可防止此错误。如果您已设置 [`DISABLE_AUTO_COMPACT`](/zh-CN/env-vars),请重新启用它或在窗口填满之前手动运行 `/compact`。

351 

352有关上下文如何填满的交互式视图,请参阅[探索上下文窗口](/zh-CN/context-window)。

353 

354### Error during compaction: Conversation too long

355 

356`/compact` 本身失败,因为没有足够的可用上下文来保存它生成的摘要。

357 

358```text theme={null}

359Error during compaction: Conversation too long. Press esc twice to go up a few messages and try again.

360```

361 

362当窗口在自动压缩触发时已满,或在看到 `Prompt is too long` 后运行 `/compact` 时,可能会发生这种情况。

363 

364**要做什么:**

365 

366* 按 Esc 两次打开消息列表并回退几轮。这会从上下文中删除最近的消息。然后再次运行 `/compact`。

367* 如果回退没有释放足够的空间,请运行 `/clear` 以启动新的会话。您之前的对话已保存,可以使用 `/resume` 重新打开。

368 

369### Request too large

370 

371原始请求体在标记化之前超过了 API 的字节限制,通常是因为粘贴的大文件或附件。

372 

373```text theme={null}

374Request too large (max 30 MB). Double press esc to go back and remove or shrink the attached content.

375```

376 

377这是 HTTP 请求的大小限制,与[上下文窗口限制](#prompt-is-too-long)分开。

378 

379**要做什么:**

380 

381* 按 Esc 两次并回退到添加超大内容的轮次之前

382* 按路径引用大文件而不是粘贴其内容,以便 Claude 可以分块读取它们

383* 对于图像,请参阅下面的[图像太大](#image-was-too-large)

384 

385### Image was too large

386 

387粘贴或附加的图像超过了 API 的大小或尺寸限制。

388 

389```text theme={null}

390Image was too large. Double press esc to go back and try again with a smaller image.

391API Error: 400 ... image dimensions exceed max allowed size

392```

393 

394错误后图像保留在对话历史中,因此每个后续消息都会失败,出现相同的错误,直到您删除它。

395 

396**要做什么:**

397 

398* 按 Esc 两次并回退到添加图像的轮次之前

399* 在粘贴之前调整图像大小。API 接受单个图像最长边最多 8000 像素的图像,或当许多图像在上下文中时为 2000 像素。

400* 拍摄相关区域的更紧密屏幕截图,而不是整个屏幕

401 

402### PDF errors

403 

404您附加的 PDF 无法处理。

405 

406```text theme={null}

407PDF too large (max 100 pages, 32 MB). Try splitting it or extracting text first.

408PDF is password protected. Try removing protection or extracting text first.

409The PDF file was not valid. Try converting to a different format first.

410```

411 

412**要做什么:**

413 

414* 对于超大 PDF,要求 Claude 使用 Read 工具读取页面范围而不是附加整个文件,或使用 `pdftotext` 等工具提取文本并按路径引用输出文件

415* 对于受保护或无效的 PDF,删除密码或从其源应用程序重新导出文件,然后重试

416 

417### Extra inputs are not permitted

418 

419Claude Code 和 API 之间的代理或 LLM 网关删除了 `anthropic-beta` 请求标头,因此 API 拒绝了依赖它的字段。

420 

421```text theme={null}

422API Error: 400 ... Extra inputs are not permitted ... context_management

423API Error: 400 ... Extra inputs are not permitted ... tools.0.custom.input_examples

424API Error: 400 ... Unexpected value(s) for the `anthropic-beta` header

425```

426 

427Claude Code 发送仅限 beta 的字段,如 `context_management`、`effort` 和工具 `input_examples`,以及启用它们的 `anthropic-beta` 标头。当网关转发正文但删除标头时,API 看到它不识别的字段。

428 

429**要做什么:**

430 

431* 配置您的网关以转发 `anthropic-beta` 标头。请参阅 [LLM 网关配置](/zh-CN/llm-gateway)。

432* 作为后备,在启动之前设置 [`CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1`](/zh-CN/env-vars)。这会禁用需要 beta 标头的功能,以便请求通过无法转发它的网关成功。

433 

434### There's an issue with the selected model

435 

436配置的模型名称未被识别或您的帐户缺少对它的访问权限。

437 

438```text theme={null}

439There's an issue with the selected model (claude-...). It may not exist or you may not have access to it. Run /model to select a different one.

440```

441 

442**要做什么:**

443 

444* 运行 `/model` 以从您的帐户可用的模型中选择

445* 使用别名(如 `sonnet` 或 `opus`)而不是完整的版本化 ID。别名跟踪最新版本,因此它们不会过时。请参阅[模型配置](/zh-CN/model-config)。

446* 如果错误的模型一直出现,则某处设置了过时的 ID。按[优先级顺序](/zh-CN/model-config#setting-your-model)检查:`--model` 标志、`ANTHROPIC_MODEL` 环境变量,然后是 `.claude/settings.local.json` 中的 `model` 字段、您项目的 `.claude/settings.json` 和 `~/.claude/settings.json`。删除过时的值,Claude Code 将回退到您的帐户默认值。

447* 对于 Vertex AI 部署,请参阅 [Vertex AI 故障排除](/zh-CN/google-vertex-ai#troubleshooting)。

448 

449### Claude Opus is not available with the Claude Pro plan

450 

451您的活跃订阅计划不包括您选择的模型。

452 

453```text theme={null}

454Claude Opus is not available with the Claude Pro plan · Select a different model in /model

455```

456 

457**要做什么:**

458 

459* 运行 `/model` 并选择您的计划包括的模型

460* 如果您最近升级了计划但仍然看到这个,请运行 `/logout` 然后 `/login`。存储的令牌反映了您登录时的计划,因此在现有会话中升级网络不会生效,直到您重新身份验证。

461* 有关每个计划包括哪些模型,请参阅 [claude.com/pricing](https://claude.com/pricing)

462 

463### thinking.type.enabled is not supported for this model

464 

465您的 Claude Code 版本早于 Opus 4.7 的最低版本。CLI 发送了模型不再接受的思考配置。

466 

467```text theme={null}

468API Error: 400 ... "thinking.type.enabled" is not supported for this model. Use "thinking.type.adaptive" and "output_config.effort" to control thinking behavior.

469```

470 

471**要做什么:**

472 

473* 运行 `claude update` 以升级到 v2.1.111 或更高版本,然后重新启动 Claude Code

474* 如果您无法升级,请运行 `/model` 并选择 Opus 4.6 或 Sonnet

475* 如果您在 Agent SDK 中遇到这个,请参阅 [SDK 故障排除](/zh-CN/agent-sdk/quickstart#troubleshooting)

476 

477### Thinking budget exceeds output limit

478 

479配置的扩展思考预算超过了最大响应长度,因此没有空间留给实际答案。

480 

481```text theme={null}

482API Error: 400 ... max_tokens must be greater than thinking.budget_tokens

483```

484 

485Claude Code 在 Anthropic API 上自动调整这些值。当 [`MAX_THINKING_TOKENS`](/zh-CN/env-vars) 设置高于提供商的输出限制时,或当计划模式提高思考预算时,您通常会在 Amazon Bedrock 或 Google Vertex AI 上看到此错误。

486 

487**要做什么:**

488 

489* 降低 `MAX_THINKING_TOKENS`,或将 [`CLAUDE_CODE_MAX_OUTPUT_TOKENS`](/zh-CN/env-vars) 提高到思考预算之上

490* 有关预算如何与输出长度交互的信息,请参阅[扩展思考](/zh-CN/common-workflows#use-extended-thinking-thinking-mode)

491 

492### Tool use or thinking block mismatch

493 

494对话历史以不一致的状态到达 API,通常是在工具调用被中断或轮次在流中途被编辑后。

495 

496```text theme={null}

497API Error: 400 due to tool use concurrency issues. Run /rewind to recover the conversation.

498API Error: 400 ... unexpected `tool_use_id` found in `tool_result` blocks

499API Error: 400 ... thinking blocks ... cannot be modified

500```

501 

502所有三个变体都意味着同一件事:历史中 `tool_use`、`tool_result` 和 `thinking` 块的序列不再与 API 期望的相匹配。

503 

504**要做什么:**

505 

506* 运行 `/rewind`,或按 Esc 两次,回退到损坏轮次之前的检查点并从那里继续。有关如何创建和恢复检查点的信息,请参阅[检查点](/zh-CN/checkpointing)。

507 

508## 响应质量似乎低于平常

509 

510如果 Claude 的答案似乎不如您期望的那样有能力,但没有显示错误,原因通常是对话状态而不是模型本身。Claude Code 不会默默更改模型版本。它可以在特定情况下切换到后备模型,例如达到 Opus 配额或 Bedrock 或 Vertex AI 区域缺少您的模型;下面的模型选择检查会捕获两者,[模型配置](/zh-CN/model-config)解释了何时应用后备。

511 

512首先检查这些:

513 

514* **模型选择**:运行 `/model` 以确认您在期望的模型上。之前的 `/model` 选择或 `ANTHROPIC_MODEL` 环境变量可能会让您使用比您打算的更小的模型。

515* **努力级别**:运行 `/effort` 以检查当前推理级别并为困难的调试或设计工作提高它。默认值因模型而异,因此在假设您低于最大值之前检查。有关每个模型的默认值和 `ultrathink` 快捷方式,请参阅[调整努力级别](/zh-CN/model-config#adjust-effort-level)。

516* **上下文压力**:运行 `/context` 以查看窗口有多满。如果接近容量,请在自然断点处运行 `/compact` 或运行 `/clear` 以重新开始。有关自动压缩如何影响早期轮次的信息,请参阅[探索上下文窗口](/zh-CN/context-window)。

517* **过时的说明**:大型或过时的 `CLAUDE.md` 文件和 MCP 工具定义消耗上下文并可能引导响应。`/doctor` 标记超大内存文件和子代理定义;`/context` 显示 MCP 工具令牌使用。

518 

519当响应出错时,回退通常比用更正回复效果更好。按 Esc 两次或运行 `/rewind` 以回退到坏轮次之前,然后用更多细节重新表述提示。在线程中更正会将错误的尝试保留在上下文中,这可能会将后来的答案锚定到它。请参阅[检查点](/zh-CN/checkpointing)。

520 

521如果在检查上述内容后质量仍然似乎有问题,请运行 `/feedback` 并描述您期望的内容与您得到的内容。以这种方式提交的反馈包括对话记录,这是 Anthropic 诊断真实回归的最快方式。如果您的提供商上 `/feedback` 不可用,请参阅[报告错误](#report-an-error)。

522 

523## 报告错误

524 

525本页涵盖来自 Claude API 的错误。对于来自其他 Claude Code 组件的错误,请参阅相关指南:

526 

527* MCP 服务器无法连接或身份验证:[MCP](/zh-CN/mcp)

528* Hook 脚本失败或阻止了工具:[调试 hooks](/zh-CN/hooks#debug-hooks)

529* 安装期间权限被拒绝或文件系统错误:[故障排除安装和登录](/zh-CN/troubleshoot-install)

530 

531如果此处未列出错误或建议的修复无法帮助:

532 

533* 在 Claude Code 中运行 `/feedback` 以将记录和描述发送给 Anthropic。该命令还提供打开预填充的 GitHub 问题。Bedrock、Vertex AI 和 Foundry 部署上不提供反馈。

534* 运行 `/doctor` 以检查本地配置问题

535* 检查 [status.claude.com](https://status.claude.com) 以了解活跃事件

536* 在 GitHub 上搜索[现有问题](https://github.com/anthropics/claude-code/issues)

fast-mode.md +151 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 使用快速模式加快响应速度

6 

7> 通过切换快速模式在 Claude Code 中获得更快的 Opus 4.6 响应。

8 

9<Note>

10 快速模式处于[研究预览](#research-preview)阶段。该功能、定价和可用性可能会根据反馈而改变。

11</Note>

12 

13快速模式是 Claude Opus 4.6 的高速配置,使模型速度提高 2.5 倍,但每个令牌的成本更高。当您需要速度进行交互式工作(如快速迭代或实时调试)时,使用 `/fast` 将其打开,当成本比延迟更重要时,将其关闭。

14 

15快速模式不是一个不同的模型。它使用相同的 Opus 4.6,但采用不同的 API 配置,优先考虑速度而不是成本效率。您获得相同的质量和功能,只是响应速度更快。

16 

17<Note>

18 快速模式需要 Claude Code v2.1.36 或更高版本。使用 `claude --version` 检查您的版本。

19</Note>

20 

21需要了解的内容:

22 

23* 使用 `/fast` 在 Claude Code CLI 中切换快速模式。也可通过 Claude Code VS Code 扩展中的 `/fast` 使用。

24* Opus 4.6 快速模式定价从 \$30/150 MTok 开始。快速模式在所有计划上享受 50% 折扣,直到太平洋时间 2 月 16 日晚上 11:59。

25* 可供订阅计划(Pro/Max/Team/Enterprise)上的所有 Claude Code 用户和 Claude 控制台使用。

26* 对于订阅计划(Pro/Max/Team/Enterprise)上的 Claude Code 用户,快速模式仅通过额外使用提供,不包含在订阅速率限制中。

27 

28本页涵盖如何[切换快速模式](#toggle-fast-mode)、其[成本权衡](#understand-the-cost-tradeoff)、[何时使用](#decide-when-to-use-fast-mode)、[要求](#requirements)、[每个会话选择加入](#require-per-session-opt-in)和[速率限制行为](#handle-rate-limits)。

29 

30## 切换快速模式

31 

32通过以下任一方式切换快速模式:

33 

34* 输入 `/fast` 并按 Tab 键打开或关闭

35* 在您的[用户设置文件](/zh-CN/settings)中设置 `"fastMode": true`

36 

37默认情况下,快速模式在会话之间保持。管理员可以配置快速模式在每个会话时重置。有关详细信息,请参阅[要求每个会话选择加入](#require-per-session-opt-in)。

38 

39为了获得最佳成本效率,在会话开始时启用快速模式,而不是在对话中途切换。有关详细信息,请参阅[了解成本权衡](#understand-the-cost-tradeoff)。

40 

41启用快速模式时:

42 

43* 如果您使用的是不同的模型,Claude Code 会自动切换到 Opus 4.6

44* 您将看到确认消息:"Fast mode ON"

45* 快速模式处于活动状态时,提示旁边会出现一个小的 `↯` 图标

46* 随时再次运行 `/fast` 以检查快速模式是否打开或关闭

47 

48当您再次使用 `/fast` 禁用快速模式时,您仍然保持在 Opus 4.6 上。模型不会恢复到您之前的模型。要切换到不同的模型,请使用 `/model`。

49 

50## 了解成本权衡

51 

52快速模式的每个令牌定价高于标准 Opus 4.6:

53 

54| 模式 | 输入 (MTok) | 输出 (MTok) |

55| ------------------------ | --------- | --------- |

56| Opus 4.6 上的快速模式 (\<200K) | \$30 | \$150 |

57| Opus 4.6 上的快速模式 (>200K) | \$60 | \$225 |

58 

59快速模式与 1M 令牌扩展上下文窗口兼容。

60 

61当您在对话中途切换到快速模式时,您需要为整个对话上下文支付完整的快速模式未缓存输入令牌价格。这比从一开始就启用快速模式的成本更高。

62 

63## 决定何时使用快速模式

64 

65快速模式最适合响应延迟比成本更重要的交互式工作:

66 

67* 快速迭代代码更改

68* 实时调试会话

69* 时间敏感的工作,有紧迫的截止日期

70 

71标准模式更适合:

72 

73* 速度不那么重要的长期自主任务

74* 批处理或 CI/CD 管道

75* 成本敏感的工作负载

76 

77### 快速模式与努力级别

78 

79快速模式和努力级别都会影响响应速度,但方式不同:

80 

81| 设置 | 效果 |

82| ----------- | -------------------------- |

83| **快速模式** | 相同的模型质量,更低的延迟,更高的成本 |

84| **较低的努力级别** | 更少的思考时间,更快的响应,在复杂任务上可能质量较低 |

85 

86您可以结合两者:在直接任务上使用快速模式和较低的[努力级别](/zh-CN/model-config#adjust-effort-level)以获得最大速度。

87 

88## 要求

89 

90快速模式需要以下所有条件:

91 

92* **第三方云提供商上不可用**:快速模式在 Amazon Bedrock、Google Vertex AI 或 Microsoft Azure Foundry 上不可用。快速模式可通过 Anthropic 控制台 API 和使用额外使用的 Claude 订阅计划获得。

93* **启用额外使用**:您的账户必须启用额外使用,这允许在您的计划包含的使用量之外进行计费。对于个人账户,在您的[控制台计费设置](https://platform.claude.com/settings/organization/billing)中启用此功能。对于团队和企业,管理员必须为组织启用额外使用。

94 

95<Note>

96 快速模式使用直接计入额外使用,即使您的计划上还有剩余使用量。这意味着快速模式令牌不计入您的计划包含的使用量,并从第一个令牌开始按快速模式费率收费。

97</Note>

98 

99* **团队和企业的管理员启用**:快速模式默认对团队和企业组织禁用。管理员必须明确[启用快速模式](#enable-fast-mode-for-your-organization),用户才能访问它。

100 

101<Note>

102 如果您的管理员尚未为您的组织启用快速模式,`/fast` 命令将显示"Fast mode has been disabled by your organization."

103</Note>

104 

105### 为您的组织启用快速模式

106 

107管理员可以在以下位置启用快速模式:

108 

109* **控制台**(API 客户):[Claude Code 偏好设置](https://platform.claude.com/claude-code/preferences)

110* **Claude AI**(团队和企业):[管理员设置 > Claude Code](https://claude.ai/admin-settings/claude-code)

111 

112另一个完全禁用快速模式的选项是设置 `CLAUDE_CODE_DISABLE_FAST_MODE=1`。请参阅[环境变量](/zh-CN/env-vars)。

113 

114### 要求每个会话选择加入

115 

116默认情况下,快速模式在会话之间保持:如果用户启用快速模式,它会在未来的会话中保持打开。[团队](https://claude.com/pricing?utm_source=claude_code\&utm_medium=docs\&utm_content=fast_mode_teams#team-&-enterprise)或[企业](https://anthropic.com/contact-sales?utm_source=claude_code\&utm_medium=docs\&utm_content=fast_mode_enterprise)计划上的管理员可以通过在[托管设置](/zh-CN/settings#settings-files)或[服务器托管设置](/zh-CN/server-managed-settings)中将 `fastModePerSessionOptIn` 设置为 `true` 来防止这种情况。这会导致每个会话以快速模式关闭开始,要求用户使用 `/fast` 明确启用它。

117 

118```json theme={null}

119{

120 "fastModePerSessionOptIn": true

121}

122```

123 

124这对于在用户运行多个并发会话的组织中控制成本很有用。用户在需要速度时仍然可以使用 `/fast` 启用快速模式,但它会在每个新会话开始时重置。用户的快速模式偏好仍然被保存,因此删除此设置会恢复默认的持久行为。

125 

126## 处理速率限制

127 

128快速模式与标准 Opus 4.6 有单独的速率限制。当您达到快速模式速率限制或用完额外使用额度时:

129 

1301. 快速模式自动回退到标准 Opus 4.6

1312. `↯` 图标变灰以指示冷却

1323. 您继续以标准速度和定价工作

1334. 冷却过期时,快速模式自动重新启用

134 

135要手动禁用快速模式而不是等待冷却,请再次运行 `/fast`。

136 

137## 研究预览

138 

139快速模式是一个研究预览功能。这意味着:

140 

141* 该功能可能会根据反馈而改变

142* 可用性和定价可能会改变

143* 底层 API 配置可能会演变

144 

145通过您通常的 Anthropic 支持渠道报告问题或反馈。

146 

147## 另请参阅

148 

149* [模型配置](/zh-CN/model-config):切换模型并调整努力级别

150* [有效管理成本](/zh-CN/costs):跟踪令牌使用情况并降低成本

151* [状态行配置](/zh-CN/statusline):显示模型和上下文信息

features-overview.md +294 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 扩展 Claude Code

6 

7> 了解何时使用 CLAUDE.md、Skills、subagents、hooks、MCP 和 plugins。

8 

9Claude Code 结合了一个能够推理代码的模型和[内置工具](/zh-CN/how-claude-code-works#tools),用于文件操作、搜索、执行和网络访问。内置工具涵盖了大多数编码任务。本指南涵盖扩展层:您添加的功能,用于自定义 Claude 的知识、将其连接到外部服务以及自动化工作流。

10 

11<Note>

12 有关核心代理循环如何工作的信息,请参阅 [Claude Code 如何工作](/zh-CN/how-claude-code-works)。

13</Note>

14 

15**初次使用 Claude Code?** 从 [CLAUDE.md](/zh-CN/memory) 开始了解项目约定。根据需要添加其他扩展。

16 

17## 概述

18 

19扩展插入代理循环的不同部分:

20 

21* **[CLAUDE.md](/zh-CN/memory)** 添加 Claude 每个会话都能看到的持久上下文

22* **[Skills](/zh-CN/skills)** 添加可重用的知识和可调用的工作流

23* **[MCP](/zh-CN/mcp)** 将 Claude 连接到外部服务和工具

24* **[Subagents](/zh-CN/sub-agents)** 在隔离的上下文中运行自己的循环,返回摘要

25* **[Agent teams](/zh-CN/agent-teams)** 协调多个独立会话,具有共享任务和点对点消息传递

26* **[Hooks](/zh-CN/hooks)** 完全在循环外作为确定性脚本运行

27* **[Plugins](/zh-CN/plugins)** 和 **[marketplaces](/zh-CN/plugin-marketplaces)** 打包和分发这些功能

28 

29[Skills](/zh-CN/skills) 是最灵活的扩展。Skill 是一个包含知识、工作流或说明的 markdown 文件。您可以使用 `/deploy` 之类的命令调用 skills,或者 Claude 可以在相关时自动加载它们。Skills 可以在您当前的对话中运行,也可以通过 subagents 在隔离的上下文中运行。

30 

31## 将功能与您的目标相匹配

32 

33功能范围从 Claude 每个会话都能看到的始终开启的上下文,到您或 Claude 可以调用的按需功能,再到在特定事件上运行的后台自动化。下表显示了可用的功能以及何时使用每个功能。

34 

35| 功能 | 作用 | 何时使用 | 示例 |

36| ------------------------------------- | ---------------------- | --------------------- | --------------------------------------- |

37| **CLAUDE.md** | 每次对话加载的持久上下文 | 项目约定、"始终执行 X" 规则 | "使用 pnpm,而不是 npm。提交前运行测试。" |

38| **Skill** | Claude 可以使用的说明、知识和工作流 | 可重用内容、参考文档、可重复的任务 | `/deploy` 运行您的部署清单;包含端点模式的 API 文档 skill |

39| **Subagent** | 返回摘要结果的隔离执行上下文 | 上下文隔离、并行任务、专门的工作者 | 读取许多文件但仅返回关键发现的研究任务 |

40| **[Agent teams](/zh-CN/agent-teams)** | 协调多个独立的 Claude Code 会话 | 并行研究、新功能开发、使用竞争假设进行调试 | 生成审查者同时检查安全性、性能和测试 |

41| **MCP** | 连接到外部服务 | 外部数据或操作 | 查询您的数据库、发布到 Slack、控制浏览器 |

42| **Hook** | 在事件上运行的确定性脚本 | 可预测的自动化,不涉及 LLM | 每次文件编辑后运行 ESLint |

43 

44**[Plugins](/zh-CN/plugins)** 是打包层。Plugin 将 skills、hooks、subagents 和 MCP servers 捆绑到单个可安装单元中。Plugin skills 是命名空间的(如 `/my-plugin:review`),因此多个 plugins 可以共存。当您想在多个存储库中重用相同的设置或通过 **[marketplace](/zh-CN/plugin-marketplaces)** 分发给他人时,使用 plugins。

45 

46### 比较相似的功能

47 

48某些功能可能看起来相似。以下是如何区分它们。

49 

50<Tabs>

51 <Tab title="Skill vs Subagent">

52 Skills 和 subagents 解决不同的问题:

53 

54 * **Skills** 是可重用的内容,您可以将其加载到任何上下文中

55 * **Subagents** 是与您的主对话分开运行的隔离工作者

56 

57 | 方面 | Skill | Subagent |

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

59 | **它是什么** | 可重用的说明、知识或工作流 | 具有自己上下文的隔离工作者 |

60 | **关键优势** | 在上下文之间共享内容 | 上下文隔离。工作单独进行,仅返回摘要 |

61 | **最适合** | 参考材料、可调用的工作流 | 读取许多文件的任务、并行工作、专门的工作者 |

62 

63 **Skills 可以是参考或操作。** 参考 skills 提供 Claude 在整个会话中使用的知识(如您的 API 风格指南)。操作 skills 告诉 Claude 执行特定操作(如运行您的部署工作流的 `/deploy`)。

64 

65 **当您需要上下文隔离或上下文窗口变满时,使用 subagent**。Subagent 可能读取数十个文件或运行广泛的搜索,但您的主对话仅接收摘要。由于 subagent 工作不消耗您的主上下文,当您不需要中间工作保持可见时,这也很有用。自定义 subagents 可以有自己的说明并可以预加载 skills。

66 

67 **它们可以结合。** Subagent 可以预加载特定的 skills(`skills:` 字段)。Skill 可以使用 `context: fork` 在隔离的上下文中运行。有关详细信息,请参阅 [Skills](/zh-CN/skills)。

68 </Tab>

69 

70 <Tab title="CLAUDE.md vs Skill">

71 两者都存储说明,但它们的加载方式和用途不同。

72 

73 | 方面 | CLAUDE.md | Skill |

74 | ----------- | --------------- | --------------- |

75 | **加载** | 每个会话,自动 | 按需 |

76 | **可以包含文件** | 是,使用 `@path` 导入 | 是,使用 `@path` 导入 |

77 | **可以触发工作流** | 否 | 是,使用 `/<name>` |

78 | **最适合** | "始终执行 X" 规则 | 参考材料、可调用的工作流 |

79 

80 **如果 Claude 应该始终知道它,请将其放在 CLAUDE.md 中**:编码约定、构建命令、项目结构、"永远不要执行 X" 规则。

81 

82 **如果它是 Claude 有时需要的参考材料(API 文档、风格指南)或您使用 `/<name>` 触发的工作流(部署、审查、发布),请将其放在 skill 中**。

83 

84 **经验法则:** 保持 CLAUDE.md 在 200 行以下。如果它在增长,将参考内容移到 skills 或拆分为 [`.claude/rules/`](/zh-CN/memory#organize-rules-with-clauderules) 文件。

85 </Tab>

86 

87 <Tab title="CLAUDE.md vs Rules vs Skills">

88 所有三者都存储说明,但它们的加载方式不同:

89 

90 | 方面 | CLAUDE.md | `.claude/rules/` | Skill |

91 | ------- | --------- | ---------------- | ------------ |

92 | **加载** | 每个会话 | 每个会话,或当打开匹配的文件时 | 按需,当调用或相关时 |

93 | **范围** | 整个项目 | 可以限定到文件路径 | 特定于任务 |

94 | **最适合** | 核心约定和构建命令 | 特定于语言或目录的指南 | 参考材料、可重复的工作流 |

95 

96 **对于每个会话需要的说明,使用 CLAUDE.md**:构建命令、测试约定、项目架构。

97 

98 **使用 rules 来保持 CLAUDE.md 专注。** 带有 [`paths` frontmatter](/zh-CN/memory#path-specific-rules) 的 rules 仅在 Claude 处理匹配文件时加载,节省上下文。

99 

100 **对于 Claude 有时只需要的内容,使用 skills**,如 API 文档或您使用 `/<name>` 触发的部署清单。

101 </Tab>

102 

103 <Tab title="Subagent vs Agent team">

104 两者都并行化工作,但它们在架构上不同:

105 

106 * **Subagents** 在您的会话内运行并将结果报告回您的主上下文

107 * **Agent teams** 是相互通信的独立 Claude Code 会话

108 

109 | 方面 | Subagent | Agent team |

110 | -------- | ----------------- | ----------------------- |

111 | **上下文** | 自己的上下文窗口;结果返回给调用者 | 自己的上下文窗口;完全独立 |

112 | **通信** | 仅向主代理报告结果 | 队友直接相互发送消息 |

113 | **协调** | 主代理管理所有工作 | 具有自我协调的共享任务列表 |

114 | **最适合** | 仅结果重要的专注任务 | 需要讨论和协作的复杂工作 |

115 | **令牌成本** | 较低:结果摘要返回到主上下文 | 较高:每个队友是一个单独的 Claude 实例 |

116 

117 **当您需要一个快速、专注的工作者时,使用 subagent**:研究一个问题、验证一个声明、审查一个文件。Subagent 完成工作并返回摘要。您的主对话保持清洁。

118 

119 **当队友需要共享发现、相互质疑和独立协调时,使用 agent team**。Agent teams 最适合具有竞争假设的研究、并行代码审查以及每个队友拥有单独部分的新功能开发。

120 

121 **过渡点:** 如果您运行并行 subagents 但遇到上下文限制,或者您的 subagents 需要相互通信,agent teams 是自然的下一步。

122 

123 <Note>

124 Agent teams 是实验性的,默认禁用。有关设置和当前限制,请参阅 [agent teams](/zh-CN/agent-teams)。

125 </Note>

126 </Tab>

127 

128 <Tab title="MCP vs Skill">

129 MCP 将 Claude 连接到外部服务。Skills 扩展 Claude 的知识,包括如何有效地使用这些服务。

130 

131 | 方面 | MCP | Skill |

132 | -------- | -------------------- | --------------------- |

133 | **它是什么** | 连接到外部服务的协议 | 知识、工作流和参考材料 |

134 | **提供** | 工具和数据访问 | 知识、工作流、参考材料 |

135 | **示例** | Slack 集成、数据库查询、浏览器控制 | 代码审查清单、部署工作流、API 风格指南 |

136 

137 这些解决不同的问题,可以很好地协同工作:

138 

139 **MCP** 给予 Claude 与外部系统交互的能力。没有 MCP,Claude 无法查询您的数据库或发布到 Slack。

140 

141 **Skills** 给予 Claude 关于如何有效使用这些工具的知识,以及您可以使用 `/<name>` 触发的工作流。Skill 可能包括您团队的数据库架构和查询模式,或带有您团队消息格式规则的 `/post-to-slack` 工作流。

142 

143 示例:MCP 服务器将 Claude 连接到您的数据库。Skill 教导 Claude 您的数据模型、常见查询模式以及用于不同任务的表。

144 </Tab>

145</Tabs>

146 

147### 了解功能如何分层

148 

149功能可以在多个级别定义:用户范围、每个项目、通过 plugins 或通过托管策略。您还可以在子目录中嵌套 CLAUDE.md 文件或在 monorepo 的特定包中放置 skills。当相同的功能存在于多个级别时,以下是它们的分层方式:

150 

151* **CLAUDE.md 文件** 是累加的:所有级别同时向 Claude 的上下文贡献内容。来自您的工作目录及以上的文件在启动时加载;子目录在您在其中工作时加载。当说明冲突时,Claude 使用判断来协调它们,更具体的说明通常优先。有关详细信息,请参阅 [CLAUDE.md 文件如何加载](/zh-CN/memory#how-claudemd-files-load)。

152* **Skills 和 subagents** 按名称覆盖:当相同的名称存在于多个级别时,一个定义根据优先级获胜(对于 skills 为托管 > 用户 > 项目;对于 subagents 为托管 > CLI 标志 > 项目 > 用户 > plugin)。Plugin skills 是 [命名空间的](/zh-CN/plugins#add-skills-to-your-plugin) 以避免冲突。有关详细信息,请参阅 [skill 发现](/zh-CN/skills#where-skills-live) 和 [subagent 范围](/zh-CN/sub-agents#choose-the-subagent-scope)。

153* **MCP 服务器** 按名称覆盖:本地 > 项目 > 用户。有关详细信息,请参阅 [MCP 范围](/zh-CN/mcp#scope-hierarchy-and-precedence)。

154* **Hooks** 合并:所有注册的 hooks 为其匹配的事件触发,无论来源如何。有关详细信息,请参阅 [hooks](/zh-CN/hooks)。

155 

156### 组合功能

157 

158每个扩展解决不同的问题:CLAUDE.md 处理始终开启的上下文,skills 处理按需知识和工作流,MCP 处理外部连接,subagents 处理隔离,hooks 处理自动化。真实的设置根据您的工作流组合它们。

159 

160例如,您可能使用 CLAUDE.md 处理项目约定、使用 skill 处理部署工作流、使用 MCP 连接到数据库、使用 hook 在每次编辑后运行 linting。每个功能处理它最擅长的事情。

161 

162| 模式 | 工作原理 | 示例 |

163| ---------------------- | -------------------------------------- | ---------------------------------------------- |

164| **Skill + MCP** | MCP 提供连接;skill 教导 Claude 如何很好地使用它 | MCP 连接到您的数据库,skill 记录您的架构和查询模式 |

165| **Skill + Subagent** | Skill 为并行工作生成 subagents | `/audit` skill 启动在隔离上下文中工作的安全性、性能和风格 subagents |

166| **CLAUDE.md + Skills** | CLAUDE.md 保存始终开启的规则;skills 保存按需加载的参考材料 | CLAUDE.md 说"遵循我们的 API 约定",skill 包含完整的 API 风格指南 |

167| **Hook + MCP** | Hook 通过 MCP 触发外部操作 | 编辑后 hook 在 Claude 修改关键文件时发送 Slack 通知 |

168 

169## 了解上下文成本

170 

171您添加的每个功能都会消耗 Claude 的一些上下文。太多可能会填满您的上下文窗口,但它也可能增加噪音,使 Claude 效率降低;skills 可能无法正确触发,或 Claude 可能会失去对您的约定的跟踪。了解这些权衡有助于您构建有效的设置。

172 

173### 按功能的上下文成本

174 

175每个功能都有不同的加载策略和上下文成本:

176 

177| 功能 | 何时加载 | 加载内容 | 上下文成本 |

178| ------------- | ---------- | ------------------ | ----------------- |

179| **CLAUDE.md** | 会话开始 | 完整内容 | 每个请求 |

180| **Skills** | 会话开始 + 使用时 | 启动时的描述,使用时的完整内容 | 低(每个请求的描述)\* |

181| **MCP 服务器** | 会话开始 | 所有工具定义和 JSON 架构 | 每个请求 |

182| **Subagents** | 生成时 | 具有指定 skills 的新鲜上下文 | 与主会话隔离 |

183| **Hooks** | 触发时 | 无(外部运行) | 零,除非 hook 返回额外上下文 |

184 

185\*默认情况下,skill 描述在会话开始时加载,以便 Claude 可以决定何时使用它们。在 skill 的 frontmatter 中设置 `disable-model-invocation: true` 以将其完全隐藏在 Claude 中,直到您手动调用它。这将 skills 的上下文成本降低到零,您只需自己触发这些 skills。

186 

187### 了解功能如何加载

188 

189每个功能在会话的不同点加载。下面的选项卡解释了每个功能何时加载以及什么进入上下文。

190 

191<img src="https://mintcdn.com/claude-code/6yTCYq1p37ZB8-CQ/images/context-loading.svg?fit=max&auto=format&n=6yTCYq1p37ZB8-CQ&q=85&s=5a58ce953a35a2412892015e2ad6cb67" alt="上下文加载:CLAUDE.md 和 MCP 在会话开始时加载并保留在每个请求中。Skills 在启动时加载描述,在调用时加载完整内容。Subagents 获得隔离的上下文。Hooks 外部运行。" width="720" height="410" data-path="images/context-loading.svg" />

192 

193<Tabs>

194 <Tab title="CLAUDE.md">

195 **何时:** 会话开始

196 

197 **加载内容:** 所有 CLAUDE.md 文件的完整内容(托管、用户和项目级别)。

198 

199 **继承:** Claude 从您的工作目录读取 CLAUDE.md 文件直到根目录,并在访问这些文件时发现子目录中的嵌套文件。有关详细信息,请参阅 [CLAUDE.md 文件如何加载](/zh-CN/memory#how-claudemd-files-load)。

200 

201 <Tip>保持 CLAUDE.md 在 200 行以下。将参考材料移到 skills,这些 skills 按需加载。</Tip>

202 </Tab>

203 

204 <Tab title="Skills">

205 Skills 是 Claude 工具包中的额外功能。它们可以是参考材料(如 API 风格指南)或可调用的工作流,您可以使用 `/<name>` 触发(如 `/deploy`)。Claude Code 附带 [捆绑的 skills](/zh-CN/skills#bundled-skills),如 `/simplify`、`/batch` 和 `/debug`,可以开箱即用。您也可以创建自己的。Claude 在适当时使用 skills,或者您可以直接调用一个。

206 

207 **何时:** 取决于 skill 的配置。默认情况下,描述在会话开始时加载,完整内容在使用时加载。对于仅用户 skills(`disable-model-invocation: true`),在您调用它们之前不加载任何内容。

208 

209 **加载内容:** 对于模型可调用的 skills,Claude 在每个请求中看到名称和描述。当您使用 `/<name>` 调用 skill 或 Claude 自动加载它时,完整内容加载到您的对话中。

210 

211 **Claude 如何选择 skills:** Claude 将您的任务与 skill 描述相匹配,以决定哪些相关。如果描述模糊或重叠,Claude 可能加载错误的 skill 或错过会有帮助的 skill。要告诉 Claude 使用特定的 skill,请使用 `/<name>` 调用它。带有 `disable-model-invocation: true` 的 Skills 对 Claude 不可见,直到您调用它们。

212 

213 **上下文成本:** 低,直到使用。仅用户 skills 在调用前成本为零。

214 

215 **在 subagents 中:** Skills 在 subagents 中的工作方式不同。不是按需加载,而是传递给 subagent 的 skills 在启动时完全预加载到其上下文中。Subagents 不从主会话继承 skills;您必须明确指定它们。

216 

217 <Tip>对于有副作用的 skills,使用 `disable-model-invocation: true`。这节省上下文并确保只有您触发它们。</Tip>

218 </Tab>

219 

220 <Tab title="MCP 服务器">

221 **何时:** 会话开始。

222 

223 **加载内容:** 来自连接的服务器的所有工具定义和 JSON 架构。

224 

225 **上下文成本:** [工具搜索](/zh-CN/mcp#scale-with-mcp-tool-search)(默认启用)将 MCP 工具加载到上下文的 10%,并延迟其余部分直到需要。

226 

227 **可靠性说明:** MCP 连接可能在会话中途无声地失败。如果服务器断开连接,其工具会无警告地消失。Claude 可能尝试使用不再存在的工具。如果您注意到 Claude 无法使用它之前可以访问的 MCP 工具,请使用 `/mcp` 检查连接。

228 

229 <Tip>运行 `/mcp` 查看每个服务器的令牌成本。断开您未主动使用的服务器。</Tip>

230 </Tab>

231 

232 <Tab title="Subagents">

233 **何时:** 按需,当您或 Claude 为任务生成一个时。

234 

235 **加载内容:** 新鲜、隔离的上下文,包含:

236 

237 * 系统提示(与父级共享以提高缓存效率)

238 * agent 的 `skills:` 字段中列出的 skills 的完整内容

239 * CLAUDE.md 和 git 状态(从父级继承)

240 * 主 agent 在提示中传递的任何上下文

241 

242 **上下文成本:** 与主会话隔离。Subagents 不继承您的对话历史或调用的 skills。

243 

244 <Tip>对于不需要您完整对话上下文的工作,使用 subagents。它们的隔离防止膨胀您的主会话。</Tip>

245 </Tab>

246 

247 <Tab title="Hooks">

248 **何时:** 触发时。Hooks 在特定的生命周期事件上触发,如工具执行、会话边界、提示提交、权限请求和压缩。有关完整列表,请参阅 [Hooks](/zh-CN/hooks)。

249 

250 **加载内容:** 默认情况下无。Hooks 作为外部脚本运行。

251 

252 **上下文成本:** 零,除非 hook 返回作为消息添加到您的对话中的输出。

253 

254 <Tip>Hooks 非常适合不需要影响 Claude 上下文的副作用(linting、logging)。</Tip>

255 </Tab>

256</Tabs>

257 

258## 了解更多

259 

260每个功能都有自己的指南,包含设置说明、示例和配置选项。

261 

262<CardGroup cols={2}>

263 <Card title="CLAUDE.md" icon="file-lines" href="/zh-CN/memory">

264 存储项目上下文、约定和说明

265 </Card>

266 

267 <Card title="Skills" icon="brain" href="/zh-CN/skills">

268 给予 Claude 领域专业知识和可重用的工作流

269 </Card>

270 

271 <Card title="Subagents" icon="users" href="/zh-CN/sub-agents">

272 将工作卸载到隔离的上下文

273 </Card>

274 

275 <Card title="Agent teams" icon="network" href="/zh-CN/agent-teams">

276 协调多个并行工作的会话

277 </Card>

278 

279 <Card title="MCP" icon="plug" href="/zh-CN/mcp">

280 将 Claude 连接到外部服务

281 </Card>

282 

283 <Card title="Hooks" icon="bolt" href="/zh-CN/hooks-guide">

284 使用 hooks 自动化工作流

285 </Card>

286 

287 <Card title="Plugins" icon="puzzle-piece" href="/zh-CN/plugins">

288 捆绑和共享功能集

289 </Card>

290 

291 <Card title="Marketplaces" icon="store" href="/zh-CN/plugin-marketplaces">

292 托管和分发 plugin 集合

293 </Card>

294</CardGroup>

fullscreen.md +159 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 全屏渲染

6 

7> 启用更流畅、无闪烁的渲染模式,支持鼠标操作,在长对话中保持稳定的内存使用。

8 

9<Note>

10 全屏渲染是一个可选的[研究预览](#research-preview)功能,需要 Claude Code v2.1.89 或更高版本。在当前对话中运行 `/tui fullscreen` 来切换,或在 v2.1.110 之前的版本上设置 `CLAUDE_CODE_NO_FLICKER=1`。行为可能会根据反馈而改变。

11</Note>

12 

13全屏渲染是 Claude Code CLI 的一种替代渲染路径,它消除了闪烁,在长对话中保持内存使用量平稳,并添加了鼠标支持。它在终端的备用屏幕缓冲区上绘制界面,就像 `vim` 或 `htop` 一样,并且只渲染当前可见的消息。这减少了每次更新时发送到终端的数据量。

14 

15在渲染吞吐量是瓶颈的终端模拟器中,如 VS Code 集成终端、tmux 和 iTerm2,差异最为明显。如果您的终端滚动位置在 Claude 工作时跳到顶部,或者工具输出流入时屏幕闪烁,此模式可以解决这些问题。

16 

17<Note>

18 术语"全屏"描述的是 Claude Code 如何接管终端的绘制表面,就像 `vim` 一样。它与最大化终端窗口无关,在任何窗口大小下都能工作。

19</Note>

20 

21## 启用全屏渲染

22 

23在任何 Claude Code 对话中运行 `/tui fullscreen`。CLI 会保存 [`tui` 设置](/zh-CN/settings#available-settings)并以您的对话完整地重新启动到全屏模式,因此您可以在会话中途切换而不会丢失上下文。运行不带参数的 `/tui` 来打印当前活动的渲染器。

24 

25您也可以在启动 Claude Code 之前设置 `CLAUDE_CODE_NO_FLICKER` 环境变量:

26 

27```bash theme={null}

28CLAUDE_CODE_NO_FLICKER=1 claude

29```

30 

31`tui` 设置和环境变量是等效的。`/tui` 命令会从重新启动的进程中清除 `CLAUDE_CODE_NO_FLICKER`,以便它写入的设置生效。

32 

33## 变化内容

34 

35全屏渲染改变了 CLI 绘制到终端的方式。输入框保持固定在屏幕底部,而不是在输出流入时移动。如果输入框在 Claude 工作时保持不动,则全屏渲染处于活动状态。只有可见的消息保留在渲染树中,因此无论对话长度如何,内存都保持恒定。

36 

37由于对话存在于备用屏幕缓冲区而不是终端的滚动历史中,一些事情的工作方式不同:

38 

39| 之前 | 现在 | 详情 |

40| :--------------------- | :-------------------------------------- | :--------------------------------------------- |

41| `Cmd+f` 或 tmux 搜索来查找文本 | `Ctrl+o` 进入记录模式,然后 `/` 来搜索或 `[` 来写入滚动历史 | [搜索和查看对话](#search-and-review-the-conversation) |

42| 终端的原生点击拖动来选择和复制 | 应用内选择,鼠标释放时自动复制 | [使用鼠标](#use-the-mouse) |

43| `Cmd` 点击来打开 URL | 点击 URL | [使用鼠标](#use-the-mouse) |

44 

45如果鼠标捕获干扰您的工作流程,您可以[关闭它](#keep-native-text-selection),同时保持无闪烁渲染。

46 

47## 使用鼠标

48 

49全屏渲染捕获鼠标事件并在 Claude Code 内处理它们:

50 

51* **在提示输入框中点击**以在您正在输入的文本中的任何位置放置光标。

52* **点击折叠的工具结果**以展开它并查看完整输出。再次点击以折叠。工具调用及其结果一起展开。只有有更多内容要显示的消息才可点击。

53* **点击 URL 或文件路径**以打开它。工具输出中的文件路径,如 Edit 或 Write 后打印的路径,在您的默认应用程序中打开。纯 `http://` 和 `https://` URL 在您的浏览器中打开。在大多数终端中,这替代了原生的 `Cmd` 点击或 `Ctrl` 点击,鼠标捕获会拦截这些。在 VS Code 集成终端和类似的基于 xterm.js 的终端中,继续使用 `Cmd` 点击。Claude Code 在那里遵从终端自己的链接处理程序,以避免打开链接两次。

54* **点击并拖动**以在对话中的任何位置选择文本。双击选择一个单词,匹配 iTerm2 的单词边界,以便文件路径作为一个单位选择。三击选择该行。

55* **用鼠标滚轮滚动**以在对话中移动。

56 

57选定的文本在鼠标释放时自动复制到您的剪贴板。要关闭此功能,请在 `/config` 中切换"选择时复制"。关闭后,按 `Ctrl+Shift+c` 手动复制。在支持 kitty 键盘协议的终端上,如 kitty、WezTerm、Ghostty 和 iTerm2,`Cmd+c` 也可以工作。如果您有活动的选择,`Ctrl+c` 会复制而不是取消。

58 

59使用活动的选择时,按住 `Shift` 并按箭头键从键盘扩展它。`Shift+↑` 和 `Shift+↓` 在选择到达顶部或底部边缘时滚动视口。`Shift+Home` 和 `Shift+End` 扩展到当前行的开始或结束。

60 

61## 滚动对话

62 

63全屏渲染在应用内处理滚动。使用这些快捷键来导航:

64 

65| 快捷键 | 操作 |

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

67| `PgUp` / `PgDn` | 向上或向下滚动半屏 |

68| `Ctrl+Home` | 跳到对话的开始 |

69| `Ctrl+End` | 跳到最新消息并重新启用自动跟随 |

70| 鼠标滚轮 | 一次滚动几行 |

71 

72在没有专用 `PgUp`、`PgDn`、`Home` 或 `End` 键的键盘上,如 MacBook 键盘,按住 `Fn` 并使用箭头键:`Fn+↑` 发送 `PgUp`,`Fn+↓` 发送 `PgDn`,`Fn+←` 发送 `Home`,`Fn+→` 发送 `End`。这使得 `Ctrl+Fn+→` 成为跳到底部的快捷键。如果这感觉很尴尬,用鼠标滚轮滚动到底部以恢复跟随,或将 `scroll:bottom` 重新绑定到可达到的东西。

73 

74这些操作是可重新绑定的。请参阅[滚动操作](/zh-CN/keybindings#scroll-actions)以获取完整的操作名称列表,包括没有默认绑定的半页和全页变体。

75 

76### 自动跟随

77 

78向上滚动会暂停自动跟随,以便新输出不会将您拉回底部。按 `Ctrl+End` 或滚动到底部以恢复跟随。

79 

80要完全关闭自动跟随,以便视图保持在您离开的位置,请打开 `/config` 并将"自动滚动"设置为关闭。禁用自动滚动后,视图永远不会自动跳到底部。权限提示和其他需要响应的对话框仍然会滚动到视图中,无论此设置如何。

81 

82### 鼠标滚轮滚动

83 

84鼠标滚轮滚动需要您的终端将鼠标事件转发到 Claude Code。大多数终端在应用程序请求时都会这样做。iTerm2 将其作为每个配置文件的设置:如果滚轮不起作用但 `PgUp` 和 `PgDn` 有效,请打开"设置"→"配置文件"→"终端"并打开"启用鼠标报告"。点击展开和文本选择也需要相同的设置。

85 

86如果鼠标滚轮滚动感觉很慢,您的终端可能每个物理凹口发送一个滚动事件,没有乘数。一些终端,如 Ghostty 和启用了更快滚动的 iTerm2,已经放大了滚轮事件。其他的,包括 VS Code 集成终端,每个凹口发送恰好一个事件。Claude Code 无法检测哪个。

87 

88设置 `CLAUDE_CODE_SCROLL_SPEED` 来乘以基础滚动距离:

89 

90```bash theme={null}

91export CLAUDE_CODE_SCROLL_SPEED=3

92```

93 

94值 `3` 与 `vim` 和类似应用程序中的默认值匹配。该设置接受 1 到 20 的值。

95 

96## 搜索和查看对话

97 

98`Ctrl+o` 在正常提示和记录模式之间切换。对于一个更安静的视图,只显示您的最后一个提示、工具调用的单行摘要和编辑 diffstats,以及最终响应,请运行 `/focus`。该设置在会话之间保持。再次运行 `/focus` 来关闭它。

99 

100记录模式获得 `less` 风格的导航和搜索:

101 

102| 键 | 操作 |

103| :---------------------------------- | :----------------------------------------- |

104| `/` | 打开搜索。输入以查找匹配项,`Enter` 接受,`Esc` 取消并恢复您的滚动位置 |

105| `n` / `N` | 跳到下一个或上一个匹配项。在您关闭搜索栏后工作 |

106| `j` / `k` 或 `↑` / `↓` | 向上或向下滚动一行 |

107| `g` / `G` 或 `Home` / `End` | 跳到顶部或底部 |

108| `Ctrl+u` / `Ctrl+d` | 滚动半页 |

109| `Ctrl+b` / `Ctrl+f` 或 `Space` / `b` | 滚动整页 |

110| `Ctrl+o`、`Esc` 或 `q` | 退出记录模式并返回到提示 |

111 

112您的终端的 `Cmd+f` 和 tmux 搜索看不到对话,因为它存在于备用屏幕缓冲区中,而不是原生滚动历史中。要将内容交还给您的终端,请先按 `Ctrl+o` 进入记录模式,然后:

113 

114* **`[`**:将完整对话写入您的终端的原生滚动历史缓冲区,所有工具输出都已展开。对话现在是您的终端中的普通文本,因此 `Cmd+f`、tmux 复制模式和任何其他原生工具都可以搜索或选择它。长会话可能会在此过程中暂停片刻。这会持续到您使用 `Esc` 或 `q` 退出记录模式,这会将您返回到全屏渲染。下一个 `Ctrl+o` 重新开始。

115* **`v`**:将对话写入临时文件并在 `$VISUAL` 或 `$EDITOR` 中打开它。

116 

117按 `Esc` 或 `q` 返回到提示。

118 

119## 清除对话

120 

121在两秒内按两次 `Ctrl+L` 来运行 `/clear` 并开始新对话。第一次按下会重新绘制屏幕并显示提示;第二次按下会清除对话。在 macOS 上,双击 `Cmd+K` 也会运行 `/clear`。

122 

123## 与 tmux 一起使用

124 

125全屏渲染在 tmux 内工作,有两个注意事项。

126 

127鼠标滚轮滚动需要 tmux 的鼠标模式。如果您的 `~/.tmux.conf` 还没有启用它,请添加这一行并重新加载您的配置:

128 

129```bash theme={null}

130set -g mouse on

131```

132 

133没有鼠标模式,滚轮事件会转到 tmux 而不是 Claude Code。使用 `PgUp` 和 `PgDn` 的键盘滚动无论如何都可以工作。如果 Claude Code 检测到 tmux 且鼠标模式关闭,它会在启动时打印一次性提示。

134 

135全屏渲染与 iTerm2 的 tmux 集成模式不兼容,这是您使用 `tmux -CC` 进入的模式。在集成模式中,iTerm2 将每个 tmux 窗格渲染为原生分割,而不是让 tmux 绘制到终端。备用屏幕缓冲区和鼠标跟踪在那里无法正确工作:鼠标滚轮不起作用,双击可能会损坏终端状态。不要在 `tmux -CC` 会话中启用全屏渲染。常规 tmux 在 iTerm2 内,没有 `-CC`,工作正常。

136 

137## 保持原生文本选择

138 

139鼠标捕获是最常见的摩擦点,特别是在 SSH 上或 tmux 内。当 Claude Code 捕获鼠标事件时,您的终端的原生选择时复制停止工作。您使用点击拖动进行的选择存在于 Claude Code 内,而不是在您的终端的选择缓冲区中,因此 tmux 复制模式、Kitty 提示和类似工具看不到它。

140 

141Claude Code 尝试将选择写入您的剪贴板,但它使用的路径取决于您的设置。在 tmux 内,它写入 tmux 粘贴缓冲区。在 SSH 上,它回退到 OSC 52 转义序列,一些终端默认阻止这些。iTerm2 会阻止它们,直到您打开 Settings → General → Selection → Applications in terminal may access clipboard。在 iTerm2 中运行 [`/terminal-setup`](/zh-CN/terminal-config) 会为您启用此功能。Claude Code 在每次复制后打印一个 toast,告诉您它使用了哪个路径。

142 

143如果您想进行一次性的原生选择,请在点击拖动时按住您的终端的绕过修饰键:iTerm2 中的 `Option`,或大多数 Linux 和 Windows 终端中的 `Shift`。修饰键告诉您的终端自己处理选择,而不是将鼠标事件转发给 Claude Code,因此 `Cmd+C` 和您的终端的其他复制快捷键可以在其上工作。

144 

145如果您一直依赖原生选择,请设置 `CLAUDE_CODE_DISABLE_MOUSE=1` 以选择退出鼠标捕获,同时保持无闪烁渲染和平稳内存:

146 

147```bash theme={null}

148CLAUDE_CODE_NO_FLICKER=1 CLAUDE_CODE_DISABLE_MOUSE=1 claude

149```

150 

151禁用鼠标捕获后,使用 `PgUp`、`PgDn`、`Ctrl+Home` 和 `Ctrl+End` 的键盘滚动仍然有效,您的终端原生处理选择。您会失去点击定位光标、点击展开工具输出、URL 点击和 Claude Code 内的滚轮滚动。

152 

153## 研究预览

154 

155全屏渲染是一个研究预览功能。它已在常见的终端模拟器上进行了测试,但您可能会在不太常见的终端或不寻常的配置上遇到渲染问题。

156 

157如果您遇到问题,请在 Claude Code 内运行 `/feedback` 来报告它,或在 [claude-code GitHub 仓库](https://github.com/anthropics/claude-code/issues)上打开一个问题。包括您的终端模拟器名称和版本。

158 

159要关闭全屏渲染,请运行 `/tui default`,或如果您以这种方式启用它,请取消设置环境变量。

github-actions.md +670 −0 created

Details

1> ## Documentation Index

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

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

4 

5# Claude Code GitHub Actions

6 

7> 了解如何将 Claude Code 集成到您的开发工作流中,使用 Claude Code GitHub Actions

8 

9Claude Code GitHub Actions 为您的 GitHub 工作流带来了 AI 驱动的自动化。只需在任何 PR 或 issue 中简单地提及 `@claude`,Claude 就可以分析您的代码、创建拉取请求、实现功能和修复错误 - 所有这些都遵循您项目的标准。如需在每个 PR 上自动发布评论而无需触发器,请参阅 [GitHub Code Review](/zh-CN/code-review)。

10 

11<Note>

12 Claude Code GitHub Actions 建立在 [Claude Agent SDK](/zh-CN/agent-sdk/overview) 之上,该 SDK 支持将 Claude Code 以编程方式集成到您的应用程序中。您可以使用该 SDK 构建超越 GitHub Actions 的自定义自动化工作流。

13</Note>

14 

15<Info>

16 **Claude Opus 4.7 现已推出。** Claude Code GitHub Actions 默认使用 Sonnet。要使用 Opus 4.7,请配置 [model 参数](#breaking-changes-reference)以使用 `claude-opus-4-7`。

17</Info>

18 

19## 为什么使用 Claude Code GitHub Actions?

20 

21* **即时 PR 创建**:描述您需要什么,Claude 会创建一个包含所有必要更改的完整 PR

22* **自动化代码实现**:通过单个命令将 issue 转换为可工作的代码

23* **遵循您的标准**:Claude 尊重您的 `CLAUDE.md` 指南和现有代码模式

24* **简单设置**:通过我们的安装程序和 API 密钥在几分钟内开始使用

25* **默认安全**:您的代码保留在 Github 的运行器上

26 

27## Claude 可以做什么?

28 

29Claude Code 提供了一个强大的 GitHub Action,改变了您处理代码的方式:

30 

31### Claude Code Action

32 

33这个 GitHub Action 允许您在 GitHub Actions 工作流中运行 Claude Code。您可以使用它在 Claude Code 之上构建任何自定义工作流。

34 

35[查看仓库 →](https://github.com/anthropics/claude-code-action)

36 

37## 设置

38 

39## 快速设置

40 

41设置此 action 的最简单方法是通过终端中的 Claude Code。只需打开 claude 并运行 `/install-github-app`。

42 

43此命令将指导您完成 GitHub 应用和所需密钥的设置。

44 

45<Note>

46 * 您必须是仓库管理员才能安装 GitHub 应用并添加密钥

47 * GitHub 应用将请求对内容、Issue 和拉取请求的读写权限

48 * 此快速启动方法仅适用于直接 Claude API 用户。如果您使用 Amazon Bedrock 或 Google Vertex AI,请参阅 [使用 Amazon Bedrock 和 Google Vertex AI](#using-with-amazon-bedrock-%26-google-vertex-ai) 部分。

49</Note>

50 

51## 手动设置

52 

53如果 `/install-github-app` 命令失败或您更喜欢手动设置,请按照以下手动设置说明进行操作:

54 

551. **安装 Claude GitHub 应用**到您的仓库:[https://github.com/apps/claude](https://github.com/apps/claude)

56 

57 Claude GitHub 应用需要以下仓库权限:

58 

59 * **Contents**:读写(用于修改仓库文件)

60 * **Issues**:读写(用于响应 issue)

61 * **Pull requests**:读写(用于创建 PR 和推送更改)

62 

63 有关安全和权限的更多详情,请参阅 [安全文档](https://github.com/anthropics/claude-code-action/blob/main/docs/security.md)。

642. **添加 ANTHROPIC\_API\_KEY** 到您的仓库密钥([了解如何在 GitHub Actions 中使用密钥](https://docs.github.com/en/actions/security-guides/using-secrets-in-github-actions))

653. **复制工作流文件**从 [examples/claude.yml](https://github.com/anthropics/claude-code-action/blob/main/examples/claude.yml) 到您的仓库的 `.github/workflows/`

66 

67<Tip>

68 完成快速启动或手动设置后,通过在 issue 或 PR 评论中标记 `@claude` 来测试该 action。

69</Tip>

70 

71## 从 Beta 升级

72 

73<Warning>

74 Claude Code GitHub Actions v1.0 引入了重大更改,需要更新您的工作流文件才能从 beta 版本升级到 v1.0。

75</Warning>

76 

77如果您当前使用 Claude Code GitHub Actions 的 beta 版本,我们建议您更新工作流以使用 GA 版本。新版本简化了配置,同时添加了强大的新功能,如自动模式检测。

78 

79### 基本更改

80 

81所有 beta 用户必须对其工作流文件进行这些更改才能升级:

82 

831. **更新 action 版本**:将 `@beta` 更改为 `@v1`

842. **删除模式配置**:删除 `mode: "tag"` 或 `mode: "agent"`(现在自动检测)

853. **更新提示输入**:将 `direct_prompt` 替换为 `prompt`

864. **移动 CLI 选项**:将 `max_turns`、`model`、`custom_instructions` 等转换为 `claude_args`

87 

88### 重大更改参考

89 

90| 旧 Beta 输入 | 新 v1.0 输入 |

91| --------------------- | ------------------------------------- |

92| `mode` | *(已删除 - 自动检测)* |

93| `direct_prompt` | `prompt` |

94| `override_prompt` | `prompt` 带 GitHub 变量 |

95| `custom_instructions` | `claude_args: --append-system-prompt` |

96| `max_turns` | `claude_args: --max-turns` |

97| `model` | `claude_args: --model` |

98| `allowed_tools` | `claude_args: --allowedTools` |

99| `disallowed_tools` | `claude_args: --disallowedTools` |

100| `claude_env` | `settings` JSON 格式 |

101 

102### 前后示例

103 

104**Beta 版本:**

105 

106```yaml theme={null}

107- uses: anthropics/claude-code-action@beta

108 with:

109 mode: "tag"

110 direct_prompt: "Review this PR for security issues"

111 anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}

112 custom_instructions: "Follow our coding standards"

113 max_turns: "10"

114 model: "claude-sonnet-4-6"

115```

116 

117**GA 版本 (v1.0):**

118 

119```yaml theme={null}

120- uses: anthropics/claude-code-action@v1

121 with:

122 prompt: "Review this PR for security issues"

123 anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}

124 claude_args: |

125 --append-system-prompt "Follow our coding standards"

126 --max-turns 10

127 --model claude-sonnet-4-6

128```

129 

130<Tip>

131 该 action 现在根据您的配置自动检测是在交互模式(响应 `@claude` 提及)还是自动化模式(立即使用提示运行)下运行。

132</Tip>

133 

134## 示例用例

135 

136Claude Code GitHub Actions 可以帮助您完成各种任务。[examples 目录](https://github.com/anthropics/claude-code-action/tree/main/examples)包含针对不同场景的现成工作流。

137 

138### 基本工作流

139 

140```yaml theme={null}

141name: Claude Code

142on:

143 issue_comment:

144 types: [created]

145 pull_request_review_comment:

146 types: [created]

147jobs:

148 claude:

149 runs-on: ubuntu-latest

150 steps:

151 - uses: anthropics/claude-code-action@v1

152 with:

153 anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}

154 # Responds to @claude mentions in comments

155```

156 

157### 使用 skills

158 

159```yaml theme={null}

160name: Code Review

161on:

162 pull_request:

163 types: [opened, synchronize]

164jobs:

165 review:

166 runs-on: ubuntu-latest

167 steps:

168 - uses: anthropics/claude-code-action@v1

169 with:

170 anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}

171 prompt: "Review this pull request for code quality, correctness, and security. Analyze the diff, then post your findings as review comments."

172 claude_args: "--max-turns 5"

173```

174 

175### 使用提示的自定义自动化

176 

177```yaml theme={null}

178name: Daily Report

179on:

180 schedule:

181 - cron: "0 9 * * *"

182jobs:

183 report:

184 runs-on: ubuntu-latest

185 steps:

186 - uses: anthropics/claude-code-action@v1

187 with:

188 anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}

189 prompt: "Generate a summary of yesterday's commits and open issues"

190 claude_args: "--model opus"

191```

192 

193### 常见用例

194 

195在 issue 或 PR 评论中:

196 

197```text theme={null}

198@claude implement this feature based on the issue description

199@claude how should I implement user authentication for this endpoint?

200@claude fix the TypeError in the user dashboard component

201```

202 

203Claude 将自动分析上下文并做出适当的响应。

204 

205## 最佳实践

206 

207### CLAUDE.md 配置

208 

209在您的仓库根目录创建一个 `CLAUDE.md` 文件来定义代码风格指南、审查标准、项目特定规则和首选模式。此文件指导 Claude 对您的项目标准的理解。

210 

211### 安全考虑

212 

213<Warning>永远不要直接将 API 密钥提交到您的仓库。</Warning>

214 

215有关全面的安全指导,包括权限、身份验证和最佳实践,请参阅 [Claude Code Action 安全文档](https://github.com/anthropics/claude-code-action/blob/main/docs/security.md)。

216 

217始终为 API 密钥使用 GitHub Secrets:

218 

219* 将您的 API 密钥添加为名为 `ANTHROPIC_API_KEY` 的仓库密钥

220* 在工作流中引用它:`anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}`

221* 将 action 权限限制为仅必要的权限

222* 在合并前审查 Claude 的建议

223 

224始终使用 GitHub Secrets(例如,`${{ secrets.ANTHROPIC_API_KEY }}`)而不是直接在工作流文件中硬编码 API 密钥。

225 

226### 优化性能

227 

228使用 issue 模板提供上下文,保持您的 `CLAUDE.md` 简洁和专注,并为您的工作流配置适当的超时。

229 

230### CI 成本

231 

232使用 Claude Code GitHub Actions 时,请注意相关成本:

233 

234**GitHub Actions 成本:**

235 

236* Claude Code 在 GitHub 托管的运行器上运行,这会消耗您的 GitHub Actions 分钟数

237* 有关详细的定价和分钟限制,请参阅 [GitHub 的计费文档](https://docs.github.com/en/billing/managing-billing-for-your-products/managing-billing-for-github-actions/about-billing-for-github-actions)

238 

239**API 成本:**

240 

241* 每次 Claude 交互都会根据提示和响应的长度消耗 API 令牌

242* 令牌使用量因任务复杂性和代码库大小而异

243* 有关当前令牌费率,请参阅 [Claude 的定价页面](https://claude.com/platform/api)

244 

245**成本优化提示:**

246 

247* 使用特定的 `@claude` 命令来减少不必要的 API 调用

248* 在 `claude_args` 中配置适当的 `--max-turns` 以防止过度迭代

249* 设置工作流级别的超时以避免失控的作业

250* 考虑使用 GitHub 的并发控制来限制并行运行

251 

252## 配置示例

253 

254Claude Code Action v1 使用统一参数简化了配置:

255 

256```yaml theme={null}

257- uses: anthropics/claude-code-action@v1

258 with:

259 anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}

260 prompt: "Your instructions here" # Optional

261 claude_args: "--max-turns 5" # Optional CLI arguments

262```

263 

264关键功能:

265 

266* **统一提示界面** - 对所有说明使用 `prompt`

267* **Skills** - 直接从提示调用已安装的 [skills](/zh-CN/skills)

268* **CLI 传递** - 通过 `claude_args` 的任何 Claude Code CLI 参数

269* **灵活的触发器** - 适用于任何 GitHub 事件

270 

271访问 [examples 目录](https://github.com/anthropics/claude-code-action/tree/main/examples)获取完整的工作流文件。

272 

273<Tip>

274 当响应 issue 或 PR 评论时,Claude 会自动响应 @claude 提及。对于其他事件,使用 `prompt` 参数提供说明。

275</Tip>

276 

277## 使用 Amazon Bedrock 和 Google Vertex AI

278 

279对于企业环境,您可以将 Claude Code GitHub Actions 与您自己的云基础设施一起使用。这种方法让您可以控制数据驻留和计费,同时保持相同的功能。

280 

281### 前置条件

282 

283在使用云提供商设置 Claude Code GitHub Actions 之前,您需要:

284 

285#### 对于 Google Cloud Vertex AI:

286 

2871. 启用了 Vertex AI 的 Google Cloud 项目

2882. 为 GitHub Actions 配置的工作负载身份联合

2893. 具有所需权限的服务账户

2904. GitHub 应用(推荐)或使用默认 GITHUB\_TOKEN

291 

292#### 对于 Amazon Bedrock:

293 

2941. 启用了 Amazon Bedrock 的 AWS 账户

2952. 在 AWS 中配置的 GitHub OIDC 身份提供商

2963. 具有 Bedrock 权限的 IAM 角色

2974. GitHub 应用(推荐)或使用默认 GITHUB\_TOKEN

298 

299<Steps>

300 <Step title="创建自定义 GitHub 应用(推荐用于第三方提供商)">

301 为了在使用 Vertex AI 或 Bedrock 等第三方提供商时获得最佳控制和安全性,我们建议创建您自己的 GitHub 应用:

302 

303 1. 转到 [https://github.com/settings/apps/new](https://github.com/settings/apps/new)

304 2. 填写基本信息:

305 * **GitHub App 名称**:选择唯一的名称(例如,"YourOrg Claude Assistant")

306 * **主页 URL**:您的组织网站或仓库 URL

307 3. 配置应用设置:

308 * **Webhooks**:取消选中"Active"(此集成不需要)

309 4. 设置所需的权限:

310 * **仓库权限**:

311 * Contents:读写

312 * Issues:读写

313 * Pull requests:读写

314 5. 点击"Create GitHub App"

315 6. 创建后,点击"Generate a private key"并保存下载的 `.pem` 文件

316 7. 从应用设置页面记下您的应用 ID

317 8. 将应用安装到您的仓库:

318 * 从您的应用设置页面,点击左侧边栏中的"Install App"

319 * 选择您的账户或组织

320 * 选择"Only select repositories"并选择特定仓库

321 * 点击"Install"

322 9. 将私钥添加为仓库密钥:

323 * 转到您的仓库的 Settings → Secrets and variables → Actions

324 * 创建一个名为 `APP_PRIVATE_KEY` 的新密钥,内容为 `.pem` 文件的内容

325 10. 将应用 ID 添加为密钥:

326 

327 * 创建一个名为 `APP_ID` 的新密钥,值为您的 GitHub 应用的 ID

328 

329 <Note>

330 此应用将与 [actions/create-github-app-token](https://github.com/actions/create-github-app-token) action 一起使用,以在您的工作流中生成身份验证令牌。

331 </Note>

332 

333 **Claude API 的替代方案或如果您不想设置自己的 Github 应用**:使用官方 Anthropic 应用:

334 

335 1. 从以下位置安装:[https://github.com/apps/claude](https://github.com/apps/claude)

336 2. 无需额外的身份验证配置

337 </Step>

338 

339 <Step title="配置云提供商身份验证">

340 选择您的云提供商并设置安全身份验证:

341 

342 <AccordionGroup>

343 <Accordion title="Amazon Bedrock">

344 **配置 AWS 以允许 GitHub Actions 安全地进行身份验证,而无需存储凭证。**

345 

346 > **安全说明**:使用特定于仓库的配置并仅授予最少所需的权限。

347 

348 **所需设置**:

349 

350 1. **启用 Amazon Bedrock**:

351 * 请求在 Amazon Bedrock 中访问 Claude 模型

352 * 对于跨区域模型,请在所有必需的区域中请求访问

353 

354 2. **设置 GitHub OIDC 身份提供商**:

355 * 提供商 URL:`https://token.actions.githubusercontent.com`

356 * 受众:`sts.amazonaws.com`

357 

358 3. **为 GitHub Actions 创建 IAM 角色**:

359 * 受信任的实体类型:Web 身份

360 * 身份提供商:`token.actions.githubusercontent.com`

361 * 权限:`AmazonBedrockFullAccess` 策略

362 * 为您的特定仓库配置信任策略

363 

364 **所需值**:

365 

366 设置后,您需要:

367 

368 * **AWS\_ROLE\_TO\_ASSUME**:您创建的 IAM 角色的 ARN

369 

370 <Tip>

371 OIDC 比使用静态 AWS 访问密钥更安全,因为凭证是临时的并自动轮换。

372 </Tip>

373 

374 有关详细的 OIDC 设置说明,请参阅 [AWS 文档](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_create_oidc.html)。

375 </Accordion>

376 

377 <Accordion title="Google Vertex AI">

378 **配置 Google Cloud 以允许 GitHub Actions 安全地进行身份验证,而无需存储凭证。**

379 

380 > **安全说明**:使用特定于仓库的配置并仅授予最少所需的权限。

381 

382 **所需设置**:

383 

384 1. **在您的 Google Cloud 项目中启用 API**:

385 * IAM Credentials API

386 * Security Token Service (STS) API

387 * Vertex AI API

388 

389 2. **创建工作负载身份联合资源**:

390 * 创建工作负载身份池

391 * 添加 GitHub OIDC 提供商,具有:

392 * 发行者:`https://token.actions.githubusercontent.com`

393 * 仓库和所有者的属性映射

394 * **安全建议**:使用特定于仓库的属性条件

395 

396 3. **创建服务账户**:

397 * 仅授予 `Vertex AI User` 角色

398 * **安全建议**:为每个仓库创建专用服务账户

399 

400 4. **配置 IAM 绑定**:

401 * 允许工作负载身份池模拟服务账户

402 * **安全建议**:使用特定于仓库的主体集

403 

404 **所需值**:

405 

406 设置后,您需要:

407 

408 * **GCP\_WORKLOAD\_IDENTITY\_PROVIDER**:完整的提供商资源名称

409 * **GCP\_SERVICE\_ACCOUNT**:服务账户电子邮件地址

410 

411 <Tip>

412 工作负载身份联合消除了对可下载服务账户密钥的需求,提高了安全性。

413 </Tip>

414 

415 有关详细的设置说明,请参阅 [Google Cloud 工作负载身份联合文档](https://cloud.google.com/iam/docs/workload-identity-federation)。

416 </Accordion>

417 </AccordionGroup>

418 </Step>

419 

420 <Step title="添加所需的密钥">

421 将以下密钥添加到您的仓库(Settings → Secrets and variables → Actions):

422 

423 #### 对于 Claude API(直接):

424 

425 1. **对于 API 身份验证**:

426 * `ANTHROPIC_API_KEY`:您的 Claude API 密钥,来自 [console.anthropic.com](https://console.anthropic.com)

427 

428 2. **对于 GitHub 应用(如果使用您自己的应用)**:

429 * `APP_ID`:您的 GitHub 应用的 ID

430 * `APP_PRIVATE_KEY`:私钥 (.pem) 内容

431 

432 #### 对于 Google Cloud Vertex AI

433 

434 1. **对于 GCP 身份验证**:

435 * `GCP_WORKLOAD_IDENTITY_PROVIDER`

436 * `GCP_SERVICE_ACCOUNT`

437 

438 2. **对于 GitHub 应用(如果使用您自己的应用)**:

439 * `APP_ID`:您的 GitHub 应用的 ID

440 * `APP_PRIVATE_KEY`:私钥 (.pem) 内容

441 

442 #### 对于 AWS Bedrock

443 

444 1. **对于 AWS 身份验证**:

445 * `AWS_ROLE_TO_ASSUME`

446 

447 2. **对于 GitHub 应用(如果使用您自己的应用)**:

448 * `APP_ID`:您的 GitHub 应用的 ID

449 * `APP_PRIVATE_KEY`:私钥 (.pem) 内容

450 </Step>

451 

452 <Step title="创建工作流文件">

453 创建与您的云提供商集成的 GitHub Actions 工作流文件。下面的示例显示了 Amazon Bedrock 和 Google Vertex AI 的完整配置:

454 

455 <AccordionGroup>

456 <Accordion title="Amazon Bedrock 工作流">

457 **前置条件:**

458 

459 * 启用了 Amazon Bedrock 访问权限,具有 Claude 模型权限

460 * GitHub 在 AWS 中配置为 OIDC 身份提供商

461 * 具有 Bedrock 权限的 IAM 角色,信任 GitHub Actions

462 

463 **所需的 GitHub 密钥:**

464 

465 | 密钥名称 | 描述 |

466 | -------------------- | ----------------------- |

467 | `AWS_ROLE_TO_ASSUME` | Bedrock 访问的 IAM 角色的 ARN |

468 | `APP_ID` | 您的 GitHub 应用 ID(来自应用设置) |

469 | `APP_PRIVATE_KEY` | 您为 GitHub 应用生成的私钥 |

470 

471 ```yaml theme={null}

472 name: Claude PR Action

473 

474 permissions:

475 contents: write

476 pull-requests: write

477 issues: write

478 id-token: write

479 

480 on:

481 issue_comment:

482 types: [created]

483 pull_request_review_comment:

484 types: [created]

485 issues:

486 types: [opened, assigned]

487 

488 jobs:

489 claude-pr:

490 if: |

491 (github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) ||

492 (github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude')) ||

493 (github.event_name == 'issues' && contains(github.event.issue.body, '@claude'))

494 runs-on: ubuntu-latest

495 env:

496 AWS_REGION: us-west-2

497 steps:

498 - name: Checkout repository

499 uses: actions/checkout@v4

500 

501 - name: Generate GitHub App token

502 id: app-token

503 uses: actions/create-github-app-token@v2

504 with:

505 app-id: ${{ secrets.APP_ID }}

506 private-key: ${{ secrets.APP_PRIVATE_KEY }}

507 

508 - name: Configure AWS Credentials (OIDC)

509 uses: aws-actions/configure-aws-credentials@v4

510 with:

511 role-to-assume: ${{ secrets.AWS_ROLE_TO_ASSUME }}

512 aws-region: us-west-2

513 

514 - uses: anthropics/claude-code-action@v1

515 with:

516 github_token: ${{ steps.app-token.outputs.token }}

517 use_bedrock: "true"

518 claude_args: '--model us.anthropic.claude-sonnet-4-6 --max-turns 10'

519 ```

520 

521 <Tip>

522 Bedrock 的模型 ID 格式包括区域前缀(例如,`us.anthropic.claude-sonnet-4-6`)。

523 </Tip>

524 </Accordion>

525 

526 <Accordion title="Google Vertex AI 工作流">

527 **前置条件:**

528 

529 * 在您的 GCP 项目中启用了 Vertex AI API

530 * 为 GitHub 配置了工作负载身份联合

531 * 具有 Vertex AI 权限的服务账户

532 

533 **所需的 GitHub 密钥:**

534 

535 | 密钥名称 | 描述 |

536 | -------------------------------- | -------------------------- |

537 | `GCP_WORKLOAD_IDENTITY_PROVIDER` | 工作负载身份提供商资源名称 |

538 | `GCP_SERVICE_ACCOUNT` | 具有 Vertex AI 访问权限的服务账户电子邮件 |

539 | `APP_ID` | 您的 GitHub 应用 ID(来自应用设置) |

540 | `APP_PRIVATE_KEY` | 您为 GitHub 应用生成的私钥 |

541 

542 ```yaml theme={null}

543 name: Claude PR Action

544 

545 permissions:

546 contents: write

547 pull-requests: write

548 issues: write

549 id-token: write

550 

551 on:

552 issue_comment:

553 types: [created]

554 pull_request_review_comment:

555 types: [created]

556 issues:

557 types: [opened, assigned]

558 

559 jobs:

560 claude-pr:

561 if: |

562 (github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) ||

563 (github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude')) ||

564 (github.event_name == 'issues' && contains(github.event.issue.body, '@claude'))

565 runs-on: ubuntu-latest

566 steps:

567 - name: Checkout repository

568 uses: actions/checkout@v4

569 

570 - name: Generate GitHub App token

571 id: app-token

572 uses: actions/create-github-app-token@v2

573 with:

574 app-id: ${{ secrets.APP_ID }}

575 private-key: ${{ secrets.APP_PRIVATE_KEY }}

576 

577 - name: Authenticate to Google Cloud

578 id: auth

579 uses: google-github-actions/auth@v2

580 with:

581 workload_identity_provider: ${{ secrets.GCP_WORKLOAD_IDENTITY_PROVIDER }}

582 service_account: ${{ secrets.GCP_SERVICE_ACCOUNT }}

583 

584 - uses: anthropics/claude-code-action@v1

585 with:

586 github_token: ${{ steps.app-token.outputs.token }}

587 trigger_phrase: "@claude"

588 use_vertex: "true"

589 claude_args: '--model claude-sonnet-4-5@20250929 --max-turns 10'

590 env:

591 ANTHROPIC_VERTEX_PROJECT_ID: ${{ steps.auth.outputs.project_id }}

592 CLOUD_ML_REGION: us-east5

593 VERTEX_REGION_CLAUDE_4_5_SONNET: us-east5

594 ```

595 

596 <Tip>

597 项目 ID 从 Google Cloud 身份验证步骤自动检索,因此您无需对其进行硬编码。

598 </Tip>

599 </Accordion>

600 </AccordionGroup>

601 </Step>

602</Steps>

603 

604## 故障排除

605 

606### Claude 不响应 @claude 命令

607 

608验证 GitHub 应用是否正确安装,检查工作流是否已启用,确保 API 密钥在仓库密钥中设置,并确认评论包含 `@claude`(不是 `/claude`)。

609 

610### CI 不在 Claude 的提交上运行

611 

612确保您使用的是 GitHub 应用或自定义应用(不是 Actions 用户),检查工作流触发器是否包含必要的事件,并验证应用权限是否包括 CI 触发器。

613 

614### 身份验证错误

615 

616确认 API 密钥有效且具有足够的权限。对于 Bedrock/Vertex,检查凭证配置并确保密钥在工作流中正确命名。

617 

618## 高级配置

619 

620### Action 参数

621 

622Claude Code Action v1 使用简化的配置:

623 

624| 参数 | 描述 | 必需 |

625| ------------------- | ------------------------------------------ | ----- |

626| `prompt` | Claude 的说明(纯文本或 [skill](/zh-CN/skills) 名称) | 否\* |

627| `claude_args` | 传递给 Claude Code 的 CLI 参数 | 否 |

628| `anthropic_api_key` | Claude API 密钥 | 是\*\* |

629| `github_token` | 用于 API 访问的 GitHub 令牌 | 否 |

630| `trigger_phrase` | 自定义触发短语(默认:"@claude") | 否 |

631| `use_bedrock` | 使用 Amazon Bedrock 而不是 Claude API | 否 |

632| `use_vertex` | 使用 Google Vertex AI 而不是 Claude API | 否 |

633 

634\*提示是可选的 - 当对 issue/PR 评论省略时,Claude 响应触发短语\

635\*\*对于直接 Claude API 是必需的,对于 Bedrock/Vertex 不是必需的

636 

637#### 传递 CLI 参数

638 

639`claude_args` 参数接受任何 Claude Code CLI 参数:

640 

641```yaml theme={null}

642claude_args: "--max-turns 5 --model claude-sonnet-4-6 --mcp-config /path/to/config.json"

643```

644 

645常见参数:

646 

647* `--max-turns`:最大对话轮数(默认:10)

648* `--model`:要使用的模型(例如,`claude-sonnet-4-6`)

649* `--mcp-config`:MCP 配置的路径

650* `--allowedTools`:允许的工具的逗号分隔列表。`--allowed-tools` 别名也可以使用。

651* `--debug`:启用调试输出

652 

653### 替代集成方法

654 

655虽然 `/install-github-app` 命令是推荐的方法,但您也可以:

656 

657* **自定义 GitHub 应用**:对于需要品牌用户名或自定义身份验证流的组织。创建您自己的 GitHub 应用,具有所需的权限(contents、issues、pull requests),并使用 actions/create-github-app-token action 在您的工作流中生成令牌。

658* **手动 GitHub Actions**:直接工作流配置以获得最大灵活性

659* **MCP 配置**:Model Context Protocol 服务器的动态加载

660 

661有关身份验证、安全和高级配置的详细指南,请参阅 [Claude Code Action 文档](https://github.com/anthropics/claude-code-action/blob/main/docs)。

662 

663### 自定义 Claude 的行为

664 

665您可以通过两种方式配置 Claude 的行为:

666 

6671. **CLAUDE.md**:在您的仓库根目录的 `CLAUDE.md` 文件中定义编码标准、审查标准和项目特定规则。Claude 在创建 PR 和响应请求时将遵循这些指南。查看我们的 [Memory 文档](/zh-CN/memory)了解更多详情。

6682. **自定义提示**:在工作流文件中使用 `prompt` 参数提供工作流特定的说明。这允许您为不同的工作流或任务自定义 Claude 的行为。

669 

670Claude 在创建 PR 和响应请求时将遵循这些指南。

gitlab-ci-cd.md +466 −0 created

Details

1> ## Documentation Index

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

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

4 

5# Claude Code GitLab CI/CD

6 

7> 了解如何将 Claude Code 集成到您的 GitLab CI/CD 开发工作流中

8 

9<Info>

10 Claude Code for GitLab CI/CD 目前处于测试阶段。随着我们完善体验,功能和特性可能会发生变化。

11 

12 此集成由 GitLab 维护。如需支持,请参阅以下 [GitLab issue](https://gitlab.com/gitlab-org/gitlab/-/issues/573776)。

13</Info>

14 

15<Note>

16 此集成基于 [Claude Code CLI and Agent SDK](/zh-CN/agent-sdk/overview) 构建,可在您的 CI/CD 作业和自定义自动化工作流中以编程方式使用 Claude。

17</Note>

18 

19## 为什么在 GitLab 中使用 Claude Code?

20 

21* **即时 MR 创建**:描述您的需求,Claude 会提议一个完整的 MR,包含更改和说明

22* **自动化实现**:使用单个命令或提及将问题转化为可工作的代码

23* **项目感知**:Claude 遵循您的 `CLAUDE.md` 指南和现有代码模式

24* **简单设置**:向 `.gitlab-ci.yml` 添加一个作业和一个掩码 CI/CD 变量

25* **企业就绪**:选择 Claude API、Amazon Bedrock 或 Google Vertex AI 以满足数据驻留和采购需求

26* **默认安全**:在您的 GitLab runners 中运行,具有您的分支保护和批准

27 

28## 工作原理

29 

30Claude Code 使用 GitLab CI/CD 在隔离的作业中运行 AI 任务,并通过 MR 将结果提交回来:

31 

321. **事件驱动的编排**:GitLab 监听您选择的触发器(例如,在问题、MR 或审查线程中提及 `@claude` 的评论)。该作业从线程和存储库收集上下文,从该输入构建提示,并运行 Claude Code。

33 

342. **提供商抽象**:使用适合您环境的提供商:

35 * Claude API (SaaS)

36 * Amazon Bedrock(基于 IAM 的访问、跨区域选项)

37 * Google Vertex AI(GCP 原生、Workload Identity Federation)

38 

393. **沙箱执行**:每次交互都在具有严格网络和文件系统规则的容器中运行。Claude Code 强制执行工作区范围的权限以限制写入。每项更改都通过 MR 流动,以便审查者可以看到差异,批准仍然适用。

40 

41选择区域端点以降低延迟并满足数据主权要求,同时使用现有的云协议。

42 

43## Claude 可以做什么?

44 

45Claude Code 支持强大的 CI/CD 工作流,改变您处理代码的方式:

46 

47* 从问题描述或评论创建和更新 MR

48* 分析性能回归并提议优化

49* 直接在分支中实现功能,然后打开 MR

50* 修复由测试或评论识别的错误和回归

51* 响应后续评论以迭代所请求的更改

52 

53## 设置

54 

55### 快速设置

56 

57最快的入门方式是向您的 `.gitlab-ci.yml` 添加一个最小作业,并将您的 API 密钥设置为掩码变量。

58 

591. **添加掩码 CI/CD 变量**

60 * 转到 **Settings** → **CI/CD** → **Variables**

61 * 添加 `ANTHROPIC_API_KEY`(掩码,根据需要保护)

62 

632. **向 `.gitlab-ci.yml` 添加 Claude 作业**

64 

65```yaml theme={null}

66stages:

67 - ai

68 

69claude:

70 stage: ai

71 image: node:24-alpine3.21

72 # 调整规则以适应您想要触发作业的方式:

73 # - 手动运行

74 # - 合并请求事件

75 # - 当评论包含 '@claude' 时的 web/API 触发

76 rules:

77 - if: '$CI_PIPELINE_SOURCE == "web"'

78 - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'

79 variables:

80 GIT_STRATEGY: fetch

81 before_script:

82 - apk update

83 - apk add --no-cache git curl bash

84 - curl -fsSL https://claude.ai/install.sh | bash

85 script:

86 # 可选:如果您的设置提供了 GitLab MCP 服务器,请启动它

87 - /bin/gitlab-mcp-server || true

88 # 通过 web/API 触发器使用 AI_FLOW_* 变量调用时使用上下文有效负载

89 - echo "$AI_FLOW_INPUT for $AI_FLOW_CONTEXT on $AI_FLOW_EVENT"

90 - >

91 claude

92 -p "${AI_FLOW_INPUT:-'Review this MR and implement the requested changes'}"

93 --permission-mode acceptEdits

94 --allowedTools "Bash Read Edit Write mcp__gitlab"

95 --debug

96```

97 

98添加作业和您的 `ANTHROPIC_API_KEY` 变量后,通过从 **CI/CD** → **Pipelines** 手动运行作业进行测试,或从 MR 触发它,让 Claude 在分支中提议更新并在需要时打开 MR。

99 

100<Note>

101 要改为在 Amazon Bedrock 或 Google Vertex AI 上运行而不是 Claude API,请参阅下面的 [Using with Amazon Bedrock & Google Vertex AI](#using-with-amazon-bedrock--google-vertex-ai) 部分,了解身份验证和环境设置。

102</Note>

103 

104### 手动设置(建议用于生产)

105 

106如果您更喜欢更受控的设置或需要企业提供商:

107 

1081. **配置提供商访问**:

109 * **Claude API**:创建并将 `ANTHROPIC_API_KEY` 存储为掩码 CI/CD 变量

110 * **Amazon Bedrock**:**Configure GitLab** → **AWS OIDC** 并为 Bedrock 创建 IAM 角色

111 * **Google Vertex AI**:**Configure Workload Identity Federation for GitLab** → **GCP**

112 

1132. **为 GitLab API 操作添加项目凭证**:

114 * 默认使用 `CI_JOB_TOKEN`,或创建具有 `api` 范围的项目访问令牌

115 * 如果使用 PAT,则存储为 `GITLAB_ACCESS_TOKEN`(掩码)

116 

1173. **向 `.gitlab-ci.yml` 添加 Claude 作业**(请参阅下面的示例)

118 

1194. **(可选)启用提及驱动的触发器**:

120 * 为"Comments (notes)"添加项目 webhook 到您的事件监听器(如果您使用)

121 * 当评论包含 `@claude` 时,让监听器使用 `AI_FLOW_INPUT` 和 `AI_FLOW_CONTEXT` 等变量调用管道触发 API

122 

123## 示例用例

124 

125### 将问题转化为 MR

126 

127在问题评论中:

128 

129```text theme={null}

130@claude implement this feature based on the issue description

131```

132 

133Claude 分析问题和代码库,在分支中编写更改,并打开 MR 供审查。

134 

135### 获取实现帮助

136 

137在 MR 讨论中:

138 

139```text theme={null}

140@claude suggest a concrete approach to cache the results of this API call

141```

142 

143Claude 提议更改,添加具有适当缓存的代码,并更新 MR。

144 

145### 快速修复错误

146 

147在问题或 MR 评论中:

148 

149```text theme={null}

150@claude fix the TypeError in the user dashboard component

151```

152 

153Claude 定位错误,实现修复,并更新分支或打开新 MR。

154 

155## 使用 Amazon Bedrock 和 Google Vertex AI

156 

157对于企业环境,您可以在云基础设施上完全运行 Claude Code,具有相同的开发者体验。

158 

159<Tabs>

160 <Tab title="Amazon Bedrock">

161 ### 前置条件

162 

163 在使用 Amazon Bedrock 设置 Claude Code 之前,您需要:

164 

165 1. 具有对所需 Claude 模型的 Amazon Bedrock 访问权限的 AWS 账户

166 2. 在 AWS IAM 中配置为 OIDC 身份提供商的 GitLab

167 3. 具有 Bedrock 权限和信任策略的 IAM 角色,限制为您的 GitLab 项目/refs

168 4. 用于角色假设的 GitLab CI/CD 变量:

169 * `AWS_ROLE_TO_ASSUME`(角色 ARN)

170 * `AWS_REGION`(Bedrock 区域)

171 

172 ### 设置说明

173 

174 配置 AWS 以允许 GitLab CI 作业通过 OIDC 假设 IAM 角色(无静态密钥)。

175 

176 **必需的设置:**

177 

178 1. 启用 Amazon Bedrock 并请求访问您的目标 Claude 模型

179 2. 如果尚未存在,为 GitLab 创建 IAM OIDC 提供商

180 3. 创建由 GitLab OIDC 提供商信任的 IAM 角色,限制为您的项目和受保护的 refs

181 4. 为 Bedrock 调用 API 附加最小权限

182 

183 **需要存储在 CI/CD 变量中的必需值:**

184 

185 * `AWS_ROLE_TO_ASSUME`

186 * `AWS_REGION`

187 

188 在 Settings → CI/CD → Variables 中添加变量:

189 

190 ```yaml theme={null}

191 # 对于 Amazon Bedrock:

192 - AWS_ROLE_TO_ASSUME

193 - AWS_REGION

194 ```

195 

196 使用上面的 Amazon Bedrock 作业示例在运行时交换 GitLab 作业令牌以获取临时 AWS 凭证。

197 </Tab>

198 

199 <Tab title="Google Vertex AI">

200 ### 前置条件

201 

202 在使用 Google Vertex AI 设置 Claude Code 之前,您需要:

203 

204 1. 具有以下条件的 Google Cloud 项目:

205 * 启用了 Vertex AI API

206 * 配置了 Workload Identity Federation 以信任 GitLab OIDC

207 2. 仅具有所需 Vertex AI 角色的专用服务账户

208 3. 用于 WIF 的 GitLab CI/CD 变量:

209 * `GCP_WORKLOAD_IDENTITY_PROVIDER`(完整资源名称)

210 * `GCP_SERVICE_ACCOUNT`(服务账户电子邮件)

211 

212 ### 设置说明

213 

214 配置 Google Cloud 以允许 GitLab CI 作业通过 Workload Identity Federation 模拟服务账户。

215 

216 **必需的设置:**

217 

218 1. 启用 IAM Credentials API、STS API 和 Vertex AI API

219 2. 为 GitLab OIDC 创建 Workload Identity Pool 和提供商

220 3. 创建具有 Vertex AI 角色的专用服务账户

221 4. 授予 WIF 主体权限以模拟服务账户

222 

223 **需要存储在 CI/CD 变量中的必需值:**

224 

225 * `GCP_WORKLOAD_IDENTITY_PROVIDER`

226 * `GCP_SERVICE_ACCOUNT`

227 

228 在 Settings → CI/CD → Variables 中添加变量:

229 

230 ```yaml theme={null}

231 # 对于 Google Vertex AI:

232 - GCP_WORKLOAD_IDENTITY_PROVIDER

233 - GCP_SERVICE_ACCOUNT

234 - CLOUD_ML_REGION(例如,us-east5)

235 ```

236 

237 使用上面的 Google Vertex AI 作业示例在不存储密钥的情况下进行身份验证。

238 </Tab>

239</Tabs>

240 

241## 配置示例

242 

243以下是您可以适配到管道的现成代码片段。

244 

245### 基本 .gitlab-ci.yml(Claude API)

246 

247```yaml theme={null}

248stages:

249 - ai

250 

251claude:

252 stage: ai

253 image: node:24-alpine3.21

254 rules:

255 - if: '$CI_PIPELINE_SOURCE == "web"'

256 - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'

257 variables:

258 GIT_STRATEGY: fetch

259 before_script:

260 - apk update

261 - apk add --no-cache git curl bash

262 - curl -fsSL https://claude.ai/install.sh | bash

263 script:

264 - /bin/gitlab-mcp-server || true

265 - >

266 claude

267 -p "${AI_FLOW_INPUT:-'Summarize recent changes and suggest improvements'}"

268 --permission-mode acceptEdits

269 --allowedTools "Bash Read Edit Write mcp__gitlab"

270 --debug

271 # Claude Code 将使用 CI/CD 变量中的 ANTHROPIC_API_KEY

272```

273 

274### Amazon Bedrock 作业示例(OIDC)

275 

276**前置条件:**

277 

278* 启用了 Amazon Bedrock 并可访问您选择的 Claude 模型

279* 在 AWS 中配置了 GitLab OIDC,具有信任您的 GitLab 项目和 refs 的角色

280* 具有 Bedrock 权限的 IAM 角色(建议最小权限)

281 

282**必需的 CI/CD 变量:**

283 

284* `AWS_ROLE_TO_ASSUME`:用于 Bedrock 访问的 IAM 角色的 ARN

285* `AWS_REGION`:Bedrock 区域(例如,`us-west-2`)

286 

287```yaml theme={null}

288claude-bedrock:

289 stage: ai

290 image: node:24-alpine3.21

291 rules:

292 - if: '$CI_PIPELINE_SOURCE == "web"'

293 before_script:

294 - apk add --no-cache bash curl jq git python3 py3-pip

295 - pip install --no-cache-dir awscli

296 - curl -fsSL https://claude.ai/install.sh | bash

297 # 交换 GitLab OIDC 令牌以获取 AWS 凭证

298 - export AWS_WEB_IDENTITY_TOKEN_FILE="${CI_JOB_JWT_FILE:-/tmp/oidc_token}"

299 - if [ -n "${CI_JOB_JWT_V2}" ]; then printf "%s" "$CI_JOB_JWT_V2" > "$AWS_WEB_IDENTITY_TOKEN_FILE"; fi

300 - >

301 aws sts assume-role-with-web-identity

302 --role-arn "$AWS_ROLE_TO_ASSUME"

303 --role-session-name "gitlab-claude-$(date +%s)"

304 --web-identity-token "file://$AWS_WEB_IDENTITY_TOKEN_FILE"

305 --duration-seconds 3600 > /tmp/aws_creds.json

306 - export AWS_ACCESS_KEY_ID="$(jq -r .Credentials.AccessKeyId /tmp/aws_creds.json)"

307 - export AWS_SECRET_ACCESS_KEY="$(jq -r .Credentials.SecretAccessKey /tmp/aws_creds.json)"

308 - export AWS_SESSION_TOKEN="$(jq -r .Credentials.SessionToken /tmp/aws_creds.json)"

309 script:

310 - /bin/gitlab-mcp-server || true

311 - >

312 claude

313 -p "${AI_FLOW_INPUT:-'Implement the requested changes and open an MR'}"

314 --permission-mode acceptEdits

315 --allowedTools "Bash Read Edit Write mcp__gitlab"

316 --debug

317 variables:

318 AWS_REGION: "us-west-2"

319```

320 

321<Note>

322 Bedrock 的模型 ID 包括特定于区域的前缀(例如,`us.anthropic.claude-sonnet-4-6`)。如果您的工作流支持,通过您的作业配置或提示传递所需的模型。

323</Note>

324 

325### Google Vertex AI 作业示例(Workload Identity Federation)

326 

327**前置条件:**

328 

329* 在您的 GCP 项目中启用了 Vertex AI API

330* 配置了 Workload Identity Federation 以信任 GitLab OIDC

331* 具有 Vertex AI 权限的服务账户

332 

333**必需的 CI/CD 变量:**

334 

335* `GCP_WORKLOAD_IDENTITY_PROVIDER`:完整的提供商资源名称

336* `GCP_SERVICE_ACCOUNT`:服务账户电子邮件

337* `CLOUD_ML_REGION`:Vertex 区域(例如,`us-east5`)

338 

339```yaml theme={null}

340claude-vertex:

341 stage: ai

342 image: gcr.io/google.com/cloudsdktool/google-cloud-cli:slim

343 rules:

344 - if: '$CI_PIPELINE_SOURCE == "web"'

345 before_script:

346 - apt-get update && apt-get install -y git && apt-get clean

347 - curl -fsSL https://claude.ai/install.sh | bash

348 # 通过 WIF 向 Google Cloud 进行身份验证(无下载的密钥)

349 - >

350 gcloud auth login --cred-file=<(cat <<EOF

351 {

352 "type": "external_account",

353 "audience": "${GCP_WORKLOAD_IDENTITY_PROVIDER}",

354 "subject_token_type": "urn:ietf:params:oauth:token-type:jwt",

355 "service_account_impersonation_url": "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/${GCP_SERVICE_ACCOUNT}:generateAccessToken",

356 "token_url": "https://sts.googleapis.com/v1/token"

357 }

358 EOF

359 )

360 - gcloud config set project "$(gcloud projects list --format='value(projectId)' --filter="name:${CI_PROJECT_NAMESPACE}" | head -n1)" || true

361 script:

362 - /bin/gitlab-mcp-server || true

363 - >

364 CLOUD_ML_REGION="${CLOUD_ML_REGION:-us-east5}"

365 claude

366 -p "${AI_FLOW_INPUT:-'Review and update code as requested'}"

367 --permission-mode acceptEdits

368 --allowedTools "Bash Read Edit Write mcp__gitlab"

369 --debug

370 variables:

371 CLOUD_ML_REGION: "us-east5"

372```

373 

374<Note>

375 使用 Workload Identity Federation,您无需存储服务账户密钥。使用特定于存储库的信任条件和最小权限服务账户。

376</Note>

377 

378## 最佳实践

379 

380### CLAUDE.md 配置

381 

382在存储库根目录创建 `CLAUDE.md` 文件以定义编码标准、审查标准和项目特定规则。Claude 在运行期间读取此文件,并在提议更改时遵循您的约定。

383 

384### 安全考虑

385 

386**永远不要将 API 密钥或云凭证提交到您的存储库**。始终使用 GitLab CI/CD 变量:

387 

388* 将 `ANTHROPIC_API_KEY` 添加为掩码变量(如果需要,保护它)

389* 尽可能使用提供商特定的 OIDC(无长期密钥)

390* 限制作业权限和网络出口

391* 像审查任何其他贡献者一样审查 Claude 的 MR

392 

393### 优化性能

394 

395* 保持 `CLAUDE.md` 专注和简洁

396* 提供清晰的问题/MR 描述以减少迭代

397* 配置合理的作业超时以避免失控运行

398* 在可能的情况下在 runners 中缓存 npm 和包安装

399 

400### CI 成本

401 

402在 GitLab CI/CD 中使用 Claude Code 时,请注意相关成本:

403 

404* **GitLab Runner 时间**:

405 * Claude 在您的 GitLab runners 上运行并消耗计算分钟数

406 * 有关详细信息,请参阅您的 GitLab 计划的 runner 计费

407 

408* **API 成本**:

409 * 每次 Claude 交互根据提示和响应大小消耗令牌

410 * 令牌使用因任务复杂性和代码库大小而异

411 * 有关详细信息,请参阅 [Anthropic 定价](https://platform.claude.com/docs/zh-CN/about-claude/pricing)

412 

413* **成本优化提示**:

414 * 使用特定的 `@claude` 命令以减少不必要的轮次

415 * 设置适当的 `max_turns` 和作业超时值

416 * 限制并发以控制并行运行

417 

418## 安全和治理

419 

420* 每个作业都在具有受限网络访问的隔离容器中运行

421* Claude 的更改通过 MR 流动,以便审查者可以看到每个差异

422* 分支保护和批准规则适用于 AI 生成的代码

423* Claude Code 使用工作区范围的权限来限制写入

424* 成本保持在您的控制下,因为您带来自己的提供商凭证

425 

426## 故障排除

427 

428### Claude 不响应 @claude 命令

429 

430* 验证您的管道是否被触发(手动、MR 事件或通过注释事件监听器/webhook)

431* 确保 CI/CD 变量(`ANTHROPIC_API_KEY` 或云提供商设置)存在且未掩码

432* 检查评论是否包含 `@claude`(不是 `/claude`)以及您的提及触发器是否已配置

433 

434### 作业无法写入评论或打开 MR

435 

436* 确保 `CI_JOB_TOKEN` 对项目具有足够的权限,或使用具有 `api` 范围的项目访问令牌

437* 检查 `mcp__gitlab` 工具是否在 `--allowedTools` 中启用

438* 确认作业在 MR 的上下文中运行或通过 `AI_FLOW_*` 变量有足够的上下文

439 

440### 身份验证错误

441 

442* **对于 Claude API**:确认 `ANTHROPIC_API_KEY` 有效且未过期

443* **对于 Bedrock/Vertex**:验证 OIDC/WIF 配置、角色模拟和密钥名称;确认区域和模型可用性

444 

445## 高级配置

446 

447### 常见参数和变量

448 

449Claude Code 支持这些常用输入:

450 

451* `prompt` / `prompt_file`:内联提供说明(`-p`)或通过文件

452* `max_turns`:限制来回迭代的次数

453* `timeout_minutes`:限制总执行时间

454* `ANTHROPIC_API_KEY`:Claude API 所需(不用于 Bedrock/Vertex)

455* 提供商特定的环境:`AWS_REGION`、Vertex 的项目/区域变量

456 

457<Note>

458 确切的标志和参数可能因 `@anthropic-ai/claude-code` 的版本而异。在您的作业中运行 `claude --help` 以查看支持的选项。

459</Note>

460 

461### 自定义 Claude 的行为

462 

463您可以通过两种主要方式指导 Claude:

464 

4651. **CLAUDE.md**:定义编码标准、安全要求和项目约定。Claude 在运行期间读取此文件并遵循您的规则。

4662. **自定义提示**:通过作业中的 `prompt`/`prompt_file` 传递特定于任务的说明。为不同的作业使用不同的提示(例如,审查、实现、重构)。

glossary.md +307 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 术语表

6 

7> Claude Code 术语定义。了解 agentic loop、compaction、CLAUDE.md、hooks、subagents、MCP 和其他核心概念的含义。

8 

9本术语表定义了 Claude Code 术语。每个条目都链接到深入讨论该概念的页面。对于模型级概念(如 tokens、temperature 和 RAG),请参阅[平台术语表](https://platform.claude.com/docs/zh-CN/about-claude/glossary)。

10 

11## A

12 

13### Agent teams

14 

15由团队负责人协调的多个独立 Claude Code 会话,具有共享任务列表和点对点消息传递。与在单个会话中运行且仅向父级报告的 [subagents](#subagent) 不同,团队成员各自拥有自己的上下文窗口,您可以直接与任何一个交互。Agent teams 是实验性的,必须通过设置 `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1` 来启用。

16 

17了解更多:[运行 agent teams](/zh-CN/agent-teams)

18 

19### Agentic coding

20 

21一种工作流程,其中 AI 可以自主读取文件、运行命令和进行更改,而您可以观看、重定向或离开,与只能用文本响应的基于聊天的助手相反,您必须自己应用这些响应。Claude Code 是 agentic 的,因为它拥有允许它采取行动而不仅仅是建议的[工具](#tool)。

22 

23了解更多:[Claude Code 如何工作](/zh-CN/how-claude-code-works)

24 

25### Agentic harness

26 

27将语言模型转变为能力强大的编码代理的工具、上下文管理和执行环境。Claude Code 是 harness;Claude 是其中的模型。Harness 提供文件访问、shell 执行、权限控制、内存加载以及链接操作的循环。

28 

29了解更多:[Claude Code 如何工作](/zh-CN/how-claude-code-works)

30 

31### Agentic loop

32 

33Claude 为每个任务所经历的循环:收集上下文、采取行动、验证结果并重复直到完成。每个工具使用都会返回信息,为下一步提供信息。您可以随时中断循环进行重定向。大多数扩展点,包括 [hooks](#hook)、[skills](#skill) 和 [MCP](#mcp-model-context-protocol),都插入到此循环的特定阶段。

34 

35了解更多:[Claude Code 如何工作](/zh-CN/how-claude-code-works#the-agentic-loop)

36 

37### Auto memory

38 

39Claude 根据您的更正和偏好为自己编写的笔记,按 git 存储库存储在 `~/.claude/projects/` 下。同一存储库的所有 worktrees 共享一个 auto memory 目录。`MEMORY.md` 索引的前 200 行或 25 KB 在每个会话开始时加载。Auto memory 是 Claude 编写的对应物,与您编写的 [CLAUDE.md](#claude-md) 相对。

40 

41了解更多:[Auto memory](/zh-CN/memory#auto-memory)

42 

43### Auto mode

44 

45一种[权限模式](#permission-mode),其中单独的分类器模型在后台审查每个操作,而不是向您显示批准提示。分类器阻止范围升级、不受信任的基础设施和[提示注入](#prompt-injection)。它永远看不到工具结果,因此注入的指令无法影响其决策。Auto mode 是在 Max、Team、Enterprise 和 API 计划上提供的研究预览。

46 

47了解更多:[使用 auto mode 消除提示](/zh-CN/permission-modes#eliminate-prompts-with-auto-mode)

48 

49## B

50 

51### Bare mode

52 

53一个启动标志 `--bare`,跳过 hooks、skills、plugins、MCP servers、auto memory 和 CLAUDE.md 的自动发现。只有您显式传递的标志才会生效。建议用于 CI 和脚本调用,其中您需要在不同机器上的相同行为,无论本地配置如何。

54 

55了解更多:[使用 bare mode 更快启动](/zh-CN/headless#start-faster-with-bare-mode)

56 

57### Bundled skills

58 

59包含在 Claude Code 中的基于提示的 playbooks,例如 `/batch`、`/simplify`、`/debug` 和 `/loop`。与执行固定逻辑的内置命令不同,bundled skills 为 Claude 提供详细的提示并让它编排工作,因此它们可以生成代理、读取文件并适应您的代码库。

60 

61了解更多:[Bundled skills](/zh-CN/skills#bundled-skills)

62 

63## C

64 

65### Channel

66 

67一个 [MCP server](#mcp-model-context-protocol),将事件推送到您正在运行的会话中,以便 Claude 可以对您离开终端时发生的事情做出反应。Channels 可以是双向的:Claude 读取入站事件并通过同一 channel 回复。Telegram、Discord 和 iMessage 包含在研究预览中。

68 

69了解更多:[Channels](/zh-CN/channels)

70 

71### Checkpoint

72 

73在 Claude 进行每次编辑之前捕获的代码自动快照。按两次 `Esc` 或运行 `/rewind` 将代码、对话或两者恢复到较早的点。Checkpoints 是会话本地的,与 git 分开,不跟踪通过 Bash 工具进行的更改。

74 

75了解更多:[Checkpointing](/zh-CN/checkpointing)

76 

77### `.claude` directory

78 

79Claude Code 读取项目范围配置的目录:settings、hooks、skills、subagents、rules 和 auto memory。项目在其根目录有 `.claude/`;您的用户级默认值在 `~/.claude/`。

80 

81了解更多:[`.claude` directory](/zh-CN/claude-directory)

82 

83### CLAUDE.md

84 

85一个 markdown 文件,包含您为 Claude 编写的持久指令,在每个会话开始时作为系统提示后的用户消息加载。在此处放置项目约定、架构笔记和"始终执行 X"规则。CLAUDE.md 在 [compaction](#compaction) 期间保留,之后从磁盘重新读取。

86 

87您可以在项目范围内的 `./CLAUDE.md` 或 `./.claude/CLAUDE.md`、用户范围内的 `~/.claude/CLAUDE.md` 或作为组织的[托管策略](#managed-settings)放置 CLAUDE.md。更具体的位置优先。

88 

89了解更多:[CLAUDE.md files](/zh-CN/memory#claude-md-files)

90 

91### Command

92 

93一个可重用的指令,您可以通过在提示中键入 `/name` 来调用。内置命令(如 `/clear`、`/model` 和 `/compact`)控制会话。您可以在 `.claude/commands/` 中将自己的命令定义为文件,或从 [plugin](#plugin) 安装它们。[Skills](#skill) 是打包多步骤命令的推荐方式。

94 

95了解更多:[Commands](/zh-CN/commands) · [Skills](/zh-CN/skills)

96 

97### Compaction

98 

99当 [context window](#context-window) 接近其限制时,自动总结您的对话。首先清除较旧的工具输出,然后总结对话。项目根 CLAUDE.md 和 auto memory 在 compaction 期间保留并从磁盘重新加载;仅在对话中给出的指令可能会丢失。运行 `/compact` 手动触发,可选择使用焦点,如 `/compact focus on the API changes`。

100 

101了解更多:[什么在 compaction 中保留](/zh-CN/context-window#what-survives-compaction) · [当上下文填满时](/zh-CN/how-claude-code-works#when-context-fills-up)

102 

103### Context window

104 

105会话的工作内存,保存对话历史、文件内容、命令输出、CLAUDE.md、auto memory、加载的 skills 和系统指令。当您工作时,上下文会填满直到 [compaction](#compaction) 总结它。运行 `/context` 查看什么在使用空间。对于底层模型概念,请参阅[平台术语表](https://platform.claude.com/docs/zh-CN/about-claude/glossary#context-window)。

106 

107了解更多:[探索 context window](/zh-CN/context-window)

108 

109## D

110 

111### Dispatch

112 

113一个电话启动的任务路由器,当您从 Claude 移动应用发送编码任务时,在 Desktop 应用中生成 Claude Code 会话。您的提示自动路由到正确的工具。在 Pro 和 Max 计划上可用。

114 

115了解更多:[来自 Dispatch 的会话](/zh-CN/desktop#sessions-from-dispatch)

116 

117## E

118 

119### Effort level

120 

121一个设置,控制 Claude 在每个回合上使用多少自适应推理思考预算。更高的努力意味着更多的思考 tokens 和更深入的推理;更低的努力更快且更便宜。Effort 在 Opus 4.7、Opus 4.6 和 Sonnet 4.6 上受支持。

122 

123了解更多:[调整 effort level](/zh-CN/model-config#adjust-effort-level)

124 

125### Extended thinking

126 

127模型在响应前执行的可见逐步推理。您可以使用 `MAX_THINKING_TOKENS` 限制思考 tokens 或调整 [effort level](#effort-level)。思考在终端中以灰色斜体文本显示。

128 

129了解更多:[使用 extended thinking](/zh-CN/common-workflows#use-extended-thinking-thinking-mode)

130 

131## H

132 

133### Hook

134 

135一个用户定义的处理程序,在 Claude Code 生命周期中的特定点自动执行,例如在工具运行之前、文件编辑之后或会话开始时。处理程序可以是 shell 命令、HTTP 端点、MCP 工具、LLM 提示或 subagent。Hooks 是确定性的:它们在固定的生命周期点触发,而不是由模型自行决定。

136 

137Hook 配置有三个级别:

138 

139* **Hook event**:生命周期点

140* **Matcher**:过滤哪些事件触发它

141* **Hook handler**:运行什么

142 

143了解更多:[开始使用 hooks](/zh-CN/hooks-guide) · [Hooks 参考](/zh-CN/hooks)

144 

145## M

146 

147### Managed settings

148 

149由 IT 或 DevOps 在组织范围内强制执行的设置文件,放置在 `~/.claude` 之外的操作系统级路径。用户无法覆盖或排除托管设置。使用此功能可实现安全策略、合规要求或跨一个群体的标准化工具。

150 

151了解更多:[服务器管理的设置](/zh-CN/server-managed-settings)

152 

153### MCP (Model Context Protocol)

154 

155一个开放标准,用于将 AI 工具连接到外部数据源和服务。MCP servers 为 Claude 提供 Slack、Jira、数据库、浏览器和数百个其他集成的新工具。您可以通过 `/mcp` 连接服务器或将它们添加到 `.mcp.json`。对于协议本身,请参阅[平台术语表](https://platform.claude.com/docs/zh-CN/about-claude/glossary#mcp-model-context-protocol)。

156 

157了解更多:[Model Context Protocol](/zh-CN/mcp)

158 

159### MCP Tool Search

160 

161一个上下文节省机制,延迟 MCP 工具 schemas 直到需要。只有工具名称在启动时加载;Claude 在决定使用特定工具时按需获取完整 schema。这使空闲 MCP servers 不会消耗太多上下文。

162 

163了解更多:[使用 MCP Tool Search 扩展](/zh-CN/mcp#scale-with-mcp-tool-search)

164 

165## N

166 

167### Non-interactive mode

168 

169一种执行单个提示并退出而不进行对话会话的模式,使用 `-p` 或 `--print` 调用。用于 CI、脚本和管道。[Agent SDK](/zh-CN/agent-sdk/overview) 是 Python 和 TypeScript 等效项。以前称为 headless mode。

170 

171了解更多:[以编程方式运行 Claude Code](/zh-CN/headless)

172 

173## O

174 

175### Output style

176 

177一个配置,修改 Claude 的系统提示以改变响应行为、语气或格式。Output styles 关闭默认系统提示的软件工程特定部分,与 [CLAUDE.md](#claude-md) 不同,后者作为系统提示后的用户消息传递。内置样式包括 Default、Explanatory 和 Learning。

178 

179了解更多:[Output styles](/zh-CN/output-styles)

180 

181## P

182 

183### Permission mode

184 

185会话的基线批准行为。在 CLI 中使用 `Shift+Tab` 循环或在 VS Code、Desktop 和 claude.ai 中使用模式选择器。可用模式为 `default`、`acceptEdits`、`plan`、`auto`、`dontAsk` 和 `bypassPermissions`。

186 

187了解更多:[选择权限模式](/zh-CN/permission-modes)

188 

189### Permission rule

190 

191一个设置条目,根据工具名称和参数模式允许、询问或拒绝工具调用。规则按 deny→ask→allow 顺序评估,首先匹配获胜。Permission rules 是分层在更广泛的 [permission mode](#permission-mode) 之上的细粒度控制。

192 

193了解更多:[配置权限](/zh-CN/permissions)

194 

195### Plan mode

196 

197一种 [permission mode](#permission-mode),其中 Claude 研究并提议更改而不编辑您的源文件。它可以读取、搜索和运行探索命令,然后在触及任何内容之前提出批准计划。使用 `/plan` 或按 `Shift+Tab` 进入 plan mode。

198 

199了解更多:[使用 plan mode 分析后再编辑](/zh-CN/permission-modes#analyze-before-you-edit-with-plan-mode)

200 

201### Plugin

202 

203一个 skills、hooks、subagents 和 MCP servers 的包,打包为单个可安装单元。Plugin skills 命名为 `plugin-name:skill-name`,以便多个 plugins 共存。通过[市场](/zh-CN/plugin-marketplaces)跨团队分发 plugins。

204 

205了解更多:[Plugins](/zh-CN/plugins)

206 

207### Project trust

208 

209一个一次性对话,在 Claude Code 加载其配置之前接受目录。Trust 控制市场 plugins 的自动安装和项目定义的 hooks 的执行。信任目录意味着其 `.claude/settings.json`、`.mcp.json` 和其他配置文件生效。

210 

211了解更多:[`.claude` directory](/zh-CN/claude-directory)

212 

213### Prompt injection

214 

215嵌入在文件、网页或工具结果中的恶意指令,试图将 Claude 重定向到您从未要求的操作。Claude Code 的防御包括权限系统、命令黑名单和信任验证。[Auto mode](#auto-mode) 添加了一个服务器端探针,扫描工具结果中的可疑内容,以及一个永远看不到工具结果的分类器,因此注入的文本无法影响其批准决策。

216 

217了解更多:[防止提示注入](/zh-CN/security#protect-against-prompt-injection)

218 

219## R

220 

221### Remote Control

222 

223一种通过 claude.ai 从您的手机或浏览器继续本地 Claude Code 会话的方式。您的代码保留在您的机器上;只有 UI 是远程的。与在 web 上运行的 Claude Code 不同,后者在云沙箱中运行。

224 

225了解更多:[Remote Control](/zh-CN/remote-control)

226 

227### Rules

228 

229`.claude/rules/` 中的模块化指令文件,与 CLAUDE.md 一起加载。规则可以使用 YAML `paths:` frontmatter 进行路径范围限定,因此它仅在 Claude 读取匹配文件时加载,保持上下文精简直到相关。

230 

231了解更多:[使用 `.claude/rules/` 组织规则](/zh-CN/memory#organize-rules-with-claude/rules/)

232 

233## S

234 

235### Sandboxing

236 

237Bash 工具的操作系统级文件系统和网络隔离。命令在您预先定义的边界内运行,因此 Claude 可以在其中自由工作,无需每个命令的批准提示。Sandboxing 是与 [permission rules](#permission-rule) 分开的一层。

238 

239了解更多:[Sandboxing](/zh-CN/sandboxing)

240 

241### Session

242 

243与您当前目录相关的对话,具有自己独立的 [context window](#context-window)。会话可以使用 `claude -c` 恢复,使用 `--fork-session` 分叉以在新会话 ID 下保留历史,或在终端中并行运行。运行 `/clear` 启动新会话;前一个会话保持存储并可通过 `/resume` 获得。每个会话的记录存储在 `~/.claude/projects/` 下。

244 

245了解更多:[使用会话](/zh-CN/how-claude-code-works#work-with-sessions)

246 

247### Settings layers

248 

249Claude Code 读取配置的层次结构,按优先级顺序从最高到最低:[托管策略](#managed-settings)、命令行参数、`.claude/settings.local.json` 处的本地设置、`.claude/settings.json` 处的项目设置,然后是 `~/.claude/settings.json` 处的用户设置。数组跨层合并;更高层的标量覆盖较低的。

250 

251了解更多:[Settings files](/zh-CN/settings#settings-files)

252 

253### Skill

254 

255一个 `SKILL.md` 文件,包含 Claude 添加到其工具包中的指令、知识或工作流。Claude 在相关时自动加载 skill,或您可以使用 `/skill-name` 直接调用它。Skills 遵循 Agent Skills 开放标准;Claude Code 使用调用控制和 subagent 执行扩展它。

256 

257Skills 是自定义命令的推荐后继。`.claude/commands/deploy.md` 处的文件和 `.claude/skills/deploy/SKILL.md` 处的文件都创建 `/deploy` 并以相同方式工作;现有命令文件继续工作。

258 

259了解更多:[使用 skills 扩展 Claude](/zh-CN/skills)

260 

261### Subagent

262 

263一个专门的 AI 助手,在其自己的上下文窗口中运行,具有自定义系统提示、特定工具访问和独立权限。它处理委派任务并向主对话返回摘要。使用 subagents 将大型探索保留在主上下文之外或运行并行研究。与 [agent teams](#agent-teams) 不同,其中每个代理都是您可以直接交谈的完整独立会话。

264 

265内置 subagents 包括 Explore、Plan 和通用目的。

266 

267了解更多:[创建自定义 subagents](/zh-CN/sub-agents)

268 

269### Surface

270 

271您访问 Claude Code 的任何地方:CLI、VS Code、JetBrains、Desktop 或 claude.ai。所有 surfaces 共享相同的引擎,因此您的 CLAUDE.md、settings 和 skills 在所有 surfaces 上以相同方式工作。Slack 和 Chrome 扩展是连接到 surface 的集成,而不是 surfaces 本身。

272 

273了解更多:[平台和集成](/zh-CN/platforms)

274 

275## T

276 

277### Teleport

278 

279一个命令 `/teleport`,将云 Claude Code 会话拉入您的本地终端。Claude 获取分支、加载对话历史并从 web 会话的最后状态恢复。反向方向是 `--remote`,它将本地任务发送到 web 上运行。

280 

281了解更多:[从 web 到终端](/zh-CN/claude-code-on-the-web#from-web-to-terminal)

282 

283### Tool

284 

285Claude 可以采取的操作:读取文件、编辑代码、运行 shell 命令、搜索 web、生成 subagent。Tools 是使 Claude Code agentic 的原因。没有它们,Claude 只能用文本响应。每个工具使用都会返回一个结果,为 [agentic loop](#agentic-loop) 中 Claude 的下一个决策提供信息。

286 

287了解更多:[Claude 可用的工具](/zh-CN/tools-reference)

288 

289## W

290 

291### Worktree isolation

292 

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

294 

295了解更多:[使用 git worktrees 运行并行会话](/zh-CN/common-workflows#run-parallel-claude-code-sessions-with-git-worktrees)

296 

297***

298 

299## 已弃用和重命名的术语

300 

301这些术语出现在较旧的文档、博客文章和社区内容中。搜索此网站时使用当前名称。

302 

303| 旧术语 | 现在称为 | 注释 |

304| --------------- | --------------------------------------------- | -------------------------- |

305| Headless mode | [Non-interactive mode](#non-interactive-mode) | 相同的 `-p` 标志,相同的行为 |

306| Custom commands | [Skills](#skill) | `.claude/commands/` 文件仍然有效 |

307| Slash commands | Commands | "Slash"从产品副本中删除 |

google-vertex-ai.md +387 −0 created

Details

1> ## Documentation Index

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

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

4 

5# Google Vertex AI 上的 Claude Code

6 

7> 了解如何通过 Google Vertex AI 配置 Claude Code,包括设置、IAM 配置和故障排除。

8 

9export const ContactSalesCard = ({surface}) => {

10 const utm = content => `utm_source=claude_code&utm_medium=docs&utm_content=${surface}_${content}`;

11 const iconArrowRight = (size = 13) => <svg width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.5" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true">

12 <line x1="5" y1="12" x2="19" y2="12" />

13 <polyline points="12 5 19 12 12 19" />

14 </svg>;

15 const STYLES = `

16.cc-cs {

17 --cs-slate: #141413;

18 --cs-clay: #d97757;

19 --cs-clay-deep: #c6613f;

20 --cs-gray-000: #ffffff;

21 --cs-gray-700: #3d3d3a;

22 --cs-border-default: rgba(31, 30, 29, 0.15);

23 font-family: inherit;

24}

25.dark .cc-cs {

26 --cs-slate: #f0eee6;

27 --cs-gray-000: #262624;

28 --cs-gray-700: #bfbdb4;

29 --cs-border-default: rgba(240, 238, 230, 0.14);

30}

31.cc-cs-card {

32 display: flex; align-items: center; justify-content: space-between;

33 gap: 16px; padding: 14px 16px; margin: 0;

34 background: var(--cs-gray-000); border: 0.5px solid var(--cs-border-default);

35 border-radius: 8px; flex-wrap: wrap;

36}

37.cc-cs-text { font-size: 13px; color: var(--cs-gray-700); line-height: 1.5; flex: 1; min-width: 240px; }

38.cc-cs-text strong { font-weight: 550; color: var(--cs-slate); }

39.cc-cs-actions { display: flex; align-items: center; gap: 8px; flex-shrink: 0; }

40.cc-cs-btn-clay {

41 display: inline-flex; align-items: center; gap: 8px;

42 background: var(--cs-clay-deep); color: #fff; border: none;

43 border-radius: 8px; padding: 8px 14px;

44 font-size: 13px; font-weight: 500;

45 transition: background-color 0.15s; white-space: nowrap;

46}

47.cc-cs-btn-clay:hover { background: var(--cs-clay); }

48.cc-cs-btn-ghost {

49 display: inline-flex; align-items: center; gap: 8px;

50 background: transparent; color: var(--cs-gray-700);

51 border: 0.5px solid var(--cs-border-default);

52 border-radius: 8px; padding: 8px 14px;

53 font-size: 13px; font-weight: 500;

54}

55.cc-cs-btn-ghost:hover { background: rgba(0, 0, 0, 0.04); }

56.dark .cc-cs-btn-ghost:hover { background: rgba(255, 255, 255, 0.04); }

57@media (max-width: 720px) {

58 .cc-cs-actions { width: 100%; }

59}

60`;

61 return <div className="cc-cs not-prose">

62 <style>{STYLES}</style>

63 <div className="cc-cs-card">

64 <div className="cc-cs-text">

65 <strong>Deploying Claude Code across your organization?</strong> Talk to sales about enterprise plans, SSO, and centralized billing.

66 </div>

67 <div className="cc-cs-actions">

68 <a href={`https://claude.com/pricing?${utm('view_plans')}#plans-business`} className="cc-cs-btn-ghost">

69 View plans

70 </a>

71 <a href={`https://claude.com/contact-sales?${utm('contact_sales')}`} className="cc-cs-btn-clay">

72 Contact sales {iconArrowRight()}

73 </a>

74 </div>

75 </div>

76 </div>;

77};

78 

79export const Experiment = ({flag, treatment, children}) => {

80 const VID_KEY = 'exp_vid';

81 const CONSENT_COUNTRIES = new Set(['AT', 'BE', 'BG', 'HR', 'CY', 'CZ', 'DK', 'EE', 'FI', 'FR', 'DE', 'GR', 'HU', 'IE', 'IT', 'LV', 'LT', 'LU', 'MT', 'NL', 'PL', 'PT', 'RO', 'SK', 'SI', 'ES', 'SE', 'RE', 'GP', 'MQ', 'GF', 'YT', 'BL', 'MF', 'PM', 'WF', 'PF', 'NC', 'AW', 'CW', 'SX', 'FO', 'GL', 'AX', 'GB', 'UK', 'AI', 'BM', 'IO', 'VG', 'KY', 'FK', 'GI', 'MS', 'PN', 'SH', 'TC', 'GG', 'JE', 'IM', 'CA', 'BR', 'IN']);

82 const fnv1a = s => {

83 let h = 0x811c9dc5;

84 for (let i = 0; i < s.length; i++) {

85 h ^= s.charCodeAt(i);

86 h += (h << 1) + (h << 4) + (h << 7) + (h << 8) + (h << 24);

87 }

88 return h >>> 0;

89 };

90 const bucket = (seed, vid) => fnv1a(fnv1a(seed + vid) + '') % 10000 < 5000 ? 'control' : 'treatment';

91 const [decision] = useState(() => {

92 const params = new URLSearchParams(location.search);

93 const preBucketed = document.documentElement.dataset['gb_' + flag.replace(/-/g, '_')];

94 const force = params.get('gb-force');

95 if (force) {

96 for (const p of force.split(',')) {

97 const [k, v] = p.split(':');

98 if (k === flag) return {

99 variant: v || 'treatment',

100 track: false

101 };

102 }

103 }

104 if (navigator.globalPrivacyControl) {

105 return {

106 variant: 'control',

107 track: false

108 };

109 }

110 const prefsMatch = document.cookie.match(/(?:^|; )anthropic-consent-preferences=([^;]+)/);

111 if (prefsMatch) {

112 try {

113 if (JSON.parse(decodeURIComponent(prefsMatch[1])).analytics !== true) {

114 return {

115 variant: 'control',

116 track: false

117 };

118 }

119 } catch {

120 return {

121 variant: 'control',

122 track: false

123 };

124 }

125 } else {

126 const country = params.get('country')?.toUpperCase() || (document.cookie.match(/(?:^|; )cf_geo=([A-Z]{2})/) || [])[1];

127 if (!country || CONSENT_COUNTRIES.has(country)) {

128 return {

129 variant: 'control',

130 track: false

131 };

132 }

133 }

134 let vid;

135 try {

136 const ajsMatch = document.cookie.match(/(?:^|; )ajs_anonymous_id=([^;]+)/);

137 if (ajsMatch) {

138 vid = decodeURIComponent(ajsMatch[1]).replace(/^"|"$/g, '');

139 } else {

140 vid = localStorage.getItem(VID_KEY);

141 if (!vid) {

142 vid = crypto.randomUUID();

143 }

144 document.cookie = `ajs_anonymous_id=${vid}; domain=.claude.com; path=/; Secure; SameSite=Lax; max-age=31536000`;

145 }

146 try {

147 localStorage.setItem(VID_KEY, vid);

148 } catch {}

149 } catch {

150 return {

151 variant: 'control',

152 track: false

153 };

154 }

155 const variant = preBucketed === '1' ? 'treatment' : preBucketed === '0' ? 'control' : bucket(flag, vid);

156 return {

157 variant,

158 track: true,

159 vid

160 };

161 });

162 useEffect(() => {

163 if (!decision.track) return;

164 fetch('https://api.anthropic.com/api/event_logging/v2/batch', {

165 method: 'POST',

166 headers: {

167 'Content-Type': 'application/json',

168 'x-service-name': 'claude_code_docs'

169 },

170 body: JSON.stringify({

171 events: [{

172 event_type: 'GrowthbookExperimentEvent',

173 event_data: {

174 device_id: decision.vid,

175 anonymous_id: decision.vid,

176 timestamp: new Date().toISOString(),

177 experiment_id: flag,

178 variation_id: decision.variant === 'treatment' ? 1 : 0,

179 environment: 'production'

180 }

181 }]

182 }),

183 keepalive: true

184 }).catch(() => {});

185 }, []);

186 return decision.variant === 'treatment' ? treatment : children;

187};

188 

189<Experiment flag="docs-contact-sales-cta" treatment={<ContactSalesCard surface="vertex" />} />

190 

191## 前置条件

192 

193在使用 Vertex AI 配置 Claude Code 之前,请确保您拥有:

194 

195* 启用了计费的 Google Cloud Platform (GCP) 账户

196* 启用了 Vertex AI API 的 GCP 项目

197* 对所需 Claude 模型的访问权限(例如,Claude Sonnet 4.6)

198* 已安装并配置的 Google Cloud SDK (`gcloud`)

199* 在所需 GCP 区域中分配的配额

200 

201要使用您自己的 Vertex AI 凭证登录,请按照下面的[使用 Vertex AI 登录](#sign-in-with-vertex-ai)进行操作。要在团队中部署 Claude Code,请使用[手动设置](#set-up-manually)步骤并在推出前[固定您的模型版本](#5-pin-model-versions)。

202 

203## 使用 Vertex AI 登录

204 

205如果您拥有 Google Cloud 凭证并想开始通过 Vertex AI 使用 Claude Code,登录向导会引导您完成整个过程。您需要在每个项目中完成一次 GCP 端的前置条件;向导会处理 Claude Code 端的事务。

206 

207<Note>

208 Vertex AI 设置向导需要 Claude Code v2.1.98 或更高版本。运行 `claude --version` 来检查。

209</Note>

210 

211<Steps>

212 <Step title="在您的 GCP 项目中启用 Claude 模型">

213 为您的项目[启用 Vertex AI API](#1-enable-vertex-ai-api),然后在 [Vertex AI Model Garden](https://console.cloud.google.com/vertex-ai/model-garden) 中请求访问您想要的 Claude 模型。有关您的账户需要的权限,请参阅 [IAM 配置](#iam-configuration)。

214 </Step>

215 

216 <Step title="启动 Claude Code 并选择 Vertex AI">

217 运行 `claude`。在登录提示处,选择 **3rd-party platform**,然后选择 **Google Vertex AI**。

218 </Step>

219 

220 <Step title="按照向导提示进行操作">

221 选择您如何向 Google Cloud 进行身份验证:来自 `gcloud` 的应用默认凭证、服务账户密钥文件或已在您的环境中的凭证。向导会检测您的项目和区域,验证您的项目可以调用哪些 Claude 模型,并让您固定它们。它将结果保存到您的[用户设置文件](/zh-CN/settings)的 `env` 块中,因此您无需自己导出环境变量。

222 </Step>

223</Steps>

224 

225登录后,您可以随时运行 `/setup-vertex` 来重新打开向导并更改您的凭证、项目、区域或模型固定。

226 

227## 区域配置

228 

229Claude Code 支持 Vertex AI [全局](https://cloud.google.com/blog/products/ai-machine-learning/global-endpoint-for-claude-models-generally-available-on-vertex-ai)、多区域和区域端点。将 `CLOUD_ML_REGION` 设置为 `global`、多区域位置(如 `eu` 或 `us`)或特定区域(如 `us-east5`)。Claude Code 为每种形式选择正确的 Vertex AI 主机名,包括多区域位置的 `aiplatform.eu.rep.googleapis.com` 和 `aiplatform.us.rep.googleapis.com` 主机。

230 

231<Note>

232 Vertex AI 可能不支持 Claude Code 默认模型在每个端点类型上。模型可用性在[特定区域](https://cloud.google.com/vertex-ai/generative-ai/docs/learn/locations#genai-partner-models)、多区域位置和[全局端点](https://cloud.google.com/vertex-ai/generative-ai/docs/partner-models/use-partner-models#supported_models)之间有所不同。您可能需要切换到支持的位置或指定支持的模型。

233</Note>

234 

235## 手动设置

236 

237要通过环境变量而不是向导配置 Vertex AI,例如在 CI 或脚本化企业推出中,请按照下面的步骤进行。

238 

239### 1. 启用 Vertex AI API

240 

241在您的 GCP 项目中启用 Vertex AI API:

242 

243```bash theme={null}

244# 设置您的项目 ID

245gcloud config set project YOUR-PROJECT-ID

246 

247# 启用 Vertex AI API

248gcloud services enable aiplatform.googleapis.com

249```

250 

251### 2. 请求模型访问权限

252 

253请求访问 Vertex AI 中的 Claude 模型:

254 

2551. 导航到 [Vertex AI Model Garden](https://console.cloud.google.com/vertex-ai/model-garden)

2562. 搜索"Claude"模型

2573. 请求访问所需的 Claude 模型(例如,Claude Sonnet 4.6)

2584. 等待批准(可能需要 24-48 小时)

259 

260### 3. 配置 GCP 凭证

261 

262Claude Code 使用标准的 Google Cloud 身份验证。

263 

264有关更多信息,请参阅 [Google Cloud 身份验证文档](https://cloud.google.com/docs/authentication)。

265 

266Claude Code v2.1.121 或更高版本通过相同的应用默认凭证链支持[基于 X.509 证书的工作负载身份联合](https://cloud.google.com/iam/docs/workload-identity-federation-with-x509-certificates)。将 `GOOGLE_APPLICATION_CREDENTIALS` 设置为您的凭证配置文件的路径。

267 

268<Note>

269 进行身份验证时,Claude Code 将自动使用 `ANTHROPIC_VERTEX_PROJECT_ID` 环境变量中的项目 ID。要覆盖此设置,请设置以下环境变量之一:`GCLOUD_PROJECT`、`GOOGLE_CLOUD_PROJECT` 或 `GOOGLE_APPLICATION_CREDENTIALS`。

270</Note>

271 

272### 4. 配置 Claude Code

273 

274设置以下环境变量:

275 

276```bash theme={null}

277# 启用 Vertex AI 集成

278export CLAUDE_CODE_USE_VERTEX=1

279export CLOUD_ML_REGION=global

280export ANTHROPIC_VERTEX_PROJECT_ID=YOUR-PROJECT-ID

281 

282# 可选:为自定义端点或网关覆盖 Vertex 端点 URL

283# export ANTHROPIC_VERTEX_BASE_URL=https://aiplatform.googleapis.com

284 

285# 可选:如果需要,禁用 prompt caching

286export DISABLE_PROMPT_CACHING=1

287 

288# 可选:请求 1 小时的 prompt cache TTL 而不是 5 分钟的默认值

289export ENABLE_PROMPT_CACHING_1H=1

290 

291# 当 CLOUD_ML_REGION=global 时,为不支持全局端点的模型覆盖区域

292export VERTEX_REGION_CLAUDE_HAIKU_4_5=us-east5

293export VERTEX_REGION_CLAUDE_4_6_SONNET=europe-west1

294```

295 

296大多数模型版本都有对应的 `VERTEX_REGION_CLAUDE_*` 变量。有关完整列表,请参阅[环境变量参考](/zh-CN/env-vars)。检查 [Vertex Model Garden](https://console.cloud.google.com/vertex-ai/model-garden) 以确定哪些模型支持全局端点与仅区域端点。

297 

298[Prompt caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching) 会自动启用。要禁用它,请设置 `DISABLE_PROMPT_CACHING=1`。要请求 1 小时的缓存 TTL 而不是 5 分钟的默认值,请设置 `ENABLE_PROMPT_CACHING_1H=1`;具有 1 小时 TTL 的缓存写入按更高费率计费。如需提高速率限制,请联系 Google Cloud 支持。使用 Vertex AI 时,`/login` 和 `/logout` 命令被禁用,因为身份验证通过 Google Cloud 凭证处理。

299 

300[MCP tool search](/zh-CN/mcp#scale-with-mcp-tool-search) 在 Vertex AI 上默认被禁用,因为端点不接受所需的 beta 标头。所有 MCP 工具定义会预先加载。要选择加入,请设置 `ENABLE_TOOL_SEARCH=true`。

301 

302### 5. 固定模型版本

303 

304<Warning>

305 在部署到多个用户时固定特定的模型版本。如果不固定,模型别名(如 `sonnet` 和 `opus`)会解析为最新版本,当 Anthropic 发布更新时,该版本可能尚未在您的 Vertex AI 项目中启用。Claude Code 在启动时当最新版本不可用时会[回退](#startup-model-checks)到之前的版本,但固定让您可以控制用户何时迁移到新模型。

306</Warning>

307 

308将这些环境变量设置为特定的 Vertex AI 模型 ID。

309 

310如果没有 `ANTHROPIC_DEFAULT_OPUS_MODEL`,Vertex 上的 `opus` 别名会解析为 Opus 4.6。将其设置为 Opus 4.7 ID 以使用最新模型:

311 

312```bash theme={null}

313export ANTHROPIC_DEFAULT_OPUS_MODEL='claude-opus-4-7'

314export ANTHROPIC_DEFAULT_SONNET_MODEL='claude-sonnet-4-6'

315export ANTHROPIC_DEFAULT_HAIKU_MODEL='claude-haiku-4-5@20251001'

316```

317 

318有关当前和旧版模型 ID,请参阅[模型概览](https://platform.claude.com/docs/en/about-claude/models/overview)。有关完整的环境变量列表,请参阅[模型配置](/zh-CN/model-config#pin-models-for-third-party-deployments)。

319 

320Claude Code 在未设置固定变量时使用这些默认模型:

321 

322| 模型类型 | 默认值 |

323| :------ | :--------------------------- |

324| 主模型 | `claude-sonnet-4-5@20250929` |

325| 小型/快速模型 | `claude-haiku-4-5@20251001` |

326 

327要进一步自定义模型:

328 

329```bash theme={null}

330export ANTHROPIC_MODEL='claude-opus-4-7'

331export ANTHROPIC_DEFAULT_HAIKU_MODEL='claude-haiku-4-5@20251001'

332```

333 

334## 启动模型检查

335 

336当 Claude Code 启动并配置了 Vertex AI 时,它会验证它打算使用的模型在您的项目中是否可访问。此检查需要 Claude Code v2.1.98 或更高版本。

337 

338如果您固定了一个比当前 Claude Code 默认值更旧的模型版本,并且您的项目可以调用较新版本,Claude Code 会提示您更新固定。接受会将新的模型 ID 写入您的[用户设置文件](/zh-CN/settings)并重启 Claude Code。拒绝会被记住,直到下一个默认版本更改。

339 

340如果您没有固定模型,并且当前默认值在您的项目中不可用,Claude Code 会在当前会话中回退到之前的版本并显示通知。回退不会被持久化。在 [Model Garden](https://console.cloud.google.com/vertex-ai/model-garden) 中启用较新的模型或[固定一个版本](#5-pin-model-versions)以使选择永久化。

341 

342## IAM 配置

343 

344分配所需的 IAM 权限:

345 

346`roles/aiplatform.user` 角色包括所需的权限:

347 

348* `aiplatform.endpoints.predict` - 模型调用和令牌计数所需

349 

350对于更严格的权限,请创建仅包含上述权限的自定义角色。

351 

352有关详细信息,请参阅 [Vertex IAM 文档](https://cloud.google.com/vertex-ai/docs/general/access-control)。

353 

354<Note>

355 为 Claude Code 创建专用的 GCP 项目,以简化成本跟踪和访问控制。

356</Note>

357 

358## 1M token context window

359 

360Claude Opus 4.7、Opus 4.6 和 Sonnet 4.6 在 Vertex AI 上支持 [1M token context window](https://platform.claude.com/docs/en/build-with-claude/context-windows#1m-token-context-window)。当您选择 1M 模型变体时,Claude Code 会自动启用扩展 context window。

361 

362[设置向导](#sign-in-with-vertex-ai)在固定模型时提供 1M context 选项。要为手动固定的模型启用它,请在模型 ID 后附加 `[1m]`。有关详细信息,请参阅[为第三方部署固定模型](/zh-CN/model-config#pin-models-for-third-party-deployments)。

363 

364## 故障排除

365 

366如果您遇到配额问题:

367 

368* 通过 [Cloud Console](https://cloud.google.com/docs/quotas/view-manage) 检查当前配额或请求增加配额

369 

370如果您遇到"模型未找到"404 错误:

371 

372* 确认模型在 [Model Garden](https://console.cloud.google.com/vertex-ai/model-garden) 中已启用

373* 验证该模型在您指定的位置可用。某些模型仅在 `global` 或多区域位置(如 `eu` 和 `us`)上提供,而不是在特定区域

374* 如果使用 `CLOUD_ML_REGION=global`,请检查您的模型是否在 [Model Garden](https://console.cloud.google.com/vertex-ai/model-garden) 中的"支持的功能"下支持全局端点。对于不支持全局端点的模型,请执行以下任一操作:

375 * 通过 `ANTHROPIC_MODEL` 或 `ANTHROPIC_DEFAULT_HAIKU_MODEL` 指定支持的模型,或

376 * 使用 `VERTEX_REGION_<MODEL_NAME>` 环境变量设置区域或多区域位置

377 

378如果您遇到 429 错误:

379 

380* 对于区域端点,请确保主模型和小型/快速模型在您选择的区域中受支持

381* 考虑切换到 `CLOUD_ML_REGION=global` 以获得更好的可用性

382 

383## 其他资源

384 

385* [Vertex AI 文档](https://cloud.google.com/vertex-ai/docs)

386* [Vertex AI 定价](https://cloud.google.com/vertex-ai/pricing)

387* [Vertex AI 配额和限制](https://cloud.google.com/vertex-ai/docs/quotas)

headless.md +225 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 以编程方式运行 Claude Code

6 

7> 使用 Agent SDK 从 CLI、Python 或 TypeScript 以编程方式运行 Claude Code。

8 

9[Agent SDK](/zh-CN/agent-sdk/overview) 为您提供了与 Claude Code 相同的工具、agent 循环和上下文管理。它可作为 CLI 用于脚本和 CI/CD,或作为 [Python](/zh-CN/agent-sdk/python) 和 [TypeScript](/zh-CN/agent-sdk/typescript) 包供完整的编程控制。

10 

11<Note>

12 CLI 之前被称为"headless mode"。`-p` 标志和所有 CLI 选项的工作方式相同。

13</Note>

14 

15要从 CLI 以编程方式运行 Claude Code,请使用 `-p` 传递您的提示和任何 [CLI 选项](/zh-CN/cli-reference):

16 

17```bash theme={null}

18claude -p "Find and fix the bug in auth.py" --allowedTools "Read,Edit,Bash"

19```

20 

21本页面涵盖通过 CLI (`claude -p`) 使用 Agent SDK。对于具有结构化输出、工具批准回调和原生消息对象的 Python 和 TypeScript SDK 包,请参阅 [完整 Agent SDK 文档](/zh-CN/agent-sdk/overview)。

22 

23## 基本用法

24 

25将 `-p`(或 `--print`)标志添加到任何 `claude` 命令以非交互方式运行它。所有 [CLI 选项](/zh-CN/cli-reference) 都适用于 `-p`,包括:

26 

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

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

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

30 

31此示例询问 Claude 关于您的代码库的问题并打印响应:

32 

33```bash theme={null}

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

35```

36 

37### 使用裸模式更快启动

38 

39添加 `--bare` 以通过跳过 hooks、skills、plugins、MCP 服务器、自动内存和 CLAUDE.md 的自动发现来减少启动时间。没有它,`claude -p` 会加载交互式会话相同的 [上下文](/zh-CN/how-claude-code-works#the-context-window),包括在工作目录或 `~/.claude` 中配置的任何内容。

40 

41裸模式对于 CI 和脚本很有用,您需要在每台机器上获得相同的结果。队友的 `~/.claude` 中的 hook 或项目的 `.mcp.json` 中的 MCP 服务器不会运行,因为裸模式从不读取它们。只有您显式传递的标志才会生效。

42 

43此示例在裸模式下运行一次性摘要任务,并预先批准 Read 工具,以便调用完成而无需权限提示:

44 

45```bash theme={null}

46claude --bare -p "Summarize this file" --allowedTools "Read"

47```

48 

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

50 

51| 要加载 | 使用 |

52| ---------- | ------------------------------------------------------- |

53| 系统提示添加 | `--append-system-prompt`, `--append-system-prompt-file` |

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

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

56| 自定义 agents | `--agents <json>` |

57| 插件目录 | `--plugin-dir <path>` |

58 

59裸模式跳过 OAuth 和钥匙链读取。Anthropic 身份验证必须来自 `ANTHROPIC_API_KEY` 或传递给 `--settings` 的 JSON 中的 `apiKeyHelper`。Bedrock、Vertex 和 Foundry 使用其常规提供商凭证。

60 

61<Note>

62 `--bare` 是脚本和 SDK 调用的推荐模式,将在未来版本中成为 `-p` 的默认值。

63</Note>

64 

65## 示例

66 

67这些示例突出了常见的 CLI 模式。对于 CI 和其他脚本调用,添加 [`--bare`](#start-faster-with-bare-mode) 以便它们不会选择本地配置的任何内容。

68 

69### 获取结构化输出

70 

71使用 `--output-format` 控制响应的返回方式:

72 

73* `text`(默认):纯文本输出

74* `json`:包含结果、会话 ID 和元数据的结构化 JSON

75* `stream-json`:用于实时流式传输的换行符分隔的 JSON

76 

77此示例以 JSON 格式返回项目摘要以及会话元数据,文本结果在 `result` 字段中:

78 

79```bash theme={null}

80claude -p "Summarize this project" --output-format json

81```

82 

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

84 

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

86 

87```bash theme={null}

88claude -p "Extract the main function names from auth.py" \

89 --output-format json \

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

91```

92 

93<Tip>

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

95 

96 ```bash theme={null}

97 # Extract the text result

98 claude -p "Summarize this project" --output-format json | jq -r '.result'

99 

100 # Extract structured output

101 claude -p "Extract function names from auth.py" \

102 --output-format json \

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

104 | jq '.structured_output'

105 ```

106</Tip>

107 

108### 流式传输响应

109 

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

111 

112```bash theme={null}

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

114```

115 

116以下示例使用 [jq](https://jqlang.github.io/jq/) 来过滤文本增量并仅显示流式文本。`-r` 标志输出原始字符串(无引号),`-j` 不带换行符连接,以便令牌连续流式传输:

117 

118```bash theme={null}

119claude -p "Write a poem" --output-format stream-json --verbose --include-partial-messages | \

120 jq -rj 'select(.type == "stream_event" and .event.delta.type? == "text_delta") | .event.delta.text'

121```

122 

123当 API 请求因可重试错误而失败时,Claude Code 在重试前发出 `system/api_retry` 事件。您可以使用此来显示重试进度或实现自定义退避逻辑。

124 

125| 字段 | 类型 | 描述 |

126| ---------------- | ------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |

127| `type` | `"system"` | 消息类型 |

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

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

130| `max_retries` | 整数 | 允许的总重试次数 |

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

132| `error_status` | 整数或 null | HTTP 状态代码,或 `null` 表示没有 HTTP 响应的连接错误 |

133| `error` | 字符串 | 错误类别:`authentication_failed`、`oauth_org_not_allowed`、`billing_error`、`rate_limit`、`invalid_request`、`server_error`、`max_output_tokens` 或 `unknown` |

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

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

136 

137`system/init` 事件报告会话元数据,包括模型、工具、MCP 服务器和加载的插件。它是流中的第一个事件,除非设置了 [`CLAUDE_CODE_SYNC_PLUGIN_INSTALL`](/zh-CN/env-vars),在这种情况下 `plugin_install` 事件在其之前。使用插件字段在插件未加载时使 CI 失败:

138 

139| 字段 | 类型 | 描述 |

140| --------------- | -- | ------------------------------------------------------------------------------------------ |

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

142| `plugin_errors` | 数组 | 插件加载时错误,例如不满足的依赖版本,每个都有 `plugin`、`type` 和 `message`。受影响的插件被降级并从 `plugins` 中缺失。当没有错误时,该键被省略 |

143 

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

145 

146| 字段 | 类型 | 描述 |

147| ------------ | ---------------------------------------------------- | ------------------------------------------------------------ |

148| `type` | `"system"` | 消息类型 |

149| `subtype` | `"plugin_install"` | 将其标识为插件安装事件 |

150| `status` | `"started"`、`"installed"`、`"failed"` 或 `"completed"` | `started` 和 `completed` 括住整体安装;`installed` 和 `failed` 报告单个市场 |

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

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

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

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

155 

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

157 

158### 自动批准工具

159 

160使用 `--allowedTools` 让 Claude 使用某些工具而无需提示。此示例运行测试套件并修复失败,允许 Claude 执行 Bash 命令和读取/编辑文件而无需请求权限:

161 

162```bash theme={null}

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

164 --allowedTools "Bash,Read,Edit"

165```

166 

167要为整个会话设置基线而不是列出单个工具,请传递 [权限模式](/zh-CN/permission-modes)。`dontAsk` 拒绝您的 `permissions.allow` 规则或 [只读命令集](/zh-CN/permissions#read-only-commands) 中未包含的任何内容,这对于锁定的 CI 运行很有用。`acceptEdits` 让 Claude 写入文件而无需提示,还自动批准常见的文件系统命令,例如 `mkdir`、`touch`、`mv` 和 `cp`。其他 shell 命令和网络请求仍然需要 `--allowedTools` 条目或 `permissions.allow` 规则,否则当尝试时运行会中止:

168 

169```bash theme={null}

170claude -p "Apply the lint fixes" --permission-mode acceptEdits

171```

172 

173### 创建提交

174 

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

176 

177```bash theme={null}

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

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

180```

181 

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

183 

184<Note>

185 用户调用的 [skills](/zh-CN/skills) 如 `/commit` 和 [内置命令](/zh-CN/commands) 仅在交互模式下可用。在 `-p` 模式下,改为描述您想要完成的任务。

186</Note>

187 

188### 自定义系统提示

189 

190使用 `--append-system-prompt` 添加指令同时保持 Claude Code 的默认行为。此示例将 PR diff 传递给 Claude 并指示它审查安全漏洞:

191 

192```bash theme={null}

193gh pr diff "$1" | claude -p \

194 --append-system-prompt "You are a security engineer. Review for vulnerabilities." \

195 --output-format json

196```

197 

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

199 

200### 继续对话

201 

202使用 `--continue` 继续最近的对话,或使用 `--resume` 与会话 ID 继续特定对话。此示例运行审查,然后发送后续提示:

203 

204```bash theme={null}

205# First request

206claude -p "Review this codebase for performance issues"

207 

208# Continue the most recent conversation

209claude -p "Now focus on the database queries" --continue

210claude -p "Generate a summary of all issues found" --continue

211```

212 

213如果您运行多个对话,请捕获会话 ID 以恢复特定对话:

214 

215```bash theme={null}

216session_id=$(claude -p "Start a review" --output-format json | jq -r '.session_id')

217claude -p "Continue that review" --resume "$session_id"

218```

219 

220## 后续步骤

221 

222* [Agent SDK 快速入门](/zh-CN/agent-sdk/quickstart):使用 Python 或 TypeScript 构建您的第一个 agent

223* [CLI 参考](/zh-CN/cli-reference):所有 CLI 标志和选项

224* [GitHub Actions](/zh-CN/github-actions):在 GitHub 工作流中使用 Agent SDK

225* [GitLab CI/CD](/zh-CN/gitlab-ci-cd):在 GitLab 管道中使用 Agent SDK

hooks.md +2652 −0 created

Details

1> ## Documentation Index

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

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

4 

5# Hooks 参考

6 

7> Claude Code hook 事件、配置架构、JSON 输入/输出格式、退出代码、异步 hooks、HTTP hooks、提示 hooks 和 MCP 工具 hooks 的参考。

8 

9<Tip>

10 有关包含示例的快速入门指南,请参阅[使用 hooks 自动化工作流](/zh-CN/hooks-guide)。

11</Tip>

12 

13Hooks 是用户定义的 shell 命令、HTTP 端点或 LLM 提示,在 Claude Code 生命周期中的特定点自动执行。使用此参考查找事件架构、配置选项、JSON 输入/输出格式以及异步 hooks、HTTP hooks 和 MCP 工具 hooks 等高级功能。如果您是第一次设置 hooks,请改为从[指南](/zh-CN/hooks-guide)开始。

14 

15## Hook 生命周期

16 

17Hooks 在 Claude Code 会话期间的特定点触发。当事件触发且匹配器匹配时,Claude Code 会将关于该事件的 JSON 上下文传递给您的 hook 处理程序。对于命令 hooks,输入通过 stdin 到达。对于 HTTP hooks,它作为 POST 请求体到达。您的处理程序随后可以检查输入、采取行动并可选地返回决定。事件分为三种频率:每个会话一次(`SessionStart`、`SessionEnd`)、每轮一次(`UserPromptSubmit`、`Stop`、`StopFailure`)以及代理循环内的每个工具调用(`PreToolUse`、`PostToolUse`):

18 

19<div style={{maxWidth: "500px", margin: "0 auto"}}>

20 <Frame>

21 <img src="https://mintcdn.com/claude-code/ZIW26Z9pnpsXLhbS/images/hooks-lifecycle.svg?fit=max&auto=format&n=ZIW26Z9pnpsXLhbS&q=85&s=ee23691324deb6501df09bfdae560b64" alt="Hook 生命周期图,显示可选的 Setup 流入 SessionStart,然后是每轮循环,包含 UserPromptSubmit、用于 slash commands 的 UserPromptExpansion、嵌套的代理循环(PreToolUse、PermissionRequest、PostToolUse、PostToolUseFailure、PostToolBatch、SubagentStart/Stop、TaskCreated、TaskCompleted)和 Stop 或 StopFailure,然后是 TeammateIdle、PreCompact、PostCompact 和 SessionEnd,Elicitation 和 ElicitationResult 嵌套在 MCP 工具执行内,PermissionDenied 作为 PermissionRequest 的副分支用于自动模式拒绝,WorktreeCreate、WorktreeRemove、Notification、ConfigChange、InstructionsLoaded、CwdChanged 和 FileChanged 作为独立异步事件" width="520" height="1228" data-path="images/hooks-lifecycle.svg" />

22 </Frame>

23</div>

24 

25下表总结了每个事件何时触发。[Hook 事件](#hook-events)部分记录了每个事件的完整输入架构和决定控制选项。

26 

27| Event | When it fires |

28| :-------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------- |

29| `SessionStart` | When a session begins or resumes |

30| `Setup` | When you start Claude Code with `--init-only`, or with `--init` or `--maintenance` in `-p` mode. For one-time preparation in CI or scripts |

31| `UserPromptSubmit` | When you submit a prompt, before Claude processes it |

32| `UserPromptExpansion` | When a user-typed command expands into a prompt, before it reaches Claude. Can block the expansion |

33| `PreToolUse` | Before a tool call executes. Can block it |

34| `PermissionRequest` | When a permission dialog appears |

35| `PermissionDenied` | When a tool call is denied by the auto mode classifier. Return `{retry: true}` to tell the model it may retry the denied tool call |

36| `PostToolUse` | After a tool call succeeds |

37| `PostToolUseFailure` | After a tool call fails |

38| `PostToolBatch` | After a full batch of parallel tool calls resolves, before the next model call |

39| `Notification` | When Claude Code sends a notification |

40| `SubagentStart` | When a subagent is spawned |

41| `SubagentStop` | When a subagent finishes |

42| `TaskCreated` | When a task is being created via `TaskCreate` |

43| `TaskCompleted` | When a task is being marked as completed |

44| `Stop` | When Claude finishes responding |

45| `StopFailure` | When the turn ends due to an API error. Output and exit code are ignored |

46| `TeammateIdle` | When an [agent team](/en/agent-teams) teammate is about to go idle |

47| `InstructionsLoaded` | When a CLAUDE.md or `.claude/rules/*.md` file is loaded into context. Fires at session start and when files are lazily loaded during a session |

48| `ConfigChange` | When a configuration file changes during a session |

49| `CwdChanged` | When the working directory changes, for example when Claude executes a `cd` command. Useful for reactive environment management with tools like direnv |

50| `FileChanged` | When a watched file changes on disk. The `matcher` field specifies which filenames to watch |

51| `WorktreeCreate` | When a worktree is being created via `--worktree` or `isolation: "worktree"`. Replaces default git behavior |

52| `WorktreeRemove` | When a worktree is being removed, either at session exit or when a subagent finishes |

53| `PreCompact` | Before context compaction |

54| `PostCompact` | After context compaction completes |

55| `Elicitation` | When an MCP server requests user input during a tool call |

56| `ElicitationResult` | After a user responds to an MCP elicitation, before the response is sent back to the server |

57| `SessionEnd` | When a session terminates |

58 

59### Hook 如何解析

60 

61要了解这些部分如何组合在一起,请考虑这个 `PreToolUse` hook,它阻止破坏性 shell 命令。`matcher` 缩小到 Bash 工具调用,`if` 条件进一步缩小到匹配 `rm *` 的 Bash 子命令,因此 `block-rm.sh` 仅在两个过滤器都匹配时生成:

62 

63```json theme={null}

64{

65 "hooks": {

66 "PreToolUse": [

67 {

68 "matcher": "Bash",

69 "hooks": [

70 {

71 "type": "command",

72 "if": "Bash(rm *)",

73 "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/block-rm.sh"

74 }

75 ]

76 }

77 ]

78 }

79}

80```

81 

82该脚本从 stdin 读取 JSON 输入,提取命令,如果包含 `rm -rf`,则返回 `permissionDecision` 为 `"deny"`:

83 

84```bash theme={null}

85#!/bin/bash

86# .claude/hooks/block-rm.sh

87COMMAND=$(jq -r '.tool_input.command')

88 

89if echo "$COMMAND" | grep -q 'rm -rf'; then

90 jq -n '{

91 hookSpecificOutput: {

92 hookEventName: "PreToolUse",

93 permissionDecision: "deny",

94 permissionDecisionReason: "Destructive command blocked by hook"

95 }

96 }'

97else

98 exit 0 # allow the command

99fi

100```

101 

102现在假设 Claude Code 决定运行 `Bash "rm -rf /tmp/build"`。以下是发生的情况:

103 

104<Frame>

105 <img src="https://mintcdn.com/claude-code/-tYw1BD_DEqfyyOZ/images/hook-resolution.svg?fit=max&auto=format&n=-tYw1BD_DEqfyyOZ&q=85&s=c73ebc1eeda2037570427d7af1e0a891" alt="Hook 解析流程:PreToolUse 事件触发,匹配器检查 Bash 匹配,if 条件检查 Bash(rm *) 匹配,hook 处理程序运行,结果返回到 Claude Code" width="930" height="290" data-path="images/hook-resolution.svg" />

106</Frame>

107 

108<Steps>

109 <Step title="事件触发">

110 `PreToolUse` 事件触发。Claude Code 将工具输入作为 JSON 通过 stdin 发送到 hook:

111 

112 ```json theme={null}

113 { "tool_name": "Bash", "tool_input": { "command": "rm -rf /tmp/build" }, ... }

114 ```

115 </Step>

116 

117 <Step title="匹配器检查">

118 匹配器 `"Bash"` 与工具名称匹配,因此此 hook 组激活。如果您省略匹配器或使用 `"*"`,该组在事件的每次出现时激活。

119 </Step>

120 

121 <Step title="If 条件检查">

122 `if` 条件 `"Bash(rm *)"` 匹配,因为 `rm -rf /tmp/build` 是匹配 `rm *` 的子命令,因此此处理程序生成。如果命令是 `npm test`,`if` 检查会失败,`block-rm.sh` 永远不会运行,避免进程生成开销。`if` 字段是可选的;没有它,匹配组中的每个处理程序都运行。

123 </Step>

124 

125 <Step title="Hook 处理程序运行">

126 脚本检查完整命令并找到 `rm -rf`,因此它将决定打印到 stdout:

127 

128 ```json theme={null}

129 {

130 "hookSpecificOutput": {

131 "hookEventName": "PreToolUse",

132 "permissionDecision": "deny",

133 "permissionDecisionReason": "Destructive command blocked by hook"

134 }

135 }

136 ```

137 

138 如果命令是更安全的 `rm` 变体,如 `rm file.txt`,脚本会改为执行 `exit 0`,这告诉 Claude Code 允许工具调用而无需进一步操作。

139 </Step>

140 

141 <Step title="Claude Code 对结果采取行动">

142 Claude Code 读取 JSON 决定,阻止工具调用,并向 Claude 显示原因。

143 </Step>

144</Steps>

145 

146下面的[配置](#configuration)部分记录了完整的架构,每个[hook 事件](#hook-events)部分记录了您的命令接收的输入以及它可以返回的输出。

147 

148## 配置

149 

150Hooks 在 JSON 设置文件中定义。配置有三个嵌套级别:

151 

1521. 选择要响应的[hook 事件](#hook-events),如 `PreToolUse` 或 `Stop`

1532. 添加[匹配器组](#matcher-patterns)以过滤何时触发,如"仅针对 Bash 工具"

1543. 定义一个或多个[hook 处理程序](#hook-handler-fields)以在匹配时运行

155 

156有关完整的演练和带注释的示例,请参阅上面的[Hook 如何解析](#how-a-hook-resolves)。

157 

158<Note>

159 此页面为每个级别使用特定术语:**hook 事件**表示生命周期点,**匹配器组**表示过滤器,**hook 处理程序**表示运行的 shell 命令、HTTP 端点、MCP 工具、提示或代理。"Hook"本身指的是一般功能。

160</Note>

161 

162### Hook 位置

163 

164您定义 hook 的位置决定了其范围:

165 

166| 位置 | 范围 | 可共享 |

167| :---------------------------------------------------------- | :----- | :----------- |

168| `~/.claude/settings.json` | 您的所有项目 | 否,本地于您的计算机 |

169| `.claude/settings.json` | 单个项目 | 是,可以提交到仓库 |

170| `.claude/settings.local.json` | 单个项目 | 否,gitignored |

171| 托管策略设置 | 组织范围 | 是,管理员控制 |

172| [Plugin](/zh-CN/plugins) `hooks/hooks.json` | 启用插件时 | 是,与插件捆绑 |

173| [Skill](/zh-CN/skills) 或[代理](/zh-CN/sub-agents) frontmatter | 组件活跃时 | 是,在组件文件中定义 |

174 

175有关设置文件解析的详细信息,请参阅[设置](/zh-CN/settings)。企业管理员可以使用 `allowManagedHooksOnly` 来阻止用户、项目和插件 hooks。在托管设置 `enabledPlugins` 中强制启用的插件中的 Hooks 是豁免的,因此管理员可以通过组织市场分发经过审查的 hooks。请参阅[Hook 配置](/zh-CN/settings#hook-configuration)。

176 

177### 匹配器模式

178 

179`matcher` 字段过滤 hooks 何时触发。匹配器的评估方式取决于它包含的字符:

180 

181| 匹配器值 | 评估为 | 示例 |

182| :---------------- | :--------------------- | :------------------------------------------------------------------------ |

183| `"*"`、`""` 或省略 | 匹配所有 | 在事件的每次出现时触发 |

184| 仅字母、数字、`_` 和 `\|` | 精确字符串或 `\|` 分隔的精确字符串列表 | `Bash` 仅匹配 Bash 工具;`Edit\|Write` 精确匹配任一工具 |

185| 包含任何其他字符 | JavaScript 正则表达式 | `^Notebook` 匹配任何以 Notebook 开头的工具;`mcp__memory__.*` 匹配来自 `memory` 服务器的每个工具 |

186 

187`FileChanged` 事件在构建其监视列表时不遵循这些规则。请参阅 [FileChanged](#filechanged)。

188 

189每个事件类型在不同的字段上匹配:

190 

191| 事件 | 匹配器过滤的内容 | 示例匹配器值 |

192| :----------------------------------------------------------------------------------------------------------------------- | :---------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------ |

193| `PreToolUse`、`PostToolUse`、`PostToolUseFailure`、`PermissionRequest`、`PermissionDenied` | 工具名称 | `Bash`、`Edit\|Write`、`mcp__.*` |

194| `SessionStart` | 会话如何启动 | `startup`、`resume`、`clear`、`compact` |

195| `Setup` | 哪个 CLI 标志触发了设置 | `init`、`maintenance` |

196| `SessionEnd` | 会话为何结束 | `clear`、`resume`、`logout`、`prompt_input_exit`、`bypass_permissions_disabled`、`other` |

197| `Notification` | 通知类型 | `permission_prompt`、`idle_prompt`、`auth_success`、`elicitation_dialog`、`elicitation_complete`、`elicitation_response` |

198| `SubagentStart` | 代理类型 | `general-purpose`、`Explore`、`Plan` 或自定义代理名称 |

199| `PreCompact`、`PostCompact` | 触发压缩的原因 | `manual`、`auto` |

200| `SubagentStop` | 代理类型 | 与 `SubagentStart` 相同的值 |

201| `ConfigChange` | 配置源 | `user_settings`、`project_settings`、`local_settings`、`policy_settings`、`skills` |

202| `CwdChanged` | 不支持匹配器 | 总是在每次目录更改时触发 |

203| `FileChanged` | 文字文件名以监视(请参阅 [FileChanged](#filechanged)) | `.envrc\|.env` |

204| `StopFailure` | 错误类型 | `rate_limit`、`authentication_failed`、`oauth_org_not_allowed`、`billing_error`、`invalid_request`、`server_error`、`max_output_tokens`、`unknown` |

205| `InstructionsLoaded` | 加载原因 | `session_start`、`nested_traversal`、`path_glob_match`、`include`、`compact` |

206| `UserPromptExpansion` | 命令名称 | 您的 skill 或命令名称 |

207| `Elicitation` | MCP 服务器名称 | 您配置的 MCP 服务器名称 |

208| `ElicitationResult` | MCP 服务器名称 | 与 `Elicitation` 相同的值 |

209| `UserPromptSubmit`、`PostToolBatch`、`Stop`、`TeammateIdle`、`TaskCreated`、`TaskCompleted`、`WorktreeCreate`、`WorktreeRemove` | 不支持匹配器 | 总是在每次出现时触发 |

210 

211匹配器针对 Claude Code 在 stdin 上发送给您的 hook 的[JSON 输入](#hook-input-and-output)中的字段运行。对于工具事件,该字段是 `tool_name`。每个[hook 事件](#hook-events)部分列出了完整的匹配器值集和该事件的输入架构。

212 

213此示例仅在 Claude 写入或编辑文件时运行 linting 脚本:

214 

215```json theme={null}

216{

217 "hooks": {

218 "PostToolUse": [

219 {

220 "matcher": "Edit|Write",

221 "hooks": [

222 {

223 "type": "command",

224 "command": "/path/to/lint-check.sh"

225 }

226 ]

227 }

228 ]

229 }

230}

231```

232 

233`UserPromptSubmit`、`PostToolBatch`、`Stop`、`TeammateIdle`、`TaskCreated`、`TaskCompleted`、`WorktreeCreate`、`WorktreeRemove` 和 `CwdChanged` 不支持匹配器,总是在每次出现时触发。如果您向这些事件添加 `matcher` 字段,它会被静默忽略。

234 

235对于工具事件,您可以通过在单个 hook 处理程序上设置[`if` 字段](#common-fields)来更狭隘地过滤。`if` 使用[权限规则语法](/zh-CN/permissions)来匹配工具名称和参数,因此 `"Bash(git *)"` 仅在任何 Bash 输入的子命令与 `git *` 匹配时运行,`"Edit(*.ts)"` 仅对 TypeScript 文件运行。

236 

237#### 匹配 MCP 工具

238 

239[MCP](/zh-CN/mcp) 服务器工具在工具事件中显示为常规工具(`PreToolUse`、`PostToolUse`、`PostToolUseFailure`、`PermissionRequest`、`PermissionDenied`),因此您可以像匹配任何其他工具名称一样匹配它们。

240 

241MCP 工具遵循命名模式 `mcp__<server>__<tool>`,例如:

242 

243* `mcp__memory__create_entities`:Memory 服务器的创建实体工具

244* `mcp__filesystem__read_file`:Filesystem 服务器的读取文件工具

245* `mcp__github__search_repositories`:GitHub 服务器的搜索工具

246 

247要匹配来自服务器的每个工具,请在服务器前缀后追加 `.*`。`.*` 是必需的:像 `mcp__memory` 这样的匹配器仅包含字母和下划线,因此它作为精确字符串进行比较,不匹配任何工具。

248 

249* `mcp__memory__.*` 匹配来自 `memory` 服务器的所有工具

250* `mcp__.*__write.*` 匹配来自任何服务器的任何名称以 `write` 开头的工具

251 

252此示例记录所有内存服务器操作并验证来自任何 MCP 服务器的写入操作:

253 

254```json theme={null}

255{

256 "hooks": {

257 "PreToolUse": [

258 {

259 "matcher": "mcp__memory__.*",

260 "hooks": [

261 {

262 "type": "command",

263 "command": "echo 'Memory operation initiated' >> ~/mcp-operations.log"

264 }

265 ]

266 },

267 {

268 "matcher": "mcp__.*__write.*",

269 "hooks": [

270 {

271 "type": "command",

272 "command": "/home/user/scripts/validate-mcp-write.py"

273 }

274 ]

275 }

276 ]

277 }

278}

279```

280 

281### Hook 处理程序字段

282 

283内部 `hooks` 数组中的每个对象都是一个 hook 处理程序:当匹配器匹配时运行的 shell 命令、HTTP 端点、MCP 工具、LLM 提示或代理。有五种类型:

284 

285* **[命令 hooks](#command-hook-fields)**(`type: "command"`):运行 shell 命令。您的脚本在 stdin 上接收事件的[JSON 输入](#hook-input-and-output),并通过退出代码和 stdout 传回结果。

286* **[HTTP hooks](#http-hook-fields)**(`type: "http"`):将事件的 JSON 输入作为 HTTP POST 请求发送到 URL。端点通过使用与命令 hooks 相同的[JSON 输出格式](#json-output)的响应体传回结果。

287* **[MCP 工具 hooks](#mcp-tool-hook-fields)**(`type: "mcp_tool"`):在已连接的[MCP 服务器](/zh-CN/mcp)上调用工具。工具的文本输出被视为命令 hook stdout。

288* **[提示 hooks](#prompt-and-agent-hook-fields)**(`type: "prompt"`):向 Claude 模型发送提示以进行单轮评估。模型返回 yes/no 决定作为 JSON。请参阅[基于提示的 hooks](#prompt-based-hooks)。

289* **[代理 hooks](#prompt-and-agent-hook-fields)**(`type: "agent"`):生成一个可以使用 Read、Grep 和 Glob 等工具来验证条件的 subagent,然后返回决定。代理 hooks 是实验性的,可能会改变。请参阅[基于代理的 hooks](#agent-based-hooks)。

290 

291#### 通用字段

292 

293这些字段适用于所有 hook 类型:

294 

295| 字段 | 必需 | 描述 |

296| :-------------- | :- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

297| `type` | 是 | `"command"`、`"http"`、`"mcp_tool"`、`"prompt"` 或 `"agent"` |

298| `if` | 否 | 权限规则语法以过滤此 hook 何时运行,例如 `"Bash(git *)"` 或 `"Edit(*.ts)"`。仅当工具调用与模式匹配时,hook 才会生成,或当 Bash 命令太复杂而无法解析时。仅在工具事件上评估:`PreToolUse`、`PostToolUse`、`PostToolUseFailure`、`PermissionRequest` 和 `PermissionDenied`。在其他事件上,设置了 `if` 的 hook 永远不会运行。使用与[权限规则](/zh-CN/permissions)相同的语法 |

299| `timeout` | 否 | 取消前的秒数。默认值:命令 600、提示 30、代理 60 |

300| `statusMessage` | 否 | hook 运行时显示的自定义加载程序消息 |

301| `once` | 否 | 如果为 `true`,每个会话仅运行一次,然后被移除。仅在[skill frontmatter](#hooks-in-skills-and-agents)中声明的 hooks 中受尊重;在设置文件和代理 frontmatter 中被忽略 |

302 

303`if` 字段恰好包含一个权限规则。没有 `&&`、`||` 或列表语法来组合规则;要应用多个条件,请为每个条件定义一个单独的 hook 处理程序。对于 Bash,规则针对工具输入的每个子命令进行匹配,在去除前导 `VAR=value` 赋值后,因此 `if: "Bash(git push *)"` 既匹配 `FOO=bar git push` 也匹配 `npm test && git push`。如果任何子命令匹配,hook 会运行,并且在命令太复杂而无法解析时总是运行。

304 

305#### 命令 hook 字段

306 

307除了[通用字段](#common-fields)外,命令 hooks 还接受这些字段:

308 

309| 字段 | 必需 | 描述 |

310| :------------ | :- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------- |

311| `command` | 是 | 要执行的 shell 命令 |

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

313| `asyncRewake` | 否 | 如果为 `true`,在后台运行并在退出代码 2 时唤醒 Claude。暗示 `async`。Hook 的 stderr,或 stdout(如果 stderr 为空),作为系统提醒显示给 Claude,以便它可以对长时间运行的后台失败做出反应 |

314| `shell` | 否 | 用于此 hook 的 shell。接受 `"bash"`(默认)或 `"powershell"`。设置 `"powershell"` 在 Windows 上通过 PowerShell 运行命令。不需要 `CLAUDE_CODE_USE_POWERSHELL_TOOL`,因为 hooks 直接生成 PowerShell |

315 

316#### HTTP hook 字段

317 

318除了[通用字段](#common-fields)外,HTTP hooks 还接受这些字段:

319 

320| 字段 | 必需 | 描述 |

321| :--------------- | :- | :-------------------------------------------------------------------------------------- |

322| `url` | 是 | 发送 POST 请求的 URL |

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

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

325 

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

327 

328错误处理与命令 hooks 不同:非 2xx 响应、连接失败和超时都会产生非阻止错误,允许执行继续。要阻止工具调用或拒绝权限,返回 2xx 响应,其 JSON 体包含 `decision: "block"` 或 `hookSpecificOutput` 与 `permissionDecision: "deny"`。

329 

330此示例将 `PreToolUse` 事件发送到本地验证服务,使用来自 `MY_TOKEN` 环境变量的令牌进行身份验证:

331 

332```json theme={null}

333{

334 "hooks": {

335 "PreToolUse": [

336 {

337 "matcher": "Bash",

338 "hooks": [

339 {

340 "type": "http",

341 "url": "http://localhost:8080/hooks/pre-tool-use",

342 "timeout": 30,

343 "headers": {

344 "Authorization": "Bearer $MY_TOKEN"

345 },

346 "allowedEnvVars": ["MY_TOKEN"]

347 }

348 ]

349 }

350 ]

351 }

352}

353```

354 

355#### MCP 工具 hook 字段

356 

357除了[通用字段](#common-fields)外,MCP 工具 hooks 还接受这些字段:

358 

359| 字段 | 必需 | 描述 |

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

361| `server` | 是 | 已配置的 MCP 服务器的名称。服务器必须已连接;hook 永远不会触发 OAuth 或连接流 |

362| `tool` | 是 | 该服务器上要调用的工具的名称 |

363| `input` | 否 | 传递给工具的参数。字符串值支持从 hook 的[JSON 输入](#hook-input-and-output)进行 `${path}` 替换,例如 `"${tool_input.file_path}"` |

364 

365工具的文本内容被视为命令 hook stdout:如果它解析为有效的[JSON 输出](#json-output),则作为决定进行处理,否则显示为纯文本。如果命名的服务器未连接,或工具返回 `isError: true`,hook 会产生非阻止错误,执行继续。

366 

367MCP 工具 hooks 在 Claude Code 连接到您的 MCP 服务器后在每个 hook 事件上可用。`SessionStart` 和 `Setup` 通常在服务器完成连接之前触发,因此这些事件上的 hooks 应该期望在首次运行时出现"未连接"错误。

368 

369此示例在每个 `Write` 或 `Edit` 后在 `my_server` MCP 服务器上调用 `security_scan` 工具,传递编辑文件的路径:

370 

371```json theme={null}

372{

373 "hooks": {

374 "PostToolUse": [

375 {

376 "matcher": "Write|Edit",

377 "hooks": [

378 {

379 "type": "mcp_tool",

380 "server": "my_server",

381 "tool": "security_scan",

382 "input": { "file_path": "${tool_input.file_path}" }

383 }

384 ]

385 }

386 ]

387 }

388}

389```

390 

391#### 提示和代理 hook 字段

392 

393除了[通用字段](#common-fields)外,提示和代理 hooks 还接受这些字段:

394 

395| 字段 | 必需 | 描述 |

396| :------- | :- | :----------------------------------------------- |

397| `prompt` | 是 | 要发送给模型的提示文本。使用 `$ARGUMENTS` 作为 hook 输入 JSON 的占位符 |

398| `model` | 否 | 用于评估的模型。默认为快速模型 |

399 

400所有匹配的 hooks 并行运行,相同的处理程序会自动去重。命令 hooks 按命令字符串去重,HTTP hooks 按 URL 去重。处理程序在当前目录中运行,使用 Claude Code 的环境。在远程 web 环境中,`$CLAUDE_CODE_REMOTE` 环境变量设置为 `"true"`,在本地 CLI 中未设置。

401 

402### 按路径引用脚本

403 

404使用环境变量按项目或插件根目录引用 hook 脚本,无论 hook 运行时的工作目录如何:

405 

406* `$CLAUDE_PROJECT_DIR`:项目根目录。用引号包装以处理包含空格的路径。

407* `${CLAUDE_PLUGIN_ROOT}`:插件的安装目录,用于与[插件](/zh-CN/plugins)捆绑的脚本。在每次插件更新时更改。

408* `${CLAUDE_PLUGIN_DATA}`:插件的[持久数据目录](/zh-CN/plugins-reference#persistent-data-directory),用于应该在插件更新后保留的依赖项和状态。

409 

410<Tabs>

411 <Tab title="项目脚本">

412 此示例使用 `$CLAUDE_PROJECT_DIR` 在任何 `Write` 或 `Edit` 工具调用后从项目的 `.claude/hooks/` 目录运行样式检查器:

413 

414 ```json theme={null}

415 {

416 "hooks": {

417 "PostToolUse": [

418 {

419 "matcher": "Write|Edit",

420 "hooks": [

421 {

422 "type": "command",

423 "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/check-style.sh"

424 }

425 ]

426 }

427 ]

428 }

429 }

430 ```

431 </Tab>

432 

433 <Tab title="插件脚本">

434 在 `hooks/hooks.json` 中定义插件 hooks,带有可选的顶级 `description` 字段。启用插件时,其 hooks 与您的用户和项目 hooks 合并。

435 

436 此示例运行与插件捆绑的格式化脚本:

437 

438 ```json theme={null}

439 {

440 "description": "Automatic code formatting",

441 "hooks": {

442 "PostToolUse": [

443 {

444 "matcher": "Write|Edit",

445 "hooks": [

446 {

447 "type": "command",

448 "command": "${CLAUDE_PLUGIN_ROOT}/scripts/format.sh",

449 "timeout": 30

450 }

451 ]

452 }

453 ]

454 }

455 }

456 ```

457 

458 有关创建插件 hooks 的详细信息,请参阅[插件组件参考](/zh-CN/plugins-reference#hooks)。

459 </Tab>

460</Tabs>

461 

462### Skills 和代理中的 Hooks

463 

464除了设置文件和插件外,hooks 还可以使用 frontmatter 直接在[skills](/zh-CN/skills)和[subagents](/zh-CN/sub-agents)中定义。这些 hooks 的范围限于组件的生命周期,仅在该组件活跃时运行。

465 

466支持所有 hook 事件。对于 subagents,`Stop` hooks 会自动转换为 `SubagentStop`,因为这是 subagent 完成时触发的事件。

467 

468Hooks 使用与基于设置的 hooks 相同的配置格式,但范围限于组件的生命周期,并在其完成时清理。

469 

470此 skill 定义了一个 `PreToolUse` hook,在每个 `Bash` 命令之前运行安全验证脚本:

471 

472```yaml theme={null}

473---

474name: secure-operations

475description: Perform operations with security checks

476hooks:

477 PreToolUse:

478 - matcher: "Bash"

479 hooks:

480 - type: command

481 command: "./scripts/security-check.sh"

482---

483```

484 

485代理在其 YAML frontmatter 中使用相同的格式。

486 

487### `/hooks` 菜单

488 

489在 Claude Code 中键入 `/hooks` 以打开您配置的 hooks 的只读浏览器。菜单显示每个 hook 事件及其配置的 hooks 计数,让您深入了解匹配器,并显示每个 hook 处理程序的完整详细信息。使用它来验证配置、检查 hook 来自哪个设置文件,或检查 hook 的命令、提示或 URL。

490 

491菜单显示所有五种 hook 类型:`command`、`prompt`、`agent`、`http` 和 `mcp_tool`。每个 hook 都标有 `[type]` 前缀和指示其定义位置的源:

492 

493* `User`:来自 `~/.claude/settings.json`

494* `Project`:来自 `.claude/settings.json`

495* `Local`:来自 `.claude/settings.local.json`

496* `Plugin`:来自插件的 `hooks/hooks.json`

497* `Session`:在当前会话中在内存中注册

498* `Built-in`:由 Claude Code 内部注册

499 

500选择 hook 会打开详细视图,显示其事件、匹配器、类型、源文件以及完整的命令、提示或 URL。菜单是只读的:要添加、修改或移除 hooks,请直接编辑设置 JSON 或要求 Claude 进行更改。

501 

502### 禁用或移除 hooks

503 

504要移除 hook,请从设置 JSON 文件中删除其条目。

505 

506要临时禁用所有 hooks 而不移除它们,请在设置文件中设置 `"disableAllHooks": true`。没有办法在保持 hook 在配置中的同时禁用单个 hook。

507 

508`disableAllHooks` 设置遵守托管设置层次结构。如果管理员通过托管策略设置配置了 hooks,则在用户、项目或本地设置中设置的 `disableAllHooks` 无法禁用这些托管 hooks。仅在托管设置级别设置的 `disableAllHooks` 可以禁用托管 hooks。

509 

510对设置文件中 hooks 的直接编辑通常由文件监视程序自动拾取。

511 

512## Hook 输入和输出

513 

514命令 hooks 通过 stdin 接收 JSON 数据,并通过退出代码、stdout 和 stderr 传回结果。HTTP hooks 接收相同的 JSON 作为 POST 请求体,并通过 HTTP 响应体传回结果。本部分涵盖所有事件通用的字段和行为。每个事件在[Hook 事件](#hook-events)下的部分包括其特定的输入架构和决定控制选项。

515 

516### 通用输入字段

517 

518所有 hook 事件都接收这些字段作为 JSON,除了每个[hook 事件](#hook-events)部分中记录的事件特定字段。对于命令 hooks,此 JSON 通过 stdin 到达。对于 HTTP hooks,它作为 POST 请求体到达。

519 

520| 字段 | 描述 |

521| :---------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------- |

522| `session_id` | 当前会话标识符 |

523| `transcript_path` | 对话 JSON 的路径 |

524| `cwd` | 调用 hook 时的当前工作目录 |

525| `permission_mode` | 当前[权限模式](/zh-CN/permissions#permission-modes):`"default"`、`"plan"`、`"acceptEdits"`、`"auto"`、`"dontAsk"` 或 `"bypassPermissions"`。并非所有事件都接收此字段:请参阅下面每个事件的 JSON 示例以检查 |

526| `hook_event_name` | 触发的事件名称 |

527 

528使用 `--agent` 运行或在 subagent 内部时,包括两个额外字段:

529 

530| 字段 | 描述 |

531| :----------- | :--------------------------------------------------------------------------------------------------------------------------------- |

532| `agent_id` | Subagent 的唯一标识符。仅当 hook 在 subagent 调用内触发时存在。使用此来区分 subagent hook 调用和主线程调用。 |

533| `agent_type` | 代理名称(例如,`"Explore"` 或 `"security-reviewer"`)。当会话使用 `--agent` 或 hook 在 subagent 内触发时存在。对于 subagents,subagent 的类型优先于会话的 `--agent` 值。 |

534 

535例如,Bash 命令的 `PreToolUse` hook 在 stdin 上接收:

536 

537```json theme={null}

538{

539 "session_id": "abc123",

540 "transcript_path": "/home/user/.claude/projects/.../transcript.jsonl",

541 "cwd": "/home/user/my-project",

542 "permission_mode": "default",

543 "hook_event_name": "PreToolUse",

544 "tool_name": "Bash",

545 "tool_input": {

546 "command": "npm test"

547 }

548}

549```

550 

551`tool_name` 和 `tool_input` 字段是事件特定的。每个[hook 事件](#hook-events)部分记录了该事件的额外字段。

552 

553### 退出代码输出

554 

555您的 hook 命令的退出代码告诉 Claude Code 操作是否应该继续、被阻止或被忽略。

556 

557**退出 0** 表示成功。Claude Code 解析 stdout 以获取[JSON 输出字段](#json-output)。JSON 输出仅在退出 0 时处理。对于大多数事件,stdout 被写入调试日志,但不显示在成绩单中。例外是 `UserPromptSubmit`、`UserPromptExpansion` 和 `SessionStart`,其中 stdout 作为 Claude 可以看到和作用的上下文添加。

558 

559**退出 2** 表示阻止错误。Claude Code 忽略 stdout 和其中的任何 JSON。相反,stderr 文本被反馈给 Claude 作为错误消息。效果取决于事件:`PreToolUse` 阻止工具调用,`UserPromptSubmit` 拒绝提示,等等。有关完整列表,请参阅[每个事件的退出代码 2 行为](#exit-code-2-behavior-per-event)。

560 

561**任何其他退出代码** 是大多数 hook 事件的非阻止错误。成绩单显示 `<hook name> hook error` 通知,然后是 stderr 的第一行,因此您可以在不使用 `--debug` 的情况下识别原因。执行继续,完整的 stderr 被写入调试日志。

562 

563例如,一个 hook 命令脚本,阻止危险的 Bash 命令:

564 

565```bash theme={null}

566#!/bin/bash

567# 从 stdin 读取 JSON 输入,检查命令

568command=$(jq -r '.tool_input.command' < /dev/stdin)

569 

570if [[ "$command" == rm* ]]; then

571 echo "Blocked: rm commands are not allowed" >&2

572 exit 2 # 阻止错误:工具调用被阻止

573fi

574 

575exit 0 # 成功:工具调用继续

576```

577 

578<Warning>

579 对于大多数 hook 事件,仅退出代码 2 阻止操作。Claude Code 将退出代码 1 视为非阻止错误并继续操作,尽管 1 是传统的 Unix 失败代码。如果您的 hook 旨在强制执行策略,请使用 `exit 2`。例外是 `WorktreeCreate`,其中任何非零退出代码都会中止 worktree 创建。

580</Warning>

581 

582#### 每个事件的退出代码 2 行为

583 

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

585 

586| Hook 事件 | 可以阻止? | 退出 2 时发生的情况 |

587| :-------------------- | :---- | :------------------------------------------------------------------------- |

588| `PreToolUse` | 是 | 阻止工具调用 |

589| `PermissionRequest` | 是 | 拒绝权限 |

590| `UserPromptSubmit` | 是 | 阻止提示处理并从上下文中删除提示 |

591| `UserPromptExpansion` | 是 | 阻止扩展 |

592| `Stop` | 是 | 防止 Claude 停止,继续对话 |

593| `SubagentStop` | 是 | 防止 subagent 停止 |

594| `TeammateIdle` | 是 | 防止队友空闲(队友继续工作) |

595| `TaskCreated` | 是 | 回滚任务创建 |

596| `TaskCompleted` | 是 | 防止任务被标记为已完成 |

597| `ConfigChange` | 是 | 阻止配置更改生效(除了 `policy_settings`) |

598| `StopFailure` | 否 | 输出和退出代码被忽略 |

599| `PostToolUse` | 否 | 向 Claude 显示 stderr(工具已运行) |

600| `PostToolUseFailure` | 否 | 向 Claude 显示 stderr(工具已失败) |

601| `PostToolBatch` | 是 | 在下一个模型调用之前停止代理循环 |

602| `PermissionDenied` | 否 | 退出代码和 stderr 被忽略(拒绝已发生)。使用 JSON `hookSpecificOutput.retry: true` 告诉模型它可能重试 |

603| `Notification` | 否 | 仅向用户显示 stderr |

604| `SubagentStart` | 否 | 仅向用户显示 stderr |

605| `SessionStart` | 否 | 仅向用户显示 stderr |

606| `Setup` | 否 | 仅向用户显示 stderr |

607| `SessionEnd` | 否 | 仅向用户显示 stderr |

608| `CwdChanged` | 否 | 仅向用户显示 stderr |

609| `FileChanged` | 否 | 仅向用户显示 stderr |

610| `PreCompact` | 是 | 阻止压缩 |

611| `PostCompact` | 否 | 仅向用户显示 stderr |

612| `Elicitation` | 是 | 拒绝 elicitation |

613| `ElicitationResult` | 是 | 阻止响应(操作变为 decline) |

614| `WorktreeCreate` | 是 | 任何非零退出代码都会导致 worktree 创建失败 |

615| `WorktreeRemove` | 否 | 失败仅在调试模式下记录 |

616| `InstructionsLoaded` | 否 | 退出代码被忽略 |

617 

618### HTTP 响应处理

619 

620HTTP hooks 使用 HTTP 状态代码和响应体而不是退出代码和 stdout:

621 

622* **2xx 带空体**:成功,等同于退出代码 0 且无输出

623* **2xx 带纯文本体**:成功,文本作为上下文添加

624* **2xx 带 JSON 体**:成功,使用与命令 hooks 相同的[JSON 输出](#json-output)架构解析

625* **非 2xx 状态**:非阻止错误,执行继续

626* **连接失败或超时**:非阻止错误,执行继续

627 

628与命令 hooks 不同,HTTP hooks 无法仅通过状态代码发出阻止错误信号。要阻止工具调用或拒绝权限,返回 2xx 响应,其 JSON 体包含适当的决定字段。

629 

630### JSON 输出

631 

632退出代码让您允许或阻止,但 JSON 输出提供更细粒度的控制。与其使用代码 2 退出来阻止,不如退出 0 并将 JSON 对象打印到 stdout。Claude Code 从该 JSON 读取特定字段以控制行为,包括[决定控制](#decision-control)以阻止、允许或升级给用户。

633 

634<Note>

635 您必须为每个 hook 选择一种方法,而不是两种:要么单独使用退出代码进行信号传递,要么退出 0 并打印 JSON 以进行结构化控制。Claude Code 仅在退出 0 时处理 JSON。如果您退出 2,任何 JSON 都会被忽略。

636</Note>

637 

638您的 hook 的 stdout 必须仅包含 JSON 对象。如果您的 shell 配置文件在启动时打印文本,它可能会干扰 JSON 解析。请参阅故障排除指南中的[JSON 验证失败](/zh-CN/hooks-guide#json-validation-failed)。

639 

640Hook 输出注入到上下文中(`additionalContext`、`systemMessage` 或纯 stdout)的上限为 10,000 个字符。超过此限制的输出被保存到文件并替换为预览和文件路径,与大型工具结果的处理方式相同。

641 

642JSON 对象支持三种字段:

643 

644* **通用字段**,如 `continue`,在所有事件中工作。这些列在下表中。

645* **顶级 `decision` 和 `reason`** 由某些事件用于阻止或提供反馈。

646* **`hookSpecificOutput`** 是一个嵌套对象,用于需要更丰富控制的事件。它需要一个设置为事件名称的 `hookEventName` 字段。

647 

648| 字段 | 默认 | 描述 |

649| :--------------- | :------ | :--------------------------------------------------- |

650| `continue` | `true` | 如果为 `false`,Claude 在 hook 运行后完全停止处理。优先于任何事件特定的决定字段 |

651| `stopReason` | 无 | hook 运行后 `continue` 为 `false` 时向用户显示的消息。不向 Claude 显示 |

652| `suppressOutput` | `false` | 如果为 `true`,从调试日志中隐藏 stdout |

653| `systemMessage` | 无 | 向用户显示的警告消息 |

654 

655要无论事件类型如何都完全停止 Claude:

656 

657```json theme={null}

658{ "continue": false, "stopReason": "Build failed, fix errors before continuing" }

659```

660 

661#### 为 Claude 添加上下文

662 

663`additionalContext` 字段将来自您的 hook 的字符串传递到 Claude 的上下文窗口中。Claude Code 将字符串包装在系统提醒中,并将其插入到 hook 触发的对话点。Claude 在下一个模型请求时读取提醒,但它不会在界面中显示为聊天消息。

664 

665在 `hookSpecificOutput` 中返回 `additionalContext` 以及事件名称:

666 

667```json theme={null}

668{

669 "hookSpecificOutput": {

670 "hookEventName": "PostToolUse",

671 "additionalContext": "This file is generated. Edit src/schema.ts and run `bun generate` instead."

672 }

673}

674```

675 

676提醒出现的位置取决于事件:

677 

678* [SessionStart](#sessionstart)、[Setup](#setup) 和 [SubagentStart](#subagentstart):在对话开始,在第一个提示之前

679* [UserPromptSubmit](#userpromptsubmit) 和 [UserPromptExpansion](#userpromptexpansion):与提交的提示一起

680* [PreToolUse](#pretooluse)、[PostToolUse](#posttooluse)、[PostToolUseFailure](#posttoolusefailure) 和 [PostToolBatch](#posttoolbatch):在工具结果旁边

681 

682当多个 hooks 为同一事件返回 `additionalContext` 时,Claude 接收所有值。如果值超过 10,000 个字符,Claude Code 将完整文本写入会话目录中的文件,并将 Claude 传递文件路径以及简短预览。

683 

684使用 `additionalContext` 来获取 Claude 应该了解的有关您的环境当前状态或刚刚运行的操作的信息:

685 

686* **环境状态**:当前分支、部署目标或活跃的功能标志

687* **条件项目规则**:哪个测试命令适用于刚刚编辑的文件,哪些目录在此 worktree 中是只读的

688* **外部数据**:分配给您的开放问题、最近的 CI 结果、从内部服务获取的内容

689 

690对于永不改变的说明,更倾向于[CLAUDE.md](/zh-CN/memory)。它加载时无需运行脚本,是静态项目约定的标准位置。

691 

692将文本写成事实陈述而不是命令式系统指令。措辞如"部署目标是生产"或"此 repo 使用 `bun test`"读作项目信息。框架为带外系统命令的文本可能会触发 Claude 的提示注入防御,这会导致 Claude 将文本呈现给您,而不是将其视为上下文。

693 

694一旦注入,文本就会保存在会话成绩单中。对于 `PostToolUse` 或 `UserPromptSubmit` 等中期事件,使用 `--continue` 或 `--resume` 恢复会重放保存的文本,而不是为过去的轮次重新运行 hook,因此时间戳或提交 SHA 等值在恢复时变得陈旧。`SessionStart` hooks 在使用 `source` 设置为 `"resume"` 的 `--resume` 恢复时再次运行,因此它们可以刷新其上下文。

695 

696#### 决定控制

697 

698并非每个事件都支持通过 JSON 阻止或控制行为。支持的事件各自使用不同的字段集来表达该决定。在编写 hook 之前,使用此表作为快速参考:

699 

700| 事件 | 决定模式 | 关键字段 |

701| :-------------------------------------------------------------------------------------------------------------------------- | :---------------------- | :------------------------------------------------------------------------------------------------- |

702| UserPromptSubmit、UserPromptExpansion、PostToolUse、PostToolUseFailure、PostToolBatch、Stop、SubagentStop、ConfigChange、PreCompact | 顶级 `decision` | `decision: "block"`、`reason` |

703| TeammateIdle、TaskCreated、TaskCompleted | 退出代码或 `continue: false` | 退出代码 2 使用 stderr 反馈阻止操作。JSON `{"continue": false, "stopReason": "..."}` 也会完全停止队友,匹配 `Stop` hook 行为 |

704| PreToolUse | `hookSpecificOutput` | `permissionDecision`(allow/deny/ask/defer)、`permissionDecisionReason` |

705| PermissionRequest | `hookSpecificOutput` | `decision.behavior`(allow/deny) |

706| PermissionDenied | `hookSpecificOutput` | `retry: true` 告诉模型它可能重试被拒绝的工具调用 |

707| WorktreeCreate | 路径返回 | 命令 hook 在 stdout 上打印路径;HTTP hook 通过 `hookSpecificOutput.worktreePath` 返回。Hook 失败或缺少路径会导致创建失败 |

708| Elicitation | `hookSpecificOutput` | `action`(accept/decline/cancel)、`content`(form 字段值用于 accept) |

709| ElicitationResult | `hookSpecificOutput` | `action`(accept/decline/cancel)、`content`(form 字段值覆盖) |

710| WorktreeRemove、Notification、SessionEnd、PostCompact、InstructionsLoaded、StopFailure、CwdChanged、FileChanged | 无 | 无决定控制。用于日志记录或清理等副作用 |

711 

712以下是每种模式的实际示例:

713 

714<Tabs>

715 <Tab title="顶级决定">

716 由 `UserPromptSubmit`、`UserPromptExpansion`、`PostToolUse`、`PostToolUseFailure`、`PostToolBatch`、`Stop`、`SubagentStop`、`ConfigChange` 和 `PreCompact` 使用。唯一的值是 `"block"`。要允许操作继续,从您的 JSON 中省略 `decision`,或退出 0 而不带任何 JSON:

717 

718 ```json theme={null}

719 {

720 "decision": "block",

721 "reason": "Test suite must pass before proceeding"

722 }

723 ```

724 </Tab>

725 

726 <Tab title="PreToolUse">

727 使用 `hookSpecificOutput` 以获得更丰富的控制:允许、拒绝或升级给用户。您还可以在运行前修改工具输入或为 Claude 注入额外上下文。有关完整的选项集,请参阅[PreToolUse 决定控制](#pretooluse-decision-control)。

728 

729 ```json theme={null}

730 {

731 "hookSpecificOutput": {

732 "hookEventName": "PreToolUse",

733 "permissionDecision": "deny",

734 "permissionDecisionReason": "Database writes are not allowed"

735 }

736 }

737 ```

738 </Tab>

739 

740 <Tab title="PermissionRequest">

741 使用 `hookSpecificOutput` 代表用户允许或拒绝权限请求。允许时,您还可以修改工具的输入或应用权限规则,以便用户不会再次被提示。有关完整的选项集,请参阅[PermissionRequest 决定控制](#permissionrequest-decision-control)。

742 

743 ```json theme={null}

744 {

745 "hookSpecificOutput": {

746 "hookEventName": "PermissionRequest",

747 "decision": {

748 "behavior": "allow",

749 "updatedInput": {

750 "command": "npm run lint"

751 }

752 }

753 }

754 }

755 ```

756 </Tab>

757</Tabs>

758 

759有关扩展示例,包括 Bash 命令验证、提示过滤和自动批准脚本,请参阅指南中的[您可以自动化的内容](/zh-CN/hooks-guide#what-you-can-automate)以及[Bash 命令验证器参考实现](https://github.com/anthropics/claude-code/blob/main/examples/hooks/bash_command_validator_example.py)。

760 

761## Hook 事件

762 

763每个事件对应于 Claude Code 生命周期中 hooks 可以运行的一个点。下面的部分按照生命周期排序:从会话设置通过代理循环到会话结束。每个部分描述事件何时触发、它支持的匹配器、它接收的 JSON 输入以及如何通过输出控制行为。

764 

765### SessionStart

766 

767在 Claude Code 启动新会话或恢复现有会话时运行。用于加载开发上下文,如现有问题或代码库的最近更改,或设置环境变量。对于不需要脚本的静态上下文,请改用[CLAUDE.md](/zh-CN/memory)。

768 

769SessionStart 在每个会话上运行,因此保持这些 hooks 快速。仅支持 `type: "command"` 和 `type: "mcp_tool"` hooks。

770 

771匹配器值对应于会话的启动方式:

772 

773| 匹配器 | 何时触发 |

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

775| `startup` | 新会话 |

776| `resume` | `--resume`、`--continue` 或 `/resume` |

777| `clear` | `/clear` |

778| `compact` | 自动或手动压缩 |

779 

780#### SessionStart 输入

781 

782除了[通用输入字段](#common-input-fields)外,SessionStart hooks 还接收 `source`、`model` 和可选的 `agent_type`。`source` 字段指示会话如何启动:新会话为 `"startup"`,恢复会话为 `"resume"`,`/clear` 后为 `"clear"`,压缩后为 `"compact"`。`model` 字段包含模型标识符。如果您使用 `claude --agent <name>` 启动 Claude Code,`agent_type` 字段包含代理名称。

783 

784```json theme={null}

785{

786 "session_id": "abc123",

787 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",

788 "cwd": "/Users/...",

789 "hook_event_name": "SessionStart",

790 "source": "startup",

791 "model": "claude-sonnet-4-6"

792}

793```

794 

795#### SessionStart 决定控制

796 

797您的 hook 脚本打印到 stdout 的任何文本都作为 Claude 的上下文添加。除了所有 hooks 可用的[JSON 输出字段](#json-output)外,您还可以返回这些事件特定字段:

798 

799| 字段 | 描述 |

800| :------------------ | :-------------------------------------------------------------------------------------------------------- |

801| `additionalContext` | 添加到 Claude 上下文开始处的字符串,在第一个提示之前。请参阅[为 Claude 添加上下文](#add-context-for-claude)了解文本如何传递、放入什么内容以及恢复的会话如何处理过去的值 |

802 

803```json theme={null}

804{

805 "hookSpecificOutput": {

806 "hookEventName": "SessionStart",

807 "additionalContext": "Current branch: feat/auth-refactor\nUncommitted changes: src/auth.ts, src/login.tsx\nActive issue: #4211 Migrate to OAuth2"

808 }

809}

810```

811 

812由于纯 stdout 已经为此事件到达 Claude,仅加载上下文的 hook 可以直接打印到 stdout 而无需构建 JSON。当您需要将上下文与其他字段(如 `suppressOutput`)结合时,使用 JSON 形式。

813 

814#### 持久化环境变量

815 

816SessionStart hooks 可以访问 `CLAUDE_ENV_FILE` 环境变量,该变量提供一个文件路径,您可以在其中为后续 Bash 命令持久化环境变量。

817 

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

819 

820```bash theme={null}

821#!/bin/bash

822 

823if [ -n "$CLAUDE_ENV_FILE" ]; then

824 echo 'export NODE_ENV=production' >> "$CLAUDE_ENV_FILE"

825 echo 'export DEBUG_LOG=true' >> "$CLAUDE_ENV_FILE"

826 echo 'export PATH="$PATH:./node_modules/.bin"' >> "$CLAUDE_ENV_FILE"

827fi

828 

829exit 0

830```

831 

832要捕获设置命令中的所有环境更改,请比较之前和之后导出的变量:

833 

834```bash theme={null}

835#!/bin/bash

836 

837ENV_BEFORE=$(export -p | sort)

838 

839# 运行修改环境的设置命令

840source ~/.nvm/nvm.sh

841nvm use 20

842 

843if [ -n "$CLAUDE_ENV_FILE" ]; then

844 ENV_AFTER=$(export -p | sort)

845 comm -13 <(echo "$ENV_BEFORE") <(echo "$ENV_AFTER") >> "$CLAUDE_ENV_FILE"

846fi

847 

848exit 0

849```

850 

851写入此文件的任何变量都将在会话期间 Claude Code 执行的所有后续 Bash 命令中可用。

852 

853<Note>

854 `CLAUDE_ENV_FILE` 可用于 SessionStart、[Setup](#setup)、[CwdChanged](#cwdchanged) 和 [FileChanged](#filechanged) hooks。其他 hook 类型无法访问此变量。

855</Note>

856 

857### Setup

858 

859仅当您使用 `--init-only` 启动 Claude Code,或在打印模式(`-p`)中使用 `--init` 或 `--maintenance` 时触发。它不在正常启动时触发。使用它进行一次性依赖安装或您从 CI 或脚本显式触发的计划清理,与正常会话启动分开。对于每个会话的初始化,请改用[SessionStart](#sessionstart)。

860 

861匹配器值对应于触发 hook 的 CLI 标志:

862 

863| 匹配器 | 何时触发 |

864| :------------ | :---------------------------------------- |

865| `init` | `claude --init-only` 或 `claude -p --init` |

866| `maintenance` | `claude -p --maintenance` |

867 

868`--init-only` 运行 Setup hooks 和 SessionStart hooks(带 `startup` 匹配器),然后退出而不启动对话。`--init` 和 `--maintenance` 仅在与 `-p`(打印模式)结合时触发 Setup hooks;在交互式会话中,这两个标志目前不触发 Setup hooks。

869 

870因为 Setup 不在每次启动时触发,需要安装依赖的插件不能仅依赖 Setup。实际的模式是在首次使用时检查依赖,如果缺失则安装,例如测试 `${CLAUDE_PLUGIN_DATA}/node_modules` 的 hook 或 skill,如果不存在则运行 `npm install`。请参阅[持久数据目录](/zh-CN/plugins-reference#persistent-data-directory)了解在何处存储已安装的依赖。

871 

872#### Setup 输入

873 

874除了[通用输入字段](#common-input-fields)外,Setup hooks 还接收一个 `trigger` 字段,设置为 `"init"` 或 `"maintenance"`:

875 

876```json theme={null}

877{

878 "session_id": "abc123",

879 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",

880 "cwd": "/Users/...",

881 "hook_event_name": "Setup",

882 "trigger": "init"

883}

884```

885 

886#### Setup 决定控制

887 

888Setup hooks 无法阻止。退出代码 2 时,stderr 向用户显示;任何其他非零退出代码时,stderr 仅在您使用 `--verbose` 启动时出现。在两种情况下,执行都继续。要将信息传入 Claude 的上下文,在 JSON 输出中返回 `additionalContext`;纯 stdout 仅写入调试日志。除了所有 hooks 可用的[JSON 输出字段](#json-output)外,您还可以返回这些事件特定字段:

889 

890| 字段 | 描述 |

891| :------------------ | :-------------------------------- |

892| `additionalContext` | 添加到 Claude 上下文的字符串。多个 hooks 的值被连接 |

893 

894```json theme={null}

895{

896 "hookSpecificOutput": {

897 "hookEventName": "Setup",

898 "additionalContext": "Dependencies installed: node_modules, .venv"

899 }

900}

901```

902 

903Setup hooks 可以访问 `CLAUDE_ENV_FILE`。写入该文件的变量持久化到会话的后续 Bash 命令中,就像在[SessionStart hooks](#persist-environment-variables)中一样。仅支持 `type: "command"` 和 `type: "mcp_tool"` hooks。

904 

905### InstructionsLoaded

906 

907当 `CLAUDE.md` 或 `.claude/rules/*.md` 文件加载到上下文中时触发。此事件在会话启动时为急切加载的文件触发,稍后当文件被懒加载时再次触发,例如当 Claude 访问包含嵌套 `CLAUDE.md` 的子目录或条件规则与 `paths:` frontmatter 匹配时。该 hook 不支持阻止或决定控制。它异步运行以用于可观测性目的。

908 

909匹配器针对 `load_reason` 运行。例如,使用 `"matcher": "session_start"` 仅对会话启动时加载的文件触发,或使用 `"matcher": "path_glob_match|nested_traversal"` 仅对懒加载触发。

910 

911#### InstructionsLoaded 输入

912 

913除了[通用输入字段](#common-input-fields)外,InstructionsLoaded hooks 还接收这些字段:

914 

915| 字段 | 描述 |

916| :------------------ | :--------------------------------------------------------------------------------------------------------------------------- |

917| `file_path` | 加载的指令文件的绝对路径 |

918| `memory_type` | 文件的范围:`"User"`、`"Project"`、`"Local"` 或 `"Managed"` |

919| `load_reason` | 文件被加载的原因:`"session_start"`、`"nested_traversal"`、`"path_glob_match"`、`"include"` 或 `"compact"`。`"compact"` 值在压缩事件后重新加载指令文件时触发 |

920| `globs` | 文件 `paths:` frontmatter 中的路径 glob 模式(如果有)。仅对 `path_glob_match` 加载存在 |

921| `trigger_file_path` | 触发此加载的文件的路径,用于懒加载 |

922| `parent_file_path` | 包含此文件的父指令文件的路径,用于 `include` 加载 |

923 

924```json theme={null}

925{

926 "session_id": "abc123",

927 "transcript_path": "/Users/.../.claude/projects/.../transcript.jsonl",

928 "cwd": "/Users/my-project",

929 "hook_event_name": "InstructionsLoaded",

930 "file_path": "/Users/my-project/CLAUDE.md",

931 "memory_type": "Project",

932 "load_reason": "session_start"

933}

934```

935 

936#### InstructionsLoaded 决定控制

937 

938InstructionsLoaded hooks 没有决定控制。它们无法阻止或修改指令加载。使用此事件进行审计日志记录、合规性跟踪或可观测性。

939 

940### UserPromptSubmit

941 

942在用户提交提示时运行,在 Claude 处理之前。这允许您根据提示/对话添加额外上下文、验证提示或阻止某些类型的提示。

943 

944#### UserPromptSubmit 输入

945 

946除了[通用输入字段](#common-input-fields)外,UserPromptSubmit hooks 还接收包含用户提交的文本的 `prompt` 字段。

947 

948```json theme={null}

949{

950 "session_id": "abc123",

951 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",

952 "cwd": "/Users/...",

953 "permission_mode": "default",

954 "hook_event_name": "UserPromptSubmit",

955 "prompt": "Write a function to calculate the factorial of a number"

956}

957```

958 

959#### UserPromptSubmit 决定控制

960 

961`UserPromptSubmit` hooks 可以控制用户提示是否被处理并添加上下文。所有[JSON 输出字段](#json-output)都可用。

962 

963有两种方法可以在退出代码 0 时向对话添加上下文:

964 

965* **纯文本 stdout**:写入 stdout 的任何非 JSON 文本都作为上下文添加

966* **带 `additionalContext` 的 JSON**:使用下面的 JSON 格式以获得更多控制。`additionalContext` 字段作为上下文添加

967 

968纯 stdout 在成绩单中显示为 hook 输出。`additionalContext` 字段更谨慎地添加。

969 

970要阻止提示,返回一个 JSON 对象,其中 `decision` 设置为 `"block"`:

971 

972| 字段 | 描述 |

973| :------------------ | :----------------------------------------------------------------------- |

974| `decision` | `"block"` 防止提示被处理并从上下文中删除。省略以允许提示继续 |

975| `reason` | 当 `decision` 为 `"block"` 时向用户显示。不添加到上下文 |

976| `additionalContext` | 添加到 Claude 上下文的字符串,与提交的提示一起。请参阅[为 Claude 添加上下文](#add-context-for-claude) |

977| `sessionTitle` | 设置会话标题,与 `/rename` 相同的效果。使用此根据提示内容自动命名会话 |

978 

979```json theme={null}

980{

981 "decision": "block",

982 "reason": "Explanation for decision",

983 "hookSpecificOutput": {

984 "hookEventName": "UserPromptSubmit",

985 "additionalContext": "My additional context here",

986 "sessionTitle": "My session title"

987 }

988}

989```

990 

991<Note>

992 JSON 格式对于简单用例不是必需的。要添加上下文,您可以使用退出代码 0 将纯文本打印到 stdout。当您需要阻止提示或想要更结构化的控制时,使用 JSON。

993</Note>

994 

995### UserPromptExpansion

996 

997当用户输入的斜杠命令在到达 Claude 之前展开为提示时运行。使用此来阻止特定命令的直接调用、为特定 skill 注入上下文或记录用户调用哪些命令。例如,匹配 `deploy` 的 hook 可以阻止 `/deploy`,除非存在批准文件,或匹配审查 skill 的 hook 可以将团队的审查清单附加为 `additionalContext`。

998 

999此事件涵盖 `PreToolUse` 不涵盖的路径:匹配 `Skill` 工具的 `PreToolUse` hook 仅在 Claude 调用工具时触发,但直接输入 `/skillname` 绕过 `PreToolUse`。`UserPromptExpansion` 在该直接路径上触发。

1000 

1001在 `command_name` 上匹配。留空匹配器以对每个提示类型斜杠命令触发。

1002 

1003#### UserPromptExpansion 输入

1004 

1005除了[通用输入字段](#common-input-fields)外,UserPromptExpansion hooks 还接收 `expansion_type`、`command_name`、`command_args`、`command_source` 和原始 `prompt` 字符串。`expansion_type` 字段对于 skill 和自定义命令为 `slash_command`,或对于 MCP 服务器提示为 `mcp_prompt`。

1006 

1007```json theme={null}

1008{

1009 "session_id": "abc123",

1010 "transcript_path": "/Users/.../00893aaf.jsonl",

1011 "cwd": "/Users/...",

1012 "permission_mode": "default",

1013 "hook_event_name": "UserPromptExpansion",

1014 "expansion_type": "slash_command",

1015 "command_name": "example-skill",

1016 "command_args": "arg1 arg2",

1017 "command_source": "plugin",

1018 "prompt": "/example-skill arg1 arg2"

1019}

1020```

1021 

1022#### UserPromptExpansion 决定控制

1023 

1024`UserPromptExpansion` hooks 可以阻止展开或添加上下文。所有[JSON 输出字段](#json-output)都可用。

1025 

1026| 字段 | 描述 |

1027| :------------------ | :----------------------------------------------------------------------- |

1028| `decision` | `"block"` 防止斜杠命令展开。省略以允许它继续 |

1029| `reason` | 当 `decision` 为 `"block"` 时向用户显示 |

1030| `additionalContext` | 添加到 Claude 上下文的字符串,与展开的提示一起。请参阅[为 Claude 添加上下文](#add-context-for-claude) |

1031 

1032```json theme={null}

1033{

1034 "decision": "block",

1035 "reason": "This slash command is not available",

1036 "hookSpecificOutput": {

1037 "hookEventName": "UserPromptExpansion",

1038 "additionalContext": "Additional context for this expansion"

1039 }

1040}

1041```

1042 

1043### PreToolUse

1044 

1045在 Claude 创建工具参数后和处理工具调用之前运行。在工具名称上匹配:`Bash`、`Edit`、`Write`、`Read`、`Glob`、`Grep`、`Agent`、`WebFetch`、`WebSearch`、`AskUserQuestion`、`ExitPlanMode` 和任何[MCP 工具名称](#match-mcp-tools)。

1046 

1047使用[PreToolUse 决定控制](#pretooluse-decision-control)来允许、拒绝、询问或延迟工具调用。

1048 

1049#### PreToolUse 输入

1050 

1051除了[通用输入字段](#common-input-fields)外,PreToolUse hooks 还接收 `tool_name`、`tool_input` 和 `tool_use_id`。`tool_input` 字段取决于工具:

1052 

1053##### Bash

1054 

1055执行 shell 命令。

1056 

1057| 字段 | 类型 | 示例 | 描述 |

1058| :------------------ | :------ | :----------------- | :------------ |

1059| `command` | string | `"npm test"` | 要执行的 shell 命令 |

1060| `description` | string | `"Run test suite"` | 命令执行操作的可选描述 |

1061| `timeout` | number | `120000` | 可选超时(毫秒) |

1062| `run_in_background` | boolean | `false` | 是否在后台运行命令 |

1063 

1064##### Write

1065 

1066创建或覆盖文件。

1067 

1068| 字段 | 类型 | 示例 | 描述 |

1069| :---------- | :----- | :-------------------- | :---------- |

1070| `file_path` | string | `"/path/to/file.txt"` | 要写入的文件的绝对路径 |

1071| `content` | string | `"file content"` | 要写入文件的内容 |

1072 

1073##### Edit

1074 

1075替换现有文件中的字符串。

1076 

1077| 字段 | 类型 | 示例 | 描述 |

1078| :------------ | :------ | :-------------------- | :---------- |

1079| `file_path` | string | `"/path/to/file.txt"` | 要编辑的文件的绝对路径 |

1080| `old_string` | string | `"original text"` | 要查找和替换的文本 |

1081| `new_string` | string | `"replacement text"` | 替换文本 |

1082| `replace_all` | boolean | `false` | 是否替换所有出现 |

1083 

1084##### Read

1085 

1086读取文件内容。

1087 

1088| 字段 | 类型 | 示例 | 描述 |

1089| :---------- | :----- | :-------------------- | :---------- |

1090| `file_path` | string | `"/path/to/file.txt"` | 要读取的文件的绝对路径 |

1091| `offset` | number | `10` | 可选的开始读取的行号 |

1092| `limit` | number | `50` | 可选的要读取的行数 |

1093 

1094##### Glob

1095 

1096查找与 glob 模式匹配的文件。

1097 

1098| 字段 | 类型 | 示例 | 描述 |

1099| :-------- | :----- | :--------------- | :---------------- |

1100| `pattern` | string | `"**/*.ts"` | 要匹配文件的 Glob 模式 |

1101| `path` | string | `"/path/to/dir"` | 可选的搜索目录。默认为当前工作目录 |

1102 

1103##### Grep

1104 

1105使用正则表达式搜索文件内容。

1106 

1107| 字段 | 类型 | 示例 | 描述 |

1108| :------------ | :------ | :--------------- | :------------------------------------------------------------------------ |

1109| `pattern` | string | `"TODO.*fix"` | 要搜索的正则表达式模式 |

1110| `path` | string | `"/path/to/dir"` | 可选的要搜索的文件或目录 |

1111| `glob` | string | `"*.ts"` | 可选的 glob 模式以过滤文件 |

1112| `output_mode` | string | `"content"` | `"content"`、`"files_with_matches"` 或 `"count"`。默认为 `"files_with_matches"` |

1113| `-i` | boolean | `true` | 不区分大小写的搜索 |

1114| `multiline` | boolean | `false` | 启用多行匹配 |

1115 

1116##### WebFetch

1117 

1118获取和处理 web 内容。

1119 

1120| 字段 | 类型 | 示例 | 描述 |

1121| :------- | :----- | :---------------------------- | :----------- |

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

1123| `prompt` | string | `"Extract the API endpoints"` | 在获取的内容上运行的提示 |

1124 

1125##### WebSearch

1126 

1127搜索网络。

1128 

1129| 字段 | 类型 | 示例 | 描述 |

1130| :---------------- | :----- | :----------------------------- | :------------- |

1131| `query` | string | `"react hooks best practices"` | 搜索查询 |

1132| `allowed_domains` | array | `["docs.example.com"]` | 可选:仅包含来自这些域的结果 |

1133| `blocked_domains` | array | `["spam.example.com"]` | 可选:排除来自这些域的结果 |

1134 

1135##### Agent

1136 

1137生成一个[subagent](/zh-CN/sub-agents)。

1138 

1139| 字段 | 类型 | 示例 | 描述 |

1140| :-------------- | :----- | :------------------------- | :------------ |

1141| `prompt` | string | `"Find all API endpoints"` | 代理要执行的任务 |

1142| `description` | string | `"Find API endpoints"` | 任务的简短描述 |

1143| `subagent_type` | string | `"Explore"` | 要使用的专门代理的类型 |

1144| `model` | string | `"sonnet"` | 可选的模型别名以覆盖默认值 |

1145 

1146##### AskUserQuestion

1147 

1148向用户提出一到四个多选题。

1149 

1150| 字段 | 类型 | 示例 | 描述 |

1151| :---------- | :----- | :----------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------- |

1152| `questions` | array | `[{"question": "Which framework?", "header": "Framework", "options": [{"label": "React"}], "multiSelect": false}]` | 要呈现的问题,每个都有 `question` 字符串、短 `header`、`options` 数组和可选的 `multiSelect` 标志 |

1153| `answers` | object | `{"Which framework?": "React"}` | 可选。将问题文本映射到选定的选项标签。多选答案用逗号连接标签。Claude 不设置此字段;通过 `updatedInput` 提供它以以编程方式回答 |

1154 

1155#### PreToolUse 决定控制

1156 

1157`PreToolUse` hooks 可以控制工具调用是否继续。与使用顶级 `decision` 字段的其他 hooks 不同,PreToolUse 在 `hookSpecificOutput` 对象内返回其决定。这给了它更丰富的控制:四个结果(允许、拒绝、询问或延迟)加上在执行前修改工具输入的能力。

1158 

1159| 字段 | 描述 |

1160| :------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------- |

1161| `permissionDecision` | `"allow"` 绕过权限提示。`"deny"` 防止工具调用。`"ask"` 提示用户确认。`"defer"` 优雅地退出,以便工具稍后可以恢复。[拒绝和询问规则](/zh-CN/permissions#manage-permissions)在 hook 返回什么时仍然被评估 |

1162| `permissionDecisionReason` | 对于 `"allow"` 和 `"ask"`,向用户显示但不向 Claude 显示。对于 `"deny"`,向 Claude 显示。对于 `"defer"`,被忽略 |

1163| `updatedInput` | 在执行前修改工具的输入参数。替换整个输入对象,因此包括未修改的字段以及修改后的字段。与 `"allow"` 结合以自动批准,或与 `"ask"` 结合以向用户显示修改后的输入。对于 `"defer"`,被忽略 |

1164| `additionalContext` | 在工具执行前添加到 Claude 上下文的字符串。对于 `"defer"`,被忽略。请参阅[为 Claude 添加上下文](#add-context-for-claude) |

1165 

1166当多个 PreToolUse hooks 返回不同的决定时,优先级是 `deny` > `defer` > `ask` > `allow`。

1167 

1168当 hook 返回 `"ask"` 时,向用户显示的权限提示包括一个标签,标识 hook 来自何处:例如,`[User]`、`[Project]`、`[Plugin]` 或 `[Local]`。这帮助用户了解哪个配置源正在请求确认。

1169 

1170```json theme={null}

1171{

1172 "hookSpecificOutput": {

1173 "hookEventName": "PreToolUse",

1174 "permissionDecision": "allow",

1175 "permissionDecisionReason": "My reason here",

1176 "updatedInput": {

1177 "field_to_modify": "new value"

1178 },

1179 "additionalContext": "Current environment: production. Proceed with caution."

1180 }

1181}

1182```

1183 

1184`AskUserQuestion` 和 `ExitPlanMode` 需要用户交互,通常在[非交互模式](/zh-CN/headless)中使用 `-p` 标志时阻止。返回 `permissionDecision: "allow"` 以及 `updatedInput` 满足该要求:hook 从 stdin 读取工具的输入,通过您自己的 UI 收集答案,并在 `updatedInput` 中返回它,以便工具运行而不提示。仅返回 `"allow"` 对这些工具不足够。对于 `AskUserQuestion`,回显原始 `questions` 数组并添加一个[`answers`](#askuserquestion)对象,将每个问题的文本映射到选定的答案。

1185 

1186<Note>

1187 PreToolUse 之前使用顶级 `decision` 和 `reason` 字段,但这些对此事件已弃用。改用 `hookSpecificOutput.permissionDecision` 和 `hookSpecificOutput.permissionDecisionReason`。已弃用的值 `"approve"` 和 `"block"` 映射到 `"allow"` 和 `"deny"`。PostToolUse 和 Stop 等其他事件继续使用顶级 `decision` 和 `reason` 作为其当前格式。

1188</Note>

1189 

1190#### 延迟工具调用以供稍后使用

1191 

1192`"defer"` 用于运行 `claude -p` 作为子进程并读取其 JSON 输出的集成,例如 Agent SDK 应用或构建在 Claude Code 之上的自定义 UI。它让该调用进程在工具调用处暂停 Claude,通过其自己的界面收集输入,并从中断处恢复。Claude Code 仅在[非交互模式](/zh-CN/headless)中使用 `-p` 标志时遵守此值。在交互式会话中,它记录警告并忽略 hook 结果。

1193 

1194<Note>

1195 `defer` 值需要 Claude Code v2.1.89 或更高版本。早期版本不识别它,工具通过正常权限流程进行。

1196</Note>

1197 

1198`AskUserQuestion` 工具是典型情况:Claude 想要询问用户一些事情,但没有终端来回答。往返工作如下:

1199 

12001. Claude 调用 `AskUserQuestion`。`PreToolUse` hook 触发。

12012. Hook 返回 `permissionDecision: "defer"`。工具不执行。进程以 `stop_reason: "tool_deferred"` 退出,待处理的工具调用保留在成绩单中。

12023. 调用进程从 SDK 结果读取 `deferred_tool_use`,在其自己的 UI 中显示问题,并等待答案。

12034. 调用进程运行 `claude -p --resume <session-id>`。相同的工具调用再次触发 `PreToolUse`。

12045. Hook 返回 `permissionDecision: "allow"` 和 `updatedInput` 中的答案。工具执行,Claude 继续。

1205 

1206`deferred_tool_use` 字段携带工具的 `id`、`name` 和 `input`。`input` 是 Claude 为工具调用生成的参数,在执行前捕获:

1207 

1208```json theme={null}

1209{

1210 "type": "result",

1211 "subtype": "success",

1212 "stop_reason": "tool_deferred",

1213 "session_id": "abc123",

1214 "deferred_tool_use": {

1215 "id": "toolu_01abc",

1216 "name": "AskUserQuestion",

1217 "input": { "questions": [{ "question": "Which framework?", "header": "Framework", "options": [{"label": "React"}, {"label": "Vue"}], "multiSelect": false }] }

1218 }

1219}

1220```

1221 

1222没有超时或重试限制。会话保留在磁盘上,直到您恢复它,受到 [`cleanupPeriodDays`](/zh-CN/settings#available-settings) 保留扫描的约束,该扫描默认在 30 天后删除会话文件。如果恢复时答案还没有准备好,hook 可以再次返回 `"defer"`,进程以相同的方式退出。调用进程控制何时通过最终返回 `"allow"` 或 `"deny"` 从 hook 中断循环。

1223 

1224`"defer"` 仅在 Claude 在轮次中进行单个工具调用时有效。如果 Claude 一次进行多个工具调用,`"defer"` 被忽略并显示警告,工具通过正常权限流程进行。约束存在是因为恢复只能重新运行一个工具:没有办法延迟一个调用而不留下其他调用未解决。

1225 

1226如果恢复时延迟的工具不再可用,进程以 `stop_reason: "tool_deferred_unavailable"` 和 `is_error: true` 退出,在 hook 触发之前。这发生在为恢复的会话未连接提供工具的 MCP 服务器时。`deferred_tool_use` 有效负载仍然包括,以便您可以识别哪个工具丢失。

1227 

1228<Warning>

1229 `--resume` 不会从先前的会话恢复权限模式。在恢复时传递与工具被延迟时活跃的相同 `--permission-mode` 标志。Claude Code 在模式不同时记录警告。

1230</Warning>

1231 

1232### PermissionRequest

1233 

1234在向用户显示权限对话框时运行。使用[PermissionRequest 决定控制](#permissionrequest-decision-control)代表用户允许或拒绝。

1235 

1236在工具名称上匹配,与 PreToolUse 相同的值。

1237 

1238#### PermissionRequest 输入

1239 

1240PermissionRequest hooks 接收 `tool_name` 和 `tool_input` 字段,如 PreToolUse hooks,但没有 `tool_use_id`。可选的 `permission_suggestions` 数组包含用户通常在权限对话框中看到的"总是允许"选项。区别在于 hook 何时触发:PermissionRequest hooks 在权限对话框即将显示给用户时运行,而 PreToolUse hooks 在工具执行前运行,无论权限状态如何。

1241 

1242```json theme={null}

1243{

1244 "session_id": "abc123",

1245 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",

1246 "cwd": "/Users/...",

1247 "permission_mode": "default",

1248 "hook_event_name": "PermissionRequest",

1249 "tool_name": "Bash",

1250 "tool_input": {

1251 "command": "rm -rf node_modules",

1252 "description": "Remove node_modules directory"

1253 },

1254 "permission_suggestions": [

1255 {

1256 "type": "addRules",

1257 "rules": [{ "toolName": "Bash", "ruleContent": "rm -rf node_modules" }],

1258 "behavior": "allow",

1259 "destination": "localSettings"

1260 }

1261 ]

1262}

1263```

1264 

1265#### PermissionRequest 决定控制

1266 

1267`PermissionRequest` hooks 可以允许或拒绝权限请求。除了所有 hooks 可用的[JSON 输出字段](#json-output)外,您的 hook 脚本可以返回一个 `decision` 对象,其中包含这些事件特定字段:

1268 

1269| 字段 | 描述 |

1270| :------------------- | :------------------------------------------------------------------------------------------------------------------ |

1271| `behavior` | `"allow"` 授予权限,`"deny"` 拒绝它。[拒绝和询问规则](/zh-CN/permissions#manage-permissions)仍然被评估,所以返回 `"allow"` 的 hook 不会覆盖匹配的拒绝规则 |

1272| `updatedInput` | 仅对 `"allow"`:在执行前修改工具的输入参数。替换整个输入对象,因此包括未修改的字段以及修改后的字段。修改后的输入会重新针对拒绝和询问规则进行评估 |

1273| `updatedPermissions` | 仅对 `"allow"`:应用权限规则更新的[权限更新条目](#permission-update-entries)数组,例如添加允许规则或更改会话权限模式 |

1274| `message` | 仅对 `"deny"`:告诉 Claude 为什么权限被拒绝 |

1275| `interrupt` | 仅对 `"deny"`:如果为 `true`,停止 Claude |

1276 

1277```json theme={null}

1278{

1279 "hookSpecificOutput": {

1280 "hookEventName": "PermissionRequest",

1281 "decision": {

1282 "behavior": "allow",

1283 "updatedInput": {

1284 "command": "npm run lint"

1285 }

1286 }

1287 }

1288}

1289```

1290 

1291#### 权限更新条目

1292 

1293`updatedPermissions` 输出字段和[`permission_suggestions` 输入字段](#permissionrequest-input)都使用相同的条目对象数组。每个条目都有一个 `type` 来确定其其他字段,以及一个 `destination` 来控制更改的写入位置。

1294 

1295| `type` | 字段 | 效果 |

1296| :------------------ | :------------------------------- | :------------------------------------------------------------------------------------------------------------------- |

1297| `addRules` | `rules`、`behavior`、`destination` | 添加权限规则。`rules` 是 `{toolName, ruleContent?}` 对象的数组。省略 `ruleContent` 以匹配整个工具。`behavior` 是 `"allow"`、`"deny"` 或 `"ask"` |

1298| `replaceRules` | `rules`、`behavior`、`destination` | 用提供的 `rules` 替换 `destination` 处给定 `behavior` 的所有规则 |

1299| `removeRules` | `rules`、`behavior`、`destination` | 移除给定 `behavior` 的匹配规则 |

1300| `setMode` | `mode`、`destination` | 更改权限模式。有效模式为 `default`、`acceptEdits`、`dontAsk`、`bypassPermissions` 和 `plan` |

1301| `addDirectories` | `directories`、`destination` | 添加工作目录。`directories` 是路径字符串的数组 |

1302| `removeDirectories` | `directories`、`destination` | 移除工作目录 |

1303 

1304<Note>

1305 `setMode` 与 `bypassPermissions` 仅在会话已启动时生效,绕过模式已可用:`--dangerously-skip-permissions`、`--permission-mode bypassPermissions`、`--allow-dangerously-skip-permissions` 或设置中的 `permissions.defaultMode: "bypassPermissions"`,且模式未被 [`permissions.disableBypassPermissionsMode`](/zh-CN/permissions#managed-settings) 禁用。否则更新是无操作。`bypassPermissions` 无论 `destination` 如何都永远不会作为 `defaultMode` 持久化。

1306</Note>

1307 

1308每个条目上的 `destination` 字段确定更改是保留在内存中还是持久化到设置文件。

1309 

1310| `destination` | 写入 |

1311| :---------------- | :---------------------------- |

1312| `session` | 仅在内存中,会话结束时丢弃 |

1313| `localSettings` | `.claude/settings.local.json` |

1314| `projectSettings` | `.claude/settings.json` |

1315| `userSettings` | `~/.claude/settings.json` |

1316 

1317Hook 可以回显它接收的 `permission_suggestions` 之一作为其自己的 `updatedPermissions` 输出,这等同于用户在对话框中选择该"总是允许"选项。

1318 

1319### PostToolUse

1320 

1321在工具成功完成后立即运行。

1322 

1323在工具名称上匹配,与 PreToolUse 相同的值。

1324 

1325#### PostToolUse 输入

1326 

1327`PostToolUse` hooks 在工具已经成功执行后触发。输入包括 `tool_input`(发送给工具的参数)和 `tool_response`(它返回的结果)。两者的确切架构取决于工具。

1328 

1329```json theme={null}

1330{

1331 "session_id": "abc123",

1332 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",

1333 "cwd": "/Users/...",

1334 "permission_mode": "default",

1335 "hook_event_name": "PostToolUse",

1336 "tool_name": "Write",

1337 "tool_input": {

1338 "file_path": "/path/to/file.txt",

1339 "content": "file content"

1340 },

1341 "tool_response": {

1342 "filePath": "/path/to/file.txt",

1343 "success": true

1344 },

1345 "tool_use_id": "toolu_01ABC123...",

1346 "duration_ms": 12

1347}

1348```

1349 

1350| 字段 | 描述 |

1351| :------------ | :--------------------------------------------- |

1352| `duration_ms` | 可选。工具执行时间(毫秒)。不包括权限提示和 PreToolUse hooks 中花费的时间 |

1353 

1354#### PostToolUse 决定控制

1355 

1356`PostToolUse` hooks 可以在工具执行后向 Claude 提供反馈。除了所有 hooks 可用的[JSON 输出字段](#json-output)外,您的 hook 脚本可以返回这些事件特定字段:

1357 

1358| 字段 | 描述 |

1359| :--------------------- | :---------------------------------------------------------------------- |

1360| `decision` | `"block"` 用 `reason` 提示 Claude。省略以允许操作继续 |

1361| `reason` | 当 `decision` 为 `"block"` 时向 Claude 显示的解释 |

1362| `additionalContext` | 添加到 Claude 上下文的字符串,与工具结果一起。请参阅[为 Claude 添加上下文](#add-context-for-claude) |

1363| `updatedToolOutput` | 用提供的值替换工具的输出,然后将其发送给 Claude。该值必须与工具的输出形状匹配 |

1364| `updatedMCPToolOutput` | 仅对[MCP 工具](#match-mcp-tools)替换输出。优先使用 `updatedToolOutput`,它适用于所有工具 |

1365 

1366下面的示例替换 `Bash` 调用的输出。替换值与 `Bash` 工具的输出形状匹配:

1367 

1368```json theme={null}

1369{

1370 "hookSpecificOutput": {

1371 "hookEventName": "PostToolUse",

1372 "additionalContext": "Additional information for Claude",

1373 "updatedToolOutput": {

1374 "stdout": "[redacted]",

1375 "stderr": "",

1376 "interrupted": false,

1377 "isImage": false

1378 }

1379 }

1380}

1381```

1382 

1383<Warning>

1384 `updatedToolOutput` 仅改变 Claude 看到的内容。工具已经在 hook 触发时运行,所以任何写入的文件、执行的命令或发送的网络请求都已生效。遥测,如 OpenTelemetry 工具跨度和分析事件,也在 hook 运行前捕获原始输出。要在运行前防止或修改工具调用,请改用[PreToolUse](#pretooluse) hook。

1385 

1386 替换值必须与工具的输出形状匹配。内置工具返回结构化对象而不是纯字符串。例如,`Bash` 返回一个具有 `stdout`、`stderr`、`interrupted` 和 `isImage` 字段的对象。对于内置工具,不与工具的输出架构匹配的值被忽略,使用原始输出。MCP 工具输出通过而不进行架构验证。剥离 Claude 需要的错误详细信息可能导致它基于错误的假设继续。

1387</Warning>

1388 

1389### PostToolUseFailure

1390 

1391当工具执行失败时运行。此事件对于抛出错误或返回失败结果的工具调用触发。使用此来记录失败、发送警报或向 Claude 提供纠正反馈。

1392 

1393在工具名称上匹配,与 PreToolUse 相同的值。

1394 

1395#### PostToolUseFailure 输入

1396 

1397PostToolUseFailure hooks 接收与 PostToolUse 相同的 `tool_name` 和 `tool_input` 字段,以及作为顶级字段的错误信息:

1398 

1399```json theme={null}

1400{

1401 "session_id": "abc123",

1402 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",

1403 "cwd": "/Users/...",

1404 "permission_mode": "default",

1405 "hook_event_name": "PostToolUseFailure",

1406 "tool_name": "Bash",

1407 "tool_input": {

1408 "command": "npm test",

1409 "description": "Run test suite"

1410 },

1411 "tool_use_id": "toolu_01ABC123...",

1412 "error": "Command exited with non-zero status code 1",

1413 "is_interrupt": false,

1414 "duration_ms": 4187

1415}

1416```

1417 

1418| 字段 | 描述 |

1419| :------------- | :--------------------------------------------- |

1420| `error` | 描述出错原因的字符串 |

1421| `is_interrupt` | 可选的布尔值,指示失败是否由用户中断引起 |

1422| `duration_ms` | 可选。工具执行时间(毫秒)。不包括权限提示和 PreToolUse hooks 中花费的时间 |

1423 

1424#### PostToolUseFailure 决定控制

1425 

1426`PostToolUseFailure` hooks 可以在工具失败后向 Claude 提供上下文。除了所有 hooks 可用的[JSON 输出字段](#json-output)外,您的 hook 脚本可以返回这些事件特定字段:

1427 

1428| 字段 | 描述 |

1429| :------------------ | :-------------------------------------------------------------------- |

1430| `additionalContext` | 添加到 Claude 上下文的字符串,与错误一起。请参阅[为 Claude 添加上下文](#add-context-for-claude) |

1431 

1432```json theme={null}

1433{

1434 "hookSpecificOutput": {

1435 "hookEventName": "PostToolUseFailure",

1436 "additionalContext": "Additional information about the failure for Claude"

1437 }

1438}

1439```

1440 

1441### PostToolBatch

1442 

1443在批次中的每个工具调用都已解决后运行一次,在 Claude Code 向模型发送下一个请求之前。`PostToolUse` 每个工具触发一次,这意味着当 Claude 进行并行工具调用时它并发触发。`PostToolBatch` 恰好触发一次,包含完整批次,因此它是注入取决于运行的工具集而不是任何单个工具的上下文的正确位置。此事件没有匹配器。

1444 

1445#### PostToolBatch 输入

1446 

1447除了[通用输入字段](#common-input-fields)外,PostToolBatch hooks 还接收 `tool_calls`,一个描述批次中每个工具调用的数组:

1448 

1449```json theme={null}

1450{

1451 "session_id": "abc123",

1452 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",

1453 "cwd": "/Users/...",

1454 "permission_mode": "default",

1455 "hook_event_name": "PostToolBatch",

1456 "tool_calls": [

1457 {

1458 "tool_name": "Read",

1459 "tool_input": {"file_path": "/.../ledger/accounts.py"},

1460 "tool_use_id": "toolu_01...",

1461 "tool_response": " 1\tfrom __future__ import annotations\n 2\t..."

1462 },

1463 {

1464 "tool_name": "Read",

1465 "tool_input": {"file_path": "/.../ledger/transactions.py"},

1466 "tool_use_id": "toolu_02...",

1467 "tool_response": " 1\tfrom __future__ import annotations\n 2\t..."

1468 }

1469 ]

1470}

1471```

1472 

1473`tool_response` 包含与模型在相应 `tool_result` 块中接收的内容相同的内容。该值是序列化的字符串或内容块数组,完全如工具发出的那样。对于 `Read`,这意味着行号前缀的文本而不是原始文件内容。响应可能很大,因此仅解析您需要的字段。

1474 

1475<Note>

1476 `tool_response` 形状与 `PostToolUse` 的不同。`PostToolUse` 传递工具的结构化 `Output` 对象,例如 `{filePath: "...", success: true}` 对于 `Write`;`PostToolBatch` 传递序列化的 `tool_result` 内容模型看到的。

1477</Note>

1478 

1479#### PostToolBatch 决定控制

1480 

1481`PostToolBatch` hooks 可以为 Claude 注入上下文。除了所有 hooks 可用的[JSON 输出字段](#json-output)外,您的 hook 脚本可以返回这些事件特定字段:

1482 

1483| 字段 | 描述 |

1484| :------------------ | :------------------------------------------------------------------------------------------- |

1485| `additionalContext` | 在下一个模型调用之前注入的上下文字符串。请参阅[为 Claude 添加上下文](#add-context-for-claude)了解传递详情、放入什么内容以及恢复的会话如何处理过去的值 |

1486 

1487```json theme={null}

1488{

1489 "hookSpecificOutput": {

1490 "hookEventName": "PostToolBatch",

1491 "additionalContext": "These files are part of the ledger module. Run pytest before marking the task complete."

1492 }

1493}

1494```

1495 

1496返回 `decision: "block"` 或 `continue: false` 在下一个模型调用之前停止代理循环。

1497 

1498### PermissionDenied

1499 

1500当[自动模式](/zh-CN/permission-modes#eliminate-prompts-with-auto-mode)分类器拒绝工具调用时运行。此 hook 仅在自动模式中触发:当您手动拒绝权限对话框、`PreToolUse` hook 阻止调用或 `deny` 规则匹配时,它不运行。使用它来记录分类器拒绝、调整配置或告诉模型它可能重试工具调用。

1501 

1502在工具名称上匹配,与 PreToolUse 相同的值。

1503 

1504#### PermissionDenied 输入

1505 

1506除了[通用输入字段](#common-input-fields)外,PermissionDenied hooks 还接收 `tool_name`、`tool_input`、`tool_use_id` 和 `reason`。

1507 

1508```json theme={null}

1509{

1510 "session_id": "abc123",

1511 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",

1512 "cwd": "/Users/...",

1513 "permission_mode": "auto",

1514 "hook_event_name": "PermissionDenied",

1515 "tool_name": "Bash",

1516 "tool_input": {

1517 "command": "rm -rf /tmp/build",

1518 "description": "Clean build directory"

1519 },

1520 "tool_use_id": "toolu_01ABC123...",

1521 "reason": "Auto mode denied: command targets a path outside the project"

1522}

1523```

1524 

1525| 字段 | 描述 |

1526| :------- | :----------------- |

1527| `reason` | 分类器解释为什么工具调用被拒绝的原因 |

1528 

1529#### PermissionDenied 决定控制

1530 

1531PermissionDenied hooks 可以告诉模型它可能重试被拒绝的工具调用。返回一个 JSON 对象,其中 `hookSpecificOutput.retry` 设置为 `true`:

1532 

1533```json theme={null}

1534{

1535 "hookSpecificOutput": {

1536 "hookEventName": "PermissionDenied",

1537 "retry": true

1538 }

1539}

1540```

1541 

1542当 `retry` 为 `true` 时,Claude Code 向对话添加一条消息,告诉模型它可能重试工具调用。拒绝本身不被反转。如果您的 hook 不返回 JSON,或返回 `retry: false`,拒绝成立,模型接收原始拒绝消息。

1543 

1544### Notification

1545 

1546在 Claude Code 发送通知时运行。在通知类型上匹配:`permission_prompt`、`idle_prompt`、`auth_success`、`elicitation_dialog`、`elicitation_complete`、`elicitation_response`。省略匹配器以为所有通知类型运行 hooks。

1547 

1548使用单独的匹配器根据通知类型运行不同的处理程序。此配置在 Claude 需要权限批准时触发权限特定的警报脚本,在 Claude 空闲时触发不同的通知:

1549 

1550```json theme={null}

1551{

1552 "hooks": {

1553 "Notification": [

1554 {

1555 "matcher": "permission_prompt",

1556 "hooks": [

1557 {

1558 "type": "command",

1559 "command": "/path/to/permission-alert.sh"

1560 }

1561 ]

1562 },

1563 {

1564 "matcher": "idle_prompt",

1565 "hooks": [

1566 {

1567 "type": "command",

1568 "command": "/path/to/idle-notification.sh"

1569 }

1570 ]

1571 }

1572 ]

1573 }

1574}

1575```

1576 

1577#### Notification 输入

1578 

1579除了[通用输入字段](#common-input-fields)外,Notification hooks 还接收 `message` 和通知文本、可选的 `title` 和 `notification_type` 指示哪个类型触发。

1580 

1581```json theme={null}

1582{

1583 "session_id": "abc123",

1584 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",

1585 "cwd": "/Users/...",

1586 "hook_event_name": "Notification",

1587 "message": "Claude needs your permission to use Bash",

1588 "title": "Permission needed",

1589 "notification_type": "permission_prompt"

1590}

1591```

1592 

1593Notification hooks 无法阻止或修改通知。它们用于副作用,例如将通知转发到外部服务。[通用 JSON 输出字段](#json-output)如 `systemMessage` 适用。

1594 

1595### SubagentStart

1596 

1597当通过 Agent 工具生成 Claude Code subagent 时运行。支持匹配器以按代理类型名称过滤(内置代理如 `general-purpose`、`Explore`、`Plan` 或来自 `.claude/agents/` 的自定义代理名称)。

1598 

1599#### SubagentStart 输入

1600 

1601除了[通用输入字段](#common-input-fields)外,SubagentStart hooks 还接收 `agent_id` 和 subagent 的唯一标识符以及 `agent_type` 和代理名称(内置代理如 `"general-purpose"`、`"Explore"`、`"Plan"` 或自定义代理名称)。

1602 

1603```json theme={null}

1604{

1605 "session_id": "abc123",

1606 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",

1607 "cwd": "/Users/...",

1608 "hook_event_name": "SubagentStart",

1609 "agent_id": "agent-abc123",

1610 "agent_type": "Explore"

1611}

1612```

1613 

1614SubagentStart hooks 无法阻止 subagent 创建,但它们可以向 subagent 注入上下文。除了所有 hooks 可用的[JSON 输出字段](#json-output)外,您可以返回:

1615 

1616| 字段 | 描述 |

1617| :------------------ | :----------------------------------------------------------------------------- |

1618| `additionalContext` | 添加到 subagent 上下文开始处的字符串,在其第一个提示之前。请参阅[为 Claude 添加上下文](#add-context-for-claude) |

1619 

1620```json theme={null}

1621{

1622 "hookSpecificOutput": {

1623 "hookEventName": "SubagentStart",

1624 "additionalContext": "Follow security guidelines for this task"

1625 }

1626}

1627```

1628 

1629### SubagentStop

1630 

1631当 Claude Code subagent 完成响应时运行。在代理类型上匹配,与 SubagentStart 相同的值。

1632 

1633#### SubagentStop 输入

1634 

1635除了[通用输入字段](#common-input-fields)外,SubagentStop hooks 还接收 `stop_hook_active`、`agent_id`、`agent_type`、`agent_transcript_path` 和 `last_assistant_message`。`agent_type` 字段是用于匹配器过滤的值。`transcript_path` 是主会话的成绩单,而 `agent_transcript_path` 是 subagent 自己的成绩单,存储在嵌套的 `subagents/` 文件夹中。`last_assistant_message` 字段包含 subagent 最终响应的文本内容,因此 hooks 可以访问它而无需解析成绩单文件。

1636 

1637```json theme={null}

1638{

1639 "session_id": "abc123",

1640 "transcript_path": "~/.claude/projects/.../abc123.jsonl",

1641 "cwd": "/Users/...",

1642 "permission_mode": "default",

1643 "hook_event_name": "SubagentStop",

1644 "stop_hook_active": false,

1645 "agent_id": "def456",

1646 "agent_type": "Explore",

1647 "agent_transcript_path": "~/.claude/projects/.../abc123/subagents/agent-def456.jsonl",

1648 "last_assistant_message": "Analysis complete. Found 3 potential issues..."

1649}

1650```

1651 

1652SubagentStop hooks 使用与[Stop hooks](#stop-decision-control)相同的决定控制格式。

1653 

1654### TaskCreated

1655 

1656当通过 `TaskCreate` 工具创建任务时运行。使用此来强制执行命名约定、要求任务描述或防止创建某些任务。

1657 

1658当 `TaskCreated` hook 以代码 2 退出时,任务不被创建,stderr 消息作为反馈反馈给模型。要完全停止队友而不是重新运行它,返回 JSON `{"continue": false, "stopReason": "..."}` 。TaskCreated hooks 不支持匹配器,在每次出现时触发。

1659 

1660#### TaskCreated 输入

1661 

1662除了[通用输入字段](#common-input-fields)外,TaskCreated hooks 还接收 `task_id`、`task_subject` 和可选的 `task_description`、`teammate_name` 和 `team_name`。

1663 

1664```json theme={null}

1665{

1666 "session_id": "abc123",

1667 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",

1668 "cwd": "/Users/...",

1669 "permission_mode": "default",

1670 "hook_event_name": "TaskCreated",

1671 "task_id": "task-001",

1672 "task_subject": "Implement user authentication",

1673 "task_description": "Add login and signup endpoints",

1674 "teammate_name": "implementer",

1675 "team_name": "my-project"

1676}

1677```

1678 

1679| 字段 | 描述 |

1680| :----------------- | :--------------- |

1681| `task_id` | 被创建的任务的标识符 |

1682| `task_subject` | 任务的标题 |

1683| `task_description` | 任务的详细描述。可能不存在 |

1684| `teammate_name` | 创建任务的队友的名称。可能不存在 |

1685| `team_name` | 团队的名称。可能不存在 |

1686 

1687#### TaskCreated 决定控制

1688 

1689TaskCreated hooks 支持两种方式来控制任务创建:

1690 

1691* **退出代码 2**:任务不被创建,stderr 消息作为反馈反馈给模型。

1692* **JSON `{"continue": false, "stopReason": "..."}`**:完全停止队友,匹配 `Stop` hook 行为。`stopReason` 向用户显示。

1693 

1694此示例阻止主题不遵循所需格式的任务:

1695 

1696```bash theme={null}

1697#!/bin/bash

1698INPUT=$(cat)

1699TASK_SUBJECT=$(echo "$INPUT" | jq -r '.task_subject')

1700 

1701if [[ ! "$TASK_SUBJECT" =~ ^\[TICKET-[0-9]+\] ]]; then

1702 echo "Task subject must start with a ticket number, e.g. '[TICKET-123] Add feature'" >&2

1703 exit 2

1704fi

1705 

1706exit 0

1707```

1708 

1709### TaskCompleted

1710 

1711当任务被标记为已完成时运行。这在两种情况下触发:当任何代理通过 TaskUpdate 工具显式标记任务为已完成时,或当[代理团队](/zh-CN/agent-teams)队友完成其轮次且有进行中的任务时。使用此来强制执行完成标准,如通过测试或 lint 检查,然后任务才能关闭。

1712 

1713当 `TaskCompleted` hook 以代码 2 退出时,任务不被标记为已完成,stderr 消息作为反馈反馈给模型。要完全停止队友而不是重新运行它,返回 JSON `{"continue": false, "stopReason": "..."}` 。TaskCompleted hooks 不支持匹配器,在每次出现时触发。

1714 

1715#### TaskCompleted 输入

1716 

1717除了[通用输入字段](#common-input-fields)外,TaskCompleted hooks 还接收 `task_id`、`task_subject` 和可选的 `task_description`、`teammate_name` 和 `team_name`。

1718 

1719```json theme={null}

1720{

1721 "session_id": "abc123",

1722 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",

1723 "cwd": "/Users/...",

1724 "permission_mode": "default",

1725 "hook_event_name": "TaskCompleted",

1726 "task_id": "task-001",

1727 "task_subject": "Implement user authentication",

1728 "task_description": "Add login and signup endpoints",

1729 "teammate_name": "implementer",

1730 "team_name": "my-project"

1731}

1732```

1733 

1734| 字段 | 描述 |

1735| :----------------- | :--------------- |

1736| `task_id` | 被完成的任务的标识符 |

1737| `task_subject` | 任务的标题 |

1738| `task_description` | 任务的详细描述。可能不存在 |

1739| `teammate_name` | 完成任务的队友的名称。可能不存在 |

1740| `team_name` | 团队的名称。可能不存在 |

1741 

1742#### TaskCompleted 决定控制

1743 

1744TaskCompleted hooks 支持两种方式来控制任务完成:

1745 

1746* **退出代码 2**:任务不被标记为已完成,stderr 消息作为反馈反馈给模型。

1747* **JSON `{"continue": false, "stopReason": "..."}`**:完全停止队友,匹配 `Stop` hook 行为。`stopReason` 向用户显示。

1748 

1749此示例运行测试并在失败时阻止任务完成:

1750 

1751```bash theme={null}

1752#!/bin/bash

1753INPUT=$(cat)

1754TASK_SUBJECT=$(echo "$INPUT" | jq -r '.task_subject')

1755 

1756# 运行测试套件

1757if ! npm test 2>&1; then

1758 echo "Tests not passing. Fix failing tests before completing: $TASK_SUBJECT" >&2

1759 exit 2

1760fi

1761 

1762exit 0

1763```

1764 

1765### Stop

1766 

1767在主 Claude Code 代理完成响应时运行。如果停止是由于用户中断,则不运行。API 错误触发[StopFailure](#stopfailure)。

1768 

1769#### Stop 输入

1770 

1771除了[通用输入字段](#common-input-fields)外,Stop hooks 还接收 `stop_hook_active` 和 `last_assistant_message`。`stop_hook_active` 字段在 Claude Code 已经作为 stop hook 的结果继续时为 `true`。检查此值或处理成绩单以防止 Claude Code 无限运行。`last_assistant_message` 字段包含 Claude 最终响应的文本内容,因此 hooks 可以访问它而无需解析成绩单文件。

1772 

1773```json theme={null}

1774{

1775 "session_id": "abc123",

1776 "transcript_path": "~/.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",

1777 "cwd": "/Users/...",

1778 "permission_mode": "default",

1779 "hook_event_name": "Stop",

1780 "stop_hook_active": true,

1781 "last_assistant_message": "I've completed the refactoring. Here's a summary..."

1782}

1783```

1784 

1785#### Stop 决定控制

1786 

1787`Stop` 和 `SubagentStop` hooks 可以控制 Claude 是否继续。除了所有 hooks 可用的[JSON 输出字段](#json-output)外,您的 hook 脚本可以返回这些事件特定字段:

1788 

1789| 字段 | 描述 |

1790| :--------- | :---------------------------------------------- |

1791| `decision` | `"block"` 防止 Claude 停止。省略以允许 Claude 停止 |

1792| `reason` | 当 `decision` 为 `"block"` 时必需。告诉 Claude 为什么它应该继续 |

1793 

1794```json theme={null}

1795{

1796 "decision": "block",

1797 "reason": "Must be provided when Claude is blocked from stopping"

1798}

1799```

1800 

1801### StopFailure

1802 

1803当轮次因 API 错误而结束时运行,而不是[Stop](#stop)。输出和退出代码被忽略。使用此来记录失败、发送警报或在 Claude 因速率限制、身份验证问题或其他 API 错误而无法完成响应时采取恢复操作。

1804 

1805#### StopFailure 输入

1806 

1807除了[通用输入字段](#common-input-fields)外,StopFailure hooks 还接收 `error`、可选的 `error_details` 和可选的 `last_assistant_message`。`error` 字段标识错误类型,用于匹配器过滤。

1808 

1809| 字段 | 描述 |

1810| :----------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------- |

1811| `error` | 错误类型:`rate_limit`、`authentication_failed`、`oauth_org_not_allowed`、`billing_error`、`invalid_request`、`server_error`、`max_output_tokens` 或 `unknown` |

1812| `error_details` | 关于错误的额外详细信息(如果可用) |

1813| `last_assistant_message` | 在对话中显示的呈现错误文本。与 `Stop` 和 `SubagentStop` 不同,其中此字段包含 Claude 的对话输出,对于 `StopFailure` 它包含 API 错误字符串本身,例如 `"API Error: Rate limit reached"` |

1814 

1815```json theme={null}

1816{

1817 "session_id": "abc123",

1818 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",

1819 "cwd": "/Users/...",

1820 "hook_event_name": "StopFailure",

1821 "error": "rate_limit",

1822 "error_details": "429 Too Many Requests",

1823 "last_assistant_message": "API Error: Rate limit reached"

1824}

1825```

1826 

1827StopFailure hooks 没有决定控制。它们仅为通知和日志记录目的运行。

1828 

1829### TeammateIdle

1830 

1831当[代理团队](/zh-CN/agent-teams)队友在完成其轮次后即将空闲时运行。使用此来强制执行质量门,如要求通过 lint 检查或验证输出文件存在。

1832 

1833当 `TeammateIdle` hook 以代码 2 退出时,队友接收 stderr 消息作为反馈并继续工作而不是空闲。要完全停止队友而不是重新运行它,返回 JSON `{"continue": false, "stopReason": "..."}` 。TeammateIdle hooks 不支持匹配器,在每次出现时触发。

1834 

1835#### TeammateIdle 输入

1836 

1837除了[通用输入字段](#common-input-fields)外,TeammateIdle hooks 还接收 `teammate_name` 和 `team_name`。

1838 

1839```json theme={null}

1840{

1841 "session_id": "abc123",

1842 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",

1843 "cwd": "/Users/...",

1844 "permission_mode": "default",

1845 "hook_event_name": "TeammateIdle",

1846 "teammate_name": "researcher",

1847 "team_name": "my-project"

1848}

1849```

1850 

1851| 字段 | 描述 |

1852| :-------------- | :--------- |

1853| `teammate_name` | 即将空闲的队友的名称 |

1854| `team_name` | 团队的名称 |

1855 

1856#### TeammateIdle 决定控制

1857 

1858TeammateIdle hooks 支持两种方式来控制队友行为:

1859 

1860* **退出代码 2**:队友接收 stderr 消息作为反馈并继续工作而不是空闲。

1861* **JSON `{"continue": false, "stopReason": "..."}`**:完全停止队友,匹配 `Stop` hook 行为。`stopReason` 向用户显示。

1862 

1863此示例检查构建工件是否存在,然后允许队友空闲:

1864 

1865```bash theme={null}

1866#!/bin/bash

1867 

1868if [ ! -f "./dist/output.js" ]; then

1869 echo "Build artifact missing. Run the build before stopping." >&2

1870 exit 2

1871fi

1872 

1873exit 0

1874```

1875 

1876### ConfigChange

1877 

1878当会话期间配置文件更改时运行。使用此来审计设置更改、强制执行安全策略或阻止对配置文件的未授权修改。

1879 

1880ConfigChange hooks 对设置文件、托管策略设置和 skill 文件的更改触发。输入中的 `source` 字段告诉您哪种类型的配置更改,可选的 `file_path` 字段提供更改文件的路径。

1881 

1882匹配器在配置源上过滤:

1883 

1884| 匹配器 | 何时触发 |

1885| :----------------- | :------------------------------- |

1886| `user_settings` | `~/.claude/settings.json` 更改 |

1887| `project_settings` | `.claude/settings.json` 更改 |

1888| `local_settings` | `.claude/settings.local.json` 更改 |

1889| `policy_settings` | 托管策略设置更改 |

1890| `skills` | `.claude/skills/` 中的 skill 文件更改 |

1891 

1892此示例记录所有配置更改以进行安全审计:

1893 

1894```json theme={null}

1895{

1896 "hooks": {

1897 "ConfigChange": [

1898 {

1899 "hooks": [

1900 {

1901 "type": "command",

1902 "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/audit-config-change.sh"

1903 }

1904 ]

1905 }

1906 ]

1907 }

1908}

1909```

1910 

1911#### ConfigChange 输入

1912 

1913除了[通用输入字段](#common-input-fields)外,ConfigChange hooks 还接收 `source` 和可选的 `file_path`。`source` 字段指示哪种配置类型更改,`file_path` 提供被修改的特定文件的路径。

1914 

1915```json theme={null}

1916{

1917 "session_id": "abc123",

1918 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",

1919 "cwd": "/Users/...",

1920 "hook_event_name": "ConfigChange",

1921 "source": "project_settings",

1922 "file_path": "/Users/.../my-project/.claude/settings.json"

1923}

1924```

1925 

1926#### ConfigChange 决定控制

1927 

1928ConfigChange hooks 可以阻止配置更改生效。使用退出代码 2 或 JSON `decision` 来防止更改。被阻止时,新设置不应用于运行中的会话。

1929 

1930| 字段 | 描述 |

1931| :--------- | :--------------------------------- |

1932| `decision` | `"block"` 防止配置更改被应用。省略以允许更改 |

1933| `reason` | 当 `decision` 为 `"block"` 时向用户显示的解释 |

1934 

1935```json theme={null}

1936{

1937 "decision": "block",

1938 "reason": "Configuration changes to project settings require admin approval"

1939}

1940```

1941 

1942`policy_settings` 更改无法被阻止。Hooks 仍然对 `policy_settings` 源触发,因此您可以使用它们进行审计日志记录,但任何阻止决定都被忽略。这确保企业管理的设置始终生效。

1943 

1944### CwdChanged

1945 

1946当会话期间工作目录更改时运行,例如当 Claude 执行 `cd` 命令时。使用此来对目录更改做出反应:重新加载环境变量、激活项目特定的工具链或自动运行设置脚本。与[FileChanged](#filechanged)配对,用于[direnv](https://direnv.net/)等管理每个目录环境的工具。

1947 

1948CwdChanged hooks 可以访问 `CLAUDE_ENV_FILE`。写入该文件的变量持久化到会话的后续 Bash 命令中,就像在[SessionStart hooks](#persist-environment-variables)中一样。

1949 

1950CwdChanged 不支持匹配器,在每次目录更改时触发。

1951 

1952#### CwdChanged 输入

1953 

1954除了[通用输入字段](#common-input-fields)外,CwdChanged hooks 还接收 `old_cwd` 和 `new_cwd`。

1955 

1956```json theme={null}

1957{

1958 "session_id": "abc123",

1959 "transcript_path": "/Users/.../.claude/projects/.../transcript.jsonl",

1960 "cwd": "/Users/my-project/src",

1961 "hook_event_name": "CwdChanged",

1962 "old_cwd": "/Users/my-project",

1963 "new_cwd": "/Users/my-project/src"

1964}

1965```

1966 

1967#### CwdChanged 输出

1968 

1969除了所有 hooks 可用的[JSON 输出字段](#json-output)外,CwdChanged hooks 还可以返回 `watchPaths` 来动态设置[FileChanged](#filechanged)监视的文件路径:

1970 

1971| 字段 | 描述 |

1972| :----------- | :--------------------------------------------------------------------- |

1973| `watchPaths` | 绝对路径的数组。替换当前动态监视列表(来自您的 `matcher` 配置的路径始终被监视)。返回空数组会清除动态列表,这在进入新目录时很典型 |

1974 

1975CwdChanged hooks 没有决定控制。它们无法阻止目录更改。

1976 

1977### FileChanged

1978 

1979当监视的文件在磁盘上更改时运行。用于在项目配置文件修改时重新加载环境变量。

1980 

1981此事件的 `matcher` 有两个作用:

1982 

1983* **构建监视列表**:值在 `|` 上分割,每个段注册为工作目录中的文字文件名,因此 `".envrc|.env"` 监视恰好这两个文件。正则表达式模式在这里不有用:像 `^\.env` 这样的值会监视一个字面上名为 `^\.env` 的文件。

1984* **过滤哪些 hooks 运行**:当监视的文件更改时,相同的值使用标准[匹配器规则](#matcher-patterns)针对更改文件的基名过滤哪些 hook 组运行。

1985 

1986FileChanged hooks 可以访问 `CLAUDE_ENV_FILE`。写入该文件的变量持久化到会话的后续 Bash 命令中,就像在[SessionStart hooks](#persist-environment-variables)中一样。

1987 

1988#### FileChanged 输入

1989 

1990除了[通用输入字段](#common-input-fields)外,FileChanged hooks 还接收 `file_path` 和 `event`。

1991 

1992| 字段 | 描述 |

1993| :---------- | :----------------------------------------------------- |

1994| `file_path` | 更改文件的绝对路径 |

1995| `event` | 发生了什么:`"change"`(文件修改)、`"add"`(文件创建)或 `"unlink"`(文件删除) |

1996 

1997```json theme={null}

1998{

1999 "session_id": "abc123",

2000 "transcript_path": "/Users/.../.claude/projects/.../transcript.jsonl",

2001 "cwd": "/Users/my-project",

2002 "hook_event_name": "FileChanged",

2003 "file_path": "/Users/my-project/.envrc",

2004 "event": "change"

2005}

2006```

2007 

2008#### FileChanged 输出

2009 

2010除了所有 hooks 可用的[JSON 输出字段](#json-output)外,FileChanged hooks 还可以返回 `watchPaths` 来动态更新监视的文件路径:

2011 

2012| 字段 | 描述 |

2013| :----------- | :------------------------------------------------------------------------------ |

2014| `watchPaths` | 绝对路径的数组。替换当前动态监视列表(来自您的 `matcher` 配置的路径始终被监视)。当您的 hook 脚本根据更改的文件发现要监视的其他文件时使用此项 |

2015 

2016FileChanged hooks 没有决定控制。它们无法阻止文件更改的发生。

2017 

2018### WorktreeCreate

2019 

2020当您运行 `claude --worktree` 或[subagent 使用 `isolation: "worktree"`](/zh-CN/sub-agents#choose-the-subagent-scope)时,Claude Code 使用 `git worktree` 创建隔离的工作副本。如果您配置 WorktreeCreate hook,它替换默认的 git 行为,让您使用不同的版本控制系统,如 SVN、Perforce 或 Mercurial。

2021 

2022因为 hook 完全替换默认行为,[`.worktreeinclude`](/zh-CN/worktrees#copy-gitignored-files-into-worktrees)不被处理。如果您需要将本地配置文件(如 `.env`)复制到新 worktree,请在您的 hook 脚本内执行。

2023 

2024Hook 必须返回创建的 worktree 目录的绝对路径。Claude Code 使用此路径作为隔离会话的工作目录。命令 hooks 在 stdout 上打印它;HTTP hooks 通过 `hookSpecificOutput.worktreePath` 返回它。

2025 

2026此示例创建 SVN 工作副本并打印路径供 Claude Code 使用。用您自己的替换仓库 URL:

2027 

2028```json theme={null}

2029{

2030 "hooks": {

2031 "WorktreeCreate": [

2032 {

2033 "hooks": [

2034 {

2035 "type": "command",

2036 "command": "bash -c 'NAME=$(jq -r .name); DIR=\"$HOME/.claude/worktrees/$NAME\"; svn checkout https://svn.example.com/repo/trunk \"$DIR\" >&2 && echo \"$DIR\"'"

2037 }

2038 ]

2039 }

2040 ]

2041 }

2042}

2043```

2044 

2045Hook 从 stdin 上的 JSON 输入读取 worktree `name`,将新副本检出到新目录,并打印目录路径。最后一行的 `echo` 是 Claude Code 读取的 worktree 路径。将任何其他输出重定向到 stderr,以便它不会干扰路径。

2046 

2047#### WorktreeCreate 输入

2048 

2049除了[通用输入字段](#common-input-fields)外,WorktreeCreate hooks 还接收 `name` 字段。这是新 worktree 的 slug 标识符,由用户指定或自动生成(例如,`bold-oak-a3f2`)。

2050 

2051```json theme={null}

2052{

2053 "session_id": "abc123",

2054 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",

2055 "cwd": "/Users/...",

2056 "hook_event_name": "WorktreeCreate",

2057 "name": "feature-auth"

2058}

2059```

2060 

2061#### WorktreeCreate 输出

2062 

2063WorktreeCreate hooks 不使用标准的允许/阻止决定模型。相反,hook 的成功或失败决定结果。Hook 必须返回创建的 worktree 目录的绝对路径:

2064 

2065* **命令 hooks**(`type: "command"`):在 stdout 上打印路径。

2066* **HTTP hooks**(`type: "http"`):在响应体中返回 `{ "hookSpecificOutput": { "hookEventName": "WorktreeCreate", "worktreePath": "/absolute/path" } }`。

2067 

2068如果 hook 失败或不产生路径,worktree 创建失败并出现错误。

2069 

2070### WorktreeRemove

2071 

2072[WorktreeCreate](#worktreecreate) 的清理对应物。此 hook 在 worktree 被移除时触发,要么当您退出 `--worktree` 会话并选择移除它时,要么当具有 `isolation: "worktree"` 的 subagent 完成时。对于基于 git 的 worktrees,Claude 使用 `git worktree remove` 自动处理清理。如果您为非 git 版本控制系统配置了 WorktreeCreate hook,将其与 WorktreeRemove hook 配对以处理清理。没有它,worktree 目录留在磁盘上。

2073 

2074Claude Code 将 WorktreeCreate 返回的路径作为 `worktree_path` 在 hook 输入中传递。此示例读取该路径并移除目录:

2075 

2076```json theme={null}

2077{

2078 "hooks": {

2079 "WorktreeRemove": [

2080 {

2081 "hooks": [

2082 {

2083 "type": "command",

2084 "command": "bash -c 'jq -r .worktree_path | xargs rm -rf'"

2085 }

2086 ]

2087 }

2088 ]

2089 }

2090}

2091```

2092 

2093#### WorktreeRemove 输入

2094 

2095除了[通用输入字段](#common-input-fields)外,WorktreeRemove hooks 还接收 `worktree_path` 字段,这是被移除的 worktree 的绝对路径。

2096 

2097```json theme={null}

2098{

2099 "session_id": "abc123",

2100 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",

2101 "cwd": "/Users/...",

2102 "hook_event_name": "WorktreeRemove",

2103 "worktree_path": "/Users/.../my-project/.claude/worktrees/feature-auth"

2104}

2105```

2106 

2107WorktreeRemove hooks 没有决定控制。它们无法阻止 worktree 移除,但可以执行清理任务,如移除版本控制状态或存档更改。Hook 失败仅在调试模式下记录。

2108 

2109### PreCompact

2110 

2111在 Claude Code 即将运行压缩操作之前运行。

2112 

2113匹配器值指示压缩是手动还是自动触发:

2114 

2115| 匹配器 | 何时触发 |

2116| :------- | :----------- |

2117| `manual` | `/compact` |

2118| `auto` | 当上下文窗口满时自动压缩 |

2119 

2120退出代码 2 以阻止压缩。对于手动 `/compact`,stderr 消息向用户显示。您也可以通过返回带有 `"decision": "block"` 的 JSON 来阻止。

2121 

2122阻止自动压缩有不同的效果,取决于何时触发。如果压缩在上下文限制之前主动触发,Claude Code 跳过它,对话继续未压缩。如果压缩被触发以从已由 API 返回的上下文限制错误恢复,底层错误浮出并且当前请求失败。

2123 

2124#### PreCompact 输入

2125 

2126除了[通用输入字段](#common-input-fields)外,PreCompact hooks 还接收 `trigger` 和 `custom_instructions`。对于 `manual`,`custom_instructions` 包含用户传入 `/compact` 的内容。对于 `auto`,`custom_instructions` 为空。

2127 

2128```json theme={null}

2129{

2130 "session_id": "abc123",

2131 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",

2132 "cwd": "/Users/...",

2133 "hook_event_name": "PreCompact",

2134 "trigger": "manual",

2135 "custom_instructions": ""

2136}

2137```

2138 

2139### PostCompact

2140 

2141在 Claude Code 完成压缩操作后运行。使用此事件对新的压缩状态做出反应,例如记录生成的摘要或更新外部状态。

2142 

2143与 `PreCompact` 相同的匹配器值适用:

2144 

2145| 匹配器 | 何时触发 |

2146| :------- | :------------- |

2147| `manual` | 在 `/compact` 后 |

2148| `auto` | 在上下文窗口满时自动压缩后 |

2149 

2150#### PostCompact 输入

2151 

2152除了[通用输入字段](#common-input-fields)外,PostCompact hooks 还接收 `trigger` 和 `compact_summary`。`compact_summary` 字段包含压缩操作生成的对话摘要。

2153 

2154```json theme={null}

2155{

2156 "session_id": "abc123",

2157 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",

2158 "cwd": "/Users/...",

2159 "hook_event_name": "PostCompact",

2160 "trigger": "manual",

2161 "compact_summary": "Summary of the compacted conversation..."

2162}

2163```

2164 

2165PostCompact hooks 没有决定控制。它们无法影响压缩结果,但可以执行后续任务。

2166 

2167### SessionEnd

2168 

2169当 Claude Code 会话结束时运行。用于清理任务、记录会话统计或保存会话状态。支持匹配器以按退出原因过滤。

2170 

2171hook 输入中的 `reason` 字段指示会话为何结束:

2172 

2173| 原因 | 描述 |

2174| :---------------------------- | :------------------- |

2175| `clear` | 会话使用 `/clear` 命令清除 |

2176| `resume` | 通过交互式 `/resume` 切换会话 |

2177| `logout` | 用户登出 |

2178| `prompt_input_exit` | 用户在提示输入可见时退出 |

2179| `bypass_permissions_disabled` | 绕过权限模式被禁用 |

2180| `other` | 其他退出原因 |

2181 

2182#### SessionEnd 输入

2183 

2184除了[通用输入字段](#common-input-fields)外,SessionEnd hooks 还接收 `reason` 字段,指示会话为何结束。有关所有值,请参阅上面的[原因表](#sessionend)。

2185 

2186```json theme={null}

2187{

2188 "session_id": "abc123",

2189 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",

2190 "cwd": "/Users/...",

2191 "hook_event_name": "SessionEnd",

2192 "reason": "other"

2193}

2194```

2195 

2196SessionEnd hooks 没有决定控制。它们无法阻止会话终止,但可以执行清理任务。

2197 

2198SessionEnd hooks 的默认超时为 1.5 秒。这适用于会话退出、`/clear` 和通过交互式 `/resume` 切换会话。如果 hook 需要更多时间,在 hook 配置中设置 `timeout`。总体预算自动提高到配置的最高每个 hook 超时,最多 60 秒。在插件提供的 hooks 上设置的超时不会提高预算。要显式覆盖预算,请在毫秒中设置 `CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS` 环境变量。

2199 

2200```bash theme={null}

2201CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS=5000 claude

2202```

2203 

2204### Elicitation

2205 

2206当 MCP 服务器在任务中途请求用户输入时运行。默认情况下,Claude Code 显示交互式对话供用户响应。Hooks 可以拦截此请求并以编程方式响应,完全跳过对话。

2207 

2208匹配器字段与 MCP 服务器名称匹配。

2209 

2210#### Elicitation 输入

2211 

2212除了[通用输入字段](#common-input-fields)外,Elicitation hooks 还接收 `mcp_server_name`、`message` 和可选的 `mode`、`url`、`elicitation_id` 和 `requested_schema` 字段。

2213 

2214对于 form 模式 elicitation(最常见的情况):

2215 

2216```json theme={null}

2217{

2218 "session_id": "abc123",

2219 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",

2220 "cwd": "/Users/...",

2221 "permission_mode": "default",

2222 "hook_event_name": "Elicitation",

2223 "mcp_server_name": "my-mcp-server",

2224 "message": "Please provide your credentials",

2225 "mode": "form",

2226 "requested_schema": {

2227 "type": "object",

2228 "properties": {

2229 "username": { "type": "string", "title": "Username" }

2230 }

2231 }

2232}

2233```

2234 

2235对于 URL 模式 elicitation(基于浏览器的身份验证):

2236 

2237```json theme={null}

2238{

2239 "session_id": "abc123",

2240 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",

2241 "cwd": "/Users/...",

2242 "permission_mode": "default",

2243 "hook_event_name": "Elicitation",

2244 "mcp_server_name": "my-mcp-server",

2245 "message": "Please authenticate",

2246 "mode": "url",

2247 "url": "https://auth.example.com/login"

2248}

2249```

2250 

2251#### Elicitation 输出

2252 

2253要以编程方式响应而不显示对话,返回带有 `hookSpecificOutput` 的 JSON 对象:

2254 

2255```json theme={null}

2256{

2257 "hookSpecificOutput": {

2258 "hookEventName": "Elicitation",

2259 "action": "accept",

2260 "content": {

2261 "username": "alice"

2262 }

2263 }

2264}

2265```

2266 

2267| 字段 | 值 | 描述 |

2268| :-------- | :-------------------------- | :--------------------------------------- |

2269| `action` | `accept`、`decline`、`cancel` | 是否接受、拒绝或取消请求 |

2270| `content` | object | 要提交的 form 字段值。仅在 `action` 为 `accept` 时使用 |

2271 

2272退出代码 2 拒绝 elicitation 并向用户显示 stderr。

2273 

2274### ElicitationResult

2275 

2276在用户响应 MCP elicitation 后运行。Hooks 可以观察、修改或阻止响应,然后将其发送回 MCP 服务器。

2277 

2278匹配器字段与 MCP 服务器名称匹配。

2279 

2280#### ElicitationResult 输入

2281 

2282除了[通用输入字段](#common-input-fields)外,ElicitationResult hooks 还接收 `mcp_server_name`、`action` 和可选的 `mode`、`elicitation_id` 和 `content` 字段。

2283 

2284```json theme={null}

2285{

2286 "session_id": "abc123",

2287 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",

2288 "cwd": "/Users/...",

2289 "permission_mode": "default",

2290 "hook_event_name": "ElicitationResult",

2291 "mcp_server_name": "my-mcp-server",

2292 "action": "accept",

2293 "content": { "username": "alice" },

2294 "mode": "form",

2295 "elicitation_id": "elicit-123"

2296}

2297```

2298 

2299#### ElicitationResult 输出

2300 

2301要覆盖用户的响应,返回带有 `hookSpecificOutput` 的 JSON 对象:

2302 

2303```json theme={null}

2304{

2305 "hookSpecificOutput": {

2306 "hookEventName": "ElicitationResult",

2307 "action": "decline",

2308 "content": {}

2309 }

2310}

2311```

2312 

2313| 字段 | 值 | 描述 |

2314| :-------- | :-------------------------- | :-------------------------------------- |

2315| `action` | `accept`、`decline`、`cancel` | 覆盖用户的操作 |

2316| `content` | object | 覆盖 form 字段值。仅在 `action` 为 `accept` 时有意义 |

2317 

2318退出代码 2 阻止响应,将有效操作更改为 `decline`。

2319 

2320## 基于提示的 hooks

2321 

2322除了命令、HTTP 和 MCP tool hooks 外,Claude Code 还支持基于提示的 hooks(`type: "prompt"`),使用 LLM 来评估是否允许或阻止操作,以及代理 hooks(`type: "agent"`),生成具有工具访问权限的代理验证器。并非所有事件都支持每种 hook 类型。

2323 

2324支持所有五种 hook 类型(`command`、`http`、`mcp_tool`、`prompt` 和 `agent`)的事件:

2325 

2326* `PermissionRequest`

2327* `PostToolBatch`

2328* `PostToolUse`

2329* `PostToolUseFailure`

2330* `PreToolUse`

2331* `Stop`

2332* `SubagentStop`

2333* `TaskCompleted`

2334* `TaskCreated`

2335* `UserPromptExpansion`

2336* `UserPromptSubmit`

2337 

2338支持 `command`、`http` 和 `mcp_tool` hooks 但不支持 `prompt` 或 `agent` 的事件:

2339 

2340* `ConfigChange`

2341* `CwdChanged`

2342* `Elicitation`

2343* `ElicitationResult`

2344* `FileChanged`

2345* `InstructionsLoaded`

2346* `Notification`

2347* `PermissionDenied`

2348* `PostCompact`

2349* `PreCompact`

2350* `SessionEnd`

2351* `StopFailure`

2352* `SubagentStart`

2353* `TeammateIdle`

2354* `WorktreeCreate`

2355* `WorktreeRemove`

2356 

2357`SessionStart` 和 `Setup` 支持 `command` 和 `mcp_tool` hooks。它们不支持 `http`、`prompt` 或 `agent` hooks。

2358 

2359### 基于提示的 hooks 如何工作

2360 

2361基于提示的 hooks 不执行 Bash 命令,而是:

2362 

23631. 将 hook 输入和您的提示发送到 Claude 模型,默认为 Haiku

23642. LLM 使用包含决定的结构化 JSON 响应

23653. Claude Code 自动处理决定

2366 

2367### 提示 hook 配置

2368 

2369将 `type` 设置为 `"prompt"` 并提供 `prompt` 字符串而不是 `command`。使用 `$ARGUMENTS` 占位符将 hook 的 JSON 输入数据注入到您的提示文本中。Claude Code 将组合的提示和输入发送到快速 Claude 模型,该模型返回 JSON 决定。

2370 

2371此 `Stop` hook 要求 LLM 在允许 Claude 完成之前评估是否应该停止:

2372 

2373```json theme={null}

2374{

2375 "hooks": {

2376 "Stop": [

2377 {

2378 "hooks": [

2379 {

2380 "type": "prompt",

2381 "prompt": "Evaluate if Claude should stop: $ARGUMENTS. Check if all tasks are complete."

2382 }

2383 ]

2384 }

2385 ]

2386 }

2387}

2388```

2389 

2390| 字段 | 必需 | 描述 |

2391| :-------- | :- | :------------------------------------------------------------------------------------- |

2392| `type` | 是 | 必须是 `"prompt"` |

2393| `prompt` | 是 | 要发送给 LLM 的提示文本。使用 `$ARGUMENTS` 作为 hook 输入 JSON 的占位符。如果 `$ARGUMENTS` 不存在,输入 JSON 被追加到提示 |

2394| `model` | 否 | 用于评估的模型。默认为快速模型 |

2395| `timeout` | 否 | 超时(秒)。默认值:30 |

2396 

2397### 响应架构

2398 

2399LLM 必须使用包含以下内容的 JSON 响应:

2400 

2401```json theme={null}

2402{

2403 "ok": true | false,

2404 "reason": "Explanation for the decision"

2405}

2406```

2407 

2408| 字段 | 描述 |

2409| :------- | :------------------------- |

2410| `ok` | `true` 允许操作,`false` 阻止它 |

2411| `reason` | 当 `ok` 为 `false` 时必需。阻止的解释 |

2412 

2413`ok: false` 时发生的情况取决于事件:

2414 

2415* `Stop` 和 `SubagentStop`:原因被反馈给 Claude 作为其下一条指令,转轮继续

2416* `PreToolUse`:工具调用被拒绝,原因作为工具错误返回给 Claude,等同于命令 hook 的 `permissionDecision: "deny"`

2417* `PostToolUse`、`PostToolBatch`、`UserPromptSubmit` 和 `UserPromptExpansion`:转轮结束,原因在聊天中显示为警告行,等同于从命令 hook 返回 `"continue": false`

2418* `PostToolUseFailure`、`TaskCreated` 和 `TaskCompleted`:原因作为工具错误返回给 Claude,类似于 `PreToolUse`

2419* `PermissionRequest`:`ok: false` 无效。要从 hook 拒绝批准,请使用[命令 hook](#command-hook-fields),返回 `hookSpecificOutput.decision.behavior: "deny"`

2420 

2421如果您需要对任何事件进行更精细的控制,请使用[命令 hook](#command-hook-fields),其中包含[决定控制](#decision-control)中描述的每个事件字段。

2422 

2423### 示例:多条件 Stop hook

2424 

2425此 `Stop` hook 使用详细提示检查三个条件,然后允许 Claude 停止。如果 `"ok"` 为 `false`,Claude 继续工作,提供的原因作为其下一条指令。`SubagentStop` hooks 使用相同的格式来评估[子代理](/zh-CN/sub-agents)是否应该停止:

2426 

2427```json theme={null}

2428{

2429 "hooks": {

2430 "Stop": [

2431 {

2432 "hooks": [

2433 {

2434 "type": "prompt",

2435 "prompt": "You are evaluating whether Claude should stop working. Context: $ARGUMENTS\n\nAnalyze the conversation and determine if:\n1. All user-requested tasks are complete\n2. Any errors need to be addressed\n3. Follow-up work is needed\n\nRespond with JSON: {\"ok\": true} to allow stopping, or {\"ok\": false, \"reason\": \"your explanation\"} to continue working.",

2436 "timeout": 30

2437 }

2438 ]

2439 }

2440 ]

2441 }

2442}

2443```

2444 

2445## 基于代理的 hooks

2446 

2447<Warning>

2448 代理 hooks 是实验性的。行为和配置可能在未来版本中更改。对于生产工作流,建议使用[命令 hooks](#command-hook-fields)。

2449</Warning>

2450 

2451基于代理的 hooks(`type: "agent"`)类似于基于提示的 hooks,但具有多轮工具访问。代理 hook 生成一个可以读取文件、搜索代码和检查代码库以验证条件的 subagent,而不是单个 LLM 调用。代理 hooks 支持与基于提示的 hooks 相同的事件。

2452 

2453### 基于代理的 hooks 如何工作

2454 

2455当代理 hook 触发时:

2456 

24571. Claude Code 生成一个 subagent,带有您的提示和 hook 的 JSON 输入

24582. Subagent 可以使用 Read、Grep 和 Glob 等工具进行调查

24593. 在最多 50 轮后,subagent 返回结构化的 `{ "ok": true/false }` 决定

24604. Claude Code 以与提示 hook 相同的方式处理决定

2461 

2462代理 hooks 在验证需要检查实际文件或测试输出时很有用,而不仅仅是评估 hook 输入数据。

2463 

2464### 代理 hook 配置

2465 

2466将 `type` 设置为 `"agent"` 并提供 `prompt` 字符串。配置字段与[提示 hooks](#prompt-hook-configuration)相同,但超时更长:

2467 

2468| 字段 | 必需 | 描述 |

2469| :-------- | :- | :----------------------------------------------- |

2470| `type` | 是 | 必须是 `"agent"` |

2471| `prompt` | 是 | 描述要验证的内容的提示。使用 `$ARGUMENTS` 作为 hook 输入 JSON 的占位符 |

2472| `model` | 否 | 要使用的模型。默认为快速模型 |

2473| `timeout` | 否 | 超时(秒)。默认值:60 |

2474 

2475响应架构与提示 hooks 相同:`{ "ok": true }` 允许或 `{ "ok": false, "reason": "..." }` 阻止。

2476 

2477此 `Stop` hook 验证所有单元测试通过,然后允许 Claude 完成:

2478 

2479```json theme={null}

2480{

2481 "hooks": {

2482 "Stop": [

2483 {

2484 "hooks": [

2485 {

2486 "type": "agent",

2487 "prompt": "Verify that all unit tests pass. Run the test suite and check the results. $ARGUMENTS",

2488 "timeout": 120

2489 }

2490 ]

2491 }

2492 ]

2493 }

2494}

2495```

2496 

2497## 在后台运行 Hooks

2498 

2499默认情况下,hooks 阻止 Claude 的执行,直到它们完成。对于长时间运行的任务,如部署、测试套件或外部 API 调用,设置 `"async": true` 以在后台运行 hook,同时 Claude 继续工作。异步 hooks 无法阻止或控制 Claude 的行为:响应字段如 `decision`、`permissionDecision` 和 `continue` 无效,因为它们会控制的操作已经完成。

2500 

2501### 配置异步 Hook

2502 

2503将 `"async": true` 添加到命令 hook 的配置以在后台运行它而不阻止 Claude。此字段仅在 `type: "command"` hooks 上可用。

2504 

2505此 hook 在每个 `Write` 工具调用后运行测试脚本。Claude 立即继续工作,同时 `run-tests.sh` 执行最多 120 秒。脚本完成时,其输出在下一个对话轮次上传递:

2506 

2507```json theme={null}

2508{

2509 "hooks": {

2510 "PostToolUse": [

2511 {

2512 "matcher": "Write",

2513 "hooks": [

2514 {

2515 "type": "command",

2516 "command": "/path/to/run-tests.sh",

2517 "async": true,

2518 "timeout": 120

2519 }

2520 ]

2521 }

2522 ]

2523 }

2524}

2525```

2526 

2527`timeout` 字段设置后台进程的最大时间(秒)。如果未指定,异步 hooks 使用与同步 hooks 相同的 10 分钟默认值。

2528 

2529### 异步 Hooks 如何执行

2530 

2531当异步 hook 触发时,Claude Code 启动 hook 进程并立即继续,不等待其完成。Hook 通过 stdin 接收与同步 hook 相同的 JSON 输入。

2532 

2533后台进程退出后,如果 hook 产生了带有 `systemMessage` 或 `additionalContext` 字段的 JSON 响应,该内容在下一个对话轮次作为上下文传递给 Claude。

2534 

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

2536 

2537### 示例:文件更改后运行测试

2538 

2539此 hook 在 Claude 写入文件时在后台启动测试套件,然后在测试完成时将结果报告回 Claude。将此脚本保存到项目中的 `.claude/hooks/run-tests-async.sh` 并使用 `chmod +x` 使其可执行:

2540 

2541```bash theme={null}

2542#!/bin/bash

2543# run-tests-async.sh

2544 

2545# 从 stdin 读取 hook 输入

2546INPUT=$(cat)

2547FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // empty')

2548 

2549# 仅对源文件运行测试

2550if [[ "$FILE_PATH" != *.ts && "$FILE_PATH" != *.js ]]; then

2551 exit 0

2552fi

2553 

2554# 运行测试并通过 systemMessage 报告结果

2555RESULT=$(npm test 2>&1)

2556EXIT_CODE=$?

2557 

2558if [ $EXIT_CODE -eq 0 ]; then

2559 echo "{\"systemMessage\": \"Tests passed after editing $FILE_PATH\"}"

2560else

2561 echo "{\"systemMessage\": \"Tests failed after editing $FILE_PATH: $RESULT\"}"

2562fi

2563```

2564 

2565然后将此配置添加到项目根目录中的 `.claude/settings.json`。`async: true` 标志让 Claude 在测试运行时继续工作:

2566 

2567```json theme={null}

2568{

2569 "hooks": {

2570 "PostToolUse": [

2571 {

2572 "matcher": "Write|Edit",

2573 "hooks": [

2574 {

2575 "type": "command",

2576 "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/run-tests-async.sh",

2577 "async": true,

2578 "timeout": 300

2579 }

2580 ]

2581 }

2582 ]

2583 }

2584}

2585```

2586 

2587### 限制

2588 

2589异步 hooks 与同步 hooks 相比有几个限制:

2590 

2591* 仅 `type: "command"` hooks 支持 `async`。基于提示的 hooks 无法异步运行。

2592* 异步 hooks 无法阻止工具调用或返回决定。到 hook 完成时,触发操作已经进行。

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

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

2595 

2596## 安全考虑

2597 

2598### 免责声明

2599 

2600命令 hooks 使用您的系统用户的完整权限运行。

2601 

2602<Warning>

2603 命令 hooks 使用您的完整用户权限执行 shell 命令。它们可以修改、删除或访问您的用户帐户可以访问的任何文件。在将任何 hook 命令添加到您的配置之前,请审查并测试它们。

2604</Warning>

2605 

2606### 安全最佳实践

2607 

2608编写 hooks 时请记住这些实践:

2609 

2610* **验证和清理输入**:永远不要盲目信任输入数据

2611* **始终引用 shell 变量**:使用 `"$VAR"` 而不是 `$VAR`

2612* **阻止路径遍历**:检查文件路径中的 `..`

2613* **使用绝对路径**:为脚本指定完整路径,使用 `"$CLAUDE_PROJECT_DIR"` 作为项目根目录

2614* **跳过敏感文件**:避免 `.env`、`.git/`、密钥等

2615 

2616## Windows PowerShell 工具

2617 

2618在 Windows 上,您可以通过在命令 hook 上设置 `"shell": "powershell"` 在 PowerShell 中运行单个 hooks。Hooks 直接生成 PowerShell,因此这适用于是否设置了 `CLAUDE_CODE_USE_POWERSHELL_TOOL`。Claude Code 自动检测 `pwsh.exe`(PowerShell 7+),回退到 `powershell.exe`(5.1)。

2619 

2620```json theme={null}

2621{

2622 "hooks": {

2623 "PostToolUse": [

2624 {

2625 "matcher": "Write",

2626 "hooks": [

2627 {

2628 "type": "command",

2629 "shell": "powershell",

2630 "command": "Write-Host 'File written'"

2631 }

2632 ]

2633 }

2634 ]

2635 }

2636}

2637```

2638 

2639## 调试 hooks

2640 

2641Hook 执行详细信息,包括哪些 hooks 匹配、它们的退出代码和完整 stdout 和 stderr,被写入调试日志文件。使用 `claude --debug-file <path>` 启动 Claude Code 以将日志写入已知位置,或运行 `claude --debug` 并在 `~/.claude/debug/<session-id>.txt` 读取日志。`--debug` 标志不打印到终端。

2642 

2643```text theme={null}

2644[DEBUG] Executing hooks for PostToolUse:Write

2645[DEBUG] Found 1 hook commands to execute

2646[DEBUG] Executing hook command: <Your command> with timeout 600000ms

2647[DEBUG] Hook command completed with status 0: <Your stdout>

2648```

2649 

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

2651 

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

hooks-guide.md +927 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 使用 hooks 自动化工作流

6 

7> 当 Claude Code 编辑文件、完成任务或需要输入时自动运行 shell 命令。格式化代码、发送通知、验证命令并强制执行项目规则。

8 

9Hooks 是用户定义的 shell 命令,在 Claude Code 生命周期中的特定点执行。它们对 Claude Code 的行为提供确定性控制,确保某些操作始终发生,而不是依赖 LLM 选择运行它们。使用 hooks 来强制执行项目规则、自动化重复任务,并将 Claude Code 与现有工具集成。

10 

11对于需要判断而不是确定性规则的决策,你也可以使用 [基于提示的 hooks](#prompt-based-hooks) 或 [基于代理的 hooks](#agent-based-hooks),它们使用 Claude 模型来评估条件。

12 

13有关扩展 Claude Code 的其他方式,请参阅 [skills](/zh-CN/skills),用于为 Claude 提供额外的指令和可执行命令,[subagents](/zh-CN/sub-agents) 用于在隔离的上下文中运行任务,以及 [plugins](/zh-CN/plugins) 用于打包要在项目间共享的扩展。

14 

15<Tip>

16 本指南涵盖常见用例和入门方法。有关完整的事件架构、JSON 输入/输出格式和异步 hooks 和 MCP 工具 hooks 等高级功能,请参阅 [Hooks 参考](/zh-CN/hooks)。

17</Tip>

18 

19## 设置你的第一个 hook

20 

21要创建 hook,请将 `hooks` 块添加到 [设置文件](#configure-hook-location)。本演练创建一个桌面通知 hook,这样每当 Claude 等待你的输入而不是监视终端时,你都会收到警报。

22 

23<Steps>

24 <Step title="将 hook 添加到你的设置">

25 打开 `~/.claude/settings.json` 并添加一个 `Notification` hook。下面的示例使用 `osascript` 用于 macOS;有关 Linux 和 Windows 命令,请参阅 [在 Claude 需要输入时获得通知](#get-notified-when-claude-needs-input)。

26 

27 ```json theme={null}

28 {

29 "hooks": {

30 "Notification": [

31 {

32 "matcher": "",

33 "hooks": [

34 {

35 "type": "command",

36 "command": "osascript -e 'display notification \"Claude Code needs your attention\" with title \"Claude Code\"'"

37 }

38 ]

39 }

40 ]

41 }

42 }

43 ```

44 

45 如果你的设置文件已经有一个 `hooks` 键,请将 `Notification` 作为现有事件键的同级添加,而不是替换整个对象。每个事件名称是单个 `hooks` 对象内的一个键:

46 

47 ```json theme={null}

48 {

49 "hooks": {

50 "PostToolUse": [

51 {

52 "matcher": "Edit|Write",

53 "hooks": [{ "type": "command", "command": "jq -r '.tool_input.file_path' | xargs npx prettier --write" }]

54 }

55 ],

56 "Notification": [

57 {

58 "matcher": "",

59 "hooks": [{ "type": "command", "command": "osascript -e 'display notification \"Claude Code needs your attention\" with title \"Claude Code\"'" }]

60 }

61 ]

62 }

63 }

64 ```

65 

66 你也可以通过在 CLI 中描述你想要的内容来要求 Claude 为你编写 hook。

67 </Step>

68 

69 <Step title="验证配置">

70 输入 `/hooks` 打开 hooks 浏览器。你将看到所有可用 hook 事件的列表,每个配置了 hooks 的事件旁边都有一个计数。选择 `Notification` 以确认你的新 hook 出现在列表中。选择 hook 会显示其详细信息:事件、匹配器、类型、源文件和命令。

71 </Step>

72 

73 <Step title="测试 hook">

74 按 `Esc` 返回 CLI。要求 Claude 做需要权限的事情,然后切换离开终端。你应该会收到桌面通知。

75 </Step>

76</Steps>

77 

78<Tip>

79 `/hooks` 菜单是只读的。要添加、修改或删除 hooks,请直接编辑你的设置 JSON 或要求 Claude 进行更改。

80</Tip>

81 

82## 你可以自动化什么

83 

84Hooks 让你在 Claude Code 生命周期中的关键点运行代码:编辑后格式化文件、在执行前阻止命令、在 Claude 需要输入时发送通知、在会话开始时注入上下文等。有关完整的 hook 事件列表,请参阅 [Hooks 参考](/zh-CN/hooks#hook-lifecycle)。

85 

86每个示例都包含一个现成的配置块,你可以将其添加到 [设置文件](#configure-hook-location)。最常见的模式:

87 

88* [在 Claude 需要输入时获得通知](#get-notified-when-claude-needs-input)

89* [编辑后自动格式化代码](#auto-format-code-after-edits)

90* [阻止对受保护文件的编辑](#block-edits-to-protected-files)

91* [压缩后重新注入上下文](#re-inject-context-after-compaction)

92* [审计配置更改](#audit-configuration-changes)

93* [当目录或文件更改时重新加载环境](#reload-environment-when-directory-or-files-change)

94* [自动批准特定权限提示](#auto-approve-specific-permission-prompts)

95 

96### 在 Claude 需要输入时获得通知

97 

98每当 Claude 完成工作并需要你的输入时获得桌面通知,这样你可以切换到其他任务而无需检查终端。

99 

100此 hook 使用 `Notification` 事件,当 Claude 等待输入或权限时触发。下面的每个选项卡使用平台的原生通知命令。将其添加到 `~/.claude/settings.json`:

101 

102<Tabs>

103 <Tab title="macOS">

104 ```json theme={null}

105 {

106 "hooks": {

107 "Notification": [

108 {

109 "matcher": "",

110 "hooks": [

111 {

112 "type": "command",

113 "command": "osascript -e 'display notification \"Claude Code needs your attention\" with title \"Claude Code\"'"

114 }

115 ]

116 }

117 ]

118 }

119 }

120 ```

121 

122 <Accordion title="如果没有通知出现">

123 `osascript` 通过内置的 Script Editor 应用程序路由通知。如果 Script Editor 没有通知权限,命令会静默失败,macOS 不会提示你授予它。在 Terminal 中运行一次以使 Script Editor 出现在你的通知设置中:

124 

125 ```bash theme={null}

126 osascript -e 'display notification "test"'

127 ```

128 

129 现在还不会出现任何内容。打开 **System Settings > Notifications**,在列表中找到 **Script Editor**,并打开 **Allow Notifications**。再次运行该命令以确认测试通知出现。

130 </Accordion>

131 </Tab>

132 

133 <Tab title="Linux">

134 ```json theme={null}

135 {

136 "hooks": {

137 "Notification": [

138 {

139 "matcher": "",

140 "hooks": [

141 {

142 "type": "command",

143 "command": "notify-send 'Claude Code' 'Claude Code needs your attention'"

144 }

145 ]

146 }

147 ]

148 }

149 }

150 ```

151 </Tab>

152 

153 <Tab title="Windows (PowerShell)">

154 ```json theme={null}

155 {

156 "hooks": {

157 "Notification": [

158 {

159 "matcher": "",

160 "hooks": [

161 {

162 "type": "command",

163 "command": "powershell.exe -Command \"[System.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms'); [System.Windows.Forms.MessageBox]::Show('Claude Code needs your attention', 'Claude Code')\""

164 }

165 ]

166 }

167 ]

168 }

169 }

170 ```

171 </Tab>

172</Tabs>

173 

174空的 `matcher` 对所有通知类型触发。要仅在特定事件上触发,请将其设置为以下值之一:

175 

176| Matcher | 触发时机 |

177| :--------------------- | :------------------ |

178| `permission_prompt` | Claude 需要你批准工具使用 |

179| `idle_prompt` | Claude 完成并等待你的下一个提示 |

180| `auth_success` | 身份验证完成 |

181| `elicitation_dialog` | MCP 服务器打开引导表单 |

182| `elicitation_complete` | MCP 引导表单被提交或关闭 |

183| `elicitation_response` | MCP 引导响应被发送回服务器 |

184 

185输入 `/hooks` 并选择 `Notification` 以确认 hook 已注册。有关完整的事件架构,请参阅 [Notification 参考](/zh-CN/hooks#notification)。

186 

187### 编辑后自动格式化代码

188 

189在 Claude 编辑的每个文件上自动运行 [Prettier](https://prettier.io/),以便格式保持一致而无需手动干预。

190 

191此 hook 使用带有 `Edit|Write` 匹配器的 `PostToolUse` 事件,因此它仅在文件编辑工具之后运行。该命令使用 [`jq`](https://jqlang.github.io/jq/) 提取编辑的文件路径并将其传递给 Prettier。将其添加到项目根目录中的 `.claude/settings.json`:

192 

193```json theme={null}

194{

195 "hooks": {

196 "PostToolUse": [

197 {

198 "matcher": "Edit|Write",

199 "hooks": [

200 {

201 "type": "command",

202 "command": "jq -r '.tool_input.file_path' | xargs npx prettier --write"

203 }

204 ]

205 }

206 ]

207 }

208}

209```

210 

211<Note>

212 本页上的 Bash 示例使用 `jq` 进行 JSON 解析。使用 `brew install jq`(macOS)、`apt-get install jq`(Debian/Ubuntu)安装它,或参阅 [`jq` 下载](https://jqlang.github.io/jq/download/)。

213</Note>

214 

215### 阻止对受保护文件的编辑

216 

217防止 Claude 修改敏感文件,如 `.env`、`package-lock.json` 或 `.git/` 中的任何内容。Claude 会收到解释编辑被阻止原因的反馈,因此它可以调整其方法。

218 

219此示例使用 hook 调用的单独脚本文件。该脚本根据受保护模式列表检查目标文件路径,并以代码 2 退出以阻止编辑。

220 

221<Steps>

222 <Step title="创建 hook 脚本">

223 将其保存到 `.claude/hooks/protect-files.sh`:

224 

225 ```bash theme={null}

226 #!/bin/bash

227 # protect-files.sh

228 

229 INPUT=$(cat)

230 FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // empty')

231 

232 PROTECTED_PATTERNS=(".env" "package-lock.json" ".git/")

233 

234 for pattern in "${PROTECTED_PATTERNS[@]}"; do

235 if [[ "$FILE_PATH" == *"$pattern"* ]]; then

236 echo "Blocked: $FILE_PATH matches protected pattern '$pattern'" >&2

237 exit 2

238 fi

239 done

240 

241 exit 0

242 ```

243 </Step>

244 

245 <Step title="使脚本可执行(macOS/Linux)">

246 Hook 脚本必须可执行才能让 Claude Code 运行它们:

247 

248 ```bash theme={null}

249 chmod +x .claude/hooks/protect-files.sh

250 ```

251 </Step>

252 

253 <Step title="注册 hook">

254 将 `PreToolUse` hook 添加到 `.claude/settings.json`,在任何 `Edit` 或 `Write` 工具调用之前运行脚本:

255 

256 ```json theme={null}

257 {

258 "hooks": {

259 "PreToolUse": [

260 {

261 "matcher": "Edit|Write",

262 "hooks": [

263 {

264 "type": "command",

265 "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/protect-files.sh"

266 }

267 ]

268 }

269 ]

270 }

271 }

272 ```

273 </Step>

274</Steps>

275 

276### 压缩后重新注入上下文

277 

278当 Claude 的上下文窗口填满时,压缩会总结对话以释放空间。这可能会丢失重要细节。使用带有 `compact` 匹配器的 `SessionStart` hook 在每次压缩后重新注入关键上下文。

279 

280你的命令写入 stdout 的任何文本都会添加到 Claude 的上下文中。此示例提醒 Claude 项目约定和最近的工作。将其添加到项目根目录中的 `.claude/settings.json`:

281 

282```json theme={null}

283{

284 "hooks": {

285 "SessionStart": [

286 {

287 "matcher": "compact",

288 "hooks": [

289 {

290 "type": "command",

291 "command": "echo 'Reminder: use Bun, not npm. Run bun test before committing. Current sprint: auth refactor.'"

292 }

293 ]

294 }

295 ]

296 }

297}

298```

299 

300你可以用任何产生动态输出的命令替换 `echo`,如 `git log --oneline -5` 来显示最近的提交。有关在每个会话开始时注入上下文,请考虑改用 [CLAUDE.md](/zh-CN/memory)。有关环境变量,请参阅参考中的 [`CLAUDE_ENV_FILE`](/zh-CN/hooks#persist-environment-variables)。

301 

302### 审计配置更改

303 

304跟踪会话期间设置或 skills 文件何时更改。`ConfigChange` 事件在外部进程或编辑器修改配置文件时触发,因此你可以记录更改以进行合规性检查或阻止未授权的修改。

305 

306此示例将每个更改附加到审计日志。将其添加到 `~/.claude/settings.json`:

307 

308```json theme={null}

309{

310 "hooks": {

311 "ConfigChange": [

312 {

313 "matcher": "",

314 "hooks": [

315 {

316 "type": "command",

317 "command": "jq -c '{timestamp: now | todate, source: .source, file: .file_path}' >> ~/claude-config-audit.log"

318 }

319 ]

320 }

321 ]

322 }

323}

324```

325 

326匹配器按配置类型过滤:`user_settings`、`project_settings`、`local_settings`、`policy_settings` 或 `skills`。要阻止更改生效,以代码 2 退出或返回 `{"decision": "block"}`。有关完整的输入架构,请参阅 [ConfigChange 参考](/zh-CN/hooks#configchange)。

327 

328### 当目录或文件更改时重新加载环境

329 

330某些项目根据你所在的目录设置不同的环境变量。[direnv](https://direnv.net/) 之类的工具在你的 shell 中自动执行此操作,但 Claude 的 Bash 工具不会自动拾取这些更改。

331 

332配对 `SessionStart` hook 和 `CwdChanged` hook 可以解决这个问题。`SessionStart` 加载你启动时所在目录的变量,`CwdChanged` 在 Claude 每次更改目录时重新加载它们。两者都写入 `CLAUDE_ENV_FILE`,Claude Code 在每个 Bash 命令之前作为脚本前导运行。将其添加到 `~/.claude/settings.json`:

333 

334```json theme={null}

335{

336 "hooks": {

337 "SessionStart": [

338 {

339 "hooks": [

340 {

341 "type": "command",

342 "command": "direnv export bash > \"$CLAUDE_ENV_FILE\""

343 }

344 ]

345 }

346 ],

347 "CwdChanged": [

348 {

349 "hooks": [

350 {

351 "type": "command",

352 "command": "direnv export bash > \"$CLAUDE_ENV_FILE\""

353 }

354 ]

355 }

356 ]

357 }

358}

359```

360 

361在每个包含 `.envrc` 的目录中运行一次 `direnv allow`,以便 direnv 被允许加载它。如果你使用 devbox 或 nix 而不是 direnv,相同的模式适用于 `devbox shellenv` 或 `devbox global shellenv` 代替 `direnv export bash`。

362 

363要对特定文件而不是每个目录更改做出反应,请使用 `FileChanged` 和 `matcher` 列出要监视的文件名,用 `|` 分隔。要构建监视列表,此值被分割为文字文件名而不是作为正则表达式进行评估。有关当文件更改时相同值如何也过滤哪些 hook 组运行,请参阅 [FileChanged](/zh-CN/hooks#filechanged)。此示例监视工作目录中 `.envrc` 和 `.env` 的更改:

364 

365```json theme={null}

366{

367 "hooks": {

368 "FileChanged": [

369 {

370 "matcher": ".envrc|.env",

371 "hooks": [

372 {

373 "type": "command",

374 "command": "direnv export bash > \"$CLAUDE_ENV_FILE\""

375 }

376 ]

377 }

378 ]

379 }

380}

381```

382 

383有关输入架构、`watchPaths` 输出和 `CLAUDE_ENV_FILE` 详情,请参阅 [CwdChanged](/zh-CN/hooks#cwdchanged) 和 [FileChanged](/zh-CN/hooks#filechanged) 参考条目。

384 

385### 自动批准特定权限提示

386 

387跳过你总是允许的工具调用的批准对话。此示例自动批准 `ExitPlanMode`,这是 Claude 在完成呈现计划并要求继续时调用的工具,因此你不会在每次计划准备好时被提示。

388 

389与上面的退出代码示例不同,自动批准需要你的 hook 将 JSON 决策写入 stdout。`PermissionRequest` hook 在 Claude Code 即将显示权限对话时触发,返回 `"behavior": "allow"` 代表你回答它。

390 

391匹配器将 hook 的范围限制为仅 `ExitPlanMode`,因此没有其他提示受到影响。将其添加到 `~/.claude/settings.json`:

392 

393```json theme={null}

394{

395 "hooks": {

396 "PermissionRequest": [

397 {

398 "matcher": "ExitPlanMode",

399 "hooks": [

400 {

401 "type": "command",

402 "command": "echo '{\"hookSpecificOutput\": {\"hookEventName\": \"PermissionRequest\", \"decision\": {\"behavior\": \"allow\"}}}'"

403 }

404 ]

405 }

406 ]

407 }

408}

409```

410 

411当 hook 批准时,Claude Code 退出计划模式并恢复进入计划模式之前处于活动状态的任何权限模式。成绩单显示"Allowed by PermissionRequest hook",其中对话会出现。hook 路径始终保持当前对话:它无法清除上下文并以对话可以的方式启动新的实现会话。

412 

413要改为设置特定的权限模式,你的 hook 的输出可以包含一个 `updatedPermissions` 数组,其中包含 `setMode` 条目。`mode` 值是任何权限模式,如 `default`、`acceptEdits` 或 `bypassPermissions`,`destination: "session"` 仅将其应用于当前会话。

414 

415<Note>

416 `bypassPermissions` 仅在会话已启动时应用,具有绕过模式可用:`--dangerously-skip-permissions`、`--permission-mode bypassPermissions`、`--allow-dangerously-skip-permissions` 或 `permissions.defaultMode: "bypassPermissions"` 在设置中,且未被 [`permissions.disableBypassPermissionsMode`](/zh-CN/permissions#managed-settings) 禁用。它永远不会作为 `defaultMode` 持久化。

417</Note>

418 

419要将会话切换到 `acceptEdits`,你的 hook 将此 JSON 写入 stdout:

420 

421```json theme={null}

422{

423 "hookSpecificOutput": {

424 "hookEventName": "PermissionRequest",

425 "decision": {

426 "behavior": "allow",

427 "updatedPermissions": [

428 { "type": "setMode", "mode": "acceptEdits", "destination": "session" }

429 ]

430 }

431 }

432}

433```

434 

435保持匹配器尽可能狭窄。匹配 `.*` 或留下匹配器为空会自动批准每个权限提示,包括文件写入和 shell 命令。有关完整的决策字段集,请参阅 [PermissionRequest 参考](/zh-CN/hooks#permissionrequest-decision-control)。

436 

437## Hooks 如何工作

438 

439Hook 事件在 Claude Code 中的特定生命周期点触发。当事件触发时,所有匹配的 hooks 并行运行,相同的 hook 命令会自动去重。下表显示每个事件及其触发时间:

440 

441| Event | When it fires |

442| :-------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------- |

443| `SessionStart` | When a session begins or resumes |

444| `Setup` | When you start Claude Code with `--init-only`, or with `--init` or `--maintenance` in `-p` mode. For one-time preparation in CI or scripts |

445| `UserPromptSubmit` | When you submit a prompt, before Claude processes it |

446| `UserPromptExpansion` | When a user-typed command expands into a prompt, before it reaches Claude. Can block the expansion |

447| `PreToolUse` | Before a tool call executes. Can block it |

448| `PermissionRequest` | When a permission dialog appears |

449| `PermissionDenied` | When a tool call is denied by the auto mode classifier. Return `{retry: true}` to tell the model it may retry the denied tool call |

450| `PostToolUse` | After a tool call succeeds |

451| `PostToolUseFailure` | After a tool call fails |

452| `PostToolBatch` | After a full batch of parallel tool calls resolves, before the next model call |

453| `Notification` | When Claude Code sends a notification |

454| `SubagentStart` | When a subagent is spawned |

455| `SubagentStop` | When a subagent finishes |

456| `TaskCreated` | When a task is being created via `TaskCreate` |

457| `TaskCompleted` | When a task is being marked as completed |

458| `Stop` | When Claude finishes responding |

459| `StopFailure` | When the turn ends due to an API error. Output and exit code are ignored |

460| `TeammateIdle` | When an [agent team](/en/agent-teams) teammate is about to go idle |

461| `InstructionsLoaded` | When a CLAUDE.md or `.claude/rules/*.md` file is loaded into context. Fires at session start and when files are lazily loaded during a session |

462| `ConfigChange` | When a configuration file changes during a session |

463| `CwdChanged` | When the working directory changes, for example when Claude executes a `cd` command. Useful for reactive environment management with tools like direnv |

464| `FileChanged` | When a watched file changes on disk. The `matcher` field specifies which filenames to watch |

465| `WorktreeCreate` | When a worktree is being created via `--worktree` or `isolation: "worktree"`. Replaces default git behavior |

466| `WorktreeRemove` | When a worktree is being removed, either at session exit or when a subagent finishes |

467| `PreCompact` | Before context compaction |

468| `PostCompact` | After context compaction completes |

469| `Elicitation` | When an MCP server requests user input during a tool call |

470| `ElicitationResult` | After a user responds to an MCP elicitation, before the response is sent back to the server |

471| `SessionEnd` | When a session terminates |

472 

473当多个 hooks 匹配时,每个都返回自己的结果。对于决策,Claude Code 选择最严格的答案。返回 `deny` 的 `PreToolUse` hook 会取消工具调用,无论其他的返回什么。一个返回 `ask` 的 hook 会强制权限提示,即使其余的返回 `allow`。来自 `additionalContext` 的文本从每个 hook 保留并一起传递给 Claude。

474 

475每个 hook 都有一个 `type` 来确定它如何运行。大多数 hooks 使用 `"type": "command"`,它运行 shell 命令。还有四种其他类型可用:

476 

477* `"type": "http"`:将事件数据 POST 到 URL。请参阅 [HTTP hooks](#http-hooks)。

478* `"type": "mcp_tool"`:在已连接的 MCP 服务器上调用工具。请参阅 [MCP tool hooks](/zh-CN/hooks#mcp-tool-hook-fields)。

479* `"type": "prompt"`:单轮 LLM 评估。请参阅 [基于提示的 hooks](#prompt-based-hooks)。

480* `"type": "agent"`:具有工具访问权限的多轮验证。Agent hooks 是实验性的,可能会改变。请参阅 [基于代理的 hooks](#agent-based-hooks)。

481 

482### 读取输入并返回输出

483 

484Hooks 通过 stdin、stdout、stderr 和退出代码与 Claude Code 通信。当事件触发时,Claude Code 将事件特定的数据作为 JSON 传递到脚本的 stdin。你的脚本读取该数据,完成其工作,并通过退出代码告诉 Claude Code 接下来要做什么。

485 

486#### Hook 输入

487 

488每个事件都包含常见字段,如 `session_id` 和 `cwd`,但每个事件类型添加不同的数据。例如,当 Claude 运行 Bash 命令时,`PreToolUse` hook 在 stdin 上接收类似以下内容:

489 

490```json theme={null}

491{

492 "session_id": "abc123", // 此会话的唯一 ID

493 "cwd": "/Users/sarah/myproject", // 事件触发时的工作目录

494 "hook_event_name": "PreToolUse", // 哪个事件触发了此 hook

495 "tool_name": "Bash", // Claude 即将使用的工具

496 "tool_input": { // Claude 传递给工具的参数

497 "command": "npm test" // 对于 Bash,这是 shell 命令

498 }

499}

500```

501 

502你的脚本可以解析该 JSON 并对任何这些字段进行操作。`UserPromptSubmit` hooks 获取 `prompt` 文本,`SessionStart` hooks 获取 `source`(启动、恢复、清除、压缩),等等。有关共享字段,请参阅参考中的 [常见输入字段](/zh-CN/hooks#common-input-fields),以及每个事件的部分了解事件特定的架构。

503 

504#### Hook 输出

505 

506你的脚本通过写入 stdout 或 stderr 并以特定代码退出来告诉 Claude Code 接下来要做什么。例如,一个想要阻止命令的 `PreToolUse` hook:

507 

508```bash theme={null}

509#!/bin/bash

510INPUT=$(cat)

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

512 

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

514 echo "Blocked: dropping tables is not allowed" >&2 # stderr 变成 Claude 的反馈

515 exit 2 # exit 2 = 阻止操作

516fi

517 

518exit 0 # exit 0 = 让它继续

519```

520 

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

522 

523* **退出 0**:操作继续。对于 `UserPromptSubmit`、`UserPromptExpansion` 和 `SessionStart` hooks,你写入 stdout 的任何内容都会添加到 Claude 的上下文中。

524* **退出 2**:操作被阻止。写入原因到 stderr,Claude 会收到它作为反馈,以便它可以调整。某些事件无法被阻止:对于 `SessionStart`、`Setup`、`Notification` 和其他事件,退出 2 向用户显示 stderr,执行继续。有关每个事件的退出代码 2 行为的完整列表,请参阅 [每个事件的退出代码 2 行为](/zh-CN/hooks#exit-code-2-behavior-per-event)。

525* **任何其他退出代码**:操作继续。成绩单显示 `<hook name> hook error` 通知,后跟 stderr 的第一行;完整的 stderr 进入 [调试日志](/zh-CN/hooks#debug-hooks)。

526 

527#### 结构化 JSON 输出

528 

529退出代码给你两个选项:允许或阻止。为了获得更多控制,退出 0 并改为将 JSON 对象打印到 stdout。

530 

531<Note>

532 使用退出 2 以 stderr 消息阻止,或使用 JSON 退出 0 以获得结构化控制。不要混合它们:Claude Code 在你退出 2 时忽略 JSON。

533</Note>

534 

535例如,`PreToolUse` hook 可以拒绝工具调用并告诉 Claude 为什么,或将其升级给用户以获得批准:

536 

537```json theme={null}

538{

539 "hookSpecificOutput": {

540 "hookEventName": "PreToolUse",

541 "permissionDecision": "deny",

542 "permissionDecisionReason": "Use rg instead of grep for better performance"

543 }

544}

545```

546 

547使用 `"deny"`,Claude Code 取消工具调用并将 `permissionDecisionReason` 反馈给 Claude。这些 `permissionDecision` 值特定于 `PreToolUse`:

548 

549* `"allow"`:跳过交互式权限提示。拒绝和询问规则,包括企业托管拒绝列表,仍然适用

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

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

552 

553第四个值 `"defer"` 在 [非交互模式](/zh-CN/headless) 中使用 `-p` 标志时可用。它以保留的工具调用退出进程,以便 Agent SDK 包装器可以收集输入并恢复。请参阅参考中的 [延迟工具调用以供稍后使用](/zh-CN/hooks#defer-a-tool-call-for-later)。

554 

555返回 `"allow"` 跳过交互式提示但不覆盖 [权限规则](/zh-CN/permissions#manage-permissions)。如果拒绝规则与工具调用匹配,即使你的 hook 返回 `"allow"`,调用也会被阻止。如果询问规则匹配,用户仍然会被提示。这意味着来自任何设置范围的拒绝规则,包括 [托管设置](/zh-CN/settings#settings-files),总是优先于 hook 批准。

556 

557其他事件使用不同的决策模式。例如,`PostToolUse` 和 `Stop` hooks 使用顶级 `decision: "block"` 字段,而 `PermissionRequest` 使用 `hookSpecificOutput.decision.behavior`。有关按事件的完整分解,请参阅参考中的 [摘要表](/zh-CN/hooks#decision-control)。

558 

559对于 `UserPromptSubmit` hooks,改用 `additionalContext` 将文本注入到 Claude 的上下文中。基于提示的 hooks(`type: "prompt"`)处理输出的方式不同:请参阅 [基于提示的 hooks](#prompt-based-hooks)。

560 

561### 使用匹配器过滤 hooks

562 

563没有匹配器,hook 会在其事件的每次出现时触发。匹配器让你缩小范围。例如,如果你只想在文件编辑后运行格式化程序(而不是在每个工具调用后),将匹配器添加到你的 `PostToolUse` hook:

564 

565```json theme={null}

566{

567 "hooks": {

568 "PostToolUse": [

569 {

570 "matcher": "Edit|Write",

571 "hooks": [

572 { "type": "command", "command": "prettier --write ..." }

573 ]

574 }

575 ]

576 }

577}

578```

579 

580`"Edit|Write"` 匹配器仅在 Claude 使用 `Edit` 或 `Write` 工具时触发,而不是在它使用 `Bash`、`Read` 或任何其他工具时触发。请参阅 [匹配器模式](/zh-CN/hooks#matcher-patterns) 了解纯名称和正则表达式如何被评估。

581 

582<Note>

583 Claude 也可以通过 `Bash` 工具运行 shell 命令来创建或修改文件。如果你的 hook 必须看到每个文件更改,例如用于合规性扫描或审计日志,添加一个 [`Stop`](/zh-CN/hooks#stop) hook,它每轮扫描一次工作树。为了获得每次调用的覆盖,也匹配 `Bash` 并让你的脚本使用 `git status --porcelain` 列出修改和未跟踪的文件。

584</Note>

585 

586每个事件类型在特定字段上匹配:

587 

588| 事件 | 匹配器过滤的内容 | 示例匹配器值 |

589| :------------------------------------------------------------------------------------------------------------------------------------ | :---------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------ |

590| `PreToolUse`、`PostToolUse`、`PostToolUseFailure`、`PermissionRequest`、`PermissionDenied` | 工具名称 | `Bash`、`Edit\|Write`、`mcp__.*` |

591| `SessionStart` | 会话如何启动 | `startup`、`resume`、`clear`、`compact` |

592| `Setup` | 哪个 CLI 标志触发了设置 | `init`、`maintenance` |

593| `SessionEnd` | 会话为什么结束 | `clear`、`resume`、`logout`、`prompt_input_exit`、`bypass_permissions_disabled`、`other` |

594| `Notification` | 通知类型 | `permission_prompt`、`idle_prompt`、`auth_success`、`elicitation_dialog`、`elicitation_complete`、`elicitation_response` |

595| `SubagentStart` | 代理类型 | `general-purpose`、`Explore`、`Plan` 或自定义代理名称 |

596| `PreCompact`、`PostCompact` | 什么触发了压缩 | `manual`、`auto` |

597| `SubagentStop` | 代理类型 | 与 `SubagentStart` 相同的值 |

598| `ConfigChange` | 配置源 | `user_settings`、`project_settings`、`local_settings`、`policy_settings`、`skills` |

599| `StopFailure` | 错误类型 | `rate_limit`、`authentication_failed`、`oauth_org_not_allowed`、`billing_error`、`invalid_request`、`server_error`、`max_output_tokens`、`unknown` |

600| `InstructionsLoaded` | 加载原因 | `session_start`、`nested_traversal`、`path_glob_match`、`include`、`compact` |

601| `Elicitation` | MCP 服务器名称 | 你配置的 MCP 服务器名称 |

602| `ElicitationResult` | MCP 服务器名称 | 与 `Elicitation` 相同的值 |

603| `FileChanged` | 文字文件名来监视(请参阅 [FileChanged](/zh-CN/hooks#filechanged)) | `.envrc\|.env` |

604| `UserPromptExpansion` | 命令名称 | 你的 skill 或命令名称 |

605| `UserPromptSubmit`、`PostToolBatch`、`Stop`、`TeammateIdle`、`TaskCreated`、`TaskCompleted`、`WorktreeCreate`、`WorktreeRemove`、`CwdChanged` | 不支持匹配器 | 始终在每次出现时触发 |

606 

607显示不同事件类型上匹配器的更多示例:

608 

609<Tabs>

610 <Tab title="记录每个 Bash 命令">

611 仅匹配 `Bash` 工具调用并将每个命令记录到文件。`PostToolUse` 事件在命令完成后触发,因此 `tool_input.command` 包含运行的内容。hook 在 stdin 上接收事件数据作为 JSON,`jq -r '.tool_input.command'` 仅提取命令字符串,`>>` 将其附加到日志文件:

612 

613 ```json theme={null}

614 {

615 "hooks": {

616 "PostToolUse": [

617 {

618 "matcher": "Bash",

619 "hooks": [

620 {

621 "type": "command",

622 "command": "jq -r '.tool_input.command' >> ~/.claude/command-log.txt"

623 }

624 ]

625 }

626 ]

627 }

628 }

629 ```

630 </Tab>

631 

632 <Tab title="匹配 MCP 工具">

633 MCP 工具使用与内置工具不同的命名约定:`mcp__<server>__<tool>`,其中 `<server>` 是 MCP 服务器名称,`<tool>` 是它提供的工具。例如,`mcp__github__search_repositories` 或 `mcp__filesystem__read_file`。使用正则表达式匹配器来针对来自特定服务器的所有工具,或使用 `mcp__.*__write.*` 之类的模式跨服务器匹配。有关完整的示例列表,请参阅参考中的 [匹配 MCP 工具](/zh-CN/hooks#match-mcp-tools)。

634 

635 下面的命令使用 `jq` 从 hook 的 JSON 输入中提取工具名称,并将其写入 stderr。将其写入 stderr 保持 stdout 清洁以用于 JSON 输出,并将消息发送到 [调试日志](/zh-CN/hooks#debug-hooks):

636 

637 ```json theme={null}

638 {

639 "hooks": {

640 "PreToolUse": [

641 {

642 "matcher": "mcp__github__.*",

643 "hooks": [

644 {

645 "type": "command",

646 "command": "echo \"GitHub tool called: $(jq -r '.tool_name')\" >&2"

647 }

648 ]

649 }

650 ]

651 }

652 }

653 ```

654 </Tab>

655 

656 <Tab title="在会话结束时清理">

657 `SessionEnd` 事件支持会话结束原因的匹配器。此 hook 仅在 `clear` 时触发(当你运行 `/clear` 时),而不是在正常退出时:

658 

659 ```json theme={null}

660 {

661 "hooks": {

662 "SessionEnd": [

663 {

664 "matcher": "clear",

665 "hooks": [

666 {

667 "type": "command",

668 "command": "rm -f /tmp/claude-scratch-*.txt"

669 }

670 ]

671 }

672 ]

673 }

674 }

675 ```

676 </Tab>

677</Tabs>

678 

679有关完整的匹配器语法,请参阅 [Hooks 参考](/zh-CN/hooks#configuration)。

680 

681#### 使用 `if` 字段按工具名称和参数过滤

682 

683<Note>

684 `if` 字段需要 Claude Code v2.1.85 或更高版本。早期版本忽略它并在每个匹配的调用上运行 hook。

685</Note>

686 

687`if` 字段使用 [权限规则语法](/zh-CN/permissions) 按工具名称和参数一起过滤 hooks,因此 hook 进程仅在工具调用匹配时生成,或当 Bash 命令太复杂而无法解析时。这超越了 `matcher`,它仅在工具名称级别按组过滤。

688 

689例如,要仅在 Claude 使用 `git` 命令而不是所有 Bash 命令时运行 hook:

690 

691```json theme={null}

692{

693 "hooks": {

694 "PreToolUse": [

695 {

696 "matcher": "Bash",

697 "hooks": [

698 {

699 "type": "command",

700 "if": "Bash(git *)",

701 "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/check-git-policy.sh"

702 }

703 ]

704 }

705 ]

706 }

707}

708```

709 

710hook 进程仅在 Bash 命令的子命令与 `git *` 匹配时生成,或当命令太复杂而无法解析为子命令时。对于像 `npm test && git push` 这样的复合命令,Claude Code 评估每个子命令并触发 hook,因为 `git push` 匹配。`if` 字段接受与权限规则相同的模式:`"Bash(git *)"`、`"Edit(*.ts)"` 等。要匹配多个工具名称,使用单独的处理程序,每个都有自己的 `if` 值,或在 `matcher` 级别匹配,其中支持管道交替。

711 

712`if` 仅适用于工具事件:`PreToolUse`、`PostToolUse`、`PostToolUseFailure`、`PermissionRequest` 和 `PermissionDenied`。将其添加到任何其他事件会阻止 hook 运行。

713 

714### 配置 hook 位置

715 

716你添加 hook 的位置决定了其范围:

717 

718| 位置 | 范围 | 可共享 |

719| :-------------------------------------------------------------- | :---------------------- | :----------- |

720| `~/.claude/settings.json` | 所有你的项目 | 否,本地到你的机器 |

721| `.claude/settings.json` | 单个项目 | 是,可以提交到仓库 |

722| `.claude/settings.local.json` | 单个项目 | 否,gitignored |

723| 托管策略设置 | 组织范围 | 是,管理员控制 |

724| [Plugin](/zh-CN/plugins) `hooks/hooks.json` | 启用插件时 | 是,与插件捆绑 |

725| [Skill](/zh-CN/skills) 或 [agent](/zh-CN/sub-agents) frontmatter | 当 skill 或 agent 处于活动状态时 | 是,在组件文件中定义 |

726 

727在 Claude Code 中运行 [`/hooks`](/zh-CN/hooks#the-hooks-menu) 以浏览所有按事件分组的配置 hooks。要一次禁用所有 hooks,在设置文件中设置 `"disableAllHooks": true`。

728 

729如果你在 Claude Code 运行时直接编辑设置文件,文件监视器通常会自动拾取 hook 更改。

730 

731## 基于提示的 hooks

732 

733对于需要判断而不是确定性规则的决策,使用 `type: "prompt"` hooks。Claude Code 不运行 shell 命令,而是将你的提示和 hook 的输入数据发送到 Claude 模型(默认为 Haiku)来做出决策。如果你需要更多功能,可以使用 `model` 字段指定不同的模型。

734 

735模型的唯一工作是返回一个是/否决策作为 JSON:

736 

737* `"ok": true`:操作继续

738* `"ok": false`:发生的情况取决于事件:

739 * `Stop` 和 `SubagentStop`:`reason` 被反馈给 Claude,以便它继续工作

740 * `PreToolUse`:工具调用被拒绝,`reason` 作为工具错误返回给 Claude,以便它可以调整并继续

741 * `PostToolUse`、`PostToolBatch`、`UserPromptSubmit` 和 `UserPromptExpansion`:回合结束,`reason` 在聊天中显示为警告行

742 

743此示例使用 `Stop` hook 询问模型是否所有请求的任务都已完成。如果模型返回 `"ok": false`,Claude 继续工作并使用 `reason` 作为其下一条指令:

744 

745```json theme={null}

746{

747 "hooks": {

748 "Stop": [

749 {

750 "hooks": [

751 {

752 "type": "prompt",

753 "prompt": "Check if all tasks are complete. If not, respond with {\"ok\": false, \"reason\": \"what remains to be done\"}."

754 }

755 ]

756 }

757 ]

758 }

759}

760```

761 

762有关完整的配置选项,请参阅参考中的 [基于提示的 hooks](/zh-CN/hooks#prompt-based-hooks)。

763 

764## 基于代理的 hooks

765 

766<Warning>

767 代理 hooks 是实验性的。行为和配置可能在未来版本中改变。对于生产工作流,更倾向于 [命令 hooks](/zh-CN/hooks#command-hook-fields)。

768</Warning>

769 

770当验证需要检查文件或运行命令时,使用 `type: "agent"` hooks。与只进行单个 LLM 调用的提示 hooks 不同,代理 hooks 生成一个 subagent,它可以读取文件、搜索代码和使用其他工具来验证条件,然后返回决策。

771 

772代理 hooks 使用与提示 hooks 相同的 `"ok"` / `"reason"` 响应格式,但默认超时更长(60 秒)和最多 50 个工具使用轮次。

773 

774此示例验证在允许 Claude 停止之前测试通过:

775 

776```json theme={null}

777{

778 "hooks": {

779 "Stop": [

780 {

781 "hooks": [

782 {

783 "type": "agent",

784 "prompt": "Verify that all unit tests pass. Run the test suite and check the results. $ARGUMENTS",

785 "timeout": 120

786 }

787 ]

788 }

789 ]

790 }

791}

792```

793 

794当 hook 输入数据本身足以做出决策时使用提示 hooks。当你需要根据代码库的实际状态验证某些内容时使用代理 hooks。

795 

796有关完整的配置选项,请参阅参考中的 [基于代理的 hooks](/zh-CN/hooks#agent-based-hooks)。

797 

798## HTTP hooks

799 

800使用 `type: "http"` hooks 将事件数据 POST 到 HTTP 端点,而不是运行 shell 命令。端点接收命令 hook 在 stdin 上接收的相同 JSON,并使用相同的 JSON 格式通过 HTTP 响应体返回结果。

801 

802HTTP hooks 在你想要 web 服务器、云函数或外部服务处理 hook 逻辑时很有用:例如,一个跨团队记录工具使用事件的共享审计服务。

803 

804此示例将每个工具使用 POST 到本地日志服务:

805 

806```json theme={null}

807{

808 "hooks": {

809 "PostToolUse": [

810 {

811 "hooks": [

812 {

813 "type": "http",

814 "url": "http://localhost:8080/hooks/tool-use",

815 "headers": {

816 "Authorization": "Bearer $MY_TOKEN"

817 },

818 "allowedEnvVars": ["MY_TOKEN"]

819 }

820 ]

821 }

822 ]

823 }

824}

825```

826 

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

828 

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

830 

831有关完整的配置选项和响应处理,请参阅参考中的 [HTTP hooks](/zh-CN/hooks#http-hook-fields)。

832 

833## 限制和故障排除

834 

835### 限制

836 

837* 命令 hooks 仅通过 stdout、stderr 和退出代码通信。它们无法触发 `/` 命令或工具调用。通过 `additionalContext` 返回的文本被注入为 Claude 作为纯文本读取的系统提醒。HTTP hooks 改为通过响应体通信。

838* Hook 超时默认为 10 分钟,可通过 `timeout` 字段(以秒为单位)按 hook 配置。

839* `PostToolUse` hooks 无法撤销操作,因为工具已经执行。

840* `PermissionRequest` hooks 不在 [非交互模式](/zh-CN/headless)(`-p`)中触发。对于自动化权限决策,使用 `PreToolUse` hooks。

841* `Stop` hooks 在 Claude 完成响应时触发,而不仅仅在任务完成时。它们不在用户中断时触发。API 错误触发 [StopFailure](/zh-CN/hooks#stopfailure) 代替。

842* 当多个 PreToolUse hooks 返回 [`updatedInput`](/zh-CN/hooks#pretooluse) 来重写工具的参数时,最后完成的获胜。由于 hooks 并行运行,顺序是非确定性的。避免有多个 hook 修改同一工具的输入。

843 

844### Hooks 和权限模式

845 

846PreToolUse hooks 在任何权限模式检查之前触发。返回 `permissionDecision: "deny"` 的 hook 会阻止工具,即使在 `bypassPermissions` 模式或使用 `--dangerously-skip-permissions` 时也是如此。这让你强制执行用户无法通过更改其权限模式来绕过的策略。

847 

848反面不成立:返回 `"allow"` 的 hook 不会绕过来自设置的拒绝规则。Hooks 可以收紧限制,但不能放松它们超过权限规则允许的范围。

849 

850### Hook 未触发

851 

852Hook 已配置但从不执行。

853 

854* 运行 `/hooks` 并确认 hook 出现在正确的事件下

855* 检查匹配器模式是否与工具名称完全匹配(匹配器区分大小写)

856* 验证你是否触发了正确的事件类型(例如,`PreToolUse` 在工具执行前触发,`PostToolUse` 在之后触发)

857* 如果在非交互模式(`-p`)中使用 `PermissionRequest` hooks,改用 `PreToolUse`

858 

859### Hook 输出中的错误

860 

861你在成绩单中看到类似"PreToolUse hook error: ..."的消息。

862 

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

864 ```bash theme={null}

865 echo '{"tool_name":"Bash","tool_input":{"command":"ls"}}' | ./my-hook.sh

866 echo $? # 检查退出代码

867 ```

868* 如果你看到"command not found",使用绝对路径或 `$CLAUDE_PROJECT_DIR` 来引用脚本

869* 如果你看到"jq: command not found",安装 `jq` 或使用 Python/Node.js 进行 JSON 解析

870* 如果脚本根本没有运行,使其可执行:`chmod +x ./my-hook.sh`

871 

872### `/hooks` 显示未配置 hooks

873 

874你编辑了设置文件但 hooks 不出现在菜单中。

875 

876* 文件编辑通常会自动拾取。如果几秒钟后它们还没有出现,文件监视器可能错过了更改:重新启动你的会话以强制重新加载。

877* 验证你的 JSON 有效(不允许尾随逗号和注释)

878* 确认设置文件在正确的位置:`.claude/settings.json` 用于项目 hooks,`~/.claude/settings.json` 用于全局 hooks

879 

880### Stop hook 永远运行

881 

882Claude 继续工作在无限循环中而不是停止。

883 

884你的 Stop hook 脚本需要检查它是否已经触发了继续。从 JSON 输入中解析 `stop_hook_active` 字段,如果为 `true` 则提前退出:

885 

886```bash theme={null}

887#!/bin/bash

888INPUT=$(cat)

889if [ "$(echo "$INPUT" | jq -r '.stop_hook_active')" = "true" ]; then

890 exit 0 # 允许 Claude 停止

891fi

892# ... 你的 hook 逻辑的其余部分

893```

894 

895### JSON 验证失败

896 

897Claude Code 显示 JSON 解析错误,即使你的 hook 脚本输出有效的 JSON。

898 

899当 Claude Code 运行 hook 时,它生成一个 shell,该 shell 源你的配置文件(`~/.zshrc` 或 `~/.bashrc`)。如果你的配置文件包含无条件的 `echo` 语句,该输出会被添加到你的 hook 的 JSON 前面:

900 

901```text theme={null}

902Shell ready on arm64

903{"decision": "block", "reason": "Not allowed"}

904```

905 

906Claude Code 尝试将其解析为 JSON 并失败。要修复此问题,在你的 shell 配置文件中包装 echo 语句,使其仅在交互式 shell 中运行:

907 

908```bash theme={null}

909# 在 ~/.zshrc 或 ~/.bashrc 中

910if [[ $- == *i* ]]; then

911 echo "Shell ready"

912fi

913```

914 

915`$-` 变量包含 shell 标志,`i` 表示交互式。Hooks 在非交互式 shell 中运行,因此 echo 被跳过。

916 

917### 调试技术

918 

919成绩单视图,使用 `Ctrl+O` 切换,显示每个触发的 hook 的单行摘要:成功是无声的,阻止错误显示 stderr,非阻止错误显示 `<hook name> hook error` 通知,后跟 stderr 的第一行。

920 

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

922 

923## 了解更多

924 

925* [Hooks 参考](/zh-CN/hooks):完整的事件架构、JSON 输出格式、异步 hooks 和 MCP 工具 hooks

926* [安全考虑](/zh-CN/hooks#security-considerations):在共享或生产环境中部署 hooks 之前查看

927* [Bash 命令验证器示例](https://github.com/anthropics/claude-code/blob/main/examples/hooks/bash_command_validator_example.py):完整的参考实现

how-claude-code-works.md +263 −0 created

Details

1> ## Documentation Index

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

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

4 

5# Claude Code 如何工作

6 

7> 了解代理循环、内置工具以及 Claude Code 如何与您的项目交互。

8 

9Claude Code 是一个在您的终端中运行的代理助手。虽然它在编码方面表现出色,但它可以帮助您完成从命令行可以做的任何事情:编写文档、运行构建、搜索文件、研究主题等。

10 

11本指南涵盖核心架构、内置功能和[有效使用 Claude Code 的提示](#work-effectively-with-claude-code)。有关分步演练,请参阅[常见工作流](/zh-CN/common-workflows)。有关 skills、MCP 和 hooks 等可扩展性功能,请参阅[扩展 Claude Code](/zh-CN/features-overview)。

12 

13## 代理循环

14 

15当您给 Claude 一个任务时,它会经历三个阶段:**收集上下文**、**采取行动**和**验证结果**。这些阶段相互融合。Claude 始终使用工具,无论是搜索文件以了解您的代码、编辑以进行更改,还是运行测试以检查其工作。

16 

17<img src="https://mintcdn.com/claude-code/c5r9_6tjPMzFdDDT/images/agentic-loop.svg?fit=max&auto=format&n=c5r9_6tjPMzFdDDT&q=85&s=5f1827dec8539f38adee90ead3a85a38" alt="代理循环:您的提示导致 Claude 收集上下文、采取行动、验证结果,并重复直到任务完成。您可以在任何时刻中断。" width="720" height="280" data-path="images/agentic-loop.svg" />

18 

19循环会根据您的要求进行调整。关于您代码库的问题可能只需要收集上下文。错误修复会循环通过所有三个阶段多次。重构可能涉及广泛的验证。Claude 根据从前一步学到的内容决定每一步需要什么,将数十个操作链接在一起并沿途进行纠正。

20 

21您也是这个循环的一部分。您可以在任何时刻中断以引导 Claude 朝不同的方向发展、提供额外的上下文或要求它尝试不同的方法。Claude 自主工作但对您的输入保持响应。

22 

23代理循环由两个组件驱动:[模型](#models)进行推理和[工具](#tools)采取行动。Claude Code 充当 Claude 周围的**代理框架**:它提供工具、上下文管理和执行环境,将语言模型转变为能够进行编码的代理。

24 

25### 模型

26 

27Claude Code 使用 Claude 模型来理解您的代码并推理任务。Claude 可以读取任何语言的代码、理解组件如何连接,以及找出需要改变什么来实现您的目标。对于复杂的任务,它将工作分解为步骤、执行它们,并根据学到的内容进行调整。

28 

29[多个模型](/zh-CN/model-config)可用,具有不同的权衡。Sonnet 可以很好地处理大多数编码任务。Opus 为复杂的架构决策提供更强的推理能力。在会话期间使用 `/model` 切换或使用 `claude --model <name>` 启动。

30 

31当本指南说"Claude 选择"或"Claude 决定"时,是模型在进行推理。

32 

33### 工具

34 

35工具是使 Claude Code 成为代理的原因。没有工具,Claude 只能用文本回应。有了工具,Claude 可以采取行动:读取您的代码、编辑文件、运行命令、搜索网络并与外部服务交互。每个工具使用都会返回信息,反馈到循环中,告知 Claude 的下一个决定。

36 

37内置工具通常分为五个类别,每个类别代表不同类型的代理能力。

38 

39| 类别 | Claude 可以做什么 |

40| -------- | ------------------------------------------------------------------------------ |

41| **文件操作** | 读取文件、编辑代码、创建新文件、重命名和重新组织 |

42| **搜索** | 按模式查找文件、使用正则表达式搜索内容、探索代码库 |

43| **执行** | 运行 shell 命令、启动服务器、运行测试、使用 git |

44| **网络** | 搜索网络、获取文档、查找错误消息 |

45| **代码智能** | 编辑后查看类型错误和警告、跳转到定义、查找引用(需要[代码智能插件](/zh-CN/discover-plugins#code-intelligence)) |

46 

47这些是主要功能。Claude 还有用于生成 subagents、询问您问题和其他编排任务的工具。有关完整列表,请参阅[Claude 可用的工具](/zh-CN/tools-reference)。

48 

49Claude 根据您的提示和沿途学到的内容选择使用哪些工具。当您说"修复失败的测试"时,Claude 可能会:

50 

511. 运行测试套件以查看失败的内容

522. 读取错误输出

533. 搜索相关的源文件

544. 读取这些文件以理解代码

555. 编辑文件以修复问题

566. 再次运行测试以验证

57 

58每个工具使用都给 Claude 新的信息,告知下一步。这就是代理循环的实际应用。

59 

60**扩展基本功能:** 内置工具是基础。您可以使用 [skills](/zh-CN/skills) 扩展 Claude 知道的内容、使用 [MCP](/zh-CN/mcp) 连接到外部服务、使用 [hooks](/zh-CN/hooks) 自动化工作流,以及将任务卸载给 [subagents](/zh-CN/sub-agents)。这些扩展形成了核心代理循环之上的一层。有关为您的需求选择正确扩展的指导,请参阅[扩展 Claude Code](/zh-CN/features-overview)。

61 

62## Claude 可以访问什么

63 

64本指南重点关注终端。Claude Code 也在 [VS Code](/zh-CN/vs-code)、[JetBrains IDE](/zh-CN/jetbrains) 和其他环境中运行。

65 

66当您在目录中运行 `claude` 时,Claude Code 可以访问:

67 

68* **您的项目。** 您目录和子目录中的文件,以及其他地方有您许可的文件。

69* **您的终端。** 您可以运行的任何命令:构建工具、git、包管理器、系统实用程序、脚本。如果您可以从命令行做到,Claude 也可以。

70* **您的 git 状态。** 当前分支、未提交的更改和最近的提交历史。

71* **您的 [CLAUDE.md](/zh-CN/memory)。** 一个 markdown 文件,您可以在其中存储项目特定的说明、约定和 Claude 应该在每个会话中了解的上下文。

72* **[自动内存](/zh-CN/memory#auto-memory)。** Claude 在您工作时自动保存的学习内容,如项目模式和您的偏好。MEMORY.md 的前 200 行或 25KB(以先到者为准)在每个会话开始时加载。

73* **您配置的扩展。** 用于外部服务的 [MCP servers](/zh-CN/mcp)、用于工作流的 [skills](/zh-CN/skills)、用于委派工作的 [subagents](/zh-CN/sub-agents) 和用于浏览器交互的 [Claude in Chrome](/zh-CN/chrome)。

74 

75因为 Claude 看到您的整个项目,它可以跨越它工作。当您要求 Claude"修复身份验证错误"时,它搜索相关文件、读取多个文件以理解上下文、跨它们进行协调编辑、运行测试以验证修复,并在您要求时提交更改。这与只看到当前文件的内联代码助手不同。

76 

77## 环境和界面

78 

79上面描述的代理循环、工具和功能在您使用 Claude Code 的任何地方都是相同的。改变的是代码执行的位置以及您与它交互的方式。

80 

81### 执行环境

82 

83Claude Code 在三个环境中运行,每个环境对代码执行位置有不同的权衡。

84 

85| 环境 | 代码运行位置 | 用例 |

86| -------- | ---------------- | ----------------- |

87| **本地** | 您的机器 | 默认。完全访问您的文件、工具和环境 |

88| **云** | Anthropic 管理的虚拟机 | 卸载任务、处理您本地没有的仓库 |

89| **远程控制** | 您的机器,从浏览器控制 | 使用网络 UI 同时保持一切本地 |

90 

91### 界面

92 

93您可以通过终端、[桌面应用](/zh-CN/desktop)、[IDE 扩展](/zh-CN/vs-code)、[claude.ai/code](https://claude.ai/code)、[远程控制](/zh-CN/remote-control)、[Slack](/zh-CN/slack) 和 [CI/CD 管道](/zh-CN/github-actions)访问 Claude Code。界面决定了您如何看到和与 Claude 交互,但底层的代理循环是相同的。有关完整列表,请参阅[在任何地方使用 Claude Code](/zh-CN/overview#use-claude-code-everywhere)。

94 

95## 使用会话

96 

97Claude Code 在您工作时将您的对话保存在本地。每条消息、工具使用和结果都被存储,这使得[回退](#undo-changes-with-checkpoints)、[恢复和分叉](#resume-or-fork-sessions)会话成为可能。在 Claude 进行代码更改之前,它还会对受影响的文件进行快照,以便您在需要时可以恢复。

98 

99**会话是独立的。** 每个新会话都以新的上下文窗口开始,没有来自以前会话的对话历史。Claude 可以使用[自动内存](/zh-CN/memory#auto-memory)跨会话保持学习,您可以在 [CLAUDE.md](/zh-CN/memory) 中添加您自己的持久说明。

100 

101### 跨分支工作

102 

103每个 Claude Code 对话都是一个与您当前目录相关的会话。当您恢复时,您只会看到来自该目录的会话。

104 

105Claude 看到您当前分支的文件。当您切换分支时,Claude 看到新分支的文件,但您的对话历史保持不变。Claude 记得您讨论过的内容,即使在切换后也是如此。

106 

107由于会话与目录相关,您可以通过使用 [git worktrees](/zh-CN/common-workflows#run-parallel-claude-code-sessions-with-git-worktrees) 运行并行 Claude 会话,这为各个分支创建单独的目录。

108 

109### 恢复或分叉会话

110 

111当您使用 `claude --continue` 或 `claude --resume` 恢复会话时,您使用相同的会话 ID 从中断处继续。新消息附加到现有对话。您的完整对话历史被恢复,但会话范围的权限不会。您需要重新批准这些。

112 

113<img src="https://mintcdn.com/claude-code/c5r9_6tjPMzFdDDT/images/session-continuity.svg?fit=max&auto=format&n=c5r9_6tjPMzFdDDT&q=85&s=fa41d12bfb57579cabfeece907151d30" alt="会话连续性:恢复继续相同的会话,分叉创建一个具有新 ID 的新分支。" width="560" height="280" data-path="images/session-continuity.svg" />

114 

115要分支并尝试不同的方法而不影响原始会话,请使用 `--fork-session` 标志:

116 

117```bash theme={null}

118claude --continue --fork-session

119```

120 

121这会创建一个新的会话 ID,同时保留到该点的对话历史。原始会话保持不变。与恢复一样,分叉的会话不继承会话范围的权限。

122 

123**在多个终端中的相同会话**:如果您在多个终端中恢复相同的会话,两个终端都会写入相同的会话文件。来自两者的消息会交错,就像两个人在同一个笔记本中写字一样。没有任何内容损坏,但对话变得混乱。每个终端在会话期间只看到自己的消息,但如果您稍后恢复该会话,您会看到所有内容交错。对于从相同起点的并行工作,使用 `--fork-session` 为每个终端提供自己的干净会话。

124 

125### 上下文窗口

126 

127Claude 的上下文窗口保存您的对话历史、文件内容、命令输出、[CLAUDE.md](/zh-CN/memory)、[自动内存](/zh-CN/memory#auto-memory)、加载的 skills 和系统说明。当您工作时,上下文填满。Claude 自动压缩,但对话早期的说明可能会丢失。将持久规则放在 CLAUDE.md 中,并运行 `/context` 以查看什么在占用空间。

128 

129有关交互式演练,了解什么加载以及何时加载,请参阅[探索上下文窗口](/zh-CN/context-window)。

130 

131#### 当上下文填满时

132 

133Claude Code 在您接近限制时自动管理上下文。它首先清除较旧的工具输出,然后在需要时总结对话。您的请求和关键代码片段被保留;对话早期的详细说明可能会丢失。将持久规则放在 CLAUDE.md 中,而不是依赖对话历史。

134 

135要控制在压缩期间保留的内容,请在 CLAUDE.md 中添加"Compact Instructions"部分或使用焦点运行 `/compact`(如 `/compact focus on the API changes`)。

136 

137运行 `/context` 以查看什么在占用空间。MCP 工具定义默认被延迟,并通过[工具搜索](/zh-CN/mcp#scale-with-mcp-tool-search)按需加载,因此只有工具名称消耗上下文,直到 Claude 使用特定工具。运行 `/mcp` 以检查每个服务器的成本。

138 

139#### 使用 skills 和 subagents 管理上下文

140 

141除了压缩,您可以使用其他功能来控制什么加载到上下文中。

142 

143[Skills](/zh-CN/skills) 按需加载。Claude 在会话开始时看到 skill 描述,但完整内容仅在使用 skill 时加载。对于您手动调用的 skills,设置 `disable-model-invocation: true` 以将描述保留在上下文之外,直到您需要它们。

144 

145[Subagents](/zh-CN/sub-agents) 获得自己的新上下文,完全独立于您的主对话。他们的工作不会使您的上下文膨胀。完成后,他们返回一个摘要。这种隔离是为什么 subagents 有助于长会话。

146 

147有关每个功能的成本,请参阅[上下文成本](/zh-CN/features-overview#understand-context-costs),有关管理上下文的提示,请参阅[减少令牌使用](/zh-CN/costs#reduce-token-usage)。

148 

149## 使用检查点和权限保持安全

150 

151Claude 有两个安全机制:检查点让您撤销文件更改,权限控制 Claude 可以在不询问的情况下做什么。

152 

153### 使用检查点撤销更改

154 

155**每个文件编辑都是可逆的。** 在 Claude 编辑任何文件之前,它会对当前内容进行快照。如果出现问题,按两次 `Esc` 以回退到之前的状态,或要求 Claude 撤销。

156 

157检查点是会话本地的,独立于 git。它们仅涵盖文件更改。影响远程系统的操作(数据库、API、部署)无法进行检查点,这就是为什么 Claude 在运行具有外部副作用的命令之前询问。

158 

159### 控制 Claude 可以做什么

160 

161按 `Shift+Tab` 循环通过权限模式:

162 

163* **默认**:Claude 在文件编辑和 shell 命令之前询问

164* **自动接受编辑**:Claude 编辑文件而不询问,仍然询问命令

165* **Plan Mode**:Claude 仅使用只读工具,创建您可以在执行前批准的计划

166* **自动模式**:Claude 使用后台安全检查评估所有操作。目前是研究预览

167 

168您也可以在 `.claude/settings.json` 中允许特定命令,以便 Claude 不会每次都询问。这对于受信任的命令(如 `npm test` 或 `git status`)很有用。设置可以从组织范围的策略范围到个人偏好。有关详细信息,请参阅[权限](/zh-CN/permissions)。

169 

170***

171 

172## 有效使用 Claude Code

173 

174这些提示可以帮助您从 Claude Code 获得更好的结果。

175 

176### 向 Claude Code 寻求帮助

177 

178Claude Code 可以教您如何使用它。提出问题,如"我如何设置 hooks?"或"构建我的 CLAUDE.md 的最佳方式是什么?",Claude 会解释。

179 

180内置命令也会指导您完成设置:

181 

182* `/init` 引导您为项目创建 CLAUDE.md

183* `/agents` 帮助您配置自定义 subagents

184* `/doctor` 诊断您的安装的常见问题

185 

186### 这是一个对话

187 

188Claude Code 是对话式的。您不需要完美的提示。从您想要的开始,然后细化:

189 

190```text theme={null}

191修复登录错误

192```

193 

194\[Claude 调查,尝试一些东西]

195 

196```text theme={null}

197这不太对。问题在于会话处理。

198```

199 

200\[Claude 调整方法]

201 

202当第一次尝试不对时,您不会重新开始。您迭代。

203 

204#### 中断和引导

205 

206您可以在任何时刻中断 Claude。如果它走错了路,只需输入您的更正并按 Enter。Claude 将停止正在做的事情并根据您的输入调整其方法。您不必等待它完成或重新开始。

207 

208### 预先具体

209 

210您的初始提示越精确,您需要的更正就越少。参考特定文件、提及约束并指出示例模式。

211 

212```text theme={null}

213结账流程对于持有过期卡的用户来说已损坏。

214检查 src/payments/ 中的问题,特别是令牌刷新。

215首先编写一个失败的测试,然后修复它。

216```

217 

218模糊的提示有效,但您会花更多时间引导。像上面这样的具体提示通常在第一次尝试时就成功。

219 

220### 给 Claude 一些东西来验证

221 

222Claude 在能够检查自己的工作时表现更好。包括测试用例、粘贴预期 UI 的屏幕截图或定义您想要的输出。

223 

224```text theme={null}

225实现 validateEmail。测试用例:'user@example.com' → true,

226'invalid' → false,'user@.com' → false。之后运行测试。

227```

228 

229对于视觉工作,粘贴设计的屏幕截图并要求 Claude 将其实现与其进行比较。

230 

231### 在实现之前探索

232 

233对于复杂的问题,将研究与编码分开。使用 plan mode(按 `Shift+Tab` 两次)首先分析代码库:

234 

235```text theme={null}

236读取 src/auth/ 并理解我们如何处理会话。

237然后为添加 OAuth 支持创建一个计划。

238```

239 

240审查计划,通过对话细化它,然后让 Claude 实现。这种两阶段方法比直接跳到代码产生更好的结果。

241 

242### 委派,不要指示

243 

244想象委派给一个有能力的同事。提供上下文和方向,然后相信 Claude 会弄清楚细节:

245 

246```text theme={null}

247结账流程对于持有过期卡的用户来说已损坏。

248相关代码在 src/payments/ 中。您可以调查并修复它吗?

249```

250 

251您不需要指定要读取哪些文件或运行什么命令。Claude 会弄清楚。

252 

253## 接下来是什么

254 

255<CardGroup cols={2}>

256 <Card title="使用功能扩展" icon="puzzle-piece" href="/zh-CN/features-overview">

257 添加 Skills、MCP 连接和自定义命令

258 </Card>

259 

260 <Card title="常见工作流" icon="graduation-cap" href="/zh-CN/common-workflows">

261 典型任务的分步指南

262 </Card>

263</CardGroup>

interactive-mode.md +362 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 交互模式

6 

7> Claude Code 会话中键盘快捷键、输入模式和交互功能的完整参考。

8 

9## 键盘快捷键

10 

11<Note>

12 键盘快捷键可能因平台和终端而异。按 `?` 查看您的环境中可用的快捷键。

13 

14 **macOS 用户**:Option/Alt 键快捷键(`Alt+B`、`Alt+F`、`Alt+Y`、`Alt+M`、`Alt+P`、`Alt+T`)需要在终端中将 Option 配置为 Meta:

15 

16 * **iTerm2**:设置 → 配置文件 → 键 → 常规 → 将左/右 Option 键设置为"Esc+"

17 * **Apple Terminal**:设置 → 配置文件 → 键盘 → 勾选"使用 Option 作为 Meta 键"

18 * **VS Code**:在 VS Code 设置中设置 `"terminal.integrated.macOptionIsMeta": true`

19 

20 有关详细信息,请参阅[终端配置](/zh-CN/terminal-config)。

21</Note>

22 

23### 常规控制

24 

25| 快捷键 | 描述 | 上下文 |

26| :------------------------------------------- | :-------------------- | :---------------------------------------------------------------------------------------------------------------------------------- |

27| `Ctrl+C` | 取消当前输入或生成 | 标准中断 |

28| `Ctrl+X Ctrl+K` | 终止所有后台代理。在 3 秒内按两次以确认 | 后台代理控制 |

29| `Ctrl+D` | 退出 Claude Code 会话 | EOF 信号 |

30| `Ctrl+G` 或 `Ctrl+X Ctrl+E` | 在默认文本编辑器中打开 | 在默认文本编辑器中编辑您的提示或自定义响应。`Ctrl+X Ctrl+E` 是 readline 原生绑定。在 `/config` 中打开"在外部编辑器中显示最后响应"以在您的提示上方将 Claude 的上一个回复作为 `#` 注释上下文预置;保存时会删除注释块 |

31| `Ctrl+L` | 重绘屏幕 | 强制完整的终端重绘。输入和对话历史被保留。使用此功能可在显示变得混乱或部分空白时恢复 |

32| `Ctrl+O` | 切换转录查看器 | 显示详细的工具使用和执行情况。还会展开 MCP 调用,这些调用默认会折叠为单行,如"Called slack 3 times" |

33| `Ctrl+R` | 反向搜索命令历史 | 交互式搜索以前的命令 |

34| `Ctrl+V` 或 `Cmd+V`(iTerm2)或 `Alt+V`(Windows) | 从剪贴板粘贴图像 | 在光标处插入 `[Image #N]` 芯片,以便您可以在提示中按位置引用它 |

35| `Ctrl+B` | 后台运行任务 | 后台运行 bash 命令和代理。Tmux 用户按两次 |

36| `Ctrl+T` | 切换任务列表 | 在终端状态区域中显示或隐藏[任务列表](#task-list) |

37| `Left/Right arrows` | 在对话框选项卡之间循环 | 在权限对话框和菜单中的选项卡之间导航 |

38| `Up/Down arrows` 或 `Ctrl+P`/`Ctrl+N` | 移动光标或导航命令历史 | 在多行输入中,首先在提示内移动光标。一旦光标已在顶部或底部边缘,再次按下会导航命令历史 |

39| `Esc` + `Esc` | 回退或总结 | 将代码和/或对话恢复到上一个点,或从选定的消息进行总结 |

40| `Shift+Tab` 或 `Alt+M`(某些配置) | 循环权限模式 | 在 `default`、`acceptEdits`、`plan` 和您启用的任何模式(如 `auto` 或 `bypassPermissions`)之间循环。请参阅[权限模式](/zh-CN/permission-modes)。 |

41| `Option+P`(macOS)或 `Alt+P`(Windows/Linux) | 切换模型 | 在不清除提示的情况下切换模型 |

42| `Option+T`(macOS)或 `Alt+T`(Windows/Linux) | 切换扩展思考 | 启用或禁用扩展思考模式。在 macOS 上,配置您的终端以发送 Option 作为 Meta,以便此快捷键工作 |

43| `Option+O`(macOS)或 `Alt+O`(Windows/Linux) | 切换快速模式 | 启用或禁用[快速模式](/zh-CN/fast-mode) |

44 

45### 文本编辑

46 

47| 快捷键 | 描述 | 上下文 |

48| :--------------------- | :----------- | :-------------------------------------------------------------------------------------------- |

49| `Ctrl+A` | 将光标移动到当前行的开始 | 在多行输入中,移动到当前逻辑行的开始 |

50| `Ctrl+E` | 将光标移动到当前行的末尾 | 在多行输入中,移动到当前逻辑行的末尾 |

51| `Ctrl+K` | 删除到行尾 | 存储已删除的文本以供粘贴 |

52| `Ctrl+U` | 从光标删除到行首 | 存储已删除的文本以供粘贴。重复以清除多行输入中的多行。在 macOS 上,终端模拟器(包括 iTerm2 和 Terminal.app)将 `Cmd+Backspace` 映射到此快捷键 |

53| `Ctrl+W` | 删除上一个单词 | 存储已删除的文本以供粘贴。在 Windows 上,`Ctrl+Backspace` 也会删除上一个单词 |

54| `Ctrl+Y` | 粘贴已删除的文本 | 粘贴用 `Ctrl+K`、`Ctrl+U` 或 `Ctrl+W` 删除的文本 |

55| `Alt+Y`(在 `Ctrl+Y` 之后) | 循环粘贴历史 | 粘贴后,循环浏览以前删除的文本。在 macOS 上需要[将 Option 作为 Meta](#keyboard-shortcuts) |

56| `Alt+B` | 将光标向后移动一个单词 | 单词导航。在 macOS 上需要[将 Option 作为 Meta](#keyboard-shortcuts) |

57| `Alt+F` | 将光标向前移动一个单词 | 单词导航。在 macOS 上需要[将 Option 作为 Meta](#keyboard-shortcuts) |

58 

59### 主题和显示

60 

61| 快捷键 | 描述 | 上下文 |

62| :------- | :----------- | :-------------------------------------------- |

63| `Ctrl+T` | 切换代码块的语法突出显示 | 仅在 `/theme` 选择器菜单内工作。控制 Claude 响应中的代码是否使用语法着色 |

64 

65### 多行输入

66 

67| 方法 | 快捷键 | 上下文 |

68| :---------- | :------------- | :------------------------------------------------------------------------------------------- |

69| 快速转义 | `\` + `Enter` | 在所有终端中工作 |

70| Option 键 | `Option+Enter` | 在 macOS 上启用[将 Option 作为 Meta](/zh-CN/terminal-config#enable-option-key-shortcuts-on-macos) 后 |

71| Shift+Enter | `Shift+Enter` | 在 iTerm2、WezTerm、Ghostty、Kitty、Warp、Apple Terminal 中开箱即用 |

72| 控制序列 | `Ctrl+J` | 在任何终端中工作,无需配置 |

73| 粘贴模式 | 直接粘贴 | 对于代码块、日志 |

74 

75<Tip>

76 Shift+Enter 在 iTerm2、WezTerm、Ghostty、Kitty、Warp 和 Apple Terminal 中无需配置即可工作。对于 VS Code、Cursor、Windsurf、Alacritty 和 Zed,运行 `/terminal-setup` 以安装绑定。

77</Tip>

78 

79### 快速命令

80 

81| 快捷键 | 描述 | 注释 |

82| :------ | :-------- | :------------------------------------------ |

83| `/` 在开始 | 命令或 skill | 请参阅[命令](#commands)和 [skills](/zh-CN/skills) |

84| `!` 在开始 | Bash 模式 | 直接运行命令并将执行输出添加到会话 |

85| `@` | 文件路径提及 | 触发文件路径自动完成 |

86 

87### 转录查看器

88 

89当转录查看器打开时(使用 `Ctrl+O` 切换),这些快捷键可用。`Ctrl+E` 可以通过 [`transcript:toggleShowAll`](/zh-CN/keybindings) 重新绑定。

90 

91| 快捷键 | 描述 |

92| :----------------- | :---------------------------------------------------------------------------------------------------------------- |

93| `Ctrl+E` | 切换显示所有内容 |

94| `[` | 将完整对话写入终端的原生滚动缓冲区,以便 `Cmd+F`、tmux 复制模式和其他原生工具可以搜索它。需要[全屏渲染](/zh-CN/fullscreen#search-and-review-the-conversation) |

95| `v` | 将对话写入临时文件并在 `$VISUAL` 或 `$EDITOR` 中打开它。需要[全屏渲染](/zh-CN/fullscreen) |

96| `q`、`Ctrl+C`、`Esc` | 退出转录视图。所有三个都可以通过 [`transcript:exit`](/zh-CN/keybindings) 重新绑定 |

97 

98### 语音输入

99 

100| 快捷键 | 描述 | 注释 |

101| :------------ | :--- | :------------------------------------------------------------------------------------------------------------------------- |

102| 按住或点击 `Space` | 语音听写 | 需要启用[语音听写](/zh-CN/voice-dictation)。按住以录制,或运行 `/voice tap` 以进行点击切换。[可重新绑定](/zh-CN/voice-dictation#rebind-the-dictation-key) |

103 

104## 命令

105 

106在 Claude Code 中键入 `/` 以查看所有可用命令,或键入 `/` 后跟任何字母以进行筛选。`/` 菜单显示您可以调用的所有内容:内置命令、捆绑的和用户编写的 [skills](/zh-CN/skills),以及由 [plugins](/zh-CN/plugins) 和 [MCP servers](/zh-CN/mcp#use-mcp-prompts-as-commands) 贡献的命令。并非所有内置命令对每个用户都可见,因为某些命令取决于您的平台或计划。

107 

108有关 Claude Code 中包含的命令的完整列表,请参阅[命令参考](/zh-CN/commands)。

109 

110## Vim 编辑器模式

111 

112通过 `/config` → 编辑器模式启用 vim 风格编辑。

113 

114### 模式切换

115 

116| 命令 | 操作 | 来自模式 |

117| :---- | :----------- | :------------ |

118| `Esc` | 进入 NORMAL 模式 | INSERT、VISUAL |

119| `i` | 在光标前插入 | NORMAL |

120| `I` | 在行首插入 | NORMAL |

121| `a` | 在光标后插入 | NORMAL |

122| `A` | 在行尾插入 | NORMAL |

123| `o` | 在下方打开行 | NORMAL |

124| `O` | 在上方打开行 | NORMAL |

125| `v` | 开始字符级可视选择 | NORMAL |

126| `V` | 开始行级可视选择 | NORMAL |

127 

128### 导航(NORMAL 模式)

129 

130| 命令 | 操作 |

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

132| `h`/`j`/`k`/`l` | 向左/向下/向上/向右移动 |

133| `w` | 下一个单词 |

134| `e` | 单词末尾 |

135| `b` | 上一个单词 |

136| `0` | 行首 |

137| `$` | 行尾 |

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

139| `gg` | 输入开始 |

140| `G` | 输入结束 |

141| `f{char}` | 跳转到下一个字符出现处 |

142| `F{char}` | 跳转到上一个字符出现处 |

143| `t{char}` | 跳转到下一个字符出现处之前 |

144| `T{char}` | 跳转到上一个字符出现处之后 |

145| `;` | 重复最后一个 f/F/t/T 动作 |

146| `,` | 反向重复最后一个 f/F/t/T 动作 |

147 

148<Note>

149 在 vim 正常模式下,如果光标在输入的开始或结束处且无法进一步移动,`j`/`k` 和箭头键将导航命令历史。

150</Note>

151 

152### 编辑(NORMAL 模式)

153 

154| 命令 | 操作 |

155| :------------- | :---------- |

156| `x` | 删除字符 |

157| `dd` | 删除行 |

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

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

160| `cc` | 更改行 |

161| `C` | 更改到行尾 |

162| `cw`/`ce`/`cb` | 更改单词/到末尾/向后 |

163| `yy`/`Y` | 复制行 |

164| `yw`/`ye`/`yb` | 复制单词/到末尾/向后 |

165| `p` | 在光标后粘贴 |

166| `P` | 在光标前粘贴 |

167| `>>` | 缩进行 |

168| `<<` | 取消缩进行 |

169| `J` | 连接行 |

170| `u` | 撤销 |

171| `.` | 重复最后一个更改 |

172 

173### 文本对象(NORMAL 模式)

174 

175文本对象与 `d`、`c` 和 `y` 等运算符一起工作:

176 

177| 命令 | 操作 |

178| :-------- | :--------------- |

179| `iw`/`aw` | 内部/周围单词 |

180| `iW`/`aW` | 内部/周围 WORD(空白分隔) |

181| `i"`/`a"` | 内部/周围双引号 |

182| `i'`/`a'` | 内部/周围单引号 |

183| `i(`/`a(` | 内部/周围括号 |

184| `i[`/`a[` | 内部/周围方括号 |

185| `i{`/`a{` | 内部/周围大括号 |

186 

187### 可视模式

188 

189按 `v` 进行字符级选择或按 `V` 进行行级选择。动作扩展选择,运算符直接作用于选择。

190 

191| 命令 | 操作 |

192| :--------------- | :------------------- |

193| `d`/`x` | 删除选择 |

194| `y` | 复制选择 |

195| `c`/`s` | 更改选择 |

196| `p` | 用寄存器内容替换选择 |

197| `r{char}` | 将每个选定的字符替换为 `{char}` |

198| `~`/`u`/`U` | 切换、小写或大写选择 |

199| `>`/`<` | 缩进或取消缩进选定的行 |

200| `J` | 连接选定的行 |

201| `o` | 交换光标和锚点 |

202| `iw`/`aw`/`i"`/… | 选择文本对象 |

203| `v`/`V` | 在字符级和行级之间切换,或退出 |

204 

205不支持使用 `Ctrl+V` 的块级可视模式。

206 

207## 命令历史

208 

209Claude Code 为当前会话维护命令历史:

210 

211* 输入历史按工作目录存储

212* 当您运行 `/clear` 以启动新会话时,输入历史会重置。上一个会话的对话被保留并可以恢复。

213* 使用向上/向下箭头导航(请参阅上面的快捷键)

214* **注意**:历史扩展(`!`)默认禁用

215 

216### 使用 Ctrl+R 反向搜索

217 

218按 `Ctrl+R` 以交互方式搜索您的命令历史:

219 

2201. **开始搜索**:按 `Ctrl+R` 激活反向历史搜索

2212. **键入查询**:输入文本以在以前的命令中搜索。搜索词在匹配结果中突出显示

2223. **导航匹配**:再次按 `Ctrl+R` 以循环浏览较旧的匹配

2234. **更改范围**:按 `Ctrl+S` 在此会话、此项目和所有项目之间循环

2245. **接受匹配**:

225 * 按 `Tab` 或 `Esc` 接受当前匹配并继续编辑

226 * 按 `Enter` 接受并立即执行命令

2276. **取消搜索**:

228 * 按 `Ctrl+C` 取消并恢复原始输入

229 * 在空搜索上按 `Backspace` 以取消

230 

231搜索显示匹配的命令,搜索词突出显示,因此您可以找到并重用以前的输入。

232 

233## 后台 bash 命令

234 

235Claude Code 支持在后台运行 bash 命令,允许您在长时间运行的进程执行时继续工作。

236 

237### 后台运行的工作原理

238 

239当 Claude Code 在后台运行命令时,它异步运行命令并立即返回后台任务 ID。Claude Code 可以在命令继续在后台执行时响应新提示。

240 

241要在后台运行命令,您可以:

242 

243* 提示 Claude Code 在后台运行命令

244* 按 Ctrl+B 将常规 Bash 工具调用移到后台。(Tmux 用户必须按 Ctrl+B 两次,因为 tmux 的前缀键。)

245 

246**主要功能:**

247 

248* 输出被写入文件,Claude 可以使用 Read 工具检索它

249* 后台任务具有唯一的 ID 用于跟踪和输出检索

250* 当 Claude Code 退出时,后台任务会自动清理

251* 如果输出超过 5GB,后台任务会自动终止,stderr 中会有说明原因的注释

252 

253要禁用所有后台任务功能,请将 `CLAUDE_CODE_DISABLE_BACKGROUND_TASKS` 环境变量设置为 `1`。有关详细信息,请参阅[环境变量](/zh-CN/env-vars)。

254 

255**常见的后台命令:**

256 

257* 构建工具(webpack、vite、make)

258* 包管理器(npm、yarn、pnpm)

259* 测试运行器(jest、pytest)

260* 开发服务器

261* 长时间运行的进程(docker、terraform)

262 

263### 使用 `!` 前缀的 Bash 模式

264 

265通过在输入前加上 `!` 来直接运行 bash 命令,无需通过 Claude:

266 

267```bash theme={null}

268! npm test

269! git status

270! ls -la

271```

272 

273Bash 模式:

274 

275* 将命令及其输出添加到对话上下文

276* 显示实时进度和输出

277* 支持相同的 `Ctrl+B` 后台运行长时间运行的命令

278* 不需要 Claude 解释或批准命令

279* 支持基于历史的自动完成:键入部分命令并按 **Tab** 以从当前项目中的上一个 `!` 命令完成

280* 使用 `Escape`、`Backspace` 或在空提示上使用 `Ctrl+U` 退出

281* 将以 `!` 开头的文本粘贴到空提示中会自动进入 bash 模式,与键入的 `!` 行为相匹配

282 

283这对于快速 shell 操作同时保持对话上下文很有用。

284 

285## 提示建议

286 

287当您首次打开会话时,灰显的示例命令会出现在提示输入中以帮助您入门。Claude Code 从您的项目的 git 历史中选择此命令,因此它反映了您最近一直在处理的文件。

288 

289Claude 响应后,建议会根据您的对话历史继续出现,例如多部分请求的后续步骤或工作流的自然延续。

290 

291* 按 **Tab** 或 **Right arrow** 接受建议,或按 **Enter** 接受并提交

292* 开始输入以关闭它

293 

294建议作为后台请求运行,该请求重用父对话的提示缓存,因此额外成本最小。当缓存冷时,Claude Code 会跳过建议生成以避免不必要的成本。

295 

296在对话的第一轮之后、在非交互模式下以及在 Plan Mode 中,建议会自动跳过。

297 

298要完全禁用提示建议,请设置环境变量或在 `/config` 中切换设置:

299 

300```bash theme={null}

301export CLAUDE_CODE_ENABLE_PROMPT_SUGGESTION=false

302```

303 

304## 使用 /btw 的侧面问题

305 

306使用 `/btw` 快速提问您当前的工作,而不添加到对话历史。当您想要快速答案但不想混乱主要上下文或使 Claude 偏离长时间运行的任务时,这很有用。

307 

308```

309/btw what was the name of that config file again?

310```

311 

312侧面问题可以完全看到当前对话,因此您可以询问 Claude 已经读过的代码、它之前做出的决定或会话中的任何其他内容。问题和答案是短暂的:它们出现在可关闭的覆盖层中,永远不会进入对话历史。

313 

314* **Claude 工作时可用**:即使 Claude 正在处理响应时,您也可以运行 `/btw`。侧面问题独立运行,不会中断主要轮次。

315* **无工具访问**:侧面问题仅从已在上下文中的内容回答。Claude 在回答侧面问题时无法读取文件、运行命令或搜索。

316* **单一响应**:没有后续轮次。如果您需要来回,请改用正常提示。

317* **低成本**:侧面问题重用父对话的提示缓存,因此额外成本最小。

318 

319按 **Space**、**Enter** 或 **Escape** 关闭答案并返回提示。

320 

321`/btw` 是 [subagent](/zh-CN/sub-agents) 的反面:它看到您的完整对话但没有工具,而 subagent 具有完整工具但从空上下文开始。使用 `/btw` 询问 Claude 从此会话已知的内容;使用 subagent 去发现新的东西。

322 

323## 任务列表

324 

325在处理复杂的多步骤工作时,Claude 会创建任务列表来跟踪进度。任务出现在终端的状态区域中,指示器显示待处理、进行中或完成的内容。

326 

327* 按 `Ctrl+T` 切换任务列表视图。显示一次最多 5 个任务

328* 要查看所有任务或清除它们,直接询问 Claude:"show me all tasks"或"clear all tasks"

329* 任务在上下文压缩中持续存在,帮助 Claude 在较大的项目上保持组织

330* 要在会话之间共享任务列表,请设置 `CLAUDE_CODE_TASK_LIST_ID` 以使用 `~/.claude/tasks/` 中的命名目录:`CLAUDE_CODE_TASK_LIST_ID=my-project claude`

331 

332## 会话回顾

333 

334当您从离开后返回终端时,Claude Code 会显示到目前为止会话中发生的情况的单行回顾。回顾在后台生成,一旦自上次完成的轮次以来至少已经过了三分钟且终端未聚焦,就会生成,因此当您切换回来时已准备好。回顾仅在会话至少有三个轮次后出现,并且永远不会连续出现两次。

335 

336运行 `/recap` 以按需生成摘要。要关闭自动回顾,打开 `/config` 并禁用**会话回顾**。

337 

338会话回顾在每个计划和提供商上默认启用。回顾在非交互模式下始终被跳过。

339 

340## PR 审查状态

341 

342在处理具有开放拉取请求的分支时,Claude Code 在页脚中显示可点击的 PR 链接(例如"PR #446")。该链接具有彩色下划线,指示审查状态:

343 

344* 绿色:已批准

345* 黄色:待审查

346* 红色:请求更改

347* 灰色:草稿

348* 紫色:已合并

349 

350`Cmd+click`(Mac)或 `Ctrl+click`(Windows/Linux)链接以在浏览器中打开拉取请求。状态每 60 秒自动更新一次。

351 

352<Note>

353 PR 状态需要安装并验证 `gh` CLI(`gh auth login`)。

354</Note>

355 

356## 另请参阅

357 

358* [Skills](/zh-CN/skills) - 自定义提示和工作流

359* [Checkpointing](/zh-CN/checkpointing) - 回退 Claude 的编辑并恢复以前的状态

360* [CLI 参考](/zh-CN/cli-reference) - 命令行标志和选项

361* [设置](/zh-CN/settings) - 配置选项

362* [内存管理](/zh-CN/memory) - 管理 CLAUDE.md 文件

jetbrains.md +192 −0 created

Details

1> ## Documentation Index

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

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

4 

5# JetBrains IDEs

6 

7> 在 JetBrains IDE(包括 IntelliJ、PyCharm、WebStorm 等)中使用 Claude Code

8 

9Claude Code 通过专用插件与 JetBrains IDE 集成,提供交互式差异查看、选择上下文共享等功能。

10 

11## 支持的 IDE

12 

13Claude Code 插件适用于大多数 JetBrains IDE,包括:

14 

15* IntelliJ IDEA

16* PyCharm

17* Android Studio

18* WebStorm

19* PhpStorm

20* GoLand

21 

22## 功能

23 

24* **快速启动**:使用 `Cmd+Esc`(Mac)或 `Ctrl+Esc`(Windows/Linux)直接从编辑器打开 Claude Code,或点击 UI 中的 Claude Code 按钮

25* **差异查看**:代码更改可以直接在 IDE 差异查看器中显示,而不是在终端中显示

26* **选择上下文**:IDE 中的当前选择或标签页会自动与 Claude Code 共享

27* **文件引用快捷方式**:使用 `Cmd+Option+K`(Mac)或 `Alt+Ctrl+K`(Linux/Windows)插入文件引用,例如 `@src/auth.ts#L1-99`

28* **诊断共享**:IDE 中的诊断错误(如 lint 和语法错误)在您工作时会自动与 Claude 共享

29 

30## 安装

31 

32### 市场安装

33 

34从 JetBrains 市场查找并安装 [Claude Code 插件](https://plugins.jetbrains.com/plugin/27310-claude-code-beta-),然后重启您的 IDE。

35 

36如果您还没有安装 Claude Code,请参阅[快速入门指南](/zh-CN/quickstart)了解安装说明。

37 

38<Note>

39 安装插件后,您可能需要完全重启 IDE 才能使其生效。

40</Note>

41 

42## 使用

43 

44### 从您的 IDE

45 

46从 IDE 的集成终端运行 `claude`,所有集成功能都将处于活跃状态。

47 

48### 从外部终端

49 

50在任何外部终端中使用 `/ide` 命令将 Claude Code 连接到您的 JetBrains IDE 并激活所有功能:

51 

52```bash theme={null}

53claude

54```

55 

56```text theme={null}

57/ide

58```

59 

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

61 

62## 配置

63 

64### Claude Code 设置

65 

66通过 Claude Code 的设置配置 IDE 集成:

67 

681. 运行 `claude`

692. 输入 `/config` 命令

703. 将差异工具设置为 `auto` 以在 IDE 中显示差异,或设置为 `terminal` 以在终端中保留它们

71 

72### 插件设置

73 

74通过转到 **Settings → Tools → Claude Code \[Beta]** 配置 Claude Code 插件:

75 

76#### 常规设置

77 

78* **Claude 命令**:指定自定义命令来运行 Claude,例如 `claude`、`/usr/local/bin/claude` 或 `npx @anthropic-ai/claude-code`

79* **抑制 Claude 命令未找到的通知**:跳过有关找不到 Claude 命令的通知

80* **启用使用 Option+Enter 进行多行提示**:仅在 macOS 上。启用后,Option+Enter 在 Claude Code 提示中插入新行。如果 Option 键被意外捕获,请禁用。需要终端重启。

81* **启用自动更新**:自动检查并安装插件更新,在重启时应用

82 

83<Tip>

84 对于 WSL 用户:将 `wsl -d Ubuntu -- bash -lic "claude"` 设置为您的 Claude 命令(将 `Ubuntu` 替换为您的 WSL 发行版名称)

85</Tip>

86 

87#### ESC 键配置

88 

89如果 ESC 键在 JetBrains 终端中无法中断 Claude Code 操作:

90 

911. 转到 **Settings → Tools → Terminal**

922. 执行以下任一操作:

93 * 取消选中"使用 Escape 将焦点移动到编辑器",或

94 * 点击"配置终端快捷键"并删除"切换焦点到编辑器"快捷方式

953. 应用更改

96 

97这将允许 ESC 键正确中断 Claude Code 操作。

98 

99## 特殊配置

100 

101### 远程开发

102 

103<Warning>

104 使用 JetBrains 远程开发时,您必须通过 **Settings → Plugin (Host)** 在远程主机上安装插件。

105</Warning>

106 

107插件必须安装在远程主机上,而不是在您的本地客户端计算机上。

108 

109### WSL 配置

110 

111如果您在 WSL2 上使用 Claude Code 和 JetBrains IDE,并看到"未检测到可用的 IDE",原因通常是 WSL2 的 NAT 网络或 Windows 防火墙阻止了 WSL2 和在 Windows 主机上运行的 IDE 之间的连接。WSL1 直接使用主机的网络,不受影响。

112 

113#### 允许 WSL2 流量通过 Windows 防火墙

114 

115这是推荐的修复方法,因为它保持您现有的 WSL2 网络模式。

116 

117<Steps>

118 <Step title="查找您的 WSL2 IP 地址">

119 从您的 WSL shell 内部运行:

120 

121 ```bash theme={null}

122 hostname -I

123 ```

124 

125 记下子网,例如 `172.21.123.45` 在 `172.21.0.0/16` 中。

126 </Step>

127 

128 <Step title="创建防火墙规则">

129 以管理员身份打开 PowerShell 并运行以下命令,调整 IP 范围以匹配您的子网:

130 

131 ```powershell theme={null}

132 New-NetFirewallRule -DisplayName "Allow WSL2 Internal Traffic" -Direction Inbound -Protocol TCP -Action Allow -RemoteAddress 172.21.0.0/16 -LocalAddress 172.21.0.0/16

133 ```

134 </Step>

135 

136 <Step title="重启您的 IDE 和 Claude Code">

137 关闭并重新打开两者,以使新规则生效。

138 </Step>

139</Steps>

140 

141#### 将 WSL2 切换到镜像网络

142 

143镜像网络需要 Windows 11 22H2 或更高版本。如果您使用 Windows 10,请改用上面的防火墙规则。

144 

145将以下内容添加到 Windows 用户目录中的 `.wslconfig`:

146 

147```ini theme={null}

148[wsl2]

149networkingMode=mirrored

150```

151 

152然后从 PowerShell 使用 `wsl --shutdown` 重启 WSL。

153 

154## 故障排除

155 

156### 插件不工作

157 

158如果插件已安装但 Claude Code 功能未出现在您的 IDE 中:

159 

160* 确保您从项目根目录运行 Claude Code

161* 检查 JetBrains 插件在 IDE 设置中是否已启用

162* 完全重启 IDE(您可能需要多次执行此操作)

163* 对于远程开发,确保插件已安装在远程主机上

164 

165### IDE 未检测到

166 

167如果运行 `claude` 显示"未检测到可用的 IDE":

168 

169* 验证插件已安装并启用

170* 完全重启 IDE

171* 检查您是否从集成终端运行 Claude Code

172* 对于 WSL 用户,请参阅上面的 [WSL 配置](#wsl-配置)

173 

174### 命令未找到

175 

176如果点击 Claude 图标显示"命令未找到":

177 

1781. 通过在终端中运行 `claude --version` 验证 Claude Code 已安装

1792. 在插件设置中配置 Claude 命令路径

1803. 对于 WSL 用户,使用配置部分中提到的 WSL 命令格式

181 

182## 安全考虑

183 

184当 Claude Code 在启用自动编辑权限的 JetBrains IDE 中运行时,它可能能够修改可由您的 IDE 自动执行的 IDE 配置文件。这可能会增加在自动编辑模式下运行 Claude Code 的风险,并允许绕过 Claude Code 对 bash 执行的权限提示。

185 

186在 JetBrains IDE 中运行时,请考虑:

187 

188* 对编辑使用手动批准模式

189* 特别小心确保 Claude 仅与受信任的提示一起使用

190* 了解 Claude Code 有权修改哪些文件

191 

192如需 IDE 外的 Claude Code 安装或登录问题,请参阅[故障排除安装和登录](/zh-CN/troubleshoot-install)。

keybindings.md +463 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 自定义快捷键

6 

7> 使用快捷键配置文件在 Claude Code 中自定义快捷键。

8 

9<Note>

10 可自定义的快捷键需要 Claude Code v2.1.18 或更高版本。使用 `claude --version` 检查您的版本。

11</Note>

12 

13Claude Code 支持可自定义的快捷键。运行 `/keybindings` 来创建或打开位于 `~/.claude/keybindings.json` 的配置文件。

14 

15## 配置文件

16 

17快捷键配置文件是一个包含 `bindings` 数组的对象。每个块指定一个上下文和一个按键映射到操作的映射。

18 

19<Note>快捷键文件的更改会自动检测并应用,无需重启 Claude Code。</Note>

20 

21| 字段 | 描述 |

22| :--------- | :---------------------------- |

23| `$schema` | 可选的 JSON Schema URL,用于编辑器自动完成 |

24| `$docs` | 可选的文档 URL |

25| `bindings` | 按上下文分组的绑定块数组 |

26 

27此示例将 `Ctrl+E` 绑定到在聊天上下文中打开外部编辑器,并取消绑定 `Ctrl+U`:

28 

29```json theme={null}

30{

31 "$schema": "https://www.schemastore.org/claude-code-keybindings.json",

32 "$docs": "https://code.claude.com/docs/zh-CN/keybindings",

33 "bindings": [

34 {

35 "context": "Chat",

36 "bindings": {

37 "ctrl+e": "chat:externalEditor",

38 "ctrl+u": null

39 }

40 }

41 ]

42}

43```

44 

45## 上下文

46 

47每个绑定块指定一个**上下文**,其中绑定适用:

48 

49| 上下文 | 描述 |

50| :---------------- | :---------------- |

51| `Global` | 在应用程序的任何地方应用 |

52| `Chat` | 主聊天输入区域 |

53| `Autocomplete` | 自动完成菜单已打开 |

54| `Settings` | 设置菜单 |

55| `Confirmation` | 权限和确认对话框 |

56| `Tabs` | 选项卡导航组件 |

57| `Help` | 帮助菜单可见 |

58| `Transcript` | 记录查看器 |

59| `HistorySearch` | 历史搜索模式(Ctrl+R) |

60| `Task` | 后台任务正在运行 |

61| `ThemePicker` | 主题选择器对话框 |

62| `Attachments` | 图像附件在选择对话框中的导航 |

63| `Footer` | 页脚指示器导航(任务、团队、差异) |

64| `MessageSelector` | 回溯和总结对话框消息选择 |

65| `DiffDialog` | 差异查看器导航 |

66| `ModelPicker` | 模型选择器工作量级别 |

67| `Select` | 通用选择/列表组件 |

68| `Plugin` | 插件对话框(浏览、发现、管理) |

69| `Scroll` | 对话滚动和全屏模式下的文本选择 |

70| `Doctor` | `/doctor` 诊断屏幕 |

71 

72## 可用操作

73 

74操作遵循 `namespace:action` 格式,例如 `chat:submit` 发送消息或 `app:toggleTodos` 显示任务列表。每个上下文都有特定的可用操作。

75 

76### 应用程序操作

77 

78在 `Global` 上下文中可用的操作:

79 

80| 操作 | 默认 | 描述 |

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

82| `app:interrupt` | Ctrl+C | 取消当前操作 |

83| `app:exit` | Ctrl+D | 退出 Claude Code |

84| `app:redraw` | (未绑定) | 强制终端重绘 |

85| `app:toggleTodos` | Ctrl+T | 切换任务列表可见性 |

86| `app:toggleTranscript` | Ctrl+O | 切换详细记录 |

87 

88### 历史操作

89 

90用于导航命令历史的操作:

91 

92| 操作 | 默认 | 描述 |

93| :----------------- | :----- | :----- |

94| `history:search` | Ctrl+R | 打开历史搜索 |

95| `history:previous` | Up | 上一个历史项 |

96| `history:next` | Down | 下一个历史项 |

97 

98### 聊天操作

99 

100在 `Chat` 上下文中可用的操作:

101 

102| 操作 | 默认 | 描述 |

103| :-------------------- | :----------------------- | :--------------------------------------------------------------------------------- |

104| `chat:cancel` | Escape | 取消当前输入 |

105| `chat:clearInput` | Ctrl+L | 强制全屏重绘,保留输入。在[全屏渲染](/zh-CN/fullscreen#clear-the-conversation)中,在两秒内按两次以运行 `/clear` |

106| `chat:clearScreen` | Cmd+K | 在[全屏渲染](/zh-CN/fullscreen#clear-the-conversation)中,在两秒内按两次以运行 `/clear` |

107| `chat:killAgents` | Ctrl+X Ctrl+K | 终止所有后台代理 |

108| `chat:cycleMode` | Shift+Tab\* | 循环权限模式 |

109| `chat:modelPicker` | Meta+P | 打开模型选择器 |

110| `chat:fastMode` | Meta+O | 切换快速模式 |

111| `chat:thinkingToggle` | Meta+T | 切换扩展思考 |

112| `chat:submit` | Enter | 提交消息 |

113| `chat:newline` | Ctrl+J | 插入换行符而不提交 |

114| `chat:undo` | Ctrl+\_, Ctrl+Shift+- | 撤销上一个操作 |

115| `chat:externalEditor` | Ctrl+G, Ctrl+X Ctrl+E | 在外部编辑器中打开 |

116| `chat:stash` | Ctrl+S | 隐藏当前提示 |

117| `chat:imagePaste` | Ctrl+V(Windows 上为 Alt+V) | 粘贴图像 |

118 

119\*在没有 VT 模式的 Windows 上(Node \<24.2.0/\<22.17.0,Bun \<1.2.23),默认为 Meta+M。

120 

121### 自动完成操作

122 

123在 `Autocomplete` 上下文中可用的操作:

124 

125| 操作 | 默认 | 描述 |

126| :---------------------- | :----- | :---- |

127| `autocomplete:accept` | Tab | 接受建议 |

128| `autocomplete:dismiss` | Escape | 关闭菜单 |

129| `autocomplete:previous` | Up | 上一个建议 |

130| `autocomplete:next` | Down | 下一个建议 |

131 

132### 确认操作

133 

134在 `Confirmation` 上下文中可用的操作:

135 

136| 操作 | 默认 | 描述 |

137| :-------------------------- | :-------- | :----- |

138| `confirm:yes` | Y, Enter | 确认操作 |

139| `confirm:no` | N, Escape | 拒绝操作 |

140| `confirm:previous` | Up | 上一个选项 |

141| `confirm:next` | Down | 下一个选项 |

142| `confirm:nextField` | Tab | 下一个字段 |

143| `confirm:previousField` | (未绑定) | 上一个字段 |

144| `confirm:toggle` | Space | 切换选择 |

145| `confirm:cycleMode` | Shift+Tab | 循环权限模式 |

146| `confirm:toggleExplanation` | Ctrl+E | 切换权限说明 |

147 

148### 权限操作

149 

150在 `Confirmation` 上下文中可用的权限对话框操作:

151 

152| 操作 | 默认 | 描述 |

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

154| `permission:toggleDebug` | Ctrl+D | 切换权限调试信息 |

155 

156### 记录操作

157 

158在 `Transcript` 上下文中可用的操作:

159 

160| 操作 | 默认 | 描述 |

161| :------------------------- | :---------------- | :------- |

162| `transcript:toggleShowAll` | Ctrl+E | 切换显示所有内容 |

163| `transcript:exit` | q, Ctrl+C, Escape | 退出记录查看 |

164 

165### 历史搜索操作

166 

167在 `HistorySearch` 上下文中可用的操作:

168 

169| 操作 | 默认 | 描述 |

170| :------------------------- | :---------- | :-------------- |

171| `historySearch:next` | Ctrl+R | 下一个匹配项 |

172| `historySearch:accept` | Escape, Tab | 接受选择 |

173| `historySearch:cancel` | Ctrl+C | 取消搜索 |

174| `historySearch:execute` | Enter | 执行选定的命令 |

175| `historySearch:cycleScope` | Ctrl+S | 循环范围:会话、项目、任何地方 |

176 

177### 任务操作

178 

179在 `Task` 上下文中可用的操作:

180 

181| 操作 | 默认 | 描述 |

182| :---------------- | :----- | :----- |

183| `task:background` | Ctrl+B | 后台当前任务 |

184 

185### 主题操作

186 

187在 `ThemePicker` 上下文中可用的操作:

188 

189| 操作 | 默认 | 描述 |

190| :------------------------------- | :----- | :----- |

191| `theme:toggleSyntaxHighlighting` | Ctrl+T | 切换语法高亮 |

192 

193### 帮助操作

194 

195在 `Help` 上下文中可用的操作:

196 

197| 操作 | 默认 | 描述 |

198| :------------- | :----- | :----- |

199| `help:dismiss` | Escape | 关闭帮助菜单 |

200 

201### Tabs 操作

202 

203在 `Tabs` 上下文中可用的操作:

204 

205| 操作 | 默认 | 描述 |

206| :-------------- | :-------------- | :----- |

207| `tabs:next` | Tab, Right | 下一个选项卡 |

208| `tabs:previous` | Shift+Tab, Left | 上一个选项卡 |

209 

210### 附件操作

211 

212在 `Attachments` 上下文中可用的操作:

213 

214| 操作 | 默认 | 描述 |

215| :--------------------- | :---------------- | :------ |

216| `attachments:next` | Right | 下一个附件 |

217| `attachments:previous` | Left | 上一个附件 |

218| `attachments:remove` | Backspace, Delete | 删除选定的附件 |

219| `attachments:exit` | Down, Escape | 退出附件导航 |

220 

221### 页脚操作

222 

223在 `Footer` 上下文中可用的操作:

224 

225| 操作 | 默认 | 描述 |

226| :---------------------- | :----- | :---------------- |

227| `footer:next` | Right | 下一个页脚项 |

228| `footer:previous` | Left | 上一个页脚项 |

229| `footer:up` | Up | 在页脚中向上导航(在顶部取消选择) |

230| `footer:down` | Down | 在页脚中向下导航 |

231| `footer:openSelected` | Enter | 打开选定的页脚项 |

232| `footer:clearSelection` | Escape | 清除页脚选择 |

233 

234### 消息选择器操作

235 

236在 `MessageSelector` 上下文中可用的操作:

237 

238| 操作 | 默认 | 描述 |

239| :----------------------- | :---------------------------------------- | :------- |

240| `messageSelector:up` | Up, K, Ctrl+P | 在列表中向上移动 |

241| `messageSelector:down` | Down, J, Ctrl+N | 在列表中向下移动 |

242| `messageSelector:top` | Ctrl+Up, Shift+Up, Meta+Up, Shift+K | 跳到顶部 |

243| `messageSelector:bottom` | Ctrl+Down, Shift+Down, Meta+Down, Shift+J | 跳到底部 |

244| `messageSelector:select` | Enter | 选择消息 |

245 

246### Diff 操作

247 

248在 `DiffDialog` 上下文中可用的操作:

249 

250| 操作 | 默认 | 描述 |

251| :-------------------- | :------- | :-------- |

252| `diff:dismiss` | Escape | 关闭差异查看器 |

253| `diff:previousSource` | Left | 上一个差异源 |

254| `diff:nextSource` | Right | 下一个差异源 |

255| `diff:previousFile` | Up | 差异中的上一个文件 |

256| `diff:nextFile` | Down | 差异中的下一个文件 |

257| `diff:viewDetails` | Enter | 查看差异详情 |

258| `diff:back` | (特定于上下文) | 在差异查看器中返回 |

259 

260### 模型选择器操作

261 

262在 `ModelPicker` 上下文中可用的操作:

263 

264| 操作 | 默认 | 描述 |

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

266| `modelPicker:decreaseEffort` | Left | 降低工作量级别 |

267| `modelPicker:increaseEffort` | Right | 提高工作量级别 |

268 

269### 选择操作

270 

271在 `Select` 上下文中可用的操作:

272 

273| 操作 | 默认 | 描述 |

274| :---------------- | :-------------- | :---- |

275| `select:next` | Down, J, Ctrl+N | 下一个选项 |

276| `select:previous` | Up, K, Ctrl+P | 上一个选项 |

277| `select:accept` | Enter | 接受选择 |

278| `select:cancel` | Escape | 取消选择 |

279 

280### Plugin 操作

281 

282在 `Plugin` 上下文中可用的操作:

283 

284| 操作 | 默认 | 描述 |

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

286| `plugin:toggle` | Space | 切换插件选择 |

287| `plugin:install` | I | 安装选定的插件 |

288| `plugin:favorite` | F | 将选定的插件标记为收藏,使其在"已安装"选项卡顶部附近排序 |

289 

290### 设置操作

291 

292在 `Settings` 上下文中可用的操作:

293 

294| 操作 | 默认 | 描述 |

295| :---------------- | :---- | :------------------------- |

296| `settings:search` | / | 进入搜索模式 |

297| `settings:retry` | R | 重试加载使用数据(出错时) |

298| `settings:close` | Enter | 保存更改并关闭配置面板。Escape 放弃更改并关闭 |

299 

300### Doctor 操作

301 

302在 `Doctor` 上下文中可用的操作:

303 

304| 操作 | 默认 | 描述 |

305| :----------- | :- | :--------------------------------- |

306| `doctor:fix` | F | 将诊断报告发送给 Claude 以修复报告的问题。仅在发现问题时活跃 |

307 

308### 语音操作

309 

310在启用[语音听写](/zh-CN/voice-dictation)时,在 `Chat` 上下文中可用的操作:

311 

312| 操作 | 默认 | 描述 |

313| :----------------- | :---- | :----------------------- |

314| `voice:pushToTalk` | Space | 听写提示。根据 `/voice` 模式按住或点击 |

315 

316### 滚动操作

317 

318在启用[全屏渲染](/zh-CN/fullscreen)时,在 `Scroll` 上下文中可用的操作:

319 

320| 操作 | 默认 | 描述 |

321| :-------------------------- | :------------------- | :--------------------------------------------------- |

322| `scroll:lineUp` | (未绑定) | 向上滚动一行。鼠标滚轮滚动触发此操作 |

323| `scroll:lineDown` | (未绑定) | 向下滚动一行。鼠标滚轮滚动触发此操作 |

324| `scroll:pageUp` | PageUp | 向上滚动视口高度的一半 |

325| `scroll:pageDown` | PageDown | 向下滚动视口高度的一半 |

326| `scroll:top` | Ctrl+Home | 跳到对话的开始 |

327| `scroll:bottom` | Ctrl+End | 跳到最新消息并重新启用自动跟随 |

328| `scroll:halfPageUp` | (未绑定) | 向上滚动视口高度的一半。与 `scroll:pageUp` 相同的行为,为 vi 风格的重新绑定提供 |

329| `scroll:halfPageDown` | (未绑定) | 向下滚动视口高度的一半。与 `scroll:pageDown` 相同的行为,为 vi 风格的重新绑定提供 |

330| `scroll:fullPageUp` | (未绑定) | 向上滚动整个视口高度 |

331| `scroll:fullPageDown` | (未绑定) | 向下滚动整个视口高度 |

332| `selection:copy` | Ctrl+Shift+C / Cmd+C | 将选定的文本复制到剪贴板 |

333| `selection:clear` | (未绑定) | 清除活动的文本选择 |

334| `selection:extendLeft` | Shift+Left | 将活动选择向左扩展一列 |

335| `selection:extendRight` | Shift+Right | 将活动选择向右扩展一列 |

336| `selection:extendUp` | Shift+Up | 将活动选择向上扩展一行。当选择到达顶部边缘时滚动视口 |

337| `selection:extendDown` | Shift+Down | 将活动选择向下扩展一行。当选择到达底部边缘时滚动视口 |

338| `selection:extendLineStart` | Shift+Home | 将活动选择扩展到行的开始 |

339| `selection:extendLineEnd` | Shift+End | 将活动选择扩展到行的结束 |

340 

341## 按键语法

342 

343### 修饰符

344 

345使用修饰符键和 `+` 分隔符:

346 

347* `ctrl` 或 `control` - Control 键

348* `shift` - Shift 键

349* `alt`、`opt`、`option` 或 `meta` - Windows 和 Linux 上的 Alt 键,macOS 上的 Option 键

350* `cmd`、`command`、`super` 或 `win` - macOS 上的 Command 键,Windows 上的 Windows 键,Linux 上的 Super 键

351 

352`cmd` 组仅在报告 Super 修饰符的终端中被检测到,例如支持 Kitty 键盘协议或 xterm 的 `modifyOtherKeys` 模式的终端。大多数终端不会发送它,因此对于希望在任何地方都能工作的绑定,请使用 `ctrl` 或 `meta`。

353 

354例如:

355 

356```text theme={null}

357ctrl+k Ctrl + K

358shift+tab Shift + Tab

359meta+p macOS 上的 Option + P,其他地方的 Alt + P

360ctrl+shift+c 多个修饰符

361```

362 

363### 大写字母

364 

365独立的大写字母意味着 Shift。例如,`K` 等同于 `shift+k`。这对于 vim 风格的绑定很有用,其中大写和小写键有不同的含义。

366 

367带有修饰符的大写字母(例如 `ctrl+K`)被视为风格上的,**不**意味着 Shift:`ctrl+K` 与 `ctrl+k` 相同。

368 

369### 和弦

370 

371和弦是由空格分隔的按键序列:

372 

373```text theme={null}

374ctrl+k ctrl+s 按 Ctrl+K,释放,然后按 Ctrl+S

375```

376 

377### 特殊键

378 

379* `escape` 或 `esc` - Escape 键

380* `enter` 或 `return` - Enter 键

381* `tab` - Tab 键

382* `space` - 空格键

383* `up`、`down`、`left`、`right` - 箭头键

384* `backspace`、`delete` - 删除键

385 

386## 取消绑定默认快捷键

387 

388将操作设置为 `null` 以取消绑定默认快捷键:

389 

390```json theme={null}

391{

392 "bindings": [

393 {

394 "context": "Chat",

395 "bindings": {

396 "ctrl+s": null

397 }

398 }

399 ]

400}

401```

402 

403这也适用于和弦绑定。取消绑定共享前缀的每个和弦会释放该前缀以用作单键绑定:

404 

405```json theme={null}

406{

407 "bindings": [

408 {

409 "context": "Chat",

410 "bindings": {

411 "ctrl+x ctrl+k": null,

412 "ctrl+x ctrl+e": null,

413 "ctrl+x": "chat:newline"

414 }

415 }

416 ]

417}

418```

419 

420如果您取消绑定前缀上的某些但不是全部和弦,按下前缀仍会进入和弦等待模式以处理剩余的绑定。

421 

422## 保留的快捷键

423 

424这些快捷键无法重新绑定:

425 

426| 快捷键 | 原因 |

427| :-------- | :--------------------- |

428| Ctrl+C | 硬编码的中断/取消 |

429| Ctrl+D | 硬编码的退出 |

430| Ctrl+M | 与终端中的 Enter 相同(都发送 CR) |

431| Caps Lock | 不传递到终端应用程序 |

432 

433## 终端冲突

434 

435某些快捷键可能与终端多路复用器冲突:

436 

437| 快捷键 | 冲突 |

438| :----- | :----------------- |

439| Ctrl+B | tmux 前缀(按两次发送) |

440| Ctrl+A | GNU screen 前缀 |

441| Ctrl+Z | Unix 进程暂停(SIGTSTP) |

442 

443## Vim 模式交互

444 

445启用 vim 模式(通过 `/config` → 编辑器模式)时,快捷键和 vim 模式独立运行:

446 

447* **Vim 模式**在文本输入级别处理输入(光标移动、模式、动作)

448* **快捷键**在组件级别处理操作(切换待办事项、提交等)

449* vim 模式中的 Escape 键从 INSERT 切换到 NORMAL 模式;它不触发 `chat:cancel`

450* 大多数 Ctrl+key 快捷键通过 vim 模式传递到快捷键系统

451* 在 vim NORMAL 模式中,`?` 显示帮助菜单(vim 行为)

452 

453## 验证

454 

455Claude Code 验证您的快捷键并显示以下警告:

456 

457* 解析错误(无效的 JSON 或结构)

458* 无效的上下文名称

459* 保留快捷键冲突

460* 终端多路复用器冲突

461* 同一上下文中的重复绑定

462 

463运行 `/doctor` 查看任何快捷键警告。

llm-gateway.md +196 −0 created

Details

1> ## Documentation Index

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

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

4 

5# LLM gateway 配置

6 

7> 了解如何配置 Claude Code 以使用 LLM gateway 解决方案。涵盖网关要求、身份验证配置、模型选择和特定提供商的端点设置。

8 

9LLM gateway 提供了 Claude Code 和模型提供商之间的集中代理层,通常提供以下功能:

10 

11* **集中身份验证** - API 密钥管理的单一入口

12* **使用情况跟踪** - 监控团队和项目的使用情况

13* **成本控制** - 实施预算和速率限制

14* **审计日志** - 跟踪所有模型交互以实现合规性

15* **模型路由** - 无需更改代码即可在提供商之间切换

16 

17## 网关要求

18 

19为了使 LLM gateway 与 Claude Code 配合使用,它必须满足以下要求:

20 

21**API 格式**

22 

23网关必须向客户端公开以下至少一种 API 格式:

24 

251. **Anthropic Messages**: `/v1/messages`, `/v1/messages/count_tokens`

26 * 必须转发请求头:`anthropic-beta`、`anthropic-version`

27 

282. **Bedrock InvokeModel**: `/invoke`, `/invoke-with-response-stream`

29 * 必须保留请求体字段:`anthropic_beta`、`anthropic_version`

30 

313. **Vertex rawPredict**: `:rawPredict`、`:streamRawPredict`、`/count-tokens:rawPredict`

32 * 必须转发请求头:`anthropic-beta`、`anthropic-version`

33 

34未能转发请求头或保留请求体字段可能导致功能减少或无法使用 Claude Code 功能。

35 

36<Note>

37 Claude Code 根据 API 格式确定要启用的功能。当使用 Bedrock 或 Vertex 的 Anthropic Messages 格式时,您可能需要设置环境变量 `CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1`。

38</Note>

39 

40**请求头**

41 

42Claude Code 在每个 API 请求上包含以下请求头:

43 

44| 请求头 | 描述 |

45| :------------------------- | :-------------------------------------------------------------- |

46| `X-Claude-Code-Session-Id` | 当前 Claude Code 会话的唯一标识符。代理可以使用此标识符来聚合来自单个会话的所有 API 请求,而无需解析请求体。 |

47 

48Claude Code 还会在系统提示前面添加一个简短的归属块,其中包含客户端版本和从对话派生的指纹。Anthropic API 在处理前会删除此块,因此不会影响第一方提示缓存。如果您的网关实现了自己的提示缓存(以完整请求体为键),请设置 [`CLAUDE_CODE_ATTRIBUTION_HEADER=0`](/zh-CN/env-vars) 以省略它。

49 

50## 配置

51 

52### 模型选择

53 

54默认情况下,Claude Code 使用所选 API 格式的标准模型名称。

55 

56当 `ANTHROPIC_BASE_URL` 指向一个公开 Anthropic Messages 格式的网关时,Claude Code 在启动时会查询网关的 `/v1/models` 端点,并将返回的模型添加到 `/model` 选择器中。每个发现的条目都标记为"From gateway",并在响应中提供 `display_name` 字段时使用该字段。这需要 Claude Code v2.1.126 或更高版本。

57 

58发现功能仅适用于 Anthropic Messages 格式。它不会对 Bedrock 或 Vertex 直通端点运行,也不会在 `ANTHROPIC_BASE_URL` 未设置或指向 `api.anthropic.com` 时运行。

59 

60发现请求的身份验证方式与推理请求相同:它将 `ANTHROPIC_AUTH_TOKEN` 作为 bearer 令牌发送,或在未设置身份验证令牌时将 `ANTHROPIC_API_KEY` 作为 `x-api-key` 标头发送,以及来自 `ANTHROPIC_CUSTOM_HEADERS` 的任何标头。只有 ID 以 `claude` 或 `anthropic` 开头的模型才会被添加到选择器中。结果被缓存到 `~/.claude/cache/gateway-models.json`,并在每次启动时刷新。如果请求失败或网关未实现 `/v1/models`,选择器将回退到上一次启动时的缓存列表或内置模型列表。

61 

62如果您的网关使用与发现过滤器不匹配的模型名称,请使用 [模型配置](/zh-CN/model-config) 中记录的环境变量来手动添加它们。

63 

64## LiteLLM 配置

65 

66<Warning>

67 LiteLLM PyPI 版本 1.82.7 和 1.82.8 被恶意软件感染,存在凭证窃取风险。请勿安装这些版本。如果您已经安装了它们:

68 

69 * 删除该软件包

70 * 轮换受影响系统上的所有凭证

71 * 按照 [BerriAI/litellm#24518](https://github.com/BerriAI/litellm/issues/24518) 中的补救步骤进行操作

72 

73 LiteLLM 是第三方代理服务。Anthropic 不认可、维护或审计 LiteLLM 的安全性或功能。本指南仅供参考,可能会过时。请自行判断使用。

74</Warning>

75 

76### 前置条件

77 

78* Claude Code 更新到最新版本

79* LiteLLM Proxy Server 已部署且可访问

80* 通过您选择的提供商访问 Claude 模型

81 

82### 基本 LiteLLM 设置

83 

84**配置 Claude Code**:

85 

86#### 身份验证方法

87 

88##### 静态 API 密钥

89 

90使用固定 API 密钥的最简单方法:

91 

92```bash theme={null}

93# 在环境中设置

94export ANTHROPIC_AUTH_TOKEN=sk-litellm-static-key

95 

96# 或在 Claude Code 设置中

97{

98 "env": {

99 "ANTHROPIC_AUTH_TOKEN": "sk-litellm-static-key"

100 }

101}

102```

103 

104此值将作为 `Authorization` 请求头发送。

105 

106##### 使用辅助程序的动态 API 密钥

107 

108用于轮换密钥或按用户身份验证:

109 

1101. 创建 API 密钥辅助程序脚本:

111 

112```bash theme={null}

113#!/bin/bash

114# ~/bin/get-litellm-key.sh

115 

116# 示例:从保险库获取密钥

117vault kv get -field=api_key secret/litellm/claude-code

118 

119# 示例:生成 JWT 令牌

120jwt encode \

121 --secret="${JWT_SECRET}" \

122 --exp="+1h" \

123 '{"user":"'${USER}'","team":"engineering"}'

124```

125 

1262. 配置 Claude Code 设置以使用辅助程序:

127 

128```json theme={null}

129{

130 "apiKeyHelper": "~/bin/get-litellm-key.sh"

131}

132```

133 

1343. 设置令牌刷新间隔:

135 

136```bash theme={null}

137# 每小时刷新一次(3600000 毫秒)

138export CLAUDE_CODE_API_KEY_HELPER_TTL_MS=3600000

139```

140 

141此值将作为 `Authorization` 和 `X-Api-Key` 请求头发送。`apiKeyHelper` 的优先级低于 `ANTHROPIC_AUTH_TOKEN` 或 `ANTHROPIC_API_KEY`。

142 

143#### 统一端点(推荐)

144 

145使用 LiteLLM 的 [Anthropic 格式端点](https://docs.litellm.ai/docs/anthropic_unified):

146 

147```bash theme={null}

148export ANTHROPIC_BASE_URL=https://litellm-server:4000

149```

150 

151**统一端点相对于直通端点的优势:**

152 

153* 负载均衡

154* 故障转移

155* 对成本跟踪和最终用户跟踪的一致支持

156 

157#### 特定提供商的直通端点(替代方案)

158 

159##### 通过 LiteLLM 的 Claude API

160 

161使用 [直通端点](https://docs.litellm.ai/docs/pass_through/anthropic_completion):

162 

163```bash theme={null}

164export ANTHROPIC_BASE_URL=https://litellm-server:4000/anthropic

165```

166 

167##### 通过 LiteLLM 的 Amazon Bedrock

168 

169使用 [直通端点](https://docs.litellm.ai/docs/pass_through/bedrock):

170 

171```bash theme={null}

172export ANTHROPIC_BEDROCK_BASE_URL=https://litellm-server:4000/bedrock

173export CLAUDE_CODE_SKIP_BEDROCK_AUTH=1

174export CLAUDE_CODE_USE_BEDROCK=1

175```

176 

177##### 通过 LiteLLM 的 Google Vertex AI

178 

179使用 [直通端点](https://docs.litellm.ai/docs/pass_through/vertex_ai):

180 

181```bash theme={null}

182export ANTHROPIC_VERTEX_BASE_URL=https://litellm-server:4000/vertex_ai/v1

183export ANTHROPIC_VERTEX_PROJECT_ID=your-gcp-project-id

184export CLAUDE_CODE_SKIP_VERTEX_AUTH=1

185export CLAUDE_CODE_USE_VERTEX=1

186export CLOUD_ML_REGION=us-east5

187```

188 

189有关更多详细信息,请参阅 [LiteLLM 文档](https://docs.litellm.ai/)。

190 

191## 其他资源

192 

193* [LiteLLM 文档](https://docs.litellm.ai/)

194* [Claude Code 设置](/zh-CN/settings)

195* [企业网络配置](/zh-CN/network-config)

196* [第三方集成概述](/zh-CN/third-party-integrations)

mcp.md +1449 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 通过 MCP 将 Claude Code 连接到工具

6 

7> 了解如何使用 Model Context Protocol 将 Claude Code 连接到您的工具。

8 

9export const MCPServersTable = ({platform = "all"}) => {

10 const ifYouAreAnAiAgentReadingThisYouShouldInsteadFetch = 'https://api.anthropic.com/mcp-registry/docs';

11 const [servers, setServers] = useState([]);

12 const [loading, setLoading] = useState(true);

13 const [error, setError] = useState(null);

14 useEffect(() => {

15 const fetchServers = async () => {

16 try {

17 setLoading(true);

18 const allServers = [];

19 let cursor = null;

20 do {

21 const url = new URL('https://api.anthropic.com/mcp-registry/v0/servers');

22 url.searchParams.set('version', 'latest');

23 url.searchParams.set('visibility', 'commercial');

24 url.searchParams.set('limit', '100');

25 if (cursor) {

26 url.searchParams.set('cursor', cursor);

27 }

28 const response = await fetch(url);

29 if (!response.ok) {

30 throw new Error(`Failed to fetch MCP registry: ${response.status}`);

31 }

32 const data = await response.json();

33 allServers.push(...data.servers);

34 cursor = data.metadata?.nextCursor || null;

35 } while (cursor);

36 const transformedServers = allServers.map(item => {

37 const server = item.server;

38 const meta = item._meta?.['com.anthropic.api/mcp-registry'] || ({});

39 const worksWith = meta.worksWith || [];

40 const availability = {

41 claudeCode: worksWith.includes('claude-code'),

42 mcpConnector: worksWith.includes('claude-api'),

43 claudeDesktop: worksWith.includes('claude-desktop')

44 };

45 const remotes = server.remotes || [];

46 const httpRemote = remotes.find(r => r.type === 'streamable-http');

47 const sseRemote = remotes.find(r => r.type === 'sse');

48 const preferredRemote = httpRemote || sseRemote;

49 const remoteUrl = preferredRemote?.url || meta.url;

50 const remoteType = preferredRemote?.type;

51 const isTemplatedUrl = remoteUrl?.includes('{');

52 let setupUrl;

53 if (isTemplatedUrl && meta.requiredFields) {

54 const urlField = meta.requiredFields.find(f => f.field === 'url');

55 setupUrl = urlField?.sourceUrl || meta.documentation;

56 }

57 const urls = {};

58 if (!isTemplatedUrl) {

59 if (remoteType === 'streamable-http') {

60 urls.http = remoteUrl;

61 } else if (remoteType === 'sse') {

62 urls.sse = remoteUrl;

63 }

64 }

65 let envVars = [];

66 if (server.packages && server.packages.length > 0) {

67 const npmPackage = server.packages.find(p => p.registryType === 'npm');

68 if (npmPackage) {

69 urls.stdio = `npx -y ${npmPackage.identifier}`;

70 if (npmPackage.environmentVariables) {

71 envVars = npmPackage.environmentVariables;

72 }

73 }

74 }

75 return {

76 name: meta.displayName || server.title || server.name,

77 description: meta.oneLiner || server.description,

78 documentation: meta.documentation,

79 urls: urls,

80 envVars: envVars,

81 availability: availability,

82 customCommands: meta.claudeCodeCopyText ? {

83 claudeCode: meta.claudeCodeCopyText

84 } : undefined,

85 setupUrl: setupUrl

86 };

87 });

88 setServers(transformedServers);

89 setError(null);

90 } catch (err) {

91 setError(err.message);

92 console.error('Error fetching MCP registry:', err);

93 } finally {

94 setLoading(false);

95 }

96 };

97 fetchServers();

98 }, []);

99 const generateClaudeCodeCommand = server => {

100 if (server.customCommands && server.customCommands.claudeCode) {

101 return server.customCommands.claudeCode.replace('--transport streamable-http', '--transport http');

102 }

103 const serverSlug = server.name.toLowerCase().replace(/[^a-z0-9]/g, '-');

104 if (server.urls.http) {

105 return `claude mcp add ${serverSlug} --transport http ${server.urls.http}`;

106 }

107 if (server.urls.sse) {

108 return `claude mcp add ${serverSlug} --transport sse ${server.urls.sse}`;

109 }

110 if (server.urls.stdio) {

111 const envFlags = server.envVars && server.envVars.length > 0 ? server.envVars.map(v => `--env ${v.name}=YOUR_${v.name}`).join(' ') : '';

112 const baseCommand = `claude mcp add ${serverSlug} --transport stdio`;

113 return envFlags ? `${baseCommand} ${envFlags} -- ${server.urls.stdio}` : `${baseCommand} -- ${server.urls.stdio}`;

114 }

115 return null;

116 };

117 if (loading) {

118 return <div>Loading MCP servers...</div>;

119 }

120 if (error) {

121 return <div>Error loading MCP servers: {error}</div>;

122 }

123 const filteredServers = servers.filter(server => {

124 if (platform === "claudeCode") {

125 return server.availability.claudeCode;

126 } else if (platform === "mcpConnector") {

127 return server.availability.mcpConnector;

128 } else if (platform === "claudeDesktop") {

129 return server.availability.claudeDesktop;

130 } else if (platform === "all") {

131 return true;

132 } else {

133 throw new Error(`Unknown platform: ${platform}`);

134 }

135 });

136 return <>

137 <style jsx>{`

138 .cards-container {

139 display: grid;

140 gap: 1rem;

141 margin-bottom: 2rem;

142 }

143 .server-card {

144 border: 1px solid var(--border-color, #e5e7eb);

145 border-radius: 6px;

146 padding: 1rem;

147 }

148 .command-row {

149 display: flex;

150 align-items: center;

151 gap: 0.25rem;

152 }

153 .command-row code {

154 font-size: 0.75rem;

155 overflow-x: auto;

156 }

157 `}</style>

158 

159 <div className="cards-container">

160 {filteredServers.map(server => {

161 const claudeCodeCommand = generateClaudeCodeCommand(server);

162 const mcpUrl = server.urls.http || server.urls.sse;

163 const commandToShow = platform === "claudeCode" ? claudeCodeCommand : mcpUrl;

164 return <div key={server.name} className="server-card">

165 <div>

166 {server.documentation ? <a href={server.documentation}>

167 <strong>{server.name}</strong>

168 </a> : <strong>{server.name}</strong>}

169 </div>

170 

171 <p style={{

172 margin: '0.5rem 0',

173 fontSize: '0.9rem'

174 }}>

175 {server.description}

176 </p>

177 

178 {server.setupUrl && <p style={{

179 margin: '0.25rem 0',

180 fontSize: '0.8rem',

181 fontStyle: 'italic',

182 opacity: 0.7

183 }}>

184 Requires user-specific URL.{' '}

185 <a href={server.setupUrl} style={{

186 textDecoration: 'underline'

187 }}>

188 Get your URL here

189 </a>.

190 </p>}

191 

192 {commandToShow && !server.setupUrl && <>

193 <p style={{

194 display: 'block',

195 fontSize: '0.75rem',

196 fontWeight: 500,

197 minWidth: 'fit-content',

198 marginTop: '0.5rem',

199 marginBottom: 0

200 }}>

201 {platform === "claudeCode" ? "Command" : "URL"}

202 </p>

203 <div className="command-row">

204 <code>

205 {commandToShow}

206 </code>

207 </div>

208 </>}

209 </div>;

210 })}

211 </div>

212 </>;

213};

214 

215Claude Code 可以通过 [Model Context Protocol (MCP)](https://modelcontextprotocol.io/introduction)(一个用于 AI 工具集成的开源标准)连接到数百个外部工具和数据源。MCP 服务器为 Claude Code 提供对您的工具、数据库和 API 的访问权限。

216 

217当您发现自己从另一个工具(如问题跟踪器或监控仪表板)复制数据到聊天中时,请连接一个服务器。连接后,Claude 可以直接读取和操作该系统,而不是从您粘贴的内容中工作。

218 

219## 使用 MCP 可以做什么

220 

221连接 MCP 服务器后,您可以要求 Claude Code:

222 

223* **从问题跟踪器实现功能**:"添加 JIRA 问题 ENG-4521 中描述的功能,并在 GitHub 上创建 PR。"

224* **分析监控数据**:"检查 Sentry 和 Statsig 以检查 ENG-4521 中描述的功能的使用情况。"

225* **查询数据库**:"根据我们的 PostgreSQL 数据库,查找使用功能 ENG-4521 的 10 个随机用户的电子邮件。"

226* **集成设计**:"根据在 Slack 中发布的新 Figma 设计更新我们的标准电子邮件模板"

227* **自动化工作流**:"创建 Gmail 草稿,邀请这 10 个用户参加关于新功能的反馈会议。"

228* **对外部事件做出反应**:MCP 服务器也可以充当[频道](/zh-CN/channels),将消息推送到您的会话中,因此当您不在时,Claude 可以对 Telegram 消息、Discord 聊天或 webhook 事件做出反应。

229 

230## 流行的 MCP 服务器

231 

232以下是一些您可以连接到 Claude Code 的常用 MCP 服务器:

233 

234<Warning>

235 使用第三方 MCP 服务器需自担风险 - Anthropic 尚未验证所有这些服务器的正确性或安全性。

236 请确保您信任正在安装的 MCP 服务器。

237 使用可能获取不受信任内容的 MCP 服务器时要特别小心,因为这些可能会使您面临提示注入风险。

238</Warning>

239 

240<MCPServersTable platform="claudeCode" />

241 

242<Note>

243 **需要特定的集成?** [在 GitHub 上查找数百个更多 MCP 服务器](https://github.com/modelcontextprotocol/servers),或使用 [MCP SDK](https://modelcontextprotocol.io/quickstart/server) 构建您自己的服务器。

244</Note>

245 

246## 安装 MCP 服务器

247 

248MCP 服务器可以根据您的需求以三种不同的方式进行配置:

249 

250### 选项 1:添加远程 HTTP 服务器

251 

252HTTP 服务器是连接到远程 MCP 服务器的推荐选项。这是云服务最广泛支持的传输方式。

253 

254```bash theme={null}

255# 基本语法

256claude mcp add --transport http <name> <url>

257 

258# 真实示例:连接到 Notion

259claude mcp add --transport http notion https://mcp.notion.com/mcp

260 

261# 带有 Bearer 令牌的示例

262claude mcp add --transport http secure-api https://api.example.com/mcp \

263 --header "Authorization: Bearer your-token"

264```

265 

266### 选项 2:添加远程 SSE 服务器

267 

268<Warning>

269 SSE (Server-Sent Events) 传输已弃用。请在可用的地方使用 HTTP 服务器。

270</Warning>

271 

272```bash theme={null}

273# 基本语法

274claude mcp add --transport sse <name> <url>

275 

276# 真实示例:连接到 Asana

277claude mcp add --transport sse asana https://mcp.asana.com/sse

278 

279# 带有身份验证标头的示例

280claude mcp add --transport sse private-api https://api.company.com/sse \

281 --header "X-API-Key: your-key-here"

282```

283 

284### 选项 3:添加本地 stdio 服务器

285 

286Stdio 服务器作为您机器上的本地进程运行。它们非常适合需要直接系统访问或自定义脚本的工具。

287 

288```bash theme={null}

289# 基本语法

290claude mcp add [options] <name> -- <command> [args...]

291 

292# 真实示例:添加 Airtable 服务器

293claude mcp add --transport stdio --env AIRTABLE_API_KEY=YOUR_KEY airtable \

294 -- npx -y airtable-mcp-server

295```

296 

297<Note>

298 **重要:选项顺序**

299 

300 所有选项(`--transport`、`--env`、`--scope`、`--header`)必须在服务器名称**之前**。然后 `--`(双破折号)将服务器名称与传递给 MCP 服务器的命令和参数分开。

301 

302 例如:

303 

304 * `claude mcp add --transport stdio myserver -- npx server` → 运行 `npx server`

305 * `claude mcp add --transport stdio --env KEY=value myserver -- python server.py --port 8080` → 运行 `python server.py --port 8080`,环境中有 `KEY=value`

306 

307 这可以防止 Claude 的标志与服务器标志之间的冲突。

308</Note>

309 

310### 管理您的服务器

311 

312配置后,您可以使用这些命令管理您的 MCP 服务器:

313 

314```bash theme={null}

315# 列出所有配置的服务器

316claude mcp list

317 

318# 获取特定服务器的详细信息

319claude mcp get github

320 

321# 删除服务器

322claude mcp remove github

323 

324# (在 Claude Code 中)检查服务器状态

325/mcp

326```

327 

328### 动态工具更新

329 

330Claude Code 支持 MCP `list_changed` 通知,允许 MCP 服务器动态更新其可用工具、提示和资源,而无需您断开连接并重新连接。当 MCP 服务器发送 `list_changed` 通知时,Claude Code 会自动刷新来自该服务器的可用功能。

331 

332### 自动重新连接

333 

334如果 HTTP 或 SSE 服务器在会话中途断开连接,Claude Code 会自动以指数退避方式重新连接:最多五次尝试,从一秒延迟开始,每次加倍。服务器在 `/mcp` 中显示为待处理状态,同时重新连接正在进行中。五次失败尝试后,服务器被标记为失败,您可以从 `/mcp` 手动重试。Stdio 服务器是本地进程,不会自动重新连接。

335 

336相同的退避策略也适用于 HTTP 或 SSE 服务器在启动时初始连接失败的情况。从 v2.1.121 开始,Claude Code 在瞬时错误(如 5xx 响应、连接被拒绝或超时)上最多重试初始连接三次,如果仍然无法连接,则将服务器标记为失败。身份验证和未找到错误不会重试,因为它们需要配置更改才能解决。

337 

338### 使用频道推送消息

339 

340MCP 服务器也可以直接将消息推送到您的会话中,以便 Claude 可以对外部事件(如 CI 结果、监控警报或聊天消息)做出反应。要启用此功能,您的服务器声明 `claude/channel` 功能,并在启动时使用 `--channels` 标志选择加入。请参阅[频道](/zh-CN/channels)以使用官方支持的频道,或[频道参考](/zh-CN/channels-reference)以构建您自己的频道。

341 

342<Tip>

343 提示:

344 

345 * 使用 `--scope` 标志指定配置的存储位置:

346 * `local`(默认):仅在当前项目中对您可用(在较旧版本中称为 `project`)

347 * `project`:通过 `.mcp.json` 文件与项目中的每个人共享

348 * `user`:在所有项目中对您可用(在较旧版本中称为 `global`)

349 * 使用 `--env` 标志设置环境变量(例如,`--env KEY=value`)

350 * 使用 MCP\_TIMEOUT 环境变量配置 MCP 服务器启动超时(例如,`MCP_TIMEOUT=10000 claude` 设置 10 秒超时)

351 * 当 MCP 工具输出超过 10,000 个令牌时,Claude Code 将显示警告。要增加此限制,请设置 `MAX_MCP_OUTPUT_TOKENS` 环境变量(例如,`MAX_MCP_OUTPUT_TOKENS=50000`)

352 * 使用 `/mcp` 对需要 OAuth 2.0 身份验证的远程服务器进行身份验证

353</Tip>

354 

355### 插件提供的 MCP 服务器

356 

357[插件](/zh-CN/plugins)可以捆绑 MCP 服务器,在启用插件时自动提供工具和集成。插件 MCP 服务器的工作方式与用户配置的服务器相同。

358 

359**插件 MCP 服务器的工作原理**:

360 

361* 插件在插件根目录的 `.mcp.json` 中或在 `plugin.json` 中内联定义 MCP 服务器

362* 启用插件时,其 MCP 服务器会自动启动

363* 插件 MCP 工具与手动配置的 MCP 工具一起出现

364* 插件服务器通过插件安装进行管理(不是 `/mcp` 命令)

365 

366**示例插件 MCP 配置**:

367 

368在插件根目录的 `.mcp.json` 中:

369 

370```json theme={null}

371{

372 "mcpServers": {

373 "database-tools": {

374 "command": "${CLAUDE_PLUGIN_ROOT}/servers/db-server",

375 "args": ["--config", "${CLAUDE_PLUGIN_ROOT}/config.json"],

376 "env": {

377 "DB_URL": "${DB_URL}"

378 }

379 }

380 }

381}

382```

383 

384或在 `plugin.json` 中内联:

385 

386```json theme={null}

387{

388 "name": "my-plugin",

389 "mcpServers": {

390 "plugin-api": {

391 "command": "${CLAUDE_PLUGIN_ROOT}/servers/api-server",

392 "args": ["--port", "8080"]

393 }

394 }

395}

396```

397 

398**插件 MCP 功能**:

399 

400* **自动生命周期**:在会话启动时,启用的插件的服务器会自动连接。如果您在会话期间启用或禁用插件,请运行 `/reload-plugins` 以连接或断开其 MCP 服务器

401* **环境变量**:对插件相对路径使用 `${CLAUDE_PLUGIN_ROOT}`,对[持久状态](/zh-CN/plugins-reference#persistent-data-directory)使用 `${CLAUDE_PLUGIN_DATA}`,该状态在插件更新后仍然存在

402* **用户环境访问**:访问与手动配置的服务器相同的环境变量

403* **多种传输类型**:支持 stdio、SSE 和 HTTP 传输(传输支持可能因服务器而异)

404 

405**查看插件 MCP 服务器**:

406 

407```bash theme={null}

408# 在 Claude Code 中,查看所有 MCP 服务器,包括插件服务器

409/mcp

410```

411 

412插件服务器在列表中出现,并带有指示它们来自插件的指示符。

413 

414**插件 MCP 服务器的优势**:

415 

416* **捆绑分发**:工具和服务器打包在一起

417* **自动设置**:无需手动 MCP 配置

418* **团队一致性**:安装插件时每个人都获得相同的工具

419 

420有关使用插件捆绑 MCP 服务器的详细信息,请参阅[插件组件参考](/zh-CN/plugins-reference#mcp-servers)。

421 

422## MCP 安装范围

423 

424MCP 服务器可以在三个不同的范围级别进行配置。您选择的范围控制服务器在哪些项目中加载以及配置是否与您的团队共享。

425 

426| 范围 | 加载位置 | 与团队共享 | 存储位置 |

427| -------------------- | ------ | -------- | ------------------- |

428| [本地](#local-scope) | 仅当前项目 | 否 | `~/.claude.json` |

429| [项目](#project-scope) | 仅当前项目 | 是,通过版本控制 | 项目根目录中的 `.mcp.json` |

430| [用户](#user-scope) | 您的所有项目 | 否 | `~/.claude.json` |

431 

432### 本地范围

433 

434本地范围是默认范围。本地范围的服务器仅在您添加它的项目中加载,并对您保持私密。Claude Code 将其存储在 `~/.claude.json` 中该项目的路径下,因此相同的服务器不会出现在您的其他项目中。对个人开发服务器、实验配置或包含您不想在版本控制中的凭据的服务器使用本地范围。

435 

436<Note>

437 MCP 服务器的"本地范围"术语与一般本地设置不同。MCP 本地范围的服务器存储在 `~/.claude.json`(您的主目录)中,而一般本地设置使用 `.claude/settings.local.json`(在项目目录中)。有关设置文件位置的详细信息,请参阅[设置](/zh-CN/settings#settings-files)。

438</Note>

439 

440```bash theme={null}

441# 添加本地范围的服务器(默认)

442claude mcp add --transport http stripe https://mcp.stripe.com

443 

444# 显式指定本地范围

445claude mcp add --transport http stripe --scope local https://mcp.stripe.com

446```

447 

448从 `/path/to/your/project` 运行时,该命令将服务器写入 `~/.claude.json` 中您当前项目的条目。下面的示例显示结果:

449 

450```json theme={null}

451{

452 "projects": {

453 "/path/to/your/project": {

454 "mcpServers": {

455 "stripe": {

456 "type": "http",

457 "url": "https://mcp.stripe.com"

458 }

459 }

460 }

461 }

462}

463```

464 

465### 项目范围

466 

467项目范围的服务器通过在项目根目录中存储配置在 `.mcp.json` 文件中来启用团队协作。此文件设计为检入版本控制,确保所有团队成员都可以访问相同的 MCP 工具和服务。添加项目范围的服务器时,Claude Code 会自动创建或更新此文件,使用适当的配置结构。

468 

469```bash theme={null}

470# 添加项目范围的服务器

471claude mcp add --transport http paypal --scope project https://mcp.paypal.com/mcp

472```

473 

474生成的 `.mcp.json` 文件遵循标准化格式:

475 

476```json theme={null}

477{

478 "mcpServers": {

479 "shared-server": {

480 "command": "/path/to/server",

481 "args": [],

482 "env": {}

483 }

484 }

485}

486```

487 

488出于安全原因,Claude Code 在使用来自 `.mcp.json` 文件的项目范围的服务器之前会提示批准。如果您需要重置这些批准选择,请使用 `claude mcp reset-project-choices` 命令。

489 

490### 用户范围

491 

492用户范围的服务器存储在 `~/.claude.json` 中,并提供跨项目可访问性,使其在您机器上的所有项目中可用,同时对您的用户帐户保持私密。此范围适用于个人实用程序服务器、开发工具或您在不同项目中经常使用的服务。

493 

494```bash theme={null}

495# 添加用户服务器

496claude mcp add --transport http hubspot --scope user https://mcp.hubspot.com/anthropic

497```

498 

499### 范围层次结构和优先级

500 

501当具有相同名称的服务器在多个位置定义时,Claude Code 连接到它一次,使用来自最高优先级源的定义:

502 

5031. 本地范围

5042. 项目范围

5053. 用户范围

5064. [插件提供的服务器](/zh-CN/plugins)

5075. [claude.ai 连接器](#use-mcp-servers-from-claude-ai)

508 

509三个范围按名称匹配重复项。插件和连接器按端点匹配,因此指向与上述服务器相同的 URL 或命令的连接器被视为重复项。

510 

511### `.mcp.json` 中的环境变量扩展

512 

513Claude Code 支持 `.mcp.json` 文件中的环境变量扩展,允许团队共享配置,同时为特定于机器的路径和 API 密钥等敏感值保持灵活性。

514 

515**支持的语法:**

516 

517* `${VAR}` - 扩展为环境变量 `VAR` 的值

518* `${VAR:-default}` - 如果设置了 `VAR`,则扩展为 `VAR`,否则使用 `default`

519 

520**扩展位置:**

521环境变量可以在以下位置扩展:

522 

523* `command` - 服务器可执行文件路径

524* `args` - 命令行参数

525* `env` - 传递给服务器的环境变量

526* `url` - 对于 HTTP 服务器类型

527* `headers` - 对于 HTTP 服务器身份验证

528 

529**带有变量扩展的示例:**

530 

531```json theme={null}

532{

533 "mcpServers": {

534 "api-server": {

535 "type": "http",

536 "url": "${API_BASE_URL:-https://api.example.com}/mcp",

537 "headers": {

538 "Authorization": "Bearer ${API_KEY}"

539 }

540 }

541 }

542}

543```

544 

545如果未设置所需的环境变量且没有默认值,Claude Code 将无法解析配置。

546 

547## 实际示例

548 

549{/* ### 示例:使用 Playwright 自动化浏览器测试

550 

551```bash

552claude mcp add --transport stdio playwright -- npx -y @playwright/mcp@latest

553```

554 

555然后编写并运行浏览器测试:

556 

557```text

558Test if the login flow works with test@example.com

559```

560```text

561Take a screenshot of the checkout page on mobile

562```

563```text

564Verify that the search feature returns results

565``` */}

566 

567### 示例:使用 Sentry 监控错误

568 

569```bash theme={null}

570claude mcp add --transport http sentry https://mcp.sentry.dev/mcp

571```

572 

573使用您的 Sentry 帐户进行身份验证:

574 

575```text theme={null}

576/mcp

577```

578 

579然后调试生产问题:

580 

581```text theme={null}

582过去 24 小时内最常见的错误是什么?

583```

584 

585```text theme={null}

586显示我错误 ID abc123 的堆栈跟踪

587```

588 

589```text theme={null}

590哪个部署引入了这些新错误?

591```

592 

593### 示例:连接到 GitHub 进行代码审查

594 

595GitHub 的远程 MCP 服务器使用作为标头传递的 GitHub 个人访问令牌进行身份验证。要获取一个,请打开您的 [GitHub 令牌设置](https://github.com/settings/personal-access-tokens),生成一个新的细粒度令牌,具有对您希望 Claude 使用的存储库的访问权限,然后添加服务器:

596 

597```bash theme={null}

598claude mcp add --transport http github https://api.githubcopilot.com/mcp/ \

599 --header "Authorization: Bearer YOUR_GITHUB_PAT"

600```

601 

602然后使用 GitHub:

603 

604```text theme={null}

605审查 PR #456 并建议改进

606```

607 

608```text theme={null}

609为我们刚发现的错误创建新问题

610```

611 

612```text theme={null}

613显示分配给我的所有开放 PR

614```

615 

616### 示例:查询您的 PostgreSQL 数据库

617 

618```bash theme={null}

619claude mcp add --transport stdio db -- npx -y @bytebase/dbhub \

620 --dsn "postgresql://readonly:pass@prod.db.com:5432/analytics"

621```

622 

623然后自然地查询您的数据库:

624 

625```text theme={null}

626本月我们的总收入是多少?

627```

628 

629```text theme={null}

630显示订单表的架构

631```

632 

633```text theme={null}

634查找 90 天内未进行购买的客户

635```

636 

637## 使用远程 MCP 服务器进行身份验证

638 

639许多基于云的 MCP 服务器需要身份验证。Claude Code 支持 OAuth 2.0 以实现安全连接。

640 

641<Steps>

642 <Step title="添加需要身份验证的服务器">

643 例如:

644 

645 ```bash theme={null}

646 claude mcp add --transport http sentry https://mcp.sentry.dev/mcp

647 ```

648 </Step>

649 

650 <Step title="在 Claude Code 中使用 /mcp 命令">

651 在 Claude Code 中,使用命令:

652 

653 ```text theme={null}

654 /mcp

655 ```

656 

657 然后按照浏览器中的步骤登录。

658 </Step>

659</Steps>

660 

661<Tip>

662 提示:

663 

664 * 身份验证令牌安全存储并自动刷新

665 * 使用 `/mcp` 菜单中的"清除身份验证"撤销访问权限

666 * 如果您的浏览器没有自动打开,请复制提供的 URL 并手动打开

667 * 如果浏览器重定向在身份验证后失败并出现连接错误,请将浏览器地址栏中的完整回调 URL 粘贴到 Claude Code 中出现的 URL 提示中

668 * OAuth 身份验证适用于 HTTP 服务器

669</Tip>

670 

671### 使用固定的 OAuth 回调端口

672 

673某些 MCP 服务器需要预先注册的特定重定向 URI。默认情况下,Claude Code 为 OAuth 回调选择随机可用端口。使用 `--callback-port` 固定端口,使其与 `http://localhost:PORT/callback` 形式的预注册重定向 URI 匹配。

674 

675您可以单独使用 `--callback-port`(使用动态客户端注册)或与 `--client-id` 一起使用(使用预配置的凭据)。

676 

677```bash theme={null}

678# 使用动态客户端注册的固定回调端口

679claude mcp add --transport http \

680 --callback-port 8080 \

681 my-server https://mcp.example.com/mcp

682```

683 

684### 使用预配置的 OAuth 凭据

685 

686某些 MCP 服务器不支持通过动态客户端注册进行自动 OAuth 设置。如果您看到类似"不兼容的身份验证服务器:不支持动态客户端注册"的错误,服务器需要预配置的凭据。Claude Code 也支持使用客户端 ID 元数据文档 (CIMD) 而不是动态客户端注册的服务器,并自动发现这些服务器。如果自动发现失败,请首先通过服务器的开发者门户注册 OAuth 应用,然后在添加服务器时提供凭据。

687 

688<Steps>

689 <Step title="使用服务器注册 OAuth 应用">

690 通过服务器的开发者门户创建应用,并记下您的客户端 ID 和客户端密钥。

691 

692 许多服务器还需要重定向 URI。如果是这样,请选择一个端口并以 `http://localhost:PORT/callback` 的格式注册重定向 URI。在下一步中使用该相同的端口与 `--callback-port`。

693 </Step>

694 

695 <Step title="使用您的凭据添加服务器">

696 选择以下方法之一。用于 `--callback-port` 的端口可以是任何可用的端口。它只需要与您在上一步中注册的重定向 URI 匹配。

697 

698 <Tabs>

699 <Tab title="claude mcp add">

700 使用 `--client-id` 传递您的应用的客户端 ID。`--client-secret` 标志使用掩盖的输入提示输入密钥:

701 

702 ```bash theme={null}

703 claude mcp add --transport http \

704 --client-id your-client-id --client-secret --callback-port 8080 \

705 my-server https://mcp.example.com/mcp

706 ```

707 </Tab>

708 

709 <Tab title="claude mcp add-json">

710 在 JSON 配置中包含 `oauth` 对象,并将 `--client-secret` 作为单独的标志传递:

711 

712 ```bash theme={null}

713 claude mcp add-json my-server \

714 '{"type":"http","url":"https://mcp.example.com/mcp","oauth":{"clientId":"your-client-id","callbackPort":8080}}' \

715 --client-secret

716 ```

717 </Tab>

718 

719 <Tab title="claude mcp add-json(仅回调端口)">

720 使用 `--callback-port` 而不使用客户端 ID 来固定端口,同时使用动态客户端注册:

721 

722 ```bash theme={null}

723 claude mcp add-json my-server \

724 '{"type":"http","url":"https://mcp.example.com/mcp","oauth":{"callbackPort":8080}}'

725 ```

726 </Tab>

727 

728 <Tab title="CI / 环境变量">

729 通过环境变量设置密钥以跳过交互式提示:

730 

731 ```bash theme={null}

732 MCP_CLIENT_SECRET=your-secret claude mcp add --transport http \

733 --client-id your-client-id --client-secret --callback-port 8080 \

734 my-server https://mcp.example.com/mcp

735 ```

736 </Tab>

737 </Tabs>

738 </Step>

739 

740 <Step title="在 Claude Code 中进行身份验证">

741 在 Claude Code 中运行 `/mcp` 并按照浏览器登录流程。

742 </Step>

743</Steps>

744 

745<Tip>

746 提示:

747 

748 * 客户端密钥安全地存储在您的系统钥匙链(macOS)或凭据文件中,而不是在您的配置中

749 * 如果服务器使用没有密钥的公共 OAuth 客户端,仅使用 `--client-id` 而不使用 `--client-secret`

750 * `--callback-port` 可以与或不与 `--client-id` 一起使用

751 * 这些标志仅适用于 HTTP 和 SSE 传输。它们对 stdio 服务器没有影响

752 * 使用 `claude mcp get <name>` 验证为服务器配置了 OAuth 凭据

753</Tip>

754 

755### 覆盖 OAuth 元数据发现

756 

757指向 Claude Code 一个特定的 OAuth 授权服务器元数据 URL 以绕过默认发现链。当 MCP 服务器的标准端点出错时,或当您想通过内部代理路由发现时,设置 `authServerMetadataUrl`。默认情况下,Claude Code 首先检查 RFC 9728 受保护资源元数据(位于 `/.well-known/oauth-protected-resource`),然后回退到 RFC 8414 授权服务器元数据(位于 `/.well-known/oauth-authorization-server`)。

758 

759在您的服务器配置中的 `.mcp.json` 的 `oauth` 对象中设置 `authServerMetadataUrl`:

760 

761```json theme={null}

762{

763 "mcpServers": {

764 "my-server": {

765 "type": "http",

766 "url": "https://mcp.example.com/mcp",

767 "oauth": {

768 "authServerMetadataUrl": "https://auth.example.com/.well-known/openid-configuration"

769 }

770 }

771 }

772}

773```

774 

775URL 必须使用 `https://`。`authServerMetadataUrl` 需要 Claude Code v2.1.64 或更高版本。元数据 URL 的 `scopes_supported` 覆盖上游服务器公开的范围。

776 

777### 限制 OAuth 范围

778 

779设置 `oauth.scopes` 以固定 Claude Code 在授权流程中请求的范围。这是限制 MCP 服务器到安全团队批准的子集的支持方式,当上游授权服务器公开的范围超过您想要授予的范围时。该值是单个空格分隔的字符串,与 RFC 6749 §3.3 中的 `scope` 参数格式匹配。

780 

781```json theme={null}

782{

783 "mcpServers": {

784 "slack": {

785 "type": "http",

786 "url": "https://mcp.slack.com/mcp",

787 "oauth": {

788 "scopes": "channels:read chat:write search:read"

789 }

790 }

791 }

792}

793```

794 

795`oauth.scopes` 优先于 `authServerMetadataUrl` 和服务器在 `/.well-known` 发现的范围。将其保留未设置以让 MCP 服务器确定请求的范围集。

796 

797如果授权服务器在 `scopes_supported` 中公开 `offline_access`,Claude Code 会将其附加到固定范围,以便可以在没有新浏览器登录的情况下刷新访问令牌。

798 

799如果服务器稍后为工具调用返回 403 `insufficient_scope`,Claude Code 会使用相同的固定范围重新进行身份验证。当您需要的工具需要固定范围之外的范围时,扩展 `oauth.scopes`。

800 

801### 使用动态标头进行自定义身份验证

802 

803如果您的 MCP 服务器使用 OAuth 以外的身份验证方案(例如 Kerberos、短期令牌或内部 SSO),请使用 `headersHelper` 在连接时生成请求标头。Claude Code 运行命令并将其输出合并到连接标头中。

804 

805```json theme={null}

806{

807 "mcpServers": {

808 "internal-api": {

809 "type": "http",

810 "url": "https://mcp.internal.example.com",

811 "headersHelper": "/opt/bin/get-mcp-auth-headers.sh"

812 }

813 }

814}

815```

816 

817命令也可以是内联的:

818 

819```json theme={null}

820{

821 "mcpServers": {

822 "internal-api": {

823 "type": "http",

824 "url": "https://mcp.internal.example.com",

825 "headersHelper": "echo '{\"Authorization\": \"Bearer '\"$(get-token)\"'\"}'"

826 }

827 }

828}

829```

830 

831**要求:**

832 

833* 命令必须将字符串键值对的 JSON 对象写入标准输出

834* 命令在 shell 中运行,超时时间为 10 秒

835* 动态标头覆盖任何具有相同名称的静态 `headers`

836 

837助手在每次连接时运行(在会话启动和重新连接时)。没有缓存,因此您的脚本负责任何令牌重用。

838 

839Claude Code 在执行助手时设置这些环境变量:

840 

841| 变量 | 值 |

842| :---------------------------- | :----------- |

843| `CLAUDE_CODE_MCP_SERVER_NAME` | MCP 服务器的名称 |

844| `CLAUDE_CODE_MCP_SERVER_URL` | MCP 服务器的 URL |

845 

846使用这些来编写一个为多个 MCP 服务器服务的单个助手脚本。

847 

848<Note>

849 `headersHelper` 执行任意 shell 命令。在项目或本地范围定义时,它仅在您接受工作区信任对话框后运行。

850</Note>

851 

852## 从 JSON 配置添加 MCP 服务器

853 

854如果您有 MCP 服务器的 JSON 配置,您可以直接添加它:

855 

856<Steps>

857 <Step title="从 JSON 添加 MCP 服务器">

858 ```bash theme={null}

859 # 基本语法

860 claude mcp add-json <name> '<json>'

861 

862 # 示例:添加带有 JSON 配置的 HTTP 服务器

863 claude mcp add-json weather-api '{"type":"http","url":"https://api.weather.com/mcp","headers":{"Authorization":"Bearer token"}}'

864 

865 # 示例:添加带有 JSON 配置的 stdio 服务器

866 claude mcp add-json local-weather '{"type":"stdio","command":"/path/to/weather-cli","args":["--api-key","abc123"],"env":{"CACHE_DIR":"/tmp"}}'

867 

868 # 示例:添加带有预配置 OAuth 凭据的 HTTP 服务器

869 claude mcp add-json my-server '{"type":"http","url":"https://mcp.example.com/mcp","oauth":{"clientId":"your-client-id","callbackPort":8080}}' --client-secret

870 ```

871 </Step>

872 

873 <Step title="验证服务器已添加">

874 ```bash theme={null}

875 claude mcp get weather-api

876 ```

877 </Step>

878</Steps>

879 

880<Tip>

881 提示:

882 

883 * 确保 JSON 在您的 shell 中正确转义

884 * JSON 必须符合 MCP 服务器配置架构

885 * 您可以使用 `--scope user` 将服务器添加到您的用户配置而不是项目特定的配置

886</Tip>

887 

888## 从 Claude Desktop 导入 MCP 服务器

889 

890如果您已在 Claude Desktop 中配置了 MCP 服务器,您可以导入它们:

891 

892<Steps>

893 <Step title="从 Claude Desktop 导入服务器">

894 ```bash theme={null}

895 # 基本语法

896 claude mcp add-from-claude-desktop

897 ```

898 </Step>

899 

900 <Step title="选择要导入的服务器">

901 运行命令后,您将看到一个交互式对话框,允许您选择要导入的服务器。

902 </Step>

903 

904 <Step title="验证服务器已导入">

905 ```bash theme={null}

906 claude mcp list

907 ```

908 </Step>

909</Steps>

910 

911<Tip>

912 提示:

913 

914 * 此功能仅在 macOS 和 Windows Subsystem for Linux (WSL) 上有效

915 * 它从这些平台上的标准位置读取 Claude Desktop 配置文件

916 * 使用 `--scope user` 标志将服务器添加到您的用户配置

917 * 导入的服务器将具有与 Claude Desktop 中相同的名称

918 * 如果具有相同名称的服务器已存在,它们将获得数字后缀(例如,`server_1`)

919</Tip>

920 

921## 使用来自 Claude.ai 的 MCP 服务器

922 

923如果您已使用 [Claude.ai](https://claude.ai) 帐户登录 Claude Code,您在 Claude.ai 中添加的 MCP 服务器会自动在 Claude Code 中可用:

924 

925<Steps>

926 <Step title="在 Claude.ai 中配置 MCP 服务器">

927 在 [claude.ai/customize/connectors](https://claude.ai/customize/connectors) 添加服务器。在 Team 和 Enterprise 计划上,仅管理员可以添加服务器。

928 </Step>

929 

930 <Step title="对 MCP 服务器进行身份验证">

931 在 Claude.ai 中完成任何必需的身份验证步骤。

932 </Step>

933 

934 <Step title="在 Claude Code 中查看和管理服务器">

935 在 Claude Code 中,使用命令:

936 

937 ```text theme={null}

938 /mcp

939 ```

940 

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

942 </Step>

943</Steps>

944 

945要在 Claude Code 中禁用 claude.ai MCP 服务器,请将 `ENABLE_CLAUDEAI_MCP_SERVERS` 环境变量设置为 `false`:

946 

947```bash theme={null}

948ENABLE_CLAUDEAI_MCP_SERVERS=false claude

949```

950 

951## 将 Claude Code 用作 MCP 服务器

952 

953您可以将 Claude Code 本身用作 MCP 服务器,其他应用程序可以连接到它:

954 

955```bash theme={null}

956# 启动 Claude 作为 stdio MCP 服务器

957claude mcp serve

958```

959 

960您可以通过将此配置添加到 claude\_desktop\_config.json 在 Claude Desktop 中使用它:

961 

962```json theme={null}

963{

964 "mcpServers": {

965 "claude-code": {

966 "type": "stdio",

967 "command": "claude",

968 "args": ["mcp", "serve"],

969 "env": {}

970 }

971 }

972}

973```

974 

975<Warning>

976 **配置可执行文件路径**:`command` 字段必须引用 Claude Code 可执行文件。如果 `claude` 命令不在您的系统 PATH 中,您需要指定可执行文件的完整路径。

977 

978 要查找完整路径:

979 

980 ```bash theme={null}

981 which claude

982 ```

983 

984 然后在您的配置中使用完整路径:

985 

986 ```json theme={null}

987 {

988 "mcpServers": {

989 "claude-code": {

990 "type": "stdio",

991 "command": "/full/path/to/claude",

992 "args": ["mcp", "serve"],

993 "env": {}

994 }

995 }

996 }

997 ```

998 

999 没有正确的可执行文件路径,您会遇到类似 `spawn claude ENOENT` 的错误。

1000</Warning>

1001 

1002<Tip>

1003 提示:

1004 

1005 * 服务器提供对 Claude 的工具(如 View、Edit、LS 等)的访问权限。

1006 * 在 Claude Desktop 中,尝试要求 Claude 读取目录中的文件、进行编辑等。

1007 * 请注意,此 MCP 服务器仅向您的 MCP 客户端公开 Claude Code 的工具,因此您自己的客户端负责为单个工具调用实现用户确认。

1008</Tip>

1009 

1010## MCP 输出限制和警告

1011 

1012当 MCP 工具产生大量输出时,Claude Code 可帮助管理令牌使用情况,以防止压倒您的对话上下文:

1013 

1014* **输出警告阈值**:当任何 MCP 工具输出超过 10,000 个令牌时,Claude Code 显示警告

1015* **可配置限制**:您可以使用 `MAX_MCP_OUTPUT_TOKENS` 环境变量调整最大允许的 MCP 输出令牌

1016* **默认限制**:默认最大值为 25,000 个令牌

1017* **范围**:环境变量适用于不声明自己限制的工具。声明 [`anthropic/maxResultSizeChars`](#raise-the-limit-for-a-specific-tool) 的工具对文本内容使用该值,无论 `MAX_MCP_OUTPUT_TOKENS` 设置为什么。返回图像数据的工具仍受 `MAX_MCP_OUTPUT_TOKENS` 限制

1018 

1019要为产生大量输出的工具增加限制:

1020 

1021```bash theme={null}

1022export MAX_MCP_OUTPUT_TOKENS=50000

1023claude

1024```

1025 

1026这在使用以下 MCP 服务器时特别有用:

1027 

1028* 查询大型数据集或数据库

1029* 生成详细的报告或文档

1030* 处理广泛的日志文件或调试信息

1031 

1032### 为特定工具提高限制

1033 

1034如果您正在构建 MCP 服务器,您可以通过在工具的 `tools/list` 响应条目中设置 `_meta["anthropic/maxResultSizeChars"]` 来允许单个工具返回大于默认持久化到磁盘阈值的结果。Claude Code 将该工具的阈值提高到注释值,最高为 500,000 个字符的硬上限。

1035 

1036这对于返回本质上很大但必要的输出的工具很有用,例如数据库架构或完整文件树。没有注释,超过默认阈值的结果会被持久化到磁盘,并在对话中被文件引用替换。

1037 

1038```json theme={null}

1039{

1040 "name": "get_schema",

1041 "description": "Returns the full database schema",

1042 "_meta": {

1043 "anthropic/maxResultSizeChars": 200000

1044 }

1045}

1046```

1047 

1048对于文本内容,注释独立于 `MAX_MCP_OUTPUT_TOKENS` 应用,因此用户不需要为声明它的工具提高环境变量。返回图像数据的工具仍受令牌限制。

1049 

1050<Warning>

1051 如果您经常遇到特定 MCP 服务器的输出警告,而您不控制这些服务器,请考虑增加 `MAX_MCP_OUTPUT_TOKENS` 限制。您也可以要求服务器作者添加 `anthropic/maxResultSizeChars` 注释或对其响应进行分页。注释对返回图像内容的工具没有影响;对于这些,提高 `MAX_MCP_OUTPUT_TOKENS` 是唯一的选择。

1052</Warning>

1053 

1054## 响应 MCP 引发请求

1055 

1056MCP 服务器可以在任务中途使用引发来请求您的结构化输入。当服务器需要无法自行获取的信息时,Claude Code 会显示交互式对话框并将您的响应传递回服务器。您无需进行任何配置:当服务器请求时,引发对话框会自动出现。

1057 

1058服务器可以通过两种方式请求输入:

1059 

1060* **表单模式**:Claude Code 显示一个对话框,其中包含服务器定义的表单字段(例如,用户名和密码提示)。填写字段并提交。

1061* **URL 模式**:Claude Code 打开浏览器 URL 以进行身份验证或批准。在浏览器中完成流程,然后在 CLI 中确认。

1062 

1063要自动响应引发请求而不显示对话框,请使用 [`Elicitation` hook](/zh-CN/hooks#Elicitation)。

1064 

1065如果您正在构建使用引发的 MCP 服务器,请参阅 [MCP 引发规范](https://modelcontextprotocol.io/docs/learn/client-concepts#elicitation)以了解协议详细信息和架构示例。

1066 

1067## 使用 MCP 资源

1068 

1069MCP 服务器可以公开资源,您可以使用 @ 提及来引用,类似于您引用文件的方式。

1070 

1071### 引用 MCP 资源

1072 

1073<Steps>

1074 <Step title="列出可用资源">

1075 在您的提示中键入 `@` 以查看来自所有连接的 MCP 服务器的可用资源。资源与文件一起出现在自动完成菜单中。

1076 </Step>

1077 

1078 <Step title="引用特定资源">

1079 使用格式 `@server:protocol://resource/path` 来引用资源:

1080 

1081 ```text theme={null}

1082 Can you analyze @github:issue://123 and suggest a fix?

1083 ```

1084 

1085 ```text theme={null}

1086 Please review the API documentation at @docs:file://api/authentication

1087 ```

1088 </Step>

1089 

1090 <Step title="多个资源引用">

1091 您可以在单个提示中引用多个资源:

1092 

1093 ```text theme={null}

1094 Compare @postgres:schema://users with @docs:file://database/user-model

1095 ```

1096 </Step>

1097</Steps>

1098 

1099<Tip>

1100 提示:

1101 

1102 * 资源在引用时会自动获取并作为附件包含

1103 * 资源路径在 @ 提及自动完成中可进行模糊搜索

1104 * Claude Code 在服务器支持时自动提供列出和读取 MCP 资源的工具

1105 * 资源可以包含 MCP 服务器提供的任何类型的内容(文本、JSON、结构化数据等)

1106</Tip>

1107 

1108## 使用 MCP 工具搜索进行扩展

1109 

1110工具搜索通过延迟工具定义直到 Claude 需要它们来保持 MCP 上下文使用低。仅工具名称在会话启动时加载,因此添加更多 MCP 服务器对您的上下文窗口的影响最小。

1111 

1112### 工作原理

1113 

1114工具搜索默认启用。MCP 工具被延迟而不是预先加载到上下文中,Claude 使用搜索工具在任务需要时发现相关的工具。仅 Claude 实际使用的工具进入上下文。从您的角度来看,MCP 工具的工作方式与之前完全相同。

1115 

1116如果您更喜欢基于阈值的加载,请设置 `ENABLE_TOOL_SEARCH=auto` 以在工具适合上下文窗口的 10% 内时预先加载架构,仅延迟溢出部分。有关所有选项,请参阅[配置工具搜索](#configure-tool-search)。

1117 

1118### 对于 MCP 服务器作者

1119 

1120如果您正在构建 MCP 服务器,启用工具搜索时服务器说明字段会变得更有用。服务器说明可帮助 Claude 了解何时搜索您的工具,类似于 [skills](/zh-CN/skills) 的工作方式。

1121 

1122添加清晰、描述性的服务器说明,说明:

1123 

1124* 您的工具处理的任务类别

1125* Claude 应何时搜索您的工具

1126* 您的服务器提供的关键功能

1127 

1128Claude Code 将工具描述和服务器说明截断为每个 2KB。保持它们简洁以避免截断,并将关键详细信息放在开头。

1129 

1130### 配置工具搜索

1131 

1132工具搜索默认启用:MCP 工具被延迟并按需发现。在 Vertex AI 上默认禁用,它不接受工具搜索 beta 标头,以及当 `ANTHROPIC_BASE_URL` 指向非第一方主机时,因为大多数代理不转发 `tool_reference` 块。显式设置 `ENABLE_TOOL_SEARCH` 以选择加入。此功能需要支持 `tool_reference` 块的模型:Sonnet 4 及更高版本,或 Opus 4 及更高版本。Haiku 模型不支持工具搜索。

1133 

1134使用 `ENABLE_TOOL_SEARCH` 环境变量控制工具搜索行为:

1135 

1136| 值 | 行为 |

1137| :--------- | :--------------------------------------------------------------------- |

1138| (未设置) | 所有 MCP 工具被延迟并按需加载。在 Vertex AI 上或当 `ANTHROPIC_BASE_URL` 是非第一方主机时回退到预先加载 |

1139| `true` | 所有 MCP 工具被延迟,包括在 Vertex AI 上和对于非第一方 `ANTHROPIC_BASE_URL` |

1140| `auto` | 阈值模式:如果工具适合上下文窗口的 10% 内,则预先加载,否则延迟 |

1141| `auto:<N>` | 阈值模式,带有自定义百分比,其中 `<N>` 是 0-100(例如,`auto:5` 表示 5%) |

1142| `false` | 所有 MCP 工具预先加载,无延迟 |

1143 

1144```bash theme={null}

1145# 使用自定义 5% 阈值

1146ENABLE_TOOL_SEARCH=auto:5 claude

1147 

1148# 完全禁用工具搜索

1149ENABLE_TOOL_SEARCH=false claude

1150```

1151 

1152或在您的[settings.json `env` 字段](/zh-CN/settings#available-settings)中设置值。

1153 

1154您也可以专门禁用 `ToolSearch` 工具:

1155 

1156```json theme={null}

1157{

1158 "permissions": {

1159 "deny": ["ToolSearch"]

1160 }

1161}

1162```

1163 

1164### 豁免服务器延迟

1165 

1166如果服务器的工具应始终对 Claude 可见而无需搜索步骤,请在该服务器的配置中将 `alwaysLoad` 设置为 `true`。来自该服务器的每个工具随后在会话启动时加载到上下文中,无论 `ENABLE_TOOL_SEARCH` 设置如何。对于 Claude 在每个回合都需要的少量工具,请使用此选项,因为每个预先加载的工具会消耗本来可用于您的对话的上下文。

1167 

1168以下 `.mcp.json` 条目豁免一个 HTTP 服务器,同时保持其他服务器延迟:

1169 

1170```json theme={null}

1171{

1172 "mcpServers": {

1173 "core-tools": {

1174 "type": "http",

1175 "url": "https://mcp.example.com/mcp",

1176 "alwaysLoad": true

1177 }

1178 }

1179}

1180```

1181 

1182`alwaysLoad` 字段在所有服务器类型上可用,需要 Claude Code v2.1.121 或更高版本。MCP 服务器也可以通过在工具的 `_meta` 对象中包含 `"anthropic/alwaysLoad": true` 来标记单个工具为始终加载,这对该工具仅具有相同的效果。

1183 

1184## 将 MCP 提示用作命令

1185 

1186MCP 服务器可以公开在 Claude Code 中作为命令可用的提示。

1187 

1188### 执行 MCP 提示

1189 

1190<Steps>

1191 <Step title="发现可用的提示">

1192 键入 `/` 以查看所有可用的命令,包括来自 MCP 服务器的命令。MCP 提示以 `/mcp__servername__promptname` 的格式出现。

1193 </Step>

1194 

1195 <Step title="执行不带参数的提示">

1196 ```text theme={null}

1197 /mcp__github__list_prs

1198 ```

1199 </Step>

1200 

1201 <Step title="执行带参数的提示">

1202 许多提示接受参数。在命令后面用空格分隔传递它们:

1203 

1204 ```text theme={null}

1205 /mcp__github__pr_review 456

1206 ```

1207 

1208 ```text theme={null}

1209 /mcp__jira__create_issue "Bug in login flow" high

1210 ```

1211 </Step>

1212</Steps>

1213 

1214<Tip>

1215 提示:

1216 

1217 * MCP 提示从连接的服务器动态发现

1218 * 参数根据提示的定义参数进行解析

1219 * 提示结果直接注入到对话中

1220 * 服务器和提示名称被规范化(空格变为下划线)

1221</Tip>

1222 

1223## 托管 MCP 配置

1224 

1225对于需要对 MCP 服务器进行集中控制的组织,Claude Code 支持两个配置选项:

1226 

12271. **使用 `managed-mcp.json` 的独占控制**:部署用户无法修改或扩展的固定 MCP 服务器集

12282. **使用允许列表/拒绝列表的基于策略的控制**:允许用户添加自己的服务器,但限制允许的服务器

1229 

1230这些选项允许 IT 管理员:

1231 

1232* **控制员工可以访问哪些 MCP 服务器**:在整个组织中部署一组标准化的已批准 MCP 服务器

1233* **防止未授权的 MCP 服务器**:限制用户添加未批准的 MCP 服务器

1234* **完全禁用 MCP**:如果需要,完全删除 MCP 功能

1235 

1236### 选项 1:使用 managed-mcp.json 的独占控制

1237 

1238部署 `managed-mcp.json` 文件时,它对所有 MCP 服务器进行**独占控制**。用户无法添加、修改或使用此文件中定义的任何 MCP 服务器以外的任何 MCP 服务器。这是希望完全控制的组织的最简单方法。

1239 

1240系统管理员将配置文件部署到系统范围的目录:

1241 

1242* macOS:`/Library/Application Support/ClaudeCode/managed-mcp.json`

1243* Linux 和 WSL:`/etc/claude-code/managed-mcp.json`

1244* Windows:`C:\Program Files\ClaudeCode\managed-mcp.json`

1245 

1246<Note>

1247 这些是系统范围的路径(不是像 `~/Library/...` 这样的用户主目录),需要管理员权限。它们设计为由 IT 管理员部署。

1248</Note>

1249 

1250`managed-mcp.json` 文件使用与标准 `.mcp.json` 文件相同的格式:

1251 

1252```json theme={null}

1253{

1254 "mcpServers": {

1255 "github": {

1256 "type": "http",

1257 "url": "https://api.githubcopilot.com/mcp/"

1258 },

1259 "sentry": {

1260 "type": "http",

1261 "url": "https://mcp.sentry.dev/mcp"

1262 },

1263 "company-internal": {

1264 "type": "stdio",

1265 "command": "/usr/local/bin/company-mcp-server",

1266 "args": ["--config", "/etc/company/mcp-config.json"],

1267 "env": {

1268 "COMPANY_API_URL": "https://internal.company.com"

1269 }

1270 }

1271 }

1272}

1273```

1274 

1275### 选项 2:使用允许列表和拒绝列表的基于策略的控制

1276 

1277管理员可以允许用户配置自己的 MCP 服务器,而不是进行独占控制,同时对允许的服务器进行限制。此方法在[托管设置文件](/zh-CN/settings#settings-files)中使用 `allowedMcpServers` 和 `deniedMcpServers`。

1278 

1279<Note>

1280 **在选项之间选择**:当您想要部署一组固定的服务器而不进行用户自定义时,使用选项 1(`managed-mcp.json`)。当您想要允许用户在策略约束内添加自己的服务器时,使用选项 2(允许列表/拒绝列表)。

1281</Note>

1282 

1283#### 限制选项

1284 

1285允许列表或拒绝列表中的每个条目可以通过三种方式限制服务器:

1286 

12871. **按服务器名称** (`serverName`):匹配服务器的配置名称

12882. **按命令** (`serverCommand`):匹配用于启动 stdio 服务器的确切命令和参数

12893. **按 URL 模式** (`serverUrl`):匹配带有通配符支持的远程服务器 URL

1290 

1291**重要**:每个条目必须恰好具有 `serverName`、`serverCommand` 或 `serverUrl` 之一。

1292 

1293#### 示例配置

1294 

1295```json theme={null}

1296{

1297 "allowedMcpServers": [

1298 // 按服务器名称允许

1299 { "serverName": "github" },

1300 { "serverName": "sentry" },

1301 

1302 // 按确切命令允许(对于 stdio 服务器)

1303 { "serverCommand": ["npx", "-y", "@modelcontextprotocol/server-filesystem"] },

1304 { "serverCommand": ["python", "/usr/local/bin/approved-server.py"] },

1305 

1306 // 按 URL 模式允许(对于远程服务器)

1307 { "serverUrl": "https://mcp.company.com/*" },

1308 { "serverUrl": "https://*.internal.corp/*" }

1309 ],

1310 "deniedMcpServers": [

1311 // 按服务器名称阻止

1312 { "serverName": "dangerous-server" },

1313 

1314 // 按确切命令阻止(对于 stdio 服务器)

1315 { "serverCommand": ["npx", "-y", "unapproved-package"] },

1316 

1317 // 按 URL 模式阻止(对于远程服务器)

1318 { "serverUrl": "https://*.untrusted.com/*" }

1319 ]

1320}

1321```

1322 

1323#### 基于命令的限制如何工作

1324 

1325**精确匹配**:

1326 

1327* 命令数组必须**精确**匹配 - 命令和所有参数的顺序正确

1328* 示例:`["npx", "-y", "server"]` 将**不**匹配 `["npx", "server"]` 或 `["npx", "-y", "server", "--flag"]`

1329 

1330**Stdio 服务器行为**:

1331 

1332* 当允许列表包含**任何** `serverCommand` 条目时,stdio 服务器**必须**匹配其中一个命令

1333* Stdio 服务器在存在命令限制时无法仅按名称通过

1334* 这确保管理员可以强制执行允许运行哪些命令

1335 

1336**非 stdio 服务器行为**:

1337 

1338* 远程服务器(HTTP、SSE、WebSocket)在允许列表中存在 `serverUrl` 条目时使用基于 URL 的匹配

1339* 如果不存在 URL 条目,远程服务器回退到基于名称的匹配

1340* 命令限制不适用于远程服务器

1341 

1342#### 基于 URL 的限制如何工作

1343 

1344URL 模式使用 `*` 支持通配符以匹配任何字符序列。这对于允许整个域或子域很有用。

1345 

1346**通配符示例**:

1347 

1348* `https://mcp.company.com/*` - 允许特定域上的所有路径

1349* `https://*.example.com/*` - 允许 example.com 的任何子域

1350* `http://localhost:*/*` - 允许 localhost 上的任何端口

1351 

1352**远程服务器行为**:

1353 

1354* 当允许列表包含**任何** `serverUrl` 条目时,远程服务器**必须**匹配其中一个 URL 模式

1355* 远程服务器在存在 URL 限制时无法仅按名称通过

1356* 这确保管理员可以强制执行允许哪些远程端点

1357 

1358<Accordion title="示例:仅 URL 允许列表">

1359 ```json theme={null}

1360 {

1361 "allowedMcpServers": [

1362 { "serverUrl": "https://mcp.company.com/*" },

1363 { "serverUrl": "https://*.internal.corp/*" }

1364 ]

1365 }

1366 ```

1367 

1368 **结果**:

1369 

1370 * `https://mcp.company.com/api` 处的 HTTP 服务器:✅ 允许(匹配 URL 模式)

1371 * `https://api.internal.corp/mcp` 处的 HTTP 服务器:✅ 允许(匹配通配符子域)

1372 * `https://external.com/mcp` 处的 HTTP 服务器:❌ 阻止(不匹配任何 URL 模式)

1373 * 任何命令的 Stdio 服务器:❌ 阻止(没有名称或命令条目可匹配)

1374</Accordion>

1375 

1376<Accordion title="示例:仅命令允许列表">

1377 ```json theme={null}

1378 {

1379 "allowedMcpServers": [

1380 { "serverCommand": ["npx", "-y", "approved-package"] }

1381 ]

1382 }

1383 ```

1384 

1385 **结果**:

1386 

1387 * 带有 `["npx", "-y", "approved-package"]` 的 Stdio 服务器:✅ 允许(匹配命令)

1388 * 带有 `["node", "server.js"]` 的 Stdio 服务器:❌ 阻止(不匹配命令)

1389 * 名为"my-api"的 HTTP 服务器:❌ 阻止(没有名称条目可匹配)

1390</Accordion>

1391 

1392<Accordion title="示例:混合名称和命令允许列表">

1393 ```json theme={null}

1394 {

1395 "allowedMcpServers": [

1396 { "serverName": "github" },

1397 { "serverCommand": ["npx", "-y", "approved-package"] }

1398 ]

1399 }

1400 ```

1401 

1402 **结果**:

1403 

1404 * 名为"local-tool"、带有 `["npx", "-y", "approved-package"]` 的 Stdio 服务器:✅ 允许(匹配命令)

1405 * 名为"local-tool"、带有 `["node", "server.js"]` 的 Stdio 服务器:❌ 阻止(命令条目存在但不匹配)

1406 * 名为"github"、带有 `["node", "server.js"]` 的 Stdio 服务器:❌ 阻止(当命令条目存在时,stdio 服务器必须匹配命令)

1407 * 名为"github"的 HTTP 服务器:✅ 允许(匹配名称)

1408 * 名为"other-api"的 HTTP 服务器:❌ 阻止(名称不匹配)

1409</Accordion>

1410 

1411<Accordion title="示例:仅名称允许列表">

1412 ```json theme={null}

1413 {

1414 "allowedMcpServers": [

1415 { "serverName": "github" },

1416 { "serverName": "internal-tool" }

1417 ]

1418 }

1419 ```

1420 

1421 **结果**:

1422 

1423 * 名为"github"、任何命令的 Stdio 服务器:✅ 允许(没有命令限制)

1424 * 名为"internal-tool"、任何命令的 Stdio 服务器:✅ 允许(没有命令限制)

1425 * 名为"github"的 HTTP 服务器:✅ 允许(匹配名称)

1426 * 任何名为"other"的服务器:❌ 阻止(名称不匹配)

1427</Accordion>

1428 

1429#### 允许列表行为 (`allowedMcpServers`)

1430 

1431* `undefined`(默认):无限制 - 用户可以配置任何 MCP 服务器

1432* 空数组 `[]`:完全锁定 - 用户无法配置任何 MCP 服务器

1433* 条目列表:用户只能配置按名称、命令或 URL 模式匹配的服务器

1434 

1435#### 拒绝列表行为 (`deniedMcpServers`)

1436 

1437* `undefined`(默认):没有服务器被阻止

1438* 空数组 `[]`:没有服务器被阻止

1439* 条目列表:指定的服务器在所有范围内被显式阻止

1440 

1441#### 重要说明

1442 

1443* **选项 1 和选项 2 可以组合**:如果 `managed-mcp.json` 存在,它具有独占控制,用户无法添加服务器。允许列表/拒绝列表仍然适用于托管服务器本身。

1444* **拒绝列表具有绝对优先级**:如果服务器匹配拒绝列表条目(按名称、命令或 URL),即使它在允许列表上,它也会被阻止

1445* 基于名称、基于命令和基于 URL 的限制一起工作:如果服务器匹配**任何**名称条目、命令条目或 URL 模式,它就会通过(除非被拒绝列表阻止)

1446 

1447<Note>

1448 **使用 `managed-mcp.json` 时**:用户无法通过 `claude mcp add` 或配置文件添加 MCP 服务器。`allowedMcpServers` 和 `deniedMcpServers` 设置仍然适用于过滤实际加载的托管服务器。

1449</Note>

memory.md +408 −0 created

Details

1> ## Documentation Index

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

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

4 

5# Claude 如何记住你的项目

6 

7> 使用 CLAUDE.md 文件为 Claude 提供持久指令,并让 Claude 通过自动记忆功能自动积累学习内容。

8 

9每个 Claude Code 会话都从一个全新的上下文窗口开始。两种机制可以跨会话传递知识:

10 

11* **CLAUDE.md 文件**:你编写的指令,为 Claude 提供持久上下文

12* **自动记忆**:Claude 根据你的更正和偏好自己编写的笔记

13 

14本页面涵盖以下内容:

15 

16* [编写和组织 CLAUDE.md 文件](#claude-md-files)

17* [使用 `.claude/rules/` 将规则范围限定到特定文件类型](#organize-rules-with-clauderules)

18* [配置自动记忆](#auto-memory),使 Claude 自动记笔记

19* [故障排除](#troubleshoot-memory-issues),当指令未被遵循时

20 

21## CLAUDE.md 与自动记忆

22 

23Claude Code 有两个互补的记忆系统。两者都在每次对话开始时加载。Claude 将它们视为上下文,而不是强制配置。你的指令越具体和简洁,Claude 遵循它们的一致性就越高。

24 

25| | CLAUDE.md 文件 | 自动记忆 |

26| :------- | :------------ | :--------------------- |

27| **谁编写** | 你 | Claude |

28| **包含内容** | 指令和规则 | 学习和模式 |

29| **范围** | 项目、用户或组织 | 每个工作树 |

30| **加载到** | 每个会话 | 每个会话(前 200 行或 25KB) |

31| **用于** | 编码标准、工作流、项目架构 | 构建命令、调试见解、Claude 发现的偏好 |

32 

33当你想指导 Claude 的行为时,使用 CLAUDE.md 文件。自动记忆让 Claude 从你的更正中学习,无需手动操作。

34 

35subagents 也可以维护自己的自动记忆。有关详细信息,请参阅 [subagent 配置](/zh-CN/sub-agents#enable-persistent-memory)。

36 

37## CLAUDE.md 文件

38 

39CLAUDE.md 文件是 markdown 文件,为项目、你的个人工作流或整个组织为 Claude 提供持久指令。你用纯文本编写这些文件;Claude 在每个会话开始时读取它们。

40 

41### 何时添加到 CLAUDE.md

42 

43将 CLAUDE.md 视为你写下你本来会重新解释的内容的地方。在以下情况下添加到它:

44 

45* Claude 第二次犯同样的错误

46* 代码审查发现 Claude 应该了解这个代码库的内容

47* 你在聊天中输入的相同更正或澄清是你上个会话输入的

48* 新队友需要相同的上下文才能提高生产力

49 

50将其保持为 Claude 应该在每个会话中保持的事实:构建命令、约定、项目布局、"总是做 X"规则。如果一个条目是多步骤过程或仅对代码库的一部分重要,将其移到 [skill](/zh-CN/skills) 或 [路径范围规则](#organize-rules-with-claude/rules/) 中。[扩展概述](/zh-CN/features-overview#build-your-setup-over-time)涵盖何时使用每种机制。

51 

52### 选择 CLAUDE.md 文件的位置

53 

54CLAUDE.md 文件可以位于多个位置,每个位置有不同的范围。更具体的位置优先于更广泛的位置。

55 

56| 范围 | 位置 | 目的 | 用例示例 | 共享对象 |

57| -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------- | ---------------- | ------------ |

58| **托管策略** | • macOS: `/Library/Application Support/ClaudeCode/CLAUDE.md`<br />• Linux 和 WSL: `/etc/claude-code/CLAUDE.md`<br />• Windows: `C:\Program Files\ClaudeCode\CLAUDE.md` | 由 IT/DevOps 管理的组织范围指令 | 公司编码标准、安全策略、合规要求 | 组织中的所有用户 |

59| **项目指令** | `./CLAUDE.md` 或 `./.claude/CLAUDE.md` | 项目的团队共享指令 | 项目架构、编码标准、常见工作流 | 通过源代码控制的团队成员 |

60| **用户指令** | `~/.claude/CLAUDE.md` | 所有项目的个人偏好 | 代码样式偏好、个人工具快捷方式 | 仅你(所有项目) |

61| **本地指令** | `./CLAUDE.local.md` | 个人项目特定偏好;添加到 `.gitignore` | 你的沙箱 URL、首选测试数据 | 仅你(当前项目) |

62 

63工作目录上方目录层次结构中的 CLAUDE.md 和 CLAUDE.local.md 文件在启动时完整加载。子目录中的文件在 Claude 读取这些目录中的文件时按需加载。有关完整的解析顺序,请参阅 [CLAUDE.md 文件如何加载](#how-claude-md-files-load)。

64 

65对于大型项目,你可以使用 [项目规则](#organize-rules-with-claude/rules/) 将指令分解为特定主题的文件。规则让你将指令范围限定到特定文件类型或子目录。

66 

67### 设置项目 CLAUDE.md

68 

69项目 CLAUDE.md 可以存储在 `./CLAUDE.md` 或 `./.claude/CLAUDE.md` 中。创建此文件并添加适用于在项目上工作的任何人的指令:构建和测试命令、编码标准、架构决策、命名约定和常见工作流。这些指令通过版本控制与你的团队共享,因此请关注项目级标准而不是个人偏好。

70 

71<Tip>

72 运行 `/init` 自动生成起始 CLAUDE.md。Claude 分析你的代码库并创建一个包含构建命令、测试指令和它发现的项目约定的文件。如果 CLAUDE.md 已存在,`/init` 会建议改进而不是覆盖它。从那里进行细化,添加 Claude 不会自己发现的指令。

73 

74 设置 `CLAUDE_CODE_NEW_INIT=1` 以启用交互式多阶段流程。`/init` 询问要设置哪些工件:CLAUDE.md 文件、skills 和 hooks。然后它使用 subagent 探索你的代码库,通过后续问题填补空白,并在写入任何文件之前呈现可审查的提案。

75</Tip>

76 

77### 编写有效的指令

78 

79CLAUDE.md 文件在每个会话开始时加载到上下文窗口中,与你的对话一起消耗令牌。[上下文窗口可视化](/zh-CN/context-window)显示 CLAUDE.md 相对于其余启动上下文的加载位置。因为它们是上下文而不是强制配置,你编写指令的方式会影响 Claude 遵循它们的可靠性。具体、简洁、结构良好的指令效果最好。

80 

81**大小**:每个 CLAUDE.md 文件目标在 200 行以下。较长的文件消耗更多上下文并降低遵守度。如果你的指令变得很大,使用 [路径范围规则](#path-specific-rules) 以便指令仅在 Claude 处理匹配文件时加载。你也可以将内容分割成 [导入](#import-additional-files) 以便组织,尽管导入的文件仍然加载并在启动时进入上下文窗口。

82 

83**结构**:使用 markdown 标题和项目符号来分组相关指令。Claude 扫描结构的方式与读者相同:有组织的部分比密集段落更容易遵循。

84 

85**具体性**:编写具体到足以验证的指令。例如:

86 

87* "使用 2 空格缩进"而不是"正确格式化代码"

88* "在提交前运行 `npm test`"而不是"测试你的更改"

89* "API 处理程序位于 `src/api/handlers/`"而不是"保持文件有组织"

90 

91**一致性**:如果两条规则相互矛盾,Claude 可能会任意选择一条。定期审查你的 CLAUDE.md 文件、子目录中的嵌套 CLAUDE.md 文件和 [`.claude/rules/`](#organize-rules-with-claude/rules/) 以删除过时或冲突的指令。在 monorepos 中,使用 [`claudeMdExcludes`](#exclude-specific-claude-md-files) 跳过与你的工作无关的其他团队的 CLAUDE.md 文件。

92 

93### 导入其他文件

94 

95CLAUDE.md 文件可以使用 `@path/to/import` 语法导入其他文件。导入的文件在启动时展开并加载到上下文中,与引用它们的 CLAUDE.md 一起。

96 

97允许相对路径和绝对路径。相对路径相对于包含导入的文件解析,而不是工作目录。导入的文件可以递归导入其他文件,最大深度为五跳。

98 

99要引入 README、package.json 和工作流指南,在你的 CLAUDE.md 中的任何地方使用 `@` 语法引用它们:

100 

101```text theme={null}

102有关项目概述,请参阅 @README,有关此项目的可用 npm 命令,请参阅 @package.json。

103 

104# 其他指令

105- git 工作流 @docs/git-instructions.md

106```

107 

108对于你不想签入版本控制的私人项目偏好,在项目根目录创建 `CLAUDE.local.md`。它与 `CLAUDE.md` 一起加载并以相同方式处理。将 `CLAUDE.local.md` 添加到你的 `.gitignore` 以便它不被提交;运行 `/init` 并选择个人选项会为你做这个。

109 

110如果你在同一存储库的多个 git worktrees 中工作,一个被 gitignore 的 `CLAUDE.local.md` 仅存在于你创建它的 worktree 中。要在 worktrees 中共享个人指令,改为从你的主目录导入文件:

111 

112```text theme={null}

113# 个人偏好

114- @~/.claude/my-project-instructions.md

115```

116 

117<Warning>

118 Claude Code 第一次在项目中遇到外部导入时,它会显示一个批准对话框,列出这些文件。如果你拒绝,导入保持禁用状态,对话框不会再出现。

119</Warning>

120 

121有关组织指令的更结构化方法,请参阅 [`.claude/rules/`](#organize-rules-with-claude/rules/)。

122 

123### AGENTS.md

124 

125Claude Code 读取 `CLAUDE.md`,而不是 `AGENTS.md`。如果你的存储库已经为其他编码代理使用 `AGENTS.md`,创建一个导入它的 `CLAUDE.md`,这样两个工具都可以读取相同的指令而无需重复。你也可以在导入下方添加 Claude 特定的指令。Claude 在会话开始时加载导入的文件,然后附加其余部分:

126 

127```markdown CLAUDE.md theme={null}

128@AGENTS.md

129 

130## Claude Code

131 

132对 `src/billing/` 下的更改使用 Plan Mode。

133```

134 

135### CLAUDE.md 文件如何加载

136 

137Claude Code 通过从当前工作目录向上遍历目录树来读取 CLAUDE.md 文件,检查沿途的每个目录是否有 `CLAUDE.md` 和 `CLAUDE.local.md` 文件。这意味着如果你在 `foo/bar/` 中运行 Claude Code,它会从 `foo/bar/CLAUDE.md`、`foo/CLAUDE.md` 和沿途的任何 `CLAUDE.local.md` 文件加载指令。

138 

139所有发现的文件被连接到上下文中,而不是相互覆盖。在目录树中,内容从文件系统根目录向下排序到你的工作目录。对于 `foo/bar/` 示例,`foo/CLAUDE.md` 在上下文中出现在 `foo/bar/CLAUDE.md` 之前,因此更接近你启动 Claude 的位置的指令最后被读取。在每个目录中,`CLAUDE.local.md` 在 `CLAUDE.md` 之后附加,因此你的个人笔记是 Claude 在该级别读取的最后内容。

140 

141Claude 还在当前工作目录下的子目录中发现 `CLAUDE.md` 和 `CLAUDE.local.md` 文件。它们不是在启动时加载,而是在 Claude 读取这些子目录中的文件时包含。

142 

143如果你在一个大型 monorepo 中工作,其他团队的 CLAUDE.md 文件被拾取,使用 [`claudeMdExcludes`](#exclude-specific-claude-md-files) 跳过它们。

144 

145块级 HTML 注释(`<!-- maintainer notes -->`)在 CLAUDE.md 文件中在内容注入到 Claude 的上下文之前被剥离。使用它们为人类维护者留下笔记,而不在它们上花费上下文令牌。代码块内的注释被保留。当你直接用 Read 工具打开 CLAUDE.md 文件时,注释保持可见。

146 

147#### 从其他目录加载

148 

149`--add-dir` 标志使 Claude 可以访问主工作目录外的其他目录。默认情况下,不加载这些目录中的 CLAUDE.md 文件。

150 

151要也从其他目录加载记忆文件,设置 `CLAUDE_CODE_ADDITIONAL_DIRECTORIES_CLAUDE_MD` 环境变量:

152 

153```bash theme={null}

154CLAUDE_CODE_ADDITIONAL_DIRECTORIES_CLAUDE_MD=1 claude --add-dir ../shared-config

155```

156 

157这会从其他目录加载 `CLAUDE.md`、`.claude/CLAUDE.md`、`.claude/rules/*.md` 和 `CLAUDE.local.md`。如果你从 [`--setting-sources`](/zh-CN/cli-reference) 中排除 `local`,`CLAUDE.local.md` 会被跳过。

158 

159### 使用 `.claude/rules/` 组织规则

160 

161对于较大的项目,你可以使用 `.claude/rules/` 目录将指令组织到多个文件中。这使指令保持模块化并更容易让团队维护。规则也可以 [范围限定到特定文件路径](#path-specific-rules),因此它们仅在 Claude 处理匹配文件时加载到上下文中,减少噪音并节省上下文空间。

162 

163<Note>

164 规则在每个会话或打开匹配文件时加载到上下文中。对于不需要始终在上下文中的特定任务指令,改用 [skills](/zh-CN/skills),它仅在你调用它们或 Claude 确定它们与你的提示相关时加载。

165</Note>

166 

167#### 设置规则

168 

169在你的项目的 `.claude/rules/` 目录中放置 markdown 文件。每个文件应涵盖一个主题,具有描述性文件名,如 `testing.md` 或 `api-design.md`。所有 `.md` 文件都被递归发现,因此你可以将规则组织到子目录中,如 `frontend/` 或 `backend/`:

170 

171```text theme={null}

172your-project/

173├── .claude/

174│ ├── CLAUDE.md # 主项目指令

175│ └── rules/

176│ ├── code-style.md # 代码样式指南

177│ ├── testing.md # 测试约定

178│ └── security.md # 安全要求

179```

180 

181没有 [`paths` frontmatter](#path-specific-rules) 的规则在启动时加载,优先级与 `.claude/CLAUDE.md` 相同。

182 

183#### 特定路径的规则

184 

185规则可以使用带有 `paths` 字段的 YAML frontmatter 范围限定到特定文件。这些条件规则仅在 Claude 处理与指定模式匹配的文件时适用。

186 

187```markdown theme={null}

188---

189paths:

190 - "src/api/**/*.ts"

191---

192 

193# API 开发规则

194 

195- 所有 API 端点必须包括输入验证

196- 使用标准错误响应格式

197- 包括 OpenAPI 文档注释

198```

199 

200没有 `paths` 字段的规则无条件加载并适用于所有文件。路径范围规则在 Claude 读取与模式匹配的文件时触发,而不是在每次工具使用时。

201 

202在 `paths` 字段中使用 glob 模式按扩展名、目录或任何组合匹配文件:

203 

204| 模式 | 匹配 |

205| ---------------------- | ---------------------- |

206| `**/*.ts` | 任何目录中的所有 TypeScript 文件 |

207| `src/**/*` | `src/` 目录下的所有文件 |

208| `*.md` | 项目根目录中的 Markdown 文件 |

209| `src/components/*.tsx` | 特定目录中的 React 组件 |

210 

211你可以指定多个模式并使用大括号扩展在一个模式中匹配多个扩展名:

212 

213```markdown theme={null}

214---

215paths:

216 - "src/**/*.{ts,tsx}"

217 - "lib/**/*.ts"

218 - "tests/**/*.test.ts"

219---

220```

221 

222#### 使用符号链接跨项目共享规则

223 

224`.claude/rules/` 目录支持符号链接,因此你可以维护一组共享规则并将它们链接到多个项目中。符号链接被解析并正常加载,循环符号链接被检测并优雅处理。

225 

226此示例链接共享目录和单个文件:

227 

228```bash theme={null}

229ln -s ~/shared-claude-rules .claude/rules/shared

230ln -s ~/company-standards/security.md .claude/rules/security.md

231```

232 

233#### 用户级规则

234 

235`~/.claude/rules/` 中的个人规则适用于你机器上的每个项目。使用它们来处理不是项目特定的偏好:

236 

237```text theme={null}

238~/.claude/rules/

239├── preferences.md # 你的个人编码偏好

240└── workflows.md # 你的首选工作流

241```

242 

243用户级规则在项目规则之前加载,给予项目规则更高的优先级。

244 

245### 为大型团队管理 CLAUDE.md

246 

247对于在团队中部署 Claude Code 的组织,你可以集中指令并控制加载哪些 CLAUDE.md 文件。

248 

249#### 部署组织范围的 CLAUDE.md

250 

251组织可以部署一个集中管理的 CLAUDE.md,适用于机器上的所有用户。此文件不能被个人设置排除。

252 

253<Steps>

254 <Step title="在托管策略位置创建文件">

255 * macOS: `/Library/Application Support/ClaudeCode/CLAUDE.md`

256 * Linux 和 WSL: `/etc/claude-code/CLAUDE.md`

257 * Windows: `C:\Program Files\ClaudeCode\CLAUDE.md`

258 </Step>

259 

260 <Step title="使用你的配置管理系统部署">

261 使用 MDM、Group Policy、Ansible 或类似工具在开发者机器上分发文件。有关其他组织范围配置选项,请参阅 [托管设置](/zh-CN/permissions#managed-settings)。

262 </Step>

263</Steps>

264 

265托管 CLAUDE.md 和 [托管设置](/zh-CN/settings#settings-files) 服务于不同的目的。使用设置进行技术强制,使用 CLAUDE.md 进行行为指导:

266 

267| 关注点 | 配置在 |

268| :-------------- | :------------------------------------------ |

269| 阻止特定工具、命令或文件路径 | 托管设置:`permissions.deny` |

270| 强制沙箱隔离 | 托管设置:`sandbox.enabled` |

271| 环境变量和 API 提供商路由 | 托管设置:`env` |

272| 身份验证方法和组织锁定 | 托管设置:`forceLoginMethod`、`forceLoginOrgUUID` |

273| 代码样式和质量指南 | 托管 CLAUDE.md |

274| 数据处理和合规提醒 | 托管 CLAUDE.md |

275| Claude 的行为指令 | 托管 CLAUDE.md |

276 

277设置规则由客户端强制执行,无论 Claude 决定做什么。CLAUDE.md 指令塑造 Claude 的行为,但不是硬强制层。

278 

279#### 排除特定的 CLAUDE.md 文件

280 

281在大型 monorepos 中,祖先 CLAUDE.md 文件可能包含与你的工作无关的指令。`claudeMdExcludes` 设置让你按路径或 glob 模式跳过特定文件。

282 

283此示例排除顶级 CLAUDE.md 和来自父文件夹的规则目录。将其添加到 `.claude/settings.local.json` 以使排除保持本地到你的机器:

284 

285```json theme={null}

286{

287 "claudeMdExcludes": [

288 "**/monorepo/CLAUDE.md",

289 "/home/user/monorepo/other-team/.claude/rules/**"

290 ]

291}

292```

293 

294模式使用 glob 语法与绝对文件路径匹配。你可以在任何 [设置层](/zh-CN/settings#settings-files):用户、项目、本地或托管策略配置 `claudeMdExcludes`。数组跨层合并。

295 

296托管策略 CLAUDE.md 文件不能被排除。这确保组织范围指令始终适用,无论个人设置如何。

297 

298## 自动记忆

299 

300自动记忆让 Claude 跨会话积累知识,无需你编写任何内容。Claude 在工作时为自己保存笔记:构建命令、调试见解、架构笔记、代码样式偏好和工作流习惯。Claude 不会每个会话都保存内容。它根据信息在未来对话中是否有用来决定什么值得记住。

301 

302<Note>

303 自动记忆需要 Claude Code v2.1.59 或更高版本。使用 `claude --version` 检查你的版本。

304</Note>

305 

306### 启用或禁用自动记忆

307 

308自动记忆默认开启。要切换它,在会话中打开 `/memory` 并使用自动记忆切换,或在你的项目设置中设置 `autoMemoryEnabled`:

309 

310```json theme={null}

311{

312 "autoMemoryEnabled": false

313}

314```

315 

316要通过环境变量禁用自动记忆,设置 `CLAUDE_CODE_DISABLE_AUTO_MEMORY=1`。

317 

318### 存储位置

319 

320每个项目在 `~/.claude/projects/<project>/memory/` 获得自己的记忆目录。`<project>` 路径来自 git 存储库,因此同一存储库中的所有 worktrees 和子目录共享一个自动记忆目录。在 git 存储库外,改用项目根目录。

321 

322要将自动记忆存储在不同位置,在你的用户设置 `~/.claude/settings.json` 中设置 `autoMemoryDirectory`:

323 

324```json theme={null}

325{

326 "autoMemoryDirectory": "~/my-custom-memory-dir"

327}

328```

329 

330该值必须是绝对路径或以 `~/` 开头。此设置从策略和用户设置以及 `--settings` 标志接受。它不从项目或本地设置接受,因为两个文件都位于项目目录内,克隆的存储库可能会提供任一文件以将自动记忆写入重定向到敏感位置。

331 

332目录包含一个 `MEMORY.md` 入口点和可选的主题文件:

333 

334```text theme={null}

335~/.claude/projects/<project>/memory/

336├── MEMORY.md # 简洁索引,加载到每个会话

337├── debugging.md # 关于调试模式的详细笔记

338├── api-conventions.md # API 设计决策

339└── ... # Claude 创建的任何其他主题文件

340```

341 

342`MEMORY.md` 充当记忆目录的索引。Claude 在你的会话中读取和写入此目录中的文件,使用 `MEMORY.md` 跟踪存储的内容。

343 

344自动记忆是机器本地的。同一 git 存储库中的所有 worktrees 和子目录共享一个自动记忆目录。文件不在机器或云环境之间共享。

345 

346### 它如何工作

347 

348`MEMORY.md` 的前 200 行或前 25KB(以先到者为准)在每次对话开始时加载。超过该阈值的内容在会话开始时不加载。Claude 通过将详细笔记移到单独的主题文件中来保持 `MEMORY.md` 简洁。

349 

350此限制仅适用于 `MEMORY.md`。CLAUDE.md 文件无论长度如何都完整加载,尽管较短的文件产生更好的遵守度。

351 

352主题文件如 `debugging.md` 或 `patterns.md` 在启动时不加载。Claude 在需要信息时使用其标准文件工具按需读取它们。

353 

354Claude 在你的会话中读取和写入记忆文件。当你在 Claude Code 界面中看到"Writing memory"或"Recalled memory"时,Claude 正在主动更新或读取 `~/.claude/projects/<project>/memory/`。

355 

356### 审计和编辑你的记忆

357 

358自动记忆文件是纯 markdown,你可以随时编辑或删除。运行 [`/memory`](#view-and-edit-with-memory) 从会话中浏览和打开记忆文件。

359 

360## 使用 `/memory` 查看和编辑

361 

362`/memory` 命令列出在你当前会话中加载的所有 CLAUDE.md、CLAUDE.local.md 和规则文件,让你切换自动记忆开或关,并提供打开自动记忆文件夹的链接。选择任何文件在你的编辑器中打开它。

363 

364当你要求 Claude 记住某些内容时,如"总是使用 pnpm,而不是 npm"或"记住 API 测试需要本地 Redis 实例",Claude 将其保存到自动记忆。要改为添加指令到 CLAUDE.md,直接要求 Claude,如"将其添加到 CLAUDE.md",或通过 `/memory` 自己编辑文件。

365 

366## 故障排除记忆问题

367 

368这些是 CLAUDE.md 和自动记忆最常见的问题,以及调试步骤。

369 

370### Claude 不遵循我的 CLAUDE.md

371 

372CLAUDE.md 内容作为用户消息在系统提示之后传递,而不是系统提示本身的一部分。Claude 读取它并尝试遵循它,但没有严格遵守的保证,特别是对于模糊或冲突的指令。

373 

374要调试:

375 

376* 运行 `/memory` 验证你的 CLAUDE.md 和 CLAUDE.local.md 文件被加载。如果文件未列出,Claude 看不到它。

377* 检查相关 CLAUDE.md 是否在为你的会话加载的位置(参见 [选择 CLAUDE.md 文件的位置](#choose-where-to-put-claude-md-files))。

378* 使指令更具体。"使用 2 空格缩进"比"格式化代码很好"效果更好。

379* 查找跨 CLAUDE.md 文件的冲突指令。如果两个文件为相同行为提供不同的指导,Claude 可能会任意选择一个。

380 

381对于你想要在系统提示级别的指令,使用 [`--append-system-prompt`](/zh-CN/cli-reference#system-prompt-flags)。这必须在每次调用时传递,因此它更适合脚本和自动化而不是交互式使用。

382 

383<Tip>

384 使用 [`InstructionsLoaded` hook](/zh-CN/hooks#instructionsloaded) 记录确切加载了哪些指令文件、何时加载以及为什么。这对于调试特定路径规则或子目录中的延迟加载文件很有用。

385</Tip>

386 

387### 我不知道自动记忆保存了什么

388 

389运行 `/memory` 并选择自动记忆文件夹来浏览 Claude 保存的内容。一切都是纯 markdown,你可以读取、编辑或删除。

390 

391### 我的 CLAUDE.md 太大了

392 

393超过 200 行的文件消耗更多上下文并可能降低遵守度。使用 [路径范围规则](#path-specific-rules) 仅在 Claude 处理匹配文件时加载指令,或修剪不是每个会话都需要的内容。分割到 [`@path` 导入](#import-additional-files) 有助于组织,但不会减少上下文,因为导入的文件在启动时加载。

394 

395### 在 `/compact` 后指令似乎丢失了

396 

397项目根 CLAUDE.md 在压缩中存活:在 `/compact` 之后,Claude 从磁盘重新读取它并将其重新注入到会话中。子目录中的嵌套 CLAUDE.md 文件不会自动重新注入;它们在 Claude 下次读取该子目录中的文件时重新加载。

398 

399如果指令在压缩后消失,它要么仅在对话中给出,要么位于尚未重新加载的嵌套 CLAUDE.md 中。将仅对话的指令添加到 CLAUDE.md 以使其持久化。有关完整的细分,请参阅 [什么在压缩中存活](/zh-CN/context-window#what-survives-compaction)。

400 

401有关大小、结构和具体性的指导,请参阅 [编写有效的指令](#write-effective-instructions)。

402 

403## 相关资源

404 

405* [调试你的配置](/zh-CN/debug-your-config):诊断为什么 CLAUDE.md 或设置未生效

406* [Skills](/zh-CN/skills):打包按需加载的可重复工作流

407* [Settings](/zh-CN/settings):使用设置文件配置 Claude Code 行为

408* [Subagent 记忆](/zh-CN/sub-agents#enable-persistent-memory):让 subagents 维护自己的自动记忆

microsoft-foundry.md +314 −0 created

Details

1> ## Documentation Index

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

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

4 

5# Claude Code on Microsoft Foundry

6 

7> 了解如何通过 Microsoft Foundry 配置 Claude Code,包括设置、配置和故障排除。

8 

9export const ContactSalesCard = ({surface}) => {

10 const utm = content => `utm_source=claude_code&utm_medium=docs&utm_content=${surface}_${content}`;

11 const iconArrowRight = (size = 13) => <svg width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.5" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true">

12 <line x1="5" y1="12" x2="19" y2="12" />

13 <polyline points="12 5 19 12 12 19" />

14 </svg>;

15 const STYLES = `

16.cc-cs {

17 --cs-slate: #141413;

18 --cs-clay: #d97757;

19 --cs-clay-deep: #c6613f;

20 --cs-gray-000: #ffffff;

21 --cs-gray-700: #3d3d3a;

22 --cs-border-default: rgba(31, 30, 29, 0.15);

23 font-family: inherit;

24}

25.dark .cc-cs {

26 --cs-slate: #f0eee6;

27 --cs-gray-000: #262624;

28 --cs-gray-700: #bfbdb4;

29 --cs-border-default: rgba(240, 238, 230, 0.14);

30}

31.cc-cs-card {

32 display: flex; align-items: center; justify-content: space-between;

33 gap: 16px; padding: 14px 16px; margin: 0;

34 background: var(--cs-gray-000); border: 0.5px solid var(--cs-border-default);

35 border-radius: 8px; flex-wrap: wrap;

36}

37.cc-cs-text { font-size: 13px; color: var(--cs-gray-700); line-height: 1.5; flex: 1; min-width: 240px; }

38.cc-cs-text strong { font-weight: 550; color: var(--cs-slate); }

39.cc-cs-actions { display: flex; align-items: center; gap: 8px; flex-shrink: 0; }

40.cc-cs-btn-clay {

41 display: inline-flex; align-items: center; gap: 8px;

42 background: var(--cs-clay-deep); color: #fff; border: none;

43 border-radius: 8px; padding: 8px 14px;

44 font-size: 13px; font-weight: 500;

45 transition: background-color 0.15s; white-space: nowrap;

46}

47.cc-cs-btn-clay:hover { background: var(--cs-clay); }

48.cc-cs-btn-ghost {

49 display: inline-flex; align-items: center; gap: 8px;

50 background: transparent; color: var(--cs-gray-700);

51 border: 0.5px solid var(--cs-border-default);

52 border-radius: 8px; padding: 8px 14px;

53 font-size: 13px; font-weight: 500;

54}

55.cc-cs-btn-ghost:hover { background: rgba(0, 0, 0, 0.04); }

56.dark .cc-cs-btn-ghost:hover { background: rgba(255, 255, 255, 0.04); }

57@media (max-width: 720px) {

58 .cc-cs-actions { width: 100%; }

59}

60`;

61 return <div className="cc-cs not-prose">

62 <style>{STYLES}</style>

63 <div className="cc-cs-card">

64 <div className="cc-cs-text">

65 <strong>Deploying Claude Code across your organization?</strong> Talk to sales about enterprise plans, SSO, and centralized billing.

66 </div>

67 <div className="cc-cs-actions">

68 <a href={`https://claude.com/pricing?${utm('view_plans')}#plans-business`} className="cc-cs-btn-ghost">

69 View plans

70 </a>

71 <a href={`https://claude.com/contact-sales?${utm('contact_sales')}`} className="cc-cs-btn-clay">

72 Contact sales {iconArrowRight()}

73 </a>

74 </div>

75 </div>

76 </div>;

77};

78 

79export const Experiment = ({flag, treatment, children}) => {

80 const VID_KEY = 'exp_vid';

81 const CONSENT_COUNTRIES = new Set(['AT', 'BE', 'BG', 'HR', 'CY', 'CZ', 'DK', 'EE', 'FI', 'FR', 'DE', 'GR', 'HU', 'IE', 'IT', 'LV', 'LT', 'LU', 'MT', 'NL', 'PL', 'PT', 'RO', 'SK', 'SI', 'ES', 'SE', 'RE', 'GP', 'MQ', 'GF', 'YT', 'BL', 'MF', 'PM', 'WF', 'PF', 'NC', 'AW', 'CW', 'SX', 'FO', 'GL', 'AX', 'GB', 'UK', 'AI', 'BM', 'IO', 'VG', 'KY', 'FK', 'GI', 'MS', 'PN', 'SH', 'TC', 'GG', 'JE', 'IM', 'CA', 'BR', 'IN']);

82 const fnv1a = s => {

83 let h = 0x811c9dc5;

84 for (let i = 0; i < s.length; i++) {

85 h ^= s.charCodeAt(i);

86 h += (h << 1) + (h << 4) + (h << 7) + (h << 8) + (h << 24);

87 }

88 return h >>> 0;

89 };

90 const bucket = (seed, vid) => fnv1a(fnv1a(seed + vid) + '') % 10000 < 5000 ? 'control' : 'treatment';

91 const [decision] = useState(() => {

92 const params = new URLSearchParams(location.search);

93 const preBucketed = document.documentElement.dataset['gb_' + flag.replace(/-/g, '_')];

94 const force = params.get('gb-force');

95 if (force) {

96 for (const p of force.split(',')) {

97 const [k, v] = p.split(':');

98 if (k === flag) return {

99 variant: v || 'treatment',

100 track: false

101 };

102 }

103 }

104 if (navigator.globalPrivacyControl) {

105 return {

106 variant: 'control',

107 track: false

108 };

109 }

110 const prefsMatch = document.cookie.match(/(?:^|; )anthropic-consent-preferences=([^;]+)/);

111 if (prefsMatch) {

112 try {

113 if (JSON.parse(decodeURIComponent(prefsMatch[1])).analytics !== true) {

114 return {

115 variant: 'control',

116 track: false

117 };

118 }

119 } catch {

120 return {

121 variant: 'control',

122 track: false

123 };

124 }

125 } else {

126 const country = params.get('country')?.toUpperCase() || (document.cookie.match(/(?:^|; )cf_geo=([A-Z]{2})/) || [])[1];

127 if (!country || CONSENT_COUNTRIES.has(country)) {

128 return {

129 variant: 'control',

130 track: false

131 };

132 }

133 }

134 let vid;

135 try {

136 const ajsMatch = document.cookie.match(/(?:^|; )ajs_anonymous_id=([^;]+)/);

137 if (ajsMatch) {

138 vid = decodeURIComponent(ajsMatch[1]).replace(/^"|"$/g, '');

139 } else {

140 vid = localStorage.getItem(VID_KEY);

141 if (!vid) {

142 vid = crypto.randomUUID();

143 }

144 document.cookie = `ajs_anonymous_id=${vid}; domain=.claude.com; path=/; Secure; SameSite=Lax; max-age=31536000`;

145 }

146 try {

147 localStorage.setItem(VID_KEY, vid);

148 } catch {}

149 } catch {

150 return {

151 variant: 'control',

152 track: false

153 };

154 }

155 const variant = preBucketed === '1' ? 'treatment' : preBucketed === '0' ? 'control' : bucket(flag, vid);

156 return {

157 variant,

158 track: true,

159 vid

160 };

161 });

162 useEffect(() => {

163 if (!decision.track) return;

164 fetch('https://api.anthropic.com/api/event_logging/v2/batch', {

165 method: 'POST',

166 headers: {

167 'Content-Type': 'application/json',

168 'x-service-name': 'claude_code_docs'

169 },

170 body: JSON.stringify({

171 events: [{

172 event_type: 'GrowthbookExperimentEvent',

173 event_data: {

174 device_id: decision.vid,

175 anonymous_id: decision.vid,

176 timestamp: new Date().toISOString(),

177 experiment_id: flag,

178 variation_id: decision.variant === 'treatment' ? 1 : 0,

179 environment: 'production'

180 }

181 }]

182 }),

183 keepalive: true

184 }).catch(() => {});

185 }, []);

186 return decision.variant === 'treatment' ? treatment : children;

187};

188 

189<Experiment flag="docs-contact-sales-cta" treatment={<ContactSalesCard surface="foundry" />} />

190 

191## 前置条件

192 

193在使用 Microsoft Foundry 配置 Claude Code 之前,请确保您拥有:

194 

195* 具有 Microsoft Foundry 访问权限的 Azure 订阅

196* 创建 Microsoft Foundry 资源和部署的 RBAC 权限

197* 已安装并配置 Azure CLI(可选 - 仅在您没有其他获取凭证机制时需要)

198 

199<Note>

200 如果您要将 Claude Code 部署给多个用户,请[固定您的模型版本](#4-pin-model-versions)以防止在 Anthropic 发布新模型时出现破损。

201</Note>

202 

203## 设置

204 

205### 1. 配置 Microsoft Foundry 资源

206 

207首先,在 Azure 中创建 Claude 资源:

208 

2091. 导航到 [Microsoft Foundry 门户](https://ai.azure.com/)

2102. 创建新资源,记下您的资源名称

2113. 为 Claude 模型创建部署:

212 * Claude Opus

213 * Claude Sonnet

214 * Claude Haiku

215 

216### 2. 配置 Azure 凭证

217 

218Claude Code 支持两种 Microsoft Foundry 身份验证方法。选择最适合您安全要求的方法。

219 

220**选项 A:API 密钥身份验证**

221 

2221. 在 Microsoft Foundry 门户中导航到您的资源

2232. 转到**端点和密钥**部分

2243. 复制 **API 密钥**

2254. 设置环境变量:

226 

227```bash theme={null}

228export ANTHROPIC_FOUNDRY_API_KEY=your-azure-api-key

229```

230 

231**选项 B:Microsoft Entra ID 身份验证**

232 

233当未设置 `ANTHROPIC_FOUNDRY_API_KEY` 时,Claude Code 会自动使用 Azure SDK [默认凭证链](https://learn.microsoft.com/en-us/azure/developer/javascript/sdk/authentication/credential-chains#defaultazurecredential-overview)。

234这支持多种方法来验证本地和远程工作负载。

235 

236在本地环境中,您通常可以使用 Azure CLI:

237 

238```bash theme={null}

239az login

240```

241 

242<Note>

243 使用 Microsoft Foundry 时,`/login` 和 `/logout` 命令被禁用,因为身份验证通过 Azure 凭证处理。

244</Note>

245 

246### 3. 配置 Claude Code

247 

248设置以下环境变量以启用 Microsoft Foundry:

249 

250```bash theme={null}

251# 启用 Microsoft Foundry 集成

252export CLAUDE_CODE_USE_FOUNDRY=1

253 

254# Azure 资源名称(将 {resource} 替换为您的资源名称)

255export ANTHROPIC_FOUNDRY_RESOURCE={resource}

256# 或提供完整的基础 URL:

257# export ANTHROPIC_FOUNDRY_BASE_URL=https://{resource}.services.ai.azure.com/anthropic

258```

259 

260### 4. 固定模型版本

261 

262<Warning>

263 为每个部署固定特定的模型版本。如果您使用模型别名(`sonnet`、`opus`、`haiku`)而不固定版本,Claude Code 可能会尝试使用您的 Foundry 账户中不可用的较新模型版本,当 Anthropic 发布更新时会破损现有用户。创建 Azure 部署时,请选择特定的模型版本而不是"自动更新到最新版本"。

264</Warning>

265 

266设置模型变量以匹配您在第 1 步中创建的部署名称。

267 

268如果没有 `ANTHROPIC_DEFAULT_OPUS_MODEL`,Foundry 上的 `opus` 别名会解析为 Opus 4.6。将其设置为 Opus 4.7 ID 以使用最新模型:

269 

270```bash theme={null}

271export ANTHROPIC_DEFAULT_OPUS_MODEL='claude-opus-4-7'

272export ANTHROPIC_DEFAULT_SONNET_MODEL='claude-sonnet-4-6'

273export ANTHROPIC_DEFAULT_HAIKU_MODEL='claude-haiku-4-5'

274```

275 

276有关当前和旧版模型 ID,请参阅[模型概览](https://platform.claude.com/docs/en/about-claude/models/overview)。有关完整的环境变量列表,请参阅[模型配置](/zh-CN/model-config#pin-models-for-third-party-deployments)。

277 

278[Prompt caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching) 会自动启用。要请求 1 小时的缓存 TTL 而不是 5 分钟的默认值,请设置以下变量;具有 1 小时 TTL 的缓存写入按更高的费率计费:

279 

280```bash theme={null}

281export ENABLE_PROMPT_CACHING_1H=1

282```

283 

284## Azure RBAC 配置

285 

286`Azure AI User` 和 `Cognitive Services User` 默认角色包括调用 Claude 模型所需的所有权限。

287 

288对于更严格的权限,请创建具有以下内容的自定义角色:

289 

290```json theme={null}

291{

292 "permissions": [

293 {

294 "dataActions": [

295 "Microsoft.CognitiveServices/accounts/providers/*"

296 ]

297 }

298 ]

299}

300```

301 

302有关详情,请参阅 [Microsoft Foundry RBAC 文档](https://learn.microsoft.com/en-us/azure/ai-foundry/concepts/rbac-azure-ai-foundry)。

303 

304## 故障排除

305 

306如果您收到错误"Failed to get token from azureADTokenProvider: ChainedTokenCredential authentication failed":

307 

308* 在环境中配置 Entra ID,或设置 `ANTHROPIC_FOUNDRY_API_KEY`。

309 

310## 其他资源

311 

312* [Microsoft Foundry 文档](https://learn.microsoft.com/en-us/azure/ai-foundry/what-is-azure-ai-foundry)

313* [Microsoft Foundry 模型](https://ai.azure.com/explore/models)

314* [Microsoft Foundry 定价](https://azure.microsoft.com/en-us/pricing/details/ai-foundry/)

model-config.md +382 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 模型配置

6 

7> 了解 Claude Code 模型配置,包括模型别名如 `opusplan`

8 

9## 可用模型

10 

11对于 Claude Code 中的 `model` 设置,您可以配置以下任一项:

12 

13* 一个**模型别名**

14* 一个**模型名称**

15 * Anthropic API:完整的\*\*[模型名称](https://platform.claude.com/docs/zh-CN/about-claude/models/overview)\*\*

16 * Bedrock:推理配置文件 ARN

17 * Foundry:部署名称

18 * Vertex:版本名称

19 

20### 模型别名

21 

22模型别名提供了一种便捷的方式来选择模型设置,无需记住确切的版本号:

23 

24| 模型别名 | 行为 |

25| ---------------- | -------------------------------------------------------------------------------------------------------------------------------- |

26| **`default`** | 特殊值,清除任何模型覆盖并恢复到您的账户类型推荐的模型。本身不是模型别名 |

27| **`best`** | 使用最强大的可用模型,当前等同于 `opus` |

28| **`sonnet`** | 使用最新的 Sonnet 模型用于日常编码任务 |

29| **`opus`** | 使用最新的 Opus 模型用于复杂推理任务 |

30| **`haiku`** | 使用快速高效的 Haiku 模型用于简单任务 |

31| **`sonnet[1m]`** | 使用 Sonnet 和[100 万令牌上下文窗口](https://platform.claude.com/docs/zh-CN/build-with-claude/context-windows#1m-token-context-window)用于长会话 |

32| **`opus[1m]`** | 使用 Opus 和[100 万令牌上下文窗口](https://platform.claude.com/docs/zh-CN/build-with-claude/context-windows#1m-token-context-window)用于长会话 |

33| **`opusplan`** | 特殊模式,在 Plan Mode 中使用 `opus`,然后在执行时切换到 `sonnet` |

34 

35在 Anthropic API 上,`opus` 解析为 Opus 4.7,`sonnet` 解析为 Sonnet 4.6。在 Bedrock、Vertex 和 Foundry 上,`opus` 解析为 Opus 4.6,`sonnet` 解析为 Sonnet 4.5;通过显式选择完整模型名称或设置 `ANTHROPIC_DEFAULT_OPUS_MODEL` 或 `ANTHROPIC_DEFAULT_SONNET_MODEL` 可以在这些提供商上获得更新的模型。

36 

37别名指向您的提供商推荐的版本,并随时间更新。要固定到特定版本,请使用完整模型名称(例如 `claude-opus-4-7`)或设置相应的环境变量,如 `ANTHROPIC_DEFAULT_OPUS_MODEL`。

38 

39<Note>

40 Opus 4.7 需要 Claude Code v2.1.111 或更高版本。运行 `claude update` 进行升级。

41</Note>

42 

43### 设置您的模型

44 

45您可以通过多种方式配置模型,按优先级顺序列出:

46 

471. **在会话期间** - 使用 `/model <alias|name>` 立即切换,或运行不带参数的 `/model` 打开选择器。当对话有先前的输出时,选择器会要求确认,因为下一个响应会重新读取完整历史记录而不使用缓存的上下文

482. **启动时** - 使用 `claude --model <alias|name>` 启动

493. **环境变量** - 设置 `ANTHROPIC_MODEL=<alias|name>`

504. **设置** - 在设置文件中使用 `model` 字段永久配置。

51 

52您的 `/model` 选择已保存到用户设置,并在重启后持续保留。从 v2.1.117 开始,如果项目的 `.claude/settings.json` 固定了不同的模型,Claude Code 也会将您的选择写入 `.claude/settings.local.json`,以便在重启后在该项目中继续应用。托管设置优先级最高,并在下次启动时重新应用。

53 

54当启动时的活跃模型来自项目或托管设置而不是您自己的选择时,启动标题会显示哪个设置文件设置了它。运行 `/model` 以覆盖当前会话。

55 

56使用示例:

57 

58```bash theme={null}

59# 使用 Opus 启动

60claude --model opus

61 

62# 在会话期间切换到 Sonnet

63/model sonnet

64```

65 

66设置文件示例:

67 

68```json theme={null}

69{

70 "permissions": {

71 ...

72 },

73 "model": "opus"

74}

75```

76 

77## 限制模型选择

78 

79企业管理员可以在[托管或策略设置](/zh-CN/settings#settings-files)中使用 `availableModels` 来限制用户可以选择的模型。

80 

81设置 `availableModels` 后,用户无法通过 `/model`、`--model` 标志或 `ANTHROPIC_MODEL` 环境变量切换到列表中不包含的模型。

82 

83```json theme={null}

84{

85 "availableModels": ["sonnet", "haiku"]

86}

87```

88 

89### 默认模型行为

90 

91模型选择器中的"默认"选项不受 `availableModels` 影响。它始终保持可用,并代表系统的运行时默认值[基于用户的订阅层级](#default-model-setting)。

92 

93即使使用 `availableModels: []`,用户仍然可以使用其层级的默认模型来使用 Claude Code。

94 

95### 控制用户运行的模型

96 

97`model` 设置是初始选择,而不是强制执行。它设置会话启动时哪个模型处于活跃状态,但用户仍然可以打开 `/model` 并选择"默认",这会解析为其层级的系统默认值,无论 `model` 设置为什么。

98 

99要完全控制模型体验,请结合三个设置:

100 

101* **`availableModels`**:限制用户可以切换到的命名模型

102* **`model`**:设置会话启动时的初始模型选择

103* **`ANTHROPIC_DEFAULT_SONNET_MODEL`** / **`ANTHROPIC_DEFAULT_OPUS_MODEL`** / **`ANTHROPIC_DEFAULT_HAIKU_MODEL`**:控制"默认"选项和 `sonnet`、`opus` 和 `haiku` 别名解析为什么

104 

105此示例在 Sonnet 4.5 上启动用户,将选择器限制为 Sonnet 和 Haiku,并将"默认"固定为解析为 Sonnet 4.5 而不是最新版本:

106 

107```json theme={null}

108{

109 "model": "claude-sonnet-4-5",

110 "availableModels": ["claude-sonnet-4-5", "haiku"],

111 "env": {

112 "ANTHROPIC_DEFAULT_SONNET_MODEL": "claude-sonnet-4-5"

113 }

114}

115```

116 

117没有 `env` 块,在选择器中选择"默认"的用户会获得最新的 Sonnet 版本,绕过 `model` 和 `availableModels` 中的版本固定。

118 

119### 合并行为

120 

121当 `availableModels` 在多个级别设置时,例如用户设置和项目设置,数组会被合并并去重。要强制执行严格的允许列表,请在托管或策略设置中设置 `availableModels`,这具有最高优先级。

122 

123### Mantle 模型 ID

124 

125当启用[Bedrock Mantle 端点](/zh-CN/amazon-bedrock#use-the-mantle-endpoint)时,`availableModels` 中以 `anthropic.` 开头的条目会作为自定义选项添加到 `/model` 选择器,并路由到 Mantle 端点。这是对[为第三方部署固定模型](#pin-models-for-third-party-deployments)中描述的仅别名匹配的例外。该设置仍然将选择器限制为列出的条目,因此请在任何 Mantle ID 旁边包含标准别名。

126 

127## 特殊模型行为

128 

129### `default` 模型设置

130 

131`default` 的行为取决于您的账户类型:

132 

133* **Max 和 Team Premium**:默认为 Opus 4.7

134* **Pro、Team Standard、Enterprise 和 Anthropic API**:默认为 Sonnet 4.6

135* **Bedrock、Vertex 和 Foundry**:默认为 Sonnet 4.5

136 

137如果您在使用 Opus 时达到使用阈值,Claude Code 可能会自动回退到 Sonnet。

138 

139<Note>

140 2026 年 4 月 23 日,Enterprise 按使用量付费和 Anthropic API 用户的默认模型将更改为 Opus 4.7。要保持不同的默认值,请设置 `ANTHROPIC_MODEL` 或[服务器管理的设置](/zh-CN/server-managed-settings)中的 `model` 字段。

141</Note>

142 

143### `opusplan` 模型设置

144 

145`opusplan` 模型别名提供了一种自动化的混合方法:

146 

147* **在 Plan Mode 中** - 使用 `opus` 进行复杂推理和架构决策

148* **在执行模式中** - 自动切换到 `sonnet` 进行代码生成和实现

149 

150这为您提供了两全其美的方案:Opus 的卓越推理能力用于规划,Sonnet 的效率用于执行。

151 

152Plan Mode 中的 Opus 阶段使用标准的 200K 上下文窗口运行。[扩展上下文](#extended-context)中描述的自动 1M 升级适用于 `opus` 模型设置,不适用于 `opusplan`。

153 

154### 调整工作量级别

155 

156[工作量级别](https://platform.claude.com/docs/zh-CN/build-with-claude/effort)控制自适应推理,让模型根据任务复杂性决定是否以及在每一步思考多少。较低的工作量对于直接任务更快更便宜,而较高的工作量为复杂问题提供更深入的推理。

157 

158Opus 4.7、Opus 4.6 和 Sonnet 4.6 支持工作量。可用的级别取决于模型:

159 

160| 模型 | 级别 |

161| :-------------------- | :---------------------------------- |

162| Opus 4.7 | `low`、`medium`、`high`、`xhigh`、`max` |

163| Opus 4.6 和 Sonnet 4.6 | `low`、`medium`、`high`、`max` |

164 

165如果您设置活跃模型不支持的级别,Claude Code 会回退到您设置的级别或以下的最高支持级别。例如,`xhigh` 在 Opus 4.6 上运行为 `high`。

166 

167从 v2.1.117 开始,Opus 4.7 上的默认工作量是 `xhigh`,Opus 4.6 和 Sonnet 4.6 上的默认工作量是 `high`。

168 

169当您首次运行 Opus 4.7 时,Claude Code 会应用 `xhigh`,即使您之前为 Opus 4.6 或 Sonnet 4.6 设置了不同的工作量级别。切换后再次运行 `/effort` 以选择不同的级别。

170 

171`low`、`medium`、`high` 和 `xhigh` 在会话间持续存在。`max` 提供最深入的推理,对令牌支出没有限制,仅适用于当前会话,除非通过 `CLAUDE_CODE_EFFORT_LEVEL` 环境变量设置。

172 

173#### 选择工作量级别

174 

175每个级别都在令牌支出和功能之间进行权衡。默认值适合大多数编码任务;当您想要不同的平衡时进行调整。

176 

177| 级别 | 何时使用 |

178| :------- | :------------------------------------------ |

179| `low` | 保留用于短期、范围有限、延迟敏感且不需要高智能的任务 |

180| `medium` | 减少成本敏感工作的令牌使用,可以权衡一些智能 |

181| `high` | 平衡令牌使用和智能。用作智能敏感工作的最低要求,或相对于 `xhigh` 减少令牌支出 |

182| `xhigh` | 大多数编码和代理任务的最佳结果。Opus 4.7 上的推荐默认值 |

183| `max` | 可以改进困难任务的性能,但可能显示收益递减,容易过度思考。在广泛采用前进行测试 |

184 

185工作量规模按模型校准,因此相同的级别名称在不同模型中不代表相同的基础值。

186 

187对于一次性深入推理而不改变您的会话设置,在您的提示中包含"ultrathink"。这会添加一个上下文内指令,告诉模型在该轮进行更多推理;它不会改变发送到 API 的工作量级别。

188 

189#### 设置工作量级别

190 

191您可以通过以下任何方式更改工作量:

192 

193* **`/effort`**:运行不带参数的 `/effort` 打开交互式滑块,运行 `/effort` 后跟级别名称直接设置,或运行 `/effort auto` 重置为模型默认值

194* **在 `/model` 中**:选择模型时使用左右箭头键调整工作量滑块

195* **`--effort` 标志**:在启动 Claude Code 时传递级别名称为单个会话设置

196* **环境变量**:设置 `CLAUDE_CODE_EFFORT_LEVEL` 为级别名称或 `auto`

197* **设置**:在设置文件中设置 `effortLevel`

198* **Skill 和 subagent frontmatter**:在 [skill](/zh-CN/skills#frontmatter-reference) 或 [subagent](/zh-CN/sub-agents#supported-frontmatter-fields) markdown 文件中设置 `effort` 以在该 skill 或 subagent 运行时覆盖工作量级别

199 

200环境变量优先于所有其他方法,然后是您配置的级别,然后是模型默认值。Frontmatter 工作量在该 skill 或 subagent 活跃时应用,覆盖会话级别但不覆盖环境变量。

201 

202当选择支持的模型时,工作量滑块会出现在 `/model` 中。当前工作量级别也显示在徽标和旋转器旁边,例如"with low effort",因此您可以确认哪个设置处于活动状态,而无需打开 `/model`。

203 

204#### 自适应推理和固定思考预算

205 

206自适应推理使思考在每一步都是可选的,因此 Claude 可以更快地响应常规提示,并为受益于思考的步骤保留更深入的思考。如果您希望 Claude 比当前级别产生的思考更多或更少,您可以直接在您的提示或 `CLAUDE.md` 中说明;模型会在其工作量设置范围内响应该指导。

207 

208Opus 4.7 始终使用自适应推理。固定思考预算模式和 `CLAUDE_CODE_DISABLE_ADAPTIVE_THINKING` 不适用于它。

209 

210在 Opus 4.6 和 Sonnet 4.6 上,您可以设置 `CLAUDE_CODE_DISABLE_ADAPTIVE_THINKING=1` 以恢复到由 `MAX_THINKING_TOKENS` 控制的先前固定思考预算。请参阅[环境变量](/zh-CN/env-vars)。

211 

212### 扩展上下文

213 

214Opus 4.7、Opus 4.6 和 Sonnet 4.6 支持[100 万令牌上下文窗口](https://platform.claude.com/docs/zh-CN/build-with-claude/context-windows#1m-token-context-window)用于包含大型代码库的长会话。

215 

216可用性因模型和计划而异。在 Max、Team 和 Enterprise 计划上,Opus 会自动升级到 1M 上下文,无需额外配置。这适用于 Team Standard 和 Team Premium 席位。

217 

218| 计划 | Opus with 1M context | Sonnet with 1M context |

219| --------------------- | ------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- |

220| Max、Team 和 Enterprise | 包含在订阅中 | 需要[额外使用](https://support.claude.com/en/articles/12429409-extra-usage-for-paid-claude-plans) |

221| Pro | 需要[额外使用](https://support.claude.com/en/articles/12429409-extra-usage-for-paid-claude-plans) | 需要[额外使用](https://support.claude.com/en/articles/12429409-extra-usage-for-paid-claude-plans) |

222| API 和按使用量付费 | 完全访问 | 完全访问 |

223 

224要完全禁用 1M 上下文,请设置 `CLAUDE_CODE_DISABLE_1M_CONTEXT=1`。这会从模型选择器中删除 1M 模型变体。请参阅[环境变量](/zh-CN/env-vars)。

225 

2261M 上下文窗口使用标准模型定价,超过 200K 的令牌无需额外费用。对于订阅中包含扩展上下文的计划,使用仍由您的订阅覆盖。对于通过额外使用访问扩展上下文的计划,令牌计入额外使用。

227 

228如果您的账户支持 1M 上下文,该选项会出现在最新版本的 Claude Code 的模型选择器(`/model`)中。如果您看不到它,请尝试重新启动您的会话。

229 

230您也可以将 `[1m]` 后缀与模型别名或完整模型名称一起使用:

231 

232```bash theme={null}

233# 使用 opus[1m] 或 sonnet[1m] 别名

234/model opus[1m]

235/model sonnet[1m]

236 

237# 或将 [1m] 附加到完整模型名称

238/model claude-opus-4-7[1m]

239```

240 

241## 检查您当前的模型

242 

243您可以通过多种方式查看您当前使用的模型:

244 

2451. 在[状态行](/zh-CN/statusline)中(如果已配置)

2462. 在 `/status` 中,它也显示您的账户信息。

247 

248## 添加自定义模型选项

249 

250使用 `ANTHROPIC_CUSTOM_MODEL_OPTION` 向 `/model` 选择器添加单个自定义条目,而无需替换内置别名。这对于测试 Claude Code 默认不列出的模型 ID 很有用。对于 LLM 网关部署,Claude Code 会从网关的 `/v1/models` 端点自动填充选择器,因此仅当发现未返回您想要的模型时才需要此变量。请参阅 [LLM 网关模型选择](/zh-CN/llm-gateway#model-selection)。

251 

252此示例设置所有三个变量以使网关路由的 Opus 部署可选择:

253 

254```bash theme={null}

255export ANTHROPIC_CUSTOM_MODEL_OPTION="my-gateway/claude-opus-4-7"

256export ANTHROPIC_CUSTOM_MODEL_OPTION_NAME="Opus via Gateway"

257export ANTHROPIC_CUSTOM_MODEL_OPTION_DESCRIPTION="Custom deployment routed through the internal LLM gateway"

258```

259 

260自定义条目出现在 `/model` 选择器的底部。`ANTHROPIC_CUSTOM_MODEL_OPTION_NAME` 和 `ANTHROPIC_CUSTOM_MODEL_OPTION_DESCRIPTION` 是可选的。如果省略,模型 ID 用作名称,描述默认为 `Custom model (<model-id>)`。

261 

262Claude Code 跳过对 `ANTHROPIC_CUSTOM_MODEL_OPTION` 中设置的模型 ID 的验证,因此您可以使用您的 API 端点接受的任何字符串。

263 

264## 环境变量

265 

266您可以使用以下环境变量,这些变量必须是完整的**模型名称**(或您的 API 提供商的等效项),以控制别名映射到的模型名称。

267 

268| 环境变量 | 描述 |

269| -------------------------------- | ----------------------------------------------------------- |

270| `ANTHROPIC_DEFAULT_OPUS_MODEL` | 用于 `opus` 的模型,或在 Plan Mode 活跃时用于 `opusplan` 的模型。 |

271| `ANTHROPIC_DEFAULT_SONNET_MODEL` | 用于 `sonnet` 的模型,或在 Plan Mode 不活跃时用于 `opusplan` 的模型。 |

272| `ANTHROPIC_DEFAULT_HAIKU_MODEL` | 用于 `haiku` 的模型,或[后台功能](/zh-CN/costs#background-token-usage) |

273| `CLAUDE_CODE_SUBAGENT_MODEL` | 用于 [subagents](/zh-CN/sub-agents) 的模型 |

274 

275注意:`ANTHROPIC_SMALL_FAST_MODEL` 已弃用,改为使用 `ANTHROPIC_DEFAULT_HAIKU_MODEL`。

276 

277### 为第三方部署固定模型

278 

279通过 [Bedrock](/zh-CN/amazon-bedrock)、[Vertex AI](/zh-CN/google-vertex-ai) 或 [Foundry](/zh-CN/microsoft-foundry) 部署 Claude Code 时,在向用户推出前固定模型版本。

280 

281不固定模型,Claude Code 会使用模型别名(`sonnet`、`opus`、`haiku`),这些别名会解析为最新版本。当 Anthropic 发布新模型时,如果用户账户未启用新版本,Bedrock 和 Vertex AI 用户会看到通知并回退到该会话的先前版本,而 Foundry 用户会看到错误,因为 Foundry 没有等效的启动检查。

282 

283<Warning>

284 在初始设置中将所有三个模型环境变量设置为特定版本 ID。固定让您控制用户何时迁移到新模型。

285</Warning>

286 

287对您的提供商使用以下环境变量和特定版本的模型 ID:

288 

289| 提供商 | 示例 |

290| :-------- | :------------------------------------------------------------------- |

291| Bedrock | `export ANTHROPIC_DEFAULT_OPUS_MODEL='us.anthropic.claude-opus-4-7'` |

292| Vertex AI | `export ANTHROPIC_DEFAULT_OPUS_MODEL='claude-opus-4-7'` |

293| Foundry | `export ANTHROPIC_DEFAULT_OPUS_MODEL='claude-opus-4-7'` |

294 

295对 `ANTHROPIC_DEFAULT_SONNET_MODEL` 和 `ANTHROPIC_DEFAULT_HAIKU_MODEL` 应用相同的模式。有关所有提供商的当前和旧版模型 ID,请参阅[模型概览](https://platform.claude.com/docs/zh-CN/about-claude/models/overview)。要将用户升级到新模型版本,请更新这些环境变量并重新部署。

296 

297要为固定模型启用[扩展上下文](#extended-context),请在 `ANTHROPIC_DEFAULT_OPUS_MODEL` 或 `ANTHROPIC_DEFAULT_SONNET_MODEL` 中的模型 ID 后附加 `[1m]`:

298 

299```bash theme={null}

300export ANTHROPIC_DEFAULT_OPUS_MODEL='claude-opus-4-7[1m]'

301```

302 

303`[1m]` 后缀将 1M 上下文窗口应用于该别名的所有使用,包括 `opusplan`。Claude Code 在将模型 ID 发送到您的提供商之前会删除该后缀。仅当底层模型支持 1M 上下文(如 Opus 4.7 或 Sonnet 4.6)时才附加 `[1m]`。

304 

305<Note>

306 使用第三方提供商时,`settings.availableModels` 允许列表仍然适用。过滤与模型别名(`opus`、`sonnet`、`haiku`)匹配,而不是提供商特定的模型 ID。

307</Note>

308 

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

310 

311当您在第三方提供商上固定模型时,提供商特定的 ID 在 `/model` 选择器中按原样显示,Claude Code 可能无法识别模型支持的功能。您可以使用每个固定模型的伴随环境变量覆盖显示名称并声明功能。

312 

313这些变量在第三方提供商(如 Bedrock、Vertex AI 和 Foundry)上生效。`_NAME` 和 `_DESCRIPTION` 变量在 `ANTHROPIC_BASE_URL` 指向 [LLM gateway](/zh-CN/llm-gateway) 时也生效。当直接连接到 `api.anthropic.com` 时无效。

314 

315| 环境变量 | 描述 |

316| ----------------------------------------------------- | ---------------------------------------------------------- |

317| `ANTHROPIC_DEFAULT_OPUS_MODEL_NAME` | 固定 Opus 模型在 `/model` 选择器中的显示名称。未设置时默认为模型 ID |

318| `ANTHROPIC_DEFAULT_OPUS_MODEL_DESCRIPTION` | 固定 Opus 模型在 `/model` 选择器中的显示描述。未设置时默认为 `Custom Opus model` |

319| `ANTHROPIC_DEFAULT_OPUS_MODEL_SUPPORTED_CAPABILITIES` | 固定 Opus 模型支持的功能的逗号分隔列表 |

320 

321相同的 `_NAME`、`_DESCRIPTION` 和 `_SUPPORTED_CAPABILITIES` 后缀可用于 `ANTHROPIC_DEFAULT_SONNET_MODEL`、`ANTHROPIC_DEFAULT_HAIKU_MODEL` 和 `ANTHROPIC_CUSTOM_MODEL_OPTION`。

322 

323Claude Code 通过将模型 ID 与已知模式匹配来启用[工作量级别](#adjust-effort-level)和[扩展思考](/zh-CN/common-workflows#use-extended-thinking-thinking-mode)等功能。提供商特定的 ID(如 Bedrock ARN 或自定义部署名称)通常与这些模式不匹配,导致支持的功能被禁用。设置 `_SUPPORTED_CAPABILITIES` 以告诉 Claude Code 模型实际支持的功能:

324 

325| 功能值 | 启用 |

326| ---------------------- | ------------------------------------------------------------------- |

327| `effort` | [工作量级别](#adjust-effort-level)和 `/effort` 命令 |

328| `xhigh_effort` | {/* min-version: 2.1.111 */}`xhigh` 工作量级别 |

329| `max_effort` | `max` 工作量级别 |

330| `thinking` | [扩展思考](/zh-CN/common-workflows#use-extended-thinking-thinking-mode) |

331| `adaptive_thinking` | 根据任务复杂性动态分配思考的自适应推理 |

332| `interleaved_thinking` | 工具调用之间的思考 |

333 

334设置 `_SUPPORTED_CAPABILITIES` 时,列出的功能对匹配的固定模型启用,未列出的功能被禁用。未设置变量时,Claude Code 回退到基于模型 ID 的内置检测。

335 

336此示例将 Opus 固定到 Bedrock 自定义模型 ARN,设置友好名称,并声明其功能:

337 

338```bash theme={null}

339export ANTHROPIC_DEFAULT_OPUS_MODEL='arn:aws:bedrock:us-east-1:123456789012:custom-model/abc'

340export ANTHROPIC_DEFAULT_OPUS_MODEL_NAME='Opus via Bedrock'

341export ANTHROPIC_DEFAULT_OPUS_MODEL_DESCRIPTION='Opus 4.7 routed through a Bedrock custom endpoint'

342export ANTHROPIC_DEFAULT_OPUS_MODEL_SUPPORTED_CAPABILITIES='effort,xhigh_effort,max_effort,thinking,adaptive_thinking,interleaved_thinking'

343```

344 

345### 按版本覆盖模型 ID

346 

347上面的家族级环境变量为每个家族别名配置一个模型 ID。如果您需要将同一家族中的多个版本映射到不同的提供商 ID,请改用 `modelOverrides` 设置。

348 

349`modelOverrides` 将单个 Anthropic 模型 ID 映射到 Claude Code 发送到您的提供商 API 的提供商特定字符串。当用户在 `/model` 选择器中选择映射的模型时,Claude Code 会使用您配置的值而不是内置默认值。

350 

351这让企业管理员可以将每个模型版本路由到特定的 Bedrock 推理配置文件 ARN、Vertex AI 版本名称或 Foundry 部署名称,用于治理、成本分配或区域路由。

352 

353在您的[设置文件](/zh-CN/settings#settings-files)中设置 `modelOverrides`:

354 

355```json theme={null}

356{

357 "modelOverrides": {

358 "claude-opus-4-7": "arn:aws:bedrock:us-east-2:123456789012:application-inference-profile/opus-prod",

359 "claude-opus-4-6": "arn:aws:bedrock:us-east-2:123456789012:application-inference-profile/opus-46-prod",

360 "claude-sonnet-4-6": "arn:aws:bedrock:us-east-2:123456789012:application-inference-profile/sonnet-prod"

361 }

362}

363```

364 

365键必须是[模型概览](https://platform.claude.com/docs/zh-CN/about-claude/models/overview)中列出的 Anthropic 模型 ID。对于带日期的模型 ID,请包含日期后缀,完全按照其显示的方式。未知的键会被忽略。

366 

367覆盖替换了支持 `/model` 选择器中每个条目的内置模型 ID。在 Bedrock 上,覆盖优先于 Claude Code 在启动时自动发现的任何推理配置文件。您直接通过 `ANTHROPIC_MODEL`、`--model` 或 `ANTHROPIC_DEFAULT_*_MODEL` 环境变量提供的值会按原样传递给提供商,不会被 `modelOverrides` 转换。

368 

369`modelOverrides` 与 `availableModels` 一起工作。允许列表针对 Anthropic 模型 ID 进行评估,而不是覆盖值,因此 `availableModels` 中的条目(如 `"opus"`)即使在 Opus 版本映射到 ARN 时也会继续匹配。

370 

371### Prompt caching 配置

372 

373Claude Code 自动使用 [prompt caching](https://platform.claude.com/docs/zh-CN/build-with-claude/prompt-caching) 来优化性能并降低成本。您可以全局禁用 prompt caching 或针对特定模型层级禁用:

374 

375| 环境变量 | 描述 |

376| ------------------------------- | ----------------------------------------- |

377| `DISABLE_PROMPT_CACHING` | 设置为 `1` 以禁用所有模型的 prompt caching(优先于按模型设置) |

378| `DISABLE_PROMPT_CACHING_HAIKU` | 设置为 `1` 以仅禁用 Haiku 模型的 prompt caching |

379| `DISABLE_PROMPT_CACHING_SONNET` | 设置为 `1` 以仅禁用 Sonnet 模型的 prompt caching |

380| `DISABLE_PROMPT_CACHING_OPUS` | 设置为 `1` 以仅禁用 Opus 模型的 prompt caching |

381 

382这些环境变量为您提供了对 prompt caching 行为的细粒度控制。全局 `DISABLE_PROMPT_CACHING` 设置优先于模型特定的设置,允许您在需要时快速禁用所有缓存。按模型的设置对于选择性控制很有用,例如在调试特定模型或与可能具有不同缓存实现的云提供商合作时。

monitoring-usage.md +955 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 监控

6 

7> 了解如何为 Claude Code 启用和配置 OpenTelemetry。

8 

9通过 OpenTelemetry (OTel) 导出遥测数据,跨组织跟踪 Claude Code 使用情况、成本和工具活动。Claude Code 通过标准指标协议导出指标作为时间序列数据,通过日志/事件协议导出事件,以及可选地通过 [traces 协议](#traces-beta) 导出分布式跟踪。配置您的指标、日志和跟踪后端以满足您的监控要求。

10 

11## 快速开始

12 

13使用环境变量配置 OpenTelemetry:

14 

15```bash theme={null}

16# 1. 启用遥测

17export CLAUDE_CODE_ENABLE_TELEMETRY=1

18 

19# 2. 选择导出器(两者都是可选的 - 仅配置您需要的)

20export OTEL_METRICS_EXPORTER=otlp # 选项:otlp、prometheus、console、none

21export OTEL_LOGS_EXPORTER=otlp # 选项:otlp、console、none

22 

23# 3. 配置 OTLP 端点(用于 OTLP 导出器)

24export OTEL_EXPORTER_OTLP_PROTOCOL=grpc

25export OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317

26 

27# 4. 设置身份验证(如果需要)

28export OTEL_EXPORTER_OTLP_HEADERS="Authorization=Bearer your-token"

29 

30# 5. 用于调试:减少导出间隔

31export OTEL_METRIC_EXPORT_INTERVAL=10000 # 10 秒(默认:60000ms)

32export OTEL_LOGS_EXPORT_INTERVAL=5000 # 5 秒(默认:5000ms)

33 

34# 6. 运行 Claude Code

35claude

36```

37 

38<Note>

39 默认导出间隔为指标 60 秒和日志 5 秒。在设置期间,您可能希望使用更短的间隔用于调试目的。请记住为生产使用重置这些值。

40</Note>

41 

42有关完整配置选项,请参阅 [OpenTelemetry 规范](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/protocol/exporter.md#configuration-options)。

43 

44## 管理员配置

45 

46管理员可以通过 [托管设置文件](/zh-CN/settings#settings-files) 为所有用户配置 OpenTelemetry 设置。这允许在整个组织中集中控制遥测设置。有关设置如何应用的更多信息,请参阅 [设置优先级](/zh-CN/settings#settings-precedence)。

47 

48示例托管设置配置:

49 

50```json theme={null}

51{

52 "env": {

53 "CLAUDE_CODE_ENABLE_TELEMETRY": "1",

54 "OTEL_METRICS_EXPORTER": "otlp",

55 "OTEL_LOGS_EXPORTER": "otlp",

56 "OTEL_EXPORTER_OTLP_PROTOCOL": "grpc",

57 "OTEL_EXPORTER_OTLP_ENDPOINT": "http://collector.example.com:4317",

58 "OTEL_EXPORTER_OTLP_HEADERS": "Authorization=Bearer example-token"

59 }

60}

61```

62 

63<Note>

64 托管设置可以通过 MDM(移动设备管理)或其他设备管理解决方案分发。在托管设置文件中定义的环境变量具有高优先级,用户无法覆盖。

65</Note>

66 

67## 配置详情

68 

69### 常见配置变量

70 

71| 环境变量 | 描述 | 示例值 |

72| --------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------- |

73| `CLAUDE_CODE_ENABLE_TELEMETRY` | 启用遥测收集(必需) | `1` |

74| `OTEL_METRICS_EXPORTER` | 指标导出器类型,逗号分隔。使用 `none` 禁用 | `console`、`otlp`、`prometheus`、`none` |

75| `OTEL_LOGS_EXPORTER` | 日志/事件导出器类型,逗号分隔。使用 `none` 禁用 | `console`、`otlp`、`none` |

76| `OTEL_EXPORTER_OTLP_PROTOCOL` | OTLP 导出器的协议,适用于所有信号 | `grpc`、`http/json`、`http/protobuf` |

77| `OTEL_EXPORTER_OTLP_ENDPOINT` | 所有信号的 OTLP 收集器端点 | `http://localhost:4317` |

78| `OTEL_EXPORTER_OTLP_METRICS_PROTOCOL` | 指标协议,覆盖常规设置 | `grpc`、`http/json`、`http/protobuf` |

79| `OTEL_EXPORTER_OTLP_METRICS_ENDPOINT` | OTLP 指标端点,覆盖常规设置 | `http://localhost:4318/v1/metrics` |

80| `OTEL_EXPORTER_OTLP_LOGS_PROTOCOL` | 日志协议,覆盖常规设置 | `grpc`、`http/json`、`http/protobuf` |

81| `OTEL_EXPORTER_OTLP_LOGS_ENDPOINT` | OTLP 日志端点,覆盖常规设置 | `http://localhost:4318/v1/logs` |

82| `OTEL_EXPORTER_OTLP_HEADERS` | OTLP 的身份验证标头 | `Authorization=Bearer token` |

83| `OTEL_EXPORTER_OTLP_METRICS_CLIENT_KEY` | mTLS 身份验证的客户端密钥 | 客户端密钥文件的路径 |

84| `OTEL_EXPORTER_OTLP_METRICS_CLIENT_CERTIFICATE` | mTLS 身份验证的客户端证书 | 客户端证书文件的路径 |

85| `OTEL_METRIC_EXPORT_INTERVAL` | 导出间隔(毫秒)(默认:60000) | `5000`、`60000` |

86| `OTEL_LOGS_EXPORT_INTERVAL` | 日志导出间隔(毫秒)(默认:5000) | `1000`、`10000` |

87| `OTEL_LOG_USER_PROMPTS` | 启用用户提示内容的日志记录(默认:禁用) | `1` 启用 |

88| `OTEL_LOG_TOOL_DETAILS` | 启用在工具事件和 trace span 属性中记录工具参数和输入参数:Bash 命令、MCP 服务器和工具名称、技能名称和工具输入。还在 `user_prompt` 事件上启用自定义、插件和 MCP 命令名称(默认:禁用) | `1` 启用 |

89| `OTEL_LOG_TOOL_CONTENT` | 启用在 span 事件中记录工具输入和输出内容(默认:禁用)。需要 [tracing](#traces-beta)。内容在 60 KB 处截断 | `1` 启用 |

90| `OTEL_LOG_RAW_API_BODIES` | 将完整的 Anthropic Messages API 请求和响应 JSON 作为 `api_request_body` / `api_response_body` 日志事件发出(默认:禁用)。主体包括整个对话历史。启用此选项意味着同意 `OTEL_LOG_USER_PROMPTS`、`OTEL_LOG_TOOL_DETAILS` 和 `OTEL_LOG_TOOL_CONTENT` 会揭示的所有内容 | `1` 用于在 60 KB 处截断的内联主体,或 `file:<dir>` 用于磁盘上的未截断主体,事件中带有 `body_ref` 指针 |

91| `OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE` | 指标时间性偏好(默认:`delta`)。如果您的后端期望累积时间性,请设置为 `cumulative` | `delta`、`cumulative` |

92| `CLAUDE_CODE_OTEL_HEADERS_HELPER_DEBOUNCE_MS` | 刷新动态标头的间隔(默认:1740000ms / 29 分钟) | `900000` |

93 

94### 指标基数控制

95 

96以下环境变量控制指标中包含哪些属性以管理基数:

97 

98| 环境变量 | 描述 | 默认值 | 禁用示例 |

99| ----------------------------------- | ----------------------------------------------- | ------- | ------- |

100| `OTEL_METRICS_INCLUDE_SESSION_ID` | 在指标中包含 session.id 属性 | `true` | `false` |

101| `OTEL_METRICS_INCLUDE_VERSION` | 在指标中包含 app.version 属性 | `false` | `true` |

102| `OTEL_METRICS_INCLUDE_ACCOUNT_UUID` | 在指标中包含 user.account\_uuid 和 user.account\_id 属性 | `true` | `false` |

103 

104这些变量有助于控制指标的基数,这会影响指标后端中的存储要求和查询性能。较低的基数通常意味着更好的性能和更低的存储成本,但分析的数据粒度较低。

105 

106### Traces(测试版)

107 

108分布式跟踪导出 span,将每个用户提示链接到它触发的 API 请求和工具执行,因此您可以在跟踪后端中将完整请求视为单个 trace。

109 

110跟踪默认关闭。要启用它,请同时设置 `CLAUDE_CODE_ENABLE_TELEMETRY=1` 和 `CLAUDE_CODE_ENHANCED_TELEMETRY_BETA=1`,然后设置 `OTEL_TRACES_EXPORTER` 以选择 span 的发送位置。Traces 重用 [常见 OTLP 配置](#common-configuration-variables) 用于端点、协议和标头。

111 

112| 环境变量 | 描述 | 示例值 |

113| ------------------------------------- | --------------------------------------------------- | ---------------------------------- |

114| `CLAUDE_CODE_ENHANCED_TELEMETRY_BETA` | 启用 span 跟踪(必需)。也接受 `ENABLE_ENHANCED_TELEMETRY_BETA` | `1` |

115| `OTEL_TRACES_EXPORTER` | Traces 导出器类型,逗号分隔。使用 `none` 禁用 | `console`、`otlp`、`none` |

116| `OTEL_EXPORTER_OTLP_TRACES_PROTOCOL` | Traces 协议,覆盖 `OTEL_EXPORTER_OTLP_PROTOCOL` | `grpc`、`http/json`、`http/protobuf` |

117| `OTEL_EXPORTER_OTLP_TRACES_ENDPOINT` | OTLP traces 端点,覆盖 `OTEL_EXPORTER_OTLP_ENDPOINT` | `http://localhost:4318/v1/traces` |

118| `OTEL_TRACES_EXPORT_INTERVAL` | Span 批量导出间隔(毫秒)(默认:5000) | `1000`、`10000` |

119 

120Spans 默认编辑用户提示文本、工具输入详情和工具内容。设置 `OTEL_LOG_USER_PROMPTS=1`、`OTEL_LOG_TOOL_DETAILS=1` 和 `OTEL_LOG_TOOL_CONTENT=1` 以包含它们。

121 

122当跟踪处于活动状态时,Bash 和 PowerShell 子进程会自动继承包含活动工具执行 span 的 W3C trace 上下文的 `TRACEPARENT` 环境变量。这让任何读取 `TRACEPARENT` 的子进程可以在同一 trace 下将其自己的 span 作为父级,通过 Claude 运行的脚本和命令启用端到端分布式跟踪。

123 

124在 Agent SDK 和使用 `-p` 启动的非交互式会话中,Claude Code 还在启动每个交互 span 时从其自己的环境中读取 `TRACEPARENT` 和 `TRACESTATE`。这让嵌入过程可以将其活动的 W3C trace 上下文传递到子进程中,以便 Claude Code 的 span 显示为调用者分布式跟踪的子级。交互式会话忽略入站 `TRACEPARENT` 以避免意外继承来自 CI 或容器环境的环境值。

125 

126#### Span 层次结构

127 

128每个用户提示启动一个 `claude_code.interaction` 根 span。API 调用、工具调用和 hook 执行被记录为其子级。工具 span 有两个自己的子 span:一个用于等待权限决策所花费的时间,一个用于执行本身。当 Task 工具生成子代理时,子代理的 API 和工具 span 嵌套在父级的 `claude_code.tool` span 下。

129 

130```text theme={null}

131claude_code.interaction

132├── claude_code.llm_request

133├── claude_code.hook (需要详细的测试版跟踪)

134└── claude_code.tool

135 ├── claude_code.tool.blocked_on_user

136 ├── claude_code.tool.execution

137 └── (Task 工具) 子代理 claude_code.llm_request / claude_code.tool span

138```

139 

140在 Agent SDK 和 `claude -p` 会话中,当在环境中设置 `TRACEPARENT` 时,`claude_code.interaction` 本身成为调用者 span 的子级。

141 

142#### Span 属性

143 

144每个 span 都携带 [标准属性](#standard-attributes) 加上与其名称匹配的 `span.type` 属性。下表列出了在每个 span 上设置的其他属性。`llm_request`、`tool.execution` 和 `hook` span 在记录失败时设置 OpenTelemetry 状态 `ERROR`;其他 span 始终以状态 `UNSET` 结束。

145 

146**`claude_code.interaction`**

147 

148| 属性 | 描述 | 门控条件 |

149| ------------------------- | -------------------------------- | ----------------------- |

150| `user_prompt` | 提示文本。除非设置了门控条件,否则值为 `<REDACTED>` | `OTEL_LOG_USER_PROMPTS` |

151| `user_prompt_length` | 提示长度(字符数) | |

152| `interaction.sequence` | 此会话中交互的基于 1 的计数器 | |

153| `interaction.duration_ms` | 轮次的实际时钟持续时间 | |

154 

155**`claude_code.llm_request`**

156 

157| 属性 | 描述 | 门控条件 |

158| -------------------------------- | --------------------------------------------------------------------------------------------------- | ---- |

159| `model` | 模型标识符 | |

160| `gen_ai.system` | 始终为 `anthropic`。OpenTelemetry GenAI 语义约定 | |

161| `gen_ai.request.model` | 与 `model` 相同的值。OpenTelemetry GenAI 语义约定 | |

162| `query_source` | 发出请求的子系统,例如 `repl_main_thread` 或子代理名称 | |

163| `speed` | `fast` 或 `normal` | |

164| `llm_request.context` | `interaction`、`tool` 或 `standalone`,取决于父 span | |

165| `duration_ms` | 包括重试的实际时钟持续时间 | |

166| `ttft_ms` | 首个令牌的时间(毫秒) | |

167| `input_tokens` | API 使用块中的输入令牌计数 | |

168| `output_tokens` | 输出令牌计数 | |

169| `cache_read_tokens` | 从提示缓存读取的令牌 | |

170| `cache_creation_tokens` | 写入提示缓存的令牌 | |

171| `request_id` | 来自 `request-id` 响应标头的 Anthropic API 请求 ID | |

172| `gen_ai.response.id` | 与 `request_id` 相同的值。OpenTelemetry GenAI 语义约定 | |

173| `client_request_id` | 最后一次尝试的客户端生成的 `x-client-request-id` | |

174| `attempt` | 为此请求进行的总尝试次数 | |

175| `success` | `true` 或 `false` | |

176| `status_code` | 请求失败时的 HTTP 状态代码 | |

177| `error` | 请求失败时的错误消息 | |

178| `response.has_tool_call` | 当响应包含工具使用块时为 `true` | |

179| `stop_reason` | API 响应 `stop_reason`,例如 `end_turn`、`tool_use`、`max_tokens`、`stop_sequence`、`pause_turn` 或 `refusal` | |

180| `gen_ai.response.finish_reasons` | 与 `stop_reason` 相同的值,包装在字符串数组中。OpenTelemetry GenAI 语义约定 | |

181 

182每次重试尝试也被记录为 `gen_ai.request.attempt` span 事件,具有 `attempt` 和 `client_request_id` 属性。

183 

184**`claude_code.tool`**

185 

186| 属性 | 描述 | 门控条件 |

187| --------------- | --------------------------- | ----------------------- |

188| `tool_name` | 工具名称 | |

189| `duration_ms` | 包括权限等待和执行的实际时钟持续时间 | |

190| `result_tokens` | 工具结果的近似令牌大小 | |

191| `file_path` | Read、Edit 和 Write 工具的目标文件路径 | `OTEL_LOG_TOOL_DETAILS` |

192| `full_command` | Bash 工具的命令字符串 | `OTEL_LOG_TOOL_DETAILS` |

193| `skill_name` | Skill 工具的技能名称 | `OTEL_LOG_TOOL_DETAILS` |

194| `subagent_type` | Task 工具的子代理类型 | `OTEL_LOG_TOOL_DETAILS` |

195 

196当 `OTEL_LOG_TOOL_CONTENT=1` 时,此 span 还记录一个 `tool.output` span 事件,其属性包含工具的输入和输出主体,在每个属性处截断为 60 KB。

197 

198**`claude_code.tool.blocked_on_user`**

199 

200| 属性 | 描述 | 门控条件 |

201| ------------- | ----------------------------------------------------- | ---- |

202| `duration_ms` | 等待权限决策所花费的时间 | |

203| `decision` | `accept` 或 `reject` | |

204| `source` | 决策来源,与 [Tool decision event](#tool-decision-event) 匹配 | |

205 

206**`claude_code.tool.execution`**

207 

208| 属性 | 描述 | 门控条件 |

209| ------------- | ---------------------------------------------------------------- | ----------------------- |

210| `duration_ms` | 运行工具主体所花费的时间 | |

211| `success` | `true` 或 `false` | |

212| `error` | 执行失败时的错误类别字符串,例如 `Error:ENOENT` 或 `ShellError`。当设置了门控条件时包含完整错误消息 | `OTEL_LOG_TOOL_DETAILS` |

213 

214**`claude_code.hook`**

215 

216此 span 仅在详细的测试版跟踪处于活动状态时发出,这需要 `ENABLE_BETA_TRACING_DETAILED=1` 和 `BETA_TRACING_ENDPOINT` 以及上述跟踪导出器配置。在交互式 CLI 会话中,这还需要您的组织被列入该功能的白名单。Agent SDK 和非交互式 `-p` 会话不受限制。仅设置 `CLAUDE_CODE_ENHANCED_TELEMETRY_BETA` 时不会发出。

217 

218| 属性 | 描述 | 门控条件 |

219| ------------------------ | -------------------------------- | ----------------------- |

220| `hook_event` | Hook 事件类型,例如 `PreToolUse` | |

221| `hook_name` | 完整 hook 名称,例如 `PreToolUse:Write` | |

222| `num_hooks` | 执行的匹配 hook 命令数 | |

223| `hook_definitions` | JSON 序列化的 hook 配置 | `OTEL_LOG_TOOL_DETAILS` |

224| `duration_ms` | 所有匹配 hook 的实际时钟持续时间 | |

225| `num_success` | 成功完成的 hook 计数 | |

226| `num_blocking` | 返回阻止决策的 hook 计数 | |

227| `num_non_blocking_error` | 失败但未阻止的 hook 计数 | |

228| `num_cancelled` | 在完成前取消的 hook 计数 | |

229 

230<Note>

231 其他内容承载属性,例如 `new_context`、`system_prompt_preview`、`user_system_prompt`、`tool_input` 和 `response.model_output`,仅在详细的测试版跟踪处于活动状态时发出。它们不是稳定 span 架构的一部分。`user_system_prompt` 还需要 `OTEL_LOG_USER_PROMPTS=1`。它仅包含您通过 `systemPrompt` SDK 选项或 `--system-prompt` 和 `--append-system-prompt` 标志提供的系统提示文本,在 60 KB 处截断,并且每个会话发出一次而不是每个请求发出一次。

232</Note>

233 

234### 动态标头

235 

236对于需要动态身份验证的企业环境,您可以配置脚本来动态生成标头:

237 

238#### 设置配置

239 

240添加到您的 `.claude/settings.json`:

241 

242```json theme={null}

243{

244 "otelHeadersHelper": "/bin/generate_opentelemetry_headers.sh"

245}

246```

247 

248#### 脚本要求

249 

250脚本必须输出有效的 JSON,其中包含表示 HTTP 标头的字符串键值对:

251 

252```bash theme={null}

253#!/bin/bash

254# 示例:多个标头

255echo "{\"Authorization\": \"Bearer $(get-token.sh)\", \"X-API-Key\": \"$(get-api-key.sh)\"}"

256```

257 

258#### 刷新行为

259 

260标头助手脚本在启动时运行,之后定期运行以支持令牌刷新。默认情况下,脚本每 29 分钟运行一次。使用 `CLAUDE_CODE_OTEL_HEADERS_HELPER_DEBOUNCE_MS` 环境变量自定义间隔。

261 

262### 多团队组织支持

263 

264具有多个团队或部门的组织可以使用 `OTEL_RESOURCE_ATTRIBUTES` 环境变量添加自定义属性以区分不同的组:

265 

266```bash theme={null}

267# 添加自定义属性用于团队识别

268export OTEL_RESOURCE_ATTRIBUTES="department=engineering,team.id=platform,cost_center=eng-123"

269```

270 

271这些自定义属性将包含在所有指标和事件中,允许您:

272 

273* 按团队或部门过滤指标

274* 按成本中心跟踪成本

275* 创建特定于团队的仪表板

276* 为特定团队设置警报

277 

278<Warning>

279 **OTEL\_RESOURCE\_ATTRIBUTES 的重要格式要求:**

280 

281 `OTEL_RESOURCE_ATTRIBUTES` 环境变量使用逗号分隔的键=值对,具有严格的格式要求:

282 

283 * **不允许空格**:值不能包含空格。例如,`user.organizationName=My Company` 无效

284 * **格式**:必须是逗号分隔的键=值对:`key1=value1,key2=value2`

285 * **允许的字符**:仅 US-ASCII 字符,不包括控制字符、空格、双引号、逗号、分号和反斜杠

286 * **特殊字符**:超出允许范围的字符必须进行百分比编码

287 

288 **示例:**

289 

290 ```bash theme={null}

291 # ❌ 无效 - 包含空格

292 export OTEL_RESOURCE_ATTRIBUTES="org.name=John's Organization"

293 

294 # ✅ 有效 - 改用下划线或驼峰式大小写

295 export OTEL_RESOURCE_ATTRIBUTES="org.name=Johns_Organization"

296 export OTEL_RESOURCE_ATTRIBUTES="org.name=JohnsOrganization"

297 

298 # ✅ 有效 - 如果需要,对特殊字符进行百分比编码

299 export OTEL_RESOURCE_ATTRIBUTES="org.name=John%27s%20Organization"

300 ```

301 

302 注意:用引号包装值不会转义空格。例如,`org.name="My Company"` 会导致字面值 `"My Company"`(包括引号),而不是 `My Company`。

303</Warning>

304 

305### 示例配置

306 

307在运行 `claude` 之前设置这些环境变量。每个块显示不同导出器或部署场景的完整配置:

308 

309```bash theme={null}

310# 控制台调试(1 秒间隔)

311export CLAUDE_CODE_ENABLE_TELEMETRY=1

312export OTEL_METRICS_EXPORTER=console

313export OTEL_METRIC_EXPORT_INTERVAL=1000

314 

315# OTLP/gRPC

316export CLAUDE_CODE_ENABLE_TELEMETRY=1

317export OTEL_METRICS_EXPORTER=otlp

318export OTEL_EXPORTER_OTLP_PROTOCOL=grpc

319export OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317

320 

321# Prometheus

322export CLAUDE_CODE_ENABLE_TELEMETRY=1

323export OTEL_METRICS_EXPORTER=prometheus

324 

325# 多个导出器

326export CLAUDE_CODE_ENABLE_TELEMETRY=1

327export OTEL_METRICS_EXPORTER=console,otlp

328export OTEL_EXPORTER_OTLP_PROTOCOL=http/json

329 

330# 指标和日志的不同端点/后端

331export CLAUDE_CODE_ENABLE_TELEMETRY=1

332export OTEL_METRICS_EXPORTER=otlp

333export OTEL_LOGS_EXPORTER=otlp

334export OTEL_EXPORTER_OTLP_METRICS_PROTOCOL=http/protobuf

335export OTEL_EXPORTER_OTLP_METRICS_ENDPOINT=http://metrics.example.com:4318

336export OTEL_EXPORTER_OTLP_LOGS_PROTOCOL=grpc

337export OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=http://logs.example.com:4317

338 

339# 仅指标(无事件/日志)

340export CLAUDE_CODE_ENABLE_TELEMETRY=1

341export OTEL_METRICS_EXPORTER=otlp

342export OTEL_EXPORTER_OTLP_PROTOCOL=grpc

343export OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317

344 

345# 仅事件/日志(无指标)

346export CLAUDE_CODE_ENABLE_TELEMETRY=1

347export OTEL_LOGS_EXPORTER=otlp

348export OTEL_EXPORTER_OTLP_PROTOCOL=grpc

349export OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317

350```

351 

352## 可用的指标和事件

353 

354### 标准属性

355 

356所有指标和事件共享这些标准属性:

357 

358| 属性 | 描述 | 控制方式 |

359| ------------------- | --------------------------------------------------------------- | -------------------------------------------- |

360| `session.id` | 唯一的会话标识符 | `OTEL_METRICS_INCLUDE_SESSION_ID`(默认:true) |

361| `app.version` | 当前 Claude Code 版本 | `OTEL_METRICS_INCLUDE_VERSION`(默认:false) |

362| `organization.id` | 组织 UUID(已认证时) | 可用时始终包含 |

363| `user.account_uuid` | 账户 UUID(已认证时) | `OTEL_METRICS_INCLUDE_ACCOUNT_UUID`(默认:true) |

364| `user.account_id` | 账户 ID,采用与 Anthropic 管理 API 匹配的标记格式(已认证时),例如 `user_01BWBeN28...` | `OTEL_METRICS_INCLUDE_ACCOUNT_UUID`(默认:true) |

365| `user.id` | 匿名设备/安装标识符,按 Claude Code 安装生成 | 始终包含 |

366| `user.email` | 用户电子邮件地址(通过 OAuth 认证时) | 可用时始终包含 |

367| `terminal.type` | 终端类型,例如 `iTerm.app`、`vscode`、`cursor` 或 `tmux` | 检测到时始终包含 |

368 

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

370 

371* `prompt.id`:UUID 将用户提示与所有后续事件关联到下一个提示。请参阅 [事件关联属性](#event-correlation-attributes)。

372* `workspace.host_paths`:在桌面应用中选择的主机工作区目录,作为字符串数组

373 

374### 指标

375 

376Claude Code 导出以下指标:

377 

378| 指标名称 | 描述 | 单位 |

379| ------------------------------------- | ----------------- | ------ |

380| `claude_code.session.count` | 启动的 CLI 会话计数 | count |

381| `claude_code.lines_of_code.count` | 修改的代码行数计数 | count |

382| `claude_code.pull_request.count` | 创建的拉取请求数 | count |

383| `claude_code.commit.count` | 创建的 git 提交数 | count |

384| `claude_code.cost.usage` | Claude Code 会话的成本 | USD |

385| `claude_code.token.usage` | 使用的令牌数 | tokens |

386| `claude_code.code_edit_tool.decision` | 代码编辑工具权限决策计数 | count |

387| `claude_code.active_time.total` | 总活跃时间(秒) | s |

388 

389### 指标详情

390 

391每个指标都包含上面列出的标准属性。具有额外上下文特定属性的指标如下所述。

392 

393#### 会话计数器

394 

395在每个会话开始时递增。

396 

397**属性**:

398 

399* 所有 [标准属性](#standard-attributes)

400* `start_type`:会话的启动方式。`"fresh"`、`"resume"` 或 `"continue"` 之一

401 

402#### 代码行计数器

403 

404当添加或删除代码时递增。

405 

406**属性**:

407 

408* 所有 [标准属性](#standard-attributes)

409* `type`:(`"added"`、`"removed"`)

410 

411#### 拉取请求计数器

412 

413通过 Claude Code 创建拉取请求时递增。

414 

415**属性**:

416 

417* 所有 [标准属性](#standard-attributes)

418 

419#### 提交计数器

420 

421通过 Claude Code 创建 git 提交时递增。

422 

423**属性**:

424 

425* 所有 [标准属性](#standard-attributes)

426 

427#### 成本计数器

428 

429在每个 API 请求后递增。

430 

431**属性**:

432 

433* 所有 [标准属性](#standard-attributes)

434* `model`:模型标识符(例如,"claude-sonnet-4-6")

435* `query_source`:发出请求的子系统的类别。`"main"`、`"subagent"` 或 `"auxiliary"` 之一

436* `speed`:当请求使用快速模式时为 `"fast"`。否则不存在

437* `effort`:应用于请求的 [努力级别](/zh-CN/model-config#adjust-effort-level):`"low"`、`"medium"`、`"high"`、`"xhigh"` 或 `"max"`。当模型不支持努力时不存在。

438 

439#### 令牌计数器

440 

441在每个 API 请求后递增。

442 

443**属性**:

444 

445* 所有 [标准属性](#standard-attributes)

446* `type`:(`"input"`、`"output"`、`"cacheRead"`、`"cacheCreation"`)

447* `model`:模型标识符(例如,"claude-sonnet-4-6")

448* `query_source`:发出请求的子系统的类别。`"main"`、`"subagent"` 或 `"auxiliary"` 之一

449* `speed`:当请求使用快速模式时为 `"fast"`。否则不存在

450* `effort`:应用于请求的 [努力级别](/zh-CN/model-config#adjust-effort-level)。有关详情,请参阅 [成本计数器](#cost-counter)。

451 

452#### 代码编辑工具决策计数器

453 

454当用户接受或拒绝 Edit、Write 或 NotebookEdit 工具使用时递增。

455 

456**属性**:

457 

458* 所有 [标准属性](#standard-attributes)

459* `tool_name`:工具名称(`"Edit"`、`"Write"`、`"NotebookEdit"`)

460* `decision`:用户决策(`"accept"`、`"reject"`)

461* `source`:决策来源。`"config"`、`"hook"`、`"user_permanent"`、`"user_temporary"`、`"user_abort"` 或 `"user_reject"` 之一。请参阅 [工具决策事件](#tool-decision-event) 了解每个值的含义。

462* `language`:编辑文件的编程语言,例如 `"TypeScript"`、`"Python"`、`"JavaScript"` 或 `"Markdown"`。对于无法识别的文件扩展名,返回 `"unknown"`。

463 

464#### 活跃时间计数器

465 

466跟踪实际花费在积极使用 Claude Code 上的时间,不包括空闲时间。此指标在用户交互期间递增(输入、读取响应)以及在 CLI 处理期间(工具执行、AI 响应生成)。

467 

468**属性**:

469 

470* 所有 [标准属性](#standard-attributes)

471* `type`:`"user"` 用于键盘交互,`"cli"` 用于工具执行和 AI 响应

472 

473### 事件

474 

475Claude Code 通过 OpenTelemetry 日志/事件导出以下事件(当配置了 `OTEL_LOGS_EXPORTER` 时):

476 

477#### 事件关联属性

478 

479当用户提交提示时,Claude Code 可能会进行多个 API 调用并运行多个工具。`prompt.id` 属性让您将所有这些事件与触发它们的单个提示联系起来。

480 

481| 属性 | 描述 |

482| ----------- | ------------------------------ |

483| `prompt.id` | UUID v4 标识符,链接处理单个用户提示时生成的所有事件 |

484 

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

486 

487<Note>

488 `prompt.id` 有意从指标中排除,因为每个提示生成唯一的 ID,这会创建一个不断增长的时间序列数。仅将其用于事件级分析和审计跟踪。

489</Note>

490 

491#### 用户提示事件

492 

493当用户提交提示时记录。

494 

495**事件名称**:`claude_code.user_prompt`

496 

497**属性**:

498 

499* 所有 [标准属性](#standard-attributes)

500* `event.name`:`"user_prompt"`

501* `event.timestamp`:ISO 8601 时间戳

502* `event.sequence`:单调递增的计数器,用于在会话内排序事件

503* `prompt_length`:提示的长度

504* `prompt`:提示内容(默认为已编辑,使用 `OTEL_LOG_USER_PROMPTS=1` 启用)

505* `command_name`:当提示调用命令时的命令名称。内置和捆绑的命令名称(例如 `compact` 或 `debug`)按原样发出;别名(例如 `reset`)按输入方式发出而不是规范名称。自定义、插件和 MCP 命令名称折叠为 `custom` 或 `mcp`,除非设置了 `OTEL_LOG_TOOL_DETAILS=1`

506* `command_source`:命令存在时的来源:`builtin`、`custom` 或 `mcp`。插件提供的命令报告为 `custom`

507 

508#### 工具结果事件

509 

510当工具完成执行时记录。

511 

512**事件名称**:`claude_code.tool_result`

513 

514**属性**:

515 

516* 所有 [标准属性](#standard-attributes)

517* `event.name`:`"tool_result"`

518* `event.timestamp`:ISO 8601 时间戳

519* `event.sequence`:单调递增的计数器,用于在会话内排序事件

520* `tool_name`:工具的名称

521* `tool_use_id`:此工具调用的唯一标识符。与传递给 hooks 的 `tool_use_id` 匹配,允许在 OTel 事件和 hook 捕获的数据之间进行关联。

522* `success`:`"true"` 或 `"false"`

523* `duration_ms`:执行时间(毫秒)

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

525* `error`(当 `OTEL_LOG_TOOL_DETAILS=1` 时):工具失败时的完整错误消息

526* `decision_type`:`"accept"` 或 `"reject"`

527* `decision_source`:决策来源。`"config"`、`"hook"`、`"user_permanent"`、`"user_temporary"`、`"user_abort"` 或 `"user_reject"` 之一。请参阅 [工具决策事件](#tool-decision-event) 了解每个值的含义。

528* `tool_input_size_bytes`:JSON 序列化工具输入的大小(字节)

529* `tool_result_size_bytes`:工具结果的大小(字节)

530* `mcp_server_scope`:MCP 服务器范围标识符(用于 MCP 工具)

531* `tool_parameters`(当 `OTEL_LOG_TOOL_DETAILS=1` 时):包含工具特定参数的 JSON 字符串:

532 * 对于 Bash 工具:包括 `bash_command`、`full_command`、`timeout`、`description`、`dangerouslyDisableSandbox` 和 `git_commit_id`(git commit 命令成功时的提交 SHA)

533 * 对于 MCP 工具:包括 `mcp_server_name`、`mcp_tool_name`

534 * 对于 Skill 工具:包括 `skill_name`

535 * 对于 Task 工具:包括 `subagent_type`

536* `tool_input`(当 `OTEL_LOG_TOOL_DETAILS=1` 时):JSON 序列化的工具参数。超过 512 个字符的单个值被截断,完整有效负载限制为约 4 K 字符。适用于所有工具,包括 MCP 工具。

537 

538#### API 请求事件

539 

540为每个对 Claude 的 API 请求记录。

541 

542**事件名称**:`claude_code.api_request`

543 

544**属性**:

545 

546* 所有 [标准属性](#standard-attributes)

547* `event.name`:`"api_request"`

548* `event.timestamp`:ISO 8601 时间戳

549* `event.sequence`:单调递增的计数器,用于在会话内排序事件

550* `model`:使用的模型(例如,"claude-sonnet-4-6")

551* `cost_usd`:USD 估计成本

552* `duration_ms`:请求持续时间(毫秒)

553* `input_tokens`:输入令牌数

554* `output_tokens`:输出令牌数

555* `cache_read_tokens`:从缓存读取的令牌数

556* `cache_creation_tokens`:用于缓存创建的令牌数

557* `request_id`:来自响应的 `request-id` 标头的 Anthropic API 请求 ID,例如 `"req_011..."`。仅当 API 返回时存在。

558* `speed`:`"fast"` 或 `"normal"`,指示是否启用了快速模式

559* `query_source`:发出请求的子系统,例如 `"repl_main_thread"`、`"compact"` 或子代理名称

560* `effort`:应用于请求的 [努力级别](/zh-CN/model-config#adjust-effort-level):`"low"`、`"medium"`、`"high"`、`"xhigh"` 或 `"max"`。当模型不支持努力时不存在。

561 

562#### API 错误事件

563 

564当对 Claude 的 API 请求失败时记录。

565 

566**事件名称**:`claude_code.api_error`

567 

568**属性**:

569 

570* 所有 [标准属性](#standard-attributes)

571* `event.name`:`"api_error"`

572* `event.timestamp`:ISO 8601 时间戳

573* `event.sequence`:单调递增的计数器,用于在会话内排序事件

574* `model`:使用的模型(例如,"claude-sonnet-4-6")

575* `error`:错误消息

576* `status_code`:HTTP 状态代码(数字形式)。对于非 HTTP 错误(例如连接失败)不存在。

577* `duration_ms`:请求持续时间(毫秒)

578* `attempt`:进行的总尝试次数,包括初始请求(`1` 表示没有发生重试)

579* `request_id`:来自响应的 `request-id` 标头的 Anthropic API 请求 ID,例如 `"req_011..."`。仅当 API 返回时存在。

580* `speed`:`"fast"` 或 `"normal"`,指示是否启用了快速模式

581* `query_source`:发出请求的子系统,例如 `"repl_main_thread"`、`"compact"` 或子代理名称

582* `effort`:应用于请求的 [努力级别](/zh-CN/model-config#adjust-effort-level)。当模型不支持努力时不存在。

583 

584#### API 请求主体事件

585 

586当设置了 `OTEL_LOG_RAW_API_BODIES` 时,为每个 API 请求尝试记录。每次尝试发出一个事件,因此使用调整参数的重试各自产生自己的事件。

587 

588**事件名称**:`claude_code.api_request_body`

589 

590**属性**:

591 

592* 所有 [标准属性](#standard-attributes)

593* `event.name`:`"api_request_body"`

594* `event.timestamp`:ISO 8601 时间戳

595* `event.sequence`:单调递增的计数器,用于在会话内排序事件

596* `body`:JSON 序列化的 Messages API 请求参数(系统提示、消息、工具等),在 60 KB 处截断。先前助手轮次中的扩展思考内容被编辑。仅在内联模式下发出(`OTEL_LOG_RAW_API_BODIES=1`)。

597* `body_ref`:包含未截断主体的 `<dir>/<uuid>.request.json` 文件的绝对路径。仅在文件模式下发出(`OTEL_LOG_RAW_API_BODIES=file:<dir>`)。

598* `body_length`:未截断的主体长度。当 `OTEL_LOG_RAW_API_BODIES=file:<dir>` 时为 UTF-8 字节,或当 `=1` 时为 UTF-16 代码单位

599* `body_truncated`:当发生内联截断时为 `"true"`。在文件模式下和未发生截断时不存在。

600* `model`:来自请求参数的模型标识符

601* `query_source`:发出请求的子系统(例如,`"compact"`)

602 

603#### API 响应主体事件

604 

605当设置了 `OTEL_LOG_RAW_API_BODIES` 时,为每个成功的 API 响应记录。

606 

607**事件名称**:`claude_code.api_response_body`

608 

609**属性**:

610 

611* 所有 [标准属性](#standard-attributes)

612* `event.name`:`"api_response_body"`

613* `event.timestamp`:ISO 8601 时间戳

614* `event.sequence`:单调递增的计数器,用于在会话内排序事件

615* `body`:JSON 序列化的 Messages API 响应(id、内容块、使用情况、停止原因),在 60 KB 处截断。扩展思考内容被编辑。仅在内联模式下发出(`OTEL_LOG_RAW_API_BODIES=1`)。

616* `body_ref`:包含未截断主体的 `<dir>/<request_id>.response.json` 文件的绝对路径。仅在文件模式下发出(`OTEL_LOG_RAW_API_BODIES=file:<dir>`)。

617* `body_length`:未截断的主体长度。当 `OTEL_LOG_RAW_API_BODIES=file:<dir>` 时为 UTF-8 字节,或当 `=1` 时为 UTF-16 代码单位

618* `body_truncated`:当发生内联截断时为 `"true"`。在文件模式下和未发生截断时不存在。

619* `model`:模型标识符

620* `query_source`:发出请求的子系统

621* `request_id`:来自响应的 `request-id` 标头的 Anthropic API 请求 ID,例如 `"req_011..."`。仅当 API 返回时存在。

622 

623#### 工具决策事件

624 

625当做出工具权限决策(接受/拒绝)时记录。

626 

627**事件名称**:`claude_code.tool_decision`

628 

629**属性**:

630 

631* 所有 [标准属性](#standard-attributes)

632* `event.name`:`"tool_decision"`

633* `event.timestamp`:ISO 8601 时间戳

634* `event.sequence`:单调递增的计数器,用于在会话内排序事件

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

636* `tool_use_id`:此工具调用的唯一标识符。与传递给 hooks 的 `tool_use_id` 匹配,允许在 OTel 事件和 hook 捕获的数据之间进行关联。

637* `decision`:`"accept"` 或 `"reject"`

638* `source`:决策来源:

639 * `"config"`:基于项目设置、企业托管策略、`--allowedTools` 或 `--disallowedTools` 标志、活跃权限模式或因为工具本身是安全的,自动决策而不提示。

640 * `"hook"`:`PreToolUse` 或 `PermissionRequest` hook 返回了决策。

641 * `"user_permanent"`:当用户在提示时选择"始终允许"时发出,将规则保存到其个人设置。也为与该保存规则匹配的后续调用发出。视为接受。

642 * `"user_temporary"`:当用户在提示时选择"是"或"是,仅此会话"时发出,不保存规则。也为同一会话中与该会话范围允许匹配的后续调用发出。视为接受。

643 * `"user_abort"`:当用户关闭权限提示而不回答时发出。视为拒绝。

644 * `"user_reject"`:当用户选择"否"时发出,或调用与其个人设置中的拒绝规则匹配。视为拒绝。

645 

646#### 权限模式更改事件

647 

648当权限模式更改时记录,例如从 `Shift+Tab` 循环、退出 Plan Mode 或自动模式门控检查。

649 

650**事件名称**:`claude_code.permission_mode_changed`

651 

652**属性**:

653 

654* 所有 [标准属性](#standard-attributes)

655* `event.name`:`"permission_mode_changed"`

656* `event.timestamp`:ISO 8601 时间戳

657* `event.sequence`:单调递增的计数器,用于在会话内排序事件

658* `from_mode`:前一个权限模式,例如 `"default"`、`"plan"`、`"acceptEdits"`、`"auto"` 或 `"bypassPermissions"`

659* `to_mode`:新权限模式

660* `trigger`:导致更改的原因。`"shift_tab"`、`"exit_plan_mode"`、`"auto_gate_denied"` 或 `"auto_opt_in"` 之一。当转换来自 SDK 或桥接时不存在

661 

662#### 身份验证事件

663 

664当 `/login` 或 `/logout` 完成时记录。

665 

666**事件名称**:`claude_code.auth`

667 

668**属性**:

669 

670* 所有 [标准属性](#standard-attributes)

671* `event.name`:`"auth"`

672* `event.timestamp`:ISO 8601 时间戳

673* `event.sequence`:单调递增的计数器,用于在会话内排序事件

674* `action`:`"login"` 或 `"logout"`

675* `success`:`"true"` 或 `"false"`

676* `auth_method`:身份验证方法,例如 `"oauth"`

677* `error_category`:操作失败时的分类错误类型。永远不包括原始错误消息

678* `status_code`:操作因 HTTP 错误而失败时的 HTTP 状态代码(字符串形式)

679 

680#### MCP 服务器连接事件

681 

682当 MCP 服务器连接、断开连接或连接失败时记录。

683 

684**事件名称**:`claude_code.mcp_server_connection`

685 

686**属性**:

687 

688* 所有 [标准属性](#standard-attributes)

689* `event.name`:`"mcp_server_connection"`

690* `event.timestamp`:ISO 8601 时间戳

691* `event.sequence`:单调递增的计数器,用于在会话内排序事件

692* `status`:`"connected"`、`"failed"` 或 `"disconnected"`

693* `transport_type`:服务器传输,例如 `"stdio"`、`"sse"` 或 `"http"`

694* `server_scope`:服务器配置的范围,例如 `"user"`、`"project"` 或 `"local"`

695* `duration_ms`:连接尝试持续时间(毫秒)

696* `error_code`:连接失败时的错误代码

697* `server_name`(当 `OTEL_LOG_TOOL_DETAILS=1` 时):配置的服务器名称

698* `error`(当 `OTEL_LOG_TOOL_DETAILS=1` 时):连接失败时的完整错误消息

699 

700#### 内部错误事件

701 

702当 Claude Code 捕获意外的内部错误时记录。仅记录错误类名和 errno 风格的代码。永远不包括错误消息和堆栈跟踪。在针对 Bedrock、Vertex 或 Foundry 运行或设置了 `DISABLE_ERROR_REPORTING` 时不会发出此事件。

703 

704**事件名称**:`claude_code.internal_error`

705 

706**属性**:

707 

708* 所有 [标准属性](#standard-attributes)

709* `event.name`:`"internal_error"`

710* `event.timestamp`:ISO 8601 时间戳

711* `event.sequence`:单调递增的计数器,用于在会话内排序事件

712* `error_name`:错误类名,例如 `"TypeError"` 或 `"SyntaxError"`

713* `error_code`:Node.js errno 代码,例如错误上存在时的 `"ENOENT"`

714 

715#### 插件已安装事件

716 

717当插件完成安装时记录,来自 `claude plugin install` CLI 命令和交互式 `/plugin` UI。

718 

719**事件名称**:`claude_code.plugin_installed`

720 

721**属性**:

722 

723* 所有 [标准属性](#standard-attributes)

724* `event.name`:`"plugin_installed"`

725* `event.timestamp`:ISO 8601 时间戳

726* `event.sequence`:单调递增的计数器,用于在会话内排序事件

727* `marketplace.is_official`:如果市场是官方 Anthropic 市场,则为 `"true"`,否则为 `"false"`

728* `install.trigger`:`"cli"` 或 `"ui"`

729* `plugin.name`:已安装插件的名称。对于第三方市场,仅当 `OTEL_LOG_TOOL_DETAILS=1` 时才包含

730* `plugin.version`:在市场条目中声明时的插件版本。对于第三方市场,仅当 `OTEL_LOG_TOOL_DETAILS=1` 时才包含

731* `marketplace.name`:插件安装来源的市场。对于第三方市场,仅当 `OTEL_LOG_TOOL_DETAILS=1` 时才包含

732 

733#### 技能激活事件

734 

735当调用技能时记录,无论 Claude 是通过 Skill 工具调用它还是您将其作为 `/` 命令运行。

736 

737**事件名称**:`claude_code.skill_activated`

738 

739**属性**:

740 

741* 所有 [标准属性](#standard-attributes)

742* `event.name`:`"skill_activated"`

743* `event.timestamp`:ISO 8601 时间戳

744* `event.sequence`:单调递增的计数器,用于在会话内排序事件

745* `skill.name`:技能的名称。对于用户定义和第三方插件技能,除非 `OTEL_LOG_TOOL_DETAILS=1`,否则值为占位符 `"custom_skill"`

746* `invocation_trigger`:技能的触发方式(`"user-slash"`、`"claude-proactive"` 或 `"nested-skill"`)

747* `skill.source`:技能加载的位置(例如,`"bundled"`、`"userSettings"`、`"projectSettings"`、`"plugin"`)

748* `plugin.name`(当 `OTEL_LOG_TOOL_DETAILS=1` 或插件来自官方市场时):当技能由插件提供时的拥有插件的名称

749* `marketplace.name`(当 `OTEL_LOG_TOOL_DETAILS=1` 或插件来自官方市场时):当技能由插件提供时,拥有插件安装来源的市场

750 

751#### @提及事件

752 

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

754 

755**事件名称**:`claude_code.at_mention`

756 

757**属性**:

758 

759* 所有 [标准属性](#standard-attributes)

760* `event.name`:`"at_mention"`

761* `event.timestamp`:ISO 8601 时间戳

762* `event.sequence`:单调递增的计数器,用于在会话内排序事件

763* `mention_type`:提及的类型(`"file"`、`"directory"`、`"agent"`、`"mcp_resource"`)

764* `success`:提及是否成功解析(`"true"` 或 `"false"`)

765 

766#### API 重试耗尽事件

767 

768当 API 请求在多次尝试后失败时记录一次。与最终 `api_error` 事件一起发出。

769 

770**事件名称**:`claude_code.api_retries_exhausted`

771 

772**属性**:

773 

774* 所有 [标准属性](#standard-attributes)

775* `event.name`:`"api_retries_exhausted"`

776* `event.timestamp`:ISO 8601 时间戳

777* `event.sequence`:单调递增的计数器,用于在会话内排序事件

778* `model`:使用的模型

779* `error`:最终错误消息

780* `status_code`:HTTP 状态代码(数字形式)。对于非 HTTP 错误不存在。

781* `total_attempts`:进行的总尝试次数

782* `total_retry_duration_ms`:所有尝试的总实际时钟时间

783* `speed`:`"fast"` 或 `"normal"`

784 

785#### Hook 执行开始事件

786 

787当一个或多个 hooks 开始为 hook 事件执行时记录。

788 

789**事件名称**:`claude_code.hook_execution_start`

790 

791**属性**:

792 

793* 所有 [标准属性](#standard-attributes)

794* `event.name`:`"hook_execution_start"`

795* `event.timestamp`:ISO 8601 时间戳

796* `event.sequence`:单调递增的计数器,用于在会话内排序事件

797* `hook_event`:Hook 事件类型,例如 `"PreToolUse"` 或 `"PostToolUse"`

798* `hook_name`:完整 hook 名称,包括匹配器,例如 `"PreToolUse:Write"`

799* `num_hooks`:匹配 hook 命令的数量

800* `managed_only`:当仅允许托管策略 hooks 时为 `"true"`

801* `hook_source`:`"policySettings"` 或 `"merged"`

802* `hook_definitions`:JSON 序列化的 hook 配置。仅当启用了详细的测试版跟踪和 `OTEL_LOG_TOOL_DETAILS=1` 时才包含

803 

804#### Hook 执行完成事件

805 

806当 hook 事件的所有 hooks 完成时记录。

807 

808**事件名称**:`claude_code.hook_execution_complete`

809 

810**属性**:

811 

812* 所有 [标准属性](#standard-attributes)

813* `event.name`:`"hook_execution_complete"`

814* `event.timestamp`:ISO 8601 时间戳

815* `event.sequence`:单调递增的计数器,用于在会话内排序事件

816* `hook_event`:Hook 事件类型

817* `hook_name`:完整 hook 名称,包括匹配器

818* `num_hooks`:匹配 hook 命令的数量

819* `num_success`:成功完成的计数

820* `num_blocking`:返回阻止决策的计数

821* `num_non_blocking_error`:失败但未阻止的计数

822* `num_cancelled`:在完成前取消的计数

823* `total_duration_ms`:所有匹配 hooks 的实际时钟持续时间

824* `managed_only`:当仅允许托管策略 hooks 时为 `"true"`

825* `hook_source`:`"policySettings"` 或 `"merged"`

826* `hook_definitions`:JSON 序列化的 hook 配置。仅当启用了详细的测试版跟踪和 `OTEL_LOG_TOOL_DETAILS=1` 时才包含

827 

828#### 压缩事件

829 

830当对话压缩完成时记录。

831 

832**事件名称**:`claude_code.compaction`

833 

834**属性**:

835 

836* 所有 [标准属性](#standard-attributes)

837* `event.name`:`"compaction"`

838* `event.timestamp`:ISO 8601 时间戳

839* `event.sequence`:单调递增的计数器,用于在会话内排序事件

840* `trigger`:`"auto"` 或 `"manual"`

841* `success`:`"true"` 或 `"false"`

842* `duration_ms`:压缩持续时间

843* `pre_tokens`:压缩前的近似令牌计数

844* `post_tokens`:压缩后的近似令牌计数

845* `error`:压缩失败时的错误消息

846 

847## 解释指标和事件数据

848 

849导出的指标和事件支持一系列分析:

850 

851### 使用情况监控

852 

853| 指标 | 分析机会 |

854| ------------------------------------------------------------- | -------------------------- |

855| `claude_code.token.usage` | 按 `type`(输入/输出)、用户、团队或模型分解 |

856| `claude_code.session.count` | 跟踪随时间推移的采用和参与度 |

857| `claude_code.lines_of_code.count` | 通过跟踪代码添加/删除来衡量生产力 |

858| `claude_code.commit.count` & `claude_code.pull_request.count` | 了解对开发工作流的影响 |

859 

860### 成本监控

861 

862`claude_code.cost.usage` 指标有助于:

863 

864* 跟踪团队或个人的使用趋势

865* 识别高使用会话以进行优化

866 

867<Note>

868 成本指标是近似值。有关官方计费数据,请参阅您的 API 提供商(Claude 控制台、Amazon Bedrock 或 Google Cloud Vertex)。

869</Note>

870 

871### 警报和分段

872 

873要考虑的常见警报:

874 

875* 成本激增

876* 异常的令牌消耗

877* 来自特定用户的高会话量

878 

879所有指标都可以按 `user.account_uuid`、`user.account_id`、`organization.id`、`session.id`、`model` 和 `app.version` 进行分段。

880 

881### 检测重试耗尽

882 

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

884 

885事件上的 `attempt` 属性记录进行的总尝试次数。大于 `CLAUDE_CODE_MAX_RETRIES`(默认 `10`)的值表示请求在瞬时错误上耗尽了所有重试。较低的值表示不可重试的错误,例如 `400` 响应。

886 

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

888 

889### 事件分析

890 

891事件数据提供了对 Claude Code 交互的详细见解:

892 

893**工具使用模式**:分析工具结果事件以识别:

894 

895* 最常用的工具

896* 工具成功率

897* 平均工具执行时间

898* 按工具类型的错误模式

899 

900**性能监控**:跟踪 API 请求持续时间和工具执行时间以识别性能瓶颈。

901 

902## 后端考虑事项

903 

904您选择的指标、日志和跟踪后端决定了您可以执行的分析类型:

905 

906### 对于指标

907 

908* **时间序列数据库(例如,Prometheus)**:速率计算、聚合指标

909* **列式存储(例如,ClickHouse)**:复杂查询、唯一用户分析

910* **全功能可观测性平台(例如,Honeycomb、Datadog)**:高级查询、可视化、警报

911 

912### 对于事件/日志

913 

914* **日志聚合系统(例如,Elasticsearch、Loki)**:全文搜索、日志分析

915* **列式存储(例如,ClickHouse)**:结构化事件分析

916* **全功能可观测性平台(例如,Honeycomb、Datadog)**:指标和事件之间的关联

917 

918### 对于跟踪

919 

920选择支持分布式跟踪存储和 span 关联的后端:

921 

922* **分布式跟踪系统(例如,Jaeger、Zipkin、Grafana Tempo)**:Span 可视化、请求瀑布、延迟分析

923* **全功能可观测性平台(例如,Honeycomb、Datadog)**:跟踪搜索和与指标和日志的关联

924 

925对于需要日活跃用户/周活跃用户/月活跃用户 (DAU/WAU/MAU) 指标的组织,请考虑支持高效唯一值查询的后端。

926 

927## 服务信息

928 

929所有指标和事件都使用以下资源属性导出:

930 

931* `service.name`:`claude-code`

932* `service.version`:当前 Claude Code 版本

933* `os.type`:操作系统类型(例如,`linux`、`darwin`、`windows`)

934* `os.version`:操作系统版本字符串

935* `host.arch`:主机架构(例如,`amd64`、`arm64`)

936* `wsl.version`:WSL 版本号(仅在 Windows Subsystem for Linux 上运行时出现)

937* 仪表名称:`com.anthropic.claude_code`

938 

939## ROI 测量资源

940 

941有关测量 Claude Code 投资回报率的综合指南,包括遥测设置、成本分析、生产力指标和自动化报告,请参阅 [Claude Code ROI 测量指南](https://github.com/anthropics/claude-code-monitoring-guide)。此存储库提供了现成的 Docker Compose 配置、Prometheus 和 OpenTelemetry 设置,以及用于生成与 Linear 等工具集成的生产力报告的模板。

942 

943## 安全和隐私

944 

945* OpenTelemetry 导出到您的后端是可选的,需要显式配置。有关 Anthropic 的单独操作遥测以及如何禁用它,请参阅[数据使用](/zh-CN/data-usage#telemetry-services)

946* 原始文件内容和代码片段不包含在指标或事件中。Trace spans 是一个单独的数据路径:请参阅下面的 `OTEL_LOG_TOOL_CONTENT` 项目符号

947* 通过 OAuth 认证时,`user.email` 包含在遥测属性中。如果这对您的组织是一个问题,请与您的遥测后端合作以过滤或编辑此字段

948* 默认情况下不收集用户提示内容。仅记录提示长度。要包含提示内容,请设置 `OTEL_LOG_USER_PROMPTS=1`

949* 默认情况下不记录工具输入参数和参数。要包含它们,请设置 `OTEL_LOG_TOOL_DETAILS=1`。启用后,`tool_result` 事件包含 `tool_parameters` 属性,其中包含 Bash 命令、MCP 服务器和工具名称、技能名称,以及包含文件路径、URL、搜索模式和其他参数的 `tool_input` 属性。`user_prompt` 事件包含自定义、插件和 MCP 命令的逐字 `command_name`。Trace spans 包含相同的 `tool_input` 属性和输入派生属性,例如 `file_path`。超过 512 个字符的单个值被截断,总数限制为约 4 K 字符,但参数仍可能包含敏感值。根据需要配置您的遥测后端以过滤或编辑这些属性

950* 默认情况下,trace spans 中不记录工具输入和输出内容。要包含它,请设置 `OTEL_LOG_TOOL_CONTENT=1`。启用后,span 事件包含完整的工具输入和输出内容,在每个 span 处截断为 60 KB。这可能包括 Read 工具结果中的原始文件内容和 Bash 命令输出。根据需要配置您的遥测后端以过滤或编辑这些属性

951* 默认情况下不记录原始 Anthropic Messages API 请求和响应主体。要包含它们,请设置 `OTEL_LOG_RAW_API_BODIES`。使用 `=1` 时,每个 API 调用发出 `api_request_body` 和 `api_response_body` 日志事件,其 `body` 属性是 JSON 序列化的有效负载,在 60 KB 处截断。使用 `=file:<dir>` 时,未截断的主体写入该目录下的 `.request.json` 和 `.response.json` 文件,事件携带 `body_ref` 路径而不是内联主体。使用日志收集器或 sidecar 而不是通过遥测流传输目录。在两种模式下,主体包含完整的对话历史(系统提示、每个先前的用户和助手轮次、工具结果),因此启用此选项意味着同意其他 `OTEL_LOG_*` 内容标志会揭示的所有内容。Claude 的扩展思考内容始终从这些主体中编辑,无论其他设置如何

952 

953## 在 Amazon Bedrock 上监控 Claude Code

954 

955有关 Amazon Bedrock 的 Claude Code 使用情况监控指南的详细信息,请参阅 [Claude Code 监控实现 (Bedrock)](https://github.com/aws-solutions-library-samples/guidance-for-claude-code-with-amazon-bedrock/blob/main/assets/docs/MONITORING.md)。

network-config.md +132 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 企业网络配置

6 

7> 为企业环境配置 Claude Code,支持代理服务器、自定义证书颁发机构 (CA) 和相互传输层安全 (mTLS) 身份验证。

8 

9Claude Code 通过环境变量支持各种企业网络和安全配置。这包括通过公司代理服务器路由流量、信任自定义证书颁发机构 (CA),以及使用相互传输层安全 (mTLS) 证书进行身份验证以增强安全性。

10 

11<Note>

12 本页面显示的所有环境变量也可以在 [`settings.json`](/zh-CN/settings) 中配置。

13</Note>

14 

15## 代理配置

16 

17### 环境变量

18 

19Claude Code 遵守标准代理环境变量:

20 

21```bash theme={null}

22# HTTPS 代理(推荐)

23export HTTPS_PROXY=https://proxy.example.com:8080

24 

25# HTTP 代理(如果 HTTPS 不可用)

26export HTTP_PROXY=http://proxy.example.com:8080

27 

28# 绕过特定请求的代理 - 空格分隔格式

29export NO_PROXY="localhost 192.168.1.1 example.com .example.com"

30# 绕过特定请求的代理 - 逗号分隔格式

31export NO_PROXY="localhost,192.168.1.1,example.com,.example.com"

32# 绕过所有请求的代理

33export NO_PROXY="*"

34```

35 

36<Note>

37 Claude Code 不支持 SOCKS 代理。

38</Note>

39 

40### 基本身份验证

41 

42如果您的代理需要基本身份验证,请在代理 URL 中包含凭证:

43 

44```bash theme={null}

45export HTTPS_PROXY=http://username:password@proxy.example.com:8080

46```

47 

48<Warning>

49 避免在脚本中硬编码密码。改用环境变量或安全凭证存储。

50</Warning>

51 

52<Tip>

53 对于需要高级身份验证(NTLM、Kerberos 等)的代理,请考虑使用支持您的身份验证方法的 LLM 网关服务。

54</Tip>

55 

56## CA 证书存储

57 

58默认情况下,Claude Code 信任其捆绑的 Mozilla CA 证书和您的操作系统的证书存储。企业 TLS 检查代理(如 CrowdStrike Falcon 和 Zscaler)在其根证书安装在操作系统信任存储中时无需额外配置即可工作。

59 

60<Note>

61 系统 CA 存储集成需要本机 Claude Code 二进制分发。在 Node.js 运行时上运行时,系统 CA 存储不会自动合并。在这种情况下,设置 `NODE_EXTRA_CA_CERTS=/path/to/ca-cert.pem` 以信任企业根 CA。

62</Note>

63 

64`CLAUDE_CODE_CERT_STORE` 接受逗号分隔的源列表。识别的值为 `bundled`(Claude Code 附带的 Mozilla CA 集)和 `system`(操作系统信任存储)。默认值为 `bundled,system`。

65 

66仅信任捆绑的 Mozilla CA 集:

67 

68```bash theme={null}

69export CLAUDE_CODE_CERT_STORE=bundled

70```

71 

72仅信任操作系统证书存储:

73 

74```bash theme={null}

75export CLAUDE_CODE_CERT_STORE=system

76```

77 

78<Note>

79 `CLAUDE_CODE_CERT_STORE` 没有专用的 `settings.json` 架构密钥。通过 `~/.claude/settings.json` 中的 `env` 块或直接在进程环境中设置它。

80</Note>

81 

82## 自定义 CA 证书

83 

84如果您的企业环境使用自定义 CA,请配置 Claude Code 以直接信任它:

85 

86```bash theme={null}

87export NODE_EXTRA_CA_CERTS=/path/to/ca-cert.pem

88```

89 

90## mTLS 身份验证

91 

92对于需要客户端证书身份验证的企业环境:

93 

94```bash theme={null}

95# 用于身份验证的客户端证书

96export CLAUDE_CODE_CLIENT_CERT=/path/to/client-cert.pem

97 

98# 客户端私钥

99export CLAUDE_CODE_CLIENT_KEY=/path/to/client-key.pem

100 

101# 可选:加密私钥的密码短语

102export CLAUDE_CODE_CLIENT_KEY_PASSPHRASE="your-passphrase"

103```

104 

105## 网络访问要求

106 

107Claude Code 需要访问以下 URL。在您的代理配置和防火墙规则中将这些 URL 列入白名单,特别是在容器化或受限网络环境中。

108 

109| URL | 用途 |

110| ------------------------------ | -------------------------------------------------------- |

111| `api.anthropic.com` | Claude API 请求 |

112| `claude.ai` | claude.ai 账户身份验证 |

113| `platform.claude.com` | Anthropic 控制台账户身份验证 |

114| `downloads.claude.ai` | 插件可执行文件下载;原生安装程序和原生自动更新程序 |

115| `storage.googleapis.com` | {/* max-version: 2.1.115 */}2.1.116 版本之前的原生安装程序和原生自动更新程序 |

116| `bridge.claudeusercontent.com` | [Chrome 中的 Claude](/zh-CN/chrome) 扩展 WebSocket 桥接 |

117 

118如果您通过 npm 安装 Claude Code 或管理自己的二进制分发,最终用户可能不需要访问 `downloads.claude.ai` 或 `storage.googleapis.com`。

119 

120Claude Code 默认还会发送可选的操作遥测数据,您可以使用环境变量禁用它。请参阅 [遥测服务](/zh-CN/data-usage#telemetry-services) 了解如何在最终确定您的白名单之前禁用它。

121 

122使用 [Amazon Bedrock](/zh-CN/amazon-bedrock)、[Google Vertex AI](/zh-CN/google-vertex-ai) 或 [Microsoft Foundry](/zh-CN/microsoft-foundry) 时,模型流量和身份验证会转到您的提供商,而不是 `api.anthropic.com`、`claude.ai` 或 `platform.claude.com`。WebFetch 工具仍会调用 `api.anthropic.com` 进行其 [域名安全检查](/zh-CN/data-usage#webfetch-domain-safety-check),除非您在 [settings](/zh-CN/settings) 中设置 `skipWebFetchPreflight: true`。

123 

124[Claude Code on the web](/zh-CN/claude-code-on-the-web) 和 [Code Review](/zh-CN/code-review) 从 Anthropic 管理的基础设施连接到您的存储库。如果您的 GitHub Enterprise Cloud 组织按 IP 地址限制访问,请启用 [已安装 GitHub Apps 的 IP 允许列表继承](https://docs.github.com/en/enterprise-cloud@latest/organizations/keeping-your-organization-secure/managing-security-settings-for-your-organization/managing-allowed-ip-addresses-for-your-organization#allowing-access-by-github-apps)。Claude GitHub App 注册了其 IP 范围,因此启用此设置允许访问而无需手动配置。要 [手动将范围添加到您的允许列表](https://docs.github.com/en/enterprise-cloud@latest/organizations/keeping-your-organization-secure/managing-security-settings-for-your-organization/managing-allowed-ip-addresses-for-your-organization#adding-an-allowed-ip-address),或配置其他防火墙,请参阅 [Anthropic API IP 地址](https://platform.claude.com/docs/en/api/ip-addresses)。

125 

126对于防火墙后的自托管 [GitHub Enterprise Server](/zh-CN/github-enterprise-server) 实例,请将相同的 [Anthropic API IP 地址](https://platform.claude.com/docs/en/api/ip-addresses) 列入白名单,以便 Anthropic 基础设施可以访问您的 GHES 主机来克隆存储库和发布审查评论。

127 

128## 其他资源

129 

130* [Claude Code 设置](/zh-CN/settings)

131* [环境变量参考](/zh-CN/env-vars)

132* [故障排除指南](/zh-CN/troubleshooting)

output-styles.md +90 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 输出样式

6 

7> 将 Claude Code 适配用于软件工程之外的用途

8 

9输出样式允许你将 Claude Code 用作任何类型的代理,同时保留其核心功能,例如运行本地脚本、读取/写入文件和跟踪 TODO。

10 

11## 内置输出样式

12 

13Claude Code 的**默认**输出样式是现有的系统提示,旨在帮助你高效地完成软件工程任务。

14 

15还有两种额外的内置输出样式,专注于教你了解代码库和 Claude 的运作方式:

16 

17* **Explanatory**:在帮助你完成软件工程任务的同时提供教育性的"Insights"。帮助你理解实现选择和代码库模式。

18 

19* **Learning**:协作式的边学边做模式,Claude 不仅会在编码时分享"Insights",还会要求你自己贡献小的、战略性的代码片段。Claude Code 将在你的代码中添加 `TODO(human)` 标记供你实现。

20 

21## 输出样式如何工作

22 

23输出样式直接修改 Claude Code 的系统提示。

24 

25* 自定义输出样式排除了编码说明(例如用测试验证代码),除非 `keep-coding-instructions` 为 true。

26* 所有输出样式都在系统提示的末尾添加了自己的自定义说明。

27* 所有输出样式都会在对话期间触发提醒,让 Claude 遵守输出样式说明。

28 

29令牌使用情况取决于样式。向系统提示添加说明会增加输入令牌,尽管 prompt caching 在会话中的第一个请求之后会降低这个成本。内置的 Explanatory 和 Learning 样式在设计上比 Default 产生更长的响应,这会增加输出令牌。对于自定义样式,输出令牌使用情况取决于你的说明告诉 Claude 生成什么。

30 

31## 更改你的输出样式

32 

33运行 `/config` 并选择**输出样式**从菜单中选择一种样式。你的选择会保存到[本地项目级别](/zh-CN/settings)的 `.claude/settings.local.json`。

34 

35要在不使用菜单的情况下设置样式,直接编辑设置文件中的 `outputStyle` 字段:

36 

37```json theme={null}

38{

39 "outputStyle": "Explanatory"

40}

41```

42 

43由于输出样式是在会话开始时在系统提示中设置的,更改将在你下次启动新会话时生效。这使系统提示在整个对话中保持稳定,以便 prompt caching 可以降低延迟和成本。

44 

45## 创建自定义输出样式

46 

47自定义输出样式是包含 frontmatter 和将添加到系统提示的文本的 Markdown 文件:

48 

49```markdown theme={null}

50---

51name: My Custom Style

52description:

53 A brief description of what this style does, to be displayed to the user

54---

55 

56# Custom Style Instructions

57 

58You are an interactive CLI tool that helps users with software engineering

59tasks. [Your custom instructions here...]

60 

61## Specific Behaviors

62 

63[Define how the assistant should behave in this style...]

64```

65 

66你可以在用户级别(`~/.claude/output-styles`)或项目级别(`.claude/output-styles`)保存这些文件。

67 

68### Frontmatter

69 

70输出样式文件支持 frontmatter 来指定元数据:

71 

72| Frontmatter | 目的 | 默认值 |

73| :------------------------- | :------------------------------ | :----- |

74| `name` | 输出样式的名称,如果不是文件名 | 从文件名继承 |

75| `description` | 输出样式的描述,在 `/config` 选择器中显示 | 无 |

76| `keep-coding-instructions` | 是否保留 Claude Code 系统提示中与编码相关的部分。 | false |

77 

78## 与相关功能的比较

79 

80### 输出样式 vs. CLAUDE.md vs. --append-system-prompt

81 

82输出样式完全"关闭"了 Claude Code 默认系统提示中特定于软件工程的部分。CLAUDE.md 和 `--append-system-prompt` 都不会编辑 Claude Code 的默认系统提示。CLAUDE.md 将内容作为用户消息添加到 Claude Code 默认系统提示\_之后\_。`--append-system-prompt` 将内容附加到系统提示。

83 

84### 输出样式 vs. [Agents](/zh-CN/sub-agents)

85 

86输出样式直接影响主代理循环,仅影响系统提示。Agents 被调用来处理特定任务,可以包括额外的设置,如要使用的模型、可用的工具以及有关何时使用代理的一些上下文。

87 

88### 输出样式 vs. [Skills](/zh-CN/skills)

89 

90输出样式修改 Claude 的响应方式(格式、语气、结构),一旦选择就始终处于活动状态。Skills 是特定于任务的提示,你可以使用 `/skill-name` 调用或 Claude 在相关时自动加载。使用输出样式来实现一致的格式化偏好;使用 skills 来实现可重用的工作流和任务。

overview.md +875 −0 created

Details

1> ## Documentation Index

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

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

4 

5# Claude Code 概述

6 

7> Claude Code 是一个代理编码工具,可以读取你的代码库、编辑文件、运行命令,并与你的开发工具集成。可在终端、IDE、桌面应用和浏览器中使用。

8 

9export const InstallConfigurator = ({defaultSurface = 'terminal'}) => {

10 const TERM = {

11 mac: {

12 label: 'macOS / Linux',

13 cmd: 'curl -fsSL https://claude.ai/install.sh | bash'

14 },

15 win: {

16 label: 'Windows'

17 },

18 brew: {

19 label: 'Homebrew',

20 cmd: 'brew install --cask claude-code'

21 },

22 winget: {

23 label: 'WinGet',

24 cmd: 'winget install Anthropic.ClaudeCode'

25 }

26 };

27 const WIN_VARIANTS = {

28 ps: 'irm https://claude.ai/install.ps1 | iex',

29 cmd: 'curl -fsSL https://claude.ai/install.cmd -o install.cmd && install.cmd && del install.cmd'

30 };

31 const TABS = [{

32 key: 'terminal',

33 label: 'Terminal'

34 }, {

35 key: 'desktop',

36 label: 'Desktop'

37 }, {

38 key: 'vscode',

39 label: 'VS Code'

40 }, {

41 key: 'jetbrains',

42 label: 'JetBrains'

43 }];

44 const ALT_TARGETS = {

45 desktop: {

46 name: 'Desktop',

47 tagline: 'The full agent in a native app for macOS and Windows.',

48 installLabel: 'Download the app',

49 installHref: 'https://claude.com/download?utm_source=claude_code&utm_medium=docs&utm_content=configurator_desktop_download',

50 guideHref: '/en/desktop-quickstart'

51 },

52 vscode: {

53 name: 'VS Code',

54 tagline: 'Review diffs, manage context, and chat without leaving your editor.',

55 installLabel: 'Install from Marketplace',

56 installHref: 'https://marketplace.visualstudio.com/items?itemName=anthropic.claude-code',

57 altCmd: 'code --install-extension anthropic.claude-code',

58 guideHref: '/en/vs-code'

59 },

60 jetbrains: {

61 name: 'JetBrains',

62 tagline: 'Native plugin for IntelliJ, PyCharm, WebStorm, and other JetBrains IDEs.',

63 installLabel: 'Install from Marketplace',

64 installHref: 'https://plugins.jetbrains.com/plugin/27310-claude-code-beta-',

65 guideHref: '/en/jetbrains'

66 }

67 };

68 const PROVIDERS = [{

69 key: 'anthropic',

70 label: 'Anthropic'

71 }, {

72 key: 'bedrock',

73 label: 'Amazon Bedrock'

74 }, {

75 key: 'foundry',

76 label: 'Microsoft Foundry'

77 }, {

78 key: 'vertex',

79 label: 'Google Vertex AI'

80 }];

81 const PROVIDER_NOTICE = {

82 bedrock: <>

83 <strong>Configure your AWS account first.</strong> Running on Bedrock

84 requires model access enabled in the AWS console and IAM credentials.{' '}

85 <a href="/en/amazon-bedrock">Bedrock setup guide →</a>

86 </>,

87 vertex: <>

88 <strong>Configure your GCP project first.</strong> Running on Vertex AI

89 requires the Vertex API enabled and a service account with the right

90 permissions.{' '}

91 <a href="/en/google-vertex-ai">Vertex setup guide →</a>

92 </>,

93 foundry: <>

94 <strong>Configure your Azure resources first.</strong> Running on

95 Microsoft Foundry requires an Azure subscription with a Foundry resource

96 and model deployments provisioned.{' '}

97 <a href="/en/microsoft-foundry">Foundry setup guide →</a>

98 </>

99 };

100 const iconCheck = (size = 14) => <svg width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="3" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true">

101 <polyline points="20 6 9 17 4 12" />

102 </svg>;

103 const iconCopy = (size = 14) => <svg width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true">

104 <rect x="9" y="9" width="13" height="13" rx="2" />

105 <path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1" />

106 </svg>;

107 const iconArrowRight = (size = 13) => <svg width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.5" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true">

108 <line x1="5" y1="12" x2="19" y2="12" />

109 <polyline points="12 5 19 12 12 19" />

110 </svg>;

111 const iconArrowUpRight = (size = 14) => <svg width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.5" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true">

112 <line x1="7" y1="17" x2="17" y2="7" />

113 <polyline points="7 7 17 7 17 17" />

114 </svg>;

115 const iconInfo = (size = 16) => <svg width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true">

116 <circle cx="12" cy="12" r="10" />

117 <line x1="12" y1="16" x2="12" y2="12" />

118 <line x1="12" y1="8" x2="12.01" y2="8" />

119 </svg>;

120 const [target, setTarget] = useState(defaultSurface);

121 const [team, setTeam] = useState(false);

122 const [provider, setProvider] = useState('anthropic');

123 const [pkg, setPkg] = useState(() => (/Win/).test(navigator.userAgent) ? 'win' : 'mac');

124 const [winCmd, setWinCmd] = useState(false);

125 const [copied, setCopied] = useState(null);

126 const copyTimer = useRef(null);

127 const handleCopy = async (text, key) => {

128 try {

129 await navigator.clipboard.writeText(text);

130 } catch {

131 const ta = document.createElement('textarea');

132 ta.value = text;

133 document.body.appendChild(ta);

134 ta.select();

135 document.execCommand('copy');

136 document.body.removeChild(ta);

137 }

138 clearTimeout(copyTimer.current);

139 setCopied(key);

140 copyTimer.current = setTimeout(() => setCopied(null), 1800);

141 };

142 const cardBodyCmd = (cmd, prompt) => {

143 const on = copied === 'term';

144 return <div className="cc-ic-card-body">

145 <span className="cc-ic-prompt">{prompt || '$'}</span>

146 <div className="cc-ic-cmd">{cmd}</div>

147 <button type="button" className={'cc-ic-copy' + (on ? ' cc-ic-copied' : '')} onClick={() => handleCopy(cmd, 'term')}>

148 {on ? iconCheck(13) : iconCopy(13)}

149 <span>{on ? 'Copied' : 'Copy'}</span>

150 </button>

151 </div>;

152 };

153 const isWinInstaller = pkg === 'win';

154 const isWinPrompt = pkg === 'win' || pkg === 'winget';

155 const terminalCmd = isWinInstaller ? WIN_VARIANTS[winCmd ? 'cmd' : 'ps'] : TERM[pkg].cmd;

156 const alt = ALT_TARGETS[target];

157 const showNotice = team && provider !== 'anthropic';

158 const STYLES = `

159.cc-ic {

160 --ic-slate: #141413;

161 --ic-clay: #d97757;

162 --ic-clay-deep: #c6613f;

163 --ic-gray-000: #ffffff;

164 --ic-gray-150: #f0eee6;

165 --ic-gray-550: #73726c;

166 --ic-gray-700: #3d3d3a;

167 --ic-border-subtle: rgba(31, 30, 29, 0.08);

168 --ic-border-default: rgba(31, 30, 29, 0.15);

169 --ic-border-strong: rgba(31, 30, 29, 0.3);

170 --ic-font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, 'Courier New', monospace;

171 font-family: 'Anthropic Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;

172 font-size: 14px; line-height: 1.5; color: var(--ic-slate);

173 margin: 8px 0 32px;

174}

175.dark .cc-ic {

176 --ic-slate: #f0eee6;

177 --ic-gray-000: #262624;

178 --ic-gray-150: #1f1e1d;

179 --ic-gray-550: #91908a;

180 --ic-gray-700: #bfbdb4;

181 --ic-border-subtle: rgba(240, 238, 230, 0.08);

182 --ic-border-default: rgba(240, 238, 230, 0.14);

183 --ic-border-strong: rgba(240, 238, 230, 0.28);

184}

185.dark .cc-ic-check { background: transparent; }

186.dark .cc-ic-card { border: 0.5px solid var(--ic-border-subtle); }

187.dark .cc-ic-p-pill.cc-ic-active { box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3); }

188.cc-ic *, .cc-ic *::before, .cc-ic *::after { box-sizing: border-box; }

189.cc-ic a { text-decoration: none; }

190.cc-ic a:not([class]) { color: inherit; }

191.cc-ic button { font-family: inherit; cursor: pointer; }

192 

193.cc-ic-tab-strip {

194 display: inline-flex; gap: 2px;

195 padding: 4px; background: var(--ic-gray-150);

196 border-radius: 10px; overflow-x: auto;

197 max-width: 100%;

198}

199.cc-ic-tab {

200 appearance: none; background: none; border: none;

201 padding: 10px 18px; font-size: 15px; font-weight: 430;

202 color: var(--ic-gray-550); border-radius: 7px;

203 white-space: nowrap;

204 transition: color 0.12s, background-color 0.12s;

205}

206.cc-ic-tab:hover { color: var(--ic-gray-700); }

207.cc-ic-tab.cc-ic-active {

208 color: var(--ic-slate); font-weight: 500;

209 background: var(--ic-gray-000);

210 box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);

211}

212.dark .cc-ic-tab.cc-ic-active { box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4); }

213 

214.cc-ic-team-wrap { padding: 16px 0 20px; }

215.cc-ic-team-toggle {

216 display: flex; align-items: center; gap: 12px; font-family: inherit;

217 padding: 12px 16px; font-size: 14px; font-weight: 430;

218 color: var(--ic-gray-700); cursor: pointer; user-select: none;

219 width: fit-content; background: var(--ic-gray-150);

220 border: 0.5px solid var(--ic-border-subtle); border-radius: 8px;

221 transition: border-color 0.15s;

222}

223.cc-ic-team-toggle:hover { border-color: var(--ic-border-default); }

224.cc-ic-team-toggle.cc-ic-checked {

225 background: rgba(217, 119, 87, 0.08);

226 border-color: rgba(217, 119, 87, 0.25);

227}

228.cc-ic-check {

229 width: 16px; height: 16px;

230 border: 1px solid var(--ic-border-strong); border-radius: 4px;

231 background: var(--ic-gray-000);

232 display: flex; align-items: center; justify-content: center;

233 flex-shrink: 0;

234}

235.cc-ic-check svg { color: #fff; display: none; }

236.cc-ic-team-toggle.cc-ic-checked .cc-ic-check { background: var(--ic-clay-deep); border-color: var(--ic-clay-deep); }

237.cc-ic-team-toggle.cc-ic-checked .cc-ic-check svg { display: block; }

238 

239.cc-ic-team-reveal { display: flex; flex-direction: column; gap: 12px; margin-bottom: 16px; }

240.cc-ic-sales {

241 display: flex; align-items: center; justify-content: space-between;

242 gap: 16px; padding: 14px 16px;

243 background: var(--ic-gray-000); border: 0.5px solid var(--ic-border-default);

244 border-radius: 8px; flex-wrap: wrap;

245}

246.cc-ic-sales-text { font-size: 13px; color: var(--ic-gray-700); line-height: 1.5; flex: 1; min-width: 200px; }

247.cc-ic-sales-text strong { font-weight: 550; color: var(--ic-slate); }

248.cc-ic-sales-actions { display: flex; align-items: center; gap: 8px; flex-shrink: 0; }

249.cc-ic-btn-clay {

250 display: inline-flex; align-items: center; gap: 8px;

251 background: var(--ic-clay-deep); color: #fff; border: none;

252 border-radius: 8px; padding: 8px 14px;

253 font-size: 13px; font-weight: 500;

254 transition: background-color 0.15s; white-space: nowrap;

255}

256.cc-ic-btn-clay:hover { background: var(--ic-clay); }

257.cc-ic-btn-ghost {

258 display: inline-flex; align-items: center; gap: 8px;

259 background: transparent; color: var(--ic-gray-700);

260 border: 0.5px solid var(--ic-border-default);

261 border-radius: 8px; padding: 8px 14px;

262 font-size: 13px; font-weight: 500;

263}

264.cc-ic-btn-ghost:hover { background: rgba(0, 0, 0, 0.04); }

265 

266.cc-ic-provider-bar {

267 display: flex; align-items: center; gap: 12px;

268 padding: 14px 16px; background: var(--ic-gray-150);

269 border-radius: 8px; font-size: 13px; flex-wrap: wrap;

270}

271.cc-ic-provider-bar .cc-ic-label { color: var(--ic-gray-550); flex-shrink: 0; }

272.cc-ic-provider-pills { display: flex; gap: 4px; flex-wrap: wrap; }

273.cc-ic-p-pill {

274 appearance: none; border: none; background: transparent;

275 padding: 6px 12px; border-radius: 6px;

276 font-size: 13px; font-weight: 430; color: var(--ic-gray-700);

277 white-space: nowrap;

278}

279.cc-ic-p-pill:hover { background: rgba(0, 0, 0, 0.04); }

280.cc-ic-p-pill.cc-ic-active {

281 background: var(--ic-gray-000); color: var(--ic-slate);

282 font-weight: 500; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);

283}

284.cc-ic-provider-notice {

285 display: flex; padding: 16px 18px;

286 background: var(--ic-gray-000); border: 0.5px solid var(--ic-border-default);

287 border-radius: 8px; gap: 14px; align-items: flex-start;

288}

289.cc-ic-provider-notice > svg { color: var(--ic-gray-550); margin-top: 2px; flex-shrink: 0; }

290.cc-ic-provider-notice-body { font-size: 14px; line-height: 1.55; color: var(--ic-gray-700); }

291.cc-ic-provider-notice-body strong { font-weight: 550; color: var(--ic-slate); }

292.cc-ic-provider-notice-body a { color: var(--ic-clay-deep); font-weight: 500; }

293.cc-ic-provider-notice-body a:hover { text-decoration: underline; }

294 

295.cc-ic-card { background: #141413; border-radius: 12px; overflow: hidden; }

296.cc-ic-subtabs {

297 display: flex; align-items: center;

298 background: #1a1918;

299 border-bottom: 0.5px solid rgba(255, 255, 255, 0.08);

300 padding: 0 8px; overflow-x: auto;

301}

302.cc-ic-subtab {

303 appearance: none; background: none; border: none;

304 padding: 12px 16px; font-size: 12px;

305 color: rgba(255, 255, 255, 0.5);

306 position: relative; white-space: nowrap;

307}

308.cc-ic-subtab:hover { color: rgba(255, 255, 255, 0.75); }

309.cc-ic-subtab.cc-ic-active { color: #fff; }

310.cc-ic-subtab.cc-ic-active::after {

311 content: ''; position: absolute;

312 left: 12px; right: 12px; bottom: -0.5px;

313 height: 2px; background: var(--ic-clay);

314}

315.cc-ic-shell-switch {

316 display: inline-flex; gap: 2px;

317 margin: 14px 26px 0; padding: 3px;

318 background: rgba(255, 255, 255, 0.06);

319 border: 0.5px solid rgba(255, 255, 255, 0.08);

320 border-radius: 8px;

321 font-family: inherit;

322}

323.cc-ic-shell-option {

324 font: inherit; font-size: 12px; font-weight: 500;

325 padding: 5px 12px; border-radius: 6px;

326 background: transparent; border: none;

327 color: rgba(255, 255, 255, 0.55);

328 cursor: pointer; user-select: none; white-space: nowrap;

329 transition: color 120ms ease, background-color 120ms ease;

330}

331.cc-ic-shell-option:hover { color: rgba(255, 255, 255, 0.85); }

332.cc-ic-shell-option.cc-ic-active {

333 background: rgba(255, 255, 255, 0.12);

334 color: #fff;

335 box-shadow: 0 1px 2px rgba(0, 0, 0, 0.25);

336}

337 

338.cc-ic-card-body { padding: 24px 26px; display: flex; align-items: flex-start; gap: 14px; }

339.cc-ic-prompt {

340 color: var(--ic-clay); font-family: var(--ic-font-mono);

341 font-size: 17px; user-select: none; padding-top: 2px;

342}

343.cc-ic-cmd {

344 flex: 1; font-family: var(--ic-font-mono);

345 font-size: 17px; color: #f0eee6;

346 line-height: 1.55; white-space: pre-wrap; word-break: break-word;

347}

348.cc-ic-copy {

349 display: inline-flex; align-items: center; gap: 6px;

350 background: rgba(255, 255, 255, 0.08);

351 border: 0.5px solid rgba(255, 255, 255, 0.12);

352 color: rgba(255, 255, 255, 0.85);

353 padding: 7px 13px; border-radius: 8px;

354 font-size: 13px; font-weight: 500; flex-shrink: 0;

355}

356.cc-ic-copy:hover { background: rgba(255, 255, 255, 0.14); }

357.cc-ic-copy.cc-ic-copied { background: var(--ic-clay-deep); border-color: var(--ic-clay-deep); color: #fff; }

358 

359.cc-ic-below {

360 margin-top: 12px; font-size: 13px; color: var(--ic-gray-550);

361 display: flex; gap: 16px; flex-wrap: wrap; align-items: baseline;

362}

363.cc-ic-below a { color: var(--ic-gray-700); border-bottom: 0.5px solid var(--ic-border-default); }

364.cc-ic-below a:hover { color: var(--ic-clay-deep); border-bottom-color: var(--ic-clay-deep); }

365.cc-ic-handoff {

366 padding: 22px 24px;

367 background: linear-gradient(180deg, #faf9f4 0%, #f3f1e9 100%);

368 border: 0.5px solid var(--ic-border-default);

369 border-radius: 12px;

370 box-shadow: 0 1px 2px rgba(31, 30, 29, 0.04), 0 6px 16px -4px rgba(31, 30, 29, 0.06);

371}

372.dark .cc-ic-handoff {

373 background: linear-gradient(180deg, #262624 0%, #1f1e1d 100%);

374 box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3), 0 6px 16px -4px rgba(0, 0, 0, 0.4);

375}

376.cc-ic-handoff-title {

377 font-size: 16px; font-weight: 550; color: var(--ic-slate);

378 letter-spacing: -0.01em; margin-bottom: 4px;

379}

380.cc-ic-handoff-sub {

381 font-size: 14px; line-height: 1.5; color: var(--ic-gray-700);

382 margin-bottom: 18px;

383}

384.cc-ic-handoff-actions { display: flex; gap: 10px; flex-wrap: wrap; }

385.cc-ic-handoff-alt {

386 margin-top: 12px; font-size: 12px; color: var(--ic-gray-550);

387}

388.cc-ic-handoff-alt code {

389 font-family: var(--ic-font-mono); font-size: 11px;

390 background: var(--ic-gray-150); padding: 2px 6px;

391 border-radius: 4px; color: var(--ic-gray-700);

392}

393.cc-ic-copy-sm {

394 appearance: none; border: none;

395 display: inline-flex; align-items: center; justify-content: center;

396 width: 22px; height: 22px;

397 margin-left: 4px; vertical-align: middle;

398 background: var(--ic-gray-150); color: var(--ic-gray-550);

399 border-radius: 4px;

400 transition: color 0.1s, background-color 0.1s;

401}

402.cc-ic-copy-sm:hover { color: var(--ic-gray-700); background: var(--ic-border-default); }

403.cc-ic-copy-sm.cc-ic-copied { background: var(--ic-clay-deep); color: #fff; }

404 

405@media (max-width: 720px) {

406 .cc-ic-tab { padding: 12px 14px; font-size: 14px; }

407 .cc-ic-sales-actions { width: 100%; }

408 .cc-ic-card-body { padding: 20px; }

409 .cc-ic-cmd { font-size: 15px; }

410}

411`;

412 return <div className="cc-ic not-prose">

413 <style>{STYLES}</style>

414 

415 {}

416 <div className="cc-ic-tab-strip" role="tablist">

417 {TABS.map(t => <button key={t.key} type="button" role="tab" aria-selected={target === t.key} className={'cc-ic-tab' + (target === t.key ? ' cc-ic-active' : '')} onClick={() => setTarget(t.key)}>

418 {t.label}

419 </button>)}

420 </div>

421 

422 {}

423 <div className="cc-ic-team-wrap">

424 <button type="button" role="switch" aria-checked={team} className={'cc-ic-team-toggle' + (team ? ' cc-ic-checked' : '')} onClick={() => setTeam(!team)}>

425 <span className="cc-ic-check">{iconCheck(11)}</span>

426 <span>

427 I’m buying for a team or company (SSO, AWS/Azure/GCP, central billing)

428 </span>

429 </button>

430 </div>

431 

432 {}

433 {team && <div className="cc-ic-team-reveal">

434 <div className="cc-ic-sales">

435 <div className="cc-ic-sales-text">

436 <strong>Set up your team:</strong> self-serve or talk to sales.

437 </div>

438 <div className="cc-ic-sales-actions">

439 <a href="https://claude.ai/upgrade?initialPlanType=team&amp;utm_source=claude_code&amp;utm_medium=docs&amp;utm_content=configurator_team_get_started" className="cc-ic-btn-ghost">

440 Get started

441 </a>

442 <a href="https://www.anthropic.com/contact-sales?utm_source=claude_code&amp;utm_medium=docs&amp;utm_content=configurator_team_contact_sales" className="cc-ic-btn-clay">

443 Contact sales {iconArrowRight()}

444 </a>

445 </div>

446 </div>

447 

448 <div className="cc-ic-provider-bar">

449 <span className="cc-ic-label">Run on</span>

450 <div className="cc-ic-provider-pills" role="radiogroup" aria-label="Provider">

451 {PROVIDERS.map(p => <button key={p.key} type="button" role="radio" aria-checked={provider === p.key} className={'cc-ic-p-pill' + (provider === p.key ? ' cc-ic-active' : '')} onClick={() => setProvider(p.key)}>

452 {p.label}

453 </button>)}

454 </div>

455 </div>

456 

457 {showNotice && <div className="cc-ic-provider-notice">

458 {iconInfo()}

459 <div className="cc-ic-provider-notice-body">

460 {PROVIDER_NOTICE[provider]}

461 </div>

462 </div>}

463 </div>}

464 

465 {}

466 {target === 'terminal' && <div className="cc-ic-card">

467 <div className="cc-ic-subtabs" role="tablist" aria-label="Install method">

468 {Object.keys(TERM).map(k => <button key={k} type="button" role="tab" aria-selected={pkg === k} className={'cc-ic-subtab' + (pkg === k ? ' cc-ic-active' : '')} onClick={() => setPkg(k)}>

469 {TERM[k].label}

470 </button>)}

471 </div>

472 {isWinInstaller && <div className="cc-ic-shell-switch" role="tablist" aria-label="Shell">

473 {[{

474 k: 'ps',

475 label: 'PowerShell'

476 }, {

477 k: 'cmd',

478 label: 'CMD'

479 }].map(({k, label}) => {

480 const active = k === 'cmd' === winCmd;

481 return <button key={k} type="button" role="tab" aria-selected={active} className={'cc-ic-shell-option' + (active ? ' cc-ic-active' : '')} onClick={() => setWinCmd(k === 'cmd')}>

482 {label}

483 </button>;

484 })}

485 </div>}

486 {cardBodyCmd(terminalCmd, isWinPrompt ? '>' : '$')}

487 </div>}

488 

489 {}

490 {target === 'terminal' && <div className="cc-ic-below">

491 {isWinInstaller && <span>

492 <a href="https://git-scm.com/downloads/win" target="_blank" rel="noopener">

493 Git for Windows

494 </a>{' '}

495 recommended. PowerShell is used if Git Bash is absent.

496 </span>}

497 {(pkg === 'brew' || pkg === 'winget') && <span>

498 Does not auto-update. Run{' '}

499 <code>{pkg === 'brew' ? 'brew upgrade claude-code' : 'winget upgrade Anthropic.ClaudeCode'}</code>{' '}

500 periodically.

501 </span>}

502 <a href="/en/troubleshoot-install">Installation troubleshooting</a>

503 </div>}

504 

505 {alt && <div className="cc-ic-handoff">

506 <div className="cc-ic-handoff-title">Claude Code for {alt.name}</div>

507 <div className="cc-ic-handoff-sub">{alt.tagline}</div>

508 <div className="cc-ic-handoff-actions">

509 <a href={alt.installHref} className="cc-ic-btn-clay" {...alt.installHref.startsWith('http') ? {

510 target: '_blank',

511 rel: 'noopener'

512 } : {}}>

513 {alt.installLabel} {iconArrowUpRight(13)}

514 </a>

515 <a href={alt.guideHref} className="cc-ic-btn-ghost">

516 {alt.name} guide {iconArrowRight(12)}

517 </a>

518 </div>

519 {alt.altCmd && <div className="cc-ic-handoff-alt">

520 or run <code>{alt.altCmd}</code>

521 <button type="button" className={'cc-ic-copy-sm' + (copied === 'alt' ? ' cc-ic-copied' : '')} onClick={() => handleCopy(alt.altCmd, 'alt')} aria-label="Copy command">

522 {copied === 'alt' ? iconCheck(11) : iconCopy(11)}

523 </button>

524 </div>}

525 </div>}

526 </div>;

527};

528 

529export const Experiment = ({flag, treatment, children}) => {

530 const VID_KEY = 'exp_vid';

531 const CONSENT_COUNTRIES = new Set(['AT', 'BE', 'BG', 'HR', 'CY', 'CZ', 'DK', 'EE', 'FI', 'FR', 'DE', 'GR', 'HU', 'IE', 'IT', 'LV', 'LT', 'LU', 'MT', 'NL', 'PL', 'PT', 'RO', 'SK', 'SI', 'ES', 'SE', 'RE', 'GP', 'MQ', 'GF', 'YT', 'BL', 'MF', 'PM', 'WF', 'PF', 'NC', 'AW', 'CW', 'SX', 'FO', 'GL', 'AX', 'GB', 'UK', 'AI', 'BM', 'IO', 'VG', 'KY', 'FK', 'GI', 'MS', 'PN', 'SH', 'TC', 'GG', 'JE', 'IM', 'CA', 'BR', 'IN']);

532 const fnv1a = s => {

533 let h = 0x811c9dc5;

534 for (let i = 0; i < s.length; i++) {

535 h ^= s.charCodeAt(i);

536 h += (h << 1) + (h << 4) + (h << 7) + (h << 8) + (h << 24);

537 }

538 return h >>> 0;

539 };

540 const bucket = (seed, vid) => fnv1a(fnv1a(seed + vid) + '') % 10000 < 5000 ? 'control' : 'treatment';

541 const [decision] = useState(() => {

542 const params = new URLSearchParams(location.search);

543 const preBucketed = document.documentElement.dataset['gb_' + flag.replace(/-/g, '_')];

544 const force = params.get('gb-force');

545 if (force) {

546 for (const p of force.split(',')) {

547 const [k, v] = p.split(':');

548 if (k === flag) return {

549 variant: v || 'treatment',

550 track: false

551 };

552 }

553 }

554 if (navigator.globalPrivacyControl) {

555 return {

556 variant: 'control',

557 track: false

558 };

559 }

560 const prefsMatch = document.cookie.match(/(?:^|; )anthropic-consent-preferences=([^;]+)/);

561 if (prefsMatch) {

562 try {

563 if (JSON.parse(decodeURIComponent(prefsMatch[1])).analytics !== true) {

564 return {

565 variant: 'control',

566 track: false

567 };

568 }

569 } catch {

570 return {

571 variant: 'control',

572 track: false

573 };

574 }

575 } else {

576 const country = params.get('country')?.toUpperCase() || (document.cookie.match(/(?:^|; )cf_geo=([A-Z]{2})/) || [])[1];

577 if (!country || CONSENT_COUNTRIES.has(country)) {

578 return {

579 variant: 'control',

580 track: false

581 };

582 }

583 }

584 let vid;

585 try {

586 const ajsMatch = document.cookie.match(/(?:^|; )ajs_anonymous_id=([^;]+)/);

587 if (ajsMatch) {

588 vid = decodeURIComponent(ajsMatch[1]).replace(/^"|"$/g, '');

589 } else {

590 vid = localStorage.getItem(VID_KEY);

591 if (!vid) {

592 vid = crypto.randomUUID();

593 }

594 document.cookie = `ajs_anonymous_id=${vid}; domain=.claude.com; path=/; Secure; SameSite=Lax; max-age=31536000`;

595 }

596 try {

597 localStorage.setItem(VID_KEY, vid);

598 } catch {}

599 } catch {

600 return {

601 variant: 'control',

602 track: false

603 };

604 }

605 const variant = preBucketed === '1' ? 'treatment' : preBucketed === '0' ? 'control' : bucket(flag, vid);

606 return {

607 variant,

608 track: true,

609 vid

610 };

611 });

612 useEffect(() => {

613 if (!decision.track) return;

614 fetch('https://api.anthropic.com/api/event_logging/v2/batch', {

615 method: 'POST',

616 headers: {

617 'Content-Type': 'application/json',

618 'x-service-name': 'claude_code_docs'

619 },

620 body: JSON.stringify({

621 events: [{

622 event_type: 'GrowthbookExperimentEvent',

623 event_data: {

624 device_id: decision.vid,

625 anonymous_id: decision.vid,

626 timestamp: new Date().toISOString(),

627 experiment_id: flag,

628 variation_id: decision.variant === 'treatment' ? 1 : 0,

629 environment: 'production'

630 }

631 }]

632 }),

633 keepalive: true

634 }).catch(() => {});

635 }, []);

636 return decision.variant === 'treatment' ? treatment : children;

637};

638 

639Claude Code 是一个由 AI 驱动的编码助手,可帮助你构建功能、修复错误和自动化开发任务。它理解你的整个代码库,可以跨多个文件和工具工作以完成任务。

640 

641<div data-gb-slot="overview-install-configurator">

642 <Experiment flag="overview-install-configurator" treatment={<InstallConfigurator />} />

643</div>

644 

645## 开始使用

646 

647选择你的环境来开始使用。大多数界面需要 [Claude 订阅](https://claude.com/pricing?utm_source=claude_code\&utm_medium=docs\&utm_content=overview_pricing) 或 [Anthropic 控制台](https://console.anthropic.com/) 账户。终端 CLI 和 VS Code 也支持[第三方提供商](/zh-CN/third-party-integrations)。

648 

649<Tabs>

650 <Tab title="Terminal">

651 功能完整的 CLI,用于直接在终端中使用 Claude Code。编辑文件、运行命令,并从命令行管理整个项目。

652 

653 To install Claude Code, use one of the following methods:

654 

655 <Tabs>

656 <Tab title="Native Install (Recommended)">

657 **macOS, Linux, WSL:**

658 

659 ```bash theme={null}

660 curl -fsSL https://claude.ai/install.sh | bash

661 ```

662 

663 **Windows PowerShell:**

664 

665 ```powershell theme={null}

666 irm https://claude.ai/install.ps1 | iex

667 ```

668 

669 **Windows CMD:**

670 

671 ```batch theme={null}

672 curl -fsSL https://claude.ai/install.cmd -o install.cmd && install.cmd && del install.cmd

673 ```

674 

675 If you see `The token '&&' is not a valid statement separator`, you're in PowerShell, not CMD. If you see `'irm' is not recognized as an internal or external command`, you're in CMD, not PowerShell. Your prompt shows `PS C:\` when you're in PowerShell and `C:\` without the `PS` when you're in CMD.

676 

677 [Git for Windows](https://git-scm.com/downloads/win) is recommended on native Windows so Claude Code can use the Bash tool. If Git for Windows is not installed, Claude Code uses PowerShell as the shell tool instead. WSL setups do not need Git for Windows.

678 

679 <Info>

680 Native installations automatically update in the background to keep you on the latest version.

681 </Info>

682 </Tab>

683 

684 <Tab title="Homebrew">

685 ```bash theme={null}

686 brew install --cask claude-code

687 ```

688 

689 Homebrew offers two casks. `claude-code` tracks the stable release channel, which is typically about a week behind and skips releases with major regressions. `claude-code@latest` tracks the latest channel and receives new versions as soon as they ship.

690 

691 <Info>

692 Homebrew installations do not auto-update. Run `brew upgrade claude-code` or `brew upgrade claude-code@latest`, depending on which cask you installed, to get the latest features and security fixes.

693 </Info>

694 </Tab>

695 

696 <Tab title="WinGet">

697 ```powershell theme={null}

698 winget install Anthropic.ClaudeCode

699 ```

700 

701 <Info>

702 WinGet installations do not auto-update. Run `winget upgrade Anthropic.ClaudeCode` periodically to get the latest features and security fixes.

703 </Info>

704 </Tab>

705 </Tabs>

706 

707 You can also install with [apt, dnf, or apk](/en/setup#install-with-linux-package-managers) on Debian, Fedora, RHEL, and Alpine.

708 

709 然后在任何项目中启动 Claude Code:

710 

711 ```bash theme={null}

712 cd your-project

713 claude

714 ```

715 

716 首次使用时,系统会提示你登录。就这样![继续快速入门 →](/zh-CN/quickstart)

717 

718 <Tip>

719 查看[高级设置](/zh-CN/setup)了解安装选项、手动更新或卸载说明。如果遇到问题,请访问[安装故障排除](/zh-CN/troubleshoot-install)。

720 </Tip>

721 </Tab>

722 

723 <Tab title="VS Code">

724 VS Code 扩展在编辑器中直接提供内联差异、@-提及、计划审查和对话历史。

725 

726 * [为 VS Code 安装](vscode:extension/anthropic.claude-code)

727 * [为 Cursor 安装](cursor:extension/anthropic.claude-code)

728 

729 或在扩展视图中搜索"Claude Code"(Mac 上为 `Cmd+Shift+X`,Windows/Linux 上为 `Ctrl+Shift+X`)。安装后,打开命令面板(`Cmd+Shift+P` / `Ctrl+Shift+P`),输入"Claude Code",然后选择**在新标签页中打开**。

730 

731 [开始使用 VS Code →](/zh-CN/vs-code#get-started)

732 </Tab>

733 

734 <Tab title="Desktop app">

735 一个独立应用,用于在 IDE 或终端之外运行 Claude Code。直观地查看差异、并行运行多个会话、安排定期任务,并启动云会话。

736 

737 下载并安装:

738 

739 * [macOS](https://claude.ai/api/desktop/darwin/universal/dmg/latest/redirect?utm_source=claude_code\&utm_medium=docs)(Intel 和 Apple Silicon)

740 * [Windows](https://claude.ai/api/desktop/win32/x64/setup/latest/redirect?utm_source=claude_code\&utm_medium=docs)(x64)

741 * [Windows ARM64](https://claude.ai/api/desktop/win32/arm64/setup/latest/redirect?utm_source=claude_code\&utm_medium=docs)

742 

743 安装后,启动 Claude,登录,然后点击**代码**标签开始编码。需要[付费订阅](https://claude.com/pricing?utm_source=claude_code\&utm_medium=docs\&utm_content=overview_desktop_pricing)。

744 

745 [了解更多关于桌面应用的信息 →](/zh-CN/desktop-quickstart)

746 </Tab>

747 

748 <Tab title="Web">

749 在浏览器中运行 Claude Code,无需本地设置。启动长时间运行的任务,完成后再检查,处理你本地没有的仓库,或并行运行多个任务。可在桌面浏览器和 Claude iOS 应用中使用。

750 

751 在 [claude.ai/code](https://claude.ai/code) 开始编码。

752 

753 [开始在网络上使用 →](/zh-CN/web-quickstart)

754 </Tab>

755 

756 <Tab title="JetBrains">

757 一个用于 IntelliJ IDEA、PyCharm、WebStorm 和其他 JetBrains IDE 的插件,具有交互式差异查看和选择上下文共享。

758 

759 从 JetBrains Marketplace 安装 [Claude Code 插件](https://plugins.jetbrains.com/plugin/27310-claude-code-beta-),然后重启你的 IDE。

760 

761 [开始使用 JetBrains →](/zh-CN/jetbrains)

762 </Tab>

763</Tabs>

764 

765## 你可以做什么

766 

767以下是你可以使用 Claude Code 的一些方式:

768 

769<AccordionGroup>

770 <Accordion title="自动化你一直在推迟的工作" icon="wand-magic-sparkles">

771 Claude Code 处理那些占用你一整天的繁琐任务:为未测试的代码编写测试、修复项目中的 lint 错误、解决合并冲突、更新依赖项和编写发布说明。

772 

773 ```bash theme={null}

774 claude "write tests for the auth module, run them, and fix any failures"

775 ```

776 </Accordion>

777 

778 <Accordion title="构建功能和修复错误" icon="hammer">

779 用简单的语言描述你想要的内容。Claude Code 规划方法、跨多个文件编写代码,并验证其工作。

780 

781 对于错误,粘贴错误消息或描述症状。Claude Code 通过你的代码库追踪问题、识别根本原因并实施修复。查看[常见工作流](/zh-CN/common-workflows)了解更多示例。

782 </Accordion>

783 

784 <Accordion title="创建提交和拉取请求" icon="code-branch">

785 Claude Code 直接与 git 配合工作。它暂存更改、编写提交消息、创建分支并打开拉取请求。

786 

787 ```bash theme={null}

788 claude "commit my changes with a descriptive message"

789 ```

790 

791 在 CI 中,你可以使用 [GitHub Actions](/zh-CN/github-actions) 或 [GitLab CI/CD](/zh-CN/gitlab-ci-cd) 自动化代码审查和问题分类。

792 </Accordion>

793 

794 <Accordion title="使用 MCP 连接你的工具" icon="plug">

795 [Model Context Protocol (MCP)](/zh-CN/mcp) 是一个开放标准,用于将 AI 工具连接到外部数据源。使用 MCP,Claude Code 可以读取 Google Drive 中的设计文档、更新 Jira 中的工单、从 Slack 拉取数据,或使用你自己的自定义工具。

796 </Accordion>

797 

798 <Accordion title="使用说明、skills 和 hooks 进行自定义" icon="sliders">

799 [`CLAUDE.md`](/zh-CN/memory) 是一个 markdown 文件,你可以将其添加到项目根目录,Claude Code 会在每个会话开始时读取它。使用它来设置编码标准、架构决策、首选库和审查清单。Claude 还会在工作时构建[自动内存](/zh-CN/memory#auto-memory),保存学习内容,如构建命令和调试见解,跨会话使用,无需你编写任何内容。

800 

801 创建[自定义命令](/zh-CN/skills)来打包你的团队可以共享的可重复工作流,如 `/review-pr` 或 `/deploy-staging`。

802 

803 [Hooks](/zh-CN/hooks) 让你在 Claude Code 操作之前或之后运行 shell 命令,如在每次文件编辑后自动格式化或在提交前运行 lint。

804 </Accordion>

805 

806 <Accordion title="运行代理团队并构建自定义代理" icon="users">

807 生成[多个 Claude Code 代理](/zh-CN/sub-agents),同时处理任务的不同部分。主导代理协调工作、分配子任务并合并结果。

808 

809 对于完全自定义的工作流,[Agent SDK](/zh-CN/agent-sdk/overview) 让你构建由 Claude Code 的工具和功能驱动的自己的代理,完全控制编排、工具访问和权限。

810 </Accordion>

811 

812 <Accordion title="使用 CLI 进行管道、脚本和自动化" icon="terminal">

813 Claude Code 是可组合的,遵循 Unix 哲学。将日志管道传入其中、在 CI 中运行它,或将其与其他工具链接:

814 

815 ```bash theme={null}

816 # 分析最近的日志输出

817 tail -200 app.log | claude -p "Slack me if you see any anomalies"

818 

819 # 在 CI 中自动化翻译

820 claude -p "translate new strings into French and raise a PR for review"

821 

822 # 跨文件的批量操作

823 git diff main --name-only | claude -p "review these changed files for security issues"

824 ```

825 

826 查看 [CLI 参考](/zh-CN/cli-reference)了解完整的命令和标志集。

827 </Accordion>

828 

829 <Accordion title="安排定期任务" icon="clock">

830 按计划运行 Claude 以自动化重复的工作:早晨 PR 审查、夜间 CI 失败分析、每周依赖项审计或在 PR 合并后同步文档。

831 

832 * [Routines](/zh-CN/routines) 在 Anthropic 管理的基础设施上运行,因此即使你的计算机关闭,它们也会继续运行。它们也可以在 API 调用或 GitHub 事件上触发。从网络、桌面应用或通过在 CLI 中运行 `/schedule` 来创建它们。

833 * [桌面计划任务](/zh-CN/desktop-scheduled-tasks)在你的机器上运行,可直接访问你的本地文件和工具

834 * [`/loop`](/zh-CN/scheduled-tasks) 在 CLI 会话中重复提示以进行快速轮询

835 </Accordion>

836 

837 <Accordion title="从任何地方工作" icon="globe">

838 会话不受限于单一界面。当你的上下文改变时,在环境之间移动工作:

839 

840 * 离开你的办公桌,使用[远程控制](/zh-CN/remote-control)从你的手机或任何浏览器继续工作

841 * 向 [Dispatch](/zh-CN/desktop#sessions-from-dispatch) 发送来自你手机的任务,并打开它创建的桌面会话

842 * 在[网络](/zh-CN/claude-code-on-the-web)或 [iOS 应用](https://apps.apple.com/app/claude-by-anthropic/id6473753684)上启动长时间运行的任务,然后使用 `claude --teleport` 将其拉入你的终端

843 * 使用 `/desktop` 将终端会话交给[桌面应用](/zh-CN/desktop)进行视觉差异审查

844 * 从团队聊天路由任务:在 [Slack](/zh-CN/slack) 中提及 `@Claude` 并附上错误报告,获得拉取请求

845 </Accordion>

846</AccordionGroup>

847 

848## 在任何地方使用 Claude Code

849 

850每个界面都连接到相同的底层 Claude Code 引擎,因此你的 CLAUDE.md 文件、设置和 MCP 服务器可在所有界面中工作。

851 

852除了上面的[终端](/zh-CN/quickstart)、[VS Code](/zh-CN/vs-code)、[JetBrains](/zh-CN/jetbrains)、[桌面](/zh-CN/desktop)和[网络](/zh-CN/claude-code-on-the-web)环境外,Claude Code 还与 CI/CD、聊天和浏览器工作流集成:

853 

854| 我想要... | 最佳选项 |

855| -------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- |

856| 从我的手机或另一台设备继续本地会话 | [远程控制](/zh-CN/remote-control) |

857| 从 Telegram、Discord、iMessage 或我自己的 webhook 推送事件到会话中 | [Channels](/zh-CN/channels) |

858| 在本地启动任务,在移动设备上继续 | [网络](/zh-CN/claude-code-on-the-web)或 [Claude iOS 应用](https://apps.apple.com/app/claude-by-anthropic/id6473753684) |

859| 按定期计划运行 Claude | [Routines](/zh-CN/routines) 或[桌面计划任务](/zh-CN/desktop-scheduled-tasks) |

860| 自动化 PR 审查和问题分类 | [GitHub Actions](/zh-CN/github-actions) 或 [GitLab CI/CD](/zh-CN/gitlab-ci-cd) |

861| 在每个 PR 上获得自动代码审查 | [GitHub Code Review](/zh-CN/code-review) |

862| 将 Slack 中的错误报告路由到拉取请求 | [Slack](/zh-CN/slack) |

863| 调试实时网络应用 | [Chrome](/zh-CN/chrome) |

864| 为你自己的工作流构建自定义代理 | [Agent SDK](/zh-CN/agent-sdk/overview) |

865 

866## 后续步骤

867 

868安装 Claude Code 后,这些指南可帮助你深入了解。

869 

870* [快速入门](/zh-CN/quickstart):通过你的第一个真实任务,从探索代码库到提交修复

871* [存储说明和内存](/zh-CN/memory):使用 CLAUDE.md 文件和自动内存为 Claude 提供持久说明

872* [常见工作流](/zh-CN/common-workflows)和[最佳实践](/zh-CN/best-practices):充分利用 Claude Code 的模式

873* [设置](/zh-CN/settings):为你的工作流自定义 Claude Code

874* [故障排除](/zh-CN/troubleshooting):常见问题的解决方案

875* [code.claude.com](https://code.claude.com/):演示、定价和产品详情

permission-modes.md +290 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 选择权限模式

6 

7> 控制 Claude 在编辑文件或运行命令前是否询问。在 CLI 中使用 Shift+Tab 循环切换模式,或在 VS Code、Desktop 和 claude.ai 中使用模式选择器。

8 

9当 Claude 想要编辑文件、运行 shell 命令或发出网络请求时,它会暂停并要求您批准该操作。权限模式控制暂停发生的频率。您选择的模式塑造了会话的流程:默认模式让您在操作进行时审查每个操作,而更宽松的模式让 Claude 在更长的不间断时间内工作,然后报告完成情况。为敏感工作选择更多监督,或在您信任方向时选择更少中断。

10 

11## 可用模式

12 

13每种模式在便利性和监督之间做出不同的权衡。下表显示了在每种模式中 Claude 无需权限提示即可执行的操作。

14 

15| 模式 | 无需询问即可运行的操作 | 最适合 |

16| :------------------------------------------------------------------ | :-------------------------------------------- | :----------- |

17| `default` | 仅读取 | 入门、敏感工作 |

18| [`acceptEdits`](#auto-approve-file-edits-with-acceptedits-mode) | 读取、文件编辑和常见文件系统命令(`mkdir`、`touch`、`mv`、`cp` 等) | 迭代您正在审查的代码 |

19| [`plan`](#analyze-before-you-edit-with-plan-mode) | 仅读取 | 在更改代码库前进行探索 |

20| [`auto`](#eliminate-prompts-with-auto-mode) | 所有操作,带后台安全检查 | 长时间任务、减少提示疲劳 |

21| [`dontAsk`](#allow-only-pre-approved-tools-with-dontask-mode) | 仅预先批准的工具 | 锁定的 CI 和脚本 |

22| [`bypassPermissions`](#skip-all-checks-with-bypasspermissions-mode) | 所有操作,带后台安全检查 | 仅隔离容器和 VM |

23 

24在除 `bypassPermissions` 外的每种模式中,对[受保护路径](#protected-paths)的写入永远不会自动批准,保护仓库状态和 Claude 自己的配置免受意外破坏。

25 

26模式设置基线。在顶部分层[权限规则](/zh-CN/permissions#manage-permissions)以在除 `bypassPermissions` 外的任何模式中预先批准或阻止特定工具,`bypassPermissions` 完全跳过权限层。

27 

28## 切换权限模式

29 

30您可以在会话期间、启动时或作为持久默认设置切换模式。模式通过这些控制设置,而不是通过在聊天中询问 Claude。选择下面的您的界面以查看如何更改它。

31 

32<Tabs>

33 <Tab title="CLI">

34 **在会话期间**:按 `Shift+Tab` 循环切换 `default` → `acceptEdits` → `plan`。当前模式显示在状态栏中。并非每种模式都在默认循环中:

35 

36 * `auto`:当您的账户满足 [auto mode 要求](#eliminate-prompts-with-auto-mode)时出现;循环到 auto 会显示一个选择加入提示,直到您接受它,或选择**不,不再询问**以从循环中移除 auto

37 * `bypassPermissions`:在您使用 `--permission-mode bypassPermissions`、`--dangerously-skip-permissions` 或 `--allow-dangerously-skip-permissions` 启动后出现;`--allow-` 变体将模式添加到循环中而不激活它

38 * `dontAsk`:永远不会出现在循环中;使用 `--permission-mode dontAsk` 设置它

39 

40 启用的可选模式在 `plan` 之后插入,`bypassPermissions` 优先,`auto` 最后。如果您同时启用了两者,您将在前往 `auto` 的途中循环通过 `bypassPermissions`。

41 

42 **启动时**:将模式作为标志传递。

43 

44 ```bash theme={null}

45 claude --permission-mode plan

46 ```

47 

48 **作为默认设置**:在[设置](/zh-CN/settings#settings-files)中设置 `defaultMode`。

49 

50 ```json theme={null}

51 {

52 "permissions": {

53 "defaultMode": "acceptEdits"

54 }

55 }

56 ```

57 

58 相同的 `--permission-mode` 标志适用于 `-p` [非交互式运行](/zh-CN/headless)。

59 </Tab>

60 

61 <Tab title="VS Code">

62 **在会话期间**:单击提示框底部的模式指示器。

63 

64 **作为默认设置**:在 VS Code 设置中设置 `claudeCode.initialPermissionMode`,或使用 Claude Code 扩展设置面板。

65 

66 模式指示器显示这些标签,映射到每个标签应用的模式:

67 

68 | UI 标签 | 模式 |

69 | :----------------- | :------------------ |

70 | Ask before edits | `default` |

71 | Edit automatically | `acceptEdits` |

72 | Plan mode | `plan` |

73 | Auto mode | `auto` |

74 | Bypass permissions | `bypassPermissions` |

75 

76 在您在扩展设置中启用**允许危险地跳过权限**后,Auto mode 出现在模式指示器中,但它保持不可用,直到您的账户满足 [auto mode 部分](#eliminate-prompts-with-auto-mode)中列出的每个要求。`claudeCode.initialPermissionMode` 设置不接受 `auto`;要默认以 auto mode 启动,请改为在您的 Claude Code [`settings.json`](/zh-CN/settings#settings-files) 中设置 `defaultMode`。

77 

78 Bypass permissions 也需要**允许危险地跳过权限**切换才能在模式指示器中出现。

79 

80 有关扩展特定的详细信息,请参阅 [VS Code 指南](/zh-CN/vs-code)。

81 </Tab>

82 

83 <Tab title="JetBrains">

84 JetBrains 插件在 IDE 终端中运行 Claude Code,因此切换模式的工作方式与 CLI 中相同:按 `Shift+Tab` 循环切换,或在启动时传递 `--permission-mode`。

85 </Tab>

86 

87 <Tab title="Desktop">

88 使用发送按钮旁边的模式选择器。Auto 和 Bypass permissions 仅在您在 Desktop 设置中启用它们后出现。请参阅 [Desktop 指南](/zh-CN/desktop#choose-a-permission-mode)。

89 </Tab>

90 

91 <Tab title="Web and mobile">

92 在 [claude.ai/code](https://claude.ai/code) 或移动应用中使用提示框旁边的模式下拉菜单。权限提示出现在 claude.ai 中以供批准。哪些模式出现取决于会话在哪里运行:

93 

94 * **云会话**在 [Claude Code on the web](/zh-CN/claude-code-on-the-web):Auto accept edits 和 Plan mode。Ask permissions、Auto 和 Bypass permissions 不可用。

95 * **[Remote Control](/zh-CN/remote-control) 会话**在您的本地机器上:Ask permissions、Auto accept edits 和 Plan mode。Auto 和 Bypass permissions 不可用。

96 

97 对于 Remote Control,您也可以在启动主机时设置起始模式:

98 

99 ```bash theme={null}

100 claude remote-control --permission-mode acceptEdits

101 ```

102 </Tab>

103</Tabs>

104 

105## 使用 acceptEdits mode 自动批准文件编辑

106 

107`acceptEdits` mode 让 Claude 在您的工作目录中创建和编辑文件而无需提示。状态栏显示 `⏵⏵ accept edits on` 当此模式处于活动状态时。

108 

109除了文件编辑外,`acceptEdits` mode 自动批准常见的文件系统 Bash 命令:`mkdir`、`touch`、`rm`、`rmdir`、`mv`、`cp` 和 `sed`。这些命令在以安全环境变量(如 `LANG=C` 或 `NO_COLOR=1`)或进程包装器(如 `timeout`、`nice` 或 `nohup`)为前缀时也会自动批准。与文件编辑一样,自动批准仅适用于您的工作目录或 `additionalDirectories` 内的路径。该范围外的路径、对[受保护路径](#protected-paths)的写入和所有其他 Bash 命令仍然会提示。

110 

111当启用 [PowerShell tool](/zh-CN/tools-reference#powershell-tool) 时,`acceptEdits` mode 也会自动批准 `Set-Content`、`Add-Content`、`Clear-Content` 和 `Remove-Item` 在范围内的路径上,以及它们的常见别名。相同的范围和受保护路径规则适用。

112 

113当您想在编辑器中或通过 `git diff` 之后审查更改而不是逐个批准每个编辑时,使用 `acceptEdits`。从默认模式按 `Shift+Tab` 一次进入它,或直接启动它:

114 

115```bash theme={null}

116claude --permission-mode acceptEdits

117```

118 

119## 使用 plan mode 在编辑前进行分析

120 

121Plan mode 告诉 Claude 研究并提议更改而不进行更改。Claude 读取文件、运行 shell 命令进行探索,并编写计划,但不编辑您的源代码。权限提示的应用方式与默认模式相同。

122 

123通过按 `Shift+Tab` 或在单个提示前加上 `/plan` 进入 plan mode。您也可以从 CLI 以 plan mode 启动:

124 

125```bash theme={null}

126claude --permission-mode plan

127```

128 

129再次按 `Shift+Tab` 离开 plan mode 而不批准计划。

130 

131当计划准备好时,Claude 呈现它并询问如何继续。从该提示您可以:

132 

133* 批准并在 auto mode 中启动

134* 批准并接受编辑

135* 批准并手动审查每个编辑

136* 继续规划并提供反馈

137* 使用 [Ultraplan](/zh-CN/ultraplan) 进行基于浏览器的审查进行细化

138 

139每个批准选项也提供首先清除规划上下文的选项。

140 

141## 使用 auto mode 消除提示

142 

143<Note>

144 Auto mode 需要 Claude Code v2.1.83 或更高版本。

145</Note>

146 

147Auto mode 让 Claude 执行而无需权限提示。一个单独的分类器模型在操作运行前审查操作,阻止任何超出您请求范围的操作、针对无法识别的基础设施的操作,或似乎由 Claude 读到的恶意内容驱动的操作。

148 

149<Warning>

150 Auto mode 是研究预览版。它减少提示但不保证安全。将其用于您信任一般方向的任务,而不是作为敏感操作审查的替代品。

151</Warning>

152 

153Auto mode 仅在您的账户满足所有这些要求时可用:

154 

155* **计划**:Max、Team、Enterprise 或 API。Pro 上不可用。

156* **管理员**:在 Team 和 Enterprise 上,管理员必须在 [Claude Code 管理员设置](https://claude.ai/admin-settings/claude-code)中启用它,然后用户才能打开它。管理员也可以通过在[托管设置](/zh-CN/permissions#managed-settings)中将 `permissions.disableAutoMode` 设置为 `"disable"` 来锁定它。

157* **模型**:Team、Enterprise 和 API 计划上的 Claude Sonnet 4.6、Opus 4.6 或 Opus 4.7;Max 计划上仅 Claude Opus 4.7。不支持其他模型,包括 Haiku 和 claude-3 模型。

158* **提供商**:仅 Anthropic API。在 Bedrock、Vertex 或 Foundry 上不可用。

159 

160如果 Claude Code 报告 auto mode 不可用,其中一个要求未满足;这不是暂时中断。一个单独的消息命名一个模型并说 auto mode "cannot determine the safety" 的操作是暂时分类器中断;请参阅[错误参考](/zh-CN/errors#auto-mode-cannot-determine-the-safety-of-an-action)。

161 

162### 分类器默认阻止的内容

163 

164分类器信任您的工作目录和您的仓库的配置的远程。其他所有内容都被视为外部,直到您[配置受信任的基础设施](/zh-CN/auto-mode-config)。

165 

166**默认阻止**:

167 

168* 下载和执行代码,如 `curl | bash`

169* 向外部端点发送敏感数据

170* 生产部署和迁移

171* 云存储上的大规模删除

172* 授予 IAM 或仓库权限

173* 修改共享基础设施

174* 不可逆地销毁会话开始前存在的文件

175* 强制推送或直接推送到 `main`

176 

177**默认允许**:

178 

179* 工作目录中的本地文件操作

180* 安装在您的锁定文件或清单中声明的依赖项

181* 读取 `.env` 并向其匹配的 API 发送凭证

182* 只读 HTTP 请求

183* 推送到您启动的分支或 Claude 创建的分支

184 

185Sandbox 网络访问请求通过分类器路由而不是默认允许。运行 `claude auto-mode defaults` 以查看完整的规则列表。如果常规操作被阻止,管理员可以通过 `autoMode.environment` 设置添加受信任的仓库、桶和服务:请参阅[配置 auto mode](/zh-CN/auto-mode-config)。

186 

187### 您在对话中陈述的边界

188 

189分类器将您在对话中陈述的边界视为阻止信号。如果您告诉 Claude "don't push" 或 "wait until I review before deploying",分类器会阻止匹配的操作,即使默认规则会允许它们。边界保持有效,直到您在后续消息中解除它。Claude 自己的判断条件已满足不会解除它。

190 

191边界不存储为规则。分类器在每次检查时从记录中重新读取它们,因此如果[上下文压缩](/zh-CN/costs#reduce-token-usage)删除陈述边界的消息,边界可能会丢失。为了硬保证,请改为添加[拒绝规则](/zh-CN/permissions#permission-rule-syntax)。

192 

193### 当 auto mode 回退时

194 

195每个被拒绝的操作显示通知并出现在 `/permissions` 下的"最近拒绝"选项卡中,您可以按 `r` 以手动批准重试它。

196 

197如果分类器在一行中阻止操作 3 次或总共 20 次,auto mode 暂停,Claude Code 恢复提示。批准提示的操作恢复 auto mode。这些阈值不可配置。任何允许的操作重置连续计数器,而总计数器在会话中持续,仅在其自己的限制触发回退时重置。

198 

199在[非交互式模式](/zh-CN/headless)中使用 `-p` 标志,重复的阻止中止会话,因为没有用户可以提示。

200 

201重复的阻止通常意味着分类器缺少关于您的基础设施的上下文。使用 `/feedback` 报告误报,或让管理员[配置受信任的基础设施](/zh-CN/auto-mode-config)。

202 

203<AccordionGroup>

204 <Accordion title="分类器如何评估操作">

205 每个操作都经过固定的决策顺序。第一个匹配的步骤获胜:

206 

207 1. 与您的[允许或拒绝规则](/zh-CN/permissions#manage-permissions)匹配的操作立即解决

208 2. 只读操作和工作目录中的文件编辑自动批准,除了对[受保护路径](#protected-paths)的写入

209 3. 其他所有内容都发送到分类器

210 4. 如果分类器阻止,Claude 收到原因并尝试替代方案

211 

212 进入 auto mode 时,授予任意代码执行的广泛允许规则被删除:

213 

214 * 全面 `Bash(*)`

215 * 通配符解释器如 `Bash(python*)`

216 * 包管理器运行命令

217 * `Agent` 允许规则

218 

219 诸如 `Bash(npm test)` 之类的狭隘规则会继续。删除的规则在您离开 auto mode 时恢复。

220 

221 分类器看到用户消息、工具调用和您的 CLAUDE.md 内容。工具结果被剥离,因此文件或网页中的恶意内容无法直接操纵它。一个单独的服务器端探针扫描传入的工具结果并在 Claude 读取前标记可疑内容。有关这些层如何协同工作的更多信息,请参阅 [auto mode 公告](https://claude.com/blog/auto-mode)和[工程深度探讨](https://www.anthropic.com/engineering/claude-code-auto-mode)。

222 </Accordion>

223 

224 <Accordion title="Auto mode 如何处理子代理">

225 分类器在三个点检查[子代理](/zh-CN/sub-agents)工作:

226 

227 1. 在子代理启动前,委派的任务描述被评估,因此看起来危险的任务在生成时被阻止。

228 2. 当子代理运行时,它的每个操作都通过分类器,使用与父会话相同的规则,子代理前言中的任何 `permissionMode` 都被忽略。

229 3. 当子代理完成时,分类器审查其完整的操作历史;如果该返回检查标记了一个问题,安全警告被添加到子代理的结果前面。

230 </Accordion>

231 

232 <Accordion title="成本和延迟">

233 分类器在独立于您的 `/model` 选择的服务器配置模型上运行,因此切换模型不会改变分类器可用性。分类器调用计入您的令牌使用。每次检查发送记录的一部分加上待处理操作,在执行前添加往返。受保护路径外的读取和工作目录编辑跳过分类器,因此开销主要来自 shell 命令和网络操作。

234 </Accordion>

235</AccordionGroup>

236 

237## 仅使用 dontAsk mode 允许预先批准的工具

238 

239`dontAsk` mode 自动拒绝每个会提示的工具调用。仅与您的 `permissions.allow` 规则和[只读 Bash 命令](/zh-CN/permissions#read-only-commands)匹配的操作可以执行;显式 `ask` 规则被拒绝而不是提示。这使模式完全非交互式,适合 CI 管道或受限环境,其中您预先定义 Claude 可能执行的确切操作。

240 

241在启动时使用标志设置它:

242 

243```bash theme={null}

244claude --permission-mode dontAsk

245```

246 

247## 使用 bypassPermissions mode 跳过所有检查

248 

249`bypassPermissions` mode 禁用权限提示和安全检查,因此工具调用立即执行。从 v2.1.126 开始,这包括对[受保护路径](#protected-paths)的写入,早期版本仍然会提示。针对文件系统根目录或主目录的删除操作,例如 `rm -rf /` 和 `rm -rf ~`,仍然会提示作为防止模型错误的断路器。仅在隔离环境(如容器、VM 或没有互联网访问的 dev containers)中使用此模式,其中 Claude Code 无法对您的主机系统造成损害。

250 

251您无法从没有启用标志之一启动的会话进入 `bypassPermissions`;使用其中一个重新启动以启用它:

252 

253```bash theme={null}

254claude --permission-mode bypassPermissions

255```

256 

257`--dangerously-skip-permissions` 标志等同。

258 

259<Warning>

260 `bypassPermissions` 不提供针对提示注入或意外操作的保护。对于没有提示的后台安全检查,请改为使用 [auto mode](#eliminate-prompts-with-auto-mode)。管理员可以通过在[托管设置](/zh-CN/permissions#managed-settings)中将 `permissions.disableBypassPermissionsMode` 设置为 `"disable"` 来阻止此模式。

261</Warning>

262 

263## 受保护的路径

264 

265对一小组路径的写入在除了 `bypassPermissions` 之外的每种模式中都永远不会自动批准。这防止了仓库状态和 Claude 自己的配置的意外破坏。在 `default`、`acceptEdits` 和 `plan` 中这些写入会提示;在 `auto` 中它们路由到分类器;在 `dontAsk` 中它们被拒绝;在 `bypassPermissions` 中它们被允许。

266 

267受保护的目录:

268 

269* `.git`

270* `.vscode`

271* `.idea`

272* `.husky`

273* `.claude`,除了 `.claude/commands`、`.claude/agents`、`.claude/skills` 和 `.claude/worktrees`,其中 Claude 经常创建内容

274 

275受保护的文件:

276 

277* `.gitconfig`、`.gitmodules`

278* `.bashrc`、`.bash_profile`、`.zshrc`、`.zprofile`、`.profile`

279* `.ripgreprc`

280* `.mcp.json`、`.claude.json`

281 

282## 另请参阅

283 

284* [权限](/zh-CN/permissions):允许、询问和拒绝规则;托管策略

285* [配置 auto mode](/zh-CN/auto-mode-config):告诉分类器您的组织信任哪些基础设施

286* [Hooks](/zh-CN/hooks):通过 `PreToolUse` 和 `PermissionRequest` hooks 的自定义权限逻辑

287* [Ultraplan](/zh-CN/ultraplan):在 Claude Code on the web 会话中运行 plan mode,带基于浏览器的审查

288* [安全](/zh-CN/security):保障和最佳实践

289* [沙箱](/zh-CN/sandboxing):Bash 命令的文件系统和网络隔离

290* [非交互式模式](/zh-CN/headless):使用 `-p` 标志运行 Claude Code

permissions.md +358 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 配置权限

6 

7> 通过细粒度权限规则、模式和托管策略来控制 Claude Code 可以访问和执行的操作。

8 

9Claude Code 支持细粒度权限,因此您可以精确指定代理允许执行的操作和不允许执行的操作。权限设置可以检入版本控制并分发给组织中的所有开发人员,也可以由个别开发人员自定义。

10 

11## 权限系统

12 

13Claude Code 使用分层权限系统来平衡功能和安全性:

14 

15| 工具类型 | 示例 | 需要批准 | "是,不再询问"行为 |

16| :------ | :------------ | :--- | :------------ |

17| 只读 | 文件读取、Grep | 否 | 不适用 |

18| Bash 命令 | Shell 执行 | 是 | 每个项目目录和命令永久有效 |

19| 文件修改 | Edit/Write 文件 | 是 | 直到会话结束 |

20 

21## 管理权限

22 

23您可以使用 `/permissions` 查看和管理 Claude Code 的工具权限。此 UI 列出所有权限规则和它们来自的 settings.json 文件。

24 

25* **Allow** 规则让 Claude Code 使用指定的工具而无需手动批准。

26* **Ask** 规则在 Claude Code 尝试使用指定工具时提示确认。

27* **Deny** 规则防止 Claude Code 使用指定的工具。

28 

29规则按顺序评估:**deny -> ask -> allow**。第一个匹配的规则获胜,因此 deny 规则始终优先。

30 

31## 权限模式

32 

33Claude Code 支持多种权限模式来控制工具的批准方式。请参阅[权限模式](/zh-CN/permission-modes)了解何时使用每种模式。在您的[设置文件](/zh-CN/settings#settings-files)中设置 `defaultMode`:

34 

35| 模式 | 描述 |

36| :------------------ | :------------------------------------------------------------------------------- |

37| `default` | 标准行为:在首次使用每个工具时提示权限 |

38| `acceptEdits` | 自动接受工作目录或 `additionalDirectories` 中路径的文件编辑和常见文件系统命令(`mkdir`、`touch`、`mv`、`cp` 等) |

39| `plan` | Plan Mode:Claude 可以分析但不能修改文件或执行命令 |

40| `auto` | 自动批准工具调用,并进行后台安全检查以验证操作与您的请求一致。目前处于研究预览阶段 |

41| `dontAsk` | 自动拒绝工具,除非通过 `/permissions` 或 `permissions.allow` 规则预先批准 |

42| `bypassPermissions` | 跳过所有权限提示。根目录和主目录删除操作(如 `rm -rf /`)仍会作为断路器提示 |

43 

44<Warning>

45 `bypassPermissions` 模式跳过所有权限提示,包括对 `.git`、`.claude`、`.vscode`、`.idea` 和 `.husky` 的写入。针对文件系统根目录或主目录的删除操作(如 `rm -rf /` 和 `rm -rf ~`)仍会作为断路器提示以防止模型错误。仅在隔离环境(如容器或虚拟机)中使用此模式,其中 Claude Code 无法造成损害。管理员可以通过在[托管设置](#managed-settings)中将 `permissions.disableBypassPermissionsMode` 设置为 `"disable"` 来防止此模式。

46</Warning>

47 

48为了防止使用 `bypassPermissions` 或 `auto` 模式,在任何[设置文件](/zh-CN/settings#settings-files)中将 `permissions.disableBypassPermissionsMode` 或 `permissions.disableAutoMode` 设置为 `"disable"`。这些在[托管设置](#managed-settings)中最有用,因为它们无法被覆盖。

49 

50## 权限规则语法

51 

52权限规则遵循格式 `Tool` 或 `Tool(specifier)`。

53 

54### 匹配工具的所有使用

55 

56要匹配工具的所有使用,只需使用工具名称而不带括号:

57 

58| 规则 | 效果 |

59| :--------- | :----------- |

60| `Bash` | 匹配所有 Bash 命令 |

61| `WebFetch` | 匹配所有网络获取请求 |

62| `Read` | 匹配所有文件读取 |

63 

64`Bash(*)` 等同于 `Bash` 并匹配所有 Bash 命令。

65 

66### 使用说明符进行细粒度控制

67 

68在括号中添加说明符以匹配特定的工具使用:

69 

70| 规则 | 效果 |

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

72| `Bash(npm run build)` | 匹配确切的命令 `npm run build` |

73| `Read(./.env)` | 匹配读取当前目录中的 `.env` 文件 |

74| `WebFetch(domain:example.com)` | 匹配对 example.com 的获取请求 |

75 

76### 通配符模式

77 

78Bash 规则支持带有 `*` 的 glob 模式。通配符可以出现在命令中的任何位置。此配置允许 npm 和 git commit 命令,同时阻止 git push:

79 

80```json theme={null}

81{

82 "permissions": {

83 "allow": [

84 "Bash(npm run *)",

85 "Bash(git commit *)",

86 "Bash(git * main)",

87 "Bash(* --version)",

88 "Bash(* --help *)"

89 ],

90 "deny": [

91 "Bash(git push *)"

92 ]

93 }

94}

95```

96 

97`*` 前的空格很重要:`Bash(ls *)` 匹配 `ls -la` 但不匹配 `lsof`,而 `Bash(ls*)` 匹配两者。`:*` 后缀是编写尾部通配符的等效方式,因此 `Bash(ls:*)` 匹配与 `Bash(ls *)` 相同的命令。

98 

99当您为命令前缀选择"是,不再询问"时,权限对话框会写入空格分隔的形式。`:*` 形式仅在模式末尾被识别。在像 `Bash(git:* push)` 这样的模式中,冒号被视为文字字符,不会匹配 git 命令。

100 

101## 工具特定的权限规则

102 

103### Bash

104 

105Bash 权限规则支持带有 `*` 的通配符匹配。通配符可以出现在命令中的任何位置,包括开头、中间或结尾:

106 

107* `Bash(npm run build)` 匹配确切的 Bash 命令 `npm run build`

108* `Bash(npm run test *)` 匹配以 `npm run test` 开头的 Bash 命令

109* `Bash(npm *)` 匹配任何以 `npm ` 开头的命令

110* `Bash(* install)` 匹配任何以 ` install` 结尾的命令

111* `Bash(git * main)` 匹配 `git checkout main` 和 `git log --oneline main` 等命令

112 

113单个 `*` 匹配任何字符序列,包括空格,因此一个通配符可以跨越多个参数。`Bash(git *)` 匹配 `git log --oneline --all`,`Bash(git * main)` 匹配 `git push origin main` 以及 `git merge main`。

114 

115当 `*` 出现在末尾且前面有空格时(如 `Bash(ls *)`),它强制执行单词边界,要求前缀后跟空格或字符串结尾。例如,`Bash(ls *)` 匹配 `ls -la` 但不匹配 `lsof`。相比之下,`Bash(ls*)` 没有空格匹配 `ls -la` 和 `lsof` 两者,因为没有单词边界约束。

116 

117#### 复合命令

118 

119<Tip>

120 Claude Code 知道 shell 运算符,所以像 `Bash(safe-cmd *)` 这样的规则不会给它权限运行命令 `safe-cmd && other-cmd`。识别的命令分隔符是 `&&`、`||`、`;`、`|`、`|&`、`&` 和换行符。规则必须独立匹配每个子命令。

121</Tip>

122 

123当您使用"是,不再询问"批准复合命令时,Claude Code 会为需要批准的每个子命令保存一个单独的规则,而不是为完整的复合字符串保存单个规则。例如,批准 `git status && npm test` 会为 `npm test` 保存一个规则,因此将来的 `npm test` 调用被识别,无论 `&&` 前面是什么。诸如 `cd` 进入子目录之类的子命令会为该路径生成自己的 Read 规则。单个复合命令最多可能保存 5 个规则。

124 

125#### 进程包装器

126 

127在匹配 Bash 规则之前,Claude Code 会剥离一组固定的进程包装器,因此像 `Bash(npm test *)` 这样的规则也匹配 `timeout 30 npm test`。识别的包装器是 `timeout`、`time`、`nice`、`nohup` 和 `stdbuf`。

128 

129裸 `xargs` 也被剥离,所以 `Bash(grep *)` 匹配 `xargs grep pattern`。剥离仅在 `xargs` 没有标志时适用:像 `xargs -n1 grep pattern` 这样的调用被匹配为 `xargs` 命令,因此为内部命令编写的规则不涵盖它。

130 

131此包装器列表是内置的,不可配置。开发环境运行器,如 `direnv exec`、`devbox run`、`mise exec`、`npx` 和 `docker exec` 不在列表中。因为这些工具将其参数作为命令执行,像 `Bash(devbox run *)` 这样的规则匹配 `run` 之后的任何内容,包括 `devbox run rm -rf .`。要批准环境运行器内的工作,请编写一个包含运行器和内部命令的特定规则,如 `Bash(devbox run npm test)`。为您想要允许的每个内部命令添加一个规则。

132 

133Exec 包装器,如 `watch`、`setsid`、`ionice` 和 `flock` 总是提示,无法通过像 `Bash(watch *)` 这样的前缀规则自动批准。同样适用于带有 `-exec` 或 `-delete` 的 `find`:`Bash(find *)` 规则不涵盖这些形式。要批准特定调用,请为完整命令字符串编写精确匹配规则。

134 

135#### 只读命令

136 

137Claude Code 将一组内置 Bash 命令识别为只读,并在每种模式下无需权限提示即可运行它们。这些包括 `ls`、`cat`、`head`、`tail`、`grep`、`find`、`wc`、`diff`、`stat`、`du`、`cd` 和 `git` 的只读形式。该集合不可配置;要对其中一个命令要求提示,请为其添加 `ask` 或 `deny` 规则。

138 

139对于每个标志都是只读的命令,允许未引用的 glob 模式,因此 `ls *.ts` 和 `wc -l src/*.py` 无需提示即可运行。带有写入能力或执行能力标志的命令,如 `find`、`sort`、`sed` 和 `git`,在存在未引用的 glob 时仍然提示,因为 glob 可能扩展为像 `-delete` 这样的标志。

140 

141`cd` 进入工作目录或[其他目录](#working-directories)内的路径也是只读的。像 `cd packages/api && ls` 这样的复合命令在每个部分都符合条件时无需提示即可运行。在一个复合命令中组合 `cd` 和 `git` 总是提示,无论目标目录如何。

142 

143<Warning>

144 尝试约束命令参数的 Bash 权限模式很脆弱。例如,`Bash(curl http://github.com/ *)` 旨在将 curl 限制为 GitHub URL,但不会匹配以下变体:

145 

146 * URL 前的选项:`curl -X GET http://github.com/...`

147 * 不同的协议:`curl https://github.com/...`

148 * 重定向:`curl -L http://bit.ly/xyz`(重定向到 github)

149 * 变量:`URL=http://github.com && curl $URL`

150 * 额外空格:`curl http://github.com`

151 

152 为了更可靠的 URL 过滤,请考虑:

153 

154 * **限制 Bash 网络工具**:使用 deny 规则阻止 `curl`、`wget` 和类似命令,然后对允许的域使用带有 `WebFetch(domain:github.com)` 权限的 WebFetch 工具

155 * **使用 PreToolUse hooks**:实现一个 hook 来验证 Bash 命令中的 URL 并阻止不允许的域

156 * 通过 CLAUDE.md 指示 Claude Code 关于您允许的 curl 模式

157 

158 请注意,仅使用 WebFetch 不会阻止网络访问。如果允许 Bash,Claude 仍然可以使用 `curl`、`wget` 或其他工具来访问任何 URL。

159</Warning>

160 

161### PowerShell

162 

163PowerShell 权限规则使用与 Bash 规则相同的形式。带有 `*` 的通配符可以在任何位置匹配,`:*` 后缀等同于尾部 ` *`,而裸 `PowerShell` 或 `PowerShell(*)` 匹配每个命令。此配置允许 `Get-ChildItem` 和 `git commit` 命令,同时阻止 `Remove-Item`:

164 

165```json theme={null}

166{

167 "permissions": {

168 "allow": [

169 "PowerShell(Get-ChildItem *)",

170 "PowerShell(git commit *)"

171 ],

172 "deny": [

173 "PowerShell(Remove-Item *)"

174 ]

175 }

176}

177```

178 

179常见别名在匹配前被规范化。为 cmdlet 名称编写的规则也匹配其别名,因此 `PowerShell(Get-ChildItem *)` 匹配 `gci`、`ls` 和 `dir`。匹配不区分大小写。

180 

181Claude Code 解析 PowerShell AST 并独立检查复合命令中的每个命令。管道运算符 `|`、语句分隔符 `;` 和 PowerShell 7+ 上的链运算符 `&&` 和 `||` 将复合命令分割为子命令。规则必须匹配每个子命令才能允许复合命令。

182 

183### Read 和 Edit

184 

185`Edit` 规则适用于所有编辑文件的内置工具。Claude 尽力将 `Read` 规则应用于所有读取文件的内置工具,如 Grep 和 Glob。

186 

187<Warning>

188 Read 和 Edit deny 规则适用于 Claude 的内置文件工具,不适用于 Bash 子进程。`Read(./.env)` deny 规则阻止 Read 工具,但不会阻止 Bash 中的 `cat .env`。为了获得阻止所有进程访问路径的 OS 级别强制执行,请[启用沙箱](/zh-CN/sandboxing)。

189</Warning>

190 

191Read 和 Edit 规则都遵循 [gitignore](https://git-scm.com/docs/gitignore) 规范,具有四种不同的模式类型:

192 

193| 模式 | 含义 | 示例 | 匹配 |

194| ----------------- | ------------------ | -------------------------------- | ------------------------------ |

195| `//path` | 来自文件系统根目录的**绝对**路径 | `Read(//Users/alice/secrets/**)` | `/Users/alice/secrets/**` |

196| `~/path` | 来自**主**目录的路径 | `Read(~/Documents/*.pdf)` | `/Users/alice/Documents/*.pdf` |

197| `/path` | **相对于项目根目录**的路径 | `Edit(/src/**/*.ts)` | `<project root>/src/**/*.ts` |

198| `path` 或 `./path` | **相对于当前目录**的路径 | `Read(*.env)` | `<cwd>/*.env` |

199 

200<Warning>

201 像 `/Users/alice/file` 这样的模式不是绝对路径。它相对于项目根目录。对于绝对路径,使用 `//Users/alice/file`。

202</Warning>

203 

204在 Windows 上,路径在匹配前被规范化为 POSIX 形式。`C:\Users\alice` 变成 `/c/Users/alice`,因此使用 `//c/**/.env` 来匹配该驱动器上的 `.env` 文件。要在所有驱动器上匹配,使用 `//**/.env`。

205 

206示例:

207 

208* `Edit(/docs/**)`:编辑 `<project>/docs/` 中的文件(不是 `/docs/` 也不是 `<project>/.claude/docs/`)

209* `Read(~/.zshrc)`:读取您主目录的 `.zshrc`

210* `Edit(//tmp/scratch.txt)`:编辑绝对路径 `/tmp/scratch.txt`

211* `Read(src/**)`:从 `<current-directory>/src/` 读取

212 

213<Note>

214 在 gitignore 模式中,`*` 匹配单个目录中的文件,而 `**` 递归匹配目录。要允许所有文件访问,只需使用工具名称而不带括号:`Read`、`Edit` 或 `Write`。

215</Note>

216 

217当 Claude 访问符号链接时,权限规则检查两个路径:符号链接本身和它解析到的文件。Allow 和 deny 规则对该对的处理方式不同:allow 规则回退到提示您,而 deny 规则直接阻止。

218 

219* **Allow 规则**:仅在符号链接路径及其目标都匹配时适用。允许目录内的符号链接指向其外部仍然会提示您。

220* **Deny 规则**:当符号链接路径或其目标匹配时适用。指向被拒绝文件的符号链接本身被拒绝。

221 

222例如,使用 `Read(./project/**)` 允许和 `Read(~/.ssh/**)` 拒绝,`./project/key` 处的符号链接指向 `~/.ssh/id_rsa` 被阻止:目标未通过 allow 规则,并匹配 deny 规则。

223 

224### WebFetch

225 

226* `WebFetch(domain:example.com)` 匹配对 example.com 的获取请求

227 

228### MCP

229 

230* `mcp__puppeteer` 匹配由 `puppeteer` 服务器提供的任何工具(在 Claude Code 中配置的名称)

231* `mcp__puppeteer__*` 通配符语法,也匹配来自 `puppeteer` 服务器的所有工具

232* `mcp__puppeteer__puppeteer_navigate` 匹配由 `puppeteer` 服务器提供的 `puppeteer_navigate` 工具

233 

234### Agent(subagents)

235 

236使用 `Agent(AgentName)` 规则来控制 Claude 可以使用哪些[子代理](/zh-CN/sub-agents):

237 

238* `Agent(Explore)` 匹配 Explore 子代理

239* `Agent(Plan)` 匹配 Plan 子代理

240* `Agent(my-custom-agent)` 匹配名为 `my-custom-agent` 的自定义子代理

241 

242将这些规则添加到您的设置中的 `deny` 数组,或使用 `--disallowedTools` CLI 标志来禁用特定代理。要禁用 Explore 代理:

243 

244```json theme={null}

245{

246 "permissions": {

247 "deny": ["Agent(Explore)"]

248 }

249}

250```

251 

252## 使用 hooks 扩展权限

253 

254[Claude Code hooks](/zh-CN/hooks-guide)提供了一种方法来注册自定义 shell 命令以在运行时执行权限评估。当 Claude Code 进行工具调用时,PreToolUse hooks 在权限提示之前运行。hook 输出可以拒绝工具调用、强制提示或跳过提示以让调用继续。

255 

256Hook 决定不会绕过权限规则。Deny 和 ask 规则在 hook 返回 `"allow"` 或 `"ask"` 后仍然被评估,因此匹配的 deny 规则仍然会阻止调用,匹配的 ask 规则即使在 hook 返回 `"allow"` 或 `"ask"` 时仍然提示。这保留了[管理权限](#manage-permissions)中描述的 deny 优先级,包括在托管设置中设置的 deny 规则。

257 

258阻止 hook 也优先于 allow 规则。以退出代码 2 退出的 hook 在权限规则被评估之前停止工具调用,因此即使 allow 规则会让调用继续,阻止也适用。要运行所有 Bash 命令而无需提示,除了您想要阻止的少数几个,将 `"Bash"` 添加到您的 allow 列表,并注册一个 PreToolUse hook 来拒绝那些特定命令。请参见[阻止对受保护文件的编辑](/zh-CN/hooks-guide#block-edits-to-protected-files)以获取您可以调整的 hook 脚本。

259 

260## 工作目录

261 

262默认情况下,Claude 可以访问启动它的目录中的文件。您可以扩展此访问:

263 

264* **启动期间**:使用 `--add-dir <path>` CLI 参数

265* **会话期间**:使用 `/add-dir` 命令

266* **持久配置**:添加到[设置文件](/zh-CN/settings#settings-files)中的 `additionalDirectories`

267 

268其他目录中的文件遵循与原始工作目录相同的权限规则:它们变为可读的而无需提示,文件编辑权限遵循当前权限模式。

269 

270### 其他目录授予文件访问权限,而不是配置

271 

272添加目录扩展 Claude 可以读取和编辑文件的位置。它不会使该目录成为完整的配置根目录:大多数 `.claude/` 配置不是从其他目录发现的,尽管有几种类型作为例外被加载。

273 

274以下配置类型从 `--add-dir` 目录加载:

275 

276| 配置 | 从 `--add-dir` 加载 |

277| :----------------------------------------------------------------- | :---------------------------------------------------------------------------------------------- |

278| `.claude/skills/` 中的 [Skills](/zh-CN/skills) | 是,带有实时重新加载 |

279| `.claude/settings.json` 中的插件设置 | 仅 `enabledPlugins` 和 `extraKnownMarketplaces` |

280| [CLAUDE.md](/zh-CN/memory) 文件、`.claude/rules/` 和 `CLAUDE.local.md` | 仅当设置 `CLAUDE_CODE_ADDITIONAL_DIRECTORIES_CLAUDE_MD=1` 时。`CLAUDE.local.md` 另外需要 `local` 设置源,默认启用 |

281 

282其他所有内容,包括子代理、命令、输出样式、hooks 和其他设置,仅从当前工作目录及其父目录、您在 `~/.claude/` 的用户目录和托管设置中发现。要在项目间共享该配置,请使用以下方法之一:

283 

284* **用户级配置**:将文件放在 `~/.claude/agents/`、`~/.claude/output-styles/` 或 `~/.claude/settings.json` 中,使其在每个项目中可用

285* **插件**:将配置打包并分发为[插件](/zh-CN/plugins),团队可以安装

286* **从配置目录启动**:从包含您想要的 `.claude/` 配置的目录运行 Claude Code

287 

288## 权限如何与沙箱交互

289 

290权限和[沙箱](/zh-CN/sandboxing)是互补的安全层:

291 

292* **权限**控制 Claude Code 可以使用哪些工具以及它可以访问哪些文件或域。它们适用于所有工具(Bash、Read、Edit、WebFetch、MCP 和其他)。

293* **沙箱**提供 OS 级别的强制执行,限制 Bash 工具的文件系统和网络访问。它仅适用于 Bash 命令及其子进程。

294 

295使用两者进行深度防御:

296 

297* 权限 deny 规则阻止 Claude 甚至尝试访问受限资源

298* 沙箱限制防止 Bash 命令到达定义边界之外的资源,即使提示注入绕过 Claude 的决策制定

299* 沙箱中的文件系统限制使用 Read 和 Edit deny 规则,而不是单独的沙箱配置

300* 网络限制结合 WebFetch 权限规则与沙箱的 `allowedDomains` 和 `deniedDomains` 列表

301 

302当沙箱启用 `autoAllowBashIfSandboxed: true`(这是默认值)时,沙箱化的 Bash 命令无需提示即可运行,即使您的权限包括 `ask: Bash(*)`。沙箱边界替代了每个命令的提示。显式 deny 规则仍然适用,针对 `/`、您的主目录或其他关键系统路径的 `rm` 或 `rmdir` 命令仍然会触发提示。请参见[沙箱模式](/zh-CN/sandboxing#sandbox-modes)以更改此行为。

303 

304## 托管设置

305 

306对于需要对 Claude Code 配置进行集中控制的组织,管理员可以部署无法被用户或项目设置覆盖的托管设置。这些策略设置遵循与常规设置文件相同的格式,可以通过 MDM/OS 级别策略、托管设置文件或[服务器托管设置](/zh-CN/server-managed-settings)传递。有关传递机制和文件位置,请参见[设置文件](/zh-CN/settings#settings-files)。

307 

308### 仅托管设置

309 

310以下设置仅在托管设置中有效。将它们放在用户或项目设置文件中无效。

311 

312| 设置 | 描述 |

313| :--------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

314| `allowedChannelPlugins` | 可能推送消息的频道插件的允许列表。设置时替换默认 Anthropic 允许列表。需要 `channelsEnabled: true`。请参见[限制哪些频道插件可以运行](/zh-CN/channels#restrict-which-channel-plugins-can-run) |

315| `allowManagedHooksOnly` | 当为 `true` 时,仅加载托管 hooks、SDK hooks 和托管设置 `enabledPlugins` 中强制启用的插件中的 hooks。用户、项目和所有其他插件 hooks 被阻止 |

316| `allowManagedMcpServersOnly` | 当为 `true` 时,仅尊重来自托管设置的 `allowedMcpServers`。`deniedMcpServers` 仍然从所有来源合并。请参见[托管 MCP 配置](/zh-CN/mcp#managed-mcp-configuration) |

317| `allowManagedPermissionRulesOnly` | 当为 `true` 时,防止用户和项目设置定义 `allow`、`ask` 或 `deny` 权限规则。仅应用托管设置中的规则 |

318| `blockedMarketplaces` | 市场来源的黑名单。在下载前检查被阻止的来源,因此它们永远不会接触文件系统。请参见[托管市场限制](/zh-CN/plugin-marketplaces#managed-marketplace-restrictions) |

319| `channelsEnabled` | 允许 Team 和 Enterprise 用户使用[频道](/zh-CN/channels)。未设置或 `false` 会阻止频道消息传递,无论用户传递什么给 `--channels` |

320| `forceRemoteSettingsRefresh` | 当为 `true` 时,阻止 CLI 启动直到远程托管设置被新鲜获取,如果获取失败则退出。请参见[故障关闭强制执行](/zh-CN/server-managed-settings#enforce-fail-closed-startup) |

321| `pluginTrustMessage` | 自定义消息,附加到安装前显示的插件信任警告 |

322| `sandbox.filesystem.allowManagedReadPathsOnly` | 当为 `true` 时,仅尊重来自托管设置的 `filesystem.allowRead` 路径。`denyRead` 仍然从所有来源合并 |

323| `sandbox.network.allowManagedDomainsOnly` | 当为 `true` 时,仅尊重来自托管设置的 `allowedDomains` 和 `WebFetch(domain:...)` allow 规则。非允许的域被自动阻止,不提示用户。被拒绝的域仍然从所有来源合并 |

324| `strictKnownMarketplaces` | 控制用户可以添加和安装插件的插件市场来源。请参见[托管市场限制](/zh-CN/plugin-marketplaces#managed-marketplace-restrictions) |

325| `wslInheritsWindowsSettings` | 当在 Windows HKLM 注册表项或 `C:\Program Files\ClaudeCode\managed-settings.json` 中为 `true` 时,WSL 除了从 `/etc/claude-code` 读取托管设置外,还从 Windows 策略链读取托管设置。请参见[设置文件](/zh-CN/settings#settings-files) |

326 

327`disableBypassPermissionsMode` 通常放在托管设置中以强制执行组织策略,但它可以从任何范围工作。用户可以在自己的设置中设置它以将自己锁定在绕过模式之外。

328 

329<Note>

330 对[远程控制](/zh-CN/remote-control)和[网络会话](/zh-CN/claude-code-on-the-web)的访问不由托管设置密钥控制。在 Team 和 Enterprise 计划上,管理员在[Claude Code 管理设置](https://claude.ai/admin-settings/claude-code)中启用或禁用这些功能。

331</Note>

332 

333## 设置优先级

334 

335权限规则遵循与所有其他 Claude Code 设置相同的[设置优先级](/zh-CN/settings#settings-precedence):

336 

3371. **托管设置**:无法被任何其他级别覆盖,包括命令行参数

3382. **命令行参数**:临时会话覆盖

3393. **本地项目设置**(`.claude/settings.local.json`)

3404. **共享项目设置**(`.claude/settings.json`)

3415. **用户设置**(`~/.claude/settings.json`)

342 

343如果工具在任何级别被拒绝,没有其他级别可以允许它。例如,托管设置 deny 无法被 `--allowedTools` 覆盖,`--disallowedTools` 可以添加超出托管设置定义的限制。

344 

345如果权限在用户设置中被允许但在项目设置中被拒绝,项目设置优先,权限被阻止。

346 

347## 示例配置

348 

349此[存储库](https://github.com/anthropics/claude-code/tree/main/examples/settings)包括常见部署场景的启动设置配置。将这些用作起点并根据您的需要调整它们。

350 

351## 另请参见

352 

353* [Settings](/zh-CN/settings):完整的配置参考,包括权限设置表

354* [Configure auto mode](/zh-CN/auto-mode-config):告诉自动模式分类器您的组织信任哪些基础设施

355* [Sandboxing](/zh-CN/sandboxing):Bash 命令的 OS 级文件系统和网络隔离

356* [Authentication](/zh-CN/authentication):设置用户对 Claude Code 的访问

357* [Security](/zh-CN/security):安全保障和最佳实践

358* [Hooks](/zh-CN/hooks-guide):自动化工作流并扩展权限评估

platforms.md +78 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 平台和集成

6 

7> 选择在哪里运行 Claude Code 以及连接什么工具。比较 CLI、Desktop、VS Code、JetBrains、Web 以及 Chrome、Slack 和 CI/CD 等集成。

8 

9Claude Code 在任何地方运行相同的底层引擎,但每个界面都针对不同的工作方式进行了优化。本页面帮助您为工作流选择合适的平台,并连接您已经使用的工具。

10 

11## 在哪里运行 Claude Code

12 

13根据您喜欢的工作方式和项目所在位置选择平台。

14 

15| 平台 | 最适合 | 您获得的功能 |

16| :----------------------------------- | :------------------------------------------------ | :-------------------------------------------------------------------------------------------------------------------------------- |

17| [CLI](/zh-CN/quickstart) | 终端工作流、脚本编写、远程服务器 | 完整功能集、[Agent SDK](/zh-CN/headless)、第三方提供商 |

18| [Desktop](/zh-CN/desktop) | 视觉审查、并行会话、托管设置 | Diff 查看器、应用预览、Pro 和 Max 上的[计算机使用](/zh-CN/desktop#let-claude-use-your-computer)和 [Dispatch](/zh-CN/desktop#sessions-from-dispatch) |

19| [VS Code](/zh-CN/vs-code) | 在 VS Code 内工作而无需切换到终端 | 内联 diff、集成终端、文件上下文 |

20| [JetBrains](/zh-CN/jetbrains) | 在 IntelliJ、PyCharm、WebStorm 或其他 JetBrains IDE 内工作 | Diff 查看器、选择共享、终端会话 |

21| [Web](/zh-CN/claude-code-on-the-web) | 不需要太多操作的长时间运行任务,或应该在您离线时继续的工作 | Anthropic 托管云、断开连接后继续运行 |

22 

23CLI 是终端原生工作的最完整界面:脚本编写、第三方提供商和 Agent SDK 仅限 CLI。Desktop 和 IDE 扩展为了视觉审查和更紧密的编辑器集成而放弃了一些仅限 CLI 的功能。Web 在 Anthropic 的云中运行,因此任务在您断开连接后继续进行。

24 

25您可以在同一项目上混合使用多个界面。配置、项目内存和 MCP 服务器在本地界面之间共享。

26 

27## 连接您的工具

28 

29集成让 Claude 与代码库外的服务协作。

30 

31| 集成 | 功能 | 用途 |

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

33| [Chrome](/zh-CN/chrome) | 使用您登录的会话控制浏览器 | 测试 Web 应用、填充表单、自动化没有 API 的网站 |

34| [GitHub Actions](/zh-CN/github-actions) | 在 CI 管道中运行 Claude | 自动化 PR 审查、问题分类、计划维护 |

35| [GitLab CI/CD](/zh-CN/gitlab-ci-cd) | 与 GitHub Actions 相同,但用于 GitLab | GitLab 上的 CI 驱动自动化 |

36| [Code Review](/zh-CN/code-review) | 自动审查每个 PR | 在人工审查前捕获错误 |

37| [Slack](/zh-CN/slack) | 响应频道中的 `@Claude` 提及 | 将错误报告转换为团队聊天中的拉取请求 |

38 

39对于此处未列出的集成,[MCP 服务器](/zh-CN/mcp)和[连接器](/zh-CN/desktop#connect-external-tools)让您连接几乎任何东西:Linear、Notion、Google Drive 或您自己的内部 API。

40 

41## 远离终端时工作

42 

43Claude Code offers several ways to work when you're not at your terminal. They differ in what triggers the work, where Claude runs, and how much you need to set up.

44 

45| | Trigger | Claude runs on | Setup | Best for |

46| :--------------------------------------------- | :--------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------ |

47| [Dispatch](/en/desktop#sessions-from-dispatch) | Message a task from the Claude mobile app | Your machine (Desktop) | [Pair the mobile app with Desktop](https://support.claude.com/en/articles/13947068) | Delegating work while you're away, minimal setup |

48| [Remote Control](/en/remote-control) | Drive a running session from [claude.ai/code](https://claude.ai/code) or the Claude mobile app | Your machine (CLI or VS Code) | Run `claude remote-control` | Steering in-progress work from another device |

49| [Channels](/en/channels) | Push events from a chat app like Telegram or Discord, or your own server | Your machine (CLI) | [Install a channel plugin](/en/channels#quickstart) or [build your own](/en/channels-reference) | Reacting to external events like CI failures or chat messages |

50| [Slack](/en/slack) | Mention `@Claude` in a team channel | Anthropic cloud | [Install the Slack app](/en/slack#setting-up-claude-code-in-slack) with [Claude Code on the web](/en/claude-code-on-the-web) enabled | PRs and reviews from team chat |

51| [Scheduled tasks](/en/scheduled-tasks) | Set a schedule | [CLI](/en/scheduled-tasks), [Desktop](/en/desktop-scheduled-tasks), or [cloud](/en/routines) | Pick a frequency | Recurring automation like daily reviews |

52 

53如果您不确定从哪里开始,[安装 CLI](/zh-CN/quickstart) 并在项目目录中运行它。如果您不想使用终端,[Desktop](/zh-CN/desktop-quickstart) 为您提供相同的引擎和图形界面。

54 

55## 相关资源

56 

57### 平台

58 

59* [CLI 快速入门](/zh-CN/quickstart):在终端中安装并运行您的第一个命令

60* [Desktop](/zh-CN/desktop):视觉 diff 审查、并行会话、计算机使用和 Dispatch

61* [VS Code](/zh-CN/vs-code):编辑器内的 Claude Code 扩展

62* [JetBrains](/zh-CN/jetbrains):IntelliJ、PyCharm 和其他 JetBrains IDE 的扩展

63* [Web 上的 Claude Code](/zh-CN/claude-code-on-the-web):断开连接时继续运行的云会话

64 

65### 集成

66 

67* [Chrome](/zh-CN/chrome):使用您登录的会话自动化浏览器任务

68* [GitHub Actions](/zh-CN/github-actions):在 CI 管道中运行 Claude

69* [GitLab CI/CD](/zh-CN/gitlab-ci-cd):GitLab 的相同功能

70* [Code Review](/zh-CN/code-review):每个拉取请求上的自动审查

71* [Slack](/zh-CN/slack):从团队聊天发送任务,获取 PR 返回

72 

73### 远程访问

74 

75* [Dispatch](/zh-CN/desktop#sessions-from-dispatch):从您的手机发送任务,它可以生成 Desktop 会话

76* [Remote Control](/zh-CN/remote-control):从您的手机或浏览器驱动运行中的会话

77* [Channels](/zh-CN/channels):将来自聊天应用或您自己的服务器的事件推送到会话中

78* [Scheduled tasks](/zh-CN/scheduled-tasks):按定期计划运行提示

plugin-dependencies.md +153 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 约束插件依赖版本

6 

7> 在插件依赖上声明版本约束,以便当上游插件发布破坏性变更时,你的插件继续正常工作。

8 

9插件可以通过在 `plugin.json` 或其 marketplace 条目中列出其他插件来依赖它们。默认情况下,依赖会跟踪最新可用版本,因此上游发布可能会在没有警告的情况下更改你的插件下的依赖。版本约束让你可以将依赖保持在经过测试的版本范围内,直到你选择升级。

10 

11当你安装声明了依赖的插件时,Claude Code 会自动解析并安装它们,并在安装输出的末尾列出添加了哪些依赖。如果依赖后来丢失,`/reload-plugins` 和后台插件自动更新会重新安装它,前提是其 marketplace 已在你配置的 marketplace 中。重新运行 `claude plugin install` 在依赖插件上,或使用 `claude plugin marketplace add` 添加 marketplace,也会解析任何未解决的缺失依赖。来自你尚未添加的 marketplace 的依赖将保持未解析状态。

12 

13本指南适用于在 `plugin.json` 中声明依赖的插件作者和标记发布的 marketplace 维护者。要安装具有依赖的插件,请参阅[发现和安装插件](/zh-CN/discover-plugins)。有关完整的 manifest 架构,请参阅[插件参考](/zh-CN/plugins-reference)。

14 

15<Note>

16 依赖版本约束需要 Claude Code v2.1.110 或更高版本。

17</Note>

18 

19## 为什么要约束依赖版本

20 

21考虑一个内部 marketplace,其中两个团队发布插件。平台团队维护 `secrets-vault`,这是一个包装 secrets 后端的 MCP 服务器。部署团队维护 `deploy-kit`,它在部署期间调用 `secrets-vault` 来获取凭证。

22 

23`deploy-kit` 针对 `secrets-vault` v2.1.0 进行了测试。没有版本约束的情况下,下次平台团队标记一个重命名 MCP 工具的发布时,自动更新会将每个工程师的 `secrets-vault` 移动到新版本,`deploy-kit` 就会中断。

24 

25有了版本约束,`deploy-kit` 声明它需要 `secrets-vault` 在 `~2.1.0` 范围内。安装了 `deploy-kit` 的工程师会停留在最高匹配的 `2.1.x` 补丁版本上。部署团队通过发布具有更宽松约束的新 `deploy-kit` 版本,按照自己的时间表进行升级。

26 

27## 声明具有版本约束的依赖

28 

29在插件的 `.claude-plugin/plugin.json` 的 `dependencies` 数组中列出依赖。每个条目要么是插件名称,要么是具有版本约束的对象。

30 

31以下 manifest 声明了一个无版本依赖和一个受约束的依赖:

32 

33```json .claude-plugin/plugin.json theme={null}

34{

35 "name": "deploy-kit",

36 "version": "3.1.0",

37 "dependencies": [

38 "audit-logger",

39 { "name": "secrets-vault", "version": "~2.1.0" }

40 ]

41}

42```

43 

44条目可以是仅包含插件名称的裸字符串,如上例中的 `"audit-logger"`,它依赖于该插件的 marketplace 提供的任何版本。为了获得更多控制,请使用具有以下字段的对象:

45 

46| 字段 | 类型 | 描述 |

47| :------------ | :----- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

48| `name` | string | 插件名称。在与声明插件相同的 marketplace 中解析。必需。 |

49| `version` | string | 一个 [semver 范围](https://github.com/npm/node-semver#ranges),例如 `~2.1.0`、`^2.0`、`>=1.4` 或 `=2.1.0`。依赖会在满足此范围的最高标记版本处获取。 |

50| `marketplace` | string | 一个不同的 marketplace 来在其中解析 `name`。跨 marketplace 依赖被阻止,除非目标 marketplace 在根 marketplace 的 `marketplace.json` 中的 [`allowCrossMarketplaceDependenciesOn`](#depend-on-a-plugin-from-another-marketplace) 中列出。 |

51 

52`version` 字段接受 Node 的 `semver` 包支持的任何表达式,包括 caret、tilde、hyphen 和 comparator 范围。预发布版本(如 `2.0.0-beta.1`)被排除,除非你的范围使用预发布后缀(如 `^2.0.0-0`)选择加入。

53 

54## 依赖来自另一个 marketplace 的插件

55 

56默认情况下,Claude Code 拒绝自动安装位于与声明它的插件不同的 marketplace 中的依赖。这可以防止一个 marketplace 无声地从你未审查的来源拉入插件。

57 

58要允许这样做,根 marketplace 的维护者将目标 marketplace 名称添加到 `marketplace.json` 中的 `allowCrossMarketplaceDependenciesOn`。根 marketplace 是托管用户正在安装的插件的那个;只有其允许列表被查询,因此信任不会通过中间 marketplace 链接。

59 

60以下 `marketplace.json` 允许 `deploy-kit` 依赖来自 `acme-shared` 的插件:

61 

62```json .claude-plugin/marketplace.json theme={null}

63{

64 "name": "acme-tools",

65 "owner": { "name": "Acme" },

66 "allowCrossMarketplaceDependenciesOn": ["acme-shared"],

67 "plugins": [

68 {

69 "name": "deploy-kit",

70 "source": "./deploy-kit",

71 "dependencies": [

72 { "name": "audit-logger", "marketplace": "acme-shared" }

73 ]

74 }

75 ]

76}

77```

78 

79如果字段缺失或不包含目标 marketplace,安装会失败并显示 `cross-marketplace` 错误,命名要设置的字段。用户仍然可以手动先安装依赖,这会满足约束而无需更改允许列表。

80 

81## 标记插件发布以进行版本解析

82 

83版本约束针对 marketplace 存储库上的 git 标签进行解析。为了让 Claude Code 找到依赖的可用版本,上游插件的发布必须使用特定的命名约定进行标记。

84 

85将每个发布标记为 `{plugin-name}--v{version}`,其中 `{version}` 与该提交的 `plugin.json` 中的 `version` 字段匹配。从插件目录中,运行:

86 

87```bash theme={null}

88claude plugin tag --push

89```

90 

91`claude plugin tag` 命令从插件的清单和封闭的 marketplace 条目派生标签名称。在创建标签之前,它验证插件内容,检查 `plugin.json` 和 marketplace 条目是否在版本上一致,要求插件目录下的工作树干净,如果标签已存在则拒绝。添加 `--dry-run` 以查看将被标记的内容而不创建它。如果你自己保持 `plugin.json` 和 marketplace 条目同步,直接运行 `git tag secrets-vault--v2.1.0` 是等效的。

92 

93插件名称前缀让一个 marketplace 存储库可以托管多个具有独立版本线的插件。`--v` 分隔符被解析为完整插件名称上的前缀匹配,因此包含连字符的插件名称会被正确处理。

94 

95当你安装声明了 `{ "name": "secrets-vault", "version": "~2.1.0" }` 的插件时,Claude Code 会列出 marketplace 的标签,过滤到以 `secrets-vault--v` 开头的标签,并获取满足 `~2.1.0` 的最高版本。如果不存在匹配的标签,依赖插件会被禁用并显示错误,列出可用的版本。

96 

97已解析标签的 semver 与 `plugin.json` 的 `version` 分开记录,因此约束检查使用实际获取的标签,即使该提交处的 `plugin.json` 有过时的值。标签解析安装的缓存目录名称包含 12 字符的 commit-SHA 后缀,因此如果维护者强制将标签移动到不同的提交,下次安装会获得一个新的缓存目录,而不是重用过时的内容。

98 

99<Note>

100 对于 `npm` marketplace 源,约束不控制获取哪个版本,因为基于标签的解析仅适用于 git 支持的源。约束仍在加载时被检查,如果安装的版本不满足它,依赖插件会被禁用并显示 `dependency-version-unsatisfied`。

101</Note>

102 

103## 约束如何相互作用

104 

105当多个已安装的插件约束同一依赖时,Claude Code 会交集它们的范围,并将依赖解析为满足所有范围的最高版本。下表显示了常见组合如何解析。

106 

107| 插件 A 需要 | 插件 B 需要 | 结果 |

108| :------- | :------ | :---------------------------------------------- |

109| `^2.0` | `>=2.1` | 在最高 `2.x` 标签处进行一次安装,该标签在 `2.1.0` 或更高版本。两个插件都加载。 |

110| `~2.1` | `~3.0` | 插件 B 的安装失败,显示 `range-conflict`。插件 A 和依赖保持原样。 |

111| `=2.1.0` | 无 | 依赖保持在 `2.1.0`。在安装了插件 A 时,自动更新会跳过较新版本。 |

112 

113自动更新在满足每个已安装插件范围的最高 git 标签处获取受约束的依赖,而不是在 marketplace 的最新版本处,因此依赖继续在其允许的范围内接收更新。如果没有标签满足所有范围,更新会被跳过,跳过消息会出现在 `/doctor` 和 `/plugin` 错误选项卡中,并命名约束插件。

114 

115当你卸载最后一个约束依赖的插件时,该依赖不再被保持,并在下次更新时恢复跟踪其 marketplace 条目。

116 

117## 删除孤立的自动安装依赖

118 

119自动安装的依赖在安装它们的插件被卸载后仍会保留在磁盘上,以防你重新安装依赖插件或想继续直接使用该依赖。要清理它们,运行 `claude plugin prune` 来列出不再有任何已安装插件需要的自动安装依赖,并在确认提示后删除它们。这需要 Claude Code v2.1.121 或更高版本。

120 

121```bash theme={null}

122claude plugin prune

123```

124 

125默认情况下,prune 在用户范围内运行。使用 `--scope project` 或 `--scope local` 来针对不同的范围。传递 `--dry-run` 来列出将被删除的内容而不进行任何更改。传递 `-y` 来跳过确认提示。当 stdin 或 stdout 不是终端时,prune 会列出孤立项并退出,除非传递了 `-y`。

126 

127要在卸载过程中进行 prune,请将 `--prune` 传递给 `claude plugin uninstall`。删除命名的插件后,Claude Code 会扫描并删除现在孤立的任何自动安装依赖。你自己安装的插件永远不会被 prune,只有通过另一个插件的 `dependencies` 数组自动安装的插件才会被 prune。

128 

129例如,要卸载 `deploy-kit` 并清理它留下的依赖:

130 

131```bash theme={null}

132claude plugin uninstall deploy-kit --prune

133```

134 

135## 解决依赖错误

136 

137依赖问题会在 `claude plugin list`、`/plugin` 界面和 `/doctor` 中显示。受影响的插件会被禁用,直到你解决错误。最常见的错误及其修复方法如下所示。

138 

139| 错误 | 含义 | 如何解决 |

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

141| `dependency-unsatisfied` | 声明的依赖未安装,或已安装但被禁用。 | 运行错误消息中显示的 `claude plugin install` 命令。如果依赖的 marketplace 尚未配置,使用 `claude plugin marketplace add` 添加它,Claude Code 会自动解析依赖。如果依赖被禁用,请启用它。 |

142| `range-conflict` | 依赖的版本要求无法组合。错误消息命名原因:没有版本满足所有范围,范围不是有效的 semver 语法,或组合范围太复杂而无法交集。 | 卸载或更新其中一个冲突的插件,修复任何无效的 `version` 字符串,简化长 `\|\|` 链,或要求上游作者扩大其约束。 |

143| `dependency-version-unsatisfied` | 已安装的依赖版本在此插件的声明范围之外。 | 运行 `claude plugin install <dependency>@<marketplace>` 以根据所有当前约束重新解析依赖。 |

144| `no-matching-tag` | 依赖的存储库没有满足范围的 `{name}--v*` 标签。 | 检查上游是否使用上述约定标记了发布,或放宽你的范围。 |

145 

146要以编程方式检查这些错误,请运行 `claude plugin list --json` 并读取每个插件上的 `errors` 字段。

147 

148## 另请参阅

149 

150* [创建插件](/zh-CN/plugins):使用 skills、agents 和 hooks 构建插件

151* [创建和分发插件 marketplace](/zh-CN/plugin-marketplaces):为你的团队托管插件

152* [插件参考](/zh-CN/plugins-reference#plugin-manifest-schema):完整的 `plugin.json` 架构

153* [版本管理](/zh-CN/plugins-reference#version-management):插件自身版本如何被解析并用作缓存键

plugin-marketplaces.md +1054 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 创建和分发 plugin marketplace

6 

7> 构建和托管 plugin marketplace,以在团队和社区中分发 Claude Code 扩展。

8 

9**plugin marketplace** 是一个目录,让你能够将 plugins 分发给他人。Marketplace 提供集中式发现、版本跟踪、自动更新以及对多种源类型(git 存储库、本地路径等)的支持。本指南展示了如何创建自己的 marketplace,与你的团队或社区共享 plugins。

10 

11想要从现有 marketplace 安装 plugins?请参阅[发现和安装预构建的 plugins](/zh-CN/discover-plugins)。

12 

13## 概述

14 

15创建和分发 marketplace 涉及:

16 

171. **创建 plugins**:使用 skills、agents、hooks、MCP servers 或 LSP servers 构建一个或多个 plugins。本指南假设你已经有要分发的 plugins;有关如何创建 plugins 的详细信息,请参阅[创建 plugins](/zh-CN/plugins)。

182. **创建 marketplace 文件**:定义一个 `marketplace.json`,列出你的 plugins 及其位置(请参阅[创建 marketplace 文件](#create-the-marketplace-file))。

193. **托管 marketplace**:推送到 GitHub、GitLab 或其他 git 主机(请参阅[托管和分发 marketplaces](#host-and-distribute-marketplaces))。

204. **与用户共享**:用户使用 `/plugin marketplace add` 添加你的 marketplace 并安装单个 plugins(请参阅[发现和安装 plugins](/zh-CN/discover-plugins))。

21 

22一旦你的 marketplace 上线,你可以通过推送更改到你的存储库来更新它。用户使用 `/plugin marketplace update` 刷新他们的本地副本。

23 

24## 演练:创建本地 marketplace

25 

26此示例创建一个包含一个 plugin 的 marketplace:一个用于代码审查的 `/quality-review` skill。你将创建目录结构、添加 skill、创建 plugin manifest 和 marketplace 目录,然后安装并测试它。

27 

28<Steps>

29 <Step title="创建目录结构">

30 ```bash theme={null}

31 mkdir -p my-marketplace/.claude-plugin

32 mkdir -p my-marketplace/plugins/quality-review-plugin/.claude-plugin

33 mkdir -p my-marketplace/plugins/quality-review-plugin/skills/quality-review

34 ```

35 </Step>

36 

37 <Step title="创建 skill">

38 创建一个 `SKILL.md` 文件,定义 `/quality-review` skill 的功能。

39 

40 ```markdown my-marketplace/plugins/quality-review-plugin/skills/quality-review/SKILL.md theme={null}

41 ---

42 description: Review code for bugs, security, and performance

43 disable-model-invocation: true

44 ---

45 

46 Review the code I've selected or the recent changes for:

47 - Potential bugs or edge cases

48 - Security concerns

49 - Performance issues

50 - Readability improvements

51 

52 Be concise and actionable.

53 ```

54 </Step>

55 

56 <Step title="创建 plugin manifest">

57 创建一个 `plugin.json` 文件,描述该 plugin。manifest 位于 `.claude-plugin/` 目录中。

58 

59 ```json my-marketplace/plugins/quality-review-plugin/.claude-plugin/plugin.json theme={null}

60 {

61 "name": "quality-review-plugin",

62 "description": "Adds a /quality-review skill for quick code reviews",

63 "version": "1.0.0"

64 }

65 ```

66 

67 <Note>

68 设置 `version` 意味着用户仅在你更改此字段时才会收到更新,因此在每次发布时都要提升版本号。如果你省略 `version` 并在 git 中托管此 marketplace,每次提交都会自动计为新版本。请参阅 [版本解析](#version-resolution-and-release-channels) 以选择正确的方法。

69 </Note>

70 </Step>

71 

72 <Step title="创建 marketplace 文件">

73 创建列出你的 plugin 的 marketplace 目录。

74 

75 ```json my-marketplace/.claude-plugin/marketplace.json theme={null}

76 {

77 "name": "my-plugins",

78 "owner": {

79 "name": "Your Name"

80 },

81 "plugins": [

82 {

83 "name": "quality-review-plugin",

84 "source": "./plugins/quality-review-plugin",

85 "description": "Adds a /quality-review skill for quick code reviews"

86 }

87 ]

88 }

89 ```

90 </Step>

91 

92 <Step title="添加和安装">

93 添加 marketplace 并安装 plugin。

94 

95 ```shell theme={null}

96 /plugin marketplace add ./my-marketplace

97 /plugin install quality-review-plugin@my-plugins

98 ```

99 </Step>

100 

101 <Step title="尝试一下">

102 在编辑器中选择一些代码并运行你的新 skill。

103 

104 ```shell theme={null}

105 /quality-review

106 ```

107 </Step>

108</Steps>

109 

110要了解更多关于 plugins 可以做什么的信息,包括 hooks、agents、MCP servers 和 LSP servers,请参阅 [Plugins](/zh-CN/plugins)。

111 

112<Note>

113 **plugins 如何安装**:当用户安装 plugin 时,Claude Code 将 plugin 目录复制到缓存位置。这意味着 plugins 无法使用 `../shared-utils` 之类的路径引用其目录外的文件,因为这些文件不会被复制。

114 

115 如果你需要在 plugins 之间共享文件,请使用符号链接。有关详细信息,请参阅 [Plugin 缓存和文件解析](/zh-CN/plugins-reference#plugin-caching-and-file-resolution)。

116</Note>

117 

118## 创建 marketplace 文件

119 

120在你的存储库根目录中创建 `.claude-plugin/marketplace.json`。此文件定义你的 marketplace 的名称、所有者信息以及包含其源的 plugins 列表。

121 

122每个 plugin 条目至少需要一个 `name` 和 `source`(从哪里获取它)。有关所有可用字段,请参阅下面的[完整架构](#marketplace-schema)。

123 

124```json theme={null}

125{

126 "name": "company-tools",

127 "owner": {

128 "name": "DevTools Team",

129 "email": "devtools@example.com"

130 },

131 "plugins": [

132 {

133 "name": "code-formatter",

134 "source": "./plugins/formatter",

135 "description": "Automatic code formatting on save",

136 "version": "2.1.0",

137 "author": {

138 "name": "DevTools Team"

139 }

140 },

141 {

142 "name": "deployment-tools",

143 "source": {

144 "source": "github",

145 "repo": "company/deploy-plugin"

146 },

147 "description": "Deployment automation tools"

148 }

149 ]

150}

151```

152 

153## Marketplace 架构

154 

155### 必需字段

156 

157| 字段 | 类型 | 描述 | 示例 |

158| :-------- | :----- | :---------------------------------------------------------------------------------------------------------- | :------------- |

159| `name` | string | Marketplace 标识符(kebab-case,无空格)。这是面向公众的:用户在安装 plugins 时会看到它(例如,`/plugin install my-tool@your-marketplace`)。 | `"acme-tools"` |

160| `owner` | object | Marketplace 维护者信息([见下面的字段](#owner-fields)) | |

161| `plugins` | array | 可用 plugins 列表 | 见下文 |

162 

163<Note>

164 **保留名称**:以下 marketplace 名称为 Anthropic 官方使用保留,第三方 marketplaces 无法使用:`claude-code-marketplace`、`claude-code-plugins`、`claude-plugins-official`、`anthropic-marketplace`、`anthropic-plugins`、`agent-skills`、`knowledge-work-plugins`、`life-sciences`。冒充官方 marketplaces 的名称(如 `official-claude-plugins` 或 `anthropic-tools-v2`)也被阻止。

165</Note>

166 

167### 所有者字段

168 

169| 字段 | 类型 | 必需 | 描述 |

170| :------ | :----- | :- | :--------- |

171| `name` | string | 是 | 维护者或团队的名称 |

172| `email` | string | 否 | 维护者的联系电子邮件 |

173 

174### 可选字段

175 

176| 字段 | 类型 | 描述 |

177| :------------------------------------ | :----- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

178| `$schema` | string | 用于编辑器自动完成和验证的 JSON Schema URL。Claude Code 在加载时忽略此字段。 |

179| `description` | string | 简短的 marketplace 描述 |

180| `version` | string | Marketplace 清单版本 |

181| `metadata.pluginRoot` | string | 前置到相对 plugin 源路径的基目录(例如,`"./plugins"` 让你写 `"source": "formatter"` 而不是 `"source": "./plugins/formatter"`) |

182| `allowCrossMarketplaceDependenciesOn` | array | 此 marketplace 中的 plugins 可能依赖的其他 marketplaces。来自此处未列出的 marketplace 的依赖项在安装时被阻止。见[依赖来自另一个 marketplace 的 plugin](/zh-CN/plugin-dependencies#depend-on-a-plugin-from-another-marketplace)。 |

183 

184`description` 和 `version` 也可以在 `metadata` 下接受,以实现向后兼容性。

185 

186## Plugin 条目

187 

188`plugins` 数组中的每个 plugin 条目描述一个 plugin 及其位置。你可以包含 [plugin manifest 架构](/zh-CN/plugins-reference#plugin-manifest-schema)中的任何字段(如 `description`、`version`、`author`、`commands`、`hooks` 等),加上这些 marketplace 特定的字段:`source`、`category`、`tags` 和 `strict`。

189 

190### 必需字段

191 

192| 字段 | 类型 | 描述 |

193| :------- | :------------- | :----------------------------------------------------------------------------------------- |

194| `name` | string | Plugin 标识符(kebab-case,无空格)。这是面向公众的:用户在安装时会看到它(例如,`/plugin install my-plugin@marketplace`)。 |

195| `source` | string\|object | 从哪里获取 plugin(见下面的 [Plugin 源](#plugin-sources)) |

196 

197### 可选 plugin 字段

198 

199**标准元数据字段:**

200 

201| 字段 | 类型 | 描述 |

202| :------------ | :------ | :--------------------------------------------------------------------------------------------------------------------------------------------- |

203| `description` | string | 简短的 plugin 描述 |

204| `version` | string | Plugin 版本。如果设置(在此处或在 `plugin.json` 中),plugin 将固定到此字符串,用户仅在其更改时才会收到更新。省略以回退到 git commit SHA。见 [版本解析](#version-resolution-and-release-channels)。 |

205| `author` | object | Plugin 作者信息(`name` 必需,`email` 可选) |

206| `homepage` | string | Plugin 主页或文档 URL |

207| `repository` | string | 源代码存储库 URL |

208| `license` | string | SPDX 许可证标识符(例如,MIT、Apache-2.0) |

209| `keywords` | array | 用于 plugin 发现和分类的标签 |

210| `category` | string | Plugin 类别以供组织 |

211| `tags` | array | 用于可搜索性的标签 |

212| `strict` | boolean | 控制 `plugin.json` 是否是组件定义的权威(默认:true)。见下面的 [Strict 模式](#strict-mode)。 |

213 

214**组件配置字段:**

215 

216| 字段 | 类型 | 描述 |

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

218| `skills` | string\|array | 包含 `<name>/SKILL.md` 的 skill 目录的自定义路径 |

219| `commands` | string\|array | 平面 `.md` skill 文件或目录的自定义路径 |

220| `agents` | string\|array | agent 文件的自定义路径 |

221| `hooks` | string\|object | 自定义 hooks 配置或 hooks 文件的路径 |

222| `mcpServers` | string\|object | MCP server 配置或 MCP 配置的路径 |

223| `lspServers` | string\|object | LSP server 配置或 LSP 配置的路径 |

224 

225## Plugin 源

226 

227Plugin 源告诉 Claude Code 在你的 marketplace 中列出的每个单独 plugin 从哪里获取。这些在 `marketplace.json` 中每个 plugin 条目的 `source` 字段中设置。

228 

229一旦 plugin 被克隆或复制到本地机器,它就会被复制到本地版本化 plugin 缓存中,位置为 `~/.claude/plugins/cache`。

230 

231| 源 | 类型 | 字段 | 注释 |

232| ------------ | ---------------------------- | -------------------------------- | ---------------------------------------------------------------------------------- |

233| 相对路径 | `string`(例如 `"./my-plugin"`) | 无 | marketplace repo 中的本地目录。必须以 `./` 开头。相对于 marketplace 根目录解析,而不是 `.claude-plugin/` 目录 |

234| `github` | object | `repo`、`ref?`、`sha?` | |

235| `url` | object | `url`、`ref?`、`sha?` | Git URL 源 |

236| `git-subdir` | object | `url`、`path`、`ref?`、`sha?` | git repo 中的子目录。稀疏克隆以最小化大型 monorepos 的带宽 |

237| `npm` | object | `package`、`version?`、`registry?` | 通过 `npm install` 安装 |

238 

239<Note>

240 **Marketplace 源与 plugin 源**:这些是控制不同事物的不同概念。

241 

242 * **Marketplace 源** — 从哪里获取 `marketplace.json` 目录本身。在用户运行 `/plugin marketplace add` 或在 `extraKnownMarketplaces` 设置中设置。支持 `ref`(分支/标签)但不支持 `sha`。

243 * **Plugin 源** — 从哪里获取 marketplace 中列出的单个 plugin。在 `marketplace.json` 内每个 plugin 条目的 `source` 字段中设置。支持 `ref`(分支/标签)和 `sha`(精确提交)。

244 

245 例如,托管在 `acme-corp/plugin-catalog` 的 marketplace(marketplace 源)可以列出从 `acme-corp/code-formatter` 获取的 plugin(plugin 源)。marketplace 源和 plugin 源指向不同的存储库,并独立固定。

246</Note>

247 

248### 相对路径

249 

250对于同一存储库中的 plugins,使用以 `./` 开头的路径:

251 

252```json theme={null}

253{

254 "name": "my-plugin",

255 "source": "./plugins/my-plugin"

256}

257```

258 

259路径相对于 marketplace 根目录解析,即包含 `.claude-plugin/` 的目录。在上面的示例中,`./plugins/my-plugin` 指向 `<repo>/plugins/my-plugin`,即使 `marketplace.json` 位于 `<repo>/.claude-plugin/marketplace.json`。不要使用 `../` 来引用 marketplace 根目录外的路径。

260 

261<Note>

262 相对路径仅在用户通过 Git(GitHub、GitLab 或 git URL)添加你的 marketplace 时有效。如果用户通过直接 URL 添加你的 marketplace 到 `marketplace.json` 文件,相对路径将无法正确解析。对于基于 URL 的分发,请改用 GitHub、npm 或 git URL 源。有关详细信息,请参阅[故障排除](#plugins-with-relative-paths-fail-in-url-based-marketplaces)。

263</Note>

264 

265### GitHub 存储库

266 

267```json theme={null}

268{

269 "name": "github-plugin",

270 "source": {

271 "source": "github",

272 "repo": "owner/plugin-repo"

273 }

274}

275```

276 

277你可以固定到特定的分支、标签或提交:

278 

279```json theme={null}

280{

281 "name": "github-plugin",

282 "source": {

283 "source": "github",

284 "repo": "owner/plugin-repo",

285 "ref": "v2.0.0",

286 "sha": "a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0"

287 }

288}

289```

290 

291| 字段 | 类型 | 描述 |

292| :----- | :----- | :------------------------------- |

293| `repo` | string | 必需。`owner/repo` 格式的 GitHub 存储库 |

294| `ref` | string | 可选。Git 分支或标签(默认为存储库默认分支) |

295| `sha` | string | 可选。完整的 40 字符 git 提交 SHA 以固定到精确版本 |

296 

297### Git 存储库

298 

299```json theme={null}

300{

301 "name": "git-plugin",

302 "source": {

303 "source": "url",

304 "url": "https://gitlab.com/team/plugin.git"

305 }

306}

307```

308 

309你可以固定到特定的分支、标签或提交:

310 

311```json theme={null}

312{

313 "name": "git-plugin",

314 "source": {

315 "source": "url",

316 "url": "https://gitlab.com/team/plugin.git",

317 "ref": "main",

318 "sha": "a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0"

319 }

320}

321```

322 

323| 字段 | 类型 | 描述 |

324| :---- | :----- | :--------------------------------------------------------------------------------------------------- |

325| `url` | string | 必需。完整的 git 存储库 URL(`https://` 或 `git@`)。`.git` 后缀是可选的,所以 Azure DevOps 和 AWS CodeCommit URL 不带后缀也可以工作 |

326| `ref` | string | 可选。Git 分支或标签(默认为存储库默认分支) |

327| `sha` | string | 可选。完整的 40 字符 git 提交 SHA 以固定到精确版本 |

328 

329### Git 子目录

330 

331使用 `git-subdir` 指向位于 git 存储库子目录中的 plugin。Claude Code 使用稀疏的部分克隆来仅获取子目录,最小化大型 monorepos 的带宽。

332 

333```json theme={null}

334{

335 "name": "my-plugin",

336 "source": {

337 "source": "git-subdir",

338 "url": "https://github.com/acme-corp/monorepo.git",

339 "path": "tools/claude-plugin"

340 }

341}

342```

343 

344你可以固定到特定的分支、标签或提交:

345 

346```json theme={null}

347{

348 "name": "my-plugin",

349 "source": {

350 "source": "git-subdir",

351 "url": "https://github.com/acme-corp/monorepo.git",

352 "path": "tools/claude-plugin",

353 "ref": "v2.0.0",

354 "sha": "a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0"

355 }

356}

357```

358 

359`url` 字段也接受 GitHub 简写(`owner/repo`)或 SSH URL(`git@github.com:owner/repo.git`)。

360 

361| 字段 | 类型 | 描述 |

362| :----- | :----- | :---------------------------------------------------- |

363| `url` | string | 必需。Git 存储库 URL、GitHub `owner/repo` 简写或 SSH URL |

364| `path` | string | 必需。repo 中包含 plugin 的子目录路径(例如,`"tools/claude-plugin"`) |

365| `ref` | string | 可选。Git 分支或标签(默认为存储库默认分支) |

366| `sha` | string | 可选。完整的 40 字符 git 提交 SHA 以固定到精确版本 |

367 

368### npm 包

369 

370作为 npm 包分发的 Plugins 使用 `npm install` 安装。这适用于公共 npm registry 上的任何包或你的团队托管的私有 registry。

371 

372```json theme={null}

373{

374 "name": "my-npm-plugin",

375 "source": {

376 "source": "npm",

377 "package": "@acme/claude-plugin"

378 }

379}

380```

381 

382要固定到特定版本,请添加 `version` 字段:

383 

384```json theme={null}

385{

386 "name": "my-npm-plugin",

387 "source": {

388 "source": "npm",

389 "package": "@acme/claude-plugin",

390 "version": "2.1.0"

391 }

392}

393```

394 

395要从私有或内部 registry 安装,请添加 `registry` 字段:

396 

397```json theme={null}

398{

399 "name": "my-npm-plugin",

400 "source": {

401 "source": "npm",

402 "package": "@acme/claude-plugin",

403 "version": "^2.0.0",

404 "registry": "https://npm.example.com"

405 }

406}

407```

408 

409| 字段 | 类型 | 描述 |

410| :--------- | :----- | :-------------------------------------------------------- |

411| `package` | string | 必需。包名称或作用域包(例如,`@org/plugin`) |

412| `version` | string | 可选。版本或版本范围(例如,`2.1.0`、`^2.0.0`、`~1.5.0`) |

413| `registry` | string | 可选。自定义 npm registry URL。默认为系统 npm registry(通常为 npmjs.org) |

414 

415### 高级 plugin 条目

416 

417此示例显示了使用许多可选字段的 plugin 条目,包括命令、agents、hooks 和 MCP servers 的自定义路径:

418 

419```json theme={null}

420{

421 "name": "enterprise-tools",

422 "source": {

423 "source": "github",

424 "repo": "company/enterprise-plugin"

425 },

426 "description": "Enterprise workflow automation tools",

427 "version": "2.1.0",

428 "author": {

429 "name": "Enterprise Team",

430 "email": "enterprise@example.com"

431 },

432 "homepage": "https://docs.example.com/plugins/enterprise-tools",

433 "repository": "https://github.com/company/enterprise-plugin",

434 "license": "MIT",

435 "keywords": ["enterprise", "workflow", "automation"],

436 "category": "productivity",

437 "commands": [

438 "./commands/core/",

439 "./commands/enterprise/",

440 "./commands/experimental/preview.md"

441 ],

442 "agents": ["./agents/security-reviewer.md", "./agents/compliance-checker.md"],

443 "hooks": {

444 "PostToolUse": [

445 {

446 "matcher": "Write|Edit",

447 "hooks": [

448 {

449 "type": "command",

450 "command": "${CLAUDE_PLUGIN_ROOT}/scripts/validate.sh"

451 }

452 ]

453 }

454 ]

455 },

456 "mcpServers": {

457 "enterprise-db": {

458 "command": "${CLAUDE_PLUGIN_ROOT}/servers/db-server",

459 "args": ["--config", "${CLAUDE_PLUGIN_ROOT}/config.json"]

460 }

461 },

462 "strict": false

463}

464```

465 

466需要注意的关键事项:

467 

468* **`commands` 和 `agents`**:你可以指定多个目录或单个文件。路径相对于 plugin 根目录。

469* **`${CLAUDE_PLUGIN_ROOT}`**:在 hooks 和 MCP server 配置中使用此变量来引用 plugin 安装目录中的文件。这是必要的,因为 plugins 在安装时被复制到缓存位置。对于应该在 plugin 更新后保留的依赖项或状态,请改用 [`${CLAUDE_PLUGIN_DATA}`](/zh-CN/plugins-reference#persistent-data-directory)。

470* **`strict: false`**:由于这设置为 false,plugin 不需要自己的 `plugin.json`。marketplace 条目定义了一切。见下面的 [Strict 模式](#strict-mode)。

471 

472### Strict 模式

473 

474`strict` 字段控制 `plugin.json` 是否是组件定义(skills、agents、hooks、MCP servers、输出样式)的权威。

475 

476| 值 | 行为 |

477| :--------- | :---------------------------------------------------------------------- |

478| `true`(默认) | `plugin.json` 是权威。marketplace 条目可以用额外的组件补充它,两个源都被合并。 |

479| `false` | marketplace 条目是完整的定义。如果 plugin 也有声明组件的 `plugin.json`,那就是冲突,plugin 无法加载。 |

480 

481**何时使用每种模式:**

482 

483* **`strict: true`**:plugin 有自己的 `plugin.json` 并管理自己的组件。marketplace 条目可以在顶部添加额外的 skills 或 hooks。这是默认值,适用于大多数 plugins。

484* **`strict: false`**:marketplace 操作员想要完全控制。plugin repo 提供原始文件,marketplace 条目定义这些文件中的哪些被公开为 skills、agents、hooks 等。当 marketplace 以不同于 plugin 作者意图的方式重组或策划 plugin 的组件时很有用。

485 

486## 托管和分发 marketplaces

487 

488### 在 GitHub 上托管(推荐)

489 

490GitHub 提供最简单的分发方法:

491 

4921. **创建存储库**:为你的 marketplace 设置一个新存储库

4932. **添加 marketplace 文件**:使用你的 plugin 定义创建 `.claude-plugin/marketplace.json`

4943. **与团队共享**:用户使用 `/plugin marketplace add owner/repo` 添加你的 marketplace

495 

496**优点**:内置版本控制、问题跟踪和团队协作功能。

497 

498### 在其他 git 服务上托管

499 

500任何 git 托管服务都可以工作,例如 GitLab、Bitbucket 和自托管服务器。用户使用完整的存储库 URL 添加:

501 

502```shell theme={null}

503/plugin marketplace add https://gitlab.com/company/plugins.git

504```

505 

506### 私有存储库

507 

508Claude Code 支持从私有存储库安装 plugins。对于手动安装和更新,Claude Code 使用你现有的 git 凭证助手,所以通过 `gh auth login`、macOS Keychain 或 `git-credential-store` 的 HTTPS 访问工作方式与你的终端中相同。SSH 访问工作,只要主机已经在你的 `known_hosts` 文件中,并且密钥已加载到 `ssh-agent` 中,因为 Claude Code 会抑制主机指纹和密钥密码的交互式 SSH 提示。

509 

510后台自动更新在启动时运行,不使用凭证助手,因为交互式提示会阻止 Claude Code 启动。要为私有 marketplaces 启用自动更新,请在你的环境中设置适当的身份验证令牌:

511 

512| 提供商 | 环境变量 | 注释 |

513| :-------- | :-------------------------- | :-------------------- |

514| GitHub | `GITHUB_TOKEN` 或 `GH_TOKEN` | 个人访问令牌或 GitHub App 令牌 |

515| GitLab | `GITLAB_TOKEN` 或 `GL_TOKEN` | 个人访问令牌或项目令牌 |

516| Bitbucket | `BITBUCKET_TOKEN` | 应用密码或存储库访问令牌 |

517 

518在你的 shell 配置中设置令牌(例如,`.bashrc`、`.zshrc`)或在运行 Claude Code 时传递它:

519 

520```bash theme={null}

521export GITHUB_TOKEN=ghp_xxxxxxxxxxxxxxxxxxxx

522```

523 

524<Note>

525 对于 CI/CD 环境,将令牌配置为秘密环境变量。GitHub Actions 自动为同一组织中的存储库提供 `GITHUB_TOKEN`。

526</Note>

527 

528### 在分发前本地测试

529 

530在共享前本地测试你的 marketplace:

531 

532```shell theme={null}

533/plugin marketplace add ./my-local-marketplace

534/plugin install test-plugin@my-local-marketplace

535```

536 

537有关完整的添加命令范围(GitHub、Git URL、本地路径、远程 URL),请参阅[添加 marketplaces](/zh-CN/discover-plugins#add-marketplaces)。

538 

539### 为你的团队要求 marketplaces

540 

541你可以配置你的存储库,以便当团队成员信任项目文件夹时,他们会自动被提示安装你的 marketplace。将你的 marketplace 添加到 `.claude/settings.json`:

542 

543```json theme={null}

544{

545 "extraKnownMarketplaces": {

546 "company-tools": {

547 "source": {

548 "source": "github",

549 "repo": "your-org/claude-plugins"

550 }

551 }

552 }

553}

554```

555 

556你也可以指定默认应启用哪些 plugins:

557 

558```json theme={null}

559{

560 "enabledPlugins": {

561 "code-formatter@company-tools": true,

562 "deployment-tools@company-tools": true

563 }

564}

565```

566 

567有关完整的配置选项,请参阅 [Plugin 设置](/zh-CN/settings#plugin-settings)。

568 

569<Note>

570 如果你使用带有相对路径的本地 `directory` 或 `file` 源,路径将相对于你的存储库的主检出解析。当你从 git worktree 运行 Claude Code 时,路径仍然指向主检出,所以所有 worktrees 共享相同的 marketplace 位置。Marketplace 状态存储一次每个用户在 `~/.claude/plugins/known_marketplaces.json` 中,而不是每个项目。

571</Note>

572 

573### 为容器预填充 plugins

574 

575对于容器镜像和 CI 环境,你可以在构建时预填充 plugins 目录,以便 Claude Code 启动时已经有 marketplaces 和 plugins 可用,无需在运行时克隆任何内容。设置 `CLAUDE_CODE_PLUGIN_SEED_DIR` 环境变量以指向此目录。

576 

577要分层多个种子目录,请在 Unix 上用 `:` 分隔路径,或在 Windows 上用 `;` 分隔。Claude Code 按顺序搜索每个目录,第一个包含给定 marketplace 或 plugin 缓存的种子获胜。

578 

579种子目录镜像 `~/.claude/plugins` 的结构:

580 

581```

582$CLAUDE_CODE_PLUGIN_SEED_DIR/

583 known_marketplaces.json

584 marketplaces/<name>/...

585 cache/<marketplace>/<plugin>/<version>/...

586```

587 

588要构建种子目录,请在镜像构建期间运行 Claude Code 一次,安装你需要的 plugins,然后将生成的 `~/.claude/plugins` 目录复制到你的镜像中,并将 `CLAUDE_CODE_PLUGIN_SEED_DIR` 指向它。

589 

590要跳过复制步骤,请在构建期间将 `CLAUDE_CODE_PLUGIN_CACHE_DIR` 设置为你的目标种子路径,以便 plugins 直接安装到那里:

591 

592```bash theme={null}

593CLAUDE_CODE_PLUGIN_CACHE_DIR=/opt/claude-seed claude plugin marketplace add your-org/plugins

594CLAUDE_CODE_PLUGIN_CACHE_DIR=/opt/claude-seed claude plugin install my-tool@your-plugins

595```

596 

597然后在你的容器的运行时环境中设置 `CLAUDE_CODE_PLUGIN_SEED_DIR=/opt/claude-seed`,以便 Claude Code 在启动时从种子读取。

598 

599在启动时,Claude Code 将种子的 `known_marketplaces.json` 中找到的 marketplaces 注册到主配置中,并使用在 `cache/` 下找到的 plugin 缓存,而无需重新克隆。这在交互模式和使用 `-p` 标志的非交互模式中都有效。

600 

601行为详情:

602 

603* **只读**:种子目录永远不会被写入。由于 git pull 会在只读文件系统上失败,种子 marketplaces 的自动更新被禁用。

604* **种子条目优先**:在每次启动时,种子中声明的 marketplaces 会覆盖用户配置中的任何匹配条目。要选择退出种子 plugin,请使用 `/plugin disable` 而不是删除 marketplace。

605* **路径解析**:Claude Code 通过在运行时探测 `$CLAUDE_CODE_PLUGIN_SEED_DIR/marketplaces/<name>/` 来定位 marketplace 内容,而不是信任存储在种子 JSON 内的路径。这意味着即使在与构建时不同的路径上挂载,种子也能正确工作。

606* **变更被阻止**:针对种子管理的 marketplace 运行 `/plugin marketplace remove` 或 `/plugin marketplace update` 会失败,并提示你要求管理员更新种子镜像。

607* **与设置组合**:如果 `extraKnownMarketplaces` 或 `enabledPlugins` 声明的 marketplace 已经存在于种子中,Claude Code 使用种子副本而不是克隆。

608 

609### 托管 marketplace 限制

610 

611对于需要严格控制 plugin 源的组织,管理员可以使用托管设置中的 [`strictKnownMarketplaces`](/zh-CN/settings#strictknownmarketplaces) 设置限制用户允许添加哪些 plugin marketplaces。

612 

613当在托管设置中配置 `strictKnownMarketplaces` 时,限制行为取决于值:

614 

615| 值 | 行为 |

616| -------- | ----------------------------- |

617| 未定义(默认) | 无限制。用户可以添加任何 marketplace |

618| 空数组 `[]` | 完全锁定。用户无法添加任何新 marketplaces |

619| 源列表 | 用户只能添加与允许列表完全匹配的 marketplaces |

620 

621#### 常见配置

622 

623禁用所有 marketplace 添加:

624 

625```json theme={null}

626{

627 "strictKnownMarketplaces": []

628}

629```

630 

631仅允许特定 marketplaces:

632 

633```json theme={null}

634{

635 "strictKnownMarketplaces": [

636 {

637 "source": "github",

638 "repo": "acme-corp/approved-plugins"

639 },

640 {

641 "source": "github",

642 "repo": "acme-corp/security-tools",

643 "ref": "v2.0"

644 },

645 {

646 "source": "url",

647 "url": "https://plugins.example.com/marketplace.json"

648 }

649 ]

650}

651```

652 

653使用主机上的正则表达式模式匹配允许来自内部 git 服务器的所有 marketplaces。这是 [GitHub Enterprise Server](/zh-CN/github-enterprise-server#plugin-marketplaces-on-ghes) 或自托管 GitLab 实例的推荐方法:

654 

655```json theme={null}

656{

657 "strictKnownMarketplaces": [

658 {

659 "source": "hostPattern",

660 "hostPattern": "^github\\.example\\.com$"

661 }

662 ]

663}

664```

665 

666使用路径上的正则表达式模式匹配允许来自特定目录的基于文件系统的 marketplaces:

667 

668```json theme={null}

669{

670 "strictKnownMarketplaces": [

671 {

672 "source": "pathPattern",

673 "pathPattern": "^/opt/approved/"

674 }

675 ]

676}

677```

678 

679使用 `".*"` 作为 `pathPattern` 来允许任何文件系统路径,同时仍然使用 `hostPattern` 控制网络源。

680 

681<Note>

682 `strictKnownMarketplaces` 限制用户可以添加的内容,但不会自行注册 marketplaces。要使允许的 marketplaces 自动可用而无需用户运行 `/plugin marketplace add`,请在同一 `managed-settings.json` 中将其与 [`extraKnownMarketplaces`](/zh-CN/settings#extraknownmarketplaces) 配对。见[同时使用两者](/zh-CN/settings#strictknownmarketplaces)。

683</Note>

684 

685#### 限制如何工作

686 

687限制在任何网络或文件系统操作之前进行检查。检查在 marketplace 添加以及 plugin 安装、更新、刷新和自动更新时运行。如果 marketplace 在配置策略之前被添加,其源不再与允许列表匹配,Claude Code 会拒绝从中安装或更新 plugins。相同的强制执行也适用于 `blockedMarketplaces`。

688 

689允许列表对大多数源类型使用精确匹配。要允许 marketplace,所有指定的字段必须完全匹配:

690 

691* 对于 GitHub 源:`repo` 是必需的,如果在允许列表中指定,`ref` 或 `path` 也必须匹配

692* 对于 URL 源:完整 URL 必须完全匹配

693* 对于 `hostPattern` 源:marketplace 主机与正则表达式模式匹配

694* 对于 `pathPattern` 源:marketplace 的文件系统路径与正则表达式模式匹配

695 

696因为 `strictKnownMarketplaces` 在[托管设置](/zh-CN/settings#settings-files)中设置,个别用户和项目配置无法覆盖这些限制。

697 

698有关完整的配置详细信息,包括所有支持的源类型和与 `extraKnownMarketplaces` 的比较,请参阅 [strictKnownMarketplaces 参考](/zh-CN/settings#strictknownmarketplaces)。

699 

700### 版本解析和发布渠道

701 

702Plugin 版本确定缓存路径和更新检测:如果解析的版本与用户已有的版本匹配,`/plugin update` 和自动更新会跳过该 plugin。

703 

704Claude Code 从以下第一个设置的内容解析 plugin 的版本:

705 

7061. plugin 的 `plugin.json` 中的 `version`

7072. plugin 的 marketplace 条目中的 `version`

7083. plugin 源的 git 提交 SHA

709 

710对于 git 源类型 `github`、`url`、`git-subdir` 和 git 托管 marketplace 内的相对路径,你可以完全省略 `version`,每个新提交都被视为新版本。这是内部或积极开发的 plugins 的最简单设置。

711 

712<Warning>

713 设置 `version` 会固定 plugin。如果 `plugin.json` 声明 `"version": "1.0.0"`,推送新提交而不改变该字符串对现有用户没有任何作用,因为 Claude Code 看到相同的版本并保留缓存副本。在每个发布时提升该字段,或省略它以使用提交 SHA。

714 

715 避免在 `plugin.json` 和 marketplace 条目中都设置 `version`。`plugin.json` 值总是无声地获胜,所以陈旧的 manifest 版本可能会掩盖你在 `marketplace.json` 中设置的版本。

716</Warning>

717 

718#### 设置发布渠道

719 

720要为你的 plugins 支持"稳定"和"最新"发布渠道,你可以设置两个指向同一 repo 的不同 refs 或 SHAs 的 marketplaces。然后,你可以通过[托管设置](/zh-CN/settings#settings-files)将两个 marketplaces 分配给不同的用户组。

721 

722<Warning>

723 每个渠道必须解析为不同的版本。如果你使用显式版本,`plugin.json` 必须在每个固定的 ref 处声明不同的 `version`。如果你省略 `version`,不同的提交 SHA 已经区分了渠道。如果两个 refs 解析为相同的版本字符串,Claude Code 会将它们视为相同并跳过更新。

724</Warning>

725 

726##### 示例

727 

728```json theme={null}

729{

730 "name": "stable-tools",

731 "plugins": [

732 {

733 "name": "code-formatter",

734 "source": {

735 "source": "github",

736 "repo": "acme-corp/code-formatter",

737 "ref": "stable"

738 }

739 }

740 ]

741}

742```

743 

744```json theme={null}

745{

746 "name": "latest-tools",

747 "plugins": [

748 {

749 "name": "code-formatter",

750 "source": {

751 "source": "github",

752 "repo": "acme-corp/code-formatter",

753 "ref": "latest"

754 }

755 }

756 ]

757}

758```

759 

760##### 将渠道分配给用户组

761 

762通过托管设置将每个 marketplace 分配给适当的用户组。例如,稳定组接收:

763 

764```json theme={null}

765{

766 "extraKnownMarketplaces": {

767 "stable-tools": {

768 "source": {

769 "source": "github",

770 "repo": "acme-corp/stable-tools"

771 }

772 }

773 }

774}

775```

776 

777早期访问组改为接收 `latest-tools`:

778 

779```json theme={null}

780{

781 "extraKnownMarketplaces": {

782 "latest-tools": {

783 "source": {

784 "source": "github",

785 "repo": "acme-corp/latest-tools"

786 }

787 }

788 }

789}

790```

791 

792#### 固定依赖版本

793 

794Plugin 可以将其依赖约束到 semver 范围,以便对依赖的更新不会破坏依赖的 plugin。有关 `{plugin-name}--v{version}` git 标签约定、范围语法以及如何组合对同一依赖的多个约束,请参阅[约束 plugin 依赖版本](/zh-CN/plugin-dependencies)。

795 

796## 验证和测试

797 

798在共享前测试你的 marketplace。

799 

800验证你的 marketplace JSON 语法:

801 

802```bash theme={null}

803claude plugin validate .

804```

805 

806或从 Claude Code 内:

807 

808```shell theme={null}

809/plugin validate .

810```

811 

812添加 marketplace 进行测试:

813 

814```shell theme={null}

815/plugin marketplace add ./path/to/marketplace

816```

817 

818安装测试 plugin 以验证一切正常:

819 

820```shell theme={null}

821/plugin install test-plugin@marketplace-name

822```

823 

824有关完整的 plugin 测试工作流,请参阅[本地测试你的 plugins](/zh-CN/plugins#test-your-plugins-locally)。有关技术故障排除,请参阅 [Plugins 参考](/zh-CN/plugins-reference)。

825 

826## 从 CLI 管理 marketplaces

827 

828Claude Code 提供非交互式 `claude plugin marketplace` 子命令用于脚本编写和自动化。这些等同于交互式会话中可用的 `/plugin marketplace` 命令。

829 

830### Plugin marketplace add

831 

832从 GitHub 存储库、git URL、远程 URL 或本地路径添加 marketplace。

833 

834```bash theme={null}

835claude plugin marketplace add <source> [options]

836```

837 

838**参数:**

839 

840* `<source>`:GitHub `owner/repo` 简写、git URL、指向 `marketplace.json` 文件的远程 URL 或本地目录路径。要固定到分支或标签,请将 `@ref` 附加到 GitHub 简写或 `#ref` 附加到 git URL

841 

842**选项:**

843 

844| 选项 | 描述 | 默认值 |

845| :-------------------- | :----------------------------------------------------------------------------------------------------------------- | :----- |

846| `--scope <scope>` | 声明 marketplace 的位置:`user`、`project` 或 `local`。见 [Plugin 安装范围](/zh-CN/plugins-reference#plugin-installation-scopes) | `user` |

847| `--sparse <paths...>` | 通过 git sparse-checkout 限制检出到特定目录。对 monorepos 有用 | |

848 

849从 GitHub 使用 `owner/repo` 简写添加 marketplace:

850 

851```bash theme={null}

852claude plugin marketplace add acme-corp/claude-plugins

853```

854 

855使用 `@ref` 固定到特定分支或标签:

856 

857```bash theme={null}

858claude plugin marketplace add acme-corp/claude-plugins@v2.0

859```

860 

861从非 GitHub 主机上的 git URL 添加:

862 

863```bash theme={null}

864claude plugin marketplace add https://gitlab.example.com/team/plugins.git

865```

866 

867从直接提供 `marketplace.json` 文件的远程 URL 添加:

868 

869```bash theme={null}

870claude plugin marketplace add https://example.com/marketplace.json

871```

872 

873从本地目录添加以进行测试:

874 

875```bash theme={null}

876claude plugin marketplace add ./my-marketplace

877```

878 

879在项目范围声明 marketplace,以便通过 `.claude/settings.json` 与你的团队共享:

880 

881```bash theme={null}

882claude plugin marketplace add acme-corp/claude-plugins --scope project

883```

884 

885对于 monorepo,限制检出到包含 plugin 内容的目录:

886 

887```bash theme={null}

888claude plugin marketplace add acme-corp/monorepo --sparse .claude-plugin plugins

889```

890 

891### Plugin marketplace list

892 

893列出所有配置的 marketplaces。

894 

895```bash theme={null}

896claude plugin marketplace list [options]

897```

898 

899**选项:**

900 

901| 选项 | 描述 |

902| :------- | :------- |

903| `--json` | 输出为 JSON |

904 

905### Plugin marketplace remove

906 

907删除配置的 marketplace。别名 `rm` 也被接受。

908 

909```bash theme={null}

910claude plugin marketplace remove <name>

911```

912 

913**参数:**

914 

915* `<name>`:marketplace 名称要删除,如 `claude plugin marketplace list` 所示。这是来自 `marketplace.json` 的 `name`,而不是你传递给 `add` 的源

916 

917<Warning>

918 删除 marketplace 也会卸载你从它安装的任何 plugins。要刷新 marketplace 而不丢失已安装的 plugins,请改用 `claude plugin marketplace update`。

919</Warning>

920 

921### Plugin marketplace update

922 

923从其源刷新 marketplaces 以检索新 plugins 和版本更改。

924 

925```bash theme={null}

926claude plugin marketplace update [name]

927```

928 

929**参数:**

930 

931* `[name]`:marketplace 名称要更新,如 `claude plugin marketplace list` 所示。如果省略,更新所有 marketplaces

932 

933`remove` 和 `update` 在针对种子管理的 marketplace 运行时都会失败,这是只读的。更新所有 marketplaces 时,种子管理的条目被跳过,其他 marketplaces 仍然更新。要更改种子提供的 plugins,请要求你的管理员更新种子镜像。见[为容器预填充 plugins](#pre-populate-plugins-for-containers)。

934 

935## 故障排除

936 

937### Marketplace 未加载

938 

939**症状**:无法添加 marketplace 或从中看到 plugins

940 

941**解决方案**:

942 

943* 验证 marketplace URL 是否可访问

944* 检查 `.claude-plugin/marketplace.json` 是否存在于指定路径

945* 使用 `claude plugin validate` 或 `/plugin validate` 确保 JSON 语法有效且 frontmatter 格式正确

946* 对于私有存储库,确认你有访问权限

947 

948### Marketplace 验证错误

949 

950从你的 marketplace 目录运行 `claude plugin validate .` 或 `/plugin validate .` 来检查问题。验证器检查 `plugin.json`、skill/agent/command frontmatter 和 `hooks/hooks.json` 的语法和架构错误。常见错误:

951 

952| 错误 | 原因 | 解决方案 |

953| :------------------------------------------------ | :--------------------------------- | :--------------------------------------------------------- |

954| `File not found: .claude-plugin/marketplace.json` | 缺少 manifest | 使用必需字段创建 `.claude-plugin/marketplace.json` |

955| `Invalid JSON syntax: Unexpected token...` | JSON 语法错误 | 检查缺少的逗号、多余的逗号或未引用的字符串 |

956| `Duplicate plugin name "x" found in marketplace` | 两个 plugins 共享相同的名称 | 给每个 plugin 一个唯一的 `name` 值 |

957| `plugins[0].source: Path contains ".."` | 源路径包含 `..` | 使用相对于 marketplace 根目录的路径,不包含 `..`。见[相对路径](#relative-paths) |

958| `YAML frontmatter failed to parse: ...` | skill、agent 或 command 文件中的 YAML 无效 | 修复 frontmatter 块中的 YAML 语法。在运行时,此文件加载时不带元数据。 |

959| `Invalid JSON syntax: ...`(hooks.json) | 格式错误的 `hooks/hooks.json` | 修复 JSON 语法。格式错误的 `hooks/hooks.json` 会阻止整个 plugin 加载。 |

960 

961**警告**(非阻止):

962 

963* `Marketplace has no plugins defined`:将至少一个 plugin 添加到 `plugins` 数组

964* `No marketplace description provided`:添加顶级 `description` 以帮助用户理解你的 marketplace

965* `Plugin name "x" is not kebab-case`:plugin 名称包含大写字母、空格或特殊字符。重命名为仅包含小写字母、数字和连字符(例如,`my-plugin`)。Claude Code 接受其他形式,但 Claude.ai marketplace 同步会拒绝它们。

966 

967### Plugin 安装失败

968 

969**症状**:Marketplace 出现但 plugin 安装失败

970 

971**解决方案**:

972 

973* 验证 plugin 源 URL 是否可访问

974* 检查 plugin 目录是否包含必需的文件

975* 对于 GitHub 源,确保存储库是公开的或你有访问权限

976* 通过手动克隆/下载来测试 plugin 源

977 

978### 私有存储库身份验证失败

979 

980**症状**:从私有存储库安装 plugins 时出现身份验证错误

981 

982**解决方案**:

983 

984对于手动安装和更新:

985 

986* 验证你已使用你的 git 提供商进行身份验证(例如,对于 GitHub 运行 `gh auth status`)

987* 检查你的凭证助手是否配置正确:`git config --global credential.helper`

988* 尝试手动克隆存储库以验证你的凭证有效

989 

990对于后台自动更新:

991 

992* 在你的环境中设置适当的令牌:`echo $GITHUB_TOKEN`

993* 检查令牌是否具有所需的权限(对存储库的读取访问权限)

994* 对于 GitHub,确保令牌对私有存储库具有 `repo` 范围

995* 对于 GitLab,确保令牌至少具有 `read_repository` 范围

996* 验证令牌未过期

997 

998### Marketplace 更新在离线环境中失败

999 

1000**症状**:Marketplace `git pull` 失败,Claude Code 清除现有缓存,导致 plugins 变得不可用。

1001 

1002**原因**:默认情况下,当 `git pull` 失败时,Claude Code 会删除陈旧的克隆并尝试重新克隆。在离线或隔离的环境中,重新克隆以相同的方式失败,导致 marketplace 目录为空。

1003 

1004**解决方案**:设置 `CLAUDE_CODE_PLUGIN_KEEP_MARKETPLACE_ON_FAILURE=1` 以在拉取失败时保留现有缓存,而不是清除它:

1005 

1006```bash theme={null}

1007export CLAUDE_CODE_PLUGIN_KEEP_MARKETPLACE_ON_FAILURE=1

1008```

1009 

1010设置此变量后,Claude Code 在 `git pull` 失败时保留陈旧的 marketplace 克隆,并继续使用最后已知的良好状态。对于存储库永远无法访问的完全离线部署,请改用 [`CLAUDE_CODE_PLUGIN_SEED_DIR`](#pre-populate-plugins-for-containers) 在构建时预填充 plugins 目录。

1011 

1012### Git 操作超时

1013 

1014**症状**:Plugin 安装或 marketplace 更新失败,出现超时错误,如"Git clone timed out after 120s"或"Git pull timed out after 120s"。

1015 

1016**原因**:Claude Code 对所有 git 操作使用 120 秒超时,包括克隆 plugin 存储库和拉取 marketplace 更新。大型存储库或缓慢的网络连接可能超过此限制。

1017 

1018**解决方案**:使用 `CLAUDE_CODE_PLUGIN_GIT_TIMEOUT_MS` 环境变量增加超时。该值以毫秒为单位:

1019 

1020```bash theme={null}

1021export CLAUDE_CODE_PLUGIN_GIT_TIMEOUT_MS=300000 # 5 minutes

1022```

1023 

1024### 相对路径 Plugins 在基于 URL 的 Marketplaces 中失败

1025 

1026**症状**:通过 URL(如 `https://example.com/marketplace.json`)添加了 marketplace,但具有相对路径源(如 `"./plugins/my-plugin"`)的 plugins 无法安装,出现"path not found"错误。

1027 

1028**原因**:基于 URL 的 marketplaces 仅下载 `marketplace.json` 文件本身。它们不从服务器下载 plugin 文件。marketplace 条目中的相对路径引用远程服务器上未下载的文件。

1029 

1030**解决方案**:

1031 

1032* **使用外部源**:将 plugin 条目更改为使用 GitHub、npm 或 git URL 源而不是相对路径:

1033 ```json theme={null}

1034 { "name": "my-plugin", "source": { "source": "github", "repo": "owner/repo" } }

1035 ```

1036* **使用基于 Git 的 Marketplace**:在 Git 存储库中托管你的 marketplace 并使用 git URL 添加它。基于 Git 的 marketplaces 克隆整个存储库,使相对路径有效。

1037 

1038### 安装后文件未找到

1039 

1040**症状**:Plugin 安装但对文件的引用失败,特别是 plugin 目录外的文件

1041 

1042**原因**:Plugins 被复制到缓存目录而不是就地使用。引用 plugin 目录外文件的路径(如 `../shared-utils`)不会工作,因为这些文件不会被复制。

1043 

1044**解决方案**:见 [Plugin 缓存和文件解析](/zh-CN/plugins-reference#plugin-caching-and-file-resolution) 了解解决方法,包括符号链接和目录重组。

1045 

1046有关其他调试工具和常见问题,请参阅[调试和开发工具](/zh-CN/plugins-reference#debugging-and-development-tools)。

1047 

1048## 另见

1049 

1050* [发现和安装预构建的 plugins](/zh-CN/discover-plugins) - 从现有 marketplaces 安装 plugins

1051* [Plugins](/zh-CN/plugins) - 创建你自己的 plugins

1052* [Plugins 参考](/zh-CN/plugins-reference) - 完整的技术规范和架构

1053* [Plugin 设置](/zh-CN/settings#plugin-settings) - Plugin 配置选项

1054* [strictKnownMarketplaces 参考](/zh-CN/settings#strictknownmarketplaces) - 托管 marketplace 限制

plugins.md +454 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 创建插件

6 

7> 创建自定义插件以使用 skills、agents、hooks 和 MCP servers 扩展 Claude Code。

8 

9Plugins 让你能够使用自定义功能扩展 Claude Code,这些功能可以在项目和团队中共享。本指南涵盖如何使用 skills、agents、hooks 和 MCP servers 创建自己的插件。

10 

11想要安装现有插件?请参阅[发现和安装插件](/zh-CN/discover-plugins)。有关完整的技术规范,请参阅[插件参考](/zh-CN/plugins-reference)。

12 

13## 何时使用插件与独立配置

14 

15Claude Code 支持两种方式来添加自定义 skills、agents 和 hooks:

16 

17| 方法 | Skill 名称 | 最适合 |

18| :------------------------------------------ | :------------------- | :------------------------ |

19| **独立**(`.claude/` 目录) | `/hello` | 个人工作流、项目特定的自定义、快速实验 |

20| **插件**(包含 `.claude-plugin/plugin.json` 的目录) | `/plugin-name:hello` | 与团队成员共享、分发到社区、版本化发布、跨项目重用 |

21 

22**在以下情况下使用独立配置**:

23 

24* 你正在为单个项目自定义 Claude Code

25* 配置是个人的,不需要共享

26* 你在打包 skills 或 hooks 之前进行实验

27* 你想要简短的 skill 名称,如 `/hello` 或 `/deploy`

28 

29**在以下情况下使用插件**:

30 

31* 你想与团队或社区共享功能

32* 你需要在多个项目中使用相同的 skills/agents

33* 你想要版本控制和轻松更新扩展

34* 你通过市场分发

35* 你可以接受命名空间化的 skills,如 `/my-plugin:hello`(命名空间可防止插件之间的冲突)

36 

37<Tip>

38 从 `.claude/` 中的独立配置开始进行快速迭代,然后在准备好共享时[转换为插件](#convert-existing-configurations-to-plugins)。

39</Tip>

40 

41## 快速开始

42 

43本快速开始将引导你创建一个带有自定义 skill 的插件。你将创建一个清单(定义插件的配置文件)、添加一个 skill,并使用 `--plugin-dir` 标志在本地测试它。

44 

45### 前置条件

46 

47* Claude Code [已安装并已认证](/zh-CN/quickstart#step-1-install-claude-code)

48 

49<Note>

50 如果你没有看到 `/plugin` 命令,请将 Claude Code 更新到最新版本。有关升级说明,请参阅[故障排除](/zh-CN/troubleshooting)。

51</Note>

52 

53### 创建你的第一个插件

54 

55<Steps>

56 <Step title="创建插件目录">

57 每个插件都位于其自己的目录中,包含清单和你的 skills、agents 或 hooks。现在创建一个:

58 

59 ```bash theme={null}

60 mkdir my-first-plugin

61 ```

62 </Step>

63 

64 <Step title="创建插件清单">

65 位于 `.claude-plugin/plugin.json` 的清单文件定义了你的插件的身份:其名称、描述和版本。Claude Code 使用此元数据在插件管理器中显示你的插件。

66 

67 在你的插件文件夹内创建 `.claude-plugin` 目录:

68 

69 ```bash theme={null}

70 mkdir my-first-plugin/.claude-plugin

71 ```

72 

73 然后使用以下内容创建 `my-first-plugin/.claude-plugin/plugin.json`:

74 

75 ```json my-first-plugin/.claude-plugin/plugin.json theme={null}

76 {

77 "name": "my-first-plugin",

78 "description": "A greeting plugin to learn the basics",

79 "version": "1.0.0",

80 "author": {

81 "name": "Your Name"

82 }

83 }

84 ```

85 

86 | 字段 | 目的 |

87 | :------------ | :---------------------------------------------------------------------------------------------------------------------- |

88 | `name` | 唯一标识符和 skill 命名空间。Skills 以此为前缀(例如 `/my-first-plugin:hello`)。 |

89 | `description` | 在浏览或安装插件时在插件管理器中显示。 |

90 | `version` | 可选。如果设置,用户仅在你更新此字段时接收更新。如果省略且你的插件通过 git 分发,则使用提交 SHA,每个提交都计为新版本。请参阅[版本管理](/zh-CN/plugins-reference#version-management)。 |

91 | `author` | 可选。有助于归属。 |

92 

93 有关 `homepage`、`repository` 和 `license` 等其他字段,请参阅[完整清单架构](/zh-CN/plugins-reference#plugin-manifest-schema)。

94 </Step>

95 

96 <Step title="添加 skill">

97 Skills 位于 `skills/` 目录中。每个 skill 是一个包含 `SKILL.md` 文件的文件夹。文件夹名称成为 skill 名称,以插件的命名空间为前缀(在名为 `my-first-plugin` 的插件中的 `hello/` 创建 `/my-first-plugin:hello`)。

98 

99 在你的插件文件夹中创建一个 skill 目录:

100 

101 ```bash theme={null}

102 mkdir -p my-first-plugin/skills/hello

103 ```

104 

105 然后使用以下内容创建 `my-first-plugin/skills/hello/SKILL.md`:

106 

107 ```markdown my-first-plugin/skills/hello/SKILL.md theme={null}

108 ---

109 description: Greet the user with a friendly message

110 disable-model-invocation: true

111 ---

112 

113 Greet the user warmly and ask how you can help them today.

114 ```

115 </Step>

116 

117 <Step title="测试你的插件">

118 使用 `--plugin-dir` 标志运行 Claude Code 以加载你的插件:

119 

120 ```bash theme={null}

121 claude --plugin-dir ./my-first-plugin

122 ```

123 

124 Claude Code 启动后,尝试你的新 skill:

125 

126 ```shell theme={null}

127 /my-first-plugin:hello

128 ```

129 

130 你将看到 Claude 用问候语回应。运行 `/help` 以查看你的 skill 在插件命名空间下列出。

131 

132 <Note>

133 **为什么要命名空间?** 插件 skills 总是命名空间化的(如 `/my-first-plugin:hello`),以防止多个插件具有相同名称的 skills 时发生冲突。

134 

135 要更改命名空间前缀,请更新 `plugin.json` 中的 `name` 字段。

136 </Note>

137 </Step>

138 

139 <Step title="添加 skill 参数">

140 通过接受用户输入使你的 skill 动态化。`$ARGUMENTS` 占位符捕获用户在 skill 名称后提供的任何文本。

141 

142 更新你的 `SKILL.md` 文件:

143 

144 ```markdown my-first-plugin/skills/hello/SKILL.md theme={null}

145 ---

146 description: Greet the user with a personalized message

147 ---

148 

149 # Hello Skill

150 

151 Greet the user named "$ARGUMENTS" warmly and ask how you can help them today. Make the greeting personal and encouraging.

152 ```

153 

154 运行 `/reload-plugins` 以获取更改,然后尝试使用你的名字的 skill:

155 

156 ```shell theme={null}

157 /my-first-plugin:hello Alex

158 ```

159 

160 Claude 将按名字问候你。有关向 skills 传递参数的更多信息,请参阅 [Skills](/zh-CN/skills#pass-arguments-to-skills)。

161 </Step>

162</Steps>

163 

164你已成功创建并测试了一个包含以下关键组件的插件:

165 

166* **插件清单**(`.claude-plugin/plugin.json`):描述你的插件的元数据

167* **Skills 目录**(`skills/`):包含你的自定义 skills

168* **Skill 参数**(`$ARGUMENTS`):捕获用户输入以实现动态行为

169 

170<Tip>

171 `--plugin-dir` 标志对开发和测试很有用。当你准备好与他人共享你的插件时,请参阅[创建和分发插件市场](/zh-CN/plugin-marketplaces)。

172</Tip>

173 

174## 插件结构概览

175 

176你已创建了一个带有 skill 的插件,但插件可以包含更多内容:自定义 agents、hooks、MCP servers、LSP servers 和后台监视器。

177 

178<Warning>

179 **常见错误**:不要将 `commands/`、`agents/`、`skills/` 或 `hooks/` 放在 `.claude-plugin/` 目录内。只有 `plugin.json` 应该在 `.claude-plugin/` 内。所有其他目录必须在插件根级别。

180</Warning>

181 

182| 目录 | 位置 | 目的 |

183| :---------------- | :-- | :--------------------------------------- |

184| `.claude-plugin/` | 插件根 | 包含 `plugin.json` 清单(如果组件使用默认位置,则可选) |

185| `skills/` | 插件根 | Skills 作为 `<name>/SKILL.md` 目录 |

186| `commands/` | 插件根 | Skills 作为平面 Markdown 文件。为新插件使用 `skills/` |

187| `agents/` | 插件根 | 自定义 agent 定义 |

188| `hooks/` | 插件根 | `hooks.json` 中的事件处理程序 |

189| `.mcp.json` | 插件根 | MCP server 配置 |

190| `.lsp.json` | 插件根 | 用于代码智能的 LSP server 配置 |

191| `monitors/` | 插件根 | `monitors.json` 中的后台监视器配置 |

192| `bin/` | 插件根 | 在启用插件时添加到 Bash tool 的 `PATH` 的可执行文件 |

193| `settings.json` | 插件根 | 启用插件时应用的默认[设置](/zh-CN/settings) |

194 

195<Note>

196 **后续步骤**:准备好添加更多功能了吗?跳转到[开发更复杂的插件](#develop-more-complex-plugins)以添加 agents、hooks、MCP servers 和 LSP servers。有关所有插件组件的完整技术规范,请参阅[插件参考](/zh-CN/plugins-reference)。

197</Note>

198 

199## 开发更复杂的插件

200 

201一旦你对基本插件感到满意,你可以创建更复杂的扩展。

202 

203### 向你的插件添加 Skills

204 

205插件可以包含 [Agent Skills](/zh-CN/skills) 以扩展 Claude 的功能。Skills 是模型调用的:Claude 根据任务上下文自动使用它们。

206 

207在你的插件根目录添加一个 `skills/` 目录,其中包含包含 `SKILL.md` 文件的 Skill 文件夹:

208 

209```text theme={null}

210my-plugin/

211├── .claude-plugin/

212│ └── plugin.json

213└── skills/

214 └── code-review/

215 └── SKILL.md

216```

217 

218每个 `SKILL.md` 包含 YAML frontmatter 和说明。包含一个 `description`,以便 Claude 知道何时使用该 skill:

219 

220```yaml theme={null}

221---

222description: Reviews code for best practices and potential issues. Use when reviewing code, checking PRs, or analyzing code quality.

223---

224 

225When reviewing code, check for:

2261. Code organization and structure

2272. Error handling

2283. Security concerns

2294. Test coverage

230```

231 

232安装插件后,运行 `/reload-plugins` 以加载 Skills。有关完整的 Skill 编写指南,包括渐进式披露和工具限制,请参阅 [Agent Skills](/zh-CN/skills)。

233 

234### 向你的插件添加 LSP servers

235 

236<Tip>

237 对于 TypeScript、Python 和 Rust 等常见语言,请从官方市场安装预构建的 LSP 插件。仅当你需要支持尚未涵盖的语言时,才创建自定义 LSP 插件。

238</Tip>

239 

240LSP(Language Server Protocol)插件为 Claude 提供实时代码智能。如果你需要支持没有官方 LSP 插件的语言,你可以通过向你的插件添加 `.lsp.json` 文件来创建自己的:

241 

242```json .lsp.json theme={null}

243{

244 "go": {

245 "command": "gopls",

246 "args": ["serve"],

247 "extensionToLanguage": {

248 ".go": "go"

249 }

250 }

251}

252```

253 

254安装你的插件的用户必须在其机器上安装语言服务器二进制文件。

255 

256有关完整的 LSP 配置选项,请参阅 [LSP servers](/zh-CN/plugins-reference#lsp-servers)。

257 

258### 向你的插件添加后台监视器

259 

260后台监视器让你的插件在后台监视日志、文件或外部状态,并在事件到达时通知 Claude。Claude Code 在插件处于活动状态时自动启动每个监视器,因此你无需指示 Claude 启动监视。

261 

262在插件根目录添加一个 `monitors/monitors.json` 文件,其中包含监视器条目数组:

263 

264```json monitors/monitors.json theme={null}

265[

266 {

267 "name": "error-log",

268 "command": "tail -F ./logs/error.log",

269 "description": "Application error log"

270 }

271]

272```

273 

274来自 `command` 的每个 stdout 行在会话期间作为通知传递给 Claude。有关完整的架构,包括 `when` 触发器和变量替换,请参阅 [Monitors](/zh-CN/plugins-reference#monitors)。

275 

276### 使用你的插件提供默认设置

277 

278插件可以在插件根目录包含一个 `settings.json` 文件,以在启用插件时应用默认配置。目前仅支持 `agent` 和 `subagentStatusLine` 键。

279 

280设置 `agent` 激活插件的[自定义 agents](/zh-CN/sub-agents) 之一作为主线程,应用其系统提示、工具限制和模型。这让插件在启用时通过改变 Claude Code 的默认行为方式。

281 

282```json settings.json theme={null}

283{

284 "agent": "security-reviewer"

285}

286```

287 

288此示例激活在插件的 `agents/` 目录中定义的 `security-reviewer` agent。来自 `settings.json` 的设置优先于在 `plugin.json` 中声明的 `settings`。未知键被静默忽略。

289 

290### 组织复杂的插件

291 

292对于具有许多组件的插件,按功能组织你的目录结构。有关完整的目录布局和组织模式,请参阅 [Plugin directory structure](/zh-CN/plugins-reference#plugin-directory-structure)。

293 

294### 在本地测试你的插件

295 

296使用 `--plugin-dir` 标志在开发期间测试插件。这会直接加载你的插件,无需安装。

297 

298```bash theme={null}

299claude --plugin-dir ./my-plugin

300```

301 

302当 `--plugin-dir` 插件与已安装的市场插件同名时,本地副本在该会话中优先。这让你可以测试已安装的插件的更改,而无需先卸载它。由托管设置强制启用的市场插件是唯一的例外,无法被覆盖。

303 

304当你对插件进行更改时,运行 `/reload-plugins` 以获取更新,无需重新启动。这会重新加载 plugins、skills、agents、hooks、插件 MCP servers 和插件 LSP servers。测试你的插件组件:

305 

306* 使用 `/plugin-name:skill-name` 尝试你的 skills

307* 检查 agents 是否出现在 `/agents` 中

308* 验证 hooks 是否按预期工作

309 

310<Tip>

311 你可以通过多次指定标志来一次加载多个插件:

312 

313 ```bash theme={null}

314 claude --plugin-dir ./plugin-one --plugin-dir ./plugin-two

315 ```

316</Tip>

317 

318### 调试插件问题

319 

320如果你的插件不按预期工作:

321 

3221. **检查结构**:确保你的目录在插件根目录,而不是在 `.claude-plugin/` 内

3232. **单独测试组件**:分别检查每个 skill、agent 和 hook

3243. **使用验证和调试工具**:有关 CLI 命令和故障排除技术,请参阅 [Debugging and development tools](/zh-CN/plugins-reference#debugging-and-development-tools)

325 

326### 共享你的插件

327 

328当你的插件准备好共享时:

329 

3301. **添加文档**:包含一个 `README.md`,其中包含安装和使用说明

3312. **选择版本控制策略**:决定是设置显式 `version` 还是依赖 git 提交 SHA。请参阅 [version management](/zh-CN/plugins-reference#version-management)

3323. **创建或使用市场**:通过 [plugin marketplaces](/zh-CN/plugin-marketplaces) 分发以供安装

3334. **与他人测试**:在更广泛分发之前让团队成员测试插件

334 

335一旦你的插件在市场中,其他人可以使用 [Discover and install plugins](/zh-CN/discover-plugins) 中的说明安装它。要将插件保持在你的团队内部,请在 [private repository](/zh-CN/plugin-marketplaces#private-repositories) 中托管市场。

336 

337### 向官方市场提交你的插件

338 

339要向官方 Anthropic 市场提交插件,请使用以下应用内提交表单之一:

340 

341* **Claude.ai**:[claude.ai/settings/plugins/submit](https://claude.ai/settings/plugins/submit)

342* **Console**:[platform.claude.com/plugins/submit](https://platform.claude.com/plugins/submit)

343 

344一旦你的插件被列出,你可以拥有自己的 CLI 提示 Claude Code 用户安装它。请参阅 [Recommend your plugin from your CLI](/zh-CN/plugin-hints)。

345 

346<Note>

347 有关完整的技术规范、调试技术和分发策略,请参阅 [Plugins reference](/zh-CN/plugins-reference)。

348</Note>

349 

350## 将现有配置转换为插件

351 

352如果你已经在 `.claude/` 目录中有 skills 或 hooks,你可以将它们转换为插件,以便更轻松地共享和分发。

353 

354### 迁移步骤

355 

356<Steps>

357 <Step title="创建插件结构">

358 创建一个新的插件目录:

359 

360 ```bash theme={null}

361 mkdir -p my-plugin/.claude-plugin

362 ```

363 

364 在 `my-plugin/.claude-plugin/plugin.json` 处创建清单文件:

365 

366 ```json my-plugin/.claude-plugin/plugin.json theme={null}

367 {

368 "name": "my-plugin",

369 "description": "Migrated from standalone configuration",

370 "version": "1.0.0"

371 }

372 ```

373 </Step>

374 

375 <Step title="复制你现有的文件">

376 将你现有的配置复制到插件目录:

377 

378 ```bash theme={null}

379 # Copy commands

380 cp -r .claude/commands my-plugin/

381 

382 # Copy agents (if any)

383 cp -r .claude/agents my-plugin/

384 

385 # Copy skills (if any)

386 cp -r .claude/skills my-plugin/

387 ```

388 </Step>

389 

390 <Step title="迁移 hooks">

391 如果你在设置中有 hooks,请创建一个 hooks 目录:

392 

393 ```bash theme={null}

394 mkdir my-plugin/hooks

395 ```

396 

397 使用你的 hooks 配置创建 `my-plugin/hooks/hooks.json`。从你的 `.claude/settings.json` 或 `settings.local.json` 复制 `hooks` 对象,因为格式相同。命令在 stdin 上接收 hook 输入作为 JSON,所以使用 `jq` 提取文件路径:

398 

399 ```json my-plugin/hooks/hooks.json theme={null}

400 {

401 "hooks": {

402 "PostToolUse": [

403 {

404 "matcher": "Write|Edit",

405 "hooks": [{ "type": "command", "command": "jq -r '.tool_input.file_path' | xargs npm run lint:fix" }]

406 }

407 ]

408 }

409 }

410 ```

411 </Step>

412 

413 <Step title="测试你迁移的插件">

414 加载你的插件以验证一切正常:

415 

416 ```bash theme={null}

417 claude --plugin-dir ./my-plugin

418 ```

419 

420 测试每个组件:运行你的命令、检查 agents 是否出现在 `/agents` 中,并验证 hooks 是否正确触发。

421 </Step>

422</Steps>

423 

424### 迁移时的变化

425 

426| 独立(`.claude/`) | 插件 |

427| :----------------------- | :--------------------------- |

428| 仅在一个项目中可用 | 可以通过市场共享 |

429| `.claude/commands/` 中的文件 | `plugin-name/commands/` 中的文件 |

430| `settings.json` 中的 Hooks | `hooks/hooks.json` 中的 Hooks |

431| 必须手动复制以共享 | 使用 `/plugin install` 安装 |

432 

433<Note>

434 迁移后,你可以从 `.claude/` 中删除原始文件以避免重复。加载时插件版本将优先。

435</Note>

436 

437## 后续步骤

438 

439现在你了解了 Claude Code 的插件系统,以下是针对不同目标的建议路径:

440 

441### 对于插件用户

442 

443* [发现和安装插件](/zh-CN/discover-plugins):浏览市场并安装插件

444* [配置团队市场](/zh-CN/discover-plugins#configure-team-marketplaces):为你的团队设置存储库级别的插件

445 

446### 对于插件开发者

447 

448* [创建和分发市场](/zh-CN/plugin-marketplaces):打包和共享你的插件

449* [插件参考](/zh-CN/plugins-reference):完整的技术规范

450* 深入了解特定的插件组件:

451 * [Skills](/zh-CN/skills):skill 开发详情

452 * [Subagents](/zh-CN/sub-agents):agent 配置和功能

453 * [Hooks](/zh-CN/hooks):事件处理和自动化

454 * [MCP](/zh-CN/mcp):外部工具集成

plugins-reference.md +1011 −0 created

Details

1> ## Documentation Index

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

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

4 

5# Plugins 参考

6 

7> Claude Code 插件系统的完整技术参考,包括架构、CLI 命令和组件规范。

8 

9<Tip>

10 想要安装插件?请参阅[发现和安装插件](/zh-CN/discover-plugins)。如需创建插件,请参阅[Plugins](/zh-CN/plugins)。如需分发插件,请参阅[Plugin marketplaces](/zh-CN/plugin-marketplaces)。

11</Tip>

12 

13本参考提供了 Claude Code 插件系统的完整技术规范,包括组件架构、CLI 命令和开发工具。

14 

15**plugin** 是一个自包含的组件目录,用于扩展 Claude Code 的自定义功能。插件组件包括 skills、agents、hooks、MCP servers、LSP servers 和 monitors。

16 

17## Plugin 组件参考

18 

19### Skills

20 

21Plugins 向 Claude Code 添加 skills,创建可由您或 Claude 调用的 `/name` 快捷方式。

22 

23**位置**:插件根目录中的 `skills/` 或 `commands/` 目录

24 

25**文件格式**:Skills 是包含 `SKILL.md` 的目录;commands 是简单的 markdown 文件

26 

27**Skill 结构**:

28 

29```text theme={null}

30skills/

31├── pdf-processor/

32│ ├── SKILL.md

33│ ├── reference.md (可选)

34│ └── scripts/ (可选)

35└── code-reviewer/

36 └── SKILL.md

37```

38 

39**集成行为**:

40 

41* 安装插件时会自动发现 Skills 和 commands

42* Claude 可以根据任务上下文自动调用它们

43* Skills 可以在 SKILL.md 旁边包含支持文件

44 

45有关完整详情,请参阅[Skills](/zh-CN/skills)。

46 

47### Agents

48 

49Plugins 可以为特定任务提供专门的 subagents,Claude 可以在适当时自动调用。

50 

51**位置**:插件根目录中的 `agents/` 目录

52 

53**文件格式**:描述 agent 功能的 Markdown 文件

54 

55**Agent 结构**:

56 

57```markdown theme={null}

58---

59name: agent-name

60description: 该 agent 的专长以及 Claude 应何时调用它

61model: sonnet

62effort: medium

63maxTurns: 20

64disallowedTools: Write, Edit

65---

66 

67详细的系统提示,描述 agent 的角色、专业知识和行为。

68```

69 

70Plugin agents 支持 `name`、`description`、`model`、`effort`、`maxTurns`、`tools`、`disallowedTools`、`skills`、`memory`、`background` 和 `isolation` frontmatter 字段。唯一有效的 `isolation` 值是 `"worktree"`。出于安全原因,plugin 提供的 agents 不支持 `hooks`、`mcpServers` 和 `permissionMode`。

71 

72**集成点**:

73 

74* Agents 出现在 `/agents` 界面中

75* Claude 可以根据任务上下文自动调用 agents

76* Agents 可以由用户手动调用

77* Plugin agents 与内置 Claude agents 一起工作

78 

79有关完整详情,请参阅[Subagents](/zh-CN/sub-agents)。

80 

81### Hooks

82 

83Plugins 可以提供事件处理程序,自动响应 Claude Code 事件。

84 

85**位置**:插件根目录中的 `hooks/hooks.json`,或在 plugin.json 中内联

86 

87**格式**:具有事件匹配器和操作的 JSON 配置

88 

89**Hook 配置**:

90 

91```json theme={null}

92{

93 "hooks": {

94 "PostToolUse": [

95 {

96 "matcher": "Write|Edit",

97 "hooks": [

98 {

99 "type": "command",

100 "command": "${CLAUDE_PLUGIN_ROOT}/scripts/format-code.sh"

101 }

102 ]

103 }

104 ]

105 }

106}

107```

108 

109Plugin hooks 响应与[用户定义的 hooks](/zh-CN/hooks)相同的生命周期事件:

110 

111| Event | When it fires |

112| :-------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------- |

113| `SessionStart` | When a session begins or resumes |

114| `Setup` | When you start Claude Code with `--init-only`, or with `--init` or `--maintenance` in `-p` mode. For one-time preparation in CI or scripts |

115| `UserPromptSubmit` | When you submit a prompt, before Claude processes it |

116| `UserPromptExpansion` | When a user-typed command expands into a prompt, before it reaches Claude. Can block the expansion |

117| `PreToolUse` | Before a tool call executes. Can block it |

118| `PermissionRequest` | When a permission dialog appears |

119| `PermissionDenied` | When a tool call is denied by the auto mode classifier. Return `{retry: true}` to tell the model it may retry the denied tool call |

120| `PostToolUse` | After a tool call succeeds |

121| `PostToolUseFailure` | After a tool call fails |

122| `PostToolBatch` | After a full batch of parallel tool calls resolves, before the next model call |

123| `Notification` | When Claude Code sends a notification |

124| `SubagentStart` | When a subagent is spawned |

125| `SubagentStop` | When a subagent finishes |

126| `TaskCreated` | When a task is being created via `TaskCreate` |

127| `TaskCompleted` | When a task is being marked as completed |

128| `Stop` | When Claude finishes responding |

129| `StopFailure` | When the turn ends due to an API error. Output and exit code are ignored |

130| `TeammateIdle` | When an [agent team](/en/agent-teams) teammate is about to go idle |

131| `InstructionsLoaded` | When a CLAUDE.md or `.claude/rules/*.md` file is loaded into context. Fires at session start and when files are lazily loaded during a session |

132| `ConfigChange` | When a configuration file changes during a session |

133| `CwdChanged` | When the working directory changes, for example when Claude executes a `cd` command. Useful for reactive environment management with tools like direnv |

134| `FileChanged` | When a watched file changes on disk. The `matcher` field specifies which filenames to watch |

135| `WorktreeCreate` | When a worktree is being created via `--worktree` or `isolation: "worktree"`. Replaces default git behavior |

136| `WorktreeRemove` | When a worktree is being removed, either at session exit or when a subagent finishes |

137| `PreCompact` | Before context compaction |

138| `PostCompact` | After context compaction completes |

139| `Elicitation` | When an MCP server requests user input during a tool call |

140| `ElicitationResult` | After a user responds to an MCP elicitation, before the response is sent back to the server |

141| `SessionEnd` | When a session terminates |

142 

143**Hook 类型**:

144 

145* `command`:执行 shell 命令或脚本

146* `http`:将事件 JSON 作为 POST 请求发送到 URL

147* `mcp_tool`:在配置的 [MCP server](/zh-CN/mcp) 上调用工具

148* `prompt`:使用 LLM 评估提示(使用 `$ARGUMENTS` 占位符表示上下文)

149* `agent`:运行具有工具的 agentic 验证器以完成复杂验证任务

150 

151### MCP servers

152 

153Plugins 可以捆绑 Model Context Protocol (MCP) servers 以将 Claude Code 与外部工具和服务连接。

154 

155**位置**:插件根目录中的 `.mcp.json`,或在 plugin.json 中内联

156 

157**格式**:标准 MCP server 配置

158 

159**MCP server 配置**:

160 

161```json theme={null}

162{

163 "mcpServers": {

164 "plugin-database": {

165 "command": "${CLAUDE_PLUGIN_ROOT}/servers/db-server",

166 "args": ["--config", "${CLAUDE_PLUGIN_ROOT}/config.json"],

167 "env": {

168 "DB_PATH": "${CLAUDE_PLUGIN_ROOT}/data"

169 }

170 },

171 "plugin-api-client": {

172 "command": "npx",

173 "args": ["@company/mcp-server", "--plugin-mode"],

174 "cwd": "${CLAUDE_PLUGIN_ROOT}"

175 }

176 }

177}

178```

179 

180**集成行为**:

181 

182* 启用插件时,Plugin MCP servers 会自动启动

183* Servers 在 Claude 的工具包中显示为标准 MCP 工具

184* Server 功能与 Claude 的现有工具无缝集成

185* Plugin servers 可以独立于用户 MCP servers 进行配置

186 

187### LSP servers

188 

189<Tip>

190 想要使用 LSP plugins?从官方市场安装它们:在 `/plugin` Discover 选项卡中搜索"lsp"。本部分记录了如何为官方市场未涵盖的语言创建 LSP plugins。

191</Tip>

192 

193Plugins 可以提供[Language Server Protocol](https://microsoft.github.io/language-server-protocol/) (LSP) servers,在处理代码库时为 Claude 提供实时代码智能。

194 

195LSP 集成提供:

196 

197* **即时诊断**:Claude 在每次编辑后立即看到错误和警告

198* **代码导航**:转到定义、查找引用和悬停信息

199* **语言感知**:代码符号的类型信息和文档

200 

201**位置**:插件根目录中的 `.lsp.json`,或在 `plugin.json` 中内联

202 

203**格式**:将语言服务器名称映射到其配置的 JSON 配置

204 

205**`.lsp.json` 文件格式**:

206 

207```json theme={null}

208{

209 "go": {

210 "command": "gopls",

211 "args": ["serve"],

212 "extensionToLanguage": {

213 ".go": "go"

214 }

215 }

216}

217```

218 

219**在 `plugin.json` 中内联**:

220 

221```json theme={null}

222{

223 "name": "my-plugin",

224 "lspServers": {

225 "go": {

226 "command": "gopls",

227 "args": ["serve"],

228 "extensionToLanguage": {

229 ".go": "go"

230 }

231 }

232 }

233}

234```

235 

236**必需字段:**

237 

238| 字段 | 描述 |

239| :-------------------- | :------------------------- |

240| `command` | 要执行的 LSP 二进制文件(必须在 PATH 中) |

241| `extensionToLanguage` | 将文件扩展名映射到语言标识符 |

242 

243**可选字段:**

244 

245| 字段 | 描述 |

246| :---------------------- | :------------------------------------------ |

247| `args` | LSP server 的命令行参数 |

248| `transport` | 通信传输:`stdio`(默认)或 `socket` |

249| `env` | 启动 server 时要设置的环境变量 |

250| `initializationOptions` | 在初始化期间传递给 server 的选项 |

251| `settings` | 通过 `workspace/didChangeConfiguration` 传递的设置 |

252| `workspaceFolder` | server 的工作区文件夹路径 |

253| `startupTimeout` | 等待 server 启动的最长时间(毫秒) |

254| `shutdownTimeout` | 等待正常关闭的最长时间(毫秒) |

255| `restartOnCrash` | server 崩溃时是否自动重启 |

256| `maxRestarts` | 放弃前的最大重启尝试次数 |

257 

258<Warning>

259 **您必须单独安装语言服务器二进制文件。** LSP plugins 配置 Claude Code 如何连接到语言服务器,但它们不包括服务器本身。如果在 `/plugin` Errors 选项卡中看到 `Executable not found in $PATH`,请为您的语言安装所需的二进制文件。

260</Warning>

261 

262**可用的 LSP plugins:**

263 

264| Plugin | 语言服务器 | 安装命令 |

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

266| `pyright-lsp` | Pyright (Python) | `pip install pyright` 或 `npm install -g pyright` |

267| `typescript-lsp` | TypeScript Language Server | `npm install -g typescript-language-server typescript` |

268| `rust-lsp` | rust-analyzer | [参阅 rust-analyzer 安装](https://rust-analyzer.github.io/manual.html#installation) |

269 

270首先安装语言服务器,然后从市场安装 plugin。

271 

272### Monitors

273 

274Plugins 可以声明后台 monitors,Claude Code 在 plugin 激活时自动启动。每个 monitor 为会话的生命周期运行一个 shell 命令,并将每个 stdout 行作为通知传递给 Claude,以便 Claude 可以对日志条目、状态更改或轮询事件做出反应,而无需被要求启动监视本身。

275 

276Plugin monitors 使用与[Monitor tool](/zh-CN/tools-reference#monitor-tool)相同的机制,并共享其可用性约束。它们仅在交互式 CLI 会话中运行,在与[hooks](#hooks)相同的信任级别上无沙箱运行,并在 Monitor tool 不可用的主机上跳过。

277 

278<Note>

279 Plugin monitors 需要 Claude Code v2.1.105 或更高版本。

280</Note>

281 

282**位置**:插件根目录中的 `monitors/monitors.json`,或在 plugin.json 中内联

283 

284**格式**:监视器条目的 JSON 数组

285 

286以下 `monitors/monitors.json` 监视部署状态端点和本地错误日志:

287 

288```json theme={null}

289[

290 {

291 "name": "deploy-status",

292 "command": "${CLAUDE_PLUGIN_ROOT}/scripts/poll-deploy.sh ${user_config.api_endpoint}",

293 "description": "Deployment status changes"

294 },

295 {

296 "name": "error-log",

297 "command": "tail -F ./logs/error.log",

298 "description": "Application error log",

299 "when": "on-skill-invoke:debug"

300 }

301]

302```

303 

304要内联声明 monitors,请将 `plugin.json` 中的 `monitors` 键设置为相同的数组。要从非默认路径加载,请将 `monitors` 设置为相对路径字符串,例如 `"./config/monitors.json"`。

305 

306**必需字段:**

307 

308| 字段 | 描述 |

309| :------------ | :------------------------------------- |

310| `name` | 在插件中唯一的标识符。防止插件重新加载或再次调用 skill 时出现重复进程 |

311| `command` | 在会话工作目录中作为持久后台进程运行的 shell 命令 |

312| `description` | 正在监视的内容的简短摘要。显示在任务面板和通知摘要中 |

313 

314**可选字段:**

315 

316| 字段 | 描述 |

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

318| `when` | 控制 monitor 何时启动。`"always"` 在会话启动和插件重新加载时启动它,这是默认值。`"on-skill-invoke:<skill-name>"` 在此插件中的命名 skill 首次被分派时启动它 |

319 

320`command` 值支持与 MCP 和 LSP server 配置相同的[变量替换](#environment-variables):`${CLAUDE_PLUGIN_ROOT}`、`${CLAUDE_PLUGIN_DATA}`、`${user_config.*}` 和环境中的任何 `${ENV_VAR}`。如果脚本需要从插件自己的目录运行,请在命令前加上 `cd "${CLAUDE_PLUGIN_ROOT}" && `。

321 

322在会话中途禁用插件不会停止已在运行的 monitors。它们在会话结束时停止。

323 

324### Themes

325 

326Plugins 可以提供颜色主题,这些主题与内置预设和用户的本地主题一起出现在 `/theme` 中。主题是 `themes/` 中的 JSON 文件,具有 `base` 预设和稀疏的 `overrides` 颜色令牌映射。

327 

328```json theme={null}

329{

330 "name": "Dracula",

331 "base": "dark",

332 "overrides": {

333 "claude": "#bd93f9",

334 "error": "#ff5555",

335 "success": "#50fa7b"

336 }

337}

338```

339 

340选择 plugin 主题会在用户的配置中持久化 `custom:<plugin-name>:<slug>`。Plugin 主题是只读的;在 `/theme` 中按 `Ctrl+E` 会将其复制到 `~/.claude/themes/`,以便用户可以编辑副本。

341 

342***

343 

344## Plugin 安装范围

345 

346安装 plugin 时,您选择一个**范围**,确定 plugin 的可用位置以及谁可以使用它:

347 

348| 范围 | 设置文件 | 用例 |

349| :-------- | :------------------------------------------------- | :----------------------- |

350| `user` | `~/.claude/settings.json` | 在所有项目中可用的个人 plugins(默认) |

351| `project` | `.claude/settings.json` | 通过版本控制共享的团队 plugins |

352| `local` | `.claude/settings.local.json` | 项目特定的 plugins,gitignored |

353| `managed` | [Managed settings](/zh-CN/settings#settings-files) | 托管 plugins(只读,仅更新) |

354 

355Plugins 使用与其他 Claude Code 配置相同的范围系统。有关安装说明和范围标志,请参阅[安装 plugins](/zh-CN/discover-plugins#install-plugins)。有关范围的完整说明,请参阅[Configuration scopes](/zh-CN/settings#configuration-scopes)。

356 

357***

358 

359## Plugin 清单架构

360 

361`.claude-plugin/plugin.json` 文件定义了您的 plugin 的元数据和配置。本部分记录了所有支持的字段和选项。

362 

363清单是可选的。如果省略,Claude Code 会自动发现[默认位置](#file-locations-reference)中的组件,并从目录名称派生 plugin 名称。当您需要提供元数据或自定义组件路径时,使用清单。

364 

365### 完整架构

366 

367```json theme={null}

368{

369 "name": "plugin-name",

370 "version": "1.2.0",

371 "description": "Brief plugin description",

372 "author": {

373 "name": "Author Name",

374 "email": "author@example.com",

375 "url": "https://github.com/author"

376 },

377 "homepage": "https://docs.example.com/plugin",

378 "repository": "https://github.com/author/plugin",

379 "license": "MIT",

380 "keywords": ["keyword1", "keyword2"],

381 "skills": "./custom/skills/",

382 "commands": ["./custom/commands/special.md"],

383 "agents": ["./custom/agents/reviewer.md"],

384 "hooks": "./config/hooks.json",

385 "mcpServers": "./mcp-config.json",

386 "outputStyles": "./styles/",

387 "themes": "./themes/",

388 "lspServers": "./.lsp.json",

389 "monitors": "./monitors.json",

390 "dependencies": [

391 "helper-lib",

392 { "name": "secrets-vault", "version": "~2.1.0" }

393 ]

394}

395```

396 

397### 必需字段

398 

399如果包含清单,`name` 是唯一必需的字段。

400 

401| 字段 | 类型 | 描述 | 示例 |

402| :----- | :----- | :-------------------- | :------------------- |

403| `name` | string | 唯一标识符(kebab-case,无空格) | `"deployment-tools"` |

404 

405此名称用于命名空间组件。例如,在 UI 中,名为 `plugin-dev` 的 plugin 的 agent `agent-creator` 将显示为 `plugin-dev:agent-creator`。

406 

407### 元数据字段

408 

409| 字段 | 类型 | 描述 | 示例 |

410| :------------ | :----- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------- |

411| `$schema` | string | 用于编辑器自动完成和验证的 JSON Schema URL。Claude Code 在加载时忽略此字段。 | `"https://json.schemastore.org/claude-code-plugin-manifest.json"` |

412| `version` | string | 可选。语义版本。设置此项会将 plugin 固定到该版本字符串,因此用户仅在您提升版本时才会收到更新。如果省略,Claude Code 会回退到 git commit SHA,因此每个 commit 都被视为新版本。如果也在市场条目中设置,`plugin.json` 优先。请参阅[版本管理](#version-management)。 | `"2.1.0"` |

413| `description` | string | plugin 目的的简要说明 | `"Deployment automation tools"` |

414| `author` | object | 作者信息 | `{"name": "Dev Team", "email": "dev@company.com"}` |

415| `homepage` | string | 文档 URL | `"https://docs.example.com"` |

416| `repository` | string | 源代码 URL | `"https://github.com/user/plugin"` |

417| `license` | string | 许可证标识符 | `"MIT"`、`"Apache-2.0"` |

418| `keywords` | array | 发现标签 | `["deployment", "ci-cd"]` |

419 

420### 组件路径字段

421 

422| 字段 | 类型 | 描述 | 示例 |

423| :------------- | :-------------------- | :----------------------------------------------------------------------------------------------------- | :--------------------------------------------------- |

424| `skills` | string\|array | 包含 `<name>/SKILL.md` 的自定义 skill 目录(替换默认 `skills/`) | `"./custom/skills/"` |

425| `commands` | string\|array | 自定义平面 `.md` skill 文件或目录(替换默认 `commands/`) | `"./custom/cmd.md"` 或 `["./cmd1.md"]` |

426| `agents` | string\|array | 自定义 agent 文件(替换默认 `agents/`) | `"./custom/agents/reviewer.md"` |

427| `hooks` | string\|array\|object | Hook 配置路径或内联配置 | `"./my-extra-hooks.json"` |

428| `mcpServers` | string\|array\|object | MCP 配置路径或内联配置 | `"./my-extra-mcp-config.json"` |

429| `outputStyles` | string\|array | 自定义输出样式文件/目录(替换默认 `output-styles/`) | `"./styles/"` |

430| `themes` | string\|array | 颜色主题文件/目录(替换默认 `themes/`)。请参阅[Themes](#themes) | `"./themes/"` |

431| `lspServers` | string\|array\|object | [Language Server Protocol](https://microsoft.github.io/language-server-protocol/) 配置用于代码智能(转到定义、查找引用等) | `"./.lsp.json"` |

432| `monitors` | string\|array | 后台[Monitor](/zh-CN/tools-reference#monitor-tool)配置,在 plugin 激活时自动启动。请参阅[Monitors](#monitors) | `"./monitors.json"` |

433| `userConfig` | object | 用户可配置的值,在启用时提示。请参阅[用户配置](#user-configuration) | 见下文 |

434| `channels` | array | 消息注入的频道声明(Telegram、Slack、Discord 风格)。请参阅[Channels](#channels) | 见下文 |

435| `dependencies` | array | 此 plugin 需要的其他 plugins,可选择带有 semver 版本约束。请参阅[约束 plugin 依赖版本](/zh-CN/plugin-dependencies) | `[{ "name": "secrets-vault", "version": "~2.1.0" }]` |

436 

437### 用户配置

438 

439`userConfig` 字段声明了 Claude Code 在启用 plugin 时提示用户的值。使用此字段而不是要求用户手动编辑 `settings.json`。

440 

441```json theme={null}

442{

443 "userConfig": {

444 "api_endpoint": {

445 "type": "string",

446 "title": "API endpoint",

447 "description": "Your team's API endpoint"

448 },

449 "api_token": {

450 "type": "string",

451 "title": "API token",

452 "description": "API authentication token",

453 "sensitive": true

454 }

455 }

456}

457```

458 

459键必须是有效的标识符。每个选项支持这些字段:

460 

461| 字段 | 必需 | 描述 |

462| :------------ | :- | :---------------------------------------------------- |

463| `type` | 是 | 以下之一:`string`、`number`、`boolean`、`directory` 或 `file` |

464| `title` | 是 | 在配置对话框中显示的标签 |

465| `description` | 是 | 显示在字段下方的帮助文本 |

466| `sensitive` | 否 | 如果为 `true`,掩盖输入并将值存储在安全存储中而不是 `settings.json` |

467| `required` | 否 | 如果为 `true`,当字段为空时验证失败 |

468| `default` | 否 | 用户未提供任何内容时使用的值 |

469| `multiple` | 否 | 对于 `string` 类型,允许字符串数组 |

470| `min` / `max` | 否 | `number` 类型的边界 |

471 

472每个值都可用于在 MCP 和 LSP server 配置、hook 命令和 monitor 命令中作为 `${user_config.KEY}` 进行替换。非敏感值也可以在 skill 和 agent 内容中替换。所有值都作为 `CLAUDE_PLUGIN_OPTION_<KEY>` 环境变量导出到 plugin 子进程。

473 

474非敏感值存储在 `settings.json` 中的 `pluginConfigs[<plugin-id>].options` 下。敏感值进入系统钥匙链(或在钥匙链不可用的地方进入 `~/.claude/.credentials.json`)。钥匙链存储与 OAuth 令牌共享,总限制约为 2 KB,因此请保持敏感值较小。

475 

476### Channels

477 

478`channels` 字段允许 plugin 声明一个或多个消息频道,将内容注入到对话中。每个频道绑定到 plugin 提供的 MCP server。

479 

480```json theme={null}

481{

482 "channels": [

483 {

484 "server": "telegram",

485 "userConfig": {

486 "bot_token": {

487 "type": "string",

488 "title": "Bot token",

489 "description": "Telegram bot token",

490 "sensitive": true

491 },

492 "owner_id": {

493 "type": "string",

494 "title": "Owner ID",

495 "description": "Your Telegram user ID"

496 }

497 }

498 }

499 ]

500}

501```

502 

503`server` 字段是必需的,必须与 plugin 的 `mcpServers` 中的键匹配。可选的每个频道 `userConfig` 使用与顶级字段相同的架构,允许 plugin 在启用 plugin 时提示输入机器人令牌或所有者 ID。

504 

505### 路径行为规则

506 

507对于 `skills`、`commands`、`agents`、`outputStyles`、`themes` 和 `monitors`,自定义路径替换默认值。如果清单指定 `skills`,则不会扫描默认 `skills/` 目录;如果指定 `monitors`,则不会加载默认 `monitors/monitors.json`。[Hooks](#hooks)、[MCP servers](#mcp-servers) 和[LSP servers](#lsp-servers)对处理多个源有不同的语义。

508 

509* 所有路径必须相对于 plugin 根目录,并以 `./` 开头

510* 来自自定义路径的组件使用相同的命名和命名空间规则

511* 可以将多个路径指定为数组

512* 要保留默认目录并为 skills、commands、agents 或 output styles 添加更多路径,请在数组中包含默认值:`"skills": ["./skills/", "./extras/"]`

513* 当 skill 路径指向直接包含 `SKILL.md` 的目录时,例如 `"skills": ["./"]` 指向 plugin 根目录,frontmatter 中的 `name` 字段确定 skill 的调用名称。这提供了一个稳定的名称,无论安装目录如何。如果 frontmatter 中未设置 `name`,则使用目录基名作为后备。

514 

515**路径示例**:

516 

517```json theme={null}

518{

519 "commands": [

520 "./specialized/deploy.md",

521 "./utilities/batch-process.md"

522 ],

523 "agents": [

524 "./custom-agents/reviewer.md",

525 "./custom-agents/tester.md"

526 ]

527}

528```

529 

530### 环境变量

531 

532Claude Code 提供两个变量用于引用 plugin 路径。两者都在 skill 内容、agent 内容、hook 命令、monitor 命令以及 MCP 或 LSP server 配置中出现的任何地方进行内联替换。两者也都作为环境变量导出到 hook 进程和 MCP 或 LSP server 子进程。

533 

534**`${CLAUDE_PLUGIN_ROOT}`**:plugin 安装目录的绝对路径。使用此路径引用与 plugin 捆绑的脚本、二进制文件和配置文件。当 plugin 更新时,此路径会更改,因此您在此处写入的文件不会在更新后保留。

535 

536**`${CLAUDE_PLUGIN_DATA}`**:用于 plugin 状态的持久目录,在更新后保留。使用此目录用于已安装的依赖项,如 `node_modules` 或 Python 虚拟环境、生成的代码、缓存以及任何应在 plugin 版本之间保留的其他文件。首次引用此变量时,目录会自动创建。

537 

538```json theme={null}

539{

540 "hooks": {

541 "PostToolUse": [

542 {

543 "hooks": [

544 {

545 "type": "command",

546 "command": "${CLAUDE_PLUGIN_ROOT}/scripts/process.sh"

547 }

548 ]

549 }

550 ]

551 }

552}

553```

554 

555#### 持久数据目录

556 

557`${CLAUDE_PLUGIN_DATA}` 目录解析为 `~/.claude/plugins/data/{id}/`,其中 `{id}` 是 plugin 标识符,其中 `a-z`、`A-Z`、`0-9`、`_` 和 `-` 之外的字符被替换为 `-`。对于安装为 `formatter@my-marketplace` 的 plugin,目录是 `~/.claude/plugins/data/formatter-my-marketplace/`。

558 

559常见用途是一次安装语言依赖项并在会话和 plugin 更新中重复使用它们。由于数据目录的生命周期长于任何单个 plugin 版本,仅检查目录存在性无法检测到更新何时更改了 plugin 的依赖项清单。推荐的模式是将捆绑的清单与数据目录中的副本进行比较,并在它们不同时重新安装。

560 

561此 `SessionStart` hook 在第一次运行时安装 `node_modules`,并在 plugin 更新包含更改的 `package.json` 时再次安装:

562 

563```json theme={null}

564{

565 "hooks": {

566 "SessionStart": [

567 {

568 "hooks": [

569 {

570 "type": "command",

571 "command": "diff -q \"${CLAUDE_PLUGIN_ROOT}/package.json\" \"${CLAUDE_PLUGIN_DATA}/package.json\" >/dev/null 2>&1 || (cd \"${CLAUDE_PLUGIN_DATA}\" && cp \"${CLAUDE_PLUGIN_ROOT}/package.json\" . && npm install) || rm -f \"${CLAUDE_PLUGIN_DATA}/package.json\""

572 }

573 ]

574 }

575 ]

576 }

577}

578```

579 

580当存储的副本缺失或与捆绑的副本不同时,`diff` 退出非零,涵盖第一次运行和依赖项更改的更新。如果 `npm install` 失败,尾部的 `rm` 会删除复制的清单,以便下一个会话重试。

581 

582捆绑在 `${CLAUDE_PLUGIN_ROOT}` 中的脚本可以针对持久的 `node_modules` 运行:

583 

584```json theme={null}

585{

586 "mcpServers": {

587 "routines": {

588 "command": "node",

589 "args": ["${CLAUDE_PLUGIN_ROOT}/server.js"],

590 "env": {

591 "NODE_PATH": "${CLAUDE_PLUGIN_DATA}/node_modules"

592 }

593 }

594 }

595}

596```

597 

598当您从最后一个安装了 plugin 的范围卸载 plugin 时,数据目录会自动删除。`/plugin` 界面显示目录大小并在删除前提示。CLI 默认删除;传递 [`--keep-data`](#plugin-uninstall) 以保留它。

599 

600***

601 

602## Plugin 缓存和文件解析

603 

604Plugins 通过以下两种方式之一指定:

605 

606* 通过 `claude --plugin-dir`,用于会话期间。

607* 通过市场,为将来的会话安装。

608 

609出于安全和验证目的,Claude Code 将\_市场\_ plugins 复制到用户的本地 **plugin 缓存**(`~/.claude/plugins/cache`),而不是就地使用它们。在开发引用外部文件的 plugins 时,理解此行为很重要。

610 

611每个已安装的版本是缓存中的单独目录。当您更新或卸载 plugin 时,前一个版本目录被标记为孤立,并在 7 天后自动删除。宽限期允许已加载旧版本的并发 Claude Code 会话继续运行而不出错。

612 

613Claude 的 Glob 和 Grep 工具在搜索期间跳过孤立版本目录,因此文件结果不包括过时的插件代码。

614 

615### 路径遍历限制

616 

617已安装的 plugins 无法引用其目录外的文件。遍历 plugin 根目录外的路径(例如 `../shared-utils`)在安装后将不起作用,因为这些外部文件不会被复制到缓存中。

618 

619### 使用外部依赖

620 

621如果您的 plugin 需要访问其目录外的文件,您可以在 plugin 目录中创建指向外部文件的符号链接。符号链接在缓存中被保留而不是解引用,并在运行时解析到其目标。以下命令在插件目录内创建指向共享实用程序位置的链接:

622 

623```bash theme={null}

624ln -s /path/to/shared-utils ./shared-utils

625```

626 

627这在保持缓存系统安全优势的同时提供了灵活性。

628 

629***

630 

631## Plugin 目录结构

632 

633### 标准 plugin 布局

634 

635完整的 plugin 遵循此结构:

636 

637```text theme={null}

638enterprise-plugin/

639├── .claude-plugin/ # 元数据目录(可选)

640│ └── plugin.json # plugin 清单

641├── skills/ # Skills

642│ ├── code-reviewer/

643│ │ └── SKILL.md

644│ └── pdf-processor/

645│ ├── SKILL.md

646│ └── scripts/

647├── commands/ # Skills 作为平面 .md 文件

648│ ├── status.md

649│ └── logs.md

650├── agents/ # Subagent 定义

651│ ├── security-reviewer.md

652│ ├── performance-tester.md

653│ └── compliance-checker.md

654├── output-styles/ # 输出样式定义

655│ └── terse.md

656├── themes/ # 颜色主题定义

657│ └── dracula.json

658├── monitors/ # 后台 monitor 配置

659│ └── monitors.json

660├── hooks/ # Hook 配置

661│ ├── hooks.json # 主 hook 配置

662│ └── security-hooks.json # 其他 hooks

663├── bin/ # 添加到 PATH 的 plugin 可执行文件

664│ └── my-tool # 在 Bash tool 中可作为裸命令调用

665├── settings.json # plugin 的默认设置

666├── .mcp.json # MCP server 定义

667├── .lsp.json # LSP server 配置

668├── scripts/ # Hook 和实用脚本

669│ ├── security-scan.sh

670│ ├── format-code.py

671│ └── deploy.js

672├── LICENSE # 许可证文件

673└── CHANGELOG.md # 版本历史

674```

675 

676<Warning>

677 `.claude-plugin/` 目录包含 `plugin.json` 文件。所有其他目录(commands/、agents/、skills/、output-styles/、themes/、monitors/、hooks/)必须在 plugin 根目录,而不是在 `.claude-plugin/` 内。

678</Warning>

679 

680### 文件位置参考

681 

682| 组件 | 默认位置 | 目的 |

683| :---------------- | :--------------------------- | :------------------------------------------------------------------------------------------------------------------------ |

684| **清单** | `.claude-plugin/plugin.json` | Plugin 元数据和配置(可选) |

685| **Skills** | `skills/` | 具有 `<name>/SKILL.md` 结构的 Skills |

686| **Commands** | `commands/` | Skills 作为平面 Markdown 文件。新 plugins 使用 `skills/` |

687| **Agents** | `agents/` | Subagent Markdown 文件 |

688| **Output styles** | `output-styles/` | 输出样式定义 |

689| **Themes** | `themes/` | 颜色主题定义 |

690| **Hooks** | `hooks/hooks.json` | Hook 配置 |

691| **MCP servers** | `.mcp.json` | MCP server 定义 |

692| **LSP servers** | `.lsp.json` | 语言服务器配置 |

693| **Monitors** | `monitors/monitors.json` | 后台 monitor 配置 |

694| **Executables** | `bin/` | 添加到 Bash tool 的 `PATH` 的可执行文件。此处的文件在 plugin 启用时可作为任何 Bash tool 调用中的裸命令调用 |

695| **Settings** | `settings.json` | 启用 plugin 时应用的默认配置。目前仅支持 [`agent`](/zh-CN/sub-agents) 和 [`subagentStatusLine`](/zh-CN/statusline#subagent-status-lines) 键 |

696 

697***

698 

699## CLI 命令参考

700 

701Claude Code 提供了用于非交互式 plugin 管理的 CLI 命令,对脚本和自动化很有用。

702 

703### plugin install

704 

705从可用市场安装 plugin。

706 

707```bash theme={null}

708claude plugin install <plugin> [options]

709```

710 

711**参数:**

712 

713* `<plugin>`:Plugin 名称或 `plugin-name@marketplace-name` 用于特定市场

714 

715**选项:**

716 

717| 选项 | 描述 | 默认值 |

718| :-------------------- | :------------------------------ | :----- |

719| `-s, --scope <scope>` | 安装范围:`user`、`project` 或 `local` | `user` |

720| `-h, --help` | 显示命令帮助 | |

721 

722范围确定将已安装的 plugin 添加到哪个设置文件。例如,`--scope project` 写入 `.claude/settings.json` 中的 `enabledPlugins`,使 plugin 对克隆项目存储库的每个人都可用。

723 

724**示例:**

725 

726```bash theme={null}

727# 安装到用户范围(默认)

728claude plugin install formatter@my-marketplace

729 

730# 安装到项目范围(与团队共享)

731claude plugin install formatter@my-marketplace --scope project

732 

733# 安装到本地范围(gitignored)

734claude plugin install formatter@my-marketplace --scope local

735```

736 

737### plugin uninstall

738 

739删除已安装的 plugin。

740 

741```bash theme={null}

742claude plugin uninstall <plugin> [options]

743```

744 

745**参数:**

746 

747* `<plugin>`:Plugin 名称或 `plugin-name@marketplace-name`

748 

749**选项:**

750 

751| 选项 | 描述 | 默认值 |

752| :-------------------- | :---------------------------------------------------------- | :----- |

753| `-s, --scope <scope>` | 从范围卸载:`user`、`project` 或 `local` | `user` |

754| `--keep-data` | 保留插件的[持久数据目录](#persistent-data-directory) | |

755| `--prune` | 同时删除其他 plugin 不需要的自动安装依赖项。请参阅 [plugin prune](#plugin-prune) | |

756| `-y, --yes` | 跳过 `--prune` 确认提示。当 stdin 不是 TTY 时需要 | |

757| `-h, --help` | 显示命令帮助 | |

758 

759**别名:** `remove`、`rm`

760 

761默认情况下,从最后一个剩余范围卸载也会删除插件的 `${CLAUDE_PLUGIN_DATA}` 目录。使用 `--keep-data` 保留它,例如在测试新版本后重新安装时。

762 

763### plugin prune

764 

765删除不再被任何已安装 plugin 需要的自动安装 plugin 依赖项。Claude Code 为满足另一个 plugin 的 [`dependencies`](/zh-CN/plugin-dependencies) 字段而引入的依赖项将被删除;您直接安装的 plugin 永远不会被触及。

766 

767```bash theme={null}

768claude plugin prune [options]

769```

770 

771**选项:**

772 

773| 选项 | 描述 | 默认值 |

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

775| `-s, --scope <scope>` | 在范围处修剪:`user`、`project` 或 `local` | `user` |

776| `--dry-run` | 列出将被删除的内容而不实际删除 | |

777| `-y, --yes` | 跳过确认提示。当 stdin 不是 TTY 时需要 | |

778| `-h, --help` | 显示命令帮助 | |

779 

780**别名:** `autoremove`

781 

782该命令列出孤立的依赖项,并在删除前要求确认。要在一个步骤中删除 plugin 并清理其依赖项,请运行 `claude plugin uninstall <plugin> --prune`。

783 

784<Note>

785 `claude plugin prune` 需要 Claude Code v2.1.121 或更高版本。

786</Note>

787 

788### plugin enable

789 

790启用已禁用的 plugin。

791 

792```bash theme={null}

793claude plugin enable <plugin> [options]

794```

795 

796**参数:**

797 

798* `<plugin>`:Plugin 名称或 `plugin-name@marketplace-name`

799 

800**选项:**

801 

802| 选项 | 描述 | 默认值 |

803| :-------------------- | :-------------------------------- | :----- |

804| `-s, --scope <scope>` | 要启用的范围:`user`、`project` 或 `local` | `user` |

805| `-h, --help` | 显示命令帮助 | |

806 

807### plugin disable

808 

809禁用 plugin 而不卸载它。

810 

811```bash theme={null}

812claude plugin disable <plugin> [options]

813```

814 

815**参数:**

816 

817* `<plugin>`:Plugin 名称或 `plugin-name@marketplace-name`

818 

819**选项:**

820 

821| 选项 | 描述 | 默认值 |

822| :-------------------- | :-------------------------------- | :----- |

823| `-s, --scope <scope>` | 要禁用的范围:`user`、`project` 或 `local` | `user` |

824| `-h, --help` | 显示命令帮助 | |

825 

826### plugin update

827 

828将 plugin 更新到最新版本。

829 

830```bash theme={null}

831claude plugin update <plugin> [options]

832```

833 

834**参数:**

835 

836* `<plugin>`:Plugin 名称或 `plugin-name@marketplace-name`

837 

838**选项:**

839 

840| 选项 | 描述 | 默认值 |

841| :-------------------- | :------------------------------------------ | :----- |

842| `-s, --scope <scope>` | 要更新的范围:`user`、`project`、`local` 或 `managed` | `user` |

843| `-h, --help` | 显示命令帮助 | |

844 

845***

846 

847### plugin list

848 

849列出已安装的 plugins 及其版本、源市场和启用状态。

850 

851```bash theme={null}

852claude plugin list [options]

853```

854 

855**选项:**

856 

857| 选项 | 描述 | 默认值 |

858| :------------ | :---------------------------- | :-- |

859| `--json` | 输出为 JSON | |

860| `--available` | 包括来自市场的可用 plugins。需要 `--json` | |

861| `-h, --help` | 显示命令帮助 | |

862 

863### plugin tag

864 

865为当前目录中的 plugin 创建发布 git 标签。从 plugin 的文件夹内运行。请参阅[标记 plugin 发布](/zh-CN/plugin-dependencies#tag-plugin-releases-for-version-resolution)。

866 

867```bash theme={null}

868claude plugin tag [options]

869```

870 

871**选项:**

872 

873| 选项 | 描述 | 默认值 |

874| :------------ | :------------------- | :-- |

875| `--push` | 创建标签后将其推送到远程 | |

876| `--dry-run` | 打印将被标记的内容而不创建标签 | |

877| `-f, --force` | 即使工作树是脏的或标签已存在,也创建标签 | |

878| `-h, --help` | 显示命令帮助 | |

879 

880***

881 

882## 调试和开发工具

883 

884### 调试命令

885 

886使用 `claude --debug` 查看 plugin 加载详情:

887 

888这显示:

889 

890* 正在加载哪些 plugins

891* plugin 清单中的任何错误

892* Skill、agent 和 hook 注册

893* MCP server 初始化

894 

895### 常见问题

896 

897| 问题 | 原因 | 解决方案 |

898| :---------------------------------- | :------------------------- | :------------------------------------------------------------------------------------------------------------------------------ |

899| Plugin 未加载 | 无效的 `plugin.json` | 运行 `claude plugin validate` 或 `/plugin validate` 检查 `plugin.json`、skill/agent/command frontmatter 和 `hooks/hooks.json` 的语法和架构错误 |

900| Skills 未出现 | 目录结构错误 | 确保 `skills/` 或 `commands/` 在根目录,而不是在 `.claude-plugin/` 中 |

901| Hooks 未触发 | 脚本不可执行 | 运行 `chmod +x script.sh` |

902| MCP server 失败 | 缺少 `${CLAUDE_PLUGIN_ROOT}` | 对所有 plugin 路径使用变量 |

903| 路径错误 | 使用了绝对路径 | 所有路径必须是相对的,并以 `./` 开头 |

904| LSP `Executable not found in $PATH` | 语言服务器未安装 | 安装二进制文件(例如,`npm install -g typescript-language-server typescript`) |

905 

906### 示例错误消息

907 

908**清单验证错误**:

909 

910* `Invalid JSON syntax: Unexpected token } in JSON at position 142`:检查缺少的逗号、多余的逗号或未引用的字符串

911* `Plugin has an invalid manifest file at .claude-plugin/plugin.json. Validation errors: name: Required`:缺少必需字段

912* `Plugin has a corrupt manifest file at .claude-plugin/plugin.json. JSON parse error: ...`:JSON 语法错误

913 

914**Plugin 加载错误**:

915 

916* `Warning: No commands found in plugin my-plugin custom directory: ./cmds. Expected .md files or SKILL.md in subdirectories.`:命令路径存在但不包含有效的命令文件

917* `Plugin directory not found at path: ./plugins/my-plugin. Check that the marketplace entry has the correct path.`:marketplace.json 中的 `source` 路径指向不存在的目录

918* `Plugin my-plugin has conflicting manifests: both plugin.json and marketplace entry specify components.`:删除重复的组件定义或删除 marketplace 条目中的 `strict: false`

919 

920### Hook 故障排除

921 

922**Hook 脚本未执行**:

923 

9241. 检查脚本是否可执行:`chmod +x ./scripts/your-script.sh`

9252. 验证 shebang 行:第一行应该是 `#!/bin/bash` 或 `#!/usr/bin/env bash`

9263. 检查路径是否使用 `${CLAUDE_PLUGIN_ROOT}`:`"command": "${CLAUDE_PLUGIN_ROOT}/scripts/your-script.sh"`

9274. 手动测试脚本:`./scripts/your-script.sh`

928 

929**Hook 未在预期事件上触发**:

930 

9311. 验证事件名称是否正确(区分大小写):`PostToolUse`,而不是 `postToolUse`

9322. 检查匹配器模式是否与您的工具匹配:`"matcher": "Write|Edit"` 用于文件操作

9333. 确认 hook 类型有效:`command`、`http`、`mcp_tool`、`prompt` 或 `agent`

934 

935### MCP server 故障排除

936 

937**Server 未启动**:

938 

9391. 检查命令是否存在且可执行

9402. 验证所有路径是否使用 `${CLAUDE_PLUGIN_ROOT}` 变量

9413. 检查 MCP server 日志:`claude --debug` 显示初始化错误

9424. 在 Claude Code 外手动测试 server

943 

944**Server 工具未出现**:

945 

9461. 确保 server 在 `.mcp.json` 或 `plugin.json` 中正确配置

9472. 验证 server 是否正确实现 MCP 协议

9483. 检查调试输出中的连接超时

949 

950### 目录结构错误

951 

952**症状**:Plugin 加载但组件(skills、agents、hooks)缺失。

953 

954**正确结构**:组件必须在 plugin 根目录,而不是在 `.claude-plugin/` 内。只有 `plugin.json` 属于 `.claude-plugin/`。

955 

956```text theme={null}

957my-plugin/

958├── .claude-plugin/

959│ └── plugin.json ← 仅清单在此处

960├── commands/ ← 在根级别

961├── agents/ ← 在根级别

962└── hooks/ ← 在根级别

963```

964 

965如果您的组件在 `.claude-plugin/` 内,请将它们移到 plugin 根目录。

966 

967**调试清单**:

968 

9691. 运行 `claude --debug` 并查找"loading plugin"消息

9702. 检查每个组件目录是否在调试输出中列出

9713. 验证文件权限允许读取 plugin 文件

972 

973***

974 

975## 分发和版本管理参考

976 

977### 版本管理

978 

979Claude Code 使用 plugin 的版本作为缓存键,以确定是否有可用的更新。当你运行 `/plugin update` 或自动更新触发时,Claude Code 会计算当前版本,如果与已安装的版本匹配,则跳过更新。

980 

981版本从以下第一个设置的字段解析:

982 

9831. plugin 的 `plugin.json` 中的 `version` 字段

9842. plugin 的 `marketplace.json` 中的市场条目中的 `version` 字段

9853. plugin 源的 git 提交 SHA,用于 git 托管市场中的 `github`、`url`、`git-subdir` 和相对路径源

9864. `unknown`,用于 `npm` 源或不在 git 仓库内的本地目录

987 

988这为你提供了两种方式来对 plugin 进行版本管理:

989 

990| 方法 | 如何操作 | 更新行为 | 最适合 |

991| :------------ | :--------------------------------------- | :---------------------------------------------------------- | :------------------ |

992| **显式版本** | 在 `plugin.json` 中设置 `"version": "2.1.0"` | 用户仅在你提升此字段时获得更新。推送新提交而不提升它没有效果,`/plugin update` 报告"已是最新版本"。 | 具有稳定发布周期的已发布 plugin |

993| **提交 SHA 版本** | 从 `plugin.json` 和市场条目中省略 `version` | 用户在每次对 plugin 的 git 源进行新提交时获得更新 | 正在积极开发的内部或团队 plugin |

994 

995<Warning>

996 如果你在 `plugin.json` 中设置 `version`,你必须在每次想让用户接收更改时提升它。仅推送新提交是不够的,因为 Claude Code 看到相同的版本字符串并保留缓存副本。如果你迭代速度很快,请不设置 `version`,以便改用 git 提交 SHA。

997</Warning>

998 

999如果你使用显式版本,请遵循[语义版本控制](https://semver.org)(`MAJOR.MINOR.PATCH`):为破坏性更改提升 MAJOR,为新功能提升 MINOR,为错误修复提升 PATCH。在 `CHANGELOG.md` 中记录更改。

1000 

1001***

1002 

1003## 另请参阅

1004 

1005* [Plugins](/zh-CN/plugins) - 教程和实际用法

1006* [Plugin marketplaces](/zh-CN/plugin-marketplaces) - 创建和管理市场

1007* [Skills](/zh-CN/skills) - Skill 开发详情

1008* [Subagents](/zh-CN/sub-agents) - Agent 配置和功能

1009* [Hooks](/zh-CN/hooks) - 事件处理和自动化

1010* [MCP](/zh-CN/mcp) - 外部工具集成

1011* [Settings](/zh-CN/settings) - Plugins 的配置选项

quickstart.md +976 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 快速开始

6 

7> 欢迎使用 Claude Code!

8 

9export const InstallConfigurator = ({defaultSurface = 'terminal'}) => {

10 const TERM = {

11 mac: {

12 label: 'macOS / Linux',

13 cmd: 'curl -fsSL https://claude.ai/install.sh | bash'

14 },

15 win: {

16 label: 'Windows'

17 },

18 brew: {

19 label: 'Homebrew',

20 cmd: 'brew install --cask claude-code'

21 },

22 winget: {

23 label: 'WinGet',

24 cmd: 'winget install Anthropic.ClaudeCode'

25 }

26 };

27 const WIN_VARIANTS = {

28 ps: 'irm https://claude.ai/install.ps1 | iex',

29 cmd: 'curl -fsSL https://claude.ai/install.cmd -o install.cmd && install.cmd && del install.cmd'

30 };

31 const TABS = [{

32 key: 'terminal',

33 label: 'Terminal'

34 }, {

35 key: 'desktop',

36 label: 'Desktop'

37 }, {

38 key: 'vscode',

39 label: 'VS Code'

40 }, {

41 key: 'jetbrains',

42 label: 'JetBrains'

43 }];

44 const ALT_TARGETS = {

45 desktop: {

46 name: 'Desktop',

47 tagline: 'The full agent in a native app for macOS and Windows.',

48 installLabel: 'Download the app',

49 installHref: 'https://claude.com/download?utm_source=claude_code&utm_medium=docs&utm_content=configurator_desktop_download',

50 guideHref: '/en/desktop-quickstart'

51 },

52 vscode: {

53 name: 'VS Code',

54 tagline: 'Review diffs, manage context, and chat without leaving your editor.',

55 installLabel: 'Install from Marketplace',

56 installHref: 'https://marketplace.visualstudio.com/items?itemName=anthropic.claude-code',

57 altCmd: 'code --install-extension anthropic.claude-code',

58 guideHref: '/en/vs-code'

59 },

60 jetbrains: {

61 name: 'JetBrains',

62 tagline: 'Native plugin for IntelliJ, PyCharm, WebStorm, and other JetBrains IDEs.',

63 installLabel: 'Install from Marketplace',

64 installHref: 'https://plugins.jetbrains.com/plugin/27310-claude-code-beta-',

65 guideHref: '/en/jetbrains'

66 }

67 };

68 const PROVIDERS = [{

69 key: 'anthropic',

70 label: 'Anthropic'

71 }, {

72 key: 'bedrock',

73 label: 'Amazon Bedrock'

74 }, {

75 key: 'foundry',

76 label: 'Microsoft Foundry'

77 }, {

78 key: 'vertex',

79 label: 'Google Vertex AI'

80 }];

81 const PROVIDER_NOTICE = {

82 bedrock: <>

83 <strong>Configure your AWS account first.</strong> Running on Bedrock

84 requires model access enabled in the AWS console and IAM credentials.{' '}

85 <a href="/en/amazon-bedrock">Bedrock setup guide →</a>

86 </>,

87 vertex: <>

88 <strong>Configure your GCP project first.</strong> Running on Vertex AI

89 requires the Vertex API enabled and a service account with the right

90 permissions.{' '}

91 <a href="/en/google-vertex-ai">Vertex setup guide →</a>

92 </>,

93 foundry: <>

94 <strong>Configure your Azure resources first.</strong> Running on

95 Microsoft Foundry requires an Azure subscription with a Foundry resource

96 and model deployments provisioned.{' '}

97 <a href="/en/microsoft-foundry">Foundry setup guide →</a>

98 </>

99 };

100 const iconCheck = (size = 14) => <svg width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="3" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true">

101 <polyline points="20 6 9 17 4 12" />

102 </svg>;

103 const iconCopy = (size = 14) => <svg width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true">

104 <rect x="9" y="9" width="13" height="13" rx="2" />

105 <path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1" />

106 </svg>;

107 const iconArrowRight = (size = 13) => <svg width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.5" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true">

108 <line x1="5" y1="12" x2="19" y2="12" />

109 <polyline points="12 5 19 12 12 19" />

110 </svg>;

111 const iconArrowUpRight = (size = 14) => <svg width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.5" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true">

112 <line x1="7" y1="17" x2="17" y2="7" />

113 <polyline points="7 7 17 7 17 17" />

114 </svg>;

115 const iconInfo = (size = 16) => <svg width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true">

116 <circle cx="12" cy="12" r="10" />

117 <line x1="12" y1="16" x2="12" y2="12" />

118 <line x1="12" y1="8" x2="12.01" y2="8" />

119 </svg>;

120 const [target, setTarget] = useState(defaultSurface);

121 const [team, setTeam] = useState(false);

122 const [provider, setProvider] = useState('anthropic');

123 const [pkg, setPkg] = useState(() => (/Win/).test(navigator.userAgent) ? 'win' : 'mac');

124 const [winCmd, setWinCmd] = useState(false);

125 const [copied, setCopied] = useState(null);

126 const copyTimer = useRef(null);

127 const handleCopy = async (text, key) => {

128 try {

129 await navigator.clipboard.writeText(text);

130 } catch {

131 const ta = document.createElement('textarea');

132 ta.value = text;

133 document.body.appendChild(ta);

134 ta.select();

135 document.execCommand('copy');

136 document.body.removeChild(ta);

137 }

138 clearTimeout(copyTimer.current);

139 setCopied(key);

140 copyTimer.current = setTimeout(() => setCopied(null), 1800);

141 };

142 const cardBodyCmd = (cmd, prompt) => {

143 const on = copied === 'term';

144 return <div className="cc-ic-card-body">

145 <span className="cc-ic-prompt">{prompt || '$'}</span>

146 <div className="cc-ic-cmd">{cmd}</div>

147 <button type="button" className={'cc-ic-copy' + (on ? ' cc-ic-copied' : '')} onClick={() => handleCopy(cmd, 'term')}>

148 {on ? iconCheck(13) : iconCopy(13)}

149 <span>{on ? 'Copied' : 'Copy'}</span>

150 </button>

151 </div>;

152 };

153 const isWinInstaller = pkg === 'win';

154 const isWinPrompt = pkg === 'win' || pkg === 'winget';

155 const terminalCmd = isWinInstaller ? WIN_VARIANTS[winCmd ? 'cmd' : 'ps'] : TERM[pkg].cmd;

156 const alt = ALT_TARGETS[target];

157 const showNotice = team && provider !== 'anthropic';

158 const STYLES = `

159.cc-ic {

160 --ic-slate: #141413;

161 --ic-clay: #d97757;

162 --ic-clay-deep: #c6613f;

163 --ic-gray-000: #ffffff;

164 --ic-gray-150: #f0eee6;

165 --ic-gray-550: #73726c;

166 --ic-gray-700: #3d3d3a;

167 --ic-border-subtle: rgba(31, 30, 29, 0.08);

168 --ic-border-default: rgba(31, 30, 29, 0.15);

169 --ic-border-strong: rgba(31, 30, 29, 0.3);

170 --ic-font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, 'Courier New', monospace;

171 font-family: 'Anthropic Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;

172 font-size: 14px; line-height: 1.5; color: var(--ic-slate);

173 margin: 8px 0 32px;

174}

175.dark .cc-ic {

176 --ic-slate: #f0eee6;

177 --ic-gray-000: #262624;

178 --ic-gray-150: #1f1e1d;

179 --ic-gray-550: #91908a;

180 --ic-gray-700: #bfbdb4;

181 --ic-border-subtle: rgba(240, 238, 230, 0.08);

182 --ic-border-default: rgba(240, 238, 230, 0.14);

183 --ic-border-strong: rgba(240, 238, 230, 0.28);

184}

185.dark .cc-ic-check { background: transparent; }

186.dark .cc-ic-card { border: 0.5px solid var(--ic-border-subtle); }

187.dark .cc-ic-p-pill.cc-ic-active { box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3); }

188.cc-ic *, .cc-ic *::before, .cc-ic *::after { box-sizing: border-box; }

189.cc-ic a { text-decoration: none; }

190.cc-ic a:not([class]) { color: inherit; }

191.cc-ic button { font-family: inherit; cursor: pointer; }

192 

193.cc-ic-tab-strip {

194 display: inline-flex; gap: 2px;

195 padding: 4px; background: var(--ic-gray-150);

196 border-radius: 10px; overflow-x: auto;

197 max-width: 100%;

198}

199.cc-ic-tab {

200 appearance: none; background: none; border: none;

201 padding: 10px 18px; font-size: 15px; font-weight: 430;

202 color: var(--ic-gray-550); border-radius: 7px;

203 white-space: nowrap;

204 transition: color 0.12s, background-color 0.12s;

205}

206.cc-ic-tab:hover { color: var(--ic-gray-700); }

207.cc-ic-tab.cc-ic-active {

208 color: var(--ic-slate); font-weight: 500;

209 background: var(--ic-gray-000);

210 box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);

211}

212.dark .cc-ic-tab.cc-ic-active { box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4); }

213 

214.cc-ic-team-wrap { padding: 16px 0 20px; }

215.cc-ic-team-toggle {

216 display: flex; align-items: center; gap: 12px; font-family: inherit;

217 padding: 12px 16px; font-size: 14px; font-weight: 430;

218 color: var(--ic-gray-700); cursor: pointer; user-select: none;

219 width: fit-content; background: var(--ic-gray-150);

220 border: 0.5px solid var(--ic-border-subtle); border-radius: 8px;

221 transition: border-color 0.15s;

222}

223.cc-ic-team-toggle:hover { border-color: var(--ic-border-default); }

224.cc-ic-team-toggle.cc-ic-checked {

225 background: rgba(217, 119, 87, 0.08);

226 border-color: rgba(217, 119, 87, 0.25);

227}

228.cc-ic-check {

229 width: 16px; height: 16px;

230 border: 1px solid var(--ic-border-strong); border-radius: 4px;

231 background: var(--ic-gray-000);

232 display: flex; align-items: center; justify-content: center;

233 flex-shrink: 0;

234}

235.cc-ic-check svg { color: #fff; display: none; }

236.cc-ic-team-toggle.cc-ic-checked .cc-ic-check { background: var(--ic-clay-deep); border-color: var(--ic-clay-deep); }

237.cc-ic-team-toggle.cc-ic-checked .cc-ic-check svg { display: block; }

238 

239.cc-ic-team-reveal { display: flex; flex-direction: column; gap: 12px; margin-bottom: 16px; }

240.cc-ic-sales {

241 display: flex; align-items: center; justify-content: space-between;

242 gap: 16px; padding: 14px 16px;

243 background: var(--ic-gray-000); border: 0.5px solid var(--ic-border-default);

244 border-radius: 8px; flex-wrap: wrap;

245}

246.cc-ic-sales-text { font-size: 13px; color: var(--ic-gray-700); line-height: 1.5; flex: 1; min-width: 200px; }

247.cc-ic-sales-text strong { font-weight: 550; color: var(--ic-slate); }

248.cc-ic-sales-actions { display: flex; align-items: center; gap: 8px; flex-shrink: 0; }

249.cc-ic-btn-clay {

250 display: inline-flex; align-items: center; gap: 8px;

251 background: var(--ic-clay-deep); color: #fff; border: none;

252 border-radius: 8px; padding: 8px 14px;

253 font-size: 13px; font-weight: 500;

254 transition: background-color 0.15s; white-space: nowrap;

255}

256.cc-ic-btn-clay:hover { background: var(--ic-clay); }

257.cc-ic-btn-ghost {

258 display: inline-flex; align-items: center; gap: 8px;

259 background: transparent; color: var(--ic-gray-700);

260 border: 0.5px solid var(--ic-border-default);

261 border-radius: 8px; padding: 8px 14px;

262 font-size: 13px; font-weight: 500;

263}

264.cc-ic-btn-ghost:hover { background: rgba(0, 0, 0, 0.04); }

265 

266.cc-ic-provider-bar {

267 display: flex; align-items: center; gap: 12px;

268 padding: 14px 16px; background: var(--ic-gray-150);

269 border-radius: 8px; font-size: 13px; flex-wrap: wrap;

270}

271.cc-ic-provider-bar .cc-ic-label { color: var(--ic-gray-550); flex-shrink: 0; }

272.cc-ic-provider-pills { display: flex; gap: 4px; flex-wrap: wrap; }

273.cc-ic-p-pill {

274 appearance: none; border: none; background: transparent;

275 padding: 6px 12px; border-radius: 6px;

276 font-size: 13px; font-weight: 430; color: var(--ic-gray-700);

277 white-space: nowrap;

278}

279.cc-ic-p-pill:hover { background: rgba(0, 0, 0, 0.04); }

280.cc-ic-p-pill.cc-ic-active {

281 background: var(--ic-gray-000); color: var(--ic-slate);

282 font-weight: 500; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);

283}

284.cc-ic-provider-notice {

285 display: flex; padding: 16px 18px;

286 background: var(--ic-gray-000); border: 0.5px solid var(--ic-border-default);

287 border-radius: 8px; gap: 14px; align-items: flex-start;

288}

289.cc-ic-provider-notice > svg { color: var(--ic-gray-550); margin-top: 2px; flex-shrink: 0; }

290.cc-ic-provider-notice-body { font-size: 14px; line-height: 1.55; color: var(--ic-gray-700); }

291.cc-ic-provider-notice-body strong { font-weight: 550; color: var(--ic-slate); }

292.cc-ic-provider-notice-body a { color: var(--ic-clay-deep); font-weight: 500; }

293.cc-ic-provider-notice-body a:hover { text-decoration: underline; }

294 

295.cc-ic-card { background: #141413; border-radius: 12px; overflow: hidden; }

296.cc-ic-subtabs {

297 display: flex; align-items: center;

298 background: #1a1918;

299 border-bottom: 0.5px solid rgba(255, 255, 255, 0.08);

300 padding: 0 8px; overflow-x: auto;

301}

302.cc-ic-subtab {

303 appearance: none; background: none; border: none;

304 padding: 12px 16px; font-size: 12px;

305 color: rgba(255, 255, 255, 0.5);

306 position: relative; white-space: nowrap;

307}

308.cc-ic-subtab:hover { color: rgba(255, 255, 255, 0.75); }

309.cc-ic-subtab.cc-ic-active { color: #fff; }

310.cc-ic-subtab.cc-ic-active::after {

311 content: ''; position: absolute;

312 left: 12px; right: 12px; bottom: -0.5px;

313 height: 2px; background: var(--ic-clay);

314}

315.cc-ic-shell-switch {

316 display: inline-flex; gap: 2px;

317 margin: 14px 26px 0; padding: 3px;

318 background: rgba(255, 255, 255, 0.06);

319 border: 0.5px solid rgba(255, 255, 255, 0.08);

320 border-radius: 8px;

321 font-family: inherit;

322}

323.cc-ic-shell-option {

324 font: inherit; font-size: 12px; font-weight: 500;

325 padding: 5px 12px; border-radius: 6px;

326 background: transparent; border: none;

327 color: rgba(255, 255, 255, 0.55);

328 cursor: pointer; user-select: none; white-space: nowrap;

329 transition: color 120ms ease, background-color 120ms ease;

330}

331.cc-ic-shell-option:hover { color: rgba(255, 255, 255, 0.85); }

332.cc-ic-shell-option.cc-ic-active {

333 background: rgba(255, 255, 255, 0.12);

334 color: #fff;

335 box-shadow: 0 1px 2px rgba(0, 0, 0, 0.25);

336}

337 

338.cc-ic-card-body { padding: 24px 26px; display: flex; align-items: flex-start; gap: 14px; }

339.cc-ic-prompt {

340 color: var(--ic-clay); font-family: var(--ic-font-mono);

341 font-size: 17px; user-select: none; padding-top: 2px;

342}

343.cc-ic-cmd {

344 flex: 1; font-family: var(--ic-font-mono);

345 font-size: 17px; color: #f0eee6;

346 line-height: 1.55; white-space: pre-wrap; word-break: break-word;

347}

348.cc-ic-copy {

349 display: inline-flex; align-items: center; gap: 6px;

350 background: rgba(255, 255, 255, 0.08);

351 border: 0.5px solid rgba(255, 255, 255, 0.12);

352 color: rgba(255, 255, 255, 0.85);

353 padding: 7px 13px; border-radius: 8px;

354 font-size: 13px; font-weight: 500; flex-shrink: 0;

355}

356.cc-ic-copy:hover { background: rgba(255, 255, 255, 0.14); }

357.cc-ic-copy.cc-ic-copied { background: var(--ic-clay-deep); border-color: var(--ic-clay-deep); color: #fff; }

358 

359.cc-ic-below {

360 margin-top: 12px; font-size: 13px; color: var(--ic-gray-550);

361 display: flex; gap: 16px; flex-wrap: wrap; align-items: baseline;

362}

363.cc-ic-below a { color: var(--ic-gray-700); border-bottom: 0.5px solid var(--ic-border-default); }

364.cc-ic-below a:hover { color: var(--ic-clay-deep); border-bottom-color: var(--ic-clay-deep); }

365.cc-ic-handoff {

366 padding: 22px 24px;

367 background: linear-gradient(180deg, #faf9f4 0%, #f3f1e9 100%);

368 border: 0.5px solid var(--ic-border-default);

369 border-radius: 12px;

370 box-shadow: 0 1px 2px rgba(31, 30, 29, 0.04), 0 6px 16px -4px rgba(31, 30, 29, 0.06);

371}

372.dark .cc-ic-handoff {

373 background: linear-gradient(180deg, #262624 0%, #1f1e1d 100%);

374 box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3), 0 6px 16px -4px rgba(0, 0, 0, 0.4);

375}

376.cc-ic-handoff-title {

377 font-size: 16px; font-weight: 550; color: var(--ic-slate);

378 letter-spacing: -0.01em; margin-bottom: 4px;

379}

380.cc-ic-handoff-sub {

381 font-size: 14px; line-height: 1.5; color: var(--ic-gray-700);

382 margin-bottom: 18px;

383}

384.cc-ic-handoff-actions { display: flex; gap: 10px; flex-wrap: wrap; }

385.cc-ic-handoff-alt {

386 margin-top: 12px; font-size: 12px; color: var(--ic-gray-550);

387}

388.cc-ic-handoff-alt code {

389 font-family: var(--ic-font-mono); font-size: 11px;

390 background: var(--ic-gray-150); padding: 2px 6px;

391 border-radius: 4px; color: var(--ic-gray-700);

392}

393.cc-ic-copy-sm {

394 appearance: none; border: none;

395 display: inline-flex; align-items: center; justify-content: center;

396 width: 22px; height: 22px;

397 margin-left: 4px; vertical-align: middle;

398 background: var(--ic-gray-150); color: var(--ic-gray-550);

399 border-radius: 4px;

400 transition: color 0.1s, background-color 0.1s;

401}

402.cc-ic-copy-sm:hover { color: var(--ic-gray-700); background: var(--ic-border-default); }

403.cc-ic-copy-sm.cc-ic-copied { background: var(--ic-clay-deep); color: #fff; }

404 

405@media (max-width: 720px) {

406 .cc-ic-tab { padding: 12px 14px; font-size: 14px; }

407 .cc-ic-sales-actions { width: 100%; }

408 .cc-ic-card-body { padding: 20px; }

409 .cc-ic-cmd { font-size: 15px; }

410}

411`;

412 return <div className="cc-ic not-prose">

413 <style>{STYLES}</style>

414 

415 {}

416 <div className="cc-ic-tab-strip" role="tablist">

417 {TABS.map(t => <button key={t.key} type="button" role="tab" aria-selected={target === t.key} className={'cc-ic-tab' + (target === t.key ? ' cc-ic-active' : '')} onClick={() => setTarget(t.key)}>

418 {t.label}

419 </button>)}

420 </div>

421 

422 {}

423 <div className="cc-ic-team-wrap">

424 <button type="button" role="switch" aria-checked={team} className={'cc-ic-team-toggle' + (team ? ' cc-ic-checked' : '')} onClick={() => setTeam(!team)}>

425 <span className="cc-ic-check">{iconCheck(11)}</span>

426 <span>

427 I’m buying for a team or company (SSO, AWS/Azure/GCP, central billing)

428 </span>

429 </button>

430 </div>

431 

432 {}

433 {team && <div className="cc-ic-team-reveal">

434 <div className="cc-ic-sales">

435 <div className="cc-ic-sales-text">

436 <strong>Set up your team:</strong> self-serve or talk to sales.

437 </div>

438 <div className="cc-ic-sales-actions">

439 <a href="https://claude.ai/upgrade?initialPlanType=team&amp;utm_source=claude_code&amp;utm_medium=docs&amp;utm_content=configurator_team_get_started" className="cc-ic-btn-ghost">

440 Get started

441 </a>

442 <a href="https://www.anthropic.com/contact-sales?utm_source=claude_code&amp;utm_medium=docs&amp;utm_content=configurator_team_contact_sales" className="cc-ic-btn-clay">

443 Contact sales {iconArrowRight()}

444 </a>

445 </div>

446 </div>

447 

448 <div className="cc-ic-provider-bar">

449 <span className="cc-ic-label">Run on</span>

450 <div className="cc-ic-provider-pills" role="radiogroup" aria-label="Provider">

451 {PROVIDERS.map(p => <button key={p.key} type="button" role="radio" aria-checked={provider === p.key} className={'cc-ic-p-pill' + (provider === p.key ? ' cc-ic-active' : '')} onClick={() => setProvider(p.key)}>

452 {p.label}

453 </button>)}

454 </div>

455 </div>

456 

457 {showNotice && <div className="cc-ic-provider-notice">

458 {iconInfo()}

459 <div className="cc-ic-provider-notice-body">

460 {PROVIDER_NOTICE[provider]}

461 </div>

462 </div>}

463 </div>}

464 

465 {}

466 {target === 'terminal' && <div className="cc-ic-card">

467 <div className="cc-ic-subtabs" role="tablist" aria-label="Install method">

468 {Object.keys(TERM).map(k => <button key={k} type="button" role="tab" aria-selected={pkg === k} className={'cc-ic-subtab' + (pkg === k ? ' cc-ic-active' : '')} onClick={() => setPkg(k)}>

469 {TERM[k].label}

470 </button>)}

471 </div>

472 {isWinInstaller && <div className="cc-ic-shell-switch" role="tablist" aria-label="Shell">

473 {[{

474 k: 'ps',

475 label: 'PowerShell'

476 }, {

477 k: 'cmd',

478 label: 'CMD'

479 }].map(({k, label}) => {

480 const active = k === 'cmd' === winCmd;

481 return <button key={k} type="button" role="tab" aria-selected={active} className={'cc-ic-shell-option' + (active ? ' cc-ic-active' : '')} onClick={() => setWinCmd(k === 'cmd')}>

482 {label}

483 </button>;

484 })}

485 </div>}

486 {cardBodyCmd(terminalCmd, isWinPrompt ? '>' : '$')}

487 </div>}

488 

489 {}

490 {target === 'terminal' && <div className="cc-ic-below">

491 {isWinInstaller && <span>

492 <a href="https://git-scm.com/downloads/win" target="_blank" rel="noopener">

493 Git for Windows

494 </a>{' '}

495 recommended. PowerShell is used if Git Bash is absent.

496 </span>}

497 {(pkg === 'brew' || pkg === 'winget') && <span>

498 Does not auto-update. Run{' '}

499 <code>{pkg === 'brew' ? 'brew upgrade claude-code' : 'winget upgrade Anthropic.ClaudeCode'}</code>{' '}

500 periodically.

501 </span>}

502 <a href="/en/troubleshoot-install">Installation troubleshooting</a>

503 </div>}

504 

505 {alt && <div className="cc-ic-handoff">

506 <div className="cc-ic-handoff-title">Claude Code for {alt.name}</div>

507 <div className="cc-ic-handoff-sub">{alt.tagline}</div>

508 <div className="cc-ic-handoff-actions">

509 <a href={alt.installHref} className="cc-ic-btn-clay" {...alt.installHref.startsWith('http') ? {

510 target: '_blank',

511 rel: 'noopener'

512 } : {}}>

513 {alt.installLabel} {iconArrowUpRight(13)}

514 </a>

515 <a href={alt.guideHref} className="cc-ic-btn-ghost">

516 {alt.name} guide {iconArrowRight(12)}

517 </a>

518 </div>

519 {alt.altCmd && <div className="cc-ic-handoff-alt">

520 or run <code>{alt.altCmd}</code>

521 <button type="button" className={'cc-ic-copy-sm' + (copied === 'alt' ? ' cc-ic-copied' : '')} onClick={() => handleCopy(alt.altCmd, 'alt')} aria-label="Copy command">

522 {copied === 'alt' ? iconCheck(11) : iconCopy(11)}

523 </button>

524 </div>}

525 </div>}

526 </div>;

527};

528 

529export const Experiment = ({flag, treatment, children}) => {

530 const VID_KEY = 'exp_vid';

531 const CONSENT_COUNTRIES = new Set(['AT', 'BE', 'BG', 'HR', 'CY', 'CZ', 'DK', 'EE', 'FI', 'FR', 'DE', 'GR', 'HU', 'IE', 'IT', 'LV', 'LT', 'LU', 'MT', 'NL', 'PL', 'PT', 'RO', 'SK', 'SI', 'ES', 'SE', 'RE', 'GP', 'MQ', 'GF', 'YT', 'BL', 'MF', 'PM', 'WF', 'PF', 'NC', 'AW', 'CW', 'SX', 'FO', 'GL', 'AX', 'GB', 'UK', 'AI', 'BM', 'IO', 'VG', 'KY', 'FK', 'GI', 'MS', 'PN', 'SH', 'TC', 'GG', 'JE', 'IM', 'CA', 'BR', 'IN']);

532 const fnv1a = s => {

533 let h = 0x811c9dc5;

534 for (let i = 0; i < s.length; i++) {

535 h ^= s.charCodeAt(i);

536 h += (h << 1) + (h << 4) + (h << 7) + (h << 8) + (h << 24);

537 }

538 return h >>> 0;

539 };

540 const bucket = (seed, vid) => fnv1a(fnv1a(seed + vid) + '') % 10000 < 5000 ? 'control' : 'treatment';

541 const [decision] = useState(() => {

542 const params = new URLSearchParams(location.search);

543 const preBucketed = document.documentElement.dataset['gb_' + flag.replace(/-/g, '_')];

544 const force = params.get('gb-force');

545 if (force) {

546 for (const p of force.split(',')) {

547 const [k, v] = p.split(':');

548 if (k === flag) return {

549 variant: v || 'treatment',

550 track: false

551 };

552 }

553 }

554 if (navigator.globalPrivacyControl) {

555 return {

556 variant: 'control',

557 track: false

558 };

559 }

560 const prefsMatch = document.cookie.match(/(?:^|; )anthropic-consent-preferences=([^;]+)/);

561 if (prefsMatch) {

562 try {

563 if (JSON.parse(decodeURIComponent(prefsMatch[1])).analytics !== true) {

564 return {

565 variant: 'control',

566 track: false

567 };

568 }

569 } catch {

570 return {

571 variant: 'control',

572 track: false

573 };

574 }

575 } else {

576 const country = params.get('country')?.toUpperCase() || (document.cookie.match(/(?:^|; )cf_geo=([A-Z]{2})/) || [])[1];

577 if (!country || CONSENT_COUNTRIES.has(country)) {

578 return {

579 variant: 'control',

580 track: false

581 };

582 }

583 }

584 let vid;

585 try {

586 const ajsMatch = document.cookie.match(/(?:^|; )ajs_anonymous_id=([^;]+)/);

587 if (ajsMatch) {

588 vid = decodeURIComponent(ajsMatch[1]).replace(/^"|"$/g, '');

589 } else {

590 vid = localStorage.getItem(VID_KEY);

591 if (!vid) {

592 vid = crypto.randomUUID();

593 }

594 document.cookie = `ajs_anonymous_id=${vid}; domain=.claude.com; path=/; Secure; SameSite=Lax; max-age=31536000`;

595 }

596 try {

597 localStorage.setItem(VID_KEY, vid);

598 } catch {}

599 } catch {

600 return {

601 variant: 'control',

602 track: false

603 };

604 }

605 const variant = preBucketed === '1' ? 'treatment' : preBucketed === '0' ? 'control' : bucket(flag, vid);

606 return {

607 variant,

608 track: true,

609 vid

610 };

611 });

612 useEffect(() => {

613 if (!decision.track) return;

614 fetch('https://api.anthropic.com/api/event_logging/v2/batch', {

615 method: 'POST',

616 headers: {

617 'Content-Type': 'application/json',

618 'x-service-name': 'claude_code_docs'

619 },

620 body: JSON.stringify({

621 events: [{

622 event_type: 'GrowthbookExperimentEvent',

623 event_data: {

624 device_id: decision.vid,

625 anonymous_id: decision.vid,

626 timestamp: new Date().toISOString(),

627 experiment_id: flag,

628 variation_id: decision.variant === 'treatment' ? 1 : 0,

629 environment: 'production'

630 }

631 }]

632 }),

633 keepalive: true

634 }).catch(() => {});

635 }, []);

636 return decision.variant === 'treatment' ? treatment : children;

637};

638 

639本快速开始指南将在几分钟内让您使用 AI 驱动的编码辅助。完成本指南后,您将了解如何使用 Claude Code 完成常见的开发任务。

640 

641<Experiment flag="quickstart-install-configurator" treatment={<InstallConfigurator />} />

642 

643## 开始前

644 

645确保您拥有:

646 

647* 打开的终端或命令提示符

648 * 如果您之前从未使用过终端,请查看[终端指南](/zh-CN/terminal-guide)

649* 一个可以使用的代码项目

650* 一个 [Claude 订阅](https://claude.com/pricing?utm_source=claude_code\&utm_medium=docs\&utm_content=quickstart_prereq)(Pro、Max、Teams 或 Enterprise)、[Claude Console](https://console.anthropic.com/) 账户,或通过[支持的云提供商](/zh-CN/third-party-integrations)的访问权限

651 

652<Note>

653 本指南涵盖终端 CLI。Claude Code 也可在[网页](https://claude.ai/code)、[桌面应用](/zh-CN/desktop)、[VS Code](/zh-CN/vs-code) 和 [JetBrains IDE](/zh-CN/jetbrains)、[Slack](/zh-CN/slack) 中使用,以及通过 [GitHub Actions](/zh-CN/github-actions) 和 [GitLab](/zh-CN/gitlab-ci-cd) 进行 CI/CD。查看[所有界面](/zh-CN/overview#use-claude-code-everywhere)。

654</Note>

655 

656## 步骤 1:安装 Claude Code

657 

658To install Claude Code, use one of the following methods:

659 

660<Tabs>

661 <Tab title="Native Install (Recommended)">

662 **macOS, Linux, WSL:**

663 

664 ```bash theme={null}

665 curl -fsSL https://claude.ai/install.sh | bash

666 ```

667 

668 **Windows PowerShell:**

669 

670 ```powershell theme={null}

671 irm https://claude.ai/install.ps1 | iex

672 ```

673 

674 **Windows CMD:**

675 

676 ```batch theme={null}

677 curl -fsSL https://claude.ai/install.cmd -o install.cmd && install.cmd && del install.cmd

678 ```

679 

680 If you see `The token '&&' is not a valid statement separator`, you're in PowerShell, not CMD. If you see `'irm' is not recognized as an internal or external command`, you're in CMD, not PowerShell. Your prompt shows `PS C:\` when you're in PowerShell and `C:\` without the `PS` when you're in CMD.

681 

682 [Git for Windows](https://git-scm.com/downloads/win) is recommended on native Windows so Claude Code can use the Bash tool. If Git for Windows is not installed, Claude Code uses PowerShell as the shell tool instead. WSL setups do not need Git for Windows.

683 

684 <Info>

685 Native installations automatically update in the background to keep you on the latest version.

686 </Info>

687 </Tab>

688 

689 <Tab title="Homebrew">

690 ```bash theme={null}

691 brew install --cask claude-code

692 ```

693 

694 Homebrew offers two casks. `claude-code` tracks the stable release channel, which is typically about a week behind and skips releases with major regressions. `claude-code@latest` tracks the latest channel and receives new versions as soon as they ship.

695 

696 <Info>

697 Homebrew installations do not auto-update. Run `brew upgrade claude-code` or `brew upgrade claude-code@latest`, depending on which cask you installed, to get the latest features and security fixes.

698 </Info>

699 </Tab>

700 

701 <Tab title="WinGet">

702 ```powershell theme={null}

703 winget install Anthropic.ClaudeCode

704 ```

705 

706 <Info>

707 WinGet installations do not auto-update. Run `winget upgrade Anthropic.ClaudeCode` periodically to get the latest features and security fixes.

708 </Info>

709 </Tab>

710</Tabs>

711 

712You can also install with [apt, dnf, or apk](/en/setup#install-with-linux-package-managers) on Debian, Fedora, RHEL, and Alpine.

713 

714## 步骤 2:登录您的账户

715 

716Claude Code 需要账户才能使用。当您使用 `claude` 命令启动交互式会话时,您需要登录:

717 

718```bash theme={null}

719claude

720# 首次使用时系统会提示您登录

721```

722 

723```bash theme={null}

724/login

725# 按照提示使用您的账户登录

726```

727 

728您可以使用以下任何账户类型登录:

729 

730* [Claude Pro、Max、Teams 或 Enterprise](https://claude.com/pricing?utm_source=claude_code\&utm_medium=docs\&utm_content=quickstart_login)(推荐)

731* [Claude Console](https://console.anthropic.com/)(具有预付费额度的 API 访问)。首次登录时,Console 中会自动为集中成本跟踪创建一个"Claude Code"工作区。

732* [Amazon Bedrock、Google Vertex AI 或 Microsoft Foundry](/zh-CN/third-party-integrations)(企业云提供商)

733 

734登录后,您的凭证将被存储,您无需再次登录。要稍后切换账户,请使用 `/login` 命令。

735 

736## 步骤 3:启动您的第一个会话

737 

738在任何项目目录中打开您的终端并启动 Claude Code:

739 

740```bash theme={null}

741cd /path/to/your/project

742claude

743```

744 

745您将看到 Claude Code 欢迎屏幕,其中包含您的会话信息、最近的对话和最新更新。输入 `/help` 查看可用命令,或输入 `/resume` 继续之前的对话。

746 

747<Tip>

748 登录后(步骤 2),您的凭证将存储在您的系统上。在[凭证管理](/zh-CN/authentication#credential-management)中了解更多信息。

749</Tip>

750 

751## 步骤 4:提出您的第一个问题

752 

753让我们从理解您的代码库开始。尝试以下命令之一:

754 

755```text theme={null}

756这个项目做什么?

757```

758 

759Claude 将分析您的文件并提供摘要。您也可以提出更具体的问题:

760 

761```text theme={null}

762这个项目使用什么技术?

763```

764 

765```text theme={null}

766主入口点在哪里?

767```

768 

769```text theme={null}

770解释文件夹结构

771```

772 

773您也可以询问 Claude 关于其自身功能的问题:

774 

775```text theme={null}

776Claude Code 能做什么?

777```

778 

779```text theme={null}

780我如何在 Claude Code 中创建自定义 skills?

781```

782 

783```text theme={null}

784Claude Code 可以与 Docker 一起工作吗?

785```

786 

787<Note>

788 Claude Code 根据需要读取您的项目文件。您不必手动添加上下文。

789</Note>

790 

791## 步骤 5:进行您的第一次代码更改

792 

793现在让我们让 Claude Code 进行一些实际的编码。尝试一个简单的任务:

794 

795```text theme={null}

796在主文件中添加一个 hello world 函数

797```

798 

799Claude Code 将:

800 

8011. 找到适当的文件

8022. 向您显示建议的更改

8033. 请求您的批准

8044. 进行编辑

805 

806<Note>

807 Claude Code 在修改文件前始终请求许可。您可以批准单个更改或为会话启用"全部接受"模式。

808</Note>

809 

810## 步骤 6:在 Claude Code 中使用 Git

811 

812Claude Code 使 Git 操作变得对话式:

813 

814```text theme={null}

815我更改了哪些文件?

816```

817 

818```text theme={null}

819用描述性消息提交我的更改

820```

821 

822您也可以提示更复杂的 Git 操作:

823 

824```text theme={null}

825创建一个名为 feature/quickstart 的新分支

826```

827 

828```text theme={null}

829显示我最后的 5 次提交

830```

831 

832```text theme={null}

833帮我解决合并冲突

834```

835 

836## 步骤 7:修复错误或添加功能

837 

838Claude 擅长调试和功能实现。

839 

840用自然语言描述您想要的内容:

841 

842```text theme={null}

843向用户注册表单添加输入验证

844```

845 

846或修复现有问题:

847 

848```text theme={null}

849有一个错误,用户可以提交空表单 - 修复它

850```

851 

852Claude Code 将:

853 

854* 定位相关代码

855* 理解上下文

856* 实现解决方案

857* 如果可用,运行测试

858 

859## 步骤 8:尝试其他常见工作流

860 

861有多种方式可以与 Claude 一起工作:

862 

863**重构代码**

864 

865```text theme={null}

866重构身份验证模块以使用 async/await 而不是回调

867```

868 

869**编写测试**

870 

871```text theme={null}

872为计算器函数编写单元测试

873```

874 

875**更新文档**

876 

877```text theme={null}

878使用安装说明更新 README

879```

880 

881**代码审查**

882 

883```text theme={null}

884审查我的更改并建议改进

885```

886 

887<Tip>

888 像与有帮助的同事交谈一样与 Claude 交谈。描述您想要实现的目标,它将帮助您实现。

889</Tip>

890 

891## 基本命令

892 

893以下是日常使用中最重要的命令:

894 

895| 命令 | 功能 | 示例 |

896| ------------------- | -------------- | ----------------------------------- |

897| `claude` | 启动交互模式 | `claude` |

898| `claude "task"` | 运行一次性任务 | `claude "fix the build error"` |

899| `claude -p "query"` | 运行一次性查询,然后退出 | `claude -p "explain this function"` |

900| `claude -c` | 在当前目录中继续最近的对话 | `claude -c` |

901| `claude -r` | 恢复之前的对话 | `claude -r` |

902| `claude commit` | 创建 Git 提交 | `claude commit` |

903| `/clear` | 清除对话历史 | `/clear` |

904| `/help` | 显示可用命令 | `/help` |

905| `exit` 或 Ctrl+C | 退出 Claude Code | `exit` |

906 

907有关完整的命令列表,请参阅 [CLI 参考](/zh-CN/cli-reference)。

908 

909## 初学者专业提示

910 

911有关更多信息,请参阅[最佳实践](/zh-CN/best-practices)和[常见工作流](/zh-CN/common-workflows)。

912 

913<AccordionGroup>

914 <Accordion title="对您的请求要具体">

915 不要说:'修复错误'

916 

917 尝试:'修复登录错误,用户输入错误凭证后看到空白屏幕'

918 </Accordion>

919 

920 <Accordion title="使用分步说明">

921 将复杂任务分解为步骤:

922 

923 ```text theme={null}

924 1. 为用户配置文件创建新的数据库表

925 2. 创建 API 端点以获取和更新用户配置文件

926 3. 构建允许用户查看和编辑其信息的网页

927 ```

928 </Accordion>

929 

930 <Accordion title="让 Claude 先探索">

931 在进行更改之前,让 Claude 理解您的代码:

932 

933 ```text theme={null}

934 分析数据库架构

935 ```

936 

937 ```text theme={null}

938 构建一个仪表板,显示英国客户最常退货的产品

939 ```

940 </Accordion>

941 

942 <Accordion title="使用快捷方式节省时间">

943 * 按 `?` 查看所有可用的快捷键

944 * 使用 Tab 进行命令补全

945 * 按 ↑ 查看命令历史

946 * 输入 `/` 查看所有命令和 skills

947 </Accordion>

948</AccordionGroup>

949 

950## 接下来呢?

951 

952现在您已经学习了基础知识,探索更多高级功能:

953 

954<CardGroup cols={2}>

955 <Card title="Claude Code 如何工作" icon="microchip" href="/zh-CN/how-claude-code-works">

956 了解代理循环、内置工具以及 Claude Code 如何与您的项目交互

957 </Card>

958 

959 <Card title="最佳实践" icon="star" href="/zh-CN/best-practices">

960 通过有效的提示和项目设置获得更好的结果

961 </Card>

962 

963 <Card title="常见工作流" icon="graduation-cap" href="/zh-CN/common-workflows">

964 常见任务的分步指南

965 </Card>

966 

967 <Card title="扩展 Claude Code" icon="puzzle-piece" href="/zh-CN/features-overview">

968 使用 CLAUDE.md、skills、hooks、MCP 等进行自定义

969 </Card>

970</CardGroup>

971 

972## 获取帮助

973 

974* **在 Claude Code 中**:输入 `/help` 或询问「我如何...」

975* **文档**:您在这里!浏览其他指南

976* **社区**:加入我们的 [Discord](https://www.anthropic.com/discord) 获取提示和支持

remote-control.md +259 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 使用 Remote Control 从任何设备继续本地会话

6 

7> 使用 Remote Control 从您的手机、平板电脑或任何浏览器继续本地 Claude Code 会话。适用于 claude.ai/code 和 Claude 移动应用。

8 

9<Note>

10 Remote Control 处于研究预览阶段,在所有计划中都可用。在 Team 和 Enterprise 上,在管理员在 [Claude Code 管理员设置](https://claude.ai/admin-settings/claude-code)中启用 Remote Control 切换之前,它默认处于关闭状态。

11</Note>

12 

13Remote Control 将 [claude.ai/code](https://claude.ai/code) 或 Claude 应用([iOS](https://apps.apple.com/us/app/claude-by-anthropic/id6473753684) 和 [Android](https://play.google.com/store/apps/details?id=com.anthropic.claude))连接到在您的机器上运行的 Claude Code 会话。在您的办公桌上启动一个任务,然后从沙发上的手机或另一台计算机上的浏览器继续。

14 

15当您在机器上启动 Remote Control 会话时,Claude 始终在本地运行,因此没有任何内容移动到云端。使用 Remote Control,您可以:

16 

17* **远程使用您的完整本地环境**:您的文件系统、[MCP servers](/zh-CN/mcp)、工具和项目配置都保持可用,输入 `@` 会自动完成本地项目中的文件路径

18* **同时从两个界面工作**:对话在所有连接的设备上保持同步,因此您可以从终端、浏览器和手机交替发送消息

19* **在中断后恢复**:如果您的笔记本电脑进入睡眠状态或网络断开,当您的机器重新上线时,会话会自动重新连接

20 

21与[网络上的 Claude Code](/zh-CN/claude-code-on-the-web)(在云基础设施上运行)不同,Remote Control 会话直接在您的机器上运行并与您的本地文件系统交互。网络和移动界面只是该本地会话的一个窗口。

22 

23<Note>

24 Remote Control 需要 Claude Code v2.1.51 或更高版本。使用 `claude --version` 检查您的版本。

25</Note>

26 

27本页涵盖设置、如何启动和连接到会话,以及 Remote Control 与网络上的 Claude Code 的比较。

28 

29## 要求

30 

31在使用 Remote Control 之前,请确认您的环境满足以下条件:

32 

33* **订阅**:在 Pro、Max、Team 和 Enterprise 计划中可用。不支持 API 密钥。在 Team 和 Enterprise 上,管理员必须首先在 [Claude Code 管理员设置](https://claude.ai/admin-settings/claude-code)中启用 Remote Control 切换。

34* **身份验证**:运行 `claude` 并使用 `/login` 通过 claude.ai 登录(如果您还没有登录)。

35* **工作区信任**:在您的项目目录中至少运行一次 `claude` 以接受工作区信任对话框。

36 

37## 启动 Remote Control 会话

38 

39您可以从 CLI 或 VS Code 扩展启动 Remote Control 会话。CLI 提供三种调用模式;VS Code 使用 `/remote-control` 命令。

40 

41<Tabs>

42 <Tab title="服务器模式">

43 导航到您的项目目录并运行:

44 

45 ```bash theme={null}

46 claude remote-control

47 ```

48 

49 该进程在您的终端中以服务器模式保持运行,等待远程连接。它显示一个会话 URL,您可以使用该 URL 从[另一个设备连接](#connect-from-another-device),您可以按空格键显示 QR 码以从手机快速访问。当远程会话处于活动状态时,终端显示连接状态和工具活动。

50 

51 可用标志:

52 

53 | 标志 | 描述 |

54 | ----------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |

55 | `--name "My Project"` | 设置自定义会话标题,在 claude.ai/code 的会话列表中可见。 |

56 | `--remote-control-session-name-prefix <prefix>` | 未设置显式名称时自动生成的会话名称的前缀。默认为您的机器的主机名,生成类似 `myhost-graceful-unicorn` 的名称。设置 `CLAUDE_REMOTE_CONTROL_SESSION_NAME_PREFIX` 以获得相同效果。 |

57 | `--spawn <mode>` | 服务器如何创建会话。<br />• `same-dir`(默认):所有会话共享当前工作目录,因此如果编辑相同的文件可能会冲突。<br />• `worktree`:每个按需会话都获得自己的 [git worktree](/zh-CN/common-workflows#run-parallel-claude-code-sessions-with-git-worktrees)。需要 git 存储库。<br />• `session`:单会话模式。恰好提供一个会话并拒绝其他连接。仅在启动时设置。<br />在运行时按 `w` 在 `same-dir` 和 `worktree` 之间切换。 |

58 | `--capacity <N>` | 最大并发会话数。默认为 32。不能与 `--spawn=session` 一起使用。 |

59 | `--verbose` | 显示详细的连接和会话日志。 |

60 | `--sandbox` / `--no-sandbox` | 启用或禁用[沙箱](/zh-CN/sandboxing)以进行文件系统和网络隔离。默认关闭。 |

61 </Tab>

62 

63 <Tab title="交互式会话">

64 要启动启用了 Remote Control 的普通交互式 Claude Code 会话,请使用 `--remote-control` 标志(或 `--rc`):

65 

66 ```bash theme={null}

67 claude --remote-control

68 ```

69 

70 可选地为会话传递一个名称:

71 

72 ```bash theme={null}

73 claude --remote-control "My Project"

74 ```

75 

76 这为您提供了一个完整的交互式会话在您的终端中,您也可以从 claude.ai 或 Claude 应用控制。与 `claude remote-control`(服务器模式)不同,您可以在会话也可远程使用时在本地输入消息。

77 </Tab>

78 

79 <Tab title="从现有会话">

80 如果您已经在 Claude Code 会话中并想远程继续它,请使用 `/remote-control`(或 `/rc`)命令:

81 

82 ```text theme={null}

83 /remote-control

84 ```

85 

86 传递一个名称作为参数以设置自定义会话标题:

87 

88 ```text theme={null}

89 /remote-control My Project

90 ```

91 

92 这启动一个 Remote Control 会话,该会话继承您当前的对话历史记录,并显示一个会话 URL 和 QR 码,您可以使用它从[另一个设备连接](#connect-from-another-device)。`--verbose`、`--sandbox` 和 `--no-sandbox` 标志不适用于此命令。

93 </Tab>

94 

95 <Tab title="VS Code">

96 在 [Claude Code VS Code 扩展](/zh-CN/vs-code)中,在提示框中输入 `/remote-control` 或 `/rc`,或使用 `/` 打开命令菜单并选择它。需要 Claude Code v2.1.79 或更高版本。

97 

98 ```text theme={null}

99 /remote-control

100 ```

101 

102 提示框上方会出现一个横幅,显示连接状态。连接后,单击横幅中的**在浏览器中打开**直接转到会话,或在 [claude.ai/code](https://claude.ai/code) 的会话列表中找到它。会话 URL 也会发布在对话中。

103 

104 要断开连接,请单击横幅上的关闭图标或再次运行 `/remote-control`。

105 

106 与 CLI 不同,VS Code 命令不接受名称参数或显示 QR 码。会话标题从您的对话历史记录或第一条提示派生。

107 </Tab>

108</Tabs>

109 

110### 从另一个设备连接

111 

112一旦 Remote Control 会话处于活动状态,您有几种方式从另一个设备连接:

113 

114* **打开会话 URL** 在任何浏览器中直接转到 [claude.ai/code](https://claude.ai/code) 上的会话。

115* **扫描 QR 码** 显示在会话 URL 旁边,直接在 Claude 应用中打开它。使用 `claude remote-control` 时,按空格键切换 QR 码显示。

116* **打开 [claude.ai/code](https://claude.ai/code) 或 Claude 应用** 并在会话列表中按名称查找会话。Remote Control 会话在在线时显示带有绿色状态点的计算机图标。

117 

118远程会话标题按以下顺序选择:

119 

1201. 您传递给 `--name`、`--remote-control` 或 `/remote-control` 的名称

1212. 您使用 `/rename` 设置的标题

1223. 现有对话历史记录中的最后一条有意义的消息

1234. 自动生成的名称,如 `myhost-graceful-unicorn`,其中 `myhost` 是您的机器的主机名或您使用 `--remote-control-session-name-prefix` 设置的前缀

124 

125如果您没有设置显式名称,一旦您发送提示,标题会更新以反映您的提示。

126 

127如果环境已经有活动会话,您将被询问是否继续它或启动新会话。

128 

129如果您还没有 Claude 应用,请在 Claude Code 中使用 `/mobile` 命令显示 [iOS](https://apps.apple.com/us/app/claude-by-anthropic/id6473753684) 或 [Android](https://play.google.com/store/apps/details?id=com.anthropic.claude) 的下载 QR 码。

130 

131### 为所有会话启用 Remote Control

132 

133默认情况下,Remote Control 仅在您显式运行 `claude remote-control`、`claude --remote-control` 或 `/remote-control` 时激活。要为每个交互式会话自动启用它,请在 Claude Code 中运行 `/config` 并将**为所有会话启用 Remote Control** 设置为 `true`。将其设置回 `false` 以禁用。

134 

135启用此设置后,每个交互式 Claude Code 进程注册一个远程会话。如果您运行多个实例,每个实例都获得自己的环境和会话。要从单个进程运行多个并发会话,请改用[服务器模式](#start-a-remote-control-session)。

136 

137## 连接和安全

138 

139您的本地 Claude Code 会话仅发出出站 HTTPS 请求,从不在您的机器上打开入站端口。当您启动 Remote Control 时,它向 Anthropic API 注册并轮询工作。当您从另一个设备连接时,服务器通过流连接在网络或移动客户端和您的本地会话之间路由消息。

140 

141所有流量都通过 Anthropic API 通过 TLS 传输,与任何 Claude Code 会话的传输安全相同。连接使用多个短期凭证,每个凭证的范围限定为单一目的并独立过期。

142 

143## Remote Control 与网络上的 Claude Code 的比较

144 

145Remote Control 和[网络上的 Claude Code](/zh-CN/claude-code-on-the-web)都使用 claude.ai/code 界面。关键区别在于会话运行的位置:Remote Control 在您的机器上执行,因此您的本地 MCP servers、工具和项目配置保持可用。网络上的 Claude Code 在 Anthropic 管理的云基础设施中执行。

146 

147当您处于本地工作中间并想从另一个设备继续时,使用 Remote Control。当您想在没有任何本地设置的情况下启动任务、处理您没有克隆的存储库或并行运行多个任务时,使用网络上的 Claude Code。

148 

149## 移动推送通知

150 

151当 Remote Control 处于活动状态时,Claude 可以向您的手机发送推送通知。

152 

153Claude 决定何时推送。它通常在长时间运行的任务完成或需要您的决定来继续时发送一个。您也可以在提示中请求推送,例如 `notify me when the tests finish`。除了下面的开/关切换外,没有按事件配置。

154 

155<Note>

156 移动推送通知需要 Claude Code v2.1.110 或更高版本。

157</Note>

158 

159要设置移动推送通知:

160 

161<Steps>

162 <Step title="安装 Claude 移动应用">

163 下载 Claude 应用([iOS](https://apps.apple.com/us/app/claude-by-anthropic/id6473753684) 或 [Android](https://play.google.com/store/apps/details?id=com.anthropic.claude))。

164 </Step>

165 

166 <Step title="使用您的 Claude Code 账户登录">

167 使用您在终端中用于 Claude Code 的相同账户和组织。

168 </Step>

169 

170 <Step title="允许通知">

171 接受来自操作系统的通知权限提示。

172 </Step>

173 

174 <Step title="在 Claude Code 中启用推送">

175 在您的终端中,运行 `/config` 并启用**当 Claude 决定时推送**。

176 </Step>

177</Steps>

178 

179如果通知没有到达:

180 

181* 如果 `/config` 显示**未注册移动设备**,请在您的手机上打开 Claude 应用,以便它可以刷新其推送令牌。下次 Remote Control 连接时,警告会清除。

182* 在 iOS 上,焦点模式和通知摘要可能会抑制或延迟推送。检查设置 → 通知 → Claude。

183* 在 Android 上,激进的电池优化可能会延迟传递。在系统设置中将 Claude 应用从电池优化中豁免。

184 

185## 限制

186 

187* **每个交互式进程一个远程会话**:在服务器模式之外,每个 Claude Code 实例一次支持一个远程会话。使用[服务器模式](#start-a-remote-control-session)从单个进程运行多个并发会话。

188* **本地进程必须保持运行**:Remote Control 作为本地进程运行。如果您关闭终端、退出 VS Code 或以其他方式停止 `claude` 进程,会话结束。

189* **扩展网络中断**:如果您的机器处于唤醒状态但无法在大约 10 分钟以上的时间内到达网络,会话超时并且进程退出。再次运行 `claude remote-control` 以启动新会话。

190* **Ultraplan 断开 Remote Control**:启动 [ultraplan](/zh-CN/ultraplan) 会话会断开任何活动的 Remote Control 会话,因为两个功能都占据 claude.ai/code 界面,一次只能连接一个。

191* **某些命令仅限本地**:在终端中打开交互式选择器的命令,例如 `/mcp`、`/plugin` 或 `/resume`,仅从本地 CLI 工作。生成文本输出的命令,包括 `/compact`、`/clear`、`/context`、`/usage`、`/exit`、`/extra-usage`、`/recap` 和 `/reload-plugins`,可从移动和网络工作。

192 

193## 故障排除

194 

195### "Remote Control 需要 claude.ai 订阅"

196 

197您未使用 claude.ai 账户进行身份验证。运行 `claude auth login` 并选择 claude.ai 选项。如果在您的环境中设置了 `ANTHROPIC_API_KEY`,请先取消设置它。

198 

199### "Remote Control 需要完整范围的登录令牌"

200 

201您使用来自 `claude setup-token` 或 `CLAUDE_CODE_OAUTH_TOKEN` 环境变量的长期令牌进行身份验证。这些令牌仅限于推理,无法建立 Remote Control 会话。运行 `claude auth login` 以改用完整范围的会话令牌进行身份验证。

202 

203### "无法确定您的组织以进行 Remote Control 资格检查"

204 

205您的缓存账户信息已过期或不完整。运行 `claude auth login` 以刷新它。

206 

207### "Remote Control 尚未为您的账户启用"

208 

209在存在某些环境变量的情况下,资格检查可能会失败:

210 

211* `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC` 或 `DISABLE_TELEMETRY`:取消设置它们并重试。

212* `CLAUDE_CODE_USE_BEDROCK`、`CLAUDE_CODE_USE_VERTEX` 或 `CLAUDE_CODE_USE_FOUNDRY`:Remote Control 需要 claude.ai 身份验证,不适用于第三方提供商。

213 

214如果这些都没有设置,请运行 `/logout` 然后 `/login` 以刷新。

215 

216### "Remote Control 被您的组织的策略禁用"

217 

218此错误有三个不同的原因。首先运行 `/status` 以查看您使用的登录方法和订阅。

219 

220* **您使用 API 密钥或 Console 账户进行身份验证**:Remote Control 需要 claude.ai OAuth。运行 `/login` 并选择 claude.ai 选项。如果在您的环境中设置了 `ANTHROPIC_API_KEY`,请取消设置它。

221* **您的 Team 或 Enterprise 管理员尚未启用它**:Remote Control 在这些计划上默认处于关闭状态。管理员可以在 [claude.ai/admin-settings/claude-code](https://claude.ai/admin-settings/claude-code) 通过打开 **Remote Control** 切换来启用它。这是一个服务器端组织设置,不是[仅管理设置](/zh-CN/permissions#managed-only-settings)密钥。

222* **管理员切换呈灰色**:您的组织有数据保留或合规配置与 Remote Control 不兼容。这无法从管理面板更改。请联系 Anthropic 支持以讨论选项。

223 

224### "Remote credentials fetch failed"

225 

226Claude Code 无法从 Anthropic API 获取短期凭证以建立连接。使用 `--verbose` 重新运行以查看完整错误:

227 

228```bash theme={null}

229claude remote-control --verbose

230```

231 

232常见原因:

233 

234* 未登录:运行 `claude` 并使用 `/login` 使用您的 claude.ai 账户进行身份验证。Remote Control 不支持 API 密钥身份验证。

235* 网络或代理问题:防火墙或代理可能阻止出站 HTTPS 请求。Remote Control 需要访问端口 443 上的 Anthropic API。

236* 会话创建失败:如果您还看到 `Session creation failed — see debug log`,失败发生在设置的早期。检查您的订阅是否处于活动状态。

237 

238## 选择正确的方法

239 

240Claude Code offers several ways to work when you're not at your terminal. They differ in what triggers the work, where Claude runs, and how much you need to set up.

241 

242| | Trigger | Claude runs on | Setup | Best for |

243| :--------------------------------------------- | :--------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------ |

244| [Dispatch](/en/desktop#sessions-from-dispatch) | Message a task from the Claude mobile app | Your machine (Desktop) | [Pair the mobile app with Desktop](https://support.claude.com/en/articles/13947068) | Delegating work while you're away, minimal setup |

245| [Remote Control](/en/remote-control) | Drive a running session from [claude.ai/code](https://claude.ai/code) or the Claude mobile app | Your machine (CLI or VS Code) | Run `claude remote-control` | Steering in-progress work from another device |

246| [Channels](/en/channels) | Push events from a chat app like Telegram or Discord, or your own server | Your machine (CLI) | [Install a channel plugin](/en/channels#quickstart) or [build your own](/en/channels-reference) | Reacting to external events like CI failures or chat messages |

247| [Slack](/en/slack) | Mention `@Claude` in a team channel | Anthropic cloud | [Install the Slack app](/en/slack#setting-up-claude-code-in-slack) with [Claude Code on the web](/en/claude-code-on-the-web) enabled | PRs and reviews from team chat |

248| [Scheduled tasks](/en/scheduled-tasks) | Set a schedule | [CLI](/en/scheduled-tasks), [Desktop](/en/desktop-scheduled-tasks), or [cloud](/en/routines) | Pick a frequency | Recurring automation like daily reviews |

249 

250## 相关资源

251 

252* [网络上的 Claude Code](/zh-CN/claude-code-on-the-web):在 Anthropic 管理的云环境中运行会话,而不是在您的机器上

253* [Ultraplan](/zh-CN/ultraplan):从您的终端启动云规划会话并在浏览器中查看计划

254* [Channels](/zh-CN/channels):将 Telegram、Discord 或 iMessage 转发到会话中,以便 Claude 在您离开时对消息做出反应

255* [Dispatch](/zh-CN/desktop#sessions-from-dispatch):从您的手机发送任务消息,它可以生成 Desktop 会话来处理它

256* [身份验证](/zh-CN/authentication):设置 `/login` 并管理 claude.ai 的凭证

257* [CLI 参考](/zh-CN/cli-reference):包括 `claude remote-control` 的标志和命令的完整列表

258* [安全](/zh-CN/security):Remote Control 会话如何适应 Claude Code 安全模型

259* [数据使用](/zh-CN/data-usage):在本地和远程会话期间通过 Anthropic API 流动的数据

routines.md +319 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 使用例程自动化工作

6 

7> 让 Claude Code 自动运行。定义在计划上运行、通过 API 调用触发或对来自 Anthropic 管理的云基础设施的 GitHub 事件做出反应的例程。

8 

9<Note>

10 Routines 处于研究预览阶段。行为、限制和 API 表面可能会改变。

11</Note>

12 

13例程是一个保存的 Claude Code 配置:一个提示、一个或多个存储库和一组 [connectors](/zh-CN/mcp),打包一次并自动运行。例程在 Anthropic 管理的云基础设施上执行,因此当您的笔记本电脑关闭时它们仍然可以工作。

14 

15每个例程可以附加一个或多个触发器:

16 

17* **Scheduled**:按照每小时、每晚或每周等定期节奏运行

18* **API**:通过向每个例程端点发送带有持有者令牌的 HTTP POST 来按需触发

19* **GitHub**:自动响应存储库事件(如拉取请求或发布)运行

20 

21单个例程可以组合触发器。例如,PR 审查例程可以每晚运行、从部署脚本触发,也可以对每个新 PR 做出反应。

22 

23Routines 在启用了 [Claude Code on the web](/zh-CN/claude-code-on-the-web) 的 Pro、Max、Team 和 Enterprise 计划上可用。在 [claude.ai/code/routines](https://claude.ai/code/routines) 创建和管理它们,或从 CLI 使用 `/schedule`。

24 

25本页涵盖创建例程、配置每种触发器类型、管理运行以及使用限制如何应用。

26 

27## 示例用例

28 

29每个示例将触发器类型与例程适合的工作类型配对:无人值守、可重复且与明确的结果相关。

30 

31**积压维护。** 计划触发器每个工作日晚上针对您的问题跟踪器通过 connector 运行。例程读取自上次运行以来打开的问题,应用标签,根据引用的代码区域分配所有者,并将摘要发布到 Slack,以便团队以整理好的队列开始新的一天。

32 

33**警报分类。** 您的监控工具在错误阈值被超过时调用例程的 API 端点,将警报正文作为 `text` 传递。例程提取堆栈跟踪,将其与存储库中的最近提交相关联,并打开一个包含建议修复和返回警报链接的草稿拉取请求。值班人员审查 PR 而不是从空白终端开始。

34 

35**定制代码审查。** GitHub 触发器在 `pull_request.opened` 上运行。例程应用您团队自己的审查清单,为安全性、性能和风格问题留下内联注释,并添加摘要注释,以便人工审查者可以专注于设计而不是机械检查。

36 

37**部署验证。** 您的 CD 管道在每次生产部署后调用例程的 API 端点。例程针对新构建运行烟雾测试,扫描错误日志以查找回归,并在部署窗口关闭之前向发布频道发布 go 或 no-go。

38 

39**文档漂移。** 计划触发器每周运行。例程扫描自上次运行以来合并的 PR,标记引用已更改 API 的文档,并针对文档存储库打开更新 PR 供编辑审查。

40 

41**库移植。** GitHub 触发器在 `pull_request.closed` 上运行,筛选为一个 SDK 存储库中的合并 PR。例程将更改移植到另一种语言的并行 SDK,并打开匹配的 PR,使两个库保持同步,而无需人工重新实现每个更改。

42 

43下面的部分将介绍创建例程和配置每种触发器类型。

44 

45## 创建例程

46 

47从 Web、Desktop 应用或 CLI 创建例程。所有三个界面都写入同一个云账户,因此您在 CLI 中创建的例程会立即显示在 claude.ai/code/routines 上。在 Desktop 应用中,单击 **New task** 并选择 **New remote task**;选择 **New local task** 会创建一个 [local Desktop scheduled task](/zh-CN/desktop-scheduled-tasks),它在您的机器上运行,不是例程。

48 

49创建表单设置例程的提示、存储库、环境、connectors 和触发器。

50 

51Routines 作为完整的 Claude Code 云会话自主运行:没有权限模式选择器,运行期间也没有批准提示。会话可以运行 shell 命令、使用 [skills](/zh-CN/skills) 提交到克隆的存储库,并调用您包含的任何 connectors。例程可以到达的内容由您选择的存储库及其分支推送设置、[environment](/zh-CN/claude-code-on-the-web#the-cloud-environment) 的网络访问和变量以及您包含的 connectors 决定。将每个范围限制在例程实际需要的范围内。

52 

53Routines 属于您的个人 claude.ai 账户。它们不与队友共享,并且计入您账户的每日运行配额。例程通过您连接的 GitHub 身份或 connectors 所做的任何事情都显示为您:提交和拉取请求携带您的 GitHub 用户,Slack 消息、Linear 票证或其他 connector 操作使用您为这些服务链接的账户。

54 

55### 从 Web 创建

56 

57<Steps>

58 <Step title="打开创建表单">

59 访问 [claude.ai/code/routines](https://claude.ai/code/routines) 并单击 **New routine**。

60 </Step>

61 

62 <Step title="命名例程并编写提示">

63 给例程一个描述性名称并编写 Claude 每次运行的提示。提示是最重要的部分:例程自主运行,因此提示必须是自包含的,并明确说明要做什么以及成功是什么样的。

64 

65 提示输入包括一个模型选择器。Claude 在每次运行时使用选定的模型。

66 </Step>

67 

68 <Step title="选择存储库">

69 添加一个或多个 GitHub 存储库供 Claude 在其中工作。每个存储库在运行开始时从默认分支克隆。Claude 为其更改创建 `claude/` 前缀的分支。要允许推送到任何分支,请为该存储库启用 **Allow unrestricted branch pushes**。

70 </Step>

71 

72 <Step title="选择环境">

73 为例程选择一个 [cloud environment](/zh-CN/claude-code-on-the-web#the-cloud-environment)。环境控制云会话可以访问的内容:

74 

75 * **Network access**:设置每次运行期间可用的互联网访问级别

76 * **Environment variables**:提供 Claude 可以使用的 API 密钥、令牌或其他机密

77 * **Setup script**:安装例程需要的依赖项和工具。结果是 [cached](/zh-CN/claude-code-on-the-web#environment-caching),因此脚本不会在每个会话上重新运行

78 

79 提供了一个 **Default** 环境。要使用自定义环境,请在创建例程之前 [create one](/zh-CN/claude-code-on-the-web#the-cloud-environment)。

80 </Step>

81 

82 <Step title="选择触发器">

83 在 **Select a trigger** 下,选择例程如何启动。您可以选择一种触发器类型或组合多种。

84 

85 <Tabs>

86 <Tab title="Schedule">

87 选择预设频率:每小时、每天、工作日或每周。有关时区处理、交错和自定义 cron 间隔,请参阅 [Add a schedule trigger](#add-a-schedule-trigger)。

88 </Tab>

89 

90 <Tab title="GitHub event">

91 选择存储库、要响应的事件和可选过滤器。有关支持的事件和过滤器字段的完整列表,请参阅 [Add a GitHub trigger](#add-a-github-trigger)。

92 </Tab>

93 

94 <Tab title="API">

95 在此处选择 **API**,然后保存例程。URL 和令牌在保存例程后生成,因为它们取决于例程 ID。请参阅 [Add an API trigger](#add-an-api-trigger) 以复制 URL 并生成令牌。

96 </Tab>

97 </Tabs>

98 </Step>

99 

100 <Step title="审查 connectors">

101 默认情况下包括您所有连接的 [MCP connectors](/zh-CN/mcp)。删除例程不需要的任何内容。Connectors 在每次运行期间让 Claude 可以访问外部服务,如 Slack、Linear 或 Google Drive。

102 </Step>

103 

104 <Step title="创建例程">

105 单击 **Create**。例程出现在列表中,并在下次其触发器之一匹配时运行。要立即启动运行,请在例程的详细信息页面上单击 **Run now**。

106 

107 每次运行都会在您的其他会话旁边创建一个新会话,您可以在其中查看 Claude 所做的工作、审查更改并创建拉取请求。

108 </Step>

109</Steps>

110 

111### 从 CLI 创建

112 

113在任何会话中运行 `/schedule` 以对话方式创建计划例程。您也可以直接传递描述,如 `/schedule daily PR review at 9am`。Claude 会遍历 Web 表单收集的相同信息,然后将例程保存到您的账户。

114 

115CLI 中的 `/schedule` 仅创建计划例程。要添加 API 或 GitHub 触发器,请在 [claude.ai/code/routines](https://claude.ai/code/routines) 的 Web 上编辑例程。

116 

117CLI 还支持管理现有例程。运行 `/schedule list` 查看所有例程,`/schedule update` 更改一个,或 `/schedule run` 立即触发它。

118 

119### 从 Desktop 应用创建

120 

121在 Desktop 应用中打开 **Schedule** 页面,单击 **New task**,然后选择 **New remote task**。Desktop 应用在同一网格中显示本地计划任务和例程。有关本地选项的详细信息,请参阅 [Desktop scheduled tasks](/zh-CN/desktop-scheduled-tasks)。

122 

123## 配置触发器

124 

125当例程的触发器之一匹配时,例程启动。您可以将任何组合的计划、API 和 GitHub 触发器附加到同一例程,并随时从例程编辑表单的 **Select a trigger** 部分添加或删除它们。

126 

127### 添加计划触发器

128 

129计划触发器按定期节奏运行例程。在 **Select a trigger** 部分中选择预设频率:每小时、每天、工作日或每周。时间以您的本地时区输入并自动转换,因此例程在该挂钟时间运行,无论云基础设施位于何处。

130 

131运行可能在计划时间后几分钟开始,原因是交错。每个例程的偏移是一致的。

132 

133对于自定义间隔(如每两小时或每月的第一天),在表单中选择最接近的预设,然后在 CLI 中运行 `/schedule update` 以设置特定的 cron 表达式。最小间隔是一小时;运行频率更高的表达式被拒绝。

134 

135### 添加 API 触发器

136 

137API 触发器为例程提供专用的 HTTP 端点。使用例程的持有者令牌 POST 到端点会启动新会话并返回会话 URL。使用此功能将 Claude Code 连接到警报系统、部署管道、内部工具或任何可以进行身份验证 HTTP 请求的地方。

138 

139API 触发器从 Web 添加到现有例程。CLI 目前无法创建或撤销令牌。

140 

141<Steps>

142 <Step title="打开例程进行编辑">

143 转到 [claude.ai/code/routines](https://claude.ai/code/routines),单击您想通过 API 触发的例程,然后单击铅笔图标打开 **Edit routine**。

144 </Step>

145 

146 <Step title="添加 API 触发器">

147 滚动到提示下方的 **Select a trigger** 部分,单击 **Add another trigger**,然后选择 **API**。

148 </Step>

149 

150 <Step title="复制 URL 并生成令牌">

151 模态显示此例程的 URL 以及示例 curl 命令。复制 URL,然后单击 **Generate token** 并立即复制令牌。令牌仅显示一次,之后无法检索,因此请将其存储在安全的地方,如您的警报工具的密钥存储。

152 </Step>

153 

154 <Step title="调用端点">

155 POST 到 URL 时在 `Authorization: Bearer` 标头中发送令牌。下面的 [Trigger a routine](#trigger-a-routine) 部分显示了完整示例。

156 </Step>

157</Steps>

158 

159每个例程都有自己的令牌,仅限于触发该例程。要轮换或撤销它,请返回同一模态并单击 **Regenerate** 或 **Revoke**。

160 

161#### 触发例程

162 

163向 `/fire` 端点发送 POST 请求,在 `Authorization` 标头中包含持有者令牌。请求正文接受可选的 `text` 字段,用于运行特定的上下文,如警报正文或失败的日志,与其保存的提示一起传递给例程。该值是自由格式文本,不被解析:如果您发送 JSON 或其他结构化有效负载,例程会将其作为文字字符串接收。

164 

165下面的示例从 shell 触发例程:

166 

167```bash theme={null}

168curl -X POST https://api.anthropic.com/v1/claude_code/routines/trig_01ABCDEFGHJKLMNOPQRSTUVW/fire \

169 -H "Authorization: Bearer sk-ant-oat01-xxxxx" \

170 -H "anthropic-beta: experimental-cc-routine-2026-04-01" \

171 -H "anthropic-version: 2023-06-01" \

172 -H "Content-Type: application/json" \

173 -d '{"text": "Sentry alert SEN-4521 fired in prod. Stack trace attached."}'

174```

175 

176成功的请求返回包含新会话 ID 和 URL 的 JSON 正文:

177 

178```json theme={null}

179{

180 "type": "routine_fire",

181 "claude_code_session_id": "session_01HJKLMNOPQRSTUVWXYZ",

182 "claude_code_session_url": "https://claude.ai/code/session_01HJKLMNOPQRSTUVWXYZ"

183}

184```

185 

186在浏览器中打开会话 URL 以实时观看运行、审查更改或手动继续对话。

187 

188<Warning>

189 `/fire` 端点在 `experimental-cc-routine-2026-04-01` beta 标头下发布。请求和响应形状、速率限制和令牌语义可能在功能处于研究预览阶段时改变。破坏性更改在新的日期 beta 标头版本后发布,最近的两个先前标头版本继续工作,以便调用者有时间迁移。

190</Warning>

191 

192#### API 参考

193 

194有关完整的 API 参考,包括所有错误响应、验证规则和字段限制,请参阅 Claude Platform 文档中的 [Trigger a routine via API](https://platform.claude.com/docs/zh-CN/api/claude-code/routines-fire)。

195 

196`/fire` 端点仅对 claude.ai 用户可用,不是 Claude Platform API 表面的一部分。

197 

198### 添加 GitHub 触发器

199 

200GitHub 触发器在连接的存储库上发生匹配事件时自动启动新会话。每个匹配事件启动自己的会话。

201 

202<Note>

203 在研究预览期间,GitHub webhook 事件受每个例程和每个账户的每小时上限限制。超过限制的事件被丢弃,直到窗口重置。在 [claude.ai/code/routines](https://claude.ai/code/routines) 查看您当前的限制。

204</Note>

205 

206GitHub 触发器仅从 Web UI 配置。

207 

208<Steps>

209 <Step title="打开例程进行编辑">

210 转到 [claude.ai/code/routines](https://claude.ai/code/routines),单击例程,然后单击铅笔图标打开 **Edit routine**。

211 </Step>

212 

213 <Step title="添加 GitHub 事件触发器">

214 滚动到 **Select a trigger** 部分,单击 **Add another trigger**,然后选择 **GitHub event**。

215 </Step>

216 

217 <Step title="安装 Claude GitHub App">

218 Claude GitHub App 必须安装在您想订阅的存储库上。如果尚未安装,触发器设置会提示您安装它。

219 

220 <Note>

221 在 CLI 中运行 `/web-setup` 授予存储库访问权限以进行克隆,但它不安装 Claude GitHub App,也不启用 webhook 传递。GitHub 触发器需要安装 Claude GitHub App,触发器设置会提示您这样做。

222 </Note>

223 </Step>

224 

225 <Step title="配置触发器">

226 选择存储库,从 [supported events](#supported-events) 列表中选择事件,并可选地添加过滤器。保存触发器。

227 </Step>

228</Steps>

229 

230#### 支持的事件

231 

232GitHub 触发器可以订阅以下事件类别之一。在每个类别中,您可以选择特定操作(如 `pull_request.opened`)或对类别中的所有操作做出反应。

233 

234| Event | Triggers when |

235| :----------- | :------------------------- |

236| Pull request | PR 被打开、关闭、分配、标记、同步或以其他方式更新 |

237| Release | 发布被创建、发布、编辑或删除 |

238 

239#### 过滤拉取请求

240 

241使用过滤器缩小哪些拉取请求启动新会话。所有过滤条件必须匹配才能触发例程。可用的过滤字段是:

242 

243| Filter | Matches |

244| :---------- | :---------------- |

245| Author | PR 作者的 GitHub 用户名 |

246| Title | PR 标题文本 |

247| Body | PR 描述文本 |

248| Base branch | PR 目标的分支 |

249| Head branch | PR 来自的分支 |

250| Labels | 应用于 PR 的标签 |

251| Is draft | PR 是否处于草稿状态 |

252| Is merged | PR 是否已合并 |

253| From fork | PR 是否来自 fork |

254 

255每个过滤器将字段与运算符配对:equals、contains、starts with、is one of、is not one of 或 matches regex。

256 

257`matches regex` 运算符测试整个字段值,而不是其中的子字符串。要匹配包含 `hotfix` 的任何标题,请写 `.*hotfix.*`。没有周围的 `.*`,过滤器仅匹配完全是 `hotfix` 的标题,前后没有任何内容。对于不使用 regex 语法的文字子字符串匹配,请改用 `contains` 运算符。

258 

259一些示例过滤器组合:

260 

261* **Auth module review**:base branch `main`,head branch contains `auth-provider`。将任何涉及身份验证的 PR 发送给专注的审查者。

262* **External contributor triage**:from fork is `true`。在人工查看之前,通过额外的安全和风格审查路由每个基于 fork 的 PR。

263* **Ready-for-review only**:is draft is `false`。跳过草稿,以便例程仅在 PR 准备好审查时运行。

264* **Label-gated backport**:labels include `needs-backport`。仅当维护者标记 PR 时才触发移植到另一个分支的例程。

265 

266#### 会话如何映射到事件

267 

268每个匹配的 GitHub 事件启动新会话。GitHub 触发的例程不支持跨事件重用会话,因此两个 PR 更新会产生两个独立会话。

269 

270## 管理例程

271 

272单击列表中的例程以打开其详细信息页面。详细信息页面显示例程的存储库、connectors、提示、计划、API 令牌、GitHub 触发器和过去运行的列表。

273 

274### 查看和交互运行

275 

276单击任何运行以将其作为完整会话打开。从那里您可以看到 Claude 所做的工作、审查更改、创建拉取请求或继续对话。每个运行会话的工作方式与任何其他会话相同:使用会话标题旁边的下拉菜单来重命名、存档或删除它。

277 

278### 编辑和控制例程

279 

280从例程详细信息页面,您可以:

281 

282* 单击 **Run now** 立即启动运行,而无需等待下一个计划时间。

283* 使用 **Repeats** 部分中的切换来暂停或恢复计划。暂停的例程保持其配置但不运行,直到您重新启用它们。

284* 单击铅笔图标打开 **Edit routine** 并更改名称、提示、存储库、环境、connectors 或例程的任何触发器。**Select a trigger** 部分是您添加或删除计划、API 令牌和 GitHub 事件触发器的地方。

285* 单击删除图标以删除例程。例程创建的过去会话保留在您的会话列表中。

286 

287### 存储库和分支权限

288 

289Routines 需要 GitHub 访问权限来克隆存储库。当您使用 `/schedule` 从 CLI 创建例程时,Claude 检查您的账户是否连接了 GitHub,如果没有,会提示您运行 `/web-setup`。有关授予访问权限的两种方式,请参阅 [GitHub authentication options](/zh-CN/claude-code-on-the-web#github-authentication-options)。

290 

291您添加的每个存储库在每次运行时都会被克隆。Claude 从存储库的默认分支开始,除非您的提示另有指定。

292 

293默认情况下,Claude 只能推送到以 `claude/` 为前缀的分支。这可以防止例程意外修改受保护或长期分支。要为特定存储库删除此限制,请在创建或编辑例程时为该存储库启用 **Allow unrestricted branch pushes**。

294 

295### Connectors

296 

297Routines 可以使用您连接的 MCP connectors 在每次运行期间读取和写入外部服务。例如,分类支持请求的例程可能从 Slack 频道读取并在 Linear 中创建问题。

298 

299创建例程时,默认情况下包括您当前连接的所有 connectors。删除不需要的任何内容以限制 Claude 在运行期间可以访问的工具。您也可以直接从例程表单添加 connectors。

300 

301要在例程表单外管理或添加 connectors,请访问 claude.ai 上的 **Settings > Connectors** 或在 CLI 中使用 `/schedule update`。

302 

303### 环境

304 

305每个例程在 [cloud environment](/zh-CN/claude-code-on-the-web#the-cloud-environment) 中运行,该环境控制网络访问、环境变量和设置脚本。在创建例程之前配置环境,以便让 Claude 访问 API、安装依赖项或限制网络范围。有关完整的设置指南,请参阅 [cloud environment](/zh-CN/claude-code-on-the-web#the-cloud-environment)。

306 

307## 使用和限制

308 

309Routines 以与交互式会话相同的方式消耗订阅使用量。除了标准订阅限制外,routines 还对每个账户每天可以启动多少次运行有上限。在 [claude.ai/code/routines](https://claude.ai/code/routines) 或 [claude.ai/settings/usage](https://claude.ai/settings/usage) 查看您当前的消耗和剩余的每日例程运行次数。

310 

311当例程达到每日上限或您的订阅使用限制时,启用了额外使用的组织可以继续在计量超额上运行例程。没有额外使用,额外运行被拒绝,直到窗口重置。从 claude.ai 上的 **Settings > Billing** 启用额外使用。

312 

313## 相关资源

314 

315* [`/loop` and in-session scheduling](/zh-CN/scheduled-tasks):在打开的 CLI 会话中计划本地任务

316* [Desktop scheduled tasks](/zh-CN/desktop-scheduled-tasks):在您的机器上运行的本地计划任务,可以访问本地文件

317* [Cloud environment](/zh-CN/claude-code-on-the-web#the-cloud-environment):为云会话配置运行时环境

318* [MCP connectors](/zh-CN/mcp):连接外部服务,如 Slack、Linear 和 Google Drive

319* [GitHub Actions](/zh-CN/github-actions):在存储库事件的 CI 管道中运行 Claude

sandboxing.md +329 −0 created

Details

1> ## Documentation Index

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

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

4 

5# Sandboxing

6 

7> 了解 Claude Code 的沙箱 bash 工具如何提供文件系统和网络隔离,以实现更安全、更自主的代理执行。

8 

9## 概述

10 

11Claude Code 具有原生沙箱功能,为代理执行提供更安全的环境,同时减少了对持续权限提示的需求。Claude Code 不是要求对每个 bash 命令进行权限批准,而是预先创建定义的边界,使 Claude Code 能够以降低的风险更自由地工作。

12 

13沙箱 bash 工具使用操作系统级原语来强制执行文件系统和网络隔离。

14 

15## 为什么沙箱很重要

16 

17传统的基于权限的安全性需要对 bash 命令进行持续的用户批准。虽然这提供了控制,但可能导致:

18 

19* **批准疲劳**:重复点击"批准"可能导致用户对他们批准的内容关注度降低

20* **生产力降低**:持续的中断会减慢开发工作流程

21* **自主性受限**:当等待批准时,Claude Code 无法高效工作

22 

23沙箱通过以下方式解决这些挑战:

24 

251. **定义清晰的边界**:精确指定 Claude Code 可以访问的目录和网络主机

262. **减少权限提示**:沙箱内的安全命令不需要批准

273. **维护安全性**:尝试访问沙箱外的资源会触发立即通知

284. **启用自主性**:Claude Code 可以在定义的限制内更独立地运行

29 

30<Warning>

31 有效的沙箱需要**同时**进行文件系统和网络隔离。没有网络隔离,被破坏的代理可能会泄露敏感文件,如 SSH 密钥。没有文件系统隔离,被破坏的代理可能会后门系统资源以获得网络访问权限。配置沙箱时,重要的是确保配置的设置不会在这些系统中创建绕过。

32</Warning>

33 

34## 工作原理

35 

36### 文件系统隔离

37 

38沙箱 bash 工具将文件系统访问限制在特定目录:

39 

40* **默认写入行为**:对当前工作目录及其子目录的读写访问

41* **默认读取行为**:对整个计算机的读取访问,除了某些被拒绝的目录

42* **被阻止的访问**:无法在没有明确权限的情况下修改当前工作目录外的文件

43* **可配置**:通过设置定义自定义允许和拒绝的路径

44 

45您可以使用设置中的 `sandbox.filesystem.allowWrite` 向其他路径授予写入访问权限。这些限制在操作系统级别强制执行(macOS 上的 Seatbelt,Linux 上的 bubblewrap),因此它们适用于所有子进程命令,包括 `kubectl`、`terraform` 和 `npm` 等工具,而不仅仅是 Claude 的文件工具。

46 

47### 网络隔离

48 

49网络访问通过在沙箱外运行的代理服务器进行控制:

50 

51* **域名限制**:只能访问批准的域名

52* **用户确认**:新的域名请求会触发权限提示(除非启用了 [`allowManagedDomainsOnly`](/zh-CN/settings#sandbox-settings),它会自动阻止非允许的域名)

53* **自定义代理支持**:高级用户可以在出站流量上实现自定义规则

54* **全面覆盖**:限制适用于所有脚本、程序和由命令生成的子进程

55 

56### 操作系统级强制执行

57 

58沙箱 bash 工具利用操作系统安全原语:

59 

60* **macOS**:使用 Seatbelt 进行沙箱强制执行

61* **Linux**:使用 [bubblewrap](https://github.com/containers/bubblewrap) 进行隔离

62* **WSL2**:使用 bubblewrap,与 Linux 相同

63 

64不支持 WSL1,因为 bubblewrap 需要仅在 WSL2 中可用的内核功能。

65 

66这些操作系统级限制确保由 Claude Code 命令生成的所有子进程都继承相同的安全边界。

67 

68## 入门

69 

70### 前置条件

71 

72在 **macOS** 上,沙箱使用内置的 Seatbelt 框架开箱即用。

73 

74在 **Linux 和 WSL2** 上,首先安装所需的包:

75 

76<Tabs>

77 <Tab title="Ubuntu/Debian">

78 ```bash theme={null}

79 sudo apt-get install bubblewrap socat

80 ```

81 </Tab>

82 

83 <Tab title="Fedora">

84 ```bash theme={null}

85 sudo dnf install bubblewrap socat

86 ```

87 </Tab>

88</Tabs>

89 

90WSL1 不支持沙箱,因为它缺少所需的 Linux 命名空间原语。如果您看到 `Sandboxing requires WSL2`,请将您的发行版升级到 WSL2 或在没有沙箱的情况下运行 Claude Code。

91 

92在 WSL2 上,沙箱化命令无法启动 Windows 二进制文件,例如 `cmd.exe`、`powershell.exe` 或 `/mnt/c/` 下的任何内容。WSL 通过 Unix 套接字将这些交给 Windows 主机,沙箱会阻止这些。如果命令需要调用 Windows 二进制文件,请将其添加到 [`excludedCommands`](/zh-CN/settings#sandbox-settings),以便它在沙箱外运行。

93 

94### 启用沙箱

95 

96您可以通过运行 `/sandbox` 命令来启用沙箱:

97 

98```text theme={null}

99/sandbox

100```

101 

102这会打开一个菜单,您可以在其中选择沙箱模式。如果缺少所需的依赖项(例如 Linux 上的 `bubblewrap` 或 `socat`),菜单会显示您平台的安装说明。

103 

104默认情况下,如果沙箱无法启动(缺少依赖项或不支持的平台),Claude Code 会显示警告并在没有沙箱的情况下运行命令。要使其成为硬失败,请将 [`sandbox.failIfUnavailable`](/zh-CN/settings#sandbox-settings) 设置为 `true`。这适用于需要沙箱作为安全门的托管部署。

105 

106### 沙箱模式

107 

108Claude Code 提供两种沙箱模式:

109 

110**自动允许模式**:Bash 命令将尝试在沙箱内运行,并自动允许而无需权限。无法沙箱化的命令(例如需要访问非允许主机的网络访问的命令)会回退到常规权限流程。显式拒绝规则始终被尊重,针对 `/`、您的主目录或其他关键系统路径的 `rm` 或 `rmdir` 命令仍会触发权限提示。询问规则仅适用于回退到常规权限流程的命令。

111 

112**常规权限模式**:所有 bash 命令都通过标准权限流程,即使是沙箱化的。这提供了更多控制,但需要更多批准。

113 

114在两种模式中,沙箱都强制执行相同的文件系统和网络限制。区别仅在于沙箱化命令是自动批准还是需要明确权限。

115 

116<Info>

117 自动允许模式独立于您的权限模式设置工作。即使您不在"接受编辑"模式中,启用自动允许时沙箱化的 bash 命令也会自动运行。这意味着在沙箱边界内修改文件的 bash 命令将执行而不提示,即使文件编辑工具通常需要批准。

118</Info>

119 

120### 配置沙箱

121 

122通过 `settings.json` 文件自定义沙箱行为。有关完整的配置参考,请参阅 [Settings](/zh-CN/settings#sandbox-settings)。

123 

124#### 向特定路径授予子进程写入访问权限

125 

126默认情况下,沙箱化命令只能写入当前工作目录。如果子进程命令(如 `kubectl`、`terraform` 或 `npm`)需要在项目目录外写入,请使用 `sandbox.filesystem.allowWrite` 向特定路径授予访问权限:

127 

128```json theme={null}

129{

130 "sandbox": {

131 "enabled": true,

132 "filesystem": {

133 "allowWrite": ["~/.kube", "/tmp/build"]

134 }

135 }

136}

137```

138 

139这些路径在操作系统级别强制执行,因此在沙箱内运行的所有命令(包括其子进程)都尊重它们。当工具需要对特定位置的写入访问时,这是推荐的方法,而不是使用 `excludedCommands` 将工具从沙箱中排除。

140 

141当在多个 [settings scopes](/zh-CN/settings#settings-precedence) 中定义 `allowWrite`(或 `denyWrite`/`denyRead`/`allowRead`)时,数组被**合并**,这意味着来自每个范围的路径被组合,而不是替换。例如,如果托管设置允许写入 `/opt/company-tools`,用户在其个人设置中添加 `~/.kube`,则两个路径都包含在最终沙箱配置中。这意味着用户和项目可以扩展列表而无需复制或覆盖由更高优先级范围设置的路径。

142 

143路径前缀控制路径的解析方式:

144 

145| 前缀 | 含义 | 示例 |

146| :-------- | :---------------------------------- | :-------------------------------------------- |

147| `/` | 从文件系统根目录的绝对路径 | `/tmp/build` 保持 `/tmp/build` |

148| `~/` | 相对于主目录 | `~/.kube` 变为 `$HOME/.kube` |

149| `./` 或无前缀 | 相对于项目设置的项目根目录,或相对于用户设置的 `~/.claude` | 项目设置中的 `./output` 解析为 `<project-root>/output` |

150 

151较旧的 `//path` 前缀用于绝对路径仍然有效。如果您之前使用单斜杠 `/path` 期望项目相对解析,请切换到 `./path`。此语法与 [Read and Edit](/zh-CN/permissions#read-and-edit) 权限规则不同,后者使用 `//path` 表示绝对路径,`/path` 表示项目相对路径。沙箱文件系统路径使用标准约定:`/tmp/build` 是绝对路径。

152 

153您也可以使用 `sandbox.filesystem.denyWrite` 和 `sandbox.filesystem.denyRead` 拒绝写入或读取访问。这些与来自 `Edit(...)` 和 `Read(...)` 权限规则的任何路径合并。要重新允许读取被拒绝区域内的特定路径,请使用 `sandbox.filesystem.allowRead`,它优先于 `denyRead`。当在托管设置中启用 `allowManagedReadPathsOnly` 时,仅尊重托管 `allowRead` 条目;用户、项目和本地 `allowRead` 条目被忽略。`denyRead` 仍然从所有来源合并。

154 

155例如,要阻止从整个主目录读取,同时仍允许从当前项目读取,请将此添加到您的项目的 `.claude/settings.json`:

156 

157```json theme={null}

158{

159 "sandbox": {

160 "enabled": true,

161 "filesystem": {

162 "denyRead": ["~/"],

163 "allowRead": ["."]

164 }

165 }

166}

167```

168 

169`allowRead` 中的 `.` 解析为项目根目录,因为此配置位于项目设置中。如果您将相同的配置放在 `~/.claude/settings.json` 中,`.` 将解析为 `~/.claude`,项目文件将保持被 `denyRead` 规则阻止。

170 

171<Tip>

172 并非所有命令都与沙箱开箱即用兼容。一些可能帮助您充分利用沙箱的注意事项:

173 

174 * 许多 CLI 工具需要访问某些主机。当您使用这些工具时,它们会请求访问某些主机的权限。授予权限将允许它们现在和将来访问这些主机,使它们能够在沙箱内安全执行。

175 * `watchman` 与在沙箱中运行不兼容。如果您运行 `jest`,请考虑使用 `jest --no-watchman`

176 * `docker` 与在沙箱中运行不兼容。考虑在 `excludedCommands` 中指定 `docker *` 以强制其在沙箱外运行。

177</Tip>

178 

179<Note>

180 Claude Code 包括一个有意的逃生舱机制,允许命令在必要时在沙箱外运行。当命令由于沙箱限制(例如网络连接问题或不兼容的工具)失败时,Claude 会被提示分析失败,并可能使用 `dangerouslyDisableSandbox` 参数重试命令。使用此参数的命令通过需要用户权限执行的常规 Claude Code 权限流程。这允许 Claude Code 处理某些工具或网络操作无法在沙箱约束内运行的边界情况。

181 

182 您可以通过在 [sandbox settings](/zh-CN/settings#sandbox-settings) 中设置 `"allowUnsandboxedCommands": false` 来禁用此逃生舱。禁用时,`dangerouslyDisableSandbox` 参数被完全忽略,所有命令必须沙箱化运行或在 `excludedCommands` 中明确列出。

183</Note>

184 

185## 安全优势

186 

187### 防止提示注入

188 

189即使攻击者通过提示注入成功操纵 Claude Code 的行为,沙箱也确保您的系统保持安全:

190 

191**文件系统保护:**

192 

193* 无法修改关键配置文件,如 `~/.bashrc`

194* 无法修改 `/bin/` 中的系统级文件

195* 无法读取在您的 [Claude 权限设置](/zh-CN/permissions#manage-permissions) 中被拒绝的文件

196 

197**网络保护:**

198 

199* 无法向攻击者控制的服务器泄露数据

200* 无法从未授权的域下载恶意脚本

201* 无法向未批准的服务进行意外的 API 调用

202* 无法联系任何未明确允许的域

203 

204**监控和控制:**

205 

206* 所有在沙箱外的访问尝试都在操作系统级别被阻止

207* 当边界被测试时,您会收到立即通知

208* 您可以选择拒绝、允许一次或永久更新您的配置

209 

210### 减少攻击面

211 

212沙箱限制了以下可能造成的损害:

213 

214* **恶意依赖项**:具有有害代码的 NPM 包或其他依赖项

215* **被破坏的脚本**:具有安全漏洞的构建脚本或工具

216* **社会工程**:欺骗用户运行危险命令的攻击

217* **提示注入**:欺骗 Claude 运行危险命令的攻击

218 

219### 透明操作

220 

221当 Claude Code 尝试访问沙箱外的网络资源时:

222 

2231. 操作在操作系统级别被阻止

2242. 您会收到立即通知

2253. 您可以选择:

226 * 拒绝请求

227 * 允许一次

228 * 更新您的沙箱配置以永久允许它

229 

230## 安全限制

231 

232* 网络沙箱限制:网络过滤系统通过限制进程允许连接的域来运行。它不会以其他方式检查通过代理的流量,用户负责确保他们只在其策略中允许受信任的域。

233 

234<Warning>

235 用户应该意识到允许广泛域名(如 `github.com`)可能允许数据泄露的潜在风险。此外,在某些情况下,可能可以通过 [domain fronting](https://en.wikipedia.org/wiki/Domain_fronting) 绕过网络过滤。

236</Warning>

237 

238* 通过 Unix Sockets 的权限提升:`allowUnixSockets` 配置可能会无意中授予对可能导致沙箱绕过的强大系统服务的访问权限。例如,如果它用于允许访问 `/var/run/docker.sock`,这将有效地通过利用 docker socket 授予对主机系统的访问权限。鼓励用户仔细考虑他们通过沙箱允许的任何 unix sockets。

239* 文件系统权限提升:过于宽泛的文件系统写入权限可能导致权限提升攻击。允许写入包含 `$PATH` 中的可执行文件、系统配置目录或用户 shell 配置文件(`.bashrc`、`.zshrc`)的目录可能导致当其他用户或系统进程访问这些文件时在不同的安全上下文中执行代码。

240* Linux 沙箱强度:Linux 实现提供强大的文件系统和网络隔离,但包括一个 `enableWeakerNestedSandbox` 模式,使其能够在 Docker 环境中工作而无需特权命名空间。此选项大大削弱了安全性,应仅在其他隔离被强制执行的情况下使用。

241 

242## 沙箱如何与权限相关

243 

244沙箱和 [permissions](/zh-CN/permissions) 是互补的安全层,协同工作:

245 

246* **权限**控制 Claude Code 可以使用哪些工具,在任何工具运行之前进行评估。它们适用于所有工具:Bash、Read、Edit、WebFetch、MCP 和其他工具。

247* **沙箱**提供操作系统级强制执行,限制 Bash 命令在文件系统和网络级别可以访问的内容。它仅适用于 Bash 命令及其子进程。

248 

249文件系统和网络限制通过沙箱设置和权限规则进行配置:

250 

251* 使用 `sandbox.filesystem.allowWrite` 向工作目录外的路径授予子进程写入访问权限

252* 使用 `sandbox.filesystem.denyWrite` 和 `sandbox.filesystem.denyRead` 阻止子进程访问特定路径

253* 使用 `sandbox.filesystem.allowRead` 重新允许读取被拒绝区域内的特定路径

254* 使用 `Read` 和 `Edit` 拒绝规则阻止访问特定文件或目录

255* 使用 `WebFetch` 允许/拒绝规则控制域名访问

256* 使用沙箱 `allowedDomains` 控制 Bash 命令可以到达的域名

257* 使用沙箱 `deniedDomains` 阻止特定域名,即使更广泛的 `allowedDomains` 通配符会允许它们

258 

259来自 `sandbox.filesystem` 设置和权限规则的路径被合并到最终沙箱配置中。

260 

261此 [repository](https://github.com/anthropics/claude-code/tree/main/examples/settings) 包括常见部署场景的启动设置配置,包括沙箱特定的示例。使用这些作为起点,并根据您的需求调整它们。

262 

263## 高级用法

264 

265### 自定义代理配置

266 

267对于需要高级网络安全的组织,您可以实现自定义代理以:

268 

269* 解密和检查 HTTPS 流量

270* 应用自定义过滤规则

271* 记录所有网络请求

272* 与现有安全基础设施集成

273 

274```json theme={null}

275{

276 "sandbox": {

277 "network": {

278 "httpProxyPort": 8080,

279 "socksProxyPort": 8081

280 }

281 }

282}

283```

284 

285### 与现有安全工具的集成

286 

287沙箱 bash 工具与以下工具配合使用:

288 

289* **权限规则**:与 [permission settings](/zh-CN/permissions) 结合以实现深度防御

290* **开发容器**:与 [dev containers](/zh-CN/devcontainer) 一起使用以获得额外隔离

291* **企业策略**:通过 [managed settings](/zh-CN/settings#settings-precedence) 强制执行沙箱配置

292 

293## 最佳实践

294 

2951. **从限制性开始**:从最小权限开始,根据需要扩展

2962. **监控日志**:查看沙箱违规尝试以了解 Claude Code 的需求

2973. **使用环境特定的配置**:开发与生产环境的不同沙箱规则

2984. **与权限结合**:将沙箱与 IAM 策略一起使用以实现全面安全

2995. **测试配置**:验证您的沙箱设置不会阻止合法工作流程

300 

301## 开源

302 

303沙箱运行时作为开源 npm 包提供,供您在自己的代理项目中使用。这使更广泛的 AI 代理社区能够构建更安全、更安全的自主系统。这也可以用于沙箱化您可能希望运行的其他程序。例如,要沙箱化 MCP 服务器,您可以运行:

304 

305```bash theme={null}

306npx @anthropic-ai/sandbox-runtime <command-to-sandbox>

307```

308 

309有关实现细节和源代码,请访问 [GitHub repository](https://github.com/anthropic-experimental/sandbox-runtime)。

310 

311## 限制

312 

313* **性能开销**:最小,但某些文件系统操作可能稍慢

314* **兼容性**:某些需要特定系统访问模式的工具可能需要配置调整,或者甚至可能需要在沙箱外运行

315* **平台支持**:支持 macOS、Linux 和 WSL2。不支持 WSL1。计划支持原生 Windows。

316 

317## 沙箱不涵盖的内容

318 

319沙箱隔离 Bash 子进程。其他工具在不同的边界下运行:

320 

321* **内置文件工具**:Read、Edit 和 Write 直接使用权限系统,而不是通过沙箱运行。请参阅 [permissions](/zh-CN/permissions)。

322* **计算机使用**:当 Claude 打开应用程序并控制您的屏幕时,它在您的实际桌面上运行,而不是在隔离的环境中。每个应用程序的权限提示控制每个应用程序。请参阅 [CLI 中的计算机使用](/zh-CN/computer-use) 或 [Desktop 中的计算机使用](/zh-CN/desktop#let-claude-use-your-computer)。

323 

324## 另请参阅

325 

326* [Security](/zh-CN/security) - 全面的安全功能和最佳实践

327* [Permissions](/zh-CN/permissions) - 权限配置和访问控制

328* [Settings](/zh-CN/settings) - 完整的配置参考

329* [CLI reference](/zh-CN/cli-reference) - 命令行选项

scheduled-tasks.md +213 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 按计划运行提示词

6 

7> 使用 /loop 和 cron 调度工具在 Claude Code 会话中重复运行提示词、轮询状态或设置一次性提醒。

8 

9<Note>

10 计划任务需要 Claude Code v2.1.72 或更高版本。使用 `claude --version` 检查您的版本。

11</Note>

12 

13计划任务让 Claude 按间隔自动重新运行提示词。使用它们来轮询部署、监督 PR、检查长时间运行的构建,或在会话中稍后提醒自己做某事。要对事件进行实时反应而不是轮询,请参阅 [Channels](/zh-CN/channels):您的 CI 可以直接将失败推送到会话中。

14 

15任务是会话范围的:它们存在于当前对话中,当您启动新对话时就会停止。使用 `--resume` 或 `--continue` 恢复会带回任何尚未[过期](#seven-day-expiry)的任务:在过去 7 天内创建的重复任务,或计划时间尚未到达的一次性任务。对于独立于任何会话而存在的调度,请使用 [Routines](/zh-CN/routines)、[Desktop 计划任务](/zh-CN/desktop-scheduled-tasks) 或 [GitHub Actions](/zh-CN/github-actions)。

16 

17## 比较调度选项

18 

19Claude Code offers three ways to schedule recurring or one-off work:

20 

21| | [Cloud](/en/routines) | [Desktop](/en/desktop-scheduled-tasks) | [`/loop`](/en/scheduled-tasks) |

22| :------------------------- | :----------------------------- | :------------------------------------- | :---------------------------------- |

23| Runs on | Anthropic cloud | Your machine | Your machine |

24| Requires machine on | No | Yes | Yes |

25| Requires open session | No | No | Yes |

26| Persistent across restarts | Yes | Yes | Restored on `--resume` if unexpired |

27| Access to local files | No (fresh clone) | Yes | Yes |

28| MCP servers | Connectors configured per task | [Config files](/en/mcp) and connectors | Inherits from session |

29| Permission prompts | No (runs autonomously) | Configurable per task | Inherits from session |

30| Customizable schedule | Via `/schedule` in the CLI | Yes | Yes |

31| Minimum interval | 1 hour | 1 minute | 1 minute |

32 

33<Tip>

34 Use **cloud tasks** for work that should run reliably without your machine. Use **Desktop tasks** when you need access to local files and tools. Use **`/loop`** for quick polling during a session.

35</Tip>

36 

37## 使用 /loop 重复运行提示词

38 

39`/loop` [bundled skill](/zh-CN/commands) 是在会话保持打开时重复运行提示词的最快方式。间隔和提示词都是可选的,您提供的内容决定了循环的行为方式。

40 

41| 您提供的内容 | 示例 | 发生的情况 |

42| :----- | :-------------------------- | :-------------------------------------------------------------------- |

43| 间隔和提示词 | `/loop 5m check the deploy` | 您的提示词在[固定计划](#run-on-a-fixed-interval)上运行 |

44| 仅提示词 | `/loop check the deploy` | 您的提示词在 Claude 选择的[间隔](#let-claude-choose-the-interval)上运行,每次迭代 |

45| 仅间隔或无 | `/loop` | [内置维护提示词](#run-the-built-in-maintenance-prompt)运行,或您的 `loop.md`(如果存在) |

46 

47您也可以将另一个命令作为提示词传递,例如 `/loop 20m /review-pr 1234`,以在每次迭代时重新运行打包的工作流。

48 

49### 在固定间隔上运行

50 

51当您提供间隔时,Claude 将其转换为 cron 表达式,计划作业,并确认频率和作业 ID。

52 

53```text theme={null}

54/loop 5m check if the deployment finished and tell me what happened

55```

56 

57间隔可以作为裸令牌(如 `30m`)在提示词前面,或作为子句(如 `every 2 hours`)在后面。支持的单位是 `s` 表示秒、`m` 表示分钟、`h` 表示小时、`d` 表示天。

58 

59秒数向上舍入到最近的分钟,因为 cron 的粒度为一分钟。不能均匀映射到干净 cron 步长的间隔,例如 `7m` 或 `90m`,会舍入到最近的间隔,Claude 会告诉您它选择了什么。

60 

61### 让 Claude 选择间隔

62 

63当您省略间隔时,Claude 会动态选择一个,而不是在固定 cron 计划上运行。在每次迭代后,它会根据观察到的情况选择一个一分钟到一小时之间的延迟:在构建完成或 PR 活跃时等待较短时间,当没有待处理项时等待较长时间。选择的延迟和原因会在每次迭代结束时打印。

64 

65下面的示例检查 CI 和审查评论,Claude 在 PR 变得安静后在迭代之间等待更长时间:

66 

67```text theme={null}

68/loop check whether CI passed and address any review comments

69```

70 

71当您要求动态 `/loop` 计划时,Claude 可能会直接使用 [Monitor tool](/zh-CN/tools-reference#monitor-tool)。Monitor 运行后台脚本并流式传输每个输出行,这完全避免了轮询,通常比在间隔上重新运行提示词更节省令牌且响应更快。

72 

73动态计划的循环出现在您的[计划任务列表](#manage-scheduled-tasks)中,就像任何其他任务一样,所以您可以以相同的方式列出或取消它。[抖动规则](#jitter)不适用于它,但[七天过期](#seven-day-expiry)适用:循环在您启动它七天后自动结束。

74 

75<Note>

76 在 Bedrock、Vertex AI 和 Microsoft Foundry 上,没有间隔的提示词在固定的 10 分钟计划上运行。

77</Note>

78 

79### 运行内置维护提示词

80 

81当您省略提示词时,Claude 使用内置维护提示词而不是您提供的提示词。在每次迭代中,它按顺序处理以下内容:

82 

83* 继续对话中的任何未完成工作

84* 照顾当前分支的拉取请求:审查评论、失败的 CI 运行、合并冲突

85* 运行清理通过,例如当没有其他待处理项时的错误搜索或简化

86 

87Claude 不会启动该范围之外的新举措,不可逆的操作(如推送或删除)仅在继续转录已授权的内容时进行。

88 

89```text theme={null}

90/loop

91```

92 

93裸 `/loop` 在[动态选择的间隔](#let-claude-choose-the-interval)上运行此提示词。添加间隔,例如 `/loop 15m`,以在固定计划上运行它。要用您自己的默认值替换内置提示词,请参阅[使用 loop.md 自定义默认提示词](#customize-the-default-prompt-with-loop-md)。

94 

95<Note>

96 在 Bedrock、Vertex AI 和 Microsoft Foundry 上,没有提示词的 `/loop` 打印使用消息而不是启动维护循环。

97</Note>

98 

99### 使用 loop.md 自定义默认提示词

100 

101`loop.md` 文件用您自己的说明替换内置维护提示词。它为裸 `/loop` 定义单个默认提示词,而不是单独计划任务的列表,并且在您在命令行上提供提示词时被忽略。要在其旁边计划其他提示词,请使用 `/loop <prompt>` 或[直接询问 Claude](#manage-scheduled-tasks)。

102 

103Claude 在两个位置查找文件,并使用它找到的第一个。

104 

105| 路径 | 范围 |

106| :------------------ | :------------------ |

107| `.claude/loop.md` | 项目级别。当两个文件都存在时优先。 |

108| `~/.claude/loop.md` | 用户级别。适用于任何未定义自己的项目。 |

109 

110该文件是纯 Markdown,没有必需的结构。像您直接输入 `/loop` 提示词一样编写它。以下示例保持发布分支健康:

111 

112```markdown title=".claude/loop.md" theme={null}

113Check the `release/next` PR. If CI is red, pull the failing job log,

114diagnose, and push a minimal fix. If new review comments have arrived,

115address each one and resolve the thread. If everything is green and

116quiet, say so in one line.

117```

118 

119对 `loop.md` 的编辑在下一次迭代时生效,所以您可以在循环运行时优化说明。当任一位置都不存在 `loop.md` 时,循环回退到内置维护提示词。保持文件简洁:超过 25,000 字节的内容会被截断。

120 

121### 停止循环

122 

123要在 `/loop` 等待下一次迭代时停止它,请按 `Esc`。这会清除待处理的唤醒,所以循环不会再次触发。您通过[直接询问 Claude](#manage-scheduled-tasks)计划的任务不受 `Esc` 影响,会保留在原位,直到您删除它们。

124 

125## 设置一次性提醒

126 

127对于一次性提醒,用自然语言描述您想要的内容,而不是使用 `/loop`。Claude 计划一个单次触发的任务,该任务在运行后删除自己。

128 

129```text theme={null}

130remind me at 3pm to push the release branch

131```

132 

133```text theme={null}

134in 45 minutes, check whether the integration tests passed

135```

136 

137Claude 使用 cron 表达式将触发时间固定到特定的分钟和小时,并确认何时触发。

138 

139## 管理计划任务

140 

141用自然语言要求 Claude 列出或取消任务,或直接引用底层工具。

142 

143```text theme={null}

144what scheduled tasks do I have?

145```

146 

147```text theme={null}

148cancel the deploy check job

149```

150 

151在幕后,Claude 使用这些工具:

152 

153| 工具 | 目的 |

154| :----------- | :------------------------------------------ |

155| `CronCreate` | 计划新任务。接受 5 字段 cron 表达式、要运行的提示词以及是否重复或仅触发一次。 |

156| `CronList` | 列出所有计划任务及其 ID、计划和提示词。 |

157| `CronDelete` | 按 ID 取消任务。 |

158 

159每个计划任务都有一个 8 字符的 ID,您可以将其传递给 `CronDelete`。一个会话最多可以同时保存 50 个计划任务。

160 

161## 计划任务如何运行

162 

163调度程序每秒检查一次到期的任务,并以低优先级将其加入队列。计划的提示词在您的回合之间触发,而不是在 Claude 正在响应时。如果 Claude 在任务到期时忙碌,提示词会等到当前回合结束。

164 

165所有时间都在您的本地时区中解释。像 `0 9 * * *` 这样的 cron 表达式意味着 9am 在您运行 Claude Code 的任何地方,而不是 UTC。

166 

167### 抖动

168 

169为了避免每个会话在同一个挂钟时刻击中 API,调度程序会向触发时间添加一个小的确定性偏移:

170 

171* 重复任务最多晚触发其周期的 10%,上限为 15 分钟。每小时的作业可能在 `:00` 到 `:06` 之间的任何时间触发。

172* 为小时顶部或底部计划的一次性任务最多提前 90 秒触发。

173 

174偏移是从任务 ID 派生的,所以相同的任务总是获得相同的偏移。如果精确的时间很重要,选择不是 `:00` 或 `:30` 的分钟,例如 `3 9 * * *` 而不是 `0 9 * * *`,一次性抖动将不适用。

175 

176### 七天过期

177 

178重复任务在创建后 7 天自动过期。任务最后触发一次,然后删除自己。这限制了被遗忘的循环可以运行多长时间。如果您需要重复任务持续更长时间,请在过期前取消并重新创建它,或使用 [Routines](/zh-CN/routines) 或 [Desktop 计划任务](/zh-CN/desktop-scheduled-tasks) 进行持久调度。

179 

180## Cron 表达式参考

181 

182`CronCreate` 接受标准 5 字段 cron 表达式:`minute hour day-of-month month day-of-week`。所有字段都支持通配符 (`*`)、单个值 (`5`)、步长 (`*/15`)、范围 (`1-5`) 和逗号分隔的列表 (`1,15,30`)。

183 

184| 示例 | 含义 |

185| :------------- | :------------------ |

186| `*/5 * * * *` | 每 5 分钟 |

187| `0 * * * *` | 每小时整点 |

188| `7 * * * *` | 每小时的第 7 分钟 |

189| `0 9 * * *` | 每天本地时间 9am |

190| `0 9 * * 1-5` | 工作日本地时间 9am |

191| `30 14 15 3 *` | 3 月 15 日本地时间下午 2:30 |

192 

193星期几使用 `0` 或 `7` 表示星期日,`6` 表示星期六。不支持扩展语法如 `L`、`W`、`?` 和名称别名如 `MON` 或 `JAN`。

194 

195当月份日期和星期几都受到限制时,如果任一字段匹配,日期就匹配。这遵循标准的 vixie-cron 语义。

196 

197## 禁用计划任务

198 

199在您的环境中设置 `CLAUDE_CODE_DISABLE_CRON=1` 以完全禁用调度程序。cron 工具和 `/loop` 变得不可用,任何已计划的任务都停止触发。有关禁用标志的完整列表,请参阅[环境变量](/zh-CN/env-vars)。

200 

201## 限制

202 

203会话范围的调度有固有的限制:

204 

205* 任务仅在 Claude Code 运行且空闲时触发。关闭终端或让会话退出会停止它们触发。

206* 没有错过触发的追赶。如果任务的计划时间在 Claude 忙于长时间运行的请求时经过,它会在 Claude 变为空闲时触发一次,而不是每个错过的间隔触发一次。

207* 启动新对话会清除所有会话范围的任务。使用 `claude --resume` 或 `claude --continue` 恢复会恢复尚未过期的任务:创建后七天内的重复任务,以及计划时间尚未到达的一次性任务。后台 Bash 和监视器任务在恢复时永远不会被恢复。

208 

209对于需要无人值守运行的 cron 驱动自动化:

210 

211* [Routines](/zh-CN/routines):在 Anthropic 管理的基础设施上按计划运行、通过 API 调用或在 GitHub 事件上运行

212* [GitHub Actions](/zh-CN/github-actions):在 CI 中使用 `schedule` 触发器

213* [Desktop 计划任务](/zh-CN/desktop-scheduled-tasks):在您的机器上本地运行

security.md +141 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 安全性

6 

7> 了解 Claude Code 的安全防护措施和安全使用的最佳实践。

8 

9## 我们如何处理安全性

10 

11### 安全基础

12 

13您的代码安全至关重要。Claude Code 以安全为核心构建,按照 Anthropic 的全面安全计划开发。在 [Anthropic Trust Center](https://trust.anthropic.com) 了解更多信息并访问资源(SOC 2 Type 2 报告、ISO 27001 证书等)。

14 

15### 基于权限的架构

16 

17Claude Code 默认使用严格的只读权限。当需要额外操作时(编辑文件、运行测试、执行命令),Claude Code 会请求明确的权限。用户可以控制是否批准一次性操作或自动允许操作。

18 

19我们设计 Claude Code 是为了透明和安全。例如,我们要求在执行 bash 命令前获得批准,让您拥有直接控制权。这种方法使用户和组织能够直接配置权限。

20 

21有关详细的权限配置,请参阅 [Permissions](/zh-CN/permissions)。

22 

23### 内置保护

24 

25为了降低代理系统中的风险:

26 

27* **沙箱化 bash 工具**:使用文件系统和网络隔离的 [Sandbox](/zh-CN/sandboxing) bash 命令,减少权限提示同时保持安全性。使用 `/sandbox` 启用以定义 Claude Code 可以自主工作的边界

28* **写入访问限制**:Claude Code 只能写入启动它的文件夹及其子文件夹——它不能在没有明确权限的情况下修改父目录中的文件。虽然 Claude Code 可以读取工作目录外的文件(对于访问系统库和依赖项很有用),但写入操作严格限制在项目范围内,创建了清晰的安全边界

29* **提示疲劳缓解**:支持按用户、按代码库或按组织的白名单常用安全命令

30* **Accept Edits 模式**:批量接受多个编辑,同时为具有副作用的命令保持权限提示

31 

32### 用户责任

33 

34Claude Code 只拥有您授予它的权限。您负责在批准前审查建议的代码和命令的安全性。

35 

36## 防止提示注入

37 

38提示注入是一种攻击者试图通过插入恶意文本来覆盖或操纵 AI 助手指令的技术。Claude Code 包括针对这些攻击的多项防护措施:

39 

40### 核心保护

41 

42* **权限系统**:敏感操作需要明确批准

43* **上下文感知分析**:通过分析完整请求来检测潜在有害指令

44* **输入清理**:通过处理用户输入来防止命令注入

45* **命令黑名单**:默认阻止从网络获取任意内容的风险命令,如 `curl` 和 `wget`。显式允许时,请注意 [权限模式限制](/zh-CN/permissions#tool-specific-permission-rules)

46 

47### 隐私保护

48 

49我们实施了多项保护措施来保护您的数据,包括:

50 

51* 敏感信息的有限保留期(请参阅 [Privacy Center](https://privacy.anthropic.com/en/articles/10023548-how-long-do-you-store-my-data) 了解更多)

52* 对用户会话数据的受限访问

53* 用户对数据训练偏好的控制。消费者用户可以随时更改其 [隐私设置](https://claude.ai/settings/privacy)。

54 

55有关完整详情,请查看我们的 [Commercial Terms of Service](https://www.anthropic.com/legal/commercial-terms)(适用于 Team、Enterprise 和 API 用户)或 [Consumer Terms](https://www.anthropic.com/legal/consumer-terms)(适用于 Free、Pro 和 Max 用户)以及 [Privacy Policy](https://www.anthropic.com/legal/privacy)。

56 

57### 其他保护措施

58 

59* **网络请求批准**:进行网络请求的工具默认需要用户批准

60* **隔离的上下文窗口**:Web fetch 使用单独的上下文窗口以避免注入潜在恶意提示

61* **信任验证**:首次代码库运行和新 MCP servers 需要信任验证

62 * 注意:使用 `-p` 标志以非交互方式运行时,信任验证被禁用

63* **命令注入检测**:即使之前已白名单,可疑的 bash 命令也需要手动批准

64* **故障关闭匹配**:不匹配的命令默认需要手动批准

65* **自然语言描述**:复杂的 bash 命令包括用户理解的说明

66* **安全凭证存储**:API 密钥和令牌已加密。请参阅 [Credential Management](/zh-CN/authentication#credential-management)

67 

68<Warning>

69 **Windows WebDAV 安全风险**:在 Windows 上运行 Claude Code 时,我们建议不要启用 WebDAV 或允许 Claude Code 访问可能包含 WebDAV 子目录的路径,如 `\\*`。[WebDAV 已被 Microsoft 弃用](https://learn.microsoft.com/en-us/windows/whats-new/deprecated-features#:~:text=The%20Webclient%20\(WebDAV\)%20service%20is%20deprecated),原因是安全风险。启用 WebDAV 可能允许 Claude Code 触发对远程主机的网络请求,绕过权限系统。

70</Warning>

71 

72**处理不受信任内容的最佳实践**:

73 

741. 在批准前审查建议的命令

752. 避免直接将不受信任的内容通过管道传递给 Claude

763. 验证对关键文件的建议更改

774. 使用虚拟机 (VM) 运行脚本并进行工具调用,特别是在与外部 Web 服务交互时

785. 使用 `/feedback` 报告可疑行为

79 

80<Warning>

81 虽然这些保护措施大大降低了风险,但没有系统完全免疫所有攻击。在使用任何 AI 工具时,始终保持良好的安全实践。

82</Warning>

83 

84## MCP 安全性

85 

86Claude Code 允许用户配置 Model Context Protocol (MCP) servers。允许的 MCP servers 列表在您的源代码中配置,作为 Claude Code 设置的一部分,工程师将其检入源代码控制。

87 

88我们鼓励编写您自己的 MCP servers 或使用来自您信任的提供商的 MCP servers。您能够为 MCP servers 配置 Claude Code 权限。Anthropic 不管理或审计任何 MCP servers。

89 

90## IDE 安全性

91 

92有关在 IDE 中运行 Claude Code 的更多信息,请参阅 [VS Code security and privacy](/zh-CN/vs-code#security-and-privacy)。

93 

94## 云执行安全性

95 

96使用 [Claude Code on the web](/zh-CN/claude-code-on-the-web) 时,会实施额外的安全控制:

97 

98* **隔离的虚拟机**:每个云会话在隔离的、由 Anthropic 管理的 VM 中运行

99* **网络访问控制**:网络访问默认受限,可以配置为禁用或仅允许特定域

100* **凭证保护**:身份验证通过安全代理处理,该代理在沙箱内使用作用域凭证,然后转换为您的实际 GitHub 身份验证令牌

101* **分支限制**:Git push 操作限制在当前工作分支

102* **审计日志**:云环境中的所有操作都被记录以用于合规和审计目的

103* **自动清理**:会话完成后,云环境会自动终止

104 

105有关云执行的更多详情,请参阅 [Claude Code on the web](/zh-CN/claude-code-on-the-web)。

106 

107[Remote Control](/zh-CN/remote-control) 会话的工作方式不同:Web 界面连接到在您本地机器上运行的 Claude Code 进程。所有代码执行和文件访问都保持本地,任何本地 Claude Code 会话期间流动的相同数据通过 TLS 上的 Anthropic API 传输。不涉及云 VM 或沙箱。连接使用多个短期的、范围狭窄的凭证,每个凭证限制于特定目的并独立过期,以限制任何单个受损凭证的影响范围。

108 

109## 安全最佳实践

110 

111### 处理敏感代码

112 

113* 在批准前审查所有建议的更改

114* 为敏感存储库使用项目特定的权限设置

115* 考虑使用 [dev containers](/zh-CN/devcontainer) 以获得额外隔离

116* 使用 `/permissions` 定期审计您的权限设置

117 

118### 团队安全

119 

120* 使用 [managed settings](/zh-CN/settings#settings-files) 来强制执行组织标准

121* 通过版本控制共享批准的权限配置

122* 培训团队成员了解安全最佳实践

123* 通过 [OpenTelemetry metrics](/zh-CN/monitoring-usage) 监控 Claude Code 使用情况

124* 使用 [`ConfigChange` hooks](/zh-CN/hooks#configchange) 审计或阻止会话期间的设置更改

125 

126### 报告安全问题

127 

128如果您在 Claude Code 中发现安全漏洞:

129 

1301. 不要公开披露

1312. 通过我们的 [HackerOne program](https://hackerone.com/4f1f16ba-10d3-4d09-9ecc-c721aad90f24/embedded_submissions/new) 报告

1323. 包括详细的复现步骤

1334. 在公开披露前给我们时间来解决问题

134 

135## 相关资源

136 

137* [Sandboxing](/zh-CN/sandboxing) - bash 命令的文件系统和网络隔离

138* [Permissions](/zh-CN/permissions) - 配置权限和访问控制

139* [Monitoring usage](/zh-CN/monitoring-usage) - 跟踪和审计 Claude Code 活动

140* [Development containers](/zh-CN/devcontainer) - 安全、隔离的环境

141* [Anthropic Trust Center](https://trust.anthropic.com) - 安全认证和合规

server-managed-settings.md +224 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 配置服务器管理的设置

6 

7> 通过 Claude.ai 上基于网络的界面为您的组织集中配置 Claude Code,无需设备管理基础设施。

8 

9服务器管理的设置允许管理员通过 Claude.ai 上基于网络的界面集中配置 Claude Code。Claude Code 客户端在用户使用其组织凭证进行身份验证时自动接收这些设置。

10 

11这种方法专为没有设备管理基础设施的组织或需要为非托管设备上的用户管理设置的组织而设计。

12 

13<Note>

14 服务器管理的设置可供 [Claude for Teams](https://claude.com/pricing?utm_source=claude_code\&utm_medium=docs\&utm_content=server_settings_teams#team-&-enterprise) 和 [Claude for Enterprise](https://anthropic.com/contact-sales?utm_source=claude_code\&utm_medium=docs\&utm_content=server_settings_enterprise) 客户使用。

15</Note>

16 

17## 要求

18 

19要使用服务器管理的设置,您需要:

20 

21* Claude for Teams 或 Claude for Enterprise 计划

22* Claude for Teams 的 Claude Code 版本 2.1.38 或更高版本,或 Claude for Enterprise 的版本 2.1.30 或更高版本

23* 对 `api.anthropic.com` 的网络访问

24 

25## 在服务器管理和端点管理的设置之间选择

26 

27Claude Code 支持两种集中配置方法。服务器管理的设置从 Anthropic 的服务器传递配置。[端点管理的设置](/zh-CN/settings#settings-files)通过本机操作系统策略(macOS 托管首选项、Windows 注册表)或托管设置文件直接部署到设备。

28 

29| 方法 | 最适合 | 安全模型 |

30| :-------------------------------------------- | :-------------------- | :------------------------------- |

31| **服务器管理的设置** | 没有 MDM 的组织,或非托管设备上的用户 | 在身份验证时从 Anthropic 的服务器传递的设置 |

32| **[端点管理的设置](/zh-CN/settings#settings-files)** | 具有 MDM 或端点管理的组织 | 通过 MDM 配置文件、注册表策略或托管设置文件部署到设备的设置 |

33 

34如果您的设备已在 MDM 或端点管理解决方案中注册,端点管理的设置提供更强的安全保证,因为设置文件可以在操作系统级别受到保护,防止用户修改。

35 

36## 配置服务器管理的设置

37 

38<Steps>

39 <Step title="打开管理控制台">

40 在 [Claude.ai](https://claude.ai) 中,导航到 **Admin Settings > Claude Code > Managed settings**。

41 </Step>

42 

43 <Step title="定义您的设置">

44 将您的配置添加为 JSON。支持 [`settings.json` 中可用的所有设置](/zh-CN/settings#available-settings),包括 [hooks](/zh-CN/hooks)、[环境变量](/zh-CN/env-vars) 和[仅限托管的设置](/zh-CN/permissions#managed-only-settings),如 `allowManagedPermissionRulesOnly`。

45 

46 此示例强制执行权限拒绝列表,防止用户绕过权限,并将权限规则限制为在托管设置中定义的规则:

47 

48 ```json theme={null}

49 {

50 "permissions": {

51 "deny": [

52 "Bash(curl *)",

53 "Read(./.env)",

54 "Read(./.env.*)",

55 "Read(./secrets/**)"

56 ],

57 "disableBypassPermissionsMode": "disable"

58 },

59 "allowManagedPermissionRulesOnly": true

60 }

61 ```

62 

63 Hooks 使用与 `settings.json` 中相同的格式。

64 

65 此示例在整个组织中每次文件编辑后运行审计脚本:

66 

67 ```json theme={null}

68 {

69 "hooks": {

70 "PostToolUse": [

71 {

72 "matcher": "Edit|Write",

73 "hooks": [

74 { "type": "command", "command": "/usr/local/bin/audit-edit.sh" }

75 ]

76 }

77 ]

78 }

79 }

80 ```

81 

82 要配置 [auto mode](/zh-CN/permission-modes#eliminate-prompts-with-auto-mode) 分类器,使其了解您的组织信任的存储库、存储桶和域:

83 

84 ```json theme={null}

85 {

86 "autoMode": {

87 "environment": [

88 "Source control: github.example.com/acme-corp and all repos under it",

89 "Trusted cloud buckets: s3://acme-build-artifacts, gs://acme-ml-datasets",

90 "Trusted internal domains: *.corp.example.com"

91 ]

92 }

93 }

94 ```

95 

96 由于 hooks 执行 shell 命令,用户在应用前会看到[安全批准对话框](#security-approval-dialogs)。有关 `autoMode` 条目如何影响分类器阻止的内容以及关于 `allow` 和 `soft_deny` 字段的重要警告,请参阅[配置 auto mode](/zh-CN/auto-mode-config)。

97 </Step>

98 

99 <Step title="保存并部署">

100 保存您的更改。Claude Code 客户端在下次启动或每小时轮询周期时接收更新的设置。

101 </Step>

102</Steps>

103 

104### 验证设置传递

105 

106要确认设置正在被应用,请要求用户重新启动 Claude Code。如果配置包含触发[安全批准对话框](#security-approval-dialogs)的设置,用户会在启动时看到描述托管设置的提示。您还可以通过让用户运行 `/permissions` 来验证托管权限规则是否处于活动状态,以查看其有效的权限规则。

107 

108### 访问控制

109 

110以下角色可以管理服务器管理的设置:

111 

112* **主要所有者**

113* **所有者**

114 

115限制对受信任人员的访问,因为设置更改适用于组织中的所有用户。

116 

117### 仅限托管的设置

118 

119大多数[设置键](/zh-CN/settings#available-settings)可在任何范围内工作。少数几个键仅从托管设置中读取,当放置在用户或项目设置文件中时无效。有关完整列表,请参阅[仅限托管的设置](/zh-CN/permissions#managed-only-settings)。任何不在该列表上的设置仍然可以放置在托管设置中,并具有最高优先级。

120 

121### 当前限制

122 

123服务器管理的设置有以下限制:

124 

125* 设置统一应用于组织中的所有用户。尚不支持按组配置。

126* [MCP 服务器配置](/zh-CN/mcp#managed-mcp-configuration)无法通过服务器管理的设置分发。

127 

128## 设置传递

129 

130### 设置优先级

131 

132服务器管理的设置和[端点管理的设置](/zh-CN/settings#settings-files)都占据 Claude Code [设置层次结构](/zh-CN/settings#settings-precedence)中的最高层。没有其他设置级别可以覆盖它们,包括命令行参数。

133 

134在托管层内,首先传递非空配置的源获胜。首先检查服务器管理的设置,然后检查端点管理的设置。源不合并:如果服务器管理的设置传递任何键,端点管理的设置将被完全忽略。如果服务器管理的设置不传递任何内容,端点管理的设置将应用。

135 

136如果您清除管理控制台中的服务器管理配置,意图回退到端点管理的 plist 或注册表策略,请注意[缓存的设置](#fetch-and-caching-behavior)在客户端机器上持久化,直到下次成功获取。运行 `/status` 查看哪个托管源处于活动状态。

137 

138### 获取和缓存行为

139 

140Claude Code 在启动时从 Anthropic 的服务器获取设置,并在活动会话期间每小时轮询一次更新。

141 

142**首次启动而无缓存的设置:**

143 

144* Claude Code 异步获取设置

145* 如果获取失败,Claude Code 继续运行而不使用托管设置

146* 在设置加载之前有一个简短的窗口,其中限制尚未被强制执行

147 

148**后续启动且有缓存的设置:**

149 

150* 缓存的设置在启动时立即应用

151* Claude Code 在后台获取新鲜设置

152* 缓存的设置通过网络故障持久化

153 

154Claude Code 自动应用设置更新而无需重新启动,除了高级设置(如 OpenTelemetry 配置)需要完全重新启动才能生效。

155 

156### 强制执行故障关闭启动

157 

158默认情况下,如果远程设置获取在启动时失败,CLI 继续运行而不使用托管设置。对于这个简短的未强制执行窗口不可接受的环境,在您的托管设置中设置 `forceRemoteSettingsRefresh: true`。

159 

160当此设置处于活动状态时,CLI 在启动时阻止,直到远程设置被新鲜获取。如果获取失败,CLI 退出而不是继续运行而不使用策略。此设置自我延续:一旦从服务器传递,它也会在本地缓存,以便后续启动即使在新会话的首次成功获取之前也强制执行相同的行为。

161 

162要启用此功能,请将键添加到您的托管设置配置中:

163 

164```json theme={null}

165{

166 "forceRemoteSettingsRefresh": true

167}

168```

169 

170在启用此设置之前,请确保您的网络策略允许连接到 `api.anthropic.com`。如果该端点无法访问,CLI 在启动时退出,用户无法启动 Claude Code。

171 

172### 安全批准对话框

173 

174某些可能带来安全风险的设置在应用前需要明确的用户批准:

175 

176* **Shell 命令设置**:执行 shell 命令的设置

177* **自定义环境变量**:不在已知安全允许列表中的变量

178* **Hook 配置**:任何 hook 定义

179 

180当这些设置存在时,用户会看到一个安全对话框,解释正在配置的内容。用户必须批准才能继续。如果用户拒绝设置,Claude Code 会退出。

181 

182<Note>

183 在使用 `-p` 标志的非交互模式下,Claude Code 跳过安全对话框并在没有用户批准的情况下应用设置。

184</Note>

185 

186## 平台可用性

187 

188服务器管理的设置需要直接连接到 `api.anthropic.com`,在使用第三方模型提供商时不可用:

189 

190* Amazon Bedrock

191* Google Vertex AI

192* Microsoft Foundry

193* 通过 `ANTHROPIC_BASE_URL` 或 [LLM gateways](/zh-CN/llm-gateway) 的自定义 API 端点

194 

195## 审计日志

196 

197设置更改的审计日志事件可通过合规 API 或审计日志导出获得。请联系您的 Anthropic 账户团队以获取访问权限。

198 

199审计事件包括执行的操作类型、执行操作的账户和设备,以及对先前值和新值的引用。

200 

201## 安全考虑

202 

203服务器管理的设置提供集中的策略强制执行,但它们作为客户端控制运行。在非托管设备上,具有管理员或 sudo 访问权限的用户可以修改 Claude Code 二进制文件、文件系统或网络配置。

204 

205| 场景 | 行为 |

206| :------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------- |

207| 用户编辑缓存的设置文件 | 篡改的文件在启动时应用,但正确的设置在下次服务器获取时恢复 |

208| 用户删除缓存的设置文件 | 首次启动行为发生:设置异步获取,有一个简短的未强制执行的窗口 |

209| API 不可用 | 如果可用,缓存的设置应用,否则托管设置在下次成功获取前不被强制执行。使用 `forceRemoteSettingsRefresh: true` 时,CLI 退出而不是继续 |

210| 用户使用不同的组织进行身份验证 | 不为托管组织外的账户传递设置 |

211| 用户配置[第三方模型提供商](#platform-availability) | 服务器管理的设置被绕过。这包括设置 `CLAUDE_CODE_USE_BEDROCK`、`CLAUDE_CODE_USE_MANTLE`、`CLAUDE_CODE_USE_VERTEX`、`CLAUDE_CODE_USE_FOUNDRY` 或非默认的 `ANTHROPIC_BASE_URL` |

212 

213要检测运行时配置更改,请使用 [`ConfigChange` hooks](/zh-CN/hooks#configchange) 来记录修改或在未授权的更改生效前阻止它们。

214 

215为了获得更强的强制执行保证,请在已在 MDM 解决方案中注册的设备上使用[端点管理的设置](/zh-CN/settings#settings-files)。

216 

217## 另请参阅

218 

219用于管理 Claude Code 配置的相关页面:

220 

221* [Settings](/zh-CN/settings):完整的配置参考,包括所有可用的设置

222* [Endpoint-managed settings](/zh-CN/settings#settings-files):由 IT 部门部署到设备的托管设置

223* [Authentication](/zh-CN/authentication):设置用户对 Claude Code 的访问

224* [Security](/zh-CN/security):安全保障和最佳实践

settings.md +914 −0 created

Details

1> ## Documentation Index

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

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

4 

5# Claude Code 设置

6 

7> 使用全局和项目级设置以及环境变量配置 Claude Code。

8 

9Claude Code 提供多种设置来配置其行为以满足您的需求。您可以在使用交互式 REPL 时运行 `/config` 命令来配置 Claude Code,这会打开一个选项卡式设置界面,您可以在其中查看状态信息并修改配置选项。

10 

11## 配置作用域

12 

13Claude Code 使用**作用域系统**来确定配置应用的位置以及与谁共享。了解作用域可以帮助您决定如何为个人使用、团队协作或企业部署配置 Claude Code。

14 

15### 可用作用域

16 

17| 作用域 | 位置 | 影响范围 | 与团队共享? |

18| :---------- | :----------------------------------------------- | :---------- | :------------ |

19| **Managed** | 服务器管理的设置、plist / 注册表或系统级 `managed-settings.json` | 机器上的所有用户 | 是(由 IT 部署) |

20| **User** | `~/.claude/` 目录 | 您,跨所有项目 | 否 |

21| **Project** | 存储库中的 `.claude/` | 此存储库上的所有协作者 | 是(提交到 git) |

22| **Local** | `.claude/settings.local.json` | 您,仅在此存储库中 | 否(gitignored) |

23 

24### 何时使用每个作用域

25 

26**Managed 作用域**用于:

27 

28* 必须在整个组织范围内强制执行的安全策略

29* 无法被覆盖的合规要求

30* 由 IT/DevOps 部署的标准化配置

31 

32**User 作用域**最适合:

33 

34* 您想在任何地方使用的个人偏好设置(主题、编辑器设置)

35* 您在所有项目中使用的工具和插件

36* API 密钥和身份验证(安全存储)

37 

38**Project 作用域**最适合:

39 

40* 团队共享的设置(权限、hooks、MCP servers)

41* 整个团队应该拥有的插件

42* 跨协作者标准化工具

43 

44**Local 作用域**最适合:

45 

46* 特定项目的个人覆盖

47* 在与团队共享之前测试配置

48* 对其他人不适用的特定于机器的设置

49 

50### 作用域如何相互作用

51 

52当在多个作用域中配置相同的设置时,更具体的作用域优先:

53 

541. **Managed**(最高)- 无法被任何内容覆盖

552. **命令行参数** - 临时会话覆盖

563. **Local** - 覆盖项目和用户设置

574. **Project** - 覆盖用户设置

585. **User**(最低)- 当没有其他内容指定设置时应用

59 

60例如,如果在用户设置中允许某个权限,但在项目设置中拒绝,则项目设置优先,权限被阻止。

61 

62### 哪些功能使用作用域

63 

64作用域适用于许多 Claude Code 功能:

65 

66| 功能 | User 位置 | Project 位置 | Local 位置 |

67| :-------------- | :------------------------ | :-------------------------------- | :---------------------------- |

68| **Settings** | `~/.claude/settings.json` | `.claude/settings.json` | `.claude/settings.local.json` |

69| **Subagents** | `~/.claude/agents/` | `.claude/agents/` | 无 |

70| **MCP servers** | `~/.claude.json` | `.mcp.json` | `~/.claude.json`(每个项目) |

71| **Plugins** | `~/.claude/settings.json` | `.claude/settings.json` | `.claude/settings.local.json` |

72| **CLAUDE.md** | `~/.claude/CLAUDE.md` | `CLAUDE.md` 或 `.claude/CLAUDE.md` | `CLAUDE.local.md` |

73 

74***

75 

76## 设置文件

77 

78`settings.json` 文件是通过分层设置配置 Claude Code 的官方机制:

79 

80* **用户设置**在 `~/.claude/settings.json` 中定义,适用于所有项目。

81* **项目设置**保存在您的项目目录中:

82 * `.claude/settings.json` 用于检入源代码管理并与您的团队共享的设置

83 * `.claude/settings.local.json` 用于未检入的设置,适用于个人偏好和实验。Claude Code 将在创建 `.claude/settings.local.json` 时配置 git 以忽略它。

84* **Managed 设置**:对于需要集中控制的组织,Claude Code 支持多种 managed 设置的交付机制。所有机制都使用相同的 JSON 格式,无法被用户或项目设置覆盖:

85 

86 * **服务器管理的设置**:通过 Claude.ai 管理员控制台从 Anthropic 的服务器交付。请参阅[服务器管理的设置](/zh-CN/server-managed-settings)。

87 * **MDM/OS 级别策略**:通过 macOS 和 Windows 上的本机设备管理交付:

88 * macOS:`com.anthropic.claudecode` managed preferences 域。plist 的顶级键镜像 `managed-settings.json`,嵌套设置为字典,数组为 plist 数组。通过 Jamf、Iru (Kandji) 或类似 MDM 工具中的配置文件部署。

89 * Windows:`HKLM\SOFTWARE\Policies\ClaudeCode` 注册表项,带有包含 JSON 的 `Settings` 值(REG\_SZ 或 REG\_EXPAND\_SZ)(通过组策略或 Intune 部署)

90 * Windows(用户级):`HKCU\SOFTWARE\Policies\ClaudeCode`(最低策略优先级,仅在不存在管理员级源时使用)

91 * **基于文件**:`managed-settings.json` 和 `managed-mcp.json` 部署到系统目录:

92 

93 * macOS:`/Library/Application Support/ClaudeCode/`

94 * Linux 和 WSL:`/etc/claude-code/`

95 * Windows:`C:\Program Files\ClaudeCode\`

96 

97 <Warning>

98 自 v2.1.75 起,不再支持旧的 Windows 路径 `C:\ProgramData\ClaudeCode\managed-settings.json`。已将设置部署到该位置的管理员必须将文件迁移到 `C:\Program Files\ClaudeCode\managed-settings.json`。

99 </Warning>

100 

101 基于文件的 managed 设置还支持在与 `managed-settings.json` 相同的系统目录中的 `managed-settings.d/` 放入目录。这让独立的团队可以部署独立的策略片段,而无需协调对单个文件的编辑。

102 

103 遵循 systemd 约定,`managed-settings.json` 首先作为基础合并,然后放入目录中的所有 `*.json` 文件按字母顺序排序并合并在顶部。对于标量值,后面的文件覆盖前面的文件;数组被连接和去重;对象被深度合并。以 `.` 开头的隐藏文件被忽略。

104 

105 使用数字前缀来控制合并顺序,例如 `10-telemetry.json` 和 `20-security.json`。

106 

107 请参阅 [managed 设置](/zh-CN/permissions#managed-only-settings) 和 [Managed MCP 配置](/zh-CN/mcp#managed-mcp-configuration) 了解详情。

108 

109 此[存储库](https://github.com/anthropics/claude-code/tree/main/examples/mdm)包含 Jamf、Iru (Kandji)、Intune 和组策略的启动部署模板。使用这些作为起点并根据您的需求进行调整。

110 

111 <Note>

112 Managed 部署还可以使用 `strictKnownMarketplaces` 限制**插件市场添加**。有关更多信息,请参阅 [Managed 市场限制](/zh-CN/plugin-marketplaces#managed-marketplace-restrictions)。

113 </Note>

114* **其他配置**存储在 `~/.claude.json` 中。此文件包含您的 OAuth 会话、[MCP server](/zh-CN/mcp) 配置(用于用户和本地作用域)、每个项目的状态(允许的工具、信任设置)和各种缓存。项目作用域的 MCP servers 单独存储在 `.mcp.json` 中。

115 

116<Note>

117 Claude Code 自动创建配置文件的时间戳备份,并保留最近五个备份以防止数据丢失。

118</Note>

119 

120```JSON Example settings.json theme={null}

121{

122 "$schema": "https://json.schemastore.org/claude-code-settings.json",

123 "permissions": {

124 "allow": [

125 "Bash(npm run lint)",

126 "Bash(npm run test *)",

127 "Read(~/.zshrc)"

128 ],

129 "deny": [

130 "Bash(curl *)",

131 "Read(./.env)",

132 "Read(./.env.*)",

133 "Read(./secrets/**)"

134 ]

135 },

136 "env": {

137 "CLAUDE_CODE_ENABLE_TELEMETRY": "1",

138 "OTEL_METRICS_EXPORTER": "otlp"

139 },

140 "companyAnnouncements": [

141 "Welcome to Acme Corp! Review our code guidelines at docs.acme.com",

142 "Reminder: Code reviews required for all PRs",

143 "New security policy in effect"

144 ]

145}

146```

147 

148上面示例中的 `$schema` 行指向 Claude Code 设置的[官方 JSON 架构](https://json.schemastore.org/claude-code-settings.json)。将其添加到您的 `settings.json` 可在 VS Code、Cursor 和任何其他支持 JSON 架构验证的编辑器中启用自动完成和内联验证。

149 

150已发布的架构会定期更新,可能不包括最近 CLI 版本中添加的设置,因此最近记录的字段上的验证警告不一定意味着您的配置无效。

151 

152### 可用设置

153 

154`settings.json` 支持多个选项:

155 

156| 键 | 描述 | 示例 |

157| :-------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------- |

158| `agent` | 将主线程作为命名 subagent 运行。应用该 subagent 的系统提示、工具限制和模型。请参阅[显式调用 subagents](/zh-CN/sub-agents#invoke-subagents-explicitly) | `"code-reviewer"` |

159| `allowedChannelPlugins` | (仅 Managed 设置)可能推送消息的频道插件的允许列表。设置后替换默认 Anthropic 允许列表。未定义 = 回退到默认值,空数组 = 阻止所有频道插件。需要 `channelsEnabled: true`。请参阅[限制哪些频道插件可以运行](/zh-CN/channels#restrict-which-channel-plugins-can-run) | `[{ "marketplace": "claude-plugins-official", "plugin": "telegram" }]` |

160| `allowedHttpHookUrls` | HTTP hooks 可能针对的 URL 模式的允许列表。支持 `*` 作为通配符。设置后,具有不匹配 URL 的 hooks 被阻止。未定义 = 无限制,空数组 = 阻止所有 HTTP hooks。数组跨设置源合并。请参阅 [Hook 配置](#hook-configuration) | `["https://hooks.example.com/*"]` |

161| `allowedMcpServers` | 在 managed-settings.json 中设置时,用户可以配置的 MCP servers 的允许列表。未定义 = 无限制,空数组 = 锁定。适用于所有作用域。拒绝列表优先。请参阅 [Managed MCP 配置](/zh-CN/mcp#managed-mcp-configuration) | `[{ "serverName": "github" }]` |

162| `allowManagedHooksOnly` | (仅 Managed 设置)仅加载 managed hooks、SDK hooks 和在 managed 设置 `enabledPlugins` 中强制启用的插件中的 hooks。用户、项目和所有其他插件 hooks 被阻止。请参阅 [Hook 配置](#hook-configuration) | `true` |

163| `allowManagedMcpServersOnly` | (仅 Managed 设置)仅尊重来自 managed 设置的 `allowedMcpServers`。`deniedMcpServers` 仍从所有源合并。用户仍可以添加 MCP servers,但仅应用管理员定义的允许列表。请参阅 [Managed MCP 配置](/zh-CN/mcp#managed-mcp-configuration) | `true` |

164| `allowManagedPermissionRulesOnly` | (仅 Managed 设置)防止用户和项目设置定义 `allow`、`ask` 或 `deny` 权限规则。仅应用 managed 设置中的规则。请参阅 [Managed 专用设置](/zh-CN/permissions#managed-only-settings) | `true` |

165| `alwaysThinkingEnabled` | 为所有会话默认启用[扩展思考](/zh-CN/model-config#extended-thinking)。通常通过 `/config` 命令而不是直接编辑来配置 | `true` |

166| `apiKeyHelper` | 自定义脚本,在 `/bin/sh` 中执行,以生成身份验证值。此值将作为 `X-Api-Key` 和 `Authorization: Bearer` 标头发送用于模型请求 | `/bin/generate_temp_api_key.sh` |

167| `attribution` | 自定义 git 提交和拉取请求的归属。请参阅[归属设置](#attribution-settings) | `{"commit": "🤖 Generated with Claude Code", "pr": ""}` |

168| `autoMemoryDirectory` | [自动内存](/zh-CN/memory#storage-location)存储的自定义目录。接受绝对路径或 `~/` 前缀的路径。从策略和用户设置以及 `--settings` 标志接受。不从项目或本地设置接受,因为克隆的存储库可能提供任一文件以将内存写入重定向到敏感位置 | `"~/my-memory-dir"` |

169| `autoMode` | 自定义[自动模式](/zh-CN/permission-modes#eliminate-prompts-with-auto-mode)分类器阻止和允许的内容。包含 `environment`、`allow` 和 `soft_deny` 散文规则数组。在数组中包含字面字符串 `"$defaults"` 以在该位置继承内置规则。请参阅[配置自动模式](/zh-CN/auto-mode-config)。不从共享项目设置读取 | `{"soft_deny": ["$defaults", "Never run terraform apply"]}` |

170| `autoScrollEnabled` | 在[全屏渲染](/zh-CN/fullscreen)中,跟随新输出到对话的底部。默认:`true`。在 `/config` 中显示为**自动滚动**。权限提示仍在此关闭时滚动到视图中 | `false` |

171| `autoUpdatesChannel` | 遵循更新的发布渠道。使用 `"stable"` 获取通常约一周前的版本并跳过有主要回归的版本,或使用 `"latest"`(默认)获取最新版本 | `"stable"` |

172| `availableModels` | 限制用户可以通过 `/model`、`--model` 或 `ANTHROPIC_MODEL` 选择的模型。不影响默认选项。请参阅[限制模型选择](/zh-CN/model-config#restrict-model-selection) | `["sonnet", "haiku"]` |

173| `awaySummaryEnabled` | 在您离开终端几分钟后返回时显示单行会话回顾。设置为 `false` 或在 `/config` 中关闭会话回顾以禁用。与 [`CLAUDE_CODE_ENABLE_AWAY_SUMMARY`](/zh-CN/env-vars) 相同 | `true` |

174| `awsAuthRefresh` | 修改 `.aws` 目录的自定义脚本(请参阅[高级凭证配置](/zh-CN/amazon-bedrock#advanced-credential-configuration)) | `aws sso login --profile myprofile` |

175| `awsCredentialExport` | 输出包含 AWS 凭证的 JSON 的自定义脚本(请参阅[高级凭证配置](/zh-CN/amazon-bedrock#advanced-credential-configuration)) | `/bin/generate_aws_grant.sh` |

176| `blockedMarketplaces` | (仅 Managed 设置)市场源的阻止列表。在市场添加和插件安装、更新、刷新和自动更新时强制执行,因此在设置策略之前添加的市场无法用于获取插件。被阻止的源在下载前被检查,因此它们永远不会接触文件系统。请参阅 [Managed 市场限制](/zh-CN/plugin-marketplaces#managed-marketplace-restrictions) | `[{ "source": "github", "repo": "untrusted/plugins" }]` |

177| `channelsEnabled` | (仅 Managed 设置)为 Team 和 Enterprise 用户允许 [channels](/zh-CN/channels)。未设置或 `false` 会阻止频道消息传递,无论用户传递什么给 `--channels` | `true` |

178| `cleanupPeriodDays` | 非活跃时间超过此期间的会话在启动时被删除(默认:30 天,最少 1 天)。设置为 `0` 会被拒绝并显示验证错误。也控制[孤立 subagent worktrees](/zh-CN/worktrees#clean-up-worktrees) 在启动时自动删除的年龄截止。要完全禁用记录写入,请设置 [`CLAUDE_CODE_SKIP_PROMPT_HISTORY`](/zh-CN/env-vars) 环境变量,或在非交互模式(`-p`)中使用 `--no-session-persistence` 标志或 `persistSession: false` SDK 选项。 | `20` |

179| `companyAnnouncements` | 在启动时显示给用户的公告。如果提供多个公告,它们将随机循环显示。 | `["Welcome to Acme Corp! Review our code guidelines at docs.acme.com"]` |

180| `defaultShell` | 输入框 `!` 命令的默认 shell。接受 `"bash"`(默认)或 `"powershell"`。设置 `"powershell"` 会在 Windows 上通过 PowerShell 路由交互式 `!` 命令。需要 `CLAUDE_CODE_USE_POWERSHELL_TOOL=1`。请参阅 [PowerShell tool](/zh-CN/tools-reference#powershell-tool) | `"powershell"` |

181| `deniedMcpServers` | 在 managed-settings.json 中设置时,明确阻止的 MCP servers 的拒绝列表。适用于所有作用域,包括 managed servers。拒绝列表优先于允许列表。请参阅 [Managed MCP 配置](/zh-CN/mcp#managed-mcp-configuration) | `[{ "serverName": "filesystem" }]` |

182| `disableAllHooks` | 禁用所有 [hooks](/zh-CN/hooks) 和任何自定义[状态行](/zh-CN/statusline) | `true` |

183| `disableAutoMode` | 设置为 `"disable"` 以防止[自动模式](/zh-CN/permission-modes#eliminate-prompts-with-auto-mode)被激活。从 `Shift+Tab` 循环中删除 `auto` 并在启动时拒绝 `--permission-mode auto`。在[managed 设置](/zh-CN/permissions#managed-settings)中最有用,用户无法覆盖它 | `"disable"` |

184| `disableDeepLinkRegistration` | 设置为 `"disable"` 以防止 Claude Code 在启动时向操作系统注册 `claude-cli://` 协议处理程序。[深链接](/zh-CN/deep-links)让外部工具通过预填充的提示打开 Claude Code 会话。在协议处理程序注册受限或单独管理的环境中很有用 | `"disable"` |

185| `disabledMcpjsonServers` | 要拒绝的 `.mcp.json` 文件中特定 MCP servers 的列表 | `["filesystem"]` |

186| `disableSkillShellExecution` | 禁用 [skills](/zh-CN/skills) 和来自用户、项目、插件或额外目录源的自定义命令中的 `` !`...` `` 和 ` ```! ` 块的内联 shell 执行。命令被替换为 `[shell command execution disabled by policy]` 而不是被运行。捆绑和 managed skills 不受影响。在[managed 设置](/zh-CN/permissions#managed-settings)中最有用,用户无法覆盖它 | `true` |

187| `editorMode` | 输入提示的快捷键模式:`"normal"` 或 `"vim"`。默认:`"normal"`。在 `/config` 中显示为**快捷键模式** | `"vim"` |

188| `effortLevel` | 跨会话持久化[努力级别](/zh-CN/model-config#adjust-effort-level)。接受 `"low"`、`"medium"`、`"high"` 或 `"xhigh"`。当您运行 `/effort` 时自动写入,带有这些值之一。请参阅[调整努力级别](/zh-CN/model-config#adjust-effort-level)了解支持的模型 | `"xhigh"` |

189| `enableAllProjectMcpServers` | 自动批准项目 `.mcp.json` 文件中定义的所有 MCP servers | `true` |

190| `enabledMcpjsonServers` | 要批准的 `.mcp.json` 文件中特定 MCP servers 的列表 | `["memory", "github"]` |

191| `env` | 将应用于每个会话的环境变量 | `{"FOO": "bar"}` |

192| `fastModePerSessionOptIn` | 当为 `true` 时,快速模式不会跨会话持久化。每个会话都以快速模式关闭开始,需要用户使用 `/fast` 启用它。用户的快速模式偏好仍被保存。请参阅[需要每个会话的选择加入](/zh-CN/fast-mode#require-per-session-opt-in) | `true` |

193| `feedbackSurveyRate` | 概率(0–1)[会话质量调查](/zh-CN/data-usage#session-quality-surveys)在符合条件时出现。设置为 `0` 以完全抑制。在使用 Bedrock、Vertex 或 Foundry 时很有用,其中默认采样率不适用 | `0.05` |

194| `fileSuggestion` | 为 `@` 文件自动完成配置自定义脚本。请参阅[文件建议设置](#file-suggestion-settings) | `{"type": "command", "command": "~/.claude/file-suggestion.sh"}` |

195| `forceLoginMethod` | 使用 `claudeai` 限制登录到 Claude.ai 账户,`console` 限制登录到 Claude Console(API 使用计费)账户 | `claudeai` |

196| `forceLoginOrgUUID` | 要求登录属于特定组织。接受单个 UUID 字符串(也在登录期间预选该组织)或 UUID 数组,其中任何列出的组织都被接受而无需预选。在 managed 设置中设置时,如果经过身份验证的账户不属于列出的组织,登录失败;空数组失败关闭并使用配置错误消息阻止登录 | `"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"` 或 `["xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy"]` |

197| `forceRemoteSettingsRefresh` | (仅 Managed 设置)阻止 CLI 启动,直到从服务器新鲜获取远程 managed 设置。如果获取失败,CLI 退出而不是继续使用缓存或无设置。未设置时,启动继续而不等待远程设置。请参阅[失败关闭强制执行](/zh-CN/server-managed-settings#enforce-fail-closed-startup) | `true` |

198| `hooks` | 配置自定义命令以在生命周期事件处运行。请参阅 [hooks 文档](/zh-CN/hooks) 了解格式 | 请参阅 [hooks](/zh-CN/hooks) |

199| `httpHookAllowedEnvVars` | HTTP hooks 可能插入到标头中的环境变量名称的允许列表。设置后,每个 hook 的有效 `allowedEnvVars` 是与此列表的交集。未定义 = 无限制。数组跨设置源合并。请参阅 [Hook 配置](#hook-configuration) | `["MY_TOKEN", "HOOK_SECRET"]` |

200| `includeCoAuthoredBy` | **已弃用**:改用 `attribution`。是否在 git 提交和拉取请求中包含 `co-authored-by Claude` 署名(默认:`true`) | `false` |

201| `includeGitInstructions` | 在 Claude 的系统提示中包含内置提交和 PR 工作流说明和 git 状态快照(默认:`true`)。设置为 `false` 以删除这两者,例如在使用您自己的 git 工作流 skills 时。`CLAUDE_CODE_DISABLE_GIT_INSTRUCTIONS` 环境变量在设置时优先于此设置 | `false` |

202| `language` | 配置 Claude 的首选响应语言(例如 `"japanese"`、`"spanish"`、`"french"`)。Claude 将默认以此语言响应。也设置[语音听写](/zh-CN/voice-dictation#change-the-dictation-language)语言 | `"japanese"` |

203| `minimumVersion` | 防止后台自动更新和 `claude update` 安装低于此版本的版本。从 `"latest"` 渠道切换到 `"stable"` 时通过 `/config` 提示您保持在当前版本或允许降级。选择保持设置此值。也在[managed 设置](/zh-CN/permissions#managed-settings)中有用,以固定组织范围的最低版本 | `"2.1.100"` |

204| `model` | 覆盖用于 Claude Code 的默认模型 | `"claude-sonnet-4-6"` |

205| `modelOverrides` | 将 Anthropic 模型 ID 映射到特定于提供商的模型 ID,例如 Bedrock 推理配置文件 ARN。每个模型选择器条目在调用提供商 API 时使用其映射值。请参阅[按版本覆盖模型 ID](/zh-CN/model-config#override-model-ids-per-version) | `{"claude-opus-4-6": "arn:aws:bedrock:..."}` |

206| `otelHeadersHelper` | 生成动态 OpenTelemetry 标头的脚本。在启动时和定期运行(请参阅[动态标头](/zh-CN/monitoring-usage#dynamic-headers)) | `/bin/generate_otel_headers.sh` |

207| `outputStyle` | 配置输出样式以调整系统提示。请参阅[输出样式文档](/zh-CN/output-styles) | `"Explanatory"` |

208| `permissions` | 请参阅下表了解权限的结构。 | |

209| `plansDirectory` | 自定义计划文件的存储位置。路径相对于项目根目录。默认:`~/.claude/plans` | `"./plans"` |

210| `pluginTrustMessage` | (仅 Managed 设置)在安装前显示的插件信任警告中附加的自定义消息。使用此添加组织特定的上下文,例如确认来自您内部市场的插件已获批准。 | `"All plugins from our marketplace are approved by IT"` |

211| `preferredNotifChannel` | 任务完成和权限提示通知的方法:`"auto"`、`"terminal_bell"`、`"iterm2"`、`"iterm2_with_bell"`、`"kitty"`、`"ghostty"` 或 `"notifications_disabled"`。默认:`"auto"`,在 iTerm2、Ghostty 和 Kitty 中发送桌面通知,在其他终端中不执行任何操作。设置 `"terminal_bell"` 以在任何终端中响铃。在 `/config` 中显示为**通知**。请参阅[获取终端铃声或通知](/zh-CN/terminal-config#get-a-terminal-bell-or-notification) | `"terminal_bell"` |

212| `prefersReducedMotion` | 减少或禁用 UI 动画(微调器、闪烁、闪光效果)以实现可访问性 | `true` |

213| `prUrlTemplate` | PR 徽章的 URL 模板,显示在页脚和工具结果摘要中。替换来自 `gh` 报告的 PR URL 中的 `{host}`、`{owner}`、`{repo}`、`{number}` 和 `{url}`。使用指向内部代码审查工具而不是 `github.com` 的 PR 链接。不影响 Claude 散文中的 `#123` 自动链接 | `"https://reviews.example.com/{owner}/{repo}/pull/{number}"` |

214| `respectGitignore` | 控制 `@` 文件选择器是否尊重 `.gitignore` 模式。当为 `true`(默认)时,匹配 `.gitignore` 模式的文件被排除在建议之外 | `false` |

215| `showClearContextOnPlanAccept` | 在计划接受屏幕上显示"清除上下文"选项。默认为 `false`。设置为 `true` 以恢复该选项 | `true` |

216| `showThinkingSummaries` | 在交互式会话中显示[扩展思考](/zh-CN/model-config#extended-thinking)摘要。未设置或 `false`(交互模式中的默认值)时,思考块由 API 编辑并显示为折叠的存根。编辑仅改变您看到的内容,而不是模型生成的内容:要减少思考支出,[降低预算或禁用思考](/zh-CN/model-config#extended-thinking)。非交互模式(`-p`)和 SDK 调用者无论此设置如何都始终接收摘要 | `true` |

217| `showTurnDuration` | 在响应后显示轮次持续时间消息,例如"Cooked for 1m 6s"。默认:`true`。在 `/config` 中显示为**显示轮次持续时间** | `false` |

218| `skipWebFetchPreflight` | 跳过[WebFetch 域安全检查](/zh-CN/data-usage#webfetch-domain-safety-check),该检查在获取前将每个请求的主机名发送到 `api.anthropic.com`。在阻止到 Anthropic 的流量的环境中设置为 `true`,例如 Bedrock、Vertex AI 或 Foundry 部署,具有限制性出站。跳过时,WebFetch 尝试任何 URL 而不咨询阻止列表 | `true` |

219| `spinnerTipsEnabled` | 在 Claude 工作时在微调器中显示提示。设置为 `false` 以禁用提示(默认:`true`) | `false` |

220| `spinnerTipsOverride` | 使用自定义字符串覆盖微调器提示。`tips`:提示字符串数组。`excludeDefault`:如果为 `true`,仅显示自定义提示;如果为 `false` 或不存在,自定义提示与内置提示合并 | `{ "excludeDefault": true, "tips": ["Use our internal tool X"] }` |

221| `spinnerVerbs` | 自定义在微调器和轮次持续时间消息中显示的操作动词。将 `mode` 设置为 `"replace"` 以仅使用您的动词,或 `"append"` 以将它们添加到默认值 | `{"mode": "append", "verbs": ["Pondering", "Crafting"]}` |

222| `sshConfigs` | 要在[桌面](/zh-CN/desktop#pre-configure-ssh-connections-for-your-team)环境下拉菜单中显示的 SSH 连接。每个条目需要 `id`、`name` 和 `sshHost`;`sshPort`、`sshIdentityFile` 和 `startDirectory` 是可选的。在 managed 设置中设置时,连接对用户是只读的。仅从 managed 和用户设置读取 | `[{"id": "dev-vm", "name": "Dev VM", "sshHost": "user@dev.example.com"}]` |

223| `statusLine` | 配置自定义状态行以显示上下文。请参阅[`statusLine` 文档](/zh-CN/statusline) | `{"type": "command", "command": "~/.claude/statusline.sh"}` |

224| `strictKnownMarketplaces` | (仅 Managed 设置)插件市场源的允许列表。未定义 = 无限制,空数组 = 锁定。在市场添加和插件安装、更新、刷新和自动更新时强制执行,因此在设置策略之前添加的市场无法用于获取插件。请参阅 [Managed 市场限制](/zh-CN/plugin-marketplaces#managed-marketplace-restrictions) | `[{ "source": "github", "repo": "acme-corp/plugins" }]` |

225| `teammateMode` | [agent team](/zh-CN/agent-teams) 队友的显示方式:`auto`(在 tmux 或 iTerm2 中选择分割窗格,否则进程内)、`in-process` 或 `tmux`。请参阅[选择显示模式](/zh-CN/agent-teams#choose-a-display-mode) | `"in-process"` |

226| `terminalProgressBarEnabled` | 在支持的终端中显示终端进度条:ConEmu、Ghostty 1.2.0+ 和 iTerm2 3.6.6+。默认:`true`。在 `/config` 中显示为**终端进度条** | `false` |

227| `tui` | 终端 UI 渲染器。使用 `"fullscreen"` 获取无闪烁的[替代屏幕渲染器](/zh-CN/fullscreen),具有虚拟化滚动条。使用 `"default"` 获取经典主屏幕渲染器。通过 `/tui` 设置 | `"fullscreen"` |

228| `useAutoModeDuringPlan` | Plan Mode 在自动模式可用时是否使用自动模式语义。默认:`true`。不从共享项目设置读取。在 `/config` 中显示为"在计划期间使用自动模式" | `false` |

229| `viewMode` | 启动时的默认记录视图模式:`"default"`、`"verbose"` 或 `"focus"`。设置时覆盖粘性 `/focus` 选择 | `"verbose"` |

230| `voice` | [语音听写](/zh-CN/voice-dictation)设置:`enabled` 打开听写,`mode` 选择 `"hold"` 或 `"tap"`,`autoSubmit` 在保持模式下按键释放时发送提示。当您运行 `/voice` 时自动写入。需要 Claude.ai 账户 | `{ "enabled": true, "mode": "tap" }` |

231| `voiceEnabled` | `voice.enabled` 的旧别名。优先使用 `voice` 对象 | `true` |

232| `wslInheritsWindowsSettings` | (仅 Windows managed 设置)当为 `true` 时,WSL 上的 Claude Code 除了 `/etc/claude-code` 外还从 Windows 策略链读取 managed 设置,Windows 源优先。仅在 HKLM 注册表项或 `C:\Program Files\ClaudeCode\managed-settings.json` 中设置时被尊重,两者都需要 Windows 管理员权限才能写入。为了让 HKCU 策略也在 WSL 上应用,该标志还必须在 HKCU 本身中设置。对本机 Windows 无效 | `true` |

233 

234### 全局配置设置

235 

236这些设置存储在 `~/.claude.json` 中,而不是 `settings.json`。将它们添加到 `settings.json` 将触发架构验证错误。

237 

238<Note>

239 v2.1.119 之前的版本也在此处而不是在 `settings.json` 中存储 `autoScrollEnabled`、`editorMode`、`showTurnDuration`、`teammateMode` 和 `terminalProgressBarEnabled`。

240</Note>

241 

242| 键 | 描述 | 示例 |

243| :------------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | :------ |

244| `autoConnectIde` | 当 Claude Code 从外部终端启动时自动连接到运行的 IDE。默认:`false`。在 VS Code 或 JetBrains 终端外运行时在 `/config` 中显示为**自动连接到 IDE(外部终端)** | `true` |

245| `autoInstallIdeExtension` | 从 VS Code 终端运行时自动安装 Claude Code IDE 扩展。默认:`true`。在 VS Code 或 JetBrains 终端内运行时在 `/config` 中显示为**自动安装 IDE 扩展**。您也可以设置 [`CLAUDE_CODE_IDE_SKIP_AUTO_INSTALL`](/zh-CN/env-vars) 环境变量 | `false` |

246| `externalEditorContext` | 当您使用 `Ctrl+G` 打开外部编辑器时,将 Claude 的上一个响应作为 `#` 注释上下文前置。默认:`false`。在 `/config` 中显示为**在外部编辑器中显示最后响应** | `true` |

247 

248### Worktree 设置

249 

250配置 `--worktree` 如何创建和管理 git worktrees。使用这些设置来减少大型 monorepos 中的磁盘使用和启动时间。

251 

252| 键 | 描述 | 示例 |

253| :---------------------------- | :------------------------------------------------------------------------------- | :------------------------------------ |

254| `worktree.symlinkDirectories` | 要从主存储库符号链接到每个 worktree 的目录,以避免在磁盘上复制大型目录。默认情况下不符号链接任何目录 | `["node_modules", ".cache"]` |

255| `worktree.sparsePaths` | 通过 git sparse-checkout(cone 模式)在每个 worktree 中检出的目录。仅将列出的路径写入磁盘,在大型 monorepos 中更快 | `["packages/my-app", "shared/utils"]` |

256 

257要将 gitignored 文件(如 `.env`)复制到新的 worktrees,请在项目根目录中使用 [`.worktreeinclude` 文件](/zh-CN/worktrees#copy-gitignored-files-into-worktrees),而不是设置。

258 

259### 权限设置

260 

261| 键 | 描述 | 示例 |

262| :---------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------- |

263| `allow` | 允许工具使用的权限规则数组。请参阅下面的[权限规则语法](#permission-rule-syntax)了解模式匹配详情 | `[ "Bash(git diff *)" ]` |

264| `ask` | 在工具使用时要求确认的权限规则数组。请参阅下面的[权限规则语法](#permission-rule-syntax) | `[ "Bash(git push *)" ]` |

265| `deny` | 拒绝工具使用的权限规则数组。使用此排除敏感文件不被 Claude Code 访问。请参阅[权限规则语法](#permission-rule-syntax)和 [Bash 权限限制](/zh-CN/permissions#tool-specific-permission-rules) | `[ "WebFetch", "Bash(curl *)", "Read(./.env)", "Read(./secrets/**)" ]` |

266| `additionalDirectories` | Claude 有权访问的额外[工作目录](/zh-CN/permissions#working-directories)。大多数 `.claude/` 配置[未从这些目录发现](/zh-CN/permissions#additional-directories-grant-file-access-not-configuration) | `[ "../docs/" ]` |

267| `defaultMode` | 打开 Claude Code 时的默认[权限模式](/zh-CN/permission-modes)。有效值:`default`、`acceptEdits`、`plan`、`auto`、`dontAsk`、`bypassPermissions`。`--permission-mode` CLI 标志覆盖此设置用于单个会话 | `"acceptEdits"` |

268| `disableBypassPermissionsMode` | 设置为 `"disable"` 以防止激活 `bypassPermissions` 模式。禁用 `--dangerously-skip-permissions` 标志。在[managed 设置](/zh-CN/permissions#managed-settings)中最有用,用户无法覆盖它 | `"disable"` |

269| `skipDangerousModePermissionPrompt` | 跳过通过 `--dangerously-skip-permissions` 或 `defaultMode: "bypassPermissions"` 进入 bypass permissions 模式前显示的确认提示。在项目设置(`.claude/settings.json`)中设置时被忽略,以防止不受信任的存储库自动绕过提示 | `true` |

270 

271### 权限规则语法

272 

273权限规则遵循 `Tool` 或 `Tool(specifier)` 的格式。规则按顺序评估:首先是拒绝规则,然后是询问,最后是允许。第一个匹配的规则获胜。

274 

275快速示例:

276 

277| 规则 | 效果 |

278| :----------------------------- | :-------------------- |

279| `Bash` | 匹配所有 Bash 命令 |

280| `Bash(npm run *)` | 匹配以 `npm run` 开头的命令 |

281| `Read(./.env)` | 匹配读取 `.env` 文件 |

282| `WebFetch(domain:example.com)` | 匹配对 example.com 的获取请求 |

283 

284有关完整的规则语法参考,包括通配符行为、Read、Edit、WebFetch、MCP 和 Agent 规则的工具特定模式,以及 Bash 模式的安全限制,请参阅[权限规则语法](/zh-CN/permissions#permission-rule-syntax)。

285 

286### Sandbox 设置

287 

288配置高级 sandboxing 行为。Sandboxing 将 bash 命令与您的文件系统和网络隔离。请参阅 [Sandboxing](/zh-CN/sandboxing) 了解详情。

289 

290| 键 | 描述 | 示例 |

291| :------------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------- |

292| `enabled` | 启用 bash sandboxing(macOS、Linux 和 WSL2)。默认:false | `true` |

293| `failIfUnavailable` | 如果 `sandbox.enabled` 为 true 但 sandbox 无法启动(缺少依赖项或不支持的平台),则在启动时以错误退出。当为 false(默认)时,显示警告,命令无 sandbox 运行。用于需要 sandboxing 作为硬门的 managed 设置部署 | `true` |

294| `autoAllowBashIfSandboxed` | 当 sandboxed 时自动批准 bash 命令。默认:true | `true` |

295| `excludedCommands` | 应在 sandbox 外运行的命令 | `["docker *"]` |

296| `allowUnsandboxedCommands` | 允许命令通过 `dangerouslyDisableSandbox` 参数在 sandbox 外运行。当设置为 `false` 时,`dangerouslyDisableSandbox` 逃生舱口完全禁用,所有命令必须 sandboxed(或在 `excludedCommands` 中)。对于需要严格 sandboxing 的企业策略很有用。默认:true | `false` |

297| `filesystem.allowWrite` | sandboxed 命令可以写入的额外路径。数组跨所有设置作用域合并:用户、项目和 managed 路径组合,不替换。也与 `Edit(...)` 允许权限规则中的路径合并。请参阅下面的[路径前缀](#sandbox-path-prefixes)。 | `["/tmp/build", "~/.kube"]` |

298| `filesystem.denyWrite` | sandboxed 命令无法写入的路径。数组跨所有设置作用域合并。也与 `Edit(...)` 拒绝权限规则中的路径合并。 | `["/etc", "/usr/local/bin"]` |

299| `filesystem.denyRead` | sandboxed 命令无法读取的路径。数组跨所有设置作用域合并。也与 `Read(...)` 拒绝权限规则中的路径合并。 | `["~/.aws/credentials"]` |

300| `filesystem.allowRead` | 在 `denyRead` 区域内重新允许读取的路径。优先于 `denyRead`。数组跨所有设置作用域合并。使用此创建仅工作区读取访问模式。 | `["."]` |

301| `filesystem.allowManagedReadPathsOnly` | (仅 Managed 设置)仅尊重来自 managed 设置的 `filesystem.allowRead` 路径。`denyRead` 仍从所有源合并。默认:false | `true` |

302| `network.allowUnixSockets` | (仅 macOS)sandbox 中可访问的 Unix socket 路径。在 Linux 和 WSL2 上被忽略,其中 seccomp 过滤器无法检查 socket 路径;改用 `allowAllUnixSockets`。 | `["~/.ssh/agent-socket"]` |

303| `network.allowAllUnixSockets` | 允许 sandbox 中的所有 Unix socket 连接。在 Linux 和 WSL2 上这是允许 Unix sockets 的唯一方式,因为它跳过了 seccomp 过滤器,否则会阻止 `socket(AF_UNIX, ...)` 调用。默认:false | `true` |

304| `network.allowLocalBinding` | 允许绑定到 localhost 端口(仅 macOS)。默认:false | `true` |

305| `network.allowMachLookup` | sandbox 可能查找的额外 XPC/Mach 服务名称(仅 macOS)。支持单个尾部 `*` 用于前缀匹配。对于通过 XPC 通信的工具(如 iOS 模拟器或 Playwright)是必需的。 | `["com.apple.coresimulator.*"]` |

306| `network.allowedDomains` | 允许出站网络流量的域数组。支持通配符(例如 `*.example.com`)。 | `["github.com", "*.npmjs.org"]` |

307| `network.deniedDomains` | 阻止出站网络流量的域数组。支持与 `allowedDomains` 相同的通配符语法。当两者都匹配时优先于 `allowedDomains`。无论 `allowManagedDomainsOnly` 如何,都从所有设置源合并。 | `["sensitive.cloud.example.com"]` |

308| `network.allowManagedDomainsOnly` | (仅 Managed 设置)仅尊重来自 managed 设置的 `allowedDomains` 和 `WebFetch(domain:...)` 允许规则。来自用户、项目和本地设置的域被忽略。非允许的域自动被阻止,不提示用户。拒绝的域仍从所有源受尊重。默认:false | `true` |

309| `network.httpProxyPort` | 如果您想自带代理,使用的 HTTP 代理端口。如果未指定,Claude 将运行自己的代理。 | `8080` |

310| `network.socksProxyPort` | 如果您想自带代理,使用的 SOCKS5 代理端口。如果未指定,Claude 将运行自己的代理。 | `8081` |

311| `enableWeakerNestedSandbox` | 为无特权 Docker 环境启用较弱的 sandbox(仅 Linux 和 WSL2)。**降低安全性。** 默认:false | `true` |

312| `enableWeakerNetworkIsolation` | (仅 macOS)允许在 sandbox 中访问系统 TLS 信任服务(`com.apple.trustd.agent`)。对于 Go 基础工具(如 `gh`、`gcloud` 和 `terraform`)在使用 `httpProxyPort` 与 MITM 代理和自定义 CA 时验证 TLS 证书是必需的。**通过打开潜在的数据泄露路径降低安全性**。默认:false | `true` |

313 

314#### Sandbox 路径前缀

315 

316`filesystem.allowWrite`、`filesystem.denyWrite`、`filesystem.denyRead` 和 `filesystem.allowRead` 中的路径支持这些前缀:

317 

318| 前缀 | 含义 | 示例 |

319| :-------- | :---------------------------------- | :---------------------------------------------------------------- |

320| `/` | 从文件系统根目录的绝对路径 | `/tmp/build` 保持 `/tmp/build` |

321| `~/` | 相对于主目录 | `~/.kube` 变为 `$HOME/.kube` |

322| `./` 或无前缀 | 相对于项目设置的项目根目录,或相对于用户设置的 `~/.claude` | `./output` 在 `.claude/settings.json` 中解析为 `<project-root>/output` |

323 

324较旧的 `//path` 前缀用于绝对路径仍然有效。如果您之前使用单斜杠 `/path` 期望项目相对解析,请切换到 `./path`。此语法与[读取和编辑权限规则](/zh-CN/permissions#read-and-edit)不同,后者使用 `//path` 用于绝对和 `/path` 用于项目相对。Sandbox 文件系统路径使用标准约定:`/tmp/build` 是绝对路径。

325 

326**配置示例:**

327 

328```json theme={null}

329{

330 "sandbox": {

331 "enabled": true,

332 "autoAllowBashIfSandboxed": true,

333 "excludedCommands": ["docker *"],

334 "filesystem": {

335 "allowWrite": ["/tmp/build", "~/.kube"],

336 "denyRead": ["~/.aws/credentials"]

337 },

338 "network": {

339 "allowedDomains": ["github.com", "*.npmjs.org", "registry.yarnpkg.com"],

340 "deniedDomains": ["uploads.github.com"],

341 "allowUnixSockets": [

342 "/var/run/docker.sock"

343 ],

344 "allowLocalBinding": true

345 }

346 }

347}

348```

349 

350**文件系统和网络限制**可以通过两种合并在一起的方式配置:

351 

352* **`sandbox.filesystem` 设置**(如上所示):在 OS 级 sandbox 边界处控制路径。这些限制适用于所有子进程命令(例如 `kubectl`、`terraform`、`npm`),而不仅仅是 Claude 的文件工具。

353* **权限规则**:使用 `Edit` 允许/拒绝规则控制 Claude 的文件工具访问,`Read` 拒绝规则阻止读取,`WebFetch` 允许/拒绝规则控制网络域。这些规则中的路径也合并到 sandbox 配置中。

354 

355### 归属设置

356 

357Claude Code 为 git 提交和拉取请求添加归属。这些分别配置:

358 

359* 提交默认使用 [git trailers](https://git-scm.com/docs/git-interpret-trailers)(如 `Co-Authored-By`),可以自定义或禁用

360* 拉取请求描述是纯文本

361 

362| 键 | 描述 |

363| :------- | :--------------------------------- |

364| `commit` | git 提交的归属,包括任何 trailers。空字符串隐藏提交归属 |

365| `pr` | 拉取请求描述的归属。空字符串隐藏拉取请求归属 |

366 

367**默认提交归属:**

368 

369```text theme={null}

370🤖 Generated with [Claude Code](https://claude.com/claude-code)

371 

372 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

373```

374 

375**默认拉取请求归属:**

376 

377```text theme={null}

378🤖 Generated with [Claude Code](https://claude.com/claude-code)

379```

380 

381**示例:**

382 

383```json theme={null}

384{

385 "attribution": {

386 "commit": "Generated with AI\n\nCo-Authored-By: AI <ai@example.com>",

387 "pr": ""

388 }

389}

390```

391 

392<Note>

393 `attribution` 设置优先于已弃用的 `includeCoAuthoredBy` 设置。要隐藏所有归属,将 `commit` 和 `pr` 设置为空字符串。

394</Note>

395 

396### 文件建议设置

397 

398为 `@` 文件路径自动完成配置自定义命令。内置文件建议使用快速文件系统遍历,但大型 monorepos 可能受益于项目特定的索引,例如预构建的文件索引或自定义工具。

399 

400```json theme={null}

401{

402 "fileSuggestion": {

403 "type": "command",

404 "command": "~/.claude/file-suggestion.sh"

405 }

406}

407```

408 

409该命令使用与 [hooks](/zh-CN/hooks) 相同的环境变量运行,包括 `CLAUDE_PROJECT_DIR`。它通过 stdin 接收包含 `query` 字段的 JSON:

410 

411```json theme={null}

412{"query": "src/comp"}

413```

414 

415将换行符分隔的文件路径输出到 stdout(当前限制为 15):

416 

417```text theme={null}

418src/components/Button.tsx

419src/components/Modal.tsx

420src/components/Form.tsx

421```

422 

423**示例:**

424 

425```bash theme={null}

426#!/bin/bash

427query=$(cat | jq -r '.query')

428your-repo-file-index --query "$query" | head -20

429```

430 

431### Hook 配置

432 

433这些设置控制允许运行哪些 hooks 以及 HTTP hooks 可以访问什么。`allowManagedHooksOnly` 设置只能在 [managed 设置](#settings-files)中配置。URL 和环境变量允许列表可以在任何设置级别设置并跨源合并。

434 

435**当 `allowManagedHooksOnly` 为 `true` 时的行为:**

436 

437* 加载 Managed hooks 和 SDK hooks

438* 从在 managed 设置 `enabledPlugins` 中强制启用的插件加载 Hooks。这让管理员通过组织市场分发经过审查的 hooks,同时阻止其他所有内容。信任由完整的 `plugin@marketplace` ID 授予,因此来自不同市场的同名插件保持被阻止

439* 用户 hooks、项目 hooks 和所有其他插件 hooks 被阻止

440 

441**限制 HTTP hook URL:**

442 

443限制 HTTP hooks 可以针对的 URL。支持 `*` 作为匹配的通配符。定义数组后,针对不匹配 URL 的 HTTP hooks 被静默阻止。

444 

445```json theme={null}

446{

447 "allowedHttpHookUrls": ["https://hooks.example.com/*", "http://localhost:*"]

448}

449```

450 

451**限制 HTTP hook 环境变量:**

452 

453限制 HTTP hooks 可以插入到标头值中的环境变量名称。每个 hook 的有效 `allowedEnvVars` 是其自己列表与此设置的交集。

454 

455```json theme={null}

456{

457 "httpHookAllowedEnvVars": ["MY_TOKEN", "HOOK_SECRET"]

458}

459```

460 

461### 设置优先级

462 

463设置按优先级顺序应用。从最高到最低:

464 

4651. **Managed 设置**([服务器管理](/zh-CN/server-managed-settings)、[MDM/OS 级别策略](#configuration-scopes) 或 [managed 设置](/zh-CN/settings#settings-files))

466 * 由 IT 通过服务器交付、MDM 配置文件、注册表策略或 managed 设置文件部署的策略

467 * 无法被任何其他级别覆盖,包括命令行参数

468 * 在 managed 层内,优先级为:server-managed > MDM/OS 级别策略 > 基于文件(`managed-settings.d/*.json` + `managed-settings.json`)> HKCU 注册表(仅 Windows)。仅使用一个 managed 源;源不合并跨层。在基于文件的层内,放入文件和基础文件被合并在一起。

469 

4702. **命令行参数**

471 * 特定会话的临时覆盖

472 

4733. **本地项目设置**(`.claude/settings.local.json`)

474 * 个人项目特定设置

475 

4764. **共享项目设置**(`.claude/settings.json`)

477 * 源代码管理中的团队共享项目设置

478 

4795. **用户设置**(`~/.claude/settings.json`)

480 * 个人全局设置

481 

482此层次结构确保组织策略始终被强制执行,同时仍允许团队和个人自定义其体验。无论您从 CLI、[VS Code 扩展](/zh-CN/vs-code) 还是 [JetBrains IDE](/zh-CN/jetbrains) 运行 Claude Code,相同的优先级都适用。

483 

484例如,如果您的用户设置允许 `Bash(npm run *)`,但项目的共享设置拒绝它,则项目设置优先,命令被阻止。

485 

486<Note>

487 **数组设置跨作用域合并。** 当相同的数组值设置(例如 `sandbox.filesystem.allowWrite` 或 `permissions.allow`)出现在多个作用域中时,数组被**连接和去重**,而不是替换。这意味着较低优先级的作用域可以添加条目而不覆盖由较高优先级作用域设置的条目,反之亦然。例如,如果 managed 设置将 `allowWrite` 设置为 `["/opt/company-tools"]`,用户添加 `["~/.kube"]`,则最终配置中包含两个路径。

488</Note>

489 

490### 验证活跃设置

491 

492在 Claude Code 中运行 `/status` 以查看哪些设置源处于活跃状态以及它们来自何处。输出显示每个配置层(managed、user、project)及其来源,例如 `Enterprise managed settings (remote)`、`Enterprise managed settings (plist)`、`Enterprise managed settings (HKLM)`、`Enterprise managed settings (HKCU)` 或 `Enterprise managed settings (file)`。如果设置文件包含错误,`/status` 会报告问题,以便您可以修复它。

493 

494### 配置系统的关键点

495 

496* **内存文件(`CLAUDE.md`)**:包含 Claude 在启动时加载的说明和上下文

497* **设置文件(JSON)**:配置权限、环境变量和工具行为

498* **Skills**:可以使用 `/skill-name` 调用或由 Claude 自动加载的自定义提示

499* **MCP servers**:使用额外的工具和集成扩展 Claude Code

500* **优先级**:更高级别的配置(Managed)覆盖较低级别的配置(User/Project)

501* **继承**:设置被合并,更具体的设置添加到或覆盖更广泛的设置

502 

503### 系统提示

504 

505Claude Code 的内部系统提示未发布。要添加自定义说明,请使用 `CLAUDE.md` 文件或 `--append-system-prompt` 标志。

506 

507### 排除敏感文件

508 

509要防止 Claude Code 访问包含敏感信息(如 API 密钥、secrets 和环境文件)的文件,请在您的 `.claude/settings.json` 文件中使用 `permissions.deny` 设置:

510 

511```json theme={null}

512{

513 "permissions": {

514 "deny": [

515 "Read(./.env)",

516 "Read(./.env.*)",

517 "Read(./secrets/**)",

518 "Read(./config/credentials.json)",

519 "Read(./build)"

520 ]

521 }

522}

523```

524 

525这替代了已弃用的 `ignorePatterns` 配置。匹配这些模式的文件被排除在文件发现和搜索结果之外,这些文件上的读取操作被拒绝。

526 

527## Subagent 配置

528 

529Claude Code 支持可在用户和项目级别配置的自定义 AI subagents。这些 subagents 存储为带有 YAML frontmatter 的 Markdown 文件:

530 

531* **用户 subagents**:`~/.claude/agents/` - 在所有项目中可用

532* **项目 subagents**:`.claude/agents/` - 特定于您的项目,可与您的团队共享

533 

534Subagent 文件定义具有自定义提示和工具权限的专门 AI 助手。在 [subagents 文档](/zh-CN/sub-agents)中了解有关创建和使用 subagents 的更多信息。

535 

536## 插件配置

537 

538Claude Code 支持一个插件系统,让您可以使用 skills、agents、hooks 和 MCP servers 扩展功能。插件通过市场分发,可以在用户和存储库级别配置。

539 

540### 插件设置

541 

542`settings.json` 中的插件相关设置:

543 

544```json theme={null}

545{

546 "enabledPlugins": {

547 "formatter@acme-tools": true,

548 "deployer@acme-tools": true,

549 "analyzer@security-plugins": false

550 },

551 "extraKnownMarketplaces": {

552 "acme-tools": {

553 "source": "github",

554 "repo": "acme-corp/claude-plugins"

555 }

556 }

557}

558```

559 

560#### `enabledPlugins`

561 

562控制启用哪些插件。格式:`"plugin-name@marketplace-name": true/false`

563 

564**作用域**:

565 

566* **用户设置**(`~/.claude/settings.json`):个人插件偏好

567* **项目设置**(`.claude/settings.json`):与团队共享的项目特定插件

568* **本地设置**(`.claude/settings.local.json`):每台机器的覆盖(未提交)

569* **Managed 设置**(`managed-settings.json`):组织范围的策略覆盖,在所有作用域中阻止安装并从市场隐藏插件

570 

571**示例**:

572 

573```json theme={null}

574{

575 "enabledPlugins": {

576 "code-formatter@team-tools": true,

577 "deployment-tools@team-tools": true,

578 "experimental-features@personal": false

579 }

580}

581```

582 

583#### `extraKnownMarketplaces`

584 

585定义应为存储库提供的额外市场。通常在存储库级别设置中使用,以确保团队成员有权访问所需的插件源。

586 

587**当存储库包含 `extraKnownMarketplaces` 时**:

588 

5891. 当他们信任文件夹时,团队成员被提示安装市场

5902. 然后团队成员被提示从该市场安装插件

5913. 用户可以跳过不需要的市场或插件(存储在用户设置中)

5924. 安装尊重信任边界并需要明确同意

593 

594**示例**:

595 

596```json theme={null}

597{

598 "extraKnownMarketplaces": {

599 "acme-tools": {

600 "source": {

601 "source": "github",

602 "repo": "acme-corp/claude-plugins"

603 }

604 },

605 "security-plugins": {

606 "source": {

607 "source": "git",

608 "url": "https://git.example.com/security/plugins.git"

609 }

610 }

611 }

612}

613```

614 

615**市场源类型**:

616 

617* `github`:GitHub 存储库(使用 `repo`)

618* `git`:任何 git URL(使用 `url`)

619* `directory`:本地文件系统路径(使用 `path`,仅用于开发)

620* `hostPattern`:正则表达式模式以匹配市场主机(使用 `hostPattern`)

621* `settings`:直接在 settings.json 中声明的内联市场,无需单独的托管存储库(使用 `name` 和 `plugins`)

622 

623使用 `source: 'settings'` 声明一小组插件内联,无需设置托管市场存储库。此处列出的插件必须引用外部源,例如 GitHub 或 npm。您仍需要在 `enabledPlugins` 中单独启用每个插件。

624 

625```json theme={null}

626{

627 "extraKnownMarketplaces": {

628 "team-tools": {

629 "source": {

630 "source": "settings",

631 "name": "team-tools",

632 "plugins": [

633 {

634 "name": "code-formatter",

635 "source": {

636 "source": "github",

637 "repo": "acme-corp/code-formatter"

638 }

639 }

640 ]

641 }

642 }

643 }

644}

645```

646 

647#### `strictKnownMarketplaces`

648 

649**仅 Managed 设置**:控制用户允许添加和安装插件的插件市场。此设置只能在 [managed 设置](/zh-CN/settings#settings-files) 中配置,为管理员提供对市场源的严格控制。

650 

651**Managed 设置文件位置**:

652 

653* **macOS**:`/Library/Application Support/ClaudeCode/managed-settings.json`

654* **Linux 和 WSL**:`/etc/claude-code/managed-settings.json`

655* **Windows**:`C:\Program Files\ClaudeCode\managed-settings.json`

656 

657**关键特征**:

658 

659* 仅在 managed 设置(`managed-settings.json`)中可用

660* 无法被用户或项目设置覆盖(最高优先级)

661* 在网络/文件系统操作之前强制执行(被阻止的源永远不会执行)

662* 对源规范使用精确匹配(包括 `ref`、`path` 用于 git 源),除了 `hostPattern`,它使用正则表达式匹配

663 

664**允许列表行为**:

665 

666* `undefined`(默认):无限制 - 用户可以添加任何市场

667* 空数组 `[]`:完全锁定 - 用户无法添加任何新市场

668* 源列表:用户只能添加与之完全匹配的市场

669 

670**所有支持的源类型**:

671 

672允许列表支持多种市场源类型。大多数源使用精确匹配,而 `hostPattern` 使用正则表达式匹配市场主机。

673 

6741. **GitHub 存储库**:

675 

676```json theme={null}

677{ "source": "github", "repo": "acme-corp/approved-plugins" }

678{ "source": "github", "repo": "acme-corp/security-tools", "ref": "v2.0" }

679{ "source": "github", "repo": "acme-corp/plugins", "ref": "main", "path": "marketplace" }

680```

681 

682字段:`repo`(必需)、`ref`(可选:分支/标签/SHA)、`path`(可选:子目录)

683 

6842. **Git 存储库**:

685 

686```json theme={null}

687{ "source": "git", "url": "https://gitlab.example.com/tools/plugins.git" }

688{ "source": "git", "url": "https://bitbucket.org/acme-corp/plugins.git", "ref": "production" }

689{ "source": "git", "url": "ssh://git@git.example.com/plugins.git", "ref": "v3.1", "path": "approved" }

690```

691 

692字段:`url`(必需)、`ref`(可选:分支/标签/SHA)、`path`(可选:子目录)

693 

6943. **基于 URL 的市场**:

695 

696```json theme={null}

697{ "source": "url", "url": "https://plugins.example.com/marketplace.json" }

698{ "source": "url", "url": "https://cdn.example.com/marketplace.json", "headers": { "Authorization": "Bearer ${TOKEN}" } }

699```

700 

701字段:`url`(必需)、`headers`(可选:用于身份验证访问的 HTTP 标头)

702 

703<Note>

704 基于 URL 的市场仅下载 `marketplace.json` 文件。它们不从服务器下载插件文件。基于 URL 的市场中的插件必须使用外部源(GitHub、npm 或 git URL)而不是相对路径。对于具有相对路径的插件,改用基于 Git 的市场。请参阅[故障排除](/zh-CN/plugin-marketplaces#plugins-with-relative-paths-fail-in-url-based-marketplaces)了解详情。

705</Note>

706 

7074. **NPM 包**:

708 

709```json theme={null}

710{ "source": "npm", "package": "@acme-corp/claude-plugins" }

711{ "source": "npm", "package": "@acme-corp/approved-marketplace" }

712```

713 

714字段:`package`(必需,支持作用域包)

715 

7165. **文件路径**:

717 

718```json theme={null}

719{ "source": "file", "path": "/usr/local/share/claude/acme-marketplace.json" }

720{ "source": "file", "path": "/opt/acme-corp/plugins/marketplace.json" }

721```

722 

723字段:`path`(必需:marketplace.json 文件的绝对路径)

724 

7256. **目录路径**:

726 

727```json theme={null}

728{ "source": "directory", "path": "/usr/local/share/claude/acme-plugins" }

729{ "source": "directory", "path": "/opt/acme-corp/approved-marketplaces" }

730```

731 

732字段:`path`(必需:包含 `.claude-plugin/marketplace.json` 的目录的绝对路径)

733 

7347. **主机模式匹配**:

735 

736```json theme={null}

737{ "source": "hostPattern", "hostPattern": "^github\\.example\\.com$" }

738{ "source": "hostPattern", "hostPattern": "^gitlab\\.internal\\.example\\.com$" }

739```

740 

741字段:`hostPattern`(必需:与市场主机匹配的正则表达式模式)

742 

743当您想允许来自特定主机的所有市场而不枚举每个存储库时,使用主机模式匹配。这对于具有内部 GitHub Enterprise 或 GitLab 服务器的组织很有用,开发人员在其中创建自己的市场。

744 

745按源类型的主机提取:

746 

747* `github`:始终与 `github.com` 匹配

748* `git`:从 URL 提取主机名(支持 HTTPS 和 SSH 格式)

749* `url`:从 URL 提取主机名

750* `npm`、`file`、`directory`:不支持主机模式匹配

751 

752**配置示例**:

753 

754示例:仅允许特定市场:

755 

756```json theme={null}

757{

758 "strictKnownMarketplaces": [

759 {

760 "source": "github",

761 "repo": "acme-corp/approved-plugins"

762 },

763 {

764 "source": "github",

765 "repo": "acme-corp/security-tools",

766 "ref": "v2.0"

767 },

768 {

769 "source": "url",

770 "url": "https://plugins.example.com/marketplace.json"

771 },

772 {

773 "source": "npm",

774 "package": "@acme-corp/compliance-plugins"

775 }

776 ]

777}

778```

779 

780示例 - 禁用所有市场添加:

781 

782```json theme={null}

783{

784 "strictKnownMarketplaces": []

785}

786```

787 

788示例:允许来自内部 git 服务器的所有市场:

789 

790```json theme={null}

791{

792 "strictKnownMarketplaces": [

793 {

794 "source": "hostPattern",

795 "hostPattern": "^github\\.example\\.com$"

796 }

797 ]

798}

799```

800 

801**精确匹配要求**:

802 

803市场源必须**精确**匹配才能允许用户的添加。对于基于 git 的源(`github` 和 `git`),这包括所有可选字段:

804 

805* `repo` 或 `url` 必须精确匹配

806* `ref` 字段必须精确匹配(或两者都未定义)

807* `path` 字段必须精确匹配(或两者都未定义)

808 

809**不匹配**的源示例:

810 

811```json theme={null}

812// 这些是不同的源:

813{ "source": "github", "repo": "acme-corp/plugins" }

814{ "source": "github", "repo": "acme-corp/plugins", "ref": "main" }

815 

816// 这些也是不同的:

817{ "source": "github", "repo": "acme-corp/plugins", "path": "marketplace" }

818{ "source": "github", "repo": "acme-corp/plugins" }

819```

820 

821**与 `extraKnownMarketplaces` 的比较**:

822 

823| 方面 | `strictKnownMarketplaces` | `extraKnownMarketplaces` |

824| ---------- | ------------------------- | ------------------------ |

825| **目的** | 组织策略强制执行 | 团队便利 |

826| **设置文件** | 仅 `managed-settings.json` | 任何设置文件 |

827| **行为** | 阻止非允许列表的添加 | 自动安装缺失的市场 |

828| **何时强制执行** | 在网络/文件系统操作之前 | 在用户信任提示之后 |

829| **可以被覆盖** | 否(最高优先级) | 是(由更高优先级设置) |

830| **源格式** | 直接源对象 | 具有嵌套源的命名市场 |

831| **用例** | 合规、安全限制 | 入职、标准化 |

832 

833**格式差异**:

834 

835`strictKnownMarketplaces` 使用直接源对象:

836 

837```json theme={null}

838{

839 "strictKnownMarketplaces": [

840 { "source": "github", "repo": "acme-corp/plugins" }

841 ]

842}

843```

844 

845`extraKnownMarketplaces` 需要命名市场:

846 

847```json theme={null}

848{

849 "extraKnownMarketplaces": {

850 "acme-tools": {

851 "source": { "source": "github", "repo": "acme-corp/plugins" }

852 }

853 }

854}

855```

856 

857**同时使用两者**:

858 

859`strictKnownMarketplaces` 是一个策略门:它控制用户可能添加什么,但不注册任何市场。要同时限制和为所有用户预注册市场,请在 `managed-settings.json` 中设置两者:

860 

861```json theme={null}

862{

863 "strictKnownMarketplaces": [

864 { "source": "github", "repo": "acme-corp/plugins" }

865 ],

866 "extraKnownMarketplaces": {

867 "acme-tools": {

868 "source": { "source": "github", "repo": "acme-corp/plugins" }

869 }

870 }

871}

872```

873 

874仅设置 `strictKnownMarketplaces` 时,用户仍可以通过 `/plugin marketplace add` 手动添加允许的市场,但它不会自动可用。

875 

876**重要说明**:

877 

878* 限制在任何网络请求或文件系统操作之前检查

879* 被阻止时,用户看到清晰的错误消息,指示源被 managed 策略阻止

880* 限制在市场添加和插件安装、更新、刷新和自动更新时强制执行。在策略设置之前添加的市场一旦其源不再与允许列表匹配,就无法用于安装或更新插件

881* Managed 设置具有最高优先级,无法被覆盖

882 

883请参阅 [Managed 市场限制](/zh-CN/plugin-marketplaces#managed-marketplace-restrictions)了解面向用户的文档。

884 

885### 管理插件

886 

887使用 `/plugin` 命令以交互方式管理插件:

888 

889* 浏览市场中的可用插件

890* 安装/卸载插件

891* 启用/禁用插件

892* 查看插件详情(提供的 skills、agents、hooks)

893* 添加/删除市场

894 

895在[插件文档](/zh-CN/plugins)中了解有关插件系统的更多信息。

896 

897## 环境变量

898 

899环境变量让您可以控制 Claude Code 行为而无需编辑设置文件。任何变量也可以在 [`settings.json`](#available-settings) 中的 `env` 键下配置,以将其应用于每个会话或将其推出到您的团队。

900 

901请参阅[环境变量参考](/zh-CN/env-vars)了解完整列表。

902 

903## Claude 可用的工具

904 

905Claude Code 可以访问一组用于读取、编辑、搜索、运行命令和编排 subagents 的工具。工具名称是您在权限规则和 hook 匹配器中使用的确切字符串。

906 

907请参阅[工具参考](/zh-CN/tools-reference)了解完整列表和 Bash 工具行为详情。

908 

909## 另请参阅

910 

911* [权限](/zh-CN/permissions):权限系统、规则语法、工具特定模式和 managed 策略

912* [身份验证](/zh-CN/authentication):设置用户对 Claude Code 的访问

913* [调试您的配置](/zh-CN/debug-your-config):诊断为什么设置、hook 或 MCP 服务器没有生效

914* [故障排除安装和登录](/zh-CN/troubleshoot-install):安装、身份验证和平台问题

setup.md +606 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 高级设置

6 

7> Claude Code 的系统要求、特定平台安装、版本管理和卸载。

8 

9本页面涵盖系统要求、特定平台安装详情、更新和卸载。有关首次会话的引导式演练,请参阅[快速入门](/zh-CN/quickstart)。如果您从未使用过终端,请参阅[终端指南](/zh-CN/terminal-guide)。

10 

11## 系统要求

12 

13Claude Code 在以下平台和配置上运行:

14 

15* **操作系统**:

16 * macOS 13.0+

17 * Windows 10 1809+ 或 Windows Server 2019+

18 * Ubuntu 20.04+

19 * Debian 10+

20 * Alpine Linux 3.19+

21* **硬件**:4 GB+ RAM、x64 或 ARM64 处理器

22* **网络**:需要互联网连接。请参阅[网络配置](/zh-CN/network-config#network-access-requirements)。

23* **Shell**:Bash、Zsh、PowerShell 或 CMD。在原生 Windows 上,建议使用 [Git for Windows](https://git-scm.com/downloads/win);当 Git Bash 不存在时,Claude Code 会回退到 PowerShell。WSL 设置不需要 Git for Windows。

24* **位置**:[Anthropic 支持的国家/地区](https://www.anthropic.com/supported-countries)

25 

26### 其他依赖项

27 

28* **ripgrep**:通常包含在 Claude Code 中。如果搜索失败,请参阅[搜索故障排除](/zh-CN/troubleshooting#search-and-discovery-issues)。

29 

30## 安装 Claude Code

31 

32<Tip>

33 更喜欢图形界面?[桌面应用](/zh-CN/desktop-quickstart)让您无需使用终端即可使用 Claude Code。下载适用于 [macOS](https://claude.ai/api/desktop/darwin/universal/dmg/latest/redirect?utm_source=claude_code\&utm_medium=docs) 或 [Windows](https://claude.com/download?utm_source=claude_code\&utm_medium=docs) 的版本。

34 

35 初次使用终端?请参阅[终端指南](/zh-CN/terminal-guide)获取分步说明。

36</Tip>

37 

38To install Claude Code, use one of the following methods:

39 

40<Tabs>

41 <Tab title="Native Install (Recommended)">

42 **macOS, Linux, WSL:**

43 

44 ```bash theme={null}

45 curl -fsSL https://claude.ai/install.sh | bash

46 ```

47 

48 **Windows PowerShell:**

49 

50 ```powershell theme={null}

51 irm https://claude.ai/install.ps1 | iex

52 ```

53 

54 **Windows CMD:**

55 

56 ```batch theme={null}

57 curl -fsSL https://claude.ai/install.cmd -o install.cmd && install.cmd && del install.cmd

58 ```

59 

60 If you see `The token '&&' is not a valid statement separator`, you're in PowerShell, not CMD. If you see `'irm' is not recognized as an internal or external command`, you're in CMD, not PowerShell. Your prompt shows `PS C:\` when you're in PowerShell and `C:\` without the `PS` when you're in CMD.

61 

62 [Git for Windows](https://git-scm.com/downloads/win) is recommended on native Windows so Claude Code can use the Bash tool. If Git for Windows is not installed, Claude Code uses PowerShell as the shell tool instead. WSL setups do not need Git for Windows.

63 

64 <Info>

65 Native installations automatically update in the background to keep you on the latest version.

66 </Info>

67 </Tab>

68 

69 <Tab title="Homebrew">

70 ```bash theme={null}

71 brew install --cask claude-code

72 ```

73 

74 Homebrew offers two casks. `claude-code` tracks the stable release channel, which is typically about a week behind and skips releases with major regressions. `claude-code@latest` tracks the latest channel and receives new versions as soon as they ship.

75 

76 <Info>

77 Homebrew installations do not auto-update. Run `brew upgrade claude-code` or `brew upgrade claude-code@latest`, depending on which cask you installed, to get the latest features and security fixes.

78 </Info>

79 </Tab>

80 

81 <Tab title="WinGet">

82 ```powershell theme={null}

83 winget install Anthropic.ClaudeCode

84 ```

85 

86 <Info>

87 WinGet installations do not auto-update. Run `winget upgrade Anthropic.ClaudeCode` periodically to get the latest features and security fixes.

88 </Info>

89 </Tab>

90</Tabs>

91 

92You can also install with [apt, dnf, or apk](/en/setup#install-with-linux-package-managers) on Debian, Fedora, RHEL, and Alpine.

93 

94安装完成后,在您要使用的项目中打开终端并启动 Claude Code:

95 

96```bash theme={null}

97claude

98```

99 

100如果在安装过程中遇到任何问题,请参阅[故障排除安装和登录](/zh-CN/troubleshoot-install)。

101 

102### 在 Windows 上设置

103 

104您可以在 Windows 上原生运行 Claude Code,也可以在 WSL 中运行。根据您的项目位置和所需的功能进行选择:

105 

106| 选项 | 需要 | [沙箱](/zh-CN/sandboxing) | 何时使用 |

107| ---------- | -------------------------------------------------------------------------- | ----------------------- | ---------------- |

108| 原生 Windows | [Git for Windows](https://git-scm.com/downloads/win) 推荐;如果没有则使用 PowerShell | 不支持 | Windows 原生项目和工具 |

109| WSL 2 | WSL 2 已启用 | 支持 | Linux 工具链或沙箱命令执行 |

110| WSL 1 | WSL 1 已启用 | 不支持 | 如果 WSL 2 不可用 |

111 

112**选项 1:使用 Git Bash 的原生 Windows**

113 

114安装 [Git for Windows](https://git-scm.com/downloads/win),然后从 PowerShell 或 CMD 运行安装命令。您无需以管理员身份运行。

115 

116无论您从 PowerShell 还是 CMD 安装,只会影响您运行的安装命令。您的提示在 PowerShell 中显示为 `PS C:\Users\YourName>`,在 CMD 中显示为 `C:\Users\YourName>`(不带 `PS`)。如果您是终端新手,[终端指南](/zh-CN/terminal-guide#windows)会逐步讲解每个步骤。

117 

118安装后,从 PowerShell、CMD 或 Git Bash 启动 `claude`。安装 Git Bash 后,Claude Code 在内部使用它来执行命令,无论您从哪里启动它。如果 Claude Code 找不到您的 Git Bash 安装,请在您的 [settings.json 文件](/zh-CN/settings)中设置路径:

119 

120```json theme={null}

121{

122 "env": {

123 "CLAUDE_CODE_GIT_BASH_PATH": "C:\\Program Files\\Git\\bin\\bash.exe"

124 }

125}

126```

127 

128Claude Code 也可以在 Windows 上原生运行 PowerShell。安装 Git Bash 后,PowerShell 工具正在逐步推出作为额外选项:设置 `CLAUDE_CODE_USE_POWERSHELL_TOOL=1` 以选择加入或 `0` 以选择退出。有关设置和限制,请参阅 [PowerShell 工具](/zh-CN/tools-reference#powershell-tool)。

129 

130**选项 2:WSL**

131 

132打开您的 WSL 发行版并从上面的[安装说明](#install-claude-code)中运行 Linux 安装程序。您在 WSL 终端内安装和启动 `claude`,而不是从 PowerShell 或 CMD。

133 

134### Alpine Linux 和基于 musl 的发行版

135 

136Alpine 和其他基于 musl/uClibc 的发行版上的原生安装程序需要 `libgcc`、`libstdc++` 和 `ripgrep`。使用您的发行版的包管理器安装这些,然后设置 `USE_BUILTIN_RIPGREP=0`。

137 

138此示例在 Alpine 上安装所需的包:

139 

140```bash theme={null}

141apk add libgcc libstdc++ ripgrep

142```

143 

144然后在您的 [`settings.json`](/zh-CN/settings#available-settings) 文件中将 `USE_BUILTIN_RIPGREP` 设置为 `0`:

145 

146```json theme={null}

147{

148 "env": {

149 "USE_BUILTIN_RIPGREP": "0"

150 }

151}

152```

153 

154## 验证您的安装

155 

156安装后,确认 Claude Code 正常工作:

157 

158```bash theme={null}

159claude --version

160```

161 

162如果此命令失败并显示 `command not found` 或其他错误,请参阅[排查安装和登录问题](/zh-CN/troubleshoot-install)。

163 

164要更详细地检查您的安装和配置,请运行 [`claude doctor`](/zh-CN/troubleshooting#get-more-help):

165 

166```bash theme={null}

167claude doctor

168```

169 

170## 身份验证

171 

172Claude Code 需要 Pro、Max、Team、Enterprise 或 Console 账户。免费的 Claude.ai 计划不包括 Claude Code 访问权限。您也可以通过第三方 API 提供商(如 [Amazon Bedrock](/zh-CN/amazon-bedrock)、[Google Vertex AI](/zh-CN/google-vertex-ai) 或 [Microsoft Foundry](/zh-CN/microsoft-foundry))使用 Claude Code。

173 

174安装后,通过运行 `claude` 并按照浏览器提示登录。有关所有账户类型和团队设置选项,请参阅[身份验证](/zh-CN/authentication)。

175 

176## 更新 Claude Code

177 

178原生安装会在后台自动更新。您可以[配置发布渠道](#configure-release-channel)来控制您是立即接收更新还是按延迟的稳定计划接收更新,或者[完全禁用自动更新](#disable-auto-updates)。Homebrew、WinGet 和[Linux 包管理器](#install-with-linux-package-managers)安装需要手动更新。

179 

180### 自动更新

181 

182Claude Code 在启动时和运行时定期检查更新。更新在后台下载和安装,然后在您下次启动 Claude Code 时生效。

183 

184<Note>

185 Homebrew、WinGet、apt、dnf 和 apk 安装不会自动更新。对于 Homebrew,运行 `brew upgrade claude-code` 或 `brew upgrade claude-code@latest`,具体取决于您安装的 cask。对于 WinGet,运行 `winget upgrade Anthropic.ClaudeCode`。对于 Linux 包管理器,请参阅[使用 Linux 包管理器安装](#install-with-linux-package-managers)中的升级命令。

186 

187 **已知问题**:Claude Code 可能会在新版本在这些包管理器中可用之前通知您有更新。如果升级失败,请稍候后重试。

188 

189 Homebrew 在升级后会在磁盘上保留旧版本。定期运行 `brew cleanup` 以回收磁盘空间。

190</Note>

191 

192### 配置发布渠道

193 

194使用 `autoUpdatesChannel` 设置控制 Claude Code 为自动更新和 `claude update` 遵循的发布渠道:

195 

196* `"latest"`,默认值:在新功能发布后立即接收

197* `"stable"`:使用通常约一周前的版本,跳过有重大回归的发布

198 

199通过 `/config` → **自动更新渠道**配置此项,或将其添加到您的 [settings.json 文件](/zh-CN/settings):

200 

201```json theme={null}

202{

203 "autoUpdatesChannel": "stable"

204}

205```

206 

207对于企业部署,您可以使用[托管设置](/zh-CN/permissions#managed-settings)在整个组织中强制执行一致的发布渠道。

208 

209Homebrew 安装通过 cask 名称而不是此设置来选择渠道:`claude-code` 跟踪稳定版,`claude-code@latest` 跟踪最新版。

210 

211### 固定最低版本

212 

213`minimumVersion` 设置建立了一个下限。后台自动更新和 `claude update` 拒绝安装低于此值的任何版本,因此如果您已经在较新的 `"latest"` 构建上,切换到 `"stable"` 渠道不会降级您。

214 

215通过 `/config` 从 `"latest"` 切换到 `"stable"` 会提示您选择保留当前版本或允许降级。选择保留会将 `minimumVersion` 设置为该版本。切换回 `"latest"` 会清除它。

216 

217将其添加到您的 [settings.json 文件](/zh-CN/settings)以显式固定下限:

218 

219```json theme={null}

220{

221 "autoUpdatesChannel": "stable",

222 "minimumVersion": "2.1.100"

223}

224```

225 

226在[托管设置](/zh-CN/permissions#managed-settings)中,这会强制执行用户和项目设置无法覆盖的组织范围最低版本。

227 

228### 禁用自动更新

229 

230在您的 [`settings.json`](/zh-CN/settings#available-settings) 文件的 `env` 键中将 `DISABLE_AUTOUPDATER` 设置为 `"1"`:

231 

232```json theme={null}

233{

234 "env": {

235 "DISABLE_AUTOUPDATER": "1"

236 }

237}

238```

239 

240`DISABLE_AUTOUPDATER` 仅停止后台检查;`claude update` 和 `claude install` 仍然有效。要阻止所有更新路径(包括手动更新),请改为设置 [`DISABLE_UPDATES`](/zh-CN/env-vars)。当您通过自己的渠道分发 Claude Code 并需要用户保持在您提供的版本上时,请使用此选项。

241 

242### 手动更新

243 

244要立即应用更新而不等待下一次后台检查,请运行:

245 

246```bash theme={null}

247claude update

248```

249 

250## 高级安装选项

251 

252这些选项用于版本固定、Linux 包管理器、npm 和验证二进制完整性。

253 

254### 安装特定版本

255 

256原生安装程序接受特定版本号或发布渠道(`latest` 或 `stable`)。您在安装时选择的渠道将成为自动更新的默认值。有关更多信息,请参阅[配置发布渠道](#configure-release-channel)。

257 

258要安装最新版本(默认):

259 

260<Tabs>

261 <Tab title="macOS、Linux、WSL">

262 ```bash theme={null}

263 curl -fsSL https://claude.ai/install.sh | bash

264 ```

265 </Tab>

266 

267 <Tab title="Windows PowerShell">

268 ```powershell theme={null}

269 irm https://claude.ai/install.ps1 | iex

270 ```

271 </Tab>

272 

273 <Tab title="Windows CMD">

274 ```batch theme={null}

275 curl -fsSL https://claude.ai/install.cmd -o install.cmd && install.cmd && del install.cmd

276 ```

277 </Tab>

278</Tabs>

279 

280要安装稳定版本:

281 

282<Tabs>

283 <Tab title="macOS、Linux、WSL">

284 ```bash theme={null}

285 curl -fsSL https://claude.ai/install.sh | bash -s stable

286 ```

287 </Tab>

288 

289 <Tab title="Windows PowerShell">

290 ```powershell theme={null}

291 & ([scriptblock]::Create((irm https://claude.ai/install.ps1))) stable

292 ```

293 </Tab>

294 

295 <Tab title="Windows CMD">

296 ```batch theme={null}

297 curl -fsSL https://claude.ai/install.cmd -o install.cmd && install.cmd stable && del install.cmd

298 ```

299 </Tab>

300</Tabs>

301 

302要安装特定版本号:

303 

304<Tabs>

305 <Tab title="macOS、Linux、WSL">

306 ```bash theme={null}

307 curl -fsSL https://claude.ai/install.sh | bash -s 2.1.89

308 ```

309 </Tab>

310 

311 <Tab title="Windows PowerShell">

312 ```powershell theme={null}

313 & ([scriptblock]::Create((irm https://claude.ai/install.ps1))) 2.1.89

314 ```

315 </Tab>

316 

317 <Tab title="Windows CMD">

318 ```batch theme={null}

319 curl -fsSL https://claude.ai/install.cmd -o install.cmd && install.cmd 2.1.89 && del install.cmd

320 ```

321 </Tab>

322</Tabs>

323 

324### 使用 Linux 包管理器安装

325 

326Claude Code 发布已签名的 apt、dnf 和 apk 存储库。将 `stable` 替换为 `latest` 以使用滚动渠道。包管理器安装不会通过 Claude Code 自动更新;更新通过您的正常系统升级工作流程进行。

327 

328所有存储库都使用 [Claude Code 发布签名密钥](#binary-integrity-and-code-signing)进行签名。在信任密钥之前,请按照每个选项卡中的说明验证它。

329 

330<Tabs>

331 <Tab title="apt">

332 适用于 Debian 和 Ubuntu。要使用滚动渠道,请更改 `deb` 行中的两个 `stable` 出现:URL 路径和套件名称。

333 

334 ```bash theme={null}

335 sudo install -d -m 0755 /etc/apt/keyrings

336 sudo curl -fsSL https://downloads.claude.ai/keys/claude-code.asc \

337 -o /etc/apt/keyrings/claude-code.asc

338 echo "deb [signed-by=/etc/apt/keyrings/claude-code.asc] https://downloads.claude.ai/claude-code/apt/stable stable main" \

339 | sudo tee /etc/apt/sources.list.d/claude-code.list

340 sudo apt update

341 sudo apt install claude-code

342 ```

343 

344 在信任之前验证 GPG 密钥指纹:`gpg --show-keys /etc/apt/keyrings/claude-code.asc` 应该报告 `31DD DE24 DDFA B679 F42D 7BD2 BAA9 29FF 1A7E CACE`。

345 

346 要稍后升级,请运行 `sudo apt update && sudo apt upgrade claude-code`。

347 </Tab>

348 

349 <Tab title="dnf">

350 适用于 Fedora 和 RHEL:

351 

352 ```bash theme={null}

353 sudo tee /etc/yum.repos.d/claude-code.repo <<'EOF'

354 [claude-code]

355 name=Claude Code

356 baseurl=https://downloads.claude.ai/claude-code/rpm/stable

357 enabled=1

358 gpgcheck=1

359 gpgkey=https://downloads.claude.ai/keys/claude-code.asc

360 EOF

361 sudo dnf install claude-code

362 ```

363 

364 dnf 在首次安装时下载密钥并提示您确认指纹。在接受之前验证它与 `31DD DE24 DDFA B679 F42D 7BD2 BAA9 29FF 1A7E CACE` 匹配。

365 

366 要稍后升级,请运行 `sudo dnf upgrade claude-code`。

367 </Tab>

368 

369 <Tab title="apk">

370 适用于 Alpine Linux:

371 

372 ```sh theme={null}

373 wget -O /etc/apk/keys/claude-code.rsa.pub \

374 https://downloads.claude.ai/keys/claude-code.rsa.pub

375 echo "https://downloads.claude.ai/claude-code/apk/stable" >> /etc/apk/repositories

376 apk add claude-code

377 ```

378 

379 使用 `sha256sum /etc/apk/keys/claude-code.rsa.pub` 验证下载的密钥,应该报告 `395759c1f7449ef4cdef305a42e820f3c766d6090d142634ebdb049f113168b6`。

380 

381 要稍后升级,请运行 `apk update && apk upgrade claude-code`。

382 </Tab>

383</Tabs>

384 

385### 使用 npm 安装

386 

387您也可以将 Claude Code 安装为全局 npm 包。该包需要 [Node.js 18 或更高版本](https://nodejs.org/en/download)。

388 

389```bash theme={null}

390npm install -g @anthropic-ai/claude-code

391```

392 

393npm 包安装与独立安装程序相同的原生二进制文件。npm 通过每个平台的可选依赖项(如 `@anthropic-ai/claude-code-darwin-arm64`)拉取二进制文件,并通过 postinstall 步骤将其链接到位。已安装的 `claude` 二进制文件本身不调用 Node。

394 

395支持的 npm 安装平台是 `darwin-arm64`、`darwin-x64`、`linux-x64`、`linux-arm64`、`linux-x64-musl`、`linux-arm64-musl`、`win32-x64` 和 `win32-arm64`。您的包管理器必须允许可选依赖项。如果安装后二进制文件丢失,请参阅[故障排除](/zh-CN/troubleshoot-install#native-binary-not-found-after-npm-install)。

396 

397<Warning>

398 不要使用 `sudo npm install -g`,因为这可能导致权限问题和安全风险。如果遇到权限错误,请参阅[故障排除权限错误](/zh-CN/troubleshoot-install#permission-errors-during-installation)。

399</Warning>

400 

401### 二进制完整性和代码签名

402 

403每个发布都发布一个 `manifest.json`,其中包含每个平台二进制文件的 SHA256 校验和。清单使用 Anthropic GPG 密钥签名,因此验证清单上的签名可以传递地验证它列出的每个二进制文件。

404 

405#### 验证清单签名

406 

407步骤 1-3 需要带有 `gpg` 和 `curl` 的 POSIX shell。在 Windows 上,在 Git Bash 或 WSL 中运行它们。步骤 4 包括 PowerShell 选项。

408 

409<Steps>

410 <Step title="下载并导入公钥">

411 发布签名密钥发布在固定 URL。

412 

413 ```bash theme={null}

414 curl -fsSL https://downloads.claude.ai/keys/claude-code.asc | gpg --import

415 ```

416 

417 显示导入的密钥的指纹。

418 

419 ```bash theme={null}

420 gpg --fingerprint security@anthropic.com

421 ```

422 

423 确认输出包含此指纹:

424 

425 ```text theme={null}

426 31DD DE24 DDFA B679 F42D 7BD2 BAA9 29FF 1A7E CACE

427 ```

428 </Step>

429 

430 <Step title="下载清单和签名">

431 将 `VERSION` 设置为您要验证的发布。

432 

433 ```bash theme={null}

434 REPO=https://downloads.claude.ai/claude-code-releases

435 VERSION=2.1.89

436 curl -fsSLO "$REPO/$VERSION/manifest.json"

437 curl -fsSLO "$REPO/$VERSION/manifest.json.sig"

438 ```

439 </Step>

440 

441 <Step title="验证签名">

442 针对清单验证分离的签名。

443 

444 ```bash theme={null}

445 gpg --verify manifest.json.sig manifest.json

446 ```

447 

448 有效的结果报告 `Good signature from "Anthropic Claude Code Release Signing <security@anthropic.com>"`。

449 

450 `gpg` 也会为任何新导入的密钥打印 `WARNING: This key is not certified with a trusted signature!`。这是预期的。`Good signature` 行确认密码学检查通过。第 1 步中的指纹比较确认密钥本身是真实的。

451 </Step>

452 

453 <Step title="根据清单检查二进制文件">

454 将您下载的二进制文件的 SHA256 校验和与 `manifest.json` 中 `platforms.<platform>.checksum` 下列出的值进行比较。

455 

456 <Tabs>

457 <Tab title="Linux">

458 ```bash theme={null}

459 sha256sum claude

460 ```

461 </Tab>

462 

463 <Tab title="macOS">

464 ```bash theme={null}

465 shasum -a 256 claude

466 ```

467 </Tab>

468 

469 <Tab title="Windows PowerShell">

470 ```powershell theme={null}

471 (Get-FileHash claude.exe -Algorithm SHA256).Hash.ToLower()

472 ```

473 </Tab>

474 </Tabs>

475 </Step>

476</Steps>

477 

478<Note>

479 清单签名可用于 `2.1.89` 及以后的发布。较早的发布在 `manifest.json` 中发布校验和,但没有分离的签名。

480</Note>

481 

482#### 平台代码签名

483 

484除了签名的清单外,各个二进制文件在支持的地方还带有平台原生代码签名。

485 

486* **macOS**:由"Anthropic PBC"签名并由 Apple 公证。使用 `codesign --verify --verbose ./claude` 验证。

487* **Windows**:由"Anthropic, PBC"签名。使用 `Get-AuthenticodeSignature .\claude.exe` 验证。

488* **Linux**:二进制文件不单独进行代码签名。如果您直接从 `claude-code-releases` 存储桶下载或使用原生安装程序,请使用上面的清单签名验证完整性。如果您使用 [apt、dnf 或 apk](#install-with-linux-package-managers) 安装,您的包管理器会使用存储库签名密钥自动验证签名。

489 

490## 卸载 Claude Code

491 

492要删除 Claude Code,请按照您的安装方法的说明进行操作。

493 

494### 原生安装

495 

496删除 Claude Code 二进制文件和版本文件:

497 

498<Tabs>

499 <Tab title="macOS、Linux、WSL">

500 ```bash theme={null}

501 rm -f ~/.local/bin/claude

502 rm -rf ~/.local/share/claude

503 ```

504 </Tab>

505 

506 <Tab title="Windows PowerShell">

507 ```powershell theme={null}

508 Remove-Item -Path "$env:USERPROFILE\.local\bin\claude.exe" -Force

509 Remove-Item -Path "$env:USERPROFILE\.local\share\claude" -Recurse -Force

510 ```

511 </Tab>

512</Tabs>

513 

514### Homebrew 安装

515 

516删除您安装的 Homebrew cask。如果您安装了稳定版 cask:

517 

518```bash theme={null}

519brew uninstall --cask claude-code

520```

521 

522如果您安装了最新版 cask:

523 

524```bash theme={null}

525brew uninstall --cask claude-code@latest

526```

527 

528### WinGet 安装

529 

530删除 WinGet 包:

531 

532```powershell theme={null}

533winget uninstall Anthropic.ClaudeCode

534```

535 

536### apt / dnf / apk

537 

538删除包和存储库配置:

539 

540<Tabs>

541 <Tab title="apt">

542 ```bash theme={null}

543 sudo apt remove claude-code

544 sudo rm /etc/apt/sources.list.d/claude-code.list /etc/apt/keyrings/claude-code.asc

545 ```

546 </Tab>

547 

548 <Tab title="dnf">

549 ```bash theme={null}

550 sudo dnf remove claude-code

551 sudo rm /etc/yum.repos.d/claude-code.repo

552 ```

553 </Tab>

554 

555 <Tab title="apk">

556 ```sh theme={null}

557 apk del claude-code

558 sed -i '\|downloads.claude.ai/claude-code/apk|d' /etc/apk/repositories

559 rm /etc/apk/keys/claude-code.rsa.pub

560 ```

561 </Tab>

562</Tabs>

563 

564### npm

565 

566删除全局 npm 包:

567 

568```bash theme={null}

569npm uninstall -g @anthropic-ai/claude-code

570```

571 

572### 删除配置文件

573 

574<Warning>

575 删除配置文件将删除您的所有设置、允许的工具、MCP 服务器配置和会话历史记录。

576</Warning>

577 

578VS Code 扩展、JetBrains 插件和桌面应用也会写入 `~/.claude/`。如果其中任何一个仍然安装,下次运行时目录会被重新创建。要完全删除 Claude Code,请在删除这些文件之前卸载 [VS Code 扩展](/zh-CN/vs-code#uninstall-the-extension)、JetBrains 插件和桌面应用。

579 

580要删除 Claude Code 设置和缓存数据:

581 

582<Tabs>

583 <Tab title="macOS、Linux、WSL">

584 ```bash theme={null}

585 # 删除用户设置和状态

586 rm -rf ~/.claude

587 rm ~/.claude.json

588 

589 # 删除特定于项目的设置(从您的项目目录运行)

590 rm -rf .claude

591 rm -f .mcp.json

592 ```

593 </Tab>

594 

595 <Tab title="Windows PowerShell">

596 ```powershell theme={null}

597 # 删除用户设置和状态

598 Remove-Item -Path "$env:USERPROFILE\.claude" -Recurse -Force

599 Remove-Item -Path "$env:USERPROFILE\.claude.json" -Force

600 

601 # 删除特定于项目的设置(从您的项目目录运行)

602 Remove-Item -Path ".claude" -Recurse -Force

603 Remove-Item -Path ".mcp.json" -Force

604 ```

605 </Tab>

606</Tabs>

skills.md +728 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 使用 skills 扩展 Claude

6 

7> 创建、管理和共享 skills 以在 Claude Code 中扩展 Claude 的功能。包括自定义命令和捆绑 skills。

8 

9Skills 扩展了 Claude 能做的事情。创建一个 `SKILL.md` 文件,其中包含说明,Claude 会将其添加到其工具包中。Claude 在相关时使用 skills,或者你可以使用 `/skill-name` 直接调用一个。

10 

11当你不断将相同的剧本、检查清单或多步骤程序粘贴到聊天中时,或者当 CLAUDE.md 的一部分已经演变成程序而不是事实时,创建一个 skill。与 CLAUDE.md 内容不同,skill 的正文仅在使用时加载,因此长参考资料在你需要它之前几乎不花费任何成本。

12 

13<Note>

14 对于内置命令(如 `/help` 和 `/compact`)以及捆绑 skills(如 `/debug` 和 `/simplify`),请参阅[命令参考](/zh-CN/commands)。

15 

16 **自定义命令已合并到 skills 中。** `.claude/commands/deploy.md` 中的文件和 `.claude/skills/deploy/SKILL.md` 中的 skill 都会创建 `/deploy` 并以相同的方式工作。你现有的 `.claude/commands/` 文件继续工作。Skills 添加了可选功能:支持文件的目录、[控制你或 Claude 是否调用它们](#control-who-invokes-a-skill)的 frontmatter,以及 Claude 在相关时自动加载它们的能力。

17</Note>

18 

19Claude Code skills 遵循 [Agent Skills](https://agentskills.io) 开放标准,该标准适用于多个 AI 工具。Claude Code 使用额外功能扩展了该标准,如[调用控制](#control-who-invokes-a-skill)、[subagent 执行](#run-skills-in-a-subagent)和[动态上下文注入](#inject-dynamic-context)。

20 

21## 捆绑 skills

22 

23Claude Code 包括一组捆绑 skills,在每个会话中都可用,包括 `/simplify`、`/batch`、`/debug`、`/loop` 和 `/claude-api`。与大多数内置命令不同,内置命令直接执行固定逻辑,捆绑 skills 是基于提示的:它们为 Claude 提供详细的剧本,让它使用其工具来编排工作。你调用捆绑 skills 的方式与调用任何其他 skill 相同,输入 `/` 后跟 skill 名称。

24 

25捆绑 skills 在[命令参考](/zh-CN/commands)中与内置命令一起列出,在"目的"列中标记为 **Skill**。

26 

27## 入门

28 

29### 创建你的第一个 skill

30 

31此示例创建一个 skill,教 Claude 使用视觉图表和类比来解释代码。由于它使用默认 frontmatter,Claude 可以在你询问某事如何工作时自动加载它,或者你可以使用 `/explain-code` 直接调用它。

32 

33<Steps>

34 <Step title="创建 skill 目录">

35 在你的个人 skills 文件夹中为 skill 创建一个目录。个人 skills 在你的所有项目中都可用。

36 

37 ```bash theme={null}

38 mkdir -p ~/.claude/skills/explain-code

39 ```

40 </Step>

41 

42 <Step title="编写 SKILL.md">

43 每个 skill 都需要一个 `SKILL.md` 文件,包含两部分:YAML frontmatter(在 `---` 标记之间)告诉 Claude 何时使用该 skill,以及包含 Claude 在调用该 skill 时遵循的说明的 markdown 内容。目录名称变成 `/slash-command`,`description` 帮助 Claude 决定何时自动加载它。

44 

45 创建 `~/.claude/skills/explain-code/SKILL.md`:

46 

47 ```yaml theme={null}

48 ---

49 description: Explains code with visual diagrams and analogies. Use when explaining how code works, teaching about a codebase, or when the user asks "how does this work?"

50 ---

51 

52 When explaining code, always include:

53 

54 1. **Start with an analogy**: Compare the code to something from everyday life

55 2. **Draw a diagram**: Use ASCII art to show the flow, structure, or relationships

56 3. **Walk through the code**: Explain step-by-step what happens

57 4. **Highlight a gotcha**: What's a common mistake or misconception?

58 

59 Keep explanations conversational. For complex concepts, use multiple analogies.

60 ```

61 </Step>

62 

63 <Step title="测试 skill">

64 你可以通过两种方式测试它:

65 

66 **让 Claude 自动调用它**,通过询问与描述匹配的内容:

67 

68 ```text theme={null}

69 How does this code work?

70 ```

71 

72 **或直接使用 skill 名称调用它**:

73 

74 ```text theme={null}

75 /explain-code src/auth/login.ts

76 ```

77 

78 无论哪种方式,Claude 都应该在其解释中包含类比和 ASCII 图表。

79 </Step>

80</Steps>

81 

82### Skills 的位置

83 

84你存储 skill 的位置决定了谁可以使用它:

85 

86| 位置 | 路径 | 适用于 |

87| :- | :---------------------------------------- | :--------- |

88| 企业 | 请参阅[托管设置](/zh-CN/settings#settings-files) | 你的组织中的所有用户 |

89| 个人 | `~/.claude/skills/<skill-name>/SKILL.md` | 你的所有项目 |

90| 项目 | `.claude/skills/<skill-name>/SKILL.md` | 仅此项目 |

91| 插件 | `<plugin>/skills/<skill-name>/SKILL.md` | 启用插件的位置 |

92 

93当 skills 在各个级别共享相同的名称时,企业覆盖个人,个人覆盖项目。插件 skills 使用 `plugin-name:skill-name` 命名空间,因此它们不能与其他级别冲突。如果你在 `.claude/commands/` 中有文件,它们的工作方式相同,但如果 skill 和命令共享相同的名称,skill 优先。

94 

95#### 实时变更检测

96 

97Claude Code 监视 skill 目录的文件变更。在 `~/.claude/skills/`、项目 `.claude/skills/` 或 `--add-dir` 目录内的 `.claude/skills/` 中添加、编辑或删除 skill 会在当前会话中生效,无需重新启动。创建在会话启动时不存在的顶级 skills 目录需要重新启动 Claude Code,以便可以监视新目录。

98 

99#### 从嵌套目录自动发现

100 

101当你在子目录中处理文件时,Claude Code 会自动从嵌套的 `.claude/skills/` 目录中发现 skills。例如,如果你正在编辑 `packages/frontend/` 中的文件,Claude Code 也会在 `packages/frontend/.claude/skills/` 中查找 skills。这支持 monorepo 设置,其中包有自己的 skills。

102 

103每个 skill 都是一个以 `SKILL.md` 作为入口点的目录:

104 

105```text theme={null}

106my-skill/

107├── SKILL.md # 主要说明(必需)

108├── template.md # Claude 要填写的模板

109├── examples/

110│ └── sample.md # 显示预期格式的示例输出

111└── scripts/

112 └── validate.sh # Claude 可以执行的脚本

113```

114 

115`SKILL.md` 包含主要说明,是必需的。其他文件是可选的,让你构建更强大的 skills:Claude 要填写的模板、显示预期格式的示例输出、Claude 可以执行的脚本或详细的参考文档。从你的 `SKILL.md` 中引用支持文件,以便 Claude 知道每个文件包含什么以及何时加载它。有关更多详细信息,请参阅[添加支持文件](#add-supporting-files)。

116 

117<Note>

118 `.claude/commands/` 中的文件仍然有效,并支持相同的 [frontmatter](#frontmatter-reference)。建议使用 Skills,因为它们支持额外的功能,如支持文件。

119</Note>

120 

121#### 来自其他目录的 skills

122 

123`--add-dir` 标志[授予文件访问权限](/zh-CN/permissions#additional-directories-grant-file-access-not-configuration)而不是配置发现,但 skills 是一个例外:添加目录中的 `.claude/skills/` 会自动加载。请参阅[实时变更检测](#live-change-detection)了解编辑如何在会话期间被拾取。

124 

125其他 `.claude/` 配置(如 subagents、命令和输出样式)不会从其他目录加载。有关加载和不加载的完整列表以及跨项目共享配置的推荐方式,请参阅[例外表](/zh-CN/permissions#additional-directories-grant-file-access-not-configuration)。

126 

127<Note>

128 来自 `--add-dir` 目录的 CLAUDE.md 文件默认不加载。要加载它们,请设置 `CLAUDE_CODE_ADDITIONAL_DIRECTORIES_CLAUDE_MD=1`。请参阅[从其他目录加载](/zh-CN/memory#load-from-additional-directories)。

129</Note>

130 

131## 配置 skills

132 

133Skills 通过 `SKILL.md` 顶部的 YAML frontmatter 和随后的 markdown 内容进行配置。

134 

135### Skill 内容的类型

136 

137Skill 文件可以包含任何说明,但思考你想如何调用它们有助于指导要包含的内容:

138 

139**参考内容**添加 Claude 应用于你当前工作的知识。约定、模式、风格指南、领域知识。此内容内联运行,以便 Claude 可以将其与你的对话上下文一起使用。

140 

141```yaml theme={null}

142---

143name: api-conventions

144description: API design patterns for this codebase

145---

146 

147When writing API endpoints:

148- Use RESTful naming conventions

149- Return consistent error formats

150- Include request validation

151```

152 

153**任务内容**为 Claude 提供特定操作的分步说明,如部署、提交或代码生成。这些通常是你想使用 `/skill-name` 直接调用的操作,而不是让 Claude 决定何时运行它们。添加 `disable-model-invocation: true` 以防止 Claude 自动触发它。

154 

155```yaml theme={null}

156---

157name: deploy

158description: Deploy the application to production

159context: fork

160disable-model-invocation: true

161---

162 

163Deploy the application:

1641. Run the test suite

1652. Build the application

1663. Push to the deployment target

167```

168 

169你的 `SKILL.md` 可以包含任何内容,但思考你想如何调用该 skill(由你、由 Claude 或两者)以及你想在哪里运行它(内联或在 subagent 中)有助于指导要包含的内容。对于复杂的 skills,你也可以[添加支持文件](#add-supporting-files)以保持主 skill 的专注。

170 

171### Frontmatter 参考

172 

173除了 markdown 内容外,你可以使用 `SKILL.md` 文件顶部 `---` 标记之间的 YAML frontmatter 字段来配置 skill 行为:

174 

175```yaml theme={null}

176---

177name: my-skill

178description: What this skill does

179disable-model-invocation: true

180allowed-tools: Read Grep

181---

182 

183Your skill instructions here...

184```

185 

186所有字段都是可选的。建议使用 `description`,以便 Claude 知道何时使用该 skill。

187 

188| 字段 | 必需 | 描述 |

189| :------------------------- | :- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

190| `name` | 否 | Skill 的显示名称。如果省略,使用目录名称。仅小写字母、数字和连字符(最多 64 个字符)。 |

191| `description` | 推荐 | Skill 的功能以及何时使用它。Claude 使用它来决定何时应用该 skill。如果省略,使用 markdown 内容的第一段。前置关键用例:组合的 `description` 和 `when_to_use` 文本在技能列表中被截断为 1,536 个字符以减少上下文使用。 |

192| `when_to_use` | 否 | 关于 Claude 何时应该调用该 skill 的额外上下文,例如触发短语或示例请求。附加到技能列表中的 `description`,并计入 1,536 个字符的上限。 |

193| `argument-hint` | 否 | 自动完成期间显示的提示,指示预期的参数。示例:`[issue-number]` 或 `[filename] [format]`。 |

194| `arguments` | 否 | 用于 skill 内容中[`$name` 替换](#available-string-substitutions)的命名位置参数。接受空格分隔的字符串或 YAML 列表。名称按顺序映射到参数位置。 |

195| `disable-model-invocation` | 否 | 设置为 `true` 以防止 Claude 自动加载此 skill。用于你想使用 `/name` 手动触发的工作流。也防止该 skill 被[预加载到 subagents](/zh-CN/sub-agents#preload-skills-into-subagents) 中。默认值:`false`。 |

196| `user-invocable` | 否 | 设置为 `false` 以从 `/` 菜单中隐藏。用于用户不应直接调用的背景知识。默认值:`true`。 |

197| `allowed-tools` | 否 | 当此 skill 处于活动状态时,Claude 可以使用而无需请求权限的工具。接受空格分隔的字符串或 YAML 列表。 |

198| `model` | 否 | 当此 skill 处于活动状态时要使用的模型。覆盖适用于当前轮的其余部分,不保存到设置;会话模型在你的下一个提示时恢复。接受与 [`/model`](/zh-CN/model-config) 相同的值,或 `inherit` 以保持活动模型。 |

199| `effort` | 否 | 当此 skill 处于活动状态时的[工作量级别](/zh-CN/model-config#adjust-effort-level)。覆盖会话工作量级别。默认值:继承自会话。选项:`low`、`medium`、`high`、`xhigh`、`max`;可用级别取决于模型。 |

200| `context` | 否 | 设置为 `fork` 以在分叉的 subagent 上下文中运行。 |

201| `agent` | 否 | 当设置 `context: fork` 时要使用的 subagent 类型。 |

202| `hooks` | 否 | 限定于此 skill 生命周期的 hooks。有关配置格式,请参阅 [Skills 和代理中的 Hooks](/zh-CN/hooks#hooks-in-skills-and-agents)。 |

203| `paths` | 否 | Glob 模式,限制何时激活此 skill。接受逗号分隔的字符串或 YAML 列表。设置后,Claude 仅在处理与模式匹配的文件时自动加载该 skill。使用与[路径特定规则](/zh-CN/memory#path-specific-rules)相同的格式。 |

204| `shell` | 否 | 用于此 skill 中 `` !`command` `` 和 ` ```! ` 块的 shell。接受 `bash`(默认)或 `powershell`。设置 `powershell` 在 Windows 上通过 PowerShell 运行内联 shell 命令。需要 `CLAUDE_CODE_USE_POWERSHELL_TOOL=1`。 |

205 

206#### 可用的字符串替换

207 

208Skills 支持 skill 内容中动态值的字符串替换:

209 

210| 变量 | 描述 |

211| :--------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------ |

212| `$ARGUMENTS` | 调用 skill 时传递的所有参数。如果内容中不存在 `$ARGUMENTS`,参数将作为 `ARGUMENTS: <value>` 追加。 |

213| `$ARGUMENTS[N]` | 按 0 基索引访问特定参数,如 `$ARGUMENTS[0]` 表示第一个参数。 |

214| `$N` | `$ARGUMENTS[N]` 的简写,如 `$0` 表示第一个参数或 `$1` 表示第二个参数。 |

215| `$name` | 在 [`arguments`](#frontmatter-reference) frontmatter 列表中声明的命名参数。名称按顺序映射到位置,因此使用 `arguments: [issue, branch]` 时,占位符 `$issue` 扩展为第一个参数,`$branch` 扩展为第二个参数。 |

216| `${CLAUDE_SESSION_ID}` | 当前会话 ID。适用于日志记录、创建会话特定文件或将 skill 输出与会话关联。 |

217| `${CLAUDE_EFFORT}` | 当前工作量级别:`low`、`medium`、`high`、`xhigh` 或 `max`。使用此来根据活动工作量设置调整 skill 说明。 |

218| `${CLAUDE_SKILL_DIR}` | 包含 skill 的 `SKILL.md` 文件的目录。对于插件 skills,这是插件内 skill 的子目录,而不是插件根目录。在 bash 注入命令中使用它来引用与 skill 捆绑的脚本或文件,无论当前工作目录如何。 |

219 

220索引参数使用 shell 风格的引用,因此用引号包装多词值以将其作为单个参数传递。例如,`/my-skill "hello world" second` 使 `$0` 扩展为 `hello world`,`$1` 扩展为 `second`。`$ARGUMENTS` 占位符始终扩展为完整的参数字符串,如输入的那样。

221 

222**使用替换的示例:**

223 

224```yaml theme={null}

225---

226name: session-logger

227description: Log activity for this session

228---

229 

230Log the following to logs/${CLAUDE_SESSION_ID}.log:

231 

232$ARGUMENTS

233```

234 

235### 添加支持文件

236 

237Skills 可以在其目录中包含多个文件。这使 `SKILL.md` 专注于要点,同时让 Claude 仅在需要时访问详细的参考资料。大型参考文档、API 规范或示例集合不需要在每次 skill 运行时加载到上下文中。

238 

239```text theme={null}

240my-skill/

241├── SKILL.md (required - overview and navigation)

242├── reference.md (detailed API docs - loaded when needed)

243├── examples.md (usage examples - loaded when needed)

244└── scripts/

245 └── helper.py (utility script - executed, not loaded)

246```

247 

248从 `SKILL.md` 中引用支持文件,以便 Claude 知道每个文件包含什么以及何时加载它:

249 

250```markdown theme={null}

251## Additional resources

252 

253- For complete API details, see [reference.md](reference.md)

254- For usage examples, see [examples.md](examples.md)

255```

256 

257<Tip>将 `SKILL.md` 保持在 500 行以下。将详细的参考资料移到单独的文件中。</Tip>

258 

259### 控制谁调用 skill

260 

261默认情况下,你和 Claude 都可以调用任何 skill。你可以输入 `/skill-name` 直接调用它,Claude 可以在与你的对话相关时自动加载它。两个 frontmatter 字段让你限制这一点:

262 

263* **`disable-model-invocation: true`**:只有你可以调用该 skill。用于有副作用的工作流或你想控制时间的工作流,如 `/commit`、`/deploy` 或 `/send-slack-message`。你不希望 Claude 因为你的代码看起来准备好了就决定部署。

264 

265* **`user-invocable: false`**:只有 Claude 可以调用该 skill。用于不可作为命令操作的背景知识。`legacy-system-context` skill 解释了旧系统的工作原理。Claude 在相关时应该知道这一点,但 `/legacy-system-context` 对用户来说不是一个有意义的操作。

266 

267此示例创建一个只有你可以触发的部署 skill。`disable-model-invocation: true` 字段防止 Claude 自动运行它:

268 

269```yaml theme={null}

270---

271name: deploy

272description: Deploy the application to production

273disable-model-invocation: true

274---

275 

276Deploy $ARGUMENTS to production:

277 

2781. Run the test suite

2792. Build the application

2803. Push to the deployment target

2814. Verify the deployment succeeded

282```

283 

284以下是两个字段如何影响调用和上下文加载:

285 

286| Frontmatter | 你可以调用 | Claude 可以调用 | 何时加载到上下文中 |

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

288| (默认) | 是 | 是 | 描述始终在上下文中,调用时加载完整 skill |

289| `disable-model-invocation: true` | 是 | 否 | 描述不在上下文中,你调用时加载完整 skill |

290| `user-invocable: false` | 否 | 是 | 描述始终在上下文中,调用时加载完整 skill |

291 

292<Note>

293 在常规会话中,skill 描述被加载到上下文中,以便 Claude 知道什么可用,但完整 skill 内容仅在调用时加载。[预加载 skills 的 Subagents](/zh-CN/sub-agents#preload-skills-into-subagents) 的工作方式不同:完整 skill 内容在启动时注入。

294</Note>

295 

296### Skill 内容生命周期

297 

298当你或 Claude 调用一个 skill 时,呈现的 `SKILL.md` 内容作为单个消息进入对话,并在会话的其余部分保持在那里。Claude Code 不会在后续轮次重新读取 skill 文件,因此将应该在整个任务中应用的指导写成常设说明,而不是一次性步骤。

299 

300[自动压缩](/zh-CN/how-claude-code-works#when-context-fills-up)在令牌预算内转发调用的 skills。当对话被总结以释放上下文时,Claude Code 在总结后重新附加每个 skill 的最新调用,保留前 5,000 个令牌。重新附加的 skills 共享 25,000 个令牌的组合预算。Claude Code 从最近调用的 skill 开始填充此预算,因此如果你在一个会话中调用了许多 skills,较旧的 skills 可能会在压缩后完全删除。

301 

302如果一个 skill 似乎在第一个响应后停止影响行为,内容通常仍然存在,模型正在选择其他工具或方法。加强 skill 的 `description` 和说明,以便模型继续偏好它,或使用 [hooks](/zh-CN/hooks) 来确定性地强制行为。如果 skill 很大或你在它之后调用了其他几个,在压缩后重新调用它以恢复完整内容。

303 

304### 为 skill 预先批准工具

305 

306`allowed-tools` 字段在 skill 处于活动状态时授予对列出的工具的权限,因此 Claude 可以使用它们而无需提示你获得批准。它不限制哪些工具可用:每个工具仍然可调用,你的[权限设置](/zh-CN/permissions)仍然管理不在列表中的工具。

307 

308此 skill 让 Claude 在你调用它时运行 git 命令而无需每次使用批准:

309 

310```yaml theme={null}

311---

312name: commit

313description: Stage and commit the current changes

314disable-model-invocation: true

315allowed-tools: Bash(git add *) Bash(git commit *) Bash(git status *)

316---

317```

318 

319要阻止 skill 使用某些工具,请在你的[权限设置](/zh-CN/permissions)中添加拒绝规则。

320 

321### 将参数传递给 skills

322 

323你和 Claude 都可以在调用 skill 时传递参数。参数可通过 `$ARGUMENTS` 占位符获得。

324 

325此 skill 按编号修复 GitHub 问题。`$ARGUMENTS` 占位符被替换为 skill 名称后面的任何内容:

326 

327```yaml theme={null}

328---

329name: fix-issue

330description: Fix a GitHub issue

331disable-model-invocation: true

332---

333 

334Fix GitHub issue $ARGUMENTS following our coding standards.

335 

3361. Read the issue description

3372. Understand the requirements

3383. Implement the fix

3394. Write tests

3405. Create a commit

341```

342 

343当你运行 `/fix-issue 123` 时,Claude 收到"Fix GitHub issue 123 following our coding standards..."

344 

345如果你使用参数调用 skill 但 skill 不包含 `$ARGUMENTS`,Claude Code 会将 `ARGUMENTS: <your input>` 追加到 skill 内容的末尾,以便 Claude 仍然看到你输入的内容。

346 

347要按位置访问单个参数,使用 `$ARGUMENTS[N]` 或较短的 `$N`:

348 

349```yaml theme={null}

350---

351name: migrate-component

352description: Migrate a component from one framework to another

353---

354 

355Migrate the $ARGUMENTS[0] component from $ARGUMENTS[1] to $ARGUMENTS[2].

356Preserve all existing behavior and tests.

357```

358 

359运行 `/migrate-component SearchBar React Vue` 会将 `$ARGUMENTS[0]` 替换为 `SearchBar`,`$ARGUMENTS[1]` 替换为 `React`,`$ARGUMENTS[2]` 替换为 `Vue`。使用 `$N` 简写的相同 skill:

360 

361```yaml theme={null}

362---

363name: migrate-component

364description: Migrate a component from one framework to another

365---

366 

367Migrate the $0 component from $1 to $2.

368Preserve all existing behavior and tests.

369```

370 

371## 高级模式

372 

373### 注入动态上下文

374 

375`` !`<command>` `` 语法在将 skill 内容发送给 Claude 之前运行 shell 命令。命令输出替换占位符,因此 Claude 接收实际数据,而不是命令本身。

376 

377此 skill 通过使用 GitHub CLI 获取实时 PR 数据来总结拉取请求。`` !`gh pr diff` `` 和其他命令首先运行,其输出被插入到提示中:

378 

379```yaml theme={null}

380---

381name: pr-summary

382description: Summarize changes in a pull request

383context: fork

384agent: Explore

385allowed-tools: Bash(gh *)

386---

387 

388## Pull request context

389- PR diff: !`gh pr diff`

390- PR comments: !`gh pr view --comments`

391- Changed files: !`gh pr diff --name-only`

392 

393## Your task

394Summarize this pull request...

395```

396 

397当此 skill 运行时:

398 

3991. 每个 `` !`<command>` `` 立即执行(在 Claude 看到任何内容之前)

4002. 输出替换 skill 内容中的占位符

4013. Claude 接收带有实际 PR 数据的完全呈现的提示

402 

403这是预处理,不是 Claude 执行的内容。Claude 只看到最终结果。

404 

405对于多行命令,使用以 ` ```! ` 开头的围栏代码块而不是内联形式:

406 

407````markdown theme={null}

408## Environment

409```!

410node --version

411npm --version

412git status --short

413```

414````

415 

416要禁用来自用户、项目、插件或[其他目录](#skills-from-additional-directories)源的 skills 和自定义命令的此行为,请在[设置](/zh-CN/settings)中设置 `"disableSkillShellExecution": true`。每个命令都被替换为 `[shell command execution disabled by policy]` 而不是被运行。捆绑和托管 skills 不受影响。此设置在[托管设置](/zh-CN/permissions#managed-settings)中最有用,用户无法覆盖它。

417 

418<Tip>

419 要在 skill 中启用[扩展思考](/zh-CN/common-workflows#use-extended-thinking-thinking-mode),在你的 skill 内容中的任何地方包含单词"ultrathink"。

420</Tip>

421 

422### 在 subagent 中运行 skills

423 

424当你想让 skill 在隔离中运行时,在你的 frontmatter 中添加 `context: fork`。skill 内容变成驱动 subagent 的提示。它将无法访问你的对话历史。

425 

426<Warning>

427 `context: fork` 仅对具有明确说明的 skills 有意义。如果你的 skill 包含"使用这些 API 约定"之类的指南而没有任务,subagent 会收到指南但没有可操作的提示,并返回而没有有意义的输出。

428</Warning>

429 

430Skills 和 [subagents](/zh-CN/sub-agents) 以两个方向协同工作:

431 

432| 方法 | 系统提示 | 任务 | 也加载 |

433| :------------------------- | :------------------------- | :----------- | :---------------------- |

434| 带有 `context: fork` 的 Skill | 来自代理类型(`Explore`、`Plan` 等) | SKILL.md 内容 | CLAUDE.md |

435| 带有 `skills` 字段的 Subagent | Subagent 的 markdown 正文 | Claude 的委派消息 | 预加载的 skills + CLAUDE.md |

436 

437使用 `context: fork`,你在你的 skill 中编写任务并选择一个代理类型来执行它。对于反向(定义使用 skills 作为参考资料的自定义 subagent),请参阅 [Subagents](/zh-CN/sub-agents#preload-skills-into-subagents)。

438 

439#### 示例:使用 Explore 代理的研究 skill

440 

441此 skill 在分叉的 Explore 代理中运行研究。skill 内容变成任务,代理提供针对代码库探索优化的只读工具:

442 

443```yaml theme={null}

444---

445name: deep-research

446description: Research a topic thoroughly

447context: fork

448agent: Explore

449---

450 

451Research $ARGUMENTS thoroughly:

452 

4531. Find relevant files using Glob and Grep

4542. Read and analyze the code

4553. Summarize findings with specific file references

456```

457 

458当此 skill 运行时:

459 

4601. 创建一个新的隔离上下文

4612. Subagent 接收 skill 内容作为其提示("Research \$ARGUMENTS thoroughly...")

4623. `agent` 字段确定执行环境(模型、工具和权限)

4634. 结果被总结并返回到你的主对话

464 

465`agent` 字段指定要使用的 subagent 配置。选项包括内置代理(`Explore`、`Plan`、`general-purpose`)或来自 `.claude/agents/` 的任何自定义 subagent。如果省略,使用 `general-purpose`。

466 

467### 限制 Claude 的 skill 访问

468 

469默认情况下,Claude 可以调用任何没有设置 `disable-model-invocation: true` 的 skill。定义 `allowed-tools` 的 Skills 在 skill 处于活动状态时向 Claude 授予对这些工具的访问权限,无需每次使用批准。你的[权限设置](/zh-CN/permissions)仍然管理所有其他工具的基线批准行为。一些内置命令也可通过 Skill 工具获得,包括 `/init`、`/review` 和 `/security-review`。其他内置命令如 `/compact` 则不能。

470 

471控制 Claude 可以调用哪些 skills 的三种方式:

472 

473**通过在 `/permissions` 中拒绝 Skill 工具来禁用所有 skills**:

474 

475```text theme={null}

476# Add to deny rules:

477Skill

478```

479 

480**使用[权限规则](/zh-CN/permissions)允许或拒绝特定 skills**:

481 

482```text theme={null}

483# Allow only specific skills

484Skill(commit)

485Skill(review-pr *)

486 

487# Deny specific skills

488Skill(deploy *)

489```

490 

491权限语法:`Skill(name)` 用于精确匹配,`Skill(name *)` 用于带有任何参数的前缀匹配。

492 

493**通过在其 frontmatter 中添加 `disable-model-invocation: true` 来隐藏单个 skills**。这会从 Claude 的上下文中完全删除该 skill。

494 

495<Note>

496 `user-invocable` 字段仅控制菜单可见性,不控制 Skill 工具访问。使用 `disable-model-invocation: true` 来阻止程序调用。

497</Note>

498 

499## 共享 skills

500 

501Skills 可以根据你的受众在不同范围内分发:

502 

503* **项目 skills**:将 `.claude/skills/` 提交到版本控制

504* **插件**:在你的[插件](/zh-CN/plugins)中创建 `skills/` 目录

505* **托管**:通过[托管设置](/zh-CN/settings#settings-files)部署组织范围内

506 

507### 生成视觉输出

508 

509Skills 可以捆绑并运行任何语言的脚本,为 Claude 提供单个提示中不可能的功能。一个强大的模式是生成视觉输出:在浏览器中打开的交互式 HTML 文件,用于探索数据、调试或创建报告。

510 

511此示例创建一个代码库浏览器:一个交互式树视图,你可以在其中展开和折叠目录、一目了然地查看文件大小,并按颜色识别文件类型。

512 

513创建 Skill 目录:

514 

515```bash theme={null}

516mkdir -p ~/.claude/skills/codebase-visualizer/scripts

517```

518 

519创建 `~/.claude/skills/codebase-visualizer/SKILL.md`。描述告诉 Claude 何时激活此 Skill,说明告诉 Claude 运行捆绑的脚本:

520 

521````yaml theme={null}

522---

523name: codebase-visualizer

524description: Generate an interactive collapsible tree visualization of your codebase. Use when exploring a new repo, understanding project structure, or identifying large files.

525allowed-tools: Bash(python *)

526---

527 

528# Codebase Visualizer

529 

530Generate an interactive HTML tree view that shows your project's file structure with collapsible directories.

531 

532## Usage

533 

534Run the visualization script from your project root:

535 

536```bash

537python ~/.claude/skills/codebase-visualizer/scripts/visualize.py .

538```

539 

540This creates `codebase-map.html` in the current directory and opens it in your default browser.

541 

542## What the visualization shows

543 

544- **Collapsible directories**: Click folders to expand/collapse

545- **File sizes**: Displayed next to each file

546- **Colors**: Different colors for different file types

547- **Directory totals**: Shows aggregate size of each folder

548````

549 

550创建 `~/.claude/skills/codebase-visualizer/scripts/visualize.py`。此脚本扫描目录树并生成一个自包含的 HTML 文件,包含:

551 

552* 一个**摘要侧边栏**,显示文件计数、目录计数、总大小和文件类型数量

553* 一个**条形图**,按文件类型(按大小排名前 8)分解代码库

554* 一个**可折叠树**,你可以在其中展开和折叠目录,带有颜色编码的文件类型指示器

555 

556该脚本需要 Python,但仅使用内置库,因此无需安装包:

557 

558```python expandable theme={null}

559#!/usr/bin/env python3

560"""Generate an interactive collapsible tree visualization of a codebase."""

561 

562import json

563import sys

564import webbrowser

565from pathlib import Path

566from collections import Counter

567 

568IGNORE = {'.git', 'node_modules', '__pycache__', '.venv', 'venv', 'dist', 'build'}

569 

570def scan(path: Path, stats: dict) -> dict:

571 result = {"name": path.name, "children": [], "size": 0}

572 try:

573 for item in sorted(path.iterdir()):

574 if item.name in IGNORE or item.name.startswith('.'):

575 continue

576 if item.is_file():

577 size = item.stat().st_size

578 ext = item.suffix.lower() or '(no ext)'

579 result["children"].append({"name": item.name, "size": size, "ext": ext})

580 result["size"] += size

581 stats["files"] += 1

582 stats["extensions"][ext] += 1

583 stats["ext_sizes"][ext] += size

584 elif item.is_dir():

585 stats["dirs"] += 1

586 child = scan(item, stats)

587 if child["children"]:

588 result["children"].append(child)

589 result["size"] += child["size"]

590 except PermissionError:

591 pass

592 return result

593 

594def generate_html(data: dict, stats: dict, output: Path) -> None:

595 ext_sizes = stats["ext_sizes"]

596 total_size = sum(ext_sizes.values()) or 1

597 sorted_exts = sorted(ext_sizes.items(), key=lambda x: -x[1])[:8]

598 colors = {

599 '.js': '#f7df1e', '.ts': '#3178c6', '.py': '#3776ab', '.go': '#00add8',

600 '.rs': '#dea584', '.rb': '#cc342d', '.css': '#264de4', '.html': '#e34c26',

601 '.json': '#6b7280', '.md': '#083fa1', '.yaml': '#cb171e', '.yml': '#cb171e',

602 '.mdx': '#083fa1', '.tsx': '#3178c6', '.jsx': '#61dafb', '.sh': '#4eaa25',

603 }

604 lang_bars = "".join(

605 f'<div class="bar-row"><span class="bar-label">{ext}</span>'

606 f'<div class="bar" style="width:{(size/total_size)*100}%;background:{colors.get(ext,"#6b7280")}"></div>'

607 f'<span class="bar-pct">{(size/total_size)*100:.1f}%</span></div>'

608 for ext, size in sorted_exts

609 )

610 def fmt(b):

611 if b < 1024: return f"{b} B"

612 if b < 1048576: return f"{b/1024:.1f} KB"

613 return f"{b/1048576:.1f} MB"

614 

615 html = f'''<!DOCTYPE html>

616<html><head>

617 <meta charset="utf-8"><title>Codebase Explorer</title>

618 <style>

619 body {{ font: 14px/1.5 system-ui, sans-serif; margin: 0; background: #1a1a2e; color: #eee; }}

620 .container {{ display: flex; height: 100vh; }}

621 .sidebar {{ width: 280px; background: #252542; padding: 20px; border-right: 1px solid #3d3d5c; overflow-y: auto; flex-shrink: 0; }}

622 .main {{ flex: 1; padding: 20px; overflow-y: auto; }}

623 h1 {{ margin: 0 0 10px 0; font-size: 18px; }}

624 h2 {{ margin: 20px 0 10px 0; font-size: 14px; color: #888; text-transform: uppercase; }}

625 .stat {{ display: flex; justify-content: space-between; padding: 8px 0; border-bottom: 1px solid #3d3d5c; }}

626 .stat-value {{ font-weight: bold; }}

627 .bar-row {{ display: flex; align-items: center; margin: 6px 0; }}

628 .bar-label {{ width: 55px; font-size: 12px; color: #aaa; }}

629 .bar {{ height: 18px; border-radius: 3px; }}

630 .bar-pct {{ margin-left: 8px; font-size: 12px; color: #666; }}

631 .tree {{ list-style: none; padding-left: 20px; }}

632 details {{ cursor: pointer; }}

633 summary {{ padding: 4px 8px; border-radius: 4px; }}

634 summary:hover {{ background: #2d2d44; }}

635 .folder {{ color: #ffd700; }}

636 .file {{ display: flex; align-items: center; padding: 4px 8px; border-radius: 4px; }}

637 .file:hover {{ background: #2d2d44; }}

638 .size {{ color: #888; margin-left: auto; font-size: 12px; }}

639 .dot {{ width: 8px; height: 8px; border-radius: 50%; margin-right: 8px; }}

640 </style>

641</head><body>

642 <div class="container">

643 <div class="sidebar">

644 <h1>📊 Summary</h1>

645 <div class="stat"><span>Files</span><span class="stat-value">{stats["files"]:,}</span></div>

646 <div class="stat"><span>Directories</span><span class="stat-value">{stats["dirs"]:,}</span></div>

647 <div class="stat"><span>Total size</span><span class="stat-value">{fmt(data["size"])}</span></div>

648 <div class="stat"><span>File types</span><span class="stat-value">{len(stats["extensions"])}</span></div>

649 <h2>By file type</h2>

650 {lang_bars}

651 </div>

652 <div class="main">

653 <h1>📁 {data["name"]}</h1>

654 <ul class="tree" id="root"></ul>

655 </div>

656 </div>

657 <script>

658 const data = {json.dumps(data)};

659 const colors = {json.dumps(colors)};

660 function fmt(b) {{ if (b < 1024) return b + ' B'; if (b < 1048576) return (b/1024).toFixed(1) + ' KB'; return (b/1048576).toFixed(1) + ' MB'; }}

661 function render(node, parent) {{

662 if (node.children) {{

663 const det = document.createElement('details');

664 det.open = parent === document.getElementById('root');

665 det.innerHTML = `<summary><span class="folder">📁 ${{node.name}}</span><span class="size">${{fmt(node.size)}}</span></summary>`;

666 const ul = document.createElement('ul'); ul.className = 'tree';

667 node.children.sort((a,b) => (b.children?1:0)-(a.children?1:0) || a.name.localeCompare(b.name));

668 node.children.forEach(c => render(c, ul));

669 det.appendChild(ul);

670 const li = document.createElement('li'); li.appendChild(det); parent.appendChild(li);

671 }} else {{

672 const li = document.createElement('li'); li.className = 'file';

673 li.innerHTML = `<span class="dot" style="background:${{colors[node.ext]||'#6b7280'}}"></span>${{node.name}}<span class="size">${{fmt(node.size)}}</span>`;

674 parent.appendChild(li);

675 }}

676 }}

677 data.children.forEach(c => render(c, document.getElementById('root')));

678 </script>

679</body></html>'''

680 output.write_text(html)

681 

682if __name__ == '__main__':

683 target = Path(sys.argv[1] if len(sys.argv) > 1 else '.').resolve()

684 stats = {"files": 0, "dirs": 0, "extensions": Counter(), "ext_sizes": Counter()}

685 data = scan(target, stats)

686 out = Path('codebase-map.html')

687 generate_html(data, stats, out)

688 print(f'Generated {out.absolute()}')

689 webbrowser.open(f'file://{out.absolute()}')

690```

691 

692要测试,在任何项目中打开 Claude Code 并询问"Visualize this codebase."Claude 运行脚本,生成 `codebase-map.html`,并在浏览器中打开它。

693 

694此模式适用于任何视觉输出:依赖关系图、测试覆盖率报告、API 文档或数据库架构可视化。捆绑的脚本完成繁重工作,而 Claude 处理编排。

695 

696## 故障排除

697 

698### Skill 未触发

699 

700如果 Claude 在预期时不使用你的 skill:

701 

7021. 检查描述是否包含用户会自然说的关键字

7032. 验证 skill 是否出现在 `What skills are available?` 中

7043. 尝试重新表述你的请求以更接近描述

7054. 如果 skill 是用户可调用的,使用 `/skill-name` 直接调用它

706 

707### Skill 触发过于频繁

708 

709如果 Claude 在你不想要时使用你的 skill:

710 

7111. 使描述更具体

7122. 如果你只想手动调用,添加 `disable-model-invocation: true`

713 

714### Skill 描述被截断

715 

716Skill 描述被加载到上下文中,以便 Claude 知道什么可用。所有 skill 名称始终包括,但如果你有许多 skills,描述会被缩短以适应字符预算,这可能会删除 Claude 需要匹配你的请求的关键字。预算在上下文窗口的 1% 处动态扩展,回退为 8,000 个字符。

717 

718要提高限制,设置 `SLASH_COMMAND_TOOL_CHAR_BUDGET` 环境变量。或在源处修剪 `description` 和 `when_to_use` 文本:前置关键用例,因为每个条目的组合文本被限制为 1,536 个字符,无论预算如何。

719 

720## 相关资源

721 

722* **[调试你的配置](/zh-CN/debug-your-config)**:诊断为什么 skill 没有出现或触发

723* **[Subagents](/zh-CN/sub-agents)**:将任务委派给专门的代理

724* **[Plugins](/zh-CN/plugins)**:打包和分发 skills 与其他扩展

725* **[Hooks](/zh-CN/hooks)**:围绕工具事件自动化工作流

726* **[Memory](/zh-CN/memory)**:管理 CLAUDE.md 文件以获得持久上下文

727* **[Commands](/zh-CN/commands)**:内置命令和捆绑 skills 的参考

728* **[Permissions](/zh-CN/permissions)**:控制工具和 skill 访问

slack.md +210 −0 created

Details

1> ## Documentation Index

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

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

4 

5# Slack 中的 Claude Code

6 

7> 直接从 Slack 工作区委派编码任务

8 

9Slack 中的 Claude Code 将 Claude Code 的强大功能直接引入您的 Slack 工作区。当您使用编码任务提及 `@Claude` 时,Claude 会自动检测意图并在网络上创建 Claude Code 会话,允许您在不离开团队对话的情况下委派开发工作。

10 

11此集成基于现有的 Claude for Slack 应用程序构建,但为与编码相关的请求添加了到网络上 Claude Code 的智能路由。

12 

13## 用例

14 

15* **Bug 调查和修复**:要求 Claude 在 Slack 频道中报告 Bug 时立即调查和修复。

16* **快速代码审查和修改**:让 Claude 根据团队反馈实现小功能或重构代码。

17* **协作调试**:当团队讨论提供关键背景信息(例如错误重现或用户报告)时,Claude 可以使用该信息来指导其调试方法。

18* **并行任务执行**:在 Slack 中启动编码任务,同时继续其他工作,完成时收到通知。

19 

20## 前置条件

21 

22在使用 Slack 中的 Claude Code 之前,请确保您具有以下条件:

23 

24| 要求 | 详情 |

25| :--------------- | :-------------------------------------------------------- |

26| Claude 计划 | Pro、Max、Team 或 Enterprise,具有 Claude Code 访问权限(高级席位) |

27| 网络上的 Claude Code | 必须启用对[网络上的 Claude Code](/zh-CN/claude-code-on-the-web)的访问 |

28| GitHub 账户 | 连接到网络上的 Claude Code,至少有一个存储库已认证 |

29| Slack 认证 | 您的 Slack 账户通过 Claude 应用程序链接到您的 Claude 账户 |

30 

31## 在 Slack 中设置 Claude Code

32 

33<Steps>

34 <Step title="在 Slack 中安装 Claude 应用程序">

35 工作区管理员必须从 Slack 应用程序市场安装 Claude 应用程序。访问 [Slack 应用程序市场](https://slack.com/marketplace/A08SF47R6P4)并单击"Add to Slack"开始安装过程。

36 </Step>

37 

38 <Step title="连接您的 Claude 账户">

39 安装应用程序后,认证您的个人 Claude 账户:

40 

41 1. 通过单击您的应用程序部分中的"Claude"在 Slack 中打开 Claude 应用程序

42 2. 导航到应用程序主页选项卡

43 3. 单击"Connect"将您的 Slack 账户与您的 Claude 账户链接

44 4. 在浏览器中完成认证流程

45 </Step>

46 

47 <Step title="配置网络上的 Claude Code">

48 确保您网络上的 Claude Code 已正确配置:

49 

50 * 访问 [claude.ai/code](https://claude.ai/code) 并使用您连接到 Slack 的同一账户登录

51 * 如果尚未连接,请连接您的 GitHub 账户

52 * 认证至少一个您希望 Claude 使用的存储库

53 </Step>

54 

55 <Step title="选择您的路由模式">

56 连接您的账户后,配置 Claude 如何在 Slack 中处理您的消息。导航到 Slack 中的 Claude 应用程序主页以找到**路由模式**设置。

57 

58 | 模式 | 行为 |

59 | :---------- | :---------------------------------------------------------------------------------------------------- |

60 | **仅代码** | Claude 将所有 @mentions 路由到 Claude Code 会话。最适合仅将 Claude 用于 Slack 中开发任务的团队。 |

61 | **代码 + 聊天** | Claude 分析每条消息并在 Claude Code(用于编码任务)和 Claude Chat(用于写作、分析和常见问题)之间智能路由。最适合希望为所有类型工作提供单一 @Claude 入口点的团队。 |

62 

63 <Note>

64 在代码 + 聊天模式下,如果 Claude 将消息路由到聊天但您想要编码会话,您可以单击"Retry as Code"来创建 Claude Code 会话。类似地,如果它被路由到代码但您想要聊天会话,您可以在该线程中选择该选项。

65 </Note>

66 </Step>

67</Steps>

68 

69## 工作原理

70 

71### 自动检测

72 

73当您在 Slack 频道或线程中提及 @Claude 时,Claude 会自动分析您的消息以确定它是否是编码任务。如果 Claude 检测到编码意图,它将把您的请求路由到网络上的 Claude Code,而不是作为常规聊天助手响应。

74 

75您也可以明确告诉 Claude 将请求作为编码任务处理,即使它没有自动检测到。

76 

77<Note>

78 Slack 中的 Claude Code 仅在频道(公开或私有)中工作。它在直接消息 (DM) 中不起作用。

79</Note>

80 

81### 上下文收集

82 

83**来自线程**:当您在线程中 @mention Claude 时,它会从该线程中的所有消息收集上下文以理解完整的对话。

84 

85**来自频道**:当直接在频道中提及时,Claude 会查看最近的频道消息以获取相关上下文。

86 

87此上下文帮助 Claude 理解问题、选择适当的存储库并指导其任务方法。

88 

89<Warning>

90 当在 Slack 中调用 @Claude 时,Claude 可以访问对话上下文以更好地理解您的请求。Claude 可能会遵循上下文中其他消息的指示,因此用户应确保仅在受信任的 Slack 对话中使用 Claude。

91</Warning>

92 

93### 会话流程

94 

951. **启动**:您使用编码请求 @mention Claude

962. **检测**:Claude 分析您的消息并检测编码意图

973. **会话创建**:在 claude.ai/code 上创建新的 Claude Code 会话

984. **进度更新**:Claude 在工作进行时向您的 Slack 线程发布状态更新

995. **完成**:完成后,Claude @mentions 您并提供摘要和操作按钮

1006. **审查**:单击"View Session"查看完整记录,或单击"Create PR"打开拉取请求

101 

102## 用户界面元素

103 

104### 应用程序主页

105 

106应用程序主页选项卡显示您的连接状态,并允许您连接或断开您的 Claude 账户与 Slack 的连接。

107 

108### 消息操作

109 

110* **View Session**:在浏览器中打开完整的 Claude Code 会话,您可以在其中查看所有执行的工作、继续会话或提出其他请求。

111* **Create PR**:直接从会话的更改创建拉取请求。

112* **Retry as Code**:如果 Claude 最初作为聊天助手响应但您想要编码会话,请单击此按钮将请求重试为 Claude Code 任务。

113* **Change Repo**:如果 Claude 选择不正确,允许您选择不同的存储库。

114 

115### 存储库选择

116 

117Claude 根据 Slack 对话中的上下文自动选择存储库。如果多个存储库可能适用,Claude 可能会显示一个下拉菜单,允许您选择正确的存储库。

118 

119## 访问和权限

120 

121### 用户级访问

122 

123| 访问类型 | 要求 |

124| :------------- | :---------------------------------------- |

125| Claude Code 会话 | 每个用户在其自己的 Claude 账户下运行会话 |

126| 使用情况和速率限制 | 会话计入个人用户的计划限制 |

127| 存储库访问 | 用户只能访问他们个人连接的存储库 |

128| 会话历史 | 会话出现在您在 claude.ai/code 上的 Claude Code 历史中 |

129 

130### 工作区管理员权限

131 

132Slack 工作区管理员控制 Claude 应用程序是否可以在工作区中安装。然后,各个用户使用自己的 Claude 账户进行认证以使用集成。

133 

134## 什么可以在哪里访问

135 

136**在 Slack 中**:您将看到状态更新、完成摘要和操作按钮。完整记录被保留并始终可访问。

137 

138**在网络上**:完整的 Claude Code 会话,包含完整的对话历史、所有代码更改、文件操作以及继续会话或创建拉取请求的能力。

139 

140## 最佳实践

141 

142### 编写有效的请求

143 

144* **具体说明**:在相关时包括文件名、函数名或错误消息。

145* **提供上下文**:如果从对话中不清楚,请提及存储库或项目。

146* **定义成功**:解释"完成"的样子——Claude 应该编写测试吗?更新文档?创建 PR?

147* **使用线程**:在讨论 Bug 或功能时在线程中回复,以便 Claude 可以收集完整的上下文。

148 

149### 何时使用 Slack 与网络

150 

151**在以下情况下使用 Slack**:上下文已存在于 Slack 讨论中,您想异步启动任务,或者您正在与需要可见性的团队成员协作。

152 

153**直接在网络上使用**:当您需要上传文件、想要在开发过程中进行实时交互或处理更长、更复杂的任务时。

154 

155## 故障排除

156 

157### 会话未启动

158 

1591. 验证您的 Claude 账户在 Claude 应用程序主页中已连接

1602. 检查您是否启用了网络上的 Claude Code 访问权限

1613. 确保您至少有一个 GitHub 存储库连接到 Claude Code

162 

163### 存储库未显示

164 

1651. 在 [claude.ai/code](https://claude.ai/code) 的网络上的 Claude Code 中连接存储库

1662. 验证您对该存储库的 GitHub 权限

1673. 尝试断开并重新连接您的 GitHub 账户

168 

169### 选择了错误的存储库

170 

1711. 单击"Change Repo"按钮选择不同的存储库

1722. 在您的请求中包括存储库名称以获得更准确的选择

173 

174### 认证错误

175 

1761. 在应用程序主页中断开并重新连接您的 Claude 账户

1772. 确保您在浏览器中登录到正确的 Claude 账户

1783. 检查您的 Claude 计划是否包括 Claude Code 访问权限

179 

180### 会话过期

181 

1821. 会话在网络上的 Claude Code 历史中保持可访问

1832. 您可以从 [claude.ai/code](https://claude.ai/code) 继续或参考过去的会话

184 

185## 当前限制

186 

187* **仅 GitHub**:目前支持 GitHub 上的存储库。

188* **一次一个 PR**:每个会话可以创建一个拉取请求。

189* **速率限制适用**:会话使用您的个人 Claude 计划的速率限制。

190* **需要网络访问**:用户必须具有网络上的 Claude Code 访问权限;没有它的用户将只获得标准 Claude 聊天响应。

191 

192## 相关资源

193 

194<CardGroup>

195 <Card title="网络上的 Claude Code" icon="globe" href="/zh-CN/claude-code-on-the-web">

196 了解有关网络上的 Claude Code 的更多信息

197 </Card>

198 

199 <Card title="Claude for Slack" icon="slack" href="https://claude.com/claude-and-slack">

200 Claude for Slack 常规文档

201 </Card>

202 

203 <Card title="Slack 应用程序市场" icon="store" href="https://slack.com/marketplace/A08SF47R6P4">

204 从 Slack 市场安装 Claude 应用程序

205 </Card>

206 

207 <Card title="Claude 帮助中心" icon="circle-question" href="https://support.claude.com">

208 获取额外支持

209 </Card>

210</CardGroup>

statusline.md +1062 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 自定义你的状态行

6 

7> 配置自定义状态栏以监控 Claude Code 中的上下文窗口使用情况、成本和 git 状态

8 

9状态行是 Claude Code 底部的可自定义栏,可以运行你配置的任何 shell 脚本。它通过 stdin 接收 JSON 会话数据,并显示你的脚本打印的任何内容,为你提供一个持久的、一目了然的上下文使用情况、成本、git 状态或任何其他你想跟踪的内容的视图。

10 

11状态行在以下情况下很有用:

12 

13* 你想在工作时监控上下文窗口使用情况

14* 你需要跟踪会话成本

15* 你在多个会话中工作,需要区分它们

16* 你希望 git 分支和状态始终可见

17 

18这是一个[多行状态行](#display-multiple-lines)的示例,它在第一行显示 git 信息,在第二行显示颜色编码的上下文栏。

19 

20<Frame>

21 <img src="https://mintcdn.com/claude-code/nibzesLaJVh4ydOq/images/statusline-multiline.png?fit=max&auto=format&n=nibzesLaJVh4ydOq&q=85&s=60f11387658acc9ff75158ae85f2ac87" alt="一个多行状态行,显示第一行上的模型名称、目录、git 分支,第二行上的上下文使用进度条、成本和持续时间" width="776" height="212" data-path="images/statusline-multiline.png" />

22</Frame>

23 

24本页面介绍了[设置基本状态行](#set-up-a-status-line),解释了[数据如何从 Claude Code 流向你的脚本](#how-status-lines-work),列出了[你可以显示的所有字段](#available-data),并提供了[常见模式的现成示例](#examples),如 git 状态、成本跟踪和进度条。

25 

26## 设置状态行

27 

28使用[`/statusline` 命令](#use-the-statusline-command)让 Claude Code 为你生成脚本,或[手动创建脚本](#manually-configure-a-status-line)并将其添加到你的设置中。

29 

30### 使用 /statusline 命令

31 

32`/statusline` 命令接受描述你想显示的内容的自然语言指令。Claude Code 在 `~/.claude/` 中生成脚本文件并自动更新你的设置:

33 

34```text theme={null}

35/statusline show model name and context percentage with a progress bar

36```

37 

38### 手动配置状态行

39 

40将 `statusLine` 字段添加到你的用户设置(`~/.claude/settings.json`,其中 `~` 是你的主目录)或[项目设置](/zh-CN/settings#settings-files)。将 `type` 设置为 `"command"` 并将 `command` 指向脚本路径或内联 shell 命令。有关创建脚本的完整演练,请参阅[逐步构建状态行](#build-a-status-line-step-by-step)。

41 

42```json theme={null}

43{

44 "statusLine": {

45 "type": "command",

46 "command": "~/.claude/statusline.sh",

47 "padding": 2

48 }

49}

50```

51 

52`command` 字段在 shell 中运行,所以你也可以使用内联命令而不是脚本文件。此示例使用 `jq` 解析 JSON 输入并显示模型名称和上下文百分比:

53 

54```json theme={null}

55{

56 "statusLine": {

57 "type": "command",

58 "command": "jq -r '\"[\\(.model.display_name)] \\(.context_window.used_percentage // 0)% context\"'"

59 }

60}

61```

62 

63可选的 `padding` 字段为状态行内容添加额外的水平间距(以字符为单位)。默认为 `0`。此填充是在界面的内置间距之外的,所以它控制相对缩进而不是距离终端边缘的绝对距离。

64 

65可选的 `refreshInterval` 字段除了[事件驱动的更新](#how-status-lines-work)外,每 N 秒重新运行一次你的命令。最小值为 `1`。当你的状态行显示基于时间的数据(如时钟)或后台子代理在主会话空闲时更改 git 状态时,设置此选项。如果不设置,则仅在事件上运行。

66 

67可选的 `hideVimModeIndicator` 字段会抑制提示符下方的内置 `-- INSERT --` 文本。当你的脚本自己呈现 [`vim.mode`](#available-data) 时,将此设置为 `true`,这样模式就不会显示两次。

68 

69### 禁用状态行

70 

71运行 `/statusline` 并要求它删除或清除你的状态行(例如,`/statusline delete`、`/statusline clear`、`/statusline remove it`)。你也可以手动从 settings.json 中删除 `statusLine` 字段。

72 

73## 逐步构建状态行

74 

75本演练展示了通过手动创建显示当前模型、工作目录和上下文窗口使用百分比的状态行来了解幕后发生的情况。

76 

77<Note>使用[`/statusline`](#use-the-statusline-command)和你想要的内容的描述会自动为你配置所有这些。</Note>

78 

79这些示例使用 Bash 脚本,在 macOS 和 Linux 上工作。在 Windows 上,请参阅[Windows 配置](#windows-configuration)了解 PowerShell 和 Git Bash 示例。

80 

81<Frame>

82 <img src="https://mintcdn.com/claude-code/nibzesLaJVh4ydOq/images/statusline-quickstart.png?fit=max&auto=format&n=nibzesLaJVh4ydOq&q=85&s=696445e59ca0059213250651ad23db6b" alt="一个状态行,显示模型名称、目录和上下文百分比" width="726" height="164" data-path="images/statusline-quickstart.png" />

83</Frame>

84 

85<Steps>

86 <Step title="创建一个读取 JSON 并打印输出的脚本">

87 Claude Code 通过 stdin 向你的脚本发送 JSON 数据。此脚本使用 [`jq`](https://jqlang.github.io/jq/),一个你可能需要安装的命令行 JSON 解析器,来提取模型名称、目录和上下文百分比,然后打印格式化的行。

88 

89 将其保存到 `~/.claude/statusline.sh`(其中 `~` 是你的主目录,例如 macOS 上的 `/Users/username` 或 Linux 上的 `/home/username`):

90 

91 ```bash theme={null}

92 #!/bin/bash

93 # Read JSON data that Claude Code sends to stdin

94 input=$(cat)

95 

96 # Extract fields using jq

97 MODEL=$(echo "$input" | jq -r '.model.display_name')

98 DIR=$(echo "$input" | jq -r '.workspace.current_dir')

99 # The "// 0" provides a fallback if the field is null

100 PCT=$(echo "$input" | jq -r '.context_window.used_percentage // 0' | cut -d. -f1)

101 

102 # Output the status line - ${DIR##*/} extracts just the folder name

103 echo "[$MODEL] 📁 ${DIR##*/} | ${PCT}% context"

104 ```

105 </Step>

106 

107 <Step title="使其可执行">

108 将脚本标记为可执行,以便你的 shell 可以运行它:

109 

110 ```bash theme={null}

111 chmod +x ~/.claude/statusline.sh

112 ```

113 </Step>

114 

115 <Step title="添加到设置">

116 告诉 Claude Code 运行你的脚本作为状态行。将此配置添加到 `~/.claude/settings.json`,它将 `type` 设置为 `"command"`(意思是"运行此 shell 命令")并将 `command` 指向你的脚本:

117 

118 ```json theme={null}

119 {

120 "statusLine": {

121 "type": "command",

122 "command": "~/.claude/statusline.sh"

123 }

124 }

125 ```

126 

127 你的状态行出现在界面的底部。设置会自动重新加载,但更改在你与 Claude Code 的下一次交互之前不会出现。

128 </Step>

129</Steps>

130 

131## 状态行如何工作

132 

133Claude Code 运行你的脚本并通过 stdin 向其传输[JSON 会话数据](#available-data)。你的脚本读取 JSON,提取它需要的内容,并将文本打印到 stdout。Claude Code 显示你的脚本打印的任何内容。

134 

135**何时更新**

136 

137你的脚本在每条新的助手消息之后、权限模式更改时或 vim 模式切换时运行。更新在 300ms 处进行防抖,这意味着快速更改会批处理在一起,你的脚本在事情稳定后运行一次。如果在你的脚本仍在运行时触发新的更新,则会取消正在进行的执行。如果你编辑你的脚本,更改在 Claude Code 的下一次交互触发更新之前不会出现。

138 

139这些触发器在主会话空闲时可能会安静,例如当协调器等待后台子代理时。为了在空闲期间保持基于时间或外部来源的段的最新状态,将 [`refreshInterval`](#manually-configure-a-status-line) 设置为也在固定计时器上重新运行命令。

140 

141**你的脚本可以输出什么**

142 

143* **多行**:每个 `echo` 或 `print` 语句显示为单独的行。请参阅[多行示例](#display-multiple-lines)。

144* **颜色**:使用[ANSI 转义码](https://en.wikipedia.org/wiki/ANSI_escape_code#Colors),如 `\033[32m` 表示绿色(终端必须支持它们)。请参阅[git 状态示例](#git-status-with-colors)。

145* **链接**:使用[OSC 8 转义序列](https://en.wikipedia.org/wiki/ANSI_escape_code#OSC)使文本可点击(macOS 上为 Cmd+click,Windows/Linux 上为 Ctrl+click)。需要支持超链接的终端,如 iTerm2、Kitty 或 WezTerm。请参阅[可点击链接示例](#clickable-links)。

146 

147<Note>状态行在本地运行,不消耗 API 令牌。在某些 UI 交互期间,它会临时隐藏,包括自动完成建议、帮助菜单和权限提示。</Note>

148 

149## 可用数据

150 

151Claude Code 通过 stdin 向你的脚本发送以下 JSON 字段:

152 

153| 字段 | 描述 |

154| -------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------ |

155| `model.id`, `model.display_name` | 当前模型标识符和显示名称 |

156| `cwd`, `workspace.current_dir` | 当前工作目录。两个字段包含相同的值;为了与 `workspace.project_dir` 保持一致,首选 `workspace.current_dir`。 |

157| `workspace.project_dir` | 启动 Claude Code 的目录,如果在会话期间工作目录更改,可能与 `cwd` 不同 |

158| `workspace.added_dirs` | 通过 `/add-dir` 或 `--add-dir` 添加的其他目录。如果未添加任何目录,则为空数组 |

159| `workspace.git_worktree` | 当前目录在使用 `git worktree add` 创建的链接 worktree 内时的 Git worktree 名称。在主工作树中不存在。对于任何 git worktree 都会填充,不同于仅适用于 `--worktree` 会话的 `worktree.*` |

160| `cost.total_cost_usd` | 以美元计的估计会话成本,在客户端计算。可能与你的实际账单不同 |

161| `cost.total_duration_ms` | 自会话开始以来的总挂钟时间(毫秒) |

162| `cost.total_api_duration_ms` | 等待 API 响应的总时间(毫秒) |

163| `cost.total_lines_added`, `cost.total_lines_removed` | 更改的代码行数 |

164| `context_window.total_input_tokens`, `context_window.total_output_tokens` | 整个会话中的累积令牌计数 |

165| `context_window.context_window_size` | 最大上下文窗口大小(令牌)。默认为 200000,或对于具有扩展上下文的模型为 1000000。 |

166| `context_window.used_percentage` | 预计算的已使用上下文窗口百分比 |

167| `context_window.remaining_percentage` | 预计算的剩余上下文窗口百分比 |

168| `context_window.current_usage` | 来自最后一次 API 调用的令牌计数,在[上下文窗口字段](#context-window-fields)中描述 |

169| `exceeds_200k_tokens` | 最近一次 API 响应中的总令牌计数(输入、缓存和输出令牌合并)是否超过 200k。这是一个固定阈值,与实际上下文窗口大小无关。 |

170| `effort.level` | 当前推理工作量(`low`、`medium`、`high`、`xhigh` 或 `max`)。反映实时会话值,包括中途 `/effort` 更改。当当前模型不支持工作量参数时不存在 |

171| `thinking.enabled` | 是否为会话启用了扩展思考 |

172| `rate_limits.five_hour.used_percentage`, `rate_limits.seven_day.used_percentage` | 消耗的 5 小时或 7 天速率限制的百分比,从 0 到 100 |

173| `rate_limits.five_hour.resets_at`, `rate_limits.seven_day.resets_at` | Unix 纪元秒,当 5 小时或 7 天速率限制窗口重置时 |

174| `session_id` | 唯一的会话标识符 |

175| `session_name` | 使用 `--name` 标志或 `/rename` 设置的自定义会话名称。如果未设置自定义名称,则不存在 |

176| `transcript_path` | 对话记录文件的路径 |

177| `version` | Claude Code 版本 |

178| `output_style.name` | 当前输出样式的名称 |

179| `vim.mode` | 启用[vim 模式](/zh-CN/interactive-mode#vim-editor-mode)时的当前 vim 模式(`NORMAL`、`INSERT`、`VISUAL` 或 `VISUAL LINE`) |

180| `agent.name` | 使用 `--agent` 标志或配置的代理设置运行时的代理名称 |

181| `worktree.name` | 活跃 worktree 的名称。仅在 `--worktree` 会话期间出现 |

182| `worktree.path` | worktree 目录的绝对路径 |

183| `worktree.branch` | worktree 的 Git 分支名称(例如,`"worktree-my-feature"`)。对于基于钩子的 worktree 不存在 |

184| `worktree.original_cwd` | Claude 进入 worktree 之前所在的目录 |

185| `worktree.original_branch` | 进入 worktree 之前检出的 Git 分支。对于基于钩子的 worktree 不存在 |

186 

187<Accordion title="完整 JSON 架构">

188 你的状态行命令通过 stdin 接收此 JSON 结构:

189 

190 ```json theme={null}

191 {

192 "cwd": "/current/working/directory",

193 "session_id": "abc123...",

194 "session_name": "my-session",

195 "transcript_path": "/path/to/transcript.jsonl",

196 "model": {

197 "id": "claude-opus-4-7",

198 "display_name": "Opus"

199 },

200 "workspace": {

201 "current_dir": "/current/working/directory",

202 "project_dir": "/original/project/directory",

203 "added_dirs": [],

204 "git_worktree": "feature-xyz"

205 },

206 "version": "2.1.90",

207 "output_style": {

208 "name": "default"

209 },

210 "cost": {

211 "total_cost_usd": 0.01234,

212 "total_duration_ms": 45000,

213 "total_api_duration_ms": 2300,

214 "total_lines_added": 156,

215 "total_lines_removed": 23

216 },

217 "context_window": {

218 "total_input_tokens": 15234,

219 "total_output_tokens": 4521,

220 "context_window_size": 200000,

221 "used_percentage": 8,

222 "remaining_percentage": 92,

223 "current_usage": {

224 "input_tokens": 8500,

225 "output_tokens": 1200,

226 "cache_creation_input_tokens": 5000,

227 "cache_read_input_tokens": 2000

228 }

229 },

230 "exceeds_200k_tokens": false,

231 "effort": {

232 "level": "high"

233 },

234 "thinking": {

235 "enabled": true

236 },

237 "rate_limits": {

238 "five_hour": {

239 "used_percentage": 23.5,

240 "resets_at": 1738425600

241 },

242 "seven_day": {

243 "used_percentage": 41.2,

244 "resets_at": 1738857600

245 }

246 },

247 "vim": {

248 "mode": "NORMAL"

249 },

250 "agent": {

251 "name": "security-reviewer"

252 },

253 "worktree": {

254 "name": "my-feature",

255 "path": "/path/to/.claude/worktrees/my-feature",

256 "branch": "worktree-my-feature",

257 "original_cwd": "/path/to/project",

258 "original_branch": "main"

259 }

260 }

261 ```

262 

263 **可能不存在的字段**(不在 JSON 中):

264 

265 * `session_name`:仅在使用 `--name` 或 `/rename` 设置自定义名称时出现

266 * `workspace.git_worktree`:仅当当前目录在链接的 git worktree 内时出现

267 * `effort`:仅当当前模型支持推理工作量参数时出现

268 * `vim`:仅在启用 vim 模式时出现

269 * `agent`:仅在使用 `--agent` 标志或配置的代理设置运行时出现

270 * `worktree`:仅在 `--worktree` 会话期间出现。当存在时,`branch` 和 `original_branch` 对于基于钩子的 worktree 也可能不存在

271 * `rate_limits`:仅对 Claude.ai 订阅者(Pro/Max)在会话中第一次 API 响应后出现。每个窗口(`five_hour`、`seven_day`)可能独立不存在。使用 `jq -r '.rate_limits.five_hour.used_percentage // empty'` 来优雅地处理缺失。

272 

273 **可能为 `null` 的字段**:

274 

275 * `context_window.current_usage`:在会话中第一次 API 调用之前为 `null`

276 * `context_window.used_percentage`, `context_window.remaining_percentage`:在会话早期可能为 `null`

277 

278 在你的脚本中使用条件访问处理缺失字段,使用回退默认值处理 null 值。

279</Accordion>

280 

281### 上下文窗口字段

282 

283`context_window` 对象提供了两种跟踪上下文使用情况的方式:

284 

285* **累积总计**(`total_input_tokens`, `total_output_tokens`):整个会话中所有令牌的总和,用于跟踪总消耗

286* **当前使用情况**(`current_usage`):来自最近一次 API 调用的令牌计数,使用此来获得准确的上下文百分比,因为它反映了实际的上下文状态

287 

288`current_usage` 对象包含:

289 

290* `input_tokens`:当前上下文中的输入令牌

291* `output_tokens`:生成的输出令牌

292* `cache_creation_input_tokens`:写入缓存的令牌

293* `cache_read_input_tokens`:从缓存读取的令牌

294 

295`used_percentage` 字段仅从输入令牌计算:`input_tokens + cache_creation_input_tokens + cache_read_input_tokens`。它不包括 `output_tokens`。

296 

297如果你从 `current_usage` 手动计算上下文百分比,使用相同的仅输入公式来匹配 `used_percentage`。

298 

299`current_usage` 对象在会话中第一次 API 调用之前为 `null`。

300 

301## 示例

302 

303这些示例展示了常见的状态行模式。要使用任何示例:

304 

3051. 将脚本保存到文件,如 `~/.claude/statusline.sh`(或 `.py`/`.js`)

3062. 使其可执行:`chmod +x ~/.claude/statusline.sh`

3073. 将路径添加到你的[设置](#manually-configure-a-status-line)

308 

309Bash 示例使用 [`jq`](https://jqlang.github.io/jq/) 来解析 JSON。Python 和 Node.js 具有内置的 JSON 解析。

310 

311### 上下文窗口使用情况

312 

313显示当前模型和上下文窗口使用情况,带有可视进度条。每个脚本从 stdin 读取 JSON,提取 `used_percentage` 字段,并构建一个 10 字符的栏,其中填充的块(▓)代表使用情况:

314 

315<Frame>

316 <img src="https://mintcdn.com/claude-code/nibzesLaJVh4ydOq/images/statusline-context-window-usage.png?fit=max&auto=format&n=nibzesLaJVh4ydOq&q=85&s=15b58ab3602f036939145dde3165c6f7" alt="一个状态行,显示模型名称和带有百分比的进度条" width="448" height="152" data-path="images/statusline-context-window-usage.png" />

317</Frame>

318 

319<CodeGroup>

320 ```bash Bash theme={null}

321 #!/bin/bash

322 # Read all of stdin into a variable

323 input=$(cat)

324 

325 # Extract fields with jq, "// 0" provides fallback for null

326 MODEL=$(echo "$input" | jq -r '.model.display_name')

327 PCT=$(echo "$input" | jq -r '.context_window.used_percentage // 0' | cut -d. -f1)

328 

329 # Build progress bar: printf -v creates a run of spaces, then

330 # ${var// /▓} replaces each space with a block character

331 BAR_WIDTH=10

332 FILLED=$((PCT * BAR_WIDTH / 100))

333 EMPTY=$((BAR_WIDTH - FILLED))

334 BAR=""

335 [ "$FILLED" -gt 0 ] && printf -v FILL "%${FILLED}s" && BAR="${FILL// /▓}"

336 [ "$EMPTY" -gt 0 ] && printf -v PAD "%${EMPTY}s" && BAR="${BAR}${PAD// /░}"

337 

338 echo "[$MODEL] $BAR $PCT%"

339 ```

340 

341 ```python Python theme={null}

342 #!/usr/bin/env python3

343 import json, sys

344 

345 # json.load reads and parses stdin in one step

346 data = json.load(sys.stdin)

347 model = data['model']['display_name']

348 # "or 0" handles null values

349 pct = int(data.get('context_window', {}).get('used_percentage', 0) or 0)

350 

351 # String multiplication builds the bar

352 filled = pct * 10 // 100

353 bar = '▓' * filled + '░' * (10 - filled)

354 

355 print(f"[{model}] {bar} {pct}%")

356 ```

357 

358 ```javascript Node.js theme={null}

359 #!/usr/bin/env node

360 // Node.js reads stdin asynchronously with events

361 let input = '';

362 process.stdin.on('data', chunk => input += chunk);

363 process.stdin.on('end', () => {

364 const data = JSON.parse(input);

365 const model = data.model.display_name;

366 // Optional chaining (?.) safely handles null fields

367 const pct = Math.floor(data.context_window?.used_percentage || 0);

368 

369 // String.repeat() builds the bar

370 const filled = Math.floor(pct * 10 / 100);

371 const bar = '▓'.repeat(filled) + '░'.repeat(10 - filled);

372 

373 console.log(`[${model}] ${bar} ${pct}%`);

374 });

375 ```

376</CodeGroup>

377 

378### Git 状态与颜色

379 

380显示 git 分支,带有暂存和修改文件的颜色编码指示器。此脚本使用[ANSI 转义码](https://en.wikipedia.org/wiki/ANSI_escape_code#Colors)表示终端颜色:`\033[32m` 是绿色,`\033[33m` 是黄色,`\033[0m` 重置为默认值。

381 

382<Frame>

383 <img src="https://mintcdn.com/claude-code/nibzesLaJVh4ydOq/images/statusline-git-context.png?fit=max&auto=format&n=nibzesLaJVh4ydOq&q=85&s=e656f34f90d1d9a1d0e220988914345f" alt="一个状态行,显示模型、目录、git 分支和暂存和修改文件的彩色指示器" width="742" height="178" data-path="images/statusline-git-context.png" />

384</Frame>

385 

386每个脚本检查当前目录是否是 git 存储库,计算暂存和修改文件,并显示颜色编码的指示器:

387 

388<CodeGroup>

389 ```bash Bash theme={null}

390 #!/bin/bash

391 input=$(cat)

392 

393 MODEL=$(echo "$input" | jq -r '.model.display_name')

394 DIR=$(echo "$input" | jq -r '.workspace.current_dir')

395 

396 GREEN='\033[32m'

397 YELLOW='\033[33m'

398 RESET='\033[0m'

399 

400 if git rev-parse --git-dir > /dev/null 2>&1; then

401 BRANCH=$(git branch --show-current 2>/dev/null)

402 STAGED=$(git diff --cached --numstat 2>/dev/null | wc -l | tr -d ' ')

403 MODIFIED=$(git diff --numstat 2>/dev/null | wc -l | tr -d ' ')

404 

405 GIT_STATUS=""

406 [ "$STAGED" -gt 0 ] && GIT_STATUS="${GREEN}+${STAGED}${RESET}"

407 [ "$MODIFIED" -gt 0 ] && GIT_STATUS="${GIT_STATUS}${YELLOW}~${MODIFIED}${RESET}"

408 

409 echo -e "[$MODEL] 📁 ${DIR##*/} | 🌿 $BRANCH $GIT_STATUS"

410 else

411 echo "[$MODEL] 📁 ${DIR##*/}"

412 fi

413 ```

414 

415 ```python Python theme={null}

416 #!/usr/bin/env python3

417 import json, sys, subprocess, os

418 

419 data = json.load(sys.stdin)

420 model = data['model']['display_name']

421 directory = os.path.basename(data['workspace']['current_dir'])

422 

423 GREEN, YELLOW, RESET = '\033[32m', '\033[33m', '\033[0m'

424 

425 try:

426 subprocess.check_output(['git', 'rev-parse', '--git-dir'], stderr=subprocess.DEVNULL)

427 branch = subprocess.check_output(['git', 'branch', '--show-current'], text=True).strip()

428 staged_output = subprocess.check_output(['git', 'diff', '--cached', '--numstat'], text=True).strip()

429 modified_output = subprocess.check_output(['git', 'diff', '--numstat'], text=True).strip()

430 staged = len(staged_output.split('\n')) if staged_output else 0

431 modified = len(modified_output.split('\n')) if modified_output else 0

432 

433 git_status = f"{GREEN}+{staged}{RESET}" if staged else ""

434 git_status += f"{YELLOW}~{modified}{RESET}" if modified else ""

435 

436 print(f"[{model}] 📁 {directory} | 🌿 {branch} {git_status}")

437 except:

438 print(f"[{model}] 📁 {directory}")

439 ```

440 

441 ```javascript Node.js theme={null}

442 #!/usr/bin/env node

443 const { execSync } = require('child_process');

444 const path = require('path');

445 

446 let input = '';

447 process.stdin.on('data', chunk => input += chunk);

448 process.stdin.on('end', () => {

449 const data = JSON.parse(input);

450 const model = data.model.display_name;

451 const dir = path.basename(data.workspace.current_dir);

452 

453 const GREEN = '\x1b[32m', YELLOW = '\x1b[33m', RESET = '\x1b[0m';

454 

455 try {

456 execSync('git rev-parse --git-dir', { stdio: 'ignore' });

457 const branch = execSync('git branch --show-current', { encoding: 'utf8' }).trim();

458 const staged = execSync('git diff --cached --numstat', { encoding: 'utf8' }).trim().split('\n').filter(Boolean).length;

459 const modified = execSync('git diff --numstat', { encoding: 'utf8' }).trim().split('\n').filter(Boolean).length;

460 

461 let gitStatus = staged ? `${GREEN}+${staged}${RESET}` : '';

462 gitStatus += modified ? `${YELLOW}~${modified}${RESET}` : '';

463 

464 console.log(`[${model}] 📁 ${dir} | 🌿 ${branch} ${gitStatus}`);

465 } catch {

466 console.log(`[${model}] 📁 ${dir}`);

467 }

468 });

469 ```

470</CodeGroup>

471 

472### 成本和持续时间跟踪

473 

474跟踪你的会话的 API 成本和经过的时间。`cost.total_cost_usd` 字段累积当前会话中所有 API 调用的估计成本。`cost.total_duration_ms` 字段测量自会话开始以来的总经过时间,而 `cost.total_api_duration_ms` 仅跟踪等待 API 响应的时间。

475 

476每个脚本将成本格式化为货币并将毫秒转换为分钟和秒:

477 

478<Frame>

479 <img src="https://mintcdn.com/claude-code/nibzesLaJVh4ydOq/images/statusline-cost-tracking.png?fit=max&auto=format&n=nibzesLaJVh4ydOq&q=85&s=e3444a51fe6f3440c134bd5f1f08ad29" alt="一个状态行,显示模型名称、会话成本和持续时间" width="588" height="180" data-path="images/statusline-cost-tracking.png" />

480</Frame>

481 

482<CodeGroup>

483 ```bash Bash theme={null}

484 #!/bin/bash

485 input=$(cat)

486 

487 MODEL=$(echo "$input" | jq -r '.model.display_name')

488 COST=$(echo "$input" | jq -r '.cost.total_cost_usd // 0')

489 DURATION_MS=$(echo "$input" | jq -r '.cost.total_duration_ms // 0')

490 

491 COST_FMT=$(printf '$%.2f' "$COST")

492 DURATION_SEC=$((DURATION_MS / 1000))

493 MINS=$((DURATION_SEC / 60))

494 SECS=$((DURATION_SEC % 60))

495 

496 echo "[$MODEL] 💰 $COST_FMT | ⏱️ ${MINS}m ${SECS}s"

497 ```

498 

499 ```python Python theme={null}

500 #!/usr/bin/env python3

501 import json, sys

502 

503 data = json.load(sys.stdin)

504 model = data['model']['display_name']

505 cost = data.get('cost', {}).get('total_cost_usd', 0) or 0

506 duration_ms = data.get('cost', {}).get('total_duration_ms', 0) or 0

507 

508 duration_sec = duration_ms // 1000

509 mins, secs = duration_sec // 60, duration_sec % 60

510 

511 print(f"[{model}] 💰 ${cost:.2f} | ⏱️ {mins}m {secs}s")

512 ```

513 

514 ```javascript Node.js theme={null}

515 #!/usr/bin/env node

516 let input = '';

517 process.stdin.on('data', chunk => input += chunk);

518 process.stdin.on('end', () => {

519 const data = JSON.parse(input);

520 const model = data.model.display_name;

521 const cost = data.cost?.total_cost_usd || 0;

522 const durationMs = data.cost?.total_duration_ms || 0;

523 

524 const durationSec = Math.floor(durationMs / 1000);

525 const mins = Math.floor(durationSec / 60);

526 const secs = durationSec % 60;

527 

528 console.log(`[${model}] 💰 $${cost.toFixed(2)} | ⏱️ ${mins}m ${secs}s`);

529 });

530 ```

531</CodeGroup>

532 

533### 显示多行

534 

535你的脚本可以输出多行来创建更丰富的显示。每个 `echo` 语句在状态区域中产生单独的行。

536 

537<Frame>

538 <img src="https://mintcdn.com/claude-code/nibzesLaJVh4ydOq/images/statusline-multiline.png?fit=max&auto=format&n=nibzesLaJVh4ydOq&q=85&s=60f11387658acc9ff75158ae85f2ac87" alt="一个多行状态行,显示第一行上的模型名称、目录、git 分支,第二行上的上下文使用进度条、成本和持续时间" width="776" height="212" data-path="images/statusline-multiline.png" />

539</Frame>

540 

541此示例结合了几种技术:基于阈值的颜色(70% 以下为绿色,70-89% 为黄色,90%+ 为红色)、进度条和 git 分支信息。每个 `print` 或 `echo` 语句创建单独的行:

542 

543<CodeGroup>

544 ```bash Bash theme={null}

545 #!/bin/bash

546 input=$(cat)

547 

548 MODEL=$(echo "$input" | jq -r '.model.display_name')

549 DIR=$(echo "$input" | jq -r '.workspace.current_dir')

550 COST=$(echo "$input" | jq -r '.cost.total_cost_usd // 0')

551 PCT=$(echo "$input" | jq -r '.context_window.used_percentage // 0' | cut -d. -f1)

552 DURATION_MS=$(echo "$input" | jq -r '.cost.total_duration_ms // 0')

553 

554 CYAN='\033[36m'; GREEN='\033[32m'; YELLOW='\033[33m'; RED='\033[31m'; RESET='\033[0m'

555 

556 # Pick bar color based on context usage

557 if [ "$PCT" -ge 90 ]; then BAR_COLOR="$RED"

558 elif [ "$PCT" -ge 70 ]; then BAR_COLOR="$YELLOW"

559 else BAR_COLOR="$GREEN"; fi

560 

561 FILLED=$((PCT / 10)); EMPTY=$((10 - FILLED))

562 printf -v FILL "%${FILLED}s"; printf -v PAD "%${EMPTY}s"

563 BAR="${FILL// /█}${PAD// /░}"

564 

565 MINS=$((DURATION_MS / 60000)); SECS=$(((DURATION_MS % 60000) / 1000))

566 

567 BRANCH=""

568 git rev-parse --git-dir > /dev/null 2>&1 && BRANCH=" | 🌿 $(git branch --show-current 2>/dev/null)"

569 

570 echo -e "${CYAN}[$MODEL]${RESET} 📁 ${DIR##*/}$BRANCH"

571 COST_FMT=$(printf '$%.2f' "$COST")

572 echo -e "${BAR_COLOR}${BAR}${RESET} ${PCT}% | ${YELLOW}${COST_FMT}${RESET} | ⏱️ ${MINS}m ${SECS}s"

573 ```

574 

575 ```python Python theme={null}

576 #!/usr/bin/env python3

577 import json, sys, subprocess, os

578 

579 data = json.load(sys.stdin)

580 model = data['model']['display_name']

581 directory = os.path.basename(data['workspace']['current_dir'])

582 cost = data.get('cost', {}).get('total_cost_usd', 0) or 0

583 pct = int(data.get('context_window', {}).get('used_percentage', 0) or 0)

584 duration_ms = data.get('cost', {}).get('total_duration_ms', 0) or 0

585 

586 CYAN, GREEN, YELLOW, RED, RESET = '\033[36m', '\033[32m', '\033[33m', '\033[31m', '\033[0m'

587 

588 bar_color = RED if pct >= 90 else YELLOW if pct >= 70 else GREEN

589 filled = pct // 10

590 bar = '█' * filled + '░' * (10 - filled)

591 

592 mins, secs = duration_ms // 60000, (duration_ms % 60000) // 1000

593 

594 try:

595 branch = subprocess.check_output(['git', 'branch', '--show-current'], text=True, stderr=subprocess.DEVNULL).strip()

596 branch = f" | 🌿 {branch}" if branch else ""

597 except:

598 branch = ""

599 

600 print(f"{CYAN}[{model}]{RESET} 📁 {directory}{branch}")

601 print(f"{bar_color}{bar}{RESET} {pct}% | {YELLOW}${cost:.2f}{RESET} | ⏱️ {mins}m {secs}s")

602 ```

603 

604 ```javascript Node.js theme={null}

605 #!/usr/bin/env node

606 const { execSync } = require('child_process');

607 const path = require('path');

608 

609 let input = '';

610 process.stdin.on('data', chunk => input += chunk);

611 process.stdin.on('end', () => {

612 const data = JSON.parse(input);

613 const model = data.model.display_name;

614 const dir = path.basename(data.workspace.current_dir);

615 const cost = data.cost?.total_cost_usd || 0;

616 const pct = Math.floor(data.context_window?.used_percentage || 0);

617 const durationMs = data.cost?.total_duration_ms || 0;

618 

619 const CYAN = '\x1b[36m', GREEN = '\x1b[32m', YELLOW = '\x1b[33m', RED = '\x1b[31m', RESET = '\x1b[0m';

620 

621 const barColor = pct >= 90 ? RED : pct >= 70 ? YELLOW : GREEN;

622 const filled = Math.floor(pct / 10);

623 const bar = '█'.repeat(filled) + '░'.repeat(10 - filled);

624 

625 const mins = Math.floor(durationMs / 60000);

626 const secs = Math.floor((durationMs % 60000) / 1000);

627 

628 let branch = '';

629 try {

630 branch = execSync('git branch --show-current', { encoding: 'utf8', stdio: ['pipe', 'pipe', 'ignore'] }).trim();

631 branch = branch ? ` | 🌿 ${branch}` : '';

632 } catch {}

633 

634 console.log(`${CYAN}[${model}]${RESET} 📁 ${dir}${branch}`);

635 console.log(`${barColor}${bar}${RESET} ${pct}% | ${YELLOW}$${cost.toFixed(2)}${RESET} | ⏱️ ${mins}m ${secs}s`);

636 });

637 ```

638</CodeGroup>

639 

640### 可点击链接

641 

642此示例创建指向你的 GitHub 存储库的可点击链接。它读取 git 远程 URL,使用 `sed` 将 SSH 格式转换为 HTTPS,并将存储库名称包装在 OSC 8 转义码中。按住 Cmd(macOS)或 Ctrl(Windows/Linux)并单击以在浏览器中打开链接。

643 

644<Frame>

645 <img src="https://mintcdn.com/claude-code/nibzesLaJVh4ydOq/images/statusline-links.png?fit=max&auto=format&n=nibzesLaJVh4ydOq&q=85&s=4bcc6e7deb7cf52f41ab85a219b52661" alt="一个状态行,显示指向 GitHub 存储库的可点击链接" width="726" height="198" data-path="images/statusline-links.png" />

646</Frame>

647 

648每个脚本获取 git 远程 URL,将 SSH 格式转换为 HTTPS,并将存储库名称包装在 OSC 8 转义码中。Bash 版本使用 `printf '%b'`,它比 `echo -e` 更可靠地跨不同 shell 解释反斜杠转义:

649 

650<CodeGroup>

651 ```bash Bash theme={null}

652 #!/bin/bash

653 input=$(cat)

654 

655 MODEL=$(echo "$input" | jq -r '.model.display_name')

656 

657 # Convert git SSH URL to HTTPS

658 REMOTE=$(git remote get-url origin 2>/dev/null | sed 's/git@github.com:/https:\/\/github.com\//' | sed 's/\.git$//')

659 

660 if [ -n "$REMOTE" ]; then

661 REPO_NAME=$(basename "$REMOTE")

662 # OSC 8 format: \e]8;;URL\a then TEXT then \e]8;;\a

663 # printf %b interprets escape sequences reliably across shells

664 printf '%b' "[$MODEL] 🔗 \e]8;;${REMOTE}\a${REPO_NAME}\e]8;;\a\n"

665 else

666 echo "[$MODEL]"

667 fi

668 ```

669 

670 ```python Python theme={null}

671 #!/usr/bin/env python3

672 import json, sys, subprocess, re, os

673 

674 data = json.load(sys.stdin)

675 model = data['model']['display_name']

676 

677 # Get git remote URL

678 try:

679 remote = subprocess.check_output(

680 ['git', 'remote', 'get-url', 'origin'],

681 stderr=subprocess.DEVNULL, text=True

682 ).strip()

683 # Convert SSH to HTTPS format

684 remote = re.sub(r'^git@github\.com:', 'https://github.com/', remote)

685 remote = re.sub(r'\.git$', '', remote)

686 repo_name = os.path.basename(remote)

687 # OSC 8 escape sequences

688 link = f"\033]8;;{remote}\a{repo_name}\033]8;;\a"

689 print(f"[{model}] 🔗 {link}")

690 except:

691 print(f"[{model}]")

692 ```

693 

694 ```javascript Node.js theme={null}

695 #!/usr/bin/env node

696 const { execSync } = require('child_process');

697 const path = require('path');

698 

699 let input = '';

700 process.stdin.on('data', chunk => input += chunk);

701 process.stdin.on('end', () => {

702 const data = JSON.parse(input);

703 const model = data.model.display_name;

704 

705 try {

706 let remote = execSync('git remote get-url origin', { encoding: 'utf8', stdio: ['pipe', 'pipe', 'ignore'] }).trim();

707 // Convert SSH to HTTPS format

708 remote = remote.replace(/^git@github\.com:/, 'https://github.com/').replace(/\.git$/, '');

709 const repoName = path.basename(remote);

710 // OSC 8 escape sequences

711 const link = `\x1b]8;;${remote}\x07${repoName}\x1b]8;;\x07`;

712 console.log(`[${model}] 🔗 ${link}`);

713 } catch {

714 console.log(`[${model}]`);

715 }

716 });

717 ```

718</CodeGroup>

719 

720### 速率限制使用情况

721 

722在状态行中显示 Claude.ai 订阅速率限制使用情况。`rate_limits` 对象包含 `five_hour`(5 小时滚动窗口)和 `seven_day`(每周)窗口。每个窗口提供 `used_percentage`(0-100)和 `resets_at`(Unix 纪元秒,当窗口重置时)。

723 

724此字段仅对 Claude.ai 订阅者(Pro/Max)在第一次 API 响应后出现。每个脚本优雅地处理缺失字段:

725 

726<CodeGroup>

727 ```bash Bash theme={null}

728 #!/bin/bash

729 input=$(cat)

730 

731 MODEL=$(echo "$input" | jq -r '.model.display_name')

732 # "// empty" produces no output when rate_limits is absent

733 FIVE_H=$(echo "$input" | jq -r '.rate_limits.five_hour.used_percentage // empty')

734 WEEK=$(echo "$input" | jq -r '.rate_limits.seven_day.used_percentage // empty')

735 

736 LIMITS=""

737 [ -n "$FIVE_H" ] && LIMITS="5h: $(printf '%.0f' "$FIVE_H")%"

738 [ -n "$WEEK" ] && LIMITS="${LIMITS:+$LIMITS }7d: $(printf '%.0f' "$WEEK")%"

739 

740 [ -n "$LIMITS" ] && echo "[$MODEL] | $LIMITS" || echo "[$MODEL]"

741 ```

742 

743 ```python Python theme={null}

744 #!/usr/bin/env python3

745 import json, sys

746 

747 data = json.load(sys.stdin)

748 model = data['model']['display_name']

749 

750 parts = []

751 rate = data.get('rate_limits', {})

752 five_h = rate.get('five_hour', {}).get('used_percentage')

753 week = rate.get('seven_day', {}).get('used_percentage')

754 

755 if five_h is not None:

756 parts.append(f"5h: {five_h:.0f}%")

757 if week is not None:

758 parts.append(f"7d: {week:.0f}%")

759 

760 if parts:

761 print(f"[{model}] | {' '.join(parts)}")

762 else:

763 print(f"[{model}]")

764 ```

765 

766 ```javascript Node.js theme={null}

767 #!/usr/bin/env node

768 let input = '';

769 process.stdin.on('data', chunk => input += chunk);

770 process.stdin.on('end', () => {

771 const data = JSON.parse(input);

772 const model = data.model.display_name;

773 

774 const parts = [];

775 const fiveH = data.rate_limits?.five_hour?.used_percentage;

776 const week = data.rate_limits?.seven_day?.used_percentage;

777 

778 if (fiveH != null) parts.push(`5h: ${Math.round(fiveH)}%`);

779 if (week != null) parts.push(`7d: ${Math.round(week)}%`);

780 

781 console.log(parts.length ? `[${model}] | ${parts.join(' ')}` : `[${model}]`);

782 });

783 ```

784</CodeGroup>

785 

786### 缓存昂贵的操作

787 

788你的状态行脚本在活跃会话期间频繁运行。像 `git status` 或 `git diff` 这样的命令可能很慢,特别是在大型存储库中。此示例将 git 信息缓存到临时文件,并仅每 5 秒刷新一次。

789 

790缓存文件名需要在会话内的状态行调用中保持稳定,但在会话之间是唯一的,以便不同存储库中的并发会话不会读取彼此的缓存 git 状态。基于进程的标识符如 `$$`、`os.getpid()` 或 `process.pid` 在每次调用时都会改变,会破坏缓存。改用 JSON 输入中的 `session_id`:它在会话的生命周期内是稳定的,并且对每个会话是唯一的。

791 

792每个脚本在运行 git 命令之前检查缓存文件是否缺失或早于 5 秒:

793 

794<CodeGroup>

795 ```bash Bash theme={null}

796 #!/bin/bash

797 input=$(cat)

798 

799 MODEL=$(echo "$input" | jq -r '.model.display_name')

800 DIR=$(echo "$input" | jq -r '.workspace.current_dir')

801 SESSION_ID=$(echo "$input" | jq -r '.session_id')

802 

803 CACHE_FILE="/tmp/statusline-git-cache-$SESSION_ID"

804 CACHE_MAX_AGE=5 # seconds

805 

806 cache_is_stale() {

807 [ ! -f "$CACHE_FILE" ] || \

808 # stat -f %m is macOS, stat -c %Y is Linux

809 [ $(($(date +%s) - $(stat -f %m "$CACHE_FILE" 2>/dev/null || stat -c %Y "$CACHE_FILE" 2>/dev/null || echo 0))) -gt $CACHE_MAX_AGE ]

810 }

811 

812 if cache_is_stale; then

813 if git rev-parse --git-dir > /dev/null 2>&1; then

814 BRANCH=$(git branch --show-current 2>/dev/null)

815 STAGED=$(git diff --cached --numstat 2>/dev/null | wc -l | tr -d ' ')

816 MODIFIED=$(git diff --numstat 2>/dev/null | wc -l | tr -d ' ')

817 echo "$BRANCH|$STAGED|$MODIFIED" > "$CACHE_FILE"

818 else

819 echo "||" > "$CACHE_FILE"

820 fi

821 fi

822 

823 IFS='|' read -r BRANCH STAGED MODIFIED < "$CACHE_FILE"

824 

825 if [ -n "$BRANCH" ]; then

826 echo "[$MODEL] 📁 ${DIR##*/} | 🌿 $BRANCH +$STAGED ~$MODIFIED"

827 else

828 echo "[$MODEL] 📁 ${DIR##*/}"

829 fi

830 ```

831 

832 ```python Python theme={null}

833 #!/usr/bin/env python3

834 import json, sys, subprocess, os, time

835 

836 data = json.load(sys.stdin)

837 model = data['model']['display_name']

838 directory = os.path.basename(data['workspace']['current_dir'])

839 session_id = data['session_id']

840 

841 CACHE_FILE = f"/tmp/statusline-git-cache-{session_id}"

842 CACHE_MAX_AGE = 5 # seconds

843 

844 def cache_is_stale():

845 if not os.path.exists(CACHE_FILE):

846 return True

847 return time.time() - os.path.getmtime(CACHE_FILE) > CACHE_MAX_AGE

848 

849 if cache_is_stale():

850 try:

851 subprocess.check_output(['git', 'rev-parse', '--git-dir'], stderr=subprocess.DEVNULL)

852 branch = subprocess.check_output(['git', 'branch', '--show-current'], text=True).strip()

853 staged = subprocess.check_output(['git', 'diff', '--cached', '--numstat'], text=True).strip()

854 modified = subprocess.check_output(['git', 'diff', '--numstat'], text=True).strip()

855 staged_count = len(staged.split('\n')) if staged else 0

856 modified_count = len(modified.split('\n')) if modified else 0

857 with open(CACHE_FILE, 'w') as f:

858 f.write(f"{branch}|{staged_count}|{modified_count}")

859 except:

860 with open(CACHE_FILE, 'w') as f:

861 f.write("||")

862 

863 with open(CACHE_FILE) as f:

864 branch, staged, modified = f.read().strip().split('|')

865 

866 if branch:

867 print(f"[{model}] 📁 {directory} | 🌿 {branch} +{staged} ~{modified}")

868 else:

869 print(f"[{model}] 📁 {directory}")

870 ```

871 

872 ```javascript Node.js theme={null}

873 #!/usr/bin/env node

874 const { execSync } = require('child_process');

875 const fs = require('fs');

876 const path = require('path');

877 

878 let input = '';

879 process.stdin.on('data', chunk => input += chunk);

880 process.stdin.on('end', () => {

881 const data = JSON.parse(input);

882 const model = data.model.display_name;

883 const dir = path.basename(data.workspace.current_dir);

884 const sessionId = data.session_id;

885 

886 const CACHE_FILE = `/tmp/statusline-git-cache-${sessionId}`;

887 const CACHE_MAX_AGE = 5; // seconds

888 

889 const cacheIsStale = () => {

890 if (!fs.existsSync(CACHE_FILE)) return true;

891 return (Date.now() / 1000) - fs.statSync(CACHE_FILE).mtimeMs / 1000 > CACHE_MAX_AGE;

892 };

893 

894 if (cacheIsStale()) {

895 try {

896 execSync('git rev-parse --git-dir', { stdio: 'ignore' });

897 const branch = execSync('git branch --show-current', { encoding: 'utf8' }).trim();

898 const staged = execSync('git diff --cached --numstat', { encoding: 'utf8' }).trim().split('\n').filter(Boolean).length;

899 const modified = execSync('git diff --numstat', { encoding: 'utf8' }).trim().split('\n').filter(Boolean).length;

900 fs.writeFileSync(CACHE_FILE, `${branch}|${staged}|${modified}`);

901 } catch {

902 fs.writeFileSync(CACHE_FILE, '||');

903 }

904 }

905 

906 const [branch, staged, modified] = fs.readFileSync(CACHE_FILE, 'utf8').trim().split('|');

907 

908 if (branch) {

909 console.log(`[${model}] 📁 ${dir} | 🌿 ${branch} +${staged} ~${modified}`);

910 } else {

911 console.log(`[${model}] 📁 ${dir}`);

912 }

913 });

914 ```

915</CodeGroup>

916 

917### Windows 配置

918 

919在 Windows 上,Claude Code 通过 Git Bash 运行状态行命令(如果已安装 Git Bash),或在没有 Git Bash 时通过 PowerShell 运行。要将 PowerShell 脚本作为状态行运行,请通过 `powershell` 调用它;这在任一 shell 中都有效:

920 

921<CodeGroup>

922 ```json settings.json theme={null}

923 {

924 "statusLine": {

925 "type": "command",

926 "command": "powershell -NoProfile -File C:/Users/username/.claude/statusline.ps1"

927 }

928 }

929 ```

930 

931 ```powershell statusline.ps1 theme={null}

932 $input_json = $input | Out-String | ConvertFrom-Json

933 $cwd = $input_json.cwd

934 $model = $input_json.model.display_name

935 $used = $input_json.context_window.used_percentage

936 $dirname = Split-Path $cwd -Leaf

937 

938 if ($used) {

939 Write-Host "$dirname [$model] ctx: $used%"

940 } else {

941 Write-Host "$dirname [$model]"

942 }

943 ```

944</CodeGroup>

945 

946或者,当安装了 Git Bash 时,直接运行 Bash 脚本:

947 

948<CodeGroup>

949 ```json settings.json theme={null}

950 {

951 "statusLine": {

952 "type": "command",

953 "command": "~/.claude/statusline.sh"

954 }

955 }

956 ```

957 

958 ```bash statusline.sh theme={null}

959 #!/usr/bin/env bash

960 input=$(cat)

961 cwd=$(echo "$input" | grep -o '"cwd":"[^"]*"' | cut -d'"' -f4)

962 model=$(echo "$input" | grep -o '"display_name":"[^"]*"' | cut -d'"' -f4)

963 dirname="${cwd##*[/\\]}"

964 echo "$dirname [$model]"

965 ```

966</CodeGroup>

967 

968## 子代理状态行

969 

970`subagentStatusLine` 设置为代理面板中显示的每个[子代理](/zh-CN/sub-agents)呈现自定义行体。使用它来替换默认的 `name · description · token count` 行为你自己的格式。

971 

972```json theme={null}

973{

974 "subagentStatusLine": {

975 "type": "command",

976 "command": "~/.claude/subagent-statusline.sh"

977 }

978}

979```

980 

981该命令在每个刷新周期运行一次,所有可见的子代理行作为单个 JSON 对象传递到 stdin。输入包括[基本钩子字段](/zh-CN/hooks#common-input-fields)加上 `columns`(可用行宽)和 `tasks` 数组,其中每个任务有 `id`、`name`、`type`、`status`、`description`、`label`、`startTime`、`tokenCount`、`tokenSamples` 和 `cwd`。

982 

983将一个 JSON 行写入 stdout,用于你想覆盖的每一行,形式为 `{"id": "<task id>", "content": "<row body>"}` 。`content` 字符串按原样呈现,包括 ANSI 颜色和 OSC 8 超链接。省略任务的 `id` 以保持该行的默认呈现;发出空 `content` 字符串以隐藏它。

984 

985适用于 `statusLine` 的相同信任和 `disableAllHooks` 门控也适用于此处。插件可以在其[`settings.json`](/zh-CN/plugins-reference#standard-plugin-layout)中提供默认的 `subagentStatusLine`。

986 

987## 提示

988 

989* **使用模拟输入测试**:`echo '{"model":{"display_name":"Opus"},"workspace":{"current_dir":"/home/user/project"},"context_window":{"used_percentage":25},"session_id":"test-session-abc"}' | ./statusline.sh`

990* **保持输出简短**:状态栏的宽度有限,所以长输出可能会被截断或换行不当

991* **缓存慢速操作**:你的脚本在活跃会话期间频繁运行,所以像 `git status` 这样的命令可能会导致延迟。请参阅[缓存示例](#cache-expensive-operations)了解如何处理这个问题。

992 

993社区项目如 [ccstatusline](https://github.com/sirmalloc/ccstatusline) 和 [starship-claude](https://github.com/martinemde/starship-claude) 提供带有主题和其他功能的预构建配置。

994 

995## 故障排除

996 

997**状态行未出现**

998 

999* 验证你的脚本是可执行的:`chmod +x ~/.claude/statusline.sh`

1000* 检查你的脚本输出到 stdout,而不是 stderr

1001* 手动运行你的脚本以验证它产生输出

1002* 如果 `disableAllHooks` 在你的设置中设置为 `true`,状态行也会被禁用。删除此设置或将其设置为 `false` 以重新启用。

1003* 运行 `claude --debug` 以记录会话中第一次状态行调用的退出代码和 stderr

1004* 要求 Claude 读取你的设置文件并直接执行 `statusLine` 命令以显示错误

1005 

1006**状态行显示 `--` 或空值**

1007 

1008* 在第一次 API 响应完成之前,字段可能为 `null`

1009* 在你的脚本中使用回退处理 null 值,如 jq 中的 `// 0`

1010* 如果值在多条消息后仍然为空,请重新启动 Claude Code

1011 

1012**上下文百分比显示意外值**

1013 

1014* 使用 `used_percentage` 获得准确的上下文状态,而不是累积总计

1015* `total_input_tokens` 和 `total_output_tokens` 在整个会话中是累积的,可能超过上下文窗口大小

1016* 上下文百分比可能与 `/context` 输出不同,因为每个的计算时间不同

1017 

1018**OSC 8 链接不可点击**

1019 

1020* 验证你的终端支持 OSC 8 超链接(iTerm2、Kitty、WezTerm)

1021 

1022* Terminal.app 不支持可点击链接

1023 

1024* 如果链接文本出现但不可点击,Claude Code 可能未检测到你的终端中的超链接支持。这通常影响 Windows Terminal 和其他不在自动检测列表中的模拟器。在启动 Claude Code 之前设置 `FORCE_HYPERLINK` 环境变量以覆盖检测:

1025 

1026 ```bash theme={null}

1027 FORCE_HYPERLINK=1 claude

1028 ```

1029 

1030 在 PowerShell 中,首先在当前会话中设置变量:

1031 

1032 ```powershell theme={null}

1033 $env:FORCE_HYPERLINK = "1"; claude

1034 ```

1035 

1036* SSH 和 tmux 会话可能根据配置剥离 OSC 序列

1037 

1038* 如果转义序列显示为文字文本,如 `\e]8;;`,使用 `printf '%b'` 而不是 `echo -e` 以获得更可靠的转义处理

1039 

1040**转义序列显示故障**

1041 

1042* 复杂的转义序列(ANSI 颜色、OSC 8 链接)如果与其他 UI 更新重叠,偶尔会导致输出混乱

1043* 如果你看到损坏的文本,尝试简化你的脚本为纯文本输出

1044* 带有转义码的多行状态行比单行纯文本更容易出现渲染问题

1045 

1046**工作区信任需要**

1047 

1048* 状态行命令仅在你接受当前目录的工作区信任对话框时运行。因为 `statusLine` 执行 shell 命令,它需要与 hooks 和其他执行 shell 的设置相同的信任接受。

1049* 如果未接受信任,你将看到通知 `statusline skipped · restart to fix` 而不是你的状态行输出。重新启动 Claude Code 并接受信任提示以启用它。

1050 

1051**脚本错误或挂起**

1052 

1053* 以非零代码退出或不产生输出的脚本会导致状态行变为空白

1054* 慢速脚本会阻止状态行更新,直到它们完成。保持脚本快速以避免陈旧输出。

1055* 如果在慢速脚本运行时触发新的更新,正在进行的脚本会被取消

1056* 在配置之前使用模拟输入独立测试你的脚本

1057 

1058**通知共享状态行行**

1059 

1060* 系统通知,如 MCP 服务器错误和自动更新,显示在与你的状态行相同行的右侧。临时通知,如上下文低警告,也会循环通过此区域。

1061* 启用详细模式会向此区域添加令牌计数器

1062* 在窄终端上,这些通知可能会截断你的状态行输出

sub-agents.md +1011 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 创建自定义 subagents

6 

7> 在 Claude Code 中创建和使用专门的 AI subagents,用于特定任务的工作流和改进的上下文管理。

8 

9Subagents 是处理特定类型任务的专门 AI 助手。当一个辅助任务会用搜索结果、日志或文件内容充斥您的主对话,而您不会再次引用这些内容时,请使用一个 subagent:该 subagent 在自己的上下文中完成这项工作,仅返回摘要。当您不断生成相同类型的工作者并使用相同的指令时,定义一个自定义 subagent。

10 

11每个 subagent 在自己的 context window 中运行,具有自定义系统提示、特定的工具访问权限和独立的权限。当 Claude 遇到与 subagent 描述相匹配的任务时,它会委托给该 subagent,该 subagent 独立工作并返回结果。要在实践中看到上下文节省,[context window 可视化](/zh-CN/context-window) 演示了一个 subagent 在自己的独立窗口中处理研究的会话。

12 

13<Note>

14 如果您需要多个代理并行工作并相互通信,请参阅 [agent teams](/zh-CN/agent-teams) 代替。Subagents 在单个会话中工作;agent teams 跨多个会话进行协调。

15</Note>

16 

17Subagents 帮助您:

18 

19* **保留上下文**,通过将探索和实现保持在主对话之外

20* **强制执行约束**,通过限制 subagent 可以使用的工具

21* **跨项目重用配置**,使用用户级 subagents

22* **专门化行为**,为特定领域使用专注的系统提示

23* **控制成本**,通过将任务路由到更快、更便宜的模型(如 Haiku)

24 

25Claude 使用每个 subagent 的描述来决定何时委托任务。创建 subagent 时,请编写清晰的描述,以便 Claude 知道何时使用它。

26 

27Claude Code 包括几个内置 subagents,如 **Explore**、**Plan** 和 **general-purpose**。您也可以创建自定义 subagents 来处理特定任务。本页涵盖:

28 

29* [内置 subagents](#built-in-subagents)

30* [如何创建您自己的](#quickstart-create-your-first-subagent)

31* [完整配置选项](#configure-subagents)

32* [使用 subagents 的模式](#work-with-subagents)

33* [分叉 subagents](#fork-the-current-conversation)

34* [示例 subagents](#example-subagents)

35 

36## 内置 subagents

37 

38Claude Code 包括内置 subagents,Claude 在适当时自动使用。每个都继承父对话的权限,并有额外的工具限制。

39 

40<Tabs>

41 <Tab title="Explore">

42 一个快速的、只读的代理,针对搜索和分析代码库进行了优化。

43 

44 * **Model**: Haiku(快速、低延迟)

45 * **Tools**: 只读工具(拒绝访问 Write 和 Edit 工具)

46 * **Purpose**: 文件发现、代码搜索、代码库探索

47 

48 当 Claude 需要搜索或理解代码库而不进行更改时,它会委托给 Explore。这样可以将探索结果保持在主对话上下文之外。

49 

50 调用 Explore 时,Claude 指定一个彻底程度级别:**quick** 用于有针对性的查找,**medium** 用于平衡的探索,或 **very thorough** 用于全面分析。

51 </Tab>

52 

53 <Tab title="Plan">

54 一个研究代理,在 [plan mode](/zh-CN/common-workflows#use-plan-mode-for-safe-code-analysis) 期间使用,以在呈现计划之前收集上下文。

55 

56 * **Model**: 从主对话继承

57 * **Tools**: 只读工具(拒绝访问 Write 和 Edit 工具)

58 * **Purpose**: 用于规划的代码库研究

59 

60 当您处于 plan mode 并且 Claude 需要理解您的代码库时,它会将研究委托给 Plan subagent。这可以防止无限嵌套(subagents 无法生成其他 subagents),同时仍然收集必要的上下文。

61 </Tab>

62 

63 <Tab title="General-purpose">

64 一个能够处理复杂、多步骤任务的代理,需要探索和操作。

65 

66 * **Model**: 从主对话继承

67 * **Tools**: 所有工具

68 * **Purpose**: 复杂研究、多步骤操作、代码修改

69 

70 当任务需要探索和修改、复杂推理来解释结果或多个依赖步骤时,Claude 会委托给 general-purpose。

71 </Tab>

72 

73 <Tab title="Other">

74 Claude Code 包括用于特定任务的其他辅助代理。这些通常会自动调用,因此您不需要直接使用它们。

75 

76 | Agent | Model | Claude 何时使用它 |

77 | :---------------- | :----- | :--------------------------- |

78 | statusline-setup | Sonnet | 当您运行 `/statusline` 来配置您的状态行时 |

79 | Claude Code Guide | Haiku | 当您提出关于 Claude Code 功能的问题时 |

80 </Tab>

81</Tabs>

82 

83除了这些内置 subagents,您可以创建自己的,具有自定义提示、工具限制、权限模式、hooks 和 skills。以下部分展示了如何开始和自定义 subagents。

84 

85## 快速入门:创建您的第一个 subagent

86 

87Subagents 在带有 YAML frontmatter 的 Markdown 文件中定义。您可以 [手动创建它们](#write-subagent-files) 或使用 `/agents` 命令。

88 

89本演练指导您使用 `/agents` 命令创建用户级 subagent。该 subagent 审查代码并为代码库建议改进。

90 

91<Steps>

92 <Step title="打开 subagents 界面">

93 在 Claude Code 中,运行:

94 

95 ```text theme={null}

96 /agents

97 ```

98 </Step>

99 

100 <Step title="选择一个位置">

101 切换到 **Library** 选项卡,选择 **Create new agent**,然后选择 **Personal**。这会将 subagent 保存到 `~/.claude/agents/`,以便在所有项目中可用。

102 </Step>

103 

104 <Step title="使用 Claude 生成">

105 选择 **Generate with Claude**。出现提示时,描述 subagent:

106 

107 ```text theme={null}

108 A code improvement agent that scans files and suggests improvements

109 for readability, performance, and best practices. It should explain

110 each issue, show the current code, and provide an improved version.

111 ```

112 

113 Claude 为您生成标识符、描述和系统提示。

114 </Step>

115 

116 <Step title="选择工具">

117 对于只读审查者,取消选择除 **Read-only tools** 之外的所有内容。如果您保持所有工具被选中,subagent 会继承主对话可用的所有工具。

118 </Step>

119 

120 <Step title="选择模型">

121 选择 subagent 使用的模型。对于此示例代理,选择 **Sonnet**,它在分析代码模式的能力和速度之间取得平衡。

122 </Step>

123 

124 <Step title="选择颜色">

125 为 subagent 选择背景颜色。这有助于您在 UI 中识别哪个 subagent 正在运行。

126 </Step>

127 

128 <Step title="配置内存">

129 选择 **User scope** 为 subagent 提供一个 [persistent memory directory](#enable-persistent-memory),位于 `~/.claude/agent-memory/`。Subagent 使用这个来在对话中积累见解,例如代码库模式和重复出现的问题。如果您不希望 subagent 保留学习,请选择 **None**。

130 </Step>

131 

132 <Step title="保存并尝试">

133 查看配置摘要。按 `s` 或 `Enter` 保存,或按 `e` 在编辑器中保存并编辑文件。Subagent 立即可用。尝试它:

134 

135 ```text theme={null}

136 Use the code-improver agent to suggest improvements in this project

137 ```

138 

139 Claude 委托给您的新 subagent,它扫描代码库并返回改进建议。

140 </Step>

141</Steps>

142 

143现在您有了一个 subagent,可以在您机器上的任何项目中使用它来分析代码库并建议改进。

144 

145您也可以手动创建 subagents 作为 Markdown 文件、通过 CLI 标志定义它们,或通过 plugins 分发它们。以下部分涵盖所有配置选项。

146 

147## 配置 subagents

148 

149### 使用 /agents 命令

150 

151`/agents` 命令打开一个选项卡式界面来管理 subagents。**Running** 选项卡显示实时 subagents,让您打开或停止它们。**Library** 选项卡让您:

152 

153* 查看所有可用的 subagents(内置、用户、项目和 plugin)

154* 使用引导式设置或 Claude 生成创建新的 subagents

155* 编辑现有 subagent 配置和工具访问

156* 删除自定义 subagents

157* 查看当存在重复时哪些 subagents 是活跃的

158 

159这是创建和管理 subagents 的推荐方式。对于手动创建或自动化,您也可以直接添加 subagent 文件。

160 

161要从命令行列出所有配置的 subagents 而不启动交互式会话,请运行 `claude agents`。这显示按来源分组的代理,并指示哪些被更高优先级的定义覆盖。

162 

163### 选择 subagent 范围

164 

165Subagents 是带有 YAML frontmatter 的 Markdown 文件。根据范围将它们存储在不同的位置。当多个 subagents 共享相同的名称时,更高优先级的位置获胜。

166 

167| Location | Scope | Priority | 如何创建 |

168| :-------------------- | :------------ | :------- | :---------------------------------------- |

169| 托管设置 | 组织范围 | 1(最高) | 通过 [managed settings](/zh-CN/settings) 部署 |

170| `--agents` CLI 标志 | 当前会话 | 2 | 启动 Claude Code 时传递 JSON |

171| `.claude/agents/` | 当前项目 | 3 | 交互式或手动 |

172| `~/.claude/agents/` | 所有您的项目 | 4 | 交互式或手动 |

173| Plugin 的 `agents/` 目录 | 启用 plugin 的位置 | 5(最低) | 与 [plugins](/zh-CN/plugins) 一起安装 |

174 

175**项目 subagents**(`.claude/agents/`)非常适合特定于代码库的 subagents。将它们检入版本控制,以便您的团队可以协作使用和改进它们。

176 

177项目 subagents 通过从当前工作目录向上遍历来发现。使用 `--add-dir` 添加的目录 [仅授予文件访问权限](/zh-CN/permissions#additional-directories-grant-file-access-not-configuration),不会扫描 subagents。要在项目间共享 subagents,请使用 `~/.claude/agents/` 或 [plugin](/zh-CN/plugins)。

178 

179**用户 subagents**(`~/.claude/agents/`)是在所有项目中可用的个人 subagents。

180 

181**CLI 定义的 subagents** 在启动 Claude Code 时作为 JSON 传递。它们仅存在于该会话中,不会保存到磁盘,使其对快速测试或自动化脚本很有用。您可以在单个 `--agents` 调用中定义多个 subagents:

182 

183```bash theme={null}

184claude --agents '{

185 "code-reviewer": {

186 "description": "Expert code reviewer. Use proactively after code changes.",

187 "prompt": "You are a senior code reviewer. Focus on code quality, security, and best practices.",

188 "tools": ["Read", "Grep", "Glob", "Bash"],

189 "model": "sonnet"

190 },

191 "debugger": {

192 "description": "Debugging specialist for errors and test failures.",

193 "prompt": "You are an expert debugger. Analyze errors, identify root causes, and provide fixes."

194 }

195}'

196```

197 

198`--agents` 标志接受 JSON,具有与基于文件的 subagents 相同的 [frontmatter](#supported-frontmatter-fields) 字段:`description`、`prompt`、`tools`、`disallowedTools`、`model`、`permissionMode`、`mcpServers`、`hooks`、`maxTurns`、`skills`、`initialPrompt`、`memory`、`effort`、`background`、`isolation` 和 `color`。对系统提示使用 `prompt`,等同于基于文件的 subagents 中的 markdown 正文。

199 

200**托管 subagents** 由组织管理员部署。在 [managed settings directory](/zh-CN/settings#settings-files) 内的 `.claude/agents/` 中放置 markdown 文件,使用与项目和用户 subagents 相同的 frontmatter 格式。托管定义优先于具有相同名称的项目和用户 subagents。

201 

202**Plugin subagents** 来自您已安装的 [plugins](/zh-CN/plugins)。它们与您的自定义 subagents 一起出现在 `/agents` 中。有关创建 plugin subagents 的详细信息,请参阅 [plugin 组件参考](/zh-CN/plugins-reference#agents)。

203 

204<Note>

205 出于安全原因,plugin subagents 不支持 `hooks`、`mcpServers` 或 `permissionMode` frontmatter 字段。加载来自 plugin 的代理时,这些字段被忽略。如果您需要它们,请将代理文件复制到 `.claude/agents/` 或 `~/.claude/agents/`。您也可以在 `settings.json` 或 `settings.local.json` 中向 [`permissions.allow`](/zh-CN/settings#permission-settings) 添加规则,但这些规则适用于整个会话,而不仅仅是 plugin subagent。

206</Note>

207 

208来自任何这些范围的 subagent 定义也可用于 [agent teams](/zh-CN/agent-teams#use-subagent-definitions-for-teammates):当生成一个队友时,您可以引用一个 subagent 类型,队友使用其 `tools` 和 `model`,定义的正文作为额外指令附加到队友的系统提示。有关哪些 frontmatter 字段适用于该路径,请参阅 [agent teams](/zh-CN/agent-teams#use-subagent-definitions-for-teammates)。

209 

210### 编写 subagent 文件

211 

212Subagent 文件使用 YAML frontmatter 进行配置,然后是 Markdown 中的系统提示:

213 

214<Note>

215 Subagents 在会话启动时加载。如果您通过手动添加文件来创建 subagent,请重启您的会话或使用 `/agents` 立即加载它。

216</Note>

217 

218```markdown theme={null}

219---

220name: code-reviewer

221description: Reviews code for quality and best practices

222tools: Read, Glob, Grep

223model: sonnet

224---

225 

226You are a code reviewer. When invoked, analyze the code and provide

227specific, actionable feedback on quality, security, and best practices.

228```

229 

230Frontmatter 定义了 subagent 的元数据和配置。正文成为指导 subagent 行为的系统提示。Subagents 仅接收此系统提示(加上基本环境详细信息,如工作目录),而不是完整的 Claude Code 系统提示。

231 

232一个 subagent 在主对话的当前工作目录中启动。在 subagent 中,`cd` 命令不会在 Bash 或 PowerShell 工具调用之间持续,也不会影响主对话的工作目录。要给 subagent 一个隔离的存储库副本,请改为设置 [`isolation: worktree`](#supported-frontmatter-fields)。

233 

234#### 支持的 frontmatter 字段

235 

236以下字段可以在 YAML frontmatter 中使用。只有 `name` 和 `description` 是必需的。

237 

238| Field | Required | Description |

239| :---------------- | :------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

240| `name` | Yes | 使用小写字母和连字符的唯一标识符 |

241| `description` | Yes | Claude 何时应该委托给此 subagent |

242| `tools` | No | [Tools](#available-tools) subagent 可以使用。如果省略,继承所有工具 |

243| `disallowedTools` | No | 要拒绝的工具,从继承或指定的列表中删除 |

244| `model` | No | [Model](#choose-a-model) 使用:`sonnet`、`opus`、`haiku`、完整模型 ID(例如,`claude-opus-4-7`)或 `inherit`。默认为 `inherit` |

245| `permissionMode` | No | [Permission mode](#permission-modes):`default`、`acceptEdits`、`auto`、`dontAsk`、`bypassPermissions` 或 `plan`。对于 [plugin subagents](#choose-the-subagent-scope) 被忽略 |

246| `maxTurns` | No | subagent 停止前的最大代理轮数 |

247| `skills` | No | [Skills](/zh-CN/skills) 在启动时加载到 subagent 的上下文中。注入完整的技能内容,而不仅仅是可用于调用。Subagents 不继承来自父对话的技能 |

248| `mcpServers` | No | [MCP servers](/zh-CN/mcp) 对此 subagent 可用。每个条目要么是引用已配置服务器的服务器名称(例如,`"slack"`),要么是内联定义,其中服务器名称为键,完整的 [MCP server config](/zh-CN/mcp#installing-mcp-servers) 为值。对于 [plugin subagents](#choose-the-subagent-scope) 被忽略 |

249| `hooks` | No | [Lifecycle hooks](#define-hooks-for-subagents) 限定于此 subagent。对于 [plugin subagents](#choose-the-subagent-scope) 被忽略 |

250| `memory` | No | [Persistent memory scope](#enable-persistent-memory):`user`、`project` 或 `local`。启用跨会话学习 |

251| `background` | No | 设置为 `true` 以始终将此 subagent 作为 [background task](#run-subagents-in-foreground-or-background) 运行。默认:`false` |

252| `effort` | No | 此 subagent 活跃时的努力级别。覆盖会话努力级别。默认:从会话继承。选项:`low`、`medium`、`high`、`xhigh`、`max`;可用级别取决于模型 |

253| `isolation` | No | 设置为 `worktree` 以在临时 [git worktree](/zh-CN/common-workflows#run-parallel-claude-code-sessions-with-git-worktrees) 中运行 subagent,为其提供存储库的隔离副本。如果 subagent 不进行任何更改,worktree 会自动清理 |

254| `color` | No | Subagent 在任务列表和转录中的显示颜色。接受 `red`、`blue`、`green`、`yellow`、`purple`、`orange`、`pink` 或 `cyan` |

255| `initialPrompt` | No | 当此代理作为主会话代理运行时(通过 `--agent` 或 `agent` 设置),自动提交为第一个用户轮次。[Commands](/zh-CN/commands) 和 [skills](/zh-CN/skills) 被处理。前置于任何用户提供的提示 |

256 

257### 选择模型

258 

259`model` 字段控制 subagent 使用的 [AI model](/zh-CN/model-config):

260 

261* **Model alias**: 使用可用的别名之一:`sonnet`、`opus` 或 `haiku`

262* **Full model ID**: 使用完整的模型 ID,如 `claude-opus-4-7` 或 `claude-sonnet-4-6`。接受与 `--model` 标志相同的值

263* **inherit**: 使用与主对话相同的模型

264* **Omitted**: 如果未指定,默认为 `inherit`(使用与主对话相同的模型)

265 

266当 Claude 调用 subagent 时,它也可以为该特定调用传递 `model` 参数。Claude Code 按以下顺序解析 subagent 的模型:

267 

2681. [`CLAUDE_CODE_SUBAGENT_MODEL`](/zh-CN/model-config#environment-variables) 环境变量,如果设置

2692. 每次调用的 `model` 参数

2703. Subagent 定义的 `model` frontmatter

2714. 主对话的模型

272 

273### 控制 subagent 能力

274 

275您可以通过工具访问、权限模式和条件规则来控制 subagents 可以做什么。

276 

277#### 可用工具

278 

279Subagents 可以使用 Claude Code 的任何 [internal tools](/zh-CN/tools-reference)。默认情况下,subagents 继承主对话的所有工具,包括 MCP 工具。

280 

281要限制工具,使用 `tools` 字段(允许列表)或 `disallowedTools` 字段(拒绝列表)。此示例使用 `tools` 来专门允许 Read、Grep、Glob 和 Bash。Subagent 无法编辑文件、写入文件或使用任何 MCP 工具:

282 

283```yaml theme={null}

284---

285name: safe-researcher

286description: Research agent with restricted capabilities

287tools: Read, Grep, Glob, Bash

288---

289```

290 

291此示例使用 `disallowedTools` 来继承主对话的每个工具,除了 Write 和 Edit。Subagent 保留 Bash、MCP 工具和其他所有内容:

292 

293```yaml theme={null}

294---

295name: no-writes

296description: Inherits every tool except file writes

297disallowedTools: Write, Edit

298---

299```

300 

301如果两者都设置,`disallowedTools` 首先应用,然后 `tools` 针对剩余的池进行解析。同时列在两者中的工具被删除。

302 

303#### 限制可以生成哪些 subagents

304 

305当代理作为主线程运行时,使用 `claude --agent`,它可以使用 Agent 工具生成 subagents。要限制它可以生成的 subagent 类型,在 `tools` 字段中使用 `Agent(agent_type)` 语法。

306 

307<Note>在版本 2.1.63 中,Task 工具被重命名为 Agent。设置和代理定义中的现有 `Task(...)` 引用仍然作为别名工作。</Note>

308 

309```yaml theme={null}

310---

311name: coordinator

312description: Coordinates work across specialized agents

313tools: Agent(worker, researcher), Read, Bash

314---

315```

316 

317这是一个允许列表:只有 `worker` 和 `researcher` subagents 可以被生成。如果代理尝试生成任何其他类型,请求失败,代理在其提示中仅看到允许的类型。要在允许所有其他类型的同时阻止特定代理,请改用 [`permissions.deny`](#disable-specific-subagents)。

318 

319要允许生成任何 subagent 而不受限制,使用不带括号的 `Agent`:

320 

321```yaml theme={null}

322tools: Agent, Read, Bash

323```

324 

325如果 `Agent` 完全从 `tools` 列表中省略,代理无法生成任何 subagents。此限制仅适用于作为主线程运行的代理,使用 `claude --agent`。Subagents 无法生成其他 subagents,因此 `Agent(agent_type)` 在 subagent 定义中无效。

326 

327#### 将 MCP 服务器限定于 subagent

328 

329使用 `mcpServers` 字段为 subagent 提供对主对话中不可用的 [MCP](/zh-CN/mcp) 服务器的访问。此处定义的内联服务器在 subagent 启动时连接,在完成时断开连接。字符串引用共享父会话的连接。

330 

331<Note>

332 `mcpServers` 字段适用于代理文件可以运行的两个上下文:

333 

334 * 作为 subagent,通过 Agent 工具或 @-mention 生成

335 * 作为主会话,使用 [`--agent`](#invoke-subagents-explicitly) 或 `agent` 设置启动

336 

337 当代理是主会话时,内联服务器定义与来自 [`.mcp.json`](/zh-CN/mcp) 和设置文件的服务器一起在启动时连接。

338</Note>

339 

340列表中的每个条目要么是内联服务器定义,要么是引用会话中已配置的 MCP 服务器的字符串:

341 

342```yaml theme={null}

343---

344name: browser-tester

345description: Tests features in a real browser using Playwright

346mcpServers:

347 # Inline definition: scoped to this subagent only

348 - playwright:

349 type: stdio

350 command: npx

351 args: ["-y", "@playwright/mcp@latest"]

352 # Reference by name: reuses an already-configured server

353 - github

354---

355 

356Use the Playwright tools to navigate, screenshot, and interact with pages.

357```

358 

359内联定义使用与 `.mcp.json` 服务器条目相同的架构(`stdio`、`http`、`sse`、`ws`),由服务器名称键入。

360 

361要将 MCP 服务器保持在主对话之外,并避免其工具描述消耗那里的上下文,请在此处内联定义它,而不是在 `.mcp.json` 中。Subagent 获得工具;父对话不获得。

362 

363#### 权限模式

364 

365`permissionMode` 字段控制 subagent 如何处理权限提示。Subagents 从主对话继承权限上下文,并可以覆盖模式,除非父模式优先,如下所述。

366 

367| Mode | Behavior |

368| :------------------ | :--------------------------------------------------------------------------------------- |

369| `default` | 标准权限检查,带有提示 |

370| `acceptEdits` | 自动接受文件编辑和工作目录或 `additionalDirectories` 中路径的常见文件系统命令 |

371| `auto` | [Auto mode](/zh-CN/permission-modes#eliminate-prompts-with-auto-mode):后台分类器审查命令和受保护目录的写入 |

372| `dontAsk` | 自动拒绝权限提示(显式允许的工具仍然工作) |

373| `bypassPermissions` | 跳过权限提示 |

374| `plan` | Plan mode(只读探索) |

375 

376<Warning>

377 谨慎使用 `bypassPermissions`。它跳过权限提示,允许 subagent 在没有批准的情况下执行操作,包括对 `.git`、`.claude`、`.vscode`、`.idea` 和 `.husky` 的写入。根目录和主目录删除(如 `rm -rf /`)仍然会作为断路器提示。有关详细信息,请参阅 [permission modes](/zh-CN/permission-modes#skip-all-checks-with-bypasspermissions-mode)。

378</Warning>

379 

380如果父级使用 `bypassPermissions` 或 `acceptEdits`,这优先并且无法被覆盖。如果父级使用 [auto mode](/zh-CN/permission-modes#eliminate-prompts-with-auto-mode),subagent 继承 auto mode,其 frontmatter 中的任何 `permissionMode` 被忽略:分类器使用与父会话相同的块和允许规则评估 subagent 的工具调用。

381 

382#### 将技能预加载到 subagents

383 

384使用 `skills` 字段在启动时将技能内容注入到 subagent 的上下文中。这为 subagent 提供领域知识,而无需在执行期间发现和加载技能。

385 

386```yaml theme={null}

387---

388name: api-developer

389description: Implement API endpoints following team conventions

390skills:

391 - api-conventions

392 - error-handling-patterns

393---

394 

395Implement API endpoints. Follow the conventions and patterns from the preloaded skills.

396```

397 

398每个技能的完整内容被注入到 subagent 的上下文中,而不仅仅是可用于调用。Subagents 不继承来自父对话的技能;您必须明确列出它们。

399 

400您无法预加载设置了 [`disable-model-invocation: true`](/zh-CN/skills#control-who-invokes-a-skill) 的技能,因为预加载来自 Claude 可以调用的相同技能集。如果列出的技能缺失或被禁用,Claude Code 会跳过它并向调试日志记录警告。

401 

402<Note>

403 这与 [在 subagent 中运行技能](/zh-CN/skills#run-skills-in-a-subagent) 相反。使用 subagent 中的 `skills`,subagent 控制系统提示并加载技能内容。使用技能中的 `context: fork`,技能内容被注入到您指定的代理中。两者都使用相同的底层系统。

404</Note>

405 

406#### 启用持久内存

407 

408`memory` 字段为 subagent 提供一个在对话中幸存的持久目录。Subagent 使用此目录随时间积累知识,例如代码库模式、调试见解和架构决策。

409 

410```yaml theme={null}

411---

412name: code-reviewer

413description: Reviews code for quality and best practices

414memory: user

415---

416 

417You are a code reviewer. As you review code, update your agent memory with

418patterns, conventions, and recurring issues you discover.

419```

420 

421根据内存应该应用的广泛程度选择范围:

422 

423| Scope | Location | 使用时机 |

424| :-------- | :-------------------------------------------- | :---------------------------- |

425| `user` | `~/.claude/agent-memory/<name-of-agent>/` | subagent 应该在所有项目中记住学习 |

426| `project` | `.claude/agent-memory/<name-of-agent>/` | subagent 的知识是特定于项目的并可通过版本控制共享 |

427| `local` | `.claude/agent-memory-local/<name-of-agent>/` | subagent 的知识是特定于项目的但不应检入版本控制 |

428 

429启用内存时:

430 

431* Subagent 的系统提示包括读取和写入内存目录的说明。

432* Subagent 的系统提示还包括内存目录中 `MEMORY.md` 的前 200 行或 25KB,以先到者为准,以及如果 `MEMORY.md` 超过该限制则策划 `MEMORY.md` 的说明。

433* Read、Write 和 Edit 工具会自动启用,以便 subagent 可以管理其内存文件。

434 

435##### 持久内存提示

436 

437* `project` 是推荐的默认范围。它使 subagent 知识可通过版本控制共享。当 subagent 的知识在项目中广泛适用时使用 `user`,或当知识不应检入版本控制时使用 `local`。

438* 要求 subagent 在开始工作前查阅其内存:"Review this PR, and check your memory for patterns you've seen before."

439* 要求 subagent 在完成任务后更新其内存:"Now that you're done, save what you learned to your memory." 随着时间的推移,这会建立一个知识库,使 subagent 更有效。

440* 直接在 subagent 的 markdown 文件中包含内存说明,以便它主动维护自己的知识库:

441 

442 ```markdown theme={null}

443 Update your agent memory as you discover codepaths, patterns, library

444 locations, and key architectural decisions. This builds up institutional

445 knowledge across conversations. Write concise notes about what you found

446 and where.

447 ```

448 

449#### 使用 hooks 的条件规则

450 

451为了更动态地控制工具使用,使用 `PreToolUse` hooks 在执行前验证操作。当您需要允许工具的某些操作同时阻止其他操作时,这很有用。

452 

453此示例创建一个仅允许只读数据库查询的 subagent。`PreToolUse` hook 在每个 Bash 命令执行前运行 `command` 中指定的脚本:

454 

455```yaml theme={null}

456---

457name: db-reader

458description: Execute read-only database queries

459tools: Bash

460hooks:

461 PreToolUse:

462 - matcher: "Bash"

463 hooks:

464 - type: command

465 command: "./scripts/validate-readonly-query.sh"

466---

467```

468 

469Claude Code [通过 stdin 将 hook 输入作为 JSON 传递](/zh-CN/hooks#pretooluse-input) 给 hook 命令。验证脚本读取此 JSON,提取 Bash 命令,并 [以代码 2 退出](/zh-CN/hooks#exit-code-2-behavior-per-event) 以阻止写入操作:

470 

471```bash theme={null}

472#!/bin/bash

473# ./scripts/validate-readonly-query.sh

474 

475INPUT=$(cat)

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

477 

478# Block SQL write operations (case-insensitive)

479if echo "$COMMAND" | grep -iE '\b(INSERT|UPDATE|DELETE|DROP|CREATE|ALTER|TRUNCATE)\b' > /dev/null; then

480 echo "Blocked: Only SELECT queries are allowed" >&2

481 exit 2

482fi

483 

484exit 0

485```

486 

487有关完整的输入架构,请参阅 [Hook input](/zh-CN/hooks#pretooluse-input),有关退出代码如何影响行为,请参阅 [exit codes](/zh-CN/hooks#exit-code-output)。

488 

489#### 禁用特定 subagents

490 

491您可以通过将 subagents 添加到您的 [settings](/zh-CN/settings#permission-settings) 中的 `deny` 数组来防止 Claude 使用特定 subagents。使用格式 `Agent(subagent-name)`,其中 `subagent-name` 与 subagent 的 name 字段匹配。

492 

493```json theme={null}

494{

495 "permissions": {

496 "deny": ["Agent(Explore)", "Agent(my-custom-agent)"]

497 }

498}

499```

500 

501这对内置和自定义 subagents 都有效。您也可以使用 `--disallowedTools` CLI 标志:

502 

503```bash theme={null}

504claude --disallowedTools "Agent(Explore)"

505```

506 

507有关权限规则的更多详细信息,请参阅 [Permissions documentation](/zh-CN/permissions#tool-specific-permission-rules)。

508 

509### 为 subagents 定义 hooks

510 

511Subagents 可以定义在 subagent 的生命周期中运行的 [hooks](/zh-CN/hooks)。有两种方式来配置 hooks:

512 

5131. **在 subagent 的 frontmatter 中**:定义仅在该 subagent 活跃时运行的 hooks

5142. **在 `settings.json` 中**:定义在 subagents 启动或停止时在主会话中运行的 hooks

515 

516#### Subagent frontmatter 中的 Hooks

517 

518直接在 subagent 的 markdown 文件中定义 hooks。这些 hooks 仅在该特定 subagent 活跃时运行,并在完成时清理。

519 

520<Note>

521 Frontmatter hooks 在代理通过 Agent 工具或 @-mention 作为 subagent 生成时触发,以及当代理通过 [`--agent`](#invoke-subagents-explicitly) 或 `agent` 设置作为主会话运行时触发。在主会话情况下,它们与在 [`settings.json`](/zh-CN/hooks) 中定义的任何 hooks 一起运行。

522</Note>

523 

524所有 [hook events](/zh-CN/hooks#hook-events) 都被支持。subagents 最常见的事件是:

525 

526| Event | Matcher input | 何时触发 |

527| :------------ | :------------ | :------------------------------------- |

528| `PreToolUse` | Tool name | 在 subagent 使用工具之前 |

529| `PostToolUse` | Tool name | 在 subagent 使用工具之后 |

530| `Stop` | (none) | 当 subagent 完成时(在运行时转换为 `SubagentStop`) |

531 

532此示例使用 `PreToolUse` hook 验证 Bash 命令,并在文件编辑后使用 `PostToolUse` 运行 linter:

533 

534```yaml theme={null}

535---

536name: code-reviewer

537description: Review code changes with automatic linting

538hooks:

539 PreToolUse:

540 - matcher: "Bash"

541 hooks:

542 - type: command

543 command: "./scripts/validate-command.sh $TOOL_INPUT"

544 PostToolUse:

545 - matcher: "Edit|Write"

546 hooks:

547 - type: command

548 command: "./scripts/run-linter.sh"

549---

550```

551 

552Frontmatter 中的 `Stop` hooks 会自动转换为 `SubagentStop` 事件。

553 

554#### 用于 subagent 事件的项目级 hooks

555 

556在 `settings.json` 中配置 hooks,以响应主会话中的 subagent 生命周期事件。

557 

558| Event | Matcher input | 何时触发 |

559| :-------------- | :-------------- | :--------------- |

560| `SubagentStart` | Agent type name | 当 subagent 开始执行时 |

561| `SubagentStop` | Agent type name | 当 subagent 完成时 |

562 

563两个事件都支持匹配器以按名称针对特定代理类型。此示例仅在 `db-agent` subagent 启动时运行设置脚本,并在任何 subagent 停止时运行清理脚本:

564 

565```json theme={null}

566{

567 "hooks": {

568 "SubagentStart": [

569 {

570 "matcher": "db-agent",

571 "hooks": [

572 { "type": "command", "command": "./scripts/setup-db-connection.sh" }

573 ]

574 }

575 ],

576 "SubagentStop": [

577 {

578 "hooks": [

579 { "type": "command", "command": "./scripts/cleanup-db-connection.sh" }

580 ]

581 }

582 ]

583 }

584}

585```

586 

587有关完整的 hook 配置格式,请参阅 [Hooks](/zh-CN/hooks)。

588 

589## 使用 subagents

590 

591### 理解自动委托

592 

593Claude 根据您请求中的任务描述、subagent 配置中的 `description` 字段和当前上下文自动委托任务。要鼓励主动委托,在您的 subagent 的 description 字段中包含"use proactively"之类的短语。

594 

595### 显式调用 subagents

596 

597当自动委托不够时,您可以自己请求 subagent。三种模式从一次性建议升级到会话范围的默认值:

598 

599* **自然语言**:在提示中命名 subagent;Claude 决定是否委托

600* **@-mention**:保证 subagent 为一个任务运行

601* **会话范围**:整个会话使用该 subagent 的系统提示、工具限制和模型,通过 `--agent` 标志或 `agent` 设置

602 

603对于自然语言,没有特殊语法。命名 subagent,Claude 通常会委托:

604 

605```text theme={null}

606Use the test-runner subagent to fix failing tests

607Have the code-reviewer subagent look at my recent changes

608```

609 

610**@-mention subagent。** 输入 `@` 并从类型提前中选择 subagent,就像您 @-mention 文件一样。这确保特定 subagent 运行,而不是将选择留给 Claude:

611 

612```text theme={null}

613@"code-reviewer (agent)" look at the auth changes

614```

615 

616您的完整消息仍然发送给 Claude,它根据您的要求为 subagent 编写任务提示。@-mention 控制调用哪个 subagent,而不是它接收什么提示。

617 

618由启用的 [plugin](/zh-CN/plugins) 提供的 Subagents 在类型提前中显示为 `<plugin-name>:<agent-name>`。命名背景 subagents 当前在会话中运行也出现在类型提前中,在名称旁边显示其状态。您也可以手动输入提及而不使用选择器:`@agent-<name>` 用于本地 subagents,或 `@agent-<plugin-name>:<agent-name>` 用于 plugin subagents。

619 

620**将整个会话作为 subagent 运行。** 传递 [`--agent <name>`](/zh-CN/cli-reference) 以启动一个会话,其中主线程本身采用该 subagent 的系统提示、工具限制和模型:

621 

622```bash theme={null}

623claude --agent code-reviewer

624```

625 

626Subagent 的系统提示完全替换默认 Claude Code 系统提示,就像 [`--system-prompt`](/zh-CN/cli-reference) 一样。`CLAUDE.md` 文件和项目内存仍然通过正常消息流加载。代理名称在启动标题中显示为 `@<name>`,以便您可以确认它是活跃的。

627 

628这适用于内置和自定义 subagents,当您恢复会话时选择会持续。

629 

630对于 plugin 提供的 subagent,传递作用域名称:`claude --agent <plugin-name>:<agent-name>`。

631 

632要使其成为项目中每个会话的默认值,在 `.claude/settings.json` 中设置 `agent`:

633 

634```json theme={null}

635{

636 "agent": "code-reviewer"

637}

638```

639 

640如果两者都存在,CLI 标志覆盖设置。

641 

642### 在前台或后台运行 subagents

643 

644Subagents 可以在前台(阻塞)或后台(并发)运行:

645 

646* **前台 subagents** 阻塞主对话直到完成。权限提示和澄清问题(如 [`AskUserQuestion`](/zh-CN/tools-reference))会传递给您。

647* **后台 subagents** 在您继续工作时并发运行。启动前,Claude Code 会提示您 subagent 需要的任何工具权限,确保它具有必要的批准。一旦运行,subagent 继承这些权限并自动拒绝任何未预先批准的内容。如果后台 subagent 需要提出澄清问题,该工具调用失败,但 subagent 继续。

648 

649如果后台 subagent 由于缺少权限而失败,您可以启动一个新的前台 subagent 来执行相同的任务以使用交互式提示重试。

650 

651Claude 根据任务决定是否在前台或后台运行 subagents。您也可以:

652 

653* 要求 Claude "run this in the background"

654* 按 **Ctrl+B** 将运行中的任务放在后台

655 

656要禁用所有后台任务功能,请将 `CLAUDE_CODE_DISABLE_BACKGROUND_TASKS` 环境变量设置为 `1`。请参阅 [Environment variables](/zh-CN/env-vars)。

657 

658当 [fork mode](#fork-the-current-conversation) 启用时,每个 subagent 生成都在后台运行,无论 `background` 字段如何。分叉仍然在您的终端中出现权限提示,而不是预先批准;命名 subagents 遵循上面的预批准流程。

659 

660### 常见模式

661 

662#### 隔离高容量操作

663 

664subagents 最有效的用途之一是隔离产生大量输出的操作。运行测试、获取文档或处理日志文件可能会消耗大量上下文。通过将这些委托给 subagent,详细输出保留在 subagent 的上下文中,而只有相关摘要返回到您的主对话。

665 

666```text theme={null}

667Use a subagent to run the test suite and report only the failing tests with their error messages

668```

669 

670#### 运行并行研究

671 

672对于独立的调查,生成多个 subagents 以同时工作:

673 

674```text theme={null}

675Research the authentication, database, and API modules in parallel using separate subagents

676```

677 

678每个 subagent 独立探索其区域,然后 Claude 综合这些发现。当研究路径彼此不依赖时,这效果最好。

679 

680<Warning>

681 当 subagents 完成时,它们的结果返回到您的主对话。运行许多 subagents,每个都返回详细结果,可能会消耗大量上下文。

682</Warning>

683 

684对于需要持续并行性或超过您的 context window 的任务,[agent teams](/zh-CN/agent-teams) 为每个工作者提供自己的独立上下文。

685 

686#### 链接 subagents

687 

688对于多步骤工作流,要求 Claude 按顺序使用 subagents。每个 subagent 完成其任务并将结果返回给 Claude,然后将相关上下文传递给下一个 subagent。

689 

690```text theme={null}

691Use the code-reviewer subagent to find performance issues, then use the optimizer subagent to fix them

692```

693 

694### 在 subagents 和主对话之间选择

695 

696在以下情况下使用 **主对话**:

697 

698* 任务需要频繁的来回或迭代细化

699* 多个阶段共享重要上下文(规划 → 实现 → 测试)

700* 您正在进行快速、有针对性的更改

701* 延迟很重要。Subagents 从头开始,可能需要时间来收集上下文

702 

703在以下情况下使用 **subagents**:

704 

705* 任务产生您不需要在主上下文中的详细输出

706* 您想强制执行特定的工具限制或权限

707* 工作是自包含的,可以返回摘要

708 

709当您想要可重用的提示或在主对话上下文中运行的工作流而不是隔离的 subagent 上下文时,请改为考虑 [Skills](/zh-CN/skills)。

710 

711对于关于对话中已有内容的快速问题,使用 [`/btw`](/zh-CN/interactive-mode#side-questions-with-%2Fbtw) 而不是 subagent。它看到您的完整上下文但没有工具访问,答案被丢弃而不是添加到历史记录。

712 

713<Note>

714 Subagents 无法生成其他 subagents。如果您的工作流需要嵌套委托,请使用 [Skills](/zh-CN/skills) 或从主对话 [链接 subagents](#chain-subagents)。

715</Note>

716 

717### 管理 subagent 上下文

718 

719#### 恢复 subagents

720 

721每个 subagent 调用都会创建一个具有新鲜上下文的新实例。要继续现有 subagent 的工作而不是重新开始,要求 Claude 恢复它。

722 

723恢复的 subagents 保留其完整的对话历史,包括所有以前的工具调用、结果和推理。Subagent 从它停止的地方继续,而不是从头开始。

724 

725当 subagent 完成时,Claude 接收其代理 ID。Claude 使用 `SendMessage` 工具,将代理的 ID 作为 `to` 字段来恢复它。`SendMessage` 工具仅在通过 `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1` 启用 [agent teams](/zh-CN/agent-teams) 时可用。

726 

727要恢复 subagent,要求 Claude 继续之前的工作:

728 

729```text theme={null}

730Use the code-reviewer subagent to review the authentication module

731[Agent completes]

732 

733Continue that code review and now analyze the authorization logic

734[Claude resumes the subagent with full context from previous conversation]

735```

736 

737如果停止的 subagent 接收 `SendMessage`,它会在后台自动恢复,无需新的 `Agent` 调用。

738 

739您也可以要求 Claude 提供代理 ID,如果您想明确引用它,或在 `~/.claude/projects/{project}/{sessionId}/subagents/` 的转录文件中找到 ID。每个转录存储为 `agent-{agentId}.jsonl`。

740 

741Subagent 转录独立于主对话持久化:

742 

743* **主对话压缩**:当主对话压缩时,subagent 转录不受影响。它们存储在单独的文件中。

744* **会话持久性**:Subagent 转录在其会话中持久化。您可以通过恢复相同的会话在重启 Claude Code 后 [恢复 subagent](#resume-subagents)。

745* **自动清理**:转录根据 `cleanupPeriodDays` 设置(默认:30 天)进行清理。

746 

747#### 自动压缩

748 

749Subagents 支持使用与主对话相同的逻辑进行自动压缩。默认情况下,自动压缩在大约 95% 容量时触发。要更早触发压缩,请将 `CLAUDE_AUTOCOMPACT_PCT_OVERRIDE` 设置为较低的百分比(例如,`50`)。有关详细信息,请参阅 [environment variables](/zh-CN/env-vars)。

750 

751压缩事件记录在 subagent 转录文件中:

752 

753```json theme={null}

754{

755 "type": "system",

756 "subtype": "compact_boundary",

757 "compactMetadata": {

758 "trigger": "auto",

759 "preTokens": 167189

760 }

761}

762```

763 

764`preTokens` 值显示压缩发生前使用了多少令牌。

765 

766## 分叉当前对话

767 

768<Note>

769 分叉 subagents 是实验性的,需要 Claude Code v2.1.117 或更高版本。行为和配置可能在未来版本中更改。通过将 [`CLAUDE_CODE_FORK_SUBAGENT`](/zh-CN/env-vars) 环境变量设置为 `1` 来启用它们。该变量在交互模式以及通过 SDK 或 `claude -p` 中被遵守。

770</Note>

771 

772分叉是一个 subagent,它继承到目前为止的整个对话,而不是从头开始。这消除了 subagents 通常提供的输入隔离:分叉看到与主会话相同的系统提示、工具、模型和消息历史,因此您可以将其交给一个辅助任务而无需重新解释情况。分叉自己的工具调用仍然保持在您的对话之外,只有其最终结果返回,因此您的主 context window 保持干净。当命名 subagent 需要太多背景才能有用时,或当您想从相同的起点并行尝试多种方法时,使用分叉。

773 

774启用分叉模式以三种方式改变 Claude Code:

775 

776* Claude 在它会使用 [general-purpose](#built-in-subagents) subagent 时生成分叉。命名 subagents 如 Explore 仍然像以前一样生成。

777* 每个 subagent 生成都在 [background](#run-subagents-in-foreground-or-background) 中运行,无论它是分叉还是命名 subagent。设置 `CLAUDE_CODE_DISABLE_BACKGROUND_TASKS` 为 `1` 以保持生成同步。

778* `/fork` 命令生成分叉而不是充当 [`/branch`](/zh-CN/commands) 的别名。

779 

780您可以使用 `/fork` 后跟指令自己启动分叉。Claude Code 从指令的前几个单词命名分叉。以下示例分叉对话以在您继续主会话中的实现时草拟测试用例:

781 

782```text theme={null}

783/fork draft unit tests for the parser changes so far

784```

785 

786分叉出现在提示下方的面板中,并在您继续工作时在后台运行。完成后,其结果作为消息到达您的主对话。下一部分涵盖了在分叉运行时观察和引导它们的面板控制。

787 

788### 观察和引导运行中的分叉

789 

790运行中的分叉出现在提示输入下方的面板中,主会话有一行,每个分叉有一行。使用这些键与面板交互:

791 

792| Key | Action |

793| :-------- | :----------------- |

794| `↑` / `↓` | 在行之间移动 |

795| `Enter` | 打开所选分叉的转录并向其发送后续消息 |

796| `x` | 关闭完成的分叉或停止运行中的分叉 |

797| `Esc` | 将焦点返回到提示输入 |

798 

799### 分叉与命名 subagents 的区别

800 

801分叉继承主会话在生成时拥有的一切。命名 subagent 从自己的定义开始。

802 

803| | 分叉 | 命名 subagent |

804| :----------- | :--------- | :--------------------------------------------------------------------- |

805| 上下文 | 完整的对话历史 | 新鲜上下文,带有您传递的提示 |

806| 系统提示和工具 | 与主会话相同 | 来自 subagent 的 [definition file](#write-subagent-files) |

807| 模型 | 与主会话相同 | 来自 subagent 的 `model` 字段 |

808| 权限 | 提示在您的终端中出现 | [Pre-approved](#run-subagents-in-foreground-or-background) 在启动前,然后自动拒绝 |

809| Prompt cache | 与主会话共享 | 单独的缓存 |

810 

811因为分叉的系统提示和工具定义与父级相同,其第一个请求重用父级的 prompt cache。这使得分叉比为需要相同上下文的任务生成新 subagent 更便宜。

812 

813当 Claude 通过 Agent 工具生成分叉时,它可以传递 `isolation: "worktree"` 以便分叉的文件编辑被写入单独的 git worktree 而不是您的检出。

814 

815### 限制

816 

817设置 `CLAUDE_CODE_FORK_SUBAGENT=1` 在交互式会话、[non-interactive mode](/zh-CN/headless) 和 Agent SDK 中启用分叉模式。分叉无法生成进一步的分叉。

818 

819## 示例 subagents

820 

821这些示例演示了构建 subagents 的有效模式。将它们用作起点,或使用 Claude 生成自定义版本。

822 

823<Tip>

824 **最佳实践:**

825 

826 * **设计专注的 subagents:** 每个 subagent 应该在一个特定任务中表现出色

827 * **编写详细的描述:** Claude 使用描述来决定何时委托

828 * **限制工具访问:** 仅授予必要的权限以确保安全和专注

829 * **检入版本控制:** 与您的团队共享项目 subagents

830</Tip>

831 

832### 代码审查者

833 

834一个只读 subagent,审查代码而不修改它。此示例展示了如何设计一个专注的 subagent,具有有限的工具访问(无 Edit 或 Write)和详细的提示,指定确切要查找的内容以及如何格式化输出。

835 

836```markdown theme={null}

837---

838name: code-reviewer

839description: Expert code review specialist. Proactively reviews code for quality, security, and maintainability. Use immediately after writing or modifying code.

840tools: Read, Grep, Glob, Bash

841model: inherit

842---

843 

844You are a senior code reviewer ensuring high standards of code quality and security.

845 

846When invoked:

8471. Run git diff to see recent changes

8482. Focus on modified files

8493. Begin review immediately

850 

851Review checklist:

852- Code is clear and readable

853- Functions and variables are well-named

854- No duplicated code

855- Proper error handling

856- No exposed secrets or API keys

857- Input validation implemented

858- Good test coverage

859- Performance considerations addressed

860 

861Provide feedback organized by priority:

862- Critical issues (must fix)

863- Warnings (should fix)

864- Suggestions (consider improving)

865 

866Include specific examples of how to fix issues.

867```

868 

869### 调试器

870 

871一个可以分析和修复问题的 subagent。与代码审查者不同,这个包括 Edit,因为修复错误需要修改代码。提示提供了从诊断到验证的清晰工作流。

872 

873```markdown theme={null}

874---

875name: debugger

876description: Debugging specialist for errors, test failures, and unexpected behavior. Use proactively when encountering any issues.

877tools: Read, Edit, Bash, Grep, Glob

878---

879 

880You are an expert debugger specializing in root cause analysis.

881 

882When invoked:

8831. Capture error message and stack trace

8842. Identify reproduction steps

8853. Isolate the failure location

8864. Implement minimal fix

8875. Verify solution works

888 

889Debugging process:

890- Analyze error messages and logs

891- Check recent code changes

892- Form and test hypotheses

893- Add strategic debug logging

894- Inspect variable states

895 

896For each issue, provide:

897- Root cause explanation

898- Evidence supporting the diagnosis

899- Specific code fix

900- Testing approach

901- Prevention recommendations

902 

903Focus on fixing the underlying issue, not the symptoms.

904```

905 

906### 数据科学家

907 

908一个用于数据分析工作的特定领域 subagent。此示例展示了如何为典型编码任务之外的专门工作流创建 subagents。它明确设置 `model: sonnet` 以获得更强大的分析能力。

909 

910```markdown theme={null}

911---

912name: data-scientist

913description: Data analysis expert for SQL queries, BigQuery operations, and data insights. Use proactively for data analysis tasks and queries.

914tools: Bash, Read, Write

915model: sonnet

916---

917 

918You are a data scientist specializing in SQL and BigQuery analysis.

919 

920When invoked:

9211. Understand the data analysis requirement

9222. Write efficient SQL queries

9233. Use BigQuery command line tools (bq) when appropriate

9244. Analyze and summarize results

9255. Present findings clearly

926 

927Key practices:

928- Write optimized SQL queries with proper filters

929- Use appropriate aggregations and joins

930- Include comments explaining complex logic

931- Format results for readability

932- Provide data-driven recommendations

933 

934For each analysis:

935- Explain the query approach

936- Document any assumptions

937- Highlight key findings

938- Suggest next steps based on data

939 

940Always ensure queries are efficient and cost-effective.

941```

942 

943### 数据库查询验证器

944 

945一个允许 Bash 访问但验证命令以仅允许只读 SQL 查询的 subagent。此示例展示了当您需要比 `tools` 字段提供的更精细的控制时如何使用 `PreToolUse` hooks。

946 

947```markdown theme={null}

948---

949name: db-reader

950description: Execute read-only database queries. Use when analyzing data or generating reports.

951tools: Bash

952hooks:

953 PreToolUse:

954 - matcher: "Bash"

955 hooks:

956 - type: command

957 command: "./scripts/validate-readonly-query.sh"

958---

959 

960You are a database analyst with read-only access. Execute SELECT queries to answer questions about the data.

961 

962When asked to analyze data:

9631. Identify which tables contain the relevant data

9642. Write efficient SELECT queries with appropriate filters

9653. Present results clearly with context

966 

967You cannot modify data. If asked to INSERT, UPDATE, DELETE, or modify schema, explain that you only have read access.

968```

969 

970Claude Code [通过 stdin 将 hook 输入作为 JSON 传递](/zh-CN/hooks#pretooluse-input) 给 hook 命令。验证脚本读取此 JSON,提取正在执行的命令,并根据 SQL 写入操作列表检查它。如果检测到写入操作,脚本 [以代码 2 退出](/zh-CN/hooks#exit-code-2-behavior-per-event) 以阻止执行,并通过 stderr 向 Claude 返回错误消息。

971 

972在您的项目中的任何位置创建验证脚本。路径必须与您的 hook 配置中的 `command` 字段匹配:

973 

974```bash theme={null}

975#!/bin/bash

976# Blocks SQL write operations, allows SELECT queries

977 

978# Read JSON input from stdin

979INPUT=$(cat)

980 

981# Extract the command field from tool_input using jq

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

983 

984if [ -z "$COMMAND" ]; then

985 exit 0

986fi

987 

988# Block write operations (case-insensitive)

989if echo "$COMMAND" | grep -iE '\b(INSERT|UPDATE|DELETE|DROP|CREATE|ALTER|TRUNCATE|REPLACE|MERGE)\b' > /dev/null; then

990 echo "Blocked: Write operations not allowed. Use SELECT queries only." >&2

991 exit 2

992fi

993 

994exit 0

995```

996 

997使脚本可执行:

998 

999```bash theme={null}

1000chmod +x ./scripts/validate-readonly-query.sh

1001```

1002 

1003Hook 通过 stdin 接收 JSON,Bash 命令在 `tool_input.command` 中。退出代码 2 阻止操作并将错误消息反馈给 Claude。有关退出代码和 [Hook input](/zh-CN/hooks#pretooluse-input) 的详细信息,请参阅 [Hooks](/zh-CN/hooks#exit-code-output) 以获取完整的输入架构。

1004 

1005## 后续步骤

1006 

1007现在您了解了 subagents,探索这些相关功能:

1008 

1009* [使用 plugins 分发 subagents](/zh-CN/plugins) 以在团队或项目中共享 subagents

1010* [以编程方式运行 Claude Code](/zh-CN/headless),使用 Agent SDK 进行 CI/CD 和自动化

1011* [使用 MCP 服务器](/zh-CN/mcp) 为 subagents 提供对外部工具和数据的访问

terminal-config.md +307 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 为 Claude Code 配置您的终端

6 

7> 修复 Shift+Enter 以实现换行、在 Claude 完成时获得终端铃声、配置 tmux、匹配颜色主题,以及在 Claude Code CLI 中启用 Vim 模式。

8 

9Claude Code 在任何终端中都可以无需配置而工作。此页面适用于当某些特定功能的行为不符合您的预期时。在下面找到您的症状。如果一切都已经感觉正确,您不需要此页面。

10 

11* [Shift+Enter 提交而不是插入换行](#enter-multiline-prompts)

12* [Option 键快捷键在 macOS 上无效](#enable-option-key-shortcuts-on-macos)

13* [Claude 完成时没有声音或警报](#get-a-terminal-bell-or-notification)

14* [您在 tmux 内运行 Claude Code](#configure-tmux)

15* [显示闪烁或滚动条跳跃](#switch-to-fullscreen-rendering)

16* [您想在提示符中使用 Vim 快捷键](#edit-prompts-with-vim-keybindings)

17 

18此页面是关于让您的终端向 Claude Code 发送正确的信号。要更改 Claude Code 本身响应的快捷键,请改为参阅[快捷键](/zh-CN/keybindings)。

19 

20## 输入多行提示符

21 

22按 Enter 提交您的消息。要添加换行符而不提交,请按 Ctrl+J,或输入 `\` 然后按 Enter。两者都在每个终端中工作,无需设置。

23 

24在大多数终端中,您也可以按 Shift+Enter,但支持因终端模拟器而异:

25 

26| 终端 | Shift+Enter 换行 |

27| :------------------------------------------------------------------------ | :--------------------------- |

28| Ghostty、Kitty、iTerm2、WezTerm、Warp、Apple Terminal | 无需设置即可工作 |

29| VS Code、Cursor、Windsurf、Alacritty、Zed | 运行一次 `/terminal-setup` |

30| Windows Terminal、gnome-terminal、JetBrains IDE(如 PyCharm 和 Android Studio) | 不可用;使用 Ctrl+J 或 `\` 然后 Enter |

31 

32对于 VS Code、Cursor、Windsurf、Alacritty 和 Zed,`/terminal-setup` 将 Shift+Enter 和其他快捷键写入终端的配置文件。在 VS Code、Cursor 和 Windsurf 中,它还在编辑器设置中设置 `terminal.integrated.mouseWheelScrollSensitivity`,以在[全屏模式](/zh-CN/fullscreen)中实现更平滑的滚动。现有的绑定和设置保持不变;如果您看到诸如 `VSCode terminal Shift+Enter key binding already configured` 之类的消息,则未进行任何更改。在主机终端中直接运行 `/terminal-setup` 而不是在 tmux 或 screen 内运行,因为它需要写入主机终端的配置。

33 

34如果您在 tmux 内运行,即使外部终端支持,Shift+Enter 也需要下面的 [tmux 配置](#configure-tmux)。

35 

36要将换行绑定到不同的快捷键,或交换行为使 Enter 插入换行而 Shift+Enter 提交,请在您的[快捷键文件](/zh-CN/keybindings)中映射 `chat:newline` 和 `chat:submit` 操作。

37 

38## 在 macOS 上启用 Option 快捷键

39 

40某些 Claude Code 快捷键使用 Option 键,例如 Option+Enter 换行或 Option+P 切换模型。在 macOS 上,大多数终端默认不将 Option 作为修饰符发送,因此这些快捷键在您启用它之前无效。此终端设置通常标记为"使用 Option 作为 Meta 键";Meta 是现在标记为 Option 或 Alt 的快捷键的历史 Unix 名称。

41 

42<Tabs>

43 <Tab title="Apple Terminal">

44 打开设置 → 配置文件 → 键盘并勾选"使用 Option 作为 Meta 键"。

45 

46 如果您接受了 Claude Code 的首次运行提示,该提示提供了"Option+Enter 换行和视觉铃声",这已经完成。该提示为您运行 `/terminal-setup`,它在您的 Apple Terminal 配置文件中启用 Option 作为 Meta 并将音频铃声切换为视觉屏幕闪烁。

47 </Tab>

48 

49 <Tab title="iTerm2">

50 打开设置 → 配置文件 → 快捷键 → 常规并将左 Option 快捷键和右 Option 快捷键设置为"Esc+"。

51 

52 在 iTerm2 中运行 `/terminal-setup` 会在设置 → 常规 → 选择下启用"终端中的应用程序可以访问剪贴板",以便 `/copy` 命令可以写入您的系统剪贴板。该命令即使在 tmux 内运行时也能检测到 iTerm2。重启 iTerm2 以使更改生效。

53 </Tab>

54 

55 <Tab title="VS Code">

56 将 `"terminal.integrated.macOptionIsMeta": true` 添加到您的 VS Code 设置。

57 </Tab>

58</Tabs>

59 

60对于 Ghostty、Kitty 和其他终端,请在终端的配置文件中查找 Option-as-Alt 或 Option-as-Meta 设置。

61 

62## 获取终端铃声或通知

63 

64当 Claude 完成任务或暂停以获得权限提示时,它会触发通知事件。将其显示为终端铃声或桌面通知可让您在长任务运行时切换到其他工作。

65 

66默认情况下,Claude Code 仅在 Ghostty、Kitty 和 iTerm2 中发送桌面通知。在其他终端中,将 [`preferredNotifChannel`](/zh-CN/settings#available-settings) 设置为 `"terminal_bell"` 以改为响铃终端铃声,或配置[通知钩子](#play-a-sound-with-a-notification-hook)以获得自定义声音或命令。

67 

68桌面通知通过 SSH 到达您的本地机器,因此远程会话仍然可以提醒您。Ghostty 和 Kitty 无需进一步设置即可将其转发到您的 OS 通知中心。iTerm2 要求您启用转发:

69 

70<Steps>

71 <Step title="打开 iTerm2 通知设置">

72 转到设置 → 配置文件 → 终端。

73 </Step>

74 

75 <Step title="启用警报">

76 勾选"通知中心警报",然后单击"过滤警报"并启用"发送转义序列生成的警报"。

77 </Step>

78</Steps>

79 

80如果通知仍未出现,请确认您的终端应用程序在您的 OS 设置中具有通知权限,如果您在 tmux 内运行,请[启用直通](#configure-tmux)。

81 

82### 使用通知钩子播放声音

83 

84在任何终端中,您可以配置[通知钩子](/zh-CN/hooks-guide#get-notified-when-claude-needs-input)以在 Claude 需要您的注意时播放声音或运行自定义命令。钩子与内置通知一起运行,而不是替代它,因此不接收桌面通知的终端(如 Warp 或 VS Code 集成终端)可以使用钩子或将 `preferredNotifChannel` 设置为 `"terminal_bell"` 代替。

85 

86下面的示例在 macOS 上播放系统声音。链接的指南包含 macOS、Linux 和 Windows 的桌面通知命令。

87 

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

89{

90 "hooks": {

91 "Notification": [

92 {

93 "hooks": [{ "type": "command", "command": "afplay /System/Library/Sounds/Glass.aiff" }]

94 }

95 ]

96 }

97}

98```

99 

100## 配置 tmux

101 

102当 Claude Code 在 tmux 内运行时,默认情况下两件事会中断:Shift+Enter 提交而不是插入换行,桌面通知和[进度条](/zh-CN/settings#available-settings)永远无法到达外部终端。将这些行添加到 `~/.tmux.conf`,然后运行 `tmux source-file ~/.tmux.conf` 将它们应用到运行的服务器:

103 

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

105set -g allow-passthrough on

106set -s extended-keys on

107set -as terminal-features 'xterm*:extkeys'

108```

109 

110`allow-passthrough` 行让通知和进度更新到达 iTerm2、Ghostty 或 Kitty,而不是被 tmux 吞没。`extended-keys` 行让 tmux 区分 Shift+Enter 和纯 Enter,以便换行快捷键工作。

111 

112## 匹配颜色主题

113 

114使用 `/theme` 命令或 `/config` 中的主题选择器来选择与您的终端匹配的 Claude Code 主题。选择自动选项会检测您的终端的浅色或深色背景,因此主题会在您的终端执行时跟随 OS 外观更改。Claude Code 不控制终端自己的颜色方案,该方案由终端应用程序设置。

115 

116要自定义界面底部显示的内容,请配置[自定义状态行](/zh-CN/statusline),显示当前模型、工作目录、git 分支或其他上下文。

117 

118### 创建自定义主题

119 

120<Note>

121 自定义主题需要 Claude Code v2.1.118 或更高版本。

122</Note>

123 

124除了内置预设外,`/theme` 还列出您定义的任何自定义主题以及已安装的 [plugins](/zh-CN/plugins-reference#themes) 贡献的任何主题。选择列表末尾的\*\*新建自定义主题…\*\*以交互方式创建一个:您命名主题,然后选择要覆盖的各个颜色令牌。当自定义主题突出显示时,按 `Ctrl+E` 来编辑它。

125 

126每个自定义主题都是 `~/.claude/themes/` 中的 JSON 文件。不带 `.json` 扩展名的文件名是主题的 slug,选择主题会将 `custom:<slug>` 存储为您的主题偏好设置。该文件有三个可选字段:

127 

128| 字段 | 类型 | 描述 |

129| :---------- | :----- | :-------------------------------------------------------------------------------------------------- |

130| `name` | string | 在 `/theme` 中显示的标签。默认为文件名 slug |

131| `base` | string | 主题开始的内置预设:`dark`、`light`、`dark-daltonized`、`light-daltonized`、`dark-ansi` 或 `light-ansi`。默认为 `dark` |

132| `overrides` | object | 颜色令牌名称到颜色值的映射。此处未列出的令牌会回退到基础预设 |

133 

134颜色值接受 `#rrggbb`、`#rgb`、`rgb(r,g,b)`、`ansi256(n)` 或 `ansi:<name>`,其中 `<name>` 是 16 个标准 ANSI 颜色名称之一,例如 `red` 或 `cyanBright`。未知令牌和无效颜色值会被忽略,因此拼写错误不会破坏渲染。

135 

136以下示例定义了一个保留深色预设但重新着色提示符强调、错误文本和成功文本的主题:

137 

138```json ~/.claude/themes/dracula.json theme={null}

139{

140 "name": "Dracula",

141 "base": "dark",

142 "overrides": {

143 "claude": "#bd93f9",

144 "error": "#ff5555",

145 "success": "#50fa7b"

146 }

147}

148```

149 

150Claude Code 监视 `~/.claude/themes/` 并在文件更改时重新加载,因此在您的编辑器中所做的编辑会应用到正在运行的会话中,无需重新启动。

151 

152以下参考涵盖了您可以在 `overrides` 中设置的令牌。`/theme` 中的交互式编辑器显示相同的令牌,并带有实时预览,以及一些单一用途的强调,例如此处未涵盖的入门屏幕颜色。

153 

154<Accordion title="颜色令牌参考">

155 以下示例结合了以下几个组中的令牌:品牌强调、Plan Mode 边框、diff 背景和全屏消息背景。

156 

157 ```json ~/.claude/themes/midnight.json theme={null}

158 {

159 "name": "Midnight",

160 "base": "dark",

161 "overrides": {

162 "claude": "#a78bfa",

163 "planMode": "#38bdf8",

164 "diffAdded": "#14532d",

165 "diffRemoved": "#7f1d1d",

166 "userMessageBackground": "#1e1b4b"

167 }

168 }

169 ```

170 

171 #### 文本和强调颜色

172 

173 控制整个界面中使用的主要品牌强调和前景文本阴影。

174 

175 | 令牌 | 控制 |

176 | :------------ | :------------------ |

177 | `claude` | 主要品牌强调,用于微调器和助手标签 |

178 | `text` | 默认前景文本 |

179 | `inverseText` | 绘制在彩色背景顶部的文本,例如状态徽章 |

180 | `inactive` | 次要文本,例如提示、时间戳和禁用项 |

181 | `subtle` | 淡色边框和去强调的次要文本 |

182 | `suggestion` | 自动完成建议和选择器中的选择突出显示 |

183 | `permission` | 对话框边框,包括权限提示和选择器 |

184 | `remember` | 内存和 `CLAUDE.md` 指示器 |

185 

186 #### 状态颜色

187 

188 在消息和指示器中发出成功、失败和警告状态信号。

189 

190 | 令牌 | 控制 |

191 | :-------- | :------------- |

192 | `success` | 成功消息和通过的检查 |

193 | `error` | 错误消息和失败 |

194 | `warning` | 警告、注意消息和自动模式边框 |

195 | `merged` | 合并的拉取请求状态 |

196 

197 #### 输入框和模式指示器

198 

199 设置输入框边框颜色和权限模式或指示器处于活动状态时显示的强调。

200 

201 | 令牌 | 控制 |

202 | :------------- | :--------------------- |

203 | `promptBorder` | 默认权限模式下的输入框边框 |

204 | `planMode` | Plan Mode 强调和边框 |

205 | `autoAccept` | 接受编辑模式强调和边框 |

206 | `bashBorder` | 输入 `!` shell 命令时的输入框边框 |

207 | `ide` | IDE 连接指示器 |

208 | `fastMode` | 快速模式指示器 |

209 

210 #### Diff 渲染

211 

212 在文件编辑和审查中为添加和删除的代码着色。

213 

214 | 令牌 | 控制 |

215 | :------------------ | :------------- |

216 | `diffAdded` | 添加行的背景 |

217 | `diffRemoved` | 删除行的背景 |

218 | `diffAddedDimmed` | 添加行附近未更改上下文的背景 |

219 | `diffRemovedDimmed` | 删除行附近未更改上下文的背景 |

220 | `diffAddedWord` | 添加行内的字级突出显示 |

221 | `diffRemovedWord` | 删除行内的字级突出显示 |

222 

223 #### 全屏模式

224 

225 仅在[全屏渲染模式](/zh-CN/fullscreen)中应用,其中消息具有背景填充。

226 

227 | 令牌 | 控制 |

228 | :--------------------------- | :----------------------- |

229 | `userMessageBackground` | 成绩单中您的消息后面的背景 |

230 | `userMessageBackgroundHover` | 成绩单中悬停或展开消息时消息后面的背景 |

231 | `messageActionsBackground` | 操作栏打开时所选消息后面的背景 |

232 | `bashMessageBackgroundColor` | 成绩单中 `!` shell 命令条目后面的背景 |

233 | `memoryBackgroundColor` | 成绩单中 `#` 内存条目后面的背景 |

234 | `selectionBg` | 用鼠标选择的文本的背景 |

235 

236 #### 使用量计量器和发言人标签

237 

238 调整 `/usage` 视图中显示的条形图以及区分您的消息和 Claude 消息的标签。

239 

240 | 令牌 | 控制 |

241 | :----------------- | :-------------------- |

242 | `rate_limit_fill` | 使用量计量器的填充部分 |

243 | `rate_limit_empty` | 使用量计量器的未填充部分 |

244 | `briefLabelYou` | 您的消息上的 `You` 标签的颜色 |

245 | `briefLabelClaude` | 助手消息上的 `Claude` 标签的颜色 |

246 

247 #### 微光变体和子代理颜色

248 

249 多个令牌具有配对的微光变体,提供微调器动画梯度中使用的较浅颜色。如果动画看起来不匹配,请与其基础令牌一起覆盖微光。

250 

251 * `claude` 和 `claudeShimmer`

252 * `warning` 和 `warningShimmer`

253 * `permission` 和 `permissionShimmer`

254 * `promptBorder` 和 `promptBorderShimmer`

255 * `inactive` 和 `inactiveShimmer`

256 * `fastMode` 和 `fastModeShimmer`

257 

258 每个[子代理](/zh-CN/sub-agents)和并行任务以八种命名颜色之一显示,以便您可以在成绩单中区分它们。令牌名称遵循 `<color>_FOR_SUBAGENTS_ONLY` 的模式,其中 `<color>` 是 `red`、`blue`、`green`、`yellow`、`purple`、`orange`、`pink` 或 `cyan`。覆盖这些以更改每个命名颜色的外观。例如,定义中具有 `color: blue` 的子代理使用 `blue_FOR_SUBAGENTS_ONLY` 值绘制。

259 

260 [`ultrathink`](/zh-CN/model-config#use-ultrathink-for-one-off-deep-reasoning) 和 [`ultraplan`](/zh-CN/ultraplan) 关键字在提示输入中使用七色彩虹梯度渲染。令牌名称遵循 `rainbow_<color>` 和 `rainbow_<color>_shimmer` 的模式,其中 `<color>` 是 `red`、`orange`、`yellow`、`green`、`blue`、`indigo` 或 `violet`。

261</Accordion>

262 

263## 切换到全屏渲染

264 

265如果显示闪烁或在 Claude 工作时滚动位置跳跃,请切换到[全屏渲染模式](/zh-CN/fullscreen)。它绘制到终端为全屏应用程序保留的单独屏幕,而不是附加到您的正常滚动条,这保持内存使用平稳并为滚动和选择添加鼠标支持。在此模式下,您使用鼠标或 PageUp 在 Claude Code 内滚动,而不是使用您的终端的本机滚动条;请参阅[全屏页面](/zh-CN/fullscreen#search-and-review-the-conversation)了解如何搜索和复制。

266 

267运行 `/tui fullscreen` 在当前会话中切换,您的对话保持不变。要使其成为默认值,请在启动 Claude Code 之前设置 `CLAUDE_CODE_NO_FLICKER` 环境变量:

268 

269<CodeGroup>

270 ```bash Bash and Zsh theme={null}

271 CLAUDE_CODE_NO_FLICKER=1 claude

272 ```

273 

274 ```powershell PowerShell theme={null}

275 $env:CLAUDE_CODE_NO_FLICKER = "1"; claude

276 ```

277 

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

279 {

280 "env": {

281 "CLAUDE_CODE_NO_FLICKER": "1"

282 }

283 }

284 ```

285</CodeGroup>

286 

287## 粘贴大型内容

288 

289当您将超过 10,000 个字符粘贴到提示符中时,Claude Code 将输入折叠为 `[Pasted text]` 占位符,以便输入框保持可用。当您提交时,完整内容仍会发送给 Claude。

290 

291VS Code 集成终端可能会在非常大的粘贴中丢弃字符,然后才能到达 Claude Code,因此在那里更喜欢基于文件的工作流。对于非常大的输入,例如整个文件或长日志,请将内容写入文件并要求 Claude 读取它,而不是粘贴。这保持对话记录可读,并让 Claude 在后续轮次中按路径引用文件。

292 

293## 使用 Vim 快捷键编辑提示符

294 

295Claude Code 包括提示符输入的 Vim 风格编辑模式。通过 `/config` → 编辑器模式启用它,或通过在 `~/.claude/settings.json` 中将 [`editorMode`](/zh-CN/settings#available-settings) 设置为 `"vim"` 来启用。将编辑器模式设置回 `normal` 以关闭它。

296 

297Vim 模式支持 NORMAL 模式和 VISUAL 模式动作和运算符的子集,例如 `hjkl` 导航、`v`/`V` 选择以及 `d`/`c`/`y` 与文本对象。请参阅 [Vim 编辑器模式参考](/zh-CN/interactive-mode#vim-editor-mode)了解完整的快捷键表。Vim 动作不可通过快捷键文件重新映射。

298 

299在 INSERT 模式下按 Enter 仍会提交您的提示符,与标准 Vim 不同。在 NORMAL 模式下使用 `o` 或 `O`,或 Ctrl+J,来插入换行。

300 

301## 相关资源

302 

303* [交互模式](/zh-CN/interactive-mode):完整的键盘快捷键参考和 Vim 快捷键表

304* [快捷键](/zh-CN/keybindings):重新映射任何 Claude Code 快捷键,包括 Enter 和 Shift+Enter

305* [全屏渲染](/zh-CN/fullscreen):全屏模式下滚动、搜索和复制的详细信息

306* [钩子指南](/zh-CN/hooks-guide):Linux 和 Windows 的更多通知钩子示例

307* [故障排除](/zh-CN/troubleshooting):修复终端配置之外的问题

third-party-integrations.md +262 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 企业部署概览

6 

7> 了解 Claude Code 如何与各种第三方服务和基础设施集成,以满足企业部署需求。

8 

9组织可以直接通过 Anthropic 或通过云提供商部署 Claude Code。本页面帮助您选择正确的配置。

10 

11## 比较部署选项

12 

13对于大多数组织,Claude for Teams 或 Claude for Enterprise 提供最佳体验。团队成员可以通过单一订阅访问 Claude Code 和网页版 Claude,具有集中计费和无需基础设施设置的优势。

14 

15**Claude for Teams** 是自助服务,包括协作功能、管理工具和计费管理。最适合需要快速启动的小型团队。

16 

17**Claude for Enterprise** 增加了 SSO 和域名捕获、基于角色的权限、合规性 API 访问以及用于部署组织范围内 Claude Code 配置的托管策略设置。最适合具有安全和合规性要求的大型组织。

18 

19了解更多关于 [Team 计划](https://support.claude.com/en/articles/9266767-what-is-the-team-plan) 和 [Enterprise 计划](https://support.claude.com/en/articles/9797531-what-is-the-enterprise-plan)。

20 

21如果您的组织有特定的基础设施要求,请比较以下选项:

22 

23<table>

24 <thead>

25 <tr>

26 <th>功能</th>

27 <th>Claude for Teams/Enterprise</th>

28 <th>Anthropic Console</th>

29 <th>Amazon Bedrock</th>

30 <th>Google Vertex AI</th>

31 <th>Microsoft Foundry</th>

32 </tr>

33 </thead>

34 

35 <tbody>

36 <tr>

37 <td>最适合</td>

38 <td>大多数组织(推荐)</td>

39 <td>个人开发者</td>

40 <td>AWS 原生部署</td>

41 <td>GCP 原生部署</td>

42 <td>Azure 原生部署</td>

43 </tr>

44 

45 <tr>

46 <td>计费</td>

47 <td><strong>Teams:</strong> \$150/座位(Premium)提供按使用量付费选项<br /><strong>Enterprise:</strong> <a href="https://claude.com/contact-sales?utm_source=claude_code&utm_medium=docs&utm_content=third_party_enterprise">联系销售</a></td>

48 <td>按使用量付费</td>

49 <td>通过 AWS 按使用量付费</td>

50 <td>通过 GCP 按使用量付费</td>

51 <td>通过 Azure 按使用量付费</td>

52 </tr>

53 

54 <tr>

55 <td>地区</td>

56 <td>支持的[国家/地区](https://www.anthropic.com/supported-countries)</td>

57 <td>支持的[国家/地区](https://www.anthropic.com/supported-countries)</td>

58 <td>多个 AWS [地区](https://docs.aws.amazon.com/bedrock/latest/userguide/models-regions.html)</td>

59 <td>多个 GCP [地区](https://cloud.google.com/vertex-ai/generative-ai/docs/learn/locations)</td>

60 <td>多个 Azure [地区](https://azure.microsoft.com/en-us/explore/global-infrastructure/products-by-region/)</td>

61 </tr>

62 

63 <tr>

64 <td>prompt caching</td>

65 <td>默认启用</td>

66 <td>默认启用</td>

67 <td>默认启用</td>

68 <td>默认启用</td>

69 <td>默认启用</td>

70 </tr>

71 

72 <tr>

73 <td>身份验证</td>

74 <td>Claude.ai SSO 或电子邮件</td>

75 <td>API 密钥</td>

76 <td>API 密钥或 AWS 凭证</td>

77 <td>GCP 凭证</td>

78 <td>API 密钥或 Microsoft Entra ID</td>

79 </tr>

80 

81 <tr>

82 <td>成本跟踪</td>

83 <td>使用情况仪表板</td>

84 <td>使用情况仪表板</td>

85 <td>AWS Cost Explorer</td>

86 <td>GCP Billing</td>

87 <td>Azure Cost Management</td>

88 </tr>

89 

90 <tr>

91 <td>包括网页版 Claude</td>

92 <td>是</td>

93 <td>否</td>

94 <td>否</td>

95 <td>否</td>

96 <td>否</td>

97 </tr>

98 

99 <tr>

100 <td>企业功能</td>

101 <td>团队管理、SSO、使用情况监控</td>

102 <td>无</td>

103 <td>IAM 策略、CloudTrail</td>

104 <td>IAM 角色、Cloud Audit Logs</td>

105 <td>RBAC 策略、Azure Monitor</td>

106 </tr>

107 </tbody>

108</table>

109 

110选择部署选项以查看设置说明:

111 

112* [Claude for Teams 或 Enterprise](/zh-CN/authentication#claude-for-teams-or-enterprise)

113* [Anthropic Console](/zh-CN/authentication#claude-console-authentication)

114* [Amazon Bedrock](/zh-CN/amazon-bedrock)

115* [Google Vertex AI](/zh-CN/google-vertex-ai)

116* [Microsoft Foundry](/zh-CN/microsoft-foundry)

117 

118## 配置代理和网关

119 

120大多数组织可以直接使用云提供商,无需额外配置。但是,如果您的组织有特定的网络或管理要求,您可能需要配置企业代理或 LLM 网关。这些是可以一起使用的不同配置:

121 

122* **企业代理**:通过 HTTP/HTTPS 代理路由流量。如果您的组织要求所有出站流量通过代理服务器以进行安全监控、合规性或网络策略执行,请使用此选项。使用 `HTTPS_PROXY` 或 `HTTP_PROXY` 环境变量进行配置。在[企业网络配置](/zh-CN/network-config)中了解更多。

123* **LLM 网关**:位于 Claude Code 和云提供商之间的服务,用于处理身份验证和路由。如果您需要跨团队的集中使用情况跟踪、自定义速率限制或预算或集中身份验证管理,请使用此选项。使用 `ANTHROPIC_BASE_URL`、`ANTHROPIC_BEDROCK_BASE_URL` 或 `ANTHROPIC_VERTEX_BASE_URL` 环境变量进行配置。在[LLM 网关配置](/zh-CN/llm-gateway)中了解更多。

124 

125以下示例显示在 shell 或 shell 配置文件(`.bashrc`、`.zshrc`)中设置的环境变量。有关其他配置方法,请参阅[设置](/zh-CN/settings)。

126 

127### Amazon Bedrock

128 

129<Tabs>

130 <Tab title="企业代理">

131 通过设置以下[环境变量](/zh-CN/env-vars),将 Bedrock 流量路由通过您的企业代理:

132 

133 ```bash theme={null}

134 # 启用 Bedrock

135 export CLAUDE_CODE_USE_BEDROCK=1

136 export AWS_REGION=us-east-1

137 

138 # 配置企业代理

139 export HTTPS_PROXY='https://proxy.example.com:8080'

140 ```

141 </Tab>

142 

143 <Tab title="LLM 网关">

144 通过设置以下[环境变量](/zh-CN/env-vars),将 Bedrock 流量路由通过您的 LLM 网关:

145 

146 ```bash theme={null}

147 # 启用 Bedrock

148 export CLAUDE_CODE_USE_BEDROCK=1

149 

150 # 配置 LLM 网关

151 export ANTHROPIC_BEDROCK_BASE_URL='https://your-llm-gateway.com/bedrock'

152 export CLAUDE_CODE_SKIP_BEDROCK_AUTH=1 # 如果网关处理 AWS 身份验证

153 ```

154 </Tab>

155</Tabs>

156 

157### Microsoft Foundry

158 

159<Tabs>

160 <Tab title="企业代理">

161 通过设置以下[环境变量](/zh-CN/env-vars),将 Foundry 流量路由通过您的企业代理:

162 

163 ```bash theme={null}

164 # 启用 Microsoft Foundry

165 export CLAUDE_CODE_USE_FOUNDRY=1

166 export ANTHROPIC_FOUNDRY_RESOURCE=your-resource

167 export ANTHROPIC_FOUNDRY_API_KEY=your-api-key # 或省略以使用 Entra ID 身份验证

168 

169 # 配置企业代理

170 export HTTPS_PROXY='https://proxy.example.com:8080'

171 ```

172 </Tab>

173 

174 <Tab title="LLM 网关">

175 通过设置以下[环境变量](/zh-CN/env-vars),将 Foundry 流量路由通过您的 LLM 网关:

176 

177 ```bash theme={null}

178 # 启用 Microsoft Foundry

179 export CLAUDE_CODE_USE_FOUNDRY=1

180 

181 # 配置 LLM 网关

182 export ANTHROPIC_FOUNDRY_BASE_URL='https://your-llm-gateway.com'

183 export CLAUDE_CODE_SKIP_FOUNDRY_AUTH=1 # 如果网关处理 Azure 身份验证

184 ```

185 </Tab>

186</Tabs>

187 

188### Google Vertex AI

189 

190<Tabs>

191 <Tab title="企业代理">

192 通过设置以下[环境变量](/zh-CN/env-vars),将 Vertex AI 流量路由通过您的企业代理:

193 

194 ```bash theme={null}

195 # 启用 Vertex

196 export CLAUDE_CODE_USE_VERTEX=1

197 export CLOUD_ML_REGION=us-east5

198 export ANTHROPIC_VERTEX_PROJECT_ID=your-project-id

199 

200 # 配置企业代理

201 export HTTPS_PROXY='https://proxy.example.com:8080'

202 ```

203 </Tab>

204 

205 <Tab title="LLM 网关">

206 通过设置以下[环境变量](/zh-CN/env-vars),将 Vertex AI 流量路由通过您的 LLM 网关:

207 

208 ```bash theme={null}

209 # 启用 Vertex

210 export CLAUDE_CODE_USE_VERTEX=1

211 

212 # 配置 LLM 网关

213 export ANTHROPIC_VERTEX_BASE_URL='https://your-llm-gateway.com/vertex'

214 export CLAUDE_CODE_SKIP_VERTEX_AUTH=1 # 如果网关处理 GCP 身份验证

215 ```

216 </Tab>

217</Tabs>

218 

219<Tip>

220 在 Claude Code 中使用 `/status` 来验证您的代理和网关配置是否正确应用。

221</Tip>

222 

223## 组织的最佳实践

224 

225### 投资文档和内存

226 

227我们强烈建议投资文档,以便 Claude Code 理解您的代码库。组织可以在多个级别部署 CLAUDE.md 文件:

228 

229* **组织范围**:部署到系统目录,如 `/Library/Application Support/ClaudeCode/CLAUDE.md`(macOS),用于公司范围的标准

230* **存储库级别**:在存储库根目录中创建 `CLAUDE.md` 文件,包含项目架构、构建命令和贡献指南。将这些检入源代码控制,以便所有用户受益

231 

232在[内存和 CLAUDE.md 文件](/zh-CN/memory)中了解更多。

233 

234### 简化部署

235 

236如果您有自定义开发环境,我们发现创建一种"一键"安装 Claude Code 的方式是在组织中增加采用率的关键。

237 

238### 从引导式使用开始

239 

240鼓励新用户尝试使用 Claude Code 进行代码库问答,或在较小的错误修复或功能请求上使用。要求 Claude Code 制定计划。检查 Claude 的建议,如果偏离轨道,请提供反馈。随着时间的推移,当用户更好地理解这种新范式时,他们将更有效地让 Claude Code 更自主地运行。

241 

242### 为云提供商固定模型版本

243 

244如果您通过 [Bedrock](/zh-CN/amazon-bedrock)、[Vertex AI](/zh-CN/google-vertex-ai) 或 [Foundry](/zh-CN/microsoft-foundry) 部署,请使用 `ANTHROPIC_DEFAULT_OPUS_MODEL`、`ANTHROPIC_DEFAULT_SONNET_MODEL` 和 `ANTHROPIC_DEFAULT_HAIKU_MODEL` 固定特定模型版本。如果不固定,Claude Code 别名会解析为最新版本,当 Anthropic 发布您的账户中尚未启用的新模型时,可能会破坏用户。有关详细信息,请参阅[模型配置](/zh-CN/model-config#pin-models-for-third-party-deployments)。

245 

246### 配置安全策略

247 

248安全团队可以配置托管权限,定义 Claude Code 允许和不允许做什么,这不能被本地配置覆盖。[了解更多](/zh-CN/security)。

249 

250### 利用 MCP 进行集成

251 

252MCP 是为 Claude Code 提供更多信息的好方法,例如连接到票证管理系统或错误日志。我们建议一个中央团队配置 MCP servers 并将 `.mcp.json` 配置检入代码库,以便所有用户受益。[了解更多](/zh-CN/mcp)。

253 

254在 Anthropic,我们信任 Claude Code 在每个 Anthropic 代码库中推动开发。我们希望您像我们一样享受使用 Claude Code。

255 

256## 后续步骤

257 

258选择部署选项并为您的团队配置访问权限后:

259 

2601. **向您的团队推出**:分享安装说明,让团队成员[安装 Claude Code](/zh-CN/setup) 并使用其凭证进行身份验证。

2612. **设置共享配置**:在您的存储库中创建 [CLAUDE.md 文件](/zh-CN/memory),以帮助 Claude Code 理解您的代码库和编码标准。

2623. **配置权限**:查看[安全设置](/zh-CN/security)以定义 Claude Code 在您的环境中可以和不能做什么。

tools-reference.md +148 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 工具参考

6 

7> Claude Code 可以使用的工具的完整参考,包括权限要求。

8 

9Claude Code 可以访问一组内置工具,帮助它理解和修改您的代码库。工具名称是您在[权限规则](/zh-CN/permissions#tool-specific-permission-rules)、[subagent 工具列表](/zh-CN/sub-agents)和 [hook 匹配器](/zh-CN/hooks)中使用的确切字符串。要完全禁用某个工具,请将其名称添加到[权限设置](/zh-CN/permissions#tool-specific-permission-rules)中的 `deny` 数组。

10 

11要添加自定义工具,请连接一个 [MCP server](/zh-CN/mcp)。要使用可重用的基于提示的工作流扩展 Claude,请编写一个 [skill](/zh-CN/skills),它通过现有的 `Skill` 工具运行,而不是添加新的工具条目。

12 

13| 工具 | 描述 | 需要权限 |

14| :--------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :--- |

15| `Agent` | 生成一个具有自己 context window 的 [subagent](/zh-CN/sub-agents),用于处理任务 | 否 |

16| `AskUserQuestion` | 提出多选问题以收集需求或澄清歧义 | 否 |

17| `Bash` | 在您的环境中执行 shell 命令。请参阅 [Bash 工具行为](#bash-tool-behavior) | 是 |

18| `CronCreate` | 在当前会话中安排定期或一次性提示。任务是会话范围的,在 `--resume` 或 `--continue` 时如果未过期则会恢复。请参阅[计划任务](/zh-CN/scheduled-tasks) | 否 |

19| `CronDelete` | 按 ID 取消计划任务 | 否 |

20| `CronList` | 列出会话中的所有计划任务 | 否 |

21| `Edit` | 对特定文件进行有针对性的编辑 | 是 |

22| `EnterPlanMode` | 切换到 Plan Mode 以在编码前设计方法 | 否 |

23| `EnterWorktree` | 创建一个隔离的 [git worktree](/zh-CN/common-workflows#run-parallel-claude-code-sessions-with-git-worktrees) 并切换到它。传递 `path` 以切换到当前存储库的现有 worktree,而不是创建新的。不适用于 subagents | 否 |

24| `ExitPlanMode` | 提出计划以供批准并退出 Plan Mode | 是 |

25| `ExitWorktree` | 退出 worktree 会话并返回到原始目录。不适用于 subagents | 否 |

26| `Glob` | 基于模式匹配查找文件 | 否 |

27| `Grep` | 在文件内容中搜索模式 | 否 |

28| `ListMcpResourcesTool` | 列出连接的 [MCP servers](/zh-CN/mcp) 公开的资源 | 否 |

29| `LSP` | 通过语言服务器进行代码智能:跳转到定义、查找引用、报告类型错误和警告。请参阅 [LSP 工具行为](#lsp-tool-behavior) | 否 |

30| `Monitor` | 在后台运行命令并将每个输出行反馈给 Claude,以便它可以对日志条目、文件更改或轮询状态做出反应。请参阅 [Monitor 工具](#monitor-tool) | 是 |

31| `NotebookEdit` | 修改 Jupyter notebook 单元格 | 是 |

32| `PowerShell` | 本地执行 PowerShell 命令。请参阅 [PowerShell 工具](#powershell-tool)了解可用性 | 是 |

33| `Read` | 读取文件内容 | 否 |

34| `ReadMcpResourceTool` | 按 URI 读取特定 MCP 资源 | 否 |

35| `SendMessage` | 向 [agent team](/zh-CN/agent-teams) 队友发送消息,或按 agent ID [恢复 subagent](/zh-CN/sub-agents#resume-subagents)。已停止的 subagents 在后台自动恢复。仅当设置了 `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1` 时可用 | 否 |

36| `Skill` | 在主对话中执行 [skill](/zh-CN/skills#control-who-invokes-a-skill) | 是 |

37| `TaskCreate` | 在任务列表中创建新任务 | 否 |

38| `TaskGet` | 检索特定任务的完整详细信息 | 否 |

39| `TaskList` | 列出所有任务及其当前状态 | 否 |

40| `TaskOutput` | (已弃用)检索后台任务的输出。优先使用 `Read` 读取任务的输出文件路径 | 否 |

41| `TaskStop` | 按 ID 终止运行中的后台任务 | 否 |

42| `TaskUpdate` | 更新任务状态、依赖项、详细信息或删除任务 | 否 |

43| `TeamCreate` | 创建一个具有多个队友的 [agent team](/zh-CN/agent-teams)。仅当设置了 `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1` 时可用 | 否 |

44| `TeamDelete` | 解散 agent team 并清理队友进程。仅当设置了 `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1` 时可用 | 否 |

45| `TodoWrite` | 管理会话任务清单。在非交互模式和 [Agent SDK](/zh-CN/headless) 中可用;交互式会话改用 TaskCreate、TaskGet、TaskList 和 TaskUpdate | 否 |

46| `ToolSearch` | 当启用 [tool search](/zh-CN/mcp#scale-with-mcp-tool-search) 时搜索并加载延迟工具 | 否 |

47| `WebFetch` | 从指定 URL 获取内容 | 是 |

48| `WebSearch` | 执行网络搜索 | 是 |

49| `Write` | 创建或覆盖文件 | 是 |

50 

51权限规则可以使用 `/permissions` 或在[权限设置](/zh-CN/settings#available-settings)中配置。另请参阅[工具特定权限规则](/zh-CN/permissions#tool-specific-permission-rules)。

52 

53## Bash 工具行为

54 

55Bash 工具在单独的进程中运行每个命令,具有以下持久性行为:

56 

57* 当 Claude 在主会话中运行 `cd` 时,只要它保持在项目目录内或您使用 `--add-dir`、`/add-dir` 或设置中的 `additionalDirectories` 添加的[额外工作目录](/zh-CN/permissions#working-directories)内,新的工作目录就会延续到后续的 Bash 命令。Subagent 会话永远不会延续工作目录更改。

58 * 如果 `cd` 落在这些目录之外,Claude Code 会重置为项目目录,并将 `Shell cwd was reset to <dir>` 附加到工具结果。

59 * 要禁用此延续,使每个 Bash 命令都在项目目录中启动,请设置 `CLAUDE_BASH_MAINTAIN_PROJECT_WORKING_DIR=1`。

60* 环境变量不持久。一个命令中的 `export` 在下一个命令中将不可用。

61 

62在启动 Claude Code 之前激活您的 virtualenv 或 conda 环境。要使环境变量在 Bash 命令之间保持不变,请在启动 Claude Code 之前将 [`CLAUDE_ENV_FILE`](/zh-CN/env-vars) 设置为 shell 脚本,或使用 [SessionStart hook](/zh-CN/hooks#persist-environment-variables) 动态填充它。

63 

64## LSP 工具行为

65 

66LSP 工具为 Claude 提供来自运行中的语言服务器的代码智能。在每次文件编辑后,它会自动报告类型错误和警告,以便 Claude 可以在没有单独构建步骤的情况下修复问题。Claude 还可以直接调用它来导航代码:

67 

68* 跳转到符号的定义

69* 查找对符号的所有引用

70* 获取位置处的类型信息

71* 列出文件或工作区中的符号

72* 查找接口的实现

73* 追踪调用层次结构

74 

75该工具在您为您的语言安装 [code intelligence plugin](/zh-CN/discover-plugins#code-intelligence) 之前处于非活动状态。该插件捆绑了语言服务器配置,您需要单独安装服务器二进制文件。

76 

77## Monitor 工具

78 

79<Note>

80 Monitor 工具需要 Claude Code v2.1.98 或更高版本。

81</Note>

82 

83Monitor 工具让 Claude 在后台监视某些内容,并在其更改时做出反应,而无需暂停对话。要求 Claude:

84 

85* 跟踪日志文件并在错误出现时标记它们

86* 轮询 PR 或 CI 作业并在其状态更改时报告

87* 监视目录以查找文件更改

88* 跟踪您指向的任何长时间运行脚本的输出

89 

90Claude 为监视编写一个小脚本,在后台运行它,并在每行到达时接收它。您可以在同一会话中继续工作,Claude 在事件到达时插入。通过要求 Claude 取消它或结束会话来停止监视。

91 

92Monitor 使用与 [Bash 相同的权限规则](/zh-CN/permissions#tool-specific-permission-rules),因此您为 Bash 设置的 `allow` 和 `deny` 模式也适用于此处。它在 Amazon Bedrock、Google Vertex AI 或 Microsoft Foundry 上不可用。当设置了 `DISABLE_TELEMETRY` 或 `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC` 时,它也不可用。

93 

94插件可以声明在插件处于活动状态时自动启动的监视,而不是要求 Claude 启动它们。请参阅 [plugin monitors](/zh-CN/plugins-reference#monitors)。

95 

96## PowerShell 工具

97 

98PowerShell 工具让 Claude 本地运行 PowerShell 命令。在 Windows 上,这意味着命令在 PowerShell 中运行,而不是通过 Git Bash 路由。在没有 Git Bash 的 Windows 上,该工具会自动启用。在安装了 Git Bash 的 Windows 上,该工具正在逐步推出。在 Linux、macOS 和 WSL 上,该工具是选择加入的。

99 

100### 启用 PowerShell 工具

101 

102在您的环境或 `settings.json` 中设置 `CLAUDE_CODE_USE_POWERSHELL_TOOL=1`:

103 

104```json theme={null}

105{

106 "env": {

107 "CLAUDE_CODE_USE_POWERSHELL_TOOL": "1"

108 }

109}

110```

111 

112在 Windows 上,将变量设置为 `0` 以选择退出推出。在 Linux、macOS 和 WSL 上,该工具需要 PowerShell 7 或更高版本:安装 `pwsh` 并确保它在您的 `PATH` 中。

113 

114在 Windows 上,Claude Code 自动检测 `pwsh.exe`(PowerShell 7+),回退到 `powershell.exe`(PowerShell 5.1)。启用该工具后,Claude 将 PowerShell 视为主 shell。当安装了 Git Bash 时,Bash 工具仍可用于 POSIX 脚本。

115 

116### 设置、hooks 和 skills 中的 shell 选择

117 

118三个额外的设置控制 PowerShell 的使用位置:

119 

120* [`settings.json`](/zh-CN/settings#available-settings) 中的 `"defaultShell": "powershell"`:通过 PowerShell 路由交互式 `!` 命令。需要启用 PowerShell 工具。

121* 单个 [command hooks](/zh-CN/hooks#command-hook-fields) 上的 `"shell": "powershell"`:在 PowerShell 中运行该 hook。Hooks 直接生成 PowerShell,因此无论 `CLAUDE_CODE_USE_POWERSHELL_TOOL` 如何,这都有效。

122* [skill frontmatter](/zh-CN/skills#frontmatter-reference) 中的 `shell: powershell`:在 PowerShell 中运行 `` !`command` `` 块。需要启用 PowerShell 工具。

123 

124同样的主会话工作目录重置行为(如 Bash 工具部分所述)适用于 PowerShell 命令,包括 `CLAUDE_BASH_MAINTAIN_PROJECT_WORKING_DIR` 环境变量。

125 

126### 预览限制

127 

128PowerShell 工具在预览期间有以下已知限制:

129 

130* PowerShell 配置文件未加载

131* 在 Windows 上,不支持 sandboxing

132 

133## 检查哪些工具可用

134 

135您的确切工具集取决于您的提供商、平台和设置。要检查在运行中的会话中加载了什么,请直接询问 Claude:

136 

137```text theme={null}

138What tools do you have access to?

139```

140 

141Claude 提供对话摘要。对于确切的 MCP 工具名称,请运行 `/mcp`。

142 

143## 另请参阅

144 

145* [MCP servers](/zh-CN/mcp):通过连接外部服务器添加自定义工具

146* [权限](/zh-CN/permissions):权限系统、规则语法和工具特定模式

147* [Subagents](/zh-CN/sub-agents):为 subagents 配置工具访问

148* [Hooks](/zh-CN/hooks-guide):在工具执行前后运行自定义命令

troubleshoot-install.md +803 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 排查安装和登录问题

6 

7> 修复安装或登录 Claude Code 时出现的命令未找到、PATH、权限、网络和身份验证错误。

8 

9如果安装失败或无法登录,请在下面找到您的错误。有关 Claude Code 正常工作后的运行时问题,请参阅 [Troubleshooting](/zh-CN/troubleshooting)。有关配置问题(例如设置未应用或 hooks 未触发),请参阅 [Debug your configuration](/zh-CN/debug-your-config)。

10 

11## 查找您的错误

12 

13将您看到的错误消息或症状与解决方案相匹配:

14 

15| 您看到的内容 | 解决方案 |

16| :----------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ |

17| `command not found: claude` 或 `'claude' is not recognized` | [修复您的 PATH](#command-not-found-claude-after-installation) |

18| `syntax error near unexpected token '<'` | [安装脚本返回 HTML](#install-script-returns-html-instead-of-a-shell-script) |

19| `curl: (56) Failure writing output to destination` | [检查连接或使用替代安装程序](#curl-56-failure-writing-output-to-destination) |

20| Linux 上安装期间 `Killed` | [为低内存服务器添加交换空间](#install-killed-on-low-memory-linux-servers) |

21| `TLS connect error` 或 `SSL/TLS secure channel` | [更新 CA 证书](#tls-or-ssl-connection-errors) |

22| `Failed to fetch version` 或无法访问下载服务器 | [检查网络和代理设置](#check-network-connectivity) |

23| `irm is not recognized` 或 `&& is not valid` | [对您的 shell 使用正确的命令](#wrong-install-command-on-windows) |

24| `'bash' is not recognized as the name of a cmdlet` | [使用 Windows 安装程序命令](#wrong-install-command-on-windows) |

25| `Claude Code on Windows requires either Git for Windows (for bash) or PowerShell` | [安装 shell](#claude-code-on-windows-requires-either-git-for-windows-for-bash-or-powershell) |

26| `Claude Code does not support 32-bit Windows` | [打开 Windows PowerShell,而不是 x86 条目](#claude-code-does-not-support-32-bit-windows) |

27| `The process cannot access the file ... because it is being used by another process` | [清除下载文件夹并重试](#the-process-cannot-access-the-file-during-windows-install) |

28| `Error loading shared library` | [您的系统的二进制变体错误](#linux-musl-or-glibc-binary-mismatch) |

29| `Illegal instruction` | [架构或 CPU 指令集不匹配](#illegal-instruction) |

30| WSL 中 `cannot execute binary file: Exec format error` | [WSL1 上的 Exec 格式错误](#exec-format-error-on-wsl1) |

31| PowerShell 安装程序完成但 `claude` 未找到或显示旧版本 | [重启您的终端并验证 PATH](#verify-your-path) |

32| macOS 上 `dyld: cannot load`、`dyld: Symbol not found` 或 `Abort trap` | [二进制不兼容](#dyld-cannot-load-on-macos) |

33| `Invoke-Expression: Missing argument in parameter list` | [安装脚本返回 HTML](#install-script-returns-html-instead-of-a-shell-script) |

34| `App unavailable in region` | Claude Code 在您的国家/地区不可用。请参阅 [supported countries](https://www.anthropic.com/supported-countries)。 |

35| `unable to get local issuer certificate` | [配置企业 CA 证书](#tls-or-ssl-connection-errors) |

36| `OAuth error` 或 `403 Forbidden` | [修复身份验证](#login-and-authentication) |

37| `Could not load the default credentials` 或 `Could not load credentials from any providers` | [Bedrock、Vertex 或 Foundry 凭证](#bedrock-vertex-or-foundry-credentials-not-loading) |

38| `ChainedTokenCredential authentication failed` 或 `CredentialUnavailableError` | [Bedrock、Vertex 或 Foundry 凭证](#bedrock-vertex-or-foundry-credentials-not-loading) |

39| `API Error: 500`、`529 Overloaded`、`429` 或上面未列出的其他 4xx 和 5xx 错误 | 请参阅 [Error reference](/zh-CN/errors) |

40 

41如果您的问题未列出,请按照下面的诊断检查来缩小原因范围。

42 

43<Tip>

44 如果您宁愿完全跳过终端,[Claude Code Desktop 应用](/zh-CN/desktop-quickstart)可让您通过图形界面安装和使用 Claude Code。为 [macOS](https://claude.ai/api/desktop/darwin/universal/dmg/latest/redirect?utm_source=claude_code\&utm_medium=docs) 或 [Windows](https://claude.com/download?utm_source=claude_code\&utm_medium=docs) 下载它,无需任何命令行设置即可开始编码。

45</Tip>

46 

47## 运行诊断检查

48 

49### 检查网络连接

50 

51安装程序从 `downloads.claude.ai` 下载。验证您可以访问它:

52 

53```bash theme={null}

54curl -sI https://downloads.claude.ai/claude-code-releases/latest

55```

56 

57`HTTP/2 200` 行表示您已到达服务器。如果您看不到任何输出、`Could not resolve host` 或连接超时,您的网络正在阻止连接。常见原因:

58 

59* 企业防火墙或代理阻止 `downloads.claude.ai`

60* 区域网络限制:尝试 VPN 或替代网络

61* TLS/SSL 问题:更新您系统的 CA 证书,或检查是否配置了 `HTTPS_PROXY`

62 

63如果您在企业代理后面,在安装前设置 `HTTPS_PROXY` 和 `HTTP_PROXY` 为您的代理地址。如果您不知道代理 URL,请向您的 IT 团队询问,或检查您的浏览器代理设置。

64 

65此示例设置两个代理变量,然后通过您的代理运行安装程序:

66 

67<Tabs>

68 <Tab title="macOS/Linux">

69 ```bash theme={null}

70 export HTTP_PROXY=http://proxy.example.com:8080

71 export HTTPS_PROXY=http://proxy.example.com:8080

72 curl -fsSL https://claude.ai/install.sh | bash

73 ```

74 </Tab>

75 

76 <Tab title="Windows PowerShell">

77 ```powershell theme={null}

78 $env:HTTP_PROXY = 'http://proxy.example.com:8080'

79 $env:HTTPS_PROXY = 'http://proxy.example.com:8080'

80 irm https://claude.ai/install.ps1 | iex

81 ```

82 </Tab>

83</Tabs>

84 

85### 验证您的 PATH

86 

87如果安装成功但运行 `claude` 时出现 `command not found` 或 `not recognized` 错误,安装目录不在您的 PATH 中。您的 shell 在 PATH 中列出的目录中搜索程序,安装程序在 macOS/Linux 上将 `claude` 放在 `~/.local/bin/claude`,或在 Windows 上放在 `%USERPROFILE%\.local\bin\claude.exe`。

88 

89通过列出您的 PATH 条目并过滤 `local/bin` 来检查安装目录是否在您的 PATH 中:

90 

91<Tabs>

92 <Tab title="macOS/Linux">

93 ```bash theme={null}

94 echo $PATH | tr ':' '\n' | grep -Fx "$HOME/.local/bin"

95 ```

96 

97 如果这打印 `/Users/you/.local/bin` 或 `/home/you/.local/bin`,该目录在您的 PATH 中,您可以跳到 [检查冲突的安装](#check-for-conflicting-installations)。如果没有输出,请将其添加到您的 shell 配置。

98 

99 对于 Zsh(macOS 上的默认值):

100 

101 ```bash theme={null}

102 echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc

103 source ~/.zshrc

104 ```

105 

106 对于 Bash(大多数 Linux 发行版上的默认值):

107 

108 ```bash theme={null}

109 echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc

110 source ~/.bashrc

111 ```

112 

113 或者,关闭并重新打开您的终端。

114 

115 对于其他 shell(如 fish 或 Nushell),使用您的 shell 自己的配置语法将 `~/.local/bin` 添加到您的 PATH,然后重启您的终端。

116 

117 验证修复是否有效:

118 

119 ```bash theme={null}

120 claude --version

121 ```

122 </Tab>

123 

124 <Tab title="Windows PowerShell">

125 ```powershell theme={null}

126 $env:PATH -split ';' | Select-String '\.local\\bin'

127 ```

128 

129 如果没有输出,请将安装目录添加到您的用户 PATH:

130 

131 ```powershell theme={null}

132 $currentPath = [Environment]::GetEnvironmentVariable('PATH', 'User')

133 [Environment]::SetEnvironmentVariable('PATH', "$currentPath;$env:USERPROFILE\.local\bin", 'User')

134 ```

135 

136 重启您的终端以使更改生效。

137 

138 验证修复是否有效:

139 

140 ```powershell theme={null}

141 claude --version

142 ```

143 </Tab>

144 

145 <Tab title="Windows CMD">

146 ```batch theme={null}

147 echo %PATH% | findstr /i "local\bin"

148 ```

149 

150 如果没有输出,打开系统设置,转到环境变量,并将 `%USERPROFILE%\.local\bin` 添加到您的用户 PATH 变量。重启您的终端。

151 

152 验证修复是否有效:

153 

154 ```batch theme={null}

155 claude --version

156 ```

157 </Tab>

158</Tabs>

159 

160### 检查冲突的安装

161 

162多个 Claude Code 安装可能导致版本不匹配或意外行为。检查已安装的内容:

163 

164<Tabs>

165 <Tab title="macOS/Linux">

166 列出在您的 PATH 中找到的所有 `claude` 二进制文件:

167 

168 ```bash theme={null}

169 which -a claude

170 ```

171 

172 如果这不打印任何内容,您的 PATH 上还没有 `claude`。返回到 [验证您的 PATH](#verify-your-path)。

173 

174 检查 `claude` 二进制文件可以来自的三个位置。`~/.local/bin/claude` 是本机安装程序,`~/.claude/local/` 是由较旧版本的 Claude Code 创建的旧版本本地 npm 安装,npm 全局列表显示 `-g` 安装:

175 

176 ```bash theme={null}

177 ls -la ~/.local/bin/claude

178 ```

179 

180 ```bash theme={null}

181 ls -la ~/.claude/local/

182 ```

183 

184 ```bash theme={null}

185 npm -g ls @anthropic-ai/claude-code 2>/dev/null

186 ```

187 </Tab>

188 

189 <Tab title="Windows PowerShell">

190 列出在您的 PATH 中找到的所有 `claude` 二进制文件:

191 

192 ```powershell theme={null}

193 where.exe claude

194 ```

195 

196 检查本机安装程序是否放置了二进制文件:

197 

198 ```powershell theme={null}

199 Test-Path "$env:USERPROFILE\.local\bin\claude.exe"

200 ```

201 </Tab>

202</Tabs>

203 

204如果您找到多个安装,只保留一个。macOS/Linux 上 `~/.local/bin/claude` 或 Windows 上 `%USERPROFILE%\.local\bin\claude.exe` 的本机安装是推荐的。删除额外的:

205 

206卸载 npm 全局安装:

207 

208```bash theme={null}

209npm uninstall -g @anthropic-ai/claude-code

210```

211 

212删除旧版本本地 npm 安装:

213 

214```bash theme={null}

215rm -rf ~/.claude/local

216```

217 

218在 Windows 上,使用 PowerShell:

219 

220```powershell theme={null}

221Remove-Item -Recurse -Force "$env:USERPROFILE\.claude\local"

222```

223 

224在 macOS 上删除 Homebrew 安装。如果您安装了 `claude-code@latest` cask,请替换该名称:

225 

226```bash theme={null}

227brew uninstall --cask claude-code

228```

229 

230在 Windows 上删除 WinGet 安装:

231 

232```powershell theme={null}

233winget uninstall Anthropic.ClaudeCode

234```

235 

236### 检查目录权限

237 

238安装程序需要对 macOS 和 Linux 上的 `~/.local/bin/` 和 `~/.claude/` 有写入权限。在 Windows 上,安装位置在 `%USERPROFILE%` 下,默认情况下您的用户可以写入,因此此部分很少适用于那里。

239 

240检查目录是否可写:

241 

242```bash theme={null}

243test -w ~/.local/bin && echo "writable" || echo "not writable"

244test -w ~/.claude && echo "writable" || echo "not writable"

245```

246 

247如果任一目录不可写,请创建安装目录并将您的用户设置为所有者:

248 

249```bash theme={null}

250sudo mkdir -p ~/.local/bin

251sudo chown -R $(whoami) ~/.local

252```

253 

254### 验证二进制文件是否有效

255 

256如果 `claude --version` 打印版本但 `claude` 在启动时崩溃或挂起,请运行这些检查来缩小原因范围。如果 `claude --version` 说命令未找到,请先转到 [验证您的 PATH](#verify-your-path);下面的命令假设 `claude` 在您的 PATH 上。

257 

258确认二进制文件存在且可执行:

259 

260```bash theme={null}

261ls -la "$(command -v claude)"

262```

263 

264在 Windows 上,使用 PowerShell:

265 

266```powershell theme={null}

267Get-Command claude | Select-Object Source

268```

269 

270在 Linux 上,检查缺失的共享库。如果 `ldd` 显示缺失的库,您可能需要安装系统包。在 Alpine Linux 和其他基于 musl 的发行版上,请参阅 [Alpine Linux setup](/zh-CN/setup#alpine-linux-and-musl-based-distributions)。

271 

272```bash theme={null}

273ldd "$(command -v claude)" | grep "not found"

274```

275 

276确认二进制文件可以执行:

277 

278```bash theme={null}

279claude --version

280```

281 

282## 常见安装问题

283 

284这些是最常见的安装问题及其解决方案。

285 

286### 安装脚本返回 HTML 而不是 shell 脚本

287 

288运行安装命令时,您可能会看到以下错误之一:

289 

290```text theme={null}

291bash: line 1: syntax error near unexpected token `<'

292bash: line 1: `<!DOCTYPE html>'

293```

294 

295在 PowerShell 上,同样的问题显示为:

296 

297```text theme={null}

298Invoke-Expression: Missing argument in parameter list.

299```

300 

301这意味着安装 URL 返回了 HTML 页面而不是安装脚本。如果 HTML 页面显示"App unavailable in region",Claude Code 在您的国家/地区不可用。请参阅 [supported countries](https://www.anthropic.com/supported-countries)。

302 

303否则,这可能由于网络问题、区域路由或临时服务中断而发生。

304 

305**解决方案:**

306 

3071. **使用替代安装方法**:

308 

309 在 macOS 上,通过 Homebrew 安装:

310 

311 ```bash theme={null}

312 brew install --cask claude-code

313 ```

314 

315 在 Windows 上,通过 WinGet 安装:

316 

317 ```powershell theme={null}

318 winget install Anthropic.ClaudeCode

319 ```

320 

3212. **几分钟后重试**:问题通常是暂时的。等待并再次尝试原始命令。

322 

323### 安装后 `command not found: claude`

324 

325安装完成但 `claude` 不起作用。确切的错误因平台而异:

326 

327| 平台 | 错误消息 |

328| :---------- | :--------------------------------------------------------------------- |

329| macOS | `zsh: command not found: claude` |

330| Linux | `bash: claude: command not found` |

331| Windows CMD | `'claude' is not recognized as an internal or external command` |

332| PowerShell | `claude : The term 'claude' is not recognized as the name of a cmdlet` |

333 

334这意味着安装目录不在您的 shell 搜索路径中。请参阅 [Verify your PATH](#verify-your-path) 以获取每个平台上的修复。

335 

336### `curl: (56) Failure writing output to destination`

337 

338`curl ... | bash` 命令下载脚本并将其传送到 Bash 以执行。此错误意味着连接在脚本完成下载前中断。常见原因包括网络中断、下载被中途阻止或系统资源限制。

339 

340**解决方案:**

341 

3421. **检查网络稳定性**:Claude Code 二进制文件托管在 `downloads.claude.ai`。测试您是否可以访问它:

343 ```bash theme={null}

344 curl -sI https://downloads.claude.ai/claude-code-releases/latest

345 ```

346 `HTTP/2 200` 行表示您已到达服务器,原始故障可能是间歇性的;重试安装命令。如果您看到 `Could not resolve host` 或连接超时,您的网络正在阻止下载。

347 

3482. **尝试替代安装方法**:

349 

350 在 macOS 上:

351 

352 ```bash theme={null}

353 brew install --cask claude-code

354 ```

355 

356 在 Windows 上:

357 

358 ```powershell theme={null}

359 winget install Anthropic.ClaudeCode

360 ```

361 

362### TLS 或 SSL 连接错误

363 

364诸如 `curl: (35) TLS connect error`、`schannel: next InitializeSecurityContext failed` 或 PowerShell 的 `Could not establish trust relationship for the SSL/TLS secure channel` 之类的错误表示 TLS 握手失败。

365 

366**解决方案:**

367 

3681. **更新您的系统 CA 证书**:

369 

370 在 Ubuntu/Debian 上:

371 

372 ```bash theme={null}

373 sudo apt-get update && sudo apt-get install ca-certificates

374 ```

375 

376 在 macOS 上,系统 curl 使用 Keychain 信任存储;更新 macOS 本身会更新根证书。

377 

3782. **在 Windows 上,在运行安装程序前在 PowerShell 中启用 TLS 1.2**:

379 ```powershell theme={null}

380 [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

381 irm https://claude.ai/install.ps1 | iex

382 ```

383 

3843. **检查代理或防火墙干扰**:执行 TLS 检查的企业代理可能导致这些错误,包括 `unable to get local issuer certificate` 和 `SELF_SIGNED_CERT_IN_CHAIN`。对于安装步骤,使用 `--cacert` 将 curl 指向您的企业 CA 包:

385 ```bash theme={null}

386 curl --cacert /path/to/corporate-ca.pem -fsSL https://claude.ai/install.sh | bash

387 ```

388 对于安装后的 Claude Code 本身,设置 `NODE_EXTRA_CA_CERTS` 以便 API 请求信任相同的包:

389 ```bash theme={null}

390 export NODE_EXTRA_CA_CERTS=/path/to/corporate-ca.pem

391 ```

392 如果您没有证书文件,请向您的 IT 团队询问。您也可以尝试直接连接以确认代理是原因。

393 

3944. **在 Windows 上,如果您看到 `CRYPT_E_NO_REVOCATION_CHECK (0x80092012)` 或 `CRYPT_E_REVOCATION_OFFLINE (0x80092013)`,请绕过证书撤销检查**。这些意味着 curl 到达了服务器,但您的网络阻止了证书撤销查询,这在企业防火墙后很常见。将 `--ssl-revoke-best-effort` 添加到安装命令:

395 ```batch theme={null}

396 curl --ssl-revoke-best-effort -fsSL https://claude.ai/install.cmd -o install.cmd && install.cmd && del install.cmd

397 ```

398 或者,使用 `winget install Anthropic.ClaudeCode` 安装,这完全避免了 curl。

399 

400### `Failed to fetch version from downloads.claude.ai`

401 

402安装程序无法访问下载服务器。这通常意味着 `downloads.claude.ai` 在您的网络上被阻止。

403 

404**解决方案:**

405 

4061. **直接测试连接**:

407 ```bash theme={null}

408 curl -sI https://downloads.claude.ai/claude-code-releases/latest

409 ```

410 

4112. **如果在代理后面**,设置 `HTTPS_PROXY` 以便安装程序可以通过它路由。有关详细信息,请参阅 [proxy configuration](/zh-CN/network-config#proxy-configuration)。

412 ```bash theme={null}

413 export HTTPS_PROXY=http://proxy.example.com:8080

414 curl -fsSL https://claude.ai/install.sh | bash

415 ```

416 

4173. **如果在受限网络上**,尝试不同的网络或 VPN,或使用替代安装方法:

418 

419 在 macOS 上:

420 

421 ```bash theme={null}

422 brew install --cask claude-code

423 ```

424 

425 在 Windows 上:

426 

427 ```powershell theme={null}

428 winget install Anthropic.ClaudeCode

429 ```

430 

431### Windows 上的错误安装命令

432 

433如果您看到 `'irm' is not recognized`、`The token '&&' is not valid` 或 `'bash' is not recognized as the name of a cmdlet`,您复制了不同 shell 或操作系统的安装命令。

434 

435* **`irm` 未识别**:您在 CMD 中,而不是 PowerShell。您有两个选项:

436 

437 通过在开始菜单中搜索"PowerShell"打开 PowerShell,然后运行原始安装命令:

438 

439 ```powershell theme={null}

440 irm https://claude.ai/install.ps1 | iex

441 ```

442 

443 或留在 CMD 中并改用 CMD 安装程序:

444 

445 ```batch theme={null}

446 curl -fsSL https://claude.ai/install.cmd -o install.cmd && install.cmd && del install.cmd

447 ```

448 

449* **`&&` 无效**:您在 PowerShell 中但运行了 CMD 安装程序命令。使用 PowerShell 安装程序:

450 ```powershell theme={null}

451 irm https://claude.ai/install.ps1 | iex

452 ```

453 

454* **`bash` 未识别**:您在 Windows 上运行了 macOS/Linux 安装程序。改用 PowerShell 安装程序:

455 ```powershell theme={null}

456 irm https://claude.ai/install.ps1 | iex

457 ```

458 

459### `The process cannot access the file` 在 Windows 安装期间

460 

461如果 PowerShell 安装程序失败并显示 `Failed to download binary: The process cannot access the file ... because it is being used by another process`,安装程序无法写入 `%USERPROFILE%\.claude\downloads`。这通常意味着之前的安装尝试仍在运行,或防病毒软件正在扫描该文件夹中部分下载的二进制文件。

462 

463关闭任何其他运行安装程序的 PowerShell 窗口,并等待防病毒扫描释放该文件。然后删除下载文件夹并再次运行安装程序:

464 

465```powershell theme={null}

466Remove-Item -Recurse -Force "$env:USERPROFILE\.claude\downloads"

467irm https://claude.ai/install.ps1 | iex

468```

469 

470### 低内存 Linux 服务器上安装被杀死

471 

472如果在 VPS 或云实例上安装期间看到 `Killed`:

473 

474```text theme={null}

475Setting up Claude Code...

476Installing Claude Code native build latest...

477bash: line 142: 34803 Killed "$binary_path" install ${TARGET:+"$TARGET"}

478```

479 

480Linux OOM 杀手终止了该进程,因为系统内存不足。Claude Code 需要至少 4 GB 的可用 RAM。

481 

482**解决方案:**

483 

4841. **如果您的服务器 RAM 有限,请添加交换空间**。交换使用磁盘空间作为溢出内存,让安装即使在低物理 RAM 的情况下也能完成。

485 

486 创建 2 GB 交换文件并启用它:

487 

488 ```bash theme={null}

489 sudo fallocate -l 2G /swapfile

490 sudo chmod 600 /swapfile

491 sudo mkswap /swapfile

492 sudo swapon /swapfile

493 ```

494 

495 然后重试安装:

496 

497 ```bash theme={null}

498 curl -fsSL https://claude.ai/install.sh | bash

499 ```

500 

5012. **关闭其他进程**以在安装前释放内存。

502 

5033. **如果可能,使用更大的实例**。Claude Code 需要至少 4 GB 的 RAM。

504 

505### Docker 中安装挂起

506 

507在 Docker 容器中安装 Claude Code 时,以 root 身份安装到 `/` 可能导致挂起。

508 

509**解决方案:**

510 

5111. **在运行安装程序前设置工作目录**。从 `/` 运行时,安装程序扫描整个文件系统,这导致过度的内存使用。设置 `WORKDIR` 将扫描限制在小目录:

512 ```dockerfile theme={null}

513 WORKDIR /tmp

514 RUN curl -fsSL https://claude.ai/install.sh | bash

515 ```

516 

5172. **增加 Docker 内存限制**(如果使用 Docker Desktop):

518 ```bash theme={null}

519 docker build --memory=4g .

520 ```

521 

522### Claude Desktop 在 Windows 上覆盖 `claude` 命令

523 

524如果您安装了较旧版本的 Claude Desktop,它可能在 `WindowsApps` 目录中注册 `Claude.exe`,其 PATH 优先级高于 Claude Code CLI。运行 `claude` 会打开 Desktop 应用而不是 CLI。

525 

526更新 Claude Desktop 到最新版本以修复此问题。

527 

528### Windows 上的 Claude Code 需要 Git for Windows(用于 bash)或 PowerShell

529 

530Windows 上的本机 Claude Code 需要至少一个 shell:[Git for Windows](https://git-scm.com/downloads/win) 用于 Bash,或 PowerShell。当两者都未找到时,此错误在启动时出现。如果仅找到 PowerShell,Claude Code 使用 PowerShell 工具而不是 Bash。

531 

532**如果两者都未安装**,请安装其中一个:

533 

534* Git for Windows:从 [git-scm.com/downloads/win](https://git-scm.com/downloads/win) 下载。在设置期间,选择"Add to PATH"。安装后重启您的终端。

535* PowerShell 7:从 [aka.ms/powershell](https://aka.ms/powershell) 下载。

536 

537**如果 Git 已安装**但 Claude Code 找不到它,请在您的 [settings.json file](/zh-CN/settings) 中设置路径:

538 

539```json theme={null}

540{

541 "env": {

542 "CLAUDE_CODE_GIT_BASH_PATH": "C:\\Program Files\\Git\\bin\\bash.exe"

543 }

544}

545```

546 

547如果您的 Git 安装在其他地方,通过在 PowerShell 中运行 `where.exe git` 找到路径,并使用该目录中的 `bin\bash.exe` 路径。

548 

549### Claude Code 不支持 32 位 Windows

550 

551Windows 在开始菜单中包含两个 PowerShell 条目:`Windows PowerShell` 和 `Windows PowerShell (x86)`。x86 条目以 32 位进程运行,即使在 64 位机器上也会触发此错误。要检查您处于哪种情况,请在产生错误的同一窗口中运行此命令:

552 

553```powershell theme={null}

554[Environment]::Is64BitOperatingSystem

555```

556 

557如果这打印 `True`,您的操作系统没问题。关闭窗口,打开不带 x86 后缀的 `Windows PowerShell`,然后再次运行安装命令。

558 

559如果这打印 `False`,您在 32 位版本的 Windows 上。Claude Code 需要 64 位操作系统。请参阅 [system requirements](/zh-CN/setup#system-requirements)。

560 

561### Linux musl 或 glibc 二进制文件不匹配

562 

563如果在安装后看到关于缺失共享库(如 `libstdc++.so.6` 或 `libgcc_s.so.1`)的错误,安装程序可能为您的系统下载了错误的二进制变体。

564 

565```text theme={null}

566Error loading shared library libstdc++.so.6: No such file or directory

567```

568 

569这可能发生在安装了 musl 交叉编译包的基于 glibc 的系统上,导致安装程序将系统误检测为 musl。

570 

571**解决方案:**

572 

5731. **检查您的系统使用哪个 libc**:

574 ```bash theme={null}

575 ldd --version 2>&1 | head -1

576 ```

577 提及 `GNU libc` 或 `GLIBC` 的输出表示 glibc。提及 `musl` 的输出表示 musl。

578 

5792. **如果您在 glibc 上但获得了 musl 二进制文件**,删除安装并重新安装。您也可以使用 `https://downloads.claude.ai/claude-code-releases/{VERSION}/manifest.json` 处的清单手动下载正确的二进制文件。使用 `ldd --version` 和 `ls /lib/libc.musl*` 的输出提交 [GitHub issue](https://github.com/anthropics/claude-code/issues)。

580 

5813. **如果您实际上在 musl 上**,例如 Alpine Linux,请安装所需的包:

582 ```bash theme={null}

583 apk add libgcc libstdc++ ripgrep

584 ```

585 

586### `Illegal instruction`

587 

588如果运行 `claude` 或安装程序打印 `Illegal instruction`,本机二进制文件使用您的处理器不支持的 CPU 指令。有两个不同的原因。

589 

590**架构不匹配。** 安装程序下载了错误的二进制文件,例如在 ARM 服务器上的 x86。在 macOS 或 Linux 上使用 `uname -m` 检查,或在 PowerShell 中使用 `$env:PROCESSOR_ARCHITECTURE`。如果结果与您收到的二进制文件不匹配,请 [file a GitHub issue](https://github.com/anthropics/claude-code/issues) 并提供输出。

591 

592**缺失 AVX 指令集。** 如果您的架构正确但仍然看到 `Illegal instruction`,您的 CPU 可能缺少二进制文件需要的 AVX 或其他指令。这影响大约 2013 年之前的英特尔和 AMD 处理器,以及虚拟机(其中虚拟机管理程序不将 AVX 传递给客户机)。

593 

594在 VPS 或 VM 上,运行 `grep -m1 -ow avx /proc/cpuinfo`;空结果意味着 AVX 对客户机不可用。

595 

596没有本机二进制文件解决方法;跟踪 [issue #50384](https://github.com/anthropics/claude-code/issues/50384) 以获取状态,并在报告时包括您的 CPU 型号(来自 Linux 上的 `grep -m1 "model name" /proc/cpuinfo` 或 macOS 上的 `sysctl -n machdep.cpu.brand_string`)。

597 

598替代安装方法下载相同的本机二进制文件,不会解决任一原因。

599 

600### macOS 上的 `dyld: cannot load`

601 

602如果在安装期间看到 `dyld: cannot load`、`dyld: Symbol not found` 或 `Abort trap: 6`,二进制文件与您的 macOS 版本或硬件不兼容。

603 

604```text theme={null}

605dyld: cannot load 'claude-2.1.42-darwin-x64' (load command 0x80000034 is unknown)

606Abort trap: 6

607```

608 

609引用 `libicucore` 的 `Symbol not found` 错误也表示您的 macOS 版本比二进制文件支持的版本更旧:

610 

611```text theme={null}

612dyld: Symbol not found: _ubrk_clone

613 Referenced from: claude-darwin-x64 (which was built for Mac OS X 13.0)

614 Expected in: /usr/lib/libicucore.A.dylib

615```

616 

617**解决方案:**

618 

6191. **检查您的 macOS 版本**:Claude Code 需要 macOS 13.0 或更高版本。打开 Apple 菜单并选择"About This Mac"以检查您的版本。

620 

6212. **更新 macOS**(如果您在较旧版本上)。二进制文件使用较旧 macOS 版本不支持的加载命令和系统库。Homebrew 等替代安装方法下载相同的二进制文件,不会解决此错误。

622 

623### WSL1 上的 `Exec format error`

624 

625如果在 WSL 中运行 `claude` 打印 `cannot execute binary file: Exec format error`,您在 WSL1 上并遇到了在 [issue #38788](https://github.com/anthropics/claude-code/issues/38788) 中跟踪的已知本机二进制文件回归。二进制文件的程序头以 WSL1 的加载程序无法处理的方式改变。

626 

627最干净的修复是从 PowerShell 将您的发行版转换为 WSL2:

628 

629```powershell theme={null}

630wsl --set-version <DistroName> 2

631```

632 

633如果您需要留在 WSL1 上,通过动态链接器调用二进制文件。将此函数添加到 WSL 内的 `~/.bashrc`,如果您的主目录不同,请替换路径:

634 

635```bash theme={null}

636claude() {

637 /lib64/ld-linux-x86-64.so.2 "$(readlink -f "$HOME/.local/bin/claude")" "$@"

638}

639```

640 

641然后运行 `source ~/.bashrc` 并重试 `claude`。

642 

643### WSL 中的 npm 安装错误

644 

645如果您在 WSL 内使用 `npm install -g` 安装了 Claude Code,这些问题适用。如果您使用了 [native installer](/zh-CN/setup),请跳过此部分。

646 

647**OS 或平台检测问题。** 如果 npm 在安装期间报告平台不匹配,WSL 可能正在选择 Windows `npm`。首先运行 `npm config set os linux`,然后使用 `npm install -g @anthropic-ai/claude-code --force` 安装。不要使用 `sudo`。

648 

649**运行 `claude` 时 `exec: node: not found`。** 您的 WSL 环境可能使用 Node.js 的 Windows 安装。使用 `which npm` 和 `which node` 确认:以 `/mnt/c/` 开头的路径是 Windows 二进制文件,而 Linux 路径以 `/usr/` 开头。要修复此问题,通过您的 Linux 发行版的包管理器或通过 [`nvm`](https://github.com/nvm-sh/nvm) 安装 Node。

650 

651**nvm 版本冲突。** 如果您在 WSL 和 Windows 中都安装了 nvm,在 WSL 中切换 Node 版本可能会中断,因为 WSL 默认导入 Windows PATH,Windows nvm 优先。最常见的原因是 nvm 未在您的 shell 中加载。将 nvm 加载程序添加到 `~/.bashrc` 或 `~/.zshrc`:

652 

653```bash theme={null}

654export NVM_DIR="$HOME/.nvm"

655[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"

656[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"

657```

658 

659或在您的当前会话中加载它:

660 

661```bash theme={null}

662source ~/.nvm/nvm.sh

663```

664 

665如果 nvm 已加载但 Windows 路径仍然优先,显式预置您的 Linux Node 路径:

666 

667```bash theme={null}

668export PATH="$HOME/.nvm/versions/node/$(node -v)/bin:$PATH"

669```

670 

671<Warning>

672 避免通过 `appendWindowsPath = false` 禁用 Windows PATH 导入,因为这会破坏从 WSL 调用 Windows 可执行文件的能力。同样,如果您为 Windows 开发使用 Node.js,请避免从 Windows 卸载它。

673</Warning>

674 

675### 安装期间的权限错误

676 

677如果本机安装程序因权限错误而失败,目标目录可能不可写。请参阅 [Check directory permissions](#check-directory-permissions)。

678 

679如果您之前使用 npm 安装并遇到 npm 特定的权限错误,请切换到本机安装程序:

680 

681```bash theme={null}

682curl -fsSL https://claude.ai/install.sh | bash

683```

684 

685### npm 安装后未找到本机二进制文件

686 

687`@anthropic-ai/claude-code` npm 包通过每个平台的可选依赖项(如 `@anthropic-ai/claude-code-darwin-arm64`)拉入本机二进制文件。如果在安装后运行 `claude` 打印 `Could not find native binary package "@anthropic-ai/claude-code-<platform>"`,请检查以下原因:

688 

689* **可选依赖项被禁用。** 从您的 npm 安装命令中删除 `--omit=optional`,从 pnpm 中删除 `--no-optional`,或从 yarn 中删除 `--ignore-optional`,并检查 `.npmrc` 是否未设置 `optional=false`。然后重新安装。本机二进制文件仅作为可选依赖项提供,因此如果跳过它,就没有 JavaScript 回退。

690* **不支持的平台。** 预构建的二进制文件为 `darwin-arm64`、`darwin-x64`、`linux-x64`、`linux-arm64`、`linux-x64-musl`、`linux-arm64-musl`、`win32-x64` 和 `win32-arm64` 发布。Claude Code 不为其他平台提供二进制文件;请参阅 [system requirements](/zh-CN/setup#system-requirements)。

691* **企业 npm 镜像缺少平台包。** 确保您的注册表除了元包外还镜像所有八个 `@anthropic-ai/claude-code-*` 平台包。

692 

693使用 `--ignore-scripts` 安装不会触发此错误。跳过链接二进制文件到位的 postinstall 步骤,因此 Claude Code 回退到在每次启动时定位和生成平台二进制文件的包装器。这有效但启动速度较慢;使用启用的脚本重新安装以进行直接执行。

694 

695## 登录和身份验证

696 

697这些部分解决登录失败、OAuth 错误和令牌问题。

698 

699### 重置您的登录

700 

701当登录失败且原因不明显时,干净的重新身份验证可以解决大多数情况:

702 

7031. 运行 `/logout` 完全注销

7042. 关闭 Claude Code

7053. 使用 `claude` 重启并再次完成身份验证过程

706 

707如果浏览器在登录期间不会自动打开,按 `c` 将 OAuth URL 复制到您的剪贴板,然后手动将其粘贴到浏览器中。当 URL 在狭窄或 SSH 终端中跨行换行且无法直接点击时,这也有效。

708 

709### OAuth 错误:无效代码

710 

711如果您看到 `OAuth error: Invalid code. Please make sure the full code was copied`,登录代码已过期或在复制粘贴期间被截断。

712 

713**解决方案:**

714 

715* 按 Enter 重试,并在浏览器打开后快速完成登录

716* 如果浏览器不会自动打开,输入 `c` 复制完整 URL

717* 如果使用远程/SSH 会话,浏览器可能在错误的机器上打开。复制终端中显示的 URL 并在您的本地浏览器中打开它。

718 

719### 登录后 403 Forbidden

720 

721如果登录后看到 `API Error: 403 {"error":{"type":"forbidden","message":"Request not allowed"}}`:

722 

723* **Claude Pro/Max 用户**:在 [claude.ai/settings](https://claude.ai/settings) 验证您的订阅是否有效

724* **Anthropic Console 用户**:确认您的账户具有"Claude Code"或"Developer"角色。管理员在 Anthropic Console 的"Settings → Members"中分配此角色。

725* **在代理后面**:企业代理可能干扰 API 请求。有关代理设置,请参阅 [network configuration](/zh-CN/network-config)。

726 

727### 此组织已被禁用,但有活跃订阅

728 

729如果您看到 `API Error: 400 ... "This organization has been disabled"`,尽管有活跃的 Claude 订阅,`ANTHROPIC_API_KEY` 环境变量正在覆盖您的订阅。这通常发生在来自前一个雇主或项目的旧 API 密钥仍在您的 shell 配置文件中设置时。

730 

731当 `ANTHROPIC_API_KEY` 存在且您已批准它时,Claude Code 使用该密钥而不是您的订阅的 OAuth 凭证。在使用 `-p` 标志的非交互模式下,当存在时始终使用该密钥。有关完整的解决顺序,请参阅 [authentication precedence](/zh-CN/authentication#authentication-precedence)。

732 

733要改用您的订阅,请取消设置环境变量并从您的 shell 配置文件中删除它:

734 

735```bash theme={null}

736unset ANTHROPIC_API_KEY

737claude

738```

739 

740检查 `~/.zshrc`、`~/.bashrc` 或 `~/.profile` 中的 `export ANTHROPIC_API_KEY=...` 行并删除它们以使更改永久生效。在 Windows 上,检查您的 PowerShell 配置文件(位于 `$PROFILE`)和您的用户环境变量中的 `ANTHROPIC_API_KEY`。在 Claude Code 内运行 `/status` 以确认哪种身份验证方法处于活跃状态。

741 

742### OAuth 登录在 WSL2、SSH 或容器中失败

743 

744当 Claude Code 在 WSL2 中运行、通过 SSH 在远程机器上运行或在容器内运行时,浏览器通常在不同的主机上打开,其重定向无法到达 Claude Code 的本地回调服务器。登录后,浏览器显示登录代码而不是自动重定向回来。将该代码粘贴到终端的 `Paste code here if prompted` 提示处以完成登录。

745 

746如果浏览器根本不从 WSL2 打开,请将 `BROWSER` 环境变量设置为您的 Windows 浏览器路径:

747 

748```bash theme={null}

749export BROWSER="/mnt/c/Program Files/Google/Chrome/Application/chrome.exe"

750claude

751```

752 

753或者,在交互式登录提示处按 `c` 复制 OAuth URL,或复制 `claude auth login` 打印的 URL,并在您的本地机器上的浏览器中打开它。

754 

755如果将代码粘贴到交互式提示中没有任何反应,您的终端的粘贴绑定可能无法到达输入字段。尝试您的终端的替代粘贴快捷键,通常在 Windows Terminal 中是右键单击或 Shift+Insert,或改用 `claude auth login`,它从标准输入读取粘贴的代码:

756 

757```bash theme={null}

758claude auth login

759```

760 

761此回退也适用于本机 Windows 或任何将粘贴到交互式提示中失败的终端。

762 

763### 未登录或令牌已过期

764 

765如果 Claude Code 在会话后提示您再次登录,您的 OAuth 令牌可能已过期。

766 

767运行 `/login` 重新身份验证。如果这经常发生,检查您的系统时钟是否准确,因为令牌验证取决于正确的时间戳。

768 

769在 macOS 上,当 Keychain 被锁定或其密码与您的账户密码不同步时,登录也可能失败,这会阻止 Claude Code 保存凭证。运行 `claude doctor` 检查 Keychain 访问。要手动解锁 Keychain,请运行 `security unlock-keychain ~/Library/Keychains/login.keychain-db`。如果解锁无法帮助,打开 Keychain Access,选择 `login` keychain,并选择"Edit > Change Password for Keychain "login""以将其与您的账户密码重新同步。

770 

771### Bedrock、Vertex 或 Foundry 凭证未加载

772 

773如果您配置了 Claude Code 以使用云提供商,并在 Bedrock 上看到 `Could not load credentials from any providers`、在 Vertex 上看到 `Could not load the default credentials` 或在 Foundry 上看到 `ChainedTokenCredential authentication failed`,您的云提供商 CLI 可能在当前 shell 中未进行身份验证。

774 

775对于 Bedrock,确认您的 AWS 凭证有效:

776 

777```bash theme={null}

778aws sts get-caller-identity

779```

780 

781对于 Vertex AI,确认 `ANTHROPIC_VERTEX_PROJECT_ID` 和 `CLOUD_ML_REGION` 在您的 shell 中设置,然后设置应用默认凭证:

782 

783```bash theme={null}

784gcloud auth application-default login

785```

786 

787对于 Microsoft Foundry,确认 `ANTHROPIC_FOUNDRY_API_KEY` 已设置,或使用 Azure CLI 登录以便默认凭证链可以找到您的账户:

788 

789```bash theme={null}

790az login

791```

792 

793如果凭证在您的终端中有效但在 VS Code 或 JetBrains 扩展中无效,IDE 进程可能未继承您的 shell 环境。在 IDE 自己的设置中设置提供商环境变量,或从已导出它们的终端启动 IDE。

794 

795有关完整的提供商设置,请参阅 [Amazon Bedrock](/zh-CN/amazon-bedrock)、[Google Vertex AI](/zh-CN/google-vertex-ai) 或 [Microsoft Foundry](/zh-CN/microsoft-foundry)。

796 

797## 仍然卡住

798 

799如果上述任何方法都无法解决您的问题:

800 

8011. 检查 [GitHub repository](https://github.com/anthropics/claude-code/issues) 以了解已知问题,或使用您的操作系统、您运行的安装命令和完整错误输出打开新问题

8022. 如果 `claude --version` 有效但其他内容有问题,运行 `claude doctor` 以获取自动诊断报告

8033. 如果您可以启动会话,在 Claude Code 内使用 `/feedback` 报告问题

troubleshooting.md +121 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 故障排除

6 

7> 修复 Claude Code 中的高 CPU 或内存使用、挂起、自动压缩抖动和搜索问题,并找到其他问题的正确页面。

8 

9本页涵盖 Claude Code 运行后的性能、稳定性和搜索问题。对于其他问题,请从与您遇到的问题相匹配的页面开始:

10 

11| 症状 | 转到 |

12| :------------------------------------------------------------------------------ | :---------------------------------------------------------------- |

13| `command not found`、安装失败、PATH 问题、`EACCES`、TLS 错误 | [故障排除安装和登录](/zh-CN/troubleshoot-install) |

14| 登录循环、OAuth 错误、`403 Forbidden`、"organization disabled"、Bedrock/Vertex/Foundry 凭据 | [故障排除安装和登录](/zh-CN/troubleshoot-install#login-and-authentication) |

15| 设置未应用、hooks 未触发、MCP 服务器未加载 | [调试您的配置](/zh-CN/debug-your-config) |

16| `API Error: 5xx`、`529 Overloaded`、`429`、请求验证错误 | [错误参考](/zh-CN/errors) |

17| `model not found` 或 `you may not have access to it` | [错误参考](/zh-CN/errors#theres-an-issue-with-the-selected-model) |

18| VS Code 扩展未连接或未检测到 Claude | [VS Code 集成](/zh-CN/vs-code#fix-common-issues) |

19| JetBrains 插件或 IDE 未检测到 | [JetBrains 集成](/zh-CN/jetbrains#troubleshooting) |

20| 高 CPU 或内存、响应缓慢、挂起、搜索找不到文件 | [性能和稳定性](#performance-and-stability)下方 |

21 

22如果您不确定哪个适用,请在 Claude Code 内运行 `/doctor` 以自动检查您的安装、设置、MCP 服务器和上下文使用情况。如果 `claude` 根本无法启动,请从您的 shell 运行 `claude doctor`。

23 

24## 性能和稳定性

25 

26这些部分涵盖与资源使用、响应性和搜索行为相关的问题。

27 

28### 高 CPU 或内存使用

29 

30Claude Code 设计用于大多数开发环境,但在处理大型代码库时可能消耗大量资源。如果您遇到性能问题:

31 

321. 定期使用 `/compact` 以减少上下文大小

332. 在主要任务之间关闭并重启 Claude Code

343. 考虑将大型构建目录添加到您的 `.gitignore` 文件

35 

36如果内存使用在这些步骤后仍然很高,请运行 `/heapdump` 以将 JavaScript 堆快照和内存分解写入 `~/Desktop`。在 Linux 上没有 Desktop 文件夹的情况下,文件被写入您的主目录。

37 

38分解显示驻留集大小、JS 堆、数组缓冲区和未计算的本机内存,这有助于识别增长是在 JavaScript 对象还是本机代码中。要检查保留者,请在 Chrome DevTools 中的 Memory → Load 下打开 `.heapsnapshot` 文件。在 [GitHub](https://github.com/anthropics/claude-code/issues) 上报告内存问题时附加两个文件。

39 

40### 自动压缩停止并出现抖动错误

41 

42如果您看到 `Autocompact is thrashing: the context refilled to the limit...`,自动压缩成功,但文件或工具输出立即多次将上下文窗口重新填充到限制。Claude Code 停止重试以避免在没有取得进展的循环上浪费 API 调用。

43 

44要恢复:

45 

461. 要求 Claude 以较小的块读取超大文件,例如特定行范围或函数,而不是整个文件

472. 运行 `/compact`,重点是删除大输出,例如 `/compact keep only the plan and the diff`

483. 将大文件工作移到 [subagent](/zh-CN/sub-agents),以便它在单独的上下文窗口中运行

494. 如果早期对话不再需要,运行 `/clear`

50 

51### 命令挂起或冻结

52 

53如果 Claude Code 似乎无响应:

54 

551. 按 Ctrl+C 尝试取消当前操作

562. 如果无响应,您可能需要关闭终端并重新启动

57 

58重新启动不会丢失您的对话。在同一目录中运行 `claude --resume` 以继续会话。

59 

60### 搜索和发现问题

61 

62如果搜索工具、`@file` 提及、自定义代理或自定义 skills 找不到文件,捆绑的 `ripgrep` 二进制文件可能无法在您的系统上运行。安装您平台的 `ripgrep` 包并告诉 Claude Code 改用它:

63 

64<Tabs>

65 <Tab title="macOS">

66 ```bash theme={null}

67 brew install ripgrep

68 ```

69 </Tab>

70 

71 <Tab title="Ubuntu/Debian">

72 ```bash theme={null}

73 sudo apt install ripgrep

74 ```

75 </Tab>

76 

77 <Tab title="Alpine">

78 ```bash theme={null}

79 apk add ripgrep

80 ```

81 </Tab>

82 

83 <Tab title="Arch">

84 ```bash theme={null}

85 pacman -S ripgrep

86 ```

87 </Tab>

88 

89 <Tab title="Windows">

90 ```powershell theme={null}

91 winget install BurntSushi.ripgrep.MSVC

92 ```

93 </Tab>

94</Tabs>

95 

96然后在您的[环境](/zh-CN/env-vars)中设置 `USE_BUILTIN_RIPGREP=0`。

97 

98### WSL 上的搜索速度缓慢或结果不完整

99 

100在 WSL 上[跨文件系统工作](https://learn.microsoft.com/en-us/windows/wsl/filesystems)时的磁盘读取性能损失可能导致使用 Claude Code 在 WSL 上时搜索匹配数少于预期。搜索仍然有效,但返回的结果少于本机文件系统。

101 

102<Note>

103 在这种情况下,`/doctor` 将显示搜索为正常。

104</Note>

105 

106**解决方案:**

107 

1081. **提交更具体的搜索**:通过指定目录或文件类型来减少搜索的文件数:"在 auth-service 包中搜索 JWT 验证逻辑"或"在 JS 文件中查找 md5 哈希的使用"。

109 

1102. **将项目移到 Linux 文件系统**:如果可能,确保您的项目位于 Linux 文件系统(`/home/`)而不是 Windows 文件系统(`/mnt/c/`)。

111 

1123. **改用本机 Windows**:考虑在 Windows 上本机运行 Claude Code 而不是通过 WSL,以获得更好的文件系统性能。

113 

114## 获取更多帮助

115 

116如果您遇到此处未涵盖的问题:

117 

1181. 运行 `/doctor` 以检查安装健康状况、设置有效性、MCP 配置和上下文使用情况

1192. 在 Claude Code 中使用 `/feedback` 命令直接向 Anthropic 报告问题

1203. 检查 [GitHub 存储库](https://github.com/anthropics/claude-code) 以了解已知问题

1214. 直接向 Claude 询问其功能和特性。Claude 可以内置访问其文档。

ultraplan.md +84 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 使用 ultraplan 在云端规划

6 

7> 从 CLI 启动计划,在网络上的 Claude Code 中草拟,然后远程执行或在终端中执行

8 

9<Note>

10 Ultraplan 处于研究预览阶段,需要 Claude Code v2.1.91 或更高版本。行为和功能可能会根据反馈而改变。

11</Note>

12 

13Ultraplan 将规划任务从本地 CLI 交给在 [plan mode](/zh-CN/permission-modes#analyze-before-you-edit-with-plan-mode) 中运行的 [网络上的 Claude Code](/zh-CN/claude-code-on-the-web) 会话。Claude 在云端草拟计划,同时你可以继续在终端中工作。计划准备好后,你在浏览器中打开它来对特定部分进行评论、请求修订,并选择在何处执行。

14 

15当你需要比终端提供的更丰富的审查界面时,这很有用:

16 

17* **有针对性的反馈**:对计划的各个部分进行评论,而不是回复整个计划

18* **无需干预的草拟**:计划在远程生成,所以你的终端可以自由用于其他工作

19* **灵活的执行**:批准计划在网络上运行并打开拉取请求,或将其发送回终端

20 

21Ultraplan 需要 [网络上的 Claude Code](/zh-CN/claude-code-on-the-web) 账户和 GitHub 仓库。由于它在 Anthropic 的云基础设施上运行,当使用 Amazon Bedrock、Google Cloud Vertex AI 或 Microsoft Foundry 时不可用。云会话在你账户的默认 [云环境](/zh-CN/claude-code-on-the-web#the-cloud-environment) 中运行。如果你还没有云环境,ultraplan 在首次启动时会自动创建一个。

22 

23## 从 CLI 启动 ultraplan

24 

25从本地 CLI 会话,你可以通过三种方式启动 ultraplan:

26 

27* **命令**:运行 `/ultraplan` 后跟你的提示

28* **关键字**:在普通提示中的任何地方包含单词 `ultraplan`

29* **从本地计划**:当 Claude 完成本地计划并显示批准对话框时,选择 **No, refine with Ultraplan on Claude Code on the web** 将草稿发送到云端进行进一步迭代

30 

31例如,要使用命令规划服务迁移:

32 

33```

34/ultraplan migrate the auth service from sessions to JWTs

35```

36 

37命令和关键字路径在启动前打开确认对话框。本地计划路径跳过此对话框,因为该选择已作为确认。如果 [Remote Control](/zh-CN/remote-control) 处于活动状态,当 ultraplan 启动时它会断开连接,因为两个功能都占用 claude.ai/code 界面,一次只能连接一个。

38 

39云会话启动后,CLI 的提示输入显示状态指示器,同时远程会话工作:

40 

41| 状态 | 含义 |

42| :----------------------------- | :--------------------- |

43| `◇ ultraplan` | Claude 正在研究你的代码库并草拟计划 |

44| `◇ ultraplan needs your input` | Claude 有澄清问题;打开会话链接以响应 |

45| `◆ ultraplan ready` | 计划已准备好在浏览器中审查 |

46 

47运行 `/tasks` 并选择 ultraplan 条目以打开详细视图,其中包含会话链接、代理活动和 **Stop ultraplan** 操作。停止会存档云会话并清除指示器;没有任何内容保存到终端。

48 

49## 在浏览器中审查和修订计划

50 

51当状态更改为 `◆ ultraplan ready` 时,打开会话链接以在 claude.ai 上查看计划。计划出现在专用审查视图中:

52 

53* **内联评论**:突出显示任何段落并留下评论供 Claude 处理

54* **表情符号反应**:对部分进行反应以表示批准或关注,无需撰写完整评论

55* **大纲侧边栏**:在计划的各个部分之间跳转

56 

57当你要求 Claude 处理你的评论时,它会修订计划并呈现更新的草稿。你可以根据需要迭代多次,然后选择在何处执行。

58 

59## 选择执行位置

60 

61当计划看起来正确时,你在浏览器中选择 Claude 是在同一云会话中实现它,还是将其发送回等待的终端。

62 

63### 在网络上执行

64 

65在浏览器中选择 **Approve Claude's plan and start coding** 让 Claude 在同一 Claude Code on the web 会话中实现它。你的终端显示确认,状态指示器清除,工作继续在云端。实现完成后,[审查差异](/zh-CN/claude-code-on-the-web#review-changes) 并从网络界面创建拉取请求。

66 

67### 将计划发送回终端

68 

69在浏览器中选择 **Approve plan and teleport back to terminal** 以在本地实现计划,完全访问你的环境。当会话从 CLI 启动且终端仍在轮询时,此选项出现。网络会话被存档,因此它不会继续并行工作。

70 

71你的终端在标题为 **Ultraplan approved** 的对话框中显示计划,有三个选项:

72 

73* **Implement here**:将计划注入到当前对话中,从你离开的地方继续

74* **Start new session**:清除当前对话并仅以计划作为上下文重新开始

75* **Cancel**:将计划保存到文件而不执行它;Claude 打印文件路径,以便你稍后可以返回到它

76 

77如果你启动新会话,Claude 会在顶部打印 `claude --resume` 命令,以便你稍后可以返回到之前的对话。

78 

79## 相关资源

80 

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

82* [Plan mode](/zh-CN/permission-modes#analyze-before-you-edit-with-plan-mode):本地会话中规划的工作方式

83* [使用 ultrareview 查找错误](/zh-CN/ultrareview):ultraplan 的代码审查对应物,用于在合并前捕获问题

84* [Remote Control](/zh-CN/remote-control):使用 claude.ai/code 界面与在自己机器上运行的会话

ultrareview.md +108 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 使用 Ultrareview 查找错误

6 

7> 使用 /ultrareview 在云中运行深度多代理代码审查,在合并前查找和验证错误。

8 

9<Note>

10 Ultrareview 是 Claude Code v2.1.86 及更高版本中提供的研究预览功能。该功能、定价和可用性可能会根据反馈而改变。

11</Note>

12 

13Ultrareview 是在 Claude Code 网络基础设施上运行的深度代码审查。当您运行 `/ultrareview` 时,Claude Code 在远程沙箱中启动一队审查代理来查找您的分支或拉取请求中的错误。

14 

15与本地 `/review` 相比,ultrareview 提供:

16 

17* **更高的信号质量**:每个报告的发现都经过独立复现和验证,因此结果专注于真实的错误而不是风格建议

18* **更广泛的覆盖范围**:许多审查代理并行探索更改,这会发现单次审查可能遗漏的问题

19* **无本地资源使用**:审查完全在远程沙箱中运行,因此您的终端在运行时保持空闲,可用于其他工作

20 

21Ultrareview 需要使用 Claude.ai 账户进行身份验证,因为它在 Claude Code 网络基础设施上运行。如果您仅使用 API 密钥登录,请先运行 `/login` 并使用 Claude.ai 进行身份验证。当使用 Claude Code 与 Amazon Bedrock、Google Cloud Vertex AI 或 Microsoft Foundry 时,Ultrareview 不可用,对于已启用零数据保留的组织也不可用。

22 

23## 从 CLI 运行 ultrareview

24 

25从 Claude Code CLI 中的任何 git 存储库启动审查。

26 

27```text theme={null}

28/ultrareview

29```

30 

31不带参数时,ultrareview 审查您当前分支与默认分支之间的差异,包括工作树中任何未提交和暂存的更改。Claude Code 捆绑存储库状态并将其上传到远程沙箱进行审查。

32 

33要审查 GitHub 拉取请求,请传递 PR 编号。

34 

35```text theme={null}

36/ultrareview 1234

37```

38 

39在 PR 模式下,远程沙箱直接从 GitHub 克隆拉取请求,而不是捆绑您的本地工作树。PR 模式需要存储库上有 `github.com` 远程。

40 

41<Tip>

42 如果您的存储库太大而无法捆绑,Claude Code 会提示您改用 PR 模式。推送您的分支并打开草稿 PR,然后运行 `/ultrareview <PR-number>`。

43</Tip>

44 

45启动前,Claude Code 显示一个确认对话框,其中包含审查范围(包括审查分支时的文件和行数)、您剩余的免费运行次数和估计成本。确认后,审查在后台继续进行,您可以继续使用您的会话。该命令仅在您使用 `/ultrareview` 调用时运行;Claude 不会自动启动 ultrareview。

46 

47## 定价和免费运行

48 

49Ultrareview 是一项高级功能,按额外使用量而不是您计划的包含使用量计费。

50 

51| 计划 | 包含的免费运行 | 免费运行后 |

52| ----------------- | --------------------------- | -------------------------------------------------------------------------------------------------- |

53| Pro | 3 次免费运行,有效期至 2026 年 5 月 5 日 | 按 [额外使用量](https://support.claude.com/zh-CN/articles/12429409-extra-usage-for-paid-claude-plans) 计费 |

54| Max | 3 次免费运行,有效期至 2026 年 5 月 5 日 | 按 [额外使用量](https://support.claude.com/zh-CN/articles/12429409-extra-usage-for-paid-claude-plans) 计费 |

55| Team 和 Enterprise | 无 | 按 [额外使用量](https://support.claude.com/zh-CN/articles/12429409-extra-usage-for-paid-claude-plans) 计费 |

56 

57Pro 和 Max 订阅者获得三次免费 ultrareview 运行来尝试该功能。这三次运行是每个账户的一次性分配,不会刷新,并在 2026 年 5 月 5 日过期。使用完这三次后,或在免费运行期结束后,每次审查都按额外使用量计费,通常根据更改的大小花费 \$5 到 \$20。一次运行在远程会话启动后计数,因此您提前停止或未能完成的审查仍然会使用一次免费运行。对于付费审查,额外使用量仅对运行的部分计费。

58 

59由于 ultrareview 在免费运行之外始终按额外使用量计费,您的账户或组织必须在启动付费审查之前启用额外使用量。如果未启用额外使用量,Claude Code 会阻止启动并将您链接到计费设置,您可以在那里打开它。您也可以运行 `/extra-usage` 来检查或更改您的当前设置。

60 

61## 跟踪正在运行的审查

62 

63审查通常需要 5 到 10 分钟。审查作为后台任务运行,因此您可以继续在会话中工作、启动其他命令或完全关闭终端。

64 

65使用 `/tasks` 查看正在运行和已完成的审查、打开审查的详细视图或停止正在进行的审查。停止审查会存档云会话,部分发现不会返回。审查完成后,验证的发现会在您的会话中显示为通知。每个发现都包括文件位置和问题的解释,因此您可以要求 Claude 直接修复它。

66 

67## 非交互式运行 ultrareview

68 

69使用 `claude ultrareview` 子命令从 CI 或脚本启动 ultrareview,无需交互式会话。该子命令启动与 `/ultrareview` 相同的审查,阻止直到远程审查完成,将发现打印到 stdout,成功时以代码 0 退出,失败时以代码 1 退出。

70 

71```bash theme={null}

72claude ultrareview

73claude ultrareview 1234

74claude ultrareview origin/main

75```

76 

77不带参数时,该子命令审查您当前分支与默认分支之间的差异。传递 PR 编号来审查拉取请求,或传递基础分支来审查与该分支的差异。调用该子命令表示同意交互式命令显示的计费和条款提示。

78 

79进度消息和实时会话 URL 转到 stderr,以便 stdout 保持可解析。使用这些标志来控制输出和超时:

80 

81| 标志 | 描述 |

82| --------------------- | ------------------------------ |

83| `--json` | 打印原始 `bugs.json` 有效负载而不是格式化的发现 |

84| `--timeout <minutes>` | 等待审查完成的最大分钟数。默认为 30 |

85 

86运行 `claude ultrareview` 需要与 `/ultrareview` 相同的身份验证和额外使用量配置。当审查完成时(无论是否有发现)子命令以代码 0 退出,当审查无法启动、远程会话出错或超时时以代码 1 退出,当使用 Ctrl-C 中断时以代码 130 退出。如果您中断子命令,远程审查会继续运行;按照打印到 stderr 的会话 URL 在浏览器中观看它。

87 

88对于 GitHub 拉取请求上的自动审查,[Code Review](/zh-CN/code-review) 直接与您的存储库集成,并将发现作为内联 PR 注释发布,无需 CLI 步骤。

89 

90## Ultrareview 与 /review 的比较

91 

92两个命令都审查代码,但它们针对工作流的不同阶段。

93 

94| | `/review` | `/ultrareview` |

95| ---- | ---------- | -------------------------------- |

96| 运行位置 | 在您的会话中本地运行 | 在云沙箱中远程运行 |

97| 深度 | 单次审查 | 具有独立验证的多代理队列 |

98| 持续时间 | 几秒到几分钟 | 大约 5 到 10 分钟 |

99| 成本 | 计入正常使用量 | 免费运行,然后大约 \$5 到 \$20 每次审查作为额外使用量 |

100| 最适合 | 迭代时的快速反馈 | 合并前对重大更改的信心 |

101 

102使用 `/review` 在工作时获得快速反馈。在合并重大更改前使用 `/ultrareview`,当您想要更深入的审查来捕捉单次审查可能遗漏的问题时。

103 

104## 相关资源

105 

106* [Claude Code 网络版](/zh-CN/claude-code-on-the-web):了解远程会话和云沙箱如何工作

107* [使用 ultraplan 规划复杂更改](/zh-CN/ultraplan):ultrareview 的规划对应物,用于前期设计工作

108* [有效管理成本](/zh-CN/costs):跟踪使用情况并设置支出限制

voice-dictation.md +191 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 语音听写

6 

7> 在 Claude Code CLI 中使用按住录音或点击录音的语音听写功能来说出你的提示词。

8 

9在 Claude Code CLI 中说出你的提示词,而不是输入它们。你的语音会实时转录到提示词输入中,所以你可以在同一条消息中混合使用语音和输入。使用 `/voice` 启用听写,然后要么在说话时按住一个键,要么点击一次开始,再点击一次发送。

10 

11<Note>

12 语音听写需要 Claude Code v2.1.69 或更高版本。点击模式需要 v2.1.116 或更高版本。使用 `claude --version` 检查你的版本。

13</Note>

14 

15## 要求

16 

17语音听写将你录制的音频流传输到 Anthropic 的服务器进行转录。音频不在本地处理。语音转文本服务仅在你使用 Claude.ai 账户进行身份验证时可用,当 Claude Code 配置为直接使用 Anthropic API 密钥、Amazon Bedrock、Google Vertex AI 或 Microsoft Foundry 时不可用。转录不消耗 Claude 消息或令牌,也不计入 `/usage` 中显示的限制。有关 Anthropic 如何处理你的数据,请参阅[数据使用](/zh-CN/data-usage)。

18 

19语音听写还需要本地麦克风访问权限,因此在远程环境中不起作用,例如[网络上的 Claude Code](/zh-CN/claude-code-on-the-web) 或 SSH 会话。在 WSL 中,语音听写需要 WSLg 来访问音频,这包含在 Windows 11 上的 WSL2 中。在 Windows 10 或 WSL1 上,改为在本机 Windows 中运行 Claude Code。

20 

21音频录制在 macOS、Linux 和 Windows 上使用内置的本机模块。在 Linux 上,如果本机模块无法加载,Claude Code 会回退到 ALSA utils 中的 `arecord` 或 SoX 中的 `rec`。如果两者都不可用,`/voice` 会打印你的包管理器的安装命令。

22 

23Claude Code [VS Code 扩展](/zh-CN/vs-code)也支持语音听写,具有相同的 Claude.ai 账户要求。它在 VS Code Remote 会话中不可用,包括 SSH、Dev Containers 和 Codespaces,因为麦克风在你的本地机器上,而扩展在远程主机上运行。

24 

25## 启用语音听写

26 

27运行 `/voice` 启用听写。第一次启用时,Claude Code 会运行麦克风检查。在 macOS 上,这会触发系统麦克风权限提示,如果之前从未授予过权限。

28 

29```

30/voice

31Voice mode enabled (hold). Hold Space to record. Dictation language: en (/config to change).

32```

33 

34`/voice` 接受一个可选的模式参数:

35 

36| 命令 | 效果 |

37| :------------ | :---------------------------------- |

38| `/voice` | 切换开或关,保持当前模式 |

39| `/voice hold` | 在[按住模式](#hold-to-record)中启用 |

40| `/voice tap` | 在[点击模式](#tap-to-record-and-send)中启用 |

41| `/voice off` | 禁用 |

42 

43语音听写在会话之间持续。直接在你的[用户设置文件](/zh-CN/settings)中设置它,而不是运行 `/voice`:

44 

45```json theme={null}

46{

47 "voice": {

48 "enabled": true,

49 "mode": "tap"

50 }

51}

52```

53 

54启用语音听写时,当提示词为空时,输入页脚会显示 `hold Space to speak` 提示。提示文本在两种模式中都相同,如果你配置了[自定义状态行](/zh-CN/statusline),则不会显示。

55 

56转录在两种模式中都针对编码词汇进行了调整。常见的开发术语如 `regex`、`OAuth`、`JSON` 和 `localhost` 被正确识别,你当前的项目名称和 git 分支名称会自动添加为识别提示。

57 

58## 按住录音

59 

60按住模式是按键通话:当你按住键时录制运行,释放时停止。这是默认模式。

61 

62按住 `Space` 开始录制。Claude Code 通过监视来自你的终端的快速按键重复事件来检测按住的键,因此在录制开始之前有一个简短的预热。页脚在预热期间显示 `keep holding…`,然后在录制激活后切换到实时波形。

63 

64前几个按键重复字符在预热期间输入到输入中,当录制激活时会自动删除。单个 `Space` 点击仍然会输入一个空格,因为按住检测仅在快速重复时触发。

65 

66<Tip>

67 要跳过预热,使用 `/voice tap` 切换到[点击模式](#tap-to-record-and-send),或[重新绑定到修饰符组合](#rebind-the-dictation-key),如 `meta+k`。修饰符组合在第一次按键时开始录制。

68</Tip>

69 

70你的语音在你说话时出现在提示词中,在转录最终确定之前会变暗。释放 `Space` 停止录制并最终确定文本。转录被插入到你的光标位置,光标保持在插入文本的末尾,所以你可以以任何顺序混合输入和听写。再次按住 `Space` 追加另一个录制,或先移动光标以在提示词中的其他地方插入语音:

71 

72```

73> refactor the auth middleware to ▮

74 # hold Space, speak "use the new token validation helper"

75> refactor the auth middleware to use the new token validation helper▮

76```

77 

78默认情况下,释放键会插入转录并等待你按 `Enter`。在 `voice` 设置对象中设置 `"autoSubmit": true` 以在释放键时自动发送提示词,只要转录至少有三个单词。

79 

80## 点击录音并发送

81 

82点击模式使用单个按键切换录制:点击一次开始,说话,然后再点击一次发送提示词。没有预热,你不需要保持键被按住。

83 

84使用 `/voice tap` 启用点击模式。当提示词输入为空时,点击 `Space` 开始录制。页脚在录制时显示实时波形。再次点击 `Space` 停止。Claude Code 插入转录并在转录至少有三个单词时自动提交提示词。较短的转录被插入但不提交,所以意外点击不会发送一个杂散的单词。

85 

86第一次点击仅在提示词输入为空时开始录制,所以你仍然可以在撰写消息时正常输入空格。第二次点击停止录制,无论输入内容如何。录制也会在 15 秒无声或总共两分钟后自动停止。

87 

88## 更改听写语言

89 

90语音听写使用与控制 Claude 响应语言相同的[`language` 设置](/zh-CN/settings)。如果该设置为空,听写默认为英语。在 VS Code 扩展中,如果 `language` 为空,听写在默认为英语之前使用 VS Code 的 `accessibility.voice.speechLanguage` 设置。

91 

92<Accordion title="支持的听写语言">

93 | 语言 | 代码 |

94 | :----- | :--- |

95 | 捷克语 | `cs` |

96 | 丹麦语 | `da` |

97 | 荷兰语 | `nl` |

98 | 英语 | `en` |

99 | 法语 | `fr` |

100 | 德语 | `de` |

101 | 希腊语 | `el` |

102 | 印地语 | `hi` |

103 | 印度尼西亚语 | `id` |

104 | 意大利语 | `it` |

105 | 日语 | `ja` |

106 | 韩语 | `ko` |

107 | 挪威语 | `no` |

108 | 波兰语 | `pl` |

109 | 葡萄牙语 | `pt` |

110 | 俄语 | `ru` |

111 | 西班牙语 | `es` |

112 | 瑞典语 | `sv` |

113 | 土耳其语 | `tr` |

114 | 乌克兰语 | `uk` |

115</Accordion>

116 

117在 `/config` 中或直接在设置中设置语言。你可以使用 [BCP 47 语言代码](https://en.wikipedia.org/wiki/IETF_language_tag)或语言名称:

118 

119```json theme={null}

120{

121 "language": "japanese"

122}

123```

124 

125如果你的 `language` 设置不在支持的列表中,`/voice` 在启用时会警告你,并为听写回退到英语。Claude 的文本响应不受此回退的影响。

126 

127## 重新绑定听写键

128 

129听写键在 `Chat` 上下文中绑定到 `voice:pushToTalk`,默认为 `Space`。相同的绑定控制按住和点击模式。在 [`~/.claude/keybindings.json`](/zh-CN/keybindings) 中重新绑定它:

130 

131```json theme={null}

132{

133 "bindings": [

134 {

135 "context": "Chat",

136 "bindings": {

137 "meta+k": "voice:pushToTalk",

138 "space": null

139 }

140 }

141 ]

142}

143```

144 

145设置 `"space": null` 移除默认绑定。如果你想要两个键都活跃,则省略它。

146 

147在按住模式中,避免绑定裸字母键如 `v`,因为按住检测依赖于按键重复,字母在预热期间输入到提示词中。使用 `Space`,或使用修饰符组合如 `meta+k` 在第一次按键时开始录制,无需预热。点击模式没有预热,所以大多数键都可以。

148 

149某些键不会传递到终端应用程序,根本无法绑定。例如,如果你尝试绑定 `Caps Lock`,会显示错误。有关完整的快捷键语法和保留快捷键列表,请参阅[自定义键盘快捷键](/zh-CN/keybindings)。

150 

151## 故障排除

152 

153语音听写不激活或不录制时的常见问题:

154 

155* **`Voice mode requires a Claude.ai account`**:你使用 API 密钥或第三方提供商进行了身份验证。运行 `/login` 以使用 Claude.ai 账户登录。

156* **`Microphone access is denied`**:在系统设置中授予你的终端麦克风权限。在 macOS 上,转到系统设置 → 隐私和安全 → 麦克风并启用你的终端应用,然后再次运行 `/voice`。在 Windows 上,转到设置 → 隐私和安全 → 麦克风并为桌面应用打开麦克风访问,然后再次运行 `/voice`。如果你的终端未在 macOS 设置中列出,请参阅[终端未在 macOS 麦克风设置中列出](#terminal-not-listed-in-macos-microphone-settings)。

157* **Linux 上的 `No audio recording tool found`**:本机音频模块无法加载,没有安装回退。使用错误消息中显示的命令安装 SoX,例如 `sudo apt-get install sox`。

158* **在按住模式中按住 `Space` 时没有任何反应**:在按住时观察提示词输入。如果空格不断累积,语音听写可能已关闭;运行 `/voice hold` 启用它。如果只出现一两个空格然后没有任何反应,语音听写已打开但按住检测未触发。按住检测需要你的终端发送按键重复事件,所以如果在操作系统级别禁用了按键重复,它无法检测按住的键。使用 `/voice tap` 切换到点击模式以避免按键重复要求。

159* **在点击模式中点击 `Space` 输入空格而不是录制**:第一次点击仅在提示词输入为空时开始录制。先清除输入,或通过运行 `/voice tap` 检查你是否处于点击模式。

160* **`No audio detected from microphone`**:录制开始但捕获了静音。确认正确的输入设备设置为系统默认值,其输入级别未静音或接近零。在 Windows 上,打开设置 → 系统 → 声音 → 输入并选择你的麦克风。在 macOS 上,打开系统设置 → 声音 → 输入。

161* **`No speech detected`**:音频到达转录服务但未识别任何单词。靠近麦克风说话,减少背景噪音,并确认你的[听写语言](#change-the-dictation-language)与你说话的语言匹配。

162* **转录是乱码或使用了错误的语言**:听写默认为英语。如果你用另一种语言听写,请先在 `/config` 中设置它。请参阅[更改听写语言](#change-the-dictation-language)。

163 

164### 终端未在 macOS 麦克风设置中列出

165 

166如果你的终端应用未出现在系统设置 → 隐私和安全 → 麦克风下,则没有你可以启用的切换。重置你的终端的权限状态,以便下一次 `/voice` 运行触发新的 macOS 权限提示。

167 

168<Steps>

169 <Step title="重置你的终端的麦克风权限">

170 运行 `tccutil reset Microphone <bundle-id>`,将 `<bundle-id>` 替换为你的终端的标识符:内置终端为 `com.apple.Terminal`,或 iTerm2 为 `com.googlecode.iterm2`。对于其他终端,使用 `osascript -e 'id of app "AppName"'` 查找标识符。

171 

172 <Warning>

173 你可以运行 `tccutil reset Microphone` 而不带 bundle ID,但这会撤销 Mac 上每个应用的麦克风访问权限,包括 Zoom 或 Slack 等应用。每个应用在下次使用时都需要重新请求访问权限,所以不要在活跃通话期间运行它。

174 </Warning>

175 </Step>

176 

177 <Step title="退出并重新启动你的终端">

178 macOS 不会重新提示已在运行的进程。使用 Cmd+Q 退出终端应用,而不仅仅是关闭其窗口,然后再次打开它。

179 </Step>

180 

181 <Step title="触发新的提示">

182 启动 Claude Code 并运行 `/voice`。macOS 提示输入麦克风访问权限;允许它。

183 </Step>

184</Steps>

185 

186## 另请参阅

187 

188* [自定义键盘快捷键](/zh-CN/keybindings):重新绑定 `voice:pushToTalk` 和其他 CLI 键盘操作

189* [配置设置](/zh-CN/settings):`voice`、`language` 和其他设置键的完整参考

190* [交互模式](/zh-CN/interactive-mode):键盘快捷键、输入模式和会话控制

191* [命令](/zh-CN/commands):`/voice`、`/config` 和所有其他命令的参考

vs-code.md +511 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 在 VS Code 中使用 Claude Code

6 

7> 安装和配置 VS Code 的 Claude Code 扩展。获得 AI 编码协助,包括内联差异、@-提及、计划审查和快捷键。

8 

9<img src="https://mintcdn.com/claude-code/-YhHHmtSxwr7W8gy/images/vs-code-extension-interface.jpg?fit=max&auto=format&n=-YhHHmtSxwr7W8gy&q=85&s=300652d5678c63905e6b0ea9e50835f8" alt="VS Code 编辑器,右侧打开 Claude Code 扩展面板,显示与 Claude 的对话" width="2500" height="1155" data-path="images/vs-code-extension-interface.jpg" />

10 

11VS Code 扩展为 Claude Code 提供了原生图形界面,直接集成到您的 IDE 中。这是在 VS Code 中使用 Claude Code 的推荐方式。

12 

13使用该扩展,您可以在接受 Claude 的计划之前审查和编辑它们、在进行编辑时自动接受、@-提及具有特定行范围的文件、访问对话历史记录,以及在单独的选项卡或窗口中打开多个对话。

14 

15## 前置条件

16 

17安装前,请确保您拥有:

18 

19* VS Code 1.98.0 或更高版本

20* Anthropic 账户(首次打开扩展时您将登录)。如果您使用第三方提供商(如 Amazon Bedrock 或 Google Vertex AI),请参阅[使用第三方提供商](#use-third-party-providers)。

21 

22<Tip>

23 该扩展包括 CLI(命令行界面),您可以从 VS Code 的集成终端访问它以获得高级功能。有关详细信息,请参阅 [VS Code 扩展与 Claude Code CLI](#vs-code-extension-vs-claude-code-cli)。

24</Tip>

25 

26## 安装扩展

27 

28点击您的 IDE 的链接以直接安装:

29 

30* [为 VS Code 安装](vscode:extension/anthropic.claude-code)

31* [为 Cursor 安装](cursor:extension/anthropic.claude-code)

32 

33或在 VS Code 中,按 `Cmd+Shift+X`(Mac)或 `Ctrl+Shift+X`(Windows/Linux)打开扩展视图,搜索"Claude Code",然后点击**安装**。

34 

35<Note>如果安装后扩展没有出现,请重启 VS Code 或从命令面板运行"Developer: Reload Window"。</Note>

36 

37## 开始使用

38 

39安装后,您可以通过 VS Code 界面开始使用 Claude Code:

40 

41<Steps>

42 <Step title="打开 Claude Code 面板">

43 在整个 VS Code 中,Spark 图标表示 Claude Code:<img src="https://mintcdn.com/claude-code/c5r9_6tjPMzFdDDT/images/vs-code-spark-icon.svg?fit=max&auto=format&n=c5r9_6tjPMzFdDDT&q=85&s=3ca45e00deadec8c8f4b4f807da94505" alt="Spark icon" style={{display: "inline", height: "0.85em", verticalAlign: "middle"}} width="16" height="16" data-path="images/vs-code-spark-icon.svg" />

44 

45 打开 Claude 的最快方式是点击**编辑器工具栏**(编辑器右上角)中的 Spark 图标。该图标仅在您打开文件时出现。

46 

47 <img src="https://mintcdn.com/claude-code/mfM-EyoZGnQv8JTc/images/vs-code-editor-icon.png?fit=max&auto=format&n=mfM-EyoZGnQv8JTc&q=85&s=eb4540325d94664c51776dbbfec4cf02" alt="VS Code 编辑器显示编辑器工具栏中的 Spark 图标" width="2796" height="734" data-path="images/vs-code-editor-icon.png" />

48 

49 打开 Claude Code 的其他方式:

50 

51 * **活动栏**:点击左侧边栏中的 Spark 图标打开会话列表。点击任何会话以将其作为完整编辑器选项卡打开,或开始新的会话。此图标在活动栏中始终可见。

52 * **命令面板**:`Cmd+Shift+P`(Mac)或 `Ctrl+Shift+P`(Windows/Linux),输入"Claude Code",然后选择一个选项,如"在新选项卡中打开"

53 * **状态栏**:点击窗口右下角的\*\*✱ Claude Code\*\*。即使没有打开文件也可以使用。

54 

55 您可以拖动 Claude 面板在 VS Code 中重新定位它。有关详细信息,请参阅[自定义您的工作流](#customize-your-workflow)。

56 </Step>

57 

58 <Step title="登录">

59 首次打开面板时,会出现登录屏幕。点击**登录**并在浏览器中完成授权。

60 

61 如果您稍后看到**未登录 · 请运行 /login**,扩展会自动重新打开登录屏幕。如果它没有出现,请从命令面板使用**Developer: Reload Window**重新加载窗口。

62 

63 如果您在 shell 中设置了 `ANTHROPIC_API_KEY` 但仍然看到登录提示,VS Code 可能没有继承您的 shell 环境。使用 `code .` 从终端启动 VS Code,以便它继承您的环境变量,或改用您的 Claude 账户登录。

64 

65 登录后,会出现**学习 Claude Code** 检查清单。通过点击**显示给我**来完成每一项,或用 X 关闭它。要稍后重新打开它,请在 VS Code 设置中的扩展 → Claude Code 下取消选中**隐藏入门**。

66 </Step>

67 

68 <Step title="发送提示">

69 要求 Claude 帮助您处理代码或文件,无论是解释某些内容的工作原理、调试问题还是进行更改。

70 

71 <Tip>Claude 会自动看到您选择的文本。按 `Option+K`(Mac)/ `Alt+K`(Windows/Linux)也可以在您的提示中插入 @-提及引用(如 `@file.ts#5-10`)。</Tip>

72 

73 以下是询问文件中特定行的示例:

74 

75 <img src="https://mintcdn.com/claude-code/FVYz38sRY-VuoGHA/images/vs-code-send-prompt.png?fit=max&auto=format&n=FVYz38sRY-VuoGHA&q=85&s=ede3ed8d8d5f940e01c5de636d009cfd" alt="VS Code 编辑器,Python 文件中的第 2-3 行被选中,Claude Code 面板显示关于这些行的问题,带有 @-提及引用" width="3288" height="1876" data-path="images/vs-code-send-prompt.png" />

76 </Step>

77 

78 <Step title="审查更改">

79 当 Claude 想要编辑文件时,它会显示原始内容和建议更改的并排比较,然后请求许可。您可以接受、拒绝或告诉 Claude 改为做什么。如果您在接受前直接在差异视图中编辑建议的内容,Claude 会被告知您修改了它,因此它不会假设文件与其原始提案相匹配。

80 

81 <img src="https://mintcdn.com/claude-code/FVYz38sRY-VuoGHA/images/vs-code-edits.png?fit=max&auto=format&n=FVYz38sRY-VuoGHA&q=85&s=e005f9b41c541c5c7c59c082f7c4841c" alt="VS Code 显示 Claude 建议更改的差异,带有权限提示,询问是否进行编辑" width="3292" height="1876" data-path="images/vs-code-edits.png" />

82 </Step>

83</Steps>

84 

85有关您可以使用 Claude Code 做什么的更多想法,请参阅[常见工作流](/zh-CN/common-workflows)。

86 

87<Tip>

88 从命令面板运行"Claude Code: Open Walkthrough"以获得基础知识的引导式教程。

89</Tip>

90 

91## 使用提示框

92 

93提示框支持多个功能:

94 

95* **权限模式**:点击提示框底部的模式指示器以切换模式。在正常模式下,Claude 在每个操作前请求许可。在 Plan mode 中,Claude 描述它将做什么,并在进行更改前等待批准。VS Code 会自动将计划作为完整的 markdown 文档打开,您可以添加内联注释以在 Claude 开始前提供反馈。在自动接受模式下,Claude 进行编辑而不询问。在 VS Code 设置中的 `claudeCode.initialPermissionMode` 下设置默认值。

96* **命令菜单**:点击 `/` 或输入 `/` 以打开命令菜单。选项包括附加文件、切换模型、切换扩展思考、查看计划使用情况(`/usage`)以及启动 [Remote Control](/zh-CN/remote-control) 会话(`/remote-control`)。自定义部分提供对 MCP servers、hooks、memory、permissions 和 plugins 的访问。带有终端图标的项目在集成终端中打开。

97* **上下文指示器**:提示框显示您使用了多少 Claude 的 context window。Claude 在需要时自动压缩,或者您可以手动运行 `/compact`。

98* **扩展思考**:让 Claude 花更多时间推理复杂问题。通过命令菜单(`/`)切换它。Claude 的推理在对话中显示为折叠块:点击一个块来阅读它,或按 `Ctrl+O` 以展开或折叠会话中的每个思考块。有关详细信息,请参阅[扩展思考](/zh-CN/common-workflows#use-extended-thinking-thinking-mode)。

99* **多行输入**:按 `Shift+Enter` 添加新行而不发送。这也适用于问题对话框的"其他"自由文本输入。

100 

101### 引用文件和文件夹

102 

103使用 @-提及为 Claude 提供有关特定文件或文件夹的上下文。当您输入 `@` 后跟文件或文件夹名称时,Claude 会读取该内容,可以回答有关它的问题或对其进行更改。Claude Code 支持模糊匹配,因此您可以输入部分名称来找到您需要的内容:

104 

105```text theme={null}

106> Explain the logic in @auth (fuzzy matches auth.js, AuthService.ts, etc.)

107> What's in @src/components/ (include a trailing slash for folders)

108```

109 

110对于大型 PDF,您可以要求 Claude 读取特定页面而不是整个文件:单个页面、范围(如第 1-10 页)或开放式范围(如第 3 页及以后)。

111 

112当您在编辑器中选择文本时,Claude 可以自动看到您突出显示的代码。提示框页脚显示选择了多少行。按 `Option+K`(Mac)/ `Alt+K`(Windows/Linux)插入带有文件路径和行号的 @-提及(例如 `@app.ts#5-10`)。点击选择指示器以切换 Claude 是否可以看到您突出显示的文本 - 眼睛斜线图标表示选择对 Claude 隐藏。

113 

114您也可以在将文件拖到提示框时按住 `Shift` 以将它们添加为附件。点击任何附件上的 X 以将其从上下文中删除。

115 

116### 恢复过去的对话

117 

118点击 Claude Code 面板顶部的**会话历史**按钮以访问您的对话历史记录。您可以按关键字搜索或按时间浏览(今天、昨天、过去 7 天等)。点击任何对话以使用完整的消息历史记录恢复它。新会话根据您的第一条消息接收 AI 生成的标题。将鼠标悬停在会话上以显示重命名和删除操作:重命名以给它一个描述性标题,或删除以将其从列表中删除。有关恢复会话的更多信息,请参阅[常见工作流](/zh-CN/common-workflows#resume-previous-conversations)。

119 

120### 从 Claude.ai 恢复远程会话

121 

122如果您使用[网络上的 Claude Code](/zh-CN/claude-code-on-the-web),您可以直接在 VS Code 中恢复这些远程会话。这需要使用 **Claude.ai Subscription** 登录,而不是 Anthropic Console。

123 

124<Steps>

125 <Step title="打开会话历史">

126 点击 Claude Code 面板顶部的**会话历史**按钮。

127 </Step>

128 

129 <Step title="选择远程选项卡">

130 对话框显示两个选项卡:本地和远程。点击**远程**以查看来自 claude.ai 的会话。

131 </Step>

132 

133 <Step title="选择要恢复的会话">

134 浏览或搜索您的远程会话。点击任何会话以下载它并在本地继续对话。

135 </Step>

136</Steps>

137 

138<Note>

139 只有使用 GitHub 存储库启动的网络会话才会出现在远程选项卡中。恢复会在本地加载对话历史记录;更改不会同步回 claude.ai。

140</Note>

141 

142## 自定义您的工作流

143 

144一旦您启动并运行,您可以重新定位 Claude 面板、运行多个会话或切换到终端模式。

145 

146### 选择 Claude 的位置

147 

148您可以拖动 Claude 面板在 VS Code 中重新定位它。抓住面板的选项卡或标题栏并将其拖到:

149 

150* **次级边栏**:窗口的右侧。在您编码时保持 Claude 可见。

151* **主边栏**:左侧边栏,带有资源管理器、搜索等图标。

152* **编辑器区域**:将 Claude 作为选项卡打开,与您的文件并排。适用于辅助任务。

153 

154<Tip>

155 为您的主 Claude 会话使用边栏,并为辅助任务打开其他选项卡。Claude 会记住您首选的位置。活动栏会话列表图标与 Claude 面板分开:会话列表在活动栏中始终可见,而 Claude 面板图标仅在面板停靠到左侧边栏时出现在那里。

156</Tip>

157 

158### 运行多个对话

159 

160从命令面板使用**在新选项卡中打开**或**在新窗口中打开**来启动其他对话。每个对话维护自己的历史记录和上下文,允许您并行处理不同的任务。

161 

162使用选项卡时,spark 图标上的小彩色点表示状态:蓝色表示权限请求待处理,橙色表示 Claude 在选项卡隐藏时完成。

163 

164### 切换到终端模式

165 

166默认情况下,扩展打开图形聊天面板。如果您更喜欢 CLI 风格的界面,打开[使用终端设置](vscode://settings/claudeCode.useTerminal)并勾选该框。

167 

168您也可以打开 VS Code 设置(Mac 上为 `Cmd+,` 或 Windows/Linux 上为 `Ctrl+,`),转到扩展 → Claude Code,然后勾选**使用终端**。

169 

170## 管理 plugins

171 

172VS Code 扩展包括用于安装和管理 [plugins](/zh-CN/plugins) 的图形界面。在提示框中输入 `/plugins` 以打开**管理 plugins** 界面。

173 

174### 安装 plugins

175 

176plugin 对话框显示两个选项卡:**Plugins** 和 **Marketplaces**。

177 

178在 Plugins 选项卡中:

179 

180* **已安装的 plugins** 显示在顶部,带有切换开关以启用或禁用它们

181* **可用的 plugins** 来自您配置的 marketplaces,显示在下方

182* 搜索以按名称或描述过滤 plugins

183* 点击任何可用 plugin 上的**安装**

184 

185当您安装 plugin 时,选择安装范围:

186 

187* **为您安装**:在您的所有项目中可用(用户范围)

188* **为此项目安装**:与项目协作者共享(项目范围)

189* **本地安装**:仅适用于您,仅在此存储库中(本地范围)

190 

191### 管理 marketplaces

192 

193切换到 **Marketplaces** 选项卡以添加或删除 plugin 源:

194 

195* 输入 GitHub 存储库、URL 或本地路径以添加新的 marketplace

196* 点击刷新图标以更新 marketplace 的 plugin 列表

197* 点击垃圾桶图标以删除 marketplace

198 

199进行更改后,横幅会提示您重启 Claude Code 以应用更新。

200 

201<Note>

202 VS Code 中的 plugin 管理在幕后使用相同的 CLI 命令。您在扩展中配置的 plugins 和 marketplaces 也可在 CLI 中使用,反之亦然。

203</Note>

204 

205有关 plugin 系统的更多信息,请参阅 [Plugins](/zh-CN/plugins) 和 [Plugin marketplaces](/zh-CN/plugin-marketplaces)。

206 

207## 使用 Chrome 自动化浏览器任务

208 

209将 Claude 连接到您的 Chrome 浏览器以测试网络应用、使用控制台日志进行调试,以及在不离开 VS Code 的情况下自动化浏览器工作流。这需要 [Claude in Chrome extension](https://chromewebstore.google.com/detail/claude/fcoeoabgfenejglbffodgkkbkcdhcgfn) 版本 1.0.36 或更高版本。

210 

211在提示框中输入 `@browser` 后跟您想要 Claude 做的事情:

212 

213```text theme={null}

214@browser go to localhost:3000 and check the console for errors

215```

216 

217您也可以打开附件菜单以选择特定的浏览器工具,如打开新选项卡或读取页面内容。

218 

219Claude 为浏览器任务打开新选项卡并共享您的浏览器登录状态,因此它可以访问您已登录的任何网站。

220 

221有关设置说明、完整的功能列表和故障排除,请参阅[使用 Claude Code 与 Chrome](/zh-CN/chrome)。

222 

223## VS Code 命令和快捷键

224 

225打开命令面板(Mac 上为 `Cmd+Shift+P` 或 Windows/Linux 上为 `Ctrl+Shift+P`)并输入"Claude Code"以查看 Claude Code 扩展的所有可用 VS Code 命令。

226 

227某些快捷键取决于哪个面板"获得焦点"(接收键盘输入)。当您的光标在代码文件中时,编辑器获得焦点。当您的光标在 Claude 的提示框中时,Claude 获得焦点。使用 `Cmd+Esc` / `Ctrl+Esc` 在它们之间切换。

228 

229<Note>

230 这些是用于控制扩展的 VS Code 命令。并非所有内置 Claude Code 命令都在扩展中可用。有关详细信息,请参阅 [VS Code 扩展与 Claude Code CLI](#vs-code-extension-vs-claude-code-cli)。

231</Note>

232 

233| 命令 | 快捷键 | 描述 |

234| --------- | ----------------------------------------------------- | ---------------------------------------------------------------- |

235| 焦点输入 | `Cmd+Esc`(Mac)/ `Ctrl+Esc`(Windows/Linux) | 在编辑器和 Claude 之间切换焦点 |

236| 在边栏中打开 | - | 在左侧边栏中打开 Claude |

237| 在终端中打开 | - | 在终端模式下打开 Claude |

238| 在新选项卡中打开 | `Cmd+Shift+Esc`(Mac)/ `Ctrl+Shift+Esc`(Windows/Linux) | 将新对话作为编辑器选项卡打开 |

239| 在新窗口中打开 | - | 在单独的窗口中打开新对话 |

240| 新对话 | `Cmd+N`(Mac)/ `Ctrl+N`(Windows/Linux) | 开始新对话。需要 Claude 获得焦点且 `enableNewConversationShortcut` 设置为 `true` |

241| 插入 @-提及引用 | `Option+K`(Mac)/ `Alt+K`(Windows/Linux) | 插入对当前文件和选择的引用(需要编辑器获得焦点) |

242| 显示日志 | - | 查看扩展调试日志 |

243| 登出 | - | 登出您的 Anthropic 账户 |

244 

245### 从其他工具启动 VS Code 选项卡

246 

247该扩展在 `vscode://anthropic.claude-code/open` 处注册了一个 URI 处理程序。使用它从您自己的工具中打开新的 Claude Code 选项卡:shell 别名、浏览器书签或任何可以打开 URL 的脚本。如果 VS Code 尚未运行,打开 URL 会首先启动它。如果 VS Code 已在运行,URL 会在当前获得焦点的窗口中打开。

248 

249使用您的操作系统的 URL 打开器调用处理程序。

250 

251<Tabs>

252 <Tab title="macOS">

253 ```bash theme={null}

254 open "vscode://anthropic.claude-code/open"

255 ```

256 </Tab>

257 

258 <Tab title="Linux">

259 ```bash theme={null}

260 xdg-open "vscode://anthropic.claude-code/open"

261 ```

262 </Tab>

263 

264 <Tab title="Windows">

265 在 PowerShell 中:

266 

267 ```powershell theme={null}

268 Start-Process "vscode://anthropic.claude-code/open"

269 ```

270 

271 在 `cmd.exe` 中,`start` 将其第一个带引号的参数视为窗口标题,因此在 URL 之前传递一个空标题:

272 

273 ```cmd theme={null}

274 start "" "vscode://anthropic.claude-code/open"

275 ```

276 </Tab>

277</Tabs>

278 

279处理程序接受两个可选的查询参数:

280 

281| 参数 | 描述 |

282| --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |

283| `prompt` | 要在提示框中预填充的文本。必须进行 URL 编码。提示框被预填充但不会自动提交。 |

284| `session` | 要恢复的会话 ID,而不是启动新对话。会话必须属于 VS Code 中当前打开的工作区。如果找不到会话,将启动新的对话。如果会话已在选项卡中打开,该选项卡将获得焦点。要以编程方式捕获会话 ID,请参阅 [继续对话](/zh-CN/headless#continue-conversations)。 |

285 

286例如,要打开一个预填充"review my changes"的选项卡:

287 

288```text theme={null}

289vscode://anthropic.claude-code/open?prompt=review%20my%20changes

290```

291 

292要启动终端会话而不是 VS Code 选项卡,请使用 CLI 的 `claude-cli://` 处理程序。请参阅 [从链接启动会话](/zh-CN/deep-links)。

293 

294## 配置设置

295 

296扩展有两种类型的设置:

297 

298* **扩展设置**在 VS Code 中:控制扩展在 VS Code 中的行为。使用 `Cmd+,`(Mac)或 `Ctrl+,`(Windows/Linux)打开,然后转到扩展 → Claude Code。您也可以输入 `/` 并选择**常规配置**以打开设置。

299* **Claude Code 设置**在 `~/.claude/settings.json` 中:在扩展和 CLI 之间共享。用于允许的命令、环境变量、hooks 和 MCP servers。有关详细信息,请参阅[设置](/zh-CN/settings)。

300 

301<Tip>

302 将 `"$schema": "https://json.schemastore.org/claude-code-settings.json"` 添加到您的 `settings.json` 以在 VS Code 中直接获得所有可用设置的自动完成和内联验证。

303</Tip>

304 

305### 扩展设置

306 

307| 设置 | 默认值 | 描述 |

308| --------------------------------- | --------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

309| `useTerminal` | `false` | 以终端模式而不是图形面板启动 Claude |

310| `initialPermissionMode` | `default` | 控制新对话的批准提示:`default`、`plan`、`acceptEdits` 或 `bypassPermissions`。请参阅[权限模式](/zh-CN/permission-modes)。 |

311| `preferredLocation` | `panel` | Claude 打开的位置:`sidebar`(右侧)或 `panel`(新选项卡) |

312| `autosave` | `true` | 在 Claude 读取或写入文件前自动保存文件 |

313| `useCtrlEnterToSend` | `false` | 使用 Ctrl/Cmd+Enter 而不是 Enter 发送提示 |

314| `enableNewConversationShortcut` | `false` | 启用 Cmd/Ctrl+N 以开始新对话 |

315| `hideOnboarding` | `false` | 隐藏入门检查清单(毕业帽图标) |

316| `respectGitIgnore` | `true` | 从文件搜索中排除 .gitignore 模式 |

317| `usePythonEnvironment` | `true` | 运行 Claude 时激活工作区的 Python 环境。需要 Python 扩展。 |

318| `environmentVariables` | `[]` | 为 Claude 进程设置环境变量。对于共享配置,请改用 Claude Code 设置。 |

319| `disableLoginPrompt` | `false` | 跳过身份验证提示(用于第三方提供商设置) |

320| `allowDangerouslySkipPermissions` | `false` | 添加 [Auto mode](/zh-CN/permission-modes#eliminate-prompts-with-auto-mode) 和 Bypass permissions 到模式选择器。Auto mode 有[计划、管理员、模型和提供商要求](/zh-CN/permission-modes#eliminate-prompts-with-auto-mode),因此即使此切换打开,该选项也可能保持不可用。仅在没有互联网访问的沙箱中使用 Bypass permissions。 |

321| `claudeProcessWrapper` | - | 用于启动 Claude 进程的可执行文件路径 |

322 

323## VS Code 扩展与 Claude Code CLI

324 

325Claude Code 既可作为 VS Code 扩展(图形面板)也可作为 CLI(终端中的命令行界面)使用。某些功能仅在 CLI 中可用。如果您需要仅限 CLI 的功能,请在 VS Code 的集成终端中运行 `claude`。

326 

327| 功能 | CLI | VS Code 扩展 |

328| ------------- | --------------------- | ---------------------------------------- |

329| 命令和 skills | [全部](/zh-CN/commands) | 子集(输入 `/` 以查看可用的) |

330| MCP server 配置 | 是 | 部分(通过 CLI 添加服务器;使用聊天面板中的 `/mcp` 管理现有服务器) |

331| Checkpoints | 是 | 是 |

332| `!` bash 快捷键 | 是 | 否 |

333| Tab 完成 | 是 | 否 |

334 

335### 使用 checkpoints 进行倒带

336 

337VS Code 扩展支持 checkpoints,它们跟踪 Claude 的文件编辑并让您倒带到之前的状态。将鼠标悬停在任何消息上以显示倒带按钮,然后从三个选项中选择:

338 

339* **从此处分叉对话**:从此消息开始新的对话分支,同时保持所有代码更改完整

340* **将代码倒带到此处**:将文件更改恢复到对话中的此点,同时保持完整的对话历史记录

341* **分叉对话并倒带代码**:开始新的对话分支并将文件更改恢复到此点

342 

343有关 checkpoints 如何工作及其限制的完整详细信息,请参阅 [Checkpointing](/zh-CN/checkpointing)。

344 

345### 在 VS Code 中运行 CLI

346 

347要在 VS Code 中使用 CLI,请打开集成终端(Windows/Linux 上为 `` Ctrl+` `` 或 Mac 上为 `` Cmd+` ``)并运行 `claude`。CLI 会自动与您的 IDE 集成,以获得差异查看和诊断共享等功能。

348 

349如果使用外部终端,请在 Claude Code 中运行 `/ide` 以将其连接到 VS Code。

350 

351### 在扩展和 CLI 之间切换

352 

353扩展和 CLI 共享相同的对话历史记录。要在 CLI 中继续扩展对话,请在终端中运行 `claude --resume`。这会打开一个交互式选择器,您可以在其中搜索和选择您的对话。

354 

355### 在提示中包含终端输出

356 

357使用 `@terminal:name` 在您的提示中引用终端输出,其中 `name` 是终端的标题。这让 Claude 可以看到命令输出、错误消息或日志,而无需复制粘贴。

358 

359### 监控后台进程

360 

361当 Claude 运行长时间运行的命令时,扩展在状态栏中显示进度。但是,与 CLI 相比,后台任务的可见性有限。为了获得更好的可见性,让 Claude 输出命令,以便您可以在 VS Code 的集成终端中运行它。

362 

363### 使用 MCP 连接到外部工具

364 

365MCP(Model Context Protocol)servers 为 Claude 提供对外部工具、数据库和 API 的访问。

366 

367要添加 MCP server,请打开集成终端(`` Ctrl+` `` 或 `` Cmd+` ``)并运行 `claude mcp add`。下面的示例添加了 GitHub 的远程 MCP server,它使用作为标头传递的[个人访问令牌](https://github.com/settings/personal-access-tokens)进行身份验证:

368 

369```bash theme={null}

370claude mcp add --transport http github https://api.githubcopilot.com/mcp/ \

371 --header "Authorization: Bearer YOUR_GITHUB_PAT"

372```

373 

374配置后,要求 Claude 使用这些工具(例如,"审查 PR #456")。

375 

376要在不离开 VS Code 的情况下管理 MCP servers,请在聊天面板中输入 `/mcp`。MCP 管理对话框让您启用或禁用服务器、重新连接到服务器以及管理 OAuth 身份验证。有关可用服务器,请参阅 [MCP 文档](/zh-CN/mcp)。

377 

378## 使用 git

379 

380Claude Code 与 git 集成以帮助直接在 VS Code 中进行版本控制工作流。要求 Claude 提交更改、创建拉取请求或跨分支工作。

381 

382### 创建提交和拉取请求

383 

384Claude 可以暂存更改、编写提交消息并根据您的工作创建拉取请求:

385 

386```text theme={null}

387> commit my changes with a descriptive message

388> create a pr for this feature

389> summarize the changes I've made to the auth module

390```

391 

392创建拉取请求时,Claude 会根据实际代码更改生成描述,并可以添加有关测试或实现决策的上下文。

393 

394### 使用 git worktrees 进行并行任务

395 

396使用 `--worktree`(`-w`)标志在隔离的 worktree 中启动 Claude,该 worktree 具有自己的文件和分支:

397 

398```bash theme={null}

399claude --worktree feature-auth

400```

401 

402每个 worktree 维护独立的文件状态,同时共享 git 历史记录。这可以防止 Claude 实例在处理不同任务时相互干扰。有关更多详细信息,请参阅[使用 Git worktrees 运行并行 Claude Code 会话](/zh-CN/common-workflows#run-parallel-claude-code-sessions-with-git-worktrees)。

403 

404## 使用第三方提供商

405 

406默认情况下,Claude Code 直接连接到 Anthropic 的 API。如果您的组织使用 Amazon Bedrock、Google Vertex AI 或 Microsoft Foundry 来访问 Claude,请配置扩展以改用您的提供商:

407 

408<Steps>

409 <Step title="禁用登录提示">

410 打开[禁用登录提示设置](vscode://settings/claudeCode.disableLoginPrompt)并勾选该框。

411 

412 您也可以打开 VS Code 设置(Mac 上为 `Cmd+,` 或 Windows/Linux 上为 `Ctrl+,`),搜索"Claude Code login",然后勾选**禁用登录提示**。

413 </Step>

414 

415 <Step title="配置您的提供商">

416 按照您的提供商的设置指南:

417 

418 * [Amazon Bedrock 上的 Claude Code](/zh-CN/amazon-bedrock)

419 * [Google Vertex AI 上的 Claude Code](/zh-CN/google-vertex-ai)

420 * [Microsoft Foundry 上的 Claude Code](/zh-CN/microsoft-foundry)

421 

422 这些指南涵盖在 `~/.claude/settings.json` 中配置您的提供商,这确保您的设置在 VS Code 扩展和 CLI 之间共享。

423 </Step>

424</Steps>

425 

426## 安全和隐私

427 

428您的代码保持私密。Claude Code 处理您的代码以提供协助,但不使用它来训练模型。有关数据处理的详细信息以及如何选择退出日志记录,请参阅[数据和隐私](/zh-CN/data-usage)。

429 

430启用自动编辑权限后,Claude Code 可以修改 VS Code 配置文件(如 `settings.json` 或 `tasks.json`),VS Code 可能会自动执行。要在处理不受信任的代码时降低风险:

431 

432* 为不受信任的工作区启用 [VS Code 受限模式](https://code.visualstudio.com/docs/editor/workspace-trust#_restricted-mode)

433* 使用手动批准模式而不是自动接受编辑

434* 在接受更改前仔细审查它们

435 

436### 内置 IDE MCP server

437 

438当扩展处于活动状态时,它运行一个本地 MCP server,CLI 会自动连接到该服务器。这是 CLI 如何在 VS Code 的原生差异查看器中打开差异、读取您当前的 @-提及选择,以及 — 当您在 Jupyter notebook 中工作时 — 要求 VS Code 执行单元格的方式。

439 

440该服务器名为 `ide`,从 `/mcp` 中隐藏,因为没有什么可配置的。但是,如果您的组织使用 `PreToolUse` hook 来允许列表 MCP 工具,您需要知道它存在。

441 

442**传输和身份验证。** 该服务器绑定到 `127.0.0.1` 上的随机高端口,无法从其他机器访问。每次扩展激活都会生成一个新的随机身份验证令牌,CLI 必须提供该令牌才能连接。该令牌被写入 `~/.claude/ide/` 下的锁定文件,权限为 `0600`,在 `0700` 目录中,因此只有运行 VS Code 的用户可以读取它。

443 

444**暴露给模型的工具。** 该服务器托管十几个工具,但只有两个对模型可见。其余的是 CLI 用于自己的 UI 的内部 RPC — 打开差异、读取选择、保存文件 — 并在工具列表到达 Claude 之前被过滤掉。

445 

446| 工具名称(如 hooks 所见) | 它的作用 | 写入? |

447| -------------------------- | ------------------------------------------------- | --- |

448| `mcp__ide__getDiagnostics` | 返回语言服务器诊断 — VS Code 问题面板中的错误和警告。可选地限定到一个文件。 | 否 |

449| `mcp__ide__executeCode` | 在活动 Jupyter notebook 的内核中运行 Python 代码。请参阅下面的确认流程。 | 是 |

450 

451**Jupyter 执行总是先询问。** `mcp__ide__executeCode` 无法静默运行任何内容。在每次调用时,代码被插入为活动 notebook 末尾的新单元格,VS Code 将其滚动到视图中,本地 Quick Pick 要求您**执行**或**取消**。取消 — 或用 `Esc` 关闭选择器 — 向 Claude 返回错误,什么都不运行。当没有活动 notebook、Jupyter 扩展(`ms-toolsai.jupyter`)未安装或内核不是 Python 时,该工具也会直接拒绝。

452 

453<Note>

454 Quick Pick 确认与 `PreToolUse` hooks 分开。`mcp__ide__executeCode` 的允许列表条目让 Claude *提议*运行单元格;VS Code 内的 Quick Pick 是让它*实际*运行的原因。

455</Note>

456 

457<a id="troubleshooting" />

458 

459## 修复常见问题

460 

461### 扩展无法安装

462 

463* 确保您拥有兼容的 VS Code 版本(1.98.0 或更高版本)

464* 检查 VS Code 是否有权安装扩展

465* 尝试从 [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=anthropic.claude-code) 直接安装

466 

467### Spark 图标不可见

468 

469Spark 图标在**编辑器工具栏**(编辑器右上角)中出现,当您打开文件时。如果您看不到它:

470 

4711. **打开文件**:该图标需要打开文件。仅打开文件夹是不够的。

4722. **检查 VS Code 版本**:需要 1.98.0 或更高版本(帮助 → 关于)

4733. **重启 VS Code**:从命令面板运行"Developer: Reload Window"

4744. **禁用冲突的扩展**:临时禁用其他 AI 扩展(Cline、Continue 等)

4755. **检查工作区信任**:扩展在受限模式下不工作

476 

477或者,点击**状态栏**(右下角)中的"✱ Claude Code"。即使没有打开文件也可以使用。您也可以使用**命令面板**(`Cmd+Shift+P` / `Ctrl+Shift+P`)并输入"Claude Code"。

478 

479### Claude Code 从不响应

480 

481如果 Claude Code 没有响应您的提示:

482 

4831. **检查您的互联网连接**:确保您有稳定的互联网连接

4842. **开始新对话**:尝试开始新的对话以查看问题是否仍然存在

4853. **尝试 CLI**:从终端运行 `claude` 以查看是否获得更详细的错误消息

486 

487如果问题仍然存在,请[在 GitHub 上提交问题](https://github.com/anthropics/claude-code/issues),并提供有关错误的详细信息。

488 

489## 卸载扩展

490 

491要卸载 Claude Code 扩展:

492 

4931. 打开扩展视图(Mac 上为 `Cmd+Shift+X` 或 Windows/Linux 上为 `Ctrl+Shift+X`)

4942. 搜索"Claude Code"

4953. 点击**卸载**

496 

497要也删除扩展数据并重置所有设置:

498 

499```bash theme={null}

500rm -rf ~/.vscode/globalStorage/anthropic.claude-code

501```

502 

503如需更多帮助,请参阅[故障排除指南](/zh-CN/troubleshooting)。

504 

505## 后续步骤

506 

507现在您已在 VS Code 中设置了 Claude Code:

508 

509* [探索常见工作流](/zh-CN/common-workflows)以充分利用 Claude Code

510* [设置 MCP servers](/zh-CN/mcp)以使用外部工具扩展 Claude 的功能。使用 CLI 添加服务器,然后使用聊天面板中的 `/mcp` 管理它们。

511* [配置 Claude Code 设置](/zh-CN/settings)以自定义允许的命令、hooks 等。这些设置在扩展和 CLI 之间共享。

web-quickstart.md +220 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 在网络上开始使用 Claude Code

6 

7> 从浏览器或手机在云中运行 Claude Code。连接 GitHub 仓库、提交任务,并在无需本地设置的情况下审查 PR。

8 

9<Note>

10 Claude Code on the web 处于研究预览阶段,适用于 Pro、Max 和 Team 用户,以及拥有高级席位或 Chat + Claude Code 席位的企业用户。

11</Note>

12 

13Claude Code on the web 在 Anthropic 管理的云基础设施上运行,而不是在您的机器上。从浏览器中的 [claude.ai/code](https://claude.ai/code) 或 Claude 移动应用提交任务。

14 

15您需要一个 GitHub 仓库来[开始使用](#connect-github-and-create-an-environment)。Claude 将其克隆到隔离的虚拟机中,进行更改,并为您推送一个分支以供审查。会话在设备间持久化,因此您在笔记本电脑上开始的任务稍后可以从手机上审查。

16 

17Claude Code on the web 适用于:

18 

19* **并行任务**:同时运行多个独立任务,每个任务在自己的会话和分支中,无需管理多个 worktrees

20* **您本地没有的仓库**:Claude 在每个会话中新鲜克隆仓库,因此您无需检出它

21* **不需要频繁指导的任务**:提交一个定义明确的任务,做其他事情,当 Claude 完成时审查结果

22* **代码问题和探索**:理解代码库或追踪功能如何实现,无需本地检出

23 

24对于需要您的本地配置、工具或环境的工作,在本地运行 Claude Code 或使用 [Remote Control](/zh-CN/remote-control) 更合适。

25 

26## 会话如何运行

27 

28当您提交任务时:

29 

301. **克隆和准备**:您的仓库被克隆到 Anthropic 管理的 VM,如果配置了,您的[设置脚本](/zh-CN/claude-code-on-the-web#setup-scripts)会运行。

312. **配置网络**:互联网访问根据您的环境的[访问级别](/zh-CN/claude-code-on-the-web#access-levels)设置。

323. **工作**:Claude 分析代码、进行更改、运行测试并检查其工作。您可以全程观看和指导,或者离开,当完成时返回。

334. **推送分支**:当 Claude 到达停止点时,它将其分支推送到 GitHub。您审查差异、留下内联注释、创建 PR 或发送另一条消息以继续。

34 

35推送分支时会话不会关闭。PR 创建和进一步编辑都在同一对话中进行。

36 

37## 比较运行 Claude Code 的方式

38 

39Claude Code 在任何地方的行为都相同。改变的是代码执行的位置以及您的本地配置是否可用。Desktop 应用提供本地和云会话,因此其下面的答案取决于您选择的是哪一个:

40 

41| | On the web | Remote Control | Terminal CLI | Desktop app |

42| :---------------------------------- | :---------------------------------------------------------------------------------------------- | :-------------- | :----------- | :---------- |

43| **代码运行在** | Anthropic 云 VM | 您的机器 | 您的机器 | 您的机器或云 VM |

44| **您从以下位置聊天** | claude.ai 或移动应用 | claude.ai 或移动应用 | 您的终端 | Desktop UI |

45| **使用您的本地配置** | 否,仅限仓库 | 是 | 是 | 本地为是,云为否 |

46| **需要 GitHub** | 是,或通过 `--remote` [捆绑本地仓库](/zh-CN/claude-code-on-the-web#send-local-repositories-without-github) | 否 | 否 | 仅限云会话 |

47| **断开连接时继续运行** | 是 | 当终端保持打开时 | 否 | 取决于会话类型 |

48| **[权限模式](/zh-CN/permission-modes)** | 自动接受编辑、Plan | 询问、自动接受编辑、Plan | 所有模式 | 取决于会话类型 |

49| **网络访问** | 每个环境可配置 | 您的机器网络 | 您的机器网络 | 取决于会话类型 |

50 

51请参阅[终端快速入门](/zh-CN/quickstart)、[Desktop 应用](/zh-CN/desktop)或 [Remote Control](/zh-CN/remote-control) 文档来设置这些。

52 

53## 连接 GitHub 并创建环境

54 

55设置是一次性过程。如果您已经使用 GitHub CLI,您可以[从您的终端执行此操作](#connect-from-your-terminal)而不是浏览器。

56 

57<Steps>

58 <Step title="访问 claude.ai/code">

59 转到 [claude.ai/code](https://claude.ai/code) 并使用您的 Anthropic 账户登录。

60 </Step>

61 

62 <Step title="安装 Claude GitHub App">

63 登录后,claude.ai/code 会提示您连接 GitHub。按照提示安装 Claude GitHub App 并授予其访问您的仓库的权限。云会话适用于现有的 GitHub 仓库,因此要启动新项目,请先[在 GitHub 上创建一个空仓库](https://github.com/new)。

64 </Step>

65 

66 <Step title="创建您的环境">

67 连接 GitHub 后,系统会提示您创建云环境。环境控制 Claude 在会话期间可以访问的网络以及创建新会话时运行的内容。请参阅[已安装的工具](/zh-CN/claude-code-on-the-web#installed-tools)了解无需任何配置即可使用的内容。

68 

69 表单有以下字段:

70 

71 * **Name**:显示标签。当您为不同的项目或访问级别有多个环境时很有用。

72 * **Network access**:控制会话可以在互联网上访问的内容。默认值 `Trusted` 允许连接到[常见包注册表](/zh-CN/claude-code-on-the-web#default-allowed-domains),如 npm、PyPI 和 RubyGems,同时阻止一般互联网访问。

73 * **Environment variables**:可选变量,在每个会话中可用,采用 `.env` 格式。不要用引号包装值,因为引号会作为值的一部分存储。这些对任何可以编辑此环境的人都可见。

74 * **Setup script**:可选的 Bash 脚本,在 Claude Code 启动前运行。使用它来安装云 VM 不包含的系统工具,如 `apt install -y gh`。结果被[缓存](/zh-CN/claude-code-on-the-web#environment-caching),因此脚本不会在每个会话上重新运行。请参阅[设置脚本](/zh-CN/claude-code-on-the-web#setup-scripts)了解示例和调试提示。

75 

76 对于第一个项目,保留默认值并单击**Create environment**。您可以[稍后编辑它或为不同的项目创建其他环境](/zh-CN/claude-code-on-the-web#configure-your-environment)。

77 </Step>

78</Steps>

79 

80### 从您的终端连接

81 

82如果您已经使用 GitHub CLI (`gh`),您可以在不打开浏览器的情况下设置 Claude Code on the web。这需要 [Claude Code CLI](/zh-CN/quickstart)。`/web-setup` 读取您的本地 `gh` 令牌,将其链接到您的 Claude 账户,如果您没有云环境,则创建一个默认的云环境。

83 

84<Note>

85 启用了[零数据保留](/zh-CN/zero-data-retention)的组织无法使用 `/web-setup` 或其他云会话功能。如果未安装或验证 GitHub CLI,`/web-setup` 会打开浏览器入门流程。

86</Note>

87 

88<Steps>

89 <Step title="使用 GitHub CLI 进行身份验证">

90 在您的 shell 中,如果您还没有进行身份验证,请对 GitHub CLI 进行身份验证:

91 

92 ```bash theme={null}

93 gh auth login

94 ```

95 </Step>

96 

97 <Step title="登录到 Claude">

98 在 Claude Code CLI 中,运行 `/login` 以使用您的 claude.ai 账户登录。如果您已经登录,请跳过此步骤。

99 </Step>

100 

101 <Step title="运行 /web-setup">

102 在 Claude Code CLI 中,运行:

103 

104 ```text theme={null}

105 /web-setup

106 ```

107 

108 这会将您的 `gh` 令牌同步到您的 Claude 账户。如果您还没有云环境,`/web-setup` 会创建一个具有 Trusted 网络访问和无设置脚本的环境。您可以[稍后编辑环境或添加变量](/zh-CN/claude-code-on-the-web#configure-your-environment)。一旦 `/web-setup` 完成,您可以从您的终端使用 [`--remote`](/zh-CN/claude-code-on-the-web#from-terminal-to-web) 启动云会话,或使用 [`/schedule`](/zh-CN/routines) 设置定期任务。

109 </Step>

110</Steps>

111 

112## 开始任务

113 

114连接了 GitHub 和创建了环境后,您已准备好提交任务。

115 

116<Steps>

117 <Step title="选择仓库和分支">

118 从 [claude.ai/code](https://claude.ai/code) 或 Claude 移动应用中的 Code 选项卡,单击输入框下方的仓库选择器,并为 Claude 选择要在其中工作的仓库。每个仓库都显示一个分支选择器。更改它以从功能分支而不是默认分支启动 Claude。您可以添加多个仓库以在一个会话中跨它们工作。

119 </Step>

120 

121 <Step title="选择权限模式">

122 输入旁边的模式下拉菜单默认为**Auto accept edits**,其中 Claude 进行更改并推送分支而无需停止以获得批准。如果您希望 Claude 提出方法并在编辑文件前等待您的同意,请切换到**Plan mode**。云会话不提供 Ask 权限、Auto 模式或 Bypass 权限。请参阅[权限模式](/zh-CN/permission-modes)了解完整列表。

123 </Step>

124 

125 <Step title="描述任务并提交">

126 输入您想要的内容的描述并按 Enter。要具体:

127 

128 * 命名文件或函数:"Add a README with setup instructions" 或 "Fix the failing auth test in `tests/test_auth.py`" 比 "fix tests" 更好

129 * 如果您有错误输出,请粘贴它

130 * 描述预期行为,而不仅仅是症状

131 

132 Claude 克隆仓库,如果配置了则运行您的设置脚本,并开始工作。每个任务都有自己的会话和自己的分支,因此您无需等待一个完成就可以开始另一个。

133 </Step>

134</Steps>

135 

136## 预填充会话

137 

138您可以通过向 [claude.ai/code](https://claude.ai/code) URL 添加查询参数来预填充新会话的提示、仓库和环境。使用此功能来构建集成,例如问题跟踪器中的按钮,该按钮使用问题描述作为提示打开 Claude Code。

139 

140| 参数 | 描述 |

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

142| `prompt` | 要在输入框中预填充的提示文本。也接受别名 `q`。 |

143| `prompt_url` | 要从中获取提示文本的 URL,用于太长而无法嵌入查询字符串的提示。URL 必须允许跨源请求。当也设置了 `prompt` 时被忽略。 |

144| `repositories` | 要预选的 `owner/repo` 段的逗号分隔列表。也接受别名 `repo`。 |

145| `environment` | [环境](#connect-github-and-create-an-environment)的名称或 ID 以预选。 |

146 

147对每个值进行 URL 编码。下面的示例打开表单,其中已选择提示和仓库:

148 

149```text theme={null}

150https://claude.ai/code?prompt=Fix%20the%20login%20bug&repositories=acme/webapp

151```

152 

153## 审查和迭代

154 

155当 Claude 完成时,审查更改,在特定行上留下反馈,并继续直到差异看起来正确。

156 

157<Steps>

158 <Step title="打开差异视图">

159 差异指示器显示整个会话中添加和删除的行,例如 `+42 -18`。选择它以打开差异视图,左侧是文件列表,右侧是更改。

160 </Step>

161 

162 <Step title="留下内联注释">

163 选择差异中的任何行,输入您的反馈,然后按 Enter。注释排队直到您发送下一条消息,然后它们与其捆绑。Claude 看到"at `src/auth.ts:47`, don't catch the error here"与您的主要指令一起,因此您不必描述问题在哪里。

164 </Step>

165 

166 <Step title="创建拉取请求">

167 当差异看起来正确时,选择差异视图顶部的**Create PR**。您可以将其作为完整 PR、草稿打开,或跳转到 GitHub 的撰写页面,其中包含生成的标题和描述。

168 </Step>

169 

170 <Step title="在 PR 后继续迭代">

171 创建 PR 后会话保持活跃。将 CI 失败输出或审查者注释粘贴到聊天中,并要求 Claude 解决它们。要让 Claude 自动监控 PR,请参阅[自动修复拉取请求](/zh-CN/claude-code-on-the-web#auto-fix-pull-requests)。

172 </Step>

173</Steps>

174 

175## 故障排除设置

176 

177### 连接 GitHub 后没有仓库出现

178 

179Claude GitHub App 需要对您想要使用的每个仓库的显式访问。在 github.com 上,打开**Settings → Applications → Claude → Configure** 并验证您的仓库是否列在**Repository access** 下。私有仓库需要与公共仓库相同的授权。

180 

181### 页面仅显示 GitHub 登录按钮

182 

183云会话需要连接的 GitHub 账户。通过上面的浏览器流程连接,或如果您使用 GitHub CLI,从您的终端运行 `/web-setup`。如果您根本不想连接 GitHub,请参阅 [Remote Control](/zh-CN/remote-control) 以在您自己的机器上运行 Claude Code 并从网络监控它。

184 

185### "Not available for the selected organization"

186 

187企业组织可能需要管理员启用 Claude Code on the web。联系您的 Anthropic 账户团队。

188 

189### `/web-setup` 返回 "Unknown command"

190 

191`/web-setup` 在 Claude Code CLI 内运行,而不是在您的 shell 中。首先启动 `claude`,然后在提示符处输入 `/web-setup`。

192 

193如果您在 Claude Code 内输入它仍然看到错误,您的 CLI 版本早于 v2.1.80,或者您使用 API 密钥或第三方提供商而不是 claude.ai 订阅进行身份验证。运行 `claude update`,然后 `/login` 以使用您的 claude.ai 账户登录。

194 

195### 使用 `--remote` 或 ultraplan 时出现 "Could not create a cloud environment" 或 "No cloud environment available"

196 

197远程会话功能如果您没有云环境,会自动创建一个默认的云环境。如果您看到 "Could not create a cloud environment",自动创建失败。{/* max-version: 2.1.100 */}如果您看到 "No cloud environment available",您的 CLI 早于自动创建。在任何一种情况下,在 Claude Code CLI 中运行 `/web-setup` 以手动创建一个,或访问 [claude.ai/code](https://claude.ai/code) 并按照上面的**Create your environment** 步骤。

198 

199### 设置脚本失败

200 

201设置脚本以非零状态退出,这会阻止会话启动。常见原因:

202 

203* 包安装失败,因为注册表不在您的[网络访问级别](/zh-CN/claude-code-on-the-web#access-levels)中。`Trusted` 涵盖大多数包管理器;`None` 阻止它们全部。

204* 脚本引用在新鲜克隆中不存在的文件或路径。

205* 在本地工作的命令在 Ubuntu 上需要不同的调用。

206 

207要调试,在脚本顶部添加 `set -x` 以查看哪个命令失败。对于非关键命令,附加 `|| true` 以便它们不会阻止会话启动。

208 

209### 关闭选项卡后会话继续运行

210 

211这是设计使然。关闭选项卡或导航离开不会停止会话。它在后台继续运行,直到 Claude 完成当前任务,然后空闲。从侧边栏,您可以[存档会话](/zh-CN/claude-code-on-the-web#archive-sessions)以将其从列表中隐藏,或[删除它](/zh-CN/claude-code-on-the-web#delete-sessions)以永久删除它。

212 

213## 后续步骤

214 

215现在您可以提交和审查任务,这些页面涵盖接下来的内容:从您的终端启动云会话、安排定期工作以及给 Claude 常设指令。

216 

217* [使用 Claude Code on the web](/zh-CN/claude-code-on-the-web):完整参考,包括将会话传送到您的终端、设置脚本、环境变量和网络配置

218* [Routines](/zh-CN/routines):按计划、通过 API 调用或响应 GitHub 事件自动化工作

219* [CLAUDE.md](/zh-CN/memory):给 Claude 持久指令和上下文,在每个会话开始时加载

220* 为 [iOS](https://apps.apple.com/us/app/claude-by-anthropic/id6473753684) 或 [Android](https://play.google.com/store/apps/details?id=com.anthropic.claude) 安装 Claude 移动应用以从您的手机监控会话。从 Claude Code CLI,`/mobile` 显示 QR 码。

whats-new.md +49 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 最新动态

6 

7> Claude Code 功能的每周摘要,包含代码片段、演示和背景信息,说明为什么这些功能很重要。

8 

9每周开发摘要突出了最有可能改变您工作方式的功能。每个条目都包括可运行的代码、简短的演示和完整文档的链接。有关每个错误修复和次要改进,请参阅[更新日志](/zh-CN/changelog)。

10 

11<Update label="Week 17" description="April 20–24, 2026" tags={["v2.1.114–v2.1.119"]}>

12 **`/ultrareview`** 作为公开研究预览版开放:一队错误搜寻代理在云中运行,发现结果会自动返回到您的 CLI 或桌面应用。

13 

14 本周还有:**会话回顾**显示终端失焦时发生的情况;**自定义主题**让您可以从 `/theme` 或插件构建和发布调色板;**Claude Code 网页版**进行了重新设计,包括新的会话侧边栏和拖放布局。

15 

16 [阅读 Week 17 摘要 →](/zh-CN/whats-new/2026-w17)

17</Update>

18 

19<Update label="Week 16" description="April 13–17, 2026" tags={["v2.1.105–v2.1.113"]}>

20 **Claude Opus 4.7** 成为 Max 和 Team Premium 的新默认版本,具有新的 `xhigh` 努力级别(推荐用于大多数编码工作)和交互式 `/effort` 滑块来调整它。

21 

22 本周还有:**Routines** 在 Claude Code 网页版上从计划、GitHub 事件或 API 调用触发模板化云代理;`/ultrareview` 在云中运行并行多代理代码审查;`/usage` 显示驱动您限制的因素;CLI 迁移到本机二进制文件。

23 

24 [阅读 Week 16 摘要 →](/zh-CN/whats-new/2026-w16)

25</Update>

26 

27<Update label="Week 15" description="April 6–10, 2026" tags={["v2.1.92–v2.1.101"]}>

28 **Ultraplan** 进入早期预览:从您的 CLI 在云中草拟计划,在网页编辑器中审查和评论,然后远程运行或拉回本地。第一次运行现在会自动为您创建云环境。

29 

30 本周还有:**Monitor** 工具将后台事件流式传输到对话中,以便 Claude 可以跟踪日志并实时响应,`/loop` 在您省略间隔时自动调整速度,`/team-onboarding` 将您的设置打包成可重放的指南,`/autofix-pr` 从您的终端打开 PR 自动修复。

31 

32 [阅读 Week 15 摘要 →](/zh-CN/whats-new/2026-w15)

33</Update>

34 

35<Update label="Week 14" description="March 30 – April 3, 2026" tags={["v2.1.86–v2.1.91"]}>

36 **计算机使用**在研究预览版中来到 CLI:Claude 可以打开本机应用、点击 UI 并从您的终端验证更改。最适合关闭只有 GUI 才能验证的事情。

37 

38 本周还有:`/powerup` 交互式课程、无闪烁的替代屏幕渲染、每个工具的 MCP 结果大小覆盖(最高 500K)和 Bash 工具 `PATH` 上的插件可执行文件。

39 

40 [阅读 Week 14 摘要 →](/zh-CN/whats-new/2026-w14)

41</Update>

42 

43<Update label="Week 13" description="March 23–27, 2026" tags={["v2.1.83–v2.1.85"]}>

44 **Auto mode** 在研究预览版中推出:分类器处理您的权限提示,以便安全操作无中断运行,风险操作被阻止。这是批准所有内容和 `--dangerously-skip-permissions` 之间的中间地带。

45 

46 本周还有:桌面应用中的计算机使用、Web 上的 PR 自动修复、使用 `/` 的成绩单搜索、适用于 Windows 的本机 PowerShell 工具和条件 `if` hooks。

47 

48 [阅读 Week 13 摘要 →](/zh-CN/whats-new/2026-w13)

49</Update>

whats-new/2026-w16.md +135 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 第 16 周 · 2026 年 4 月 13–17 日

6 

7> Claude Opus 4.7 配备新的 xhigh 努力级别、Claude Code 网页版上的 Routines、/ultrareview 云代码审查、显示限制驱动因素的 /usage 分解,以及替代捆绑 JavaScript 的原生二进制文件。

8 

9<div className="digest-meta">

10 <span>发布版本 <a href="/zh-CN/docs/changelog#2-1-105">v2.1.105 → v2.1.113</a></span>

11 <span>5 项功能 · 4 月 13–17 日</span>

12</div>

13 

14<div className="digest-feature">

15 <div className="digest-feature-header">

16 <span className="digest-feature-title">Claude Opus 4.7</span>

17 <span className="digest-feature-pill">新模型</span>

18 </div>

19 

20 <p className="digest-feature-lede">Anthropic 最强大的编码模型现在是 Max 和 Team Premium 的默认模型,也可以从 <code>/model</code> 在其他地方使用。它添加了一个新的 <code>xhigh</code> 努力级别,位于 <code>high</code> 和 <code>max</code> 之间:为大多数编码和代理任务提供最佳结果,在您第一次切换到 4.7 时应用为默认值。<code>/effort</code> 现在在您不带参数调用它时打开一个交互式箭头键滑块,因此您可以在不记住级别名称的情况下平衡智能与速度。</p>

21 

22 <p className="digest-feature-try">一次性切换模型和努力级别:</p>

23 

24 ```text Claude Code theme={null}

25 > /model opus

26 > /effort xhigh

27 ```

28 

29 <a className="digest-feature-link" href="/zh-CN/docs/model-config#adjust-effort-level">模型配置:努力级别</a>

30</div>

31 

32<div className="digest-feature">

33 <div className="digest-feature-header">

34 <span className="digest-feature-title">Routines</span>

35 <span className="digest-feature-pill">web</span>

36 </div>

37 

38 <p className="digest-feature-lede">模板化云代理,按计划、GitHub 事件或 API 调用触发。在 Claude Code 网页版上定义一次例程,包括提示、它可以接触的仓库和它需要的连接器,然后让 PR 打开、发布发布或您自己的 webhook 在您的机器不运行的情况下触发它。触发选择器现在涵盖 GitHub 事件和可选过滤器,并为每个例程提供一个令牌化的 <code>/fire</code> 端点供外部系统使用。</p>

39 

40 <Frame>

41 <img className="w-full" src="https://mintcdn.com/claude-code/FTi4SBJ9YRs7d-5X/images/whats-new/routines.png?fit=max&auto=format&n=FTi4SBJ9YRs7d-5X&q=85&s=2ba818ea9280c549511cb48b9b4d1dc5" alt="在 Claude Code 网页版上创建具有计划、GitHub 事件和 API 触发器的例程" width="1440" height="810" data-path="images/whats-new/routines.png" />

42 </Frame>

43 

44 <p className="digest-feature-try">从网页 UI 创建一个,或从您的终端搭建:</p>

45 

46 ```text Claude Code theme={null}

47 > /schedule daily PR review at 9am

48 ```

49 

50 <a className="digest-feature-link" href="/zh-CN/docs/routines">Routines 指南</a>

51</div>

52 

53<div className="digest-feature">

54 <div className="digest-feature-header">

55 <span className="digest-feature-title">/usage breakdown</span>

56 <span className="digest-feature-pill">CLI</span>

57 </div>

58 

59 <p className="digest-feature-lede">更好地了解您的 Claude Code 使用情况。<code>/usage</code> 现在显示驱动您的限制的因素:并行会话、子代理、缓存未命中和长上下文,每个都显示过去 24 小时的百分比和优化提示。按 <code>d</code> 或 <code>w</code> 在日视图和周视图之间切换。</p>

60 

61 <Frame>

62 <img className="w-full" src="https://mintcdn.com/claude-code/FTi4SBJ9YRs7d-5X/images/whats-new/usage.png?fit=max&auto=format&n=FTi4SBJ9YRs7d-5X&q=85&s=792a4b43cbef4e2931974831f076bca6" alt="/usage 命令显示对限制使用的贡献分解" width="1204" height="1182" data-path="images/whats-new/usage.png" />

63 </Frame>

64 

65 <p className="digest-feature-try">随时运行它:</p>

66 

67 ```text Claude Code theme={null}

68 > /usage

69 ```

70 

71 <a className="digest-feature-link" href="/zh-CN/docs/commands">命令参考</a>

72</div>

73 

74<div className="digest-feature">

75 <div className="digest-feature-header">

76 <span className="digest-feature-title">/ultrareview</span>

77 <span className="digest-feature-pill">v2.1.111</span>

78 </div>

79 

80 <p className="digest-feature-lede">云中的全面代码审查。Ultrareview 在 Claude Code 网页版上将您的分支扇出到并行审查者,对每个发现运行对抗性批评通过,并返回经过验证的发现报告,同时您的终端保持空闲。不带参数调用它来审查您当前的分支,或传递 PR 号来获取和审查该 PR。启动对话框现在显示一个 diffstat,因此您在确认之前知道要上传什么。</p>

81 

82 <p className="digest-feature-try">审查您所在的分支:</p>

83 

84 ```text Claude Code theme={null}

85 > /ultrareview

86 ```

87 

88 <p className="digest-feature-try">或将其指向 PR:</p>

89 

90 ```text Claude Code theme={null}

91 > /ultrareview 1234

92 ```

93 

94 <a className="digest-feature-link" href="/zh-CN/docs/ultrareview">Ultrareview 指南</a>

95</div>

96 

97<div className="digest-feature">

98 <div className="digest-feature-header">

99 <span className="digest-feature-title">原生二进制文件</span>

100 <span className="digest-feature-pill">v2.1.113</span>

101 </div>

102 

103 <p className="digest-feature-lede"><code>claude</code> CLI 现在生成原生的每平台二进制文件,而不是捆绑的 JavaScript,因此已安装的 <code>claude</code> 命令不再调用 Node。npm 包通过可选依赖项(如 <code>@anthropic-ai/claude-code-darwin-arm64</code>)拉入正确的二进制文件,因此您的安装命令不会改变。独立安装程序已经提供了此二进制文件;npm 现在与其匹配。</p>

104 

105 <p className="digest-feature-try">升级并检查您正在运行的内容:</p>

106 

107 ```bash theme={null}

108 claude update

109 claude --version

110 ```

111 

112 <a className="digest-feature-link" href="/zh-CN/docs/setup">设置指南</a>

113</div>

114 

115<div className="digest-wins">

116 <p className="digest-wins-title">其他亮点</p>

117 

118 <div className="digest-wins-grid">

119 <div><a href="/zh-CN/docs/permission-modes#eliminate-prompts-with-auto-mode">自动模式</a>现在可供 Max 订阅者在 Opus 4.7 上使用,<code>--enable-auto-mode</code> 标志不再需要</div>

120 <div><a href="/zh-CN/docs/interactive-mode#session-recap">会话回顾</a>显示您离开时发生的一行摘要;按需运行 <code>/recap</code> 或从 <code>/config</code> 关闭它</div>

121 <div>新的 <code>/tui</code> 命令和 <code>tui</code> 设置在对话中间切换经典和无闪烁渲染;焦点视图从 <code>Ctrl+O</code> 移至其自己的 <code>/focus</code> 命令</div>

122 <div>推送通知工具:连接了<a href="/zh-CN/docs/remote-control">远程控制</a>并启用"Claude 决定时推送",Claude 可以在需要您时 ping 您的手机</div>

123 <div>插件可以通过顶级 <code>monitors</code> 清单键提供后台监视器,在会话启动或技能调用时自动启用</div>

124 <div><code>/theme</code> 中的"自动(匹配终端)"选项遵循您的终端的深色/浅色模式</div>

125 <div><code>/fewer-permission-prompts</code> 扫描您的记录以查找常见的只读 Bash 和 MCP 调用,并为 <code>.claude/settings.json</code> 提议一个允许列表</div>

126 <div>Claude 现在可以通过 Skill 工具发现并运行内置命令,如 <code>/init</code>、<code>/review</code> 和 <code>/security-review</code></div>

127 <div><code>PreCompact</code> hooks 可以通过以代码 2 退出或返回 <code>{"{"}"decision":"block"{"}"}</code> 来阻止压缩</div>

128 <div><code>ENABLE\_PROMPT\_CACHING\_1H</code> 选择 API 密钥、Bedrock、Vertex 和 Foundry 用户进入 1 小时提示缓存 TTL</div>

129 <div><code>sandbox.network.deniedDomains</code> 设置从更广泛的 <code>allowedDomains</code> 通配符中分离特定域</div>

130 <div><code>/undo</code> 现在是 <code>/rewind</code> 的别名,<code>/proactive</code> 是 <code>/loop</code> 的别名</div>

131 <div>强化的 Bash 权限:拒绝规则现在通过 <code>env</code>/<code>sudo</code>/<code>watch</code> 包装器匹配,<code>Bash(find:\*)</code> 允许规则不再自动批准 <code>-exec</code> 或 <code>-delete</code></div>

132 </div>

133</div>

134 

135[v2.1.105–v2.1.113 的完整更改日志 →](/zh-CN/changelog#2-1-105)

whats-new/2026-w17.md +113 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 第17周 · 2026年4月20–24日

6 

7> /ultrareview 作为研究预览版开放,返回终端时自动生成会话摘要,可以在插件中构建和发布自定义颜色主题,以及重新设计的网页版 Claude Code。

8 

9<div className="digest-meta">

10 <span>发布版本 <a href="/zh-CN/docs/changelog#2-1-114">v2.1.114 → v2.1.119</a></span>

11 <span>4 项功能 · 4月20–24日</span>

12</div>

13 

14<div className="digest-feature">

15 <div className="digest-feature-header">

16 <span className="digest-feature-title">/ultrareview</span>

17 <span className="digest-feature-pill">research preview</span>

18 </div>

19 

20 <p className="digest-feature-lede">现已公开研究预览版。Ultrareview 在云中针对您的分支或 PR 运行一队 bug 搜寻代理,发现的问题会自动返回到 CLI 或桌面应用。在合并关键更改(如身份验证或数据迁移)之前运行它。</p>

21 

22 <Frame>

23 <video autoPlay muted loop playsInline className="w-full" src="https://mintcdn.com/claude-code/FTi4SBJ9YRs7d-5X/images/whats-new/ultrareview.mp4?fit=max&auto=format&n=FTi4SBJ9YRs7d-5X&q=85&s=0fb1271365d38f414ad155aeb8edb08e" data-path="images/whats-new/ultrareview.mp4" />

24 </Frame>

25 

26 <p className="digest-feature-try">审查您当前所在的分支:</p>

27 

28 ```text Claude Code theme={null}

29 > /ultrareview

30 ```

31 

32 <p className="digest-feature-try">或将其指向 PR:</p>

33 

34 ```text Claude Code theme={null}

35 > /ultrareview 1234

36 ```

37 

38 <a className="digest-feature-link" href="/zh-CN/docs/ultrareview">Ultrareview 指南</a>

39</div>

40 

41<div className="digest-feature">

42 <div className="digest-feature-header">

43 <span className="digest-feature-title">会话摘要</span>

44 <span className="digest-feature-pill">CLI</span>

45 </div>

46 

47 <p className="digest-feature-lede">将焦点从会话转移开,然后返回时会看到一行摘要,说明您离开期间发生了什么。在同时运行多个 Claude 会话时,有助于保持工作流程。</p>

48 

49 <Frame>

50 <video autoPlay muted loop playsInline className="w-full" src="https://mintcdn.com/claude-code/FTi4SBJ9YRs7d-5X/images/whats-new/session-recap.mp4?fit=max&auto=format&n=FTi4SBJ9YRs7d-5X&q=85&s=0a8db1470bd0161a47efeb2f322af76f" data-path="images/whats-new/session-recap.mp4" />

51 </Frame>

52 

53 <p className="digest-feature-try">按需生成摘要,或从 <code>/config</code> 关闭自动摘要:</p>

54 

55 ```text Claude Code theme={null}

56 > /recap

57 ```

58 

59 <a className="digest-feature-link" href="/zh-CN/docs/interactive-mode#session-recap">交互模式:会话摘要</a>

60</div>

61 

62<div className="digest-feature">

63 <div className="digest-feature-header">

64 <span className="digest-feature-title">自定义主题</span>

65 <span className="digest-feature-pill">v2.1.118</span>

66 </div>

67 

68 <p className="digest-feature-lede">从 <code>/theme</code> 构建和切换命名颜色主题,或在 <code>\~/.claude/themes/</code> 中手动编辑 JSON 文件。每个主题选择一个基础预设,并仅覆盖您关心的令牌。插件也可以附带主题。</p>

69 

70 <p className="digest-feature-try">打开主题选择器并创建新主题:</p>

71 

72 ```text Claude Code theme={null}

73 > /theme

74 ```

75 

76 <a className="digest-feature-link" href="/zh-CN/docs/terminal-config#create-a-custom-theme">终端配置:创建自定义主题</a>

77</div>

78 

79<div className="digest-feature">

80 <div className="digest-feature-header">

81 <span className="digest-feature-title">网页版 Claude Code</span>

82 <span className="digest-feature-pill">web</span>

83 </div>

84 

85 <p className="digest-feature-lede"><a href="https://claude.ai/code">claude.ai/code</a> 的新外观与重新设计的桌面应用相匹配:会话侧边栏、拖放布局和刷新的例程视图。关键部分已重建,以实现更快的响应和更可靠的体验。</p>

86 

87 <Frame>

88 <img className="w-full" src="https://mintcdn.com/claude-code/FTi4SBJ9YRs7d-5X/images/whats-new/web-redesign.jpeg?fit=max&auto=format&n=FTi4SBJ9YRs7d-5X&q=85&s=a2aca1b49e295b7337f5779038db8e2c" alt="网页版 Claude Code 重新设计概览:新 UI、速度和可靠性、跨网页、移动和 CLI 工作" width="1602" height="1610" data-path="images/whats-new/web-redesign.jpeg" />

89 </Frame>

90 

91 <a className="digest-feature-link" href="/zh-CN/docs/claude-code-on-the-web">网页版 Claude Code</a>

92</div>

93 

94<div className="digest-wins">

95 <p className="digest-wins-title">其他改进</p>

96 

97 <div className="digest-wins-grid">

98 <div><a href="/zh-CN/docs/interactive-mode#vim-editor-mode">Vim 可视模式</a>:在提示输入中按 <code>v</code> 进行字符选择或按 <code>V</code> 进行行选择,带有运算符和可视反馈</div>

99 <div>Hooks 现在可以通过 <a href="/zh-CN/docs/hooks#mcp-tool-hook-fields"><code>type: "mcp\_tool"</code></a> 直接调用 MCP 工具,因此 hook 可以访问已连接的服务器,而无需生成进程</div>

100 <div><code>/cost</code> 和 <code>/stats</code> 已合并到 <a href="/zh-CN/docs/commands"><code>/usage</code></a>;旧名称仍然可用作打开相关选项卡的输入快捷方式</div>

101 <div><code>/config</code> 更改(主题、编辑器模式、详细信息等)现在持久化到 <code>\~/.claude/settings.json</code>,并遵循与其他 <a href="/zh-CN/docs/settings">设置</a> 相同的项目/本地/策略优先级</div>

102 <div><a href="/zh-CN/docs/sub-agents#fork-the-current-conversation">分叉的子代理</a> 可以通过 <code>CLAUDE\_CODE\_FORK\_SUBAGENT=1</code> 在外部构建上启用:分叉继承您的完整对话上下文,而不是从头开始</div>

103 <div>Pro 和 Max 订阅者在 Opus 4.6 和 Sonnet 4.6 上的默认 <a href="/zh-CN/docs/model-config#adjust-effort-level">努力级别</a> 现在是 <code>high</code>(之前是 <code>medium</code>)</div>

104 <div>原生 macOS 和 Linux 构建用嵌入式 <code>bfs</code> 和 <code>ugrep</code>(通过 Bash 可用)替换了 <code>Glob</code> 和 <code>Grep</code> 工具,可实现更快的搜索,无需单独的工具往返</div>

105 <div><code>--from-pr</code> 现在除了接受 github.com 外,还接受 GitLab 合并请求、Bitbucket 拉取请求和 GitHub Enterprise PR URL</div>

106 <div>自动模式:在 <a href="/zh-CN/docs/auto-mode-config"><code>autoMode.allow</code>、<code>soft\_deny</code> 或 <code>environment</code></a> 中包含 <code>"\$defaults"</code>,以在内置列表旁边添加自定义规则,而不是替换它</div>

107 <div>新的 <a href="/zh-CN/docs/plugin-dependencies#tag-plugin-releases-for-version-resolution"><code>claude plugin tag</code></a> 命令为具有版本验证的插件创建发布 git 标签</div>

108 <div>Opus 4.7 会话现在针对模型的原生 1M 上下文窗口进行计算,修复了膨胀的 <code>/context</code> 百分比和过早的自动压缩</div>

109 <div><code>/resume</code> 在大型会话上的速度提高了 67%,现在在重新读取之前提供总结陈旧的大型会话的选项</div>

110 </div>

111</div>

112 

113[v2.1.114–v2.1.119 的完整更新日志 →](/zh-CN/changelog#2-1-114)

zero-data-retention.md +66 −0 created

Details

1> ## Documentation Index

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

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

4 

5# 零数据保留

6 

7> 了解 Claude for Enterprise 上 Claude Code 的零数据保留 (ZDR),包括范围、禁用功能以及如何请求启用。

8 

9零数据保留 (ZDR) 在通过 Claude for Enterprise 使用 Claude Code 时可用。启用 ZDR 后,Claude Code 会话期间生成的提示和模型响应会实时处理,在返回响应后不会由 Anthropic 存储,除非需要遵守法律或防止滥用。

10 

11Claude for Enterprise 上的 ZDR 为企业客户提供了使用 Claude Code 并实现零数据保留的能力,同时可以访问管理功能:

12 

13* 按用户的成本控制

14* [分析](/zh-CN/analytics)仪表板

15* [服务器管理的设置](/zh-CN/server-managed-settings)

16* 审计日志

17 

18Claude for Enterprise 上 Claude Code 的 ZDR 仅适用于 Anthropic 的直接平台。对于在 Amazon Bedrock、Google Vertex AI 或 Microsoft Foundry 上的 Claude 部署,请参考这些平台的数据保留政策。

19 

20## ZDR 范围

21 

22ZDR 涵盖 Claude for Enterprise 上的 Claude Code 推理。

23 

24<Warning>

25 ZDR 在每个组织的基础上启用。每个新组织都需要由您的 Anthropic 账户团队单独启用 ZDR。ZDR 不会自动应用于在同一账户下创建的新组织。请联系您的账户团队为任何新组织启用 ZDR。

26</Warning>

27 

28### ZDR 涵盖的内容

29 

30ZDR 涵盖通过 Claude for Enterprise 上的 Claude Code 进行的模型推理调用。当您在终端中使用 Claude Code 时,您发送的提示和 Claude 生成的响应不会由 Anthropic 保留。这适用于无论使用哪个 Claude 模型。

31 

32### ZDR 不涵盖的内容

33 

34ZDR 不适用于以下内容,即使对于启用了 ZDR 的组织也是如此。这些功能遵循[标准数据保留政策](/zh-CN/data-usage#data-retention):

35 

36| 功能 | 详情 |

37| -------------- | ------------------------------------------------------------------------------------- |

38| claude.ai 上的聊天 | 通过 Claude for Enterprise 网络界面的聊天对话不受 ZDR 保护。 |

39| Cowork | Cowork 会话不受 ZDR 保护。 |

40| Claude Code 分析 | 不存储提示或模型响应,但收集生产力元数据,如账户电子邮件和使用统计。对于 ZDR 组织,贡献指标不可用;[分析仪表板](/zh-CN/analytics)仅显示使用指标。 |

41| 用户和席位管理 | 管理数据,如账户电子邮件和席位分配,根据标准政策保留。 |

42| 第三方集成 | 由第三方工具、MCP servers 或其他外部集成处理的数据不受 ZDR 保护。请独立审查这些服务的数据处理实践。 |

43 

44## ZDR 下禁用的功能

45 

46当为 Claude for Enterprise 上的 Claude Code 组织启用 ZDR 时,某些需要存储提示或完成的功能会在后端级别自动禁用:

47 

48| 功能 | 原因 |

49| ---------------------------------------------------- | ------------------------ |

50| [网络上的 Claude Code](/zh-CN/claude-code-on-the-web) | 需要服务器端存储对话历史。 |

51| 来自 Desktop 应用的[远程会话](/zh-CN/desktop#remote-sessions) | 需要包含提示和完成的持久会话数据。 |

52| 反馈提交 (`/feedback`) | 提交反馈会将对话数据发送给 Anthropic。 |

53 

54这些功能在后端被阻止,无论客户端显示如何。如果您在启动期间在 Claude Code 终端中看到禁用的功能,尝试使用它会返回一个错误,指示组织的政策不允许该操作。

55 

56如果未来的功能需要存储提示或完成,它们也可能被禁用。

57 

58## 政策违规的数据保留

59 

60即使启用了 ZDR,Anthropic 也可能在法律要求或解决使用政策违规时保留数据。如果会话因政策违规而被标记,Anthropic 可能会保留相关的输入和输出长达 2 年,与 Anthropic 的标准 ZDR 政策一致。

61 

62## 请求 ZDR

63 

64要为 Claude for Enterprise 上的 Claude Code 请求 ZDR,请[联系销售](https://www.anthropic.com/contact-sales?utm_source=claude_code\&utm_medium=docs\&utm_content=zero_data_retention_request)或您的 Anthropic 账户团队。您的账户团队将在内部提交请求,Anthropic 将在确认符合条件后在您的组织上审查并启用 ZDR。所有启用操作都会被审计记录。

65 

66如果您当前通过按使用量付费的 API 密钥使用 Claude Code 的 ZDR,您可以过渡到 Claude for Enterprise 以获得对管理功能的访问权限,同时为 Claude Code 保持 ZDR。请联系您的账户团队以协调迁移。