@dylanpiercey/work 0.0.222 → 0.1.0

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 (547) hide show
  1. package/README.md +9 -31
  2. package/bin/work.mjs +121 -122
  3. package/dist/{_DNhDGBkH.js → _Bq7to522.js} +544 -254
  4. package/dist/_CkwTsHKB.js +2 -0
  5. package/dist/index.mjs +2813 -3240
  6. package/dist/public/assets/_1RHVsAcK.js +1 -0
  7. package/dist/public/assets/_4CShjaLP.js +1 -0
  8. package/dist/public/assets/_68JtNDO1.js +1 -0
  9. package/dist/public/assets/{_CtQ-4c6a.js → _8G2Mv7jG.js} +1 -1
  10. package/dist/public/assets/_8G2Mv7jG.js.br +0 -0
  11. package/dist/public/assets/{_DYBhy6q4.js → _8dvK2NDJ.js} +1 -1
  12. package/dist/public/assets/_8dvK2NDJ.js.br +0 -0
  13. package/dist/public/assets/_94L2SIJF.js +1 -0
  14. package/dist/public/assets/_9AnDb3YH.js +1 -0
  15. package/dist/public/assets/{_BJk5sqrB.js → _9kX9D09B.js} +1 -1
  16. package/dist/public/assets/_9kX9D09B.js.br +0 -0
  17. package/dist/public/assets/_9lErVegn.js +1 -0
  18. package/dist/public/assets/_B0oyGUU5.js +1 -0
  19. package/dist/public/assets/_B0oyGUU5.js.br +0 -0
  20. package/dist/public/assets/_B1mPnLlp.js +1 -0
  21. package/dist/public/assets/_B4fi2SSA.js +1 -0
  22. package/dist/public/assets/{_OZcBKgKS.js → _B582D2rg.js} +1 -1
  23. package/dist/public/assets/{_DYm1j3HZ.js → _B7GwDeKK.js} +1 -1
  24. package/dist/public/assets/_B7Qx25UP.js +1 -0
  25. package/dist/public/assets/_B7b8EVjA.js +1 -0
  26. package/dist/public/assets/{_Cp1dT7ox.js → _BBWaxDkO.js} +1 -1
  27. package/dist/public/assets/_BBWaxDkO.js.br +0 -0
  28. package/dist/public/assets/{_BYHfXvmU.js → _BDa-iwuj.js} +1 -1
  29. package/dist/public/assets/_BDa-iwuj.js.br +0 -0
  30. package/dist/public/assets/_BEKHKNmM.js +1 -0
  31. package/dist/public/assets/{_BHkMvOuI.js → _BE_Jyvqd.js} +1 -1
  32. package/dist/public/assets/_BE_Jyvqd.js.br +0 -0
  33. package/dist/public/assets/_BFU-kJkk.js +1 -0
  34. package/dist/public/assets/_BGCK5I_O.js +1 -0
  35. package/dist/public/assets/_BGCK5I_O.js.br +0 -0
  36. package/dist/public/assets/_BIJ2O2oU.js +1 -0
  37. package/dist/public/assets/_BJ59XAZ9.js +1 -0
  38. package/dist/public/assets/_BKqRYfOI.js +15 -0
  39. package/dist/public/assets/_BKqRYfOI.js.br +0 -0
  40. package/dist/public/assets/_BKr9Dzz1.js +1 -0
  41. package/dist/public/assets/_BN7xvxS_.js +1 -0
  42. package/dist/public/assets/_BNQTVBlH.js +1 -0
  43. package/dist/public/assets/{_DFiA_pht.js → _BNW5Jiec.js} +1 -1
  44. package/dist/public/assets/_BNW5Jiec.js.br +0 -0
  45. package/dist/public/assets/{_DW6AnxDW.js → _BOGkzMx9.js} +1 -1
  46. package/dist/public/assets/_BOGkzMx9.js.br +0 -0
  47. package/dist/public/assets/_BUEpqQ_m.js +1 -0
  48. package/dist/public/assets/{_BJIAaIh4.js → _BUvqweu0.js} +1 -1
  49. package/dist/public/assets/_BUvqweu0.js.br +0 -0
  50. package/dist/public/assets/_BZKB4fhr.js +1 -0
  51. package/dist/public/assets/_BZKB4fhr.js.br +0 -0
  52. package/dist/public/assets/_BZo9BjDF.js +1 -0
  53. package/dist/public/assets/{_4KGVbuYs.js → _BbbOvNRH.js} +1 -1
  54. package/dist/public/assets/_BbbOvNRH.js.br +0 -0
  55. package/dist/public/assets/_BdUNnSlC.js +1 -0
  56. package/dist/public/assets/{_KM7EGl2R.js → _Bf8WYPfh.js} +1 -1
  57. package/dist/public/assets/_Bf8WYPfh.js.br +0 -0
  58. package/dist/public/assets/{_buuWf96L.js → _Bhx319Hi.js} +1 -1
  59. package/dist/public/assets/_Bhx319Hi.js.br +0 -0
  60. package/dist/public/assets/{_BYgxEDpq.js → _Bm4SHrNp.js} +1 -1
  61. package/dist/public/assets/_Bm4SHrNp.js.br +0 -0
  62. package/dist/public/assets/_Bmrqq8Ro.js +2 -0
  63. package/dist/public/assets/_Bmrqq8Ro.js.br +0 -0
  64. package/dist/public/assets/_BnHZ6Npj.js +1 -0
  65. package/dist/public/assets/{_NGfZeYAt.js → _BoDxRJLS.js} +1 -1
  66. package/dist/public/assets/_BoDxRJLS.js.br +0 -0
  67. package/dist/public/assets/_Bo_Ru664.js +1 -0
  68. package/dist/public/assets/{_BxpaVKca.js → _Bp8-V8yl.js} +1 -1
  69. package/dist/public/assets/_Bp8-V8yl.js.br +0 -0
  70. package/dist/public/assets/{_Ct2VbISZ.js → _BpoeUr5j.js} +1 -1
  71. package/dist/public/assets/_BpoeUr5j.js.br +0 -0
  72. package/dist/public/assets/_Bq2G_Tid.js +1 -0
  73. package/dist/public/assets/_BsyoLB_D.js +1 -0
  74. package/dist/public/assets/{_CdWPIocC.js → _Bv3e3rg8.js} +1 -1
  75. package/dist/public/assets/_Bv3e3rg8.js.br +0 -0
  76. package/dist/public/assets/{_D74J3kwJ.js → _Bv3qNE1b.js} +1 -1
  77. package/dist/public/assets/{_BSliyqkf.js → _BvXp6HpX.js} +1 -1
  78. package/dist/public/assets/_BvXp6HpX.js.br +0 -0
  79. package/dist/public/assets/{_DNqoI_cd.js → _BwP07uVS.js} +1 -1
  80. package/dist/public/assets/_BwP07uVS.js.br +0 -0
  81. package/dist/public/assets/{_D93v6VDe.js → _Bx1CW-sF.js} +1 -1
  82. package/dist/public/assets/_Bx1CW-sF.js.br +0 -0
  83. package/dist/public/assets/{_DZLJGzpN.js → _BywcP-As.js} +1 -1
  84. package/dist/public/assets/_BywcP-As.js.br +0 -0
  85. package/dist/public/assets/_Bzgtwt3G.js +1 -0
  86. package/dist/public/assets/_Bzgtwt3G.js.br +0 -0
  87. package/dist/public/assets/{_U2n8Yyqy.js → _C0_s45qg.js} +1 -1
  88. package/dist/public/assets/_C0_s45qg.js.br +0 -0
  89. package/dist/public/assets/_C0ePgF6b.js +1 -0
  90. package/dist/public/assets/_C0oVtTqO.js +1 -0
  91. package/dist/public/assets/_C0oVtTqO.js.br +0 -0
  92. package/dist/public/assets/{_TxnhYSE5.js → _C654p96Z.js} +1 -1
  93. package/dist/public/assets/_C654p96Z.js.br +0 -0
  94. package/dist/public/assets/_C8_1Y2-z.js +1 -0
  95. package/dist/public/assets/_C8_1Y2-z.js.br +0 -0
  96. package/dist/public/assets/_C8v1AZFP.js +1 -0
  97. package/dist/public/assets/{_Dns259C4.js → _CAkPJLeF.js} +1 -1
  98. package/dist/public/assets/{_Dns259C4.js.br → _CAkPJLeF.js.br} +0 -0
  99. package/dist/public/assets/_CB0D5cRH.js +1 -0
  100. package/dist/public/assets/_CD05JUTh.js +1 -0
  101. package/dist/public/assets/{_BIul3uoC.js → _CEJUcePr.js} +1 -1
  102. package/dist/public/assets/_CEJUcePr.js.br +0 -0
  103. package/dist/public/assets/{_CN5iw4cA.js → _CEXHZd73.js} +1 -1
  104. package/dist/public/assets/_CEXHZd73.js.br +0 -0
  105. package/dist/public/assets/_CHcUMVR7.js +1 -0
  106. package/dist/public/assets/{_Dtx2usNe.js → _CHuLFr1f.js} +1 -1
  107. package/dist/public/assets/_CHuLFr1f.js.br +0 -0
  108. package/dist/public/assets/{_9xYWGqfi.js → _CIb7xw_1.js} +1 -1
  109. package/dist/public/assets/_CIb7xw_1.js.br +0 -0
  110. package/dist/public/assets/{_C1JRCVnT.js → _CMSBfO6u.js} +1 -1
  111. package/dist/public/assets/_CMSBfO6u.js.br +0 -0
  112. package/dist/public/assets/_CN7GPyBo.js +1 -0
  113. package/dist/public/assets/{_Cnl5owe1.js → _COcePo2y.js} +1 -1
  114. package/dist/public/assets/_COcePo2y.js.br +0 -0
  115. package/dist/public/assets/{_B7nG9Ktb.js → _CTINBWaG.js} +1 -1
  116. package/dist/public/assets/_CTINBWaG.js.br +0 -0
  117. package/dist/public/assets/_CTWrnAbz.js +1 -0
  118. package/dist/public/assets/{_CKwCTsbp.js → _CUXajOKj.js} +1 -1
  119. package/dist/public/assets/_CUXajOKj.js.br +0 -0
  120. package/dist/public/assets/{_BY6ayWBy.js → _CVru3vzC.js} +1 -1
  121. package/dist/public/assets/{_cSsv1ZjH.js → _CYjE__ml.js} +1 -1
  122. package/dist/public/assets/_CYjE__ml.js.br +0 -0
  123. package/dist/public/assets/{_BlSF31Ck.js → _CZ_OWtIT.js} +1 -1
  124. package/dist/public/assets/_CZ_OWtIT.js.br +0 -0
  125. package/dist/public/assets/{_CrV4JiE4.js → _C_37_B6u.js} +1 -1
  126. package/dist/public/assets/_C_37_B6u.js.br +0 -0
  127. package/dist/public/assets/_C_CIQL7J.js +1 -0
  128. package/dist/public/assets/_C_CIQL7J.js.br +0 -0
  129. package/dist/public/assets/_C_WdpYbK.js +1 -0
  130. package/dist/public/assets/_CaiH3VN9.js +1 -0
  131. package/dist/public/assets/{_BXU-ZvQb.js → _CamWDaoG.js} +1 -1
  132. package/dist/public/assets/_CamWDaoG.js.br +0 -0
  133. package/dist/public/assets/_CdDElA0V.js +1 -0
  134. package/dist/public/assets/_CfnsClzZ.js +1 -0
  135. package/dist/public/assets/_Cgo1fRhJ.js +1 -0
  136. package/dist/public/assets/_Cgo1fRhJ.js.br +0 -0
  137. package/dist/public/assets/_CjhGrlf3.js +1 -0
  138. package/dist/public/assets/_CjlbL4C_.js +1 -0
  139. package/dist/public/assets/_CjogTUXK.js +1 -0
  140. package/dist/public/assets/{_BS0AEB1V.js → _ClldMY37.js} +1 -1
  141. package/dist/public/assets/_ClldMY37.js.br +0 -0
  142. package/dist/public/assets/_CmFq6Gtp.js +1 -0
  143. package/dist/public/assets/_CoAPOKiP.js +1 -0
  144. package/dist/public/assets/_CoUUgh9P.js +1 -0
  145. package/dist/public/assets/{_BDCQoRmq.js → _CpjSCB1I.js} +1 -1
  146. package/dist/public/assets/_CpjSCB1I.js.br +0 -0
  147. package/dist/public/assets/{_CEvca0JK.js → _Ct3RF80L.js} +1 -1
  148. package/dist/public/assets/_Ct3RF80L.js.br +0 -0
  149. package/dist/public/assets/_CtYy5eZs.js +1 -0
  150. package/dist/public/assets/{_DvqvHR7_.js → _CxAPL49a.js} +1 -1
  151. package/dist/public/assets/_CxAPL49a.js.br +0 -0
  152. package/dist/public/assets/{_D_joWBEC.js → _CyBCIknf.js} +1 -1
  153. package/dist/public/assets/_CyBCIknf.js.br +0 -0
  154. package/dist/public/assets/{_KpWeECPp.js → _Cz5BPBG8.js} +1 -1
  155. package/dist/public/assets/_Cz5BPBG8.js.br +0 -0
  156. package/dist/public/assets/_D-eEFXaI.js +1 -0
  157. package/dist/public/assets/{_DPIQzOUl.js → _D0aoEFRx.js} +1 -1
  158. package/dist/public/assets/_D0aoEFRx.js.br +0 -0
  159. package/dist/public/assets/{_CluEtmrQ.js → _D1uRW1qz.js} +1 -1
  160. package/dist/public/assets/_D1uRW1qz.js.br +0 -0
  161. package/dist/public/assets/_D2oIr2T2.js +1 -0
  162. package/dist/public/assets/{_Bpf0Nyqk.js → _D2un443j.js} +1 -1
  163. package/dist/public/assets/_D2un443j.js.br +0 -0
  164. package/dist/public/assets/_D3MPx4-f.js +1 -0
  165. package/dist/public/assets/{_B-992FUw.js → _D4dJ2qEE.js} +1 -1
  166. package/dist/public/assets/{_CB-I9KUl.js → _D4q8XSMI.js} +1 -1
  167. package/dist/public/assets/_D4q8XSMI.js.br +0 -0
  168. package/dist/public/assets/{_BNPo3NaH.js → _D4quFMVQ.js} +1 -1
  169. package/dist/public/assets/_D4quFMVQ.js.br +0 -0
  170. package/dist/public/assets/{_6FNzwUcm.js → _D4rOX-Fa.js} +1 -1
  171. package/dist/public/assets/_D4rOX-Fa.js.br +0 -0
  172. package/dist/public/assets/_D5edrSyA.js +1 -0
  173. package/dist/public/assets/{_DJnXBrlD.js → _D6kktUFn.js} +1 -1
  174. package/dist/public/assets/_D6kktUFn.js.br +0 -0
  175. package/dist/public/assets/_D80-qtVY.js +1 -0
  176. package/dist/public/assets/_D9-3EVA4.js +1 -0
  177. package/dist/public/assets/{_Ca3bfNZI.js → _D9sS4J_w.js} +1 -1
  178. package/dist/public/assets/_D9sS4J_w.js.br +0 -0
  179. package/dist/public/assets/_DBLpxTDi.js +1 -0
  180. package/dist/public/assets/{_gP9nLV2Y.js → _DByHQ7nW.js} +117 -117
  181. package/dist/public/assets/_DByHQ7nW.js.br +0 -0
  182. package/dist/public/assets/{_C-oO7X9P.js → _DC-78WeM.js} +1 -1
  183. package/dist/public/assets/_DC-78WeM.js.br +0 -0
  184. package/dist/public/assets/{_SHB9zmh2.js → _DDl8KSWJ.js} +1 -1
  185. package/dist/public/assets/_DDl8KSWJ.js.br +0 -0
  186. package/dist/public/assets/{_CPMD0qdL.js → _DFWOMF-B.js} +1 -1
  187. package/dist/public/assets/_DFWOMF-B.js.br +0 -0
  188. package/dist/public/assets/_DKb-rt9n.js +1 -0
  189. package/dist/public/assets/_DMnSJCF_.js +1 -0
  190. package/dist/public/assets/_DOOIlrPh.js +1 -0
  191. package/dist/public/assets/_DPW-0yKP.js +1 -0
  192. package/dist/public/assets/_DR3BmvWU.js +1 -0
  193. package/dist/public/assets/{_BpLwQ1O8.js → _DSVLaMWS.js} +1 -1
  194. package/dist/public/assets/_DSVLaMWS.js.br +0 -0
  195. package/dist/public/assets/_DYNGNKLk.js +1 -0
  196. package/dist/public/assets/_DZnEgCbj.js +1 -0
  197. package/dist/public/assets/{_CgsPFJZy.js → _DaMVRI8f.js} +1 -1
  198. package/dist/public/assets/_DaMVRI8f.js.br +0 -0
  199. package/dist/public/assets/_DbvaGqOl.js +1 -0
  200. package/dist/public/assets/_DbvaGqOl.js.br +0 -0
  201. package/dist/public/assets/{_ItervcuA.js → _DcMIlvz-.js} +1 -1
  202. package/dist/public/assets/_DcMIlvz-.js.br +0 -0
  203. package/dist/public/assets/{_D5yRmwZD.js → _Dd6X3e7w.js} +1 -1
  204. package/dist/public/assets/_Dd6X3e7w.js.br +0 -0
  205. package/dist/public/assets/{_BxAKVWw-.js → _De7P3jUH.js} +1 -1
  206. package/dist/public/assets/_De7P3jUH.js.br +0 -0
  207. package/dist/public/assets/_DeiFEAar.js +1 -0
  208. package/dist/public/assets/{_tqD_68em.js → _DfI982PI.js} +1 -1
  209. package/dist/public/assets/_DfI982PI.js.br +0 -0
  210. package/dist/public/assets/_DfZ6emcw.js +1 -0
  211. package/dist/public/assets/{_M94yp4jo.js → _Dj1lZ1pa.js} +12 -12
  212. package/dist/public/assets/_Dj1lZ1pa.js.br +0 -0
  213. package/dist/public/assets/{_BCTeDxHC.js → _DkCaEf_h.js} +1 -1
  214. package/dist/public/assets/_DkCaEf_h.js.br +0 -0
  215. package/dist/public/assets/_DonAis0J.js +1 -0
  216. package/dist/public/assets/{_DktieTrd.js → _Dp3IZdH8.js} +1 -1
  217. package/dist/public/assets/_Dp3IZdH8.js.br +0 -0
  218. package/dist/public/assets/_DqYih4xk.js +1 -0
  219. package/dist/public/assets/_DqYih4xk.js.br +0 -0
  220. package/dist/public/assets/{_B9Ukk65G.js → _DqhphdU4.js} +1 -1
  221. package/dist/public/assets/_DqhphdU4.js.br +0 -0
  222. package/dist/public/assets/{_DLJu1hcD.js → _DrIgZJzN.js} +1 -1
  223. package/dist/public/assets/_DrIgZJzN.js.br +0 -0
  224. package/dist/public/assets/_Dt4hHR05.js +1 -0
  225. package/dist/public/assets/_DtTbTraA.js +1 -0
  226. package/dist/public/assets/_DwMxAJKP.js +1 -0
  227. package/dist/public/assets/{_LgS0G0uH.js → _DxEm-Gwj.js} +1 -1
  228. package/dist/public/assets/_DxEm-Gwj.js.br +0 -0
  229. package/dist/public/assets/{_C4KQv1VW.js → _Dytf99zx.js} +1 -1
  230. package/dist/public/assets/_Dytf99zx.js.br +0 -0
  231. package/dist/public/assets/_EAgv5jR9.js +1 -0
  232. package/dist/public/assets/_Iecpd0kS.js +1 -0
  233. package/dist/public/assets/_Iecpd0kS.js.br +0 -0
  234. package/dist/public/assets/{_QlXMW-cP.js → _MCwIJAuJ.js} +1 -1
  235. package/dist/public/assets/_MCwIJAuJ.js.br +0 -0
  236. package/dist/public/assets/_NM79Lu3L.js +6 -0
  237. package/dist/public/assets/_NM79Lu3L.js.br +0 -0
  238. package/dist/public/assets/_QpNKKuS9.js +1 -0
  239. package/dist/public/assets/{_B29iioj9.js → _SGDxiwE1.js} +1 -1
  240. package/dist/public/assets/_SGDxiwE1.js.br +0 -0
  241. package/dist/public/assets/_TA8pE7z9.js +1 -0
  242. package/dist/public/assets/_bE4sNDeU.js +1 -0
  243. package/dist/public/assets/{_Bk_g_9Bn.js → _bcsuBP7T.js} +1 -1
  244. package/dist/public/assets/_bcsuBP7T.js.br +0 -0
  245. package/dist/public/assets/_cdcAU4yY.js +1 -0
  246. package/dist/public/assets/{_aAORMS0u.js → _ch_yXAap.js} +1 -1
  247. package/dist/public/assets/_ch_yXAap.js.br +0 -0
  248. package/dist/public/assets/{_ByqDCoAZ.js → _d5u7EI97.js} +1 -1
  249. package/dist/public/assets/_d5u7EI97.js.br +0 -0
  250. package/dist/public/assets/{_i6oi77xC.js → _eoa1EOU-.js} +1 -1
  251. package/dist/public/assets/_eoa1EOU-.js.br +0 -0
  252. package/dist/public/assets/{_H7TtilBa.js → _j2tDSMvo.js} +1 -1
  253. package/dist/public/assets/_j2tDSMvo.js.br +0 -0
  254. package/dist/public/assets/_jNhIFgbc.js +1 -0
  255. package/dist/public/assets/_kDYiTaag.js +1 -0
  256. package/dist/public/assets/_lNMVVbUx.js +1 -0
  257. package/dist/public/assets/_nwJ7Hu3S.js +1 -0
  258. package/dist/public/assets/_tmDtUACa.js +1 -0
  259. package/dist/public/assets/_tmDtUACa.js.br +0 -0
  260. package/dist/public/assets/_wXDh-Z2N.js +1 -0
  261. package/dist/public/assets/_wXDh-Z2N.js.br +0 -0
  262. package/dist/public/assets/{_C3E24F_T.js → _wcshV0sZ.js} +1 -1
  263. package/dist/public/assets/_wcshV0sZ.js.br +0 -0
  264. package/dist/public/assets/_x-NwqgCn.js +1 -0
  265. package/dist/public/assets/{_DZD7yzH2.js → _xyw_DS5P.js} +1 -1
  266. package/dist/public/assets/_xyw_DS5P.js.br +0 -0
  267. package/dist/public/assets/{_CsicaM6z.js → _zSAfqXcm.js} +1 -1
  268. package/dist/public/assets/_zSAfqXcm.js.br +0 -0
  269. package/dist/public/assets/app-shell-ChQoVC5b.css +1 -0
  270. package/dist/public/assets/app-shell-ChQoVC5b.css.br +0 -0
  271. package/dist/public/assets/files-view-CLtLp_BW.js +2 -0
  272. package/dist/public/assets/files-view-CNHQapdI.css +1 -0
  273. package/dist/public/assets/files-view-CNHQapdI.css.br +0 -0
  274. package/dist/public/assets/group.css.ts-BG82htKb.css +1 -0
  275. package/dist/public/assets/group.css.ts-BG82htKb.css.br +0 -0
  276. package/dist/public/assets/icon-folder-DJOHuEpD.css +1 -0
  277. package/dist/public/assets/icon-folder-DJOHuEpD.css.br +0 -0
  278. package/dist/public/assets/{icon-search-C6A4IBPq.css → icon-search-DsJuFXUJ.css} +1 -1
  279. package/dist/public/assets/icon-search-DsJuFXUJ.css.br +0 -0
  280. package/dist/public/assets/manage-workspace-NBcFDyrB.js +2 -0
  281. package/dist/public/assets/manage-workspace-f_Np32TD.css +1 -0
  282. package/dist/public/assets/{modal-view-BY2E8mw2.css → modal-view-KVNBpNYi.css} +1 -1
  283. package/dist/public/assets/modal-view-KVNBpNYi.css.br +0 -0
  284. package/dist/public/assets/new-DHI77GvL.js +1 -0
  285. package/dist/public/assets/new-workspace-BFE-HpD_.css +1 -0
  286. package/dist/public/assets/new-workspace-BFE-HpD_.css.br +0 -0
  287. package/dist/public/assets/new-workspace-BRzimdd5.js +2 -0
  288. package/dist/public/assets/port-chip-CUUIDOVM.css +1 -0
  289. package/dist/public/assets/port-chip-CUUIDOVM.css.br +0 -0
  290. package/dist/public/assets/prompt-dialog-BGs6RXOV.css +1 -0
  291. package/dist/public/assets/prompt-dialog-BGs6RXOV.css.br +0 -0
  292. package/dist/public/assets/quick-open-Gx4so1bl.css +1 -0
  293. package/dist/public/assets/quick-open-Gx4so1bl.css.br +0 -0
  294. package/dist/public/assets/repo-picker-CUhd0vJN.css +1 -0
  295. package/dist/public/assets/repo-picker-CUhd0vJN.css.br +4 -0
  296. package/dist/public/assets/review-view-DFEK9VBa.js +2 -0
  297. package/dist/public/assets/review-view-deUY3OE5.css +1 -0
  298. package/dist/public/assets/review-view-deUY3OE5.css.br +0 -0
  299. package/dist/public/assets/section-CziSOSBR.css +1 -0
  300. package/dist/public/assets/section-CziSOSBR.css.br +0 -0
  301. package/dist/public/assets/settings-DHI77GvL.js +1 -0
  302. package/dist/public/assets/settings-page-OOtPOzIn.js +2 -0
  303. package/dist/public/assets/settings-page-wZhd7FLi.css +1 -0
  304. package/dist/public/assets/settings-page-wZhd7FLi.css.br +0 -0
  305. package/dist/public/assets/skill-row-BoCyFIXg.css +1 -0
  306. package/dist/public/assets/sso-auth-DV76tTpE.css +1 -0
  307. package/dist/public/assets/sso-auth-DV76tTpE.css.br +0 -0
  308. package/dist/public/assets/w-DHI77GvL.js +1 -0
  309. package/dist/public/assets/w._-DHI77GvL.js +1 -0
  310. package/dist/public/assets/w._-DsTgq3-C.js +1 -0
  311. package/dist/public/assets/w._-igEOSPR-.js +1 -0
  312. package/install.sh +1 -1
  313. package/lib/review/markdown.mjs +5 -5
  314. package/lib/setup/bridge.d.mts +10 -0
  315. package/lib/setup/bridge.mjs +84 -0
  316. package/lib/setup/catalog.d.mts +3 -0
  317. package/lib/setup/catalog.mjs +17 -0
  318. package/lib/setup/doctor.d.mts +6 -0
  319. package/lib/setup/doctor.mjs +50 -5
  320. package/lib/setup/install.d.mts +1 -0
  321. package/lib/setup/install.mjs +21 -1
  322. package/lib/setup/listen.mjs +2 -2
  323. package/lib/share/manifest.mjs +3 -2
  324. package/package.json +4 -5
  325. package/dist/_u9qRCTjI.js +0 -2
  326. package/dist/public/assets/_43qHqm_h.js +0 -1
  327. package/dist/public/assets/_4KGVbuYs.js.br +0 -0
  328. package/dist/public/assets/_4hbCil9D.js +0 -1
  329. package/dist/public/assets/_4hbCil9D.js.br +0 -0
  330. package/dist/public/assets/_69GBvJfT.js +0 -1
  331. package/dist/public/assets/_6FNzwUcm.js.br +0 -0
  332. package/dist/public/assets/_8SWI_CIk.js +0 -1
  333. package/dist/public/assets/_8SWI_CIk.js.br +0 -0
  334. package/dist/public/assets/_9fKCaxLn.js +0 -1
  335. package/dist/public/assets/_9xYWGqfi.js.br +0 -0
  336. package/dist/public/assets/_AKwHRUw2.js +0 -1
  337. package/dist/public/assets/_B29iioj9.js.br +0 -0
  338. package/dist/public/assets/_B3bcGOWb.js +0 -1
  339. package/dist/public/assets/_B3fa8s0p.js +0 -1
  340. package/dist/public/assets/_B6-AgBRx.js +0 -1
  341. package/dist/public/assets/_B6-AgBRx.js.br +0 -0
  342. package/dist/public/assets/_B68mxQgf.js +0 -15
  343. package/dist/public/assets/_B68mxQgf.js.br +0 -0
  344. package/dist/public/assets/_B7lNd0Fe.js +0 -1
  345. package/dist/public/assets/_B7nG9Ktb.js.br +0 -0
  346. package/dist/public/assets/_B9Ukk65G.js.br +0 -0
  347. package/dist/public/assets/_BCTeDxHC.js.br +0 -0
  348. package/dist/public/assets/_BDCQoRmq.js.br +0 -0
  349. package/dist/public/assets/_BHkMvOuI.js.br +0 -0
  350. package/dist/public/assets/_BIul3uoC.js.br +0 -0
  351. package/dist/public/assets/_BJIAaIh4.js.br +0 -5
  352. package/dist/public/assets/_BJk5sqrB.js.br +0 -0
  353. package/dist/public/assets/_BLOE-kpM.js +0 -1
  354. package/dist/public/assets/_BNK4RUnx.js +0 -1
  355. package/dist/public/assets/_BNPo3NaH.js.br +0 -0
  356. package/dist/public/assets/_BPMmLRzt.js +0 -1
  357. package/dist/public/assets/_BQ91qGf-.js +0 -1
  358. package/dist/public/assets/_BS0AEB1V.js.br +0 -0
  359. package/dist/public/assets/_BS66ieXF.js +0 -1
  360. package/dist/public/assets/_BSb0QOJN.js +0 -1
  361. package/dist/public/assets/_BSliyqkf.js.br +0 -0
  362. package/dist/public/assets/_BSydNGAC.js +0 -2
  363. package/dist/public/assets/_BSydNGAC.js.br +0 -0
  364. package/dist/public/assets/_BXU-ZvQb.js.br +0 -0
  365. package/dist/public/assets/_BYHfXvmU.js.br +0 -0
  366. package/dist/public/assets/_BYcB3W24.js +0 -1
  367. package/dist/public/assets/_BYgxEDpq.js.br +0 -0
  368. package/dist/public/assets/_BYi6z1C9.js +0 -1
  369. package/dist/public/assets/_BbM04KlN.js +0 -1
  370. package/dist/public/assets/_Bc5E_ez3.js +0 -1
  371. package/dist/public/assets/_BcWZ_-iA.js +0 -1
  372. package/dist/public/assets/_BkXPpVmm.js +0 -1
  373. package/dist/public/assets/_Bk_g_9Bn.js.br +0 -0
  374. package/dist/public/assets/_BlSF31Ck.js.br +0 -0
  375. package/dist/public/assets/_Bn4xIRpG.js +0 -1
  376. package/dist/public/assets/_BpLwQ1O8.js.br +0 -0
  377. package/dist/public/assets/_BpVNeKi-.js +0 -1
  378. package/dist/public/assets/_BpdpbMex.js +0 -1
  379. package/dist/public/assets/_Bpf0Nyqk.js.br +0 -0
  380. package/dist/public/assets/_BwBNAwDG.js +0 -1
  381. package/dist/public/assets/_BxAKVWw-.js.br +0 -0
  382. package/dist/public/assets/_BxpaVKca.js.br +0 -0
  383. package/dist/public/assets/_ByqDCoAZ.js.br +0 -0
  384. package/dist/public/assets/_Bzg_Rzcf.js +0 -1
  385. package/dist/public/assets/_C-oO7X9P.js.br +0 -0
  386. package/dist/public/assets/_C0KvehwH.js +0 -1
  387. package/dist/public/assets/_C1JRCVnT.js.br +0 -0
  388. package/dist/public/assets/_C2U9mANP.js +0 -1
  389. package/dist/public/assets/_C3E24F_T.js.br +0 -0
  390. package/dist/public/assets/_C4KQv1VW.js.br +0 -0
  391. package/dist/public/assets/_C5MTb3MY.js +0 -1
  392. package/dist/public/assets/_C7ha2DpU.js +0 -1
  393. package/dist/public/assets/_C7ha2DpU.js.br +0 -0
  394. package/dist/public/assets/_CAaW1fUv.js +0 -1
  395. package/dist/public/assets/_CB-I9KUl.js.br +0 -0
  396. package/dist/public/assets/_CEvca0JK.js.br +0 -0
  397. package/dist/public/assets/_CGZs9U_g.js +0 -1
  398. package/dist/public/assets/_CK6p4Zj1.js +0 -1
  399. package/dist/public/assets/_CK6p4Zj1.js.br +0 -0
  400. package/dist/public/assets/_CKwCTsbp.js.br +0 -0
  401. package/dist/public/assets/_CKyRgnW2.js +0 -1
  402. package/dist/public/assets/_CN5iw4cA.js.br +0 -0
  403. package/dist/public/assets/_CPAGQRmF.js +0 -1
  404. package/dist/public/assets/_CPMD0qdL.js.br +0 -0
  405. package/dist/public/assets/_CRi7-Tyh.js +0 -1
  406. package/dist/public/assets/_CU2T7o-W.js +0 -1
  407. package/dist/public/assets/_CVSAwdO1.js +0 -1
  408. package/dist/public/assets/_CZzsPgfD.js +0 -1
  409. package/dist/public/assets/_C_jQehPQ.js +0 -1
  410. package/dist/public/assets/_Ca3bfNZI.js.br +0 -0
  411. package/dist/public/assets/_CdWPIocC.js.br +0 -0
  412. package/dist/public/assets/_CeFqvzt1.js +0 -1
  413. package/dist/public/assets/_CgsPFJZy.js.br +0 -0
  414. package/dist/public/assets/_ClgoCZxV.js +0 -6
  415. package/dist/public/assets/_ClgoCZxV.js.br +0 -0
  416. package/dist/public/assets/_CluEtmrQ.js.br +0 -0
  417. package/dist/public/assets/_Cnl5owe1.js.br +0 -0
  418. package/dist/public/assets/_Cp1dT7ox.js.br +0 -0
  419. package/dist/public/assets/_Cpyx7Ldm.js +0 -1
  420. package/dist/public/assets/_Cq4-AZ6O.js +0 -1
  421. package/dist/public/assets/_CrV4JiE4.js.br +0 -0
  422. package/dist/public/assets/_Csdgg-p8.js +0 -1
  423. package/dist/public/assets/_Csdgg-p8.js.br +0 -0
  424. package/dist/public/assets/_CsicaM6z.js.br +0 -0
  425. package/dist/public/assets/_Ct2VbISZ.js.br +0 -0
  426. package/dist/public/assets/_CtQ-4c6a.js.br +0 -0
  427. package/dist/public/assets/_Cyfdf5Zc.js +0 -1
  428. package/dist/public/assets/_D1qsYd77.js +0 -1
  429. package/dist/public/assets/_D1qsYd77.js.br +0 -0
  430. package/dist/public/assets/_D5yRmwZD.js.br +0 -0
  431. package/dist/public/assets/_D78O__dl.js +0 -1
  432. package/dist/public/assets/_D93v6VDe.js.br +0 -0
  433. package/dist/public/assets/_DDfizRXp.js +0 -1
  434. package/dist/public/assets/_DDfizRXp.js.br +0 -0
  435. package/dist/public/assets/_DFiA_pht.js.br +0 -0
  436. package/dist/public/assets/_DGDsfGXN.js +0 -1
  437. package/dist/public/assets/_DGDsfGXN.js.br +0 -0
  438. package/dist/public/assets/_DJnXBrlD.js.br +0 -0
  439. package/dist/public/assets/_DKiEZYX8.js +0 -1
  440. package/dist/public/assets/_DLEnV6cR.js +0 -1
  441. package/dist/public/assets/_DLJu1hcD.js.br +0 -0
  442. package/dist/public/assets/_DL_rHJtD.js +0 -1
  443. package/dist/public/assets/_DNFF24hk.js +0 -1
  444. package/dist/public/assets/_DNqoI_cd.js.br +0 -0
  445. package/dist/public/assets/_DOLRYXID.js +0 -1
  446. package/dist/public/assets/_DPIQzOUl.js.br +0 -0
  447. package/dist/public/assets/_DQWcu2Z_.js +0 -1
  448. package/dist/public/assets/_DW6AnxDW.js.br +0 -0
  449. package/dist/public/assets/_DWYjkjOA.js +0 -1
  450. package/dist/public/assets/_DXE83VZw.js +0 -1
  451. package/dist/public/assets/_DYBhy6q4.js.br +0 -0
  452. package/dist/public/assets/_DYKZ1zvC.js +0 -1
  453. package/dist/public/assets/_DYbmgf-P.js +0 -1
  454. package/dist/public/assets/_DZD7yzH2.js.br +0 -0
  455. package/dist/public/assets/_DZLJGzpN.js.br +0 -0
  456. package/dist/public/assets/_D_joWBEC.js.br +0 -0
  457. package/dist/public/assets/_D_qiANiM.js +0 -1
  458. package/dist/public/assets/_D_qiANiM.js.br +0 -0
  459. package/dist/public/assets/_DhhUcrza.js +0 -1
  460. package/dist/public/assets/_Dik2fbTK.js +0 -1
  461. package/dist/public/assets/_Dik2fbTK.js.br +0 -0
  462. package/dist/public/assets/_DjGbHRs7.js +0 -1
  463. package/dist/public/assets/_DjdPagIm.js +0 -1
  464. package/dist/public/assets/_Djnp5vRt.js +0 -1
  465. package/dist/public/assets/_DktieTrd.js.br +0 -0
  466. package/dist/public/assets/_Dr2zRKuC.js +0 -1
  467. package/dist/public/assets/_Dtx2usNe.js.br +0 -0
  468. package/dist/public/assets/_DvnFb18d.js +0 -1
  469. package/dist/public/assets/_DvqvHR7_.js.br +0 -0
  470. package/dist/public/assets/_Dy57KGoU.js +0 -1
  471. package/dist/public/assets/_Dy57KGoU.js.br +0 -0
  472. package/dist/public/assets/_FdygZebO.js +0 -1
  473. package/dist/public/assets/_H7TtilBa.js.br +0 -0
  474. package/dist/public/assets/_HwOcVvTN.js +0 -1
  475. package/dist/public/assets/_ICJfUHY2.js +0 -1
  476. package/dist/public/assets/_ItervcuA.js.br +0 -0
  477. package/dist/public/assets/_JGwf6udl.js +0 -1
  478. package/dist/public/assets/_KM7EGl2R.js.br +0 -0
  479. package/dist/public/assets/_KpWeECPp.js.br +0 -0
  480. package/dist/public/assets/_LgS0G0uH.js.br +0 -0
  481. package/dist/public/assets/_M94yp4jo.js.br +0 -0
  482. package/dist/public/assets/_NGfZeYAt.js.br +0 -0
  483. package/dist/public/assets/_QlXMW-cP.js.br +0 -0
  484. package/dist/public/assets/_SHB9zmh2.js.br +0 -0
  485. package/dist/public/assets/_TSA_v82C.js +0 -1
  486. package/dist/public/assets/_TxnhYSE5.js.br +0 -0
  487. package/dist/public/assets/_U2n8Yyqy.js.br +0 -0
  488. package/dist/public/assets/_Vhpht63x.js +0 -1
  489. package/dist/public/assets/_Z9CaLBvo.js +0 -1
  490. package/dist/public/assets/__-FQNLs7.js +0 -1
  491. package/dist/public/assets/__CN8nA63.js +0 -1
  492. package/dist/public/assets/_aAORMS0u.js.br +0 -0
  493. package/dist/public/assets/_buuWf96L.js.br +0 -0
  494. package/dist/public/assets/_cSsv1ZjH.js.br +0 -0
  495. package/dist/public/assets/_gP9nLV2Y.js.br +0 -0
  496. package/dist/public/assets/_i6oi77xC.js.br +0 -0
  497. package/dist/public/assets/_jb3Fwzol.js +0 -1
  498. package/dist/public/assets/_lmVJ3O6t.js +0 -1
  499. package/dist/public/assets/_mloSZbwk.js +0 -1
  500. package/dist/public/assets/_sYOWcsEI.js +0 -1
  501. package/dist/public/assets/_tqD_68em.js.br +0 -0
  502. package/dist/public/assets/_y4SZiKqE.js +0 -1
  503. package/dist/public/assets/_y4SZiKqE.js.br +0 -0
  504. package/dist/public/assets/_zMYJngRw.js +0 -1
  505. package/dist/public/assets/_zTWXKPCk.js +0 -1
  506. package/dist/public/assets/app-shell-BXDHei7B.css +0 -1
  507. package/dist/public/assets/app-shell-BXDHei7B.css.br +0 -0
  508. package/dist/public/assets/files-view-BCnw4-08.js +0 -2
  509. package/dist/public/assets/files-view-Ds4k9TjY.css +0 -1
  510. package/dist/public/assets/files-view-Ds4k9TjY.css.br +0 -0
  511. package/dist/public/assets/group.css.ts-CZcH3cNI.css +0 -1
  512. package/dist/public/assets/group.css.ts-CZcH3cNI.css.br +0 -0
  513. package/dist/public/assets/icon-folder-De3LJVaT.css +0 -1
  514. package/dist/public/assets/icon-folder-De3LJVaT.css.br +0 -0
  515. package/dist/public/assets/icon-search-C6A4IBPq.css.br +0 -0
  516. package/dist/public/assets/manage-workspace-B2IJyc-s.js +0 -2
  517. package/dist/public/assets/manage-workspace-BYotHuev.css +0 -1
  518. package/dist/public/assets/modal-view-BY2E8mw2.css.br +0 -0
  519. package/dist/public/assets/new-workspace-9FQTNRn4.css +0 -1
  520. package/dist/public/assets/new-workspace-9FQTNRn4.css.br +0 -0
  521. package/dist/public/assets/new-workspace-B_6v9CYu.js +0 -2
  522. package/dist/public/assets/new-zQDWH4FQ.js +0 -1
  523. package/dist/public/assets/port-chip-V2q_q3UM.css +0 -1
  524. package/dist/public/assets/port-chip-V2q_q3UM.css.br +0 -0
  525. package/dist/public/assets/prompt-dialog-C_kDiYmC.css +0 -1
  526. package/dist/public/assets/prompt-dialog-C_kDiYmC.css.br +0 -0
  527. package/dist/public/assets/quick-open-IkoNJ7wT.css +0 -1
  528. package/dist/public/assets/quick-open-IkoNJ7wT.css.br +0 -0
  529. package/dist/public/assets/repo-picker-CMHPjNaZ.css +0 -1
  530. package/dist/public/assets/repo-picker-CMHPjNaZ.css.br +0 -0
  531. package/dist/public/assets/review-view-CqIbovDm.css +0 -1
  532. package/dist/public/assets/review-view-CqIbovDm.css.br +0 -0
  533. package/dist/public/assets/review-view-DJ3TxEP8.js +0 -2
  534. package/dist/public/assets/section-Bjoist2N.css +0 -1
  535. package/dist/public/assets/section-Bjoist2N.css.br +0 -0
  536. package/dist/public/assets/settings-page-CA4M6Hig.css +0 -1
  537. package/dist/public/assets/settings-page-CA4M6Hig.css.br +0 -0
  538. package/dist/public/assets/settings-page-Gf4hmpSr.js +0 -2
  539. package/dist/public/assets/settings-zQDWH4FQ.js +0 -1
  540. package/dist/public/assets/skill-row-y-AJuVyg.css +0 -1
  541. package/dist/public/assets/sso-auth-DCSrkI2L.css +0 -1
  542. package/dist/public/assets/sso-auth-DCSrkI2L.css.br +0 -0
  543. package/dist/public/assets/w-zQDWH4FQ.js +0 -1
  544. package/dist/public/assets/w._-B47BqhrV.js +0 -1
  545. package/dist/public/assets/w._-D0upu6g5.js +0 -1
  546. package/dist/public/assets/w._-zQDWH4FQ.js +0 -1
  547. package/scripts/migrate.mjs +0 -824
