From 465f97a528360da8a25be99a814314aaa88a60fa Mon Sep 17 00:00:00 2001 From: matt korwel Date: Tue, 21 Oct 2025 16:45:32 -0700 Subject: [PATCH 1/4] fix: Improve patch workflow and update NOTICES.txt (#11623) --- .github/workflows/ci.yml | 3 +++ .github/workflows/release-patch-1-create-pr.yml | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 864793d03a..09d0be0929 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -66,6 +66,9 @@ jobs: - name: 'Install dependencies' run: 'npm ci' + - name: 'Validate NOTICES.txt' + run: 'git diff --exit-code packages/vscode-ide-companion/NOTICES.txt' + - name: 'Check lockfile' run: 'npm run check:lockfile' diff --git a/.github/workflows/release-patch-1-create-pr.yml b/.github/workflows/release-patch-1-create-pr.yml index c58523f53c..e12b6b588d 100644 --- a/.github/workflows/release-patch-1-create-pr.yml +++ b/.github/workflows/release-patch-1-create-pr.yml @@ -64,7 +64,7 @@ jobs: github-token: '${{ secrets.GITHUB_TOKEN }}' - name: 'Install Script Dependencies' - run: 'npm install yargs --no-package-lock' + run: 'npm ci' - name: 'Configure Git User' env: From 5b750f519be751d1e74417ee86112d82487ce247 Mon Sep 17 00:00:00 2001 From: Silvio Junior Date: Tue, 21 Oct 2025 16:36:41 -0700 Subject: [PATCH 2/4] fix(config): Disable CI for stable release (#11615) --- packages/cli/src/config/settingsSchema.ts | 2 +- packages/core/src/config/config.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/cli/src/config/settingsSchema.ts b/packages/cli/src/config/settingsSchema.ts index 6716825812..c01e691f44 100644 --- a/packages/cli/src/config/settingsSchema.ts +++ b/packages/cli/src/config/settingsSchema.ts @@ -1090,7 +1090,7 @@ const SETTINGS_SCHEMA = { label: 'Enable Codebase Investigator', category: 'Experimental', requiresRestart: true, - default: true, + default: false, description: 'Enable the Codebase Investigator agent.', showInDialog: true, }, diff --git a/packages/core/src/config/config.ts b/packages/core/src/config/config.ts index 172fc52fa3..baa8bc6175 100644 --- a/packages/core/src/config/config.ts +++ b/packages/core/src/config/config.ts @@ -474,7 +474,7 @@ export class Config { this.enableMessageBusIntegration = params.enableMessageBusIntegration ?? false; this.codebaseInvestigatorSettings = { - enabled: params.codebaseInvestigatorSettings?.enabled ?? true, + enabled: params.codebaseInvestigatorSettings?.enabled ?? false, maxNumTurns: params.codebaseInvestigatorSettings?.maxNumTurns ?? 15, maxTimeMinutes: params.codebaseInvestigatorSettings?.maxTimeMinutes ?? 5, thinkingBudget: From ed9f714fbbc99287e090a8e9092358ab292bee23 Mon Sep 17 00:00:00 2001 From: James Date: Tue, 21 Oct 2025 23:40:13 +0000 Subject: [PATCH 3/4] feat(cli): Adds the ability to run MCP prompt commands in non-interactive mode (#10194) Co-authored-by: Allen Hutchison --- packages/cli/src/nonInteractiveCli.test.ts | 43 +++++++++++++++++++ packages/cli/src/nonInteractiveCliCommands.ts | 4 +- 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/packages/cli/src/nonInteractiveCli.test.ts b/packages/cli/src/nonInteractiveCli.test.ts index 5df7be9963..d82ab2108c 100644 --- a/packages/cli/src/nonInteractiveCli.test.ts +++ b/packages/cli/src/nonInteractiveCli.test.ts @@ -59,6 +59,9 @@ vi.mock('./services/CommandService.js', () => ({ }, })); +vi.mock('./services/FileCommandLoader.js'); +vi.mock('./services/McpPromptLoader.js'); + describe('runNonInteractive', () => { let mockConfig: Config; let mockSettings: LoadedSettings; @@ -938,6 +941,46 @@ describe('runNonInteractive', () => { expect(processStdoutSpy).toHaveBeenCalledWith('Acknowledged'); }); + it('should instantiate CommandService with correct loaders for slash commands', async () => { + // This test indirectly checks that handleSlashCommand is using the right loaders. + const { FileCommandLoader } = await import( + './services/FileCommandLoader.js' + ); + const { McpPromptLoader } = await import('./services/McpPromptLoader.js'); + + mockGetCommands.mockReturnValue([]); // No commands found, so it will fall through + const events: ServerGeminiStreamEvent[] = [ + { type: GeminiEventType.Content, value: 'Acknowledged' }, + { + type: GeminiEventType.Finished, + value: { reason: undefined, usageMetadata: { totalTokenCount: 1 } }, + }, + ]; + mockGeminiClient.sendMessageStream.mockReturnValue( + createStreamFromEvents(events), + ); + + await runNonInteractive( + mockConfig, + mockSettings, + '/mycommand', + 'prompt-id-loaders', + ); + + // Check that loaders were instantiated with the config + expect(FileCommandLoader).toHaveBeenCalledTimes(1); + expect(FileCommandLoader).toHaveBeenCalledWith(mockConfig); + expect(McpPromptLoader).toHaveBeenCalledTimes(1); + expect(McpPromptLoader).toHaveBeenCalledWith(mockConfig); + + // Check that instances were passed to CommandService.create + expect(mockCommandServiceCreate).toHaveBeenCalledTimes(1); + const loadersArg = mockCommandServiceCreate.mock.calls[0][0]; + expect(loadersArg).toHaveLength(2); + expect(loadersArg[0]).toBe(vi.mocked(McpPromptLoader).mock.instances[0]); + expect(loadersArg[1]).toBe(vi.mocked(FileCommandLoader).mock.instances[0]); + }); + it('should allow a normally-excluded tool when --allowed-tools is set', async () => { // By default, ShellTool is excluded in non-interactive mode. // This test ensures that --allowed-tools overrides this exclusion. diff --git a/packages/cli/src/nonInteractiveCliCommands.ts b/packages/cli/src/nonInteractiveCliCommands.ts index 15b9301ad4..912121a2dd 100644 --- a/packages/cli/src/nonInteractiveCliCommands.ts +++ b/packages/cli/src/nonInteractiveCliCommands.ts @@ -14,6 +14,7 @@ import { } from '@google/gemini-cli-core'; import { CommandService } from './services/CommandService.js'; import { FileCommandLoader } from './services/FileCommandLoader.js'; +import { McpPromptLoader } from './services/McpPromptLoader.js'; import type { CommandContext } from './ui/commands/types.js'; import { createNonInteractiveUI } from './ui/noninteractive/nonInteractiveUi.js'; import type { LoadedSettings } from './config/settings.js'; @@ -38,9 +39,8 @@ export const handleSlashCommand = async ( return; } - // Only custom commands are supported for now. const commandService = await CommandService.create( - [new FileCommandLoader(config)], + [new McpPromptLoader(config), new FileCommandLoader(config)], abortController.signal, ); const commands = commandService.getCommands(); From cc3904f0262ce0148328910d159e56c41ec6358a Mon Sep 17 00:00:00 2001 From: Tommaso Sciortino Date: Tue, 21 Oct 2025 17:39:49 -0700 Subject: [PATCH 4/4] Add aria labels to Todo list display (#11621) --- .../cli/src/ui/components/messages/Todo.tsx | 41 +++++++++++++------ 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/packages/cli/src/ui/components/messages/Todo.tsx b/packages/cli/src/ui/components/messages/Todo.tsx index 9d27c24852..a7d630a93d 100644 --- a/packages/cli/src/ui/components/messages/Todo.tsx +++ b/packages/cli/src/ui/components/messages/Todo.tsx @@ -33,7 +33,7 @@ const TodoTitleDisplay: React.FC<{ todos: TodoList }> = ({ todos }) => { return ( - + ๐Ÿ“ Todo {score} (ctrl+t to toggle) @@ -44,22 +44,39 @@ const TodoTitleDisplay: React.FC<{ todos: TodoList }> = ({ todos }) => { const TodoStatusDisplay: React.FC<{ status: TodoStatus }> = ({ status }) => { switch (status) { case 'completed': - return โœ“; + return ( + + โœ“ + + ); case 'in_progress': - return ยป; + return ( + + ยป + + ); case 'pending': - return โ˜; + return ( + + โ˜ + + ); case 'cancelled': default: - return โœ—; + return ( + + โœ— + + ); } }; -const TodoItemDisplay: React.FC<{ todo: Todo; wrap?: 'truncate' }> = ({ - todo, - wrap, -}) => ( - +const TodoItemDisplay: React.FC<{ + todo: Todo; + wrap?: 'truncate'; + role?: 'listitem'; +}> = ({ todo, wrap, role: ariaRole }) => ( + @@ -140,9 +157,9 @@ interface TodoListDisplayProps { } const TodoListDisplay: React.FC = ({ todos }) => ( - + {todos.todos.map((todo: Todo, index: number) => ( - + ))} );