From 69c55827239b5c937c177eef4b4fbcc2758ef23e Mon Sep 17 00:00:00 2001 From: shrutip90 Date: Thu, 14 Aug 2025 11:15:48 -0700 Subject: feat: Show untrusted status in the Footer (#6210) Co-authored-by: Jacob Richman --- packages/cli/src/ui/App.test.tsx | 41 ++++++++++++ packages/cli/src/ui/App.tsx | 6 +- packages/cli/src/ui/components/Footer.test.tsx | 53 +++++++++++++++ packages/cli/src/ui/components/Footer.tsx | 8 ++- packages/cli/src/ui/hooks/useFolderTrust.test.ts | 44 ++++++++----- packages/cli/src/ui/hooks/useFolderTrust.ts | 82 ++++++++++++++++-------- 6 files changed, 187 insertions(+), 47 deletions(-) (limited to 'packages/cli/src/ui') diff --git a/packages/cli/src/ui/App.test.tsx b/packages/cli/src/ui/App.test.tsx index c797b778..64cd5842 100644 --- a/packages/cli/src/ui/App.test.tsx +++ b/packages/cli/src/ui/App.test.tsx @@ -163,6 +163,7 @@ vi.mock('@google/gemini-cli-core', async (importOriginal) => { getCurrentIde: vi.fn(() => 'vscode'), getDetectedIdeDisplayName: vi.fn(() => 'VSCode'), })), + isTrustedFolder: vi.fn(() => true), }; }); @@ -1118,5 +1119,45 @@ describe('App UI', () => { await Promise.resolve(); expect(lastFrame()).toContain('Do you trust this folder?'); }); + + it('should display the folder trust dialog when the feature is enabled but the folder is not trusted', async () => { + const { useFolderTrust } = await import('./hooks/useFolderTrust.js'); + vi.mocked(useFolderTrust).mockReturnValue({ + isFolderTrustDialogOpen: true, + handleFolderTrustSelect: vi.fn(), + }); + mockConfig.isTrustedFolder.mockReturnValue(false); + + const { lastFrame, unmount } = render( + , + ); + currentUnmount = unmount; + await Promise.resolve(); + expect(lastFrame()).toContain('Do you trust this folder?'); + }); + + it('should not display the folder trust dialog when the feature is disabled', async () => { + const { useFolderTrust } = await import('./hooks/useFolderTrust.js'); + vi.mocked(useFolderTrust).mockReturnValue({ + isFolderTrustDialogOpen: false, + handleFolderTrustSelect: vi.fn(), + }); + mockConfig.isTrustedFolder.mockReturnValue(false); + + const { lastFrame, unmount } = render( + , + ); + currentUnmount = unmount; + await Promise.resolve(); + expect(lastFrame()).not.toContain('Do you trust this folder?'); + }); }); }); diff --git a/packages/cli/src/ui/App.tsx b/packages/cli/src/ui/App.tsx index 5d4643e5..2c17315f 100644 --- a/packages/cli/src/ui/App.tsx +++ b/packages/cli/src/ui/App.tsx @@ -171,6 +171,9 @@ const App = ({ config, settings, startupWarnings = [], version }: AppProps) => { const [editorError, setEditorError] = useState(null); const [footerHeight, setFooterHeight] = useState(0); const [corgiMode, setCorgiMode] = useState(false); + const [isTrustedFolderState, setIsTrustedFolder] = useState( + config.isTrustedFolder(), + ); const [currentModel, setCurrentModel] = useState(config.getModel()); const [shellModeActive, setShellModeActive] = useState(false); const [showErrorDetails, setShowErrorDetails] = useState(false); @@ -254,7 +257,7 @@ const App = ({ config, settings, startupWarnings = [], version }: AppProps) => { const { isFolderTrustDialogOpen, handleFolderTrustSelect } = useFolderTrust( settings, - config, + setIsTrustedFolder, ); const { @@ -1198,6 +1201,7 @@ const App = ({ config, settings, startupWarnings = [], version }: AppProps) => { promptTokenCount={sessionStats.lastPromptTokenCount} nightly={nightly} vimMode={vimModeEnabled ? vimMode : undefined} + isTrustedFolder={isTrustedFolderState} /> diff --git a/packages/cli/src/ui/components/Footer.test.tsx b/packages/cli/src/ui/components/Footer.test.tsx index 5e79eea4..e3673dfe 100644 --- a/packages/cli/src/ui/components/Footer.test.tsx +++ b/packages/cli/src/ui/components/Footer.test.tsx @@ -103,4 +103,57 @@ describe('