Skip to content
Open
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
2 changes: 2 additions & 0 deletions .github/workflows/scripts/create-github-release.sh
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@ gh release create "$VERSION" \
.genreleases/spec-kit-template-codebuddy-ps-"$VERSION".zip \
.genreleases/spec-kit-template-amp-sh-"$VERSION".zip \
.genreleases/spec-kit-template-amp-ps-"$VERSION".zip \
.genreleases/spec-kit-template-antigravity-sh-"$VERSION".zip \
.genreleases/spec-kit-template-antigravity-ps-"$VERSION".zip \
.genreleases/spec-kit-template-q-sh-"$VERSION".zip \
.genreleases/spec-kit-template-q-ps-"$VERSION".zip \
--title "Spec Kit Plus Templates - $VERSION_NO_V" \
Expand Down
16 changes: 15 additions & 1 deletion .github/workflows/scripts/create-release-packages.sh
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,7 @@ build_variant() {
codebuddy) agent_name="CodeBuddy" ;;
amp) agent_name="AWS Amplify AI" ;;
q) agent_name="Amazon Q Developer CLI" ;;
antigravity) agent_name="Google Anti-Gravity" ;;
*) agent_name="$agent" ;;
esac

Expand Down Expand Up @@ -274,6 +275,11 @@ This file is generated during init for the selected agent.
echo "$full_content" > "$base_dir/AMP.md"
echo "Generated AMP.md"
;;
antigravity)
mkdir -p "$base_dir/.idx"
echo "$full_content" > "$base_dir/.idx/specify-rules.md"
echo "Generated .idx/specify-rules.md"
;;
esac
}

Expand Down Expand Up @@ -337,13 +343,21 @@ This file is generated during init for the selected agent.
mkdir -p "$base_dir/.amazonq/prompts"
generate_commands q md "\$ARGUMENTS" "$base_dir/.amazonq/prompts" "$script"
generate_agent_rules q "$base_dir" ;;
antigravity)
mkdir -p "$base_dir/.idx"
generate_commands antigravity md "\$ARGUMENTS" "$base_dir/.idx" "$script"
# Copy MCP server and configuration templates
cp templates/antigravity/specify_mcp.py "$base_dir/.idx/" 2>/dev/null || true
cp templates/antigravity/dev.nix "$base_dir/.idx/" 2>/dev/null || true
cp templates/antigravity/mcp.json "$base_dir/.idx/" 2>/dev/null || true
generate_agent_rules antigravity "$base_dir" ;;
esac
( cd "$base_dir" && zip -r "../spec-kit-template-${agent}-${script}-${NEW_VERSION}.zip" . )
echo "Created $GENRELEASES_DIR/spec-kit-template-${agent}-${script}-${NEW_VERSION}.zip"
}

# Determine agent list
ALL_AGENTS=(claude gemini copilot cursor-agent qwen opencode windsurf codex kilocode auggie roo codebuddy amp q)
ALL_AGENTS=(claude gemini copilot cursor-agent qwen opencode windsurf codex kilocode auggie roo codebuddy amp q antigravity)
ALL_SCRIPTS=(sh ps)

norm_list() {
Expand Down
1 change: 1 addition & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,7 @@ Specify supports multiple AI agents by generating agent-specific command files a
| **CodeBuddy CLI** | `.codebuddy/commands/` | Markdown | `codebuddy` | CodeBuddy CLI |
| **Amazon Q Developer CLI** | `.amazonq/prompts/` | Markdown | `q` | Amazon Q Developer CLI |
| **Amp** | `.agents/commands/` | Markdown | `amp` | Amp CLI |
| **Google Anti-Gravity** | `.idx/` | Python (MCP) | N/A (IDE-based) | Google IDX with MCP server |

### Step-by-Step Integration Guide

Expand Down
17 changes: 17 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,23 @@ All notable changes to the Specify CLI and templates are documented here.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased]

### Added

- **Google Anti-Gravity Agent Support**
- Added official support for Google Anti-Gravity IDE agent with Google IDX integration
- Implemented split-config approach for Google IDX/Firebase Studio compatibility:
- `.idx/dev.nix` - Runtime environment setup (Python 3.11, uv, mcp library)
- `.idx/mcp.json` - MCP server registration for Google IDX
- `.idx/specify_mcp.py` - FastMCP server with specify and plan prompts
- Agent configuration in `src/specify_cli/__init__.py` with folder `.idx/`
- Build scripts updated to generate antigravity release packages with template copying
- Agent context update scripts (bash and PowerShell) support antigravity
- Template files created in `templates/antigravity/`
- Documentation updated with Anti-Gravity in supported agents table
- Slash commands work via MCP server integration in Google IDX

## [0.0.17] - 2025-10-28

