sauron-cli 1.1.3 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (671) hide show
  1. package/.agents/rules/memory.md +156 -0
  2. package/.agents/skills/wiki/SKILL.md +172 -0
  3. package/.aider.instructions.md +152 -0
  4. package/.cursor/rules/sauron-memory.mdc +157 -0
  5. package/.genesis/prompts/prompt-onboarding-inteligente.md +45 -0
  6. package/.genesis/prompts/prompt-sauron-vs-openspec-arquitetura.md +106 -0
  7. package/.github/workflows/ci.yml +27 -0
  8. package/.sauron/.manifest.json +2 -1
  9. package/.sauron/wiki/history/implementacao-scanner-inteligente.md +29 -0
  10. package/.sauron/wiki/history/reestruturacao-arquitetural-core.md +29 -0
  11. package/.sauron/wiki/history/resiliencia-caminho-templates.md +29 -0
  12. package/.sauron/wiki/standards/typescript.rules.md +21 -0
  13. package/.sauron/wiki/summary.json +81 -0
  14. package/.windsurfrules +160 -0
  15. package/55ea973d-e255-4f08-a313-a5d68243bd2d.png +0 -0
  16. package/Evolu/303/247/303/243o Arquitetural do Sauron CLI.md" +97 -0
  17. package/OpenSpec-main/.actrc +1 -0
  18. package/OpenSpec-main/.changeset/README.md +97 -0
  19. package/OpenSpec-main/.changeset/config.json +15 -0
  20. package/OpenSpec-main/.coderabbit.yaml +11 -0
  21. package/OpenSpec-main/.devcontainer/README.md +92 -0
  22. package/OpenSpec-main/.devcontainer/devcontainer.json +68 -0
  23. package/OpenSpec-main/.github/CODEOWNERS +2 -0
  24. package/OpenSpec-main/.github/workflows/README.md +20 -0
  25. package/OpenSpec-main/.github/workflows/ci.yml +346 -0
  26. package/OpenSpec-main/.github/workflows/release-prepare.yml +60 -0
  27. package/OpenSpec-main/CHANGELOG.md +594 -0
  28. package/OpenSpec-main/LICENSE +22 -0
  29. package/OpenSpec-main/MAINTAINERS.md +17 -0
  30. package/OpenSpec-main/README.md +206 -0
  31. package/OpenSpec-main/README_OLD.md +475 -0
  32. package/OpenSpec-main/assets/openspec_bg.png +0 -0
  33. package/OpenSpec-main/assets/openspec_dashboard.png +0 -0
  34. package/OpenSpec-main/assets/openspec_pixel_dark.svg +89 -0
  35. package/OpenSpec-main/assets/openspec_pixel_light.svg +89 -0
  36. package/OpenSpec-main/bin/openspec.js +5 -0
  37. package/OpenSpec-main/build.js +31 -0
  38. package/OpenSpec-main/eslint.config.js +42 -0
  39. package/OpenSpec-main/flake.lock +27 -0
  40. package/OpenSpec-main/flake.nix +114 -0
  41. package/OpenSpec-main/openspec/changes/IMPLEMENTATION_ORDER.md +68 -0
  42. package/OpenSpec-main/openspec/changes/add-artifact-regeneration-support/proposal.md +136 -0
  43. package/OpenSpec-main/openspec/changes/add-change-stacking-awareness/.openspec.yaml +2 -0
  44. package/OpenSpec-main/openspec/changes/add-change-stacking-awareness/proposal.md +93 -0
  45. package/OpenSpec-main/openspec/changes/add-change-stacking-awareness/specs/change-creation/spec.md +15 -0
  46. package/OpenSpec-main/openspec/changes/add-change-stacking-awareness/specs/change-stacking-workflow/spec.md +65 -0
  47. package/OpenSpec-main/openspec/changes/add-change-stacking-awareness/specs/cli-change/spec.md +27 -0
  48. package/OpenSpec-main/openspec/changes/add-change-stacking-awareness/specs/openspec-conventions/spec.md +29 -0
  49. package/OpenSpec-main/openspec/changes/add-change-stacking-awareness/tasks.md +39 -0
  50. package/OpenSpec-main/openspec/changes/add-global-install-scope/.openspec.yaml +2 -0
  51. package/OpenSpec-main/openspec/changes/add-global-install-scope/design.md +161 -0
  52. package/OpenSpec-main/openspec/changes/add-global-install-scope/proposal.md +101 -0
  53. package/OpenSpec-main/openspec/changes/add-global-install-scope/specs/ai-tool-paths/spec.md +35 -0
  54. package/OpenSpec-main/openspec/changes/add-global-install-scope/specs/cli-config/spec.md +21 -0
  55. package/OpenSpec-main/openspec/changes/add-global-install-scope/specs/cli-init/spec.md +28 -0
  56. package/OpenSpec-main/openspec/changes/add-global-install-scope/specs/cli-update/spec.md +34 -0
  57. package/OpenSpec-main/openspec/changes/add-global-install-scope/specs/command-generation/spec.md +22 -0
  58. package/OpenSpec-main/openspec/changes/add-global-install-scope/specs/global-config/spec.md +24 -0
  59. package/OpenSpec-main/openspec/changes/add-global-install-scope/specs/installation-scope/spec.md +71 -0
  60. package/OpenSpec-main/openspec/changes/add-global-install-scope/tasks.md +61 -0
  61. package/OpenSpec-main/openspec/changes/add-qa-smoke-harness/.openspec.yaml +2 -0
  62. package/OpenSpec-main/openspec/changes/add-qa-smoke-harness/proposal.md +45 -0
  63. package/OpenSpec-main/openspec/changes/add-qa-smoke-harness/specs/developer-qa-workflow/spec.md +49 -0
  64. package/OpenSpec-main/openspec/changes/add-tool-command-surface-capabilities/.openspec.yaml +2 -0
  65. package/OpenSpec-main/openspec/changes/add-tool-command-surface-capabilities/proposal.md +111 -0
  66. package/OpenSpec-main/openspec/changes/add-tool-command-surface-capabilities/specs/cli-init/spec.md +121 -0
  67. package/OpenSpec-main/openspec/changes/add-tool-command-surface-capabilities/specs/cli-update/spec.md +48 -0
  68. package/OpenSpec-main/openspec/changes/add-tool-command-surface-capabilities/tasks.md +53 -0
  69. package/OpenSpec-main/openspec/changes/archive/2025-01-11-add-update-command/design.md +86 -0
  70. package/OpenSpec-main/openspec/changes/archive/2025-01-11-add-update-command/proposal.md +29 -0
  71. package/OpenSpec-main/openspec/changes/archive/2025-01-11-add-update-command/specs/cli-update/spec.md +59 -0
  72. package/OpenSpec-main/openspec/changes/archive/2025-01-11-add-update-command/tasks.md +20 -0
  73. package/OpenSpec-main/openspec/changes/archive/2025-01-13-add-list-command/proposal.md +20 -0
  74. package/OpenSpec-main/openspec/changes/archive/2025-01-13-add-list-command/specs/cli-list/spec.md +69 -0
  75. package/OpenSpec-main/openspec/changes/archive/2025-01-13-add-list-command/tasks.md +26 -0
  76. package/OpenSpec-main/openspec/changes/archive/2025-08-05-initialize-typescript-project/design.md +64 -0
  77. package/OpenSpec-main/openspec/changes/archive/2025-08-05-initialize-typescript-project/proposal.md +18 -0
  78. package/OpenSpec-main/openspec/changes/archive/2025-08-05-initialize-typescript-project/tasks.md +25 -0
  79. package/OpenSpec-main/openspec/changes/archive/2025-08-06-add-init-command/design.md +104 -0
  80. package/OpenSpec-main/openspec/changes/archive/2025-08-06-add-init-command/proposal.md +30 -0
  81. package/OpenSpec-main/openspec/changes/archive/2025-08-06-add-init-command/specs/cli-init/spec.md +148 -0
  82. package/OpenSpec-main/openspec/changes/archive/2025-08-06-add-init-command/tasks.md +38 -0
  83. package/OpenSpec-main/openspec/changes/archive/2025-08-06-adopt-future-state-storage/proposal.md +24 -0
  84. package/OpenSpec-main/openspec/changes/archive/2025-08-06-adopt-future-state-storage/specs/openspec-conventions/spec.md +120 -0
  85. package/OpenSpec-main/openspec/changes/archive/2025-08-06-adopt-future-state-storage/tasks.md +38 -0
  86. package/OpenSpec-main/openspec/changes/archive/2025-08-11-add-complexity-guidelines/proposal.md +13 -0
  87. package/OpenSpec-main/openspec/changes/archive/2025-08-11-add-complexity-guidelines/specs/openspec-docs/README.md +472 -0
  88. package/OpenSpec-main/openspec/changes/archive/2025-08-11-add-complexity-guidelines/tasks.md +9 -0
  89. package/OpenSpec-main/openspec/changes/archive/2025-08-13-add-archive-command/proposal.md +15 -0
  90. package/OpenSpec-main/openspec/changes/archive/2025-08-13-add-archive-command/specs/cli-archive/spec.md +111 -0
  91. package/OpenSpec-main/openspec/changes/archive/2025-08-13-add-archive-command/tasks.md +44 -0
  92. package/OpenSpec-main/openspec/changes/archive/2025-08-13-add-diff-command/proposal.md +19 -0
  93. package/OpenSpec-main/openspec/changes/archive/2025-08-13-add-diff-command/specs/cli-diff/spec.md +77 -0
  94. package/OpenSpec-main/openspec/changes/archive/2025-08-13-add-diff-command/tasks.md +23 -0
  95. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-change-commands/design.md +56 -0
  96. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-change-commands/proposal.md +17 -0
  97. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-change-commands/specs/cli-change/spec.md +48 -0
  98. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-change-commands/specs/cli-list/spec.md +12 -0
  99. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-change-commands/tasks.md +34 -0
  100. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-interactive-show-command/proposal.md +20 -0
  101. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-interactive-show-command/specs/cli-change/spec.md +23 -0
  102. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-interactive-show-command/specs/cli-show/spec.md +83 -0
  103. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-interactive-show-command/specs/cli-spec/spec.md +23 -0
  104. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-interactive-show-command/tasks.md +142 -0
  105. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-skip-specs-archive-option/proposal.md +13 -0
  106. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-skip-specs-archive-option/specs/cli-archive/spec.md +191 -0
  107. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-skip-specs-archive-option/tasks.md +57 -0
  108. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-spec-commands/design.md +45 -0
  109. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-spec-commands/proposal.md +19 -0
  110. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-spec-commands/specs/cli-spec/spec.md +43 -0
  111. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-spec-commands/tasks.md +22 -0
  112. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-zod-validation/design.md +104 -0
  113. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-zod-validation/proposal.md +22 -0
  114. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-zod-validation/specs/cli-archive/spec.md +18 -0
  115. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-zod-validation/specs/cli-diff/spec.md +12 -0
  116. package/OpenSpec-main/openspec/changes/archive/2025-08-19-add-zod-validation/tasks.md +59 -0
  117. package/OpenSpec-main/openspec/changes/archive/2025-08-19-adopt-delta-based-changes/proposal.md +93 -0
  118. package/OpenSpec-main/openspec/changes/archive/2025-08-19-adopt-delta-based-changes/specs/cli-archive/spec.md +48 -0
  119. package/OpenSpec-main/openspec/changes/archive/2025-08-19-adopt-delta-based-changes/specs/cli-diff/spec.md +45 -0
  120. package/OpenSpec-main/openspec/changes/archive/2025-08-19-adopt-delta-based-changes/specs/openspec-conventions/spec.md +101 -0
  121. package/OpenSpec-main/openspec/changes/archive/2025-08-19-adopt-delta-based-changes/tasks.md +55 -0
  122. package/OpenSpec-main/openspec/changes/archive/2025-08-19-adopt-verb-noun-cli-structure/design.md +19 -0
  123. package/OpenSpec-main/openspec/changes/archive/2025-08-19-adopt-verb-noun-cli-structure/proposal.md +67 -0
  124. package/OpenSpec-main/openspec/changes/archive/2025-08-19-adopt-verb-noun-cli-structure/specs/cli-list/spec.md +57 -0
  125. package/OpenSpec-main/openspec/changes/archive/2025-08-19-adopt-verb-noun-cli-structure/specs/openspec-conventions/spec.md +23 -0
  126. package/OpenSpec-main/openspec/changes/archive/2025-08-19-adopt-verb-noun-cli-structure/tasks.md +27 -0
  127. package/OpenSpec-main/openspec/changes/archive/2025-08-19-bulk-validation-interactive-selection/proposal.md +20 -0
  128. package/OpenSpec-main/openspec/changes/archive/2025-08-19-bulk-validation-interactive-selection/specs/cli-change/spec.md +22 -0
  129. package/OpenSpec-main/openspec/changes/archive/2025-08-19-bulk-validation-interactive-selection/specs/cli-spec/spec.md +23 -0
  130. package/OpenSpec-main/openspec/changes/archive/2025-08-19-bulk-validation-interactive-selection/specs/cli-validate/spec.md +149 -0
  131. package/OpenSpec-main/openspec/changes/archive/2025-08-19-bulk-validation-interactive-selection/tasks.md +81 -0
  132. package/OpenSpec-main/openspec/changes/archive/2025-08-19-fix-update-tool-selection/proposal.md +40 -0
  133. package/OpenSpec-main/openspec/changes/archive/2025-08-19-fix-update-tool-selection/specs/cli-update/spec.md +23 -0
  134. package/OpenSpec-main/openspec/changes/archive/2025-08-19-fix-update-tool-selection/tasks.md +21 -0
  135. package/OpenSpec-main/openspec/changes/archive/2025-08-19-improve-validate-error-messages/proposal.md +25 -0
  136. package/OpenSpec-main/openspec/changes/archive/2025-08-19-improve-validate-error-messages/specs/cli-validate/spec.md +55 -0
  137. package/OpenSpec-main/openspec/changes/archive/2025-08-19-improve-validate-error-messages/tasks.md +21 -0
  138. package/OpenSpec-main/openspec/changes/archive/2025-08-19-structured-spec-format/proposal.md +36 -0
  139. package/OpenSpec-main/openspec/changes/archive/2025-08-19-structured-spec-format/specs/openspec-conventions/spec.md +192 -0
  140. package/OpenSpec-main/openspec/changes/archive/2025-08-19-structured-spec-format/tasks.md +19 -0
  141. package/OpenSpec-main/openspec/changes/archive/2025-09-12-add-view-dashboard-command/proposal.md +38 -0
  142. package/OpenSpec-main/openspec/changes/archive/2025-09-12-add-view-dashboard-command/specs/cli-view/spec.md +109 -0
  143. package/OpenSpec-main/openspec/changes/archive/2025-09-12-add-view-dashboard-command/tasks.md +47 -0
  144. package/OpenSpec-main/openspec/changes/archive/2025-09-29-add-agents-md-config/proposal.md +28 -0
  145. package/OpenSpec-main/openspec/changes/archive/2025-09-29-add-agents-md-config/specs/cli-init/spec.md +71 -0
  146. package/OpenSpec-main/openspec/changes/archive/2025-09-29-add-agents-md-config/specs/cli-update/spec.md +41 -0
  147. package/OpenSpec-main/openspec/changes/archive/2025-09-29-add-agents-md-config/tasks.md +17 -0
  148. package/OpenSpec-main/openspec/changes/archive/2025-09-29-add-multi-agent-init/proposal.md +35 -0
  149. package/OpenSpec-main/openspec/changes/archive/2025-09-29-add-multi-agent-init/specs/cli-init/spec.md +45 -0
  150. package/OpenSpec-main/openspec/changes/archive/2025-09-29-add-multi-agent-init/tasks.md +16 -0
  151. package/OpenSpec-main/openspec/changes/archive/2025-09-29-add-slash-command-support/proposal.md +119 -0
  152. package/OpenSpec-main/openspec/changes/archive/2025-09-29-add-slash-command-support/specs/cli-init/spec.md +21 -0
  153. package/OpenSpec-main/openspec/changes/archive/2025-09-29-add-slash-command-support/specs/cli-update/spec.md +22 -0
  154. package/OpenSpec-main/openspec/changes/archive/2025-09-29-add-slash-command-support/tasks.md +20 -0
  155. package/OpenSpec-main/openspec/changes/archive/2025-09-29-improve-cli-e2e-plan/proposal.md +19 -0
  156. package/OpenSpec-main/openspec/changes/archive/2025-09-29-improve-cli-e2e-plan/tasks.md +9 -0
  157. package/OpenSpec-main/openspec/changes/archive/2025-09-29-improve-deterministic-tests/proposal.md +78 -0
  158. package/OpenSpec-main/openspec/changes/archive/2025-09-29-improve-deterministic-tests/tasks.md +25 -0
  159. package/OpenSpec-main/openspec/changes/archive/2025-09-29-improve-init-onboarding/proposal.md +13 -0
  160. package/OpenSpec-main/openspec/changes/archive/2025-09-29-improve-init-onboarding/specs/cli-init/spec.md +92 -0
  161. package/OpenSpec-main/openspec/changes/archive/2025-09-29-improve-init-onboarding/tasks.md +12 -0
  162. package/OpenSpec-main/openspec/changes/archive/2025-09-29-remove-diff-command/proposal.md +81 -0
  163. package/OpenSpec-main/openspec/changes/archive/2025-09-29-remove-diff-command/tasks.md +37 -0
  164. package/OpenSpec-main/openspec/changes/archive/2025-09-29-sort-active-changes-by-progress/proposal.md +25 -0
  165. package/OpenSpec-main/openspec/changes/archive/2025-09-29-sort-active-changes-by-progress/specs/cli-view/spec.md +9 -0
  166. package/OpenSpec-main/openspec/changes/archive/2025-09-29-sort-active-changes-by-progress/tasks.md +8 -0
  167. package/OpenSpec-main/openspec/changes/archive/2025-09-29-update-agent-file-name/proposal.md +29 -0
  168. package/OpenSpec-main/openspec/changes/archive/2025-09-29-update-agent-file-name/specs/cli-init/spec.md +40 -0
  169. package/OpenSpec-main/openspec/changes/archive/2025-09-29-update-agent-file-name/specs/cli-update/spec.md +22 -0
  170. package/OpenSpec-main/openspec/changes/archive/2025-09-29-update-agent-file-name/specs/openspec-conventions/spec.md +27 -0
  171. package/OpenSpec-main/openspec/changes/archive/2025-09-29-update-agent-file-name/tasks.md +22 -0
  172. package/OpenSpec-main/openspec/changes/archive/2025-09-29-update-agent-instructions/design.md +130 -0
  173. package/OpenSpec-main/openspec/changes/archive/2025-09-29-update-agent-instructions/proposal.md +117 -0
  174. package/OpenSpec-main/openspec/changes/archive/2025-09-29-update-agent-instructions/tasks.md +69 -0
  175. package/OpenSpec-main/openspec/changes/archive/2025-09-29-update-markdown-parser-crlf/proposal.md +19 -0
  176. package/OpenSpec-main/openspec/changes/archive/2025-09-29-update-markdown-parser-crlf/specs/cli-validate/spec.md +9 -0
  177. package/OpenSpec-main/openspec/changes/archive/2025-09-29-update-markdown-parser-crlf/tasks.md +11 -0
  178. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-codex-slash-command-support/proposal.md +25 -0
  179. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-codex-slash-command-support/specs/cli-init/spec.md +56 -0
  180. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-codex-slash-command-support/specs/cli-update/spec.md +41 -0
  181. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-codex-slash-command-support/tasks.md +19 -0
  182. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-github-copilot-prompts/proposal.md +25 -0
  183. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-github-copilot-prompts/specs/cli-init/spec.md +48 -0
  184. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-github-copilot-prompts/specs/cli-update/spec.md +48 -0
  185. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-github-copilot-prompts/tasks.md +30 -0
  186. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-kilocode-workflows/proposal.md +17 -0
  187. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-kilocode-workflows/specs/cli-init/spec.md +43 -0
  188. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-kilocode-workflows/specs/cli-update/spec.md +27 -0
  189. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-kilocode-workflows/tasks.md +15 -0
  190. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-non-interactive-init-options/proposal.md +12 -0
  191. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-non-interactive-init-options/specs/cli-init/spec.md +39 -0
  192. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-non-interactive-init-options/tasks.md +17 -0
  193. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-windsurf-workflows/proposal.md +17 -0
  194. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-windsurf-workflows/specs/cli-init/spec.md +42 -0
  195. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-windsurf-workflows/specs/cli-update/spec.md +27 -0
  196. package/OpenSpec-main/openspec/changes/archive/2025-10-14-add-windsurf-workflows/tasks.md +17 -0
  197. package/OpenSpec-main/openspec/changes/archive/2025-10-14-enhance-validation-error-messages/proposal.md +12 -0
  198. package/OpenSpec-main/openspec/changes/archive/2025-10-14-enhance-validation-error-messages/specs/cli-validate/spec.md +39 -0
  199. package/OpenSpec-main/openspec/changes/archive/2025-10-14-enhance-validation-error-messages/tasks.md +12 -0
  200. package/OpenSpec-main/openspec/changes/archive/2025-10-14-improve-agent-instruction-usability/proposal.md +12 -0
  201. package/OpenSpec-main/openspec/changes/archive/2025-10-14-improve-agent-instruction-usability/specs/docs-agent-instructions/spec.md +33 -0
  202. package/OpenSpec-main/openspec/changes/archive/2025-10-14-improve-agent-instruction-usability/tasks.md +11 -0
  203. package/OpenSpec-main/openspec/changes/archive/2025-10-14-slim-root-agents-file/proposal.md +13 -0
  204. package/OpenSpec-main/openspec/changes/archive/2025-10-14-slim-root-agents-file/tasks.md +15 -0
  205. package/OpenSpec-main/openspec/changes/archive/2025-10-14-update-cli-init-enter-selection/proposal.md +14 -0
  206. package/OpenSpec-main/openspec/changes/archive/2025-10-14-update-cli-init-enter-selection/specs/cli-init/spec.md +10 -0
  207. package/OpenSpec-main/openspec/changes/archive/2025-10-14-update-cli-init-enter-selection/tasks.md +8 -0
  208. package/OpenSpec-main/openspec/changes/archive/2025-10-14-update-cli-init-root-agents/proposal.md +15 -0
  209. package/OpenSpec-main/openspec/changes/archive/2025-10-14-update-cli-init-root-agents/specs/cli-init/spec.md +32 -0
  210. package/OpenSpec-main/openspec/changes/archive/2025-10-14-update-cli-init-root-agents/specs/cli-update/spec.md +10 -0
  211. package/OpenSpec-main/openspec/changes/archive/2025-10-14-update-cli-init-root-agents/tasks.md +11 -0
  212. package/OpenSpec-main/openspec/changes/archive/2025-10-14-update-release-automation/proposal.md +49 -0
  213. package/OpenSpec-main/openspec/changes/archive/2025-10-14-update-release-automation/tasks.md +12 -0
  214. package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-archive-command-arguments/proposal.md +17 -0
  215. package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-archive-command-arguments/specs/cli-update/spec.md +32 -0
  216. package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-archive-command-arguments/tasks.md +15 -0
  217. package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-cline-support/proposal.md +15 -0
  218. package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-cline-support/specs/cli-init/spec.md +97 -0
  219. package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-cline-support/tasks.md +19 -0
  220. package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-crush-support/proposal.md +13 -0
  221. package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-crush-support/specs/cli-init/spec.md +67 -0
  222. package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-crush-support/tasks.md +7 -0
  223. package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-factory-slash-commands/proposal.md +12 -0
  224. package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-factory-slash-commands/specs/cli-init/spec.md +54 -0
  225. package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-factory-slash-commands/specs/cli-update/spec.md +54 -0
  226. package/OpenSpec-main/openspec/changes/archive/2025-10-22-add-factory-slash-commands/tasks.md +11 -0
  227. package/OpenSpec-main/openspec/changes/archive/2025-11-06-add-shell-completions/design.md +525 -0
  228. package/OpenSpec-main/openspec/changes/archive/2025-11-06-add-shell-completions/proposal.md +29 -0
  229. package/OpenSpec-main/openspec/changes/archive/2025-11-06-add-shell-completions/specs/cli-completion/spec.md +300 -0
  230. package/OpenSpec-main/openspec/changes/archive/2025-11-06-add-shell-completions/tasks.md +81 -0
  231. package/OpenSpec-main/openspec/changes/archive/2025-12-20-add-global-config-dir/design.md +105 -0
  232. package/OpenSpec-main/openspec/changes/archive/2025-12-20-add-global-config-dir/proposal.md +20 -0
  233. package/OpenSpec-main/openspec/changes/archive/2025-12-20-add-global-config-dir/specs/global-config/spec.md +76 -0
  234. package/OpenSpec-main/openspec/changes/archive/2025-12-20-add-global-config-dir/tasks.md +26 -0
  235. package/OpenSpec-main/openspec/changes/archive/2025-12-21-add-config-command/design.md +89 -0
  236. package/OpenSpec-main/openspec/changes/archive/2025-12-21-add-config-command/proposal.md +60 -0
  237. package/OpenSpec-main/openspec/changes/archive/2025-12-21-add-config-command/specs/cli-config/spec.md +213 -0
  238. package/OpenSpec-main/openspec/changes/archive/2025-12-21-add-config-command/tasks.md +28 -0
  239. package/OpenSpec-main/openspec/changes/archive/2025-12-23-extend-shell-completions/proposal.md +15 -0
  240. package/OpenSpec-main/openspec/changes/archive/2025-12-23-extend-shell-completions/specs/cli-completion/spec.md +328 -0
  241. package/OpenSpec-main/openspec/changes/archive/2025-12-23-extend-shell-completions/tasks.md +49 -0
  242. package/OpenSpec-main/openspec/changes/archive/2025-12-24-add-artifact-graph-core/design.md +197 -0
  243. package/OpenSpec-main/openspec/changes/archive/2025-12-24-add-artifact-graph-core/proposal.md +18 -0
  244. package/OpenSpec-main/openspec/changes/archive/2025-12-24-add-artifact-graph-core/specs/artifact-graph/spec.md +103 -0
  245. package/OpenSpec-main/openspec/changes/archive/2025-12-24-add-artifact-graph-core/tasks.md +61 -0
  246. package/OpenSpec-main/openspec/changes/archive/2025-12-25-add-change-manager/design.md +74 -0
  247. package/OpenSpec-main/openspec/changes/archive/2025-12-25-add-change-manager/proposal.md +45 -0
  248. package/OpenSpec-main/openspec/changes/archive/2025-12-25-add-change-manager/specs/change-creation/spec.md +63 -0
  249. package/OpenSpec-main/openspec/changes/archive/2025-12-25-add-change-manager/tasks.md +30 -0
  250. package/OpenSpec-main/openspec/changes/archive/2025-12-28-add-artifact-workflow-cli/design.md +112 -0
  251. package/OpenSpec-main/openspec/changes/archive/2025-12-28-add-artifact-workflow-cli/proposal.md +33 -0
  252. package/OpenSpec-main/openspec/changes/archive/2025-12-28-add-artifact-workflow-cli/specs/cli-artifact-workflow/spec.md +153 -0
  253. package/OpenSpec-main/openspec/changes/archive/2025-12-28-add-artifact-workflow-cli/tasks.md +48 -0
  254. package/OpenSpec-main/openspec/changes/archive/2025-12-28-add-instruction-loader/design.md +149 -0
  255. package/OpenSpec-main/openspec/changes/archive/2025-12-28-add-instruction-loader/proposal.md +20 -0
  256. package/OpenSpec-main/openspec/changes/archive/2025-12-28-add-instruction-loader/specs/instruction-loader/spec.md +70 -0
  257. package/OpenSpec-main/openspec/changes/archive/2025-12-28-add-instruction-loader/tasks.md +13 -0
  258. package/OpenSpec-main/openspec/changes/archive/2025-12-28-restructure-schema-directories/design.md +129 -0
  259. package/OpenSpec-main/openspec/changes/archive/2025-12-28-restructure-schema-directories/proposal.md +20 -0
  260. package/OpenSpec-main/openspec/changes/archive/2025-12-28-restructure-schema-directories/specs/artifact-graph/spec.md +49 -0
  261. package/OpenSpec-main/openspec/changes/archive/2025-12-28-restructure-schema-directories/tasks.md +32 -0
  262. package/OpenSpec-main/openspec/changes/archive/2025-12-29-unify-change-state-model/design.md +151 -0
  263. package/OpenSpec-main/openspec/changes/archive/2025-12-29-unify-change-state-model/proposal.md +101 -0
  264. package/OpenSpec-main/openspec/changes/archive/2025-12-29-unify-change-state-model/specs/cli-artifact-workflow/spec.md +109 -0
  265. package/OpenSpec-main/openspec/changes/archive/2025-12-29-unify-change-state-model/specs/cli-view/spec.md +60 -0
  266. package/OpenSpec-main/openspec/changes/archive/2025-12-29-unify-change-state-model/tasks.md +25 -0
  267. package/OpenSpec-main/openspec/changes/archive/2025-12-30-add-antigravity-support/proposal.md +11 -0
  268. package/OpenSpec-main/openspec/changes/archive/2025-12-30-add-antigravity-support/specs/cli-init/spec.md +105 -0
  269. package/OpenSpec-main/openspec/changes/archive/2025-12-30-add-antigravity-support/specs/cli-update/spec.md +92 -0
  270. package/OpenSpec-main/openspec/changes/archive/2025-12-30-add-antigravity-support/tasks.md +12 -0
  271. package/OpenSpec-main/openspec/changes/archive/2025-12-30-fix-cline-workflows-implementation/proposal.md +13 -0
  272. package/OpenSpec-main/openspec/changes/archive/2025-12-30-fix-cline-workflows-implementation/specs/cli-init/spec.md +105 -0
  273. package/OpenSpec-main/openspec/changes/archive/2025-12-30-fix-cline-workflows-implementation/specs/cli-update/spec.md +92 -0
  274. package/OpenSpec-main/openspec/changes/archive/2025-12-30-fix-cline-workflows-implementation/tasks.md +13 -0
  275. package/OpenSpec-main/openspec/changes/archive/2026-01-06-add-agent-schema-selection/proposal.md +26 -0
  276. package/OpenSpec-main/openspec/changes/archive/2026-01-06-add-agent-schema-selection/tasks.md +32 -0
  277. package/OpenSpec-main/openspec/changes/archive/2026-01-06-add-per-change-schema-metadata/design.md +147 -0
  278. package/OpenSpec-main/openspec/changes/archive/2026-01-06-add-per-change-schema-metadata/proposal.md +29 -0
  279. package/OpenSpec-main/openspec/changes/archive/2026-01-06-add-per-change-schema-metadata/specs/cli-artifact-workflow/spec.md +98 -0
  280. package/OpenSpec-main/openspec/changes/archive/2026-01-06-add-per-change-schema-metadata/tasks.md +29 -0
  281. package/OpenSpec-main/openspec/changes/archive/2026-01-06-add-specs-apply-command/.openspec.yaml +2 -0
  282. package/OpenSpec-main/openspec/changes/archive/2026-01-06-add-specs-apply-command/design.md +77 -0
  283. package/OpenSpec-main/openspec/changes/archive/2026-01-06-add-specs-apply-command/proposal.md +32 -0
  284. package/OpenSpec-main/openspec/changes/archive/2026-01-06-add-specs-apply-command/specs/specs-sync-skill/spec.md +67 -0
  285. package/OpenSpec-main/openspec/changes/archive/2026-01-06-add-specs-apply-command/tasks.md +40 -0
  286. package/OpenSpec-main/openspec/changes/archive/2026-01-06-make-apply-instructions-schema-aware/proposal.md +138 -0
  287. package/OpenSpec-main/openspec/changes/archive/2026-01-06-make-apply-instructions-schema-aware/specs/cli-artifact-workflow/spec.md +60 -0
  288. package/OpenSpec-main/openspec/changes/archive/2026-01-06-make-apply-instructions-schema-aware/tasks.md +35 -0
  289. package/OpenSpec-main/openspec/changes/archive/2026-01-06-opsx-archive-command/.openspec.yaml +2 -0
  290. package/OpenSpec-main/openspec/changes/archive/2026-01-06-opsx-archive-command/design.md +84 -0
  291. package/OpenSpec-main/openspec/changes/archive/2026-01-06-opsx-archive-command/proposal.md +28 -0
  292. package/OpenSpec-main/openspec/changes/archive/2026-01-06-opsx-archive-command/specs/opsx-archive-skill/spec.md +122 -0
  293. package/OpenSpec-main/openspec/changes/archive/2026-01-06-opsx-archive-command/tasks.md +23 -0
  294. package/OpenSpec-main/openspec/changes/archive/2026-01-07-add-nix-flake-support/.openspec.yaml +2 -0
  295. package/OpenSpec-main/openspec/changes/archive/2026-01-07-add-nix-flake-support/design.md +94 -0
  296. package/OpenSpec-main/openspec/changes/archive/2026-01-07-add-nix-flake-support/proposal.md +25 -0
  297. package/OpenSpec-main/openspec/changes/archive/2026-01-07-add-nix-flake-support/specs/nix-flake-support/spec.md +79 -0
  298. package/OpenSpec-main/openspec/changes/archive/2026-01-07-add-nix-flake-support/tasks.md +65 -0
  299. package/OpenSpec-main/openspec/changes/archive/2026-01-09-add-flake-update-script/.openspec.yaml +2 -0
  300. package/OpenSpec-main/openspec/changes/archive/2026-01-09-add-flake-update-script/design.md +117 -0
  301. package/OpenSpec-main/openspec/changes/archive/2026-01-09-add-flake-update-script/proposal.md +23 -0
  302. package/OpenSpec-main/openspec/changes/archive/2026-01-09-add-flake-update-script/specs/flake-update-script/spec.md +93 -0
  303. package/OpenSpec-main/openspec/changes/archive/2026-01-09-add-flake-update-script/tasks.md +55 -0
  304. package/OpenSpec-main/openspec/changes/archive/2026-01-09-add-posthog-analytics/.openspec.yaml +2 -0
  305. package/OpenSpec-main/openspec/changes/archive/2026-01-09-add-posthog-analytics/design.md +175 -0
  306. package/OpenSpec-main/openspec/changes/archive/2026-01-09-add-posthog-analytics/proposal.md +37 -0
  307. package/OpenSpec-main/openspec/changes/archive/2026-01-09-add-posthog-analytics/specs/global-config/spec.md +21 -0
  308. package/OpenSpec-main/openspec/changes/archive/2026-01-09-add-posthog-analytics/specs/telemetry/spec.md +116 -0
  309. package/OpenSpec-main/openspec/changes/archive/2026-01-09-add-posthog-analytics/tasks.md +47 -0
  310. package/OpenSpec-main/openspec/changes/archive/2026-01-09-fix-codebuddy-frontmatter-fields/proposal.md +16 -0
  311. package/OpenSpec-main/openspec/changes/archive/2026-01-09-fix-codebuddy-frontmatter-fields/specs/cli-init/spec.md +75 -0
  312. package/OpenSpec-main/openspec/changes/archive/2026-01-09-fix-codebuddy-frontmatter-fields/specs/cli-update/spec.md +56 -0
  313. package/OpenSpec-main/openspec/changes/archive/2026-01-09-fix-codebuddy-frontmatter-fields/tasks.md +6 -0
  314. package/OpenSpec-main/openspec/changes/archive/2026-01-15-add-nix-ci-validation/design.md +206 -0
  315. package/OpenSpec-main/openspec/changes/archive/2026-01-15-add-nix-ci-validation/proposal.md +21 -0
  316. package/OpenSpec-main/openspec/changes/archive/2026-01-15-add-nix-ci-validation/specs/ci-nix-validation/spec.md +104 -0
  317. package/OpenSpec-main/openspec/changes/archive/2026-01-15-add-nix-ci-validation/tasks.md +49 -0
  318. package/OpenSpec-main/openspec/changes/archive/2026-01-30-opencode-command-references/.openspec.yaml +2 -0
  319. package/OpenSpec-main/openspec/changes/archive/2026-01-30-opencode-command-references/README.md +3 -0
  320. package/OpenSpec-main/openspec/changes/archive/2026-01-30-opencode-command-references/design.md +70 -0
  321. package/OpenSpec-main/openspec/changes/archive/2026-01-30-opencode-command-references/proposal.md +32 -0
  322. package/OpenSpec-main/openspec/changes/archive/2026-01-30-opencode-command-references/specs/no-changes.md +9 -0
  323. package/OpenSpec-main/openspec/changes/archive/2026-01-30-opencode-command-references/tasks.md +22 -0
  324. package/OpenSpec-main/openspec/changes/archive/2026-02-17-add-feedback-command/proposal.md +20 -0
  325. package/OpenSpec-main/openspec/changes/archive/2026-02-17-add-feedback-command/specs/cli-feedback/spec.md +188 -0
  326. package/OpenSpec-main/openspec/changes/archive/2026-02-17-add-feedback-command/tasks.md +30 -0
  327. package/OpenSpec-main/openspec/changes/archive/2026-02-17-add-opsx-onboard-skill/.openspec.yaml +2 -0
  328. package/OpenSpec-main/openspec/changes/archive/2026-02-17-add-opsx-onboard-skill/design.md +115 -0
  329. package/OpenSpec-main/openspec/changes/archive/2026-02-17-add-opsx-onboard-skill/proposal.md +27 -0
  330. package/OpenSpec-main/openspec/changes/archive/2026-02-17-add-opsx-onboard-skill/specs/opsx-onboard-skill/spec.md +162 -0
  331. package/OpenSpec-main/openspec/changes/archive/2026-02-17-add-opsx-onboard-skill/tasks.md +21 -0
  332. package/OpenSpec-main/openspec/changes/archive/2026-02-17-add-verify-skill/design.md +96 -0
  333. package/OpenSpec-main/openspec/changes/archive/2026-02-17-add-verify-skill/proposal.md +48 -0
  334. package/OpenSpec-main/openspec/changes/archive/2026-02-17-add-verify-skill/specs/opsx-verify-skill/spec.md +190 -0
  335. package/OpenSpec-main/openspec/changes/archive/2026-02-17-add-verify-skill/tasks.md +15 -0
  336. package/OpenSpec-main/openspec/changes/archive/2026-02-17-merge-init-experimental/.openspec.yaml +2 -0
  337. package/OpenSpec-main/openspec/changes/archive/2026-02-17-merge-init-experimental/design.md +193 -0
  338. package/OpenSpec-main/openspec/changes/archive/2026-02-17-merge-init-experimental/proposal.md +32 -0
  339. package/OpenSpec-main/openspec/changes/archive/2026-02-17-merge-init-experimental/specs/cli-init/spec.md +176 -0
  340. package/OpenSpec-main/openspec/changes/archive/2026-02-17-merge-init-experimental/specs/legacy-cleanup/spec.md +158 -0
  341. package/OpenSpec-main/openspec/changes/archive/2026-02-17-merge-init-experimental/tasks.md +67 -0
  342. package/OpenSpec-main/openspec/changes/archive/2026-02-17-multi-provider-skill-generation/.openspec.yaml +2 -0
  343. package/OpenSpec-main/openspec/changes/archive/2026-02-17-multi-provider-skill-generation/design.md +144 -0
  344. package/OpenSpec-main/openspec/changes/archive/2026-02-17-multi-provider-skill-generation/proposal.md +36 -0
  345. package/OpenSpec-main/openspec/changes/archive/2026-02-17-multi-provider-skill-generation/specs/ai-tool-paths/spec.md +63 -0
  346. package/OpenSpec-main/openspec/changes/archive/2026-02-17-multi-provider-skill-generation/specs/cli-artifact-workflow/spec.md +60 -0
  347. package/OpenSpec-main/openspec/changes/archive/2026-02-17-multi-provider-skill-generation/specs/command-generation/spec.md +98 -0
  348. package/OpenSpec-main/openspec/changes/archive/2026-02-17-multi-provider-skill-generation/tasks.md +55 -0
  349. package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-config/.openspec.yaml +2 -0
  350. package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-config/design.md +665 -0
  351. package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-config/proposal.md +774 -0
  352. package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-config/specs/config-loading/spec.md +119 -0
  353. package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-config/specs/context-injection/spec.md +51 -0
  354. package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-config/specs/rules-injection/spec.md +99 -0
  355. package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-config/specs/schema-resolution/spec.md +83 -0
  356. package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-config/tasks.md +72 -0
  357. package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-local-schemas/.openspec.yaml +2 -0
  358. package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-local-schemas/design.md +117 -0
  359. package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-local-schemas/proposal.md +167 -0
  360. package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-local-schemas/specs/schema-resolution/spec.md +88 -0
  361. package/OpenSpec-main/openspec/changes/archive/2026-02-17-project-local-schemas/tasks.md +28 -0
  362. package/OpenSpec-main/openspec/changes/archive/2026-02-17-schema-management-cli/.openspec.yaml +2 -0
  363. package/OpenSpec-main/openspec/changes/archive/2026-02-17-schema-management-cli/design.md +113 -0
  364. package/OpenSpec-main/openspec/changes/archive/2026-02-17-schema-management-cli/proposal.md +55 -0
  365. package/OpenSpec-main/openspec/changes/archive/2026-02-17-schema-management-cli/specs/schema-fork-command/spec.md +66 -0
  366. package/OpenSpec-main/openspec/changes/archive/2026-02-17-schema-management-cli/specs/schema-init-command/spec.md +71 -0
  367. package/OpenSpec-main/openspec/changes/archive/2026-02-17-schema-management-cli/specs/schema-validate-command/spec.md +86 -0
  368. package/OpenSpec-main/openspec/changes/archive/2026-02-17-schema-management-cli/specs/schema-which-command/spec.md +65 -0
  369. package/OpenSpec-main/openspec/changes/archive/2026-02-17-schema-management-cli/tasks.md +67 -0
  370. package/OpenSpec-main/openspec/changes/archive/2026-04-23-add-kimi-cli-skills-only-support/.openspec.yaml +2 -0
  371. package/OpenSpec-main/openspec/changes/archive/2026-04-23-add-kimi-cli-skills-only-support/README.md +3 -0
  372. package/OpenSpec-main/openspec/changes/archive/2026-04-23-add-kimi-cli-skills-only-support/design.md +85 -0
  373. package/OpenSpec-main/openspec/changes/archive/2026-04-23-add-kimi-cli-skills-only-support/proposal.md +38 -0
  374. package/OpenSpec-main/openspec/changes/archive/2026-04-23-add-kimi-cli-skills-only-support/specs/ai-tool-paths/spec.md +12 -0
  375. package/OpenSpec-main/openspec/changes/archive/2026-04-23-add-kimi-cli-skills-only-support/specs/cli-init/spec.md +37 -0
  376. package/OpenSpec-main/openspec/changes/archive/2026-04-23-add-kimi-cli-skills-only-support/tasks.md +22 -0
  377. package/OpenSpec-main/openspec/changes/archive/2026-05-04-workspace-foundation/design.md +208 -0
  378. package/OpenSpec-main/openspec/changes/archive/2026-05-04-workspace-foundation/proposal.md +142 -0
  379. package/OpenSpec-main/openspec/changes/archive/2026-05-04-workspace-foundation/specs/openspec-conventions/spec.md +29 -0
  380. package/OpenSpec-main/openspec/changes/archive/2026-05-04-workspace-foundation/specs/workspace-foundation/spec.md +199 -0
  381. package/OpenSpec-main/openspec/changes/archive/2026-05-04-workspace-foundation/tasks.md +56 -0
  382. package/OpenSpec-main/openspec/changes/archive/2026-05-06-workspace-create-and-register-repos/design.md +356 -0
  383. package/OpenSpec-main/openspec/changes/archive/2026-05-06-workspace-create-and-register-repos/proposal.md +128 -0
  384. package/OpenSpec-main/openspec/changes/archive/2026-05-06-workspace-create-and-register-repos/specs/cli-artifact-workflow/spec.md +24 -0
  385. package/OpenSpec-main/openspec/changes/archive/2026-05-06-workspace-create-and-register-repos/specs/workspace-foundation/spec.md +35 -0
  386. package/OpenSpec-main/openspec/changes/archive/2026-05-06-workspace-create-and-register-repos/specs/workspace-links/spec.md +356 -0
  387. package/OpenSpec-main/openspec/changes/archive/2026-05-06-workspace-create-and-register-repos/tasks.md +121 -0
  388. package/OpenSpec-main/openspec/changes/archive/2026-05-06-workspace-open-agent-context/design.md +266 -0
  389. package/OpenSpec-main/openspec/changes/archive/2026-05-06-workspace-open-agent-context/proposal.md +65 -0
  390. package/OpenSpec-main/openspec/changes/archive/2026-05-06-workspace-open-agent-context/specs/workspace-foundation/spec.md +76 -0
  391. package/OpenSpec-main/openspec/changes/archive/2026-05-06-workspace-open-agent-context/specs/workspace-open/spec.md +199 -0
  392. package/OpenSpec-main/openspec/changes/archive/2026-05-06-workspace-open-agent-context/tasks.md +89 -0
  393. package/OpenSpec-main/openspec/changes/archive/2026-05-14-workspace-change-planning/design.md +242 -0
  394. package/OpenSpec-main/openspec/changes/archive/2026-05-14-workspace-change-planning/proposal.md +78 -0
  395. package/OpenSpec-main/openspec/changes/archive/2026-05-14-workspace-change-planning/specs/artifact-graph/spec.md +36 -0
  396. package/OpenSpec-main/openspec/changes/archive/2026-05-14-workspace-change-planning/specs/change-creation/spec.md +42 -0
  397. package/OpenSpec-main/openspec/changes/archive/2026-05-14-workspace-change-planning/specs/cli-artifact-workflow/spec.md +100 -0
  398. package/OpenSpec-main/openspec/changes/archive/2026-05-14-workspace-change-planning/specs/cli-config/spec.md +55 -0
  399. package/OpenSpec-main/openspec/changes/archive/2026-05-14-workspace-change-planning/specs/cli-update/spec.md +21 -0
  400. package/OpenSpec-main/openspec/changes/archive/2026-05-14-workspace-change-planning/specs/openspec-conventions/spec.md +32 -0
  401. package/OpenSpec-main/openspec/changes/archive/2026-05-14-workspace-change-planning/specs/schema-resolution/spec.md +25 -0
  402. package/OpenSpec-main/openspec/changes/archive/2026-05-14-workspace-change-planning/specs/workspace-change-planning/spec.md +67 -0
  403. package/OpenSpec-main/openspec/changes/archive/2026-05-14-workspace-change-planning/specs/workspace-links/spec.md +163 -0
  404. package/OpenSpec-main/openspec/changes/archive/2026-05-14-workspace-change-planning/tasks.md +133 -0
  405. package/OpenSpec-main/openspec/changes/fix-opencode-commands-directory/.openspec.yaml +2 -0
  406. package/OpenSpec-main/openspec/changes/fix-opencode-commands-directory/design.md +48 -0
  407. package/OpenSpec-main/openspec/changes/fix-opencode-commands-directory/proposal.md +26 -0
  408. package/OpenSpec-main/openspec/changes/fix-opencode-commands-directory/specs/command-generation/spec.md +63 -0
  409. package/OpenSpec-main/openspec/changes/fix-opencode-commands-directory/tasks.md +19 -0
  410. package/OpenSpec-main/openspec/changes/graceful-status-no-changes/.openspec.yaml +2 -0
  411. package/OpenSpec-main/openspec/changes/graceful-status-no-changes/design.md +38 -0
  412. package/OpenSpec-main/openspec/changes/graceful-status-no-changes/proposal.md +25 -0
  413. package/OpenSpec-main/openspec/changes/graceful-status-no-changes/specs/graceful-status-empty/spec.md +27 -0
  414. package/OpenSpec-main/openspec/changes/graceful-status-no-changes/tasks.md +16 -0
  415. package/OpenSpec-main/openspec/changes/schema-alias-support/.openspec.yaml +2 -0
  416. package/OpenSpec-main/openspec/changes/schema-alias-support/proposal.md +28 -0
  417. package/OpenSpec-main/openspec/changes/simplify-skill-installation/.openspec.yaml +2 -0
  418. package/OpenSpec-main/openspec/changes/simplify-skill-installation/design.md +288 -0
  419. package/OpenSpec-main/openspec/changes/simplify-skill-installation/proposal.md +202 -0
  420. package/OpenSpec-main/openspec/changes/simplify-skill-installation/specs/cli-init/spec.md +199 -0
  421. package/OpenSpec-main/openspec/changes/simplify-skill-installation/specs/cli-update/spec.md +177 -0
  422. package/OpenSpec-main/openspec/changes/simplify-skill-installation/specs/profiles/spec.md +142 -0
  423. package/OpenSpec-main/openspec/changes/simplify-skill-installation/specs/propose-workflow/spec.md +42 -0
  424. package/OpenSpec-main/openspec/changes/simplify-skill-installation/tasks.md +132 -0
  425. package/OpenSpec-main/openspec/changes/unify-template-generation-pipeline/.openspec.yaml +2 -0
  426. package/OpenSpec-main/openspec/changes/unify-template-generation-pipeline/design.md +149 -0
  427. package/OpenSpec-main/openspec/changes/unify-template-generation-pipeline/proposal.md +47 -0
  428. package/OpenSpec-main/openspec/changes/unify-template-generation-pipeline/specs/template-artifact-pipeline/spec.md +89 -0
  429. package/OpenSpec-main/openspec/changes/unify-template-generation-pipeline/tasks.md +41 -0
  430. package/OpenSpec-main/openspec/changes/workspace-agent-guidance/.openspec.yaml +2 -0
  431. package/OpenSpec-main/openspec/changes/workspace-agent-guidance/proposal.md +100 -0
  432. package/OpenSpec-main/openspec/changes/workspace-apply-repo-slice/proposal.md +58 -0
  433. package/OpenSpec-main/openspec/changes/workspace-reimplementation-roadmap/HISTORICAL_DIRECTION.md +511 -0
  434. package/OpenSpec-main/openspec/changes/workspace-reimplementation-roadmap/POC_REFERENCE_GUIDE.md +266 -0
  435. package/OpenSpec-main/openspec/changes/workspace-reimplementation-roadmap/README.md +107 -0
  436. package/OpenSpec-main/openspec/changes/workspace-reimplementation-roadmap/START_HERE.md +105 -0
  437. package/OpenSpec-main/openspec/changes/workspace-reimplementation-roadmap/proposal.md +62 -0
  438. package/OpenSpec-main/openspec/changes/workspace-verify-and-archive/proposal.md +57 -0
  439. package/OpenSpec-main/openspec/config.yaml +36 -0
  440. package/OpenSpec-main/openspec/explorations/explore-workflow-ux.md +116 -0
  441. package/OpenSpec-main/openspec/explorations/workspace-architecture.md +857 -0
  442. package/OpenSpec-main/openspec/explorations/workspace-roadmap.md +367 -0
  443. package/OpenSpec-main/openspec/explorations/workspace-user-journeys.md +2259 -0
  444. package/OpenSpec-main/openspec/explorations/workspace-ux-simplification.md +491 -0
  445. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/.initiative.yaml +27 -0
  446. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/README.md +33 -0
  447. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/decisions.md +204 -0
  448. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/direction.md +447 -0
  449. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/questions.md +23 -0
  450. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/roadmap.md +759 -0
  451. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/tasks.md +308 -0
  452. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/01-lock-the-direction/evidence.md +154 -0
  453. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/01-lock-the-direction/plan.md +90 -0
  454. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/01-lock-the-direction/tasks.md +44 -0
  455. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/02-stabilize-workspace-as-local-view/evidence.md +68 -0
  456. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/02-stabilize-workspace-as-local-view/plan.md +80 -0
  457. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/02-stabilize-workspace-as-local-view/tasks.md +23 -0
  458. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/03-add-context-store-foundation/evidence.md +43 -0
  459. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/03-add-context-store-foundation/plan.md +85 -0
  460. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/03-add-context-store-foundation/tasks.md +17 -0
  461. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/04-add-collection-foundation/evidence.md +77 -0
  462. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/04-add-collection-foundation/plan.md +198 -0
  463. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/04-add-collection-foundation/tasks.md +14 -0
  464. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/05-ship-initiative-mvp/evidence.md +99 -0
  465. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/05-ship-initiative-mvp/plan.md +236 -0
  466. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/05-ship-initiative-mvp/tasks.md +21 -0
  467. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/06-add-minimal-context-store-ux/evidence.md +97 -0
  468. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/06-add-minimal-context-store-ux/plan.md +333 -0
  469. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/06-add-minimal-context-store-ux/tasks.md +29 -0
  470. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/07-add-agent-first-initiative-discovery/evidence.md +97 -0
  471. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/07-add-agent-first-initiative-discovery/plan.md +184 -0
  472. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/07-add-agent-first-initiative-discovery/tasks.md +27 -0
  473. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/08-connect-repo-local-changes-to-initiatives/evidence.md +239 -0
  474. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/08-connect-repo-local-changes-to-initiatives/plan.md +279 -0
  475. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/08-connect-repo-local-changes-to-initiatives/tasks.md +22 -0
  476. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/09-add-initiative-resolve/decision-review.md +64 -0
  477. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/09-add-initiative-resolve/evidence.md +106 -0
  478. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/09-add-initiative-resolve/plan.md +141 -0
  479. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/09-add-initiative-resolve/tasks.md +22 -0
  480. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/10-let-workspaces-open-initiatives/plan.md +430 -0
  481. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/10-let-workspaces-open-initiatives/tasks.md +43 -0
  482. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/11-manual-beta-reality-pass/notes.md +289 -0
  483. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/11-manual-beta-reality-pass/plan.md +39 -0
  484. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/11-manual-beta-reality-pass/tasks.md +8 -0
  485. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/12-context-store-first-run-and-cleanup-ux/evidence.md +45 -0
  486. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/12-context-store-first-run-and-cleanup-ux/plan.md +150 -0
  487. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/12-context-store-first-run-and-cleanup-ux/tasks.md +23 -0
  488. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/13-agent-handoff-output-and-delivery-polish/evidence.md +25 -0
  489. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/13-agent-handoff-output-and-delivery-polish/plan.md +98 -0
  490. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/13-agent-handoff-output-and-delivery-polish/tasks.md +25 -0
  491. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/14-workspaces-beta-guide-split/plan.md +37 -0
  492. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/14-workspaces-beta-guide-split/tasks.md +9 -0
  493. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/15-context-store-project-roots-and-schema-led-initiatives/evidence.md +140 -0
  494. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/15-context-store-project-roots-and-schema-led-initiatives/plan.md +344 -0
  495. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/15-context-store-project-roots-and-schema-led-initiatives/tasks.md +39 -0
  496. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/16-add-escalation-ux/plan.md +26 -0
  497. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/16-add-escalation-ux/tasks.md +7 -0
  498. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/17-harden-team-shared-coordination/plan.md +25 -0
  499. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/17-harden-team-shared-coordination/tasks.md +7 -0
  500. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/18-explore-initiative-hosted-target-bound-change-artifacts/evidence.md +397 -0
  501. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/18-explore-initiative-hosted-target-bound-change-artifacts/plan.md +180 -0
  502. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/18-explore-initiative-hosted-target-bound-change-artifacts/tasks.md +28 -0
  503. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/19-review-workspace-beta-compatibility-before-public-release/plan.md +62 -0
  504. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/19-review-workspace-beta-compatibility-before-public-release/tasks.md +16 -0
  505. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/proposed-initiative-next-agent-handoff-ux/evidence.md +47 -0
  506. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/proposed-initiative-next-agent-handoff-ux/plan.md +90 -0
  507. package/OpenSpec-main/openspec/initiatives/context-store-and-initiatives/work-items/proposed-initiative-next-agent-handoff-ux/tasks.md +18 -0
  508. package/OpenSpec-main/openspec/specs/ai-tool-paths/spec.md +63 -0
  509. package/OpenSpec-main/openspec/specs/artifact-graph/spec.md +165 -0
  510. package/OpenSpec-main/openspec/specs/change-creation/spec.md +108 -0
  511. package/OpenSpec-main/openspec/specs/ci-nix-validation/spec.md +107 -0
  512. package/OpenSpec-main/openspec/specs/cli-archive/spec.md +210 -0
  513. package/OpenSpec-main/openspec/specs/cli-artifact-workflow/spec.md +398 -0
  514. package/OpenSpec-main/openspec/specs/cli-change/spec.md +92 -0
  515. package/OpenSpec-main/openspec/specs/cli-completion/spec.md +432 -0
  516. package/OpenSpec-main/openspec/specs/cli-config/spec.md +318 -0
  517. package/OpenSpec-main/openspec/specs/cli-feedback/spec.md +193 -0
  518. package/OpenSpec-main/openspec/specs/cli-init/spec.md +269 -0
  519. package/OpenSpec-main/openspec/specs/cli-list/spec.md +103 -0
  520. package/OpenSpec-main/openspec/specs/cli-show/spec.md +86 -0
  521. package/OpenSpec-main/openspec/specs/cli-spec/spec.md +88 -0
  522. package/OpenSpec-main/openspec/specs/cli-update/spec.md +229 -0
  523. package/OpenSpec-main/openspec/specs/cli-validate/spec.md +219 -0
  524. package/OpenSpec-main/openspec/specs/cli-view/spec.md +129 -0
  525. package/OpenSpec-main/openspec/specs/command-generation/spec.md +97 -0
  526. package/OpenSpec-main/openspec/specs/config-loading/spec.md +122 -0
  527. package/OpenSpec-main/openspec/specs/context-injection/spec.md +53 -0
  528. package/OpenSpec-main/openspec/specs/docs-agent-instructions/spec.md +62 -0
  529. package/OpenSpec-main/openspec/specs/global-config/spec.md +101 -0
  530. package/OpenSpec-main/openspec/specs/instruction-loader/spec.md +70 -0
  531. package/OpenSpec-main/openspec/specs/legacy-cleanup/spec.md +163 -0
  532. package/OpenSpec-main/openspec/specs/openspec-conventions/spec.md +556 -0
  533. package/OpenSpec-main/openspec/specs/opsx-archive-skill/spec.md +128 -0
  534. package/OpenSpec-main/openspec/specs/opsx-onboard-skill/spec.md +167 -0
  535. package/OpenSpec-main/openspec/specs/opsx-verify-skill/spec.md +189 -0
  536. package/OpenSpec-main/openspec/specs/rules-injection/spec.md +102 -0
  537. package/OpenSpec-main/openspec/specs/schema-fork-command/spec.md +71 -0
  538. package/OpenSpec-main/openspec/specs/schema-init-command/spec.md +76 -0
  539. package/OpenSpec-main/openspec/specs/schema-resolution/spec.md +201 -0
  540. package/OpenSpec-main/openspec/specs/schema-validate-command/spec.md +91 -0
  541. package/OpenSpec-main/openspec/specs/schema-which-command/spec.md +70 -0
  542. package/OpenSpec-main/openspec/specs/specs-sync-skill/spec.md +72 -0
  543. package/OpenSpec-main/openspec/specs/telemetry/spec.md +122 -0
  544. package/OpenSpec-main/openspec/specs/workspace-change-planning/spec.md +71 -0
  545. package/OpenSpec-main/openspec/specs/workspace-foundation/spec.md +279 -0
  546. package/OpenSpec-main/openspec/specs/workspace-links/spec.md +529 -0
  547. package/OpenSpec-main/openspec/specs/workspace-open/spec.md +205 -0
  548. package/OpenSpec-main/openspec-parallel-merge-plan.md +98 -0
  549. package/OpenSpec-main/package-lock.json +4978 -0
  550. package/OpenSpec-main/package.json +84 -0
  551. package/OpenSpec-main/pnpm-lock.yaml +3187 -0
  552. package/OpenSpec-main/schemas/spec-driven/schema.yaml +153 -0
  553. package/OpenSpec-main/schemas/spec-driven/templates/design.md +19 -0
  554. package/OpenSpec-main/schemas/spec-driven/templates/proposal.md +23 -0
  555. package/OpenSpec-main/schemas/spec-driven/templates/spec.md +8 -0
  556. package/OpenSpec-main/schemas/spec-driven/templates/tasks.md +9 -0
  557. package/OpenSpec-main/schemas/workspace-planning/schema.yaml +72 -0
  558. package/OpenSpec-main/schemas/workspace-planning/templates/design.md +33 -0
  559. package/OpenSpec-main/schemas/workspace-planning/templates/proposal.md +28 -0
  560. package/OpenSpec-main/schemas/workspace-planning/templates/spec.md +9 -0
  561. package/OpenSpec-main/schemas/workspace-planning/templates/tasks.md +15 -0
  562. package/OpenSpec-main/scripts/README.md +37 -0
  563. package/OpenSpec-main/scripts/pack-version-check.mjs +111 -0
  564. package/OpenSpec-main/scripts/postinstall.js +83 -0
  565. package/OpenSpec-main/scripts/test-postinstall.sh +57 -0
  566. package/OpenSpec-main/scripts/update-flake.sh +128 -0
  567. package/OpenSpec-main/test/cli-e2e/basic.test.ts +205 -0
  568. package/OpenSpec-main/test/commands/artifact-workflow.test.ts +1063 -0
  569. package/OpenSpec-main/test/commands/change-initiative-link.test.ts +532 -0
  570. package/OpenSpec-main/test/commands/change.interactive-show.test.ts +45 -0
  571. package/OpenSpec-main/test/commands/change.interactive-validate.test.ts +48 -0
  572. package/OpenSpec-main/test/commands/completion.test.ts +278 -0
  573. package/OpenSpec-main/test/commands/config-profile.test.ts +532 -0
  574. package/OpenSpec-main/test/commands/config.test.ts +285 -0
  575. package/OpenSpec-main/test/commands/context-store.test.ts +692 -0
  576. package/OpenSpec-main/test/commands/feedback.test.ts +429 -0
  577. package/OpenSpec-main/test/commands/initiative.test.ts +907 -0
  578. package/OpenSpec-main/test/commands/schema.test.ts +467 -0
  579. package/OpenSpec-main/test/commands/show.test.ts +123 -0
  580. package/OpenSpec-main/test/commands/spec.interactive-show.test.ts +44 -0
  581. package/OpenSpec-main/test/commands/spec.interactive-validate.test.ts +44 -0
  582. package/OpenSpec-main/test/commands/spec.test.ts +324 -0
  583. package/OpenSpec-main/test/commands/validate.enriched-output.test.ts +49 -0
  584. package/OpenSpec-main/test/commands/validate.test.ts +147 -0
  585. package/OpenSpec-main/test/commands/workspace-initiative-open.test.ts +638 -0
  586. package/OpenSpec-main/test/commands/workspace-open.test.ts +123 -0
  587. package/OpenSpec-main/test/commands/workspace.interactive.test.ts +696 -0
  588. package/OpenSpec-main/test/commands/workspace.test.ts +1812 -0
  589. package/OpenSpec-main/test/core/archive.test.ts +869 -0
  590. package/OpenSpec-main/test/core/artifact-graph/graph.test.ts +268 -0
  591. package/OpenSpec-main/test/core/artifact-graph/instruction-loader.test.ts +609 -0
  592. package/OpenSpec-main/test/core/artifact-graph/outputs.test.ts +175 -0
  593. package/OpenSpec-main/test/core/artifact-graph/resolver.test.ts +651 -0
  594. package/OpenSpec-main/test/core/artifact-graph/schema.test.ts +207 -0
  595. package/OpenSpec-main/test/core/artifact-graph/state.test.ts +174 -0
  596. package/OpenSpec-main/test/core/artifact-graph/workflow.integration.test.ts +182 -0
  597. package/OpenSpec-main/test/core/available-tools.test.ts +167 -0
  598. package/OpenSpec-main/test/core/collections/initiatives/operations.test.ts +342 -0
  599. package/OpenSpec-main/test/core/collections/initiatives/resolution.test.ts +21 -0
  600. package/OpenSpec-main/test/core/collections/initiatives/schema.test.ts +201 -0
  601. package/OpenSpec-main/test/core/collections/initiatives/templates.test.ts +74 -0
  602. package/OpenSpec-main/test/core/collections/runtime.test.ts +214 -0
  603. package/OpenSpec-main/test/core/command-generation/adapters.test.ts +710 -0
  604. package/OpenSpec-main/test/core/command-generation/generator.test.ts +110 -0
  605. package/OpenSpec-main/test/core/command-generation/registry.test.ts +108 -0
  606. package/OpenSpec-main/test/core/command-generation/types.test.ts +79 -0
  607. package/OpenSpec-main/test/core/commands/change-command.list.test.ts +76 -0
  608. package/OpenSpec-main/test/core/commands/change-command.show-validate.test.ts +111 -0
  609. package/OpenSpec-main/test/core/completions/command-registry.test.ts +201 -0
  610. package/OpenSpec-main/test/core/completions/completion-provider.test.ts +288 -0
  611. package/OpenSpec-main/test/core/completions/generators/bash-generator.test.ts +586 -0
  612. package/OpenSpec-main/test/core/completions/generators/fish-generator.test.ts +549 -0
  613. package/OpenSpec-main/test/core/completions/generators/powershell-generator.test.ts +621 -0
  614. package/OpenSpec-main/test/core/completions/generators/zsh-generator.test.ts +425 -0
  615. package/OpenSpec-main/test/core/completions/installers/bash-installer.test.ts +484 -0
  616. package/OpenSpec-main/test/core/completions/installers/fish-installer.test.ts +321 -0
  617. package/OpenSpec-main/test/core/completions/installers/powershell-installer.test.ts +824 -0
  618. package/OpenSpec-main/test/core/completions/installers/zsh-installer.test.ts +750 -0
  619. package/OpenSpec-main/test/core/config-schema.test.ts +340 -0
  620. package/OpenSpec-main/test/core/context-store/foundation.test.ts +364 -0
  621. package/OpenSpec-main/test/core/context-store/registry.test.ts +599 -0
  622. package/OpenSpec-main/test/core/converters/json-converter.test.ts +184 -0
  623. package/OpenSpec-main/test/core/global-config.test.ts +371 -0
  624. package/OpenSpec-main/test/core/init.test.ts +786 -0
  625. package/OpenSpec-main/test/core/legacy-cleanup.test.ts +1162 -0
  626. package/OpenSpec-main/test/core/list.test.ts +165 -0
  627. package/OpenSpec-main/test/core/migration.test.ts +150 -0
  628. package/OpenSpec-main/test/core/parsers/change-parser.test.ts +52 -0
  629. package/OpenSpec-main/test/core/parsers/markdown-parser.test.ts +355 -0
  630. package/OpenSpec-main/test/core/parsers/requirement-blocks.test.ts +46 -0
  631. package/OpenSpec-main/test/core/planning-home.test.ts +120 -0
  632. package/OpenSpec-main/test/core/profile-sync-drift.test.ts +92 -0
  633. package/OpenSpec-main/test/core/profiles.test.ts +63 -0
  634. package/OpenSpec-main/test/core/project-config.test.ts +610 -0
  635. package/OpenSpec-main/test/core/shared/skill-generation.test.ts +301 -0
  636. package/OpenSpec-main/test/core/shared/tool-detection.test.ts +333 -0
  637. package/OpenSpec-main/test/core/templates/skill-templates-parity.test.ts +172 -0
  638. package/OpenSpec-main/test/core/update.test.ts +1810 -0
  639. package/OpenSpec-main/test/core/validation.enriched-messages.test.ts +74 -0
  640. package/OpenSpec-main/test/core/validation.test.ts +680 -0
  641. package/OpenSpec-main/test/core/view.test.ts +129 -0
  642. package/OpenSpec-main/test/core/workspace/foundation.test.ts +694 -0
  643. package/OpenSpec-main/test/core/workspace/legacy-state.test.ts +221 -0
  644. package/OpenSpec-main/test/core/workspace/skills.test.ts +69 -0
  645. package/OpenSpec-main/test/fixtures/tmp-init/openspec/changes/c1/proposal.md +7 -0
  646. package/OpenSpec-main/test/fixtures/tmp-init/openspec/changes/c1/specs/alpha/spec.md +8 -0
  647. package/OpenSpec-main/test/fixtures/tmp-init/openspec/specs/alpha/spec.md +12 -0
  648. package/OpenSpec-main/test/helpers/path-env.ts +26 -0
  649. package/OpenSpec-main/test/helpers/run-cli.ts +150 -0
  650. package/OpenSpec-main/test/prompts/searchable-multi-select.test.ts +220 -0
  651. package/OpenSpec-main/test/specs/source-specs-normalization.test.ts +63 -0
  652. package/OpenSpec-main/test/telemetry/config.test.ts +298 -0
  653. package/OpenSpec-main/test/telemetry/index.test.ts +219 -0
  654. package/OpenSpec-main/test/utils/change-metadata.test.ts +368 -0
  655. package/OpenSpec-main/test/utils/change-utils.test.ts +201 -0
  656. package/OpenSpec-main/test/utils/command-references.test.ts +83 -0
  657. package/OpenSpec-main/test/utils/file-system.test.ts +322 -0
  658. package/OpenSpec-main/test/utils/interactive.test.ts +125 -0
  659. package/OpenSpec-main/test/utils/marker-updates.test.ts +448 -0
  660. package/OpenSpec-main/test/utils/shell-detection.test.ts +185 -0
  661. package/OpenSpec-main/vitest.config.ts +47 -0
  662. package/OpenSpec-main/vitest.setup.ts +15 -0
  663. package/README.md +37 -4
  664. package/Scanner CLI Inteligente para Projetos.md +433 -0
  665. package/dist/index.js +1248 -161
  666. package/package.json +1 -1
  667. package/templates/wiki-recipes/nextjs.rules.md +21 -0
  668. package/templates/wiki-recipes/postgresql.rules.md +20 -0
  669. package/templates/wiki-recipes/react.rules.md +18 -0
  670. package/templates/wiki-recipes/tailwindcss.rules.md +18 -0
  671. package/templates/wiki-recipes/typescript.rules.md +21 -0
