From ceba130e52e0bfb08952b18572dcdfcb9df8ad74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Den=20Delimarsky=20=F0=9F=8C=BA?= <53200638+localden@users.noreply.github.com> Date: Sun, 21 Sep 2025 12:48:58 -0700 Subject: [PATCH] Add support for Auggie --- .../scripts/create-github-release.sh | 2 + .../scripts/create-release-packages.sh | 5 ++- AGENTS.md | 17 ++++++++ CHANGELOG.md | 2 + README.md | 3 +- pyproject.toml | 2 +- scripts/bash/update-agent-context.sh | 13 +++++- scripts/powershell/update-agent-context.ps1 | 7 +++- src/specify_cli/__init__.py | 42 +++++++++++++++++-- 9 files changed, 82 insertions(+), 11 deletions(-) diff --git a/.github/workflows/scripts/create-github-release.sh b/.github/workflows/scripts/create-github-release.sh index 19ab47a..dc6c7d2 100644 --- a/.github/workflows/scripts/create-github-release.sh +++ b/.github/workflows/scripts/create-github-release.sh @@ -34,5 +34,7 @@ gh release create "$VERSION" \ .genreleases/spec-kit-template-codex-ps-"$VERSION".zip \ .genreleases/spec-kit-template-kilocode-sh-"$VERSION".zip \ .genreleases/spec-kit-template-kilocode-ps-"$VERSION".zip \ + .genreleases/spec-kit-template-auggie-sh-"$VERSION".zip \ + .genreleases/spec-kit-template-auggie-ps-"$VERSION".zip \ --title "Spec Kit Templates - $VERSION_NO_V" \ --notes-file release_notes.md \ No newline at end of file diff --git a/.github/workflows/scripts/create-release-packages.sh b/.github/workflows/scripts/create-release-packages.sh index 591c791..425de86 100644 --- a/.github/workflows/scripts/create-release-packages.sh +++ b/.github/workflows/scripts/create-release-packages.sh @@ -166,13 +166,16 @@ build_variant() { kilocode) mkdir -p "$base_dir/.kilocode/workflows" generate_commands kilocode md "\$ARGUMENTS" "$base_dir/.kilocode/workflows" "$script" ;; + auggie) + mkdir -p "$base_dir/.augment/commands" + generate_commands auggie md "\$ARGUMENTS" "$base_dir/.augment/commands" "$script" ;; 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 qwen opencode windsurf codex kilocode) +ALL_AGENTS=(claude gemini copilot cursor qwen opencode windsurf codex kilocode auggie) ALL_SCRIPTS=(sh ps) diff --git a/AGENTS.md b/AGENTS.md index fa0725f..59b9956 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -59,6 +59,23 @@ AI_CHOICES = { } ``` +Also update the `agent_folder_map` in the same file to include the new agent's folder for the security notice: + +```python +agent_folder_map = { + "claude": ".claude/", + "gemini": ".gemini/", + "cursor": ".cursor/", + "qwen": ".qwen/", + "opencode": ".opencode/", + "codex": ".codex/", + "windsurf": ".windsurf/", # Add new agent folder here + "kilocode": ".kilocode/", + "auggie": ".auggie/", + "copilot": ".github/" +} +``` + #### 2. Update CLI Help Text Update all help text and examples to include the new agent: diff --git a/CHANGELOG.md b/CHANGELOG.md index 7d85bf7..64a5f5a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - Support for Kilo Code. Thank you [@shahrukhkhan489](https://github.com/shahrukhkhan489) with [#394](https://github.com/github/spec-kit/pull/394). +- Support for Auggie CLI. Thank you [@hungthai1401](https://github.com/hungthai1401) with [#137](https://github.com/github/spec-kit/pull/137) +- Agent folder security notice displayed after project provisioning completion, warning users that some agents may store credentials or auth tokens in their agent folders and recommending adding relevant folders to `.gitignore` to prevent accidental credential leakage. ### Changed diff --git a/README.md b/README.md index 90f46d9..d5b371b 100644 --- a/README.md +++ b/README.md @@ -105,6 +105,7 @@ Want to see Spec Kit in action? Watch our [video overview](https://www.youtube.c | [opencode](https://opencode.ai/) | ✅ | | | [Windsurf](https://windsurf.com/) | ✅ | | | [Kilo Code](https://github.com/Kilo-Org/kilocode) | ✅ | | +| [Auggie CLI](https://docs.augmentcode.com/cli/overview) | ✅ | | | [Codex CLI](https://github.com/openai/codex) | ⚠️ | Codex [does not support](https://github.com/openai/codex/issues/2890) custom arguments for slash commands. | ## 🔧 Specify CLI Reference @@ -123,7 +124,7 @@ The `specify` command supports the following options: | Argument/Option | Type | Description | |------------------------|----------|------------------------------------------------------------------------------| | `` | Argument | Name for your new project directory (optional if using `--here`) | -| `--ai` | Option | AI assistant to use: `claude`, `gemini`, `copilot`, `cursor`, `qwen`, `opencode`, `codex`, or `windsurf` | +| `--ai` | Option | AI assistant to use: `claude`, `gemini`, `copilot`, `cursor`, `qwen`, `opencode`, `codex`, `windsurf`, `kilocode`, or `auggie` | | `--script` | Option | Script variant to use: `sh` (bash/zsh) or `ps` (PowerShell) | | `--ignore-agent-tools` | Flag | Skip checks for AI agent tools like Claude Code | | `--no-git` | Flag | Skip git repository initialization | diff --git a/pyproject.toml b/pyproject.toml index 4b5f73c..1754fe9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "specify-cli" -version = "0.0.13" +version = "0.0.14" description = "Specify CLI, part of GitHub Spec Kit. A tool to bootstrap your projects for Spec-Driven Development (SDD)." requires-python = ">=3.11" dependencies = [ diff --git a/scripts/bash/update-agent-context.sh b/scripts/bash/update-agent-context.sh index e35ae4b..7a3dea8 100644 --- a/scripts/bash/update-agent-context.sh +++ b/scripts/bash/update-agent-context.sh @@ -67,6 +67,7 @@ QWEN_FILE="$REPO_ROOT/QWEN.md" AGENTS_FILE="$REPO_ROOT/AGENTS.md" WINDSURF_FILE="$REPO_ROOT/.windsurf/rules/specify-rules.md" KILOCODE_FILE="$REPO_ROOT/.kilocode/rules/specify-rules.md" +AUGGIE_FILE="$REPO_ROOT/.augment/rules/specify-rules.md" # Template file TEMPLATE_FILE="$REPO_ROOT/.specify/templates/agent-file-template.md" @@ -572,9 +573,12 @@ update_specific_agent() { kilocode) update_agent_file "$KILOCODE_FILE" "Kilo Code" ;; + auggie) + update_agent_file "$AUGGIE_FILE" "Auggie CLI" + ;; *) log_error "Unknown agent type '$agent_type'" - log_error "Expected: claude|gemini|copilot|cursor|qwen|opencode|codex|windsurf|kilocode" + log_error "Expected: claude|gemini|copilot|cursor|qwen|opencode|codex|windsurf|kilocode|auggie" exit 1 ;; esac @@ -623,6 +627,11 @@ update_all_existing_agents() { update_agent_file "$KILOCODE_FILE" "Kilo Code" found_agent=true fi + + if [[ -f "$AUGGIE_FILE" ]]; then + update_agent_file "$AUGGIE_FILE" "Auggie CLI" + found_agent=true + fi # If no agent files exist, create a default Claude file if [[ "$found_agent" == false ]]; then @@ -647,7 +656,7 @@ print_summary() { fi echo - log_info "Usage: $0 [claude|gemini|copilot|cursor|qwen|opencode|codex|windsurf|kilocode]" + log_info "Usage: $0 [claude|gemini|copilot|cursor|qwen|opencode|codex|windsurf|kilocode|auggie]" } #============================================================================== diff --git a/scripts/powershell/update-agent-context.ps1 b/scripts/powershell/update-agent-context.ps1 index 27a058d..0c90548 100644 --- a/scripts/powershell/update-agent-context.ps1 +++ b/scripts/powershell/update-agent-context.ps1 @@ -25,7 +25,7 @@ Relies on common helper functions in common.ps1 #> param( [Parameter(Position=0)] - [ValidateSet('claude','gemini','copilot','cursor','qwen','opencode','codex','windsurf','kilocode')] + [ValidateSet('claude','gemini','copilot','cursor','qwen','opencode','codex','windsurf','kilocode','auggie')] [string]$AgentType ) @@ -52,6 +52,7 @@ $QWEN_FILE = Join-Path $REPO_ROOT 'QWEN.md' $AGENTS_FILE = Join-Path $REPO_ROOT 'AGENTS.md' $WINDSURF_FILE = Join-Path $REPO_ROOT '.windsurf/rules/specify-rules.md' $KILOCODE_FILE = Join-Path $REPO_ROOT '.kilocode/rules/specify-rules.md' +$AUGGIE_FILE = Join-Path $REPO_ROOT '.augment/rules/specify-rules.md' $TEMPLATE_FILE = Join-Path $REPO_ROOT '.specify/templates/agent-file-template.md' @@ -372,7 +373,8 @@ function Update-SpecificAgent { 'codex' { Update-AgentFile -TargetFile $AGENTS_FILE -AgentName 'Codex CLI' } 'windsurf' { Update-AgentFile -TargetFile $WINDSURF_FILE -AgentName 'Windsurf' } 'kilocode' { Update-AgentFile -TargetFile $KILOCODE_FILE -AgentName 'Kilo Code' } - default { Write-Err "Unknown agent type '$Type'"; Write-Err 'Expected: claude|gemini|copilot|cursor|qwen|opencode|codex|windsurf|kilocode'; return $false } + 'auggie' { Update-AgentFile -TargetFile $AUGGIE_FILE -AgentName 'Auggie CLI' } + default { Write-Err "Unknown agent type '$Type'"; Write-Err 'Expected: claude|gemini|copilot|cursor|qwen|opencode|codex|windsurf|kilocode|auggie'; return $false } } } @@ -387,6 +389,7 @@ function Update-AllExistingAgents { if (Test-Path $AGENTS_FILE) { if (-not (Update-AgentFile -TargetFile $AGENTS_FILE -AgentName 'Codex/opencode')) { $ok = $false }; $found = $true } if (Test-Path $WINDSURF_FILE) { if (-not (Update-AgentFile -TargetFile $WINDSURF_FILE -AgentName 'Windsurf')) { $ok = $false }; $found = $true } if (Test-Path $KILOCODE_FILE) { if (-not (Update-AgentFile -TargetFile $KILOCODE_FILE -AgentName 'Kilo Code')) { $ok = $false }; $found = $true } + if (Test-Path $AUGGIE_FILE) { if (-not (Update-AgentFile -TargetFile $AUGGIE_FILE -AgentName 'Auggie CLI')) { $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 } diff --git a/src/specify_cli/__init__.py b/src/specify_cli/__init__.py index cc6ca73..220697c 100644 --- a/src/specify_cli/__init__.py +++ b/src/specify_cli/__init__.py @@ -73,6 +73,7 @@ AI_CHOICES = { "codex": "Codex CLI", "windsurf": "Windsurf", "kilocode": "Kilo Code", + "auggie": "Auggie CLI", } # Add script type choices SCRIPT_TYPE_CHOICES = {"sh": "POSIX Shell (bash/zsh)", "ps": "PowerShell"} @@ -748,7 +749,7 @@ def ensure_executable_scripts(project_path: Path, tracker: StepTracker | None = @app.command() def init( project_name: str = typer.Argument(None, help="Name for your new project directory (optional if using --here)"), - ai_assistant: str = typer.Option(None, "--ai", help="AI assistant to use: claude, gemini, copilot, cursor, qwen, opencode, codex, windsurf, or kilocode"), + ai_assistant: str = typer.Option(None, "--ai", help="AI assistant to use: claude, gemini, copilot, cursor, qwen, opencode, codex, windsurf, kilocode, or auggie"), script_type: str = typer.Option(None, "--script", help="Script type to use: sh or ps"), ignore_agent_tools: bool = typer.Option(False, "--ignore-agent-tools", help="Skip checks for AI agent tools like Claude Code"), no_git: bool = typer.Option(False, "--no-git", help="Skip git repository initialization"), @@ -762,7 +763,7 @@ def init( This command will: 1. Check that required tools are installed (git is optional) - 2. Let you choose your AI assistant (Claude Code, Gemini CLI, GitHub Copilot, Cursor, Qwen Code, opencode, Codex CLI, Windsurf, or Kilo Code) + 2. Let you choose your AI assistant (Claude Code, Gemini CLI, GitHub Copilot, Cursor, Qwen Code, opencode, Codex CLI, Windsurf, Kilo Code, or Auggie CLI) 3. Download the appropriate template from GitHub 4. Extract the template to a new project directory or current directory 5. Initialize a fresh git repository (if not --no-git and no existing repo) @@ -778,6 +779,7 @@ def init( specify init my-project --ai opencode specify init my-project --ai codex specify init my-project --ai windsurf + specify init my-project --ai auggie specify init --ignore-agent-tools my-project specify init --here --ai claude specify init --here --ai codex @@ -879,6 +881,10 @@ def init( if not check_tool("codex", "Install from: https://github.com/openai/codex"): console.print("[red]Error:[/red] Codex CLI is required for Codex projects") agent_tool_missing = True + elif selected_ai == "auggie": + if not check_tool("auggie", "Install from: https://docs.augmentcode.com/cli/setup-auggie/install-auggie-cli"): + console.print("[red]Error:[/red] Auggie CLI is required for Auggie CLI projects") + agent_tool_missing = True # GitHub Copilot and Cursor checks are not needed as they're typically available in supported IDEs if agent_tool_missing: @@ -982,6 +988,32 @@ def init( console.print(tracker.render()) console.print("\n[bold green]Project ready.[/bold green]") + # Agent folder security notice + agent_folder_map = { + "claude": ".claude/", + "gemini": ".gemini/", + "cursor": ".cursor/", + "qwen": ".qwen/", + "opencode": ".opencode/", + "codex": ".codex/", + "windsurf": ".windsurf/", + "kilocode": ".kilocode/", + "auggie": ".auggie/", + "copilot": ".github/" + } + + if selected_ai in agent_folder_map: + agent_folder = agent_folder_map[selected_ai] + security_notice = Panel( + f"Some agents may store credentials, auth tokens, or other identifying and private artifacts in the agent folder within your project.\n" + f"Consider adding [cyan]{agent_folder}[/cyan] (or parts of it) to [cyan].gitignore[/cyan] to prevent accidental credential leakage.", + title="[yellow]Agent Folder Security[/yellow]", + border_style="yellow", + padding=(1, 2) + ) + console.print() + console.print(security_notice) + # Boxed "Next steps" section steps_lines = [] if not here: @@ -1010,7 +1042,7 @@ def init( steps_lines.append(" 2.4 [cyan]/tasks[/] - Generate actionable tasks") steps_lines.append(" 2.5 [cyan]/implement[/] - Execute implementation") - steps_panel = Panel("\n".join(steps_lines), title="Next steps", border_style="cyan", padding=(1,2)) + steps_panel = Panel("\n".join(steps_lines), title="Next Steps", border_style="cyan", padding=(1,2)) console.print() console.print(steps_panel) @@ -1044,6 +1076,7 @@ def check(): tracker.add("kilocode", "Kilo Code IDE (optional)") tracker.add("opencode", "opencode") tracker.add("codex", "Codex CLI") + tracker.add("auggie", "Auggie CLI (optional)") git_ok = check_tool_for_tracker("git", "https://git-scm.com/downloads", tracker) claude_ok = check_tool_for_tracker("claude", "https://docs.anthropic.com/en/docs/claude-code/setup", tracker) @@ -1056,6 +1089,7 @@ def check(): kilocode_ok = check_tool_for_tracker("kilocode", "https://kilocode.com/", tracker) opencode_ok = check_tool_for_tracker("opencode", "https://opencode.ai/", tracker) codex_ok = check_tool_for_tracker("codex", "https://github.com/openai/codex", tracker) + auggie_ok = check_tool_for_tracker("auggie", "https://auggie.io/", tracker) console.print(tracker.render()) @@ -1063,7 +1097,7 @@ def check(): if not git_ok: console.print("[dim]Tip: Install git for repository management[/dim]") - if not (claude_ok or gemini_ok or cursor_ok or qwen_ok or windsurf_ok or kilocode_ok or opencode_ok or codex_ok): + if not (claude_ok or gemini_ok or cursor_ok or qwen_ok or windsurf_ok or kilocode_ok or opencode_ok or codex_ok or auggie_ok): console.print("[dim]Tip: Install an AI assistant for the best experience[/dim]")