@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,13 +1,10 @@
1
- import { Command, Args, Flags } from '@oclif/core';
2
- import * as path from 'node:path';
3
- import Database from 'better-sqlite3';
4
- import inquirer from 'inquirer';
5
- import { getPMOContext } from '../../lib/pmo/index.js';
1
+ import { Args, Flags } from '@oclif/core';
2
+ import { PMOCommand, pmoBaseFlags, } from '../../lib/pmo/index.js';
6
3
  import { styles } from '../../lib/styles.js';
7
- import { getWorkspaceInfo } from '../../lib/agents/commands.js';
8
4
  import { isGHInstalled, isGHAuthenticated, getCurrentBranch, getDefaultBaseBranch, hasBranchBeenPushed, pushBranch, hasUnpushedCommits, getCommitLog, createPR, getPRForBranch, generatePRTitle, generatePRBody, } from '../../lib/pr/index.js';
9
- import { shouldOutputJson, outputPromptAsJson, outputErrorAsJson, createMetadata, buildPromptConfig, } from '../../lib/prompt-json.js';
10
- export default class PRCreate extends Command {
5
+ import { shouldOutputJson, outputErrorAsJson, createMetadata, } from '../../lib/prompt-json.js';
6
+ import { FlagResolver } from '../../lib/flags/index.js';
7
+ export default class PRCreate extends PMOCommand {
11
8
  static description = 'Create a GitHub pull request from the current branch';
12
9
  static examples = [
13
10
  '<%= config.bin %> <%= command.id %>',
@@ -22,6 +19,7 @@ export default class PRCreate extends Command {
22
19
  }),
23
20
  };
24
21
  static flags = {
22
+ ...pmoBaseFlags,
25
23
  base: Flags.string({
26
24
  char: 'b',
27
25
  description: 'Base branch for the PR (defaults to main/master)',
@@ -42,12 +40,26 @@ export default class PRCreate extends Command {
42
40
  body: Flags.string({
43
41
  description: 'PR body/description',
44
42
  }),
45
- json: Flags.boolean({
46
- description: 'Output prompt configuration as JSON (for AI agents/scripts)',
47
- default: false,
43
+ ticket: Flags.string({
44
+ description: 'Ticket ID to link (alternative to positional arg)',
48
45
  }),
49
46
  };
50
- async run() {
47
+ // Flag to track if PMO is available (for graceful degradation)
48
+ hasPMO = true;
49
+ /**
50
+ * Override init to gracefully handle missing PMO
51
+ * PR creation should work even without PMO (just without ticket linking)
52
+ */
53
+ async init() {
54
+ try {
55
+ await super.init();
56
+ }
57
+ catch {
58
+ // PMO not available - that's fine, we can still create PRs
59
+ this.hasPMO = false;
60
+ }
61
+ }
62
+ async execute() {
51
63
  const { args, flags } = await this.parse(PRCreate);
52
64
  // Check if JSON output mode is active
53
65
  const jsonMode = shouldOutputJson(flags);
@@ -84,159 +96,130 @@ export default class PRCreate extends Command {
84
96
  this.log(styles.muted(` URL: ${existingPR.url}`));
85
97
  return;
86
98
  }
87
- // Get workspace and PMO context (optional - PR creation works without it)
88
- let workspaceInfo;
89
- let storage = null;
90
- let db = null;
91
- try {
92
- workspaceInfo = getWorkspaceInfo();
93
- const pmoContext = await getPMOContext({
94
- logger: (msg) => this.log(styles.muted(msg)),
95
- });
96
- storage = pmoContext.storage;
97
- db = new Database(path.join(workspaceInfo.path, '.proletariat', 'workspace.db'));
98
- }
99
- catch {
100
- // No workspace - that's fine, we can still create PRs
99
+ // Log if PMO is not available
100
+ if (!this.hasPMO) {
101
101
  this.log(styles.muted(' No workspace found - creating PR without ticket linking'));
102
102
  }
103
- try {
104
- // Determine ticket ID
105
- let ticketId = args.ticketId;
106
- if (!ticketId && !flags['no-link'] && storage) {
107
- // Try to extract ticket ID from branch name (e.g., feat/agent/TKT-001-description)
108
- const ticketMatch = currentBranch.match(/(TKT-\d+)/i);
109
- if (ticketMatch) {
110
- ticketId = ticketMatch[1].toUpperCase();
111
- this.log(styles.muted(` Auto-detected ticket: ${ticketId}`));
112
- }
103
+ // Determine ticket ID from args or flags
104
+ let ticketId = args.ticketId || flags.ticket;
105
+ if (!ticketId && !flags['no-link'] && this.hasPMO) {
106
+ // Try to extract ticket ID from branch name (e.g., feat/agent/TKT-001-description)
107
+ const ticketMatch = currentBranch.match(/(TKT-\d+)/i);
108
+ if (ticketMatch) {
109
+ ticketId = ticketMatch[1].toUpperCase();
110
+ this.log(styles.muted(` Auto-detected ticket: ${ticketId}`));
113
111
  }
114
- // Get ticket info if available
115
- let ticket = null;
116
- if (ticketId && storage) {
117
- ticket = await storage.getTicket(ticketId);
118
- if (!ticket) {
119
- this.warn(`Ticket "${ticketId}" not found. Continuing without ticket link.`);
120
- ticketId = undefined;
121
- }
112
+ }
113
+ // Get ticket info if available
114
+ let ticket = null;
115
+ if (ticketId && this.hasPMO) {
116
+ ticket = await this.storage.getTicket(ticketId);
117
+ if (!ticket) {
118
+ this.warn(`Ticket "${ticketId}" not found. Continuing without ticket link.`);
119
+ ticketId = undefined;
122
120
  }
123
- // If no ticket, prompt for selection (only if we have storage)
124
- if (!ticketId && !flags['no-link'] && storage) {
125
- const projectId = flags.project;
126
- const allTickets = await storage.listTickets(projectId);
127
- const inProgressTickets = allTickets.filter(t => t.statusName && t.statusName.toLowerCase().includes('progress'));
128
- if (inProgressTickets.length > 0) {
129
- // Build choices once, use for both JSON and interactive modes
130
- const ticketChoices = [
121
+ }
122
+ // If no ticket, prompt for selection (only if we have PMO)
123
+ if (!ticketId && !flags['no-link'] && this.hasPMO) {
124
+ const projectId = flags.project;
125
+ const allTickets = await this.storage.listTickets(projectId);
126
+ const inProgressTickets = allTickets.filter(t => t.statusName && t.statusName.toLowerCase().includes('progress'));
127
+ if (inProgressTickets.length > 0) {
128
+ // Use FlagResolver for ticket selection
129
+ const resolver = new FlagResolver({
130
+ commandName: 'pr create',
131
+ baseCommand: 'prlt pr create',
132
+ jsonMode,
133
+ flags: { ticket: ticketId },
134
+ });
135
+ resolver.addPrompt({
136
+ flagName: 'ticket',
137
+ type: 'list',
138
+ message: 'Link PR to a ticket?',
139
+ choices: () => [
131
140
  ...inProgressTickets.map(t => ({
132
141
  name: `${t.id} - ${t.title}`,
133
142
  value: t.id,
134
143
  })),
135
144
  { name: 'Skip - create PR without linking', value: '__skip__' },
136
- ];
137
- const message = 'Link PR to a ticket?';
138
- // In JSON mode, output ticket selection prompt and exit
139
- if (jsonMode) {
140
- outputPromptAsJson(buildPromptConfig('list', 'ticketId', message, ticketChoices), createMetadata('pr create', flags));
141
- }
142
- const { selectedTicketId } = await inquirer.prompt([
143
- {
144
- type: 'list',
145
- name: 'selectedTicketId',
146
- message,
147
- choices: [
148
- ...ticketChoices.slice(0, -1),
149
- new inquirer.Separator(),
150
- ticketChoices[ticketChoices.length - 1],
151
- ],
152
- },
153
- ]);
154
- if (selectedTicketId !== '__skip__') {
155
- ticketId = selectedTicketId;
156
- ticket = await storage.getTicket(ticketId);
157
- }
158
- }
159
- }
160
- // Generate PR title and body
161
- let prTitle = flags.title;
162
- let prBody = flags.body;
163
- if (!prTitle) {
164
- if (ticket) {
165
- prTitle = generatePRTitle(ticket.id, ticket.title);
166
- }
167
- else {
168
- // Use branch name as title
169
- const branchParts = currentBranch.split('/');
170
- prTitle = branchParts[branchParts.length - 1].replace(/-/g, ' ');
171
- }
172
- }
173
- if (!prBody && ticket) {
174
- const commits = getCommitLog(baseBranch);
175
- prBody = generatePRBody({
176
- ticketId: ticket.id,
177
- ticketTitle: ticket.title,
178
- ticketDescription: ticket.description,
179
- commits: commits.slice(0, 10), // Limit to 10 commits
145
+ ],
146
+ when: (ctx) => !ctx.flags.ticket,
180
147
  });
181
- }
182
- // Push branch if not pushed
183
- if (!hasBranchBeenPushed(currentBranch)) {
184
- this.log(styles.muted(` Pushing branch to origin...`));
185
- if (!pushBranch(currentBranch)) {
186
- this.error('Failed to push branch to origin.');
148
+ const resolved = await resolver.resolve();
149
+ if (resolved.ticket && resolved.ticket !== '__skip__') {
150
+ ticketId = resolved.ticket;
151
+ ticket = await this.storage.getTicket(ticketId);
187
152
  }
188
153
  }
189
- else if (hasUnpushedCommits(currentBranch)) {
190
- this.log(styles.muted(` Pushing unpushed commits...`));
191
- if (!pushBranch(currentBranch)) {
192
- this.error('Failed to push commits to origin.');
193
- }
154
+ }
155
+ // Generate PR title and body
156
+ let prTitle = flags.title;
157
+ let prBody = flags.body;
158
+ if (!prTitle) {
159
+ if (ticket) {
160
+ prTitle = generatePRTitle(ticket.id, ticket.title);
194
161
  }
195
- // Create PR
196
- this.log('');
197
- this.log(styles.header('Creating Pull Request'));
198
- this.log(styles.muted(` Branch: ${currentBranch}`));
199
- this.log(styles.muted(` Base: ${baseBranch}`));
200
- this.log(styles.muted(` Title: ${prTitle}`));
201
- if (flags.draft) {
202
- this.log(styles.muted(` Draft: yes`));
162
+ else {
163
+ // Use branch name as title
164
+ const branchParts = currentBranch.split('/');
165
+ prTitle = branchParts[branchParts.length - 1].replace(/-/g, ' ');
203
166
  }
204
- const result = createPR({
205
- title: prTitle,
206
- body: prBody,
207
- base: baseBranch,
208
- draft: flags.draft,
167
+ }
168
+ if (!prBody && ticket) {
169
+ const commits = getCommitLog(baseBranch);
170
+ prBody = generatePRBody({
171
+ ticketId: ticket.id,
172
+ ticketTitle: ticket.title,
173
+ ticketDescription: ticket.description,
174
+ commits: commits.slice(0, 10), // Limit to 10 commits
209
175
  });
210
- if (!result.success) {
211
- this.error(`Failed to create PR: ${result.error}`);
212
- }
213
- // Store PR URL in ticket metadata
214
- if (ticket && result.url && storage) {
215
- await storage.updateTicket(ticket.id, {
216
- metadata: {
217
- pr_url: result.url,
218
- pr_number: String(result.number),
219
- },
220
- });
176
+ }
177
+ // Push branch if not pushed
178
+ if (!hasBranchBeenPushed(currentBranch)) {
179
+ this.log(styles.muted(` Pushing branch to origin...`));
180
+ if (!pushBranch(currentBranch)) {
181
+ this.error('Failed to push branch to origin.');
221
182
  }
222
- if (storage)
223
- await storage.close();
224
- if (db)
225
- db.close();
226
- this.log('');
227
- this.log(styles.success(`Pull request created!`));
228
- this.log(styles.muted(` PR #${result.number}`));
229
- this.log(styles.muted(` URL: ${result.url}`));
230
- if (ticket) {
231
- this.log(styles.muted(` Linked to: ${ticket.id}`));
183
+ }
184
+ else if (hasUnpushedCommits(currentBranch)) {
185
+ this.log(styles.muted(` Pushing unpushed commits...`));
186
+ if (!pushBranch(currentBranch)) {
187
+ this.error('Failed to push commits to origin.');
232
188
  }
233
189
  }
234
- catch (error) {
235
- if (storage)
236
- await storage.close();
237
- if (db)
238
- db.close();
239
- throw error;
190
+ // Create PR
191
+ this.log('');
192
+ this.log(styles.header('Creating Pull Request'));
193
+ this.log(styles.muted(` Branch: ${currentBranch}`));
194
+ this.log(styles.muted(` Base: ${baseBranch}`));
195
+ this.log(styles.muted(` Title: ${prTitle}`));
196
+ if (flags.draft) {
197
+ this.log(styles.muted(` Draft: yes`));
198
+ }
199
+ const result = createPR({
200
+ title: prTitle,
201
+ body: prBody,
202
+ base: baseBranch,
203
+ draft: flags.draft,
204
+ });
205
+ if (!result.success) {
206
+ this.error(`Failed to create PR: ${result.error}`);
207
+ }
208
+ // Store PR URL in ticket metadata
209
+ if (ticket && result.url && this.hasPMO) {
210
+ await this.storage.updateTicket(ticket.id, {
211
+ metadata: {
212
+ pr_url: result.url,
213
+ pr_number: String(result.number),
214
+ },
215
+ });
216
+ }
217
+ this.log('');
218
+ this.log(styles.success(`Pull request created!`));
219
+ this.log(styles.muted(` PR #${result.number}`));
220
+ this.log(styles.muted(` URL: ${result.url}`));
221
+ if (ticket) {
222
+ this.log(styles.muted(` Linked to: ${ticket.id}`));
240
223
  }
241
224
  }
242
225
  }
@@ -1,9 +1,12 @@
1
- import { Command } from '@oclif/core';
2
- export default class PR extends Command {
1
+ import { PMOCommand } from '../../lib/pmo/index.js';
2
+ export default class PR extends PMOCommand {
3
3
  static description: string;
4
4
  static examples: string[];
5
5
  static flags: {
6
+ action: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
7
+ machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
6
8
  json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
9
+ project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
7
10
  };
8
- run(): Promise<void>;
11
+ execute(): Promise<void>;
9
12
  }
@@ -1,59 +1,61 @@
1
- import { Command, Flags } from '@oclif/core';
2
- import inquirer from 'inquirer';
3
- import { findPMO } from '../../lib/pmo/index.js';
4
- import { shouldOutputJson, outputPromptAsJson, outputErrorAsJson, createMetadata, buildPromptConfig, } from '../../lib/prompt-json.js';
5
- export default class PR extends Command {
1
+ import { Flags } from '@oclif/core';
2
+ import { PMOCommand, pmoBaseFlags, } from '../../lib/pmo/index.js';
3
+ import { shouldOutputJson, outputErrorAsJson, createMetadata, } from '../../lib/prompt-json.js';
4
+ import { FlagResolver } from '../../lib/flags/index.js';
5
+ export default class PR extends PMOCommand {
6
6
  static description = 'Interactive menu for pull request operations';
7
7
  static examples = [
8
8
  '<%= config.bin %> <%= command.id %>',
9
9
  ];
10
10
  static flags = {
11
- json: Flags.boolean({
12
- description: 'Output prompt configuration as JSON (for AI agents/scripts)',
13
- default: false,
11
+ ...pmoBaseFlags,
12
+ action: Flags.string({
13
+ char: 'a',
14
+ description: 'Action to perform (create, link, status)',
15
+ options: ['create', 'link', 'status'],
14
16
  }),
15
17
  };
16
- async run() {
18
+ async execute() {
17
19
  const { flags } = await this.parse(PR);
18
20
  // Check if JSON output mode is active
19
21
  const jsonMode = shouldOutputJson(flags);
20
- const pmoPath = findPMO();
21
- if (!pmoPath) {
22
+ // Helper to handle errors in JSON mode
23
+ const handleError = (code, message) => {
22
24
  if (jsonMode) {
23
- outputErrorAsJson('PMO_NOT_FOUND', 'PMO not found. Run "prlt pmo init" first.', createMetadata('pr', flags));
25
+ outputErrorAsJson(code, message, createMetadata('pr', flags));
24
26
  this.exit(1);
25
27
  }
26
- this.error('PMO not found. Run "prlt pmo init" first.');
28
+ this.error(message);
29
+ };
30
+ // PMOCommand base class ensures PMO context is available
31
+ if (!this.storage) {
32
+ return handleError('PMO_NOT_FOUND', 'PMO not found. Run "prlt pmo init" first.');
27
33
  }
28
- // Define choices once, use for both JSON and interactive modes
29
- const menuChoices = [
30
- { name: 'Create PR from current branch', value: 'create' },
31
- { name: 'Link existing PR to ticket', value: 'link' },
32
- { name: 'View PR status for ticket', value: 'status' },
33
- { name: 'Cancel', value: 'cancel' },
34
- ];
35
- const message = 'Pull Request Operations - What would you like to do?';
36
- // In JSON mode, output menu prompt
37
- if (jsonMode) {
38
- outputPromptAsJson(buildPromptConfig('list', 'action', message, menuChoices), createMetadata('pr', flags));
39
- return;
40
- }
41
- // Show interactive menu (with separator before Cancel)
42
- const { action } = await inquirer.prompt([{
43
- type: 'list',
44
- name: 'action',
45
- message,
46
- choices: [
47
- ...menuChoices.slice(0, -1),
48
- new inquirer.Separator('──────────────'),
49
- menuChoices[menuChoices.length - 1],
50
- ],
51
- }]);
52
- if (action === 'cancel') {
34
+ // Use FlagResolver for action selection
35
+ const resolver = new FlagResolver({
36
+ commandName: 'pr',
37
+ baseCommand: 'prlt pr',
38
+ jsonMode,
39
+ flags: { action: flags.action },
40
+ });
41
+ resolver.addPrompt({
42
+ flagName: 'action',
43
+ type: 'list',
44
+ message: 'Pull Request Operations - What would you like to do?',
45
+ choices: () => [
46
+ { name: 'Create PR from current branch', value: 'create' },
47
+ { name: 'Link existing PR to ticket', value: 'link' },
48
+ { name: 'View PR status for ticket', value: 'status' },
49
+ { name: 'Cancel', value: 'cancel' },
50
+ ],
51
+ when: (ctx) => !ctx.flags.action,
52
+ });
53
+ const resolved = await resolver.resolve();
54
+ if (!resolved.action || resolved.action === 'cancel') {
53
55
  return;
54
56
  }
55
57
  // Run the selected subcommand
56
- switch (action) {
58
+ switch (resolved.action) {
57
59
  case 'create':
58
60
  await this.config.runCommand('pr:create', []);
59
61
  break;
@@ -1,5 +1,5 @@
1
- import { Command } from '@oclif/core';
2
- export default class PRLink extends Command {
1
+ import { PMOCommand } from '../../lib/pmo/index.js';
2
+ export default class PRLink extends PMOCommand {
3
3
  static description: string;
4
4
  static examples: string[];
5
5
  static args: {
@@ -8,7 +8,11 @@ export default class PRLink extends Command {
8
8
  static flags: {
9
9
  pr: import("@oclif/core/interfaces").OptionFlag<number | undefined, import("@oclif/core/interfaces").CustomOptions>;
10
10
  url: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
11
+ ticket: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
12
+ confirm: import("@oclif/core/interfaces").BooleanFlag<boolean>;
13
+ machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
11
14
  json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
15
+ project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
12
16
  };
13
- run(): Promise<void>;
17
+ execute(): Promise<void>;
14
18
  }