feat(#1928): remove sunset Gemini CLI runtime, redirect to Antigravity (#1996)

* 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:
Tom Boucher
2026-07-04 13:32:51 -04:00
committed by GitHub
parent 55604e9124
commit 8f2ebbe9bf
91 changed files with 872 additions and 4528 deletions

View File

@@ -18,7 +18,6 @@ const FALLBACK_ALIASES: Readonly<Record<string, string[]>> = {
claude: ['claude', 'claude-code', 'claude-cli'],
opencode: ['opencode', 'open-code', 'opencode-cli'],
kilo: ['kilo', 'kilo-cli'],
gemini: ['gemini', 'gemini-cli', 'gemini-code'],
codex: ['codex', 'codex-app', 'codex-cli', 'codex_desktop', 'codex-desktop'],
copilot: ['copilot', 'copilot-cli', 'github-copilot'],
antigravity: ['antigravity', 'antigravity-cli', 'antigravity-agent'],
@@ -102,7 +101,7 @@ export function resolveRuntimeNameFromCandidates(...candidates: unknown[]): stri
* claude → .claude/CLAUDE.md
* codex, opencode, kilo, kimi → AGENTS.md
* copilot → .github/copilot-instructions.md
* antigravity, gemini → GEMINI.md
* antigravity → GEMINI.md
* unknown / future runtimes → AGENTS.md (safe cross-agent default)
*
* Source-of-truth references for each runtime's read path:
@@ -114,7 +113,9 @@ export function resolveRuntimeNameFromCandidates(...candidates: unknown[]): stri
* 'copilot-instructions' writes the same `.github/copilot-instructions.md`.)
* - codex/opencode/kilo/kimi: AGENTS.md is the documented cross-agent
* instruction file (agentsmd/agents.md convention).
* - antigravity/gemini: GEMINI.md is Gemini CLI's contextFileName.
* - antigravity: GEMINI.md is Antigravity CLI's contextFileName (the Gemini
* CLI runtime that historically shared this file was removed — #1928;
* Google sunset Gemini CLI 2026-06-18 and Antigravity CLI is its successor).
*
* Aliases are normalized via `canonicalizeRuntimeName` first, so inputs like
* `codex-cli` resolve to `codex` → `AGENTS.md`. Replaces the prior codex-only
@@ -125,7 +126,7 @@ export function getProjectInstructionFile(runtime: unknown): string {
const canonical = canonicalizeRuntimeName(runtime);
if (canonical === 'claude') return '.claude/CLAUDE.md';
if (canonical === 'copilot') return '.github/copilot-instructions.md';
if (canonical === 'antigravity' || canonical === 'gemini') return 'GEMINI.md';
if (canonical === 'antigravity') return 'GEMINI.md';
// codex, opencode, kilo, kimi, AND unknown/future runtimes all default to
// root AGENTS.md (the safe cross-agent instruction file).
return 'AGENTS.md';
@@ -167,7 +168,7 @@ export function getDirName(runtime: string): string {
*
* Voice: these are the SHORT UI labels, intentionally distinct from the
* descriptor `title` (the long product name — e.g. "OpenAI Codex CLI",
* "GitHub Copilot", "Gemini CLI") which serves documentation/registry display,
* "GitHub Copilot") which serves documentation/registry display,
* not the install console. A future slice may relocate this to a
* `runtime.label` descriptor field; until then this table is the source.
*
@@ -182,7 +183,6 @@ export function getDirName(runtime: string): string {
const RUNTIME_LABELS: Readonly<Record<string, string>> = {
claude: 'Claude Code',
opencode: 'OpenCode',
gemini: 'Gemini',
kilo: 'Kilo',
codex: 'Codex',
copilot: 'Copilot',
@@ -219,7 +219,7 @@ export function getRuntimeLabel(runtime: string): string {
* bin/install.js (ADR-1239 Phase B / #1679, AC2 slice 2) — the add-a-host tax:
* a new runtime meant remembering to add a branch here. Values are preserved
* BYTE-FOR-BYTE from the prior chain; golden install parity asserts generated
* hook output is unchanged across all 16 runtimes.
* hook output is unchanged across all 15 runtimes.
*
* Two runtimes are intentionally absent (handled by the caller, NOT this table):
* - `claude` → the default; falls through to `DEFAULT_FRAGMENT`.
@@ -232,7 +232,6 @@ const DEFAULT_CONFIG_HOME_FRAGMENT = "'.claude'";
const GLOBAL_CONFIG_HOME_FRAGMENTS: Readonly<Record<string, string>> = {
copilot: "'.copilot'",
opencode: "'.config', 'opencode'",
gemini: "'.gemini'",
kilo: "'.config', 'kilo'",
codex: "'.codex'",
cursor: "'.cursor'",
@@ -266,7 +265,7 @@ export function getGlobalConfigHomeFragment(runtime: string): string {
* removes).
*/
const RUNTIME_FLAG_IDS = Object.freeze([
'opencode', 'kilo', 'gemini', 'codex', 'copilot', 'antigravity', 'cursor',
'opencode', 'kilo', 'codex', 'copilot', 'antigravity', 'cursor',
'windsurf', 'augment', 'trae', 'qwen', 'hermes', 'codebuddy', 'cline', 'kimi',
] as const);
@@ -294,7 +293,6 @@ export function runtimeFlags(runtime: string): Readonly<Record<string, boolean>>
*/
const DEFAULT_NEW_PROJECT_COMMAND = '/gsd-new-project';
const RUNTIME_NEW_PROJECT_COMMANDS: Readonly<Record<string, string>> = {
gemini: '/gsd:new-project',
codex: '$gsd-new-project',
cursor: 'gsd-new-project (mention the skill name)',
kimi: '/skill:gsd-new-project',