Skip to content

Commit 2a3fb7e

Browse files
committed
feat(integrations): add Devin for Terminal skills-based integration
- Register DevinIntegration as a SkillsIntegration with .devin/skills/ layout - Add catalog entry, docs row, and supported-agents listing - Display /speckit-<command> hyphen syntax in init "Next Steps" panel (matches Claude/Cursor/Copilot skills mode, since Devin invokes skills by directory name) Closes #2346
1 parent 6bf4ebb commit 2a3fb7e

7 files changed

Lines changed: 93 additions & 3 deletions

File tree

.github/ISSUE_TEMPLATE/agent_request.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ body:
88
value: |
99
Thanks for requesting a new agent! Before submitting, please check if the agent is already supported.
1010
11-
**Currently supported agents**: Claude Code, Gemini CLI, GitHub Copilot, Cursor, Qwen Code, opencode, Codex CLI, Windsurf, Kilo Code, Auggie CLI, Roo Code, CodeBuddy, Qoder CLI, Kiro CLI, Amp, SHAI, Tabnine CLI, Antigravity, IBM Bob, Mistral Vibe, Kimi Code, Trae, Pi Coding Agent, iFlow CLI
11+
**Currently supported agents**: Claude Code, Gemini CLI, GitHub Copilot, Cursor, Qwen Code, opencode, Codex CLI, Windsurf, Kilo Code, Auggie CLI, Roo Code, CodeBuddy, Qoder CLI, Kiro CLI, Amp, SHAI, Tabnine CLI, Antigravity, IBM Bob, Mistral Vibe, Kimi Code, Trae, Pi Coding Agent, iFlow CLI, Devin for Terminal
1212
1313
- type: input
1414
id: agent-name

