無限デバッグループ:Cursor CLI がテスト通過まで修正し続ける

6 min read

cursor agent が自動でコードを修正し、テストを実行し、失敗すれば再び AI に修正させる — 全テストが通るまで繰り返すシェルスクリプトを書きます。Y/N を押し続ける必要はありません。ループを AI に任せて別の作業をしましょう — ターミナルに「テスト通過」が表示されたら戻って確認するだけ。

コアコンセプト

while テストが通らない:
    テスト実行 → エラーメッセージを収集
    エラーメッセージを cursor agent に渡す
    cursor agent がコードを修正
    テストを再実行

「テスト実行 → 失敗 → AI に修正させる → 繰り返し」のループ。シンプルで直接的ですが、効果的。

Step 1:前提条件の確認

  • cursor がインストール・ログイン済み(cursor --version で確認)
  • プロジェクトにターミナルで実行できるテストコマンドがある:
    • npm test
    • pytest
    • go 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 1

Step 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 がテストファイルを変更する プロンプトに明確に「テストファイルは変更しないで」と書く
ループごとに失敗理由が異なる ログを保存(強化版スクリプト)して後から分析

まとめ

  1. スクリプト構造:テスト実行 → 失敗 → AI に渡す → 繰り返し、通過または上限に達するまで
  2. 重要なパラメータTEST_CMD(テストコマンド)、MAX_LOOPS(最大ループ数)
  3. プロンプトを明確に:言語を明記、変更するディレクトリを制限、テストファイルに触らない
  4. 事前に git commit — 問題が起きても簡単に戻せて安心

Worktree との組み合わせ:異なるブランチで同時にデバッグループを実行。06-cursor-cli-with-worktree を参照。