Skip to content

fix(antigravity): bootstrap Superpowers via native plugin rules - #2350

Open
aimansour wants to merge 10 commits into
obra:devfrom
aimansour:feat/antigravity-bootstrap
Open

aimansour wants to merge 10 commits into
obra:devfrom
aimansour:feat/antigravity-bootstrap

Conversation

@aimansour

@aimansour aimansour commented Sep 20, 2026 •

Copy link
Copy Markdown

Pull request

Target branch: dev. The human partner reviewed the complete proposed diff and approved submission.

Who is submitting this PR?

Field Value
Your model + version Codex, GPT-5 family (exact variant not exposed to this agent)
Harness + version Codex desktop app on Windows; bundled codex-cli 0.155.0-alpha.9.2 (desktop UI version not exposed)
All plugins installed Superpowers 6.4.1; Codex app tools (bundled)
Human partner who reviewed this diff @aimansour

What problem are you trying to solve?

With Antigravity CLI (agy 1.2.7), Superpowers' Claude-shaped hooks/hooks.json is rejected with invalid hook "hooks": command hook must specify 'command'. The plugin's skills are installed, but the using-superpowers bootstrap does not reach the model at session start. Fixes #2247. Antigravity 2.0 and the standalone IDE also had no native Superpowers bootstrap. In an initial 2.0 no-tool probe, an always-on rule's own marker was visible but its @-referenced bootstrap and tool-map markers were both MISSING.

What does this PR change?

Adds a native Antigravity plugin.json and a generated always-on rules/superpowers.md containing the canonical using-superpowers bootstrap and harness tool mapping inline. Documents local CLI installation and workspace/global plugin directories for Antigravity 2.0 and IDE, and prevents Antigravity-only files from entering the Codex plugin sync. Static tests validate the package and generated rule even when agy is absent; the live install portion runs when available.

Is this change appropriate for the core library?

Yes. This is harness infrastructure for Superpowers' existing general-purpose skills, with no new dependency, domain skill, or user-global configuration edit. It fixes the existing Antigravity integration's missing bootstrap and uses Google's native plugin mechanism on all three surfaces.

What alternatives did you consider?

  • Reusing the Claude SessionStart hook: current agy rejects the hook schema; Antigravity does not expose that event in the plugin hook configuration.
  • PreInvocation bootstrap: it fires at invocation time and needs a separate Antigravity hook and injection shape. The native always-on plugin rule reaches the model from the first message and also works in 2.0 and IDE.
  • Relative @ references inside the rule: a no-tool 2.0 probe showed the referenced content did not enter context. The generated inline rule passed the same probe in 2.0 and IDE.
  • Editing the user's global AGENTS.md: rejected because it is outside the plugin install and would modify unrelated user configuration.

Does this PR contain multiple unrelated changes?

No. The manifest, generated rule, mapping, documentation, tests, and Codex sync exclusions all serve this one Antigravity bootstrap fix. The IDE limitation on subagent delegation is documented rather than hidden.

Existing PRs

Environment tested

Harness Harness version Model Model version/ID
Antigravity CLI (agy) 1.2.7 Google model Not exposed by JSONL session log
Antigravity CLI (agy) 1.2.12 Google model Not exposed; print-mode session (isolated profile): install byte-identical, rule probe quotes injected content, empty-profile control negative, acceptance prompt auto-triggers brainstorming
Antigravity 2.0 2.15.0 Gemini Gemini 3.8 Flash (High)
Antigravity IDE 2.5.5 Gemini Gemini 3.8 Flash (High)

New harness support

All three clean-session transcripts for the exact prompt are included below. The first CLI and 2.0/IDE tool call reads brainstorming/SKILL.md; each session creates a task artifact and asks about scope before any application code is written. The CLI JSONL stream records the tool call and result state for the file read but not the full contents of that tool result. In the tested IDE, no general invoke_subagent tool was available; subagent-dependent skills remain limited there.

Clean-session transcripts for "Let's make a react todo list"

Clean-session acceptance transcripts

These are the complete user-visible first-turn records: prompt, tool calls and results, and final response. System messages, internal reasoning, and repeated streaming deltas are omitted. No application code was written in any session.

Antigravity CLI 1.2.7

User: Let's make a react todo list

Tool call 2: view_file

