Skip to content

Commit 369ed64

Browse files
authored
Merge pull request #462 from lispking/codebuddy
feat: support codebuddy ai
2 parents 07d506f + 6c947cc commit 369ed64

7 files changed

Lines changed: 52 additions & 13 deletions

File tree

.github/workflows/scripts/create-github-release.sh

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ gh release create "$VERSION" \
3838
.genreleases/spec-kit-template-auggie-ps-"$VERSION".zip \
3939
.genreleases/spec-kit-template-roo-sh-"$VERSION".zip \
4040
.genreleases/spec-kit-template-roo-ps-"$VERSION".zip \
41+
.genreleases/spec-kit-template-codebuddy-sh-"$VERSION".zip \
42+
.genreleases/spec-kit-template-codebuddy-ps-"$VERSION".zip \
4143
.genreleases/spec-kit-template-q-sh-"$VERSION".zip \
4244
.genreleases/spec-kit-template-q-ps-"$VERSION".zip \
4345
--title "Spec Kit Templates - $VERSION_NO_V" \

.github/workflows/scripts/create-release-packages.sh

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,10 @@ build_variant() {
177177
roo)
178178
mkdir -p "$base_dir/.roo/commands"
179179
generate_commands roo md "\$ARGUMENTS" "$base_dir/.roo/commands" "$script" ;;
180+
codebuddy)
181+
mkdir -p "$base_dir/.codebuddy/commands"
182+
generate_commands codebuddy md "\$ARGUMENTS" "$base_dir/.codebuddy/commands" "$script" ;;
183+
180184
q)
181185
mkdir -p "$base_dir/.amazonq/prompts"
182186
generate_commands q md "\$ARGUMENTS" "$base_dir/.amazonq/prompts" "$script" ;;
@@ -186,10 +190,9 @@ build_variant() {
186190
}
187191

188192
# Determine agent list
189-
ALL_AGENTS=(claude gemini copilot cursor qwen opencode windsurf codex kilocode auggie roo q)
193+
ALL_AGENTS=(claude gemini copilot cursor qwen opencode windsurf codex kilocode auggie roo codebuddy q)
190194
ALL_SCRIPTS=(sh ps)
191195

192-
193196
norm_list() {
194197
# convert comma+space separated -> space separated unique while preserving order of first occurrence
195198
tr ',\n' ' ' | awk '{for(i=1;i<=NF;i++){if(!seen[$i]++){printf((out?" ":"") $i)}}}END{printf("\n")}'

AGENTS.md

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,9 @@ Specify supports multiple AI agents by generating agent-specific command files a
3838
| **Qwen Code** | `.qwen/commands/` | TOML | `qwen` | Alibaba's Qwen Code CLI |
3939
| **opencode** | `.opencode/command/` | Markdown | `opencode` | opencode CLI |
4040
| **Windsurf** | `.windsurf/workflows/` | Markdown | N/A (IDE-based) | Windsurf IDE workflows |
41+
| **CodeBuddy** | `.codebuddy/commands/` | Markdown | `codebuddy` | CodeBuddy |
4142
| **Amazon Q Developer CLI** | `.amazonq/prompts/` | Markdown | `q` | Amazon Q Developer CLI |
4243

43-
4444
### Step-by-Step Integration Guide
4545

4646
Follow these steps to add a new agent (using Windsurf as an example):
@@ -58,7 +58,8 @@ AI_CHOICES = {
5858
"qwen": "Qwen Code",
5959
"opencode": "opencode",
6060
"windsurf": "Windsurf",
61-
"q": "Amazon Q Developer CLI" # Add new agent here
61+
"codebuddy": "CodeBuddy"
62+
"q": "Amazon Q Developer CLI"
6263
}
6364
```
6465

@@ -72,11 +73,16 @@ agent_folder_map = {
7273
"qwen": ".qwen/",
7374
"opencode": ".opencode/",
7475
"codex": ".codex/",
76+
"windsurf": ".windsurf/",
77+
"kilocode": ".kilocode/",
78+
"auggie": ".auggie/",
79+
"copilot": ".github/",
7580
"windsurf": ".windsurf/",
7681
"kilocode": ".kilocode/",
7782
"auggie": ".auggie/",
7883
"copilot": ".github/",
79-
"q": ".amazonq/" # Add new agent folder here
84+
"q": ".amazonq/",
85+
"codebuddy": ".codebuddy/"
8086
}
8187
```
8288

@@ -201,6 +207,7 @@ Require a command-line tool to be installed:
201207
- **Cursor**: `cursor-agent` CLI
202208
- **Qwen Code**: `qwen` CLI
203209
- **opencode**: `opencode` CLI
210+
- **CodeBuddy**: `codebuddy` CLI
204211

205212
### IDE-Based Agents
206213
Work within integrated development environments:

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ Want to see Spec Kit in action? Watch our [video overview](https://www.youtube.c
137137
| [Windsurf](https://windsurf.com/) || |
138138
| [Kilo Code](https://github.com/Kilo-Org/kilocode) || |
139139
| [Auggie CLI](https://docs.augmentcode.com/cli/overview) || |
140+
| [CodeBuddy](https://www.codebuddy.ai/) || |
140141
| [Roo Code](https://roocode.com/) || |
141142
| [Codex CLI](https://github.com/openai/codex) || |
142143
| [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. |
@@ -157,7 +158,7 @@ The `specify` command supports the following options:
157158
| Argument/Option | Type | Description |
158159
|------------------------|----------|------------------------------------------------------------------------------|
159160
| `<project-name>` | Argument | Name for your new project directory (optional if using `--here`, or use `.` for current directory) |
160-
| `--ai` | Option | AI assistant to use: `claude`, `gemini`, `copilot`, `cursor`, `qwen`, `opencode`, `codex`, `windsurf`, `kilocode`, `auggie`, `roo`, or `q` |
161+
| `--ai` | Option | AI assistant to use: `claude`, `gemini`, `copilot`, `cursor`, `qwen`, `opencode`, `codex`, `windsurf`, `kilocode`, `auggie`, `roo`, `codebuddy`, or `q` |
161162
| `--script` | Option | Script variant to use: `sh` (bash/zsh) or `ps` (PowerShell) |
162163
| `--ignore-agent-tools` | Flag | Skip checks for AI agent tools like Claude Code |
163164
| `--no-git` | Flag | Skip git repository initialization |

scripts/bash/update-agent-context.sh

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ WINDSURF_FILE="$REPO_ROOT/.windsurf/rules/specify-rules.md"
6969
KILOCODE_FILE="$REPO_ROOT/.kilocode/rules/specify-rules.md"
7070
AUGGIE_FILE="$REPO_ROOT/.augment/rules/specify-rules.md"
7171
ROO_FILE="$REPO_ROOT/.roo/rules/specify-rules.md"
72+
CODEBUDDY_FILE="$REPO_ROOT/.codebuddy/rules/specify-rules.md"
7273
Q_FILE="$REPO_ROOT/AGENTS.md"
7374

7475
# Template file
@@ -581,6 +582,9 @@ update_specific_agent() {
581582
roo)
582583
update_agent_file "$ROO_FILE" "Roo Code"
583584
;;
585+
codebuddy)
586+
update_agent_file "$CODEBUDDY_FILE" "CodeBuddy"
587+
;;
584588
q)
585589
update_agent_file "$Q_FILE" "Amazon Q Developer CLI"
586590
;;
@@ -646,6 +650,11 @@ update_all_existing_agents() {
646650
found_agent=true
647651
fi
648652

653+
if [[ -f "$CODEBUDDY_FILE" ]]; then
654+
update_agent_file "$CODEBUDDY_FILE" "CodeBuddy"
655+
found_agent=true
656+
fi
657+
649658
if [[ -f "$Q_FILE" ]]; then
650659
update_agent_file "$Q_FILE" "Amazon Q Developer CLI"
651660
found_agent=true
@@ -674,7 +683,8 @@ print_summary() {
674683
fi
675684

676685
echo
677-
log_info "Usage: $0 [claude|gemini|copilot|cursor|qwen|opencode|codex|windsurf|kilocode|auggie|q]"
686+
687+
log_info "Usage: $0 [claude|gemini|copilot|cursor|qwen|opencode|codex|windsurf|kilocode|auggie|codebuddy|q]"
678688
}
679689

680690
#==============================================================================

scripts/powershell/update-agent-context.ps1

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ Relies on common helper functions in common.ps1
2525
#>
2626
param(
2727
[Parameter(Position=0)]
28-
[ValidateSet('claude','gemini','copilot','cursor','qwen','opencode','codex','windsurf','kilocode','auggie','roo','q')]
28+
[ValidateSet('claude','gemini','copilot','cursor','qwen','opencode','codex','windsurf','kilocode','auggie','roo','codebuddy','q')]
2929
[string]$AgentType
3030
)
3131

@@ -54,6 +54,7 @@ $WINDSURF_FILE = Join-Path $REPO_ROOT '.windsurf/rules/specify-rules.md'
5454
$KILOCODE_FILE = Join-Path $REPO_ROOT '.kilocode/rules/specify-rules.md'
5555
$AUGGIE_FILE = Join-Path $REPO_ROOT '.augment/rules/specify-rules.md'
5656
$ROO_FILE = Join-Path $REPO_ROOT '.roo/rules/specify-rules.md'
57+
$CODEBUDDY_FILE = Join-Path $REPO_ROOT '.codebuddy/rules/specify-rules.md'
5758
$Q_FILE = Join-Path $REPO_ROOT 'AGENTS.md'
5859

5960
$TEMPLATE_FILE = Join-Path $REPO_ROOT '.specify/templates/agent-file-template.md'
@@ -377,8 +378,10 @@ function Update-SpecificAgent {
377378
'kilocode' { Update-AgentFile -TargetFile $KILOCODE_FILE -AgentName 'Kilo Code' }
378379
'auggie' { Update-AgentFile -TargetFile $AUGGIE_FILE -AgentName 'Auggie CLI' }
379380
'roo' { Update-AgentFile -TargetFile $ROO_FILE -AgentName 'Roo Code' }
381+
'codebuddy' { Update-AgentFile -TargetFile $CODEBUDDY_FILE -AgentName 'CodeBuddy' }
380382
'q' { Update-AgentFile -TargetFile $Q_FILE -AgentName 'Amazon Q Developer CLI' }
381-
default { Write-Err "Unknown agent type '$Type'"; Write-Err 'Expected: claude|gemini|copilot|cursor|qwen|opencode|codex|windsurf|kilocode|auggie|roo|q'; return $false }
383+
default { Write-Err "Unknown agent type '$Type'"; Write-Err 'Expected: claude|gemini|copilot|cursor|qwen|opencode|codex|windsurf|kilocode|auggie|roo|codebuddy|q'; return $false }
384+
382385
}
383386
}
384387

@@ -395,6 +398,7 @@ function Update-AllExistingAgents {
395398
if (Test-Path $KILOCODE_FILE) { if (-not (Update-AgentFile -TargetFile $KILOCODE_FILE -AgentName 'Kilo Code')) { $ok = $false }; $found = $true }
396399
if (Test-Path $AUGGIE_FILE) { if (-not (Update-AgentFile -TargetFile $AUGGIE_FILE -AgentName 'Auggie CLI')) { $ok = $false }; $found = $true }
397400
if (Test-Path $ROO_FILE) { if (-not (Update-AgentFile -TargetFile $ROO_FILE -AgentName 'Roo Code')) { $ok = $false }; $found = $true }
401+
if (Test-Path $CODEBUDDY_FILE) { if (-not (Update-AgentFile -TargetFile $CODEBUDDY_FILE -AgentName 'CodeBuddy')) { $ok = $false }; $found = $true }
398402
if (Test-Path $Q_FILE) { if (-not (Update-AgentFile -TargetFile $Q_FILE -AgentName 'Amazon Q Developer CLI')) { $ok = $false }; $found = $true }
399403
if (-not $found) {
400404
Write-Info 'No existing agent files found, creating default Claude file...'
@@ -410,7 +414,7 @@ function Print-Summary {
410414
if ($NEW_FRAMEWORK) { Write-Host " - Added framework: $NEW_FRAMEWORK" }
411415
if ($NEW_DB -and $NEW_DB -ne 'N/A') { Write-Host " - Added database: $NEW_DB" }
412416
Write-Host ''
413-
Write-Info 'Usage: ./update-agent-context.ps1 [-AgentType claude|gemini|copilot|cursor|qwen|opencode|codex|windsurf|kilocode|auggie|roo|q]'
417+
Write-Info 'Usage: ./update-agent-context.ps1 [-AgentType claude|gemini|copilot|cursor|qwen|opencode|codex|windsurf|kilocode|auggie|roo|codebuddy|q]'
414418
}
415419

416420
function Main {

src/specify_cli/__init__.py

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ def _github_auth_headers(cli_token: str | None = None) -> dict:
7575
"windsurf": "Windsurf",
7676
"kilocode": "Kilo Code",
7777
"auggie": "Auggie CLI",
78+
"codebuddy": "CodeBuddy",
7879
"roo": "Roo Code",
7980
"q": "Amazon Q Developer CLI",
8081
}
@@ -722,7 +723,7 @@ def ensure_executable_scripts(project_path: Path, tracker: StepTracker | None =
722723
@app.command()
723724
def init(
724725
project_name: str = typer.Argument(None, help="Name for your new project directory (optional if using --here, or use '.' for current directory)"),
725-
ai_assistant: str = typer.Option(None, "--ai", help="AI assistant to use: claude, gemini, copilot, cursor, qwen, opencode, codex, windsurf, kilocode, auggie or q"),
726+
ai_assistant: str = typer.Option(None, "--ai", help="AI assistant to use: claude, gemini, copilot, cursor, qwen, opencode, codex, windsurf, kilocode, auggie, codebuddy, or q"),
726727
script_type: str = typer.Option(None, "--script", help="Script type to use: sh or ps"),
727728
ignore_agent_tools: bool = typer.Option(False, "--ignore-agent-tools", help="Skip checks for AI agent tools like Claude Code"),
728729
no_git: bool = typer.Option(False, "--no-git", help="Skip git repository initialization"),
@@ -737,7 +738,7 @@ def init(
737738
738739
This command will:
739740
1. Check that required tools are installed (git is optional)
740-
2. Let you choose your AI assistant (Claude Code, Gemini CLI, GitHub Copilot, Cursor, Qwen Code, opencode, Codex CLI, Windsurf, Kilo Code, Auggie CLI, or Amazon Q Developer CLI)
741+
2. Let you choose your AI assistant
741742
3. Download the appropriate template from GitHub
742743
4. Extract the template to a new project directory or current directory
743744
5. Initialize a fresh git repository (if not --no-git and no existing repo)
@@ -752,6 +753,7 @@ def init(
752753
specify init . # Initialize in current directory (interactive AI selection)
753754
specify init --here --ai claude # Alternative syntax for current directory
754755
specify init --here --ai codex
756+
specify init --here --ai codebuddy
755757
specify init --here
756758
specify init --here --force # Skip confirmation when current directory not empty
757759
"""
@@ -864,6 +866,10 @@ def init(
864866
if not check_tool("auggie", "https://docs.augmentcode.com/cli/setup-auggie/install-auggie-cli"):
865867
install_url = "https://docs.augmentcode.com/cli/setup-auggie/install-auggie-cli"
866868
agent_tool_missing = True
869+
elif selected_ai == "codebuddy":
870+
if not check_tool("codebuddy", "https://www.codebuddy.ai"):
871+
install_url = "https://www.codebuddy.ai"
872+
agent_tool_missing = True
867873
elif selected_ai == "q":
868874
if not check_tool("q", "https://github.com/aws/amazon-q-developer-cli"):
869875
install_url = "https://aws.amazon.com/developer/learning/q-developer-cli/"
@@ -991,6 +997,7 @@ def init(
991997
"windsurf": ".windsurf/",
992998
"kilocode": ".kilocode/",
993999
"auggie": ".augment/",
1000+
"codebuddy": ".codebuddy/",
9941001
"copilot": ".github/",
9951002
"roo": ".roo/",
9961003
"q": ".amazonq/"
@@ -1072,6 +1079,8 @@ def check():
10721079
tracker.add("opencode", "opencode")
10731080
tracker.add("codex", "Codex CLI")
10741081
tracker.add("auggie", "Auggie CLI")
1082+
tracker.add("roo", "Roo Code")
1083+
tracker.add("codebuddy", "CodeBuddy")
10751084
tracker.add("q", "Amazon Q Developer CLI")
10761085

10771086
git_ok = check_tool_for_tracker("git", tracker)
@@ -1086,6 +1095,8 @@ def check():
10861095
opencode_ok = check_tool_for_tracker("opencode", tracker)
10871096
codex_ok = check_tool_for_tracker("codex", tracker)
10881097
auggie_ok = check_tool_for_tracker("auggie", tracker)
1098+
roo_ok = check_tool_for_tracker("roo", tracker)
1099+
codebuddy_ok = check_tool_for_tracker("codebuddy", tracker)
10891100
q_ok = check_tool_for_tracker("q", tracker)
10901101

10911102
console.print(tracker.render())
@@ -1094,7 +1105,8 @@ def check():
10941105

10951106
if not git_ok:
10961107
console.print("[dim]Tip: Install git for repository management[/dim]")
1097-
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 or q_ok):
1108+
1109+
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 or codebuddy_ok or q_ok):
10981110
console.print("[dim]Tip: Install an AI assistant for the best experience[/dim]")
10991111

11001112
def main():

0 commit comments

Comments
 (0)