sauron-cli 1.3.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (653) hide show
  1. package/README.md +4 -2
  2. package/dist/index.js +8 -8
  3. package/package.json +1 -1
  4. package/templates/.agents/rules/memory.md +68 -68
  5. package/templates/.agents/skills/wiki/SKILL.md +14 -14
  6. package/55ea973d-e255-4f08-a313-a5d68243bd2d.png +0 -0
  7. package/OpenSpec-main/.actrc +0 -1
  8. package/OpenSpec-main/.changeset/README.md +0 -97
  9. package/OpenSpec-main/.changeset/config.json +0 -15
  10. package/OpenSpec-main/.coderabbit.yaml +0 -11
  11. package/OpenSpec-main/.devcontainer/README.md +0 -92
  12. package/OpenSpec-main/.devcontainer/devcontainer.json +0 -68
  13. package/OpenSpec-main/.github/CODEOWNERS +0 -2
  14. package/OpenSpec-main/.github/workflows/README.md +0 -20
  15. package/OpenSpec-main/.github/workflows/ci.yml +0 -346
  16. package/OpenSpec-main/.github/workflows/release-prepare.yml +0 -60
  17. package/OpenSpec-main/CHANGELOG.md +0 -594
  18. package/OpenSpec-main/LICENSE +0 -22
  19. package/OpenSpec-main/MAINTAINERS.md +0 -17
  20. package/OpenSpec-main/README.md +0 -206
  21. package/OpenSpec-main/README_OLD.md +0 -475
  22. package/OpenSpec-main/assets/openspec_bg.png +0 -0
  23. package/OpenSpec-main/assets/openspec_dashboard.png +0 -0
  24. package/OpenSpec-main/assets/openspec_pixel_dark.svg +0 -89
  25. package/OpenSpec-main/assets/openspec_pixel_light.svg +0 -89
  26. package/OpenSpec-main/bin/openspec.js +0 -5
  27. package/OpenSpec-main/build.js +0 -31
  28. package/OpenSpec-main/eslint.config.js +0 -42
  29. package/OpenSpec-main/flake.lock +0 -27
  30. package/OpenSpec-main/flake.nix +0 -114
  31. package/OpenSpec-main/openspec/changes/IMPLEMENTATION_ORDER.md +0 -68
  32. package/OpenSpec-main/openspec/changes/add-artifact-regeneration-support/proposal.md +0 -136
  33. package/OpenSpec-main/openspec/changes/add-change-stacking-awareness/.openspec.yaml +0 -2
  34. package/OpenSpec-main/openspec/changes/add-change-stacking-awareness/proposal.md +0 -93
  35. package/OpenSpec-main/openspec/changes/add-change-stacking-awareness/specs/change-creation/spec.md +0 -15
  36. package/OpenSpec-main/openspec/changes/add-change-stacking-awareness/specs/change-stacking-workflow/spec.md +0 -65
  37. package/OpenSpec-main/openspec/changes/add-change-stacking-awareness/specs/cli-change/spec.md +0 -27
  38. package/OpenSpec-main/openspec/changes/add-change-stacking-awareness/specs/openspec-conventions/spec.md +0 -29
  39. package/OpenSpec-main/openspec/changes/add-change-stacking-awareness/tasks.md +0 -39
  40. package/OpenSpec-main/openspec/changes/add-global-install-scope/.openspec.yaml +0 -2
  41. package/OpenSpec-main/openspec/changes/add-global-install-scope/design.md +0 -161
  42. package/OpenSpec-main/openspec/changes/add-global-install-scope/proposal.md +0 -101
  43. package/OpenSpec-main/openspec/changes/add-global-install-scope/specs/ai-tool-paths/spec.md +0 -35
  44. package/OpenSpec-main/openspec/changes/add-global-install-scope/specs/cli-config/spec.md +0 -21
  45. package/OpenSpec-main/openspec/changes/add-global-install-scope/specs/cli-init/spec.md +0 -28
  46. package/OpenSpec-main/openspec/changes/add-global-install-scope/specs/cli-update/spec.md +0 -34
  47. package/OpenSpec-main/openspec/changes/add-global-install-scope/specs/command-generation/spec.md +0 -22
  48. package/OpenSpec-main/openspec/changes/add-global-install-scope/specs/global-config/spec.md +0 -24
  49. package/OpenSpec-main/openspec/changes/add-global-install-scope/specs/installation-scope/spec.md +0 -71
  50. package/OpenSpec-main/openspec/changes/add-global-install-scope/tasks.md +0 -61
  51. package/OpenSpec-main/openspec/changes/add-qa-smoke-harness/.openspec.yaml +0 -2
  52. package/OpenSpec-main/openspec/changes/add-qa-smoke-harness/proposal.md +0 -45
  53. package/OpenSpec-main/openspec/changes/add-qa-smoke-harness/specs/developer-qa-workflow/spec.md +0 -49
  54. package/OpenSpec-main/openspec/changes/add-tool-command-surface-capabilities/.openspec.yaml +0 -2
  55. package/OpenSpec-main/openspec/changes/add-tool-command-surface-capabilities/proposal.md +0 -111
  56. package/OpenSpec-main/openspec/changes/add-tool-command-surface-capabilities/specs/cli-init/spec.md +0 -121
  57. package/OpenSpec-main/openspec/changes/add-tool-command-surface-capabilities/specs/cli-update/spec.md +0 -48
  58. package/OpenSpec-main/openspec/changes/add-tool-command-surface-capabilities/tasks.md +0 -53
  59. package/OpenSpec-main/openspec/changes/archive/2025-01-11-add-update-command/design.md +0 -86
  60. package/OpenSpec-main/openspec/changes/archive/2025-01-11-add-update-command/proposal.md +0 -29
  61. package/OpenSpec-main/openspec/changes/archive/2025-01-11-add-update-command/specs/cli-update/spec.md +0 -59
  62. package/OpenSpec-main/openspec/changes/archive/2025-01-11-add-update-command/tasks.md +0 -20
  63. package/OpenSpec-main/openspec/changes/archive/2025-01-13-add-list-command/proposal.md +0 -20
  64. package/OpenSpec-main/openspec/changes/archive/2025-01-13-add-list-command/specs/cli-list/spec.md +0 -69
  65. package/OpenSpec-main/openspec/changes/archive/2025-01-13-add-list-command/tasks.md +0 -26
  66. package/OpenSpec-main/openspec/changes/archive/2025-08-05-initialize-typescript-project/design.md +0 -64
  67. package/OpenSpec-main/openspec/changes/archive/2025-08-05-initialize-typescript-project/proposal.md +0 -18
  68. package/OpenSpec-main/openspec/changes/archive/2025-08-05-initialize-typescript-project/tasks.md +0 -25
  69. package/OpenSpec-main/openspec/changes/archive/2025-08-06-add-init-command/design.md +0 -104
  70. package/OpenSpec-main/openspec/changes/archive/2025-08-06-add-init-command/proposal.md +0 -30
  71. package/OpenSpec-main/openspec/changes/archive/2025-08-06-add-init-command/specs/cli-init/spec.md +0 -148
  72. package/OpenSpec-main/openspec/changes/archive/2025-08-06-add-init-command/tasks.md +0 -38
  73. package/OpenSpec-main/openspec/changes/archive/2025-08-06-adopt-future-state-storage/proposal.md +0 -24
  74. package/OpenSpec-main/openspec/changes/archive/2025-08-06-adopt-future-state-storage/specs/openspec-conventions/spec.md +0 -120
  75. package/OpenSpec-main/openspec/changes/archive/2025-08-06-adopt-future-state-storage/tasks.md +0 -38
  76. package/OpenSpec-main/openspec/changes/archive/2025-08-11-add-complexity-guidelines/proposal.md +0 -13
  77. package/OpenSpec-main/openspec/changes/archive/2025-08-11-add-complexity-guidelines/specs/openspec-docs/README.md +0 -472
  78. package/OpenSpec-main/openspec/changes/archive/2025-08-11-add-complexity-guidelines/tasks.md +0 -9
  79. package/OpenSpec-main/openspec/changes/archive/2025-08-13-add-archive-command/proposal.md +0 -15
  80. package/OpenSpec-main/openspec/changes/archive/2025-08-13-add-archive-command/specs/cli-archive/spec.md +0 -111
  81. package/OpenSpec-main/openspec/changes/archive/2025-08-13-add-archive-command/tasks.md +0 -44
  82. package/OpenSpec-main/openspec/changes/archive/2025-08-13-add-diff-command/proposal.md +0 -19
  83. package/OpenSpec-main/openspec/changes/archive/2025-08-13-add-diff-command/specs/cli-diff/spec.md +0 -77
  84. package/OpenSpec-main/openspec/changes/archive/2025-08-13-add-diff-command/tasks.md +0 -23
  85. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-change-commands/design.md +0 -56
  86. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-change-commands/proposal.md +0 -17
  87. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-change-commands/specs/cli-change/spec.md +0 -48
  88. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-change-commands/specs/cli-list/spec.md +0 -12
  89. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-change-commands/tasks.md +0 -34
  90. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-interactive-show-command/proposal.md +0 -20
  91. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-interactive-show-command/specs/cli-change/spec.md +0 -23
  92. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-interactive-show-command/specs/cli-show/spec.md +0 -83
  93. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-interactive-show-command/specs/cli-spec/spec.md +0 -23
  94. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-interactive-show-command/tasks.md +0 -142
  95. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-skip-specs-archive-option/proposal.md +0 -13
  96. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-skip-specs-archive-option/specs/cli-archive/spec.md +0 -191
  97. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-skip-specs-archive-option/tasks.md +0 -57
  98. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-spec-commands/design.md +0 -45
  99. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-spec-commands/proposal.md +0 -19
  100. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-spec-commands/specs/cli-spec/spec.md +0 -43
  101. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-spec-commands/tasks.md +0 -22
  102. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-zod-validation/design.md +0 -104
  103. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-zod-validation/proposal.md +0 -22
  104. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-zod-validation/specs/cli-archive/spec.md +0 -18
  105. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-zod-validation/specs/cli-diff/spec.md +0 -12
  106. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-zod-validation/tasks.md +0 -59
  107. package/OpenSpec-main/openspec/changes/archive/2025-08-19-adopt-delta-based-changes/proposal.md +0 -93
  108. package/OpenSpec-main/openspec/changes/archive/2025-08-19-adopt-delta-based-changes/specs/cli-archive/spec.md +0 -48
  109. package/OpenSpec-main/openspec/changes/archive/2025-08-19-adopt-delta-based-changes/specs/cli-diff/spec.md +0 -45
  110. package/OpenSpec-main/openspec/changes/archive/2025-08-19-adopt-delta-based-changes/specs/openspec-conventions/spec.md +0 -101
  111. package/OpenSpec-main/openspec/changes/archive/2025-08-19-adopt-delta-based-changes/tasks.md +0 -55
  112. package/OpenSpec-main/openspec/changes/archive/2025-08-19-adopt-verb-noun-cli-structure/design.md +0 -19
  113. package/OpenSpec-main/openspec/changes/archive/2025-08-19-adopt-verb-noun-cli-structure/proposal.md +0 -67
  114. package/OpenSpec-main/openspec/changes/archive/2025-08-19-adopt-verb-noun-cli-structure/specs/cli-list/spec.md +0 -57
  115. package/OpenSpec-main/openspec/changes/archive/2025-08-19-adopt-verb-noun-cli-structure/specs/openspec-conventions/spec.md +0 -23
  116. package/OpenSpec-main/openspec/changes/archive/2025-08-19-adopt-verb-noun-cli-structure/tasks.md +0 -27
  117. package/OpenSpec-main/openspec/changes/archive/2025-08-19-bulk-validation-interactive-selection/proposal.md +0 -20
  118. package/OpenSpec-main/openspec/changes/archive/2025-08-19-bulk-validation-interactive-selection/specs/cli-change/spec.md +0 -22
  119. package/OpenSpec-main/openspec/changes/archive/2025-08-19-bulk-validation-interactive-selection/specs/cli-spec/spec.md +0 -23
  120. package/OpenSpec-main/openspec/changes/archive/2025-08-19-bulk-validation-interactive-selection/specs/cli-validate/spec.md +0 -149
  121. package/OpenSpec-main/openspec/changes/archive/2025-08-19-bulk-validation-interactive-selection/tasks.md +0 -81
  122. package/OpenSpec-main/openspec/changes/archive/2025-08-19-fix-update-tool-selection/proposal.md +0 -40
  123. package/OpenSpec-main/openspec/changes/archive/2025-08-19-fix-update-tool-selection/specs/cli-update/spec.md +0 -23
  124. package/OpenSpec-main/openspec/changes/archive/2025-08-19-fix-update-tool-selection/tasks.md +0 -21
  125. package/OpenSpec-main/openspec/changes/archive/2025-08-19-improve-validate-error-messages/proposal.md +0 -25
  126. package/OpenSpec-main/openspec/changes/archive/2025-08-19-improve-validate-error-messages/specs/cli-validate/spec.md +0 -55
  127. package/OpenSpec-main/openspec/changes/archive/2025-08-19-improve-validate-error-messages/tasks.md +0 -21
  128. package/OpenSpec-main/openspec/changes/archive/2025-08-19-structured-spec-format/proposal.md +0 -36
  129. package/OpenSpec-main/openspec/changes/archive/2025-08-19-structured-spec-format/specs/openspec-conventions/spec.md +0 -192
  130. package/OpenSpec-main/openspec/changes/archive/2025-08-19-structured-spec-format/tasks.md +0 -19
  131. package/OpenSpec-main/openspec/changes/archive/2025-09-12-add-view-dashboard-command/proposal.md +0 -38
  132. package/OpenSpec-main/openspec/changes/archive/2025-09-12-add-view-dashboard-command/specs/cli-view/spec.md +0 -109
  133. package/OpenSpec-main/openspec/changes/archive/2025-09-12-add-view-dashboard-command/tasks.md +0 -47
  134. package/OpenSpec-main/openspec/changes/archive/2025-09-29-add-agents-md-config/proposal.md +0 -28
  135. package/OpenSpec-main/openspec/changes/archive/2025-09-29-add-agents-md-config/specs/cli-init/spec.md +0 -71
  136. package/OpenSpec-main/openspec/changes/archive/2025-09-29-add-agents-md-config/specs/cli-update/spec.md +0 -41
  137. package/OpenSpec-main/openspec/changes/archive/2025-09-29-add-agents-md-config/tasks.md +0 -17
  138. package/OpenSpec-main/openspec/changes/archive/2025-09-29-add-multi-agent-init/proposal.md +0 -35
  139. package/OpenSpec-main/openspec/changes/archive/2025-09-29-add-multi-agent-init/specs/cli-init/spec.md +0 -45
  140. package/OpenSpec-main/openspec/changes/archive/2025-09-29-add-multi-agent-init/tasks.md +0 -16
  141. package/OpenSpec-main/openspec/changes/archive/2025-09-29-add-slash-command-support/proposal.md +0 -119
  142. package/OpenSpec-main/openspec/changes/archive/2025-09-29-add-slash-command-support/specs/cli-init/spec.md +0 -21
  143. package/OpenSpec-main/openspec/changes/archive/2025-09-29-add-slash-command-support/specs/cli-update/spec.md +0 -22
  144. package/OpenSpec-main/openspec/changes/archive/2025-09-29-add-slash-command-support/tasks.md +0 -20
  145. package/OpenSpec-main/openspec/changes/archive/2025-09-29-improve-cli-e2e-plan/proposal.md +0 -19
  146. package/OpenSpec-main/openspec/changes/archive/2025-09-29-improve-cli-e2e-plan/tasks.md +0 -9
  147. package/OpenSpec-main/openspec/changes/archive/2025-09-29-improve-deterministic-tests/proposal.md +0 -78
  148. package/OpenSpec-main/openspec/changes/archive/2025-09-29-improve-deterministic-tests/tasks.md +0 -25
  149. package/OpenSpec-main/openspec/changes/archive/2025-09-29-improve-init-onboarding/proposal.md +0 -13
  150. package/OpenSpec-main/openspec/changes/archive/2025-09-29-improve-init-onboarding/specs/cli-init/spec.md +0 -92
  151. package/OpenSpec-main/openspec/changes/archive/2025-09-29-improve-init-onboarding/tasks.md +0 -12
  152. package/OpenSpec-main/openspec/changes/archive/2025-09-29-remove-diff-command/proposal.md +0 -81
  153. package/OpenSpec-main/openspec/changes/archive/2025-09-29-remove-diff-command/tasks.md +0 -37
  154. package/OpenSpec-main/openspec/changes/archive/2025-09-29-sort-active-changes-by-progress/proposal.md +0 -25
  155. package/OpenSpec-main/openspec/changes/archive/2025-09-29-sort-active-changes-by-progress/specs/cli-view/spec.md +0 -9
  156. package/OpenSpec-main/openspec/changes/archive/2025-09-29-sort-active-changes-by-progress/tasks.md +0 -8
  157. package/OpenSpec-main/openspec/changes/archive/2025-09-29-update-agent-file-name/proposal.md +0 -29
  158. package/OpenSpec-main/openspec/changes/archive/2025-09-29-update-agent-file-name/specs/cli-init/spec.md +0 -40
  159. package/OpenSpec-main/openspec/changes/archive/2025-09-29-update-agent-file-name/specs/cli-update/spec.md +0 -22
  160. package/OpenSpec-main/openspec/changes/archive/2025-09-29-update-agent-file-name/specs/openspec-conventions/spec.md +0 -27
  161. package/OpenSpec-main/openspec/changes/archive/2025-09-29-update-agent-file-name/tasks.md +0 -22
  162. package/OpenSpec-main/openspec/changes/archive/2025-09-29-update-agent-instructions/design.md +0 -130
  163. package/OpenSpec-main/openspec/changes/archive/2025-09-29-update-agent-instructions/proposal.md +0 -117
  164. package/OpenSpec-main/openspec/changes/archive/2025-09-29-update-agent-instructions/tasks.md +0 -69
  165. package/OpenSpec-main/openspec/changes/archive/2025-09-29-update-markdown-parser-crlf/proposal.md +0 -19
  166. package/OpenSpec-main/openspec/changes/archive/2025-09-29-update-markdown-parser-crlf/specs/cli-validate/spec.md +0 -9
  167. package/OpenSpec-main/openspec/changes/archive/2025-09-29-update-markdown-parser-crlf/tasks.md +0 -11
  168. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-codex-slash-command-support/proposal.md +0 -25
  169. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-codex-slash-command-support/specs/cli-init/spec.md +0 -56
  170. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-codex-slash-command-support/specs/cli-update/spec.md +0 -41
  171. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-codex-slash-command-support/tasks.md +0 -19
  172. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-github-copilot-prompts/proposal.md +0 -25
  173. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-github-copilot-prompts/specs/cli-init/spec.md +0 -48
  174. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-github-copilot-prompts/specs/cli-update/spec.md +0 -48
  175. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-github-copilot-prompts/tasks.md +0 -30
  176. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-kilocode-workflows/proposal.md +0 -17
  177. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-kilocode-workflows/specs/cli-init/spec.md +0 -43
  178. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-kilocode-workflows/specs/cli-update/spec.md +0 -27
  179. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-kilocode-workflows/tasks.md +0 -15
  180. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-non-interactive-init-options/proposal.md +0 -12
  181. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-non-interactive-init-options/specs/cli-init/spec.md +0 -39
  182. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-non-interactive-init-options/tasks.md +0 -17
  183. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-windsurf-workflows/proposal.md +0 -17
  184. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-windsurf-workflows/specs/cli-init/spec.md +0 -42
  185. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-windsurf-workflows/specs/cli-update/spec.md +0 -27
  186. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-windsurf-workflows/tasks.md +0 -17
  187. package/OpenSpec-main/openspec/changes/archive/2025-10-14-enhance-validation-error-messages/proposal.md +0 -12
  188. package/OpenSpec-main/openspec/changes/archive/2025-10-14-enhance-validation-error-messages/specs/cli-validate/spec.md +0 -39
  189. package/OpenSpec-main/openspec/changes/archive/2025-10-14-enhance-validation-error-messages/tasks.md +0 -12
  190. package/OpenSpec-main/openspec/changes/archive/2025-10-14-improve-agent-instruction-usability/proposal.md +0 -12
  191. package/OpenSpec-main/openspec/changes/archive/2025-10-14-improve-agent-instruction-usability/specs/docs-agent-instructions/spec.md +0 -33
  192. package/OpenSpec-main/openspec/changes/archive/2025-10-14-improve-agent-instruction-usability/tasks.md +0 -11
  193. package/OpenSpec-main/openspec/changes/archive/2025-10-14-slim-root-agents-file/proposal.md +0 -13
  194. package/OpenSpec-main/openspec/changes/archive/2025-10-14-slim-root-agents-file/tasks.md +0 -15
  195. package/OpenSpec-main/openspec/changes/archive/2025-10-14-update-cli-init-enter-selection/proposal.md +0 -14
  196. package/OpenSpec-main/openspec/changes/archive/2025-10-14-update-cli-init-enter-selection/specs/cli-init/spec.md +0 -10
  197. package/OpenSpec-main/openspec/changes/archive/2025-10-14-update-cli-init-enter-selection/tasks.md +0 -8
  198. package/OpenSpec-main/openspec/changes/archive/2025-10-14-update-cli-init-root-agents/proposal.md +0 -15
  199. package/OpenSpec-main/openspec/changes/archive/2025-10-14-update-cli-init-root-agents/specs/cli-init/spec.md +0 -32
  200. package/OpenSpec-main/openspec/changes/archive/2025-10-14-update-cli-init-root-agents/specs/cli-update/spec.md +0 -10
  201. package/OpenSpec-main/openspec/changes/archive/2025-10-14-update-cli-init-root-agents/tasks.md +0 -11
  202. package/OpenSpec-main/openspec/changes/archive/2025-10-14-update-release-automation/proposal.md +0 -49
  203. package/OpenSpec-main/openspec/changes/archive/2025-10-14-update-release-automation/tasks.md +0 -12
  204. package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-archive-command-arguments/proposal.md +0 -17
  205. package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-archive-command-arguments/specs/cli-update/spec.md +0 -32
  206. package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-archive-command-arguments/tasks.md +0 -15
  207. package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-cline-support/proposal.md +0 -15
  208. package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-cline-support/specs/cli-init/spec.md +0 -97
  209. package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-cline-support/tasks.md +0 -19
  210. package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-crush-support/proposal.md +0 -13
  211. package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-crush-support/specs/cli-init/spec.md +0 -67
  212. package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-crush-support/tasks.md +0 -7
  213. package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-factory-slash-commands/proposal.md +0 -12
  214. package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-factory-slash-commands/specs/cli-init/spec.md +0 -54
  215. package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-factory-slash-commands/specs/cli-update/spec.md +0 -54
  216. package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-factory-slash-commands/tasks.md +0 -11
  217. package/OpenSpec-main/openspec/changes/archive/2025-11-06-add-shell-completions/design.md +0 -525
  218. package/OpenSpec-main/openspec/changes/archive/2025-11-06-add-shell-completions/proposal.md +0 -29
  219. package/OpenSpec-main/openspec/changes/archive/2025-11-06-add-shell-completions/specs/cli-completion/spec.md +0 -300
  220. package/OpenSpec-main/openspec/changes/archive/2025-11-06-add-shell-completions/tasks.md +0 -81
  221. package/OpenSpec-main/openspec/changes/archive/2025-12-20-add-global-config-dir/design.md +0 -105
  222. package/OpenSpec-main/openspec/changes/archive/2025-12-20-add-global-config-dir/proposal.md +0 -20
  223. package/OpenSpec-main/openspec/changes/archive/2025-12-20-add-global-config-dir/specs/global-config/spec.md +0 -76
  224. package/OpenSpec-main/openspec/changes/archive/2025-12-20-add-global-config-dir/tasks.md +0 -26
  225. package/OpenSpec-main/openspec/changes/archive/2025-12-21-add-config-command/design.md +0 -89
  226. package/OpenSpec-main/openspec/changes/archive/2025-12-21-add-config-command/proposal.md +0 -60
  227. package/OpenSpec-main/openspec/changes/archive/2025-12-21-add-config-command/specs/cli-config/spec.md +0 -213
  228. package/OpenSpec-main/openspec/changes/archive/2025-12-21-add-config-command/tasks.md +0 -28
  229. package/OpenSpec-main/openspec/changes/archive/2025-12-23-extend-shell-completions/proposal.md +0 -15
  230. package/OpenSpec-main/openspec/changes/archive/2025-12-23-extend-shell-completions/specs/cli-completion/spec.md +0 -328
  231. package/OpenSpec-main/openspec/changes/archive/2025-12-23-extend-shell-completions/tasks.md +0 -49
  232. package/OpenSpec-main/openspec/changes/archive/2025-12-24-add-artifact-graph-core/design.md +0 -197
  233. package/OpenSpec-main/openspec/changes/archive/2025-12-24-add-artifact-graph-core/proposal.md +0 -18
  234. package/OpenSpec-main/openspec/changes/archive/2025-12-24-add-artifact-graph-core/specs/artifact-graph/spec.md +0 -103
  235. package/OpenSpec-main/openspec/changes/archive/2025-12-24-add-artifact-graph-core/tasks.md +0 -61
  236. package/OpenSpec-main/openspec/changes/archive/2025-12-25-add-change-manager/design.md +0 -74
  237. package/OpenSpec-main/openspec/changes/archive/2025-12-25-add-change-manager/proposal.md +0 -45
  238. package/OpenSpec-main/openspec/changes/archive/2025-12-25-add-change-manager/specs/change-creation/spec.md +0 -63
  239. package/OpenSpec-main/openspec/changes/archive/2025-12-25-add-change-manager/tasks.md +0 -30
  240. package/OpenSpec-main/openspec/changes/archive/2025-12-28-add-artifact-workflow-cli/design.md +0 -112
  241. package/OpenSpec-main/openspec/changes/archive/2025-12-28-add-artifact-workflow-cli/proposal.md +0 -33
  242. package/OpenSpec-main/openspec/changes/archive/2025-12-28-add-artifact-workflow-cli/specs/cli-artifact-workflow/spec.md +0 -153
  243. package/OpenSpec-main/openspec/changes/archive/2025-12-28-add-artifact-workflow-cli/tasks.md +0 -48
  244. package/OpenSpec-main/openspec/changes/archive/2025-12-28-add-instruction-loader/design.md +0 -149
  245. package/OpenSpec-main/openspec/changes/archive/2025-12-28-add-instruction-loader/proposal.md +0 -20
  246. package/OpenSpec-main/openspec/changes/archive/2025-12-28-add-instruction-loader/specs/instruction-loader/spec.md +0 -70
  247. package/OpenSpec-main/openspec/changes/archive/2025-12-28-add-instruction-loader/tasks.md +0 -13
  248. package/OpenSpec-main/openspec/changes/archive/2025-12-28-restructure-schema-directories/design.md +0 -129
  249. package/OpenSpec-main/openspec/changes/archive/2025-12-28-restructure-schema-directories/proposal.md +0 -20
  250. package/OpenSpec-main/openspec/changes/archive/2025-12-28-restructure-schema-directories/specs/artifact-graph/spec.md +0 -49
  251. package/OpenSpec-main/openspec/changes/archive/2025-12-28-restructure-schema-directories/tasks.md +0 -32
  252. package/OpenSpec-main/openspec/changes/archive/2025-12-29-unify-change-state-model/design.md +0 -151
  253. package/OpenSpec-main/openspec/changes/archive/2025-12-29-unify-change-state-model/proposal.md +0 -101
  254. package/OpenSpec-main/openspec/changes/archive/2025-12-29-unify-change-state-model/specs/cli-artifact-workflow/spec.md +0 -109
  255. package/OpenSpec-main/openspec/changes/archive/2025-12-29-unify-change-state-model/specs/cli-view/spec.md +0 -60
  256. package/OpenSpec-main/openspec/changes/archive/2025-12-29-unify-change-state-model/tasks.md +0 -25
  257. package/OpenSpec-main/openspec/changes/archive/2025-12-30-add-antigravity-support/proposal.md +0 -11
  258. package/OpenSpec-main/openspec/changes/archive/2025-12-30-add-antigravity-support/specs/cli-init/spec.md +0 -105
  259. package/OpenSpec-main/openspec/changes/archive/2025-12-30-add-antigravity-support/specs/cli-update/spec.md +0 -92
  260. package/OpenSpec-main/openspec/changes/archive/2025-12-30-add-antigravity-support/tasks.md +0 -12
  261. package/OpenSpec-main/openspec/changes/archive/2025-12-30-fix-cline-workflows-implementation/proposal.md +0 -13
  262. package/OpenSpec-main/openspec/changes/archive/2025-12-30-fix-cline-workflows-implementation/specs/cli-init/spec.md +0 -105
  263. package/OpenSpec-main/openspec/changes/archive/2025-12-30-fix-cline-workflows-implementation/specs/cli-update/spec.md +0 -92
  264. package/OpenSpec-main/openspec/changes/archive/2025-12-30-fix-cline-workflows-implementation/tasks.md +0 -13
  265. package/OpenSpec-main/openspec/changes/archive/2026-01-06-add-agent-schema-selection/proposal.md +0 -26
  266. package/OpenSpec-main/openspec/changes/archive/2026-01-06-add-agent-schema-selection/tasks.md +0 -32
  267. package/OpenSpec-main/openspec/changes/archive/2026-01-06-add-per-change-schema-metadata/design.md +0 -147
  268. package/OpenSpec-main/openspec/changes/archive/2026-01-06-add-per-change-schema-metadata/proposal.md +0 -29
  269. package/OpenSpec-main/openspec/changes/archive/2026-01-06-add-per-change-schema-metadata/specs/cli-artifact-workflow/spec.md +0 -98
  270. package/OpenSpec-main/openspec/changes/archive/2026-01-06-add-per-change-schema-metadata/tasks.md +0 -29
  271. package/OpenSpec-main/openspec/changes/archive/2026-01-06-add-specs-apply-command/.openspec.yaml +0 -2
  272. package/OpenSpec-main/openspec/changes/archive/2026-01-06-add-specs-apply-command/design.md +0 -77
  273. package/OpenSpec-main/openspec/changes/archive/2026-01-06-add-specs-apply-command/proposal.md +0 -32
  274. package/OpenSpec-main/openspec/changes/archive/2026-01-06-add-specs-apply-command/specs/specs-sync-skill/spec.md +0 -67
  275. package/OpenSpec-main/openspec/changes/archive/2026-01-06-add-specs-apply-command/tasks.md +0 -40
  276. package/OpenSpec-main/openspec/changes/archive/2026-01-06-make-apply-instructions-schema-aware/proposal.md +0 -138
  277. package/OpenSpec-main/openspec/changes/archive/2026-01-06-make-apply-instructions-schema-aware/specs/cli-artifact-workflow/spec.md +0 -60
  278. package/OpenSpec-main/openspec/changes/archive/2026-01-06-make-apply-instructions-schema-aware/tasks.md +0 -35
  279. package/OpenSpec-main/openspec/changes/archive/2026-01-06-opsx-archive-command/.openspec.yaml +0 -2
  280. package/OpenSpec-main/openspec/changes/archive/2026-01-06-opsx-archive-command/design.md +0 -84
  281. package/OpenSpec-main/openspec/changes/archive/2026-01-06-opsx-archive-command/proposal.md +0 -28
  282. package/OpenSpec-main/openspec/changes/archive/2026-01-06-opsx-archive-command/specs/opsx-archive-skill/spec.md +0 -122
  283. package/OpenSpec-main/openspec/changes/archive/2026-01-06-opsx-archive-command/tasks.md +0 -23
  284. package/OpenSpec-main/openspec/changes/archive/2026-01-07-add-nix-flake-support/.openspec.yaml +0 -2
  285. package/OpenSpec-main/openspec/changes/archive/2026-01-07-add-nix-flake-support/design.md +0 -94
  286. package/OpenSpec-main/openspec/changes/archive/2026-01-07-add-nix-flake-support/proposal.md +0 -25
  287. package/OpenSpec-main/openspec/changes/archive/2026-01-07-add-nix-flake-support/specs/nix-flake-support/spec.md +0 -79
  288. package/OpenSpec-main/openspec/changes/archive/2026-01-07-add-nix-flake-support/tasks.md +0 -65
  289. package/OpenSpec-main/openspec/changes/archive/2026-01-09-add-flake-update-script/.openspec.yaml +0 -2
  290. package/OpenSpec-main/openspec/changes/archive/2026-01-09-add-flake-update-script/design.md +0 -117
  291. package/OpenSpec-main/openspec/changes/archive/2026-01-09-add-flake-update-script/proposal.md +0 -23
  292. package/OpenSpec-main/openspec/changes/archive/2026-01-09-add-flake-update-script/specs/flake-update-script/spec.md +0 -93
  293. package/OpenSpec-main/openspec/changes/archive/2026-01-09-add-flake-update-script/tasks.md +0 -55
  294. package/OpenSpec-main/openspec/changes/archive/2026-01-09-add-posthog-analytics/.openspec.yaml +0 -2
  295. package/OpenSpec-main/openspec/changes/archive/2026-01-09-add-posthog-analytics/design.md +0 -175
  296. package/OpenSpec-main/openspec/changes/archive/2026-01-09-add-posthog-analytics/proposal.md +0 -37
  297. package/OpenSpec-main/openspec/changes/archive/2026-01-09-add-posthog-analytics/specs/global-config/spec.md +0 -21
  298. package/OpenSpec-main/openspec/changes/archive/2026-01-09-add-posthog-analytics/specs/telemetry/spec.md +0 -116
  299. package/OpenSpec-main/openspec/changes/archive/2026-01-09-add-posthog-analytics/tasks.md +0 -47
  300. package/OpenSpec-main/openspec/changes/archive/2026-01-09-fix-codebuddy-frontmatter-fields/proposal.md +0 -16
  301. package/OpenSpec-main/openspec/changes/archive/2026-01-09-fix-codebuddy-frontmatter-fields/specs/cli-init/spec.md +0 -75
  302. package/OpenSpec-main/openspec/changes/archive/2026-01-09-fix-codebuddy-frontmatter-fields/specs/cli-update/spec.md +0 -56
  303. package/OpenSpec-main/openspec/changes/archive/2026-01-09-fix-codebuddy-frontmatter-fields/tasks.md +0 -6
  304. package/OpenSpec-main/openspec/changes/archive/2026-01-15-add-nix-ci-validation/design.md +0 -206
  305. package/OpenSpec-main/openspec/changes/archive/2026-01-15-add-nix-ci-validation/proposal.md +0 -21
  306. package/OpenSpec-main/openspec/changes/archive/2026-01-15-add-nix-ci-validation/specs/ci-nix-validation/spec.md +0 -104
  307. package/OpenSpec-main/openspec/changes/archive/2026-01-15-add-nix-ci-validation/tasks.md +0 -49
  308. package/OpenSpec-main/openspec/changes/archive/2026-01-30-opencode-command-references/.openspec.yaml +0 -2
  309. package/OpenSpec-main/openspec/changes/archive/2026-01-30-opencode-command-references/README.md +0 -3
  310. package/OpenSpec-main/openspec/changes/archive/2026-01-30-opencode-command-references/design.md +0 -70
  311. package/OpenSpec-main/openspec/changes/archive/2026-01-30-opencode-command-references/proposal.md +0 -32
  312. package/OpenSpec-main/openspec/changes/archive/2026-01-30-opencode-command-references/specs/no-changes.md +0 -9
  313. package/OpenSpec-main/openspec/changes/archive/2026-01-30-opencode-command-references/tasks.md +0 -22
  314. package/OpenSpec-main/openspec/changes/archive/2026-02-17-add-feedback-command/proposal.md +0 -20
  315. package/OpenSpec-main/openspec/changes/archive/2026-02-17-add-feedback-command/specs/cli-feedback/spec.md +0 -188
  316. package/OpenSpec-main/openspec/changes/archive/2026-02-17-add-feedback-command/tasks.md +0 -30
  317. package/OpenSpec-main/openspec/changes/archive/2026-02-17-add-opsx-onboard-skill/.openspec.yaml +0 -2
  318. package/OpenSpec-main/openspec/changes/archive/2026-02-17-add-opsx-onboard-skill/design.md +0 -115
  319. package/OpenSpec-main/openspec/changes/archive/2026-02-17-add-opsx-onboard-skill/proposal.md +0 -27
  320. package/OpenSpec-main/openspec/changes/archive/2026-02-17-add-opsx-onboard-skill/specs/opsx-onboard-skill/spec.md +0 -162
  321. package/OpenSpec-main/openspec/changes/archive/2026-02-17-add-opsx-onboard-skill/tasks.md +0 -21
  322. package/OpenSpec-main/openspec/changes/archive/2026-02-17-add-verify-skill/design.md +0 -96
  323. package/OpenSpec-main/openspec/changes/archive/2026-02-17-add-verify-skill/proposal.md +0 -48
  324. package/OpenSpec-main/openspec/changes/archive/2026-02-17-add-verify-skill/specs/opsx-verify-skill/spec.md +0 -190
  325. package/OpenSpec-main/openspec/changes/archive/2026-02-17-add-verify-skill/tasks.md +0 -15
  326. package/OpenSpec-main/openspec/changes/archive/2026-02-17-merge-init-experimental/.openspec.yaml +0 -2
  327. package/OpenSpec-main/openspec/changes/archive/2026-02-17-merge-init-experimental/design.md +0 -193
  328. package/OpenSpec-main/openspec/changes/archive/2026-02-17-merge-init-experimental/proposal.md +0 -32
  329. package/OpenSpec-main/openspec/changes/archive/2026-02-17-merge-init-experimental/specs/cli-init/spec.md +0 -176
  330. package/OpenSpec-main/openspec/changes/archive/2026-02-17-merge-init-experimental/specs/legacy-cleanup/spec.md +0 -158
  331. package/OpenSpec-main/openspec/changes/archive/2026-02-17-merge-init-experimental/tasks.md +0 -67
  332. package/OpenSpec-main/openspec/changes/archive/2026-02-17-multi-provider-skill-generation/.openspec.yaml +0 -2
  333. package/OpenSpec-main/openspec/changes/archive/2026-02-17-multi-provider-skill-generation/design.md +0 -144
  334. package/OpenSpec-main/openspec/changes/archive/2026-02-17-multi-provider-skill-generation/proposal.md +0 -36
  335. package/OpenSpec-main/openspec/changes/archive/2026-02-17-multi-provider-skill-generation/specs/ai-tool-paths/spec.md +0 -63
  336. package/OpenSpec-main/openspec/changes/archive/2026-02-17-multi-provider-skill-generation/specs/cli-artifact-workflow/spec.md +0 -60
  337. package/OpenSpec-main/openspec/changes/archive/2026-02-17-multi-provider-skill-generation/specs/command-generation/spec.md +0 -98
  338. package/OpenSpec-main/openspec/changes/archive/2026-02-17-multi-provider-skill-generation/tasks.md +0 -55
  339. package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-config/.openspec.yaml +0 -2
  340. package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-config/design.md +0 -665
  341. package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-config/proposal.md +0 -774
  342. package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-config/specs/config-loading/spec.md +0 -119
  343. package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-config/specs/context-injection/spec.md +0 -51
  344. package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-config/specs/rules-injection/spec.md +0 -99
  345. package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-config/specs/schema-resolution/spec.md +0 -83
  346. package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-config/tasks.md +0 -72
  347. package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-local-schemas/.openspec.yaml +0 -2
  348. package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-local-schemas/design.md +0 -117
  349. package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-local-schemas/proposal.md +0 -167
  350. package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-local-schemas/specs/schema-resolution/spec.md +0 -88
  351. package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-local-schemas/tasks.md +0 -28
  352. package/OpenSpec-main/openspec/changes/archive/2026-02-17-schema-management-cli/.openspec.yaml +0 -2
  353. package/OpenSpec-main/openspec/changes/archive/2026-02-17-schema-management-cli/design.md +0 -113
  354. package/OpenSpec-main/openspec/changes/archive/2026-02-17-schema-management-cli/proposal.md +0 -55
  355. package/OpenSpec-main/openspec/changes/archive/2026-02-17-schema-management-cli/specs/schema-fork-command/spec.md +0 -66
  356. package/OpenSpec-main/openspec/changes/archive/2026-02-17-schema-management-cli/specs/schema-init-command/spec.md +0 -71
  357. package/OpenSpec-main/openspec/changes/archive/2026-02-17-schema-management-cli/specs/schema-validate-command/spec.md +0 -86
  358. package/OpenSpec-main/openspec/changes/archive/2026-02-17-schema-management-cli/specs/schema-which-command/spec.md +0 -65
  359. package/OpenSpec-main/openspec/changes/archive/2026-02-17-schema-management-cli/tasks.md +0 -67
  360. package/OpenSpec-main/openspec/changes/archive/2026-04-23-add-kimi-cli-skills-only-support/.openspec.yaml +0 -2
  361. package/OpenSpec-main/openspec/changes/archive/2026-04-23-add-kimi-cli-skills-only-support/README.md +0 -3
  362. package/OpenSpec-main/openspec/changes/archive/2026-04-23-add-kimi-cli-skills-only-support/design.md +0 -85
  363. package/OpenSpec-main/openspec/changes/archive/2026-04-23-add-kimi-cli-skills-only-support/proposal.md +0 -38
  364. package/OpenSpec-main/openspec/changes/archive/2026-04-23-add-kimi-cli-skills-only-support/specs/ai-tool-paths/spec.md +0 -12
  365. package/OpenSpec-main/openspec/changes/archive/2026-04-23-add-kimi-cli-skills-only-support/specs/cli-init/spec.md +0 -37
  366. package/OpenSpec-main/openspec/changes/archive/2026-04-23-add-kimi-cli-skills-only-support/tasks.md +0 -22
  367. package/OpenSpec-main/openspec/changes/archive/2026-05-04-workspace-foundation/design.md +0 -208
  368. package/OpenSpec-main/openspec/changes/archive/2026-05-04-workspace-foundation/proposal.md +0 -142
  369. package/OpenSpec-main/openspec/changes/archive/2026-05-04-workspace-foundation/specs/openspec-conventions/spec.md +0 -29
  370. package/OpenSpec-main/openspec/changes/archive/2026-05-04-workspace-foundation/specs/workspace-foundation/spec.md +0 -199
  371. package/OpenSpec-main/openspec/changes/archive/2026-05-04-workspace-foundation/tasks.md +0 -56
  372. package/OpenSpec-main/openspec/changes/archive/2026-05-06-workspace-create-and-register-repos/design.md +0 -356
  373. package/OpenSpec-main/openspec/changes/archive/2026-05-06-workspace-create-and-register-repos/proposal.md +0 -128
  374. package/OpenSpec-main/openspec/changes/archive/2026-05-06-workspace-create-and-register-repos/specs/cli-artifact-workflow/spec.md +0 -24
  375. package/OpenSpec-main/openspec/changes/archive/2026-05-06-workspace-create-and-register-repos/specs/workspace-foundation/spec.md +0 -35
  376. package/OpenSpec-main/openspec/changes/archive/2026-05-06-workspace-create-and-register-repos/specs/workspace-links/spec.md +0 -356
  377. package/OpenSpec-main/openspec/changes/archive/2026-05-06-workspace-create-and-register-repos/tasks.md +0 -121
  378. package/OpenSpec-main/openspec/changes/archive/2026-05-06-workspace-open-agent-context/design.md +0 -266
  379. package/OpenSpec-main/openspec/changes/archive/2026-05-06-workspace-open-agent-context/proposal.md +0 -65
  380. package/OpenSpec-main/openspec/changes/archive/2026-05-06-workspace-open-agent-context/specs/workspace-foundation/spec.md +0 -76
  381. package/OpenSpec-main/openspec/changes/archive/2026-05-06-workspace-open-agent-context/specs/workspace-open/spec.md +0 -199
  382. package/OpenSpec-main/openspec/changes/archive/2026-05-06-workspace-open-agent-context/tasks.md +0 -89
  383. package/OpenSpec-main/openspec/changes/archive/2026-05-14-workspace-change-planning/design.md +0 -242
  384. package/OpenSpec-main/openspec/changes/archive/2026-05-14-workspace-change-planning/proposal.md +0 -78
  385. package/OpenSpec-main/openspec/changes/archive/2026-05-14-workspace-change-planning/specs/artifact-graph/spec.md +0 -36
  386. package/OpenSpec-main/openspec/changes/archive/2026-05-14-workspace-change-planning/specs/change-creation/spec.md +0 -42
  387. package/OpenSpec-main/openspec/changes/archive/2026-05-14-workspace-change-planning/specs/cli-artifact-workflow/spec.md +0 -100
  388. package/OpenSpec-main/openspec/changes/archive/2026-05-14-workspace-change-planning/specs/cli-config/spec.md +0 -55
  389. package/OpenSpec-main/openspec/changes/archive/2026-05-14-workspace-change-planning/specs/cli-update/spec.md +0 -21
  390. package/OpenSpec-main/openspec/changes/archive/2026-05-14-workspace-change-planning/specs/openspec-conventions/spec.md +0 -32
  391. package/OpenSpec-main/openspec/changes/archive/2026-05-14-workspace-change-planning/specs/schema-resolution/spec.md +0 -25
  392. package/OpenSpec-main/openspec/changes/archive/2026-05-14-workspace-change-planning/specs/workspace-change-planning/spec.md +0 -67
  393. package/OpenSpec-main/openspec/changes/archive/2026-05-14-workspace-change-planning/specs/workspace-links/spec.md +0 -163
  394. package/OpenSpec-main/openspec/changes/archive/2026-05-14-workspace-change-planning/tasks.md +0 -133
  395. package/OpenSpec-main/openspec/changes/fix-opencode-commands-directory/.openspec.yaml +0 -2
  396. package/OpenSpec-main/openspec/changes/fix-opencode-commands-directory/design.md +0 -48
  397. package/OpenSpec-main/openspec/changes/fix-opencode-commands-directory/proposal.md +0 -26
  398. package/OpenSpec-main/openspec/changes/fix-opencode-commands-directory/specs/command-generation/spec.md +0 -63
  399. package/OpenSpec-main/openspec/changes/fix-opencode-commands-directory/tasks.md +0 -19
  400. package/OpenSpec-main/openspec/changes/graceful-status-no-changes/.openspec.yaml +0 -2
  401. package/OpenSpec-main/openspec/changes/graceful-status-no-changes/design.md +0 -38
  402. package/OpenSpec-main/openspec/changes/graceful-status-no-changes/proposal.md +0 -25
  403. package/OpenSpec-main/openspec/changes/graceful-status-no-changes/specs/graceful-status-empty/spec.md +0 -27
  404. package/OpenSpec-main/openspec/changes/graceful-status-no-changes/tasks.md +0 -16
  405. package/OpenSpec-main/openspec/changes/schema-alias-support/.openspec.yaml +0 -2
  406. package/OpenSpec-main/openspec/changes/schema-alias-support/proposal.md +0 -28
  407. package/OpenSpec-main/openspec/changes/simplify-skill-installation/.openspec.yaml +0 -2
  408. package/OpenSpec-main/openspec/changes/simplify-skill-installation/design.md +0 -288
  409. package/OpenSpec-main/openspec/changes/simplify-skill-installation/proposal.md +0 -202
  410. package/OpenSpec-main/openspec/changes/simplify-skill-installation/specs/cli-init/spec.md +0 -199
  411. package/OpenSpec-main/openspec/changes/simplify-skill-installation/specs/cli-update/spec.md +0 -177
  412. package/OpenSpec-main/openspec/changes/simplify-skill-installation/specs/profiles/spec.md +0 -142
  413. package/OpenSpec-main/openspec/changes/simplify-skill-installation/specs/propose-workflow/spec.md +0 -42
  414. package/OpenSpec-main/openspec/changes/simplify-skill-installation/tasks.md +0 -132
  415. package/OpenSpec-main/openspec/changes/unify-template-generation-pipeline/.openspec.yaml +0 -2
  416. package/OpenSpec-main/openspec/changes/unify-template-generation-pipeline/design.md +0 -149
  417. package/OpenSpec-main/openspec/changes/unify-template-generation-pipeline/proposal.md +0 -47
  418. package/OpenSpec-main/openspec/changes/unify-template-generation-pipeline/specs/template-artifact-pipeline/spec.md +0 -89
  419. package/OpenSpec-main/openspec/changes/unify-template-generation-pipeline/tasks.md +0 -41
  420. package/OpenSpec-main/openspec/changes/workspace-agent-guidance/.openspec.yaml +0 -2
  421. package/OpenSpec-main/openspec/changes/workspace-agent-guidance/proposal.md +0 -100
  422. package/OpenSpec-main/openspec/changes/workspace-apply-repo-slice/proposal.md +0 -58
  423. package/OpenSpec-main/openspec/changes/workspace-reimplementation-roadmap/HISTORICAL_DIRECTION.md +0 -511
  424. package/OpenSpec-main/openspec/changes/workspace-reimplementation-roadmap/POC_REFERENCE_GUIDE.md +0 -266
  425. package/OpenSpec-main/openspec/changes/workspace-reimplementation-roadmap/README.md +0 -107
  426. package/OpenSpec-main/openspec/changes/workspace-reimplementation-roadmap/START_HERE.md +0 -105
  427. package/OpenSpec-main/openspec/changes/workspace-reimplementation-roadmap/proposal.md +0 -62
  428. package/OpenSpec-main/openspec/changes/workspace-verify-and-archive/proposal.md +0 -57
  429. package/OpenSpec-main/openspec/config.yaml +0 -36
  430. package/OpenSpec-main/openspec/explorations/explore-workflow-ux.md +0 -116
  431. package/OpenSpec-main/openspec/explorations/workspace-architecture.md +0 -857
  432. package/OpenSpec-main/openspec/explorations/workspace-roadmap.md +0 -367
  433. package/OpenSpec-main/openspec/explorations/workspace-user-journeys.md +0 -2259
  434. package/OpenSpec-main/openspec/explorations/workspace-ux-simplification.md +0 -491
  435. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/.initiative.yaml +0 -27
  436. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/README.md +0 -33
  437. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/decisions.md +0 -204
  438. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/direction.md +0 -447
  439. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/questions.md +0 -23
  440. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/roadmap.md +0 -759
  441. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/tasks.md +0 -308
  442. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/01-lock-the-direction/evidence.md +0 -154
  443. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/01-lock-the-direction/plan.md +0 -90
  444. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/01-lock-the-direction/tasks.md +0 -44
  445. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/02-stabilize-workspace-as-local-view/evidence.md +0 -68
  446. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/02-stabilize-workspace-as-local-view/plan.md +0 -80
  447. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/02-stabilize-workspace-as-local-view/tasks.md +0 -23
  448. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/03-add-context-store-foundation/evidence.md +0 -43
  449. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/03-add-context-store-foundation/plan.md +0 -85
  450. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/03-add-context-store-foundation/tasks.md +0 -17
  451. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/04-add-collection-foundation/evidence.md +0 -77
  452. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/04-add-collection-foundation/plan.md +0 -198
  453. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/04-add-collection-foundation/tasks.md +0 -14
  454. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/05-ship-initiative-mvp/evidence.md +0 -99
  455. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/05-ship-initiative-mvp/plan.md +0 -236
  456. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/05-ship-initiative-mvp/tasks.md +0 -21
  457. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/06-add-minimal-context-store-ux/evidence.md +0 -97
  458. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/06-add-minimal-context-store-ux/plan.md +0 -333
  459. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/06-add-minimal-context-store-ux/tasks.md +0 -29
  460. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/07-add-agent-first-initiative-discovery/evidence.md +0 -97
  461. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/07-add-agent-first-initiative-discovery/plan.md +0 -184
  462. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/07-add-agent-first-initiative-discovery/tasks.md +0 -27
  463. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/08-connect-repo-local-changes-to-initiatives/evidence.md +0 -239
  464. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/08-connect-repo-local-changes-to-initiatives/plan.md +0 -279
  465. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/08-connect-repo-local-changes-to-initiatives/tasks.md +0 -22
  466. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/09-add-initiative-resolve/decision-review.md +0 -64
  467. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/09-add-initiative-resolve/evidence.md +0 -106
  468. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/09-add-initiative-resolve/plan.md +0 -141
  469. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/09-add-initiative-resolve/tasks.md +0 -22
  470. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/10-let-workspaces-open-initiatives/plan.md +0 -430
  471. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/10-let-workspaces-open-initiatives/tasks.md +0 -43
  472. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/11-manual-beta-reality-pass/notes.md +0 -289
  473. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/11-manual-beta-reality-pass/plan.md +0 -39
  474. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/11-manual-beta-reality-pass/tasks.md +0 -8
  475. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/12-context-store-first-run-and-cleanup-ux/evidence.md +0 -45
  476. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/12-context-store-first-run-and-cleanup-ux/plan.md +0 -150
  477. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/12-context-store-first-run-and-cleanup-ux/tasks.md +0 -23
  478. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/13-agent-handoff-output-and-delivery-polish/evidence.md +0 -25
  479. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/13-agent-handoff-output-and-delivery-polish/plan.md +0 -98
  480. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/13-agent-handoff-output-and-delivery-polish/tasks.md +0 -25
  481. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/14-workspaces-beta-guide-split/plan.md +0 -37
  482. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/14-workspaces-beta-guide-split/tasks.md +0 -9
  483. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/15-context-store-project-roots-and-schema-led-initiatives/evidence.md +0 -140
  484. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/15-context-store-project-roots-and-schema-led-initiatives/plan.md +0 -344
  485. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/15-context-store-project-roots-and-schema-led-initiatives/tasks.md +0 -39
  486. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/16-add-escalation-ux/plan.md +0 -26
  487. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/16-add-escalation-ux/tasks.md +0 -7
  488. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/17-harden-team-shared-coordination/plan.md +0 -25
  489. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/17-harden-team-shared-coordination/tasks.md +0 -7
  490. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/18-explore-initiative-hosted-target-bound-change-artifacts/evidence.md +0 -397
  491. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/18-explore-initiative-hosted-target-bound-change-artifacts/plan.md +0 -180
  492. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/18-explore-initiative-hosted-target-bound-change-artifacts/tasks.md +0 -28
  493. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/19-review-workspace-beta-compatibility-before-public-release/plan.md +0 -62
  494. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/19-review-workspace-beta-compatibility-before-public-release/tasks.md +0 -16
  495. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/proposed-initiative-next-agent-handoff-ux/evidence.md +0 -47
  496. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/proposed-initiative-next-agent-handoff-ux/plan.md +0 -90
  497. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/proposed-initiative-next-agent-handoff-ux/tasks.md +0 -18
  498. package/OpenSpec-main/openspec/specs/ai-tool-paths/spec.md +0 -63
  499. package/OpenSpec-main/openspec/specs/artifact-graph/spec.md +0 -165
  500. package/OpenSpec-main/openspec/specs/change-creation/spec.md +0 -108
  501. package/OpenSpec-main/openspec/specs/ci-nix-validation/spec.md +0 -107
  502. package/OpenSpec-main/openspec/specs/cli-archive/spec.md +0 -210
  503. package/OpenSpec-main/openspec/specs/cli-artifact-workflow/spec.md +0 -398
  504. package/OpenSpec-main/openspec/specs/cli-change/spec.md +0 -92
  505. package/OpenSpec-main/openspec/specs/cli-completion/spec.md +0 -432
  506. package/OpenSpec-main/openspec/specs/cli-config/spec.md +0 -318
  507. package/OpenSpec-main/openspec/specs/cli-feedback/spec.md +0 -193
  508. package/OpenSpec-main/openspec/specs/cli-init/spec.md +0 -269
  509. package/OpenSpec-main/openspec/specs/cli-list/spec.md +0 -103
  510. package/OpenSpec-main/openspec/specs/cli-show/spec.md +0 -86
  511. package/OpenSpec-main/openspec/specs/cli-spec/spec.md +0 -88
  512. package/OpenSpec-main/openspec/specs/cli-update/spec.md +0 -229
  513. package/OpenSpec-main/openspec/specs/cli-validate/spec.md +0 -219
  514. package/OpenSpec-main/openspec/specs/cli-view/spec.md +0 -129
  515. package/OpenSpec-main/openspec/specs/command-generation/spec.md +0 -97
  516. package/OpenSpec-main/openspec/specs/config-loading/spec.md +0 -122
  517. package/OpenSpec-main/openspec/specs/context-injection/spec.md +0 -53
  518. package/OpenSpec-main/openspec/specs/docs-agent-instructions/spec.md +0 -62
  519. package/OpenSpec-main/openspec/specs/global-config/spec.md +0 -101
  520. package/OpenSpec-main/openspec/specs/instruction-loader/spec.md +0 -70
  521. package/OpenSpec-main/openspec/specs/legacy-cleanup/spec.md +0 -163
  522. package/OpenSpec-main/openspec/specs/openspec-conventions/spec.md +0 -556
  523. package/OpenSpec-main/openspec/specs/opsx-archive-skill/spec.md +0 -128
  524. package/OpenSpec-main/openspec/specs/opsx-onboard-skill/spec.md +0 -167
  525. package/OpenSpec-main/openspec/specs/opsx-verify-skill/spec.md +0 -189
  526. package/OpenSpec-main/openspec/specs/rules-injection/spec.md +0 -102
  527. package/OpenSpec-main/openspec/specs/schema-fork-command/spec.md +0 -71
  528. package/OpenSpec-main/openspec/specs/schema-init-command/spec.md +0 -76
  529. package/OpenSpec-main/openspec/specs/schema-resolution/spec.md +0 -201
  530. package/OpenSpec-main/openspec/specs/schema-validate-command/spec.md +0 -91
  531. package/OpenSpec-main/openspec/specs/schema-which-command/spec.md +0 -70
  532. package/OpenSpec-main/openspec/specs/specs-sync-skill/spec.md +0 -72
  533. package/OpenSpec-main/openspec/specs/telemetry/spec.md +0 -122
  534. package/OpenSpec-main/openspec/specs/workspace-change-planning/spec.md +0 -71
  535. package/OpenSpec-main/openspec/specs/workspace-foundation/spec.md +0 -279
  536. package/OpenSpec-main/openspec/specs/workspace-links/spec.md +0 -529
  537. package/OpenSpec-main/openspec/specs/workspace-open/spec.md +0 -205
  538. package/OpenSpec-main/openspec-parallel-merge-plan.md +0 -98
  539. package/OpenSpec-main/package-lock.json +0 -4978
  540. package/OpenSpec-main/package.json +0 -84
  541. package/OpenSpec-main/pnpm-lock.yaml +0 -3187
  542. package/OpenSpec-main/schemas/spec-driven/schema.yaml +0 -153
  543. package/OpenSpec-main/schemas/spec-driven/templates/design.md +0 -19
  544. package/OpenSpec-main/schemas/spec-driven/templates/proposal.md +0 -23
  545. package/OpenSpec-main/schemas/spec-driven/templates/spec.md +0 -8
  546. package/OpenSpec-main/schemas/spec-driven/templates/tasks.md +0 -9
  547. package/OpenSpec-main/schemas/workspace-planning/schema.yaml +0 -72
  548. package/OpenSpec-main/schemas/workspace-planning/templates/design.md +0 -33
  549. package/OpenSpec-main/schemas/workspace-planning/templates/proposal.md +0 -28
  550. package/OpenSpec-main/schemas/workspace-planning/templates/spec.md +0 -9
  551. package/OpenSpec-main/schemas/workspace-planning/templates/tasks.md +0 -15
  552. package/OpenSpec-main/scripts/README.md +0 -37
  553. package/OpenSpec-main/scripts/pack-version-check.mjs +0 -111
  554. package/OpenSpec-main/scripts/postinstall.js +0 -83
  555. package/OpenSpec-main/scripts/test-postinstall.sh +0 -57
  556. package/OpenSpec-main/scripts/update-flake.sh +0 -128
  557. package/OpenSpec-main/test/cli-e2e/basic.test.ts +0 -205
  558. package/OpenSpec-main/test/commands/artifact-workflow.test.ts +0 -1063
  559. package/OpenSpec-main/test/commands/change-initiative-link.test.ts +0 -532
  560. package/OpenSpec-main/test/commands/change.interactive-show.test.ts +0 -45
  561. package/OpenSpec-main/test/commands/change.interactive-validate.test.ts +0 -48
  562. package/OpenSpec-main/test/commands/completion.test.ts +0 -278
  563. package/OpenSpec-main/test/commands/config-profile.test.ts +0 -532
  564. package/OpenSpec-main/test/commands/config.test.ts +0 -285
  565. package/OpenSpec-main/test/commands/context-store.test.ts +0 -692
  566. package/OpenSpec-main/test/commands/feedback.test.ts +0 -429
  567. package/OpenSpec-main/test/commands/initiative.test.ts +0 -907
  568. package/OpenSpec-main/test/commands/schema.test.ts +0 -467
  569. package/OpenSpec-main/test/commands/show.test.ts +0 -123
  570. package/OpenSpec-main/test/commands/spec.interactive-show.test.ts +0 -44
  571. package/OpenSpec-main/test/commands/spec.interactive-validate.test.ts +0 -44
  572. package/OpenSpec-main/test/commands/spec.test.ts +0 -324
  573. package/OpenSpec-main/test/commands/validate.enriched-output.test.ts +0 -49
  574. package/OpenSpec-main/test/commands/validate.test.ts +0 -147
  575. package/OpenSpec-main/test/commands/workspace-initiative-open.test.ts +0 -638
  576. package/OpenSpec-main/test/commands/workspace-open.test.ts +0 -123
  577. package/OpenSpec-main/test/commands/workspace.interactive.test.ts +0 -696
  578. package/OpenSpec-main/test/commands/workspace.test.ts +0 -1812
  579. package/OpenSpec-main/test/core/archive.test.ts +0 -869
  580. package/OpenSpec-main/test/core/artifact-graph/graph.test.ts +0 -268
  581. package/OpenSpec-main/test/core/artifact-graph/instruction-loader.test.ts +0 -609
  582. package/OpenSpec-main/test/core/artifact-graph/outputs.test.ts +0 -175
  583. package/OpenSpec-main/test/core/artifact-graph/resolver.test.ts +0 -651
  584. package/OpenSpec-main/test/core/artifact-graph/schema.test.ts +0 -207
  585. package/OpenSpec-main/test/core/artifact-graph/state.test.ts +0 -174
  586. package/OpenSpec-main/test/core/artifact-graph/workflow.integration.test.ts +0 -182
  587. package/OpenSpec-main/test/core/available-tools.test.ts +0 -167
  588. package/OpenSpec-main/test/core/collections/initiatives/operations.test.ts +0 -342
  589. package/OpenSpec-main/test/core/collections/initiatives/resolution.test.ts +0 -21
  590. package/OpenSpec-main/test/core/collections/initiatives/schema.test.ts +0 -201
  591. package/OpenSpec-main/test/core/collections/initiatives/templates.test.ts +0 -74
  592. package/OpenSpec-main/test/core/collections/runtime.test.ts +0 -214
  593. package/OpenSpec-main/test/core/command-generation/adapters.test.ts +0 -710
  594. package/OpenSpec-main/test/core/command-generation/generator.test.ts +0 -110
  595. package/OpenSpec-main/test/core/command-generation/registry.test.ts +0 -108
  596. package/OpenSpec-main/test/core/command-generation/types.test.ts +0 -79
  597. package/OpenSpec-main/test/core/commands/change-command.list.test.ts +0 -76
  598. package/OpenSpec-main/test/core/commands/change-command.show-validate.test.ts +0 -111
  599. package/OpenSpec-main/test/core/completions/command-registry.test.ts +0 -201
  600. package/OpenSpec-main/test/core/completions/completion-provider.test.ts +0 -288
  601. package/OpenSpec-main/test/core/completions/generators/bash-generator.test.ts +0 -586
  602. package/OpenSpec-main/test/core/completions/generators/fish-generator.test.ts +0 -549
  603. package/OpenSpec-main/test/core/completions/generators/powershell-generator.test.ts +0 -621
  604. package/OpenSpec-main/test/core/completions/generators/zsh-generator.test.ts +0 -425
  605. package/OpenSpec-main/test/core/completions/installers/bash-installer.test.ts +0 -484
  606. package/OpenSpec-main/test/core/completions/installers/fish-installer.test.ts +0 -321
  607. package/OpenSpec-main/test/core/completions/installers/powershell-installer.test.ts +0 -824
  608. package/OpenSpec-main/test/core/completions/installers/zsh-installer.test.ts +0 -750
  609. package/OpenSpec-main/test/core/config-schema.test.ts +0 -340
  610. package/OpenSpec-main/test/core/context-store/foundation.test.ts +0 -364
  611. package/OpenSpec-main/test/core/context-store/registry.test.ts +0 -599
  612. package/OpenSpec-main/test/core/converters/json-converter.test.ts +0 -184
  613. package/OpenSpec-main/test/core/global-config.test.ts +0 -371
  614. package/OpenSpec-main/test/core/init.test.ts +0 -786
  615. package/OpenSpec-main/test/core/legacy-cleanup.test.ts +0 -1162
  616. package/OpenSpec-main/test/core/list.test.ts +0 -165
  617. package/OpenSpec-main/test/core/migration.test.ts +0 -150
  618. package/OpenSpec-main/test/core/parsers/change-parser.test.ts +0 -52
  619. package/OpenSpec-main/test/core/parsers/markdown-parser.test.ts +0 -355
  620. package/OpenSpec-main/test/core/parsers/requirement-blocks.test.ts +0 -46
  621. package/OpenSpec-main/test/core/planning-home.test.ts +0 -120
  622. package/OpenSpec-main/test/core/profile-sync-drift.test.ts +0 -92
  623. package/OpenSpec-main/test/core/profiles.test.ts +0 -63
  624. package/OpenSpec-main/test/core/project-config.test.ts +0 -610
  625. package/OpenSpec-main/test/core/shared/skill-generation.test.ts +0 -301
  626. package/OpenSpec-main/test/core/shared/tool-detection.test.ts +0 -333
  627. package/OpenSpec-main/test/core/templates/skill-templates-parity.test.ts +0 -172
  628. package/OpenSpec-main/test/core/update.test.ts +0 -1810
  629. package/OpenSpec-main/test/core/validation.enriched-messages.test.ts +0 -74
  630. package/OpenSpec-main/test/core/validation.test.ts +0 -680
  631. package/OpenSpec-main/test/core/view.test.ts +0 -129
  632. package/OpenSpec-main/test/core/workspace/foundation.test.ts +0 -694
  633. package/OpenSpec-main/test/core/workspace/legacy-state.test.ts +0 -221
  634. package/OpenSpec-main/test/core/workspace/skills.test.ts +0 -69
  635. package/OpenSpec-main/test/fixtures/tmp-init/openspec/changes/c1/proposal.md +0 -7
  636. package/OpenSpec-main/test/fixtures/tmp-init/openspec/changes/c1/specs/alpha/spec.md +0 -8
  637. package/OpenSpec-main/test/fixtures/tmp-init/openspec/specs/alpha/spec.md +0 -12
  638. package/OpenSpec-main/test/helpers/path-env.ts +0 -26
  639. package/OpenSpec-main/test/helpers/run-cli.ts +0 -150
  640. package/OpenSpec-main/test/prompts/searchable-multi-select.test.ts +0 -220
  641. package/OpenSpec-main/test/specs/source-specs-normalization.test.ts +0 -63
  642. package/OpenSpec-main/test/telemetry/config.test.ts +0 -298
  643. package/OpenSpec-main/test/telemetry/index.test.ts +0 -219
  644. package/OpenSpec-main/test/utils/change-metadata.test.ts +0 -368
  645. package/OpenSpec-main/test/utils/change-utils.test.ts +0 -201
  646. package/OpenSpec-main/test/utils/command-references.test.ts +0 -83
  647. package/OpenSpec-main/test/utils/file-system.test.ts +0 -322
  648. package/OpenSpec-main/test/utils/interactive.test.ts +0 -125
  649. package/OpenSpec-main/test/utils/marker-updates.test.ts +0 -448
  650. package/OpenSpec-main/test/utils/shell-detection.test.ts +0 -185
  651. package/OpenSpec-main/vitest.config.ts +0 -47
  652. package/OpenSpec-main/vitest.setup.ts +0 -15
  653. package/Scanner CLI Inteligente para Projetos.md +0 -433
