@proletariat/cli 0.3.33 → 0.3.34

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 (308) hide show
  1. package/dist/commands/action/create.d.ts +1 -0
  2. package/dist/commands/action/delete.d.ts +1 -0
  3. package/dist/commands/action/index.d.ts +1 -0
  4. package/dist/commands/action/list.d.ts +1 -0
  5. package/dist/commands/action/list.js +0 -6
  6. package/dist/commands/action/run.d.ts +1 -0
  7. package/dist/commands/action/show.d.ts +1 -0
  8. package/dist/commands/action/update.d.ts +1 -0
  9. package/dist/commands/agent/auth.d.ts +2 -1
  10. package/dist/commands/agent/auth.js +2 -6
  11. package/dist/commands/agent/cleanup.d.ts +2 -1
  12. package/dist/commands/agent/cleanup.js +0 -6
  13. package/dist/commands/agent/discover.d.ts +2 -1
  14. package/dist/commands/agent/discover.js +2 -6
  15. package/dist/commands/agent/index.d.ts +1 -0
  16. package/dist/commands/agent/index.js +0 -7
  17. package/dist/commands/agent/list.d.ts +1 -0
  18. package/dist/commands/agent/login.d.ts +1 -0
  19. package/dist/commands/agent/login.js +1 -7
  20. package/dist/commands/agent/rebuild.d.ts +2 -1
  21. package/dist/commands/agent/rebuild.js +0 -6
  22. package/dist/commands/agent/remove.d.ts +2 -1
  23. package/dist/commands/agent/remove.js +0 -6
  24. package/dist/commands/agent/restart.d.ts +1 -0
  25. package/dist/commands/agent/restart.js +1 -7
  26. package/dist/commands/agent/shell.d.ts +1 -0
  27. package/dist/commands/agent/shell.js +1 -7
  28. package/dist/commands/agent/status.d.ts +1 -0
  29. package/dist/commands/agent/status.js +1 -7
  30. package/dist/commands/agent/visit.d.ts +1 -0
  31. package/dist/commands/agent/visit.js +1 -7
  32. package/dist/commands/autocomplete/setup.d.ts +1 -0
  33. package/dist/commands/board/index.d.ts +1 -0
  34. package/dist/commands/board/view.d.ts +1 -0
  35. package/dist/commands/board/watch.d.ts +1 -0
  36. package/dist/commands/branch/create.d.ts +1 -0
  37. package/dist/commands/branch/create.js +0 -6
  38. package/dist/commands/branch/index.d.ts +1 -0
  39. package/dist/commands/branch/index.js +0 -7
  40. package/dist/commands/branch/list.d.ts +1 -0
  41. package/dist/commands/branch/validate.d.ts +1 -0
  42. package/dist/commands/branch/where.d.ts +1 -0
  43. package/dist/commands/branch/where.js +3 -9
  44. package/dist/commands/category/create.d.ts +1 -0
  45. package/dist/commands/category/delete.d.ts +1 -0
  46. package/dist/commands/category/index.d.ts +1 -0
  47. package/dist/commands/category/list.d.ts +1 -0
  48. package/dist/commands/category/list.js +1 -1
  49. package/dist/commands/category/rename.d.ts +1 -0
  50. package/dist/commands/claude.d.ts +2 -1
  51. package/dist/commands/claude.js +2 -6
  52. package/dist/commands/commit.d.ts +2 -1
  53. package/dist/commands/commit.js +2 -6
  54. package/dist/commands/config/index.d.ts +2 -1
  55. package/dist/commands/config/index.js +3 -7
  56. package/dist/commands/diet.d.ts +1 -0
  57. package/dist/commands/docker/clean.d.ts +1 -0
  58. package/dist/commands/docker/index.d.ts +1 -0
  59. package/dist/commands/docker/list.d.ts +1 -0
  60. package/dist/commands/docker/logs.d.ts +2 -0
  61. package/dist/commands/docker/logs.js +2 -0
  62. package/dist/commands/docker/prune.d.ts +1 -0
  63. package/dist/commands/docker/restart.d.ts +1 -0
  64. package/dist/commands/docker/shell.d.ts +2 -0
  65. package/dist/commands/docker/shell.js +2 -0
  66. package/dist/commands/docker/start.d.ts +2 -0
  67. package/dist/commands/docker/start.js +2 -0
  68. package/dist/commands/docker/status.d.ts +1 -0
  69. package/dist/commands/docker/stop.d.ts +1 -0
  70. package/dist/commands/epic/activate.d.ts +1 -0
  71. package/dist/commands/epic/activate.js +1 -7
  72. package/dist/commands/epic/archive.d.ts +2 -1
  73. package/dist/commands/epic/archive.js +0 -6
  74. package/dist/commands/epic/create.d.ts +2 -1
  75. package/dist/commands/epic/create.js +0 -6
  76. package/dist/commands/epic/delete.d.ts +1 -0
  77. package/dist/commands/epic/index.d.ts +1 -0
  78. package/dist/commands/epic/index.js +0 -7
  79. package/dist/commands/epic/list.d.ts +1 -0
  80. package/dist/commands/epic/move.d.ts +2 -1
  81. package/dist/commands/epic/move.js +0 -6
  82. package/dist/commands/epic/progress.d.ts +2 -1
  83. package/dist/commands/epic/progress.js +0 -6
  84. package/dist/commands/epic/project.d.ts +2 -1
  85. package/dist/commands/epic/project.js +0 -6
  86. package/dist/commands/epic/reorder.d.ts +1 -0
  87. package/dist/commands/epic/reorder.js +0 -6
  88. package/dist/commands/epic/spec.d.ts +2 -1
  89. package/dist/commands/epic/spec.js +0 -6
  90. package/dist/commands/epic/ticket.d.ts +2 -1
  91. package/dist/commands/epic/ticket.js +0 -6
  92. package/dist/commands/epic/view.d.ts +1 -0
  93. package/dist/commands/epic/view.js +1 -7
  94. package/dist/commands/execution/config.d.ts +2 -1
  95. package/dist/commands/execution/config.js +1 -7
  96. package/dist/commands/execution/index.d.ts +1 -0
  97. package/dist/commands/execution/index.js +1 -8
  98. package/dist/commands/execution/list.d.ts +1 -0
  99. package/dist/commands/execution/logs.d.ts +1 -0
  100. package/dist/commands/execution/logs.js +1 -7
  101. package/dist/commands/execution/stop.d.ts +1 -0
  102. package/dist/commands/execution/stop.js +1 -7
  103. package/dist/commands/execution/view.d.ts +1 -0
  104. package/dist/commands/execution/view.js +2 -8
  105. package/dist/commands/feedback/index.d.ts +1 -0
  106. package/dist/commands/feedback/list.d.ts +1 -0
  107. package/dist/commands/feedback/submit.d.ts +1 -0
  108. package/dist/commands/feedback/view.d.ts +1 -0
  109. package/dist/commands/gh/index.d.ts +1 -0
  110. package/dist/commands/gh/login.d.ts +1 -0
  111. package/dist/commands/gh/status.d.ts +1 -0
  112. package/dist/commands/gh/token.d.ts +1 -0
  113. package/dist/commands/init.d.ts +2 -1
  114. package/dist/commands/init.js +3 -8
  115. package/dist/commands/link/create.d.ts +1 -0
  116. package/dist/commands/link/create.js +0 -6
  117. package/dist/commands/link/index.d.ts +1 -0
  118. package/dist/commands/link/index.js +1 -7
  119. package/dist/commands/link/list.d.ts +1 -0
  120. package/dist/commands/link/list.js +0 -6
  121. package/dist/commands/link/remove.d.ts +1 -0
  122. package/dist/commands/link/remove.js +0 -6
  123. package/dist/commands/phase/create.d.ts +1 -0
  124. package/dist/commands/phase/create.js +1 -1
  125. package/dist/commands/phase/delete.d.ts +1 -0
  126. package/dist/commands/phase/delete.js +1 -1
  127. package/dist/commands/phase/list.d.ts +1 -0
  128. package/dist/commands/phase/move.d.ts +1 -0
  129. package/dist/commands/phase/move.js +2 -2
  130. package/dist/commands/phase/update.d.ts +1 -0
  131. package/dist/commands/phase/update.js +2 -2
  132. package/dist/commands/pmo/init.d.ts +4 -3
  133. package/dist/commands/pmo/init.js +2 -7
  134. package/dist/commands/pr/create.d.ts +1 -0
  135. package/dist/commands/pr/index.d.ts +1 -0
  136. package/dist/commands/pr/link.d.ts +1 -0
  137. package/dist/commands/pr/list.d.ts +1 -0
  138. package/dist/commands/pr/status.d.ts +1 -0
  139. package/dist/commands/priority/add.d.ts +1 -0
  140. package/dist/commands/priority/list.d.ts +1 -0
  141. package/dist/commands/priority/remove.d.ts +1 -0
  142. package/dist/commands/priority/set.d.ts +1 -0
  143. package/dist/commands/project/archive.d.ts +1 -0
  144. package/dist/commands/project/create.d.ts +1 -0
  145. package/dist/commands/project/delete.d.ts +1 -0
  146. package/dist/commands/project/index.d.ts +1 -0
  147. package/dist/commands/project/list.d.ts +1 -0
  148. package/dist/commands/project/spec.d.ts +1 -0
  149. package/dist/commands/project/unarchive.d.ts +1 -0
  150. package/dist/commands/project/update.d.ts +1 -0
  151. package/dist/commands/project/view.d.ts +1 -0
  152. package/dist/commands/pull.d.ts +1 -0
  153. package/dist/commands/repo/add.d.ts +1 -0
  154. package/dist/commands/repo/add.js +0 -6
  155. package/dist/commands/repo/create.d.ts +1 -0
  156. package/dist/commands/repo/index.d.ts +1 -0
  157. package/dist/commands/repo/list.d.ts +1 -0
  158. package/dist/commands/repo/remove.d.ts +1 -0
  159. package/dist/commands/repo/view.d.ts +1 -0
  160. package/dist/commands/roadmap/add-project.d.ts +1 -0
  161. package/dist/commands/roadmap/add-project.js +0 -6
  162. package/dist/commands/roadmap/create.d.ts +1 -0
  163. package/dist/commands/roadmap/create.js +0 -6
  164. package/dist/commands/roadmap/delete.d.ts +1 -0
  165. package/dist/commands/roadmap/delete.js +0 -6
  166. package/dist/commands/roadmap/generate.d.ts +1 -0
  167. package/dist/commands/roadmap/generate.js +0 -6
  168. package/dist/commands/roadmap/index.d.ts +1 -0
  169. package/dist/commands/roadmap/index.js +0 -7
  170. package/dist/commands/roadmap/list.d.ts +1 -0
  171. package/dist/commands/roadmap/remove-project.d.ts +1 -0
  172. package/dist/commands/roadmap/remove-project.js +0 -6
  173. package/dist/commands/roadmap/reorder.d.ts +1 -0
  174. package/dist/commands/roadmap/reorder.js +0 -6
  175. package/dist/commands/roadmap/update.d.ts +1 -0
  176. package/dist/commands/roadmap/update.js +0 -6
  177. package/dist/commands/roadmap/view.d.ts +1 -0
  178. package/dist/commands/roadmap/view.js +1 -7
  179. package/dist/commands/session/attach.d.ts +2 -1
  180. package/dist/commands/session/attach.js +0 -6
  181. package/dist/commands/session/health.d.ts +1 -0
  182. package/dist/commands/session/index.d.ts +1 -0
  183. package/dist/commands/session/index.js +0 -7
  184. package/dist/commands/session/list.d.ts +1 -0
  185. package/dist/commands/spec/create.d.ts +1 -0
  186. package/dist/commands/spec/delete.d.ts +1 -0
  187. package/dist/commands/spec/edit.d.ts +1 -0
  188. package/dist/commands/spec/index.d.ts +1 -0
  189. package/dist/commands/spec/list.d.ts +1 -0
  190. package/dist/commands/spec/plan.d.ts +1 -0
  191. package/dist/commands/spec/ticket.d.ts +1 -0
  192. package/dist/commands/spec/view.d.ts +1 -0
  193. package/dist/commands/staff/add.d.ts +3 -2
  194. package/dist/commands/staff/add.js +2 -6
  195. package/dist/commands/staff/index.d.ts +2 -1
  196. package/dist/commands/staff/index.js +0 -6
  197. package/dist/commands/staff/list.d.ts +1 -0
  198. package/dist/commands/staff/remove.d.ts +2 -1
  199. package/dist/commands/staff/remove.js +0 -6
  200. package/dist/commands/status/category.d.ts +1 -0
  201. package/dist/commands/status/create.d.ts +1 -0
  202. package/dist/commands/status/delete.d.ts +1 -0
  203. package/dist/commands/status/index.d.ts +1 -0
  204. package/dist/commands/status/list.d.ts +1 -0
  205. package/dist/commands/status/move.d.ts +1 -0
  206. package/dist/commands/status/update.d.ts +1 -0
  207. package/dist/commands/support/book.d.ts +1 -0
  208. package/dist/commands/support/discord.d.ts +1 -0
  209. package/dist/commands/support/docs.d.ts +1 -0
  210. package/dist/commands/support/index.d.ts +1 -0
  211. package/dist/commands/support/issues.d.ts +1 -0
  212. package/dist/commands/support/logs.d.ts +1 -0
  213. package/dist/commands/template/apply.d.ts +1 -0
  214. package/dist/commands/template/apply.js +0 -6
  215. package/dist/commands/template/create.d.ts +1 -0
  216. package/dist/commands/template/create.js +0 -6
  217. package/dist/commands/template/delete.d.ts +1 -0
  218. package/dist/commands/template/delete.js +0 -6
  219. package/dist/commands/template/index.d.ts +1 -0
  220. package/dist/commands/template/index.js +2 -7
  221. package/dist/commands/template/list.d.ts +1 -0
  222. package/dist/commands/template/list.js +1 -7
  223. package/dist/commands/template/save.d.ts +1 -0
  224. package/dist/commands/template/save.js +0 -6
  225. package/dist/commands/template/update.d.ts +1 -0
  226. package/dist/commands/template/update.js +0 -6
  227. package/dist/commands/terminal/title.d.ts +1 -0
  228. package/dist/commands/theme/index.d.ts +1 -0
  229. package/dist/commands/theme/index.js +2 -7
  230. package/dist/commands/theme/list.d.ts +1 -0
  231. package/dist/commands/theme/set.d.ts +1 -0
  232. package/dist/commands/theme/set.js +3 -7
  233. package/dist/commands/ticket/bulk.d.ts +1 -0
  234. package/dist/commands/ticket/bulk.js +0 -7
  235. package/dist/commands/ticket/category.d.ts +1 -0
  236. package/dist/commands/ticket/complete.d.ts +2 -1
  237. package/dist/commands/ticket/complete.js +2 -8
  238. package/dist/commands/ticket/create.d.ts +2 -1
  239. package/dist/commands/ticket/create.js +0 -6
  240. package/dist/commands/ticket/delete.d.ts +2 -1
  241. package/dist/commands/ticket/delete.js +0 -6
  242. package/dist/commands/ticket/edit.d.ts +1 -0
  243. package/dist/commands/ticket/edit.js +0 -6
  244. package/dist/commands/ticket/epic.d.ts +2 -1
  245. package/dist/commands/ticket/epic.js +0 -6
  246. package/dist/commands/ticket/index.d.ts +1 -0
  247. package/dist/commands/ticket/index.js +6 -9
  248. package/dist/commands/ticket/list.d.ts +1 -0
  249. package/dist/commands/ticket/move.d.ts +2 -1
  250. package/dist/commands/ticket/move.js +2 -8
  251. package/dist/commands/ticket/project.d.ts +2 -1
  252. package/dist/commands/ticket/project.js +0 -6
  253. package/dist/commands/ticket/reassign.d.ts +2 -1
  254. package/dist/commands/ticket/reassign.js +0 -6
  255. package/dist/commands/ticket/resolve.d.ts +68 -0
  256. package/dist/commands/ticket/resolve.js +294 -0
  257. package/dist/commands/ticket/spec.d.ts +2 -1
  258. package/dist/commands/ticket/spec.js +0 -6
  259. package/dist/commands/ticket/status.d.ts +1 -0
  260. package/dist/commands/ticket/status.js +1 -7
  261. package/dist/commands/ticket/update.d.ts +2 -1
  262. package/dist/commands/ticket/update.js +0 -6
  263. package/dist/commands/ticket/view.d.ts +1 -0
  264. package/dist/commands/ticket/view.js +1 -7
  265. package/dist/commands/whoami.d.ts +1 -0
  266. package/dist/commands/work/complete.d.ts +1 -0
  267. package/dist/commands/work/complete.js +1 -7
  268. package/dist/commands/work/index.d.ts +1 -0
  269. package/dist/commands/work/index.js +4 -7
  270. package/dist/commands/work/ready.d.ts +2 -1
  271. package/dist/commands/work/ready.js +21 -14
  272. package/dist/commands/work/resolve.d.ts +15 -0
  273. package/dist/commands/work/resolve.js +76 -0
  274. package/dist/commands/work/revise.d.ts +2 -1
  275. package/dist/commands/work/revise.js +0 -6
  276. package/dist/commands/work/spawn-all.d.ts +2 -1
  277. package/dist/commands/work/spawn-all.js +2 -6
  278. package/dist/commands/work/spawn.d.ts +2 -1
  279. package/dist/commands/work/spawn.js +0 -6
  280. package/dist/commands/work/start.d.ts +2 -1
  281. package/dist/commands/work/start.js +0 -6
  282. package/dist/commands/work/watch.d.ts +2 -1
  283. package/dist/commands/work/watch.js +0 -6
  284. package/dist/commands/workflow/create.d.ts +1 -0
  285. package/dist/commands/workflow/delete.d.ts +1 -0
  286. package/dist/commands/workflow/index.d.ts +1 -0
  287. package/dist/commands/workflow/index.js +1 -7
  288. package/dist/commands/workflow/list.d.ts +1 -0
  289. package/dist/commands/workflow/switch.d.ts +1 -0
  290. package/dist/commands/workflow/view.d.ts +1 -0
  291. package/dist/commands/workspace/add.d.ts +2 -0
  292. package/dist/commands/workspace/add.js +2 -0
  293. package/dist/commands/workspace/list.d.ts +1 -0
  294. package/dist/commands/workspace/list.js +4 -8
  295. package/dist/commands/workspace/prune.d.ts +1 -0
  296. package/dist/commands/workspace/prune.js +4 -6
  297. package/dist/commands/workspace/remove.d.ts +1 -0
  298. package/dist/commands/workspace/remove.js +3 -7
  299. package/dist/commands/workspace/use.d.ts +1 -0
  300. package/dist/commands/workspace/use.js +3 -7
  301. package/dist/lib/database/drizzle-schema.d.ts +1 -1
  302. package/dist/lib/pmo/base-command.d.ts +4 -1
  303. package/dist/lib/pmo/base-command.js +9 -3
  304. package/dist/lib/pmo/storage/base.js +69 -5
  305. package/dist/lib/prompt-json.d.ts +5 -2
  306. package/dist/lib/prompt-json.js +4 -4
  307. package/oclif.manifest.json +4208 -3427
  308. package/package.json +1 -1
