Release new versions of sidecar. Covers version tagging with semver, td dependency updates, go.mod validation, CHANGELOG updates, GoReleaser automation, Homebrew tap updates, and verification steps...
Operator contract: docs/guides/active/releasing.md. Enforcement lives in scripts/ and
RELEASE_VERSION=vX.Y.Z make release. Prefer the one-shot command over replaying
this checklist by hand.
go.modmain identical to live origin/maincheck-release-state.sh now checks this itself via gh run list --workflow=go-ci.yml and fails closed if it's red/running/missing, so you
don't have to remember to lookmarcus/homebrew-tapreplace directives in go.modHOMEBREW_TAP_TOKEN secret present in the GitHub repo (CI tap job)Beware of go.work: always use GOWORK=off when updating dependencies and
when validating install paths.
Local lint must match CI's golangci-lint v2.12.2, or trust CI:
gh run list --workflow=go-ci.yml --limit=1
git tag -l 'v*' | sort -V | tail -1
SemVer: major / minor / patch as usual.
GOWORK=off go get github.com/marcus/td@latest
GOWORK=off go mod tidy
If td jumped several minors, decide deliberately (pin for a focused release vs take latest and note it under Dependencies). Launch the app and open the td tab when td moved.
## [vX.Y.Z] - YYYY-MM-DD
### Features
- …
### Bug Fixes
- …
### Dependencies
- …
Commit the changelog (and any dependency bump) on main, then push so
HEAD == origin/main.
# Dry-run (optional but recommended for tooling changes)
make release-snapshot
./scripts/verify-release-archives.sh dist
./scripts/test-release-guards.sh dist
./scripts/test-release-publication.sh
# Cut the release (fail-closed preflight → tag → CI → formula verify/publish)
RELEASE_VERSION=vX.Y.Z make release
What make release enforces and does is documented in docs/guides/active/releasing.md.
Resume only the tap step if the tag/release already exists:
RELEASE_VERSION=vX.Y.Z make release-tap
verify — tag points at live main, tests, snapshot archives, release guardsrelease — GoReleaser publishes GitHub release + binariesupdate-homebrew-tap — renders packaging/homebrew/sidecar.rb.tmpl and
pushes Formula/sidecar.rb with downgrade/idempotency/race guardstd/nightshift formulas are not auto-bumped; edit them by hand when co-releasing.
gh run list --workflow=release.yml --limit=1
gh release view vX.Y.Z --json assets -q '.assets[].name'
GOBIN=$(mktemp -d) GOWORK=off go install github.com/marcus/sidecar/cmd/sidecar@vX.Y.Z
"$GOBIN/sidecar" --version
go install @vX.Y.Z can 500 from the checksum DB for a minute or two after the
tag — wait and retry. Prefer a throwaway GOBIN so verification does not
clobber a dev machine's sidecar.
# Return to the canonical main development build:
make install-local
# Or keep the released Homebrew build active:
make use-homebrew
# In either case, prove the managed link and both login-shell modes:
make install-status
Prefer a new patch release. Keep tags. Resume tap with make release-tap.
See docs/guides/active/releasing.md.
check-release-state.shmain == origin/mainreplace in go.mod; GOWORK=off build works## [vX.Y.Z] - …RELEASE_VERSION=vX.Y.Z make release succeededgo install verified into throwaway GOBINmake install-status proves the dev machine is on the intended binary