
AutoGPT PR 端到端手动测试技能基于 Docker Compose、agent-browser 与 API 证据链的 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 仓库中内置了一个名为pr-test的 Claude Code 技能SKILL.md它定义了一套对 PR/分支进行端到端手动测试的完整规程构建完整平台、通过浏览器与 API 双通道交互、逐步截取截图、校验前后状态证据并将结果以评论和正式 Review 的形式回写到 PR。读完本文你将掌握这套技能的不可协商测试准则、并行 worktree 间的锁协调机制、原生native与 Docker 双模式启动策略、基于 Supabase 认证的测试用户体系以及截图上传与 PR Review 决策的完整闭环可以直接在自己的 AutoGPT 派生项目或类似的多服务平台上复用这套方法。技能定位与五条不可协商准则pr-test技能的元数据声明其触发条件为当用户要求手动测试 PR、端到端测试某个功能、或对运行中的系统跑集成测试时自动触发支持传入 worktree 路径或 PR 号可选--fix标志表示发现问题后自动修复。技能开篇列出五条NON-NEGOTIABLE不可协商要求这是整个测试方法论的骨架每一步都要截图——不是只在测试结束时截一张而是每个重要测试步骤都要拍。每个测试场景至少一张 BEFORE 和一张 AFTER 截图命名规则为{NN}-{action}-{state}.png如01-credits-before.png、02-credits-after.png。某个场景缺截图即判定测试不完整必须回头补拍。截图必须回贴到 PR——所有截图推送到临时分支test-screenshots/pr-{N}并用 GitHub raw URL 内联嵌入 PR 评论。上传失败必须重试仍失败则在报告中列出失败文件要求人工拖拽粘贴到 PR 评论。状态变更必须有 Before/After 双重证据——对每一次状态变更操作API 调用、用户动作记录操作前后的实际值例如credits_before100, credits_after95截图必须反映 UI 上的状态变化且期望值与实际值必须显式对比不允许肉眼看看就行。负向测试用例强制——每个功能至少测一个负向 case余额不足、非法输入、未授权访问验证错误提示对用户友好且准确并确认被拒绝操作后系统状态没有改变。测试报告必须包含完整证据——每个场景的报告条目必须包含Steps做了什么精确到命令/UI 操作、Expected预期、Actual实际、API Evidence前后 API 响应值、Screenshot Evidence带解释的前后截图。目标解析与结果目录Step 0技能的第一步是把用户输入归一化为一组环境变量。若传入的是 PR 号先用gh pr view {N} --json headRefName找到对应分支的 worktree随后确定REPO_ROOT——根仓库目录可用git -C $WORKTREE_PATH worktree list | head -1推导WORKTREE_PATH/PLATFORM_DIR$WORKTREE_PATH/autogpt_platform/BACKEND_DIR/FRONTEND_DIRPR_NUMBER、PR_TITLE标题会被 slug 化如 Add copilot permissions → add-copilot-permissionsRESULTS_DIR——统一放在$REPO_ROOT/test-results/PR-{PR_NUMBER}-{slugified-title}。测试凭据的处理是这里值得注意的设计PR_TEST_USER_EMAIL与PR_TEST_USER_PASSWORD严禁硬编码进 SKILL 文件、PR 评论、截图或任何提交物中。技能给出的优先级是先取环境变量CI 或预配置 shell缺失时才交互式向用户询问且只对缺失的那一个变量发问避免已导出的凭据被空输入覆盖。拿到后用${VAR:?message}语法锁死——仍为空则带明确的变量名报错退出。文档还记录了一个教训曾经默认共享的testtest.com测试账号因凭据泄漏进 SKILL 本身而被禁用2026-05-23此后技能明确要求每次会话都要向用户询问当前有效凭据不得再引入任何默认账号。理解 PR 与编写测试计划Step 1–2测试前先用gh pr view {N} --json body、git log --oneline dev..HEAD、git diff dev --stat回答四个问题这个 PR 为什么存在、实现了什么功能、如何实现、影响了哪些组件backend、frontend、copilot、executor 等进而确定关键的用户可见行为。然后把测试计划写入$RESULTS_DIR/test-plan.md计划模板强制包含四部分Scenarios、API Tests每个端点注明 Before state / After state、UI Tests每个交互注明截图前后各捕获什么、Negative TestsREQUIRED — at least one per feature负向用例必须写明预期错误消息/错误码和验证什么状态没有改变。并行协调测试锁与心跳Step 3.0多个 worktree 共享同一台宿主机——Docker 基础设施postgres、redis、clamav、应用端口3000/8006/…和测试用户都是共享资源。两个 agent 并发跑/pr-test会互相污染状态连接池耗尽、端口绑定静默失败、跨测试断言串味。技能给出的方案是一个基于根 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 与旧锁内容否则打印持锁者信息并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$!释放必须无条件执行甚至exit 1时也要因此用trap kill $HEARTBEAT_PID 2/dev/null; rm -f $LOCK EXIT INT TERM兜底。技能特别强调了一条最容易踩的坑锁保护的是测试执行不是应用生命周期。Step 5/6记录结果、发 PR 评论一完成就要立刻释放锁——即使poetry run app/pnpm dev还在跑、Docker 容器还开着、还在 tail 日志都不影响。应用是否继续运行与锁正交别把两者混为一谈兄弟 worktree 接管时会自己执行清理并释放端口。另外还有一个 append-only 的共享状态日志$REPO_ROOT/.ign.testing.log任何 agent 都可以往里写Im waitingIm done, resources free之类的协调消息。环境搭建Step 3.env 复制、Copilot 认证与冲突清理3a. 从根 worktree 复制 .env.env文件不进 git必须手工从根 worktree 复制到目标 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 才能工作技能给出两条路优先订阅模式Option 1订阅模式首选复用 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并提到环境变量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 系统钥匙串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。容器启动时后端会用这些环境变量自动在容器内生成~/.claude/.credentials.jsonSDK 内置的 CLI 据此认证——不需要claude login也不需要 npm install。注意 OAuth token 约 24 小时过期Copilot 报认证错误时重跑脚本并重启copilot_executor即可。Option 2OpenRouter API key 模式回退。在$BACKEND_DIR/.env中设置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注意保留基础设施容器supabase/db、redis、rabbitmq、clamav。原生模式下还要杀掉宿主机上残留的应用进程并释放端口 3000/8006/8001/8002/8005/8008pkill -9 -f poetry run app、lsof -ti :$port -sTCP:LISTEN | xargs -r kill -9等。3e-native. 原生模式迭代开发的默认选择原生模式让基础设施postgres、supabase、redis、rabbitmq、clamav跑在 Docker 里而 backend 与 frontend 直接在宿主机上跑。收益是省掉每次后端改动后 3–8 分钟的docker compose build循环——代码修改在进程重启秒级后即被拾取。技能给出的选择判据是偏原生模式迭代开发/调试循环PR 只改 Python/TS 源码而不动 Dockerfile、compose 配置或基础设施镜像快速复现失败场景偏 Docker 模式测试Dockerfile/docker-compose.yml/基础镜像本身的改动生产一致性冒烟测试需要精确要发布的那个镜像的 CI 等价运行。对应 docker-compose.yml 的结构原生模式的第一步是cd $PLATFORM_DIR docker compose --profile local up deps --detach --remove-orphans --builddeps是一个带localprofile 的 busybox 占位服务其depends_on声明了 db、redis-0/1/2、redis-init、rabbitmq、clamav、falkordb、migrate——即拉起全部基础设施但跳过所有应用服务的官方组合。compose 文件里还能看到配套的deps_backendprofile 占位服务把全部后端应用服务挂在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在一个父进程里生成所有应用子进程无需单独容器或终端的实现依据。启动顺序有讲究必须先等 8006 端口的后端就绪再启动前端。原因是前端pnpm dev启动时会执行generate-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 可能从其他分支的构建复用了缓存的COPY层。预期耗时普通构建 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经 Kong 网关暴露在 8000 端口注册并换取 token注册是幂等的已存在返回 User already registered若遇到 Database error finding user重启supabase-auth后重试且必须把重试结果重新收进$RESULT保证后续取 token 读的是重试后的状态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 调用统一用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; }状态操控与前后证据真实测试的核心技能对真实状态的要求是整套方法论的灵魂永远不要依赖 mock/注入的浏览器状态绝不用agent-browser eval伪造 UI 状态后端必须是唯一事实来源。为此给出六类手段直接写 Redis 计数器测限流、配额等场景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) # ...执行动作... AFTER$(curl -s -H Authorization: Bearer $TOKEN http://localhost:8006/api/credits | jq .credits) echo Delta: $(( BEFORE - AFTER ))状态变更前后都截图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 → 执行动作 → 记录 AFTER → 打印对比四步脚本要求对每一个状态变更 API 调用使用。执行测试Step 4端口表、API、浏览器与日志端口速查表技能给出的服务端口参照表如下与 docker-compose.platform.yml 中各服务ports声明一致服务端口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、创建 agentPOST /api/graphs、运行 agentPOST /api/graphs/{graph_id}/execute、取执行结果GET /api/graphs/{graph_id}/executions/{exec_id}。每个状态变更调用都套上面四步的验证模式。agent-browser 浏览器测试关键是--session-name pr-test——它让 cookie 在导航间持久化登录只需做一次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 # 关 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技能列出的关键页面/copilotCopilot 聊天、/buildAgent 构建器、/build?flowID{id}指定 agent、/library与/library/agents/{id}库与运行历史、/marketplace。日志检查原生模式所有应用日志经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 验证则优先走浏览器打开/copilot填输入框回车等 20–30 秒出响应再截图。记录结果与报告Step 5–6Step 5 强调的截图节奏每个场景动作前后各一张负向 case 至少一张错误态截图测试失败时既截失败 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 句解释展示的是什么页面/状态、证明了哪个场景、UI 中值得注意的细节然后输出汇总表格#ScenarioResultAPI EvidenceScreenshot Evidence1{name}PASS/FAILBefore: X, After: Y01-before.png, 02-after.png同时把解释存入 Bash 关联数组SCREENSHOT_EXPLANATIONS、表格存入TEST_RESULTS_TABLE变量——Step 7 的上传脚本依赖它们技能特别注明declare -A需要 Bash 4.0macOS 自带 zsh 时建议用 Homebrew 的 bash 5.x或退回普通变量加查表函数。截图上传与 PR 评论Step 7这一步是强制的且有两条铁律绝不在 PR 评论里贴裸目录链接每张图片必须name内联出现绝不在评论里出现本地绝对路径/Users/…、/home/…、C:\…、~/…等在发布前用 grep 拦截改写为仓库相对路径。发布前的 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 全服务端完成——创建 blobbase64 编码每张图重试 3 次、tree、commit、ref全程不碰本地 git 状态因此对 worktree 安全、不干扰 PR 分支REPOSignificant-Gravitas/AutoGPT SCREENSHOTS_BRANCHtest-screenshots/pr-${PR_NUMBER} SCREENSHOTS_DIRtest-screenshots/PR-${PR_NUMBER} # 1) 逐图上传 blob失败计入 FAILED_UPLOADS累积 TREE_JSON # 2) 创建 tree → 解析旧 ref 作为 parent保证截图提交链式而非孤儿根提交→ 创建 commit # 3) 创建/更新 refgh api .../git/refs -f ref... -f sha... || gh api ... -X PATCH -F forcetrue评论正文写入mktemp文件再-F body$COMMENT_FILE提交避免特殊字符的 shell 解释问题。若存在上传失败的图片报告中追加 Failed Screenshot Uploads 小节列出文件并说明需人工拖拽粘贴同时标注Run status: INCOMPLETE。发布后还有闭环验证——回读最后一条评论grep -q !\[不通过就exit 1测试运行在验证通过前不算完成注意用--paginate | jq -r .[-1].body而不是--jq因为--jq是按页应用的。PR 评论的最终形态必须包含1所有场景的 PASS/FAIL 汇总表含 before/after API 证据2每张成功上传截图的内联渲染与逐图解释3失败上传清单与人工处理指引。正式 Review 决策Step 8评论发出后还要必须给出正式 Review 结论。评估维度是一张对照表CoveragePR 描述的每个功能至少一个场景、All scenarios pass、Negative tests每功能至少一个失败路径、Before/after evidence每个状态变更调用都有前后值、Screenshots are meaningful展示真实状态变化而非 loading spinner/空白页、No regressions登录、创建/运行 agent 等核心流程仍可用。决策逻辑简洁而严格全部通过 → APPROVE 任一场景 FAIL 或 PR 功能未覆盖 → REQUEST_CHANGES列出缺口 证据薄弱无 before/after、截图含糊 → REQUEST_CHANGES列出缺失approve / request-changes 分别用 heredoc 生成 Review 正文后调gh pr review $PR_NUMBER --approve / --request-changes --body ...发布。三条规则任何场景失败绝不 approve哪怕疑似 flake先重跑不为本轮已修复的问题 request changes--fix模式下先把所有失败修完Review 反映的是修复后的最终状态。--fix 修复模式与已知问题清单--fix模式把标准提高了一档不只记录问题而是立刻修。每个问题的修复协议是 12 步定位根因 →先写失败测试后端 bug 用pytest.mark.xfail前端/Playwright 用.fixme→ 截坏状态图 → 改码 →只重建受影响的服务docker compose up --build -d rest_server→ 轮询健康 → 重测同一场景 → 截修复后图 → 移除 xfail/fixme 标记并确认通过 → 冒烟验证无回归 →立即 commit push每修一个提交一次不攒批→ 继续下一场景。修复循环最后要在所有场景通过后再做一次全量复测。该模式下 UX 问题错位、标签混乱、缺 loading 态也按 bug 对待。文末的Known issues and workarounds是该技能实战沉淀最厚的部分值得单独摘录问题原因修复注册时 Database error finding userSupabase auth 迁移后 schema 缓存过期docker restart supabase-auth sleep 5后重试订阅模式下 Copilot 报认证错误OAuth token 未设置或已过期重跑refresh_claude_token.sh并重建copilot_executoragent-browser 找不到 chromium分支落后 dev镜像尚未自动安装系统 chromiumwhich chromium检查缺失则apt-get install -y chromium并设AGENT_BROWSER_EXECUTABLE_PATH选择器textX命中多个元素文本匹配是包含式先snapshot拿refeNN再click eNNCopilot 容器里claude: command not found镜像构建时没跑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 后服务不启动迁移没跑完看docker logs autogpt_platform-migrate-1db 不健康则docker restart supabase-dbDocker 用了旧代码的缓存层COPY层跨分支被 BuildKit 复用PR 分支首次构建一律--no-cacheagent-browser open丢失登录态无会话持久化所有命令带--session-name pr-test或用eval window.location.href...在同上下文内导航Database error querying schemadb schema 变了但 auth 缓存未刷docker restart supabase-db sleep 10 docker restart supabase-auth sleep 8用户数据丢了就重新注册总结pr-test技能把手动 E2E 测试从个人习惯变成了一份可执行的工程协议以五条不可协商准则保证证据完整性逐步骤截图、前后状态值、负向用例以根 worktree 锁 心跳 trap 释放解决多 agent 并发竞争以原生模式docker compose --profile local up depspoetry run apppnpm dev换取秒级重启的迭代效率以 Git API 纯服务端提交保证截图证据对 worktree 安全地回贴 PR最后以明确的评估矩阵收敛为 approve / request-changes 的正式 Review。对任何采用多容器架构、worktree 并行开发、且希望把 AI agent 纳入 PR 验证流程的团队这份 SKILL.md 中证据先行、状态即事实来源、锁只护测试不护应用的设计都是可以直接迁移的方法论资产。【免费下载链接】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创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考