@proletariat/cli 0.3.51 → 0.3.53

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 (883) hide show
  1. package/README.md +28 -0
  2. package/bin/run.js +21 -11
  3. package/dist/commands/action/create.js +1 -0
  4. package/dist/commands/action/create.js.map +1 -0
  5. package/dist/commands/action/delete.js +1 -0
  6. package/dist/commands/action/delete.js.map +1 -0
  7. package/dist/commands/action/index.js +1 -0
  8. package/dist/commands/action/index.js.map +1 -0
  9. package/dist/commands/action/list.js +1 -0
  10. package/dist/commands/action/list.js.map +1 -0
  11. package/dist/commands/action/run.js +1 -0
  12. package/dist/commands/action/run.js.map +1 -0
  13. package/dist/commands/action/show.js +1 -0
  14. package/dist/commands/action/show.js.map +1 -0
  15. package/dist/commands/action/update.js +1 -0
  16. package/dist/commands/action/update.js.map +1 -0
  17. package/dist/commands/agent/auth.js +1 -0
  18. package/dist/commands/agent/auth.js.map +1 -0
  19. package/dist/commands/agent/cleanup.js +1 -0
  20. package/dist/commands/agent/cleanup.js.map +1 -0
  21. package/dist/commands/agent/discover.js +1 -0
  22. package/dist/commands/agent/discover.js.map +1 -0
  23. package/dist/commands/agent/index.js +1 -0
  24. package/dist/commands/agent/index.js.map +1 -0
  25. package/dist/commands/agent/list.js +1 -0
  26. package/dist/commands/agent/list.js.map +1 -0
  27. package/dist/commands/agent/login.js +1 -0
  28. package/dist/commands/agent/login.js.map +1 -0
  29. package/dist/commands/agent/rebuild.js +1 -0
  30. package/dist/commands/agent/rebuild.js.map +1 -0
  31. package/dist/commands/agent/remove.js +1 -0
  32. package/dist/commands/agent/remove.js.map +1 -0
  33. package/dist/commands/agent/restart.js +1 -0
  34. package/dist/commands/agent/restart.js.map +1 -0
  35. package/dist/commands/agent/shell.js +5 -1
  36. package/dist/commands/agent/shell.js.map +1 -0
  37. package/dist/commands/agent/staff/add.js +1 -0
  38. package/dist/commands/agent/staff/add.js.map +1 -0
  39. package/dist/commands/agent/staff/index.js +1 -0
  40. package/dist/commands/agent/staff/index.js.map +1 -0
  41. package/dist/commands/agent/staff/list.js +1 -0
  42. package/dist/commands/agent/staff/list.js.map +1 -0
  43. package/dist/commands/agent/staff/remove.js +1 -0
  44. package/dist/commands/agent/staff/remove.js.map +1 -0
  45. package/dist/commands/agent/status.js +2 -0
  46. package/dist/commands/agent/status.js.map +1 -0
  47. package/dist/commands/agent/themes/add-names.js +1 -0
  48. package/dist/commands/agent/themes/add-names.js.map +1 -0
  49. package/dist/commands/agent/themes/create.js +1 -0
  50. package/dist/commands/agent/themes/create.js.map +1 -0
  51. package/dist/commands/agent/themes/index.js +1 -0
  52. package/dist/commands/agent/themes/index.js.map +1 -0
  53. package/dist/commands/agent/themes/list.js +1 -0
  54. package/dist/commands/agent/themes/list.js.map +1 -0
  55. package/dist/commands/agent/themes/set.js +1 -0
  56. package/dist/commands/agent/themes/set.js.map +1 -0
  57. package/dist/commands/agent/visit.js +1 -0
  58. package/dist/commands/agent/visit.js.map +1 -0
  59. package/dist/commands/agents/themes/add-names.js +1 -0
  60. package/dist/commands/agents/themes/add-names.js.map +1 -0
  61. package/dist/commands/agents/themes/create.js +1 -0
  62. package/dist/commands/agents/themes/create.js.map +1 -0
  63. package/dist/commands/agents/themes/list.js +1 -0
  64. package/dist/commands/agents/themes/list.js.map +1 -0
  65. package/dist/commands/asana/connect.d.ts +15 -0
  66. package/dist/commands/asana/connect.js +268 -0
  67. package/dist/commands/asana/connect.js.map +1 -0
  68. package/dist/commands/asana/sync.d.ts +15 -0
  69. package/dist/commands/asana/sync.js +190 -0
  70. package/dist/commands/asana/sync.js.map +1 -0
  71. package/dist/commands/autocomplete/setup.js +1 -0
  72. package/dist/commands/autocomplete/setup.js.map +1 -0
  73. package/dist/commands/board/index.js +1 -0
  74. package/dist/commands/board/index.js.map +1 -0
  75. package/dist/commands/board/view.js +1 -0
  76. package/dist/commands/board/view.js.map +1 -0
  77. package/dist/commands/board/watch.js +1 -0
  78. package/dist/commands/board/watch.js.map +1 -0
  79. package/dist/commands/branch/create.js +1 -0
  80. package/dist/commands/branch/create.js.map +1 -0
  81. package/dist/commands/branch/index.js +1 -0
  82. package/dist/commands/branch/index.js.map +1 -0
  83. package/dist/commands/branch/list.js +1 -0
  84. package/dist/commands/branch/list.js.map +1 -0
  85. package/dist/commands/branch/validate.js +1 -0
  86. package/dist/commands/branch/validate.js.map +1 -0
  87. package/dist/commands/branch/where.js +1 -0
  88. package/dist/commands/branch/where.js.map +1 -0
  89. package/dist/commands/caffeinate/index.js +1 -0
  90. package/dist/commands/caffeinate/index.js.map +1 -0
  91. package/dist/commands/caffeinate/start.js +1 -0
  92. package/dist/commands/caffeinate/start.js.map +1 -0
  93. package/dist/commands/caffeinate/status.js +1 -0
  94. package/dist/commands/caffeinate/status.js.map +1 -0
  95. package/dist/commands/caffeinate/stop.js +1 -0
  96. package/dist/commands/caffeinate/stop.js.map +1 -0
  97. package/dist/commands/category/create.js +1 -0
  98. package/dist/commands/category/create.js.map +1 -0
  99. package/dist/commands/category/delete.js +1 -0
  100. package/dist/commands/category/delete.js.map +1 -0
  101. package/dist/commands/category/index.js +1 -0
  102. package/dist/commands/category/index.js.map +1 -0
  103. package/dist/commands/category/list.js +1 -0
  104. package/dist/commands/category/list.js.map +1 -0
  105. package/dist/commands/category/rename.js +1 -0
  106. package/dist/commands/category/rename.js.map +1 -0
  107. package/dist/commands/claude/index.js +11 -5
  108. package/dist/commands/claude/index.js.map +1 -0
  109. package/dist/commands/claude/open.js +1 -0
  110. package/dist/commands/claude/open.js.map +1 -0
  111. package/dist/commands/commit.js +1 -0
  112. package/dist/commands/commit.js.map +1 -0
  113. package/dist/commands/config/index.js +8 -1
  114. package/dist/commands/config/index.js.map +1 -0
  115. package/dist/commands/diet.js +1 -0
  116. package/dist/commands/diet.js.map +1 -0
  117. package/dist/commands/docker/clean.js +1 -0
  118. package/dist/commands/docker/clean.js.map +1 -0
  119. package/dist/commands/docker/index.js +1 -0
  120. package/dist/commands/docker/index.js.map +1 -0
  121. package/dist/commands/docker/list.js +1 -0
  122. package/dist/commands/docker/list.js.map +1 -0
  123. package/dist/commands/docker/logs.js +4 -1
  124. package/dist/commands/docker/logs.js.map +1 -0
  125. package/dist/commands/docker/prune.js +1 -0
  126. package/dist/commands/docker/prune.js.map +1 -0
  127. package/dist/commands/docker/restart.js +1 -0
  128. package/dist/commands/docker/restart.js.map +1 -0
  129. package/dist/commands/docker/shell.js +4 -1
  130. package/dist/commands/docker/shell.js.map +1 -0
  131. package/dist/commands/docker/start.js +1 -0
  132. package/dist/commands/docker/start.js.map +1 -0
  133. package/dist/commands/docker/status.js +1 -0
  134. package/dist/commands/docker/status.js.map +1 -0
  135. package/dist/commands/docker/stop.js +1 -0
  136. package/dist/commands/docker/stop.js.map +1 -0
  137. package/dist/commands/docker/sync.js +1 -0
  138. package/dist/commands/docker/sync.js.map +1 -0
  139. package/dist/commands/epic/activate.js +1 -0
  140. package/dist/commands/epic/activate.js.map +1 -0
  141. package/dist/commands/epic/archive.js +1 -0
  142. package/dist/commands/epic/archive.js.map +1 -0
  143. package/dist/commands/epic/create.js +1 -0
  144. package/dist/commands/epic/create.js.map +1 -0
  145. package/dist/commands/epic/delete.js +1 -0
  146. package/dist/commands/epic/delete.js.map +1 -0
  147. package/dist/commands/epic/index.js +1 -0
  148. package/dist/commands/epic/index.js.map +1 -0
  149. package/dist/commands/epic/list.js +1 -0
  150. package/dist/commands/epic/list.js.map +1 -0
  151. package/dist/commands/epic/move.js +1 -0
  152. package/dist/commands/epic/move.js.map +1 -0
  153. package/dist/commands/epic/progress.js +1 -0
  154. package/dist/commands/epic/progress.js.map +1 -0
  155. package/dist/commands/epic/project.js +1 -0
  156. package/dist/commands/epic/project.js.map +1 -0
  157. package/dist/commands/epic/reorder.js +1 -0
  158. package/dist/commands/epic/reorder.js.map +1 -0
  159. package/dist/commands/epic/show.js +1 -0
  160. package/dist/commands/epic/show.js.map +1 -0
  161. package/dist/commands/epic/spec.js +1 -0
  162. package/dist/commands/epic/spec.js.map +1 -0
  163. package/dist/commands/epic/ticket.js +1 -0
  164. package/dist/commands/epic/ticket.js.map +1 -0
  165. package/dist/commands/epic/view.js +1 -0
  166. package/dist/commands/epic/view.js.map +1 -0
  167. package/dist/commands/execution/config.js +1 -0
  168. package/dist/commands/execution/config.js.map +1 -0
  169. package/dist/commands/execution/index.js +1 -0
  170. package/dist/commands/execution/index.js.map +1 -0
  171. package/dist/commands/execution/kill.js +1 -0
  172. package/dist/commands/execution/kill.js.map +1 -0
  173. package/dist/commands/execution/list.js +4 -0
  174. package/dist/commands/execution/list.js.map +1 -0
  175. package/dist/commands/execution/logs.js +4 -5
  176. package/dist/commands/execution/logs.js.map +1 -0
  177. package/dist/commands/execution/stop.js +1 -0
  178. package/dist/commands/execution/stop.js.map +1 -0
  179. package/dist/commands/execution/view.js +11 -0
  180. package/dist/commands/execution/view.js.map +1 -0
  181. package/dist/commands/feedback/index.js +1 -0
  182. package/dist/commands/feedback/index.js.map +1 -0
  183. package/dist/commands/feedback/list.js +1 -0
  184. package/dist/commands/feedback/list.js.map +1 -0
  185. package/dist/commands/feedback/submit.js +1 -0
  186. package/dist/commands/feedback/submit.js.map +1 -0
  187. package/dist/commands/feedback/view.js +1 -0
  188. package/dist/commands/feedback/view.js.map +1 -0
  189. package/dist/commands/gh/index.js +1 -0
  190. package/dist/commands/gh/index.js.map +1 -0
  191. package/dist/commands/gh/login.js +4 -1
  192. package/dist/commands/gh/login.js.map +1 -0
  193. package/dist/commands/gh/status.js +1 -0
  194. package/dist/commands/gh/status.js.map +1 -0
  195. package/dist/commands/gh/token.js +1 -0
  196. package/dist/commands/gh/token.js.map +1 -0
  197. package/dist/commands/init.js +1 -0
  198. package/dist/commands/init.js.map +1 -0
  199. package/dist/commands/label/create.js +1 -0
  200. package/dist/commands/label/create.js.map +1 -0
  201. package/dist/commands/label/delete.js +1 -0
  202. package/dist/commands/label/delete.js.map +1 -0
  203. package/dist/commands/label/group/create.js +1 -0
  204. package/dist/commands/label/group/create.js.map +1 -0
  205. package/dist/commands/label/group/list.js +1 -0
  206. package/dist/commands/label/group/list.js.map +1 -0
  207. package/dist/commands/label/index.js +1 -0
  208. package/dist/commands/label/index.js.map +1 -0
  209. package/dist/commands/label/list.js +1 -0
  210. package/dist/commands/label/list.js.map +1 -0
  211. package/dist/commands/linear/auth.d.ts +1 -0
  212. package/dist/commands/linear/auth.js +7 -5
  213. package/dist/commands/linear/auth.js.map +1 -0
  214. package/dist/commands/linear/connect.d.ts +17 -0
  215. package/dist/commands/linear/connect.js +298 -0
  216. package/dist/commands/linear/connect.js.map +1 -0
  217. package/dist/commands/linear/import.js +3 -2
  218. package/dist/commands/linear/import.js.map +1 -0
  219. package/dist/commands/linear/status.js +42 -5
  220. package/dist/commands/linear/status.js.map +1 -0
  221. package/dist/commands/linear/sync.js +3 -2
  222. package/dist/commands/linear/sync.js.map +1 -0
  223. package/dist/commands/link/create.js +1 -0
  224. package/dist/commands/link/create.js.map +1 -0
  225. package/dist/commands/link/index.js +1 -0
  226. package/dist/commands/link/index.js.map +1 -0
  227. package/dist/commands/link/list.js +1 -0
  228. package/dist/commands/link/list.js.map +1 -0
  229. package/dist/commands/link/remove.js +1 -0
  230. package/dist/commands/link/remove.js.map +1 -0
  231. package/dist/commands/mcp-server.js +1 -0
  232. package/dist/commands/mcp-server.js.map +1 -0
  233. package/dist/commands/monday/connect.d.ts +16 -0
  234. package/dist/commands/monday/connect.js +213 -0
  235. package/dist/commands/monday/connect.js.map +1 -0
  236. package/dist/commands/monday/sync.d.ts +14 -0
  237. package/dist/commands/monday/sync.js +179 -0
  238. package/dist/commands/monday/sync.js.map +1 -0
  239. package/dist/commands/orchestrator/attach.js +50 -13
  240. package/dist/commands/orchestrator/attach.js.map +1 -0
  241. package/dist/commands/orchestrator/index.js +1 -0
  242. package/dist/commands/orchestrator/index.js.map +1 -0
  243. package/dist/commands/orchestrator/start.d.ts +15 -0
  244. package/dist/commands/orchestrator/start.js +187 -13
  245. package/dist/commands/orchestrator/start.js.map +1 -0
  246. package/dist/commands/orchestrator/status.js +63 -28
  247. package/dist/commands/orchestrator/status.js.map +1 -0
  248. package/dist/commands/orchestrator/stop.js +65 -17
  249. package/dist/commands/orchestrator/stop.js.map +1 -0
  250. package/dist/commands/phase/create.js +1 -0
  251. package/dist/commands/phase/create.js.map +1 -0
  252. package/dist/commands/phase/delete.js +1 -0
  253. package/dist/commands/phase/delete.js.map +1 -0
  254. package/dist/commands/phase/list.js +1 -0
  255. package/dist/commands/phase/list.js.map +1 -0
  256. package/dist/commands/phase/move.js +1 -0
  257. package/dist/commands/phase/move.js.map +1 -0
  258. package/dist/commands/phase/template/apply.js +1 -0
  259. package/dist/commands/phase/template/apply.js.map +1 -0
  260. package/dist/commands/phase/template/create.js +1 -0
  261. package/dist/commands/phase/template/create.js.map +1 -0
  262. package/dist/commands/phase/template/delete.js +1 -0
  263. package/dist/commands/phase/template/delete.js.map +1 -0
  264. package/dist/commands/phase/template/list.js +1 -0
  265. package/dist/commands/phase/template/list.js.map +1 -0
  266. package/dist/commands/phase/template/update.js +1 -0
  267. package/dist/commands/phase/template/update.js.map +1 -0
  268. package/dist/commands/phase/update.js +1 -0
  269. package/dist/commands/phase/update.js.map +1 -0
  270. package/dist/commands/pmo/init.js +1 -0
  271. package/dist/commands/pmo/init.js.map +1 -0
  272. package/dist/commands/pr/create.js +4 -0
  273. package/dist/commands/pr/create.js.map +1 -0
  274. package/dist/commands/pr/index.js +1 -0
  275. package/dist/commands/pr/index.js.map +1 -0
  276. package/dist/commands/pr/link.js +1 -0
  277. package/dist/commands/pr/link.js.map +1 -0
  278. package/dist/commands/pr/list.js +1 -0
  279. package/dist/commands/pr/list.js.map +1 -0
  280. package/dist/commands/pr/status.js +1 -0
  281. package/dist/commands/pr/status.js.map +1 -0
  282. package/dist/commands/priority/add.js +1 -0
  283. package/dist/commands/priority/add.js.map +1 -0
  284. package/dist/commands/priority/list.js +1 -0
  285. package/dist/commands/priority/list.js.map +1 -0
  286. package/dist/commands/priority/remove.js +1 -0
  287. package/dist/commands/priority/remove.js.map +1 -0
  288. package/dist/commands/priority/set.js +1 -0
  289. package/dist/commands/priority/set.js.map +1 -0
  290. package/dist/commands/project/archive.js +1 -0
  291. package/dist/commands/project/archive.js.map +1 -0
  292. package/dist/commands/project/create.js +1 -0
  293. package/dist/commands/project/create.js.map +1 -0
  294. package/dist/commands/project/delete.js +1 -0
  295. package/dist/commands/project/delete.js.map +1 -0
  296. package/dist/commands/project/index.js +1 -0
  297. package/dist/commands/project/index.js.map +1 -0
  298. package/dist/commands/project/list.js +1 -0
  299. package/dist/commands/project/list.js.map +1 -0
  300. package/dist/commands/project/spec.js +1 -0
  301. package/dist/commands/project/spec.js.map +1 -0
  302. package/dist/commands/project/unarchive.js +1 -0
  303. package/dist/commands/project/unarchive.js.map +1 -0
  304. package/dist/commands/project/update.js +1 -0
  305. package/dist/commands/project/update.js.map +1 -0
  306. package/dist/commands/project/view.js +1 -0
  307. package/dist/commands/project/view.js.map +1 -0
  308. package/dist/commands/pull.js +1 -0
  309. package/dist/commands/pull.js.map +1 -0
  310. package/dist/commands/qa/index.js +11 -5
  311. package/dist/commands/qa/index.js.map +1 -0
  312. package/dist/commands/repo/add.js +1 -0
  313. package/dist/commands/repo/add.js.map +1 -0
  314. package/dist/commands/repo/create.js +1 -0
  315. package/dist/commands/repo/create.js.map +1 -0
  316. package/dist/commands/repo/index.js +1 -0
  317. package/dist/commands/repo/index.js.map +1 -0
  318. package/dist/commands/repo/list.js +1 -0
  319. package/dist/commands/repo/list.js.map +1 -0
  320. package/dist/commands/repo/remove.js +1 -0
  321. package/dist/commands/repo/remove.js.map +1 -0
  322. package/dist/commands/repo/view.js +1 -0
  323. package/dist/commands/repo/view.js.map +1 -0
  324. package/dist/commands/roadmap/add-project.js +1 -0
  325. package/dist/commands/roadmap/add-project.js.map +1 -0
  326. package/dist/commands/roadmap/create.js +1 -0
  327. package/dist/commands/roadmap/create.js.map +1 -0
  328. package/dist/commands/roadmap/delete.js +1 -0
  329. package/dist/commands/roadmap/delete.js.map +1 -0
  330. package/dist/commands/roadmap/generate.js +1 -0
  331. package/dist/commands/roadmap/generate.js.map +1 -0
  332. package/dist/commands/roadmap/index.js +1 -0
  333. package/dist/commands/roadmap/index.js.map +1 -0
  334. package/dist/commands/roadmap/list.js +1 -0
  335. package/dist/commands/roadmap/list.js.map +1 -0
  336. package/dist/commands/roadmap/remove-project.js +1 -0
  337. package/dist/commands/roadmap/remove-project.js.map +1 -0
  338. package/dist/commands/roadmap/reorder.js +1 -0
  339. package/dist/commands/roadmap/reorder.js.map +1 -0
  340. package/dist/commands/roadmap/update.js +1 -0
  341. package/dist/commands/roadmap/update.js.map +1 -0
  342. package/dist/commands/roadmap/view.js +1 -0
  343. package/dist/commands/roadmap/view.js.map +1 -0
  344. package/dist/commands/session/attach.js +1 -0
  345. package/dist/commands/session/attach.js.map +1 -0
  346. package/dist/commands/session/create.js +2 -1
  347. package/dist/commands/session/create.js.map +1 -0
  348. package/dist/commands/session/health.js +5 -7
  349. package/dist/commands/session/health.js.map +1 -0
  350. package/dist/commands/session/index.js +1 -0
  351. package/dist/commands/session/index.js.map +1 -0
  352. package/dist/commands/session/list.js +7 -5
  353. package/dist/commands/session/list.js.map +1 -0
  354. package/dist/commands/session/peek.js +1 -0
  355. package/dist/commands/session/peek.js.map +1 -0
  356. package/dist/commands/session/poke.js +20 -1
  357. package/dist/commands/session/poke.js.map +1 -0
  358. package/dist/commands/spec/create.js +1 -0
  359. package/dist/commands/spec/create.js.map +1 -0
  360. package/dist/commands/spec/delete.js +1 -0
  361. package/dist/commands/spec/delete.js.map +1 -0
  362. package/dist/commands/spec/edit.js +1 -0
  363. package/dist/commands/spec/edit.js.map +1 -0
  364. package/dist/commands/spec/index.js +1 -0
  365. package/dist/commands/spec/index.js.map +1 -0
  366. package/dist/commands/spec/link/depends.js +1 -0
  367. package/dist/commands/spec/link/depends.js.map +1 -0
  368. package/dist/commands/spec/link/index.js +1 -0
  369. package/dist/commands/spec/link/index.js.map +1 -0
  370. package/dist/commands/spec/link/remove.js +1 -0
  371. package/dist/commands/spec/link/remove.js.map +1 -0
  372. package/dist/commands/spec/list.js +1 -0
  373. package/dist/commands/spec/list.js.map +1 -0
  374. package/dist/commands/spec/plan.js +1 -0
  375. package/dist/commands/spec/plan.js.map +1 -0
  376. package/dist/commands/spec/ticket.js +1 -0
  377. package/dist/commands/spec/ticket.js.map +1 -0
  378. package/dist/commands/spec/view.js +1 -0
  379. package/dist/commands/spec/view.js.map +1 -0
  380. package/dist/commands/staff/add.js +1 -0
  381. package/dist/commands/staff/add.js.map +1 -0
  382. package/dist/commands/staff/index.js +1 -0
  383. package/dist/commands/staff/index.js.map +1 -0
  384. package/dist/commands/staff/list.js +1 -0
  385. package/dist/commands/staff/list.js.map +1 -0
  386. package/dist/commands/staff/remove.js +1 -0
  387. package/dist/commands/staff/remove.js.map +1 -0
  388. package/dist/commands/status/category.js +1 -0
  389. package/dist/commands/status/category.js.map +1 -0
  390. package/dist/commands/status/create.js +1 -0
  391. package/dist/commands/status/create.js.map +1 -0
  392. package/dist/commands/status/delete.js +1 -0
  393. package/dist/commands/status/delete.js.map +1 -0
  394. package/dist/commands/status/index.js +1 -0
  395. package/dist/commands/status/index.js.map +1 -0
  396. package/dist/commands/status/list.js +1 -0
  397. package/dist/commands/status/list.js.map +1 -0
  398. package/dist/commands/status/move.js +1 -0
  399. package/dist/commands/status/move.js.map +1 -0
  400. package/dist/commands/status/update.js +1 -0
  401. package/dist/commands/status/update.js.map +1 -0
  402. package/dist/commands/support/book.js +1 -0
  403. package/dist/commands/support/book.js.map +1 -0
  404. package/dist/commands/support/discord.js +1 -0
  405. package/dist/commands/support/discord.js.map +1 -0
  406. package/dist/commands/support/docs.js +1 -0
  407. package/dist/commands/support/docs.js.map +1 -0
  408. package/dist/commands/support/index.js +1 -0
  409. package/dist/commands/support/index.js.map +1 -0
  410. package/dist/commands/support/issues.js +1 -0
  411. package/dist/commands/support/issues.js.map +1 -0
  412. package/dist/commands/support/logs.js +1 -0
  413. package/dist/commands/support/logs.js.map +1 -0
  414. package/dist/commands/telemetry/disable.d.ts +10 -0
  415. package/dist/commands/telemetry/disable.js +27 -0
  416. package/dist/commands/telemetry/disable.js.map +1 -0
  417. package/dist/commands/telemetry/enable.d.ts +10 -0
  418. package/dist/commands/telemetry/enable.js +27 -0
  419. package/dist/commands/telemetry/enable.js.map +1 -0
  420. package/dist/commands/telemetry/index.d.ts +10 -0
  421. package/dist/commands/telemetry/index.js +41 -0
  422. package/dist/commands/telemetry/index.js.map +1 -0
  423. package/dist/commands/telemetry/status.d.ts +10 -0
  424. package/dist/commands/telemetry/status.js +42 -0
  425. package/dist/commands/telemetry/status.js.map +1 -0
  426. package/dist/commands/template/apply.js +1 -0
  427. package/dist/commands/template/apply.js.map +1 -0
  428. package/dist/commands/template/create.js +1 -0
  429. package/dist/commands/template/create.js.map +1 -0
  430. package/dist/commands/template/delete.js +1 -0
  431. package/dist/commands/template/delete.js.map +1 -0
  432. package/dist/commands/template/index.js +1 -0
  433. package/dist/commands/template/index.js.map +1 -0
  434. package/dist/commands/template/list.js +1 -0
  435. package/dist/commands/template/list.js.map +1 -0
  436. package/dist/commands/template/save.js +1 -0
  437. package/dist/commands/template/save.js.map +1 -0
  438. package/dist/commands/template/update.js +1 -0
  439. package/dist/commands/template/update.js.map +1 -0
  440. package/dist/commands/terminal/title.js +1 -0
  441. package/dist/commands/terminal/title.js.map +1 -0
  442. package/dist/commands/theme/add-names.js +1 -0
  443. package/dist/commands/theme/add-names.js.map +1 -0
  444. package/dist/commands/theme/create.js +1 -0
  445. package/dist/commands/theme/create.js.map +1 -0
  446. package/dist/commands/theme/index.js +1 -0
  447. package/dist/commands/theme/index.js.map +1 -0
  448. package/dist/commands/theme/list.js +1 -0
  449. package/dist/commands/theme/list.js.map +1 -0
  450. package/dist/commands/theme/set.js +1 -0
  451. package/dist/commands/theme/set.js.map +1 -0
  452. package/dist/commands/ticket/bulk.js +1 -0
  453. package/dist/commands/ticket/bulk.js.map +1 -0
  454. package/dist/commands/ticket/category.js +1 -0
  455. package/dist/commands/ticket/category.js.map +1 -0
  456. package/dist/commands/ticket/complete.js +1 -0
  457. package/dist/commands/ticket/complete.js.map +1 -0
  458. package/dist/commands/ticket/create.js +1 -0
  459. package/dist/commands/ticket/create.js.map +1 -0
  460. package/dist/commands/ticket/delete.js +1 -0
  461. package/dist/commands/ticket/delete.js.map +1 -0
  462. package/dist/commands/ticket/edit.js +1 -0
  463. package/dist/commands/ticket/edit.js.map +1 -0
  464. package/dist/commands/ticket/epic.js +1 -0
  465. package/dist/commands/ticket/epic.js.map +1 -0
  466. package/dist/commands/ticket/index.js +1 -0
  467. package/dist/commands/ticket/index.js.map +1 -0
  468. package/dist/commands/ticket/link/block.js +1 -0
  469. package/dist/commands/ticket/link/block.js.map +1 -0
  470. package/dist/commands/ticket/link/duplicates.js +1 -0
  471. package/dist/commands/ticket/link/duplicates.js.map +1 -0
  472. package/dist/commands/ticket/link/index.js +1 -0
  473. package/dist/commands/ticket/link/index.js.map +1 -0
  474. package/dist/commands/ticket/link/relates.js +1 -0
  475. package/dist/commands/ticket/link/relates.js.map +1 -0
  476. package/dist/commands/ticket/list.js +1 -0
  477. package/dist/commands/ticket/list.js.map +1 -0
  478. package/dist/commands/ticket/move.js +1 -0
  479. package/dist/commands/ticket/move.js.map +1 -0
  480. package/dist/commands/ticket/project.js +1 -0
  481. package/dist/commands/ticket/project.js.map +1 -0
  482. package/dist/commands/ticket/reassign.js +1 -0
  483. package/dist/commands/ticket/reassign.js.map +1 -0
  484. package/dist/commands/ticket/resolve.js +1 -0
  485. package/dist/commands/ticket/resolve.js.map +1 -0
  486. package/dist/commands/ticket/show.js +1 -0
  487. package/dist/commands/ticket/show.js.map +1 -0
  488. package/dist/commands/ticket/spec.js +1 -0
  489. package/dist/commands/ticket/spec.js.map +1 -0
  490. package/dist/commands/ticket/status.js +1 -0
  491. package/dist/commands/ticket/status.js.map +1 -0
  492. package/dist/commands/ticket/template/apply.js +1 -0
  493. package/dist/commands/ticket/template/apply.js.map +1 -0
  494. package/dist/commands/ticket/template/delete.js +1 -0
  495. package/dist/commands/ticket/template/delete.js.map +1 -0
  496. package/dist/commands/ticket/template/list.js +1 -0
  497. package/dist/commands/ticket/template/list.js.map +1 -0
  498. package/dist/commands/ticket/template/save.js +1 -0
  499. package/dist/commands/ticket/template/save.js.map +1 -0
  500. package/dist/commands/ticket/update.js +1 -0
  501. package/dist/commands/ticket/update.js.map +1 -0
  502. package/dist/commands/ticket/view.js +1 -0
  503. package/dist/commands/ticket/view.js.map +1 -0
  504. package/dist/commands/whoami.js +1 -0
  505. package/dist/commands/whoami.js.map +1 -0
  506. package/dist/commands/work/complete.js +6 -0
  507. package/dist/commands/work/complete.js.map +1 -0
  508. package/dist/commands/work/index.js +8 -0
  509. package/dist/commands/work/index.js.map +1 -0
  510. package/dist/commands/work/jira.d.ts +28 -0
  511. package/dist/commands/work/jira.js +226 -0
  512. package/dist/commands/work/jira.js.map +1 -0
  513. package/dist/commands/work/linear.js +1 -0
  514. package/dist/commands/work/linear.js.map +1 -0
  515. package/dist/commands/work/ready.js +1 -0
  516. package/dist/commands/work/ready.js.map +1 -0
  517. package/dist/commands/work/resolve.js +1 -0
  518. package/dist/commands/work/resolve.js.map +1 -0
  519. package/dist/commands/work/review.js +1 -0
  520. package/dist/commands/work/review.js.map +1 -0
  521. package/dist/commands/work/revise.js +1 -0
  522. package/dist/commands/work/revise.js.map +1 -0
  523. package/dist/commands/work/source/set.d.ts +12 -0
  524. package/dist/commands/work/source/set.js +53 -0
  525. package/dist/commands/work/source/set.js.map +1 -0
  526. package/dist/commands/work/source.d.ts +11 -0
  527. package/dist/commands/work/source.js +54 -0
  528. package/dist/commands/work/source.js.map +1 -0
  529. package/dist/commands/work/spawn-all.js +1 -0
  530. package/dist/commands/work/spawn-all.js.map +1 -0
  531. package/dist/commands/work/spawn.d.ts +6 -0
  532. package/dist/commands/work/spawn.js +344 -34
  533. package/dist/commands/work/spawn.js.map +1 -0
  534. package/dist/commands/work/start.d.ts +9 -0
  535. package/dist/commands/work/start.js +619 -228
  536. package/dist/commands/work/start.js.map +1 -0
  537. package/dist/commands/work/status.js +1 -0
  538. package/dist/commands/work/status.js.map +1 -0
  539. package/dist/commands/work/watch.js +5 -8
  540. package/dist/commands/work/watch.js.map +1 -0
  541. package/dist/commands/workflow/create.js +1 -0
  542. package/dist/commands/workflow/create.js.map +1 -0
  543. package/dist/commands/workflow/delete.js +1 -0
  544. package/dist/commands/workflow/delete.js.map +1 -0
  545. package/dist/commands/workflow/index.js +1 -0
  546. package/dist/commands/workflow/index.js.map +1 -0
  547. package/dist/commands/workflow/list.js +1 -0
  548. package/dist/commands/workflow/list.js.map +1 -0
  549. package/dist/commands/workflow/show.js +1 -0
  550. package/dist/commands/workflow/show.js.map +1 -0
  551. package/dist/commands/workflow/switch.js +1 -0
  552. package/dist/commands/workflow/switch.js.map +1 -0
  553. package/dist/commands/workflow/view.js +1 -0
  554. package/dist/commands/workflow/view.js.map +1 -0
  555. package/dist/commands/workspace/add.js +1 -0
  556. package/dist/commands/workspace/add.js.map +1 -0
  557. package/dist/commands/workspace/list.js +1 -0
  558. package/dist/commands/workspace/list.js.map +1 -0
  559. package/dist/commands/workspace/prune.js +1 -0
  560. package/dist/commands/workspace/prune.js.map +1 -0
  561. package/dist/commands/workspace/remove.js +1 -0
  562. package/dist/commands/workspace/remove.js.map +1 -0
  563. package/dist/commands/workspace/use.js +1 -0
  564. package/dist/commands/workspace/use.js.map +1 -0
  565. package/dist/hooks/init.d.ts +6 -1
  566. package/dist/hooks/init.js +34 -2
  567. package/dist/hooks/init.js.map +1 -0
  568. package/dist/hooks/postrun.d.ts +9 -0
  569. package/dist/hooks/postrun.js +30 -0
  570. package/dist/hooks/postrun.js.map +1 -0
  571. package/dist/index.js +1 -0
  572. package/dist/index.js.map +1 -0
  573. package/dist/lib/agents/commands.js +1 -0
  574. package/dist/lib/agents/commands.js.map +1 -0
  575. package/dist/lib/agents/index.js +1 -0
  576. package/dist/lib/agents/index.js.map +1 -0
  577. package/dist/lib/asana/client.d.ts +15 -0
  578. package/dist/lib/asana/client.js +121 -0
  579. package/dist/lib/asana/client.js.map +1 -0
  580. package/dist/lib/asana/config.d.ts +9 -0
  581. package/dist/lib/asana/config.js +62 -0
  582. package/dist/lib/asana/config.js.map +1 -0
  583. package/dist/lib/asana/index.d.ts +5 -0
  584. package/dist/lib/asana/index.js +5 -0
  585. package/dist/lib/asana/index.js.map +1 -0
  586. package/dist/lib/asana/mapper.d.ts +13 -0
  587. package/dist/lib/asana/mapper.js +71 -0
  588. package/dist/lib/asana/mapper.js.map +1 -0
  589. package/dist/lib/asana/sync.d.ts +13 -0
  590. package/dist/lib/asana/sync.js +37 -0
  591. package/dist/lib/asana/sync.js.map +1 -0
  592. package/dist/lib/asana/types.d.ts +40 -0
  593. package/dist/lib/asana/types.js +2 -0
  594. package/dist/lib/asana/types.js.map +1 -0
  595. package/dist/lib/branch/index.js +1 -0
  596. package/dist/lib/branch/index.js.map +1 -0
  597. package/dist/lib/caffeinate.js +1 -0
  598. package/dist/lib/caffeinate.js.map +1 -0
  599. package/dist/lib/colors.js +1 -0
  600. package/dist/lib/colors.js.map +1 -0
  601. package/dist/lib/commands/docker-command.js +1 -0
  602. package/dist/lib/commands/docker-command.js.map +1 -0
  603. package/dist/lib/database/drizzle-schema.d.ts +393 -0
  604. package/dist/lib/database/drizzle-schema.js +46 -0
  605. package/dist/lib/database/drizzle-schema.js.map +1 -0
  606. package/dist/lib/database/drizzle.js +1 -0
  607. package/dist/lib/database/drizzle.js.map +1 -0
  608. package/dist/lib/database/index.js +1 -0
  609. package/dist/lib/database/index.js.map +1 -0
  610. package/dist/lib/database/native-validation.js +1 -0
  611. package/dist/lib/database/native-validation.js.map +1 -0
  612. package/dist/lib/docker/resolve.js +1 -0
  613. package/dist/lib/docker/resolve.js.map +1 -0
  614. package/dist/lib/execution/codex-adapter.js +1 -0
  615. package/dist/lib/execution/codex-adapter.js.map +1 -0
  616. package/dist/lib/execution/config.d.ts +10 -0
  617. package/dist/lib/execution/config.js +20 -0
  618. package/dist/lib/execution/config.js.map +1 -0
  619. package/dist/lib/execution/context.js +1 -0
  620. package/dist/lib/execution/context.js.map +1 -0
  621. package/dist/lib/execution/devcontainer.js +1 -0
  622. package/dist/lib/execution/devcontainer.js.map +1 -0
  623. package/dist/lib/execution/index.js +1 -0
  624. package/dist/lib/execution/index.js.map +1 -0
  625. package/dist/lib/execution/runners.d.ts +10 -0
  626. package/dist/lib/execution/runners.js +162 -7
  627. package/dist/lib/execution/runners.js.map +1 -0
  628. package/dist/lib/execution/session-utils.js +1 -0
  629. package/dist/lib/execution/session-utils.js.map +1 -0
  630. package/dist/lib/execution/spawner.js +27 -0
  631. package/dist/lib/execution/spawner.js.map +1 -0
  632. package/dist/lib/execution/storage.d.ts +4 -0
  633. package/dist/lib/execution/storage.js +9 -3
  634. package/dist/lib/execution/storage.js.map +1 -0
  635. package/dist/lib/execution/types.d.ts +6 -0
  636. package/dist/lib/execution/types.js +1 -0
  637. package/dist/lib/execution/types.js.map +1 -0
  638. package/dist/lib/external-issues/adapters.d.ts +18 -1
  639. package/dist/lib/external-issues/adapters.js +50 -1
  640. package/dist/lib/external-issues/adapters.js.map +1 -0
  641. package/dist/lib/external-issues/index.d.ts +5 -1
  642. package/dist/lib/external-issues/index.js +8 -0
  643. package/dist/lib/external-issues/index.js.map +1 -0
  644. package/dist/lib/external-issues/jira.d.ts +23 -0
  645. package/dist/lib/external-issues/jira.js +224 -0
  646. package/dist/lib/external-issues/jira.js.map +1 -0
  647. package/dist/lib/external-issues/linear.js +17 -3
  648. package/dist/lib/external-issues/linear.js.map +1 -0
  649. package/dist/lib/external-issues/mapper.d.ts +3 -2
  650. package/dist/lib/external-issues/mapper.js +6 -2
  651. package/dist/lib/external-issues/mapper.js.map +1 -0
  652. package/dist/lib/external-issues/mapping-store.d.ts +12 -0
  653. package/dist/lib/external-issues/mapping-store.js +165 -0
  654. package/dist/lib/external-issues/mapping-store.js.map +1 -0
  655. package/dist/lib/external-issues/redact.d.ts +50 -0
  656. package/dist/lib/external-issues/redact.js +130 -0
  657. package/dist/lib/external-issues/redact.js.map +1 -0
  658. package/dist/lib/external-issues/types.d.ts +35 -1
  659. package/dist/lib/external-issues/types.js +1 -0
  660. package/dist/lib/external-issues/types.js.map +1 -0
  661. package/dist/lib/external-issues/validation.js +12 -0
  662. package/dist/lib/external-issues/validation.js.map +1 -0
  663. package/dist/lib/external-issues/work-start.d.ts +10 -0
  664. package/dist/lib/external-issues/work-start.js +13 -0
  665. package/dist/lib/external-issues/work-start.js.map +1 -0
  666. package/dist/lib/flags/index.js +1 -0
  667. package/dist/lib/flags/index.js.map +1 -0
  668. package/dist/lib/flags/resolver.js +4 -2
  669. package/dist/lib/flags/resolver.js.map +1 -0
  670. package/dist/lib/init/index.js +1 -0
  671. package/dist/lib/init/index.js.map +1 -0
  672. package/dist/lib/jira/config.d.ts +33 -0
  673. package/dist/lib/jira/config.js +97 -0
  674. package/dist/lib/jira/config.js.map +1 -0
  675. package/dist/lib/jira/index.d.ts +7 -0
  676. package/dist/lib/jira/index.js +7 -0
  677. package/dist/lib/jira/index.js.map +1 -0
  678. package/dist/lib/linear/client.js +1 -0
  679. package/dist/lib/linear/client.js.map +1 -0
  680. package/dist/lib/linear/config.js +1 -0
  681. package/dist/lib/linear/config.js.map +1 -0
  682. package/dist/lib/linear/index.js +1 -0
  683. package/dist/lib/linear/index.js.map +1 -0
  684. package/dist/lib/linear/mapper.d.ts +2 -0
  685. package/dist/lib/linear/mapper.js +67 -2
  686. package/dist/lib/linear/mapper.js.map +1 -0
  687. package/dist/lib/linear/sync.js +1 -0
  688. package/dist/lib/linear/sync.js.map +1 -0
  689. package/dist/lib/linear/types.js +1 -0
  690. package/dist/lib/linear/types.js.map +1 -0
  691. package/dist/lib/machine-config.js +1 -0
  692. package/dist/lib/machine-config.js.map +1 -0
  693. package/dist/lib/mcp/helpers.js +1 -0
  694. package/dist/lib/mcp/helpers.js.map +1 -0
  695. package/dist/lib/mcp/index.js +1 -0
  696. package/dist/lib/mcp/index.js.map +1 -0
  697. package/dist/lib/mcp/tools/action.js +1 -0
  698. package/dist/lib/mcp/tools/action.js.map +1 -0
  699. package/dist/lib/mcp/tools/board.js +1 -0
  700. package/dist/lib/mcp/tools/board.js.map +1 -0
  701. package/dist/lib/mcp/tools/category.js +1 -0
  702. package/dist/lib/mcp/tools/category.js.map +1 -0
  703. package/dist/lib/mcp/tools/cli-passthrough.js +1 -0
  704. package/dist/lib/mcp/tools/cli-passthrough.js.map +1 -0
  705. package/dist/lib/mcp/tools/diet.js +1 -0
  706. package/dist/lib/mcp/tools/diet.js.map +1 -0
  707. package/dist/lib/mcp/tools/epic.js +1 -0
  708. package/dist/lib/mcp/tools/epic.js.map +1 -0
  709. package/dist/lib/mcp/tools/index.js +1 -0
  710. package/dist/lib/mcp/tools/index.js.map +1 -0
  711. package/dist/lib/mcp/tools/label.js +1 -0
  712. package/dist/lib/mcp/tools/label.js.map +1 -0
  713. package/dist/lib/mcp/tools/phase.js +1 -0
  714. package/dist/lib/mcp/tools/phase.js.map +1 -0
  715. package/dist/lib/mcp/tools/project.js +1 -0
  716. package/dist/lib/mcp/tools/project.js.map +1 -0
  717. package/dist/lib/mcp/tools/roadmap.js +1 -0
  718. package/dist/lib/mcp/tools/roadmap.js.map +1 -0
  719. package/dist/lib/mcp/tools/spec.js +1 -0
  720. package/dist/lib/mcp/tools/spec.js.map +1 -0
  721. package/dist/lib/mcp/tools/status.js +1 -0
  722. package/dist/lib/mcp/tools/status.js.map +1 -0
  723. package/dist/lib/mcp/tools/template.js +1 -0
  724. package/dist/lib/mcp/tools/template.js.map +1 -0
  725. package/dist/lib/mcp/tools/ticket.js +1 -0
  726. package/dist/lib/mcp/tools/ticket.js.map +1 -0
  727. package/dist/lib/mcp/tools/tmux.js +1 -0
  728. package/dist/lib/mcp/tools/tmux.js.map +1 -0
  729. package/dist/lib/mcp/tools/view.js +1 -0
  730. package/dist/lib/mcp/tools/view.js.map +1 -0
  731. package/dist/lib/mcp/tools/work.js +1 -0
  732. package/dist/lib/mcp/tools/work.js.map +1 -0
  733. package/dist/lib/mcp/tools/workflow.js +1 -0
  734. package/dist/lib/mcp/tools/workflow.js.map +1 -0
  735. package/dist/lib/mcp/types.js +1 -0
  736. package/dist/lib/mcp/types.js.map +1 -0
  737. package/dist/lib/monday/client.d.ts +14 -0
  738. package/dist/lib/monday/client.js +114 -0
  739. package/dist/lib/monday/client.js.map +1 -0
  740. package/dist/lib/monday/config.d.ts +10 -0
  741. package/dist/lib/monday/config.js +65 -0
  742. package/dist/lib/monday/config.js.map +1 -0
  743. package/dist/lib/monday/index.d.ts +5 -0
  744. package/dist/lib/monday/index.js +5 -0
  745. package/dist/lib/monday/index.js.map +1 -0
  746. package/dist/lib/monday/mapper.d.ts +14 -0
  747. package/dist/lib/monday/mapper.js +90 -0
  748. package/dist/lib/monday/mapper.js.map +1 -0
  749. package/dist/lib/monday/sync.d.ts +13 -0
  750. package/dist/lib/monday/sync.js +46 -0
  751. package/dist/lib/monday/sync.js.map +1 -0
  752. package/dist/lib/monday/types.d.ts +38 -0
  753. package/dist/lib/monday/types.js +5 -0
  754. package/dist/lib/monday/types.js.map +1 -0
  755. package/dist/lib/multiline-input.js +1 -0
  756. package/dist/lib/multiline-input.js.map +1 -0
  757. package/dist/lib/pmo/base-command.js +8 -6
  758. package/dist/lib/pmo/base-command.js.map +1 -0
  759. package/dist/lib/pmo/create-spec-folders.js +1 -0
  760. package/dist/lib/pmo/create-spec-folders.js.map +1 -0
  761. package/dist/lib/pmo/diet.js +1 -0
  762. package/dist/lib/pmo/diet.js.map +1 -0
  763. package/dist/lib/pmo/epic-files.js +1 -0
  764. package/dist/lib/pmo/epic-files.js.map +1 -0
  765. package/dist/lib/pmo/find-pmo.js +1 -0
  766. package/dist/lib/pmo/find-pmo.js.map +1 -0
  767. package/dist/lib/pmo/index.js +1 -0
  768. package/dist/lib/pmo/index.js.map +1 -0
  769. package/dist/lib/pmo/markdown.js +1 -0
  770. package/dist/lib/pmo/markdown.js.map +1 -0
  771. package/dist/lib/pmo/pmo-context.js +1 -0
  772. package/dist/lib/pmo/pmo-context.js.map +1 -0
  773. package/dist/lib/pmo/schema.d.ts +10 -1
  774. package/dist/lib/pmo/schema.js +74 -0
  775. package/dist/lib/pmo/schema.js.map +1 -0
  776. package/dist/lib/pmo/spec-parser.js +1 -0
  777. package/dist/lib/pmo/spec-parser.js.map +1 -0
  778. package/dist/lib/pmo/spec-types.js +1 -0
  779. package/dist/lib/pmo/spec-types.js.map +1 -0
  780. package/dist/lib/pmo/storage/actions.js +1 -0
  781. package/dist/lib/pmo/storage/actions.js.map +1 -0
  782. package/dist/lib/pmo/storage/base.js +33 -0
  783. package/dist/lib/pmo/storage/base.js.map +1 -0
  784. package/dist/lib/pmo/storage/categories.js +1 -0
  785. package/dist/lib/pmo/storage/categories.js.map +1 -0
  786. package/dist/lib/pmo/storage/dependencies.js +1 -0
  787. package/dist/lib/pmo/storage/dependencies.js.map +1 -0
  788. package/dist/lib/pmo/storage/epics.js +1 -0
  789. package/dist/lib/pmo/storage/epics.js.map +1 -0
  790. package/dist/lib/pmo/storage/helpers.js +1 -0
  791. package/dist/lib/pmo/storage/helpers.js.map +1 -0
  792. package/dist/lib/pmo/storage/index.js +1 -0
  793. package/dist/lib/pmo/storage/index.js.map +1 -0
  794. package/dist/lib/pmo/storage/labels.js +1 -0
  795. package/dist/lib/pmo/storage/labels.js.map +1 -0
  796. package/dist/lib/pmo/storage/phases.js +1 -0
  797. package/dist/lib/pmo/storage/phases.js.map +1 -0
  798. package/dist/lib/pmo/storage/projects.js +1 -0
  799. package/dist/lib/pmo/storage/projects.js.map +1 -0
  800. package/dist/lib/pmo/storage/roadmaps.js +1 -0
  801. package/dist/lib/pmo/storage/roadmaps.js.map +1 -0
  802. package/dist/lib/pmo/storage/specs.js +1 -0
  803. package/dist/lib/pmo/storage/specs.js.map +1 -0
  804. package/dist/lib/pmo/storage/statuses.js +1 -0
  805. package/dist/lib/pmo/storage/statuses.js.map +1 -0
  806. package/dist/lib/pmo/storage/subtasks.js +1 -0
  807. package/dist/lib/pmo/storage/subtasks.js.map +1 -0
  808. package/dist/lib/pmo/storage/templates.js +1 -0
  809. package/dist/lib/pmo/storage/templates.js.map +1 -0
  810. package/dist/lib/pmo/storage/tickets.js +1 -0
  811. package/dist/lib/pmo/storage/tickets.js.map +1 -0
  812. package/dist/lib/pmo/storage/types.js +1 -0
  813. package/dist/lib/pmo/storage/types.js.map +1 -0
  814. package/dist/lib/pmo/storage/views.js +1 -0
  815. package/dist/lib/pmo/storage/views.js.map +1 -0
  816. package/dist/lib/pmo/storage-sqlite.js +1 -0
  817. package/dist/lib/pmo/storage-sqlite.js.map +1 -0
  818. package/dist/lib/pmo/sync-manager.js +1 -0
  819. package/dist/lib/pmo/sync-manager.js.map +1 -0
  820. package/dist/lib/pmo/templates-builtin.js +1 -0
  821. package/dist/lib/pmo/templates-builtin.js.map +1 -0
  822. package/dist/lib/pmo/types.js +1 -0
  823. package/dist/lib/pmo/types.js.map +1 -0
  824. package/dist/lib/pmo/utils.js +1 -0
  825. package/dist/lib/pmo/utils.js.map +1 -0
  826. package/dist/lib/pmo/watcher.d.ts +1 -1
  827. package/dist/lib/pmo/watcher.js +6 -7
  828. package/dist/lib/pmo/watcher.js.map +1 -0
  829. package/dist/lib/pr/index.js +1 -0
  830. package/dist/lib/pr/index.js.map +1 -0
  831. package/dist/lib/prompt-command.js +4 -2
  832. package/dist/lib/prompt-command.js.map +1 -0
  833. package/dist/lib/prompt-json.d.ts +16 -0
  834. package/dist/lib/prompt-json.js +1 -0
  835. package/dist/lib/prompt-json.js.map +1 -0
  836. package/dist/lib/repos/git.js +1 -0
  837. package/dist/lib/repos/git.js.map +1 -0
  838. package/dist/lib/repos/index.js +1 -0
  839. package/dist/lib/repos/index.js.map +1 -0
  840. package/dist/lib/signal-handler.d.ts +59 -0
  841. package/dist/lib/signal-handler.js +156 -0
  842. package/dist/lib/signal-handler.js.map +1 -0
  843. package/dist/lib/string-utils.js +1 -0
  844. package/dist/lib/string-utils.js.map +1 -0
  845. package/dist/lib/styles.js +1 -0
  846. package/dist/lib/styles.js.map +1 -0
  847. package/dist/lib/telemetry/analytics.d.ts +105 -0
  848. package/dist/lib/telemetry/analytics.js +289 -0
  849. package/dist/lib/telemetry/analytics.js.map +1 -0
  850. package/dist/lib/telemetry/feature-flags.d.ts +53 -0
  851. package/dist/lib/telemetry/feature-flags.js +83 -0
  852. package/dist/lib/telemetry/feature-flags.js.map +1 -0
  853. package/dist/lib/telemetry.d.ts +63 -0
  854. package/dist/lib/telemetry.js +217 -0
  855. package/dist/lib/telemetry.js.map +1 -0
  856. package/dist/lib/terminal.js +1 -0
  857. package/dist/lib/terminal.js.map +1 -0
  858. package/dist/lib/themes.js +1 -0
  859. package/dist/lib/themes.js.map +1 -0
  860. package/dist/lib/ui/BoardUI.js +1 -0
  861. package/dist/lib/ui/BoardUI.js.map +1 -0
  862. package/dist/lib/ui/ClaimTicketUI.js +1 -0
  863. package/dist/lib/ui/ClaimTicketUI.js.map +1 -0
  864. package/dist/lib/ui/CreateTicketUI.js +1 -0
  865. package/dist/lib/ui/CreateTicketUI.js.map +1 -0
  866. package/dist/lib/update-check.d.ts +83 -0
  867. package/dist/lib/update-check.js +275 -0
  868. package/dist/lib/update-check.js.map +1 -0
  869. package/dist/lib/update-prompt.d.ts +47 -0
  870. package/dist/lib/update-prompt.js +163 -0
  871. package/dist/lib/update-prompt.js.map +1 -0
  872. package/dist/lib/work-source/config.d.ts +14 -0
  873. package/dist/lib/work-source/config.js +79 -0
  874. package/dist/lib/work-source/config.js.map +1 -0
  875. package/dist/lib/work-source/index.d.ts +1 -0
  876. package/dist/lib/work-source/index.js +2 -0
  877. package/dist/lib/work-source/index.js.map +1 -0
  878. package/dist/lib/workspace-config.js +1 -0
  879. package/dist/lib/workspace-config.js.map +1 -0
  880. package/dist/lib/workspace.js +1 -0
  881. package/dist/lib/workspace.js.map +1 -0
  882. package/oclif.manifest.json +2164 -1331
  883. package/package.json +9 -9
