You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: CHANGELOG.md
+30Lines changed: 30 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,5 +1,35 @@
1
1
# @fission-ai/openspec
2
2
3
+
## 1.11.0
4
+
5
+
### Minor Changes
6
+
7
+
-[#1301](https://github.com/Fission-AI/OpenSpec/pull/1301)[`a7353ae`](https://github.com/Fission-AI/OpenSpec/commit/a7353aea9a0b23762602badf5055a157a76f62b1) Thanks [@m-tanner](https://github.com/m-tanner)! - Add `openspec status --all`, which reports every active change in one process instead of one CLI spawn per change. `--all --json` emits a single `{ "changes": [ <status>, ... ], "root" }` envelope sorted by change name; a change that fails to load contributes `{ "changeName", "status": [diagnostic] }` in place rather than aborting the sweep. A partial failure exits 1 in both text and JSON modes while preserving the complete JSON envelope. Mutually exclusive with `--change`.
8
+
9
+
- [#980](https://github.com/Fission-AI/OpenSpec/pull/980) [`dd7cea3`](https://github.com/Fission-AI/OpenSpec/commit/dd7cea3ffed4a22421dce02f54c37c4f076b44f0) Thanks [@bsmedberg-xometry](https://github.com/bsmedberg-xometry)! - show: add `--diff`, which renders each delta requirement against the requirement it replaces in the main spec instead of reprinting the whole block. A MODIFIED requirement has to carry every scenario it keeps, so reviewers could not see what a change actually altered without diffing files by hand. `openspec show <change> --diff` now prints a colorized unified diff per requirement (additions green, removals red), the full text of ADDED requirements, the authored Reason/Migration text of REMOVED ones, and FROM/TO for RENAMED ones; a requirement that is renamed and modified in the same delta is diffed against its old name. `--json --diff` keeps the existing payload shape and adds each applicable `diff` and `warning` field to MODIFIED deltas only. Main specs resolve against the same root as the change, so `--store <id>` diffs against that store. Without `--diff`, `openspec show <change>` prints exactly what it printed before.
10
+
11
+
### Patch Changes
12
+
13
+
-[#830](https://github.com/Fission-AI/OpenSpec/pull/830)[`109f81f`](https://github.com/Fission-AI/OpenSpec/commit/109f81f17d3bb99eb6fb2c9a33ec9e8ab0680bb2) Thanks [@alfred-openspec](https://github.com/alfred-openspec)! - Write Antigravity skills and workflows to `.agents/`, arbitrate its shared skill tree with other tools, and safely migrate an existing `.agent/` install.
14
+
15
+
-[#1712](https://github.com/Fission-AI/OpenSpec/pull/1712)[`04b37ac`](https://github.com/Fission-AI/OpenSpec/commit/04b37ac1d5c852385d2effbff196ddb4fdd1700c) Thanks [@Marzx13](https://github.com/Marzx13)! - archive: preserve a requirement's original position when renaming it instead of moving the renamed block to the end of the spec.
16
+
17
+
-[#1716](https://github.com/Fission-AI/OpenSpec/pull/1716)[`7010e26`](https://github.com/Fission-AI/OpenSpec/commit/7010e268907598c385eb6686699928fbd5a3a733) Thanks [@aymanxdev](https://github.com/aymanxdev)! - explore: require explicit, scope-bound confirmation before the skill uses any command or tool that can create, edit, move, or delete a file. The explore skill's guardrails let "if the user asks" cover answers to its own clarifying questions, so an agent could treat a design discussion as a go-ahead and start creating schemas or editing `openspec/config.yaml` uninvited. The skill and the `/opsx:explore` command now instruct the agent to name the proposed artifacts or files, ask a direct yes/no question, and wait for confirmation in a separate message before writing. Read-only commands and tools remain available without confirmation, and expanding the confirmed scope requires another confirmation.
18
+
19
+
-[#1199](https://github.com/Fission-AI/OpenSpec/pull/1199)[`ab81a4b`](https://github.com/Fission-AI/OpenSpec/commit/ab81a4b43a7bd769b1d2a33457b7b708b8c52516) Thanks [@leo-ar](https://github.com/leo-ar)! - Improve Fish completions so command, subcommand, flag, and indexed positional completions no longer fall back to filesystem suggestions unless the target is a real path.
20
+
21
+
-[#1010](https://github.com/Fission-AI/OpenSpec/pull/1010)[`e5e350d`](https://github.com/Fission-AI/OpenSpec/commit/e5e350d04b5d635b56846f46a212b097cd00eeb6) Thanks [@Dansyuqri](https://github.com/Dansyuqri)! - Draw explore-mode diagrams with plain ASCII. The worked examples in the explore skill and `/opsx:explore` command used Unicode box-drawing, arrow, and marker glyphs, whose display width varies across terminals, fonts, and locales. Agents copied the style, causing padded boxes and aligned tables to drift.
22
+
23
+
-[`2fa679f`](https://github.com/Fission-AI/OpenSpec/commit/2fa679f180424d46ce7d8789eb85138397844a89) Thanks [@ryandemelo](https://github.com/ryandemelo)! - Make `schema init --default` validate and stage config changes before installing a schema, and roll back both files if either install fails. The staging and backup directories it creates are excluded from schema discovery, so they are never offered as real schemas.
24
+
25
+
-[#1671](https://github.com/Fission-AI/OpenSpec/pull/1671)[`126c5d6`](https://github.com/Fission-AI/OpenSpec/commit/126c5d6c59d63b7e70314bcc776104c7cc548819) Thanks [@kitimark](https://github.com/kitimark)! - `openspec validate` now reports a `## Purpose` that is still the placeholder archive writes for a new capability, instead of passing it. The placeholder is longer than the 50-character brevity floor, so until now the one check meant to catch a Purpose nobody wrote was satisfied by the exact text saying nobody wrote one — a spec whose Purpose read `Does stuff.` failed `--strict` while a spec whose Purpose said nothing at all passed. A capability could carry the placeholder indefinitely while every command reported success.
26
+
27
+
It is a warning, so a project that already has placeholders on disk keeps validating by default and only `--strict` fails. The message says to edit the main spec directly, since a `## Purpose` in a delta is read only when the capability is created and cannot replace an existing one.
28
+
29
+
Detection is narrow. The placeholder archive generates is recognised through the same definition that writes it, wherever it appears in the Purpose. Otherwise only a `TBD` or `TODO` opening the Purpose counts, so `The retry budget is TBD pending benchmarks` is still a valid Purpose and a word like `TBDs` is not a marker. Fenced code inside the Purpose is quoted material rather than the Purpose speaking, so a spec that documents the placeholder keeps passing. An empty Purpose is unchanged, and a Purpose reported as a placeholder is no longer also reported as too brief, so a bare `TBD` yields one finding rather than two.
30
+
31
+
`openspec archive` is unaffected: it validates rebuilt specs without `--strict`, so a spec archive writes still passes the validation it would have passed before, and the text archive writes is unchanged.
|`--no-scenarios`| JSON, spec: same output as `--requirements`. |
486
488
|`-r, --requirement <id>`| JSON, spec: output one requirement by 1-based position. Can't combine with `--requirements`. |
@@ -502,6 +504,10 @@ Unauthenticated clients can exhaust the API.
502
504
- Add per-client rate limiting to the public API.
503
505
```
504
506
507
+
For a change, `--diff` prints the proposal first, then a `Specifications Changed (diffs)` section. ADDED requirements include their full text. REMOVED requirements retain the authored Reason and Migration. RENAMED requirements show FROM and TO. MODIFIED requirements show a unified diff against the matching main requirement.
508
+
509
+
If a MODIFIED header matches only after folding case or whitespace, the output includes both the diff and a warning that archive matching is exact. If the main spec or requirement is missing, the output warns and prints the full delta block. A MODIFIED block with no textual difference prints `(no textual changes)`.
510
+
505
511
A change with `--json` is delta-shaped:
506
512
507
513
```json
@@ -532,6 +538,8 @@ A change with `--json` is delta-shaped:
532
538
}
533
539
```
534
540
541
+
`--json --diff` keeps this top-level shape. A MODIFIED delta gains a `diff` string, a `warning` string, or both. Other operations are unchanged. An empty `diff` string means the main and delta blocks are textually identical.
542
+
535
543
A spec with `--json` lists its requirements with scenarios:
536
544
537
545
```json
@@ -566,7 +574,7 @@ An unknown name suggests near matches: `Unknown item 'does-not-exist'. Did you m
566
574
**Exit codes**
567
575
568
576
-`0`: item printed.
569
-
-`1`: unknown or ambiguous name, no name outside a terminal, an out-of-range `-r` index, or `--requirements` combined with `-r`.
577
+
-`1`: unknown or ambiguous name, no name outside a terminal, an out-of-range `-r` index, `--requirements` combined with `-r`, or a delta or main spec cannot be read for `--diff`.
570
578
571
579
## openspec view
572
580
@@ -866,25 +874,30 @@ With `--json`:
866
874
867
875
## openspec status
868
876
869
-
Reports artifact completion status for a change.
877
+
Reports artifact completion status for one change or every active change.
870
878
871
879
```bash
872
880
openspec status --change add-rate-limit # checklist view
873
881
openspec status --change add-rate-limit --json # structured report
882
+
openspec status --all # every active change
883
+
openspec status --all --json # one batch report
874
884
```
875
885
876
-
`--change`is required. Without it, status exits 1 and lists the available changes, even when only one exists:
886
+
When active changes exist, use exactly one of `--change`or `--all`. Without either, status exits 1 and lists the available changes, even when only one exists:
877
887
878
-
```
879
-
✖ Error: Missing required option --change. Available changes:
888
+
```text
889
+
✖ Error: Missing required option --change (or --all for every active change). Available changes:
880
890
add-rate-limit
881
891
```
882
892
893
+
When the project has no active changes, status prints `No active changes. Create one with: openspec new change <name>` and exits 0 even without either flag. With `--all --json`, the same empty state is `{ "changes": [], "message": "No active changes.", "root": ... }`.
894
+
883
895
**Options**
884
896
885
897
| Flag | Effect |
886
898
|---|---|
887
899
|`--change <id>`| The change to report on, by folder name. |
900
+
|`--all`| Report every active change, sorted by name. Can't be combined with `--change`. |
888
901
|`--schema <name>`| Override the schema auto-detected from `openspec/config.yaml`. An unknown name is an error. |
889
902
|`--json`| Print a structured report instead of text. |
890
903
|`--store <id>`| Use a registered store as the OpenSpec root instead of the current project. |
With `--all --json`, `changes` contains the same status object for each change, without a per-change `root`. The selected root appears once on the envelope. This example trims the per-change status fields shown above:
963
+
964
+
```json
965
+
{
966
+
"changes": [
967
+
{
968
+
"changeName": "add-rate-limit",
969
+
"schemaName": "spec-driven",
970
+
"artifacts": []
971
+
}
972
+
],
973
+
"root": {
974
+
"path": "/Users/you/projects/my-app",
975
+
"source": "nearest"
976
+
}
977
+
}
978
+
```
979
+
980
+
If one change can't load, the batch continues. Its entry contains `changeName` and a `status` diagnostic while the other entries remain available. The command exits 1, including in JSON mode, so CI doesn't accept an incomplete report as successful. JSON output remains one parseable document.
981
+
949
982
**Exit codes**
950
983
951
-
-`0`: status printed.
952
-
-`1`: `--change` missing, the change doesn't exist, or the schema override is unknown.
984
+
-`0`: every requested status printed; an empty `--all` report also exits 0.
985
+
-`1`: a requested change failed to load, `--change`or `--all` is missing, the two flags were combined, the change doesn't exist, or the schema override is unknown.
953
986
954
987
## openspec instructions
955
988
@@ -1317,11 +1350,13 @@ With no `--description` and no `--artifacts` in an interactive terminal, init pr
| `--artifacts <list>` | Comma-separated artifact IDs from `proposal`, `specs`, `design`, `tasks`. Default: all four. |
1320
-
| `--default` | Writes `defaultSchema` to `openspec/config.yaml`. Nothing reads that key. To make the schema the default, set `schema: <name>` there yourself. |
1353
+
| `--default` | Writes `schema: <name>` to the existing `openspec/config.yaml` or `openspec/config.yml`. Creates `openspec/config.yaml` if neither exists. New changes use this schema. |
1321
1354
| `--no-default` | Skip the prompt about the default. |
1322
1355
| `--force` | Overwrite an existing schema with the same name. |
1323
1356
| `--json` | Print the result as JSON. |
1324
1357
1358
+
Schema creation and the `--default` config update are one operation. If OpenSpec cannot validate or write the config, it leaves both the config and any existing schema unchanged.
0 commit comments