Canonical release methodology for ObjectIsAdvantag open-source repositories. Distributed and kept in sync by oss-scaffold. The repo-local, agent-facing version lives at
.github/skills/release/SKILL.md.
- Every release is reviewed. No release is cut directly on
main. Changes land through arelease/X.Y.Zbranch and a pull request. - The tag is the contract. Publishing is triggered by pushing a
v*tag tomain. The tag points at the exact commit CI verified and a maintainer approved. - Merge commits only. Squash and rebase merging are disabled so the merged SHA — the one we tag and publish — is byte-for-byte what was reviewed.
- Automated, attested publish.
publish.ymlbuilds, tests, verifies the tag matchespackage.json, and runsnpm publish --provenance --access public. - Fix forward, never rewrite. A failed publish is fixed with a new patch/RC version — never by force-pushing or deleting a published tag.
- DCO always. Every commit is signed off (
git commit -s).
| Bump | When |
|---|---|
MAJOR X.0.0 |
Breaking changes |
MINOR 0.X.0 |
New features, backward-compatible |
PATCH 0.0.X |
Bug fixes, docs, non-breaking |
Pre-release -rc.N / -beta.N |
Release candidates |
- Versions with a
-(e.g.1.0.0-rc.6) publish undernext. - Versions without a
-publish underlatest.
This keeps npm install <package> on the latest stable release while
pre-releases are available via <package>@next. The policy is enforced
automatically in publish.yml.
feature branches ──PR──> main ──(release/X.Y.Z PR)──> merge commit ──tag vX.Y.Z──> publish.yml ──> npm
│ │
└── CI (build+test matrix, doc-links, drift-check) ──┘
- Prepare on
release/X.Y.Z: bumppackage.json, rollCHANGELOG.md([Unreleased]→[X.Y.Z]), runnpm run prerelease. - PR against
main; wait for green CI + maintainer approval. - Merge with a merge commit.
- Tag the merged commit on
mainand pushvX.Y.Z→ triggers publish. - Verify the publish workflow and the dist-tag
(
npm view <package> dist-tags).
Two supported modes (chosen per repo in .scaffoldrc.json → npmAuth):
oidc— npm Trusted Publishing; no long-lived token. Preferred.token— a repoNPM_TOKENsecret.
Both publish with --provenance and require id-token: write.