diff options
| author | christine betts <[email protected]> | 2025-07-30 21:26:31 +0000 |
|---|---|---|
| committer | GitHub <[email protected]> | 2025-07-30 21:26:31 +0000 |
| commit | 7bc876654254d9a11d66135735ad10f1066ad213 (patch) | |
| tree | 3b21e328199f8631c0d865fdf041103c18bd261e /packages/cli/src/ui/commands/ideCommand.ts | |
| parent | c1fe6889569610878c45216556fb99424b5bcba4 (diff) | |
Introduce IDE mode installer (#4877)
Diffstat (limited to 'packages/cli/src/ui/commands/ideCommand.ts')
| -rw-r--r-- | packages/cli/src/ui/commands/ideCommand.ts | 105 |
1 files changed, 27 insertions, 78 deletions
diff --git a/packages/cli/src/ui/commands/ideCommand.ts b/packages/cli/src/ui/commands/ideCommand.ts index 31f2371f..26b0f57d 100644 --- a/packages/cli/src/ui/commands/ideCommand.ts +++ b/packages/cli/src/ui/commands/ideCommand.ts @@ -4,40 +4,29 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { fileURLToPath } from 'url'; -import { Config, IDEConnectionStatus } from '@google/gemini-cli-core'; +import { + Config, + getIdeDisplayName, + getIdeInstaller, + IDEConnectionStatus, +} from '@google/gemini-cli-core'; import { CommandContext, SlashCommand, SlashCommandActionReturn, CommandKind, } from './types.js'; -import * as child_process from 'child_process'; -import * as process from 'process'; -import { glob } from 'glob'; -import * as path from 'path'; - -const VSCODE_COMMAND = process.platform === 'win32' ? 'code.cmd' : 'code'; -const VSCODE_COMPANION_EXTENSION_FOLDER = 'vscode-ide-companion'; - -function isVSCodeInstalled(): boolean { - try { - child_process.execSync( - process.platform === 'win32' - ? `where.exe ${VSCODE_COMMAND}` - : `command -v ${VSCODE_COMMAND}`, - { stdio: 'ignore' }, - ); - return true; - } catch { - return false; - } -} export const ideCommand = (config: Config | null): SlashCommand | null => { if (!config?.getIdeMode()) { return null; } + const currentIDE = config.getIdeClient().getCurrentIde(); + if (!currentIDE) { + throw new Error( + 'IDE slash command should not be available if not running in an IDE', + ); + } return { name: 'ide', @@ -49,7 +38,7 @@ export const ideCommand = (config: Config | null): SlashCommand | null => { description: 'check status of IDE integration', kind: CommandKind.BUILT_IN, action: (_context: CommandContext): SlashCommandActionReturn => { - const connection = config.getIdeClient()?.getConnectionStatus(); + const connection = config.getIdeClient().getConnectionStatus(); switch (connection?.status) { case IDEConnectionStatus.Connected: return { @@ -79,77 +68,37 @@ export const ideCommand = (config: Config | null): SlashCommand | null => { }, { name: 'install', - description: 'install required VS Code companion extension', + description: `install required IDE companion ${getIdeDisplayName(currentIDE)} extension `, kind: CommandKind.BUILT_IN, action: async (context) => { - if (!isVSCodeInstalled()) { - context.ui.addItem( - { - type: 'error', - text: `VS Code command-line tool "${VSCODE_COMMAND}" not found in your PATH.`, - }, - Date.now(), - ); - return; - } - - const bundleDir = path.dirname(fileURLToPath(import.meta.url)); - // The VSIX file is copied to the bundle directory as part of the build. - let vsixFiles = glob.sync(path.join(bundleDir, '*.vsix')); - if (vsixFiles.length === 0) { - // If the VSIX file is not in the bundle, it might be a dev - // environment running with `npm start`. Look for it in the original - // package location, relative to the bundle dir. - const devPath = path.join( - bundleDir, - '..', - '..', - '..', - '..', - '..', - VSCODE_COMPANION_EXTENSION_FOLDER, - '*.vsix', - ); - vsixFiles = glob.sync(devPath); - } - if (vsixFiles.length === 0) { + const installer = getIdeInstaller(currentIDE); + if (!installer) { context.ui.addItem( { type: 'error', - text: 'Could not find the required VS Code companion extension. Please file a bug via /bug.', + text: 'No installer available for your configured IDE.', }, Date.now(), ); return; } - const vsixPath = vsixFiles[0]; - const command = `${VSCODE_COMMAND} --install-extension ${vsixPath} --force`; context.ui.addItem( { type: 'info', - text: `Installing VS Code companion extension...`, + text: `Installing IDE companion extension...`, + }, + Date.now(), + ); + + const result = await installer.install(); + context.ui.addItem( + { + type: result.success ? 'info' : 'error', + text: result.message, }, Date.now(), ); - try { - child_process.execSync(command, { stdio: 'pipe' }); - context.ui.addItem( - { - type: 'info', - text: 'VS Code companion extension installed successfully. Restart gemini-cli in a fresh terminal window.', - }, - Date.now(), - ); - } catch (_error) { - context.ui.addItem( - { - type: 'error', - text: `Failed to install VS Code companion extension.`, - }, - Date.now(), - ); - } }, }, ], |