{
  "name": "view_file",
  "parameters": {
    "AbsolutePath": "[test-profile]\\.gemini\\config\\plugins\\superpowers\\skills\\brainstorming\\SKILL.md"
  },
  "output": "286 lines, 17548 bytes"
}

Tool call 4: run_command

{
  "name": "run_command",
  "parameters": {
    "CommandLine": "Get-ChildItem -Force"
  }
}

Tool call 6: run_command

{
  "name": "run_command",
  "parameters": {
    "CommandLine": "node -v; npm -v; git --version"
  },
  "output": "v24.16.0\r\n11.17.0\ngit version 2.54.0.windows.1\n"
}

Tool call 8: write_to_file

{
  "name": "write_to_file",
  "parameters": {
    "TargetFile": "[test-profile]\\.gemini\\antigravity-cli\\brain\\[session-id]\\task.md"
  }
}

Tool call 12: replace_file_content

{
  "name": "replace_file_content",
  "parameters": {
    "TargetFile": "[test-profile]\\.gemini\\antigravity-cli\\brain\\[session-id]\\task.md"
  }
}

Assistant:

Using **superpowers:brainstorming** to design the React todo list.

Since we are creating a new project from scratch with no existing code, this task is **architectural**. We'll clarify requirements, explore approaches, design the architecture and components in sections, create a design spec, and then proceed to implementation planning.

Let's start by clarifying the primary intent and scope.
### Understanding the Brief

Based on the prompt, here is the summarized intent and scope for this project:

- **Intended Outcome**: A clean, modern, and responsive React todo list application.
- **Core Features**:
  - Add new tasks with input validation (prevent empty or whitespace-only items).
  - Toggle completion status.
  - Inline editing of task text with keyboard support (`Enter` to save, `Escape` to cancel).
  - Delete individual tasks and "Clear completed" bulk action.
  - Status filters (`All`, `Active`, `Completed`) with live counter of remaining items.
  - Persistence across browser reloads using `localStorage`.
- **Assumptions**:
  - Single-page client-side application running locally.
  - Project will be scaffolded in a dedicated subdirectory (`react-todo-app`) under `scratch/`.

---

### Architectural Approaches

Here are 3 approaches for structuring the application:

#### Approach 1: Vite + React + TypeScript + Tailwind CSS *(Recommended)*
- **Architecture**:
  - Scalable component hierarchy: `TodoApp`, `TodoInput`, `TodoList`, `TodoItem`, `TodoFilters`, and `TodoStats`.
  - State managed via a dedicated `useTodos` custom hook with `useReducer` and `localStorage` synchronization.
  - Full TypeScript type definitions for task models, action types, and filter modes.
- **Styling**: Tailwind CSS for a polished, responsive, accessible UI with smooth transitions and theme support.
- **Pros**: Strong type safety, clean separation of UI and business logic, industry-standard modern tooling, easy to extend.
- **Trade-offs**: Includes Tailwind dependency.

#### Approach 2: Vite + React + TypeScript + Scoped CSS Modules
- **Architecture**:
  - Same component hierarchy and `useTodos` hook with TypeScript.
  - Custom CSS Modules (`TodoApp.module.css`, `TodoItem.module.css`, etc.) with CSS variables for color scheme.
- **Pros**: Zero third-party CSS utility libraries, standard vanilla CSS.
- **Trade-offs**: More manual CSS code needed for focus rings, hover states, and responsive spacing.

#### Approach 3: Minimal Single-Component React + Plain CSS
- **Architecture**:
  - Everything contained in a single or minimal component structure with standard `useState`.
- **Pros**: Fewest files, fastest to read in one glance.
- **Trade-offs**: Harder to unit-test components in isolation and maintain if features grow.

---

**Recommendation**: **Approach 1 (Vite + React + TypeScript + Tailwind CSS)** offers the best balance of clean code architecture, type safety, testability, and a modern user interface.

Does **Approach 1** work for you, or would you prefer Approach 2 or 3?

Antigravity 2.0 2.15.0

User: Let's make a react todo list

Tool call 1: view_file

{
  "AbsolutePath": "\"[workspace]\\\\.agents\\\\plugins\\\\superpowers\\\\skills\\\\brainstorming\\\\SKILL.md\"",
  "toolAction": "\"Viewing brainstorming skill\"",
  "toolSummary": "\"View brainstorming SKILL.md\""
}

