Compare commits

...

1 Commits

Author SHA1 Message Date
gnanam1990
8fb0316e46 fix(update): show real package version and give actionable guidance
The `openclaude update` / `openclaude upgrade` command printed
`Current version: 99.0.0` and, in the development-build branch, exited
with only `Warning: Cannot update development build` (closes #852).

Root cause: `MACRO.VERSION` is hardcoded to `'99.0.0'` in
`scripts/build.ts` as an internal compatibility sentinel so OpenClaude
passes upstream minimum-version guards. The real package version is
exposed separately as `MACRO.DISPLAY_VERSION`. `update.ts` was using
`MACRO.VERSION` for both the version shown to the user and for every
`latestVersion` comparison, which meant:

- Users always saw `99.0.0` as their "current version".
- `99.0.0 >= <any real npm version>`, so the "up to date" and
  "update available" checks could never fire correctly.

Fix (scoped to `src/cli/update.ts`):

- Use `MACRO.DISPLAY_VERSION` for all user-facing version strings and
  version comparisons.
- Replace the dead-end `Warning: Cannot update development build`
  (which exited 1 with no guidance) with actionable instructions for
  both source builds (`git pull && bun install && bun run build`) and
  npm installs (`npm install -g @gitlawb/openclaude@latest`).
- Extend the existing third-party-provider branch to also show the
  current version and the npm reinstall command, so users who
  installed via npm aren't told only to rebuild from source.
2026-04-24 07:28:58 +05:30

View File

@@ -35,15 +35,20 @@ export async function update() {
// binary (without it). // binary (without it).
if (getAPIProvider() !== 'firstParty') { if (getAPIProvider() !== 'firstParty') {
writeToStdout( writeToStdout(
chalk.yellow('Auto-update is not available for third-party provider builds.\n') + chalk.yellow(
'To update, pull the latest source from the repository and rebuild:\n' + `Auto-update is not available for third-party provider builds.\n`,
' git pull && bun install && bun run build\n', ) +
`Current version: ${MACRO.DISPLAY_VERSION}\n\n` +
`To update, reinstall from npm:\n` +
chalk.bold(` npm install -g ${MACRO.PACKAGE_URL}@latest`) + '\n\n' +
`Or, if you built from source, pull and rebuild:\n` +
chalk.bold(' git pull && bun install && bun run build') + '\n',
) )
return await gracefulShutdown(0)
} }
logEvent('tengu_update_check', {}) logEvent('tengu_update_check', {})
writeToStdout(`Current version: ${MACRO.VERSION}\n`) writeToStdout(`Current version: ${MACRO.DISPLAY_VERSION}\n`)
const channel = getInitialSettings()?.autoUpdatesChannel ?? 'latest' const channel = getInitialSettings()?.autoUpdatesChannel ?? 'latest'
writeToStdout(`Checking for updates to ${channel} version...\n`) writeToStdout(`Checking for updates to ${channel} version...\n`)
@@ -123,9 +128,14 @@ export async function update() {
if (diagnostic.installationType === 'development') { if (diagnostic.installationType === 'development') {
writeToStdout('\n') writeToStdout('\n')
writeToStdout( writeToStdout(
chalk.yellow('Warning: Cannot update development build') + '\n', chalk.yellow('You are running a development build — auto-update is unavailable.') + '\n',
) )
await gracefulShutdown(1) writeToStdout('To update, pull the latest source and rebuild:\n')
writeToStdout(chalk.bold(' git pull && bun install && bun run build') + '\n')
writeToStdout('\n')
writeToStdout('Or reinstall from npm:\n')
writeToStdout(chalk.bold(` npm install -g ${MACRO.PACKAGE_URL}@latest`) + '\n')
await gracefulShutdown(0)
} }
// Check if running from a package manager // Check if running from a package manager
@@ -136,8 +146,8 @@ export async function update() {
if (packageManager === 'homebrew') { if (packageManager === 'homebrew') {
writeToStdout('Claude is managed by Homebrew.\n') writeToStdout('Claude is managed by Homebrew.\n')
const latest = await getLatestVersion(channel) const latest = await getLatestVersion(channel)
if (latest && !gte(MACRO.VERSION, latest)) { if (latest && !gte(MACRO.DISPLAY_VERSION, latest)) {
writeToStdout(`Update available: ${MACRO.VERSION}${latest}\n`) writeToStdout(`Update available: ${MACRO.DISPLAY_VERSION}${latest}\n`)
writeToStdout('\n') writeToStdout('\n')
writeToStdout('To update, run:\n') writeToStdout('To update, run:\n')
writeToStdout(chalk.bold(' brew upgrade claude-code') + '\n') writeToStdout(chalk.bold(' brew upgrade claude-code') + '\n')
@@ -147,8 +157,8 @@ export async function update() {
} else if (packageManager === 'winget') { } else if (packageManager === 'winget') {
writeToStdout('Claude is managed by winget.\n') writeToStdout('Claude is managed by winget.\n')
const latest = await getLatestVersion(channel) const latest = await getLatestVersion(channel)
if (latest && !gte(MACRO.VERSION, latest)) { if (latest && !gte(MACRO.DISPLAY_VERSION, latest)) {
writeToStdout(`Update available: ${MACRO.VERSION}${latest}\n`) writeToStdout(`Update available: ${MACRO.DISPLAY_VERSION}${latest}\n`)
writeToStdout('\n') writeToStdout('\n')
writeToStdout('To update, run:\n') writeToStdout('To update, run:\n')
writeToStdout( writeToStdout(
@@ -160,8 +170,8 @@ export async function update() {
} else if (packageManager === 'apk') { } else if (packageManager === 'apk') {
writeToStdout('Claude is managed by apk.\n') writeToStdout('Claude is managed by apk.\n')
const latest = await getLatestVersion(channel) const latest = await getLatestVersion(channel)
if (latest && !gte(MACRO.VERSION, latest)) { if (latest && !gte(MACRO.DISPLAY_VERSION, latest)) {
writeToStdout(`Update available: ${MACRO.VERSION}${latest}\n`) writeToStdout(`Update available: ${MACRO.DISPLAY_VERSION}${latest}\n`)
writeToStdout('\n') writeToStdout('\n')
writeToStdout('To update, run:\n') writeToStdout('To update, run:\n')
writeToStdout(chalk.bold(' apk upgrade claude-code') + '\n') writeToStdout(chalk.bold(' apk upgrade claude-code') + '\n')
@@ -250,14 +260,14 @@ export async function update() {
await gracefulShutdown(1) await gracefulShutdown(1)
} }
if (result.latestVersion === MACRO.VERSION) { if (result.latestVersion === MACRO.DISPLAY_VERSION) {
writeToStdout( writeToStdout(
chalk.green(`Claude Code is up to date (${MACRO.VERSION})`) + '\n', chalk.green(`OpenClaude is up to date (${MACRO.DISPLAY_VERSION})`) + '\n',
) )
} else { } else {
writeToStdout( writeToStdout(
chalk.green( chalk.green(
`Successfully updated from ${MACRO.VERSION} to version ${result.latestVersion}`, `Successfully updated from ${MACRO.DISPLAY_VERSION} to version ${result.latestVersion}`,
) + '\n', ) + '\n',
) )
await regenerateCompletionCache() await regenerateCompletionCache()
@@ -320,15 +330,15 @@ export async function update() {
} }
// Check if versions match exactly, including any build metadata (like SHA) // Check if versions match exactly, including any build metadata (like SHA)
if (latestVersion === MACRO.VERSION) { if (latestVersion === MACRO.DISPLAY_VERSION) {
writeToStdout( writeToStdout(
chalk.green(`Claude Code is up to date (${MACRO.VERSION})`) + '\n', chalk.green(`OpenClaude is up to date (${MACRO.DISPLAY_VERSION})`) + '\n',
) )
await gracefulShutdown(0) await gracefulShutdown(0)
} }
writeToStdout( writeToStdout(
`New version available: ${latestVersion} (current: ${MACRO.VERSION})\n`, `New version available: ${latestVersion} (current: ${MACRO.DISPLAY_VERSION})\n`,
) )
writeToStdout('Installing update...\n') writeToStdout('Installing update...\n')
@@ -388,7 +398,7 @@ export async function update() {
case 'success': case 'success':
writeToStdout( writeToStdout(
chalk.green( chalk.green(
`Successfully updated from ${MACRO.VERSION} to version ${latestVersion}`, `Successfully updated from ${MACRO.DISPLAY_VERSION} to version ${latestVersion}`,
) + '\n', ) + '\n',
) )
await regenerateCompletionCache() await regenerateCompletionCache()