Skip to content

Commit ccdbecf

Browse files
authored
Merge branch 'github:main' into fix/copilot-ai-skills-filter
2 parents e1c20c9 + a177a1a commit ccdbecf

19 files changed

+1536
-99
lines changed

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@ gh release create "$VERSION" \
5858
.genreleases/spec-kit-template-vibe-ps-"$VERSION".zip \
5959
.genreleases/spec-kit-template-kimi-sh-"$VERSION".zip \
6060
.genreleases/spec-kit-template-kimi-ps-"$VERSION".zip \
61+
.genreleases/spec-kit-template-trae-sh-"$VERSION".zip \
62+
.genreleases/spec-kit-template-trae-ps-"$VERSION".zip \
6163
.genreleases/spec-kit-template-generic-sh-"$VERSION".zip \
6264
.genreleases/spec-kit-template-generic-ps-"$VERSION".zip \
6365
--title "Spec Kit Templates - $VERSION_NO_V" \

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
1515
.PARAMETER Agents
1616
Comma or space separated subset of agents to build (default: all)
17-
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
17+
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
1818
1919
.PARAMETER Scripts
2020
Comma or space separated subset of script types to build (default: both)
@@ -454,6 +454,11 @@ function Build-Variant {
454454
New-Item -ItemType Directory -Force -Path $skillsDir | Out-Null
455455
New-KimiSkills -SkillsDir $skillsDir -ScriptVariant $Script
456456
}
457+
'trae' {
458+
$rulesDir = Join-Path $baseDir ".trae/rules"
459+
New-Item -ItemType Directory -Force -Path $rulesDir | Out-Null
460+
Generate-Commands -Agent 'trae' -Extension 'md' -ArgFormat '$ARGUMENTS' -OutputDir $rulesDir -ScriptVariant $Script
461+
}
457462
'generic' {
458463
$cmdDir = Join-Path $baseDir ".speckit/commands"
459464
Generate-Commands -Agent 'generic' -Extension 'md' -ArgFormat '$ARGUMENTS' -OutputDir $cmdDir -ScriptVariant $Script
@@ -470,7 +475,7 @@ function Build-Variant {
470475
}
471476

472477
# Define all agents and scripts
473-
$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')
478+
$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')
474479
$AllScripts = @('sh', 'ps')
475480

476481
function Normalize-List {

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ set -euo pipefail
66
# Usage: .github/workflows/scripts/create-release-packages.sh <version>
77
# Version argument should include leading 'v'.
88
# Optionally set AGENTS and/or SCRIPTS env vars to limit what gets built.
9-
# 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)
9+
# 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)
1010
# SCRIPTS : space or comma separated subset of: sh ps (default: both)
1111
# Examples:
1212
# AGENTS=claude SCRIPTS=sh $0 v0.2.0
@@ -291,6 +291,9 @@ build_variant() {
291291
kimi)
292292
mkdir -p "$base_dir/.kimi/skills"
293293
create_kimi_skills "$base_dir/.kimi/skills" "$script" ;;
294+
trae)
295+
mkdir -p "$base_dir/.trae/rules"
296+
generate_commands trae md "\$ARGUMENTS" "$base_dir/.trae/rules" "$script" ;;
294297
generic)
295298
mkdir -p "$base_dir/.speckit/commands"
296299
generate_commands generic md "\$ARGUMENTS" "$base_dir/.speckit/commands" "$script" ;;
@@ -300,7 +303,7 @@ build_variant() {
300303
}
301304

302305
# Determine agent list
303-
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)
306+
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)
304307
ALL_SCRIPTS=(sh ps)
305308

