BrainBank
AI 课堂/知识Claude Code Deep Dive

EnterPlanModeTool:进入 Plan Mode

2026/8/2 15:19:09 · 来源

#claude-code#knowledge#plan-mode#state-machine#agent-tool

深入解析 Claude Code 底层 Agent Tool——EnterPlanModeTool:它并非简单的 prompt hint,而是一次运行时状态切换(permission mode → plan),涉及权限更新、上下文重建与主线程流程控制。

它的本质是状态切换,不是提示词切换

EnterPlanModeTool 的作用不是“让模型多想一会儿”,而是把当前会话切到一种新的运行状态:plan

这意味着系统会同时改变:

  • 权限模式
  • 会话目标
  • 用户交互预期

所以它本质上是一个 运行时状态切换工具

关键源码

tools/EnterPlanModeTool/EnterPlanModeTool.ts

import { handlePlanModeTransition } from '../../bootstrap/state.js'
import { applyPermissionUpdate } from '../../utils/permissions/PermissionUpdate.js'
import { prepareContextForPlanMode } from '../../utils/permissions/permissionSetup.js'

真正的核心逻辑在 call()

context.setAppState(prev => ({
  ...prev,
  toolPermissionContext: applyPermissionUpdate(
    prepareContextForPlanMode(prev.toolPermissionContext),
    { type: 'setMode', mode: 'plan', destination: 'session' },
  ),
}))

调用链

模型判断任务过大/过复杂 > EnterPlanModeTool > 更新 permission mode = plan > 准备 Plan Mode 上下文 > 主线程进入规划态

为什么它不能在 agent context 里随便用

源码里有一条硬限制:

if (context.agentId) {
  throw new Error('EnterPlanMode tool cannot be used in agent contexts')
}

这说明 Anthropic 不希望子 Agent 随便把自己切进 Plan Mode,
而是把这种流程控制留给主线程。

它和 AskUserQuestionTool 的关系

Plan Mode 不是闭门写计划。
如果需求没搞清楚,仍然要用 AskUserQuestionTool 先补信息,再继续计划。

小结

EnterPlanModeTool 的价值在于:

它把“先规划再编码”从一种提示习惯,升级成了 Claude Code 运行时里的正式状态机切换。

学习地图

🗺️ Plan Mode 学习路线图

Stage 1 - 理解 Agent State Machine

  • 什么是 Agent Context vs Session Context
  • agentId 的限制意义:子 Agent 不能擅自切换状态

Stage 2 - 掌握 Plan Mode 底层机制

  • handlePlanModeTransition — 会话目标迁移
  • applyPermissionUpdate + prepareContextForPlanMode — 权限 & 上下文重建
  • toolPermissionContext.type: 'setMode' 的结构含义

Stage 3 - 学会在 Agent 生命周期中使用 Plan Mode

  • 何时调用 EnterPlanMode (任务过大/过复杂)
  • 何时回退 AskUserQuestionTool 补全需求
  • 与编码阶段的正确衔接(规划 → Code Action)

Stage 4 - 进阶:自定义 Context 管理

  • 理解 context.setAppState 不可变更新模式
  • 监控权限变更 (toolPermissionContext.mode: 'plan')
  • Sub-Agent 场景下的替代方案

动手实践——分步指南

  1. 安装 Claude Code CLI,打开终端并输入 claude
  2. 发起一个多步骤任务(例如:创建一个待办应用 + 添加样式 + 配置路由)
  3. 在对话中输入你的需求后,观察是否有 Tool Call 自动进入 Plan Mode
  4. 若未主动触发,手动执行工具调用 EnterPlanModeTool(通过代码层或 MCP 插件注入方式)
  5. 查看返回的 toolPermissionContext 变化:mode → 'plan'
  6. 在 plan 状态下用文字描述你的架构设计,确认权限已切换(只读规划权限生效)
  7. 如需补充信息,调用 AskUserQuestionTool 向用户提问
  8. 计划完成后观察主线程自动从 'plan' 切换回 'agent' 编码状态
  9. 对比 plan mode:列出权限模式差异、会话目标更新、交互预期变化(写表格或笔记)
  10. 进阶尝试:将子 Agent 代码设为带有 agentId 的上下文,再次调用 EnterPlanModeTool,观察抛出 Error 的硬限制

三大推荐资源

  1. 1
    Anthropic Claude Code 官方文档

    Claude Code Agent、工具系统、权限与上下文管理的官方权威说明。

    https://docs.anthropic.com/en/docs/build-with-claude/claude-code-overview

  2. 2
    Anthropic AI 工程设计文章:Stateful Planning Agents

    Anthropic 官方博客关于 Agent 规划、状态切换与多步骤任务管理的原理指南。

    https://www.anthropic.com/engineering/building-effective-agents

  3. 3
    claude-code GitHub 仓库

    Anthropic 官方开源的 Claude Code CLI — 可直接查看 EnterPlanModeTool、permissionUpdate 等方法的原厂实现源码。

    https://github.com/anthropics/claude-code

链接由 AI 推荐——使用前建议快速核实。