@dylanpiercey/work 0.0.48 → 0.0.50

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 (240) hide show
  1. package/bin/work.mjs +148 -1
  2. package/dist/_B1U5NJd1.js +2 -0
  3. package/dist/{_m3ryV1w6.js → _BMPRQiid.js} +15 -15
  4. package/dist/{_CO83dVER.js → _Bi2N56tu.js} +60 -57
  5. package/dist/{_Hz_qlZE1.js → _CkFSxwl9.js} +58 -58
  6. package/dist/index.mjs +3974 -3672
  7. package/dist/public/assets/{_CH4P29Yf2.js → _14Rf7auw2.js} +1 -1
  8. package/dist/public/assets/_14Rf7auw2.js.br +0 -0
  9. package/dist/public/assets/{_B49r6O_E.js → _3L9qJ2FI.js} +1 -1
  10. package/dist/public/assets/_3L9qJ2FI.js.br +0 -0
  11. package/dist/public/assets/{_I6H6F0ME.js → _46jbMvnT.js} +1 -1
  12. package/dist/public/assets/_46jbMvnT.js.br +0 -0
  13. package/dist/public/assets/{_CtErcdf92.js → _5B_C1ELg2.js} +1 -1
  14. package/dist/public/assets/_5B_C1ELg2.js.br +0 -0
  15. package/dist/public/assets/{_1oYv4fmY2.js → _6FgRPbD12.js} +1 -1
  16. package/dist/public/assets/_6FgRPbD12.js.br +0 -0
  17. package/dist/public/assets/{_BPLnh5S4.js → _8OBdOEN_.js} +1 -1
  18. package/dist/public/assets/_8OBdOEN_.js.br +0 -0
  19. package/dist/public/assets/{_C4NK2Cq5.js → _B0BWvFlM.js} +1 -1
  20. package/dist/public/assets/_B0BWvFlM.js.br +0 -0
  21. package/dist/public/assets/{_kv39JOeM.js → _B3OlqMGd.js} +1 -1
  22. package/dist/public/assets/_B3OlqMGd.js.br +0 -0
  23. package/dist/public/assets/{_CsNJf4g52.js → _B3vaoKEN2.js} +1 -1
  24. package/dist/public/assets/_B3vaoKEN2.js.br +0 -0
  25. package/dist/public/assets/{_Cf0wSsqE.js → _B7_X6QKl.js} +1 -1
  26. package/dist/public/assets/_B7_X6QKl.js.br +0 -0
  27. package/dist/public/assets/{_1cz-l3Ka.js → _B7zx6ruH.js} +1 -1
  28. package/dist/public/assets/_B7zx6ruH.js.br +0 -0
  29. package/dist/public/assets/{_Bvwr3uff.js → _BAmdta6F.js} +1 -1
  30. package/dist/public/assets/_BAmdta6F.js.br +0 -0
  31. package/dist/public/assets/{_DBN8F3s1.js → _BDs5gBRu.js} +1 -1
  32. package/dist/public/assets/_BDs5gBRu.js.br +0 -0
  33. package/dist/public/assets/{_BdbnwCKs2.js → _BHyVr2SL2.js} +1 -1
  34. package/dist/public/assets/_BHyVr2SL2.js.br +0 -0
  35. package/dist/public/assets/{_ClEKr0Tm2.js → _BKFltGNM2.js} +1 -1
  36. package/dist/public/assets/_BKFltGNM2.js.br +0 -0
  37. package/dist/public/assets/{_B2fn4I8S2.js → _BKrb_vR32.js} +1 -1
  38. package/dist/public/assets/_BKrb_vR32.js.br +0 -0
  39. package/dist/public/assets/{_BiEWaww7.js → _BM1T1EOI.js} +1 -1
  40. package/dist/public/assets/_BM1T1EOI.js.br +0 -0
  41. package/dist/public/assets/{_BhUM9ZCP.js → _BO7NVUTp.js} +1 -1
  42. package/dist/public/assets/_BO7NVUTp.js.br +0 -0
  43. package/dist/public/assets/{_Ez06j6Qv.js → _BPVwmM2e.js} +1 -1
  44. package/dist/public/assets/_BPVwmM2e.js.br +0 -0
  45. package/dist/public/assets/{_BFt-jSq-.js → _BTA9H0Q3.js} +1 -1
  46. package/dist/public/assets/_BTA9H0Q3.js.br +0 -0
  47. package/dist/public/assets/{_BRzL7uNP.js → _BVn7ySs5.js} +1 -1
  48. package/dist/public/assets/_BVn7ySs5.js.br +0 -0
  49. package/dist/public/assets/{_Ced5468N2.js → _BXOM5Rv62.js} +1 -1
  50. package/dist/public/assets/{_8nx9Raqx2.js → _Bfrb3Fvn2.js} +1 -1
  51. package/dist/public/assets/_Bfrb3Fvn2.js.br +0 -0
  52. package/dist/public/assets/{_CHqTBuzz2.js → _BipcKLQ82.js} +1 -1
  53. package/dist/public/assets/_BipcKLQ82.js.br +0 -0
  54. package/dist/public/assets/{_DKnLFVdw.js → _BqTMyizJ.js} +1 -1
  55. package/dist/public/assets/_BqTMyizJ.js.br +0 -0
  56. package/dist/public/assets/{_BbW3-3ve.js → _Bqk-7ZnJ.js} +1 -1
  57. package/dist/public/assets/_Bqk-7ZnJ.js.br +0 -0
  58. package/dist/public/assets/{_DLK0WouR.js → _BrIeskzm.js} +1 -1
  59. package/dist/public/assets/_BrIeskzm.js.br +0 -0
  60. package/dist/public/assets/{_CIeZtXbg2.js → _BteZRGy02.js} +1 -1
  61. package/dist/public/assets/_BteZRGy02.js.br +0 -0
  62. package/dist/public/assets/{_B-MMW3nb2.js → _Bw4RcZCP2.js} +1 -1
  63. package/dist/public/assets/_Bw4RcZCP2.js.br +0 -0
  64. package/dist/public/assets/{_DFOnuGNp.js → _C0yzBH1I.js} +1 -1
  65. package/dist/public/assets/_C0yzBH1I.js.br +0 -0
  66. package/dist/public/assets/{_K6PNL3j4.js → _CAq8JoYd.js} +1 -1
  67. package/dist/public/assets/_CAq8JoYd.js.br +0 -0
  68. package/dist/public/assets/{_DOpT45mO.js → _CG33pVWf.js} +1 -1
  69. package/dist/public/assets/_CG33pVWf.js.br +0 -0
  70. package/dist/public/assets/{_qoSWRJiT.js → _CJRnhPJ5.js} +1 -1
  71. package/dist/public/assets/_CJRnhPJ5.js.br +0 -0
  72. package/dist/public/assets/{_DHvVwuPu2.js → _CLFzw6tJ2.js} +1 -1
  73. package/dist/public/assets/_CLFzw6tJ2.js.br +0 -0
  74. package/dist/public/assets/{_CUwAZxRw.js → _CTCAIoky.js} +1 -1
  75. package/dist/public/assets/_CTCAIoky.js.br +0 -0
  76. package/dist/public/assets/{_BC2FBUbj.js → _CUk8oM8X.js} +1 -1
  77. package/dist/public/assets/_CUk8oM8X.js.br +0 -0
  78. package/dist/public/assets/{_De7fhQUT.js → _CYutj5Nn.js} +1 -1
  79. package/dist/public/assets/_CYutj5Nn.js.br +0 -0
  80. package/dist/public/assets/{_DLLEkkcM.js → _ChMN3jzE.js} +5 -5
  81. package/dist/public/assets/_ChMN3jzE.js.br +0 -0
  82. package/dist/public/assets/{_h8qSl3Me.js → _Cl5zwC6C.js} +1 -1
  83. package/dist/public/assets/{_Bpdzs0h4.js → _CmPpWb_a.js} +1 -1
  84. package/dist/public/assets/_CmPpWb_a.js.br +0 -0
  85. package/dist/public/assets/{_KjztUkjx.js → _CnAW-XtK.js} +1 -1
  86. package/dist/public/assets/_CnAW-XtK.js.br +0 -0
  87. package/dist/public/assets/{_BqeAAcor.js → _CoZJRwLV.js} +1 -1
  88. package/dist/public/assets/_CoZJRwLV.js.br +0 -0
  89. package/dist/public/assets/{_3i592Qvz2.js → _CpuGya-f2.js} +1 -1
  90. package/dist/public/assets/_CpuGya-f2.js.br +0 -0
  91. package/dist/public/assets/{_CbMNS899.js → _CvF3Yy4B.js} +1 -1
  92. package/dist/public/assets/_CvF3Yy4B.js.br +0 -0
  93. package/dist/public/assets/{_DBn74psf2.js → _CwesB1Zy2.js} +1 -1
  94. package/dist/public/assets/{_DT9Qs1il.js → _CxVYrK29.js} +1 -1
  95. package/dist/public/assets/_CxVYrK29.js.br +0 -0
  96. package/dist/public/assets/{_Bg9mkw0u.js → _D4Agz1BW.js} +1 -1
  97. package/dist/public/assets/_D4Agz1BW.js.br +0 -0
  98. package/dist/public/assets/{_CQDBqJkT.js → _D7t5subj.js} +1 -1
  99. package/dist/public/assets/_D7t5subj.js.br +0 -0
  100. package/dist/public/assets/{_Bhnzfac_.js → _D8LNkUUk.js} +1 -1
  101. package/dist/public/assets/_D8LNkUUk.js.br +0 -0
  102. package/dist/public/assets/{_ByiODT9w.js → _DKExcf_t.js} +1 -1
  103. package/dist/public/assets/_DKExcf_t.js.br +0 -0
  104. package/dist/public/assets/{_Dn4wMX5v.js → _DaBnEzqR.js} +1 -1
  105. package/dist/public/assets/_DaBnEzqR.js.br +0 -0
  106. package/dist/public/assets/{_CASsRCtt.js → _DaFCn9AP.js} +1 -1
  107. package/dist/public/assets/_DaFCn9AP.js.br +0 -0
  108. package/dist/public/assets/{_o1of2_lP.js → _DmD3gC-H.js} +1 -1
  109. package/dist/public/assets/_DmD3gC-H.js.br +0 -0
  110. package/dist/public/assets/{_DVPPxo4e2.js → _Dp1uWzpq2.js} +1 -1
  111. package/dist/public/assets/_Dp1uWzpq2.js.br +0 -0
  112. package/dist/public/assets/{_DjLQQUoq.js → _DrzuvLS6.js} +1 -1
  113. package/dist/public/assets/_DrzuvLS6.js.br +0 -0
  114. package/dist/public/assets/{_KVpYyL9A.js → _Dwi7467c.js} +1 -1
  115. package/dist/public/assets/_Dwi7467c.js.br +0 -0
  116. package/dist/public/assets/{_DgmBuYFG2.js → _END-bJOF2.js} +1 -1
  117. package/dist/public/assets/_END-bJOF2.js.br +0 -0
  118. package/dist/public/assets/{_yQJK428k.js → _Ip505vk_.js} +1 -1
  119. package/dist/public/assets/_Ip505vk_.js.br +0 -0
  120. package/dist/public/assets/{_BLjOZLxk.js → _LbQesljk.js} +1 -1
  121. package/dist/public/assets/_LbQesljk.js.br +0 -0
  122. package/dist/public/assets/{_DsJkMBKU2.js → _MWudDHh02.js} +1 -1
  123. package/dist/public/assets/_MWudDHh02.js.br +0 -0
  124. package/dist/public/assets/{_Bm-lmvlM.js → _R2u4F0-3.js} +1 -1
  125. package/dist/public/assets/_R2u4F0-3.js.br +0 -0
  126. package/dist/public/assets/{_DAfu0wMa.js → _YpsD0CNd.js} +1 -1
  127. package/dist/public/assets/_YpsD0CNd.js.br +0 -0
  128. package/dist/public/assets/{_BV-nVD9L2.js → _ZMT8kCL52.js} +1 -1
  129. package/dist/public/assets/_ZMT8kCL52.js.br +0 -0
  130. package/dist/public/assets/{_BPFJiBiE.js → _aTh5ZUn4.js} +1 -1
  131. package/dist/public/assets/_aTh5ZUn4.js.br +0 -0
  132. package/dist/public/assets/{_cRLLpjIg.js → _ds7D8iP9.js} +1 -1
  133. package/dist/public/assets/_ds7D8iP9.js.br +0 -0
  134. package/dist/public/assets/{_BBW7mJhZ.js → _eLSetQBz.js} +1 -1
  135. package/dist/public/assets/_eLSetQBz.js.br +0 -0
  136. package/dist/public/assets/{_BGyMoPGj2.js → _eXTAehNM2.js} +1 -1
  137. package/dist/public/assets/_eXTAehNM2.js.br +0 -0
  138. package/dist/public/assets/{_FCV34uHN.js → _g5scf0ei.js} +1 -1
  139. package/dist/public/assets/_g5scf0ei.js.br +0 -0
  140. package/dist/public/assets/{_CObQoJCq.js → _gVQOuQ8i.js} +1 -1
  141. package/dist/public/assets/_gVQOuQ8i.js.br +0 -0
  142. package/dist/public/assets/{_BbMkV19p2.js → _mooiyN7w2.js} +1 -1
  143. package/dist/public/assets/_mooiyN7w2.js.br +0 -0
  144. package/dist/public/assets/{_BeSgyXoy2.js → _oOOdPbmX2.js} +1 -1
  145. package/dist/public/assets/_oOOdPbmX2.js.br +0 -0
  146. package/dist/public/assets/{_CUqlR7rP.js → _qDJ6gb3q.js} +1 -1
  147. package/dist/public/assets/_qDJ6gb3q.js.br +0 -0
  148. package/dist/public/assets/{_9yP8iK4t2.js → _vdLXTjUv2.js} +1 -1
  149. package/dist/public/assets/_vdLXTjUv2.js.br +0 -0
  150. package/dist/public/assets/{_DLFnXIrG2.js → _yXYQK3xI2.js} +1 -1
  151. package/dist/public/assets/_yXYQK3xI2.js.br +0 -0
  152. package/dist/public/assets/{_Q6y5EfU1.js → _ylRundRE.js} +1 -1
  153. package/dist/public/assets/_ylRundRE.js.br +0 -0
  154. package/dist/public/assets/diff-view-CFyPUyMl.css +1 -0
  155. package/dist/public/assets/diff-view-CFyPUyMl.css.br +0 -0
  156. package/dist/public/assets/index-CLK3dq8r.js +85 -0
  157. package/dist/public/assets/index-CLK3dq8r.js.br +0 -0
  158. package/dist/public/assets/index-DL_Vi7rw.css +1 -0
  159. package/dist/public/assets/index-DL_Vi7rw.css.br +0 -0
  160. package/package.json +1 -1
  161. package/scripts/migrate.mjs +21 -0
  162. package/dist/_DjrRGy4k.js +0 -2
  163. package/dist/public/assets/_1cz-l3Ka.js.br +0 -0
  164. package/dist/public/assets/_1oYv4fmY2.js.br +0 -0
  165. package/dist/public/assets/_3i592Qvz2.js.br +0 -0
  166. package/dist/public/assets/_8nx9Raqx2.js.br +0 -0
  167. package/dist/public/assets/_9yP8iK4t2.js.br +0 -0
  168. package/dist/public/assets/_B-MMW3nb2.js.br +0 -0
  169. package/dist/public/assets/_B2fn4I8S2.js.br +0 -0
  170. package/dist/public/assets/_B49r6O_E.js.br +0 -0
  171. package/dist/public/assets/_BBW7mJhZ.js.br +0 -0
  172. package/dist/public/assets/_BC2FBUbj.js.br +0 -0
  173. package/dist/public/assets/_BFt-jSq-.js.br +0 -0
  174. package/dist/public/assets/_BGyMoPGj2.js.br +0 -0
  175. package/dist/public/assets/_BLjOZLxk.js.br +0 -0
  176. package/dist/public/assets/_BPFJiBiE.js.br +0 -0
  177. package/dist/public/assets/_BPLnh5S4.js.br +0 -0
  178. package/dist/public/assets/_BRzL7uNP.js.br +0 -0
  179. package/dist/public/assets/_BV-nVD9L2.js.br +0 -0
  180. package/dist/public/assets/_BbMkV19p2.js.br +0 -0
  181. package/dist/public/assets/_BbW3-3ve.js.br +0 -0
  182. package/dist/public/assets/_BdbnwCKs2.js.br +0 -0
  183. package/dist/public/assets/_BeSgyXoy2.js.br +0 -0
  184. package/dist/public/assets/_Bg9mkw0u.js.br +0 -0
  185. package/dist/public/assets/_BhUM9ZCP.js.br +0 -0
  186. package/dist/public/assets/_Bhnzfac_.js.br +0 -0
  187. package/dist/public/assets/_BiEWaww7.js.br +0 -0
  188. package/dist/public/assets/_Bm-lmvlM.js.br +0 -0
  189. package/dist/public/assets/_Bpdzs0h4.js.br +0 -0
  190. package/dist/public/assets/_BqeAAcor.js.br +0 -0
  191. package/dist/public/assets/_Bvwr3uff.js.br +0 -0
  192. package/dist/public/assets/_ByiODT9w.js.br +0 -0
  193. package/dist/public/assets/_C4NK2Cq5.js.br +0 -0
  194. package/dist/public/assets/_CASsRCtt.js.br +0 -0
  195. package/dist/public/assets/_CH4P29Yf2.js.br +0 -0
  196. package/dist/public/assets/_CHqTBuzz2.js.br +0 -0
  197. package/dist/public/assets/_CIeZtXbg2.js.br +0 -0
  198. package/dist/public/assets/_CObQoJCq.js.br +0 -0
  199. package/dist/public/assets/_CQDBqJkT.js.br +0 -0
  200. package/dist/public/assets/_CUqlR7rP.js.br +0 -0
  201. package/dist/public/assets/_CUwAZxRw.js.br +0 -0
  202. package/dist/public/assets/_CbMNS899.js.br +0 -0
  203. package/dist/public/assets/_Cf0wSsqE.js.br +0 -0
  204. package/dist/public/assets/_ClEKr0Tm2.js.br +0 -0
  205. package/dist/public/assets/_CsNJf4g52.js.br +0 -0
  206. package/dist/public/assets/_CtErcdf92.js.br +0 -0
  207. package/dist/public/assets/_DAfu0wMa.js.br +0 -0
  208. package/dist/public/assets/_DBN8F3s1.js.br +0 -0
  209. package/dist/public/assets/_DFOnuGNp.js.br +0 -0
  210. package/dist/public/assets/_DHvVwuPu2.js.br +0 -0
  211. package/dist/public/assets/_DKnLFVdw.js.br +0 -0
  212. package/dist/public/assets/_DLFnXIrG2.js.br +0 -0
  213. package/dist/public/assets/_DLK0WouR.js.br +0 -0
  214. package/dist/public/assets/_DLLEkkcM.js.br +0 -0
  215. package/dist/public/assets/_DOpT45mO.js.br +0 -0
  216. package/dist/public/assets/_DT9Qs1il.js.br +0 -0
  217. package/dist/public/assets/_DVPPxo4e2.js.br +0 -0
  218. package/dist/public/assets/_De7fhQUT.js.br +0 -0
  219. package/dist/public/assets/_DgmBuYFG2.js.br +0 -0
  220. package/dist/public/assets/_DjLQQUoq.js.br +0 -0
  221. package/dist/public/assets/_Dn4wMX5v.js.br +0 -0
  222. package/dist/public/assets/_DsJkMBKU2.js.br +0 -0
  223. package/dist/public/assets/_Ez06j6Qv.js.br +0 -0
  224. package/dist/public/assets/_FCV34uHN.js.br +0 -0
  225. package/dist/public/assets/_I6H6F0ME.js.br +0 -0
  226. package/dist/public/assets/_K6PNL3j4.js.br +0 -0
  227. package/dist/public/assets/_KVpYyL9A.js.br +0 -0
  228. package/dist/public/assets/_KjztUkjx.js.br +0 -0
  229. package/dist/public/assets/_Q6y5EfU1.js.br +0 -0
  230. package/dist/public/assets/_cRLLpjIg.js.br +0 -0
  231. package/dist/public/assets/_kv39JOeM.js.br +0 -0
  232. package/dist/public/assets/_o1of2_lP.js.br +0 -0
  233. package/dist/public/assets/_qoSWRJiT.js.br +0 -0
  234. package/dist/public/assets/_yQJK428k.js.br +0 -0
  235. package/dist/public/assets/diff-view-CQX-Ovnt.css +0 -1
  236. package/dist/public/assets/diff-view-CQX-Ovnt.css.br +0 -0
  237. package/dist/public/assets/index-DR0Bvd6u.css +0 -1
  238. package/dist/public/assets/index-DR0Bvd6u.css.br +0 -0
  239. package/dist/public/assets/index-fCEONff1.js +0 -85
  240. package/dist/public/assets/index-fCEONff1.js.br +0 -0