### Changed
Expand Down
13 changes: 11 additions & 2 deletions scripts/bash/update-agent-context.sh
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ ROO_FILE="$REPO_ROOT/.roo/rules/specify-rules.md"
CODEBUDDY_FILE="$REPO_ROOT/CODEBUDDY.md"
AMP_FILE="$REPO_ROOT/AGENTS.md"
Q_FILE="$REPO_ROOT/AGENTS.md"
ANTIGRAVITY_FILE="$REPO_ROOT/.idx/specify_mcp.py"

# Template file
TEMPLATE_FILE="$REPO_ROOT/.specify/templates/agent-file-template.md"
Expand Down Expand Up @@ -621,9 +622,12 @@ update_specific_agent() {
q)
update_agent_file "$Q_FILE" "Amazon Q Developer CLI"
;;
antigravity)
update_agent_file "$ANTIGRAVITY_FILE" "Google Anti-Gravity"
;;
*)
log_error "Unknown agent type '$agent_type'"
log_error "Expected: claude|gemini|copilot|cursor-agent|qwen|opencode|codex|windsurf|kilocode|auggie|roo|amp|q"
log_error "Expected: claude|gemini|copilot|cursor-agent|qwen|opencode|codex|windsurf|kilocode|auggie|roo|amp|q|antigravity"
exit 1
;;
esac
Expand Down Expand Up @@ -693,6 +697,11 @@ update_all_existing_agents() {
found_agent=true
fi

if [[ -f "$ANTIGRAVITY_FILE" ]]; then
update_agent_file "$ANTIGRAVITY_FILE" "Google Anti-Gravity"
found_agent=true
fi

# If no agent files exist, create a default Claude file
if [[ "$found_agent" == false ]]; then
log_info "No existing agent files found, creating default Claude file..."
Expand All @@ -717,7 +726,7 @@ print_summary() {

echo

log_info "Usage: $0 [claude|gemini|copilot|cursor-agent|qwen|opencode|codex|windsurf|kilocode|auggie|codebuddy|q]"
log_info "Usage: $0 [claude|gemini|copilot|cursor-agent|qwen|opencode|codex|windsurf|kilocode|auggie|codebuddy|q|antigravity]"
}

#==============================================================================
Expand Down
9 changes: 6 additions & 3 deletions scripts/powershell/update-agent-context.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ Relies on common helper functions in common.ps1
#>
param(
[Parameter(Position=0)]
[ValidateSet('claude','gemini','copilot','cursor-agent','qwen','opencode','codex','windsurf','kilocode','auggie','roo','codebuddy','amp','q')]
[ValidateSet('claude','gemini','copilot','cursor-agent','qwen','opencode','codex','windsurf','kilocode','auggie','roo','codebuddy','amp','q','antigravity')]
[string]$AgentType
)

Expand Down Expand Up @@ -57,6 +57,7 @@ $ROO_FILE = Join-Path $REPO_ROOT '.roo/rules/specify-rules.md'
$CODEBUDDY_FILE = Join-Path $REPO_ROOT 'CODEBUDDY.md'
$AMP_FILE = Join-Path $REPO_ROOT 'AGENTS.md'
$Q_FILE = Join-Path $REPO_ROOT 'AGENTS.md'
$ANTIGRAVITY_FILE = Join-Path $REPO_ROOT '.idx/specify_mcp.py'

$TEMPLATE_FILE = Join-Path $REPO_ROOT '.specify/templates/agent-file-template.md'

Expand Down Expand Up @@ -382,7 +383,8 @@ function Update-SpecificAgent {
'codebuddy' { Update-AgentFile -TargetFile $CODEBUDDY_FILE -AgentName 'CodeBuddy CLI' }
'amp' { Update-AgentFile -TargetFile $AMP_FILE -AgentName 'Amp' }
'q' { Update-AgentFile -TargetFile $Q_FILE -AgentName 'Amazon Q Developer CLI' }
default { Write-Err "Unknown agent type '$Type'"; Write-Err 'Expected: claude|gemini|copilot|cursor-agent|qwen|opencode|codex|windsurf|kilocode|auggie|roo|codebuddy|amp|q'; return $false }
'antigravity' { Update-AgentFile -TargetFile $ANTIGRAVITY_FILE -AgentName 'Google Anti-Gravity' }
default { Write-Err "Unknown agent type '$Type'"; Write-Err 'Expected: claude|gemini|copilot|cursor-agent|qwen|opencode|codex|windsurf|kilocode|auggie|roo|codebuddy|amp|q|antigravity'; return $false }
}
}

