Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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.
In the Specify CLI Trae integration, explicit command support was deprecated
since v0.5.1; ``--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
10 changes: 5 additions & 5 deletions tests/integrations/test_integration_trae.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
"""Tests for TraeIntegration."""

from .test_integration_base_markdown import MarkdownIntegrationTests
from .test_integration_base_skills import SkillsIntegrationTests


class TestTraeIntegration(MarkdownIntegrationTests):
class TestTraeIntegration(SkillsIntegrationTests):
KEY = "trae"
FOLDER = ".trae/"
COMMANDS_SUBDIR = "rules"
REGISTRAR_DIR = ".trae/rules"
CONTEXT_FILE = ".trae/rules/AGENTS.md"
COMMANDS_SUBDIR = "skills"
REGISTRAR_DIR = ".trae/skills"
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
Loading