ci: publish GitHub Releases for every released package - #7
Merged
Conversation
The Releases page stopped updating after @webikon/webentor-core@0.15.3. Those existing releases are named `@scope/pkg@version` -- the changesets convention -- because the changesets action created them. When the release pipeline was revamped (changesets -> check-versions + publish-npm.mjs + release-tags.sh), nothing replaced that: the new flow only pushes git tags. So core-v0.15.4 through core-v0.15.7 exist as tags and are published on npm, but have no Release object. release-tags.sh now ensures three things per released package instead of one: the namespaced tag, a GitHub Release on it carrying that version's CHANGELOG section, and (mirrored packages only) the split-workflow dispatch. Also widens coverage beyond the mirrored packages. `configs` and `codemods` are npm-published but were never tagged at all, so they get `configs-v*` / `codemods-v*` tags with no split dispatch. The theme stays out -- it ships inside webentor-starter and has no independent distribution. Release titles are derived from each package's own manifest `name` rather than a hardcoded template, which reproduces the pre-changesets scheme exactly for the npm packages (@webikon/webentor-core@0.15.7) and yields the natural composer analogue for the PHP-only ones (webikon/webentor-setup@1.1.0). Tags keep the `<ns>-v<version>` form the split workflows key off. The tag and Release checks are deliberately independent, so a version whose tag already exists but whose Release is missing gets backfilled on the next run -- which means merging this creates the missing Releases for all five current committed versions. Split dispatch stays gated on a freshly created tag so mirrors are never re-pushed. Changelog slicing tracks code fences, so a future entry containing a fenced `# comment` cannot silently truncate the release notes. Verified with `DRY_RUN=true` and `bash scripts/test-release.sh --tags` against live origin state: correctly reports core/setup/starter tags as existing while proposing their missing Releases, and proposes both tag and Release for configs/codemods. Notes extraction checked for all five changelogs, including the starter's `###` heading level and nested sub-bullets. Claude-Session: https://claude.ai/code/session_015gnVTZywLgQYkM6Epr2uW2
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.
Why
The Releases page stopped updating after
@webikon/webentor-core@0.15.3(2026-07-02), while tags and npm publishes kept advancing:Those existing Release names are the changesets convention (
@scope/pkg@version) — the changesets action created them. When the pipeline was revamped (changesets →check-versions+publish-npm.mjs+release-tags.sh), nothing replaced that behaviour. Greppingrelease.ymlandpublish-npm.mjsforgh release/softprops/action-gh-release/createReleasereturns zero hits — the new flow only pushes git tags.What changed
scripts/release-tags.shnow ensures three things per released package instead of one:Coverage widened beyond mirrored packages
corecore-v*configsconfigs-v*(new)codemodscodemods-v*(new)setupsetup-v*starterstarter-v*configsandcodemodsare npm-published but had no tags at all, so they get their own namespaces with no dispatch. The theme is deliberately excluded — it ships insidewebentor-starterand has no independent distribution.Naming
Release titles come from each package's own manifest
namefield rather than a hardcoded template. That reproduces the pre-changesets scheme exactly for the npm packages and yields the natural composer analogue for the PHP-only ones:Tags keep the
<ns>-v<version>form the split workflows key off — only the Release title uses the package name.Idempotency
The tag and Release checks are independent on purpose: a version whose tag already exists but whose Release is missing gets the Release backfilled on the next run. Merging this therefore creates the five missing Releases for the current committed versions. Split dispatch stays gated on a freshly created tag, so mirrors are never re-pushed.
Historical versions (
core-v0.15.4…0.15.6) are not covered by this — they need a one-off backfill pass, kept out of this PR since creating Release objects notifies watchers.Robustness
Changelog slicing tracks code fences, so a future entry containing a fenced
# commentcannot silently truncate the notes. No changelog currently has fenced blocks, but a truncated release note fails silently, so it is worth the one extra line.Verification
DRY_RUN=true bash scripts/release-tags.shagainst live origin state:bash scripts/test-release.sh --tags→ PASS (the harness already covered this script in dry-run).bash -nclean.###heading level and the codemods entry's nested sub-bullets.# commentinside a fenced block does not end the section, and the preceding version's entry is still correctly excluded.AGENTS.md"Release Workflow" updated to document all of the above.https://claude.ai/code/session_015gnVTZywLgQYkM6Epr2uW2