From 70f9e731976cfcf4b22af271dc959b7f4c09007e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 23 Sep 2026 17:49:52 +0000 Subject: [PATCH] Version Packages --- .../align-workflow-approval-thresholds.md | 5 -- .../archive-eperm-copy-without-staging.md | 13 ----- .changeset/archive-schema-task-progress.md | 5 -- .changeset/artifact-glob-brace-extglob.md | 5 -- .changeset/preserve-crlf-line-endings.md | 11 ----- .changeset/purpose-marker-punctuation.md | 8 --- .changeset/quiet-codex-skill-hint.md | 5 -- .../scenario-loss-reports-added-scenarios.md | 5 -- .changeset/schema-label-from-status.md | 5 -- .changeset/tasks-per-group-tests-docs.md | 5 -- .changeset/tidy-codex-bootstrap.md | 5 -- .changeset/update-glob-artifact-gap.md | 5 -- .../verify-report-skipped-dimensions.md | 5 -- .changeset/windows-archive-claim-release.md | 5 -- CHANGELOG.md | 49 +++++++++++++++++++ package.json | 2 +- 16 files changed, 50 insertions(+), 88 deletions(-) delete mode 100644 .changeset/align-workflow-approval-thresholds.md delete mode 100644 .changeset/archive-eperm-copy-without-staging.md delete mode 100644 .changeset/archive-schema-task-progress.md delete mode 100644 .changeset/artifact-glob-brace-extglob.md delete mode 100644 .changeset/preserve-crlf-line-endings.md delete mode 100644 .changeset/purpose-marker-punctuation.md delete mode 100644 .changeset/quiet-codex-skill-hint.md delete mode 100644 .changeset/scenario-loss-reports-added-scenarios.md delete mode 100644 .changeset/schema-label-from-status.md delete mode 100644 .changeset/tasks-per-group-tests-docs.md delete mode 100644 .changeset/tidy-codex-bootstrap.md delete mode 100644 .changeset/update-glob-artifact-gap.md delete mode 100644 .changeset/verify-report-skipped-dimensions.md delete mode 100644 .changeset/windows-archive-claim-release.md diff --git a/.changeset/align-workflow-approval-thresholds.md b/.changeset/align-workflow-approval-thresholds.md deleted file mode 100644 index 3e89fb6459..0000000000 --- a/.changeset/align-workflow-approval-thresholds.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@fission-ai/openspec": patch ---- - -Keep fast-forward clarification guidance and onboarding task approval consistent across generated skills and commands. Fast-forward now asks only when context is critically unclear, while onboarding asks users to approve the task breakdown before saving it and separately asks whether to begin implementation. diff --git a/.changeset/archive-eperm-copy-without-staging.md b/.changeset/archive-eperm-copy-without-staging.md deleted file mode 100644 index 88f2d6483a..0000000000 --- a/.changeset/archive-eperm-copy-without-staging.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -"@fission-ai/openspec": patch ---- - -### Bug Fixes - -- **Archive** — When Windows `EPERM` blocks renaming a change directory that still has children, copy from the original source instead of requiring a staging rename that fails the same way. That lets archive finish instead of rolling back the spec write and leaving an empty capability directory git cannot see. A staging failure that is not `EPERM`/`EXDEV` still leaves the source untouched. - - The source of that unstaged copy is still the live change directory, which the archive claim does not cover, so cleanup removes only the entries it copied and verified rather than whatever is present when it runs. A file written in that window is left alone and the complete destination is retained for recovery, instead of being deleted without ever reaching the archive. - - An edit to a file that was already verified is covered too. Cleanup claims each entry with an atomic rename before reading it, then compares what it claimed against the copy. A rewrite that lands first is caught by that comparison and the file is put back; one that lands after creates a new file at the original path, which is never deleted. Either way the newer bytes stay on disk and archive reports the move as incomplete rather than succeeding with the older copy. - - Rollback of a newly created spec now also prunes the capability directory it created — and only that one. An empty capability directory that was already there is left in place with its own permissions. diff --git a/.changeset/archive-schema-task-progress.md b/.changeset/archive-schema-task-progress.md deleted file mode 100644 index ccd5706d6b..0000000000 --- a/.changeset/archive-schema-task-progress.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@fission-ai/openspec': patch ---- - -Archive workflows now use schema-aware task progress from `openspec list --json`, so custom task files and globs still trigger incomplete-task warnings. diff --git a/.changeset/artifact-glob-brace-extglob.md b/.changeset/artifact-glob-brace-extglob.md deleted file mode 100644 index 1de2ac924a..0000000000 --- a/.changeset/artifact-glob-brace-extglob.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@fission-ai/openspec': patch ---- - -Fix artifact output resolution to recognize brace expansion and extglob patterns while preserving literal output filenames and confining brace-expanded paths to the change directory. diff --git a/.changeset/preserve-crlf-line-endings.md b/.changeset/preserve-crlf-line-endings.md deleted file mode 100644 index 786266c77e..0000000000 --- a/.changeset/preserve-crlf-line-endings.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -"@fission-ai/openspec": patch ---- - -Preserve a file's existing line endings when rewriting it, so Windows users no longer get whole-file diffs. Applying a delta to a CRLF spec (the default on a Windows checkout with `core.autocrlf=true`) rewrote the file to LF, turning a one-requirement change into a diff that touched every line. `openspec archive` now writes the spec back with the convention it already used; a spec that does not exist yet is still written with LF. - -The same fix covers marker-managed files: installing or updating shell completions in a CRLF `.bashrc` or `.zshrc` no longer leaves the file with mixed endings, which `bash` reports as `$'\r': command not found`. - -Removing a managed block is fixed the same way: the blank-line collapse in `removeMarkerBlock` rebuilt its separator as a bare LF, so cleaning up legacy artifacts left a lone LF inside an otherwise-CRLF `CLAUDE.md` or rc file. Both write paths now read the file the same way, by dominant ending, so one stray CRLF in an otherwise-LF file no longer pulls the whole rewrite to CRLF. - -`scripts/pack-version-check.mjs` now spawns `npm` through `cross-spawn`, so the release guard can run on Windows, where `npm` is `npm.cmd` and cannot be resolved by `execFile`. diff --git a/.changeset/purpose-marker-punctuation.md b/.changeset/purpose-marker-punctuation.md deleted file mode 100644 index ae4102edd4..0000000000 --- a/.changeset/purpose-marker-punctuation.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -'@fission-ai/openspec': patch ---- - -Fix `validate --strict` reporting `PURPOSE_IS_PLACEHOLDER` for a Purpose that opens with the ordinary word "Todo" followed by prose, as in Spanish ("Todo el…") and Portuguese ("Todo o…") specs ([#1897](https://github.com/Fission-AI/OpenSpec/issues/1897)). - -- Case now separates the marker from the word. `TBD`/`TODO` in capitals is still a placeholder marker whatever follows it, so `TODO write this later` is still reported. -- In any other case it counts as a marker only when followed by the end of the Purpose, a line break, or marker punctuation (`todo -`, `tbd.`), so an authored Spanish or Portuguese sentence is not reported. diff --git a/.changeset/quiet-codex-skill-hint.md b/.changeset/quiet-codex-skill-hint.md deleted file mode 100644 index 8d0f899baa..0000000000 --- a/.changeset/quiet-codex-skill-hint.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@fission-ai/openspec": patch ---- - -Clarify the Codex setup hint for CLI, IDE, and desktop app users. diff --git a/.changeset/scenario-loss-reports-added-scenarios.md b/.changeset/scenario-loss-reports-added-scenarios.md deleted file mode 100644 index d7138c8577..0000000000 --- a/.changeset/scenario-loss-reports-added-scenarios.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@fission-ai/openspec': patch ---- - -Say what a `MODIFIED` block adds when the scenario-loss guard fires ([#1809](https://github.com/Fission-AI/OpenSpec/pull/1809)). `openspec validate` and `openspec archive` already named the scenarios a block omits. They now also print how many scenarios each side has and which ones the block introduces, capped at three names, so a rename and a truncation read differently without opening either file. The guard catches exactly what it did before, and no exit code changes. diff --git a/.changeset/schema-label-from-status.md b/.changeset/schema-label-from-status.md deleted file mode 100644 index b482256fb5..0000000000 --- a/.changeset/schema-label-from-status.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@fission-ai/openspec": patch ---- - -Stop workflows from displaying schema names that `openspec list --json` does not return. Update and continue no longer fabricate a `spec-driven` picker label, while bulk archive and explore describe only the change fields the list command actually provides. diff --git a/.changeset/tasks-per-group-tests-docs.md b/.changeset/tasks-per-group-tests-docs.md deleted file mode 100644 index db842203e6..0000000000 --- a/.changeset/tasks-per-group-tests-docs.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@fission-ai/openspec": patch ---- - -Task guidance now requires each task group to land its own tests and documentation updates instead of deferring them to a trailing group. The onboarding walkthrough teaches the same rule, and the published schema reference no longer quotes stale instruction text. diff --git a/.changeset/tidy-codex-bootstrap.md b/.changeset/tidy-codex-bootstrap.md deleted file mode 100644 index 10c19576f5..0000000000 --- a/.changeset/tidy-codex-bootstrap.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@fission-ai/openspec": patch ---- - -Return a nonzero exit status when `openspec update --force` cannot replace a legacy-only Codex installation. diff --git a/.changeset/update-glob-artifact-gap.md b/.changeset/update-glob-artifact-gap.md deleted file mode 100644 index a775ca6028..0000000000 --- a/.changeset/update-glob-artifact-gap.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@fission-ai/openspec": patch ---- - -Let `/opsx:update` fill a missing file under an already-satisfied glob artifact. A glob artifact is complete once one file matches it, and `/opsx:continue` only picks up `ready` artifacts, so the previous "point the user to `/opsx:continue`" handoff was unreachable and the missing file could never be created through the documented flow. diff --git a/.changeset/verify-report-skipped-dimensions.md b/.changeset/verify-report-skipped-dimensions.md deleted file mode 100644 index 540bf6ca36..0000000000 --- a/.changeset/verify-report-skipped-dimensions.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@fission-ai/openspec": patch ---- - -Stop `/opsx:verify` from reporting skipped checks as passing. Task completion now uses the schema-aware `tasks` and `progress` fields returned by apply instructions, while absent spec or design inputs are mapped to every check they prevent. Apply instructions aggregate every file matched by the configured task path or glob, regardless of the tracked artifact ID. Verification stays advisory and does not require optional or intentionally omitted artifacts. The scorecard identifies each skipped check, and the final assessment does not claim archive readiness when any check did not run. diff --git a/.changeset/windows-archive-claim-release.md b/.changeset/windows-archive-claim-release.md deleted file mode 100644 index 3869d17265..0000000000 --- a/.changeset/windows-archive-claim-release.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@fission-ai/openspec': patch ---- - -Fix `openspec archive` leaving `.openspec-archive.lock` behind on Windows. Node can report `dev: 0n` from a path stat while the open file handle reports the real volume id, so the claim-ownership check never matched and the stale lock blocked every later archive. The check now treats an absent device id as unavailable while still requiring the inode and the claim's contents to match before unlinking. diff --git a/CHANGELOG.md b/CHANGELOG.md index b44ebeea25..3343bbb906 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,54 @@ # @fission-ai/openspec +## 1.13.2 + +### Patch Changes + +- [#1940](https://github.com/Fission-AI/OpenSpec/pull/1940) [`0b5ce44`](https://github.com/Fission-AI/OpenSpec/commit/0b5ce44b55e0d793a312290ba5a41170a78e47c6) Thanks [@clay-good](https://github.com/clay-good)! - Keep fast-forward clarification guidance and onboarding task approval consistent across generated skills and commands. Fast-forward now asks only when context is critically unclear, while onboarding asks users to approve the task breakdown before saving it and separately asks whether to begin implementation. + +- [#1926](https://github.com/Fission-AI/OpenSpec/pull/1926) [`f2812f6`](https://github.com/Fission-AI/OpenSpec/commit/f2812f6d185f47cb577055f2fe243f12000d6cd2) Thanks [@kevin9327](https://github.com/kevin9327)! - ### Bug Fixes + + - **Archive** — When Windows `EPERM` blocks renaming a change directory that still has children, copy from the original source instead of requiring a staging rename that fails the same way. That lets archive finish instead of rolling back the spec write and leaving an empty capability directory git cannot see. A staging failure that is not `EPERM`/`EXDEV` still leaves the source untouched. + + The source of that unstaged copy is still the live change directory, which the archive claim does not cover, so cleanup removes only the entries it copied and verified rather than whatever is present when it runs. A file written in that window is left alone and the complete destination is retained for recovery, instead of being deleted without ever reaching the archive. + + An edit to a file that was already verified is covered too. Cleanup claims each entry with an atomic rename before reading it, then compares what it claimed against the copy. A rewrite that lands first is caught by that comparison and the file is put back; one that lands after creates a new file at the original path, which is never deleted. Either way the newer bytes stay on disk and archive reports the move as incomplete rather than succeeding with the older copy. + + Rollback of a newly created spec now also prunes the capability directory it created — and only that one. An empty capability directory that was already there is left in place with its own permissions. + +- [#1795](https://github.com/Fission-AI/OpenSpec/pull/1795) [`fb1b876`](https://github.com/Fission-AI/OpenSpec/commit/fb1b87613b7cdbe8d74e8147833904f46f0468c6) Thanks [@runsonmypc](https://github.com/runsonmypc)! - Archive workflows now use schema-aware task progress from `openspec list --json`, so custom task files and globs still trigger incomplete-task warnings. + +- [#1885](https://github.com/Fission-AI/OpenSpec/pull/1885) [`fd56e12`](https://github.com/Fission-AI/OpenSpec/commit/fd56e12c9e7fdbbfdc2dcd0a5ef3fab04840909d) Thanks [@philo-x](https://github.com/philo-x)! - Fix artifact output resolution to recognize brace expansion and extglob patterns while preserving literal output filenames and confining brace-expanded paths to the change directory. + +- [#1958](https://github.com/Fission-AI/OpenSpec/pull/1958) [`1d35e90`](https://github.com/Fission-AI/OpenSpec/commit/1d35e908804dbb3c4a1851516759c5de190aa4d5) Thanks [@clay-good](https://github.com/clay-good)! - Preserve a file's existing line endings when rewriting it, so Windows users no longer get whole-file diffs. Applying a delta to a CRLF spec (the default on a Windows checkout with `core.autocrlf=true`) rewrote the file to LF, turning a one-requirement change into a diff that touched every line. `openspec archive` now writes the spec back with the convention it already used; a spec that does not exist yet is still written with LF. + + The same fix covers marker-managed files: installing or updating shell completions in a CRLF `.bashrc` or `.zshrc` no longer leaves the file with mixed endings, which `bash` reports as `$'\r': command not found`. + + Removing a managed block is fixed the same way: the blank-line collapse in `removeMarkerBlock` rebuilt its separator as a bare LF, so cleaning up legacy artifacts left a lone LF inside an otherwise-CRLF `CLAUDE.md` or rc file. Both write paths now read the file the same way, by dominant ending, so one stray CRLF in an otherwise-LF file no longer pulls the whole rewrite to CRLF. + + `scripts/pack-version-check.mjs` now spawns `npm` through `cross-spawn`, so the release guard can run on Windows, where `npm` is `npm.cmd` and cannot be resolved by `execFile`. + +- [#1912](https://github.com/Fission-AI/OpenSpec/pull/1912) [`8826c0c`](https://github.com/Fission-AI/OpenSpec/commit/8826c0c4a17d3511947b7c5e0934257f153f0ed2) Thanks [@Tyagiquamar](https://github.com/Tyagiquamar)! - Fix `validate --strict` reporting `PURPOSE_IS_PLACEHOLDER` for a Purpose that opens with the ordinary word "Todo" followed by prose, as in Spanish ("Todo el…") and Portuguese ("Todo o…") specs ([#1897](https://github.com/Fission-AI/OpenSpec/issues/1897)). + + - Case now separates the marker from the word. `TBD`/`TODO` in capitals is still a placeholder marker whatever follows it, so `TODO write this later` is still reported. + - In any other case it counts as a marker only when followed by the end of the Purpose, a line break, or marker punctuation (`todo -`, `tbd.`), so an authored Spanish or Portuguese sentence is not reported. + +- [#1744](https://github.com/Fission-AI/OpenSpec/pull/1744) [`5b55263`](https://github.com/Fission-AI/OpenSpec/commit/5b5526377506c2f0179674a869c1ac64ca9ab72d) Thanks [@javigomez](https://github.com/javigomez)! - Clarify the Codex setup hint for CLI, IDE, and desktop app users. + +- [#1809](https://github.com/Fission-AI/OpenSpec/pull/1809) [`a5ceea3`](https://github.com/Fission-AI/OpenSpec/commit/a5ceea32cf110b6d8bbfea0bf1c65fe55abb133b) Thanks [@ryandemelo](https://github.com/ryandemelo)! - Say what a `MODIFIED` block adds when the scenario-loss guard fires ([#1809](https://github.com/Fission-AI/OpenSpec/pull/1809)). `openspec validate` and `openspec archive` already named the scenarios a block omits. They now also print how many scenarios each side has and which ones the block introduces, capped at three names, so a rename and a truncation read differently without opening either file. The guard catches exactly what it did before, and no exit code changes. + +- [#1731](https://github.com/Fission-AI/OpenSpec/pull/1731) [`d6bdef6`](https://github.com/Fission-AI/OpenSpec/commit/d6bdef6577a077614382ef47b64100852182d6a6) Thanks [@runsonmypc](https://github.com/runsonmypc)! - Stop workflows from displaying schema names that `openspec list --json` does not return. Update and continue no longer fabricate a `spec-driven` picker label, while bulk archive and explore describe only the change fields the list command actually provides. + +- [#1955](https://github.com/Fission-AI/OpenSpec/pull/1955) [`ed5d386`](https://github.com/Fission-AI/OpenSpec/commit/ed5d386a559c0215af1182d479d7f99b309fdcd2) Thanks [@clay-good](https://github.com/clay-good)! - Task guidance now requires each task group to land its own tests and documentation updates instead of deferring them to a trailing group. The onboarding walkthrough teaches the same rule, and the published schema reference no longer quotes stale instruction text. + +- [#1939](https://github.com/Fission-AI/OpenSpec/pull/1939) [`a64303f`](https://github.com/Fission-AI/OpenSpec/commit/a64303fe1e24f08dbf44f78032fadbeac3a6f7fa) Thanks [@clay-good](https://github.com/clay-good)! - Return a nonzero exit status when `openspec update --force` cannot replace a legacy-only Codex installation. + +- [#1733](https://github.com/Fission-AI/OpenSpec/pull/1733) [`72fbe4c`](https://github.com/Fission-AI/OpenSpec/commit/72fbe4c904707396151921a20b506d081a9dc024) Thanks [@runsonmypc](https://github.com/runsonmypc)! - Let `/opsx:update` fill a missing file under an already-satisfied glob artifact. A glob artifact is complete once one file matches it, and `/opsx:continue` only picks up `ready` artifacts, so the previous "point the user to `/opsx:continue`" handoff was unreachable and the missing file could never be created through the documented flow. + +- [#1732](https://github.com/Fission-AI/OpenSpec/pull/1732) [`072de6b`](https://github.com/Fission-AI/OpenSpec/commit/072de6bc39b1c47b9aacf4d484be16345ca4f38e) Thanks [@runsonmypc](https://github.com/runsonmypc)! - Stop `/opsx:verify` from reporting skipped checks as passing. Task completion now uses the schema-aware `tasks` and `progress` fields returned by apply instructions, while absent spec or design inputs are mapped to every check they prevent. Apply instructions aggregate every file matched by the configured task path or glob, regardless of the tracked artifact ID. Verification stays advisory and does not require optional or intentionally omitted artifacts. The scorecard identifies each skipped check, and the final assessment does not claim archive readiness when any check did not run. + +- [#1769](https://github.com/Fission-AI/OpenSpec/pull/1769) [`d3d7707`](https://github.com/Fission-AI/OpenSpec/commit/d3d770736fc01bb246b4f12a7cef7e3572ec1fb6) Thanks [@kikeprzn](https://github.com/kikeprzn)! - Fix `openspec archive` leaving `.openspec-archive.lock` behind on Windows. Node can report `dev: 0n` from a path stat while the open file handle reports the real volume id, so the claim-ownership check never matched and the stale lock blocked every later archive. The check now treats an absent device id as unavailable while still requiring the inode and the claim's contents to match before unlinking. + ## 1.13.1 ### Patch Changes diff --git a/package.json b/package.json index 468b1fea0c..a193eda3ce 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@fission-ai/openspec", - "version": "1.13.1", + "version": "1.13.2", "description": "AI-native system for spec-driven development", "keywords": [ "openspec",