返回博客

Claude Code 多智能体工作流指南:从 1 个到 N 个

Claude Code 多智能体工作流指南:从 1 个到 N 个

你见过那些截图。五个、十个、十五个 Claude Code 智能体在 tmux 中运行,每个都在同一个代码库的不同部分工作。看起来很高效。看起来很激动人心。如果你试过复刻,就知道实际操作远比看起来难得多。

运行一个 Claude Code 智能体很简单。你给它一个任务,它写代码,你审查。两个还能管理,但引入了新问题:它们可能互相踩到对方的改动。五个需要一套系统。没有系统跑十个,那就是带月账单的混乱。

这篇指南讲的就是这套系统。不是多智能体架构的理论。是在真实代码库上运行多个 Claude Code 智能体而不让一切崩塌的实际工作流。

为什么一个智能体不够

单个 Claude Code 智能体能处理的工作量令人惊讶。但它是串行的。当它在实现后端接口时,前端闲着。当它在写测试时,文档落后了。当它在调试构建错误时,三个新功能在队列里等着。

当你意识到大部分软件工作是可以并行的,算法就变了。前端组件和后端 API 接口不共享文件。测试套件和文档更新触及不同的目录。架构评审和 Bug 修复在完全不同的时间尺度上运作。

单智能体开发的瓶颈不是智能体的速度。是流水线的深度。一个智能体意味着同时只能推进一件事。多个智能体意味着多件事同时推进,这改变了一个开发者一天能交付的东西。

工作拆分策略

在打开第二个 tmux 面板之前,你需要决定如何分工。实践中有三种模式可行。

按组件拆分

最简单的方法。智能体 A 拥有 components/,智能体 B 拥有 server/,智能体 C 拥有 lib/。每个智能体在自己的领地工作,绝不触碰外面的文件。

当代码库有清晰的架构边界时效果很好。一个 Next.js 应用,有独立的前端组件、后端 Actions 和共享库,自然沿着这些线拆分。

局限性:跨切面工作。一个需要同时修改 UI、API 和数据层的功能,没法干净地放进单个智能体的领地。解决办法是把功能分解为按组件划分的子任务并排序执行。

按角色拆分

不按代码位置分,按功能分。一个智能体写代码。另一个写测试。第三个负责文档。第四个做代码评审。

这反映了人类团队的工作方式,产出质量更高,因为测试智能体不知道(也不关心)代码有多容易写。它按规格测试,不按作者的假设测试。

权衡是更多的协调开销。测试智能体需要等实现智能体先完成。文档智能体需要等两者都完成。你管理的是一条流水线,不只是并行的工人。

按生命周期阶段拆分

角色拆分的更精细版本。一个智能体负责头脑风暴和规划。另一个实现。第三个验证。工作流经各阶段,每个智能体专精于自己的阶段。

这是我们在 Beadbox 使用的模式。架构师智能体设计,工程智能体实现,QA 智能体独立验证。同一个任务经过多个专家,每个人都添加了通才智能体会遗漏的质量层。完整设置我在我用 13 个 AI 智能体交付软件中写过。

正确的策略取决于你的项目。文件边界清晰的小项目适合组件拆分。质量重要的大项目受益于角色或生命周期拆分。大多数团队最终采用混合方式。

CLAUDE.md 身份模式

理论在这里遇见实现。每个 Claude Code 智能体获得自己的 CLAUDE.md 文件,这个文件是整个多智能体系统中最重要的部分。

一个 CLAUDE.md 定义四件事:

  1. 智能体是什么。 它的角色、专长和领域。
  2. 它拥有什么。 它控制的文件、目录或职责范围。
  3. 它不能碰什么。 防止冲突的显式边界。
  4. 它如何通信。 报告工作和与其他智能体协调的协议。

这是一个真实示例。两个具有互补范围的 Claude Code 智能体:

# CLAUDE.md for Agent: frontend-eng

## Identity
Frontend engineer. You implement UI components, pages, and client-side
logic. You own everything under components/, app/, and hooks/.