Tool output 2:

Created At: 2026-09-20T11:08:09+03:00
Completed At: 2026-09-20T11:08:09+03:00
File Path: `[workspace]/.agents/plugins/superpowers/skills/brainstorming/SKILL.md`
Total Lines: 286
Total Bytes: 17548
Showing lines 1 to 286
The following code has been modified to include a line number before every line, in the format: <line_number>: <original_line>. Please note that any changes targeting the original code should remove the line number, colon, and leading space.
1: ---
2: name: brainstorming
3: description: "You MUST use this before any creative work - creating features, building components, adding functionality, or modifying behavior. Explores user intent, requirements and design before implementation."
4: ---
5: 
6: # Brainstorming Ideas Into Designs
7: 
8: Help turn ideas into fully formed designs and specs through natural collaborative dialogue.
9: 
10: Start by classifying how much process the request needs, then work
11: through your path: understand the context, refine the idea, present a
12: design, and get your human partner's approval.
13: 
14: ## Establish Shared Understanding
15: 
16: The outcome of brainstorming is an understanding your human partner can
17: recognize and correct, grounded in what they want to accomplish.
18: 
19: 1. **Discover intent.** Use the request and available context to identify
20:    the intended outcome, who it is for, and what success looks like. When
21:    that information is missing, ask one focused question about purpose or
22:    intended use before proposing features or an approach. Knowing the app
23:    genre does not tell you why your partner wants it. Gathering missing
24:    requirements does not ask them to authorize the task again.
25: 2. **Write back your understanding.** Summarize the intended outcome,
26:    relevant constraints, and success criteria in a short note your partner
27:    can assess. Separate what they said from assumptions. Invite correction
28:    and incorporate their ans
<truncated 15393 bytes>
ons during brainstorming. Available as a tool — not a mode. Accepting the companion means it's available for questions that benefit from visual treatment; it does NOT mean every question goes through the browser.
271: 
272: **Offering the companion (just-in-time):** Do NOT offer it upfront. Wait until a question would genuinely be clearer shown than told — a real mockup / layout / diagram question, not merely a UI *topic*. The first time that happens, offer it then, as its own message:
273: > "This next part might be easier if I show you — I can put together mockups, diagrams, and comparisons in a browser tab as we go. It's still new and can be token-intensive. Want me to? I'll open it for you."
274: 
275: **This offer MUST be its own message.** Only the offer — no clarifying question, summary, or other content. Wait for the user's response. If they accept, start the server with `--open` so their browser opens to the first screen automatically. If they decline, continue text-only and don't offer again unless they raise it.
276: 
277: **Per-question decision:** Even after the user accepts, decide FOR EACH QUESTION whether to use the browser or the terminal. The test: **would the user understand this better by seeing it than reading it?**
278: 
279: - **Use the browser** for content that IS visual — mockups, wireframes, layout comparisons, architecture diagrams, side-by-side visual designs
280: - **Use the terminal** for content that is text — requirements questions, conceptual choices, tradeoff lists, A/B/C/D text options, scope decisions
281: 
282: A question about a UI topic is not automatically a visual question. "What does personality mean in this context?" is a conceptual question — use the terminal. "Which wizard layout works better?" is a visual question — use the browser.
283: 
284: If they agree to the companion, read the detailed guide before proceeding:
285: `skills/brainstorming/visual-companion.md`
286: 
The above content shows the entire, complete file contents of the requested file.

Tool call 3: write_to_file

{
  "ArtifactMetadata": "{\"RequestFeedback\":false,\"Summary\":\"Task tracking checklist for brainstorming and designing a React todo list.\",\"UserFacing\":true}",
  "CodeContent": "\"# Tasks: React Todo List Design\\n\\n- [ ] Explore project context\\n- [ ] Ask clarifying questions (purpose, constraints, features)\\n- [ ] Propose 2-3 approaches with trade-offs\\n- [ ] Present design in sections and get user feedback\\n- [ ] Write design doc\\n- [ ] Spec self-review\\n- [ ] User reviews written spec\\n- [ ] Transition to implementation (invoke writing-plans)\\n\"",
  "Description": "\"Create task tracking checklist for brainstorming phase\"",
  "Overwrite": "true",
  "TargetFile": "\"[conversation-artifacts]\\\\task.md\"",
  "toolAction": "\"Creating task tracking checklist\"",
  "toolSummary": "\"Create task.md artifact\""
}

