You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[Bug]: 0.4.2 removed "extension" command from specify #1982
specify extension add verify-tasks
Usage: specify [OPTIONS] COMMAND [ARGS]...
Try 'specify --help' for help.
Error │ No such command 'extension'. Did you mean 'version'
Help does not list "extension" in version 0.4.2
specify --help
GitHub Spec Kit - Spec-Driven Development Toolkit
Usage: specify [OPTIONS] COMMAND [ARGS]...
Setup tool for Specify spec-driven development projects
Options
│ --help Show this message and exit.
Commands
│ init Initialize a new Specify project from the latest template.
│ check Check that all required tools are installed.
│ version Display version and system information.
Steps to Reproduce
Run specify extension add <extension>
Run specify --help
Run specify extension --help
Expected Behavior
Extensions are installed or the command is available.
Without --from git+https://github.com/github/spec-kit.git, uv fetched specify-cli from PyPI — where there is a completely unrelated package also called specify-cli (versions 0.0.20, 0.0.22, 1.0.0) with no author, no homepage, no project URLs. It's a different project
that squatted the same PyPI name.
That PyPI package is a minimal stub with only init, check, version — no extension command.
The real spec-kit specify-cli is only distributed from GitHub, not PyPI.
This will restore the extension command and give you the proper 0.4.3 version. The manual installation I did earlier will still work once the CLI is back to spec-kit's version.
I verified that everything works once installed latest from github.
@mnriem any idea where packages in PyPI are coming from? one possibility is to fix the packages. if we do not have it undee control, then fix to doc is the way to go - it's really not clear what's happening (i reproduced by 'accident' only, needed to test something quickly and did not want to use my local modified speckit). less experienced users my get very confused.
IMO install from github release is reliable and should be recommended .
Reported by @ChristianPresley on 2026-03-26 against v0.4.2. Running specify extension add verify-tasks produced:
Error │ No such command 'extension'. Did you mean 'version'?
specify --help only listed init, check, version — the entire extension subcommand group was absent.
Symptom
The extension subcommand was entirely absent from the CLI. Expected: specify extension add <name> should install an extension from the catalog. Actual: Click reported no such command, as though extension management had been stripped from the binary.
Reproduction
Run uv tool install specify-cli --force (without `--from (github.com/redacted)
Run specify extension add verify-tasks
Observe: No such command 'extension'
Run specify --help — only init, check, version are listed
Root cause confirmed by contributor @mbachorik: step 1 installs the unrelated PyPI squatter package specify-cli (versions 0.0.20, 0.0.22, 1.0.0 — no author, no homepage), which is a minimal stub missing extension, preset, self, and all other spec-kit commands.
Suspected Code Paths
The trigger was an incomplete upgrade hint in an older CLI error message. The now-fixed constant in the current codebase is:
The live implementation in extensions.py uses REINSTALL_COMMAND (correct), so the RFC stale example does not affect runtime behavior.
Root Cause Hypothesis
Confidence: high. In v0.4.2, one or more CLI error-message paths emitted uv tool install specify-cli --force without --from (github.com/redacted) A user following this hint would install the PyPI squatter (specify-cli 1.0.0) — a stub with only init, check, and version— silently replacing the real spec-kit CLI. The squatter has noextension` subcommand, producing the observed error.
This is a design document — no runtime impact — but keeps docs consistent and avoids confusing future contributors.
Alternatives:
Add a runtime fingerprint check in specify version or specify check that warns when the installed version matches known PyPI squatter version strings (0.0.20, 0.0.22, 1.0.0). Trade-off: fragile; the squatter could publish new versions. Low value since users running the squatter wouldn't have extension available to trigger this check anyway.
Files likely to change:
extensions/RFC-EXTENSION-SYSTEM.md (stale upgrade hint in design doc)
Tests to add or update:
The existing upgrade guidance tests in tests/test_self_upgrade_guidance.py and tests/test_self_upgrade_execution.py already assert that all uv tool install hints include --from. These cover the fixed paths.
No new tests required for the RFC doc fix.
Risks & Considerations
User impact (v0.4.2 users): Any user still on v0.4.2 who follows a bare uv tool install specify-cli --force hint will still experience this. Upgrading to v0.7.1+ resolves it.
PyPI squatter: The unrelated specify-cli package on PyPI remains published. There is no action spec-kit can take to remove it. The documentation warning is the appropriate mitigation.
No data loss or security risk: The squatter is an inert stub; no user data is affected.
Regression risk: None — the RFC doc change is documentation only.
Open Questions
None. Root cause, reproduction, and fix are all confirmed by contributors in the thread.
Activity
mnriem commentedon Mar 26, 2026
I am unable to reproduce the issue
specify extension add verify-tasks
Error: 'verify-tasks' is available in the 'community' catalog but installation is not allowed from that catalog.
To enable installation, add 'verify-tasks' to an approved catalog (install_allowed: true) in .specify/extension-catalogs.yml.
mbachorik commentedon Mar 26, 2026
i have just reproduced:
michalbachorik@Michals-MacBook-Pro xxxx % uv tool install specify-cli --force
Resolved 20 packages in 338ms
Prepared 2 packages in 142ms
Installed 20 packages in 21ms
Installed 1 executable: specify
michalbachorik@Michals-MacBook-Pro xxxxx % specify extension add --dev ../../bugfixes/yyyyyyyyyyy
Usage: specify [OPTIONS] COMMAND [ARGS]...
Try 'specify --help' for help.
╭─ Error ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ No such command 'extension'. Did you mean 'version'?
Looking into it
mbachorik commentedon Mar 26, 2026
Doc bug.
Caused by install from PyPi which has stale package.
What happened
The upgrade instruction in the error message was incomplete/wrong. It said:
uv tool install specify-cli --force
But the correct command, per spec-kit's own README, is:
uv tool install specify-cli --force --from git+https://github.com/github/spec-kit.git@vX.Y.Z
Without --from git+https://github.com/github/spec-kit.git, uv fetched specify-cli from PyPI — where there is a completely unrelated package also called specify-cli (versions 0.0.20, 0.0.22, 1.0.0) with no author, no homepage, no project URLs. It's a different project
that squatted the same PyPI name.
That PyPI package is a minimal stub with only init, check, version — no extension command.
The real spec-kit specify-cli is only distributed from GitHub, not PyPI.
Fix
Reinstall the real spec-kit CLI:
uv tool install specify-cli --force --from git+https://github.com/github/spec-kit.git@v0.4.3
This will restore the extension command and give you the proper 0.4.3 version. The manual installation I did earlier will still work once the CLI is back to spec-kit's version.
I verified that everything works once installed latest from github.
mnriem commentedon Mar 27, 2026
@mbachorik What do you think should we update docs?
mbachorik commentedon Mar 27, 2026
@mnriem any idea where packages in PyPI are coming from? one possibility is to fix the packages. if we do not have it undee control, then fix to doc is the way to go - it's really not clear what's happening (i reproduced by 'accident' only, needed to test something quickly and did not want to use my local modified speckit). less experienced users my get very confused.
IMO install from github release is reliable and should be recommended .
mnriem commentedon Mar 27, 2026
PR? ;)
davesharpe13 commentedon Mar 28, 2026
@ChristianPresley I hope you push on and try the verify-tasks extension, please let us know if it meets your need.
mnriem commentedon Mar 30, 2026
@mbachorik No idea so we will have to make sure our docs make it clear that one CANNOT use PyPi. Want to take on a PR for that?
mbachorik commentedon Mar 30, 2026
i'll bundle it with the other fix. looking at it now.
docs: warn about unofficial PyPI packages and recommend version verif…
docs: warn about unofficial PyPI packages and recommend version verif…
docs: warn about unofficial PyPI packages and recommend version verif…
fix: unofficial PyPI warning (#1982) and legacy extension command nam…
fix: include --from git+... in upgrade hint to avoid PyPI squat packa…
fix: include --from git+... in upgrade hint to avoid PyPI squat packa…
github-actions commentedon Jun 17, 2026
Bug assessment — pypi-squat-extension-missing: Valid · severity medium
Bug Assessment: PyPI Squat Package Causes Missing
extensionCommandpypi-squat-extension-missingReport (summarized)
Reported by @ChristianPresley on 2026-03-26 against v0.4.2. Running
specify extension add verify-tasksproduced:specify --helponly listedinit,check,version— the entireextensionsubcommand group was absent.Symptom
The
extensionsubcommand was entirely absent from the CLI. Expected:specify extension add <name>should install an extension from the catalog. Actual: Click reported no such command, as though extension management had been stripped from the binary.Reproduction
uv tool install specify-cli --force(without `--from (github.com/redacted)specify extension add verify-tasksNo such command 'extension'specify --help— onlyinit,check,versionare listedRoot cause confirmed by contributor
@mbachorik: step 1 installs the unrelated PyPI squatter packagespecify-cli(versions 0.0.20, 0.0.22, 1.0.0 — no author, no homepage), which is a minimal stub missingextension,preset,self, and all other spec-kit commands.Suspected Code Paths
The trigger was an incomplete upgrade hint in an older CLI error message. The now-fixed constant in the current codebase is:
src/specify_cli/extensions.py:55—REINSTALL_COMMAND = "uv tool install specify-cli --force --from (github.com/redacted) (fixed; includes--from`)src/specify_cli/_version.py:968,1002,1177,1189,1203— allself upgradeguidance strings (fixed; each includes--from {_manual_source_spec(...)})One stale example remains in a non-user-facing doc:
extensions/RFC-EXTENSION-SYSTEM.md:1342— code snippet showingf"Upgrade spec-kit with: uv tool install specify-cli --force"(bare, missing--from; RFC design document only, not live code)The live implementation in
extensions.pyusesREINSTALL_COMMAND(correct), so the RFC stale example does not affect runtime behavior.Root Cause Hypothesis
Confidence: high. In v0.4.2, one or more CLI error-message paths emitted
uv tool install specify-cli --forcewithout--from (github.com/redacted) A user following this hint would install the PyPI squatter (specify-cli 1.0.0) — a stub with onlyinit,check, andversion— silently replacing the real spec-kit CLI. The squatter has noextension` subcommand, producing the observed error.Proposed Remediation
Status: substantially fixed in released versions.
Two separate PRs addressed this:
v0.7.1 (PR fix: unofficial PyPI warning (#1982) and legacy extension command name auto-correction (#2017) #2027): Added the
[!IMPORTANT]PyPI warning todocs/installation.mdand related documentation. The README installation instructions already use the full `--from (redacted) form.PR fix: include --from git+... in upgrade hint to avoid PyPI squat package #2411: Fixed all
uv tool install specify-cli --forcehints in CLI error messages andspecify self upgrade/self checkoutput to include--from {git-ref}.Remaining (low-priority) items:
Preferred: Update
extensions/RFC-EXTENSION-SYSTEM.md:1342to replace:f"Upgrade spec-kit with: uv tool install specify-cli --force"with:
This is a design document — no runtime impact — but keeps docs consistent and avoids confusing future contributors.
Alternatives:
specify versionorspecify checkthat warns when the installed version matches known PyPI squatter version strings (0.0.20, 0.0.22, 1.0.0). Trade-off: fragile; the squatter could publish new versions. Low value since users running the squatter wouldn't haveextensionavailable to trigger this check anyway.Files likely to change:
extensions/RFC-EXTENSION-SYSTEM.md(stale upgrade hint in design doc)Tests to add or update:
tests/test_self_upgrade_guidance.pyandtests/test_self_upgrade_execution.pyalready assert that alluv tool installhints include--from. These cover the fixed paths.Risks & Considerations
uv tool install specify-cli --forcehint will still experience this. Upgrading to v0.7.1+ resolves it.specify-clipackage on PyPI remains published. There is no action spec-kit can take to remove it. The documentation warning is the appropriate mitigation.Open Questions
mnriem commentedon Jun 18, 2026
Please upgrade to the latest version using the mechanism described in the release notes
fix: unofficial PyPI warning (github#1982) and legacy extension comma…
fix: include --from git+... in upgrade hint to avoid PyPI squat packa…