diff --git a/.changeset/plucky-badgers-sprint.md b/.changeset/plucky-badgers-sprint.md new file mode 100644 index 000000000..29cd19efd --- /dev/null +++ b/.changeset/plucky-badgers-sprint.md @@ -0,0 +1,5 @@ +--- +type: Fixed +pr: 1616 +--- +**Antigravity installs all GSD slash-command skills where AGY can discover them** — concrete skills such as /gsd-progress and /gsd-verify-work now land directly under the Antigravity skills directory instead of router-nested folders. (#1614) diff --git a/capabilities/antigravity/capability.json b/capabilities/antigravity/capability.json index 8ab2bba7f..65694fd35 100644 --- a/capabilities/antigravity/capability.json +++ b/capabilities/antigravity/capability.json @@ -3,7 +3,7 @@ "role": "runtime", "version": "1.6.0-rc.2", "title": "Antigravity", - "description": "Google Antigravity IDE — nested under ~/.gemini/antigravity; probed across 1.x and 2.x layouts; Gemini hook event dialect; nested skill layout; tier-1 support.", + "description": "Google Antigravity IDE — nested under ~/.gemini/antigravity; probed across 1.x and 2.x layouts; Gemini hook event dialect; flat skill layout; tier-1 support.", "tier": "core", "requires": [], "engines": { @@ -31,7 +31,7 @@ "kind": "skills", "destSubpath": "skills", "prefix": "gsd-", - "nesting": "nested", + "nesting": "flat", "recursive": false, "converter": "convertClaudeCommandToAntigravitySkill" } @@ -41,7 +41,7 @@ "kind": "skills", "destSubpath": "skills", "prefix": "gsd-", - "nesting": "nested", + "nesting": "flat", "recursive": false, "converter": "convertClaudeCommandToAntigravitySkill" } diff --git a/gsd-core/bin/lib/capability-registry.cjs b/gsd-core/bin/lib/capability-registry.cjs index 35acc45ea..45e52f2d0 100644 --- a/gsd-core/bin/lib/capability-registry.cjs +++ b/gsd-core/bin/lib/capability-registry.cjs @@ -65,7 +65,7 @@ const capabilities = { "role": "runtime", "version": "1.6.0-rc.2", "title": "Antigravity", - "description": "Google Antigravity IDE — nested under ~/.gemini/antigravity; probed across 1.x and 2.x layouts; Gemini hook event dialect; nested skill layout; tier-1 support.", + "description": "Google Antigravity IDE — nested under ~/.gemini/antigravity; probed across 1.x and 2.x layouts; Gemini hook event dialect; flat skill layout; tier-1 support.", "tier": "core", "requires": [], "engines": { @@ -93,7 +93,7 @@ const capabilities = { "kind": "skills", "destSubpath": "skills", "prefix": "gsd-", - "nesting": "nested", + "nesting": "flat", "recursive": false, "converter": "convertClaudeCommandToAntigravitySkill" } @@ -103,7 +103,7 @@ const capabilities = { "kind": "skills", "destSubpath": "skills", "prefix": "gsd-", - "nesting": "nested", + "nesting": "flat", "recursive": false, "converter": "convertClaudeCommandToAntigravitySkill" } @@ -2723,7 +2723,7 @@ const runtimes = { "role": "runtime", "version": "1.6.0-rc.2", "title": "Antigravity", - "description": "Google Antigravity IDE — nested under ~/.gemini/antigravity; probed across 1.x and 2.x layouts; Gemini hook event dialect; nested skill layout; tier-1 support.", + "description": "Google Antigravity IDE — nested under ~/.gemini/antigravity; probed across 1.x and 2.x layouts; Gemini hook event dialect; flat skill layout; tier-1 support.", "tier": "core", "requires": [], "engines": { @@ -2751,7 +2751,7 @@ const runtimes = { "kind": "skills", "destSubpath": "skills", "prefix": "gsd-", - "nesting": "nested", + "nesting": "flat", "recursive": false, "converter": "convertClaudeCommandToAntigravitySkill" } @@ -2761,7 +2761,7 @@ const runtimes = { "kind": "skills", "destSubpath": "skills", "prefix": "gsd-", - "nesting": "nested", + "nesting": "flat", "recursive": false, "converter": "convertClaudeCommandToAntigravitySkill" } diff --git a/src/runtime-artifact-layout.cts b/src/runtime-artifact-layout.cts index cea8a6b0f..aceb479c9 100644 --- a/src/runtime-artifact-layout.cts +++ b/src/runtime-artifact-layout.cts @@ -368,13 +368,16 @@ function convertedCommandsKind( // augment — https://docs.augmentcode.com/cli/skills (flat single-level) // trae — docs.trae.ai/ide/skills + Trae-AI/TRAE#2253 (flat; nesting errors) // Trae IDE (trae.ai), not trae-agent — see runtime-homes.cts header note -// antigravity— discuss.ai.google.dev/t/more-antigravity-issues/145875 ("will not recursive scan") -// // FLAT (recursive loader → nesting gives no saving): // cursor — https://cursor.com/docs/skills (walks skills root recursively) // opencode — sst/opencode skill/index.ts glob "skills/**/SKILL.md" // kilo — Kilo-Org/kilocode (opencode fork, same ** glob) // +// FLAT (one-level scan, but concrete skills must be directly discoverable): +// antigravity— https://antigravity.google/docs/skills + /docs/cli-plugins +// (skills live at //SKILL.md; AGY does not +// register router-nested concrete skills as slash commands) +// // FLAT (reverted from nested — nested skills not discoverable by Skill tool, #924): // claude — https://code.claude.com/docs/en/skills + anthropics/claude-code#28266 // (one-level scan under ~/.claude/skills — but Skill-tool errors on unknown diff --git a/tests/install-nested-layout.test.cjs b/tests/install-nested-layout.test.cjs index f3f3a53f0..f9e23f70e 100644 --- a/tests/install-nested-layout.test.cjs +++ b/tests/install-nested-layout.test.cjs @@ -33,13 +33,12 @@ const { COMMANDS_GSD, ROUTER_STEMS, routerChildren } = require('./helpers/nested const NEST = [ // Claude reverted to flat (#924: nested layout breaks Skill-tool discovery on Claude Code). - // Only the 6 runtimes below keep the nested layout. + // Only the 5 runtimes below keep the nested layout. { runtime: 'cline', scope: 'global', skillsSub: 'skills', prefix: 'gsd-' }, { runtime: 'qwen', scope: 'global', skillsSub: 'skills', prefix: 'gsd-' }, { runtime: 'hermes', scope: 'global', skillsSub: 'skills/gsd', prefix: 'gsd-' }, // #947: restored canonical prefix { runtime: 'augment', scope: 'global', skillsSub: 'skills', prefix: 'gsd-' }, { runtime: 'trae', scope: 'global', skillsSub: 'skills', prefix: 'gsd-' }, - { runtime: 'antigravity', scope: 'global', skillsSub: 'skills', prefix: 'gsd-' }, ]; const FLAT = [ @@ -53,6 +52,7 @@ const FLAT = [ { runtime: 'codebuddy', scope: 'global', skillsSub: 'skills' }, { runtime: 'opencode', scope: 'global', skillsSub: 'skills' }, { runtime: 'kilo', scope: 'global', skillsSub: 'skills' }, + { runtime: 'antigravity', scope: 'global', skillsSub: 'skills' }, ]; // --------------------------------------------------------------------------- diff --git a/tests/install.test.cjs b/tests/install.test.cjs index f68b3e817..b27f33c6e 100644 --- a/tests/install.test.cjs +++ b/tests/install.test.cjs @@ -1167,6 +1167,24 @@ describe('antigravity local install writes to .agents/ canonical dir (#791)', () assert.ok(fs.existsSync(firstSkill), `SKILL.md must exist at ${firstSkill}`); }); + test('install writes concrete skills at the immediate level AGY scans', () => { + install(false, 'antigravity'); + const skillsDir = path.join(tmpDir, '.agents', 'skills'); + + assert.ok( + fs.existsSync(path.join(skillsDir, 'gsd-progress', 'SKILL.md')), + 'AGY scans immediate skill folders, so /gsd-progress must be installed at .agents/skills/gsd-progress/SKILL.md', + ); + assert.ok( + fs.existsSync(path.join(skillsDir, 'gsd-verify-work', 'SKILL.md')), + 'AGY scans immediate skill folders, so /gsd-verify-work must be installed at .agents/skills/gsd-verify-work/SKILL.md', + ); + assert.ok( + !fs.existsSync(path.join(skillsDir, 'gsd-ns-workflow', 'skills', 'progress', 'SKILL.md')), + 'Antigravity must not rely on router-nested concrete skills that AGY does not discover', + ); + }); + test('installed agent files reference .agents/ not ~/.claude/ or bare .agent/', () => { // NOTE: skill content is intentionally NOT asserted here. The installer calls // convertClaudeCommandToAntigravitySkill(content, skillName, runtime, cmdNames)