Releasing
Pushing a v* tag triggers .github/workflows/publish.yml, which publishes the npm packages and creates a matching GitHub Release.
The VS Code extension (hover-dev) is the distribution. It is built, engine-staged, and packaged with pnpm --filter hover-dev package (→ a .vsix), then published to the VS Code Marketplace (publisher hyperyond) — a local .vsix is sideloaded for dev testing. It is not part of the npm tag-push workflow below.
What ships per release (npm)
| Package | npm |
|---|---|
@hover-dev/mcp | https://www.npmjs.com/package/@hover-dev/mcp |
@hover-dev/core | https://www.npmjs.com/package/@hover-dev/core |
@hover-dev/mcp (the authoring surface) and @hover-dev/core (the engine it rides on) are published lockstep on a v* tag. (The old bundler-plugin and probe packages were removed; previously published versions remain on the registry as historical artifacts.) All scoped packages live under the @hover-dev npm org (public access).
Cutting a release
-
Land all the PRs you want shipped on
main.mainmust stay runnable — every commit on it should leavepnpm typecheck+pnpm testintact. -
Confirm
pnpm buildis clean locally and the relevant manual end-to-end passes. -
Tag with an annotated message (the message becomes the leading body of the GitHub Release):
git tag -a v0.16.0 -m "v0.16.0 — Claude Code hooks - hover-hook: SessionStart / UserPromptSubmit / Stop wiring - Cloud heal-queue context injected into the session preface - …" git push --tags -
Tag push triggers the workflow. It:
- Re-installs dependencies in CI.
- Resolves the version from the tag (
v0.7.0→0.7.0). - Rewrites every publishable
package.jsonin place vianpm version --no-git-tag-version. - Runs
pnpm typecheck+pnpm testas a release gate. - Builds every package.
- Publishes each one to npm with
--access public. - Packs the same tarballs and attaches them to a GitHub Release.
If the workflow fails
Tags are immutable for everyone who already pulled. Don't retag — re-trigger:
gh workflow run publish.yml --ref v0.7.0 -f version=0.7.0
--ref checks out the tag's commit (not the moving default-branch HEAD). The workflow has a workflow_dispatch input for exactly this case. The Release won't be re-created on a manual rerun (the workflow's if: startsWith(github.ref, 'refs/tags/') gate skips it); if the original failed before the Release step, create it manually with gh release create.
Version policy
Pre-1.0 we use thematic patches: v0.6.x = Voice mode, v0.7.x = Security testing, v0.8.x = Source attribution (Vue/Svelte/Astro), v0.9.x = Widget plugin-UI protocol, v0.10.x = Multi-tab + agent expansion (cursor-agent/aider/gemini-cli/qwen-code), v0.11.x = Spec resilience (Re-record + Saved sessions), v0.12.x = Security spec recording, v0.13.x = Record/replay parity (visibility prelude + Record initial page.goto + opt-in reload). Strict SemVer kicks in at v1.0.0. See Roadmap.
Permissions
The workflow uses:
NPM_TOKEN— granular automation token with read+write on@hover-dev/*. Set in repo secrets.GITHUB_TOKEN— auto-injected, used bysoftprops/action-gh-releaseto create the Release.
Never --no-verify, never git config changes, never force-push to main. Hooks must stay green.