claude --worktree <bug-id> 一键派生独立工作树 + 让 Codex 当 fixer / Claude Code 当 reviewer(两者 headless 互调),通过一个 bash 编排脚本控制 fix→review→fix 最多 3 轮的循环,是当前 2026 年中最稳、可直接落地的方案;批量场景再叠一层 xargs -P / GNU parallel 控制并发度即可。--worktree(由 Anthropic Claude Code 产品负责人 Boris Cherny 在 2026 年 2 月 20 日发布的 v2.1.50 公开宣布,前一天 v2.1.49 先加入了 subagent 级隔离;v2.1.50 是正式带 CLI flag 的版本) + WorktreeCreate/Remove hooks;Codex CLI codex exec / codex exec review --uncommitted --json --output-schema;Codex ~/.codex/agents/*.toml 子代理;Claude Code .claude/agents/、.claude/commands/、settings.json hooks。不要 把项目放在 /mnt/c/ —— vxlabs 实测 WSL2 跨边界访问 NTFS 大约比 WSL1 慢 5 倍(“WSL 2 accessing host (NTFS) files is about 5 times slower than WSL 1 accessing those same files”), 而 WSL2 自身的 ext4 “very close to native Linux performance”, 所以实际 ext4 vs 跨界 NTFS 的差距比 5× 更大。scripts/dispatch-bug.sh(单缺陷端到端)、scripts/batch-bugs.sh(批量并发)、.claude/agents/code-reviewer.md、.claude/settings.json(hooks + permissions)、~/.codex/agents/bug-fixer.toml。再加一份 CLAUDE.md + AGENTS.md 的约定模板。--worktree/-w flag —— 由 Anthropic Claude Code 产品负责人 Boris Cherny 在 X 上宣布,该公告被引超过一百万次。 claude -w <name> 自动在 .claude/worktrees/<name>/ 创建分支 worktree-<name>, 结束时还有保留/删除询问; 并提供 WorktreeCreate / WorktreeRemove 两个 hook 用于自定义路径与拷贝 .env。 Anthropic 官方 Common workflows 文档把”用 worktree 跑并行会话”列为推荐模式。codex exec 是稳定的 headless 入口(Rust 实现,输出 stderr 进度 + stdout 最终消息;--json 是 newline-delimited JSONL 事件流;可叠 --output-schema 强制结构化输出; 可叠 --cd/-C 指定工作目录、--skip-git-repo-check 跳过 git 检查); GA 之后的 Codex Subagents(~/.codex/agents/*.toml)默认 max_threads=6、max_depth=1,** 只有显式指令才会被生成** —— 这意味着批量并行最好在 worktree + 进程级并行(多个 codex exec)做,而不是依赖 Codex 内部的 subagent。codex exec review:必须传 --uncommitted / --base <branch> / --commit <sha> 三选一; 输出按 [P0]/[P1]/[P2]/[P3] 四级( 注意是 P0–P3 不是 P1–P4,源自 codex-rs/core/review_prompt.md,并在 JSON 中带 priority 字段 0–3); 最后给出 overall correctness 裁决。 但 --json 默认是 JSONL 事件流,需配合 --output-schema 才得到结构化 findings;已知 issue #15451 提示在启用 MCP 时这个组合可能被静默忽略。codex-plugin-cc 插件(github.com/openai/codex-plugin-cc,2026-03-30 发布,Apache-2.0;unite.ai 原话:“OpenAI published a Codex plugin on March 30 that installs directly inside Anthropic’s Claude Code, letting developers run code reviews and delegate tasks to Codex without leaving their existing workflow”), 在 Claude Code 里直接暴露 6 个 命令:/codex:review、/codex:adversarial-review、/codex:rescue、/codex:status、/codex:result、/codex:cancel。 安装:/plugin marketplace add openai/codex-plugin-cc → /plugin install codex@openai-codex → /codex:setup。 它复用本机的 codex 二进制 + ~/.codex/config.toml, 并提供 Review Gate(基于 Stop hook 的循环评审),但官方 README 自己警告:“review gate can create a long-running Claude/Codex loop and may drain usage limits quickly” —— 因此用于关键评审推荐保留,但批量自动循环要自己控上限。PreToolUse / PostToolUse / Stop / SubagentStop / SessionStart / WorktreeCreate / WorktreeRemove 等。Stop hook 配合 stop_hook_active 字段可以实现”评审不过就阻塞退出、让 Claude 继续修”,但 必须 在 hook 里检查该字段避免死循环。--print/-p、--output-format json|stream-json|text、--max-turns、--allowed-tools、--permission-mode {default|acceptEdits|plan|dontAsk|bypassPermissions}、 --dangerously-skip-permissions、--bare(推荐用于 CI/脚本,跳过 ~/.claude 自动加载)、 --resume <session-id>。--output-format json 返回的关键字段是 result、session_id、total_cost_usd、num_turns、is_error、duration_ms、usage、modelUsage(** 不是** cost_usd,后者只出现在 stream-json 单条事件里)。CLAUDE.md(给 Claude)和 AGENTS.md(给 Codex), 再用 worktree 让每个缺陷独占一个工作树。hamelsmu/claude-review-loop [](https://github.com/hamelsmu/claude-review-loop)(Stop-hook + Codex)、 amazedsaint/clocoloop(MAX_ITERATIONS 循环、tmux 监控)、 dementev-dev/adversarial-review [](https://github.com/dementev-dev/adversarial-review)(Claude 写 / Codex 撕,迭代到 APPROVED)、 Dicklesworthstone/claude_code_agent_farm(20+ agents + tmux), 均可作为模板抄改。┌────────────────────────── 主机:Windows 11 + WSL2 Ubuntu ──────────────────────────┐
│ │
│ ~/code/myrepo/ (主工作树, main 分支, ext4) │
│ ~/code/myrepo/.git/ │
│ ~/code/myrepo/.claude/worktrees/bug-1023/ (Claude Code -w 自动创建) │
│ ~/code/myrepo/.claude/worktrees/bug-1042/ │
│ ~/code/myrepo/.claude/worktrees/bug-1057/ │
│ │
│ 每个 worktree 内: │
│ ┌──────────────────────────────────────────────────────────────┐ │
│ │ Step A codex exec (workspace-write, gpt-5.3-codex) │ ← fixer │
│ │ Step B claude -p --bare (code-reviewer subagent, JSON) │ ← reviewer │
│ │ Step C if NEEDS_FIX: 回到 A,最多 3 轮 │ │
│ │ Step D 生成 summary.md,git commit + 推送 PR │ │
│ └──────────────────────────────────────────────────────────────┘ │
│ │
│ 编排层:bash 脚本(dispatch-bug.sh / batch-bugs.sh) │
│ 并发控制:xargs -P 3 或 GNU parallel -j 3 │
│ 日志:~/code/myrepo/.claude/runs/<bug-id>/{fix.log,review.json,summary.md} │
└──────────────────────────────────────────────────────────────────────────────────────┘设计原则:
workspace-write 写代码;Claude Code 评审时拿 --permission-mode plan 或仅 Read/Grep/Glob/Bash(git diff:*),禁止它再去改文件 —— 这避免了同仓库写入冲突,也让评审更纯粹。2.1 文件系统位置(必须)
~/code/...(WSL ext4),不要 放 /mnt/c/...(NTFS via 9P)。\\wsl.localhost\Ubuntu\home\<user>\code\myrepo,性能远好于反过来。2.2 worktree 目录约定
两种主流方案:
--worktree(推荐起点)。.claude/worktrees/<name>/ 在仓库内,自动清理, 与 Claude 的 hooks/skills 体系深度集成。把 .claude/worktrees/ 加进 .gitignore。~/code/myrepo-bug-1023/、~/code/myrepo-bug-1042/ 这种同级目录;通过 WorktreeCreate hook 改写 Claude Code 的默认行为。优点:编辑器/Valet/Docker 之类的工具更容易识别;缺点:自己要管清理。2.3 共享依赖 vs 隔离依赖
| 资源 | 默认行为 | 推荐做法 |
|---|---|---|
.git | 共享(worktree 本质) | 保持共享 |
node_modules | 不自动共享 | 用 pnpm + content-addressable store 共享;或在 WorktreeCreate hook 里 cp -al(硬链接)/ symlink;npm/yarn 可以直接软链 |
| Python venv | 不共享 | 每个 worktree 独立 venv(uv 创建 <1s);或共享一个全局 venv 但要锁定版本 |
构建产物 (dist/, target/) | 不共享 | 保持独立 —— 共享会破坏隔离意义 |
.env / 本地配置 | 不拷 | 用 .worktreeinclude(Mattbrailsford 模式)或 WorktreeCreate hook 拷贝;db 端口/名要按分支后缀打散 |
2.4 worktree.sh 创建脚本(sibling 目录,含 .env 拷贝)
#!/usr/bin/env bash
# scripts/wt-create.sh — 在仓库同级目录创建 worktree
# 用法: ./scripts/wt-create.sh <bug-id> [base-branch]
set -euo pipefail
BUG_ID="${1:?need bug id}"
BASE="${2:-origin/main}"
REPO_ROOT="$(git rev-parse --show-toplevel)"
REPO_NAME="$(basename "$REPO_ROOT")"
WT_DIR="$(dirname "$REPO_ROOT")/${REPO_NAME}-${BUG_ID}"
BRANCH="bugfix/${BUG_ID}"
git -C "$REPO_ROOT" fetch --quiet origin
if git -C "$REPO_ROOT" show-ref --verify --quiet "refs/heads/${BRANCH}"; then
git -C "$REPO_ROOT" worktree add "$WT_DIR" "$BRANCH"
else
git -C "$REPO_ROOT" worktree add -b "$BRANCH" "$WT_DIR" "$BASE"
fi
# 拷贝本地未跟踪文件(.env 等)
[[ -f "$REPO_ROOT/.env" ]] && cp "$REPO_ROOT/.env" "$WT_DIR/.env"
# 共享 node_modules(硬链接,省磁盘且互不污染删除)
if [[ -d "$REPO_ROOT/node_modules" ]]; then
cp -al "$REPO_ROOT/node_modules" "$WT_DIR/node_modules" 2>/dev/null || \
ln -s "$REPO_ROOT/node_modules" "$WT_DIR/node_modules"
fi
echo "$WT_DIR"2.5 清理脚本
#!/usr/bin/env bash
# scripts/wt-clean.sh — 合并/丢弃后清理
set -euo pipefail
WT="${1:?worktree path}"
REPO_ROOT="$(git -C "$WT" rev-parse --show-toplevel || echo "$WT")"
BRANCH="$(git -C "$WT" branch --show-current)"
git -C "$REPO_ROOT" worktree remove --force "$WT" || rm -rf "$WT"
git -C "$REPO_ROOT" branch -D "$BRANCH" 2>/dev/null || true
git -C "$REPO_ROOT" worktree prune2.6 合并策略建议
git fetch && git rebase origin/main,不要 在 bug worktree 里 rebase —— 因为 bug worktree 的 HEAD 是 reviewer 看过的版本,rebase 后还要重新评审。wt-clean.sh 回收。3.1 项目根 CLAUDE.md(约 50 行甜区,过长反而稀释信号)
# 项目约定(Claude Code 读取)
## 必读上下文
- 这是一个 [简述项目]。架构入口:`src/main.ts` → `src/router.ts`。
- 构建:`pnpm build`;测试:`pnpm test`;lint:`pnpm lint`。
- 提交前必须跑 `pnpm lint && pnpm test`。
## 修复缺陷工作流
- 缺陷修复永远在独立 worktree 进行;分支名 `bugfix/<id>`。
- 评审报告写到 `.claude/runs/<id>/review.json`,格式见 `.claude/agents/code-reviewer.md`。
- 修复 summary 写到 `.claude/runs/<id>/summary.md`。
## 硬规则
- 不要修改 `db/migrations/` 下已合入的迁移;新加迁移文件。
- 不要在测试文件外引入 `console.log`。
- 不要碰 `.env`、`secrets/`、`*.key`。
## 评审通过标准
- 单元测试全绿;新增公共 API 必须有测试。
- 不引入新的 lint 错误。
- 修改面 ≤ 影响范围说明里列出的文件。同目录放 AGENTS.md(Codex 读),内容偏指令式(命令清单、不该做什么),与 CLAUDE.md 互补但 不重复。OpenAI 官方文档明确
project_doc_max_bytes 默认 32 KiB 的截断风险( thepromptshelf 提示),全局 AGENTS.md 控制在 2–3 KB。
3.2 .claude/agents/code-reviewer.md(项目级 subagent)
---
name: code-reviewer
description: 评审一段 git diff,按规约输出结构化 JSON。仅读权限。MUST BE USED when reviewing bug fixes.
tools: Read, Grep, Glob, Bash(git diff:*), Bash(git log:*), Bash(git show:*), Bash(pnpm test:*), Bash(pnpm lint:*)
model: sonnet
---
You are a senior code reviewer. Review the uncommitted diff in the current
worktree against the bug description provided in the prompt.
ALWAYS output ONLY a single JSON object (no prose, no markdown fences) with this shape:
{
"verdict": "PASS" | "NEEDS_FIX",
"summary": "<one-line headline>",
"root_cause": "<短句根因>",
"issues": [
{
"severity": "P0" | "P1" | "P2" | "P3",
"file": "<path>",
"line": <int|null>,
"title": "<问题标题>",
"detail": "<具体描述>",
"suggested_fix": "<可选补丁建议>"
}
],
"tests_run": ["pnpm test", "pnpm lint"],
"impact": "<影响范围: 文件/模块>",
"next_steps": "<回归测试建议>"
}
Rules:
- 不要修改任何文件。
- 把 P0/P1 列为 NEEDS_FIX 的依据;P2/P3 可以 PASS 但记录在 issues 里。
- 至少跑 `pnpm test` 和 `pnpm lint` 一次再下判断。3.3 .claude/settings.json(项目级,已含 hooks 和权限白名单)
{
"permissions": {
"allow": [
"Read", "Grep", "Glob",
"Bash(git status:*)", "Bash(git diff:*)", "Bash(git log:*)",
"Bash(git add:*)", "Bash(git commit:*)", "Bash(git push:*)",
"Bash(pnpm install:*)", "Bash(pnpm test:*)", "Bash(pnpm lint:*)",
"Bash(codex exec:*)"
],
"deny": [
"Read(./.env)", "Read(./.env.*)", "Read(./secrets/**)",
"Write(./db/migrations/**)"
]
},
"hooks": {
"PostToolUse": [
{
"matcher": "Write|Edit|MultiEdit",
"hooks": [
{
"type": "command",
"command": "node -e \"const f=JSON.parse(require('fs').readFileSync(0,'utf8')).tool_input.file_path||''; if(/\\.(ts|tsx|js|jsx)$/.test(f)) require('child_process').execSync('pnpm prettier --write '+JSON.stringify(f),{stdio:'inherit'});\""
}
]
}
],
"Stop": [
{
"hooks": [
{
"type": "command",
"command": "INPUT=$(cat); [ \"$(echo \"$INPUT\" | jq -r .stop_hook_active)\" = \"true\" ] && exit 0; pnpm -s lint || { echo '{\"decision\":\"block\",\"reason\":\"lint failed, please fix before stopping\"}'; exit 0; }"
}
]
}
],
"WorktreeCreate": [
{ "hooks": [ { "type": "command", "command": "bash \"$CLAUDE_PROJECT_DIR/scripts/wt-hook.sh\"" } ] }
],
"WorktreeRemove": [
{ "hooks": [ { "type": "command", "command": "bash \"$CLAUDE_PROJECT_DIR/scripts/wt-hook.sh\"" } ] }
]
}
}3.4 自定义 slash command .claude/commands/fix-bug.md
---
description: 修复一个缺陷(在当前 worktree 内运行:先实现修复,再调用 code-reviewer 评审)
argument-hint: <缺陷标题/描述>
allowed-tools: Read, Write, Edit, Bash(git *), Bash(pnpm *), Task
---
任务:修复缺陷 —— $ARGUMENTS
请执行以下步骤:
1. 用 Explore subagent 定位涉及代码(不要把搜索结果塞进主上下文)。
2. 实施最小修复,遵循 CLAUDE.md 的硬规则。
3. 跑 `pnpm test` 和 `pnpm lint`。
4. 调用 `code-reviewer` subagent 评审 git diff,传入本缺陷描述。
5. 如果评审 verdict 为 NEEDS_FIX,按 P0/P1 issues 修复后再次评审,最多 3 轮。
6. 最终输出 `.claude/runs/<id>/summary.md`:根因、改动思路、解决方案、影响范围、测试建议。3.5 Headless 模式调用模板
# 评审:纯读、结构化 JSON,自动放过常用工具
claude -p --bare \
--permission-mode dontAsk \
--allowed-tools "Read,Grep,Glob,Bash(git diff:*),Bash(pnpm test:*),Bash(pnpm lint:*)" \
--output-format json \
--max-turns 8 \
--append-system-prompt "$(cat .claude/agents/code-reviewer.md)" \
"$(cat <<EOF
请评审当前 worktree 的未提交改动。
缺陷描述:${BUG_DESC}
按 .claude/agents/code-reviewer.md 的 JSON 格式输出。
EOF
)" > review.json关键 flag 说明:
--bare:跳过 OAuth/keychain 自动发现和 ~/.claude 的 hooks/skills 加载,CI 必备(官方文档明确”--bare is the recommended mode for scripted and SDK calls, and will become the default for -p in a future release”)。--permission-mode dontAsk:未在 allowlist 的工具调用一律拒绝(不是询问),不会卡住脚本。--max-turns N:硬上限,防止无限 agent loop 烧 token。--output-format json:返回单个 JSON 对象(不是 stream),字段为 result/session_id/total_cost_usd/num_turns/is_error/duration_ms/usage/modelUsage。4.1 ~/.codex/config.toml(推荐起点)
model = "gpt-5.3-codex"
model_reasoning_effort = "medium"
approval_policy = "never" # 给 codex exec 用;交互 TUI 你可以另开 profile
[agents]
max_threads = 6
max_depth = 1
[profiles.bug-fixer]
model = "gpt-5.3-codex"
model_reasoning_effort = "high"
approval_policy = "never"
[profiles.fast]
model = "gpt-5.3-codex-spark"
model_reasoning_effort = "low"
[profiles.reviewer]
model = "gpt-5.4" # 不同家族交叉评审更稳
model_reasoning_effort = "high"
sandbox_mode = "read-only"4.2 ~/.codex/agents/bug-fixer.toml(custom subagent)
name = "bug-fixer"
description = "实施单一缺陷的最小修复;不重构无关代码。"
model = "gpt-5.3-codex"
model_reasoning_effort = "high"
sandbox_mode = "workspace-write"
developer_instructions = """
You implement the smallest patch that resolves the reported bug.
- Read AGENTS.md and CLAUDE.md before editing.
- Add or update tests covering the regression.
- Never modify db/migrations files that already exist.
- Run `pnpm test` and `pnpm lint` after your change. Iterate until both pass.
- Emit a final summary with: root cause, patch outline, files changed, test results.
"""
nickname_candidates = ["Patch", "Mender", "Fixer"]4.3 Headless 调用模板
# fix:写权限、最大化推理强度
codex exec \
--cd "$WT_DIR" \
--profile bug-fixer \
--sandbox workspace-write \
--json \
--output-last-message "$RUN_DIR/fix.last.txt" \
"$(cat <<EOF
请修复以下缺陷。完成后简要总结改动。
缺陷 ID: $BUG_ID
描述: $BUG_DESC
当前 worktree: $WT_DIR
EOF
)" 2> "$RUN_DIR/fix.events.jsonl" \
| tee "$RUN_DIR/fix.stdout.log"
# review:用 codex 自带的 review 子命令做交叉评审(可选)
codex exec review --uncommitted \
--cd "$WT_DIR" \
--profile reviewer \
--json \
> "$RUN_DIR/codex-review.jsonl"codex exec 的关键 flag:
--cd <DIR> / -C:设工作目录。** 这是多 worktree 并行的核心**。--sandbox read-only|workspace-write|danger-full-access: 评审用 read-only,修复用 workspace-write。--json:newline-delimited JSONL 事件流(注意:与 Claude 的 --output-format json 行为不同,更像 stream-json)。--output-schema schema.json:用 JSON Schema 强约束 final agent message。--output-last-message <path>:把最终消息写到文件, 最适合脚本读取。--ephemeral:不保存 rollout(一次性任务)。--skip-git-repo-check:当 cwd 不是 git 仓库时跳过守卫。--full-auto:等价于 --sandbox workspace-write --ask-for-approval never, CI 友好。CODEX_API_KEY=xxx codex exec ...:仅在 codex exec 下支持的 inline 鉴权。4.4 codex-plugin-cc(官方插件,可选加成)
如果你想在 Claude Code 交互里直接 /codex:review:
/plugin marketplace add openai/codex-plugin-cc
/plugin install codex@openai-codex
/reload-plugins
/codex:setup提供的命令(共 6 个,以 openai/codex-plugin-cc 官方 README 为准):/codex:review、/codex:adversarial-review、/codex:rescue(把任务整体交给 Codex)、 /codex:status、/codex:result(查看历史结果,含 Codex session-id 可 codex resume)、/codex:cancel(取消活跃后台作业)。 其底层就是调本机 codex CLI + codex app server,复用 ~/.codex/config.toml。** 注意官方 README 自己警告 Review Gate 会拉长 Claude/Codex 循环、可能快速烧光配额** —— 因此用于”手动派单单个缺陷”很合适,批量场景仍建议走自己写的 bash 脚本以便控上限。
scripts/dispatch-bug.sh:
#!/usr/bin/env bash
# scripts/dispatch-bug.sh
# 用法: ./scripts/dispatch-bug.sh <BUG_ID> "<BUG_DESC>" [BASE_BRANCH]
set -euo pipefail
BUG_ID="${1:?bug id required}"
BUG_DESC="${2:?bug description required}"
BASE="${3:-origin/main}"
MAX_ROUNDS="${MAX_ROUNDS:-3}"
REPO_ROOT="$(git rev-parse --show-toplevel)"
WT_DIR="$(./scripts/wt-create.sh "$BUG_ID" "$BASE")"
RUN_DIR="$REPO_ROOT/.claude/runs/$BUG_ID"
mkdir -p "$RUN_DIR"
echo "[$BUG_ID] worktree=$WT_DIR runs=$RUN_DIR"
# 缺陷描述落盘,让 agents 都能读
cat > "$WT_DIR/.bug.md" <<EOF
# Bug $BUG_ID
$BUG_DESC
EOF
round=0
verdict="NEEDS_FIX"
while [[ "$verdict" == "NEEDS_FIX" && $round -lt $MAX_ROUNDS ]]; do
round=$((round+1))
echo "[$BUG_ID] ===== Round $round/$MAX_ROUNDS ====="
# ---- Step 1: Codex 修复 ----
codex exec \
--cd "$WT_DIR" \
--profile bug-fixer \
--sandbox workspace-write \
--full-auto \
--json \
--output-last-message "$RUN_DIR/fix.r${round}.txt" \
"$(cat <<EOF
你是 bug-fixer。请修复 $WT_DIR/.bug.md 描述的缺陷。
- 已有评审反馈(如有): $RUN_DIR/review.r$((round-1)).json
- 最小改动;必须新增/更新覆盖该缺陷的测试。
- 完成后跑 pnpm test 和 pnpm lint,直到通过。
EOF
)" 2> "$RUN_DIR/fix.r${round}.jsonl"
# ---- Step 2: Claude 评审 ----
pushd "$WT_DIR" >/dev/null
claude -p --bare \
--permission-mode dontAsk \
--allowed-tools "Read,Grep,Glob,Bash(git diff:*),Bash(git log:*),Bash(pnpm test:*),Bash(pnpm lint:*)" \
--output-format json \
--max-turns 10 \
--append-system-prompt "$(cat "$REPO_ROOT/.claude/agents/code-reviewer.md")" \
"请评审本 worktree 的未提交改动。缺陷描述见 .bug.md。按规约输出 JSON。" \
> "$RUN_DIR/review.r${round}.full.json"
popd >/dev/null
# 提取 reviewer 输出(result 字段里的 JSON)
jq -r '.result' "$RUN_DIR/review.r${round}.full.json" > "$RUN_DIR/review.r${round}.json"
verdict="$(jq -r '.verdict // "NEEDS_FIX"' "$RUN_DIR/review.r${round}.json")"
echo "[$BUG_ID] Round $round verdict=$verdict"
if [[ "$verdict" == "PASS" ]]; then
break
fi
done
if [[ "$verdict" != "PASS" ]]; then
echo "[$BUG_ID] ⚠️ 达到 $MAX_ROUNDS 轮仍未通过;请人工介入"
jq '.issues' "$RUN_DIR/review.r${round}.json" || true
exit 2
fi
# ---- Step 3: 生成 summary + 提交 ----
claude -p --bare \
--permission-mode dontAsk \
--allowed-tools "Read,Bash(git diff:*),Bash(git log:*),Write" \
--max-turns 6 \
"$(cat <<EOF
基于本 worktree 的 git diff 和 $RUN_DIR/review.r${round}.json,
生成 $RUN_DIR/summary.md,包含以下小节:
- 根因分析
- 改动思路
- 解决方案(关键 diff 摘要)
- 影响范围(文件/模块/边界)
- 测试建议(回归 case)
EOF
)" > /dev/null
git -C "$WT_DIR" add -A
git -C "$WT_DIR" commit -m "fix($BUG_ID): $BUG_DESC
Auto-fixed by codex+claude review loop ($round rounds).
See $RUN_DIR/summary.md"
# 推送并创建 PR(可选,需要 gh CLI)
if command -v gh >/dev/null; then
git -C "$WT_DIR" push -u origin "bugfix/$BUG_ID"
gh pr create --repo "$(gh repo view --json nameWithOwner -q .nameWithOwner)" \
--title "fix($BUG_ID): $BUG_DESC" \
--body "$(cat "$RUN_DIR/summary.md")" \
--base main --head "bugfix/$BUG_ID"
fi
echo "[$BUG_ID] ✅ Done. summary: $RUN_DIR/summary.md"输入格式(bugs.tsv,制表符分隔):
1023 登录页 captcha 偶发不刷新
1042 订单详情金额未脱敏
1057 导出 CSV 中文乱码或者 JSON(bugs.json)—— 同时支持:
#!/usr/bin/env bash
# scripts/batch-bugs.sh
# 用法: ./scripts/batch-bugs.sh bugs.tsv (TSV: bug_id\tdesc)
# PARALLEL=3 ./scripts/batch-bugs.sh bugs.tsv
set -euo pipefail
INPUT="${1:?input file (TSV or JSON)}"
PARALLEL="${PARALLEL:-3}" # 同时跑几个;建议 2-4
LOG="$(git rev-parse --show-toplevel)/.claude/runs/batch-$(date +%Y%m%d-%H%M%S).log"
# 统一转成 "id<TAB>desc" 流
to_pairs() {
if [[ "$INPUT" == *.json ]]; then
jq -r '.[] | [.id, .desc] | @tsv' "$INPUT"
else
cat "$INPUT"
fi
}
mkdir -p "$(dirname "$LOG")"
echo "Batch start: $(date)" | tee "$LOG"
to_pairs | \
xargs -I{} -P "$PARALLEL" bash -c '
IFS=$"\t" read -r ID DESC <<< "{}"
echo "[BATCH] start $ID"
if ./scripts/dispatch-bug.sh "$ID" "$DESC"; then
echo "[BATCH] ok $ID"
else
echo "[BATCH] FAIL $ID ($?)"
fi
' 2>&1 | tee -a "$LOG"
# 汇总报告
echo "=== Batch summary ===" | tee -a "$LOG"
for dir in .claude/runs/*/; do
id="$(basename "$dir")"
v="$(jq -r '.verdict // "?"' "$dir"/review.r*.json 2>/dev/null | tail -1)"
echo "$id $v"
done | tee -a "$LOG"并发度建议:
| 配置 | 建议并发 |
|---|---|
| 8 vCPU / 16 GB RAM / Claude Pro + Codex Plus | 2–3 |
| 16 vCPU / 32 GB / Max5 + Codex Pro | 3–5 |
| 32 vCPU+ / Max20 + API key | 5–8(注意 weekly 限额) |
为什么不要更多? Anthropic 在他们的多 agent 系统博客明确:“a multi-agent system with Claude Opus 4 as the lead agent and Claude Sonnet 4 subagents outperformed single-agent Claude Opus 4 by 90.2% on our internal research eval” —— 但同篇博客也指出”multi-agent systems use approximately 15× more tokens than single chats”。本地侧再看,每个 worktree 平均吃 1–2 GB RAM(dev server + 测试进程),并发太高会撞磁盘 IO 墙。
tmux -CC 在 Windows Terminal 下也可), Claude Code Agent Farm 等成熟项目都用 tmux + pane title 实时显示状态。claude-code-hooks-multi-agent-observability 是基于 hooks 把事件转发到 Bun/SQLite/WebSocket 的实时看板;如果只是 3–5 个并发,看 .claude/runs/*/review.r*.json 已经够。runs/<bug-id>/fix.r<N>.jsonl、review.r<N>.json、summary.md;状态文件 runs/<bug-id>/status 写 running|fixing|reviewing|passed|failed。场景:测试同学一次性提交三个缺陷:
步骤:
WSL 终端:
cat > bugs.tsv <<EOF
1023 登录页 captcha 偶发不刷新
1042 订单详情金额未脱敏
1057 导出 CSV 中文乱码
EOF
PARALLEL=3 ./scripts/batch-bugs.sh bugs.tsvtmux 里开三个 pane,watch -n 5 'cat .claude/runs/1023/status .claude/runs/1042/status .claude/runs/1057/status'。
大约 8 分钟后,编排脚本依次完成:
src/components/Captcha.tsx,Claude 评审发现”没加 race condition 测试” → NEEDS_FIX。.claude/runs/<id>/summary.md 作为 PR body。git fetch && git rebase origin/main && gh pr review --approve —— 真正的人介入时间 < 10 分钟/批。| 坑 | 表现 | 解决 |
|---|---|---|
仓库放 /mnt/c/ | 编译/测试慢 5–10×,git status 卡顿 | 必须放 ~/code/ 下;用 \\wsl.localhost\ 从 Windows 访问 |
| Windows 杀软扫描 WSL 文件 | I/O 慢、pnpm install 超时 | Defender → Add exclusion → 加 \\wsl$ 或对应 vhdx |
| Claude Code 装到 Windows 侧,Codex 装到 WSL | PATH 冲突、codex exec 找不到 git/node | 两者都装到 WSL 内(npm install -g),并在 /etc/wsl.conf 里 appendWindowsPath = false |
| Codex 鉴权浏览器打不开 | codex login 挂起 | sudo apt install wslu,配 wslview 作为默认 browser; 或改用 OPENAI_API_KEY |
| WSL1 + Codex 0.115+ | 不再支持(bubblewrap sandbox) | 升级 WSL2;wsl --set-version <distro> 2 |
| 同时跑多个 dev server | 端口冲突 / DB 互踩 | WorktreeCreate hook 里按分支名生成端口偏移、DB 名后缀 |
--dangerously-skip-permissions 在仓库根 | 误删/误改风险 | 只在 worktree 内、且配合 deny 规则使用;或保留 Stop hook 跑 lint 当兜底 |
| Stop hook 死循环 | Claude 反复被拉回继续干 | 必须检查 stop_hook_active 字段直接 exit 0 |
Codex --json + MCP 同时启用 | 输出丢失(issue #15451) | 关掉 MCP 或不用 --json,改 --output-last-message |
| AGENTS.md 太大 | Codex 静默截断后置项目规则 | 全局 AGENTS.md < 2 KB;项目 AGENTS.md 控制在 32 KiB 总预算内 |
| 多 worktree 共享 node_modules 软链断开 | 一个 worktree rm -rf node_modules 把主仓库的也删了 | 用 cp -al(硬链接),不要用 symlink;或每个 worktree 独立 pnpm install(pnpm 的 CAS 让重复成本接近零) |
| Claude headless 输出 JSON 解析失败 | result 字段里包了 markdown 围栏 | 在 subagent prompt 里明确 “no prose, no markdown fences”;解析时再做一层 jq + 容错 |
阶段 1(今天 / 1 小时上手):
~/code/(ext4),WSL 里跑 git clone。CLAUDE.md 和 ~30 行的 AGENTS.md(互不重复)。claude -w demo-task 验证 worktree 工作。code-reviewer.md 和 settings.json 到 .claude/,跑一次 claude /agents 确认被识别。阶段 2(一周内 / 单缺陷模式):
5. 把 scripts/wt-create.sh、scripts/wt-clean.sh、scripts/dispatch-bug.sh 落到仓库;用一个真实的小缺陷跑一遍。
6. 调 MAX_ROUNDS(默认 3,复杂仓库可调到 4–5)和 --max-turns(fix 用 20、review 用 10 是甜区)。
7. 让一两个同事在他们的 worktree 上跑同一个脚本,验证多人多 worktree 不互踩。
8. 基准切换标准:如果 review 通过率第 1 轮 < 60%,先优化 CLAUDE.md 里的”评审通过标准”和 code-reviewer.md 的输出格式,不要急着加更多 agent。
阶段 3(两周内 / 批量模式):
9. 落 scripts/batch-bugs.sh;用历史 5–10 个真实缺陷做回归测试,看哪些场景被自动 fix 命中率高(小型 bug fix 命中率通常 ≥70%)。
10. 加 tmux + 一个简单的 watch 状态面板。
11. 并发度逐步加压:从 PARALLEL=2 起,加到 weekly 限额或 CPU 触顶为止。
阶段 4(一个月内 / 进阶):
12. 引入 codex-plugin-cc(OpenAI 2026-03-30 发布的官方插件)做手动派单时的人机协作评审;和脚本化的批量流程并存。
13. 跑评估:每 50 个缺陷统计一次”自动通过率 / 平均轮数 / 平均成本(total_cost_usd)/ 人工干预率”。阈值:自动通过率 < 50% 或人工干预率 > 30% 时,停下来优化 prompts 和约定文档,不要堆 agent 数。注意 Anthropic《2026 Agentic Coding Trends Report》自己报告的”delegation gap” —— 业界平均”AI 用在 60% 的工作里,但实际能完全委派的只有 0–20%”, 30% 的人工干预率是真实合理的基线。
14. 把 .claude/agents/code-reviewer.md 拆成两个:code-reviewer-security(专门看注入/越权/凭证)+ code-reviewer-correctness(逻辑/边界) —— Anthropic 自己博客提到细分 reviewer 能再提一截质量。
15. 不要做的事:
max_depth 调到 ≥2(指数级烧 token)。--bare —— CI/批量场景下没它就会被本地 ~/.claude 污染。升级触发器:
.claude/agents/、.claude/commands/、scripts/ 提到独立的 plugin 仓库,用 /plugin install 分发。-w CLI flag,由 Boris Cherny 在 2026-02-20 宣布)、subagents、hooks、headless 模式、codex exec、codex exec review 全部是 Anthropic / OpenAI 官方文档化的特性;codex-plugin-cc(2026-03-30 OpenAI 发布)是 OpenAI 官方仓库;“互为 reviewer 的循环编排脚本”是 社区主流模式(hamelsmu/claude-review-loop、dementev-dev/adversarial-review、ching-kuo/claude-codex 等),不是任何一家官方的”参考实现”。本文给出的 dispatch-bug.sh / batch-bugs.sh 是基于这些项目和官方 flag 文档综合推断的最小可用版,使用前请自己跑通一遍。--bare 当前 stable,但 OpenAI 文档预告”will become the default for -p in a future release”)、 --permission-mode 值集合(dontAsk 是较新增加的)、codex exec --json + --output-schema 的稳定性(issue #15451 尚未关闭) 都可能变。升级前先 claude --version 和 codex --version 比对官方 changelog。total_cost_usd 累加,否则容易一夜烧光配额。dispatch-bug.sh 入口处过滤出来走人工。openai/codex 仓库内的 codex-rs/core/review_prompt.md 源码使用的是 P0/P1/P2/P3,JSON 里 priority 取 0–3。本文 reviewer subagent 沿用 P0–P3 以与 Codex 评审 JSON 对齐。--output-format json 字段细节:本文按 2026 春的字段集编写(total_cost_usd 而非 cost_usd);老脚本里若用了 cost_usd 需迁移。Anthropic 文档原文:“With --output-format json, the response payload includes total_cost_usd and a per-model cost breakdown”。~/.codex/agents/*.toml 当成长期方案,建议把同样的角色用”prompt 注入 + profile 切换”再实现一份作为备份。~/code/。
加载评论中...