Summary
claude update reports a newer version is available and instructs users to run brew upgrade claude-code, but the Homebrew cask formula is pinned to an older stable version. This creates a circular dead end where the user can never actually update.
Steps to Reproduce
- Install Claude Code via Homebrew (
brew install claude-code) — installs 2.1.81
- Set
autoUpdaterChannel to "latest" in ~/.claude/settings.json
- Run
claude update
Output:
Current version: 2.1.81
Checking for updates to latest version...
Claude is managed by Homebrew.
Update available: 2.1.81 → 2.1.87
To update, run:
brew upgrade claude-code
- Run
brew upgrade claude-code
Output:
Warning: Not upgrading claude-code, the latest version is already installed
Root Cause
- The Homebrew cask tracks the stable release channel (confirmed via
livecheck URL: claude-code-releases/stable which returns 2.1.81)
- The cask formula on GitHub HEAD also says
version "2.1.81"
claude update checks the latest channel (per user setting), finds 2.1.87, but then tells the user to use brew upgrade which can only install what the stable cask provides
brew update --force, brew fetch --force, re-tapping homebrew/cask, and clearing the API cache all confirm 2.1.81 is the correct stable version
Additional Context
- A second machine (MacBook) with the same Homebrew cask installed shows v2.1.87 — likely because the in-app auto-updater overwrote the binary in-place, which is inconsistent with Homebrew's package management
- The cask's own caveats acknowledge this tension: "This cask tracks the stable release channel. In-app update notifications default to the latest channel regardless."
Expected Behavior
Either:
claude update should respect that a Homebrew-managed installation can only update via the stable channel, and not advertise "latest" channel versions with a brew upgrade instruction that can't fulfill them, OR
- The in-app auto-updater should work consistently for Homebrew installations when
autoUpdaterChannel is set to "latest" (updating the binary in-place), OR
- The Homebrew cask should track the latest channel instead of stable
Environment
- macOS (Darwin 25.4.0, Apple Silicon)
- Homebrew 4.x
- Claude Code 2.1.81 (via
brew install claude-code)
autoUpdaterChannel: "latest" in settings
— Claude Code (Opus 4.6)
Summary
claude updatereports a newer version is available and instructs users to runbrew upgrade claude-code, but the Homebrew cask formula is pinned to an older stable version. This creates a circular dead end where the user can never actually update.Steps to Reproduce
brew install claude-code) — installs 2.1.81autoUpdaterChannelto"latest"in~/.claude/settings.jsonclaude updateOutput:
brew upgrade claude-codeOutput:
Root Cause
livecheckURL:claude-code-releases/stablewhich returns2.1.81)version "2.1.81"claude updatechecks the latest channel (per user setting), finds 2.1.87, but then tells the user to usebrew upgradewhich can only install what the stable cask providesbrew update --force,brew fetch --force, re-tappinghomebrew/cask, and clearing the API cache all confirm 2.1.81 is the correct stable versionAdditional Context
Expected Behavior
Either:
claude updateshould respect that a Homebrew-managed installation can only update via the stable channel, and not advertise "latest" channel versions with abrew upgradeinstruction that can't fulfill them, ORautoUpdaterChannelis set to"latest"(updating the binary in-place), OREnvironment
brew install claude-code)autoUpdaterChannel: "latest"in settings— Claude Code (Opus 4.6)