Mandatory steps before tagging any vX.Y.Z. Skip none. Discipline now beats post-release horror later.
pnpm test # vitest unit tests
pnpm test:ssr # ssr-test.mjs
pnpm test:ssg # ssg-test.mjs
pnpm --dir site build # site SSG must succeed (proves end-to-end pipeline works)
pnpm test:e2e --project=chromium # Playwright on Chromium
pnpm test:e2e --project=firefox # Playwright on FirefoxIf test:e2e:webkit runs locally (depends on host OS — see e2e/README.md for Linux setup), include it. Otherwise WebKit coverage comes from the manual device check below.
The Playwright suite covers Chromium + Firefox automatically. WebKit-class browsers must be hit on real devices each release (see README.md Browser support for the supported matrix):
- Chrome desktop (any recent) — open https://vanjexdev.github.io/courvux/, navigate every sidebar route, open
/demoand add/toggle/delete a todo. - Firefox desktop — same flow.
- Safari on iOS (real iPhone or BrowserStack) — same flow + verify the floating sidebar toggle button shows
☰(not raw{{ }}). This is the regression check for the 0.4.4 class of bug. - Samsung Internet on Android (real device or BrowserStack) — same flow.
Every vX.Y.Z requires consistent version refs. Quick audit:
grep -rn "0\.X\.Y" \
package.json README.md BENCHMARKS.md \
skills/courvux/SKILL.md \
site/src/main.js site/src/pages/Home.js site/src/pages/Installation.jsBump:
-
package.json—"version": "X.Y.Z" -
README.md— version badge, body line, install pin (#vX.Y.Z), Top-level exports header -
BENCHMARKS.md— measurement reference line(s) -
skills/courvux/SKILL.md—Current versiontable cell +Top-level exports (vX.Y.Z)header. Mirror to~/.claude/skills/courvux/SKILL.mdif used as personal Claude Code skill. -
site/src/main.js— sidebar version label + aria-label -
site/src/pages/Home.js— hero badge + install snippet -
site/src/pages/Installation.js— install snippet + jsDelivr CDN pin -
CHANGELOG.md— new## [X.Y.Z] — YYYY-MM-DDsection above the previous one. List every fix / feature / breaking change with file references.
-
pnpm buildfrom repo root — regeneratesdist/index.js+dist/test-utils.js+.d.ts. -
pnpm --dir site build— regeneratesdocs/for GitHub Pages.
Both should appear in git status after running.
- Work happened on a dedicated branch (
fix/,feat/,chore/,docs/). - Branch was merged into
stagingwith--no-ff(preserves the merge commit so history shows the unit of work). -
stagingwas merged intomainwith--no-ffafter explicit user approval. - No direct commits on
main.
git tag vX.Y.Z
git push origin main
git push origin vX.Y.Z
gh release create vX.Y.Z --generate-notesThe GitHub release notes auto-generate from commit messages; double-check they mention the [X.Y.Z] CHANGELOG section.
Do not run npm publish autonomously. Even when every checklist item is green, the publish step is gated by an explicit user decision per release. The framework can sit fully tagged on GitHub indefinitely without going to npm; that's intentional while we're pre-1.0 and validating with the SSG site + the upcoming Tauri app.
When the user does say go:
-
npm pack --dry-run— verify the tarball only containsdist/,plugin/,README.md,LICENSE,package.json. Nosrc/,site/,docs/,e2e/,node_modules/, dotfiles, etc. - Try a fresh install in a scratch directory:
npm pack→npm install ../courvux-X.Y.Z.tgzin a new project, run a tinycreateAppsmoke test. -
npm publish(you'll need npm 2FA configured). - Verify on
https://www.npmjs.com/package/courvuxthat the published version + files match. - Update site / README install snippets from
github:vanjexdev/courvux#vX.Y.Zto plainpnpm add courvux@X.Y.Z(or whatever the user prefers).
Every Courvux bug shipped to production so far (0.4.4 router-link, 0.4.5 component-is, 0.4.6 trailing-slash) would have been caught earlier by either (a) the cross-browser manual smoke or (b) the Playwright suite. After-the-fact patches are fine, but they cost a release each. Going through this list before tagging shifts that cost left.