Move the e2e suites into the repo (tests/), out of /tmp

The browser harness lived in /tmp/opencode and an overnight reboot
wiped it. It now lives in tests/ and survives reboots, is versioned
and runs with one command.

- tests/lib.mjs: shared helpers (Chromium auto-detect, seeding,
  IndexedDB fixtures, stub/extra instance spawn with process-group
  cleanup, check/finish).
- tests/run-all.mjs + npm run test:e2e [filter]: runs the ten suites
  in order with a summary; suites that need a stub Ollama or VAPID
  keys start their own next start instance on 3208/3209, verify the
  port is free and kill the group on exit. Test scratch in
  tests/.tmp/ (gitignored).
- Suites rebuilt and green against the current build: regression 38,
  mobile 94 (tab matrix, ... sheet, settings sheet, axe), wizard 83,
  native 31 (PWA/offline/share/back/undo/haptics/draft), i18n 13,
  freeze-loading 6, review 15, phase1 36 (backup/sync/usage limits),
  phase2 42 (learning engine/reminders), phase3 21 (homework check).
  379 checks, 10/10 suites in one full run.
- playwright-core + axe-core added as devDependencies; CHROME env or
  the newest ~/.cache/ms-playwright chromium is used.
- README: new decision 45 documenting the harness; decision 44's
  verification note updated.

The older suites' exact sources were lost with the wipe, so the
rebuilt versions reconstruct the same feature areas rather than
being byte-identical.
This commit is contained in:
Martin Dvořák 2026-10-11 15:11:06 +00:00
commit dbd5dfbc58
17 changed files with 2280 additions and 8 deletions

View file

@ -8,7 +8,8 @@
"prebuild": "node scripts/copy-pdf-worker.mjs",
"build": "next build",
"start": "next start -H 0.0.0.0 -p 3207",
"lint": "eslint"
"lint": "eslint",
"test:e2e": "node tests/run-all.mjs"
},
"dependencies": {
"canvas-confetti": "^1.9.4",
@ -30,8 +31,10 @@
"@types/react": "^19",
"@types/react-dom": "^19",
"@types/web-push": "^3.6.4",
"axe-core": "^4.14.0",
"eslint": "^9",
"eslint-config-next": "15.5.27",
"playwright-core": "^1.64.0",
"tailwindcss": "^4",
"typescript": "^5"
}