Files
claude-code/docs/outline-output/user/06-agents-plan-tasks.md
2026-06-15 16:51:29 +08:00

301 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 第六章:让 Claude 帮你跑大任务 -- 子代理、Plan 模式、Task 系统
> 当任务太大、一步做不完时,如何让 Claude 自己拆分、规划和并行推进。
## 什么时候该"升级"任务处理方式
日常对话中,你给 Claude 一条指令,它执行一次就完成了。但有些任务天然不适合一口气干完:代码库迁移涉及几十个文件、排查 bug 需要同时在多处搜索、重构需要先理清依赖再动手。在这些场景下,三个工具能帮你把大任务拆小:**子代理Agent** 处理独立的子任务,**Plan 模式** 先想清楚再动手,**Task 系统** 跟踪进度和依赖。
一个简单的判断标准:如果你发现自己反复对 Claude 说"再看看那个文件"、"顺便改一下这个",说明这个任务已经需要拆分了。
## 子代理:让 Claude 派一个"分身"去干活
Claude Code 有一个 Agent 工具,允许 Claude 在对话过程中派生出子代理来处理子任务。子代理有自己的上下文和工具集,完成后会把结果汇报给主对话。你不需要手动启动子代理 -- 当 Claude 判断某个子任务适合独立处理时,它会自动使用 Agent 工具。
### 内置的子代理类型
Claude Code 内置了几种专门化的子代理,各有分工:
- **general-purpose** -- 通用子代理,能使用全部工具。当你让 Claude 做一个需要多步骤研究或跨文件分析的任务时,它可能会派这个子代理去执行。
- **Explore** -- 只读搜索专家,不能修改任何文件。擅长用 Glob、Grep、FileRead 快速在代码库中定位文件和关键词。当你问"这个功能在代码里怎么实现的"时Explore 子代理会并行搜索多个路径然后汇总结果。
- **Plan** -- 架构规划师,同样只读。它会深入阅读代码、理解现有架构,然后输出一份包含步骤和关键文件的实施方案。
你不需要记住这些类型名。Claude 会根据你的问题自动选择合适的子代理。
### 子代理是怎么工作的
当你给 Claude 一个复杂指令时,它可能会这样处理:
```
你: 把 src/utils/ 下所有用到 deprecatedFunction 的地方重构掉
Claude: [使用 Agent 工具,派出一个 Explore 子代理搜索所有引用]
> Agent (Explore): 正在搜索 src/utils/ 下的 deprecatedFunction 引用...
[子代理完成,返回搜索结果]
Claude: 找到了 12 处引用,分布在 5 个文件中。让我逐一替换...
```
子代理运行时你会看到一个带颜色的进度提示标明子代理的类型和当前状态。每个子代理的输出会作为一条消息出现在对话中Claude 主线程会基于这些结果继续工作。
子代理之间也可以形成层级:主对话可以派子代理,子代理在复杂场景下还能继续派更小的子代理(取决于配置和 feature flag
### 关于并行子代理
当你使用一些 Skill`ultra-batch``dispatching-parallel-agents`)时,可以显式要求 Claude 同时派发多个子代理并行处理不同子任务。这在需要同时探索多个代码路径、或同时修改多个独立文件时特别高效。
```
你: 用 3 个子代理同时查一下 authentication、authorization 和 session 管理的实现
Claude: [同时派出 3 个 Explore 子代理,并行搜索]
> Agent #1 (Explore): 搜索 authentication 相关文件...
> Agent #2 (Explore): 搜索 authorization 相关文件...
> Agent #3 (Explore): 搜索 session 管理相关文件...
[三个子代理各自返回结果Claude 汇总]
```
## Task 系统:跟踪任务进度和依赖
Task 系统提供了一套完整的任务管理工具,让 Claude 能够像使用待办清单一样跟踪工作进度。这套工具包括 `TaskCreate``TaskUpdate``TaskList``TaskGet`
### 任务是怎么创建的
Claude 会在拆分大任务时自动使用 `TaskCreate` 创建子任务。你也可以在对话中明确要求它创建任务清单:
```
你: 帮我把用户模块重构拆成任务清单
Claude: [使用 TaskCreate 创建任务]
> Task #1 created: 提取用户验证逻辑到独立 service
> Task #2 created: 重构用户数据模型,添加类型约束
> Task #3 created: 更新 API 路由使用新的 service 层
> Task #4 created: 编写单元测试覆盖新 service
```
每个任务包含标题subject、描述description和状态pending / in_progress / completed。创建任务时Claude 还可以设置 `activeForm`(进行中时显示的活动描述,如"Running tests"),以及任意的 `metadata` 键值对。
### 任务状态流转
任务创建后默认是 `pending` 状态。Claude 会用 `TaskUpdate` 把任务标记为 `in_progress`(开始执行)、`completed`(完成)或 `deleted`(删除)。
```
你: 继续执行任务清单
Claude: [使用 TaskUpdate 更新状态]
> Updated task #1 in_progress, status
[开始执行第一个任务...]
> Updated task #1 completed, status
> Updated task #2 in_progress, status
[继续下一个任务...]
```
`TaskList` 可以随时查看所有任务的当前状态:
```
#1 [in_progress] 提取用户验证逻辑到独立 service
#2 [pending] 重构用户数据模型,添加类型约束
#3 [pending] 更新 API 路由使用新的 service 层
#4 [pending] 编写单元测试覆盖新 service
```
`TaskGet` 则用于查看单个任务的完整详情,包括描述和依赖关系。
### 任务依赖
任务之间可以设置阻塞关系。如果任务 A 阻塞了任务 Btask B 被 task A blocked那么在 A 完成之前B 无法开始。Claude 在规划执行顺序时会参考这些依赖关系:
```
#1 [completed] 提取用户验证逻辑到独立 service
#2 [in_progress] 重构用户数据模型,添加类型约束
#3 [blocked by #2] 更新 API 路由使用新的 service 层
#4 [blocked by #3] 编写单元测试覆盖新 service
```
### 任务钩子
Task 系统支持 hooks 集成。你可以在 `settings.json` 中配置 hooks让特定事件如任务创建、任务完成触发自定义逻辑。比如当某个关键任务完成时自动运行测试套件。
## Plan 模式:先想清楚再动手
Plan 模式是处理复杂任务的最佳实践。进入 Plan 模式后Claude 会切换到只读状态:它可以搜索代码、阅读文件、分析架构,但不能修改任何文件。等方案设计完毕并获得你的批准后,才退出 Plan 模式开始实际编码。
### 进入 Plan 模式
有两种方式进入 Plan 模式:
**方式一:用 `/plan` 命令**
```
/plan 重构用户模块的数据层
```
这会启用 Plan 模式并把你给出的描述作为规划目标。Claude 会在只读状态下探索代码库、设计实施方案。
**方式二:让 Claude 自动进入**
对于足够复杂的任务Claude 会自动调用 `EnterPlanMode` 工具进入 Plan 模式。你不需要显式要求,但可以用 `/plan` 强制进入。
### Plan 模式下发生了什么
进入 Plan 模式后,权限模式会切换为 `plan`。在这个模式下:
- Claude 只能使用只读工具Read、Glob、Grep、Bash 的只读操作)
- 文件编辑工具Edit、Write被禁用
- Claude 会深入探索代码库,理解现有模式和架构
- Claude 可能会问你一些问题来澄清需求
Claude 会把规划结果写入一个计划文件。你可以随时用 `/plan` 查看当前计划,或用 `/plan open` 在你的默认编辑器中打开并手动修改计划内容。
### 退出 Plan 模式并开始执行
当 Claude 完成规划后,它会调用 `ExitPlanMode` 工具。这时你会看到一个审批对话框,显示完整的计划内容。你可以:
- **批准** -- Claude 立即开始按计划编码
- **编辑** -- 在编辑器中修改计划,然后批准修改后的版本
- **拒绝** -- 让 Claude 重新规划
批准后,权限模式会恢复到进入 Plan 模式之前的状态(通常是 `default``auto`Claude 开始按计划执行。
### VerifyPlanExecution确认计划已正确执行
在较新的版本中Claude 在退出 Plan 模式之前可能会调用 `VerifyPlanExecution` 工具,对计划的执行情况进行校验。它会检查:
- 计划中的所有步骤是否都已完成
- 测试是否通过
- 关键文件是否已正确创建或修改
如果某些步骤被跳过或失败了,验证结果中会包含说明。
## Goal 命令:给 Claude 一个自主推进的目标
`/goal` 命令让你给 Claude 设定一个长期目标,然后 Claude 会自主地持续工作直到目标达成,而不是等你一轮一轮地下指令。
### 设置和查看目标
```
/goal 把所有 API 端点从 REST 迁移到 GraphQL
```
这会设定一个目标。Claude 会开始自主规划、拆分任务、执行修改,每完成一轮会自动继续下一轮。你可以随时查看目标状态:
```
/goal status
```
输出会显示目标描述、当前状态、已用 token 数量、活跃时间和已执行的轮次。
### 控制目标进度
`/goal` 支持几个子命令来控制执行:
- `/goal pause` -- 暂停自动继续
- `/goal resume` -- 从暂停恢复
- `/goal continue` -- 在达到最大轮次限制后重置计数器继续
- `/goal complete` -- 手动标记目标已完成
- `/goal clear` -- 清除当前目标
当 Claude 遇到无法自行解决的阻塞时,它会用 `GoalTool` 将目标标记为 `blocked` 并说明原因。连续 3 轮遇到同样的阻塞条件后,目标会被自动标记为阻塞状态,等待你介入。
### Goal 与 Task 系统的配合
`/goal` 通常会与 Task 系统配合使用。Claude 设定目标后会自动创建任务清单,然后逐个执行。你可以在 `/workflows` 面板中同时看到目标和任务的状态。
## Worktree 隔离:在独立分支里做实验
当你需要做一些可能有风险或需要独立验证的改动时Claude 可以用 `EnterWorktree` 工具创建一个 git worktree -- 一个独立的工作目录,关联到一个新的 git 分支。
### Claude 如何使用 Worktree
你不需要手动管理 worktree。当你告诉 Claude 做一些需要隔离的操作时,它可能会自动调用 `EnterWorktree`
```
你: 试试把 ORM 从 Prisma 换成 Drizzle先在一个独立分支上验证可行性
```
Claude 会创建一个 worktree在新分支上做实验完成后汇报结果。你的主工作目录完全不受影响。
### Worktree 的生命周期
- **创建**`EnterWorktree` 创建 worktree 和关联分支,会话切换到 worktree 目录
- **退出 -- 保留**`ExitWorktree(action: "keep")` 保留 worktree 和分支,会话切回原目录
- **退出 -- 删除**`ExitWorktree(action: "remove")` 删除 worktree 和分支。如果有未提交的改动或未合并的 commitClaude 会先列出它们,需要你确认并传入 `discard_changes: true` 才会执行删除
你也可以在启动 Claude 时直接指定 worktree 模式:
```bash
claude --tmux --worktree
```
这会自动创建一个 worktree 并在 tmux 会话中运行。
## Coordinator 模式:多 Worker 协作
Coordinator 模式是一个高级特性(需要 `COORDINATOR_MODE` feature flag把 Claude 变成一个任务调度器。启用后Claude 只能使用 Agent派发子任务、SendMessage给子代理发消息和 TaskStop停止子任务三个工具不再直接执行任何操作。
### 启用 Coordinator 模式
```
/coordinator
```
启用后Claude 会变成一个编排者。你给它一个大任务,它会拆分成多个子任务,然后派发给不同的 worker 子代理并行执行:
```
你: 把这个 monorepo 的所有包从 CommonJS 迁移到 ESM
Claude (Coordinator): 我把这个任务拆成 5 个子任务,派发给 worker 执行...
> Agent (worker #1): 迁移 packages/utils/ ...
> Agent (worker #2): 迁移 packages/core/ ...
> Agent (worker #3): 迁移 packages/api/ ...
...
[Worker 完成后汇报结果Coordinator 汇总]
```
再次输入 `/coordinator` 可以关闭 Coordinator 模式,恢复正常的工具使用。
## Workflow 脚本:固化可重放的多步工作流
`/workflows` 命令打开一个监控面板,实时显示当前工作流的运行状态、各阶段进度和子代理活动。这个面板适合在 Claude 执行复杂多步任务时监控整体进展。
在面板中,你可以看到:
- 当前工作流的运行状态running / paused / completed
- 各阶段的进度
- 活跃的子代理列表及其状态
- 用键盘快捷键控制工作流(暂停、继续、取消)
```
/workflows
```
面板以终端 UI 形式展示,不阻塞主对话。
## 如何选择合适的方式
面对一个大任务,选择哪种方式取决于任务的性质:
| 场景 | 推荐方式 |
|------|----------|
| 需要先理解代码再动手 | Plan 模式 |
| 需要长时间自主推进 | `/goal` |
| 需要并行处理多个独立子任务 | Agent 子代理 / Coordinator 模式 |
| 需要在隔离环境做实验 | Worktree |
| 需要跟踪多个子任务的进度 | Task 系统 |
| 需要监控复杂工作流的执行 | `/workflows` 面板 |
这些方式可以组合使用。比如,你可以先用 Plan 模式设计方案,然后 Claude 自动创建 Task 清单,再派子代理并行执行各任务,同时你在 `/workflows` 面板中监控进度。
## 下一步
- 想了解如何让 Claude 定时或后台执行任务,看 [第七章Daemon、Background Sessions、Schedule](./07-daemon-bg-schedule.md)
- 想了解如何通过 Bridge 或 RCS 远程控制这些任务,看 [第八章:跨机器与跨团队协作](./08-bridge-remote-acp.md)
- 想了解权限模式如何影响子代理和 Plan 模式的行为,看 [第九章:省钱、提速、定制](./09-budget-caching-hooks.md)