sauron-cli 1.3.0 → 1.4.1

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 (655) hide show
  1. package/.genesis/prompts/CLI Init_ Atualiza/303/247/303/243o com Mem/303/263ria.md" +133 -0
  2. package/.genesis/prompts/prompt-sauron-update-intelligence.md +20 -0
  3. package/README.md +4 -2
  4. package/dist/index.js +59 -15
  5. package/package.json +1 -1
  6. package/templates/.agents/rules/memory.md +68 -68
  7. package/templates/.agents/skills/wiki/SKILL.md +14 -14
  8. package/55ea973d-e255-4f08-a313-a5d68243bd2d.png +0 -0
  9. package/OpenSpec-main/.actrc +0 -1
  10. package/OpenSpec-main/.changeset/README.md +0 -97
  11. package/OpenSpec-main/.changeset/config.json +0 -15
  12. package/OpenSpec-main/.coderabbit.yaml +0 -11
  13. package/OpenSpec-main/.devcontainer/README.md +0 -92
  14. package/OpenSpec-main/.devcontainer/devcontainer.json +0 -68
  15. package/OpenSpec-main/.github/CODEOWNERS +0 -2
  16. package/OpenSpec-main/.github/workflows/README.md +0 -20
  17. package/OpenSpec-main/.github/workflows/ci.yml +0 -346
  18. package/OpenSpec-main/.github/workflows/release-prepare.yml +0 -60
  19. package/OpenSpec-main/CHANGELOG.md +0 -594
  20. package/OpenSpec-main/LICENSE +0 -22
  21. package/OpenSpec-main/MAINTAINERS.md +0 -17
  22. package/OpenSpec-main/README.md +0 -206
  23. package/OpenSpec-main/README_OLD.md +0 -475
  24. package/OpenSpec-main/assets/openspec_bg.png +0 -0
  25. package/OpenSpec-main/assets/openspec_dashboard.png +0 -0
  26. package/OpenSpec-main/assets/openspec_pixel_dark.svg +0 -89
  27. package/OpenSpec-main/assets/openspec_pixel_light.svg +0 -89
  28. package/OpenSpec-main/bin/openspec.js +0 -5
  29. package/OpenSpec-main/build.js +0 -31
  30. package/OpenSpec-main/eslint.config.js +0 -42
  31. package/OpenSpec-main/flake.lock +0 -27
  32. package/OpenSpec-main/flake.nix +0 -114
  33. package/OpenSpec-main/openspec/changes/IMPLEMENTATION_ORDER.md +0 -68
  34. package/OpenSpec-main/openspec/changes/add-artifact-regeneration-support/proposal.md +0 -136
  35. package/OpenSpec-main/openspec/changes/add-change-stacking-awareness/.openspec.yaml +0 -2
  36. package/OpenSpec-main/openspec/changes/add-change-stacking-awareness/proposal.md +0 -93
  37. package/OpenSpec-main/openspec/changes/add-change-stacking-awareness/specs/change-creation/spec.md +0 -15
  38. package/OpenSpec-main/openspec/changes/add-change-stacking-awareness/specs/change-stacking-workflow/spec.md +0 -65
  39. package/OpenSpec-main/openspec/changes/add-change-stacking-awareness/specs/cli-change/spec.md +0 -27
  40. package/OpenSpec-main/openspec/changes/add-change-stacking-awareness/specs/openspec-conventions/spec.md +0 -29
  41. package/OpenSpec-main/openspec/changes/add-change-stacking-awareness/tasks.md +0 -39
  42. package/OpenSpec-main/openspec/changes/add-global-install-scope/.openspec.yaml +0 -2
  43. package/OpenSpec-main/openspec/changes/add-global-install-scope/design.md +0 -161
  44. package/OpenSpec-main/openspec/changes/add-global-install-scope/proposal.md +0 -101
  45. package/OpenSpec-main/openspec/changes/add-global-install-scope/specs/ai-tool-paths/spec.md +0 -35
  46. package/OpenSpec-main/openspec/changes/add-global-install-scope/specs/cli-config/spec.md +0 -21
  47. package/OpenSpec-main/openspec/changes/add-global-install-scope/specs/cli-init/spec.md +0 -28
  48. package/OpenSpec-main/openspec/changes/add-global-install-scope/specs/cli-update/spec.md +0 -34
  49. package/OpenSpec-main/openspec/changes/add-global-install-scope/specs/command-generation/spec.md +0 -22
  50. package/OpenSpec-main/openspec/changes/add-global-install-scope/specs/global-config/spec.md +0 -24
  51. package/OpenSpec-main/openspec/changes/add-global-install-scope/specs/installation-scope/spec.md +0 -71
  52. package/OpenSpec-main/openspec/changes/add-global-install-scope/tasks.md +0 -61
  53. package/OpenSpec-main/openspec/changes/add-qa-smoke-harness/.openspec.yaml +0 -2
  54. package/OpenSpec-main/openspec/changes/add-qa-smoke-harness/proposal.md +0 -45
  55. package/OpenSpec-main/openspec/changes/add-qa-smoke-harness/specs/developer-qa-workflow/spec.md +0 -49
  56. package/OpenSpec-main/openspec/changes/add-tool-command-surface-capabilities/.openspec.yaml +0 -2
  57. package/OpenSpec-main/openspec/changes/add-tool-command-surface-capabilities/proposal.md +0 -111
  58. package/OpenSpec-main/openspec/changes/add-tool-command-surface-capabilities/specs/cli-init/spec.md +0 -121
  59. package/OpenSpec-main/openspec/changes/add-tool-command-surface-capabilities/specs/cli-update/spec.md +0 -48
  60. package/OpenSpec-main/openspec/changes/add-tool-command-surface-capabilities/tasks.md +0 -53
  61. package/OpenSpec-main/openspec/changes/archive/2025-01-11-add-update-command/design.md +0 -86
  62. package/OpenSpec-main/openspec/changes/archive/2025-01-11-add-update-command/proposal.md +0 -29
  63. package/OpenSpec-main/openspec/changes/archive/2025-01-11-add-update-command/specs/cli-update/spec.md +0 -59
  64. package/OpenSpec-main/openspec/changes/archive/2025-01-11-add-update-command/tasks.md +0 -20
  65. package/OpenSpec-main/openspec/changes/archive/2025-01-13-add-list-command/proposal.md +0 -20
  66. package/OpenSpec-main/openspec/changes/archive/2025-01-13-add-list-command/specs/cli-list/spec.md +0 -69
  67. package/OpenSpec-main/openspec/changes/archive/2025-01-13-add-list-command/tasks.md +0 -26
  68. package/OpenSpec-main/openspec/changes/archive/2025-08-05-initialize-typescript-project/design.md +0 -64
  69. package/OpenSpec-main/openspec/changes/archive/2025-08-05-initialize-typescript-project/proposal.md +0 -18
  70. package/OpenSpec-main/openspec/changes/archive/2025-08-05-initialize-typescript-project/tasks.md +0 -25
  71. package/OpenSpec-main/openspec/changes/archive/2025-08-06-add-init-command/design.md +0 -104
  72. package/OpenSpec-main/openspec/changes/archive/2025-08-06-add-init-command/proposal.md +0 -30
  73. package/OpenSpec-main/openspec/changes/archive/2025-08-06-add-init-command/specs/cli-init/spec.md +0 -148
  74. package/OpenSpec-main/openspec/changes/archive/2025-08-06-add-init-command/tasks.md +0 -38
  75. package/OpenSpec-main/openspec/changes/archive/2025-08-06-adopt-future-state-storage/proposal.md +0 -24
  76. package/OpenSpec-main/openspec/changes/archive/2025-08-06-adopt-future-state-storage/specs/openspec-conventions/spec.md +0 -120
  77. package/OpenSpec-main/openspec/changes/archive/2025-08-06-adopt-future-state-storage/tasks.md +0 -38
  78. package/OpenSpec-main/openspec/changes/archive/2025-08-11-add-complexity-guidelines/proposal.md +0 -13
  79. package/OpenSpec-main/openspec/changes/archive/2025-08-11-add-complexity-guidelines/specs/openspec-docs/README.md +0 -472
  80. package/OpenSpec-main/openspec/changes/archive/2025-08-11-add-complexity-guidelines/tasks.md +0 -9
  81. package/OpenSpec-main/openspec/changes/archive/2025-08-13-add-archive-command/proposal.md +0 -15
  82. package/OpenSpec-main/openspec/changes/archive/2025-08-13-add-archive-command/specs/cli-archive/spec.md +0 -111
  83. package/OpenSpec-main/openspec/changes/archive/2025-08-13-add-archive-command/tasks.md +0 -44
  84. package/OpenSpec-main/openspec/changes/archive/2025-08-13-add-diff-command/proposal.md +0 -19
  85. package/OpenSpec-main/openspec/changes/archive/2025-08-13-add-diff-command/specs/cli-diff/spec.md +0 -77
  86. package/OpenSpec-main/openspec/changes/archive/2025-08-13-add-diff-command/tasks.md +0 -23
  87. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-change-commands/design.md +0 -56
  88. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-change-commands/proposal.md +0 -17
  89. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-change-commands/specs/cli-change/spec.md +0 -48
  90. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-change-commands/specs/cli-list/spec.md +0 -12
  91. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-change-commands/tasks.md +0 -34
  92. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-interactive-show-command/proposal.md +0 -20
  93. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-interactive-show-command/specs/cli-change/spec.md +0 -23
  94. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-interactive-show-command/specs/cli-show/spec.md +0 -83
  95. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-interactive-show-command/specs/cli-spec/spec.md +0 -23
  96. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-interactive-show-command/tasks.md +0 -142
  97. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-skip-specs-archive-option/proposal.md +0 -13
  98. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-skip-specs-archive-option/specs/cli-archive/spec.md +0 -191
  99. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-skip-specs-archive-option/tasks.md +0 -57
  100. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-spec-commands/design.md +0 -45
  101. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-spec-commands/proposal.md +0 -19
  102. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-spec-commands/specs/cli-spec/spec.md +0 -43
  103. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-spec-commands/tasks.md +0 -22
  104. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-zod-validation/design.md +0 -104
  105. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-zod-validation/proposal.md +0 -22
  106. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-zod-validation/specs/cli-archive/spec.md +0 -18
  107. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-zod-validation/specs/cli-diff/spec.md +0 -12
  108. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-zod-validation/tasks.md +0 -59
  109. package/OpenSpec-main/openspec/changes/archive/2025-08-19-adopt-delta-based-changes/proposal.md +0 -93
  110. package/OpenSpec-main/openspec/changes/archive/2025-08-19-adopt-delta-based-changes/specs/cli-archive/spec.md +0 -48
  111. package/OpenSpec-main/openspec/changes/archive/2025-08-19-adopt-delta-based-changes/specs/cli-diff/spec.md +0 -45
  112. package/OpenSpec-main/openspec/changes/archive/2025-08-19-adopt-delta-based-changes/specs/openspec-conventions/spec.md +0 -101
  113. package/OpenSpec-main/openspec/changes/archive/2025-08-19-adopt-delta-based-changes/tasks.md +0 -55
  114. package/OpenSpec-main/openspec/changes/archive/2025-08-19-adopt-verb-noun-cli-structure/design.md +0 -19
  115. package/OpenSpec-main/openspec/changes/archive/2025-08-19-adopt-verb-noun-cli-structure/proposal.md +0 -67
  116. package/OpenSpec-main/openspec/changes/archive/2025-08-19-adopt-verb-noun-cli-structure/specs/cli-list/spec.md +0 -57
  117. package/OpenSpec-main/openspec/changes/archive/2025-08-19-adopt-verb-noun-cli-structure/specs/openspec-conventions/spec.md +0 -23
  118. package/OpenSpec-main/openspec/changes/archive/2025-08-19-adopt-verb-noun-cli-structure/tasks.md +0 -27
  119. package/OpenSpec-main/openspec/changes/archive/2025-08-19-bulk-validation-interactive-selection/proposal.md +0 -20
  120. package/OpenSpec-main/openspec/changes/archive/2025-08-19-bulk-validation-interactive-selection/specs/cli-change/spec.md +0 -22
  121. package/OpenSpec-main/openspec/changes/archive/2025-08-19-bulk-validation-interactive-selection/specs/cli-spec/spec.md +0 -23
  122. package/OpenSpec-main/openspec/changes/archive/2025-08-19-bulk-validation-interactive-selection/specs/cli-validate/spec.md +0 -149
  123. package/OpenSpec-main/openspec/changes/archive/2025-08-19-bulk-validation-interactive-selection/tasks.md +0 -81
  124. package/OpenSpec-main/openspec/changes/archive/2025-08-19-fix-update-tool-selection/proposal.md +0 -40
  125. package/OpenSpec-main/openspec/changes/archive/2025-08-19-fix-update-tool-selection/specs/cli-update/spec.md +0 -23
  126. package/OpenSpec-main/openspec/changes/archive/2025-08-19-fix-update-tool-selection/tasks.md +0 -21
  127. package/OpenSpec-main/openspec/changes/archive/2025-08-19-improve-validate-error-messages/proposal.md +0 -25
  128. package/OpenSpec-main/openspec/changes/archive/2025-08-19-improve-validate-error-messages/specs/cli-validate/spec.md +0 -55
  129. package/OpenSpec-main/openspec/changes/archive/2025-08-19-improve-validate-error-messages/tasks.md +0 -21
  130. package/OpenSpec-main/openspec/changes/archive/2025-08-19-structured-spec-format/proposal.md +0 -36
  131. package/OpenSpec-main/openspec/changes/archive/2025-08-19-structured-spec-format/specs/openspec-conventions/spec.md +0 -192
  132. package/OpenSpec-main/openspec/changes/archive/2025-08-19-structured-spec-format/tasks.md +0 -19
  133. package/OpenSpec-main/openspec/changes/archive/2025-09-12-add-view-dashboard-command/proposal.md +0 -38
  134. package/OpenSpec-main/openspec/changes/archive/2025-09-12-add-view-dashboard-command/specs/cli-view/spec.md +0 -109
  135. package/OpenSpec-main/openspec/changes/archive/2025-09-12-add-view-dashboard-command/tasks.md +0 -47
  136. package/OpenSpec-main/openspec/changes/archive/2025-09-29-add-agents-md-config/proposal.md +0 -28
  137. package/OpenSpec-main/openspec/changes/archive/2025-09-29-add-agents-md-config/specs/cli-init/spec.md +0 -71
  138. package/OpenSpec-main/openspec/changes/archive/2025-09-29-add-agents-md-config/specs/cli-update/spec.md +0 -41
  139. package/OpenSpec-main/openspec/changes/archive/2025-09-29-add-agents-md-config/tasks.md +0 -17
  140. package/OpenSpec-main/openspec/changes/archive/2025-09-29-add-multi-agent-init/proposal.md +0 -35
  141. package/OpenSpec-main/openspec/changes/archive/2025-09-29-add-multi-agent-init/specs/cli-init/spec.md +0 -45
  142. package/OpenSpec-main/openspec/changes/archive/2025-09-29-add-multi-agent-init/tasks.md +0 -16
  143. package/OpenSpec-main/openspec/changes/archive/2025-09-29-add-slash-command-support/proposal.md +0 -119
  144. package/OpenSpec-main/openspec/changes/archive/2025-09-29-add-slash-command-support/specs/cli-init/spec.md +0 -21
  145. package/OpenSpec-main/openspec/changes/archive/2025-09-29-add-slash-command-support/specs/cli-update/spec.md +0 -22
  146. package/OpenSpec-main/openspec/changes/archive/2025-09-29-add-slash-command-support/tasks.md +0 -20
  147. package/OpenSpec-main/openspec/changes/archive/2025-09-29-improve-cli-e2e-plan/proposal.md +0 -19
  148. package/OpenSpec-main/openspec/changes/archive/2025-09-29-improve-cli-e2e-plan/tasks.md +0 -9
  149. package/OpenSpec-main/openspec/changes/archive/2025-09-29-improve-deterministic-tests/proposal.md +0 -78
  150. package/OpenSpec-main/openspec/changes/archive/2025-09-29-improve-deterministic-tests/tasks.md +0 -25
  151. package/OpenSpec-main/openspec/changes/archive/2025-09-29-improve-init-onboarding/proposal.md +0 -13
  152. package/OpenSpec-main/openspec/changes/archive/2025-09-29-improve-init-onboarding/specs/cli-init/spec.md +0 -92
  153. package/OpenSpec-main/openspec/changes/archive/2025-09-29-improve-init-onboarding/tasks.md +0 -12
  154. package/OpenSpec-main/openspec/changes/archive/2025-09-29-remove-diff-command/proposal.md +0 -81
  155. package/OpenSpec-main/openspec/changes/archive/2025-09-29-remove-diff-command/tasks.md +0 -37
  156. package/OpenSpec-main/openspec/changes/archive/2025-09-29-sort-active-changes-by-progress/proposal.md +0 -25
  157. package/OpenSpec-main/openspec/changes/archive/2025-09-29-sort-active-changes-by-progress/specs/cli-view/spec.md +0 -9
  158. package/OpenSpec-main/openspec/changes/archive/2025-09-29-sort-active-changes-by-progress/tasks.md +0 -8
  159. package/OpenSpec-main/openspec/changes/archive/2025-09-29-update-agent-file-name/proposal.md +0 -29
  160. package/OpenSpec-main/openspec/changes/archive/2025-09-29-update-agent-file-name/specs/cli-init/spec.md +0 -40
  161. package/OpenSpec-main/openspec/changes/archive/2025-09-29-update-agent-file-name/specs/cli-update/spec.md +0 -22
  162. package/OpenSpec-main/openspec/changes/archive/2025-09-29-update-agent-file-name/specs/openspec-conventions/spec.md +0 -27
  163. package/OpenSpec-main/openspec/changes/archive/2025-09-29-update-agent-file-name/tasks.md +0 -22
  164. package/OpenSpec-main/openspec/changes/archive/2025-09-29-update-agent-instructions/design.md +0 -130
  165. package/OpenSpec-main/openspec/changes/archive/2025-09-29-update-agent-instructions/proposal.md +0 -117
  166. package/OpenSpec-main/openspec/changes/archive/2025-09-29-update-agent-instructions/tasks.md +0 -69
  167. package/OpenSpec-main/openspec/changes/archive/2025-09-29-update-markdown-parser-crlf/proposal.md +0 -19
  168. package/OpenSpec-main/openspec/changes/archive/2025-09-29-update-markdown-parser-crlf/specs/cli-validate/spec.md +0 -9
  169. package/OpenSpec-main/openspec/changes/archive/2025-09-29-update-markdown-parser-crlf/tasks.md +0 -11
  170. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-codex-slash-command-support/proposal.md +0 -25
  171. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-codex-slash-command-support/specs/cli-init/spec.md +0 -56
  172. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-codex-slash-command-support/specs/cli-update/spec.md +0 -41
  173. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-codex-slash-command-support/tasks.md +0 -19
  174. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-github-copilot-prompts/proposal.md +0 -25
  175. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-github-copilot-prompts/specs/cli-init/spec.md +0 -48
  176. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-github-copilot-prompts/specs/cli-update/spec.md +0 -48
  177. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-github-copilot-prompts/tasks.md +0 -30
  178. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-kilocode-workflows/proposal.md +0 -17
  179. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-kilocode-workflows/specs/cli-init/spec.md +0 -43
  180. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-kilocode-workflows/specs/cli-update/spec.md +0 -27
  181. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-kilocode-workflows/tasks.md +0 -15
  182. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-non-interactive-init-options/proposal.md +0 -12
  183. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-non-interactive-init-options/specs/cli-init/spec.md +0 -39
  184. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-non-interactive-init-options/tasks.md +0 -17
  185. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-windsurf-workflows/proposal.md +0 -17
  186. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-windsurf-workflows/specs/cli-init/spec.md +0 -42
  187. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-windsurf-workflows/specs/cli-update/spec.md +0 -27
  188. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-windsurf-workflows/tasks.md +0 -17
  189. package/OpenSpec-main/openspec/changes/archive/2025-10-14-enhance-validation-error-messages/proposal.md +0 -12
  190. package/OpenSpec-main/openspec/changes/archive/2025-10-14-enhance-validation-error-messages/specs/cli-validate/spec.md +0 -39
  191. package/OpenSpec-main/openspec/changes/archive/2025-10-14-enhance-validation-error-messages/tasks.md +0 -12
  192. package/OpenSpec-main/openspec/changes/archive/2025-10-14-improve-agent-instruction-usability/proposal.md +0 -12
  193. package/OpenSpec-main/openspec/changes/archive/2025-10-14-improve-agent-instruction-usability/specs/docs-agent-instructions/spec.md +0 -33
  194. package/OpenSpec-main/openspec/changes/archive/2025-10-14-improve-agent-instruction-usability/tasks.md +0 -11
  195. package/OpenSpec-main/openspec/changes/archive/2025-10-14-slim-root-agents-file/proposal.md +0 -13
  196. package/OpenSpec-main/openspec/changes/archive/2025-10-14-slim-root-agents-file/tasks.md +0 -15
  197. package/OpenSpec-main/openspec/changes/archive/2025-10-14-update-cli-init-enter-selection/proposal.md +0 -14
  198. package/OpenSpec-main/openspec/changes/archive/2025-10-14-update-cli-init-enter-selection/specs/cli-init/spec.md +0 -10
  199. package/OpenSpec-main/openspec/changes/archive/2025-10-14-update-cli-init-enter-selection/tasks.md +0 -8
  200. package/OpenSpec-main/openspec/changes/archive/2025-10-14-update-cli-init-root-agents/proposal.md +0 -15
  201. package/OpenSpec-main/openspec/changes/archive/2025-10-14-update-cli-init-root-agents/specs/cli-init/spec.md +0 -32
  202. package/OpenSpec-main/openspec/changes/archive/2025-10-14-update-cli-init-root-agents/specs/cli-update/spec.md +0 -10
  203. package/OpenSpec-main/openspec/changes/archive/2025-10-14-update-cli-init-root-agents/tasks.md +0 -11
  204. package/OpenSpec-main/openspec/changes/archive/2025-10-14-update-release-automation/proposal.md +0 -49
  205. package/OpenSpec-main/openspec/changes/archive/2025-10-14-update-release-automation/tasks.md +0 -12
  206. package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-archive-command-arguments/proposal.md +0 -17
  207. package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-archive-command-arguments/specs/cli-update/spec.md +0 -32
  208. package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-archive-command-arguments/tasks.md +0 -15
  209. package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-cline-support/proposal.md +0 -15
  210. package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-cline-support/specs/cli-init/spec.md +0 -97
  211. package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-cline-support/tasks.md +0 -19
  212. package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-crush-support/proposal.md +0 -13
  213. package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-crush-support/specs/cli-init/spec.md +0 -67
  214. package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-crush-support/tasks.md +0 -7
  215. package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-factory-slash-commands/proposal.md +0 -12
  216. package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-factory-slash-commands/specs/cli-init/spec.md +0 -54
  217. package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-factory-slash-commands/specs/cli-update/spec.md +0 -54
  218. package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-factory-slash-commands/tasks.md +0 -11
  219. package/OpenSpec-main/openspec/changes/archive/2025-11-06-add-shell-completions/design.md +0 -525
  220. package/OpenSpec-main/openspec/changes/archive/2025-11-06-add-shell-completions/proposal.md +0 -29
  221. package/OpenSpec-main/openspec/changes/archive/2025-11-06-add-shell-completions/specs/cli-completion/spec.md +0 -300
  222. package/OpenSpec-main/openspec/changes/archive/2025-11-06-add-shell-completions/tasks.md +0 -81
  223. package/OpenSpec-main/openspec/changes/archive/2025-12-20-add-global-config-dir/design.md +0 -105
  224. package/OpenSpec-main/openspec/changes/archive/2025-12-20-add-global-config-dir/proposal.md +0 -20
  225. package/OpenSpec-main/openspec/changes/archive/2025-12-20-add-global-config-dir/specs/global-config/spec.md +0 -76
  226. package/OpenSpec-main/openspec/changes/archive/2025-12-20-add-global-config-dir/tasks.md +0 -26
  227. package/OpenSpec-main/openspec/changes/archive/2025-12-21-add-config-command/design.md +0 -89
  228. package/OpenSpec-main/openspec/changes/archive/2025-12-21-add-config-command/proposal.md +0 -60
  229. package/OpenSpec-main/openspec/changes/archive/2025-12-21-add-config-command/specs/cli-config/spec.md +0 -213
  230. package/OpenSpec-main/openspec/changes/archive/2025-12-21-add-config-command/tasks.md +0 -28
  231. package/OpenSpec-main/openspec/changes/archive/2025-12-23-extend-shell-completions/proposal.md +0 -15
  232. package/OpenSpec-main/openspec/changes/archive/2025-12-23-extend-shell-completions/specs/cli-completion/spec.md +0 -328
  233. package/OpenSpec-main/openspec/changes/archive/2025-12-23-extend-shell-completions/tasks.md +0 -49
  234. package/OpenSpec-main/openspec/changes/archive/2025-12-24-add-artifact-graph-core/design.md +0 -197
  235. package/OpenSpec-main/openspec/changes/archive/2025-12-24-add-artifact-graph-core/proposal.md +0 -18
  236. package/OpenSpec-main/openspec/changes/archive/2025-12-24-add-artifact-graph-core/specs/artifact-graph/spec.md +0 -103
  237. package/OpenSpec-main/openspec/changes/archive/2025-12-24-add-artifact-graph-core/tasks.md +0 -61
  238. package/OpenSpec-main/openspec/changes/archive/2025-12-25-add-change-manager/design.md +0 -74
  239. package/OpenSpec-main/openspec/changes/archive/2025-12-25-add-change-manager/proposal.md +0 -45
  240. package/OpenSpec-main/openspec/changes/archive/2025-12-25-add-change-manager/specs/change-creation/spec.md +0 -63
  241. package/OpenSpec-main/openspec/changes/archive/2025-12-25-add-change-manager/tasks.md +0 -30
  242. package/OpenSpec-main/openspec/changes/archive/2025-12-28-add-artifact-workflow-cli/design.md +0 -112
  243. package/OpenSpec-main/openspec/changes/archive/2025-12-28-add-artifact-workflow-cli/proposal.md +0 -33
  244. package/OpenSpec-main/openspec/changes/archive/2025-12-28-add-artifact-workflow-cli/specs/cli-artifact-workflow/spec.md +0 -153
  245. package/OpenSpec-main/openspec/changes/archive/2025-12-28-add-artifact-workflow-cli/tasks.md +0 -48
  246. package/OpenSpec-main/openspec/changes/archive/2025-12-28-add-instruction-loader/design.md +0 -149
  247. package/OpenSpec-main/openspec/changes/archive/2025-12-28-add-instruction-loader/proposal.md +0 -20
  248. package/OpenSpec-main/openspec/changes/archive/2025-12-28-add-instruction-loader/specs/instruction-loader/spec.md +0 -70
  249. package/OpenSpec-main/openspec/changes/archive/2025-12-28-add-instruction-loader/tasks.md +0 -13
  250. package/OpenSpec-main/openspec/changes/archive/2025-12-28-restructure-schema-directories/design.md +0 -129
  251. package/OpenSpec-main/openspec/changes/archive/2025-12-28-restructure-schema-directories/proposal.md +0 -20
  252. package/OpenSpec-main/openspec/changes/archive/2025-12-28-restructure-schema-directories/specs/artifact-graph/spec.md +0 -49
  253. package/OpenSpec-main/openspec/changes/archive/2025-12-28-restructure-schema-directories/tasks.md +0 -32
  254. package/OpenSpec-main/openspec/changes/archive/2025-12-29-unify-change-state-model/design.md +0 -151
  255. package/OpenSpec-main/openspec/changes/archive/2025-12-29-unify-change-state-model/proposal.md +0 -101
  256. package/OpenSpec-main/openspec/changes/archive/2025-12-29-unify-change-state-model/specs/cli-artifact-workflow/spec.md +0 -109
  257. package/OpenSpec-main/openspec/changes/archive/2025-12-29-unify-change-state-model/specs/cli-view/spec.md +0 -60
  258. package/OpenSpec-main/openspec/changes/archive/2025-12-29-unify-change-state-model/tasks.md +0 -25
  259. package/OpenSpec-main/openspec/changes/archive/2025-12-30-add-antigravity-support/proposal.md +0 -11
  260. package/OpenSpec-main/openspec/changes/archive/2025-12-30-add-antigravity-support/specs/cli-init/spec.md +0 -105
  261. package/OpenSpec-main/openspec/changes/archive/2025-12-30-add-antigravity-support/specs/cli-update/spec.md +0 -92
  262. package/OpenSpec-main/openspec/changes/archive/2025-12-30-add-antigravity-support/tasks.md +0 -12
  263. package/OpenSpec-main/openspec/changes/archive/2025-12-30-fix-cline-workflows-implementation/proposal.md +0 -13
  264. package/OpenSpec-main/openspec/changes/archive/2025-12-30-fix-cline-workflows-implementation/specs/cli-init/spec.md +0 -105
  265. package/OpenSpec-main/openspec/changes/archive/2025-12-30-fix-cline-workflows-implementation/specs/cli-update/spec.md +0 -92
  266. package/OpenSpec-main/openspec/changes/archive/2025-12-30-fix-cline-workflows-implementation/tasks.md +0 -13
  267. package/OpenSpec-main/openspec/changes/archive/2026-01-06-add-agent-schema-selection/proposal.md +0 -26
  268. package/OpenSpec-main/openspec/changes/archive/2026-01-06-add-agent-schema-selection/tasks.md +0 -32
  269. package/OpenSpec-main/openspec/changes/archive/2026-01-06-add-per-change-schema-metadata/design.md +0 -147
  270. package/OpenSpec-main/openspec/changes/archive/2026-01-06-add-per-change-schema-metadata/proposal.md +0 -29
  271. package/OpenSpec-main/openspec/changes/archive/2026-01-06-add-per-change-schema-metadata/specs/cli-artifact-workflow/spec.md +0 -98
  272. package/OpenSpec-main/openspec/changes/archive/2026-01-06-add-per-change-schema-metadata/tasks.md +0 -29
  273. package/OpenSpec-main/openspec/changes/archive/2026-01-06-add-specs-apply-command/.openspec.yaml +0 -2
  274. package/OpenSpec-main/openspec/changes/archive/2026-01-06-add-specs-apply-command/design.md +0 -77
  275. package/OpenSpec-main/openspec/changes/archive/2026-01-06-add-specs-apply-command/proposal.md +0 -32
  276. package/OpenSpec-main/openspec/changes/archive/2026-01-06-add-specs-apply-command/specs/specs-sync-skill/spec.md +0 -67
  277. package/OpenSpec-main/openspec/changes/archive/2026-01-06-add-specs-apply-command/tasks.md +0 -40
  278. package/OpenSpec-main/openspec/changes/archive/2026-01-06-make-apply-instructions-schema-aware/proposal.md +0 -138
  279. package/OpenSpec-main/openspec/changes/archive/2026-01-06-make-apply-instructions-schema-aware/specs/cli-artifact-workflow/spec.md +0 -60
  280. package/OpenSpec-main/openspec/changes/archive/2026-01-06-make-apply-instructions-schema-aware/tasks.md +0 -35
  281. package/OpenSpec-main/openspec/changes/archive/2026-01-06-opsx-archive-command/.openspec.yaml +0 -2
  282. package/OpenSpec-main/openspec/changes/archive/2026-01-06-opsx-archive-command/design.md +0 -84
  283. package/OpenSpec-main/openspec/changes/archive/2026-01-06-opsx-archive-command/proposal.md +0 -28
  284. package/OpenSpec-main/openspec/changes/archive/2026-01-06-opsx-archive-command/specs/opsx-archive-skill/spec.md +0 -122
  285. package/OpenSpec-main/openspec/changes/archive/2026-01-06-opsx-archive-command/tasks.md +0 -23
  286. package/OpenSpec-main/openspec/changes/archive/2026-01-07-add-nix-flake-support/.openspec.yaml +0 -2
  287. package/OpenSpec-main/openspec/changes/archive/2026-01-07-add-nix-flake-support/design.md +0 -94
  288. package/OpenSpec-main/openspec/changes/archive/2026-01-07-add-nix-flake-support/proposal.md +0 -25
  289. package/OpenSpec-main/openspec/changes/archive/2026-01-07-add-nix-flake-support/specs/nix-flake-support/spec.md +0 -79
  290. package/OpenSpec-main/openspec/changes/archive/2026-01-07-add-nix-flake-support/tasks.md +0 -65
  291. package/OpenSpec-main/openspec/changes/archive/2026-01-09-add-flake-update-script/.openspec.yaml +0 -2
  292. package/OpenSpec-main/openspec/changes/archive/2026-01-09-add-flake-update-script/design.md +0 -117
  293. package/OpenSpec-main/openspec/changes/archive/2026-01-09-add-flake-update-script/proposal.md +0 -23
  294. package/OpenSpec-main/openspec/changes/archive/2026-01-09-add-flake-update-script/specs/flake-update-script/spec.md +0 -93
  295. package/OpenSpec-main/openspec/changes/archive/2026-01-09-add-flake-update-script/tasks.md +0 -55
  296. package/OpenSpec-main/openspec/changes/archive/2026-01-09-add-posthog-analytics/.openspec.yaml +0 -2
  297. package/OpenSpec-main/openspec/changes/archive/2026-01-09-add-posthog-analytics/design.md +0 -175
  298. package/OpenSpec-main/openspec/changes/archive/2026-01-09-add-posthog-analytics/proposal.md +0 -37
  299. package/OpenSpec-main/openspec/changes/archive/2026-01-09-add-posthog-analytics/specs/global-config/spec.md +0 -21
  300. package/OpenSpec-main/openspec/changes/archive/2026-01-09-add-posthog-analytics/specs/telemetry/spec.md +0 -116
  301. package/OpenSpec-main/openspec/changes/archive/2026-01-09-add-posthog-analytics/tasks.md +0 -47
  302. package/OpenSpec-main/openspec/changes/archive/2026-01-09-fix-codebuddy-frontmatter-fields/proposal.md +0 -16
  303. package/OpenSpec-main/openspec/changes/archive/2026-01-09-fix-codebuddy-frontmatter-fields/specs/cli-init/spec.md +0 -75
  304. package/OpenSpec-main/openspec/changes/archive/2026-01-09-fix-codebuddy-frontmatter-fields/specs/cli-update/spec.md +0 -56
  305. package/OpenSpec-main/openspec/changes/archive/2026-01-09-fix-codebuddy-frontmatter-fields/tasks.md +0 -6
  306. package/OpenSpec-main/openspec/changes/archive/2026-01-15-add-nix-ci-validation/design.md +0 -206
  307. package/OpenSpec-main/openspec/changes/archive/2026-01-15-add-nix-ci-validation/proposal.md +0 -21
  308. package/OpenSpec-main/openspec/changes/archive/2026-01-15-add-nix-ci-validation/specs/ci-nix-validation/spec.md +0 -104
  309. package/OpenSpec-main/openspec/changes/archive/2026-01-15-add-nix-ci-validation/tasks.md +0 -49
  310. package/OpenSpec-main/openspec/changes/archive/2026-01-30-opencode-command-references/.openspec.yaml +0 -2
  311. package/OpenSpec-main/openspec/changes/archive/2026-01-30-opencode-command-references/README.md +0 -3
  312. package/OpenSpec-main/openspec/changes/archive/2026-01-30-opencode-command-references/design.md +0 -70
  313. package/OpenSpec-main/openspec/changes/archive/2026-01-30-opencode-command-references/proposal.md +0 -32
  314. package/OpenSpec-main/openspec/changes/archive/2026-01-30-opencode-command-references/specs/no-changes.md +0 -9
  315. package/OpenSpec-main/openspec/changes/archive/2026-01-30-opencode-command-references/tasks.md +0 -22
  316. package/OpenSpec-main/openspec/changes/archive/2026-02-17-add-feedback-command/proposal.md +0 -20
  317. package/OpenSpec-main/openspec/changes/archive/2026-02-17-add-feedback-command/specs/cli-feedback/spec.md +0 -188
  318. package/OpenSpec-main/openspec/changes/archive/2026-02-17-add-feedback-command/tasks.md +0 -30
  319. package/OpenSpec-main/openspec/changes/archive/2026-02-17-add-opsx-onboard-skill/.openspec.yaml +0 -2
  320. package/OpenSpec-main/openspec/changes/archive/2026-02-17-add-opsx-onboard-skill/design.md +0 -115
  321. package/OpenSpec-main/openspec/changes/archive/2026-02-17-add-opsx-onboard-skill/proposal.md +0 -27
  322. package/OpenSpec-main/openspec/changes/archive/2026-02-17-add-opsx-onboard-skill/specs/opsx-onboard-skill/spec.md +0 -162
  323. package/OpenSpec-main/openspec/changes/archive/2026-02-17-add-opsx-onboard-skill/tasks.md +0 -21
  324. package/OpenSpec-main/openspec/changes/archive/2026-02-17-add-verify-skill/design.md +0 -96
  325. package/OpenSpec-main/openspec/changes/archive/2026-02-17-add-verify-skill/proposal.md +0 -48
  326. package/OpenSpec-main/openspec/changes/archive/2026-02-17-add-verify-skill/specs/opsx-verify-skill/spec.md +0 -190
  327. package/OpenSpec-main/openspec/changes/archive/2026-02-17-add-verify-skill/tasks.md +0 -15
  328. package/OpenSpec-main/openspec/changes/archive/2026-02-17-merge-init-experimental/.openspec.yaml +0 -2
  329. package/OpenSpec-main/openspec/changes/archive/2026-02-17-merge-init-experimental/design.md +0 -193
  330. package/OpenSpec-main/openspec/changes/archive/2026-02-17-merge-init-experimental/proposal.md +0 -32
  331. package/OpenSpec-main/openspec/changes/archive/2026-02-17-merge-init-experimental/specs/cli-init/spec.md +0 -176
  332. package/OpenSpec-main/openspec/changes/archive/2026-02-17-merge-init-experimental/specs/legacy-cleanup/spec.md +0 -158
  333. package/OpenSpec-main/openspec/changes/archive/2026-02-17-merge-init-experimental/tasks.md +0 -67
  334. package/OpenSpec-main/openspec/changes/archive/2026-02-17-multi-provider-skill-generation/.openspec.yaml +0 -2
  335. package/OpenSpec-main/openspec/changes/archive/2026-02-17-multi-provider-skill-generation/design.md +0 -144
  336. package/OpenSpec-main/openspec/changes/archive/2026-02-17-multi-provider-skill-generation/proposal.md +0 -36
  337. package/OpenSpec-main/openspec/changes/archive/2026-02-17-multi-provider-skill-generation/specs/ai-tool-paths/spec.md +0 -63
  338. package/OpenSpec-main/openspec/changes/archive/2026-02-17-multi-provider-skill-generation/specs/cli-artifact-workflow/spec.md +0 -60
  339. package/OpenSpec-main/openspec/changes/archive/2026-02-17-multi-provider-skill-generation/specs/command-generation/spec.md +0 -98
  340. package/OpenSpec-main/openspec/changes/archive/2026-02-17-multi-provider-skill-generation/tasks.md +0 -55
  341. package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-config/.openspec.yaml +0 -2
  342. package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-config/design.md +0 -665
  343. package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-config/proposal.md +0 -774
  344. package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-config/specs/config-loading/spec.md +0 -119
  345. package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-config/specs/context-injection/spec.md +0 -51
  346. package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-config/specs/rules-injection/spec.md +0 -99
  347. package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-config/specs/schema-resolution/spec.md +0 -83
  348. package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-config/tasks.md +0 -72
  349. package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-local-schemas/.openspec.yaml +0 -2
  350. package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-local-schemas/design.md +0 -117
  351. package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-local-schemas/proposal.md +0 -167
  352. package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-local-schemas/specs/schema-resolution/spec.md +0 -88
  353. package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-local-schemas/tasks.md +0 -28
  354. package/OpenSpec-main/openspec/changes/archive/2026-02-17-schema-management-cli/.openspec.yaml +0 -2
  355. package/OpenSpec-main/openspec/changes/archive/2026-02-17-schema-management-cli/design.md +0 -113
  356. package/OpenSpec-main/openspec/changes/archive/2026-02-17-schema-management-cli/proposal.md +0 -55
  357. package/OpenSpec-main/openspec/changes/archive/2026-02-17-schema-management-cli/specs/schema-fork-command/spec.md +0 -66
  358. package/OpenSpec-main/openspec/changes/archive/2026-02-17-schema-management-cli/specs/schema-init-command/spec.md +0 -71
  359. package/OpenSpec-main/openspec/changes/archive/2026-02-17-schema-management-cli/specs/schema-validate-command/spec.md +0 -86
  360. package/OpenSpec-main/openspec/changes/archive/2026-02-17-schema-management-cli/specs/schema-which-command/spec.md +0 -65
  361. package/OpenSpec-main/openspec/changes/archive/2026-02-17-schema-management-cli/tasks.md +0 -67
  362. package/OpenSpec-main/openspec/changes/archive/2026-04-23-add-kimi-cli-skills-only-support/.openspec.yaml +0 -2
  363. package/OpenSpec-main/openspec/changes/archive/2026-04-23-add-kimi-cli-skills-only-support/README.md +0 -3
  364. package/OpenSpec-main/openspec/changes/archive/2026-04-23-add-kimi-cli-skills-only-support/design.md +0 -85
  365. package/OpenSpec-main/openspec/changes/archive/2026-04-23-add-kimi-cli-skills-only-support/proposal.md +0 -38
  366. package/OpenSpec-main/openspec/changes/archive/2026-04-23-add-kimi-cli-skills-only-support/specs/ai-tool-paths/spec.md +0 -12
  367. package/OpenSpec-main/openspec/changes/archive/2026-04-23-add-kimi-cli-skills-only-support/specs/cli-init/spec.md +0 -37
  368. package/OpenSpec-main/openspec/changes/archive/2026-04-23-add-kimi-cli-skills-only-support/tasks.md +0 -22
  369. package/OpenSpec-main/openspec/changes/archive/2026-05-04-workspace-foundation/design.md +0 -208
  370. package/OpenSpec-main/openspec/changes/archive/2026-05-04-workspace-foundation/proposal.md +0 -142
  371. package/OpenSpec-main/openspec/changes/archive/2026-05-04-workspace-foundation/specs/openspec-conventions/spec.md +0 -29
  372. package/OpenSpec-main/openspec/changes/archive/2026-05-04-workspace-foundation/specs/workspace-foundation/spec.md +0 -199
  373. package/OpenSpec-main/openspec/changes/archive/2026-05-04-workspace-foundation/tasks.md +0 -56
  374. package/OpenSpec-main/openspec/changes/archive/2026-05-06-workspace-create-and-register-repos/design.md +0 -356
  375. package/OpenSpec-main/openspec/changes/archive/2026-05-06-workspace-create-and-register-repos/proposal.md +0 -128
  376. package/OpenSpec-main/openspec/changes/archive/2026-05-06-workspace-create-and-register-repos/specs/cli-artifact-workflow/spec.md +0 -24
  377. package/OpenSpec-main/openspec/changes/archive/2026-05-06-workspace-create-and-register-repos/specs/workspace-foundation/spec.md +0 -35
  378. package/OpenSpec-main/openspec/changes/archive/2026-05-06-workspace-create-and-register-repos/specs/workspace-links/spec.md +0 -356
  379. package/OpenSpec-main/openspec/changes/archive/2026-05-06-workspace-create-and-register-repos/tasks.md +0 -121
  380. package/OpenSpec-main/openspec/changes/archive/2026-05-06-workspace-open-agent-context/design.md +0 -266
  381. package/OpenSpec-main/openspec/changes/archive/2026-05-06-workspace-open-agent-context/proposal.md +0 -65
  382. package/OpenSpec-main/openspec/changes/archive/2026-05-06-workspace-open-agent-context/specs/workspace-foundation/spec.md +0 -76
  383. package/OpenSpec-main/openspec/changes/archive/2026-05-06-workspace-open-agent-context/specs/workspace-open/spec.md +0 -199
  384. package/OpenSpec-main/openspec/changes/archive/2026-05-06-workspace-open-agent-context/tasks.md +0 -89
  385. package/OpenSpec-main/openspec/changes/archive/2026-05-14-workspace-change-planning/design.md +0 -242
  386. package/OpenSpec-main/openspec/changes/archive/2026-05-14-workspace-change-planning/proposal.md +0 -78
  387. package/OpenSpec-main/openspec/changes/archive/2026-05-14-workspace-change-planning/specs/artifact-graph/spec.md +0 -36
  388. package/OpenSpec-main/openspec/changes/archive/2026-05-14-workspace-change-planning/specs/change-creation/spec.md +0 -42
  389. package/OpenSpec-main/openspec/changes/archive/2026-05-14-workspace-change-planning/specs/cli-artifact-workflow/spec.md +0 -100
  390. package/OpenSpec-main/openspec/changes/archive/2026-05-14-workspace-change-planning/specs/cli-config/spec.md +0 -55
  391. package/OpenSpec-main/openspec/changes/archive/2026-05-14-workspace-change-planning/specs/cli-update/spec.md +0 -21
  392. package/OpenSpec-main/openspec/changes/archive/2026-05-14-workspace-change-planning/specs/openspec-conventions/spec.md +0 -32
  393. package/OpenSpec-main/openspec/changes/archive/2026-05-14-workspace-change-planning/specs/schema-resolution/spec.md +0 -25
  394. package/OpenSpec-main/openspec/changes/archive/2026-05-14-workspace-change-planning/specs/workspace-change-planning/spec.md +0 -67
  395. package/OpenSpec-main/openspec/changes/archive/2026-05-14-workspace-change-planning/specs/workspace-links/spec.md +0 -163
  396. package/OpenSpec-main/openspec/changes/archive/2026-05-14-workspace-change-planning/tasks.md +0 -133
  397. package/OpenSpec-main/openspec/changes/fix-opencode-commands-directory/.openspec.yaml +0 -2
  398. package/OpenSpec-main/openspec/changes/fix-opencode-commands-directory/design.md +0 -48
  399. package/OpenSpec-main/openspec/changes/fix-opencode-commands-directory/proposal.md +0 -26
  400. package/OpenSpec-main/openspec/changes/fix-opencode-commands-directory/specs/command-generation/spec.md +0 -63
  401. package/OpenSpec-main/openspec/changes/fix-opencode-commands-directory/tasks.md +0 -19
  402. package/OpenSpec-main/openspec/changes/graceful-status-no-changes/.openspec.yaml +0 -2
  403. package/OpenSpec-main/openspec/changes/graceful-status-no-changes/design.md +0 -38
  404. package/OpenSpec-main/openspec/changes/graceful-status-no-changes/proposal.md +0 -25
  405. package/OpenSpec-main/openspec/changes/graceful-status-no-changes/specs/graceful-status-empty/spec.md +0 -27
  406. package/OpenSpec-main/openspec/changes/graceful-status-no-changes/tasks.md +0 -16
  407. package/OpenSpec-main/openspec/changes/schema-alias-support/.openspec.yaml +0 -2
  408. package/OpenSpec-main/openspec/changes/schema-alias-support/proposal.md +0 -28
  409. package/OpenSpec-main/openspec/changes/simplify-skill-installation/.openspec.yaml +0 -2
  410. package/OpenSpec-main/openspec/changes/simplify-skill-installation/design.md +0 -288
  411. package/OpenSpec-main/openspec/changes/simplify-skill-installation/proposal.md +0 -202
  412. package/OpenSpec-main/openspec/changes/simplify-skill-installation/specs/cli-init/spec.md +0 -199
  413. package/OpenSpec-main/openspec/changes/simplify-skill-installation/specs/cli-update/spec.md +0 -177
  414. package/OpenSpec-main/openspec/changes/simplify-skill-installation/specs/profiles/spec.md +0 -142
  415. package/OpenSpec-main/openspec/changes/simplify-skill-installation/specs/propose-workflow/spec.md +0 -42
  416. package/OpenSpec-main/openspec/changes/simplify-skill-installation/tasks.md +0 -132
  417. package/OpenSpec-main/openspec/changes/unify-template-generation-pipeline/.openspec.yaml +0 -2
  418. package/OpenSpec-main/openspec/changes/unify-template-generation-pipeline/design.md +0 -149
  419. package/OpenSpec-main/openspec/changes/unify-template-generation-pipeline/proposal.md +0 -47
  420. package/OpenSpec-main/openspec/changes/unify-template-generation-pipeline/specs/template-artifact-pipeline/spec.md +0 -89
  421. package/OpenSpec-main/openspec/changes/unify-template-generation-pipeline/tasks.md +0 -41
  422. package/OpenSpec-main/openspec/changes/workspace-agent-guidance/.openspec.yaml +0 -2
  423. package/OpenSpec-main/openspec/changes/workspace-agent-guidance/proposal.md +0 -100
  424. package/OpenSpec-main/openspec/changes/workspace-apply-repo-slice/proposal.md +0 -58
  425. package/OpenSpec-main/openspec/changes/workspace-reimplementation-roadmap/HISTORICAL_DIRECTION.md +0 -511
  426. package/OpenSpec-main/openspec/changes/workspace-reimplementation-roadmap/POC_REFERENCE_GUIDE.md +0 -266
  427. package/OpenSpec-main/openspec/changes/workspace-reimplementation-roadmap/README.md +0 -107
  428. package/OpenSpec-main/openspec/changes/workspace-reimplementation-roadmap/START_HERE.md +0 -105
  429. package/OpenSpec-main/openspec/changes/workspace-reimplementation-roadmap/proposal.md +0 -62
  430. package/OpenSpec-main/openspec/changes/workspace-verify-and-archive/proposal.md +0 -57
  431. package/OpenSpec-main/openspec/config.yaml +0 -36
  432. package/OpenSpec-main/openspec/explorations/explore-workflow-ux.md +0 -116
  433. package/OpenSpec-main/openspec/explorations/workspace-architecture.md +0 -857
  434. package/OpenSpec-main/openspec/explorations/workspace-roadmap.md +0 -367
  435. package/OpenSpec-main/openspec/explorations/workspace-user-journeys.md +0 -2259
  436. package/OpenSpec-main/openspec/explorations/workspace-ux-simplification.md +0 -491
  437. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/.initiative.yaml +0 -27
  438. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/README.md +0 -33
  439. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/decisions.md +0 -204
  440. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/direction.md +0 -447
  441. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/questions.md +0 -23
  442. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/roadmap.md +0 -759
  443. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/tasks.md +0 -308
  444. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/01-lock-the-direction/evidence.md +0 -154
  445. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/01-lock-the-direction/plan.md +0 -90
  446. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/01-lock-the-direction/tasks.md +0 -44
  447. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/02-stabilize-workspace-as-local-view/evidence.md +0 -68
  448. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/02-stabilize-workspace-as-local-view/plan.md +0 -80
  449. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/02-stabilize-workspace-as-local-view/tasks.md +0 -23
  450. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/03-add-context-store-foundation/evidence.md +0 -43
  451. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/03-add-context-store-foundation/plan.md +0 -85
  452. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/03-add-context-store-foundation/tasks.md +0 -17
  453. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/04-add-collection-foundation/evidence.md +0 -77
  454. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/04-add-collection-foundation/plan.md +0 -198
  455. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/04-add-collection-foundation/tasks.md +0 -14
  456. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/05-ship-initiative-mvp/evidence.md +0 -99
  457. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/05-ship-initiative-mvp/plan.md +0 -236
  458. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/05-ship-initiative-mvp/tasks.md +0 -21
  459. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/06-add-minimal-context-store-ux/evidence.md +0 -97
  460. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/06-add-minimal-context-store-ux/plan.md +0 -333
  461. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/06-add-minimal-context-store-ux/tasks.md +0 -29
  462. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/07-add-agent-first-initiative-discovery/evidence.md +0 -97
  463. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/07-add-agent-first-initiative-discovery/plan.md +0 -184
  464. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/07-add-agent-first-initiative-discovery/tasks.md +0 -27
  465. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/08-connect-repo-local-changes-to-initiatives/evidence.md +0 -239
  466. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/08-connect-repo-local-changes-to-initiatives/plan.md +0 -279
  467. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/08-connect-repo-local-changes-to-initiatives/tasks.md +0 -22
  468. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/09-add-initiative-resolve/decision-review.md +0 -64
  469. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/09-add-initiative-resolve/evidence.md +0 -106
  470. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/09-add-initiative-resolve/plan.md +0 -141
  471. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/09-add-initiative-resolve/tasks.md +0 -22
  472. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/10-let-workspaces-open-initiatives/plan.md +0 -430
  473. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/10-let-workspaces-open-initiatives/tasks.md +0 -43
  474. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/11-manual-beta-reality-pass/notes.md +0 -289
  475. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/11-manual-beta-reality-pass/plan.md +0 -39
  476. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/11-manual-beta-reality-pass/tasks.md +0 -8
  477. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/12-context-store-first-run-and-cleanup-ux/evidence.md +0 -45
  478. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/12-context-store-first-run-and-cleanup-ux/plan.md +0 -150
  479. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/12-context-store-first-run-and-cleanup-ux/tasks.md +0 -23
  480. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/13-agent-handoff-output-and-delivery-polish/evidence.md +0 -25
  481. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/13-agent-handoff-output-and-delivery-polish/plan.md +0 -98
  482. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/13-agent-handoff-output-and-delivery-polish/tasks.md +0 -25
  483. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/14-workspaces-beta-guide-split/plan.md +0 -37
  484. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/14-workspaces-beta-guide-split/tasks.md +0 -9
  485. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/15-context-store-project-roots-and-schema-led-initiatives/evidence.md +0 -140
  486. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/15-context-store-project-roots-and-schema-led-initiatives/plan.md +0 -344
  487. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/15-context-store-project-roots-and-schema-led-initiatives/tasks.md +0 -39
  488. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/16-add-escalation-ux/plan.md +0 -26
  489. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/16-add-escalation-ux/tasks.md +0 -7
  490. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/17-harden-team-shared-coordination/plan.md +0 -25
  491. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/17-harden-team-shared-coordination/tasks.md +0 -7
  492. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/18-explore-initiative-hosted-target-bound-change-artifacts/evidence.md +0 -397
  493. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/18-explore-initiative-hosted-target-bound-change-artifacts/plan.md +0 -180
  494. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/18-explore-initiative-hosted-target-bound-change-artifacts/tasks.md +0 -28
  495. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/19-review-workspace-beta-compatibility-before-public-release/plan.md +0 -62
  496. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/19-review-workspace-beta-compatibility-before-public-release/tasks.md +0 -16
  497. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/proposed-initiative-next-agent-handoff-ux/evidence.md +0 -47
  498. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/proposed-initiative-next-agent-handoff-ux/plan.md +0 -90
  499. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/proposed-initiative-next-agent-handoff-ux/tasks.md +0 -18
  500. package/OpenSpec-main/openspec/specs/ai-tool-paths/spec.md +0 -63
  501. package/OpenSpec-main/openspec/specs/artifact-graph/spec.md +0 -165
  502. package/OpenSpec-main/openspec/specs/change-creation/spec.md +0 -108
  503. package/OpenSpec-main/openspec/specs/ci-nix-validation/spec.md +0 -107
  504. package/OpenSpec-main/openspec/specs/cli-archive/spec.md +0 -210
  505. package/OpenSpec-main/openspec/specs/cli-artifact-workflow/spec.md +0 -398
  506. package/OpenSpec-main/openspec/specs/cli-change/spec.md +0 -92
  507. package/OpenSpec-main/openspec/specs/cli-completion/spec.md +0 -432
  508. package/OpenSpec-main/openspec/specs/cli-config/spec.md +0 -318
  509. package/OpenSpec-main/openspec/specs/cli-feedback/spec.md +0 -193
  510. package/OpenSpec-main/openspec/specs/cli-init/spec.md +0 -269
  511. package/OpenSpec-main/openspec/specs/cli-list/spec.md +0 -103
  512. package/OpenSpec-main/openspec/specs/cli-show/spec.md +0 -86
  513. package/OpenSpec-main/openspec/specs/cli-spec/spec.md +0 -88
  514. package/OpenSpec-main/openspec/specs/cli-update/spec.md +0 -229
  515. package/OpenSpec-main/openspec/specs/cli-validate/spec.md +0 -219
  516. package/OpenSpec-main/openspec/specs/cli-view/spec.md +0 -129
  517. package/OpenSpec-main/openspec/specs/command-generation/spec.md +0 -97
  518. package/OpenSpec-main/openspec/specs/config-loading/spec.md +0 -122
  519. package/OpenSpec-main/openspec/specs/context-injection/spec.md +0 -53
  520. package/OpenSpec-main/openspec/specs/docs-agent-instructions/spec.md +0 -62
  521. package/OpenSpec-main/openspec/specs/global-config/spec.md +0 -101
  522. package/OpenSpec-main/openspec/specs/instruction-loader/spec.md +0 -70
  523. package/OpenSpec-main/openspec/specs/legacy-cleanup/spec.md +0 -163
  524. package/OpenSpec-main/openspec/specs/openspec-conventions/spec.md +0 -556
  525. package/OpenSpec-main/openspec/specs/opsx-archive-skill/spec.md +0 -128
  526. package/OpenSpec-main/openspec/specs/opsx-onboard-skill/spec.md +0 -167
  527. package/OpenSpec-main/openspec/specs/opsx-verify-skill/spec.md +0 -189
  528. package/OpenSpec-main/openspec/specs/rules-injection/spec.md +0 -102
  529. package/OpenSpec-main/openspec/specs/schema-fork-command/spec.md +0 -71
  530. package/OpenSpec-main/openspec/specs/schema-init-command/spec.md +0 -76
  531. package/OpenSpec-main/openspec/specs/schema-resolution/spec.md +0 -201
  532. package/OpenSpec-main/openspec/specs/schema-validate-command/spec.md +0 -91
  533. package/OpenSpec-main/openspec/specs/schema-which-command/spec.md +0 -70
  534. package/OpenSpec-main/openspec/specs/specs-sync-skill/spec.md +0 -72
  535. package/OpenSpec-main/openspec/specs/telemetry/spec.md +0 -122
  536. package/OpenSpec-main/openspec/specs/workspace-change-planning/spec.md +0 -71
  537. package/OpenSpec-main/openspec/specs/workspace-foundation/spec.md +0 -279
  538. package/OpenSpec-main/openspec/specs/workspace-links/spec.md +0 -529
  539. package/OpenSpec-main/openspec/specs/workspace-open/spec.md +0 -205
  540. package/OpenSpec-main/openspec-parallel-merge-plan.md +0 -98
  541. package/OpenSpec-main/package-lock.json +0 -4978
  542. package/OpenSpec-main/package.json +0 -84
  543. package/OpenSpec-main/pnpm-lock.yaml +0 -3187
  544. package/OpenSpec-main/schemas/spec-driven/schema.yaml +0 -153
  545. package/OpenSpec-main/schemas/spec-driven/templates/design.md +0 -19
  546. package/OpenSpec-main/schemas/spec-driven/templates/proposal.md +0 -23
  547. package/OpenSpec-main/schemas/spec-driven/templates/spec.md +0 -8
  548. package/OpenSpec-main/schemas/spec-driven/templates/tasks.md +0 -9
  549. package/OpenSpec-main/schemas/workspace-planning/schema.yaml +0 -72
  550. package/OpenSpec-main/schemas/workspace-planning/templates/design.md +0 -33
  551. package/OpenSpec-main/schemas/workspace-planning/templates/proposal.md +0 -28
  552. package/OpenSpec-main/schemas/workspace-planning/templates/spec.md +0 -9
  553. package/OpenSpec-main/schemas/workspace-planning/templates/tasks.md +0 -15
  554. package/OpenSpec-main/scripts/README.md +0 -37
  555. package/OpenSpec-main/scripts/pack-version-check.mjs +0 -111
  556. package/OpenSpec-main/scripts/postinstall.js +0 -83
  557. package/OpenSpec-main/scripts/test-postinstall.sh +0 -57
  558. package/OpenSpec-main/scripts/update-flake.sh +0 -128
  559. package/OpenSpec-main/test/cli-e2e/basic.test.ts +0 -205
  560. package/OpenSpec-main/test/commands/artifact-workflow.test.ts +0 -1063
  561. package/OpenSpec-main/test/commands/change-initiative-link.test.ts +0 -532
  562. package/OpenSpec-main/test/commands/change.interactive-show.test.ts +0 -45
  563. package/OpenSpec-main/test/commands/change.interactive-validate.test.ts +0 -48
  564. package/OpenSpec-main/test/commands/completion.test.ts +0 -278
  565. package/OpenSpec-main/test/commands/config-profile.test.ts +0 -532
  566. package/OpenSpec-main/test/commands/config.test.ts +0 -285
  567. package/OpenSpec-main/test/commands/context-store.test.ts +0 -692
  568. package/OpenSpec-main/test/commands/feedback.test.ts +0 -429
  569. package/OpenSpec-main/test/commands/initiative.test.ts +0 -907
  570. package/OpenSpec-main/test/commands/schema.test.ts +0 -467
  571. package/OpenSpec-main/test/commands/show.test.ts +0 -123
  572. package/OpenSpec-main/test/commands/spec.interactive-show.test.ts +0 -44
  573. package/OpenSpec-main/test/commands/spec.interactive-validate.test.ts +0 -44
  574. package/OpenSpec-main/test/commands/spec.test.ts +0 -324
  575. package/OpenSpec-main/test/commands/validate.enriched-output.test.ts +0 -49
  576. package/OpenSpec-main/test/commands/validate.test.ts +0 -147
  577. package/OpenSpec-main/test/commands/workspace-initiative-open.test.ts +0 -638
  578. package/OpenSpec-main/test/commands/workspace-open.test.ts +0 -123
  579. package/OpenSpec-main/test/commands/workspace.interactive.test.ts +0 -696
  580. package/OpenSpec-main/test/commands/workspace.test.ts +0 -1812
  581. package/OpenSpec-main/test/core/archive.test.ts +0 -869
  582. package/OpenSpec-main/test/core/artifact-graph/graph.test.ts +0 -268
  583. package/OpenSpec-main/test/core/artifact-graph/instruction-loader.test.ts +0 -609
  584. package/OpenSpec-main/test/core/artifact-graph/outputs.test.ts +0 -175
  585. package/OpenSpec-main/test/core/artifact-graph/resolver.test.ts +0 -651
  586. package/OpenSpec-main/test/core/artifact-graph/schema.test.ts +0 -207
  587. package/OpenSpec-main/test/core/artifact-graph/state.test.ts +0 -174
  588. package/OpenSpec-main/test/core/artifact-graph/workflow.integration.test.ts +0 -182
  589. package/OpenSpec-main/test/core/available-tools.test.ts +0 -167
  590. package/OpenSpec-main/test/core/collections/initiatives/operations.test.ts +0 -342
  591. package/OpenSpec-main/test/core/collections/initiatives/resolution.test.ts +0 -21
  592. package/OpenSpec-main/test/core/collections/initiatives/schema.test.ts +0 -201
  593. package/OpenSpec-main/test/core/collections/initiatives/templates.test.ts +0 -74
  594. package/OpenSpec-main/test/core/collections/runtime.test.ts +0 -214
  595. package/OpenSpec-main/test/core/command-generation/adapters.test.ts +0 -710
  596. package/OpenSpec-main/test/core/command-generation/generator.test.ts +0 -110
  597. package/OpenSpec-main/test/core/command-generation/registry.test.ts +0 -108
  598. package/OpenSpec-main/test/core/command-generation/types.test.ts +0 -79
  599. package/OpenSpec-main/test/core/commands/change-command.list.test.ts +0 -76
  600. package/OpenSpec-main/test/core/commands/change-command.show-validate.test.ts +0 -111
  601. package/OpenSpec-main/test/core/completions/command-registry.test.ts +0 -201
  602. package/OpenSpec-main/test/core/completions/completion-provider.test.ts +0 -288
  603. package/OpenSpec-main/test/core/completions/generators/bash-generator.test.ts +0 -586
  604. package/OpenSpec-main/test/core/completions/generators/fish-generator.test.ts +0 -549
  605. package/OpenSpec-main/test/core/completions/generators/powershell-generator.test.ts +0 -621
  606. package/OpenSpec-main/test/core/completions/generators/zsh-generator.test.ts +0 -425
  607. package/OpenSpec-main/test/core/completions/installers/bash-installer.test.ts +0 -484
  608. package/OpenSpec-main/test/core/completions/installers/fish-installer.test.ts +0 -321
  609. package/OpenSpec-main/test/core/completions/installers/powershell-installer.test.ts +0 -824
  610. package/OpenSpec-main/test/core/completions/installers/zsh-installer.test.ts +0 -750
  611. package/OpenSpec-main/test/core/config-schema.test.ts +0 -340
  612. package/OpenSpec-main/test/core/context-store/foundation.test.ts +0 -364
  613. package/OpenSpec-main/test/core/context-store/registry.test.ts +0 -599
  614. package/OpenSpec-main/test/core/converters/json-converter.test.ts +0 -184
  615. package/OpenSpec-main/test/core/global-config.test.ts +0 -371
  616. package/OpenSpec-main/test/core/init.test.ts +0 -786
  617. package/OpenSpec-main/test/core/legacy-cleanup.test.ts +0 -1162
  618. package/OpenSpec-main/test/core/list.test.ts +0 -165
  619. package/OpenSpec-main/test/core/migration.test.ts +0 -150
  620. package/OpenSpec-main/test/core/parsers/change-parser.test.ts +0 -52
  621. package/OpenSpec-main/test/core/parsers/markdown-parser.test.ts +0 -355
  622. package/OpenSpec-main/test/core/parsers/requirement-blocks.test.ts +0 -46
  623. package/OpenSpec-main/test/core/planning-home.test.ts +0 -120
  624. package/OpenSpec-main/test/core/profile-sync-drift.test.ts +0 -92
  625. package/OpenSpec-main/test/core/profiles.test.ts +0 -63
  626. package/OpenSpec-main/test/core/project-config.test.ts +0 -610
  627. package/OpenSpec-main/test/core/shared/skill-generation.test.ts +0 -301
  628. package/OpenSpec-main/test/core/shared/tool-detection.test.ts +0 -333
  629. package/OpenSpec-main/test/core/templates/skill-templates-parity.test.ts +0 -172
  630. package/OpenSpec-main/test/core/update.test.ts +0 -1810
  631. package/OpenSpec-main/test/core/validation.enriched-messages.test.ts +0 -74
  632. package/OpenSpec-main/test/core/validation.test.ts +0 -680
  633. package/OpenSpec-main/test/core/view.test.ts +0 -129
  634. package/OpenSpec-main/test/core/workspace/foundation.test.ts +0 -694
  635. package/OpenSpec-main/test/core/workspace/legacy-state.test.ts +0 -221
  636. package/OpenSpec-main/test/core/workspace/skills.test.ts +0 -69
  637. package/OpenSpec-main/test/fixtures/tmp-init/openspec/changes/c1/proposal.md +0 -7
  638. package/OpenSpec-main/test/fixtures/tmp-init/openspec/changes/c1/specs/alpha/spec.md +0 -8
  639. package/OpenSpec-main/test/fixtures/tmp-init/openspec/specs/alpha/spec.md +0 -12
  640. package/OpenSpec-main/test/helpers/path-env.ts +0 -26
  641. package/OpenSpec-main/test/helpers/run-cli.ts +0 -150
  642. package/OpenSpec-main/test/prompts/searchable-multi-select.test.ts +0 -220
  643. package/OpenSpec-main/test/specs/source-specs-normalization.test.ts +0 -63
  644. package/OpenSpec-main/test/telemetry/config.test.ts +0 -298
  645. package/OpenSpec-main/test/telemetry/index.test.ts +0 -219
  646. package/OpenSpec-main/test/utils/change-metadata.test.ts +0 -368
  647. package/OpenSpec-main/test/utils/change-utils.test.ts +0 -201
  648. package/OpenSpec-main/test/utils/command-references.test.ts +0 -83
  649. package/OpenSpec-main/test/utils/file-system.test.ts +0 -322
  650. package/OpenSpec-main/test/utils/interactive.test.ts +0 -125
  651. package/OpenSpec-main/test/utils/marker-updates.test.ts +0 -448
  652. package/OpenSpec-main/test/utils/shell-detection.test.ts +0 -185
  653. package/OpenSpec-main/vitest.config.ts +0 -47
  654. package/OpenSpec-main/vitest.setup.ts +0 -15
  655. package/Scanner CLI Inteligente para Projetos.md +0 -433
