首页 › tutorials › Claude Code自动化:从-p模式到Agent调度

概述

本教程面向已熟悉 Claude Code 基础交互、希望将其集成到自动化流水线中的开发者。你将掌握三种核心自动化机制:--print / -p 非交互模式、Hooks 生命周期钩子、以及基于 Task 工具的子 Agent 并行调度。学完即可将 Claude Code 嵌入 CI/CD、定时任务、批量脚本,构建"AI 即基础设施"的开发工作流。

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

前置条件: - Claude Code CLI 已安装并完成 API Key 配置 - 熟悉 Bash 脚本与 JSON 处理(jq) - 了解 Git hooks 概念 - 一个可运行的代码仓库用于练习


第一章:非交互模式——让 Claude Code 成为命令行工具

1.1 --print 模式基础

交互模式下,Claude Code 是对话式的。但自动化场景需要"输入→执行→输出→退出"的单次运行模式。--print(缩写 -p)就是为此而生。

# 最简单的非交互调用
claude -p "解释 src/index.ts 的入口函数"

# 等价写法
claude --print "解释 src/index.ts 的入口函数"

预期结果:Claude Code 读取文件、分析代码、输出解释文本,然后退出。不会进入交互循环。

1.2 管道输入:Unix 哲学的威力

--print 模式天然支持 Unix 管道,这是构建自动化链的基础:

# 将 git diff 管道给 Claude Code 做 code review
git diff HEAD~3..HEAD | claude -p "审查这些变更,列出潜在问题"

# 将错误日志管道给 Claude Code 分析根因
npm test 2>&1 | claude -p "分析测试失败原因并给出修复建议"

# 将 API 响应管道给 Claude Code 生成类型定义
curl -s https://api.example.com/openapi.json | \
  claude -p "根据这个 OpenAPI 规范生成 TypeScript 类型定义"

1.3 结构化输出:从文本到可解析数据

自动化流水线需要机器可读的输出,而非人类可读的散文。--output-format 和 --json-schema 两个 flag 组合使用,可以将 Claude Code 变成一个结构化数据生成器:

# JSON 格式输出
claude -p --output-format json \
  "列出 src/ 目录下所有 API 端点,包含路径、方法、描述"

# 流式 JSON——适合长时间任务
claude -p --output-format stream-json \
  "重构 src/auth.ts 模块"

# 强制 JSON Schema 校验——这是自动化的关键
claude -p \
  --output-format json \
  --json-schema '{
    "type": "object",
    "properties": {
      "title": {"type": "string"},
      "risk": {"type": "string", "enum": ["low", "medium", "high"]},
      "summary": {"type": "string"}
    },
    "required": ["title", "risk", "summary"]
  }' \
  "审查当前 git diff,返回标题、风险等级和摘要"

预期输出:

{
  "title": "Auth middleware bypass vulnerability",
  "risk": "high",
  "summary": "jwt.verify 缺少算法白名单限制,攻击者可通过 alg:none 绕过认证"
}

1.4 工具边界控制:安全自动化的基石

在自动化场景中,Claude Code 的行为必须可预测。--allowedTools 和 --disallowedTools 提供了精确的工具级控制:

# 只允许读取,禁止写入——适合 code review 场景
claude -p \
  --allowedTools "Read,Glob,Grep" \
  "审计 src/ 目录的安全问题"

# 允许编辑和 git 操作,禁止网络请求
claude -p \
  --allowedTools "Read,Edit,Bash(git:*)" \
  --disallowedTools "Bash(curl:*)" \
  "修复所有 TypeScript 编译错误并提交"

# 精确控制 Bash 子命令
claude -p \
  --allowedTools "Read,Edit,Bash(npm test:*),Bash(npm run lint:*)" \
  "运行测试并修复所有失败的用例"

1.5 权限模式:自动化场景的最佳选择

--permission-mode 决定了 Claude Code 在遇到需要确认的操作时的行为:

# plan 模式:只规划不执行,适合架构评审
claude -p --permission-mode plan "分析这个微服务架构的瓶颈"

# auto 模式:自动处理大部分权限请求,适合受信任的脚本
claude -p --permission-mode auto "清理所有未使用的 import"

# dontAsk 模式:不询问直接执行,仅在沙箱环境中使用
claude -p --permission-mode dontAsk "重构 src/utils/ 目录"

1.6 会话管理:恢复与分支

# 恢复最近的会话
claude --continue

# 恢复指定 ID 的会话
claude --resume abc12345-6789-def0-1234-567890abcdef

# 从已有会话分支出新会话——类似 git branch
claude --continue --fork-session

