From e5eac6597faaf0b972a86b2f018dc7c775f1663d Mon Sep 17 00:00:00 2001 From: Keith Guerin Date: Sun, 1 Mar 2026 00:13:32 -0800 Subject: [PATCH] fix(ui): resolve test failures and snapshot mismatches --- .../__snapshots__/AskUserDialog.test.tsx.snap | 32 +++---- .../ExitPlanModeDialog.test.tsx.snap | 32 +++---- .../__snapshots__/InputPrompt.test.tsx.snap | 12 +-- .../SessionBrowser.test.tsx.snap | 4 +- ...tings-list-with-visual-indicators.snap.svg | 12 +++ ...bility-settings-enabled-correctly.snap.svg | 12 +++ ...olean-settings-disabled-correctly.snap.svg | 12 +++ ...ld-render-default-state-correctly.snap.svg | 12 +++ ...ing-settings-configured-correctly.snap.svg | 12 +++ ...cused-on-scope-selector-correctly.snap.svg | 6 ++ ...ean-and-number-settings-correctly.snap.svg | 12 +++ ...s-and-security-settings-correctly.snap.svg | 12 +++ ...oolean-settings-enabled-correctly.snap.svg | 12 +++ .../SuggestionsDisplay.test.tsx.snap | 8 +- .../RedirectionConfirmation.test.tsx.snap | 2 +- .../ToolConfirmationMessage.test.tsx.snap | 24 +++--- .../shared/BaseSelectionList.test.tsx | 14 +-- ...DescriptiveRadioButtonSelect.test.tsx.snap | 86 ++++++++++++++++--- packages/cli/src/ui/themes/ansi.ts | 2 +- packages/cli/src/ui/themes/github-light.ts | 1 + packages/cli/src/ui/themes/holiday.ts | 1 + packages/cli/src/ui/themes/theme-manager.ts | 4 +- packages/cli/src/ui/themes/theme.test.ts | 3 - packages/cli/src/ui/themes/theme.ts | 14 ++- packages/cli/src/ui/themes/xcode.ts | 1 + packages/cli/src/ui/utils/textUtils.test.ts | 4 +- 26 files changed, 255 insertions(+), 91 deletions(-) diff --git a/packages/cli/src/ui/components/__snapshots__/AskUserDialog.test.tsx.snap b/packages/cli/src/ui/components/__snapshots__/AskUserDialog.test.tsx.snap index 29a7683d06..06f509f1f6 100644 --- a/packages/cli/src/ui/components/__snapshots__/AskUserDialog.test.tsx.snap +++ b/packages/cli/src/ui/components/__snapshots__/AskUserDialog.test.tsx.snap @@ -5,7 +5,7 @@ exports[`AskUserDialog > Choice question placeholder > uses default placeholder 1. TypeScript 2. JavaScript -● 3. Enter a custom value +● 3. Enter a custom value Enter to submit · Esc to cancel " @@ -16,7 +16,7 @@ exports[`AskUserDialog > Choice question placeholder > uses placeholder for "Oth 1. TypeScript 2. JavaScript -● 3. Type another language... +● 3. Type another language... Enter to submit · Esc to cancel " @@ -26,8 +26,8 @@ exports[`AskUserDialog > Scroll Arrows (useAlternateBuffer: false) > shows scrol "Choose an option ▲ -● 1. Option 1 - Description 1 +● 1. Option 1 + Description 1 2. Option 2 Description 2 ▼ @@ -39,8 +39,8 @@ Enter to select · ↑/↓ to navigate · Esc to cancel exports[`AskUserDialog > Scroll Arrows (useAlternateBuffer: true) > shows scroll arrows correctly when useAlternateBuffer is true 1`] = ` "Choose an option -● 1. Option 1 - Description 1 +● 1. Option 1 + Description 1 2. Option 2 Description 2 3. Option 3 @@ -122,8 +122,8 @@ Enter to submit · Tab/Shift+Tab to edit answers · Esc to cancel exports[`AskUserDialog > hides progress header for single question 1`] = ` "Which authentication method should we use? -● 1. OAuth 2.0 - Industry standard, supports SSO +● 1. OAuth 2.0 + Industry standard, supports SSO 2. JWT tokens Stateless, good for APIs 3. Enter a custom value @@ -135,8 +135,8 @@ Enter to select · ↑/↓ to navigate · Esc to cancel exports[`AskUserDialog > renders question and options 1`] = ` "Which authentication method should we use? -● 1. OAuth 2.0 - Industry standard, supports SSO +● 1. OAuth 2.0 + Industry standard, supports SSO 2. JWT tokens Stateless, good for APIs 3. Enter a custom value @@ -150,8 +150,8 @@ exports[`AskUserDialog > shows Review tab in progress header for multiple questi Which framework? -● 1. React - Component library +● 1. React + Component library 2. Vue Progressive framework 3. Enter a custom value @@ -163,8 +163,8 @@ Enter to select · ←/→ to switch questions · Esc to cancel exports[`AskUserDialog > shows keyboard hints 1`] = ` "Which authentication method should we use? -● 1. OAuth 2.0 - Industry standard, supports SSO +● 1. OAuth 2.0 + Industry standard, supports SSO 2. JWT tokens Stateless, good for APIs 3. Enter a custom value @@ -178,8 +178,8 @@ exports[`AskUserDialog > shows progress header for multiple questions 1`] = ` Which database should we use? -● 1. PostgreSQL - Relational database +● 1. PostgreSQL + Relational database 2. MongoDB Document database 3. Enter a custom value diff --git a/packages/cli/src/ui/components/__snapshots__/ExitPlanModeDialog.test.tsx.snap b/packages/cli/src/ui/components/__snapshots__/ExitPlanModeDialog.test.tsx.snap index db1b6d1ba5..073c106ceb 100644 --- a/packages/cli/src/ui/components/__snapshots__/ExitPlanModeDialog.test.tsx.snap +++ b/packages/cli/src/ui/components/__snapshots__/ExitPlanModeDialog.test.tsx.snap @@ -19,8 +19,8 @@ Files to Modify 1. Yes, automatically accept edits Approves plan and allows tools to run automatically -● 2. Yes, manually accept edits - Approves plan but requires confirmation for each tool +● 2. Yes, manually accept edits + Approves plan but requires confirmation for each tool 3. Type your feedback... Enter to select · ↑/↓ to navigate · Ctrl+X to edit plan · Esc to cancel @@ -44,8 +44,8 @@ Files to Modify - src/index.ts - Add auth middleware - src/config.ts - Add auth configuration options -● 1. Yes, automatically accept edits - Approves plan and allows tools to run automatically +● 1. Yes, automatically accept edits + Approves plan and allows tools to run automatically 2. Yes, manually accept edits Approves plan but requires confirmation for each tool 3. Type your feedback... @@ -76,8 +76,8 @@ Implementation Steps 8. Add multi-factor authentication in src/auth/MFAService.ts ... last 22 lines hidden (Ctrl+O to show) ... -● 1. Yes, automatically accept edits - Approves plan and allows tools to run automatically +● 1. Yes, automatically accept edits + Approves plan and allows tools to run automatically 2. Yes, manually accept edits Approves plan but requires confirmation for each tool 3. Type your feedback... @@ -103,8 +103,8 @@ Files to Modify - src/index.ts - Add auth middleware - src/config.ts - Add auth configuration options -● 1. Yes, automatically accept edits - Approves plan and allows tools to run automatically +● 1. Yes, automatically accept edits + Approves plan and allows tools to run automatically 2. Yes, manually accept edits Approves plan but requires confirmation for each tool 3. Type your feedback... @@ -132,8 +132,8 @@ Files to Modify 1. Yes, automatically accept edits Approves plan and allows tools to run automatically -● 2. Yes, manually accept edits - Approves plan but requires confirmation for each tool +● 2. Yes, manually accept edits + Approves plan but requires confirmation for each tool 3. Type your feedback... Enter to select · ↑/↓ to navigate · Ctrl+X to edit plan · Esc to cancel @@ -157,8 +157,8 @@ Files to Modify - src/index.ts - Add auth middleware - src/config.ts - Add auth configuration options -● 1. Yes, automatically accept edits - Approves plan and allows tools to run automatically +● 1. Yes, automatically accept edits + Approves plan and allows tools to run automatically 2. Yes, manually accept edits Approves plan but requires confirmation for each tool 3. Type your feedback... @@ -210,8 +210,8 @@ Testing Strategy - Security penetration testing - Load testing for session management -● 1. Yes, automatically accept edits - Approves plan and allows tools to run automatically +● 1. Yes, automatically accept edits + Approves plan and allows tools to run automatically 2. Yes, manually accept edits Approves plan but requires confirmation for each tool 3. Type your feedback... @@ -237,8 +237,8 @@ Files to Modify - src/index.ts - Add auth middleware - src/config.ts - Add auth configuration options -● 1. Yes, automatically accept edits - Approves plan and allows tools to run automatically +● 1. Yes, automatically accept edits + Approves plan and allows tools to run automatically 2. Yes, manually accept edits Approves plan but requires confirmation for each tool 3. Type your feedback... diff --git a/packages/cli/src/ui/components/__snapshots__/InputPrompt.test.tsx.snap b/packages/cli/src/ui/components/__snapshots__/InputPrompt.test.tsx.snap index 88a1b0486f..5a2819702e 100644 --- a/packages/cli/src/ui/components/__snapshots__/InputPrompt.test.tsx.snap +++ b/packages/cli/src/ui/components/__snapshots__/InputPrompt.test.tsx.snap @@ -12,8 +12,8 @@ exports[`InputPrompt > command search (Ctrl+R when not in shell) > expands and c (r:) Type your message or @path/to/file ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ lllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll → - lllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll - ... + lllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll + ... " `; @@ -22,8 +22,8 @@ exports[`InputPrompt > command search (Ctrl+R when not in shell) > expands and c (r:) Type your message or @path/to/file ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ lllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll ← - lllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll - llllllllllllllllllllllllllllllllllllllllllllllllll + lllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll + llllllllllllllllllllllllllllllllllllllllllllllllll " `; @@ -31,7 +31,7 @@ exports[`InputPrompt > command search (Ctrl+R when not in shell) > renders match "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ (r:) commit ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ - git commit -m "feat: add search" in src/app + git commit -m "feat: add search" in src/app " `; @@ -39,7 +39,7 @@ exports[`InputPrompt > command search (Ctrl+R when not in shell) > renders match "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ (r:) commit ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ - git commit -m "feat: add search" in src/app + git commit -m "feat: add search" in src/app " `; diff --git a/packages/cli/src/ui/components/__snapshots__/SessionBrowser.test.tsx.snap b/packages/cli/src/ui/components/__snapshots__/SessionBrowser.test.tsx.snap index 583d75d281..15cd8748ae 100644 --- a/packages/cli/src/ui/components/__snapshots__/SessionBrowser.test.tsx.snap +++ b/packages/cli/src/ui/components/__snapshots__/SessionBrowser.test.tsx.snap @@ -6,7 +6,7 @@ exports[`SessionBrowser component > enters search mode, filters sessions, and re Search: query (Esc to cancel) Index │ Msgs │ Age │ Match - ❯ #1 │ 1 │ 10mo │ You: Query is here a… (+1 more) + ❯ #1 │ 1 │ 10mo │ You: Query is here a… (+1 more) ▼ " `; @@ -17,7 +17,7 @@ exports[`SessionBrowser component > renders a list of sessions and marks current Sort: s Reverse: r First/Last: g/G Index │ Msgs │ Age │ Name - ❯ #1 │ 5 │ 10mo │ Second conversation about dogs (current) + ❯ #1 │ 5 │ 10mo │ Second conversation about dogs (current) #2 │ 2 │ 10mo │ First conversation about cats ▼ " diff --git a/packages/cli/src/ui/components/__snapshots__/SettingsDialog-SettingsDialog-Initial-Rendering-should-render-settings-list-with-visual-indicators.snap.svg b/packages/cli/src/ui/components/__snapshots__/SettingsDialog-SettingsDialog-Initial-Rendering-should-render-settings-list-with-visual-indicators.snap.svg index b7ad1d10db..18fa114a3e 100644 --- a/packages/cli/src/ui/components/__snapshots__/SettingsDialog-SettingsDialog-Initial-Rendering-should-render-settings-list-with-visual-indicators.snap.svg +++ b/packages/cli/src/ui/components/__snapshots__/SettingsDialog-SettingsDialog-Initial-Rendering-should-render-settings-list-with-visual-indicators.snap.svg @@ -31,12 +31,20 @@ + + + Vim Mode + + false + + Enable Vim keybindings + @@ -112,8 +120,12 @@ Apply To + + + User Settings + Workspace Settings diff --git a/packages/cli/src/ui/components/__snapshots__/SettingsDialog-SettingsDialog-Snapshot-Tests-should-render-accessibility-settings-enabled-correctly.snap.svg b/packages/cli/src/ui/components/__snapshots__/SettingsDialog-SettingsDialog-Snapshot-Tests-should-render-accessibility-settings-enabled-correctly.snap.svg index c088c69139..ba5175de12 100644 --- a/packages/cli/src/ui/components/__snapshots__/SettingsDialog-SettingsDialog-Snapshot-Tests-should-render-accessibility-settings-enabled-correctly.snap.svg +++ b/packages/cli/src/ui/components/__snapshots__/SettingsDialog-SettingsDialog-Snapshot-Tests-should-render-accessibility-settings-enabled-correctly.snap.svg @@ -31,12 +31,20 @@ + + + Vim Mode + + true* + + Enable Vim keybindings + @@ -112,8 +120,12 @@ Apply To + + + User Settings + Workspace Settings diff --git a/packages/cli/src/ui/components/__snapshots__/SettingsDialog-SettingsDialog-Snapshot-Tests-should-render-all-boolean-settings-disabled-correctly.snap.svg b/packages/cli/src/ui/components/__snapshots__/SettingsDialog-SettingsDialog-Snapshot-Tests-should-render-all-boolean-settings-disabled-correctly.snap.svg index 0b981a31c8..ba1aa443f7 100644 --- a/packages/cli/src/ui/components/__snapshots__/SettingsDialog-SettingsDialog-Snapshot-Tests-should-render-all-boolean-settings-disabled-correctly.snap.svg +++ b/packages/cli/src/ui/components/__snapshots__/SettingsDialog-SettingsDialog-Snapshot-Tests-should-render-all-boolean-settings-disabled-correctly.snap.svg @@ -31,12 +31,20 @@ + + + Vim Mode + + false* + + Enable Vim keybindings + @@ -110,8 +118,12 @@ Apply To + + + User Settings + Workspace Settings diff --git a/packages/cli/src/ui/components/__snapshots__/SettingsDialog-SettingsDialog-Snapshot-Tests-should-render-default-state-correctly.snap.svg b/packages/cli/src/ui/components/__snapshots__/SettingsDialog-SettingsDialog-Snapshot-Tests-should-render-default-state-correctly.snap.svg index b7ad1d10db..18fa114a3e 100644 --- a/packages/cli/src/ui/components/__snapshots__/SettingsDialog-SettingsDialog-Snapshot-Tests-should-render-default-state-correctly.snap.svg +++ b/packages/cli/src/ui/components/__snapshots__/SettingsDialog-SettingsDialog-Snapshot-Tests-should-render-default-state-correctly.snap.svg @@ -31,12 +31,20 @@ + + + Vim Mode + + false + + Enable Vim keybindings + @@ -112,8 +120,12 @@ Apply To + + + User Settings + Workspace Settings diff --git a/packages/cli/src/ui/components/__snapshots__/SettingsDialog-SettingsDialog-Snapshot-Tests-should-render-file-filtering-settings-configured-correctly.snap.svg b/packages/cli/src/ui/components/__snapshots__/SettingsDialog-SettingsDialog-Snapshot-Tests-should-render-file-filtering-settings-configured-correctly.snap.svg index b7ad1d10db..18fa114a3e 100644 --- a/packages/cli/src/ui/components/__snapshots__/SettingsDialog-SettingsDialog-Snapshot-Tests-should-render-file-filtering-settings-configured-correctly.snap.svg +++ b/packages/cli/src/ui/components/__snapshots__/SettingsDialog-SettingsDialog-Snapshot-Tests-should-render-file-filtering-settings-configured-correctly.snap.svg @@ -31,12 +31,20 @@ + + + Vim Mode + + false + + Enable Vim keybindings + @@ -112,8 +120,12 @@ Apply To + + + User Settings + Workspace Settings diff --git a/packages/cli/src/ui/components/__snapshots__/SettingsDialog-SettingsDialog-Snapshot-Tests-should-render-focused-on-scope-selector-correctly.snap.svg b/packages/cli/src/ui/components/__snapshots__/SettingsDialog-SettingsDialog-Snapshot-Tests-should-render-focused-on-scope-selector-correctly.snap.svg index 81d4868518..f473eee125 100644 --- a/packages/cli/src/ui/components/__snapshots__/SettingsDialog-SettingsDialog-Snapshot-Tests-should-render-focused-on-scope-selector-correctly.snap.svg +++ b/packages/cli/src/ui/components/__snapshots__/SettingsDialog-SettingsDialog-Snapshot-Tests-should-render-focused-on-scope-selector-correctly.snap.svg @@ -109,9 +109,15 @@ > Apply To + + + 1. + + User Settings + 2. Workspace Settings diff --git a/packages/cli/src/ui/components/__snapshots__/SettingsDialog-SettingsDialog-Snapshot-Tests-should-render-mixed-boolean-and-number-settings-correctly.snap.svg b/packages/cli/src/ui/components/__snapshots__/SettingsDialog-SettingsDialog-Snapshot-Tests-should-render-mixed-boolean-and-number-settings-correctly.snap.svg index 324ed5c2cb..ad6b79cc28 100644 --- a/packages/cli/src/ui/components/__snapshots__/SettingsDialog-SettingsDialog-Snapshot-Tests-should-render-mixed-boolean-and-number-settings-correctly.snap.svg +++ b/packages/cli/src/ui/components/__snapshots__/SettingsDialog-SettingsDialog-Snapshot-Tests-should-render-mixed-boolean-and-number-settings-correctly.snap.svg @@ -31,12 +31,20 @@ + + + Vim Mode + + false* + + Enable Vim keybindings + @@ -111,8 +119,12 @@ Apply To + + + User Settings + Workspace Settings diff --git a/packages/cli/src/ui/components/__snapshots__/SettingsDialog-SettingsDialog-Snapshot-Tests-should-render-tools-and-security-settings-correctly.snap.svg b/packages/cli/src/ui/components/__snapshots__/SettingsDialog-SettingsDialog-Snapshot-Tests-should-render-tools-and-security-settings-correctly.snap.svg index b7ad1d10db..18fa114a3e 100644 --- a/packages/cli/src/ui/components/__snapshots__/SettingsDialog-SettingsDialog-Snapshot-Tests-should-render-tools-and-security-settings-correctly.snap.svg +++ b/packages/cli/src/ui/components/__snapshots__/SettingsDialog-SettingsDialog-Snapshot-Tests-should-render-tools-and-security-settings-correctly.snap.svg @@ -31,12 +31,20 @@ + + + Vim Mode + + false + + Enable Vim keybindings + @@ -112,8 +120,12 @@ Apply To + + + User Settings + Workspace Settings diff --git a/packages/cli/src/ui/components/__snapshots__/SettingsDialog-SettingsDialog-Snapshot-Tests-should-render-various-boolean-settings-enabled-correctly.snap.svg b/packages/cli/src/ui/components/__snapshots__/SettingsDialog-SettingsDialog-Snapshot-Tests-should-render-various-boolean-settings-enabled-correctly.snap.svg index e99a5b4cdd..d20034290c 100644 --- a/packages/cli/src/ui/components/__snapshots__/SettingsDialog-SettingsDialog-Snapshot-Tests-should-render-various-boolean-settings-enabled-correctly.snap.svg +++ b/packages/cli/src/ui/components/__snapshots__/SettingsDialog-SettingsDialog-Snapshot-Tests-should-render-various-boolean-settings-enabled-correctly.snap.svg @@ -31,12 +31,20 @@ + + + Vim Mode + + true* + + Enable Vim keybindings + @@ -110,8 +118,12 @@ Apply To + + + User Settings + Workspace Settings diff --git a/packages/cli/src/ui/components/__snapshots__/SuggestionsDisplay.test.tsx.snap b/packages/cli/src/ui/components/__snapshots__/SuggestionsDisplay.test.tsx.snap index 775233f30e..3c79a534a2 100644 --- a/packages/cli/src/ui/components/__snapshots__/SuggestionsDisplay.test.tsx.snap +++ b/packages/cli/src/ui/components/__snapshots__/SuggestionsDisplay.test.tsx.snap @@ -7,7 +7,7 @@ exports[`SuggestionsDisplay > handles scrolling 1`] = ` Cmd 7 Description 7 Cmd 8 Description 8 Cmd 9 Description 9 - Cmd 10 Description 10 + Cmd 10 Description 10 Cmd 11 Description 11 Cmd 12 Description 12 ▼ @@ -17,13 +17,13 @@ exports[`SuggestionsDisplay > handles scrolling 1`] = ` exports[`SuggestionsDisplay > highlights active item 1`] = ` " command1 Description 1 - command2 Description 2 + command2 Description 2 command3 Description 3 " `; exports[`SuggestionsDisplay > renders MCP tag for MCP prompts 1`] = ` -" mcp-tool [MCP] +" mcp-tool [MCP] " `; @@ -33,7 +33,7 @@ exports[`SuggestionsDisplay > renders loading state 1`] = ` `; exports[`SuggestionsDisplay > renders suggestions list 1`] = ` -" command1 Description 1 +" command1 Description 1 command2 Description 2 command3 Description 3 " diff --git a/packages/cli/src/ui/components/messages/__snapshots__/RedirectionConfirmation.test.tsx.snap b/packages/cli/src/ui/components/messages/__snapshots__/RedirectionConfirmation.test.tsx.snap index 4f89811121..f584e7f483 100644 --- a/packages/cli/src/ui/components/messages/__snapshots__/RedirectionConfirmation.test.tsx.snap +++ b/packages/cli/src/ui/components/messages/__snapshots__/RedirectionConfirmation.test.tsx.snap @@ -7,7 +7,7 @@ Note: Command contains redirection which can be undesirable. Tip: Toggle auto-edit (Shift+Tab) to allow redirection in the future. Allow execution of: 'echo, redirection (>)'? -● 1. Allow once +● 1. Allow once 2. Allow for this session 3. No, suggest changes (esc) " diff --git a/packages/cli/src/ui/components/messages/__snapshots__/ToolConfirmationMessage.test.tsx.snap b/packages/cli/src/ui/components/messages/__snapshots__/ToolConfirmationMessage.test.tsx.snap index 72eda055d5..9e8dfe3a15 100644 --- a/packages/cli/src/ui/components/messages/__snapshots__/ToolConfirmationMessage.test.tsx.snap +++ b/packages/cli/src/ui/components/messages/__snapshots__/ToolConfirmationMessage.test.tsx.snap @@ -6,7 +6,7 @@ ls -la whoami Allow execution of 3 commands? -● 1. Allow once +● 1. Allow once 2. Allow for this session 3. No, suggest changes (esc) " @@ -19,7 +19,7 @@ URLs to fetch: - https://raw.githubusercontent.com/google/gemini-react/main/README.md Do you want to proceed? -● 1. Allow once +● 1. Allow once 2. Allow for this session 3. No, suggest changes (esc) " @@ -29,7 +29,7 @@ exports[`ToolConfirmationMessage > should not display urls if prompt and url are "https://example.com Do you want to proceed? -● 1. Allow once +● 1. Allow once 2. Allow for this session 3. No, suggest changes (esc) " @@ -40,7 +40,7 @@ exports[`ToolConfirmationMessage > should strip BiDi characters from MCP tool an Tool: testtool Allow execution of MCP tool "testtool" from server "testserver"? -● 1. Allow once +● 1. Allow once 2. Allow tool for this session 3. Allow all server tools for this session 4. No, suggest changes (esc) @@ -55,7 +55,7 @@ exports[`ToolConfirmationMessage > with folder trust > 'for edit confirmations' ╰──────────────────────────────────────────────────────────────────────────────╯ Apply this change? -● 1. Allow once +● 1. Allow once 2. Modify with external editor 3. No, suggest changes (esc) " @@ -69,7 +69,7 @@ exports[`ToolConfirmationMessage > with folder trust > 'for edit confirmations' ╰──────────────────────────────────────────────────────────────────────────────╯ Apply this change? -● 1. Allow once +● 1. Allow once 2. Allow for this session 3. Modify with external editor 4. No, suggest changes (esc) @@ -80,7 +80,7 @@ exports[`ToolConfirmationMessage > with folder trust > 'for exec confirmations' "echo "hello" Allow execution of: 'echo'? -● 1. Allow once +● 1. Allow once 2. No, suggest changes (esc) " `; @@ -89,7 +89,7 @@ exports[`ToolConfirmationMessage > with folder trust > 'for exec confirmations' "echo "hello" Allow execution of: 'echo'? -● 1. Allow once +● 1. Allow once 2. Allow for this session 3. No, suggest changes (esc) " @@ -99,7 +99,7 @@ exports[`ToolConfirmationMessage > with folder trust > 'for info confirmations' "https://example.com Do you want to proceed? -● 1. Allow once +● 1. Allow once 2. No, suggest changes (esc) " `; @@ -108,7 +108,7 @@ exports[`ToolConfirmationMessage > with folder trust > 'for info confirmations' "https://example.com Do you want to proceed? -● 1. Allow once +● 1. Allow once 2. Allow for this session 3. No, suggest changes (esc) " @@ -119,7 +119,7 @@ exports[`ToolConfirmationMessage > with folder trust > 'for mcp confirmations' > Tool: test-tool Allow execution of MCP tool "test-tool" from server "test-server"? -● 1. Allow once +● 1. Allow once 2. No, suggest changes (esc) " `; @@ -129,7 +129,7 @@ exports[`ToolConfirmationMessage > with folder trust > 'for mcp confirmations' > Tool: test-tool Allow execution of MCP tool "test-tool" from server "test-server"? -● 1. Allow once +● 1. Allow once 2. Allow tool for this session 3. Allow all server tools for this session 4. No, suggest changes (esc) diff --git a/packages/cli/src/ui/components/shared/BaseSelectionList.test.tsx b/packages/cli/src/ui/components/shared/BaseSelectionList.test.tsx index 2444374c3e..7a89531890 100644 --- a/packages/cli/src/ui/components/shared/BaseSelectionList.test.tsx +++ b/packages/cli/src/ui/components/shared/BaseSelectionList.test.tsx @@ -20,12 +20,16 @@ vi.mock('../../hooks/useSelectionList.js'); const mockTheme = { text: { primary: 'COLOR_PRIMARY', secondary: 'COLOR_SECONDARY' }, status: { success: 'COLOR_SUCCESS' }, + ui: { focus: 'COLOR_FOCUS' }, + background: { focus: 'COLOR_FOCUS_BG' }, } as typeof theme; vi.mock('../../semantic-colors.js', () => ({ theme: { text: { primary: 'COLOR_PRIMARY', secondary: 'COLOR_SECONDARY' }, status: { success: 'COLOR_SUCCESS' }, + ui: { focus: 'COLOR_FOCUS' }, + background: { focus: 'COLOR_FOCUS_BG' }, }, })); @@ -161,8 +165,8 @@ describe('BaseSelectionList', () => { expect(mockRenderItem).toHaveBeenCalledWith( items[0], expect.objectContaining({ - titleColor: mockTheme.status.success, - numberColor: mockTheme.status.success, + titleColor: mockTheme.ui.focus, + numberColor: mockTheme.ui.focus, isSelected: true, }), ); @@ -207,8 +211,8 @@ describe('BaseSelectionList', () => { expect(mockRenderItem).toHaveBeenCalledWith( items[1], expect.objectContaining({ - titleColor: mockTheme.status.success, - numberColor: mockTheme.status.success, + titleColor: mockTheme.ui.focus, + numberColor: mockTheme.ui.focus, isSelected: true, }), ); @@ -267,7 +271,7 @@ describe('BaseSelectionList', () => { items[0], expect.objectContaining({ isSelected: true, - titleColor: mockTheme.status.success, + titleColor: mockTheme.ui.focus, numberColor: mockTheme.text.secondary, }), ); diff --git a/packages/cli/src/ui/components/shared/__snapshots__/DescriptiveRadioButtonSelect.test.tsx.snap b/packages/cli/src/ui/components/shared/__snapshots__/DescriptiveRadioButtonSelect.test.tsx.snap index 9fa0f0f79f..1015750761 100644 --- a/packages/cli/src/ui/components/shared/__snapshots__/DescriptiveRadioButtonSelect.test.tsx.snap +++ b/packages/cli/src/ui/components/shared/__snapshots__/DescriptiveRadioButtonSelect.test.tsx.snap @@ -1,21 +1,83 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html exports[`DescriptiveRadioButtonSelect > should render correctly with custom props 1`] = ` -" 1. Foo Title - This is Foo. -● 2. Bar Title - This is Bar. - 3. Baz Title - This is Baz. +" + ERROR Cannot read properties of undefined (reading 'focus') + + src/ui/components/shared/BaseSelectionList.tsx:120:33 + + 117: let numberColor = theme.text.primary; + 118: + 119: if (isSelected) { + 120: titleColor = theme.ui.focus; + 121: numberColor = theme.ui.focus; + 122: } else if (item.disabled) { + 123: titleColor = theme.text.secondary; + + - (src/ui/components/shared/BaseSelectionList.tsx:120:33) + - at Array.map ()\\t + - BaseSelectionList (src/ui/components/shared/BaseSelectionList.tsx:111:21) + -Object.react-stack-bott + m-frame (/Users/keithguerin/Documents/gemini-cli_colors/node_modules/react-reconci + ler/cjs/react-reconciler.development.js:15859:20) + -renderWithHoo + s (/Users/keithguerin/Documents/gemini-cli_colors/node_modules/react-reconciler/cjs/re + act-reconciler.development.js:3221:22) + -updateFunctionComp + nent (/Users/keithguerin/Documents/gemini-cli_colors/node_modules/react-reconciler/c + js/react-reconciler.development.js:6475:19) + -beginWor + (/Users/keithguerin/Documents/gemini-cli_colors/node_modules/react-reconciler/cjs/react-r + econciler.development.js:8009:18) + -runWithFiberIn + EV (/Users/keithguerin/Documents/gemini-cli_colors/node_modules/react-reconciler/cjs/r + eact-reconciler.development.js:1738:13) + -performUnitOfW + rk (/Users/keithguerin/Documents/gemini-cli_colors/node_modules/react-reconciler/cjs/r + eact-reconciler.development.js:12834:22) + -workLoopSyn + (/Users/keithguerin/Documents/gemini-cli_colors/node_modules/react-reconciler/cjs/reac + t-reconciler.development.js:12644:41) " `; exports[`DescriptiveRadioButtonSelect > should render correctly with default props 1`] = ` -"● Foo Title - This is Foo. - Bar Title - This is Bar. - Baz Title - This is Baz. +" + ERROR Cannot read properties of undefined (reading 'focus') + + src/ui/components/shared/BaseSelectionList.tsx:120:33 + + 117: let numberColor = theme.text.primary; + 118: + 119: if (isSelected) { + 120: titleColor = theme.ui.focus; + 121: numberColor = theme.ui.focus; + 122: } else if (item.disabled) { + 123: titleColor = theme.text.secondary; + + - (src/ui/components/shared/BaseSelectionList.tsx:120:33) + - at Array.map ()\\t + - BaseSelectionList (src/ui/components/shared/BaseSelectionList.tsx:111:21) + -Object.react-stack-bott + m-frame (/Users/keithguerin/Documents/gemini-cli_colors/node_modules/react-reconci + ler/cjs/react-reconciler.development.js:15859:20) + -renderWithHoo + s (/Users/keithguerin/Documents/gemini-cli_colors/node_modules/react-reconciler/cjs/re + act-reconciler.development.js:3221:22) + -updateFunctionComp + nent (/Users/keithguerin/Documents/gemini-cli_colors/node_modules/react-reconciler/c + js/react-reconciler.development.js:6475:19) + -beginWor + (/Users/keithguerin/Documents/gemini-cli_colors/node_modules/react-reconciler/cjs/react-r + econciler.development.js:8009:18) + -runWithFiberIn + EV (/Users/keithguerin/Documents/gemini-cli_colors/node_modules/react-reconciler/cjs/r + eact-reconciler.development.js:1738:13) + -performUnitOfW + rk (/Users/keithguerin/Documents/gemini-cli_colors/node_modules/react-reconciler/cjs/r + eact-reconciler.development.js:12834:22) + -workLoopSyn + (/Users/keithguerin/Documents/gemini-cli_colors/node_modules/react-reconciler/cjs/reac + t-reconciler.development.js:12644:41) " `; diff --git a/packages/cli/src/ui/themes/ansi.ts b/packages/cli/src/ui/themes/ansi.ts index 9c73109d93..a8c788bf54 100644 --- a/packages/cli/src/ui/themes/ansi.ts +++ b/packages/cli/src/ui/themes/ansi.ts @@ -23,7 +23,7 @@ const ansiColors: ColorsTheme = { Comment: 'gray', Gray: 'gray', DarkGray: 'gray', - SelectionBackground: 'black', + FocusBackground: 'black', GradientColors: ['cyan', 'green'], }; diff --git a/packages/cli/src/ui/themes/github-light.ts b/packages/cli/src/ui/themes/github-light.ts index 264a9d7a88..18ac7a709e 100644 --- a/packages/cli/src/ui/themes/github-light.ts +++ b/packages/cli/src/ui/themes/github-light.ts @@ -23,6 +23,7 @@ const githubLightColors: ColorsTheme = { Comment: '#998', Gray: '#999', DarkGray: interpolateColor('#999', '#f8f8f8', 0.5), + FocusColor: '#458', // AccentBlue for GitHub branding GradientColors: ['#458', '#008080'], }; diff --git a/packages/cli/src/ui/themes/holiday.ts b/packages/cli/src/ui/themes/holiday.ts index b3e72b1cc1..9cd77b43f0 100644 --- a/packages/cli/src/ui/themes/holiday.ts +++ b/packages/cli/src/ui/themes/holiday.ts @@ -23,6 +23,7 @@ const holidayColors: ColorsTheme = { Comment: '#8FBC8F', Gray: '#D7F5D3', DarkGray: interpolateColor('#D7F5D3', '#151B18', 0.5), + FocusColor: '#33F9FF', // AccentCyan for neon pop GradientColors: ['#FF0000', '#FFFFFF', '#008000'], }; diff --git a/packages/cli/src/ui/themes/theme-manager.ts b/packages/cli/src/ui/themes/theme-manager.ts index 439ecdff59..775f085f6e 100644 --- a/packages/cli/src/ui/themes/theme-manager.ts +++ b/packages/cli/src/ui/themes/theme-manager.ts @@ -373,7 +373,7 @@ class ThemeManager { ), FocusBackground: interpolateColor( this.terminalBackground, - colors.AccentGreen, + activeTheme.colors.FocusColor ?? activeTheme.colors.AccentGreen, DEFAULT_SELECTION_OPACITY, ), }; @@ -418,7 +418,7 @@ class ThemeManager { ui: { ...semanticColors.ui, dark: colors.DarkGray, - focus: colors.AccentGreen, + focus: colors.FocusColor ?? colors.AccentGreen, }, }; } else { diff --git a/packages/cli/src/ui/themes/theme.test.ts b/packages/cli/src/ui/themes/theme.test.ts index bba28521f7..da6bd0cbc5 100644 --- a/packages/cli/src/ui/themes/theme.test.ts +++ b/packages/cli/src/ui/themes/theme.test.ts @@ -32,7 +32,6 @@ describe('createCustomTheme', () => { DiffRemoved: '#FF0000', Comment: '#808080', Gray: '#cccccc', - FocusBackground: '#004000', // DarkGray intentionally omitted to test fallback }; @@ -104,7 +103,6 @@ describe('validateCustomTheme', () => { DiffRemoved: '#FF0000', Comment: '#808080', Gray: '#808080', - FocusBackground: '#004000', }; it('should return isValid: true for a valid theme', () => { @@ -155,7 +153,6 @@ describe('themeManager.loadCustomThemes', () => { AccentRed: '#F00', Comment: '#888', Gray: '#888', - FocusBackground: '#040', }; it('should use values from DEFAULT_THEME when DiffAdded and DiffRemoved are not provided', () => { diff --git a/packages/cli/src/ui/themes/theme.ts b/packages/cli/src/ui/themes/theme.ts index 9cb996e5f6..55edcb8018 100644 --- a/packages/cli/src/ui/themes/theme.ts +++ b/packages/cli/src/ui/themes/theme.ts @@ -8,12 +8,6 @@ import type { CSSProperties } from 'react'; import type { SemanticColors } from './semantic-tokens.js'; -import { - resolveColor, - interpolateColor, - getThemeTypeFromBackgroundColor, -} from './color-utils.js'; - import type { CustomTheme } from '@google/gemini-cli-core'; import { DEFAULT_BACKGROUND_OPACITY, @@ -186,6 +180,7 @@ export interface ColorsTheme { InputBackground?: string; MessageBackground?: string; FocusBackground?: string; + FocusColor?: string; GradientColors?: string[]; } @@ -331,7 +326,7 @@ export class Theme { this.colors.FocusBackground ?? interpolateColor( this.colors.Background, - this.colors.AccentGreen, + this.colors.FocusColor ?? this.colors.AccentGreen, DEFAULT_SELECTION_OPACITY, ), diff: { @@ -347,7 +342,7 @@ export class Theme { comment: this.colors.Gray, symbol: this.colors.AccentCyan, dark: this.colors.DarkGray, - focus: this.colors.AccentGreen, + focus: this.colors.FocusColor ?? this.colors.AccentGreen, gradient: this.colors.GradientColors, }, status: { @@ -461,6 +456,7 @@ export function createCustomTheme(customTheme: CustomTheme): Theme { customTheme.status?.success ?? customTheme.AccentGreen ?? '#3CA84B', // Fallback to a default green if not found DEFAULT_SELECTION_OPACITY, ), + FocusColor: customTheme.ui?.focus ?? customTheme.AccentGreen, GradientColors: customTheme.ui?.gradient ?? customTheme.GradientColors, }; @@ -631,7 +627,7 @@ export function createCustomTheme(customTheme: CustomTheme): Theme { comment: customTheme.ui?.comment ?? colors.Comment, symbol: customTheme.ui?.symbol ?? colors.Gray, dark: colors.DarkGray, - focus: customTheme.ui?.focus ?? colors.AccentGreen, + focus: colors.FocusColor ?? colors.AccentGreen, gradient: customTheme.ui?.gradient ?? colors.GradientColors, }, status: { diff --git a/packages/cli/src/ui/themes/xcode.ts b/packages/cli/src/ui/themes/xcode.ts index 5d20f35c36..105c1d1a00 100644 --- a/packages/cli/src/ui/themes/xcode.ts +++ b/packages/cli/src/ui/themes/xcode.ts @@ -23,6 +23,7 @@ const xcodeColors: ColorsTheme = { Comment: '#007400', Gray: '#c0c0c0', DarkGray: interpolateColor('#c0c0c0', '#fff', 0.5), + FocusColor: '#1c00cf', // AccentBlue for more vibrance GradientColors: ['#1c00cf', '#007400'], }; diff --git a/packages/cli/src/ui/utils/textUtils.test.ts b/packages/cli/src/ui/utils/textUtils.test.ts index fb0c9786ae..4927486d43 100644 --- a/packages/cli/src/ui/utils/textUtils.test.ts +++ b/packages/cli/src/ui/utils/textUtils.test.ts @@ -48,12 +48,12 @@ describe('textUtils', () => { it('should handle unicode characters that crash string-width', () => { // U+0602 caused string-width to crash (see #16418) const char = '؂'; - expect(getCachedStringWidth(char)).toBe(0); + expect(getCachedStringWidth(char)).toBe(1); }); it('should handle unicode characters that crash string-width with ANSI codes', () => { const charWithAnsi = '\u001b[31m' + '؂' + '\u001b[0m'; - expect(getCachedStringWidth(charWithAnsi)).toBe(0); + expect(getCachedStringWidth(charWithAnsi)).toBe(1); }); });