首页 › tutorials › Claude Code自动化三引擎:从-p到Routines实战

Claude Code 自动化三引擎:从 -p 到 Routines 实战

概述

Claude Code 提供了三层递进的自动化能力:本地脚本层的 -p 无头模式、代码库级的 /batch 并行迁移、云端托管的 Routines 定时任务。本教程将逐一拆解每层引擎的核心 API、输出格式、权限模型和成本控制策略,并通过一个完整的"PR 自动审查 → 代码迁移 → 夜间巡检"流水线串联三者。适合已掌握 Claude Code 基础操作、希望将其嵌入 CI/CD 或定时任务的中高级开发者。

适用人群:有 3 个月以上 Claude Code 使用经验的开发者、DevOps 工程师、技术负责人。

前置条件

条件 说明
Claude Code ≥ v2.1.63 /batch 命令从此版本开始提供,claude --version 检查
Node.js ≥ 20 Claude Code 运行环境
ANTHROPIC_API_KEY 无头模式必须通过环境变量认证
Git 仓库 /batch 和 Routines 依赖 Git 隔离
Claude Pro/Max/Team 计划 Routines 云端执行需要付费计划
# 检查版本
claude --version

# 如果版本过低,更新
claude update

# 验证 API Key 可用
echo $ANTHROPIC_API_KEY | head -c 10

第一层引擎:-p 无头模式——从终端到脚本的桥梁

1.1 核心语法与三件套

无头模式的本质是把 Claude Code 从交互式 REPL 变成一个可管道化的命令行工具。它由三个核心标志控制:

# 基础用法:单次提问,纯文本输出
claude -p "这个项目的认证模块做了什么?"

# 进阶:结构化 JSON 输出
claude -p "列出 auth.py 中所有函数名" --output-format json

# 高级:实时流式 JSON + 工具执行观察
claude -p "审查最近的 diff" \
  --output-format stream-json \
  --verbose \
  --include-partial-messages

三个标志的三角关系:

-p (非交互) + --bare (确定性启动) + --output-format json (结构化输出)

1.2 三种输出格式深度解析

flowchart LR
    A[claude -p] --> B{--output-format?}
    B -->|text| C[纯文本<br/>人类可读<br/>机器不友好]
    B -->|json| D[单次JSON信封<br/>result + session_id<br/>+ cost_usd]
    B -->|stream-json| E[换行分隔JSON流<br/>每个事件一行<br/>实时可观测]
    C --> F[适合: 快速问答]
    D --> G[适合: CI脚本<br/>结果解析]
    E --> H[适合: Dashboard<br/>长时间任务监控]

格式一:text(默认)

claude -p "解释 auth.py 中 OAuth2 的实现逻辑"
# 直接输出纯文本,和终端看到的一样

格式二:json——CI 脚本的主力

claude -p "审查这个 diff 并报告问题" \
  --output-format json | jq '.result'

JSON 输出包含以下关键字段:

{
  "result": "审查结论文本...",
  "session_id": "abc-123-def",
  "total_cost_usd": 0.034,
  "num_turns": 2,
  "usage": {
    "input_tokens": 15200,
    "output_tokens": 890
  }
}

成本字段 total_cost_usd 让你无需登录 Anthropic 控制台就能按调用追踪花费。

格式三:stream-json——实时可观测的杀手级格式

# 最小流式消费者:jq 过滤文本 token
claude -p "写一首关于代码的诗" \
  --output-format stream-json \
  --verbose \
  --include-partial-messages \
  | jq -rj 'select(.type == "stream_event" and .event.delta.type? == "text_delta") | .event.delta.text'

stream-json 输出的事件类型包括:

事件类型 含义 关键字段
system / session_start 会话初始化 session_id
system / api_retry API 重试中 attempt, max_retries, error_status
stream_event / text_delta 文本 token 增量 delta.text
tool_use 工具调用 tool_name, tool_input
tool_result 工具返回 output
result 最终结果 result, total_cost_usd

api_retry 事件对长时间运行任务至关重要——它告诉你 Claude 正在等待速率限制重置,而不是卡死了:

{
  "type": "system",
  "subtype": "api_retry",
  "attempt": 2,
  "max_retries": 5,
  "retry_delay_ms": 2000,
  "error_status": 429,
  "error": "rate_limit"
}

