技術 約5分で読めます

tmuxでClaude CodeとCodexを連携させて一晩放置でゲームを作らせる(準備編)

やりたいこと

Claude Codeに実装させて、OpenAI Codexにレビューさせて、またClaudeに修正させる。これを自動でループさせて、一晩放置で何か作れるか試したい。

Claude Code(実装)
    ↓ コード出力
Codex(レビュー)
    ↓ レビュー結果
Claude Code(修正)
    ↓ 繰り返し...

VS Code上で両方の拡張機能を動かしても、お互いに通信する手段がない。各拡張機能は独立したプロセスで動いていて、通信APIもないから。

tmuxならできる。

なぜtmuxか

tmuxには以下の機能があって、ペイン間の通信が可能。

機能説明
send-keys他のペインにコマンド/テキストを送信
capture-paneペインの出力をキャプチャ
pipe-paneペイン出力を外部プロセスにパイプ

ただ今回は直列パイプラインなので、tmuxのペイン間通信は使わない。シンプルにファイル経由でデータを渡す。

環境準備

macOS

brew install tmux

Windows (WSL2)

sudo apt update && sudo apt install tmux -y

PowerShellではtmuxは動かない。WSL2が必須。

基本スクリプト

#!/bin/bash
# ai-review-loop.sh

WORK_DIR="/tmp/ai-review"
mkdir -p "$WORK_DIR"

TASK="$1"
MAX_ROUNDS=3

# ログファイル(tmuxの左右ペインで監視する用)
CLAUDE_LOG="$WORK_DIR/claude.log"
CODEX_LOG="$WORK_DIR/codex.log"

# 1. 初回実装(Claude)
echo "=== Round 1: Claude実装 ===" | tee -a "$CLAUDE_LOG"
echo "$TASK" | claude -p 2>&1 | tee "$WORK_DIR/code-v1.txt" >> "$CLAUDE_LOG"

for i in $(seq 1 $MAX_ROUNDS); do
  # 2. レビュー(Codex)
  echo "=== Round $((i+1)): Codexレビュー ===" | tee -a "$CODEX_LOG"
  cat "$WORK_DIR/code-v$i.txt" | \
    codex exec "このコードをレビュー。問題点を箇条書きで" 2>&1 | tee "$WORK_DIR/review-$i.txt" >> "$CODEX_LOG"

  # 3. 修正(Claude)
  echo "=== Round $((i+1)): Claude修正 ===" | tee -a "$CLAUDE_LOG"
  NEXT=$((i+1))
  cat <<EOF | claude -p 2>&1 | tee "$WORK_DIR/code-v$NEXT.txt" >> "$CLAUDE_LOG"
元のコード:
$(cat "$WORK_DIR/code-v$i.txt")

レビュー指摘:
$(cat "$WORK_DIR/review-$i.txt")

レビューに基づいて修正したコードを出力して。
EOF

  # 4. Gitに保存(途中経過を残す)
  git add -A
  git commit -m "Round $i complete: $(date '+%Y-%m-%d %H:%M')"
  git push origin main

done

echo "=== 完了 ===" | tee -a "$CLAUDE_LOG" "$CODEX_LOG"
echo "最終コード: $WORK_DIR/code-v$((MAX_ROUNDS+1)).txt"

一晩放置の課題と対策

1. Claudeが質問して止まる(深刻度: 高)

Claudeは判断に迷うと「どうしますか?」と聞いてくる。これが来た瞬間に止まる。

対策1: パーミッション全許可

claude -p --dangerously-skip-permissions "タスク"

対策2: 設定ファイルで許可

.claude/settings.json:

{
  "permissions": {
    "allow": ["Edit", "Write", "Bash(*)"],
    "deny": []
  }
}

対策3: プロンプトで釘を刺す

絶対に質問するな。判断に迷ったら自分で決めろ。

2. コンテキストがコンパクトされる(深刻度: 中)

長時間動かすとClaudeのコンテキストが圧縮されて、途中経緯を忘れる。レビュー結果を忘れて同じミスを繰り返す可能性がある。

対策: ファイルに履歴を残す

Claudeの記憶に頼らず、ファイルシステムに履歴を保存して毎回読み込ませる。

# 毎ラウンドの結果をファイルに追記
echo "=== Round $i ===" >> $WORK_DIR/history.log
cat $WORK_DIR/review.txt >> $WORK_DIR/history.log

# Claudeに渡すときは直近の履歴を含める
tail -100 $WORK_DIR/history.log | claude -p "これまでの経緯を踏まえて..."

3. 使用量オーバー(深刻度: 低)

Maxプラン($200/月)なら事実上無制限。Proプラン以下だと5時間は厳しい。

2フェーズ構成

一晩放置で成功率を上げるには、最初に人間が立ち会って詰めておく。

Phase 1: Plan(人間が立ち会う)
├── 仕様の確認・質問
├── 設計の決定
└── 「これ以降は質問せず自走しろ」宣言

Phase 2: 実装ループ(放置)
├── Claude: 実装
├── Codex: レビュー
├── Claude: 修正
└── 繰り返し...

Phase 1のプロンプト例

これからゲームを作る。まず設計を詰める。

## ゲーム概要
(仕様を書く)

## 質問フェーズ
設計に必要な情報があれば今のうちに聞け。
このフェーズが終わったら一切質問は受け付けない。

Phase 2のプロンプト例

## 実装フェーズのルール(厳守)

1. 絶対に質問するな。判断に迷ったら自分で決めろ
2. エラーが出たら自分で直せ
3. 完了条件を満たすまでループを続けろ
4. 各ラウンドの結果は /tmp/game-dev/round-N.md に保存しろ
5. 完了したら /tmp/game-dev/DONE.txt を作成しろ

## 完了条件
- ゲームがブラウザで動作する
- 主要機能が全て実装されている
- Codexのレビューで重大な指摘がない

## 迷ったときの判断基準
- ライブラリ選定: 軽量なものを優先
- 実装方法が複数ある: シンプルな方を選べ
- 仕様が曖昧: ゲームとして自然な方を選べ

tmuxで進行状況を可視化

バックグラウンドで動かしつつ、途中経過を見たい場合。左右分割でClaudeとCodexの出力を並べて表示する。

┌─────────────────────┬─────────────────────┐
│ Claude Code         │ Codex               │
│ (実装/修正)          │ (レビュー)           │
└─────────────────────┴─────────────────────┘
#!/bin/bash
# ai-review-tmux.sh

SESSION="ai-review"
WORK_DIR="/tmp/ai-review"
mkdir -p "$WORK_DIR"

# セッション作成
tmux new-session -d -s $SESSION

# 左ペイン: Claude Codeの出力を監視
tmux send-keys -t $SESSION "watch -n 2 'echo \"=== Claude Code ===\"; tail -30 $WORK_DIR/claude.log 2>/dev/null'" C-m

# 右ペイン: Codexの出力を監視
tmux split-window -h -t $SESSION
tmux send-keys -t $SESSION "watch -n 2 'echo \"=== Codex Review ===\"; tail -30 $WORK_DIR/codex.log 2>/dev/null'" C-m

# アタッチ
tmux attach -t $SESSION

メイン処理は別ウィンドウで実行する形になる。ログファイルに出力を分けて書き込めば、左右で別々の進捗が見える。

あとから見に行く:

tmux attach -t ai-review

デタッチして放置に戻る:Ctrl+bd

次回予告

実際にMacで一晩放置して、ゲームが作れるか試す。結果は別記事で。