306309
norm_list() {

AGENTS.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ Specify supports multiple AI agents by generating agent-specific command files a
4646
| **Tabnine CLI** | `.tabnine/agent/commands/` | TOML | `tabnine` | Tabnine CLI |
4747
| **Kimi Code** | `.kimi/skills/` | Markdown | `kimi` | Kimi Code CLI (Moonshot AI) |
4848
| **IBM Bob** | `.bob/commands/` | Markdown | N/A (IDE-based) | IBM Bob IDE |
49+
| **Trae** | `.trae/rules/` | Markdown | N/A (IDE-based) | Trae IDE |
4950
| **Generic** | User-specified via `--ai-commands-dir` | Markdown | N/A | Bring your own agent |
5051

5152
### Step-by-Step Integration Guide

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
3535

3636
### Added
3737

38+
- feat(cli): polite deep merge for VSCode settings.json with JSONC support via `json5` and zero-data-loss fallbacks
3839
- feat(presets): Pluggable preset system with preset catalog and template resolver
3940
- Preset manifest (`preset.yml`) with validation for artifact, command, and script types
4041
- `PresetManifest`, `PresetRegistry`, `PresetManager`, `PresetCatalog`, `PresetResolver` classes in `src/specify_cli/presets.py`

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,7 @@ See Spec-Driven Development in action across different scenarios with these comm
186186
| [Kimi Code](https://code.kimi.com/) || |
187187
| [Windsurf](https://windsurf.com/) || |
188188
| [Antigravity (agy)](https://antigravity.google/) || Requires `--ai-skills` |
189+
| [Trae](https://www.trae.ai/) || |
189190
| Generic || Bring your own agent — use `--ai generic --ai-commands-dir <path>` for unsupported agents |
190191

191192
## 🔧 Specify CLI Reference

extensions/RFC-EXTENSION-SYSTEM.md

Lines changed: 39 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -359,12 +359,15 @@ specify extension add jira
359359
"installed_at": "2026-01-28T14:30:00Z",
360360
"source": "catalog",
361361
"manifest_hash": "sha256:abc123...",
362-
"enabled": true
362+
"enabled": true,
363+
"priority": 10
363364
}
364365
}
365366
}
366367
```
367368

369+
**Priority Field**: Extensions are ordered by `priority` (lower = higher precedence). Default is 10. Used for template resolution when multiple extensions provide the same template.
370+
368371
### 3. Configuration
369372

370373
```bash
@@ -1084,11 +1087,15 @@ List installed extensions in current project.
10841087
$ specify extension list
10851088
10861089
Installed Extensions:
1087-
✓ jira (v1.0.0) - Jira Integration
1088-
Commands: 3 | Hooks: 2 | Status: Enabled
1089-
1090-
✓ linear (v0.9.0) - Linear Integration
1091-
Commands: 1 | Hooks: 1 | Status: Enabled
1090+
✓ Jira Integration (v1.0.0)
1091+
jira
1092+
Create Jira issues from spec-kit artifacts
1093+
Commands: 3 | Hooks: 2 | Priority: 10 | Status: Enabled
1094+
1095+
✓ Linear Integration (v0.9.0)
1096+
linear
1097+
Create Linear issues from spec-kit artifacts
1098+
Commands: 1 | Hooks: 1 | Priority: 10 | Status: Enabled
10921099
```
10931100

10941101
**Options:**
@@ -1196,10 +1203,9 @@ Next steps:
11961203

11971204
**Options:**
11981205

1199-
- `--from URL`: Install from custom URL or Git repo
1200-
- `--version VERSION`: Install specific version
1201-
- `--dev PATH`: Install from local path (development mode)
1202-
- `--no-register`: Skip command registration (manual setup)
1206+
- `--from URL`: Install from a remote URL (archive). Does not accept Git repositories directly.
1207+
- `--dev`: Install from a local path in development mode (the PATH is the positional `extension` argument).
1208+
- `--priority NUMBER`: Set resolution priority (lower = higher precedence, default 10)
12031209

12041210
#### `specify extension remove NAME`
12051211

@@ -1280,6 +1286,29 @@ $ specify extension disable jira
12801286
To re-enable: specify extension enable jira
12811287
```
12821288

1289+
#### `specify extension set-priority NAME PRIORITY`
1290+
1291+
Change the resolution priority of an installed extension.
1292+
1293+
```bash
1294+
$ specify extension set-priority jira 5
1295+
1296+
✓ Extension 'Jira Integration' priority changed: 10 → 5
1297+
1298+
Lower priority = higher precedence in template resolution
1299+
```
1300+
1301+
**Priority Values:**
1302+
1303+
- Lower numbers = higher precedence (checked first in resolution)
1304+
- Default priority is 10
1305+
- Must be a positive integer (1 or higher)
1306+
1307+
**Use Cases:**
1308+
1309+
- Ensure a critical extension's templates take precedence
1310+
- Override default resolution order when multiple extensions provide similar templates
1311+
12831312
---
12841313

12851314
## Compatibility & Versioning

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ dependencies = [
1414
"pyyaml>=6.0",
1515
"packaging>=23.0",
1616
"pathspec>=0.12.0",
17+
"json5>=0.13.0",
1718
]
1819

1920
[project.scripts]

scripts/bash/create-new-feature.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ check_existing_branches() {
138138
local specs_dir="$1"
139139

140140
# Fetch all remotes to get latest branch info (suppress errors if no remotes)
141-
git fetch --all --prune 2>/dev/null || true
141+
git fetch --all --prune >/dev/null 2>&1 || true
142142

143143
# Get highest number from ALL branches (not just matching short name)
144144
local highest_branch=$(get_highest_from_branches)

scripts/bash/update-agent-context.sh

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
# - Creates default Claude file if no agent files exist
3636
#
3737
# Usage: ./update-agent-context.sh [agent_type]
38-
# 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
38+
# 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
3939
# Leave empty to update all existing agent files
4040

4141
set -e
@@ -83,6 +83,7 @@ AGY_FILE="$REPO_ROOT/.agent/rules/specify-rules.md"
8383
BOB_FILE="$AGENTS_FILE"
8484
VIBE_FILE="$REPO_ROOT/.vibe/agents/specify-agents.md"
8585
KIMI_FILE="$REPO_ROOT/KIMI.md"
86+
TRAE_FILE="$REPO_ROOT/.trae/rules/AGENTS.md"
8687

8788
# Template file
8889
TEMPLATE_FILE="$REPO_ROOT/.specify/templates/agent-file-template.md"
@@ -675,12 +676,15 @@ update_specific_agent() {
675676
kimi)
676677
update_agent_file "$KIMI_FILE" "Kimi Code" || return 1
677678
;;
679+
trae)
680+
update_agent_file "$TRAE_FILE" "Trae" || return 1
681+
;;
678682
generic)
679683
log_info "Generic agent: no predefined context file. Use the agent-specific update script for your agent."
680684
;;
681685
*)
682686
log_error "Unknown agent type '$agent_type'"
683-
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"
687+
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"
684688
exit 1
685689
;;
686690
esac
@@ -739,6 +743,7 @@ update_all_existing_agents() {
739743
_update_if_new "$AGY_FILE" "Antigravity" || _all_ok=false
740744
_update_if_new "$VIBE_FILE" "Mistral Vibe" || _all_ok=false
741745
_update_if_new "$KIMI_FILE" "Kimi Code" || _all_ok=false
746+
_update_if_new "$TRAE_FILE" "Trae" || _all_ok=false
742747

743748
# If no agent files exist, create a default Claude file
744749
if [[ "$_found_agent" == false ]]; then
@@ -765,7 +770,7 @@ print_summary() {
765770
fi
766771

767772
echo
768-
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]"
773+
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]"
769774
}
770775

771776
#==============================================================================

0 commit comments

Comments
 (0)