--fork-session 特别有用:你在探索一个方案时发现需要走另一条路,可以分叉出新的会话,保留原始上下文但不污染原会话历史。


第二章:Hooks——Claude Code 的生命周期钩子系统

2.1 Hooks 是什么

Hooks 是在 Claude Code 生命周期的特定时刻自动执行的 shell 命令、HTTP 请求或 LLM 提示。它们是确定性的——不像 CLAUDE.md 中的指令那样"可能被遵守",而是必定执行。

图表1

图表 1

核心价值对比:

机制 执行保证 适用场景
CLAUDE.md 指令 不保证(AI 可能忽略) 编码风格偏好、项目约定
Hooks 100% 保证 安全策略、代码格式化、审计日志
MCP 服务器 按需调用 外部工具集成

2.2 Hook 配置位置

# 项目级(推荐,随代码仓库共享)
.claude/settings.json

# 用户级(对所有项目生效)
~/.claude/settings.json

2.3 Hook 类型与事件

Claude Code 提供了三种 Hook 类型和超过 20 个生命周期事件:

三种 Hook 类型:

类型 机制 适用场景
command 执行 shell 命令 格式化、lint、安全检查
http 发送 HTTP 请求 外部系统集成、通知
prompt 调用 LLM 做决策 复杂判断(shell 无法处理的)

核心事件时间线:

事件 触发时机 能否阻止操作
SessionStart 会话启动/恢复 否
UserPromptSubmit 用户提交提示后 是
PreToolUse 工具执行前 是
PostToolUse 工具执行后 否(已执行)
SubagentStart 子 Agent 启动时 否
SubagentStop 子 Agent 完成时 是
Stop Agent 完成响应时 是
Notification 发送通知时 否
FileChanged 磁盘文件变更时 否

2.4 实战:第一个 Hook——自动格式化

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          {
            "type": "command",
            "command": "jq -r '.tool_input.file_path' | xargs npx prettier --write 2>/dev/null; exit 0"
          }
        ]
      }
    ]
  }
}

工作原理: 1. Claude Code 写入或编辑文件(触发 PostToolUse,匹配 Write 或 Edit) 2. Hook 通过 stdin 接收 JSON,包含文件路径 3. jq 提取路径,Prettier 格式化该文件 4. exit 0 确保即使 Prettier 失败也不阻塞 Claude Code

2.5 实战:安全防护 Hook

阻止危险命令执行,这是生产环境必备:

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "bash -c 'CMD=$(jq -r \".tool_input.command\" <<< \"$(cat)\"); for p in \"rm -rf /\" \"rm -rf ~\" \"drop table\" \"--force\" \"push.*--force\"; do if echo \"$CMD\" | grep -qiE \"$p\"; then echo \"Blocked: $p\" >&2; exit 2; fi; done; exit 0'"
          }
        ]
      }
    ]
  }
}

关键机制:exit 2 表示"阻止操作"。Claude Code 会看到 stderr 中的阻止原因,并调整后续行为。

保护敏感文件不被写入:

#!/bin/bash
# .claude/hooks/protect-files.sh
INPUT=$(cat)
FILE=$(echo "$INPUT" | jq -r '.tool_input.file_path // empty')

PROTECTED=(".env" ".env.local" "secrets/" ".git/" "package-lock.json")

for pattern in "${PROTECTED[@]}"; do
  if [[ "$FILE" == *"$pattern"* ]]; then
    jq -n --arg f "$FILE" --arg p "$pattern" '{
      hookSpecificOutput: {
        hookEventName: "PreToolUse",
        permissionDecision: "deny",
        permissionDecisionReason: "受保护文件被拦截: \($p)"
      }
    }'
    exit 0
  fi
done
exit 0

对应配置:

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          {
            "type": "command",
            "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/protect-files.sh"
          }
        ]
      }
    ]
  }
}

2.6 实战:审计日志 Hook

记录 Claude Code 执行的所有 Bash 命令:

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "bash -c 'jq -r \".tool_input.command\" <<< \"$(cat)\" | while read cmd; do echo \"$(date +%Y-%m-%dT%H:%M:%S) $cmd\" >> \"$CLAUDE_PROJECT_DIR/.claude/command-audit.log\"; done; exit 0'"
          }
        ]
      }
    ]
  }
}

2.7 实战:Stop Hook——响应完成前的质量门禁

Stop 事件在 Claude Code 完成响应时触发。你可以在此时运行验证:

#!/bin/bash
# .claude/hooks/verify-tests.sh
INPUT=$(cat)

# 防止无限循环:如果 hook 已经激活过,直接退出
if [ "$(echo "$INPUT" | jq -r '.stop_hook_active')" = "true" ]; then
  exit 0