docs/reference/integrations.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ The Specify CLI supports a wide range of AI coding agents. When you run `specify
1313
| [CodeBuddy CLI](https://www.codebuddy.ai/cli) | `codebuddy` | |
1414
| [Codex CLI](https://github.com/openai/codex) | `codex` | Skills-based integration; installs skills into `.agents/skills` and invokes them as `$speckit-<command>` |
1515
| [Cursor](https://cursor.sh/) | `cursor-agent` | |
16+
| [Devin for Terminal](https://cli.devin.ai/docs) | `devin` | Skills-based integration; installs skills into `.devin/skills/` and invokes them as `/speckit-<command>` |
1617
| [Forge](https://forgecode.dev/) | `forge` | |
1718
| [Gemini CLI](https://github.com/google-gemini/gemini-cli) | `gemini` | |
1819
| [GitHub Copilot](https://code.visualstudio.com/) | `copilot` | |

integrations/catalog.json

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,15 @@
6666
"repository": "https://github.com/github/spec-kit",
6767
"tags": ["cli", "skills"]
6868
},
69+
"devin": {
70+
"id": "devin",
71+
"name": "Devin for Terminal",
72+
"version": "1.0.0",
73+
"description": "Devin for Terminal CLI skills-based integration",
74+
"author": "spec-kit-core",
75+
"repository": "https://github.com/github/spec-kit",
76+
"tags": ["cli", "skills"]
77+
},
6978
"qwen": {
7079
"id": "qwen",
7180
"name": "Qwen Code",

src/specify_cli/__init__.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1523,7 +1523,8 @@ def init(
15231523
trae_skill_mode = selected_ai == "trae"
15241524
cursor_agent_skill_mode = selected_ai == "cursor-agent" and (ai_skills or _is_skills_integration)
15251525
copilot_skill_mode = selected_ai == "copilot" and _is_skills_integration
1526-
native_skill_mode = codex_skill_mode or claude_skill_mode or kimi_skill_mode or agy_skill_mode or trae_skill_mode or cursor_agent_skill_mode or copilot_skill_mode
1526+
devin_skill_mode = selected_ai == "devin"
1527+
native_skill_mode = codex_skill_mode or claude_skill_mode or kimi_skill_mode or agy_skill_mode or trae_skill_mode or cursor_agent_skill_mode or copilot_skill_mode or devin_skill_mode
15271528

15281529
if codex_skill_mode and not ai_skills:
15291530
# Integration path installed skills; show the helpful notice
@@ -1535,6 +1536,9 @@ def init(
15351536
if cursor_agent_skill_mode and not ai_skills:
15361537
steps_lines.append(f"{step_num}. Start Cursor Agent in this project directory; spec-kit skills were installed to [cyan].cursor/skills[/cyan]")
15371538
step_num += 1
1539+
if devin_skill_mode:
1540+
steps_lines.append(f"{step_num}. Start Devin in this project directory; spec-kit skills were installed to [cyan].devin/skills[/cyan]")
1541+
step_num += 1
15381542
usage_label = "skills" if native_skill_mode else "slash commands"
15391543

15401544
def _display_cmd(name: str) -> str:
@@ -1544,7 +1548,7 @@ def _display_cmd(name: str) -> str:
15441548
return f"/speckit-{name}"
15451549
if kimi_skill_mode:
15461550
return f"/skill:speckit-{name}"
1547-
if cursor_agent_skill_mode or copilot_skill_mode:
1551+
if cursor_agent_skill_mode or copilot_skill_mode or devin_skill_mode:
15481552
return f"/speckit-{name}"
15491553
return f"/speckit.{name}"
15501554

src/specify_cli/integrations/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ def _register_builtins() -> None:
5656
from .codex import CodexIntegration
5757
from .copilot import CopilotIntegration
5858
from .cursor_agent import CursorAgentIntegration
59+
from .devin import DevinIntegration
5960
from .forge import ForgeIntegration
6061
from .gemini import GeminiIntegration
6162
from .generic import GenericIntegration
@@ -86,6 +87,7 @@ def _register_builtins() -> None:
8687
_register(CodexIntegration())
8788
_register(CopilotIntegration())
8889
_register(CursorAgentIntegration())
90+
_register(DevinIntegration())
8991
_register(ForgeIntegration())
9092
_register(GeminiIntegration())
9193
_register(GenericIntegration())
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
"""Devin for Terminal integration — skills-based agent.
2+
3+
Devin uses the ``.devin/skills/speckit-<name>/SKILL.md`` layout and
4+
reads project context from ``AGENTS.md`` at the repo root. The CLI
5+
binary is ``devin`` and skills are invoked via ``/<name>`` inside an
6+
interactive ``devin`` session.
7+
8+
See: https://cli.devin.ai/docs/extensibility/skills/overview
9+
"""
10+
11+
from __future__ import annotations
12+
13+
from ..base import IntegrationOption, SkillsIntegration
14+
15+
16+
class DevinIntegration(SkillsIntegration):
17+
"""Integration for Cognition AI's Devin for Terminal."""
18+
19+
key = "devin"
20+
config = {
21+
"name": "Devin for Terminal",
22+
"folder": ".devin/",
23+
"commands_subdir": "skills",
24+
"install_url": "https://cli.devin.ai/docs",
25+
"requires_cli": True,
26+
}
27+
registrar_config = {
28+
"dir": ".devin/skills",
29+
"format": "markdown",
30+
"args": "$ARGUMENTS",
31+
"extension": "/SKILL.md",
32+
}
33+
context_file = "AGENTS.md"
34+
35+
@classmethod
36+
def options(cls) -> list[IntegrationOption]:
37+
return [
38+
IntegrationOption(
39+
"--skills",
40+
is_flag=True,
41+
default=True,
42+
help="Install as agent skills (default for Devin)",
43+
),
44+
]
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
"""Tests for DevinIntegration."""
2+
3+
from .test_integration_base_skills import SkillsIntegrationTests
4+
5+
6+
class TestDevinIntegration(SkillsIntegrationTests):
7+
KEY = "devin"
8+
FOLDER = ".devin/"
9+
COMMANDS_SUBDIR = "skills"
10+
REGISTRAR_DIR = ".devin/skills"
11+
CONTEXT_FILE = "AGENTS.md"
12+
13+
14+
class TestDevinAutoPromote:
15+
"""--ai devin auto-promotes to integration path."""
16+
17+
def test_ai_devin_without_ai_skills_auto_promotes(self, tmp_path):
18+
"""--ai devin should work the same as --integration devin."""
19+
from typer.testing import CliRunner
20+
from specify_cli import app
21+
22+
runner = CliRunner()
23+
target = tmp_path / "test-proj"
24+
result = runner.invoke(
25+
app,
26+
["init", str(target), "--ai", "devin", "--no-git", "--ignore-agent-tools", "--script", "sh"],
27+
)
28+
29+
assert result.exit_code == 0, f"init --ai devin failed: {result.output}"
30+
assert (target / ".devin" / "skills" / "speckit-plan" / "SKILL.md").exists()

0 commit comments

Comments
 (0)