🎯 核心主张(一句话)
claude -p把 Claude Code 从"终端里的对话伙伴"变成可编程组件——代价是:交互模式下由人实时承担的审批、质检、流程控制,必须全部预先硬编码成参数。
📖 正文
为什么需要 Headless 模式
交互模式下,人其实同时扮演三个角色:权限审批者(这条命令能不能跑)、质量检查者(输出对不对)、流程控制者(下一步干什么)。CI/CD 流水线里这三个角色全部缺席,系统必须在启动前就把所有规则定死。
入口很简单:claude -p "任务描述"(--print 的缩写),执行完直接输出结果并退出,不等任何输入。但 -p 只是开关,真正让它可编程的是背后的参数体系。书中把这套体系归纳为四个维度——任何一次生产级无人值守调用,都要在这四个维度上做出明确决策。

维度一:输出格式——下游程序怎么消费结果
--output-format 三选一:人读用 text,机器解析用 json,实时监控用 stream-json。
json 格式返回的不只是结果,还有全套执行元数据:total_cost_usd(单次成本,可按 PR 记账)、num_turns(实际交互轮数,对照 max-turns 看任务深度)、cache_read_input_tokens(缓存命中越高越省钱越快)。stream-json 逐行输出 NDJSON 事件,首行 system/init 事件汇报模型、工具列表和 MCP 状态,排查 CI 配置问题时先看这一行。
再进一步是 --json-schema:强制输出符合指定 Schema,不合法会自动重试直到通过,结果放在 structured_output 字段。有了它就不用写正则去解析自由文本,下游脚本直接吃标准 JSON。
维度二:权限——白名单永远优于黑名单
--allowedTools 是封闭世界假设(列出的才能用),--disallowedTools 是开放世界假设(没禁的都能用)。自动化场景只用前者——你不需要预见所有危险工具,只需列出确实要用的:
# 只读审查(最安全)
--allowedTools "Read,Grep,Glob"
# 需要部分 Shell 能力时,用模式匹配限定命令前缀
--allowedTools "Read,Grep,Glob,Bash(git log *),Bash(git diff *)"
--dangerously-skip-permissions 跳过一切权限检查,名字里的 dangerously 不是装饰——CI 里禁用,除非跑在完全隔离、无法影响外界的容器里。
维度三:成本护栏——两道保险缺一不可
--max-turns 限交互轮数(防无限递归),--max-budget-usd 限总金额(防单轮读巨型文件烧钱)。触发行为不同:轮数耗尽时 Claude 会输出已有结论(subtype 为 error_max_turns,不完整但有参考价值);预算触发则立即硬停,什么都不输出。生产环境两个都配。
维度四:执行控制与上下文注入
模型按任务分级:格式检查用 Haiku,安全审查用 Sonnet,再配 --fallback-model 防主模型过载时整条流水线堵死。System Prompt 定制用 --append-system-prompt(追加,保留默认能力),别用 --system-prompt(全量覆盖后 Claude 连内置工具都不会用了)。
上下文注入的另一条路是 Unix 管道——Claude Code 接受 stdin,能当"智能过滤器"嵌进命令行工作流:
git diff HEAD~1 | claude -p "按 Conventional Commits 规范生成提交信息"
grep -r "TODO" src/ | claude -p "按优先级分类" # Grep 精确筛选 + Claude 语义分析
会话管理补足多步骤场景:默认每次调用都是全新上下文,但 json 输出里的 session_id 配合 --resume 能继承上一轮读过的文件和中间结论;--continue 自动续接最近会话;--fork-session 像 Git 分支一样从同一份分析派生多个假设路线;--no-session-persistence 强制无状态。
GitHub Actions 集成
两条路:官方 Action(anthropics/claude-code-action@v1,交互模式下 /install-github-app 一键配置)和直接调 CLI(可做质量门禁、成本上报等复杂逻辑)。官方 Action 的骨架:
on:
pull_request: { types: [opened, synchronize, reopened] }
concurrency: # 同一 PR 新提交自动取消旧任务,省钱
group: ${{ github.workflow }}-${{ github.event.pull_request.number }}
cancel-in-progress: true
jobs:
review:
steps:
- uses: anthropics/claude-code-action@v1
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
prompt: |
审查此 PR:安全漏洞 / 边界条件 / 性能隐患,按 Critical/Warning/Suggestion 输出
claude_args: >-
--allowedTools "Read,Grep,Glob" --max-turns 10
提供 prompt 就是 Agent Mode(每次 PR 自动审查);评论里 @claude 触发 Tag Mode(像队友一样答疑),两者可共存。典型场景除了 PR 初审,还有 issue 分诊、失败构建自动修复、提交信息生成、多阶段流水线(Haiku 做格式检查 → Sonnet 并行跑安全扫描和覆盖率分析,模型和预算按任务分级)。
CI 环境变量三件套:ANTHROPIC_API_KEY 走 Secrets 引用绝不硬编码;CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1 一键关掉自动更新/遥测/错误上报(自动更新在 CI 里可能中途升级导致版本漂移);BASH_DEFAULT_TIMEOUT_MS 控制命令超时。
安全五层与何时不用 Headless
生产部署的五层防御,缺一层就是缺口:最小权限(只读白名单起步)、Secrets 管理(另注意:Prompt 里绝不能让模型读取或输出环境变量——模型复述的密钥值绕过日志遮蔽机制)、容器隔离(--read-only --network none)、成本防护(paths 路径过滤 + concurrency 取消,从源头减少触发比限制单次消耗更省)、审计日志(json 输出天然含 session_id/成本/轮数,推给集中日志系统)。
选择标准:探索性工作留在交互模式——调试、架构讨论、渐进重构,这些需要人随时纠偏;规则明确、可重复、能用参数完整描述边界的任务才交给 Headless。落地走四阶段:观察者(只发报告)→ 顾问(标警告不阻塞)→ 门禁(Critical 阻塞合并,但留人工覆盖通道)→ 主动修复(开放 Write 权限,修复必须以新 Commit 提交,不动作者原始代码)。每阶段跑 2-4 周,盯误报率和成本再进级。
🧭 业界视角(书外补充)
- Anthropic 40 万会话研究(2025.10-2026.04):典型会话中人做大部分规划决策,Claude 做大部分执行决策。Headless 模式是这一分工的极致形态——人把规划一次性写进 workflow YAML 和 Prompt,Claude 在流水线里纯做执行。这也解释了为什么书中强调"参数体系":规划质量全部前置到了配置文件里,配置写得多好,无人值守就有多可靠。(来源:anthropic.com/research/claude-code-expertise)
- 研究 → 计划 → 执行 → 审查循环在流水线中的映射(Karpathy 等人称之为 agentic engineering):交互模式下这个循环由人实时驱动,Headless 模式下它被拆散重组——"研究和计划"发生在写 workflow 时,"执行"在 CI 里无人值守,"审查"退化为质量门禁 + 人看报告。书中的四阶段落地路径本质上是逐步把"审查"环节从人移交给门禁,移交速度取决于误报率数据,不是取决于信心。
- 一个书中没细说的坑:PR 审查场景下 Claude 读的是不可信输入(第三方贡献者的代码和 PR 描述),存在 Prompt 注入面。这正是书中"容器隔离 + 只读白名单 + 严禁 Bash 全权"的深层理由——防的不只是模型犯错,还有恶意 PR 借模型之手作恶。
🔗 知识网络
- upstream:MCP:把 M×N 变成 M+N(CI 中用
--mcp-config+--strict-mcp-config隔离加载外部能力)、Hooks:给概率模型上确定性缰绳(同一思路:把概率行为约束成确定性规范) - downstream:ClaudeAgent SDK:从使用者到构建者(CLI 之于 SDK,如 curl 之于 HTTP 客户端库——复杂编排就该升级到 SDK)
- 平行关联:Claude Code 成本与安全工程、index