Release flow
novamem has two parallel release pathways:
- npm packages — versioned via Changesets, published to npm
- Server image — versioned via manual
vX.Y.Ztags, published to ghcr.io
npm packages (Changesets)
The published packages: @azrtydxb/novamem, @azrtydxb/novamem-mcp, @azrtydxb/novamem-init. The mcp and init packages are linked so they bump together.
Workflow
Add a changeset in your PR:
bashpnpm changesetPick the package(s), the bump type (patch / minor / major), and write the changelog line.
Merge the PR. The Release workflow opens or updates a "Version Packages" PR with the bumps applied.
Merge the Version Packages PR. The Release workflow runs
pnpm changeset publishwithNPM_CONFIG_PROVENANCE=true(Trusted Publishers, no token).The release tag is
@azrtydxb/<pkg>@X.Y.Z. GitHub Releases auto-created from the changelog.
Notes
- Server (
@azrtydxb/novamem-server) is in theignorelist in.changeset/config.json— Changesets won't bump it. It's released manually (see below). - npm publishes use Trusted Publishers (OIDC). No token in the workflow.
- Node 24 is required for
npm publishPUT auth — Node 22 ships npm 10 which lacks it.
Server image (manual vX.Y.Z)
The server isn't published to npm. The release artifact is the docker image.
Workflow
Branch off main:
chore/release-vX.Y.Z.Bump
packages/server/package.jsonversion.Open PR + auto-merge. CI runs the test suite.
Tag on the merge commit:
bashgit tag vX.Y.Z <sha> git push origin vX.Y.ZCreate the release with
gh release create vX.Y.Zand notes summarising the included PRs since the previous tag.Image is at
ghcr.io/azrtydxb/novamem:sha-<short>. The:maintag also points at the latest main.
Tag conventions
| Tag | What |
|---|---|
vX.Y.Z | Server release. Repo-wide. |
@azrtydxb/<pkg>@X.Y.Z | Per-package npm release. |
:main | Always-latest main. Don't use in production. |
:sha-<7chars> | Deterministic. Pin in production. |
Branch protection
main requires:
- 6 status checks green:
test (amd64),test (arm64),audit,package npm,docker amd64,docker arm64 - Branch up-to-date with
mainbefore merge (strict: true) - 1 approving review (or auto-approve via
enable-automergefor fix-up PRs)
Auto-merge does NOT auto-update branches that fall BEHIND. If a PR sits BEHIND because main moved, run gh pr update-branch <N> manually.
When something fails to publish
- npm 404 on publish — the package is on Trusted Publishers but the workflow ran with an old npm. Make sure
setup-nodeusesnode-version: 24. workspace:*in published tarball — happens if you publish vianpm publishdirectly. Always usepnpm publish(orpnpm changeset publish), which rewrites workspace protocol entries.- Docker push fails on attestation manifest — the workflow uses
docker/build-push-actionwithpush: trueafter Trivy. Don'tdocker tag+docker pushon a--load'd image; the attestation manifest gets stripped.
Reading the release page
Each server release lists:
- Summary — one-line "what's new"
- Changes since previous tag — bullet list with PR links
- Image — pinnable tag for k8s
set image - Compatibility — "no breaking changes" or specific notes if there are
- Verification — how the release was tested (often: deployed to home cluster + MCP smoke test)