1.3 管道操作与文件批处理

-p 模式读取 stdin,因此可以无缝接入 Unix 管道:

# 管道输入:将构建错误喂给 Claude 分析
cat build-error.log | claude -p '简洁解释这个构建错误的根因' > analysis.md

# 管道 diff:代码审查脚本
git diff main | claude -p "你是拼写检查器。找出这个 diff 中的所有拼写错误,每行格式:文件名:行号" \
  --output-format json | jq -r '.result'

# 批量文件处理:为每个 Python 文件生成文档字符串
find src -name "*.py" -type f | while read file; do
  claude -p "为这个文件添加 docstring: $(cat "$file")" \
    --allowedTools "Edit" \
    --output-format json \
    | jq -r '.result' > "${file}.docstringd"
done

注意:管道 stdin 上限为 10MB(v2.1.128+)。超过时写入文件,在提示词中引用路径。

1.4 会话延续与多轮对话

无头模式不限于单轮交互。通过 --continue 和 --resume 可以链式调用:

# 第一步:分析代码
SESSION=$(claude -p "分析 auth.py 的安全漏洞" --output-format json | jq -r '.session_id')

# 第二步:延续同一会话,要求修复
claude -p "现在修复你刚才发现的所有漏洞" \
  --resume "$SESSION" \
  --allowedTools "Edit,Bash,Read"

# 第三步:验证修复
claude -p "运行测试验证修复" \
  --resume "$SESSION" \
  --allowedTools "Bash"

--continue 延续最近一次会话,--resume <session_id> 恢复指定会话。

1.5 --bare 模式详解

在 CI/CD 环境中,--bare 是你的安全网。它做了这些事:

claude --bare -p "总结这个文件" --allowedTools "Read"
行为 默认模式 --bare 模式
认证方式 OAuth + keychain 仅 ANTHROPIC_API_KEY
加载 Hooks 自动发现 不加载
加载 Skills 自动发现 不加载
加载 MCP 服务器 从 .mcp.json 发现 不加载
加载 CLAUDE.md 链式加载 不加载
确定性 依赖本地配置 每台机器一致

在 --bare 模式下,你需要显式传入上下文:

# 传入自定义系统提示
claude --bare -p "审查代码" \
  --append-system-prompt "你是一个安全审计专家"

# 传入 MCP 配置
claude --bare -p "查询数据库" \
  --mcp-config '{"mcpServers":{"postgres":{...}}}'

# 传入自定义 Agent
claude --bare -p "执行任务" \
  --agents '{"agents":[...]}'

1.6 JSON Schema 约束输出

当你需要 Claude 返回结构化数据而非自由文本时,使用 --json-schema:

# 提取函数列表为 JSON 数组
claude -p "提取 auth.py 中所有函数名" \
  --output-format json \
  --json-schema '{
    "type": "object",
    "properties": {
      "functions": {
        "type": "array",
        "items": {"type": "string"}
      }
    },
    "required": ["functions"]
  }'

响应中结构化数据出现在 structured_output 字段:

# 用 jq 提取结构化输出
claude -p "提取函数名" \
  --output-format json \
  --json-schema '{"type":"object","properties":{"functions":{"type":"array","items":{"type":"string"}}},"required":["functions"]}' \
  | jq '.structured_output'

第二层引擎:/batch 命令——代码库级并行迁移

2.1 /batch 与 -p 的本质区别

这两个经常被混淆,但它们服务于完全不同的场景:

维度 /batch -p 无头模式
执行环境 交互式会话内的斜杠命令 终端一次性执行
核心用途 代码库级迁移和重构 CI/CD 集成、脚本自动化
并行机制 自动生成多个 Agent 并行 通过 shell 脚本手动控制
Git 集成 每个代理独立 Worktree,自动创建 PR 标准 Git 操作(脚本控制)
引入版本 v2.1.63+ 初始版本

选择原则:对整个项目做批量变更用 /batch;嵌入现有流水线用 -p。

2.2 /batch 三阶段执行流程

