Smoke tests
Hover ships three test layers. Use them as a release gate.
Unit — Vitest, per package
pnpm test # fan out across the workspace
pnpm --filter @hover-dev/core test # one package only
Tests live in packages/*/tests/. Keep src/ source-only — do not put *.test.ts inside src/.
Integration / end-to-end — Playwright
Crystallized specs under examples/basic-app/__vibe_tests__/ run as standard @playwright/test. No agent in the loop — only the saved script:
pnpm --filter basic-app exec playwright install chromium # first-time setup
pnpm test:e2e
Smoke-level (agent in the loop)
Requires a running debug Chrome (pnpm smoke:chrome) and an example dev server. Not part of CI.
pnpm smoke # default
pnpm smoke http://localhost:5173/ "log in, add a todo" # custom target + prompt
HOVER_AGENT=codex pnpm smoke # switch agent for this run
Plugin smokes
Optional plugins have their own smokes. @hover-dev/security ships six:
pnpm --filter @hover-dev/security smoke # mitm primitives (no Chrome)
pnpm --filter @hover-dev/security smoke:e2e # real Chrome over CDP + SPKI + HTTP/2 mutation
pnpm tsx packages/security/scripts/plugin-smoke.ts # WS mode toggle lifecycle
pnpm tsx packages/security/scripts/mcp-smoke.ts # MCP client drives all 4 tools
pnpm tsx packages/security/scripts/agent-config-smoke.ts # mcp-config includes plugin entry
pnpm tsx packages/security/scripts/widget-ws-smoke.ts # widget wire protocol surface
Validation strategy
Before marking work ready:
pnpm typecheck— fans out to every package.pnpm test— Vitest, fans out across packages with tests.pnpm build— confirms every package'stsc -p tsconfig.build.jsonis clean.- The package-scoped smoke or Playwright run that matches the files changed.
That sequence is also what the publish workflow gates a release on.