This repo uses Changesets for version orchestration and two publish paths:
the CLI (executor npm package plus its platform packages) and the
@executor-js/* library packages (core, sdk, and the public plugins).
- Add a changeset in the PR that should ship:
bun run changeset
- Merge that PR to
main. .github/workflows/release.ymlopens or updates aVersion PackagesPR.- Merge the
Version PackagesPR. - The release workflow then does two things in parallel:
- Publishes every
@executor-js/*library package whose current version is not already on npm, viabun run release:publish:packages(seescripts/publish-packages.ts). - If
apps/cli/package.jsonbumped, tags the commit and dispatches.github/workflows/publish-executor-package.yml, which:- runs
bun run release:check - performs a full dry-run release build before publish
- publishes the CLI npm package under the correct dist-tag
- creates or updates the GitHub release with build artifacts
- runs
- Publishes every
Enter prerelease mode before starting a beta train:
bun run release:beta:start
That commits .changeset/pre.json into the repo and causes future release PRs to produce versions like 1.5.0-beta.0, 1.5.0-beta.1, and so on.
When the beta train is done:
bun run release:beta:stop
Stable versions publish to npm under latest.
Beta versions publish to npm under beta.
To build the full CLI release payload without publishing to npm or GitHub:
bun run release:publish:dry-run
That produces:
- platform archives in
apps/cli/dist - the packed wrapper tarball in
apps/cli/dist/release
To pack the @executor-js/* library packages without publishing:
bun run release:publish:packages:dry-run
User-facing release notes live at apps/cli/release-notes/next.md —
one rolling file. This is the single source of truth users see. Edit
it whenever you ship a user-visible change.
apps/cli/src/release.ts reads next.md and uses its contents as the
GitHub Release body. If the file is missing or empty it falls back to
gh release create --generate-notes (auto-generated from PR titles).
There's no per-version archive in the repo — historical release bodies
live on GitHub Releases (durable, indexed, linkable). When you start a
new release cycle, replace the existing next.md content with your new
entries; the previous cycle's content is already preserved on the
matching vX.Y.Z release page.
Use this section structure (mirrors what's already in next.md):
## Highlights
### <user-facing story>
bullets of concrete user value
## Fixes
## Breaking changes
### <specific surface>
before / after code blocks for migrationsLead with user-visible stories, not commit subjects. Group related commits into one story. Keep bullets single-line so diffs and dedupe tooling stay simple.
For external contributors, end the bullet with Thanks @<user> and the
PR ref:
- OAuth2 client-credentials flow end-to-end. Thanks @octocat (#456)Don't Thanks maintainers, bots, or the repo owner. The lint script
(bun run lint:release-notes) rejects Thanks @claude,
Thanks @rhyssullivan, Thanks @github-actions, etc. — the full list
is in scripts/check-release-notes.ts. Run it before pushing release
notes.
If your PR adds a .changeset/*.md for the executor package, also
edit apps/cli/release-notes/next.md. The changeset describes the
version bump; the release-notes file describes the user impact. They're
different audiences and shouldn't be conflated.
The .changeset/*.md body is fine as a one-liner pointing at the
release-notes section it expands.
- Changesets owns the published CLI version via
apps/cli/package.json. - Only
apps/cli/package.jsonshould change during release versioning; the rest of the workspace is not version-synced for release PRs. - Changesets changelog file generation is disabled (
changelog: falsein.changeset/config.json), but per-packageCHANGELOG.mdstubs are still committed. Thechangesets/action@v1GitHub Action (the wrapper around the CLI used inrelease.yml) reads each bumped package'sCHANGELOG.mdto build the Version Packages PR description and crashes withENOENTif any are missing. The stubs satisfy that read; the changesets CLI alone doesn't need them. - The publish workflow supports either npm trusted publishing or an
NPM_TOKENsecret. - Re-running the publish workflow for the same tag is safe for packages that are already on npm; existing versions are skipped.