鏈的 E2E 測試工作流)
AutoGPT PR 端到端手動測試技能基于 Docker Compose、agent-browser 與 API 證據(jù)鏈的 E2E 測試工作流【免費下載鏈接】AutoGPTAutoGPT is the vision of accessible AI for everyone, to use and to build on. Our mission is to provide the tools, so that you can focus on what matters.項目地址: https://gitcode.com/GitHub_Trending/au/AutoGPTAutoGPT 倉庫中內(nèi)置了一個名為pr-test的 Claude Code 技能SKILL.md它定義了一套對 PR/分支進行端到端手動測試的完整規(guī)程構(gòu)建完整平臺、通過瀏覽器與 API 雙通道交互、逐步截取截圖、校驗前后狀態(tài)證據(jù)并將結(jié)果以評論和正式 Review 的形式回寫到 PR。讀完本文你將掌握這套技能的不可協(xié)商測試準則、并行 worktree 間的鎖協(xié)調(diào)機制、原生native與 Docker 雙模式啟動策略、基于 Supabase 認證的測試用戶體系以及截圖上傳與 PR Review 決策的完整閉環(huán)可以直接在自己的 AutoGPT 派生項目或類似的多服務(wù)平臺上復(fù)用這套方法。技能定位與五條不可協(xié)商準則pr-test技能的元數(shù)據(jù)聲明其觸發(fā)條件為當用戶要求手動測試 PR、端到端測試某個功能、或?qū)\行中的系統(tǒng)跑集成測試時自動觸發(fā)支持傳入 worktree 路徑或 PR 號可選--fix標志表示發(fā)現(xiàn)問題后自動修復(fù)。技能開篇列出五條NON-NEGOTIABLE不可協(xié)商要求這是整個測試方法論的骨架每一步都要截圖——不是只在測試結(jié)束時截一張而是每個重要測試步驟都要拍。每個測試場景至少一張 BEFORE 和一張 AFTER 截圖命名規(guī)則為{NN}-{action}-{state}.png如01-credits-before.png、02-credits-after.png。某個場景缺截圖即判定測試不完整必須回頭補拍。截圖必須回貼到 PR——所有截圖推送到臨時分支test-screenshots/pr-{N}并用 GitHub raw URL 內(nèi)聯(lián)嵌入 PR 評論。上傳失敗必須重試仍失敗則在報告中列出失敗文件要求人工拖拽粘貼到 PR 評論。狀態(tài)變更必須有 Before/After 雙重證據(jù)——對每一次狀態(tài)變更操作API 調(diào)用、用戶動作記錄操作前后的實際值例如credits_before100, credits_after95截圖必須反映 UI 上的狀態(tài)變化且期望值與實際值必須顯式對比不允許肉眼看看就行。負向測試用例強制——每個功能至少測一個負向 case余額不足、非法輸入、未授權(quán)訪問驗證錯誤提示對用戶友好且準確并確認被拒絕操作后系統(tǒng)狀態(tài)沒有改變。測試報告必須包含完整證據(jù)——每個場景的報告條目必須包含Steps做了什么精確到命令/UI 操作、Expected預(yù)期、Actual實際、API Evidence前后 API 響應(yīng)值、Screenshot Evidence帶解釋的前后截圖。目標解析與結(jié)果目錄Step 0技能的第一步是把用戶輸入歸一化為一組環(huán)境變量。若傳入的是 PR 號先用gh pr view {N} --json headRefName找到對應(yīng)分支的 worktree隨后確定REPO_ROOT——根倉庫目錄可用git -C $WORKTREE_PATH worktree list | head -1推導(dǎo)WORKTREE_PATH/PLATFORM_DIR$WORKTREE_PATH/autogpt_platform/BACKEND_DIR/FRONTEND_DIRPR_NUMBER、PR_TITLE標題會被 slug 化如 Add copilot permissions → add-copilot-permissionsRESULTS_DIR——統(tǒng)一放在$REPO_ROOT/test-results/PR-{PR_NUMBER}-{slugified-title}。測試憑據(jù)的處理是這里值得注意的設(shè)計PR_TEST_USER_EMAIL與PR_TEST_USER_PASSWORD嚴禁硬編碼進 SKILL 文件、PR 評論、截圖或任何提交物中。技能給出的優(yōu)先級是先取環(huán)境變量CI 或預(yù)配置 shell缺失時才交互式向用戶詢問且只對缺失的那一個變量發(fā)問避免已導(dǎo)出的憑據(jù)被空輸入覆蓋。拿到后用${VAR:?message}語法鎖死——仍為空則帶明確的變量名報錯退出。文檔還記錄了一個教訓(xùn)曾經(jīng)默認共享的testtest.com測試賬號因憑據(jù)泄漏進 SKILL 本身而被禁用2026-05-23此后技能明確要求每次會話都要向用戶詢問當前有效憑據(jù)不得再引入任何默認賬號。理解 PR 與編寫測試計劃Step 1–2測試前先用gh pr view {N} --json body、git log --oneline dev..HEAD、git diff dev --stat回答四個問題這個 PR 為什么存在、實現(xiàn)了什么功能、如何實現(xiàn)、影響了哪些組件backend、frontend、copilot、executor 等進而確定關(guān)鍵的用戶可見行為。然后把測試計劃寫入$RESULTS_DIR/test-plan.md計劃模板強制包含四部分Scenarios、API Tests每個端點注明 Before state / After state、UI Tests每個交互注明截圖前后各捕獲什么、Negative TestsREQUIRED — at least one per feature負向用例必須寫明預(yù)期錯誤消息/錯誤碼和驗證什么狀態(tài)沒有改變。并行協(xié)調(diào)測試鎖與心跳Step 3.0多個 worktree 共享同一臺宿主機——Docker 基礎(chǔ)設(shè)施postgres、redis、clamav、應(yīng)用端口3000/8006/…和測試用戶都是共享資源。兩個 agent 并發(fā)跑/pr-test會互相污染狀態(tài)連接池耗盡、端口綁定靜默失敗、跨測試斷言串味。技能給出的方案是一個基于根 worktree 的鎖文件鎖路徑固定為$REPO_ROOT/.ign.testing.lock放根 worktree 保證所有兄弟 worktree 都能看見鎖體是若干keyvalue行holder、pid、started、heartbeat每約 2 分鐘更新、worktree、branch、intent一行意圖說明加大致時長。搶占邏輯若鎖已存在解析heartbeat時間戳兼容 BSD/macOS 的date -j與 GNU 的date -d心跳年齡超過 5 分鐘視為陳舊鎖并回收打印 WARN 與舊鎖內(nèi)容否則打印持鎖者信息并exit 1等待。心跳必須在搶鎖后立即作為后臺進程運行——否則崩潰的 agent 會永遠占著鎖(while true; do sleep 120 [ -f $LOCK ] || exit 0 # lock released → exit heartbeat perl -i -pe s/^heartbeat.*/heartbeat$(date -u %Y-%m-%dT%H:%MZ)/ $LOCK done) HEARTBEAT_PID$!釋放必須無條件執(zhí)行甚至exit 1時也要因此用trap kill $HEARTBEAT_PID 2/dev/null; rm -f $LOCK EXIT INT TERM兜底。技能特別強調(diào)了一條最容易踩的坑鎖保護的是測試執(zhí)行不是應(yīng)用生命周期。Step 5/6記錄結(jié)果、發(fā) PR 評論一完成就要立刻釋放鎖——即使poetry run app/pnpm dev還在跑、Docker 容器還開著、還在 tail 日志都不影響。應(yīng)用是否繼續(xù)運行與鎖正交別把兩者混為一談兄弟 worktree 接管時會自己執(zhí)行清理并釋放端口。另外還有一個 append-only 的共享狀態(tài)日志$REPO_ROOT/.ign.testing.log任何 agent 都可以往里寫Im waitingIm done, resources free之類的協(xié)調(diào)消息。環(huán)境搭建Step 3.env 復(fù)制、Copilot 認證與沖突清理3a. 從根 worktree 復(fù)制 .env.env文件不進 git必須手工從根 worktree 復(fù)制到目標 worktreecp $REPO_ROOT/autogpt_platform/.env $PLATFORM_DIR/.env cp $REPO_ROOT/autogpt_platform/backend/.env $BACKEND_DIR/.env cp $REPO_ROOT/autogpt_platform/frontend/.env $FRONTEND_DIR/.env3b. Copilot 認證訂閱模式與 OpenRouter 回退Copilot 需要一個 LLM API 才能工作技能給出兩條路優(yōu)先訂閱模式Option 1訂閱模式首選復(fù)用 Claude Max/Pro 訂閱。claude_agent_sdkPython 包自帶 Claude CLI 二進制無需通過 npm 安裝anthropic-ai/claude-code。這一點可以從 后端 pyproject.toml 得到印證依賴中聲明了claude-agent-sdk ^0.1.64其注釋直接寫明 bundled CLI 2.1.116并提到環(huán)境變量CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS1用于剝離有問題的 context-management beta。運行輔助腳本從宿主機提取 token 并自動更新backend/.envbash $BACKEND_DIR/scripts/refresh_claude_token.sh --env-file $BACKEND_DIR/.env該腳本從三個位置讀取 OAuth tokenmacOS 系統(tǒng)鑰匙串Claude Code-credentials、Linux/WSL 的~/.claude/.credentials.json、Windows 的%APPDATA%/claude/.credentials.json然后寫入CLAUDE_CODE_OAUTH_TOKEN、CLAUDE_CODE_REFRESH_TOKEN與CHAT_USE_CLAUDE_CODE_SUBSCRIPTIONtrue。容器啟動時后端會用這些環(huán)境變量自動在容器內(nèi)生成~/.claude/.credentials.jsonSDK 內(nèi)置的 CLI 據(jù)此認證——不需要claude login也不需要 npm install。注意 OAuth token 約 24 小時過期Copilot 報認證錯誤時重跑腳本并重啟copilot_executor即可。Option 2OpenRouter API key 模式回退。在$BACKEND_DIR/.env中設(shè)置CHAT_USE_CLAUDE_CODE_SUBSCRIPTIONfalse CHAT_API_KEY同一 .env 中 OPEN_ROUTER_API_KEY 的值 CHAT_BASE_URLhttps://openrouter.ai/api/v1 CHAT_USE_CLAUDE_AGENT_SDKtrue技能給出了用grep/perl -i -pe原地更新或追加這些鍵的完整 shell 片段并在OPEN_ROUTER_API_KEY缺失時直接報錯退出。3c. 停掉沖突容器docker ps --format {{.Names}} | grep -E rest_server|executor|copilot|websocket|database_manager|scheduler|notification|frontend|migrate | while read name; do docker stop $name 2/dev/null done注意保留基礎(chǔ)設(shè)施容器supabase/db、redis、rabbitmq、clamav。原生模式下還要殺掉宿主機上殘留的應(yīng)用進程并釋放端口 3000/8006/8001/8002/8005/8008pkill -9 -f poetry run app、lsof -ti :$port -sTCP:LISTEN | xargs -r kill -9等。3e-native. 原生模式迭代開發(fā)的默認選擇原生模式讓基礎(chǔ)設(shè)施postgres、supabase、redis、rabbitmq、clamav跑在 Docker 里而 backend 與 frontend 直接在宿主機上跑。收益是省掉每次后端改動后 3–8 分鐘的docker compose build循環(huán)——代碼修改在進程重啟秒級后即被拾取。技能給出的選擇判據(jù)是偏原生模式迭代開發(fā)/調(diào)試循環(huán)PR 只改 Python/TS 源碼而不動 Dockerfile、compose 配置或基礎(chǔ)設(shè)施鏡像快速復(fù)現(xiàn)失敗場景偏 Docker 模式測試Dockerfile/docker-compose.yml/基礎(chǔ)鏡像本身的改動生產(chǎn)一致性冒煙測試需要精確要發(fā)布的那個鏡像的 CI 等價運行。對應(yīng) docker-compose.yml 的結(jié)構(gòu)原生模式的第一步是cd $PLATFORM_DIR docker compose --profile local up deps --detach --remove-orphans --builddeps是一個帶localprofile 的 busybox 占位服務(wù)其depends_on聲明了 db、redis-0/1/2、redis-init、rabbitmq、clamav、falkordb、migrate——即拉起全部基礎(chǔ)設(shè)施但跳過所有應(yīng)用服務(wù)的官方組合。compose 文件里還能看到配套的deps_backendprofile 占位服務(wù)把全部后端應(yīng)用服務(wù)掛在deps之后。第二步在宿主機啟動后端cd $BACKEND_DIR (poetry run app 21 | tee .ign.application.logs) 這與源碼完全吻合pyproject.toml 中定義了app backend.app:main入口而 backend/app.py 的main()通過run_processes(...)把DatabaseManager、Scheduler、BatchExecutor、NotificationManager、PlatformLinkingManager、WebsocketServer、AgentServer、ExecutionManager、CoPilotChatBridge、CoPilotExecutor全部作為子進程拉起來前 N-1 個后臺運行、最后一個前臺運行并在finally中逆序stop()所有進程——這就是技能所說poetry run app在一個父進程里生成所有應(yīng)用子進程無需單獨容器或終端的實現(xiàn)依據(jù)。啟動順序有講究必須先等 8006 端口的后端就緒再啟動前端。原因是前端pnpm dev啟動時會執(zhí)行g(shù)enerate-api-queries腳本去拉取后端的/openapi.json腳本本體見 generate-api-queries.ts后端沒起來前端會直接失敗。輪詢等待方式for i in $(seq 1 60); do if [ $(curl -s -o /dev/null -w %{http_code} http://localhost:8006/docs 2/dev/null) 200 ]; then echo Backend ready; break fi sleep 2 done隨后cd $FRONTEND_DIR (pnpm dev 21 | tee .ign.frontend.logs) 再輪詢 3000 端口。兩者就緒后跳過 Docker 模式的 3e/3f直接做 3g/3h測試用戶。3e/3f. Docker 模式回退與就緒輪詢cd $PLATFORM_DIR docker compose build --no-cache 21 | tail -20 if [ ${PIPESTATUS[0]} -ne 0 ]; then echo ERROR: Docker build failed; exit 1; fi cd $PLATFORM_DIR docker compose up -d 21 | tail -20若容器看起來跑的是舊代碼PR 的改動沒生效用--no-cache強制全量重建——BuildKit 可能從其他分支的構(gòu)建復(fù)用了緩存的COPY層。預(yù)期耗時普通構(gòu)建 3–8 分鐘--no-cache5–10 分鐘。就緒檢查是同時輪詢兩個端點for i in $(seq 1 60); do BACKEND$(curl -s -o /dev/null -w %{http_code} http://localhost:8006/docs 2/dev/null) FRONTEND$(curl -s -o /dev/null -w %{http_code} http://localhost:3000 2/dev/null) [ $BACKEND 200 ] [ $FRONTEND 200 ] { echo Services ready; break; } sleep 5 done3h/3i. 測試用戶與 onboarding 繞過測試用戶通過 Supabase Auth經(jīng) Kong 網(wǎng)關(guān)暴露在 8000 端口注冊并換取 token注冊是冪等的已存在返回 User already registered若遇到 Database error finding user重啟supabase-auth后重試且必須把重試結(jié)果重新收進$RESULT保證后續(xù)取 token 讀的是重試后的狀態(tài)ANON_KEY$(grep NEXT_PUBLIC_SUPABASE_ANON_KEY $FRONTEND_DIR/.env | sed s/.*// | tr -d [:space:]) SIGNUP_PAYLOAD$(jq -nc --arg e $PR_TEST_USER_EMAIL --arg p $PR_TEST_USER_PASSWORD {email:$e,password:$p}) RESULT$(curl -s -X POST http://localhost:8000/auth/v1/signup \ -H apikey: $ANON_KEY -H Content-Type: application/json -d $SIGNUP_PAYLOAD) TOKEN$(curl -s -X POST http://localhost:8000/auth/v1/token?grant_typepassword \ -H apikey: $ANON_KEY -H Content-Type: application/json \ -d $SIGNUP_PAYLOAD | jq -r .access_token // )之后所有 API 調(diào)用統(tǒng)一用curl -H Authorization: Bearer $TOKEN http://localhost:8006/api/...。onboarding 繞過同樣值得注意前端在completedSteps中不含ONBOARDING_COMPLETE時會重定向到/onboarding因此要通過后端 API 主動把它標記完成并驗證生效否則所有瀏覽器測試都會落到 onboarding 頁而不是目標功能curl -s -X POST http://localhost:8006/api/onboarding/step?stepONBOARDING_COMPLETE -H Authorization: Bearer $TOKEN ONBOARDING_STATUS$(curl -s http://localhost:8006/api/onboarding/completed -H Authorization: Bearer $TOKEN | jq -r .is_completed) [ $ONBOARDING_STATUS true ] || { echo ERROR: onboarding bypass failed; exit 1; }狀態(tài)操控與前后證據(jù)真實測試的核心技能對真實狀態(tài)的要求是整套方法論的靈魂永遠不要依賴 mock/注入的瀏覽器狀態(tài)絕不用agent-browser eval偽造 UI 狀態(tài)后端必須是唯一事實來源。為此給出六類手段直接寫 Redis 計數(shù)器測限流、配額等場景REDIS_CONTAINER$(docker ps --format {{.Names}} | grep redis | head -1) docker exec $REDIS_CONTAINER redis-cli SET rate_limit:user:$PR_TEST_USER_EMAIL 99 EX 3600 docker exec $REDIS_CONTAINER redis-cli GET rate_limit:user:$PR_TEST_USER_EMAILAPI 前后值對比以 credits 為例BEFORE$(curl -s -H Authorization: Bearer $TOKEN http://localhost:8006/api/credits | jq .credits) # ...執(zhí)行動作... AFTER$(curl -s -H Authorization: Bearer $TOKEN http://localhost:8006/api/credits | jq .credits) echo Delta: $(( BEFORE - AFTER ))狀態(tài)變更前后都截圖UI 必須反映后端變化必要時直接查庫docker exec supabase-db psql -U supabase_admin -d postgres -c SELECT credits FROM user_credits WHERE user_id ...;每次 API 測試后驗證持久化對比 API 返回與 DB 查詢值[ $API_CREDITS $DB_CREDITS ] echo CONSISTENT || echo MISMATCH: ...。通用模式封裝為記錄 BEFORE → 執(zhí)行動作 → 記錄 AFTER → 打印對比四步腳本要求對每一個狀態(tài)變更 API 調(diào)用使用。執(zhí)行測試Step 4端口表、API、瀏覽器與日志端口速查表技能給出的服務(wù)端口參照表如下與 docker-compose.platform.yml 中各服務(wù)ports聲明一致服務(wù)端口URLFrontend3000http://localhost:3000Backend REST8006http://localhost:8006Supabase Auth (via Kong)8000http://localhost:8000Executor8002http://localhost:8002Copilot Executor8008http://localhost:8008WebSocket8001http://localhost:8001Database Manager8005http://localhost:8005Redis6379localhost:6379RabbitMQ5672localhost:5672API 測試典型場景示例列 agentsGET /api/graphs、創(chuàng)建 agentPOST /api/graphs、運行 agentPOST /api/graphs/{graph_id}/execute、取執(zhí)行結(jié)果GET /api/graphs/{graph_id}/executions/{exec_id}。每個狀態(tài)變更調(diào)用都套上面四步的驗證模式。agent-browser 瀏覽器測試關(guān)鍵是--session-name pr-test——它讓 cookie 在導(dǎo)航間持久化登錄只需做一次agent-browser close 2/dev/null || true agent-browser --session-name pr-test open http://localhost:3000/login --timeout 15000 agent-browser --session-name pr-test snapshot | grep textbox\|button # 拿 ref agent-browser --session-name pr-test fill {email_ref} $PR_TEST_USER_EMAIL agent-browser --session-name pr-test fill {password_ref} $PR_TEST_USER_PASSWORD agent-browser --session-name pr-test click {login_button_ref} agent-browser --session-name pr-test click textAccept All 2/dev/null || true # 關(guān) cookie banner agent-browser --session-name pr-test open http://localhost:3000/copilot --timeout 10000 agent-browser --session-name pr-test screenshot $RESULTS_DIR/01-page.png技能列出的關(guān)鍵頁面/copilotCopilot 聊天、/buildAgent 構(gòu)建器、/build?flowID{id}指定 agent、/library與/library/agents/{id}庫與運行歷史、/marketplace。日志檢查原生模式所有應(yīng)用日志經(jīng)tee匯入$BACKEND_DIR/.ign.application.logs因為rest_server、executor、copilot_executor、websocket、scheduler、notification_server、database_manager都是poetry run app的單父進程子進程輸出交錯在同一文件和$FRONTEND_DIR/.ign.frontend.logs用grep -iE error|exception|traceback過濾。Docker 模式docker logs autogpt_platform-rest_server-1 / -executor-1 / -copilot_executor-1 / -frontend-1 21 | tail -30。Copilot SSE 流式測試SESSION_ID$(curl -s -X POST http://localhost:8006/api/chat/sessions \ -H Authorization: Bearer $TOKEN -H Content-Type: application/json -d {} \ | jq -r .id // .session_id // ) curl -N -X POST http://localhost:8006/api/chat/sessions/$SESSION_ID/stream \ -H Authorization: Bearer $TOKEN -H Content-Type: application/json \ -d {message: Hello, what can you help me with?} --max-time 60 2/dev/null | head -50UI 驗證則優(yōu)先走瀏覽器打開/copilot填輸入框回車等 20–30 秒出響應(yīng)再截圖。記錄結(jié)果與報告Step 5–6Step 5 強調(diào)的截圖節(jié)奏每個場景動作前后各一張負向 case 至少一張錯誤態(tài)截圖測試失敗時既截失敗 UI 也截錯誤日志。命名示例01-login-page-before.png、03-credits-page-before.png、04-credits-purchase-after.png、05-negative-insufficient-credits.png。Step 6 要求把每張截圖用 Read 工具展示給用戶并附 1–2 句解釋展示的是什么頁面/狀態(tài)、證明了哪個場景、UI 中值得注意的細節(jié)然后輸出匯總表格#ScenarioResultAPI EvidenceScreenshot Evidence1{name}PASS/FAILBefore: X, After: Y01-before.png, 02-after.png同時把解釋存入 Bash 關(guān)聯(lián)數(shù)組SCREENSHOT_EXPLANATIONS、表格存入TEST_RESULTS_TABLE變量——Step 7 的上傳腳本依賴它們技能特別注明declare -A需要 Bash 4.0macOS 自帶 zsh 時建議用 Homebrew 的 bash 5.x或退回普通變量加查表函數(shù)。截圖上傳與 PR 評論Step 7這一步是強制的且有兩條鐵律絕不在 PR 評論里貼裸目錄鏈接每張圖片必須name內(nèi)聯(lián)出現(xiàn)絕不在評論里出現(xiàn)本地絕對路徑/Users/…、/home/…、C:\…、~/…等在發(fā)布前用 grep 攔截改寫為倉庫相對路徑。發(fā)布前的 sanity checkif grep -nE (^|[^A-Za-z])(/Users/|/home/|/tmp/|/private/|C:\\|~/)[A-Za-z0-9] $COMMENT_FILE ; then echo ABORT: local filesystem paths detected in PR comment body.; exit 1 fi上傳走 GitHubGit API 全服務(wù)端完成——創(chuàng)建 blobbase64 編碼每張圖重試 3 次、tree、commit、ref全程不碰本地 git 狀態(tài)因此對 worktree 安全、不干擾 PR 分支REPOSignificant-Gravitas/AutoGPT SCREENSHOTS_BRANCHtest-screenshots/pr-${PR_NUMBER} SCREENSHOTS_DIRtest-screenshots/PR-${PR_NUMBER} # 1) 逐圖上傳 blob失敗計入 FAILED_UPLOADS累積 TREE_JSON # 2) 創(chuàng)建 tree → 解析舊 ref 作為 parent保證截圖提交鏈式而非孤兒根提交→ 創(chuàng)建 commit # 3) 創(chuàng)建/更新 refgh api .../git/refs -f ref... -f sha... || gh api ... -X PATCH -F forcetrue評論正文寫入mktemp文件再-F body$COMMENT_FILE提交避免特殊字符的 shell 解釋問題。若存在上傳失敗的圖片報告中追加 Failed Screenshot Uploads 小節(jié)列出文件并說明需人工拖拽粘貼同時標注Run status: INCOMPLETE。發(fā)布后還有閉環(huán)驗證——回讀最后一條評論grep -q !\[不通過就exit 1測試運行在驗證通過前不算完成注意用--paginate | jq -r .[-1].body而不是--jq因為--jq是按頁應(yīng)用的。PR 評論的最終形態(tài)必須包含1所有場景的 PASS/FAIL 匯總表含 before/after API 證據(jù)2每張成功上傳截圖的內(nèi)聯(lián)渲染與逐圖解釋3失敗上傳清單與人工處理指引。正式 Review 決策Step 8評論發(fā)出后還要必須給出正式 Review 結(jié)論。評估維度是一張對照表CoveragePR 描述的每個功能至少一個場景、All scenarios pass、Negative tests每功能至少一個失敗路徑、Before/after evidence每個狀態(tài)變更調(diào)用都有前后值、Screenshots are meaningful展示真實狀態(tài)變化而非 loading spinner/空白頁、No regressions登錄、創(chuàng)建/運行 agent 等核心流程仍可用。決策邏輯簡潔而嚴格全部通過 → APPROVE 任一場景 FAIL 或 PR 功能未覆蓋 → REQUEST_CHANGES列出缺口 證據(jù)薄弱無 before/after、截圖含糊 → REQUEST_CHANGES列出缺失approve / request-changes 分別用 heredoc 生成 Review 正文后調(diào)gh pr review $PR_NUMBER --approve / --request-changes --body ...發(fā)布。三條規(guī)則任何場景失敗絕不 approve哪怕疑似 flake先重跑不為本輪已修復(fù)的問題 request changes--fix模式下先把所有失敗修完Review 反映的是修復(fù)后的最終狀態(tài)。--fix 修復(fù)模式與已知問題清單--fix模式把標準提高了一檔不只記錄問題而是立刻修。每個問題的修復(fù)協(xié)議是 12 步定位根因 →先寫失敗測試后端 bug 用pytest.mark.xfail前端/Playwright 用.fixme→ 截壞狀態(tài)圖 → 改碼 →只重建受影響的服務(wù)docker compose up --build -d rest_server→ 輪詢健康 → 重測同一場景 → 截修復(fù)后圖 → 移除 xfail/fixme 標記并確認通過 → 冒煙驗證無回歸 →立即 commit push每修一個提交一次不攢批→ 繼續(xù)下一場景。修復(fù)循環(huán)最后要在所有場景通過后再做一次全量復(fù)測。該模式下 UX 問題錯位、標簽混亂、缺 loading 態(tài)也按 bug 對待。文末的Known issues and workarounds是該技能實戰(zhàn)沉淀最厚的部分值得單獨摘錄問題原因修復(fù)注冊時 Database error finding userSupabase auth 遷移后 schema 緩存過期docker restart supabase-auth sleep 5后重試訂閱模式下 Copilot 報認證錯誤OAuth token 未設(shè)置或已過期重跑refresh_claude_token.sh并重建copilot_executoragent-browser 找不到 chromium分支落后 dev鏡像尚未自動安裝系統(tǒng) chromiumwhich chromium檢查缺失則apt-get install -y chromium并設(shè)AGENT_BROWSER_EXECUTABLE_PATH選擇器textX命中多個元素文本匹配是包含式先snapshot拿refeNN再click eNNCopilot 容器里claude: command not found鏡像構(gòu)建時沒跑poetry installSDK CLI 在 Poetry 依賴里不是 npm 包docker compose build --no-cache copilot_executor docker compose up -d copilot_executor不要npm install -g anthropic-ai/claude-code那會裝出 SDK 根本不會用的第二份 CLI截圖掛起/超時exit 124CDP 連接卡死或 Chromium 僵尸進程macOS 常見pkill -9 -f agent-browser\|chromium\|Chrome for Testing后換新--session-name必要時改用evalsnapshot驗證 DOMcompose up 后服務(wù)不啟動遷移沒跑完看docker logs autogpt_platform-migrate-1db 不健康則docker restart supabase-dbDocker 用了舊代碼的緩存層COPY層跨分支被 BuildKit 復(fù)用PR 分支首次構(gòu)建一律--no-cacheagent-browser open丟失登錄態(tài)無會話持久化所有命令帶--session-name pr-test或用eval window.location.href...在同上下文內(nèi)導(dǎo)航Database error querying schemadb schema 變了但 auth 緩存未刷docker restart supabase-db sleep 10 docker restart supabase-auth sleep 8用戶數(shù)據(jù)丟了就重新注冊總結(jié)pr-test技能把手動 E2E 測試從個人習慣變成了一份可執(zhí)行的工程協(xié)議以五條不可協(xié)商準則保證證據(jù)完整性逐步驟截圖、前后狀態(tài)值、負向用例以根 worktree 鎖 心跳 trap 釋放解決多 agent 并發(fā)競爭以原生模式docker compose --profile local up depspoetry run apppnpm dev換取秒級重啟的迭代效率以 Git API 純服務(wù)端提交保證截圖證據(jù)對 worktree 安全地回貼 PR最后以明確的評估矩陣收斂為 approve / request-changes 的正式 Review。對任何采用多容器架構(gòu)、worktree 并行開發(fā)、且希望把 AI agent 納入 PR 驗證流程的團隊這份 SKILL.md 中證據(jù)先行、狀態(tài)即事實來源、鎖只護測試不護應(yīng)用的設(shè)計都是可以直接遷移的方法論資產(chǎn)。【免費下載鏈接】AutoGPTAutoGPT is the vision of accessible AI for everyone, to use and to build on. Our mission is to provide the tools, so that you can focus on what matters.項目地址: https://gitcode.com/GitHub_Trending/au/AutoGPT創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考