From 32e777f8387f6bcb6f6b2eafa353e861a2e1e47c Mon Sep 17 00:00:00 2001 From: Abhijit Balaji Date: Fri, 27 Feb 2026 08:03:36 -0800 Subject: [PATCH] fix(core): revert auto-save of policies to user space (#20531) --- packages/core/src/config/storage.ts | 5 +-- packages/core/src/policy/config.ts | 3 +- packages/core/src/policy/persistence.test.ts | 43 ++++--------------- .../core/src/policy/policy-updater.test.ts | 4 +- 4 files changed, 13 insertions(+), 42 deletions(-) diff --git a/packages/core/src/config/storage.ts b/packages/core/src/config/storage.ts index e8530887b3..10e88543ba 100644 --- a/packages/core/src/config/storage.ts +++ b/packages/core/src/config/storage.ts @@ -169,10 +169,7 @@ export class Storage { } getAutoSavedPolicyPath(): string { - return path.join( - this.getWorkspacePoliciesDir(), - AUTO_SAVED_POLICY_FILENAME, - ); + return path.join(Storage.getUserPoliciesDir(), AUTO_SAVED_POLICY_FILENAME); } ensureProjectTempDirExists(): void { diff --git a/packages/core/src/policy/config.ts b/packages/core/src/policy/config.ts index 800006e27e..6cdfc199d2 100644 --- a/packages/core/src/policy/config.ts +++ b/packages/core/src/policy/config.ts @@ -516,9 +516,8 @@ export function createPolicyUpdater( if (message.persist) { persistenceQueue = persistenceQueue.then(async () => { try { - const workspacePoliciesDir = storage.getWorkspacePoliciesDir(); - await fs.mkdir(workspacePoliciesDir, { recursive: true }); const policyFile = storage.getAutoSavedPolicyPath(); + await fs.mkdir(path.dirname(policyFile), { recursive: true }); // Read existing file let existingData: { rule?: TomlRule[] } = {}; diff --git a/packages/core/src/policy/persistence.test.ts b/packages/core/src/policy/persistence.test.ts index 43f52a956d..c5a71fdd93 100644 --- a/packages/core/src/policy/persistence.test.ts +++ b/packages/core/src/policy/persistence.test.ts @@ -48,14 +48,8 @@ describe('createPolicyUpdater', () => { it('should persist policy when persist flag is true', async () => { createPolicyUpdater(policyEngine, messageBus, mockStorage); - const workspacePoliciesDir = '/mock/project/.gemini/policies'; - const policyFile = path.join( - workspacePoliciesDir, - AUTO_SAVED_POLICY_FILENAME, - ); - vi.spyOn(mockStorage, 'getWorkspacePoliciesDir').mockReturnValue( - workspacePoliciesDir, - ); + const userPoliciesDir = '/mock/user/.gemini/policies'; + const policyFile = path.join(userPoliciesDir, AUTO_SAVED_POLICY_FILENAME); vi.spyOn(mockStorage, 'getAutoSavedPolicyPath').mockReturnValue(policyFile); (fs.mkdir as unknown as Mock).mockResolvedValue(undefined); (fs.readFile as unknown as Mock).mockRejectedValue( @@ -79,8 +73,7 @@ describe('createPolicyUpdater', () => { // Wait for async operations (microtasks) await new Promise((resolve) => setTimeout(resolve, 0)); - expect(mockStorage.getWorkspacePoliciesDir).toHaveBeenCalled(); - expect(fs.mkdir).toHaveBeenCalledWith(workspacePoliciesDir, { + expect(fs.mkdir).toHaveBeenCalledWith(userPoliciesDir, { recursive: true, }); @@ -115,14 +108,8 @@ describe('createPolicyUpdater', () => { it('should persist policy with commandPrefix when provided', async () => { createPolicyUpdater(policyEngine, messageBus, mockStorage); - const workspacePoliciesDir = '/mock/project/.gemini/policies'; - const policyFile = path.join( - workspacePoliciesDir, - AUTO_SAVED_POLICY_FILENAME, - ); - vi.spyOn(mockStorage, 'getWorkspacePoliciesDir').mockReturnValue( - workspacePoliciesDir, - ); + const userPoliciesDir = '/mock/user/.gemini/policies'; + const policyFile = path.join(userPoliciesDir, AUTO_SAVED_POLICY_FILENAME); vi.spyOn(mockStorage, 'getAutoSavedPolicyPath').mockReturnValue(policyFile); (fs.mkdir as unknown as Mock).mockResolvedValue(undefined); (fs.readFile as unknown as Mock).mockRejectedValue( @@ -168,14 +155,8 @@ describe('createPolicyUpdater', () => { it('should persist policy with mcpName and toolName when provided', async () => { createPolicyUpdater(policyEngine, messageBus, mockStorage); - const workspacePoliciesDir = '/mock/project/.gemini/policies'; - const policyFile = path.join( - workspacePoliciesDir, - AUTO_SAVED_POLICY_FILENAME, - ); - vi.spyOn(mockStorage, 'getWorkspacePoliciesDir').mockReturnValue( - workspacePoliciesDir, - ); + const userPoliciesDir = '/mock/user/.gemini/policies'; + const policyFile = path.join(userPoliciesDir, AUTO_SAVED_POLICY_FILENAME); vi.spyOn(mockStorage, 'getAutoSavedPolicyPath').mockReturnValue(policyFile); (fs.mkdir as unknown as Mock).mockResolvedValue(undefined); (fs.readFile as unknown as Mock).mockRejectedValue( @@ -214,14 +195,8 @@ describe('createPolicyUpdater', () => { it('should escape special characters in toolName and mcpName', async () => { createPolicyUpdater(policyEngine, messageBus, mockStorage); - const workspacePoliciesDir = '/mock/project/.gemini/policies'; - const policyFile = path.join( - workspacePoliciesDir, - AUTO_SAVED_POLICY_FILENAME, - ); - vi.spyOn(mockStorage, 'getWorkspacePoliciesDir').mockReturnValue( - workspacePoliciesDir, - ); + const userPoliciesDir = '/mock/user/.gemini/policies'; + const policyFile = path.join(userPoliciesDir, AUTO_SAVED_POLICY_FILENAME); vi.spyOn(mockStorage, 'getAutoSavedPolicyPath').mockReturnValue(policyFile); (fs.mkdir as unknown as Mock).mockResolvedValue(undefined); (fs.readFile as unknown as Mock).mockRejectedValue( diff --git a/packages/core/src/policy/policy-updater.test.ts b/packages/core/src/policy/policy-updater.test.ts index 40780a1850..3037667949 100644 --- a/packages/core/src/policy/policy-updater.test.ts +++ b/packages/core/src/policy/policy-updater.test.ts @@ -50,8 +50,8 @@ describe('createPolicyUpdater', () => { messageBus = new MessageBus(policyEngine); mockStorage = new Storage('/mock/project'); - vi.spyOn(mockStorage, 'getWorkspacePoliciesDir').mockReturnValue( - '/mock/project/.gemini/policies', + vi.spyOn(mockStorage, 'getAutoSavedPolicyPath').mockReturnValue( + '/mock/user/.gemini/policies/auto-saved.toml', ); });