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
A preset cannot declare that it depends on an extension, so a preset that is useless without one installs silently and appears broken.
@mnriem identified this in #4164 (comment) while reviewing the speckit-inventory / inventory-alignment pair, and suggested tracking it separately rather than blocking that submission:
One genuine gap worth noting: preset.yml's requires: only declares speckit_version, so there's no formal "requires extension X" dependency to guarantee the extension is installed alongside the preset. That's a small, separable core enhancement I'd track on its own issue rather than block this on.
Filing it as suggested. There are three concrete parts to the gap:
1. The manifest cannot express it.PresetManifest validation requires requires.speckit_version and validates nothing else in that section, so there is no supported key for an extension dependency. ExtensionManifest has the same limitation.
2. The catalog already expresses it anyway. Three community presets in presets/catalog.community.json currently carry a requires.extensions array:
Preset
requires.extensions
aide-in-place
["aide"]
inventory-alignment
["speckit-inventory"]
mde
["mde"]
So the field is already a de-facto convention in the catalog, and the preset submission template even has a "Required Extensions (optional)" input that feeds it. But it exists only as catalog metadata — it cannot be declared in the preset package itself, which means it is absent when a preset is installed with --dev or --from <url>, i.e. exactly the paths that bypass the catalog.
3. Nothing enforces it. I could not find any code path that reads requires.extensions to gate or warn on installation. It appears to be purely descriptive.
The user-visible result: install one of those three presets without its extension and the install succeeds, the templates resolve, and the command overrides register — but the parts that call into the extension quietly do nothing. The workflow still runs correctly, so nothing errors; the feature just appears not to work, with no signal pointing at the missing extension.
Proposed Solution
Make the dependency declarable in the manifest and checked at install time.
Schema. Accept an optional requires.extensions in preset.yml, mirroring the shape already used in the catalog:
A plain list of id strings (extensions: ["speckit-inventory"]) should also be accepted, since that is what the three existing catalog entries use.
Validation. Validate the section like speckit_version is validated today: reject non-list values, non-string/non-mapping members, and ids that do not match the existing ^[a-z0-9-]+$ id pattern. #3980 ("reject non-string requires.speckit_version") is the precedent for the strictness level here.
Install-time check. On specify preset add, compare declared dependencies against installed extensions and:
if a required: true dependency is missing, warn clearly and name the extension plus the exact specify extension add command that would satisfy it;
if a version constraint is unsatisfied, warn with both the required and installed versions.
I would suggest warn, not hard-fail, at least initially. These preset overrides are written to degrade safely — without the extension, the core workflow runs unchanged — so blocking the install would be harsher than the situation warrants, and would break the three catalog entries above for anyone who deliberately wants the preset alone. A --force-style escape hatch would be needed if it ever became a hard failure.
Extensions too, if desired.extension.yml has the identical limitation. Extending both keeps the two manifest schemas symmetric, though the preset side is where the demonstrated need is.
Alternatives Considered
Document the pairing in the README and stop there. This is the current workaround, and what the inventory-alignment and aide-in-place READMEs do. It fails because the person who needs the warning is the one who did not read the README — and nothing in the install output points at the problem.
Enforce from the catalog entry only. The data is already there for three presets, so this is the smallest change. But it does nothing for --dev and --from <url> installs, which is how presets are tested and how anything not yet listed is installed. The dependency belongs with the package that has it.
Hard-fail the install on a missing dependency. Cleaner semantics, but it would immediately break installs of the three presets already declaring the field, and it overrides an author who deliberately designed for safe degradation. Better as a later opt-in (required: true already leaves that door open) than as the initial behavior.
Leave it to a package manager.#2566 proposed a community package manager with conflict detection and was closed. Dependency declaration is a manifest concern and much smaller in scope than that proposal.
Component
Specify CLI (initialization, commands)
AI Agent (if applicable)
All agents
Use Cases
1. A read-only primitive plus the preset that wires it in. This is the shape @mnriem recommended in #4164 and that speckit-inventory + inventory-alignment now implement: an extension provides the capability, and a preset overrides core commands to call it. The preset is inert alone. Same shape as aide-in-place + aide and mde + mde.
2. Testing a pair locally before submitting. With --dev installs the catalog is not consulted at all, so an author gets no feedback that they have installed half of their own pair — the case most likely to produce a confused bug report.
3. Maintainer vetting. The submission template collects "Required Extensions" today, but nothing downstream can verify the claim against the package. A manifest field makes it checkable.
Acceptance Criteria
preset.yml accepts an optional requires.extensions, in both the id-string-list and the mapping form.
Invalid shapes are rejected with a clear message, consistent with the existing requires.speckit_version validation.
Omitting requires.extensions remains valid; every existing preset continues to install unchanged.
specify preset add warns when a declared required: true dependency is not installed, naming the extension and the command that installs it.
specify preset add warns when a declared version constraint is unsatisfied, showing required vs installed.
The warning appears for --dev, --from <url>, and catalog installs alike.
Unit tests cover: valid declaration in both forms, each invalid shape, dependency satisfied, dependency missing, and version mismatch.
presets/PUBLISHING.md and the preset schema docs document the new field.
Decide whether the three catalog entries already carrying requires.extensions should be reconciled with the manifests in their source repos, or whether catalog and manifest are allowed to state it independently.
Additional Context
I ran into this as the author of the inventory-alignment preset (#4227, merged in #4229). The robot that added my catalog entry had to patch the dependency back in by hand — its follow-up commit reads "Restore the required speckit-inventory dependency and pin the submitted release archive SHA-256" — which is itself a small sign that the information wants to live somewhere more reliable than a catalog entry assembled from an issue form.
I searched open and closed issues for this and did not find an existing report; the closest is #2566, which was closed and much broader in scope. Happy to be pointed at a duplicate if I missed one.
I am willing to implement this if the approach and the warn-versus-fail decision are acceptable — please confirm the direction before I open a PR, and let me know if you would prefer the extension.yml side included or left out of the first change.
AI disclosure. Filed on behalf of @Yash-Chindam by Claude Code (model: Claude Opus 5), acting autonomously. Per CONTRIBUTING, this used AI assistance for research and drafting: Claude Code inspected the preset and extension manifest validation, searched for prior issues, surveyed the community catalogs for existing requires.extensions usage, and wrote this issue. I reviewed it before filing.
Problem Statement
A preset cannot declare that it depends on an extension, so a preset that is useless without one installs silently and appears broken.
@mnriem identified this in #4164 (comment) while reviewing the
speckit-inventory/inventory-alignmentpair, and suggested tracking it separately rather than blocking that submission:Filing it as suggested. There are three concrete parts to the gap:
1. The manifest cannot express it.
PresetManifestvalidation requiresrequires.speckit_versionand validates nothing else in that section, so there is no supported key for an extension dependency.ExtensionManifesthas the same limitation.2. The catalog already expresses it anyway. Three community presets in
presets/catalog.community.jsoncurrently carry arequires.extensionsarray:requires.extensionsaide-in-place["aide"]inventory-alignment["speckit-inventory"]mde["mde"]So the field is already a de-facto convention in the catalog, and the preset submission template even has a "Required Extensions (optional)" input that feeds it. But it exists only as catalog metadata — it cannot be declared in the preset package itself, which means it is absent when a preset is installed with
--devor--from <url>, i.e. exactly the paths that bypass the catalog.3. Nothing enforces it. I could not find any code path that reads
requires.extensionsto gate or warn on installation. It appears to be purely descriptive.The user-visible result: install one of those three presets without its extension and the install succeeds, the templates resolve, and the command overrides register — but the parts that call into the extension quietly do nothing. The workflow still runs correctly, so nothing errors; the feature just appears not to work, with no signal pointing at the missing extension.
Proposed Solution
Make the dependency declarable in the manifest and checked at install time.
Schema. Accept an optional
requires.extensionsinpreset.yml, mirroring the shape already used in the catalog:A plain list of id strings (
extensions: ["speckit-inventory"]) should also be accepted, since that is what the three existing catalog entries use.Validation. Validate the section like
speckit_versionis validated today: reject non-list values, non-string/non-mapping members, and ids that do not match the existing^[a-z0-9-]+$id pattern.#3980("reject non-stringrequires.speckit_version") is the precedent for the strictness level here.Install-time check. On
specify preset add, compare declared dependencies against installed extensions and:required: truedependency is missing, warn clearly and name the extension plus the exactspecify extension addcommand that would satisfy it;I would suggest warn, not hard-fail, at least initially. These preset overrides are written to degrade safely — without the extension, the core workflow runs unchanged — so blocking the install would be harsher than the situation warrants, and would break the three catalog entries above for anyone who deliberately wants the preset alone. A
--force-style escape hatch would be needed if it ever became a hard failure.Extensions too, if desired.
extension.ymlhas the identical limitation. Extending both keeps the two manifest schemas symmetric, though the preset side is where the demonstrated need is.Alternatives Considered
Document the pairing in the README and stop there. This is the current workaround, and what the
inventory-alignmentandaide-in-placeREADMEs do. It fails because the person who needs the warning is the one who did not read the README — and nothing in the install output points at the problem.Enforce from the catalog entry only. The data is already there for three presets, so this is the smallest change. But it does nothing for
--devand--from <url>installs, which is how presets are tested and how anything not yet listed is installed. The dependency belongs with the package that has it.Hard-fail the install on a missing dependency. Cleaner semantics, but it would immediately break installs of the three presets already declaring the field, and it overrides an author who deliberately designed for safe degradation. Better as a later opt-in (
required: truealready leaves that door open) than as the initial behavior.Leave it to a package manager. #2566 proposed a community package manager with conflict detection and was closed. Dependency declaration is a manifest concern and much smaller in scope than that proposal.
Component
Specify CLI (initialization, commands)
AI Agent (if applicable)
All agents
Use Cases
1. A read-only primitive plus the preset that wires it in. This is the shape @mnriem recommended in #4164 and that
speckit-inventory+inventory-alignmentnow implement: an extension provides the capability, and a preset overrides core commands to call it. The preset is inert alone. Same shape asaide-in-place+aideandmde+mde.2. Testing a pair locally before submitting. With
--devinstalls the catalog is not consulted at all, so an author gets no feedback that they have installed half of their own pair — the case most likely to produce a confused bug report.3. Maintainer vetting. The submission template collects "Required Extensions" today, but nothing downstream can verify the claim against the package. A manifest field makes it checkable.
Acceptance Criteria
preset.ymlaccepts an optionalrequires.extensions, in both the id-string-list and the mapping form.requires.speckit_versionvalidation.requires.extensionsremains valid; every existing preset continues to install unchanged.specify preset addwarns when a declaredrequired: truedependency is not installed, naming the extension and the command that installs it.specify preset addwarns when a declared version constraint is unsatisfied, showing required vs installed.--dev,--from <url>, and catalog installs alike.presets/PUBLISHING.mdand the preset schema docs document the new field.requires.extensionsshould be reconciled with the manifests in their source repos, or whether catalog and manifest are allowed to state it independently.Additional Context
I ran into this as the author of the
inventory-alignmentpreset (#4227, merged in #4229). The robot that added my catalog entry had to patch the dependency back in by hand — its follow-up commit reads "Restore the requiredspeckit-inventorydependency and pin the submitted release archive SHA-256" — which is itself a small sign that the information wants to live somewhere more reliable than a catalog entry assembled from an issue form.I searched open and closed issues for this and did not find an existing report; the closest is #2566, which was closed and much broader in scope. Happy to be pointed at a duplicate if I missed one.
I am willing to implement this if the approach and the warn-versus-fail decision are acceptable — please confirm the direction before I open a PR, and let me know if you would prefer the
extension.ymlside included or left out of the first change.AI disclosure. Filed on behalf of @Yash-Chindam by Claude Code (model: Claude Opus 5), acting autonomously. Per CONTRIBUTING, this used AI assistance for research and drafting: Claude Code inspected the preset and extension manifest validation, searched for prior issues, surveyed the community catalogs for existing
requires.extensionsusage, and wrote this issue. I reviewed it before filing.