From 585a8b7f1b70d723a1f4f93b37b01c5061500720 Mon Sep 17 00:00:00 2001 From: Tom Boucher Date: Fri, 4 Sep 2026 11:48:38 -0400 Subject: [PATCH] fix(#3747): correct antigravity matrix evidence and pin the CLI-only skills install path (#4274) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * test(#3747): fail-first regression — matrix must not cite configHome skills path for antigravity * fix(#3747): correct disproven antigravity stateIO evidence; pin CLI-only probe branch install path * fix(#3747): scope doc evidence claim to skills discovery per adversarial review * chore(#3747): add changeset * chore(#3747): backfill PR number in changeset --------- Co-authored-by: sim --- .changeset/sunny-geese-forage.md | 5 ++ .../host-integration-capability-matrix.md | 3 +- tests/host-integration-descriptors.test.cjs | 24 +++++++++ tests/install-runtime-artifacts.test.cjs | 50 +++++++++++++++++++ 4 files changed, 80 insertions(+), 2 deletions(-) create mode 100644 .changeset/sunny-geese-forage.md diff --git a/.changeset/sunny-geese-forage.md b/.changeset/sunny-geese-forage.md new file mode 100644 index 000000000..81c3e9933 --- /dev/null +++ b/.changeset/sunny-geese-forage.md @@ -0,0 +1,5 @@ +--- +type: Fixed +pr: 4274 +--- +**Antigravity CLI global skills: corrected the host-integration matrix evidence and pinned the CLI-only install path** — a live `agy` 1.1.17 probe showed the CLI discovers global skills in `~/.gemini/config/skills/` and silently drops everything under its configHome; the runtime layout was already fixed by #3738, and the matrix no longer cites the disproven blog claim while a new test pins the CLI-only probe branch so the silent-drop class cannot regress. (#3747) diff --git a/docs/reference/host-integration-capability-matrix.md b/docs/reference/host-integration-capability-matrix.md index 4bb3ce0af..80f36b73a 100644 --- a/docs/reference/host-integration-capability-matrix.md +++ b/docs/reference/host-integration-capability-matrix.md @@ -312,7 +312,7 @@ Documentation gaps: | commandSurface | slash-file | https://github.com/alphaperseii3000/google-antigravity-docs/blob/master/google-antigravity-docs.md | "Workflows are saved as markdown files, providing a repeatable method for executing key processes. They can be invoked in the Agent using a s" | | modelMode | passive | https://dev.to/arindam_1729/antigravity-cli-a-hands-on-guide-to-googles-terminal-coding-agent-5bc7 | "Selection occurs via `-m` flag or `/model` command inside the TUI. No programmatic model request API is documented for extensions/skills" | | hookBus | host | https://www.aibuilderclub.com/blog/antigravity-cli-guide | "The CLI fires hooks, not the engine. These are JSON lifecycle interceptors (before tool call, after file edit, on session start)." | -| stateIO | filesystem | https://www.explainx.ai/blog/antigravity-cli-features-sandbox-plugins-subagents-2026 | "Plugin staging at ~/.gemini/antigravity-cli/plugins//; skills at ~/.gemini/antigravity-cli/skills/" | +| stateIO | filesystem | live `agy` 1.1.17 install probe — https://github.com/open-gsd/gsd-core/issues/3747 | "Global skills discovery scans ~/.gemini/config/skills/: a probe skill placed there is visible to `agy`, while an identical probe skill under the configHome is not. An earlier third-party blog claim about configHome skills placement was disproved by that probe; GSD installs global skills/agents under ~/.gemini/config (#3738)" | | transport | mcp | https://dev.to/arindam_1729/antigravity-cli-a-hands-on-guide-to-googles-terminal-coding-agent-5bc7 | "Both local (stdio) and remote (HTTP) Model Context Protocol servers are supported" | | runtime | go | https://developers.googleblog.com/an-important-update-transitioning-gemini-cli-to-antigravity-cli/ | "Built in Go, Antigravity CLI is snappier and more responsive." | | effortSurface | undocumented | no authoritative doc — per-host reasoning-effort survey, #2481 (`09b535ac0`) | This host's documentation states no reasoning-effort setting, so the axis carries the fail-closed sentinel rather than inheriting a profile baseline. No host-specific URL is cited because the finding is an ABSENCE: #2481 surveyed all hosts for a reasoning-effort mechanism and found one only for claude/opencode/codex. | @@ -329,7 +329,6 @@ Sources consulted: - https://github.com/alphaperseii3000/google-antigravity-docs/blob/master/google-antigravity-docs.md - https://developers.googleblog.com/an-important-update-transitioning-gemini-cli-to-antigravity-cli/ - https://dev.to/arindam_1729/antigravity-cli-a-hands-on-guide-to-googles-terminal-coding-agent-5bc7 -- https://www.explainx.ai/blog/antigravity-cli-features-sandbox-plugins-subagents-2026 - https://www.aibuilderclub.com/blog/antigravity-cli-guide - https://antigravity.google/docs/agents - https://antigravity.google/docs/hooks diff --git a/tests/host-integration-descriptors.test.cjs b/tests/host-integration-descriptors.test.cjs index 81dad30f6..898fabdb4 100644 --- a/tests/host-integration-descriptors.test.cjs +++ b/tests/host-integration-descriptors.test.cjs @@ -689,3 +689,27 @@ describe('#2603: axis values inherited from the Python kimi descriptor are corre assert.equal(axes.dispatch.isolation, 'orchestrator-worktree'); }); }); + +describe('#3747: matrix must not cite the disproven configHome skills path for antigravity', () => { + // The stateIO row sourced its evidence from an explainx.ai blog claiming the + // CLI reads global skills from ~/.gemini/antigravity-cli/skills/. A live + // `agy` 1.1.17 probe (#3747) disproved that: the CLI scans + // ~/.gemini/config/skills (where #3738 installs them) and silently drops + // everything under the configHome. The doc must not re-assert the dead path. + test('antigravity section cites no configHome skills path; evidence names ~/.gemini/config/skills', () => { + const section = matrixSection('antigravity'); + assert.ok(section, 'antigravity section must exist in the host-integration matrix'); + const offending = section.split('\n').filter((l) => /antigravity(-cli|-ide)?\/skills/i.test(l)); + assert.deepStrictEqual( + offending, + [], + `matrix rows must not cite a configHome skills dir (~/.gemini/antigravity*/skills) as the CLI's skills location — disproven by the #3747 live agy probe:\n${offending.join('\n')}`, + ); + const stateIORow = section.split('\n').find((l) => l.startsWith('| stateIO |')); + assert.ok(stateIORow, 'stateIO row must exist'); + assert.ok( + stateIORow.includes('~/.gemini/config/skills'), + `stateIO evidence must name the live-probe-verified ~/.gemini/config/skills discovery dir, got: ${stateIORow}`, + ); + }); +}); diff --git a/tests/install-runtime-artifacts.test.cjs b/tests/install-runtime-artifacts.test.cjs index 3305ef1ba..063841d13 100644 --- a/tests/install-runtime-artifacts.test.cjs +++ b/tests/install-runtime-artifacts.test.cjs @@ -7714,4 +7714,54 @@ describe('#3738: antigravity global artifacts install under ~/.gemini/config', ( } }); + + // ── #3747: pin the CLI-ONLY probe branch ──────────────────────────────────── + // The #3738 tests above hand installRuntimeArtifacts an arbitrary configDir. + // The reporter's machine resolved the configHome to ~/.gemini/antigravity-cli + // (the only sibling present, carrying the gsd-core/VERSION marker). This test + // reproduces exactly that resolution and asserts global skills/agents still + // land under ~/.gemini/config — the dir `agy` scans — and NOTHING lands under + // the resolved configHome. This is the "path-asserting test pinned to the CLI + // branch" the issue asked for: a regression that re-couples the global skills + // root to the resolved config home goes red here. + test('#3747: CLI-only install (configHome resolves to ~/.gemini/antigravity-cli) still lands global skills/agents under ~/.gemini/config', (t) => { + const { resolveAntigravityGlobalDir } = require('../gsd-core/bin/lib/runtime-homes.cjs'); + const home = createTempDir('gsd-3747-antigravity-cli-'); + t.after(() => cleanup(home)); + sandboxHome(t, home); + + // CLI-only environment: ~/.gemini/antigravity-cli is the sole sibling and + // carries the GSD marker — resolution must pick it (not the IDE default). + const cliConfigHome = path.join(home, '.gemini', 'antigravity-cli'); + fs.mkdirSync(path.join(cliConfigHome, 'gsd-core'), { recursive: true }); + fs.writeFileSync(path.join(cliConfigHome, 'gsd-core', 'VERSION'), '1.12.0\n'); + for (const sibling of ['antigravity', 'antigravity-ide']) { + assert.ok( + !fs.existsSync(path.join(home, '.gemini', sibling)), + `test premise: ~/.gemini/${sibling} must not exist (CLI-only install)`, + ); + } + const resolved = resolveAntigravityGlobalDir({ home, env: {}, existsSync: fs.existsSync }); + assert.strictEqual(resolved, cliConfigHome, 'configHome must resolve to the CLI dir (CLI-only probe branch)'); + + installRuntimeArtifacts('antigravity', resolved, 'global', RESOLVED_CORE); + + const discoveryHome = path.join(home, '.gemini', 'config'); + assert.ok( + fs.existsSync(path.join(discoveryHome, 'skills', 'gsd-help', 'SKILL.md')), + 'a gsd-* skill must exist under ~/.gemini/config/skills (the dir agy scans, #3747)' + ); + assert.ok( + fs.readdirSync(path.join(discoveryHome, 'agents')).some((n) => n.startsWith('gsd-')), + 'at least one gsd-* agent must exist under ~/.gemini/config/agents' + ); + assert.ok( + !fs.existsSync(path.join(resolved, 'skills')), + 'no skills dir may be created under the CLI configHome — agy never reads it (#3747 silent drop)' + ); + assert.ok( + !fs.existsSync(path.join(resolved, 'agents')), + 'no agents dir may be created under the CLI configHome — agy never reads it (#3747 silent drop)' + ); + }); });