@@ -1,4 +1,3 @@
1
- import { Flags } from '@oclif/core';
2
1
  import inquirer from 'inquirer';
3
2
  import { PMOCommand, pmoBaseFlags } from '../../lib/pmo/index.js';
4
3
  import { shouldOutputJson, outputPromptAsJson, createMetadata, buildPromptConfig, } from '../../lib/prompt-json.js';
@@ -9,12 +8,6 @@ export default class Ticket extends PMOCommand {
9
8
  ];
10
9
  static flags = {
11
10
  ...pmoBaseFlags,
12
- json: Flags.boolean({
13
- char: 'm',
14
- aliases: ['machine'],
15
- description: 'Output prompt configuration as JSON (for AI agents/scripts)',
16
- default: false,
17
- }),
18
11
  };
19
12
  getPMOOptions() {
20
13
  return { promptIfMultiple: false };
@@ -35,6 +28,7 @@ export default class Ticket extends PMOCommand {
35
28
  { name: 'Move to different project', value: 'project', command: 'prlt ticket project --json' },
36
29
  { name: 'Assign to epic', value: 'epic', command: 'prlt ticket epic --json' },
37
30
  { name: 'Assign to spec', value: 'spec', command: 'prlt ticket spec --json' },
31
+ { name: 'Resolve questions', value: 'resolve', command: 'prlt ticket resolve --json' },
38
32
  { name: 'Manage dependencies', value: 'link', command: 'prlt link list --json' },
39
33
  { name: 'Manage templates', value: 'templates', command: 'prlt template --json' },
40
34
  { name: 'Delete ticket', value: 'delete', command: 'prlt ticket delete --json' },
@@ -52,11 +46,11 @@ export default class Ticket extends PMOCommand {
52
46
  name: 'action',
53
47
  message: '🎫 ' + message,
54
48
  choices: [
55
- ...menuChoices.slice(0, 10),
49
+ ...menuChoices.slice(0, 11),
56
50
  new inquirer.Separator('──────────────'),
57
- menuChoices[10],
58
51
  menuChoices[11],
59
52
  menuChoices[12],
53
+ menuChoices[13],
60
54
  ],
61
55
  }]);
