From 8e0293ebfd6c668cb2b1070dc9c5448a484f7d63 Mon Sep 17 00:00:00 2001 From: Neil <4138956+nwparker@users.noreply.github.com> Date: Sun, 20 Sep 2026 17:25:07 -0700 Subject: [PATCH] fix(skills): discover the Antigravity CLI global skill root (#21647) --- .../antigravity-skill-discovery.test.ts | 43 +++++++++++++++++++ src/main/skills/discovery.test.ts | 4 +- src/main/skills/skill-discovery-sources.ts | 2 +- 3 files changed, 46 insertions(+), 3 deletions(-) create mode 100644 src/main/skills/antigravity-skill-discovery.test.ts diff --git a/src/main/skills/antigravity-skill-discovery.test.ts b/src/main/skills/antigravity-skill-discovery.test.ts new file mode 100644 index 00000000000..61e6b42fbc6 --- /dev/null +++ b/src/main/skills/antigravity-skill-discovery.test.ts @@ -0,0 +1,43 @@ +import { mkdtemp, mkdir, rm, writeFile } from 'node:fs/promises' +import { tmpdir } from 'node:os' +import { join, posix, win32 } from 'node:path' +import { describe, expect, it } from 'vitest' +import { buildSkillDiscoverySources, discoverSkills } from './discovery' + +describe('Antigravity CLI skill discovery', () => { + it.each([ + { homeDir: '/home/agent', cwd: '/workspace', pathApi: posix }, + { homeDir: 'C:\\Users\\agent', cwd: 'D:\\workspace', pathApi: win32 } + ])('uses the owning host path syntax for $homeDir', (args) => { + expect( + buildSkillDiscoverySources(args).find((root) => root.id === 'home-antigravity') + ).toMatchObject({ + path: args.pathApi.join(args.homeDir, '.gemini', 'config', 'skills'), + owner: 'antigravity', + providers: ['agent-skills'] + }) + }) + + it('discovers the documented CLI root without claiming legacy-only skills are loaded', async () => { + const home = await mkdtemp(join(tmpdir(), 'orca-agy-skills-')) + try { + for (const [directory, name] of [ + ['config', 'current-probe'], + ['antigravity', 'legacy-probe'] + ]) { + const skill = join(home, '.gemini', directory, 'skills', name) + await mkdir(skill, { recursive: true }) + await writeFile( + join(skill, 'SKILL.md'), + `---\nname: ${name}\ndescription: Discovery test\n---\nTest skill.\n` + ) + } + const result = await discoverSkills({ homeDir: home, cwd: home, includeCwd: false }) + const agySkills = result.skills.filter((skill) => skill.sourceLabel === 'Antigravity home') + expect(agySkills.map((skill) => skill.name)).toEqual(['current-probe']) + expect(agySkills[0]?.rootPath).toBe(join(home, '.gemini', 'config', 'skills')) + } finally { + await rm(home, { recursive: true, force: true }) + } + }) +}) diff --git a/src/main/skills/discovery.test.ts b/src/main/skills/discovery.test.ts index 7c6212a463b..8d7b08574ed 100644 --- a/src/main/skills/discovery.test.ts +++ b/src/main/skills/discovery.test.ts @@ -399,7 +399,7 @@ describe('skill discovery', () => { expect(rootPaths).toContain('/workspace/current/.claude/skills') }) - it('scans each provider home skill root that npx skills --global writes to', () => { + it('scans provider home and workspace skill roots', () => { const roots = buildSkillDiscoverySources({ homeDir: '/home/test', cwd: '/workspace/current' @@ -414,7 +414,7 @@ describe('skill discovery', () => { '/home/test/.omp/agent/skills', '/home/test/.hermes/skills', '/home/test/.gemini/skills', - '/home/test/.gemini/antigravity/skills', + '/home/test/.gemini/config/skills', '/home/test/.cursor/skills', '/home/test/.factory/skills', '/home/test/.continue/skills', diff --git a/src/main/skills/skill-discovery-sources.ts b/src/main/skills/skill-discovery-sources.ts index 09bf8e208c8..89ff237b23c 100644 --- a/src/main/skills/skill-discovery-sources.ts +++ b/src/main/skills/skill-discovery-sources.ts @@ -188,7 +188,7 @@ export function buildSkillDiscoverySources( source( 'home-antigravity', 'Antigravity home', - pathApi.join(home, '.gemini', 'antigravity', 'skills'), + pathApi.join(home, '.gemini', 'config', 'skills'), 'home', ['agent-skills'], 'antigravity'