一键导入
speckit-analyze
Perform a non-destructive cross-artifact consistency and quality analysis across spec.md, plan.md, and tasks.md after task generation.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Perform a non-destructive cross-artifact consistency and quality analysis across spec.md, plan.md, and tasks.md after task generation.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Consumer-facing guide to hosting an interactive FS.Skia.UI app — the keyboard/pointer input surface, the preview-vs-tree render distinction, and the windowed-fullscreen blur caveat.
Build Skia-rendered FS.Skia.UI Controls, rich text, chart controls, graph controls, DataGrid, custom wrappers, and generated product examples.
Generated product guidance for Skia-rendered FS.Skia.UI Controls, rich text, chart controls, graph controls, DataGrid, and custom wrappers.
Wire a generated FS.Skia.UI product to the desktop viewer host.
Understand and work with the internal keyed VDOM diff over the lowered Control<'msg> IR (feature 067) — its key-first-then-positional matching, the NodePatch/ChildOp operation set, the totality/determinism/identity-at-rest/round-trip invariants, and the module's disposition (internal, property-tested, wired onto the live render path via RetainedRender in feature 091 and current through feature 103 — layout/bounds cache, injected-delta animation clock, visual-state cross-fade). Use when reading the diff invariants, extending the property tests, or working on the wired retained render path.
Maintainer-facing guide to the FS.Skia.UI.Controls.Elmish interactive-host seam — how runInteractiveApp drives the retained render structure each frame (RetainedRender.step over the keyed diff), advances per-identity animation clocks from an injected Tick delta, stamps runtime visual state pre-reconcile, routes keys focus-first through routeFocusedKey, and resolves pointer hits to a stable identity via retainedHitTest. Use when reading or extending the live controls host loop, the per-frame retained-state/clock/visual-state wiring, or the key/pointer routing seam.
| name | speckit-analyze |
| description | Perform a non-destructive cross-artifact consistency and quality analysis across spec.md, plan.md, and tasks.md after task generation. |
| compatibility | Requires spec-kit project structure with .specify/ directory |
| metadata | {"author":"github-spec-kit","source":"templates/commands/analyze.md"} |
$ARGUMENTS
You MUST consider the user input before proceeding (if not empty).
Check for extension hooks (before analysis):
.specify/extensions.yml from the project root (if present) and collect entries under the hooks.before_analyze key..specify/extensions/*/*.yml file in sorted order, parse each, and collect its hooks.before_analyze entries too — so a hook registered only in a per-extension file (e.g. the feedback extension at .specify/extensions/feedback/feedback.yml) is still discovered and runs.(extension, command) (first occurrence wins, so a hook declared in both files runs once).optional: true hook that is discovered but not executed this phase, emit one line so the skip is a visible decision: Note: optional hook {extension}:{command} is registered but was not run (skipped).enabled is explicitly false. Treat hooks without an enabled field as enabled by default.condition expressions:
condition field, or it is null/empty, treat the hook as executablecondition, skip the hook and leave condition evaluation to the HookExecutor implementationoptional flag:
optional: true):
## Extension Hooks
**Optional Pre-Hook**: {extension}
Command: `/{command}`
Description: {description}
Prompt: {prompt}
To execute: `/{command}`
optional: false):
## Extension Hooks
**Automatic Pre-Hook**: {extension}
Executing: `/{command}`
EXECUTE_COMMAND: {command}
Wait for the result of the hook command before proceeding to the Goal.
Identify inconsistencies, duplications, ambiguities, and underspecified items across the three core artifacts (spec.md, plan.md, tasks.md) before implementation. This command MUST run only after /speckit-tasks has successfully produced a complete tasks.md.
STRICTLY READ-ONLY: Do not modify any files. Output a structured analysis report. Offer an optional remediation plan (user must explicitly approve before any follow-up editing commands would be invoked manually).
Constitution Authority: The project constitution (.specify/memory/constitution.md) is non-negotiable within this analysis scope. Constitution conflicts are automatically CRITICAL and require adjusting the spec, plan, or tasks — not diluting, reinterpreting, or silently ignoring the principle. Changing a principle itself must occur in a separate, explicit constitution update outside /speckit-analyze.
Run .specify/scripts/bash/check-prerequisites.sh --json --require-tasks --include-tasks once from repo root and parse JSON for FEATURE_DIR and AVAILABLE_DOCS. Derive absolute paths:
Abort with an error message if any required file is missing (instruct the user to run missing prerequisite command). For single quotes in args like "I'm Groot", use escape syntax: e.g 'I'''m Groot' (or double-quote if possible: "I'm Groot").
Load only the minimal necessary context from each artifact:
From spec.md:
From plan.md:
From tasks.md:
From constitution:
.specify/memory/constitution.md for principle validationCreate internal representations (do not include raw artifacts in output):
user-can-upload-file). Include only Success Criteria requiring buildable work (e.g., load-testing infrastructure, security audit tooling); exclude post-launch outcome metrics and business KPIs (e.g., "Reduce support tickets by 50%").Focus on high-signal findings. Limit to 50 findings total; aggregate remainder in overflow summary.
<placeholder>, etc.)Run the compiled, deterministic symbol set-difference as a real command — do not eyeball it and do not hand-derive the set-difference:
./fake.sh build -t SymbolCrossCheck
Probe target availability first; skip-with-documented-notice when it is absent.
SymbolCrossCheck is a framework-repo-only governance target — generated projects
do not ship it, so the command fails there with Unknown … target: SymbolCrossCheck. Before invoking, probe whether the target resolves (e.g.
./fake.sh build --list / a target-resolution check), mirroring how the
evidence-graph step resolves the active feature from .specify/feature.json and
fails loudly only when nothing resolves. When SymbolCrossCheck resolves, run it and
fold its output in. When it is absent, do not fail the analysis: record a
documented skip notice in this report — Symbol consistency (analyze pass G): skipped — SymbolCrossCheck target not available in this project; manual cross-check is non-authoritative — and continue. The skip is a visible decision, not a silent
omission, and never blocks the invocation.
The target takes no file arguments: it resolves the active feature directory
(the DependencyReport pattern), reads plan.md, data-model.md, and tasks.md
from it, runs the SymbolCrossCheck analyzer in FS.Skia.UI.Build, prints the
markdown, and writes it to readiness/symbol-cross-check.md. Consume that output
and fold its findings into this report. The analyzer extracts named symbols by kind —
Msg cases, union/Screen variants, entity record names (backtick-quoted PascalCase
tokens on lines naming the kind), and FR-/SC- IDs — and reports each symbol whose
presence set is a proper subset of the three artifacts (present in some, missing
from others). It renders as:
## Symbol consistency (analyze pass G)
- msg-case ViewerKeyEventReceived — in {data-model, tasks}, missing from {plan}
- sc-id SC-009 — in {plan}, missing from {data-model, tasks}
Treatment: report set-differences as findings at the appropriate severity for
human judgment. A symbol present only in design (e.g. a start-state in
data-model.md with no matching spec FR) is flagged [design-only? human judgment] and is never hard-failed — design-ahead-of-spec is a legitimate
edge case (the cross-check is guidance, not a gate).
Use this heuristic to prioritize findings:
Output a Markdown report (no file writes) with the following structure:
| ID | Category | Severity | Location(s) | Summary | Recommendation |
|---|---|---|---|---|---|
| A1 | Duplication | HIGH | spec.md:L120-134 | Two similar requirements ... | Merge phrasing; keep clearer version |
(Add one row per finding; generate stable IDs prefixed by category initial.)
Coverage Summary Table:
| Requirement Key | Has Task? | Task IDs | Notes |
|---|
Constitution Alignment Issues: (if any)
Unmapped Tasks: (if any)
Metrics:
At end of report, output a concise Next Actions block:
/speckit-implementAsk the user: "Would you like me to suggest concrete remediation edits for the top N issues?" (Do NOT apply them automatically.)
After reporting, discover hooks across all extension files (multi-file discovery), not just the central file:
.specify/extensions.yml from the project root (if present) and collect entries under the hooks.after_analyze key..specify/extensions/*/*.yml file in sorted order, parse each, and collect its hooks.after_analyze entries too — so a hook registered only in a per-extension file (e.g. the feedback extension at .specify/extensions/feedback/feedback.yml) is still discovered and runs on phase completion.(extension, command) (first occurrence wins, so a hook declared in both files runs once).settings.auto_execute_hooks: true in .specify/extensions.yml, a mandatory hook (optional: false) auto-runs with no confirmation; an optional hook (optional: true) is always surfaced ("To execute: /{command}") and is never force-run by auto_execute_hooks; a hook with a non-empty condition is never evaluated by this skill — evaluation is left to the executor and the notice reports the resolved decision. When auto_execute_hooks: false, even mandatory hooks are surfaced for confirmation.(extension, command), emit one consolidated notice for the phase so the operator never hand-reconciles files — the promoted feedback hook (optional: false) appears as auto-run, never as a surfaced optional:
## Effective hooks for analyze
- {extension}:{command} — auto-run (mandatory; auto_execute_hooks=true)
- {extension}:{command} — surfaced (optional)
- {extension}:{command} — skipped (enabled: false)
- {extension}:{command} — condition-deferred
optional: true hook that is discovered but not executed this phase, emit one line so the skip is a visible decision: Note: optional hook {extension}:{command} is registered but was not run (skipped).enabled is explicitly false. Treat hooks without an enabled field as enabled by default.condition expressions:
condition field, or it is null/empty, treat the hook as executablecondition, skip the hook and leave condition evaluation to the HookExecutor implementationoptional flag:
optional: true):
## Extension Hooks
**Optional Hook**: {extension}
Command: `/{command}`
Description: {description}
Prompt: {prompt}
To execute: `/{command}`
optional: false):
## Extension Hooks
**Automatic Hook**: {extension}
Executing: `/{command}`
EXECUTE_COMMAND: {command}
$ARGUMENTS