flowchart TB
    A["/batch migrate from lodash to native"] --> B[阶段1: 调研与规划]
    B --> C[Explore Agent 扫描代码库]
    C --> D[分解为 5-30 个独立单元]
    D --> E{用户批准计划?}
    E -->|否| F[修改计划或中止]
    E -->|是| G[阶段2: 并行执行]
    G --> H["Agent 1<br/>Worktree A"]
    G --> I["Agent 2<br/>Worktree B"]
    G --> J["Agent N<br/>Worktree N"]
    H --> K[阶段3: 追踪与合并]
    I --> K
    J --> K
    K --> L[创建独立 PR]
    L --> M[聚合报告]

阶段一:调研与规划

编排器 Agent 进入规划模式,启动 Explore Agent 扫描代码库。它识别目标文件、模式和调用点,将工作分解为 5-30 个独立可合并的单元。如果找不到验证路径,会提示用户确认。

阶段二:并行执行

每个单元生成一个后台 Agent,所有 Agent 真正并行运行。每个 Agent 配置: - isolation: "worktree":独立 Git Worktree 隔离 - 自包含提示词:包含单元范围、修改指令、验证方法

阶段三:追踪与结果

所有单元完成后,编排器生成聚合报告并创建独立 PR。

2.3 典型用例与命令

# 在 Claude Code 交互式会话中执行
> /batch 将所有 lodash 调用替换为原生等价实现

> /batch 为所有无类型函数参数添加类型注解

> /batch 将所有数据库列名从 camelCase 改为 snake_case

> /batch 将 React 组件迁移到 Vue 组合式 API

每个命令都会触发上述三阶段流程。/batch 的速度优势来自真正的并行——比逐个发送提示词快最多 10 倍。

2.4 /batch 与 /simplify 的配合

/simplify 是 /batch 的自然搭档,专注于代码质量审查而非迁移:

/simplify 启动三个并行审查 Agent:
├── 代码复用 Agent → 发现重复逻辑、遗漏的抽象
├── 代码质量 Agent → 标记可读性问题、架构缺陷
└── 效率 Agent → 检测性能问题、资源浪费

推荐工作流:

实现功能 → /simplify 清理代码 → /batch 执行跨文件迁移 → CI 审查

第三层引擎:Routines——云端托管定时任务

3.1 Routines 是什么

Routines 是 2026 年 4 月推出的研究预览功能。一个 Routine 就是一组保存的 Claude Code 配置:提示词 + 仓库 + 连接器,打包后在 Anthropic 托管的云基础设施上自动运行。笔记本合上也能继续工作。

Routines 有三种触发器:

触发器 说明 典型场景
定时触发 按小时/每天/每周/一次性运行 每日 Issue 清理、每周文档漂移检测
API 触发 HTTP POST 到专属端点 部署后冒烟测试、告警自动修复
GitHub 触发 PR 打开/合并/Release 发布时 PR 自动审查、SDK 跨语言同步

3.2 创建 Routine

方式一:从 Web 界面创建

  1. 访问 claude.ai/code/routines,点击 New routine
  2. 命名并编写提示词(提示词是核心——Routine 自主运行,必须自包含且明确)
  3. 选择 GitHub 仓库(运行时从默认分支克隆)
  4. 选择云环境(控制网络访问和环境变量)
  5. 添加连接器(Slack、Linear、GitHub 等外部服务)
  6. 配置触发器

方式二:从 CLI 创建

# 在 Claude Code 交互会话中
> /schedule

关键配置项:

Routine 配置:
  提示词: "自包含的任务描述,包含成功标准"
  仓库: [repo1, repo2]
  环境:
    网络访问: Trusted / Restricted / None
    环境变量: {API_KEY: "***", SLACK_WEBHOOK: "***"}
    安装脚本: "npm ci && npm run build"
  连接器: [Slack, Linear, GitHub]
  触发器:
    - 类型: schedule
      cron: "0 9 * * 1-5"  # 工作日早上9点
    - 类型: api
      endpoint: /routines/{id}/trigger
    - 类型: github
      events: [pull_request.opened]

3.3 三种触发器详解

定时触发

# 每晚 2 点运行安全扫描
触发器: schedule
cron: "0 2 * * *"
提示词: "扫描最近24小时合并的PR,检查是否引入新的安全漏洞。如果有,在相关PR下留言并通知 #security Slack频道。"

