pnpm dev— dev server (Turbopack).pnpm build— production build.pnpm start— run the production build.
pnpm typecheck— TypeScript strict check.pnpm lint/pnpm lint:fix— Biome check / autofix.pnpm format— Biome format.pnpm check:comments— comment allowlist check.pnpm test/pnpm test:watch— Vitest (unit and component).pnpm test:e2e— Playwright. The config startspnpm devon :3000 and reuses an existing server if one is already up.
smoke— home renders.queue-renders— the desktop queue lists items.queue-toggle— the queue collapses to a rail and back, and asserts theinertand opacity contract.reduced-motion— transitions stay scoped to color/opacity underprefers-reduced-motion.persistence— act, reload, assert: likes survive a reload, playlist edits and created playlists survive, seeded likes drive the heart (localStorage, no backend).full-journey— the whole surface end to end: idle player, search, like + undo, playlist persistence, mobile shell, and a navigation/interaction perf budget with long-task recording.verify-phase4— screenshot capture helper (writes toartifacts/verify-phase4/), not an assertion suite.
Screenshot specs write into artifacts/<name>/; keep those artifacts out of commits.
scripts/capture-readme.mjs drives a running server with Playwright and writes the screenshots plus the demo video into artifacts/readme/. It needs ffmpeg on PATH for the demo.mp4 and demo.gif derived from demo.webm.
pnpm build && pnpm start # or: pnpm dev
node scripts/capture-readme.mjs # CAPTURE_BASE=http://localhost:3000, CAPTURE_OUT=artifacts/readmeCAPTURE_SHOTS=0 records only the video. Screenshots are 1280×720 (mobile 390×844 at 2x); the video is 1280×720.
- Pre-commit (Husky + lint-staged): Biome on staged files.
- Commit message: conventional commits (
feat:,fix:,chore:, ...). - One focused change per commit so reverts stay cheap.
- Push the branch, open a PR. CI must pass (typecheck, lint, comments, test, build).
- After CI is green, squash-merge and delete the branch.
- For UI phases, attach a screenshot, GIF, or video to the PR.
- The verification skill lives at
.opencode/skills/verify-sunao/. Itsfeatures/map has recipes for driving the app; refresh the recipes when a feature changes behavior. - Regenerate the README media with the capture script above when the UI changes.
Agent work does not always happen in the primary tree. Ignore .worktrees/ in vitest config and linting so a repo checked out inside the repo doesn't double the test and lint surface.