fi

# 检查是否有 TypeScript 文件被修改
CHANGED=$(git diff --name-only | grep -c '\.tsx\?$' || true)

if [ "$CHANGED" -gt 0 ]; then
  # 运行类型检查
  if ! npx tsc --noEmit 2>/dev/null; then
    echo "TypeScript 类型检查失败,请修复后再完成"
    exit 2
  fi
fi
exit 0

防循环机制至关重要:Stop Hook 触发后 Claude Code 可能再次响应,再次触发 Stop。stop_hook_active 字段用于检测这种循环。

2.8 Hook 的高级用法:MCP 工具匹配

Hook 的 matcher 字段支持匹配 MCP 工具调用:

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "mcp__github__*",
        "hooks": [
          {
            "type": "command",
            "command": "echo 'MCP GitHub tool called' >> /tmp/mcp-audit.log"
          }
        ]
      }
    ]
  }
}

2.9 HTTP Hook:集成外部系统

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          {
            "type": "http",
            "url": "https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK",
            "method": "POST",
            "headers": {
              "Content-Type": "application/json"
            }
            }
          }
        ]
      }
    ]
  }
}

第三章:子 Agent 与并行调度

3.1 子 Agent 的本质

子 Agent(Subagent)是 Claude Code 通过 Task 工具创建的独立 AI 会话。每个子 Agent 拥有自己的上下文窗口、系统提示和工具权限。关键特性:

  1. 上下文隔离:子 Agent 的探索不会污染父 Agent 的上下文
  2. 并行执行:多个子 Agent 可以同时运行
  3. 单一返回值:父 Agent 只看到子 Agent 的最终摘要,而非中间过程

图表2

图表 2

3.2 内置子 Agent

Claude Code 自带几个预定义的子 Agent:

子 Agent 模型 工具权限 用途
Explore Haiku(快速低成本) 只读 代码搜索、文件发现
Plan 继承父会话 只读 架构研究、方案设计
General-purpose 继承父会话 全部工具 复杂多步骤任务
statusline-setup Sonnet 有限 状态栏配置
claude-code-guide Haiku 只读 Claude Code 使用帮助

Explore 的深度级别: - quick:快速搜索,适合精确查找 - medium:平衡搜索,适合一般探索 - very thorough:全面搜索,适合深度分析

3.3 自定义子 Agent

子 Agent 用 Markdown + YAML frontmatter 定义:

---
name: security-auditor
description: 安全审计专家,扫描代码中的 OWASP Top 10 漏洞
model: claude-haiku-4-5
tools:
  - Read
  - Glob
  - Grep
---

你是一位专业的安全审计员。你的任务是:

1. 扫描指定文件或目录中的安全漏洞
2. 按 OWASP Top 10 分类标记问题
3. 给出每个问题的严重等级(Critical/High/Medium/Low)
4. 提供具体的修复建议和代码示例

输出格式:
- 每个问题包含:文件路径、行号、漏洞类型、严重等级、修复建议
- 最后给出整体安全评分(A-F)

保存位置:

# 项目级
.claude/agents/security-auditor.md

# 用户级(所有项目可用)
~/.claude/agents/security-auditor.md

3.4 子 Agent 的工具限制

精确控制子 Agent 能做什么,是实现安全自动化的关键:

---
name: test-writer
description: 自动编写单元测试
model: claude-sonnet-4-6
allowed-tools:
  - Read
  - Write
  - Glob
  - Grep
  - Bash(npm test:*)
disallowed-tools:
  - Edit
---

3.5 Worktree 隔离:并行修改不冲突

当多个子 Agent 需要修改代码时,使用 Git Worktree 提供文件系统级隔离:

# 在 worktree 中运行子 Agent
claude --worktree

# 或在配置中指定

图表3

图表 3

3.6 并行模式的三种范式

范式 1:并行探索(Parallel Exploration)

适合开始新功能前快速了解代码库:

请用 Task 工具并行启动 4 个子 Agent:
1. 读取 auth/ 目录,总结认证模式
2. 读取 api/ 目录,总结路由模式
3. 读取 db/ 目录,总结数据层模式
4. 读取 tests/ 目录,总结测试模式

每个返回 200 字摘要。

范式 2:并行应用(Parallel Application)

同一模板应用到多个目标:

为以下 6 个模块各启动一个子 Agent 编写单元测试:
- src/auth/
- src/api/
- src/db/
- src/utils/
- src/middleware/
- src/services/

每个子 Agent 读取对应模块和现有测试模式,然后编写测试文件。

范式 3:专业角色(Specialized Personas)

