From e2882a22c102e89dec9f307ae96adb80fb3c1be0 Mon Sep 17 00:00:00 2001 From: qiyang <18901998513@163.com> Date: Thu, 23 Apr 2026 23:43:11 +0800 Subject: [PATCH 1/8] add lingma support --- docs/reference/integrations.md | 1 + integrations/catalog.json | 9 +++++ src/specify_cli/integrations/__init__.py | 2 + .../integrations/lingma/__init__.py | 40 +++++++++++++++++++ tests/integrations/test_integration_lingma.py | 11 +++++ 5 files changed, 63 insertions(+) create mode 100644 src/specify_cli/integrations/lingma/__init__.py create mode 100644 tests/integrations/test_integration_lingma.py diff --git a/docs/reference/integrations.md b/docs/reference/integrations.md index dcb9a2b354..0abd1b9eb9 100644 --- a/docs/reference/integrations.md +++ b/docs/reference/integrations.md @@ -23,6 +23,7 @@ The Specify CLI supports a wide range of AI coding agents. When you run `specify | [Kilo Code](https://github.com/Kilo-Org/kilocode) | `kilocode` | | | [Kimi Code](https://code.kimi.com/) | `kimi` | Skills-based integration; supports `--migrate-legacy` for dotted→hyphenated directory migration | | [Kiro CLI](https://kiro.dev/docs/cli/) | `kiro-cli` | Alias: `--integration kiro` | +| [Lingma](https://lingma.aliyun.com/) | `lingma` | Skills-based integration; skills are installed automatically | | [Mistral Vibe](https://github.com/mistralai/mistral-vibe) | `vibe` | | | [opencode](https://opencode.ai/) | `opencode` | | | [Pi Coding Agent](https://pi.dev) | `pi` | Pi doesn't have MCP support out of the box, so `taskstoissues` won't work as intended. MCP support can be added via [extensions](https://github.com/badlogic/pi-mono/tree/main/packages/coding-agent#extensions) | diff --git a/integrations/catalog.json b/integrations/catalog.json index 3df96b8789..7c89344adb 100644 --- a/integrations/catalog.json +++ b/integrations/catalog.json @@ -102,6 +102,15 @@ "repository": "https://github.com/github/spec-kit", "tags": ["cli"] }, + "lingma": { + "id": "lingma", + "name": "Lingma", + "version": "1.0.0", + "description": "Lingma IDE skills-based integration", + "author": "spec-kit-core", + "repository": "https://github.com/github/spec-kit", + "tags": ["ide", "skills"] + }, "junie": { "id": "junie", "name": "Junie", diff --git a/src/specify_cli/integrations/__init__.py b/src/specify_cli/integrations/__init__.py index a5fb3833dc..82e864be40 100644 --- a/src/specify_cli/integrations/__init__.py +++ b/src/specify_cli/integrations/__init__.py @@ -65,6 +65,7 @@ def _register_builtins() -> None: from .kilocode import KilocodeIntegration from .kimi import KimiIntegration from .kiro_cli import KiroCliIntegration + from .lingma import LingmaIntegration from .opencode import OpencodeIntegration from .pi import PiIntegration from .qodercli import QodercliIntegration @@ -95,6 +96,7 @@ def _register_builtins() -> None: _register(KilocodeIntegration()) _register(KimiIntegration()) _register(KiroCliIntegration()) + _register(LingmaIntegration()) _register(OpencodeIntegration()) _register(PiIntegration()) _register(QodercliIntegration()) diff --git a/src/specify_cli/integrations/lingma/__init__.py b/src/specify_cli/integrations/lingma/__init__.py new file mode 100644 index 0000000000..c1a8eae3fb --- /dev/null +++ b/src/specify_cli/integrations/lingma/__init__.py @@ -0,0 +1,40 @@ +"""Lingma IDE integration. — skills-based agent. + +Lingma IDE uses ``.lingma/skills/speckit-/SKILL.md`` layout. +In the Specify CLI Lingma integration, explicit command support was deprecated +since v0.5.1; ``--skills`` defaults to ``True``. +""" + +from __future__ import annotations +from ..base import IntegrationOption, SkillsIntegration + + +class LingmaIntegration(SkillsIntegration): + """Integration for Lingma IDE.""" + + key = "lingma" + config = { + "name": "Lingma", + "folder": ".lingma/", + "commands_subdir": "skills", + "install_url": None, + "requires_cli": False, + } + registrar_config = { + "dir": ".lingma/skills", + "format": "markdown", + "args": "$ARGUMENTS", + "extension": "/SKILL.md", + } + context_file = ".lingma/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 lingma since v0.5.1)", + ), + ] diff --git a/tests/integrations/test_integration_lingma.py b/tests/integrations/test_integration_lingma.py new file mode 100644 index 0000000000..44c240eae6 --- /dev/null +++ b/tests/integrations/test_integration_lingma.py @@ -0,0 +1,11 @@ +"""Tests for LingmaIntegration.""" + +from .test_integration_base_skills import SkillsIntegrationTests + + +class TestLingmaIntegration(SkillsIntegrationTests): + KEY = "lingma" + FOLDER = ".lingma/" + COMMANDS_SUBDIR = "skills" + REGISTRAR_DIR = ".lingma/skills" + CONTEXT_FILE = ".lingma/rules/project_rules.md" From 7d8f2dd870b98109d1a1bbab4002bbf2eccd9eb5 Mon Sep 17 00:00:00 2001 From: qiyang <18901998513@163.com> Date: Thu, 23 Apr 2026 23:44:09 +0800 Subject: [PATCH 2/8] fix --- integrations/catalog.json | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/integrations/catalog.json b/integrations/catalog.json index 7c89344adb..2024a8a2d5 100644 --- a/integrations/catalog.json +++ b/integrations/catalog.json @@ -102,15 +102,6 @@ "repository": "https://github.com/github/spec-kit", "tags": ["cli"] }, - "lingma": { - "id": "lingma", - "name": "Lingma", - "version": "1.0.0", - "description": "Lingma IDE skills-based integration", - "author": "spec-kit-core", - "repository": "https://github.com/github/spec-kit", - "tags": ["ide", "skills"] - }, "junie": { "id": "junie", "name": "Junie", @@ -210,6 +201,15 @@ "repository": "https://github.com/github/spec-kit", "tags": ["cli", "skills"] }, + "lingma": { + "id": "lingma", + "name": "Lingma", + "version": "1.0.0", + "description": "Lingma IDE skills-based integration", + "author": "spec-kit-core", + "repository": "https://github.com/github/spec-kit", + "tags": ["ide", "skills"] + }, "pi": { "id": "pi", "name": "Pi Coding Agent", From 6f1ea8e76a2ed7661392733bb0576a15fb5f10d5 Mon Sep 17 00:00:00 2001 From: "qiyang.yuan" <56426042+WhiteGive-Boy@users.noreply.github.com> Date: Fri, 24 Apr 2026 10:28:38 +0800 Subject: [PATCH 3/8] fix context file --- src/specify_cli/integrations/lingma/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/specify_cli/integrations/lingma/__init__.py b/src/specify_cli/integrations/lingma/__init__.py index c1a8eae3fb..7ffea46cce 100644 --- a/src/specify_cli/integrations/lingma/__init__.py +++ b/src/specify_cli/integrations/lingma/__init__.py @@ -26,7 +26,7 @@ class LingmaIntegration(SkillsIntegration): "args": "$ARGUMENTS", "extension": "/SKILL.md", } - context_file = ".lingma/rules/project_rules.md" + context_file = ".lingma/rules/specify-rules.md" @classmethod def options(cls) -> list[IntegrationOption]: From 1b4ec2a561751219ad26e52af0b15d6133781b18 Mon Sep 17 00:00:00 2001 From: "qiyang.yuan" <56426042+WhiteGive-Boy@users.noreply.github.com> Date: Fri, 24 Apr 2026 10:29:39 +0800 Subject: [PATCH 4/8] Update CONTEXT_FILE path in test integration --- tests/integrations/test_integration_lingma.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integrations/test_integration_lingma.py b/tests/integrations/test_integration_lingma.py index 44c240eae6..959de8d657 100644 --- a/tests/integrations/test_integration_lingma.py +++ b/tests/integrations/test_integration_lingma.py @@ -8,4 +8,4 @@ class TestLingmaIntegration(SkillsIntegrationTests): FOLDER = ".lingma/" COMMANDS_SUBDIR = "skills" REGISTRAR_DIR = ".lingma/skills" - CONTEXT_FILE = ".lingma/rules/project_rules.md" + CONTEXT_FILE = ".lingma/rules/specify-rules.md" From 472caed242606afe96627fbb7675d8c4652d2c0b Mon Sep 17 00:00:00 2001 From: "qiyang.yuan" <56426042+WhiteGive-Boy@users.noreply.github.com> Date: Mon, 27 Apr 2026 15:34:25 +0800 Subject: [PATCH 5/8] fix IntegrationOption.default --- src/specify_cli/integrations/lingma/__init__.py | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/specify_cli/integrations/lingma/__init__.py b/src/specify_cli/integrations/lingma/__init__.py index 7ffea46cce..356bb79f69 100644 --- a/src/specify_cli/integrations/lingma/__init__.py +++ b/src/specify_cli/integrations/lingma/__init__.py @@ -27,14 +27,3 @@ class LingmaIntegration(SkillsIntegration): "extension": "/SKILL.md", } context_file = ".lingma/rules/specify-rules.md" - - @classmethod - def options(cls) -> list[IntegrationOption]: - return [ - IntegrationOption( - "--skills", - is_flag=True, - default=True, - help="Install as agent skills (default for lingma since v0.5.1)", - ), - ] From 005b028a15c1e78f189762edcf2ae3aae4c54a86 Mon Sep 17 00:00:00 2001 From: "qiyang.yuan" <56426042+WhiteGive-Boy@users.noreply.github.com> Date: Tue, 28 Apr 2026 09:52:48 +0800 Subject: [PATCH 6/8] fix IntegrationOption.defaultfix --- src/specify_cli/integrations/lingma/__init__.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/specify_cli/integrations/lingma/__init__.py b/src/specify_cli/integrations/lingma/__init__.py index 356bb79f69..3442f56619 100644 --- a/src/specify_cli/integrations/lingma/__init__.py +++ b/src/specify_cli/integrations/lingma/__init__.py @@ -27,3 +27,15 @@ class LingmaIntegration(SkillsIntegration): "extension": "/SKILL.md", } context_file = ".lingma/rules/specify-rules.md" + + @classmethod + def options(cls) -> list[IntegrationOption]: + return [ + IntegrationOption( + "--skills", + is_flag=True, + default=True, + help="Install as agent skills", + ), + ] + From 3f0923c37da7e7d38b33031f7ebfbc85d355d500 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9C=84=E5=8E=9F?= Date: Wed, 29 Apr 2026 17:21:20 +0800 Subject: [PATCH 7/8] fix: address Copilot review feedback - Add blank line after __future__ import (PEP 8) - Remove trailing whitespace at end of lingma/__init__.py - Bump integrations/catalog.json updated_at timestamp - Add Lingma to supported agent list in README.md --- README.md | 2 +- integrations/catalog.json | 2 +- src/specify_cli/integrations/lingma/__init__.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 88332922d5..0e5b31c76a 100644 --- a/README.md +++ b/README.md @@ -491,7 +491,7 @@ specify init . --force --ai copilot specify init --here --force --ai copilot ``` -The CLI will check if you have Claude Code, Gemini CLI, Cursor CLI, Qwen CLI, opencode, Codex CLI, Qoder CLI, Tabnine CLI, Kiro CLI, Pi, Forge, Goose, or Mistral Vibe installed. If you do not, or you prefer to get the templates without checking for the right tools, use `--ignore-agent-tools` with your command: +The CLI will check if you have Claude Code, Gemini CLI, Cursor CLI, Qwen CLI, opencode, Codex CLI, Qoder CLI, Tabnine CLI, Kiro CLI, Pi, Forge, Goose, Lingma, or Mistral Vibe installed. If you do not, or you prefer to get the templates without checking for the right tools, use `--ignore-agent-tools` with your command: ```bash specify init --ai copilot --ignore-agent-tools diff --git a/integrations/catalog.json b/integrations/catalog.json index 2024a8a2d5..fa19d5424a 100644 --- a/integrations/catalog.json +++ b/integrations/catalog.json @@ -1,6 +1,6 @@ { "schema_version": "1.0", - "updated_at": "2026-04-08T00:00:00Z", + "updated_at": "2026-04-29T00:00:00Z", "catalog_url": "https://raw.githubusercontent.com/github/spec-kit/main/integrations/catalog.json", "integrations": { "claude": { diff --git a/src/specify_cli/integrations/lingma/__init__.py b/src/specify_cli/integrations/lingma/__init__.py index 3442f56619..aa933e1707 100644 --- a/src/specify_cli/integrations/lingma/__init__.py +++ b/src/specify_cli/integrations/lingma/__init__.py @@ -6,6 +6,7 @@ """ from __future__ import annotations + from ..base import IntegrationOption, SkillsIntegration @@ -38,4 +39,3 @@ def options(cls) -> list[IntegrationOption]: help="Install as agent skills", ), ] - From f0f0c5eb061650ab2a460dc4bbe34daf8655b76d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9C=84=E5=8E=9F?= Date: Sun, 3 May 2026 10:01:13 +0800 Subject: [PATCH 8/8] fix: address Copilot review feedback (round 4) - Reword module docstring: Lingma is a brand-new skills-only integration with no prior command-mode history, so 'deprecated since v0.5.1' wording (copied from Trae) was misleading - Remove Lingma from README CLI-tool check list: Lingma is IDE-based (requires_cli=False) and is explicitly skipped by specify init / specify check tool detection --- README.md | 2 +- src/specify_cli/integrations/lingma/__init__.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 0e5b31c76a..88332922d5 100644 --- a/README.md +++ b/README.md @@ -491,7 +491,7 @@ specify init . --force --ai copilot specify init --here --force --ai copilot ``` -The CLI will check if you have Claude Code, Gemini CLI, Cursor CLI, Qwen CLI, opencode, Codex CLI, Qoder CLI, Tabnine CLI, Kiro CLI, Pi, Forge, Goose, Lingma, or Mistral Vibe installed. If you do not, or you prefer to get the templates without checking for the right tools, use `--ignore-agent-tools` with your command: +The CLI will check if you have Claude Code, Gemini CLI, Cursor CLI, Qwen CLI, opencode, Codex CLI, Qoder CLI, Tabnine CLI, Kiro CLI, Pi, Forge, Goose, or Mistral Vibe installed. If you do not, or you prefer to get the templates without checking for the right tools, use `--ignore-agent-tools` with your command: ```bash specify init --ai copilot --ignore-agent-tools diff --git a/src/specify_cli/integrations/lingma/__init__.py b/src/specify_cli/integrations/lingma/__init__.py index aa933e1707..b5cd036033 100644 --- a/src/specify_cli/integrations/lingma/__init__.py +++ b/src/specify_cli/integrations/lingma/__init__.py @@ -1,8 +1,8 @@ """Lingma IDE integration. — skills-based agent. Lingma IDE uses ``.lingma/skills/speckit-/SKILL.md`` layout. -In the Specify CLI Lingma integration, explicit command support was deprecated -since v0.5.1; ``--skills`` defaults to ``True``. +In Specify CLI, the Lingma integration is skills-only, and ``--skills`` +defaults to ``True``. """ from __future__ import annotations