@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
@@ -1,9 +1,9 @@
1
1
  import { Flags, Args } from '@oclif/core';
2
- import inquirer from 'inquirer';
3
2
  import { PMOCommand, pmoBaseFlags } from '../../lib/pmo/index.js';
4
3
  import { styles } from '../../lib/styles.js';
5
4
  import { STATE_CATEGORY_ORDER } from '../../lib/pmo/types.js';
6
- import { shouldOutputJson, outputPromptAsJson, createMetadata, buildFormPromptConfig, } from '../../lib/prompt-json.js';
5
+ import { shouldOutputJson } from '../../lib/prompt-json.js';
6
+ import { FlagResolver } from '../../lib/flags/index.js';
7
7
  export default class PhaseCreate extends PMOCommand {
8
8
  static description = 'Create a new project lifecycle phase';
9
9
  static examples = [
@@ -40,84 +40,126 @@ export default class PhaseCreate extends PMOCommand {
40
40
  description: 'Interactive mode',
41
41
  default: false,
42
42
  }),
43
- json: Flags.boolean({
44
- description: 'Output prompt configuration as JSON (for AI agents/scripts)',
45
- default: false,
46
- }),
47
43
  };
48
44
  getPMOOptions() {
49
45
  return { promptIfMultiple: false };
50
46
  }
