Summary
.specify/scripts/{bash,powershell}/{setup-tasks,check-prerequisites,common}.{sh,ps1} hardcode /speckit.<name> slash-command references in error text and comments. For the Claude integration (and any other SkillsIntegration subclass with invoke_separator = "-"), this prints commands users cannot invoke — the actual installed skills are /speckit-<name>.
Reproduction
specify init --integration claude --script sh in a fresh repo.
- Trigger any prerequisite failure (e.g. run
.specify/scripts/bash/check-prerequisites.sh --json --paths-only without prior specify invocations creating a feature).
- Observe output:
Run /speckit.specify first to create the feature structure. — but the installed Claude skill invokes as /speckit-specify. Same pattern in the other 13 occurrences listed below.
Affected files (rolling main 0.8.11.dev0)
.specify/scripts/bash/setup-tasks.sh (2 error refs)
.specify/scripts/bash/check-prerequisites.sh (3 error refs)
.specify/scripts/bash/common.sh (2 comment refs)
.specify/scripts/powershell/setup-tasks.ps1 (2 error refs)
.specify/scripts/powershell/check-prerequisites.ps1 (3 error refs)
.specify/scripts/powershell/common.ps1 (2 comment refs)
Total: 14 occurrences across 6 files.
Root cause
specify_cli/integrations/base.py defines SkillsIntegration.invoke_separator = '-' (line ~1347) and SkillsIntegration.build_command_invocation() hardcodes the /speckit- prefix (line ~1389). But the bundled bash/PowerShell scripts emit /speckit.X literals regardless of the active integration's effective separator. The mismatch is internal to spec-kit's own output.
Suggested fix
Scripts should derive the separator at runtime, either:
(a) Template-time rendering: process these scripts through IntegrationBase.resolve_command_refs() (already used for command/skill templates) during specify init / specify integration upgrade, so the active integration's separator is baked in. Cleanest — no runtime overhead.
(b) Runtime read: scripts read .specify/integration.json integration_settings.<active>.invoke_separator and format strings accordingly. Adds JSON parse to every prerequisite check.
Option (a) is cleaner — the scripts stay simple and the rendering already happens for other templates.
Environment
- specify-cli
0.8.11.dev0 (rolling main, uv tool install specify-cli --from git+https://github.com/github/spec-kit.git)
- Integration: claude (SkillsIntegration subclass,
invoke_separator = '-')
- Platform: Windows 11; script content is platform-independent for the affected lines.
Downstream impact
Confused users will type /speckit.specify (the hint) into Claude Code and get "command not found"; they must learn to mentally translate to /speckit-specify. Trivial fix that removes a documented papercut.
Summary
.specify/scripts/{bash,powershell}/{setup-tasks,check-prerequisites,common}.{sh,ps1}hardcode/speckit.<name>slash-command references in error text and comments. For the Claude integration (and any otherSkillsIntegrationsubclass withinvoke_separator = "-"), this prints commands users cannot invoke — the actual installed skills are/speckit-<name>.Reproduction
specify init --integration claude --script shin a fresh repo..specify/scripts/bash/check-prerequisites.sh --json --paths-onlywithout priorspecifyinvocations creating a feature).Run /speckit.specify first to create the feature structure.— but the installed Claude skill invokes as/speckit-specify. Same pattern in the other 13 occurrences listed below.Affected files (rolling main
0.8.11.dev0).specify/scripts/bash/setup-tasks.sh(2 error refs).specify/scripts/bash/check-prerequisites.sh(3 error refs).specify/scripts/bash/common.sh(2 comment refs).specify/scripts/powershell/setup-tasks.ps1(2 error refs).specify/scripts/powershell/check-prerequisites.ps1(3 error refs).specify/scripts/powershell/common.ps1(2 comment refs)Total: 14 occurrences across 6 files.
Root cause
specify_cli/integrations/base.pydefinesSkillsIntegration.invoke_separator = '-'(line ~1347) andSkillsIntegration.build_command_invocation()hardcodes the/speckit-prefix (line ~1389). But the bundled bash/PowerShell scripts emit/speckit.Xliterals regardless of the active integration's effective separator. The mismatch is internal to spec-kit's own output.Suggested fix
Scripts should derive the separator at runtime, either:
(a) Template-time rendering: process these scripts through
IntegrationBase.resolve_command_refs()(already used for command/skill templates) duringspecify init/specify integration upgrade, so the active integration's separator is baked in. Cleanest — no runtime overhead.(b) Runtime read: scripts read
.specify/integration.jsonintegration_settings.<active>.invoke_separatorand format strings accordingly. Adds JSON parse to every prerequisite check.Option (a) is cleaner — the scripts stay simple and the rendering already happens for other templates.
Environment
0.8.11.dev0(rolling main,uv tool install specify-cli --from git+https://github.com/github/spec-kit.git)invoke_separator = '-')Downstream impact
Confused users will type
/speckit.specify(the hint) into Claude Code and get "command not found"; they must learn to mentally translate to/speckit-specify. Trivial fix that removes a documented papercut.