複数のコーディングエージェント(codex、claudecode、opencode)を同一課題・同一制約で実行し、成功率・所要時間・テスト通過率などを自動収集するベンチマークツール。
- ✅ 公平な比較:実行環境・制約・課題を統一
- 📊 自動評価:テスト通過率、実行時間、終了コードを自動収集
- 🔄 順序ランダム化:実行順の偏りを排除
- 🎯 拡張可能:新しいエージェントやタスクを簡単に追加
- 🏗️ ビルトインリポジトリ:すぐに試せるベースリポジトリを同梱
# ベンチマークツール本体
pnpm install
# ベースリポジトリ(テスト用プロジェクト)
cd base-repo
pnpm install
cd ..
デフォルトでは base-repo
を使用する設定になっています。独自のリポジトリを使う場合は .env
を編集:
BENCH_REPO_PATH=./base-repo # または独自のリポジトリパス
BENCH_TEST_CMD="pnpm test"
BENCH_TIME_BUDGET_MIN=20
pnpm build
# ベースリポジトリのセットアップ
cd base-repo
pnpm install
pnpm test # すべてのテストが通過することを確認
cd ..
# ベンチマーク実行
pnpm build
pnpm bench
ベンチ実行前に base-repo
をバグ状態へ戻したい場合は、ルートで次のスクリプトを実行します。
pnpm prepare:l1 # L1: parseUser の null チェックが壊れた状態
pnpm prepare:l2 # L2: /health ルートが登録されていない状態
pnpm prepare:l3 # L3: L1+L2 を同時に壊した複合バグ
即座にベンチを走らせる場合は pnpm bench:l1
(または bench:l2
, bench:l3
) を利用すると、リセット→ビルド→ベンチをまとめて実行できます。
バグ状態を確認したい場合は pnpm prepare:l1 -- --verify
のように VERIFY=true
を付けると対象テストのみを走らせ、期待どおり失敗するか検証できます(環境によってはネットワーク制限で health
系テストが bind エラーを出す点に注意してください)。
results/summary.csv
- 集計結果(CSV形式)results/run-<timestamp>.json
- 詳細ログ(JSON形式)
base-repo/
には、すぐに使えるテスト用プロジェクトが含まれています:
- TypeScript + Express + Jest の最小構成
- 2つのテスト課題に対応
- L1:
parseUser
関数の null チェック修正 - L2:
/health
エンドポイントの追加
- L1:
- すべてのテストが通過する状態
詳細は base-repo/README.md を参照してください。
tasks/
ディレクトリに YAML 形式でタスクを定義します。
task_id: fix-null-check
difficulty: L1
context_paths:
- src/utils/parseUser.ts
requirements:
- "undefined/nullのuserでもparseUserが落ちないこと"
constraints:
- "新規依存追加は禁止"
success_criteria:
test_cmd: "pnpm test"
must_pass: 100
time_budget_min: 15
サンプルタスク:
tasks/sample-fix-null-check.yaml
- parseUser の null 処理tasks/sample-add-endpoint.yaml
- health エンドポイント追加
bench.config.ts
で各エージェントの実行コマンドをカスタマイズできます。
agents: {
codex: {
cmd: "codex",
args: (sessionId, message) => ["exec", "--json", "resume", sessionId, message],
},
claudecode: {
cmd: "claude",
args: (sessionId, message) => [
"--json", "resume", sessionId,
"--non-interactive", "--message", message
],
},
opencode: {
cmd: "opencode",
args: (sessionId, message) => [
"run", "--format", "json", "--session", sessionId, message
],
},
}
- ネットワークアクセス:全エージェント統一(
.env
で設定) - 新規依存の追加:全エージェント統一(
.env
で設定) - 時間制限:タスクごとまたは全体で設定可能
- 実行順:ランダム化により順序効果を排除
bench/
├── package.json
├── tsconfig.json
├── bench.config.ts # エージェント設定
├── .env # 環境変数
├── src/
│ ├── types.ts # 型定義
│ ├── utils.ts # ユーティリティ
│ ├── git.ts # Git操作
│ ├── score.ts # スコアリング
│ ├── runner.ts # メインランナー
│ └── adapters/
│ ├── base.ts
│ ├── codex.ts
│ ├── claudecode.ts
│ └── opencode.ts
├── tasks/ # タスク定義(YAML)
├── base-repo/ # ビルトインテストリポジトリ
├── results/ # 実行結果(自動生成)
└── prompts/ # プロンプト(自動生成)
bench.config.ts
にエージェント設定を追加src/adapters/
に新しいアダプターを作成src/runner.ts
のadapters
オブジェクトに登録
tasks/
ディレクトリに YAML ファイルを追加するだけ。
.env
のBENCH_REPO_PATH
を変更- リポジトリが
pnpm install && pnpm test
で動作することを確認 - タスク定義の
context_paths
をリポジトリの構造に合わせて調整
各エージェントのCLIがインストールされ、PATHに追加されていることを確認してください。
# 確認コマンド
codex --version
claude --version
opencode --version
bench.config.ts
の testCmd
が正しいか確認してください。Jest を使用している場合、JSON出力オプションが利用可能か確認してください。
.env
の BENCH_TIME_BUDGET_MIN
を増やすか、個別タスクの time_budget_min
を調整してください。
cd base-repo
pnpm install
pnpm test
依存関係が正しくインストールされているか確認してください。
MIT