51
47
  async execute() {
52
48
  const { args, flags } = await this.parse(PhaseCreate);
53
- {
54
- let phaseData;
55
- // Auto-enter interactive mode if any required value is missing
56
- if (flags.interactive || !args.name || !flags.category) {
57
- // Check if JSON output mode is active
58
- const jsonMode = shouldOutputJson(flags);
59
- // In JSON mode, output form prompt
60
- // Define labels once - single source of truth
61
- const categoryLabels = {
62
- triage: 'Triage - Inbox, needs review',
63
- backlog: 'Backlog - Not yet scheduled for work',
64
- unstarted: 'Unstarted - Scheduled but work hasn\'t begun',
65
- started: 'Started - Work is actively in progress',
66
- completed: 'Completed - Work finished successfully',
67
- canceled: 'Canceled - Work won\'t be done',
68
- };
69
- const categoryChoices = STATE_CATEGORY_ORDER.map(cat => ({ name: categoryLabels[cat], value: cat }));
70
- // Define fields once - single source of truth for both JSON and interactive modes
71
- const fields = [
72
- { type: 'input', name: 'name', message: 'Phase name:', default: args.name },
73
- { type: 'list', name: 'category', message: 'Category:', choices: categoryChoices, default: flags.category },
74
- { type: 'input', name: 'color', message: 'Color (hex, optional):', default: flags.color },
75
- { type: 'input', name: 'description', message: 'Description (optional):', default: flags.description },
76
- { type: 'confirm', name: 'isDefault', message: 'Set as default for new projects?', default: flags.default || false },
77
- ];
78
- if (jsonMode) {
79
- outputPromptAsJson(buildFormPromptConfig(fields), createMetadata('phase create', flags));
80
- }
81
- phaseData = await this.promptPhaseData(fields);
82
- }
83
- else {
84
- phaseData = {
85
- name: args.name,
86
- category: flags.category,
87
- color: flags.color,
88
- description: flags.description,
89
- isDefault: flags.default,
90
- };
91
- }
92
- const phase = await this.storage.createPhase(phaseData);
93
- this.log(styles.success(`\nCreated phase "${styles.emphasis(phase.name)}"`));
94
- this.log(styles.muted(` ID: ${phase.id}`));
95
- this.log(styles.muted(` Category: ${phase.category}`));
96
- if (phase.color) {
97
- this.log(styles.muted(` Color: ${phase.color}`));
98
- }
99
- if (phase.description) {
100
- this.log(styles.muted(` Description: ${phase.description}`));
101
- }
102
- if (phase.isDefault) {
103
- this.log(styles.muted(` Default: Yes`));
104
- }
105
- }
106
- }
107
- async promptPhaseData(fields) {
108
- // Build inquirer prompts from fields, adding validators
109
- const answers = await inquirer.prompt(fields.map(field => ({
110
- ...field,
111
- validate: field.name === 'name'
112
- ? ((input) => input.length > 0 || 'Name is required')
113
- : undefined,
114
- })));
115
- return {
116
- name: answers.name,
117
- category: answers.category,
118
- color: answers.color || undefined,
119
- description: answers.description || undefined,
120
- isDefault: answers.isDefault,
49
+ // Check if JSON output mode is active
50
+ const jsonMode = shouldOutputJson(flags);
51
+ // Define category labels - single source of truth
52
+ const categoryLabels = {
53
+ triage: 'Triage - Inbox, needs review',
54
+ backlog: 'Backlog - Not yet scheduled for work',
55
+ unstarted: 'Unstarted - Scheduled but work hasn\'t begun',
56
+ started: 'Started - Work is actively in progress',
57
+ completed: 'Completed - Work finished successfully',
58
+ canceled: 'Canceled - Work won\'t be done',
121
59
  };
60
+ // Build base command with positional arg if name provided
61
+ const baseCmd = args.name
62
+ ? `prlt phase create "${args.name}"`
63
+ : 'prlt phase create';
64
+ // Use FlagResolver for unified JSON mode and interactive handling
65
+ const resolver = new FlagResolver({
66
+ commandName: 'phase create',
67
+ baseCommand: baseCmd,
68
+ jsonMode,
69
+ flags: {
70
+ category: flags.category,
71
+ color: flags.color,
72
+ description: flags.description,
73
+ default: flags.default,
74
+ machine: flags.machine,
75
+ json: flags.json,
76
+ },
77
+ });
78
+ // Store name in context for later use
79
+ let phaseName = args.name;
80
+ // Name prompt - required (only if not provided as positional arg)
81
+ if (!args.name) {
82
+ resolver.addPrompt({
83
+ flagName: 'name',
84
+ type: 'input',
85
+ message: 'Phase name:',
86
+ validate: (value) => value.length > 0 || 'Name is required',
87
+ context: {
88
+ hint: 'Provide name with: prlt phase create "Phase Name" --category <category>',
89
+ example: 'prlt phase create "In Review" --category started',
90
+ },
91
+ // For input prompts, the agent will re-run with the positional arg
92
+ getCommand: (value) => `prlt phase create "${value}" --json`,
93
+ });
94
+ }
95
+ // Category prompt - required
96
+ resolver.addPrompt({
97
+ flagName: 'category',
98
+ type: 'list',
99
+ message: 'Category:',
100
+ choices: () => STATE_CATEGORY_ORDER.map(cat => ({
101
+ name: categoryLabels[cat],
102
+ value: cat,
103
+ })),
104
+ when: () => !!args.name && !flags.category,
105
+ });
106
+ // Color prompt - optional (only in interactive mode)
107
+ if (flags.interactive) {
108
+ resolver.addPrompt({
109
+ flagName: 'color',
110
+ type: 'input',
111
+ message: 'Color (hex, optional):',
112
+ when: (ctx) => ctx.flags.category !== undefined && ctx.flags.color === undefined,
113
+ });
114
+ // Description prompt - optional (only in interactive mode)
115
+ resolver.addPrompt({
116
+ flagName: 'description',
117
+ type: 'input',
118
+ message: 'Description (optional):',
119
+ when: (ctx) => ctx.flags.category !== undefined && ctx.flags.description === undefined,
120
+ });
121
+ // Default prompt - optional (only in interactive mode)
122
+ resolver.addPrompt({
123
+ flagName: 'default',
124
+ type: 'list',
125
+ message: 'Set as default for new projects?',
126
+ choices: () => [
127
+ { name: 'No', value: false },
128
+ { name: 'Yes', value: true },
129
+ ],
130
+ when: (ctx) => ctx.flags.category !== undefined && ctx.flags.default === undefined,
131
+ });
132
+ }
133
+ // Resolve missing flags
134
+ const resolved = await resolver.resolve();
135
+ // Get name from args or resolved (for interactive mode)
136
+ phaseName = phaseName || resolved.name;
137
+ // Validate required fields
138
+ if (!phaseName) {
139
+ this.error('Name is required. Use positional arg or --interactive mode.');
140
+ }
141
+ if (!resolved.category) {
142
+ this.error('Category is required. Use --category flag or --interactive mode.');
143
+ }
144
+ // Create the phase
145
+ const phase = await this.storage.createPhase({
146
+ name: phaseName,
147
+ category: resolved.category,
148
+ color: resolved.color || undefined,
149
+ description: resolved.description || undefined,
150
+ isDefault: resolved.default || false,
151
+ });
152
+ this.log(styles.success(`\nCreated phase "${styles.emphasis(phase.name)}"`));
153
+ this.log(styles.muted(` ID: ${phase.id}`));
154
+ this.log(styles.muted(` Category: ${phase.category}`));
155
+ if (phase.color) {
156
+ this.log(styles.muted(` Color: ${phase.color}`));
157
+ }
158
+ if (phase.description) {
159
+ this.log(styles.muted(` Description: ${phase.description}`));
160
+ }
161
+ if (phase.isDefault) {
162
+ this.log(styles.muted(` Default: Yes`));
163
+ }
122
164
  }
123
165
  }
