
用Claude Code写代码时间长了我最大的感受是单步聊天模式看着挺聪明但一到真实项目里就露怯。你说一句它改一句上下文一长就丢三落四改完甚至不知道自己把测试跑挂了。今天这篇想聊的不是基础用法而是让Claude Code真正工程化的三件套——多Agent编排、闭环自愈、Routine脚本化架构。这三样是一体的分工解决复杂度自愈解决可靠性脚本化解决复用性。不管你是刚装好CLI的新手还是已经在折腾第三方模型接入的老手这套思路应该都能给你一些启发。1. 告别单步聊天三种典型低效场景与破局思路1.1 单步聊天的三个隐形天花板先说说为什么单步聊天模式撑不起复杂任务。第一个问题是上下文撕裂。一个跨模块的需求对话进行到二三十轮之后Agent对最开始约束的记忆会明显衰减。你说过这个接口不要动兼容层结果十几轮后它为了修一个报错顺手把兼容层重构了。这不是模型的恶意而是长上下文里的注意力稀释物理规律决定没法靠prompt完全消除。第二个问题是缺乏任务边界。单步聊天里同一个Agent又写代码又写测试又做Code Review什么都会就等于什么都不精。让它改逻辑它可能忘了补测试让它审查代码它又可能开始动手改实现。没有职责边界Agent的任何一步决策都靠碰运气。这不是能力问题是结构问题。第三个问题最容易被忽视没有反馈回路。单步聊天里Agent改完代码默认是改完了就停下。测试跑没跑不知道。改了A有没有弄坏B不知道。出了问题还得人肉去发现问题、定位问题、再把信息手动喂回给Agent。整个循环的时间都花在搬运信息上了真正的有效工作时间少得可怜。1.2 多Agent编排到底在编排什么想明白多Agent编排可以参考一个成熟研发团队的结构项目经理不会自己写全部代码他会把需求拆成任务分给前端、后端、测试、运维再汇总结果。Claude Code里的多Agent编排也是这个逻辑——主Agent扮演项目经理子Agent扮演不同角色的工程师。关键点在于编排不是让好几个Agent同时聊一个话题而是通过明确的角色定义、任务描述和工具权限让每个Agent在一段独立上下文里专心干自己的活。手脚麻利的子Agent在后台跑它的分析主Agent专心调度和汇总。上下文不打架职责不重叠结果可以验证。这也是多Agent编排和多开几个终端窗口各聊各的最本质的区别前者有调度中枢后者是三个脱节的孤岛。1.3 三种编排模式的取舍参考串行流水线是最直观的编排模式适合强依赖任务的场景需求分析完成后产出物喂给架构设计架构设计完成后再交给编码环节。这种模式的好处是每一步的输入输出都很清晰容易定位问题出在哪一环代价是总耗时是所有环节之和。并行扇出适合无依赖任务。比如让三个子Agent分别审查代码的安全性、性能和测试覆盖度各看各的最后汇总。实测下来这类任务用扇出模式能把耗时压缩到原来的三分之一但前提是子Agent之间真的不需要通信否则协调成本比串行还高。主从协同是复杂任务的核心模式也最常用。主Agent作为唯一入口接收你的需求拆解后分发给子Agent等待结果并验证。这个模式真正解决了上下文隔离的问题因为子Agent都有自己独立的对话上下文不会被主干的长历史干扰。2. Claude Code多Agent编排落地目录结构、角色定义与任务调度2.1 子Agent不是玄学是Markdown文件Claude Code里定义子Agent的方式非常朴素在项目的.claude/agents/目录下放一个Markdown文件文件名就是Agent名字Frontmatter里声明角色元信息正文就是它的系统提示词。--- name: bug-fixer description: 专职定位并修复代码缺陷的工程师角色。当出现测试失败或运行时报错时使用。 tools: Read, Grep, Glob, Bash, Edit, Write --- 你是一名资深缺陷修复专家。收到任务后按以下流程执行 1. 通过运行测试或查看日志复现问题记录原始报错信息。 2. 使用工具定位根因禁止在未确认根因前修改代码。 3. 设计最小改动方案修复后运行相关测试用例。 4. 全部通过后输出修复说明包括根因、改动文件和验证结果。这里有个特别容易被忽略的细节tools字段决定了这个Agent的能力边界。如果某个子Agent只负责代码审查就别给它Edit和Write权限只给Read、Grep、Glob。这能防止子Agent说着我建议改这里结果直接动手把代码改了——能力边界本身就是行为约束。另一个细节是description字段。主Agent不读Agent的完整提示词它只看description来决策这个任务该派给谁。所以description要像给项目经理的人力简历那样写清楚适用场景而不是写一堆哲学层面的角色定义。2.2 主Agent调度策略把调度规则写进项目记忆有了子Agent接下来就是让主Agent知道什么时候该用谁。这一步通过项目的CLAUDE.md文件实现它相当于项目的团队手册主Agent每次会话都会加载。# 项目协作规则 ## 任务分发机制 当你收到一个开发任务时按以下规则处理 - 如果任务涉及缺陷修复或测试失败先将问题描述交给 bug-fixer 子Agent处理。 - 如果任务涉及新功能编码先将需求拆解成接口定义和实现方案交给 coder 子Agent。 - 所有子Agent返回结果后你负责验证产出物必要时组织 reviewer 子Agent做代码审查。 - 禁止绕过子Agent直接修改属于其职责范围内的代码。 ## 产出物要求 每个子Agent的产出物必须写入独立文件路径规则docs/agents/agent-name/timestamp.md为什么要求子Agent把结果写入文件而不是只返回摘要因为我踩过一次很深的坑子Agent在它的独立上下文里做了大量分析返回给主Agent的摘要只有几十个字主Agent再做一次转述到达用户这里信息已经衰减得不成样子。让子Agent落盘产出物主Agent可以去读原文这是对抗信息转述衰减最直接的办法。2.3 实测有效的调度提示词片段在实际调用时我会给主Agent一段结构化很强的提示词而不是帮我处理一下这种模糊指令。这里分享一段我目前用着比较顺的调度模板当前任务{任务描述} 验收标准{可验证的完成定义} 约束条件{禁止事项、必须保留的接口、性能底线} 执行步骤 1. 先做任务拆解明确各子Agent的输入产出物与依赖关系。 2. 无依赖的子任务并行分发给{agent1、agent2...}有依赖的子任务按流水线执行。 3. 每个子Agent完成后必须读取其产出文件进行验证。 4. 验证不通过将失败原因整理后回传给对应子Agent重新处理最多重试{2}次。 5. 汇总最终结果时标注每部分的来源Agent和处理时长。这段模板的核心价值不是让Agent更聪明而是让任务的前置条件、验收标准和执行边界一开始就明确。Agent最怕的不是问题难而是验收标准模糊——做得对不对全靠猜。2.4 编排调试如何观察Agent之间的协作过程多Agent编排不是写完配置就完事了调试环节同样重要。我常用的方法是在终端里加--debug参数开启详细日志观察主Agent到底把子任务派给了谁以及它有没有执行我期望的验证逻辑。如果发现主Agent频繁把本该给子Agent的任务自己干掉了问题大概率出在CLAUDE.md的规则描述不够强制比如用了可以而不是必须。还有个实用技巧是检查子Agent的工具调用日志。如果某个子Agent的Edit被频繁调用但产出文件里改动不大说明它的角色定位可能跑偏了——分配给它的是分析任务它却在改代码。这时候回到Frontmatter里收紧tools比在prompt里喊一百遍你别乱改代码管用得多。3. 闭环自愈让Agent自己发现问题、自己修复、自己验证3.1 自愈的本质是反馈回路闭环自愈概念并不复杂核心是一条反馈回路执行验证发现失败定位诊断实施修复重新验证循环往复。把它看作恒温器就好理解了——温度低了就加热温度到了就停止这中间不需要人盯着。对应到Claude Code的场景里最常见的反馈信号就是测试失败。理想的闭环是Agent完成代码修改后自动运行测试发现失败自动读取报错信息并判断是自己改坏的还是原本就存在的问题然后修复并再次验证。整个循环不需要你手动参与。3.2 用两级手段搭建自愈链路自愈机制的落地可以分成两层。第一层是Prompt层面的流程约束写进CLAUDE.md# 自愈工作流 完成代码修改后必须执行以下闭环 1. 运行 npm test 或指定测试命令获取测试输出。 2. 若测试失败先判断错误来源是本轮改动导致还是存量失败。 3. 若是本轮改动导致分析根因并修复重新运行测试。 4. 同一问题最多尝试修复 3 次超过次数后停止并报告。 5. 存量失败不强行修复记录失败用例和可能原因后继续。这层约束成本为零效果立竿见影。它能让Agent在改完就跑的习惯里停下来补上验证环节。很多单步聊天里的改坏了自己不知道就是缺了这么一句约束。第二层是Hook层面的硬性自动触发。Claude Code的Hooks机制允许你在特定事件节点挂shell脚本其中对自愈最有价值的是Stop和PostToolUse两个事件。3.3 用Hook实现停下就验证在.claude/settings.json里配置一个StopHook让Agent每次结束输出后自动跑测试{ hooks: { Stop: [ { matcher: , hooks: [ { type: command, command: bash scripts/self-heal.sh || exit 0 } ] } ] } }配套的self-heal.sh脚本长这样#!/bin/bash # 自动测试入口检测到失败时提示Claude Code处理 OUTPUT$(npm test 21) EXIT_CODE$? if [ $EXIT_CODE -ne 0 ]; then echo [SELF-HEAL] 检测到测试失败请修复以下问题 echo $OUTPUT | tail -50 # 非零退出码会触发Claude Code的后续处理逻辑 exit 1 fi echo [SELF-HEAL] 测试通过 exit 0这个脚本的核心思路是把测试结果实时反馈给Agent。Hook失败时Claude Code会看到一条检测到测试失败的提示从而进入修复流程而不是把自己当成无事发生。它把人肉盯着测试结果再告诉Agent这个环节自动化了。3.4 自愈的边界哪些场景必须人工介入闭环自愈不是银弹我总结了几类必须强制人工确认的场景。第一是涉及删除数据、覆盖文件、修改数据库结构等破坏性操作时Hook脚本里不应自动执行要在Prompt中强制Agent先征求用户确认。第二是当修复尝试超过3次仍失败时继续让Agent徒劳地硬试只会浪费时间和token应该立即停止并输出完整的失败上下文由你判断是方向错了还是需求本身有歧义。第三是安全相关的问题比如代码里涉及密钥、越权、注入风险这类问题不要让Agent自己在循环里边想边修必须停下来人工审查。还有一类非常隐蔽的边界自愈回路里的验证条件本身可能是错的。如果测试用例本身写得就不对或者测试环境有问题Agent根据错误信息反复修代码根本是在跟风车搏斗。所以我实际落地时会规定一套存量失败清单让Agent先比对当前失败是不是已知的存量问题是的话直接跳过而不是无限循环。4. Routine脚本化架构把高频工作流固化成可复用资产4.1 为什么需要Routine脚本化多Agent编排解决的是单次复杂任务的执行质量闭环自愈解决的是执行过程的可靠性但这两样都没解决复用的问题——同一个流程这次配置好了下次需求稍微变一变又得重新编排一遍这就轮到了Routine脚本化。脚本化的思路是把一类高频任务的处理流程固化成可重复执行的资产。常用场景包括提交代码前的全量检查、版本发布前的准备清单、新接手的项目环境初始化、每日代码审查、依赖升级后的兼容性验证。目标只有一个让一条命令替代一长串对话和操作。4.2 脚本化的基石Claude Code的非交互模式Claude Code支持以非交互模式运行这是脚本化架构的基石。你可以通过-p参数直接给Agent下达任务配--output-format json拿到结构化输出用--allowedTools控制它能调用哪些工具。这意味着Claude Code不再只是终端里你问我答的工具而是一个可以被shell脚本、定时任务、CI流水线调用的编程组件。claude -p 读取当前Git分支的diff审查是否存在安全风险和边界条件缺失输出审查报告 \ --allowedTools Read,Bash,Grep \ --output-format json \ review-report.json这个能力把Agent从需要人盯着的交互工具解放出来变成按脚本指令执行的自动化组件。系统可以定时跑CI流程可以调甚至可以在提交前通过pre-commit钩子自动触发。4.3 一个标准Routine脚本的结构拆解以一个每日代码审查Routine为例完整脚本结构分三层#!/bin/bash # 每日代码审查自动拉取最新代码执行静态检查调用Claude Code审查 set -euo pipefail # 第一层入参与环境准备 BRANCH${1:-develop} OUTPUT_DIRdocs/reviews/$(date %Y%m%d) mkdir -p $OUTPUT_DIR # 第二层核心任务委托 claude -p 审查分支 $BRANCH 相比主分支的变更聚焦以下几点 1. 是否存在潜在的空指针、资源泄漏 2. 是否存在SQL注入或安全校验缺失 3. 边界条件与异常处理是否完备。 审查结果写入 $OUTPUT_DIR/review.md每个问题标注严重级别和修改建议。 \ --allowedTools Read,Bash,Grep \ --output-format json \ $OUTPUT_DIR/raw-response.json # 第三层结果后处理与通知 if [ -f $OUTPUT_DIR/review.md ]; then echo 审查完成报告已生成$OUTPUT_DIR/review.md else echo 审查异常原始响应见 raw-response.json exit 1 fi结构很清晰准备阶段确定环境与目标执行阶段通过claude -p非交互模式委托任务收尾阶段验证产出物并处理异常。这里有一个我踩过的小坑set -euo pipefail一定要加上否则中间某一步失败脚本也会继续往下跑最后生成一个残缺报告你都不知道。4.4 Routine与编排、自愈如何联动这三者真正结合在一起的形态是一个Routine脚本调度一个多Agent流程流程中的每一步都自带验证和自愈回路。比如发布前检查这个Routine脚本对外是一条命令对内是这样一条链路脚本先调用Claude Code主Agent主Agent收到发布检查任务后按CLAUDE.md的规则把安全审查分给安全子Agent把依赖兼容性分析分给依赖子Agent把测试覆盖检查分给测试子Agent。每个子Agent的任务描述里都带有一句自愈指令如果验证不通过必须自行诊断并修复最多重试2次否则输出失败报告。脚本的收尾环节再检查所有子Agent的产出文件是否齐全、最终结论是否通过。这就是我理解的脚本化架构——不是简单地把某一段对话固化成命令而是把一套包含分工、验证、反馈、兜底的完整流程打包成了可重复调用的执行单元。5. 模型接入实战换掉Claude模型接DeepSeek、Qwen、GLM或本地模型5.1 为什么要换模型以及兼容层原理把模型换成DeepSeek、Qwen或者GLM出发点一般是两个成本和隐私。Claude的API按token计费重度使用场景下费用不低而DeepSeek这类模型价格低一个量级。隐私方面某些项目的代码根本不允许出内网那唯一的出路就是把模型跑在本地。换模型的原理其实很直白。Claude Code本身不是模型它是个客户端框架通过Anthropic定义的消息格式和模型API通信。所以只要某个模型服务能假装成Anthropic API的样子——接收同样的请求体、返回同样的格式——Claude Code就认。DeepSeek、Qwen、GLM这些模型的服务商要么原生支持要么通过兼容层提供了这种接口本地模型则要通过一层转换工具把Anthropic格式翻译成OpenAI兼容格式。5.2 用cc switch接入DeepSeek、Qwen、GLMcc switch是社区里常用的模型切换工具本质是一个配置管理器。它维护一份模型服务配置列表每个配置里有API地址、模型名称、密钥占位符等你在列表里选择目标服务它会把Claude Code的配置文件替换成对应的接入配置。# 全局安装cc switch npm install -g cc-switch # 启动交互式配置 cc-switch # 对接DeepSeek时的配置思路按交互提示填写 # Provider: DeepSeek # API Base: https://api.deepseek.com/anthropic # 模型名: deepseek-chat实操中有三件事值得注意。第一新模型接入后必须重新启动Claude Code会话再测试因为配置在会话启动时加载。第二API Base地址一定是服务商提供的Anthropic兼容端点不是它原有的OpenAI端点格式。第三这些模型和Claude本尊的能力模型不一样反映到实际体验中DeepSeek在代码生成和推理方面的表现比较扎实Qwen的上下文理解不错GLM对中文场景友好。它们都值得尝试但别指望行为和Claude完全一致。5.3 接入LM Studio本地模型的配置要点本地模型的接入方式稍有不同。LM Studio启动后会在本机提供一个OpenAI兼容的API服务和cc switch直接换API端点不太一样。我这里提供一个稳妥的落地思路在本地启动LM Studio服务记住它的服务端口通过cc switch的自定义Provider配置把Anthropic兼容端点指向本地路由服务这个本地路由服务负责将Anthropic格式的请求转换为OpenAI兼容格式再转发给LM Studio。配置完成后做个基础探查# 确认模型服务状态 curl http://localhost:1234/v1/models # 确认Claude Code能通过ANTHROPIC_BASE_URL访问路由层 echo $ANTHROPIC_BASE_URL接入本地模型有几个现实预期要摆正7B到14B参数量的本地模型在单轮对话和简单代码生成上表现尚可但放到多Agent编排和闭环自愈这种长链路任务里语义保持能力和工具调用准确率会明显下降尤其是要处理大段跨文件上下文时。我的建议是从一个最小Routine开始跑——比如单文件的代码格式化与静态检查——先把链路跑通再逐步上复杂度。不要一上来就让它处理跨八个文件的架构重构你会被兜底修复的次数吓到的。5.4 模型接入的常见翻车场景接口报错是最常遇到的翻车场景最常见的提示是404、401、或者模型名不存在。404基本是API Base地址填错了401是密钥没配对模型名报错则是模型标识符和服务的实际注册名不一致。排查路径并不复杂先用curl手动构造一个最小请求打给目标服务验证服务可用再检查Claude Code侧配置最后一层一层往上排查。另一个翻车点是配置改了但没生效。Claude Code启动时会缓存一些配置改动cc switch配置后光重启终端还不够要把整个会话进程全部退出重新启动。我在这个问题上浪费过不少时间改完配置怎么看都没生效最后发现是旧会话进程没杀干净。6. 常见问题与排查实录6.1 安装与运行环境速查安装Claude Code最主流的路径是通过npm全局安装npm install -g anthropic-ai/claude-codeWindows环境下的兼容性提示比较典型。如果你用的是较老的系统或Node版本安装时可能遇到与64位版本的Windows不兼容之类的提示绝大多数情况是Node版本过旧。建议先将Node升级到当前LTS版本以上再重跑安装命令。macOS和Ubuntu环境大都不会卡安装环节真正容易出问题的是登录认证环节显示Claude Code可能不可用之类的提示时先确认你的账号区域和网络配置处于官方支持范围然后检查系统时间、时区是否正确再重新尝试认证。还有一个低调但实用的小技巧装完后先跑claude --version确认可执行文件路径正确再跑claude进入交互模式。很多装了敲了没反应的问题其实是npm的全局bin目录没有加到PATH里。6.2 订阅和权限报错处理有一类报错在实际使用中出现频率不低your organization has disabled claude subscription access for Claude Code。出现这个提示说明你的账号带有组织属性而该组织在控制台里关闭了Claude Code的订阅权限。这种问题不在本机代码层面解决需要到组织管理后台检查Claude Code的接入策略或使用个人账号完成认证。简单来说这不是技术配置能绕开的限制按组织的账号策略调整就行。不注册账号和注册账号的区别也是一个高频迷惑点。不注册的话Claude Code可以用但很多高级能力——比如多Agent编排里的完整subagent调度、Hooks事件触发、更长的上下文处理——都是受限的。如果你是想认真用这套多Agent编排架构直接注册完整账号并完成订阅一步到位省得中途发现功能受限再回头补课。6.3 VS Code与桌面版的配置要点VS Code接入Claude Code主要通过官方插件完成。需要明确的是VS Code插件本身不包含模型能力它在后台调用你已安装的Claude Code CLI。所以正确的操作顺序是先在终端里装好CLI并完成认证再安装VS Code插件插件会自动识别终端里的CLI。如果在VS Code里提示找不到Claude Code大概率是CLI的全局安装路径IDE进程没读到重启IDE并确保PATH配置正确即可。桌面版则可以理解为自带独立界面的完整版Claude Code适合不太喜欢在终端里操作的人。桌面版和CLI共用同一套认证凭据但它们的会话历史、设置项不互通。如果你在CLI里配好的模型路由切到桌面版没生效去桌面版的设置里检查模型配置是否还是默认状态这是最常见的桌面版为什么和自己CLI配置不一样的原因。两组环境切换时会踩的坑是认证状态不一致。VS Code插件用的是它捕获到的CLI认证状态桌面版有独立的认证流程。建议固定一条主路径要么全部围绕CLI操作桌面版只当会话查看器要么主用桌面版CLI只用来做Routine脚本调用——别混着用混着用的排查成本远高于单一环境。6.4 调试技巧让Agent说出它的决策过程最后分享一个排查问题时的通用技巧给Agent的提示词里加一行请在关键决策点用一句话说明决策原因。比如为什么把这个子任务分给bug-fixer而不是coder为什么认为测试失败是存量问题这样Agent的输出里就有了可追溯的决策痕迹。当结果异常时你能顺着它留下的解释找到问题出在调度层、提示词层还是模型理解层而不是面对一个知其然不知其所以然的结论干瞪眼。我自己在实操中最深的体会是这三件事——多Agent编排、闭环自愈、Routine脚本化——本质上不是三个技巧而是一套工程思维的三个侧面用分工化解复杂度用反馈回路消化不确定性用脚本固化经验形成积累。对刚上手的用户别急着一次性铺开所有能力先定义两个子Agent配置一个测试Hook固化一个最常用的小脚本把最小闭环跑通再逐步扩。这个工具真正值钱的不是它每次回答有多聪明而是当你的项目、你的团队、你的工作习惯和这套架构长在一起之后它就不再是聊天工具而是你团队里一个知根知底、随时待命、还不会抱怨加班的工程师。