SKILL.md 8.5 KB

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. 取 projectRootBash(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. Bashrun_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 为空,且日志落盘、退出码落盘。

  1. 在同一回合内轮询到终态:反复 Bash 调用(每轮 sleep 60~120 后读 .tmp/full-test/exit 是否存在 + 读 run.log 尾部若干行),多少轮都行。 绝不用 Monitor / ScheduleWakeup / 「装个监听器然后结束回合等通知」——结束回合就等于宣告完成。
  2. 每轮向用户播报一行当前进度(从 run.log[test.mjs] N/5 <阶段> 行取),让长跑可见。
  3. 拿到 exit 码后,从 run.log 提取结构化摘要(不要把全文灌进上下文):
    • 各阶段(build / lint / 单测 / e2e)的通过与否;
    • 失败用例名 + 断言摘要(≤30 行);
    • e2e 实跑条数(playwright 的 N passed 行)——0 条即异常,说明范围开关被误设,按红处理。

步骤 4:证据报告 + 提交

docs/superpowers/module-reports/full-regression-<YYYY-MM-DD>.md(同日多次跑加 -r<N> 后缀,绝不覆盖前一次):

# 全量回归报告 <YYYY-MM-DD>[-r<N>]

- 触发:/erp-workflow:full-test(人工按需)
- 分支 / HEAD:<branch> @ <短哈希>
- 命令:ERP_E2E_SCOPE=(空,全量) node scripts/test.mjs
- 结论:GREEN / RED
- e2e 实跑条数:<N>(0 条 = 范围开关误设,按 RED 处理)
- 各阶段:build <ok/fail> / lint <ok/fail> / 后端单测集成 <ok/fail> / 前端 vitest <ok/fail> / e2e <ok/fail>
- 迁移晋升:<已晋升 V<n>... / 无新迁移 / 未晋升(红)>

## 失败摘要(RED 时必填)
<失败用例 + 断言摘要,≤30 行>

## 距上次全量回归的增量
<git log --oneline <上次 full-regression 报告的提交>..HEAD 摘要;首次跑写「首次」>

Bash(git add <报告> && git commit -m "docs(full-test): 全量回归报告 <日期> <GREEN|RED>")。 commit 失败 → 报告已落盘即可,把 stderr 摘要告诉用户,不 halt。

步骤 5:输出结论横幅

绿:

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 [full-test] ✅ 全量回归 GREEN

   e2e 实跑:<N> 条(全量)
   报告:docs/superpowers/module-reports/full-regression-<日期>.md
   迁移晋升:<已晋升 V<n>... / 无新迁移>

 [ERP-HALT] 全量回归通过。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

红:

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 [full-test] ⛔ 全量回归 RED

   失败阶段:<build / lint / 单测 / e2e>
   失败用例:<逐条列出,不截断关键断言>
   报告: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(增量需求入口,本命令报出的连带回归从这里回流)