@codewalla_india/openspec 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (356) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +225 -0
  3. package/bin/openspec.js +5 -0
  4. package/dist/cli/index.d.ts +10 -0
  5. package/dist/cli/index.js +548 -0
  6. package/dist/commands/change.d.ts +39 -0
  7. package/dist/commands/change.js +279 -0
  8. package/dist/commands/completion.d.ts +72 -0
  9. package/dist/commands/completion.js +264 -0
  10. package/dist/commands/config.d.ts +36 -0
  11. package/dist/commands/config.js +552 -0
  12. package/dist/commands/context.d.ts +3 -0
  13. package/dist/commands/context.js +155 -0
  14. package/dist/commands/doctor.d.ts +8 -0
  15. package/dist/commands/doctor.js +163 -0
  16. package/dist/commands/feedback.d.ts +9 -0
  17. package/dist/commands/feedback.js +183 -0
  18. package/dist/commands/schema.d.ts +6 -0
  19. package/dist/commands/schema.js +869 -0
  20. package/dist/commands/shared-gather.d.ts +14 -0
  21. package/dist/commands/shared-gather.js +31 -0
  22. package/dist/commands/shared-output.d.ts +18 -0
  23. package/dist/commands/shared-output.js +61 -0
  24. package/dist/commands/show.d.ts +19 -0
  25. package/dist/commands/show.js +177 -0
  26. package/dist/commands/spec.d.ts +19 -0
  27. package/dist/commands/spec.js +236 -0
  28. package/dist/commands/store.d.ts +3 -0
  29. package/dist/commands/store.js +547 -0
  30. package/dist/commands/validate.d.ts +26 -0
  31. package/dist/commands/validate.js +330 -0
  32. package/dist/commands/workflow/index.d.ts +17 -0
  33. package/dist/commands/workflow/index.js +12 -0
  34. package/dist/commands/workflow/instructions.d.ts +45 -0
  35. package/dist/commands/workflow/instructions.js +500 -0
  36. package/dist/commands/workflow/new-change.d.ts +20 -0
  37. package/dist/commands/workflow/new-change.js +106 -0
  38. package/dist/commands/workflow/schemas.d.ts +10 -0
  39. package/dist/commands/workflow/schemas.js +34 -0
  40. package/dist/commands/workflow/shared.d.ts +84 -0
  41. package/dist/commands/workflow/shared.js +133 -0
  42. package/dist/commands/workflow/status.d.ts +16 -0
  43. package/dist/commands/workflow/status.js +92 -0
  44. package/dist/commands/workflow/templates.d.ts +16 -0
  45. package/dist/commands/workflow/templates.js +69 -0
  46. package/dist/commands/workset-input.d.ts +19 -0
  47. package/dist/commands/workset-input.js +112 -0
  48. package/dist/commands/workset-prompts.d.ts +12 -0
  49. package/dist/commands/workset-prompts.js +143 -0
  50. package/dist/commands/workset.d.ts +25 -0
  51. package/dist/commands/workset.js +446 -0
  52. package/dist/core/archive.d.ts +22 -0
  53. package/dist/core/archive.js +471 -0
  54. package/dist/core/artifact-graph/graph.d.ts +56 -0
  55. package/dist/core/artifact-graph/graph.js +141 -0
  56. package/dist/core/artifact-graph/index.d.ts +9 -0
  57. package/dist/core/artifact-graph/index.js +14 -0
  58. package/dist/core/artifact-graph/instruction-loader.d.ts +188 -0
  59. package/dist/core/artifact-graph/instruction-loader.js +233 -0
  60. package/dist/core/artifact-graph/outputs.d.ts +14 -0
  61. package/dist/core/artifact-graph/outputs.js +39 -0
  62. package/dist/core/artifact-graph/resolver.d.ts +81 -0
  63. package/dist/core/artifact-graph/resolver.js +257 -0
  64. package/dist/core/artifact-graph/schema.d.ts +13 -0
  65. package/dist/core/artifact-graph/schema.js +108 -0
  66. package/dist/core/artifact-graph/state.d.ts +12 -0
  67. package/dist/core/artifact-graph/state.js +31 -0
  68. package/dist/core/artifact-graph/types.d.ts +40 -0
  69. package/dist/core/artifact-graph/types.js +29 -0
  70. package/dist/core/available-tools.d.ts +17 -0
  71. package/dist/core/available-tools.js +43 -0
  72. package/dist/core/change-metadata/index.d.ts +2 -0
  73. package/dist/core/change-metadata/index.js +2 -0
  74. package/dist/core/change-metadata/schema.d.ts +19 -0
  75. package/dist/core/change-metadata/schema.js +30 -0
  76. package/dist/core/change-status-policy.d.ts +37 -0
  77. package/dist/core/change-status-policy.js +35 -0
  78. package/dist/core/command-generation/adapters/amazon-q.d.ts +13 -0
  79. package/dist/core/command-generation/adapters/amazon-q.js +26 -0
  80. package/dist/core/command-generation/adapters/antigravity.d.ts +13 -0
  81. package/dist/core/command-generation/adapters/antigravity.js +26 -0
  82. package/dist/core/command-generation/adapters/auggie.d.ts +13 -0
  83. package/dist/core/command-generation/adapters/auggie.js +27 -0
  84. package/dist/core/command-generation/adapters/bob.d.ts +14 -0
  85. package/dist/core/command-generation/adapters/bob.js +32 -0
  86. package/dist/core/command-generation/adapters/claude.d.ts +13 -0
  87. package/dist/core/command-generation/adapters/claude.js +37 -0
  88. package/dist/core/command-generation/adapters/cline.d.ts +14 -0
  89. package/dist/core/command-generation/adapters/cline.js +27 -0
  90. package/dist/core/command-generation/adapters/codebuddy.d.ts +13 -0
  91. package/dist/core/command-generation/adapters/codebuddy.js +28 -0
  92. package/dist/core/command-generation/adapters/codex.d.ts +16 -0
  93. package/dist/core/command-generation/adapters/codex.js +39 -0
  94. package/dist/core/command-generation/adapters/continue.d.ts +13 -0
  95. package/dist/core/command-generation/adapters/continue.js +28 -0
  96. package/dist/core/command-generation/adapters/costrict.d.ts +13 -0
  97. package/dist/core/command-generation/adapters/costrict.js +27 -0
  98. package/dist/core/command-generation/adapters/crush.d.ts +13 -0
  99. package/dist/core/command-generation/adapters/crush.js +30 -0
  100. package/dist/core/command-generation/adapters/cursor.d.ts +14 -0
  101. package/dist/core/command-generation/adapters/cursor.js +31 -0
  102. package/dist/core/command-generation/adapters/factory.d.ts +13 -0
  103. package/dist/core/command-generation/adapters/factory.js +27 -0
  104. package/dist/core/command-generation/adapters/gemini.d.ts +13 -0
  105. package/dist/core/command-generation/adapters/gemini.js +26 -0
  106. package/dist/core/command-generation/adapters/github-copilot.d.ts +13 -0
  107. package/dist/core/command-generation/adapters/github-copilot.js +26 -0
  108. package/dist/core/command-generation/adapters/iflow.d.ts +13 -0
  109. package/dist/core/command-generation/adapters/iflow.js +29 -0
  110. package/dist/core/command-generation/adapters/index.d.ts +32 -0
  111. package/dist/core/command-generation/adapters/index.js +32 -0
  112. package/dist/core/command-generation/adapters/junie.d.ts +13 -0
  113. package/dist/core/command-generation/adapters/junie.js +26 -0
  114. package/dist/core/command-generation/adapters/kilocode.d.ts +14 -0
  115. package/dist/core/command-generation/adapters/kilocode.js +23 -0
  116. package/dist/core/command-generation/adapters/kiro.d.ts +13 -0
  117. package/dist/core/command-generation/adapters/kiro.js +26 -0
  118. package/dist/core/command-generation/adapters/lingma.d.ts +13 -0
  119. package/dist/core/command-generation/adapters/lingma.js +30 -0
  120. package/dist/core/command-generation/adapters/opencode.d.ts +13 -0
  121. package/dist/core/command-generation/adapters/opencode.js +29 -0
  122. package/dist/core/command-generation/adapters/pi.d.ts +18 -0
  123. package/dist/core/command-generation/adapters/pi.js +42 -0
  124. package/dist/core/command-generation/adapters/qoder.d.ts +13 -0
  125. package/dist/core/command-generation/adapters/qoder.js +30 -0
  126. package/dist/core/command-generation/adapters/qwen.d.ts +13 -0
  127. package/dist/core/command-generation/adapters/qwen.js +26 -0
  128. package/dist/core/command-generation/adapters/roocode.d.ts +14 -0
  129. package/dist/core/command-generation/adapters/roocode.js +27 -0
  130. package/dist/core/command-generation/adapters/windsurf.d.ts +14 -0
  131. package/dist/core/command-generation/adapters/windsurf.js +38 -0
  132. package/dist/core/command-generation/generator.d.ts +21 -0
  133. package/dist/core/command-generation/generator.js +27 -0
  134. package/dist/core/command-generation/index.d.ts +22 -0
  135. package/dist/core/command-generation/index.js +24 -0
  136. package/dist/core/command-generation/registry.d.ts +36 -0
  137. package/dist/core/command-generation/registry.js +98 -0
  138. package/dist/core/command-generation/types.d.ts +56 -0
  139. package/dist/core/command-generation/types.js +8 -0
  140. package/dist/core/command-generation/yaml.d.ts +22 -0
  141. package/dist/core/command-generation/yaml.js +38 -0
  142. package/dist/core/completions/command-registry.d.ts +3 -0
  143. package/dist/core/completions/command-registry.js +778 -0
  144. package/dist/core/completions/completion-provider.d.ts +71 -0
  145. package/dist/core/completions/completion-provider.js +129 -0
  146. package/dist/core/completions/factory.d.ts +64 -0
  147. package/dist/core/completions/factory.js +75 -0
  148. package/dist/core/completions/generators/bash-generator.d.ts +35 -0
  149. package/dist/core/completions/generators/bash-generator.js +230 -0
  150. package/dist/core/completions/generators/fish-generator.d.ts +32 -0
  151. package/dist/core/completions/generators/fish-generator.js +160 -0
  152. package/dist/core/completions/generators/powershell-generator.d.ts +36 -0
  153. package/dist/core/completions/generators/powershell-generator.js +266 -0
  154. package/dist/core/completions/generators/zsh-generator.d.ts +47 -0
  155. package/dist/core/completions/generators/zsh-generator.js +276 -0
  156. package/dist/core/completions/installers/bash-installer.d.ts +87 -0
  157. package/dist/core/completions/installers/bash-installer.js +321 -0
  158. package/dist/core/completions/installers/fish-installer.d.ts +43 -0
  159. package/dist/core/completions/installers/fish-installer.js +151 -0
  160. package/dist/core/completions/installers/powershell-installer.d.ts +102 -0
  161. package/dist/core/completions/installers/powershell-installer.js +415 -0
  162. package/dist/core/completions/installers/zsh-installer.d.ts +117 -0
  163. package/dist/core/completions/installers/zsh-installer.js +424 -0
  164. package/dist/core/completions/shared-flags.d.ts +13 -0
  165. package/dist/core/completions/shared-flags.js +33 -0
  166. package/dist/core/completions/templates/bash-templates.d.ts +6 -0
  167. package/dist/core/completions/templates/bash-templates.js +30 -0
  168. package/dist/core/completions/templates/fish-templates.d.ts +7 -0
  169. package/dist/core/completions/templates/fish-templates.js +45 -0
  170. package/dist/core/completions/templates/powershell-templates.d.ts +6 -0
  171. package/dist/core/completions/templates/powershell-templates.js +34 -0
  172. package/dist/core/completions/templates/zsh-templates.d.ts +6 -0
  173. package/dist/core/completions/templates/zsh-templates.js +45 -0
  174. package/dist/core/completions/types.d.ts +101 -0
  175. package/dist/core/completions/types.js +2 -0
  176. package/dist/core/comprehension/config.d.ts +20 -0
  177. package/dist/core/comprehension/config.js +23 -0
  178. package/dist/core/comprehension/fingerprint.d.ts +5 -0
  179. package/dist/core/comprehension/fingerprint.js +25 -0
  180. package/dist/core/comprehension/index.d.ts +49 -0
  181. package/dist/core/comprehension/index.js +78 -0
  182. package/dist/core/comprehension/pass-record.d.ts +29 -0
  183. package/dist/core/comprehension/pass-record.js +64 -0
  184. package/dist/core/comprehension/stats.d.ts +18 -0
  185. package/dist/core/comprehension/stats.js +41 -0
  186. package/dist/core/config-prompts.d.ts +9 -0
  187. package/dist/core/config-prompts.js +34 -0
  188. package/dist/core/config-schema.d.ts +87 -0
  189. package/dist/core/config-schema.js +239 -0
  190. package/dist/core/config.d.ts +18 -0
  191. package/dist/core/config.js +39 -0
  192. package/dist/core/converters/json-converter.d.ts +6 -0
  193. package/dist/core/converters/json-converter.js +51 -0
  194. package/dist/core/file-state.d.ts +36 -0
  195. package/dist/core/file-state.js +112 -0
  196. package/dist/core/global-config.d.ts +51 -0
  197. package/dist/core/global-config.js +124 -0
  198. package/dist/core/id.d.ts +17 -0
  199. package/dist/core/id.js +30 -0
  200. package/dist/core/index.d.ts +6 -0
  201. package/dist/core/index.js +7 -0
  202. package/dist/core/init.d.ts +37 -0
  203. package/dist/core/init.js +613 -0
  204. package/dist/core/legacy-cleanup.d.ts +162 -0
  205. package/dist/core/legacy-cleanup.js +514 -0
  206. package/dist/core/list.d.ts +11 -0
  207. package/dist/core/list.js +185 -0
  208. package/dist/core/migration.d.ts +23 -0
  209. package/dist/core/migration.js +108 -0
  210. package/dist/core/openers.d.ts +77 -0
  211. package/dist/core/openers.js +251 -0
  212. package/dist/core/openspec-root.d.ts +45 -0
  213. package/dist/core/openspec-root.js +192 -0
  214. package/dist/core/parsers/change-parser.d.ts +13 -0
  215. package/dist/core/parsers/change-parser.js +197 -0
  216. package/dist/core/parsers/markdown-parser.d.ts +26 -0
  217. package/dist/core/parsers/markdown-parser.js +227 -0
  218. package/dist/core/parsers/requirement-blocks.d.ts +37 -0
  219. package/dist/core/parsers/requirement-blocks.js +201 -0
  220. package/dist/core/parsers/spec-structure.d.ts +9 -0
  221. package/dist/core/parsers/spec-structure.js +88 -0
  222. package/dist/core/planning-home.d.ts +16 -0
  223. package/dist/core/planning-home.js +67 -0
  224. package/dist/core/profile-sync-drift.d.ts +38 -0
  225. package/dist/core/profile-sync-drift.js +200 -0
  226. package/dist/core/profiles.d.ts +26 -0
  227. package/dist/core/profiles.js +40 -0
  228. package/dist/core/project-config.d.ts +120 -0
  229. package/dist/core/project-config.js +406 -0
  230. package/dist/core/references.d.ts +63 -0
  231. package/dist/core/references.js +310 -0
  232. package/dist/core/relationship-health.d.ts +65 -0
  233. package/dist/core/relationship-health.js +64 -0
  234. package/dist/core/root-selection.d.ts +122 -0
  235. package/dist/core/root-selection.js +337 -0
  236. package/dist/core/schemas/base.schema.d.ts +13 -0
  237. package/dist/core/schemas/base.schema.js +13 -0
  238. package/dist/core/schemas/change.schema.d.ts +73 -0
  239. package/dist/core/schemas/change.schema.js +31 -0
  240. package/dist/core/schemas/index.d.ts +4 -0
  241. package/dist/core/schemas/index.js +4 -0
  242. package/dist/core/schemas/spec.schema.d.ts +18 -0
  243. package/dist/core/schemas/spec.schema.js +15 -0
  244. package/dist/core/shared/index.d.ts +8 -0
  245. package/dist/core/shared/index.js +8 -0
  246. package/dist/core/shared/skill-generation.d.ts +49 -0
  247. package/dist/core/shared/skill-generation.js +96 -0
  248. package/dist/core/shared/tool-detection.d.ts +71 -0
  249. package/dist/core/shared/tool-detection.js +158 -0
  250. package/dist/core/specs-apply.d.ts +78 -0
  251. package/dist/core/specs-apply.js +394 -0
  252. package/dist/core/store/errors.d.ts +20 -0
  253. package/dist/core/store/errors.js +22 -0
  254. package/dist/core/store/foundation.d.ts +56 -0
  255. package/dist/core/store/foundation.js +251 -0
  256. package/dist/core/store/git.d.ts +23 -0
  257. package/dist/core/store/git.js +137 -0
  258. package/dist/core/store/index.d.ts +5 -0
  259. package/dist/core/store/index.js +5 -0
  260. package/dist/core/store/operations.d.ts +114 -0
  261. package/dist/core/store/operations.js +783 -0
  262. package/dist/core/store/registry.d.ts +58 -0
  263. package/dist/core/store/registry.js +275 -0
  264. package/dist/core/styles/palette.d.ts +7 -0
  265. package/dist/core/styles/palette.js +8 -0
  266. package/dist/core/templates/index.d.ts +8 -0
  267. package/dist/core/templates/index.js +9 -0
  268. package/dist/core/templates/skill-templates.d.ts +19 -0
  269. package/dist/core/templates/skill-templates.js +18 -0
  270. package/dist/core/templates/types.d.ts +19 -0
  271. package/dist/core/templates/types.js +5 -0
  272. package/dist/core/templates/workflows/apply-change.d.ts +10 -0
  273. package/dist/core/templates/workflows/apply-change.js +337 -0
  274. package/dist/core/templates/workflows/archive-change.d.ts +10 -0
  275. package/dist/core/templates/workflows/archive-change.js +278 -0
  276. package/dist/core/templates/workflows/bulk-archive-change.d.ts +10 -0
  277. package/dist/core/templates/workflows/bulk-archive-change.js +493 -0
  278. package/dist/core/templates/workflows/comprehension-guidance.d.ts +9 -0
  279. package/dist/core/templates/workflows/comprehension-guidance.js +58 -0
  280. package/dist/core/templates/workflows/continue-change.d.ts +10 -0
  281. package/dist/core/templates/workflows/continue-change.js +239 -0
  282. package/dist/core/templates/workflows/explore.d.ts +10 -0
  283. package/dist/core/templates/workflows/explore.js +464 -0
  284. package/dist/core/templates/workflows/feedback.d.ts +9 -0
  285. package/dist/core/templates/workflows/feedback.js +108 -0
  286. package/dist/core/templates/workflows/ff-change.d.ts +10 -0
  287. package/dist/core/templates/workflows/ff-change.js +205 -0
  288. package/dist/core/templates/workflows/mcp-guidance.d.ts +13 -0
  289. package/dist/core/templates/workflows/mcp-guidance.js +116 -0
  290. package/dist/core/templates/workflows/new-change.d.ts +10 -0
  291. package/dist/core/templates/workflows/new-change.js +148 -0
  292. package/dist/core/templates/workflows/onboard.d.ts +10 -0
  293. package/dist/core/templates/workflows/onboard.js +566 -0
  294. package/dist/core/templates/workflows/propose.d.ts +10 -0
  295. package/dist/core/templates/workflows/propose.js +228 -0
  296. package/dist/core/templates/workflows/store-selection.d.ts +8 -0
  297. package/dist/core/templates/workflows/store-selection.js +8 -0
  298. package/dist/core/templates/workflows/sync-specs.d.ts +10 -0
  299. package/dist/core/templates/workflows/sync-specs.js +291 -0
  300. package/dist/core/templates/workflows/verify-change.d.ts +10 -0
  301. package/dist/core/templates/workflows/verify-change.js +346 -0
  302. package/dist/core/update.d.ts +82 -0
  303. package/dist/core/update.js +557 -0
  304. package/dist/core/validation/constants.d.ts +34 -0
  305. package/dist/core/validation/constants.js +40 -0
  306. package/dist/core/validation/types.d.ts +18 -0
  307. package/dist/core/validation/types.js +2 -0
  308. package/dist/core/validation/validator.d.ts +44 -0
  309. package/dist/core/validation/validator.js +435 -0
  310. package/dist/core/view.d.ts +8 -0
  311. package/dist/core/view.js +168 -0
  312. package/dist/core/working-set.d.ts +47 -0
  313. package/dist/core/working-set.js +43 -0
  314. package/dist/core/worksets.d.ts +75 -0
  315. package/dist/core/worksets.js +245 -0
  316. package/dist/core/zod-issues.d.ts +4 -0
  317. package/dist/core/zod-issues.js +10 -0
  318. package/dist/index.d.ts +3 -0
  319. package/dist/index.js +3 -0
  320. package/dist/prompts/searchable-multi-select.d.ts +28 -0
  321. package/dist/prompts/searchable-multi-select.js +159 -0
  322. package/dist/telemetry/config.d.ts +38 -0
  323. package/dist/telemetry/config.js +136 -0
  324. package/dist/telemetry/index.d.ts +31 -0
  325. package/dist/telemetry/index.js +164 -0
  326. package/dist/ui/ascii-patterns.d.ts +16 -0
  327. package/dist/ui/ascii-patterns.js +133 -0
  328. package/dist/ui/welcome-screen.d.ts +10 -0
  329. package/dist/ui/welcome-screen.js +146 -0
  330. package/dist/utils/change-metadata.d.ts +55 -0
  331. package/dist/utils/change-metadata.js +141 -0
  332. package/dist/utils/change-utils.d.ts +71 -0
  333. package/dist/utils/change-utils.js +138 -0
  334. package/dist/utils/command-references.d.ts +18 -0
  335. package/dist/utils/command-references.js +20 -0
  336. package/dist/utils/file-system.d.ts +41 -0
  337. package/dist/utils/file-system.js +320 -0
  338. package/dist/utils/index.d.ts +6 -0
  339. package/dist/utils/index.js +9 -0
  340. package/dist/utils/interactive.d.ts +18 -0
  341. package/dist/utils/interactive.js +21 -0
  342. package/dist/utils/item-discovery.d.ts +4 -0
  343. package/dist/utils/item-discovery.js +72 -0
  344. package/dist/utils/match.d.ts +3 -0
  345. package/dist/utils/match.js +22 -0
  346. package/dist/utils/shell-detection.d.ts +20 -0
  347. package/dist/utils/shell-detection.js +41 -0
  348. package/dist/utils/task-progress.d.ts +8 -0
  349. package/dist/utils/task-progress.js +36 -0
  350. package/package.json +84 -0
  351. package/schemas/spec-driven/schema.yaml +153 -0
  352. package/schemas/spec-driven/templates/design.md +19 -0
  353. package/schemas/spec-driven/templates/proposal.md +23 -0
  354. package/schemas/spec-driven/templates/spec.md +8 -0
  355. package/schemas/spec-driven/templates/tasks.md +9 -0
  356. package/scripts/postinstall.js +83 -0
