同一个编码任务,在同一代码库快照、同一 MCP 配置下,并行分发给 M 个 Coding Harness × N 个底层模型,各路在独立 git worktree 中执行,产出 diff 供人工验收打分,结果沉淀为个人偏好数据库——为「任务 → 最优 harness+model 组合」的智能路由积累数据。
当前状态:M1 完成(CLI + 执行引擎 + 三个适配器,冒烟通过)。下一步 M2:
arena serveWeb 对比/打分 UI。设计见 docs/design/architecture-v1.md,调研见 docs/research/。
npm install
./bin/arena run "在 app.js 加 greet(name) 并 module.exports" \
--repo /path/to/your/repo \
--matrix "claude-code:sonnet,opus:low codex:default:low opencode:opencode/big-pickle:low" \
--timeout-min 15矩阵语法:harness:model1,model2:effort1,effort2(effort ∈ off|low|high,多组空格分隔)。
其他命令:
./bin/arena serve -p 3939 # Web UI:diff 并排对比、打分/采用、A/B 两两对比、排行榜
./bin/arena verdict <taskId> # 终端交互式验收(逐格打分 + pairwise)
./bin/arena stats # 按组合聚合的表现排行榜
./bin/arena accept <runId> # 输出把该 run 合入目标 repo 的 merge/apply 命令
./bin/arena list # 历史任务
./bin/arena show <taskId> # 某任务各 run 状态/指标/diff 路径(id 可前缀)
./bin/arena export -o x.jsonl
./bin/arena adapters # 已支持 harness 列表
./bin/arena run ... --dry-run # 只建档展开矩阵不执行
./bin/arena run ... --mcp ./arena.mcp.json # 注入统一 MCP 配置(公平性)数据落在 ~/.arena/:arena.db(SQLite:task/run/verdict/pairwise 四表)、tasks/<taskId>/artifacts/(每 run 的原始事件流 *.jsonl + 补丁 *.patch)。每个 run 在目标 repo 留一个 arena/<taskId>/<runId> 分支,diff 可复核、可 cherry-pick。
| harness | 模型 | effort 映射 | 凭证 |
|---|---|---|---|
claude-code |
sonnet/opus/haiku/全名 |
--effort low/high |
ANTHROPIC_API_KEY 或已 claude login |
codex |
default(或 -m 任意模型) |
model_reasoning_effort=minimal/low/high |
~/.codex/auth.json(自动复制进隔离 CODEX_HOME) |
opencode |
provider/model(如 anthropic/claude-sonnet-4-6、opencode/big-pickle) |
--variant minimal/low/high |
opencode auth login / ~/.config/opencode/opencode.json 自定义 provider |
注意:
- Claude Code 与 Codex 走各自的官方模型;Claude Code × 非 Claude 模型需要
ANTHROPIC_BASE_URL代理(△ 探索格,适配器已支持extraEnv注入)。 - Codex 无头模式有 TTY/stdin 两个已知 bug,适配器已内置 workaround(stdin 空写端 + 隔离 CODEX_HOME)。
- 单机并行瓶颈是 API 限流而非 CPU:默认每 provider 并发 2,用
--concurrency '{"openai":3}'调。
src/
cli.ts # commander CLI(run/list/show/serve/verdict/stats/accept/export/adapters)
engine.ts # 单 run 生命周期:worktree → 子进程 → diff 导出 → 指标入库
runner.ts # 并发调度:按 provider 分桶限流 + 失败重试
server.ts # arena serve 的 REST API(Node 原生 http,无框架)
verdict.ts # 终端交互式验收(readline 行读取器,TTY/管道均可)
adapters/ # claude-code / codex / opencode(build + extractMetrics)
store.ts # SQLite(better-sqlite3,WAL)+ verdict/pairwise 读写 + comboStats
git.ts # worktree / diff 采集(git add -N 覆盖未跟踪文件)
matrix.ts # 矩阵展开
web/
index.html # 单文件 UI(diff2html CDN 渲染 diff,打分/A-B/排行榜)
关键设计(详见架构文档):公平性靠「同 base commit + 同 MCP 配置快照 + 隔离配置目录」;指标归一化为 RunMetrics{tokens, costUsd, wallTimeMs, numTurns, toolCalls, exitStatus};verdict/pairwise 表为场景 2 的 Bradley-Terry / 路由预留。
npx vitest run # 单元测试(矩阵展开 + 三个适配器的日志解析)
npx tsc --noEmit # 类型检查- M1 CLI + worktree 执行引擎 + 3 适配器(冒烟通过:codex×gpt + opencode×big-pickle 并行产出 diff 与指标)
- M2 验收闭环:
arena verdict终端交互 +arena serveWeb UI(diff 并排/打分/采用/A-B pairwise 落库)+arena stats排行榜 - M3 kimi-code 适配器 + gateway 元数据记录(量化 harness 锁定效应)
- M4 统计视图(组合胜率/成本/时长)+ 任务标签
- M5 Harbor/Terminal-Bench 导入器(
task.source='terminal-bench')+ DockerRunner