Merge pull request #1616 from open-gsd/fix/1614-antigravity-flat-skills

fix(#1614): install Antigravity skills flat
This commit is contained in:
Tom Boucher
2026-06-23 10:54:27 -04:00
committed by GitHub
6 changed files with 39 additions and 13 deletions

View File

@@ -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)

View File

@@ -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"
}

View File

@@ -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"
}

View File

@@ -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 <skills-dir>/<skill-folder>/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

View File

@@ -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' },
];
// ---------------------------------------------------------------------------

View File

@@ -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)