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,824 +0,0 @@
1
- import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
2
- import { PowerShellInstaller } from '../../../../src/core/completions/installers/powershell-installer.js';
3
- import { promises as fs } from 'fs';
4
- import path from 'path';
5
- import os from 'os';
6
- import { randomUUID } from 'crypto';
7
-
8
- describe('PowerShellInstaller', () => {
9
- let testHomeDir: string;
10
- let installer: PowerShellInstaller;
11
- let originalPlatform: NodeJS.Platform;
12
- let originalEnv: NodeJS.ProcessEnv;
13
-
14
- beforeEach(async () => {
15
- testHomeDir = path.join(os.tmpdir(), `openspec-powershell-test-${randomUUID()}`);
16
- await fs.mkdir(testHomeDir, { recursive: true });
17
- installer = new PowerShellInstaller(testHomeDir);
18
- originalPlatform = process.platform;
19
- originalEnv = { ...process.env };
20
- });
21
-
22
- afterEach(async () => {
23
- await fs.rm(testHomeDir, { recursive: true, force: true });
24
- // Restore platform and environment
25
- Object.defineProperty(process, 'platform', {
26
- value: originalPlatform,
27
- });
28
- process.env = originalEnv;
29
- });
30
-
31
- describe('getProfilePath', () => {
32
- it('should prefer PROFILE environment variable when set', () => {
33
- process.env.PROFILE = '/custom/profile/path.ps1';
34
- const result = installer.getProfilePath();
35
- expect(result).toBe('/custom/profile/path.ps1');
36
- });
37
-
38
- it('should return Windows default path when on win32 platform', () => {
39
- delete process.env.PROFILE;
40
- Object.defineProperty(process, 'platform', {
41
- value: 'win32',
42
- });
43
-
44
- const result = installer.getProfilePath();
45
- expect(result).toBe(path.join(testHomeDir, 'Documents', 'PowerShell', 'Microsoft.PowerShell_profile.ps1'));
46
- });
47
-
48
- it('should return Unix default path when on darwin platform', () => {
49
- delete process.env.PROFILE;
50
- Object.defineProperty(process, 'platform', {
51
- value: 'darwin',
52
- });
53
-
54
- const result = installer.getProfilePath();
55
- expect(result).toBe(path.join(testHomeDir, '.config', 'powershell', 'Microsoft.PowerShell_profile.ps1'));
56
- });
57
-
58
- it('should return Unix default path when on linux platform', () => {
59
- delete process.env.PROFILE;
60
- Object.defineProperty(process, 'platform', {
61
- value: 'linux',
62
- });
63
-
64
- const result = installer.getProfilePath();
65
- expect(result).toBe(path.join(testHomeDir, '.config', 'powershell', 'Microsoft.PowerShell_profile.ps1'));
66
- });
67
- });
68
-
69
- describe('getInstallationPath', () => {
70
- it('should return path relative to profile directory', () => {
71
- delete process.env.PROFILE;
72
- Object.defineProperty(process, 'platform', {
73
- value: 'darwin',
74
- });
75
-
76
- const result = installer.getInstallationPath();
77
- expect(result).toBe(path.join(testHomeDir, '.config', 'powershell', 'OpenSpecCompletion.ps1'));
78
- });
79
-
80
- it('should work with custom PROFILE environment variable', () => {
81
- process.env.PROFILE = path.join(testHomeDir, 'custom', 'profile.ps1');
82
- const result = installer.getInstallationPath();
83
- expect(result).toBe(path.join(testHomeDir, 'custom', 'OpenSpecCompletion.ps1'));
84
- });
85
-
86
- it('should return Windows path when on Windows platform', () => {
87
- delete process.env.PROFILE;
88
- Object.defineProperty(process, 'platform', {
89
- value: 'win32',
90
- });
91
-
92
- const result = installer.getInstallationPath();
93
- expect(result).toBe(path.join(testHomeDir, 'Documents', 'PowerShell', 'OpenSpecCompletion.ps1'));
94
- });
95
- });
96
-
97
- describe('backupExistingFile', () => {
98
- it('should return undefined when file does not exist', async () => {
99
- const nonExistentPath = path.join(testHomeDir, 'does-not-exist.ps1');
100
- const backupPath = await installer.backupExistingFile(nonExistentPath);
101
- expect(backupPath).toBeUndefined();
102
- });
103
-
104
- it('should create backup with timestamp in filename', async () => {
105
- const filePath = path.join(testHomeDir, 'test.ps1');
106
- await fs.writeFile(filePath, 'test content');
107
-
108
- const backupPath = await installer.backupExistingFile(filePath);
109
-
110
- expect(backupPath).toBeDefined();
111
- expect(backupPath).toMatch(/\.backup-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}/);
112
- });
113
-
114
- it('should copy file content to backup', async () => {
115
- const filePath = path.join(testHomeDir, 'test.ps1');
116
- const originalContent = '# Original PowerShell completion script\n$completer = {}';
117
- await fs.writeFile(filePath, originalContent);
118
-
119
- const backupPath = await installer.backupExistingFile(filePath);
120
-
121
- expect(backupPath).toBeDefined();
122
- const backupContent = await fs.readFile(backupPath!, 'utf-8');
123
- expect(backupContent).toBe(originalContent);
124
- });
125
-
126
- it('should create backup next to original file', async () => {
127
- const filePath = path.join(testHomeDir, 'subdir', 'test.ps1');
128
- await fs.mkdir(path.dirname(filePath), { recursive: true });
129
- await fs.writeFile(filePath, 'content');
130
-
131
- const backupPath = await installer.backupExistingFile(filePath);
132
-
133
- expect(backupPath).toBeDefined();
134
- expect(path.dirname(backupPath!)).toBe(path.dirname(filePath));
135
- });
136
- });
137
-
138
- describe('configureProfile', () => {
139
- const mockScriptPath = '/path/to/OpenSpecCompletion.ps1';
140
-
141
- // Note: OPENSPEC_NO_AUTO_CONFIG check is now handled in the install() method,
142
- // not in configureProfile() itself
143
-
144
- it('should create profile with markers when file does not exist', async () => {
145
- delete process.env.OPENSPEC_NO_AUTO_CONFIG;
146
- const profilePath = installer.getProfilePath();
147
-
148
- const result = await installer.configureProfile(mockScriptPath);
149
-
150
- expect(result).toBe(true);
151
- const content = await fs.readFile(profilePath, 'utf-8');
152
- expect(content).toContain('# OPENSPEC:START');
153
- expect(content).toContain('# OPENSPEC:END');
154
- expect(content).toContain(`. "${mockScriptPath}"`);
155
- });
156
-
157
- it('should prepend markers and config when file exists without markers', async () => {
158
- delete process.env.OPENSPEC_NO_AUTO_CONFIG;
159
- const profilePath = installer.getProfilePath();
160
- await fs.mkdir(path.dirname(profilePath), { recursive: true });
161
- await fs.writeFile(profilePath, '# My custom PowerShell config\nWrite-Host "Hello"');
162
-
163
- const result = await installer.configureProfile(mockScriptPath);
164
-
165
- expect(result).toBe(true);
166
- const content = await fs.readFile(profilePath, 'utf-8');
167
- expect(content).toContain('# OPENSPEC:START');
168
- expect(content).toContain('# OPENSPEC:END');
169
- expect(content).toContain(mockScriptPath);
170
- expect(content).toContain('# My custom PowerShell config');
171
- expect(content).toContain('Write-Host "Hello"');
172
- });
173
-
174
- // Skip on Windows: Windows has dual profile paths (PowerShell Core + Windows PowerShell 5.1),
175
- // so even if one profile is already configured, the second one will be configured and return true
176
- it.skipIf(process.platform === 'win32')('should skip configuration when script line already exists', async () => {
177
- delete process.env.OPENSPEC_NO_AUTO_CONFIG;
178
- const profilePath = installer.getProfilePath();
179
- await fs.mkdir(path.dirname(profilePath), { recursive: true });
180
-
181
- const initialContent = [
182
- '# OPENSPEC:START - OpenSpec completion (managed block, do not edit manually)',
183
- `. "${mockScriptPath}"`,
184
- '# OPENSPEC:END',
185
- '',
186
- '# My custom config',
187
- 'Write-Host "Custom"',
188
- ].join('\n');
189
-
190
- await fs.writeFile(profilePath, initialContent);
191
-
192
- const result = await installer.configureProfile(mockScriptPath);
193
-
194
- // Should return false because already configured (anyConfigured = false)
195
- expect(result).toBe(false);
196
- const content = await fs.readFile(profilePath, 'utf-8');
197
- // Content should be unchanged
198
- expect(content).toBe(initialContent);
199
- });
200
-
201
- it('should preserve user content outside markers', async () => {
202
- delete process.env.OPENSPEC_NO_AUTO_CONFIG;
203
- const profilePath = installer.getProfilePath();
204
- await fs.mkdir(path.dirname(profilePath), { recursive: true });
205
-
206
- const initialContent = [
207
- '# User config before',
208
- 'Set-Variable -Name "test" -Value "before"',
209
- '',
210
- '# OPENSPEC:START',
211
- '# Old config',
212
- '# OPENSPEC:END',
213
- '',
214
- '# User config after',
215
- 'Set-Variable -Name "test" -Value "after"',
216
- ].join('\n');
217
-
218
- await fs.writeFile(profilePath, initialContent);
219
-
220
- const result = await installer.configureProfile(mockScriptPath);
221
-
222
- expect(result).toBe(true);
223
- const content = await fs.readFile(profilePath, 'utf-8');
224
- expect(content).toContain('# User config before');
225
- expect(content).toContain('Set-Variable -Name "test" -Value "before"');
226
- expect(content).toContain('# User config after');
227
- expect(content).toContain('Set-Variable -Name "test" -Value "after"');
228
- });
229
-
230
- it('should generate correct PowerShell syntax in config', async () => {
231
- delete process.env.OPENSPEC_NO_AUTO_CONFIG;
232
- const profilePath = installer.getProfilePath();
233
-
234
- await installer.configureProfile(mockScriptPath);
235
-
236
- const content = await fs.readFile(profilePath, 'utf-8');
237
- expect(content).toContain('# OPENSPEC:START');
238
- expect(content).toContain(`. "${mockScriptPath}"`);
239
- expect(content).toContain('# OPENSPEC:END');
240
- });
241
-
242
- // Skip on Windows: fs.chmod() doesn't reliably restrict write access on Windows
243
- // (admin users can bypass read-only attribute, and CI runners often have elevated privileges)
244
- it.skipIf(process.platform === 'win32')('should return false on write permission error', async () => {
245
- delete process.env.OPENSPEC_NO_AUTO_CONFIG;
246
- const profilePath = installer.getProfilePath();
247
- await fs.mkdir(path.dirname(profilePath), { recursive: true });
248
- await fs.writeFile(profilePath, '# Test');
249
-
250
- // Make file read-only
251
- await fs.chmod(profilePath, 0o444);
252
-
253
- const result = await installer.configureProfile(mockScriptPath);
254
-
255
- // Restore permissions for cleanup
256
- await fs.chmod(profilePath, 0o644);
257
-
258
- expect(result).toBe(false);
259
- });
260
- });
261
-
262
- describe('removeProfileConfig', () => {
263
- it('should return false when profile does not exist', async () => {
264
- const result = await installer.removeProfileConfig();
265
- expect(result).toBe(false);
266
- });
267
-
268
- it('should return false when profile exists but has no markers', async () => {
269
- const profilePath = installer.getProfilePath();
270
- await fs.mkdir(path.dirname(profilePath), { recursive: true });
271
- await fs.writeFile(profilePath, '# My custom config\nWrite-Host "Hello"');
272
-
273
- const result = await installer.removeProfileConfig();
274
-
275
- expect(result).toBe(false);
276
- const content = await fs.readFile(profilePath, 'utf-8');
277
- expect(content).toBe('# My custom config\nWrite-Host "Hello"');
278
- });
279
-
280
- it('should remove content between markers', async () => {
281
- const profilePath = installer.getProfilePath();
282
- await fs.mkdir(path.dirname(profilePath), { recursive: true });
283
-
284
- const initialContent = [
285
- '# OPENSPEC:START',
286
- '# OpenSpec completions',
287
- 'if (Test-Path "/path") {',
288
- ' . "/path"',
289
- '}',
290
- '# OPENSPEC:END',
291
- '',
292
- '# My config',
293
- ].join('\n');
294
-
295
- await fs.writeFile(profilePath, initialContent);
296
-
297
- const result = await installer.removeProfileConfig();
298
-
299
- expect(result).toBe(true);
300
- const content = await fs.readFile(profilePath, 'utf-8');
301
- expect(content).not.toContain('# OPENSPEC:START');
302
- expect(content).not.toContain('# OPENSPEC:END');
303
- expect(content).not.toContain('# OpenSpec completions');
304
- expect(content).toContain('# My config');
305
- });
306
-
307
- it('should remove trailing empty lines after removal', async () => {
308
- const profilePath = installer.getProfilePath();
309
- await fs.mkdir(path.dirname(profilePath), { recursive: true });
310
-
311
- const initialContent = [
312
- '# User config',
313
- '# OPENSPEC:START',
314
- '# Config',
315
- '# OPENSPEC:END',
316
- '',
317
- '',
318
- ].join('\n');
319
-
320
- await fs.writeFile(profilePath, initialContent);
321
-
322
- const result = await installer.removeProfileConfig();
323
-
324
- expect(result).toBe(true);
325
- const content = await fs.readFile(profilePath, 'utf-8');
326
- expect(content).toBe('# User config\n');
327
- });
328
-
329
- it('should preserve user content outside markers', async () => {
330
- const profilePath = installer.getProfilePath();
331
- await fs.mkdir(path.dirname(profilePath), { recursive: true });
332
-
333
- const initialContent = [
334
- '# Before',
335
- '# OPENSPEC:START',
336
- '# OpenSpec',
337
- '# OPENSPEC:END',
338
- '# After',
339
- ].join('\n');
340
-
341
- await fs.writeFile(profilePath, initialContent);
342
-
343
- const result = await installer.removeProfileConfig();
344
-
345
- expect(result).toBe(true);
346
- const content = await fs.readFile(profilePath, 'utf-8');
347
- expect(content).toContain('# Before');
348
- expect(content).toContain('# After');
349
- });
350
-
351
- it('should return false on invalid marker placement', async () => {
352
- const profilePath = installer.getProfilePath();
353
- await fs.mkdir(path.dirname(profilePath), { recursive: true });
354
-
355
- const initialContent = [
356
- '# OPENSPEC:END',
357
- '# Config',
358
- '# OPENSPEC:START',
359
- ].join('\n');
360
-
361
- await fs.writeFile(profilePath, initialContent);
362
-
363
- const result = await installer.removeProfileConfig();
364
-
365
- expect(result).toBe(false);
366
- });
367
- });
368
-
369
- describe('install', () => {
370
- const mockCompletionScript = `# PowerShell completion script for OpenSpec
371
- $openspecCompleter = {
372
- param($wordToComplete, $commandAst, $cursorPosition)
373
- # Completion logic here
374
- }
375
- Register-ArgumentCompleter -CommandName openspec -ScriptBlock $openspecCompleter
376
- `;
377
-
378
- it('should install completion script for the first time', async () => {
379
- delete process.env.OPENSPEC_NO_AUTO_CONFIG;
380
- const result = await installer.install(mockCompletionScript);
381
-
382
- expect(result.success).toBe(true);
383
- expect(result.message).toContain('installed');
384
- expect(result.installedPath).toContain('OpenSpecCompletion.ps1');
385
- expect(result.backupPath).toBeUndefined();
386
- });
387
-
388
- it('should create parent directories if they do not exist', async () => {
389
- delete process.env.OPENSPEC_NO_AUTO_CONFIG;
390
- const result = await installer.install(mockCompletionScript);
391
-
392
- expect(result.success).toBe(true);
393
- const targetPath = installer.getInstallationPath();
394
- const fileExists = await fs.access(targetPath).then(() => true).catch(() => false);
395
- expect(fileExists).toBe(true);
396
- });
397
-
398
- it('should write completion script content correctly', async () => {
399
- delete process.env.OPENSPEC_NO_AUTO_CONFIG;
400
- await installer.install(mockCompletionScript);
401
-
402
- const targetPath = installer.getInstallationPath();
403
- const content = await fs.readFile(targetPath, 'utf-8');
404
- expect(content).toBe(mockCompletionScript);
405
- });
406
-
407
- it('should detect when already installed with same content', async () => {
408
- delete process.env.OPENSPEC_NO_AUTO_CONFIG;
409
- await installer.install(mockCompletionScript);
410
-
411
- const result = await installer.install(mockCompletionScript);
412
-
413
- expect(result.success).toBe(true);
414
- expect(result.message).toBe('Completion script is already installed (up to date)');
415
- expect(result.backupPath).toBeUndefined();
416
- });
417
-
418
- it('should update when content is different', async () => {
419
- delete process.env.OPENSPEC_NO_AUTO_CONFIG;
420
- await installer.install(mockCompletionScript);
421
-
422
- const updatedScript = mockCompletionScript + '\n# Updated version';
423
- const result = await installer.install(updatedScript);
424
-
425
- expect(result.success).toBe(true);
426
- expect(result.message).toContain('updated successfully');
427
- expect(result.backupPath).toBeDefined();
428
- });
429
-
430
- it('should create backup when updating existing installation', async () => {
431
- delete process.env.OPENSPEC_NO_AUTO_CONFIG;
432
- await installer.install(mockCompletionScript);
433
-
434
- const updatedScript = mockCompletionScript + '\n# Updated';
435
- const result = await installer.install(updatedScript);
436
-
437
- expect(result.success).toBe(true);
438
- expect(result.backupPath).toBeDefined();
439
-
440
- // Verify backup contains original content
441
- const backupContent = await fs.readFile(result.backupPath!, 'utf-8');
442
- expect(backupContent).toBe(mockCompletionScript);
443
- });
444
-
445
- it('should configure PowerShell profile when not disabled', async () => {
446
- delete process.env.OPENSPEC_NO_AUTO_CONFIG;
447
- const result = await installer.install(mockCompletionScript);
448
-
449
- expect(result.success).toBe(true);
450
- expect(result.profileConfigured).toBe(true);
451
- expect(result.message).toContain('profile configured');
452
- expect(result.instructions).toBeUndefined();
453
- });
454
-
455
- // Note: OPENSPEC_NO_AUTO_CONFIG support was removed from PowerShell installer
456
- // Profile is now always auto-configured if possible
457
-
458
- // Skip on Windows: fs.chmod() doesn't reliably restrict write access on Windows
459
- // (admin users can bypass read-only attribute, and CI runners often have elevated privileges)
460
- it.skipIf(process.platform === 'win32')('should provide instructions when profile cannot be configured', async () => {
461
- delete process.env.OPENSPEC_NO_AUTO_CONFIG;
462
- // Make profile directory read-only to prevent configuration
463
- const profilePath = installer.getProfilePath();
464
- await fs.mkdir(path.dirname(profilePath), { recursive: true });
465
- await fs.writeFile(profilePath, '# Test');
466
- await fs.chmod(profilePath, 0o444);
467
-
468
- const result = await installer.install(mockCompletionScript);
469
-
470
- // Restore permissions
471
- await fs.chmod(profilePath, 0o644);
472
-
473
- expect(result.success).toBe(true);
474
- expect(result.profileConfigured).toBe(false);
475
- expect(result.instructions).toBeDefined();
476
- expect(result.instructions!.some(i => i.includes('Test-Path'))).toBe(true);
477
- });
478
-
479
- it('should include backup path in message when updating', async () => {
480
- delete process.env.OPENSPEC_NO_AUTO_CONFIG;
481
- await installer.install(mockCompletionScript);
482
-
483
- const updatedScript = mockCompletionScript + '\n# Updated';
484
- const result = await installer.install(updatedScript);
485
-
486
- expect(result.success).toBe(true);
487
- expect(result.message).toContain('backed up');
488
- expect(result.backupPath).toBeDefined();
489
- });
490
-
491
- it('should handle installation with paths containing spaces', async () => {
492
- const spacedHomeDir = path.join(os.tmpdir(), `openspec powershell test ${randomUUID()}`);
493
- await fs.mkdir(spacedHomeDir, { recursive: true });
494
-
495
- const spacedInstaller = new PowerShellInstaller(spacedHomeDir);
496
- const result = await spacedInstaller.install(mockCompletionScript);
497
-
498
- expect(result.success).toBe(true);
499
- expect(result.installedPath).toContain('openspec powershell test');
500
-
501
- // Cleanup
502
- await fs.rm(spacedHomeDir, { recursive: true, force: true });
503
- });
504
-
505
- // Skip on Windows: fs.chmod() on directories doesn't restrict write access on Windows
506
- // Windows uses ACLs which Node.js chmod doesn't control
507
- it.skipIf(process.platform === 'win32')('should return failure on permission error', async () => {
508
- const targetPath = installer.getInstallationPath();
509
- const targetDir = path.dirname(targetPath);
510
- await fs.mkdir(targetDir, { recursive: true });
511
-
512
- // Make target directory read-only to simulate permission error
513
- await fs.chmod(targetDir, 0o444);
514
-
515
- const result = await installer.install(mockCompletionScript);
516
-
517
- // Restore permissions for cleanup
518
- await fs.chmod(targetDir, 0o755);
519
-
520
- expect(result.success).toBe(false);
521
- expect(result.message).toContain('Failed to install completion script');
522
- });
523
-
524
- it('should handle empty completion script', async () => {
525
- delete process.env.OPENSPEC_NO_AUTO_CONFIG;
526
- const result = await installer.install('');
527
-
528
- expect(result.success).toBe(true);
529
- const targetPath = installer.getInstallationPath();
530
- const content = await fs.readFile(targetPath, 'utf-8');
531
- expect(content).toBe('');
532
- });
533
-
534
- it('should handle completion script with special characters', async () => {
535
- delete process.env.OPENSPEC_NO_AUTO_CONFIG;
536
- const specialScript = `# PowerShell with special chars: ' " \` $ @\n$test = "value"`;
537
-
538
- const result = await installer.install(specialScript);
539
-
540
- expect(result.success).toBe(true);
541
- const targetPath = installer.getInstallationPath();
542
- const content = await fs.readFile(targetPath, 'utf-8');
543
- expect(content).toBe(specialScript);
544
- });
545
- });
546
-
547
- describe('encoding preservation', () => {
548
- const mockScriptPath = '/path/to/OpenSpecCompletion.ps1';
549
- const utf16leBom = Buffer.from([0xff, 0xfe]);
550
- const utf8Bom = Buffer.from([0xef, 0xbb, 0xbf]);
551
-
552
- /**
553
- * Helper: write a file in UTF-16 LE with BOM, the way Windows PowerShell does.
554
- */
555
- function writeUtf16LeFile(filePath: string, text: string): Promise<void> {
556
- const body = Buffer.from(text, 'utf16le');
557
- return fs.writeFile(filePath, Buffer.concat([utf16leBom, body]));
558
- }
559
-
560
- /**
561
- * Helper: write a file in UTF-8 with BOM.
562
- */
563
- function writeUtf8BomFile(filePath: string, text: string): Promise<void> {
564
- const body = Buffer.from(text, 'utf-8');
565
- return fs.writeFile(filePath, Buffer.concat([utf8Bom, body]));
566
- }
567
-
568
- it('should preserve UTF-16 LE BOM when configuring profile', async () => {
569
- delete process.env.OPENSPEC_NO_AUTO_CONFIG;
570
- const profilePath = installer.getProfilePath();
571
- await fs.mkdir(path.dirname(profilePath), { recursive: true });
572
-
573
- const originalText = '. "C:\\Code\\SystemConfig\\Powershell\\profile.ps1"\r\n';
574
- await writeUtf16LeFile(profilePath, originalText);
575
-
576
- const result = await installer.configureProfile(mockScriptPath);
577
- expect(result).toBe(true);
578
-
579
- // Read back raw bytes and verify BOM is preserved
580
- const raw = await fs.readFile(profilePath);
581
- expect(raw[0]).toBe(0xff);
582
- expect(raw[1]).toBe(0xfe);
583
-
584
- // Decode and verify content is intact
585
- const content = raw.subarray(2).toString('utf16le');
586
- expect(content).toContain('. "C:\\Code\\SystemConfig\\Powershell\\profile.ps1"');
587
- expect(content).toContain('# OPENSPEC:START');
588
- expect(content).toContain(`. "${mockScriptPath}"`);
589
- expect(content).toContain('# OPENSPEC:END');
590
- });
591
-
592
- it('should preserve UTF-16 LE BOM when removing profile config', async () => {
593
- delete process.env.OPENSPEC_NO_AUTO_CONFIG;
594
- const profilePath = installer.getProfilePath();
595
- await fs.mkdir(path.dirname(profilePath), { recursive: true });
596
-
597
- const textWithBlock = [
598
- '. "C:\\Code\\profile.ps1"',
599
- '# OPENSPEC:START',
600
- '. "/path/to/OpenSpecCompletion.ps1"',
601
- '# OPENSPEC:END',
602
- '',
603
- ].join('\n');
604
- await writeUtf16LeFile(profilePath, textWithBlock);
605
-
606
- const result = await installer.removeProfileConfig();
607
- expect(result).toBe(true);
608
-
609
- // Verify BOM is preserved
610
- const raw = await fs.readFile(profilePath);
611
- expect(raw[0]).toBe(0xff);
612
- expect(raw[1]).toBe(0xfe);
613
-
614
- // Verify content: original line kept, OpenSpec block removed
615
- const content = raw.subarray(2).toString('utf16le');
616
- expect(content).toContain('. "C:\\Code\\profile.ps1"');
617
- expect(content).not.toContain('# OPENSPEC:START');
618
- expect(content).not.toContain('# OPENSPEC:END');
619
- });
620
-
621
- it('should preserve UTF-8 BOM when configuring profile', async () => {
622
- delete process.env.OPENSPEC_NO_AUTO_CONFIG;
623
- const profilePath = installer.getProfilePath();
624
- await fs.mkdir(path.dirname(profilePath), { recursive: true });
625
-
626
- await writeUtf8BomFile(profilePath, '# My profile\n');
627
-
628
- const result = await installer.configureProfile(mockScriptPath);
629
- expect(result).toBe(true);
630
-
631
- const raw = await fs.readFile(profilePath);
632
- expect(raw[0]).toBe(0xef);
633
- expect(raw[1]).toBe(0xbb);
634
- expect(raw[2]).toBe(0xbf);
635
-
636
- const content = raw.subarray(3).toString('utf-8');
637
- expect(content).toContain('# My profile');
638
- expect(content).toContain('# OPENSPEC:START');
639
- });
640
-
641
- it('should skip UTF-16 BE profile and leave it unchanged', async () => {
642
- delete process.env.OPENSPEC_NO_AUTO_CONFIG;
643
- process.env.PROFILE = path.join(testHomeDir, 'custom-profile.ps1');
644
- const profilePath = installer.getProfilePath();
645
- await fs.mkdir(path.dirname(profilePath), { recursive: true });
646
-
647
- // Write a fake UTF-16 BE file (FE FF BOM + some bytes)
648
- const utf16beBom = Buffer.from([0xfe, 0xff]);
649
- const body = Buffer.from([0x00, 0x23]); // '#' in UTF-16 BE
650
- const originalBytes = Buffer.concat([utf16beBom, body]);
651
- await fs.writeFile(profilePath, originalBytes);
652
-
653
- const result = await installer.configureProfile(mockScriptPath);
654
- expect(result).toBe(false);
655
-
656
- // File should be untouched
657
- const raw = await fs.readFile(profilePath);
658
- expect(Buffer.compare(raw, originalBytes)).toBe(0);
659
- });
660
-
661
- it('should handle plain UTF-8 files without BOM (no regression)', async () => {
662
- delete process.env.OPENSPEC_NO_AUTO_CONFIG;
663
- const profilePath = installer.getProfilePath();
664
- await fs.mkdir(path.dirname(profilePath), { recursive: true });
665
-
666
- await fs.writeFile(profilePath, '# Plain UTF-8\n', 'utf-8');
667
-
668
- const result = await installer.configureProfile(mockScriptPath);
669
- expect(result).toBe(true);
670
-
671
- const raw = await fs.readFile(profilePath);
672
- // Should NOT have any BOM
673
- expect(raw[0]).not.toBe(0xff);
674
- expect(raw[0]).not.toBe(0xfe);
675
- expect(raw[0]).not.toBe(0xef);
676
-
677
- const content = raw.toString('utf-8');
678
- expect(content).toContain('# Plain UTF-8');
679
- expect(content).toContain('# OPENSPEC:START');
680
- });
681
-
682
- it('should round-trip UTF-16 LE through install → uninstall without corruption', async () => {
683
- delete process.env.OPENSPEC_NO_AUTO_CONFIG;
684
- const profilePath = installer.getProfilePath();
685
- await fs.mkdir(path.dirname(profilePath), { recursive: true });
686
-
687
- const originalText = '. "C:\\Code\\SystemConfig\\Powershell\\profile.ps1"\r\n';
688
- await writeUtf16LeFile(profilePath, originalText);
689
-
690
- // Install adds the OpenSpec block
691
- const mockScript = '# completion script';
692
- await installer.install(mockScript);
693
-
694
- // Verify the profile was modified but encoding preserved
695
- let raw = await fs.readFile(profilePath);
696
- expect(raw[0]).toBe(0xff);
697
- expect(raw[1]).toBe(0xfe);
698
- let content = raw.subarray(2).toString('utf16le');
699
- expect(content).toContain('# OPENSPEC:START');
700
- expect(content).toContain(originalText.trimEnd());
701
-
702
- // Uninstall removes the OpenSpec block
703
- await installer.uninstall();
704
-
705
- raw = await fs.readFile(profilePath);
706
- expect(raw[0]).toBe(0xff);
707
- expect(raw[1]).toBe(0xfe);
708
- content = raw.subarray(2).toString('utf16le');
709
- expect(content).not.toContain('# OPENSPEC:START');
710
- expect(content).toContain('. "C:\\Code\\SystemConfig\\Powershell\\profile.ps1"');
711
- });
712
- });
713
-
714
- describe('uninstall', () => {
715
- const mockCompletionScript = `# PowerShell completion script
716
- $openspecCompleter = {}
717
- Register-ArgumentCompleter -CommandName openspec -ScriptBlock $openspecCompleter
718
- `;
719
-
720
- it('should successfully uninstall when completion script exists', async () => {
721
- delete process.env.OPENSPEC_NO_AUTO_CONFIG;
722
- await installer.install(mockCompletionScript);
723
-
724
- const result = await installer.uninstall();
725
-
726
- expect(result.success).toBe(true);
727
- expect(result.message).toBe('Completion script uninstalled successfully');
728
- });
729
-
730
- it('should remove the completion file', async () => {
731
- delete process.env.OPENSPEC_NO_AUTO_CONFIG;
732
- await installer.install(mockCompletionScript);
733
- const targetPath = installer.getInstallationPath();
734
-
735
- await installer.uninstall();
736
-
737
- const fileExists = await fs.access(targetPath).then(() => true).catch(() => false);
738
- expect(fileExists).toBe(false);
739
- });
740
-
741
- it('should remove profile configuration', async () => {
742
- delete process.env.OPENSPEC_NO_AUTO_CONFIG;
743
- await installer.install(mockCompletionScript);
744
- const profilePath = installer.getProfilePath();
745
-
746
- await installer.uninstall();
747
-
748
- const content = await fs.readFile(profilePath, 'utf-8');
749
- expect(content).not.toContain('# OPENSPEC:START');
750
- expect(content).not.toContain('# OPENSPEC:END');
751
- });
752
-
753
- it('should return failure when completion script is not installed', async () => {
754
- const result = await installer.uninstall();
755
-
756
- expect(result.success).toBe(false);
757
- expect(result.message).toBe('Completion script is not installed');
758
- });
759
-
760
- it('should accept yes option parameter', async () => {
761
- delete process.env.OPENSPEC_NO_AUTO_CONFIG;
762
- await installer.install(mockCompletionScript);
763
-
764
- const result = await installer.uninstall({ yes: true });
765
-
766
- expect(result.success).toBe(true);
767
- expect(result.message).toBe('Completion script uninstalled successfully');
768
- });
769
-
770
- it('should handle both script and config removal', async () => {
771
- delete process.env.OPENSPEC_NO_AUTO_CONFIG;
772
- await installer.install(mockCompletionScript);
773
-
774
- const targetPath = installer.getInstallationPath();
775
- const profilePath = installer.getProfilePath();
776
-
777
- // Verify both exist
778
- const scriptExists = await fs.access(targetPath).then(() => true).catch(() => false);
779
- const profileContent = await fs.readFile(profilePath, 'utf-8');
780
- expect(scriptExists).toBe(true);
781
- expect(profileContent).toContain('# OPENSPEC:START');
782
-
783
- await installer.uninstall();
784
-
785
- // Verify both are removed/cleaned
786
- const scriptExistsAfter = await fs.access(targetPath).then(() => true).catch(() => false);
787
- const profileContentAfter = await fs.readFile(profilePath, 'utf-8');
788
- expect(scriptExistsAfter).toBe(false);
789
- expect(profileContentAfter).not.toContain('# OPENSPEC:START');
790
- });
791
-
792
- // Skip on Windows: fs.chmod() on directories doesn't restrict write access on Windows
793
- // Windows uses ACLs which Node.js chmod doesn't control
794
- it.skipIf(process.platform === 'win32')('should return failure on permission error', async () => {
795
- delete process.env.OPENSPEC_NO_AUTO_CONFIG;
796
- await installer.install(mockCompletionScript);
797
- const targetPath = installer.getInstallationPath();
798
- const parentDir = path.dirname(targetPath);
799
-
800
- // Make parent directory read-only
801
- await fs.chmod(parentDir, 0o444);
802
- const result = await installer.uninstall();
803
-
804
- // Restore permissions
805
- await fs.chmod(parentDir, 0o755);
806
-
807
- // On some systems, the access check fails which returns "not installed"
808
- // On others, the unlink fails which returns "Failed to uninstall"
809
- expect(result.success).toBe(false);
810
- expect(
811
- result.message === 'Completion script is not installed' ||
812
- result.message.includes('Failed to uninstall completion script')
813
- ).toBe(true);
814
- });
815
-
816
- it('should handle uninstall when parent directory does not exist', async () => {
817
- const result = await installer.uninstall();
818
-
819
- expect(result.success).toBe(false);
820
- expect(result.message).toBe('Completion script is not installed');
821
- });
822
- });
823
-
824
- });