首页 › tutorials › Claude Code事件驱动自动化:Hooks到自愈流水线

Claude Code事件驱动自动化:Hooks触发到自愈流水线实战

概述

本教程面向有一定Claude Code基础的中高级开发者,学习如何将-p非交互模式、Hooks生命周期钩子、会话管理与批量处理整合为一条事件驱动的自动化流水线。不同于单点使用-p命令或单独配置Hooks,本教程聚焦三者联动——让Claude Code像CI系统一样自主感知、响应、修复,构建从代码提交到自动修复的完整闭环。适合需要7×24小时无人值守AI辅助开发的团队。

前置条件

一、自动化三件套:架构全景

在深入每个组件之前,先建立整体架构认知。Claude Code的自动化能力由三个核心层构成:

graph TB
    subgraph 触发层["触发层(Hooks)"]
        A[PreToolUse] --> D{路由决策}
        B[PostToolUse] --> D
        C[Notification] --> D
        E[Stop] --> D
        F[SubagentStop] --> D
    end

    subgraph 执行层["执行层(-p Headless)"]
        D --> G[claude -p 单次任务]
        D --> H[claude -p --continue 续接]
        D --> I[claude -p --resume 恢复]
    end

    subgraph 编排层["编排层(Batch + Worktree)"]
        G --> J[串行批处理]
        H --> K[并行Worktree]
        I --> L[条件分支]
    end

    J --> M[结果汇总]
    K --> M
    L --> M

    M -->|反馈| 触发层

    style 触发层 fill:#e1f5fe
    style 执行层 fill:#fff3e0
    style 编排层 fill:#e8f5e9

关键洞察:三层不是孤立的。Hooks捕获事件后可以触发-p命令执行,-p执行中的工具调用又会被Hooks拦截,形成递归反馈循环。这正是"事件驱动"的精髓——不是你告诉Claude做什么,而是事件告诉Claude该做什么。

二、-p模式深度实战:超越简单命令

2.1 基础用法回顾与进阶

-p(--print)标志将Claude Code从交互式终端工具转变为可编程的命令行工具:

# 基础:单次问答
claude -p "解释src/auth.ts的认证流程"

# 进阶:指定输出格式
claude -p "列出所有TODO注释" --output-format json

# 进阶:流式JSON输出(适合实时处理)
claude -p "重构数据库模块" --output-format stream-json

# 高级:限制工具和轮次
claude -p "修复lint错误" \
  --allowedTools "Read,Write,Bash" \
  --max-turns 5 \
  --output-format json

2.2 会话连续性:--continue与--resume

这是构建复杂自动化流水线的关键能力——让AI"记住"上下文:

# --continue:继续最近一次对话
claude -p "为刚才的重构添加单元测试" --continue

# --resume:恢复指定会话(通过会话ID)
claude -p "继续优化性能" --resume abc123-session-id

# 组合使用:从上次中断处继续,限制轮次防止跑飞
claude -p "继续上次的数据库迁移工作" \
  --continue \
  --max-turns 8 \
  --output-format json

实战技巧:在自动化脚本中保存会话ID,实现跨脚本调用上下文延续:

#!/bin/bash
# auto-fix-pipeline.sh — 自动修复流水线

PROJECT_DIR="$1"
SESSION_FILE="/tmp/claude_session_${PROJECT_DIR//\//_}.txt"

# 第一步:分析问题
RESULT=$(claude -p "分析 $PROJECT_DIR 中所有TypeScript编译错误,分类汇总" \
  --output-format json \
  --max-turns 3)

# 提取会话ID(从JSON输出中)
SESSION_ID=$(echo "$RESULT" | jq -r '.session_id // empty')

if [ -n "$SESSION_ID" ]; then
  echo "$SESSION_ID" > "$SESSION_FILE"
fi