Expand All @@ -401,6 +403,7 @@ function Update-AllExistingAgents {
if (Test-Path $ROO_FILE) { if (-not (Update-AgentFile -TargetFile $ROO_FILE -AgentName 'Roo Code')) { $ok = $false }; $found = $true }
if (Test-Path $CODEBUDDY_FILE) { if (-not (Update-AgentFile -TargetFile $CODEBUDDY_FILE -AgentName 'CodeBuddy CLI')) { $ok = $false }; $found = $true }
if (Test-Path $Q_FILE) { if (-not (Update-AgentFile -TargetFile $Q_FILE -AgentName 'Amazon Q Developer CLI')) { $ok = $false }; $found = $true }
if (Test-Path $ANTIGRAVITY_FILE) { if (-not (Update-AgentFile -TargetFile $ANTIGRAVITY_FILE -AgentName 'Google Anti-Gravity')) { $ok = $false }; $found = $true }
if (-not $found) {
Write-Info 'No existing agent files found, creating default Claude file...'
if (-not (Update-AgentFile -TargetFile $CLAUDE_FILE -AgentName 'Claude Code')) { $ok = $false }
Expand All @@ -415,7 +418,7 @@ function Print-Summary {
if ($NEW_FRAMEWORK) { Write-Host " - Added framework: $NEW_FRAMEWORK" }
if ($NEW_DB -and $NEW_DB -ne 'N/A') { Write-Host " - Added database: $NEW_DB" }
Write-Host ''
Write-Info 'Usage: ./update-agent-context.ps1 [-AgentType claude|gemini|copilot|cursor-agent|qwen|opencode|codex|windsurf|kilocode|auggie|roo|codebuddy|amp|q]'
Write-Info 'Usage: ./update-agent-context.ps1 [-AgentType claude|gemini|copilot|cursor-agent|qwen|opencode|codex|windsurf|kilocode|auggie|roo|codebuddy|amp|q|antigravity]'
}

function Main {
Expand Down
7 changes: 7 additions & 0 deletions src/specify_cli/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,12 @@ def _github_auth_headers(cli_token: str | None = None) -> dict:
"install_url": "https://ampcode.com/manual#install",
"requires_cli": True,
},
"antigravity": {
"name": "Google Anti-Gravity",
"folder": ".idx/",
"install_url": None,
"requires_cli": False,
},
}

SCRIPT_TYPE_CHOICES = {"sh": "POSIX Shell (bash/zsh)", "ps": "PowerShell"}
Expand Down Expand Up @@ -580,6 +586,7 @@ def deep_merge(base: dict, update: dict) -> dict:
def download_template_from_github(ai_assistant: str, download_dir: Path, *, script_type: str = "sh", verbose: bool = True, show_progress: bool = True, client: httpx.Client = None, debug: bool = False, github_token: str = None) -> Tuple[Path, dict]:
repo_owner = "github"
repo_name = "spec-kit"

if client is None:
client = httpx.Client(verify=ssl_context)

Expand Down
7 changes: 7 additions & 0 deletions src/specifyplus_cli/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,12 @@ def _github_auth_headers(cli_token: str | None = None) -> dict:
"install_url": "https://ampcode.com/manual#install",
"requires_cli": True,
},
"antigravity": {
"name": "Google Anti-Gravity",
"folder": ".idx/",
"install_url": None,
"requires_cli": False,
},
}

SCRIPT_TYPE_CHOICES = {"sh": "POSIX Shell (bash/zsh)", "ps": "PowerShell"}
Expand Down Expand Up @@ -584,6 +590,7 @@ def deep_merge(base: dict, update: dict) -> dict:
def download_template_from_github(ai_assistant: str, download_dir: Path, *, script_type: str = "sh", verbose: bool = True, show_progress: bool = True, client: httpx.Client = None, debug: bool = False, github_token: str = None) -> Tuple[Path, dict]:
repo_owner = "panaversity"
repo_name = "spec-kit-plus"

if client is None:
client = httpx.Client(verify=ssl_context)

Expand Down
9 changes: 9 additions & 0 deletions templates/antigravity/dev.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{ pkgs, ... }: {
packages = [
pkgs.python311
pkgs.uv
];
idx.workspace.onCreate = {
install = "pip install mcp[cli]";
};
}
8 changes: 8 additions & 0 deletions templates/antigravity/mcp.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"mcpServers": {
"spec-kit": {
"command": "python",
"args": [".idx/specify_mcp.py"]
}
}
}
15 changes: 15 additions & 0 deletions templates/antigravity/specify_mcp.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("Spec-Kit")

@mcp.prompt()
def specify(goal: str):
"""Start the Spec-Driven Development process."""
return f"Role: AI Architect. Goal: {goal}. Create a SPEC.md file."

@mcp.prompt()
def plan(spec_content: str):
"""Generate a plan from the spec."""
return f"Read this spec: {spec_content}. Create a PLAN.md."

if __name__ == "__main__":
mcp.run()