@proletariat/cli 0.3.33 → 0.3.35

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 (404) 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 +5 -2
  10. package/dist/commands/agent/auth.js +10 -17
  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 +11 -9
  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/staff/add.d.ts +1 -0
  29. package/dist/commands/agent/staff/add.js +1 -0
  30. package/dist/commands/agent/staff/index.d.ts +15 -0
  31. package/dist/commands/agent/staff/index.js +83 -0
  32. package/dist/commands/agent/staff/list.d.ts +1 -0
  33. package/dist/commands/agent/staff/list.js +1 -0
  34. package/dist/commands/agent/staff/remove.d.ts +1 -0
  35. package/dist/commands/agent/staff/remove.js +1 -0
  36. package/dist/commands/agent/status.d.ts +1 -0
  37. package/dist/commands/agent/status.js +1 -7
  38. package/dist/commands/agent/themes/add-names.d.ts +1 -0
  39. package/dist/commands/agent/themes/add-names.js +1 -0
  40. package/dist/commands/agent/themes/create.d.ts +1 -0
  41. package/dist/commands/agent/themes/create.js +1 -0
  42. package/dist/commands/agent/themes/index.d.ts +10 -0
  43. package/dist/commands/agent/themes/index.js +144 -0
  44. package/dist/commands/agent/themes/list.d.ts +1 -0
  45. package/dist/commands/agent/themes/list.js +1 -0
  46. package/dist/commands/agent/themes/set.d.ts +1 -0
  47. package/dist/commands/agent/themes/set.js +1 -0
  48. package/dist/commands/agent/visit.d.ts +1 -0
  49. package/dist/commands/agent/visit.js +1 -7
  50. package/dist/commands/agents/themes/add-names.d.ts +1 -0
  51. package/dist/commands/agents/themes/add-names.js +1 -0
  52. package/dist/commands/agents/themes/create.d.ts +1 -0
  53. package/dist/commands/agents/themes/create.js +1 -0
  54. package/dist/commands/agents/themes/list.d.ts +1 -0
  55. package/dist/commands/agents/themes/list.js +1 -0
  56. package/dist/commands/autocomplete/setup.d.ts +1 -0
  57. package/dist/commands/board/index.d.ts +1 -0
  58. package/dist/commands/board/view.d.ts +1 -0
  59. package/dist/commands/board/watch.d.ts +1 -0
  60. package/dist/commands/branch/create.d.ts +1 -0
  61. package/dist/commands/branch/create.js +0 -6
  62. package/dist/commands/branch/index.d.ts +1 -0
  63. package/dist/commands/branch/index.js +0 -7
  64. package/dist/commands/branch/list.d.ts +1 -0
  65. package/dist/commands/branch/validate.d.ts +1 -0
  66. package/dist/commands/branch/where.d.ts +1 -0
  67. package/dist/commands/branch/where.js +3 -9
  68. package/dist/commands/category/create.d.ts +1 -0
  69. package/dist/commands/category/delete.d.ts +1 -0
  70. package/dist/commands/category/index.d.ts +1 -0
  71. package/dist/commands/category/list.d.ts +1 -0
  72. package/dist/commands/category/list.js +2 -2
  73. package/dist/commands/category/rename.d.ts +1 -0
  74. package/dist/commands/claude.d.ts +2 -1
  75. package/dist/commands/claude.js +2 -6
  76. package/dist/commands/commit.d.ts +2 -1
  77. package/dist/commands/commit.js +2 -6
  78. package/dist/commands/config/index.d.ts +2 -1
  79. package/dist/commands/config/index.js +3 -7
  80. package/dist/commands/diet.d.ts +1 -0
  81. package/dist/commands/docker/clean.d.ts +1 -0
  82. package/dist/commands/docker/index.d.ts +1 -0
  83. package/dist/commands/docker/list.d.ts +1 -0
  84. package/dist/commands/docker/logs.d.ts +2 -0
  85. package/dist/commands/docker/logs.js +2 -0
  86. package/dist/commands/docker/prune.d.ts +1 -0
  87. package/dist/commands/docker/restart.d.ts +1 -0
  88. package/dist/commands/docker/shell.d.ts +2 -0
  89. package/dist/commands/docker/shell.js +2 -0
  90. package/dist/commands/docker/start.d.ts +2 -0
  91. package/dist/commands/docker/start.js +2 -0
  92. package/dist/commands/docker/status.d.ts +1 -0
  93. package/dist/commands/docker/stop.d.ts +1 -0
  94. package/dist/commands/epic/activate.d.ts +1 -0
  95. package/dist/commands/epic/activate.js +1 -7
  96. package/dist/commands/epic/archive.d.ts +2 -1
  97. package/dist/commands/epic/archive.js +0 -6
  98. package/dist/commands/epic/create.d.ts +2 -1
  99. package/dist/commands/epic/create.js +0 -6
  100. package/dist/commands/epic/delete.d.ts +1 -0
  101. package/dist/commands/epic/index.d.ts +1 -0
  102. package/dist/commands/epic/index.js +0 -7
  103. package/dist/commands/epic/list.d.ts +1 -0
  104. package/dist/commands/epic/move.d.ts +2 -1
  105. package/dist/commands/epic/move.js +0 -6
  106. package/dist/commands/epic/progress.d.ts +2 -1
  107. package/dist/commands/epic/progress.js +0 -6
  108. package/dist/commands/epic/project.d.ts +2 -1
  109. package/dist/commands/epic/project.js +0 -6
  110. package/dist/commands/epic/reorder.d.ts +1 -0
  111. package/dist/commands/epic/reorder.js +0 -6
  112. package/dist/commands/epic/spec.d.ts +2 -1
  113. package/dist/commands/epic/spec.js +0 -6
  114. package/dist/commands/epic/ticket.d.ts +2 -1
  115. package/dist/commands/epic/ticket.js +0 -6
  116. package/dist/commands/epic/view.d.ts +1 -0
  117. package/dist/commands/epic/view.js +1 -7
  118. package/dist/commands/execution/config.d.ts +2 -1
  119. package/dist/commands/execution/config.js +1 -7
  120. package/dist/commands/execution/index.d.ts +1 -0
  121. package/dist/commands/execution/index.js +1 -8
  122. package/dist/commands/execution/list.d.ts +1 -0
  123. package/dist/commands/execution/logs.d.ts +1 -0
  124. package/dist/commands/execution/logs.js +1 -7
  125. package/dist/commands/execution/stop.d.ts +1 -0
  126. package/dist/commands/execution/stop.js +1 -7
  127. package/dist/commands/execution/view.d.ts +1 -0
  128. package/dist/commands/execution/view.js +2 -8
  129. package/dist/commands/feedback/index.d.ts +1 -0
  130. package/dist/commands/feedback/list.d.ts +1 -0
  131. package/dist/commands/feedback/submit.d.ts +1 -0
  132. package/dist/commands/feedback/view.d.ts +1 -0
  133. package/dist/commands/gh/index.d.ts +1 -0
  134. package/dist/commands/gh/login.d.ts +1 -0
  135. package/dist/commands/gh/status.d.ts +1 -0
  136. package/dist/commands/gh/token.d.ts +1 -0
  137. package/dist/commands/init.d.ts +2 -1
  138. package/dist/commands/init.js +3 -8
  139. package/dist/commands/label/create.d.ts +20 -0
  140. package/dist/commands/label/create.js +56 -0
  141. package/dist/commands/label/delete.d.ts +17 -0
  142. package/dist/commands/label/delete.js +31 -0
  143. package/dist/commands/label/group/create.d.ts +20 -0
  144. package/dist/commands/label/group/create.js +54 -0
  145. package/dist/commands/label/group/list.d.ts +14 -0
  146. package/dist/commands/label/group/list.js +51 -0
  147. package/dist/commands/label/index.d.ts +15 -0
  148. package/dist/commands/label/index.js +58 -0
  149. package/dist/commands/label/list.d.ts +16 -0
  150. package/dist/commands/label/list.js +82 -0
  151. package/dist/commands/link/create.d.ts +1 -0
  152. package/dist/commands/link/create.js +0 -6
  153. package/dist/commands/link/index.d.ts +1 -0
  154. package/dist/commands/link/index.js +1 -7
  155. package/dist/commands/link/list.d.ts +1 -0
  156. package/dist/commands/link/list.js +3 -8
  157. package/dist/commands/link/remove.d.ts +1 -0
  158. package/dist/commands/link/remove.js +0 -6
  159. package/dist/commands/mcp-server.js +2 -1
  160. package/dist/commands/phase/create.d.ts +1 -0
  161. package/dist/commands/phase/create.js +1 -1
  162. package/dist/commands/phase/delete.d.ts +1 -0
  163. package/dist/commands/phase/delete.js +1 -1
  164. package/dist/commands/phase/list.d.ts +1 -0
  165. package/dist/commands/phase/move.d.ts +1 -0
  166. package/dist/commands/phase/move.js +2 -2
  167. package/dist/commands/phase/template/apply.d.ts +26 -0
  168. package/dist/commands/phase/template/apply.js +14 -0
  169. package/dist/commands/phase/template/create.d.ts +23 -0
  170. package/dist/commands/phase/template/create.js +14 -0
  171. package/dist/commands/phase/template/delete.d.ts +18 -0
  172. package/dist/commands/phase/template/delete.js +61 -0
  173. package/dist/commands/phase/template/list.d.ts +17 -0
  174. package/dist/commands/phase/template/list.js +88 -0
  175. package/dist/commands/phase/template/update.d.ts +1 -0
  176. package/dist/commands/phase/template/update.js +1 -0
  177. package/dist/commands/phase/update.d.ts +1 -0
  178. package/dist/commands/phase/update.js +2 -2
  179. package/dist/commands/pmo/init.d.ts +4 -3
  180. package/dist/commands/pmo/init.js +2 -7
  181. package/dist/commands/pr/create.d.ts +1 -0
  182. package/dist/commands/pr/index.d.ts +1 -0
  183. package/dist/commands/pr/link.d.ts +1 -0
  184. package/dist/commands/pr/list.d.ts +1 -0
  185. package/dist/commands/pr/status.d.ts +1 -0
  186. package/dist/commands/priority/add.d.ts +1 -0
  187. package/dist/commands/priority/add.js +1 -1
  188. package/dist/commands/priority/list.d.ts +1 -0
  189. package/dist/commands/priority/remove.d.ts +1 -0
  190. package/dist/commands/priority/set.d.ts +1 -0
  191. package/dist/commands/project/archive.d.ts +1 -0
  192. package/dist/commands/project/create.d.ts +1 -0
  193. package/dist/commands/project/delete.d.ts +1 -0
  194. package/dist/commands/project/index.d.ts +1 -0
  195. package/dist/commands/project/list.d.ts +1 -0
  196. package/dist/commands/project/spec.d.ts +1 -0
  197. package/dist/commands/project/unarchive.d.ts +1 -0
  198. package/dist/commands/project/update.d.ts +1 -0
  199. package/dist/commands/project/update.js +0 -2
  200. package/dist/commands/project/view.d.ts +1 -0
  201. package/dist/commands/pull.d.ts +1 -0
  202. package/dist/commands/repo/add.d.ts +1 -0
  203. package/dist/commands/repo/add.js +0 -6
  204. package/dist/commands/repo/create.d.ts +1 -0
  205. package/dist/commands/repo/index.d.ts +1 -0
  206. package/dist/commands/repo/list.d.ts +1 -0
  207. package/dist/commands/repo/remove.d.ts +1 -0
  208. package/dist/commands/repo/view.d.ts +1 -0
  209. package/dist/commands/roadmap/add-project.d.ts +1 -0
  210. package/dist/commands/roadmap/add-project.js +0 -6
  211. package/dist/commands/roadmap/create.d.ts +1 -0
  212. package/dist/commands/roadmap/create.js +0 -6
  213. package/dist/commands/roadmap/delete.d.ts +1 -0
  214. package/dist/commands/roadmap/delete.js +0 -6
  215. package/dist/commands/roadmap/generate.d.ts +1 -0
  216. package/dist/commands/roadmap/generate.js +1 -8
  217. package/dist/commands/roadmap/index.d.ts +1 -0
  218. package/dist/commands/roadmap/index.js +0 -7
  219. package/dist/commands/roadmap/list.d.ts +1 -0
  220. package/dist/commands/roadmap/remove-project.d.ts +1 -0
  221. package/dist/commands/roadmap/remove-project.js +0 -6
  222. package/dist/commands/roadmap/reorder.d.ts +1 -0
  223. package/dist/commands/roadmap/reorder.js +0 -6
  224. package/dist/commands/roadmap/update.d.ts +1 -0
  225. package/dist/commands/roadmap/update.js +0 -6
  226. package/dist/commands/roadmap/view.d.ts +1 -0
  227. package/dist/commands/roadmap/view.js +1 -7
  228. package/dist/commands/session/attach.d.ts +2 -1
  229. package/dist/commands/session/attach.js +0 -6
  230. package/dist/commands/session/health.d.ts +1 -0
  231. package/dist/commands/session/health.js +1 -1
  232. package/dist/commands/session/index.d.ts +1 -0
  233. package/dist/commands/session/index.js +0 -7
  234. package/dist/commands/session/list.d.ts +1 -0
  235. package/dist/commands/spec/create.d.ts +1 -0
  236. package/dist/commands/spec/delete.d.ts +1 -0
  237. package/dist/commands/spec/edit.d.ts +1 -0
  238. package/dist/commands/spec/index.d.ts +1 -0
  239. package/dist/commands/spec/link/depends.d.ts +18 -0
  240. package/dist/commands/spec/link/depends.js +86 -0
  241. package/dist/commands/spec/link/index.d.ts +17 -0
  242. package/dist/commands/spec/link/index.js +92 -0
  243. package/dist/commands/spec/link/remove.d.ts +18 -0
  244. package/dist/commands/spec/link/remove.js +90 -0
  245. package/dist/commands/spec/list.d.ts +1 -0
  246. package/dist/commands/spec/plan.d.ts +1 -0
  247. package/dist/commands/spec/ticket.d.ts +1 -0
  248. package/dist/commands/spec/view.d.ts +1 -0
  249. package/dist/commands/staff/add.d.ts +3 -2
  250. package/dist/commands/staff/add.js +2 -6
  251. package/dist/commands/staff/index.d.ts +2 -1
  252. package/dist/commands/staff/index.js +0 -6
  253. package/dist/commands/staff/list.d.ts +1 -0
  254. package/dist/commands/staff/remove.d.ts +2 -1
  255. package/dist/commands/staff/remove.js +0 -6
  256. package/dist/commands/status/category.d.ts +1 -0
  257. package/dist/commands/status/create.d.ts +1 -0
  258. package/dist/commands/status/delete.d.ts +1 -0
  259. package/dist/commands/status/index.d.ts +1 -0
  260. package/dist/commands/status/list.d.ts +1 -0
  261. package/dist/commands/status/move.d.ts +1 -0
  262. package/dist/commands/status/update.d.ts +1 -0
  263. package/dist/commands/support/book.d.ts +1 -0
  264. package/dist/commands/support/discord.d.ts +1 -0
  265. package/dist/commands/support/docs.d.ts +1 -0
  266. package/dist/commands/support/index.d.ts +1 -0
  267. package/dist/commands/support/issues.d.ts +1 -0
  268. package/dist/commands/support/logs.d.ts +1 -0
  269. package/dist/commands/support/logs.js +2 -2
  270. package/dist/commands/template/apply.d.ts +1 -0
  271. package/dist/commands/template/apply.js +5 -10
  272. package/dist/commands/template/create.d.ts +1 -0
  273. package/dist/commands/template/create.js +1 -7
  274. package/dist/commands/template/delete.d.ts +1 -0
  275. package/dist/commands/template/delete.js +0 -6
  276. package/dist/commands/template/index.d.ts +1 -0
  277. package/dist/commands/template/index.js +2 -7
  278. package/dist/commands/template/list.d.ts +1 -0
  279. package/dist/commands/template/list.js +1 -7
  280. package/dist/commands/template/save.d.ts +1 -0
  281. package/dist/commands/template/save.js +0 -6
  282. package/dist/commands/template/update.d.ts +1 -0
  283. package/dist/commands/template/update.js +0 -6
  284. package/dist/commands/terminal/title.d.ts +1 -0
  285. package/dist/commands/theme/index.d.ts +1 -0
  286. package/dist/commands/theme/index.js +2 -7
  287. package/dist/commands/theme/list.d.ts +1 -0
  288. package/dist/commands/theme/set.d.ts +1 -0
  289. package/dist/commands/theme/set.js +3 -7
  290. package/dist/commands/ticket/bulk.d.ts +1 -0
  291. package/dist/commands/ticket/bulk.js +0 -7
  292. package/dist/commands/ticket/category.d.ts +1 -0
  293. package/dist/commands/ticket/complete.d.ts +2 -1
  294. package/dist/commands/ticket/complete.js +2 -8
  295. package/dist/commands/ticket/create.d.ts +2 -1
  296. package/dist/commands/ticket/create.js +0 -6
  297. package/dist/commands/ticket/delete.d.ts +2 -1
  298. package/dist/commands/ticket/delete.js +0 -6
  299. package/dist/commands/ticket/edit.d.ts +1 -0
  300. package/dist/commands/ticket/edit.js +0 -6
  301. package/dist/commands/ticket/epic.d.ts +2 -1
  302. package/dist/commands/ticket/epic.js +0 -6
  303. package/dist/commands/ticket/index.d.ts +1 -0
  304. package/dist/commands/ticket/index.js +6 -9
  305. package/dist/commands/ticket/link/block.d.ts +15 -0
  306. package/dist/commands/ticket/link/block.js +95 -0
  307. package/dist/commands/ticket/link/index.d.ts +14 -0
  308. package/dist/commands/ticket/link/index.js +96 -0
  309. package/dist/commands/ticket/list.d.ts +2 -0
  310. package/dist/commands/ticket/list.js +6 -0
  311. package/dist/commands/ticket/move.d.ts +2 -1
  312. package/dist/commands/ticket/move.js +2 -8
  313. package/dist/commands/ticket/project.d.ts +2 -1
  314. package/dist/commands/ticket/project.js +0 -6
  315. package/dist/commands/ticket/reassign.d.ts +2 -1
  316. package/dist/commands/ticket/reassign.js +0 -6
  317. package/dist/commands/ticket/resolve.d.ts +68 -0
  318. package/dist/commands/ticket/resolve.js +294 -0
  319. package/dist/commands/ticket/spec.d.ts +2 -1
  320. package/dist/commands/ticket/spec.js +0 -6
  321. package/dist/commands/ticket/status.d.ts +1 -0
  322. package/dist/commands/ticket/status.js +1 -7
  323. package/dist/commands/ticket/template/apply.d.ts +26 -0
  324. package/dist/commands/ticket/template/apply.js +14 -0
  325. package/dist/commands/ticket/template/delete.d.ts +18 -0
  326. package/dist/commands/ticket/template/delete.js +61 -0
  327. package/dist/commands/ticket/template/list.d.ts +17 -0
  328. package/dist/commands/ticket/template/list.js +77 -0
  329. package/dist/commands/ticket/template/save.d.ts +17 -0
  330. package/dist/commands/ticket/template/save.js +97 -0
  331. package/dist/commands/ticket/update.d.ts +2 -1
  332. package/dist/commands/ticket/update.js +0 -6
  333. package/dist/commands/ticket/view.d.ts +2 -0
  334. package/dist/commands/ticket/view.js +2 -7
  335. package/dist/commands/whoami.d.ts +1 -0
  336. package/dist/commands/work/complete.d.ts +1 -0
  337. package/dist/commands/work/complete.js +1 -7
  338. package/dist/commands/work/index.d.ts +1 -0
  339. package/dist/commands/work/index.js +4 -7
  340. package/dist/commands/work/ready.d.ts +2 -1
  341. package/dist/commands/work/ready.js +38 -14
  342. package/dist/commands/work/resolve.d.ts +15 -0
  343. package/dist/commands/work/resolve.js +76 -0
  344. package/dist/commands/work/revise.d.ts +2 -1
  345. package/dist/commands/work/revise.js +0 -6
  346. package/dist/commands/work/spawn-all.d.ts +2 -1
  347. package/dist/commands/work/spawn-all.js +2 -6
  348. package/dist/commands/work/spawn.d.ts +2 -1
  349. package/dist/commands/work/spawn.js +4 -10
  350. package/dist/commands/work/start.d.ts +3 -1
  351. package/dist/commands/work/start.js +52 -23
  352. package/dist/commands/work/watch.d.ts +2 -1
  353. package/dist/commands/work/watch.js +0 -6
  354. package/dist/commands/workflow/create.d.ts +1 -0
  355. package/dist/commands/workflow/delete.d.ts +1 -0
  356. package/dist/commands/workflow/index.d.ts +1 -0
  357. package/dist/commands/workflow/index.js +1 -7
  358. package/dist/commands/workflow/list.d.ts +1 -0
  359. package/dist/commands/workflow/switch.d.ts +1 -0
  360. package/dist/commands/workflow/view.d.ts +1 -0
  361. package/dist/commands/workspace/add.d.ts +2 -0
  362. package/dist/commands/workspace/add.js +2 -0
  363. package/dist/commands/workspace/list.d.ts +1 -0
  364. package/dist/commands/workspace/list.js +4 -8
  365. package/dist/commands/workspace/prune.d.ts +1 -0
  366. package/dist/commands/workspace/prune.js +4 -6
  367. package/dist/commands/workspace/remove.d.ts +1 -0
  368. package/dist/commands/workspace/remove.js +3 -7
  369. package/dist/commands/workspace/use.d.ts +1 -0
  370. package/dist/commands/workspace/use.js +3 -7
  371. package/dist/lib/database/drizzle-schema.d.ts +1 -1
  372. package/dist/lib/database/index.d.ts +1 -1
  373. package/dist/lib/database/index.js +20 -0
  374. package/dist/lib/execution/devcontainer.js +3 -1
  375. package/dist/lib/execution/runners.d.ts +7 -2
  376. package/dist/lib/execution/runners.js +18 -10
  377. package/dist/lib/execution/types.d.ts +1 -0
  378. package/dist/lib/flags/resolver.js +1 -0
  379. package/dist/lib/mcp/helpers.d.ts +1 -2
  380. package/dist/lib/mcp/tools/diet.js +1 -0
  381. package/dist/lib/mcp/tools/index.d.ts +1 -0
  382. package/dist/lib/mcp/tools/index.js +1 -0
  383. package/dist/lib/mcp/tools/label.d.ts +6 -0
  384. package/dist/lib/mcp/tools/label.js +338 -0
  385. package/dist/lib/mcp/tools/ticket.js +53 -17
  386. package/dist/lib/multiline-input.js +6 -18
  387. package/dist/lib/pmo/base-command.d.ts +4 -2
  388. package/dist/lib/pmo/base-command.js +9 -4
  389. package/dist/lib/pmo/schema.d.ts +6 -0
  390. package/dist/lib/pmo/schema.js +44 -0
  391. package/dist/lib/pmo/storage/base.d.ts +6 -0
  392. package/dist/lib/pmo/storage/base.js +185 -7
  393. package/dist/lib/pmo/storage/index.d.ts +23 -1
  394. package/dist/lib/pmo/storage/index.js +59 -1
  395. package/dist/lib/pmo/storage/labels.d.ts +55 -0
  396. package/dist/lib/pmo/storage/labels.js +346 -0
  397. package/dist/lib/pmo/storage/tickets.js +17 -0
  398. package/dist/lib/pmo/storage/types.d.ts +24 -0
  399. package/dist/lib/pmo/types.d.ts +44 -0
  400. package/dist/lib/pmo/utils.js +1 -1
  401. package/dist/lib/prompt-json.d.ts +5 -2
  402. package/dist/lib/prompt-json.js +4 -4
  403. package/oclif.manifest.json +6571 -3748
  404. package/package.json +1 -1