# 第二步:基于分析结果自动修复(延续上下文)
if [ -f "$SESSION_FILE" ]; then
  claude -p "根据刚才的分析,按优先级修复错误。每修复一类就运行 tsc --noEmit 验证。" \
    --resume "$(cat "$SESSION_FILE")" \
    --max-turns 10 \
    --allowedTools "Read,Write,Bash"
fi

2.3 输出格式与管道集成

--output-format是自动化集成的核心桥梁:

格式 适用场景 解析方式
text 人类阅读、简单日志 直接输出
json 结构化解析、CI判断 jq 提取字段
stream-json 实时监控、进度跟踪 逐行JSON解析
# 在GitHub Actions中使用JSON输出进行决策
REVIEW=$(claude -p "审查本次PR的代码变更,评估风险等级:low/medium/high" \
  --output-format json \
  --max-turns 3)

RISK_LEVEL=$(echo "$REVIEW" | jq -r '.result // "unknown"')

if [ "$RISK_LEVEL" = "high" ]; then
  echo "::warning::AI检测到高风险变更,建议人工审查"
fi

2.4 system-prompt与allowedTools的安全边界

在自动化场景中,安全边界至关重要:

# 最小权限原则:只允许读取和搜索
claude -p "检查代码中是否有硬编码的API密钥" \
  --system-prompt "你是安全审计专家。只报告发现,不修改任何文件。" \
  --allowedTools "Read,Grep,Glob" \
  --output-format json

# 受限写入:只允许修改测试文件
claude -p "为所有未覆盖的函数生成单元测试" \
  --allowedTools "Read,Write,Grep,Glob,Bash" \
  --disallowedTools "Edit" \
  --max-turns 15

三、Hooks深度实战:事件驱动架构

3.1 Hooks配置结构与事件类型

Hooks在settings.json中配置,定义了Claude Code生命周期各节点的拦截逻辑:

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "node ~/.claude/hooks/pre-bash-guard.js"
          }
        ]
      }
    ],
    "PostToolUse": [
      {
        "matcher": "Write",
        "hooks": [
          {
            "type": "command",
            "command": "node ~/.claude/hooks/post-write-format.js"
          }
        ]
      }
    ],
    "Notification": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "node ~/.claude/hooks/notify.js"
          }
        ]
      }
    ],
    "Stop": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "node ~/.claude/hooks/on-stop.js"
          }
        ]
      }
    ]
  }
}

3.2 六大事件类型与拦截场景

sequenceDiagram
    participant User as 用户/脚本
    participant Claude as Claude Code
    participant Hook as Hooks系统
    participant Tool as 工具(Bash/Write等)

    User->>Claude: 发送Prompt
    Note over Claude: UserPromptSubmit触发

    Claude->>Hook: PreToolUse事件
    Hook-->>Claude: 允许/拒绝/注入

    alt 被允许
        Claude->>Tool: 执行工具
        Tool-->>Claude: 工具结果
        Claude->>Hook: PostToolUse事件
        Hook-->>Claude: 后处理完成
    else 被拒绝
        Claude-->>User: 工具被阻止
    end

    Note over Claude: 可能触发Notification

    Claude-->>User: 最终响应
    Note over Claude: Stop事件触发
    Claude->>Hook: Stop回调
事件 触发时机 典型用途 返回值影响
PreToolUse 工具执行前 安全拦截、参数校验 exit 2阻止执行
PostToolUse 工具执行后 自动格式化、日志记录 注入补充信息
Notification 通知事件时 外部告警、Slack推送 无阻塞影响
Stop Agent停止时 结果汇总、后续触发 无阻塞影响
SubagentStop 子Agent停止时 结果聚合 无阻塞影响
UserPromptSubmit 用户提交Prompt时 输入预处理、注入上下文 修改prompt内容

3.3 实战Hook:智能安全守卫

以下是一个完整的PreToolUse Hook,实现智能命令拦截:

