無限除錯迴圈:讓 Cursor CLI 一直改到測試通過
5 min read
寫一個 shell 腳本,讓 cursor agent 自動修 code、跑測試、測試失敗就再讓 AI 修,直到測試全過才停下來。你不用在旁邊一直按 Y/N,把迴圈交給 AI 跑,人去忙別的——等終端機出現「測試通過」再回來驗收就好。
核心概念
while 測試沒過:
跑測試 → 收集錯誤訊息
把錯誤訊息餵給 cursor agent
cursor agent 修 code
重新跑測試
就是「跑測試 → 失敗 → 叫 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 "測試失敗了,錯誤如下,請修 code 讓測試通過:
$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 "測試失敗,錯誤如下,請修 code 讓測試通過:
$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 用:在不同 branch 各跑一個除錯迴圈,可參考 06-cursor-cli-with-worktree。