Everything below is prepared but not yet executed — the repo is still private
(chatbot-pf/shunt) and nothing has been published. The plan: transfer to
pleaseai/shunt, make it public, then release. This is the go-live sequence.
- Dual license:
LICENSE-MIT+LICENSE-APACHE(MIT OR Apache-2.0), copyright Passion Factory, matching the other pleaseai OSS tools. - Cargo metadata: the package publishes as
shunt-gateway(the bareshuntname on crates.io is taken by an unrelated project); the library and binary are still namedshunt, socargo install shunt-gatewayinstalls ashuntbinary and no source changes were needed.cargo publish --dry-runpasses; the tarball is trimmed viainclude(54 KiB compressed). - Release CI:
.github/workflows/release.ymltriggers onv*tags — buildsshunt-darwin-arm64/shunt-darwin-x64(macos-14) andshunt-linux-x64/shunt-linux-arm64(musl, static) on native runners, creates a GitHub release with the binaries +SHA256SUMS, then publishesshunt-gatewayto crates.io. All third-party actions are pinned to full commit SHAs. - Homebrew formula draft:
packaging/homebrew/shunt.rb, following thepleaseai/homebrew-tapbinary-release pattern used bycsp.rb/ask.rb.
- Make the repo public. Preferably transfer
chatbot-pf/shunt→pleaseai/shunt(matches the tap convention — every formula inpleaseai/homebrew-tappoints at thepleaseaiorg — and the org's open-source standards). The transfer needs org admin permissions. If the repo ends up anywhere other thanpleaseai/shunt, updaterepositoryinCargo.tomland the URLs inpackaging/homebrew/shunt.rb. Also updateREADME.md's "private, early" status line. - Publish
shunt-gatewayv0.1.0 to crates.io manually — Trusted Publishing can only be configured for a crate that already exists, so the first publish uses a personal API token (crates.io → Account Settings → API Tokens, scopepublish-new):The publishing account owns the crate; add other owners withcargo publish --locked --token <token>
cargo owner --add. Then set up OIDC for future releases:- crates.io →
shunt-gateway→ Settings → Trusted Publishing → add GitHub: repositorypleaseai/shunt, workflowrelease.yml, environmentrelease. - GitHub → repo Settings → Environments → create an environment named
release(optionally with required reviewers / tag-only deployment branches). Thepublish-cratejob inrelease.ymlauthenticates viarust-lang/crates-io-auth-action(id-token: write) — no long-lived token secret. Note: on the first tag push the job will fail (the crate was just published manually with the same version); that's expected and harmless.
- crates.io →
- Set up the release-please GitHub App credentials. Releases are cut by
release-please (
.github/workflows/release-please.yml): it opens a release PR from conventional commits, and merging that PR creates thev<version>tag + GitHub release. It authenticates with a GitHub App token (the defaultGITHUB_TOKENwould not triggerrelease.ymlon the tag it pushes):- Create a GitHub App (org → Settings → Developer settings → GitHub Apps) with
repository permissions Contents: read & write and Pull requests: read &
write, and install it on
pleaseai/shunt. - Set the
RELEASE_GITHUB_APP_CLIENT_IDrepository variable and theRELEASE_GITHUB_APP_PRIVATE_KEYrepository secret (the app's PEM key).
- Create a GitHub App (org → Settings → Developer settings → GitHub Apps) with
repository permissions Contents: read & write and Pull requests: read &
write, and install it on
- Merge the release PR. release-please proposes
v0.1.0(manifest starts at0.0.0; thefeat:history bumps it to0.1.0, matchingCargo.toml). Merging tagsv0.1.0and creates the GitHub release; the tag then triggersrelease.yml, which builds the four binaries and uploads them +SHA256SUMSto that release, and publishesshunt-gatewayto crates.io via Trusted Publishing. - Publish the formula. Copy
packaging/homebrew/shunt.rbintopleaseai/homebrew-tapasshunt.rb, fill in the foursha256values from the release'sSHA256SUMSasset, and open a PR against the tap. Then:brew install pleaseai/tap/shunt
Land conventional commits on main; release-please keeps a release PR up to date
(feat: → minor, fix: → patch, feat!:/BREAKING CHANGE: → major). Merge the PR
when ready — it bumps Cargo.toml/Cargo.lock, updates CHANGELOG.md, tags, and the
rest of the pipeline (binaries, crates.io) runs automatically. Then update version +
the four sha256 values in the tap's shunt.rb. To force a specific version, add a
Release-As: x.y.z footer to a commit.
- The linux binaries are musl static builds to avoid glibc version constraints. If a
dependency ever grows a C dependency that breaks musl, switch the linux targets in
release.ymlto-gnuand accept the newer-glibc floor. cargo install shunt-gatewayis the crates.io install path; homebrew is the binary path. Both produce ashuntbinary.- The
publish-cratejob runs after the GitHub release; if it fails (e.g. Trusted Publishing not yet configured, or the version already exists on crates.io), the release itself is unaffected — fix andcargo publishmanually from the tag.