package/bin/work.mjs CHANGED
@@ -6,7 +6,15 @@
6
6
  // work start run the server in the foreground
7
7
  // work update upgrade the npm package and refresh the service
8
8
  // work usage print agent plan/quota usage
9
+ // work workspaces list workspaces (name, branch, sessions, ports)
10
+ // work workspace [id|name] one workspace: repos, PRs, sessions, procs (default: the current one)
11
+ // work repos [id|name] a workspace's repos with base branch and open PRs
12
+ // work procs [id|name] a workspace's running processes and ports
9
13
  // work version print the installed version
14
+ //
15
+ // The read commands ask the running server (same data as the UI) and take
16
+ // --json for machine-readable output — agents inside a workspace should
17
+ // use them instead of poking at the filesystem or GitHub.
10
18
  import { execFileSync, spawnSync } from "node:child_process";
11
19
  import fs from "node:fs";
12
20
  import os from "node:os";
@@ -37,6 +45,8 @@ const sh = (cmd, args, opts = {}) =>
37
45
 
38
46
  const [, , command = "help", ...args] = process.argv;
39
47
  const yes = args.includes("--yes") || args.includes("-y");
48
+ const jsonOut = args.includes("--json");
49
+ const positional = args.filter((a) => !a.startsWith("-"));
40
50
 
