@superkou/openspec 1.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (373) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +213 -0
  3. package/bin/openspec.js +5 -0
  4. package/dist/cli/index.d.ts +5 -0
  5. package/dist/cli/index.js +544 -0
  6. package/dist/commands/change.d.ts +35 -0
  7. package/dist/commands/change.js +277 -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 +611 -0
  12. package/dist/commands/context-store.d.ts +3 -0
  13. package/dist/commands/context-store.js +475 -0
  14. package/dist/commands/feedback.d.ts +9 -0
  15. package/dist/commands/feedback.js +183 -0
  16. package/dist/commands/initiative.d.ts +13 -0
  17. package/dist/commands/initiative.js +318 -0
  18. package/dist/commands/schema.d.ts +6 -0
  19. package/dist/commands/schema.js +869 -0
  20. package/dist/commands/show.d.ts +14 -0
  21. package/dist/commands/show.js +132 -0
  22. package/dist/commands/spec.d.ts +15 -0
  23. package/dist/commands/spec.js +225 -0
  24. package/dist/commands/validate.d.ts +24 -0
  25. package/dist/commands/validate.js +294 -0
  26. package/dist/commands/workflow/index.d.ts +19 -0
  27. package/dist/commands/workflow/index.js +13 -0
  28. package/dist/commands/workflow/initiative-link.d.ts +24 -0
  29. package/dist/commands/workflow/initiative-link.js +47 -0
  30. package/dist/commands/workflow/instructions.d.ts +29 -0
  31. package/dist/commands/workflow/instructions.js +344 -0
  32. package/dist/commands/workflow/new-change.d.ts +17 -0
  33. package/dist/commands/workflow/new-change.js +141 -0
  34. package/dist/commands/workflow/schemas.d.ts +10 -0
  35. package/dist/commands/workflow/schemas.js +34 -0
  36. package/dist/commands/workflow/set-change.d.ts +13 -0
  37. package/dist/commands/workflow/set-change.js +87 -0
  38. package/dist/commands/workflow/shared.d.ts +59 -0
  39. package/dist/commands/workflow/shared.js +116 -0
  40. package/dist/commands/workflow/status.d.ts +14 -0
  41. package/dist/commands/workflow/status.js +90 -0
  42. package/dist/commands/workflow/templates.d.ts +16 -0
  43. package/dist/commands/workflow/templates.js +69 -0
  44. package/dist/commands/workspace/context-status.d.ts +4 -0
  45. package/dist/commands/workspace/context-status.js +59 -0
  46. package/dist/commands/workspace/open-target-selection.d.ts +13 -0
  47. package/dist/commands/workspace/open-target-selection.js +146 -0
  48. package/dist/commands/workspace/open-view.d.ts +62 -0
  49. package/dist/commands/workspace/open-view.js +249 -0
  50. package/dist/commands/workspace/open.d.ts +37 -0
  51. package/dist/commands/workspace/open.js +110 -0
  52. package/dist/commands/workspace/opener-selection.d.ts +11 -0
  53. package/dist/commands/workspace/opener-selection.js +98 -0
  54. package/dist/commands/workspace/operations.d.ts +29 -0
  55. package/dist/commands/workspace/operations.js +543 -0
  56. package/dist/commands/workspace/prompt-theme.d.ts +29 -0
  57. package/dist/commands/workspace/prompt-theme.js +24 -0
  58. package/dist/commands/workspace/registration.d.ts +13 -0
  59. package/dist/commands/workspace/registration.js +84 -0
  60. package/dist/commands/workspace/selection.d.ts +8 -0
  61. package/dist/commands/workspace/selection.js +104 -0
  62. package/dist/commands/workspace/setup-prompts.d.ts +13 -0
  63. package/dist/commands/workspace/setup-prompts.js +121 -0
  64. package/dist/commands/workspace/types.d.ts +103 -0
  65. package/dist/commands/workspace/types.js +36 -0
  66. package/dist/commands/workspace.d.ts +5 -0
  67. package/dist/commands/workspace.js +577 -0
  68. package/dist/core/archive.d.ts +11 -0
  69. package/dist/core/archive.js +318 -0
  70. package/dist/core/artifact-graph/graph.d.ts +56 -0
  71. package/dist/core/artifact-graph/graph.js +141 -0
  72. package/dist/core/artifact-graph/index.d.ts +9 -0
  73. package/dist/core/artifact-graph/index.js +14 -0
  74. package/dist/core/artifact-graph/instruction-loader.d.ts +183 -0
  75. package/dist/core/artifact-graph/instruction-loader.js +256 -0
  76. package/dist/core/artifact-graph/outputs.d.ts +14 -0
  77. package/dist/core/artifact-graph/outputs.js +39 -0
  78. package/dist/core/artifact-graph/resolver.d.ts +81 -0
  79. package/dist/core/artifact-graph/resolver.js +257 -0
  80. package/dist/core/artifact-graph/schema.d.ts +13 -0
  81. package/dist/core/artifact-graph/schema.js +108 -0
  82. package/dist/core/artifact-graph/state.d.ts +12 -0
  83. package/dist/core/artifact-graph/state.js +31 -0
  84. package/dist/core/artifact-graph/types.d.ts +40 -0
  85. package/dist/core/artifact-graph/types.js +29 -0
  86. package/dist/core/available-tools.d.ts +17 -0
  87. package/dist/core/available-tools.js +43 -0
  88. package/dist/core/change-metadata/index.d.ts +2 -0
  89. package/dist/core/change-metadata/index.js +2 -0
  90. package/dist/core/change-metadata/schema.d.ts +18 -0
  91. package/dist/core/change-metadata/schema.js +28 -0
  92. package/dist/core/change-status-policy.d.ts +50 -0
  93. package/dist/core/change-status-policy.js +70 -0
  94. package/dist/core/collections/index.d.ts +3 -0
  95. package/dist/core/collections/index.js +3 -0
  96. package/dist/core/collections/initiatives/collection.d.ts +4 -0
  97. package/dist/core/collections/initiatives/collection.js +17 -0
  98. package/dist/core/collections/initiatives/index.d.ts +6 -0
  99. package/dist/core/collections/initiatives/index.js +6 -0
  100. package/dist/core/collections/initiatives/operations.d.ts +49 -0
  101. package/dist/core/collections/initiatives/operations.js +175 -0
  102. package/dist/core/collections/initiatives/resolution.d.ts +87 -0
  103. package/dist/core/collections/initiatives/resolution.js +374 -0
  104. package/dist/core/collections/initiatives/schema.d.ts +41 -0
  105. package/dist/core/collections/initiatives/schema.js +134 -0
  106. package/dist/core/collections/initiatives/templates.d.ts +12 -0
  107. package/dist/core/collections/initiatives/templates.js +90 -0
  108. package/dist/core/collections/runtime.d.ts +46 -0
  109. package/dist/core/collections/runtime.js +194 -0
  110. package/dist/core/command-generation/adapters/amazon-q.d.ts +13 -0
  111. package/dist/core/command-generation/adapters/amazon-q.js +26 -0
  112. package/dist/core/command-generation/adapters/antigravity.d.ts +13 -0
  113. package/dist/core/command-generation/adapters/antigravity.js +26 -0
  114. package/dist/core/command-generation/adapters/auggie.d.ts +13 -0
  115. package/dist/core/command-generation/adapters/auggie.js +27 -0
  116. package/dist/core/command-generation/adapters/bob.d.ts +14 -0
  117. package/dist/core/command-generation/adapters/bob.js +45 -0
  118. package/dist/core/command-generation/adapters/claude.d.ts +13 -0
  119. package/dist/core/command-generation/adapters/claude.js +50 -0
  120. package/dist/core/command-generation/adapters/cline.d.ts +14 -0
  121. package/dist/core/command-generation/adapters/cline.js +27 -0
  122. package/dist/core/command-generation/adapters/codebuddy.d.ts +13 -0
  123. package/dist/core/command-generation/adapters/codebuddy.js +28 -0
  124. package/dist/core/command-generation/adapters/codex.d.ts +16 -0
  125. package/dist/core/command-generation/adapters/codex.js +39 -0
  126. package/dist/core/command-generation/adapters/continue.d.ts +13 -0
  127. package/dist/core/command-generation/adapters/continue.js +28 -0
  128. package/dist/core/command-generation/adapters/costrict.d.ts +13 -0
  129. package/dist/core/command-generation/adapters/costrict.js +27 -0
  130. package/dist/core/command-generation/adapters/crush.d.ts +13 -0
  131. package/dist/core/command-generation/adapters/crush.js +30 -0
  132. package/dist/core/command-generation/adapters/cursor.d.ts +14 -0
  133. package/dist/core/command-generation/adapters/cursor.js +44 -0
  134. package/dist/core/command-generation/adapters/factory.d.ts +13 -0
  135. package/dist/core/command-generation/adapters/factory.js +27 -0
  136. package/dist/core/command-generation/adapters/gemini.d.ts +13 -0
  137. package/dist/core/command-generation/adapters/gemini.js +26 -0
  138. package/dist/core/command-generation/adapters/github-copilot.d.ts +13 -0
  139. package/dist/core/command-generation/adapters/github-copilot.js +26 -0
  140. package/dist/core/command-generation/adapters/iflow.d.ts +13 -0
  141. package/dist/core/command-generation/adapters/iflow.js +29 -0
  142. package/dist/core/command-generation/adapters/index.d.ts +32 -0
  143. package/dist/core/command-generation/adapters/index.js +32 -0
  144. package/dist/core/command-generation/adapters/junie.d.ts +13 -0
  145. package/dist/core/command-generation/adapters/junie.js +26 -0
  146. package/dist/core/command-generation/adapters/kilocode.d.ts +14 -0
  147. package/dist/core/command-generation/adapters/kilocode.js +23 -0
  148. package/dist/core/command-generation/adapters/kiro.d.ts +13 -0
  149. package/dist/core/command-generation/adapters/kiro.js +26 -0
  150. package/dist/core/command-generation/adapters/lingma.d.ts +13 -0
  151. package/dist/core/command-generation/adapters/lingma.js +30 -0
  152. package/dist/core/command-generation/adapters/opencode.d.ts +13 -0
  153. package/dist/core/command-generation/adapters/opencode.js +29 -0
  154. package/dist/core/command-generation/adapters/pi.d.ts +18 -0
  155. package/dist/core/command-generation/adapters/pi.js +55 -0
  156. package/dist/core/command-generation/adapters/qoder.d.ts +13 -0
  157. package/dist/core/command-generation/adapters/qoder.js +30 -0
  158. package/dist/core/command-generation/adapters/qwen.d.ts +13 -0
  159. package/dist/core/command-generation/adapters/qwen.js +26 -0
  160. package/dist/core/command-generation/adapters/roocode.d.ts +14 -0
  161. package/dist/core/command-generation/adapters/roocode.js +27 -0
  162. package/dist/core/command-generation/adapters/windsurf.d.ts +14 -0
  163. package/dist/core/command-generation/adapters/windsurf.js +51 -0
  164. package/dist/core/command-generation/generator.d.ts +21 -0
  165. package/dist/core/command-generation/generator.js +27 -0
  166. package/dist/core/command-generation/index.d.ts +22 -0
  167. package/dist/core/command-generation/index.js +24 -0
  168. package/dist/core/command-generation/registry.d.ts +36 -0
  169. package/dist/core/command-generation/registry.js +98 -0
  170. package/dist/core/command-generation/types.d.ts +56 -0
  171. package/dist/core/command-generation/types.js +8 -0
  172. package/dist/core/completions/command-registry.d.ts +3 -0
  173. package/dist/core/completions/command-registry.js +961 -0
  174. package/dist/core/completions/completion-provider.d.ts +71 -0
  175. package/dist/core/completions/completion-provider.js +129 -0
  176. package/dist/core/completions/factory.d.ts +64 -0
  177. package/dist/core/completions/factory.js +75 -0
  178. package/dist/core/completions/generators/bash-generator.d.ts +35 -0
  179. package/dist/core/completions/generators/bash-generator.js +230 -0
  180. package/dist/core/completions/generators/fish-generator.d.ts +32 -0
  181. package/dist/core/completions/generators/fish-generator.js +160 -0
  182. package/dist/core/completions/generators/powershell-generator.d.ts +36 -0
  183. package/dist/core/completions/generators/powershell-generator.js +266 -0
  184. package/dist/core/completions/generators/zsh-generator.d.ts +47 -0
  185. package/dist/core/completions/generators/zsh-generator.js +274 -0
  186. package/dist/core/completions/installers/bash-installer.d.ts +87 -0
  187. package/dist/core/completions/installers/bash-installer.js +318 -0
  188. package/dist/core/completions/installers/fish-installer.d.ts +43 -0
  189. package/dist/core/completions/installers/fish-installer.js +143 -0
  190. package/dist/core/completions/installers/powershell-installer.d.ts +102 -0
  191. package/dist/core/completions/installers/powershell-installer.js +387 -0
  192. package/dist/core/completions/installers/zsh-installer.d.ts +117 -0
  193. package/dist/core/completions/installers/zsh-installer.js +421 -0
  194. package/dist/core/completions/shared-flags.d.ts +12 -0
  195. package/dist/core/completions/shared-flags.js +28 -0
  196. package/dist/core/completions/templates/bash-templates.d.ts +6 -0
  197. package/dist/core/completions/templates/bash-templates.js +30 -0
  198. package/dist/core/completions/templates/fish-templates.d.ts +7 -0
  199. package/dist/core/completions/templates/fish-templates.js +45 -0
  200. package/dist/core/completions/templates/powershell-templates.d.ts +6 -0
  201. package/dist/core/completions/templates/powershell-templates.js +34 -0
  202. package/dist/core/completions/templates/zsh-templates.d.ts +6 -0
  203. package/dist/core/completions/templates/zsh-templates.js +45 -0
  204. package/dist/core/completions/types.d.ts +101 -0
  205. package/dist/core/completions/types.js +2 -0
  206. package/dist/core/config-prompts.d.ts +9 -0
  207. package/dist/core/config-prompts.js +34 -0
  208. package/dist/core/config-schema.d.ts +86 -0
  209. package/dist/core/config-schema.js +213 -0
  210. package/dist/core/config.d.ts +18 -0
  211. package/dist/core/config.js +39 -0
  212. package/dist/core/context-store/binding.d.ts +53 -0
  213. package/dist/core/context-store/binding.js +197 -0
  214. package/dist/core/context-store/errors.d.ts +20 -0
  215. package/dist/core/context-store/errors.js +22 -0
  216. package/dist/core/context-store/foundation.d.ts +55 -0
  217. package/dist/core/context-store/foundation.js +321 -0
  218. package/dist/core/context-store/index.d.ts +6 -0
  219. package/dist/core/context-store/index.js +6 -0
  220. package/dist/core/context-store/operations.d.ts +85 -0
  221. package/dist/core/context-store/operations.js +528 -0
  222. package/dist/core/context-store/registry.d.ts +45 -0
  223. package/dist/core/context-store/registry.js +229 -0
  224. package/dist/core/converters/json-converter.d.ts +6 -0
  225. package/dist/core/converters/json-converter.js +51 -0
  226. package/dist/core/global-config.d.ts +49 -0
  227. package/dist/core/global-config.js +124 -0
  228. package/dist/core/index.d.ts +6 -0
  229. package/dist/core/index.js +7 -0
  230. package/dist/core/init.d.ts +37 -0
  231. package/dist/core/init.js +593 -0
  232. package/dist/core/legacy-cleanup.d.ts +162 -0
  233. package/dist/core/legacy-cleanup.js +514 -0
  234. package/dist/core/list.d.ts +9 -0
  235. package/dist/core/list.js +171 -0
  236. package/dist/core/migration.d.ts +23 -0
  237. package/dist/core/migration.js +108 -0
  238. package/dist/core/parsers/change-parser.d.ts +13 -0
  239. package/dist/core/parsers/change-parser.js +197 -0
  240. package/dist/core/parsers/markdown-parser.d.ts +26 -0
  241. package/dist/core/parsers/markdown-parser.js +227 -0
  242. package/dist/core/parsers/requirement-blocks.d.ts +37 -0
  243. package/dist/core/parsers/requirement-blocks.js +201 -0
  244. package/dist/core/parsers/spec-structure.d.ts +9 -0
  245. package/dist/core/parsers/spec-structure.js +88 -0
  246. package/dist/core/planning-home.d.ts +21 -0
  247. package/dist/core/planning-home.js +108 -0
  248. package/dist/core/profile-sync-drift.d.ts +38 -0
  249. package/dist/core/profile-sync-drift.js +200 -0
  250. package/dist/core/profiles.d.ts +26 -0
  251. package/dist/core/profiles.js +40 -0
  252. package/dist/core/project-config.d.ts +64 -0
  253. package/dist/core/project-config.js +223 -0
  254. package/dist/core/schemas/base.schema.d.ts +13 -0
  255. package/dist/core/schemas/base.schema.js +13 -0
  256. package/dist/core/schemas/change.schema.d.ts +73 -0
  257. package/dist/core/schemas/change.schema.js +31 -0
  258. package/dist/core/schemas/index.d.ts +4 -0
  259. package/dist/core/schemas/index.js +4 -0
  260. package/dist/core/schemas/spec.schema.d.ts +18 -0
  261. package/dist/core/schemas/spec.schema.js +15 -0
  262. package/dist/core/shared/index.d.ts +8 -0
  263. package/dist/core/shared/index.js +8 -0
  264. package/dist/core/shared/skill-generation.d.ts +49 -0
  265. package/dist/core/shared/skill-generation.js +96 -0
  266. package/dist/core/shared/tool-detection.d.ts +71 -0
  267. package/dist/core/shared/tool-detection.js +158 -0
  268. package/dist/core/specs-apply.d.ts +73 -0
  269. package/dist/core/specs-apply.js +392 -0
  270. package/dist/core/styles/palette.d.ts +7 -0
  271. package/dist/core/styles/palette.js +8 -0
  272. package/dist/core/templates/index.d.ts +8 -0
  273. package/dist/core/templates/index.js +9 -0
  274. package/dist/core/templates/skill-templates.d.ts +19 -0
  275. package/dist/core/templates/skill-templates.js +18 -0
  276. package/dist/core/templates/types.d.ts +19 -0
  277. package/dist/core/templates/types.js +5 -0
  278. package/dist/core/templates/workflows/apply-change.d.ts +10 -0
  279. package/dist/core/templates/workflows/apply-change.js +314 -0
  280. package/dist/core/templates/workflows/archive-change.d.ts +10 -0
  281. package/dist/core/templates/workflows/archive-change.js +277 -0
  282. package/dist/core/templates/workflows/bulk-archive-change.d.ts +10 -0
  283. package/dist/core/templates/workflows/bulk-archive-change.js +492 -0
  284. package/dist/core/templates/workflows/continue-change.d.ts +10 -0
  285. package/dist/core/templates/workflows/continue-change.js +234 -0
  286. package/dist/core/templates/workflows/explore.d.ts +10 -0
  287. package/dist/core/templates/workflows/explore.js +459 -0
  288. package/dist/core/templates/workflows/feedback.d.ts +9 -0
  289. package/dist/core/templates/workflows/feedback.js +108 -0
  290. package/dist/core/templates/workflows/ff-change.d.ts +10 -0
  291. package/dist/core/templates/workflows/ff-change.js +200 -0
  292. package/dist/core/templates/workflows/new-change.d.ts +10 -0
  293. package/dist/core/templates/workflows/new-change.js +143 -0
  294. package/dist/core/templates/workflows/onboard.d.ts +10 -0
  295. package/dist/core/templates/workflows/onboard.js +563 -0
  296. package/dist/core/templates/workflows/propose.d.ts +10 -0
  297. package/dist/core/templates/workflows/propose.js +218 -0
  298. package/dist/core/templates/workflows/sync-specs.d.ts +10 -0
  299. package/dist/core/templates/workflows/sync-specs.js +290 -0
  300. package/dist/core/templates/workflows/verify-change.d.ts +10 -0
  301. package/dist/core/templates/workflows/verify-change.js +338 -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 +43 -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/workspace/foundation.d.ts +67 -0
  313. package/dist/core/workspace/foundation.js +295 -0
  314. package/dist/core/workspace/index.d.ts +8 -0
  315. package/dist/core/workspace/index.js +8 -0
  316. package/dist/core/workspace/legacy-state.d.ts +28 -0
  317. package/dist/core/workspace/legacy-state.js +200 -0
  318. package/dist/core/workspace/link-input.d.ts +9 -0
  319. package/dist/core/workspace/link-input.js +32 -0
  320. package/dist/core/workspace/open-surface.d.ts +45 -0
  321. package/dist/core/workspace/open-surface.js +215 -0
  322. package/dist/core/workspace/openers.d.ts +21 -0
  323. package/dist/core/workspace/openers.js +124 -0
  324. package/dist/core/workspace/registry.d.ts +24 -0
  325. package/dist/core/workspace/registry.js +146 -0
  326. package/dist/core/workspace/skills.d.ts +57 -0
  327. package/dist/core/workspace/skills.js +334 -0
  328. package/dist/core/workspace/state-io.d.ts +10 -0
  329. package/dist/core/workspace/state-io.js +121 -0
  330. package/dist/index.d.ts +3 -0
  331. package/dist/index.js +3 -0
  332. package/dist/prompts/searchable-multi-select.d.ts +28 -0
  333. package/dist/prompts/searchable-multi-select.js +159 -0
  334. package/dist/telemetry/config.d.ts +38 -0
  335. package/dist/telemetry/config.js +136 -0
  336. package/dist/telemetry/index.d.ts +31 -0
  337. package/dist/telemetry/index.js +164 -0
  338. package/dist/ui/ascii-patterns.d.ts +16 -0
  339. package/dist/ui/ascii-patterns.js +133 -0
  340. package/dist/ui/welcome-screen.d.ts +10 -0
  341. package/dist/ui/welcome-screen.js +146 -0
  342. package/dist/utils/change-metadata.d.ts +54 -0
  343. package/dist/utils/change-metadata.js +141 -0
  344. package/dist/utils/change-utils.d.ts +71 -0
  345. package/dist/utils/change-utils.js +123 -0
  346. package/dist/utils/command-references.d.ts +18 -0
  347. package/dist/utils/command-references.js +20 -0
  348. package/dist/utils/file-system.d.ts +41 -0
  349. package/dist/utils/file-system.js +301 -0
  350. package/dist/utils/index.d.ts +6 -0
  351. package/dist/utils/index.js +9 -0
  352. package/dist/utils/interactive.d.ts +18 -0
  353. package/dist/utils/interactive.js +21 -0
  354. package/dist/utils/item-discovery.d.ts +4 -0
  355. package/dist/utils/item-discovery.js +72 -0
  356. package/dist/utils/match.d.ts +3 -0
  357. package/dist/utils/match.js +22 -0
  358. package/dist/utils/shell-detection.d.ts +20 -0
  359. package/dist/utils/shell-detection.js +41 -0
  360. package/dist/utils/task-progress.d.ts +8 -0
  361. package/dist/utils/task-progress.js +36 -0
  362. package/package.json +85 -0
  363. package/schemas/spec-driven/schema.yaml +151 -0
  364. package/schemas/spec-driven/templates/design.md +19 -0
  365. package/schemas/spec-driven/templates/proposal.md +23 -0
  366. package/schemas/spec-driven/templates/spec.md +8 -0
  367. package/schemas/spec-driven/templates/tasks.md +9 -0
  368. package/schemas/workspace-planning/schema.yaml +72 -0
  369. package/schemas/workspace-planning/templates/design.md +33 -0
  370. package/schemas/workspace-planning/templates/proposal.md +28 -0
  371. package/schemas/workspace-planning/templates/spec.md +9 -0
  372. package/schemas/workspace-planning/templates/tasks.md +15 -0
  373. package/scripts/postinstall.js +83 -0
@@ -0,0 +1,544 @@
1
+ import { Command } from 'commander';
2
+ import { createRequire } from 'module';
3
+ import ora from 'ora';
4
+ import path from 'path';
5
+ import { fileURLToPath } from 'url';
6
+ import { promises as fs } from 'fs';
7
+ import { AI_TOOLS, OPENSPEC_DIR_NAME } from '../core/config.js';
8
+ import { UpdateCommand } from '../core/update.js';
9
+ import { ListCommand } from '../core/list.js';
10
+ import { ArchiveCommand } from '../core/archive.js';
11
+ import { ViewCommand } from '../core/view.js';
12
+ import { registerSpecCommand } from '../commands/spec.js';
13
+ import { ChangeCommand } from '../commands/change.js';
14
+ import { ValidateCommand } from '../commands/validate.js';
15
+ import { ShowCommand } from '../commands/show.js';
16
+ import { CompletionCommand } from '../commands/completion.js';
17
+ import { FeedbackCommand } from '../commands/feedback.js';
18
+ import { registerConfigCommand } from '../commands/config.js';
19
+ import { registerSchemaCommand } from '../commands/schema.js';
20
+ import { registerWorkspaceCommand } from '../commands/workspace.js';
21
+ import { registerContextStoreCommand } from '../commands/context-store.js';
22
+ import { registerInitiativeCommand } from '../commands/initiative.js';
23
+ import { findWorkspaceRoot } from '../core/workspace/index.js';
24
+ import { statusCommand, instructionsCommand, applyInstructionsCommand, templatesCommand, schemasCommand, newChangeCommand, setChangeCommand, DEFAULT_SCHEMA, } from '../commands/workflow/index.js';
25
+ import { maybeShowTelemetryNotice, trackCommand, shutdown } from '../telemetry/index.js';
26
+ const program = new Command();
27
+ const require = createRequire(import.meta.url);
28
+ const { version } = require('../../package.json');
29
+ /**
30
+ * Get the full command path for nested commands.
31
+ * For example: 'change show' -> 'change:show'
32
+ */
33
+ function getCommandPath(command) {
34
+ const names = [];
35
+ let current = command;
36
+ while (current) {
37
+ const name = current.name();
38
+ // Skip the root 'openspec' command
39
+ if (name && name !== 'openspec') {
40
+ names.unshift(name);
41
+ }
42
+ current = current.parent;
43
+ }
44
+ return names.join(':') || 'openspec';
45
+ }
46
+ program
47
+ .name('openspec')
48
+ .description('AI 原生的规格驱动开发系统')
49
+ .version(version);
50
+ // Global options
51
+ program.option('--no-color', '禁用颜色输出');
52
+ // Apply global flags and telemetry before any command runs
53
+ // Note: preAction receives (thisCommand, actionCommand) where:
54
+ // - thisCommand: the command where hook was added (root program)
55
+ // - actionCommand: the command actually being executed (subcommand)
56
+ program.hook('preAction', async (thisCommand, actionCommand) => {
57
+ const opts = thisCommand.opts();
58
+ if (opts.color === false) {
59
+ process.env.NO_COLOR = '1';
60
+ }
61
+ // Show first-run telemetry notice (if not seen)
62
+ await maybeShowTelemetryNotice();
63
+ // Track command execution (use actionCommand to get the actual subcommand)
64
+ const commandPath = getCommandPath(actionCommand);
65
+ await trackCommand(commandPath, version);
66
+ });
67
+ // Shutdown telemetry after command completes
68
+ program.hook('postAction', async () => {
69
+ await shutdown();
70
+ });
71
+ const availableToolIds = AI_TOOLS.filter((tool) => tool.skillsDir).map((tool) => tool.value);
72
+ const toolsOptionDescription = `以非交互方式配置 AI 工具。使用 "all"、"none" 或逗号分隔的列表: ${availableToolIds.join(', ')}`;
73
+ async function hasRepoLocalOpenSpecProject(projectPath) {
74
+ try {
75
+ const stats = await fs.stat(path.join(projectPath, OPENSPEC_DIR_NAME));
76
+ return stats.isDirectory();
77
+ }
78
+ catch (error) {
79
+ const code = typeof error === 'object' && error !== null && 'code' in error
80
+ ? error.code
81
+ : undefined;
82
+ if (code !== 'ENOENT' && code !== 'ENOTDIR') {
83
+ throw error;
84
+ }
85
+ return false;
86
+ }
87
+ }
88
+ program
89
+ .command('init [path]')
90
+ .description('在项目中初始化 OpenSpec')
91
+ .option('--tools <tools>', toolsOptionDescription)
92
+ .option('--force', '自动清理遗留文件,无需确认')
93
+ .option('--profile <profile>', '覆盖全局配置(core 或 custom)')
94
+ .action(async (targetPath = '.', options) => {
95
+ try {
96
+ // Validate that the path is a valid directory
97
+ const resolvedPath = path.resolve(targetPath);
98
+ try {
99
+ const stats = await fs.stat(resolvedPath);
100
+ if (!stats.isDirectory()) {
101
+ throw new Error(`Path "${targetPath}" is not a directory`);
102
+ }
103
+ }
104
+ catch (error) {
105
+ if (error.code === 'ENOENT') {
106
+ // Directory doesn't exist, but we can create it
107
+ console.log(`目录 "${targetPath}" 不存在,将自动创建。`);
108
+ }
109
+ else if (error.message && error.message.includes('not a directory')) {
110
+ throw error;
111
+ }
112
+ else {
113
+ throw new Error(`Cannot access path "${targetPath}": ${error.message}`);
114
+ }
115
+ }
116
+ const { InitCommand } = await import('../core/init.js');
117
+ const initCommand = new InitCommand({
118
+ tools: options?.tools,
119
+ force: options?.force,
120
+ profile: options?.profile,
121
+ });
122
+ await initCommand.execute(targetPath);
123
+ }
124
+ catch (error) {
125
+ console.log(); // Empty line for spacing
126
+ ora().fail(`错误: ${error.message}`);
127
+ process.exit(1);
128
+ }
129
+ });
130
+ // Hidden alias: 'experimental' -> 'init' for backwards compatibility
131
+ program
132
+ .command('experimental', { hidden: true })
133
+ .description('init 的别名(已弃用)')
134
+ .option('--tool <tool-id>', '目标 AI 工具(映射到 --tools)')
135
+ .option('--no-interactive', '禁用交互式提示')
136
+ .action(async (options) => {
137
+ try {
138
+ console.log('注意: "openspec experimental" 已弃用,请使用 "openspec init"。');
139
+ const { InitCommand } = await import('../core/init.js');
140
+ const initCommand = new InitCommand({
141
+ tools: options?.tool,
142
+ interactive: options?.noInteractive === true ? false : undefined,
143
+ });
144
+ await initCommand.execute('.');
145
+ }
146
+ catch (error) {
147
+ console.log();
148
+ ora().fail(`错误: ${error.message}`);
149
+ process.exit(1);
150
+ }
151
+ });
152
+ program
153
+ .command('update [path]')
154
+ .description('更新 OpenSpec 指令文件')
155
+ .option('--force', '即使工具已是最新也强制更新')
156
+ .action(async (targetPath = '.', options) => {
157
+ try {
158
+ const resolvedPath = path.resolve(targetPath);
159
+ const updateCommand = new UpdateCommand({ force: options?.force });
160
+ if (await hasRepoLocalOpenSpecProject(resolvedPath)) {
161
+ await updateCommand.execute(resolvedPath);
162
+ return;
163
+ }
164
+ const workspaceRoot = await findWorkspaceRoot(resolvedPath);
165
+ if (workspaceRoot) {
166
+ throw new Error('OpenSpec workspace detected. Run `openspec workspace update` to refresh workspace-local guidance and skills.');
167
+ }
168
+ await updateCommand.execute(resolvedPath);
169
+ }
170
+ catch (error) {
171
+ console.log(); // Empty line for spacing
172
+ ora().fail(`错误: ${error.message}`);
173
+ process.exit(1);
174
+ }
175
+ });
176
+ program
177
+ .command('list')
178
+ .description('列出项目(默认为变更列表)。使用 --specs 列出规格')
179
+ .option('--specs', '列出规格而非变更')
180
+ .option('--changes', '显式列出变更(默认)')
181
+ .option('--sort <order>', '排序方式: "recent"(默认)或 "name"', 'recent')
182
+ .option('--json', '以 JSON 格式输出(供程序使用)')
183
+ .action(async (options) => {
184
+ try {
185
+ const listCommand = new ListCommand();
186
+ const mode = options?.specs ? 'specs' : 'changes';
187
+ const sort = options?.sort === 'name' ? 'name' : 'recent';
188
+ await listCommand.execute('.', mode, { sort, json: options?.json });
189
+ }
190
+ catch (error) {
191
+ console.log(); // Empty line for spacing
192
+ ora().fail(`错误: ${error.message}`);
193
+ process.exit(1);
194
+ }
195
+ });
196
+ program
197
+ .command('view')
198
+ .description('显示规格和变更的交互式仪表盘')
199
+ .action(async () => {
200
+ try {
201
+ const viewCommand = new ViewCommand();
202
+ await viewCommand.execute('.');
203
+ }
204
+ catch (error) {
205
+ console.log(); // Empty line for spacing
206
+ ora().fail(`错误: ${error.message}`);
207
+ process.exit(1);
208
+ }
209
+ });
210
+ // Change command with subcommands
211
+ const changeCmd = program
212
+ .command('change')
213
+ .description('管理 OpenSpec 变更提案');
214
+ // Deprecation notice for noun-based commands
215
+ changeCmd.hook('preAction', () => {
216
+ console.error('警告: "openspec change ..." 命令已弃用。推荐使用动词优先的命令(如 "openspec list"、"openspec validate --changes")。');
217
+ });
218
+ changeCmd
219
+ .command('show [change-name]')
220
+ .description('以 JSON 或 Markdown 格式显示变更提案')
221
+ .option('--json', '以 JSON 格式输出')
222
+ .option('--deltas-only', '仅显示差异内容(仅 JSON)')
223
+ .option('--requirements-only', '--deltas-only 的别名(已弃用)')
224
+ .option('--no-interactive', '禁用交互式提示')
225
+ .action(async (changeName, options) => {
226
+ try {
227
+ const changeCommand = new ChangeCommand();
228
+ await changeCommand.show(changeName, options);
229
+ }
230
+ catch (error) {
231
+ console.error(`错误: ${error.message}`);
232
+ process.exitCode = 1;
233
+ }
234
+ });
235
+ changeCmd
236
+ .command('list')
237
+ .description('列出所有活跃变更(已弃用: 请使用 "openspec list")')
238
+ .option('--json', '以 JSON 格式输出')
239
+ .option('--long', '显示 ID、标题和统计数')
240
+ .action(async (options) => {
241
+ try {
242
+ console.error('警告: "openspec change list" 已弃用,请使用 "openspec list"。');
243
+ const changeCommand = new ChangeCommand();
244
+ await changeCommand.list(options);
245
+ }
246
+ catch (error) {
247
+ console.error(`错误: ${error.message}`);
248
+ process.exitCode = 1;
249
+ }
250
+ });
251
+ changeCmd
252
+ .command('validate [change-name]')
253
+ .description('验证变更提案')
254
+ .option('--strict', '启用严格验证模式')
255
+ .option('--json', '以 JSON 格式输出验证报告')
256
+ .option('--no-interactive', '禁用交互式提示')
257
+ .action(async (changeName, options) => {
258
+ try {
259
+ const changeCommand = new ChangeCommand();
260
+ await changeCommand.validate(changeName, options);
261
+ if (typeof process.exitCode === 'number' && process.exitCode !== 0) {
262
+ process.exit(process.exitCode);
263
+ }
264
+ }
265
+ catch (error) {
266
+ console.error(`错误: ${error.message}`);
267
+ process.exitCode = 1;
268
+ }
269
+ });
270
+ program
271
+ .command('archive [change-name]')
272
+ .description('归档已完成的变更并更新主规格')
273
+ .option('-y, --yes', '跳过确认提示')
274
+ .option('--skip-specs', '跳过规格更新操作(适用于基础设施、工具或仅文档变更)')
275
+ .option('--no-validate', '跳过验证(不推荐,需要确认)')
276
+ .action(async (changeName, options) => {
277
+ try {
278
+ const archiveCommand = new ArchiveCommand();
279
+ await archiveCommand.execute(changeName, options);
280
+ }
281
+ catch (error) {
282
+ console.log(); // Empty line for spacing
283
+ ora().fail(`错误: ${error.message}`);
284
+ process.exit(1);
285
+ }
286
+ });
287
+ registerSpecCommand(program);
288
+ registerConfigCommand(program);
289
+ registerSchemaCommand(program);
290
+ registerWorkspaceCommand(program);
291
+ registerContextStoreCommand(program);
292
+ registerInitiativeCommand(program);
293
+ // Top-level validate command
294
+ program
295
+ .command('validate [item-name]')
296
+ .description('验证变更和规格')
297
+ .option('--all', '验证所有变更和规格')
298
+ .option('--changes', '验证所有变更')
299
+ .option('--specs', '验证所有规格')
300
+ .option('--type <type>', '当类型不明确时指定项目类型: change|spec')
301
+ .option('--strict', '启用严格验证模式')
302
+ .option('--json', '以 JSON 格式输出验证结果')
303
+ .option('--concurrency <n>', '最大并发验证数(默认为环境变量 OPENSPEC_CONCURRENCY 或 6)')
304
+ .option('--no-interactive', '禁用交互式提示')
305
+ .action(async (itemName, options) => {
306
+ try {
307
+ const validateCommand = new ValidateCommand();
308
+ await validateCommand.execute(itemName, options);
309
+ }
310
+ catch (error) {
311
+ console.log();
312
+ ora().fail(`错误: ${error.message}`);
313
+ process.exit(1);
314
+ }
315
+ });
316
+ // Top-level show command
317
+ program
318
+ .command('show [item-name]')
319
+ .description('显示变更或规格')
320
+ .option('--json', '以 JSON 格式输出')
321
+ .option('--type <type>', '当类型不明确时指定项目类型: change|spec')
322
+ .option('--no-interactive', '禁用交互式提示')
323
+ // change-only flags
324
+ .option('--deltas-only', '仅显示差异内容(仅 JSON,变更)')
325
+ .option('--requirements-only', '--deltas-only 的别名(已弃用,变更)')
326
+ // spec-only flags
327
+ .option('--requirements', '仅 JSON: 仅显示需求(排除场景)')
328
+ .option('--no-scenarios', '仅 JSON: 排除场景内容')
329
+ .option('-r, --requirement <id>', '仅 JSON: 按 ID 显示特定需求(从 1 开始)')
330
+ // allow unknown options to pass-through to underlying command implementation
331
+ .allowUnknownOption(true)
332
+ .action(async (itemName, options) => {
333
+ try {
334
+ const showCommand = new ShowCommand();
335
+ await showCommand.execute(itemName, options ?? {});
336
+ }
337
+ catch (error) {
338
+ console.log();
339
+ ora().fail(`错误: ${error.message}`);
340
+ process.exit(1);
341
+ }
342
+ });
343
+ // Feedback command
344
+ program
345
+ .command('feedback <message>')
346
+ .description('提交关于 OpenSpec 的反馈')
347
+ .option('--body <text>', '反馈的详细描述')
348
+ .action(async (message, options) => {
349
+ try {
350
+ const feedbackCommand = new FeedbackCommand();
351
+ await feedbackCommand.execute(message, options);
352
+ }
353
+ catch (error) {
354
+ console.log();
355
+ ora().fail(`错误: ${error.message}`);
356
+ process.exit(1);
357
+ }
358
+ });
359
+ // Completion command with subcommands
360
+ const completionCmd = program
361
+ .command('completion')
362
+ .description('管理 OpenSpec CLI 的 Shell 补全');
363
+ completionCmd
364
+ .command('generate [shell]')
365
+ .description('生成 Shell 补全脚本(输出到标准输出)')
366
+ .action(async (shell) => {
367
+ try {
368
+ const completionCommand = new CompletionCommand();
369
+ await completionCommand.generate({ shell });
370
+ }
371
+ catch (error) {
372
+ console.log();
373
+ ora().fail(`错误: ${error.message}`);
374
+ process.exit(1);
375
+ }
376
+ });
377
+ completionCmd
378
+ .command('install [shell]')
379
+ .description('安装 Shell 补全脚本')
380
+ .option('--verbose', '显示详细的安装输出')
381
+ .action(async (shell, options) => {
382
+ try {
383
+ const completionCommand = new CompletionCommand();
384
+ await completionCommand.install({ shell, verbose: options?.verbose });
385
+ }
386
+ catch (error) {
387
+ console.log();
388
+ ora().fail(`错误: ${error.message}`);
389
+ process.exit(1);
390
+ }
391
+ });
392
+ completionCmd
393
+ .command('uninstall [shell]')
394
+ .description('卸载 Shell 补全脚本')
395
+ .option('-y, --yes', '跳过确认提示')
396
+ .action(async (shell, options) => {
397
+ try {
398
+ const completionCommand = new CompletionCommand();
399
+ await completionCommand.uninstall({ shell, yes: options?.yes });
400
+ }
401
+ catch (error) {
402
+ console.log();
403
+ ora().fail(`错误: ${error.message}`);
404
+ process.exit(1);
405
+ }
406
+ });
407
+ // Hidden command for machine-readable completion data
408
+ program
409
+ .command('__complete <type>', { hidden: true })
410
+ .description('以机器可读格式输出补全数据(内部使用)')
411
+ .action(async (type) => {
412
+ try {
413
+ const completionCommand = new CompletionCommand();
414
+ await completionCommand.complete({ type });
415
+ }
416
+ catch (error) {
417
+ // Silently fail for graceful shell completion experience
418
+ process.exitCode = 1;
419
+ }
420
+ });
421
+ // ═══════════════════════════════════════════════════════════
422
+ // Workflow Commands (formerly experimental)
423
+ // ═══════════════════════════════════════════════════════════
424
+ // Status command
425
+ program
426
+ .command('status')
427
+ .description('显示变更的制品完成状态')
428
+ .option('--change <id>', '要显示状态的变更名称')
429
+ .option('--schema <name>', '覆盖模式(自动从 config.yaml 检测)')
430
+ .option('--json', '以 JSON 格式输出')
431
+ .action(async (options) => {
432
+ try {
433
+ await statusCommand(options);
434
+ }
435
+ catch (error) {
436
+ console.log();
437
+ ora().fail(`错误: ${error.message}`);
438
+ process.exit(1);
439
+ }
440
+ });
441
+ // Instructions command
442
+ program
443
+ .command('instructions [artifact]')
444
+ .description('输出创建制品或执行任务的增强指令')
445
+ .option('--change <id>', '变更名称')
446
+ .option('--schema <name>', '覆盖模式(自动从 config.yaml 检测)')
447
+ .option('--json', '以 JSON 格式输出')
448
+ .action(async (artifactId, options) => {
449
+ try {
450
+ // Special case: "apply" is not an artifact, but a command to get apply instructions
451
+ if (artifactId === 'apply') {
452
+ await applyInstructionsCommand(options);
453
+ }
454
+ else {
455
+ await instructionsCommand(artifactId, options);
456
+ }
457
+ }
458
+ catch (error) {
459
+ console.log();
460
+ ora().fail(`错误: ${error.message}`);
461
+ process.exit(1);
462
+ }
463
+ });
464
+ // Templates command
465
+ program
466
+ .command('templates')
467
+ .description('显示模式中所有制品的模板路径')
468
+ .option('--schema <name>', `使用的模式(默认: ${DEFAULT_SCHEMA})`)
469
+ .option('--json', '以 JSON 格式输出制品 ID 到模板路径的映射')
470
+ .action(async (options) => {
471
+ try {
472
+ await templatesCommand(options);
473
+ }
474
+ catch (error) {
475
+ console.log();
476
+ ora().fail(`错误: ${error.message}`);
477
+ process.exit(1);
478
+ }
479
+ });
480
+ // Schemas command
481
+ program
482
+ .command('schemas')
483
+ .description('列出可用的工作流模式及说明')
484
+ .option('--json', '以 JSON 格式输出(供代理使用)')
485
+ .action(async (options) => {
486
+ try {
487
+ await schemasCommand(options);
488
+ }
489
+ catch (error) {
490
+ console.log();
491
+ ora().fail(`错误: ${error.message}`);
492
+ process.exit(1);
493
+ }
494
+ });
495
+ // New command group with change subcommand
496
+ const newCmd = program.command('new').description('创建新项目');
497
+ newCmd
498
+ .command('change <name>')
499
+ .description('创建新的变更目录')
500
+ .option('--description <text>', '要添加到 README.md 的描述')
501
+ .option('--goal <text>', '与变更一起存储的工作区产品目标')
502
+ .option('--areas <names>', '逗号分隔的受影响工作区链接名称')
503
+ .option('--initiative <id>', '将仓库本地变更关联到计划')
504
+ .option('--store <id>', '--initiative 的上下文存储 ID')
505
+ .option('--store-path <path>', '--initiative 的现有本地上下文存储根路径')
506
+ .option('--schema <name>', `使用的工作流模式(默认: ${DEFAULT_SCHEMA})`)
507
+ .option('--json', '以 JSON 格式输出')
508
+ .action(async (name, options) => {
509
+ try {
510
+ await newChangeCommand(name, options);
511
+ }
512
+ catch (error) {
513
+ console.log();
514
+ ora().fail(`错误: ${error.message}`);
515
+ process.exit(1);
516
+ }
517
+ });
518
+ // Set command group
519
+ const setCmd = program.command('set').description('Set checked-in OpenSpec metadata');
520
+ setCmd
521
+ .command('change <name>')
522
+ .description('Set repo-local change metadata')
523
+ .option('--initiative <id>', 'Link the repo-local change to an initiative')
524
+ .option('--store <id>', 'Context store id for --initiative')
525
+ .option('--store-path <path>', 'Existing local context store root for --initiative')
526
+ .option('--json', 'Output as JSON')
527
+ .action(async (name, options) => {
528
+ try {
529
+ await setChangeCommand(name, options);
530
+ }
531
+ catch (error) {
532
+ console.log();
533
+ ora().fail(`Error: ${error.message}`);
534
+ process.exit(1);
535
+ }
536
+ });
537
+ export { program };
538
+ export function runCli(argv = process.argv) {
539
+ program.parse(argv);
540
+ }
541
+ if (process.argv[1] && path.resolve(process.argv[1]) === fileURLToPath(import.meta.url)) {
542
+ runCli();
543
+ }
544
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,35 @@
1
+ export declare class ChangeCommand {
2
+ private converter;
3
+ constructor();
4
+ /**
5
+ * Show a change proposal.
6
+ * - Text mode: raw markdown passthrough (no filters)
7
+ * - JSON mode: minimal object with deltas; --deltas-only returns same object with filtered deltas
8
+ * Note: --requirements-only is deprecated alias for --deltas-only
9
+ */
10
+ show(changeName?: string, options?: {
11
+ json?: boolean;
12
+ requirementsOnly?: boolean;
13
+ deltasOnly?: boolean;
14
+ noInteractive?: boolean;
15
+ }): Promise<void>;
16
+ /**
17
+ * List active changes.
18
+ * - Text default: IDs only; --long prints minimal details (title, counts)
19
+ * - JSON: array of { id, title, deltaCount, taskStatus }, sorted by id
20
+ */
21
+ list(options?: {
22
+ json?: boolean;
23
+ long?: boolean;
24
+ }): Promise<void>;
25
+ validate(changeName?: string, options?: {
26
+ strict?: boolean;
27
+ json?: boolean;
28
+ noInteractive?: boolean;
29
+ }): Promise<void>;
30
+ private getActiveChanges;
31
+ private extractTitle;
32
+ private countTasks;
33
+ private printNextSteps;
34
+ }
35
+ //# sourceMappingURL=change.d.ts.map