0074: Google Antigravity adapter and hook lifecycle contract
Status: accepted (2026-08-15) · Scope: product tier (core/adapters, core/hooks, core/workflow, commands/init, commands/doctor)
Context
Section titled “Context”Harnery previously provided first-class support for three execution harnesses: Claude Code, Codex, and Cursor. Each harness has distinct invocation semantics, hook configuration schemas, event payload structures, and response protocols:
- Claude Code wires
.claude/settings.json, uses nestedhooks: [{ type: "command", command }]arrays, readsCLAUDE.md/@AGENTS.mdimports, and handles same-turnStopcontinuation natively. - Codex wires
.codex/hooks.json, uses strict top-level schema validation, enforces sandboxed workspace policies, and communicates authoritative results out-of-band via result files. - Cursor wires
.cursor/hooks.json(root version 1), uses flat{ command }entries with camelCase event names, and delivers JSON result envelopes.
Google Antigravity (agy CLI, Antigravity IDE, and Antigravity 2.0) has emerged as a major development environment. Antigravity establishes clear, standardized conventions:
- Customization Root: Discovers project-level configuration under
.agents/(.agents/skills/,.agents/rules/,.agents/hooks.json,AGENTS.md, andGEMINI.md) and user-level configuration under~/.gemini/config/. - Lifecycle Hooks (
.agents/hooks.json): Configured with named hook bundles (e.g."harnery": { ... }). SupportsPreToolUse,PostToolUse,PreInvocation,PostInvocation, andStop. Tool hooks require a regexmatcher(e.g."matcher": "*"). - Payload Encoding: Payloads sent to
stdinuse camelCase protojson (conversationId,workspacePaths,transcriptPath,artifactDirectoryPath,toolCall: { name, args },stepIdx,terminationReason,executionNum,modelName). - Stdout Contracts:
PreToolUse: Returns{ "decision": "allow" | "deny" | "ask" | "force_ask", "reason": "...", "overwrite": { ... } }.Stop: Returns{ "decision": "continue", "reason": "..." }to enforce turn policies and continue loops.PreInvocation: Returns{ "injectSteps": [...] }.
- Skills and Rules: Uses progressive disclosure on
.agents/skills/<name>/SKILL.mdand hierarchical rule loading onAGENTS.md.
Without a native adapter in Harnery, Antigravity users cannot take advantage of harn init, harn doctor, workflow child spawning, automated tool-use auditing, turn-stop governance, or offline adapter bench verification.
Alternatives Considered
Section titled “Alternatives Considered”- External plugin or bridge wrapper: Build an external wrapper script translating Antigravity payloads before invoking Harnery. Rejected because Harnery’s core design (ADR 0018) mandates that supported adapters are first-class, verified citizens in the adapter registry rather than unmonitored external shims.
- Separate adapters for CLI (
agy) vs IDE (antigravity-ide): Rejected because both surfaces share identical.agents/discovery roots, identical.agents/hooks.jsonschemas, and identical protojson payloads. A single adapter identifier (antigravity) cleanly covers both. - Coercing protojson upstream via jq/wrapper: Rejected because adding external shell dependencies breaks cross-platform portability. Tolerant normalization inside Harnery’s
parsePayloadis fast, zero-dependency, and type-safe.
Decision
Section titled “Decision”Add first-class "antigravity" adapter support across all Harnery subsystems:
1. Adapter Registry & Capabilities (core/adapters/)
Section titled “1. Adapter Registry & Capabilities (core/adapters/)”Register BUILTIN_ADAPTER_PROFILES["antigravity"]:
id: "antigravity"displayName: "Google Antigravity"binary: "agy"installHint: "https://antigravity.google/docs"loginHint: "run \agy` and complete authentication“`apiKeyEnv: "GEMINI_API_KEY"modelFamily: "multi"effortValues: [](Gemini model selection manages reasoning modes directly)- Declare explicit capabilities:
invocation: supported("Headless CLI subprocess via agy.")toolEvidence: supported("PreToolUse and PostToolUse capture full tool calls and execution state.")policyMapping: supported("PreToolUse maps ALLOW/DENY/ASK and tool-input overwrite directly.")sessionId: supported("Read from conversationId in protojson payloads.")preCompactionSignal: unknown()postCompactionSignal: unknown()
2. Event Schema & Hook Adapter (core/hooks/)
Section titled “2. Event Schema & Hook Adapter (core/hooks/)”- Add
"antigravity"to the canonicalAdapterunion incore/hooks/events/schema.ts. - Define
ANTIGRAVITY_EVENTSandADAPTER_SPECS["antigravity"]incore/hooks/adapter/events.ts:settingsFile: ".agents/hooks.json"entryShape: "antigravity"(named bucket wrapper withmatcherfields on tool events)- Map
PreToolUse→pre-tool-use,PostToolUse→post-tool-use,PreInvocation→session-start/user-prompt-submit,Stop→stop.
- Update
core/hooks/adapter/parse.tsto normalize camelCase protojson fields:conversationId→session_id/conversation_idtoolCall.name→tool_nametoolCall.args→tool_inputstepIdx→turn_idtranscriptPath→transcript_path
- Update
core/hooks/adapter/output.tsto format stdout decisions adhering to Antigravity’s schema ({ decision: "allow" | "deny" | "ask" }forPreToolUse,{ decision: "continue", reason: "..." }forStop). - Update
core/hooks/adapter/detect.tsto recognize--adapter antigravityandAGENT_COORD_ADAPTER=antigravity.
3. Workflow Subprocess Spawner (core/workflow/spawn-antigravity.ts)
Section titled “3. Workflow Subprocess Spawner (core/workflow/spawn-antigravity.ts)”- Implement
buildAntigravityInvocation(request, resultFile)to constructagysubprocess arguments. - Implement
normalizeAntigravityResult(raw)to map CLI output and exit codes into a unifiedSpawnResult. - Provide an offline deterministic test fixture in
registry.tsforharn adapter bench.
4. Setup, Diagnostics, and Instructions (commands/ & lib/instructions/)
Section titled “4. Setup, Diagnostics, and Instructions (commands/ & lib/instructions/)”harn init --adapter antigravity: Writes/merges.agents/hooks.jsonwithout disturbing custom user hooks, and injects managed orientation blocks intoAGENTS.md.harn doctor: Probesagyexecutable availability, verifies.agents/hooks.jsonhook registration, and checks instruction synchronization.lib/instructions/apply.ts: Deploys agent skills directly to.agents/skills/without needing import shims, as Antigravity natively loads this path.
Result
Section titled “Result”harn adapter listandharn adapter show antigravitydisplay verified capability claims.harn adapter bench antigravityexecutes offline conformance checks verifying invocation planning and result normalization without requiring live model calls.harn init --adapter antigravitybootstraps Harnery coordination in Antigravity projects in a single idempotent step.- Lifecycle events, tool auditing, and turn-stop policies function seamlessly in Antigravity environments.