技術
約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+b → d
次回予告
実際にMacで一晩放置して、ゲームが作れるか試す。結果は別記事で。