From 8cc6a9bc6729a952fc0103227ce2817bf5b6a09d Mon Sep 17 00:00:00 2001 From: rohit Date: Sat, 18 Oct 2025 13:48:34 +0530 Subject: [PATCH 1/6] feat: add Continue support to Spec Kit --- .github/workflows/scripts/create-release-packages.sh | 5 ++++- README.md | 3 ++- scripts/bash/update-agent-context.sh | 11 ++++++++++- scripts/powershell/update-agent-context.ps1 | 7 +++++-- src/specify_cli/__init__.py | 8 +++++++- 5 files changed, 28 insertions(+), 6 deletions(-) diff --git a/.github/workflows/scripts/create-release-packages.sh b/.github/workflows/scripts/create-release-packages.sh index 5462a14fd..45d363f1b 100644 --- a/.github/workflows/scripts/create-release-packages.sh +++ b/.github/workflows/scripts/create-release-packages.sh @@ -184,13 +184,16 @@ build_variant() { q) mkdir -p "$base_dir/.amazonq/prompts" generate_commands q md "\$ARGUMENTS" "$base_dir/.amazonq/prompts" "$script" ;; + continue) + mkdir -p "$base_dir/.continue/commands" + generate_commands continue md "\$ARGUMENTS" "$base_dir/.continue/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-agent qwen opencode windsurf codex kilocode auggie roo codebuddy q) +ALL_AGENTS=(claude gemini copilot cursor-agent qwen opencode windsurf codex kilocode auggie roo codebuddy q continue) ALL_SCRIPTS=(sh ps) norm_list() { diff --git a/README.md b/README.md index cb20ad6c0..976007764 100644 --- a/README.md +++ b/README.md @@ -149,6 +149,7 @@ Want to see Spec Kit in action? Watch our [video overview](https://www.youtube.c | [Roo Code](https://roocode.com/) | ✅ | | | [Codex CLI](https://github.com/openai/codex) | ✅ | | | [Amazon Q Developer CLI](https://aws.amazon.com/developer/learning/q-developer-cli/) | ⚠️ | Amazon Q Developer CLI [does not support](https://github.com/aws/amazon-q-developer-cli/issues/3064) custom arguments for slash commands. | +| [Continue](https://github.com/continuedev/continue) | ✅ | VS Code extension | ## 🔧 Specify CLI Reference @@ -166,7 +167,7 @@ The `specify` command supports the following options: | Argument/Option | Type | Description | |------------------------|----------|------------------------------------------------------------------------------| | `` | Argument | Name for your new project directory (optional if using `--here`, or use `.` for current directory) | -| `--ai` | Option | AI assistant to use: `claude`, `gemini`, `copilot`, `cursor-agent`, `qwen`, `opencode`, `codex`, `windsurf`, `kilocode`, `auggie`, `roo`, `codebuddy`, or `q` | +| `--ai` | Option | AI assistant to use: `claude`, `gemini`, `copilot`, `cursor-agent`, `qwen`, `opencode`, `codex`, `windsurf`, `kilocode`, `auggie`, `roo`, `codebuddy`, `q`, or `continue` | | `--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/scripts/bash/update-agent-context.sh b/scripts/bash/update-agent-context.sh index ba10ec2f5..87fd9e13d 100644 --- a/scripts/bash/update-agent-context.sh +++ b/scripts/bash/update-agent-context.sh @@ -71,6 +71,7 @@ AUGGIE_FILE="$REPO_ROOT/.augment/rules/specify-rules.md" ROO_FILE="$REPO_ROOT/.roo/rules/specify-rules.md" CODEBUDDY_FILE="$REPO_ROOT/CODEBUDDY.md" Q_FILE="$REPO_ROOT/AGENTS.md" +CONTINUE_FILE="$REPO_ROOT/.continue/rules/specify-rules.md" # Template file TEMPLATE_FILE="$REPO_ROOT/.specify/templates/agent-file-template.md" @@ -588,9 +589,12 @@ update_specific_agent() { q) update_agent_file "$Q_FILE" "Amazon Q Developer CLI" ;; + continue) + update_agent_file "$CONTINUE_FILE" "Continue" + ;; *) log_error "Unknown agent type '$agent_type'" - log_error "Expected: claude|gemini|copilot|cursor-agent|qwen|opencode|codex|windsurf|kilocode|auggie|roo|q" + log_error "Expected: claude|gemini|copilot|cursor-agent|qwen|opencode|codex|windsurf|kilocode|auggie|roo|q|continue" exit 1 ;; esac @@ -659,6 +663,11 @@ update_all_existing_agents() { update_agent_file "$Q_FILE" "Amazon Q Developer CLI" found_agent=true fi + + if [[ -f "$CONTINUE_FILE" ]]; then + update_agent_file "$CONTINUE_FILE" "Continue" + found_agent=true + fi # If no agent files exist, create a default Claude file if [[ "$found_agent" == false ]]; then diff --git a/scripts/powershell/update-agent-context.ps1 b/scripts/powershell/update-agent-context.ps1 index 2fb4abe4d..8d9a95520 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-agent','qwen','opencode','codex','windsurf','kilocode','auggie','roo','codebuddy','q')] + [ValidateSet('claude','gemini','copilot','cursor-agent','qwen','opencode','codex','windsurf','kilocode','auggie','roo','codebuddy','q','continue')] [string]$AgentType ) @@ -56,6 +56,7 @@ $AUGGIE_FILE = Join-Path $REPO_ROOT '.augment/rules/specify-rules.md' $ROO_FILE = Join-Path $REPO_ROOT '.roo/rules/specify-rules.md' $CODEBUDDY_FILE = Join-Path $REPO_ROOT 'CODEBUDDY.md' $Q_FILE = Join-Path $REPO_ROOT 'AGENTS.md' +$CONTINUE_FILE = Join-Path $REPO_ROOT '.continue/rules/specify-rules.md' $TEMPLATE_FILE = Join-Path $REPO_ROOT '.specify/templates/agent-file-template.md' @@ -380,7 +381,8 @@ function Update-SpecificAgent { 'roo' { Update-AgentFile -TargetFile $ROO_FILE -AgentName 'Roo Code' } 'codebuddy' { Update-AgentFile -TargetFile $CODEBUDDY_FILE -AgentName 'CodeBuddy CLI' } '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|q'; return $false } + 'continue' { Update-AgentFile -TargetFile $CONTINUE_FILE -AgentName 'Continue' } + default { Write-Err "Unknown agent type '$Type'"; Write-Err 'Expected: claude|gemini|copilot|cursor-agent|qwen|opencode|codex|windsurf|kilocode|auggie|roo|codebuddy|q|continue'; return $false } } } @@ -399,6 +401,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 $CONTINUE_FILE) { if (-not (Update-AgentFile -TargetFile $CONTINUE_FILE -AgentName 'Continue')) { $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 37cba2868..38576970a 100644 --- a/src/specify_cli/__init__.py +++ b/src/specify_cli/__init__.py @@ -144,6 +144,12 @@ def _github_auth_headers(cli_token: str | None = None) -> dict: "install_url": "https://aws.amazon.com/developer/learning/q-developer-cli/", "requires_cli": True, }, + "continue": { + "name": "Continue", + "folder": ".continue/", + "install_url": "https://marketplace.visualstudio.com/items?itemName=continue.continue", + "requires_cli": False, + }, } SCRIPT_TYPE_CHOICES = {"sh": "POSIX Shell (bash/zsh)", "ps": "PowerShell"} @@ -859,7 +865,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, or use '.' for current directory)"), - ai_assistant: str = typer.Option(None, "--ai", help="AI assistant to use: claude, gemini, copilot, cursor-agent, qwen, opencode, codex, windsurf, kilocode, auggie, codebuddy, or q"), + ai_assistant: str = typer.Option(None, "--ai", help="AI assistant to use: claude, gemini, copilot, cursor-agent, qwen, opencode, codex, windsurf, kilocode, auggie, codebuddy, roo, q, or continue"), 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"), From 1aadf66019db7ef3e9bae35b76c109768f89d82d Mon Sep 17 00:00:00 2001 From: rohit Date: Sat, 18 Oct 2025 15:05:26 +0530 Subject: [PATCH 2/6] update continue uses promptsfoldeer --- .github/workflows/scripts/create-release-packages.sh | 4 ++-- src/specify_cli/__init__.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/scripts/create-release-packages.sh b/.github/workflows/scripts/create-release-packages.sh index 45d363f1b..bc850b46f 100644 --- a/.github/workflows/scripts/create-release-packages.sh +++ b/.github/workflows/scripts/create-release-packages.sh @@ -185,8 +185,8 @@ build_variant() { mkdir -p "$base_dir/.amazonq/prompts" generate_commands q md "\$ARGUMENTS" "$base_dir/.amazonq/prompts" "$script" ;; continue) - mkdir -p "$base_dir/.continue/commands" - generate_commands continue md "\$ARGUMENTS" "$base_dir/.continue/commands" "$script" ;; + mkdir -p "$base_dir/.continue/prompts" + generate_commands continue md "\$ARGUMENTS" "$base_dir/.continue/prompts" "$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" diff --git a/src/specify_cli/__init__.py b/src/specify_cli/__init__.py index 38576970a..acfbe0f57 100644 --- a/src/specify_cli/__init__.py +++ b/src/specify_cli/__init__.py @@ -147,7 +147,7 @@ def _github_auth_headers(cli_token: str | None = None) -> dict: "continue": { "name": "Continue", "folder": ".continue/", - "install_url": "https://marketplace.visualstudio.com/items?itemName=continue.continue", + "install_url": None, # IDE-based "requires_cli": False, }, } From ce4f16685a30ef0c31cd38514d3e839c590780bc Mon Sep 17 00:00:00 2001 From: rohit Date: Sat, 18 Oct 2025 15:25:41 +0530 Subject: [PATCH 3/6] update releases --- .github/workflows/scripts/create-github-release.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/scripts/create-github-release.sh b/.github/workflows/scripts/create-github-release.sh index 1125f5102..830bd614c 100644 --- a/.github/workflows/scripts/create-github-release.sh +++ b/.github/workflows/scripts/create-github-release.sh @@ -42,5 +42,7 @@ gh release create "$VERSION" \ .genreleases/spec-kit-template-codebuddy-ps-"$VERSION".zip \ .genreleases/spec-kit-template-q-sh-"$VERSION".zip \ .genreleases/spec-kit-template-q-ps-"$VERSION".zip \ + .genreleases/spec-kit-template-continue-sh-"$VERSION".zip \ + .genreleases/spec-kit-template-continue-ps-"$VERSION".zip \ --title "Spec Kit Templates - $VERSION_NO_V" \ --notes-file release_notes.md From cea96d02843f31fb09733dc2a570227ee68d5940 Mon Sep 17 00:00:00 2001 From: rohit Date: Sun, 19 Oct 2025 01:14:22 +0530 Subject: [PATCH 4/6] update for auto adding /command in continue --- .../scripts/create-release-packages.sh | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/.github/workflows/scripts/create-release-packages.sh b/.github/workflows/scripts/create-release-packages.sh index bc850b46f..a35ef0a6b 100644 --- a/.github/workflows/scripts/create-release-packages.sh +++ b/.github/workflows/scripts/create-release-packages.sh @@ -89,6 +89,39 @@ generate_commands() { # Apply other substitutions body=$(printf '%s\n' "$body" | sed "s/{ARGS}/$arg_format/g" | sed "s/__AGENT__/$agent/g" | rewrite_paths) + # If agent is 'continue', prepend special YAML header + if [[ $agent == "continue" ]]; then + # Find description in body and write invokable: true in next line + if [[ -n "$description" ]]; then + # Insert name and invokable fields after the first --- delimiter + body=$(printf '%s' "$body" | awk -v name="$name" ' + BEGIN { in_frontmatter = 0; processed = 0 } + /^---$/ { + print + if (!processed) { + in_frontmatter = 1 + } + next + } + in_frontmatter && /^description:/ && !processed { + print "name: speckit." name + print + print "invokable: true" + processed = 1 + next + } + in_frontmatter && /^[a-zA-Z]/ && !processed { + print "name: speckit." name + print "invokable: true" + print + processed = 1 + in_frontmatter = 0 + } + !in_frontmatter || processed { print } + ') + fi + fi + case $ext in toml) body=$(printf '%s\n' "$body" | sed 's/\\/\\\\/g') From 52bbf82f77569e49fefb8ca3909e40592186746a Mon Sep 17 00:00:00 2001 From: rohit Date: Wed, 22 Oct 2025 11:39:12 +0530 Subject: [PATCH 5/6] Refactor YAML frontmatter insertion into generic function for continue agent support --- .../scripts/create-release-packages.sh | 60 +++++++++++-------- 1 file changed, 35 insertions(+), 25 deletions(-) diff --git a/.github/workflows/scripts/create-release-packages.sh b/.github/workflows/scripts/create-release-packages.sh index 4c92c5b2b..e96fdd43f 100644 --- a/.github/workflows/scripts/create-release-packages.sh +++ b/.github/workflows/scripts/create-release-packages.sh @@ -94,31 +94,7 @@ generate_commands() { # Find description in body and write invokable: true in next line if [[ -n "$description" ]]; then # Insert name and invokable fields after the first --- delimiter - body=$(printf '%s' "$body" | awk -v name="$name" ' - BEGIN { in_frontmatter = 0; processed = 0 } - /^---$/ { - print - if (!processed) { - in_frontmatter = 1 - } - next - } - in_frontmatter && /^description:/ && !processed { - print "name: speckit." name - print - print "invokable: true" - processed = 1 - next - } - in_frontmatter && /^[a-zA-Z]/ && !processed { - print "name: speckit." name - print "invokable: true" - print - processed = 1 - in_frontmatter = 0 - } - !in_frontmatter || processed { print } - ') + body=$(insert_yaml_frontmatter "$body" "$name" "invokable" "true") fi fi @@ -134,6 +110,40 @@ generate_commands() { done } +# Generic function to insert custom YAML frontmatter into prompt files +insert_yaml_frontmatter() { + local body=$1 + local name=$2 + local field_name=$3 + local field_value=$4 + + printf '%s' "$body" | awk -v name="$name" -v field="$field_name" -v value="$field_value" ' + BEGIN { in_frontmatter = 0; processed = 0 } + /^---$/ { + print + if (!processed) { + in_frontmatter = 1 + } + next + } + in_frontmatter && /^description:/ && !processed { + print "name: speckit." name + print + print field ": " value + processed = 1 + next + } + in_frontmatter && /^[a-zA-Z]/ && !processed { + print "name: speckit." name + print field ": " value + print + processed = 1 + in_frontmatter = 0 + } + !in_frontmatter || processed { print } + ' +} + build_variant() { local agent=$1 script=$2 local base_dir="$GENRELEASES_DIR/sdd-${agent}-package-${script}" From 67888c88edd205802d8fd74629f295a4642032c3 Mon Sep 17 00:00:00 2001 From: rohit Date: Wed, 22 Oct 2025 12:57:54 +0530 Subject: [PATCH 6/6] conflict resolve --- src/specify_cli/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/specify_cli/__init__.py b/src/specify_cli/__init__.py index 6fe8fd36c..4353e7791 100644 --- a/src/specify_cli/__init__.py +++ b/src/specify_cli/__init__.py @@ -155,6 +155,7 @@ def _github_auth_headers(cli_token: str | None = None) -> dict: "folder": ".continue/", "install_url": None, # IDE-based "requires_cli": False, + }, } SCRIPT_TYPE_CHOICES = {"sh": "POSIX Shell (bash/zsh)", "ps": "PowerShell"}