启动 3 个子 Agent 审查这段代码:
1. 安全审计员:检查注入、XSS、CSRF 等安全漏洞
2. 性能分析师:检查 N+1 查询、内存泄漏、不必要的重渲染
3. 可维护性评审:检查命名、复杂度、测试覆盖

每个返回独立评审报告。

3.7 成本控制策略

子 Agent 会增加 token 消耗,需要合理控制:

策略 做法 效果
模型路由 探索类任务用 Haiku,复杂任务用 Sonnet 成本降低 60-80%
限制工具 只读子 Agent 禁止 Write/Edit 避免意外修改
控制并发 API Tier 1 最多 5 个并发 避免排队浪费
精简提示 子 Agent 提示控制在 100-300 字 减少 input token
汇总而非堆叠 父 Agent 综合子 Agent 结果,而非直接拼接 控制上下文大小

第四章:自动化实战案例

4.1 CI/CD 集成:自动代码审查

# .github/workflows/ai-review.yml
name: AI Code Review
on:
  pull_request:
    types: [opened, synchronize]

jobs:
  ai-review:
    runs-on: ubuntu-latest
    permissions:
      pull-requests: write
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

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

      - name: AI Code Review
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
        run: |
          # 获取 PR 变更范围
          DIFF=$(git diff origin/main...HEAD)

          # 结构化审查
          claude -p \
            --output-format json \
            --json-schema '{
              "type": "object",
              "properties": {
                "issues": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "file": {"type": "string"},
                      "line": {"type": "number"},
                      "severity": {"type": "string"},
                      "message": {"type": "string"}
                    }
                  }
                },
                "summary": {"type": "string"},
                "approved": {"type": "boolean"}
              }
            }' \
            --allowedTools "Read,Glob,Grep" \
            "审查以下变更。以下是 git diff 输出:
            $DIFF

            检查安全漏洞、性能问题、代码风格。
            如果没有严重问题,设置 approved 为 true。" \
            > review_result.json

          # 发布审查结果到 PR
          SUMMARY=$(jq -r '.summary' review_result.json)
          APPROVED=$(jq -r '.approved' review_result.json)

          gh pr comment ${{ github.event.pull_request.number }} \
            --body "## AI Code Review
            $SUMMARY
            **状态**: $([ "$APPROVED" = "true" ] && echo '✅ 通过' || echo '⚠️ 需要关注')"

4.2 定时任务:夜间代码清理

#!/bin/bash
# scripts/nightly-cleanup.sh

set -euo pipefail

LOG_FILE=".claude/logs/cleanup-$(date +%Y%m%d).log"

claude -p \
  --permission-mode auto \
  --allowedTools "Read,Edit,Bash(npm run lint:*),Bash(git:*)" \
  "执行以下任务:
1. 扫描 src/ 目录中所有未使用的 import 并移除
2. 运行 ESLint --fix 修复所有可自动修复的问题
3. 更新 TypeScript 类型定义中的过期引用
4. 如果有修改,用 'chore: nightly cleanup [skip ci]' 提交
5. 列出所有修改过的文件" \
  2>&1 | tee "$LOG_FILE"

echo "清理完成于 $(date)" >> "$LOG_FILE"

配合 crontab 定时执行:

# 每天凌晨 2 点执行
0 2 * * * /path/to/project/scripts/nightly-cleanup.sh

4.3 批量处理:多文件文档生成

#!/bin/bash
# scripts/generate-docs.sh

