@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,84 @@
1
+ import { getWorkspaceSkillToolIds } from '../../core/workspace/index.js';
2
+ function collectOption(value, previous) {
3
+ return [...previous, value];
4
+ }
5
+ function addWorkspaceSelectionOptions(command) {
6
+ return command
7
+ .option('--workspace <name>', 'Workspace name from known local workspace views')
8
+ .option('--json', 'Output as JSON')
9
+ .option('--no-interactive', 'Disable prompts');
10
+ }
11
+ export function registerWorkspaceCommandWith(program, workspaceCommand) {
12
+ const workspace = program
13
+ .command('workspace')
14
+ .description('Set up and inspect coordination workspaces');
15
+ workspace
16
+ .command('setup')
17
+ .description('Set up a workspace and link existing repos or folders')
18
+ .option('--name <name>', 'Workspace name')
19
+ .option('--link <link>', 'Repo or folder link. Use <path> or <name>=<path>.', collectOption, [])
20
+ .option('--opener <id>', 'Preferred opener: codex-cli, claude, github-copilot, or editor')
21
+ .option('--tools <tools>', `Install OpenSpec skills for agents. Use "all", "none", or a comma-separated list of: ${getWorkspaceSkillToolIds().join(', ')}`)
22
+ .option('--json', 'Output as JSON')
23
+ .option('--no-interactive', 'Disable prompts')
24
+ .action(async (options) => {
25
+ await workspaceCommand.setup(options);
26
+ });
27
+ workspace
28
+ .command('list')
29
+ .description('List known OpenSpec workspaces')
30
+ .option('--json', 'Output as JSON')
31
+ .action(async (options) => {
32
+ await workspaceCommand.list(options);
33
+ });
34
+ workspace
35
+ .command('ls')
36
+ .description('List known OpenSpec workspaces')
37
+ .option('--json', 'Output as JSON')
38
+ .action(async (options) => {
39
+ await workspaceCommand.list(options);
40
+ });
41
+ addWorkspaceSelectionOptions(workspace
42
+ .command('link [nameOrPath] [path]')
43
+ .description('Link an existing repo or folder to a workspace')).action(async (nameOrPath, linkPath, options) => {
44
+ await workspaceCommand.link(nameOrPath, linkPath, options);
45
+ });
46
+ addWorkspaceSelectionOptions(workspace
47
+ .command('relink <name> <path>')
48
+ .description('Update the local path for an existing workspace link')).action(async (linkName, linkPath, options) => {
49
+ await workspaceCommand.relink(linkName, linkPath, options);
50
+ });
51
+ addWorkspaceSelectionOptions(workspace
52
+ .command('doctor')
53
+ .description('Check what a workspace can resolve on this machine')).action(async (options) => {
54
+ await workspaceCommand.doctor(options);
55
+ });
56
+ workspace
57
+ .command('update [name]')
58
+ .description('Refresh workspace-local OpenSpec guidance and agent skills')
59
+ .option('--workspace <name>', 'Workspace name from known local workspace views')
60
+ .option('--tools <tools>', `Select agents for workspace skills. Use "all", "none", or a comma-separated list of: ${getWorkspaceSkillToolIds().join(', ')}. Global profile selects workflows; --tools selects agents.`)
61
+ .option('--json', 'Output as JSON')
62
+ .option('--no-interactive', 'Disable prompts')
63
+ .action(async (name, options) => {
64
+ await workspaceCommand.update(name, options);
65
+ });
66
+ workspace
67
+ .command('open [name]')
68
+ .description('Open a workspace in an agent or VS Code editor')
69
+ .option('--workspace <name>', 'Workspace name from known local workspace views')
70
+ .option('--initiative <id>', 'Open an initiative as a local workspace view')
71
+ .option('--store <id>', 'Context store id for --initiative')
72
+ .option('--store-path <path>', 'Existing local context store root for --initiative')
73
+ .option('--agent <tool>', 'Use an agent for this session: codex-cli, claude, or github-copilot')
74
+ .option('--editor', 'Open the workspace in VS Code editor mode')
75
+ .option('--prepare-only', 'Unsupported: preview surfaces belong to a future context/query command')
76
+ .option('--json', 'Output generated workspace view context as JSON after launch')
77
+ .option('--change <id>', 'Unsupported: change-scoped open belongs to future workspace change planning')
78
+ .option('--no-interactive', 'Disable prompts')
79
+ .action(async (name, options) => {
80
+ await workspaceCommand.open(name, options);
81
+ });
82
+ // Intentionally no public `workspace create` command in this slice.
83
+ }
84
+ //# sourceMappingURL=registration.js.map
@@ -0,0 +1,8 @@
1
+ import { type WorkspaceRegistryEntry } from '../../core/workspace/index.js';
2
+ import { SelectedWorkspace, WorkspaceSelectionOptions } from './types.js';
3
+ export declare function selectedWorkspaceFromEntry(entry: WorkspaceRegistryEntry): SelectedWorkspace;
4
+ export declare function selectedWorkspaceFromRoot(currentWorkspaceRoot: string, entries: WorkspaceRegistryEntry[]): Promise<SelectedWorkspace>;
5
+ export declare function selectWorkspaceForCommand(options: WorkspaceSelectionOptions, commandName: string, selectionOptions?: {
6
+ preferPositionalName?: boolean;
7
+ }): Promise<SelectedWorkspace>;
8
+ //# sourceMappingURL=selection.d.ts.map
@@ -0,0 +1,104 @@
1
+ import { findWorkspaceRoot, listKnownWorkspaceEntries, readWorkspaceViewState, } from '../../core/workspace/index.js';
2
+ import { FileSystemUtils } from '../../utils/file-system.js';
3
+ import { isInteractive, resolveNoInteractive } from '../../utils/interactive.js';
4
+ import { validateWorkspaceNameForSetup } from './operations.js';
5
+ import { WorkspaceCliError, makeStatus, } from './types.js';
6
+ function normalizeRegistryRootForComparison(workspaceRoot) {
7
+ try {
8
+ return FileSystemUtils.canonicalizeExistingPath(workspaceRoot);
9
+ }
10
+ catch {
11
+ return workspaceRoot;
12
+ }
13
+ }
14
+ function workspaceNotInKnownViewsWarning() {
15
+ return makeStatus('warning', 'workspace_not_in_known_views', 'This workspace is not in the managed local workspace views list.', {
16
+ target: 'workspace.root',
17
+ fix: 'Use openspec workspace list to inspect managed workspace views.',
18
+ });
19
+ }
20
+ function sameWorkspaceRoot(knownRoot, currentWorkspaceRoot) {
21
+ return (knownRoot !== undefined &&
22
+ normalizeRegistryRootForComparison(knownRoot) ===
23
+ normalizeRegistryRootForComparison(currentWorkspaceRoot));
24
+ }
25
+ function findKnownWorkspaceByName(entries, workspaceName) {
26
+ return entries.find((entry) => entry.name === workspaceName);
27
+ }
28
+ export function selectedWorkspaceFromEntry(entry) {
29
+ return {
30
+ name: entry.name,
31
+ root: entry.workspaceRoot,
32
+ status: [],
33
+ unregisteredCurrentWorkspace: false,
34
+ };
35
+ }
36
+ export async function selectedWorkspaceFromRoot(currentWorkspaceRoot, entries) {
37
+ const viewState = await readWorkspaceViewState(currentWorkspaceRoot);
38
+ const knownRoot = findKnownWorkspaceByName(entries, viewState.name)?.workspaceRoot;
39
+ const isKnown = sameWorkspaceRoot(knownRoot, currentWorkspaceRoot);
40
+ return {
41
+ name: viewState.name,
42
+ root: currentWorkspaceRoot,
43
+ status: isKnown ? [] : [workspaceNotInKnownViewsWarning()],
44
+ unregisteredCurrentWorkspace: !isKnown,
45
+ };
46
+ }
47
+ export async function selectWorkspaceForCommand(options, commandName, selectionOptions = {}) {
48
+ const entries = await listKnownWorkspaceEntries();
49
+ if (options.workspace) {
50
+ const workspaceName = validateWorkspaceNameForSetup(options.workspace);
51
+ const entry = findKnownWorkspaceByName(entries, workspaceName);
52
+ if (!entry) {
53
+ throw new WorkspaceCliError(`Unknown OpenSpec workspace '${workspaceName}'.`, 'workspace_not_found', {
54
+ target: 'workspace.name',
55
+ fix: 'Run openspec workspace list to see known workspaces.',
56
+ });
57
+ }
58
+ return selectedWorkspaceFromEntry(entry);
59
+ }
60
+ const currentWorkspaceRoot = await findWorkspaceRoot(process.cwd());
61
+ if (currentWorkspaceRoot) {
62
+ return selectedWorkspaceFromRoot(currentWorkspaceRoot, entries);
63
+ }
64
+ if (entries.length === 0) {
65
+ throw new WorkspaceCliError("No known OpenSpec workspaces. Run 'openspec workspace setup' first.\nAfter at least one workspace is known locally, you can also pass --workspace <name>.", 'no_known_workspaces', {
66
+ target: 'workspace.name',
67
+ fix: 'openspec workspace setup',
68
+ });
69
+ }
70
+ if (entries.length === 1) {
71
+ const [entry] = entries;
72
+ return selectedWorkspaceFromEntry(entry);
73
+ }
74
+ if (options.json || resolveNoInteractive(options) || !isInteractive(options)) {
75
+ const knownNames = entries.map((entry) => entry.name).join(', ');
76
+ const usesPositionalName = selectionOptions.preferPositionalName;
77
+ const fix = usesPositionalName
78
+ ? `openspec workspace ${commandName} <name>`
79
+ : `openspec workspace ${commandName} --workspace <name>`;
80
+ throw new WorkspaceCliError(usesPositionalName
81
+ ? `Multiple OpenSpec workspaces are known. Known workspaces: ${knownNames}. Pass a workspace name.`
82
+ : `Multiple OpenSpec workspaces are known. Known workspaces: ${knownNames}. Pass --workspace <name>.`, 'workspace_selection_ambiguous', {
83
+ target: 'workspace.name',
84
+ fix,
85
+ });
86
+ }
87
+ const { select } = await import('@inquirer/prompts');
88
+ const selectedName = await select({
89
+ message: 'Select workspace:',
90
+ choices: entries.map((entry) => ({
91
+ name: `${entry.name} (${entry.workspaceRoot})`,
92
+ value: entry.name,
93
+ })),
94
+ });
95
+ const selectedEntry = findKnownWorkspaceByName(entries, selectedName);
96
+ if (!selectedEntry) {
97
+ throw new WorkspaceCliError(`Unknown OpenSpec workspace '${selectedName}'.`, 'workspace_not_found', {
98
+ target: 'workspace.name',
99
+ fix: 'Run openspec workspace list to see known workspaces.',
100
+ });
101
+ }
102
+ return selectedWorkspaceFromEntry(selectedEntry);
103
+ }
104
+ //# sourceMappingURL=selection.js.map
@@ -0,0 +1,13 @@
1
+ export interface PromptSetupLinksOptions {
2
+ heading?: string;
3
+ intro?: string;
4
+ allowEmpty?: boolean;
5
+ emptyName?: string;
6
+ emptyShort?: string;
7
+ emptyDescription?: string;
8
+ finishName?: string;
9
+ finishShort?: string;
10
+ finishDescription?: string;
11
+ }
12
+ export declare function promptSetupLinks(options?: PromptSetupLinksOptions): Promise<Record<string, string>>;
13
+ //# sourceMappingURL=setup-prompts.d.ts.map
@@ -0,0 +1,121 @@
1
+ import chalk from 'chalk';
2
+ import * as nodeFs from 'node:fs';
3
+ import * as path from 'node:path';
4
+ import { inferLinkName, resolveExistingDirectory, validateLinkNameForCommand, } from './operations.js';
5
+ import { workspacePromptTheme, workspaceSelectTheme } from './prompt-theme.js';
6
+ import { asErrorMessage } from './types.js';
7
+ const fs = nodeFs;
8
+ async function promptExistingPath(message, defaultPath) {
9
+ const { input } = await import('@inquirer/prompts');
10
+ const pathInput = await input({
11
+ message,
12
+ default: defaultPath,
13
+ prefill: defaultPath ? 'editable' : undefined,
14
+ required: true,
15
+ theme: workspacePromptTheme,
16
+ validate(value) {
17
+ const resolvedPath = path.isAbsolute(value)
18
+ ? path.resolve(value)
19
+ : path.resolve(process.cwd(), value);
20
+ return fs.existsSync(resolvedPath) && fs.statSync(resolvedPath).isDirectory()
21
+ ? true
22
+ : 'Enter an existing repo or folder path.';
23
+ },
24
+ });
25
+ return resolveExistingDirectory(pathInput);
26
+ }
27
+ async function promptLinkName(existingLinks) {
28
+ const { input } = await import('@inquirer/prompts');
29
+ return input({
30
+ message: 'Link name:',
31
+ required: true,
32
+ theme: workspacePromptTheme,
33
+ validate(value) {
34
+ try {
35
+ validateLinkNameForCommand(value);
36
+ }
37
+ catch (error) {
38
+ return asErrorMessage(error);
39
+ }
40
+ if (existingLinks[value]) {
41
+ return `Link name '${value}' is already linked to ${existingLinks[value]}.`;
42
+ }
43
+ return true;
44
+ },
45
+ });
46
+ }
47
+ export async function promptSetupLinks(options = {}) {
48
+ const { select } = await import('@inquirer/prompts');
49
+ const links = {};
50
+ const heading = options.heading ?? '[2/5] Link repos or folders';
51
+ const intro = options.intro ?? 'Start with the current directory, or enter another repo path.';
52
+ console.log('');
53
+ console.log(chalk.bold(heading));
54
+ console.log(chalk.dim(intro));
55
+ console.log('');
56
+ while (true) {
57
+ const linkCount = Object.keys(links).length;
58
+ if (linkCount === 0 && options.allowEmpty) {
59
+ const firstAction = await select({
60
+ message: 'Continue',
61
+ default: 'finish',
62
+ choices: [
63
+ {
64
+ name: options.emptyName ?? options.finishName ?? 'Create workspace files',
65
+ short: options.emptyShort ?? options.finishShort ?? 'Create workspace files',
66
+ value: 'finish',
67
+ description: options.emptyDescription ?? 'Create the workspace without linked repos or folders',
68
+ },
69
+ {
70
+ name: 'Add a repo or folder',
71
+ short: 'Add repo',
72
+ value: 'add',
73
+ description: 'Include local implementation context in this workspace',
74
+ },
75
+ ],
76
+ theme: workspaceSelectTheme,
77
+ });
78
+ if (firstAction === 'finish') {
79
+ return links;
80
+ }
81
+ }
82
+ const resolvedPath = await promptExistingPath(linkCount === 0 ? 'Repo or folder path:' : 'Another repo or folder path:', linkCount === 0 ? '.' : undefined);
83
+ let linkName = inferLinkName(resolvedPath);
84
+ try {
85
+ validateLinkNameForCommand(linkName);
86
+ }
87
+ catch {
88
+ linkName = await promptLinkName(links);
89
+ }
90
+ if (links[linkName]) {
91
+ console.log(`Link name '${linkName}' is already linked to ${links[linkName]}.`);
92
+ linkName = await promptLinkName(links);
93
+ }
94
+ links[linkName] = resolvedPath;
95
+ console.log(chalk.green(`Added link '${linkName}'`));
96
+ console.log(chalk.dim(` ${resolvedPath}`));
97
+ const nextAction = await select({
98
+ message: 'Continue',
99
+ default: 'finish',
100
+ choices: [
101
+ {
102
+ name: options.finishName ?? 'Create workspace files',
103
+ short: options.finishShort ?? 'Create workspace files',
104
+ value: 'finish',
105
+ description: options.finishDescription ?? 'Run a workspace check after setup',
106
+ },
107
+ {
108
+ name: 'Add another repo or folder',
109
+ short: 'Add another',
110
+ value: 'add',
111
+ description: 'Include another local directory in this workspace',
112
+ },
113
+ ],
114
+ theme: workspaceSelectTheme,
115
+ });
116
+ if (nextAction === 'finish') {
117
+ return links;
118
+ }
119
+ }
120
+ }
121
+ //# sourceMappingURL=setup-prompts.js.map
@@ -0,0 +1,103 @@
1
+ import type { ContextStoreSelector } from '../../core/context-store/index.js';
2
+ export type StatusSeverity = 'error' | 'warning';
3
+ export interface WorkspaceStatus {
4
+ severity: StatusSeverity;
5
+ code: string;
6
+ message: string;
7
+ target?: string;
8
+ fix?: string;
9
+ details?: Record<string, unknown>;
10
+ }
11
+ export interface WorkspaceLinkOutput {
12
+ name: string;
13
+ path: string | null;
14
+ repo_specs_path?: string | null;
15
+ status: WorkspaceStatus[];
16
+ }
17
+ export interface WorkspaceContextOutput {
18
+ store: string;
19
+ initiative: string;
20
+ store_selector: ContextStoreSelector;
21
+ }
22
+ export interface WorkspaceOutput {
23
+ name: string;
24
+ root: string;
25
+ planning_path: string;
26
+ state_path?: string;
27
+ context?: WorkspaceContextOutput | null;
28
+ links: WorkspaceLinkOutput[];
29
+ status: WorkspaceStatus[];
30
+ }
31
+ export interface WorkspaceListOutput {
32
+ name: string;
33
+ root: string;
34
+ context?: WorkspaceContextOutput | null;
35
+ links: WorkspaceLinkOutput[];
36
+ status: WorkspaceStatus[];
37
+ }
38
+ export interface WorkspaceSetupOptions {
39
+ name?: string;
40
+ link?: string[];
41
+ opener?: string;
42
+ tools?: string;
43
+ json?: boolean;
44
+ noInteractive?: boolean;
45
+ interactive?: boolean;
46
+ }
47
+ export interface WorkspaceSelectionOptions {
48
+ workspace?: string;
49
+ json?: boolean;
50
+ noInteractive?: boolean;
51
+ interactive?: boolean;
52
+ }
53
+ export type WorkspaceLinkOptions = WorkspaceSelectionOptions;
54
+ export interface WorkspaceUpdateOptions extends WorkspaceSelectionOptions {
55
+ tools?: string;
56
+ force?: boolean;
57
+ }
58
+ export interface WorkspaceOpenOptions extends WorkspaceSelectionOptions {
59
+ agent?: string;
60
+ editor?: boolean;
61
+ prepareOnly?: boolean;
62
+ change?: string;
63
+ initiative?: string;
64
+ store?: string;
65
+ storePath?: string;
66
+ }
67
+ export interface WorkspaceListOptions {
68
+ json?: boolean;
69
+ }
70
+ export interface SelectedWorkspace {
71
+ name: string;
72
+ root: string;
73
+ status: WorkspaceStatus[];
74
+ unregisteredCurrentWorkspace: boolean;
75
+ }
76
+ export interface WorkspaceLinkMutationPayload {
77
+ workspace: WorkspaceOutput;
78
+ link: {
79
+ name: string;
80
+ path: string;
81
+ status: WorkspaceStatus[];
82
+ };
83
+ status: WorkspaceStatus[];
84
+ }
85
+ export declare class WorkspaceCliError extends Error {
86
+ readonly status: WorkspaceStatus;
87
+ constructor(message: string, code: string, options?: {
88
+ target?: string;
89
+ fix?: string;
90
+ details?: Record<string, unknown>;
91
+ });
92
+ }
93
+ export declare function makeStatus(severity: StatusSeverity, code: string, message: string, options?: {
94
+ target?: string;
95
+ fix?: string;
96
+ details?: Record<string, unknown>;
97
+ }): WorkspaceStatus;
98
+ export declare function asErrorMessage(error: unknown): string;
99
+ export declare function asStatus(error: unknown): WorkspaceStatus;
100
+ export declare function appendStatus<T extends {
101
+ status: WorkspaceStatus[];
102
+ }>(payload: T, status: WorkspaceStatus): T;
103
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1,36 @@
1
+ export class WorkspaceCliError extends Error {
2
+ status;
3
+ constructor(message, code, options = {}) {
4
+ super(message);
5
+ this.status = {
6
+ severity: 'error',
7
+ code,
8
+ message,
9
+ ...options,
10
+ };
11
+ }
12
+ }
13
+ export function makeStatus(severity, code, message, options = {}) {
14
+ return {
15
+ severity,
16
+ code,
17
+ message,
18
+ ...options,
19
+ };
20
+ }
21
+ export function asErrorMessage(error) {
22
+ return error instanceof Error ? error.message : String(error);
23
+ }
24
+ export function asStatus(error) {
25
+ if (error instanceof WorkspaceCliError) {
26
+ return error.status;
27
+ }
28
+ return makeStatus('error', 'workspace_error', asErrorMessage(error));
29
+ }
30
+ export function appendStatus(payload, status) {
31
+ return {
32
+ ...payload,
33
+ status: [...payload.status, status],
34
+ };
35
+ }
36
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1,5 @@
1
+ import { Command } from 'commander';
2
+ import { WorkspaceUpdateOptions } from './workspace/types.js';
3
+ export declare function runWorkspaceUpdate(positionalName: string | undefined, options?: WorkspaceUpdateOptions): Promise<void>;
4
+ export declare function registerWorkspaceCommand(program: Command): void;
5
+ //# sourceMappingURL=workspace.d.ts.map