Propose a new change - create the change and generate all artifacts in one step.
I'll create a change with the artifacts your schema defines. With the default spec-driven schema that is:
is the spec directory relative to
(for example,
or
). Preserve an existing capability's full path and follow the project's established organization for new capabilities.
When the user is ready to implement, they must start the apply workflow explicitly.
Store selection: If the user names a store (a store is a standalone OpenSpec repo registered on this machine) or the work lives in one, run
openspec store list --json
to discover registered store ids, then pass
on the commands that read or write specs and changes (
,
,
,
,
,
,
,
,
,
,
). Once selected, treat
as sticky for the rest of the workflow. Every unscoped example of those commands below is shorthand: before running it, append the flag. For example, run
openspec status --change "<name>" --json --store "<id>"
, not the unscoped form shown below. Other commands do not take the flag. Hints printed by commands already carry the flag; keep it on follow-ups. Without a store, commands act on the nearest local
root.
-
Understand the request and clarify material ambiguity
If no clear input is provided, ask the user (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" →
).
IMPORTANT: Do NOT proceed without understanding what the user wants to build.
If the request contains ambiguity that would materially affect scope, externally observable behavior, compatibility, or acceptance criteria, ask the user before creating the change. For minor details, make a reasonable assumption and record it in the planning artifacts.
-
Determine the workflow schema
Use the configured default schema unless the user explicitly requests a different workflow.
Use a different schema only if the user:
- Explicitly requests a specific schema by name → use
- Asks to "show workflows" or asks "what workflows" exist → resolve the authoritative root by running from the current working directory. If the user explicitly selected a registered store, use
openspec context --json --store "<store-id>"
. Then run with its working directory set to the returned and let them choose. This preserves roots selected by a local pointer or the global ; when a registered store was explicitly selected, append to as well. If context reports only , run from the current working directory instead. Do not use this fallback for invalid or unavailable stores.
Otherwise, omit
to preserve the configured default.
-
Create the change directory
Choose one schema form below. If a registered store is selected, append
to that command and each later OpenSpec command shown below that accepts
.
Using the configured default:
bash
openspec new change "<name>"
Using an explicitly requested schema:
bash
openspec new change "<name>" --schema "<schema-name>"
This creates a scaffolded change in the planning home resolved by the CLI with
.
-
Get the artifact build order
bash
openspec status --change "<name>" --json
Parse the JSON to get:
- : array of artifact IDs needed before implementation (e.g., )
- : list of all artifacts, each with its and its edges (the artifact IDs it directly depends on)
- , , , and : path and scope context. Use these instead of assuming repo-local paths.
-
Create every artifact in the required set
Use a todo list to track progress through the artifacts.
Loop through artifacts in dependency order (artifacts with no pending dependencies first):
a.
For each artifact that is (dependencies satisfied):
- Get instructions:
bash
openspec instructions <artifact-id> --change "<name>" --json
- The instructions JSON includes:
- : Project background (constraints for you - do NOT include in output)
- : Artifact-specific rules (constraints for you - do NOT include in output)
- : The structure to use for your output file
- : Schema-specific guidance for this artifact type
- /: present when the change declares skip_specs and this artifact must NOT be created - stop and pick another artifact
- : Resolved path or pattern to write the artifact
- : Completed artifacts to read for context
- Read any completed dependency files for context - always re-read them from disk, even if you saw them earlier in the conversation (the user may have edited them)
- If the field delegates creation to a specific skill or command, invoke it to produce the artifact instead of writing the file yourself, then verify the artifact file exists at
- Otherwise create the artifact file using as the structure and write it to . If is a glob, follow to choose the concrete file path
- Apply and as constraints - but do NOT copy them into the file
- Show brief progress: "Created <artifact-id>"
b.
Continue until every artifact in the required set exists (not just )
- After creating each artifact, re-run
openspec status --change "<name>" --json
- The required set is plus every artifact reachable from those by following the edges in - walk them transitively (spec-driven closes over proposal, specs, design, tasks). Leave artifacts outside that set alone
- is file-existence only, so an artifact reading does NOT mean its dependencies exist - writing early marks done while was never written. Use each artifact's edges, not its , to build the required set: a artifact still lists what it depends on
- An artifact already reading is satisfied: the change declares in , so its files must NOT exist. Never try to create one
- Create every artifact in the required set that is missing, then re-check - creating one can unblock others
- Skip one only when already reports it , or when its own says it is conditional: run
openspec instructions <artifact-id> --change "<name>" --json
and skip only if its field marks it optional (e.g. "create only if..."). Spec-driven's qualifies; qualifies only via the status above, never by your own judgment. Tell the user, and do not reconsider it
- Dependencies are enablers, not gates: if a required artifact is still only because you skipped a conditional dependency, write it anyway
- Stop when every artifact in the required set is , , or was deliberately skipped
c. If an artifact requires user input (unclear context):
- Ask the user to clarify
- Then continue with creation
-
Show final status
bash
openspec status --change "<name>"