Skip to content

Bundled scripts print /speckit.X in error messages, ignoring integration's invoke_separator #2587

@matthew-a-t

Description

@matthew-a-t

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

  1. specify init --integration claude --script sh in a fresh repo.
  2. Trigger any prerequisite failure (e.g. run .specify/scripts/bash/check-prerequisites.sh --json --paths-only without prior specify invocations creating a feature).
  3. 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions