@proletariat/cli 0.3.16 → 0.3.18

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 (338) hide show
  1. package/dist/commands/action/create.d.ts +1 -0
  2. package/dist/commands/action/create.js +74 -38
  3. package/dist/commands/action/delete.d.ts +1 -0
  4. package/dist/commands/action/delete.js +23 -24
  5. package/dist/commands/action/index.d.ts +1 -0
  6. package/dist/commands/action/index.js +5 -10
  7. package/dist/commands/action/list.d.ts +1 -0
  8. package/dist/commands/action/list.js +3 -1
  9. package/dist/commands/action/run.d.ts +1 -0
  10. package/dist/commands/action/run.js +44 -32
  11. package/dist/commands/action/show.d.ts +2 -0
  12. package/dist/commands/action/update.d.ts +1 -0
  13. package/dist/commands/action/update.js +80 -39
  14. package/dist/commands/agent/auth.d.ts +2 -0
  15. package/dist/commands/agent/auth.js +44 -3
  16. package/dist/commands/agent/discover.d.ts +2 -0
  17. package/dist/commands/agent/discover.js +35 -3
  18. package/dist/commands/agent/index.d.ts +1 -0
  19. package/dist/commands/agent/index.js +25 -45
  20. package/dist/commands/agent/list.d.ts +8 -3
  21. package/dist/commands/agent/list.js +16 -29
  22. package/dist/commands/agent/login.d.ts +1 -0
  23. package/dist/commands/agent/login.js +14 -32
  24. package/dist/commands/agent/rebuild.d.ts +1 -0
  25. package/dist/commands/agent/rebuild.js +2 -2
  26. package/dist/commands/agent/remove.d.ts +17 -0
  27. package/dist/commands/agent/remove.js +144 -0
  28. package/dist/commands/agent/restart.d.ts +1 -0
  29. package/dist/commands/agent/restart.js +2 -2
  30. package/dist/commands/agent/shell.d.ts +1 -0
  31. package/dist/commands/agent/shell.js +63 -76
  32. package/dist/commands/agent/staff/add.d.ts +1 -0
  33. package/dist/commands/agent/staff/add.js +7 -1
  34. package/dist/commands/agent/staff/index.d.ts +1 -0
  35. package/dist/commands/agent/staff/index.js +5 -4
  36. package/dist/commands/agent/staff/remove.d.ts +1 -0
  37. package/dist/commands/agent/status.d.ts +1 -0
  38. package/dist/commands/agent/status.js +11 -23
  39. package/dist/commands/agent/temp/cleanup.d.ts +1 -0
  40. package/dist/commands/agent/temp/index.d.ts +1 -0
  41. package/dist/commands/agent/temp/index.js +4 -3
  42. package/dist/commands/agent/themes/index.d.ts +1 -0
  43. package/dist/commands/agent/themes/index.js +9 -3
  44. package/dist/commands/agent/themes/set.d.ts +1 -0
  45. package/dist/commands/agent/themes/set.js +7 -1
  46. package/dist/commands/agent/visit.d.ts +1 -0
  47. package/dist/commands/agent/visit.js +11 -23
  48. package/dist/commands/autocomplete/setup.d.ts +11 -0
  49. package/dist/commands/autocomplete/setup.js +113 -8
  50. package/dist/commands/board/index.d.ts +4 -0
  51. package/dist/commands/board/index.js +32 -30
  52. package/dist/commands/board/watch.d.ts +2 -0
  53. package/dist/commands/branch/create.d.ts +1 -0
  54. package/dist/commands/branch/create.js +33 -41
  55. package/dist/commands/branch/index.d.ts +1 -0
  56. package/dist/commands/branch/list.d.ts +2 -0
  57. package/dist/commands/branch/validate.d.ts +2 -0
  58. package/dist/commands/branch/where.d.ts +1 -0
  59. package/dist/commands/claude.d.ts +6 -0
  60. package/dist/commands/claude.js +166 -116
  61. package/dist/commands/commit.d.ts +6 -0
  62. package/dist/commands/commit.js +68 -73
  63. package/dist/commands/config/index.d.ts +13 -0
  64. package/dist/commands/config/index.js +142 -98
  65. package/dist/commands/docker/clean.d.ts +2 -1
  66. package/dist/commands/docker/clean.js +20 -29
  67. package/dist/commands/docker/index.d.ts +1 -0
  68. package/dist/commands/docker/index.js +37 -41
  69. package/dist/commands/docker/prune.d.ts +2 -1
  70. package/dist/commands/docker/prune.js +20 -27
  71. package/dist/commands/docker/restart.d.ts +2 -1
  72. package/dist/commands/docker/restart.js +20 -29
  73. package/dist/commands/docker/stop.d.ts +2 -1
  74. package/dist/commands/docker/stop.js +20 -29
  75. package/dist/commands/epic/activate.d.ts +1 -0
  76. package/dist/commands/epic/archive.d.ts +1 -0
  77. package/dist/commands/epic/create.d.ts +1 -0
  78. package/dist/commands/epic/index.d.ts +1 -0
  79. package/dist/commands/epic/link/block.d.ts +1 -0
  80. package/dist/commands/epic/link/duplicates.d.ts +1 -0
  81. package/dist/commands/epic/link/index.d.ts +1 -0
  82. package/dist/commands/epic/link/relates.d.ts +1 -0
  83. package/dist/commands/epic/link/remove.d.ts +1 -0
  84. package/dist/commands/epic/list.d.ts +2 -0
  85. package/dist/commands/epic/move.d.ts +1 -0
  86. package/dist/commands/epic/progress.d.ts +1 -0
  87. package/dist/commands/epic/project.d.ts +1 -0
  88. package/dist/commands/epic/reorder.d.ts +1 -0
  89. package/dist/commands/epic/spec.d.ts +1 -0
  90. package/dist/commands/epic/ticket.d.ts +1 -0
  91. package/dist/commands/epic/view.d.ts +1 -0
  92. package/dist/commands/execution/index.d.ts +1 -0
  93. package/dist/commands/execution/index.js +9 -25
  94. package/dist/commands/execution/list.d.ts +2 -0
  95. package/dist/commands/execution/logs.d.ts +1 -0
  96. package/dist/commands/execution/logs.js +6 -16
  97. package/dist/commands/execution/stop.d.ts +1 -0
  98. package/dist/commands/execution/stop.js +4 -15
  99. package/dist/commands/gh/index.d.ts +1 -0
  100. package/dist/commands/gh/index.js +27 -27
  101. package/dist/commands/gh/login.d.ts +4 -0
  102. package/dist/commands/gh/login.js +31 -0
  103. package/dist/commands/gh/status.d.ts +4 -0
  104. package/dist/commands/gh/status.js +27 -4
  105. package/dist/commands/gh/token.d.ts +4 -0
  106. package/dist/commands/gh/token.js +49 -5
  107. package/dist/commands/phase/create.d.ts +1 -1
  108. package/dist/commands/phase/create.js +116 -74
  109. package/dist/commands/phase/delete.d.ts +1 -0
  110. package/dist/commands/phase/delete.js +23 -22
  111. package/dist/commands/phase/list.d.ts +1 -0
  112. package/dist/commands/phase/list.js +3 -5
  113. package/dist/commands/phase/move.d.ts +1 -0
  114. package/dist/commands/phase/move.js +39 -39
  115. package/dist/commands/phase/template/apply.d.ts +1 -0
  116. package/dist/commands/phase/template/create.d.ts +2 -0
  117. package/dist/commands/phase/template/delete.d.ts +1 -0
  118. package/dist/commands/phase/template/index.d.ts +1 -0
  119. package/dist/commands/phase/template/list.d.ts +1 -0
  120. package/dist/commands/phase/template/update.d.ts +2 -0
  121. package/dist/commands/phase/update.d.ts +1 -1
  122. package/dist/commands/phase/update.js +89 -55
  123. package/dist/commands/pmo/init.d.ts +2 -0
  124. package/dist/commands/pmo/init.js +84 -22
  125. package/dist/commands/pr/create.d.ts +12 -3
  126. package/dist/commands/pr/create.js +130 -147
  127. package/dist/commands/pr/index.d.ts +6 -3
  128. package/dist/commands/pr/index.js +41 -39
  129. package/dist/commands/pr/link.d.ts +7 -3
  130. package/dist/commands/pr/link.js +126 -150
  131. package/dist/commands/pr/status.d.ts +6 -3
  132. package/dist/commands/pr/status.js +101 -126
  133. package/dist/commands/project/archive.d.ts +1 -0
  134. package/dist/commands/project/archive.js +15 -20
  135. package/dist/commands/project/create.d.ts +1 -0
  136. package/dist/commands/project/create.js +13 -5
  137. package/dist/commands/project/delete.d.ts +1 -0
  138. package/dist/commands/project/delete.js +14 -28
  139. package/dist/commands/project/index.d.ts +1 -0
  140. package/dist/commands/project/index.js +0 -5
  141. package/dist/commands/project/list.d.ts +2 -0
  142. package/dist/commands/project/list.js +21 -3
  143. package/dist/commands/project/spec.d.ts +1 -0
  144. package/dist/commands/project/spec.js +17 -23
  145. package/dist/commands/project/unarchive.d.ts +2 -0
  146. package/dist/commands/project/unarchive.js +21 -2
  147. package/dist/commands/project/view.d.ts +1 -0
  148. package/dist/commands/project/view.js +34 -22
  149. package/dist/commands/repo/add.d.ts +2 -0
  150. package/dist/commands/repo/add.js +44 -1
  151. package/dist/commands/repo/index.d.ts +1 -0
  152. package/dist/commands/repo/index.js +20 -38
  153. package/dist/commands/repo/list.d.ts +2 -0
  154. package/dist/commands/repo/remove.d.ts +1 -0
  155. package/dist/commands/repo/remove.js +45 -63
  156. package/dist/commands/repo/view.d.ts +2 -0
  157. package/dist/commands/repo/view.js +30 -5
  158. package/dist/commands/roadmap/add-project.d.ts +1 -0
  159. package/dist/commands/roadmap/create.d.ts +1 -0
  160. package/dist/commands/roadmap/delete.d.ts +1 -0
  161. package/dist/commands/roadmap/generate.d.ts +1 -0
  162. package/dist/commands/roadmap/index.d.ts +1 -0
  163. package/dist/commands/roadmap/list.d.ts +2 -0
  164. package/dist/commands/roadmap/remove-project.d.ts +1 -0
  165. package/dist/commands/roadmap/reorder.d.ts +1 -0
  166. package/dist/commands/roadmap/update.d.ts +1 -0
  167. package/dist/commands/roadmap/view.d.ts +1 -0
  168. package/dist/commands/session/attach.d.ts +1 -0
  169. package/dist/commands/session/index.d.ts +1 -0
  170. package/dist/commands/session/index.js +8 -25
  171. package/dist/commands/session/list.d.ts +2 -0
  172. package/dist/commands/spec/create.d.ts +1 -1
  173. package/dist/commands/spec/create.js +64 -65
  174. package/dist/commands/spec/index.d.ts +1 -0
  175. package/dist/commands/spec/index.js +36 -22
  176. package/dist/commands/spec/link/depends.d.ts +1 -0
  177. package/dist/commands/spec/link/depends.js +6 -6
  178. package/dist/commands/spec/link/duplicates.d.ts +1 -0
  179. package/dist/commands/spec/link/duplicates.js +6 -6
  180. package/dist/commands/spec/link/index.d.ts +2 -1
  181. package/dist/commands/spec/link/index.js +0 -4
  182. package/dist/commands/spec/link/relates.d.ts +1 -0
  183. package/dist/commands/spec/link/relates.js +6 -6
  184. package/dist/commands/spec/link/remove.d.ts +2 -1
  185. package/dist/commands/spec/link/remove.js +6 -6
  186. package/dist/commands/spec/list.d.ts +2 -0
  187. package/dist/commands/spec/list.js +25 -0
  188. package/dist/commands/spec/plan.d.ts +2 -1
  189. package/dist/commands/spec/plan.js +19 -26
  190. package/dist/commands/spec/ticket.d.ts +2 -1
  191. package/dist/commands/spec/ticket.js +48 -34
  192. package/dist/commands/spec/view.d.ts +2 -1
  193. package/dist/commands/spec/view.js +25 -16
  194. package/dist/commands/status/create.d.ts +1 -1
  195. package/dist/commands/status/create.js +80 -64
  196. package/dist/commands/status/delete.d.ts +2 -1
  197. package/dist/commands/status/delete.js +26 -22
  198. package/dist/commands/status/index.d.ts +1 -0
  199. package/dist/commands/status/index.js +26 -19
  200. package/dist/commands/status/list.d.ts +1 -0
  201. package/dist/commands/status/list.js +12 -7
  202. package/dist/commands/status/move.d.ts +2 -1
  203. package/dist/commands/status/move.js +62 -61
  204. package/dist/commands/status/update.d.ts +2 -2
  205. package/dist/commands/status/update.js +110 -77
  206. package/dist/commands/template/delete.d.ts +1 -0
  207. package/dist/commands/template/delete.js +47 -48
  208. package/dist/commands/template/index.d.ts +1 -0
  209. package/dist/commands/template/index.js +26 -33
  210. package/dist/commands/template/list.d.ts +1 -0
  211. package/dist/commands/template/phase/create.d.ts +1 -0
  212. package/dist/commands/template/phase/create.js +6 -0
  213. package/dist/commands/template/phase/index.d.ts +1 -0
  214. package/dist/commands/template/phase/index.js +27 -26
  215. package/dist/commands/template/phase/update.d.ts +1 -0
  216. package/dist/commands/template/phase/update.js +6 -0
  217. package/dist/commands/template/ticket/index.d.ts +1 -0
  218. package/dist/commands/template/ticket/index.js +27 -26
  219. package/dist/commands/template/ticket/save.d.ts +1 -0
  220. package/dist/commands/template/ticket/save.js +6 -0
  221. package/dist/commands/terminal/title.d.ts +26 -0
  222. package/dist/commands/terminal/title.js +37 -3
  223. package/dist/commands/ticket/bulk.d.ts +1 -0
  224. package/dist/commands/ticket/complete.d.ts +1 -0
  225. package/dist/commands/ticket/complete.js +18 -14
  226. package/dist/commands/ticket/create.d.ts +1 -0
  227. package/dist/commands/ticket/create.js +45 -41
  228. package/dist/commands/ticket/delete.d.ts +1 -0
  229. package/dist/commands/ticket/delete.js +1 -1
  230. package/dist/commands/ticket/edit.d.ts +1 -0
  231. package/dist/commands/ticket/edit.js +1 -1
  232. package/dist/commands/ticket/epic.d.ts +1 -0
  233. package/dist/commands/ticket/epic.js +2 -2
  234. package/dist/commands/ticket/index.d.ts +1 -0
  235. package/dist/commands/ticket/link/block.d.ts +1 -0
  236. package/dist/commands/ticket/link/block.js +1 -1
  237. package/dist/commands/ticket/link/duplicates.d.ts +1 -0
  238. package/dist/commands/ticket/link/duplicates.js +1 -1
  239. package/dist/commands/ticket/link/index.d.ts +1 -0
  240. package/dist/commands/ticket/link/index.js +9 -8
  241. package/dist/commands/ticket/link/relates.d.ts +1 -0
  242. package/dist/commands/ticket/link/relates.js +1 -1
  243. package/dist/commands/ticket/link/remove.d.ts +1 -0
  244. package/dist/commands/ticket/link/remove.js +1 -1
  245. package/dist/commands/ticket/list.d.ts +2 -0
  246. package/dist/commands/ticket/move.d.ts +1 -0
  247. package/dist/commands/ticket/move.js +27 -19
  248. package/dist/commands/ticket/project.d.ts +1 -0
  249. package/dist/commands/ticket/project.js +3 -3
  250. package/dist/commands/ticket/reassign.d.ts +1 -0
  251. package/dist/commands/ticket/reassign.js +1 -1
  252. package/dist/commands/ticket/spec.d.ts +1 -0
  253. package/dist/commands/ticket/spec.js +3 -3
  254. package/dist/commands/ticket/status.d.ts +1 -0
  255. package/dist/commands/ticket/status.js +1 -1
  256. package/dist/commands/ticket/template/apply.d.ts +1 -0
  257. package/dist/commands/ticket/template/create.d.ts +2 -0
  258. package/dist/commands/ticket/template/delete.d.ts +1 -0
  259. package/dist/commands/ticket/template/index.d.ts +1 -0
  260. package/dist/commands/ticket/template/list.d.ts +1 -0
  261. package/dist/commands/ticket/template/save.d.ts +2 -0
  262. package/dist/commands/ticket/update.d.ts +1 -0
  263. package/dist/commands/ticket/update.js +1 -1
  264. package/dist/commands/ticket/view.d.ts +1 -0
  265. package/dist/commands/ticket/view.js +1 -1
  266. package/dist/commands/work/complete.d.ts +1 -0
  267. package/dist/commands/work/index.d.ts +1 -0
  268. package/dist/commands/work/ready.d.ts +1 -0
  269. package/dist/commands/work/revise.d.ts +1 -0
  270. package/dist/commands/work/spawn-all.d.ts +2 -0
  271. package/dist/commands/work/spawn-all.js +11 -4
  272. package/dist/commands/work/spawn.d.ts +1 -0
  273. package/dist/commands/work/spawn.js +261 -166
  274. package/dist/commands/work/start.d.ts +1 -0
  275. package/dist/commands/work/start.js +270 -189
  276. package/dist/commands/work/watch.d.ts +1 -0
  277. package/dist/commands/work/watch.js +63 -58
  278. package/dist/commands/workflow/create.d.ts +1 -0
  279. package/dist/commands/workflow/create.js +2 -4
  280. package/dist/commands/workflow/delete.d.ts +1 -0
  281. package/dist/commands/workflow/delete.js +21 -33
  282. package/dist/commands/workflow/index.d.ts +1 -0
  283. package/dist/commands/workflow/list.d.ts +1 -0
  284. package/dist/commands/workflow/list.js +3 -6
  285. package/dist/commands/workflow/switch.d.ts +2 -0
  286. package/dist/commands/workflow/switch.js +46 -21
  287. package/dist/commands/workflow/view.d.ts +1 -0
  288. package/dist/commands/workflow/view.js +18 -27
  289. package/dist/commands/workspace/remove.d.ts +2 -2
  290. package/dist/commands/workspace/remove.js +16 -21
  291. package/dist/commands/workspace/use.d.ts +2 -2
  292. package/dist/commands/workspace/use.js +12 -18
  293. package/dist/lib/agents/commands.d.ts +1 -1
  294. package/dist/lib/agents/commands.js +4 -4
  295. package/dist/lib/database/drizzle-schema.d.ts +5009 -0
  296. package/dist/lib/database/drizzle-schema.js +699 -0
  297. package/dist/lib/database/drizzle.d.ts +29 -0
  298. package/dist/lib/database/drizzle.js +37 -0
  299. package/dist/lib/database/index.d.ts +1 -0
  300. package/dist/lib/database/index.js +1 -1
  301. package/dist/lib/execution/config.d.ts +6 -0
  302. package/dist/lib/execution/config.js +31 -13
  303. package/dist/lib/execution/devcontainer.js +13 -7
  304. package/dist/lib/execution/runners.js +24 -7
  305. package/dist/lib/execution/spawner.js +19 -0
  306. package/dist/lib/flags/index.d.ts +4 -0
  307. package/dist/lib/flags/index.js +4 -0
  308. package/dist/lib/flags/resolver.d.ts +224 -0
  309. package/dist/lib/flags/resolver.js +313 -0
  310. package/dist/lib/pmo/base-command.d.ts +53 -3
  311. package/dist/lib/pmo/base-command.js +92 -13
  312. package/dist/lib/pmo/find-pmo.d.ts +1 -1
  313. package/dist/lib/pmo/find-pmo.js +4 -4
  314. package/dist/lib/pmo/index.d.ts +1 -1
  315. package/dist/lib/pmo/index.js +1 -1
  316. package/dist/lib/pmo/storage/helpers.js +2 -1
  317. package/dist/lib/pmo/storage/index.d.ts +9 -0
  318. package/dist/lib/pmo/storage/index.js +14 -0
  319. package/dist/lib/pmo/storage/projects.d.ts +28 -13
  320. package/dist/lib/pmo/storage/projects.js +110 -34
  321. package/dist/lib/pmo/storage/roadmaps.d.ts +2 -0
  322. package/dist/lib/pmo/storage/roadmaps.js +182 -111
  323. package/dist/lib/pmo/storage/specs.js +13 -16
  324. package/dist/lib/pmo/storage/subtasks.js +17 -2
  325. package/dist/lib/pmo/storage/tickets.d.ts +12 -2
  326. package/dist/lib/pmo/storage/tickets.js +63 -5
  327. package/dist/lib/pmo/storage/types.d.ts +7 -3
  328. package/dist/lib/pmo/storage/views.d.ts +12 -1
  329. package/dist/lib/pmo/storage/views.js +61 -6
  330. package/dist/lib/prompt-command.d.ts +90 -0
  331. package/dist/lib/prompt-command.js +102 -0
  332. package/dist/lib/prompt-json.d.ts +34 -4
  333. package/dist/lib/prompt-json.js +35 -3
  334. package/dist/lib/repos/index.js +15 -15
  335. package/dist/lib/workspace.d.ts +4 -3
  336. package/dist/lib/workspace.js +3 -3
  337. package/oclif.manifest.json +4610 -2997
  338. package/package.json +13 -5
