All releases run manually via .github/workflows/release.yml using workflow_dispatch.
Inputs:
mode:stable,rc, orcanaryref: required git ref to check out
The workflow installs dependencies and runs:
pnpm release:runTrusted publishing should point every public package at the single workflow filename release.yml.
Stable releases run manually from main.
- Merge changesets into
main. - Run the release workflow with
mode=stableandref=main. - The release runner calls
changeset version. - The runner refreshes
pnpm-lock.yaml. - The runner commits version and changelog changes to
main. - The runner pushes the release commit to
main. - The runner runs validation and build steps.
- The runner publishes packages to npm with the default
latestdist-tag. - The runner creates one annotated monorepo tag like
v1.7.0and pushes it.
Prereleases also run manually with .github/workflows/release.yml.
Use release/<minor> or release/<version> branches, for example release/1.7 or release/2.0.
rc mode is intentionally restricted to release/* branches and will fail on main.
First rc run on a release branch:
changeset pre enter rcchangeset version- refresh
pnpm-lock.yaml - commit versioned files to the release branch
- push the release branch
- run
pnpm release:check - run
pnpm release:build - publish to npm under
rc - create one annotated monorepo tag like
v1.7.0-rc.0and push it
Subsequent rc runs:
- add more changesets on the same release branch
- rerun the prerelease workflow in
rcmode changeset version- refresh
pnpm-lock.yaml - commit and push updated prerelease state
- publish and push the new monorepo tag
Exit rc mode manually on the release branch when ready:
pnpm changeset pre exit
pnpm changeset version
pnpm install --lockfile-only
git add .changeset packages package.json pnpm-lock.yaml CHANGELOG.md
git commit -m "Exit prerelease mode"
git pushMerge that branch back through the normal stable release flow.
Use canary mode for snapshot releases from any chosen ref.
The workflow:
- runs
changeset version --snapshot canary - refreshes
pnpm-lock.yaml - runs
pnpm release:check - runs
pnpm release:build - runs
changeset publish --tag canary --no-git-tag
Snapshot version changes are not committed or pushed.
npm publish behavior relies on Changesets defaults:
- stable publishes to
latest rcpublishes torccanarypublishes tocanary
Examples:
npm install rozenite
npm install rozenite@rc
npm install rozenite@canaryInstalling without a tag must never pull prereleases.
All public packages under packages/* that are meant to publish to npm declare:
"publishConfig": {
"access": "public"
}Packages intentionally excluded from publishing remain untouched:
packages/chrome-extension/package.jsonpackages/cli/template/package.jsonapps/playground/package.jsonwebsite/package.json
Configure npm trusted publishing per public package.
For each package on npm:
- Open package settings.
- Add a GitHub Actions trusted publisher.
- Set org/user to
callstackincubator. - Set repo to
rozenite. - Add workflow
release.yml.
Notes:
- Trusted publishers are configured per package.
- GitHub-hosted runners are required.
- Provenance should be automatic for public packages from this public repository.
- After verification, token-based publish access can be restricted or disabled.
When configuring npm trusted publishing, use the single workflow filename release.yml.
All releases run through workflow_dispatch with:
mode=stable | rc | canary
ref=<git ref>
Changesets package-level git tags are disabled during publish.
Instead, the release runner creates one annotated monorepo tag per stable or rc release:
- stable:
v<version> - rc:
v<version>where<version>includes the rc suffix
Canary releases do not create git tags.
Root release scripts:
{
"release:check": "pnpm turbo run typecheck build lint test",
"release:build": "pnpm build:all",
"release:publish": "changeset publish --no-git-tag",
"release:run": "node scripts/release/release.mjs"
}Before the first real publish:
- Verify all public package manifests include
publishConfig.access = \"public\". - Verify private workspaces remain excluded.
- Verify
changeset publishskips@rozenite/chrome-extension. - Verify representative
npm pack --dry-runoutput for a few packages. - Verify
repository.urlis consistent on published packages. - Dry-run workflow logic on a test branch before the first real publish.