diff options
Diffstat (limited to '.claude/commands/opsx/update.md')
| -rw-r--r-- | .claude/commands/opsx/update.md | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/.claude/commands/opsx/update.md b/.claude/commands/opsx/update.md new file mode 100644 index 0000000..7992927 --- /dev/null +++ b/.claude/commands/opsx/update.md | |||
| @@ -0,0 +1,87 @@ | |||
| 1 | --- | ||
| 2 | name: "OPSX: Update" | ||
| 3 | description: "Update a change - revise existing planning artifacts and keep them coherent (Experimental)" | ||
| 4 | allowed-tools: Bash(openspec:*) | ||
| 5 | category: "Workflow" | ||
| 6 | tags: ["workflow", "artifacts", "experimental"] | ||
| 7 | --- | ||
| 8 | |||
| 9 | Revise a change's existing planning artifacts and keep them coherent. Never edit code. | ||
| 10 | |||
| 11 | **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 `--store <id>` on the commands that read or write specs and changes (`new change`, `status`, `instructions`, `list`, `show`, `validate`, `archive`, `doctor`, `context`, `schemas`, `view`). Once selected, treat `--store <id>` 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 `openspec/` root. | ||
| 12 | |||
| 13 | **Input**: Optionally specify a change name after `/opsx:update` (e.g., `/opsx:update add-auth`). If omitted, check if it can be inferred from conversation context. If vague or ambiguous you MUST prompt for available changes. | ||
| 14 | |||
| 15 | `/opsx:continue` is an optional workflow and may not be installed. Before suggesting it anywhere below, verify that it is available. If it is unavailable, `openspec status --change "<name>" --json` shows the next artifact and `openspec instructions "<artifact-id>" --change "<name>" --json` explains how to create it. | ||
| 16 | |||
| 17 | **Steps** | ||
| 18 | |||
| 19 | 1. **Select the change** | ||
| 20 | |||
| 21 | If a name is provided, use it. Otherwise: | ||
| 22 | - Infer from conversation context if the user mentioned a change | ||
| 23 | - Auto-select if only one active change exists | ||
| 24 | - If ambiguous, run `openspec list --json` to get available changes sorted by most recently modified, and ask the user to select one | ||
| 25 | |||
| 26 | When prompting, present the top 3-4 most recently modified changes as options, showing: | ||
| 27 | - Change name | ||
| 28 | - Schema (from `schema` field if present, otherwise "spec-driven") | ||
| 29 | - Status (e.g., "0/5 tasks", "complete", "no tasks") | ||
| 30 | - How recently it was modified (from `lastModified` field) | ||
| 31 | |||
| 32 | Mark the most recently modified change as "(Recommended)" since it's likely what the user wants to update. | ||
| 33 | |||
| 34 | Always announce: "Using change: <name>" and how to override (e.g., `/opsx:update <other>`). | ||
| 35 | |||
| 36 | 2. **Get the change's artifacts** | ||
| 37 | ```bash | ||
| 38 | openspec status --change "<name>" --json | ||
| 39 | ``` | ||
| 40 | Parse the JSON to understand current state. The response includes: | ||
| 41 | - `schemaName`: The workflow schema being used (e.g., "spec-driven") | ||
| 42 | - `artifacts`: Array of artifacts with their status ("done", "skipped", "ready", "blocked") | ||
| 43 | - `isPlanningComplete`: Boolean indicating if all planning artifacts are complete. Older CLI versions expose the same value as `isComplete`. | ||
| 44 | - `planningHome`, `changeRoot`, `artifactPaths`, and `actionContext`: path and scope context. Use these instead of assuming repo-local paths. | ||
| 45 | |||
| 46 | The artifact ids and paths come from the active schema - do NOT assume them, and do NOT branch on hardcoded artifact names. Custom schemas must work unchanged. | ||
| 47 | |||
| 48 | The files to edit are `artifactPaths.<id>.existingOutputPaths` - the concrete files that exist on disk, already glob-expanded for glob artifacts (e.g. `specs/**/*.md`). Do NOT write to `resolvedOutputPath`: for a glob artifact it is still the glob pattern, not a real file. | ||
| 49 | |||
| 50 | 3. **Understand the request** | ||
| 51 | - If the user asked for a specific revision ("the design now uses X"), that is the starting edit. | ||
| 52 | - If they only said "update" / "make this coherent", treat it as a coherence review: read the existing artifacts and check them against each other for contradictions, gaps, and duplication. | ||
| 53 | |||
| 54 | 4. **Read and reconcile** | ||
| 55 | - Read the artifact(s) the request touches and the change's other existing artifacts. | ||
| 56 | - Apply the requested edit. Then check every other existing artifact against it - in ANY direction: an edit to a later artifact may require revising an earlier one, not only the other way around. Build order is a useful reading order, not a constraint on which artifacts may be revised. | ||
| 57 | - Note everything that is now inconsistent, missing, or contradictory. | ||
| 58 | - Revise only files that already exist (`existingOutputPaths`). Do NOT create artifacts that don't exist yet, and do NOT invent new files under a glob artifact - note them and point the user to `/opsx:continue` to create them. | ||
| 59 | - If the change is already coherent, say so and make no edits. | ||
| 60 | |||
| 61 | 5. **Confirm and apply, one artifact at a time** | ||
| 62 | - Show each proposed revision and why. Write only after the user confirms. | ||
| 63 | - If the user rejects a revision, do not write it - leave that artifact unchanged. | ||
| 64 | - When a substantial rewrite is needed, get that artifact's rules and template first: | ||
| 65 | ```bash | ||
| 66 | openspec instructions "<artifact-id>" --change "<name>" --json | ||
| 67 | ``` | ||
| 68 | |||
| 69 | 6. **Point to the next step (guidance only - NEVER act on it)** | ||
| 70 | - Artifacts still missing -> suggest `/opsx:continue` to create them. | ||
| 71 | - Change already implemented (tasks checked off / already applied) -> the code may no longer match the revised plan; suggest `/opsx:apply` to carry the delta into code. | ||
| 72 | - Everything done and implemented -> suggest `/opsx:archive`. | ||
| 73 | |||
| 74 | **Output** | ||
| 75 | |||
| 76 | After each invocation, show: | ||
| 77 | - Which artifacts were revised (and which proposed revisions were rejected) | ||
| 78 | - Anything deferred to `/opsx:continue` (not-yet-created artifacts or files) | ||
| 79 | - Where the change stands and the recommended next command | ||
| 80 | |||
| 81 | **Guardrails** | ||
| 82 | - Planning artifacts only - NEVER edit implementation code. If the revised plan implies code changes, stop and point to `/opsx:apply`. | ||
| 83 | - Use the artifact ids and paths reported by `openspec status`; never branch on hardcoded artifact names. | ||
| 84 | - Edit only the concrete files in `existingOutputPaths`; never write to a glob `resolvedOutputPath`. | ||
| 85 | - Do not advance the build frontier: no new artifacts, no new files under glob artifacts - that is `/opsx:continue`'s job. | ||
| 86 | - Confirm every edit with the user before writing. | ||
| 87 | - If the request changes the change's *intent* rather than refining it, first verify whether the optional `/opsx:new` workflow is available. If it is, recommend starting fresh with `/opsx:new` (the "Update vs. Start Fresh" heuristic). If it is unavailable, ask for a distinct unused change name and recommend `openspec new change "<new-change-name>"` instead. | ||
