16 16
17<Steps>17<Steps>
18 <Step title="Hooks">18 <Step title="Hooks">
19 首先运行 [hooks](/docs/zh-CN/agent-sdk/hooks)。一个 hook 可以直接拒绝调用或将其传递下去。返回 `allow` 的 hook 不会跳过下面的拒绝和询问规则;无论 hook 结果如何,这些规则都会被评估。一个 `PreToolUse` hook allow 也不能批准针对 [关键路径](/docs/zh-CN/permission-modes#critical-paths) 的 `rm` 或 `rmdir` 删除。19 首先运行 [hooks](/docs/zh-CN/agent-sdk/hooks)。Hook 可以直接拒绝调用或将其传递下去。返回 `allow` 的 hook 不会跳过下面的拒绝和询问规则;无论 hook 结果如何,这些规则都会被评估。`PreToolUse` hook 允许也不能批准针对 [关键路径](/docs/zh-CN/permission-modes#critical-paths) 的 `rm` 或 `rmdir` 删除。
20 </Step>20 </Step>
21 21
22 <Step title="拒绝规则">22 <Step title="拒绝规则">
23 检查 `deny` 规则(来自 `disallowed_tools` 和 [settings.json](/docs/zh-CN/settings-reference#permission-settings))。如果拒绝规则匹配,工具被阻止,即使在 `bypassPermissions` 模式下也是如此。裸名称拒绝规则(如 `Bash`)在此评估开始之前将工具从 Claude 的上下文中移除,因此只有作用域规则(如 `Bash(rm *)`)在此步骤中被检查。23 检查 `deny` 规则(来自 `disallowed_tools` 和 [settings.json](/docs/zh-CN/settings-reference#permission-settings))。如果拒绝规则匹配,工具被阻止,即使在 `bypassPermissions` 模式下也是如此。裸名称拒绝规则如 `Bash` 在此评估开始之前将工具从 Claude 的上下文中移除,因此只有作用域规则如 `Bash(rm *)` 在此步骤被检查。
24 </Step>24 </Step>
25 25
26 <Step title="询问规则">26 <Step title="询问规则">
27 检查来自 [settings.json](/docs/zh-CN/settings-reference#permission-settings) 的 `ask` 规则。如果询问规则匹配,调用会传递到您的 [`canUseTool` 回调](/docs/zh-CN/agent-sdk/user-input) 以获得确认,即使在 `bypassPermissions` 模式下也是如此。27 检查来自 [settings.json](/docs/zh-CN/settings-reference#permission-settings) 的 `ask` 规则。如果询问规则匹配,调用会传递到您的 [`canUseTool` 回调](/docs/zh-CN/agent-sdk/user-input) 以获得确认,即使在 `bypassPermissions` 模式下也是如此。
28 28
29 需要用户交互的工具行为相同:`AskUserQuestion` 和 MCP 工具,其服务器设置 [`_meta["anthropic/requiresUserInteraction"]`](/docs/zh-CN/mcp#require-approval-for-a-specific-tool) 总是传递到回调,即使当允许规则匹配时。在 `dontAsk` 模式下,两种情况都被拒绝,因为该模式从不提示。MCP 注解需要 Claude Code v2.1.199 或更高版本。29 需要用户交互的工具行为相同:`AskUserQuestion` 和 MCP 工具,其服务器设置了 [`_meta["anthropic/requiresUserInteraction"]`](/docs/zh-CN/mcp#require-approval-for-a-specific-tool),总是传递到回调,即使当允许规则匹配时也是如此。在 `dontAsk` 模式下,两种情况都被拒绝,因为该模式从不提示。MCP 注解需要 Claude Code v2.1.199 或更高版本。
30 30
31 [claude.ai connector](/docs/zh-CN/mcp#organization-controls-on-connector-tools) 工具,您的组织已设置为 `ask` 也会在此步骤离开流程。每个调用都会传递到回调,即使在 `bypassPermissions` 模式下,即使当允许规则匹配时。回调接收原因 `Your organization requires approval for this tool`。在 `dontAsk` 模式下,调用被拒绝,因为该模式从不提示。31 您的组织设置为 `ask` 的 [claude.ai connector](/docs/zh-CN/mcp#organization-controls-on-connector-tools) 工具也在此步骤离开流程。每个调用都传递到回调,即使在 `bypassPermissions` 模式下,即使当允许规则匹配时也是如此。回调接收原因 `Your organization requires approval for this tool`。在 `dontAsk` 模式下,调用被拒绝,因为该模式从不提示。
32 </Step>32 </Step>
33 33
34 <Step title="权限模式">34 <Step title="权限模式">
35 应用活跃的 [权限模式](#permission-modes):35 应用活跃的 [权限模式](#permission-modes):
36 36
37 * 在 `bypassPermissions` 模式下,Claude Code 批准到达此步骤的所有内容,除了针对 [关键路径](/docs/zh-CN/permission-modes#critical-paths) 的 `rm` 和 `rmdir` 删除,这些会传递下去。37 * 在 `bypassPermissions` 模式下,Claude Code 批准到达此步骤的所有内容,除了针对 [关键路径](/docs/zh-CN/permission-modes#critical-paths) 的 `rm` 和 `rmdir` 删除,这些会传递下去。
38 * 在 `acceptEdits` 模式下,Claude Code 批准 [Accept edits mode](#accept-edits-mode-acceptedits) 下列出的文件操作。38 * 在 `acceptEdits` 模式下,Claude Code 批准 [接受编辑模式](#accept-edits-mode-acceptedits) 下列出的文件操作。
39 * 在 `plan` 模式下,Claude Code 将文件编辑和 shell 写入工具发送到您的 `canUseTool` 回调,无论允许规则如何,因此在规划时写入操作无法自动批准。39 * 在 `plan` 模式下,Claude Code 将文件编辑和 shell 写入工具发送到您的 `canUseTool` 回调,无论允许规则如何,因此在规划时写入操作无法自动批准。
40 * 在其他模式下,请求会传递下去。40 * 在其他模式下,请求传递下去。
41 </Step>41 </Step>
42 42
43 <Step title="允许规则">43 <Step title="允许规则">
44 检查 `allow` 规则(来自 `allowed_tools` 和 settings.json)。如果规则匹配,工具被批准。调用工具自身批准的是在此步骤解决的,无需规则:例如在您的工作目录内的文件读取或 [只读 Bash 命令](/docs/zh-CN/permissions#read-only-commands)。针对 [关键路径](/docs/zh-CN/permission-modes#critical-paths) 的 `rm` 和 `rmdir` 删除永远不会被允许规则批准:它们在提示的模式下到达您的回调,在 Claude Code v2.1.218 或更高版本的 `auto` 模式下进入 [分类器](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode),并在 `dontAsk` 模式下被拒绝。44 检查 `allow` 规则(来自 `allowed_tools` 和 settings.json)。如果规则匹配,工具被批准。工具自己批准的调用也在此步骤被解决,无需规则:例如在您的工作目录内的文件读取或 [只读 Bash 命令](/docs/zh-CN/permissions#read-only-commands)。针对 [关键路径](/docs/zh-CN/permission-modes#critical-paths) 的 `rm` 和 `rmdir` 删除永远不会被允许规则批准:它们在提示的模式下到达您的回调,在 Claude Code v2.1.218 或更高版本的 `auto` 模式下转到 [分类器](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode),并在 `dontAsk` 模式下被拒绝。
45 </Step>45 </Step>
46 46
47 <Step title="canUseTool 回调">47 <Step title="canUseTool 回调">
48 如果上述任何步骤都未解决,调用您的 [`canUseTool` 回调](/docs/zh-CN/agent-sdk/user-input) 以获得决定。在 `dontAsk` 模式下,此步骤被跳过,工具被拒绝。48 如果上述任何步骤都未解决,调用您的 [`canUseTool` 回调](/docs/zh-CN/agent-sdk/user-input) 以获得决定。在 `dontAsk` 模式下,此步骤被跳过,工具被拒绝。
49 49
50 在 TypeScript SDK 中,如果您设置 [`permissionPrompts: 'none'`](/docs/zh-CN/agent-sdk/typescript#options),您的回调在此步骤不会被调用。一个 [`PermissionRequest` hook](/docs/zh-CN/hooks#permissionrequest) 仍然有机会决定,如果它不决定,Claude Code 拒绝调用。该选项需要 Claude Code v2.1.259 或更高版本。50 在 TypeScript SDK 中,如果您设置了 [`permissionPrompts: 'none'`](/docs/zh-CN/agent-sdk/typescript#options),您的回调在此步骤不会被调用。[`PermissionRequest` hook](/docs/zh-CN/hooks#permissionrequest) 仍然有机会决定,如果它不决定,Claude Code 拒绝调用。该选项需要 Claude Code v2.1.259 或更高版本。
51 </Step>51 </Step>
52</Steps>52</Steps>
53 53
54<img src="https://mintcdn.com/claude-code/jYgs7qigNjO1Badj/images/agent-sdk/permissions-flow.svg?fit=max&auto=format&n=jYgs7qigNjO1Badj&q=85&s=c771ad9085b1277d3708027a49c744bc" className="dark:hidden" alt="六步权限评估流程图,与上述步骤相匹配:工具请求通过 hooks、拒绝规则、询问规则、权限模式、允许规则和 canUseTool。Hooks、拒绝规则和 canUseTool 可以路由到阻止;权限模式绕过、允许规则和 canUseTool 可以路由到执行;询问规则路由到 canUseTool。" width="1180" height="260" data-path="images/agent-sdk/permissions-flow.svg" />54<img src="https://mintcdn.com/claude-code/jYgs7qigNjO1Badj/images/agent-sdk/permissions-flow.svg?fit=max&auto=format&n=jYgs7qigNjO1Badj&q=85&s=c771ad9085b1277d3708027a49c744bc" className="dark:hidden" alt="六步权限评估流程的图表,与上述步骤匹配:工具请求通过 hooks、拒绝规则、询问规则、权限模式、允许规则和 canUseTool。Hooks、拒绝规则和 canUseTool 可以路由到被阻止;权限模式绕过、允许规则和 canUseTool 可以路由到执行;询问规则路由到 canUseTool。" width="1180" height="260" data-path="images/agent-sdk/permissions-flow.svg" />
55 55
56<img src="https://mintcdn.com/claude-code/_xqph1dUOslCOwsj/images/agent-sdk/permissions-flow-dark.svg?fit=max&auto=format&n=_xqph1dUOslCOwsj&q=85&s=e53a91e9059cbf51852b7cedb4dd4251" className="hidden dark:block" alt="六步权限评估流程图,与上述步骤相匹配:工具请求通过 hooks、拒绝规则、询问规则、权限模式、允许规则和 canUseTool。Hooks、拒绝规则和 canUseTool 可以路由到阻止;权限模式绕过、允许规则和 canUseTool 可以路由到执行;询问规则路由到 canUseTool。" width="1180" height="260" data-path="images/agent-sdk/permissions-flow-dark.svg" />56<img src="https://mintcdn.com/claude-code/_xqph1dUOslCOwsj/images/agent-sdk/permissions-flow-dark.svg?fit=max&auto=format&n=_xqph1dUOslCOwsj&q=85&s=e53a91e9059cbf51852b7cedb4dd4251" className="hidden dark:block" alt="六步权限评估流程的图表,与上述步骤匹配:工具请求通过 hooks、拒绝规则、询问规则、权限模式、允许规则和 canUseTool。Hooks、拒绝规则和 canUseTool 可以路由到被阻止;权限模式绕过、允许规则和 canUseTool 可以路由到执行;询问规则路由到 canUseTool。" width="1180" height="260" data-path="images/agent-sdk/permissions-flow-dark.svg" />
57 57
58如果您在 TypeScript SDK 期望评估顺序在咨询回调之前自动批准调用的配置中传递 `canUseTool` 回调,SDK 在构造查询时会发出一次 Node.js 进程警告。警告的代码是 `CLAUDE_SDK_CAN_USE_TOOL_SHADOWED`。两种配置会触发它:58如果您在 TypeScript SDK 期望评估顺序在咨询回调之前自动批准调用的配置中传递 `canUseTool` 回调,SDK 在构造查询时会发出一次 Node.js 进程警告。警告的代码是 `CLAUDE_SDK_CAN_USE_TOOL_SHADOWED`。两个配置会触发它:
59 59
60* `permissionMode: 'bypassPermissions'`,它自动批准到达权限模式步骤的每个调用,除了 [任何模式都不自动批准的操作](/docs/zh-CN/permission-modes#actions-no-mode-auto-approves)60* `permissionMode: 'bypassPermissions'`,它自动批准到达权限模式步骤的每个调用,除了 [任何模式都不自动批准的操作](/docs/zh-CN/permission-modes#actions-no-mode-auto-approves)
61* 每个裸 `allowedTools` 条目,如 `"Read"`,它在咨询回调之前自动批准整个工具,除了 [任何模式都不自动批准的操作](/docs/zh-CN/permission-modes#actions-no-mode-auto-approves)61* 每个裸 `allowedTools` 条目,如 `"Read"`,它在回调被咨询之前自动批准整个工具,除了 [任何模式都不自动批准的操作](/docs/zh-CN/permission-modes#actions-no-mode-auto-approves)
62 62
63带有说明符的条目(如 `Bash(ls *)`)和 `acceptEdits` 模式不会触发它,来自设置文件的允许规则对检查不可见。63带有说明符的条目,如 `Bash(ls *)` 和 `acceptEdits` 模式不会触发它,来自设置文件的允许规则对检查不可见。
64 64
65使用 `process.on('warning', ...)` 监听并匹配代码以记录或抑制它。要无论模式和规则如何都控制每个工具调用,请改用 [`PreToolUse` hook](/docs/zh-CN/agent-sdk/hooks)。65使用 `process.on('warning', ...)` 监听并匹配代码以记录或抑制它。要对所有工具调用进行门控,无论模式和规则如何,请改用 [`PreToolUse` hook](/docs/zh-CN/agent-sdk/hooks)。
66 66
67本页面重点关注 **允许和拒绝规则** 以及 **权限模式**。对于其他步骤:67此页面重点关注 **允许和拒绝规则** 和 **权限模式**。对于其他步骤:
68 68
69* **Hooks:** 运行自定义代码以允许、拒绝或修改工具请求。请参阅 [使用 hooks 控制执行](/docs/zh-CN/agent-sdk/hooks)。69* **Hooks:** 运行自定义代码以允许、拒绝或修改工具请求。请参阅 [使用 hooks 控制执行](/docs/zh-CN/agent-sdk/hooks)。
70* **canUseTool 回调:** 在运行时提示用户批准,当没有更早的步骤解决调用时。请参阅 [处理批准和用户输入](/docs/zh-CN/agent-sdk/user-input)。70* **canUseTool 回调:** 在运行时提示用户批准,当没有更早的步骤解决调用时。请参阅 [处理批准和用户输入](/docs/zh-CN/agent-sdk/user-input)。
73 允许和拒绝规则73 允许和拒绝规则
74</h2>74</h2>
75 75
76`allowed_tools` 和 `disallowed_tools`(TypeScript:`allowedTools` / `disallowedTools`)向上面评估流程中的允许和拒绝规则列表添加条目。如果您在 `allowed_tools` 中命名[任务跟踪工具](/docs/zh-CN/agent-sdk/todo-tracking#model-availability)之一,Claude Code 也会选择加入会话。任何其他未在 `allowed_tools` 中列出的工具仍然可供 Claude 使用,对其的调用如果需要批准,会继续进行权限模式。拒绝规则的行为取决于它们是命名工具还是在工具内范围化模式。76`allowed_tools` 和 `disallowed_tools`(TypeScript:`allowedTools` / `disallowedTools`)在上述评估流程中向允许和拒绝规则列表添加条目。如果你在 `allowed_tools` 中命名了某个[任务跟踪工具](/docs/zh-CN/agent-sdk/todo-tracking#model-availability),Claude Code 也会选择加入该会话。任何其他未在 `allowed_tools` 中列出的工具仍然可供 Claude 使用,对其的调用如果需要批准,则会进入权限模式。拒绝规则的行为取决于它们是命名工具还是在工具内限定模式。
77 77
78| 选项 | 效果 |78| 选项 | 效果 |
79| :-------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------- |79| :-------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------- |
80| `allowed_tools=["Read", "Grep"]` | `Read` 和 `Grep` 被自动批准。此处未列出的其他工具仍然存在,对其的调用如果需要批准,会继续进行权限模式和 `canUseTool`。 |80| `allowed_tools=["Read", "Grep"]` | `Read` 和 `Grep` 被自动批准。此处未列出的其他工具仍然存在,对它们的调用如果需要批准,则会进入权限模式和 `canUseTool`。 |
81| `disallowed_tools=["Bash"]` | `Bash` 工具定义从请求中移除。Claude 看不到该工具,无法尝试它。 |81| `disallowed_tools=["Bash"]` | `Bash` 工具定义从请求中移除。Claude 看不到该工具,无法尝试使用它。 |
82| `disallowed_tools=["Bash(rm *)"]` | `Bash` 保持可用。与 `rm *` [如所写](/docs/zh-CN/permissions#bash-rule-limits) 匹配的调用在每个权限模式中都被拒绝,包括 `bypassPermissions`。其他 `Bash` 调用,包括 `/bin/rm`,继续进行权限模式。 |82| `disallowed_tools=["Bash(rm *)"]` | `Bash` 保持可用。匹配 `rm *` [如所写](/docs/zh-CN/permissions#bash-rule-limits) 的调用在每种权限模式中都被拒绝,包括 `bypassPermissions`。其他 `Bash` 调用(包括 `/bin/rm`)会进入权限模式。 |
83| `disallowed_tools=["*"]` | 每个工具定义都从请求中移除。工具名称通配符在拒绝规则中受支持:`"*"` 匹配每个工具,`"mcp__*"` 匹配所有服务器中的每个 MCP 工具。 |83| `disallowed_tools=["*"]` | 每个工具定义都从请求中移除。拒绝规则中支持工具名称通配符:`"*"` 匹配每个工具,`"mcp__*"` 匹配所有服务器中的每个 MCP 工具。 |
84 84
85允许规则仅在字面 `mcp__<server>__` 前缀之后接受工具名称通配符。服务器段必须无通配符,以便规则命名您配置的特定服务器:`mcp__puppeteer__*` 匹配来自 `puppeteer` 服务器的每个工具,`mcp__github__get_*` 匹配其 `get_` 工具。未锚定的条目如 `allowed_tools=["*"]` 或 `allowed_tools=["mcp__*"]` 被忽略并显示启动警告,不会自动批准任何内容。85允许规则仅在字面 `mcp__<server>__` 前缀之后接受工具名称通配符。服务器段必须无通配符,以便规则命名你配置的特定服务器:`mcp__puppeteer__*` 匹配来自 `puppeteer` 服务器的每个工具,`mcp__github__get_*` 匹配其 `get_` 工具。未锚定的条目(如 `allowed_tools=["*"]` 或 `allowed_tools=["mcp__*"]`)会被忽略并显示启动警告,不会自动批准任何内容。
86 86
87范围化规则用于 `Read` 和 `Edit` 采用路径模式。`Edit(path)` 规则管理所有写入文件的内置工具,包括 `Write` 和 `NotebookEdit`;`Write(path)` 规则永远不会被文件权限检查匹配。87`Read` 和 `Edit` 的限定规则采用路径模式。`Edit(path)` 规则管理所有写入文件的内置工具,包括 `Write` 和 `NotebookEdit`;`Write(path)` 规则永远不会被文件权限检查匹配。
88 88
89使用 `//path` 表示绝对文件系统路径:`Edit(//secrets/**)` 的拒绝规则阻止在磁盘上 `/secrets` 下任何位置的写入。使用单个前导斜杠,`Edit(/secrets/**)` 在规则的源处锚定。对于通过 `allowed_tools` 或 `disallowed_tools` 传递的规则,这意味着会话的工作目录,因此规则不会阻止磁盘上的 `/secrets`。请参阅 [Read 和 Edit 规则](/docs/zh-CN/permissions#read-and-edit) 了解四种锚定形式以及来自设置文件的规则如何解析。89使用 `//path` 表示绝对文件系统路径:`Edit(//secrets/**)` 的拒绝规则会阻止在磁盘上 `/secrets` 下任何位置的写入。使用单个前导斜杠时,`Edit(/secrets/**)` 在规则的源处锚定。对于通过 `allowed_tools` 或 `disallowed_tools` 传递的规则,这意味着会话的工作目录,因此规则不会阻止磁盘上的 `/secrets`。请参阅 [Read 和 Edit 规则](/docs/zh-CN/permissions#read-and-edit) 了解四种锚定形式以及来自设置文件的规则如何解析。
90 90
91<Warning>91<Warning>
92 **自动批准的工具永远不会到达 `canUseTool`。** 在任何早期步骤中批准的工具调用,通过 `acceptEdits` 或 `bypassPermissions`,或通过允许规则,会跳过您的 `canUseTool` 回调,因此您在那里放置的权限检查对该工具被静默绕过。`AskUserQuestion`、标记有 [`_meta["anthropic/requiresUserInteraction"]`](/docs/zh-CN/mcp#require-approval-for-a-specific-tool) 的 MCP 工具、连接器工具[您的组织设置为 `ask`](/docs/zh-CN/mcp#organization-controls-on-connector-tools) 以及 `rm` 和 `rmdir` 移除针对[关键路径](/docs/zh-CN/permission-modes#critical-paths) 仍然到达回调,即使允许规则匹配。在 `auto` 模式中,关键路径移除转到[分类器](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode) 而不是回调,而上面列出的其他调用仍然到达它;分类器路由需要 Claude Code v2.1.218 或更高版本。在 `dontAsk` 模式中,这些调用被拒绝,不调用回调。92 **自动批准的工具永远不会到达 `canUseTool`。** 在任何早期步骤中被批准的工具调用,通过 `acceptEdits` 或 `bypassPermissions`,或通过允许规则,会跳过你的 `canUseTool` 回调,因此你在那里放置的权限检查会被该工具无声地绕过。`AskUserQuestion`、标记为 [`_meta["anthropic/requiresUserInteraction"]`](/docs/zh-CN/mcp#require-approval-for-a-specific-tool) 的 MCP 工具、连接器工具[你的组织设置为 `ask`](/docs/zh-CN/mcp#organization-controls-on-connector-tools),以及针对[关键路径](/docs/zh-CN/permission-modes#critical-paths)的 `rm` 和 `rmdir` 移除仍然会到达回调,即使允许规则匹配。在 `auto` 模式中,关键路径移除会进入[分类器](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode)而不是回调,而上面列出的其他调用仍然会到达它;分类器路由需要 Claude Code v2.1.218 或更高版本。在 `dontAsk` 模式中,这些调用会被拒绝,不会调用回调。
93 93
94 覆盖范围取决于条目的形式:像 `Read` 或 `mcp__github__get_issue` 这样的裸名称自动批准对该工具的每个调用,除了上面的异常之外,而像 `Bash(npm test *)` 这样的范围化规则仅自动批准匹配的调用,其他需要批准的 `Bash` 调用仍然会继续进行回调。对于必须在每个工具调用上运行的检查,请使用 [`PreToolUse` hook](/docs/zh-CN/agent-sdk/hooks):hooks 在每个其他步骤之前运行,hook 拒绝甚至在 `bypassPermissions` 模式中也适用。94 覆盖范围取决于条目的形式:像 `Read` 或 `mcp__github__get_issue` 这样的裸名称会自动批准对该工具的每个调用,除了上面列出的例外,而像 `Bash(npm test *)` 这样的限定规则仅自动批准匹配的调用,其他需要批准的 `Bash` 调用仍然会进入回调。对于必须在每个工具调用上运行的检查,使用 [`PreToolUse` hook](/docs/zh-CN/agent-sdk/hooks):hooks 在每个其他步骤之前运行,hook 拒绝即使在 `bypassPermissions` 模式中也适用。
95</Warning>95</Warning>
96 96
97对于锁定的代理,将 `allowedTools` 与 `permissionMode: "dontAsk"` 配对:97对于锁定的代理,将 `allowedTools` 与 `permissionMode: "dontAsk"` 配对:
103};103};
104```104```
105 105
106列出的工具被批准,除了[任何模式都不自动批准的操作](/docs/zh-CN/permission-modes#actions-no-mode-auto-approves),以及每个其他会提示的调用都被拒绝。在 `default` 模式中不需要批准的调用无论您是否列出它们都会运行,例如[只读 Bash 命令](/docs/zh-CN/permissions#read-only-commands)、不在运行前询问的工具如 `Agent`,以及您工作目录内的文件读取。要将工具完全置于 Claude 的范围之外,请将其裸名称添加到 `disallowedTools`。106列出的工具被批准,除了[任何模式都不自动批准的操作](/docs/zh-CN/permission-modes#actions-no-mode-auto-approves),以及每个其他会提示的调用都被拒绝。在 `default` 模式中不需要批准的调用会运行,无论你是否列出它们,例如[只读 Bash 命令](/docs/zh-CN/permissions#read-only-commands)、不在运行前询问的 `Agent` 等工具,以及工作目录内的文件读取。要使工具完全超出 Claude 的范围,请将其裸名称添加到 `disallowedTools`。
107 107
108<Warning>108<Warning>
109 **`allowed_tools` 不约束 `bypassPermissions`。** `allowed_tools` 仅预批准您列出的工具。未列出的工具不与任何允许规则匹配,并继续进行权限模式,其中 `bypassPermissions` 批准它们。设置 `allowed_tools=["Read"]` 与 `permission_mode="bypassPermissions"` 一起仍然批准每个工具,包括 `Bash`、`Write` 和 `Edit`。如果您需要 `bypassPermissions` 但想要阻止特定工具,请使用 `disallowed_tools`。109 **`allowed_tools` 不限制 `bypassPermissions`。** `allowed_tools` 预批准你列出的工具。其他未列出的工具不匹配任何允许规则,会进入权限模式,其中 `bypassPermissions` 批准它们。将 `allowed_tools=["Read"]` 与 `permission_mode="bypassPermissions"` 一起设置仍然会批准每个工具,包括 `Bash`、`Write` 和 `Edit`。如果你需要 `bypassPermissions` 但想要阻止特定工具,请使用 `disallowed_tools`。
110</Warning>110</Warning>
111 111
112您也可以在 `.claude/settings.json` 中声明式地配置允许、拒绝和询问规则。当启用 `project` 设置源时,这些规则被读取,默认 `query()` 选项就是这样。如果您显式设置 `setting_sources`(TypeScript:`settingSources`),请包含 `"project"` 以使其应用。请参阅 [权限设置](/docs/zh-CN/settings-reference#permission-settings) 了解规则语法。112你也可以在 `.claude/settings.json` 中声明式地配置允许、拒绝和询问规则。当启用 `project` 设置源时会读取这些规则,默认 `query()` 选项就是这样。如果你显式设置 `setting_sources`(TypeScript:`settingSources`),请包含 `"project"` 以使其应用。请参阅[权限设置](/docs/zh-CN/settings-reference#permission-settings)了解规则语法。
113 113
114<h2 id="permission-modes">114<h2 id="permission-modes">
115 权限模式115 权限模式
121 可用模式121 可用模式
122</h3>122</h3>
123 123
124SDK 支持这些权限模式:124SDK 支持以下权限模式:
125 125
126| 模式 | 描述 | 工具行为 |126| 模式 | 描述 | 工具行为 |
127| :------------------ | :------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |127| :------------------ | :------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
128| `default` | 标准权限行为 | 无基于模式的自动批准;需要批准且不匹配任何允许规则的调用会触发您的 `canUseTool` 回调 |128| `default` | 标准权限行为 | 无基于模式的自动批准;需要批准且不匹配任何允许规则的调用会触发您的 `canUseTool` 回调 |
129| `dontAsk` | 拒绝而不是提示 | 任何会提示的调用都被拒绝。由 `allowed_tools` 或规则批准的调用会运行,在 `default` 模式下不需要批准的调用也会运行;连接器工具[您的组织设置为 `ask`](/docs/zh-CN/mcp#organization-controls-on-connector-tools)和需要用户交互的工具即使您已预批准它们也被拒绝,`rm` 和 `rmdir` 移除针对[关键路径](/docs/zh-CN/permission-modes#critical-paths)也被拒绝。`canUseTool` 永远不会被调用 |129| `dontAsk` | 拒绝而不是提示 | 任何会提示的调用都被拒绝。由 `allowed_tools` 或规则批准的调用会运行,`default` 模式下不需要批准的调用也会运行;连接器工具[您的组织设置为 `ask`](/docs/zh-CN/mcp#organization-controls-on-connector-tools)和需要用户交互的工具即使您已预先批准也会被拒绝,`rm` 和 `rmdir` 针对[关键路径](/docs/zh-CN/permission-modes#critical-paths)的删除也会被拒绝。`canUseTool` 永远不会被调用 |
130| `acceptEdits` | 自动接受文件编辑 | 文件编辑和 [文件系统操作](#accept-edits-mode-acceptedits)(`mkdir`、`rm`、`mv` 等)被自动批准 |130| `acceptEdits` | 自动接受文件编辑 | 文件编辑和[文件系统操作](#accept-edits-mode-acceptedits)(`mkdir`、`rm`、`mv` 等)会自动批准 |
131| `bypassPermissions` | 绕过权限检查 | 工具运行而无需权限提示,除了[任何模式都不自动批准的操作](/docs/zh-CN/permission-modes#actions-no-mode-auto-approves)。谨慎使用 |131| `bypassPermissions` | 绕过权限检查 | 工具运行时无需权限提示,除了[任何模式都不自动批准的操作](/docs/zh-CN/permission-modes#actions-no-mode-auto-approves)。请谨慎使用 |
132| `plan` | 规划模式 | Claude 在不编辑源文件的情况下探索和规划;文件编辑永远不会自动批准,并通过您的 `canUseTool` 回调提示 |132| `plan` | 规划模式 | Claude 在不编辑您的源文件的情况下探索和规划;文件编辑永远不会自动批准,而是通过您的 `canUseTool` 回调提示 |
133| `auto` | 模型分类批准 | 模型分类器批准或拒绝权限提示。请参阅[Auto 模式](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode)了解可用性 |133| `auto` | 模型分类批准 | 模型分类器批准或拒绝权限提示。有关可用性,请参阅[自动模式](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode) |
134 134
135<Warning>135<Warning>
136 **子代理继承:** 子代理在父会话的权限模式下运行,除非您在其[`AgentDefinition`](/docs/zh-CN/agent-sdk/typescript#agentdefinition)上设置 `permissionMode`,且父会话处于 `default`、`dontAsk` 或 `plan` 模式。即使这样,Claude Code 也永远不会应用 `"bypassPermissions"` 值。子代理仅在父会话本身处于 `bypassPermissions` 模式时才在该模式下运行。`bypassPermissions` 异常需要 Claude Code v2.1.267 或更高版本。136 **子代理继承:** 子代理在父会话的权限模式下运行,除非您在其[`AgentDefinition`](/docs/zh-CN/agent-sdk/typescript#agentdefinition)上设置 `permissionMode`,且父会话处于 `default`、`dontAsk` 或 `plan` 模式。即使这样,Claude Code 也永远不会应用 `"bypassPermissions"` 值。子代理仅在父会话本身处于 `bypassPermissions` 模式时才在该模式下运行。 `bypassPermissions` 异常需要 Claude Code v2.1.267 或更高版本。
137 137
138 子代理可能有不同的系统提示和行为约束较少,比您的主代理,所以继承 `bypassPermissions` 授予它们完整的、自主的系统访问权限。[任何模式都不自动批准的操作](/docs/zh-CN/permission-modes#actions-no-mode-auto-approves)仍然适用。138 子代理可能具有不同的系统提示和比主代理更少受限的行为,因此继承 `bypassPermissions` 会授予它们完整的自主系统访问权限。[任何模式都不自动批准的操作](/docs/zh-CN/permission-modes#actions-no-mode-auto-approves)仍然适用。
139</Warning>139</Warning>
140 140
141<h3 id="set-permission-mode">141<h3 id="set-permission-mode">
142 设置权限模式142 设置权限模式
143</h3>143</h3>
144 144
145您可以在启动查询时设置权限模式一次,或在会话活跃时动态更改它。145您可以在启动查询时设置一次权限模式,或在会话活跃时动态更改它。
146 146
147<Tabs>147<Tabs>
148 <Tab title="在查询时">148 <Tab title="在查询时">
149 在创建查询时传递 `permission_mode`(Python)或 `permissionMode`(TypeScript)。此模式应用于整个会话,除非动态更改。149 在创建查询时传递 `permission_mode`(Python)或 `permissionMode`(TypeScript)。此模式适用于整个会话,除非动态更改。
150 150
151 <CodeGroup>151 <CodeGroup>
152 ```python Python theme={null}152 ```python Python theme={null}
158 async for message in query(158 async for message in query(
159 prompt="Help me refactor this code",159 prompt="Help me refactor this code",
160 options=ClaudeAgentOptions(160 options=ClaudeAgentOptions(
161 permission_mode="default", # 在此处设置模式161 permission_mode="default", # 在此设置模式
162 ),162 ),
163 ):163 ):
164 if hasattr(message, "result"):164 if hasattr(message, "result"):
175 for await (const message of query({175 for await (const message of query({
176 prompt: "Help me refactor this code",176 prompt: "Help me refactor this code",
177 options: {177 options: {
178 permissionMode: "default" // 在此处设置模式178 permissionMode: "default" // 在此设置模式
179 }179 }
180 })) {180 })) {
181 if ("result" in message) {181 if ("result" in message) {
190 </Tab>190 </Tab>
191 191
192 <Tab title="在流式传输期间">192 <Tab title="在流式传输期间">
193 调用 `set_permission_mode()`(Python)或 `setPermissionMode()`(TypeScript)以在会话中期更改模式。新模式立即对所有后续工具请求生效。这让您可以从限制性开始,随着信任建立而放松权限,例如在审查 Claude 的初始方法后切换到 `acceptEdits`。193 调用 `set_permission_mode()`(Python)或 `setPermissionMode()`(TypeScript)以在会话中途更改模式。新模式立即对所有后续工具请求生效。这让您可以从限制性开始,随着信任建立而放宽权限,例如在审查 Claude 的初始方法后切换到 `acceptEdits`。
194 194
195 <CodeGroup>195 <CodeGroup>
196 ```python Python theme={null}196 ```python Python theme={null}
206 ) as client:206 ) as client:
207 await client.query("Help me refactor this code")207 await client.query("Help me refactor this code")
208 208
209 # 在会话中期动态更改模式209 # 在会话中途动态更改模式
210 await client.set_permission_mode("acceptEdits")210 await client.set_permission_mode("acceptEdits")
211 211
212 # 使用新权限模式处理消息212 # 使用新权限模式处理消息
229 }229 }
230 });230 });
231 231
232 // 在会话中期动态更改模式232 // 在会话中途动态更改模式
233 await q.setPermissionMode("acceptEdits");233 await q.setPermissionMode("acceptEdits");
234 234
235 // 使用新权限模式处理消息235 // 使用新权限模式处理消息
254 接受编辑模式(`acceptEdits`)254 接受编辑模式(`acceptEdits`)
255</h4>255</h4>
256 256
257自动批准文件操作,以便 Claude 可以编辑代码而无需提示。其他工具(如不是文件系统操作的 Bash 命令)仍然需要正常权限。257自动批准文件操作,以便 Claude 可以编辑代码而无需提示。其他工具(如不是文件系统操作的 Bash 命令)仍需要正常权限。
258 258
259**自动批准的操作:**259**自动批准的操作:**
260 260
261* 文件编辑(Edit、Write 工具)261* 文件编辑(Edit、Write 工具)
262* 文件系统命令:`mkdir`、`touch`、`rm`、`rmdir`、`mv`、`cp`、`sed`262* 文件系统命令:`mkdir`、`touch`、`rm`、`rmdir`、`mv`、`cp`、`sed`
263 263
264两者都仅适用于工作目录或 `additionalDirectories` 内的路径。在 `acceptEdits` 模式下,当 Claude 时,Claude Code 不会自动批准请求:264两者都仅适用于工作目录或 `additionalDirectories` 内的路径。在 `acceptEdits` 模式下,当 Claude 执行以下操作时,Claude Code 不会自动批准请求:
265 265
266* 在该范围之外的路径上工作266* 在该范围之外的路径上工作
267* 写入受保护的路径267* 写入受保护的路径
268* 使用 `rm` 或 `rmdir` 移除[关键路径](/docs/zh-CN/permission-modes#critical-paths)268* 使用 `rm` 或 `rmdir` 删除[关键路径](/docs/zh-CN/permission-modes#critical-paths)
269 269
270**使用时机:** 您信任 Claude 的编辑并希望更快的迭代,例如在原型设计期间或在隔离目录中工作时。270**使用场景:** 您信任 Claude 的编辑并希望更快地迭代,例如在原型设计期间或在隔离目录中工作时。
271 271
272<h4 id="don’t-ask-mode-dontask">272<h4 id="don’t-ask-mode-dontask">
273 不询问模式(`dontAsk`)273 不要询问模式(`dontAsk`)
274</h4>274</h4>
275 275
276将任何权限提示转换为拒绝,无需调用 `canUseTool`。由 `allowed_tools`、`settings.json` 允许规则或 hook 预批准的工具正常运行,在 `default` 模式下不需要批准的调用也会运行,例如在您的工作目录内的文件读取和对 `Agent` 的调用。连接器工具[您的组织设置为 `ask`](/docs/zh-CN/mcp#organization-controls-on-connector-tools)、需要用户交互的工具,以及 `rm` 和 `rmdir` 移除针对[关键路径](/docs/zh-CN/permission-modes#critical-paths)即使允许规则匹配也被拒绝。`PreToolUse` hook 允许也不会清除关键路径移除。276将任何权限提示转换为拒绝,而不调用 `canUseTool`。由 `allowed_tools`、`settings.json` 允许规则或钩子预先批准的工具会正常运行,`default` 模式下不需要批准的调用也会运行,例如在您的工作目录内的文件读取和对 `Agent` 的调用。连接器工具[您的组织设置为 `ask`](/docs/zh-CN/mcp#organization-controls-on-connector-tools)、需要用户交互的工具,以及 `rm` 和 `rmdir` 针对[关键路径](/docs/zh-CN/permission-modes#critical-paths)的删除即使允许规则匹配也会被拒绝。`PreToolUse` 钩子允许也不会清除关键路径删除。
277 277
278**使用时机:** 您想要为无头代理提供固定的、明确的工具表面,并且更喜欢硬拒绝而不是默默依赖 `canUseTool` 不存在。278**使用场景:** 您希望为无头代理提供固定的、明确的工具表面,并且更喜欢硬拒绝而不是依赖 `canUseTool` 不存在的无声依赖。
279 279
280<h4 id="bypass-permissions-mode-bypasspermissions">280<h4 id="bypass-permissions-mode-bypasspermissions">
281 绕过权限模式(`bypassPermissions`)281 绕过权限模式(`bypassPermissions`)
282</h4>282</h4>
283 283
284自动批准工具使用而无需提示,除了下面警告中列出的情况。Hooks 仍然执行,如果需要可以阻止操作。284自动批准工具使用而无需提示,除了下面警告中列出的情况。钩子仍会执行,如果需要可以阻止操作。
285 285
286<Warning>286<Warning>
287 谨慎使用。Claude 在此模式下具有完整的系统访问权限。仅在您信任所有可能操作的受控环境中使用。287 请极其谨慎使用。Claude 在此模式下具有完整的系统访问权限。仅在您信任所有可能操作的受控环境中使用。
288 288
289 `allowed_tools` 不约束此模式。每个工具都被批准,而不仅仅是您列出的工具。这些控制仍然适用:289 `allowed_tools` 不会限制此模式。每个工具都被批准,而不仅仅是您列出的工具。这些控制仍然适用:
290 290
291 * 拒绝规则、显式 `ask` 规则和 hooks 在模式检查之前被评估,仍然可以阻止工具。291 * 拒绝规则、显式 `ask` 规则和钩子在模式检查之前被评估,仍然可以阻止工具。
292 * 连接器工具[您的组织设置为 `ask`](/docs/zh-CN/mcp#organization-controls-on-connector-tools)、需要用户交互的工具,以及 `rm` 和 `rmdir` 移除针对[关键路径](/docs/zh-CN/permission-modes#critical-paths)仍然会通过您的 `canUseTool` 回调。292 * 连接器工具[您的组织设置为 `ask`](/docs/zh-CN/mcp#organization-controls-on-connector-tools)、需要用户交互的工具,以及 `rm` 和 `rmdir` 针对[关键路径](/docs/zh-CN/permission-modes#critical-paths)的删除仍然会转到您的 `canUseTool` 回调。
293 * [跨会话消息保护](/docs/zh-CN/permission-modes#skip-all-checks-with-bypasspermissions-mode)仍然适用。293 * [跨会话消息保护措施](/docs/zh-CN/permission-modes#skip-all-checks-with-bypasspermissions-mode)仍然适用。
294</Warning>294</Warning>
295 295
296<h4 id="plan-mode-plan">296<h4 id="plan-mode-plan">
297 规划模式(`plan`)297 规划模式(`plan`)
298</h4>298</h4>
299 299
300Claude 探索代码库并生成计划而不编辑您的源文件。只读工具在 `default` 权限模式下运行。300Claude 探索代码库并生成计划,而不编辑您的源文件。只读工具的运行方式与 `default` 权限模式相同。
301 301
302文件编辑在规划模式下永远不会自动批准,即使允许规则匹配。它们通过您的 `canUseTool` 回调提示。在 Claude Code v2.1.212 或更高版本上,修改文件的 shell 命令,如 `touch` 和 `rm`,以相同方式到达您的 `canUseTool` 回调。302在规划模式下,文件编辑永远不会自动批准,即使允许规则匹配。它们会通过您的 `canUseTool` 回调提示。 在 Claude Code v2.1.212 或更高版本上,修改文件的 shell 命令(如 `touch` 和 `rm`)会以相同方式到达您的 `canUseTool` 回调。
303 303
304Claude 可能使用 `AskUserQuestion` 在最终确定计划之前澄清需求。请参阅[处理批准和用户输入](/docs/zh-CN/agent-sdk/user-input#handle-clarifying-questions)以处理这些提示。304Claude 可能会使用 `AskUserQuestion` 在最终确定计划之前澄清需求。有关处理这些提示的信息,请参阅[处理批准和用户输入](/docs/zh-CN/agent-sdk/user-input#handle-clarifying-questions)。
305 305
306**使用时机:** 您想要 Claude 提议更改而不执行它们,例如在代码审查期间或当您需要在进行更改之前批准更改时。306**使用场景:** 您希望 Claude 提议更改而不执行它们,例如在代码审查期间或当您需要在进行更改之前批准更改时。
307 307
308<h2 id="related-resources">308<h2 id="related-resources">
309 相关资源309 相关资源
310</h2>310</h2>
311 311
312对于权限评估流程中的其他步骤:312有关权限评估流程中的其他步骤:
313 313
314* [处理批准和用户输入](/docs/zh-CN/agent-sdk/user-input):交互式批准提示和澄清问题314* [处理批准和用户输入](/docs/zh-CN/agent-sdk/user-input):交互式批准提示和澄清问题
315* [Hooks 指南](/docs/zh-CN/agent-sdk/hooks):在代理生命周期中的关键点运行自定义代码315* [Hooks 指南](/docs/zh-CN/agent-sdk/hooks):在代理生命周期中的关键点运行自定义代码