@@ -25,6 +25,7 @@ export default class WorkSpawn extends PMOCommand {
25
25
  session: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
26
26
  focus: import("@oclif/core/interfaces").BooleanFlag<boolean>;
27
27
  clone: import("@oclif/core/interfaces").BooleanFlag<boolean>;
28
+ machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
28
29
  project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
29
30
  };
30
31
  execute(): Promise<void>;
@@ -6,7 +6,8 @@ import { PMOCommand, pmoBaseFlags, autoExportToBoard } from '../../lib/pmo/index
6
6
  import { styles } from '../../lib/styles.js';
7
7
  import { getWorkspaceInfo, getTicketTmuxSession, killTmuxSession } from '../../lib/agents/commands.js';
8
8
  import { isDockerRunning, isGitHubTokenAvailable, isDevcontainerCliInstalled } from '../../lib/execution/runners.js';
9
- import { shouldOutputJson, outputPromptAsJson, outputSuccessAsJson, outputErrorAsJson, createMetadata, buildPromptConfig, } from '../../lib/prompt-json.js';
9
+ import { shouldOutputJson, outputSuccessAsJson, outputErrorAsJson, createMetadata, } from '../../lib/prompt-json.js';
10
+ import { FlagResolver } from '../../lib/flags/index.js';
10
11
  export default class WorkSpawn extends PMOCommand {
11
12
  static description = 'Spawn work for multiple tickets by column (batch mode)';
12
13
  static strict = false; // Allow multiple ticket ID args without defining them
@@ -116,10 +117,16 @@ export default class WorkSpawn extends PMOCommand {
116
117
  };
117
118
  async execute() {
118
119
  const { flags, argv } = await this.parse(WorkSpawn);
119
- // This command requires project context
120
- const projectId = await this.requireProject();
121
120
  // Check if JSON output mode is active
122
121
  const jsonMode = shouldOutputJson(flags);
122
+ // This command requires project context (pass JSON mode config for AI agents)
123
+ const projectId = await this.requireProject({
124
+ jsonMode: {
125
+ flags,
126
+ commandName: 'work spawn',
127
+ baseCommand: 'prlt work spawn',
128
+ },
129
+ });
123
130
  // Helper to handle errors in JSON mode
124
131
  const handleError = (code, message) => {
125
132
  if (jsonMode) {
@@ -177,28 +184,27 @@ export default class WorkSpawn extends PMOCommand {
177
184
  spawnMode = 'many';
178
185
  }
179
186
  else if (!flags.column) {
180
- // In JSON mode without explicit flags, output the mode selection prompt
181
- if (jsonMode) {
182
- outputPromptAsJson(buildPromptConfig('list', 'mode', 'How would you like to spawn work?', [
183
- { name: 'All - Spawn all tickets tickets in a column', value: 'all' },
184
- { name: 'Many - Select specific tickets to spawn', value: 'many' },
185
- ]), createMetadata('work spawn', flags));
186
- db.close();
187
- return;
188
- }
189
- // Interactive: ask user
190
- const { mode } = await inquirer.prompt([
191
- {
192
- type: 'list',
193
- name: 'mode',
194
- message: 'How would you like to spawn work?',
195
- choices: [
196
- { name: '📦 All - Spawn all tickets tickets in a column', value: 'all' },
197
- { name: '✅ Many - Select specific tickets to spawn', value: 'many' },
198
- ],
199
- },
200
- ]);
201
- spawnMode = mode;
187
+ // Use FlagResolver for mode selection prompt
188
+ const modeResolver = new FlagResolver({
189
+ commandName: 'work spawn',
190
+ baseCommand: 'prlt work spawn',
191
+ jsonMode,
192
+ flags: {},
193
+ context: { projectId },
194
+ });
195
+ modeResolver.addPrompt({
196
+ flagName: 'mode',
197
+ type: 'list',
198
+ message: 'How would you like to spawn work?',
199
+ choices: () => [
200
+ { name: jsonMode ? 'All - Spawn all tickets in a column' : '📦 All - Spawn all tickets tickets in a column', value: 'all' },
201
+ { name: jsonMode ? 'Many - Select specific tickets to spawn' : '✅ Many - Select specific tickets to spawn', value: 'many' },
202
+ ],
203
+ });
204
+ const resolved = await modeResolver.resolve();
205
+ // In JSON mode, resolve() exits after outputting prompt, so we never reach here
206
+ // In interactive mode, we get the selected value
207
+ spawnMode = resolved.mode;
202
208
  }
203
209
  let ticketsToSpawn = [];
204
210
  if (spawnMode === 'args') {
@@ -240,29 +246,28 @@ export default class WorkSpawn extends PMOCommand {
240
246
  // ALL MODE: Column picker, then spawn all tickets in that column
241
247
  let targetColumn = flags.column;
242
248
  if (!targetColumn) {
243
- // Show columns with ticket counts
244
- const columnChoices = columnNames.map(name => {
245
- const count = allTickets.filter(t => t.statusName === name).length;
246
- return {
247
- name: `${name} (${count} tickets)`,
248
- value: name,
249
- };
249
+ // Use FlagResolver for column selection
250
+ const columnResolver = new FlagResolver({
251
+ commandName: 'work spawn',
252
+ baseCommand: 'prlt work spawn --all',
253
+ jsonMode,
254
+ flags: {},
255
+ context: { projectId },
250
256
  });
251
- // In JSON mode, output the column selection prompt
252
- if (jsonMode) {
253
- outputPromptAsJson(buildPromptConfig('list', 'selectedColumn', 'Select column to spawn all tickets tickets from:', columnChoices), createMetadata('work spawn', flags));
254
- db.close();
255
- return;
256
- }
257
- const { selectedColumn } = await inquirer.prompt([
258
- {
259
- type: 'list',
260
- name: 'selectedColumn',
261
- message: 'Select column to spawn all tickets tickets from:',
262
- choices: columnChoices,
263
- },
264
- ]);
265
- targetColumn = selectedColumn;
257
+ columnResolver.addPrompt({
258
+ flagName: 'selectedColumn',
259
+ type: 'list',
260
+ message: 'Select column to spawn all tickets tickets from:',
261
+ choices: () => columnNames.map(name => {
262
+ const count = allTickets.filter(t => t.statusName === name).length;
263
+ return {
264
+ name: `${name} (${count} tickets)`,
265
+ value: name,
266
+ };
267
+ }),
268
+ });
269
+ const resolved = await columnResolver.resolve();
270
+ targetColumn = resolved.selectedColumn;
266
271
  }
267
272
  // Verify column exists
268
273
  const matchedColumn = columnNames.find(c => c.toLowerCase() === targetColumn.toLowerCase());
@@ -288,15 +293,28 @@ export default class WorkSpawn extends PMOCommand {
288
293
  // In JSON mode with --many, output the ticket selection prompt directly
289
294
  // (skip column selection for simplicity - show all tickets)
290
295
  if (jsonMode) {
291
- // Build choices from all tickets tickets
292
- const ticketChoices = allTickets.map(ticket => {
293
- const priority = ticket.priority ? `[${ticket.priority}] ` : '';
294
- return {
295
- name: `${priority}${ticket.id} - ${ticket.title} (${ticket.statusName || 'No Status'})`,
296
- value: ticket.id,
297
- };
296
+ // Use FlagResolver for ticket selection in JSON mode
297
+ const ticketResolver = new FlagResolver({
298
+ commandName: 'work spawn',
299
+ baseCommand: 'prlt work spawn',
300
+ jsonMode,
301
+ flags: {},
302
+ context: { projectId },
303
+ });
304
+ ticketResolver.addPrompt({
305
+ flagName: 'selectedTickets',
306
+ type: 'checkbox',
307
+ message: 'Select tickets to spawn (provide ticket IDs as positional args to execute):',
308
+ choices: () => allTickets.map(ticket => {
309
+ const priority = ticket.priority ? `[${ticket.priority}] ` : '';
310
+ return {
311
+ name: `${priority}${ticket.id} - ${ticket.title} (${ticket.statusName || 'No Status'})`,
312
+ value: ticket.id,
313
+ };
314
+ }),
298
315
  });
299
- outputPromptAsJson(buildPromptConfig('checkbox', 'selectedTickets', 'Select tickets to spawn (provide ticket IDs as positional args to execute):', ticketChoices), createMetadata('work spawn', flags));
316
+ // In JSON mode, this exits after outputting prompt
317
+ await ticketResolver.resolve();
300
318
  db.close();
301
319
  return;
302
320
  }
@@ -311,14 +329,21 @@ export default class WorkSpawn extends PMOCommand {
311
329
  value: name,
312
330
  });
313
331
  }
314
- const { manyColumn } = await inquirer.prompt([
315
- {
316
- type: 'list',
317
- name: 'manyColumn',
318
- message: 'Select from which column:',
319
- choices: columnChoices,
320
- },
321
- ]);
332
+ // Use FlagResolver for column selection (many mode)
333
+ const manyColumnResolver = new FlagResolver({
334
+ commandName: 'work spawn',
335
+ baseCommand: 'prlt work spawn --many',
336
+ jsonMode,
337
+ flags: {},
338
+ });
339
+ manyColumnResolver.addPrompt({
340
+ flagName: 'manyColumn',
341
+ type: 'list',
342
+ message: 'Select from which column:',
343
+ choices: () => columnChoices,
344
+ });
345
+ const manyColumnResult = await manyColumnResolver.resolve();
346
+ const manyColumn = manyColumnResult.manyColumn;
322
347
  // Filter tickets based on column selection
323
348
  const ticketsForSelection = manyColumn === '__ALL__'
324
349
  ? allTickets
@@ -343,6 +368,8 @@ export default class WorkSpawn extends PMOCommand {
343
368
  }
344
369
  // Build choices with priority separators
345
370
  const choices = [];
371
+ // Also build flat choices for JSON mode (without separators)
372
+ const flatChoices = [];
346
373
  for (const priority of PRIORITY_ORDER) {
347
374
  const tickets = ticketsByPriority.get(priority) || [];
348
375
  if (tickets.length === 0)
@@ -350,26 +377,35 @@ export default class WorkSpawn extends PMOCommand {
350
377
  choices.push(new inquirer.Separator(`── ${priority} (${tickets.length}) ──`));
351
378
  for (const ticket of tickets) {
352
379
  const statusBadge = ticket.statusName ? ` [${ticket.statusName}]` : '';
353
- choices.push({
380
+ const ticketChoice = {
354
381
  name: `[${priority}] ${ticket.id} - ${ticket.title}${statusBadge}`,
355
382
  value: ticket.id,
356
- });
383
+ };
384
+ choices.push(ticketChoice);
385
+ flatChoices.push(ticketChoice);
357
386
  }
358
387
  }
359
- const { selectedTicketIds } = await inquirer.prompt([
360
- {
361
- type: 'checkbox',
362
- name: 'selectedTicketIds',
363
- message: 'Select tickets to spawn (space to toggle, enter to confirm):',
364
- choices,
365
- validate: (input) => {
366
- if (input.length === 0) {
367
- return 'Please select at least one ticket';
368
- }
369
- return true;
370
- },
388
+ // Use FlagResolver for ticket selection (checkbox)
389
+ const ticketSelectResolver = new FlagResolver({
390
+ commandName: 'work spawn',
391
+ baseCommand: 'prlt work spawn',
392
+ jsonMode,
393
+ flags: {},
394
+ });
395
+ ticketSelectResolver.addPrompt({
396
+ flagName: 'selectedTicketIds',
397
+ type: 'checkbox',
398
+ message: 'Select tickets to spawn (space to toggle, enter to confirm):',
399
+ choices: () => flatChoices,
400
+ validate: (input) => {
401
+ if (input.length === 0) {
402
+ return 'Please select at least one ticket';
403
+ }
404
+ return true;
371
405
  },
372
- ]);
406
+ });
407
+ const ticketSelectResult = await ticketSelectResolver.resolve();
408
+ const selectedTicketIds = ticketSelectResult.selectedTicketIds || [];
373
409
  ticketsToSpawn = allTickets.filter(t => selectedTicketIds.includes(t.id));
374
410
  this.log('');
375
411
  this.log(styles.header(`🚀 Spawn Many: ${ticketsToSpawn.length} tickets`));
@@ -485,15 +521,22 @@ export default class WorkSpawn extends PMOCommand {
485
521
  name: 'adhoc - Unstructured exploration/debugging',
486
522
  value: '__adhoc__',
487
523
  });
488
- const { selectedAction } = await inquirer.prompt([
489
- {
490
- type: 'list',
491
- name: 'selectedAction',
492
- message: 'What action should agents perform?',
493
- choices: actionChoices,
494
- default: 'implement',
495
- },
496
- ]);
524
+ // Use FlagResolver for action selection
525
+ const actionResolver = new FlagResolver({
526
+ commandName: 'work spawn',
527
+ baseCommand: 'prlt work spawn',
528
+ jsonMode,
529
+ flags: {},
530
+ });
531
+ actionResolver.addPrompt({
532
+ flagName: 'selectedAction',
533
+ type: 'list',
534
+ message: 'What action should agents perform?',
535
+ default: 'implement',
536
+ choices: () => actionChoices,
537
+ });
538
+ const actionResult = await actionResolver.resolve();
539
+ const selectedAction = actionResult.selectedAction;
497
540
  batchAction = selectedAction === '__adhoc__' ? 'adhoc' : selectedAction;
498
541
  }
499
542
  // Now fetch action details after selection is made
@@ -523,18 +566,25 @@ export default class WorkSpawn extends PMOCommand {
523
566
  const defaultsDescription = modifiesCode
524
567
  ? 'devcontainer, terminal, interactive, safe permissions, create PRs'
525
568
  : 'devcontainer, terminal, interactive, safe permissions, no PRs';
526
- const { useDefaults } = await inquirer.prompt([
527
- {
528
- type: 'list',
529
- name: 'useDefaults',
530
- message: `Use default settings for "${actionName}"?`,
531
- choices: [
532
- { name: `✓ Yes - Use defaults (${defaultsDescription})`, value: true },
533
- { name: '✗ No - Configure each setting', value: false },
534
- ],
535
- default: true,
536
- },
537
- ]);
569
+ // Use FlagResolver for defaults choice
570
+ const defaultsResolver = new FlagResolver({
571
+ commandName: 'work spawn',
572
+ baseCommand: 'prlt work spawn',
573
+ jsonMode,
574
+ flags: {},
575
+ });
576
+ defaultsResolver.addPrompt({
577
+ flagName: 'useDefaults',
578
+ type: 'list',
579
+ message: `Use default settings for "${actionName}"?`,
580
+ default: 'yes',
581
+ choices: () => [
582
+ { name: `✓ Yes - Use defaults (${defaultsDescription})`, value: 'yes' },
583
+ { name: '✗ No - Configure each setting', value: 'no' },
584
+ ],
585
+ });
586
+ const defaultsResult = await defaultsResolver.resolve();
587
+ const useDefaults = defaultsResult.useDefaults === 'yes';
538
588
  if (useDefaults) {
539
589
  // Apply defaults
540
590
  if (hasDevcontainer) {
@@ -574,6 +624,31 @@ export default class WorkSpawn extends PMOCommand {
574
624
  missing.push('devcontainer CLI');
575
625
  devcontainerLabel = `🐳 devcontainer (requires: ${missing.join(', ')})`;
576
626
  }
627
+ const envChoices = [
628
+ { name: devcontainerLabel, value: 'devcontainer', disabled: !devcontainerReady },
629
+ { name: '💻 host (runs directly on your machine)', value: 'host' },
630
+ { name: '✗ cancel', value: 'cancel' },
631
+ ];
632
+ // In JSON mode, use FlagResolver (outputs prompt and exits)
633
+ if (jsonMode) {
634
+ const envResolver = new FlagResolver({
635
+ commandName: 'work spawn',
636
+ baseCommand: 'prlt work spawn',
637
+ jsonMode,
638
+ flags: {},
639
+ });
640
+ envResolver.addPrompt({
641
+ flagName: 'selectedEnvironment',
642
+ type: 'list',
643
+ message: 'Where should agents run?',
644
+ default: devcontainerReady ? 'devcontainer' : 'host',
645
+ choices: () => envChoices,
646
+ });
647
+ await envResolver.resolve();
648
+ // FlagResolver exits in JSON mode, so we never reach here
649
+ db.close();
650
+ return;
651
+ }
577
652
  let environmentSelected = false;
578
653
  while (!environmentSelected) {
579
654
  // eslint-disable-next-line no-await-in-loop -- Interactive loop with retry on Docker check
@@ -582,11 +657,7 @@ export default class WorkSpawn extends PMOCommand {
582
657
  type: 'list',
583
658
  name: 'selectedEnvironment',
584
659
  message: 'Where should agents run?',
585
- choices: [
586
- { name: devcontainerLabel, value: 'devcontainer', disabled: !devcontainerReady },
587
- { name: '💻 host (runs directly on your machine)', value: 'host' },
588
- { name: '✗ cancel', value: 'cancel' },
589
- ],
660
+ choices: envChoices,
590
661
  default: devcontainerReady ? 'devcontainer' : 'host',
591
662
  },
592
663
  ]);
@@ -615,32 +686,37 @@ export default class WorkSpawn extends PMOCommand {
615
686
  }
616
687
  // Check GitHub token is available for git push operations
617
688
  if (!isGitHubTokenAvailable()) {
618
- const tokenChoices = [
619
- { name: 'Yes, continue anyway (git push may fail)', value: 'continue' },
620
- { name: 'No, let me run gh auth login first', value: 'cancel' },
621
- { name: 'Switch to host mode instead', value: 'host' },
622
- ];
623
689
  const tokenMessage = 'GitHub token not found. Git push may fail. Continue without token?';
624
- if (jsonMode) {
625
- outputPromptAsJson(buildPromptConfig('list', 'tokenAction', tokenMessage, tokenChoices), createMetadata('work spawn', flags));
626
- db.close();
627
- return;
690
+ // Use FlagResolver for token action prompt
691
+ const tokenResolver = new FlagResolver({
692
+ commandName: 'work spawn',
693
+ baseCommand: 'prlt work spawn',
694
+ jsonMode,
695
+ flags: {},
696
+ });
697
+ tokenResolver.addPrompt({
698
+ flagName: 'tokenAction',
699
+ type: 'list',
700
+ message: tokenMessage,
701
+ default: 'continue',
702
+ choices: () => [
703
+ { name: 'Yes, continue anyway (git push may fail)', value: 'continue' },
704
+ { name: 'No, let me run gh auth login first', value: 'cancel' },
705
+ { name: 'Switch to host mode instead', value: 'host' },
706
+ ],
707
+ });
708
+ // In JSON mode, this will output prompt and exit
709
+ // In interactive mode, show warning first
710
+ if (!jsonMode) {
711
+ this.log('');
712
+ this.warn('GitHub token not found.\n' +
713
+ 'Git push operations may fail inside containers.\n' +
714
+ 'Run `gh auth login` to authenticate, or continue without token.');
715
+ this.log('');
628
716
  }
629
- this.log('');
630
- this.warn('GitHub token not found.\n' +
631
- 'Git push operations may fail inside containers.\n' +
632
- 'Run `gh auth login` to authenticate, or continue without token.');
633
- this.log('');
634
717
  // eslint-disable-next-line no-await-in-loop -- Interactive user prompt in loop
635
- const { tokenAction } = await inquirer.prompt([
636
- {
637
- type: 'list',
638
- name: 'tokenAction',
639
- message: tokenMessage,
640
- choices: tokenChoices,
641
- default: 'continue',
642
- },
643
- ]);
718
+ const resolved = await tokenResolver.resolve();
719
+ const tokenAction = resolved.tokenAction;
644
720
  if (tokenAction === 'cancel') {
645
721
  db.close();
646
722
  this.log(styles.muted('Run `gh auth login` and try again.'));
@@ -682,18 +758,25 @@ export default class WorkSpawn extends PMOCommand {
682
758
  }
683
759
  // Prompt for display mode if not already set (for host mode without devcontainer)
684
760
  if (!batchDisplay) {
685
- const { selectedMode } = await inquirer.prompt([
686
- {
687
- type: 'list',
688
- name: 'selectedMode',
689
- message: 'How should agent output be displayed?',
690
- choices: [
691
- { name: '🖥️ New tab - Opens in new terminal tab (recommended)', value: 'terminal' },
692
- { name: '📦 Background - Runs detached, reattach with: prlt session attach', value: 'background' },
693
- ],
694
- },
695
- ]);
696
- batchDisplay = selectedMode;
761
+ // Use FlagResolver for display mode
762
+ const displayResolver = new FlagResolver({
763
+ commandName: 'work spawn',
764
+ baseCommand: 'prlt work spawn',
765
+ jsonMode,
766
+ flags: {},
767
+ });
768
+ displayResolver.addPrompt({
769
+ flagName: 'selectedMode',
770
+ type: 'list',
771
+ message: 'How should agent output be displayed?',
772
+ default: 'terminal',
773
+ choices: () => [
774
+ { name: '🖥️ New tab - Opens in new terminal tab (recommended)', value: 'terminal' },
775
+ { name: '📦 Background - Runs detached, reattach with: prlt session attach', value: 'background' },
776
+ ],
777
+ });
778
+ const displayResult = await displayResolver.resolve();
779
+ batchDisplay = displayResult.selectedMode;
697
780
  }
698
781
  // Default to interactive output mode (streaming UI)
699
782
  // Can be overridden via --output flag if needed
@@ -702,39 +785,51 @@ export default class WorkSpawn extends PMOCommand {
702
785
  }
703
786
  // Prompt for permissions mode if not explicitly set via --skip-permissions flag
704
787
  if (!flags['skip-permissions']) {
705
- const { permissionMode } = await inquirer.prompt([
706
- {
707
- type: 'list',
708
- name: 'permissionMode',
709
- message: 'Permission mode for Claude Code:',
710
- choices: [
711
- { name: '⚠️ danger - Skip permission checks (faster, container provides isolation)', value: 'danger' },
712
- { name: '🔒 safe - Requires approval for dangerous operations', value: 'safe' },
713
- ],
714
- default: 'danger',
715
- },
716
- ]);
717
- batchPermissionMode = permissionMode;
788
+ // Use FlagResolver for permission mode
789
+ const permissionResolver = new FlagResolver({
790
+ commandName: 'work spawn',
791
+ baseCommand: 'prlt work spawn',
792
+ jsonMode,
793
+ flags: {},
794
+ });
795
+ permissionResolver.addPrompt({
796
+ flagName: 'permissionMode',
797
+ type: 'list',
798
+ message: 'Permission mode for Claude Code:',
799
+ default: 'danger',
800
+ choices: () => [
801
+ { name: '⚠️ danger - Skip permission checks (faster, container provides isolation)', value: 'danger' },
802
+ { name: '🔒 safe - Requires approval for dangerous operations', value: 'safe' },
803
+ ],
804
+ });
805
+ const permissionResult = await permissionResolver.resolve();
806
+ batchPermissionMode = permissionResult.permissionMode;
718
807
  }
719
808
  // Prompt for PR creation if not provided AND action modifies code
720
809
  // Skip this prompt entirely for non-code-modifying actions (like groom)
721
810
  const actionModifiesCode = selectedActionDetails?.modifiesCode ?? true;
722
811
  if (!batchCreatePr && !batchNoPr) {
723
812
  if (actionModifiesCode) {
724
- const { prChoice } = await inquirer.prompt([
725
- {
726
- type: 'list',
727
- name: 'prChoice',
728
- message: 'Create pull requests when work is ready?',
729
- choices: [
730
- { name: '✓ Yes - Create PR for each ticket', value: 'yes' },
731
- { name: '✗ No - Just move tickets to review', value: 'no' },
732
- ],
733
- default: 'yes',
734
- },
735
- ]);
736
- batchCreatePr = prChoice === 'yes';
737
- batchNoPr = prChoice === 'no';
813
+ // Use FlagResolver for PR choice
814
+ const prResolver = new FlagResolver({
815
+ commandName: 'work spawn',
816
+ baseCommand: 'prlt work spawn',
817
+ jsonMode,
818
+ flags: {},
819
+ });
820
+ prResolver.addPrompt({
821
+ flagName: 'prChoice',
822
+ type: 'list',
823
+ message: 'Create pull requests when work is ready?',
824
+ default: 'yes',
825
+ choices: () => [
826
+ { name: '✓ Yes - Create PR for each ticket', value: 'yes' },
827
+ { name: '✗ No - Just move tickets to review', value: 'no' },
828
+ ],
829
+ });
830
+ const prResult = await prResolver.resolve();
831
+ batchCreatePr = prResult.prChoice === 'yes';
832
+ batchNoPr = prResult.prChoice === 'no';
738
833
  }
739
834
  else {
740
835
  // Non-code-modifying action - no PR needed
@@ -27,6 +27,7 @@ export default class WorkStart extends PMOCommand {
27
27
  ephemeral: import("@oclif/core/interfaces").BooleanFlag<boolean>;
28
28
  focus: import("@oclif/core/interfaces").BooleanFlag<boolean>;
29
29
  clone: import("@oclif/core/interfaces").BooleanFlag<boolean>;
30
+ machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
30
31
  project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
31
32
  };
32
33
  execute(): Promise<void>;