mirror of
https://github.com/github/spec-kit.git
synced 2026-07-04 04:45:43 +08:00
Compare commits
4 Commits
v0.12.4
...
dependabot
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6c0fb7820b | ||
|
|
bba473c223 | ||
|
|
288bd679f3 | ||
|
|
9bd3512025 |
2
.github/workflows/docs.yml
vendored
2
.github/workflows/docs.yml
vendored
@@ -35,7 +35,7 @@ jobs:
|
||||
fetch-depth: 0 # Fetch all history for git info
|
||||
|
||||
- name: Setup .NET
|
||||
uses: actions/setup-dotnet@9a946fdbd5fb07b82b2f5a4466058b876ab72bb2 # v5.3.0
|
||||
uses: actions/setup-dotnet@26b0ec14cb23fa6904739307f278c14f94c95bf1 # v5.4.0
|
||||
with:
|
||||
dotnet-version: '8.x'
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@ The Specify CLI supports a wide range of AI coding agents. When you run `specify
|
||||
| [IBM Bob](https://www.ibm.com/products/bob) | `bob` | IDE-based agent |
|
||||
| [Junie](https://junie.jetbrains.com/) | `junie` | |
|
||||
| [Kilo Code](https://github.com/Kilo-Org/kilocode) | `kilocode` | |
|
||||
| [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, and (when the `agent-context` extension is enabled) migrates `KIMI.md` context into `AGENTS.md` |
|
||||
| [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 |
|
||||
| [Mistral Vibe](https://github.com/mistralai/mistral-vibe) | `vibe` | |
|
||||
@@ -218,7 +218,7 @@ Some integrations accept additional options via `--integration-options`:
|
||||
| Integration | Option | Description |
|
||||
| ----------- | ------------------- | -------------------------------------------------------------- |
|
||||
| `generic` | `--commands-dir` | Required. Directory for command files |
|
||||
| `kimi` | `--migrate-legacy` | Migrate legacy `.kimi/skills/` installs to `.kimi-code/skills/` (including dotted→hyphenated directory names); when the `agent-context` extension is enabled, also migrates `KIMI.md` to `AGENTS.md` |
|
||||
| `kimi` | `--migrate-legacy` | Migrate legacy `.kimi/skills/` installs to `.kimi-code/skills/` (including dotted→hyphenated skill naming, e.g. `speckit.xxx` → `speckit-xxx`) |
|
||||
|
||||
Example:
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[project]
|
||||
name = "specify-cli"
|
||||
version = "0.12.4"
|
||||
version = "0.12.5.dev0"
|
||||
description = "Specify CLI, part of GitHub Spec Kit. A tool to bootstrap your projects for Spec-Driven Development (SDD)."
|
||||
readme = "README.md"
|
||||
requires-python = ">=3.11"
|
||||
|
||||
@@ -75,7 +75,15 @@ class CursorAgentIntegration(SkillsIntegration):
|
||||
either drops tool calls or exits non-zero on the first approval
|
||||
prompt.
|
||||
"""
|
||||
args = [self.key, "-p", "--trust", "--approve-mcps", "--force", prompt]
|
||||
args = [
|
||||
self._resolve_executable(),
|
||||
"-p",
|
||||
"--trust",
|
||||
"--approve-mcps",
|
||||
"--force",
|
||||
prompt,
|
||||
]
|
||||
self._apply_extra_args_env_var(args)
|
||||
if model:
|
||||
args.extend(["--model", model])
|
||||
if output_json:
|
||||
|
||||
@@ -125,6 +125,55 @@ class TestCursorAgentCliDispatch:
|
||||
assert argv is not None
|
||||
assert argv[0] == "cursor-agent"
|
||||
|
||||
def test_build_exec_args_honors_executable_override(self, monkeypatch):
|
||||
"""``SPECKIT_INTEGRATION_CURSOR_AGENT_EXECUTABLE`` overrides argv[0].
|
||||
|
||||
Every other CLI-dispatch integration (codex, devin, ...) routes
|
||||
argv[0] through ``_resolve_executable()`` so operators can pin a
|
||||
binary path (issue #2596). cursor-agent hardcoded ``self.key`` and
|
||||
silently ignored the documented override.
|
||||
"""
|
||||
monkeypatch.setenv(
|
||||
"SPECKIT_INTEGRATION_CURSOR_AGENT_EXECUTABLE", "/custom/cursor"
|
||||
)
|
||||
i = get_integration("cursor-agent")
|
||||
args = i.build_exec_args("/speckit-plan", output_json=False)
|
||||
assert args[0] == "/custom/cursor"
|
||||
# The mandatory headless flags must still be present.
|
||||
for flag in ("-p", "--trust", "--approve-mcps", "--force"):
|
||||
assert flag in args
|
||||
|
||||
def test_build_exec_args_honors_extra_args_override(self, monkeypatch):
|
||||
"""``SPECKIT_INTEGRATION_CURSOR_AGENT_EXTRA_ARGS`` flags are injected
|
||||
*before* Spec Kit's canonical ``--model`` / ``--output-format`` flags.
|
||||
|
||||
The ``_apply_extra_args_env_var()`` hook (issue #2595) was never
|
||||
invoked by cursor-agent, so operator-supplied flags were dropped.
|
||||
Insertion order is the real contract: extra args must land after the
|
||||
mandatory headless flags but before ``--model`` / ``--output-format``,
|
||||
so they cannot clobber, displace, or reorder Spec Kit's canonical
|
||||
trailing flags. Exercise with both a model and JSON output so both
|
||||
canonical flags are present to pin against.
|
||||
"""
|
||||
monkeypatch.setenv(
|
||||
"SPECKIT_INTEGRATION_CURSOR_AGENT_EXTRA_ARGS", "--foo bar"
|
||||
)
|
||||
i = get_integration("cursor-agent")
|
||||
args = i.build_exec_args(
|
||||
"/speckit-plan", model="sonnet-4-thinking", output_json=True
|
||||
)
|
||||
assert "--foo" in args
|
||||
assert "bar" in args
|
||||
# "bar" is the value of "--foo": the tokens stay adjacent and in order.
|
||||
assert args.index("bar") == args.index("--foo") + 1
|
||||
# Extra args are inserted before the canonical flags, so they cannot
|
||||
# clobber or reorder them (the behavioral contract this test guards).
|
||||
assert args.index("--foo") < args.index("--model")
|
||||
assert args.index("--foo") < args.index("--output-format")
|
||||
# The canonical flags themselves remain intact and correctly paired.
|
||||
assert args[args.index("--model") + 1] == "sonnet-4-thinking"
|
||||
assert args[args.index("--output-format") + 1] == "json"
|
||||
|
||||
def test_build_command_invocation_uses_hyphenated_skill_name(self):
|
||||
"""SkillsIntegration: /speckit-plan (not /speckit.plan)."""
|
||||
i = get_integration("cursor-agent")
|
||||
|
||||
Reference in New Issue
Block a user