@@ -0,0 +1,548 @@
1
+ import { asStatus } from '../commands/shared-output.js';
2
+ import { Command, Option } from 'commander';
3
+ import { createRequire } from 'module';
4
+ import ora from 'ora';
5
+ import path from 'path';
6
+ import { fileURLToPath } from 'url';
7
+ import { promises as fs } from 'fs';
8
+ import { AI_TOOLS } from '../core/config.js';
9
+ import { UpdateCommand } from '../core/update.js';
10
+ import { ListCommand } from '../core/list.js';
11
+ import { ArchiveCommand } from '../core/archive.js';
12
+ import { ViewCommand } from '../core/view.js';
13
+ import { resolveRootForCommand, toRootOutput } from '../core/root-selection.js';
14
+ import { registerSpecCommand } from '../commands/spec.js';
15
+ import { ChangeCommand } from '../commands/change.js';
16
+ import { ValidateCommand } from '../commands/validate.js';
17
+ import { ShowCommand } from '../commands/show.js';
18
+ import { CompletionCommand } from '../commands/completion.js';
19
+ import { FeedbackCommand } from '../commands/feedback.js';
20
+ import { registerConfigCommand } from '../commands/config.js';
21
+ import { registerSchemaCommand } from '../commands/schema.js';
22
+ import { registerStoreCommand } from '../commands/store.js';
23
+ import { registerDoctorCommand } from '../commands/doctor.js';
24
+ import { registerContextCommand } from '../commands/context.js';
25
+ import { registerWorksetCommand } from '../commands/workset.js';
26
+ import { statusCommand, instructionsCommand, applyInstructionsCommand, templatesCommand, schemasCommand, newChangeCommand, DEFAULT_SCHEMA, } from '../commands/workflow/index.js';
27
+ import { maybeShowTelemetryNotice, trackCommand, shutdown } from '../telemetry/index.js';
28
+ import { COMMON_FLAGS } from '../core/completions/shared-flags.js';
29
+ const STORE_OPTION_DESCRIPTION = COMMON_FLAGS.store.description;
30
+ // Deliberate rejection path: --store-path stays registered (hidden) so the
31
+ // resolver can explain that registering the path is the supported route,
32
+ // instead of Commander emitting a generic unknown-option error (or, for
33
+ // `show`, silently ignoring it via allowUnknownOption).
34
+ function hiddenStorePathOption() {
35
+ return new Option('--store-path <path>', 'Not supported; register the path with "openspec store register <path>" and use --store <id>').hideHelp();
36
+ }
37
+ function failWithError(error, json) {
38
+ // The agent contract: every --json failure leaves exactly one JSON
39
+ // document on stdout (the command's null-shape plus a status array).
40
+ if (json?.enabled) {
41
+ console.log(JSON.stringify({ ...(json.payload ?? {}), status: [asStatus(error, json.fallbackCode ?? 'command_error')] }, null, 2));
42
+ process.exitCode = 1;
43
+ return;
44
+ }
45
+ ora().fail(`Error: ${error.message}`);
46
+ // Resolution and store errors carry a pasteable fix - never drop it.
47
+ const fix = error.diagnostic?.fix;
48
+ if (fix) {
49
+ console.error(`Fix: ${fix}`);
50
+ }
51
+ process.exitCode = process.exitCode ?? 1;
52
+ }
53
+ const program = new Command();
54
+ const require = createRequire(import.meta.url);
55
+ const { version } = require('../../package.json');
56
+ /**
57
+ * Get the full command path for nested commands.
58
+ * For example: 'change show' -> 'change:show'
59
+ */
60
+ export function getCommandPath(command) {
61
+ const names = [];
62
+ let current = command;
63
+ while (current) {
64
+ const name = current.name();
65
+ // Skip the root 'openspec' command
66
+ if (name && name !== 'openspec') {
67
+ names.unshift(name);
68
+ }
69
+ current = current.parent;
70
+ }
71
+ return names.join(':') || 'openspec';
72
+ }
73
+ program
74
+ .name('openspec')
75
+ .description('AI-native system for spec-driven development')
76
+ .version(version);
77
+ // Global options
78
+ program.option('--no-color', 'Disable color output');
79
+ // Apply global flags and telemetry before any command runs
80
+ // Note: preAction receives (thisCommand, actionCommand) where:
81
+ // - thisCommand: the command where hook was added (root program)
82
+ // - actionCommand: the command actually being executed (subcommand)
83
+ program.hook('preAction', async (thisCommand, actionCommand) => {
84
+ const opts = thisCommand.opts();
85
+ if (opts.color === false) {
86
+ process.env.NO_COLOR = '1';
87
+ }
88
+ // Show first-run telemetry notice (if not seen)
89
+ await maybeShowTelemetryNotice();
90
+ // Track command execution (use actionCommand to get the actual subcommand)
91
+ const commandPath = getCommandPath(actionCommand);
92
+ await trackCommand(commandPath, version);
93
+ });
94
+ // Shutdown telemetry after command completes
95
+ program.hook('postAction', async () => {
96
+ await shutdown();
97
+ });
98
+ const availableToolIds = AI_TOOLS.filter((tool) => tool.skillsDir).map((tool) => tool.value);
99
+ const toolsOptionDescription = `Configure AI tools non-interactively. Use "all", "none", or a comma-separated list of: ${availableToolIds.join(', ')}`;
100
+ program
101
+ .command('init [path]')
102
+ .description('Initialize OpenSpec in your project')
103
+ .option('--tools <tools>', toolsOptionDescription)
104
+ .option('--force', 'Auto-cleanup legacy files without prompting')
105
+ .option('--profile <profile>', 'Override global config profile (core or custom)')
106
+ .action(async (targetPath = '.', options) => {
107
+ try {
108
+ // Validate that the path is a valid directory
109
+ const resolvedPath = path.resolve(targetPath);
110
+ try {
111
+ const stats = await fs.stat(resolvedPath);
112
+ if (!stats.isDirectory()) {
113
+ throw new Error(`Path "${targetPath}" is not a directory`);
114
+ }
115
+ }
116
+ catch (error) {
117
+ if (error.code === 'ENOENT') {
118
+ // Directory doesn't exist, but we can create it
119
+ console.log(`Directory "${targetPath}" doesn't exist, it will be created.`);
120
+ }
121
+ else if (error.message && error.message.includes('not a directory')) {
122
+ throw error;
123
+ }
124
+ else {
125
+ throw new Error(`Cannot access path "${targetPath}": ${error.message}`);
126
+ }
127
+ }
128
+ const { InitCommand } = await import('../core/init.js');
129
+ const initCommand = new InitCommand({
130
+ tools: options?.tools,
131
+ force: options?.force,
132
+ profile: options?.profile,
133
+ });
134
+ await initCommand.execute(targetPath);
135
+ }
136
+ catch (error) {
137
+ failWithError(error);
138
+ process.exit(1);
139
+ }
140
+ });
141
+ // Hidden alias: 'experimental' -> 'init' for backwards compatibility
142
+ program
143
+ .command('experimental', { hidden: true })
144
+ .description('Alias for init (deprecated)')
145
+ .option('--tool <tool-id>', 'Target AI tool (maps to --tools)')
146
+ .option('--no-interactive', 'Disable interactive prompts')
147
+ .action(async (options) => {
148
+ try {
149
+ console.log('Note: "openspec experimental" is deprecated. Use "openspec init" instead.');
150
+ const { InitCommand } = await import('../core/init.js');
151
+ const initCommand = new InitCommand({
152
+ tools: options?.tool,
153
+ interactive: options?.noInteractive === true ? false : undefined,
154
+ });
155
+ await initCommand.execute('.');
156
+ }
157
+ catch (error) {
158
+ failWithError(error);
159
+ process.exit(1);
160
+ }
161
+ });
162
+ program
163
+ .command('update [path]')
164
+ .description('Update OpenSpec instruction files')
165
+ .option('--force', 'Force update even when tools are up to date')
166
+ .action(async (targetPath = '.', options) => {
167
+ try {
168
+ const updateCommand = new UpdateCommand({ force: options?.force });
169
+ await updateCommand.execute(targetPath);
170
+ }
171
+ catch (error) {
172
+ failWithError(error);
173
+ process.exit(1);
174
+ }
175
+ });
176
+ program
177
+ .command('list')
178
+ .description('List items (changes by default). Use --specs to list specs.')
179
+ .option('--specs', 'List specs instead of changes')
180
+ .option('--changes', 'List changes explicitly (default)')
181
+ .option('--sort <order>', 'Sort order: "recent" (default) or "name"', 'recent')
182
+ .option('--json', 'Output as JSON (for programmatic use)')
183
+ .option('--store <id>', STORE_OPTION_DESCRIPTION)
184
+ .addOption(hiddenStorePathOption())
185
+ .action(async (options) => {
186
+ try {
187
+ const root = await resolveRootForCommand(options ?? {}, {
188
+ json: options?.json,
189
+ failurePayload: options?.specs ? { specs: [], root: null } : { changes: [], root: null },
190
+ });
191
+ if (!root) {
192
+ return;
193
+ }
194
+ const listCommand = new ListCommand();
195
+ const mode = options?.specs ? 'specs' : 'changes';
196
+ const sort = options?.sort === 'name' ? 'name' : 'recent';
197
+ await listCommand.execute(root.path, mode, {
198
+ sort,
199
+ json: options?.json,
200
+ ...(options?.json ? { root: toRootOutput(root) } : {}),
201
+ });
202
+ }
203
+ catch (error) {
204
+ failWithError(error, {
205
+ enabled: options?.json,
206
+ payload: options?.specs ? { specs: [], root: null } : { changes: [], root: null },
207
+ fallbackCode: 'list_error',
208
+ });
209
+ process.exit(1);
210
+ }
211
+ });
212
+ program
213
+ .command('view')
214
+ .description('Display an interactive dashboard of specs and changes')
215
+ .action(async () => {
216
+ try {
217
+ const viewCommand = new ViewCommand();
218
+ await viewCommand.execute('.');
219
+ }
220
+ catch (error) {
221
+ failWithError(error);
222
+ process.exit(1);
223
+ }
224
+ });
225
+ // Change command with subcommands
226
+ const changeCmd = program
227
+ .command('change')
228
+ .description('Manage OpenSpec change proposals');
229
+ // Deprecation notice for noun-based commands
230
+ changeCmd.hook('preAction', () => {
231
+ console.error('Warning: The "openspec change ..." commands are deprecated. Prefer verb-first commands (e.g., "openspec list", "openspec validate --changes").');
232
+ });
233
+ changeCmd
234
+ .command('show [change-name]')
235
+ .description('Show a change proposal in JSON or markdown format')
236
+ .option('--json', 'Output as JSON')
237
+ .option('--deltas-only', 'Show only deltas (JSON only)')
238
+ .option('--requirements-only', 'Alias for --deltas-only (deprecated)')
239
+ .option('--no-interactive', 'Disable interactive prompts')
240
+ .action(async (changeName, options) => {
241
+ try {
242
+ const changeCommand = new ChangeCommand();
243
+ await changeCommand.show(changeName, options);
244
+ }
245
+ catch (error) {
246
+ console.error(`Error: ${error.message}`);
247
+ process.exitCode = 1;
248
+ }
249
+ });
250
+ changeCmd
251
+ .command('list')
252
+ .description('List all active changes (DEPRECATED: use "openspec list" instead)')
253
+ .option('--json', 'Output as JSON')
254
+ .option('--long', 'Show id and title with counts')
255
+ .action(async (options) => {
256
+ try {
257
+ console.error('Warning: "openspec change list" is deprecated. Use "openspec list".');
258
+ const changeCommand = new ChangeCommand();
259
+ await changeCommand.list(options);
260
+ }
261
+ catch (error) {
262
+ console.error(`Error: ${error.message}`);
263
+ process.exitCode = 1;
264
+ }
265
+ });
266
+ changeCmd
267
+ .command('validate [change-name]')
268
+ .description('Validate a change proposal')
269
+ .option('--strict', 'Enable strict validation mode')
270
+ .option('--json', 'Output validation report as JSON')
271
+ .option('--no-interactive', 'Disable interactive prompts')
272
+ .action(async (changeName, options) => {
273
+ try {
274
+ const changeCommand = new ChangeCommand();
275
+ await changeCommand.validate(changeName, options);
276
+ if (typeof process.exitCode === 'number' && process.exitCode !== 0) {
277
+ process.exit(process.exitCode);
278
+ }
279
+ }
280
+ catch (error) {
281
+ console.error(`Error: ${error.message}`);
282
+ process.exitCode = 1;
283
+ }
284
+ });
285
+ program
286
+ .command('archive [change-name]')
287
+ .description('Archive a completed change and update main specs')
288
+ .option('-y, --yes', 'Skip confirmation prompts')
289
+ .option('--skip-specs', 'Skip spec update operations (useful for infrastructure, tooling, or doc-only changes)')
290
+ .option('--no-validate', 'Skip validation (not recommended, requires confirmation)')
291
+ .option('--json', 'Output as JSON (non-interactive)')
292
+ .option('--store <id>', STORE_OPTION_DESCRIPTION)
293
+ .addOption(hiddenStorePathOption())
294
+ .action(async (changeName, options) => {
295
+ try {
296
+ const archiveCommand = new ArchiveCommand();
297
+ await archiveCommand.execute(changeName, options);
298
+ }
299
+ catch (error) {
300
+ failWithError(error);
301
+ process.exit(1);
302
+ }
303
+ });
304
+ registerSpecCommand(program);
305
+ registerConfigCommand(program);
306
+ registerSchemaCommand(program);
307
+ registerStoreCommand(program);
308
+ registerDoctorCommand(program);
309
+ registerContextCommand(program);
310
+ registerWorksetCommand(program);
311
+ // Top-level validate command
312
+ program
313
+ .command('validate [item-name]')
314
+ .description('Validate changes and specs')
315
+ .option('--all', 'Validate all changes and specs')
316
+ .option('--changes', 'Validate all changes')
317
+ .option('--specs', 'Validate all specs')
318
+ .option('--type <type>', 'Specify item type when ambiguous: change|spec')
319
+ .option('--strict', 'Enable strict validation mode')
320
+ .option('--json', 'Output validation results as JSON')
321
+ .option('--concurrency <n>', 'Max concurrent validations (defaults to env OPENSPEC_CONCURRENCY or 6)')
322
+ .option('--no-interactive', 'Disable interactive prompts')
323
+ .option('--store <id>', STORE_OPTION_DESCRIPTION)
324
+ .addOption(hiddenStorePathOption())
325
+ .action(async (itemName, options) => {
326
+ try {
327
+ const validateCommand = new ValidateCommand();
328
+ await validateCommand.execute(itemName, options);
329
+ }
330
+ catch (error) {
331
+ failWithError(error, { enabled: options?.json, fallbackCode: 'validate_error' });
332
+ process.exit(1);
333
+ }
334
+ });
335
+ // Top-level show command
336
+ program
337
+ .command('show [item-name]')
338
+ .description('Show a change or spec')
339
+ .option('--json', 'Output as JSON')
340
+ .option('--type <type>', 'Specify item type when ambiguous: change|spec')
341
+ .option('--no-interactive', 'Disable interactive prompts')
342
+ // change-only flags
343
+ .option('--deltas-only', 'Show only deltas (JSON only, change)')
344
+ .option('--requirements-only', 'Alias for --deltas-only (deprecated, change)')
345
+ // spec-only flags
346
+ .option('--requirements', 'JSON only: Show only requirements (exclude scenarios)')
347
+ .option('--no-scenarios', 'JSON only: Exclude scenario content')
348
+ .option('-r, --requirement <id>', 'JSON only: Show specific requirement by ID (1-based)')
349
+ .option('--store <id>', STORE_OPTION_DESCRIPTION)
350
+ // Explicit registration required: allowUnknownOption would otherwise
351
+ // silently swallow --store-path instead of rejecting it deliberately.
352
+ .addOption(hiddenStorePathOption())
353
+ // allow unknown options to pass-through to underlying command implementation
354
+ .allowUnknownOption(true)
355
+ .action(async (itemName, options) => {
356
+ try {
357
+ const showCommand = new ShowCommand();
358
+ await showCommand.execute(itemName, options ?? {});
359
+ }
360
+ catch (error) {
361
+ failWithError(error, { enabled: options?.json, fallbackCode: 'show_error' });
362
+ process.exit(1);
363
+ }
364
+ });
365
+ // Feedback command
366
+ program
367
+ .command('feedback <message>')
368
+ .description('Submit feedback about OpenSpec')
369
+ .option('--body <text>', 'Detailed description for the feedback')
370
+ .action(async (message, options) => {
371
+ try {
372
+ const feedbackCommand = new FeedbackCommand();
373
+ await feedbackCommand.execute(message, options);
374
+ }
375
+ catch (error) {
376
+ failWithError(error);
377
+ process.exit(1);
378
+ }
379
+ });
380
+ // Completion command with subcommands
381
+ const completionCmd = program
382
+ .command('completion')
383
+ .description('Manage shell completions for OpenSpec CLI');
384
+ completionCmd
385
+ .command('generate [shell]')
386
+ .description('Generate completion script for a shell (outputs to stdout)')
387
+ .action(async (shell) => {
388
+ try {
389
+ const completionCommand = new CompletionCommand();
390
+ await completionCommand.generate({ shell });
391
+ }
392
+ catch (error) {
393
+ failWithError(error);
394
+ process.exit(1);
395
+ }
396
+ });
397
+ completionCmd
398
+ .command('install [shell]')
399
+ .description('Install completion script for a shell')
400
+ .option('--verbose', 'Show detailed installation output')
401
+ .action(async (shell, options) => {
402
+ try {
403
+ const completionCommand = new CompletionCommand();
404
+ await completionCommand.install({ shell, verbose: options?.verbose });
405
+ }
406
+ catch (error) {
407
+ failWithError(error);
408
+ process.exit(1);
409
+ }
410
+ });
411
+ completionCmd
412
+ .command('uninstall [shell]')
413
+ .description('Uninstall completion script for a shell')
414
+ .option('-y, --yes', 'Skip confirmation prompts')
415
+ .action(async (shell, options) => {
416
+ try {
417
+ const completionCommand = new CompletionCommand();
418
+ await completionCommand.uninstall({ shell, yes: options?.yes });
419
+ }
420
+ catch (error) {
421
+ failWithError(error);
422
+ process.exit(1);
423
+ }
424
+ });
425
+ // Hidden command for machine-readable completion data
426
+ program
427
+ .command('__complete <type>', { hidden: true })
428
+ .description('Output completion data in machine-readable format (internal use)')
429
+ .action(async (type) => {
430
+ try {
431
+ const completionCommand = new CompletionCommand();
432
+ await completionCommand.complete({ type });
433
+ }
434
+ catch (error) {
435
+ // Silently fail for graceful shell completion experience
436
+ process.exitCode = 1;
437
+ }
438
+ });
439
+ // ═══════════════════════════════════════════════════════════
440
+ // Workflow Commands (formerly experimental)
441
+ // ═══════════════════════════════════════════════════════════
442
+ // Status command
443
+ program
444
+ .command('status')
445
+ .description('Display artifact completion status for a change')
446
+ .option('--change <id>', 'Change name to show status for')
447
+ .option('--schema <name>', 'Schema override (auto-detected from config.yaml)')
448
+ .option('--json', 'Output as JSON')
449
+ .option('--store <id>', STORE_OPTION_DESCRIPTION)
450
+ .addOption(hiddenStorePathOption())
451
+ .action(async (options) => {
452
+ try {
453
+ await statusCommand(options);
454
+ }
455
+ catch (error) {
456
+ failWithError(error, { enabled: options.json, fallbackCode: 'change_error' });
457
+ process.exit(1);
458
+ }
459
+ });
460
+ // Instructions command
461
+ program
462
+ .command('instructions [artifact]')
463
+ .description('Output enriched instructions for creating an artifact or applying tasks')
464
+ .option('--change <id>', 'Change name')
465
+ .option('--schema <name>', 'Schema override (auto-detected from config.yaml)')
466
+ .option('--json', 'Output as JSON')
467
+ .option('--record-comprehension-pass', 'Record a successful comprehension quiz pass (use with instructions apply)')
468
+ .option('--score <percent>', 'Quiz score 0-100 (required with --record-comprehension-pass)', parseInt)
469
+ .option('--attempt <n>', 'Quiz attempt number', parseInt)
470
+ .option('--question-count <n>', 'Number of quiz questions taken', parseInt)
471
+ .option('--store <id>', STORE_OPTION_DESCRIPTION)
472
+ .addOption(hiddenStorePathOption())
473
+ .action(async (artifactId, options) => {
474
+ try {
475
+ // Special case: "apply" is not an artifact, but a command to get apply instructions
476
+ if (artifactId === 'apply') {
477
+ await applyInstructionsCommand(options);
478
+ }
479
+ else {
480
+ await instructionsCommand(artifactId, options);
481
+ }
482
+ }
483
+ catch (error) {
484
+ failWithError(error, { enabled: options.json, fallbackCode: 'change_error' });
485
+ process.exit(1);
486
+ }
487
+ });
488
+ // Templates command
489
+ program
490
+ .command('templates')
491
+ .description('Show resolved template paths for all artifacts in a schema')
492
+ .option('--schema <name>', `Schema to use (default: ${DEFAULT_SCHEMA})`)
493
+ .option('--json', 'Output as JSON mapping artifact IDs to template paths')
494
+ .action(async (options) => {
495
+ try {
496
+ await templatesCommand(options);
497
+ }
498
+ catch (error) {
499
+ failWithError(error);
500
+ process.exit(1);
501
+ }
502
+ });
503
+ // Schemas command
504
+ program
505
+ .command('schemas')
506
+ .description('List available workflow schemas with descriptions')
507
+ .option('--json', 'Output as JSON (for agent use)')
508
+ .action(async (options) => {
509
+ try {
510
+ await schemasCommand(options);
511
+ }
512
+ catch (error) {
513
+ failWithError(error);
514
+ process.exit(1);
515
+ }
516
+ });
517
+ // New command group with change subcommand
518
+ const newCmd = program.command('new').description('Create new items');
519
+ newCmd
520
+ .command('change <name>')
521
+ .description('Create a new change directory')
522
+ .option('--description <text>', 'Description to add to README.md')
523
+ .option('--goal <text>', 'Optional goal metadata to store with the change')
524
+ .option('--schema <name>', `Workflow schema to use (default: ${DEFAULT_SCHEMA})`)
525
+ .option('--json', 'Output as JSON')
526
+ .option('--store <id>', STORE_OPTION_DESCRIPTION)
527
+ .addOption(hiddenStorePathOption())
528
+ // Removed options kept registered (hidden) so users get a deliberate
529
+ // explanation instead of a generic unknown-option error.
530
+ .addOption(new Option('--initiative <id>', 'No longer supported').hideHelp())
531
+ .addOption(new Option('--areas <names>', 'No longer supported').hideHelp())
532
+ .action(async (name, options) => {
533
+ try {
534
+ await newChangeCommand(name, options);
535
+ }
536
+ catch (error) {
537
+ failWithError(error);
538
+ process.exit(1);
539
+ }
540
+ });
541
+ export { program };
542
+ export function runCli(argv = process.argv) {
543
+ program.parse(argv);
544
+ }
545
+ if (process.argv[1] && path.resolve(process.argv[1]) === fileURLToPath(import.meta.url)) {
546
+ runCli();
547
+ }
548
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,39 @@
1
+ import type { RootOutput } from '../core/root-selection.js';
2
+ export declare class ChangeCommand {
3
+ private converter;
4
+ private rootPath?;
5
+ constructor(rootPath?: string);
6
+ private getChangesPath;
7
+ /**
8
+ * Show a change proposal.
9
+ * - Text mode: raw markdown passthrough (no filters)
10
+ * - JSON mode: minimal object with deltas; --deltas-only returns same object with filtered deltas
11
+ * Note: --requirements-only is deprecated alias for --deltas-only
12
+ */
13
+ show(changeName?: string, options?: {
14
+ json?: boolean;
15
+ requirementsOnly?: boolean;
16
+ deltasOnly?: boolean;
17
+ noInteractive?: boolean;
18
+ rootOutput?: RootOutput;
19
+ }): Promise<void>;
20
+ /**
21
+ * List active changes.
22
+ * - Text default: IDs only; --long prints minimal details (title, counts)
23
+ * - JSON: array of { id, title, deltaCount, taskStatus }, sorted by id
24
+ */
25
+ list(options?: {
26
+ json?: boolean;
27
+ long?: boolean;
28
+ }): Promise<void>;
29
+ validate(changeName?: string, options?: {
30
+ strict?: boolean;
31
+ json?: boolean;
32
+ noInteractive?: boolean;
33
+ }): Promise<void>;
34
+ private getActiveChanges;
35
+ private extractTitle;
36
+ private countTasks;
37
+ private printNextSteps;
38
+ }
39
+ //# sourceMappingURL=change.d.ts.map