# 为每个组件生成 JSDoc 文档
for file in src/components/*.tsx; do
  component_name=$(basename "$file" .tsx)

  echo "处理组件: $component_name"

  claude -p \
    --output-format json \
    --allowedTools "Read,Edit" \
    "为 $file 中的所有导出函数和组件添加 JSDoc 注释。
    遵循以下规则:
    - 每个导出函数必须有 @param、@returns、@example
    - React 组件必须有 Props 类型说明
    - 使用中文注释
    不要修改函数逻辑,只添加注释。" \
    > "docs/component-${component_name}.json"
done

echo "所有组件文档生成完成"

4.4 测试失败自动修复

#!/bin/bash
# scripts/auto-fix-tests.sh

# 运行测试
npm test 2>&1 | tee /tmp/test-output.txt
EXIT_CODE=$?

if [ $EXIT_CODE -ne 0 ]; then
  echo "测试失败,启动自动修复..."

  claude -p \
    --permission-mode auto \
    --allowedTools "Read,Edit,Write,Bash(npm test:*)" \
    "以下是测试失败的输出:

$(cat /tmp/test-output.txt)

请:
1. 分析每个失败测试的原因
2. 修复源代码中的 bug(不是修改测试来适应 bug)
3. 重新运行测试验证修复
4. 报告修复了哪些文件以及每个问题的根因"
else
  echo "所有测试通过"
fi

4.5 完整的 Agent 调度流水线

以下是一个综合案例,展示如何组合 -p 模式、Hooks 和子 Agent 来处理 Bug 修复流程:

#!/bin/bash
# scripts/triage-bugs.sh
# 自动拉取高优先级 bug,分析并批量修复

set -euo pipefail

# 步骤 1:拉取 bug 列表
ISSUES=$(claude -p \
  --output-format json \
  --allowedTools "Bash(gh:*)" \
  "使用 gh CLI 列出所有 open 的、标记为 bug 和 high-priority 的 issue。
   返回 JSON 数组,每个元素包含:number, title, labels, body 前 200 字符")

echo "发现 $(echo "$ISSUES" | jq 'length') 个高优先级 bug"

# 步骤 2:对每个 bug 启动独立的 worktree 修复
for i in $(seq 0 $(($(echo "$ISSUES" | jq 'length') - 1))); do
  NUMBER=$(echo "$ISSUES" | jq -r ".[$i].number")
  TITLE=$(echo "$ISSUES" | jq -r ".[$i].title")
  BODY=$(echo "$ISSUES" | jq -r ".[$i].body")

  echo "=== 处理 Bug #$NUMBER: $TITLE ==="

  # 在独立 worktree 中修复
  claude -p \
    --permission-mode auto \
    --worktree \
    --allowedTools "Read,Edit,Write,Bash(npm test:*),Bash(git:*)" \
    "你正在修复 GitHub Issue #$NUMBER。

标题:$TITLE
描述:$BODY

步骤:
1. 阅读相关代码,理解 bug 根因
2. 实现修复
3. 运行测试验证
4. 提交到新分支 fix/issue-$NUMBER
5. 返回修复摘要"
done

echo "所有 bug 处理完成"

第五章:高级技巧与最佳实践

5.1 --append-system-prompt:轻量级行为注入

不需要修改 CLAUDE.md,就能为特定任务添加规则:

claude -p \
  --append-system-prompt "在修改生产代码前,必须先编写回归测试" \
  "修复 src/api/auth.ts 中的 JWT 验证 bug"

5.2 MCP 配置隔离

使用 --mcp-config 和 --strict-mcp-config 确保自动化环境的可复现性:

# 只使用指定的 MCP 服务器,忽略全局配置
claude -p \
  --mcp-config ./mcp.review.json \
  --strict-mcp-config \
  "使用 GitHub MCP 工具审查最近的 PR"

5.3 多目录访问

# 同时访问主仓库和共享库
claude -p \
  --add-dir ../shared-lib \
  --add-dir ../design-system \
  "检查主仓库中是否有可以直接使用 shared-lib 中已有实现的重复代码"

5.4 调试自动化问题

# 将调试日志写入文件
claude -p \
  --debug-file ./claude-debug.log \
  "这个自动化任务出了问题"

# 会话结束后检查日志
cat ./claude-debug.log | grep -i error

5.5 错误处理与重试

#!/bin/bash
MAX_RETRIES=3
RETRY=0

while [ $RETRY -lt $MAX_RETRIES ]; do
  if claude -p \
    --permission-mode auto \
    "完成指定任务"; then
    echo "任务成功完成"
    exit 0
  fi

  RETRY=$((RETRY + 1))
  echo "第 $RETRY 次尝试失败,重试中..."
  sleep 10
done

echo "任务在 $MAX_RETRIES 次尝试后仍然失败"
exit 1

5.6 Hooks + -p 模式的协同

在 .claude/settings.json 中配置的 Hooks 对 -p 模式同样生效。这意味着你的安全策略和代码质量控制在自动化场景下依然有效:

图表4

图表 4


第六章:架构全景图

图表5

图表 5


延伸阅读


训练营适用性评估

维度 评估
适合训练营类型 进阶训练营(学员需有 Claude Code 基础使用经验)、DevOps 自动化训练营、团队效能提升工作坊
前置知识要求 Bash 脚本、JSON/jq、Git 基础、CI/CD 概念、Claude Code 基础操作
预计教学时长 4-6 小时(含动手实验)
实验环境要求 每人一个代码仓库、Anthropic API Key、GitHub 仓库
推荐教学顺序 第 1 章(30分钟)→ 第 2 章(60分钟)→ 第 3 章(45分钟)→ 第 4 章实战(90分钟)→ 第 5 章讨论(30分钟)
课后作业建议 为自己的项目配置完整的 Hook 体系 + 一个 CI/CD 自动审查 Pipeline

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