diff options
Diffstat (limited to 'packages/cli/src')
3 files changed, 111 insertions, 6 deletions
diff --git a/packages/cli/src/ui/components/IDEContextDetailDisplay.test.tsx b/packages/cli/src/ui/components/IDEContextDetailDisplay.test.tsx new file mode 100644 index 00000000..629d6c2e --- /dev/null +++ b/packages/cli/src/ui/components/IDEContextDetailDisplay.test.tsx @@ -0,0 +1,66 @@ +/** + * @license + * Copyright 2025 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +import { render } from 'ink-testing-library'; +import { describe, it, expect } from 'vitest'; +import { IDEContextDetailDisplay } from './IDEContextDetailDisplay.js'; +import { type IdeContext } from '@google/gemini-cli-core'; + +describe('IDEContextDetailDisplay', () => { + it('renders an empty string when there are no open files', () => { + const ideContext: IdeContext = { + workspaceState: { + openFiles: [], + }, + }; + const { lastFrame } = render( + <IDEContextDetailDisplay + ideContext={ideContext} + detectedIdeDisplay="VS Code" + />, + ); + expect(lastFrame()).toBe(''); + }); + + it('renders a list of open files with active status', () => { + const ideContext: IdeContext = { + workspaceState: { + openFiles: [ + { path: '/foo/bar.txt', isActive: true }, + { path: '/foo/baz.txt', isActive: false }, + ], + }, + }; + const { lastFrame } = render( + <IDEContextDetailDisplay + ideContext={ideContext} + detectedIdeDisplay="VS Code" + />, + ); + const output = lastFrame(); + expect(output).toMatchSnapshot(); + }); + + it('handles duplicate basenames by showing path hints', () => { + const ideContext: IdeContext = { + workspaceState: { + openFiles: [ + { path: '/foo/bar.txt', isActive: true }, + { path: '/qux/bar.txt', isActive: false }, + { path: '/foo/unique.txt', isActive: false }, + ], + }, + }; + const { lastFrame } = render( + <IDEContextDetailDisplay + ideContext={ideContext} + detectedIdeDisplay="VS Code" + />, + ); + const output = lastFrame(); + expect(output).toMatchSnapshot(); + }); +}); diff --git a/packages/cli/src/ui/components/IDEContextDetailDisplay.tsx b/packages/cli/src/ui/components/IDEContextDetailDisplay.tsx index a1739227..ec3c2dad 100644 --- a/packages/cli/src/ui/components/IDEContextDetailDisplay.tsx +++ b/packages/cli/src/ui/components/IDEContextDetailDisplay.tsx @@ -23,6 +23,12 @@ export function IDEContextDetailDisplay({ return null; } + const basenameCounts = new Map<string, number>(); + for (const file of openFiles) { + const basename = path.basename(file.path); + basenameCounts.set(basename, (basenameCounts.get(basename) || 0) + 1); + } + return ( <Box flexDirection="column" @@ -38,12 +44,21 @@ export function IDEContextDetailDisplay({ {openFiles.length > 0 && ( <Box flexDirection="column" marginTop={1}> <Text bold>Open files:</Text> - {openFiles.map((file: File) => ( - <Text key={file.path}> - - {path.basename(file.path)} - {file.isActive ? ' (active)' : ''} - </Text> - ))} + {openFiles.map((file: File) => { + const basename = path.basename(file.path); + const isDuplicate = (basenameCounts.get(basename) || 0) > 1; + const parentDir = path.basename(path.dirname(file.path)); + const displayName = isDuplicate + ? `${basename} (/${parentDir})` + : basename; + + return ( + <Text key={file.path}> + - {displayName} + {file.isActive ? ' (active)' : ''} + </Text> + ); + })} </Box> )} </Box> diff --git a/packages/cli/src/ui/components/__snapshots__/IDEContextDetailDisplay.test.tsx.snap b/packages/cli/src/ui/components/__snapshots__/IDEContextDetailDisplay.test.tsx.snap new file mode 100644 index 00000000..8b84e1f3 --- /dev/null +++ b/packages/cli/src/ui/components/__snapshots__/IDEContextDetailDisplay.test.tsx.snap @@ -0,0 +1,24 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`IDEContextDetailDisplay > handles duplicate basenames by showing path hints 1`] = ` +" +╭──────────────────────────────────────────────────────────────────────────────────────────────────╮ +│ VS Code Context (ctrl+e to toggle) │ +│ │ +│ Open files: │ +│ - bar.txt (/foo) (active) │ +│ - bar.txt (/qux) │ +│ - unique.txt │ +╰──────────────────────────────────────────────────────────────────────────────────────────────────╯" +`; + +exports[`IDEContextDetailDisplay > renders a list of open files with active status 1`] = ` +" +╭──────────────────────────────────────────────────────────────────────────────────────────────────╮ +│ VS Code Context (ctrl+e to toggle) │ +│ │ +│ Open files: │ +│ - bar.txt (active) │ +│ - baz.txt │ +╰──────────────────────────────────────────────────────────────────────────────────────────────────╯" +`; |
