Scode Dist Rust Setup
Set up a Rust repository to match the release/distribution pattern used in juggler: dist-generated release workflow,
Homebrew publishing through scode/homebrew-dist-tap, Linux-focused CI, macOS release-plan gating on tags, and
git-cliff changelog governance.
Required Inputs
Collect these values before making changes:
crate_name: Required. Read fromCargo.toml([package].name).github_owner/repo: Derive fromgit remote get-url origin. Prompt only if parsing is ambiguous.cargo_dist_version: Install/update dist first, then pin the discovered version indist-workspace.toml.
Hard Defaults
Apply these defaults unless the user explicitly asks to diverge:
- Homebrew tap repository:
scode/homebrew-dist-tap - Homebrew token secret:
HOMEBREW_TAP_TOKEN - Homebrew install command namespace:
scode/dist-tap/<crate_name> - Dist installers:
homebrewonly - Dist targets:
aarch64-apple-darwin,x86_64-apple-darwin,aarch64-unknown-linux-gnu,x86_64-unknown-linux-gnu - Dist plan hook:
plan-jobs = ["./release-plan-tests"] - CI platform focus: Linux for standard CI, macOS only as tag-gated release-plan test
Workflow
Phase A: Discover Project Facts
- Confirm the repository root contains
Cargo.toml. - Extract
crate_namefromCargo.toml. - Derive
github_owner/repofromgit remote get-url origin. - Detect existing files that may need updates instead of replacement:
dist-workspace.toml.github/workflows/ci.yml.github/workflows/release.yml.github/workflows/release-plan-tests.yml.github/workflows/conventional-commit-pr-title.ymlcliff.tomlCONTRIBUTING.mdREADME.md
Phase B: Install or Update cargo-dist and Capture Version
- Install or update dist using your preferred method.
- Capture the version from
dist --version. - Pin that exact version string as
cargo-dist-versionindist-workspace.toml. - Do not leave
cargo-dist-versionunpinned.
Phase C: Configure dist-workspace.toml
- Create or update
dist-workspace.tomlusingreferences/dist-workspace-template.md. - Keep these values exact unless the user explicitly asks otherwise:
ci = "github"installers = ["homebrew"]install-path = "CARGO_HOME"install-updater = truetap = "scode/homebrew-dist-tap"publish-jobs = ["homebrew"]plan-jobs = ["./release-plan-tests"]
- Use the discovered dist version from Phase B for
cargo-dist-version.
Phase D: Ensure Cargo.toml is ready for dist
- Ensure
Cargo.tomlhasrepository = "https://github.com/<owner>/<repo>"— dist requires this for GitHub CI. - Ensure
Cargo.tomlhasdescriptionandhomepage— Homebrew publishing warns without them. [profile.dist]will be added automatically bydist init --yesin Phase E.
Phase E: Generate Dist Release Workflow with dist init
dist init --yes is the primary tool for this phase. It:
- Adds
[profile.dist]toCargo.tomlif missing. - Reformats
dist-workspace.tomlwith comments (preserving values). - Generates
.github/workflows/release.yml— this file is dist-managed and must never be hand-edited.
Steps:
- Write
dist-workspace.tomlfirst (Phase C). - Ensure
Cargo.tomlhasrepository,description,homepage(Phase D). - Run
dist init --yesto generate everything. The--yesflag auto-accepts defaults (required for non-interactive). - If
dist-workspace.tomlis changed later, re-rundist init --yes.
Phase F: Install Linux/macOS CI Pattern
- Create or update
.github/workflows/ci.ymlusingreferences/ci-linux-macos-pattern.md. - Keep standard CI Linux-focused.
- Keep a macOS job disabled in standard CI for cost control.
- Omit Windows baseline jobs unless explicitly requested.
Phase G: Add Release Plan Test Workflow
This file is NOT generated by dist init. It is a manually-maintained reusable workflow that the dist-generated
release.yml calls via plan-jobs = ["./release-plan-tests"]. Create it AFTER running dist init (Phase E) so you can
verify release.yml references it correctly.
- Create or update
.github/workflows/release-plan-tests.ymlusingreferences/release-plan-tests-template.md. - Run Linux tests on workflow call.
- Run macOS tests only when
github.refis a tag ref. - Ensure
dist-workspace.tomlincludesplan-jobs = ["./release-plan-tests"]. - Verify the generated
release.ymlcontains acustom-release-plan-testsjob that calls this workflow.
Phase H: Enforce Conventional Commit PR Titles
-
Create or update
.github/workflows/conventional-commit-pr-title.ymlusingreferences/conventional-commit-pr-title-workflow.md. -
Enforce these allowed types:
feat,fix,docs,doc,perf,refactor,style,test,chore,ci,revert
-
Keep scope optional.
-
Enforce classification policy in repository docs:
- Type must reflect user-visible behavior, not implementation activity.
- CLI interface/behavior changes (commands, flags/options, arguments, output contract, exit codes, documented usage)
must be
feat,fix, orperf(use!when breaking), notrefactor. refactor,style,test,chore,ci,docs, anddocare for non-user-visible changes only.
-
Update
CLAUDE.mdto require Conventional Commit style PR titles. Add a section like:# PR titles PR titles must follow [Conventional Commits](https://www.conventionalcommits.org/) style. This is enforced by CI and used by git-cliff for changelog generation. Allowed types: `feat`, `fix`, `docs`, `doc`, `perf`, `refactor`, `style`, `test`, `chore`, `ci`, `revert`. Scope is optional. Examples: `feat: add user login`, `fix(parser): handle empty input`. Type must reflect user-visible behavior, not implementation activity. CLI interface/behavior changes must be `feat`, `fix`, or `perf` (use `!` when breaking), not `refactor`.If
CLAUDE.mdalready has a section about commit messages or PR titles, extend it rather than duplicating.
Phase I: Set Up git-cliff and Release Documentation
-
If
cliff.tomlis missing, initialize it with:git cliff --init keepachangelog
-
If
cliff.tomlalready exists, avoid replacing it with a hardcoded template unless the user explicitly requests that migration. -
Keep the config compatible with Conventional Commit-driven changelogs and default it to user-visible entries only.
- Include by default:
feat,fix,perf,revert. - Skip by default:
refactor,style,test,chore,ci,docs,doc. - Parse override tags first:
changelog: includeforces inclusion,changelog: skipforces exclusion. - If both tags are present,
changelog: skipwins.
- Include by default:
-
Update
CONTRIBUTING.mdwith:- Conventional Commit requirements for commit messages and PR titles.
- Classification policy: type reflects user-visible behavior; CLI interface changes are never
refactor. - Note that PR title enforcement is implemented in
.github/workflows/conventional-commit-pr-title.yml. - Changelog generation uses git-cliff and root
CHANGELOG.md. - Override tag behavior for
changelog: include/changelog: skip. - An agent-centric Releasing section using the content from
references/release-checklist.md. This section is written as instructions for an AI agent so that a user can say "cut a release" and the agent guides them through the entire version bump, changelog, PR, merge, tag, and release watch flow.
-
Update
CLAUDE.mdwith a Releasing section that tells agents to follow CONTRIBUTING.md:# Releasing When the user asks to "make a release" or "cut a release", follow the Releasing section of `CONTRIBUTING.md`.If
CLAUDE.mdalready has a releasing section, update it rather than duplicating.
Phase J: Wire Homebrew Distribution
- Ensure dist config uses
tap = "scode/homebrew-dist-tap". - Ensure the repository has secret
HOMEBREW_TAP_TOKENfor release publishing. - Verify generated release workflow includes
publish-homebrew-formulaand checks outscode/homebrew-dist-tap. - Document installation in
README.mdas:brew install scode/dist-tap/<crate_name>
Verification Checklist
Run these checks after setup:
rg -n 'cargo-dist-version|tap = "scode/homebrew-dist-tap"|plan-jobs' dist-workspace.tomlrg -n '^\[profile\.dist\]' Cargo.tomlrg -n 'custom-release-plan-tests|publish-homebrew-formula|HOMEBREW_TAP_TOKEN' .github/workflows/release.ymlrg -n 'test-linux|test-macos' .github/workflows/release-plan-tests.ymlrg -n 'action-semantic-pull-request|types:' .github/workflows/conventional-commit-pr-title.ymlrg -n 'Conventional Commits|PR titles|Releasing|CONTRIBUTING.md' CLAUDE.mdrg -n 'conventional_commits = true' cliff.tomlrg -n 'git-cliff --tag|CHANGELOG\.md|Conventional Commits|cut a release|bump' CONTRIBUTING.mdrg -n 'brew install scode/dist-tap/' README.md
Resources
Use these files to avoid rewriting long templates:
references/dist-workspace-template.mdreferences/ci-linux-macos-pattern.mdreferences/release-plan-tests-template.mdreferences/conventional-commit-pr-title-workflow.mdreferences/git-cliff-and-changelog-flow.mdreferences/release-checklist.md
Scan to join WeChat group