--- name: full-test description: 全量回归入口——按需跑一次完整测试闸(build + lint + 后端单测/集成 + 前端 vitest + **全量 e2e**),出证据报告并提交。coding-start 的增量模式只跑本轮改动关联的 e2e(省时),跨功能连带回归靠本命令兜底:改完一批需求、合并前、发布前、或怀疑历史功能被打破时手动运行。只跑测试、不改任何源码;红了只报告不修复。 user-invocable: true allowed-tools: Read Write Edit Glob Grep Bash(node *) Bash(git *) Bash(ls *) Bash(cat *) Bash(sleep *) Bash(pnpm *) Bash(npm *) Bash(npx *) --- **所有输出必须使用中文。** # full-test — 全量回归闸(按需触发) `/erp-workflow:coding-start` 缺省跑 **affected 增量模式**:test-gate 的 e2e 段只覆盖本轮改动关联的用例, 其余 e2e 不跑(`testScope: "affected"`,见 `workflows/coding.mjs` 顶部 `TEST_SCOPE`)。 这是为省时刻意留的缺口——**跨功能连带回归由本命令兜底**。 **什么时候该跑:** 一批需求做完准备合并 / 发布前 / 改过共享组件·router·全局状态·API 契约·DB 迁移 / 怀疑某个没动过的功能被打破了 / 距上次全量回归已过去若干轮增量。 **本命令不做的事:** 不改任何源码、不修红灯、不打 tag、不合并分支、不动 `docs/08`。红了只出报告。 ## 步骤 0:打印横幅 ``` ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ [full-test] 全量回归闸 跑 scripts/test.mjs 完整链: setup-test-db(复制源库→一次性副本) → build(前后端)→ lint(前后端) → 单测 + 集成(后端 + 前端 vitest) → e2e(**全量** playwright,不设 ERP_E2E_SCOPE) → 绿则晋升本轮新迁移到源库 → 无论红绿删副本 只跑测试、不改源码。预计耗时较长(含冷起全栈),跑完出证据报告。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ``` ## 步骤 1:前置校验(任一不满足即停下,不启动测试) 1. **取 projectRoot**:`Bash(git rev-parse --show-toplevel)`,stdout 记为 `projectRoot`(绝对路径)。失败 → 缺口「当前目录不在 git 仓库内」。 2. **闸门脚本存在**:`Glob` `scripts/test.mjs`。不存在 → 缺口「项目缺 scripts/test.mjs,先跑 /erp-workflow:plan-start 生成骨架」。 3. **工作树干净**:`Bash(git status --porcelain)` 无输出。有输出 → 缺口「工作树不干净:<摘要>」。 > 为什么是硬门:`test.mjs` 绿后会把副本上验证过的新迁移 **晋升到源库**(`promote-to-source.mjs`)。 > 带着未提交改动跑,等于让一份没进版本库的状态去改源库 schema,事后无法复现是哪次改动导致的。 4. **不在跑其它闸门**:`Glob` `.tmp/behavior-gate/` / `.tmp/seed-gen/` 下是否有本次之外的活动痕迹,并确认没有正在运行的 `coding.mjs`。有 → 提示用户「检测到可能正在运行的编码流程,全量回归会冷起同端口的栈、互相击杀,请等它结束再跑」并停下。 任一缺口 → 输出拦截横幅(逐条列缺口 + 处理位置),停下,末尾附 `[ERP-HALT]`。 ## 步骤 2:确认 e2e 范围开关不会误伤 `Grep` `frontend/playwright.config.*` 是否含 `ERP_E2E_SCOPE`: - **含** → 本命令**必须显式清空**该变量再跑(见步骤 3),保证跑的是全量而不是继承了外壳里的残留值。 - **不含** → 说明该项目的 config 还没接范围开关(存量项目),此时 e2e 本来就恒为全量,直接跑即可;在报告里注记一句即可,不必修 config(补齐由 coding.mjs 的 fe-skeleton stage 负责)。 ## 步骤 3:跑闸门(后台子进程 + 轮询,绝不在主推理流里同步跑) `scripts/test.mjs` 动辄几十分钟,**必须**派**隔离后台子进程**跑,主会话只轮询、只读回结构化摘要: 1. 建日志目录 `.tmp/full-test/`(`Bash(node -e "...")` 用 `fs.mkdirSync(..., {recursive:true})`,跨平台)。 2. 用 `Bash` 的 `run_in_background` 起 detached 子进程,**显式清空** `ERP_E2E_SCOPE`,输出重定向到 `.tmp/full-test/run.log`,退出码写 `.tmp/full-test/exit`: ``` ERP_E2E_SCOPE= node scripts/test.mjs > .tmp/full-test/run.log 2>&1; echo $? > .tmp/full-test/exit ``` > Windows/PowerShell 环境下改用 `node -e` 起一个 `spawn` 包装(`env: {...process.env, ERP_E2E_SCOPE: ''}`), > 效果等价——关键是**子进程 env 里 `ERP_E2E_SCOPE` 为空**,且日志落盘、退出码落盘。 3. **在同一回合内轮询到终态**:反复 `Bash` 调用(每轮 `sleep 60`~`120` 后读 `.tmp/full-test/exit` 是否存在 + 读 `run.log` 尾部若干行),多少轮都行。 **绝不**用 Monitor / ScheduleWakeup / 「装个监听器然后结束回合等通知」——结束回合就等于宣告完成。 4. 每轮向用户播报一行当前进度(从 `run.log` 里 `[test.mjs] N/5 <阶段>` 行取),让长跑可见。 5. 拿到 exit 码后,从 `run.log` **只**提取结构化摘要(**不要**把全文灌进上下文): - 各阶段(build / lint / 单测 / e2e)的通过与否; - 失败用例名 + 断言摘要(≤30 行); - e2e 实跑条数(playwright 的 `N passed` 行)——**0 条即异常**,说明范围开关被误设,按红处理。 ## 步骤 4:证据报告 + 提交 写 `docs/superpowers/module-reports/full-regression-.md`(同日多次跑加 `-r` 后缀,**绝不覆盖**前一次): ```markdown # 全量回归报告 [-r] - 触发:/erp-workflow:full-test(人工按需) - 分支 / HEAD: @ <短哈希> - 命令:ERP_E2E_SCOPE=(空,全量) node scripts/test.mjs - 结论:GREEN / RED - e2e 实跑条数:(0 条 = 范围开关误设,按 RED 处理) - 各阶段:build / lint / 后端单测集成 / 前端 vitest / e2e - 迁移晋升:<已晋升 V... / 无新迁移 / 未晋升(红)> ## 失败摘要(RED 时必填) <失败用例 + 断言摘要,≤30 行> ## 距上次全量回归的增量 ..HEAD 摘要;首次跑写「首次」> ``` `Bash(git add <报告> && git commit -m "docs(full-test): 全量回归报告 <日期> ")`。 commit 失败 → 报告已落盘即可,把 stderr 摘要告诉用户,不 halt。 ## 步骤 5:输出结论横幅 绿: ``` ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ [full-test] ✅ 全量回归 GREEN e2e 实跑: 条(全量) 报告:docs/superpowers/module-reports/full-regression-<日期>.md 迁移晋升:<已晋升 V... / 无新迁移> [ERP-HALT] 全量回归通过。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ``` 红: ``` ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ [full-test] ⛔ 全量回归 RED 失败阶段: 失败用例:<逐条列出,不截断关键断言> 报告:docs/superpowers/module-reports/full-regression-<日期>.md 这些失败**不在**最近几轮增量的 e2e 覆盖范围内——属于跨功能连带回归。 下一步:把失败功能作为变更单元跑 /erp-workflow:add-req 重新走编码, 或直接修复后再跑一次 /erp-workflow:full-test。 [ERP-HALT] 已停下,本命令不修复。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ``` 本 skill 到此结束,**不调用任何下游 skill**、**不自动修复**。 ## 参考 - `scripts/test.mjs`(项目内闸门脚本:setup→build→lint→test→e2e→promote→drop 全时序) - `frontend/playwright.config.*`(`ERP_E2E_SCOPE` 范围开关的消费端,由 coding.mjs 的 fe-skeleton stage 生成/补齐) - `workflows/coding.mjs` 顶部 `TEST_SCOPE`(增量模式定义与收窄边界) - `coding-start`(编码入口,缺省 affected 增量模式;传 `testScope: "full"` 可让它自己跑全量) - `add-req`(增量需求入口,本命令报出的连带回归从这里回流)