@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
@@ -6,7 +6,6 @@ export default class WorkStart 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
  all: import("@oclif/core/interfaces").BooleanFlag<boolean>;
11
10
  executor: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
12
11
  action: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
@@ -29,6 +28,9 @@ export default class WorkStart extends PMOCommand {
29
28
  focus: import("@oclif/core/interfaces").BooleanFlag<boolean>;
30
29
  clone: import("@oclif/core/interfaces").BooleanFlag<boolean>;
31
30
  yes: import("@oclif/core/interfaces").BooleanFlag<boolean>;
31
+ 'use-api-key': import("@oclif/core/interfaces").BooleanFlag<boolean>;
32
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
33
+ machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
32
34
  project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
33
35
  };
34
36
  execute(): Promise<void>;
@@ -1,3 +1,4 @@
1
+ /* eslint-disable max-lines -- large command with many execution paths */
1
2
  import { Args, Flags } from '@oclif/core';
2
3
  import * as fs from 'node:fs';
3
4
  import * as path from 'node:path';
@@ -85,12 +86,6 @@ export default class WorkStart extends PMOCommand {
85
86
  };
86
87
  static flags = {
87
88
  ...pmoBaseFlags,
88
- json: Flags.boolean({
89
- char: 'm',
90
- aliases: ['machine'],
91
- description: 'Output prompt configuration as JSON (for AI agents/scripts)',
92
- default: false,
93
- }),
94
89
  all: Flags.boolean({
95
90
  char: 'a',
96
91
  description: 'Start work on all unassigned backlog tickets (batch mode)',
@@ -185,6 +180,11 @@ export default class WorkStart extends PMOCommand {
185
180
  description: 'Skip confirmation prompt (for non-TTY/scripted execution)',
186
181
  default: false,
187
182
  }),
183
+ 'use-api-key': Flags.boolean({
184
+ description: 'Use ANTHROPIC_API_KEY for Docker containers instead of OAuth credentials',
185
+ default: false,
186
+ hidden: true,
187
+ }),
188
188
  };
189
189
  async execute() {
190
190
  const { args, flags } = await this.parse(WorkStart);
@@ -1006,8 +1006,10 @@ export default class WorkStart extends PMOCommand {
1006
1006
  // Default to interactive output mode (streaming UI)
1007
1007
  // Can be overridden via --output flag if needed
1008
1008
  const outputMode = flags.output || DEFAULT_EXECUTION_CONFIG.outputMode;
1009
+ // Track whether user explicitly chose to use API key instead of OAuth
1010
+ let useApiKey = flags['use-api-key'] || false;
1009
1011
  // Check Docker credentials for devcontainer environment
1010
- if (environment === 'devcontainer') {
1012
+ if (environment === 'devcontainer' && !useApiKey) {
1011
1013
  const hasCredentials = dockerCredentialsExist();
1012
1014
  if (!hasCredentials) {
1013
1015
  // In JSON mode with --yes, continue anyway (agent can run /login)
@@ -1015,10 +1017,19 @@ export default class WorkStart extends PMOCommand {
1015
1017
  // Continue without prompting - agent will need to handle auth
1016
1018
  }
1017
1019
  else {
1020
+ const hasApiKey = !!process.env.ANTHROPIC_API_KEY;
1018
1021
  this.log('');
1019
- this.log(styles.warning('⚠️ No Claude Code credentials found for Docker containers'));
1020
- this.log(styles.muted(' Agents will fail with 401 authentication errors without credentials.'));
1022
+ this.log(styles.warning('⚠️ No Claude Code OAuth credentials found for Docker containers'));
1023
+ this.log(styles.muted(' Agents need credentials to authenticate with Claude.'));
1021
1024
  this.log('');
1025
+ // Build choices based on available options
1026
+ const authChoices = [
1027
+ { name: `🔐 Run ${this.config.bin} agent auth now (recommended — uses Max subscription)`, value: 'auth' },
1028
+ ];
1029
+ if (hasApiKey) {
1030
+ authChoices.push({ name: '🔑 Use ANTHROPIC_API_KEY (⚠️ uses API credits, not Max subscription)', value: 'apikey' });
1031
+ }
1032
+ authChoices.push({ name: '💻 Switch to host environment instead', value: 'host' }, { name: '✗ Cancel', value: 'cancel' });
1022
1033
  // Use FlagResolver for auth action
1023
1034
  const authResolver = new FlagResolver({
1024
1035
  commandName: 'work start',
@@ -1030,12 +1041,7 @@ export default class WorkStart extends PMOCommand {
1030
1041
  flagName: 'authAction',
1031
1042
  type: 'list',
1032
1043
  message: 'What would you like to do?',
1033
- choices: () => [
1034
- { name: `🔐 Run ${this.config.bin} agent auth now (one-time setup)`, value: 'auth' },
1035
- { name: '💻 Switch to host environment instead', value: 'host' },
1036
- { name: '⏩ Continue anyway (must run /login in first agent)', value: 'continue' },
1037
- { name: '✗ Cancel', value: 'cancel' },
1038
- ],
1044
+ choices: () => authChoices,
1039
1045
  });
1040
1046
  const authResult = await authResolver.resolve();
1041
1047
  const authAction = authResult.authAction;
@@ -1048,6 +1054,12 @@ export default class WorkStart extends PMOCommand {
1048
1054
  environment = 'host';
1049
1055
  this.log(styles.muted('Switched to host environment.'));
1050
1056
  }
1057
+ else if (authAction === 'apikey') {
1058
+ useApiKey = true;
1059
+ this.log(styles.warning('Using ANTHROPIC_API_KEY — this will consume API credits.'));
1060
+ this.log(styles.muted(`Run "${this.config.bin} agent auth" to set up OAuth and use your Max subscription instead.`));
1061
+ this.log('');
1062
+ }
1051
1063
  else if (authAction === 'auth') {
1052
1064
  this.log('');
1053
1065
  this.log(styles.primary(`Opening ${this.config.bin} agent auth in new tab...`));
@@ -1100,10 +1112,13 @@ export default class WorkStart extends PMOCommand {
1100
1112
  }
1101
1113
  this.log('');
1102
1114
  }
1103
- // authAction === 'continue' falls through
1104
1115
  }
1105
1116
  }
1106
1117
  }
1118
+ // Pass API key preference to execution context
1119
+ if (useApiKey) {
1120
+ context.useApiKey = true;
1121
+ }
1107
1122
  // Prompt for permissions mode (all environments)
1108
1123
  // Use FlagResolver to handle both JSON mode and interactive prompts consistently
1109
1124
  if (flags['permission-mode']) {
@@ -1617,23 +1632,30 @@ export default class WorkStart extends PMOCommand {
1617
1632
  const agentDir = path.join(workspaceInfo.agentsPath, agent.name);
1618
1633
  return hasDevcontainerConfig(agentDir) && !flags['run-on-host'];
1619
1634
  });
1635
+ // Track whether user explicitly chose to use API key instead of OAuth
1636
+ let batchUseApiKey = false;
1620
1637
  if (anyUseDevcontainer) {
1621
1638
  const hasCredentials = dockerCredentialsExist();
1622
1639
  if (!hasCredentials) {
1640
+ const hasApiKey = !!process.env.ANTHROPIC_API_KEY;
1623
1641
  this.log('');
1624
- this.log(styles.warning('⚠️ No Claude Code credentials found for Docker containers'));
1625
- this.log(styles.muted(' Agents will fail with 401 authentication errors without credentials.'));
1642
+ this.log(styles.warning('⚠️ No Claude Code OAuth credentials found for Docker containers'));
1643
+ this.log(styles.muted(' Agents need credentials to authenticate with Claude.'));
1626
1644
  this.log('');
1645
+ // Build choices based on available options
1646
+ const batchAuthChoices = [
1647
+ { name: `🔐 Run ${this.config.bin} agent auth now (recommended — uses Max subscription)`, value: 'auth', command: `${this.config.bin} agent auth` },
1648
+ ];
1649
+ if (hasApiKey) {
1650
+ batchAuthChoices.push({ name: '🔑 Use ANTHROPIC_API_KEY (⚠️ uses API credits, not Max subscription)', value: 'apikey', command: '' });
1651
+ }
1652
+ batchAuthChoices.push({ name: '💻 Run all agents on host instead (--run-on-host)', value: 'host', command: 'prlt work start --all --run-on-host --json' }, { name: '✗ Cancel', value: 'cancel', command: '' });
1627
1653
  const { authAction } = await this.prompt([
1628
1654
  {
1629
1655
  type: 'list',
1630
1656
  name: 'authAction',
1631
1657
  message: 'What would you like to do?',
1632
- choices: [
1633
- { name: `🔐 Run ${this.config.bin} agent auth now (one-time setup)`, value: 'auth', command: `${this.config.bin} agent auth` },
1634
- { name: '💻 Run all agents on host instead (--run-on-host)', value: 'host', command: 'prlt work start --all --run-on-host --json' },
1635
- { name: '✗ Cancel', value: 'cancel', command: '' },
1636
- ],
1658
+ choices: batchAuthChoices,
1637
1659
  },
1638
1660
  ], batchJsonModeConfig);
1639
1661
  if (authAction === 'cancel') {
@@ -1645,6 +1667,12 @@ export default class WorkStart extends PMOCommand {
1645
1667
  flags['run-on-host'] = true;
1646
1668
  this.log(styles.muted('All agents will run on host.'));
1647
1669
  }
1670
+ else if (authAction === 'apikey') {
1671
+ batchUseApiKey = true;
1672
+ this.log(styles.warning('Using ANTHROPIC_API_KEY — this will consume API credits.'));
1673
+ this.log(styles.muted(`Run "${this.config.bin} agent auth" to set up OAuth and use your Max subscription instead.`));
1674
+ this.log('');
1675
+ }
1648
1676
  else if (authAction === 'auth') {
1649
1677
  this.log('');
1650
1678
  this.log(styles.primary(`Opening ${this.config.bin} agent auth in new tab...`));
@@ -1721,6 +1749,7 @@ export default class WorkStart extends PMOCommand {
1721
1749
  '--display', flags.display || 'background',
1722
1750
  ...(flags.executor ? ['--executor', flags.executor] : []),
1723
1751
  ...(flags['run-on-host'] ? ['--run-on-host'] : []),
1752
+ ...(batchUseApiKey ? ['--use-api-key'] : []),
1724
1753
  ...(flags.force ? ['--force'] : []),
1725
1754
  '--permission-mode', batchPermissionMode,
1726
1755
  ...(flags.clone ? ['--clone'] : []),
@@ -3,7 +3,6 @@ export default class WorkWatch extends PMOCommand {
3
3
  static description: string;
4
4
  static examples: string[];
5
5
  static flags: {
6
- json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
7
6
  column: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
8
7
  strategy: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
9
8
  agent: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
@@ -13,6 +12,8 @@ export default class WorkWatch extends PMOCommand {
13
12
  mode: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
14
13
  'skip-permissions': import("@oclif/core/interfaces").BooleanFlag<boolean>;
15
14
  'create-pr': import("@oclif/core/interfaces").BooleanFlag<boolean>;
15
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
16
+ machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
16
17
  project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
17
18
  };
18
19
  private isRunning;
@@ -21,12 +21,6 @@ export default class WorkWatch extends PMOCommand {
21
21
  ];
22
22
  static flags = {
23
23
  ...pmoBaseFlags,
24
- json: Flags.boolean({
25
- char: 'm',
26
- aliases: ['machine'],
27
- description: 'Output prompt configuration as JSON (for AI agents/scripts)',
28
- default: false,
29
- }),
30
24
  column: Flags.string({
31
25
  char: 'c',
32
26
  description: 'Column to watch for new tickets (prompts if not provided)',
@@ -9,6 +9,7 @@ export default class WorkflowCreate extends PMOCommand {
9
9
  description: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
10
10
  statuses: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
11
11
  json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
12
+ machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
12
13
  project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
13
14
  };
14
15
  protected getPMOOptions(): {
@@ -8,6 +8,7 @@ export default class WorkflowDelete extends PMOCommand {
8
8
  static flags: {
9
9
  force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
10
  json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
11
+ machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
11
12
  project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
12
13
  };
13
14
  protected getPMOOptions(): {
@@ -6,6 +6,7 @@ export default class Workflow extends PMOCommand {
6
6
  builtin: import("@oclif/core/interfaces").BooleanFlag<boolean>;
7
7
  custom: import("@oclif/core/interfaces").BooleanFlag<boolean>;
8
8
  json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
9
+ machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
9
10
  project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
10
11
  };
11
12
  protected getPMOOptions(): {
@@ -18,12 +18,6 @@ export default class Workflow extends PMOCommand {
18
18
  description: 'Show only custom workflows',
19
19
  default: false,
20
20
  }),
21
- json: Flags.boolean({
22
- char: 'm',
23
- aliases: ['machine'],
24
- description: 'Output as JSON',
25
- default: false,
26
- }),
27
21
  };
28
22
  getPMOOptions() {
29
23
  return { promptIfMultiple: false };
@@ -37,7 +31,7 @@ export default class Workflow extends PMOCommand {
37
31
  if (flags.custom)
38
32
  filter.isBuiltin = false;
39
33
  const workflows = await this.storage.listWorkflows(Object.keys(filter).length > 0 ? filter : undefined);
40
- if (flags.json) {
34
+ if (flags.json || flags.machine) {
41
35
  this.log(JSON.stringify(workflows, null, 2));
42
36
  return;
43
37
  }
@@ -6,6 +6,7 @@ export default class WorkflowList extends PMOCommand {
6
6
  builtin: import("@oclif/core/interfaces").BooleanFlag<boolean>;
7
7
  custom: import("@oclif/core/interfaces").BooleanFlag<boolean>;
8
8
  json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
9
+ machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
9
10
  project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
10
11
  };
11
12
  protected getPMOOptions(): {
@@ -8,6 +8,7 @@ export default class WorkflowSwitch extends PMOCommand {
8
8
  static flags: {
9
9
  force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
10
  json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
11
+ machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
11
12
  project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
12
13
  };
13
14
  execute(): Promise<void>;
@@ -7,6 +7,7 @@ export default class WorkflowView 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
  protected getPMOOptions(): {
@@ -7,6 +7,8 @@ export default class WorkspaceAdd extends Command {
7
7
  };
8
8
  static flags: {
9
9
  name: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
10
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
11
+ machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
12
  };
11
13
  run(): Promise<void>;
12
14
  }
@@ -3,6 +3,7 @@ import chalk from 'chalk';
3
3
  import * as fs from 'node:fs';
4
4
  import * as path from 'node:path';
5
5
  import { registerWorkspace, normalizePath, isWorkspaceRegistered, getWorkspaceNameFromPath, } from '../../lib/machine-config.js';
6
+ import { machineOutputFlags } from '../../lib/pmo/index.js';
6
7
  export default class WorkspaceAdd extends Command {
7
8
  static description = 'Register an existing workspace in the machine config';
8
9
  static examples = [
@@ -17,6 +18,7 @@ export default class WorkspaceAdd extends Command {
17
18
  }),
18
19
  };
19
20
  static flags = {
21
+ ...machineOutputFlags,
20
22
  name: Flags.string({
21
23
  char: 'n',
22
24
  description: 'Custom name for the workspace (defaults to directory basename or workspace config name)',
@@ -4,6 +4,7 @@ export default class WorkspaceList 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
  }
@@ -1,6 +1,7 @@
1
- import { Command, Flags } from '@oclif/core';
1
+ import { Command } from '@oclif/core';
2
2
  import chalk from 'chalk';
3
3
  import { findAllHQs, findHQRootWithSource, isValidHQ } from '../../lib/workspace.js';
4
+ import { machineOutputFlags } from '../../lib/pmo/index.js';
4
5
  import { getRegisteredWorkspaces, getActiveWorkspace, } from '../../lib/machine-config.js';
5
6
  import * as fs from 'node:fs';
6
7
  import * as path from 'node:path';
@@ -11,12 +12,7 @@ export default class WorkspaceList extends Command {
11
12
  '<%= config.bin %> <%= command.id %> --json',
12
13
  ];
13
14
  static flags = {
14
- json: Flags.boolean({
15
- char: 'm',
16
- aliases: ['machine'],
17
- description: 'Output as JSON for machine-readable format',
18
- default: false,
19
- }),
15
+ ...machineOutputFlags,
20
16
  };
21
17
  async run() {
22
18
  const { flags } = await this.parse(WorkspaceList);
@@ -82,7 +78,7 @@ export default class WorkspaceList extends Command {
82
78
  });
83
79
  }
84
80
  // JSON output
85
- if (flags.json) {
81
+ if (flags.json || flags.machine) {
86
82
  const output = {
87
83
  workspaces: workspaces.map((w) => ({
88
84
  name: w.name,
@@ -6,6 +6,7 @@ export default class WorkspacePrune extends PromptCommand {
6
6
  'dry-run': import("@oclif/core/interfaces").BooleanFlag<boolean>;
7
7
  force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
8
8
  json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
9
+ machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
9
10
  };
10
11
  run(): Promise<void>;
11
12
  private findStaleWorkspaces;
@@ -6,6 +6,7 @@ import { styles } from '../../lib/styles.js';
6
6
  import { getRegisteredHeadquarters, unregisterHeadquarters, } from '../../lib/machine-config.js';
7
7
  import { getWorkspaceAgents, removeAgentsFromDatabase, getDatabasePath, } from '../../lib/database/index.js';
8
8
  import { outputConfirmationNeededAsJson, createMetadata, } from '../../lib/prompt-json.js';
9
+ import { machineOutputFlags } from '../../lib/pmo/index.js';
9
10
  export default class WorkspacePrune extends PromptCommand {
10
11
  static description = 'Remove stale workspace entries and agents with deleted worktrees';
11
12
  static examples = [
@@ -14,6 +15,7 @@ export default class WorkspacePrune extends PromptCommand {
14
15
  '<%= config.bin %> <%= command.id %> --force',
15
16
  ];
16
17
  static flags = {
18
+ ...machineOutputFlags,
17
19
  'dry-run': Flags.boolean({
18
20
  char: 'd',
19
21
  description: 'Show what would be removed without removing',
@@ -24,23 +26,19 @@ export default class WorkspacePrune extends PromptCommand {
24
26
  description: 'Skip confirmation prompt and prune immediately',
25
27
  default: false,
26
28
  }),
27
- json: Flags.boolean({
28
- description: 'Output as JSON',
29
- default: false,
30
- }),
31
29
  };
32
30
  async run() {
33
31
  const { flags } = await this.parse(WorkspacePrune);
34
32
  // In non-TTY mode without --json (CI, scripts, piped), default to dry-run unless --force is set.
35
33
  // In --json mode, we use confirmation_needed output instead of auto-dry-run so agents can review and confirm.
36
34
  const isNonTTY = !process.stdout.isTTY;
37
- const effectiveDryRun = flags['dry-run'] || (!flags.json && isNonTTY && !flags.force);
35
+ const effectiveDryRun = flags['dry-run'] || (!(flags.json || flags.machine) && isNonTTY && !flags.force);
38
36
  // Find stale entries
39
37
  const staleWorkspaces = this.findStaleWorkspaces();
40
38
  const staleAgents = this.findStaleAgents();
41
39
  const totalStale = staleWorkspaces.length + staleAgents.length;
42
40
  // JSON output
43
- if (flags.json) {
41
+ if (flags.json || flags.machine) {
44
42
  const output = {
45
43
  dryRun: effectiveDryRun,
46
44
  staleWorkspaces: staleWorkspaces.map(w => ({
@@ -7,6 +7,7 @@ export default class WorkspaceRemove extends PromptCommand {
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
  };
11
12
  run(): Promise<void>;
12
13
  private resolveWorkspacePath;
@@ -1,6 +1,7 @@
1
- import { Args, Flags } from '@oclif/core';
1
+ import { Args } from '@oclif/core';
2
2
  import chalk from 'chalk';
3
3
  import { PromptCommand } from '../../lib/prompt-command.js';
4
+ import { machineOutputFlags } from '../../lib/pmo/index.js';
4
5
  import { findWorkspacesByName, findWorkspaceByPath, unregisterWorkspace, normalizePath, getActiveWorkspace, } from '../../lib/machine-config.js';
5
6
  import { shouldOutputJson, outputErrorAsJson, createMetadata, } from '../../lib/prompt-json.js';
6
7
  export default class WorkspaceRemove extends PromptCommand {
@@ -16,12 +17,7 @@ export default class WorkspaceRemove extends PromptCommand {
16
17
  }),
17
18
  };
18
19
  static flags = {
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
- }),
20
+ ...machineOutputFlags,
25
21
  };
26
22
  async run() {
27
23
  const { args, flags } = await this.parse(WorkspaceRemove);
@@ -7,6 +7,7 @@ export default class WorkspaceUse extends PromptCommand {
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
  };
11
12
  run(): Promise<void>;
12
13
  }
@@ -1,7 +1,8 @@
1
- import { Args, Flags } from '@oclif/core';
1
+ import { Args } from '@oclif/core';
2
2
  import chalk from 'chalk';
3
3
  import * as fs from 'node:fs';
4
4
  import { PromptCommand } from '../../lib/prompt-command.js';
5
+ import { machineOutputFlags } from '../../lib/pmo/index.js';
5
6
  import { isValidHQ } from '../../lib/workspace.js';
6
7
  import { findWorkspacesByName, findWorkspaceByPath, setActiveWorkspace, normalizePath, getRegisteredWorkspaces, } from '../../lib/machine-config.js';
7
8
  export default class WorkspaceUse extends PromptCommand {
@@ -17,12 +18,7 @@ export default class WorkspaceUse extends PromptCommand {
17
18
  }),
18
19
  };
19
20
  static flags = {
20
- json: Flags.boolean({
21
- char: 'm',
22
- aliases: ['machine'],
23
- description: 'Output prompt configuration as JSON (for AI agents/scripts)',
24
- default: false,
25
- }),
21
+ ...machineOutputFlags,
26
22
  };
27
23
  async run() {
28
24
  const { args, flags } = await this.parse(WorkspaceUse);
@@ -33,7 +33,7 @@ export declare const workspace: import("drizzle-orm/sqlite-core").SQLiteTableWit
33
33
  tableName: "workspace";
34
34
  dataType: "string";
35
35
  columnType: "SQLiteText";
36
- data: "hq" | "workspace";
36
+ data: "workspace" | "hq";
37
37
  driverParam: string;
38
38
  notNull: true;
39
39
  hasDefault: false;
@@ -52,7 +52,7 @@ export interface AgentWorktree {
52
52
  is_clean: boolean;
53
53
  last_checked?: string;
54
54
  }
55
- export declare const CREATE_TABLES_SQL = "\n-- Core workspace metadata\nCREATE TABLE IF NOT EXISTS workspace (\n id INTEGER PRIMARY KEY CHECK (id = 1),\n type TEXT NOT NULL CHECK (type IN ('hq', 'workspace')),\n workspace_name TEXT NOT NULL,\n has_pmo BOOLEAN DEFAULT FALSE,\n active_theme_id TEXT,\n created_at TEXT NOT NULL,\n FOREIGN KEY (active_theme_id) REFERENCES agent_themes(id) ON DELETE SET NULL\n);\n\n-- Repository management\nCREATE TABLE IF NOT EXISTS repositories (\n name TEXT PRIMARY KEY,\n path TEXT NOT NULL,\n type TEXT DEFAULT 'main' CHECK (type IN ('main', 'dependency')),\n source_url TEXT,\n action TEXT CHECK (action IN ('clone', 'move', 'link')),\n added_at TEXT NOT NULL\n);\n\n-- Agent naming themes (optional)\nCREATE TABLE IF NOT EXISTS agent_themes (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL UNIQUE,\n display_name TEXT NOT NULL,\n description TEXT,\n builtin BOOLEAN DEFAULT FALSE,\n created_at TEXT NOT NULL\n);\n\n-- Names available within each theme\nCREATE TABLE IF NOT EXISTS agent_theme_names (\n theme_id TEXT NOT NULL,\n name TEXT NOT NULL,\n PRIMARY KEY (theme_id, name),\n FOREIGN KEY (theme_id) REFERENCES agent_themes(id) ON DELETE CASCADE\n);\n\n-- Agent instances in workspace\nCREATE TABLE IF NOT EXISTS agents (\n name TEXT PRIMARY KEY,\n type TEXT NOT NULL DEFAULT 'persistent' CHECK (type IN ('persistent', 'ephemeral')),\n status TEXT NOT NULL DEFAULT 'active' CHECK (status IN ('active', 'cleaned')),\n base_name TEXT,\n theme_id TEXT,\n worktree_path TEXT,\n mount_mode TEXT NOT NULL DEFAULT 'worktree' CHECK (mount_mode IN ('worktree', 'clone')),\n created_at TEXT NOT NULL,\n cleaned_at TEXT,\n FOREIGN KEY (theme_id) REFERENCES agent_themes(id) ON DELETE SET NULL\n);\n\n-- Agent-owned worktrees\nCREATE TABLE IF NOT EXISTS agent_worktrees (\n agent_name TEXT NOT NULL,\n repo_name TEXT NOT NULL,\n worktree_path TEXT NOT NULL,\n branch TEXT NOT NULL,\n created_at TEXT NOT NULL,\n PRIMARY KEY (agent_name, repo_name),\n FOREIGN KEY (agent_name) REFERENCES agents(name) ON DELETE CASCADE,\n FOREIGN KEY (repo_name) REFERENCES repositories(name) ON DELETE CASCADE\n);\n\n-- Workspace-level settings (key-value store)\nCREATE TABLE IF NOT EXISTS workspace_settings (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n);\n\n-- =============================================================================\n-- Indexes\n-- =============================================================================\n\nCREATE INDEX IF NOT EXISTS idx_worktrees_agent ON agent_worktrees(agent_name);\nCREATE INDEX IF NOT EXISTS idx_worktrees_repo ON agent_worktrees(repo_name);\nCREATE INDEX IF NOT EXISTS idx_theme_names_theme ON agent_theme_names(theme_id);\nCREATE INDEX IF NOT EXISTS idx_agents_theme ON agents(theme_id);\n";
55
+ export declare const CREATE_TABLES_SQL = "\n-- Core workspace metadata\nCREATE TABLE IF NOT EXISTS workspace (\n id INTEGER PRIMARY KEY CHECK (id = 1),\n type TEXT NOT NULL CHECK (type IN ('hq', 'workspace')),\n workspace_name TEXT NOT NULL,\n has_pmo BOOLEAN DEFAULT FALSE,\n active_theme_id TEXT,\n created_at TEXT NOT NULL,\n FOREIGN KEY (active_theme_id) REFERENCES agent_themes(id) ON DELETE SET NULL\n);\n\n-- Repository management\nCREATE TABLE IF NOT EXISTS repositories (\n name TEXT PRIMARY KEY,\n path TEXT NOT NULL,\n type TEXT DEFAULT 'main' CHECK (type IN ('main', 'dependency')),\n source_url TEXT,\n action TEXT CHECK (action IN ('clone', 'move', 'link')),\n added_at TEXT NOT NULL\n);\n\n-- Agent naming themes (optional)\nCREATE TABLE IF NOT EXISTS agent_themes (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL UNIQUE,\n display_name TEXT NOT NULL,\n description TEXT,\n builtin BOOLEAN DEFAULT FALSE,\n created_at TEXT NOT NULL\n);\n\n-- Names available within each theme\nCREATE TABLE IF NOT EXISTS agent_theme_names (\n theme_id TEXT NOT NULL,\n name TEXT NOT NULL,\n PRIMARY KEY (theme_id, name),\n FOREIGN KEY (theme_id) REFERENCES agent_themes(id) ON DELETE CASCADE\n);\n\n-- Agent instances in workspace\nCREATE TABLE IF NOT EXISTS agents (\n name TEXT PRIMARY KEY,\n type TEXT NOT NULL DEFAULT 'persistent' CHECK (type IN ('persistent', 'ephemeral')),\n status TEXT NOT NULL DEFAULT 'active' CHECK (status IN ('active', 'cleaned')),\n base_name TEXT,\n theme_id TEXT,\n worktree_path TEXT,\n mount_mode TEXT NOT NULL DEFAULT 'worktree' CHECK (mount_mode IN ('worktree', 'clone')),\n created_at TEXT NOT NULL,\n cleaned_at TEXT,\n FOREIGN KEY (theme_id) REFERENCES agent_themes(id) ON DELETE SET NULL\n);\n\n-- Agent-owned worktrees\nCREATE TABLE IF NOT EXISTS agent_worktrees (\n agent_name TEXT NOT NULL,\n repo_name TEXT NOT NULL,\n worktree_path TEXT NOT NULL,\n branch TEXT NOT NULL,\n created_at TEXT NOT NULL,\n last_commit_hash TEXT,\n commits_ahead INTEGER NOT NULL DEFAULT 0,\n is_clean INTEGER NOT NULL DEFAULT 1,\n last_checked TEXT,\n PRIMARY KEY (agent_name, repo_name),\n FOREIGN KEY (agent_name) REFERENCES agents(name) ON DELETE CASCADE,\n FOREIGN KEY (repo_name) REFERENCES repositories(name) ON DELETE CASCADE\n);\n\n-- Workspace-level settings (key-value store)\nCREATE TABLE IF NOT EXISTS workspace_settings (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n);\n\n-- =============================================================================\n-- Indexes\n-- =============================================================================\n\nCREATE INDEX IF NOT EXISTS idx_worktrees_agent ON agent_worktrees(agent_name);\nCREATE INDEX IF NOT EXISTS idx_worktrees_repo ON agent_worktrees(repo_name);\nCREATE INDEX IF NOT EXISTS idx_theme_names_theme ON agent_theme_names(theme_id);\nCREATE INDEX IF NOT EXISTS idx_agents_theme ON agents(theme_id);\n";
56
56
  /**
57
57
  * Get the database path for a workspace
58
58
  */
@@ -64,6 +64,10 @@ CREATE TABLE IF NOT EXISTS agent_worktrees (
64
64
  worktree_path TEXT NOT NULL,
65
65
  branch TEXT NOT NULL,
66
66
  created_at TEXT NOT NULL,
67
+ last_commit_hash TEXT,
68
+ commits_ahead INTEGER NOT NULL DEFAULT 0,
69
+ is_clean INTEGER NOT NULL DEFAULT 1,
70
+ last_checked TEXT,
67
71
  PRIMARY KEY (agent_name, repo_name),
68
72
  FOREIGN KEY (agent_name) REFERENCES agents(name) ON DELETE CASCADE,
69
73
  FOREIGN KEY (repo_name) REFERENCES repositories(name) ON DELETE CASCADE
@@ -184,6 +188,22 @@ export function openWorkspaceDatabase(workspacePath) {
184
188
  catch {
185
189
  // Ignore migration errors - table might not exist yet
186
190
  }
191
+ // Migration: add missing columns to agent_worktrees table (TKT-1014)
192
+ try {
193
+ const worktreesTableExists = db.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='agent_worktrees'").get();
194
+ if (worktreesTableExists) {
195
+ const worktreeTableInfo = db.prepare("PRAGMA table_info(agent_worktrees)").all();
196
+ if (!worktreeTableInfo.some(col => col.name === 'commits_ahead')) {
197
+ db.exec("ALTER TABLE agent_worktrees ADD COLUMN last_commit_hash TEXT");
198
+ db.exec("ALTER TABLE agent_worktrees ADD COLUMN commits_ahead INTEGER NOT NULL DEFAULT 0");
199
+ db.exec("ALTER TABLE agent_worktrees ADD COLUMN is_clean INTEGER NOT NULL DEFAULT 1");
200
+ db.exec("ALTER TABLE agent_worktrees ADD COLUMN last_checked TEXT");
201
+ }
202
+ }
203
+ }
204
+ catch {
205
+ // Ignore migration errors - table might not exist yet or columns already exist
206
+ }
187
207
  // Migration: add mount_mode column to agents table (TKT-686)
188
208
  try {
189
209
  const agentsTableInfo = db.prepare("PRAGMA table_info(agents)").all();
@@ -96,7 +96,9 @@ export function generateDevcontainerJson(options, config) {
96
96
  mounts,
97
97
  containerEnv: {
98
98
  DEVCONTAINER: 'true',
99
- ANTHROPIC_API_KEY: '${localEnv:ANTHROPIC_API_KEY}',
99
+ // NOTE: ANTHROPIC_API_KEY is intentionally NOT passed by default.
100
+ // Claude Code prefers API key over OAuth, so passing it would cause agents
101
+ // to burn API credits instead of using Max subscription via OAuth.
100
102
  // GH_TOKEN enables gh CLI in container (for PR creation, etc.)
101
103
  GH_TOKEN: '${localEnv:GH_TOKEN}',
102
104
  GITHUB_TOKEN: '${localEnv:GITHUB_TOKEN}',
@@ -46,8 +46,13 @@ export declare function configureITermTmuxWindowMode(mode: 'tab' | 'window'): vo
46
46
  */
47
47
  export declare function credentialsVolumeExists(): boolean;
48
48
  /**
49
- * Check if valid Claude credentials exist in the Docker volume.
50
- * Returns true if credentials exist and are not expired.
49
+ * Check if valid Claude OAuth credentials exist in the Docker volume.
50
+ * Returns true if OAuth credentials are stored (even if access token is expired,
51
+ * since Claude Code handles refresh internally using stored refresh tokens).
52
+ *
53
+ * NOTE: This intentionally does NOT check for ANTHROPIC_API_KEY. If the user
54
+ * has an API key but no OAuth credentials, we want to prompt them to set up
55
+ * OAuth (which uses their Max subscription) rather than silently burning API credits.
51
56
  */
52
57
  export declare function dockerCredentialsExist(): boolean;
53
58
  /**
@@ -1,3 +1,4 @@
1
+ /* eslint-disable max-lines -- runner implementations require cohesive logic */
1
2
  /**
2
3
  * Execution Runners
3
4
  *
@@ -102,19 +103,23 @@ export function credentialsVolumeExists() {
102
103
  }
103
104
  }
104
105
  /**
105
- * Check if valid Claude credentials exist in the Docker volume.
106
- * Returns true if credentials exist and are not expired.
106
+ * Check if valid Claude OAuth credentials exist in the Docker volume.
107
+ * Returns true if OAuth credentials are stored (even if access token is expired,
108
+ * since Claude Code handles refresh internally using stored refresh tokens).
109
+ *
110
+ * NOTE: This intentionally does NOT check for ANTHROPIC_API_KEY. If the user
111
+ * has an API key but no OAuth credentials, we want to prompt them to set up
112
+ * OAuth (which uses their Max subscription) rather than silently burning API credits.
107
113
  */
108
114
  export function dockerCredentialsExist() {
109
115
  try {
110
116
  const result = execSync(`docker run --rm -v ${CLAUDE_CREDENTIALS_VOLUME}:/data alpine cat /data/.credentials.json 2>/dev/null`, { stdio: 'pipe', encoding: 'utf-8' });
111
117
  const creds = JSON.parse(result);
112
- if (creds.claudeAiOauth?.accessToken && creds.claudeAiOauth?.expiresAt) {
113
- // Check if expired
114
- const expiresAt = creds.claudeAiOauth.expiresAt;
115
- if (expiresAt > Date.now()) {
116
- return true;
117
- }
118
+ // Check if OAuth credentials exist. Don't check expiration because
119
+ // access tokens are short-lived but Claude Code handles token refresh
120
+ // internally using stored refresh tokens.
121
+ if (creds.claudeAiOauth?.accessToken) {
122
+ return true;
118
123
  }
119
124
  return false;
120
125
  }
@@ -767,7 +772,10 @@ function createDockerContainer(context, containerName, imageName, config) {
767
772
  `-e PRLT_HQ_PATH=/hq`,
768
773
  `-e PRLT_AGENT_NAME="${context.agentName}"`,
769
774
  `-e PRLT_HOST_PATH="${context.agentDir}"`,
770
- ...(process.env.ANTHROPIC_API_KEY ? [`-e ANTHROPIC_API_KEY="${process.env.ANTHROPIC_API_KEY}"`] : []),
775
+ // Only pass ANTHROPIC_API_KEY if the user explicitly chose to use it (no OAuth creds).
776
+ // Claude Code prefers API key over OAuth, so passing it would cause agents to burn
777
+ // API credits instead of using Max subscription.
778
+ ...(context.useApiKey && process.env.ANTHROPIC_API_KEY ? [`-e ANTHROPIC_API_KEY="${process.env.ANTHROPIC_API_KEY}"`] : []),
771
779
  ...(process.env.GITHUB_TOKEN ? [`-e GITHUB_TOKEN="${process.env.GITHUB_TOKEN}"`] : []),
772
780
  ...(process.env.GH_TOKEN ? [`-e GH_TOKEN="${process.env.GH_TOKEN}"`] : []),
773
781
  // NOTE: Do NOT pass CLAUDE_CODE_OAUTH_TOKEN - it overrides credentials file
@@ -1509,7 +1517,7 @@ exec bash
1509
1517
  try {
1510
1518
  execSync(`docker exec ${actualContainerId} tmux has-session -t "${sessionName}" 2>&1`, { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] });
1511
1519
  }
1512
- catch (err) {
1520
+ catch {
1513
1521
  return {
1514
1522
  success: false,
1515
1523
  error: `Failed to verify tmux session "${sessionName}" inside container. The session may not have started correctly.`,