summaryrefslogtreecommitdiff
path: root/packages/core/src/ide/ide-client.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/core/src/ide/ide-client.ts')
-rw-r--r--packages/core/src/ide/ide-client.ts64
1 files changed, 38 insertions, 26 deletions
diff --git a/packages/core/src/ide/ide-client.ts b/packages/core/src/ide/ide-client.ts
index 94107f21..810e82e0 100644
--- a/packages/core/src/ide/ide-client.ts
+++ b/packages/core/src/ide/ide-client.ts
@@ -5,6 +5,7 @@
*/
import * as fs from 'node:fs';
+import { isSubpath } from '../utils/paths.js';
import { detectIde, DetectedIde, getIdeInfo } from '../ide/detect-ide.js';
import {
ideContext,
@@ -93,7 +94,14 @@ export class IdeClient {
this.setState(IDEConnectionStatus.Connecting);
- if (!this.validateWorkspacePath()) {
+ const { isValid, error } = IdeClient.validateWorkspacePath(
+ process.env['GEMINI_CLI_IDE_WORKSPACE_PATH'],
+ this.currentIdeDisplayName,
+ process.cwd(),
+ );
+
+ if (!isValid) {
+ this.setState(IDEConnectionStatus.Disconnected, error, true);
return;
}
@@ -245,37 +253,41 @@ export class IdeClient {
}
}
- private validateWorkspacePath(): boolean {
- const ideWorkspacePath = process.env['GEMINI_CLI_IDE_WORKSPACE_PATH'];
+ static validateWorkspacePath(
+ ideWorkspacePath: string | undefined,
+ currentIdeDisplayName: string | undefined,
+ cwd: string,
+ ): { isValid: boolean; error?: string } {
if (ideWorkspacePath === undefined) {
- this.setState(
- IDEConnectionStatus.Disconnected,
- `Failed to connect to IDE companion extension for ${this.currentIdeDisplayName}. Please ensure the extension is running and try refreshing your terminal. To install the extension, run /ide install.`,
- true,
- );
- return false;
+ return {
+ isValid: false,
+ error: `Failed to connect to IDE companion extension for ${currentIdeDisplayName}. Please ensure the extension is running and try refreshing your terminal. To install the extension, run /ide install.`,
+ };
}
+
if (ideWorkspacePath === '') {
- this.setState(
- IDEConnectionStatus.Disconnected,
- `To use this feature, please open a single workspace folder in ${this.currentIdeDisplayName} and try again.`,
- true,
- );
- return false;
+ return {
+ isValid: false,
+ error: `To use this feature, please open a workspace folder in ${currentIdeDisplayName} and try again.`,
+ };
}
- const idePath = getRealPath(ideWorkspacePath).toLocaleLowerCase();
- const cwd = getRealPath(process.cwd()).toLocaleLowerCase();
- const rel = path.relative(idePath, cwd);
- if (rel.startsWith('..') || path.isAbsolute(rel)) {
- this.setState(
- IDEConnectionStatus.Disconnected,
- `Directory mismatch. Gemini CLI is running in a different location than the open workspace in ${this.currentIdeDisplayName}. Please run the CLI from the same directory as your project's root folder.`,
- true,
- );
- return false;
+ const ideWorkspacePaths = ideWorkspacePath.split(':');
+ const realCwd = getRealPath(cwd);
+ const isWithinWorkspace = ideWorkspacePaths.some((workspacePath) => {
+ const idePath = getRealPath(workspacePath);
+ return isSubpath(idePath, realCwd);
+ });
+
+ if (!isWithinWorkspace) {
+ return {
+ isValid: false,
+ error: `Directory mismatch. Gemini CLI is running in a different location than the open workspace in ${currentIdeDisplayName}. Please run the CLI from one of the following directories: ${ideWorkspacePaths.join(
+ ', ',
+ )}`,
+ };
}
- return true;
+ return { isValid: true };
}
private getPortFromEnv(): string | undefined {