Tool output 4:

Created At: 2026-09-20T11:08:13+03:00
Completed At: 2026-09-20T11:08:14+03:00
Created file [conversation-artifacts]/task.md with requested content.
If relevant, proactively run terminal commands to execute this code for the USER. Don't ask for permission.

Tool call 5: list_dir

{
  "DirectoryPath": "\"[workspace]\"",
  "toolAction": "\"Listing workspace directory\"",
  "toolSummary": "\"List directory contents\""
}

Tool output 6:

Created At: 2026-09-20T11:08:17+03:00
Completed At: 2026-09-20T11:08:17+03:00
{"name":".agents", "isDir":true}

Summary: This directory contains 1 subdirectories and 0 files.

Tool call 7: run_command

{
  "CommandLine": "\"git status\"",
  "Cwd": "\"[workspace]\"",
  "IsDaemon": "false",
  "WaitMsBeforeAsync": "5000",
  "toolAction": "\"Checking git status\"",
  "toolSummary": "\"Check git status\""
}

Tool output 8:

Created At: 2026-09-20T11:08:18+03:00
Tool is running as a background task with task id: [session-id]/task-8
Task Description: git status
Task logs are available at: [conversation-artifacts]/.system_generated/tasks/task-8.log
YOU MUST TAKE ONE OF THE FOLLOWING TWO ACTIONS: A) either proceed to other relevant work (if any) or, B) simply update the user with a short message (that you have launched the command and will wait for it to finish) and end the turn.
 DO NOTHING ELSE.

Tool call 9: manage_task

{
  "Action": "\"status\"",
  "TaskId": "\"[session-id]/task-8\"",
  "toolAction": "\"Checking command status\"",
  "toolSummary": "\"Check task status\""
}

Assistant:

I have initiated the project context check and am waiting for the command to finish.

Tool output 10:

Created At: 2026-09-20T11:08:26+03:00
Completed At: 2026-09-20T11:08:26+03:00
Task: [session-id]/task-8
Status: DONE
Log: [conversation-artifacts]\.system_generated\tasks\task-8.log
Log output:
fatal: not a git repository (or any of the parent directories): .git

Last progress: 1s ago

Tool call 12: replace_file_content

{
  "AllowMultiple": "false",
  "Description": "\"Mark explore project context as completed\"",
  "EndLine": "4",
  "Instruction": "\"Mark Explore project context as done\"",
  "ReplacementContent": "\"- [x] Explore project context\"",
  "StartLine": "3",
  "TargetContent": "\"- [ ] Explore project context\"",
  "TargetFile": "\"[conversation-artifacts]\\\\task.md\"",
  "toolAction": "\"Updating task checklist\"",
  "toolSummary": "\"Update task.md\""
}

Tool output 13:

Created At: 2026-09-20T11:08:28+03:00
Completed At: 2026-09-20T11:08:28+03:00
The following changes were made by the replace_file_content tool to: [conversation-artifacts]\task.md. If relevant, proactively run terminal commands to execute this code for the USER. Don't ask for permission.
[diff_block_start]
@@ -1,6 +1,6 @@
 # Tasks: React Todo List Design
 
-- [ ] Explore project context
+- [x] Explore project context
 - [ ] Ask clarifying questions (purpose, constraints, features)
 - [ ] Propose 2-3 approaches with trade-offs
 - [ ] Present design in sections and get user feedback
[diff_block_end]

Please note that the above snippet only shows the MODIFIED lines from the last change. It shows up to 3 lines of unchanged lines before and after the modified lines. The actual file contents may have many more lines not shown.

Assistant:

Using **brainstorming** to explore requirements and design for the React todo list.

This is a new project starting from an empty workspace, so this looks **architectural**. I'll follow the full process: clarifying questions, exploring approaches, presenting the design in sections, writing a spec, and then moving to implementation planning.

---

To start, what is the primary purpose and scope of this React todo list?

1. **Clean & Minimal Demo / Practice App** – A lightweight Vite + React application focusing on core CRUD (add, toggle, delete) and clean component architecture (optionally with local storage persistence).
2. **Feature-Rich Personal Task Tracker** – Includes priorities, due dates, categories/tags, filtering/sorting, and persistent local storage.
3. **Full-Stack / Extensible Base** – Designed as a foundation for a larger app with state management, API/backend integration capabilities, or authentication.

Antigravity IDE 2.5.5

User: Let's make a react todo list

Tool call 3: view_file

{
  "AbsolutePath": "\"[workspace]\\\\.agents\\\\plugins\\\\superpowers\\\\skills\\\\brainstorming\\\\SKILL.md\"",
  "toolAction": "\"Viewing file\"",
  "toolSummary": "\"View brainstorming skill file\""
}

Tool output 4:

Created At: 2026-09-20T07:53:57+03:00
Completed At: 2026-09-20T07:53:57+03:00
File Path: `[workspace]/.agents/plugins/superpowers/skills/brainstorming/SKILL.md`
Total Lines: 286
Total Bytes: 17548
Showing lines 1 to 286
The following code has been modified to include a line number before every line, in the format: <line_number>: <original_line>. Please note that any changes targeting the original code should remove the line number, colon, and leading space.
1: ---
2: name: brainstorming
3: description: "You MUST use this before any creative work - creating features, building components, adding functionality, or modifying behavior. Explores user intent, requirements and design before implementation."
4: ---
5: 
6: # Brainstorming Ideas Into Designs
7: 
8: Help turn ideas into fully formed designs and specs through natural collaborative dialogue.
9: 
10: Start by classifying how much process the request needs, then work
11: through your path: understand the context, refine the idea, present a
12: design, and get your human partner's approval.
13: 
14: ## Establish Shared Understanding
15: 
16: The outcome of brainstorming is an understanding your human partner can
17: recognize and correct, grounded in what they want to accomplish.
18: 
19: 1. **Discover intent.** Use the request and available context to identify
20:    the intended outcome, who it is for, and what success looks like. When
21:    that information is missing, ask one focused question about purpose or
22:    intended use before proposing features or an approach. Knowing the app
23:    genre does not tell you why your partner wants it. Gathering missing
24:    requirements does not ask them to authorize the task again.
25: 2. **Write back your understanding.** Summarize the intended outcome,
26:    relevant constraints, and success criteria in a short note your partner
27:    can assess. Separate what they said from assumptions. Invite correction
28:    and incorporate their ans
<truncated 15393 bytes>
ons during brainstorming. Available as a tool — not a mode. Accepting the companion means it's available for questions that benefit from visual treatment; it does NOT mean every question goes through the browser.
271: 
272: **Offering the companion (just-in-time):** Do NOT offer it upfront. Wait until a question would genuinely be clearer shown than told — a real mockup / layout / diagram question, not merely a UI *topic*. The first time that happens, offer it then, as its own message:
273: > "This next part might be easier if I show you — I can put together mockups, diagrams, and comparisons in a browser tab as we go. It's still new and can be token-intensive. Want me to? I'll open it for you."
274: 
275: **This offer MUST be its own message.** Only the offer — no clarifying question, summary, or other content. Wait for the user's response. If they accept, start the server with `--open` so their browser opens to the first screen automatically. If they decline, continue text-only and don't offer again unless they raise it.
276: 
277: **Per-question decision:** Even after the user accepts, decide FOR EACH QUESTION whether to use the browser or the terminal. The test: **would the user understand this better by seeing it than reading it?**
278: 
279: - **Use the browser** for content that IS visual — mockups, wireframes, layout comparisons, architecture diagrams, side-by-side visual designs
280: - **Use the terminal** for content that is text — requirements questions, conceptual choices, tradeoff lists, A/B/C/D text options, scope decisions
281: 
282: A question about a UI topic is not automatically a visual question. "What does personality mean in this context?" is a conceptual question — use the terminal. "Which wizard layout works better?" is a visual question — use the browser.
283: 
284: If they agree to the companion, read the detailed guide before proceeding:
285: `skills/brainstorming/visual-companion.md`
286: 
The above content shows the entire, complete file contents of the requested file.

Tool call 6: list_dir

{
  "DirectoryPath": "\"[workspace]\"",
  "toolAction": "\"Analyzing directory\"",
  "toolSummary": "\"List workspace directory\""
}

Tool output 7:

Created At: 2026-09-20T07:54:01+03:00
Completed At: 2026-09-20T07:54:01+03:00
{"name":".agents","isDir":true}

Summary: This directory contains 1 subdirectories and 0 files.

Tool call 8: run_command

{
  "CommandLine": "\"git status\"",
  "Cwd": "\"[workspace]\"",
  "WaitMsBeforeAsync": "5000",
  "toolAction": "\"Running command\"",
  "toolSummary": "\"Check git status\""
}

Tool output 9:

Created At: 2026-09-20T07:54:07+03:00
Tool is running as a background task with task id: [session-id]/task-9
Task Description: git status
Task logs are available at: [conversation-artifacts]/.system_generated/tasks/task-9.log
YOU MUST TAKE ONE OF THE FOLLOWING TWO ACTIONS: A) either proceed to other relevant work (if any) or, B) simply update the user with a short message (that you have launched the command and will wait for it to finish) and end the turn.
 DO NOTHING ELSE.

Tool call 10: write_to_file

{
  "ArtifactMetadata": "{\"RequestFeedback\":false,\"Summary\":\"Task checklist for brainstorming a React Todo List application.\",\"UserFacing\":true}",
  "CodeContent": "\"# Brainstorming: React Todo List\\n\\n- [x] Explore project context\\n- [ ] Ask clarifying questions (one at a time)\\n- [ ] Propose 2-3 approaches\\n- [ ] Present design sections and get approval\\n- [ ] Write design doc to `docs/superpowers/specs/YYYY-MM-DD-react-todo-list-design.md`\\n- [ ] Spec self-review\\n- [ ] User reviews written spec\\n- [ ] Transition to implementation (writing-plans skill)\\n\"",
  "Description": "\"Initialize task checklist for brainstorming React Todo List\"",
  "Overwrite": "true",
  "TargetFile": "\"[conversation-artifacts]\\\\task.md\"",
  "toolAction": "\"Editing file\"",
  "toolSummary": "\"Create task checklist artifact\""
}

Tool output 11:

Created At: 2026-09-20T07:54:15+03:00
Completed At: 2026-09-20T07:54:15+03:00
Created file [conversation-artifacts]/task.md with requested content.
If relevant, proactively run terminal commands to execute this code for the USER. Don't ask for permission.

Tool call 13: ask_question

{
  "questions": "[{\"is_multi_select\":false,\"options\":[\"(Recommended) A modern, polished personal productivity app with categories, priorities, due dates, and localStorage persistence\",\"A clean, lightweight todo list focusing on core basics (add, toggle, delete, filtering)\",\"An advanced task management tool with drag-and-drop reordering, subtasks, search, and theme switching\"],\"question\":\"What is the primary purpose and scope you'd like for this React todo list?\"}]",
  "toolAction": "\"Clarifying scope\"",
  "toolSummary": "\"Todo list purpose and scope\""
}

Assistant:

Using **brainstorming** to design and plan the React todo list.

This project is **Architectural** since we are building a new application from scratch. I will follow the architectural design path: clarifying intent and requirements, exploring technical approaches, presenting sectioned designs, drafting the design specification, and transitioning to implementation planning.

Evaluation

  • Initial task, paraphrased: investigate the reported Antigravity bootstrap failure and test the native plugin mechanism.
  • Baseline: agy rejected the Claude hook; in 2.0 an always-on rule's inline marker was present but the two @-referenced markers were MISSING without file-read tools.
  • After change: two no-tool inline-marker sessions (2.0 and IDE) returned all three markers correctly with zero tool calls. Three clean-session acceptance runs (CLI, 2.0, IDE) auto-triggered brainstorming before code. An additional IDE delegation probe reported no general subagent tool and made zero tool calls.
  • Total post-change live sessions: six (two marker probes, three acceptance runs, one IDE subagent probe).
  • Re-verified 2026-09-27 on agy 1.2.12 (fresh official binary, isolated profile): plugin validate ok (skills: 15 processed); plugin install preserves rules/superpowers.md byte-for-byte; a rule probe quotes the injected always-on content while an empty-profile control answers NO_RULE_LOADED; the exact acceptance prompt auto-triggers brainstorming with no code written. plugin list reports components: ["skills"] with no rules line in validate output — the manifest declares no component paths and a trial "rules" field is silently ignored — yet the agent loads rules/ at runtime, which matches the documented plugin layout (skills, agents, rules, MCP servers, hooks).
  • Automated verification: bash tests/antigravity/run-tests.sh, bash tests/codex-plugin-sync/test-sync-to-codex-plugin.sh, bash scripts/lint-shell.sh on the three Antigravity shell scripts, bash -n, and git diff --check origin/dev...HEAD passed. Live agy plugin install with agy 1.2.7 confirmed that the plugin rule and skills install correctly.

