From 4eedc4396425e5a13acfb4e47a578b1aad49b783 Mon Sep 17 00:00:00 2001 From: Taylor Mullen Date: Sat, 7 Feb 2026 13:06:20 -0800 Subject: [PATCH 1/4] fix(ui): remove redundant newlines in Gemini messages - Make marginBottom on Gemini message segments conditional on alternate buffer mode - Add conditional marginTop to ShowMoreLines component - Update test mock config to support getUseBackgroundColor - Fix failing UI tests and update snapshots - Includes package-lock.json update to fix pre-existing build issues --- package-lock.json | 25 +------------------ packages/cli/src/test-utils/render.tsx | 3 +++ .../src/ui/components/ShowMoreLines.test.tsx | 4 +++ .../cli/src/ui/components/ShowMoreLines.tsx | 4 ++- .../HistoryItemDisplay.test.tsx.snap | 12 +++------ .../ui/components/messages/GeminiMessage.tsx | 2 +- .../messages/GeminiMessageContent.tsx | 2 +- 7 files changed, 17 insertions(+), 35 deletions(-) diff --git a/package-lock.json b/package-lock.json index bb2d9b9b9fa..682dbf2777f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2255,7 +2255,6 @@ "integrity": "sha512-t54CUOsFMappY1Jbzb7fetWeO0n6K0k/4+/ZpkS+3Joz8I4VcvY9OiEBFRYISqaI2fq5sCiPtAjRDOzVYG8m+Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@octokit/auth-token": "^6.0.0", "@octokit/graphql": "^9.0.2", @@ -2436,7 +2435,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", "license": "Apache-2.0", - "peer": true, "engines": { "node": ">=8.0.0" } @@ -2470,7 +2468,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, @@ -2839,7 +2836,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.1.tgz", "integrity": "sha512-dZOB3R6zvBwDKnHDTB4X1xtMArB/d324VsbiPkX/Yu0Q8T2xceRthoIVFhJdvgVM2QhGVUyX9tzwiNxGtoBJUw==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@opentelemetry/core": "2.0.1", "@opentelemetry/semantic-conventions": "^1.29.0" @@ -2873,7 +2869,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.0.1.tgz", "integrity": "sha512-wf8OaJoSnujMAHWR3g+/hGvNcsC16rf9s1So4JlMiFaFHiE4HpIA3oUh+uWZQ7CNuK8gVW/pQSkgoa5HkkOl0g==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@opentelemetry/core": "2.0.1", "@opentelemetry/resources": "2.0.1" @@ -2926,7 +2921,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.0.1.tgz", "integrity": "sha512-xYLlvk/xdScGx1aEqvxLwf6sXQLXCjk3/1SQT9X9AoN5rXRhkdvIFShuNNmtTEPRBqcsMbS4p/gJLNI2wXaDuQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@opentelemetry/core": "2.0.1", "@opentelemetry/resources": "2.0.1", @@ -4142,7 +4136,6 @@ "integrity": "sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA==", "devOptional": true, "license": "MIT", - "peer": true, "dependencies": { "csstype": "^3.0.2" } @@ -4437,7 +4430,6 @@ "integrity": "sha512-6sMvZePQrnZH2/cJkwRpkT7DxoAWh+g6+GFRK6bV3YQo7ogi3SX5rgF6099r5Q53Ma5qeT7LGmOmuIutF4t3lA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.35.0", "@typescript-eslint/types": "8.35.0", @@ -5430,7 +5422,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -8440,7 +8431,6 @@ "integrity": "sha512-GsGizj2Y1rCWDu6XoEekL3RLilp0voSePurjZIkxL3wlm5o5EC9VpgaP7lrCvjnkuLvzFBQWB3vWB3K5KQTveQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", @@ -8981,7 +8971,6 @@ "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", "license": "MIT", - "peer": true, "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.1", @@ -10595,7 +10584,6 @@ "resolved": "https://registry.npmjs.org/@jrichman/ink/-/ink-6.4.8.tgz", "integrity": "sha512-v0thcXIKl9hqF/1w4HqA6MKxIcMoWSP3YtEZIAA+eeJngXpN5lGnMkb6rllB7FnOdwyEyYaFTcu1ZVr4/JZpWQ==", "license": "MIT", - "peer": true, "dependencies": { "@alcalzone/ansi-tokenize": "^0.2.1", "ansi-escapes": "^7.0.0", @@ -14380,7 +14368,6 @@ "resolved": "https://registry.npmjs.org/react/-/react-19.2.0.tgz", "integrity": "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -14391,7 +14378,6 @@ "integrity": "sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA==", "devOptional": true, "license": "MIT", - "peer": true, "dependencies": { "shell-quote": "^1.6.1", "ws": "^7" @@ -16628,7 +16614,6 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -16852,8 +16837,7 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, - "license": "0BSD", - "peer": true + "license": "0BSD" }, "node_modules/tsx": { "version": "4.20.3", @@ -16861,7 +16845,6 @@ "integrity": "sha512-qjbnuR9Tr+FJOMBqJCW5ehvIo/buZq7vH7qD7JziU98h6l3qGy0a/yPFjwO+y0/T7GFpNgNAvEcPPVfyT8rrPQ==", "devOptional": true, "license": "MIT", - "peer": true, "dependencies": { "esbuild": "~0.25.0", "get-tsconfig": "^4.7.5" @@ -17034,7 +17017,6 @@ "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", "devOptional": true, "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -17242,7 +17224,6 @@ "resolved": "https://registry.npmjs.org/vite/-/vite-7.2.2.tgz", "integrity": "sha512-BxAKBWmIbrDgrokdGZH1IgkIk/5mMHDreLDmCJ0qpyJaAteP8NvMhkwr/ZCQNqNH97bw/dANTE9PDzqwJghfMQ==", "license": "MIT", - "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.5.0", @@ -17356,7 +17337,6 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -17369,7 +17349,6 @@ "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz", "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", "license": "MIT", - "peer": true, "dependencies": { "@types/chai": "^5.2.2", "@vitest/expect": "3.2.4", @@ -18074,7 +18053,6 @@ "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", "license": "MIT", - "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } @@ -18373,7 +18351,6 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, diff --git a/packages/cli/src/test-utils/render.tsx b/packages/cli/src/test-utils/render.tsx index 64fccf1b3e7..aaa37e4f2f2 100644 --- a/packages/cli/src/test-utils/render.tsx +++ b/packages/cli/src/test-utils/render.tsx @@ -121,6 +121,9 @@ const configProxy = new Proxy({} as Config, { return () => '/Users/test/project/foo/bar/and/some/more/directories/to/make/it/long'; } + if (prop === 'getUseBackgroundColor') { + return () => true; + } const internal = getMockConfigInternal(); if (prop in internal) { // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion diff --git a/packages/cli/src/ui/components/ShowMoreLines.test.tsx b/packages/cli/src/ui/components/ShowMoreLines.test.tsx index 2b5ec26b722..9b22b3f4585 100644 --- a/packages/cli/src/ui/components/ShowMoreLines.test.tsx +++ b/packages/cli/src/ui/components/ShowMoreLines.test.tsx @@ -9,17 +9,21 @@ import { ShowMoreLines } from './ShowMoreLines.js'; import { describe, it, expect, vi, beforeEach } from 'vitest'; import { useOverflowState } from '../contexts/OverflowContext.js'; import { useStreamingContext } from '../contexts/StreamingContext.js'; +import { useAlternateBuffer } from '../hooks/useAlternateBuffer.js'; import { StreamingState } from '../types.js'; vi.mock('../contexts/OverflowContext.js'); vi.mock('../contexts/StreamingContext.js'); +vi.mock('../hooks/useAlternateBuffer.js'); describe('ShowMoreLines', () => { const mockUseOverflowState = vi.mocked(useOverflowState); const mockUseStreamingContext = vi.mocked(useStreamingContext); + const mockUseAlternateBuffer = vi.mocked(useAlternateBuffer); beforeEach(() => { vi.clearAllMocks(); + mockUseAlternateBuffer.mockReturnValue(false); }); it.each([ diff --git a/packages/cli/src/ui/components/ShowMoreLines.tsx b/packages/cli/src/ui/components/ShowMoreLines.tsx index e19f8775605..e0b7cb25005 100644 --- a/packages/cli/src/ui/components/ShowMoreLines.tsx +++ b/packages/cli/src/ui/components/ShowMoreLines.tsx @@ -9,6 +9,7 @@ import { useOverflowState } from '../contexts/OverflowContext.js'; import { useStreamingContext } from '../contexts/StreamingContext.js'; import { StreamingState } from '../types.js'; import { theme } from '../semantic-colors.js'; +import { useAlternateBuffer } from '../hooks/useAlternateBuffer.js'; interface ShowMoreLinesProps { constrainHeight: boolean; @@ -17,6 +18,7 @@ interface ShowMoreLinesProps { export const ShowMoreLines = ({ constrainHeight }: ShowMoreLinesProps) => { const overflowState = useOverflowState(); const streamingState = useStreamingContext(); + const isAlternateBuffer = useAlternateBuffer(); if ( overflowState === undefined || @@ -31,7 +33,7 @@ export const ShowMoreLines = ({ constrainHeight }: ShowMoreLinesProps) => { } return ( - + Press ctrl-o to show more lines diff --git a/packages/cli/src/ui/components/__snapshots__/HistoryItemDisplay.test.tsx.snap b/packages/cli/src/ui/components/__snapshots__/HistoryItemDisplay.test.tsx.snap index 1f6288c2923..6aa73b00e46 100644 --- a/packages/cli/src/ui/components/__snapshots__/HistoryItemDisplay.test.tsx.snap +++ b/packages/cli/src/ui/components/__snapshots__/HistoryItemDisplay.test.tsx.snap @@ -51,8 +51,7 @@ exports[` > gemini items (alternateBuffer=false) > should 47 Line 47 48 Line 48 49 Line 49 - 50 Line 50 -" + 50 Line 50" `; exports[` > gemini items (alternateBuffer=false) > should render a full gemini_content item when using availableTerminalHeightGemini 1`] = ` @@ -106,8 +105,7 @@ exports[` > gemini items (alternateBuffer=false) > should 47 Line 47 48 Line 48 49 Line 49 - 50 Line 50 -" + 50 Line 50" `; exports[` > gemini items (alternateBuffer=false) > should render a truncated gemini item 1`] = ` @@ -120,8 +118,7 @@ exports[` > gemini items (alternateBuffer=false) > should 47 Line 47 48 Line 48 49 Line 49 - 50 Line 50 -" + 50 Line 50" `; exports[` > gemini items (alternateBuffer=false) > should render a truncated gemini_content item 1`] = ` @@ -134,8 +131,7 @@ exports[` > gemini items (alternateBuffer=false) > should 47 Line 47 48 Line 48 49 Line 49 - 50 Line 50 -" + 50 Line 50" `; exports[` > gemini items (alternateBuffer=true) > should render a full gemini item when using availableTerminalHeightGemini 1`] = ` diff --git a/packages/cli/src/ui/components/messages/GeminiMessage.tsx b/packages/cli/src/ui/components/messages/GeminiMessage.tsx index caa191069ef..54750cb4f6f 100644 --- a/packages/cli/src/ui/components/messages/GeminiMessage.tsx +++ b/packages/cli/src/ui/components/messages/GeminiMessage.tsx @@ -50,7 +50,7 @@ export const GeminiMessage: React.FC = ({ terminalWidth={terminalWidth} renderMarkdown={renderMarkdown} /> - + diff --git a/packages/cli/src/ui/components/messages/GeminiMessageContent.tsx b/packages/cli/src/ui/components/messages/GeminiMessageContent.tsx index e0a2131318c..b814636b8ea 100644 --- a/packages/cli/src/ui/components/messages/GeminiMessageContent.tsx +++ b/packages/cli/src/ui/components/messages/GeminiMessageContent.tsx @@ -48,7 +48,7 @@ export const GeminiMessageContent: React.FC = ({ terminalWidth={terminalWidth} renderMarkdown={renderMarkdown} /> - + From ff423a4ec96828c87953db472381227e297ef522 Mon Sep 17 00:00:00 2001 From: Taylor Mullen Date: Sat, 7 Feb 2026 14:10:04 -0800 Subject: [PATCH 2/4] test(ui): update snapshots for ShowMoreLines and ToolConfirmationQueue --- packages/cli/src/ui/components/ShowMoreLines.tsx | 2 +- .../cli/src/ui/components/ToolConfirmationQueue.tsx | 4 +--- .../ToolConfirmationQueue.test.tsx.snap | 12 +++++------- .../src/ui/components/messages/ToolGroupMessage.tsx | 4 +--- 4 files changed, 8 insertions(+), 14 deletions(-) diff --git a/packages/cli/src/ui/components/ShowMoreLines.tsx b/packages/cli/src/ui/components/ShowMoreLines.tsx index e0b7cb25005..b30804b6909 100644 --- a/packages/cli/src/ui/components/ShowMoreLines.tsx +++ b/packages/cli/src/ui/components/ShowMoreLines.tsx @@ -33,7 +33,7 @@ export const ShowMoreLines = ({ constrainHeight }: ShowMoreLinesProps) => { } return ( - + Press ctrl-o to show more lines diff --git a/packages/cli/src/ui/components/ToolConfirmationQueue.tsx b/packages/cli/src/ui/components/ToolConfirmationQueue.tsx index e68affbf5ef..a73bb249703 100644 --- a/packages/cli/src/ui/components/ToolConfirmationQueue.tsx +++ b/packages/cli/src/ui/components/ToolConfirmationQueue.tsx @@ -150,9 +150,7 @@ export const ToolConfirmationQueue: React.FC = ({ borderStyle="round" /> - - - + ); }; diff --git a/packages/cli/src/ui/components/__snapshots__/ToolConfirmationQueue.test.tsx.snap b/packages/cli/src/ui/components/__snapshots__/ToolConfirmationQueue.test.tsx.snap index a4238e20280..a47efb31d39 100644 --- a/packages/cli/src/ui/components/__snapshots__/ToolConfirmationQueue.test.tsx.snap +++ b/packages/cli/src/ui/components/__snapshots__/ToolConfirmationQueue.test.tsx.snap @@ -16,8 +16,8 @@ exports[`ToolConfirmationQueue > calculates availableContentHeight based on avai │ 4. No, suggest changes (esc) │ │ │ ╰──────────────────────────────────────────────────────────────────────────────╯ - Press ctrl-o to show more lines -" + + Press ctrl-o to show more lines" `; exports[`ToolConfirmationQueue > does not render expansion hint when constrainHeight is false 1`] = ` @@ -38,8 +38,7 @@ exports[`ToolConfirmationQueue > does not render expansion hint when constrainHe │ 3. Modify with external editor │ │ 4. No, suggest changes (esc) │ │ │ -╰──────────────────────────────────────────────────────────────────────────────╯ -" +╰──────────────────────────────────────────────────────────────────────────────╯" `; exports[`ToolConfirmationQueue > renders expansion hint when content is long and constrained 1`] = ` @@ -58,8 +57,8 @@ exports[`ToolConfirmationQueue > renders expansion hint when content is long and │ 4. No, suggest changes (esc) │ │ │ ╰──────────────────────────────────────────────────────────────────────────────╯ - Press ctrl-o to show more lines + Press ctrl-o to show more lines @@ -88,6 +87,5 @@ exports[`ToolConfirmationQueue > renders the confirming tool with progress indic │ 2. Allow for this session │ │ 3. No, suggest changes (esc) │ │ │ -╰──────────────────────────────────────────────────────────────────────────────╯ -" +╰──────────────────────────────────────────────────────────────────────────────╯" `; diff --git a/packages/cli/src/ui/components/messages/ToolGroupMessage.tsx b/packages/cli/src/ui/components/messages/ToolGroupMessage.tsx index 118b198edfb..f9225b60e7a 100644 --- a/packages/cli/src/ui/components/messages/ToolGroupMessage.tsx +++ b/packages/cli/src/ui/components/messages/ToolGroupMessage.tsx @@ -260,9 +260,7 @@ export const ToolGroupMessage: React.FC = ({ ) } {(borderBottomOverride ?? true) && visibleToolCalls.length > 0 && ( - - - + )} ); From 724de0c46710277bd9cd971dacc73bcdb4a41a50 Mon Sep 17 00:00:00 2001 From: Taylor Mullen Date: Mon, 9 Feb 2026 13:35:12 -0800 Subject: [PATCH 3/4] fix(ui): remove redundant newline in ToolConfirmationQueue and simplify ShowMoreLines layout - Refactor ShowMoreLines to be a stateless UI component without internal margins - Move vertical spacing responsibility to parent components (GeminiMessage, GeminiMessageContent) - Fix redundant newline in ToolConfirmationQueue by leveraging the new margin-free ShowMoreLines - Update test snapshots to reflect the cleaned up layout Part of https://github.com/google-gemini/gemini-cli/pull/18538 --- packages/cli/src/ui/components/ShowMoreLines.tsx | 4 +--- .../__snapshots__/HistoryItemDisplay.test.tsx.snap | 12 ++++++++---- .../ToolConfirmationQueue.test.tsx.snap | 3 +-- .../cli/src/ui/components/messages/GeminiMessage.tsx | 5 ++++- .../ui/components/messages/GeminiMessageContent.tsx | 5 ++++- 5 files changed, 18 insertions(+), 11 deletions(-) diff --git a/packages/cli/src/ui/components/ShowMoreLines.tsx b/packages/cli/src/ui/components/ShowMoreLines.tsx index b30804b6909..a3317d4dc60 100644 --- a/packages/cli/src/ui/components/ShowMoreLines.tsx +++ b/packages/cli/src/ui/components/ShowMoreLines.tsx @@ -9,7 +9,6 @@ import { useOverflowState } from '../contexts/OverflowContext.js'; import { useStreamingContext } from '../contexts/StreamingContext.js'; import { StreamingState } from '../types.js'; import { theme } from '../semantic-colors.js'; -import { useAlternateBuffer } from '../hooks/useAlternateBuffer.js'; interface ShowMoreLinesProps { constrainHeight: boolean; @@ -18,7 +17,6 @@ interface ShowMoreLinesProps { export const ShowMoreLines = ({ constrainHeight }: ShowMoreLinesProps) => { const overflowState = useOverflowState(); const streamingState = useStreamingContext(); - const isAlternateBuffer = useAlternateBuffer(); if ( overflowState === undefined || @@ -33,7 +31,7 @@ export const ShowMoreLines = ({ constrainHeight }: ShowMoreLinesProps) => { } return ( - + Press ctrl-o to show more lines diff --git a/packages/cli/src/ui/components/__snapshots__/HistoryItemDisplay.test.tsx.snap b/packages/cli/src/ui/components/__snapshots__/HistoryItemDisplay.test.tsx.snap index 6aa73b00e46..1f6288c2923 100644 --- a/packages/cli/src/ui/components/__snapshots__/HistoryItemDisplay.test.tsx.snap +++ b/packages/cli/src/ui/components/__snapshots__/HistoryItemDisplay.test.tsx.snap @@ -51,7 +51,8 @@ exports[` > gemini items (alternateBuffer=false) > should 47 Line 47 48 Line 48 49 Line 49 - 50 Line 50" + 50 Line 50 +" `; exports[` > gemini items (alternateBuffer=false) > should render a full gemini_content item when using availableTerminalHeightGemini 1`] = ` @@ -105,7 +106,8 @@ exports[` > gemini items (alternateBuffer=false) > should 47 Line 47 48 Line 48 49 Line 49 - 50 Line 50" + 50 Line 50 +" `; exports[` > gemini items (alternateBuffer=false) > should render a truncated gemini item 1`] = ` @@ -118,7 +120,8 @@ exports[` > gemini items (alternateBuffer=false) > should 47 Line 47 48 Line 48 49 Line 49 - 50 Line 50" + 50 Line 50 +" `; exports[` > gemini items (alternateBuffer=false) > should render a truncated gemini_content item 1`] = ` @@ -131,7 +134,8 @@ exports[` > gemini items (alternateBuffer=false) > should 47 Line 47 48 Line 48 49 Line 49 - 50 Line 50" + 50 Line 50 +" `; exports[` > gemini items (alternateBuffer=true) > should render a full gemini item when using availableTerminalHeightGemini 1`] = ` diff --git a/packages/cli/src/ui/components/__snapshots__/ToolConfirmationQueue.test.tsx.snap b/packages/cli/src/ui/components/__snapshots__/ToolConfirmationQueue.test.tsx.snap index a47efb31d39..d4bbfdeaeba 100644 --- a/packages/cli/src/ui/components/__snapshots__/ToolConfirmationQueue.test.tsx.snap +++ b/packages/cli/src/ui/components/__snapshots__/ToolConfirmationQueue.test.tsx.snap @@ -16,7 +16,6 @@ exports[`ToolConfirmationQueue > calculates availableContentHeight based on avai │ 4. No, suggest changes (esc) │ │ │ ╰──────────────────────────────────────────────────────────────────────────────╯ - Press ctrl-o to show more lines" `; @@ -57,7 +56,6 @@ exports[`ToolConfirmationQueue > renders expansion hint when content is long and │ 4. No, suggest changes (esc) │ │ │ ╰──────────────────────────────────────────────────────────────────────────────╯ - Press ctrl-o to show more lines @@ -71,6 +69,7 @@ exports[`ToolConfirmationQueue > renders expansion hint when content is long and + " `; diff --git a/packages/cli/src/ui/components/messages/GeminiMessage.tsx b/packages/cli/src/ui/components/messages/GeminiMessage.tsx index 54750cb4f6f..95e392dab7e 100644 --- a/packages/cli/src/ui/components/messages/GeminiMessage.tsx +++ b/packages/cli/src/ui/components/messages/GeminiMessage.tsx @@ -50,7 +50,10 @@ export const GeminiMessage: React.FC = ({ terminalWidth={terminalWidth} renderMarkdown={renderMarkdown} /> - + diff --git a/packages/cli/src/ui/components/messages/GeminiMessageContent.tsx b/packages/cli/src/ui/components/messages/GeminiMessageContent.tsx index b814636b8ea..847e95a357d 100644 --- a/packages/cli/src/ui/components/messages/GeminiMessageContent.tsx +++ b/packages/cli/src/ui/components/messages/GeminiMessageContent.tsx @@ -48,7 +48,10 @@ export const GeminiMessageContent: React.FC = ({ terminalWidth={terminalWidth} renderMarkdown={renderMarkdown} /> - + From e204bd23f9f0979b07ead50bc2b49534aec4ca25 Mon Sep 17 00:00:00 2001 From: Taylor Mullen Date: Mon, 9 Feb 2026 18:57:29 -0800 Subject: [PATCH 4/4] test: fix EPERM errors and update snapshots after rebase - Use tmpdir() from @google/gemini-cli-core in extension-manager-themes.spec.ts and testing_utils.ts to avoid Seatbelt EPERM errors and satisfy lint rules - Update MainContent snapshots to reflect intentional spacing changes in the PR - Update BackgroundShellDisplay snapshots - Resolves CI failures caused by environment restrictions and layout updates Part of https://github.com/google-gemini/gemini-cli/pull/18538 --- packages/a2a-server/src/utils/testing_utils.ts | 9 ++++++--- .../cli/src/config/extension-manager-themes.spec.ts | 4 ++-- .../BackgroundShellDisplay.test.tsx.snap | 11 +++++++++++ .../__snapshots__/MainContent.test.tsx.snap | 8 ++++---- 4 files changed, 23 insertions(+), 9 deletions(-) diff --git a/packages/a2a-server/src/utils/testing_utils.ts b/packages/a2a-server/src/utils/testing_utils.ts index 74e93f8f7b8..86d0d4a4bd4 100644 --- a/packages/a2a-server/src/utils/testing_utils.ts +++ b/packages/a2a-server/src/utils/testing_utils.ts @@ -4,6 +4,7 @@ * SPDX-License-Identifier: Apache-2.0 */ +import * as path from 'node:path'; import type { Task as SDKTask, TaskStatusUpdateEvent, @@ -16,6 +17,7 @@ import { GeminiClient, HookSystem, PolicyDecision, + tmpdir, } from '@google/gemini-cli-core'; import { createMockMessageBus } from '@google/gemini-cli-core/src/test-utils/mock-message-bus.js'; import type { Config, Storage } from '@google/gemini-cli-core'; @@ -24,6 +26,7 @@ import { expect, vi } from 'vitest'; export function createMockConfig( overrides: Partial = {}, ): Partial { + const tmpDir = tmpdir(); // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion const mockConfig = { getToolRegistry: vi.fn().mockReturnValue({ @@ -39,12 +42,12 @@ export function createMockConfig( getWorkspaceContext: vi.fn().mockReturnValue({ isPathWithinWorkspace: () => true, }), - getTargetDir: () => '/test', + getTargetDir: () => tmpDir, getCheckpointingEnabled: vi.fn().mockReturnValue(false), // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion storage: { - getProjectTempDir: () => '/tmp', - getProjectTempCheckpointsDir: () => '/tmp/checkpoints', + getProjectTempDir: () => tmpDir, + getProjectTempCheckpointsDir: () => path.join(tmpDir, 'checkpoints'), } as Storage, getTruncateToolOutputThreshold: () => DEFAULT_TRUNCATE_TOOL_OUTPUT_THRESHOLD, diff --git a/packages/cli/src/config/extension-manager-themes.spec.ts b/packages/cli/src/config/extension-manager-themes.spec.ts index 7db28999290..56a71a9f4ce 100644 --- a/packages/cli/src/config/extension-manager-themes.spec.ts +++ b/packages/cli/src/config/extension-manager-themes.spec.ts @@ -19,7 +19,7 @@ import { import { createExtension } from '../test-utils/createExtension.js'; import { ExtensionManager } from './extension-manager.js'; import { themeManager, DEFAULT_THEME } from '../ui/themes/theme-manager.js'; -import { GEMINI_DIR, type Config } from '@google/gemini-cli-core'; +import { GEMINI_DIR, type Config, tmpdir } from '@google/gemini-cli-core'; import { createTestMergedSettings, SettingScope } from './settings.js'; describe('ExtensionManager theme loading', () => { @@ -29,7 +29,7 @@ describe('ExtensionManager theme loading', () => { beforeAll(async () => { tempHomeDir = await fs.promises.mkdtemp( - path.join(fs.realpathSync('/tmp'), 'gemini-cli-test-'), + path.join(tmpdir(), 'gemini-cli-test-'), ); }); diff --git a/packages/cli/src/ui/components/__snapshots__/BackgroundShellDisplay.test.tsx.snap b/packages/cli/src/ui/components/__snapshots__/BackgroundShellDisplay.test.tsx.snap index b93819b570e..9996ea504bb 100644 --- a/packages/cli/src/ui/components/__snapshots__/BackgroundShellDisplay.test.tsx.snap +++ b/packages/cli/src/ui/components/__snapshots__/BackgroundShellDisplay.test.tsx.snap @@ -54,3 +54,14 @@ exports[` > scrolls to active shell when list opens 1` │ ● 2. tail -f log.txt (PID: 1002) │ └──────────────────────────────────────────────────────────────────────────────────────────────────┘" `; + +exports[` > selects the current process and closes the list when Ctrl+L is pressed in list view 1`] = ` +"┌──────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ 1: npm sta... (PID: 1001) (Focused) Close (Ctrl+B) | Kill (Ctrl+K) | List (Ctrl+L) │ +│ │ +│ Select Process (Enter to select, Ctrl+K to kill, Esc to cancel): │ +│ │ +│ ● 1. npm start (PID: 1001) │ +│ 2. tail -f log.txt (PID: 1002) │ +└──────────────────────────────────────────────────────────────────────────────────────────────────┘" +`; diff --git a/packages/cli/src/ui/components/__snapshots__/MainContent.test.tsx.snap b/packages/cli/src/ui/components/__snapshots__/MainContent.test.tsx.snap index c134cde0220..d04486fadfd 100644 --- a/packages/cli/src/ui/components/__snapshots__/MainContent.test.tsx.snap +++ b/packages/cli/src/ui/components/__snapshots__/MainContent.test.tsx.snap @@ -28,7 +28,7 @@ AppHeader │ Line 20 │ │ │ ╰──────────────────────────────────────────────────────────────────────────────────────────────╯ - ShowMoreLines" +ShowMoreLines" `; exports[`MainContent > MainContent Tool Output Height Logic > 'ASB mode - Unfocused shell' 1`] = ` @@ -53,7 +53,7 @@ AppHeader │ Line 19 █ │ │ Line 20 █ │ ╰──────────────────────────────────────────────────────────────────────────────────────────────╯ - ShowMoreLines" +ShowMoreLines" `; exports[`MainContent > MainContent Tool Output Height Logic > 'Normal mode - Constrained height' 1`] = ` @@ -77,7 +77,7 @@ exports[`MainContent > MainContent Tool Output Height Logic > 'Normal mode - Con │ Line 19 │ │ Line 20 │ ╰──────────────────────────────────────────────────────────────────────────────────────────────╯ - ShowMoreLines" +ShowMoreLines" `; exports[`MainContent > MainContent Tool Output Height Logic > 'Normal mode - Unconstrained height' 1`] = ` @@ -101,7 +101,7 @@ exports[`MainContent > MainContent Tool Output Height Logic > 'Normal mode - Unc │ Line 19 │ │ Line 20 │ ╰──────────────────────────────────────────────────────────────────────────────────────────────╯ - ShowMoreLines" +ShowMoreLines" `; exports[`MainContent > does not constrain height in alternate buffer mode 1`] = `