@thiagodiogo/pastelsdd 1.0.0-beta.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 (369) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +3 -0
  3. package/bin/pastelsdd.js +5 -0
  4. package/dist/cli/index.d.ts +5 -0
  5. package/dist/cli/index.js +526 -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 +282 -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-view.d.ts +62 -0
  47. package/dist/commands/workspace/open-view.js +228 -0
  48. package/dist/commands/workspace/open.d.ts +37 -0
  49. package/dist/commands/workspace/open.js +102 -0
  50. package/dist/commands/workspace/opener-selection.d.ts +11 -0
  51. package/dist/commands/workspace/opener-selection.js +93 -0
  52. package/dist/commands/workspace/operations.d.ts +28 -0
  53. package/dist/commands/workspace/operations.js +543 -0
  54. package/dist/commands/workspace/prompt-theme.d.ts +29 -0
  55. package/dist/commands/workspace/prompt-theme.js +24 -0
  56. package/dist/commands/workspace/registration.d.ts +13 -0
  57. package/dist/commands/workspace/registration.js +84 -0
  58. package/dist/commands/workspace/selection.d.ts +6 -0
  59. package/dist/commands/workspace/selection.js +122 -0
  60. package/dist/commands/workspace/types.d.ts +103 -0
  61. package/dist/commands/workspace/types.js +36 -0
  62. package/dist/commands/workspace.d.ts +6 -0
  63. package/dist/commands/workspace.js +678 -0
  64. package/dist/core/archive.d.ts +11 -0
  65. package/dist/core/archive.js +318 -0
  66. package/dist/core/artifact-graph/graph.d.ts +56 -0
  67. package/dist/core/artifact-graph/graph.js +141 -0
  68. package/dist/core/artifact-graph/index.d.ts +9 -0
  69. package/dist/core/artifact-graph/index.js +14 -0
  70. package/dist/core/artifact-graph/instruction-loader.d.ts +183 -0
  71. package/dist/core/artifact-graph/instruction-loader.js +256 -0
  72. package/dist/core/artifact-graph/outputs.d.ts +14 -0
  73. package/dist/core/artifact-graph/outputs.js +39 -0
  74. package/dist/core/artifact-graph/resolver.d.ts +81 -0
  75. package/dist/core/artifact-graph/resolver.js +257 -0
  76. package/dist/core/artifact-graph/schema.d.ts +13 -0
  77. package/dist/core/artifact-graph/schema.js +108 -0
  78. package/dist/core/artifact-graph/state.d.ts +12 -0
  79. package/dist/core/artifact-graph/state.js +31 -0
  80. package/dist/core/artifact-graph/types.d.ts +40 -0
  81. package/dist/core/artifact-graph/types.js +29 -0
  82. package/dist/core/available-tools.d.ts +17 -0
  83. package/dist/core/available-tools.js +43 -0
  84. package/dist/core/change-metadata/index.d.ts +2 -0
  85. package/dist/core/change-metadata/index.js +2 -0
  86. package/dist/core/change-metadata/schema.d.ts +18 -0
  87. package/dist/core/change-metadata/schema.js +28 -0
  88. package/dist/core/change-status-policy.d.ts +50 -0
  89. package/dist/core/change-status-policy.js +70 -0
  90. package/dist/core/collections/index.d.ts +3 -0
  91. package/dist/core/collections/index.js +3 -0
  92. package/dist/core/collections/initiatives/collection.d.ts +4 -0
  93. package/dist/core/collections/initiatives/collection.js +17 -0
  94. package/dist/core/collections/initiatives/index.d.ts +6 -0
  95. package/dist/core/collections/initiatives/index.js +6 -0
  96. package/dist/core/collections/initiatives/operations.d.ts +49 -0
  97. package/dist/core/collections/initiatives/operations.js +175 -0
  98. package/dist/core/collections/initiatives/resolution.d.ts +87 -0
  99. package/dist/core/collections/initiatives/resolution.js +374 -0
  100. package/dist/core/collections/initiatives/schema.d.ts +41 -0
  101. package/dist/core/collections/initiatives/schema.js +134 -0
  102. package/dist/core/collections/initiatives/templates.d.ts +12 -0
  103. package/dist/core/collections/initiatives/templates.js +90 -0
  104. package/dist/core/collections/runtime.d.ts +46 -0
  105. package/dist/core/collections/runtime.js +194 -0
  106. package/dist/core/command-generation/adapters/amazon-q.d.ts +13 -0
  107. package/dist/core/command-generation/adapters/amazon-q.js +26 -0
  108. package/dist/core/command-generation/adapters/antigravity.d.ts +13 -0
  109. package/dist/core/command-generation/adapters/antigravity.js +26 -0
  110. package/dist/core/command-generation/adapters/auggie.d.ts +13 -0
  111. package/dist/core/command-generation/adapters/auggie.js +27 -0
  112. package/dist/core/command-generation/adapters/bob.d.ts +14 -0
  113. package/dist/core/command-generation/adapters/bob.js +45 -0
  114. package/dist/core/command-generation/adapters/claude.d.ts +13 -0
  115. package/dist/core/command-generation/adapters/claude.js +50 -0
  116. package/dist/core/command-generation/adapters/cline.d.ts +14 -0
  117. package/dist/core/command-generation/adapters/cline.js +27 -0
  118. package/dist/core/command-generation/adapters/codebuddy.d.ts +13 -0
  119. package/dist/core/command-generation/adapters/codebuddy.js +28 -0
  120. package/dist/core/command-generation/adapters/codex.d.ts +16 -0
  121. package/dist/core/command-generation/adapters/codex.js +39 -0
  122. package/dist/core/command-generation/adapters/continue.d.ts +13 -0
  123. package/dist/core/command-generation/adapters/continue.js +28 -0
  124. package/dist/core/command-generation/adapters/costrict.d.ts +13 -0
  125. package/dist/core/command-generation/adapters/costrict.js +27 -0
  126. package/dist/core/command-generation/adapters/crush.d.ts +13 -0
  127. package/dist/core/command-generation/adapters/crush.js +30 -0
  128. package/dist/core/command-generation/adapters/cursor.d.ts +14 -0
  129. package/dist/core/command-generation/adapters/cursor.js +44 -0
  130. package/dist/core/command-generation/adapters/factory.d.ts +13 -0
  131. package/dist/core/command-generation/adapters/factory.js +27 -0
  132. package/dist/core/command-generation/adapters/gemini.d.ts +13 -0
  133. package/dist/core/command-generation/adapters/gemini.js +26 -0
  134. package/dist/core/command-generation/adapters/github-copilot.d.ts +13 -0
  135. package/dist/core/command-generation/adapters/github-copilot.js +26 -0
  136. package/dist/core/command-generation/adapters/iflow.d.ts +13 -0
  137. package/dist/core/command-generation/adapters/iflow.js +29 -0
  138. package/dist/core/command-generation/adapters/index.d.ts +32 -0
  139. package/dist/core/command-generation/adapters/index.js +32 -0
  140. package/dist/core/command-generation/adapters/junie.d.ts +13 -0
  141. package/dist/core/command-generation/adapters/junie.js +26 -0
  142. package/dist/core/command-generation/adapters/kilocode.d.ts +14 -0
  143. package/dist/core/command-generation/adapters/kilocode.js +23 -0
  144. package/dist/core/command-generation/adapters/kiro.d.ts +13 -0
  145. package/dist/core/command-generation/adapters/kiro.js +26 -0
  146. package/dist/core/command-generation/adapters/lingma.d.ts +13 -0
  147. package/dist/core/command-generation/adapters/lingma.js +30 -0
  148. package/dist/core/command-generation/adapters/opencode.d.ts +13 -0
  149. package/dist/core/command-generation/adapters/opencode.js +29 -0
  150. package/dist/core/command-generation/adapters/pi.d.ts +18 -0
  151. package/dist/core/command-generation/adapters/pi.js +55 -0
  152. package/dist/core/command-generation/adapters/qoder.d.ts +13 -0
  153. package/dist/core/command-generation/adapters/qoder.js +30 -0
  154. package/dist/core/command-generation/adapters/qwen.d.ts +13 -0
  155. package/dist/core/command-generation/adapters/qwen.js +26 -0
  156. package/dist/core/command-generation/adapters/roocode.d.ts +14 -0
  157. package/dist/core/command-generation/adapters/roocode.js +27 -0
  158. package/dist/core/command-generation/adapters/windsurf.d.ts +14 -0
  159. package/dist/core/command-generation/adapters/windsurf.js +51 -0
  160. package/dist/core/command-generation/generator.d.ts +21 -0
  161. package/dist/core/command-generation/generator.js +27 -0
  162. package/dist/core/command-generation/index.d.ts +22 -0
  163. package/dist/core/command-generation/index.js +24 -0
  164. package/dist/core/command-generation/registry.d.ts +36 -0
  165. package/dist/core/command-generation/registry.js +98 -0
  166. package/dist/core/command-generation/types.d.ts +56 -0
  167. package/dist/core/command-generation/types.js +8 -0
  168. package/dist/core/completions/command-registry.d.ts +3 -0
  169. package/dist/core/completions/command-registry.js +939 -0
  170. package/dist/core/completions/completion-provider.d.ts +71 -0
  171. package/dist/core/completions/completion-provider.js +129 -0
  172. package/dist/core/completions/factory.d.ts +64 -0
  173. package/dist/core/completions/factory.js +75 -0
  174. package/dist/core/completions/generators/bash-generator.d.ts +35 -0
  175. package/dist/core/completions/generators/bash-generator.js +230 -0
  176. package/dist/core/completions/generators/fish-generator.d.ts +32 -0
  177. package/dist/core/completions/generators/fish-generator.js +160 -0
  178. package/dist/core/completions/generators/powershell-generator.d.ts +36 -0
  179. package/dist/core/completions/generators/powershell-generator.js +266 -0
  180. package/dist/core/completions/generators/zsh-generator.d.ts +47 -0
  181. package/dist/core/completions/generators/zsh-generator.js +274 -0
  182. package/dist/core/completions/installers/bash-installer.d.ts +87 -0
  183. package/dist/core/completions/installers/bash-installer.js +318 -0
  184. package/dist/core/completions/installers/fish-installer.d.ts +43 -0
  185. package/dist/core/completions/installers/fish-installer.js +143 -0
  186. package/dist/core/completions/installers/powershell-installer.d.ts +102 -0
  187. package/dist/core/completions/installers/powershell-installer.js +387 -0
  188. package/dist/core/completions/installers/zsh-installer.d.ts +117 -0
  189. package/dist/core/completions/installers/zsh-installer.js +421 -0
  190. package/dist/core/completions/shared-flags.d.ts +12 -0
  191. package/dist/core/completions/shared-flags.js +28 -0
  192. package/dist/core/completions/templates/bash-templates.d.ts +6 -0
  193. package/dist/core/completions/templates/bash-templates.js +30 -0
  194. package/dist/core/completions/templates/fish-templates.d.ts +7 -0
  195. package/dist/core/completions/templates/fish-templates.js +45 -0
  196. package/dist/core/completions/templates/powershell-templates.d.ts +6 -0
  197. package/dist/core/completions/templates/powershell-templates.js +34 -0
  198. package/dist/core/completions/templates/zsh-templates.d.ts +6 -0
  199. package/dist/core/completions/templates/zsh-templates.js +45 -0
  200. package/dist/core/completions/types.d.ts +101 -0
  201. package/dist/core/completions/types.js +2 -0
  202. package/dist/core/config-prompts.d.ts +9 -0
  203. package/dist/core/config-prompts.js +34 -0
  204. package/dist/core/config-schema.d.ts +86 -0
  205. package/dist/core/config-schema.js +213 -0
  206. package/dist/core/config.d.ts +18 -0
  207. package/dist/core/config.js +38 -0
  208. package/dist/core/context-store/binding.d.ts +53 -0
  209. package/dist/core/context-store/binding.js +197 -0
  210. package/dist/core/context-store/errors.d.ts +20 -0
  211. package/dist/core/context-store/errors.js +22 -0
  212. package/dist/core/context-store/foundation.d.ts +54 -0
  213. package/dist/core/context-store/foundation.js +318 -0
  214. package/dist/core/context-store/index.d.ts +6 -0
  215. package/dist/core/context-store/index.js +6 -0
  216. package/dist/core/context-store/operations.d.ts +62 -0
  217. package/dist/core/context-store/operations.js +352 -0
  218. package/dist/core/context-store/registry.d.ts +35 -0
  219. package/dist/core/context-store/registry.js +158 -0
  220. package/dist/core/converters/json-converter.d.ts +6 -0
  221. package/dist/core/converters/json-converter.js +51 -0
  222. package/dist/core/global-config.d.ts +49 -0
  223. package/dist/core/global-config.js +124 -0
  224. package/dist/core/index.d.ts +6 -0
  225. package/dist/core/index.js +7 -0
  226. package/dist/core/init.d.ts +37 -0
  227. package/dist/core/init.js +593 -0
  228. package/dist/core/legacy-cleanup.d.ts +162 -0
  229. package/dist/core/legacy-cleanup.js +514 -0
  230. package/dist/core/list.d.ts +9 -0
  231. package/dist/core/list.js +171 -0
  232. package/dist/core/migration.d.ts +23 -0
  233. package/dist/core/migration.js +108 -0
  234. package/dist/core/parsers/change-parser.d.ts +13 -0
  235. package/dist/core/parsers/change-parser.js +197 -0
  236. package/dist/core/parsers/markdown-parser.d.ts +26 -0
  237. package/dist/core/parsers/markdown-parser.js +227 -0
  238. package/dist/core/parsers/requirement-blocks.d.ts +37 -0
  239. package/dist/core/parsers/requirement-blocks.js +201 -0
  240. package/dist/core/parsers/spec-structure.d.ts +9 -0
  241. package/dist/core/parsers/spec-structure.js +88 -0
  242. package/dist/core/planning-home.d.ts +21 -0
  243. package/dist/core/planning-home.js +108 -0
  244. package/dist/core/profile-sync-drift.d.ts +38 -0
  245. package/dist/core/profile-sync-drift.js +200 -0
  246. package/dist/core/profiles.d.ts +26 -0
  247. package/dist/core/profiles.js +40 -0
  248. package/dist/core/project-config.d.ts +64 -0
  249. package/dist/core/project-config.js +223 -0
  250. package/dist/core/schemas/base.schema.d.ts +13 -0
  251. package/dist/core/schemas/base.schema.js +13 -0
  252. package/dist/core/schemas/change.schema.d.ts +73 -0
  253. package/dist/core/schemas/change.schema.js +31 -0
  254. package/dist/core/schemas/index.d.ts +4 -0
  255. package/dist/core/schemas/index.js +4 -0
  256. package/dist/core/schemas/spec.schema.d.ts +18 -0
  257. package/dist/core/schemas/spec.schema.js +15 -0
  258. package/dist/core/shared/index.d.ts +8 -0
  259. package/dist/core/shared/index.js +8 -0
  260. package/dist/core/shared/skill-generation.d.ts +49 -0
  261. package/dist/core/shared/skill-generation.js +96 -0
  262. package/dist/core/shared/tool-detection.d.ts +71 -0
  263. package/dist/core/shared/tool-detection.js +158 -0
  264. package/dist/core/specs-apply.d.ts +73 -0
  265. package/dist/core/specs-apply.js +392 -0
  266. package/dist/core/styles/palette.d.ts +7 -0
  267. package/dist/core/styles/palette.js +8 -0
  268. package/dist/core/templates/index.d.ts +8 -0
  269. package/dist/core/templates/index.js +9 -0
  270. package/dist/core/templates/skill-templates.d.ts +19 -0
  271. package/dist/core/templates/skill-templates.js +18 -0
  272. package/dist/core/templates/types.d.ts +19 -0
  273. package/dist/core/templates/types.js +5 -0
  274. package/dist/core/templates/workflows/apply-change.d.ts +10 -0
  275. package/dist/core/templates/workflows/apply-change.js +314 -0
  276. package/dist/core/templates/workflows/archive-change.d.ts +10 -0
  277. package/dist/core/templates/workflows/archive-change.js +277 -0
  278. package/dist/core/templates/workflows/bulk-archive-change.d.ts +10 -0
  279. package/dist/core/templates/workflows/bulk-archive-change.js +492 -0
  280. package/dist/core/templates/workflows/continue-change.d.ts +10 -0
  281. package/dist/core/templates/workflows/continue-change.js +234 -0
  282. package/dist/core/templates/workflows/explore.d.ts +10 -0
  283. package/dist/core/templates/workflows/explore.js +459 -0
  284. package/dist/core/templates/workflows/feedback.d.ts +9 -0
  285. package/dist/core/templates/workflows/feedback.js +108 -0
  286. package/dist/core/templates/workflows/ff-change.d.ts +10 -0
  287. package/dist/core/templates/workflows/ff-change.js +200 -0
  288. package/dist/core/templates/workflows/new-change.d.ts +10 -0
  289. package/dist/core/templates/workflows/new-change.js +143 -0
  290. package/dist/core/templates/workflows/onboard.d.ts +10 -0
  291. package/dist/core/templates/workflows/onboard.js +563 -0
  292. package/dist/core/templates/workflows/propose.d.ts +10 -0
  293. package/dist/core/templates/workflows/propose.js +218 -0
  294. package/dist/core/templates/workflows/sync-specs.d.ts +10 -0
  295. package/dist/core/templates/workflows/sync-specs.js +290 -0
  296. package/dist/core/templates/workflows/verify-change.d.ts +10 -0
  297. package/dist/core/templates/workflows/verify-change.js +338 -0
  298. package/dist/core/update.d.ts +82 -0
  299. package/dist/core/update.js +557 -0
  300. package/dist/core/validation/constants.d.ts +34 -0
  301. package/dist/core/validation/constants.js +40 -0
  302. package/dist/core/validation/types.d.ts +18 -0
  303. package/dist/core/validation/types.js +2 -0
  304. package/dist/core/validation/validator.d.ts +33 -0
  305. package/dist/core/validation/validator.js +418 -0
  306. package/dist/core/view.d.ts +8 -0
  307. package/dist/core/view.js +168 -0
  308. package/dist/core/workspace/foundation.d.ts +62 -0
  309. package/dist/core/workspace/foundation.js +274 -0
  310. package/dist/core/workspace/index.d.ts +8 -0
  311. package/dist/core/workspace/index.js +8 -0
  312. package/dist/core/workspace/legacy-state.d.ts +28 -0
  313. package/dist/core/workspace/legacy-state.js +200 -0
  314. package/dist/core/workspace/link-input.d.ts +9 -0
  315. package/dist/core/workspace/link-input.js +32 -0
  316. package/dist/core/workspace/open-surface.d.ts +43 -0
  317. package/dist/core/workspace/open-surface.js +214 -0
  318. package/dist/core/workspace/openers.d.ts +21 -0
  319. package/dist/core/workspace/openers.js +119 -0
  320. package/dist/core/workspace/registry.d.ts +24 -0
  321. package/dist/core/workspace/registry.js +146 -0
  322. package/dist/core/workspace/skills.d.ts +57 -0
  323. package/dist/core/workspace/skills.js +334 -0
  324. package/dist/core/workspace/state-io.d.ts +10 -0
  325. package/dist/core/workspace/state-io.js +119 -0
  326. package/dist/index.d.ts +3 -0
  327. package/dist/index.js +3 -0
  328. package/dist/prompts/searchable-multi-select.d.ts +28 -0
  329. package/dist/prompts/searchable-multi-select.js +159 -0
  330. package/dist/telemetry/config.d.ts +38 -0
  331. package/dist/telemetry/config.js +136 -0
  332. package/dist/telemetry/index.d.ts +31 -0
  333. package/dist/telemetry/index.js +164 -0
  334. package/dist/ui/ascii-patterns.d.ts +16 -0
  335. package/dist/ui/ascii-patterns.js +133 -0
  336. package/dist/ui/welcome-screen.d.ts +10 -0
  337. package/dist/ui/welcome-screen.js +146 -0
  338. package/dist/utils/change-metadata.d.ts +54 -0
  339. package/dist/utils/change-metadata.js +141 -0
  340. package/dist/utils/change-utils.d.ts +71 -0
  341. package/dist/utils/change-utils.js +123 -0
  342. package/dist/utils/command-references.d.ts +18 -0
  343. package/dist/utils/command-references.js +20 -0
  344. package/dist/utils/file-system.d.ts +41 -0
  345. package/dist/utils/file-system.js +301 -0
  346. package/dist/utils/index.d.ts +6 -0
  347. package/dist/utils/index.js +9 -0
  348. package/dist/utils/interactive.d.ts +18 -0
  349. package/dist/utils/interactive.js +21 -0
  350. package/dist/utils/item-discovery.d.ts +4 -0
  351. package/dist/utils/item-discovery.js +72 -0
  352. package/dist/utils/match.d.ts +3 -0
  353. package/dist/utils/match.js +22 -0
  354. package/dist/utils/shell-detection.d.ts +20 -0
  355. package/dist/utils/shell-detection.js +41 -0
  356. package/dist/utils/task-progress.d.ts +8 -0
  357. package/dist/utils/task-progress.js +36 -0
  358. package/package.json +84 -0
  359. package/schemas/spec-driven/schema.yaml +153 -0
  360. package/schemas/spec-driven/templates/design.md +19 -0
  361. package/schemas/spec-driven/templates/proposal.md +23 -0
  362. package/schemas/spec-driven/templates/spec.md +8 -0
  363. package/schemas/spec-driven/templates/tasks.md +9 -0
  364. package/schemas/workspace-planning/schema.yaml +72 -0
  365. package/schemas/workspace-planning/templates/design.md +33 -0
  366. package/schemas/workspace-planning/templates/proposal.md +28 -0
  367. package/schemas/workspace-planning/templates/spec.md +9 -0
  368. package/schemas/workspace-planning/templates/tasks.md +15 -0
  369. package/scripts/postinstall.js +83 -0
