ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

先计划,再动刀:Claude Code 的 plan 模式为什么适合严肃工程项目

先计划,再动刀:Claude Code 的 plan 模式为什么适合严肃工程项目 1. 为什么严肃工程里Claude Code 需要先计划再动刀写代码最怕的不是改得慢而是改得太快。Claude Code 这类 AI 编程代理能读文件、理解调用链、生成 patch、跑命令、修测试效率确实高。但在一个真实工程仓库里速度一旦失去边界就很容易从「帮我们省时间」变成「帮我们制造事故」。一个看似普通的重构任务可能牵动权限校验、数据库迁移、缓存刷新、前端路由、CI 脚本。代码还没来得及看清楚文件已经被改了一片。所以 Plan before editing 这个工作流很关键。它不是让 Claude Code 变慢而是把修改动作拆成两段先理解再落盘。Claude Code 的 plan 模式进入后Claude 会读取文件、探索代码并提出计划但不会修改源代码直到我们批准计划为止。启动方式也很直接在命令行里使用claude --permission-mode plan会话中也可以通过ShiftTab切换到该模式。我更愿意把 plan 模式看成工程团队里的技术评审前置环节。传统开发里需求来了以后资深工程师很少直接打开文件一顿改。更稳妥的做法是先扫一遍模块边界确认入口在哪里、副作用在哪里、测试怎么补、兼容性会不会断才开始动手。AI 编程代理也一样它不只是代码补全器它可以执行工具、读取仓库、运行 shell 命令、对多个文件做连续修改。plan 模式的价值就在于把「理解仓库」和「改写仓库」隔开。举个离我们很近的场景。假设正在维护一个 SAP Fiori Elements 应用后端是 RAP unmanaged BO前端消费 OData V4 服务。现在要给列表页加一个下载 PDF 的按钮。这个需求听起来像 UI 层小改动但真实工程里它可能涉及 CDS consumption view 的 annotation、behavior action、service binding、前端 extension point、权限对象、后端生成 PDF 的 helper class还可能涉及 draft 状态下是否允许下载。若直接让 Claude Code 开始改很可能它只看到前端按钮忽略后端 action 的事务语义。进入 plan 模式后我们可以要求它先读 consumption view、behavior definition、service definition、UI extension 文件再输出一份修改计划。计划里如果遗漏 authorization check我们在审批前就能把方向拉回来。2. TaoToken 前置把模型接入和权限边界先搭好在真正启用 plan 模式之前需要先把模型接入这一层准备好。Claude Code 本身是一个客户端工具它需要一个可用的模型服务端点。我这边习惯用 TaoToken 来做统一接入官网是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 端点是 https://taotoken.net/api 。它的作用是提供一个兼容的 API 入口让 Claude Code 这类工具可以稳定地调用模型而不需要我们在每个项目里单独配置一堆环境变量。这里要强调一点TaoToken 是正规的 API 服务接入层不是任何形式的灰色中转。我们只是把它当作模型调用的统一入口配合 Claude Code 的权限模式来使用。对于严肃工程项目来说接入层稳定、权限边界清晰比单纯追求速度重要得多。拿到 API Key 的路径是先访问官网进入控制台创建 API Key。控制台地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite API Keys 管理页是 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。创建好 Key 之后把它写进环境变量不要硬编码在项目文件里。# 写入 shell 配置避免每次手动 export echo export TAOTOKEN_API_KEYsk-你的实际Key ~/.zshrc source ~/.zshrc # 验证环境变量是否生效 echo $TAOTOKEN_API_KEY | head -c 8如果你用的是 bash把~/.zshrc换成~/.bashrc即可。这一步看起来简单但很多团队在多人协作时Key 管理混乱会导致权限失控。建议每个开发者用自己的 Key不要共用。3. 可复制配置settings.json 骨架与 permission-mode 参数Claude Code 的权限模式不是靠提示词风格实现的它被放在 permission modes 里和 default、acceptEdits、auto、dontAsk、bypassPermissions 一起构成权限边界。default 模式默认只自动允许读取acceptEdits 可以自动接受文件编辑和常见文件系统命令plan 仍然是只读性质适合在改动之前探索代码库。下面是一份可以直接复制的settings.json配置骨架。这个文件通常放在项目根目录的.claude/settings.json或者用户级的~/.claude/settings.json。我建议项目级和用户级分开项目级放团队约定用户级放个人偏好。{ permissions: { defaultMode: plan, allow: [ Read, Glob, Grep, Bash(git status), Bash(git diff:*), Bash(npm test:*), Bash(pnpm test:*) ], deny: [ Bash(rm -rf:*), Bash(git push:*), Bash(kubectl apply:*), Bash(terraform apply:*), Write(./.env*), Write(./secrets/**) ] }, env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: ${TAOTOKEN_API_KEY} } }这份配置做了几件事。第一把defaultMode设为plan意味着新会话默认进入计划模式不会直接写文件。第二allow列表里放的是只读和低风险命令比如读文件、搜索、看 git 状态、跑测试。第三deny列表里放的是高风险操作比如删除、推送、部署、写密钥文件。第四env里把 API 端点指向 TaoTokenKey 从环境变量读取避免明文。这里有个细节要注意deny的优先级高于allow。也就是说即使某个命令在allow里只要匹配了deny也会被拦截。这个机制对于防止误操作很有用。比如你允许了Bash(git:*)但deny里有Bash(git push:*)那么git status能跑git push会被拦。如果你不想全局默认 plan也可以只在启动时指定# 单次会话进入 plan 模式 claude --permission-mode plan # 或者先正常启动会话中用 ShiftTab 切换 claude # 进入后按 ShiftTab状态栏会显示当前模式ShiftTab会在 default、acceptEdits、plan 之间循环当前模式会显示在状态栏里。这个设计很贴近真实开发节奏轻量修改时可以允许 Claude Code 快一点进入架构决策、跨文件重构、权限调整时立刻切到 plan。4. 验证请求确认 plan 模式真的在拦截写入配置写完之后必须验证它是否真的生效。很多人配了settings.json但没验证结果以为在 plan 模式实际上模型已经在写文件了。下面是一套可复制的验证动作。第一步启动一个 plan 模式会话然后让它做一个明确会触发写入的任务claude --permission-mode plan进入会话后输入这样的提示请阅读当前项目的 package.json 和 src 目录结构然后告诉我如果要新增一个 utils/date.ts 文件你会怎么改。只输出计划不要修改任何文件。第二步观察它的行为。在 plan 模式下Claude 应该只读文件、列目录、给出计划不会创建utils/date.ts。你可以用另一个终端窗口检查# 在另一个终端检查文件是否被创建 ls src/utils/date.ts 2/dev/null echo 文件被创建了plan 模式没生效 || echo 文件不存在plan 模式生效第三步检查状态栏。在 Claude Code 会话里状态栏应该显示plan字样。如果你按了ShiftTab它会循环到default或acceptEdits状态栏也会跟着变。第四步验证 API 接入是否正常。如果模型调用失败plan 模式也无从谈起。可以用一个简单的 curl 请求确认 TaoToken 端点可达curl -s -o /dev/null -w %{http_code} \ -X POST https://taotoken.net/api/v1/messages \ -H x-api-key: $TAOTOKEN_API_KEY \ -H anthropic-version: 2023-06-01 \ -H content-type: application/json \ -d {model:claude-sonnet-4-20250514,max_tokens:16,messages:[{role:user,content:ping}]}如果返回200说明接入正常。如果返回401检查 Key 是否正确如果返回404检查端点路径。这一步能排除大部分「模型没反应」的问题。第五步验证计划审批流程。在 plan 模式下当 Claude 准备好计划后它会展示计划并询问如何继续。你可以选择批准并进入 auto 模式、批准并接受编辑、批准并手动审查每次编辑也可以继续给反馈让它补充计划。批准计划后会话会退出 plan 模式并切换到对应的执行模式Claude 才开始编辑。这里有个很工程化的细节在审批计划前可以按CtrlG把建议计划打开到默认文本编辑器中直接编辑。这个能力对复杂项目特别友好因为很多计划不是简单的同意或拒绝而是要局部调整。比如 Claude 给出的计划里写着要修改OrderService、OrderController、order.test.ts但我们知道团队最近刚把订单校验迁到了PolicyService于是可以在编辑器里把计划改成先检查PolicyService不要直接在 controller 里加业务判断。这样 Claude 后面执行时会沿着我们修正后的方向走。5. 本篇常见错排查plan 模式不生效、误改文件、权限冲突即使配置看起来没问题实际使用中还是会遇到各种坑。下面是我踩过的一些典型问题按现象、原因、解决方式整理。现象一设置了defaultMode: plan但 Claude 还是直接改文件。原因通常是配置层级不对。Claude Code 会合并用户级和项目级配置项目级优先级更高。如果你在用户级设了plan但项目级.claude/settings.json里写了defaultMode: acceptEdits那项目级会覆盖用户级。解决方式是检查两个层级的文件确认没有冲突。另外某些旧版本可能不识别defaultMode字段需要升级到支持 permission modes 的版本。现象二ShiftTab按了没反应状态栏不切换。这通常是因为当前会话是通过--permission-mode plan启动的某些版本下启动参数会锁定模式ShiftTab只能在 default、acceptEdits、plan 之间循环但如果账户启用了 auto 或 bypassPermissions循环顺序会变。解决方式是先确认版本然后在普通会话里测试ShiftTab。如果还是不行检查是否有键盘映射冲突某些终端会把ShiftTab映射成其他功能。现象三plan 模式下 Claude 仍然执行了git push或rm。这说明deny列表没配好或者命令匹配规则写错了。deny里的模式是前缀匹配Bash(git push:*)能拦住git push origin main但拦不住git -C /path push。更稳妥的做法是把高风险命令拆细并且配合defaultMode: plan使用。plan 模式下即使命令在allow里涉及写入的操作也会先请求批准。如果发现它绕过了检查是不是用了bypassPermissions模式。现象四API 请求返回 401 或 403。先检查ANTHROPIC_API_KEY是否从环境变量正确读取。settings.json里写的是${TAOTOKEN_API_KEY}但 Claude Code 是否支持这种变量展开取决于版本。如果不支持需要改成直接读取环境变量的方式或者用 shell 启动时注入ANTHROPIC_API_KEY$TAOTOKEN_API_KEY claude --permission-mode plan另外确认 Key 没有过期也没有被控制台禁用。如果返回 403可能是 Key 的权限范围不够需要在控制台检查。现象五计划审批后Claude 改的文件超出计划范围。这是 plan 模式的一个边界问题。plan 模式保证的是「批准前不写入」但批准后进入执行模式Claude 仍可能根据上下文调整。解决方式是在计划里明确写「只修改以下文件其他文件只读」。如果它超出了用git diff检查然后回滚不需要的改动。更好的做法是批准计划时选择「手动审查每次编辑」而不是「接受编辑」。现象六大仓库里 plan 模式读文件太慢上下文被填满。plan 模式会把探索行为变成可审查过程但大仓库里读太多文件会消耗上下文。解决方式是在提示词里限定范围比如「只读src/auth和src/middleware目录不要读node_modules和dist」。另外可以在settings.json的deny里加上Read(./node_modules/**)和Read(./dist/**)减少无效读取。6. 语义一致 CTA按场景选择下一步plan 模式配置好之后下一步取决于你的具体场景。如果你还在排障和接入阶段建议先看 API Keys 管理和接入文档把 Key 和端点确认清楚API Keys 页是 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。这两个页面能帮你确认端点、鉴权方式和参数格式。如果你只是想先验证模型对话是否正常可以直接用模型对话页面测试https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentchatutm_campaignrewrite 。在这里发一条消息确认模型能正常返回再回到 Claude Code 里配置 plan 模式。如果你打算长期用 Claude Code 做编码和 Agent 任务建议了解 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。它更适合持续性的编码场景配合 plan 模式使用能在效率和可控性之间找到平衡。最后回到工程本身。plan 模式的核心不是保守而是让 Claude Code 在正确的地方聪明。读代码、梳理依赖、提出方案这些工作可以交给模型大量承担。真正落盘之前我们保留审批权。claude --permission-mode plan和会话里的ShiftTab就是这个边界的入口。在轻量任务里速度很重要在复杂仓库里方向比速度更重要。plan 模式把方向校准放在写入之前让 Claude Code 从一个高速代码生成器变成更适合严肃工程环境的开发伙伴。
返回列表