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.
This commit is contained in:
@@ -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()
|
||||||
|
|||||||
Reference in New Issue
Block a user