diff --git a/.github/workflows/scripts/create-github-release.sh b/.github/workflows/scripts/create-github-release.sh index 86ce3f7..19ab47a 100644 --- a/.github/workflows/scripts/create-github-release.sh +++ b/.github/workflows/scripts/create-github-release.sh @@ -32,5 +32,7 @@ gh release create "$VERSION" \ .genreleases/spec-kit-template-windsurf-ps-"$VERSION".zip \ .genreleases/spec-kit-template-codex-sh-"$VERSION".zip \ .genreleases/spec-kit-template-codex-ps-"$VERSION".zip \ + .genreleases/spec-kit-template-kilocode-sh-"$VERSION".zip \ + .genreleases/spec-kit-template-kilocode-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 0021c56..591c791 100644 --- a/.github/workflows/scripts/create-release-packages.sh +++ b/.github/workflows/scripts/create-release-packages.sh @@ -163,13 +163,16 @@ build_variant() { codex) mkdir -p "$base_dir/.codex/prompts" generate_commands codex md "\$ARGUMENTS" "$base_dir/.codex/prompts" "$script" ;; + kilocode) + mkdir -p "$base_dir/.kilocode/workflows" + generate_commands kilocode md "\$ARGUMENTS" "$base_dir/.kilocode/workflows" "$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) +ALL_AGENTS=(claude gemini copilot cursor qwen opencode windsurf codex kilocode) ALL_SCRIPTS=(sh ps) diff --git a/AGENTS.md b/AGENTS.md index 6d85d98..971f436 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -86,7 +86,19 @@ case $agent in esac ``` -#### 4. Update Agent Context Scripts +#### 4. Update GitHub Release Script + +Modify `.github/workflows/scripts/create-github-release.sh` to include the new agent's packages: + +```bash +gh release create "$VERSION" \ + # ... existing packages ... + .genreleases/spec-kit-template-windsurf-sh-"$VERSION".zip \ + .genreleases/spec-kit-template-windsurf-ps-"$VERSION".zip \ + # Add new agent packages here +``` + +#### 5. Update Agent Context Scripts ##### Bash script (`scripts/bash/update-agent-context.sh`): @@ -132,7 +144,7 @@ switch ($AgentType) { } ``` -#### 5. Update CLI Tool Checks (Optional) +#### 6. Update CLI Tool Checks (Optional) For agents that require CLI tools, add checks in the `check()` command and agent validation: diff --git a/CHANGELOG.md b/CHANGELOG.md index 07e6a29..7d85bf7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,16 @@ All notable changes to the Specify CLI will be documented in this file. 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). +## [0.0.13] - 2025-09-21 + +### Added + +- Support for Kilo Code. Thank you [@shahrukhkhan489](https://github.com/shahrukhkhan489) with [#394](https://github.com/github/spec-kit/pull/394). + +### Changed + +- Warning displayed to ensure that folks are aware that they might need to add their agent folder to `.gitignore`. + ## [0.0.12] - 2025-09-21 ### Changed diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 06461ee..17baec8 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -11,7 +11,7 @@ These are one time installations required to be able to test your changes locall 1. Install [Python 3.11+](https://www.python.org/downloads/) 1. Install [uv](https://docs.astral.sh/uv/) for package management 1. Install [Git](https://git-scm.com/downloads) -1. Have an AI coding agent available: [Claude Code](https://www.anthropic.com/claude-code), [GitHub Copilot](https://code.visualstudio.com/), [Gemini CLI](https://github.com/google-gemini/gemini-cli), or [Qwen Code](https://github.com/QwenLM/qwen-code). We're working on adding support for other agents as well. +1. Have an [AI coding agent available](README.md#-supported-ai-agents) ## Submitting a pull request diff --git a/README.md b/README.md index d2fd54a..d2cbf41 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,7 @@ - [🤔 What is Spec-Driven Development?](#-what-is-spec-driven-development) - [⚡ Get started](#-get-started) - [📽️ Video Overview](#️-video-overview) +- [🤖 Supported AI Agents](#-supported-ai-agents) - [🔧 Specify CLI Reference](#-specify-cli-reference) - [📚 Core philosophy](#-core-philosophy) - [🌟 Development phases](#-development-phases) @@ -92,6 +93,20 @@ Want to see Spec Kit in action? Watch our [video overview](https://www.youtube.c [![Spec Kit video header](/media/spec-kit-video-header.jpg)](https://www.youtube.com/watch?v=a9eR1xsfvHg&pp=0gcJCckJAYcqIYzv) +## 🤖 Supported AI Agents + +| Agent | Support | Notes | +|-----------------------------------------------------------|---------|---------------------------------------------------| +| [Claude Code](https://www.anthropic.com/claude-code) | ✅ | | +| [GitHub Copilot](https://code.visualstudio.com/) | ✅ | | +| [Gemini CLI](https://github.com/google-gemini/gemini-cli) | ✅ | | +| [Cursor](https://cursor.sh/) | ✅ | | +| [Qwen Code](https://github.com/QwenLM/qwen-code) | ✅ | | +| [opencode](https://opencode.ai/) | ✅ | | +| [Windsurf](https://windsurf.com/) | ✅ | | +| [Kilo Code](https://github.com/Kilo-Org/kilocode) | ✅ | | +| [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 The `specify` command supports the following options: @@ -220,6 +235,8 @@ Our research and experimentation focus on: - [Python 3.11+](https://www.python.org/downloads/) - [Git](https://git-scm.com/downloads) +If you encounter issues with an agent, please open an issue so we can refine the integration. + ## 📖 Learn more - **[Complete Spec-Driven Development Methodology](./spec-driven.md)** - Deep dive into the full process diff --git a/pyproject.toml b/pyproject.toml index e44820b..4b5f73c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "specify-cli" -version = "0.0.12" +version = "0.0.13" 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 96131f5..e35ae4b 100644 --- a/scripts/bash/update-agent-context.sh +++ b/scripts/bash/update-agent-context.sh @@ -66,6 +66,7 @@ CURSOR_FILE="$REPO_ROOT/.cursor/rules/specify-rules.mdc" 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" # Template file TEMPLATE_FILE="$REPO_ROOT/.specify/templates/agent-file-template.md" @@ -568,9 +569,12 @@ update_specific_agent() { windsurf) update_agent_file "$WINDSURF_FILE" "Windsurf" ;; + kilocode) + update_agent_file "$KILOCODE_FILE" "Kilo Code" + ;; *) log_error "Unknown agent type '$agent_type'" - log_error "Expected: claude|gemini|copilot|cursor|qwen|opencode|codex|windsurf" + log_error "Expected: claude|gemini|copilot|cursor|qwen|opencode|codex|windsurf|kilocode" exit 1 ;; esac @@ -615,6 +619,11 @@ update_all_existing_agents() { found_agent=true fi + if [[ -f "$KILOCODE_FILE" ]]; then + update_agent_file "$KILOCODE_FILE" "Kilo Code" + 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..." @@ -638,7 +647,7 @@ print_summary() { fi echo - log_info "Usage: $0 [claude|gemini|copilot|cursor|qwen|opencode|codex|windsurf]" + log_info "Usage: $0 [claude|gemini|copilot|cursor|qwen|opencode|codex|windsurf|kilocode]" } #============================================================================== diff --git a/scripts/powershell/update-agent-context.ps1 b/scripts/powershell/update-agent-context.ps1 index 5204b47..27a058d 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')] + [ValidateSet('claude','gemini','copilot','cursor','qwen','opencode','codex','windsurf','kilocode')] [string]$AgentType ) @@ -51,6 +51,7 @@ $CURSOR_FILE = Join-Path $REPO_ROOT '.cursor/rules/specify-rules.mdc' $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' $TEMPLATE_FILE = Join-Path $REPO_ROOT '.specify/templates/agent-file-template.md' @@ -370,7 +371,8 @@ function Update-SpecificAgent { 'opencode' { Update-AgentFile -TargetFile $AGENTS_FILE -AgentName 'opencode' } 'codex' { Update-AgentFile -TargetFile $AGENTS_FILE -AgentName 'Codex CLI' } 'windsurf' { Update-AgentFile -TargetFile $WINDSURF_FILE -AgentName 'Windsurf' } - default { Write-Err "Unknown agent type '$Type'"; Write-Err 'Expected: claude|gemini|copilot|cursor|qwen|opencode|codex|windsurf'; return $false } + '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 } } } @@ -384,6 +386,7 @@ function Update-AllExistingAgents { if (Test-Path $QWEN_FILE) { if (-not (Update-AgentFile -TargetFile $QWEN_FILE -AgentName 'Qwen Code')) { $ok = $false }; $found = $true } 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 (-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 } @@ -398,7 +401,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|qwen|opencode|codex|windsurf]' + Write-Info 'Usage: ./update-agent-context.ps1 [-AgentType claude|gemini|copilot|cursor|qwen|opencode|codex|windsurf|kilocode]' } function Main { diff --git a/src/specify_cli/__init__.py b/src/specify_cli/__init__.py index 72f986e..cc6ca73 100644 --- a/src/specify_cli/__init__.py +++ b/src/specify_cli/__init__.py @@ -72,6 +72,7 @@ AI_CHOICES = { "opencode": "opencode", "codex": "Codex CLI", "windsurf": "Windsurf", + "kilocode": "Kilo Code", } # Add script type choices SCRIPT_TYPE_CHOICES = {"sh": "POSIX Shell (bash/zsh)", "ps": "PowerShell"} @@ -747,7 +748,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, or windsurf"), + ai_assistant: str = typer.Option(None, "--ai", help="AI assistant to use: claude, gemini, copilot, cursor, qwen, opencode, codex, windsurf, or kilocode"), 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"), @@ -761,7 +762,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, or Windsurf) + 2. Let you choose your AI assistant (Claude Code, Gemini CLI, GitHub Copilot, Cursor, Qwen Code, opencode, Codex CLI, Windsurf, or Kilo Code) 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) @@ -1036,9 +1037,11 @@ def check(): tracker.add("claude", "Claude Code CLI") tracker.add("gemini", "Gemini CLI") tracker.add("qwen", "Qwen Code CLI") - tracker.add("code", "VS Code (for GitHub Copilot)") + tracker.add("code", "Visual Studio Code") + tracker.add("code-insiders", "Visual Studio Code Insiders") tracker.add("cursor-agent", "Cursor IDE agent (optional)") tracker.add("windsurf", "Windsurf IDE (optional)") + tracker.add("kilocode", "Kilo Code IDE (optional)") tracker.add("opencode", "opencode") tracker.add("codex", "Codex CLI") @@ -1047,10 +1050,10 @@ def check(): gemini_ok = check_tool_for_tracker("gemini", "https://github.com/google-gemini/gemini-cli", tracker) qwen_ok = check_tool_for_tracker("qwen", "https://github.com/QwenLM/qwen-code", tracker) code_ok = check_tool_for_tracker("code", "https://code.visualstudio.com/", tracker) - if not code_ok: - code_ok = check_tool_for_tracker("code-insiders", "https://code.visualstudio.com/insiders/", tracker) + code_insiders_ok = check_tool_for_tracker("code-insiders", "https://code.visualstudio.com/insiders/", tracker) cursor_ok = check_tool_for_tracker("cursor-agent", "https://cursor.sh/", tracker) windsurf_ok = check_tool_for_tracker("windsurf", "https://windsurf.com/", tracker) + 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) @@ -1060,7 +1063,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 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): console.print("[dim]Tip: Install an AI assistant for the best experience[/dim]")