@@ -5,6 +5,7 @@ import * as path from 'node:path';
5
5
  import { execSync } from 'node:child_process';
6
6
  import Database from 'better-sqlite3';
7
7
  import { PMOCommand, pmoBaseFlags, autoExportToBoard } from '../../lib/pmo/index.js';
8
+ import { trackAgentSpawned } from '../../lib/telemetry/analytics.js';
8
9
  import { shouldOutputJson, outputErrorAsJson, createMetadata, outputConfirmationNeededAsJson, outputExecutionResultAsJson, } from '../../lib/prompt-json.js';
9
10
  import { FlagResolver } from '../../lib/flags/index.js';
10
11
  import { getWorkColumnSetting, findColumnByName } from '../../lib/pmo/utils.js';
@@ -13,10 +14,15 @@ import { getWorkspaceInfo, createEphemeralAgent, getTicketTmuxSession, killTmuxS
13
14
  import { generateBranchName, DEFAULT_EXECUTION_CONFIG, } from '../../lib/execution/types.js';
14
15
  import { runExecution, isDockerRunning, isGitHubTokenAvailable, isDevcontainerCliInstalled, dockerCredentialsExist, getDockerCredentialInfo, isClaudeExecutor, getExecutorDisplayName } from '../../lib/execution/runners.js';
15
16
  import { ExecutionStorage, ContainerStorage } from '../../lib/execution/storage.js';
16
- import { loadExecutionConfig, getTerminalApp, promptTerminalPreference, getShell, promptShellPreference, hasTerminalPreference, hasShellPreference, getOrPromptCoderName, getAuthMethod, saveAuthMethod, getCreatePrDefault } from '../../lib/execution/config.js';
17
+ import { loadExecutionConfig, getTerminalApp, promptTerminalPreference, getShell, promptShellPreference, hasTerminalPreference, hasShellPreference, getOrPromptCoderName, getAuthMethod, saveAuthMethod, getCreatePrDefault, getMirrorToPmoDefault } from '../../lib/execution/config.js';
17
18
  import { hasDevcontainerConfig } from '../../lib/execution/devcontainer.js';
18
19
  import { detectRepoWorktrees, resolveWorktreePath } from '../../lib/execution/context.js';
19
20
  import { isGHInstalled, isGHAuthenticated } from '../../lib/pr/index.js';
21
+ import { buildLinearMetadata, buildLinearSpawnContextMessage, buildLinearTicketDescription, getLinearIssueByIdentifier, } from '../../lib/external-issues/linear.js';
22
+ import { buildJiraMetadata, buildJiraSpawnContextMessage, buildJiraTicketDescription, getJiraIssueByKey, } from '../../lib/external-issues/jira.js';
23
+ import { resolveMirrorToPmo } from '../../lib/external-issues/work-start.js';
24
+ import { ExternalIssueAdapterError } from '../../lib/external-issues/types.js';
25
+ import { loadActiveWorkSource, saveActiveWorkSource, } from '../../lib/work-source/index.js';
20
26
  /**
21
27
  * Try to execute a git command, return true if successful
22
28
  */
@@ -67,6 +73,49 @@ function getActiveStaffAgents(workspaceInfo, log) {
67
73
  }
68
74
  return result;
69
75
  }