// ~/.claude/hooks/pre-bash-guard.js
// 从stdin读取JSON输入
let input = '';
process.stdin.on('data', (chunk) => { input += chunk; });
process.stdin.on('end', () => {
  const data = JSON.parse(input);
  const toolName = data.tool_name;   // 如 "Bash"
  const toolInput = data.tool_input; // 如 { command: "rm -rf /" }

  if (toolName === 'Bash') {
    const cmd = toolInput.command || '';

    // 规则1:阻止危险命令
    const dangerous = [
      /rm\s+-rf\s+\//,
      /git\s+push\s+--force/,
      /DROP\s+TABLE/i,
      /curl.*\|\s*sh/,
      />\s*\/dev\/sd/,
    ];

    for (const pattern of dangerous) {
      if (pattern.test(cmd)) {
        console.log(JSON.stringify({
          decision: "block",
          reason: `安全策略阻止:检测到危险命令模式 "${pattern.source}"`
        }));
        process.exit(2); // exit 2 = 阻止工具执行
      }
    }

    // 规则2:对生产环境操作要求确认标记
    if (/prod|production/i.test(cmd) && !/DRY_RUN/.test(cmd)) {
      console.log(JSON.stringify({
        decision: "block",
        reason: "生产环境操作需要添加 DRY_RUN 标记确认"
      }));
      process.exit(2);
    }
  }

  // 规则3:保护敏感文件
  if (toolName === 'Write' || toolName === 'Edit') {
    const filePath = toolInput.file_path || '';
    const protected = ['.env', 'credentials', 'secret', 'private.key'];
    if (protected.some(p => filePath.toLowerCase().includes(p))) {
      console.log(JSON.stringify({
        decision: "block",
        reason: `禁止修改敏感文件: ${filePath}`
      }));
      process.exit(2);
    }
  }

  // 允许通过
  process.exit(0);
});

3.4 实战Hook:自动格式化与质量门禁

PostToolUse Hook在文件写入后自动执行格式化和lint:

// ~/.claude/hooks/post-write-format.js
const { execSync } = require('child_process');

let input = '';
process.stdin.on('data', (chunk) => { input += chunk; });
process.stdin.on('end', () => {
  const data = JSON.parse(input);

  if (data.tool_name === 'Write' || data.tool_name === 'Edit') {
    const filePath = data.tool_input.file_path || '';

    // 根据文件类型执行对应格式化
    try {
      if (filePath.endsWith('.ts') || filePath.endsWith('.tsx')) {
        execSync(`npx prettier --write "${filePath}" 2>/dev/null`, { timeout: 10000 });
        execSync(`npx eslint --fix "${filePath}" 2>/dev/null`, { timeout: 10000 });
      } else if (filePath.endsWith('.py')) {
        execSync(`black "${filePath}" 2>/dev/null`, { timeout: 10000 });
        execSync(`isort "${filePath}" 2>/dev/null`, { timeout: 10000 });
      } else if (filePath.endsWith('.go')) {
        execSync(`gofmt -w "${filePath}" 2>/dev/null`, { timeout: 10000 });
      }

      // 注入反馈信息(通过stdout返回)
      console.log(JSON.stringify({
        supplemented_output: `\n[自动格式化完成: ${filePath}]`
      }));
    } catch (e) {
      // 格式化失败不影响主流程
      console.error(`格式化警告: ${e.message}`);
    }
  }

  process.exit(0);
});

3.5 实战Hook:Stop事件触发后续自动化

Stop Hook是构建"自愈流水线"的关键——当Agent完成工作时,自动触发下一步:

// ~/.claude/hooks/on-stop.js
const { execSync } = require('child_process');
const fs = require('fs');

