Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion scripts/bash/update-agent-context.sh
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ AGY_FILE="$REPO_ROOT/.agent/rules/specify-rules.md"
BOB_FILE="$AGENTS_FILE"
VIBE_FILE="$REPO_ROOT/.vibe/agents/specify-agents.md"
KIMI_FILE="$REPO_ROOT/KIMI.md"
TRAE_FILE="$REPO_ROOT/.trae/rules/AGENTS.md"
TRAE_FILE="$REPO_ROOT/.trae/rules/project_rules.md"
IFLOW_FILE="$REPO_ROOT/IFLOW.md"
FORGE_FILE="$AGENTS_FILE"

Expand Down
2 changes: 1 addition & 1 deletion scripts/powershell/update-agent-context.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,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'
$TRAE_FILE = Join-Path $REPO_ROOT '.trae/rules/project_rules.md'
$IFLOW_FILE = Join-Path $REPO_ROOT 'IFLOW.md'
$FORGE_FILE = Join-Path $REPO_ROOT 'AGENTS.md'

Expand Down
7 changes: 4 additions & 3 deletions src/specify_cli/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -1287,15 +1287,16 @@ def init(
step_num = 2

# Determine skill display mode for the next-steps panel.
# Skills integrations (codex, kimi, agy) should show skill invocation syntax.
# Skills integrations (codex, kimi, agy, trae) should show skill invocation syntax.
from .integrations.base import SkillsIntegration as _SkillsInt
_is_skills_integration = isinstance(resolved_integration, _SkillsInt)

codex_skill_mode = selected_ai == "codex" and (ai_skills or _is_skills_integration)
claude_skill_mode = selected_ai == "claude" and (ai_skills or _is_skills_integration)
kimi_skill_mode = selected_ai == "kimi"
agy_skill_mode = selected_ai == "agy" and _is_skills_integration
native_skill_mode = codex_skill_mode or claude_skill_mode or kimi_skill_mode or agy_skill_mode
trae_skill_mode = selected_ai == "trae"
native_skill_mode = codex_skill_mode or claude_skill_mode or kimi_skill_mode or agy_skill_mode or trae_skill_mode

if codex_skill_mode and not ai_skills:
# Integration path installed skills; show the helpful notice
Expand All @@ -1307,7 +1308,7 @@ def init(
usage_label = "skills" if native_skill_mode else "slash commands"

def _display_cmd(name: str) -> str:
if codex_skill_mode or agy_skill_mode:
if codex_skill_mode or agy_skill_mode or trae_skill_mode:
return f"$speckit-{name}"
if claude_skill_mode:
return f"/speckit-{name}"
Expand Down
33 changes: 26 additions & 7 deletions src/specify_cli/integrations/trae/__init__.py
Original file line number Diff line number Diff line change
@@ -1,21 +1,40 @@
"""Trae IDE integration."""
"""Trae IDE integration. — skills-based agent.

from ..base import MarkdownIntegration
Trae IDE uses ``.trae/skills/speckit-<name>/SKILL.md`` layout.
Explicit command support was deprecated in version 1.20.5;
``--skills`` defaults to ``True``.
"""

from __future__ import annotations
from ..base import IntegrationOption, SkillsIntegration


class TraeIntegration(SkillsIntegration):
"""Integration for Trae IDE."""

class TraeIntegration(MarkdownIntegration):
key = "trae"
config = {
"name": "Trae",
"folder": ".trae/",
"commands_subdir": "rules",
"commands_subdir": "skills",
"install_url": None,
"requires_cli": False,
}
registrar_config = {
"dir": ".trae/rules",
"dir": ".trae/skills",
"format": "markdown",
"args": "$ARGUMENTS",
"extension": ".md",
"extension": "SKILL.md",
}
context_file = ".trae/rules/AGENTS.md"
context_file = ".trae/rules/project_rules.md"

@classmethod
def options(cls) -> list[IntegrationOption]:
return [
IntegrationOption(
"--skills",
is_flag=True,
default=True,
help="Install as agent skills (default for trae since v0.5.1)",
),
]
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# update-context.ps1 — Trae integration: create/update .trae/rules/AGENTS.md
# update-context.ps1 — Trae integration: create/update .trae/rules/project_rules.md
#
# Thin wrapper that delegates to the shared update-agent-context script.
# Activated in Stage 7 when the shared script uses integration.json dispatch.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#!/usr/bin/env bash
# update-context.sh — Trae integration: create/update .trae/rules/AGENTS.md
# update-context.sh — Trae integration: create/update .trae/rules/project_rules.md
#
# Thin wrapper that delegates to the shared update-agent-context script.
# Activated in Stage 7 when the shared script uses integration.json dispatch.
Expand Down
2 changes: 1 addition & 1 deletion src/specify_cli/presets.py
Original file line number Diff line number Diff line change
Expand Up @@ -717,7 +717,7 @@ def _register_skills(
ai_skills_enabled = bool(init_opts.get("ai_skills"))
registrar = CommandRegistrar()
agent_config = registrar.AGENT_CONFIGS.get(selected_ai, {})
# Native skill agents (e.g. codex/kimi/agy) materialize brand-new
# Native skill agents (e.g. codex/kimi/agy/trae) materialize brand-new
# preset skills in _register_commands() because their detected agent
# directory is already the skills directory. This flag is only for
# command-backed agents that also mirror commands into skills.
Expand Down
2 changes: 1 addition & 1 deletion tests/integrations/test_integration_trae.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,4 @@ class TestTraeIntegration(MarkdownIntegrationTests):
FOLDER = ".trae/"
COMMANDS_SUBDIR = "rules"
REGISTRAR_DIR = ".trae/rules"
CONTEXT_FILE = ".trae/rules/AGENTS.md"
CONTEXT_FILE = ".trae/rules/project_rules.md"
4 changes: 2 additions & 2 deletions tests/test_agent_config_consistency.py
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ 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"]["commands_subdir"] == "skills"
assert AGENT_CONFIG["trae"]["requires_cli"] is False
assert AGENT_CONFIG["trae"]["install_url"] is None

Expand All @@ -151,7 +151,7 @@ def test_trae_in_extension_registrar(self):
trae_cfg = cfg["trae"]
assert trae_cfg["format"] == "markdown"
assert trae_cfg["args"] == "$ARGUMENTS"
assert trae_cfg["extension"] == ".md"
assert trae_cfg["extension"] == "SKILL.md"

def test_trae_in_agent_context_scripts(self):
"""Agent context scripts should support trae agent type."""
Expand Down