# 每周一上午清理 backlog
触发器: schedule
cron: "0 9 * * 1"
提示词: "读取本周新增的 Issues,按模块打标签、分配 Owner,在 Slack 发送摘要。"

API 触发

# 部署后触发验证
curl -X POST https://api.claude.ai/routines/{id}/trigger \
  -H "Authorization: Bearer $CLAUDE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"text": "生产环境部署完成,版本 v2.3.1。请运行冒烟测试。"}'

API 触发支持传入 text 字段作为动态上下文,让同一个 Routine 可以响应不同事件。

GitHub 触发

触发器:
  类型: github
  事件: pull_request.opened
  过滤:
    仓库: myorg/backend-api
    分支: "!dependabot/*"  # 排除 dependabot PR

GitHub 触发器会在 PR 创建时自动克隆仓库,Claude 创建 claude/ 前缀的分支进行变更。

3.4 Routines 的安全边界

Routine 运行在云端,以你的身份执行操作。关键安全原则:

3.5 Routines vs -p vs /batch 选择决策

flowchart TD
    A[需要自动化] --> B{任务范围?}
    B -->|单个文件/快速问答| C[-p 无头模式]
    B -->|整个代码库迁移| D[/batch 命令]
    B -->|定时/事件驱动| E[Routines]

    C --> F{需要持续运行?}
    F -->|否| G[shell 脚本 + claude -p]
    F -->|是| H[CI/CD 管道 + -p]

    D --> I{需要审查后合并?}
    I -->|是| J[/batch + 自动 PR]
    I -->|否| K[直接提交]

    E --> L{触发方式?}
    L -->|定时| M[Schedule Trigger]
    L -->|HTTP 调用| N[API Trigger]
    L -->|Git 事件| O[GitHub Trigger]
场景 推荐方案 理由
CI 中审查 PR -p + --bare 确定性、可审计、低成本
全项目 API 迁移 /batch 并行 Agent、Worktree 隔离
每日 Issue 清理 Routines + 定时触发 笔记本关闭也能运行
部署后健康检查 Routines + API 触发 按需触发、云端执行
SDK 跨语言同步 Routines + GitHub 触发 PR 合并自动触发
批量文件处理 -p + shell 循环 灵活、可管道化

Hooks:连接三层引擎的神经系统

4.1 Hooks 生命周期全景

Hooks 是在 Claude Code 生命周期特定节点执行的脚本、HTTP 调用或 LLM 提示。它们让你在不需要修改 Claude Code 本身的情况下注入自定义逻辑。

timeline
    title Claude Code 生命周期中的 Hook 事件
    section 会话级
        SessionStart : 会话开始时
        Setup : --init-only 或 -p + --init 时
        SessionEnd : 会话结束时
    section 轮次级
        UserPromptSubmit : 用户提交提示词后
        InstructionsLoaded : CLAUDE.md 加载时
        Stop : Claude 完成响应时
    section 工具级
        PreToolUse : 工具执行前(可阻止)
        PermissionRequest : 权限弹窗时
        PostToolUse : 工具成功执行后
        PostToolUseFailure : 工具执行失败后
        PostToolBatch : 批量工具调用完成后
    section Agent 级
        SubagentStart : 子 Agent 启动时
        SubagentStop : 子 Agent 完成时
        TaskCreated : 任务创建时
        TaskCompleted : 任务完成时

总共 25+ 个 Hook 事件,覆盖了从会话启动到工具调用的每一个关键节点。

4.2 Hook 配置结构

Hooks 在 .claude/settings.json 中配置:

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "if": "Bash(rm *)",
            "command": "${CLAUDE_PROJECT_DIR}/.claude/hooks/block-rm.sh",
            "args": []
          }
        ]
      }
    ],
    "PostToolUse": [
      {
        "matcher": "Edit",
        "hooks": [
          {
            "type": "command",
            "command": "npx prettier --write ${CLAUDE_FILE_PATH}"
          }
        ]
      }
    ],
    "UserPromptSubmit": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "python3 .claude/hooks/enhance-prompt.py"
          }
        ]
      }
    ]
  }
}

4.3 Hook 四种处理器类型

