[Feature]: Add --json output to preset info and extension info with fully-expanded per-contribution detail (per-pack detail view; complements list --json summary counts)
Maintainer antworten meist innerhalb von 1 Tag
@nefayran arbeitet bereits daran.
Seit 02.10.2026.
Bewertung
- Schwierigkeit
- 5/5
- Geschätzter Aufwand
- Über eine Woche
- Anfängerfreundlichkeit
- 45/100
- Issue-Typ
- Feature
- Klarheit
- Größtenteils klar
- Aktivitätsstatus
- Aktiv
- Tech-Stack
- javascript, python
- Bereich
- cli, documentation, testing
Rechercherichtung
Beginne mit den CLI-Einstiegspunkten preset info --json und extension info --json, und verfolge dann die bestehende Normalisierung in composition/collect.mjs::parseProvidesEntries und ::parseHookDeclarations; prüfe extensions/__init__.py:622-626 auf das Verhalten, das nur Ersetzungen zulässt. Vergleiche die Ausgabe mit den Verträgen der zugehörigen Befehle list --json und artifact info --json. Als abgeschlossen gilt die Arbeit, wenn die spezifizierten erweiterten Schemas, stabilen IDs, die Normalisierung, Fehler, Tests und die CLI-Referenzdokumentation vollständig sind.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
Problem Statement
Today specify preset info <id> and specify extension info <id> emit only text. speckit-wizard-canvas reads the raw preset.yml / extension.yml files with js-yaml and re-normalizes the shape itself in composition/collect.mjs::parseProvidesEntries and ::parseHookDeclarations — including strategy inference from shorthand keys (replaces vs. wraps vs. prepends vs. appends), hook-phase normalization (phase vs. trigger, command vs. targetCommand), and script-runtime inference by globbing scripts/{bash,powershell,python}/*.{sh,ps1,py}. All of this is server-side data being reconstructed on the client.
Downstream consumers need the structured shape returned by the CLI itself so they can stop reconstructing it.
How this differs from the companion preset list --json / extension list --json issue. The list variant operates on the collection of installed packs and returns a JSON array, one row per pack, where provides is just integer counts ({ commands: 4, templates: 2, scripts: 1, hooks: 3 }) — a summary/catalog view suitable for "here's every preset the project has". info operates on one pack, addressed by id, and returns a single JSON object where provides is fully expanded — every command, template, script, and hook enumerated with its full per-contribution schema (id, name, description, artifact, optional, handoffs, strategy, sourcePath, runtimes, etc.). A wizard rendering "here's what speckit.git contributes to my project" needs the info detail; list's counts are not enough. Both surfaces are required; neither is a subset of the other.
Proposed Solution
Add --json to both info commands. Output shape:
{
"id": "…", "name": "…", "description": "…", "version": "…",
"author": "…", "priority": 100, "enabled": true, "source": { "…": "…" },
"commands": [
{ "id": "…", "name": "speckit.plan", "description": "…",
"artifact": "specs/{feature}/plan.md", "optional": false,
"handoffs": [ { "to": "speckit.tasks", "when": "…", "message": "…" } ],
"strategy": "wrap",
"source": { "layer": "preset", "presetId": "…" },
"sourcePath": "commands/speckit.plan.md" }
],
"templates": [
{ "id": "…", "name": "…", "description": "…",
"strategy": "replace",
"source": { "…": "…" }, "sourcePath": "templates/…" }
],
"scripts": [
{ "id": "…", "name": "…", "description": "…",
"strategy": "replace",
"source": { "…": "…" }, "sourcePath": "scripts/bash/…",
"runtimes": ["bash", "powershell", "python"] }
],
"hooks": [
{ "id": "…", "name": "…", "description": "…",
"trigger": "before_speckit.plan", "targetCommand": "speckit.git.checklist",
"sourcePath": "commands/speckit.git.checklist.md",
"optional": false, "priority": 10 }
]
}
Notes:
- Preset objects omit
hooks. - Extension
commands/templates/scriptsentries omitstrategy(they are alwaysreplace, per the replace-only rule enforced atextensions/__init__.py:622-626). idvalues use the stable-id scheme from the companion "stable id / lookupId" issue; theidon a per-contribution entry is what the companionspecify artifact info --jsonstack'slookupIdpoints at.artifact,optional,handoffson commands come from the companion "artifact/optional/handoffs" issue.runtimeson scripts comes directly from the manifest (extensions post-#4010; add the same field to preset script entries for parity).- All shorthand-key normalization (
replaces/wraps/prepends/appends→strategy: "replace"|"wrap"|"prepend"|"append") is done server-side.
Alternatives Considered
- Fold everything into the companion
specify artifact info --jsoncommand. Rejected —artifact infois per-artifact (walks one composition stack across all installed packs);info --jsonis per-source (walks one preset/extension across all its contributions). Both are needed and neither is a subset of the other. - Fold everything into the companion
preset list --json/extension list --json. Rejected — that surface is per-collection with summary counts;infois per-pack with full expansion. Different shape, different call pattern, different use cases (see Problem Statement). - Emit YAML. Rejected — the whole point is to let the wizard drop
js-yaml. - Leave hook-phase / strategy shorthand un-normalized. Rejected — every consumer would reproduce the client-side logic from
composition/collect.mjsand drift over time.
Component
Specify CLI (initialization, commands)
AI Agent (if applicable)
Not applicable
Use Cases
speckit-wizard-canvasdeletescomposition/collect.mjs::parseProvidesEntriesand::parseHookDeclarations, replacing them withJSON.parse(execFileSync("specify", ["preset", "info", "<id>", "--json"]))/specify extension info <id> --json. This is the change that removes thejs-yamldependency.- An IDE plugin renders hover-cards on command names by looking up the
commands[]entry (description,artifact,handoffs). - A pre-commit check walks
extension info --json'shooks[]to warn when two extensions register the sametriggerat the samepriority.
Acceptance Criteria
-
specify preset info <id> --jsonandspecify extension info <id> --jsonemit a single JSON object with top-level fields matching the companionlist --jsonissue (id,name,description,version,author,priority,enabled,source) plus fully-expandedcommands,templates,scriptsarrays (andhooksfor extensions) — not integer counts. - Command entries include
artifact,optional,handoffs(from the companion command-fields issue). - Script entries include
runtimesfor both presets and extensions. - Preset command/template/script entries include
strategy; extension entries omit it (or set to"replace"for informational purposes). - Shorthand keys (
replaces/wraps/prepends/appends) are normalized server-side intostrategy. - Hook entries include
trigger,targetCommand,sourcePath,optional,priority—phase/commandshorthand normalized. - All
idvalues follow the stable-id scheme and are stable across reinstalls, matching thelookupIdvalues emitted byspecify artifact info --json. - Unknown id → non-zero exit + stderr JSON error.
- Tests: schema round-trip, strategy normalization (all four shorthand forms), hook shorthand normalization, extension replace-only enforcement, handoffs frontmatter-merge, and
idcross-reference withspecify artifact info --jsonoutput. - Docs:
preset info/extension infosections in the CLI reference show the--jsonshape and normalization rules, plus a note contrastinginfo --json(per-pack, full expansion) withlist --json(per-collection, count summary).
Additional Context
Direct replacement for plugins/spec-kit-copilot-wizard/extensions/speckit-wizard-canvas/composition/collect.mjs::parseProvidesEntries and ::parseHookDeclarations in github/spec-kit-copilot. Depends on the companion "artifact/optional/handoffs" and "stable id / lookupId" issues; benefits from the companion "structured source provenance" issue.
- Vorherrschende Sprache
- Python
- Sterne
- 140k
- Forks
- 12.6k
- Ø Merge
- 2 T. 13 Std.
- Gemergte PRs (30 T.)
- 197
Entwicklungsumgebung
Startet den Dev-Container des Projekts im Browser, mit Ihrem eigenen GitHub-Konto.
- Kein Dockerfile und keine Docker-Compose-Datei
- Hat eine Pull-Request-Vorlage
- Beitragsleitfaden lesen
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus github/spec-kit
-
feature-assess feature-go triage-can-wait
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100
github/spec-kit#4804 · 6 Kommentare ·
Maintainer antworten meist innerhalb von 1 Tag
-
needs-triage triage-nice-to-have
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 72/100
github/spec-kit#4527 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 1 Tag
-
[Bug]: specify init writes speckit.manifest.json without the speckit-converge skill it just installedEvtl. wieder frei Ein Pull Request dazu wurde ohne Merge geschlossen. Offenbug-assess severity-medium
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 72/100
github/spec-kit#4273 · 3 Kommentare ·
Maintainer antworten meist innerhalb von 1 Tag
-
[Bug]: /speckit-implement counts checkbox markers inside fenced code blocks — example checkboxes can falsely block implementationEvtl. vergeben @ntdatt812 hat das vor 30 Tagen übernommen. Offen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 84/100
Maintainer antworten meist innerhalb von 1 Tag
-
[Extension]: Jira Integration (Sync Engine) v0.5.0 (version update of jira-sync)Evtl. vergeben @github-actions hat das vor 54 Tagen übernommen. Offenextension-submission validation-passed
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 72/100
github/spec-kit#4099 · 3 Kommentare ·
Maintainer antworten meist innerhalb von 1 Tag
Alle Issues in github/spec-kit
Ähnliche Issues
-
enhancement good first issue
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100
-
python-version
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 88/100
-
bug
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 62/100
Maintainer antworten meist innerhalb von 1 Tag
-
bug javascript P2-medium python release:v3.1
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 68/100
adrirubio/claude-deck#546 ·
Maintainer antworten meist innerhalb von 1 Tag
-
area: desktop area: website priority: P2 type: feature
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 62/100
appandflow/stim#3411 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 1 Tag