Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 14 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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 | — |

<sub>**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).</sub>
Expand Down Expand Up @@ -185,6 +186,18 @@ codex plugin add aidd-context@aidd-framework # per plugin

</details>

<details>
<summary><strong>Antigravity CLI</strong> — Flat only</summary>

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)

</details>

## 🚀 Quick start

Three ways in — pick one:
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
status: pending
status: done
---

<!-- Fill or omit these sections; never add, rename, or reorder one. -->
Expand Down
Original file line number Diff line number Diff line change
@@ -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
---

<!-- Fill or omit these sections; never add, rename, or reorder one. -->
Expand Down
5 changes: 3 additions & 2 deletions cli/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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

Expand Down
1 change: 1 addition & 0 deletions cli/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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 .",
Expand Down
109 changes: 109 additions & 0 deletions cli/scripts/smoke-antigravity.sh
Original file line number Diff line number Diff line change
@@ -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<!-- aidd_project_memory:start -->\n<!-- aidd_project_memory:end -->\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
2 changes: 1 addition & 1 deletion docs/FAQ.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
1 change: 1 addition & 0 deletions docs/MAINTAINERS.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
1 change: 1 addition & 0 deletions plugins/aidd-context/hooks/update_memory.js
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ const TOOL_FILES = {
codex: "AGENTS.md",
cursor: "AGENTS.md",
opencode: "AGENTS.md",
antigravity: "AGENTS.md",
copilot: ".github/copilot-instructions.md",
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ Where a skill tree is written, per tool.
| OpenCode | `.opencode/skills/<name>/` |
| GitHub Copilot | `.github/skills/<name>/` |
| Codex CLI | `.agents/skills/<name>/` |
| Antigravity CLI | `.agents/skills/<name>/` |
| Plugin source | `plugins/<plugin>/skills/<name>/` |

## Frontmatter
Expand All @@ -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` |
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,15 @@ The per-tool rules path and write targets. Rule slice only, nothing about skills
| GitHub Copilot | `.github/instructions/<NN>-<name>.instructions.md` | yes (flat) |
| OpenCode | `.opencode/rules/<category>/<slug>.md` | yes |
| Codex CLI | `.codex/rules/<category>/<slug>.md` | yes |
| Antigravity CLI | `.agents/rules/<slug>.md` | yes (flat) |

`<slug>` is the file name `#-slug` from `rule-authoring.md` (e.g. `2-python-fstrings`). `<name>` is that slug with its leading category digit dropped (`python-fstrings`). `<category>` is the folder `<NN>-<name-of-category>`, the zero-padded category index plus the category name from the taxonomy, e.g. `01-standards`. `<NN>` is that same two-digit index.

Copilot is flat: no category folder. Its file is `<NN>-<name>`, 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.

Expand All @@ -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.

Expand All @@ -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

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,9 @@ The per-tool agent path and the gate every run executes before writing. Agent sl
| OpenCode | `.opencode/agents/<name>.md` | markdown + frontmatter |
| GitHub Copilot | `.github/agents/<name>.agent.md` | markdown + frontmatter |
| Codex CLI | `.codex/agents/<name>.toml` | TOML (converted) |
| Antigravity CLI | `.agents/agents/<name>/agent.md` | markdown + frontmatter |

Agents are supported on all five tools.
Agents are supported on all six tools.

## Frontmatter per tool

Expand All @@ -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

Expand All @@ -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

Expand Down
Loading
Loading