Releasing
Releasing
Section titled “Releasing”Sephera currently has two release surfaces:
- crates.io publishing for
cargo install sephera - binary GitHub Releases for users who want a prebuilt download
The crates.io flow is still a two-step publish because the CLI package depends on sephera_core.
Release order
Section titled “Release order”- publish
sephera_core - wait for the new version to appear in the crates.io index
- publish
sephera
sephera_tools is internal-only and is not published.
crates.io workflow
Section titled “crates.io workflow”The repository also includes a manual GitHub Actions workflow:
.github/workflows/publish.ymlUse it through workflow_dispatch when you want a guarded release from GitHub.
The workflow:
- runs the release checks again
- publishes
sephera_corefirst - waits for the new version to appear in the crates.io index
- publishes
sephera
It expects:
- a protected
releaseenvironment - a
CRATES_IO_TOKENsecret in thatreleaseenvironment, with publish access
If the workflow editor shows a warning such as Context access might be invalid: CRATES_IO_TOKEN, that usually means the secret is not visible to static analysis from the repository alone. The workflow still works once CRATES_IO_TOKEN is created in the protected release environment.
Binary release workflow
Section titled “Binary release workflow”Binary archives are handled by a separate GitHub Actions workflow:
.github/workflows/release.ymlThis workflow uses a hybrid trigger:
workflow_dispatchfor manual alpha or prerelease buildspushon stablev*tags for production GitHub Releases
It does not create tags for you. Maintainers are expected to create the tag first, then either push it for an automatic stable release or select the matching ref/tag manually through workflow_dispatch.
The binary release workflow:
- reruns formatting, linting, tests, and docs build in a preflight job
- builds
sepherafor four desktop targets - packages each target as an archive containing the binary and
LICENSE - generates
SHA256SUMS.txt - creates or updates the matching GitHub Release and uploads the assets
Binary targets
Section titled “Binary targets”x86_64-pc-windows-msvcas.zipx86_64-unknown-linux-muslas.tar.gzx86_64-apple-darwinas.tar.gzaarch64-apple-darwinas.tar.gz
Binary artifact naming
Section titled “Binary artifact naming”Each binary archive follows the same naming convention:
sephera-{tag}-{target}.zipsephera-{tag}-{target}.tar.gzExample:
sephera-v0.3.0-x86_64-unknown-linux-musl.tar.gzcrates.io checklist
Section titled “crates.io checklist”Before publishing:
- bump the workspace version
- run formatting, linting, tests, and the docs build
- run
cargo publish --dry-run -p sephera_core - run
cargo publish --dry-run -p sephera --config "patch.crates-io.sephera_core.path='crates/sephera_core'" - publish
sephera_core - wait briefly for index propagation
- publish
sephera
Binary release checklist
Section titled “Binary release checklist”Before pushing a stable v* tag or triggering a manual prerelease:
- make sure the release ref is committed and pushed
- create the release tag first
- verify the release workflow will build from the same ref as the tag
- confirm the generated asset names match the
sephera-{tag}-{target}convention - verify
SHA256SUMS.txtis attached alongside the archives
Verification commands
Section titled “Verification commands”cargo fmt --all --checkcargo clippy --workspace --all-targets --all-features -- -D warningscargo test --workspacenpm run docs:buildcargo publish --dry-run -p sephera_corecargo publish --dry-run -p sephera --config "patch.crates-io.sephera_core.path='crates/sephera_core'"cargo build --locked --release --bin sepheraPackaging notes
Section titled “Packaging notes”sepherais the user-facing install cratesephera_coreis the companion library cratesephera_toolsstays unpublishedpublish.ymlis for crates.io publishing, whilerelease.ymlis for prebuilt GitHub release assets- the crates.io READMEs are separate from the GitHub landing README so each surface can stay focused on its own audience