## File Ownership
- components/**  (you own these)
- app/**          (you own these)
- hooks/**        (you own these)
- lib/utils.ts    (shared, read-only for you)
- server/**       (DO NOT MODIFY — owned by backend-eng)

## Communication
When you need a backend change, create a task describing what API
you need. Do not implement it yourself.
When done with a task, comment: "DONE: <summary>. Commit: <hash>"
# CLAUDE.md for Agent: backend-eng

## Identity
Backend engineer. You implement server actions, API routes, and
data layer logic. You own everything under server/, actions/, and lib/.

## File Ownership
- server/**       (you own these)
- actions/**      (you own these)
- lib/**          (you own these, except utils.ts is shared)
- components/**   (DO NOT MODIFY — owned by frontend-eng)
- app/**          (DO NOT MODIFY — owned by frontend-eng)

## Communication
When you change a data type in lib/types.ts, notify frontend-eng
by commenting on the relevant task.
When done with a task, comment: "DONE: <summary>. Commit: <hash>"

注意那些显式的 "DO NOT MODIFY" 行。没有这些,智能体会漂移。它们看到一个「帮忙」的机会,去修正一个不属于自己的文件里的拼写错误,然后你突然就有了合并冲突。更糟的情况是,它们悄悄重构了另一个智能体依赖的代码。

身份部分不是装饰。Claude Code 在每个会话开始时读取 CLAUDE.md 并用它来界定行为范围。被告知是「前端工程师」的智能体会自然抵制做后端修改。被告知拥有特定目录的智能体会在修改目录外的文件前先确认。

避免合并冲突

文件级别的所有权,如上面 CLAUDE.md 示例所示,是第一道防线。但不是唯一的。

频繁提交和推送。 一个工作 45 分钟不提交的智能体在制造合并冲突的定时炸弹。在 CLAUDE.md 中指示智能体在完成每个逻辑工作单元后提交。

开始新工作前先拉取。 每个智能体在开始新任务前应该执行 git pull --rebase。在 CLAUDE.md 的启动协议中添加即可轻松执行。

跨切面工作使用功能开关。 当两个智能体需要修改同一个文件时,更安全的做法通常是让一个智能体创建接口或开关,提交并推送,然后第二个智能体拉取并在其上构建。当替代方案是合并噩梦时,串行胜过并行。

风险工作使用独立分支。 如果智能体在做实验性的事情,给它自己的分支。对架构探索或可能不会合入的重构工作特别有用。

实践中,文件所有权规则和频繁提交的组合消除了 90% 的合并冲突。剩下的 10% 发生在 types.tspackage.json 这样的共享文件中,通常很容易解决。

智能体间通信

Claude Code 智能体不能直接对话。没有共享内存,没有消息总线,没有实时通道。这其实是好事。智能体间的直接通信会产生耦合、竞态条件和调试噩梦。

取而代之,通信通过工件进行。三种模式有效:

任务评论

最可靠的模式。智能体 A 完成工作并在共享任务上评论:"DONE: 实现了 /api/users 接口。返回 JSON。Schema 在 lib/types.ts 中。"智能体 B 读取任务评论,确切知道什么可用。

状态更新

每个任务有一个状态:open、in_progress、done、blocked。当智能体 A 将前置任务标记为 done 时,智能体 B(或你,或协调者)知道依赖的工作可以开始了。

文件变更

最简单的形式。智能体 A 在 lib/types.ts 中写了一个 TypeScript 接口并提交。智能体 B 拉取并看到新类型。不需要显式通信,因为代码本身就是消息。

什么不行:试图在智能体之间构建实时消息传递系统。如果智能体 A 需要等待智能体 B 的输出,将其建模为任务间的依赖关系,而不是同步调用。

这就是 Beadbox 要解决的问题。

实时查看整个 agent 队列正在做什么。

Beta 期间免费试用 →

调度循环

需要有人指挥。在多智能体 Claude Code 设置中有两个选择:你手动做,或者指定一个协调者智能体。

手动调度

你维护一个任务列表。给智能体分配任务。检查进度。处理阻塞。这在大约五个智能体时还行得通,之后协调开销就开始吞噬生产力增益了。

典型的手动调度周期:

  1. 早上: 检查什么在进行中、什么被阻塞、什么准备好开始
  2. 分配: 给每个智能体发送带上下文的下一个任务
  3. 监控: 每 10-15 分钟检查智能体输出,寻找卡住的迹象
  4. 解除阻塞: 当智能体遇到问题时,介入或重新分配
  5. 收尾: 一天结束时检查交付了什么,规划明天

在 tmux 中,这看起来就是在面板间切换、读最近的输出、决定每个智能体接下来需要什么。像 gp(在不中断智能体的情况下查看其最近输出)这样的工具有帮助,但你仍然是瓶颈。

协调者智能体

专门指定一个 Claude Code 智能体来给其他智能体分配工作。这个智能体不写代码。它读取任务积压,将工作分配给空闲智能体,检查进度,并以编程方式处理调度循环。

这是我们使用的模式。我们的 "super" 智能体运行巡逻循环:每隔几分钟检查每个活跃智能体,核查任务状态,识别阻塞,在智能体空闲时分配新工作。人类(我)做优先级决策并解决模糊情况。Super 处理后勤。

协调者智能体需要自己的 CLAUDE.md:

# CLAUDE.md for Agent: super

## Identity
Dispatch coordinator. You assign work to agents, monitor progress,
and ensure the pipeline keeps moving. You do NOT write code.

## Responsibilities
- Maintain awareness of all active tasks and their statuses
- Assign ready tasks to idle agents
- Monitor agent progress every 5-10 minutes
- Escalate blockers to the human when agents can't self-resolve
- Verify agents follow the protocol: plan before code, test before done

## Communication
- To assign work: message the agent with task ID and priority
- To check progress: peek at agent's recent output
- To escalate: message the human with context and options

协调者模式比手动调度的扩展性好得多。10 个以上的智能体时,手动协调是全职工作。协调者智能体处理日常后勤,只将需要人类判断的决策上报。

多智能体工作的 tmux 布局

物理布局比你想象的重要。运行多个 Claude Code 智能体的 tmux 配置:

# Create a new tmux session
tmux new-session -s agents -n super

# Split into panes for each agent
tmux split-window -h -t agents:super
tmux split-window -v -t agents:super.1

# Or create named windows (easier to manage at scale)
tmux new-window -t agents -n eng1
tmux new-window -t agents -n eng2
tmux new-window -t agents -n qa1
tmux new-window -t agents -n frontend
tmux new-window -t agents -n backend

超过四个智能体后,命名窗口胜过分割面板。一个屏幕读不了五个面板,但在命名窗口间快速切换很容易。命名约定也重要。eng1eng2qa1 一眼就能扫到。agent-1agent-2agent-3 什么信息都没有。

在各自的工作目录中用各自的 CLAUDE.md 启动每个智能体:

# In the eng1 window
cd ~/project
claude --claude-md ./agents/eng1/CLAUDE.md

# In the qa1 window
cd ~/project
claude --claude-md ./agents/qa1/CLAUDE.md

一个实用建议:保留一个「仪表盘」窗口,它就是一个 shell。用来运行 git log --oneline -10、检查任务状态或在不中断智能体工作的情况下观察它们。这会成为你的指挥中心。

出问题的时候

多智能体工作流以可预测的方式失败。了解故障模式可以避免你付出代价去学习。

两个智能体编辑同一个文件。 通常是因为 CLAUDE.md 中的文件所有权不够具体。lib/utils.ts 是经典的冲突磁铁。解决方案:要么将共享工具文件分配给特定智能体,要么让所有人只读并通过单一所有者路由变更。

智能体沉默了。 遇到了速率限制、错误循环,或者卡在了深层推理链中。检查输出。如果在重试同一个失败命令,终止会话并用更清晰的指令重启。定期健康检查(每 10-15 分钟)能在你浪费一个小时之前捕获这种情况。

上下文窗口填满了。 长时间运行的智能体积累上下文,开始表现变差。每个智能体的 CLAUDE.md 应该包含相应协议:「如果工作超过 90 分钟,保存状态并请求新会话。」实践中,这意味着智能体提交工作、记录中断点,新的 Claude Code 会话从该提交继续。

工作偏离规格。 智能体构建了技术上可用但不符合要求的东西。解决方案是编码前先计划模式:写代码之前,智能体评论其实现计划。你 60 秒内审查计划,在误解变成 500 行差异之前抓住它们。

流水线停滞。 智能体 B 在等智能体 A,但智能体 A 在等你的决定。与此同时,智能体 C 30 分钟前就完成了工作,一直闲着。这是协调失败,不是技术问题。协调者智能体(或你)需要通过监控阻塞和重新分配空闲智能体来保持流水线运转。

我们如何用 Beads 解决这个问题

上述一切用便利贴和美好愿望就能运作。但大约到五个智能体时,非正式的方法开始出现裂痕。你忘了智能体 C 在做什么。搞不清哪些任务被阻塞了。记不住智能体 B 需要的 API 接口是已完成还是刚开始。

这就是 beads 解决的问题。Beads 是一个开源的、本地优先的问题跟踪器。每个任务是一个 "bead",拥有唯一 ID、状态、描述、验收标准、依赖关系和评论线程。全部通过名为 bd 的 CLI 访问,这意味着你的 Claude Code 智能体可以在不离开终端的情况下读写。

使用 beads 的调度循环是这样的:

# See what's ready for work
bd list --status open

# Assign a task to an agent
bd update bb-a1b2 --claim --actor eng1

# Agent reads its assignment
bd show bb-a1b2

# Agent comments its plan before coding
bd comments add bb-a1b2 --author eng1 "PLAN:
1. Add endpoint at /api/users
2. Define UserResponse type in lib/types.ts
3. Write integration test

Files: server/api/users.ts (new), lib/types.ts (modify)
Test: curl localhost:3000/api/users returns 200 with JSON array"

# Agent finishes and comments what it did
bd comments add bb-a1b2 --author eng1 "DONE: /api/users endpoint live.
Returns paginated JSON. Added UserResponse type.

Verification:
1. curl http://localhost:3000/api/users → 200, JSON array
2. curl http://localhost:3000/api/users?page=2 → 200, second page
3. pnpm test → all passing

Commit: 8f3c2a1"

# Agent marks the task done
bd update bb-a1b2 --status closed

每个智能体遵循这个协议:认领、计划、实现、评论 DONE、更新状态。每个 bead 的评论线程成为完整的审计跟踪:发生了什么、为什么、如何验证。

依赖关系防止冲突工作:

# Create a task that depends on another
bd create --title "Build user list component" \
  --deps bb-a1b2 \
  --description "Frontend component that calls /api/users. Blocked until API is live."

依赖任务在 bb-a1b2 完成之前保持阻塞状态。没有智能体会过早拿起它。没人会浪费时间为尚不存在的 API 构建前端。

bd list 命令给你整个流水线的快照:

bd list --status in_progress
# Shows what every agent is actively working on

bd blocked
# 显示等待未完成依赖的任务

bd list --status open --priority p1
# Shows the highest-priority work that's ready to start

这取代了你脑中维护的心智模型。每个任务的状态、每个智能体当前的工作、每条依赖链,全部可以从命令行查询。

扩展可见性

CLI 能用。但在规模上,通过在终端运行 bd list 所能吸收的信息量有限。当八个智能体在三个 Epic 上工作,有十七个未完成任务和十几个依赖关系时,你需要看到工作的形状,而不只是列表。

这就是我们构建 Beadbox 要填补的空白。Beadbox 是一个实时仪表板,位于 beads 之上,向你展示:

  • Epic 树带进度条,让你看到每个功能在所有子任务中的推进情况
  • 依赖关系图,在阻塞工作停滞流水线之前将其浮出水面
  • 智能体活动,展示哪个智能体在做什么,计划和完成评论在上下文中可见
  • 实时更新,因为仪表板监控你的 beads 数据库,智能体更新任务状态时自动刷新

Beadbox 不替代 CLI。你的智能体仍然通过 bd 对 beads 进行读写。Beadbox 给你全局视图,让你能做出判断:哪个 Epic 落后了,哪个智能体需要帮助,瓶颈在哪里形成。

测试期间免费。如果你正在构建这样的工作流,请在 GitHub 上给 Beadbox 加星。

入门指南

不需要十三个智能体就能受益。最小可行设置:

  1. 两个 Claude Code 智能体在不同的 tmux 窗口中,各自拥有定义文件所有权边界的 CLAUDE.md。
  2. 一个任务列表(这个规模下文本文件就够了),让两个智能体都知道在做什么以及下一步是什么。
  3. 提交协议: 两个智能体都频繁提交,开始新工作前先拉取。

当这变得自然之后,添加第三个智能体用于测试或文档。然后考虑协调者智能体。然后采用 beads 进行结构化任务跟踪。在协调痛点增加时扩展系统,而不是之前。

困难的不是工具。是思维方式的转变:从「我在用一个 AI 助手」到「我在管理一个团队」。CLAUDE.md 文件、调度协议、所有权边界:这些是管理实践,不是配置文件。你在建立一个组织,即使团队成员运行在 API 调用上。

从两个智能体和清晰的边界开始。其他一切从这里展开。

Like what you read?

Beadbox is a real-time dashboard for AI agent coordination. Free during the beta.

Share