76
+ function parseBooleanSetting(value) {
77
+ if (!value)
78
+ return null;
79
+ const normalized = value.trim().toLowerCase();
80
+ if (normalized === 'true')
81
+ return true;
82
+ if (normalized === 'false')
83
+ return false;
84
+ return null;
85
+ }
86
+ function isIssueSource(value) {
87
+ return value === 'linear' || value === 'jira';
88
+ }
89
+ function buildExternalMetadata(envelope) {
90
+ return envelope.source.name === 'jira'
91
+ ? buildJiraMetadata(envelope)
92
+ : buildLinearMetadata(envelope);
93
+ }
94
+ function buildExternalTicketDescription(envelope) {
95
+ return envelope.source.name === 'jira'
96
+ ? buildJiraTicketDescription(envelope)
97
+ : buildLinearTicketDescription(envelope);
98
+ }
99
+ function buildExternalSpawnContextMessage(envelope, additionalMessage) {
100
+ return envelope.source.name === 'jira'
101
+ ? buildJiraSpawnContextMessage(envelope, additionalMessage)
102
+ : buildLinearSpawnContextMessage(envelope, additionalMessage);
103
+ }
104
+ function getTicketExternalMetadata(ticket) {
105
+ const metadata = (typeof ticket === 'object'
106
+ && ticket !== null
107
+ && 'metadata' in ticket
108
+ && typeof ticket.metadata === 'object'
109
+ && ticket.metadata !== null
110
+ ? ticket.metadata
111
+ : {});
112
+ return {
113
+ source: typeof metadata.external_source === 'string' ? metadata.external_source : undefined,
114
+ key: typeof metadata.external_key === 'string' ? metadata.external_key : undefined,
115
+ id: typeof metadata.external_id === 'string' ? metadata.external_id : undefined,
116
+ url: typeof metadata.external_url === 'string' ? metadata.external_url : undefined,
117
+ };
118
+ }
70
119
  export default class WorkStart extends PMOCommand {
71
120
  static description = 'Start work on a ticket (launches an agent to implement it)';
72
121
  static examples = [
@@ -78,6 +127,11 @@ export default class WorkStart extends PMOCommand {
78
127
  '<%= config.bin %> <%= command.id %> # Interactive mode',
79
128
  '<%= config.bin %> <%= command.id %> --all # Spawn all backlog tickets',
80
129
  '<%= config.bin %> <%= command.id %> TKT-001 --prompt "Add unit tests for the API" # Custom prompt',
130
+ '<%= config.bin %> <%= command.id %> --from-issue --source linear --key ENG-123',
131
+ '<%= config.bin %> <%= command.id %> --from-issue --source jira --key PROJ-123 --mirror-to-pmo',
132
+ '<%= config.bin %> <%= command.id %> --from linear:ENG-123 # Unified: provider:key shorthand',
133
+ '<%= config.bin %> <%= command.id %> --from jira:PROJ-123 # Unified: Jira shorthand',
134
+ '<%= config.bin %> <%= command.id %> --from-issue # Uses workspace active source',
81
135
  ];
82
136
  static args = {
83
137
  ticketId: Args.string({
@@ -108,6 +162,24 @@ export default class WorkStart extends PMOCommand {
108
162
  message: Flags.string({
109
163
  description: 'Additional instructions appended to any action prompt',
110
164
  }),
165
+ from: Flags.string({
166
+ description: 'External issue ref in provider:key format (e.g., linear:ENG-123, jira:PROJ-456). Shorthand for --from-issue --source X --key Y.',
167
+ }),
168
+ 'from-issue': Flags.boolean({
169
+ description: 'Start from external issue source instead of internal ticket id',
170
+ default: false,
171
+ }),
172
+ source: Flags.string({
173
+ description: 'External issue source',
174
+ options: ['linear', 'jira'],
175
+ }),
176
+ key: Flags.string({
177
+ description: 'External issue key (for example: ENG-123, PROJ-456)',
178
+ }),
179
+ 'mirror-to-pmo': Flags.boolean({
180
+ description: 'Mirror external issue data into PMO ticket (default from execution.mirror_to_pmo_default or PRLT_MIRROR_TO_PMO_DEFAULT)',
181
+ allowNo: true,
182
+ }),
111
183
  watch: Flags.boolean({
112
184
  char: 'w',
113
185
  description: 'Stream output in real-time',
@@ -187,9 +259,115 @@ export default class WorkStart extends PMOCommand {
187
259
  hidden: true,
188
260
  }),
189
261
  };
262
+ async findLinkedTicketByEnvelope(projectId, envelope) {
263
+ const tickets = await this.storage.listTickets(projectId);
264
+ return tickets.find((ticket) => {
265
+ const external = getTicketExternalMetadata(ticket);
266
+ return external.source === envelope.source.name
267
+ && (external.key === envelope.source.externalKey || external.id === envelope.source.externalId);
268
+ });
269
+ }
270
+ async createOrUpdateLinkedTicket(projectId, envelope) {
271
+ const existing = await this.findLinkedTicketByEnvelope(projectId, envelope);
272
+ const description = buildExternalTicketDescription(envelope);
273
+ const metadata = buildExternalMetadata(envelope);
274
+ if (existing) {
275
+ return this.storage.updateTicket(existing.id, {
276
+ title: envelope.title,
277
+ description,
278
+ priority: envelope.priority ?? undefined,
279
+ category: envelope.category ?? undefined,
280
+ labels: envelope.labels,
281
+ metadata: {
282
+ ...existing.metadata,
283
+ ...metadata,
284
+ },
285
+ });
286
+ }
287
+ return this.storage.createTicket(projectId, {
288
+ title: envelope.title,
289
+ description,
290
+ priority: envelope.priority ?? undefined,
291
+ category: envelope.category ?? undefined,
292
+ labels: envelope.labels,
293
+ metadata,
294
+ });
295
+ }
296
+ async fetchExternalIssue(source, key) {
297
+ if (source === 'jira') {
298
+ return getJiraIssueByKey({}, key);
299
+ }
300
+ return getLinearIssueByIdentifier({}, key);
301
+ }
302
+ async resolveIssueSourceAndKey(input, jsonMode) {
303
+ let source = input.source;
304
+ let key = input.key;
305
+ let sourceResolutionMethod = 'flag';
306
+ // If no explicit source flag, try workspace active source
307
+ if (!isIssueSource(source) && input.db) {
308
+ const activeSource = loadActiveWorkSource(input.db);
309
+ if (activeSource && isIssueSource(activeSource.provider)) {
310
+ source = activeSource.provider;
311
+ sourceResolutionMethod = 'active-source';
312
+ }
313
+ }
314
+ const sourceResolver = new FlagResolver({
315
+ commandName: 'work start',
316
+ baseCommand: 'prlt work start --from-issue',
317
+ jsonMode,
318
+ flags: {},
319
+ });
320
+ sourceResolver.addPrompt({
321
+ flagName: 'source',
322
+ type: 'list',
323
+ message: 'Select external issue source:',
324
+ default: isIssueSource(source) ? source : undefined,
325
+ when: () => !isIssueSource(source),
326
+ choices: () => [
327
+ { name: 'Linear', value: 'linear', command: 'prlt work start --from linear:ISSUE-KEY --json' },
328
+ { name: 'Jira', value: 'jira', command: 'prlt work start --from jira:ISSUE-KEY --json' },
329
+ ],
330
+ });
331
+ const sourceResult = await sourceResolver.resolve();
332
+ if (!isIssueSource(source)) {
333
+ source = sourceResult.source;
334
+ sourceResolutionMethod = 'interactive';
335
+ // Persist selected source as default
336
+ if (input.db && isIssueSource(source)) {
337
+ saveActiveWorkSource(input.db, { provider: source });
338
+ }
339
+ }
340
+ if (!isIssueSource(source)) {
341
+ throw new Error('Invalid source');
342
+ }
343
+ const keyResolver = new FlagResolver({
344
+ commandName: 'work start',
345
+ baseCommand: `prlt work start --from ${source}:`,
346
+ jsonMode,
347
+ flags: {},
348
+ });
349
+ keyResolver.addPrompt({
350
+ flagName: 'key',
351
+ type: 'input',
352
+ message: `Enter ${source === 'linear' ? 'Linear' : 'Jira'} issue key:`,
353
+ default: key,
354
+ when: () => !key?.trim(),
355
+ validate: (value) => value.trim().length > 0 ? true : 'Issue key is required',
356
+ });
357
+ const keyResult = await keyResolver.resolve();
358
+ const resolvedKey = (key ?? keyResult.key ?? '').trim();
359
+ if (!resolvedKey) {
360
+ throw new Error('Issue key is required');
361
+ }
362
+ return {
363
+ source,
364
+ key: resolvedKey,
365
+ sourceResolution: { method: sourceResolutionMethod, provider: source },
366
+ };
367
+ }
190
368
  async execute() {
191
369
  const { args, flags } = await this.parse(WorkStart);
192
- const projectId = flags.project;
370
+ let projectId = flags.project;
193
371
  // Check for conflicting PR flags
194
372
  if (flags['create-pr'] && flags['no-pr']) {
195
373
  this.error('--create-pr and --no-pr are mutually exclusive');
@@ -239,6 +417,98 @@ export default class WorkStart extends PMOCommand {
239
417
  }
240
418
  // Get ticketId - prompt if not provided
241
419
  let ticketId = args.ticketId;
420
+ let externalIssueContextMessage;
421
+ let fromIssueMirror;
422
+ let fromIssueMirrorSource;
423
+ let sourceResolutionMeta;
424
+ // Handle --from shorthand: parse provider:key into source + key
425
+ let fromFlag = flags.from;
426
+ let fromIssueActive = flags['from-issue'];
427
+ if (fromFlag) {
428
+ if (flags['from-issue'] || flags.source || flags.key) {
429
+ db.close();
430
+ return handleError('CONFLICTING_FLAGS', '--from cannot be used with --from-issue, --source, or --key. Use either --from provider:key or --from-issue --source X --key Y.');
431
+ }
432
+ fromIssueActive = true;
433
+ // Parse provider:key from --from value
434
+ const colonIndex = fromFlag.indexOf(':');
435
+ if (colonIndex !== -1) {
436
+ flags.source = fromFlag.slice(0, colonIndex).toLowerCase();
437
+ flags.key = fromFlag.slice(colonIndex + 1).trim();
438
+ }
439
+ else {
440
+ // Provider only, no key - will prompt for key
441
+ flags.source = fromFlag.toLowerCase();
442
+ }
443
+ }
444
+ if (fromIssueActive) {
445
+ if (ticketId) {
446
+ db.close();
447
+ return handleError('INVALID_FLAGS', 'Cannot provide a ticket ID positional argument when using --from-issue or --from.');
448
+ }
449
+ const fromBaseCmd = fromFlag ? `prlt work start --from ${fromFlag}` : 'prlt work start --from-issue';
450
+ projectId = projectId || await this.requireProject({
451
+ jsonMode: {
452
+ flags,
453
+ commandName: 'work start',
454
+ baseCommand: fromBaseCmd,
455
+ },
456
+ });
457
+ const sourceAndKey = await this.resolveIssueSourceAndKey({
458
+ source: flags.source,
459
+ key: flags.key,
460
+ db,
461
+ }, jsonMode);
462
+ sourceResolutionMeta = sourceAndKey.sourceResolution;
463
+ if (!jsonMode && sourceResolutionMeta.method !== 'flag') {
464
+ this.log(styles.muted(`Source resolved via ${sourceResolutionMeta.method}: ${sourceResolutionMeta.provider}`));
465
+ }
466
+ const envMirrorDefault = parseBooleanSetting(process.env.PRLT_MIRROR_TO_PMO_DEFAULT);
467
+ const configMirrorDefault = getMirrorToPmoDefault(db);
468
+ const mirrorResolution = resolveMirrorToPmo({
469
+ flagValue: flags['mirror-to-pmo'],
470
+ envValue: envMirrorDefault,
471
+ configValue: configMirrorDefault,
472
+ });
473
+ const mirrorToPmo = mirrorResolution.enabled;
474
+ fromIssueMirror = mirrorToPmo;
475
+ fromIssueMirrorSource = mirrorResolution.source;
476
+ if (!jsonMode) {
477
+ this.log(styles.muted(`External issue mirror: ${mirrorToPmo ? 'enabled' : 'disabled'} (${mirrorResolution.source})`));
478
+ }
479
+ let envelope = null;
480
+ try {
481
+ envelope = await this.fetchExternalIssue(sourceAndKey.source, sourceAndKey.key);
482
+ }
483
+ catch (error) {
484
+ if (error instanceof ExternalIssueAdapterError) {
485
+ db.close();
486
+ return handleError(`EXTERNAL_ISSUE_${error.code}`, `[${sourceAndKey.source}] ${error.message}`);
487
+ }
488
+ const message = error instanceof Error ? error.message : 'Failed to fetch external issue.';
489
+ db.close();
490
+ return handleError('EXTERNAL_ISSUE_REQUEST_FAILED', message);
491
+ }
492
+ if (!envelope) {
493
+ db.close();
494
+ return handleError('EXTERNAL_ISSUE_NOT_FOUND', `${sourceAndKey.source} issue "${sourceAndKey.key}" was not found.`);
495
+ }
496
+ const existingLinkedTicket = await this.findLinkedTicketByEnvelope(projectId, envelope);
497
+ let linkedTicket;
498
+ if (mirrorToPmo) {
499
+ linkedTicket = await this.createOrUpdateLinkedTicket(projectId, envelope);
500
+ await autoExportToBoard(this.pmoPath, this.storage);
501
+ }
502
+ else {
503
+ if (!existingLinkedTicket) {
504
+ db.close();
505
+ return handleError('EXTERNAL_ISSUE_NOT_MIRRORED', `No linked PMO ticket found for ${sourceAndKey.source} issue "${sourceAndKey.key}". Re-run with --mirror-to-pmo.`);
506
+ }
507
+ linkedTicket = existingLinkedTicket;
508
+ }
509
+ ticketId = linkedTicket.id;
510
+ externalIssueContextMessage = buildExternalSpawnContextMessage(envelope, flags.message);
511
+ }
242
512
  if (!ticketId) {
243
513
  // Get all tickets, optionally filtered by project if -P/--project flag is provided
244
514
  const allTickets = await this.storage.listTickets(projectId);
@@ -285,6 +555,22 @@ export default class WorkStart extends PMOCommand {
285
555
  : earlyConfigPrDefault === false ? 'no-pr'
286
556
  : 'no-pr';
287
557
  metadata.resolvedPRMode = earlyResolvedPr;
558
+ const externalMetadata = getTicketExternalMetadata(ticket);
559
+ if (externalMetadata.source || externalMetadata.key) {
560
+ metadata.externalIssue = {
561
+ source: externalMetadata.source ?? null,
562
+ key: externalMetadata.key ?? null,
563
+ id: externalMetadata.id ?? null,
564
+ url: externalMetadata.url ?? null,
565
+ };
566
+ }
567
+ if (fromIssueActive) {
568
+ metadata.mirrorToPmo = fromIssueMirror ?? null;
569
+ metadata.mirrorToPmoSource = fromIssueMirrorSource ?? null;
570
+ if (sourceResolutionMeta) {
571
+ metadata.sourceResolution = sourceResolutionMeta;
572
+ }
573
+ }
288
574
  // Build the confirm command with --yes
289
575
  let confirmCmd = `prlt work start ${ticketId}`;
290
576
  if (flags.action)
@@ -341,12 +627,14 @@ export default class WorkStart extends PMOCommand {
341
627
  if (isBlocked && !flags.force) {
342
628
  const blockers = await this.storage.getTicketBlockers(ticketId);
343
629
  const incompleteBlockers = blockers.filter(b => b.status !== 'done' && b.status !== 'canceled');
344
- this.log('');
345
- this.log(styles.warning(`⚠️ ${ticketId} is blocked by:`));
346
- for (const blocker of incompleteBlockers) {
347
- this.log(styles.muted(` - ${blocker.id}: ${blocker.title} (${blocker.status})`));
630
+ if (!jsonMode) {
631
+ this.log('');
632
+ this.log(styles.warning(`⚠️ ${ticketId} is blocked by:`));
633
+ for (const blocker of incompleteBlockers) {
634
+ this.log(styles.muted(` - ${blocker.id}: ${blocker.title} (${blocker.status})`));
635
+ }
636
+ this.log('');
348
637
  }
349
- this.log('');
350
638
  // Use FlagResolver for blocked ticket confirmation
351
639
  const blockedResolver = new FlagResolver({
352
640
  commandName: 'work start',
@@ -374,8 +662,10 @@ export default class WorkStart extends PMOCommand {
374
662
  // Check for existing tmux session for this ticket
375
663
  const existingSession = getTicketTmuxSession(ticketId);
376
664
  if (existingSession && !flags.force) {
377
- this.log('');
378
- this.log(styles.warning(`Ticket ${ticketId} has an active tmux session (${existingSession.agent})`));
665
+ if (!jsonMode) {
666
+ this.log('');
667
+ this.log(styles.warning(`Ticket ${ticketId} has an active tmux session (${existingSession.agent})`));
668
+ }
379
669
  // Use FlagResolver for session action
380
670
  const sessionResolver = new FlagResolver({
381
671
  commandName: 'work start',
@@ -403,7 +693,7 @@ export default class WorkStart extends PMOCommand {
403
693
  }
404
694
  if (sessionAction === 'attach') {
405
695
  // Attach to existing session
406
- execSync(`tmux attach -t "${existingSession.sessionName}"`, { stdio: 'inherit' });
696
+ execSync(`tmux attach -d -t "${existingSession.sessionName}"`, { stdio: 'inherit' });
407
697
  db.close();
408
698
  return;
409
699
  }
@@ -468,12 +758,15 @@ export default class WorkStart extends PMOCommand {
468
758
  // No agent specified - default to creating ephemeral agent (new behavior)
469
759
  // Or prompt for agent selection if staff agents exist
470
760
  // Get staff agents that exist on disk (warns about missing directories)
471
- const activeStaffAgents = getActiveStaffAgents(workspaceInfo, (msg) => this.log(msg));
761
+ const activeStaffAgents = getActiveStaffAgents(workspaceInfo, (msg) => {
762
+ if (!jsonMode)
763
+ this.log(msg);
764
+ });
472
765
  if (activeStaffAgents.length > 0) {
473
766
  // Clean up stale executions before checking availability (TKT-604)
474
767
  // This fixes agents appearing as "busy" when their sessions have terminated
475
768
  const cleanedUp = executionStorage.cleanupStaleExecutions();
476
- if (cleanedUp > 0) {
769
+ if (cleanedUp > 0 && !jsonMode) {
477
770
  this.log(styles.muted(` Cleaned up ${cleanedUp} stale execution(s)`));
478
771
  }
479
772
  // Get list of busy agents (already running something)
@@ -516,16 +809,19 @@ export default class WorkStart extends PMOCommand {
516
809
  const selectedAgent = agentResult.selectedAgent;
517
810
  if (selectedAgent === '__ephemeral__') {
518
811
  // Create ephemeral agent
519
- this.log(styles.muted('Creating ephemeral agent...'));
812
+ if (!jsonMode)
813
+ this.log(styles.muted('Creating ephemeral agent...'));
520
814
  const ephemeralResult = await createEphemeralAgent(workspaceInfo, {
521
815
  skipDevcontainer: flags['run-on-host'],
522
- log: (msg) => this.log(msg),
816
+ log: (msg) => { if (!jsonMode)
817
+ this.log(msg); },
523
818
  mountMode: flags.clone ? 'clone' : 'worktree',
524
819
  });
525
820
  agentName = ephemeralResult.name;
526
821
  agentWorktreePath = ephemeralResult.worktreePath;
527
822
  isEphemeralAgent = true;
528
- this.log(styles.success(`Created ephemeral agent: ${agentName}`));
823
+ if (!jsonMode)
824
+ this.log(styles.success(`Created ephemeral agent: ${agentName}`));
529
825
  }
530
826
  else {
531
827
  agentName = selectedAgent;
@@ -533,16 +829,19 @@ export default class WorkStart extends PMOCommand {
533
829
  }
534
830
  else {
535
831
  // No pre-registered agents - create ephemeral agent by default
536
- this.log(styles.muted('Creating ephemeral agent...'));
832
+ if (!jsonMode)
833
+ this.log(styles.muted('Creating ephemeral agent...'));
537
834
  const ephemeralResult = await createEphemeralAgent(workspaceInfo, {
538
835
  skipDevcontainer: flags['run-on-host'],
539
- log: (msg) => this.log(msg),
836
+ log: (msg) => { if (!jsonMode)
837
+ this.log(msg); },
540
838
  mountMode: flags.clone ? 'clone' : 'worktree',
541
839
  });
542
840
  agentName = ephemeralResult.name;
543
841
  agentWorktreePath = ephemeralResult.worktreePath;
544
842
  isEphemeralAgent = true;
545
- this.log(styles.success(`Created ephemeral agent: ${agentName}`));
843
+ if (!jsonMode)
844
+ this.log(styles.success(`Created ephemeral agent: ${agentName}`));
546
845
  }
547
846
  }
548
847
  // At this point agentName is guaranteed to be set
@@ -556,7 +855,7 @@ export default class WorkStart extends PMOCommand {
556
855
  }
557
856
  // Check for running execution on this ticket (warning only, allows parallel work)
558
857
  const runningExecution = executionStorage.getRunningExecution(ticketId);
559
- if (runningExecution) {
858
+ if (runningExecution && !jsonMode) {
560
859
  this.log(styles.warning(`⚠️ Ticket "${ticketId}" already has work in progress: ${runningExecution.id}`));
561
860
  this.log(styles.muted(` Starting parallel execution. Note: status updates may conflict.`));
562
861
  }
@@ -601,16 +900,18 @@ export default class WorkStart extends PMOCommand {
601
900
  const { getAgentGitStatus, pushAgentWork } = await import('../../lib/agents/commands.js');
602
901
  const gitStatus = getAgentGitStatus(workspaceInfo, assignedAgent);
603
902
  if (gitStatus.hasUnsavedWork) {
604
- this.log(styles.warning(`\n⚠️ Agent "${assignedAgent}" has unsaved work:`));
605
- for (const wt of gitStatus.worktrees) {
606
- if (wt.hasUncommittedChanges) {
607
- this.log(styles.muted(` ${wt.repoName}: ${wt.uncommittedFiles.length} uncommitted file(s)`));
608
- }
609
- if (wt.hasUnpushedCommits) {
610
- this.log(styles.muted(` ${wt.repoName}: ${wt.unpushedCount} unpushed commit(s) on ${wt.branch}`));
903
+ if (!jsonMode) {
904
+ this.log(styles.warning(`\n⚠️ Agent "${assignedAgent}" has unsaved work:`));
905
+ for (const wt of gitStatus.worktrees) {
906
+ if (wt.hasUncommittedChanges) {
907
+ this.log(styles.muted(` ${wt.repoName}: ${wt.uncommittedFiles.length} uncommitted file(s)`));
908
+ }
909
+ if (wt.hasUnpushedCommits) {
910
+ this.log(styles.muted(` ${wt.repoName}: ${wt.unpushedCount} unpushed commit(s) on ${wt.branch}`));
911
+ }
611
912
  }
913
+ this.log('');
612
914
  }
613
- this.log('');
614
915
  // Use FlagResolver for unsaved work action
615
916
  const unsavedResolver = new FlagResolver({
616
917
  commandName: 'work start',
@@ -796,7 +1097,7 @@ export default class WorkStart extends PMOCommand {
796
1097
  actionEndPrompt: customPrompt ? undefined : selectedAction?.endPrompt,
797
1098
  modifiesCode: customPrompt ? true : selectedAction?.modifiesCode ?? true,
798
1099
  // Additional instructions from --message flag
799
- customMessage: flags.message,
1100
+ customMessage: externalIssueContextMessage ?? flags.message,
800
1101
  };
801
1102
  // Check if agent has devcontainer config
802
1103
  const hasDevcontainer = hasDevcontainerConfig(agentDir);
@@ -1033,96 +1334,139 @@ export default class WorkStart extends PMOCommand {
1033
1334
  // Auth method resolution for devcontainer environment
1034
1335
  // Only needed for Claude Code executor - other executors handle auth differently
1035
1336
  if (environment === 'devcontainer' && !useApiKey && isClaudeExecutor(executor)) {
1036
- // Check for saved auth method preference
1037
- const savedAuthMethod = getAuthMethod(db);
1038
- const hasApiKey = !!process.env.ANTHROPIC_API_KEY;
1039
- if (savedAuthMethod === 'apikey') {
1040
- // Saved preference: API key — validate it's still set
1041
- if (!hasApiKey) {
1042
- this.log('');
1043
- this.log(styles.warning('⚠️ Saved auth method is "apikey" but ANTHROPIC_API_KEY is not set in your environment.'));
1044
- this.log(styles.muted(' Set the env var or run "' + this.config.bin + ' agent auth" to switch to OAuth.'));
1045
- db.close();
1046
- return;
1337
+ // First, verify Docker daemon is actually running before checking credentials.
1338
+ // dockerCredentialsExist() runs a Docker command that fails silently when the daemon
1339
+ // is down, which would trigger a misleading OAuth credentials warning.
1340
+ if (!isDockerRunning()) {
1341
+ this.log('');
1342
+ this.log(styles.warning('Docker daemon is not running. Start Docker Desktop or use --run-on-host.'));
1343
+ this.log('');
1344
+ if (jsonMode && flags.yes) {
1345
+ // In JSON mode with --yes, auto-switch to host
1346
+ environment = 'host';
1347
+ this.log(styles.muted('Switched to host environment (Docker not running).'));
1047
1348
  }
1048
- useApiKey = true;
1049
- }
1050
- else if (savedAuthMethod === 'oauth') {
1051
- // Saved preference: OAuth validate credentials exist
1052
- const hasCredentials = dockerCredentialsExist();
1053
- if (!hasCredentials) {
1054
- this.log('');
1055
- this.log(styles.warning('⚠️ Saved auth method is "oauth" but no OAuth credentials found.'));
1056
- this.log(styles.muted(' Run "' + this.config.bin + ' agent auth" to authenticate.'));
1057
- db.close();
1058
- return;
1349
+ else {
1350
+ const dockerChoices = [
1351
+ { name: '💻 Switch to host environment', value: 'host' },
1352
+ { name: '✗ Cancel', value: 'cancel' },
1353
+ ];
1354
+ const dockerMessage = 'Docker is not running. What would you like to do?';
1355
+ const dockerResolver = new FlagResolver({
1356
+ commandName: 'work start',
1357
+ baseCommand: `prlt work start ${ticketId}`,
1358
+ jsonMode,
1359
+ flags: {},
1360
+ });
1361
+ dockerResolver.addPrompt({
1362
+ flagName: 'dockerAction',
1363
+ type: 'list',
1364
+ message: dockerMessage,
1365
+ choices: () => dockerChoices,
1366
+ });
1367
+ const dockerResult = await dockerResolver.resolve();
1368
+ const dockerAction = dockerResult.dockerAction;
1369
+ if (dockerAction === 'cancel') {
1370
+ db.close();
1371
+ this.log(styles.muted('Cancelled.'));
1372
+ return;
1373
+ }
1374
+ environment = 'host';
1375
+ this.log(styles.muted('Switched to host environment.'));
1059
1376
  }
1060
- // OAuth credentials valid — continue (useApiKey stays false)
1061
1377
  }
1062
- else {
1063
- // No saved preference — show auth method menu
1064
- const hasCredentials = dockerCredentialsExist();
1065
- if (hasCredentials) {
1066
- // OAuth credentials exist, use them silently (no menu needed)
1067
- // useApiKey stays false
1378
+ // Only check credentials if Docker is running and still using devcontainer
1379
+ if (environment === 'devcontainer') {
1380
+ // Check for saved auth method preference
1381
+ const savedAuthMethod = getAuthMethod(db);
1382
+ const hasApiKey = !!process.env.ANTHROPIC_API_KEY;
1383
+ if (savedAuthMethod === 'apikey') {
1384
+ // Saved preference: API key — validate it's still set
1385
+ if (!hasApiKey) {
1386
+ this.log('');
1387
+ this.log(styles.warning('⚠️ Saved auth method is "apikey" but ANTHROPIC_API_KEY is not set in your environment.'));
1388
+ this.log(styles.muted(' Set the env var or run "' + this.config.bin + ' agent auth" to switch to OAuth.'));
1389
+ db.close();
1390
+ return;
1391
+ }
1392
+ useApiKey = true;
1393
+ }
1394
+ else if (savedAuthMethod === 'oauth') {
1395
+ // Saved preference: OAuth — validate credentials exist
1396
+ const hasCredentials = dockerCredentialsExist();
1397
+ if (!hasCredentials) {
1398
+ this.log('');
1399
+ this.log(styles.warning('⚠️ Saved auth method is "oauth" but no OAuth credentials found.'));
1400
+ this.log(styles.muted(' Run "' + this.config.bin + ' agent auth" to authenticate.'));
1401
+ db.close();
1402
+ return;
1403
+ }
1404
+ // OAuth credentials valid — continue (useApiKey stays false)
1068
1405
  }
1069
1406
  else {
1070
- // No saved preference and no OAuth credentials — prompt user
1071
- // In JSON mode with --yes, continue anyway (agent can run /login)
1072
- if (jsonMode && flags.yes) {
1073
- // Continue without prompting - agent will need to handle auth
1407
+ // No saved preference show auth method menu
1408
+ const hasCredentials = dockerCredentialsExist();
1409
+ if (hasCredentials) {
1410
+ // OAuth credentials exist, use them silently (no menu needed)
1411
+ // useApiKey stays false
1074
1412
  }
1075
1413
  else {
1076
- this.log('');
1077
- this.log(styles.warning('⚠️ No Claude Code OAuth credentials found for Docker containers'));
1078
- this.log(styles.muted(' Agents need credentials to authenticate with Claude.'));
1079
- this.log('');
1080
- // Build auth method choices
1081
- const authChoices = [
1082
- { name: `🔐 OAuth (recommended — uses Max subscription)`, value: 'oauth' },
1083
- ];
1084
- if (hasApiKey) {
1085
- authChoices.push({ name: '🔑 API key (uses API credits, not Max subscription)', value: 'apikey' });
1086
- }
1087
- authChoices.push({ name: '💻 Switch to host environment instead', value: 'host' }, { name: '✗ Cancel', value: 'cancel' });
1088
- // Use FlagResolver for auth method selection
1089
- const authResolver = new FlagResolver({
1090
- commandName: 'work start',
1091
- baseCommand: `prlt work start ${ticketId}`,
1092
- jsonMode,
1093
- flags: {},
1094
- });
1095
- authResolver.addPrompt({
1096
- flagName: 'authAction',
1097
- type: 'list',
1098
- message: 'How should the agent authenticate with Claude?',
1099
- choices: () => authChoices,
1100
- });
1101
- const authResult = await authResolver.resolve();
1102
- const authAction = authResult.authAction;
1103
- if (authAction === 'cancel') {
1104
- db.close();
1105
- this.log(styles.muted('Cancelled.'));
1106
- return;
1107
- }
1108
- if (authAction === 'host') {
1109
- environment = 'host';
1110
- this.log(styles.muted('Switched to host environment.'));
1111
- }
1112
- else if (authAction === 'apikey') {
1113
- useApiKey = true;
1114
- this.log(styles.warning('Using ANTHROPIC_API_KEY — this will consume API credits.'));
1115
- this.log(styles.muted(`Run "${this.config.bin} agent auth" to set up OAuth and use your Max subscription instead.`));
1116
- this.log('');
1414
+ // No saved preference and no OAuth credentials — prompt user
1415
+ // In JSON mode with --yes, continue anyway (agent can run /login)
1416
+ if (jsonMode && flags.yes) {
1417
+ // Continue without prompting - agent will need to handle auth
1117
1418
  }
1118
- else if (authAction === 'oauth') {
1419
+ else {
1119
1420
  this.log('');
1120
- this.log(styles.primary(`Opening ${this.config.bin} agent auth in new tab...`));
1421
+ this.log(styles.warning('⚠️ No Claude Code OAuth credentials found for Docker containers'));
1422
+ this.log(styles.muted(' Agents need credentials to authenticate with Claude.'));
1121
1423
  this.log('');
1122
- // Open auth in a new terminal tab
1123
- const authCmd = `${process.argv[1]} agent auth`;
1124
- try {
1125
- execSync(`osascript -e '
1424
+ // Build auth method choices
1425
+ const authChoices = [
1426
+ { name: `🔐 OAuth (recommended — uses Max subscription)`, value: 'oauth' },
1427
+ ];
1428
+ if (hasApiKey) {
1429
+ authChoices.push({ name: '🔑 API key (uses API credits, not Max subscription)', value: 'apikey' });
1430
+ }
1431
+ authChoices.push({ name: '💻 Switch to host environment instead', value: 'host' }, { name: '✗ Cancel', value: 'cancel' });
1432
+ // Use FlagResolver for auth method selection
1433
+ const authResolver = new FlagResolver({
1434
+ commandName: 'work start',
1435
+ baseCommand: `prlt work start ${ticketId}`,
1436
+ jsonMode,
1437
+ flags: {},
1438
+ });
1439
+ authResolver.addPrompt({
1440
+ flagName: 'authAction',
1441
+ type: 'list',
1442
+ message: 'How should the agent authenticate with Claude?',
1443
+ choices: () => authChoices,
1444
+ });
1445
+ const authResult = await authResolver.resolve();
1446
+ const authAction = authResult.authAction;
1447
+ if (authAction === 'cancel') {
1448
+ db.close();
1449
+ this.log(styles.muted('Cancelled.'));
1450
+ return;
1451
+ }
1452
+ if (authAction === 'host') {
1453
+ environment = 'host';
1454
+ this.log(styles.muted('Switched to host environment.'));
1455
+ }
1456
+ else if (authAction === 'apikey') {
1457
+ useApiKey = true;
1458
+ this.log(styles.warning('Using ANTHROPIC_API_KEY — this will consume API credits.'));
1459
+ this.log(styles.muted(`Run "${this.config.bin} agent auth" to set up OAuth and use your Max subscription instead.`));
1460
+ this.log('');
1461
+ }
1462
+ else if (authAction === 'oauth') {
1463
+ this.log('');
1464
+ this.log(styles.primary(`Opening ${this.config.bin} agent auth in new tab...`));
1465
+ this.log('');
1466
+ // Open auth in a new terminal tab
1467
+ const authCmd = `${process.argv[1]} agent auth`;
1468
+ try {
1469
+ execSync(`osascript -e '
1126
1470
  tell application "iTerm"
1127
1471
  tell current window
1128
1472
  create tab with default profile
@@ -1132,69 +1476,70 @@ export default class WorkStart extends PMOCommand {
1132
1476
  end tell
1133
1477
  end tell
1134
1478
  '`);
1135
- }
1136
- catch {
1137
- // Fallback: try Terminal.app
1138
- try {
1139
- execSync(`osascript -e 'tell application "Terminal" to do script "${authCmd}"'`);
1140
1479
  }
1141
1480
  catch {
1142
- this.log(styles.warning('Could not open new terminal tab.'));
1143
- this.log(styles.muted(`Please run manually: ${authCmd}`));
1481
+ // Fallback: try Terminal.app
1482
+ try {
1483
+ execSync(`osascript -e 'tell application "Terminal" to do script "${authCmd}"'`);
1484
+ }
1485
+ catch {
1486
+ this.log(styles.warning('Could not open new terminal tab.'));
1487
+ this.log(styles.muted(`Please run manually: ${authCmd}`));
1488
+ }
1144
1489
  }
1145
- }
1146
- this.log(styles.muted('Complete the /login flow in the new tab, then press Enter here...'));
1147
- this.log('');
1148
- // Wait for user to complete auth
1149
- await this.prompt([{
1150
- type: 'input',
1151
- name: 'done',
1152
- message: 'Press Enter when authentication is complete:',
1153
- }]);
1154
- // Check if credentials now exist
1155
- if (!dockerCredentialsExist()) {
1490
+ this.log(styles.muted('Complete the /login flow in the new tab, then press Enter here...'));
1156
1491
  this.log('');
1157
- this.log(styles.warning('Authentication did not complete. No credentials found.'));
1158
- db.close();
1159
- return;
1160
- }
1161
- const info = getDockerCredentialInfo();
1162
- this.log('');
1163
- this.log(styles.success('✓ Credentials configured'));
1164
- if (info) {
1165
- this.log(styles.muted(` Subscription: ${info.subscriptionType || 'unknown'}`));
1166
- this.log(styles.muted(` Expires: ${info.expiresAt.toLocaleDateString()}`));
1167
- }
1168
- this.log('');
1169
- }
1170
- // Prompt "Save as default?" after a successful auth method choice
1171
- // (only if they chose oauth or apikey, not host/cancel)
1172
- if (authAction === 'oauth' || authAction === 'apikey') {
1173
- const saveChoices = [
1174
- { name: 'Yes skip this menu next time', value: true },
1175
- { name: 'No — ask me each time', value: false },
1176
- ];
1177
- const saveMessage = 'Save as default auth method?';
1178
- const saveResolver = new FlagResolver({
1179
- commandName: 'work start',
1180
- baseCommand: `prlt work start ${ticketId}`,
1181
- jsonMode,
1182
- flags: {},
1183
- });
1184
- saveResolver.addPrompt({
1185
- flagName: 'saveDefault',
1186
- type: 'list',
1187
- message: saveMessage,
1188
- default: true,
1189
- choices: () => saveChoices,
1190
- });
1191
- const saveResult = await saveResolver.resolve();
1192
- if (saveResult.saveDefault) {
1193
- const methodToSave = authAction === 'apikey' ? 'apikey' : 'oauth';
1194
- saveAuthMethod(db, methodToSave);
1195
- this.log(styles.muted(`Auth method saved: ${methodToSave}. Will skip this menu next time.`));
1492
+ // Wait for user to complete auth
1493
+ await this.prompt([{
1494
+ type: 'input',
1495
+ name: 'done',
1496
+ message: 'Press Enter when authentication is complete:',
1497
+ }]);
1498
+ // Check if credentials now exist
1499
+ if (!dockerCredentialsExist()) {
1500
+ this.log('');
1501
+ this.log(styles.warning('Authentication did not complete. No credentials found.'));
1502
+ db.close();
1503
+ return;
1504
+ }
1505
+ const info = getDockerCredentialInfo();
1506
+ this.log('');
1507
+ this.log(styles.success(' Credentials configured'));
1508
+ if (info) {
1509
+ this.log(styles.muted(` Subscription: ${info.subscriptionType || 'unknown'}`));
1510
+ this.log(styles.muted(` Expires: ${info.expiresAt.toLocaleDateString()}`));
1511
+ }
1196
1512
  this.log('');
1197
1513
  }
1514
+ // Prompt "Save as default?" after a successful auth method choice
1515
+ // (only if they chose oauth or apikey, not host/cancel)
1516
+ if (authAction === 'oauth' || authAction === 'apikey') {
1517
+ const saveChoices = [
1518
+ { name: 'Yes — skip this menu next time', value: true },
1519
+ { name: 'No — ask me each time', value: false },
1520
+ ];
1521
+ const saveMessage = 'Save as default auth method?';
1522
+ const saveResolver = new FlagResolver({
1523
+ commandName: 'work start',
1524
+ baseCommand: `prlt work start ${ticketId}`,
1525
+ jsonMode,
1526
+ flags: {},
1527
+ });
1528
+ saveResolver.addPrompt({
1529
+ flagName: 'saveDefault',
1530
+ type: 'list',
1531
+ message: saveMessage,
1532
+ default: true,
1533
+ choices: () => saveChoices,
1534
+ });
1535
+ const saveResult = await saveResolver.resolve();
1536
+ if (saveResult.saveDefault) {
1537
+ const methodToSave = authAction === 'apikey' ? 'apikey' : 'oauth';
1538
+ saveAuthMethod(db, methodToSave);
1539
+ this.log(styles.muted(`Auth method saved: ${methodToSave}. Will skip this menu next time.`));
1540
+ this.log('');
1541
+ }
1542
+ }
1198
1543
  }
1199
1544
  }
1200
1545
  }
@@ -1523,6 +1868,7 @@ export default class WorkStart extends PMOCommand {
1523
1868
  }
1524
1869
  }
1525
1870
  // Create execution record
1871
+ const ticketExternalMetadata = getTicketExternalMetadata(ticket);
1526
1872
  const execution = executionStorage.createExecution({
1527
1873
  ticketId: ticket.id,
1528
1874
  agentName: assignedAgent,
@@ -1531,6 +1877,10 @@ export default class WorkStart extends PMOCommand {
1531
1877
  displayMode,
1532
1878
  permissionMode,
1533
1879
  branch,
1880
+ externalSource: ticketExternalMetadata.source,
1881
+ externalKey: ticketExternalMetadata.key,
1882
+ externalId: ticketExternalMetadata.id,
1883
+ externalUrl: ticketExternalMetadata.url,
1534
1884
  });
1535
1885
  if (!jsonMode) {
1536
1886
  this.log(styles.muted(` Work ID: ${execution.id}`));
@@ -1586,6 +1936,13 @@ export default class WorkStart extends PMOCommand {
1586
1936
  sessionManager: environment === 'devcontainer' ? sessionManager : undefined,
1587
1937
  });
1588
1938
  if (result.success) {
1939
+ // Track agent spawn analytics
1940
+ trackAgentSpawned({
1941
+ executor,
1942
+ environment,
1943
+ action: context.actionId || 'implement',
1944
+ ephemeral: isEphemeralAgent,
1945
+ });
1589
1946
  // Update execution record with process info
1590
1947
  executionStorage.updateStatus(execution.id, 'running');
1591
1948
  executionStorage.updateProcessInfo(execution.id, {
@@ -1782,52 +2139,79 @@ export default class WorkStart extends PMOCommand {
1782
2139
  let batchUseApiKey = false;
1783
2140
  // Credential check only applies to Claude Code executor
1784
2141
  if (anyUseDevcontainer && isClaudeExecutor(batchExecutor)) {
1785
- const hasCredentials = dockerCredentialsExist();
1786
- if (!hasCredentials) {
1787
- const hasApiKey = !!process.env.ANTHROPIC_API_KEY;
2142
+ // First, verify Docker daemon is actually running before checking credentials.
2143
+ // dockerCredentialsExist() runs a Docker command that fails silently when the daemon
2144
+ // is down, which would trigger a misleading OAuth credentials warning.
2145
+ if (!isDockerRunning()) {
1788
2146
  this.log('');
1789
- this.log(styles.warning('⚠️ No Claude Code OAuth credentials found for Docker containers'));
1790
- this.log(styles.muted(' Agents need credentials to authenticate with Claude.'));
2147
+ this.log(styles.warning('Docker daemon is not running. Start Docker Desktop or use --run-on-host.'));
1791
2148
  this.log('');
1792
- // Build choices based on available options
1793
- const batchAuthChoices = [
1794
- { name: `🔐 Run ${this.config.bin} agent auth now (recommended — uses Max subscription)`, value: 'auth', command: `${this.config.bin} agent auth` },
1795
- ];
1796
- if (hasApiKey) {
1797
- batchAuthChoices.push({ name: '🔑 Use ANTHROPIC_API_KEY (⚠️ uses API credits, not Max subscription)', value: 'apikey', command: '' });
1798
- }
1799
- 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: '' });
1800
- const { authAction } = await this.prompt([
2149
+ const { dockerAction } = await this.prompt([
1801
2150
  {
1802
2151
  type: 'list',
1803
- name: 'authAction',
1804
- message: 'What would you like to do?',
1805
- choices: batchAuthChoices,
2152
+ name: 'dockerAction',
2153
+ message: 'Docker is not running. What would you like to do?',
2154
+ choices: [
2155
+ { name: '💻 Run all agents on host instead (--run-on-host)', value: 'host', command: 'prlt work start --all --run-on-host --json' },
2156
+ { name: '✗ Cancel', value: 'cancel', command: '' },
2157
+ ],
1806
2158
  },
1807
2159
  ], batchJsonModeConfig);
1808
- if (authAction === 'cancel') {
2160
+ if (dockerAction === 'cancel') {
1809
2161
  db.close();
1810
2162
  this.log(styles.muted('Cancelled.'));
1811
2163
  return;
1812
2164
  }
1813
- if (authAction === 'host') {
1814
- flags['run-on-host'] = true;
1815
- this.log(styles.muted('All agents will run on host.'));
1816
- }
1817
- else if (authAction === 'apikey') {
1818
- batchUseApiKey = true;
1819
- this.log(styles.warning('Using ANTHROPIC_API_KEY this will consume API credits.'));
1820
- this.log(styles.muted(`Run "${this.config.bin} agent auth" to set up OAuth and use your Max subscription instead.`));
1821
- this.log('');
1822
- }
1823
- else if (authAction === 'auth') {
2165
+ flags['run-on-host'] = true;
2166
+ this.log(styles.muted('All agents will run on host.'));
2167
+ }
2168
+ if (!flags['run-on-host']) {
2169
+ const hasCredentials = dockerCredentialsExist();
2170
+ if (!hasCredentials) {
2171
+ const hasApiKey = !!process.env.ANTHROPIC_API_KEY;
1824
2172
  this.log('');
1825
- this.log(styles.primary(`Opening ${this.config.bin} agent auth in new tab...`));
2173
+ this.log(styles.warning('⚠️ No Claude Code OAuth credentials found for Docker containers'));
2174
+ this.log(styles.muted(' Agents need credentials to authenticate with Claude.'));
1826
2175
  this.log('');
1827
- // Open auth in a new terminal tab
1828
- const authCmd = `${process.argv[1]} agent auth`;
1829
- try {
1830
- execSync(`osascript -e '
2176
+ // Build choices based on available options
2177
+ const batchAuthChoices = [
2178
+ { name: `🔐 Run ${this.config.bin} agent auth now (recommended — uses Max subscription)`, value: 'auth', command: `${this.config.bin} agent auth` },
2179
+ ];
2180
+ if (hasApiKey) {
2181
+ batchAuthChoices.push({ name: '🔑 Use ANTHROPIC_API_KEY (⚠️ uses API credits, not Max subscription)', value: 'apikey', command: '' });
2182
+ }
2183
+ 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: '' });
2184
+ const { authAction } = await this.prompt([
2185
+ {
2186
+ type: 'list',
2187
+ name: 'authAction',
2188
+ message: 'What would you like to do?',
2189
+ choices: batchAuthChoices,
2190
+ },
2191
+ ], batchJsonModeConfig);
2192
+ if (authAction === 'cancel') {
2193
+ db.close();
2194
+ this.log(styles.muted('Cancelled.'));
2195
+ return;
2196
+ }
2197
+ if (authAction === 'host') {
2198
+ flags['run-on-host'] = true;
2199
+ this.log(styles.muted('All agents will run on host.'));
2200
+ }
2201
+ else if (authAction === 'apikey') {
2202
+ batchUseApiKey = true;
2203
+ this.log(styles.warning('Using ANTHROPIC_API_KEY — this will consume API credits.'));
2204
+ this.log(styles.muted(`Run "${this.config.bin} agent auth" to set up OAuth and use your Max subscription instead.`));
2205
+ this.log('');
2206
+ }
2207
+ else if (authAction === 'auth') {
2208
+ this.log('');
2209
+ this.log(styles.primary(`Opening ${this.config.bin} agent auth in new tab...`));
2210
+ this.log('');
2211
+ // Open auth in a new terminal tab
2212
+ const authCmd = `${process.argv[1]} agent auth`;
2213
+ try {
2214
+ execSync(`osascript -e '
1831
2215
  tell application "iTerm"
1832
2216
  tell current window
1833
2217
  create tab with default profile
@@ -1837,40 +2221,41 @@ export default class WorkStart extends PMOCommand {
1837
2221
  end tell
1838
2222
  end tell
1839
2223
  '`);
1840
- }
1841
- catch {
1842
- // Fallback: try Terminal.app
1843
- try {
1844
- execSync(`osascript -e 'tell application "Terminal" to do script "${authCmd}"'`);
1845
2224
  }
1846
2225
  catch {
1847
- this.log(styles.warning('Could not open new terminal tab.'));
1848
- this.log(styles.muted(`Please run manually: ${authCmd}`));
2226
+ // Fallback: try Terminal.app
2227
+ try {
2228
+ execSync(`osascript -e 'tell application "Terminal" to do script "${authCmd}"'`);
2229
+ }
2230
+ catch {
2231
+ this.log(styles.warning('Could not open new terminal tab.'));
2232
+ this.log(styles.muted(`Please run manually: ${authCmd}`));
2233
+ }
2234
+ }
2235
+ this.log(styles.muted('Complete the /login flow in the new tab, then press Enter here...'));
2236
+ this.log('');
2237
+ // Wait for user to complete auth
2238
+ await this.prompt([{
2239
+ type: 'input',
2240
+ name: 'done',
2241
+ message: 'Press Enter when authentication is complete:',
2242
+ }], batchJsonModeConfig);
2243
+ // Check if credentials now exist
2244
+ if (!dockerCredentialsExist()) {
2245
+ this.log('');
2246
+ this.log(styles.warning('Authentication did not complete. No credentials found.'));
2247
+ db.close();
2248
+ return;
2249
+ }
2250
+ const info = getDockerCredentialInfo();
2251
+ this.log('');
2252
+ this.log(styles.success('✓ Credentials configured'));
2253
+ if (info) {
2254
+ this.log(styles.muted(` Subscription: ${info.subscriptionType || 'unknown'}`));
2255
+ this.log(styles.muted(` Expires: ${info.expiresAt.toLocaleDateString()}`));
1849
2256
  }
1850
- }
1851
- this.log(styles.muted('Complete the /login flow in the new tab, then press Enter here...'));
1852
- this.log('');
1853
- // Wait for user to complete auth
1854
- await this.prompt([{
1855
- type: 'input',
1856
- name: 'done',
1857
- message: 'Press Enter when authentication is complete:',
1858
- }], batchJsonModeConfig);
1859
- // Check if credentials now exist
1860
- if (!dockerCredentialsExist()) {
1861
2257
  this.log('');
1862
- this.log(styles.warning('Authentication did not complete. No credentials found.'));
1863
- db.close();
1864
- return;
1865
- }
1866
- const info = getDockerCredentialInfo();
1867
- this.log('');
1868
- this.log(styles.success('✓ Credentials configured'));
1869
- if (info) {
1870
- this.log(styles.muted(` Subscription: ${info.subscriptionType || 'unknown'}`));
1871
- this.log(styles.muted(` Expires: ${info.expiresAt.toLocaleDateString()}`));
1872
2258
  }
1873
- this.log('');
1874
2259
  }
1875
2260
  }
1876
2261
  }
@@ -2027,6 +2412,7 @@ export default class WorkStart extends PMOCommand {
2027
2412
  }
2028
2413
  }
2029
2414
  // Create execution record
2415
+ const ticketExternalMetadata = getTicketExternalMetadata(ticket);
2030
2416
  const execution = executionStorage.createExecution({
2031
2417
  ticketId: ticket.id,
2032
2418
  agentName,
@@ -2035,6 +2421,10 @@ export default class WorkStart extends PMOCommand {
2035
2421
  displayMode,
2036
2422
  permissionMode,
2037
2423
  branch,
2424
+ externalSource: ticketExternalMetadata.source,
2425
+ externalKey: ticketExternalMetadata.key,
2426
+ externalId: ticketExternalMetadata.id,
2427
+ externalUrl: ticketExternalMetadata.url,
2038
2428
  });
2039
2429
  // Note: Ticket status update moved to after successful spawn
2040
2430
  // Load execution config
@@ -2077,3 +2467,4 @@ export default class WorkStart extends PMOCommand {
2077
2467
  }
2078
2468
  }
2079
2469
  }
2470
+ //# sourceMappingURL=start.js.map