9 自动化与规模化
🔴 高级 | 官方最佳实践 #7:当你用好了一个 Claude,用并行和自动化倍增你的产出。
9.1 从单会话到多会话 🟡
| 维度 | L3 单会话 | L4 多会话并行 |
|---|---|---|
| Claude 实例 | 1 个 | 3-5 个 |
| 执行方式 | 串行 | 并行 |
| 角色分工 | 通用 | 专业化(开发/审查/测试/修复) |
| 上下文 | 共享(容易污染) | 隔离(互不影响) |
| 工作目录 | 同一目录 | 各自 Worktree |
| 产出效率 | 1x | 3-5x |
9.2 Headless 模式 🟡
概念:AI 即可编程函数
Headless 模式的本质是把 Claude 变成一个可编程函数:f(输入) → 输出。通过 claude -p,你可以在任何无交互环境中调用 Claude——CI 管道、pre-commit hooks、自动化脚本、定时任务。
官方已将编程接口统一归入 Agent SDK(含 CLI / Python SDK / TypeScript SDK 三种接入方式)。本节聚焦 CLI 的
-p用法,其语法保持不变。
核心参数速查
| 参数 | 作用 | 示例 |
|---|---|---|
| -p “prompt” | 以 Headless 模式运行 | claude -p “解释这个项目” |
| –output-format | 输出格式(text/json/stream-json) | –output-format json |
| –allowedTools | 免确认执行的工具列表 | –allowedTools “Bash(git *)” |
| –json-schema | 强制 AI 返回你定义的 JSON 结构 | –json-schema ‘{“type”:”object”,…}’ |
| –continue | 继续当前目录最近一次会话 | claude -p “继续分析” –continue |
| –resume | 恢复指定 session | –resume “$session_id” |
| –append-system-prompt | 追加系统提示词 | –append-system-prompt “只用中文回复” |
| –verbose | 显示调试信息(常配合 stream-json) | –output-format stream-json –verbose |
| -include-partial-messages | token 级增量流式事件(需配合 -p + stream-json) | -p –output-format stream-json –include-partial-messages |
完整 CLI 参数列表见附录 B。
输入:两种方式
1 | # 方式 1:参数传递 Prompt |
管道输入的内容会作为上下文附加到 -p 的 prompt 之前,适合处理超长文本日志、diff 输出等。
输出:三种格式
| 格式 | 用途 | 命令 |
|---|---|---|
| text(默认) | 人类可读,直接输出到终端或文件 | claude -p “…” –output-format text |
| json | 程序解析,包含元数据 | claude -p “…” –output-format json |
| stream-json | 实时流式处理,逐行 JSON | claude -p “…” –output-format stream-json |
JSON 输出的关键字段(元数据字段可能随版本变化):
| 字段 | 说明 |
|---|---|
| result | Claude 的回复文本 |
| session_id | 会话 ID,用于 –resume 继续 |
| total_cost_usd | 本次调用的费用(美元) |
| usage | Token 用量详情 |
| is_error | 是否出错 |
1 | # 提取 JSON 中的回复文本 |
权限控制:–allowedTools
在自动化场景中,你需要预先授权 Claude 可以使用哪些工具,避免交互式确认阻塞流程。
1 | # 基本语法:逗号分隔工具名 |
Bash(git diff *)中的空格*表示前缀匹配——允许git diff、git diff --staged、git diff HEAD~3等所有以git diff开头的命令。
自动 commit 实战:
1 | # 一键自动 commit:Claude 查看 staged changes 并生成 commit message |
结构化输出:–json-schema
当你需要 Claude 返回固定格式的数据(而非自由文本),用 --json-schema 强制约束输出结构。
1 | # 提取函数名列表,输出严格遵循 schema |
会话延续:–continue / –resume
多步骤工作流不需要每次都从零开始,可以链式调用同一会话。
1 | # 方式 1:--continue 自动继续当前目录最近的会话 |
--continue 适合手动链式操作;--resume 适合脚本中需要精确控制会话的场景。
系统提示定制:–append-system-prompt
在 Headless 模式下追加系统提示词,用于注入额外约束或角色设定。
1 | # PR diff 审查:注入审查规则 |
实战场景总结
| 场景 | 命令模式 | 关键参数 |
|---|---|---|
| 日志分析 | cat log \ | claude -p “…” |
| 自动 commit | claude -p “create commit” | –allowedTools “Bash(git *)” |
| PR 审查 | git diff \ | claude -p “review” |
| 批量数据提取 | claude -p “extract…” | –json-schema + jq |
| 多步骤分析 | 链式 claude -p | –continue 或 –resume |
| CI 管道集成 | 见 9.8 GitHub Actions | –output-format json |
9.3 多会话并行 🔴
运行并行会话的三种方式:
| 方式 | 适用场景 | 特点 |
|---|---|---|
| Desktop 应用 | 本地多会话 | 可视化管理,每个会话独立 worktree |
| Web 版 | 云端并行 | Anthropic 安全基础设施,隔离 VM |
| Agent Teams(实验特性) | 自动化协调 | 多实例共享任务和消息传递,需手动启用 |
并行会话不只是加速——它还启用了质量导向的工作流。新上下文让代码审查更客观,因为 Claude 不会偏向自己刚写的代码。
9.4 Writer/Reviewer 模式 🟡
使用两个独立会话,一个写代码一个审查:
![[Pasted image 20260304163856.png]]
类似地,你可以让一个 Claude 写测试,另一个写代码让测试通过。
9.5 Worktree 并行开发 🔴
Git Worktrees 为每个 Claude 会话创建独立的工作目录:
1 | # 终端 1:功能开发 |
Worktree 创建在 <repo>/.claude/worktrees/<name>,基于默认远程分支创建新分支。退出时:
- 无变更 → 自动删除 worktree 和分支
- 有变更 → 提示你保留或删除
将 .claude/worktrees/ 加入 .gitignore。
Boris Pro Tip B11:Boris 日常同时维护 3-5 个 worktrees,每个运行独立的 Claude 会话。他最长的一次 Claude 运行持续了 42 小时。他的经验是:worktree 并行是目前”一个人当一个团队用”最实际的方法。
团队中有人设置 shell 别名
za/zb/zc一键跳转 worktrees,还有人专门维护一个 analysis worktree 只用于读日志和跑数据查询,不做代码修改。
9.6 Fan-out 批量处理 🔴
💡 先试 /batch:大多数批量迁移场景(框架升级、API 替换、全局重构)可直接使用内置的
/batch技能(见 6.6),它会自动完成任务拆分、并行执行和 PR 生成。下面的手动 Fan-out 适合需要自定义任务拆分逻辑或特殊并行策略的高级场景。
对于大规模迁移或分析,将工作分发到多个并行 Claude 调用:
1 | # 1. 生成任务列表 |
最佳实践:先在 2-3 个文件上测试,优化提示词,然后批量执行。--allowedTools 让指定工具免确认自动执行,无人值守时避免被权限提示阻塞。
9.7 长时间运行的任务 🔴
对于需要持续运行数小时的任务(Boris 最长记录是 42 小时),有几种策略避免 Claude 被权限提示阻塞:
| 策略 | 做法 | 适用场景 |
|---|---|---|
| Background Agent 验证 | 提示 Claude 完成后用 background agent 自我验证 | 半自主任务 |
| Stop Hook | 配置 Stop Hook 检查任务是否完成,未完成则自动继续 | 需要确定性控制 |
| ralph-wiggum 插件 | 社区插件,自动恢复被中断的 Claude 会话 | 超长运行任务 |
| dontAsk 模式 | –permission-mode=dontAsk 在沙箱中运行 | 受信环境 |
⚠️ --dangerously-skip-permissions 强烈建议仅在沙箱/隔离环境中使用(非产品硬限制,而是安全最佳实践)。日常开发用 /permissions 预批准 + dontAsk 模式。
9.8 GitHub Actions 集成 🔴
快速设置
在 Claude Code 中运行:
1 | /install-github-app |
手动设置
- 安装 Claude GitHub App:https://github.com/apps/claude
- 添加
ANTHROPIC_API_KEY到仓库 Secrets - 创建工作流文件:
1 | # .github/workflows/claude.yml |
自动 PR 审查
1 | name: Claude PR Review |
Issue 自动修复
1 | name: Claude Fix Issue |
已知限制
⚠️ Claude GitHub App 不支持 push 事件触发。上述示例(
issue_comment、pull_request、issues)均可正常工作,但如果你需要在 push 时触发 Claude(如自动修复 lint 错误),需在 runner 中手动安装 Claude CLI 并配置环境变量,而非依赖 GitHub App。
在 PR/Issue 中使用
安装 GitHub App 后,在评论中 @claude 即可触发:
1 | @claude 根据 Issue 描述实现这个功能 |
10 避免常见陷阱
🟢 基础 | 官方最佳实践 #8:识别这些常见错误,及早规避。
10.1 五大失败模式 🟢
| 陷阱 | 表现 | 修复 |
|---|---|---|
| 1️⃣ 厨房水槽式会话 | 一个会话混合多个不相关任务 | /clear 分隔任务 |
| 2️⃣ 反复修正 | 修了两次还是错,上下文被污染 | /clear + 更好的初始提示词 |
| 3️⃣ 过长的 CLAUDE.md | 规则被噪声淹没,Claude 忽略 | 修剪 + 详细指令移到 Skills |
| 4️⃣ 信任但不验证 | 看起来对但实际不工作 | 始终提供验证手段 |
| 5️⃣ 无限探索 | Claude 读了上百个文件,上下文爆满 | 缩小范围 + 用子代理隔离 |
陷阱 1:厨房水槽式会话
表现:一个会话中混合了多个不相关任务,上下文充满无关信息。
修复:在不相关的任务之间使用 /clear。
1 | # 错误做法 ❌ |
陷阱 2:反复修正
表现:Claude 做错了,你修正它,还是错,再修正……上下文被失败方案污染。
修复:修正两次后,/clear 并写一个更好的初始提示词,融合你在前两轮学到的信息。
陷阱 3:过长的 CLAUDE.md
表现:CLAUDE.md 太长,Claude 忽略了一半规则,重要指令被噪声淹没。
修复:
- 无情地修剪。如果 Claude 不需要某条规则也能做对,就删掉
- 详细指令移到 Skills(按需加载)
- “必须做”的操作转为 Hooks(确定性保证)
陷阱 4:信任但不验证
表现:Claude 产出看起来合理的实现,但没处理边界情况。
修复:始终提供验证手段——测试、脚本、截图。如果无法验证,就不要发布。
陷阱 5:无限探索
表现:让 Claude “调查”某问题但不限定范围,Claude 读了上百个文件,上下文爆满。
修复:
- 缩小范围:”只看
src/auth/目录” - 用子代理隔离探索,不污染主上下文
10.2 团队级反模式 🟡
| 反模式 | 表现 | 解决 |
|---|---|---|
| 无标准化 | 每人各自配置,没有共享 Skills | 建立团队标准——统一 CLAUDE.md 模板、共享 settings.json |
| 过度标准化 | CLAUDE.md 变成几百行”宪法” | 只标准化必要的(构建命令、安全规则),其他留给个人 |
| 盲目推广 | 没试点就全团队推广 | 先 2-3 人试点一周,收集反馈,渐进式推广 |
10.3 Claude Code 团队的应对建议 🟡
来自 Anthropic 内部的经验:
- 犯错后更新规则:每次 Claude 犯了你不想看到的错误,就是完善 CLAUDE.md 或添加 Hook 的机会
- 定期审查 CLAUDE.md:像代码审查一样审查你的规则,删除过时的、合并重复的
- 观察 Claude 行为:如果 Claude 反复违反某条规则,文件可能太长了,规则被忽略
- 如果 Claude 问了 CLAUDE.md 已回答的问题:措辞可能有歧义,重写那条规则
Boris Pro Tip B12:Boris 在 Claude 犯错后的标准流程是:让 Claude 自己更新 CLAUDE.md 来避免同类错误。"刚才那个错误是因为 X。更新 CLAUDE.md 添加规则来防止类似情况。" 这形成了一个自我改进的循环——Claude 犯的每个错误都让下一次交互变得更好。