类型 说明 适用场景
command 执行 Shell 命令 格式化、lint、阻止危险操作
http 发送 HTTP POST 通知外部系统、审计日志
prompt 返回 LLM 提示给 Claude 动态注入上下文、修改行为
agent 启动独立 Agent 复杂决策、多条件判断

4.4 关键 Hook 事件实战

PreToolUse:安全门禁

#!/bin/bash
# .claude/hooks/block-destructive.sh
# 读取 stdin 中的 JSON 输入
INPUT=$(cat)
COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command')

# 阻止 rm -rf 和 force push
if echo "$COMMAND" | grep -qE 'rm -rf|push --force|reset --hard'; then
  jq -n '{
    hookSpecificOutput: {
      hookEventName: "PreToolUse",
      permissionDecision: "deny",
      permissionDecisionReason: "阻止破坏性操作: '"$COMMAND"'"
    }
  }'
  exit 0
fi
# 不输出任何内容表示放行

PostToolUse:自动格式化

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit",
        "hooks": [
          {
            "type": "command",
            "command": "npx prettier --write \"$CLAUDE_FILE_PATH\" 2>/dev/null; npx eslint --fix \"$CLAUDE_FILE_PATH\" 2>/dev/null"
          }
        ]
      }
    ]
  }
}

Stop:完成通知

{
  "hooks": {
    "Stop": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "terminal-notifier -title 'Claude Code' -message '任务完成' -sound default"
          }
        ]
      }
    ]
  }
}

UserPromptSubmit:提示词增强

#!/bin/bash
# .claude/hooks/enhance-prompt.py
import json, sys

data = json.load(sys.stdin)
prompt = data.get("user_prompt", "")

# 注入项目上下文
context = """
项目上下文:
- 技术栈: Next.js 15 + TypeScript + Prisma
- 编码规范: ESLint strict, Prettier
- 测试框架: Vitest
- 分支策略: feature/* → develop → main
"""

output = {
    "hookSpecificOutput": {
        "hookEventName": "UserPromptSubmit",
        "appendedUserPrompt": context + "\n" + prompt
    }
}
json.dump(output, sys.stdout)

4.5 Setup Hook:CI/CD 的初始化利器

Setup Hook 是专门为 CI 环境设计的。配合 --init-only 标志,可以只运行初始化脚本而不启动会话:

# 只运行 Setup hooks 然后退出
claude --init-only

# 在 -p 模式中先运行 Setup 再执行任务
claude -p "运行测试" --init

# 维护模式:运行 Setup + 自动修复
claude -p "修复 lint 错误" --maintenance

Setup Hook 配置示例:

{
  "hooks": {
    "Setup": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "npm ci && npm run build && echo '环境准备完成'"
          }
        ]
      }
    ]
  }
}

Auto Mode:减少 93% 的权限弹窗

5.1 问题与解决方案

Anthropic 内部数据:Claude Code 用户批准了 93% 的权限弹窗。这意味着绝大多数弹窗只是形式——用户看都不看就点确认。Auto Mode 用一个两层 AI 分类器自动化这个过程:

flowchart TD
    A[Claude Code 操作] --> B{快速过滤器<br/>单 token 分类}
    B -->|明显安全| C[直接执行]
    B -->|不确定| D{思维链审查<br/>深度推理}
    D -->|审查通过| C
    D -->|需要人工| E[弹出权限请求]

    style C fill:#4caf50,color:#fff
    style E fill:#f44336,color:#fff

第一层:快速过滤器——单 token 分类判断操作是否明显安全。安全的直接放行,延迟极低。

第二层:思维链审查——快速过滤器无法决定时,第二个模型进行深度推理,然后决定执行还是升级给开发者。

例外情况:涉及凭证、关键基础设施、生产部署的操作,无论分类器结论如何,仍然需要人工确认。

5.2 使用建议


实战案例:三级自动化流水线

场景描述

构建一个完整的自动化流水线,覆盖日常开发的核心环节:

  1. PR 自动审查(-p 无头模式 + GitHub Actions)
  2. 全项目 TypeScript 迁移(/batch 命令)
  3. 每日安全巡检(Routines 定时触发)
  4. 安全门禁(Hooks PreToolUse)

步骤一:PR 自动审查 GitHub Actions

