Skip to content

Commit 30a997a

Browse files
committed
fix: apply kimi preset skill overrides without ai-skills flag
1 parent fa56921 commit 30a997a

File tree

3 files changed

+31
-7
lines changed

3 files changed

+31
-7
lines changed

src/specify_cli/extensions.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1635,8 +1635,6 @@ def has_value(self, key_path: str) -> bool:
16351635
class HookExecutor:
16361636
"""Manages extension hook execution."""
16371637

1638-
INIT_OPTIONS_FILE = ".specify/init-options.json"
1639-
16401638
def __init__(self, project_root: Path):
16411639
"""Initialize hook executor.
16421640

src/specify_cli/presets.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -556,26 +556,31 @@ def _unregister_commands(self, registered_commands: Dict[str, List[str]]) -> Non
556556
registrar.unregister_commands(registered_commands, self.project_root)
557557

558558
def _get_skills_dir(self) -> Optional[Path]:
559-
"""Return the skills directory if ``--ai-skills`` was used during init.
559+
"""Return the active skills directory for preset skill overrides.
560560
561561
Reads ``.specify/init-options.json`` to determine whether skills
562562
are enabled and which agent was selected, then delegates to
563563
the module-level ``_get_skills_dir()`` helper for the concrete path.
564564
565+
Kimi is treated as a native-skills agent: if ``ai == "kimi"`` and
566+
``.kimi/skills`` exists, presets should still propagate command
567+
overrides to skills even when ``ai_skills`` is false.
568+
565569
Returns:
566570
The skills directory ``Path``, or ``None`` if skills were not
567-
enabled or the init-options file is missing.
571+
enabled and no native-skills fallback applies.
568572
"""
569573
from . import load_init_options, _get_skills_dir
570574

571575
opts = load_init_options(self.project_root)
572-
if not opts.get("ai_skills"):
573-
return None
574-
575576
agent = opts.get("ai")
576577
if not agent:
577578
return None
578579

580+
ai_skills_enabled = bool(opts.get("ai_skills"))
581+
if not ai_skills_enabled and agent != "kimi":
582+
return None
583+
579584
skills_dir = _get_skills_dir(self.project_root, agent)
580585
if not skills_dir.is_dir():
581586
return None

tests/test_presets.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2120,6 +2120,27 @@ def test_kimi_legacy_dotted_skill_override_still_applies(self, project_dir, temp
21202120
metadata = manager.registry.get("self-test")
21212121
assert "speckit.specify" in metadata.get("registered_skills", [])
21222122

2123+
def test_kimi_skill_updated_even_when_ai_skills_disabled(self, project_dir, temp_dir):
2124+
"""Kimi presets should still propagate command overrides to existing skills."""
2125+
self._write_init_options(project_dir, ai="kimi", ai_skills=False)
2126+
skills_dir = project_dir / ".kimi" / "skills"
2127+
self._create_skill(skills_dir, "speckit-specify", body="untouched")
2128+
2129+
(project_dir / ".kimi" / "commands").mkdir(parents=True, exist_ok=True)
2130+
2131+
manager = PresetManager(project_dir)
2132+
self_test_dir = Path(__file__).parent.parent / "presets" / "self-test"
2133+
manager.install_from_directory(self_test_dir, "0.1.5")
2134+
2135+
skill_file = skills_dir / "speckit-specify" / "SKILL.md"
2136+
assert skill_file.exists()
2137+
content = skill_file.read_text()
2138+
assert "preset:self-test" in content
2139+
assert "name: speckit-specify" in content
2140+
2141+
metadata = manager.registry.get("self-test")
2142+
assert "speckit-specify" in metadata.get("registered_skills", [])
2143+
21232144

21242145
class TestPresetSetPriority:
21252146
"""Test preset set-priority CLI command."""

0 commit comments

Comments
 (0)