Skip to content

Antigravity CLI 1.1.26 never loads a plugin's hooks, and silently drops two of this plugin's four events #553

Description

@fdaviddpt

Antigravity CLI (agy) 1.1.26 installs from https://antigravity.google/cli/install.sh to ~/.local/bin/agy. It is a fourth candidate host: it carries plugin import [source] documented as "Import plugins from gemini or claude", plus plugin install/validate/enable/disable and an mcp subcommand.

It is also, unlike Gemini CLI, verifiable. #532 blocks on headless OAuth (invalid_grant, no OOB fallback). agy has no such wall:

$ agy -p "reply with exactly: OK" --output-format text
OK

No browser, no prompt, no cached-credential failure. So the reason every Gemini CLI test in this repo asserts manifest shape only does not apply here — Antigravity claims can be observed rather than reasoned.

What was observed

All of the below was run against this repo at 0.26.0.

agy plugin validate requires plugin.json in the directory it is pointed at, and resolves component directories as siblings of that file. Pointed at .claude-plugin/, every component type is missing (see the sibling issue about that output):

$ agy plugin validate .claude-plugin
  [ok]    .claude-plugin
          - skills      : skipped (not found)
          - agents      : skipped (not found)
          - commands    : skipped (not found)
          - mcpServers  : skipped (not found)
          - hooks       : skipped (not found)

With a flat layout — plugin.json copied to a scratch directory, with hooks/, commands/, skills/ symlinked in beside it — three of five resolve and one does not:

  [ok]    <scratch>
          ✔ skills      : 1 processed
          - agents      : skipped (not found)
          ✔ commands    : 1 processed (converted to skills)
          - mcpServers  : skipped (not found)
          - hooks       : skipped (not found)

hooks/hooks.json is present and readable in that tree — the symlink is the same one skills and commands resolved through. Copying that same file to hooks.json at the plugin root, changing nothing else, flips it:

  [ok]    <scratch>
          ✔ skills      : 1 processed
          - agents      : skipped (not found)
          ✔ commands    : 1 processed (converted to skills)
          ✔ hooks       : 1 processed

So Antigravity looks for the hook manifest at <plugin-root>/hooks.json, while this repo keeps it at hooks/hooks.json, which is where Claude Code reads it.

Why this matters more than the count suggests

This plugin is its hooks. SessionStart, UserPromptSubmit and Stop are what capture memory at all; skills and commands are the surface around them. A host that loads the skills and silently drops the hooks yields an install that looks present and saves nothing — the exact failure mode this project treats as its worst, and one a user would attribute to the plugin rather than to the host.

Note also that commands is reported as "converted to skills", so the command surface does not survive as commands. Whether that conversion preserves behaviour is not established here and should be checked separately.

What is not established

  • Whether agy plugin import claude (as opposed to validate) applies a different, Claude-aware layout resolution that would find hooks/hooks.json correctly. agy plugin import with no imported extensions present answered No claude extensions found., so the import path was never exercised against this repo.
  • Whether hooks that do load actually fire, what stdin payload shape they carry, where Antigravity writes its transcript, and whether the stdout contract matches Claude Code's. These are the same four questions Add Gemini CLI support: the event mapping is machine-generated, but the migration output would not run here #456 asks of Gemini CLI, and unlike there, they are answerable here — headless print mode works.
  • Whether the root-hooks.json layout is documented and stable, or an implementation detail of 1.1.26.

Scope this is not

This is a finding, not a request to ship a fourth host. Adding an Antigravity badge to the README (#547/#548) would today be a claim a one-line probe disproves, which is worse than the caveated Gemini badge. The badge follows the evidence, not the other way round.

Measured on macOS (darwin/arm64), agy 1.1.26, this checkout at 0.26.0. Nothing here is claimed for other platforms.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    cohort-5Open at the v0.27.0 tag; frozen, can only shrinkpriority:highBlocks work or has already caused damage

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions