chore: release stable by default, publish betas on demand - #216
Merged
Conversation
release-please was configured with prerelease versioning, so every release it proposed was a beta and the repository could not reach a stable version without a Release-As override. Betas are occasional and deliberate; stable releases are the normal case. This inverts that. release-please now proposes stable versions only. A beta is a manual dispatch of publish.yml with mode=next and an explicit version, stamped across the three packages and published to the `next` dist-tag. Publishing stays in publish.yml because npm's trusted publishing validates the workflow filename, so a second publishing workflow could not authenticate. stamp-experimental-version.mjs becomes stamp-version.mjs and takes either a SHA (experimental) or an explicit VERSION. VERSION must carry a prerelease suffix, so a dispatch cannot fabricate a stable version - those come only from release-please and what is committed to package.json. A `release` event never stamps: it publishes the version release-please already wrote and tagged. Also removes `separate-pull-requests: false`, which was the real reason github-release refused to create the 5.1.0-beta draft and it had to be made by hand. manifest.js defaults it to true for a single package; forcing it false kept the merge plugin active, and merge.js hardcodes the branch to BranchName.ofTargetBranch - no component - while the strategy's getBranchComponent() still returned "monorepo". buildRelease compares those two and aborted on the mismatch. With it removed the strategy names its own branch, the components match, and the release is created automatically. It also fixes the bare "chore: release main" title, which now reads "chore: release 5.1.0". Verified by running the plan step directly over every mode: release/stable -> latest, release/prerelease -> next, dispatch+version -> stamped next, dispatch without a version and with a stable version both refused, experimental by branch and by sha, and two hostile branch names rejected. Co-Authored-By: Claude <noreply@anthropic.com>
This was referenced Aug 14, 2026
Closed
derrickmehaffy
added a commit
that referenced
this pull request
Aug 14, 2026
The last release was 5.1.0-beta and release-please does not graduate on its own: the default versioning strategy keeps the prerelease suffix, so the open release PR proposed 5.1.1-beta rather than 5.1.0. Release-As applies to a single release and leaves nothing in the config, unlike the "release-as" config key which would pin every subsequent release. The footer was in #216's pull request body and did not survive. GitHub only builds a squash commit from the title and body when the branch has more than one commit; with a single commit it uses that commit's message. It is recorded in the release skill so the next person does not lose an hour to it. Release-As: 5.1.0
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Inverts the release model, and fixes the bug that made me hand-create the
v5.1.0-betadraft.Betas become manual
release-please was configured with prerelease versioning, so every release
it proposed was a beta, and the repo could not reach a stable version without a
Release-As:override. Betas are occasional and deliberate; stable is thenormal case.
Now: release-please proposes stable versions only. A beta is a dispatch of
publish.yml:mode:nextversion:5.2.0-beta.0target_branch: defaults tomainIt stamps that version across all three packages and publishes to
nextvianpm-prerelease. Publishing stays insidepublish.ymlbecause npm's trustedpublishing validates the workflow filename — a second publishing workflow
could not authenticate.
versionmust carry a prerelease suffix;stamp-version.mjsrefuses a stableone, so no dispatch can put a stable version on npm. Those come only from
release-please and what is committed to
package.json. Areleaseevent neverstamps — it publishes the version release-please already wrote and tagged.
The real cause of the manual draft
separate-pull-requests: false. Frommanifest.js:83:It defaults to
truefor a single package. Forcing itfalsekept the mergeplugin active, and
merge.js:81hardcodes the branch toBranchName.ofTargetBranch(targetBranch)— no component — while thestrategy's
getBranchComponent()still returnedmonorepo.buildReleasecompares those two and aborted:
It made sense with three packages. With one it is actively harmful. Removed.
Dry run confirms the branch now carries the component, so the comparison
matches — and the bare title is fixed as a side effect:
Verified
The plan step run directly over every mode:
mode=latest dist_tag=latestmode=next dist_tag=next(no stamping)next+ versionstamp_version=5.2.0-beta.0 ref=mainnext, no versionnext,5.2.0latestmode=latest, no ref../eviland--upload-pack=xbranchesAnd the stamper directly: SHA path, explicit prerelease path, and a stable
VERSIONrefused.After this merges
The next release PR should read
chore: release 5.1.0and, when merged,release-please should create the draft by itself — that is the thing to
watch, since it is what failed before.
Release-As: 5.1.0