let input = '';
process.stdin.on('data', (chunk) => { input += chunk; });
process.stdin.on('end', () => {
  const data = JSON.parse(input);
  const sessionDir = process.cwd();

  // 保存会话结果摘要
  const summary = {
    timestamp: new Date().toISOString(),
    transcript_path: data.transcript_path,
    stop_reason: data.stop_reason,
    working_dir: sessionDir
  };

  fs.writeFileSync(
    '/tmp/claude-stop-event.json',
    JSON.stringify(summary, null, 2)
  );

  // 如果是Git仓库且有变更,自动运行测试
  try {
    const status = execSync('git status --porcelain', { encoding: 'utf-8' });
    if (status.trim().length > 0) {
      // 触发后续-p命令进行验证
      execSync(
        'claude -p "运行项目测试套件验证最近修改是否引入回归。如有失败,分析原因并修复。" ' +
        '--max-turns 8 --allowedTools "Read,Write,Bash,Grep" ' +
        '--output-format json >> /tmp/claude-auto-verify.log 2>&1 &',
        { detached: true, stdio: 'ignore' }
      );
    }
  } catch (e) {
    // 非Git仓库或无变更,跳过
  }

  process.exit(0);
});

四、批量任务编排实战

4.1 串行批处理:多仓库统一操作

#!/bin/bash
# batch-repo-upgrade.sh — 批量升级多个仓库的依赖
set -euo pipefail

REPOS=(
  "/home/dev/project-alpha"
  "/home/dev/project-beta"
  "/home/dev/project-gamma"
)

PROMPT="检查项目中的过期npm依赖,按安全优先级升级。
升级每个依赖后运行 npm test 验证。
如果测试失败,回滚该依赖并记录问题。"

RESULTS=()

for repo in "${REPOS[@]}"; do
  echo "=== 处理: $repo ==="

  cd "$repo"

  RESULT=$(claude -p "$PROMPT" \
    --allowedTools "Read,Write,Bash,Grep,Glob" \
    --max-turns 15 \
    --output-format json 2>/dev/null)

  # 记录结果
  echo "$RESULT" | jq -r '.result // "无输出"' > "/tmp/upgrade_$(basename $repo).txt"
  RESULTS+=("$repo: $(echo "$RESULT" | jq -r '.result // "失败"' | head -c 100)")

  echo "--- $repo 完成 ---"
done

echo "====== 汇总报告 ======"
printf '%s\n' "${RESULTS[@]}"

4.2 并行Worktree批处理:大规模重构

#!/bin/bash
# parallel-refactor.sh — 并行重构多个模块
set -euo pipefail

MODULES=("auth" "payment" "notification" "analytics" "user")
BASE_BRANCH="main"

# 为每个模块创建隔离的worktree
for module in "${MODULES[@]}"; do
  WORKTREE_PATH=".claude/worktrees/refactor-${module}"

  # 创建worktree和分支
  git worktree add "$WORKTREE_PATH" -b "refactor/${module}" HEAD 2>/dev/null || true

  # 在每个worktree中并行启动Claude Code
  (
    cd "$WORKTREE_PATH"
    claude -p "重构 ${module} 模块:
    1. 将所有any类型替换为具体类型
    2. 提取重复逻辑到共享工具函数
    3. 添加JSDoc注释
    4. 运行测试确保无回归" \
      --allowedTools "Read,Write,Bash,Grep,Glob" \
      --max-turns 12 \
      --output-format json > "/tmp/refactor_${module}.json" 2>&1

    echo "[完成] ${module} 模块重构"
  ) &
done

# 等待所有并行任务完成
wait

echo "====== 全部模块重构完成 ======"

# 汇总结果
for module in "${MODULES[@]}"; do
  RESULT_FILE="/tmp/refactor_${module}.json"
  if [ -f "$RESULT_FILE" ]; then
    STATUS=$(jq -r '.result // "未知"' "$RESULT_FILE" | head -c 200)
    echo "${module}: ${STATUS}"
  fi
done

4.3 使用/batch命令(Claude Code内置批处理)

Claude Code内置的/batch命令提供了声明式的并行执行能力:

# 在Claude Code交互会话中使用
/batch

/batch命令允许你描述多个独立任务,Claude Code会自动将它们分配到并行的工作树中执行。适合以下场景:

核心优势:Claude自动判断任务间的依赖关系,将独立任务并行化,有依赖的任务串行化,无需手动编排。

