npm release
September 20, 2026 ยท View on GitHub
This guide covers the root specpi package. Each package under packages/ releases independently, with its own release process, tag prefix and publish workflow: Browser QA (browser-qa-v*), Delegation (delegation-v*) and Experiments (experiments-v*). Package-only releases do not invoke the root publisher.
Publishing, tags, deprecation, ownership changes and GitHub Releases require explicit human approval. Publication is a post-merge operation: never publish from an unmerged commit. npm versions are immutable.
Prepare
-
This candidate is SpecPi 0.29.0, paired with the Chat 0.14.0 VSIX. Browser QA 0.3.0 is already independently published; do not republish or edit its source as part of this release. Choose an unused version; update
package.json, the datedCHANGELOG.mdentry, README, and the website. Check Chat's version and VSIX download links. Preserve historical changelog entries. -
Validate:
npm install --ignore-scripts --omit=peer --no-package-lock npm run check npm run check:pi-package npm run check:base npm run check:site npm publish --dry-run --ignore-scripts --provenance=false npm pack --dry-run --json git diff --checkInstaller/Pi lifecycle tests must use disposable state, never a live profile.
check:baserequires network access and verifies the real six-package base with isolated home/configuration paths. The base check now invokes the installed Browser QA Node bin for Chromium setup and offline doctor checks; scopePLAYWRIGHT_BROWSERS_PATHto a disposable test cache. Verify setup skip, core-only behavior, failure rollback, and BetterWright ownership migration in the installer regressions. Browser-cache/package bytes are outside managed rollback and uninstall. Review all default version changes, upstream lifecycle scripts, compatibility, and notices inTHIRD_PARTY.md. Local dry runs disable provenance because they lack GitHub OIDC. -
Review the diff, exact package manifest and artifact; obtain fresh read-only review for lifecycle, permissions and packaging changes.
-
After approval and passing PR checks, merge to
main, then create the matchingv<version>tag at the merge commit. Build Chat's VSIX withnpm --prefix vscode run packageand attach it to the GitHub Release. Publish the release to start the npm workflow and approve the protectednpmenvironment if it requests review. Verify the website deployment and download links. If publication cannot complete, revert the release merge and use a new version for the next attempt.
Protected publication
.github/workflows/npm-publish.yml builds one immutable, checksummed candidate; validates that same tarball on Ubuntu, Windows and macOS; then publishes through approved GitHub OIDC with provenance. Stable releases use latest, prereleases next. Runs are serialized, existing versions are rejected and the candidate must advance its dist-tag. Registry readback must match version, integrity, dist-tag and attestation.
Registry processing can take several minutes after npm accepts a publication. The workflow polls for up to five minutes. If that readback times out, inspect the registry and verify the published artifact before taking further action; do not rerun publication for a version that already exists.
After publication, install the registry artifact into disposable state and exercise plan/install/doctor/uninstall. Check package-page links/images, license, provenance and dist-tag before announcing.
First publication only
Enable npm 2FA/recovery, create a reviewer-protected GitHub npm environment and configure trusted publishing for TannerMidd/SpecPi, .github/workflows/npm-publish.yml. Do not add a long-lived npm token when OIDC is available.
If npm requires an initial interactive publication before attaching the trusted publisher, run every gate above, then publish the exact reviewed tarball with 2FA:
npm publish --ignore-scripts --access public --provenance=false ./specpi-<version>.tgz
This one bootstrap exception lacks GitHub provenance. Verify registry bytes/metadata immediately and configure trusted publishing before subsequent releases. Do not publish a GitHub Release for that same bootstrap version: the workflow rejects existing versions. Keep its reviewed source tag.
Recovery
Stop before publication if any gate fails. After publication, never replace a version's bytes: verify the registry defect, deprecate when warranted, and ship a checked patch through an explicitly approved operation. Unpublish only when npm policy, legal requirements or credential exposure warrants it.
For exposed credentials, revoke them, stop workflows, inspect ownership/dist-tag history, use the private reporting channel, and rotate related credentials before resuming.