@@ -0,0 +1,678 @@
1
+ import chalk from 'chalk';
2
+ import * as nodeFs from 'node:fs';
3
+ import * as path from 'node:path';
4
+ import { createWorkspaceSkillSkippedReport, generateWorkspaceAgentSkills, getWorkspaceSkillCapableTools, getWorkspaceSkillToolIds, getWorkspaceOpenerLabel, parseWorkspaceSkillToolsValue, updateWorkspaceAgentSkills, listKnownWorkspaceEntries, readWorkspaceViewState, syncWorkspaceOpenSurface, writeWorkspaceViewState, } from '../core/workspace/index.js';
5
+ import { isInteractive, resolveNoInteractive } from '../utils/interactive.js';
6
+ import { addWorkspaceLink, createManagedWorkspace, inferLinkName, loadWorkspaceForDoctor, loadWorkspaceForList, parseSetupLinks, readWorkspaceForMutation, resolveExistingDirectory, updateWorkspaceLink, validateLinkNameForCommand, validateWorkspaceNameForSetup, } from './workspace/operations.js';
7
+ import { selectWorkspaceForCommand, selectWorkspaceRootForCommand, } from './workspace/selection.js';
8
+ import { launchWorkspaceOpenCommand, } from './workspace/open.js';
9
+ import { buildWorkspaceOpenJsonPayload, prepareWorkspaceOpen, } from './workspace/open-view.js';
10
+ import { getPreferredWorkspaceSkillAgentId, parseSetupOpenerOption, promptPreferredOpener, } from './workspace/opener-selection.js';
11
+ import { workspacePromptTheme, workspaceSelectTheme } from './workspace/prompt-theme.js';
12
+ import { registerWorkspaceCommandWith } from './workspace/registration.js';
13
+ import { WorkspaceCliError, appendStatus, asErrorMessage, asStatus, } from './workspace/types.js';
14
+ function printJson(payload) {
15
+ console.log(JSON.stringify(payload, null, 2));
16
+ }
17
+ function printWorkspaceSetupIntro() {
18
+ console.log(chalk.bold('Workspace setup'));
19
+ console.log('');
20
+ }
21
+ function isPromptCancellationError(error) {
22
+ return (error instanceof Error &&
23
+ (error.name === 'ExitPromptError' || error.message.includes('force closed the prompt with SIGINT')));
24
+ }
25
+ async function promptWorkspaceName(initialName) {
26
+ if (initialName) {
27
+ return validateWorkspaceNameForSetup(initialName);
28
+ }
29
+ const { input } = await import('@inquirer/prompts');
30
+ console.log(chalk.bold('[1/5] Name the workspace'));
31
+ console.log(chalk.dim('Use a stable name for the repo group, e.g. platform.'));
32
+ console.log('');
33
+ return input({
34
+ message: 'Workspace name:',
35
+ required: true,
36
+ theme: workspacePromptTheme,
37
+ validate(value) {
38
+ try {
39
+ validateWorkspaceNameForSetup(value);
40
+ return true;
41
+ }
42
+ catch {
43
+ return 'Workspace names must be kebab-case with lowercase letters, numbers, and single hyphen separators.';
44
+ }
45
+ },
46
+ });
47
+ }
48
+ async function promptExistingPath(message, defaultPath) {
49
+ const { input } = await import('@inquirer/prompts');
50
+ const pathInput = await input({
51
+ message,
52
+ default: defaultPath,
53
+ prefill: defaultPath ? 'editable' : undefined,
54
+ required: true,
55
+ theme: workspacePromptTheme,
56
+ validate(value) {
57
+ const resolvedPath = path.isAbsolute(value)
58
+ ? path.resolve(value)
59
+ : path.resolve(process.cwd(), value);
60
+ return nodeFs.existsSync(resolvedPath) && nodeFs.statSync(resolvedPath).isDirectory()
61
+ ? true
62
+ : 'Enter an existing repo or folder path.';
63
+ },
64
+ });
65
+ return resolveExistingDirectory(pathInput);
66
+ }
67
+ async function promptLinkName(existingLinks) {
68
+ const { input } = await import('@inquirer/prompts');
69
+ return input({
70
+ message: 'Link name:',
71
+ required: true,
72
+ theme: workspacePromptTheme,
73
+ validate(value) {
74
+ try {
75
+ validateLinkNameForCommand(value);
76
+ }
77
+ catch (error) {
78
+ return asErrorMessage(error);
79
+ }
80
+ if (existingLinks[value]) {
81
+ return `Link name '${value}' is already linked to ${existingLinks[value]}.`;
82
+ }
83
+ return true;
84
+ },
85
+ });
86
+ }
87
+ async function promptSetupLinks() {
88
+ const { select } = await import('@inquirer/prompts');
89
+ const links = {};
90
+ console.log('');
91
+ console.log(chalk.bold('[2/5] Link repos or folders'));
92
+ console.log(chalk.dim('Start with the current directory, or enter another repo path.'));
93
+ console.log('');
94
+ while (true) {
95
+ const linkCount = Object.keys(links).length;
96
+ const resolvedPath = await promptExistingPath(linkCount === 0 ? 'Repo or folder path:' : 'Another repo or folder path:', linkCount === 0 ? '.' : undefined);
97
+ let linkName = inferLinkName(resolvedPath);
98
+ try {
99
+ validateLinkNameForCommand(linkName);
100
+ }
101
+ catch {
102
+ linkName = await promptLinkName(links);
103
+ }
104
+ if (links[linkName]) {
105
+ console.log(`Link name '${linkName}' is already linked to ${links[linkName]}.`);
106
+ linkName = await promptLinkName(links);
107
+ }
108
+ links[linkName] = resolvedPath;
109
+ console.log(chalk.green(`Added link '${linkName}'`));
110
+ console.log(chalk.dim(` ${resolvedPath}`));
111
+ const nextAction = await select({
112
+ message: 'Continue',
113
+ default: 'finish',
114
+ choices: [
115
+ {
116
+ name: 'Create workspace files',
117
+ short: 'Create workspace files',
118
+ value: 'finish',
119
+ description: 'Run a workspace check after setup',
120
+ },
121
+ {
122
+ name: 'Add another repo or folder',
123
+ short: 'Add another',
124
+ value: 'add',
125
+ description: 'Include another local directory in this workspace',
126
+ },
127
+ ],
128
+ theme: workspaceSelectTheme,
129
+ });
130
+ if (nextAction === 'finish') {
131
+ return links;
132
+ }
133
+ }
134
+ }
135
+ function parseSetupToolsOption(tools) {
136
+ try {
137
+ return parseWorkspaceSkillToolsValue(tools);
138
+ }
139
+ catch (error) {
140
+ throw new WorkspaceCliError(asErrorMessage(error), 'invalid_workspace_setup_tools', {
141
+ target: 'workspace.skills',
142
+ fix: `Use --tools all, --tools none, or one of: ${getWorkspaceSkillToolIds().join(', ')}`,
143
+ });
144
+ }
145
+ }
146
+ function parseUpdateToolsOption(tools) {
147
+ try {
148
+ return parseWorkspaceSkillToolsValue(tools);
149
+ }
150
+ catch (error) {
151
+ throw new WorkspaceCliError(asErrorMessage(error), 'invalid_workspace_update_tools', {
152
+ target: 'workspace.skills',
153
+ fix: `Use --tools all, --tools none, or one of: ${getWorkspaceSkillToolIds().join(', ')}`,
154
+ });
155
+ }
156
+ }
157
+ async function promptWorkspaceSkillAgents(preferredOpener) {
158
+ const { searchableMultiSelect } = await import('../prompts/searchable-multi-select.js');
159
+ const preferredAgentId = getPreferredWorkspaceSkillAgentId(preferredOpener);
160
+ const tools = getWorkspaceSkillCapableTools();
161
+ const sortedChoices = tools
162
+ .map((tool) => ({
163
+ name: tool.name,
164
+ value: tool.value,
165
+ preSelected: tool.value === preferredAgentId,
166
+ }))
167
+ .sort((a, b) => {
168
+ if (a.preSelected !== b.preSelected) {
169
+ return a.preSelected ? -1 : 1;
170
+ }
171
+ return a.name.localeCompare(b.name);
172
+ });
173
+ if (preferredAgentId) {
174
+ const preferredTool = tools.find((tool) => tool.value === preferredAgentId);
175
+ if (preferredTool) {
176
+ console.log(`${preferredTool.name} matches your preferred opener and is pre-selected.`);
177
+ }
178
+ }
179
+ return searchableMultiSelect({
180
+ message: 'Which agents should get Pastelsdd skills in this workspace?',
181
+ pageSize: 15,
182
+ choices: sortedChoices,
183
+ });
184
+ }
185
+ function printStatusLines(statuses) {
186
+ for (const status of statuses) {
187
+ const label = status.severity === 'warning' ? 'Warning' : 'Issue';
188
+ console.log(`${label}: ${status.message}`);
189
+ if (status.fix) {
190
+ console.log(`Fix: ${status.fix}`);
191
+ }
192
+ }
193
+ }
194
+ function printLinksHuman(links) {
195
+ if (links.length === 0) {
196
+ console.log(' (no linked repos or folders)');
197
+ return;
198
+ }
199
+ for (const link of links) {
200
+ const suffix = link.status.some((status) => status.severity === 'error') ? ' [issue]' : '';
201
+ console.log(` ${link.name} -> ${link.path ?? '(no local path recorded)'}${suffix}`);
202
+ if (link.repo_specs_path) {
203
+ console.log(` repo specs: ${link.repo_specs_path}`);
204
+ }
205
+ }
206
+ }
207
+ function collectWorkspaceIssues(workspace) {
208
+ return [
209
+ ...workspace.status,
210
+ ...workspace.links.flatMap((link) => link.status),
211
+ ];
212
+ }
213
+ function printDoctorHuman(result) {
214
+ console.log(`Workspace: ${result.workspace.name}`);
215
+ console.log(`Location: ${result.workspace.root}`);
216
+ if (result.workspace.context) {
217
+ const selector = result.workspace.context.store_selector;
218
+ const suffix = selector.kind === 'path' ? ` via ${selector.path}` : '';
219
+ console.log(`Context: ${result.workspace.context.store}/${result.workspace.context.initiative}${suffix}`);
220
+ }
221
+ else {
222
+ console.log('Context: (none)');
223
+ }
224
+ console.log(`Planning path: ${result.workspace.planning_path}`);
225
+ console.log('');
226
+ printStatusLines(result.status);
227
+ if (result.status.length > 0) {
228
+ console.log('');
229
+ }
230
+ console.log('Linked repos or folders:');
231
+ printLinksHuman(result.workspace.links);
232
+ const issues = collectWorkspaceIssues(result.workspace);
233
+ console.log('');
234
+ console.log('Advisory edit boundaries:');
235
+ if (result.workspace.context) {
236
+ console.log(' Initiative/context-store files are shared coordination context.');
237
+ }
238
+ else {
239
+ console.log(' No initiative coordination context is attached.');
240
+ }
241
+ console.log(' Linked repos and folders are local implementation context when selected.');
242
+ if (issues.length === 0) {
243
+ console.log('');
244
+ console.log('No workspace issues found.');
245
+ return;
246
+ }
247
+ console.log('');
248
+ console.log('Issues:');
249
+ for (const issue of issues) {
250
+ console.log(` - ${issue.message}`);
251
+ if (issue.target) {
252
+ console.log(` Target: ${issue.target}`);
253
+ }
254
+ if (issue.fix) {
255
+ console.log(` Fix: ${issue.fix}`);
256
+ }
257
+ }
258
+ }
259
+ function printWorkspaceListHuman(workspaces) {
260
+ console.log(chalk.bold(`Pastelsdd workspaces (${workspaces.length})`));
261
+ for (const workspace of workspaces) {
262
+ console.log('');
263
+ console.log(chalk.bold(workspace.name));
264
+ console.log(` Location: ${workspace.root}`);
265
+ if (workspace.status.length > 0) {
266
+ console.log(' Status:');
267
+ for (const status of workspace.status) {
268
+ const statusLabel = status.severity === 'warning' ? chalk.yellow('Warning') : chalk.red('Issue');
269
+ console.log(` ${statusLabel}: ${status.message}`);
270
+ if (status.fix) {
271
+ console.log(` Fix: ${status.fix}`);
272
+ }
273
+ }
274
+ }
275
+ console.log(` Linked repos or folders (${workspace.links.length}):`);
276
+ if (workspace.links.length === 0) {
277
+ console.log(chalk.dim(' (none)'));
278
+ continue;
279
+ }
280
+ for (const link of workspace.links) {
281
+ const suffix = link.status.some((status) => status.severity === 'error') ? chalk.red(' [issue]') : '';
282
+ console.log(` ${link.name} -> ${link.path ?? '(no local path recorded)'}${suffix}`);
283
+ if (link.repo_specs_path) {
284
+ console.log(chalk.dim(` repo specs: ${link.repo_specs_path}`));
285
+ }
286
+ }
287
+ }
288
+ }
289
+ function printWorkspaceCheckSummaryHuman(result) {
290
+ printStatusLines(result.status);
291
+ const issues = collectWorkspaceIssues(result.workspace);
292
+ if (issues.length === 0) {
293
+ console.log(' No workspace issues found.');
294
+ return;
295
+ }
296
+ console.log(' Issues:');
297
+ for (const issue of issues) {
298
+ console.log(` - ${issue.message}`);
299
+ if (issue.target) {
300
+ console.log(` Target: ${issue.target}`);
301
+ }
302
+ if (issue.fix) {
303
+ console.log(` Fix: ${issue.fix}`);
304
+ }
305
+ }
306
+ }
307
+ function printLinkMutationHuman(heading, payload) {
308
+ printStatusLines(payload.status);
309
+ console.log(heading);
310
+ console.log(` ${payload.link.name} -> ${payload.link.path}`);
311
+ console.log(`Workspace: ${payload.workspace.name}`);
312
+ }
313
+ function formatWorkspaceSkillAgentResult(result) {
314
+ const workflowCount = result.workflow_ids?.length ?? 0;
315
+ const workflowLabel = workflowCount === 1 ? '1 workflow' : `${workflowCount} workflows`;
316
+ return `${result.name} (${workflowLabel})`;
317
+ }
318
+ function formatWorkspaceSkillRemovedResult(result) {
319
+ const workflowCount = result.workflow_ids?.length ?? 0;
320
+ const workflowLabel = workflowCount === 1 ? '1 workflow' : `${workflowCount} workflows`;
321
+ return `${result.name} (${workflowLabel} removed)`;
322
+ }
323
+ function printWorkspaceSkillReportHuman(report) {
324
+ console.log('Agent skills:');
325
+ console.log(` Profile: ${report.profile}`);
326
+ console.log(` Workflows: ${report.workflow_ids.length > 0 ? report.workflow_ids.join(', ') : '(none selected)'}`);
327
+ if (report.generated.length > 0) {
328
+ console.log(` Generated: ${report.generated.map(formatWorkspaceSkillAgentResult).join(', ')}`);
329
+ }
330
+ if (report.added.length > 0) {
331
+ console.log(` Added: ${report.added.map(formatWorkspaceSkillAgentResult).join(', ')}`);
332
+ }
333
+ if (report.refreshed.length > 0) {
334
+ console.log(` Refreshed: ${report.refreshed.map(formatWorkspaceSkillAgentResult).join(', ')}`);
335
+ }
336
+ if (report.removed.length > 0) {
337
+ console.log(` Removed: ${report.removed.map(formatWorkspaceSkillRemovedResult).join(', ')}`);
338
+ }
339
+ if (report.skipped.length > 0) {
340
+ for (const skipped of report.skipped) {
341
+ const prefix = skipped.name ? `${skipped.name}: ` : '';
342
+ console.log(` Skipped: ${prefix}${skipped.message}`);
343
+ }
344
+ }
345
+ if (report.failed.length > 0) {
346
+ console.log(chalk.red(` Failed: ${report.failed.map((failure) => `${failure.name} (${failure.error})`).join(', ')}`));
347
+ }
348
+ if (report.delivery_notice) {
349
+ console.log(chalk.dim(` ${report.delivery_notice}`));
350
+ }
351
+ }
352
+ function hasWorkspaceSkillFailures(report) {
353
+ return report.failed.length > 0;
354
+ }
355
+ function setWorkspaceSkillFailureExitCode(report) {
356
+ if (hasWorkspaceSkillFailures(report)) {
357
+ process.exitCode = 1;
358
+ }
359
+ }
360
+ async function writeWorkspaceSkillState(workspaceRoot, selectedAgentIds, report) {
361
+ const viewState = await readWorkspaceViewState(workspaceRoot);
362
+ await writeWorkspaceViewState(workspaceRoot, {
363
+ ...viewState,
364
+ workspace_skills: {
365
+ selected_agents: selectedAgentIds,
366
+ last_applied_profile: report.profile,
367
+ last_applied_delivery: report.delivery,
368
+ last_applied_workflow_ids: report.workflow_ids,
369
+ last_applied_at: new Date().toISOString(),
370
+ },
371
+ });
372
+ }
373
+ function resolveUpdateWorkspaceName(positionalName, options) {
374
+ if (positionalName && options.workspace && positionalName !== options.workspace) {
375
+ throw new WorkspaceCliError(`Conflicting workspace selectors: positional '${positionalName}' and --workspace '${options.workspace}'.`, 'workspace_selection_conflict', {
376
+ target: 'workspace.name',
377
+ fix: 'Use either the positional workspace name or --workspace with the same value.',
378
+ });
379
+ }
380
+ return positionalName ?? options.workspace;
381
+ }
382
+ function printWorkspaceOpenHuman(prepared) {
383
+ console.log(`Opening workspace: ${prepared.selected.name}`);
384
+ console.log(`Location: ${prepared.selected.root}`);
385
+ if (prepared.initiative) {
386
+ console.log(`Initiative: ${prepared.initiative.store}/${prepared.initiative.id}`);
387
+ console.log(`Initiative path: ${prepared.initiative.root}`);
388
+ }
389
+ console.log(`Opener: ${getWorkspaceOpenerLabel(prepared.opener)}`);
390
+ if (prepared.skipped.length === 0) {
391
+ return;
392
+ }
393
+ console.log('');
394
+ console.log('Skipped linked repos or folders:');
395
+ for (const link of prepared.skipped) {
396
+ const location = link.path ?? '(no local path recorded)';
397
+ console.log(` ${link.name} -> ${location}`);
398
+ }
399
+ console.log('Repair skipped links with pastelsdd workspace doctor.');
400
+ }
401
+ class WorkspaceCommand {
402
+ async setup(options = {}) {
403
+ try {
404
+ const noInteractive = resolveNoInteractive(options);
405
+ if (options.json && !noInteractive) {
406
+ throw new WorkspaceCliError('workspace setup --json requires --no-interactive.', 'setup_json_requires_no_interactive', {
407
+ fix: 'pastelsdd workspace setup --no-interactive --json --name <name> --link <path>',
408
+ });
409
+ }
410
+ const interactive = !noInteractive && isInteractive(options);
411
+ if (interactive) {
412
+ printWorkspaceSetupIntro();
413
+ }
414
+ if (!interactive && (!options.name || (options.link ?? []).length === 0)) {
415
+ throw new WorkspaceCliError('workspace setup --no-interactive requires --name <name> and at least one --link <path>.', 'missing_setup_inputs', {
416
+ fix: 'pastelsdd workspace setup --no-interactive --name platform --link /path/to/repo',
417
+ });
418
+ }
419
+ const workspaceName = interactive
420
+ ? await promptWorkspaceName(options.name)
421
+ : validateWorkspaceNameForSetup(options.name ?? '');
422
+ const links = interactive ? await promptSetupLinks() : await parseSetupLinks(options.link);
423
+ if (interactive) {
424
+ console.log('');
425
+ console.log(chalk.bold('[3/5] Choose preferred opener'));
426
+ }
427
+ const preferredOpener = interactive
428
+ ? await promptPreferredOpener('Preferred opener:')
429
+ : parseSetupOpenerOption(options.opener);
430
+ let selectedWorkspaceSkillAgents;
431
+ if (options.tools !== undefined) {
432
+ selectedWorkspaceSkillAgents = parseSetupToolsOption(options.tools);
433
+ }
434
+ else if (interactive) {
435
+ console.log('');
436
+ console.log(chalk.bold('[4/5] Install agent skills'));
437
+ console.log(chalk.dim('Choose which coding agents should get Pastelsdd skills in this workspace.'));
438
+ console.log(chalk.dim('Press Enter with no agents selected to skip skill installation for now.'));
439
+ console.log('');
440
+ selectedWorkspaceSkillAgents = await promptWorkspaceSkillAgents(preferredOpener);
441
+ }
442
+ if (Object.keys(links).length === 0) {
443
+ throw new WorkspaceCliError('workspace setup --no-interactive requires --name <name> and at least one --link <path>.', 'missing_setup_inputs', {
444
+ fix: 'pastelsdd workspace setup --no-interactive --name platform --link /path/to/repo',
445
+ });
446
+ }
447
+ if (interactive) {
448
+ console.log('');
449
+ console.log(chalk.bold('[5/5] Create workspace files'));
450
+ }
451
+ const workspace = await createManagedWorkspace(workspaceName, links, preferredOpener);
452
+ const skillReport = selectedWorkspaceSkillAgents === undefined
453
+ ? createWorkspaceSkillSkippedReport('tools_omitted', 'No workspace skills were installed. Run pastelsdd workspace update --tools <ids> to install them later.')
454
+ : await generateWorkspaceAgentSkills(workspace.root, selectedWorkspaceSkillAgents);
455
+ if (selectedWorkspaceSkillAgents !== undefined && !hasWorkspaceSkillFailures(skillReport)) {
456
+ await writeWorkspaceSkillState(workspace.root, selectedWorkspaceSkillAgents, skillReport);
457
+ }
458
+ const doctorResult = await loadWorkspaceForDoctor({
459
+ name: workspace.name,
460
+ root: workspace.root,
461
+ status: [],
462
+ unregisteredCurrentWorkspace: false,
463
+ });
464
+ if (options.json) {
465
+ printJson({
466
+ workspace: doctorResult.workspace,
467
+ workspace_skills: skillReport,
468
+ status: doctorResult.status,
469
+ });
470
+ setWorkspaceSkillFailureExitCode(skillReport);
471
+ return;
472
+ }
473
+ console.log(chalk.green('Workspace setup complete'));
474
+ console.log('');
475
+ printWorkspaceListHuman([doctorResult.workspace]);
476
+ console.log('');
477
+ console.log(`Planning path: ${doctorResult.workspace.planning_path}`);
478
+ console.log('');
479
+ console.log('Workspace check:');
480
+ printWorkspaceCheckSummaryHuman(doctorResult);
481
+ console.log('');
482
+ printWorkspaceSkillReportHuman(skillReport);
483
+ console.log('');
484
+ console.log('Next useful commands:');
485
+ console.log(` pastelsdd workspace doctor --workspace ${workspace.name}`);
486
+ console.log(` pastelsdd workspace update --workspace ${workspace.name} --tools <ids>`);
487
+ console.log(' pastelsdd workspace list');
488
+ setWorkspaceSkillFailureExitCode(skillReport);
489
+ }
490
+ catch (error) {
491
+ this.handleFailure(options.json, { workspace: null, status: [] }, error);
492
+ }
493
+ }
494
+ async list(options = {}) {
495
+ try {
496
+ const entries = await listKnownWorkspaceEntries();
497
+ const workspaces = await Promise.all(entries.map((entry) => loadWorkspaceForList(entry)));
498
+ const payload = { workspaces, status: [] };
499
+ if (options.json) {
500
+ printJson(payload);
501
+ return;
502
+ }
503
+ if (workspaces.length === 0) {
504
+ console.log("No Pastelsdd workspaces found. Run 'pastelsdd workspace setup' first.");
505
+ return;
506
+ }
507
+ printWorkspaceListHuman(workspaces);
508
+ }
509
+ catch (error) {
510
+ this.handleFailure(options.json, { workspaces: [], status: [] }, error);
511
+ }
512
+ }
513
+ async link(nameOrPath, linkPath, options = {}) {
514
+ try {
515
+ if (!nameOrPath) {
516
+ throw new WorkspaceCliError('workspace link requires a repo or folder path.', 'missing_link_path', {
517
+ fix: 'pastelsdd workspace link /path/to/repo',
518
+ });
519
+ }
520
+ const selected = await selectWorkspaceForCommand(options, 'link');
521
+ const payload = await addWorkspaceLink(selected, nameOrPath, linkPath);
522
+ if (options.json) {
523
+ printJson(payload);
524
+ return;
525
+ }
526
+ printLinkMutationHuman('Linked repo or folder:', payload);
527
+ }
528
+ catch (error) {
529
+ this.handleFailure(options.json, { workspace: null, link: null, status: [] }, error);
530
+ }
531
+ }
532
+ async relink(linkNameInput, linkPath, options = {}) {
533
+ try {
534
+ if (!linkNameInput || !linkPath) {
535
+ throw new WorkspaceCliError('workspace relink requires a link name and repo or folder path.', 'missing_relink_arguments', {
536
+ fix: 'pastelsdd workspace relink <name> /path/to/repo',
537
+ });
538
+ }
539
+ const selected = await selectWorkspaceForCommand(options, 'relink');
540
+ const payload = await updateWorkspaceLink(selected, linkNameInput, linkPath);
541
+ if (options.json) {
542
+ printJson(payload);
543
+ return;
544
+ }
545
+ printLinkMutationHuman('Relinked repo or folder:', payload);
546
+ }
547
+ catch (error) {
548
+ this.handleFailure(options.json, { workspace: null, link: null, status: [] }, error);
549
+ }
550
+ }
551
+ async doctor(options = {}) {
552
+ try {
553
+ const selected = await selectWorkspaceForCommand(options, 'doctor');
554
+ const result = await loadWorkspaceForDoctor(selected);
555
+ if (options.json) {
556
+ printJson(result);
557
+ return;
558
+ }
559
+ printDoctorHuman(result);
560
+ }
561
+ catch (error) {
562
+ this.handleFailure(options.json, { workspace: null, status: [] }, error);
563
+ }
564
+ }
565
+ async update(positionalName, options = {}) {
566
+ try {
567
+ const workspaceName = resolveUpdateWorkspaceName(positionalName, options);
568
+ const selected = await selectWorkspaceForCommand({
569
+ ...options,
570
+ workspace: workspaceName,
571
+ }, 'update', { preferPositionalName: Boolean(positionalName) });
572
+ await this.updateSelected(selected, options);
573
+ }
574
+ catch (error) {
575
+ this.handleFailure(options.json, { workspace: null, workspace_skills: null, status: [] }, error);
576
+ }
577
+ }
578
+ async updateRoot(workspaceRoot, options = {}) {
579
+ try {
580
+ const selected = await selectWorkspaceRootForCommand(workspaceRoot);
581
+ await this.updateSelected(selected, options);
582
+ }
583
+ catch (error) {
584
+ this.handleFailure(options.json, { workspace: null, workspace_skills: null, status: [] }, error);
585
+ }
586
+ }
587
+ async updateSelected(selected, options) {
588
+ const viewState = await readWorkspaceForMutation(selected);
589
+ await syncWorkspaceOpenSurface(selected.root, viewState);
590
+ const hasExplicitToolSelection = options.tools !== undefined;
591
+ const selectedAgentIds = hasExplicitToolSelection
592
+ ? parseUpdateToolsOption(options.tools ?? '')
593
+ : viewState.workspace_skills?.selected_agents ?? [];
594
+ const previousSkillState = hasExplicitToolSelection
595
+ ? viewState.workspace_skills ?? { selected_agents: [] }
596
+ : viewState.workspace_skills;
597
+ const skillReport = await updateWorkspaceAgentSkills(selected.root, selectedAgentIds, previousSkillState);
598
+ const shouldStoreSelection = hasExplicitToolSelection || Boolean(viewState.workspace_skills);
599
+ if (shouldStoreSelection && !hasWorkspaceSkillFailures(skillReport)) {
600
+ await writeWorkspaceSkillState(selected.root, selectedAgentIds, skillReport);
601
+ }
602
+ const doctorResult = await loadWorkspaceForDoctor(selected);
603
+ if (options.json) {
604
+ printJson({
605
+ workspace: doctorResult.workspace,
606
+ workspace_skills: skillReport,
607
+ status: doctorResult.status,
608
+ });
609
+ setWorkspaceSkillFailureExitCode(skillReport);
610
+ return;
611
+ }
612
+ console.log(chalk.green('Workspace update complete'));
613
+ console.log(`Workspace: ${doctorResult.workspace.name}`);
614
+ console.log(`Location: ${doctorResult.workspace.root}`);
615
+ console.log('');
616
+ printStatusLines(doctorResult.status);
617
+ if (doctorResult.status.length > 0) {
618
+ console.log('');
619
+ }
620
+ printWorkspaceSkillReportHuman(skillReport);
621
+ console.log('');
622
+ console.log('Next useful commands:');
623
+ console.log(` pastelsdd workspace doctor --workspace ${doctorResult.workspace.name}`);
624
+ console.log(` pastelsdd workspace update --workspace ${doctorResult.workspace.name} --tools <ids>`);
625
+ setWorkspaceSkillFailureExitCode(skillReport);
626
+ }
627
+ async open(positionalName, options = {}) {
628
+ try {
629
+ const prepared = await prepareWorkspaceOpen(positionalName, options);
630
+ if (!options.json) {
631
+ printStatusLines(prepared.selected.status);
632
+ if (prepared.selected.status.length > 0) {
633
+ console.log('');
634
+ }
635
+ printWorkspaceOpenHuman(prepared);
636
+ }
637
+ await launchWorkspaceOpenCommand(prepared.command, {
638
+ stdio: options.json ? 'ignore' : 'inherit',
639
+ });
640
+ if (options.json) {
641
+ printJson(buildWorkspaceOpenJsonPayload(prepared));
642
+ }
643
+ }
644
+ catch (error) {
645
+ this.handleFailure(options.json, { workspace: null, status: [] }, error);
646
+ }
647
+ }
648
+ handleFailure(json, payload, error) {
649
+ if (!json && isPromptCancellationError(error)) {
650
+ console.error('Cancelled.');
651
+ process.exitCode = 130;
652
+ return;
653
+ }
654
+ if (json) {
655
+ printJson(appendStatus(payload, asStatus(error)));
656
+ process.exitCode = 1;
657
+ return;
658
+ }
659
+ const status = asStatus(error);
660
+ console.error(`Error: ${status.message}`);
661
+ if (status.fix) {
662
+ console.error(`Fix: ${status.fix}`);
663
+ }
664
+ process.exitCode = 1;
665
+ }
666
+ }
667
+ export async function runWorkspaceUpdate(positionalName, options = {}) {
668
+ const workspaceCommand = new WorkspaceCommand();
669
+ await workspaceCommand.update(positionalName, options);
670
+ }
671
+ export async function runWorkspaceUpdateForRoot(workspaceRoot, options = {}) {
672
+ const workspaceCommand = new WorkspaceCommand();
673
+ await workspaceCommand.updateRoot(workspaceRoot, options);
674
+ }
675
+ export function registerWorkspaceCommand(program) {
676
+ registerWorkspaceCommandWith(program, new WorkspaceCommand());
677
+ }
678
+ //# sourceMappingURL=workspace.js.map
@@ -0,0 +1,11 @@
1
+ export declare class ArchiveCommand {
2
+ execute(changeName?: string, options?: {
3
+ yes?: boolean;
4
+ skipSpecs?: boolean;
5
+ noValidate?: boolean;
6
+ validate?: boolean;
7
+ }): Promise<void>;
8
+ private selectChange;
9
+ private getArchiveDate;
10
+ }
11
+ //# sourceMappingURL=archive.d.ts.map