./scripts/release.sh patch # 1.0.0 -> 1.0.1
./scripts/release.sh minor # 1.0.0 -> 1.1.0
./scripts/release.sh major # 1.0.0 -> 2.0.0- Preflight (aborts the whole release if any of these fail):
- Working tree must be clean (
git status --porcelainempty). - Warns (with a confirmation prompt to override) if not on
main. - Runs
scripts/validate.sh- shell syntax, ShellCheck, Brewfile, mise.toml, JSON, YAML, Markdown. - Runs
bootstrap.sh --dry-run --yes. - If
ghis installed and authenticated, checks that no GitHub Actions run for the current commit hasconclusion == "failure".
- Working tree must be clean (
- Version bump - reads
VERSION, bumps it per semver rules forpatch/minor/major. - Changelog draft - collects
git log <last-tag>..HEAD --no-merges --pretty=format:'- %s', shows you the draft, and asks for confirmation before inserting it intoCHANGELOG.md(right before the previous newest entry). - Commit + tag - writes the new
VERSION, commits both files aschore(release): vX.Y.Z, and creates an annotated tagvX.Y.Z. - Push (on confirmation) -
git push origin <branch>thengit push origin vX.Y.Z.
Pushing the vX.Y.Z tag triggers .github/workflows/release.yml, which:
- Double-checks
VERSIONmatches the tag. - Re-runs
scripts/validate.sh. - Extracts the same CHANGELOG section by version heading.
- Generates a fresh health report (
scripts/report.sh). - Publishes the GitHub Release with
Brewfile,README.md,CHANGELOG.md,VERSION, andhealth-report.txtattached.
scripts/release.sh intentionally does not call gh release create
itself - that would duplicate the CI workflow's job. If you ever need to
publish a release without CI (e.g. GitHub Actions is down), run the steps
in release.yml manually with gh release create.
If you'd rather not use scripts/release.sh (e.g. you want to hand-edit
the changelog section more carefully first):
# 1. Edit VERSION and CHANGELOG.md by hand
git add VERSION CHANGELOG.md
git commit -m "chore(release): v1.0.1"
git tag v1.0.1
git push origin main
git push origin v1.0.1This repo follows Semantic Versioning:
- patch - bug fixes, doc corrections, workflow tweaks, no interface changes.
- minor - new scripts/templates/workflows, backward compatible.
- major - breaking changes to script CLIs, removed functionality, or a restructuring of the repo layout.