sauron-cli 1.1.3 → 1.3.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 (671) hide show
  1. package/.agents/rules/memory.md +156 -0
  2. package/.agents/skills/wiki/SKILL.md +172 -0
  3. package/.aider.instructions.md +152 -0
  4. package/.cursor/rules/sauron-memory.mdc +157 -0
  5. package/.genesis/prompts/prompt-onboarding-inteligente.md +45 -0
  6. package/.genesis/prompts/prompt-sauron-vs-openspec-arquitetura.md +106 -0
  7. package/.github/workflows/ci.yml +27 -0
  8. package/.sauron/.manifest.json +2 -1
  9. package/.sauron/wiki/history/implementacao-scanner-inteligente.md +29 -0
  10. package/.sauron/wiki/history/reestruturacao-arquitetural-core.md +29 -0
  11. package/.sauron/wiki/history/resiliencia-caminho-templates.md +29 -0
  12. package/.sauron/wiki/standards/typescript.rules.md +21 -0
  13. package/.sauron/wiki/summary.json +81 -0
  14. package/.windsurfrules +160 -0
  15. package/55ea973d-e255-4f08-a313-a5d68243bd2d.png +0 -0
  16. package/Evolu/303/247/303/243o Arquitetural do Sauron CLI.md" +97 -0
  17. package/OpenSpec-main/.actrc +1 -0
  18. package/OpenSpec-main/.changeset/README.md +97 -0
  19. package/OpenSpec-main/.changeset/config.json +15 -0
  20. package/OpenSpec-main/.coderabbit.yaml +11 -0
  21. package/OpenSpec-main/.devcontainer/README.md +92 -0
  22. package/OpenSpec-main/.devcontainer/devcontainer.json +68 -0
  23. package/OpenSpec-main/.github/CODEOWNERS +2 -0
  24. package/OpenSpec-main/.github/workflows/README.md +20 -0
  25. package/OpenSpec-main/.github/workflows/ci.yml +346 -0
  26. package/OpenSpec-main/.github/workflows/release-prepare.yml +60 -0
  27. package/OpenSpec-main/CHANGELOG.md +594 -0
  28. package/OpenSpec-main/LICENSE +22 -0
  29. package/OpenSpec-main/MAINTAINERS.md +17 -0
  30. package/OpenSpec-main/README.md +206 -0
  31. package/OpenSpec-main/README_OLD.md +475 -0
  32. package/OpenSpec-main/assets/openspec_bg.png +0 -0
  33. package/OpenSpec-main/assets/openspec_dashboard.png +0 -0
  34. package/OpenSpec-main/assets/openspec_pixel_dark.svg +89 -0
  35. package/OpenSpec-main/assets/openspec_pixel_light.svg +89 -0
  36. package/OpenSpec-main/bin/openspec.js +5 -0
  37. package/OpenSpec-main/build.js +31 -0
  38. package/OpenSpec-main/eslint.config.js +42 -0
  39. package/OpenSpec-main/flake.lock +27 -0
  40. package/OpenSpec-main/flake.nix +114 -0
  41. package/OpenSpec-main/openspec/changes/IMPLEMENTATION_ORDER.md +68 -0
  42. package/OpenSpec-main/openspec/changes/add-artifact-regeneration-support/proposal.md +136 -0
  43. package/OpenSpec-main/openspec/changes/add-change-stacking-awareness/.openspec.yaml +2 -0
  44. package/OpenSpec-main/openspec/changes/add-change-stacking-awareness/proposal.md +93 -0
  45. package/OpenSpec-main/openspec/changes/add-change-stacking-awareness/specs/change-creation/spec.md +15 -0
  46. package/OpenSpec-main/openspec/changes/add-change-stacking-awareness/specs/change-stacking-workflow/spec.md +65 -0
  47. package/OpenSpec-main/openspec/changes/add-change-stacking-awareness/specs/cli-change/spec.md +27 -0
  48. package/OpenSpec-main/openspec/changes/add-change-stacking-awareness/specs/openspec-conventions/spec.md +29 -0
  49. package/OpenSpec-main/openspec/changes/add-change-stacking-awareness/tasks.md +39 -0
  50. package/OpenSpec-main/openspec/changes/add-global-install-scope/.openspec.yaml +2 -0
  51. package/OpenSpec-main/openspec/changes/add-global-install-scope/design.md +161 -0
  52. package/OpenSpec-main/openspec/changes/add-global-install-scope/proposal.md +101 -0
  53. package/OpenSpec-main/openspec/changes/add-global-install-scope/specs/ai-tool-paths/spec.md +35 -0
  54. package/OpenSpec-main/openspec/changes/add-global-install-scope/specs/cli-config/spec.md +21 -0
  55. package/OpenSpec-main/openspec/changes/add-global-install-scope/specs/cli-init/spec.md +28 -0
  56. package/OpenSpec-main/openspec/changes/add-global-install-scope/specs/cli-update/spec.md +34 -0
  57. package/OpenSpec-main/openspec/changes/add-global-install-scope/specs/command-generation/spec.md +22 -0
  58. package/OpenSpec-main/openspec/changes/add-global-install-scope/specs/global-config/spec.md +24 -0
  59. package/OpenSpec-main/openspec/changes/add-global-install-scope/specs/installation-scope/spec.md +71 -0
  60. package/OpenSpec-main/openspec/changes/add-global-install-scope/tasks.md +61 -0
  61. package/OpenSpec-main/openspec/changes/add-qa-smoke-harness/.openspec.yaml +2 -0
  62. package/OpenSpec-main/openspec/changes/add-qa-smoke-harness/proposal.md +45 -0
  63. package/OpenSpec-main/openspec/changes/add-qa-smoke-harness/specs/developer-qa-workflow/spec.md +49 -0
  64. package/OpenSpec-main/openspec/changes/add-tool-command-surface-capabilities/.openspec.yaml +2 -0
  65. package/OpenSpec-main/openspec/changes/add-tool-command-surface-capabilities/proposal.md +111 -0
  66. package/OpenSpec-main/openspec/changes/add-tool-command-surface-capabilities/specs/cli-init/spec.md +121 -0
  67. package/OpenSpec-main/openspec/changes/add-tool-command-surface-capabilities/specs/cli-update/spec.md +48 -0
  68. package/OpenSpec-main/openspec/changes/add-tool-command-surface-capabilities/tasks.md +53 -0
  69. package/OpenSpec-main/openspec/changes/archive/2025-01-11-add-update-command/design.md +86 -0
  70. package/OpenSpec-main/openspec/changes/archive/2025-01-11-add-update-command/proposal.md +29 -0
  71. package/OpenSpec-main/openspec/changes/archive/2025-01-11-add-update-command/specs/cli-update/spec.md +59 -0
  72. package/OpenSpec-main/openspec/changes/archive/2025-01-11-add-update-command/tasks.md +20 -0
  73. package/OpenSpec-main/openspec/changes/archive/2025-01-13-add-list-command/proposal.md +20 -0
  74. package/OpenSpec-main/openspec/changes/archive/2025-01-13-add-list-command/specs/cli-list/spec.md +69 -0
  75. package/OpenSpec-main/openspec/changes/archive/2025-01-13-add-list-command/tasks.md +26 -0
  76. package/OpenSpec-main/openspec/changes/archive/2025-08-05-initialize-typescript-project/design.md +64 -0
  77. package/OpenSpec-main/openspec/changes/archive/2025-08-05-initialize-typescript-project/proposal.md +18 -0
  78. package/OpenSpec-main/openspec/changes/archive/2025-08-05-initialize-typescript-project/tasks.md +25 -0
  79. package/OpenSpec-main/openspec/changes/archive/2025-08-06-add-init-command/design.md +104 -0
  80. package/OpenSpec-main/openspec/changes/archive/2025-08-06-add-init-command/proposal.md +30 -0
  81. package/OpenSpec-main/openspec/changes/archive/2025-08-06-add-init-command/specs/cli-init/spec.md +148 -0
  82. package/OpenSpec-main/openspec/changes/archive/2025-08-06-add-init-command/tasks.md +38 -0
  83. package/OpenSpec-main/openspec/changes/archive/2025-08-06-adopt-future-state-storage/proposal.md +24 -0
  84. package/OpenSpec-main/openspec/changes/archive/2025-08-06-adopt-future-state-storage/specs/openspec-conventions/spec.md +120 -0
  85. package/OpenSpec-main/openspec/changes/archive/2025-08-06-adopt-future-state-storage/tasks.md +38 -0
  86. package/OpenSpec-main/openspec/changes/archive/2025-08-11-add-complexity-guidelines/proposal.md +13 -0
  87. package/OpenSpec-main/openspec/changes/archive/2025-08-11-add-complexity-guidelines/specs/openspec-docs/README.md +472 -0
  88. package/OpenSpec-main/openspec/changes/archive/2025-08-11-add-complexity-guidelines/tasks.md +9 -0
  89. package/OpenSpec-main/openspec/changes/archive/2025-08-13-add-archive-command/proposal.md +15 -0
  90. package/OpenSpec-main/openspec/changes/archive/2025-08-13-add-archive-command/specs/cli-archive/spec.md +111 -0
  91. package/OpenSpec-main/openspec/changes/archive/2025-08-13-add-archive-command/tasks.md +44 -0
  92. package/OpenSpec-main/openspec/changes/archive/2025-08-13-add-diff-command/proposal.md +19 -0
  93. package/OpenSpec-main/openspec/changes/archive/2025-08-13-add-diff-command/specs/cli-diff/spec.md +77 -0
  94. package/OpenSpec-main/openspec/changes/archive/2025-08-13-add-diff-command/tasks.md +23 -0
  95. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-change-commands/design.md +56 -0
  96. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-change-commands/proposal.md +17 -0
  97. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-change-commands/specs/cli-change/spec.md +48 -0
  98. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-change-commands/specs/cli-list/spec.md +12 -0
  99. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-change-commands/tasks.md +34 -0
  100. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-interactive-show-command/proposal.md +20 -0
  101. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-interactive-show-command/specs/cli-change/spec.md +23 -0
  102. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-interactive-show-command/specs/cli-show/spec.md +83 -0
  103. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-interactive-show-command/specs/cli-spec/spec.md +23 -0
  104. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-interactive-show-command/tasks.md +142 -0
  105. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-skip-specs-archive-option/proposal.md +13 -0
  106. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-skip-specs-archive-option/specs/cli-archive/spec.md +191 -0
  107. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-skip-specs-archive-option/tasks.md +57 -0
  108. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-spec-commands/design.md +45 -0
  109. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-spec-commands/proposal.md +19 -0
  110. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-spec-commands/specs/cli-spec/spec.md +43 -0
  111. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-spec-commands/tasks.md +22 -0
  112. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-zod-validation/design.md +104 -0
  113. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-zod-validation/proposal.md +22 -0
  114. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-zod-validation/specs/cli-archive/spec.md +18 -0
  115. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-zod-validation/specs/cli-diff/spec.md +12 -0
  116. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-zod-validation/tasks.md +59 -0
  117. package/OpenSpec-main/openspec/changes/archive/2025-08-19-adopt-delta-based-changes/proposal.md +93 -0
  118. package/OpenSpec-main/openspec/changes/archive/2025-08-19-adopt-delta-based-changes/specs/cli-archive/spec.md +48 -0
  119. package/OpenSpec-main/openspec/changes/archive/2025-08-19-adopt-delta-based-changes/specs/cli-diff/spec.md +45 -0
  120. package/OpenSpec-main/openspec/changes/archive/2025-08-19-adopt-delta-based-changes/specs/openspec-conventions/spec.md +101 -0
  121. package/OpenSpec-main/openspec/changes/archive/2025-08-19-adopt-delta-based-changes/tasks.md +55 -0
  122. package/OpenSpec-main/openspec/changes/archive/2025-08-19-adopt-verb-noun-cli-structure/design.md +19 -0
  123. package/OpenSpec-main/openspec/changes/archive/2025-08-19-adopt-verb-noun-cli-structure/proposal.md +67 -0
  124. package/OpenSpec-main/openspec/changes/archive/2025-08-19-adopt-verb-noun-cli-structure/specs/cli-list/spec.md +57 -0
  125. package/OpenSpec-main/openspec/changes/archive/2025-08-19-adopt-verb-noun-cli-structure/specs/openspec-conventions/spec.md +23 -0
  126. package/OpenSpec-main/openspec/changes/archive/2025-08-19-adopt-verb-noun-cli-structure/tasks.md +27 -0
  127. package/OpenSpec-main/openspec/changes/archive/2025-08-19-bulk-validation-interactive-selection/proposal.md +20 -0
  128. package/OpenSpec-main/openspec/changes/archive/2025-08-19-bulk-validation-interactive-selection/specs/cli-change/spec.md +22 -0
  129. package/OpenSpec-main/openspec/changes/archive/2025-08-19-bulk-validation-interactive-selection/specs/cli-spec/spec.md +23 -0
  130. package/OpenSpec-main/openspec/changes/archive/2025-08-19-bulk-validation-interactive-selection/specs/cli-validate/spec.md +149 -0
  131. package/OpenSpec-main/openspec/changes/archive/2025-08-19-bulk-validation-interactive-selection/tasks.md +81 -0
  132. package/OpenSpec-main/openspec/changes/archive/2025-08-19-fix-update-tool-selection/proposal.md +40 -0
  133. package/OpenSpec-main/openspec/changes/archive/2025-08-19-fix-update-tool-selection/specs/cli-update/spec.md +23 -0
  134. package/OpenSpec-main/openspec/changes/archive/2025-08-19-fix-update-tool-selection/tasks.md +21 -0
  135. package/OpenSpec-main/openspec/changes/archive/2025-08-19-improve-validate-error-messages/proposal.md +25 -0
  136. package/OpenSpec-main/openspec/changes/archive/2025-08-19-improve-validate-error-messages/specs/cli-validate/spec.md +55 -0
  137. package/OpenSpec-main/openspec/changes/archive/2025-08-19-improve-validate-error-messages/tasks.md +21 -0
  138. package/OpenSpec-main/openspec/changes/archive/2025-08-19-structured-spec-format/proposal.md +36 -0
  139. package/OpenSpec-main/openspec/changes/archive/2025-08-19-structured-spec-format/specs/openspec-conventions/spec.md +192 -0
  140. package/OpenSpec-main/openspec/changes/archive/2025-08-19-structured-spec-format/tasks.md +19 -0
  141. package/OpenSpec-main/openspec/changes/archive/2025-09-12-add-view-dashboard-command/proposal.md +38 -0
  142. package/OpenSpec-main/openspec/changes/archive/2025-09-12-add-view-dashboard-command/specs/cli-view/spec.md +109 -0
  143. package/OpenSpec-main/openspec/changes/archive/2025-09-12-add-view-dashboard-command/tasks.md +47 -0
  144. package/OpenSpec-main/openspec/changes/archive/2025-09-29-add-agents-md-config/proposal.md +28 -0
  145. package/OpenSpec-main/openspec/changes/archive/2025-09-29-add-agents-md-config/specs/cli-init/spec.md +71 -0
  146. package/OpenSpec-main/openspec/changes/archive/2025-09-29-add-agents-md-config/specs/cli-update/spec.md +41 -0
  147. package/OpenSpec-main/openspec/changes/archive/2025-09-29-add-agents-md-config/tasks.md +17 -0
  148. package/OpenSpec-main/openspec/changes/archive/2025-09-29-add-multi-agent-init/proposal.md +35 -0
  149. package/OpenSpec-main/openspec/changes/archive/2025-09-29-add-multi-agent-init/specs/cli-init/spec.md +45 -0
  150. package/OpenSpec-main/openspec/changes/archive/2025-09-29-add-multi-agent-init/tasks.md +16 -0
  151. package/OpenSpec-main/openspec/changes/archive/2025-09-29-add-slash-command-support/proposal.md +119 -0
  152. package/OpenSpec-main/openspec/changes/archive/2025-09-29-add-slash-command-support/specs/cli-init/spec.md +21 -0
  153. package/OpenSpec-main/openspec/changes/archive/2025-09-29-add-slash-command-support/specs/cli-update/spec.md +22 -0
  154. package/OpenSpec-main/openspec/changes/archive/2025-09-29-add-slash-command-support/tasks.md +20 -0
  155. package/OpenSpec-main/openspec/changes/archive/2025-09-29-improve-cli-e2e-plan/proposal.md +19 -0
  156. package/OpenSpec-main/openspec/changes/archive/2025-09-29-improve-cli-e2e-plan/tasks.md +9 -0
  157. package/OpenSpec-main/openspec/changes/archive/2025-09-29-improve-deterministic-tests/proposal.md +78 -0
  158. package/OpenSpec-main/openspec/changes/archive/2025-09-29-improve-deterministic-tests/tasks.md +25 -0
  159. package/OpenSpec-main/openspec/changes/archive/2025-09-29-improve-init-onboarding/proposal.md +13 -0
  160. package/OpenSpec-main/openspec/changes/archive/2025-09-29-improve-init-onboarding/specs/cli-init/spec.md +92 -0
  161. package/OpenSpec-main/openspec/changes/archive/2025-09-29-improve-init-onboarding/tasks.md +12 -0
  162. package/OpenSpec-main/openspec/changes/archive/2025-09-29-remove-diff-command/proposal.md +81 -0
  163. package/OpenSpec-main/openspec/changes/archive/2025-09-29-remove-diff-command/tasks.md +37 -0
  164. package/OpenSpec-main/openspec/changes/archive/2025-09-29-sort-active-changes-by-progress/proposal.md +25 -0
  165. package/OpenSpec-main/openspec/changes/archive/2025-09-29-sort-active-changes-by-progress/specs/cli-view/spec.md +9 -0
  166. package/OpenSpec-main/openspec/changes/archive/2025-09-29-sort-active-changes-by-progress/tasks.md +8 -0
  167. package/OpenSpec-main/openspec/changes/archive/2025-09-29-update-agent-file-name/proposal.md +29 -0
  168. package/OpenSpec-main/openspec/changes/archive/2025-09-29-update-agent-file-name/specs/cli-init/spec.md +40 -0
  169. package/OpenSpec-main/openspec/changes/archive/2025-09-29-update-agent-file-name/specs/cli-update/spec.md +22 -0
  170. package/OpenSpec-main/openspec/changes/archive/2025-09-29-update-agent-file-name/specs/openspec-conventions/spec.md +27 -0
  171. package/OpenSpec-main/openspec/changes/archive/2025-09-29-update-agent-file-name/tasks.md +22 -0
  172. package/OpenSpec-main/openspec/changes/archive/2025-09-29-update-agent-instructions/design.md +130 -0
  173. package/OpenSpec-main/openspec/changes/archive/2025-09-29-update-agent-instructions/proposal.md +117 -0
  174. package/OpenSpec-main/openspec/changes/archive/2025-09-29-update-agent-instructions/tasks.md +69 -0
  175. package/OpenSpec-main/openspec/changes/archive/2025-09-29-update-markdown-parser-crlf/proposal.md +19 -0
  176. package/OpenSpec-main/openspec/changes/archive/2025-09-29-update-markdown-parser-crlf/specs/cli-validate/spec.md +9 -0
  177. package/OpenSpec-main/openspec/changes/archive/2025-09-29-update-markdown-parser-crlf/tasks.md +11 -0
  178. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-codex-slash-command-support/proposal.md +25 -0
  179. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-codex-slash-command-support/specs/cli-init/spec.md +56 -0
  180. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-codex-slash-command-support/specs/cli-update/spec.md +41 -0
  181. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-codex-slash-command-support/tasks.md +19 -0
  182. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-github-copilot-prompts/proposal.md +25 -0
  183. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-github-copilot-prompts/specs/cli-init/spec.md +48 -0
  184. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-github-copilot-prompts/specs/cli-update/spec.md +48 -0
  185. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-github-copilot-prompts/tasks.md +30 -0
  186. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-kilocode-workflows/proposal.md +17 -0
  187. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-kilocode-workflows/specs/cli-init/spec.md +43 -0
  188. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-kilocode-workflows/specs/cli-update/spec.md +27 -0
  189. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-kilocode-workflows/tasks.md +15 -0
  190. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-non-interactive-init-options/proposal.md +12 -0
  191. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-non-interactive-init-options/specs/cli-init/spec.md +39 -0
  192. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-non-interactive-init-options/tasks.md +17 -0
  193. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-windsurf-workflows/proposal.md +17 -0
  194. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-windsurf-workflows/specs/cli-init/spec.md +42 -0
  195. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-windsurf-workflows/specs/cli-update/spec.md +27 -0
  196. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-windsurf-workflows/tasks.md +17 -0
  197. package/OpenSpec-main/openspec/changes/archive/2025-10-14-enhance-validation-error-messages/proposal.md +12 -0
  198. package/OpenSpec-main/openspec/changes/archive/2025-10-14-enhance-validation-error-messages/specs/cli-validate/spec.md +39 -0
  199. package/OpenSpec-main/openspec/changes/archive/2025-10-14-enhance-validation-error-messages/tasks.md +12 -0
  200. package/OpenSpec-main/openspec/changes/archive/2025-10-14-improve-agent-instruction-usability/proposal.md +12 -0
  201. package/OpenSpec-main/openspec/changes/archive/2025-10-14-improve-agent-instruction-usability/specs/docs-agent-instructions/spec.md +33 -0
  202. package/OpenSpec-main/openspec/changes/archive/2025-10-14-improve-agent-instruction-usability/tasks.md +11 -0
  203. package/OpenSpec-main/openspec/changes/archive/2025-10-14-slim-root-agents-file/proposal.md +13 -0
  204. package/OpenSpec-main/openspec/changes/archive/2025-10-14-slim-root-agents-file/tasks.md +15 -0
  205. package/OpenSpec-main/openspec/changes/archive/2025-10-14-update-cli-init-enter-selection/proposal.md +14 -0
  206. package/OpenSpec-main/openspec/changes/archive/2025-10-14-update-cli-init-enter-selection/specs/cli-init/spec.md +10 -0
  207. package/OpenSpec-main/openspec/changes/archive/2025-10-14-update-cli-init-enter-selection/tasks.md +8 -0
  208. package/OpenSpec-main/openspec/changes/archive/2025-10-14-update-cli-init-root-agents/proposal.md +15 -0
  209. package/OpenSpec-main/openspec/changes/archive/2025-10-14-update-cli-init-root-agents/specs/cli-init/spec.md +32 -0
  210. package/OpenSpec-main/openspec/changes/archive/2025-10-14-update-cli-init-root-agents/specs/cli-update/spec.md +10 -0
  211. package/OpenSpec-main/openspec/changes/archive/2025-10-14-update-cli-init-root-agents/tasks.md +11 -0
  212. package/OpenSpec-main/openspec/changes/archive/2025-10-14-update-release-automation/proposal.md +49 -0
  213. package/OpenSpec-main/openspec/changes/archive/2025-10-14-update-release-automation/tasks.md +12 -0
  214. package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-archive-command-arguments/proposal.md +17 -0
  215. package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-archive-command-arguments/specs/cli-update/spec.md +32 -0
  216. package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-archive-command-arguments/tasks.md +15 -0
  217. package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-cline-support/proposal.md +15 -0
  218. package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-cline-support/specs/cli-init/spec.md +97 -0
  219. package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-cline-support/tasks.md +19 -0
  220. package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-crush-support/proposal.md +13 -0
  221. package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-crush-support/specs/cli-init/spec.md +67 -0
  222. package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-crush-support/tasks.md +7 -0
  223. package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-factory-slash-commands/proposal.md +12 -0
  224. package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-factory-slash-commands/specs/cli-init/spec.md +54 -0
  225. package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-factory-slash-commands/specs/cli-update/spec.md +54 -0
  226. package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-factory-slash-commands/tasks.md +11 -0
  227. package/OpenSpec-main/openspec/changes/archive/2025-11-06-add-shell-completions/design.md +525 -0
  228. package/OpenSpec-main/openspec/changes/archive/2025-11-06-add-shell-completions/proposal.md +29 -0
  229. package/OpenSpec-main/openspec/changes/archive/2025-11-06-add-shell-completions/specs/cli-completion/spec.md +300 -0
  230. package/OpenSpec-main/openspec/changes/archive/2025-11-06-add-shell-completions/tasks.md +81 -0
  231. package/OpenSpec-main/openspec/changes/archive/2025-12-20-add-global-config-dir/design.md +105 -0
  232. package/OpenSpec-main/openspec/changes/archive/2025-12-20-add-global-config-dir/proposal.md +20 -0
  233. package/OpenSpec-main/openspec/changes/archive/2025-12-20-add-global-config-dir/specs/global-config/spec.md +76 -0
  234. package/OpenSpec-main/openspec/changes/archive/2025-12-20-add-global-config-dir/tasks.md +26 -0
  235. package/OpenSpec-main/openspec/changes/archive/2025-12-21-add-config-command/design.md +89 -0
  236. package/OpenSpec-main/openspec/changes/archive/2025-12-21-add-config-command/proposal.md +60 -0
  237. package/OpenSpec-main/openspec/changes/archive/2025-12-21-add-config-command/specs/cli-config/spec.md +213 -0
  238. package/OpenSpec-main/openspec/changes/archive/2025-12-21-add-config-command/tasks.md +28 -0
  239. package/OpenSpec-main/openspec/changes/archive/2025-12-23-extend-shell-completions/proposal.md +15 -0
  240. package/OpenSpec-main/openspec/changes/archive/2025-12-23-extend-shell-completions/specs/cli-completion/spec.md +328 -0
  241. package/OpenSpec-main/openspec/changes/archive/2025-12-23-extend-shell-completions/tasks.md +49 -0
  242. package/OpenSpec-main/openspec/changes/archive/2025-12-24-add-artifact-graph-core/design.md +197 -0
  243. package/OpenSpec-main/openspec/changes/archive/2025-12-24-add-artifact-graph-core/proposal.md +18 -0
  244. package/OpenSpec-main/openspec/changes/archive/2025-12-24-add-artifact-graph-core/specs/artifact-graph/spec.md +103 -0
  245. package/OpenSpec-main/openspec/changes/archive/2025-12-24-add-artifact-graph-core/tasks.md +61 -0
  246. package/OpenSpec-main/openspec/changes/archive/2025-12-25-add-change-manager/design.md +74 -0
  247. package/OpenSpec-main/openspec/changes/archive/2025-12-25-add-change-manager/proposal.md +45 -0
  248. package/OpenSpec-main/openspec/changes/archive/2025-12-25-add-change-manager/specs/change-creation/spec.md +63 -0
  249. package/OpenSpec-main/openspec/changes/archive/2025-12-25-add-change-manager/tasks.md +30 -0
  250. package/OpenSpec-main/openspec/changes/archive/2025-12-28-add-artifact-workflow-cli/design.md +112 -0
  251. package/OpenSpec-main/openspec/changes/archive/2025-12-28-add-artifact-workflow-cli/proposal.md +33 -0
  252. package/OpenSpec-main/openspec/changes/archive/2025-12-28-add-artifact-workflow-cli/specs/cli-artifact-workflow/spec.md +153 -0
  253. package/OpenSpec-main/openspec/changes/archive/2025-12-28-add-artifact-workflow-cli/tasks.md +48 -0
  254. package/OpenSpec-main/openspec/changes/archive/2025-12-28-add-instruction-loader/design.md +149 -0
  255. package/OpenSpec-main/openspec/changes/archive/2025-12-28-add-instruction-loader/proposal.md +20 -0
  256. package/OpenSpec-main/openspec/changes/archive/2025-12-28-add-instruction-loader/specs/instruction-loader/spec.md +70 -0
  257. package/OpenSpec-main/openspec/changes/archive/2025-12-28-add-instruction-loader/tasks.md +13 -0
  258. package/OpenSpec-main/openspec/changes/archive/2025-12-28-restructure-schema-directories/design.md +129 -0
  259. package/OpenSpec-main/openspec/changes/archive/2025-12-28-restructure-schema-directories/proposal.md +20 -0
  260. package/OpenSpec-main/openspec/changes/archive/2025-12-28-restructure-schema-directories/specs/artifact-graph/spec.md +49 -0
  261. package/OpenSpec-main/openspec/changes/archive/2025-12-28-restructure-schema-directories/tasks.md +32 -0
  262. package/OpenSpec-main/openspec/changes/archive/2025-12-29-unify-change-state-model/design.md +151 -0
  263. package/OpenSpec-main/openspec/changes/archive/2025-12-29-unify-change-state-model/proposal.md +101 -0
  264. package/OpenSpec-main/openspec/changes/archive/2025-12-29-unify-change-state-model/specs/cli-artifact-workflow/spec.md +109 -0
  265. package/OpenSpec-main/openspec/changes/archive/2025-12-29-unify-change-state-model/specs/cli-view/spec.md +60 -0
  266. package/OpenSpec-main/openspec/changes/archive/2025-12-29-unify-change-state-model/tasks.md +25 -0
  267. package/OpenSpec-main/openspec/changes/archive/2025-12-30-add-antigravity-support/proposal.md +11 -0
  268. package/OpenSpec-main/openspec/changes/archive/2025-12-30-add-antigravity-support/specs/cli-init/spec.md +105 -0
  269. package/OpenSpec-main/openspec/changes/archive/2025-12-30-add-antigravity-support/specs/cli-update/spec.md +92 -0
  270. package/OpenSpec-main/openspec/changes/archive/2025-12-30-add-antigravity-support/tasks.md +12 -0
  271. package/OpenSpec-main/openspec/changes/archive/2025-12-30-fix-cline-workflows-implementation/proposal.md +13 -0
  272. package/OpenSpec-main/openspec/changes/archive/2025-12-30-fix-cline-workflows-implementation/specs/cli-init/spec.md +105 -0
  273. package/OpenSpec-main/openspec/changes/archive/2025-12-30-fix-cline-workflows-implementation/specs/cli-update/spec.md +92 -0
  274. package/OpenSpec-main/openspec/changes/archive/2025-12-30-fix-cline-workflows-implementation/tasks.md +13 -0
  275. package/OpenSpec-main/openspec/changes/archive/2026-01-06-add-agent-schema-selection/proposal.md +26 -0
  276. package/OpenSpec-main/openspec/changes/archive/2026-01-06-add-agent-schema-selection/tasks.md +32 -0
  277. package/OpenSpec-main/openspec/changes/archive/2026-01-06-add-per-change-schema-metadata/design.md +147 -0
  278. package/OpenSpec-main/openspec/changes/archive/2026-01-06-add-per-change-schema-metadata/proposal.md +29 -0
  279. package/OpenSpec-main/openspec/changes/archive/2026-01-06-add-per-change-schema-metadata/specs/cli-artifact-workflow/spec.md +98 -0
  280. package/OpenSpec-main/openspec/changes/archive/2026-01-06-add-per-change-schema-metadata/tasks.md +29 -0
  281. package/OpenSpec-main/openspec/changes/archive/2026-01-06-add-specs-apply-command/.openspec.yaml +2 -0
  282. package/OpenSpec-main/openspec/changes/archive/2026-01-06-add-specs-apply-command/design.md +77 -0
  283. package/OpenSpec-main/openspec/changes/archive/2026-01-06-add-specs-apply-command/proposal.md +32 -0
  284. package/OpenSpec-main/openspec/changes/archive/2026-01-06-add-specs-apply-command/specs/specs-sync-skill/spec.md +67 -0
  285. package/OpenSpec-main/openspec/changes/archive/2026-01-06-add-specs-apply-command/tasks.md +40 -0
  286. package/OpenSpec-main/openspec/changes/archive/2026-01-06-make-apply-instructions-schema-aware/proposal.md +138 -0
  287. package/OpenSpec-main/openspec/changes/archive/2026-01-06-make-apply-instructions-schema-aware/specs/cli-artifact-workflow/spec.md +60 -0
  288. package/OpenSpec-main/openspec/changes/archive/2026-01-06-make-apply-instructions-schema-aware/tasks.md +35 -0
  289. package/OpenSpec-main/openspec/changes/archive/2026-01-06-opsx-archive-command/.openspec.yaml +2 -0
  290. package/OpenSpec-main/openspec/changes/archive/2026-01-06-opsx-archive-command/design.md +84 -0
  291. package/OpenSpec-main/openspec/changes/archive/2026-01-06-opsx-archive-command/proposal.md +28 -0
  292. package/OpenSpec-main/openspec/changes/archive/2026-01-06-opsx-archive-command/specs/opsx-archive-skill/spec.md +122 -0
  293. package/OpenSpec-main/openspec/changes/archive/2026-01-06-opsx-archive-command/tasks.md +23 -0
  294. package/OpenSpec-main/openspec/changes/archive/2026-01-07-add-nix-flake-support/.openspec.yaml +2 -0
  295. package/OpenSpec-main/openspec/changes/archive/2026-01-07-add-nix-flake-support/design.md +94 -0
  296. package/OpenSpec-main/openspec/changes/archive/2026-01-07-add-nix-flake-support/proposal.md +25 -0
  297. package/OpenSpec-main/openspec/changes/archive/2026-01-07-add-nix-flake-support/specs/nix-flake-support/spec.md +79 -0
  298. package/OpenSpec-main/openspec/changes/archive/2026-01-07-add-nix-flake-support/tasks.md +65 -0
  299. package/OpenSpec-main/openspec/changes/archive/2026-01-09-add-flake-update-script/.openspec.yaml +2 -0
  300. package/OpenSpec-main/openspec/changes/archive/2026-01-09-add-flake-update-script/design.md +117 -0
  301. package/OpenSpec-main/openspec/changes/archive/2026-01-09-add-flake-update-script/proposal.md +23 -0
  302. package/OpenSpec-main/openspec/changes/archive/2026-01-09-add-flake-update-script/specs/flake-update-script/spec.md +93 -0
  303. package/OpenSpec-main/openspec/changes/archive/2026-01-09-add-flake-update-script/tasks.md +55 -0
  304. package/OpenSpec-main/openspec/changes/archive/2026-01-09-add-posthog-analytics/.openspec.yaml +2 -0
  305. package/OpenSpec-main/openspec/changes/archive/2026-01-09-add-posthog-analytics/design.md +175 -0
  306. package/OpenSpec-main/openspec/changes/archive/2026-01-09-add-posthog-analytics/proposal.md +37 -0
  307. package/OpenSpec-main/openspec/changes/archive/2026-01-09-add-posthog-analytics/specs/global-config/spec.md +21 -0
  308. package/OpenSpec-main/openspec/changes/archive/2026-01-09-add-posthog-analytics/specs/telemetry/spec.md +116 -0
  309. package/OpenSpec-main/openspec/changes/archive/2026-01-09-add-posthog-analytics/tasks.md +47 -0
  310. package/OpenSpec-main/openspec/changes/archive/2026-01-09-fix-codebuddy-frontmatter-fields/proposal.md +16 -0
  311. package/OpenSpec-main/openspec/changes/archive/2026-01-09-fix-codebuddy-frontmatter-fields/specs/cli-init/spec.md +75 -0
  312. package/OpenSpec-main/openspec/changes/archive/2026-01-09-fix-codebuddy-frontmatter-fields/specs/cli-update/spec.md +56 -0
  313. package/OpenSpec-main/openspec/changes/archive/2026-01-09-fix-codebuddy-frontmatter-fields/tasks.md +6 -0
  314. package/OpenSpec-main/openspec/changes/archive/2026-01-15-add-nix-ci-validation/design.md +206 -0
  315. package/OpenSpec-main/openspec/changes/archive/2026-01-15-add-nix-ci-validation/proposal.md +21 -0
  316. package/OpenSpec-main/openspec/changes/archive/2026-01-15-add-nix-ci-validation/specs/ci-nix-validation/spec.md +104 -0
  317. package/OpenSpec-main/openspec/changes/archive/2026-01-15-add-nix-ci-validation/tasks.md +49 -0
  318. package/OpenSpec-main/openspec/changes/archive/2026-01-30-opencode-command-references/.openspec.yaml +2 -0
  319. package/OpenSpec-main/openspec/changes/archive/2026-01-30-opencode-command-references/README.md +3 -0
  320. package/OpenSpec-main/openspec/changes/archive/2026-01-30-opencode-command-references/design.md +70 -0
  321. package/OpenSpec-main/openspec/changes/archive/2026-01-30-opencode-command-references/proposal.md +32 -0
  322. package/OpenSpec-main/openspec/changes/archive/2026-01-30-opencode-command-references/specs/no-changes.md +9 -0
  323. package/OpenSpec-main/openspec/changes/archive/2026-01-30-opencode-command-references/tasks.md +22 -0
  324. package/OpenSpec-main/openspec/changes/archive/2026-02-17-add-feedback-command/proposal.md +20 -0
  325. package/OpenSpec-main/openspec/changes/archive/2026-02-17-add-feedback-command/specs/cli-feedback/spec.md +188 -0
  326. package/OpenSpec-main/openspec/changes/archive/2026-02-17-add-feedback-command/tasks.md +30 -0
  327. package/OpenSpec-main/openspec/changes/archive/2026-02-17-add-opsx-onboard-skill/.openspec.yaml +2 -0
  328. package/OpenSpec-main/openspec/changes/archive/2026-02-17-add-opsx-onboard-skill/design.md +115 -0
  329. package/OpenSpec-main/openspec/changes/archive/2026-02-17-add-opsx-onboard-skill/proposal.md +27 -0
  330. package/OpenSpec-main/openspec/changes/archive/2026-02-17-add-opsx-onboard-skill/specs/opsx-onboard-skill/spec.md +162 -0
  331. package/OpenSpec-main/openspec/changes/archive/2026-02-17-add-opsx-onboard-skill/tasks.md +21 -0
  332. package/OpenSpec-main/openspec/changes/archive/2026-02-17-add-verify-skill/design.md +96 -0
  333. package/OpenSpec-main/openspec/changes/archive/2026-02-17-add-verify-skill/proposal.md +48 -0
  334. package/OpenSpec-main/openspec/changes/archive/2026-02-17-add-verify-skill/specs/opsx-verify-skill/spec.md +190 -0
  335. package/OpenSpec-main/openspec/changes/archive/2026-02-17-add-verify-skill/tasks.md +15 -0
  336. package/OpenSpec-main/openspec/changes/archive/2026-02-17-merge-init-experimental/.openspec.yaml +2 -0
  337. package/OpenSpec-main/openspec/changes/archive/2026-02-17-merge-init-experimental/design.md +193 -0
  338. package/OpenSpec-main/openspec/changes/archive/2026-02-17-merge-init-experimental/proposal.md +32 -0
  339. package/OpenSpec-main/openspec/changes/archive/2026-02-17-merge-init-experimental/specs/cli-init/spec.md +176 -0
  340. package/OpenSpec-main/openspec/changes/archive/2026-02-17-merge-init-experimental/specs/legacy-cleanup/spec.md +158 -0
  341. package/OpenSpec-main/openspec/changes/archive/2026-02-17-merge-init-experimental/tasks.md +67 -0
  342. package/OpenSpec-main/openspec/changes/archive/2026-02-17-multi-provider-skill-generation/.openspec.yaml +2 -0
  343. package/OpenSpec-main/openspec/changes/archive/2026-02-17-multi-provider-skill-generation/design.md +144 -0
  344. package/OpenSpec-main/openspec/changes/archive/2026-02-17-multi-provider-skill-generation/proposal.md +36 -0
  345. package/OpenSpec-main/openspec/changes/archive/2026-02-17-multi-provider-skill-generation/specs/ai-tool-paths/spec.md +63 -0
  346. package/OpenSpec-main/openspec/changes/archive/2026-02-17-multi-provider-skill-generation/specs/cli-artifact-workflow/spec.md +60 -0
  347. package/OpenSpec-main/openspec/changes/archive/2026-02-17-multi-provider-skill-generation/specs/command-generation/spec.md +98 -0
  348. package/OpenSpec-main/openspec/changes/archive/2026-02-17-multi-provider-skill-generation/tasks.md +55 -0
  349. package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-config/.openspec.yaml +2 -0
  350. package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-config/design.md +665 -0
  351. package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-config/proposal.md +774 -0
  352. package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-config/specs/config-loading/spec.md +119 -0
  353. package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-config/specs/context-injection/spec.md +51 -0
  354. package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-config/specs/rules-injection/spec.md +99 -0
  355. package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-config/specs/schema-resolution/spec.md +83 -0
  356. package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-config/tasks.md +72 -0
  357. package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-local-schemas/.openspec.yaml +2 -0
  358. package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-local-schemas/design.md +117 -0
  359. package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-local-schemas/proposal.md +167 -0
  360. package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-local-schemas/specs/schema-resolution/spec.md +88 -0
  361. package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-local-schemas/tasks.md +28 -0
  362. package/OpenSpec-main/openspec/changes/archive/2026-02-17-schema-management-cli/.openspec.yaml +2 -0
  363. package/OpenSpec-main/openspec/changes/archive/2026-02-17-schema-management-cli/design.md +113 -0
  364. package/OpenSpec-main/openspec/changes/archive/2026-02-17-schema-management-cli/proposal.md +55 -0
  365. package/OpenSpec-main/openspec/changes/archive/2026-02-17-schema-management-cli/specs/schema-fork-command/spec.md +66 -0
  366. package/OpenSpec-main/openspec/changes/archive/2026-02-17-schema-management-cli/specs/schema-init-command/spec.md +71 -0
  367. package/OpenSpec-main/openspec/changes/archive/2026-02-17-schema-management-cli/specs/schema-validate-command/spec.md +86 -0
  368. package/OpenSpec-main/openspec/changes/archive/2026-02-17-schema-management-cli/specs/schema-which-command/spec.md +65 -0
  369. package/OpenSpec-main/openspec/changes/archive/2026-02-17-schema-management-cli/tasks.md +67 -0
  370. package/OpenSpec-main/openspec/changes/archive/2026-04-23-add-kimi-cli-skills-only-support/.openspec.yaml +2 -0
  371. package/OpenSpec-main/openspec/changes/archive/2026-04-23-add-kimi-cli-skills-only-support/README.md +3 -0
  372. package/OpenSpec-main/openspec/changes/archive/2026-04-23-add-kimi-cli-skills-only-support/design.md +85 -0
  373. package/OpenSpec-main/openspec/changes/archive/2026-04-23-add-kimi-cli-skills-only-support/proposal.md +38 -0
  374. package/OpenSpec-main/openspec/changes/archive/2026-04-23-add-kimi-cli-skills-only-support/specs/ai-tool-paths/spec.md +12 -0
  375. package/OpenSpec-main/openspec/changes/archive/2026-04-23-add-kimi-cli-skills-only-support/specs/cli-init/spec.md +37 -0
  376. package/OpenSpec-main/openspec/changes/archive/2026-04-23-add-kimi-cli-skills-only-support/tasks.md +22 -0
  377. package/OpenSpec-main/openspec/changes/archive/2026-05-04-workspace-foundation/design.md +208 -0
  378. package/OpenSpec-main/openspec/changes/archive/2026-05-04-workspace-foundation/proposal.md +142 -0
  379. package/OpenSpec-main/openspec/changes/archive/2026-05-04-workspace-foundation/specs/openspec-conventions/spec.md +29 -0
  380. package/OpenSpec-main/openspec/changes/archive/2026-05-04-workspace-foundation/specs/workspace-foundation/spec.md +199 -0
  381. package/OpenSpec-main/openspec/changes/archive/2026-05-04-workspace-foundation/tasks.md +56 -0
  382. package/OpenSpec-main/openspec/changes/archive/2026-05-06-workspace-create-and-register-repos/design.md +356 -0
  383. package/OpenSpec-main/openspec/changes/archive/2026-05-06-workspace-create-and-register-repos/proposal.md +128 -0
  384. package/OpenSpec-main/openspec/changes/archive/2026-05-06-workspace-create-and-register-repos/specs/cli-artifact-workflow/spec.md +24 -0
  385. package/OpenSpec-main/openspec/changes/archive/2026-05-06-workspace-create-and-register-repos/specs/workspace-foundation/spec.md +35 -0
  386. package/OpenSpec-main/openspec/changes/archive/2026-05-06-workspace-create-and-register-repos/specs/workspace-links/spec.md +356 -0
  387. package/OpenSpec-main/openspec/changes/archive/2026-05-06-workspace-create-and-register-repos/tasks.md +121 -0
  388. package/OpenSpec-main/openspec/changes/archive/2026-05-06-workspace-open-agent-context/design.md +266 -0
  389. package/OpenSpec-main/openspec/changes/archive/2026-05-06-workspace-open-agent-context/proposal.md +65 -0
  390. package/OpenSpec-main/openspec/changes/archive/2026-05-06-workspace-open-agent-context/specs/workspace-foundation/spec.md +76 -0
  391. package/OpenSpec-main/openspec/changes/archive/2026-05-06-workspace-open-agent-context/specs/workspace-open/spec.md +199 -0
  392. package/OpenSpec-main/openspec/changes/archive/2026-05-06-workspace-open-agent-context/tasks.md +89 -0
  393. package/OpenSpec-main/openspec/changes/archive/2026-05-14-workspace-change-planning/design.md +242 -0
  394. package/OpenSpec-main/openspec/changes/archive/2026-05-14-workspace-change-planning/proposal.md +78 -0
  395. package/OpenSpec-main/openspec/changes/archive/2026-05-14-workspace-change-planning/specs/artifact-graph/spec.md +36 -0
  396. package/OpenSpec-main/openspec/changes/archive/2026-05-14-workspace-change-planning/specs/change-creation/spec.md +42 -0
  397. package/OpenSpec-main/openspec/changes/archive/2026-05-14-workspace-change-planning/specs/cli-artifact-workflow/spec.md +100 -0
  398. package/OpenSpec-main/openspec/changes/archive/2026-05-14-workspace-change-planning/specs/cli-config/spec.md +55 -0
  399. package/OpenSpec-main/openspec/changes/archive/2026-05-14-workspace-change-planning/specs/cli-update/spec.md +21 -0
  400. package/OpenSpec-main/openspec/changes/archive/2026-05-14-workspace-change-planning/specs/openspec-conventions/spec.md +32 -0
  401. package/OpenSpec-main/openspec/changes/archive/2026-05-14-workspace-change-planning/specs/schema-resolution/spec.md +25 -0
  402. package/OpenSpec-main/openspec/changes/archive/2026-05-14-workspace-change-planning/specs/workspace-change-planning/spec.md +67 -0
  403. package/OpenSpec-main/openspec/changes/archive/2026-05-14-workspace-change-planning/specs/workspace-links/spec.md +163 -0
  404. package/OpenSpec-main/openspec/changes/archive/2026-05-14-workspace-change-planning/tasks.md +133 -0
  405. package/OpenSpec-main/openspec/changes/fix-opencode-commands-directory/.openspec.yaml +2 -0
  406. package/OpenSpec-main/openspec/changes/fix-opencode-commands-directory/design.md +48 -0
  407. package/OpenSpec-main/openspec/changes/fix-opencode-commands-directory/proposal.md +26 -0
  408. package/OpenSpec-main/openspec/changes/fix-opencode-commands-directory/specs/command-generation/spec.md +63 -0
  409. package/OpenSpec-main/openspec/changes/fix-opencode-commands-directory/tasks.md +19 -0
  410. package/OpenSpec-main/openspec/changes/graceful-status-no-changes/.openspec.yaml +2 -0
  411. package/OpenSpec-main/openspec/changes/graceful-status-no-changes/design.md +38 -0
  412. package/OpenSpec-main/openspec/changes/graceful-status-no-changes/proposal.md +25 -0
  413. package/OpenSpec-main/openspec/changes/graceful-status-no-changes/specs/graceful-status-empty/spec.md +27 -0
  414. package/OpenSpec-main/openspec/changes/graceful-status-no-changes/tasks.md +16 -0
  415. package/OpenSpec-main/openspec/changes/schema-alias-support/.openspec.yaml +2 -0
  416. package/OpenSpec-main/openspec/changes/schema-alias-support/proposal.md +28 -0
  417. package/OpenSpec-main/openspec/changes/simplify-skill-installation/.openspec.yaml +2 -0
  418. package/OpenSpec-main/openspec/changes/simplify-skill-installation/design.md +288 -0
  419. package/OpenSpec-main/openspec/changes/simplify-skill-installation/proposal.md +202 -0
  420. package/OpenSpec-main/openspec/changes/simplify-skill-installation/specs/cli-init/spec.md +199 -0
  421. package/OpenSpec-main/openspec/changes/simplify-skill-installation/specs/cli-update/spec.md +177 -0
  422. package/OpenSpec-main/openspec/changes/simplify-skill-installation/specs/profiles/spec.md +142 -0
  423. package/OpenSpec-main/openspec/changes/simplify-skill-installation/specs/propose-workflow/spec.md +42 -0
  424. package/OpenSpec-main/openspec/changes/simplify-skill-installation/tasks.md +132 -0
  425. package/OpenSpec-main/openspec/changes/unify-template-generation-pipeline/.openspec.yaml +2 -0
  426. package/OpenSpec-main/openspec/changes/unify-template-generation-pipeline/design.md +149 -0
  427. package/OpenSpec-main/openspec/changes/unify-template-generation-pipeline/proposal.md +47 -0
  428. package/OpenSpec-main/openspec/changes/unify-template-generation-pipeline/specs/template-artifact-pipeline/spec.md +89 -0
  429. package/OpenSpec-main/openspec/changes/unify-template-generation-pipeline/tasks.md +41 -0
  430. package/OpenSpec-main/openspec/changes/workspace-agent-guidance/.openspec.yaml +2 -0
  431. package/OpenSpec-main/openspec/changes/workspace-agent-guidance/proposal.md +100 -0
  432. package/OpenSpec-main/openspec/changes/workspace-apply-repo-slice/proposal.md +58 -0
  433. package/OpenSpec-main/openspec/changes/workspace-reimplementation-roadmap/HISTORICAL_DIRECTION.md +511 -0
  434. package/OpenSpec-main/openspec/changes/workspace-reimplementation-roadmap/POC_REFERENCE_GUIDE.md +266 -0
  435. package/OpenSpec-main/openspec/changes/workspace-reimplementation-roadmap/README.md +107 -0
  436. package/OpenSpec-main/openspec/changes/workspace-reimplementation-roadmap/START_HERE.md +105 -0
  437. package/OpenSpec-main/openspec/changes/workspace-reimplementation-roadmap/proposal.md +62 -0
  438. package/OpenSpec-main/openspec/changes/workspace-verify-and-archive/proposal.md +57 -0
  439. package/OpenSpec-main/openspec/config.yaml +36 -0
  440. package/OpenSpec-main/openspec/explorations/explore-workflow-ux.md +116 -0
  441. package/OpenSpec-main/openspec/explorations/workspace-architecture.md +857 -0
  442. package/OpenSpec-main/openspec/explorations/workspace-roadmap.md +367 -0
  443. package/OpenSpec-main/openspec/explorations/workspace-user-journeys.md +2259 -0
  444. package/OpenSpec-main/openspec/explorations/workspace-ux-simplification.md +491 -0
  445. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/.initiative.yaml +27 -0
  446. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/README.md +33 -0
  447. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/decisions.md +204 -0
  448. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/direction.md +447 -0
  449. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/questions.md +23 -0
  450. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/roadmap.md +759 -0
  451. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/tasks.md +308 -0
  452. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/01-lock-the-direction/evidence.md +154 -0
  453. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/01-lock-the-direction/plan.md +90 -0
  454. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/01-lock-the-direction/tasks.md +44 -0
  455. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/02-stabilize-workspace-as-local-view/evidence.md +68 -0
  456. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/02-stabilize-workspace-as-local-view/plan.md +80 -0
  457. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/02-stabilize-workspace-as-local-view/tasks.md +23 -0
  458. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/03-add-context-store-foundation/evidence.md +43 -0
  459. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/03-add-context-store-foundation/plan.md +85 -0
  460. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/03-add-context-store-foundation/tasks.md +17 -0
  461. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/04-add-collection-foundation/evidence.md +77 -0
  462. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/04-add-collection-foundation/plan.md +198 -0
  463. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/04-add-collection-foundation/tasks.md +14 -0
  464. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/05-ship-initiative-mvp/evidence.md +99 -0
  465. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/05-ship-initiative-mvp/plan.md +236 -0
  466. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/05-ship-initiative-mvp/tasks.md +21 -0
  467. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/06-add-minimal-context-store-ux/evidence.md +97 -0
  468. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/06-add-minimal-context-store-ux/plan.md +333 -0
  469. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/06-add-minimal-context-store-ux/tasks.md +29 -0
  470. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/07-add-agent-first-initiative-discovery/evidence.md +97 -0
  471. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/07-add-agent-first-initiative-discovery/plan.md +184 -0
  472. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/07-add-agent-first-initiative-discovery/tasks.md +27 -0
  473. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/08-connect-repo-local-changes-to-initiatives/evidence.md +239 -0
  474. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/08-connect-repo-local-changes-to-initiatives/plan.md +279 -0
  475. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/08-connect-repo-local-changes-to-initiatives/tasks.md +22 -0
  476. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/09-add-initiative-resolve/decision-review.md +64 -0
  477. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/09-add-initiative-resolve/evidence.md +106 -0
  478. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/09-add-initiative-resolve/plan.md +141 -0
  479. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/09-add-initiative-resolve/tasks.md +22 -0
  480. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/10-let-workspaces-open-initiatives/plan.md +430 -0
  481. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/10-let-workspaces-open-initiatives/tasks.md +43 -0
  482. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/11-manual-beta-reality-pass/notes.md +289 -0
  483. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/11-manual-beta-reality-pass/plan.md +39 -0
  484. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/11-manual-beta-reality-pass/tasks.md +8 -0
  485. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/12-context-store-first-run-and-cleanup-ux/evidence.md +45 -0
  486. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/12-context-store-first-run-and-cleanup-ux/plan.md +150 -0
  487. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/12-context-store-first-run-and-cleanup-ux/tasks.md +23 -0
  488. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/13-agent-handoff-output-and-delivery-polish/evidence.md +25 -0
  489. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/13-agent-handoff-output-and-delivery-polish/plan.md +98 -0
  490. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/13-agent-handoff-output-and-delivery-polish/tasks.md +25 -0
  491. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/14-workspaces-beta-guide-split/plan.md +37 -0
  492. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/14-workspaces-beta-guide-split/tasks.md +9 -0
  493. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/15-context-store-project-roots-and-schema-led-initiatives/evidence.md +140 -0
  494. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/15-context-store-project-roots-and-schema-led-initiatives/plan.md +344 -0
  495. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/15-context-store-project-roots-and-schema-led-initiatives/tasks.md +39 -0
  496. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/16-add-escalation-ux/plan.md +26 -0
  497. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/16-add-escalation-ux/tasks.md +7 -0
  498. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/17-harden-team-shared-coordination/plan.md +25 -0
  499. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/17-harden-team-shared-coordination/tasks.md +7 -0
  500. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/18-explore-initiative-hosted-target-bound-change-artifacts/evidence.md +397 -0
  501. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/18-explore-initiative-hosted-target-bound-change-artifacts/plan.md +180 -0
  502. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/18-explore-initiative-hosted-target-bound-change-artifacts/tasks.md +28 -0
  503. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/19-review-workspace-beta-compatibility-before-public-release/plan.md +62 -0
  504. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/19-review-workspace-beta-compatibility-before-public-release/tasks.md +16 -0
  505. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/proposed-initiative-next-agent-handoff-ux/evidence.md +47 -0
  506. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/proposed-initiative-next-agent-handoff-ux/plan.md +90 -0
  507. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/proposed-initiative-next-agent-handoff-ux/tasks.md +18 -0
  508. package/OpenSpec-main/openspec/specs/ai-tool-paths/spec.md +63 -0
  509. package/OpenSpec-main/openspec/specs/artifact-graph/spec.md +165 -0
  510. package/OpenSpec-main/openspec/specs/change-creation/spec.md +108 -0
  511. package/OpenSpec-main/openspec/specs/ci-nix-validation/spec.md +107 -0
  512. package/OpenSpec-main/openspec/specs/cli-archive/spec.md +210 -0
  513. package/OpenSpec-main/openspec/specs/cli-artifact-workflow/spec.md +398 -0
  514. package/OpenSpec-main/openspec/specs/cli-change/spec.md +92 -0
  515. package/OpenSpec-main/openspec/specs/cli-completion/spec.md +432 -0
  516. package/OpenSpec-main/openspec/specs/cli-config/spec.md +318 -0
  517. package/OpenSpec-main/openspec/specs/cli-feedback/spec.md +193 -0
  518. package/OpenSpec-main/openspec/specs/cli-init/spec.md +269 -0
  519. package/OpenSpec-main/openspec/specs/cli-list/spec.md +103 -0
  520. package/OpenSpec-main/openspec/specs/cli-show/spec.md +86 -0
  521. package/OpenSpec-main/openspec/specs/cli-spec/spec.md +88 -0
  522. package/OpenSpec-main/openspec/specs/cli-update/spec.md +229 -0
  523. package/OpenSpec-main/openspec/specs/cli-validate/spec.md +219 -0
  524. package/OpenSpec-main/openspec/specs/cli-view/spec.md +129 -0
  525. package/OpenSpec-main/openspec/specs/command-generation/spec.md +97 -0
  526. package/OpenSpec-main/openspec/specs/config-loading/spec.md +122 -0
  527. package/OpenSpec-main/openspec/specs/context-injection/spec.md +53 -0
  528. package/OpenSpec-main/openspec/specs/docs-agent-instructions/spec.md +62 -0
  529. package/OpenSpec-main/openspec/specs/global-config/spec.md +101 -0
  530. package/OpenSpec-main/openspec/specs/instruction-loader/spec.md +70 -0
  531. package/OpenSpec-main/openspec/specs/legacy-cleanup/spec.md +163 -0
  532. package/OpenSpec-main/openspec/specs/openspec-conventions/spec.md +556 -0
  533. package/OpenSpec-main/openspec/specs/opsx-archive-skill/spec.md +128 -0
  534. package/OpenSpec-main/openspec/specs/opsx-onboard-skill/spec.md +167 -0
  535. package/OpenSpec-main/openspec/specs/opsx-verify-skill/spec.md +189 -0
  536. package/OpenSpec-main/openspec/specs/rules-injection/spec.md +102 -0
  537. package/OpenSpec-main/openspec/specs/schema-fork-command/spec.md +71 -0
  538. package/OpenSpec-main/openspec/specs/schema-init-command/spec.md +76 -0
  539. package/OpenSpec-main/openspec/specs/schema-resolution/spec.md +201 -0
  540. package/OpenSpec-main/openspec/specs/schema-validate-command/spec.md +91 -0
  541. package/OpenSpec-main/openspec/specs/schema-which-command/spec.md +70 -0
  542. package/OpenSpec-main/openspec/specs/specs-sync-skill/spec.md +72 -0
  543. package/OpenSpec-main/openspec/specs/telemetry/spec.md +122 -0
  544. package/OpenSpec-main/openspec/specs/workspace-change-planning/spec.md +71 -0
  545. package/OpenSpec-main/openspec/specs/workspace-foundation/spec.md +279 -0
  546. package/OpenSpec-main/openspec/specs/workspace-links/spec.md +529 -0
  547. package/OpenSpec-main/openspec/specs/workspace-open/spec.md +205 -0
  548. package/OpenSpec-main/openspec-parallel-merge-plan.md +98 -0
  549. package/OpenSpec-main/package-lock.json +4978 -0
  550. package/OpenSpec-main/package.json +84 -0
  551. package/OpenSpec-main/pnpm-lock.yaml +3187 -0
  552. package/OpenSpec-main/schemas/spec-driven/schema.yaml +153 -0
  553. package/OpenSpec-main/schemas/spec-driven/templates/design.md +19 -0
  554. package/OpenSpec-main/schemas/spec-driven/templates/proposal.md +23 -0
  555. package/OpenSpec-main/schemas/spec-driven/templates/spec.md +8 -0
  556. package/OpenSpec-main/schemas/spec-driven/templates/tasks.md +9 -0
  557. package/OpenSpec-main/schemas/workspace-planning/schema.yaml +72 -0
  558. package/OpenSpec-main/schemas/workspace-planning/templates/design.md +33 -0
  559. package/OpenSpec-main/schemas/workspace-planning/templates/proposal.md +28 -0
  560. package/OpenSpec-main/schemas/workspace-planning/templates/spec.md +9 -0
  561. package/OpenSpec-main/schemas/workspace-planning/templates/tasks.md +15 -0
  562. package/OpenSpec-main/scripts/README.md +37 -0
  563. package/OpenSpec-main/scripts/pack-version-check.mjs +111 -0
  564. package/OpenSpec-main/scripts/postinstall.js +83 -0
  565. package/OpenSpec-main/scripts/test-postinstall.sh +57 -0
  566. package/OpenSpec-main/scripts/update-flake.sh +128 -0
  567. package/OpenSpec-main/test/cli-e2e/basic.test.ts +205 -0
  568. package/OpenSpec-main/test/commands/artifact-workflow.test.ts +1063 -0
  569. package/OpenSpec-main/test/commands/change-initiative-link.test.ts +532 -0
  570. package/OpenSpec-main/test/commands/change.interactive-show.test.ts +45 -0
  571. package/OpenSpec-main/test/commands/change.interactive-validate.test.ts +48 -0
  572. package/OpenSpec-main/test/commands/completion.test.ts +278 -0
  573. package/OpenSpec-main/test/commands/config-profile.test.ts +532 -0
  574. package/OpenSpec-main/test/commands/config.test.ts +285 -0
  575. package/OpenSpec-main/test/commands/context-store.test.ts +692 -0
  576. package/OpenSpec-main/test/commands/feedback.test.ts +429 -0
  577. package/OpenSpec-main/test/commands/initiative.test.ts +907 -0
  578. package/OpenSpec-main/test/commands/schema.test.ts +467 -0
  579. package/OpenSpec-main/test/commands/show.test.ts +123 -0
  580. package/OpenSpec-main/test/commands/spec.interactive-show.test.ts +44 -0
  581. package/OpenSpec-main/test/commands/spec.interactive-validate.test.ts +44 -0
  582. package/OpenSpec-main/test/commands/spec.test.ts +324 -0
  583. package/OpenSpec-main/test/commands/validate.enriched-output.test.ts +49 -0
  584. package/OpenSpec-main/test/commands/validate.test.ts +147 -0
  585. package/OpenSpec-main/test/commands/workspace-initiative-open.test.ts +638 -0
  586. package/OpenSpec-main/test/commands/workspace-open.test.ts +123 -0
  587. package/OpenSpec-main/test/commands/workspace.interactive.test.ts +696 -0
  588. package/OpenSpec-main/test/commands/workspace.test.ts +1812 -0
  589. package/OpenSpec-main/test/core/archive.test.ts +869 -0
  590. package/OpenSpec-main/test/core/artifact-graph/graph.test.ts +268 -0
  591. package/OpenSpec-main/test/core/artifact-graph/instruction-loader.test.ts +609 -0
  592. package/OpenSpec-main/test/core/artifact-graph/outputs.test.ts +175 -0
  593. package/OpenSpec-main/test/core/artifact-graph/resolver.test.ts +651 -0
  594. package/OpenSpec-main/test/core/artifact-graph/schema.test.ts +207 -0
  595. package/OpenSpec-main/test/core/artifact-graph/state.test.ts +174 -0
  596. package/OpenSpec-main/test/core/artifact-graph/workflow.integration.test.ts +182 -0
  597. package/OpenSpec-main/test/core/available-tools.test.ts +167 -0
  598. package/OpenSpec-main/test/core/collections/initiatives/operations.test.ts +342 -0
  599. package/OpenSpec-main/test/core/collections/initiatives/resolution.test.ts +21 -0
  600. package/OpenSpec-main/test/core/collections/initiatives/schema.test.ts +201 -0
  601. package/OpenSpec-main/test/core/collections/initiatives/templates.test.ts +74 -0
  602. package/OpenSpec-main/test/core/collections/runtime.test.ts +214 -0
  603. package/OpenSpec-main/test/core/command-generation/adapters.test.ts +710 -0
  604. package/OpenSpec-main/test/core/command-generation/generator.test.ts +110 -0
  605. package/OpenSpec-main/test/core/command-generation/registry.test.ts +108 -0
  606. package/OpenSpec-main/test/core/command-generation/types.test.ts +79 -0
  607. package/OpenSpec-main/test/core/commands/change-command.list.test.ts +76 -0
  608. package/OpenSpec-main/test/core/commands/change-command.show-validate.test.ts +111 -0
  609. package/OpenSpec-main/test/core/completions/command-registry.test.ts +201 -0
  610. package/OpenSpec-main/test/core/completions/completion-provider.test.ts +288 -0
  611. package/OpenSpec-main/test/core/completions/generators/bash-generator.test.ts +586 -0
  612. package/OpenSpec-main/test/core/completions/generators/fish-generator.test.ts +549 -0
  613. package/OpenSpec-main/test/core/completions/generators/powershell-generator.test.ts +621 -0
  614. package/OpenSpec-main/test/core/completions/generators/zsh-generator.test.ts +425 -0
  615. package/OpenSpec-main/test/core/completions/installers/bash-installer.test.ts +484 -0
  616. package/OpenSpec-main/test/core/completions/installers/fish-installer.test.ts +321 -0
  617. package/OpenSpec-main/test/core/completions/installers/powershell-installer.test.ts +824 -0
  618. package/OpenSpec-main/test/core/completions/installers/zsh-installer.test.ts +750 -0
  619. package/OpenSpec-main/test/core/config-schema.test.ts +340 -0
  620. package/OpenSpec-main/test/core/context-store/foundation.test.ts +364 -0
  621. package/OpenSpec-main/test/core/context-store/registry.test.ts +599 -0
  622. package/OpenSpec-main/test/core/converters/json-converter.test.ts +184 -0
  623. package/OpenSpec-main/test/core/global-config.test.ts +371 -0
  624. package/OpenSpec-main/test/core/init.test.ts +786 -0
  625. package/OpenSpec-main/test/core/legacy-cleanup.test.ts +1162 -0
  626. package/OpenSpec-main/test/core/list.test.ts +165 -0
  627. package/OpenSpec-main/test/core/migration.test.ts +150 -0
  628. package/OpenSpec-main/test/core/parsers/change-parser.test.ts +52 -0
  629. package/OpenSpec-main/test/core/parsers/markdown-parser.test.ts +355 -0
  630. package/OpenSpec-main/test/core/parsers/requirement-blocks.test.ts +46 -0
  631. package/OpenSpec-main/test/core/planning-home.test.ts +120 -0
  632. package/OpenSpec-main/test/core/profile-sync-drift.test.ts +92 -0
  633. package/OpenSpec-main/test/core/profiles.test.ts +63 -0
  634. package/OpenSpec-main/test/core/project-config.test.ts +610 -0
  635. package/OpenSpec-main/test/core/shared/skill-generation.test.ts +301 -0
  636. package/OpenSpec-main/test/core/shared/tool-detection.test.ts +333 -0
  637. package/OpenSpec-main/test/core/templates/skill-templates-parity.test.ts +172 -0
  638. package/OpenSpec-main/test/core/update.test.ts +1810 -0
  639. package/OpenSpec-main/test/core/validation.enriched-messages.test.ts +74 -0
  640. package/OpenSpec-main/test/core/validation.test.ts +680 -0
  641. package/OpenSpec-main/test/core/view.test.ts +129 -0
  642. package/OpenSpec-main/test/core/workspace/foundation.test.ts +694 -0
  643. package/OpenSpec-main/test/core/workspace/legacy-state.test.ts +221 -0
  644. package/OpenSpec-main/test/core/workspace/skills.test.ts +69 -0
  645. package/OpenSpec-main/test/fixtures/tmp-init/openspec/changes/c1/proposal.md +7 -0
  646. package/OpenSpec-main/test/fixtures/tmp-init/openspec/changes/c1/specs/alpha/spec.md +8 -0
  647. package/OpenSpec-main/test/fixtures/tmp-init/openspec/specs/alpha/spec.md +12 -0
  648. package/OpenSpec-main/test/helpers/path-env.ts +26 -0
  649. package/OpenSpec-main/test/helpers/run-cli.ts +150 -0
  650. package/OpenSpec-main/test/prompts/searchable-multi-select.test.ts +220 -0
  651. package/OpenSpec-main/test/specs/source-specs-normalization.test.ts +63 -0
  652. package/OpenSpec-main/test/telemetry/config.test.ts +298 -0
  653. package/OpenSpec-main/test/telemetry/index.test.ts +219 -0
  654. package/OpenSpec-main/test/utils/change-metadata.test.ts +368 -0
  655. package/OpenSpec-main/test/utils/change-utils.test.ts +201 -0
  656. package/OpenSpec-main/test/utils/command-references.test.ts +83 -0
  657. package/OpenSpec-main/test/utils/file-system.test.ts +322 -0
  658. package/OpenSpec-main/test/utils/interactive.test.ts +125 -0
  659. package/OpenSpec-main/test/utils/marker-updates.test.ts +448 -0
  660. package/OpenSpec-main/test/utils/shell-detection.test.ts +185 -0
  661. package/OpenSpec-main/vitest.config.ts +47 -0
  662. package/OpenSpec-main/vitest.setup.ts +15 -0
  663. package/README.md +37 -4
  664. package/Scanner CLI Inteligente para Projetos.md +433 -0
  665. package/dist/index.js +1248 -161
  666. package/package.json +1 -1
  667. package/templates/wiki-recipes/nextjs.rules.md +21 -0
  668. package/templates/wiki-recipes/postgresql.rules.md +20 -0
  669. package/templates/wiki-recipes/react.rules.md +18 -0
  670. package/templates/wiki-recipes/tailwindcss.rules.md +18 -0
  671. package/templates/wiki-recipes/typescript.rules.md +21 -0
@@ -0,0 +1,869 @@
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
+ });