Rigor

  • Used superpowers:writing-skills for the harness mapping change and ran a failing no-tool baseline before inlining.
  • Tested the first-turn injection under a no-file-read constraint on 2.0 and IDE, then ran clean-session acceptance on CLI, 2.0, and IDE.
  • Did not alter the carefully tuned using-superpowers/SKILL.md or any Red Flags, rationalization, or human-partner wording.

Human review

  • A human has reviewed the COMPLETE proposed diff before submission.

@obra obra added the skill:using-superpowers The using-superpowers skill label Sep 20, 2026
@Enough1122

Copy link
Copy Markdown

AI code review — automated review for reference; please use your judgment.

plugin.json declares no components, so the whole fix rests on undocumented auto-discovery — and this repo's own report says older agy did not do it.

plugin.json:1-5 is the only manifest here with no component path. Compare .codex-plugin/plugin.json ("skills", "hooks"), .cursor-plugin/plugin.json ("skills", "hooks"), .muse-plugin/plugin.json ("skills", "commands", "hooks", "mcpServers"). Here neither rules/ nor skills/ is declared.

That is exactly the failure docs/porting-to-a-new-harness.md:687-693 now warns about — "a plugin installer may silently strip undeclared files … a context file the manifest doesn't declare just vanishes from the install" — and #2247 has direct evidence: on agy 1.1.24 a plugin shipping rules/ had the files copied, but agy plugin list reported "components": null.

Your live runs on 1.2.7 show auto-discovery works there, so this is likely right for current versions. But README.md:103 now asserts unconditionally that "all three surfaces load the plugin's always-on rule", with no version floor. A user on agy 1.1.x gets skills on disk and no bootstrap — the failure this PR fixes. If the schema has a rules field, declare it; otherwise state the verified minimum in the README.

Worth knowing: tests/antigravity/test-plugin-install.sh:62-65 exits 0 when agy is absent, so every assertion below that line — including the cmp proving the installer preserved the rule byte-for-byte — never runs in CI. That path is reachable only with AGY_BIN set.

Minor: the generator truncates the committed artifact before confirming its inputs are readable. scripts/generate-antigravity-rule.sh:24 opens > "$OUTPUT" before the two cats, so a missing or renamed source makes set -e abort mid-write and leave rules/superpowers.md truncated — header plus SKILL.md, tool mapping gone. I reproduced this: 5393 → 3541 bytes, git status shows M rules/superpowers.md. Line 6 also doesn't mkdir -p the output directory, so a custom argument into a new directory fails outright. Write to a temp file and mv on success.

Two nits: plugin.json:2's $schema URL returns 404 (https://antigravity.google/ itself serves 200), and test-plugin-install.sh:50 cites a "documented size limit" that is documented nowhere in the tree — git grep finds 12000 only in that assertion.

Address review on obra#2350: validate bootstrap sources before truncating
output, write via temp file + mv, mkdir -p custom output dirs, keep
/dev/stdout path for test cmp. State verified agy 1.2.7+ floor in README
(1.1.x reported components null) and correct the size-guard message.
Drop the 1.1.x components-null claim and upgrade directive: no agy is
available in this environment to reproduce it live. The verified-versions
sentence stands on this PR's own Environment tested table (agy 1.2.7,
2.0 2.15.0, IDE 2.5.5).
Deduplicate the rule body into one render_rule function so the /dev/stdout
and atomic file paths cannot drift. README verified-versions line now includes
agy 1.2.12, confirmed live: plugin install preserves the rule byte-for-byte,
the rule loads at session start (probe + empty-profile control), and the exact
acceptance prompt auto-triggers brainstorming.
@aimansour

Copy link
Copy Markdown
Author

@Enough1122 Thanks for the review — verified each point live on agy 1.2.12 (fresh official binary, isolated profile) rather than taking it on trust. Results:

