無限デバッグループ:Cursor CLI がテスト通過まで修正し続ける
6 min read
cursor agent が自動でコードを修正し、テストを実行し、失敗すれば再び AI に修正させる — 全テストが通るまで繰り返すシェルスクリプトを書きます。Y/N を押し続ける必要はありません。ループを AI に任せて別の作業をしましょう — ターミナルに「テスト通過」が表示されたら戻って確認するだけ。
コアコンセプト
while テストが通らない:
テスト実行 → エラーメッセージを収集
エラーメッセージを cursor agent に渡す
cursor agent がコードを修正
テストを再実行
「テスト実行 → 失敗 → AI に修正させる → 繰り返し」のループ。シンプルで直接的ですが、効果的。
Step 1:前提条件の確認
cursorがインストール・ログイン済み(cursor --versionで確認)- プロジェクトにターミナルで実行できるテストコマンドがある:
npm testpytestgo test ./...cargo test
- テスト失敗時の exit code が 0 でない(ほぼすべてのテストフレームワークのデフォルト)
Step 2:最もシンプルなスクリプト
debug-loop.sh を作成:
#!/bin/bash
MAX_LOOPS=10 # 本当に無限ループにならないよう最大回数を設定
TEST_CMD="npm test" # あなたのテストコマンドに変更
loop=0
while [ $loop -lt $MAX_LOOPS ]; do
echo ""
echo "=== ループ $((loop + 1)) 回目 ==="
# テスト実行、stdout + stderr を保存
TEST_OUTPUT=$(eval "$TEST_CMD" 2>&1)
EXIT_CODE=$?
if [ $EXIT_CODE -eq 0 ]; then
echo "✅ テスト通過!$((loop + 1)) 回で完了。"
exit 0
fi
echo "❌ テスト失敗、AI に修正させます..."
echo "$TEST_OUTPUT" | tail -30 # 最後の30行を表示
# エラーメッセージを cursor agent に渡す
cursor agent "テストが失敗しました。以下のエラーを確認してテストが通るようにコードを修正してください:
$TEST_OUTPUT" --model gpt-codex-5.3-high --no-interactive
loop=$((loop + 1))
done
echo "⚠️ 最大ループ数 ($MAX_LOOPS) に達しました。停止します。手動で確認してください。"
exit 1Step 3:スクリプトの実行
chmod +x debug-loop.sh
./debug-loop.shコーヒーを飲んだり、メッセージに返信したりしながら、ターミナルに ✅ テスト通過! が表示されるのを待ちます。MAX_LOOPS を超えても通過しなければ、手動での調査が必要です。
Step 4:プロジェクトに合わせて調整
テストコマンドの変更(4行目):
TEST_CMD="pytest -x" # Python、-x は最初のエラーで停止
TEST_CMD="go test ./..." # Go
TEST_CMD="cargo test" # Rust
TEST_CMD="./vendor/bin/phpunit" # PHP最大ループ数の調整:
MAX_LOOPS=5 # 保守的、改善しなければ早めに停止
MAX_LOOPS=20 # 複雑な問題はより多くのチャンスをAI により多くのコンテキストを与える(cursor agent コマンド内):
cursor agent "テストが失敗しました。以下にエラーがあります。
テストフレームワークは Jest、言語は TypeScript です。
テストファイルは変更しないでください。src/ 以下のファイルのみ変更してください。
エラー出力:
$TEST_OUTPUT" --model gpt-codex-5.3-high --no-interactive強化版:各ループのログを保存
#!/bin/bash
MAX_LOOPS=10
TEST_CMD="npm test"
LOG_DIR="debug-logs"
mkdir -p $LOG_DIR
loop=0
while [ $loop -lt $MAX_LOOPS ]; do
echo ""
echo "=== ループ $((loop + 1)) 回目 ==="
LOG_FILE="$LOG_DIR/loop-$((loop + 1)).log"
TEST_OUTPUT=$(eval "$TEST_CMD" 2>&1 | tee "$LOG_FILE")
EXIT_CODE=${PIPESTATUS[0]}
if [ $EXIT_CODE -eq 0 ]; then
echo "✅ テスト通過!$((loop + 1)) 回で完了。"
exit 0
fi
echo "❌ 失敗。ログを $LOG_FILE に保存しました"
cursor agent "テストが失敗しました。以下のエラーを確認してテストが通るようにコードを修正してください:
$TEST_OUTPUT" --model gpt-codex-5.3-high --no-interactive
loop=$((loop + 1))
done
echo "⚠️ 最大ループ数に達しました。停止。$LOG_DIR/ のログを確認してください。"
exit 1「何ループ目で何が問題だったか」を後から確認するのに便利です。
安全上の注意事項
| リスク | 対処法 |
|---|---|
| AI がさらに多くのファイルを壊す | 先に git commit でバックアップ、問題があれば git checkout . で戻す |
| ループが多すぎてクオータを無駄にする | 適切な MAX_LOOPS を設定(5〜15 推奨) |
| AI がテストファイルを変更する | プロンプトに明確に「テストファイルは変更しないで」と書く |
| ループごとに失敗理由が異なる | ログを保存(強化版スクリプト)して後から分析 |
まとめ
- スクリプト構造:テスト実行 → 失敗 → AI に渡す → 繰り返し、通過または上限に達するまで
- 重要なパラメータ:
TEST_CMD(テストコマンド)、MAX_LOOPS(最大ループ数) - プロンプトを明確に:言語を明記、変更するディレクトリを制限、テストファイルに触らない
- 事前に
git commit— 問題が起きても簡単に戻せて安心
Worktree との組み合わせ:異なるブランチで同時にデバッグループを実行。06-cursor-cli-with-worktree を参照。