# Release workflow
Cut a new `stax` release with an auto-generated changelog entry.
```bash
make release # defaults to a minor bump
make release LEVEL=patch # patch bump
make release LEVEL=major # major bump
```
During `cargo release`'s pre-release hook, [git-cliff](https://git-cliff.org/) regenerates the whole `CHANGELOG.md` from the git history, treating the commits since the latest `v<major>.<minor>.<patch>` tag as the version being released. Configuration lives in [`cliff.toml`](../../cliff.toml).
## What gets generated
git-cliff groups commits by their [conventional-commit](https://www.conventionalcommits.org) type:
| `feat:` | `π Features` |
| `fix:` | `π Bug Fixes` |
| `refactor:` | `π Refactor` |
| `perf:` | `β‘ Performance` |
| `docs:` | `π Documentation` |
| `style:` | `π¨ Styling` |
| `test:` | `π§ͺ Testing` |
| `chore:` / `ci:` | `βοΈ Miscellaneous Tasks` |
| `revert:` | `βοΈ Revert` |
| anything else | `πΌ Other` |
PR references like `(#123)` become links to the GitHub repo. The automated `chore: Release stax version β¦` commits and `chore(depsβ¦)` bumps are skipped. Non-conventional squash-merge subjects are kept (in `πΌ Other`) rather than dropped, so no change silently disappears.
## Notes
- `make release` defaults to a minor bump. Use `LEVEL=patch`, `LEVEL=minor`, or `LEVEL=major` to control the semver bump.
- For a dry run, invoke `cargo release <level> --no-confirm` directly without `--execute`; cargo-release skips the version bump, tag, and push. git-cliff still rewrites `CHANGELOG.md` in place β run `git checkout CHANGELOG.md` to discard it.
- Preview the upcoming entry without touching the file: `git-cliff --unreleased --tag v<next-version>`.
- git-cliff must be installed locally (`cargo install git-cliff`) for `make release` to work.