From 479ed70e4f9f3c1aa954635caceab72375029288 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 12 Aug 2026 16:47:41 +0000 Subject: [PATCH] Version Packages --- .changeset/apply-surface-deferred-scope.md | 5 -- .changeset/archive-nontty-ansi.md | 5 -- .changeset/canonicalize-spec-eof.md | 5 -- ...atchup-archive-requirements-blank-lines.md | 5 -- .../catchup-cli-reject-missing-roots.md | 5 -- .../catchup-config-picker-update-label.md | 5 -- .../catchup-schema-fork-yaml-fidelity.md | 5 -- .changeset/catchup-schemas-canonical-root.md | 5 -- .changeset/catchup-validate-task-numbering.md | 5 -- .changeset/command-code-command-adapter.md | 7 --- .../fix-legacy-upgrade-agents-ownership.md | 7 --- .changeset/fix-scenario-loss-parity.md | 7 --- .changeset/friendly-commandcode-support.md | 7 --- .changeset/restart-ide-hint.md | 7 --- .changeset/suppress-telemetry-notice-json.md | 8 --- .changeset/validate-archived-tasks.md | 5 -- CHANGELOG.md | 51 +++++++++++++++++++ package.json | 2 +- 18 files changed, 52 insertions(+), 94 deletions(-) delete mode 100644 .changeset/apply-surface-deferred-scope.md delete mode 100644 .changeset/archive-nontty-ansi.md delete mode 100644 .changeset/canonicalize-spec-eof.md delete mode 100644 .changeset/catchup-archive-requirements-blank-lines.md delete mode 100644 .changeset/catchup-cli-reject-missing-roots.md delete mode 100644 .changeset/catchup-config-picker-update-label.md delete mode 100644 .changeset/catchup-schema-fork-yaml-fidelity.md delete mode 100644 .changeset/catchup-schemas-canonical-root.md delete mode 100644 .changeset/catchup-validate-task-numbering.md delete mode 100644 .changeset/command-code-command-adapter.md delete mode 100644 .changeset/fix-legacy-upgrade-agents-ownership.md delete mode 100644 .changeset/fix-scenario-loss-parity.md delete mode 100644 .changeset/friendly-commandcode-support.md delete mode 100644 .changeset/restart-ide-hint.md delete mode 100644 .changeset/suppress-telemetry-notice-json.md delete mode 100644 .changeset/validate-archived-tasks.md diff --git a/.changeset/apply-surface-deferred-scope.md b/.changeset/apply-surface-deferred-scope.md deleted file mode 100644 index daafa643db..0000000000 --- a/.changeset/apply-surface-deferred-scope.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@fission-ai/openspec": patch ---- - -Apply workflow now tells agents to surface unexpected scope instead of hiding it. When a task needs work beyond what the spec describes, the `/opsx:apply` skill and command guidance direct the agent to pause and report the added scope rather than silently narrowing, deferring, or simplifying away specified behavior, and to mark a task complete only when its specified behavior is fully implemented. Fixes #1529. diff --git a/.changeset/archive-nontty-ansi.md b/.changeset/archive-nontty-ansi.md deleted file mode 100644 index d0d6e8986a..0000000000 --- a/.changeset/archive-nontty-ansi.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@fission-ai/openspec": patch ---- - -`openspec archive` no longer writes terminal escape codes to a redirected or captured stdout. Its confirmation prompts and the no-argument change picker drew their live UI with ANSI cursor-move sequences even when stdout was not a terminal — noise in a redirected log, and in some non-interactive hosts an unbounded render loop that could grow the captured output until the disk filled. When stdout (or stdin) is not a terminal, archive now reads the confirmations as plain text, and a no-argument run asks you to pass a change name up front instead of drawing a menu. Piped answers (`printf 'y\n' | openspec archive …`) and `--yes` behave as before, and interactive terminals are unchanged. Fixes #1526. diff --git a/.changeset/canonicalize-spec-eof.md b/.changeset/canonicalize-spec-eof.md deleted file mode 100644 index 7191837326..0000000000 --- a/.changeset/canonicalize-spec-eof.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@fission-ai/openspec": patch ---- - -Canonicalize rebuilt specs to end with exactly one final LF. Previously a spec whose `## Requirements` section was last was rebuilt with a trailing blank line (`\n\n`), which failed Markdown whitespace checks after sync or archive. Internal spacing and content after the Requirements section are unchanged. diff --git a/.changeset/catchup-archive-requirements-blank-lines.md b/.changeset/catchup-archive-requirements-blank-lines.md deleted file mode 100644 index 00e0517701..0000000000 --- a/.changeset/catchup-archive-requirements-blank-lines.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@fission-ai/openspec": patch ---- - -Preserve the blank lines around a spec's `## Requirements` heading when syncing a delta. `openspec archive` rebuilt `openspec/specs//spec.md` by joining its slices with a bare newline, so the blank lines that surround the heading were dropped and the resulting file failed Markdown whitespace checks. The rebuild now keeps that spacing intact. Fixes #1625. Thanks [@jwang513](https://github.com/jwang513)! ([#1637](https://github.com/Fission-AI/OpenSpec/pull/1637)) diff --git a/.changeset/catchup-cli-reject-missing-roots.md b/.changeset/catchup-cli-reject-missing-roots.md deleted file mode 100644 index 1246f02417..0000000000 --- a/.changeset/catchup-cli-reject-missing-roots.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@fission-ai/openspec": patch ---- - -`openspec validate --all` and `openspec list --json` no longer silently pass when run outside an OpenSpec project. From a directory with no root they used to resolve the current directory as an implicit root, exit 0, and report empty results — a false pass for CI and agents. Bulk validation (`--all`, `--changes`, `--specs`) and `list` now require an existing root (the `openspec/project.md` fallback for legacy projects is kept), while direct validation and other intentional implicit-root workflows are unchanged. Thanks [@clay-good](https://github.com/clay-good)! ([#1612](https://github.com/Fission-AI/OpenSpec/pull/1612)) diff --git a/.changeset/catchup-config-picker-update-label.md b/.changeset/catchup-config-picker-update-label.md deleted file mode 100644 index 1d7f23871e..0000000000 --- a/.changeset/catchup-config-picker-update-label.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@fission-ai/openspec": patch ---- - -Label the `update` workflow in the `openspec config` workflow picker. The checklist had friendly labels for 11 of the 12 workflows but was missing `update`, so that row — one of the six core workflows every user sees — fell back to its raw id with a placeholder description. The update-change template's stale "expanded-profile" wording is also reworded to "optional". Fixes #1627. Thanks [@clay-good](https://github.com/clay-good)! ([#1632](https://github.com/Fission-AI/OpenSpec/pull/1632)) diff --git a/.changeset/catchup-schema-fork-yaml-fidelity.md b/.changeset/catchup-schema-fork-yaml-fidelity.md deleted file mode 100644 index e2485d6241..0000000000 --- a/.changeset/catchup-schema-fork-yaml-fidelity.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@fission-ai/openspec": patch ---- - -`openspec schema fork` now preserves the source schema's YAML formatting. Renaming a forked `schema.yaml` round-tripped through a parse/re-serialize step that dropped comments, could rewrite block-scalar style (a literal `|` folded to `>`), and reordered keys, so the fork no longer matched its source. The rename now edits the document in place via the YAML Document API, leaving comments, scalar style, and key order untouched. Thanks [@clay-good](https://github.com/clay-good)! ([#1607](https://github.com/Fission-AI/OpenSpec/pull/1607)) diff --git a/.changeset/catchup-schemas-canonical-root.md b/.changeset/catchup-schemas-canonical-root.md deleted file mode 100644 index 027ac6b941..0000000000 --- a/.changeset/catchup-schemas-canonical-root.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@fission-ai/openspec": patch ---- - -`openspec schemas` now resolves through the canonical OpenSpec root-selection precedence instead of always reading from the current directory. It accepts `--store `, rejects `--store-path` like the other store-aware commands, and returns the shared machine-readable diagnostics on JSON failures, while preserving the existing human output and bare JSON array on success. Thanks [@Patodo](https://github.com/Patodo)! ([#1616](https://github.com/Fission-AI/OpenSpec/pull/1616)) diff --git a/.changeset/catchup-validate-task-numbering.md b/.changeset/catchup-validate-task-numbering.md deleted file mode 100644 index b35188fe66..0000000000 --- a/.changeset/catchup-validate-task-numbering.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@fission-ai/openspec": patch ---- - -`openspec validate` now warns on ambiguous task numbering in `spec-driven` changes: a task ID duplicated at full depth (including across resolved task files), or a task whose leading number disagrees with its enclosing `## N.` group. Numeric-looking text outside numbered groups is ignored, and custom schemas are unchanged until they opt in. The checks run across direct, bulk, and deprecated change validation. Closes #1520. Thanks [@alectimison-maker](https://github.com/alectimison-maker)! ([#1523](https://github.com/Fission-AI/OpenSpec/pull/1523)) diff --git a/.changeset/command-code-command-adapter.md b/.changeset/command-code-command-adapter.md deleted file mode 100644 index 1e6118cb20..0000000000 --- a/.changeset/command-code-command-adapter.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"@fission-ai/openspec": minor ---- - -### New Features - -- **Command Code command adapter** — Command Code is now a first-class, adapter-backed tool. `openspec init` generates OpenSpec commands under `.commandcode/commands/opsx-.md` (invoked as `/opsx-`) alongside the skills under `.commandcode/skills/`, matching Command Code's documented custom-slash-command surface. diff --git a/.changeset/fix-legacy-upgrade-agents-ownership.md b/.changeset/fix-legacy-upgrade-agents-ownership.md deleted file mode 100644 index 085a4a4ebf..0000000000 --- a/.changeset/fix-legacy-upgrade-agents-ownership.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"@fission-ai/openspec": patch ---- - -### Bug Fixes - -- **Don't let a legacy Codex upgrade hijack the vendor-neutral `agents` target** — `openspec update` no longer overwrites an existing `.agents` skills tree (and its ownership marker) when Codex is detected only from leftover global `~/.codex/prompts`. Because Codex and the vendor-neutral `agents` target share `.agents/skills`, a project that used the `agents` target could have its generic skills silently rewritten with Codex-specific syntax and its target flipped to Codex on the next `update --force`. The legacy-upgrade path now respects the established owner of a shared skills directory, matching the one-writer rule `openspec init` already applies. When an upgrade is skipped this way, that tool's repo-local legacy files (e.g. `.codex/prompts/openspec-*.md`) are also preserved rather than cleaned up, since no replacement was written to take their place. A genuine first-time Codex upgrade (no `.agents` tree yet) is unaffected. diff --git a/.changeset/fix-scenario-loss-parity.md b/.changeset/fix-scenario-loss-parity.md deleted file mode 100644 index bcd2981b84..0000000000 --- a/.changeset/fix-scenario-loss-parity.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"@fission-ai/openspec": patch ---- - -### Bug Fixes - -- **Stop silently dropping unlabeled scenarios on archive** — `openspec validate` and `openspec archive` now recognize every level-4 (`####` followed by whitespace) child of a requirement as a scenario, matching how the spec is counted elsewhere. Before, the scenario-loss guard only recognized headers written exactly as `#### Scenario:`, so a `MODIFIED` requirement that dropped a differently-labeled child (for example `#### Edge case`) passed validation and was then permanently deleted by archive with no warning. Both paths now agree, so the loss is caught at authoring time. Scenario names are normalized when comparing (an optional `Scenario:` prefix and a CommonMark closing `#` run are ignored), so simply relabeling a scenario is not mistaken for dropping one. diff --git a/.changeset/friendly-commandcode-support.md b/.changeset/friendly-commandcode-support.md deleted file mode 100644 index eeabaf000f..0000000000 --- a/.changeset/friendly-commandcode-support.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"@fission-ai/openspec": minor ---- - -### New Features - -- **Command Code support** — `openspec init` now supports Command Code as an adapterless skills-only tool. It installs the OpenSpec skills under `.commandcode/skills/` and invokes them as `/openspec-*` commands, matching Command Code's native skill surface. diff --git a/.changeset/restart-ide-hint.md b/.changeset/restart-ide-hint.md deleted file mode 100644 index b13a28127d..0000000000 --- a/.changeset/restart-ide-hint.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"@fission-ai/openspec": patch ---- - -### Bug Fixes - -- `openspec init` now suggests an IDE restart only when an IDE-resident tool such as Cursor, GitHub Copilot, Continue, or Cline was configured. CLI tools like Claude Code, Codex, and Gemini CLI no longer show the hint, since their commands work as soon as the files exist. diff --git a/.changeset/suppress-telemetry-notice-json.md b/.changeset/suppress-telemetry-notice-json.md deleted file mode 100644 index 02760341b1..0000000000 --- a/.changeset/suppress-telemetry-notice-json.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -"@fission-ai/openspec": patch ---- - -Suppress the first-run telemetry disclosure notice when `--json` is used. On a -first-ever run the notice was written to stdout and could break `--json` -consumers; it is now deferred to the first later non-JSON run, keeping `--json` -output valid while still guaranteeing the disclosure. diff --git a/.changeset/validate-archived-tasks.md b/.changeset/validate-archived-tasks.md deleted file mode 100644 index f857c892cc..0000000000 --- a/.changeset/validate-archived-tasks.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@fission-ai/openspec": minor ---- - -Add `openspec validate --archived`: an opt-in check that every change under `changes/archive/` has all of its `tasks.md` checkboxes ticked, exiting non-zero if any are unchecked. This surfaces changes that were archived with unfinished work — which the normal validate flow never catches, because it only looks at active changes — and is meant for a pre-commit or CI hook (#205). It is a standalone scope: it does not alter any existing `validate` invocation and does not re-validate already-applied spec deltas. diff --git a/CHANGELOG.md b/CHANGELOG.md index 8d2dc155f4..f8e5c11d17 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,56 @@ # @fission-ai/openspec +## 1.9.0 + +### Minor Changes + +- [#1622](https://github.com/Fission-AI/OpenSpec/pull/1622) [`59c16a4`](https://github.com/Fission-AI/OpenSpec/commit/59c16a4461254ed984d1d5e29d00af1a5610035a) Thanks [@clay-good](https://github.com/clay-good)! - ### New Features + + - **Command Code command adapter** — Command Code is now a first-class, adapter-backed tool. `openspec init` generates OpenSpec commands under `.commandcode/commands/opsx-.md` (invoked as `/opsx-`) alongside the skills under `.commandcode/skills/`, matching Command Code's documented custom-slash-command surface. + +- [#1613](https://github.com/Fission-AI/OpenSpec/pull/1613) [`42d7f67`](https://github.com/Fission-AI/OpenSpec/commit/42d7f673bc5f13378451267c8a9d0c23f63a2d1a) Thanks [@Angelthebestone](https://github.com/Angelthebestone)! - ### New Features + + - **Command Code support** — `openspec init` now supports Command Code as an adapterless skills-only tool. It installs the OpenSpec skills under `.commandcode/skills/` and invokes them as `/openspec-*` commands, matching Command Code's native skill surface. + +- [#1604](https://github.com/Fission-AI/OpenSpec/pull/1604) [`83be9d1`](https://github.com/Fission-AI/OpenSpec/commit/83be9d113e8310789c281f7c8a00ed4fad191dd5) Thanks [@clay-good](https://github.com/clay-good)! - Add `openspec validate --archived`: an opt-in check that every change under `changes/archive/` has all of its `tasks.md` checkboxes ticked, exiting non-zero if any are unchecked. This surfaces changes that were archived with unfinished work — which the normal validate flow never catches, because it only looks at active changes — and is meant for a pre-commit or CI hook ([#205](https://github.com/Fission-AI/OpenSpec/issues/205)). It is a standalone scope: it does not alter any existing `validate` invocation and does not re-validate already-applied spec deltas. + +### Patch Changes + +- [#1530](https://github.com/Fission-AI/OpenSpec/pull/1530) [`bf5099e`](https://github.com/Fission-AI/OpenSpec/commit/bf5099e39fdb5d7bde2adc84f49ea93afd7463e9) Thanks [@clay-good](https://github.com/clay-good)! - Apply workflow now tells agents to surface unexpected scope instead of hiding it. When a task needs work beyond what the spec describes, the `/opsx:apply` skill and command guidance direct the agent to pause and report the added scope rather than silently narrowing, deferring, or simplifying away specified behavior, and to mark a task complete only when its specified behavior is fully implemented. Fixes [#1529](https://github.com/Fission-AI/OpenSpec/issues/1529). + +- [#1603](https://github.com/Fission-AI/OpenSpec/pull/1603) [`9ae75c8`](https://github.com/Fission-AI/OpenSpec/commit/9ae75c86efe5d326ffa7ca5a3fd64b1f1e7728c2) Thanks [@clay-good](https://github.com/clay-good)! - `openspec archive` no longer writes terminal escape codes to a redirected or captured stdout. Its confirmation prompts and the no-argument change picker drew their live UI with ANSI cursor-move sequences even when stdout was not a terminal — noise in a redirected log, and in some non-interactive hosts an unbounded render loop that could grow the captured output until the disk filled. When stdout (or stdin) is not a terminal, archive now reads the confirmations as plain text, and a no-argument run asks you to pass a change name up front instead of drawing a menu. Piped answers (`printf 'y\n' | openspec archive …`) and `--yes` behave as before, and interactive terminals are unchanged. Fixes [#1526](https://github.com/Fission-AI/OpenSpec/issues/1526). + +- [#1528](https://github.com/Fission-AI/OpenSpec/pull/1528) [`9425897`](https://github.com/Fission-AI/OpenSpec/commit/942589741de35f1b8896b410d7ea70295bb137c0) Thanks [@Marzx13](https://github.com/Marzx13)! - Canonicalize rebuilt specs to end with exactly one final LF. Previously a spec whose `## Requirements` section was last was rebuilt with a trailing blank line (`\n\n`), which failed Markdown whitespace checks after sync or archive. Internal spacing and content after the Requirements section are unchanged. + +- [#1640](https://github.com/Fission-AI/OpenSpec/pull/1640) [`610b78f`](https://github.com/Fission-AI/OpenSpec/commit/610b78f6554e8aabfa294df53962428ff85c8b76) Thanks [@clay-good](https://github.com/clay-good)! - Preserve the blank lines around a spec's `## Requirements` heading when syncing a delta. `openspec archive` rebuilt `openspec/specs//spec.md` by joining its slices with a bare newline, so the blank lines that surround the heading were dropped and the resulting file failed Markdown whitespace checks. The rebuild now keeps that spacing intact. Fixes [#1625](https://github.com/Fission-AI/OpenSpec/issues/1625). Thanks [@jwang513](https://github.com/jwang513)! ([#1637](https://github.com/Fission-AI/OpenSpec/pull/1637)) + +- [#1640](https://github.com/Fission-AI/OpenSpec/pull/1640) [`610b78f`](https://github.com/Fission-AI/OpenSpec/commit/610b78f6554e8aabfa294df53962428ff85c8b76) Thanks [@clay-good](https://github.com/clay-good)! - `openspec validate --all` and `openspec list --json` no longer silently pass when run outside an OpenSpec project. From a directory with no root they used to resolve the current directory as an implicit root, exit 0, and report empty results — a false pass for CI and agents. Bulk validation (`--all`, `--changes`, `--specs`) and `list` now require an existing root (the `openspec/project.md` fallback for legacy projects is kept), while direct validation and other intentional implicit-root workflows are unchanged. Thanks [@clay-good](https://github.com/clay-good)! ([#1612](https://github.com/Fission-AI/OpenSpec/pull/1612)) + +- [#1640](https://github.com/Fission-AI/OpenSpec/pull/1640) [`610b78f`](https://github.com/Fission-AI/OpenSpec/commit/610b78f6554e8aabfa294df53962428ff85c8b76) Thanks [@clay-good](https://github.com/clay-good)! - Label the `update` workflow in the `openspec config` workflow picker. The checklist had friendly labels for 11 of the 12 workflows but was missing `update`, so that row — one of the six core workflows every user sees — fell back to its raw id with a placeholder description. The update-change template's stale "expanded-profile" wording is also reworded to "optional". Fixes [#1627](https://github.com/Fission-AI/OpenSpec/issues/1627). Thanks [@clay-good](https://github.com/clay-good)! ([#1632](https://github.com/Fission-AI/OpenSpec/pull/1632)) + +- [#1640](https://github.com/Fission-AI/OpenSpec/pull/1640) [`610b78f`](https://github.com/Fission-AI/OpenSpec/commit/610b78f6554e8aabfa294df53962428ff85c8b76) Thanks [@clay-good](https://github.com/clay-good)! - `openspec schema fork` now preserves the source schema's YAML formatting. Renaming a forked `schema.yaml` round-tripped through a parse/re-serialize step that dropped comments, could rewrite block-scalar style (a literal `|` folded to `>`), and reordered keys, so the fork no longer matched its source. The rename now edits the document in place via the YAML Document API, leaving comments, scalar style, and key order untouched. Thanks [@clay-good](https://github.com/clay-good)! ([#1607](https://github.com/Fission-AI/OpenSpec/pull/1607)) + +- [#1640](https://github.com/Fission-AI/OpenSpec/pull/1640) [`610b78f`](https://github.com/Fission-AI/OpenSpec/commit/610b78f6554e8aabfa294df53962428ff85c8b76) Thanks [@clay-good](https://github.com/clay-good)! - `openspec schemas` now resolves through the canonical OpenSpec root-selection precedence instead of always reading from the current directory. It accepts `--store `, rejects `--store-path` like the other store-aware commands, and returns the shared machine-readable diagnostics on JSON failures, while preserving the existing human output and bare JSON array on success. Thanks [@Patodo](https://github.com/Patodo)! ([#1616](https://github.com/Fission-AI/OpenSpec/pull/1616)) + +- [#1640](https://github.com/Fission-AI/OpenSpec/pull/1640) [`610b78f`](https://github.com/Fission-AI/OpenSpec/commit/610b78f6554e8aabfa294df53962428ff85c8b76) Thanks [@clay-good](https://github.com/clay-good)! - `openspec validate` now warns on ambiguous task numbering in `spec-driven` changes: a task ID duplicated at full depth (including across resolved task files), or a task whose leading number disagrees with its enclosing `## N.` group. Numeric-looking text outside numbered groups is ignored, and custom schemas are unchanged until they opt in. The checks run across direct, bulk, and deprecated change validation. Closes [#1520](https://github.com/Fission-AI/OpenSpec/issues/1520). Thanks [@alectimison-maker](https://github.com/alectimison-maker)! ([#1523](https://github.com/Fission-AI/OpenSpec/pull/1523)) + +- [#1522](https://github.com/Fission-AI/OpenSpec/pull/1522) [`07dea6e`](https://github.com/Fission-AI/OpenSpec/commit/07dea6ed2faf71c8b9f4944d64246f2ff39eeffc) Thanks [@clay-good](https://github.com/clay-good)! - ### Bug Fixes + + - **Don't let a legacy Codex upgrade hijack the vendor-neutral `agents` target** — `openspec update` no longer overwrites an existing `.agents` skills tree (and its ownership marker) when Codex is detected only from leftover global `~/.codex/prompts`. Because Codex and the vendor-neutral `agents` target share `.agents/skills`, a project that used the `agents` target could have its generic skills silently rewritten with Codex-specific syntax and its target flipped to Codex on the next `update --force`. The legacy-upgrade path now respects the established owner of a shared skills directory, matching the one-writer rule `openspec init` already applies. When an upgrade is skipped this way, that tool's repo-local legacy files (e.g. `.codex/prompts/openspec-*.md`) are also preserved rather than cleaned up, since no replacement was written to take their place. A genuine first-time Codex upgrade (no `.agents` tree yet) is unaffected. + +- [#1521](https://github.com/Fission-AI/OpenSpec/pull/1521) [`c751b3d`](https://github.com/Fission-AI/OpenSpec/commit/c751b3da52a7f06d6662a8673feff4685566cdd4) Thanks [@clay-good](https://github.com/clay-good)! - ### Bug Fixes + + - **Stop silently dropping unlabeled scenarios on archive** — `openspec validate` and `openspec archive` now recognize every level-4 (`####` followed by whitespace) child of a requirement as a scenario, matching how the spec is counted elsewhere. Before, the scenario-loss guard only recognized headers written exactly as `#### Scenario:`, so a `MODIFIED` requirement that dropped a differently-labeled child (for example `#### Edge case`) passed validation and was then permanently deleted by archive with no warning. Both paths now agree, so the loss is caught at authoring time. Scenario names are normalized when comparing (an optional `Scenario:` prefix and a CommonMark closing `#` run are ignored), so simply relabeling a scenario is not mistaken for dropping one. + +- [#1610](https://github.com/Fission-AI/OpenSpec/pull/1610) [`17581c1`](https://github.com/Fission-AI/OpenSpec/commit/17581c11edf6b27ef18be7be1e4dcc06c81a3fff) Thanks [@clay-good](https://github.com/clay-good)! - ### Bug Fixes + + - `openspec init` now suggests an IDE restart only when an IDE-resident tool such as Cursor, GitHub Copilot, Continue, or Cline was configured. CLI tools like Claude Code, Codex, and Gemini CLI no longer show the hint, since their commands work as soon as the files exist. + +- [#1609](https://github.com/Fission-AI/OpenSpec/pull/1609) [`804427b`](https://github.com/Fission-AI/OpenSpec/commit/804427b6ff3f3b35b542365ba8b32e183fce3287) Thanks [@clay-good](https://github.com/clay-good)! - Suppress the first-run telemetry disclosure notice when `--json` is used. On a + first-ever run the notice was written to stdout and could break `--json` + consumers; it is now deferred to the first later non-JSON run, keeping `--json` + output valid while still guaranteeing the disclosure. + ## 1.8.0 ### Minor Changes diff --git a/package.json b/package.json index 7efa0aa05b..d2f1f902cb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@fission-ai/openspec", - "version": "1.8.0", + "version": "1.9.0", "description": "AI-native system for spec-driven development", "keywords": [ "openspec",