动态工作流(Dynamic Workflows)是 Claude Code 的进阶能力:Claude 把你的任务写成一段 JavaScript 编排脚本,在后台并发调度数十到数百个子代理执行,而你的会话始终保持响应。本文从"它是什么、何时用、怎么用"三条主线出发,手把手带你跑通内置工作流、用 ultracode 让 Claude 写脚本、保存复用、传参、控成本,是进阶用户不可错过的效率利器。

一、先搞懂:动态工作流到底解决什么问题?
平时用 Claude Code,它是"逐轮对话"的:你发一句,它想一步、干一步,结果都塞进它的上下文窗口里。这种模式对付日常任务足够了,但遇到下面这类活儿就会力不从心:
- 扫描整个代码库的 500 个文件,找出所有缺少鉴权的接口
- 把 300 个组件从
styled-components批量迁移到 Tailwind - 一个研究问题,需要查十几个来源并相互交叉验证
- 一份难写的方案,值得先从多个独立角度各起草一版再对比
这些任务的共同点:需要协调的代理数量,远超一次对话能装下的规模。
一句话定义:动态工作流是一段由 Claude 编写的 JavaScript 脚本,它在运行时(runtime)后台执行,大规模编排子代理干活,中间结果留在脚本变量里,只把最终答案交回给你。
关键差别在于:"计划"被搬进了代码。循环、分支、中间结果都由脚本自己持有,Claude 的上下文只保留最终结论——既省 context,又让整个编排可以保存、重跑、版本化。
环境要求:动态工作流需要 Claude Code v2.1.154 或更高版本,在所有付费计划(Pro / Max / Team / Enterprise)可用。Pro 用户需在 /config 的 "Dynamic workflows" 一行手动启用。
二、四选一:工作流 vs 子代理 vs Skills vs Agent Teams
Claude Code 里能跑多步任务的机制有四种,新手最容易搞混。核心区别只有一个问题:谁来决定下一步干什么?
| 子代理 | Skills | Agent Teams | 工作流 | |
|---|---|---|---|---|
| 它是什么 | Claude 生成的工作者 | Claude 遵循的指令 | 监督对等会话的主导代理 | 运行时执行的脚本 |
| 谁决定下一步 | Claude,逐轮 | Claude,按提示 | 主导代理,逐轮 | 脚本 |
| 中间结果在哪 | Claude 上下文窗口 | Claude 上下文窗口 | 共享任务列表 | 脚本变量 |
| 什么可重复 | 工作者定义 | 指令 | 团队定义 | 编排本身 |
| 规模 | 每轮几个委派 | 同子代理 | 少数长期对等体 | 每次数十到数百个代理 |
| 中断后 | 重启轮次 | 重启轮次 | 队友继续运行 | 同会话内可恢复 |
选型口诀:
- 任务小、逐步来 → 直接对话或子代理
- 有固定套路要复用 → Skills
- 几个长期协作的"同事" → Agent Teams
- 规模大 / 想把编排固化成可重跑的脚本 / 想让代理之间互相对抗性审查 → 工作流
工作流独有的价值不只是"跑更多代理",而是能施加可重复的质量模式:比如让独立代理在汇报前互相"挑刺"(对抗性审查),或从多个角度起草方案再彼此权衡——结果比单次通过更可信。
三、第一次上手:跑通内置的 /deep-research
想最快看懂工作流长什么样?直接跑 Claude Code 自带的内置工作流 /deep-research。它会在多个角度上并发搜索网络、抓取并交叉验证来源,最后综合出一份带引用的报告。
步骤 1:运行
/deep-research Node.js v20 与 v22 的权限模型存在哪些变更?
步骤 2:批准
Claude Code 会问你是否允许运行,选是即可。(具体提示与你的权限模式有关,详见第五节。)
步骤 3:观看进度
运行会在后台启动,你的会话不会被卡住。随时输入:
/workflows
用方向键选中运行,按 Enter 打开进度视图。视图会展示每个阶段(stage)及其代理数量、token 总量、耗时。你也可以钻进任意阶段,查看具体某个代理发现了什么。
输入框下方的任务面板也会出现一行进度摘要,按 ↓ 聚焦、按 Enter 展开。
步骤 4:阅读报告
运行完成后,报告直接进入会话。它会为每条声明标注来源;没通过交叉验证的声明会被过滤掉。
从 v2.1.196 起,如果验证代理因限流或 API 错误而无法核查某条声明,报告会把它标为"未验证",而不是当作"被驳回"。
进度视图快捷键速查
| 键 | 操作 |
|---|---|
| ↑ / ↓ | 选择阶段或代理 |
| Enter / → | 钻入阶段 → 进入代理,读它的提示/工具调用/结果 |
| Esc | 返回上一级 |
| j / k | 代理详情溢出时滚动 |
| f | 按状态过滤代理列表(v2.1.186+,再按循环) |
| p | 暂停 / 恢复运行 |
| x | 停止选中代理;焦点在运行上时停止整个工作流 |
| r | 重启选中的运行中代理 |
| s | 保存运行脚本为命令(重点,见第四节) |
四、核心玩法:让 Claude 替你写工作流
内置的 /deep-research 只是开胃菜。真正强大的是:你描述任务,Claude 现场为你写编排脚本。有两种触发方式。
方式 A:单次任务,用 ultracode 关键字
在提示里加上关键字 ultracode,Claude 就会把这一个任务当作工作流来写,而不逐轮处理:
ultracode: 审计 src/routes/ 下所有 API 接口,排查缺失鉴权校验的情况。
用中文自然语言说"用工作流处理""跑一个工作流"同样有效——Claude 会把这类请求视作等价的选择加入。
- v2.1.160 之前的字面触发词是
workflow,自然语言在两个版本都有效。 - 不想触发时:macOS 按
Option+W,Windows/Linux 按Alt+W忽略高亮;或在关键字后退格。 - 想彻底关掉自动触发:
/config里关闭 "Ultracode 关键字触发"。
方式 B:整个会话交给 Claude 判断,/effort ultracode
Ultracode 是一个设置,把 xhigh 推理努力与自动工作流编排绑在一起。开启后,Claude 会为每个实质性任务主动规划工作流,不用你每次点名:
/effort ultracode
也可以启动时就带上:claude --effort ultracode(需 v2.1.203+)。
开启后,一个请求可能被拆成一串工作流:一个理解代码 → 一个执行改动 → 一个验证结果。代价是每个请求更费 token、更慢。日常工作回归时用 /effort high 降档即可。Ultracode 只在当前会话生效,新会话重置。
它只在支持 xhigh 努力级别的模型上可用;其他模型的 /effort 菜单里不会出现。
保存工作流,一劳永逸复用 ⭐
这是最实用的一步。当 Claude 为一个重复性任务写好工作流并跑出满意结果后,把脚本存成命令,以后每次直接调用、执行完全相同的编排:
- 运行 /workflows,选中想保留的那次运行
- 按
s - 在保存对话里,用
Tab切换保存位置:
.claude/workflows/(项目内)→ 克隆仓库的每个人都能用~/.claude/workflows/(主目录)→ 所有项目可用,仅你可见
- 按 Enter 保存
保存后,它会像内置工作流一样出现在 / 自动补全里,未来会话直接 /<name> 调用。
Monorepo 场景(v2.1.178+):保存到项目位置时,会写入你工作目录与仓库根之间最近的 .claude/workflows/ 目录。加载时若多处定义了同名工作流,运行离工作目录最近的那个。项目工作流与个人工作流同名时,项目工作流优先。
给保存的工作流传参:args
保存的工作流可以通过 args 接收输入,脚本里读作全局变量 args。这样无需为每次运行改脚本:
Run /triage-issues on issues 1024, 1025, and 1030
Claude 会把列表作为结构化数据传进去,脚本可直接对 args 调用数组/对象方法,无需先解析。省略 args 时,脚本内该全局变量为 undefined。
五、运行前的把关:批准与权限
工作流会消耗不少资源,所以运行前通常有一道批准关。CLI 里的提示会展示计划的各个阶段和这些选项:
- 是,运行它:启动
- 是,不再为
<path>中的<name>询问:启动,并从此在本项目跳过该工作流的提示 - 查看原始脚本:决定前先读脚本
- 否:取消
快捷键:Ctrl+G 在编辑器中打开脚本;Tab 可在启动前调整提示词。
是否提示,取决于你的权限模式
| 权限模式 | 何时提示 |
|---|---|
| 默认 / 接受编辑 | 每次运行,除非你已选过"不再询问" |
| 自动 | 仅首次;任一"是"会在用户设置里记录同意。ultracode 开启时完全跳过 |
| 绕过权限 / claude -p / Agent SDK | 从不提示,立即启动 |
重要安全须知:你的权限模式只管上面的启动提示。工作流生成的子代理始终以 acceptEdits 模式运行,继承你的工具允许列表——文件编辑自动批准。但 Shell 命令、网络获取、不在允许列表里的 MCP 工具仍可能在运行中弹出提示。长任务前,先把代理需要的命令加进允许列表,避免中途卡住。
桌面应用里,批准卡会显示工作流名称、阶段列表和 token 用量警告,提供"一次 / 总是 / 拒绝";进度视图出现在"后台任务"侧栏。
六、看懂脚本:Claude 到底写了什么
保存后的工作流文件由一个 meta 块 + 编排脚本主体组成。你通常不用改它,但认得出它长这样有助于理解:
export const meta = {
name: 'audit-routes',
description: 'Audit every route handler for missing auth checks',
}
// 第一步:让一个代理列出所有目标文件,并约定返回结构
const found = await agent('List every .ts file under src/routes/.', {
schema: {
type: 'object',
required: ['files'],
properties: { files: { type: 'array', items: { type: 'string' } } },
},
})
// 第二步:pipeline 为每个文件并发生成一个审计代理
const audits = await pipeline(found.files, file =>
agent(`Audit ${file} for missing authentication checks.`, { label: file }),
)
return audits.filter(Boolean)
要点:
- 主体是带顶层
await的纯 JavaScript agent()→ 生成一个子代理pipeline()→ 为列表里的每一项并发跑一个代理- 想手改脚本时,让 Claude 引导你改,或查阅 Agent SDK 参考里的 Workflow 工具条目
七、运行机制与硬限制
工作流在隔离环境中执行,与你的对话分开。中间结果留在脚本变量里,不进 Claude 上下文。每次运行都会把脚本写到 ~/.claude/projects/ 下的会话目录里——运行开始时 Claude 会拿到该路径,你可以直接问它要,打开来读、对比历史版本,甚至改完让它从新版本重跑。
运行时的四条铁律
| 约束 | 为什么 |
|---|---|
| 运行途中不能插入用户输入 | 只有代理权限提示能暂停。需要阶段间签署?把每个阶段拆成独立工作流 |
| 脚本本身无直接文件/Shell 访问 | 读写和执行命令都由代理干,脚本只负责协调 |
| 最多 16 个并发代理(核少的机器更少) | 限制本地资源占用 |
| 每次运行总数上限 1000 个代理 | 防止失控循环烧钱 |
八、开箱即用的任务提示模板
工作流最适合"任务大过单代理容量"或"同样步骤要在很多项目上跑"的场景。下面每条都是让 Claude 自己写并跑工作流,你不用碰脚本。收藏直接抄:
① 批量审计同类问题(扇出 + 验证)
启用工作流审计 src/routes/ 下所有路由处理器,排查缺失鉴权校验的问题,并对每一项排查结果开展对抗性验证后再提交报告。
② 反复修到检查通过(检查器循环)
启用工作流执行 npx tsc --noEmit,持续修复检出的错误,直至类型校验通过,或连续两轮处理均无进展。
③ 并行大规模迁移(隔离副本防冲突)
启用工作流,将 src/components/ 下所有组件从 styled-components 迁移至 Tailwind;每个文件在独立副本中进行改造。
④ 审查所有改动文件并汇总一份报告(去重排序)
启用一套工作流程,核查该 PR 内所有变更文件是否存在正确性问题,随后将各文件的评审结果汇总为一份优先级排序总结报告。
⑤ 跨多来源研究一个主题
> use a workflow to research how our three competitors handle rate limiting: read their public docs and recent changelog entries in parallel, then compare the approaches
⑥ 反复找问题直到列表不再增长(收敛式搜索)
> use a workflow to find flaky tests in this repo: run the suite repeatedly, record which tests fail intermittently, and stop once two rounds in a row find nothing new
九、管好你的运行:恢复与控成本
暂停后恢复
停掉运行后可以恢复:已完成的代理返回缓存结果,其余的实时继续。在 /workflows 里选中暂停的运行按 p,或让 Claude 用相同脚本重启。
恢复只在同一 Claude Code 会话内有效。若运行期间退出了 Claude Code,下个会话会从头启动。
成本控制(重点!)
工作流会生成很多代理,单次运行可能比对话处理同一任务贵得多,并照常计入你的套餐用量和速率限制。几个省钱习惯:
- 先小范围试跑:提交大任务前,先只跑一个目录、一个窄问题。
/workflows视图实时显示每个代理的 token 用量,随时可停且不丢已完成的工作。 - 留意大运行警告:当工作流调度超过 25 个代理或预计 token 超过 150 万时,进度行会显示
Large workflow警告(v2.1.203+)。它只是建议性提示,不会暂停运行。 - 设置大小指南:
/config里的 "Dynamic workflow size" 让 Claude 写的脚本默认保持较小规模(下一个提示生效,v2.1.202+):
| 值 | 发给 Claude 的指导 |
|---|---|
| unrestricted | 无指南(默认) |
| small | 目标 < 5 个代理 |
| medium | 目标 < 15 个代理 |
| large | 目标 < 50 个代理 |
设了指南后,它的代理计数会替换掉那个 25 的警告阈值;但运行时 1000 上限始终生效。
- 控模型成本:工作流里每个代理都用你的会话模型,除非脚本把某阶段路由到别的模型。大运行前用
/model确认;描述任务时可要求 Claude 为"不需要最强模型"的阶段用小模型。
十、如何关闭工作流
工作流在 CLI、桌面应用、IDE 扩展、claude -p 无头模式与 Agent SDK 中都可用。关闭方式:
给自己关:
/config里把 "Dynamic workflows" 切为关(会话内持续)~/.claude/settings.json里设"disableWorkflows": true- 环境变量
CLAUDE_CODE_DISABLE_WORKFLOWS=1(启动时读取)
给整个组织关:在托管设置里设 "disableWorkflows": true,或用 Claude Code 管理员设置页的开关。
关闭后:内置工作流命令不可用、ultracode 关键字不再触发、ultracode 从 /effort 菜单消失。
结语:什么时候真正该上工作流?
回到最初那个判断标准——当一个任务大到一次对话协调不过来,或当同样的编排你想反复复用时,工作流就是那把对的工具。
给进阶用户的三条实战建议:
- 先跑
/deep-research找感觉,再用ultracode让 Claude 为你的真实任务写脚本。 - 满意的运行一定要
s保存,配合args传参,把"每个分支都要跑的审查"变成一条/命令。 - 成本先小后大:窄范围验证 → 看 token → 设大小指南,别让失控脚本烧掉你的额度。
把"计划"交给代码,把"执行"交给成百的分身,你只负责读那份最终报告——这就是动态工作流带来的杠杆。