Terminal Control releases one aligned version across the public terminal-control crate, the
@kitlangton/terminal-control client, the @kitlangton/terminal-control-opentui adapter, and four native npm
packages. The manual npm-release.yml workflow builds and validates the complete aligned tarball
set, then publishes those exact artifacts. crates.io publication and the GitHub release are separate
explicit steps.
Prepare releases from an up-to-date main after feature CI passes. User-facing changes must already
have Changesets.
- Run
bun run version-packages. The fixed npm package group must resolve to one version. - Set the same version in
Cargo.toml, then refresh theterminal-controlentry inCargo.lock. - Update the workspace package versions and native optional-dependency versions recorded in
bun.lock. Verify them explicitly; current Bun versions can preserve stale workspace metadata even afterbun install --force. - Verify the Changesets were consumed and the npm changelogs describe the release.
- Commit these files as
chore: release terminal-control X.Y.Zand merge that release commit tomainthrough CI.
Native packaging rejects a Rust executable whose termctrl --version differs from its npm package
manifest. The OpenTUI manifest must already match the TypeScript client before publishing. Do not
bypass the package-set checks or publish package formats at different versions.
bun run validate:opentui packs the current adapter into a temporary directory and checks its
public exports from clean consumers against OpenTUI 0.4.1 and 0.4.5. It rejects version mismatch
without rewriting manifests or attempting publication. To check an already assembled artifact,
pass its directory: bun run validate:opentui npm-artifacts.
Run the complete local validation from AGENTS.md, followed by the publishable crate checks:
cargo package
cargo publish --dry-run --lockedThen assemble and validate all npm artifacts without publishing:
gh workflow run npm-release.yml --ref main -f publish=falseConfirm the workflow run targets the intended release commit. Its matrix builds macOS and Linux binaries for arm64 and x64, verifies the complete fixed-version tarball set, and installs the packed client from clean Bun and Node/Vitest consumers. It also installs the packed OpenTUI adapter into clean consumers against the oldest and newest supported OpenTUI versions.
npm cannot configure a trusted publisher before a package exists. Before the adapter's first normal
release workflow, download its already validated tarball, publish that exact artifact once with a
short-lived bootstrap credential, configure anomalyco/terminal-control and npm-release.yml as its
trusted publisher with a security key, then revoke the credential. Do not publish a separately
rebuilt package directory.
The aligned publisher checks or publishes the adapter before the established packages, so a missing bootstrap or OIDC binding fails before it can partially publish the fixed group.
Publishing is an irreversible public release. From the validated release commit:
cargo publish --locked
gh workflow run npm-release.yml --ref main -f publish=trueThe npm workflow runs node scripts/release-packages.mjs, which publishes the validated aligned
tarball set. The publisher is retry-safe and skips an exact package version already present in npm.
crates.io publication requires Cargo credentials for an owner of terminal-control; do not add
registry tokens to the repository.
After both registries report the new version, create the matching tag and GitHub release:
gh release create vX.Y.Z --target main --generate-notes --title "Terminal Control vX.Y.Z"Verify the public artifacts:
cargo info terminal-control
npm view @kitlangton/terminal-control versionInstall the released package in a clean consumer and confirm termctrl --version reports X.Y.Z.
Each npm package, including the OpenTUI adapter, must configure anomalyco/terminal-control and
workflow npm-release.yml as its trusted publisher. The publish job uses Node 24, current npm, and
id-token: write; it does not use a long-lived npm token.