cmux/.claude/commands/release.md
Lawrence Chen fc1de08561
Fix homebrew SHA mismatch race condition (#111)
Root cause: update-homebrew.yml triggered on release:published, which fires
before softprops/action-gh-release finishes uploading assets. The workflow
downloaded a 404 page instead of the DMG and committed its SHA.

Fix:
- Change trigger from release:published to workflow_run (fires after the
  release workflow completes, guaranteeing assets are uploaded)
- Add download validation with retries and file size checks
- Add SHA verification step before committing to the cask
- Add homebrew cask update to build-sign-upload.sh for local releases
- Add regression test (tests/test_homebrew_sha.sh)
- Update /release and /release-local skills with homebrew verification steps

Fixes #110
2026-02-19 17:44:00 -08:00

4.1 KiB

Release

Prepare a new release for cmux. This command updates the changelog, bumps the version, creates a PR, monitors CI, and then merges and tags.

Steps

  1. Determine the new version number

    • Get the current version from GhosttyTabs.xcodeproj/project.pbxproj (look for MARKETING_VERSION)
    • Bump the minor version unless the user specifies otherwise (e.g., 0.12.0 → 0.13.0)
  2. Create a release branch

    • Create branch: git checkout -b release/vX.Y.Z
  3. Gather changes since the last release

    • Find the most recent git tag: git describe --tags --abbrev=0
    • Get commits since that tag: git log --oneline <last-tag>..HEAD --no-merges
    • Filter for end-user visible changes only - ignore developer tooling, CI, docs, tests
    • Categorize changes into: Added, Changed, Fixed, Removed
  4. Update the changelog

    • Add a new section at the top of CHANGELOG.md with the new version and today's date
    • Only include changes that affect the end-user experience - things users will see, feel, or interact with
    • Write clear, user-facing descriptions (not raw commit messages)
    • Also update docs-site/content/docs/changelog.mdx with the same content
    • If there are no user-facing changes, ask the user if they still want to release
  5. Bump the version in Xcode project

    • Update all occurrences of MARKETING_VERSION in GhosttyTabs.xcodeproj/project.pbxproj
    • There are typically 4 occurrences (Debug/Release for main app and CLI)
  6. Commit and push the release branch

    • Stage: CHANGELOG.md, docs-site/content/docs/changelog.mdx, GhosttyTabs.xcodeproj/project.pbxproj
    • Commit message: Bump version to X.Y.Z
    • Push: git push -u origin release/vX.Y.Z
  7. Create a pull request

    • Create PR: gh pr create --title "Release vX.Y.Z" --body "...changelog summary..."
    • Include the changelog entries in the PR body
  8. Monitor CI

    • Watch the CI workflow: gh pr checks --watch
    • If CI fails, fix the issues and push again
    • Wait for all checks to pass before proceeding
  9. Merge the PR

    • Merge: gh pr merge --squash --delete-branch
    • Switch back to main: git checkout main && git pull
  10. Create and push the tag

    • Create tag: git tag vX.Y.Z
    • Push tag: git push origin vX.Y.Z
  11. Monitor the release workflow

  12. Verify homebrew cask update

    • The "Update Homebrew Cask" workflow triggers automatically after the release workflow completes
    • Watch: gh run list --workflow=update-homebrew.yml --limit=1 and gh run watch
    • Verify: cd homebrew-cmux && git pull && grep version Casks/cmux.rb
    • Run bash tests/test_homebrew_sha.sh to confirm the SHA matches
  13. Notify

    • On success: say "cmux release complete"
    • On failure: say "cmux release failed"

Changelog Guidelines

Include only end-user visible changes:

  • New features users can see or interact with
  • Bug fixes users would notice (crashes, UI glitches, incorrect behavior)
  • Performance improvements users would feel
  • UI/UX changes
  • Breaking changes or removed features

Exclude internal/developer changes:

  • Setup scripts, build scripts, reload scripts
  • CI/workflow changes
  • Documentation updates (README, CONTRIBUTING, CLAUDE.md)
  • Test additions or fixes
  • Internal refactoring with no user-visible effect
  • Dependency updates (unless they fix a user-facing bug)

Writing style:

  • Use present tense ("Add feature" not "Added feature")
  • Group by category: Added, Changed, Fixed, Removed
  • Be concise but descriptive
  • Focus on what the user experiences, not how it was implemented
  • Link to issues/PRs if relevant

Example Changelog Entry

## [0.13.0] - 2025-01-30

### Added
- New keyboard shortcut for quick tab switching

### Fixed
- Memory leak when closing split panes
- Notification badges not clearing properly

### Changed
- Improved terminal rendering performance