From 46b7feab5a83fc15b3f0bccd522fc7415c4761d5 Mon Sep 17 00:00:00 2001 From: root Date: Thu, 12 Mar 2026 18:22:49 +0800 Subject: [PATCH 1/9] feat: add Trae IDE support as a new agent Add Trae (https://www.trae.ai/) as a supported AI agent in spec-kit. Trae is an IDE-based agent that uses .trae/rules/ directory for project-level rules in Markdown format. Changes across 9 files: - src/specify_cli/__init__.py: Add trae to AGENT_CONFIG (IDE-based, .trae/ folder, rules subdir, no CLI required) - src/specify_cli/extensions.py: Add trae to CommandRegistrar.AGENT_CONFIGS (.trae/rules, markdown format, .md extension) - README.md: Add Trae to supported agents table, CLI examples, and --ai option description - .github/workflows/scripts/create-release-packages.sh: Add trae to ALL_AGENTS array and build case statement - .github/workflows/scripts/create-release-packages.ps1: Add trae to AllAgents array and switch statement - .github/workflows/scripts/create-github-release.sh: Add trae template zip files to release assets - scripts/bash/update-agent-context.sh: Add TRAE_FILE, trae case in update function, and auto-detect block - scripts/powershell/update-agent-context.ps1: Add TRAE_FILE, ValidateSet entry, switch case, and auto-detect block - tests/test_agent_config_consistency.py: Add 8 consistency tests for trae following established kimi/tabnine patterns --- .../scripts/create-github-release.sh | 2 + .../scripts/create-release-packages.ps1 | 9 ++- .../scripts/create-release-packages.sh | 7 +- README.md | 6 +- scripts/bash/update-agent-context.sh | 15 +++- scripts/powershell/update-agent-context.ps1 | 9 ++- src/specify_cli/__init__.py | 7 ++ src/specify_cli/extensions.py | 8 +- tests/test_agent_config_consistency.py | 77 +++++++++++++++++++ 9 files changed, 128 insertions(+), 12 deletions(-) diff --git a/.github/workflows/scripts/create-github-release.sh b/.github/workflows/scripts/create-github-release.sh index 864e0011b..b57778384 100755 --- a/.github/workflows/scripts/create-github-release.sh +++ b/.github/workflows/scripts/create-github-release.sh @@ -58,6 +58,8 @@ gh release create "$VERSION" \ .genreleases/spec-kit-template-vibe-ps-"$VERSION".zip \ .genreleases/spec-kit-template-kimi-sh-"$VERSION".zip \ .genreleases/spec-kit-template-kimi-ps-"$VERSION".zip \ + .genreleases/spec-kit-template-trae-sh-"$VERSION".zip \ + .genreleases/spec-kit-template-trae-ps-"$VERSION".zip \ .genreleases/spec-kit-template-generic-sh-"$VERSION".zip \ .genreleases/spec-kit-template-generic-ps-"$VERSION".zip \ --title "Spec Kit Templates - $VERSION_NO_V" \ diff --git a/.github/workflows/scripts/create-release-packages.ps1 b/.github/workflows/scripts/create-release-packages.ps1 index 8c7d4078f..2e48700b9 100644 --- a/.github/workflows/scripts/create-release-packages.ps1 +++ b/.github/workflows/scripts/create-release-packages.ps1 @@ -14,7 +14,7 @@ .PARAMETER Agents Comma or space separated subset of agents to build (default: all) - Valid agents: claude, gemini, copilot, cursor-agent, qwen, opencode, windsurf, codex, kilocode, auggie, roo, codebuddy, amp, kiro-cli, bob, qodercli, shai, tabnine, agy, vibe, kimi, generic + Valid agents: claude, gemini, copilot, cursor-agent, qwen, opencode, windsurf, codex, kilocode, auggie, roo, codebuddy, amp, kiro-cli, bob, qodercli, shai, tabnine, agy, vibe, kimi, trae, generic .PARAMETER Scripts Comma or space separated subset of script types to build (default: both) @@ -454,6 +454,11 @@ function Build-Variant { New-Item -ItemType Directory -Force -Path $skillsDir | Out-Null New-KimiSkills -SkillsDir $skillsDir -ScriptVariant $Script } + 'trae' { + $rulesDir = Join-Path $baseDir ".trae/rules" + New-Item -ItemType Directory -Force -Path $rulesDir | Out-Null + Generate-Commands -Agent 'trae' -Format 'md' -ArgsToken '$ARGUMENTS' -OutDir $rulesDir -ScriptVariant $script + } 'generic' { $cmdDir = Join-Path $baseDir ".speckit/commands" Generate-Commands -Agent 'generic' -Extension 'md' -ArgFormat '$ARGUMENTS' -OutputDir $cmdDir -ScriptVariant $Script @@ -470,7 +475,7 @@ function Build-Variant { } # Define all agents and scripts -$AllAgents = @('claude', 'gemini', 'copilot', 'cursor-agent', 'qwen', 'opencode', 'windsurf', 'codex', 'kilocode', 'auggie', 'roo', 'codebuddy', 'amp', 'kiro-cli', 'bob', 'qodercli', 'shai', 'tabnine', 'agy', 'vibe', 'kimi', 'generic') +$AllAgents = @('claude', 'gemini', 'copilot', 'cursor-agent', 'qwen', 'opencode', 'windsurf', 'codex', 'kilocode', 'auggie', 'roo', 'codebuddy', 'amp', 'kiro-cli', 'bob', 'qodercli', 'shai', 'tabnine', 'agy', 'vibe', 'kimi', 'trae', 'generic') $AllScripts = @('sh', 'ps') function Normalize-List { diff --git a/.github/workflows/scripts/create-release-packages.sh b/.github/workflows/scripts/create-release-packages.sh index 8be5a0549..5f059c2b4 100755 --- a/.github/workflows/scripts/create-release-packages.sh +++ b/.github/workflows/scripts/create-release-packages.sh @@ -6,7 +6,7 @@ set -euo pipefail # Usage: .github/workflows/scripts/create-release-packages.sh # Version argument should include leading 'v'. # Optionally set AGENTS and/or SCRIPTS env vars to limit what gets built. -# AGENTS : space or comma separated subset of: claude gemini copilot cursor-agent qwen opencode windsurf codex kilocode auggie roo codebuddy amp shai tabnine kiro-cli agy bob vibe qodercli kimi generic (default: all) +# AGENTS : space or comma separated subset of: claude gemini copilot cursor-agent qwen opencode windsurf codex kilocode auggie roo codebuddy amp shai tabnine kiro-cli agy bob vibe qodercli kimi trae generic (default: all) # SCRIPTS : space or comma separated subset of: sh ps (default: both) # Examples: # AGENTS=claude SCRIPTS=sh $0 v0.2.0 @@ -291,6 +291,9 @@ build_variant() { kimi) mkdir -p "$base_dir/.kimi/skills" create_kimi_skills "$base_dir/.kimi/skills" "$script" ;; + trae) + mkdir -p "$base_dir/.trae/rules" + generate_commands trae md "\$ARGUMENTS" "$base_dir/.trae/rules" "$script" ;; generic) mkdir -p "$base_dir/.speckit/commands" generate_commands generic md "\$ARGUMENTS" "$base_dir/.speckit/commands" "$script" ;; @@ -300,7 +303,7 @@ build_variant() { } # Determine agent list -ALL_AGENTS=(claude gemini copilot cursor-agent qwen opencode windsurf codex kilocode auggie roo codebuddy amp shai tabnine kiro-cli agy bob vibe qodercli kimi generic) +ALL_AGENTS=(claude gemini copilot cursor-agent qwen opencode windsurf codex kilocode auggie roo codebuddy amp shai tabnine kiro-cli agy bob vibe qodercli kimi trae generic) ALL_SCRIPTS=(sh ps) norm_list() { diff --git a/README.md b/README.md index 5aca4901c..11d52db91 100644 --- a/README.md +++ b/README.md @@ -182,6 +182,7 @@ See Spec-Driven Development in action across different scenarios with these comm | [Kimi Code](https://code.kimi.com/) | ✅ | | | [Windsurf](https://windsurf.com/) | ✅ | | | [Antigravity (agy)](https://antigravity.google/) | ✅ | | +| [Trae](https://www.trae.ai/) | ✅ | | | Generic | ✅ | Bring your own agent — use `--ai generic --ai-commands-dir ` for unsupported agents | ## 🔧 Specify CLI Reference @@ -200,7 +201,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`, `amp`, `shai`, `kiro-cli` (`kiro` alias), `agy`, `bob`, `qodercli`, `vibe`, `kimi`, or `generic` (requires `--ai-commands-dir`) | +| `--ai` | Option | AI assistant to use: `claude`, `gemini`, `copilot`, `cursor-agent`, `qwen`, `opencode`, `codex`, `windsurf`, `kilocode`, `auggie`, `roo`, `codebuddy`, `amp`, `shai`, `kiro-cli` (`kiro` alias), `agy`, `bob`, `qodercli`, `vibe`, `kimi`, `trae`, or `generic` (requires `--ai-commands-dir`) | | `--ai-commands-dir` | Option | Directory for agent command files (required with `--ai generic`, e.g. `.myagent/commands/`) | | `--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 | @@ -248,6 +249,9 @@ specify init my-project --ai bob # Initialize with Antigravity support specify init my-project --ai agy +# Initialize with Trae support +specify init my-project --ai trae + # Initialize with an unsupported agent (generic / bring your own agent) specify init my-project --ai generic --ai-commands-dir .myagent/commands/ diff --git a/scripts/bash/update-agent-context.sh b/scripts/bash/update-agent-context.sh index b0022fd45..9f802bef9 100644 --- a/scripts/bash/update-agent-context.sh +++ b/scripts/bash/update-agent-context.sh @@ -35,7 +35,7 @@ # - Creates default Claude file if no agent files exist # # Usage: ./update-agent-context.sh [agent_type] -# Agent types: claude|gemini|copilot|cursor-agent|qwen|opencode|codex|windsurf|kilocode|auggie|roo|codebuddy|amp|shai|tabnine|kiro-cli|agy|bob|vibe|qodercli|kimi|generic +# Agent types: claude|gemini|copilot|cursor-agent|qwen|opencode|codex|windsurf|kilocode|auggie|roo|codebuddy|amp|shai|tabnine|kiro-cli|agy|bob|vibe|qodercli|kimi|trae|generic # Leave empty to update all existing agent files set -e @@ -79,6 +79,7 @@ AGY_FILE="$REPO_ROOT/.agent/rules/specify-rules.md" BOB_FILE="$REPO_ROOT/AGENTS.md" VIBE_FILE="$REPO_ROOT/.vibe/agents/specify-agents.md" KIMI_FILE="$REPO_ROOT/KIMI.md" +TRAE_FILE="$REPO_ROOT/.trae/rules/AGENTS.md" # Template file TEMPLATE_FILE="$REPO_ROOT/.specify/templates/agent-file-template.md" @@ -669,12 +670,15 @@ update_specific_agent() { kimi) update_agent_file "$KIMI_FILE" "Kimi Code" ;; + trae) + update_agent_file "$TRAE_FILE" "Trae" + ;; generic) log_info "Generic agent: no predefined context file. Use the agent-specific update script for your agent." ;; *) log_error "Unknown agent type '$agent_type'" - log_error "Expected: claude|gemini|copilot|cursor-agent|qwen|opencode|codex|windsurf|kilocode|auggie|roo|codebuddy|amp|shai|tabnine|kiro-cli|agy|bob|vibe|qodercli|kimi|generic" + log_error "Expected: claude|gemini|copilot|cursor-agent|qwen|opencode|codex|windsurf|kilocode|auggie|roo|codebuddy|amp|shai|tabnine|kiro-cli|agy|bob|vibe|qodercli|kimi|trae|generic" exit 1 ;; esac @@ -778,6 +782,11 @@ update_all_existing_agents() { found_agent=true fi + if [[ -f "$TRAE_FILE" ]]; then + update_agent_file "$TRAE_FILE" "Trae" + 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..." @@ -801,7 +810,7 @@ print_summary() { fi echo - log_info "Usage: $0 [claude|gemini|copilot|cursor-agent|qwen|opencode|codex|windsurf|kilocode|auggie|roo|codebuddy|amp|shai|tabnine|kiro-cli|agy|bob|vibe|qodercli|kimi|generic]" + log_info "Usage: $0 [claude|gemini|copilot|cursor-agent|qwen|opencode|codex|windsurf|kilocode|auggie|roo|codebuddy|amp|shai|tabnine|kiro-cli|agy|bob|vibe|qodercli|kimi|trae|generic]" } #============================================================================== diff --git a/scripts/powershell/update-agent-context.ps1 b/scripts/powershell/update-agent-context.ps1 index 95e636ba1..40b44e18b 100644 --- a/scripts/powershell/update-agent-context.ps1 +++ b/scripts/powershell/update-agent-context.ps1 @@ -9,7 +9,7 @@ Mirrors the behavior of scripts/bash/update-agent-context.sh: 2. Plan Data Extraction 3. Agent File Management (create from template or update existing) 4. Content Generation (technology stack, recent changes, timestamp) - 5. Multi-Agent Support (claude, gemini, copilot, cursor-agent, qwen, opencode, codex, windsurf, kilocode, auggie, roo, codebuddy, amp, shai, tabnine, kiro-cli, agy, bob, vibe, qodercli, kimi, generic) + 5. Multi-Agent Support (claude, gemini, copilot, cursor-agent, qwen, opencode, codex, windsurf, kilocode, auggie, roo, codebuddy, amp, shai, tabnine, kiro-cli, agy, bob, vibe, qodercli, kimi, trae, generic) .PARAMETER AgentType Optional agent key to update a single agent. If omitted, updates all existing agent files (creating a default Claude file if none exist). @@ -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','shai','tabnine','kiro-cli','agy','bob','qodercli','vibe','kimi','generic')] + [ValidateSet('claude','gemini','copilot','cursor-agent','qwen','opencode','codex','windsurf','kilocode','auggie','roo','codebuddy','amp','shai','tabnine','kiro-cli','agy','bob','qodercli','vibe','kimi','trae','generic')] [string]$AgentType ) @@ -64,6 +64,7 @@ $AGY_FILE = Join-Path $REPO_ROOT '.agent/rules/specify-rules.md' $BOB_FILE = Join-Path $REPO_ROOT 'AGENTS.md' $VIBE_FILE = Join-Path $REPO_ROOT '.vibe/agents/specify-agents.md' $KIMI_FILE = Join-Path $REPO_ROOT 'KIMI.md' +$TRAE_FILE = Join-Path $REPO_ROOT '.trae/rules/AGENTS.md' $TEMPLATE_FILE = Join-Path $REPO_ROOT '.specify/templates/agent-file-template.md' @@ -408,8 +409,9 @@ function Update-SpecificAgent { 'bob' { Update-AgentFile -TargetFile $BOB_FILE -AgentName 'IBM Bob' } 'vibe' { Update-AgentFile -TargetFile $VIBE_FILE -AgentName 'Mistral Vibe' } 'kimi' { Update-AgentFile -TargetFile $KIMI_FILE -AgentName 'Kimi Code' } + 'trae' { Update-AgentFile -TargetFile $TRAE_FILE -AgentName 'Trae' } 'generic' { Write-Info 'Generic agent: no predefined context file. Use the agent-specific update script for your agent.' } - default { Write-Err "Unknown agent type '$Type'"; Write-Err 'Expected: claude|gemini|copilot|cursor-agent|qwen|opencode|codex|windsurf|kilocode|auggie|roo|codebuddy|amp|shai|tabnine|kiro-cli|agy|bob|vibe|qodercli|kimi|generic'; return $false } + default { Write-Err "Unknown agent type '$Type'"; Write-Err 'Expected: claude|gemini|copilot|cursor-agent|qwen|opencode|codex|windsurf|kilocode|auggie|roo|codebuddy|amp|shai|tabnine|kiro-cli|agy|bob|vibe|qodercli|kimi|trae|generic'; return $false } } } @@ -435,6 +437,7 @@ function Update-AllExistingAgents { if (Test-Path $BOB_FILE) { if (-not (Update-AgentFile -TargetFile $BOB_FILE -AgentName 'IBM Bob')) { $ok = $false }; $found = $true } if (Test-Path $VIBE_FILE) { if (-not (Update-AgentFile -TargetFile $VIBE_FILE -AgentName 'Mistral Vibe')) { $ok = $false }; $found = $true } if (Test-Path $KIMI_FILE) { if (-not (Update-AgentFile -TargetFile $KIMI_FILE -AgentName 'Kimi Code')) { $ok = $false }; $found = $true } + if (Test-Path $TRAE_FILE) { if (-not (Update-AgentFile -TargetFile $TRAE_FILE -AgentName 'Trae')) { $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 dac7eaa54..58b63b8de 100644 --- a/src/specify_cli/__init__.py +++ b/src/specify_cli/__init__.py @@ -272,6 +272,13 @@ def _format_rate_limit_error(status_code: int, headers: httpx.Headers, url: str) "install_url": "https://code.kimi.com/", "requires_cli": True, }, + "trae": { + "name": "Trae", + "folder": ".trae/", + "commands_subdir": "rules", # Trae uses .trae/rules/ for project rules + "install_url": None, # IDE-based + "requires_cli": False, + }, "generic": { "name": "Generic (bring your own agent)", "folder": None, # Set dynamically via --ai-commands-dir diff --git a/src/specify_cli/extensions.py b/src/specify_cli/extensions.py index 383ed2154..443ea1e69 100644 --- a/src/specify_cli/extensions.py +++ b/src/specify_cli/extensions.py @@ -779,7 +779,13 @@ class CommandRegistrar: "format": "markdown", "args": "$ARGUMENTS", "extension": "/SKILL.md" - } + }, + "trae": { + "dir": ".trae/rules", + "format": "markdown", + "args": "$ARGUMENTS", + "extension": ".md" + }, } @staticmethod diff --git a/tests/test_agent_config_consistency.py b/tests/test_agent_config_consistency.py index d77c6f10d..b8ba9ccc3 100644 --- a/tests/test_agent_config_consistency.py +++ b/tests/test_agent_config_consistency.py @@ -226,3 +226,80 @@ def test_kimi_in_github_release_output(self): def test_ai_help_includes_kimi(self): """CLI help text for --ai should include kimi.""" assert "kimi" in AI_ASSISTANT_HELP + + # --- Trae IDE consistency checks --- + + def test_trae_in_agent_config(self): + """AGENT_CONFIG should include trae with correct folder and commands_subdir.""" + assert "trae" in AGENT_CONFIG + assert AGENT_CONFIG["trae"]["folder"] == ".trae/" + assert AGENT_CONFIG["trae"]["commands_subdir"] == "rules" + assert AGENT_CONFIG["trae"]["requires_cli"] is False + assert AGENT_CONFIG["trae"]["install_url"] is None + + def test_trae_in_extension_registrar(self): + """Extension command registrar should include trae using .trae/rules and markdown.""" + cfg = CommandRegistrar.AGENT_CONFIGS + + assert "trae" in cfg + trae_cfg = cfg["trae"] + assert trae_cfg["dir"] == ".trae/rules" + assert trae_cfg["format"] == "markdown" + assert trae_cfg["args"] == "$ARGUMENTS" + assert trae_cfg["extension"] == ".md" + + def test_trae_in_release_agent_lists(self): + """Bash and PowerShell release scripts should include trae in agent lists.""" + sh_text = (REPO_ROOT / ".github" / "workflows" / "scripts" / "create-release-packages.sh").read_text(encoding="utf-8") + ps_text = (REPO_ROOT / ".github" / "workflows" / "scripts" / "create-release-packages.ps1").read_text(encoding="utf-8") + + sh_match = re.search(r"ALL_AGENTS=\(([^)]*)\)", sh_text) + assert sh_match is not None + sh_agents = sh_match.group(1).split() + + ps_match = re.search(r"\$AllAgents = @\(([^)]*)\)", ps_text) + assert ps_match is not None + ps_agents = re.findall(r"'([^']+)'", ps_match.group(1)) + + assert "trae" in sh_agents + assert "trae" in ps_agents + + def test_trae_in_release_scripts_generate_commands(self): + """Release scripts should generate markdown commands for trae in .trae/rules.""" + sh_text = (REPO_ROOT / ".github" / "workflows" / "scripts" / "create-release-packages.sh").read_text(encoding="utf-8") + ps_text = (REPO_ROOT / ".github" / "workflows" / "scripts" / "create-release-packages.ps1").read_text(encoding="utf-8") + + assert ".trae/rules" in sh_text + assert ".trae/rules" in ps_text + assert re.search(r"'trae'\s*\{.*?\.trae/rules", ps_text, re.S) is not None + + def test_trae_in_github_release_output(self): + """GitHub release script should include trae template packages.""" + gh_release_text = (REPO_ROOT / ".github" / "workflows" / "scripts" / "create-github-release.sh").read_text(encoding="utf-8") + + assert "spec-kit-template-trae-sh-" in gh_release_text + assert "spec-kit-template-trae-ps-" in gh_release_text + + def test_trae_in_agent_context_scripts(self): + """Agent context scripts should support trae agent type.""" + bash_text = (REPO_ROOT / "scripts" / "bash" / "update-agent-context.sh").read_text(encoding="utf-8") + pwsh_text = (REPO_ROOT / "scripts" / "powershell" / "update-agent-context.ps1").read_text(encoding="utf-8") + + assert "trae" in bash_text + assert "TRAE_FILE" in bash_text + assert "trae" in pwsh_text + assert "TRAE_FILE" in pwsh_text + + def test_trae_in_powershell_validate_set(self): + """PowerShell update-agent-context script should include 'trae' in ValidateSet.""" + ps_text = (REPO_ROOT / "scripts" / "powershell" / "update-agent-context.ps1").read_text(encoding="utf-8") + + validate_set_match = re.search(r"\[ValidateSet\(([^)]*)\)\]", ps_text) + assert validate_set_match is not None + validate_set_values = re.findall(r"'([^']+)'", validate_set_match.group(1)) + + assert "trae" in validate_set_values + + def test_ai_help_includes_trae(self): + """CLI help text for --ai should include trae.""" + assert "trae" in AI_ASSISTANT_HELP From 5e162dd856a27f291317e91beb1498d82ab157df Mon Sep 17 00:00:00 2001 From: root Date: Fri, 13 Mar 2026 11:16:49 +0800 Subject: [PATCH 2/9] fix: correct Generate-Commands parameter names for trae in PowerShell release script Fix incorrect parameter names in the trae case of Build-Variant: - -Format -> -Extension - -ArgsToken -> -ArgFormat - -OutDir -> -OutputDir These now match the Generate-Commands function signature and all other agent entries in the script. Co-authored-by: Copilot --- .github/workflows/scripts/create-release-packages.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/scripts/create-release-packages.ps1 b/.github/workflows/scripts/create-release-packages.ps1 index 2e48700b9..aafc9927f 100644 --- a/.github/workflows/scripts/create-release-packages.ps1 +++ b/.github/workflows/scripts/create-release-packages.ps1 @@ -457,7 +457,7 @@ function Build-Variant { 'trae' { $rulesDir = Join-Path $baseDir ".trae/rules" New-Item -ItemType Directory -Force -Path $rulesDir | Out-Null - Generate-Commands -Agent 'trae' -Format 'md' -ArgsToken '$ARGUMENTS' -OutDir $rulesDir -ScriptVariant $script + Generate-Commands -Agent 'trae' -Extension 'md' -ArgFormat '$ARGUMENTS' -OutputDir $rulesDir -ScriptVariant $script } 'generic' { $cmdDir = Join-Path $baseDir ".speckit/commands" From bc7517f76a94a9c0459a6ab739479e84ca532b3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E5=B9=BF?= Date: Fri, 13 Mar 2026 22:54:46 +0800 Subject: [PATCH 3/9] Update release packaging scripts and agent docs --- .../scripts/create-release-packages.ps1 | 2 +- AGENTS.md | 47 ++++++++++--------- 2 files changed, 25 insertions(+), 24 deletions(-) diff --git a/.github/workflows/scripts/create-release-packages.ps1 b/.github/workflows/scripts/create-release-packages.ps1 index 2e48700b9..7fead12e6 100644 --- a/.github/workflows/scripts/create-release-packages.ps1 +++ b/.github/workflows/scripts/create-release-packages.ps1 @@ -457,7 +457,7 @@ function Build-Variant { 'trae' { $rulesDir = Join-Path $baseDir ".trae/rules" New-Item -ItemType Directory -Force -Path $rulesDir | Out-Null - Generate-Commands -Agent 'trae' -Format 'md' -ArgsToken '$ARGUMENTS' -OutDir $rulesDir -ScriptVariant $script + Generate-Commands -Agent 'trae' -Extension 'md' -ArgFormat '$ARGUMENTS' -OutputDir $rulesDir -ScriptVariant $Script } 'generic' { $cmdDir = Join-Path $baseDir ".speckit/commands" diff --git a/AGENTS.md b/AGENTS.md index aa3730222..4b70703ab 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -29,28 +29,29 @@ Specify supports multiple AI agents by generating agent-specific command files a ### Current Supported Agents -| Agent | Directory | Format | CLI Tool | Description | -| -------------------------- | ---------------------- | -------- | --------------- | --------------------------- | -| **Claude Code** | `.claude/commands/` | Markdown | `claude` | Anthropic's Claude Code CLI | -| **Gemini CLI** | `.gemini/commands/` | TOML | `gemini` | Google's Gemini CLI | -| **GitHub Copilot** | `.github/agents/` | Markdown | N/A (IDE-based) | GitHub Copilot in VS Code | -| **Cursor** | `.cursor/commands/` | Markdown | `cursor-agent` | Cursor CLI | -| **Qwen Code** | `.qwen/commands/` | TOML | `qwen` | Alibaba's Qwen Code CLI | -| **opencode** | `.opencode/command/` | Markdown | `opencode` | opencode CLI | -| **Codex CLI** | `.codex/commands/` | Markdown | `codex` | Codex CLI | -| **Windsurf** | `.windsurf/workflows/` | Markdown | N/A (IDE-based) | Windsurf IDE workflows | -| **Kilo Code** | `.kilocode/rules/` | Markdown | N/A (IDE-based) | Kilo Code IDE | -| **Auggie CLI** | `.augment/rules/` | Markdown | `auggie` | Auggie CLI | -| **Roo Code** | `.roo/rules/` | Markdown | N/A (IDE-based) | Roo Code IDE | -| **CodeBuddy CLI** | `.codebuddy/commands/` | Markdown | `codebuddy` | CodeBuddy CLI | -| **Qoder CLI** | `.qoder/commands/` | Markdown | `qodercli` | Qoder CLI | -| **Kiro CLI** | `.kiro/prompts/` | Markdown | `kiro-cli` | Kiro CLI | -| **Amp** | `.agents/commands/` | Markdown | `amp` | Amp CLI | -| **SHAI** | `.shai/commands/` | Markdown | `shai` | SHAI CLI | -| **Tabnine CLI** | `.tabnine/agent/commands/` | TOML | `tabnine` | Tabnine CLI | -| **Kimi Code** | `.kimi/skills/` | Markdown | `kimi` | Kimi Code CLI (Moonshot AI) | -| **IBM Bob** | `.bob/commands/` | Markdown | N/A (IDE-based) | IBM Bob IDE | -| **Generic** | User-specified via `--ai-commands-dir` | Markdown | N/A | Bring your own agent | +| Agent | Directory | Format | CLI Tool | Description | +| ------------------ | -------------------------------------- | -------- | --------------- | --------------------------- | +| **Claude Code** | `.claude/commands/` | Markdown | `claude` | Anthropic's Claude Code CLI | +| **Gemini CLI** | `.gemini/commands/` | TOML | `gemini` | Google's Gemini CLI | +| **GitHub Copilot** | `.github/agents/` | Markdown | N/A (IDE-based) | GitHub Copilot in VS Code | +| **Cursor** | `.cursor/commands/` | Markdown | `cursor-agent` | Cursor CLI | +| **Qwen Code** | `.qwen/commands/` | TOML | `qwen` | Alibaba's Qwen Code CLI | +| **opencode** | `.opencode/command/` | Markdown | `opencode` | opencode CLI | +| **Codex CLI** | `.codex/commands/` | Markdown | `codex` | Codex CLI | +| **Windsurf** | `.windsurf/workflows/` | Markdown | N/A (IDE-based) | Windsurf IDE workflows | +| **Kilo Code** | `.kilocode/rules/` | Markdown | N/A (IDE-based) | Kilo Code IDE | +| **Auggie CLI** | `.augment/rules/` | Markdown | `auggie` | Auggie CLI | +| **Roo Code** | `.roo/rules/` | Markdown | N/A (IDE-based) | Roo Code IDE | +| **CodeBuddy CLI** | `.codebuddy/commands/` | Markdown | `codebuddy` | CodeBuddy CLI | +| **Qoder CLI** | `.qoder/commands/` | Markdown | `qodercli` | Qoder CLI | +| **Kiro CLI** | `.kiro/prompts/` | Markdown | `kiro-cli` | Kiro CLI | +| **Amp** | `.agents/commands/` | Markdown | `amp` | Amp CLI | +| **SHAI** | `.shai/commands/` | Markdown | `shai` | SHAI CLI | +| **Tabnine CLI** | `.tabnine/agent/commands/` | TOML | `tabnine` | Tabnine CLI | +| **Kimi Code** | `.kimi/skills/` | Markdown | `kimi` | Kimi Code CLI (Moonshot AI) | +| **IBM Bob** | `.bob/commands/` | Markdown | N/A (IDE-based) | IBM Bob IDE | +| **Trae** | `.trae/rules/` | Markdown | N/A (IDE-based) | Trae IDE | +| **Generic** | User-specified via `--ai-commands-dir` | Markdown | N/A | Bring your own agent | ### Step-by-Step Integration Guide @@ -420,4 +421,4 @@ When adding new agents: --- -*This documentation should be updated whenever new agents are added to maintain accuracy and completeness.* +_This documentation should be updated whenever new agents are added to maintain accuracy and completeness._ From efdaf194ecfce9f2002ef86e6083e6a57e5c6622 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E5=B9=BF?= Date: Fri, 13 Mar 2026 23:30:54 +0800 Subject: [PATCH 4/9] Update Agent.md --- AGENTS.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 4b70703ab..3a25f7a7b 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -35,7 +35,7 @@ Specify supports multiple AI agents by generating agent-specific command files a | **Gemini CLI** | `.gemini/commands/` | TOML | `gemini` | Google's Gemini CLI | | **GitHub Copilot** | `.github/agents/` | Markdown | N/A (IDE-based) | GitHub Copilot in VS Code | | **Cursor** | `.cursor/commands/` | Markdown | `cursor-agent` | Cursor CLI | -| **Qwen Code** | `.qwen/commands/` | TOML | `qwen` | Alibaba's Qwen Code CLI | +| **Qwen Code** | `.qwen/commands/` | Markdown | `qwen` | Alibaba's Qwen Code CLI | | **opencode** | `.opencode/command/` | Markdown | `opencode` | opencode CLI | | **Codex CLI** | `.codex/commands/` | Markdown | `codex` | Codex CLI | | **Windsurf** | `.windsurf/workflows/` | Markdown | N/A (IDE-based) | Windsurf IDE workflows | @@ -50,8 +50,8 @@ Specify supports multiple AI agents by generating agent-specific command files a | **Tabnine CLI** | `.tabnine/agent/commands/` | TOML | `tabnine` | Tabnine CLI | | **Kimi Code** | `.kimi/skills/` | Markdown | `kimi` | Kimi Code CLI (Moonshot AI) | | **IBM Bob** | `.bob/commands/` | Markdown | N/A (IDE-based) | IBM Bob IDE | -| **Trae** | `.trae/rules/` | Markdown | N/A (IDE-based) | Trae IDE | | **Generic** | User-specified via `--ai-commands-dir` | Markdown | N/A | Bring your own agent | +| **Trae** | `.trae/rules/` | Markdown | N/A (IDE-based) | Trae IDE | ### Step-by-Step Integration Guide @@ -89,7 +89,7 @@ This eliminates the need for special-case mappings throughout the codebase. - `folder`: Directory where agent-specific files are stored (relative to project root) - `commands_subdir`: Subdirectory name within the agent folder where command/prompt files are stored (default: `"commands"`) - Most agents use `"commands"` (e.g., `.claude/commands/`) - - Some agents use alternative names: `"agents"` (copilot), `"workflows"` (windsurf, kilocode, agy), `"prompts"` (codex, kiro-cli), `"command"` (opencode - singular) + - Some agents use alternative names: `"agents"` (copilot), `"workflows"` (windsurf, kilocode), `"prompts"` (codex, kiro-cli), `"command"` (opencode - singular) - This field enables `--ai-skills` to locate command templates correctly for skill generation - `install_url`: Installation documentation URL (set to `None` for IDE-based agents) - `requires_cli`: Whether the agent requires a CLI tool check during initialization @@ -340,7 +340,7 @@ Work within integrated development environments: ### Markdown Format -Used by: Claude, Cursor, opencode, Windsurf, Kiro CLI, Amp, SHAI, IBM Bob, Kimi Code +Used by: Claude, Cursor, opencode, Windsurf, Kiro CLI, Amp, SHAI, IBM Bob, Kimi Code, Qwen **Standard format:** @@ -365,7 +365,7 @@ Command content with {SCRIPT} and $ARGUMENTS placeholders. ### TOML Format -Used by: Gemini, Qwen, Tabnine +Used by: Gemini, Tabnine ```toml description = "Command description" From 8ab9bca6564e7d1784bb0cc8b7d597138e3812f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E5=B9=BF?= Date: Sat, 14 Mar 2026 00:51:33 +0800 Subject: [PATCH 5/9] Restore format --- AGENTS.md | 48 ++++++++++++++++++++++---------------------- README.md | 59 ++++++++++++++++++++++++++----------------------------- 2 files changed, 52 insertions(+), 55 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 3a25f7a7b..27e612e52 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -29,29 +29,29 @@ Specify supports multiple AI agents by generating agent-specific command files a ### Current Supported Agents -| Agent | Directory | Format | CLI Tool | Description | -| ------------------ | -------------------------------------- | -------- | --------------- | --------------------------- | -| **Claude Code** | `.claude/commands/` | Markdown | `claude` | Anthropic's Claude Code CLI | -| **Gemini CLI** | `.gemini/commands/` | TOML | `gemini` | Google's Gemini CLI | -| **GitHub Copilot** | `.github/agents/` | Markdown | N/A (IDE-based) | GitHub Copilot in VS Code | -| **Cursor** | `.cursor/commands/` | Markdown | `cursor-agent` | Cursor CLI | -| **Qwen Code** | `.qwen/commands/` | Markdown | `qwen` | Alibaba's Qwen Code CLI | -| **opencode** | `.opencode/command/` | Markdown | `opencode` | opencode CLI | -| **Codex CLI** | `.codex/commands/` | Markdown | `codex` | Codex CLI | -| **Windsurf** | `.windsurf/workflows/` | Markdown | N/A (IDE-based) | Windsurf IDE workflows | -| **Kilo Code** | `.kilocode/rules/` | Markdown | N/A (IDE-based) | Kilo Code IDE | -| **Auggie CLI** | `.augment/rules/` | Markdown | `auggie` | Auggie CLI | -| **Roo Code** | `.roo/rules/` | Markdown | N/A (IDE-based) | Roo Code IDE | -| **CodeBuddy CLI** | `.codebuddy/commands/` | Markdown | `codebuddy` | CodeBuddy CLI | -| **Qoder CLI** | `.qoder/commands/` | Markdown | `qodercli` | Qoder CLI | -| **Kiro CLI** | `.kiro/prompts/` | Markdown | `kiro-cli` | Kiro CLI | -| **Amp** | `.agents/commands/` | Markdown | `amp` | Amp CLI | -| **SHAI** | `.shai/commands/` | Markdown | `shai` | SHAI CLI | -| **Tabnine CLI** | `.tabnine/agent/commands/` | TOML | `tabnine` | Tabnine CLI | -| **Kimi Code** | `.kimi/skills/` | Markdown | `kimi` | Kimi Code CLI (Moonshot AI) | -| **IBM Bob** | `.bob/commands/` | Markdown | N/A (IDE-based) | IBM Bob IDE | -| **Generic** | User-specified via `--ai-commands-dir` | Markdown | N/A | Bring your own agent | -| **Trae** | `.trae/rules/` | Markdown | N/A (IDE-based) | Trae IDE | +| Agent | Directory | Format | CLI Tool | Description | +| -------------------------- | ---------------------- | -------- | --------------- | --------------------------- | +| **Claude Code** | `.claude/commands/` | Markdown | `claude` | Anthropic's Claude Code CLI | +| **Gemini CLI** | `.gemini/commands/` | TOML | `gemini` | Google's Gemini CLI | +| **GitHub Copilot** | `.github/agents/` | Markdown | N/A (IDE-based) | GitHub Copilot in VS Code | +| **Cursor** | `.cursor/commands/` | Markdown | `cursor-agent` | Cursor CLI | +| **Qwen Code** | `.qwen/commands/` | Markdown | `qwen` | Alibaba's Qwen Code CLI | +| **opencode** | `.opencode/command/` | Markdown | `opencode` | opencode CLI | +| **Codex CLI** | `.codex/commands/` | Markdown | `codex` | Codex CLI | +| **Windsurf** | `.windsurf/workflows/` | Markdown | N/A (IDE-based) | Windsurf IDE workflows | +| **Kilo Code** | `.kilocode/rules/` | Markdown | N/A (IDE-based) | Kilo Code IDE | +| **Auggie CLI** | `.augment/rules/` | Markdown | `auggie` | Auggie CLI | +| **Roo Code** | `.roo/rules/` | Markdown | N/A (IDE-based) | Roo Code IDE | +| **CodeBuddy CLI** | `.codebuddy/commands/` | Markdown | `codebuddy` | CodeBuddy CLI | +| **Qoder CLI** | `.qoder/commands/` | Markdown | `qodercli` | Qoder CLI | +| **Kiro CLI** | `.kiro/prompts/` | Markdown | `kiro-cli` | Kiro CLI | +| **Amp** | `.agents/commands/` | Markdown | `amp` | Amp CLI | +| **SHAI** | `.shai/commands/` | Markdown | `shai` | SHAI CLI | +| **Tabnine CLI** | `.tabnine/agent/commands/` | TOML | `tabnine` | Tabnine CLI | +| **Kimi Code** | `.kimi/skills/` | Markdown | `kimi` | Kimi Code CLI (Moonshot AI) | +| **IBM Bob** | `.bob/commands/` | Markdown | N/A (IDE-based) | IBM Bob IDE | +| **Trae** | `.trae/rules/` | Markdown | N/A (IDE-based) | Trae IDE | +| **Generic** | User-specified via `--ai-commands-dir` | Markdown | N/A | Bring your own agent | ### Step-by-Step Integration Guide @@ -421,4 +421,4 @@ When adding new agents: --- -_This documentation should be updated whenever new agents are added to maintain accuracy and completeness._ +*This documentation should be updated whenever new agents are added to maintain accuracy and completeness.* diff --git a/README.md b/README.md index 6d33f5ff6..d9c6fe537 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,18 @@
- Spec Kit Logo -

🌱 Spec Kit

-

Build high-quality software faster.

+ Spec Kit Logo +

🌱 Spec Kit

+

Build high-quality software faster.

- An open source toolkit that allows you to focus on product scenarios and predictable outcomes instead of vibe coding every piece from scratch. + An open source toolkit that allows you to focus on product scenarios and predictable outcomes instead of vibe coding every piece from scratch.

- Release - GitHub stars - License - Documentation + Release + GitHub stars + License + Documentation

--- @@ -203,7 +203,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`, `amp`, `shai`, `kiro-cli` (`kiro` alias), `agy`, `bob`, `qodercli`, `vibe`, `kimi`, `trae`, or `generic` (requires `--ai-commands-dir`) | +| `--ai` | Option | AI assistant to use: `claude`, `gemini`, `copilot`, `cursor-agent`, `qwen`, `opencode`, `codex`, `windsurf`, `kilocode`, `auggie`, `roo`, `codebuddy`, `amp`, `shai`, `kiro-cli` (`kiro` alias), `agy`, `bob`, `qodercli`, `vibe`, `kimi`, or `generic` (requires `--ai-commands-dir`) | | `--ai-commands-dir` | Option | Directory for agent command files (required with `--ai generic`, e.g. `.myagent/commands/`) | | `--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 | @@ -251,9 +251,6 @@ specify init my-project --ai bob # Initialize with Antigravity support specify init my-project --ai agy --ai-skills -# Initialize with Trae support -specify init my-project --ai trae - # Initialize with an unsupported agent (generic / bring your own agent) specify init my-project --ai generic --ai-commands-dir .myagent/commands/ @@ -488,21 +485,21 @@ At this stage, your project folder contents should resemble the following: ```text └── .specify - ├── memory - │ └── constitution.md - ├── scripts - │ ├── check-prerequisites.sh - │ ├── common.sh - │ ├── create-new-feature.sh - │ ├── setup-plan.sh - │ └── update-claude-md.sh - ├── specs - │ └── 001-create-taskify - │ └── spec.md - └── templates - ├── plan-template.md - ├── spec-template.md - └── tasks-template.md + ├── memory + │ └── constitution.md + ├── scripts + │ ├── check-prerequisites.sh + │ ├── common.sh + │ ├── create-new-feature.sh + │ ├── setup-plan.sh + │ └── update-claude-md.sh + ├── specs + │ └── 001-create-taskify + │ └── spec.md + └── templates + ├── plan-template.md + ├── spec-template.md + └── tasks-template.md ``` ### **STEP 3:** Functional specification clarification (required before planning) @@ -568,10 +565,10 @@ The output of this step will include a number of implementation detail documents │ ├── research.md │ └── spec.md └── templates - ├── CLAUDE-template.md - ├── plan-template.md - ├── spec-template.md - └── tasks-template.md + ├── CLAUDE-template.md + ├── plan-template.md + ├── spec-template.md + └── tasks-template.md ``` Check the `research.md` document to ensure that the right tech stack is used, based on your instructions. You can ask Claude Code to refine it if any of the components stand out, or even have it check the locally-installed version of the platform/framework you want to use (e.g., .NET). From 6f95e4d50c36e20bc2af5588c5f774a7e8b5283b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E5=B9=BF?= Date: Sat, 14 Mar 2026 01:02:38 +0800 Subject: [PATCH 6/9] Adjust order --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index d9c6fe537..d9626d2fc 100644 --- a/README.md +++ b/README.md @@ -184,8 +184,9 @@ See Spec-Driven Development in action across different scenarios with these comm | [Kimi Code](https://code.kimi.com/) | ✅ | | | [Windsurf](https://windsurf.com/) | ✅ | | | [Antigravity (agy)](https://antigravity.google/) | ✅ | Requires `--ai-skills` | -| Generic | ✅ | Bring your own agent — use `--ai generic --ai-commands-dir ` for unsupported agents | +agents | | [Trae](https://www.trae.ai/) | ✅ | | +| Generic | ✅ | Bring your own agent — use `--ai generic --ai-commands-dir ` for unsupported ## 🔧 Specify CLI Reference From 6cf521a2d51914fee0f937b8ebc9aa32c7450e70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E9=BB=84=E6=B1=AA?= <50308467+huangguang1999@users.noreply.github.com> Date: Sat, 14 Mar 2026 01:02:51 +0800 Subject: [PATCH 7/9] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d9626d2fc..db8f21c74 100644 --- a/README.md +++ b/README.md @@ -184,8 +184,8 @@ See Spec-Driven Development in action across different scenarios with these comm | [Kimi Code](https://code.kimi.com/) | ✅ | | | [Windsurf](https://windsurf.com/) | ✅ | | | [Antigravity (agy)](https://antigravity.google/) | ✅ | Requires `--ai-skills` | -agents | | [Trae](https://www.trae.ai/) | ✅ | | +| Generic | ✅ | Bring your own agent — use `--ai generic --ai-commands-dir ` for unsupported agents | | Generic | ✅ | Bring your own agent — use `--ai generic --ai-commands-dir ` for unsupported ## 🔧 Specify CLI Reference From d97b72226901cba8f0bafdb410cb668a2523ea11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E5=B9=BF?= Date: Sat, 14 Mar 2026 01:06:12 +0800 Subject: [PATCH 8/9] Unused --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index db8f21c74..9594e8b2f 100644 --- a/README.md +++ b/README.md @@ -186,7 +186,6 @@ See Spec-Driven Development in action across different scenarios with these comm | [Antigravity (agy)](https://antigravity.google/) | ✅ | Requires `--ai-skills` | | [Trae](https://www.trae.ai/) | ✅ | | | Generic | ✅ | Bring your own agent — use `--ai generic --ai-commands-dir ` for unsupported agents | -| Generic | ✅ | Bring your own agent — use `--ai generic --ai-commands-dir ` for unsupported ## 🔧 Specify CLI Reference From 738469123f18ec0b591d2d4061d6e90576bd301e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E5=B9=BF?= Date: Sun, 15 Mar 2026 01:13:38 +0800 Subject: [PATCH 9/9] fix: add TRAE_FILE to update_all_existing_agents() for auto-detect support Add missing update_if_new call for TRAE_FILE in the bash update-agent-context.sh script's update_all_existing_agents() function, matching the PowerShell implementation. This ensures running the script without arguments will correctly auto-detect and update existing Trae agent files. --- scripts/bash/update-agent-context.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/bash/update-agent-context.sh b/scripts/bash/update-agent-context.sh index 3e0b6c502..57c548654 100644 --- a/scripts/bash/update-agent-context.sh +++ b/scripts/bash/update-agent-context.sh @@ -734,6 +734,7 @@ update_all_existing_agents() { update_if_new "$AGY_FILE" "Antigravity" update_if_new "$VIBE_FILE" "Mistral Vibe" update_if_new "$KIMI_FILE" "Kimi Code" + update_if_new "$TRAE_FILE" "Trae" # If no agent files exist, create a default Claude file if [[ "$found_agent" == false ]]; then