@@ -0,0 +1,786 @@
1
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
2
+ import { promises as fs } from 'fs';
3
+ import path from 'path';
4
+ import os from 'os';
5
+ import { InitCommand } from '../../src/core/init.js';
6
+ import { saveGlobalConfig, getGlobalConfig } from '../../src/core/global-config.js';
7
+
8
+ const { confirmMock, showWelcomeScreenMock, searchableMultiSelectMock } = vi.hoisted(() => ({
9
+ confirmMock: vi.fn(),
10
+ showWelcomeScreenMock: vi.fn().mockResolvedValue(undefined),
11
+ searchableMultiSelectMock: vi.fn(),
12
+ }));
13
+
14
+ vi.mock('@inquirer/prompts', () => ({
15
+ confirm: confirmMock,
16
+ }));
17
+
18
+ vi.mock('../../src/ui/welcome-screen.js', () => ({
19
+ showWelcomeScreen: showWelcomeScreenMock,
20
+ }));
21
+
22
+ vi.mock('../../src/prompts/searchable-multi-select.js', () => ({
23
+ searchableMultiSelect: searchableMultiSelectMock,
24
+ }));
25
+
26
+ describe('InitCommand', () => {
27
+ let testDir: string;
28
+ let configTempDir: string;
29
+ let originalEnv: NodeJS.ProcessEnv;
30
+
31
+ beforeEach(async () => {
32
+ testDir = path.join(os.tmpdir(), `openspec-init-test-${Date.now()}`);
33
+ await fs.mkdir(testDir, { recursive: true });
34
+ originalEnv = { ...process.env };
35
+ // Use a temp dir for global config to avoid reading real config
36
+ configTempDir = path.join(os.tmpdir(), `openspec-config-init-${Date.now()}`);
37
+ await fs.mkdir(configTempDir, { recursive: true });
38
+ process.env.XDG_CONFIG_HOME = configTempDir;
39
+
40
+ // Mock console.log to suppress output during tests
41
+ vi.spyOn(console, 'log').mockImplementation(() => { });
42
+ confirmMock.mockReset();
43
+ confirmMock.mockResolvedValue(true);
44
+ showWelcomeScreenMock.mockClear();
45
+ searchableMultiSelectMock.mockReset();
46
+ });
47
+
48
+ afterEach(async () => {
49
+ process.env = originalEnv;
50
+ await fs.rm(testDir, { recursive: true, force: true });
51
+ await fs.rm(configTempDir, { recursive: true, force: true });
52
+ vi.restoreAllMocks();
53
+ });
54
+
55
+ describe('execute with --tools flag', () => {
56
+ it('should create OpenSpec directory structure', async () => {
57
+ const initCommand = new InitCommand({ tools: 'claude', force: true });
58
+
59
+ await initCommand.execute(testDir);
60
+
61
+ const openspecPath = path.join(testDir, 'openspec');
62
+ expect(await directoryExists(openspecPath)).toBe(true);
63
+ expect(await directoryExists(path.join(openspecPath, 'specs'))).toBe(true);
64
+ expect(await directoryExists(path.join(openspecPath, 'changes'))).toBe(true);
65
+ expect(await directoryExists(path.join(openspecPath, 'changes', 'archive'))).toBe(true);
66
+ });
67
+
68
+ it('should create config.yaml with default schema', async () => {
69
+ const initCommand = new InitCommand({ tools: 'claude', force: true });
70
+
71
+ await initCommand.execute(testDir);
72
+
73
+ const configPath = path.join(testDir, 'openspec', 'config.yaml');
74
+ expect(await fileExists(configPath)).toBe(true);
75
+
76
+ const content = await fs.readFile(configPath, 'utf-8');
77
+ expect(content).toContain('schema: spec-driven');
78
+ });
79
+
80
+ it('should create core profile skills for Claude Code by default', async () => {
81
+ const initCommand = new InitCommand({ tools: 'claude', force: true });
82
+
83
+ await initCommand.execute(testDir);
84
+
85
+ // Core profile: propose, explore, apply, sync, archive
86
+ const coreSkillNames = [
87
+ 'openspec-propose',
88
+ 'openspec-explore',
89
+ 'openspec-apply-change',
90
+ 'openspec-sync-specs',
91
+ 'openspec-archive-change',
92
+ ];
93
+
94
+ for (const skillName of coreSkillNames) {
95
+ const skillFile = path.join(testDir, '.claude', 'skills', skillName, 'SKILL.md');
96
+ expect(await fileExists(skillFile)).toBe(true);
97
+
98
+ const content = await fs.readFile(skillFile, 'utf-8');
99
+ expect(content).toContain('---');
100
+ expect(content).toContain('name:');
101
+ expect(content).toContain('description:');
102
+ }
103
+
104
+ // Non-core skills should NOT be created
105
+ const nonCoreSkillNames = [
106
+ 'openspec-new-change',
107
+ 'openspec-continue-change',
108
+ 'openspec-ff-change',
109
+ 'openspec-bulk-archive-change',
110
+ 'openspec-verify-change',
111
+ ];
112
+
113
+ for (const skillName of nonCoreSkillNames) {
114
+ const skillFile = path.join(testDir, '.claude', 'skills', skillName, 'SKILL.md');
115
+ expect(await fileExists(skillFile)).toBe(false);
116
+ }
117
+ });
118
+
119
+ it('should create core profile commands for Claude Code by default', async () => {
120
+ const initCommand = new InitCommand({ tools: 'claude', force: true });
121
+
122
+ await initCommand.execute(testDir);
123
+
124
+ // Core profile: propose, explore, apply, sync, archive
125
+ const coreCommandNames = [
126
+ 'opsx/propose.md',
127
+ 'opsx/explore.md',
128
+ 'opsx/apply.md',
129
+ 'opsx/sync.md',
130
+ 'opsx/archive.md',
131
+ ];
132
+
133
+ for (const cmdName of coreCommandNames) {
134
+ const cmdFile = path.join(testDir, '.claude', 'commands', cmdName);
135
+ expect(await fileExists(cmdFile)).toBe(true);
136
+ }
137
+
138
+ // Non-core commands should NOT be created
139
+ const nonCoreCommandNames = [
140
+ 'opsx/new.md',
141
+ 'opsx/continue.md',
142
+ 'opsx/ff.md',
143
+ 'opsx/bulk-archive.md',
144
+ 'opsx/verify.md',
145
+ ];
146
+
147
+ for (const cmdName of nonCoreCommandNames) {
148
+ const cmdFile = path.join(testDir, '.claude', 'commands', cmdName);
149
+ expect(await fileExists(cmdFile)).toBe(false);
150
+ }
151
+ });
152
+
153
+ it('should create skills in Cursor skills directory', async () => {
154
+ const initCommand = new InitCommand({ tools: 'cursor', force: true });
155
+
156
+ await initCommand.execute(testDir);
157
+
158
+ const skillFile = path.join(testDir, '.cursor', 'skills', 'openspec-explore', 'SKILL.md');
159
+ expect(await fileExists(skillFile)).toBe(true);
160
+ });
161
+
162
+ it('should create skills in Windsurf skills directory', async () => {
163
+ const initCommand = new InitCommand({ tools: 'windsurf', force: true });
164
+
165
+ await initCommand.execute(testDir);
166
+
167
+ const skillFile = path.join(testDir, '.windsurf', 'skills', 'openspec-explore', 'SKILL.md');
168
+ expect(await fileExists(skillFile)).toBe(true);
169
+ });
170
+
171
+ it('should support Kimi CLI as an adapterless skills-only tool', async () => {
172
+ saveGlobalConfig({
173
+ featureFlags: {},
174
+ profile: 'core',
175
+ delivery: 'both',
176
+ });
177
+
178
+ const initCommand = new InitCommand({ tools: 'kimi', force: true });
179
+ await initCommand.execute(testDir);
180
+
181
+ const skillFile = path.join(testDir, '.kimi', 'skills', 'openspec-explore', 'SKILL.md');
182
+ expect(await fileExists(skillFile)).toBe(true);
183
+
184
+ const commandsDir = path.join(testDir, '.kimi', 'commands');
185
+ expect(await directoryExists(commandsDir)).toBe(false);
186
+
187
+ const logCalls = (console.log as unknown as { mock: { calls: unknown[][] } }).mock.calls.flat().map(String);
188
+ expect(
189
+ logCalls.some(
190
+ (entry) => entry.includes('Commands skipped for: kimi') && entry.includes('(no adapter)'),
191
+ ),
192
+ ).toBe(true);
193
+ });
194
+
195
+ it('should create skills for multiple tools at once', async () => {
196
+ const initCommand = new InitCommand({ tools: 'claude,cursor', force: true });
197
+
198
+ await initCommand.execute(testDir);
199
+
200
+ const claudeSkill = path.join(testDir, '.claude', 'skills', 'openspec-explore', 'SKILL.md');
201
+ const cursorSkill = path.join(testDir, '.cursor', 'skills', 'openspec-explore', 'SKILL.md');
202
+
203
+ expect(await fileExists(claudeSkill)).toBe(true);
204
+ expect(await fileExists(cursorSkill)).toBe(true);
205
+ });
206
+
207
+ it('should select all tools with --tools all option', async () => {
208
+ const initCommand = new InitCommand({ tools: 'all', force: true });
209
+
210
+ await initCommand.execute(testDir);
211
+
212
+ // Check a few representative tools
213
+ const claudeSkill = path.join(testDir, '.claude', 'skills', 'openspec-explore', 'SKILL.md');
214
+ const cursorSkill = path.join(testDir, '.cursor', 'skills', 'openspec-explore', 'SKILL.md');
215
+ const windsurfSkill = path.join(testDir, '.windsurf', 'skills', 'openspec-explore', 'SKILL.md');
216
+
217
+ expect(await fileExists(claudeSkill)).toBe(true);
218
+ expect(await fileExists(cursorSkill)).toBe(true);
219
+ expect(await fileExists(windsurfSkill)).toBe(true);
220
+ });
221
+
222
+ it('should skip tool configuration with --tools none option', async () => {
223
+ const initCommand = new InitCommand({ tools: 'none', force: true });
224
+
225
+ await initCommand.execute(testDir);
226
+
227
+ // Should create OpenSpec structure but no skills
228
+ const openspecPath = path.join(testDir, 'openspec');
229
+ expect(await directoryExists(openspecPath)).toBe(true);
230
+
231
+ // No tool-specific directories should be created
232
+ const claudeSkillsDir = path.join(testDir, '.claude', 'skills');
233
+ expect(await directoryExists(claudeSkillsDir)).toBe(false);
234
+ });
235
+
236
+ it('should throw error for invalid tool names', async () => {
237
+ const initCommand = new InitCommand({ tools: 'invalid-tool', force: true });
238
+
239
+ await expect(initCommand.execute(testDir)).rejects.toThrow(/Invalid tool\(s\): invalid-tool/);
240
+ });
241
+
242
+ it('should handle comma-separated tool names with spaces', async () => {
243
+ const initCommand = new InitCommand({ tools: 'claude, cursor', force: true });
244
+
245
+ await initCommand.execute(testDir);
246
+
247
+ const claudeSkill = path.join(testDir, '.claude', 'skills', 'openspec-explore', 'SKILL.md');
248
+ const cursorSkill = path.join(testDir, '.cursor', 'skills', 'openspec-explore', 'SKILL.md');
249
+
250
+ expect(await fileExists(claudeSkill)).toBe(true);
251
+ expect(await fileExists(cursorSkill)).toBe(true);
252
+ });
253
+
254
+ it('should reject combining reserved keywords with explicit tool ids', async () => {
255
+ const initCommand = new InitCommand({ tools: 'all,claude', force: true });
256
+
257
+ await expect(initCommand.execute(testDir)).rejects.toThrow(
258
+ /Cannot combine reserved values "all" or "none" with specific tool IDs/
259
+ );
260
+ });
261
+
262
+ it('should not create config.yaml if it already exists', async () => {
263
+ // Pre-create config.yaml
264
+ const openspecDir = path.join(testDir, 'openspec');
265
+ await fs.mkdir(openspecDir, { recursive: true });
266
+ const configPath = path.join(openspecDir, 'config.yaml');
267
+ const existingContent = 'schema: custom-schema\n';
268
+ await fs.writeFile(configPath, existingContent);
269
+
270
+ const initCommand = new InitCommand({ tools: 'claude', force: true });
271
+ await initCommand.execute(testDir);
272
+
273
+ const content = await fs.readFile(configPath, 'utf-8');
274
+ expect(content).toBe(existingContent);
275
+ });
276
+
277
+ it('should handle non-existent target directory', async () => {
278
+ const newDir = path.join(testDir, 'new-project');
279
+ const initCommand = new InitCommand({ tools: 'claude', force: true });
280
+
281
+ await initCommand.execute(newDir);
282
+
283
+ const openspecPath = path.join(newDir, 'openspec');
284
+ expect(await directoryExists(openspecPath)).toBe(true);
285
+ });
286
+
287
+ it('should work in extend mode (re-running init)', async () => {
288
+ const initCommand1 = new InitCommand({ tools: 'claude', force: true });
289
+ await initCommand1.execute(testDir);
290
+
291
+ // Run init again with a different tool
292
+ const initCommand2 = new InitCommand({ tools: 'cursor', force: true });
293
+ await initCommand2.execute(testDir);
294
+
295
+ // Both tools should have skills
296
+ const claudeSkill = path.join(testDir, '.claude', 'skills', 'openspec-explore', 'SKILL.md');
297
+ const cursorSkill = path.join(testDir, '.cursor', 'skills', 'openspec-explore', 'SKILL.md');
298
+
299
+ expect(await fileExists(claudeSkill)).toBe(true);
300
+ expect(await fileExists(cursorSkill)).toBe(true);
301
+ });
302
+
303
+ it('should refresh skills on re-run for the same tool', async () => {
304
+ const initCommand1 = new InitCommand({ tools: 'claude', force: true });
305
+ await initCommand1.execute(testDir);
306
+
307
+ const skillFile = path.join(testDir, '.claude', 'skills', 'openspec-explore', 'SKILL.md');
308
+ const originalContent = await fs.readFile(skillFile, 'utf-8');
309
+
310
+ // Modify the file
311
+ await fs.writeFile(skillFile, '# Modified content\n');
312
+
313
+ // Run init again
314
+ const initCommand2 = new InitCommand({ tools: 'claude', force: true });
315
+ await initCommand2.execute(testDir);
316
+
317
+ const newContent = await fs.readFile(skillFile, 'utf-8');
318
+ expect(newContent).toBe(originalContent);
319
+ });
320
+ });
321
+
322
+ describe('skill content validation', () => {
323
+ it('should generate valid SKILL.md with YAML frontmatter', async () => {
324
+ const initCommand = new InitCommand({ tools: 'claude', force: true });
325
+ await initCommand.execute(testDir);
326
+
327
+ const skillFile = path.join(testDir, '.claude', 'skills', 'openspec-explore', 'SKILL.md');
328
+ const content = await fs.readFile(skillFile, 'utf-8');
329
+
330
+ // Should have YAML frontmatter
331
+ expect(content).toMatch(/^---\n/);
332
+ expect(content).toContain('name: openspec-explore');
333
+ expect(content).toContain('description:');
334
+ expect(content).toContain('license:');
335
+ expect(content).toContain('compatibility:');
336
+ expect(content).toContain('metadata:');
337
+ expect(content).toMatch(/---\n\n/); // End of frontmatter
338
+ });
339
+
340
+ it('should include explore mode instructions', async () => {
341
+ const initCommand = new InitCommand({ tools: 'claude', force: true });
342
+ await initCommand.execute(testDir);
343
+
344
+ const skillFile = path.join(testDir, '.claude', 'skills', 'openspec-explore', 'SKILL.md');
345
+ const content = await fs.readFile(skillFile, 'utf-8');
346
+
347
+ expect(content).toContain('Enter explore mode');
348
+ expect(content).toContain('thinking partner');
349
+ });
350
+
351
+ it('should include propose skill instructions', async () => {
352
+ const initCommand = new InitCommand({ tools: 'claude', force: true });
353
+ await initCommand.execute(testDir);
354
+
355
+ const skillFile = path.join(testDir, '.claude', 'skills', 'openspec-propose', 'SKILL.md');
356
+ const content = await fs.readFile(skillFile, 'utf-8');
357
+
358
+ expect(content).toContain('name: openspec-propose');
359
+ });
360
+
361
+ it('should include apply-change skill instructions', async () => {
362
+ const initCommand = new InitCommand({ tools: 'claude', force: true });
363
+ await initCommand.execute(testDir);
364
+
365
+ const skillFile = path.join(testDir, '.claude', 'skills', 'openspec-apply-change', 'SKILL.md');
366
+ const content = await fs.readFile(skillFile, 'utf-8');
367
+
368
+ expect(content).toContain('name: openspec-apply-change');
369
+ });
370
+
371
+ it('should embed generatedBy version in skill files', async () => {
372
+ const initCommand = new InitCommand({ tools: 'claude', force: true });
373
+ await initCommand.execute(testDir);
374
+
375
+ const skillFile = path.join(testDir, '.claude', 'skills', 'openspec-explore', 'SKILL.md');
376
+ const content = await fs.readFile(skillFile, 'utf-8');
377
+
378
+ // Should contain generatedBy field with a version string
379
+ expect(content).toMatch(/generatedBy:\s*["']?\d+\.\d+\.\d+["']?/);
380
+ });
381
+ });
382
+
383
+ describe('command generation', () => {
384
+ it('should generate Claude Code commands with correct format', async () => {
385
+ const initCommand = new InitCommand({ tools: 'claude', force: true });
386
+ await initCommand.execute(testDir);
387
+
388
+ const cmdFile = path.join(testDir, '.claude', 'commands', 'opsx', 'explore.md');
389
+ const content = await fs.readFile(cmdFile, 'utf-8');
390
+
391
+ // Claude commands use YAML frontmatter
392
+ expect(content).toMatch(/^---\n/);
393
+ expect(content).toContain('name:');
394
+ expect(content).toContain('description:');
395
+ });
396
+
397
+ it('should generate Cursor commands with correct format', async () => {
398
+ const initCommand = new InitCommand({ tools: 'cursor', force: true });
399
+ await initCommand.execute(testDir);
400
+
401
+ const cmdFile = path.join(testDir, '.cursor', 'commands', 'opsx-explore.md');
402
+ expect(await fileExists(cmdFile)).toBe(true);
403
+
404
+ const content = await fs.readFile(cmdFile, 'utf-8');
405
+ expect(content).toMatch(/^---\n/);
406
+ });
407
+ });
408
+
409
+ describe('error handling', () => {
410
+ it('should provide helpful error for insufficient permissions', async () => {
411
+ // Mock the permission check to fail
412
+ const readOnlyDir = path.join(testDir, 'readonly');
413
+ await fs.mkdir(readOnlyDir);
414
+
415
+ const originalWriteFile = fs.writeFile;
416
+ vi.spyOn(fs, 'writeFile').mockImplementation(
417
+ async (filePath: any, ...args: any[]) => {
418
+ if (
419
+ typeof filePath === 'string' &&
420
+ filePath.includes('.openspec-test-')
421
+ ) {
422
+ throw new Error('EACCES: permission denied');
423
+ }
424
+ return originalWriteFile.call(fs, filePath, ...args);
425
+ }
426
+ );
427
+
428
+ const initCommand = new InitCommand({ tools: 'claude', force: true });
429
+ await expect(initCommand.execute(readOnlyDir)).rejects.toThrow(/Insufficient permissions/);
430
+ });
431
+
432
+ it('should throw error in non-interactive mode without --tools flag and no detected tools', async () => {
433
+ const initCommand = new InitCommand({ interactive: false });
434
+
435
+ await expect(initCommand.execute(testDir)).rejects.toThrow(/No tools detected and no --tools flag/);
436
+ });
437
+ });
438
+
439
+ describe('tool-specific adapters', () => {
440
+ it('should generate Gemini CLI commands as TOML files', async () => {
441
+ const initCommand = new InitCommand({ tools: 'gemini', force: true });
442
+ await initCommand.execute(testDir);
443
+
444
+ const cmdFile = path.join(testDir, '.gemini', 'commands', 'opsx', 'explore.toml');
445
+ expect(await fileExists(cmdFile)).toBe(true);
446
+
447
+ const content = await fs.readFile(cmdFile, 'utf-8');
448
+ expect(content).toContain('description =');
449
+ expect(content).toContain('prompt =');
450
+ });
451
+
452
+ it('should generate Windsurf commands', async () => {
453
+ const initCommand = new InitCommand({ tools: 'windsurf', force: true });
454
+ await initCommand.execute(testDir);
455
+
456
+ const cmdFile = path.join(testDir, '.windsurf', 'workflows', 'opsx-explore.md');
457
+ expect(await fileExists(cmdFile)).toBe(true);
458
+ });
459
+
460
+ it('should generate Continue prompt files', async () => {
461
+ const initCommand = new InitCommand({ tools: 'continue', force: true });
462
+ await initCommand.execute(testDir);
463
+
464
+ const cmdFile = path.join(testDir, '.continue', 'prompts', 'opsx-explore.prompt');
465
+ expect(await fileExists(cmdFile)).toBe(true);
466
+
467
+ const content = await fs.readFile(cmdFile, 'utf-8');
468
+ expect(content).toContain('name: opsx-explore');
469
+ expect(content).toContain('invokable: true');
470
+ });
471
+
472
+ it('should generate Cline workflow files', async () => {
473
+ const initCommand = new InitCommand({ tools: 'cline', force: true });
474
+ await initCommand.execute(testDir);
475
+
476
+ const cmdFile = path.join(testDir, '.clinerules', 'workflows', 'opsx-explore.md');
477
+ expect(await fileExists(cmdFile)).toBe(true);
478
+ });
479
+
480
+ it('should generate GitHub Copilot prompt files', async () => {
481
+ const initCommand = new InitCommand({ tools: 'github-copilot', force: true });
482
+ await initCommand.execute(testDir);
483
+
484
+ const cmdFile = path.join(testDir, '.github', 'prompts', 'opsx-explore.prompt.md');
485
+ expect(await fileExists(cmdFile)).toBe(true);
486
+ });
487
+ });
488
+ });
489
+
490
+ describe('InitCommand - profile and detection features', () => {
491
+ let testDir: string;
492
+ let configTempDir: string;
493
+ let originalEnv: NodeJS.ProcessEnv;
494
+
495
+ beforeEach(async () => {
496
+ testDir = path.join(os.tmpdir(), `openspec-init-profile-test-${Date.now()}`);
497
+ await fs.mkdir(testDir, { recursive: true });
498
+ originalEnv = { ...process.env };
499
+ // Use a temp dir for global config to avoid polluting real config
500
+ configTempDir = path.join(os.tmpdir(), `openspec-config-test-${Date.now()}`);
501
+ await fs.mkdir(configTempDir, { recursive: true });
502
+ process.env.XDG_CONFIG_HOME = configTempDir;
503
+ vi.spyOn(console, 'log').mockImplementation(() => {});
504
+ confirmMock.mockReset();
505
+ confirmMock.mockResolvedValue(true);
506
+ showWelcomeScreenMock.mockClear();
507
+ searchableMultiSelectMock.mockReset();
508
+ });
509
+
510
+ afterEach(async () => {
511
+ process.env = originalEnv;
512
+ await fs.rm(testDir, { recursive: true, force: true });
513
+ await fs.rm(configTempDir, { recursive: true, force: true });
514
+ vi.restoreAllMocks();
515
+ });
516
+
517
+ it('should use --profile flag to override global config', async () => {
518
+ // Set global config to custom profile
519
+ saveGlobalConfig({
520
+ featureFlags: {},
521
+ profile: 'custom',
522
+ delivery: 'both',
523
+ workflows: ['explore', 'new', 'apply'],
524
+ });
525
+
526
+ // Override with --profile core
527
+ const initCommand = new InitCommand({ tools: 'claude', force: true, profile: 'core' });
528
+ await initCommand.execute(testDir);
529
+
530
+ // Core profile skills should be created
531
+ const proposeSkill = path.join(testDir, '.claude', 'skills', 'openspec-propose', 'SKILL.md');
532
+ expect(await fileExists(proposeSkill)).toBe(true);
533
+
534
+ // Non-core skills (from the custom profile) should NOT be created
535
+ const newChangeSkill = path.join(testDir, '.claude', 'skills', 'openspec-new-change', 'SKILL.md');
536
+ expect(await fileExists(newChangeSkill)).toBe(false);
537
+ });
538
+
539
+ it('should reject invalid --profile values', async () => {
540
+ const initCommand = new InitCommand({
541
+ tools: 'claude',
542
+ force: true,
543
+ profile: 'invalid-profile',
544
+ });
545
+
546
+ await expect(initCommand.execute(testDir)).rejects.toThrow(
547
+ /Invalid profile "invalid-profile"/
548
+ );
549
+ });
550
+
551
+ it('should use detected tools in non-interactive mode when no --tools flag', async () => {
552
+ // Create a .claude directory to simulate detected tool
553
+ await fs.mkdir(path.join(testDir, '.claude'), { recursive: true });
554
+
555
+ const initCommand = new InitCommand({ interactive: false, force: true });
556
+ await initCommand.execute(testDir);
557
+
558
+ // Should have used claude (detected)
559
+ const skillFile = path.join(testDir, '.claude', 'skills', 'openspec-explore', 'SKILL.md');
560
+ expect(await fileExists(skillFile)).toBe(true);
561
+ });
562
+
563
+ it('should auto-cleanup legacy artifacts in non-interactive mode without --force', async () => {
564
+ // Create legacy OpenCode command files (singular 'command' path)
565
+ const legacyDir = path.join(testDir, '.opencode', 'command');
566
+ await fs.mkdir(legacyDir, { recursive: true });
567
+ await fs.writeFile(path.join(legacyDir, 'opsx-propose.md'), 'legacy content');
568
+
569
+ // Run init in non-interactive mode without --force
570
+ const initCommand = new InitCommand({ tools: 'opencode' });
571
+ await initCommand.execute(testDir);
572
+
573
+ // Legacy files should be cleaned up automatically
574
+ expect(await fileExists(path.join(legacyDir, 'opsx-propose.md'))).toBe(false);
575
+
576
+ // New commands should be at the correct plural path
577
+ const newCommandsDir = path.join(testDir, '.opencode', 'commands');
578
+ expect(await directoryExists(newCommandsDir)).toBe(true);
579
+ });
580
+
581
+ it('should preselect configured tools but not directory-detected tools in extend mode', async () => {
582
+ // Simulate existing OpenSpec project (extend mode).
583
+ await fs.mkdir(path.join(testDir, 'openspec'), { recursive: true });
584
+
585
+ // Configured with OpenSpec
586
+ const claudeSkillDir = path.join(testDir, '.claude', 'skills', 'openspec-explore');
587
+ await fs.mkdir(claudeSkillDir, { recursive: true });
588
+ await fs.writeFile(path.join(claudeSkillDir, 'SKILL.md'), 'configured');
589
+
590
+ // Directory detected only (not configured with OpenSpec)
591
+ await fs.mkdir(path.join(testDir, '.github'), { recursive: true });
592
+ await fs.writeFile(path.join(testDir, '.github', 'copilot-instructions.md'), '');
593
+
594
+ searchableMultiSelectMock.mockResolvedValue(['claude']);
595
+
596
+ const initCommand = new InitCommand({ force: true });
597
+ vi.spyOn(initCommand as any, 'canPromptInteractively').mockReturnValue(true);
598
+
599
+ await initCommand.execute(testDir);
600
+
601
+ expect(searchableMultiSelectMock).toHaveBeenCalledTimes(1);
602
+ const [{ choices }] = searchableMultiSelectMock.mock.calls[0] as [{ choices: Array<{ value: string; preSelected?: boolean; detected?: boolean }> }];
603
+
604
+ const claude = choices.find((choice) => choice.value === 'claude');
605
+ const githubCopilot = choices.find((choice) => choice.value === 'github-copilot');
606
+
607
+ expect(claude?.preSelected).toBe(true);
608
+ expect(githubCopilot?.preSelected).toBe(false);
609
+ expect(githubCopilot?.detected).toBe(true);
610
+ });
611
+
612
+ it('should preselect detected tools for first-time interactive setup', async () => {
613
+ // First-time init: no openspec/ directory and no configured OpenSpec skills.
614
+ await fs.mkdir(path.join(testDir, '.github'), { recursive: true });
615
+ await fs.writeFile(path.join(testDir, '.github', 'copilot-instructions.md'), '');
616
+
617
+ searchableMultiSelectMock.mockResolvedValue(['github-copilot']);
618
+
619
+ const initCommand = new InitCommand({ force: true });
620
+ vi.spyOn(initCommand as any, 'canPromptInteractively').mockReturnValue(true);
621
+
622
+ await initCommand.execute(testDir);
623
+
624
+ expect(searchableMultiSelectMock).toHaveBeenCalledTimes(1);
625
+ const [{ choices }] = searchableMultiSelectMock.mock.calls[0] as [{ choices: Array<{ value: string; preSelected?: boolean }> }];
626
+ const githubCopilot = choices.find((choice) => choice.value === 'github-copilot');
627
+
628
+ expect(githubCopilot?.preSelected).toBe(true);
629
+ });
630
+
631
+ it('should respect custom profile from global config', async () => {
632
+ saveGlobalConfig({
633
+ featureFlags: {},
634
+ profile: 'custom',
635
+ delivery: 'both',
636
+ workflows: ['explore', 'new'],
637
+ });
638
+
639
+ const initCommand = new InitCommand({ tools: 'claude', force: true });
640
+ await initCommand.execute(testDir);
641
+
642
+ // Custom profile skills should be created
643
+ const exploreSkill = path.join(testDir, '.claude', 'skills', 'openspec-explore', 'SKILL.md');
644
+ const newChangeSkill = path.join(testDir, '.claude', 'skills', 'openspec-new-change', 'SKILL.md');
645
+ expect(await fileExists(exploreSkill)).toBe(true);
646
+ expect(await fileExists(newChangeSkill)).toBe(true);
647
+
648
+ // Non-selected skills should NOT be created
649
+ const proposeSkill = path.join(testDir, '.claude', 'skills', 'openspec-propose', 'SKILL.md');
650
+ expect(await fileExists(proposeSkill)).toBe(false);
651
+ });
652
+
653
+ it('should migrate commands-only extend mode to custom profile without injecting propose', async () => {
654
+ await fs.mkdir(path.join(testDir, 'openspec'), { recursive: true });
655
+ await fs.mkdir(path.join(testDir, '.claude', 'commands', 'opsx'), { recursive: true });
656
+ await fs.writeFile(path.join(testDir, '.claude', 'commands', 'opsx', 'explore.md'), '# explore\n');
657
+
658
+ const initCommand = new InitCommand({ tools: 'claude', force: true });
659
+ await initCommand.execute(testDir);
660
+
661
+ const config = getGlobalConfig();
662
+ expect(config.profile).toBe('custom');
663
+ expect(config.delivery).toBe('commands');
664
+ expect(config.workflows).toEqual(['explore']);
665
+
666
+ const exploreCommand = path.join(testDir, '.claude', 'commands', 'opsx', 'explore.md');
667
+ const proposeCommand = path.join(testDir, '.claude', 'commands', 'opsx', 'propose.md');
668
+ expect(await fileExists(exploreCommand)).toBe(true);
669
+ expect(await fileExists(proposeCommand)).toBe(false);
670
+
671
+ const exploreSkill = path.join(testDir, '.claude', 'skills', 'openspec-explore', 'SKILL.md');
672
+ const proposeSkill = path.join(testDir, '.claude', 'skills', 'openspec-propose', 'SKILL.md');
673
+ expect(await fileExists(exploreSkill)).toBe(false);
674
+ expect(await fileExists(proposeSkill)).toBe(false);
675
+ });
676
+
677
+ it('should not prompt for confirmation when applying custom profile in interactive init', async () => {
678
+ saveGlobalConfig({
679
+ featureFlags: {},
680
+ profile: 'custom',
681
+ delivery: 'both',
682
+ workflows: ['explore', 'new'],
683
+ });
684
+
685
+ const initCommand = new InitCommand({ force: true });
686
+ vi.spyOn(initCommand as any, 'canPromptInteractively').mockReturnValue(true);
687
+ vi.spyOn(initCommand as any, 'getSelectedTools').mockResolvedValue(['claude']);
688
+
689
+ await initCommand.execute(testDir);
690
+
691
+ expect(showWelcomeScreenMock).toHaveBeenCalled();
692
+ expect(confirmMock).not.toHaveBeenCalled();
693
+
694
+ const exploreSkill = path.join(testDir, '.claude', 'skills', 'openspec-explore', 'SKILL.md');
695
+ const newChangeSkill = path.join(testDir, '.claude', 'skills', 'openspec-new-change', 'SKILL.md');
696
+ expect(await fileExists(exploreSkill)).toBe(true);
697
+ expect(await fileExists(newChangeSkill)).toBe(true);
698
+
699
+ const logCalls = (console.log as unknown as { mock: { calls: unknown[][] } }).mock.calls.flat().map(String);
700
+ expect(logCalls.some((entry) => entry.includes('Applying custom profile'))).toBe(false);
701
+ });
702
+
703
+ it('should respect delivery=skills setting (no commands)', async () => {
704
+ saveGlobalConfig({
705
+ featureFlags: {},
706
+ profile: 'core',
707
+ delivery: 'skills',
708
+ });
709
+
710
+ const initCommand = new InitCommand({ tools: 'claude', force: true });
711
+ await initCommand.execute(testDir);
712
+
713
+ // Skills should exist
714
+ const skillFile = path.join(testDir, '.claude', 'skills', 'openspec-explore', 'SKILL.md');
715
+ expect(await fileExists(skillFile)).toBe(true);
716
+
717
+ // Commands should NOT exist
718
+ const cmdFile = path.join(testDir, '.claude', 'commands', 'opsx', 'explore.md');
719
+ expect(await fileExists(cmdFile)).toBe(false);
720
+ });
721
+
722
+ it('should respect delivery=commands setting (no skills)', async () => {
723
+ saveGlobalConfig({
724
+ featureFlags: {},
725
+ profile: 'core',
726
+ delivery: 'commands',
727
+ });
728
+
729
+ const initCommand = new InitCommand({ tools: 'claude', force: true });
730
+ await initCommand.execute(testDir);
731
+
732
+ // Skills should NOT exist
733
+ const skillFile = path.join(testDir, '.claude', 'skills', 'openspec-explore', 'SKILL.md');
734
+ expect(await fileExists(skillFile)).toBe(false);
735
+
736
+ // Commands should exist
737
+ const cmdFile = path.join(testDir, '.claude', 'commands', 'opsx', 'explore.md');
738
+ expect(await fileExists(cmdFile)).toBe(true);
739
+ });
740
+
741
+ it('should remove commands on re-init when delivery changes to skills', async () => {
742
+ saveGlobalConfig({
743
+ featureFlags: {},
744
+ profile: 'core',
745
+ delivery: 'both',
746
+ });
747
+
748
+ const initCommand1 = new InitCommand({ tools: 'claude', force: true });
749
+ await initCommand1.execute(testDir);
750
+
751
+ const cmdFile = path.join(testDir, '.claude', 'commands', 'opsx', 'explore.md');
752
+ expect(await fileExists(cmdFile)).toBe(true);
753
+
754
+ saveGlobalConfig({
755
+ featureFlags: {},
756
+ profile: 'core',
757
+ delivery: 'skills',
758
+ });
759
+
760
+ const initCommand2 = new InitCommand({ tools: 'claude', force: true });
761
+ await initCommand2.execute(testDir);
762
+
763
+ expect(await fileExists(cmdFile)).toBe(false);
764
+
765
+ const skillFile = path.join(testDir, '.claude', 'skills', 'openspec-explore', 'SKILL.md');
766
+ expect(await fileExists(skillFile)).toBe(true);
767
+ });
768
+ });
769
+
770
+ async function fileExists(filePath: string): Promise<boolean> {
771
+ try {
772
+ await fs.access(filePath);
773
+ return true;
774
+ } catch {
775
+ return false;
776
+ }
777
+ }
778
+
779
+ async function directoryExists(dirPath: string): Promise<boolean> {
780
+ try {
781
+ const stats = await fs.stat(dirPath);
782
+ return stats.isDirectory();
783
+ } catch {
784
+ return false;
785
+ }
786
+ }