package/README.md CHANGED
@@ -32,7 +32,7 @@ re-run the installer).
32
32
 
33
33
  ## Develop
34
34
 
35
- Requires Linux or macOS with `git`, `tmux`, `gh` (authenticated), and Node 22+.
35
+ Requires Linux or macOS with `git`, `tmux`, `gh` (authenticated), and Node 24+.
36
36
  The bootstrap script installs everything via [mise](https://mise.jdx.dev),
37
37
  offers the agent CLIs, and runs `pnpm install`:
38
38
 
@@ -44,12 +44,6 @@ offers the agent CLIs, and runs `pnpm install`:
44
44
 
45
45
  ```sh
46
46
  pnpm dev # http://localhost:7171
47
- ```
48
-
49
- For a production build plus a background service (systemd on Linux, launchd on macOS):
50
-
51
- ```sh
52
- ./scripts/setup-prod.sh # build + install + start the service
53
47
 
54
48
  # While hacking on work itself, point the background service at a checkout
55
49
  # (and back at the npm install when done):
@@ -58,8 +52,6 @@ work-source local # this tree (or: work-source local /path/to/work)
58
52
  work-source rebuild # rebuild + restart without rewriting the unit
59
53
  work-source prod # global @dylanpiercey/work again
60
54
  work-source # status
61
- ./scripts/run-prod.sh # or: build with --no-service and run manually
62
- ./scripts/update.sh # later: pull latest, rebuild, restart
63
55
  ```
64
56
 
65
57
  ### Access
@@ -85,17 +77,16 @@ Access, `tailscale serve` — and tell work about it:
85
77
  Set them when installing (`WORK_ALLOWED_HOSTS=… WORK_TRUSTED_PROXIES=…
86
78
  WORK_LISTEN=0.0.0.0 work setup`); `work setup` keeps them in the service
87
79
  from then on. A refused request gets a page saying which setting it needs.
88
- Installs from before this default keep listening on every interface, and
89
- other machines see that page until they are configured. Everything (pages,
90
- API, and the `/term` websockets) serves from the single app port, so route
91
- the whole hostname to it.
80
+ Everything (pages, API, and the `/term` websockets) serves from the single
81
+ app port, so route the whole hostname to it.
92
82
 
93
83
  **Opening workspace ports remotely.** The port chips in the sidebar link to
94
84
  `http://<host>:<port>`, which only works where the machine is reachable
95
85
  directly. Through a tunnel, route a wildcard hostname to the app port as
96
86
  well and work proxies it — HTTP and websockets, so HMR works — to
97
- `localhost:<port>`. Two hostname shapes are accepted; `WORK_PORT_HOSTS`
98
- picks which one the chips link to:
87
+ `localhost:<port>`. `WORK_PORT_HOSTS` picks the hostname shape the chips
88
+ link to; `sub` is always accepted, `dash` only when picked, and only for a
89
+ name of three labels or more:
99
90
 
100
91
  - `sub` (default): `https://3000.work.example.com`. Needs a wildcard
101
92
  `*.work.example.com` route and a certificate that covers it (your own
@@ -113,11 +104,6 @@ auth as the app. API writes and the terminal websockets refuse a foreign
113
104
  `Origin`, so a page a workspace serves cannot drive work with the shared
114
105
  login cookie.
115
106
 
116
- > **Upgrading from the two-port layout:** older setups routed `/term/*` to a
117
- > separate terminal port (7172). That port no longer exists — remove the
118
- > `/term` rule from your tunnel/proxy config and send all traffic to the app
119
- > port, or terminals will fail to connect.
120
-
121
107
  ## Backup, restore, join
122
108
 
123
109
  A `work` machine holds almost nothing that lives only there: branches are
@@ -133,7 +119,9 @@ commits, uncommitted or untracked
133
119
  files, ignored files that are not build junk — and waits for a decision.
134
120
 
135
121
  **Restore** (Settings → Backup, or `work restore <file> --yes`) installs
136
- what the file names that the machine lacks and re-creates the workspaces
122
+ what the file names that the machine lacks — a tool outside work's catalog
123
+ or a new GitHub host only when ticked (or named with `--allow`), since it
124
+ installs and runs whatever the file says — and re-creates the workspaces
137
125
  as rows; each one's repos then clone in the background, one workspace at
138
126
  a time, on the branch the manifest recorded (from origin, or fresh from
139
127
  the base when it was never pushed). Archived workspaces clone when they
@@ -160,16 +148,6 @@ targeting that branch.
160
148
  | `WORK_USER` / `WORK_HOST` | current user/host | Branch-name prefix parts |
161
149
  | `WORK_BRANCH_PREFIX` | `<user>-<host>` | Whole branch-name prefix, overriding the parts |
162
150
 
163
- Ports and paths can be exported before `scripts/setup-prod.sh` to bake them into
164
- the service. For settings that should outlive an update, put them in an untracked
165
- `.env.local` at the repo root instead — `scripts/run-prod.sh` reads it on every
166
- start (the dev server does not), only `WORK_*` names apply, and the
167
- surrounding environment still takes precedence:
168
-
169
- ```sh
170
- WORK_BRANCH_PREFIX=rturnq
171
- ```
172
-
173
151
  The usage panel (and `work usage`) reads plan/quota windows straight from each
174
152
  agent CLI's own credentials on disk — Claude, Codex, Cursor, Grok, and Copilot
175
153
  (via `gh`'s token). Providers you are not signed into simply say so.
package/bin/work.mjs CHANGED
@@ -12,7 +12,9 @@
12
12
  // work procs [id|name] a workspace's running processes and ports
13
13
  // work review [id|name] pending review comments as markdown (--json for rows)
14
14
  // work export [file] write a backup manifest (workspaces, settings, skills, tool pins)
15
- // work restore <file> bring a manifest's workspaces and machine setup back (--yes to run)
15
+ // work restore <file> bring a manifest's workspaces and machine setup back (--yes to run;
16
+ // --allow <spec|host>, repeated, for each tool outside work's catalog
17
+ // or new GitHub host it names — skipped otherwise)
16
18
  // work share [id|name] print a workspace's invite (paste into New → Join / work join)
17
19
  // work join [file] join a workspace from an invite (file, or stdin)
18
20
  // work version print the installed version
@@ -25,9 +27,9 @@ import fs from "node:fs";
25
27
  import os from "node:os";
26
28
  import path from "node:path";
27
29
  import { fileURLToPath } from "node:url";
28
- import { createRequire } from "node:module";
29
30
  import { doctor, formatDoctor, setupPath } from "../lib/setup/doctor.mjs";
30
- import { installTool } from "../lib/setup/install.mjs";
31
+ import { installTool, repairGhHelpers } from "../lib/setup/install.mjs";
32
+ import { bridgeCommands, bridgeIfNeeded } from "../lib/setup/bridge.mjs";
31
33
  import { dialHost, listenStream } from "../lib/setup/listen.mjs";
32
34
  import { commentMarkdown } from "../lib/review/markdown.mjs";
33
35
  import { formatInvite, parseInvite } from "../lib/share/manifest.mjs";
@@ -58,7 +60,7 @@ const yes = args.includes("--yes") || args.includes("-y");
58
60
  const jsonOut = args.includes("--json");
59
61
  /** `--name <value>` style flags take the next arg; keep it out of the
60
62
  * positionals so `work join --name x` still reads stdin. */
61
- const VALUED = new Set(["--name"]);
63
+ const VALUED = new Set(["--name", "--allow"]);
62
64
  const positional = args.filter(
63
65
  (a, i) => a === "-" || (!a.startsWith("-") && !VALUED.has(args[i - 1])),
64
66
  );
@@ -69,6 +71,14 @@ const flagValue = (flag) => {
69
71
  die(`${flag} needs a value`);
70
72
  return args[i + 1];
71
73
  };
74
+ /** Every value of a flag given more than once (`--allow a --allow b`). */
75
+ const flagValues = (flag) =>
76
+ args.flatMap((a, i) => {
77
+ if (a !== flag) return [];
78
+ if (i + 1 >= args.length || args[i + 1].startsWith("-"))
79
+ die(`${flag} needs a value`);
80
+ return [args[i + 1]];
81
+ });
72
82
 
73
83
  switch (command) {
74
84
  case "start":
@@ -78,9 +88,12 @@ switch (command) {
78
88
  await setup();
79
89
  break;
80
90
  case "install-service":
81
- // Service installation only — no doctor/fix, no migrate. Used by
82
- // scripts/setup-prod.sh so npm and source installs share one
83
- // definition; WORK_SERVICE_EXEC points it at a checkout's run-prod.sh.
91
+ // Service installation only — no doctor/fix. Used by
92
+ // scripts/work-source.sh so a checkout and the npm package share one
93
+ // definition; WORK_SERVICE_EXEC points it at the checkout's
94
+ // run-local.sh. The database is brought to the baseline first all the
95
+ // same: a server this checkout builds cannot open one from before it.
96
+ await bridge();
84
97
  if (!installService()) {
85
98
  process.exitCode = 1;
86
99
  } else if (await waitForServer()) {
@@ -92,12 +105,6 @@ switch (command) {
92
105
  process.exitCode = 1;
93
106
  }
94
107
  break;
95
- case "migrate":
96
- // The one-shot cleanups alone, against the service's settings (and the
97
- // checkout's .env.local when WORK_SERVICE_EXEC names one). Used by
98
- // scripts/update.sh ahead of setup-prod.sh.
99
- process.exitCode = migrate();
100
- break;
101
108
  case "doctor":
102
109
  await doctorCmd();
103
110
  break;
@@ -142,7 +149,7 @@ switch (command) {
142
149
  break;
143
150
  default:
144
151
  console.log(
145
- `work ${pkg.version}\n\nusage: work <setup|install-service|migrate|doctor|start|update|usage|workspaces|workspace|repos|procs|review|export|restore|share|join|version> [--json]`,
152
+ `work ${pkg.version}\n\nusage: work <setup|install-service|doctor|start|update|usage|workspaces|workspace|repos|procs|review|export|restore|share|join|version> [--json]`,
146
153
  );
147
154
  }
148
155
 
@@ -473,7 +480,7 @@ async function exportCmd() {
473
480
  }
474
481
 
475
482
  function readManifest(file) {
476
- if (!file) die("usage: work restore <file> [--yes]");
483
+ if (!file) die("usage: work restore <file> [--yes] [--allow <spec|host>]...");
477
484
  let manifest;
478
485
  try {
479
486
  manifest = JSON.parse(fs.readFileSync(file, "utf8"));
@@ -483,35 +490,76 @@ function readManifest(file) {
483
490
  return manifest;
484
491
  }
485
492
 
493
+ /** A word as a shell reads it back: specs come from the file, so one
494
+ * printed in a command to copy is quoted, never pasted as shell. */
495
+ function shellWord(s) {
496
+ return /^[\w@%+=:,./-]+$/.test(s) ? s : `'${s.replaceAll("'", `'\\''`)}'`;
497
+ }
498
+
486
499
  /** Preview, then (with --yes) restore everything the file names that this
487
- * machine does not have. Workspaces already here are skipped. */
500
+ * machine does not have. Workspaces already here are skipped. A tool
501
+ * outside work's catalog installs and runs whatever it names, and a new
502
+ * GitHub host is one work signs in to and clones from, so each is taken
503
+ * only when `--allow` names it exactly as listed. */
488
504
  async function restoreCmd() {
489
505
  const manifest = readManifest(positional[0]);
490
506
  const preview = await apiPost("/api/backup/preview", manifest);
491
507
  if (jsonOut && !yes) return console.log(JSON.stringify(preview, null, 2));
492
508
  const pick = (list) => list.filter((x) => !x.installed);
493
509
  const say = jsonOut ? () => {} : console.log;
510
+ const allow = new Set(flagValues("--allow"));
511
+ const extraTools = pick(preview.tools)
512
+ .filter((t) => !t.catalog)
513
+ .map((t) => t.spec);
514
+ const newHosts = preview.hosts.filter((h) => !h.known).map((h) => h.host);
515
+ for (const a of allow) {
516
+ if (!extraTools.includes(a) && !newHosts.includes(a))
517
+ warn(`--allow ${a} names nothing this file would add`);
518
+ }
494
519
  say(`from ${preview.from.host} on ${preview.from.exportedAt.slice(0, 10)}`);
495
520
  const workspaces = preview.workspaces.filter(
496
- (w) => !w.exists && !w.unknownHost,
521
+ (w) => !w.exists && (!w.unknownHost || allow.has(w.unknownHost)),
497
522
  );
498
523
  for (const w of preview.workspaces) {
499
524
  const note = w.exists
500
525
  ? "already here"
501
- : w.unknownHost
526
+ : w.unknownHost && !allow.has(w.unknownHost)
502
527
  ? `unknown host ${w.unknownHost}`
503
528
  : w.status;
504
529
  say(` ${pad(w.name, 24)} ${pad(note, 14)} ${w.repos.join(", ")}`);
505
530
  }
506
- const tools = pick(preview.tools).map((t) => t.name);
531
+ const tools = pick(preview.tools)
532
+ .filter((t) => t.catalog)
533
+ .map((t) => t.name);
507
534
  const skills = pick(preview.skills).map((s) => s.id);
508
535
  const agents = pick(preview.agents).map((a) => a.label);
509
- const hosts = preview.hosts.filter((h) => !h.known).map((h) => h.host);
510
536
  if (tools.length) say(` tools to install: ${tools.join(", ")}`);
511
537
  if (skills.length) say(` skills to add: ${skills.join(", ")}`);
512
538
  if (agents.length) say(` agents to install: ${agents.join(", ")}`);
513
- if (hosts.length) say(` hosts to add: ${hosts.join(", ")}`);
514
539
  if (preview.settings) say(` settings: ${preview.settings}`);
540
+ const extras = [
541
+ ...extraTools.map((name) => ({ kind: "tool", name })),
542
+ ...newHosts.map((name) => ({ kind: "host", name })),
543
+ ];
544
+ if (extras.length) {
545
+ say(
546
+ " not in work's catalog — a tool installs and runs whatever it names,",
547
+ );
548
+ say(
549
+ " a host is one work signs in to and clones from; each only with --allow:",
550
+ );
551
+ for (const x of extras)
552
+ say(
553
+ ` ${pad(x.kind, 5)} ${x.name}${allow.has(x.name) ? " (allowed)" : ""}`,
554
+ );
555
+ const missing = extras.filter((x) => !allow.has(x.name));
556
+ if (missing.length) {
557
+ say(" to take them too, if you trust this file:");
558
+ say(
559
+ ` work restore ${shellWord(positional[0])} --yes ${missing.map((x) => `--allow ${shellWord(x.name)}`).join(" ")}`,
560
+ );
561
+ }
562
+ }
515
563
  if (!yes) {
516
564
  say("");
517
565
  log("re-run with --yes to restore");
@@ -522,6 +570,8 @@ async function restoreCmd() {
522
570
  selection: {
523
571
  workspaces: workspaces.map((w) => w.id),
524
572
  tools: true,
573
+ extraTools: extraTools.filter((s) => allow.has(s)),
574
+ hosts: newHosts.filter((h) => allow.has(h)),
525
575
  skills: true,
526
576
  agents: true,
527
577
  settings: true,
@@ -587,10 +637,9 @@ function until(iso) {
587
637
  }
588
638
 
589
639
  async function setup() {
640
+ await bridge();
590
641
  await fix(await doctor());
591
642
 
592
- migrate();
593
-
594
643
  const running = installService();
595
644
  const port = serviceEnv().PORT;
596
645
  maybeTunnel(port);
@@ -617,19 +666,24 @@ async function setup() {
617
666
  }
618
667
  }
619
668
 
620
- /** One-shot cleanups between versions (scripts/migrate.mjs), run against
621
- * the settings the service actually uses: migrate.mjs exits quietly when it
622
- * finds no db, so an ambient environment missing WORK_DATA_DIR skips every
623
- * sweep. A checkout's .env.local sits under both, as it does when its run
624
- * script starts the server. Returns the exit status. */
625
- function migrate() {
626
- const script = path.join(pkgRoot, "scripts", "migrate.mjs");
627
- if (!fs.existsSync(script)) return 0;
628
- return (
629
- spawnSync(process.execPath, [script], {
630
- stdio: "inherit",
631
- env: { ...checkoutEnvLocal(), ...process.env, ...serviceEnv() },
632
- }).status ?? 1
669
+ /** Bring a database from before 0.1 to the baseline this release starts
670
+ * from (lib/setup/bridge.mjs), before anything touches the service: the
671
+ * server it would restart refuses such a database. Run with the settings
672
+ * the service uses (a checkout's .env.local under them, as its run script
673
+ * has it), so it finds the data dir the server opens rather than whatever
674
+ * this shell has. On failure the service is left as it was, and what to
675
+ * run by hand ends the output. */
676
+ async function bridge() {
677
+ const env = { ...checkoutEnvLocal(), ...process.env, ...serviceEnv() };
678
+ const dataDir =
679
+ env.WORK_DATA_DIR ||
680
+ path.join(
681
+ env.XDG_DATA_HOME || path.join(os.homedir(), ".local", "share"),
682
+ "work",
683
+ );
684
+ if (bridgeIfNeeded(dataDir, env, log)) return;
685
+ die(
686
+ `${path.join(dataDir, "work.db")} is still from before 0.1, so the service was left as it was. Run:\n ${bridgeCommands(dataDir).join("\n ")}`,
633
687
  );
634
688
  }
635
689
 
@@ -737,6 +791,13 @@ async function fix(d) {
737
791
  "GitHub is not signed in. Open the app and use Settings → GitHub → Sign in",
738
792
  );
739
793
  }
794
+ if (d.staleGhHelpers.length) {
795
+ try {
796
+ repairGhHelpers(d.staleGhHelpers, { log });
797
+ } catch (err) {
798
+ warn(`could not repair git's gh credential helper: ${err.message}`);
799
+ }
800
+ }
740
801
  // Agent CLIs are installed from the app (Settings → Agents), where each
741
802
  // one is a click and the picker updates immediately — no prompt here.
742
803
  if (!d.agents.some((a) => a.installed)) {
@@ -781,25 +842,6 @@ function serviceFile() {
781
842
  );
782
843
  }
783
844
 
784
- /** Whether an installed service with no WORK_LISTEN line was installed
785
- * before the this-machine-only default. On Linux its shape tells: under the
786
- * default, work.socket binds an address (`127.0.0.1:7171`), where an older
787
- * service had no socket or bound a bare port. A launchd agent has no such
788
- * tell. */
789
- function predatesListenDefault() {
790
- if (!fs.existsSync(serviceFile())) return false;
791
- if (process.platform === "darwin") return true;
792
- try {
793
- const socket = fs.readFileSync(
794
- path.join(path.dirname(serviceFile()), "work.socket"),
795
- "utf8",
796
- );
797
- return /^ListenStream=\d+\s*$/m.test(socket);
798
- } catch {
799
- return true;
800
- }
801
- }
802
-
803
845
  /** One Environment= line systemd reads back as exactly this value. A value
804
846
  * holding whitespace, a quote, `\` or `%` is quoted, with `\` and `"`
805
847
  * escaped and `%` doubled, since systemd expands specifiers there: bare, a
@@ -849,8 +891,8 @@ function installedServiceEnv() {
849
891
  }
850
892
  return installed;
851
893
  }
852
- // unitEnvLine's quoted form, or an older service's bare `KEY=value`,
853
- // which was never escaped either.
894
+ // unitEnvLine's quoted form, or the bare `KEY=value` it writes for a
895
+ // plain value, which is not escaped either.
854
896
  const re =
855
897
  /^Environment=(?:"([A-Za-z_][A-Za-z0-9_]*)=((?:[^"\\]|\\.)*)"|([A-Za-z_][A-Za-z0-9_]*)=(.*))$/gm;
856
898
  for (const [, qKey, qValue, key, value] of text.matchAll(re)) {
@@ -864,9 +906,9 @@ function installedServiceEnv() {
864
906
  }
865
907
 
866
908
  /** WORK_* from the .env.local of the checkout WORK_SERVICE_EXEC runs, read
867
- * as scripts/env-local.sh reads it: that script exports them at start, under
868
- * whatever the service sets. Never written into the service, which would
869
- * shadow later edits of the file. */
909
+ * as scripts/run-local.sh reads it: that script exports them at start,
910
+ * under whatever the service sets. Never written into the service, which
911
+ * would shadow later edits of the file. */
870
912
  function checkoutEnvLocal() {
871
913
  const exec = process.env.WORK_SERVICE_EXEC;
872
914
  const out = {};
@@ -920,18 +962,8 @@ function serviceEnv() {
920
962
  const value = key in process.env ? process.env[key] : installed[key];
921
963
  if (value) env[key] = value;
922
964
  }
923
- // A new install listens on this machine only, and its service says so, so
924
- // that a missing line only ever means a service from before that default.
925
- // Those listened on every interface, and other machines (a phone, the
926
- // proxy in front of it) may be reaching it that way: keep it listening,
927
- // so they get work's page naming the setting to add (server/access.ts)
928
- // rather than a connection that is simply refused.
929
- if (!env.WORK_LISTEN) {
930
- env.WORK_LISTEN =
931
- !("WORK_LISTEN" in process.env) && predatesListenDefault()
932
- ? "0.0.0.0"
933
- : "127.0.0.1";
934
- }
965
+ // This machine only unless set, and the service says so.
966
+ env.WORK_LISTEN ||= "127.0.0.1";
935
967
  // entry.ts prefers PORT, so carrying WORK_APP_PORT forward without this
936
968
  // would leave the service on the default port anyway. A checkout's run
937
969
  // script serves the port its .env.local names, so the socket binds that
@@ -962,17 +994,15 @@ function serviceEnv() {
962
994
 
963
995
  /** True when `cmd` is a work *server* (not `work setup` / `work update`).
964
996
  * Must not match the tmux that hosts agent sessions: `tmux -L work
965
- * start-server` used to hit `\bwork\s+start\b` because `\b` fires on the
966
- * `t`/`-` boundary in `start-server`, so `work update` killed tmux mid-
967
- * setup and never reached `systemctl restart`. */
997
+ * start-server` hits `\bwork\s+start\b` because `\b` fires on the
998
+ * `t`/`-` boundary in `start-server`, and `work update` would kill tmux
999
+ * mid-setup and never reach `systemctl restart`. */
968
1000
  function isWorkServerCmd(cmd) {
969
1001
  if (/\btmux\b/.test(cmd)) return false;
970
1002
  if (/\bwork(\.mjs)?\s+(setup|update|version)\b/.test(cmd)) return false;
971
1003
  if (
972
1004
  /\bwork\.mjs\s+start(?:\s|$)/.test(cmd) ||
973
- /(?:^|[\s/])work\s+start(?:\s|$)/.test(cmd) ||
974
- /--why=work server is running/.test(cmd) ||
975
- /--why="work server is running"/.test(cmd)
1005
+ /(?:^|[\s/])work\s+start(?:\s|$)/.test(cmd)
976
1006
  )
977
1007
  return true;
978
1008
  // A built server or run script, by the absolute path an interpreter was
@@ -983,9 +1013,7 @@ function isWorkServerCmd(cmd) {
983
1013
  const argv = cmd.split(/\s+/);
984
1014
  return argv.some((arg, i) => {
985
1015
  if (
986
- !/^\/.*\/(?:(?:dist|\.run)\/index\.mjs|scripts\/run-(?:prod|local)\.sh)$/.test(
987
- arg,
988
- )
1016
+ !/^\/.*\/(?:(?:dist|\.run)\/index\.mjs|scripts\/run-local\.sh)$/.test(arg)
989
1017
  )
990
1018
  return false;
991
1019
  const runner = argv
@@ -1077,10 +1105,9 @@ function killPids(pids, signal) {
1077
1105
  }
1078
1106
  }
1079
1107
 
1080
- /** Stop the managed service *and* any leftover checkout / `work start`
1081
- * process still bound to the port. A pre-npm install often wasn't the
1082
- * current unit (or was a bare node), so restarting work.service left it
1083
- * sitting in front of the new one. */
1108
+ /** Stop the managed service *and* any other work server still bound to
1109
+ * the port — a `work start` left in a terminal, a checkout's — which would
1110
+ * otherwise sit in front of the new one. */
1084
1111
  function stopOldCopies(port) {
1085
1112
  log("stopping any previous work server");
1086
1113
  if (process.platform === "darwin") {
@@ -1088,28 +1115,6 @@ function stopOldCopies(port) {
1088
1115
  spawnSync("launchctl", ["bootout", `gui/${uid}/dev.work.app`], {
1089
1116
  stdio: "ignore",
1090
1117
  });
1091
- const agents = path.join(os.homedir(), "Library/LaunchAgents");
1092
- try {
1093
- for (const name of fs.readdirSync(agents)) {
1094
- if (!name.endsWith(".plist")) continue;
1095
- const file = path.join(agents, name);
1096
- const text = fs.readFileSync(file, "utf8");
1097
- if (
1098
- !/dev\.work\.app|work\.mjs|run-prod\.sh|run-local\.sh|@dylanpiercey\/work/.test(
1099
- text,
1100
- )
1101
- )
1102
- continue;
1103
- const label = text.match(
1104
- /<key>Label<\/key>\s*<string>([^<]+)<\/string>/,
1105
- )?.[1];
1106
- if (label) {
1107
- spawnSync("launchctl", ["bootout", `gui/${uid}/${label}`], {
1108
- stdio: "ignore",
1109
- });
1110
- }
1111
- }
1112
- } catch {}
1113
1118
  } else if (have("systemctl")) {
1114
1119
  spawnSync("systemctl", ["--user", "stop", "work.service"], {
1115
1120
  stdio: "ignore",
@@ -1125,10 +1130,11 @@ function stopOldCopies(port) {
1125
1130
  }
1126
1131
 
1127
1132
  /** Wait for the service to answer before we tell anyone it is up. Both
1128
- * service managers return as soon as the job is spawned, so `done — http://…`
1129
- * used to print at a port that answers a second or two later — which reads as
1130
- * an update that broke the app. Any HTTP reply proves the server is serving;
1131
- * the status the route returns is not this function's business. */
1133
+ * service managers return as soon as the job is spawned, so without this
1134
+ * `done — http://…` would print at a port that answers a second or two
1135
+ * later — which reads as an update that broke the app. Any HTTP reply
1136
+ * proves the server is serving; the status the route returns is not this
1137
+ * function's business. */
1132
1138
  async function waitForServer(timeoutMs = 30_000) {
1133
1139
  const deadline = Date.now() + timeoutMs;
1134
1140
  for (;;) {
@@ -1148,8 +1154,8 @@ function installService() {
1148
1154
  const port = serviceEnv().PORT;
1149
1155
  stopOldCopies(port);
1150
1156
  const cliPath = fileURLToPath(import.meta.url);
1151
- // One service definition serves both installers. A source install
1152
- // (scripts/setup-prod.sh) points the unit at this checkout's run-prod.sh
1157
+ // One service definition serves the npm package and a checkout:
1158
+ // scripts/work-source.sh points the unit at the checkout's run-local.sh
1153
1159
  // instead of the CLI — that script carries its own sleep inhibitor and
1154
1160
  // PORT handling, so no awake prefix is layered on top.
1155
1161
  const execOverride = process.env.WORK_SERVICE_EXEC;
@@ -1197,15 +1203,8 @@ ${envXml}
1197
1203
  stdio: "ignore",
1198
1204
  }).status === 0;
1199
1205
  if (!started) {
1200
- // A launchd that only speaks the legacy verbs: `load -w` honours
1201
- // RunAtLoad the same way.
1202
- started =
1203
- spawnSync("launchctl", ["load", "-w", plist], { stdio: "ignore" })
1204
- .status === 0;
1205
- }
1206
- if (!started) {
1207
- // Both refused because the job is loaded already (a bootout that did
1208
- // not take). Nothing spawned it with the new definition, and it is old
1206
+ // Refused because the job is loaded already (a bootout that did not
1207
+ // take). Nothing spawned it with the new definition, and it is old
1209
1208
  // enough not to be throttled, so restart it.
1210
1209
  started =
1211
1210
  spawnSync("launchctl", ["kickstart", "-k", label], { stdio: "ignore" })