五、实战案例:自愈代码质量流水线

以下是一个完整的、可直接运行的自愈流水线——当代码提交后,自动检测问题并尝试修复:

5.1 项目结构

auto-heal-pipeline/
├── .claude/
│   └── settings.json          # Hooks配置
├── scripts/
│   ├── heal-pipeline.sh       # 主流水线脚本
│   ├── hooks/
│   │   ├── post-write-lint.js # PostToolUse: 自动lint
│   │   └── on-stop-report.js  # Stop: 生成报告
│   └── report/
│       └── template.html      # 报告模板
└── CLAUDE.md                   # 项目指令

5.2 Hooks配置

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [{
          "type": "command",
          "command": "node scripts/hooks/pre-bash-guard.js"
        }]
      },
      {
        "matcher": "Write",
        "hooks": [{
          "type": "command",
          "command": "node scripts/hooks/pre-write-guard.js"
        }]
      }
    ],
    "PostToolUse": [
      {
        "matcher": "Write",
        "hooks": [{
          "type": "command",
          "command": "node scripts/hooks/post-write-lint.js"
        }]
      },
      {
        "matcher": "Edit",
        "hooks": [{
          "type": "command",
          "command": "node scripts/hooks/post-write-lint.js"
        }]
      }
    ],
    "Stop": [
      {
        "hooks": [{
          "type": "command",
          "command": "node scripts/hooks/on-stop-report.js"
        }]
      }
    ]
  }
}

5.3 主流水线脚本

#!/bin/bash
# heal-pipeline.sh — 自愈代码质量流水线
set -euo pipefail

PROJECT_DIR="${1:-.}"
MAX_HEAL_ROUNDS=3
LOG_DIR="/tmp/claude-heal-$(date +%Y%m%d-%H%M%S)"
mkdir -p "$LOG_DIR"

echo "🔬 自愈流水线启动 — 目标: $PROJECT_DIR"

cd "$PROJECT_DIR"

