summaryrefslogtreecommitdiff
path: root/packages/cli/src
diff options
context:
space:
mode:
Diffstat (limited to 'packages/cli/src')
-rw-r--r--packages/cli/src/config/config.test.ts52
-rw-r--r--packages/cli/src/config/config.ts3
-rw-r--r--packages/cli/src/config/settings.test.ts56
-rw-r--r--packages/cli/src/config/settings.ts12
4 files changed, 121 insertions, 2 deletions
diff --git a/packages/cli/src/config/config.test.ts b/packages/cli/src/config/config.test.ts
index b670fbc8..1d83ccbc 100644
--- a/packages/cli/src/config/config.test.ts
+++ b/packages/cli/src/config/config.test.ts
@@ -1042,6 +1042,58 @@ describe('loadCliConfig folderTrustFeature', () => {
});
});
+describe('loadCliConfig folderTrust', () => {
+ const originalArgv = process.argv;
+ const originalEnv = { ...process.env };
+
+ beforeEach(() => {
+ vi.resetAllMocks();
+ vi.mocked(os.homedir).mockReturnValue('/mock/home/user');
+ process.env.GEMINI_API_KEY = 'test-api-key';
+ });
+
+ afterEach(() => {
+ process.argv = originalArgv;
+ process.env = originalEnv;
+ vi.restoreAllMocks();
+ });
+
+ it('should be false if folderTrustFeature is false and folderTrust is false', async () => {
+ process.argv = ['node', 'script.js'];
+ const settings: Settings = {
+ folderTrustFeature: false,
+ folderTrust: false,
+ };
+ const argv = await parseArguments();
+ const config = await loadCliConfig(settings, [], 'test-session', argv);
+ expect(config.getFolderTrust()).toBe(false);
+ });
+
+ it('should be false if folderTrustFeature is true and folderTrust is false', async () => {
+ process.argv = ['node', 'script.js'];
+ const argv = await parseArguments();
+ const settings: Settings = { folderTrustFeature: true, folderTrust: false };
+ const config = await loadCliConfig(settings, [], 'test-session', argv);
+ expect(config.getFolderTrust()).toBe(false);
+ });
+
+ it('should be false if folderTrustFeature is false and folderTrust is true', async () => {
+ process.argv = ['node', 'script.js'];
+ const argv = await parseArguments();
+ const settings: Settings = { folderTrustFeature: false, folderTrust: true };
+ const config = await loadCliConfig(settings, [], 'test-session', argv);
+ expect(config.getFolderTrust()).toBe(false);
+ });
+
+ it('should be true when folderTrustFeature is true and folderTrust is true', async () => {
+ process.argv = ['node', 'script.js'];
+ const argv = await parseArguments();
+ const settings: Settings = { folderTrustFeature: true, folderTrust: true };
+ const config = await loadCliConfig(settings, [], 'test-session', argv);
+ expect(config.getFolderTrust()).toBe(true);
+ });
+});
+
vi.mock('fs', async () => {
const actualFs = await vi.importActual<typeof fs>('fs');
const MOCK_CWD1 = process.cwd();
diff --git a/packages/cli/src/config/config.ts b/packages/cli/src/config/config.ts
index a47d8301..3104e4c1 100644
--- a/packages/cli/src/config/config.ts
+++ b/packages/cli/src/config/config.ts
@@ -314,6 +314,8 @@ export async function loadCliConfig(
argv.ideModeFeature ?? settings.ideModeFeature ?? false;
const folderTrustFeature = settings.folderTrustFeature ?? false;
+ const folderTrustSetting = settings.folderTrust ?? false;
+ const folderTrust = folderTrustFeature && folderTrustSetting;
const allExtensions = annotateActiveExtensions(
extensions,
@@ -484,6 +486,7 @@ export async function loadCliConfig(
ideModeFeature,
chatCompression: settings.chatCompression,
folderTrustFeature,
+ folderTrust,
});
}
diff --git a/packages/cli/src/config/settings.test.ts b/packages/cli/src/config/settings.test.ts
index f68b13e3..353a5783 100644
--- a/packages/cli/src/config/settings.test.ts
+++ b/packages/cli/src/config/settings.test.ts
@@ -310,6 +310,62 @@ describe('Settings Loading and Merging', () => {
});
});
+ it('should ignore folderTrust from workspace settings', () => {
+ (mockFsExistsSync as Mock).mockReturnValue(true);
+ const userSettingsContent = {
+ folderTrust: true,
+ };
+ const workspaceSettingsContent = {
+ folderTrust: false, // This should be ignored
+ };
+ const systemSettingsContent = {
+ // No folderTrust here
+ };
+
+ (fs.readFileSync as Mock).mockImplementation(
+ (p: fs.PathOrFileDescriptor) => {
+ if (p === getSystemSettingsPath())
+ return JSON.stringify(systemSettingsContent);
+ if (p === USER_SETTINGS_PATH)
+ return JSON.stringify(userSettingsContent);
+ if (p === MOCK_WORKSPACE_SETTINGS_PATH)
+ return JSON.stringify(workspaceSettingsContent);
+ return '{}';
+ },
+ );
+
+ const settings = loadSettings(MOCK_WORKSPACE_DIR);
+ expect(settings.merged.folderTrust).toBe(true); // User setting should be used
+ });
+
+ it('should use system folderTrust over user setting', () => {
+ (mockFsExistsSync as Mock).mockReturnValue(true);
+ const userSettingsContent = {
+ folderTrust: false,
+ };
+ const workspaceSettingsContent = {
+ folderTrust: true, // This should be ignored
+ };
+ const systemSettingsContent = {
+ folderTrust: true,
+ };
+
+ (fs.readFileSync as Mock).mockImplementation(
+ (p: fs.PathOrFileDescriptor) => {
+ if (p === getSystemSettingsPath())
+ return JSON.stringify(systemSettingsContent);
+ if (p === USER_SETTINGS_PATH)
+ return JSON.stringify(userSettingsContent);
+ if (p === MOCK_WORKSPACE_SETTINGS_PATH)
+ return JSON.stringify(workspaceSettingsContent);
+ return '{}';
+ },
+ );
+
+ const settings = loadSettings(MOCK_WORKSPACE_DIR);
+ expect(settings.merged.folderTrust).toBe(true); // System setting should be used
+ });
+
it('should handle contextFileName correctly when only in user settings', () => {
(mockFsExistsSync as Mock).mockImplementation(
(p: fs.PathLike) => p === USER_SETTINGS_PATH,
diff --git a/packages/cli/src/config/settings.ts b/packages/cli/src/config/settings.ts
index 8005ad65..a3bd8d47 100644
--- a/packages/cli/src/config/settings.ts
+++ b/packages/cli/src/config/settings.ts
@@ -113,10 +113,14 @@ export interface Settings {
// Flag to be removed post-launch.
ideModeFeature?: boolean;
- folderTrustFeature?: boolean;
/// IDE mode setting configured via slash command toggle.
ideMode?: boolean;
+ // Flag to be removed post-launch.
+ folderTrustFeature?: boolean;
+ // Setting to track whether Folder trust is enabled.
+ folderTrust?: boolean;
+
// Setting to track if the user has seen the IDE integration nudge.
hasSeenIdeIntegrationNudge?: boolean;
@@ -178,9 +182,13 @@ export class LoadedSettings {
const user = this.user.settings;
const workspace = this.workspace.settings;
+ // folderTrust is not supported at workspace level.
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
+ const { folderTrust, ...workspaceWithoutFolderTrust } = workspace;
+
return {
...user,
- ...workspace,
+ ...workspaceWithoutFolderTrust,
...system,
customThemes: {
...(user.customThemes || {}),