* feat(#1928): remove sunset gemini cli runtime, redirect to antigravity Google sunset Gemini CLI on 2026-06-18; Antigravity CLI is its official successor (already a first-class GSD runtime). Remove the gemini runtime from the enum (16->15), aliases, labels, config-home fragment, install path, converters (convertClaudeToGemini{Markdown,Toml,Agent}, convertSlashCommandsToGeminiMentions), capability descriptor, gemini-extension.json, RULESET.GEMINI.*, and the interactive menu (renumbered, no gap). --gemini now prints an explicit deprecation notice citing the 2026-06-18 sunset and redirects to --antigravity (no silent alias, per the issue's Hyrum's-Law rejection). Antigravity is preserved throughout: its GEMINI.md contextFileName, .gemini/antigravity config home, the shared convertGeminiToolName/claudeToGeminiTools tool vocabulary, and the 'gemini' hookEvents dialect it declares. GEMINI.md retargeted as Antigravity's context file. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * chore(#1928): backfill changeset PR number (#1996) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * chore(#1928): drop Gemini CLI from issue templates (review nit) Removes the sunset Gemini CLI runtime from the two GitHub issue-template runtime lists that the removal PR missed, per @davesienkowski's review nit: - feature_request.yml: 'Applicable runtimes' checkbox (a user could otherwise request a feature for a runtime GSD no longer supports) - bug_report.yml: 'Runtime' dropdown + the stale ~/.gemini/settings.json retrieval-help line Leaves the post-removal templates fully consistent with the Antigravity redirect. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -274,7 +274,6 @@ const { transformContentToHyphen } = require(path.join(REPO_ROOT, 'scripts', 'fi
|
||||
// runtime-artifact-layout.cjs MUST appear in exactly one bucket.
|
||||
const HYPHEN_NAME_AGENT_RUNTIMES = ['claude', 'qwen', 'hermes'];
|
||||
const SELF_CONVERTING_OR_COLON_RUNTIMES = [
|
||||
'gemini', // intentionally colon-namespaced
|
||||
'codex', 'copilot', 'antigravity', 'cursor', 'windsurf', 'augment',
|
||||
'trae', 'codebuddy', 'cline',
|
||||
'opencode', 'kilo',
|
||||
@@ -367,12 +366,6 @@ describe('bug #3677 — agent body colon-namespace leak (Claude / Qwen / Hermes)
|
||||
assert.ok(!out.includes('/gsd:execute-phase'));
|
||||
});
|
||||
|
||||
test('C4: gemini — colon refs preserved (intentional namespace)', () => {
|
||||
const out = normalizeAgentBodyForRuntime(inputBody, 'gemini', cmdNames);
|
||||
assert.ok(out.includes('/gsd:execute-phase'), 'Gemini intentionally uses colon namespace; do not rewrite');
|
||||
assert.ok(!out.includes('/gsd-execute-phase'), 'Gemini agents must NOT have hyphen form');
|
||||
});
|
||||
|
||||
test('C5: self-converting runtime (copilot) — body returned unchanged at this layer', () => {
|
||||
const out = normalizeAgentBodyForRuntime(inputBody, 'copilot', cmdNames);
|
||||
// Copilot has its own convertClaudeAgentToCopilotAgent that handles
|
||||
@@ -785,21 +778,6 @@ function runClaudeLocalInstall(cwd) {
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Run `node install.js --gemini --local --no-sdk` in tmpDir.
|
||||
* GSD_TEST_MODE must be cleared so the install() main block executes.
|
||||
*/
|
||||
function runGeminiLocalInstall(cwd) {
|
||||
const env = { ...process.env };
|
||||
delete env.GSD_TEST_MODE;
|
||||
execFileSync(process.execPath, [INSTALL_PATH, '--gemini', '--local', '--no-sdk'], {
|
||||
cwd,
|
||||
encoding: 'utf-8',
|
||||
stdio: ['pipe', 'pipe', 'pipe'],
|
||||
env,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Build the roster regex that matches `gsd:<known-cmd>` references.
|
||||
* Mirrors the pattern used by the Cycle 1 command test.
|
||||
@@ -835,7 +813,7 @@ function collectOffenders(dir, regex) {
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Suite — integration: staged gsd-core/workflows/ and references/ must
|
||||
// have no colon-namespace refs for claude, and must preserve them for gemini.
|
||||
// have no colon-namespace refs for claude.
|
||||
// ---------------------------------------------------------------------------
|
||||
describe('bug #3683 — workflow/reference colon-namespace leak (Claude local install)', () => {
|
||||
|
||||
@@ -849,8 +827,7 @@ describe('bug #3683 — workflow/reference colon-namespace leak (Claude local in
|
||||
const rosterRegex = buildRosterRegex(cmdNames);
|
||||
|
||||
// Shared claude local install — used by W (workflow/reference clean-slate) and
|
||||
// R (routing-block positive assertion) sub-suites. G suite runs its own separate
|
||||
// gemini install and does not depend on claudeTmpDir.
|
||||
// R (routing-block positive assertion) sub-suites.
|
||||
before(() => {
|
||||
claudeTmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-3683-claude-'));
|
||||
runClaudeLocalInstall(claudeTmpDir);
|
||||
@@ -1115,64 +1092,6 @@ describe('bug #3683 — workflow/reference colon-namespace leak (Claude local in
|
||||
});
|
||||
});
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
// G — negative: gemini install must PRESERVE colon form (no-op normalizer)
|
||||
// -------------------------------------------------------------------------
|
||||
describe('G — negative: staged gemini workflows preserve colon-namespace refs', () => {
|
||||
let tmpDir;
|
||||
const cmdNames = readCmdNames();
|
||||
|
||||
before(() => {
|
||||
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-3683-gem-'));
|
||||
runGeminiLocalInstall(tmpDir);
|
||||
});
|
||||
|
||||
after(() => {
|
||||
cleanup(tmpDir);
|
||||
});
|
||||
|
||||
test('G0: staged gemini gsd-core/workflows/ directory exists after install', () => {
|
||||
const workflowsDir = path.join(tmpDir, '.gemini', 'gsd-core', 'workflows');
|
||||
assert.ok(
|
||||
fs.existsSync(workflowsDir),
|
||||
`gemini gsd-core/workflows/ must be created at ${workflowsDir}`,
|
||||
);
|
||||
});
|
||||
|
||||
test('G1: gemini discuss-phase.md preserves colon form (normalizer is a no-op for gemini)', () => {
|
||||
// Gemini registers /gsd:<cmd> as its canonical form — normalization
|
||||
// must NOT fire for this runtime. Verify colon refs survive unchanged.
|
||||
const stagedFile = path.join(
|
||||
tmpDir, '.gemini', 'gsd-core', 'workflows', 'discuss-phase.md',
|
||||
);
|
||||
assert.ok(
|
||||
fs.existsSync(stagedFile),
|
||||
`gemini discuss-phase.md must exist in staged gsd-core/workflows/`,
|
||||
);
|
||||
const content = fs.readFileSync(stagedFile, 'utf-8');
|
||||
// The source has 7 colon refs; at least one must be present in gemini output.
|
||||
const colonMatches = content.match(/gsd:[a-z][a-z0-9-]*/g) || [];
|
||||
const knownColonRefs = colonMatches.filter(m => cmdNames.includes(m.slice(4)));
|
||||
assert.ok(
|
||||
knownColonRefs.length > 0,
|
||||
`gemini staged discuss-phase.md must preserve /gsd:<cmd> colon refs — ` +
|
||||
`they are Gemini's canonical command namespace and must not be rewritten to hyphen form`,
|
||||
);
|
||||
});
|
||||
|
||||
test('G2: gemini workflows are not over-normalized (no /gsd-- double-hyphen artifacts)', () => {
|
||||
const workflowsDir = path.join(tmpDir, '.gemini', 'gsd-core', 'workflows');
|
||||
if (!fs.existsSync(workflowsDir)) return; // guard — G0 already asserts existence
|
||||
const doubleHyphenRegex = /\/gsd--[a-z]/;
|
||||
const garbled = collectOffenders(workflowsDir, doubleHyphenRegex);
|
||||
const relGarbled = garbled.map(f => path.relative(tmpDir, f));
|
||||
assert.deepEqual(
|
||||
relGarbled,
|
||||
[],
|
||||
`Gemini staged workflows contain /gsd-- double-hyphen artifacts — normalizer ran when it should not have. Garbled: ${relGarbled.join(', ')}`,
|
||||
);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user