# ── 阶段1: 检测 ──
echo "📋 阶段1: 问题检测..."
DETECTION=$(claude -p "执行全面的代码质量检测:
1. 运行 eslint 检查所有源文件,统计错误和警告数量
2. 运行 tsc --noEmit 检查类型错误
3. 运行测试套件,记录失败用例
4. 以JSON格式输出:{ lint_errors: number, type_errors: number, test_failures: string[] }" \
  --allowedTools "Read,Bash,Grep,Glob" \
  --max-turns 5 \
  --output-format json)

echo "$DETECTION" | jq '.' > "$LOG_DIR/detection.json"

LINT_ERRORS=$(echo "$DETECTION" | jq '.result.lint_errors // 0')
TYPE_ERRORS=$(echo "$DETECTION" | jq '.result.type_errors // 0')

echo "  检测结果: Lint错误=${LINT_ERRORS}, 类型错误=${TYPE_ERRORS}"

# ── 阶段2: 自愈循环 ──
ROUND=0
while [ $ROUND -lt $MAX_HEAL_ROUNDS ]; do
  ROUND=$((ROUND + 1))
  echo "🔧 阶段2.${ROUND}: 自愈修复(第${ROUND}轮)..."

  HEAL_RESULT=$(claude -p "根据之前的检测结果,修复所有可自动修复的问题。
规则:
- 每修复一类问题后立即运行对应验证命令
- 如果修复引入新问题,立即回滚
- 记录每个修复的详细说明
- 输出JSON:{ fixed: string[], remaining: string[], rolled_back: string[] }" \
    --continue \
    --max-turns 10 \
    --allowedTools "Read,Write,Bash,Grep,Glob" \
    --output-format json)

  echo "$HEAL_RESULT" | jq '.' > "$LOG_DIR/heal_round_${ROUND}.json"

  FIXED=$(echo "$HEAL_RESULT" | jq '.result.fixed // [] | length')
  REMAINING=$(echo "$HEAL_RESULT" | jq '.result.remaining // [] | length')

  echo "  本轮修复: ${FIXED}个, 剩余: ${REMAINING}个"

  if [ "$REMAINING" -eq 0 ]; then
    echo "✅ 所有问题已修复!"
    break
  fi
done

# ── 阶段3: 最终验证 ──
echo "✅ 阶段3: 最终验证..."
VERIFY=$(claude -p "运行完整验证:eslint、tsc、全部测试。
输出JSON:{ passed: boolean, details: string }" \
  --continue \
  --max-turns 3 \
  --allowedTools "Read,Bash,Grep,Glob" \
  --output-format json)

PASSED=$(echo "$VERIFY" | jq -r '.result.passed // false')

echo "$VERIFY" | jq '.' > "$LOG_DIR/final_verify.json"

# ── 阶段4: 报告 ──
echo "📊 阶段4: 生成报告..."
cat <<EOF > "$LOG_DIR/report.md"
# 自愈流水线报告

**项目**: $(basename "$PROJECT_DIR")
**时间**: $(date '+%Y-%m-%d %H:%M:%S')
**修复轮次**: ${ROUND}

## 检测结果
- Lint错误: ${LINT_ERRORS}
- 类型错误: ${TYPE_ERRORS}

## 修复结果
$(cat "$LOG_DIR"/heal_round_*.json 2>/dev/null | jq -r '.result.fixed[]? // empty' | sed 's/^/- /')

## 最终状态
$( [ "$PASSED" = "true" ] && echo "✅ 全部通过" || echo "⚠️ 仍有未解决问题" )

## 详细日志
- 检测: $LOG_DIR/detection.json
$(for i in $(seq 1 $ROUND); do echo "- 第${i}轮修复: $LOG_DIR/heal_round_${i}.json"; done)
- 最终验证: $LOG_DIR/final_verify.json
EOF

echo "📄 报告已生成: $LOG_DIR/report.md"
echo "$LOG_DIR/report.md"

5.4 完整工作流程图

flowchart TB
    Start([流水线启动]) --> Detect[阶段1: 全面检测]

    Detect --> |claude -p --allowedTools Read,Bash| Analyze[ESLint + TSC + Tests]
    Analyze --> ParseResult[解析检测结果JSON]
    ParseResult --> CheckProblems{发现问题?}

    CheckProblems --> |无问题| FinalVerify[阶段3: 最终验证]
    CheckProblems --> |有问题| HealRound[阶段2: 自愈循环]

    HealRound --> |claude -p --continue| Fix[修复 + 逐项验证]
    Fix --> PostHook[PostToolUse Hook: 自动格式化]
    PostHook --> CheckRound{达到最大轮次?}

    CheckRound --> |否| HealRound
    CheckRound --> |是| FinalVerify

    FinalVerify --> |claude -p --continue| VerifyAll[运行全套检查]
    VerifyAll --> StopHook[Stop Hook: 生成报告]
    StopHook --> Report[输出汇总报告]

    Report --> Decision{全部通过?}
    Decision --> |是| Success([✅ 流水线成功])
    Decision --> |否| ManualReview([⚠️ 需人工审查])

    PreHook[PreToolUse Hook: 安全拦截] -.-> |阻止危险操作| Fix
    PreWrite[PreToolUse Hook: 文件保护] -.-> |保护敏感文件| Fix

    style Start fill:#4caf50,color:#fff
    style Success fill:#4caf50,color:#fff
    style ManualReview fill:#ff9800,color:#fff
    style PreHook fill:#f44336,color:#fff
    style PreWrite fill:#f44336,color:#fff
    style PostHook fill:#2196f3,color:#fff
    style StopHook fill:#9c27b0,color:#fff

六、高级模式:Hooks与-p的递归联动

6.1 事件级联模式

最强大的自动化模式是Hooks触发-p命令,而-p执行中又触发新的Hooks——形成事件级联:

graph LR
    A[Stop事件] -->|Hook脚本| B[触发 claude -p 验证]
    B -->|PostToolUse| C[自动格式化]
    C -->|发现新问题| D[触发 claude -p 修复]
    D -->|Stop事件| E[生成报告]
    E -->|发送通知| F[Slack/邮件]

实现要点:

// on-stop-cascade.js — Stop事件触发级联
const { exec } = require('child_process');

let input = '';
process.stdin.on('data', (chunk) => { input += chunk; });
process.stdin.on('end', () => {
  const data = JSON.parse(input);

  // 防止无限递归:检查环境变量标记
  if (process.env.CLAUDE_CASCADE_DEPTH > 2) {
    process.exit(0);
  }

  // 在后台启动验证Agent
  const env = { 
    ...process.env, 
    CLAUDE_CASCADE_DEPTH: String((parseInt(process.env.CLAUDE_CASCADE_DEPTH || '0') + 1))
  };

  exec(
    'claude -p "验证上一次修改的正确性" --max-turns 3 --output-format json',
    { env, timeout: 120000 },
    (err, stdout) => {
      if (!err && stdout) {
        // 可以继续触发通知等后续操作
        const result = JSON.parse(stdout);
        // 发送到外部系统...
      }
    }
  );

  process.exit(0);
});

6.2 条件路由模式

根据Agent输出结果自动决定下一步操作:

#!/bin/bash
# smart-router.sh — 智能路由脚本

# 第一步:分类
CLASSIFY=$(claude -p "分析当前Git仓库的变更,将它们分为三类:
- REFACTOR: 代码重构(需运行全量测试)
- STYLE: 样式/格式修改(只需lint)
- DOCS: 文档变更(无需测试)
输出JSON:{ category: string, confidence: number }" \
  --allowedTools "Read,Bash,Grep" \
  --max-turns 3 \
  --output-format json)

CATEGORY=$(echo "$CLASSIFY" | jq -r '.result.category // "unknown"')

echo "路由决策: $CATEGORY"

case "$CATEGORY" in
  "REFACTOR")
    echo "执行完整验证流水线..."
    claude -p "运行完整测试套件,包括单元测试、集成测试和E2E测试" \
      --continue --max-turns 10 --allowedTools "Read,Bash"
    ;;
  "STYLE")
    echo "执行轻量验证..."
    claude -p "运行ESLint和Prettier检查" \
      --continue --max-turns 3 --allowedTools "Read,Bash"
    ;;
  "DOCS")
    echo "跳过测试,仅检查链接..."
    claude -p "检查文档中的死链接" \
      --continue --max-turns 3 --allowedTools "Read,Bash,Grep"
    ;;
  *)
    echo "无法分类,执行默认验证..."
    claude -p "运行基本lint和类型检查" \
      --continue --max-turns 5 --allowedTools "Read,Bash"
    ;;
