From 1040c246f5a0161162d687461e1f3b6adf6b35dc Mon Sep 17 00:00:00 2001 From: Jack Wotherspoon Date: Thu, 4 Dec 2025 11:33:45 -0500 Subject: [PATCH] feat: add auto-execute on Enter behavior to argumentless MCP prompts (#14510) --- .../cli/src/services/McpPromptLoader.test.ts | 52 +++++++++++++++++++ packages/cli/src/services/McpPromptLoader.ts | 1 + 2 files changed, 53 insertions(+) diff --git a/packages/cli/src/services/McpPromptLoader.test.ts b/packages/cli/src/services/McpPromptLoader.test.ts index 2dc3ba050d..1db67e527d 100644 --- a/packages/cli/src/services/McpPromptLoader.test.ts +++ b/packages/cli/src/services/McpPromptLoader.test.ts @@ -261,6 +261,58 @@ describe('McpPromptLoader', () => { expect(commands).toEqual([]); }); + describe('autoExecute', () => { + it('should set autoExecute to true for prompts with no arguments (undefined)', async () => { + vi.spyOn(cliCore, 'getMCPServerPrompts').mockReturnValue([ + { ...mockPrompt, arguments: undefined }, + ]); + const loader = new McpPromptLoader(mockConfigWithPrompts); + const commands = await loader.loadCommands( + new AbortController().signal, + ); + expect(commands[0].autoExecute).toBe(true); + }); + + it('should set autoExecute to true for prompts with empty arguments array', async () => { + vi.spyOn(cliCore, 'getMCPServerPrompts').mockReturnValue([ + { ...mockPrompt, arguments: [] }, + ]); + const loader = new McpPromptLoader(mockConfigWithPrompts); + const commands = await loader.loadCommands( + new AbortController().signal, + ); + expect(commands[0].autoExecute).toBe(true); + }); + + it('should set autoExecute to false for prompts with only optional arguments', async () => { + vi.spyOn(cliCore, 'getMCPServerPrompts').mockReturnValue([ + { + ...mockPrompt, + arguments: [{ name: 'optional', required: false }], + }, + ]); + const loader = new McpPromptLoader(mockConfigWithPrompts); + const commands = await loader.loadCommands( + new AbortController().signal, + ); + expect(commands[0].autoExecute).toBe(false); + }); + + it('should set autoExecute to false for prompts with required arguments', async () => { + vi.spyOn(cliCore, 'getMCPServerPrompts').mockReturnValue([ + { + ...mockPrompt, + arguments: [{ name: 'required', required: true }], + }, + ]); + const loader = new McpPromptLoader(mockConfigWithPrompts); + const commands = await loader.loadCommands( + new AbortController().signal, + ); + expect(commands[0].autoExecute).toBe(false); + }); + }); + describe('completion', () => { it('should suggest no arguments when using positional arguments', async () => { const loader = new McpPromptLoader(mockConfigWithPrompts); diff --git a/packages/cli/src/services/McpPromptLoader.ts b/packages/cli/src/services/McpPromptLoader.ts index b7471aa854..f61eed9184 100644 --- a/packages/cli/src/services/McpPromptLoader.ts +++ b/packages/cli/src/services/McpPromptLoader.ts @@ -44,6 +44,7 @@ export class McpPromptLoader implements ICommandLoader { name: commandName, description: prompt.description || `Invoke prompt ${prompt.name}`, kind: CommandKind.MCP_PROMPT, + autoExecute: !prompt.arguments || prompt.arguments.length === 0, subCommands: [ { name: 'help',