Skip to content
Open
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 .github/ISSUE_TEMPLATE/agent_request.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ body:
value: |
Thanks for requesting a new agent! Before submitting, please check if the agent is already supported.
**Currently supported agents**: Alquimia AI, Amp, Antigravity, Auggie CLI, Claude Code, Cline, CodeBuddy, Codex CLI, Command Code, Cursor, Devin for Terminal, Docker Agent, Factory Droid, DeepSeek Harness, Firebender, Forge, Gemini CLI, GitHub Copilot, Goose, Grok Build, Hermes Agent, IBM Bob, Junie, Kilo Code, Kimi Code, Kiro CLI, Lingma, Mistral Vibe, Muse Code, Oh My Pi, opencode, Pi Coding Agent, Qoder CLI, Qwen Code, RovoDev ACLI, SHAI, Tabnine CLI, Trae, ZCode, Zed
**Currently supported agents**: Alquimia AI, Amp, Antigravity, Auggie CLI, Claude Code, Cline, CodeBuddy, Codex CLI, Command Code, Cursor, Devin for Terminal, Docker Agent, Factory Droid, DeepSeek Harness, Firebender, Forge, Gemini CLI, GitHub Copilot, Goose, Grok Build, Hermes Agent, IBM Bob, Junie, Kilo Code, Kimi Code, Kiro CLI, Lingma, MiniMax Code, Mistral Vibe, Muse Code, Oh My Pi, opencode, Pi Coding Agent, Qoder CLI, Qwen Code, RovoDev ACLI, SHAI, Tabnine CLI, Trae, ZCode, Zed
- type: input
id: agent-name
Expand Down
1 change: 1 addition & 0 deletions .github/ISSUE_TEMPLATE/bug_report.yml
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ body:
- Kimi Code
- Kiro CLI
- Lingma
- MiniMax Code
- Mistral Vibe
- Muse Code
- Oh My Pi
Expand Down
1 change: 1 addition & 0 deletions .github/ISSUE_TEMPLATE/feature_request.yml
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@ body:
- Kimi Code
- Kiro CLI
- Lingma
- MiniMax Code
- Mistral Vibe
- Muse Code
- Oh My Pi
Expand Down
2 changes: 2 additions & 0 deletions docs/reference/integrations.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ The Specify CLI supports a wide range of AI coding agents. When you run `specify
| [Kimi Code](https://code.kimi.com/) | `kimi` | Skills-based integration; installs into `.kimi-code/skills/`. `--migrate-legacy` moves old `.kimi/skills/` installs to the new paths |
| [Kiro CLI](https://kiro.dev/docs/cli/) | `kiro-cli` | Kiro CLI does not substitute `$ARGUMENTS` in file-based prompts, so Spec Kit ships a prose fallback at render time (see [Manage prompts](https://kiro.dev/docs/cli/chat/manage-prompts/) and issue [#1926](https://github.com/github/spec-kit/issues/1926)). Alias: `--integration kiro` |
| [Lingma](https://lingma.aliyun.com/) | `lingma` | Skills-based integration; skills are installed automatically |
| [MiniMax Code](https://github.com/MiniMax-AI/minimax-code) | `mcode` | Skills-based integration; installs skills into `.minimax/skills` and invokes them as `/speckit-<command>`. Headless workflow dispatch uses `--permission full` so tool actions are not blocked by headless permission gating; set `SPECKIT_INTEGRATION_MCODE_EXTRA_ARGS="--permission smart"` to use MiniMax Code's stricter policy. |
| [Mistral Vibe](https://github.com/mistralai/mistral-vibe) | `vibe` | |
| [Muse Code](https://dev.meta.ai/docs/muse-code) | `muse` | Skills-based integration; installs skills into `.agents/skills` and invokes them as `/speckit-<command>` |
| [Oh My Pi](https://www.npmjs.com/package/@oh-my-pi/pi-coding-agent) | `omp` | Installs slash commands into `.omp/commands` |
Expand Down Expand Up @@ -317,6 +318,7 @@ The currently declared multi-install safe integrations are:
| `kilocode` | `.kilo/commands` |
| `kiro-cli` | `.kiro/prompts` |
| `lingma` | `.lingma/skills` |
| `mcode` | `.minimax/skills` |
| `omp` | `.omp/commands` |
| `opencode` | `.opencode/commands` |
| `pi` | `.pi/prompts` |
Expand Down
2 changes: 1 addition & 1 deletion examples/bundles/business-analyst/bundle.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ requires:
provides:
extensions:
- id: "agent-context"
version: "1.0.1"
version: "1.0.2"
presets:
- id: "requirements-elicitation"
version: "1.0.0"
Expand Down
2 changes: 1 addition & 1 deletion examples/bundles/developer/bundle.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ requires:
provides:
extensions:
- id: "agent-context"
version: "1.0.1"
version: "1.0.2"
presets:
- id: "implementation-planning"
version: "1.0.0"
Expand Down
2 changes: 1 addition & 1 deletion examples/bundles/product-manager/bundle.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ requires:
provides:
extensions:
- id: "agent-context"
version: "1.0.1"
version: "1.0.2"
presets:
- id: "product-discovery"
version: "1.0.0"
Expand Down
2 changes: 1 addition & 1 deletion examples/bundles/security-researcher/bundle.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ requires:
provides:
extensions:
- id: "agent-context"
version: "1.0.1"
version: "1.0.2"
presets:
- id: "security-compliance"
version: "1.0.0"
Expand Down
1 change: 1 addition & 0 deletions extensions/agent-context/agent-context-defaults.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
"kimi": "AGENTS.md",
"kiro-cli": "AGENTS.md",
"lingma": ".lingma/rules/specify-rules.md",
"mcode": "AGENTS.md",
"muse": "AGENTS.md",
"omp": "AGENTS.md",
"opencode": "AGENTS.md",
Expand Down
2 changes: 1 addition & 1 deletion extensions/agent-context/extension.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ schema_version: "1.0"
extension:
id: agent-context
name: "Coding Agent Context"
version: "1.0.1"
version: "1.0.2"
description: "Manages coding agent context/instruction files (e.g., CLAUDE.md, copilot-instructions.md) with project-specific plan references and configurable markers"
author: spec-kit-core
repository: https://github.com/github/spec-kit
Expand Down
4 changes: 2 additions & 2 deletions extensions/catalog.json
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
{
"schema_version": "1.0",
"updated_at": "2026-09-22T00:00:00Z",
"updated_at": "2026-09-25T00:56:15Z",
"catalog_url": "https://raw.githubusercontent.com/github/spec-kit/main/extensions/catalog.json",
"extensions": {
"agent-context": {
"name": "Coding Agent Context",
"id": "agent-context",
"version": "1.0.1",
"version": "1.0.2",
"description": "Manages coding agent context/instruction files (e.g., CLAUDE.md, copilot-instructions.md) with project-specific plan references and configurable markers",
"author": "spec-kit-core",
"repository": "https://github.com/github/spec-kit",
Expand Down
11 changes: 10 additions & 1 deletion integrations/catalog.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"schema_version": "1.0",
"updated_at": "2026-08-31T00:00:00Z",
"updated_at": "2026-09-24T23:51:45Z",
"catalog_url": "https://raw.githubusercontent.com/github/spec-kit/main/integrations/catalog.json",
"integrations": {
"alquimia": {
Expand Down Expand Up @@ -371,6 +371,15 @@
"author": "spec-kit-core",
"repository": "https://github.com/github/spec-kit",
"tags": ["cli", "skills"]
},
"mcode": {
Comment thread
Copilot marked this conversation as resolved.
"id": "mcode",
"name": "MiniMax Code",
"version": "1.0.0",
"description": "MiniMax Code CLI skills-based integration",
"author": "spec-kit-core",
"repository": "https://github.com/github/spec-kit",
"tags": ["cli", "skills"]
}
}
}
2 changes: 1 addition & 1 deletion src/specify_cli/_invocation_style.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@

# Agents that always render /speckit-<name>, regardless of ai_skills.
ALWAYS_SLASH_AGENTS: frozenset[str] = frozenset(
{"devin", "droid", "dsh", "grok", "muse", "qodercli", "trae", "zed"}
{"devin", "droid", "dsh", "grok", "mcode", "muse", "qodercli", "trae", "zed"}

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The existing tests/integrations/test_integration_zed.py::TestSlashSkillsSets matrix includes mcode with both ai_skills=True and ai_skills=False, each expecting /speckit-plan; both cases pass. Posted on behalf of @philo-x by Codex (model: GPT-6 Sol, autonomous); comment fully AI-drafted.

)

# Agents that render /speckit-<name> only when ai_skills is enabled.
Expand Down
7 changes: 7 additions & 0 deletions src/specify_cli/command_init.py
Original file line number Diff line number Diff line change
Expand Up @@ -1010,6 +1010,7 @@ def init(
zcode_skill_mode = selected_ai == "zcode" and _is_skills_integration
claude_skill_mode = selected_ai == "claude" and _is_skills_integration
kimi_skill_mode = selected_ai == "kimi"
mcode_skill_mode = selected_ai == "mcode" and _is_skills_integration
agy_skill_mode = selected_ai == "agy" and _is_skills_integration
trae_skill_mode = selected_ai == "trae"
cursor_agent_skill_mode = (
Expand All @@ -1029,6 +1030,7 @@ def init(
or zcode_skill_mode
or claude_skill_mode
or kimi_skill_mode
or mcode_skill_mode
or agy_skill_mode
or trae_skill_mode
or cursor_agent_skill_mode
Expand Down Expand Up @@ -1091,6 +1093,11 @@ def init(
f"{step_num}. Start Bob in this project directory; spec-kit skills were installed to [cyan].bob/skills[/cyan]"
)
step_num += 1
if mcode_skill_mode:
steps_lines.append(
f"{step_num}. Start MiniMax Code in this project directory; spec-kit skills were installed to [cyan].minimax/skills[/cyan]"
)
step_num += 1
usage_label = "skills" if native_skill_mode else "slash commands"

from ._invocation_style import (
Expand Down
2 changes: 2 additions & 0 deletions src/specify_cli/integrations/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ def _register_builtins() -> None:
from .kimi import KimiIntegration
from .kiro_cli import KiroCliIntegration
from .lingma import LingmaIntegration
from .mcode import McodeIntegration
from .muse import MuseIntegration
from .omp import OmpIntegration
from .opencode import OpencodeIntegration
Expand Down Expand Up @@ -132,6 +133,7 @@ def _register_builtins() -> None:
_register(KimiIntegration())
_register(KiroCliIntegration())
_register(LingmaIntegration())
_register(McodeIntegration())
_register(MuseIntegration())
_register(OmpIntegration())
_register(OpencodeIntegration())
Expand Down
74 changes: 74 additions & 0 deletions src/specify_cli/integrations/mcode/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
"""MiniMax Code integration — skills-based agent.

MiniMax Code discovers project skills from
``.minimax/skills/speckit-<name>/SKILL.md`` and invokes them via their
slash shortcut (``/speckit-<command>``).

See: https://github.com/MiniMax-AI/minimax-code
"""

from __future__ import annotations

from collections.abc import Mapping, Sequence
from pathlib import Path
from typing import Any

from ..base import IntegrationOption, SkillsIntegration


class McodeIntegration(SkillsIntegration):
"""Integration for MiniMax Code CLI."""

key = "mcode"
config = {
"name": "MiniMax Code",
"folder": ".minimax/",
"commands_subdir": "skills",
"install_url": "https://github.com/MiniMax-AI/minimax-code",
"requires_cli": True,
}
registrar_config = {
"dir": ".minimax/skills",
"format": "markdown",
"args": "$ARGUMENTS",
"extension": "/SKILL.md",
}
multi_install_safe = True

@classmethod
def options(cls) -> list[IntegrationOption]:
opts = super().options()
opts.append(
IntegrationOption(
"--skills",
is_flag=True,
default=True,
help="Install as agent skills (default for MiniMax Code)",
)
)
return opts

def build_exec_args(
self,
prompt: str,
*,
model: str | None = None,
output_json: bool = True,
integration_args: Sequence[str] | None = None,
integration_options: Mapping[str, Any] | None = None,
project_root: Path | None = None,
) -> list[str] | None:
self.validate_runtime_config(
integration_args,
integration_options,
)
# Spec Kit dispatch is non-interactive: a permission request cannot be
# answered by the caller. Allow the workflow to run to completion.
# Extra args come afterward so operators can select a stricter mode.
args = [self._resolve_executable(), "exec", prompt, "--permission", "full"]
self._apply_extra_args_env_var(args)
if model:
args.extend(["--model", model])
if output_json:
args.extend(["--output-format", "json"])
return args
33 changes: 27 additions & 6 deletions tests/extensions/test_update_agent_context_python_parity.py
Original file line number Diff line number Diff line change
Expand Up @@ -459,13 +459,29 @@ def test_python_empty_config_matching_bash(tmp_path: Path) -> None:
assert "context_files/context_file not set" in py.stderr


@requires_posix_bash
def test_python_self_seed_from_init_options_matching_bash(tmp_path: Path) -> None:
@pytest.mark.parametrize(
"run_shell",
[
pytest.param(run_bash, id="bash", marks=requires_posix_bash),
pytest.param(
run_powershell,
id="powershell",
marks=pytest.mark.skipif(not POWERSHELL, reason="no PowerShell available"),
),
],
)
@pytest.mark.parametrize(
("integration", "context_file"),
[("claude", "CLAUDE.md"), ("mcode", "AGENTS.md")],
)
def test_python_self_seed_from_init_options_matching_shell(
tmp_path: Path, run_shell, integration: str, context_file: str
) -> None:
repo_a, repo_b = twin_projects(tmp_path)
for repo in (repo_a, repo_b):
add_plan(repo)
(repo / ".specify" / "init-options.json").write_text(
json.dumps({"integration": "claude"}), encoding="utf-8"
json.dumps({"integration": integration}), encoding="utf-8"
)
shutil.copy(
EXT_DIR / "agent-context-defaults.json",
Expand All @@ -476,11 +492,16 @@ def test_python_self_seed_from_init_options_matching_bash(tmp_path: Path) -> Non
/ "agent-context-defaults.json",
)

bash = run_bash(repo_a)
shell = run_shell(repo_a)
py = run_python(repo_b)

assert_parity(bash, py, repo_a, repo_b)
assert (repo_a / "CLAUDE.md").read_bytes() == (repo_b / "CLAUDE.md").read_bytes()
assert shell.returncode == py.returncode == 0, shell.stderr + py.stderr
if run_shell is run_bash:
assert_parity(shell, py, repo_a, repo_b)
content = (repo_b / context_file).read_bytes()
assert (repo_a / context_file).read_bytes() == content
assert b"<!-- SPECKIT START -->" in content
assert b"specs/001-demo/plan.md" in content


@requires_posix_bash
Expand Down
Loading