무한 디버그 루프: Cursor CLI가 테스트 통과할 때까지 수정

7 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 참조.