Repository navigation
Conversation
- Generate independent release PRs and changelogs from Conventional Commit squash titles for all six npm and Composer packages. - Keep npm publishing in its trusted-publisher workflow. Call the Composer split workflow directly because tags created with GITHUB_TOKEN do not trigger push workflows. - Validate PR titles and document approval of release PR workflow runs. Replace manual changelog instructions with the automated flow. - Seed the manifest from the manual releases completed before cut-over, with bootstrap-sha excluding changes already released.
Adi-ty
force-pushed
the
ci/release-please
branch
from
November 7, 2026 00:54
6f45f30 to
8b6d87d
Compare
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.
What this PR does
Releases all six packages with release-please, as wp-shared-workflows, plugin-elementary and theme-elementary already do.
CHANGELOG.md, tags it and publishes a GitHub release.Closes
N/A
Changes
release-please-config.jsonand.release-please-manifest.json:separate-pull-requestson;@rtcamp/<package>@<version>for npm andrtcamp/<package>@<version>for Composer, the formrelease-php.ymlacts on;featis Added,fixis Fixed, andperf,revertandbuildare Changed. Other types release nothing.package.json. A jsonextra-filesentry bumps the package's entry in the rootpackage-lock.json, which thenodestrategy leaves alone.@rtcamp/eslint-configrelease also rewrites the other three workspaces'@rtcamp/eslint-configdevDependency range to^<new version>, in theirpackage.jsonand in the root lockfile. Those workspaces are not bumped or released.always-link-local: falseis ignored, so dependents are pulled into a release even when their declared range already covers the new version googleapis/release-please#2876, #2908 or #2419 changes that.composer.jsonhas noversion, so onlyCHANGELOG.mdchanges.release.ymlrunsgoogleapis/release-please-actionv5.0.0 (pinned by SHA) withGITHUB_TOKEN.GITHUB_TOKENstart no workflows, so itsrelease-phpjob callsrelease-php.ymlfor each Composer release.package.json, which already startspublish-npm-packages.yml. Publishing has to stay in that file, because the trusted publisher is tied to its name.release-php.ymlgains aworkflow_callentry point that takes the tag and the two deploy keys, and checks out the tagged commit. A tag pushed by hand still releases through the tag trigger.pr-title.ymlis the same title check that plugin-elementary and theme-elementary run.CHANGELOG.mdloses## [Unreleased], because release-please inserts each release above the first version heading and would strand anything left under it. In its place, a line names the last hand-written release ("Entries for releases after 2.0.0 are written by release-please …").AGENTS.md(root and wp-tooling),CONTRIBUTING.md, the PR template and the task template describe the new flow. The task template now targetsmainwith a Conventional PR title, since a[<milestone>]title fails the check..github/release.ymland.github/labels.yml(both chore: add issue forms, SECURITY.md, CODEOWNERS, labels and release notes config #92), andmonorepo-builder.php.How I verified
actionlintpasses on every workflow, both JSON files parse, andnpm run checkpasses.main, with this branch's config:With
bootstrap-shaat the feat(eslint-config): accept @wordpress/eslint-plugin 26 and 27 #79 merge and today's versions, it opens exactly two release PRs:@rtcamp/wp-tooling2.1.0 (feat(detect-changes): count ES-module and TypeScript files in the js bucket #80);rtcamp/wp-phpstan1.1.0 (feat(phpstan): run shared baseline at level 8 #83).The new CHANGELOG sections land above the top version heading, the lockfile's wp-tooling version becomes 2.1.0, and
composer.jsonis unchanged.With
bootstrap-shaatmain's head and the cut-over manifest, it opens none.@rtcamp/eslint-config3.0.0 release to feat(eslint-config)!: match the @wordpress/scripts default config #94's branch, using release-please's own updaters.package.jsonand in the lockfile, with^kept.npm cipasses, andnpm install --package-lock-onlychanges nothing.release.ymlcalledrelease-php.yml. The mirror got exactly the expectedgit subtree splitcommit and tag, and the other package was untouched.eslint-configrelease also rewrote the dependent workspace's range in itspackage.jsonand in the lockfile. The dependent got no release of its own, andnpm cipasses on the result.Reviewer notes
Stacked on feat(release): release Composer packages separately #97, which sits on ci(npm): publish workspaces to npm from main with trusted publishing #71. This stays a draft until the cut-over:
rtcamp/wp-phpstan@2.0.0on that commit.main, setbootstrap-shatomain's head, and check the manifest against npm and Packagist.The first run after this merges should open no release PR.
Why
bootstrap-shagoes at the cut-over: release-please assigns commits to packages by the files they touch, not by scope. feat(eslint-config)!: match the @wordpress/scripts default config #94 (feat(eslint-config)!) also edits the other three workspaces, so an earlier SHA would propose a major release of all four.Open PRs: a PR that merges before the cut-over goes into the hand releases. One that merges after it drops its CHANGELOG hunk, and its title becomes the entry. This covers feat(init): add cleanup.replace and cleanup.unset #68, fix(scaffolds): ask for lint/phpstan paths instead of hardcoding them #84, fix(scaffolds): call wp-shared-workflows at @v1 and let .nvmrc pick Node #89, fix(detect-changes): bucket the tool config files each job depends on #90, feat(iapi-check): flag Interactivity API usages that WordPress 7.2 removes #91, fix(cli): flush stdout before exiting #93 and chore(wp-tooling): move the ESLint scaffold to @rtcamp/eslint-config 2 and fix JSDoc warnings #95.