# Releases & Distribution
> 中文版:[release.zh-CN.md](release.zh-CN.md)
Releases are cut by the maintainer. Contributors never change `version` in `Cargo.toml` or push tags. This page describes what happens after a PR merges.
## Distribution
Packaging is driven by [cargo-dist](https://opensource.axo.dev/cargo-dist/) (pinned at 0.31.0 in `dist-workspace.toml`):
- **Installers**: shell script, PowerShell script, and a Homebrew formula pushed to the tap `zhangyee/homebrew-tap`.
- **Targets** (5): `aarch64-apple-darwin`, `x86_64-apple-darwin`, `aarch64-unknown-linux-gnu`, `x86_64-unknown-linux-gnu`, `x86_64-pc-windows-msvc`.
- Installers place the binary in `CARGO_HOME`.
## Release flow
1. The maintainer bumps `version` in `Cargo.toml` and pushes a version-shaped git tag (e.g. `v0.2.0`).
2. The tag triggers `.github/workflows/release.yml` (generated by cargo-dist), which builds artifacts for all targets and creates the GitHub Release.
3. Publish jobs then run: the Homebrew formula update, and `.github/workflows/publish-crates.yml` (invoked via `workflow_call`), which runs `cargo publish --locked` using the `CARGO_REGISTRY_TOKEN` secret.
## Versioning
SemVer, judged by the maintainer at release time from the commits since the last tag:
- new source or new user-facing capability → **minor**
- bug fix, doc, internal change → **patch**
- breaking change to CLI arguments or JSON output schema → **major**