Cursor CLI 無限除錯迴圈:讓 AI 跑到測試通過才停

5 min read
Cursor CLI 無限除錯迴圈:讓 AI 跑到測試通過才停

測試掛了,改 code,再跑測試,還是掛,再改——這個迴圈大家都做過。為什麼要自己來?

寫一個 shell 腳本,把這個迴圈交給 cursor agent 跑:測試失敗就把錯誤訊息餵給 AI,AI 修完再跑,直到測試全過才停。你去喝咖啡、回訊息,等終端機出現 ✅ 測試通過! 再回來驗收。

核心邏輯

while 測試沒過:
    跑測試 → 收集錯誤訊息
    把錯誤訊息餵給 cursor agent
    cursor agent 修 code
    重新跑測試

就是「跑測試 → 失敗 → 叫 AI 修 → 再跑」的迴圈,直到綠燈。簡單粗暴,但有效。

前置條件確認

  • cursor 已安裝且登入(cursor --version 驗證)
  • 專案有可以在終端機跑的測試指令,例如 npm testpytestgo test ./...cargo test
  • 測試失敗時 exit code 不為 0(幾乎所有測試框架預設都這樣)

最簡版腳本

建立 debug-loop.sh

#!/bin/bash
 
MAX_LOOPS=10        # 最多跑幾圈,防止真的無限跑
TEST_CMD="npm test" # 換成你的測試指令
loop=0
 
while [ $loop -lt $MAX_LOOPS ]; do
  echo ""
  echo "=== 第 $((loop + 1)) 圈 ==="
 
  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
 
  cursor agent "測試失敗了,錯誤如下,請修 code 讓測試通過:
 
$TEST_OUTPUT" --model gpt-codex-5.3-high --no-interactive
 
  loop=$((loop + 1))
done
 
echo "⚠️  已達最大圈數 ($MAX_LOOPS),停止。請手動檢查。"
exit 1

執行:

chmod +x debug-loop.sh
./debug-loop.sh

跑起來之後就可以去做別的事了。若跑滿 MAX_LOOPS 還沒過,代表問題超出 AI 能自己解決的範圍,這時才需要人介入。

依專案調整

換測試指令(第 3 行):

TEST_CMD="pytest -x"            # Python,-x 遇第一個錯就停
TEST_CMD="go test ./..."        # Go
TEST_CMD="cargo test"           # Rust
TEST_CMD="./vendor/bin/phpunit" # PHP

調最大圈數:5 圈保守(問題複雜的話 AI 比較快卡死)、15 圈給點餘裕——設太大只是在浪費 quota,設太小又不夠。10 是個不錯的起點。

讓 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 "測試失敗,錯誤如下,請修 code 讓測試通過:
 
$TEST_OUTPUT" --model gpt-codex-5.3-high --no-interactive
 
  loop=$((loop + 1))
done
 
echo "⚠️  達最大圈數,停止。請看 $LOG_DIR/ 裡的日誌。"
exit 1

每圈的錯誤都存成獨立檔案,方便對比 AI 改了什麼、問題有沒有在演化。

安全注意事項

風險 怎麼防
AI 改爛更多檔案 跑前先 git commit 備份,不對就 git checkout . 還原
跑太多圈浪費 quota 設合理的 MAX_LOOPS,建議 5~15
AI 改到測試檔本身 提示詞明確說「不要改測試檔案」
每圈失敗原因不同 保留日誌(加強版腳本),方便事後追蹤

git commit 這個動作最重要——腳本跑爛了隨時能還原,睡得比較安心。

搭配 Worktree:在不同 branch 各開一個除錯迴圈,可參考 06-cursor-cli-with-worktree
下一步:08-worktree-merge — Cursor 內建 Worktree 進階應用與 Apply 策略。