Skip to content

Commit 7cd5518

Browse files
FrankLiu4138claude
andcommitted
fix(upgrade): check extension version before calling gotoAgentMode
Previously checkOrInstallAppModExtensionForUpgrade only checked if the extension was installed, not whether it was new enough to support gotoAgentMode. This caused 67% of upgrade failures (~14K users/day). Now checks extension.packageJSON.version >= MIN_APPMOD_VERSION. If too old, triggers update and verifies command availability with timeout. Co-Authored-By: Claude Opus 4 <noreply@anthropic.com>
1 parent e9ae840 commit 7cd5518

2 files changed

Lines changed: 34 additions & 4 deletions

File tree

src/constants.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ export namespace ExtensionName {
4141

4242
export namespace Upgrade {
4343
export const PACKAGE_ID_FOR_JAVA_RUNTIME = "java:*";
44+
/** Minimum version of the appmod extension that supports gotoAgentMode command */
45+
export const MIN_APPMOD_VERSION = "0.0.1"; // TODO: replace with actual minimum version
4446
}
4547

4648
/**

src/upgrade/utility.ts

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { commands, extensions, Uri, window } from "vscode";
55
import * as semver from "semver";
66
import { UpgradeReason, type UpgradeIssue } from "./type";
77
import { ExtensionName, Upgrade } from "../constants";
8+
import { Commands } from "../commands";
89
import { instrumentOperation, sendInfo } from "vscode-extension-telemetry-wrapper";
910
import { CveUpgradeIssue } from "./cve";
1011

@@ -155,10 +156,37 @@ export async function checkOrPopupToInstallAppModExtensionForModernization(
155156

156157
export async function checkOrInstallAppModExtensionForUpgrade(
157158
extensionIdToCheck: string): Promise<void> {
158-
if (extensions.getExtension(extensionIdToCheck)) {
159-
return;
159+
const ext = extensions.getExtension(extensionIdToCheck);
160+
161+
if (ext) {
162+
const installedVersion = ext.packageJSON?.version;
163+
if (installedVersion && semver.gte(installedVersion, Upgrade.MIN_APPMOD_VERSION)) {
164+
return;
165+
}
166+
// Extension is installed but too old — update it
167+
sendInfo("", {
168+
operationName: "java.dependency.upgrade.extensionOutdated",
169+
installedVersion,
170+
minRequiredVersion: Upgrade.MIN_APPMOD_VERSION,
171+
});
172+
await commands.executeCommand("workbench.extensions.installExtension", ExtensionName.APP_MODERNIZATION_FOR_JAVA);
173+
} else {
174+
await commands.executeCommand("workbench.extensions.installExtension", ExtensionName.APP_MODERNIZATION_FOR_JAVA);
175+
await checkOrPromptToEnableAppModExtension("upgrade");
160176
}
161177

162-
await commands.executeCommand("workbench.extensions.installExtension", ExtensionName.APP_MODERNIZATION_FOR_JAVA);
163-
await checkOrPromptToEnableAppModExtension("upgrade");
178+
// Verify gotoAgentMode command is available after install/update
179+
await waitForCommand(Commands.GOTO_AGENT_MODE);
180+
}
181+
182+
async function waitForCommand(commandId: string, timeoutMs: number = 10000): Promise<void> {
183+
const startTime = Date.now();
184+
while (Date.now() - startTime < timeoutMs) {
185+
const allCommands = await commands.getCommands(true);
186+
if (allCommands.includes(commandId)) {
187+
return;
188+
}
189+
await new Promise(resolve => setTimeout(resolve, 500));
190+
}
191+
throw new Error(`Command '${commandId}' not available after extension install/update. Please reload VS Code and try again.`);
164192
}

0 commit comments

Comments
 (0)