41
51
  switch (command) {
42
52
  case "start":
@@ -54,6 +64,19 @@ switch (command) {
54
64
  case "usage":
55
65
  await usage();
56
66
  break;
67
+ case "workspaces":
68
+ await workspacesCmd();
69
+ break;
70
+ case "workspace":
71
+ case "ws":
72
+ await workspaceCmd();
73
+ break;
74
+ case "repos":
75
+ await reposCmd();
76
+ break;
77
+ case "procs":
78
+ await procsCmd();
79
+ break;
57
80
  case "version":
58
81
  case "--version":
59
82
  case "-v":
@@ -61,7 +84,7 @@ switch (command) {
61
84
  break;
62
85
  default:
63
86
  console.log(
64
- `work ${pkg.version}\n\nusage: work <setup|doctor|start|update|usage|version>`,
87
+ `work ${pkg.version}\n\nusage: work <setup|doctor|start|update|usage|workspaces|workspace|repos|procs|version> [--json]`,
65
88
  );
66
89
  }
67
90
 
@@ -117,6 +140,130 @@ async function usage() {
117
140
  }
118
141
  }
119
142
 
143
+ // -- workspace read commands (HTTP to the running server) --------------------
144
+
145
+ async function apiGet(path) {
146
+ const port = serviceEnv().PORT;
147
+ try {
148
+ const res = await fetch(`http://127.0.0.1:${port}${path}`, { signal: AbortSignal.timeout(30_000) });
149
+ if (!res.ok) die(`server answered ${res.status} for ${path}`);
150
+ return await res.json();
151
+ } catch (err) {
152
+ if (err?.message?.startsWith("server answered")) throw err;
153
+ die(`no work server on port ${port} — start one with: work start`);
154
+ }
155
+ }
156
+
157
+ /**
158
+ * The workspace a command means: an explicit id/name, else the one whose
159
+ * session this shell runs in (`WORK_SESSION_ID`, set on every pane), else
160
+ * the one whose directory contains the cwd. Agents call these from inside
161
+ * a workspace, so no argument is the common case.
162
+ */
163
+ async function resolveWorkspace(arg) {
164
+ const [list, status] = await Promise.all([apiGet("/api/workspaces"), apiGet("/api/status")]);
165
+ let ws;
166
+ if (arg) {
167
+ ws = list.find((w) => w.id === arg || w.name === arg);
168
+ if (!ws) die(`no workspace named ${arg}`);
169
+ } else if (process.env.WORK_SESSION_ID) {
170
+ const sid = process.env.WORK_SESSION_ID;
171
+ ws = list.find((w) => (status[w.id]?.sessions || []).some((s) => s.id === sid));
172
+ }
173
+ if (!ws) {
174
+ // Compare real paths on both sides — /home may be a symlink to /var/home.
175
+ const cwd = fs.realpathSync(process.cwd());
176
+ const real = (p) => {
177
+ try {
178
+ return fs.realpathSync(p);
179
+ } catch {
180
+ return p;
181
+ }
182
+ };
183
+ ws = list.find((w) => {
184
+ const root = real(w.path);
185
+ return cwd === root || cwd.startsWith(root + path.sep);
186
+ });
187
+ }
188
+ if (!ws) die("not inside a workspace — pass its name or id (see: work workspaces)");
189
+ return { ws, status: status[ws.id] || { ports: [], repos: [], sessions: [] } };
190
+ }
191
+
192
+ function pad(s, n) {
193
+ return String(s ?? "").padEnd(n);
194
+ }
195
+
196
+ async function workspacesCmd() {
197
+ const [list, status] = await Promise.all([apiGet("/api/workspaces"), apiGet("/api/status")]);
198
+ const rows = list.map((w) => ({ ...w, ...(status[w.id] || {}) }));
199
+ if (jsonOut) return console.log(JSON.stringify(rows, null, 2));
200
+ if (!rows.length) return console.log("no workspaces — create one in the app");
201
+ const wName = Math.max(4, ...rows.map((w) => w.name.length));
202
+ console.log(`${pad("name", wName)} ${pad("status", 8)} ${pad("branch", 28)} repos agents ports`);
203
+ for (const w of rows) {
204
+ const ports = (w.ports || []).map((p) => `:${p.port}`).join(" ");
205
+ console.log(
206
+ `${pad(w.name, wName)} ${pad(w.status, 8)} ${pad(w.branch, 28)} ${pad(w.repos.length, 5)} ${pad(w.agents ?? 0, 6)} ${ports}`,
207
+ );
208
+ }
209
+ }
210
+
211
+ function prLine(pr) {
212
+ const state = pr.state === "MERGED" ? "merged" : pr.state === "CLOSED" ? "closed" : pr.isDraft ? "draft" : "open";
213
+ return `#${pr.number} ${state} ${pr.title} ${pr.url}`;
214
+ }
215
+
216
+ async function workspaceCmd() {
217
+ const { ws, status } = await resolveWorkspace(positional[0]);
218
+ const procs = await apiGet(`/api/workspaces/${ws.id}/procs`).catch(() => []);
219
+ const [sessions] = await Promise.all([apiGet(`/api/workspaces/${ws.id}/sessions`).catch(() => [])]);
220
+ const out = { ...ws, ports: status.ports, repos: mergeRepos(ws, status), sessions, procs };
221
+ if (jsonOut) return console.log(JSON.stringify(out, null, 2));
222
+ console.log(`${ws.name} (${ws.status})`);
223
+ console.log(` path: ${ws.display_path || ws.path}`);
224
+ console.log(` branch: ${ws.branch}`);
225
+ console.log(` repos:`);
226
+ for (const r of out.repos) {
227
+ console.log(` ${r.worktree}/ ${r.full_name} base:${r.base_branch}`);
228
+ for (const pr of r.prs || []) console.log(` ${prLine(pr)}`);
229
+ }
230
+ if (sessions.length) {
231
+ console.log(` sessions:`);
232
+ for (const s of sessions) {
233
+ const phase = s.state?.phase || (s.state?.alive ? "idle" : "off");
234
+ console.log(` ${pad(s.agent, 10)} ${pad(phase, 8)} ${s.title || ""}`);
235
+ }
236
+ }
237
+ if (procs.length) {
238
+ console.log(` running:`);
239
+ for (const p of procs) console.log(` ${pad(p.pid, 7)} ${p.cmd}${p.ports?.length ? " " + p.ports.map((x) => `:${x}`).join(" ") : ""}`);
240
+ }
241
+ }
242
+
243
+ /** Workspace repos joined with the status snapshot's PRs per repo. */
244
+ function mergeRepos(ws, status) {
245
+ const byName = new Map((status.repos || []).map((r) => [r.full_name, r]));
246
+ return ws.repos.map((r) => ({ ...r, prs: byName.get(r.full_name)?.prs || [] }));
247
+ }
248
+
249
+ async function reposCmd() {
250
+ const { ws, status } = await resolveWorkspace(positional[0]);
251
+ const repos = mergeRepos(ws, status);
252
+ if (jsonOut) return console.log(JSON.stringify(repos, null, 2));
253
+ for (const r of repos) {
254
+ console.log(`${r.worktree}/ ${r.full_name} base:${r.base_branch}${r.default_branch !== r.base_branch ? ` default:${r.default_branch}` : ""}`);
255
+ for (const pr of r.prs) console.log(` ${prLine(pr)}`);
256
+ }
257
+ }
258
+
259
+ async function procsCmd() {
260
+ const { ws } = await resolveWorkspace(positional[0]);
261
+ const procs = await apiGet(`/api/workspaces/${ws.id}/procs`);
262
+ if (jsonOut) return console.log(JSON.stringify(procs, null, 2));
263
+ if (!procs.length) return console.log("nothing running");
264
+ for (const p of procs) console.log(`${pad(p.pid, 7)} ${p.cmd}${p.ports?.length ? " " + p.ports.map((x) => `:${x}`).join(" ") : ""}`);
265
+ }
266
+
120
267
  /** "4h" / "6d" — how long until an ISO timestamp. A reset already in the past
121
268
  * means the window turned over and this row hasn't refreshed since, so there
122
269
  * is no honest countdown to print. */
@@ -0,0 +1,2 @@
1
+ import { f as notifySessionsChanged } from "./_Bi2N56tu.js";
2
+ export { notifySessionsChanged };
@@ -1988,16 +1988,16 @@ var phase = {
1988
1988
  };
1989
1989
  var btnSm = "_z _h";
1990
1990
  var toastKind = {
1991
- error: "_F",
1992
- warn: "_G",
1993
- info: "_H"
1991
+ error: "_H",
1992
+ warn: "_I",
1993
+ info: "_J"
1994
1994
  };
1995
1995
  var toastTitle = {
1996
- error: "_I",
1997
- warn: "_J",
1998
- info: "_K"
1996
+ error: "_K",
1997
+ warn: "_L",
1998
+ info: "_M"
1999
1999
  };
2000
- var toastDismiss = "_O _B";
2000
+ var toastDismiss = "_Q _D";
2001
2001
  //#endregion
2002
2002
  //#region src/tags/toast.marko
2003
2003
  var toast_default = _template("w", (input) => {
@@ -2008,18 +2008,18 @@ var toast_default = _template("w", (input) => {
2008
2008
  const kind = inputKind || "error";
2009
2009
  const placement = inputPlacement || "float";
2010
2010
  const placementClass = {
2011
- float: "_D",
2012
- inline: "_E"
2011
+ float: "_F",
2012
+ inline: "_G"
2013
2013
  }[placement];
2014
2014
  _html(`<div${_attr_class([
2015
- "_C",
2015
+ "_E",
2016
2016
  toastKind[kind],
2017
2017
  placementClass,
2018
2018
  inputClass
2019
2019
  ])} role=${kind === "error" ? "alert" : "status"}${_attrs_partial(htmlInput, {
2020
2020
  class: 1,
2021
2021
  role: 1
2022
- }, "a", $scope0_id, "div")}><div${_attr_class("_L")}>`);
2022
+ }, "a", $scope0_id, "div")}><div${_attr_class("_N")}>`);
2023
2023
  _if(() => {
2024
2024
  if (title) {
2025
2025
  const $scope1_id = _scope_id();
@@ -2031,7 +2031,7 @@ var toast_default = _template("w", (input) => {
2031
2031
  _if(() => {
2032
2032
  if (content) {
2033
2033
  const $scope2_id = _scope_id();
2034
- _html(`<div${_attr_class("_M")}>`);
2034
+ _html(`<div${_attr_class("_O")}>`);
2035
2035
  _dynamic_tag($scope2_id, "b", content, {}, 0, 0, $sg__input_content);
2036
2036
  _html("</div>");
2037
2037
  $si__input_content && writeScope($scope2_id, { _: _scope_with_id($scope0_id) });
@@ -2042,7 +2042,7 @@ var toast_default = _template("w", (input) => {
2042
2042
  _if(() => {
2043
2043
  if (action || onDismiss) {
2044
2044
  const $scope3_id = _scope_id();
2045
- _html(`<div${_attr_class("_N")}>`);
2045
+ _html(`<div${_attr_class("_P")}>`);
2046
2046
  _if(() => {
2047
2047
  if (action) {
2048
2048
  const $scope4_id = _scope_id();
@@ -2210,8 +2210,8 @@ var icon_sidebar_default = _template("R", (input) => {
2210
2210
  });
2211
2211
  _serialize_if($scope0_reason, 0) && writeScope($scope0_id, { a: _existing_scope($childScope) });
2212
2212
  });
2213
- var findInput = "_eD _e";
2214
- var findIconBtn = "_eG _B";
2213
+ var findInput = "_fw _e";
2214
+ var findIconBtn = "_fz _D";
2215
2215
  //#endregion
2216
2216
  //#region src/tags/icons/icon-search.marko
2217
2217
  var icon_search_default = _template("O", (input) => {
@@ -4,9 +4,9 @@ import { t as require_safe_buffer } from "./_BmSjjJ2E.js";
4
4
  import fs from "node:fs";
5
5
  import path from "node:path";
6
6
  import os from "node:os";
7
- import { DatabaseSync } from "node:sqlite";
8
7
  import { execFile } from "node:child_process";
9
8
  import { promisify } from "node:util";
9
+ import { DatabaseSync } from "node:sqlite";
10
10
  //#region src/server/config.ts
11
11
  var home$1 = os.homedir();
12
12
  var config = {
@@ -18,7 +18,6 @@ var config = {
18
18
  },
19
19
  /** Data directory for the sqlite db and other server state. */
20
20
  dataDir: process.env.WORK_DATA_DIR || path.join(process.env.XDG_DATA_HOME || path.join(home$1, ".local", "share"), "work"),
21
- gitHost: "github.com",
22
21
  user: process.env.WORK_USER || os.userInfo().username,
23
22
  host: process.env.WORK_HOST || os.hostname().split(".")[0],
24
23
  /** Prefix every workspace branch starts with. Tooling finds a workspace's PRs
@@ -33,6 +32,31 @@ var config = {
33
32
  };
34
33
  fs.mkdirSync(config.dataDir, { recursive: true });
35
34
  //#endregion
35
+ //#region src/server/exec.ts
36
+ /** Dedicated tmux server so we never touch another multiplexer's or the
37
+ * user's default tmux. */
38
+ var TMUX_SOCKET = "work";
39
+ var execFileAsync = promisify(execFile);
40
+ async function run$1(cmd, args, cwd, env) {
41
+ const { stdout } = await execFileAsync(cmd, args, {
42
+ cwd,
43
+ env,
44
+ maxBuffer: 67108864
45
+ });
46
+ return stdout.trim();
47
+ }
48
+ var git = (args, cwd) => run$1("git", args, cwd);
49
+ /** `gh` against one GitHub host — `GH_HOST` picks the stored credential. */
50
+ var gh = (args, host) => run$1("gh", args, void 0, host ? {
51
+ ...process.env,
52
+ GH_HOST: host
53
+ } : void 0);
54
+ var tmux = (args, env) => run$1("tmux", [
55
+ "-L",
56
+ TMUX_SOCKET,
57
+ ...args
58
+ ], void 0, env);
59
+ //#endregion
36
60
  //#region src/server/db.ts
37
61
  var db = new DatabaseSync(path.join(config.dataDir, "work.db"));
38
62
  db.exec("PRAGMA busy_timeout = 5000");
@@ -111,59 +135,6 @@ db.exec(`
111
135
  );
112
136
  `);
113
137
  //#endregion
114
- //#region src/server/events.ts
115
- var listeners = /* @__PURE__ */ new Set();
116
- function publish(type, data) {
117
- const event = {
118
- type,
119
- data
120
- };
121
- for (const listener of [...listeners]) try {
122
- listener(event);
123
- } catch (err) {
124
- console.error("[work] event listener error", err);
125
- }
126
- }
127
- var joins = 0;
128
- function subscribe(listener) {
129
- listeners.add(listener);
130
- joins++;
131
- return () => listeners.delete(listener);
132
- }
133
- /** Count of subscriptions ever made. A watcher that publishes only what
134
- * changed has to send everything to a listener that was not there for the
135
- * earlier ones — including a reconnect, which arrives here as a new
136
- * subscription and would otherwise sit on whatever it missed. */
137
- function subscriberJoins() {
138
- return joins;
139
- }
140
- /** Connected SSE clients — lets background watchers idle when no one
141
- * is listening. */
142
- function subscriberCount() {
143
- return listeners.size;
144
- }
145
- //#endregion
146
- //#region src/server/exec.ts
147
- /** Dedicated tmux server so we never touch another multiplexer's or the
148
- * user's default tmux. */
149
- var TMUX_SOCKET = "work";
150
- var execFileAsync = promisify(execFile);
151
- async function run$1(cmd, args, cwd, env) {
152
- const { stdout } = await execFileAsync(cmd, args, {
153
- cwd,
154
- env,
155
- maxBuffer: 67108864
156
- });
157
- return stdout.trim();
158
- }
159
- var git = (args, cwd) => run$1("git", args, cwd);
160
- var gh = (args) => run$1("gh", args);
161
- var tmux = (args, env) => run$1("tmux", [
162
- "-L",
163
- TMUX_SOCKET,
164
- ...args
165
- ], void 0, env);
166
- //#endregion
167
138
  //#region lib/setup/catalog.mjs
168
139
  /** Machine tools. `required` ones gate readiness; the rest are the utilities
169
140
  * agents reach for constantly (mirrors DylanPiercey/start). Static binaries via
@@ -606,6 +577,38 @@ function preferredAgent() {
606
577
  return enabled.find((id) => id !== "shell") || stored || "claude";
607
578
  }
608
579
  //#endregion
580
+ //#region src/server/events.ts
581
+ var listeners = /* @__PURE__ */ new Set();
582
+ function publish(type, data) {
583
+ const event = {
584
+ type,
585
+ data
586
+ };
587
+ for (const listener of [...listeners]) try {
588
+ listener(event);
589
+ } catch (err) {
590
+ console.error("[work] event listener error", err);
591
+ }
592
+ }
593
+ var joins = 0;
594
+ function subscribe(listener) {
595
+ listeners.add(listener);
596
+ joins++;
597
+ return () => listeners.delete(listener);
598
+ }
599
+ /** Count of subscriptions ever made. A watcher that publishes only what
600
+ * changed has to send everything to a listener that was not there for the
601
+ * earlier ones — including a reconnect, which arrives here as a new
602
+ * subscription and would otherwise sit on whatever it missed. */
603
+ function subscriberJoins() {
604
+ return joins;
605
+ }
606
+ /** Connected SSE clients — lets background watchers idle when no one
607
+ * is listening. */
608
+ function subscriberCount() {
609
+ return listeners.size;
610
+ }
611
+ //#endregion
609
612
  //#region node_modules/.pnpm/bn.js@4.12.5/node_modules/bn.js/lib/bn.js
610
613
  var require_bn = /* @__PURE__ */ __commonJSMin(((exports, module) => {
611
614
  (function(module$1, exports$2) {
@@ -6425,7 +6428,7 @@ function publishChange(sessionId) {
6425
6428
  const row = get("SELECT workspace_id FROM sessions WHERE id = ?", sessionId);
6426
6429
  if (row?.workspace_id) {
6427
6430
  const workspaceId = row.workspace_id;
6428
- import("./_DjrRGy4k.js").then((m) => m.notifySessionsChanged(workspaceId));
6431
+ import("./_B1U5NJd1.js").then((m) => m.notifySessionsChanged(workspaceId));
6429
6432
  return;
6430
6433
  }
6431
6434
  publish("sessions.changed");
@@ -6826,4 +6829,4 @@ function sleep(ms) {
6826
6829
  return new Promise((resolve) => setTimeout(resolve, ms));
6827
6830
  }
6828
6831
  //#endregion
6829
- export { all as $, allPrefs as A, which as B, setScrapedPhase as C, pushPublicKey as D, deleteSubscription as E, setPref as F, gh as G, agentById as H, setSetting as I, tmux as J, git as K, doctor as L, enabledAgents as M, preferredAgent as N, saveSubscription as O, setDisabledAgents as P, subscriberJoins as Q, miseVersions as R, setAgentPhase as S, summaryFromHookPayload as T, toolById as U, TOOLS as V, TMUX_SOCKET as W, subscribe as X, publish as Y, subscriberCount as Z, tmuxName as _, ensureTmuxServer as a, clearAgentPhase as b, killWorkspaceSessions as c, newSessionArgs as d, db as et, notifySessionsChanged as f, sessionStates as g, sendToSession as h, disposeSessions as i, disabledAgents as j, agentChoices as k, listSessions as l, renameSession as m, clearTmuxStarted as n, workspacePath as nt, getSession as o, panePids as p, run$1 as q, createSession as r, config as rt, killSession as s, cleanEnv as t, get as tt, markTmuxStarted as u, tmuxWasStarted as v, setSessionViewers as w, reasonFromHookPayload as x, reportsWorking as y, setupPath as z };
6832
+ export { get as $, subscribe as A, setPref as B, setScrapedPhase as C, pushPublicKey as D, deleteSubscription as E, disabledAgents as F, setupPath as G, doctor as H, enabledAgents as I, TOOLS as J, which as K, getSetting as L, subscriberJoins as M, agentChoices as N, saveSubscription as O, allPrefs as P, db as Q, preferredAgent as R, setAgentPhase as S, summaryFromHookPayload as T, ghKnownHosts as U, setSetting as V, miseVersions as W, toolById as X, agentById as Y, all as Z, tmuxName as _, ensureTmuxServer as a, tmux as at, clearAgentPhase as b, killWorkspaceSessions as c, newSessionArgs as d, workspacePath as et, notifySessionsChanged as f, sessionStates as g, sendToSession as h, disposeSessions as i, run$1 as it, subscriberCount as j, publish as k, listSessions as l, renameSession as m, clearTmuxStarted as n, gh as nt, getSession as o, config as ot, panePids as p, DEFAULT_GITHUB_HOST as q, createSession as r, git as rt, killSession as s, cleanEnv as t, TMUX_SOCKET as tt, markTmuxStarted as u, tmuxWasStarted as v, setSessionViewers as w, reasonFromHookPayload as x, reportsWorking as y, setDisabledAgents as z };