When to Use
Use this skill when preparing, publishing, or verifying a gentle-pi release.
Hard Rules
- Do not publish
gentle-pito npm from a local machine. - npm publishing MUST go through the GitHub Actions workflow
.github/workflows/publish.ymlso provenance, environment protection, and registry credentials are controlled by GitHub. - Dispatch the trusted workflow definition from protected default
main, never from a release tag. Its only caller input is the exact annotated version tag. - Use a clean worktree for release commits. Do not package unrelated local files or scratch artifacts.
- Review outcomes are informational. Release delivery follows ordinary repository policy and must not be blocked, authorized, or rewritten by RDD.
- Never infer the release tag target from local
HEAD; use the freshly fetchedorigin/maincommit and the repository's normal release safeguards. - Never skip package verification. The publish workflow runs verification again, but local validation should still pass before tagging.
Release Procedure
-
Inspect state
git status --short git fetch origin main --tags git log --oneline --decorate --max-count=5 origin/main -
Prepare the release commit
- Apply only intended changes.
- Bump
package.jsonto the next semver version. - Keep lockfile changes out unless dependency resolution actually changed.
-
Verify locally
pnpm test node scripts/verify-package-files.mjs npm pack --dry-runnpm pack --dry-runverifies package contents and lifecycle scripts without entering a publish path. -
Commit and push
git add <intended-files> git commit -m "<type(scope): release-ready change>" git push origin HEAD:main git fetch origin main --tags -
Create and verify the exact version tag
version="$(node -p "require('./package.json').version")" tag="v${version}" release_sha="$(git rev-parse 'origin/main^{commit}')" test "$(git rev-parse 'HEAD^{commit}')" = "${release_sha}" test -z "$(git ls-remote --tags origin "refs/tags/${tag}")" git tag -a "${tag}" "${release_sha}" -m "gentle-pi ${tag}" test "$(git rev-parse "${tag}^{commit}")" = "${release_sha}" git fetch origin main test "$(git rev-parse 'origin/main^{commit}')" = "${release_sha}" git push origin "refs/tags/${tag}" git fetch --no-tags origin "refs/tags/${tag}" test "$(git rev-parse 'FETCH_HEAD^{commit}')" = "${release_sha}" gh release create "${tag}" \ --repo Gentleman-Programming/gentle-pi \ --verify-tag \ --title "gentle-pi ${tag}" \ --notes "<release notes>"Do not retag or overwrite an existing version. The tag target comes from the freshly fetched immutable
origin/maincommit, not an ambient local branch. -
Publish npm through GitHub Actions
version="$(node -p "require('./package.json').version")" tag="v${version}" gh workflow run publish.yml \ --repo Gentleman-Programming/gentle-pi \ --ref main \ -f tag="${tag}"The workflow definition always comes from protected default
main. It accepts only one exactvSemVertag, fetches the remote annotated tag and current remotemain, and requires the peeled tag commit, dispatch/main workflow commit, checkout, andpackage.jsonversion to match. It re-queries remote tag andmainimmediately before npm publication, derives the dist-tag internally, and uses trusted OIDC with provenance.Watch the run and fail the release if it fails:
gh run list --repo Gentleman-Programming/gentle-pi --workflow publish.yml --limit 3 gh run watch <run-id> --repo Gentleman-Programming/gentle-pi --exit-status -
Verify npm
npm view gentle-pi@<version> version --registry=https://registry.npmjs.org/ npm dist-tag ls gentle-pi --registry=https://registry.npmjs.org/
Failure Handling
-
A publication failure is handled through ordinary repository policy. It does not reopen or alter a review lineage.
-
Never attempt or retry
npm publishlocally. Re-dispatch from trustedmainonly when the same tag still targets the current remotemainand the failure was publication-only. -
If remote
mainadvances, do not move or recreate the existing tag. Prepare a new release commit/version and create a new annotated version tag. -
If the workflow fails, inspect logs with:
gh run view <run-id> --repo Gentleman-Programming/gentle-pi --log -
If npm verification is briefly stale after a successful workflow, check the exact version first (
npm view gentle-pi@<version> version) before assuming publish failed.
Output Contract
Report:
- Commit SHA pushed to
main. - Exact version tag and its peeled commit SHA.
- GitHub release URL.
- Publish workflow run URL and conclusion.
- npm exact version and the workflow-derived dist-tag (
latest,beta, ornext). - Any remaining follow-up or warnings.