esac

6.3 定时巡检模式

结合cron实现定时自动化巡检:

#!/bin/bash
# nightly-patrol.sh — 每夜巡检脚本
# crontab: 0 2 * * * /path/to/nightly-patrol.sh /path/to/project

PROJECT="$1"
DATE=$(date +%Y%m%d)
LOG="/tmp/nightly-patrol-${DATE}.log"

cd "$PROJECT" || exit 1
git pull origin main 2>/dev/null

# 巡检任务列表
claude -p "执行每日代码健康巡检:

1. 检查依赖安全性: npm audit (只报告critical和high)
2. 检查过期依赖: npx npm-check-updates
3. 检查代码复杂度: 找到圈复杂度超过15的函数
4. 检查测试覆盖率: 运行覆盖率报告,标记低于80%的模块
5. 检查TODO/FIXME数量变化: 与上周对比

输出结构化JSON报告。" \
  --allowedTools "Read,Bash,Grep,Glob" \
  --max-turns 8 \
  --output-format json > "$LOG" 2>&1

# 如果有Critical安全问题,发送告警
CRITICAL=$(jq -r '.result.critical_vulnerabilities // 0' "$LOG")
if [ "$CRITICAL" -gt 0 ]; then
  # 发送Slack通知(使用webhook)
  curl -s -X POST "$SLACK_WEBHOOK" \
    -H 'Content-type: application/json' \
    --data "{\"text\":\"🚨 巡检告警: ${CRITICAL}个Critical安全漏洞 - ${PROJECT}\"}" \
    > /dev/null
