Runs an exploratory manual test on every PR: boots the local ENS stack,
drives the real app in a browser via the Playwright MCP server, and posts
a report as a PR comment.
An MCP-driven browser has none of the Playwright fixtures the e2e suite
relies on, so init-page.cjs restores the two that matter via MCP's
--init-page hook: it injects the same mock wallet the e2e suite uses
(@ensdomains/headless-web3-provider, every request kind pre-authorized so
nothing needs manual approval) and installs the page clock at the anvil
block timestamp, since local chain time is not real time and every name
would otherwise look expired. It also exposes a control server on :8546
for switching accounts and travelling in time from the shell.
Supporting pieces:
- wait-for-stack.mjs gates on contracts actually having code on chain and
the subgraph reaching the chain head. A leftover .env.local is not
proof the deploy finished.
- smoke.mjs boots a real MCP server, loads the app and asserts the wallet,
clock and control server work, before any Claude usage is spent. It
spawns from the same MCP config the session gets, so the two cannot
drift.
- pnpm seed seeds fixtures through the existing makeName helper, without
launching a browser.
- The run book always exercises register and extend, so a PR with no
user-facing change still gets meaningful coverage.
Long-running processes are started with setsid: each step is its own
shell session, and a merely backgrounded child is torn down with it.
Runs an exploratory manual test on every PR: boots the local ENS stack, drives the real app in a browser via the Playwright MCP server, and posts a report as a PR comment.
An MCP-driven browser has none of the Playwright fixtures the e2e suite relies on, so init-page.cjs restores the two that matter via MCP's --init-page hook: it injects the same mock wallet the e2e suite uses (@ensdomains/headless-web3-provider, every request kind pre-authorized so nothing needs manual approval) and installs the page clock at the anvil block timestamp, since local chain time is not real time and every name would otherwise look expired. It also exposes a control server on :8546 for switching accounts and travelling in time from the shell.
Supporting pieces:
Long-running processes are started with setsid: each step is its own shell session, and a merely backgrounded child is torn down with it.