@@ -1492,9 +1492,7 @@ def load_init_options(project_path: Path) -> dict[str, Any]:
14921492
14931493# Agent-specific skill directory overrides for agents whose skills directory
14941494# doesn't follow the standard <agent_folder>/skills/ pattern
1495- AGENT_SKILLS_DIR_OVERRIDES = {
1496- "codex" : ".agents/skills" , # Codex agent layout override
1497- }
1495+ AGENT_SKILLS_DIR_OVERRIDES = {}
14981496
14991497# Default skills directory for agents not in AGENT_CONFIG
15001498DEFAULT_SKILLS_DIR = ".agents/skills"
@@ -1648,10 +1646,7 @@ def install_ai_skills(
16481646 command_name = command_name [len ("speckit." ):]
16491647 if command_name .endswith (".agent" ):
16501648 command_name = command_name [:- len (".agent" )]
1651- if selected_ai == "kimi" :
1652- skill_name = f"speckit.{ command_name } "
1653- else :
1654- skill_name = f"speckit-{ command_name } "
1649+ skill_name = f"speckit-{ command_name } "
16551650
16561651 # Create skill directory (additive — never removes existing content)
16571652 skill_dir = skills_dir / skill_name
@@ -1730,8 +1725,48 @@ def _has_bundled_skills(project_path: Path, selected_ai: str) -> bool:
17301725 if not skills_dir .is_dir ():
17311726 return False
17321727
1733- pattern = "speckit.*/SKILL.md" if selected_ai == "kimi" else "speckit-*/SKILL.md"
1734- return any (skills_dir .glob (pattern ))
1728+ return any (skills_dir .glob ("speckit-*/SKILL.md" ))
1729+
1730+
1731+ def _migrate_legacy_kimi_dotted_skills (skills_dir : Path ) -> tuple [int , int ]:
1732+ """Migrate legacy Kimi dotted skill dirs (speckit.xxx) to hyphenated format.
1733+
1734+ Temporary migration helper:
1735+ - Intended removal window: after 2026-06-25.
1736+ - Purpose: one-time cleanup for projects initialized before Kimi moved to
1737+ hyphenated skills (speckit-xxx).
1738+
1739+ Returns:
1740+ Tuple[migrated_count, removed_count]
1741+ - migrated_count: old dotted dir renamed to hyphenated dir
1742+ - removed_count: old dotted dir deleted because hyphenated dir already existed
1743+ """
1744+ if not skills_dir .is_dir ():
1745+ return (0 , 0 )
1746+
1747+ migrated_count = 0
1748+ removed_count = 0
1749+
1750+ for legacy_dir in sorted (skills_dir .glob ("speckit.*" )):
1751+ if not legacy_dir .is_dir ():
1752+ continue
1753+ if not (legacy_dir / "SKILL.md" ).exists ():
1754+ continue
1755+
1756+ suffix = legacy_dir .name [len ("speckit." ):]
1757+ if not suffix :
1758+ continue
1759+
1760+ target_dir = skills_dir / f"speckit-{ suffix .replace ('.' , '-' )} "
1761+
1762+ if target_dir .exists ():
1763+ shutil .rmtree (legacy_dir )
1764+ removed_count += 1
1765+ else :
1766+ shutil .move (str (legacy_dir ), str (target_dir ))
1767+ migrated_count += 1
1768+
1769+ return (migrated_count , removed_count )
17351770
17361771
17371772AGENT_SKILLS_MIGRATIONS = {
@@ -2097,13 +2132,23 @@ def init(
20972132 if ai_skills :
20982133 if selected_ai in NATIVE_SKILLS_AGENTS :
20992134 skills_dir = _get_skills_dir (project_path , selected_ai )
2135+ migrated_legacy_kimi_skills = 0
2136+ removed_legacy_kimi_skills = 0
2137+ if selected_ai == "kimi" :
2138+ migrated_legacy_kimi_skills , removed_legacy_kimi_skills = _migrate_legacy_kimi_dotted_skills (skills_dir )
21002139 bundled_found = _has_bundled_skills (project_path , selected_ai )
21012140 if bundled_found :
2141+ detail = f"bundled skills → { skills_dir .relative_to (project_path )} "
2142+ if migrated_legacy_kimi_skills or removed_legacy_kimi_skills :
2143+ detail += (
2144+ f" (migrated { migrated_legacy_kimi_skills } , "
2145+ f"removed { removed_legacy_kimi_skills } legacy Kimi dotted skills)"
2146+ )
21022147 if tracker :
21032148 tracker .start ("ai-skills" )
2104- tracker .complete ("ai-skills" , f"bundled skills → { skills_dir . relative_to ( project_path ) } " )
2149+ tracker .complete ("ai-skills" , detail )
21052150 else :
2106- console .print (f"[green]✓[/green] Using bundled agent skills in { skills_dir . relative_to ( project_path ) } / " )
2151+ console .print (f"[green]✓[/green] Using { detail } " )
21072152 else :
21082153 # Compatibility fallback: convert command templates to skills
21092154 # when an older template archive does not include native skills.
@@ -2288,7 +2333,7 @@ def _display_cmd(name: str) -> str:
22882333 if codex_skill_mode :
22892334 return f"$speckit-{ name } "
22902335 if kimi_skill_mode :
2291- return f"/skill:speckit. { name } "
2336+ return f"/skill:speckit- { name } "
22922337 return f"/speckit.{ name } "
22932338
22942339 steps_lines .append (f"{ step_num } . Start using { usage_label } with your AI agent:" )
0 commit comments