summaryrefslogtreecommitdiff
path: root/packages/cli/src
diff options
context:
space:
mode:
Diffstat (limited to 'packages/cli/src')
-rw-r--r--packages/cli/src/ui/components/IDEContextDetailDisplay.test.tsx66
-rw-r--r--packages/cli/src/ui/components/IDEContextDetailDisplay.tsx27
-rw-r--r--packages/cli/src/ui/components/__snapshots__/IDEContextDetailDisplay.test.tsx.snap24
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 │
+╰──────────────────────────────────────────────────────────────────────────────────────────────────╯"
+`;