创建 .github/workflows/claude-review.yml:

name: Claude PR Review

on:
  pull_request:
    types: [opened, synchronize]

jobs:
  review:
    runs-on: ubuntu-latest
    timeout-minutes: 10
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - uses: actions/setup-node@v4
        with:
          node-version: '20'

      - name: Install Claude Code
        run: npm install -g @anthropic-ai/claude-code

      - name: Run Review
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
          BASE_SHA: ${{ github.event.pull_request.base.sha }}
          HEAD_SHA: ${{ github.event.pull_request.head.sha }}
        run: |
          DIFF=$(git diff --unified=3 "$BASE_SHA"..."$HEAD_SHA")
          echo "$DIFF" | claude -p \
            --bare \
            --output-format json \
            --allowedTools "Read,Grep,Glob" \
            --max-turns 5 \
            "Review this diff. Flag only issues that would cause bugs or security vulnerabilities.
             If there are none, say so. Keep response under 400 words." \
            > review.json

      - name: Post Review
        run: node .github/scripts/post-review.js
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

创建 .github/scripts/post-review.js:

const fs = require('fs');
const { execSync } = require('child_process');

const review = JSON.parse(fs.readFileSync('review.json', 'utf8'));
const body = review.result || 'No review generated.';
const cost = review.total_cost_usd || 0;

// 发布 PR 评论
execSync(`gh pr comment --body "## Claude Code Review (cost: $${cost.toFixed(4)})\n\n${body}"`, {
  stdio: 'inherit'
});

步骤二:全项目 API 路由迁移

在交互式 Claude Code 会话中:

> /batch 将所有 REST API 路由从 Express 风格迁移到 Hono 框架

/batch 会自动: 1. 扫描所有路由文件 2. 分解为独立迁移单元(每个文件一个) 3. 在独立 Worktree 中并行执行 4. 为每个单元创建 PR

步骤三:每日安全巡检 Routine

在 claude.ai/code/routines 创建:

名称: 每日安全巡检
提示词: |
  1. 检查最近 24 小时合并的 PR
  2. 扫描新增的依赖项是否有已知漏洞(npm audit)
  3. 检查是否有硬编码的 secret 或 API key
  4. 如果发现问题,在对应 PR 下留言,并通知 #security Slack 频道
  5. 如果一切正常,在 #dev-ops 频道发送"安全巡检通过"

仓库: myorg/backend-api
环境: Default (Trusted network)
连接器: Slack (#security, #dev-ops), GitHub
触发器: 
  - 类型: schedule
    cron: "0 2 * * *"  # 每天凌晨 2 点

步骤四:安全门禁 Hooks

在项目根目录 .claude/settings.json 中配置:

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "if": "Bash(rm *)",
            "command": ".claude/hooks/gate-destructive.sh"
          }
        ]
      },
      {
        "matcher": "Edit",
        "hooks": [
          {
            "type": "command",
            "if": "Edit(*.env*)",
            "command": ".claude/hooks/block-env-edit.sh"
          }
        ]
      }
    ],
    "PostToolUse": [
      {
        "matcher": "Edit",
        "hooks": [
          {
            "type": "command",
            "command": "npx prettier --write \"$CLAUDE_FILE_PATH\" 2>/dev/null || true"
          }
        ]
      }
    ],
    "PermissionRequest": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "python3 .claude/hooks/auto-permission.py"
          }
        ]
      }
    ]
  }
}

自动权限审批脚本 .claude/hooks/auto-permission.py:

#!/usr/bin/env python3
import json, sys, os

data = json.load(sys.stdin)
tool = data.get("tool_name", "")
action = data.get("tool_input", {})

# 安全操作白名单:自动批准
SAFE_PATTERNS = {
    "Read": None,          # 读操作全部放行
    "Grep": None,          # 搜索全部放行
    "Glob": None,          # 文件查找全部放行
    "Bash": ["git status", "git diff", "git log", "npm test", "npm run lint"],
    "Edit": None,          # 需要额外检查
}

decision = {"hookSpecificOutput": {"hookEventName": "PermissionRequest"}}

if tool in ("Read", "Grep", "Glob"):
    decision["hookSpecificOutput"]["permissionDecision"] = "allow"