62
56
  if (action === 'cancel') {
@@ -91,6 +85,9 @@ export default class Ticket extends PMOCommand {
91
85
  case 'spec':
92
86
  await this.config.runCommand('ticket:spec', []);
93
87
  break;
88
+ case 'resolve':
89
+ await this.config.runCommand('ticket:resolve', []);
90
+ break;
94
91
  case 'link':
95
92
  await this.config.runCommand('link', []);
96
93
  break;
@@ -15,6 +15,7 @@ export default class TicketList extends Command {
15
15
  limit: import("@oclif/core/interfaces").OptionFlag<number | undefined, import("@oclif/core/interfaces").CustomOptions>;
16
16
  offset: import("@oclif/core/interfaces").OptionFlag<number | undefined, import("@oclif/core/interfaces").CustomOptions>;
17
17
  json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
18
+ machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
18
19
  project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
19
20
  };
20
21
  run(): Promise<void>;
@@ -7,11 +7,12 @@ export default class TicketMove extends PMOCommand {
7
7
  column: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
8
8
  };
9
9
  static flags: {
10
- json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
11
10
  position: import("@oclif/core/interfaces").OptionFlag<number | undefined, import("@oclif/core/interfaces").CustomOptions>;
12
11
  'to-project': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
13
12
  bulk: import("@oclif/core/interfaces").BooleanFlag<boolean>;
14
13
  force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
14
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
15
+ machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
15
16
  project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
16
17
  };
17
18
  execute(): Promise<void>;
@@ -24,12 +24,6 @@ export default class TicketMove extends PMOCommand {
24
24
  };
25
25
  static flags = {
26
26
  ...pmoBaseFlags,
27
- json: Flags.boolean({
28
- char: 'm',
29
- aliases: ['machine'],
30
- description: 'Output prompt configuration as JSON (for AI agents/scripts)',
31
- default: false,
32
- }),
33
27
  position: Flags.integer({
34
28
  description: 'Position within the column (0 = top)',
35
29
  }),
@@ -212,7 +206,7 @@ export default class TicketMove extends PMOCommand {
212
206
  }
213
207
  async executeBulk(allTickets, flags, projectId) {
214
208
  // Only show header in interactive mode
215
- if (!flags.json) {
209
+ if (!(flags.json || flags.machine)) {
216
210
  this.log(styles.emphasis('📦 Move Multiple Tickets\n'));
217
211
  }
218
212
  // Get columns
@@ -222,7 +216,7 @@ export default class TicketMove extends PMOCommand {
222
216
  }
223
217
  const columns = board.columns.map(col => col.name);
224
218
  // Agent mode config for prompts
225
- const jsonModeConfig = flags.json ? { flags, commandName: 'ticket move --bulk' } : null;
219
+ const jsonModeConfig = (flags.json || flags.machine) ? { flags, commandName: 'ticket move --bulk' } : null;
226
220
  // Select tickets to move (now agent-compatible!)
227
221
  const { selectedTickets } = await this.prompt([{
228
222
  type: 'checkbox',
@@ -7,10 +7,11 @@ export default class TicketProject extends PMOCommand {
7
7
  targetProject: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
8
8
  };
9
9
  static flags: {
10
- json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
11
10
  'keep-epic': import("@oclif/core/interfaces").BooleanFlag<boolean>;
12
11
  bulk: import("@oclif/core/interfaces").BooleanFlag<boolean>;
13
12
  target: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
13
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
14
+ machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
14
15
  project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
15
16
  };
16
17
  execute(): Promise<void>;
@@ -22,12 +22,6 @@ export default class TicketProject extends PMOCommand {
22
22
  };
23
23
  static flags = {
24
24
  ...pmoBaseFlags,
25
- json: Flags.boolean({
26
- char: 'm',
27
- aliases: ['machine'],
28
- description: 'Output prompt configuration as JSON (for AI agents/scripts)',
29
- default: false,
30
- }),
31
25
  'keep-epic': Flags.boolean({
32
26
  description: 'Keep ticket assigned to its epic (if epic is in source project, will unlink)',
33
27
  default: false,
@@ -7,11 +7,12 @@ export default class TicketReassign extends PMOCommand {
7
7
  assignee: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
8
8
  };
9
9
  static flags: {
10
- json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
11
10
  to: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
12
11
  from: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
13
12
  bulk: import("@oclif/core/interfaces").BooleanFlag<boolean>;
14
13
  force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
14
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
15
+ machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
15
16
  project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
16
17
  };
17
18
  execute(): Promise<void>;
@@ -24,12 +24,6 @@ export default class TicketReassign extends PMOCommand {
24
24
  };
25
25
  static flags = {
26
26
  ...pmoBaseFlags,
27
- json: Flags.boolean({
28
- char: 'm',
29
- aliases: ['machine'],
30
- description: 'Output prompt configuration as JSON (for AI agents/scripts)',
31
- default: false,
32
- }),
33
27
  to: Flags.string({
34
28
  description: 'Target agent name (for bulk mode)',
35
29
  }),
@@ -0,0 +1,68 @@
1
+ import { PMOCommand } from '../../lib/pmo/index.js';
2
+ /**
3
+ * Canonical question format regex for parsing Q1/Q2/etc from descriptions.
4
+ *
5
+ * Matches patterns like:
6
+ * **Q1:** What should the timeout be?
7
+ * **Q2:** Should we use REST or GraphQL?
8
+ * Q1: What should the timeout be?
9
+ * Q3: How should errors be handled?
10
+ *
11
+ * Captures:
12
+ * - Group 1: Question number (e.g., "1", "2")
13
+ * - Group 2: Question text
14
+ */
15
+ export declare const QUESTION_REGEX: RegExp;
16
+ /**
17
+ * Canonical answer format for resolved questions.
18
+ *
19
+ * Matches patterns like:
20
+ * **A1:** Use 30 minute timeout
21
+ * A1: Use 30 minute timeout
22
+ */
23
+ export declare const ANSWER_REGEX: RegExp;
24
+ export interface ParsedQuestion {
25
+ /** Question number (e.g., 1, 2, 3) */
26
+ number: number;
27
+ /** The question text */
28
+ text: string;
29
+ /** Line index in the description where the question appears */
30
+ lineIndex: number;
31
+ /** Whether this question already has an answer */
32
+ answered: boolean;
33
+ }
34
+ /**
35
+ * Parse questions (Q1/Q2/etc) from a ticket description.
36
+ *
37
+ * @param description - The ticket description markdown
38
+ * @returns Array of parsed questions
39
+ */
40
+ export declare function parseQuestions(description: string): ParsedQuestion[];
41
+ /**
42
+ * Rewrite a ticket description by injecting answers below each question.
43
+ *
44
+ * For each answered question, inserts a line like:
45
+ * **A1:** The answer text
46
+ *
47
+ * If an answer already exists for that question, it is replaced.
48
+ *
49
+ * @param description - The original ticket description
50
+ * @param answers - Map of question number to answer text
51
+ * @returns The rewritten description
52
+ */
53
+ export declare function rewriteDescription(description: string, answers: Map<number, string>): string;
54
+ export default class TicketResolve extends PMOCommand {
55
+ static description: string;
56
+ static examples: string[];
57
+ static strict: boolean;
58
+ static args: {
59
+ ticketId: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
60
+ };
61
+ static flags: {
62
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
63
+ machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
64
+ project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
65
+ };
66
+ execute(): Promise<void>;
67
+ private resolveTicket;
68
+ }
@@ -0,0 +1,294 @@
1
+ import { Args, Flags } from '@oclif/core';
2
+ import inquirer from 'inquirer';
3
+ import { autoExportToBoard, PMOCommand, pmoBaseFlags } from '../../lib/pmo/index.js';
4
+ import { styles } from '../../lib/styles.js';
5
+ import { shouldOutputJson, outputErrorAsJson, outputSuccessAsJson, createMetadata, } from '../../lib/prompt-json.js';
6
+ /**
7
+ * Canonical question format regex for parsing Q1/Q2/etc from descriptions.
8
+ *
9
+ * Matches patterns like:
10
+ * **Q1:** What should the timeout be?
11
+ * **Q2:** Should we use REST or GraphQL?
12
+ * Q1: What should the timeout be?
13
+ * Q3: How should errors be handled?
14
+ *
15
+ * Captures:
16
+ * - Group 1: Question number (e.g., "1", "2")
17
+ * - Group 2: Question text
18
+ */
19
+ export const QUESTION_REGEX = /^\*{0,2}Q(\d+)[.:]\*{0,2}\s*(.+)$/;
20
+ /**
21
+ * Canonical answer format for resolved questions.
22
+ *
23
+ * Matches patterns like:
24
+ * **A1:** Use 30 minute timeout
25
+ * A1: Use 30 minute timeout
26
+ */
27
+ export const ANSWER_REGEX = /^\*{0,2}A(\d+)[.:]\*{0,2}\s*(.+)$/;
28
+ /**
29
+ * Parse questions (Q1/Q2/etc) from a ticket description.
30
+ *
31
+ * @param description - The ticket description markdown
32
+ * @returns Array of parsed questions
33
+ */
34
+ export function parseQuestions(description) {
35
+ if (!description)
36
+ return [];
37
+ const lines = description.split('\n');
38
+ const questions = [];
39
+ // First pass: find all questions
40
+ for (let i = 0; i < lines.length; i++) {
41
+ const match = lines[i].trim().match(QUESTION_REGEX);
42
+ if (match) {
43
+ questions.push({
44
+ number: parseInt(match[1], 10),
45
+ text: match[2].trim(),
46
+ lineIndex: i,
47
+ answered: false,
48
+ });
49
+ }
50
+ }
51
+ // Second pass: check which questions already have answers
52
+ for (const question of questions) {
53
+ for (let i = 0; i < lines.length; i++) {
54
+ const match = lines[i].trim().match(ANSWER_REGEX);
55
+ if (match && parseInt(match[1], 10) === question.number) {
56
+ question.answered = true;
57
+ break;
58
+ }
59
+ }
60
+ }
61
+ return questions;
62
+ }
63
+ /**
64
+ * Rewrite a ticket description by injecting answers below each question.
65
+ *
66
+ * For each answered question, inserts a line like:
67
+ * **A1:** The answer text
68
+ *
69
+ * If an answer already exists for that question, it is replaced.
70
+ *
71
+ * @param description - The original ticket description
72
+ * @param answers - Map of question number to answer text
73
+ * @returns The rewritten description
74
+ */
75
+ export function rewriteDescription(description, answers) {
76
+ if (!description || answers.size === 0)
77
+ return description;
78
+ const lines = description.split('\n');
79
+ const result = [];
80
+ for (let i = 0; i < lines.length; i++) {
81
+ const trimmed = lines[i].trim();
82
+ // Check if this line is an existing answer that we're replacing
83
+ const answerMatch = trimmed.match(ANSWER_REGEX);
84
+ if (answerMatch) {
85
+ const answerNum = parseInt(answerMatch[1], 10);
86
+ if (answers.has(answerNum)) {
87
+ // Replace this existing answer with the new one
88
+ result.push(`**A${answerNum}:** ${answers.get(answerNum)}`);
89
+ answers.delete(answerNum); // Mark as handled
90
+ continue;
91
+ }
92
+ }
93
+ // Check if this line is a question
94
+ const questionMatch = trimmed.match(QUESTION_REGEX);
95
+ if (questionMatch) {
96
+ const questionNum = parseInt(questionMatch[1], 10);
97
+ result.push(lines[i]); // Keep the question line as-is
98
+ // Check if the next line is already an answer for this question
99
+ const nextLine = i + 1 < lines.length ? lines[i + 1].trim() : '';
100
+ const nextAnswerMatch = nextLine.match(ANSWER_REGEX);
101
+ if (nextAnswerMatch && parseInt(nextAnswerMatch[1], 10) === questionNum) {
102
+ // Next line is the answer - it will be handled in the next iteration
103
+ continue;
104
+ }
105
+ // Insert answer if we have one and it hasn't been handled yet
106
+ if (answers.has(questionNum)) {
107
+ result.push(`**A${questionNum}:** ${answers.get(questionNum)}`);
108
+ answers.delete(questionNum);
109
+ }
110
+ continue;
111
+ }
112
+ result.push(lines[i]);
113
+ }
114
+ return result.join('\n');
115
+ }
116
+ export default class TicketResolve extends PMOCommand {
117
+ static description = 'Resolve ambiguity questions on tickets flagged by groom';
118
+ static examples = [
119
+ '<%= config.bin %> <%= command.id %> TKT-001',
120
+ '<%= config.bin %> <%= command.id %> TKT-001 TKT-002',
121
+ '<%= config.bin %> <%= command.id %> # Interactive picker for needs-clarification tickets',
122
+ ];
123
+ static strict = false;
124
+ static args = {
125
+ ticketId: Args.string({
126
+ description: 'Ticket ID(s) to resolve - prompts with picker if not provided',
127
+ required: false,
128
+ }),
129
+ };
130
+ static flags = {
131
+ ...pmoBaseFlags,
132
+ json: Flags.boolean({
133
+ char: 'm',
134
+ aliases: ['machine'],
135
+ description: 'Output prompt configuration as JSON (for AI agents/scripts)',
136
+ default: false,
137
+ }),
138
+ };
139
+ async execute() {
140
+ const { args, flags, argv } = await this.parse(TicketResolve);
141
+ const projectId = flags.project;
142
+ const jsonMode = shouldOutputJson(flags);
143
+ const handleError = (code, message) => {
144
+ if (jsonMode) {
145
+ outputErrorAsJson(code, message, createMetadata('ticket resolve', flags));
146
+ this.exit(1);
147
+ }
148
+ this.error(message);
149
+ };
150
+ // Collect ticket IDs from argv (supports multiple args)
151
+ let ticketIds = argv.filter(a => !a.startsWith('-'));
152
+ if (ticketIds.length === 0) {
153
+ // No tickets specified - show picker of needs-clarification tickets
154
+ const allTickets = await this.storage.listTickets(projectId);
155
+ const clarificationTickets = allTickets.filter((t) => t.labels.includes('needs-clarification') ||
156
+ t.statusName?.toLowerCase() === 'needs clarification');
157
+ if (clarificationTickets.length === 0) {
158
+ return handleError('NO_TICKETS', 'No tickets need clarification. Run "prlt work start --action groom" to groom tickets first.');
159
+ }
160
+ const selected = await this.selectFromList({
161
+ message: 'Select ticket to resolve:',
162
+ items: clarificationTickets,
163
+ getName: (t) => `${t.id} - ${t.title} (${t.statusName})`,
164
+ getValue: (t) => t.id,
165
+ getCommand: (t) => `prlt ticket resolve ${t.id}${projectId ? ` -P ${projectId}` : ''} --json`,
166
+ jsonMode: jsonMode ? { flags, commandName: 'ticket resolve' } : null,
167
+ });
168
+ if (!selected) {
169
+ return;
170
+ }
171
+ ticketIds = [selected];
172
+ }
173
+ // Process each ticket
174
+ for (const ticketId of ticketIds) {
175
+ // eslint-disable-next-line no-await-in-loop
176
+ await this.resolveTicket(ticketId, jsonMode, flags);
177
+ }
178
+ }
179
+ async resolveTicket(ticketId, jsonMode, flags) {
180
+ const handleError = (code, message) => {
181
+ if (jsonMode) {
182
+ outputErrorAsJson(code, message, createMetadata('ticket resolve', flags));
183
+ this.exit(1);
184
+ }
185
+ this.error(message);
186
+ };
187
+ // Fetch the ticket
188
+ const ticket = await this.storage.getTicket(ticketId);
189
+ if (!ticket) {
190
+ return handleError('TICKET_NOT_FOUND', `Ticket "${ticketId}" not found.`);
191
+ }
192
+ // Parse questions from description
193
+ const questions = parseQuestions(ticket.description || '');
194
+ const unanswered = questions.filter((q) => !q.answered);
195
+ if (unanswered.length === 0) {
196
+ if (questions.length === 0) {
197
+ this.log(styles.warning(`\nNo questions found in ${styles.emphasis(ticketId)}. Nothing to resolve.`));
198
+ }
199
+ else {
200
+ this.log(styles.success(`\nAll questions in ${styles.emphasis(ticketId)} are already answered.`));
201
+ }
202
+ return;
203
+ }
204
+ // JSON mode: output all questions for agent interaction
205
+ if (jsonMode) {
206
+ const questionData = unanswered.map((q) => ({
207
+ number: q.number,
208
+ text: q.text,
209
+ flag: `--a${q.number}`,
210
+ }));
211
+ outputSuccessAsJson({
212
+ ticketId,
213
+ title: ticket.title,
214
+ questions: questionData,
215
+ hint: `Answer questions by running: prlt ticket resolve ${ticketId} --json and providing answers interactively, or use prlt ticket edit to update the description directly.`,
216
+ }, createMetadata('ticket resolve', flags));
217
+ return;
218
+ }
219
+ this.log(styles.title(`\nResolving ${unanswered.length} question(s) for ${styles.emphasis(ticketId)} - ${ticket.title}\n`));
220
+ // Interactive mode: prompt for each answer
221
+ const answers = new Map();
222
+ let cancelled = false;
223
+ for (const question of unanswered) {
224
+ this.log(styles.emphasis(` Q${question.number}: ${question.text}`));
225
+ // eslint-disable-next-line no-await-in-loop
226
+ const { answer } = await inquirer.prompt([
227
+ {
228
+ type: 'input',
229
+ name: 'answer',
230
+ message: ` A${question.number}:`,
231
+ validate: (input) => {
232
+ if (!input.trim())
233
+ return 'Please provide an answer (or type "skip" to skip)';
234
+ return true;
235
+ },
236
+ },
237
+ ]);
238
+ if (answer.toLowerCase() === 'cancel') {
239
+ cancelled = true;
240
+ this.log(styles.warning('\nResolution cancelled.'));
241
+ break;
242
+ }
243
+ if (answer.toLowerCase() !== 'skip') {
244
+ answers.set(question.number, answer.trim());
245
+ }
246
+ this.log(''); // Blank line between questions
247
+ }
248
+ if (cancelled || answers.size === 0) {
249
+ if (!cancelled) {
250
+ this.log(styles.muted('\nNo answers provided. Nothing changed.'));
251
+ }
252
+ return;
253
+ }
254
+ // Rewrite description with answers
255
+ const newDescription = rewriteDescription(ticket.description || '', answers);
256
+ // Update the ticket description
257
+ await this.storage.updateTicket(ticketId, { description: newDescription });
258
+ // Label management: remove needs-clarification, add ready
259
+ const currentLabels = [...ticket.labels];
260
+ const updatedLabels = currentLabels.filter((l) => l !== 'needs-clarification');
261
+ const allAnswered = answers.size === unanswered.length;
262
+ if (allAnswered && !updatedLabels.includes('ready')) {
263
+ updatedLabels.push('ready');
264
+ }
265
+ if (JSON.stringify(updatedLabels) !== JSON.stringify(currentLabels)) {
266
+ await this.storage.updateTicket(ticketId, { labels: updatedLabels });
267
+ }
268
+ // Move to Ready column if all questions answered and ticket has a project
269
+ if (allAnswered && ticket.projectId) {
270
+ try {
271
+ const project = await this.storage.getProject(ticket.projectId);
272
+ if (project?.workflowId) {
273
+ const statuses = await this.storage.listStatuses(project.workflowId);
274
+ // Find the "Ready" status (or first unstarted status that isn't "Needs Clarification")
275
+ const readyStatus = statuses.find((s) => s.name.toLowerCase() === 'ready' ||
276
+ (s.category === 'unstarted' && s.name.toLowerCase() !== 'needs clarification'));
277
+ if (readyStatus && readyStatus.name !== ticket.statusName) {
278
+ await this.storage.moveTicket(ticket.projectId, ticketId, readyStatus.name);
279
+ this.log(styles.muted(` Moved to column: ${readyStatus.name}`));
280
+ }
281
+ }
282
+ }
283
+ catch {
284
+ // Non-fatal: column move is best-effort
285
+ }
286
+ }
287
+ // Auto-export to board.md
288
+ await autoExportToBoard(this.pmoPath, this.storage, (msg) => this.log(styles.muted(msg)));
289
+ this.log(styles.success(`\n✅ Resolved ${answers.size}/${unanswered.length} question(s) on ${styles.emphasis(ticketId)}`));
290
+ if (allAnswered) {
291
+ this.log(styles.muted(' Label: needs-clarification → ready'));
292
+ }
293
+ }
294
+ }
@@ -7,10 +7,11 @@ export default class TicketSpec extends PMOCommand {
7
7
  specId: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
8
8
  };
9
9
  static flags: {
10
- json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
11
10
  unlink: import("@oclif/core/interfaces").BooleanFlag<boolean>;
12
11
  bulk: import("@oclif/core/interfaces").BooleanFlag<boolean>;
13
12
  spec: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
13
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
14
+ machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
14
15
  project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
15
16
  };
16
17
  execute(): Promise<void>;
@@ -23,12 +23,6 @@ export default class TicketSpec extends PMOCommand {
23
23
  };
24
24
  static flags = {
25
25
  ...pmoBaseFlags,
26
- json: Flags.boolean({
27
- char: 'm',
28
- aliases: ['machine'],
29
- description: 'Output prompt configuration as JSON (for AI agents/scripts)',
30
- default: false,
31
- }),
32
26
  unlink: Flags.boolean({
33
27
  char: 'u',
34
28
  description: 'Remove spec from ticket instead of adding',
@@ -7,6 +7,7 @@ export default class TicketStatus extends PMOCommand {
7
7
  };
8
8
  static flags: {
9
9
  json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
+ machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
11
  project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
11
12
  };
12
13
  execute(): Promise<void>;
@@ -1,4 +1,4 @@
1
- import { Args, Flags } from '@oclif/core';
1
+ import { Args } from '@oclif/core';
2
2
  import { PMOCommand, pmoBaseFlags } from '../../lib/pmo/index.js';
3
3
  import { styles, formatPriority, formatCategory } from '../../lib/styles.js';
4
4
  import { shouldOutputJson, outputErrorAsJson, createMetadata, } from '../../lib/prompt-json.js';
@@ -16,12 +16,6 @@ export default class TicketStatus extends PMOCommand {
16
16
  };
17
17
  static flags = {
18
18
  ...pmoBaseFlags,
19
- json: Flags.boolean({
20
- char: 'm',
21
- aliases: ['machine'],
22
- description: 'Output prompt configuration as JSON (for AI agents/scripts)',
23
- default: false,
24
- }),
25
19
  };
26
20
  async execute() {
27
21
  const { args, flags } = await this.parse(TicketStatus);
@@ -6,11 +6,12 @@ export default class TicketUpdate extends PMOCommand {
6
6
  ticketId: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
7
7
  };
8
8
  static flags: {
9
- json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
9
  priority: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
11
10
  category: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
12
11
  bulk: import("@oclif/core/interfaces").BooleanFlag<boolean>;
13
12
  force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
13
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
14
+ machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
14
15
  project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
15
16
  };
16
17
  execute(): Promise<void>;
@@ -20,12 +20,6 @@ export default class TicketUpdate extends PMOCommand {
20
20
  };
21
21
  static flags = {
22
22
  ...pmoBaseFlags,
23
- json: Flags.boolean({
24
- char: 'm',
25
- aliases: ['machine'],
26
- description: 'Output prompt configuration as JSON (for AI agents/scripts)',
27
- default: false,
28
- }),
29
23
  priority: Flags.string({
30
24
  char: 'p',
31
25
  description: 'Set priority (uses workspace priority scale)',
@@ -4,6 +4,7 @@ export default class TicketView extends PMOCommand {
4
4
  static examples: string[];
5
5
  static flags: {
6
6
  json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
7
+ machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
7
8
  project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
8
9
  };
9
10
  static args: {
@@ -1,4 +1,4 @@
1
- import { Args, Flags } from '@oclif/core';
1
+ import { Args } from '@oclif/core';
2
2
  import { PMOCommand, pmoBaseFlags } from '../../lib/pmo/index.js';
3
3
  import { styles } from '../../lib/styles.js';
4
4
  import { shouldOutputJson, outputErrorAsJson, createMetadata, } from '../../lib/prompt-json.js';
@@ -10,12 +10,6 @@ export default class TicketView extends PMOCommand {
10
10
  ];
11
11
  static flags = {
12
12
  ...pmoBaseFlags,
13
- json: Flags.boolean({
14
- char: 'm',
15
- aliases: ['machine'],
16
- description: 'Output prompt configuration as JSON (for AI agents/scripts)',
17
- default: false,
18
- }),
19
13
  };
20
14
  static args = {
21
15
  ticketId: Args.string({
@@ -4,6 +4,7 @@ export default class Whoami extends Command {
4
4
  static examples: string[];
5
5
  static flags: {
6
6
  json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
7
+ machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
7
8
  };
8
9
  run(): Promise<void>;
9
10
  private detectAgentName;
@@ -7,6 +7,7 @@ export default class WorkComplete extends PMOCommand {
7
7
  };
8
8
  static flags: {
9
9
  json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
+ machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
11
  project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
11
12
  };
12
13
  execute(): Promise<void>;