Claude Code Tools 研究系列(三)—— ExitPlanMode:把方案提交给用户批准

💡 原文中文,约6300字,阅读约需15分钟。
📝

内容提要

ExitPlanMode是Claude Code中用于在规划模式完成后提交方案供用户批准的工具。它通过展示完整方案、提供批准/修改/驳回三种明确响应,实现从规划到执行的安全切换。该工具不接收方案内容参数,仅发送信号,由运行时处理渲染和状态切换。它与AskUserQuestion和EnterPlanMode形成完整协作流程:澄清、展开、拍板。

🔎

延伸解读

空 schema 的设计哲学

ExitPlanMode 的 input_schema 几乎为空,仅有一个已弃用的 allowedPrompts 字段。这种设计将权限和状态切换完全收敛在 runtime,Claude 只发送一个信号,不传递任何方案内容。这体现了 Unix 哲学:工具只做一件事,且做到极致。同时,弃用 allowedPrompts 也反映了权限设计从“批准即授权”向“批准归批准,授权归授权”的演进,更符合安全最小化原则。

与 AskUserQuestion 的边界

官方明确禁止用 AskUserQuestion 询问“方案是否 OK”,因为 ExitPlanMode 本身就是请求批准的语义。这划清了两者的边界:Ask 用于澄清具体分叉(如选 A 还是 B),而 ExitPlanMode 用于对完整方案的整体批准。在流程上,应先澄清再批准,避免边澄清边请求批准,确保决策的线性收敛。

触发条件的严格性

ExitPlanMode 的触发条件非常严格:必须在 plan mode 中、plan 文件已写完、且准备接受用户批准。对于纯研究任务或方案未定型的情况,不应调用。这强调了“可被引用的方案才配触发”的判断线,即方案必须是一份可读、可审阅、可反驳的文档,否则应继续在 plan mode 中探索。

Q&A

ExitPlanMode 在 Claude Code 中有什么作用?

ExitPlanMode 是 Claude Code 中用于在规划模式完成后提交方案供用户批准的工具。它触发一次批准/驳回的确认,让用户看到完整方案并决定是否执行、修改或驳回,从而实现从规划到执行的安全切换。

ExitPlanMode 与 AskUserQuestion 和 EnterPlanMode 如何协作?

三者形成完整协作流程:AskUserQuestion 用于澄清具体分叉(如 A 还是 B),EnterPlanMode 进入只读探索并展开方案,ExitPlanMode 让用户对整个方案做批准/修改/驳回,实现拍板。

为什么 ExitPlanMode 不接收方案内容参数?

因为方案内容已写入 plan 文件,UI 会从该文件读取并渲染,无需通过参数传递。这样既节省 tokens,也确保 UI 展示与 plan 文件一致。

在什么情况下不应该使用 ExitPlanMode?

不应在纯研究任务(如搜索并理解代码实现)、方案未定型或想进行一般性询问时使用。官方强调,只有当你处于 plan mode、已写完 plan 文件并准备好接受用户批准时才应调用。

ExitPlanMode 如何解决方案淹没在聊天中的问题?

UI 会从 plan 文件读取内容,渲染成独立、结构化、可滚动的方案视图,而不是聊天中的一段话,使用户能清晰审阅方案。

用户批准 ExitPlanMode 后会发生什么?

用户批准后,Claude 自动回到默认模式,Edit/Write/NotebookEdit 等工具变为可用,CWD 相关缓存刷新,Claude 收到显式批准信号并开始按 plan 执行。

为什么不能使用 AskUserQuestion 来询问方案是否可行?

因为 ExitPlanMode 本身就是请求用户批准方案的工具,使用 AskUserQuestion 询问“方案 OK 吗”在语义上等价,但用户看不到完整方案,相当于在真空里投票,毫无意义。

🏷️

标签

➡️

继续阅读