diff --git a/.changeset/patient-voles-swim.md b/.changeset/patient-voles-swim.md new file mode 100644 index 000000000..de9a55327 --- /dev/null +++ b/.changeset/patient-voles-swim.md @@ -0,0 +1,5 @@ +--- +type: Added +pr: 553 +--- +**Antigravity CLI (`agy`) peer reviewer in `/gsd-review`** — `--agy` / `--antigravity` flag invokes `agy -p` and produces an `## Antigravity Review` section in REVIEWS.md. Auto-detected by `--all`. Preserves Google-family adversarial review coverage after Gemini CLI's free-tier retirement on 2026-06-18. Windows support included via transcript fallback (no extra tooling required). diff --git a/commands/gsd/review.md b/commands/gsd/review.md index 5dccb5716..ec5a76505 100644 --- a/commands/gsd/review.md +++ b/commands/gsd/review.md @@ -1,7 +1,7 @@ --- name: gsd:review description: Request cross-AI peer review of phase plans from external AI CLIs -argument-hint: "--phase N [--gemini] [--claude] [--codex] [--opencode] [--qwen] [--cursor] [--all]" +argument-hint: "--phase N [--gemini] [--claude] [--codex] [--opencode] [--qwen] [--cursor] [--agy] [--all]" allowed-tools: - Read - Write @@ -33,6 +33,7 @@ Phase number: extracted from $ARGUMENTS (required) - `--opencode` — Include OpenCode review (uses model from user's OpenCode config) - `--qwen` — Include Qwen Code review (Alibaba Qwen models) - `--cursor` — Include Cursor agent review +- `--agy` / `--antigravity` — Include Antigravity CLI review - `--all` — Include all available CLIs diff --git a/docs/COMMANDS.md b/docs/COMMANDS.md index 39596fd71..094687698 100644 --- a/docs/COMMANDS.md +++ b/docs/COMMANDS.md @@ -1201,6 +1201,7 @@ Cross-AI peer review of phase plans from external AI CLIs. | `--opencode` | Include OpenCode review (via GitHub Copilot) | | `--qwen` | Include Qwen Code review (Alibaba Qwen models) | | `--cursor` | Include Cursor agent review | +| `--agy` / `--antigravity` | Include Antigravity CLI review (free with Google credentials) | | `--ollama` | Include Ollama server review | | `--lm-studio` | Include LM Studio server review | | `--llama-cpp` | Include llama.cpp server review | diff --git a/docs/FEATURES.md b/docs/FEATURES.md index 80221e498..9351ae989 100644 --- a/docs/FEATURES.md +++ b/docs/FEATURES.md @@ -1164,9 +1164,9 @@ When verification returns `human_needed`, items are persisted as a trackable HUM ### 42. Cross-AI Peer Review -**Command:** `/gsd-review --phase N [--gemini] [--claude] [--codex] [--coderabbit] [--opencode] [--qwen] [--cursor] [--ollama] [--lm-studio] [--llama-cpp] [--all]` +**Command:** `/gsd-review --phase N [--gemini] [--claude] [--codex] [--coderabbit] [--opencode] [--qwen] [--cursor] [--agy] [--ollama] [--lm-studio] [--llama-cpp] [--all]` -**Purpose:** Invoke external AI CLIs (Gemini, Claude, Codex, CodeRabbit, OpenCode, Qwen Code, Cursor) to independently review phase plans. Produces structured REVIEWS.md with per-reviewer feedback. +**Purpose:** Invoke external AI CLIs (Gemini, Claude, Codex, CodeRabbit, OpenCode, Qwen Code, Cursor, Antigravity) to independently review phase plans. Produces structured REVIEWS.md with per-reviewer feedback. **Requirements:** - REQ-REVIEW-01: System MUST detect available AI CLIs on the system diff --git a/docs/ja-JP/COMMANDS.md b/docs/ja-JP/COMMANDS.md index 8a2a6f74b..07cd1ea93 100644 --- a/docs/ja-JP/COMMANDS.md +++ b/docs/ja-JP/COMMANDS.md @@ -834,6 +834,7 @@ GSDアップデート後にローカルの変更を復元します。 | `--opencode` | OpenCodeレビューを含める(GitHub Copilot経由) | | `--qwen` | Qwen Codeレビューを含める(Alibaba Qwenモデル) | | `--cursor` | Cursorエージェントレビューを含める | +| `--agy` / `--antigravity` | Antigravity CLIレビューを含める(Google認証情報で無料) | | `--all` | 利用可能なすべてのCLIを含める | **生成物:** `{phase}-REVIEWS.md` — `/gsd-plan-phase --reviews` で利用可能 diff --git a/docs/ja-JP/FEATURES.md b/docs/ja-JP/FEATURES.md index 3a36a31e6..2902bc756 100644 --- a/docs/ja-JP/FEATURES.md +++ b/docs/ja-JP/FEATURES.md @@ -1045,9 +1045,9 @@ fix(03-01): correct auth token expiry ### 42. クロス AI ピアレビュー -**コマンド:** `/gsd-review --phase N [--gemini] [--claude] [--codex] [--coderabbit] [--opencode] [--qwen] [--cursor] [--all]` +**コマンド:** `/gsd-review --phase N [--gemini] [--claude] [--codex] [--coderabbit] [--opencode] [--qwen] [--cursor] [--agy] [--all]` -**目的:** 外部の AI CLI(Gemini、Claude、Codex、CodeRabbit、OpenCode、Qwen Code、Cursor)を呼び出して、フェーズプランを独立してレビューします。レビュアーごとのフィードバックを含む構造化された REVIEWS.md を生成します。 +**目的:** 外部の AI CLI(Gemini、Claude、Codex、CodeRabbit、OpenCode、Qwen Code、Cursor、Antigravity)を呼び出して、フェーズプランを独立してレビューします。レビュアーごとのフィードバックを含む構造化された REVIEWS.md を生成します。 **要件:** - REQ-REVIEW-01: システムはシステム上で利用可能な AI CLI を検出しなければならない diff --git a/docs/ko-KR/COMMANDS.md b/docs/ko-KR/COMMANDS.md index 745927aa8..3438a78e7 100644 --- a/docs/ko-KR/COMMANDS.md +++ b/docs/ko-KR/COMMANDS.md @@ -834,6 +834,7 @@ GSD 업데이트 후 로컬 수정사항을 복원합니다. | `--opencode` | OpenCode 리뷰 포함 (GitHub Copilot 경유) | | `--qwen` | Qwen Code 리뷰 포함 (Alibaba Qwen 모델) | | `--cursor` | Cursor 에이전트 리뷰 포함 | +| `--agy` / `--antigravity` | Antigravity CLI 리뷰 포함 (Google 자격증명으로 무료) | | `--all` | 사용 가능한 모든 CLI 포함 | **생성 파일:** `{phase}-REVIEWS.md` — `/gsd-plan-phase --reviews`에서 사용 가능 diff --git a/docs/ko-KR/FEATURES.md b/docs/ko-KR/FEATURES.md index 0617a2648..c393e8982 100644 --- a/docs/ko-KR/FEATURES.md +++ b/docs/ko-KR/FEATURES.md @@ -1045,9 +1045,9 @@ fix(03-01): correct auth token expiry ### 42. Cross-AI Peer Review -**명령어:** `/gsd-review --phase N [--gemini] [--claude] [--codex] [--coderabbit] [--opencode] [--qwen] [--cursor] [--all]` +**명령어:** `/gsd-review --phase N [--gemini] [--claude] [--codex] [--coderabbit] [--opencode] [--qwen] [--cursor] [--agy] [--all]` -**목적:** 외부 AI CLI(Gemini, Claude, Codex, CodeRabbit, OpenCode, Qwen Code, Cursor)를 호출하여 페이즈 계획을 독립적으로 검토합니다. 검토자별 피드백이 담긴 구조화된 REVIEWS.md를 생성합니다. +**목적:** 외부 AI CLI(Gemini, Claude, Codex, CodeRabbit, OpenCode, Qwen Code, Cursor, Antigravity)를 호출하여 페이즈 계획을 독립적으로 검토합니다. 검토자별 피드백이 담긴 구조화된 REVIEWS.md를 생성합니다. **요구사항.** - REQ-REVIEW-01: 시스템에서 사용 가능한 AI CLI를 감지해야 합니다. diff --git a/get-shit-done/bin/lib/review-reviewer-selection.cjs b/get-shit-done/bin/lib/review-reviewer-selection.cjs index 7d8d3225f..5b0fd57a6 100644 --- a/get-shit-done/bin/lib/review-reviewer-selection.cjs +++ b/get-shit-done/bin/lib/review-reviewer-selection.cjs @@ -15,6 +15,7 @@ const KNOWN_REVIEWER_SLUGS = [ 'opencode', 'qwen', 'cursor', + 'antigravity', 'ollama', 'lm_studio', 'llama_cpp', diff --git a/get-shit-done/workflows/help/modes/full.md b/get-shit-done/workflows/help/modes/full.md index f2158bc31..ea540fa09 100644 --- a/get-shit-done/workflows/help/modes/full.md +++ b/get-shit-done/workflows/help/modes/full.md @@ -418,10 +418,10 @@ Usage: `/gsd:ship 4` or `/gsd:ship 4 --draft` --- -**`/gsd:review --phase N [--gemini] [--claude] [--codex] [--coderabbit] [--opencode] [--qwen] [--cursor] [--all]`** +**`/gsd:review --phase N [--gemini] [--claude] [--codex] [--coderabbit] [--opencode] [--qwen] [--cursor] [--agy] [--all]`** Cross-AI peer review — invoke external AI CLIs to independently review phase plans. -- Detects available CLIs (gemini, claude, codex, coderabbit) +- Detects available CLIs (gemini, claude, codex, coderabbit, agy) - Each CLI reviews plans independently with the same structured prompt - CodeRabbit reviews the current git diff (not a prompt) — may take up to 5 minutes - Produces REVIEWS.md with per-reviewer feedback and consensus summary diff --git a/get-shit-done/workflows/review.md b/get-shit-done/workflows/review.md index 286835a9e..44d7ecc26 100644 --- a/get-shit-done/workflows/review.md +++ b/get-shit-done/workflows/review.md @@ -23,6 +23,7 @@ command -v coderabbit >/dev/null 2>&1 && echo "coderabbit:available" || echo "co command -v opencode >/dev/null 2>&1 && echo "opencode:available" || echo "opencode:missing" command -v qwen >/dev/null 2>&1 && echo "qwen:available" || echo "qwen:missing" command -v cursor >/dev/null 2>&1 && echo "cursor:available" || echo "cursor:missing" +command -v agy >/dev/null 2>&1 && echo "antigravity:available" || echo "antigravity:missing" # Check local model servers (OpenAI-compatible HTTP API — no CLI binary required) OLLAMA_HOST=$(gsd_run query config-get review.ollama_host 2>/dev/null | jq -r '.' 2>/dev/null || echo "") @@ -46,6 +47,7 @@ Parse flags from `$ARGUMENTS`: - `--opencode` → include OpenCode - `--qwen` → include Qwen Code - `--cursor` → include Cursor +- `--agy` or `--antigravity` → include Antigravity CLI - `--ollama` → include Ollama (local server, OpenAI-compatible) - `--lm-studio` → include LM Studio (local server, OpenAI-compatible) - `--llama-cpp` → include llama.cpp (local server, OpenAI-compatible) @@ -73,6 +75,7 @@ No external AI CLIs found. Install at least one: - opencode: https://opencode.ai (leverages GitHub Copilot subscription models) - qwen: https://github.com/nicepkg/qwen-code (Alibaba Qwen models) - cursor: https://cursor.com (Cursor IDE agent mode) +- agy: curl -fsSL https://antigravity.google/cli/install.sh | bash (Antigravity CLI — free with Google credentials) Then run /gsd:review again. ``` @@ -218,6 +221,8 @@ GEMINI_MODEL=$(gsd_run query config-get review.models.gemini 2>/dev/null | jq -r CLAUDE_MODEL=$(gsd_run query config-get review.models.claude 2>/dev/null | jq -r '.' 2>/dev/null || true) CODEX_MODEL=$(gsd_run query config-get review.models.codex 2>/dev/null | jq -r '.' 2>/dev/null || true) OPENCODE_MODEL=$(gsd_run query config-get review.models.opencode 2>/dev/null | jq -r '.' 2>/dev/null || true) +# review.models.agy is reserved for future model-pinning support; agy selects its model internally +AGY_MODEL=$(gsd_run query config-get review.models.agy 2>/dev/null | jq -r '.' 2>/dev/null || true) ``` For each selected CLI, invoke in sequence (not parallel — avoid rate limits): @@ -285,6 +290,103 @@ if [ ! -s /tmp/gsd-review-cursor-{phase}.md ]; then fi ``` +**Antigravity CLI:** + +**Maintainer note — why this block has three layers (last updated against agy 1.0.2):** + +`agy -p` (the `--print` non-interactive flag) works correctly on macOS and Linux: it sends the +prompt, receives the model response, and writes it to stdout. On **native Windows** it silently +produces no stdout output despite the API call succeeding — a bug in `text_drip.go`'s non-TTY +flush path, tracked at https://github.com/google-antigravity/antigravity-cli/issues/27466 and +still open as of agy 1.0.2. + +Regardless of platform, `agy` always persists the full exchange to a transcript file on disk. +The transcript fallback (Step 2 below) reads that file directly, giving Windows users full review +coverage without any extra tooling. This pattern was first documented by the community MCP bridge +at https://github.com/SinanTufekci/Claude-Code-Antigravity-CLI-MCP-Server — we inline the same +logic here in pure bash/jq so no additional dependency is required. + +**Stale-response guard (why the pre-flight watermark matters):** +Without a watermark, the fallback would read the last `PLANNER_RESPONSE` entry in the transcript +regardless of when it was written — including entries from a previous invocation in the same +workspace. To prevent that, we record the transcript's line count *before* calling `agy -p`. In +the fallback, we only read lines appended after that count. If no new lines were written (agy +failed before producing a response), `_AGY_RESULT` is empty and Step 3 fires — never stale. If +the conv-id changed (agy started a fresh session), all lines in the new file are new and we use +skip=0. + +**If the upstream stdout bug is fixed** (check the issue above): Step 2 silently becomes +unreachable; stdout is non-empty and Step 1 handles it. No code change needed. + +**If the transcript paths change** in a future `agy` release: Step 2 silently becomes a no-op +and Step 3 fires with a clear error message in REVIEWS.md. No silent corruption. To debug: +- `~/.gemini/antigravity-cli/cache/last_conversations.json` — workspace → conv-id map +- `~/.gemini/antigravity-cli/brain//.system_generated/logs/transcript.jsonl` + Filter: `source=="MODEL"`, `status=="DONE"`, `type=="PLANNER_RESPONSE"`, take the last match's `content` field. + +Invocation specifics (verified agy 1.0.0, macOS arm64 and Linux amd64): +- `-p` takes the prompt as a **flag value** — `echo X | agy -p` errors with "flag needs an argument: -p" +- `--print-timeout` defaults to 5m, aligning with this workflow's global timeout +- No `-m` / `--model` flag — agy selects the model internally + +```bash +# Pre-flight: snapshot the transcript watermark before invoking agy. +# Must run BEFORE agy -p — this is what prevents the fallback from reading a stale prior response. +_AGY_WS=$(git rev-parse --show-toplevel 2>/dev/null || pwd) +_AGY_CACHE="$HOME/.gemini/antigravity-cli/cache/last_conversations.json" +_AGY_MARK_CONV="" +_AGY_MARK_LINES=0 +if [ -f "$_AGY_CACHE" ]; then + _AGY_MARK_CONV=$(jq -r --arg ws "$_AGY_WS" ' + .[$ws] // + (to_entries + | map(select(.key | ascii_downcase == ($ws | ascii_downcase))) + | first | .value) // + empty + ' "$_AGY_CACHE" 2>/dev/null) + if [ -n "$_AGY_MARK_CONV" ] && [ "$_AGY_MARK_CONV" != "null" ]; then + _AGY_MARK_TX="$HOME/.gemini/antigravity-cli/brain/${_AGY_MARK_CONV}/.system_generated/logs/transcript.jsonl" + [ -f "$_AGY_MARK_TX" ] && _AGY_MARK_LINES=$(wc -l < "$_AGY_MARK_TX" | tr -d ' ') + fi +fi + +# Step 1 — primary invocation: stdout works on macOS, Linux, and WSL +agy -p "$(cat /tmp/gsd-review-prompt-{phase}.md)" 2>/dev/null > /tmp/gsd-review-antigravity-{phase}.md + +# Step 2 — transcript fallback: catches Windows agy -p stdout bug (and any future stdout-silent edge cases). +# Reads only lines appended AFTER the pre-flight watermark. If agy failed before writing a new response, +# _AGY_RESULT is empty and Step 3 fires — no stale content can leak through. +# Undocumented paths, verified agy 1.0.0–1.0.2. See maintainer note above if these break. +if [ ! -s /tmp/gsd-review-antigravity-{phase}.md ]; then + if [ -f "$_AGY_CACHE" ]; then + _AGY_CONV=$(jq -r --arg ws "$_AGY_WS" ' + .[$ws] // + (to_entries + | map(select(.key | ascii_downcase == ($ws | ascii_downcase))) + | first | .value) // + empty + ' "$_AGY_CACHE" 2>/dev/null) + if [ -n "$_AGY_CONV" ] && [ "$_AGY_CONV" != "null" ]; then + _AGY_TX="$HOME/.gemini/antigravity-cli/brain/${_AGY_CONV}/.system_generated/logs/transcript.jsonl" + if [ -f "$_AGY_TX" ]; then + # If conv-id changed, agy started a new session — all lines are new, skip 0. + # If same conv-id, only read lines beyond the watermark. + [ "$_AGY_CONV" = "$_AGY_MARK_CONV" ] && _AGY_SKIP=$_AGY_MARK_LINES || _AGY_SKIP=0 + _AGY_RESULT=$(tail -n +"$((_AGY_SKIP + 1))" "$_AGY_TX" 2>/dev/null | \ + jq -r 'select(.source=="MODEL" and .status=="DONE" and .type=="PLANNER_RESPONSE") | .content' \ + 2>/dev/null | tail -1) + [ -n "$_AGY_RESULT" ] && echo "$_AGY_RESULT" > /tmp/gsd-review-antigravity-{phase}.md + fi + fi + fi +fi + +# Step 3 — final guard: both approaches yielded nothing (auth error, first-run setup, path schema changed, etc.) +if [ ! -s /tmp/gsd-review-antigravity-{phase}.md ]; then + echo "Antigravity review failed or returned empty output." > /tmp/gsd-review-antigravity-{phase}.md +fi +``` + **Ollama (local, OpenAI-compatible):** Read host and model from config. All three local backends share the same `/v1/chat/completions` endpoint — only host and model differ. Use `jq --rawfile` to safely encode the multi-line prompt as JSON without shell-escaping issues. @@ -493,7 +595,7 @@ After all reviewers complete, collect trim metadata files written during the run ```markdown --- phase: {N} -reviewers: [gemini, claude, codex, coderabbit, opencode, qwen, cursor, ollama, lm_studio, llama_cpp] # populate at runtime with only the reviewers actually invoked +reviewers: [gemini, claude, codex, coderabbit, opencode, qwen, cursor, antigravity, ollama, lm_studio, llama_cpp] # populate at runtime with only the reviewers actually invoked reviewed_at: {ISO timestamp} plans_reviewed: [{list of PLAN.md files}] trimmed_reviewers: # only present if at least one reviewer was trimmed @@ -552,6 +654,12 @@ trimmed_reviewers: # only present if at least one reviewer was trimmed --- +## Antigravity Review + +{antigravity review content} + +--- + ## Ollama Review {ollama review content}