diff --git a/.changeset/fix-3344-gemini-agent-tool.md b/.changeset/fix-3344-gemini-agent-tool.md new file mode 100644 index 000000000..e297e3e51 --- /dev/null +++ b/.changeset/fix-3344-gemini-agent-tool.md @@ -0,0 +1,5 @@ +--- +type: Fixed +pr: 3349 +--- +Gemini and Antigravity agent conversion now drops Claude-only agent dispatcher tools instead of emitting invalid `agent` permissions. diff --git a/bin/install.js b/bin/install.js index 1fa5a91ae..9e349fc6f 100755 --- a/bin/install.js +++ b/bin/install.js @@ -1240,7 +1240,7 @@ function convertToolName(claudeTool) { * Convert a Claude Code tool name to Gemini CLI format * - Applies Claude→Gemini mapping (Read→read_file, Bash→run_shell_command, etc.) * - Filters out MCP tools (mcp__*) — they are auto-discovered at runtime in Gemini - * - Filters out Task — agents are auto-registered as tools in Gemini + * - Filters out Task/Agent — agents are auto-registered as tools in Gemini * @returns {string|null} Gemini tool name, or null if tool should be excluded */ function convertGeminiToolName(claudeTool) { @@ -1248,8 +1248,8 @@ function convertGeminiToolName(claudeTool) { if (claudeTool.startsWith('mcp__')) { return null; } - // Task: exclude — agents are auto-registered as callable tools - if (claudeTool === 'Task') { + // Task/Agent: exclude — agents are auto-registered as callable tools + if (claudeTool === 'Task' || claudeTool === 'Agent') { return null; } // Check for explicit mapping diff --git a/tests/runtime-converters.test.cjs b/tests/runtime-converters.test.cjs index dcffa9924..ad47e6bea 100644 --- a/tests/runtime-converters.test.cjs +++ b/tests/runtime-converters.test.cjs @@ -264,6 +264,28 @@ Use \${PHASE} in shell examples. assert.ok(result.includes('$PHASE'), 'escapes ${PHASE} shell variable for Gemini'); assert.ok(!result.includes('${PHASE}'), 'removes Gemini template-string pattern'); }); + + test('excludes Claude agent dispatcher tools from Gemini frontmatter', () => { + const input = `--- +name: gsd-debug-session-manager +description: Manages debug sessions. +tools: Read, Task, Agent, AskUserQuestion +--- + + +Coordinate debugger agents. +`; + + const result = convertClaudeToGeminiAgent(input); + const frontmatter = result.split('---')[1] || ''; + + assert.ok(frontmatter.includes(' - read_file'), 'maps Read -> read_file'); + assert.ok(frontmatter.includes(' - ask_user'), 'maps AskUserQuestion -> ask_user'); + assert.ok(!frontmatter.includes(' - task'), 'does not emit invalid Gemini task tool'); + assert.ok(!frontmatter.includes(' - agent'), 'does not emit invalid Gemini agent tool'); + assert.ok(!frontmatter.includes('Task'), 'does not preserve Claude-only Task tool'); + assert.ok(!frontmatter.includes('Agent'), 'does not preserve Claude-only Agent tool'); + }); }); // ─── neutralizeAgentReferences (#766) ─────────────────────────────────────────