diff options
Diffstat (limited to 'packages/core')
| -rw-r--r-- | packages/core/src/ide/detect-ide.ts | 43 | ||||
| -rw-r--r-- | packages/core/src/ide/ide-installer.test.ts | 52 | ||||
| -rw-r--r-- | packages/core/src/ide/ide-installer.ts | 22 |
3 files changed, 111 insertions, 6 deletions
diff --git a/packages/core/src/ide/detect-ide.ts b/packages/core/src/ide/detect-ide.ts index f3d8cc63..759c4103 100644 --- a/packages/core/src/ide/detect-ide.ts +++ b/packages/core/src/ide/detect-ide.ts @@ -6,12 +6,33 @@ export enum DetectedIde { VSCode = 'vscode', + VSCodium = 'vscodium', + Cursor = 'cursor', + CloudShell = 'cloudshell', + Codespaces = 'codespaces', + Windsurf = 'windsurf', + FirebaseStudio = 'firebasestudio', + Trae = 'trae', } export function getIdeDisplayName(ide: DetectedIde): string { switch (ide) { case DetectedIde.VSCode: return 'VS Code'; + case DetectedIde.VSCodium: + return 'VSCodium'; + case DetectedIde.Cursor: + return 'Cursor'; + case DetectedIde.CloudShell: + return 'Cloud Shell'; + case DetectedIde.Codespaces: + return 'GitHub Codespaces'; + case DetectedIde.Windsurf: + return 'Windsurf'; + case DetectedIde.FirebaseStudio: + return 'Firebase Studio'; + case DetectedIde.Trae: + return 'Trae'; default: { // This ensures that if a new IDE is added to the enum, we get a compile-time error. const exhaustiveCheck: never = ide; @@ -21,8 +42,24 @@ export function getIdeDisplayName(ide: DetectedIde): string { } export function detectIde(): DetectedIde | undefined { - if (process.env.TERM_PROGRAM === 'vscode') { - return DetectedIde.VSCode; + // Only VSCode-based integrations are currently supported. + if (process.env.TERM_PROGRAM !== 'vscode') { + return undefined; } - return undefined; + if (process.env.CURSOR_TRACE_ID) { + return DetectedIde.Cursor; + } + if (process.env.CODESPACES) { + return DetectedIde.Codespaces; + } + if (process.env.EDITOR_IN_CLOUD_SHELL) { + return DetectedIde.CloudShell; + } + if (process.env.TERM_PRODUCT === 'Trae') { + return DetectedIde.Trae; + } + if (process.env.FIREBASE_DEPLOY_AGENT) { + return DetectedIde.FirebaseStudio; + } + return DetectedIde.VSCode; } diff --git a/packages/core/src/ide/ide-installer.test.ts b/packages/core/src/ide/ide-installer.test.ts index 698c3173..1afd7a36 100644 --- a/packages/core/src/ide/ide-installer.test.ts +++ b/packages/core/src/ide/ide-installer.test.ts @@ -24,9 +24,17 @@ describe('ide-installer', () => { expect(installer).toBeInstanceOf(Object); }); - it('should return null for an unknown IDE', () => { + it('should return an OpenVSXInstaller for "vscodium"', () => { + const installer = getIdeInstaller(DetectedIde.VSCodium); + expect(installer).not.toBeNull(); + expect(installer).toBeInstanceOf(Object); + }); + + it('should return a DefaultIDEInstaller for an unknown IDE', () => { const installer = getIdeInstaller('unknown' as DetectedIde); - expect(installer).toBeNull(); + // Assuming DefaultIDEInstaller is the fallback + expect(installer).not.toBeNull(); + expect(installer).toBeInstanceOf(Object); }); }); @@ -59,4 +67,44 @@ describe('ide-installer', () => { }); }); }); + + describe('OpenVSXInstaller', () => { + let installer: IdeInstaller; + + beforeEach(() => { + installer = getIdeInstaller(DetectedIde.VSCodium)!; + }); + + afterEach(() => { + vi.restoreAllMocks(); + }); + + describe('install', () => { + it('should call execSync with the correct command and return success', async () => { + const execSyncSpy = vi + .spyOn(child_process, 'execSync') + .mockImplementation(() => ''); + const result = await installer.install(); + expect(execSyncSpy).toHaveBeenCalledWith( + 'npx ovsx get google.gemini-cli-vscode-ide-companion', + { stdio: 'pipe' }, + ); + expect(result.success).toBe(true); + expect(result.message).toContain( + 'VS Code companion extension was installed successfully from OpenVSX', + ); + }); + + it('should return a failure message on failed installation', async () => { + vi.spyOn(child_process, 'execSync').mockImplementation(() => { + throw new Error('Command failed'); + }); + const result = await installer.install(); + expect(result.success).toBe(false); + expect(result.message).toContain( + 'Failed to install VS Code companion extension from OpenVSX', + ); + }); + }); + }); }); diff --git a/packages/core/src/ide/ide-installer.ts b/packages/core/src/ide/ide-installer.ts index 7db8e2d2..e6192bfa 100644 --- a/packages/core/src/ide/ide-installer.ts +++ b/packages/core/src/ide/ide-installer.ts @@ -147,11 +147,31 @@ class VsCodeInstaller implements IdeInstaller { } } +class OpenVSXInstaller implements IdeInstaller { + async install(): Promise<InstallResult> { + // TODO: Use the correct extension path. + const command = `npx ovsx get google.gemini-cli-vscode-ide-companion`; + try { + child_process.execSync(command, { stdio: 'pipe' }); + return { + success: true, + message: + 'VS Code companion extension was installed successfully from OpenVSX. Please restart your terminal to complete the setup.', + }; + } catch (_error) { + return { + success: false, + message: `Failed to install VS Code companion extension from OpenVSX. Please try installing it manually.`, + }; + } + } +} + export function getIdeInstaller(ide: DetectedIde): IdeInstaller | null { switch (ide) { case DetectedIde.VSCode: return new VsCodeInstaller(); default: - return null; + return new OpenVSXInstaller(); } } |
