openspec-propose
Propose a new change with all artifacts generated in one step. Use when the user wants to quickly describe what they want to build and get a complete proposal with design, specs, and tasks ready for implementation.
- License 许可
- MIT
- 最近更新
- 2026-11-09
- Stars
- ★ 6
- Forks
- 1
01 前言 Front Matter
- name
- openspec-propose
- license
- MIT
- metadata
- { "author": "openspec", "version": "1.0", "generatedBy": "1.3.0" }
- description
- Propose a new change with all artifacts generated in one step. Use when the user wants to quickly describe what they want to build and get a complete proposal with design, specs, and tasks ready for implementation.
- compatibility
- Requires openspec CLI.
03 SKILL.md 正文
Propose a new change - create the change and generate all artifacts in one step.
I'll create a change with artifacts:
- proposal.md (what & why)
- design.md (how)
- tasks.md (implementation steps)
When ready to implement, run /opsx:apply
This skill is the Phase 2 → Phase 3 entry point of the BMAD+OpenSpec runbook. Default flow reads the canonical slicing artefact docs/openspec-slice.md (per bmad-openspec-bridge.md) so each <change-id> is scaffolded with the FRs, dependencies, components, and scope note already approved at Gate C. Use --no-slice for ad-hoc changes that bypass the contract (legacy v0.6.x behaviour).
Input: A <change-id> that exists as a row in docs/openspec-slice.md. For ad-hoc changes outside the slice contract, pass --no-slice plus a kebab-case name OR a description.
Flags:
--slice-file <path>— override the default slice file location.--no-slice— opt out of the slice contract; ask the user inline for name + description (legacy v0.6.x flow).--batch— iterate every row in the slice file in dependency order; idempotent (already-scaffolded folders are skipped).
Steps
-
Read and validate the slice artefact (default flow; skipped only when
--no-sliceis passed)a. Locate the slice file:
- Default:
docs/openspec-slice.md. - Fallback: if the default does not exist, pick the most recent
docs/openspec-slice-*.mdby mtime. - Override:
--slice-file <path>wins over both. - If none of the above resolve to an existing file, refuse with: "no slice file found at
docs/openspec-slice.md(ordocs/openspec-slice-*.md); either run BMAD slicing perrunbook-bmad-openspec.md§2.4 first, or pass--no-slicefor ad-hoc changes".
b. Parse the "Approved change list" table and the "Scope notes" section per the schema in bmad-openspec-bridge.md §3.1.
c. Locate the row whose
Change IDequals the requested<change-id>.d. If
<change-id>is not in the slice list, refuse with: "change-id<change-id>not in slice list at<resolved slice file>; either add it (re-slice + re-approve Gate C) or pass--no-slicefor ad-hoc changes". Do NOT auto-add the row.e. Extract for downstream steps:
- The row's scope note (the one-paragraph entry under
## Scope notesfor this change ID) — this is the proposal's initial framing. - The Depends on column — these become the proposal's "Prerequisites" section.
- The FRs column — these become the proposal's "Capability coverage" section.
- The Components column (if present, UI changes only) — these populate
design.mddesign-token / state references againstdocs/ux/components.md. - The Journeys column (if present) — these enrich
design.mdwith per-journey anchors fromdocs/ux/jN.md.
- Default:
1b. If --no-slice is passed (legacy / ad-hoc)
Ask what they want to build using AskUserQuestion tool (open-ended, no preset options):
"What change do you want to work on? Describe what you want to build or fix."
From their description, derive a kebab-case name (e.g., "add user authentication" → add-user-auth).
IMPORTANT: Do NOT proceed without understanding what the user wants to build. The downstream steps run without the FRs / dependencies / components enrichment — the user is responsible for filling those in by hand.
1c. If --batch is passed
Iterate every row of the slice file in dependency order (foundations first; topologically sorted on Depends on). For each row, run steps 2-5 below as if <change-id> were that row. Skip rows whose folder openspec/changes/<change-id>/ already exists (emit a notice). Emit one summary at the end (scaffolded / skipped / failed counts) instead of N separate confirmations.
-
Create the change directory
openspec new change "<change-id>"This creates a scaffolded change at
openspec/changes/<change-id>/with.openspec.yaml. Use the<change-id>from the slice row (not a re-derived name) to keep folder identity consistent with the contract. -
Get the artifact build order
openspec status --change "<name>" --jsonParse the JSON to get:
applyRequires: array of artifact IDs needed before implementation (e.g.,["tasks"])artifacts: list of all artifacts with their status and dependencies
-
Create artifacts in sequence until apply-ready
Use the TodoWrite tool to track progress through the artifacts.
Loop through artifacts in dependency order (artifacts with no pending dependencies first):
a. For each artifact that is
ready(dependencies satisfied):- Get instructions:
openspec instructions <artifact-id> --change "<name>" --json - The instructions JSON includes:
context: Project background (constraints for you - do NOT include in output)rules: Artifact-specific rules (constraints for you - do NOT include in output)template: The structure to use for your output fileinstruction: Schema-specific guidance for this artifact typeoutputPath: Where to write the artifactdependencies: Completed artifacts to read for context
- Read any completed dependency files for context
- Create the artifact file using
templateas the structure - Apply
contextandrulesas constraints - but do NOT copy them into the file - When the slice contract is in effect (i.e.
--no-slicewas NOT passed), enrich the artefact from the extracted slice row (per step 1e):proposal.md— initial framing = the scope note paragraph; "Prerequisites" =Depends on; "Capability coverage" =FRs.design.md— for UI changes, cite theComponentscolumn againstdocs/ux/components.mdfor design-token + state references; cite theJourneyscolumn againstdocs/ux/jN.md.
- Show brief progress: "Created <artifact-id>"
b. Continue until all
applyRequiresartifacts are complete- After creating each artifact, re-run
openspec status --change "<name>" --json - Check if every artifact ID in
applyRequireshasstatus: "done"in the artifacts array - Stop when all
applyRequiresartifacts are done
c. If an artifact requires user input (unclear context):
- Use AskUserQuestion tool to clarify
- Then continue with creation
- Get instructions:
-
Show final status
openspec status --change "<name>"
Output
After completing all artifacts, summarize:
- Change name and location
- List of artifacts created with brief descriptions
- What's ready: "All artifacts created! Ready for implementation."
- Prompt: "Run
/opsx:applyor ask me to implement to start working on the tasks."
Artifact Creation Guidelines
- Follow the
instructionfield fromopenspec instructionsfor each artifact type - The schema defines what each artifact should contain - follow it
- Read dependency artifacts for context before creating new ones
- Use
templateas the structure for your output file - fill in its sections - IMPORTANT:
contextandrulesare constraints for YOU, not content for the file- Do NOT copy
<context>,<rules>,<project_context>blocks into the artifact - These guide what you write, but should never appear in the output
- Do NOT copy
Guardrails
- Create ALL artifacts needed for implementation (as defined by schema's
apply.requires) - Always read dependency artifacts before creating a new one
- If context is critically unclear, ask the user - but prefer making reasonable decisions to keep momentum
- If a change with that name already exists, ask if user wants to continue it or create a new one
- Verify each artifact file exists after writing before proceeding to next
04 同仓库更多 Skills
sweep
Use when the user wants to find code that has quietly stopped being used — types /sweep, asks for a "dead code sweep", "repo entropy", "what can we delete", "orphan files", "unused code", or asks to review a sweep ledger. Adjudicates candidates a deterministic scanner already produced; it never deletes anything and never re-derives findings from raw source. Pairs with ponytail, which gates what gets written rather than what rots.
ponytail
Use when the user wants the laziest solution that actually works — types /ponytail, says "be lazy", "lazy mode", "simplest solution", "minimal solution", "yagni", "do less", or "shortest path", or complains about over-engineering, bloat, boilerplate, or unnecessary dependencies. Supports intensity levels lite, full, ultra (default). Pairs with caveman, which compresses prose, not code.
ponytail-review
Use when the user wants a code review focused exclusively on over-engineering — says "review for over-engineering", "what can we delete", "is this over-engineered", "simplify review", or invokes /ponytail-review. Complements correctness/security review; this one only hunts complexity in the current diff. Gated by the ponytail review_ponytail component.
ponytail-debt
Use when the user wants to harvest every `ponytail:` comment in the codebase into a tracked debt ledger — says "ponytail debt", "/ponytail-debt", "what did ponytail defer", "list the shortcuts", "ponytail ledger", or "what did we mark to do later". One-shot report, changes nothing. Gated by the ponytail debt_ponytail component.
ponytail-audit
Use when the user wants a whole-repo audit for over-engineering — says "audit this codebase", "audit for over-engineering", "what can I delete from this repo", "find bloat", or invokes /ponytail-audit. Like ponytail-review but scans the entire tree, not a diff. One-shot report, applies no fixes. Gated by the ponytail audit_ponytail component.
openspec-explore
Enter explore mode - a thinking partner for exploring ideas, investigating problems, and clarifying requirements. Use when the user wants to think through something before or during a change.