@@ -1,1162 +0,0 @@
1
- import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
- import { promises as fs } from 'fs';
3
- import path from 'path';
4
- import os from 'os';
5
- import { randomUUID } from 'crypto';
6
- import {
7
- detectLegacyArtifacts,
8
- detectLegacyConfigFiles,
9
- detectLegacySlashCommands,
10
- detectLegacyStructureFiles,
11
- hasOpenSpecMarkers,
12
- isOnlyOpenSpecContent,
13
- removeMarkerBlock,
14
- cleanupLegacyArtifacts,
15
- formatCleanupSummary,
16
- formatDetectionSummary,
17
- formatProjectMdMigrationHint,
18
- getToolsFromLegacyArtifacts,
19
- LEGACY_CONFIG_FILES,
20
- LEGACY_SLASH_COMMAND_PATHS,
21
- } from '../../src/core/legacy-cleanup.js';
22
- import { OPENSPEC_MARKERS } from '../../src/core/config.js';
23
- import { CommandAdapterRegistry } from '../../src/core/command-generation/registry.js';
24
-
25
- describe('legacy-cleanup', () => {
26
- let testDir: string;
27
-
28
- beforeEach(async () => {
29
- testDir = path.join(os.tmpdir(), `openspec-legacy-test-${randomUUID()}`);
30
- await fs.mkdir(testDir, { recursive: true });
31
- // Create openspec directory structure
32
- await fs.mkdir(path.join(testDir, 'openspec'), { recursive: true });
33
- });
34
-
35
- afterEach(async () => {
36
- await fs.rm(testDir, { recursive: true, force: true });
37
- });
38
-
39
- describe('hasOpenSpecMarkers', () => {
40
- it('should return true when both markers are present', () => {
41
- const content = `Some content
42
- ${OPENSPEC_MARKERS.start}
43
- OpenSpec content
44
- ${OPENSPEC_MARKERS.end}
45
- More content`;
46
- expect(hasOpenSpecMarkers(content)).toBe(true);
47
- });
48
-
49
- it('should return false when start marker is missing', () => {
50
- const content = `Some content
51
- OpenSpec content
52
- ${OPENSPEC_MARKERS.end}`;
53
- expect(hasOpenSpecMarkers(content)).toBe(false);
54
- });
55
-
56
- it('should return false when end marker is missing', () => {
57
- const content = `${OPENSPEC_MARKERS.start}
58
- OpenSpec content
59
- Some content`;
60
- expect(hasOpenSpecMarkers(content)).toBe(false);
61
- });
62
-
63
- it('should return false when no markers are present', () => {
64
- const content = 'Plain content without markers';
65
- expect(hasOpenSpecMarkers(content)).toBe(false);
66
- });
67
- });
68
-
69
- describe('isOnlyOpenSpecContent', () => {
70
- it('should return true when content is only markers and whitespace outside', () => {
71
- const content = `${OPENSPEC_MARKERS.start}
72
- OpenSpec content here
73
- ${OPENSPEC_MARKERS.end}`;
74
- expect(isOnlyOpenSpecContent(content)).toBe(true);
75
- });
76
-
77
- it('should return true with whitespace before and after markers', () => {
78
- const content = `
79
-
80
- ${OPENSPEC_MARKERS.start}
81
- OpenSpec content
82
- ${OPENSPEC_MARKERS.end}
83
-
84
- `;
85
- expect(isOnlyOpenSpecContent(content)).toBe(true);
86
- });
87
-
88
- it('should return false when content exists before markers', () => {
89
- const content = `User content here
90
- ${OPENSPEC_MARKERS.start}
91
- OpenSpec content
92
- ${OPENSPEC_MARKERS.end}`;
93
- expect(isOnlyOpenSpecContent(content)).toBe(false);
94
- });
95
-
96
- it('should return false when content exists after markers', () => {
97
- const content = `${OPENSPEC_MARKERS.start}
98
- OpenSpec content
99
- ${OPENSPEC_MARKERS.end}
100
- User content here`;
101
- expect(isOnlyOpenSpecContent(content)).toBe(false);
102
- });
103
-
104
- it('should return false when markers are missing', () => {
105
- const content = 'Plain content without markers';
106
- expect(isOnlyOpenSpecContent(content)).toBe(false);
107
- });
108
-
109
- it('should return false when end marker comes before start marker', () => {
110
- const content = `${OPENSPEC_MARKERS.end}
111
- Content
112
- ${OPENSPEC_MARKERS.start}`;
113
- expect(isOnlyOpenSpecContent(content)).toBe(false);
114
- });
115
- });
116
-
117
- describe('removeMarkerBlock', () => {
118
- it('should remove marker block and preserve content before', () => {
119
- const content = `User content before
120
- ${OPENSPEC_MARKERS.start}
121
- OpenSpec content
122
- ${OPENSPEC_MARKERS.end}`;
123
- const result = removeMarkerBlock(content);
124
- expect(result).toBe('User content before\n');
125
- expect(result).not.toContain(OPENSPEC_MARKERS.start);
126
- expect(result).not.toContain(OPENSPEC_MARKERS.end);
127
- });
128
-
129
- it('should remove marker block and preserve content after', () => {
130
- const content = `${OPENSPEC_MARKERS.start}
131
- OpenSpec content
132
- ${OPENSPEC_MARKERS.end}
133
- User content after`;
134
- const result = removeMarkerBlock(content);
135
- expect(result).toBe('User content after\n');
136
- });
137
-
138
- it('should remove marker block and preserve content before and after', () => {
139
- const content = `User content before
140
- ${OPENSPEC_MARKERS.start}
141
- OpenSpec content
142
- ${OPENSPEC_MARKERS.end}
143
- User content after`;
144
- const result = removeMarkerBlock(content);
145
- expect(result).toContain('User content before');
146
- expect(result).toContain('User content after');
147
- expect(result).not.toContain(OPENSPEC_MARKERS.start);
148
- });
149
-
150
- it('should clean up double blank lines', () => {
151
- const content = `Line 1
152
-
153
-
154
- ${OPENSPEC_MARKERS.start}
155
- OpenSpec content
156
- ${OPENSPEC_MARKERS.end}
157
-
158
-
159
- Line 2`;
160
- const result = removeMarkerBlock(content);
161
- expect(result).not.toMatch(/\n{3,}/);
162
- });
163
-
164
- it('should return empty string when only markers remain', () => {
165
- const content = `${OPENSPEC_MARKERS.start}
166
- OpenSpec content
167
- ${OPENSPEC_MARKERS.end}`;
168
- const result = removeMarkerBlock(content);
169
- expect(result).toBe('');
170
- });
171
-
172
- it('should return original content when markers are missing', () => {
173
- const content = 'Plain content without markers';
174
- const result = removeMarkerBlock(content);
175
- // When no markers found, content is returned trimmed (no trailing newline added)
176
- expect(result).toBe('Plain content without markers');
177
- });
178
-
179
- it('should return original content when markers are in wrong order', () => {
180
- const content = `${OPENSPEC_MARKERS.end}
181
- Content
182
- ${OPENSPEC_MARKERS.start}`;
183
- const result = removeMarkerBlock(content);
184
- expect(result).toContain(OPENSPEC_MARKERS.end);
185
- expect(result).toContain(OPENSPEC_MARKERS.start);
186
- });
187
-
188
- it('should ignore inline mentions of markers and only remove actual block', () => {
189
- const content = `Intro referencing ${OPENSPEC_MARKERS.start} and ${OPENSPEC_MARKERS.end} inline.
190
-
191
- ${OPENSPEC_MARKERS.start}
192
- Managed content here
193
- ${OPENSPEC_MARKERS.end}
194
- After content`;
195
- const result = removeMarkerBlock(content);
196
- // Inline mentions preserved
197
- expect(result).toContain('Intro referencing');
198
- expect(result).toContain(OPENSPEC_MARKERS.start);
199
- expect(result).toContain(OPENSPEC_MARKERS.end);
200
- // Managed content removed
201
- expect(result).not.toContain('Managed content here');
202
- expect(result).toContain('After content');
203
- });
204
- });
205
-
206
- describe('detectLegacyConfigFiles', () => {
207
- it('should detect CLAUDE.md with OpenSpec markers and put in update list', async () => {
208
- const claudePath = path.join(testDir, 'CLAUDE.md');
209
- await fs.writeFile(claudePath, `${OPENSPEC_MARKERS.start}
210
- OpenSpec content
211
- ${OPENSPEC_MARKERS.end}`);
212
-
213
- const result = await detectLegacyConfigFiles(testDir);
214
- expect(result.allFiles).toContain('CLAUDE.md');
215
- // Config files are NEVER deleted, always updated (markers removed)
216
- expect(result.filesToUpdate).toContain('CLAUDE.md');
217
- });
218
-
219
- it('should detect files with mixed content and put in update list', async () => {
220
- const claudePath = path.join(testDir, 'CLAUDE.md');
221
- await fs.writeFile(claudePath, `User instructions here
222
- ${OPENSPEC_MARKERS.start}
223
- OpenSpec content
224
- ${OPENSPEC_MARKERS.end}`);
225
-
226
- const result = await detectLegacyConfigFiles(testDir);
227
- expect(result.allFiles).toContain('CLAUDE.md');
228
- expect(result.filesToUpdate).toContain('CLAUDE.md');
229
- });
230
-
231
- it('should not detect files without OpenSpec markers', async () => {
232
- const claudePath = path.join(testDir, 'CLAUDE.md');
233
- await fs.writeFile(claudePath, 'Plain instructions without markers');
234
-
235
- const result = await detectLegacyConfigFiles(testDir);
236
- expect(result.allFiles).not.toContain('CLAUDE.md');
237
- });
238
-
239
- it('should detect multiple config files', async () => {
240
- // Create multiple config files with markers
241
- await fs.writeFile(path.join(testDir, 'CLAUDE.md'), `${OPENSPEC_MARKERS.start}\nContent\n${OPENSPEC_MARKERS.end}`);
242
- await fs.writeFile(path.join(testDir, 'CLINE.md'), `${OPENSPEC_MARKERS.start}\nContent\n${OPENSPEC_MARKERS.end}`);
243
- await fs.writeFile(path.join(testDir, 'QODER.md'), `${OPENSPEC_MARKERS.start}\nContent\n${OPENSPEC_MARKERS.end}`);
244
-
245
- const result = await detectLegacyConfigFiles(testDir);
246
- expect(result.allFiles).toHaveLength(3);
247
- expect(result.allFiles).toContain('CLAUDE.md');
248
- expect(result.allFiles).toContain('CLINE.md');
249
- expect(result.allFiles).toContain('QODER.md');
250
- // All should be in update list, none deleted
251
- expect(result.filesToUpdate).toHaveLength(3);
252
- });
253
-
254
- it('should handle non-existent files gracefully', async () => {
255
- const result = await detectLegacyConfigFiles(testDir);
256
- expect(result.allFiles).toHaveLength(0);
257
- expect(result.filesToUpdate).toHaveLength(0);
258
- });
259
- });
260
-
261
- describe('detectLegacySlashCommands', () => {
262
- it('should detect legacy Claude slash command directory', async () => {
263
- const dirPath = path.join(testDir, '.claude', 'commands', 'openspec');
264
- await fs.mkdir(dirPath, { recursive: true });
265
- await fs.writeFile(path.join(dirPath, 'proposal.md'), 'content');
266
-
267
- const result = await detectLegacySlashCommands(testDir);
268
- expect(result.directories).toContain('.claude/commands/openspec');
269
- });
270
-
271
- it('should detect legacy Cursor slash command files', async () => {
272
- const dirPath = path.join(testDir, '.cursor', 'commands');
273
- await fs.mkdir(dirPath, { recursive: true });
274
- await fs.writeFile(path.join(dirPath, 'openspec-proposal.md'), 'content');
275
- await fs.writeFile(path.join(dirPath, 'openspec-apply.md'), 'content');
276
-
277
- const result = await detectLegacySlashCommands(testDir);
278
- expect(result.files).toContain('.cursor/commands/openspec-proposal.md');
279
- expect(result.files).toContain('.cursor/commands/openspec-apply.md');
280
- });
281
-
282
- it('should detect legacy Windsurf workflow files', async () => {
283
- const dirPath = path.join(testDir, '.windsurf', 'workflows');
284
- await fs.mkdir(dirPath, { recursive: true });
285
- await fs.writeFile(path.join(dirPath, 'openspec-archive.md'), 'content');
286
-
287
- const result = await detectLegacySlashCommands(testDir);
288
- expect(result.files).toContain('.windsurf/workflows/openspec-archive.md');
289
- });
290
-
291
- it('should detect multiple tool directories and files', async () => {
292
- // Create directory-based
293
- await fs.mkdir(path.join(testDir, '.claude', 'commands', 'openspec'), { recursive: true });
294
- await fs.mkdir(path.join(testDir, '.qoder', 'commands', 'openspec'), { recursive: true });
295
-
296
- // Create file-based
297
- await fs.mkdir(path.join(testDir, '.cursor', 'commands'), { recursive: true });
298
- await fs.writeFile(path.join(testDir, '.cursor', 'commands', 'openspec-proposal.md'), 'content');
299
-
300
- const result = await detectLegacySlashCommands(testDir);
301
- expect(result.directories).toContain('.claude/commands/openspec');
302
- expect(result.directories).toContain('.qoder/commands/openspec');
303
- expect(result.files).toContain('.cursor/commands/openspec-proposal.md');
304
- });
305
-
306
- it('should not detect non-openspec files', async () => {
307
- const dirPath = path.join(testDir, '.cursor', 'commands');
308
- await fs.mkdir(dirPath, { recursive: true });
309
- await fs.writeFile(path.join(dirPath, 'other-command.md'), 'content');
310
-
311
- const result = await detectLegacySlashCommands(testDir);
312
- expect(result.files).not.toContain('.cursor/commands/other-command.md');
313
- });
314
-
315
- it('should handle non-existent directories gracefully', async () => {
316
- const result = await detectLegacySlashCommands(testDir);
317
- expect(result.directories).toHaveLength(0);
318
- expect(result.files).toHaveLength(0);
319
- });
320
-
321
- it('should detect TOML-based slash commands for Qwen', async () => {
322
- const dirPath = path.join(testDir, '.qwen', 'commands');
323
- await fs.mkdir(dirPath, { recursive: true });
324
- await fs.writeFile(path.join(dirPath, 'openspec-proposal.toml'), 'content');
325
-
326
- const result = await detectLegacySlashCommands(testDir);
327
- expect(result.files).toContain('.qwen/commands/openspec-proposal.toml');
328
- });
329
-
330
- it('should detect Continue prompt files', async () => {
331
- const dirPath = path.join(testDir, '.continue', 'prompts');
332
- await fs.mkdir(dirPath, { recursive: true });
333
- await fs.writeFile(path.join(dirPath, 'openspec-apply.prompt'), 'content');
334
-
335
- const result = await detectLegacySlashCommands(testDir);
336
- expect(result.files).toContain('.continue/prompts/openspec-apply.prompt');
337
- });
338
-
339
- it('should detect legacy OpenCode opsx-* command files', async () => {
340
- const dirPath = path.join(testDir, '.opencode', 'command');
341
- await fs.mkdir(dirPath, { recursive: true });
342
- await fs.writeFile(path.join(dirPath, 'opsx-propose.md'), 'content');
343
-
344
- const result = await detectLegacySlashCommands(testDir);
345
- expect(result.files).toContain('.opencode/command/opsx-propose.md');
346
- });
347
-
348
- it('should detect legacy OpenCode openspec-* command files', async () => {
349
- const dirPath = path.join(testDir, '.opencode', 'command');
350
- await fs.mkdir(dirPath, { recursive: true });
351
- await fs.writeFile(path.join(dirPath, 'openspec-new.md'), 'content');
352
-
353
- const result = await detectLegacySlashCommands(testDir);
354
- expect(result.files).toContain('.opencode/command/openspec-new.md');
355
- });
356
-
357
- it('should detect both opsx-* and openspec-* OpenCode command files', async () => {
358
- const dirPath = path.join(testDir, '.opencode', 'command');
359
- await fs.mkdir(dirPath, { recursive: true });
360
- await fs.writeFile(path.join(dirPath, 'opsx-propose.md'), 'content');
361
- await fs.writeFile(path.join(dirPath, 'openspec-new.md'), 'content');
362
-
363
- const result = await detectLegacySlashCommands(testDir);
364
- expect(result.files).toContain('.opencode/command/opsx-propose.md');
365
- expect(result.files).toContain('.opencode/command/openspec-new.md');
366
- });
367
- });
368
-
369
- describe('detectLegacyStructureFiles', () => {
370
- it('should detect openspec/AGENTS.md', async () => {
371
- const agentsPath = path.join(testDir, 'openspec', 'AGENTS.md');
372
- await fs.writeFile(agentsPath, '# AGENTS.md content');
373
-
374
- const result = await detectLegacyStructureFiles(testDir);
375
- expect(result.hasOpenspecAgents).toBe(true);
376
- });
377
-
378
- it('should detect openspec/project.md', async () => {
379
- const projectPath = path.join(testDir, 'openspec', 'project.md');
380
- await fs.writeFile(projectPath, '# Project content');
381
-
382
- const result = await detectLegacyStructureFiles(testDir);
383
- expect(result.hasProjectMd).toBe(true);
384
- });
385
-
386
- it('should detect root AGENTS.md with OpenSpec markers', async () => {
387
- const agentsPath = path.join(testDir, 'AGENTS.md');
388
- await fs.writeFile(agentsPath, `${OPENSPEC_MARKERS.start}
389
- OpenSpec content
390
- ${OPENSPEC_MARKERS.end}`);
391
-
392
- const result = await detectLegacyStructureFiles(testDir);
393
- expect(result.hasRootAgentsWithMarkers).toBe(true);
394
- });
395
-
396
- it('should not detect root AGENTS.md without markers', async () => {
397
- const agentsPath = path.join(testDir, 'AGENTS.md');
398
- await fs.writeFile(agentsPath, 'Plain content without markers');
399
-
400
- const result = await detectLegacyStructureFiles(testDir);
401
- expect(result.hasRootAgentsWithMarkers).toBe(false);
402
- });
403
-
404
- it('should handle non-existent files gracefully', async () => {
405
- const result = await detectLegacyStructureFiles(testDir);
406
- expect(result.hasOpenspecAgents).toBe(false);
407
- expect(result.hasProjectMd).toBe(false);
408
- expect(result.hasRootAgentsWithMarkers).toBe(false);
409
- });
410
- });
411
-
412
- describe('detectLegacyArtifacts', () => {
413
- it('should return hasLegacyArtifacts: false when nothing is found', async () => {
414
- const result = await detectLegacyArtifacts(testDir);
415
- expect(result.hasLegacyArtifacts).toBe(false);
416
- });
417
-
418
- it('should return hasLegacyArtifacts: true when config files are found', async () => {
419
- await fs.writeFile(path.join(testDir, 'CLAUDE.md'), `${OPENSPEC_MARKERS.start}\nContent\n${OPENSPEC_MARKERS.end}`);
420
-
421
- const result = await detectLegacyArtifacts(testDir);
422
- expect(result.hasLegacyArtifacts).toBe(true);
423
- expect(result.configFiles).toContain('CLAUDE.md');
424
- });
425
-
426
- it('should return hasLegacyArtifacts: true when slash commands are found', async () => {
427
- await fs.mkdir(path.join(testDir, '.claude', 'commands', 'openspec'), { recursive: true });
428
-
429
- const result = await detectLegacyArtifacts(testDir);
430
- expect(result.hasLegacyArtifacts).toBe(true);
431
- expect(result.slashCommandDirs).toContain('.claude/commands/openspec');
432
- });
433
-
434
- it('should return hasLegacyArtifacts: true when openspec/AGENTS.md is found', async () => {
435
- await fs.writeFile(path.join(testDir, 'openspec', 'AGENTS.md'), 'content');
436
-
437
- const result = await detectLegacyArtifacts(testDir);
438
- expect(result.hasLegacyArtifacts).toBe(true);
439
- expect(result.hasOpenspecAgents).toBe(true);
440
- });
441
-
442
- it('should detect project.md for migration hint (it is preserved, not deleted)', async () => {
443
- await fs.writeFile(path.join(testDir, 'openspec', 'project.md'), 'content');
444
-
445
- const result = await detectLegacyArtifacts(testDir);
446
- // project.md triggers hasLegacyArtifacts to show migration hint
447
- expect(result.hasLegacyArtifacts).toBe(true);
448
- expect(result.hasProjectMd).toBe(true);
449
- });
450
-
451
- it('should combine all detection results', async () => {
452
- // Create various legacy artifacts
453
- await fs.writeFile(path.join(testDir, 'CLAUDE.md'), `${OPENSPEC_MARKERS.start}\nContent\n${OPENSPEC_MARKERS.end}`);
454
- await fs.mkdir(path.join(testDir, '.claude', 'commands', 'openspec'), { recursive: true });
455
- await fs.writeFile(path.join(testDir, 'openspec', 'AGENTS.md'), 'content');
456
- await fs.writeFile(path.join(testDir, 'openspec', 'project.md'), 'content');
457
-
458
- const result = await detectLegacyArtifacts(testDir);
459
- expect(result.hasLegacyArtifacts).toBe(true);
460
- expect(result.configFiles).toContain('CLAUDE.md');
461
- expect(result.slashCommandDirs).toContain('.claude/commands/openspec');
462
- expect(result.hasOpenspecAgents).toBe(true);
463
- expect(result.hasProjectMd).toBe(true);
464
- });
465
- });
466
-
467
- describe('cleanupLegacyArtifacts', () => {
468
- it('should remove markers from config files that have only OpenSpec content (never delete)', async () => {
469
- const claudePath = path.join(testDir, 'CLAUDE.md');
470
- await fs.writeFile(claudePath, `${OPENSPEC_MARKERS.start}\nContent\n${OPENSPEC_MARKERS.end}`);
471
-
472
- const detection = await detectLegacyArtifacts(testDir);
473
- const result = await cleanupLegacyArtifacts(testDir, detection);
474
-
475
- // Config files should NEVER be deleted, only have markers removed
476
- expect(result.deletedFiles).not.toContain('CLAUDE.md');
477
- expect(result.modifiedFiles).toContain('CLAUDE.md');
478
- // File should still exist
479
- await expect(fs.access(claudePath)).resolves.not.toThrow();
480
- // File should be empty or have markers removed
481
- const content = await fs.readFile(claudePath, 'utf-8');
482
- expect(content).not.toContain(OPENSPEC_MARKERS.start);
483
- expect(content).not.toContain(OPENSPEC_MARKERS.end);
484
- });
485
-
486
- it('should remove marker block from files with mixed content', async () => {
487
- const claudePath = path.join(testDir, 'CLAUDE.md');
488
- await fs.writeFile(claudePath, `User instructions
489
- ${OPENSPEC_MARKERS.start}
490
- OpenSpec content
491
- ${OPENSPEC_MARKERS.end}`);
492
-
493
- const detection = await detectLegacyArtifacts(testDir);
494
- const result = await cleanupLegacyArtifacts(testDir, detection);
495
-
496
- expect(result.modifiedFiles).toContain('CLAUDE.md');
497
- const content = await fs.readFile(claudePath, 'utf-8');
498
- expect(content).toContain('User instructions');
499
- expect(content).not.toContain(OPENSPEC_MARKERS.start);
500
- });
501
-
502
- it('should delete legacy slash command directories', async () => {
503
- const dirPath = path.join(testDir, '.claude', 'commands', 'openspec');
504
- await fs.mkdir(dirPath, { recursive: true });
505
- await fs.writeFile(path.join(dirPath, 'proposal.md'), 'content');
506
-
507
- const detection = await detectLegacyArtifacts(testDir);
508
- const result = await cleanupLegacyArtifacts(testDir, detection);
509
-
510
- expect(result.deletedDirs).toContain('.claude/commands/openspec');
511
- await expect(fs.access(dirPath)).rejects.toThrow();
512
- // Parent directory should still exist
513
- await expect(fs.access(path.join(testDir, '.claude', 'commands'))).resolves.not.toThrow();
514
- });
515
-
516
- it('should delete legacy slash command files', async () => {
517
- const dirPath = path.join(testDir, '.cursor', 'commands');
518
- await fs.mkdir(dirPath, { recursive: true });
519
- const filePath = path.join(dirPath, 'openspec-proposal.md');
520
- await fs.writeFile(filePath, 'content');
521
-
522
- const detection = await detectLegacyArtifacts(testDir);
523
- const result = await cleanupLegacyArtifacts(testDir, detection);
524
-
525
- expect(result.deletedFiles).toContain('.cursor/commands/openspec-proposal.md');
526
- await expect(fs.access(filePath)).rejects.toThrow();
527
- });
528
-
529
- it('should delete openspec/AGENTS.md', async () => {
530
- const agentsPath = path.join(testDir, 'openspec', 'AGENTS.md');
531
- await fs.writeFile(agentsPath, 'content');
532
-
533
- const detection = await detectLegacyArtifacts(testDir);
534
- const result = await cleanupLegacyArtifacts(testDir, detection);
535
-
536
- expect(result.deletedFiles).toContain('openspec/AGENTS.md');
537
- await expect(fs.access(agentsPath)).rejects.toThrow();
538
- // openspec directory should still exist
539
- await expect(fs.access(path.join(testDir, 'openspec'))).resolves.not.toThrow();
540
- });
541
-
542
- it('should NOT delete openspec/project.md', async () => {
543
- const projectPath = path.join(testDir, 'openspec', 'project.md');
544
- await fs.writeFile(projectPath, 'User project content');
545
-
546
- const detection = await detectLegacyArtifacts(testDir);
547
- const result = await cleanupLegacyArtifacts(testDir, detection);
548
-
549
- expect(result.projectMdNeedsMigration).toBe(true);
550
- expect(result.deletedFiles).not.toContain('openspec/project.md');
551
- await expect(fs.access(projectPath)).resolves.not.toThrow();
552
- });
553
-
554
- it('should handle root AGENTS.md with mixed content', async () => {
555
- const agentsPath = path.join(testDir, 'AGENTS.md');
556
- await fs.writeFile(agentsPath, `User content
557
- ${OPENSPEC_MARKERS.start}
558
- OpenSpec content
559
- ${OPENSPEC_MARKERS.end}`);
560
-
561
- const detection = await detectLegacyArtifacts(testDir);
562
- const result = await cleanupLegacyArtifacts(testDir, detection);
563
-
564
- expect(result.modifiedFiles).toContain('AGENTS.md');
565
- const content = await fs.readFile(agentsPath, 'utf-8');
566
- expect(content).toContain('User content');
567
- expect(content).not.toContain(OPENSPEC_MARKERS.start);
568
- });
569
-
570
- it('should remove markers from root AGENTS.md even when only OpenSpec content (never delete)', async () => {
571
- const agentsPath = path.join(testDir, 'AGENTS.md');
572
- await fs.writeFile(agentsPath, `${OPENSPEC_MARKERS.start}\nOpenSpec content\n${OPENSPEC_MARKERS.end}`);
573
-
574
- const detection = await detectLegacyArtifacts(testDir);
575
- const result = await cleanupLegacyArtifacts(testDir, detection);
576
-
577
- // Root AGENTS.md should NEVER be deleted, only have markers removed
578
- expect(result.deletedFiles).not.toContain('AGENTS.md');
579
- expect(result.modifiedFiles).toContain('AGENTS.md');
580
- // File should still exist
581
- await expect(fs.access(agentsPath)).resolves.not.toThrow();
582
- });
583
-
584
- it('should report errors without stopping cleanup', async () => {
585
- // Create a valid detection result with a non-existent file to simulate error
586
- const detection = {
587
- configFiles: ['NON_EXISTENT.md'],
588
- configFilesToUpdate: ['NON_EXISTENT.md'],
589
- slashCommandDirs: [],
590
- slashCommandFiles: [],
591
- hasOpenspecAgents: false,
592
- hasProjectMd: false,
593
- hasRootAgentsWithMarkers: false,
594
- hasLegacyArtifacts: true,
595
- };
596
-
597
- const result = await cleanupLegacyArtifacts(testDir, detection);
598
-
599
- // Should not throw, but should record the error
600
- expect(result.errors.length).toBeGreaterThan(0);
601
- expect(result.errors[0]).toContain('NON_EXISTENT.md');
602
- });
603
- });
604
-
605
- describe('formatCleanupSummary', () => {
606
- it('should format deleted files', () => {
607
- const result = {
608
- deletedFiles: ['CLAUDE.md', 'CLINE.md'],
609
- modifiedFiles: [],
610
- deletedDirs: [],
611
- projectMdNeedsMigration: false,
612
- errors: [],
613
- };
614
-
615
- const summary = formatCleanupSummary(result);
616
- expect(summary).toContain('Cleaned up legacy files:');
617
- expect(summary).toContain('✓ Removed CLAUDE.md');
618
- expect(summary).toContain('✓ Removed CLINE.md');
619
- });
620
-
621
- it('should format deleted directories', () => {
622
- const result = {
623
- deletedFiles: [],
624
- modifiedFiles: [],
625
- deletedDirs: ['.claude/commands/openspec'],
626
- projectMdNeedsMigration: false,
627
- errors: [],
628
- };
629
-
630
- const summary = formatCleanupSummary(result);
631
- expect(summary).toContain('✓ Removed .claude/commands/openspec/ (replaced by /opsx:*)');
632
- });
633
-
634
- it('should format modified files', () => {
635
- const result = {
636
- deletedFiles: [],
637
- modifiedFiles: ['AGENTS.md'],
638
- deletedDirs: [],
639
- projectMdNeedsMigration: false,
640
- errors: [],
641
- };
642
-
643
- const summary = formatCleanupSummary(result);
644
- expect(summary).toContain('✓ Removed OpenSpec markers from AGENTS.md');
645
- });
646
-
647
- it('should include migration hint for project.md', () => {
648
- const result = {
649
- deletedFiles: [],
650
- modifiedFiles: [],
651
- deletedDirs: [],
652
- projectMdNeedsMigration: true,
653
- errors: [],
654
- };
655
-
656
- const summary = formatCleanupSummary(result);
657
- expect(summary).toContain('Needs your attention');
658
- expect(summary).toContain('openspec/project.md');
659
- expect(summary).toContain('config.yaml');
660
- });
661
-
662
- it('should include errors', () => {
663
- const result = {
664
- deletedFiles: [],
665
- modifiedFiles: [],
666
- deletedDirs: [],
667
- projectMdNeedsMigration: false,
668
- errors: ['Failed to delete CLAUDE.md: Permission denied'],
669
- };
670
-
671
- const summary = formatCleanupSummary(result);
672
- expect(summary).toContain('Errors during cleanup:');
673
- expect(summary).toContain('Failed to delete CLAUDE.md');
674
- });
675
-
676
- it('should return empty string when nothing to report', () => {
677
- const result = {
678
- deletedFiles: [],
679
- modifiedFiles: [],
680
- deletedDirs: [],
681
- projectMdNeedsMigration: false,
682
- errors: [],
683
- };
684
-
685
- const summary = formatCleanupSummary(result);
686
- expect(summary).toBe('');
687
- });
688
- });
689
-
690
- describe('formatDetectionSummary', () => {
691
- it('should include welcoming upgrade header and explanation', () => {
692
- const detection = {
693
- configFiles: ['CLAUDE.md'],
694
- configFilesToUpdate: ['CLAUDE.md'],
695
- slashCommandDirs: [],
696
- slashCommandFiles: [],
697
- hasOpenspecAgents: false,
698
- hasProjectMd: false,
699
- hasRootAgentsWithMarkers: false,
700
- hasLegacyArtifacts: true,
701
- };
702
-
703
- const summary = formatDetectionSummary(detection);
704
- expect(summary).toContain('Upgrading to the new OpenSpec');
705
- expect(summary).toContain('agent skills');
706
- expect(summary).toContain('keeping everything working');
707
- });
708
-
709
- it('should format config files as files to update (never remove)', () => {
710
- const detection = {
711
- configFiles: ['CLAUDE.md'],
712
- configFilesToUpdate: ['CLAUDE.md'],
713
- slashCommandDirs: [],
714
- slashCommandFiles: [],
715
- hasOpenspecAgents: false,
716
- hasProjectMd: false,
717
- hasRootAgentsWithMarkers: false,
718
- hasLegacyArtifacts: true,
719
- };
720
-
721
- const summary = formatDetectionSummary(detection);
722
- // Config files should be in "Files to update", not "Files to remove"
723
- expect(summary).toContain('Files to update');
724
- expect(summary).toContain('• CLAUDE.md');
725
- // Should NOT be in removals
726
- expect(summary).not.toContain('No user content to preserve');
727
- });
728
-
729
- it('should format files to be updated', () => {
730
- const detection = {
731
- configFiles: ['CLINE.md'],
732
- configFilesToUpdate: ['CLINE.md'],
733
- slashCommandDirs: [],
734
- slashCommandFiles: [],
735
- hasOpenspecAgents: false,
736
- hasProjectMd: false,
737
- hasRootAgentsWithMarkers: false,
738
- hasLegacyArtifacts: true,
739
- };
740
-
741
- const summary = formatDetectionSummary(detection);
742
- expect(summary).toContain('Files to update');
743
- expect(summary).toContain('markers will be removed');
744
- expect(summary).toContain('your content preserved');
745
- expect(summary).toContain('• CLINE.md');
746
- });
747
-
748
- it('should format slash command directories', () => {
749
- const detection = {
750
- configFiles: [],
751
- configFilesToUpdate: [],
752
- slashCommandDirs: ['.claude/commands/openspec'],
753
- slashCommandFiles: [],
754
- hasOpenspecAgents: false,
755
- hasProjectMd: false,
756
- hasRootAgentsWithMarkers: false,
757
- hasLegacyArtifacts: true,
758
- };
759
-
760
- const summary = formatDetectionSummary(detection);
761
- expect(summary).toContain('Files to remove');
762
- expect(summary).toContain('• .claude/commands/openspec/');
763
- });
764
-
765
- it('should format slash command files', () => {
766
- const detection = {
767
- configFiles: [],
768
- configFilesToUpdate: [],
769
- slashCommandDirs: [],
770
- slashCommandFiles: ['.cursor/commands/openspec-proposal.md'],
771
- hasOpenspecAgents: false,
772
- hasProjectMd: false,
773
- hasRootAgentsWithMarkers: false,
774
- hasLegacyArtifacts: true,
775
- };
776
-
777
- const summary = formatDetectionSummary(detection);
778
- expect(summary).toContain('Files to remove');
779
- expect(summary).toContain('• .cursor/commands/openspec-proposal.md');
780
- });
781
-
782
- it('should format openspec/AGENTS.md', () => {
783
- const detection = {
784
- configFiles: [],
785
- configFilesToUpdate: [],
786
- slashCommandDirs: [],
787
- slashCommandFiles: [],
788
- hasOpenspecAgents: true,
789
- hasProjectMd: false,
790
- hasRootAgentsWithMarkers: false,
791
- hasLegacyArtifacts: true,
792
- };
793
-
794
- const summary = formatDetectionSummary(detection);
795
- expect(summary).toContain('Files to remove');
796
- expect(summary).toContain('• openspec/AGENTS.md');
797
- });
798
-
799
- it('should include attention section for project.md', () => {
800
- const detection = {
801
- configFiles: [],
802
- configFilesToUpdate: [],
803
- slashCommandDirs: [],
804
- slashCommandFiles: [],
805
- hasOpenspecAgents: false,
806
- hasProjectMd: true,
807
- hasRootAgentsWithMarkers: false,
808
- hasLegacyArtifacts: false,
809
- };
810
-
811
- const summary = formatDetectionSummary(detection);
812
- expect(summary).toContain('Needs your attention');
813
- expect(summary).toContain('• openspec/project.md');
814
- expect(summary).toContain('won\'t delete this file');
815
- expect(summary).toContain('config.yaml');
816
- expect(summary).toContain('"context:"');
817
- });
818
-
819
- it('should include attention section with other legacy artifacts', () => {
820
- const detection = {
821
- configFiles: ['CLAUDE.md'],
822
- configFilesToUpdate: ['CLAUDE.md'],
823
- slashCommandDirs: [],
824
- slashCommandFiles: [],
825
- hasOpenspecAgents: false,
826
- hasProjectMd: true,
827
- hasRootAgentsWithMarkers: false,
828
- hasLegacyArtifacts: true,
829
- };
830
-
831
- const summary = formatDetectionSummary(detection);
832
- // Config files now in "Files to update", not "Files to remove"
833
- expect(summary).toContain('Files to update');
834
- expect(summary).toContain('CLAUDE.md');
835
- expect(summary).toContain('Needs your attention');
836
- expect(summary).toContain('openspec/project.md');
837
- });
838
-
839
- it('should group both removals and updates correctly', () => {
840
- const detection = {
841
- configFiles: ['CLAUDE.md', 'CLINE.md'],
842
- configFilesToUpdate: ['CLAUDE.md', 'CLINE.md'],
843
- slashCommandDirs: ['.claude/commands/openspec'],
844
- slashCommandFiles: [],
845
- hasOpenspecAgents: true,
846
- hasProjectMd: false,
847
- hasRootAgentsWithMarkers: false,
848
- hasLegacyArtifacts: true,
849
- };
850
-
851
- const summary = formatDetectionSummary(detection);
852
- // Check both sections exist
853
- expect(summary).toContain('Files to remove');
854
- expect(summary).toContain('Files to update');
855
- // Check removals (only slash commands and openspec/AGENTS.md)
856
- expect(summary).toContain('• .claude/commands/openspec/');
857
- expect(summary).toContain('• openspec/AGENTS.md');
858
- // Check updates (all config files)
859
- expect(summary).toContain('• CLAUDE.md');
860
- expect(summary).toContain('• CLINE.md');
861
- });
862
-
863
- it('should return empty string when nothing is detected', () => {
864
- const detection = {
865
- configFiles: [],
866
- configFilesToUpdate: [],
867
- slashCommandDirs: [],
868
- slashCommandFiles: [],
869
- hasOpenspecAgents: false,
870
- hasProjectMd: false,
871
- hasRootAgentsWithMarkers: false,
872
- hasLegacyArtifacts: false,
873
- };
874
-
875
- const summary = formatDetectionSummary(detection);
876
- expect(summary).toBe('');
877
- });
878
- });
879
-
880
- describe('formatProjectMdMigrationHint', () => {
881
- it('should return migration hint message', () => {
882
- const hint = formatProjectMdMigrationHint();
883
- expect(hint).toContain('Needs your attention');
884
- expect(hint).toContain('openspec/project.md');
885
- expect(hint).toContain('won\'t delete this file');
886
- expect(hint).toContain('config.yaml');
887
- expect(hint).toContain('"context:"');
888
- });
889
-
890
- it('should include actionable instructions', () => {
891
- const hint = formatProjectMdMigrationHint();
892
- expect(hint).toContain('move any useful content');
893
- expect(hint).toContain('delete the file when ready');
894
- });
895
-
896
- it('should explain the new context section benefits', () => {
897
- const hint = formatProjectMdMigrationHint();
898
- expect(hint).toContain('included in every OpenSpec request');
899
- expect(hint).toContain('reliably');
900
- });
901
- });
902
-
903
- describe('LEGACY_CONFIG_FILES', () => {
904
- it('should include expected config file names', () => {
905
- expect(LEGACY_CONFIG_FILES).toContain('CLAUDE.md');
906
- expect(LEGACY_CONFIG_FILES).toContain('CLINE.md');
907
- expect(LEGACY_CONFIG_FILES).toContain('CODEBUDDY.md');
908
- expect(LEGACY_CONFIG_FILES).toContain('COSTRICT.md');
909
- expect(LEGACY_CONFIG_FILES).toContain('QODER.md');
910
- expect(LEGACY_CONFIG_FILES).toContain('IFLOW.md');
911
- expect(LEGACY_CONFIG_FILES).toContain('AGENTS.md');
912
- expect(LEGACY_CONFIG_FILES).toContain('QWEN.md');
913
- });
914
- });
915
-
916
- describe('LEGACY_SLASH_COMMAND_PATHS', () => {
917
- it('should include expected tool patterns', () => {
918
- expect(LEGACY_SLASH_COMMAND_PATHS['claude']).toEqual({
919
- type: 'directory',
920
- path: '.claude/commands/openspec',
921
- });
922
-
923
- expect(LEGACY_SLASH_COMMAND_PATHS['cursor']).toEqual({
924
- type: 'files',
925
- pattern: '.cursor/commands/openspec-*.md',
926
- });
927
-
928
- expect(LEGACY_SLASH_COMMAND_PATHS['windsurf']).toEqual({
929
- type: 'files',
930
- pattern: '.windsurf/workflows/openspec-*.md',
931
- });
932
- });
933
-
934
- it('should only include legacy tool IDs that are present in the CommandAdapterRegistry', () => {
935
- const registeredTools = new Set(CommandAdapterRegistry.getAll().map(adapter => adapter.toolId));
936
-
937
- // Verify all legacy map entries correspond to known adapters
938
- for (const tool of Object.keys(LEGACY_SLASH_COMMAND_PATHS)) {
939
- expect(registeredTools.has(tool)).toBe(true);
940
- }
941
-
942
- // Pi was never a pre-1.0 legacy tool
943
- expect(LEGACY_SLASH_COMMAND_PATHS).not.toHaveProperty('pi');
944
- });
945
- });
946
-
947
- describe('getToolsFromLegacyArtifacts', () => {
948
- it('should extract claude from directory-based legacy artifacts', () => {
949
- const detection = {
950
- configFiles: [],
951
- configFilesToUpdate: [],
952
- slashCommandDirs: ['.claude/commands/openspec'],
953
- slashCommandFiles: [],
954
- hasOpenspecAgents: false,
955
- hasProjectMd: false,
956
- hasRootAgentsWithMarkers: false,
957
- hasLegacyArtifacts: true,
958
- };
959
-
960
- const tools = getToolsFromLegacyArtifacts(detection);
961
- expect(tools).toContain('claude');
962
- expect(tools).toHaveLength(1);
963
- });
964
-
965
- it('should extract cursor from file-based legacy artifacts', () => {
966
- const detection = {
967
- configFiles: [],
968
- configFilesToUpdate: [],
969
- slashCommandDirs: [],
970
- slashCommandFiles: ['.cursor/commands/openspec-proposal.md'],
971
- hasOpenspecAgents: false,
972
- hasProjectMd: false,
973
- hasRootAgentsWithMarkers: false,
974
- hasLegacyArtifacts: true,
975
- };
976
-
977
- const tools = getToolsFromLegacyArtifacts(detection);
978
- expect(tools).toContain('cursor');
979
- expect(tools).toHaveLength(1);
980
- });
981
-
982
- it('should extract multiple tools from mixed legacy artifacts', () => {
983
- const detection = {
984
- configFiles: [],
985
- configFilesToUpdate: [],
986
- slashCommandDirs: ['.claude/commands/openspec', '.qoder/commands/openspec'],
987
- slashCommandFiles: ['.cursor/commands/openspec-apply.md', '.windsurf/workflows/openspec-archive.md'],
988
- hasOpenspecAgents: false,
989
- hasProjectMd: false,
990
- hasRootAgentsWithMarkers: false,
991
- hasLegacyArtifacts: true,
992
- };
993
-
994
- const tools = getToolsFromLegacyArtifacts(detection);
995
- expect(tools).toContain('claude');
996
- expect(tools).toContain('qoder');
997
- expect(tools).toContain('cursor');
998
- expect(tools).toContain('windsurf');
999
- expect(tools).toHaveLength(4);
1000
- });
1001
-
1002
- it('should deduplicate tools when multiple files match same tool', () => {
1003
- const detection = {
1004
- configFiles: [],
1005
- configFilesToUpdate: [],
1006
- slashCommandDirs: [],
1007
- slashCommandFiles: [
1008
- '.cursor/commands/openspec-proposal.md',
1009
- '.cursor/commands/openspec-apply.md',
1010
- '.cursor/commands/openspec-archive.md',
1011
- ],
1012
- hasOpenspecAgents: false,
1013
- hasProjectMd: false,
1014
- hasRootAgentsWithMarkers: false,
1015
- hasLegacyArtifacts: true,
1016
- };
1017
-
1018
- const tools = getToolsFromLegacyArtifacts(detection);
1019
- expect(tools).toContain('cursor');
1020
- expect(tools).toHaveLength(1);
1021
- });
1022
-
1023
- it('should return empty array when no legacy artifacts', () => {
1024
- const detection = {
1025
- configFiles: [],
1026
- configFilesToUpdate: [],
1027
- slashCommandDirs: [],
1028
- slashCommandFiles: [],
1029
- hasOpenspecAgents: false,
1030
- hasProjectMd: false,
1031
- hasRootAgentsWithMarkers: false,
1032
- hasLegacyArtifacts: false,
1033
- };
1034
-
1035
- const tools = getToolsFromLegacyArtifacts(detection);
1036
- expect(tools).toHaveLength(0);
1037
- });
1038
-
1039
- it('should handle qwen TOML-based legacy files', () => {
1040
- const detection = {
1041
- configFiles: [],
1042
- configFilesToUpdate: [],
1043
- slashCommandDirs: [],
1044
- slashCommandFiles: ['.qwen/commands/openspec-proposal.toml'],
1045
- hasOpenspecAgents: false,
1046
- hasProjectMd: false,
1047
- hasRootAgentsWithMarkers: false,
1048
- hasLegacyArtifacts: true,
1049
- };
1050
-
1051
- const tools = getToolsFromLegacyArtifacts(detection);
1052
- expect(tools).toContain('qwen');
1053
- expect(tools).toHaveLength(1);
1054
- });
1055
-
1056
- it('should handle continue prompt files', () => {
1057
- const detection = {
1058
- configFiles: [],
1059
- configFilesToUpdate: [],
1060
- slashCommandDirs: [],
1061
- slashCommandFiles: ['.continue/prompts/openspec-apply.prompt'],
1062
- hasOpenspecAgents: false,
1063
- hasProjectMd: false,
1064
- hasRootAgentsWithMarkers: false,
1065
- hasLegacyArtifacts: true,
1066
- };
1067
-
1068
- const tools = getToolsFromLegacyArtifacts(detection);
1069
- expect(tools).toContain('continue');
1070
- expect(tools).toHaveLength(1);
1071
- });
1072
-
1073
- it('should handle github-copilot prompt files', () => {
1074
- const detection = {
1075
- configFiles: [],
1076
- configFilesToUpdate: [],
1077
- slashCommandDirs: [],
1078
- slashCommandFiles: ['.github/prompts/openspec-apply.prompt.md'],
1079
- hasOpenspecAgents: false,
1080
- hasProjectMd: false,
1081
- hasRootAgentsWithMarkers: false,
1082
- hasLegacyArtifacts: true,
1083
- };
1084
-
1085
- const tools = getToolsFromLegacyArtifacts(detection);
1086
- expect(tools).toContain('github-copilot');
1087
- expect(tools).toHaveLength(1);
1088
- });
1089
-
1090
- it('should handle opencode opsx-* legacy files', () => {
1091
- const detection = {
1092
- configFiles: [],
1093
- configFilesToUpdate: [],
1094
- slashCommandDirs: [],
1095
- slashCommandFiles: ['.opencode/command/opsx-propose.md'],
1096
- hasOpenspecAgents: false,
1097
- hasProjectMd: false,
1098
- hasRootAgentsWithMarkers: false,
1099
- hasLegacyArtifacts: true,
1100
- };
1101
-
1102
- const tools = getToolsFromLegacyArtifacts(detection);
1103
- expect(tools).toContain('opencode');
1104
- expect(tools).toHaveLength(1);
1105
- });
1106
-
1107
- it('should handle opencode openspec-* legacy files', () => {
1108
- const detection = {
1109
- configFiles: [],
1110
- configFilesToUpdate: [],
1111
- slashCommandDirs: [],
1112
- slashCommandFiles: ['.opencode/command/openspec-new.md'],
1113
- hasOpenspecAgents: false,
1114
- hasProjectMd: false,
1115
- hasRootAgentsWithMarkers: false,
1116
- hasLegacyArtifacts: true,
1117
- };
1118
-
1119
- const tools = getToolsFromLegacyArtifacts(detection);
1120
- expect(tools).toContain('opencode');
1121
- expect(tools).toHaveLength(1);
1122
- });
1123
-
1124
- it('should deduplicate opencode when both opsx-* and openspec-* files exist', () => {
1125
- const detection = {
1126
- configFiles: [],
1127
- configFilesToUpdate: [],
1128
- slashCommandDirs: [],
1129
- slashCommandFiles: [
1130
- '.opencode/command/opsx-propose.md',
1131
- '.opencode/command/openspec-new.md',
1132
- ],
1133
- hasOpenspecAgents: false,
1134
- hasProjectMd: false,
1135
- hasRootAgentsWithMarkers: false,
1136
- hasLegacyArtifacts: true,
1137
- };
1138
-
1139
- const tools = getToolsFromLegacyArtifacts(detection);
1140
- expect(tools).toContain('opencode');
1141
- expect(tools).toHaveLength(1);
1142
- });
1143
-
1144
- it('should not extract tools from config files only', () => {
1145
- // Config files don't indicate which tools were configured
1146
- // Only slash command dirs/files tell us which tools to upgrade
1147
- const detection = {
1148
- configFiles: ['CLAUDE.md'],
1149
- configFilesToUpdate: ['CLAUDE.md'],
1150
- slashCommandDirs: [],
1151
- slashCommandFiles: [],
1152
- hasOpenspecAgents: true,
1153
- hasProjectMd: false,
1154
- hasRootAgentsWithMarkers: false,
1155
- hasLegacyArtifacts: true,
1156
- };
1157
-
1158
- const tools = getToolsFromLegacyArtifacts(detection);
1159
- expect(tools).toHaveLength(0);
1160
- });
1161
- });
1162
- });