diff --git a/README.md b/README.md index 760238e8d..8e151be14 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ Why not just write your own commands? โ†’ [FAQ](docs/FAQ.md#-why-aidd-instead-of ## โœ… Prerequisites -- **An AI coding tool** โ€” Claude Code (native), or Cursor / Copilot / Codex / OpenCode / Kilo Code (see [Compatibility](#-compatibility)). +- **An AI coding tool** โ€” Claude Code (native), or Cursor / Copilot / Codex / OpenCode / Kilo Code / Antigravity CLI (see [Compatibility](#-compatibility)). - **[Node](https://nodejs.org) 22 or later** on your `PATH`, only for the plugin that ships hooks ([what they do](docs/ARCHITECTURE.md#-bundled-hooks)); the workflows themselves are markdown and need nothing. ## ๐Ÿ”Œ Compatibility @@ -50,6 +50,7 @@ Why not just write your own commands? โ†’ [FAQ](docs/FAQ.md#-why-aidd-instead-of | **Codex** | โœ… Supported | Marketplace ยท Flat | | **OpenCode** | โœ… Supported | Flat | | **Kilo Code** | โœ… Supported | Flat | +| **Antigravity CLI** | โœ… Supported | Flat | | **Gemini ยท Mistral** | ๐Ÿšง In progress | โ€” | **Marketplace** = installed and updated through your tool's plugin manager. **Flat** = files copied directly into your project, no plugin manager involved. Install steps per tool โ†’ [Other tools](#other-tools). @@ -185,6 +186,18 @@ codex plugin add aidd-context@aidd-framework # per plugin +
+Antigravity CLI โ€” Flat only + +1. Unzip the `antigravity-flat` archive into your project root โ†’ `.agents/`: skills, agents, and the memory hook in `.agents/hooks.json`. +2. Start `agy` in the project. A hook already in `.agents/hooks.json` under another name is kept. + +Codex flat also writes `.agents/skills/`: removing one of the two from a project that has both deletes skills the other still uses. + +[Docs](https://antigravity.google/docs/subagents?tab=cli) + +
+ ## ๐Ÿš€ Quick start Three ways in โ€” pick one: diff --git a/aidd_docs/tasks/2026_10/2026_10_02_antigravity-flat-host/phase-5.md b/aidd_docs/tasks/2026_10/2026_10_02_antigravity-flat-host/phase-5.md index c6448f792..50726156e 100644 --- a/aidd_docs/tasks/2026_10/2026_10_02_antigravity-flat-host/phase-5.md +++ b/aidd_docs/tasks/2026_10/2026_10_02_antigravity-flat-host/phase-5.md @@ -1,5 +1,5 @@ --- -status: pending +status: done --- diff --git a/aidd_docs/tasks/2026_10/2026_10_02_antigravity-flat-host/plan.md b/aidd_docs/tasks/2026_10/2026_10_02_antigravity-flat-host/plan.md index f634dcd76..3a67151d4 100644 --- a/aidd_docs/tasks/2026_10/2026_10_02_antigravity-flat-host/plan.md +++ b/aidd_docs/tasks/2026_10/2026_10_02_antigravity-flat-host/plan.md @@ -1,6 +1,6 @@ --- objective: "`aidd setup --ai antigravity` and `aidd translate --to antigravity --as flat` write AIDD skills, the memory hook and agents under `.agents/`, which `agy` loads, without touching files AIDD did not write." -status: in-progress +status: implemented --- diff --git a/cli/README.md b/cli/README.md index 0013c0390..6ee495c2c 100644 --- a/cli/README.md +++ b/cli/README.md @@ -3,7 +3,7 @@ `@ai-driven-dev/cli` installs AI tool runtime configs, IDE integrations, and plugins from an AIDD marketplace into a project. Every file it writes is hash-tracked in a manifest, so drift is detected and owned files can be restored. -Supported AI tools: Claude Code, Cursor, GitHub Copilot, Codex, OpenCode, Kilo Code. Supported IDE: VS Code. +Supported AI tools: Claude Code, Cursor, GitHub Copilot, Codex, OpenCode, Kilo Code, Antigravity CLI. Supported IDE: VS Code. Requires Node.js >= 22.12, and `git` to fetch marketplace plugins. ## Install @@ -137,8 +137,9 @@ Two output layouts, chosen by `--as`: | `codex` | yes | yes | `.codex/` | | `opencode` | no | yes | `.opencode/` | | `kilo` | no | yes | `.kilo/` | +| `antigravity` | no | yes | `.agents/` | -OpenCode and Kilo Code declare no marketplace contract, so they are flat only. Every other target accepts both layouts. +OpenCode, Kilo Code and Antigravity CLI declare no marketplace contract, so they are flat only. Every other target accepts both layouts. ## Environment variables diff --git a/cli/package.json b/cli/package.json index cb167d4b0..f4f790859 100644 --- a/cli/package.json +++ b/cli/package.json @@ -54,6 +54,7 @@ "smoke:full": "pnpm build && SMOKE_REMOTE=1 bash scripts/smoke-tools.sh", "smoke:real": "pnpm build && bash scripts/smoke-real.sh", "smoke:collision": "pnpm build && bash scripts/smoke-collision.sh", + "smoke:antigravity": "pnpm build && bash scripts/smoke-antigravity.sh", "typecheck": "tsc --noEmit", "lint": "biome check .", "format": "biome format --write .", diff --git a/cli/scripts/smoke-antigravity.sh b/cli/scripts/smoke-antigravity.sh new file mode 100755 index 000000000..f86cb81ca --- /dev/null +++ b/cli/scripts/smoke-antigravity.sh @@ -0,0 +1,109 @@ +#!/usr/bin/env bash +# Runtime smoke against a real, logged-in `agy`: after `aidd setup --ai antigravity`, the host +# itself expands an AIDD skill, loads and fires the memory hook, and lists an AIDD agent. +# Local only, never in CI or lefthook: a turn needs a Google login. `pnpm smoke:antigravity`. +# +# Measured on agy 1.2.17, and why the script reads logs instead of waiting on a turn: +# - print mode (`-p`) fires no hook, so the hook session runs interactive under a pty +# (`script`), with `--add-dir` (without it, 0 hooks load); +# - an interactive turn never returns, so that session is killed after a bound, and only its +# log lines and the files it touched count as evidence; +# - an interactive initial prompt is sent as text, never expanded, so the skill and +# `/agents` checks use print mode, bounded by `--print-timeout`. +# +# The project is a throwaway git repo; HOME stays real because the login lives there, but +# `AIDD_USER_CONFIG_DIR` is relocated so setup never touches the real aidd profile. +set -uo pipefail + +ROOT="$(cd "$(dirname "$0")/.." && pwd)" +FRAMEWORK="$(cd "$ROOT/.." && pwd)" +CLI="$ROOT/dist/cli.js" +TURN_SECONDS="${SMOKE_AGY_TIMEOUT:-60}" + +SKILL="aidd-context-11-explore" +AGENT="aidd-dev-executor" +GHOST_AGENT="aidd-dev-ghost" + +command -v agy >/dev/null 2>&1 || { echo "FATAL: agy not on PATH โ€” install Antigravity CLI and log in"; exit 1; } +[[ -f "$CLI" ]] || { echo "FATAL: $CLI missing โ€” run 'pnpm build' first"; exit 1; } + +TMP="$(mktemp -d)" +WS="$TMP/project" +SESSION_PID="" +cleanup() { + if [[ -n "$SESSION_PID" ]]; then + pkill -P "$SESSION_PID" 2>/dev/null + kill "$SESSION_PID" 2>/dev/null + fi + rm -rf "$TMP" +} +trap cleanup EXIT + +export AIDD_USER_CONFIG_DIR="$TMP/aidd-config" +export AIDD_SKIP_UPDATE_CHECK=1 + +FAIL=0 +pass() { echo " PASS $1"; echo " $2"; } +fail() { echo " FAIL $1"; FAIL=$((FAIL + 1)); } + +echo "agy $(agy --version 2>&1 | head -1), $(date '+%Y-%m-%d %H:%M %Z')" + +# A project with a memory bank and an empty memory block, so the hook has something to fill. +mkdir -p "$WS/aidd_docs/memory" +printf '# Architecture\n' >"$WS/aidd_docs/memory/architecture.md" +printf '# Project\n\n## Memory Management\n\n\n\n' >"$WS/AGENTS.md" +git -C "$WS" init -q +git -C "$WS" -c user.email=smoke@aidd -c user.name=smoke commit -q --allow-empty -m init + +if ! (cd "$WS" && node "$CLI" setup --source local --path "$FRAMEWORK" --ai antigravity --plugins recommended --yes) >"$TMP/setup.log" 2>&1; then + echo "FATAL: aidd setup failed"; tail -5 "$TMP/setup.log"; exit 1 +fi +for f in ".agents/skills/$SKILL/SKILL.md" ".agents/hooks.json" ".agents/agents/$AGENT/agent.md"; do + [[ -f "$WS/$f" ]] || { echo "FATAL: setup did not write $f"; exit 1; } +done + +LOG="$TMP/agy-session.log" +(cd "$WS" && exec script -q /dev/null agy -i "reply OK" --mode plan --add-dir "$WS" --log-file "$LOG") \ + >"$TMP/agy-session.out" 2>&1 & +SESSION_PID=$! + +for ((i = 0; i < TURN_SECONDS; i++)); do + grep -q 'aidd_docs/memory/architecture.md' "$WS/AGENTS.md" && break + sleep 1 +done +pkill -P "$SESSION_PID" 2>/dev/null +kill "$SESSION_PID" 2>/dev/null +wait "$SESSION_PID" 2>/dev/null +SESSION_PID="" + +# Startup logs "not logged into Antigravity" before the stored login is read, so only a missing +# success line means no login. +if ! grep -q "OAuth: authenticated successfully" "$LOG" 2>/dev/null; then + echo "FATAL: agy is not logged in โ€” run 'agy' once and sign in"; exit 1 +fi + +line="$(grep -Eo 'loaded [1-9][0-9]* named hooks from [0-9]+ hooks.json file\(s\)' "$LOG" 2>/dev/null | head -1)" +[[ -n "$line" ]] && pass "hooks loaded" "$line" || fail "hooks: no 'loaded N named hooks' line (N >= 1) in the agy log" + +line="$(grep -m1 'aidd_docs/memory/architecture.md' "$WS/AGENTS.md")" +[[ -n "$line" ]] && pass "memory refreshed at the repo root" "AGENTS.md: $line" || fail "memory: AGENTS.md block still empty, the SessionStart hook did not run at the repo root" + +# The expansion is logged before the model answers, so a short bound is enough. +SKILL_LOG="$TMP/agy-skill.log" +(cd "$WS" && agy --add-dir "$WS" --mode plan --print-timeout 20s --log-file "$SKILL_LOG" -p "/$SKILL") >/dev/null 2>&1 +line="$(grep -o "expanded slash command \"$SKILL\" (skill)" "$SKILL_LOG" 2>/dev/null | head -1)" +[[ -n "$line" ]] && pass "skill expanded" "$line" || fail "skill: no 'expanded slash command \"$SKILL\"' line in the agy log" + +# Print mode answers /agents without the model. +AGENTS_JSON="$TMP/agents.json" +(cd "$WS" && agy --add-dir "$WS" --output-format json --print-timeout "${TURN_SECONDS}s" -p "/agents") >"$AGENTS_JSON" 2>&1 +line="$(grep -o "\"$AGENT\"" "$AGENTS_JSON" | head -1)" +if [[ -n "$line" ]] && ! grep -q "\"$GHOST_AGENT\"" "$AGENTS_JSON"; then + pass "agent listed" "/agents: $line, $GHOST_AGENT absent" +else + fail "agents: /agents does not list \"$AGENT\" (or lists the invented $GHOST_AGENT)" +fi + +echo +[[ "$FAIL" -eq 0 ]] && { echo "smoke-antigravity: all passed"; exit 0; } +echo "smoke-antigravity: $FAIL failed"; exit 1 diff --git a/docs/FAQ.md b/docs/FAQ.md index 84d394d63..7975d502b 100644 --- a/docs/FAQ.md +++ b/docs/FAQ.md @@ -11,7 +11,7 @@ You can write your own Claude Code skills โ€” nothing stops you. AIDD exists bec - **Install / first run** โ†’ [Quick start](../README.md#-quick-start). - **Update plugins** โ†’ `/plugin marketplace update aidd-framework`, or see [Versioning & updates](MARKETPLACE.md#-versioning--updates). - **Private repo?** Yes โ€” `/plugin marketplace add` just needs GitHub read access (via `gh auth login` or a PAT). -- **Cursor / Copilot / Codex / OpenCode / Kilo Code?** Each other tool installs via its own native mechanism (project files, local plugins, or a plugin command) from the [release](https://github.com/ai-driven-dev/framework/releases/latest) archives. Steps per tool โ†’ [Other tools](../README.md#other-tools). +- **Cursor / Copilot / Codex / OpenCode / Kilo Code / Antigravity CLI?** Each other tool installs via its own native mechanism (project files, local plugins, or a plugin command) from the [release](https://github.com/ai-driven-dev/framework/releases/latest) archives. Steps per tool โ†’ [Other tools](../README.md#other-tools). ## ๐Ÿ’ธ Cost and quotas diff --git a/docs/MAINTAINERS.md b/docs/MAINTAINERS.md index 6ae24b5c2..d6881336b 100644 --- a/docs/MAINTAINERS.md +++ b/docs/MAINTAINERS.md @@ -148,6 +148,7 @@ Roles, promotion, and inactivity rules โ†’ [`GOVERNANCE.md`](../GOVERNANCE.md#-r - The marketplace is Claude Code native. - Other tools are served by per-release archives the `aidd-cli` builds; this repo stays Claude-authored and tool-agnostic in its prose. - Keep tool-specific detail in plugin READMEs. +- Antigravity CLI has no runtime check in CI: a turn needs a Google login. Before a release that touches its profile, run `cd cli && pnpm smoke:antigravity` on a machine where `agy` is logged in. It installs AIDD into a throwaway project, then checks the `agy` log for a skill expansion and the loaded hooks, the project memory for the hook's refresh, and `/agents` for an AIDD agent. ## ๐Ÿงฑ Build your own plugin diff --git a/plugins/aidd-context/hooks/update_memory.js b/plugins/aidd-context/hooks/update_memory.js index 4cb856ec1..a4c56d29c 100644 --- a/plugins/aidd-context/hooks/update_memory.js +++ b/plugins/aidd-context/hooks/update_memory.js @@ -42,6 +42,7 @@ const TOOL_FILES = { codex: "AGENTS.md", cursor: "AGENTS.md", opencode: "AGENTS.md", + antigravity: "AGENTS.md", copilot: ".github/copilot-instructions.md", }; diff --git a/plugins/aidd-context/skills/00-onboard/references/state/detection.md b/plugins/aidd-context/skills/00-onboard/references/state/detection.md index f66011153..a8c0d4275 100644 --- a/plugins/aidd-context/skills/00-onboard/references/state/detection.md +++ b/plugins/aidd-context/skills/00-onboard/references/state/detection.md @@ -10,6 +10,7 @@ A tool is used when its own dir exists, or when a file only that tool reads exis | codex | `.codex/` | `AGENTS.md` | | cursor | `.cursor/` or `.cursorrules` | `AGENTS.md` | | opencode | `.opencode/` | `AGENTS.md` | +| antigravity | `.agents/agents/`, `.agents/rules/` or `.agents/hooks.json` | `AGENTS.md` | | copilot | `.github/copilot-instructions.md` or `.github/{instructions,agents,skills,prompts}/` | `.github/copilot-instructions.md` | - Detected tools only. An unused optional tool is omitted, never crossed. diff --git a/plugins/aidd-context/skills/02-project-memory/references/tools.md b/plugins/aidd-context/skills/02-project-memory/references/tools.md index 4b90d76d1..f25dc0bbe 100644 --- a/plugins/aidd-context/skills/02-project-memory/references/tools.md +++ b/plugins/aidd-context/skills/02-project-memory/references/tools.md @@ -8,6 +8,7 @@ The AI tools a project can use. | codex | `.codex/` | `AGENTS.md` | | cursor | `.cursor/` or `.cursorrules` | `AGENTS.md` | | opencode | `.opencode/` | `AGENTS.md` | +| antigravity | `.agents/agents/`, `.agents/rules/` or `.agents/hooks.json` | `AGENTS.md` | | copilot | `.github/copilot-instructions.md` or `.github/{instructions,agents,skills,prompts}/` | `.github/copilot-instructions.md` | - A shared `AGENTS.md` is a wiring target, never a detection signal. diff --git a/plugins/aidd-context/skills/04-skill-generate/references/tool-detect.md b/plugins/aidd-context/skills/04-skill-generate/references/tool-detect.md index 286dbc7a3..94fbe2467 100644 --- a/plugins/aidd-context/skills/04-skill-generate/references/tool-detect.md +++ b/plugins/aidd-context/skills/04-skill-generate/references/tool-detect.md @@ -9,5 +9,6 @@ Which AI tools a project has installed. | OpenCode | `.opencode/` | | GitHub Copilot | `.github/copilot-instructions.md` | | Codex CLI | `.codex/` | +| Antigravity CLI | `.agents/agents/`, `.agents/rules/` or `.agents/hooks.json` | -A bare `AGENTS.md` means Cursor, OpenCode, or Codex. Several signals can coexist. +A bare `AGENTS.md` means Cursor, OpenCode, Codex, or Antigravity CLI. `.agents/skills/` alone is no signal: Codex and Antigravity CLI both read it. Several signals can coexist. diff --git a/plugins/aidd-context/skills/04-skill-generate/references/tool-write.md b/plugins/aidd-context/skills/04-skill-generate/references/tool-write.md index 2863f4ccd..852aa9f06 100644 --- a/plugins/aidd-context/skills/04-skill-generate/references/tool-write.md +++ b/plugins/aidd-context/skills/04-skill-generate/references/tool-write.md @@ -11,6 +11,7 @@ Where a skill tree is written, per tool. | OpenCode | `.opencode/skills//` | | GitHub Copilot | `.github/skills//` | | Codex CLI | `.agents/skills//` | +| Antigravity CLI | `.agents/skills//` | | Plugin source | `plugins//skills//` | ## Frontmatter @@ -23,3 +24,4 @@ Emit `description` always, `name` only where listed, drop the rest. | Cursor, GitHub Copilot | `name`, `description`, opt `allowed-tools` | | OpenCode | `description`, opt `permission` map | | Codex CLI | `name`, `description` (strips the rest) | +| Antigravity CLI | `name`, `description` | diff --git a/plugins/aidd-context/skills/05-rule-generate/references/tool-paths.md b/plugins/aidd-context/skills/05-rule-generate/references/tool-paths.md index ba7cbe23b..e0c8eb9ad 100644 --- a/plugins/aidd-context/skills/05-rule-generate/references/tool-paths.md +++ b/plugins/aidd-context/skills/05-rule-generate/references/tool-paths.md @@ -11,12 +11,15 @@ The per-tool rules path and write targets. Rule slice only, nothing about skills | GitHub Copilot | `.github/instructions/-.instructions.md` | yes (flat) | | OpenCode | `.opencode/rules//.md` | yes | | Codex CLI | `.codex/rules//.md` | yes | +| Antigravity CLI | `.agents/rules/.md` | yes (flat) | `` is the file name `#-slug` from `rule-authoring.md` (e.g. `2-python-fstrings`). `` is that slug with its leading category digit dropped (`python-fstrings`). `` is the folder `-`, the zero-padded category index plus the category name from the taxonomy, e.g. `01-standards`. `` is that same two-digit index. Copilot is flat: no category folder. Its file is `-`, e.g. `2-python-fstrings` becomes `02-python-fstrings` (one category prefix, no folder). -Every tool above installs rules. This table used to say OpenCode and Codex do not, and to tell a generator to put the convention in AGENTS.md instead; both were false. `plugin-content-translator.ts` routes a plugin's `rules/` into every tool whose capability accepts them, and all five accept them โ€” `aidd ai rules` prints where each one lands, asked of the installer itself rather than of a list. +Antigravity CLI is flat too: it reads only the direct `.md` children of `.agents/rules/`, so a category folder would hide the rule. + +Every tool above installs rules. This table used to say OpenCode and Codex do not, and to tell a generator to put the convention in AGENTS.md instead; both were false. `plugin-content-translator.ts` routes a plugin's `rules/` into every tool whose capability accepts them, and all five accept them. Antigravity CLI is the exception: AIDD installs no rule for it, so a generated rule is the only way one reaches `.agents/rules/` โ€” `aidd ai rules` prints where each one lands, asked of the installer itself rather than of a list. Both use the same frontmatter as Claude Code: `paths` (array of globs), omitted for an all-files rule. @@ -29,6 +32,7 @@ The file-scope field is named differently per tool. Set the right one. | Claude Code | `paths` (array of globs). Omit `paths` for an all-files rule; no `paths` means it applies everywhere. | | Cursor | `description` (one line, what the rule governs), `globs` (comma-separated; omit for all-files), `alwaysApply` (false; true for all-files). | | GitHub Copilot | `applyTo` (single glob string; `**` for an all-files rule). | +| Antigravity CLI | `trigger` (required): `always_on` for an all-files rule, else `glob` with `globs`. | A multi-glob `paths` becomes a comma-joined string for Cursor and Copilot, or the most-encompassing glob. @@ -39,6 +43,7 @@ A multi-glob `paths` becomes a comma-joined string for Cursor and Copilot, or th | `.claude/` or `CLAUDE.md` | Claude Code | | `.cursor/` | Cursor | | `.github/copilot-instructions.md` | GitHub Copilot | +| `.agents/agents/`, `.agents/rules/` or `.agents/hooks.json` | Antigravity CLI | ## Write targets diff --git a/plugins/aidd-context/skills/06-agent-generate/references/tool-paths.md b/plugins/aidd-context/skills/06-agent-generate/references/tool-paths.md index 5ca7a1250..1a4376067 100644 --- a/plugins/aidd-context/skills/06-agent-generate/references/tool-paths.md +++ b/plugins/aidd-context/skills/06-agent-generate/references/tool-paths.md @@ -11,8 +11,9 @@ The per-tool agent path and the gate every run executes before writing. Agent sl | OpenCode | `.opencode/agents/.md` | markdown + frontmatter | | GitHub Copilot | `.github/agents/.agent.md` | markdown + frontmatter | | Codex CLI | `.codex/agents/.toml` | TOML (converted) | +| Antigravity CLI | `.agents/agents//agent.md` | markdown + frontmatter | -Agents are supported on all five tools. +Agents are supported on all six tools. ## Frontmatter per tool @@ -25,6 +26,9 @@ The canonical agent carries `name`, `description`, `model`. Emit those a row acc | OpenCode | `name`, `description`, `model`, optional `temperature`, `permission` | | GitHub Copilot | `name`, `description`, `model`, optional `tools` | | Codex CLI | `name`, `description` (drops `model`) | +| Antigravity CLI | `name`, `description`, `model: inherit`, optional `tools` as a YAML list | + +`agy` drops in silence an agent whose `model` is not `inherit`, `flash` or `pro`, or whose `tools` is a comma-separated string. ## Codex TOML conversion @@ -43,7 +47,8 @@ Codex agents are TOML, not markdown. Convert: | `.opencode/` | OpenCode | | `.codex/` | Codex CLI | | `.github/copilot-instructions.md` | GitHub Copilot | -| `AGENTS.md` | Cursor, OpenCode, or Codex (list all) | +| `.agents/agents/`, `.agents/rules/` or `.agents/hooks.json` | Antigravity CLI | +| `AGENTS.md` | Cursor, OpenCode, Codex, or Antigravity CLI (list all) | ## Write targets diff --git a/plugins/aidd-context/skills/08-hook-generate/references/tool-paths.md b/plugins/aidd-context/skills/08-hook-generate/references/tool-paths.md index 48b1d19ef..0757af487 100644 --- a/plugins/aidd-context/skills/08-hook-generate/references/tool-paths.md +++ b/plugins/aidd-context/skills/08-hook-generate/references/tool-paths.md @@ -11,6 +11,7 @@ Per-tool hook support, event names, file formats, and scopes. Hook slice only: n | Cursor | yes | JSON config + script. | | GitHub Copilot | yes | JSON config + script. Also reads Claude's `.claude/` config. | | OpenCode | no | Hooks are JS/TS plugin modules, not config. Skip with the reason below. | +| Antigravity CLI | yes | JSON config + script. Project scope only here, see below. | **OpenCode skip reason.** OpenCode hooks are code, not a config entry plus a script. Point the user to write a plugin under `.opencode/plugins/` (project) or `~/.config/opencode/plugins/` (user), per `https://opencode.ai/docs/plugins`. This skill does not generate it. @@ -29,6 +30,8 @@ Each tool names the same moment differently and supports a different subset. Cor | turn stop | `Stop` | `Stop` | `stop` | `Stop` | | session end | `SessionEnd` | `SessionEnd` | `sessionEnd` | `SessionEnd` | +Antigravity CLI documents `PreToolUse`, `PostToolUse`, `PreInvocation`, `PostInvocation` and `Stop`; `SessionStart` works on `agy` 1.2.17 but is undocumented. Its tool names differ from Claude's, so a `matcher` never carries over. + Each tool exposes more moments than these. For the full list, read the tool's docs: Claude `https://code.claude.com/docs/en/hooks`, Codex `https://developers.openai.com/codex/hooks`, Cursor `https://cursor.com/docs/hooks`, Copilot `https://docs.github.com/en/copilot/reference/hooks-configuration`. Confirm a moment exists before wiring it. Copilot also accepts the camelCase names (`sessionStart`, `preToolUse`). ## File and format per tool @@ -39,9 +42,12 @@ Each tool exposes more moments than these. For the full list, read the tool's do | Codex CLI | `~/.codex/hooks.json` or `[hooks]` in `config.toml` | same entry shape as Claude. | | Cursor | `.cursor/hooks.json` | `{ "version": 1, "hooks": { "": [ { "command": "..." } ] } }` | | GitHub Copilot | `.github/hooks/*.json` or a `hooks` block in `.github/copilot/settings.json` | `{ "version": 1, "hooks": { "": [ { "type": "command", "command": "..." } ] } }` | +| Antigravity CLI | `.agents/hooks.json` | `{ "": { "": [ { "type": "command", "command": "..." } ] } }`, no `hooks` wrapper; a `matcher` entry only for `PreToolUse` and `PostToolUse` | A Claude `settings.json` and a plugin or standalone `hooks/hooks.json` both wrap the event map under a top-level `hooks` key, so the file is `{ "hooks": { "": [ ... ] } }`. A Codex `config.toml` uses a `[hooks]` table instead. +An Antigravity CLI handler runs from `/.agents`, through a shell: prefix a root-relative command with `cd .. && `. `agy` rejects a Claude-style nested `[ { "hooks": [ ... ] } ]` with `command hook must specify 'command'`. + ## Scopes per tool Ask the user which scope, then write the matching file. A `-` means the tool has no such scope. @@ -81,4 +87,4 @@ Written as `${VAR}` inside a command: `CLAUDE_PROJECT_DIR` (project root), `CLAU - **Asset-access precheck.** Before writing, confirm this reference is readable. If not, stop: the plugin is not installed in this host. - **Merge check.** Before writing, read the target file and confirm the new entry is appended to the moment's list, never overwriting a sibling. -- **Write-target validation.** After writing, confirm the file is valid and every handler path is an approved `${VAR}` or an absolute path under the workspace (a hook command runs from an arbitrary cwd, so an absolute path or `${VAR}` is expected, not a relative one). Otherwise stop and report. +- **Write-target validation.** After writing, confirm the file is valid and every handler path is an approved `${VAR}` or an absolute path under the workspace (a hook command runs from an arbitrary cwd, so an absolute path or `${VAR}` is expected, not a relative one; Antigravity CLI's `cd .. && ` prefix is the one relative form, since its cwd is fixed). Otherwise stop and report. diff --git a/plugins/aidd-context/skills/10-learn/references/sync-arguments.md b/plugins/aidd-context/skills/10-learn/references/sync-arguments.md index 5c3bc2e9a..f2f9f08b5 100644 --- a/plugins/aidd-context/skills/10-learn/references/sync-arguments.md +++ b/plugins/aidd-context/skills/10-learn/references/sync-arguments.md @@ -8,6 +8,7 @@ Arguments accepted by `hooks/update_memory.js`. The hook maps tool names to cont | `codex` | `AGENTS.md` | | `cursor` | `AGENTS.md` | | `opencode` | `AGENTS.md` | +| `antigravity` | `AGENTS.md` | | `copilot` | `.github/copilot-instructions.md` | Rules: diff --git a/plugins/aidd-context/skills/11-explore/references/ai-mapping.md b/plugins/aidd-context/skills/11-explore/references/ai-mapping.md index 388337fb1..d4848e58a 100644 --- a/plugins/aidd-context/skills/11-explore/references/ai-mapping.md +++ b/plugins/aidd-context/skills/11-explore/references/ai-mapping.md @@ -4,7 +4,7 @@ Where to look for each artifact type per AI tool. Scan-only: the paths and forma ## Presence signal -A tool is present only when one of its own mapped surfaces below holds a file. A shared parent directory is never a signal by itself. +A tool is present only when one of its own mapped surfaces below holds a file. A shared parent directory is never a signal by itself. `.agents/skills/` is mapped for both Codex CLI and Antigravity CLI: alone, it signals both. ## AI quick map - content artifacts @@ -15,6 +15,7 @@ A tool is present only when one of its own mapped surfaces below holds a file. A | OpenCode | `.opencode/agents/` | `.opencode/commands/` | **Not supported** (fold into AGENTS.md) | `.opencode/skills/` | `AGENTS.md` | | GitHub Copilot | `.github/agents/*.agent.md` | `.github/prompts/*.prompt.md` | `.github/instructions/*.instructions.md` | `.github/skills/` | `.github/copilot-instructions.md` | | Codex CLI | `.codex/agents/{name}.toml` | **Not supported** | Not supported | `.agents/skills/aidd-{name}/SKILL.md` | `AGENTS.md` | +| Antigravity CLI | `.agents/agents/{name}/agent.md` | Not mapped | `.agents/rules/*.md` | `.agents/skills/aidd-{name}/SKILL.md` | `AGENTS.md` | ## AI quick map - hooks, plugins @@ -25,6 +26,7 @@ A tool is present only when one of its own mapped surfaces below holds a file. A | OpenCode | JS/TS module under `.opencode/plugins/` (parse as JS, not JSON) | Not supported | | GitHub Copilot | `.github/hooks/*.json` (workspace), `~/.copilot/hooks` (user), `/hooks.json` or `/hooks/hooks.json` (plugin) | `plugin.json` at plugin root | | Codex CLI | `.codex/hooks.json` (project / user) OR `[hooks]` table in `.codex/config.toml` | `.codex-plugin/plugin.json` | +| Antigravity CLI | `.agents/hooks.json` (project), keyed by hook name | `plugin.json` at plugin root | ## MCP config per tool @@ -57,3 +59,4 @@ Where to scan when enumerating installed plugins (not the plugin manifest path i | OpenCode | `~/.config/opencode/plugins/` (global JS/TS modules); `~/.cache/opencode/node_modules/` (npm-installed); project `.opencode/plugins/` | | GitHub Copilot | macOS: `~/Library/Application Support/Code/agentPlugins/` ; Linux: `~/.config/Code/agentPlugins/` ; Windows: `%APPDATA%\Code\agentPlugins\` ; CLI-installed: `~/.copilot/installed-plugins/` | | Codex CLI | `~/.codex/plugins/cache/$MARKETPLACE/$PLUGIN/$VERSION/` | +| Antigravity CLI | `~/.gemini/config/plugins//` (`agy plugin install`); project `.agents/plugins/` | diff --git a/scripts/__tests__/update-memory.test.js b/scripts/__tests__/update-memory.test.js index 2041424ea..4102cd342 100644 --- a/scripts/__tests__/update-memory.test.js +++ b/scripts/__tests__/update-memory.test.js @@ -164,6 +164,17 @@ test("an unknown tool name is rejected", () => { assert.match(result.stderr, /unknown tool emacs/u); }); +test("antigravity refreshes AGENTS.md, the context file agy reads", () => { + const result = run({ + context: `${OPEN}\n${CLOSE}\n`, + contextAt: "AGENTS.md", + args: ["antigravity"], + }); + + assert.equal(result.status, 0); + assert.match(result.content, /^\[aidd_docs\/memory\/architecture\.md\]\(aidd_docs\/memory\/architecture\.md\)$/mu); +}); + test("a new-marker pair quoted in prose above the block does not hijack the splice", () => { const quote = `Upgrade note: the block now uses \`${OPEN}\` and \`${CLOSE}\`.`; const result = run({ context: `${quote}\n\n${OPEN}\n${CLOSE}\n` });