@@ -7,6 +7,7 @@ export default class PhaseDelete extends PMOCommand {
7
7
  };
8
8
  static flags: {
9
9
  force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
+ machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
11
  json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
11
12
  project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
12
13
  };
@@ -1,8 +1,8 @@
1
1
  import { Args, Flags } from '@oclif/core';
2
- import inquirer from 'inquirer';
3
2
  import { PMOCommand, pmoBaseFlags } from '../../lib/pmo/index.js';
4
3
  import { styles } from '../../lib/styles.js';
5
- import { shouldOutputJson, outputPromptAsJson, outputErrorAsJson, createMetadata, buildPromptConfig, } from '../../lib/prompt-json.js';
4
+ import { shouldOutputJson, outputErrorAsJson, createMetadata, } from '../../lib/prompt-json.js';
5
+ import { FlagResolver } from '../../lib/flags/index.js';
6
6
  export default class PhaseDelete extends PMOCommand {
7
7
  static description = 'Delete a project lifecycle phase';
8
8
  static examples = [
@@ -22,10 +22,6 @@ export default class PhaseDelete extends PMOCommand {
22
22
  description: 'Skip confirmation',
23
23
  default: false,
24
24
  }),
25
- json: Flags.boolean({
26
- description: 'Output prompt configuration as JSON (for AI agents/scripts)',
27
- default: false,
28
- }),
29
25
  };
