release, ci, docs, skills: bump, check and publish the crates with the app release #198
No reviewers
Labels
No labels
Area/ci
Area/cli
Area/client
Area/client-core
Area/daemon
Area/deps
Area/docs
Area/grid
Area/manual
Area/nix
Area/protocol
Area/pty
Area/render
Area/shaping
Area/skills
Area/transport
Area/vt
Compat/Breaking
Kind/Bug
Kind/Documentation
Kind/Enhancement
Kind/Feature
Kind/Performance
Kind/Security
Kind/Testing
perf-regression-accepted
Reviewed
Confirmed
Reviewed
Duplicate
Reviewed
Invalid
Reviewed
Won't Fix
Status
Blocked
Status
Need More Info
Status
Upstream
No milestone
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
felis-terminal/felis!198
Loading…
Reference in a new issue
No description provided.
Delete branch "release/crates-publish"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Part of #160 (release automation). Stacked on #197; merge that first (this branch carries its commit).
Goal: a forgotten or too-small library bump stops the release, and publishing needs no long-lived credential. This is the minimal design by choice. Rare cases are left to the review step in the release skill.
Prepare:
just release-preparerunsrelease-plz update. It bumps changed libraries (patch, or minor when cargo-semver-checks finds a break) and raises the requirements on them.release-plz.tomlexcludes felis-cli, felis-client and felis-daemon so the app version never moves. release-plz and cargo-semver-checks join the dev shell.Check (tag gate,
verify-tag):tools/release/crates.py checkrefuses the tag when:cargo semver-checksfails for a library or felis-daemon's library target;release-plz updatewould still change the tree.Crates not yet on crates.io skip the last two. The tag build job also runs
just publish-dry-run.Publish (GitHub
release-mirror.yml, newcratesjob): runs after the mirror job, for final tags only. Steps:crates.py publish-planlists the crates whose version is not on crates.io. An empty list ends the job; a never-published crate fails it.cargo publish --dry-runbuilds them with no credential present.rust-lang/crates-io-auth-actionmints a token through trusted publishing, in thecrates-ioenvironment.cargo publish --no-verifyuploads them.Procedure: new skill
.agents/skills/release/SKILL.md. It covers the release PR, the manual review points, tag and watch, and the one-time setup: tag protection on both forges, thecrates-ioenvironment, and the first publish for v0.3.0.Docs: workspace.md ("Versioning", "Release gate"), implementation.md (why GitHub and trusted publishing, why release-plz only prepares), testing.md, tools/README.md.
Verified:
crates.py --self-testpasses.crates.py checkpasses on this tree.publish-planagainst real crates.io names all 12 crates as never published, as expected.ubuntu:24.04container with stable Rust and onlylibfontconfig1-devandpkg-configinstalled,cargo publish --workspace --dry-runverifies all 12 crates.release-mirror.yml.Not verifiable before the first publish: release-plz and semver-checks against a real published baseline, and trusted publishing itself. They first run when preparing the release after v0.3.0.
Reviews (pi, sol):
One-time actions for you (also in the skill):
v*tags on Forgejo and GitHub.crates-ioenvironment on GitHub.