资讯动态

基于 Claude Code 做项目开发:工作流搭建 + 避坑清单

发布时间:2026/10/14 16:38:10 来源:尧图企业网站定制
为什么你需要一套工作流而不是一个更聪明的提示词2026 年Claude Code 已经不再是一个“终端里的聊天框”。它能读文件、跑命令、改代码、开 PR甚至能自己生成调度脚本派生出几十个独立子智能体并行干活。但大多数开发者的用法仍然停留在“打开终端描述需求等它写代码发现不对再解释一遍”。这就像拿到一台数控机床却当手电钻用。问题的根源在于Claude Code 的核心约束不是模型能力而是上下文窗口。你的整个对话——每条消息、Claude 读过的每个文件、每条命令的输出——都塞在同一个窗口里并且填充速度极快。一旦窗口接近满载Claude 会开始“遗忘”早期的指令犯更多错误推理质量明显下降。单次对话能承载的任务复杂度是有天花板的。要突破这个天花板你需要把“跟 AI 聊天”变成“给 AI 搭一套工作系统”。这篇文章拆解的就是这套系统从项目规则怎么写到专项流程怎么配到多智能体怎么编排最后附上一份真实踩过的坑清单。第一层让 Claude 知道“这个项目怎么干”CLAUDE.md写少了没用写多了有毒每个 Claude Code 项目都需要一个 CLAUDE.md。问题在于大多数人要么不写要么写成了项目百科。文档里有一句话说得极其精准“对于每一行问自己移除这一行会导致 Claude 犯错吗如果不会就删除它。臃肿的 CLAUDE.md 会导致 Claude 忽略你的实际指示。”CLAUDE.md 的正确用法是只放 Claude 无法从代码本身推断出来的信息。什么是无法推断的构建命令、测试运行器、分支命名规范、项目特有的架构决策、已知的坑。什么是可以推断的“使用 React”“写干净的代码”“遵循标准命名约定”——这些 Claude 读几行代码就知道写进去只是浪费上下文。关键实践分层配置而不是一个巨型文件。在 monorepo 或大型代码库中根目录的 CLAUDE.md 应该只放“指针和关键陷阱”每个子目录有自己的 CLAUDE.md 说明局部约定。Claude 会自动沿目录树向上加载所有 CLAUDE.md所以根级上下文永远不会丢失但也不会在每个任务中重复加载无关信息。还有一个被低估的技巧用 permissions.deny 阻止 Claude 读取生成代码和第三方库。如果你的项目里有 vendored SDK 或 committed 的生成文件Claude 的内容搜索会尊重 .gitignore 但不会自动排除这些已签入的目录。在 .claude/settings.json 中加入 deny 规则团队每个人都会获得同样的降噪效果而不需要各自配置。给 Claude 一个“通过/失败”的信号Claude 有一个根本性的行为模式当工作看起来完成时它会停止。如果没有它可以运行的检查“看起来完成”就是唯一的信号你就成了验证循环本身——每个错误都要等你注意到它。解决办法是给 Claude 一个它能自己运行的验证命令。测试套件、构建退出码、linter、一个比较输出与固定装置的脚本、甚至浏览器截图对比——任何能返回通过或失败信号的东西。这不是“建议 Claude 跑测试”而是把验证变成工作流的确定性门禁。Stop hook 可以配置为如果检查不通过阻止对话结束Claude 必须继续工作。/goal 条件则让单独的评估器在每次转换后重新检查Claude 持续迭代直到目标解决。实践中的区别很大。你说“实现一个 validateEmail 函数”Claude 写完就停。你说“实现 validateEmail测试用例userexample.com 返回 trueinvalid 返回 falseuser.com 返回 false跑测试直到全部通过”Claude 会自己跑测试、读失败信息、修复、再跑直到绿灯。第二层把重复流程固化为 SkillSkill 的三层加载机制Skills 是 Claude Code 最被低估的能力。它的设计巧妙之处在于渐进式加载元数据层name description始终在上下文中成本几乎为零SKILL.md 正文在触发时才加载references/ 和 scripts/ 目录按需读取没有大小限制。这意味着你可以注册几十个 Skills但只有被触发的那一个会占用上下文。description 字段是 Skill 能否被正确调用的关键。写“Provides guidance for testing”这种泛泛的描述Claude 可能永远不主动触发。正确写法是把触发场景写死“This skill should be used when the user asks to ‘generate tests’, ‘write tests for’, or ‘add test coverage’。” 用第三人称列出具体触发短语Claude 才能精准匹配。一个真实 Skill 的结构以测试生成 Skill 为例目录结构如下gen-test/ ├── SKILL.md ├── examples/ │ ├── unit-test.ts │ └── integration-test.ts └── references/ └── testing-conventions.mdSKILL.md 的 frontmatter 中disable-model-invocation: true意味着只有用户显式输入/gen-test才触发防止 Claude 在不该生成测试时自作主张。正文控制在 2000 字以内真正的示例代码放在 examples/ 目录中按需读取。Skill 还支持动态上下文注入。在 SKILL.md 中写!git branch --show-current加载时会执行命令并把输出替换进去。这样 Claude 拿到的不是静态文档而是实时的项目状态。典型 Skill 场景代码审查内置团队编码规范和检查清单提 MR 前跑一遍格式、命名、规范类问题基本清干净部署工具从 Makefile 自动探测参数处理交叉编译调用 DevOps 平台 CLI日志查询内置查询脚本自动探测 appid/service 路径防上下文爆炸地拉取错误日志这些 Skill 的共同特征是有明确的输入输出、有固定的操作步骤、有可验证的结果。凡是满足这三条的重复性工作都值得做成 Skill。第三层用 Subagent 隔离上下文用 Workflow 编排并行为什么需要 Subagent单会话执行复杂任务时Claude Code 会出现三类典型失效智能体惰性——面对多步骤任务框架容易提前判定完成跳过大量待处理项。比如完整项目安全审查只做了七成内容就停止输出。自我偏好偏差——单上下文内 Claude 倾向采信自己前期的结论自主校验环节不会客观反驳已有观点。目标漂移——多轮交互和上下文压缩过程中原始约束逐步丢失执行方向偏离初始需求。Subagent 的核心价值是上下文隔离。每个 Subagent 有独立的上下文窗口只聚焦单一细分目标完成后只把最终结果返回给父级。父级的上下文不会被中间过程污染。何时用 Subagent何时用 WorkflowSubagent 适合需要独立探索但结果可以汇总的任务。比如“读一个子系统把发现写到文件里”然后主 Agent 带着完整图景去编辑。Workflow 适合任务规模超过单个 Agent 能在一个上下文中保持的程度或者相同步骤需要在大量文件上重复执行。一个典型的 Workflow 模式是扇出-综合use a workflow to audit every route handler under src/routes/ for missing authentication checks, and adversarially verify each finding before reporting itClaude 会为每个 route handler 派生一个独立子智能体并行审计然后由一个综合 Agent 收集所有发现去重、排序、验证。另一个高频模式是持续修复直到检查通过use a workflow to run npx tsc --noEmit and keep fixing the reported errors until the type check passes or two rounds in a row make no progressWorkflow 自动处理循环、重试、中断恢复。执行到一半中断了重新启动可以从断点继续因为中间结果结构化存储了。对抗验证让“另一个 Claude”来挑毛病Workflow 最强大的模式之一是对抗验证。每一个产出子智能体都配套一个独立的校验子智能体按照预设标准反向核查结论主动找漏洞和逻辑矛盾。这解决了一个根本问题做工作的 Agent 不应该同时是给它评分的 Agent。一个新鲜的模型实例尝试反驳结果比同一个上下文里的自我检查可靠得多。在代码审查场景中这意味着每个文件的审查由一个 Agent 完成另一个 Agent 尝试找出被遗漏的问题或质疑已有的判断。两者的发现交给第三个 Agent 做最终裁定。避坑清单真实踩过的坑坑一SKILL.md 写成了小说SKILL.md 的正文在触发时整体加载进上下文。写一个 8000 字的 SKILL.md每次触发都吃掉大量 tokenClaude 的推理质量明显下降。正确做法正文控制在 2000 字以内详细内容拆到 references/ 目录按需读取。问自己“这段内容每次触发都需要吗”如果不是就拆出去。坑二description 写得太泛description: Provides guidance for testing这种描述Claude 永远不会主动触发。必须用第三人称列出具体触发短语把场景写死。坑三在 monorepo 根目录启动 Claude在大型 monorepo 中从仓库根目录启动 Claude Code 看起来方便实际上让 Claude 每次都要在数百个顶层目录中导航。正确做法是从子目录初始化Claude 会自动向上加载根级 CLAUDE.md但你的任务上下文被精确限定在相关范围内。坑四忽略了自动压缩的“抖动”当看到Autocompact is thrashing: the context refilled to the limit...时说明自动压缩成功了但某个文件或工具输出立即又把上下文填满了连续多次。Claude Code 会停止重试以避免浪费 API 调用。恢复方法让 Claude 以小片段读取超大文件而不是整个文件用/compact keep only the plan and the diff清理无关输出把大文件操作移到 Subagent 中执行。坑五让 Claude 在没有“安全网”的情况下改代码Claude Code 的自动模式会阻止明显危险的操作但它不是万无一失的。最安全的做法是为 Claude 提供一个它能自己运行的验证命令然后让它在循环中迭代直到通过。这比人工审查每一行改动高效得多也比盲目信任可靠得多。坑六忘了用 CLI 工具Claude 知道如何使用gh、aws、gcloud等 CLI 工具。如果你使用 GitHub安装ghCLI 并告诉 Claude 使用它来创建 issue、开 PR、读评论。没有ghClaude 仍然可以用 GitHub API但未认证请求经常撞上速率限制。坑七在上下文接近满时继续工作当上下文窗口即将满时Claude 会开始“遗忘”早期的指令。不要忽视这个信号。在主要任务之间关闭并重启 Claude Code或者用/compact主动压缩。一个干净的上下文比一个塞满的上下文高效得多。把所有这些装进一个真实项目假设你在开发一个后端服务技术栈是 Go tRPC。完整的工作流配置如下根目录 CLAUDE.md技术栈、构建命令、分支命名规范、已知的坑。不超过 30 行。子目录 CLAUDE.md每个 service 目录有自己的测试命令和局部约定。Skillscode-review团队 Go 编码规范 检查清单提 MR 前运行dtools部署工具集成自动从 Makefile 探测参数galileo-log-query日志查询内置防上下文爆炸机制HooksStop hook 绑定测试命令测试不通过阻止对话结束Pre-commit hook 自动运行格式化Subagents一个只读的 Explore agent用于探索不熟悉的代码区域避免污染主上下文一个 Code Reviewer agent用于对改动做独立审查Workflow用于大型迁移扇出模式迁移所有组件文件每个文件在隔离副本中转换对抗验证模式审查每个改动文件合并去重后生成排序摘要这套配置的核心哲学是把 Claude 当成一个需要清晰工作系统的工程师而不是一个需要更聪明提示词的聊天机器人。最后的建议Claude Code 的文档里有一句话值得反复读“大多数最佳实践都基于一个约束Claude 的上下文窗口填充速度很快随着填充性能会下降。”你做的每一个配置决策——CLAUDE.md 写什么、Skill 拆多细、什么时候用 Subagent、什么时候开新会话——本质上都在回答同一个问题如何让 Claude 在正确的上下文中做正确的事而不被无关信息淹没。从一个小项目开始。写一个精简的 CLAUDE.md做一个 code-review Skill配一个 Stop hook 跑测试。用一两周时间感受变化然后逐步扩展。工作流的价值会随着项目复杂度的增长而复利。今天花两小时搭的系统三个月后会帮你省下几十小时的反向沟通。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