@@ -1,869 +0,0 @@
1
- import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
2
- import { ArchiveCommand } from '../../src/core/archive.js';
3
- import { Validator } from '../../src/core/validation/validator.js';
4
- import { promises as fs } from 'fs';
5
- import path from 'path';
6
- import os from 'os';
7
-
8
- // Mock @inquirer/prompts
9
- vi.mock('@inquirer/prompts', () => ({
10
- select: vi.fn(),
11
- confirm: vi.fn()
12
- }));
13
-
14
- describe('ArchiveCommand', () => {
15
- let tempDir: string;
16
- let archiveCommand: ArchiveCommand;
17
- const originalConsoleLog = console.log;
18
-
19
- beforeEach(async () => {
20
- // Create temp directory
21
- tempDir = path.join(os.tmpdir(), `openspec-archive-test-${Date.now()}`);
22
- await fs.mkdir(tempDir, { recursive: true });
23
-
24
- // Change to temp directory
25
- process.chdir(tempDir);
26
-
27
- // Create OpenSpec structure
28
- const openspecDir = path.join(tempDir, 'openspec');
29
- await fs.mkdir(path.join(openspecDir, 'changes'), { recursive: true });
30
- await fs.mkdir(path.join(openspecDir, 'specs'), { recursive: true });
31
- await fs.mkdir(path.join(openspecDir, 'changes', 'archive'), { recursive: true });
32
-
33
- // Suppress console.log during tests
34
- console.log = vi.fn();
35
-
36
- archiveCommand = new ArchiveCommand();
37
- });
38
-
39
- afterEach(async () => {
40
- // Restore console.log
41
- console.log = originalConsoleLog;
42
-
43
- // Clear mocks
44
- vi.clearAllMocks();
45
-
46
- // Clean up temp directory
47
- try {
48
- await fs.rm(tempDir, { recursive: true, force: true });
49
- } catch (error) {
50
- // Ignore cleanup errors
51
- }
52
- });
53
-
54
- describe('execute', () => {
55
- it('should archive a change successfully', async () => {
56
- // Create a test change
57
- const changeName = 'test-feature';
58
- const changeDir = path.join(tempDir, 'openspec', 'changes', changeName);
59
- await fs.mkdir(changeDir, { recursive: true });
60
-
61
- // Create tasks.md with completed tasks
62
- const tasksContent = '- [x] Task 1\n- [x] Task 2';
63
- await fs.writeFile(path.join(changeDir, 'tasks.md'), tasksContent);
64
-
65
- // Execute archive with --yes flag
66
- await archiveCommand.execute(changeName, { yes: true });
67
-
68
- // Check that change was moved to archive
69
- const archiveDir = path.join(tempDir, 'openspec', 'changes', 'archive');
70
- const archives = await fs.readdir(archiveDir);
71
-
72
- expect(archives.length).toBe(1);
73
- expect(archives[0]).toMatch(new RegExp(`\\d{4}-\\d{2}-\\d{2}-${changeName}`));
74
-
75
- // Verify original change directory no longer exists
76
- await expect(fs.access(changeDir)).rejects.toThrow();
77
- });
78
-
79
- it('should warn about incomplete tasks', async () => {
80
- const changeName = 'incomplete-feature';
81
- const changeDir = path.join(tempDir, 'openspec', 'changes', changeName);
82
- await fs.mkdir(changeDir, { recursive: true });
83
-
84
- // Create tasks.md with incomplete tasks
85
- const tasksContent = '- [x] Task 1\n- [ ] Task 2\n- [ ] Task 3';
86
- await fs.writeFile(path.join(changeDir, 'tasks.md'), tasksContent);
87
-
88
- // Execute archive with --yes flag
89
- await archiveCommand.execute(changeName, { yes: true });
90
-
91
- // Verify warning was logged
92
- expect(console.log).toHaveBeenCalledWith(
93
- expect.stringContaining('Warning: 2 incomplete task(s) found')
94
- );
95
- });
96
-
97
- it('should update specs when archiving (delta-based ADDED) and include change name in skeleton', async () => {
98
- const changeName = 'spec-feature';
99
- const changeDir = path.join(tempDir, 'openspec', 'changes', changeName);
100
- const changeSpecDir = path.join(changeDir, 'specs', 'test-capability');
101
- await fs.mkdir(changeSpecDir, { recursive: true });
102
-
103
- // Create delta-based change spec (ADDED requirement)
104
- const specContent = `# Test Capability Spec - Changes
105
-
106
- ## ADDED Requirements
107
-
108
- ### Requirement: The system SHALL provide test capability
109
-
110
- #### Scenario: Basic test
111
- Given a test condition
112
- When an action occurs
113
- Then expected result happens`;
114
- await fs.writeFile(path.join(changeSpecDir, 'spec.md'), specContent);
115
-
116
- // Execute archive with --yes flag and skip validation for speed
117
- await archiveCommand.execute(changeName, { yes: true, noValidate: true });
118
-
119
- // Verify spec was created from skeleton and ADDED requirement applied
120
- const mainSpecPath = path.join(tempDir, 'openspec', 'specs', 'test-capability', 'spec.md');
121
- const updatedContent = await fs.readFile(mainSpecPath, 'utf-8');
122
- expect(updatedContent).toContain('# test-capability Specification');
123
- expect(updatedContent).toContain('## Purpose');
124
- expect(updatedContent).toContain(`created by archiving change ${changeName}`);
125
- expect(updatedContent).toContain('## Requirements');
126
- expect(updatedContent).toContain('### Requirement: The system SHALL provide test capability');
127
- expect(updatedContent).toContain('#### Scenario: Basic test');
128
- });
129
-
130
- it('should allow REMOVED requirements when creating new spec file (issue #403)', async () => {
131
- const changeName = 'new-spec-with-removed';
132
- const changeDir = path.join(tempDir, 'openspec', 'changes', changeName);
133
- const changeSpecDir = path.join(changeDir, 'specs', 'gift-card');
134
- await fs.mkdir(changeSpecDir, { recursive: true });
135
-
136
- // Create delta spec with both ADDED and REMOVED requirements
137
- // This simulates refactoring where old fields are removed and new ones are added
138
- const specContent = `# Gift Card - Changes
139
-
140
- ## ADDED Requirements
141
-
142
- ### Requirement: Logo and Background Color
143
- The system SHALL support logo and backgroundColor fields for gift cards.
144
-
145
- #### Scenario: Display gift card with logo
146
- - **WHEN** a gift card is displayed
147
- - **THEN** it shows the logo and backgroundColor
148
-
149
- ## REMOVED Requirements
150
-
151
- ### Requirement: Image Field
152
- ### Requirement: Thumbnail Field`;
153
- await fs.writeFile(path.join(changeSpecDir, 'spec.md'), specContent);
154
-
155
- // Execute archive - should succeed with warning about REMOVED requirements
156
- await archiveCommand.execute(changeName, { yes: true, noValidate: true });
157
-
158
- // Verify warning was logged about REMOVED requirements being ignored
159
- expect(console.log).toHaveBeenCalledWith(
160
- expect.stringContaining('Warning: gift-card - 2 REMOVED requirement(s) ignored for new spec (nothing to remove).')
161
- );
162
-
163
- // Verify spec was created with only ADDED requirements
164
- const mainSpecPath = path.join(tempDir, 'openspec', 'specs', 'gift-card', 'spec.md');
165
- const updatedContent = await fs.readFile(mainSpecPath, 'utf-8');
166
- expect(updatedContent).toContain('# gift-card Specification');
167
- expect(updatedContent).toContain('### Requirement: Logo and Background Color');
168
- expect(updatedContent).toContain('#### Scenario: Display gift card with logo');
169
- // REMOVED requirements should not be in the final spec
170
- expect(updatedContent).not.toContain('### Requirement: Image Field');
171
- expect(updatedContent).not.toContain('### Requirement: Thumbnail Field');
172
-
173
- // Verify change was archived successfully
174
- const archiveDir = path.join(tempDir, 'openspec', 'changes', 'archive');
175
- const archives = await fs.readdir(archiveDir);
176
- expect(archives.length).toBeGreaterThan(0);
177
- expect(archives.some(a => a.includes(changeName))).toBe(true);
178
- });
179
-
180
- it('should still error on MODIFIED when creating new spec file', async () => {
181
- const changeName = 'new-spec-with-modified';
182
- const changeDir = path.join(tempDir, 'openspec', 'changes', changeName);
183
- const changeSpecDir = path.join(changeDir, 'specs', 'new-capability');
184
- await fs.mkdir(changeSpecDir, { recursive: true });
185
-
186
- // Create delta spec with MODIFIED requirement (should fail for new spec)
187
- const specContent = `# New Capability - Changes
188
-
189
- ## ADDED Requirements
190
-
191
- ### Requirement: New Feature
192
- New feature description.
193
-
194
- ## MODIFIED Requirements
195
-
196
- ### Requirement: Existing Feature
197
- Modified content.`;
198
- await fs.writeFile(path.join(changeSpecDir, 'spec.md'), specContent);
199
-
200
- // Execute archive - should abort with error message (not throw, but log and return)
201
- await archiveCommand.execute(changeName, { yes: true, noValidate: true });
202
-
203
- // Verify error message mentions MODIFIED not allowed for new specs
204
- expect(console.log).toHaveBeenCalledWith(
205
- expect.stringContaining('new-capability: target spec does not exist; only ADDED requirements are allowed for new specs. MODIFIED and RENAMED operations require an existing spec.')
206
- );
207
- expect(console.log).toHaveBeenCalledWith('Aborted. No files were changed.');
208
-
209
- // Verify spec was NOT created
210
- const mainSpecPath = path.join(tempDir, 'openspec', 'specs', 'new-capability', 'spec.md');
211
- await expect(fs.access(mainSpecPath)).rejects.toThrow();
212
-
213
- // Verify change was NOT archived
214
- const archiveDir = path.join(tempDir, 'openspec', 'changes', 'archive');
215
- const archives = await fs.readdir(archiveDir);
216
- expect(archives.some(a => a.includes(changeName))).toBe(false);
217
- });
218
-
219
- it('should still error on RENAMED when creating new spec file', async () => {
220
- const changeName = 'new-spec-with-renamed';
221
- const changeDir = path.join(tempDir, 'openspec', 'changes', changeName);
222
- const changeSpecDir = path.join(changeDir, 'specs', 'another-capability');
223
- await fs.mkdir(changeSpecDir, { recursive: true });
224
-
225
- // Create delta spec with RENAMED requirement (should fail for new spec)
226
- const specContent = `# Another Capability - Changes
227
-
228
- ## ADDED Requirements
229
-
230
- ### Requirement: New Feature
231
- New feature description.
232
-
233
- ## RENAMED Requirements
234
- - FROM: \`### Requirement: Old Name\`
235
- - TO: \`### Requirement: New Name\``;
236
- await fs.writeFile(path.join(changeSpecDir, 'spec.md'), specContent);
237
-
238
- // Execute archive - should abort with error message (not throw, but log and return)
239
- await archiveCommand.execute(changeName, { yes: true, noValidate: true });
240
-
241
- // Verify error message mentions RENAMED not allowed for new specs
242
- expect(console.log).toHaveBeenCalledWith(
243
- expect.stringContaining('another-capability: target spec does not exist; only ADDED requirements are allowed for new specs. MODIFIED and RENAMED operations require an existing spec.')
244
- );
245
- expect(console.log).toHaveBeenCalledWith('Aborted. No files were changed.');
246
-
247
- // Verify spec was NOT created
248
- const mainSpecPath = path.join(tempDir, 'openspec', 'specs', 'another-capability', 'spec.md');
249
- await expect(fs.access(mainSpecPath)).rejects.toThrow();
250
-
251
- // Verify change was NOT archived
252
- const archiveDir = path.join(tempDir, 'openspec', 'changes', 'archive');
253
- const archives = await fs.readdir(archiveDir);
254
- expect(archives.some(a => a.includes(changeName))).toBe(false);
255
- });
256
-
257
- it('should throw error if change does not exist', async () => {
258
- await expect(
259
- archiveCommand.execute('non-existent-change', { yes: true })
260
- ).rejects.toThrow("Change 'non-existent-change' not found.");
261
- });
262
-
263
- it('should throw error if archive already exists', async () => {
264
- const changeName = 'duplicate-feature';
265
- const changeDir = path.join(tempDir, 'openspec', 'changes', changeName);
266
- await fs.mkdir(changeDir, { recursive: true });
267
-
268
- // Create existing archive with same date
269
- const date = new Date().toISOString().split('T')[0];
270
- const archivePath = path.join(tempDir, 'openspec', 'changes', 'archive', `${date}-${changeName}`);
271
- await fs.mkdir(archivePath, { recursive: true });
272
-
273
- // Try to archive
274
- await expect(
275
- archiveCommand.execute(changeName, { yes: true })
276
- ).rejects.toThrow(`Archive '${date}-${changeName}' already exists.`);
277
- });
278
-
279
- it('should handle changes without tasks.md', async () => {
280
- const changeName = 'no-tasks-feature';
281
- const changeDir = path.join(tempDir, 'openspec', 'changes', changeName);
282
- await fs.mkdir(changeDir, { recursive: true });
283
-
284
- // Execute archive without tasks.md
285
- await archiveCommand.execute(changeName, { yes: true });
286
-
287
- // Should complete without warnings
288
- expect(console.log).not.toHaveBeenCalledWith(
289
- expect.stringContaining('incomplete task(s)')
290
- );
291
-
292
- // Verify change was archived
293
- const archiveDir = path.join(tempDir, 'openspec', 'changes', 'archive');
294
- const archives = await fs.readdir(archiveDir);
295
- expect(archives.length).toBe(1);
296
- });
297
-
298
- it('should handle changes without specs', async () => {
299
- const changeName = 'no-specs-feature';
300
- const changeDir = path.join(tempDir, 'openspec', 'changes', changeName);
301
- await fs.mkdir(changeDir, { recursive: true });
302
-
303
- // Execute archive without specs
304
- await archiveCommand.execute(changeName, { yes: true });
305
-
306
- // Should complete without spec updates
307
- expect(console.log).not.toHaveBeenCalledWith(
308
- expect.stringContaining('Specs to update')
309
- );
310
-
311
- // Verify change was archived
312
- const archiveDir = path.join(tempDir, 'openspec', 'changes', 'archive');
313
- const archives = await fs.readdir(archiveDir);
314
- expect(archives.length).toBe(1);
315
- });
316
-
317
- it('should skip spec updates when --skip-specs flag is used', async () => {
318
- const changeName = 'skip-specs-feature';
319
- const changeDir = path.join(tempDir, 'openspec', 'changes', changeName);
320
- const changeSpecDir = path.join(changeDir, 'specs', 'test-capability');
321
- await fs.mkdir(changeSpecDir, { recursive: true });
322
-
323
- // Create spec in change
324
- const specContent = '# Test Capability Spec\n\nTest content';
325
- await fs.writeFile(path.join(changeSpecDir, 'spec.md'), specContent);
326
-
327
- // Execute archive with --skip-specs flag and noValidate to skip validation
328
- await archiveCommand.execute(changeName, { yes: true, skipSpecs: true, noValidate: true });
329
-
330
- // Verify skip message was logged
331
- expect(console.log).toHaveBeenCalledWith(
332
- 'Skipping spec updates (--skip-specs flag provided).'
333
- );
334
-
335
- // Verify spec was NOT copied to main specs
336
- const mainSpecPath = path.join(tempDir, 'openspec', 'specs', 'test-capability', 'spec.md');
337
- await expect(fs.access(mainSpecPath)).rejects.toThrow();
338
-
339
- // Verify change was still archived
340
- const archiveDir = path.join(tempDir, 'openspec', 'changes', 'archive');
341
- const archives = await fs.readdir(archiveDir);
342
- expect(archives.length).toBe(1);
343
- expect(archives[0]).toMatch(new RegExp(`\\d{4}-\\d{2}-\\d{2}-${changeName}`));
344
- });
345
-
346
- it('should skip validation when commander sets validate to false (--no-validate)', async () => {
347
- const changeName = 'skip-validation-flag';
348
- const changeDir = path.join(tempDir, 'openspec', 'changes', changeName);
349
- const changeSpecDir = path.join(changeDir, 'specs', 'unstable-capability');
350
- await fs.mkdir(changeSpecDir, { recursive: true });
351
-
352
- const deltaSpec = `# Unstable Capability
353
-
354
- ## ADDED Requirements
355
-
356
- ### Requirement: Logging Feature
357
- **ID**: REQ-LOG-001
358
-
359
- The system will log all events.
360
-
361
- #### Scenario: Event recorded
362
- - **WHEN** an event occurs
363
- - **THEN** it is captured`;
364
- await fs.writeFile(path.join(changeSpecDir, 'spec.md'), deltaSpec);
365
- await fs.writeFile(path.join(changeDir, 'tasks.md'), '- [x] Task 1\n');
366
-
367
- const deltaSpy = vi.spyOn(Validator.prototype, 'validateChangeDeltaSpecs');
368
- const specContentSpy = vi.spyOn(Validator.prototype, 'validateSpecContent');
369
-
370
- try {
371
- await archiveCommand.execute(changeName, { yes: true, skipSpecs: true, validate: false });
372
-
373
- expect(deltaSpy).not.toHaveBeenCalled();
374
- expect(specContentSpy).not.toHaveBeenCalled();
375
-
376
- const archiveDir = path.join(tempDir, 'openspec', 'changes', 'archive');
377
- const archives = await fs.readdir(archiveDir);
378
- expect(archives.length).toBe(1);
379
- expect(archives[0]).toMatch(new RegExp(`\\d{4}-\\d{2}-\\d{2}-${changeName}`));
380
- } finally {
381
- deltaSpy.mockRestore();
382
- specContentSpy.mockRestore();
383
- }
384
- });
385
-
386
- it('should proceed with archive when user declines spec updates', async () => {
387
- const { confirm } = await import('@inquirer/prompts');
388
- const mockConfirm = confirm as unknown as ReturnType<typeof vi.fn>;
389
-
390
- const changeName = 'decline-specs-feature';
391
- const changeDir = path.join(tempDir, 'openspec', 'changes', changeName);
392
- const changeSpecDir = path.join(changeDir, 'specs', 'test-capability');
393
- await fs.mkdir(changeSpecDir, { recursive: true });
394
-
395
- // Create valid spec in change
396
- const specContent = `# Test Capability Spec
397
-
398
- ## Purpose
399
- This is a test capability specification.
400
-
401
- ## Requirements
402
-
403
- ### The system SHALL provide test capability
404
-
405
- #### Scenario: Basic test
406
- Given a test condition
407
- When an action occurs
408
- Then expected result happens`;
409
- await fs.writeFile(path.join(changeSpecDir, 'spec.md'), specContent);
410
-
411
- // Mock confirm to return false (decline spec updates)
412
- mockConfirm.mockResolvedValueOnce(false);
413
-
414
- // Execute archive without --yes flag
415
- await archiveCommand.execute(changeName);
416
-
417
- // Verify user was prompted about specs
418
- expect(mockConfirm).toHaveBeenCalledWith({
419
- message: 'Proceed with spec updates?',
420
- default: true
421
- });
422
-
423
- // Verify skip message was logged
424
- expect(console.log).toHaveBeenCalledWith(
425
- 'Skipping spec updates. Proceeding with archive.'
426
- );
427
-
428
- // Verify spec was NOT copied to main specs
429
- const mainSpecPath = path.join(tempDir, 'openspec', 'specs', 'test-capability', 'spec.md');
430
- await expect(fs.access(mainSpecPath)).rejects.toThrow();
431
-
432
- // Verify change was still archived
433
- const archiveDir = path.join(tempDir, 'openspec', 'changes', 'archive');
434
- const archives = await fs.readdir(archiveDir);
435
- expect(archives.length).toBe(1);
436
- expect(archives[0]).toMatch(new RegExp(`\\d{4}-\\d{2}-\\d{2}-${changeName}`));
437
- });
438
-
439
- it('should support header trim-only normalization for matching', async () => {
440
- const changeName = 'normalize-headers';
441
- const changeDir = path.join(tempDir, 'openspec', 'changes', changeName);
442
- const changeSpecDir = path.join(changeDir, 'specs', 'alpha');
443
- await fs.mkdir(changeSpecDir, { recursive: true });
444
-
445
- // Create existing main spec with a requirement (no extra trailing spaces)
446
- const mainSpecDir = path.join(tempDir, 'openspec', 'specs', 'alpha');
447
- await fs.mkdir(mainSpecDir, { recursive: true });
448
- const mainContent = `# alpha Specification
449
-
450
- ## Purpose
451
- Alpha purpose.
452
-
453
- ## Requirements
454
-
455
- ### Requirement: Important Rule
456
- Some details.`;
457
- await fs.writeFile(path.join(mainSpecDir, 'spec.md'), mainContent);
458
-
459
- // Change attempts to modify the same requirement but with trailing spaces after the name
460
- const deltaContent = `# Alpha - Changes
461
-
462
- ## MODIFIED Requirements
463
-
464
- ### Requirement: Important Rule
465
- Updated details.`;
466
- await fs.writeFile(path.join(changeSpecDir, 'spec.md'), deltaContent);
467
-
468
- await archiveCommand.execute(changeName, { yes: true, noValidate: true });
469
-
470
- const updated = await fs.readFile(path.join(mainSpecDir, 'spec.md'), 'utf-8');
471
- expect(updated).toContain('### Requirement: Important Rule');
472
- expect(updated).toContain('Updated details.');
473
- });
474
-
475
- it('should apply operations in order: RENAMED → REMOVED → MODIFIED → ADDED', async () => {
476
- const changeName = 'apply-order';
477
- const changeDir = path.join(tempDir, 'openspec', 'changes', changeName);
478
- const changeSpecDir = path.join(changeDir, 'specs', 'beta');
479
- await fs.mkdir(changeSpecDir, { recursive: true });
480
-
481
- // Main spec with two requirements A and B
482
- const mainSpecDir = path.join(tempDir, 'openspec', 'specs', 'beta');
483
- await fs.mkdir(mainSpecDir, { recursive: true });
484
- const mainContent = `# beta Specification
485
-
486
- ## Purpose
487
- Beta purpose.
488
-
489
- ## Requirements
490
-
491
- ### Requirement: A
492
- content A
493
-
494
- ### Requirement: B
495
- content B`;
496
- await fs.writeFile(path.join(mainSpecDir, 'spec.md'), mainContent);
497
-
498
- // Rename A->C, Remove B, Modify C, Add D
499
- const deltaContent = `# Beta - Changes
500
-
501
- ## RENAMED Requirements
502
- - FROM: \`### Requirement: A\`
503
- - TO: \`### Requirement: C\`
504
-
505
- ## REMOVED Requirements
506
- ### Requirement: B
507
-
508
- ## MODIFIED Requirements
509
- ### Requirement: C
510
- updated C
511
-
512
- ## ADDED Requirements
513
- ### Requirement: D
514
- content D`;
515
- await fs.writeFile(path.join(changeSpecDir, 'spec.md'), deltaContent);
516
-
517
- await archiveCommand.execute(changeName, { yes: true, noValidate: true });
518
-
519
- const updated = await fs.readFile(path.join(mainSpecDir, 'spec.md'), 'utf-8');
520
- expect(updated).toContain('### Requirement: C');
521
- expect(updated).toContain('updated C');
522
- expect(updated).toContain('### Requirement: D');
523
- expect(updated).not.toContain('### Requirement: A');
524
- expect(updated).not.toContain('### Requirement: B');
525
- });
526
-
527
- it('should abort with error when MODIFIED/REMOVED reference non-existent requirements', async () => {
528
- const changeName = 'validate-missing';
529
- const changeDir = path.join(tempDir, 'openspec', 'changes', changeName);
530
- const changeSpecDir = path.join(changeDir, 'specs', 'gamma');
531
- await fs.mkdir(changeSpecDir, { recursive: true });
532
-
533
- // Main spec with no requirements
534
- const mainSpecDir = path.join(tempDir, 'openspec', 'specs', 'gamma');
535
- await fs.mkdir(mainSpecDir, { recursive: true });
536
- const mainContent = `# gamma Specification
537
-
538
- ## Purpose
539
- Gamma purpose.
540
-
541
- ## Requirements`;
542
- await fs.writeFile(path.join(mainSpecDir, 'spec.md'), mainContent);
543
-
544
- // Delta tries to modify and remove non-existent requirement
545
- const deltaContent = `# Gamma - Changes
546
-
547
- ## MODIFIED Requirements
548
- ### Requirement: Missing
549
- new text
550
-
551
- ## REMOVED Requirements
552
- ### Requirement: Another Missing`;
553
- await fs.writeFile(path.join(changeSpecDir, 'spec.md'), deltaContent);
554
-
555
- await archiveCommand.execute(changeName, { yes: true, noValidate: true });
556
-
557
- // Should not change the main spec and should not archive the change dir
558
- const still = await fs.readFile(path.join(mainSpecDir, 'spec.md'), 'utf-8');
559
- expect(still).toBe(mainContent);
560
- // Change dir should still exist since operation aborted
561
- await expect(fs.access(changeDir)).resolves.not.toThrow();
562
- });
563
-
564
- it('should abort with a structural error when target spec hides requirements outside ## Requirements', async () => {
565
- const changeName = 'hidden-requirement-target';
566
- const changeDir = path.join(tempDir, 'openspec', 'changes', changeName);
567
- const changeSpecDir = path.join(changeDir, 'specs', 'delta-target');
568
- await fs.mkdir(changeSpecDir, { recursive: true });
569
-
570
- const mainSpecDir = path.join(tempDir, 'openspec', 'specs', 'delta-target');
571
- await fs.mkdir(mainSpecDir, { recursive: true });
572
- const malformedMain = `# delta-target Specification
573
-
574
- ## Purpose
575
- Delta target purpose.
576
-
577
- ## Requirements
578
-
579
- ### Requirement: A
580
- The system SHALL do A.
581
-
582
- #### Scenario: A works
583
- - **WHEN** foo
584
- - **THEN** bar
585
-
586
- ## Edge Cases
587
-
588
- ### Requirement: B
589
- The system SHALL do B.
590
-
591
- #### Scenario: B works
592
- - **WHEN** baz
593
- - **THEN** qux`;
594
- await fs.writeFile(path.join(mainSpecDir, 'spec.md'), malformedMain);
595
-
596
- const deltaContent = `# Delta Target Changes
597
-
598
- ## MODIFIED Requirements
599
-
600
- ### Requirement: B
601
- The system SHALL do B differently.
602
-
603
- #### Scenario: B changes
604
- - **WHEN** baz changes
605
- - **THEN** qux changes`;
606
- await fs.writeFile(path.join(changeSpecDir, 'spec.md'), deltaContent);
607
-
608
- await archiveCommand.execute(changeName, { yes: true, noValidate: true });
609
-
610
- expect(console.log).toHaveBeenCalledWith(
611
- expect.stringContaining('delta-target: target spec is structurally invalid and cannot be updated until fixed:')
612
- );
613
- expect(console.log).toHaveBeenCalledWith(
614
- expect.stringContaining('Requirement header "### Requirement: B" appears outside the main ## Requirements section.')
615
- );
616
- expect(console.log).toHaveBeenCalledWith('Aborted. No files were changed.');
617
-
618
- const still = await fs.readFile(path.join(mainSpecDir, 'spec.md'), 'utf-8');
619
- expect(still).toBe(malformedMain);
620
-
621
- const archiveDir = path.join(tempDir, 'openspec', 'changes', 'archive');
622
- const archives = await fs.readdir(archiveDir);
623
- expect(archives.some(a => a.includes(changeName))).toBe(false);
624
- });
625
-
626
- it('should require MODIFIED to reference the NEW header when a rename exists (error format)', async () => {
627
- const changeName = 'rename-modify-new-header';
628
- const changeDir = path.join(tempDir, 'openspec', 'changes', changeName);
629
- const changeSpecDir = path.join(changeDir, 'specs', 'delta');
630
- await fs.mkdir(changeSpecDir, { recursive: true });
631
-
632
- // Main spec with Old
633
- const mainSpecDir = path.join(tempDir, 'openspec', 'specs', 'delta');
634
- await fs.mkdir(mainSpecDir, { recursive: true });
635
- const mainContent = `# delta Specification
636
-
637
- ## Purpose
638
- Delta purpose.
639
-
640
- ## Requirements
641
-
642
- ### Requirement: Old
643
- old body`;
644
- await fs.writeFile(path.join(mainSpecDir, 'spec.md'), mainContent);
645
-
646
- // Delta: rename Old->New, but MODIFIED references Old (should abort)
647
- const badDelta = `# Delta - Changes
648
-
649
- ## RENAMED Requirements
650
- - FROM: \`### Requirement: Old\`
651
- - TO: \`### Requirement: New\`
652
-
653
- ## MODIFIED Requirements
654
- ### Requirement: Old
655
- new body`;
656
- await fs.writeFile(path.join(changeSpecDir, 'spec.md'), badDelta);
657
-
658
- await archiveCommand.execute(changeName, { yes: true, noValidate: true });
659
- const unchanged = await fs.readFile(path.join(mainSpecDir, 'spec.md'), 'utf-8');
660
- expect(unchanged).toBe(mainContent);
661
- // Assert error message format and abort notice
662
- expect(console.log).toHaveBeenCalledWith(
663
- expect.stringContaining('delta validation failed')
664
- );
665
- expect(console.log).toHaveBeenCalledWith(
666
- expect.stringContaining('Aborted. No files were changed.')
667
- );
668
-
669
- // Fix MODIFIED to reference New (should succeed)
670
- const goodDelta = `# Delta - Changes
671
-
672
- ## RENAMED Requirements
673
- - FROM: \`### Requirement: Old\`
674
- - TO: \`### Requirement: New\`
675
-
676
- ## MODIFIED Requirements
677
- ### Requirement: New
678
- new body`;
679
- await fs.writeFile(path.join(changeSpecDir, 'spec.md'), goodDelta);
680
-
681
- await archiveCommand.execute(changeName, { yes: true, noValidate: true });
682
- const updated = await fs.readFile(path.join(mainSpecDir, 'spec.md'), 'utf-8');
683
- expect(updated).toContain('### Requirement: New');
684
- expect(updated).toContain('new body');
685
- expect(updated).not.toContain('### Requirement: Old');
686
- });
687
-
688
- it('should process multiple specs atomically (any failure aborts all)', async () => {
689
- const changeName = 'multi-spec-atomic';
690
- const changeDir = path.join(tempDir, 'openspec', 'changes', changeName);
691
- const spec1Dir = path.join(changeDir, 'specs', 'epsilon');
692
- const spec2Dir = path.join(changeDir, 'specs', 'zeta');
693
- await fs.mkdir(spec1Dir, { recursive: true });
694
- await fs.mkdir(spec2Dir, { recursive: true });
695
-
696
- // Existing main specs
697
- const epsilonMain = path.join(tempDir, 'openspec', 'specs', 'epsilon', 'spec.md');
698
- await fs.mkdir(path.dirname(epsilonMain), { recursive: true });
699
- await fs.writeFile(epsilonMain, `# epsilon Specification
700
-
701
- ## Purpose
702
- Epsilon purpose.
703
-
704
- ## Requirements
705
-
706
- ### Requirement: E1
707
- e1`);
708
-
709
- const zetaMain = path.join(tempDir, 'openspec', 'specs', 'zeta', 'spec.md');
710
- await fs.mkdir(path.dirname(zetaMain), { recursive: true });
711
- await fs.writeFile(zetaMain, `# zeta Specification
712
-
713
- ## Purpose
714
- Zeta purpose.
715
-
716
- ## Requirements
717
-
718
- ### Requirement: Z1
719
- z1`);
720
-
721
- // Delta: epsilon is valid modification; zeta tries to remove non-existent -> should abort both
722
- await fs.writeFile(path.join(spec1Dir, 'spec.md'), `# Epsilon - Changes
723
-
724
- ## MODIFIED Requirements
725
- ### Requirement: E1
726
- E1 updated`);
727
-
728
- await fs.writeFile(path.join(spec2Dir, 'spec.md'), `# Zeta - Changes
729
-
730
- ## REMOVED Requirements
731
- ### Requirement: Missing`);
732
-
733
- await archiveCommand.execute(changeName, { yes: true, noValidate: true });
734
-
735
- const e1 = await fs.readFile(epsilonMain, 'utf-8');
736
- const z1 = await fs.readFile(zetaMain, 'utf-8');
737
- expect(e1).toContain('### Requirement: E1');
738
- expect(e1).not.toContain('E1 updated');
739
- expect(z1).toContain('### Requirement: Z1');
740
- // changeDir should still exist
741
- await expect(fs.access(changeDir)).resolves.not.toThrow();
742
- });
743
-
744
- it('should display aggregated totals across multiple specs', async () => {
745
- const changeName = 'multi-spec-totals';
746
- const changeDir = path.join(tempDir, 'openspec', 'changes', changeName);
747
- const spec1Dir = path.join(changeDir, 'specs', 'omega');
748
- const spec2Dir = path.join(changeDir, 'specs', 'psi');
749
- await fs.mkdir(spec1Dir, { recursive: true });
750
- await fs.mkdir(spec2Dir, { recursive: true });
751
-
752
- // Existing main specs
753
- const omegaMain = path.join(tempDir, 'openspec', 'specs', 'omega', 'spec.md');
754
- await fs.mkdir(path.dirname(omegaMain), { recursive: true });
755
- await fs.writeFile(omegaMain, `# omega Specification\n\n## Purpose\nOmega purpose.\n\n## Requirements\n\n### Requirement: O1\no1`);
756
-
757
- const psiMain = path.join(tempDir, 'openspec', 'specs', 'psi', 'spec.md');
758
- await fs.mkdir(path.dirname(psiMain), { recursive: true });
759
- await fs.writeFile(psiMain, `# psi Specification\n\n## Purpose\nPsi purpose.\n\n## Requirements\n\n### Requirement: P1\np1`);
760
-
761
- // Deltas: omega add one, psi rename and modify -> totals: +1, ~1, -0, →1
762
- await fs.writeFile(path.join(spec1Dir, 'spec.md'), `# Omega - Changes\n\n## ADDED Requirements\n\n### Requirement: O2\nnew`);
763
- await fs.writeFile(path.join(spec2Dir, 'spec.md'), `# Psi - Changes\n\n## RENAMED Requirements\n- FROM: \`### Requirement: P1\`\n- TO: \`### Requirement: P2\`\n\n## MODIFIED Requirements\n### Requirement: P2\nupdated`);
764
-
765
- await archiveCommand.execute(changeName, { yes: true, noValidate: true });
766
-
767
- // Verify aggregated totals line was printed
768
- expect(console.log).toHaveBeenCalledWith(
769
- expect.stringContaining('Totals: + 1, ~ 1, - 0, → 1')
770
- );
771
- });
772
- });
773
-
774
- describe('error handling', () => {
775
- it('should throw error when openspec directory does not exist', async () => {
776
- // Remove openspec directory
777
- await fs.rm(path.join(tempDir, 'openspec'), { recursive: true });
778
-
779
- await expect(
780
- archiveCommand.execute('any-change', { yes: true })
781
- ).rejects.toThrow("No OpenSpec changes directory found. Run 'openspec init' first.");
782
- });
783
- });
784
-
785
- describe('interactive mode', () => {
786
- it('should use select prompt for change selection', async () => {
787
- const { select } = await import('@inquirer/prompts');
788
- const mockSelect = select as unknown as ReturnType<typeof vi.fn>;
789
-
790
- // Create test changes
791
- const change1 = 'feature-a';
792
- const change2 = 'feature-b';
793
- await fs.mkdir(path.join(tempDir, 'openspec', 'changes', change1), { recursive: true });
794
- await fs.mkdir(path.join(tempDir, 'openspec', 'changes', change2), { recursive: true });
795
-
796
- // Mock select to return first change
797
- mockSelect.mockResolvedValueOnce(change1);
798
-
799
- // Execute without change name
800
- await archiveCommand.execute(undefined, { yes: true });
801
-
802
- // Verify select was called with correct options (values matter, names may include progress)
803
- expect(mockSelect).toHaveBeenCalledWith(expect.objectContaining({
804
- message: 'Select a change to archive',
805
- choices: expect.arrayContaining([
806
- expect.objectContaining({ value: change1 }),
807
- expect.objectContaining({ value: change2 })
808
- ])
809
- }));
810
-
811
- // Verify the selected change was archived
812
- const archiveDir = path.join(tempDir, 'openspec', 'changes', 'archive');
813
- const archives = await fs.readdir(archiveDir);
814
- expect(archives[0]).toContain(change1);
815
- });
816
-
817
- it('should use confirm prompt for task warnings', async () => {
818
- const { confirm } = await import('@inquirer/prompts');
819
- const mockConfirm = confirm as unknown as ReturnType<typeof vi.fn>;
820
-
821
- const changeName = 'incomplete-interactive';
822
- const changeDir = path.join(tempDir, 'openspec', 'changes', changeName);
823
- await fs.mkdir(changeDir, { recursive: true });
824
-
825
- // Create tasks.md with incomplete tasks
826
- const tasksContent = '- [ ] Task 1';
827
- await fs.writeFile(path.join(changeDir, 'tasks.md'), tasksContent);
828
-
829
- // Mock confirm to return true (proceed)
830
- mockConfirm.mockResolvedValueOnce(true);
831
-
832
- // Execute without --yes flag
833
- await archiveCommand.execute(changeName);
834
-
835
- // Verify confirm was called
836
- expect(mockConfirm).toHaveBeenCalledWith({
837
- message: 'Warning: 1 incomplete task(s) found. Continue?',
838
- default: false
839
- });
840
- });
841
-
842
- it('should cancel when user declines task warning', async () => {
843
- const { confirm } = await import('@inquirer/prompts');
844
- const mockConfirm = confirm as unknown as ReturnType<typeof vi.fn>;
845
-
846
- const changeName = 'cancel-test';
847
- const changeDir = path.join(tempDir, 'openspec', 'changes', changeName);
848
- await fs.mkdir(changeDir, { recursive: true });
849
-
850
- // Create tasks.md with incomplete tasks
851
- const tasksContent = '- [ ] Task 1';
852
- await fs.writeFile(path.join(changeDir, 'tasks.md'), tasksContent);
853
-
854
- // Mock confirm to return false (cancel) for validation skip
855
- mockConfirm.mockResolvedValueOnce(false);
856
- // Mock another false for task warning
857
- mockConfirm.mockResolvedValueOnce(false);
858
-
859
- // Execute without --yes flag but skip validation to test task warning
860
- await archiveCommand.execute(changeName, { noValidate: true });
861
-
862
- // Verify archive was cancelled
863
- expect(console.log).toHaveBeenCalledWith('Archive cancelled.');
864
-
865
- // Verify change was not archived
866
- await expect(fs.access(changeDir)).resolves.not.toThrow();
867
- });
868
- });
869
- });