ci(release): derive the version from commit subjects, and add a manual backdoor
A bundle used to cost a second pull request whose entire content was a number. The workflow published only when a merge to `main` left `module.json` at a version with no release yet, so a merge that did not touch that line released nothing. Measured rather than argued: v0.3.0 (2026-08-12) is the only release this repo has ever cut, while the nine Teams phases and the cutover landed on `main` in the week since. Adopt the engine `link` and `installer` already run - feat!/BREAKING CHANGE -> major, feat -> minor, fix|perf -> patch, nothing releasable -> no release. The number that ships is the tag, and CI writes it into the `module.json` inside the bundle, with an assertion that the rewrite happened: a bundle carrying the wrong version would install under a number that is not the one it was released as. `module.json`'s version is kept as a floor rather than deleted - a version above the newest tag still releases at that version - so the declared model survives as the special case it always was, and is still how a `coreApi` bump overrules the subjects. `workflow_dispatch` covers what the rules cannot reach: leave `version` blank to bump the newest tag by `bump`, or name an exact version. Where the log and the input disagree the larger bump wins, because a button pressed on a log full of `feat:` would otherwise publish its `patch` default over a minor's worth of work. Two things carried over from `link` at the same time: a tag pushed without a release behind it is now recovered rather than making that state permanent, and the changelog moved into the plan step (so the assemble step clears `$OUT`, not `dist/`, which now holds it). On this repo's `main` the engine computes v0.4.0. The workflow still never writes to a branch. Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
19
README.md
19
README.md
@@ -134,11 +134,20 @@ website. Module delivery is website-side only.
|
||||
|
||||
### Releases
|
||||
|
||||
A merge to `main` that leaves `module.json` at a version with no release yet publishes one. The
|
||||
version is **declared**, not computed from commit subjects: `module.json`'s version is what core
|
||||
records in `installed_modules` and shows on the admin screen, and it sits beside the `coreApi` range
|
||||
a bump usually has to be weighed against — two sources for one number is how they drift. Bumping it
|
||||
is an ordinary reviewed PR.
|
||||
**Every merge to `main` that carries a releasable commit publishes a bundle.** The next version is
|
||||
computed from conventional-commit subjects since the newest `v*` tag, as in `link` and `installer`:
|
||||
`feat!:` or `BREAKING CHANGE` is a major, `feat:` a minor, `fix:` or `perf:` a patch, and a `main`
|
||||
that gained none of those cuts no release. The number that ships is the **tag**, and CI writes it
|
||||
into the `module.json` inside the bundle.
|
||||
|
||||
`module.json`'s version survives as a **floor**: name a version there above the newest tag and that
|
||||
version is what releases, which is how you overrule the subjects — when a `coreApi` bump forces a
|
||||
minor, say. What no longer happens is a `main` full of `feat:` producing nothing because a separate
|
||||
PR to move one number had not been merged yet.
|
||||
|
||||
For a change with nothing releasable behind it — a widened `coreApi`, a new mount, a capability —
|
||||
run the **Release** workflow by hand (Actions → Release → Run workflow). Leave `version` blank to
|
||||
bump the newest tag by `bump` (default `patch`), or type an exact version to publish that.
|
||||
|
||||
Each release carries:
|
||||
|
||||
|
||||
Reference in New Issue
Block a user