sauron-cli 1.3.0 → 1.4.0

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