@@ -0,0 +1,346 @@
1
+ /**
2
+ * Label storage operations for PMO.
3
+ * Handles CRUD for labels, label groups, and ticket-label associations.
4
+ * Enforces group exclusivity constraints.
5
+ */
6
+ import { PMO_TABLES } from '../schema.js';
7
+ import { PMOError } from '../types.js';
8
+ import { slugify } from '../utils.js';
9
+ const T = PMO_TABLES;
10
+ export class LabelStorage {
11
+ ctx;
12
+ constructor(ctx) {
13
+ this.ctx = ctx;
14
+ }
15
+ // ===========================================================================
16
+ // Label Group Operations
17
+ // ===========================================================================
18
+ async listLabelGroups(filter) {
19
+ let query = `SELECT * FROM ${T.label_groups} WHERE 1=1`;
20
+ const params = [];
21
+ if (filter?.search) {
22
+ query += ' AND (name LIKE ? OR description LIKE ?)';
23
+ params.push(`%${filter.search}%`, `%${filter.search}%`);
24
+ }
25
+ query += ' ORDER BY position ASC, name ASC';
26
+ const rows = this.ctx.db.prepare(query).all(...params);
27
+ return rows.map(rowToLabelGroup);
28
+ }
29
+ async getLabelGroup(id) {
30
+ const row = this.ctx.db.prepare(`SELECT * FROM ${T.label_groups} WHERE id = ?`).get(id);
31
+ return row ? rowToLabelGroup(row) : null;
32
+ }
33
+ async getLabelGroupByName(name) {
34
+ const row = this.ctx.db.prepare(`SELECT * FROM ${T.label_groups} WHERE LOWER(name) = LOWER(?)`).get(name);
35
+ return row ? rowToLabelGroup(row) : null;
36
+ }
37
+ async createLabelGroup(group) {
38
+ const id = group.id || slugify(group.name);
39
+ // Check for duplicate name
40
+ const existing = await this.getLabelGroupByName(group.name);
41
+ if (existing) {
42
+ throw new PMOError('CONFLICT', `Label group "${group.name}" already exists`);
43
+ }
44
+ // Get next position
45
+ const maxPos = this.ctx.db.prepare(`SELECT COALESCE(MAX(position), -1) as max_pos FROM ${T.label_groups}`).get();
46
+ const now = new Date().toISOString();
47
+ this.ctx.db.prepare(`
48
+ INSERT INTO ${T.label_groups} (id, name, description, is_exclusive, is_required, position, created_at)
49
+ VALUES (?, ?, ?, ?, ?, ?, ?)
50
+ `).run(id, group.name, group.description || null, group.isExclusive !== undefined ? (group.isExclusive ? 1 : 0) : 1, group.isRequired !== undefined ? (group.isRequired ? 1 : 0) : 0, group.position ?? maxPos.max_pos + 1, now);
51
+ return (await this.getLabelGroup(id));
52
+ }
53
+ async updateLabelGroup(id, changes) {
54
+ const existing = await this.getLabelGroup(id);
55
+ if (!existing) {
56
+ throw new PMOError('NOT_FOUND', `Label group not found: ${id}`);
57
+ }
58
+ const updates = [];
59
+ const params = [];
60
+ if (changes.name !== undefined) {
61
+ updates.push('name = ?');
62
+ params.push(changes.name);
63
+ }
64
+ if (changes.description !== undefined) {
65
+ updates.push('description = ?');
66
+ params.push(changes.description);
67
+ }
68
+ if (changes.isExclusive !== undefined) {
69
+ updates.push('is_exclusive = ?');
70
+ params.push(changes.isExclusive ? 1 : 0);
71
+ }
72
+ if (changes.isRequired !== undefined) {
73
+ updates.push('is_required = ?');
74
+ params.push(changes.isRequired ? 1 : 0);
75
+ }
76
+ if (changes.position !== undefined) {
77
+ updates.push('position = ?');
78
+ params.push(changes.position);
79
+ }
80
+ if (updates.length > 0) {
81
+ params.push(id);
82
+ this.ctx.db.prepare(`UPDATE ${T.label_groups} SET ${updates.join(', ')} WHERE id = ?`).run(...params);
83
+ }
84
+ return (await this.getLabelGroup(id));
85
+ }
86
+ async deleteLabelGroup(id) {
87
+ const existing = await this.getLabelGroup(id);
88
+ if (!existing) {
89
+ throw new PMOError('NOT_FOUND', `Label group not found: ${id}`);
90
+ }
91
+ // Labels in this group will have group_id set to NULL (ON DELETE SET NULL)
92
+ this.ctx.db.prepare(`DELETE FROM ${T.label_groups} WHERE id = ?`).run(id);
93
+ }
94
+ // ===========================================================================
95
+ // Label Operations
96
+ // ===========================================================================
97
+ async listLabels(filter) {
98
+ let query = `
99
+ SELECT l.*, lg.name as group_name
100
+ FROM ${T.labels} l
101
+ LEFT JOIN ${T.label_groups} lg ON l.group_id = lg.id
102
+ WHERE 1=1
103
+ `;
104
+ const params = [];
105
+ if (filter?.groupId) {
106
+ query += ' AND l.group_id = ?';
107
+ params.push(filter.groupId);
108
+ }
109
+ if (filter?.search) {
110
+ query += ' AND (l.name LIKE ? OR l.description LIKE ?)';
111
+ params.push(`%${filter.search}%`, `%${filter.search}%`);
112
+ }
113
+ if (filter?.isBuiltin !== undefined) {
114
+ query += ' AND l.is_builtin = ?';
115
+ params.push(filter.isBuiltin ? 1 : 0);
116
+ }
117
+ query += ' ORDER BY lg.position ASC, l.position ASC, l.name ASC';
118
+ const rows = this.ctx.db.prepare(query).all(...params);
119
+ return rows.map(rowToLabel);
120
+ }
121
+ async getLabel(id) {
122
+ const row = this.ctx.db.prepare(`
123
+ SELECT l.*, lg.name as group_name
124
+ FROM ${T.labels} l
125
+ LEFT JOIN ${T.label_groups} lg ON l.group_id = lg.id
126
+ WHERE l.id = ?
127
+ `).get(id);
128
+ return row ? rowToLabel(row) : null;
129
+ }
130
+ async getLabelByName(name, groupId) {
131
+ let query = `
132
+ SELECT l.*, lg.name as group_name
133
+ FROM ${T.labels} l
134
+ LEFT JOIN ${T.label_groups} lg ON l.group_id = lg.id
135
+ WHERE LOWER(l.name) = LOWER(?)
136
+ `;
137
+ const params = [name];
138
+ if (groupId) {
139
+ query += ' AND l.group_id = ?';
140
+ params.push(groupId);
141
+ }
142
+ const row = this.ctx.db.prepare(query).get(...params);
143
+ return row ? rowToLabel(row) : null;
144
+ }
145
+ async createLabel(label) {
146
+ const id = label.id || slugify(label.name);
147
+ // Validate group if provided
148
+ if (label.groupId) {
149
+ const group = await this.getLabelGroup(label.groupId);
150
+ if (!group) {
151
+ throw new PMOError('NOT_FOUND', `Label group not found: ${label.groupId}`);
152
+ }
153
+ }
154
+ // Get next position within group
155
+ let maxPos;
156
+ if (label.groupId) {
157
+ maxPos = this.ctx.db.prepare(`SELECT COALESCE(MAX(position), -1) as max_pos FROM ${T.labels} WHERE group_id = ?`).get(label.groupId);
158
+ }
159
+ else {
160
+ maxPos = this.ctx.db.prepare(`SELECT COALESCE(MAX(position), -1) as max_pos FROM ${T.labels} WHERE group_id IS NULL`).get();
161
+ }
162
+ const now = new Date().toISOString();
163
+ try {
164
+ this.ctx.db.prepare(`
165
+ INSERT INTO ${T.labels} (id, name, color, description, group_id, position, is_builtin, created_at)
166
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)
167
+ `).run(id, label.name, label.color || null, label.description || null, label.groupId || null, label.position ?? maxPos.max_pos + 1, label.isBuiltin ? 1 : 0, now);
168
+ }
169
+ catch (err) {
170
+ if (err instanceof Error && err.message.includes('UNIQUE constraint')) {
171
+ throw new PMOError('CONFLICT', `Label "${label.name}" already exists in this group`);
172
+ }
173
+ throw err;
174
+ }
175
+ return (await this.getLabel(id));
176
+ }
177
+ async updateLabel(id, changes) {
178
+ const existing = await this.getLabel(id);
179
+ if (!existing) {
180
+ throw new PMOError('NOT_FOUND', `Label not found: ${id}`);
181
+ }
182
+ const updates = [];
183
+ const params = [];
184
+ if (changes.name !== undefined) {
185
+ updates.push('name = ?');
186
+ params.push(changes.name);
187
+ }
188
+ if (changes.color !== undefined) {
189
+ updates.push('color = ?');
190
+ params.push(changes.color);
191
+ }
192
+ if (changes.description !== undefined) {
193
+ updates.push('description = ?');
194
+ params.push(changes.description);
195
+ }
196
+ if (changes.groupId !== undefined) {
197
+ updates.push('group_id = ?');
198
+ params.push(changes.groupId);
199
+ }
200
+ if (changes.position !== undefined) {
201
+ updates.push('position = ?');
202
+ params.push(changes.position);
203
+ }
204
+ if (updates.length > 0) {
205
+ params.push(id);
206
+ this.ctx.db.prepare(`UPDATE ${T.labels} SET ${updates.join(', ')} WHERE id = ?`).run(...params);
207
+ }
208
+ return (await this.getLabel(id));
209
+ }
210
+ async deleteLabel(id) {
211
+ const existing = await this.getLabel(id);
212
+ if (!existing) {
213
+ throw new PMOError('NOT_FOUND', `Label not found: ${id}`);
214
+ }
215
+ // ticket_labels rows cascade on delete
216
+ this.ctx.db.prepare(`DELETE FROM ${T.labels} WHERE id = ?`).run(id);
217
+ }
218
+ // ===========================================================================
219
+ // Ticket-Label Association Operations
220
+ // ===========================================================================
221
+ /**
222
+ * Add a label to a ticket.
223
+ * Enforces group exclusivity: if the label belongs to an exclusive group,
224
+ * removes any existing label from the same group first.
225
+ */
226
+ async addLabelToTicket(ticketId, labelId) {
227
+ // Validate ticket exists
228
+ const ticket = this.ctx.db.prepare(`SELECT id FROM ${T.tickets} WHERE id = ?`).get(ticketId);
229
+ if (!ticket) {
230
+ throw new PMOError('NOT_FOUND', `Ticket not found: ${ticketId}`);
231
+ }
232
+ // Get the label and its group info
233
+ const label = await this.getLabel(labelId);
234
+ if (!label) {
235
+ throw new PMOError('NOT_FOUND', `Label not found: ${labelId}`);
236
+ }
237
+ // If label belongs to an exclusive group, enforce exclusivity
238
+ if (label.groupId) {
239
+ const group = await this.getLabelGroup(label.groupId);
240
+ if (group?.isExclusive) {
241
+ // Remove any existing labels from this group on this ticket
242
+ this.ctx.db.prepare(`
243
+ DELETE FROM ${T.ticket_labels}
244
+ WHERE ticket_id = ? AND label_id IN (
245
+ SELECT id FROM ${T.labels} WHERE group_id = ?
246
+ )
247
+ `).run(ticketId, label.groupId);
248
+ }
249
+ }
250
+ // Add the label (ignore if already exists)
251
+ this.ctx.db.prepare(`
252
+ INSERT OR IGNORE INTO ${T.ticket_labels} (ticket_id, label_id)
253
+ VALUES (?, ?)
254
+ `).run(ticketId, labelId);
255
+ }
256
+ /**
257
+ * Remove a label from a ticket.
258
+ */
259
+ async removeLabelFromTicket(ticketId, labelId) {
260
+ const result = this.ctx.db.prepare(`
261
+ DELETE FROM ${T.ticket_labels}
262
+ WHERE ticket_id = ? AND label_id = ?
263
+ `).run(ticketId, labelId);
264
+ if (result.changes === 0) {
265
+ throw new PMOError('NOT_FOUND', `Label ${labelId} is not applied to ticket ${ticketId}`);
266
+ }
267
+ }
268
+ /**
269
+ * Get all labels for a ticket.
270
+ */
271
+ async getLabelsForTicket(ticketId) {
272
+ const rows = this.ctx.db.prepare(`
273
+ SELECT l.*, lg.name as group_name
274
+ FROM ${T.ticket_labels} tl
275
+ JOIN ${T.labels} l ON tl.label_id = l.id
276
+ LEFT JOIN ${T.label_groups} lg ON l.group_id = lg.id
277
+ WHERE tl.ticket_id = ?
278
+ ORDER BY lg.position ASC, l.position ASC
279
+ `).all(ticketId);
280
+ return rows.map(rowToLabel);
281
+ }
282
+ /**
283
+ * Add a label to a ticket by name.
284
+ * Resolves the label name to an ID first.
285
+ * If the label name matches a group:label pattern, resolves within that group.
286
+ */
287
+ async addLabelToTicketByName(ticketId, labelName) {
288
+ const label = await this.resolveLabelByName(labelName);
289
+ if (!label) {
290
+ throw new PMOError('NOT_FOUND', `Label not found: "${labelName}"`);
291
+ }
292
+ return this.addLabelToTicket(ticketId, label.id);
293
+ }
294
+ /**
295
+ * Remove a label from a ticket by name.
296
+ */
297
+ async removeLabelFromTicketByName(ticketId, labelName) {
298
+ const label = await this.resolveLabelByName(labelName);
299
+ if (!label) {
300
+ throw new PMOError('NOT_FOUND', `Label not found: "${labelName}"`);
301
+ }
302
+ return this.removeLabelFromTicket(ticketId, label.id);
303
+ }
304
+ /**
305
+ * Resolve a label by name or group:name pattern.
306
+ */
307
+ async resolveLabelByName(nameOrPattern) {
308
+ // Check for group:label pattern
309
+ if (nameOrPattern.includes(':')) {
310
+ const [groupName, labelName] = nameOrPattern.split(':', 2);
311
+ const group = await this.getLabelGroupByName(groupName);
312
+ if (group) {
313
+ return this.getLabelByName(labelName, group.id);
314
+ }
315
+ }
316
+ // Try direct name lookup
317
+ return this.getLabelByName(nameOrPattern);
318
+ }
319
+ }
320
+ // ===========================================================================
321
+ // Row Converters
322
+ // ===========================================================================
323
+ function rowToLabelGroup(row) {
324
+ return {
325
+ id: row.id,
326
+ name: row.name,
327
+ description: row.description || undefined,
328
+ isExclusive: row.is_exclusive === 1,
329
+ isRequired: row.is_required === 1,
330
+ position: row.position,
331
+ createdAt: new Date(row.created_at),
332
+ };
333
+ }
334
+ function rowToLabel(row) {
335
+ return {
336
+ id: row.id,
337
+ name: row.name,
338
+ color: row.color || undefined,
339
+ description: row.description || undefined,
340
+ groupId: row.group_id || undefined,
341
+ groupName: row.group_name || undefined,
342
+ position: row.position,
343
+ isBuiltin: row.is_builtin === 1,
344
+ createdAt: new Date(row.created_at),
345
+ };
346
+ }
@@ -576,6 +576,23 @@ export class TicketStorage {
576
576
  query += ' AND ws.name = ?';
577
577
  params.push(filter.column);
578
578
  }