fi

七、安全与最佳实践

7.1 自动化安全清单

graph TD
    A[自动化安全] --> B[权限最小化]
    A --> C[递归防护]
    A --> D[输出验证]
    A --> E[审计追踪]

    B --> B1["--allowedTools 限定必需工具"]
    B --> B2["--max-turns 限制Agent轮次"]
    B --> B3["--system-prompt 约束行为边界"]

    C --> C1["环境变量标记递归深度"]
    C --> C2["全局超时机制"]
    C --> C3["退出码检测死循环"]

    D --> D1["jq校验JSON输出结构"]
    D --> D2["敏感信息脱敏"]
    D --> D3["错误边界处理"]

    E --> E1["记录所有-p调用日志"]
    E --> E2["Hook执行日志持久化"]
    E --> E3["Git diff审计每次修改"]

7.2 关键安全原则

1. 最小权限原则

# 错误:给予所有权限
claude -p "修复bug" --dangerously-skip-permissions

# 正确:精确指定所需工具
claude -p "修复bug" \
  --allowedTools "Read,Write,Grep,Bash" \
  --disallowedTools "NotebookEdit" \
  --max-turns 5

2. 防止无限循环

# 在Hook脚本中设置深度限制
MAX_DEPTH=${CLAUDE_CASCADE_DEPTH:-0}
if [ "$MAX_DEPTH" -ge 3 ]; then
  echo "级联深度超限,终止"
  exit 0
fi
export CLAUDE_CASCADE_DEPTH=$((MAX_DEPTH + 1))

3. 沙箱执行

# 使用Docker容器隔离自动化执行
docker run --rm \
  -v "$(pwd):/workspace" \
  -e ANTHROPIC_API_KEY="$ANTHROPIC_API_KEY" \
  claude-code-auto \
  claude -p "修复所有lint错误" \
    --max-turns 10 \
    --allowedTools "Read,Write,Bash,Grep"

7.3 调试技巧

# 开启verbose输出查看完整决策过程
claude -p "分析代码" --verbose --output-format stream-json

# 使用--verbose配合stream-json实时观察Agent思考过程
claude -p "重构模块" --verbose --output-format stream-json 2>&1 | \
  jq -c 'select(.type == "assistant") | .message.content'

# 查看会话历史
claude sessions list

# 查看特定会话的详细日志
claude sessions show <session-id>

八、训练营适用性评估

维度 评估
适合训练营类型 DevOps自动化训练营、AI辅助开发进阶营、生产级AI Agent构建营
前置知识要求 Claude Code基础操作、Shell脚本、Git工作流、Node.js基础
预计教学时长 4-6小时(含实操)
实操占比 70%实操 + 30%理论
分组建议 2-3人一组,每组一个真实项目
考核方式 完成一个可运行的自愈流水线,包含检测→修复→验证→报告四个阶段
常见卡点 Hooks JSON输入格式解析、递归防护、会话ID传递
延伸方向 GitHub Actions集成、Slack/钉钉通知、监控面板

参考来源

  1. Run Claude Code programmatically - Claude Code Docs — 官方Headless模式文档,-p标志与输出格式完整参考
  2. Hooks reference - Claude Code Docs — 官方Hooks事件参考,含JSON输入输出Schema和退出码语义
  3. Manage sessions - Claude Code Docs — 官方会话管理文档,--continue与--resume用法
  4. Using Claude Code Programmatically - GitHub Gist — 社区整理的-p模式完整编程指南
  5. Run parallel sessions with worktrees - Claude Code Docs — 官方Worktree并行会话文档

[!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学通信知识星球海报-扫码加入