[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)
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 5/5
- Thời gian dự kiến
- Hơn một tuần
- Mức phù hợp với người mới
- 45/100
- Loại issue
- Tính năng
- Độ rõ ràng
- Khá rõ ràng
- Mức độ hoạt động
- Sôi nổi
- Công nghệ
- javascript, python
- Lĩnh vực
- cli, documentation, testing
Hướng nghiên cứu
Bắt đầu với các điểm vào CLI preset info --json và extension info --json, sau đó lần theo quá trình chuẩn hóa hiện có trong composition/collect.mjs::parseProvidesEntries và ::parseHookDeclarations; xem xét extensions/__init__.py:622-626 để kiểm tra hành vi chỉ thay thế. So sánh đầu ra với các contract tương ứng của list --json và artifact info --json. Công việc được xem là hoàn tất khi các schema mở rộng được chỉ định, ID ổn định, quá trình chuẩn hóa, lỗi, các bài kiểm thử và tài liệu tham chiếu CLI đều hoàn chỉnh.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
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.
- Ngôn ngữ chính
- Python
- Star
- 138k
- Fork
- 12.4k
- Merge trung bình
- 3 ngày 4 giờ
- Pull request đã merge (30 ngày)
- 154
Hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của github/spec-kit
-
enhancement needs-triage
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
-
enhancement needs-triage
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 74/100
-
enhancement needs-triage
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 84/100
-
enhancement needs-triage triage-can-wait
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 76/100
Tất cả issue của github/spec-kit
Issue tương tự
-
essnmx good first issue
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 95/100
-
[Feature] 奇物选择添加优先级 Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 65/100
syfoud/Simulated_Scepter#174 ·
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 75/100
Giskard-AI/giskard-oss#2840 · 1 bình luận ·
-
A claim comment carrying the issue number is silently declined while the workflow reports success Đang mởarea: repo bug perceived difficulty: 2
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 70/100
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 75/100
yeti-platform/yeti#1380 ·