* test(#4705): add failing-first coverage for native Antigravity tool sequences * fix(#4705): emit Antigravity-native tool names as a YAML sequence convertClaudeAgentToAntigravityAgent and the installer's twin emitted Gemini CLI tool names as a comma-separated scalar. Antigravity's documented subagent contract (antigravity.google/docs/subagents) wants a YAML sequence of native names — view_file, grep_search, run_command, replace_file_content are the documented examples, and wrong or malformed grants can hang the subagent per Antigravity's own warning. Map values move to the native vocabulary where documented (Read -> view_file, Edit -> replace_file_content, Bash -> run_command, Grep -> grep_search); undocumented entries keep their best-known grant rather than being dropped (dropping would silently remove a restriction). The emitter writes one '- name' item per line; an agent whose every tool was filtered emits an explicit tools: [] instead of an empty scalar. Pre-existing pins updated to the native vocabulary. * test(#4705): update the #4727 map-value pin to the Antigravity-native vocabulary The #4727-era pin held the map VALUES at the Gemini CLI dialect on the belief that Antigravity speaks it; the confirmed bug #4705 (with Antigravity's own documented subagent contract) supersedes that for the four documented names. Key/shape pinning is preserved; only the values move. * docs(#4705): backfill changeset PR number --------- Co-authored-by: sim <sim@local>
This commit is contained in:
@@ -478,12 +478,12 @@ tools: Read, Write, Bash, Skill, WebFetch, SlashCommand
|
||||
<role>Plan the phase.</role>`;
|
||||
|
||||
const result = convertClaudeAgentToAntigravityAgent(input);
|
||||
const toolsLine = result.split('\n').find(l => l.startsWith('tools:')) || '';
|
||||
const toolsItems = result.split('\n').filter(l => l.startsWith('- ')).map(l => l.slice(2));
|
||||
|
||||
assert.ok(toolsLine.includes('read_file'), 'maps Read -> read_file');
|
||||
assert.ok(toolsLine.includes('web_fetch'), 'maps WebFetch -> web_fetch');
|
||||
assert.ok(!/\bskill\b/.test(toolsLine), 'no invalid skill tool in Antigravity frontmatter');
|
||||
assert.ok(!/\bslashcommand\b/.test(toolsLine), 'no invalid slashcommand tool in Antigravity frontmatter');
|
||||
assert.ok(toolsItems.includes('view_file'), 'maps Read -> view_file (#4705 native name)');
|
||||
assert.ok(toolsItems.includes('web_fetch'), 'maps WebFetch -> web_fetch');
|
||||
assert.ok(!toolsItems.some(t => /\bskill\b/.test(t)), 'no invalid skill tool in Antigravity frontmatter');
|
||||
assert.ok(!toolsItems.some(t => /\bslashcommand\b/.test(t)), 'no invalid slashcommand tool in Antigravity frontmatter');
|
||||
});
|
||||
});
|
||||
|
||||
@@ -2667,3 +2667,40 @@ describe('#3706: the layout seam actually threads the variant', () => {
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// ── #4705 — Antigravity agent tools: native names, YAML sequence ─────────────
|
||||
// The converter emitted Gemini CLI tool names as a comma-separated scalar;
|
||||
// Antigravity's documented subagent contract (antigravity.google/docs/subagents)
|
||||
// wants a YAML sequence of native tool names (view_file, grep_search,
|
||||
// run_command, replace_file_content are the documented examples). A scalar or a
|
||||
// wrong-vocabulary grant can hang the subagent per Antigravity's own warning.
|
||||
describe('#4705 — Antigravity agent tools are native names in a YAML sequence', () => {
|
||||
const input = `---
|
||||
name: example-reviewer
|
||||
description: Inspect source files
|
||||
tools: Read, Grep, Bash
|
||||
---
|
||||
|
||||
Inspect source files.`;
|
||||
|
||||
test('emits the documented native tools as a YAML sequence (#4705)', () => {
|
||||
const result = convertClaudeAgentToAntigravityAgent(input);
|
||||
assert.match(result, /tools:\n- view_file\n- grep_search\n- run_command\n/,
|
||||
'tools must be a YAML sequence of Antigravity-native names (view_file, grep_search, run_command)');
|
||||
assert.doesNotMatch(result, /tools:.*,/m, 'no comma-separated scalar may survive');
|
||||
});
|
||||
|
||||
test('Edit maps to the documented replace_file_content (#4705)', () => {
|
||||
const result = convertClaudeAgentToAntigravityAgent(
|
||||
`---\nname: e\ndescription: d\ntools: Edit\n---\n\nbody`);
|
||||
assert.match(result, /- replace_file_content/, 'Edit -> replace_file_content (documented native name)');
|
||||
assert.ok(!/- replace\b/.test(result), 'the Gemini CLI name replace must not survive');
|
||||
});
|
||||
|
||||
test('unmapped tools keep their lowercase grant (no silent restriction drop) (#4705)', () => {
|
||||
const result = convertClaudeAgentToAntigravityAgent(
|
||||
`---\nname: e\ndescription: d\ntools: Glob, WebFetch\n---\n\nbody`);
|
||||
assert.match(result, /- glob/, 'undocumented tools keep their mapped/lowercase grant');
|
||||
assert.match(result, /- web_fetch/, 'WebFetch stays granted');
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user