@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,249 @@
1
+ import { InitiativeResolutionError, resolveInitiativeViewReference, resolveSelectedInitiativeViewReference, } from '../../core/collections/initiatives/index.js';
2
+ import { createPathContextStoreBinding, createRegisteredContextStoreBinding, formatContextStoreBinding, resolveContextStoreBinding, } from '../../core/context-store/index.js';
3
+ import { createWorkspaceInitiativeContext, getWorkspaceContextInitiativeId, getWorkspaceOpenerLabel, } from '../../core/workspace/index.js';
4
+ import { isInteractive, resolveNoInteractive } from '../../utils/interactive.js';
5
+ import { assertWorkspaceOpenerAvailable, buildWorkspaceOpenCommandForState, readWorkspaceOpenState, } from './open.js';
6
+ import { selectOrCreateWorkspaceForInitiativeOpen, } from './operations.js';
7
+ import { selectWorkspaceOpenTarget } from './open-target-selection.js';
8
+ import { WorkspaceCliError, asErrorMessage, } from './types.js';
9
+ import { resolveWorkspaceOpenOpener, resolveWorkspaceOpenOpenerOverride, } from './opener-selection.js';
10
+ import { promptSetupLinks } from './setup-prompts.js';
11
+ export function assertWorkspaceOpenSupportedOptions(options) {
12
+ if (!options.initiative && (options.store || options.storePath)) {
13
+ throw new WorkspaceCliError('workspace open accepts --store or --store-path only with --initiative.', 'workspace_open_store_without_initiative', {
14
+ target: 'workspace.initiative',
15
+ fix: 'Use openspec workspace open --initiative <id> --store <store>.',
16
+ });
17
+ }
18
+ if (options.prepareOnly) {
19
+ throw new WorkspaceCliError('workspace open supports launching through a selected opener; preview output is reserved for a future context/query surface.', 'workspace_open_prepare_only_unsupported', {
20
+ target: 'workspace.open',
21
+ fix: 'Run openspec workspace open with --agent <tool> or --editor.',
22
+ });
23
+ }
24
+ if (options.change) {
25
+ throw new WorkspaceCliError('workspace open currently supports root workspace open only; change-scoped open belongs to future workspace change planning.', 'workspace_open_change_unsupported', {
26
+ target: 'workspace.change',
27
+ fix: 'Open the root workspace, then start implementation from an explicit change workflow.',
28
+ });
29
+ }
30
+ }
31
+ function resolveOpenWorkspaceName(positionalName, options) {
32
+ if (positionalName && options.workspace && positionalName !== options.workspace) {
33
+ throw new WorkspaceCliError(`Conflicting workspace selectors: positional '${positionalName}' and --workspace '${options.workspace}'.`, 'workspace_selection_conflict', {
34
+ target: 'workspace.name',
35
+ fix: 'Use either the positional workspace name or --workspace with the same value.',
36
+ });
37
+ }
38
+ return positionalName ?? options.workspace;
39
+ }
40
+ function initiativeErrorAsWorkspaceError(error) {
41
+ if (error instanceof InitiativeResolutionError) {
42
+ return new WorkspaceCliError(error.message, error.code, {
43
+ target: error.target,
44
+ fix: error.fix,
45
+ details: error.details,
46
+ });
47
+ }
48
+ return new WorkspaceCliError(asErrorMessage(error), 'initiative_error');
49
+ }
50
+ async function resolveWorkspaceOpenInitiative(options) {
51
+ if (!options.initiative) {
52
+ return null;
53
+ }
54
+ try {
55
+ return await resolveInitiativeViewReference(options.initiative, {
56
+ store: options.store,
57
+ storePath: options.storePath,
58
+ });
59
+ }
60
+ catch (error) {
61
+ throw initiativeErrorAsWorkspaceError(error);
62
+ }
63
+ }
64
+ async function resolveStoredWorkspaceInitiative(context) {
65
+ const initiativeId = getWorkspaceContextInitiativeId(context);
66
+ try {
67
+ const resolvedStore = await resolveContextStoreBinding(context.store);
68
+ const selected = {
69
+ id: resolvedStore.id,
70
+ root: resolvedStore.root,
71
+ source: resolvedStore.source,
72
+ };
73
+ const initiative = await resolveSelectedInitiativeViewReference(selected, initiativeId);
74
+ return {
75
+ initiative,
76
+ warnings: resolvedStore.warnings.map(contextStoreBindingWarningToStatus),
77
+ };
78
+ }
79
+ catch (error) {
80
+ if (error instanceof InitiativeResolutionError) {
81
+ throw initiativeErrorAsWorkspaceError(error);
82
+ }
83
+ throw new WorkspaceCliError(`Workspace context store '${formatContextStoreBinding(context.store)}' could not be read: ${asErrorMessage(error)}`, 'workspace_context_store_unavailable', {
84
+ target: 'workspace.context.store',
85
+ fix: context.store.selector.kind === 'registry'
86
+ ? 'openspec context-store doctor'
87
+ : 'Check the path in .openspec-workspace/view.yaml.',
88
+ });
89
+ }
90
+ }
91
+ function contextStoreBindingWarningToStatus(warning) {
92
+ return {
93
+ severity: 'warning',
94
+ code: warning.code,
95
+ message: warning.message,
96
+ target: warning.target ? `workspace.context.store.${warning.target}` : 'workspace.context.store',
97
+ ...(warning.fix ? { fix: warning.fix } : {}),
98
+ };
99
+ }
100
+ function contextStoreBindingFromInitiative(initiative) {
101
+ return initiative.storeSource === 'path'
102
+ ? createPathContextStoreBinding({
103
+ id: initiative.store,
104
+ path: initiative.storeRoot,
105
+ })
106
+ : createRegisteredContextStoreBinding(initiative.store);
107
+ }
108
+ function toWorkspaceOpenResolvedContext(initiative) {
109
+ return {
110
+ contextStore: {
111
+ id: initiative.store,
112
+ root: initiative.storeRoot,
113
+ },
114
+ initiative: {
115
+ id: initiative.id,
116
+ title: initiative.title,
117
+ root: initiative.root,
118
+ metadataPath: initiative.metadataPath,
119
+ storePath: initiative.storePath,
120
+ },
121
+ };
122
+ }
123
+ function buildSkippedRootWarnings(skipped) {
124
+ return skipped.map((link) => {
125
+ const location = link.path ?? '(no local path recorded)';
126
+ return {
127
+ severity: 'warning',
128
+ code: 'workspace_open_link_skipped',
129
+ message: `Skipped linked repo or folder '${link.name}' because ${location} is not available.`,
130
+ target: `links.${link.name}.path`,
131
+ fix: `openspec workspace relink ${link.name} /path/to/${link.name}`,
132
+ };
133
+ });
134
+ }
135
+ export async function prepareWorkspaceOpen(positionalName, options) {
136
+ assertWorkspaceOpenSupportedOptions(options);
137
+ const workspaceName = resolveOpenWorkspaceName(positionalName, options);
138
+ const openerOverride = resolveWorkspaceOpenOpenerOverride(options);
139
+ const requestedInitiative = await resolveWorkspaceOpenInitiative(options);
140
+ const target = requestedInitiative
141
+ ? { kind: 'initiative', initiative: requestedInitiative, status: [] }
142
+ : await selectWorkspaceOpenTarget(workspaceName, options);
143
+ const interactiveCreate = target.kind === 'initiative'
144
+ && !options.json
145
+ && !resolveNoInteractive(options)
146
+ && isInteractive(options);
147
+ const baseSelected = target.kind === 'initiative'
148
+ ? (await selectOrCreateWorkspaceForInitiativeOpen({
149
+ workspaceName,
150
+ context: createWorkspaceInitiativeContext(contextStoreBindingFromInitiative(target.initiative), target.initiative.id),
151
+ preferredOpener: openerOverride,
152
+ linksForNewWorkspace: interactiveCreate
153
+ ? () => promptSetupLinks({
154
+ heading: 'Link repos or folders for this workspace',
155
+ intro: 'Choose local repos or folders to include when opening this initiative, or create the view without links for now.',
156
+ allowEmpty: true,
157
+ emptyName: 'Create without linked repos',
158
+ emptyShort: 'Create without links',
159
+ emptyDescription: 'Create the local workspace view and add repos or folders later',
160
+ finishName: 'Create and open workspace',
161
+ finishShort: 'Create and open',
162
+ finishDescription: 'Create the local workspace view and continue opening it',
163
+ })
164
+ : undefined,
165
+ })).selected
166
+ : target.selected;
167
+ const selected = {
168
+ ...baseSelected,
169
+ status: [...baseSelected.status, ...target.status],
170
+ };
171
+ const state = await readWorkspaceOpenState(selected);
172
+ const stored = target.kind === 'workspace' && state.viewState.context
173
+ ? await resolveStoredWorkspaceInitiative(state.viewState.context)
174
+ : null;
175
+ const initiative = target.kind === 'initiative' ? target.initiative : stored?.initiative ?? null;
176
+ const resolvedContext = initiative ? toWorkspaceOpenResolvedContext(initiative) : null;
177
+ const opener = await resolveWorkspaceOpenOpener(state.viewState, options);
178
+ assertWorkspaceOpenerAvailable(opener, state.codeWorkspacePath);
179
+ const buildResult = await buildWorkspaceOpenCommandForState(opener, selected.root, state, resolvedContext);
180
+ return {
181
+ ...buildResult,
182
+ selected,
183
+ opener,
184
+ initiative,
185
+ workspaceContext: state.viewState.context,
186
+ warnings: [
187
+ ...selected.status,
188
+ ...(stored?.warnings ?? []),
189
+ ...buildSkippedRootWarnings(buildResult.skipped),
190
+ ],
191
+ };
192
+ }
193
+ export function buildWorkspaceOpenJsonPayload(prepared) {
194
+ const linkedEditRoots = prepared.openedRoots
195
+ .filter((root) => root.kind === 'link')
196
+ .map((root) => root.path);
197
+ return {
198
+ schema_version: 1,
199
+ workspace: {
200
+ name: prepared.selected.name,
201
+ root: prepared.selected.root,
202
+ },
203
+ context: prepared.initiative
204
+ ? {
205
+ context_store: {
206
+ id: prepared.initiative.store,
207
+ root: prepared.initiative.storeRoot,
208
+ ...(prepared.workspaceContext
209
+ ? { selector: prepared.workspaceContext.store.selector }
210
+ : {}),
211
+ },
212
+ initiative: {
213
+ id: prepared.initiative.id,
214
+ title: prepared.initiative.title,
215
+ root: prepared.initiative.root,
216
+ metadata_path: prepared.initiative.metadataPath,
217
+ store_path: prepared.initiative.storePath,
218
+ },
219
+ }
220
+ : null,
221
+ generated_files: {
222
+ agents: prepared.generated.agentsPath,
223
+ code_workspace: prepared.generated.codeWorkspacePath,
224
+ },
225
+ opened_roots: prepared.openedRoots,
226
+ skipped_roots: prepared.skipped.map((link) => ({
227
+ kind: 'link',
228
+ name: link.name,
229
+ path: link.path,
230
+ reason: link.reason,
231
+ })),
232
+ advisory_edit_boundaries: {
233
+ allowed_edit_roots: linkedEditRoots,
234
+ coordination_roots: prepared.initiative ? [prepared.initiative.root] : [],
235
+ enforcement: 'advisory',
236
+ },
237
+ opener: {
238
+ ...prepared.opener,
239
+ label: getWorkspaceOpenerLabel(prepared.opener),
240
+ },
241
+ launch: {
242
+ attempted: true,
243
+ status: 'succeeded',
244
+ },
245
+ warnings: prepared.warnings,
246
+ status: [],
247
+ };
248
+ }
249
+ //# sourceMappingURL=open-view.js.map
@@ -0,0 +1,37 @@
1
+ import { spawn as nodeSpawn } from 'node:child_process';
2
+ import { WorkspacePreferredOpener, WorkspaceViewState, WorkspaceOpenResolvedContext, WorkspaceOpenSurfaceGeneration, WorkspaceSkippedOpenLink } from '../../core/workspace/index.js';
3
+ import { SelectedWorkspace } from './types.js';
4
+ export declare const WORKSPACE_OPEN_MINIMAL_PROMPT = "Open this OpenSpec workspace.";
5
+ export interface WorkspaceOpenState {
6
+ viewState: WorkspaceViewState;
7
+ codeWorkspacePath: string;
8
+ }
9
+ export interface WorkspaceOpenLaunchCommand {
10
+ executable: string;
11
+ args: string[];
12
+ cwd: string;
13
+ openerLabel: string;
14
+ }
15
+ export type WorkspaceOpenedRoot = {
16
+ kind: 'workspace' | 'initiative' | 'link';
17
+ name?: string;
18
+ path: string;
19
+ };
20
+ export interface WorkspaceOpenCommandBuildResult {
21
+ command: WorkspaceOpenLaunchCommand;
22
+ skipped: WorkspaceSkippedOpenLink[];
23
+ generated: WorkspaceOpenSurfaceGeneration;
24
+ openedRoots: WorkspaceOpenedRoot[];
25
+ }
26
+ export type WorkspaceOpenSpawn = typeof nodeSpawn;
27
+ export interface WorkspaceOpenLaunchOptions {
28
+ spawn?: WorkspaceOpenSpawn;
29
+ isExecutableAvailable?: (executable: string) => boolean;
30
+ stdio?: 'inherit' | 'ignore';
31
+ }
32
+ export declare function readWorkspaceOpenState(selected: SelectedWorkspace): Promise<WorkspaceOpenState>;
33
+ export declare function buildWorkspaceOpenLaunchCommand(opener: WorkspacePreferredOpener, workspaceRoot: string, codeWorkspacePath: string, attachedPaths: string[]): WorkspaceOpenLaunchCommand;
34
+ export declare function assertWorkspaceOpenerAvailable(opener: WorkspacePreferredOpener, codeWorkspacePath: string, isExecutableAvailable?: (executable: string) => boolean): void;
35
+ export declare function buildWorkspaceOpenCommandForState(opener: WorkspacePreferredOpener, workspaceRoot: string, state: WorkspaceOpenState, resolvedContext?: WorkspaceOpenResolvedContext | null): Promise<WorkspaceOpenCommandBuildResult>;
36
+ export declare function launchWorkspaceOpenCommand(command: WorkspaceOpenLaunchCommand, options?: WorkspaceOpenLaunchOptions): Promise<void>;
37
+ //# sourceMappingURL=open.d.ts.map
@@ -0,0 +1,110 @@
1
+ import { createRequire } from 'node:module';
2
+ import { getWorkspaceCodeWorkspacePath, getWorkspaceOpenerExecutable, getWorkspaceOpenerLabel, isWorkspaceExecutableAvailable, readWorkspaceViewState, syncWorkspaceOpenSurface, } from '../../core/workspace/index.js';
3
+ import { WorkspaceCliError, asErrorMessage } from './types.js';
4
+ export const WORKSPACE_OPEN_MINIMAL_PROMPT = 'Open this OpenSpec workspace.';
5
+ const CODEX_CLI_WRITABLE_ROOT_SANDBOX_ARGS = ['--sandbox', 'workspace-write'];
6
+ const require = createRequire(import.meta.url);
7
+ const spawn = require('cross-spawn');
8
+ function isCodexCliOpener(opener) {
9
+ const openerId = opener.id;
10
+ return opener.kind === 'agent' && (openerId === 'codex-cli' || openerId === 'codex');
11
+ }
12
+ export async function readWorkspaceOpenState(selected) {
13
+ const viewState = await readWorkspaceViewState(selected.root);
14
+ return {
15
+ viewState,
16
+ codeWorkspacePath: getWorkspaceCodeWorkspacePath(selected.root, viewState.name),
17
+ };
18
+ }
19
+ export function buildWorkspaceOpenLaunchCommand(opener, workspaceRoot, codeWorkspacePath, attachedPaths) {
20
+ const executable = getWorkspaceOpenerExecutable(opener);
21
+ const openerLabel = getWorkspaceOpenerLabel(opener);
22
+ if (opener.kind === 'editor' || opener.id === 'github-copilot') {
23
+ return {
24
+ executable,
25
+ args: [codeWorkspacePath],
26
+ cwd: workspaceRoot,
27
+ openerLabel,
28
+ };
29
+ }
30
+ return {
31
+ executable,
32
+ args: [
33
+ ...(isCodexCliOpener(opener) && attachedPaths.length > 0
34
+ ? CODEX_CLI_WRITABLE_ROOT_SANDBOX_ARGS
35
+ : []),
36
+ ...attachedPaths.flatMap((linkedPath) => ['--add-dir', linkedPath]),
37
+ WORKSPACE_OPEN_MINIMAL_PROMPT,
38
+ ],
39
+ cwd: workspaceRoot,
40
+ openerLabel,
41
+ };
42
+ }
43
+ export function assertWorkspaceOpenerAvailable(opener, codeWorkspacePath, isExecutableAvailable = isWorkspaceExecutableAvailable) {
44
+ const executable = getWorkspaceOpenerExecutable(opener);
45
+ if (isExecutableAvailable(executable)) {
46
+ return;
47
+ }
48
+ const openerLabel = getWorkspaceOpenerLabel(opener);
49
+ const manualPath = executable === 'code'
50
+ ? ` You can open the workspace file manually: ${codeWorkspacePath}`
51
+ : '';
52
+ throw new WorkspaceCliError(`${openerLabel} requires '${executable}', but '${executable}' was not found on PATH.${manualPath}`, 'workspace_opener_unavailable', {
53
+ target: 'workspace.opener',
54
+ fix: `Install '${executable}' or choose another opener.`,
55
+ });
56
+ }
57
+ export async function buildWorkspaceOpenCommandForState(opener, workspaceRoot, state, resolvedContext) {
58
+ const openSurface = await syncWorkspaceOpenSurface(workspaceRoot, state.viewState, resolvedContext);
59
+ const openedRoots = [
60
+ { kind: 'workspace', path: workspaceRoot },
61
+ ...(resolvedContext
62
+ ? [
63
+ {
64
+ kind: 'initiative',
65
+ name: resolvedContext.initiative.id,
66
+ path: resolvedContext.initiative.root,
67
+ },
68
+ ]
69
+ : []),
70
+ ...openSurface.links.map((link) => ({
71
+ kind: 'link',
72
+ name: link.name,
73
+ path: link.path,
74
+ })),
75
+ ];
76
+ return {
77
+ command: buildWorkspaceOpenLaunchCommand(opener, workspaceRoot, state.codeWorkspacePath, openedRoots
78
+ .filter((root) => root.kind !== 'workspace')
79
+ .map((root) => root.path)),
80
+ skipped: openSurface.skipped,
81
+ generated: openSurface.generated,
82
+ openedRoots,
83
+ };
84
+ }
85
+ export async function launchWorkspaceOpenCommand(command, options = {}) {
86
+ const spawnCommand = options.spawn ?? spawn;
87
+ await new Promise((resolve, reject) => {
88
+ const child = spawnCommand(command.executable, command.args, {
89
+ cwd: command.cwd,
90
+ stdio: options.stdio ?? 'inherit',
91
+ shell: false,
92
+ });
93
+ child.on('error', (error) => {
94
+ reject(new WorkspaceCliError(`Could not launch ${command.openerLabel}: ${asErrorMessage(error)}`, 'workspace_opener_launch_failed', {
95
+ target: 'workspace.opener',
96
+ }));
97
+ });
98
+ child.on('close', (code, signal) => {
99
+ if (code === 0) {
100
+ resolve();
101
+ return;
102
+ }
103
+ const reason = signal ? `signal ${signal}` : `exit code ${code}`;
104
+ reject(new WorkspaceCliError(`${command.openerLabel} exited with ${reason}.`, 'workspace_opener_launch_failed', {
105
+ target: 'workspace.opener',
106
+ }));
107
+ });
108
+ });
109
+ }
110
+ //# sourceMappingURL=open.js.map
@@ -0,0 +1,11 @@
1
+ import { WorkspacePreferredOpener } from '../../core/workspace/index.js';
2
+ import { WorkspaceOpenOptions } from './types.js';
3
+ export declare function promptPreferredOpener(message: string, openerChoices?: import("../../core/workspace/openers.js").WorkspaceOpenerChoice[]): Promise<WorkspacePreferredOpener>;
4
+ export declare function parseSetupOpenerOption(opener: string | undefined): WorkspacePreferredOpener | undefined;
5
+ export declare function parseWorkspaceAgentOverride(agent: string): WorkspacePreferredOpener;
6
+ export declare function getPreferredWorkspaceSkillAgentId(preferredOpener: WorkspacePreferredOpener | undefined): string | null;
7
+ export declare function resolveWorkspaceOpenOpenerOverride(options: WorkspaceOpenOptions): WorkspacePreferredOpener | undefined;
8
+ export declare function resolveWorkspaceOpenOpener(localState: {
9
+ preferred_opener?: WorkspacePreferredOpener;
10
+ }, options: WorkspaceOpenOptions): Promise<WorkspacePreferredOpener>;
11
+ //# sourceMappingURL=opener-selection.d.ts.map
@@ -0,0 +1,98 @@
1
+ import { getDefaultWorkspaceOpenerChoiceValue, getWorkspaceSkillToolIds, listWorkspaceOpenerChoices, parseWorkspacePreferredOpenerValue, } from '../../core/workspace/index.js';
2
+ import { isInteractive, resolveNoInteractive } from '../../utils/interactive.js';
3
+ import { WorkspaceCliError, asErrorMessage } from './types.js';
4
+ import { workspaceSelectTheme } from './prompt-theme.js';
5
+ function formatOpenerChoiceName(choice) {
6
+ return choice.unavailableNote ? `${choice.label} (${choice.unavailableNote})` : choice.label;
7
+ }
8
+ export async function promptPreferredOpener(message, openerChoices = listWorkspaceOpenerChoices()) {
9
+ const { select } = await import('@inquirer/prompts');
10
+ const selectedValue = await select({
11
+ message,
12
+ default: getDefaultWorkspaceOpenerChoiceValue(openerChoices),
13
+ choices: openerChoices.map((choice) => ({
14
+ name: formatOpenerChoiceName(choice),
15
+ short: choice.label,
16
+ value: choice.value,
17
+ description: choice.unavailableNote ?? `Use ${choice.label}`,
18
+ })),
19
+ theme: workspaceSelectTheme,
20
+ });
21
+ return parseWorkspacePreferredOpenerValue(selectedValue);
22
+ }
23
+ export function parseSetupOpenerOption(opener) {
24
+ if (!opener) {
25
+ return undefined;
26
+ }
27
+ try {
28
+ return parseWorkspacePreferredOpenerValue(opener);
29
+ }
30
+ catch (error) {
31
+ throw new WorkspaceCliError(asErrorMessage(error), 'unsupported_workspace_opener', {
32
+ target: 'workspace.opener',
33
+ fix: 'Use --opener codex-cli, --opener claude, --opener github-copilot, or --opener editor.',
34
+ });
35
+ }
36
+ }
37
+ export function parseWorkspaceAgentOverride(agent) {
38
+ let opener = null;
39
+ try {
40
+ opener = parseWorkspacePreferredOpenerValue(agent);
41
+ }
42
+ catch {
43
+ opener = null;
44
+ }
45
+ if (!opener || opener.kind !== 'agent') {
46
+ throw new WorkspaceCliError(`Unsupported workspace agent '${agent}'. Supported agents: codex-cli, claude, github-copilot.`, 'unsupported_workspace_agent', {
47
+ target: 'workspace.opener',
48
+ fix: 'Use --agent codex-cli, --agent claude, or --agent github-copilot.',
49
+ });
50
+ }
51
+ return opener;
52
+ }
53
+ export function getPreferredWorkspaceSkillAgentId(preferredOpener) {
54
+ if (!preferredOpener || preferredOpener.kind !== 'agent') {
55
+ return null;
56
+ }
57
+ const toolId = preferredOpener.id === 'codex-cli' ? 'codex' : preferredOpener.id;
58
+ return getWorkspaceSkillToolIds().includes(toolId) ? toolId : null;
59
+ }
60
+ export function resolveWorkspaceOpenOpenerOverride(options) {
61
+ if (options.agent && options.editor) {
62
+ throw new WorkspaceCliError('workspace open accepts either --agent <tool> or --editor, not both.', 'workspace_opener_conflict', {
63
+ target: 'workspace.opener',
64
+ fix: 'Choose one opener override.',
65
+ });
66
+ }
67
+ if (options.agent) {
68
+ return parseWorkspaceAgentOverride(options.agent);
69
+ }
70
+ if (options.editor) {
71
+ return parseWorkspacePreferredOpenerValue('editor');
72
+ }
73
+ return undefined;
74
+ }
75
+ export async function resolveWorkspaceOpenOpener(localState, options) {
76
+ const override = resolveWorkspaceOpenOpenerOverride(options);
77
+ if (override) {
78
+ return override;
79
+ }
80
+ if (localState.preferred_opener) {
81
+ return localState.preferred_opener;
82
+ }
83
+ if (!resolveNoInteractive(options) && isInteractive(options)) {
84
+ const openerChoices = listWorkspaceOpenerChoices().filter((choice) => choice.available);
85
+ if (openerChoices.length === 0) {
86
+ throw new WorkspaceCliError('No supported workspace opener is available on PATH.', 'workspace_no_available_openers', {
87
+ target: 'workspace.opener',
88
+ fix: "Install VS Code ('code'), codex-cli ('codex'), or Claude ('claude'), then retry.",
89
+ });
90
+ }
91
+ return promptPreferredOpener('Open with:', openerChoices);
92
+ }
93
+ throw new WorkspaceCliError('This workspace does not have a preferred opener yet.', 'workspace_opener_unset', {
94
+ target: 'workspace.opener',
95
+ fix: 'Pass --agent <tool> or --editor, or run workspace setup interactively to choose a default opener.',
96
+ });
97
+ }
98
+ //# sourceMappingURL=opener-selection.js.map
@@ -0,0 +1,29 @@
1
+ import { WorkspacePreferredOpener, WorkspaceRegistryEntry, WorkspaceContextState, WorkspaceViewState } from '../../core/workspace/index.js';
2
+ import { SelectedWorkspace, WorkspaceLinkMutationPayload, WorkspaceListOutput, WorkspaceOutput, WorkspaceStatus } from './types.js';
3
+ export declare function directoryExists(dirPath: string): Promise<boolean>;
4
+ export declare function resolveExistingDirectory(inputPath: string, cwd?: string): Promise<string>;
5
+ export declare function inferLinkName(absolutePath: string): string;
6
+ export declare function validateWorkspaceNameForSetup(name: string): string;
7
+ export declare function validateLinkNameForCommand(name: string): string;
8
+ export declare function createManagedWorkspace(name: string, links: Record<string, string>, preferredOpener?: WorkspacePreferredOpener, context?: WorkspaceContextState | null, tools?: string[]): Promise<WorkspaceOutput>;
9
+ export declare function parseSetupLinks(linkInputs: string[] | undefined): Promise<Record<string, string>>;
10
+ export declare function loadWorkspaceForList(entry: WorkspaceRegistryEntry): Promise<WorkspaceListOutput>;
11
+ export declare function loadWorkspaceForDoctor(selected: SelectedWorkspace): Promise<{
12
+ workspace: WorkspaceOutput;
13
+ status: WorkspaceStatus[];
14
+ }>;
15
+ export declare function readWorkspaceForMutation(selected: SelectedWorkspace): Promise<WorkspaceViewState>;
16
+ export declare function addWorkspaceLink(selected: SelectedWorkspace, nameOrPath: string, linkPath?: string): Promise<WorkspaceLinkMutationPayload>;
17
+ export declare function updateWorkspaceLink(selected: SelectedWorkspace, linkNameInput: string, linkPath: string): Promise<WorkspaceLinkMutationPayload>;
18
+ export declare function deriveWorkspaceNameForInitiative(initiativeId: string): string;
19
+ export declare function selectOrCreateWorkspaceForInitiativeOpen(input: {
20
+ workspaceName?: string;
21
+ context: WorkspaceContextState;
22
+ preferredOpener?: WorkspacePreferredOpener;
23
+ linksForNewWorkspace?: () => Promise<Record<string, string>>;
24
+ }): Promise<{
25
+ selected: SelectedWorkspace;
26
+ created: boolean;
27
+ state: WorkspaceViewState;
28
+ }>;
29
+ //# sourceMappingURL=operations.d.ts.map