The old README was the scaffolding-era version: said 'V1 in progress',
'no build step', 'will be pushed once vault unlocked' — all stale.
New README reflects what's actually in the repo:
- Repo remote, branch, smoke-test status
- Real file tree under extension/content/ (6 TS modules, not 5)
- Actual build pipeline (npm run build / watch / typecheck)
- Smoke test section with the Playwright workflow that works
- Permission surface as it actually is (storage + host permission)
- Privacy stance — no data collection, ever
Stale scaffolding TODOs removed. The detailed V1 architecture,
risk register, and V2 backlog stay in docs/PLAN.md where they
belong — README is now the entry point, not the plan.
scripts/smoke.js, scripts/probe.js, scripts/probe-inject.js,
scripts/probe-minimal.js, scripts/smoke-final.js
The smoke test verifies the Beat Pocket extension loads and injects into
beat-battle.net:
1. Service worker registers (manifest valid, MV3 wiring works)
2. Content script runs (creates #bbp-host element on document.body)
3. No JS errors thrown on the page
4. Site renders normally (PLAY button still visible)
Why Playwright instead of raw --load-extension:
- Google Chrome refuses --load-extension on the command line
- Chromium full build accepts it but hangs under --virtual-time-budget
- Playwright's launchPersistentContext properly initializes extensions
in headless mode and gives a clean Chromium without the GCM/dbus noise
- The bundled Chromium is at
/root/.cache/ms-playwright/chromium-1208/chrome-linux64/chrome
Run with: node scripts/smoke-final.js (after npm install)
Probe results from this session:
- [final:dom] #bbp-host is appended to body via ensureHost()
- [final:errors] 0 page errors
- [final:console] 0 extension-related console lines (expected: silent
happy path; logs only on phase transitions)
The esbuild outdir was relative to cwd, so it landed at project root
(dist/content/) on a project-root build, not under the extension dir.
Fix:
- esbuild writes to extension/dist/content/
- manifest.json content_scripts.js → dist/content/index.js
- Keeps the extension self-contained so Chrome --load-extension works
without any external files