diff --git a/packages/core/src/ide/ide-installer.test.ts b/packages/core/src/ide/ide-installer.test.ts index e43e1b34..e5388253 100644 --- a/packages/core/src/ide/ide-installer.test.ts +++ b/packages/core/src/ide/ide-installer.test.ts @@ -16,6 +16,14 @@ vi.mock('fs'); vi.mock('os'); describe('ide-installer', () => { + beforeEach(() => { + vi.spyOn(os, 'homedir').mockReturnValue('/home/user'); + }); + + afterEach(() => { + vi.restoreAllMocks(); + }); + describe('getIdeInstaller', () => { it('should return a VsCodeInstaller for "vscode"', () => { const installer = getIdeInstaller(DetectedIde.VSCode); @@ -33,11 +41,6 @@ describe('ide-installer', () => { installer = getIdeInstaller(DetectedIde.VSCode)!; vi.spyOn(child_process, 'execSync').mockImplementation(() => ''); vi.spyOn(fs, 'existsSync').mockReturnValue(false); - vi.spyOn(os, 'homedir').mockReturnValue('/home/user'); - }); - - afterEach(() => { - vi.restoreAllMocks(); }); describe('install', () => { diff --git a/packages/core/src/ide/ide-installer.ts b/packages/core/src/ide/ide-installer.ts index 4a771c67..bf74bd07 100644 --- a/packages/core/src/ide/ide-installer.ts +++ b/packages/core/src/ide/ide-installer.ts @@ -26,13 +26,22 @@ export interface InstallResult { async function findVsCodeCommand(): Promise { // 1. Check PATH first. try { - child_process.execSync( - process.platform === 'win32' - ? `where.exe ${VSCODE_COMMAND}` - : `command -v ${VSCODE_COMMAND}`, - { stdio: 'ignore' }, - ); - return VSCODE_COMMAND; + if (process.platform === 'win32') { + const result = child_process + .execSync(`where.exe ${VSCODE_COMMAND}`) + .toString() + .trim(); + // `where.exe` can return multiple paths. Return the first one. + const firstPath = result.split(/\r?\n/)[0]; + if (firstPath) { + return firstPath; + } + } else { + child_process.execSync(`command -v ${VSCODE_COMMAND}`, { + stdio: 'ignore', + }); + return VSCODE_COMMAND; + } } catch { // Not in PATH, continue to check common locations. }