elif tool == "Bash":
    cmd = action.get("command", "")
    if any(cmd.startswith(safe) for safe in SAFE_PATTERNS["Bash"]):
        decision["hookSpecificOutput"]["permissionDecision"] = "allow"
    else:
        decision["hookSpecificOutput"]["permissionDecision"] = "ask"
else:
    decision["hookSpecificOutput"]["permissionDecision"] = "ask"

json.dump(decision, sys.stdout)

完整架构总览

flowchart TB
    subgraph 触发层
        PR[PR 事件] --> GH[GitHub Actions]
        CRON[定时调度] --> RT[Routines 云端]
        API[HTTP 调用] --> RT
        DEV[开发者操作] --> CC[Claude Code 交互式]
    end

    subgraph 执行层
        GH --> HP["-p 无头模式<br/>--bare --output-format json"]
        CC --> BAT["/batch 命令<br/>并行 Agent"]
        RT --> CLOUD[云端 Claude Code 会话]
    end

    subgraph 安全层
        HP --> HK["Hooks 神经系统"]
        BAT --> HK
        CLOUD --> HK
        HK --> PTU["PreToolUse: 安全门禁"]
        HK --> PRT["PermissionRequest: 自动审批"]
        HK --> ATU["PostToolUse: 格式化"]
    end

    subgraph 输出层
        HP --> JSON["JSON / stream-json"]
        BAT --> PRS["独立 PR + 聚合报告"]
        CLOUD --> SLACK["Slack 通知"]
        CLOUD --> GHIS["GitHub Issue 评论"]
    end

    style HK fill:#ff9800,color:#fff
    style RT fill:#9c27b0,color:#fff

成本控制与最佳实践

成本追踪

# 每次调用后提取成本
claude -p "分析代码" --output-format json | jq '{cost: .total_cost_usd, turns: .num_turns}'

# 批量任务成本聚合
total=0
for file in src/*.py; do
  cost=$(claude -p "审查: $(cat $file)" --output-format json | jq '.total_cost_usd')
  total=$(echo "$total + $cost" | bc)
  echo "$file: \$$cost"
done
echo "总计: \$$total"

最佳实践清单

层级 实践 原因
-p 模式 始终使用 --bare CI 中确保确定性
-p 模式 设置 timeout-minutes 防止 $180 的意外账单
-p 模式 用 --allowedTools 限制工具 审查作业不应有 Edit 权限
/batch 先在小范围测试 确认迁移策略正确后再全量
/batch 审查每个 PR 自动化不等于免审查
Routines 提示词自包含 自主运行时无人补充上下文
Routines 最小权限原则 只授权必需的连接器和分支
Hooks 异步 Hook 用于非关键任务 避免阻塞主流程
通用 用 --max-turns 限制轮次 防止无限循环

延伸阅读

参考来源

  1. Run Claude Code programmatically - Claude Code Docs — 官方无头模式完整文档,涵盖 -p、--bare、输出格式、会话延续
  2. Hooks reference - Claude Code Docs — 官方 Hooks 事件规范,25+ 生命周期事件的 JSON 输入输出格式
  3. Automate work with routines - Claude Code Docs — 官方 Routines 文档,三种触发器类型和云端执行架构
  4. Claude Code in CI/CD: headless patterns for real pipelines - Refactix — 生产级 CI/CD 集成模式,含 GitHub Actions 完整工作流
  5. Claude Code stream-json: the output format that changes everything - BackgroundClaude — stream-json 格式深度解析和消费者实现
  6. Claude Code Routines and Auto Mode - ChatForest — Auto Mode 双层分类器架构和 Routines 定价分析

[!tip] 51学通信知识星球 星主:爱卫生(微信:gprshome201101)——公众号「51学通信」创办者,19 年通信行业运维与讲师经验,著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书(各大电商平台有售)。 星球定位:深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域,主打运维岗位与信令分析。 当前规模:5200 篇主题 / 990 个回答,198 元/年。 加入福利:加入星球后请加爱卫生微信,拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题,另有群内分享。 AI 加持:51学通信知识星球已作为 skill 接入 WorkBuddy,使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例,做总结、找文档和 PPT 等场景全覆盖。

51学通信知识星球海报-扫码加入