mirror of
https://github.com/github/spec-kit.git
synced 2026-07-08 15:06:10 +08:00
feat: add ZCode (Z.AI) integration (#3063)
* feat: add ZCode (Z.AI) integration Add a skills-based integration for ZCode, Z.AI's Claude-Code-style agent. ZCode uses the same SKILL.md layout as Claude Code, so spec-kit installs workflows into .zcode/skills/speckit-<name>/SKILL.md, invoked in chat as $speckit-<name>. - ZcodeIntegration(SkillsIntegration) with .zcode/ folder and --skills option - Register in INTEGRATION_REGISTRY - Catalog entry (tags: cli, skills, z-ai) - Tests via SkillsIntegrationTests mixin - Document in integrations reference and README Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * fix: render $speckit-* invocations for ZCode skills ZCode is documented as a skills agent invoked with $speckit-<command>, but the central invocation rendering only special-cased codex, so specify init Next Steps and extension hooks rendered the dotted /speckit.<command> form instead. Centralize the $speckit-* decision in a DOLLAR_SKILLS_AGENTS set with an is_dollar_skills_agent() helper, and route both init Next Steps and HookExecutor._render_hook_invocation through it. Add ZCode invocation regression tests mirroring the existing Codex/Kimi coverage. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -693,6 +693,7 @@ def register(app: typer.Typer) -> None:
|
||||
) or getattr(resolved_integration, "_skills_mode", False)
|
||||
|
||||
codex_skill_mode = selected_ai == "codex" and _is_skills_integration
|
||||
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"
|
||||
agy_skill_mode = selected_ai == "agy" and _is_skills_integration
|
||||
@@ -706,6 +707,7 @@ def register(app: typer.Typer) -> None:
|
||||
cline_skill_mode = selected_ai == "cline"
|
||||
native_skill_mode = (
|
||||
codex_skill_mode
|
||||
or zcode_skill_mode
|
||||
or claude_skill_mode
|
||||
or kimi_skill_mode
|
||||
or agy_skill_mode
|
||||
@@ -721,6 +723,11 @@ def register(app: typer.Typer) -> None:
|
||||
f"{step_num}. Start Codex in this project directory; spec-kit skills were installed to [cyan].agents/skills[/cyan]"
|
||||
)
|
||||
step_num += 1
|
||||
if zcode_skill_mode:
|
||||
steps_lines.append(
|
||||
f"{step_num}. Start ZCode in this project directory; spec-kit skills were installed to [cyan].zcode/skills[/cyan]"
|
||||
)
|
||||
step_num += 1
|
||||
if claude_skill_mode:
|
||||
steps_lines.append(
|
||||
f"{step_num}. Start Claude in this project directory; spec-kit skills were installed to [cyan].claude/skills[/cyan]"
|
||||
@@ -743,7 +750,10 @@ def register(app: typer.Typer) -> None:
|
||||
step_num += 1
|
||||
usage_label = "skills" if native_skill_mode else "slash commands"
|
||||
|
||||
from .._invocation_style import is_slash_skills_agent as _is_slash_skills_agent
|
||||
from .._invocation_style import (
|
||||
is_dollar_skills_agent as _is_dollar_skills_agent,
|
||||
is_slash_skills_agent as _is_slash_skills_agent,
|
||||
)
|
||||
|
||||
# `_is_skills_integration` means the integration is installed in
|
||||
# skills mode, which is the semantic equivalent of `ai_skills_enabled`
|
||||
@@ -751,7 +761,7 @@ def register(app: typer.Typer) -> None:
|
||||
_ai_skills_enabled = _is_skills_integration
|
||||
|
||||
def _display_cmd(name: str) -> str:
|
||||
if codex_skill_mode:
|
||||
if _is_dollar_skills_agent(selected_ai, _ai_skills_enabled):
|
||||
return f"$speckit-{name}"
|
||||
if kimi_skill_mode:
|
||||
return f"/skill:speckit-{name}"
|
||||
|
||||
Reference in New Issue
Block a user