무한 디버그 루프: Cursor CLI가 테스트 통과할 때까지 수정
7 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 참조.