579
+ if (filter?.label) {
580
+ query += ` AND t.id IN (
581
+ SELECT tl.ticket_id FROM ${T.ticket_labels} tl
582
+ JOIN ${T.labels} l ON tl.label_id = l.id
583
+ WHERE LOWER(l.name) = LOWER(?)
584
+ )`;
585
+ params.push(filter.label);
586
+ }
587
+ if (filter?.labelGroup) {
588
+ query += ` AND t.id IN (
589
+ SELECT tl.ticket_id FROM ${T.ticket_labels} tl
590
+ JOIN ${T.labels} l ON tl.label_id = l.id
591
+ JOIN ${T.label_groups} lg ON l.group_id = lg.id
592
+ WHERE LOWER(lg.name) = LOWER(?)
593
+ )`;
594
+ params.push(filter.labelGroup);
595
+ }
579
596
  // Order by status column position, then ticket position within status
580
597
  if (projectIdOrName === undefined) {
581
598
  query += ` ORDER BY p.name, ws.position, t.position ASC, t.created_at ASC`;
@@ -226,3 +226,27 @@ export interface CategoryRow {
226
226
  is_builtin: number;
227
227
  created_at: string;
228
228
  }
229
+ export interface LabelGroupRow {
230
+ id: string;
231
+ name: string;
232
+ description: string | null;
233
+ is_exclusive: number;
234
+ is_required: number;
235
+ position: number;
236
+ created_at: string;
237
+ }
238
+ export interface LabelRow {
239
+ id: string;
240
+ name: string;
241
+ color: string | null;
242
+ description: string | null;
243
+ group_id: string | null;
244
+ group_name?: string | null;
245
+ position: number;
246
+ is_builtin: number;
247
+ created_at: string;
248
+ }
249
+ export interface TicketLabelRow {
250
+ ticket_id: string;
251
+ label_id: string;
252
+ }
@@ -248,6 +248,48 @@ export interface PhaseTemplatePhase {
248
248
  description?: string;
249
249
  isDefault?: boolean;
250
250
  }
251
+ /**
252
+ * Label group - groups related labels and optionally enforces mutual exclusivity.
253
+ * Example: "Function" group (ship/grow/support/bizops/strategy) is exclusive.
254
+ */
255
+ export interface LabelGroup {
256
+ id: string;
257
+ name: string;
258
+ description?: string;
259
+ isExclusive: boolean;
260
+ isRequired: boolean;
261
+ position: number;
262
+ createdAt: Date;
263
+ }
264
+ /**
265
+ * Label - a tag that can be applied to tickets.
266
+ * Labels can optionally belong to a group.
267
+ */
268
+ export interface Label {
269
+ id: string;
270
+ name: string;
271
+ color?: string;
272
+ description?: string;
273
+ groupId?: string;
274
+ groupName?: string;
275
+ position: number;
276
+ isBuiltin: boolean;
277
+ createdAt: Date;
278
+ }
279
+ /**
280
+ * Filter options for listing labels.
281
+ */
282
+ export interface LabelFilter {
283
+ groupId?: string;
284
+ search?: string;
285
+ isBuiltin?: boolean;
286
+ }
287
+ /**
288
+ * Filter options for listing label groups.
289
+ */
290
+ export interface LabelGroupFilter {
291
+ search?: string;
292
+ }
251
293
  /**
252
294
  * Roadmap - a curated collection of projects for documentation/visualization.
253
295
  * Roadmaps group projects in a specific order for generating roadmap documents.
@@ -582,6 +624,8 @@ export interface TicketFilter {
582
624
  column?: string;
583
625
  projectId?: string;
584
626
  allProjects?: boolean;
627
+ label?: string;
628
+ labelGroup?: string;
585
629
  }
586
630
  export interface SpecFilter {
587
631
  status?: SpecStatus;
@@ -269,5 +269,5 @@ export function getPrioritySortIndex(db, value) {
269
269
  return Infinity;
270
270
  const priorities = getWorkspacePriorities(db);
271
271
  const index = priorities.indexOf(value);
272
- return index >= 0 ? index : Infinity;
272
+ return index !== -1 ? index : Infinity;
273
273
  }
@@ -198,14 +198,17 @@ export type JsonOutput = PromptJsonOutput | SuccessJsonOutput | ErrorJsonOutput
198
198
  */
199
199
  export interface JsonFlags {
200
200
  json?: boolean;
201
+ machine?: boolean;
201
202
  }
202
203
  /**
203
204
  * Flags interface for machine-readable output mode detection
204
- * --json is the primary flag, -m/--machine are aliases that set json=true
205
+ * --json and --machine/-m both trigger JSON output mode
205
206
  */
206
207
  export interface MachineOutputFlags {
207
- /** Primary JSON output flag. -m and --machine are aliases to this flag */
208
+ /** JSON output flag */
208
209
  json?: boolean;
210
+ /** Machine output flag (-m shorthand) */
211
+ machine?: boolean;
209
212
  }
210
213
  /**
211
214
  * Check if the current environment is non-TTY (piped output)
@@ -48,8 +48,8 @@ export function isNonTTY() {
48
48
  * @returns true if JSON mode should be used
49
49
  */
50
50
  export function shouldOutputJson(flags) {
51
- // --json flag (includes -m and --machine aliases)
52
- if (flags.json === true) {
51
+ // --json flag or --machine/-m flag
52
+ if (flags.json === true || flags.machine === true) {
53
53
  return true;
54
54
  }
55
55
  // Automatic detection for non-TTY environments
@@ -70,8 +70,8 @@ export const isAgentMode = shouldOutputJson;
70
70
  * @returns true if machine-readable output mode should be used
71
71
  */
72
72
  export function isMachineOutput(flags) {
73
- // --json flag (includes -m and --machine aliases)
74
- if (flags.json === true) {
73
+ // --json flag or --machine/-m flag
74
+ if (flags.json === true || flags.machine === true) {
75
75
  return true;
76
76
  }
77
77
  // Automatic detection for non-TTY environments