30
26
  getPMOOptions() {
31
27
  return { promptIfMultiple: false };
@@ -47,22 +43,27 @@ export default class PhaseDelete extends PMOCommand {
47
43
  return handleError('PHASE_NOT_FOUND', `Phase "${args.id}" not found.`);
48
44
  }
49
45
  if (!flags.force) {
50
- // In JSON mode, output confirmation prompt
51
- if (jsonMode) {
52
- const confirmChoices = [
53
- { name: 'No', value: 'false' },
54
- { name: 'Yes', value: 'true' },
55
- ];
56
- outputPromptAsJson(buildPromptConfig('list', 'confirmed', `Delete phase "${phase.name}"?`, confirmChoices), createMetadata('phase delete', flags));
57
- return;
58
- }
59
- const { confirm } = await inquirer.prompt([{
60
- type: 'confirm',
61
- name: 'confirm',
62
- message: `Delete phase "${phase.name}"?`,
63
- default: false,
64
- }]);
65
- if (!confirm) {
46
+ // Use FlagResolver for confirmation
47
+ const resolver = new FlagResolver({
48
+ commandName: 'phase delete',
49
+ baseCommand: `prlt phase delete ${args.id}`,
50
+ jsonMode,
51
+ flags: { machine: flags.machine, json: flags.json },
52
+ });
53
+ resolver.addPrompt({
54
+ flagName: 'confirmed',
55
+ type: 'list',
56
+ message: `Delete phase "${phase.name}"?`,
57
+ choices: () => [
58
+ { name: 'No', value: false },
59
+ { name: 'Yes', value: true },
60
+ ],
61
+ getCommand: (value) => value
62
+ ? `prlt phase delete ${args.id} --force --json`
63
+ : '',
64
+ });
65
+ const resolved = await resolver.resolve();
66
+ if (!resolved.confirmed) {
66
67
  this.log(styles.muted('Cancelled.'));
67
68
  return;
68
69
  }
@@ -4,6 +4,7 @@ export default class PhaseList extends PMOCommand {
4
4
  static examples: string[];
5
5
  static flags: {
6
6
  category: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
7
+ machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
7
8
  json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
8
9
  project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
9
10
  };
@@ -2,11 +2,13 @@ import { Flags } from '@oclif/core';
2
2
  import { PMOCommand, pmoBaseFlags } from '../../lib/pmo/index.js';
3
3
  import { styles } from '../../lib/styles.js';
4
4
  import { STATE_CATEGORY_ORDER } from '../../lib/pmo/types.js';
5
+ import { isMachineOutput } from '../../lib/prompt-json.js';
5
6
  export default class PhaseList extends PMOCommand {
6
7
  static description = 'List all project lifecycle phases';
7
8
  static examples = [
8
9
  '<%= config.bin %> <%= command.id %>',
9
10
  '<%= config.bin %> <%= command.id %> --category started',
11
+ '<%= config.bin %> <%= command.id %> --machine',
10
12
  '<%= config.bin %> <%= command.id %> --json',
11
13
  ];
12
14
  static flags = {
@@ -16,15 +18,11 @@ export default class PhaseList extends PMOCommand {
16
18
  description: 'Filter by category',
17
19
  options: ['backlog', 'unstarted', 'started', 'completed', 'canceled'],
18
20
  }),
19
- json: Flags.boolean({
20
- description: 'Output as JSON',
21
- default: false,
22
- }),
23
21
  };
24
22
  async execute() {
25
23
  const { flags } = await this.parse(PhaseList);
26
24
  const phases = await this.storage.listPhases(flags.category ? { category: flags.category } : undefined);
27
- if (flags.json) {
25
+ if (isMachineOutput(flags)) {
28
26
  this.log(JSON.stringify(phases, null, 2));
29
27
  return;
30
28
  }
@@ -7,6 +7,7 @@ export default class PhaseMove extends PMOCommand {
7
7
  };
8
8
  static flags: {
9
9
  position: import("@oclif/core/interfaces").OptionFlag<number | undefined, import("@oclif/core/interfaces").CustomOptions>;
10
+ machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
11
  json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
11
12
  project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
12
13
  };
@@ -1,8 +1,8 @@
1
1
  import { Args, Flags } from '@oclif/core';
2
- import inquirer from 'inquirer';
3
2
  import { PMOCommand, pmoBaseFlags } from '../../lib/pmo/index.js';
4
3
  import { styles } from '../../lib/styles.js';
5
- import { shouldOutputJson, outputPromptAsJson, outputErrorAsJson, createMetadata, buildPromptConfig, } from '../../lib/prompt-json.js';
4
+ import { shouldOutputJson, outputErrorAsJson, createMetadata, } from '../../lib/prompt-json.js';
5
+ import { FlagResolver } from '../../lib/flags/index.js';
6
6
  export default class PhaseMove extends PMOCommand {
7
7
  static description = 'Change the position of a phase within its category';
8
8
  static examples = [
@@ -23,10 +23,6 @@ export default class PhaseMove extends PMOCommand {
23
23
  description: 'New position (0-indexed)',
24
24
  required: false,
25
25
  }),
26
- json: Flags.boolean({
27
- description: 'Output prompt configuration as JSON (for AI agents/scripts)',
28
- default: false,
29
- }),
30
26
  };
31
27
  getPMOOptions() {
32
28
  return { promptIfMultiple: false };
@@ -50,25 +46,28 @@ export default class PhaseMove extends PMOCommand {
50
46
  if (phases.length === 0) {
51
47
  return handleError('NO_PHASES', 'No phases found. Create a phase first with "prlt phase create".');
52
48
  }
53
- // In JSON mode, output phase selection prompt
54
- if (jsonMode) {
55
- const phaseChoices = phases.map(p => ({
49
+ const idResolver = new FlagResolver({
50
+ commandName: 'phase move',
51
+ baseCommand: 'prlt phase move',
52
+ jsonMode,
53
+ flags: { machine: flags.machine, json: flags.json },
54
+ });
55
+ idResolver.addPrompt({
56
+ flagName: 'phaseId',
57
+ type: 'list',
58
+ message: 'Select phase to move:',
59
+ choices: () => phases.map(p => ({
56
60
  name: `${p.name} (${p.category}, position ${p.position})`,
57
61
  value: p.id,
58
- }));
59
- outputPromptAsJson(buildPromptConfig('list', 'phaseId', 'Select phase to move:', phaseChoices), createMetadata('phase move', flags));
60
- return;
62
+ })),
63
+ // Use positional arg format for phase ID
64
+ getCommand: (value) => `prlt phase move ${value} --json`,
65
+ });
66
+ const resolved = await idResolver.resolve();
67
+ if (!resolved.phaseId) {
68
+ return; // Cancelled
61
69
  }
62
- const { selectedId } = await inquirer.prompt([{
63
- type: 'list',
64
- name: 'selectedId',
65
- message: 'Select phase to move:',
66
- choices: phases.map(p => ({
67
- name: `${p.name} (${p.category}, position ${p.position})`,
68
- value: p.id,
69
- })),
70
- }]);
71
- phaseId = selectedId;
70
+ phaseId = resolved.phaseId;
72
71
  }
73
72
  const phase = await this.storage.getPhase(phaseId);
74
73
  if (!phase) {
@@ -80,26 +79,27 @@ export default class PhaseMove extends PMOCommand {
80
79
  // Get phases in the same category to show valid positions
81
80
  const phases = await this.storage.listPhases();
82
81
  const categoryPhases = phases.filter(p => p.category === phase.category);
83
- // In JSON mode, output position selection prompt
84
- if (jsonMode) {
85
- const positionChoices = categoryPhases.map((_, idx) => ({
82
+ const posResolver = new FlagResolver({
83
+ commandName: 'phase move',
84
+ baseCommand: `prlt phase move ${phaseId}`,
85
+ jsonMode,
86
+ flags: { machine: flags.machine, json: flags.json },
87
+ });
88
+ posResolver.addPrompt({
89
+ flagName: 'position',
90
+ type: 'list',
91
+ message: `New position within ${phase.category} (currently ${phase.position}):`,
92
+ choices: () => categoryPhases.map((_, idx) => ({
86
93
  name: `Position ${idx}${idx === phase.position ? ' (current)' : ''}`,
87
94
  value: String(idx),
88
- }));
89
- outputPromptAsJson(buildPromptConfig('list', 'position', `New position within ${phase.category} (currently ${phase.position}):`, positionChoices), createMetadata('phase move', flags));
90
- return;
95
+ })),
96
+ default: String(phase.position),
97
+ });
98
+ const resolved = await posResolver.resolve();
99
+ if (!resolved.position) {
100
+ return; // Cancelled
91
101
  }
92
- const { position } = await inquirer.prompt([{
93
- type: 'list',
94
- name: 'position',
95
- message: `New position within ${phase.category} (currently ${phase.position}):`,
96
- choices: categoryPhases.map((_, idx) => ({
97
- name: `Position ${idx}${idx === phase.position ? ' (current)' : ''}`,
98
- value: idx,
99
- })),
100
- default: phase.position,
101
- }]);
102
- newPosition = position;
102
+ newPosition = parseInt(resolved.position, 10);
103
103
  }
104
104
  if (newPosition < 0) {
105
105
  this.error('Position must be >= 0');
@@ -8,6 +8,7 @@ export default class PhaseTemplateApply extends PMOCommand {
8
8
  static flags: {
9
9
  force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
10
  json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
11
+ machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
11
12
  project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
12
13
  };
13
14
  protected getPMOOptions(): {
@@ -7,6 +7,8 @@ export default class PhaseTemplateCreate extends PMOCommand {
7
7
  };
8
8
  static flags: {
9
9
  description: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
10
+ machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
11
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
12
  project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
11
13
  };
12
14
  protected getPMOOptions(): {
@@ -8,6 +8,7 @@ export default class PhaseTemplateDelete extends PMOCommand {
8
8
  static flags: {
9
9
  force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
10
  json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
11
+ machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
11
12
  project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
12
13
  };
13
14
  protected getPMOOptions(): {
@@ -5,6 +5,7 @@ export default class PhaseTemplateMenu extends PMOCommand {
5
5
  static examples: string[];
6
6
  static flags: {
7
7
  json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
8
+ machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
8
9
  project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
9
10
  };
10
11
  protected getPMOOptions(): {
@@ -6,6 +6,7 @@ export default class PhaseTemplateList extends PMOCommand {
6
6
  builtin: import("@oclif/core/interfaces").BooleanFlag<boolean>;
7
7
  custom: import("@oclif/core/interfaces").BooleanFlag<boolean>;
8
8
  json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
9
+ machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
9
10
  project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
10
11
  };
11
12
  protected getPMOOptions(): {
@@ -8,6 +8,8 @@ export default class PhaseTemplateUpdate extends PMOCommand {
8
8
  static flags: {
9
9
  name: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
10
10
  description: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
11
+ machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
12
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
11
13
  project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
12
14
  };
13
15
  protected getPMOOptions(): {
@@ -12,6 +12,7 @@ export default class PhaseUpdate extends PMOCommand {
12
12
  description: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
13
13
  default: import("@oclif/core/interfaces").BooleanFlag<boolean>;
14
14
  interactive: import("@oclif/core/interfaces").BooleanFlag<boolean>;
15
+ machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
15
16
  json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
16
17
  project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
17
18
  };
@@ -19,5 +20,4 @@ export default class PhaseUpdate extends PMOCommand {
19
20
  promptIfMultiple: boolean;
20
21
  };
21
22
  execute(): Promise<void>;
22
- private promptUpdates;
23
23
  }