Accepted and fixed:

  • Generator truncation: reproduced (a missing source left the committed artifact truncated). Now validates both sources before touching output, writes via temp file + mv, and mkdir -ps custom output dirs. Regen is byte-identical. (scripts/generate-antigravity-rule.sh)
  • Size message: no longer claims a "documented" limit; it's a size guard with an explaining comment. (tests/antigravity/test-plugin-install.sh)

Checked live, declines to change:

  • components observation confirmed: plugin list reports ["skills"] only and validate shows no rules line on 1.2.12 too. But the inference doesn't hold at runtime: a session probe quotes the injected always-on rule content, an empty-profile control answers NO_RULE_LOADED, and the exact acceptance prompt auto-triggers brainstorming with no code written. The installer preserves rules/superpowers.md byte-for-byte, and rules/ is a documented plugin directory, so runtime auto-discovery is the mechanism — and it works.
  • Declaring a rules field: tried "rules": "./rules/" in a scratch copy — validate, install, and list output are unchanged (silently ignored). There is no such declaration mechanism, so there is nothing to declare.
  • Version floor: since the current version behaves identically to 1.1.x regarding components yet loads the rule fine, a floor wouldn't address the observation. README now states only live-verified versions (CLI 1.2.7 + 1.2.12, 2.0 2.15.0, IDE 2.5.5) instead of the previous unconditional claim.

The agy-absent early exit in the live-install section is intentional (header documents it); the packaging assertions above it run everywhere.

@Enough1122

Copy link
Copy Markdown

AI code review — automated follow-up for reference; not a maintainer.

Re-verified at 353e662b. Both accepted points are fixed, and the components rebuttal rests on a live probe rather than on the inference I gave you — that changes my answer on that point.

The truncation fix is complete in the order that matters. generate-antigravity-rule.sh:10-12 now validates every source (test -r "$src" || … exit 1) before anything is written, :37 mkdir -ps the output directory, :38-39 renders into a mktemp sibling with a trap … EXIT cleanup, and :43-44 mvs it into place before clearing the trap. The pre-flight validation is the half that actually fixes the bug I reported — an mktemp + mv alone would still have left a truncated artifact if a source were missing, just in a temp file instead of the committed one. And the trap - EXIT after a successful mv is the detail that stops the cleanup from deleting the output it just installed.

The size message no longer claims a limit it cannot cite, per your note. That was the whole of that finding.

On components: I withdraw it. My point was an inference from plugin list reporting ["skills"] and validate showing no rules line — which is exactly the shape of an observation that does not survive contact with runtime behaviour. Your three-part probe is the right way to settle it, and each part is load-bearing:

  • a session quoting the injected always-on rule content — positive evidence the rule is present;
  • an empty-profile control answering NO_RULE_LOADED — proves the first part is not a constant;
  • the exact acceptance prompt auto-triggering brainstorming with no code written — the behaviour the mechanism is supposed to produce.

A control is what turns "it works" into "it works because of this", and running it live on 1.2.12 settles the question in a way my reading of the manifest could not. I would rather a maintainer decline a finding on evidence than accept it on my inference.

Declining the rules field is also right, and the reason is stronger than "it did not work". You tried "rules": "./rules/" in a scratch copy and validate / install / list were unchanged — silently ignored. Silent ignoring is the important half: it means declaring it would have added a line that looks meaningful and does nothing, which is worse than not having it. A mechanism that does not exist cannot be declared into existence by a field, and the installer preserving rules/superpowers.md byte-for-byte plus rules/ being a documented plugin directory is sufficient for auto-discovery to be the real path.

The version floor stays absent, and the README now states only what you verified. "Verified on Antigravity CLI 1.2.7 and 1.2.12, 2.0 2.15.0, IDE 2.5.5" is a checkable claim; the previous unconditional version claim was not. Given that 1.2.12 and 1.1.x behave identically on the components question while loading the rule fine, a floor would not have addressed the observation anyway — so the honest fix is scoping the claim rather than adding a constraint that buys nothing.

Nothing blocking from me, and thank you for the probes — running the thing on a real binary is a stronger receipt than any amount of reading on my side.

Independent review findings: restrict the direct-write path to /dev/stdout
(the only legitimate non-file target, used by the test cmp) so targets like
/dev/null fail loudly instead of discarding output. Require non-empty (-s)
bootstrap sources so a truncated input cannot generate a degenerate rule.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

skill:using-superpowers The using-superpowers skill

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants