Skip to content

Add Antigravity as a first-class Cadence Code host - #60

Merged
michael-L-i merged 6 commits into
mainfrom
antigravity-support
Aug 28, 2026
Merged

michael-L-i merged 6 commits into
mainfrom
antigravity-support

Conversation

@michael-L-i

Copy link
Copy Markdown
Owner

Problem

Cadence Code supported Codex and Claude Code only. Antigravity users had no way to load the voice tools, and the blocking voice_start could not have survived Antigravity's MCP deadlines on a first-run model download anyway.

Approach

Five incremental commits, each keeping the suite green:

  1. Async voice_start for every host. voice_start now returns as soon as the audio preflight passes and loads the models in a background thread; hosts poll voice_status (starting / start_error) until ready. All three hosts share the same start flow, and no first-run download can outlive a tool deadline. wait: true keeps the old blocking behavior.
  2. Native Antigravity plugin. A minimal root plugin.json (the published schema allows no extra fields) plus mcp_config.json. Findings from testing against the real CLI are baked into the launcher: AGY 1.1.6 neither expands ${extensionPath} nor passes the declared stdio env, and installs land in ~/.gemini/config/plugins/ rather than the documented ~/.gemini/antigravity-cli/plugins/. The bash -c launcher therefore exports the host identity itself and searches every known root (both install paths covered), failing on stderr only. Shared skills now speak to Antigravity's /slash-command form, verify host: antigravity, and carry a scripts/setup first-run fallback.
  3. ./dev agy checkout launcher, mirroring ./dev claude / ./dev codex. AGY ignores workspace MCP configuration, so this one installs the checkout as a real plugin (with --no-install and --fresh), and ./dev check now also runs agy plugin validate.
  4. Docs: README quick start, command table, config/troubleshooting/uninstall/development sections, plus AGENTS.md, CONTRIBUTING.md, PRIVACY.md, RELEASING.md, the bug-report form, and project metadata.
  5. Staged installs: agy plugin install copies its argument verbatim (development venvs included, and a stale symlink aborted the copy), so ./dev agy stages only tracked and non-ignored files and installs that.

Verification

  • Full unit suite: 112 tests pass (python -m unittest discover -s tests), including new runtime tests for background start, contract tests for both Antigravity manifests, launcher-program tests that execute the real bash -c program against fake plugin trees, and ./dev agy CLI tests.
  • scripts/validate_plugin.py, claude plugin validate --strict, and uv lock --check all pass.
  • Against the real Antigravity CLI on this machine: agy plugin validate passes (4 skills, 4 commands, 1 MCP server); a staged agy plugin install succeeded, launched the launcher and bootstrap end to end, and cached all eight voice tool schemas including the new async voice_start; the install location confirmed ~/.gemini/config/plugins/cadence-code; uninstall verified and all test state removed afterwards.
  • Not yet exercised: a live spoken conversation inside an Antigravity session (needs an interactive audio session). One nuance to watch there: Antigravity also converts the Claude commands/ directory to skills, so the four workflow names appear from both sources; validation accepts this, but a live session should confirm the canonical skills win.

https://claude.ai/code/session_019X5iJxJoSAXC8mysnydtH6

voice_start now returns as soon as the audio preflight passes and loads
the speech models in a background thread; voice_status reports starting
and start_error while the load runs. Hosts poll voice_status until ready
instead of holding one tool call open, so a first-run model download can
never outlive an MCP tool deadline. Set wait: true to keep the old
blocking behavior.

Claude-Session: https://claude.ai/code/session_019X5iJxJoSAXC8mysnydtH6
Antigravity installs the repository directly: a minimal root plugin.json
(the published schema allows no extra fields) plus an mcp_config.json
whose bash -c launcher locates the installed bootstrap itself. AGY 1.1.6
neither expands ${extensionPath} nor passes the documented stdio env
object, and it installs plugins under ~/.gemini/config/plugins rather
than the documented ~/.gemini/antigravity-cli/plugins, so the launcher
exports the host identity and tries every known root, failing on stderr
only. The shared skills now speak to Antigravity's /slash-command form,
verify host: antigravity, and carry a scripts/setup fallback for first
runs that outlive Antigravity's undocumented startup timeout.

Claude-Session: https://claude.ai/code/session_019X5iJxJoSAXC8mysnydtH6
./dev agy installs the checkout as a real Antigravity plugin and then
launches the host with isolated development data. Unlike the other host
launchers this changes user-level state, because AGY 1.1.6 ignores
workspace MCP configuration; reinstalling picks up manifest, skill, and
bootstrap changes, while Python sources keep running from the checkout.
--no-install skips the reinstall and --fresh repeats first-run
onboarding. ./dev check now also runs agy plugin validate when the
Antigravity CLI is installed.

Claude-Session: https://claude.ai/code/session_019X5iJxJoSAXC8mysnydtH6
The README gains an Antigravity quick start (clone plus agy plugin
install), a third column in the conversation-command table, and
Antigravity entries in the configuration, troubleshooting, uninstall,
and development sections. AGENTS.md, CONTRIBUTING.md, PRIVACY.md, and
RELEASING.md describe the new manifests, the ./dev agy workflow, the
Google privacy boundary, and the release paths for the third host. The
bug-report form and project metadata list Antigravity alongside Codex
and Claude Code.

Claude-Session: https://claude.ai/code/session_019X5iJxJoSAXC8mysnydtH6
agy plugin install copies its argument verbatim, so installing the
checkout directly dragged development venvs into ~/.gemini and a stale
symlink in them aborted the copy outright. ./dev agy now stages only the
checkout's tracked and non-ignored files into a temporary directory and
installs that, verified against the real CLI: the install launches the
staged launcher and bootstrap end to end and caches all eight voice tool
schemas.

Claude-Session: https://claude.ai/code/session_019X5iJxJoSAXC8mysnydtH6
Codex review of the async-start change found a lifecycle gap: a
voice_stop racing the background model loader could report nothing to
stop while the loader finished anyway, leaving warm models and the
machine-wide session lock held with no conversation. voice_stop now
cancels an in-flight start synchronously and counts it as stopped; the
loader aborts at its next checkpoint -- or tears down after completing
-- releasing the models and the session lock either way. A start that
arrives while a cancelled loader is still running clears the
cancellation so the pending load serves the new conversation.

Claude-Session: https://claude.ai/code/session_019X5iJxJoSAXC8mysnydtH6
@michael-L-i
michael-L-i merged commit 6054b6f into main Aug 28, 2026
18 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant