@dylanpiercey/work 0.0.223 → 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 (522) hide show
  1. package/README.md +2 -27
  2. package/bin/work.mjs +51 -105
  3. package/dist/{_CpANOzpd.js → _Bq7to522.js} +344 -139
  4. package/dist/_CkwTsHKB.js +2 -0
  5. package/dist/index.mjs +2222 -2341
  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/{_DoCtdMd2.js → _8G2Mv7jG.js} +1 -1
  10. package/dist/public/assets/_8G2Mv7jG.js.br +0 -0
  11. package/dist/public/assets/{_BL9QMk_P.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/{_DlpTErRA.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/{_DtOzdwHm.js → _B0oyGUU5.js} +1 -1
  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/{_BUH04L5e.js → _B582D2rg.js} +1 -1
  23. package/dist/public/assets/{_CT3clsOQ.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/{_BVp6r0fg.js → _BBWaxDkO.js} +1 -1
  27. package/dist/public/assets/_BBWaxDkO.js.br +0 -0
  28. package/dist/public/assets/{_DeCJ44Me.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/{_DJ3UAR_s.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/_BIJ2O2oU.js +1 -0
  35. package/dist/public/assets/_BJ59XAZ9.js +1 -0
  36. package/dist/public/assets/{_BnOOD6nr.js → _BKqRYfOI.js} +4 -4
  37. package/dist/public/assets/_BKqRYfOI.js.br +0 -0
  38. package/dist/public/assets/_BKr9Dzz1.js +1 -0
  39. package/dist/public/assets/_BN7xvxS_.js +1 -0
  40. package/dist/public/assets/_BNQTVBlH.js +1 -0
  41. package/dist/public/assets/{_D8u1YU9b.js → _BNW5Jiec.js} +1 -1
  42. package/dist/public/assets/_BNW5Jiec.js.br +0 -0
  43. package/dist/public/assets/{_CZGS4T08.js → _BOGkzMx9.js} +1 -1
  44. package/dist/public/assets/_BOGkzMx9.js.br +0 -0
  45. package/dist/public/assets/_BUEpqQ_m.js +1 -0
  46. package/dist/public/assets/{_B_zyAtSJ.js → _BUvqweu0.js} +1 -1
  47. package/dist/public/assets/_BUvqweu0.js.br +0 -0
  48. package/dist/public/assets/{_BsupnkWM.js → _BZKB4fhr.js} +1 -1
  49. package/dist/public/assets/_BZKB4fhr.js.br +0 -0
  50. package/dist/public/assets/_BZo9BjDF.js +1 -0
  51. package/dist/public/assets/{_BeE9qDu0.js → _BbbOvNRH.js} +1 -1
  52. package/dist/public/assets/_BbbOvNRH.js.br +0 -0
  53. package/dist/public/assets/_BdUNnSlC.js +1 -0
  54. package/dist/public/assets/{_Cw_8WbwF.js → _Bf8WYPfh.js} +1 -1
  55. package/dist/public/assets/_Bf8WYPfh.js.br +0 -0
  56. package/dist/public/assets/{_pP1W6w5v.js → _Bhx319Hi.js} +1 -1
  57. package/dist/public/assets/_Bhx319Hi.js.br +0 -0
  58. package/dist/public/assets/{_O70J1Mfv.js → _Bm4SHrNp.js} +1 -1
  59. package/dist/public/assets/_Bm4SHrNp.js.br +0 -0
  60. package/dist/public/assets/{_--tE4Gxz.js → _Bmrqq8Ro.js} +2 -2
  61. package/dist/public/assets/_Bmrqq8Ro.js.br +0 -0
  62. package/dist/public/assets/_BnHZ6Npj.js +1 -0
  63. package/dist/public/assets/{_CLDmR3jR.js → _BoDxRJLS.js} +1 -1
  64. package/dist/public/assets/_BoDxRJLS.js.br +0 -0
  65. package/dist/public/assets/_Bo_Ru664.js +1 -0
  66. package/dist/public/assets/{_BCZpExov.js → _Bp8-V8yl.js} +1 -1
  67. package/dist/public/assets/_Bp8-V8yl.js.br +0 -0
  68. package/dist/public/assets/{_CGLpCj_I.js → _BpoeUr5j.js} +1 -1
  69. package/dist/public/assets/_BpoeUr5j.js.br +0 -0
  70. package/dist/public/assets/_Bq2G_Tid.js +1 -0
  71. package/dist/public/assets/_BsyoLB_D.js +1 -0
  72. package/dist/public/assets/{_BAHrOydH.js → _Bv3e3rg8.js} +1 -1
  73. package/dist/public/assets/_Bv3e3rg8.js.br +0 -0
  74. package/dist/public/assets/{_C6i9NP5A.js → _Bv3qNE1b.js} +1 -1
  75. package/dist/public/assets/{_BXT2bXMi.js → _BvXp6HpX.js} +1 -1
  76. package/dist/public/assets/_BvXp6HpX.js.br +0 -0
  77. package/dist/public/assets/{_CX1wufuh.js → _BwP07uVS.js} +1 -1
  78. package/dist/public/assets/_BwP07uVS.js.br +0 -0
  79. package/dist/public/assets/{_ifUb4WX7.js → _Bx1CW-sF.js} +1 -1
  80. package/dist/public/assets/_Bx1CW-sF.js.br +0 -0
  81. package/dist/public/assets/{_BPcswKMK.js → _BywcP-As.js} +1 -1
  82. package/dist/public/assets/_BywcP-As.js.br +0 -0
  83. package/dist/public/assets/{_Bp_WT09q.js → _Bzgtwt3G.js} +1 -1
  84. package/dist/public/assets/_Bzgtwt3G.js.br +0 -0
  85. package/dist/public/assets/{_IWMmnVCy.js → _C0_s45qg.js} +1 -1
  86. package/dist/public/assets/_C0_s45qg.js.br +0 -0
  87. package/dist/public/assets/_C0ePgF6b.js +1 -0
  88. package/dist/public/assets/{_Da2Dmt_d.js → _C0oVtTqO.js} +1 -1
  89. package/dist/public/assets/_C0oVtTqO.js.br +0 -0
  90. package/dist/public/assets/{_CtyJUmXC.js → _C654p96Z.js} +1 -1
  91. package/dist/public/assets/_C654p96Z.js.br +0 -0
  92. package/dist/public/assets/{_2mnAZf6B.js → _C8_1Y2-z.js} +1 -1
  93. package/dist/public/assets/_C8_1Y2-z.js.br +0 -0
  94. package/dist/public/assets/_C8v1AZFP.js +1 -0
  95. package/dist/public/assets/{_BO0OB-rz.js → _CAkPJLeF.js} +1 -1
  96. package/dist/public/assets/_CAkPJLeF.js.br +0 -0
  97. package/dist/public/assets/_CB0D5cRH.js +1 -0
  98. package/dist/public/assets/_CD05JUTh.js +1 -0
  99. package/dist/public/assets/{_CJ9j8N5Z.js → _CEJUcePr.js} +1 -1
  100. package/dist/public/assets/_CEJUcePr.js.br +0 -0
  101. package/dist/public/assets/{_DuarImb7.js → _CEXHZd73.js} +1 -1
  102. package/dist/public/assets/_CEXHZd73.js.br +0 -0
  103. package/dist/public/assets/_CHcUMVR7.js +1 -0
  104. package/dist/public/assets/{_BnyLUTdO.js → _CHuLFr1f.js} +1 -1
  105. package/dist/public/assets/_CHuLFr1f.js.br +0 -0
  106. package/dist/public/assets/{_DwcoW-IU.js → _CIb7xw_1.js} +1 -1
  107. package/dist/public/assets/_CIb7xw_1.js.br +0 -0
  108. package/dist/public/assets/{_B1RldJ0S.js → _CMSBfO6u.js} +1 -1
  109. package/dist/public/assets/_CMSBfO6u.js.br +0 -0
  110. package/dist/public/assets/_CN7GPyBo.js +1 -0
  111. package/dist/public/assets/{_DI0QHEXB.js → _COcePo2y.js} +1 -1
  112. package/dist/public/assets/_COcePo2y.js.br +0 -0
  113. package/dist/public/assets/{_eQK3EZCc.js → _CTINBWaG.js} +1 -1
  114. package/dist/public/assets/_CTINBWaG.js.br +0 -0
  115. package/dist/public/assets/_CTWrnAbz.js +1 -0
  116. package/dist/public/assets/{_CLerZOx-.js → _CUXajOKj.js} +1 -1
  117. package/dist/public/assets/_CUXajOKj.js.br +0 -0
  118. package/dist/public/assets/{_ChpYg41R.js → _CVru3vzC.js} +1 -1
  119. package/dist/public/assets/{_BA8HFnO3.js → _CYjE__ml.js} +1 -1
  120. package/dist/public/assets/_CYjE__ml.js.br +0 -0
  121. package/dist/public/assets/{_dr95P55a.js → _CZ_OWtIT.js} +1 -1
  122. package/dist/public/assets/_CZ_OWtIT.js.br +0 -0
  123. package/dist/public/assets/{_BLTfQLdY.js → _C_37_B6u.js} +1 -1
  124. package/dist/public/assets/_C_37_B6u.js.br +0 -0
  125. package/dist/public/assets/{_xdrkfok5.js → _C_CIQL7J.js} +1 -1
  126. package/dist/public/assets/_C_CIQL7J.js.br +0 -0
  127. package/dist/public/assets/_C_WdpYbK.js +1 -0
  128. package/dist/public/assets/_CaiH3VN9.js +1 -0
  129. package/dist/public/assets/{_CCCQMLw5.js → _CamWDaoG.js} +1 -1
  130. package/dist/public/assets/_CamWDaoG.js.br +0 -0
  131. package/dist/public/assets/_CdDElA0V.js +1 -0
  132. package/dist/public/assets/_CfnsClzZ.js +1 -0
  133. package/dist/public/assets/{_SwbsOoi9.js → _Cgo1fRhJ.js} +1 -1
  134. package/dist/public/assets/_Cgo1fRhJ.js.br +0 -0
  135. package/dist/public/assets/_CjhGrlf3.js +1 -0
  136. package/dist/public/assets/_CjlbL4C_.js +1 -0
  137. package/dist/public/assets/_CjogTUXK.js +1 -0
  138. package/dist/public/assets/{_mnBdD4YN.js → _ClldMY37.js} +1 -1
  139. package/dist/public/assets/_ClldMY37.js.br +0 -0
  140. package/dist/public/assets/_CmFq6Gtp.js +1 -0
  141. package/dist/public/assets/_CoAPOKiP.js +1 -0
  142. package/dist/public/assets/_CoUUgh9P.js +1 -0
  143. package/dist/public/assets/{_s5Jez2mu.js → _CpjSCB1I.js} +1 -1
  144. package/dist/public/assets/_CpjSCB1I.js.br +0 -0
  145. package/dist/public/assets/{_DeN4EY8L.js → _Ct3RF80L.js} +1 -1
  146. package/dist/public/assets/_Ct3RF80L.js.br +0 -0
  147. package/dist/public/assets/_CtYy5eZs.js +1 -0
  148. package/dist/public/assets/{_BS4crAAm.js → _CxAPL49a.js} +1 -1
  149. package/dist/public/assets/_CxAPL49a.js.br +0 -0
  150. package/dist/public/assets/{_CwmzEsB4.js → _CyBCIknf.js} +1 -1
  151. package/dist/public/assets/_CyBCIknf.js.br +0 -0
  152. package/dist/public/assets/{_unfL8mz1.js → _Cz5BPBG8.js} +1 -1
  153. package/dist/public/assets/_Cz5BPBG8.js.br +0 -0
  154. package/dist/public/assets/_D-eEFXaI.js +1 -0
  155. package/dist/public/assets/{_gPFPzzPF.js → _D0aoEFRx.js} +1 -1
  156. package/dist/public/assets/_D0aoEFRx.js.br +0 -0
  157. package/dist/public/assets/{_CnKYioYw.js → _D1uRW1qz.js} +1 -1
  158. package/dist/public/assets/_D1uRW1qz.js.br +0 -0
  159. package/dist/public/assets/_D2oIr2T2.js +1 -0
  160. package/dist/public/assets/{_BBpX-M4b.js → _D2un443j.js} +1 -1
  161. package/dist/public/assets/_D2un443j.js.br +0 -0
  162. package/dist/public/assets/_D3MPx4-f.js +1 -0
  163. package/dist/public/assets/{_DzrtBP-L.js → _D4dJ2qEE.js} +1 -1
  164. package/dist/public/assets/{_Fzbz4zvE.js → _D4q8XSMI.js} +1 -1
  165. package/dist/public/assets/_D4q8XSMI.js.br +0 -0
  166. package/dist/public/assets/{_BxAl0m64.js → _D4quFMVQ.js} +1 -1
  167. package/dist/public/assets/_D4quFMVQ.js.br +0 -0
  168. package/dist/public/assets/{_pvS44-AC.js → _D4rOX-Fa.js} +1 -1
  169. package/dist/public/assets/_D4rOX-Fa.js.br +0 -0
  170. package/dist/public/assets/_D5edrSyA.js +1 -0
  171. package/dist/public/assets/{_DuXOUegE.js → _D6kktUFn.js} +1 -1
  172. package/dist/public/assets/_D6kktUFn.js.br +0 -0
  173. package/dist/public/assets/_D80-qtVY.js +1 -0
  174. package/dist/public/assets/_D9-3EVA4.js +1 -0
  175. package/dist/public/assets/{_CE5MhJWL.js → _D9sS4J_w.js} +1 -1
  176. package/dist/public/assets/_D9sS4J_w.js.br +0 -0
  177. package/dist/public/assets/_DBLpxTDi.js +1 -0
  178. package/dist/public/assets/{_CYNAhnRH.js → _DByHQ7nW.js} +6 -6
  179. package/dist/public/assets/_DByHQ7nW.js.br +0 -0
  180. package/dist/public/assets/{_D-hK5uFn.js → _DC-78WeM.js} +1 -1
  181. package/dist/public/assets/_DC-78WeM.js.br +0 -0
  182. package/dist/public/assets/{_DmDSLxrw.js → _DDl8KSWJ.js} +1 -1
  183. package/dist/public/assets/_DDl8KSWJ.js.br +0 -0
  184. package/dist/public/assets/{_C-6dImS5.js → _DFWOMF-B.js} +1 -1
  185. package/dist/public/assets/_DFWOMF-B.js.br +0 -0
  186. package/dist/public/assets/_DKb-rt9n.js +1 -0
  187. package/dist/public/assets/_DMnSJCF_.js +1 -0
  188. package/dist/public/assets/_DOOIlrPh.js +1 -0
  189. package/dist/public/assets/_DPW-0yKP.js +1 -0
  190. package/dist/public/assets/_DR3BmvWU.js +1 -0
  191. package/dist/public/assets/{_C9OdJcx4.js → _DSVLaMWS.js} +1 -1
  192. package/dist/public/assets/_DSVLaMWS.js.br +0 -0
  193. package/dist/public/assets/_DYNGNKLk.js +1 -0
  194. package/dist/public/assets/_DZnEgCbj.js +1 -0
  195. package/dist/public/assets/{_zKlxcAnQ.js → _DaMVRI8f.js} +1 -1
  196. package/dist/public/assets/_DaMVRI8f.js.br +0 -0
  197. package/dist/public/assets/{_DGTQBWy0.js → _DbvaGqOl.js} +1 -1
  198. package/dist/public/assets/_DbvaGqOl.js.br +0 -0
  199. package/dist/public/assets/{_DiqV5bDH.js → _DcMIlvz-.js} +1 -1
  200. package/dist/public/assets/_DcMIlvz-.js.br +0 -0
  201. package/dist/public/assets/{__Oa255vo.js → _Dd6X3e7w.js} +1 -1
  202. package/dist/public/assets/_Dd6X3e7w.js.br +0 -0
  203. package/dist/public/assets/{_BdvO5Lqa.js → _De7P3jUH.js} +1 -1
  204. package/dist/public/assets/_De7P3jUH.js.br +0 -0
  205. package/dist/public/assets/_DeiFEAar.js +1 -0
  206. package/dist/public/assets/{_vKQopDwG.js → _DfI982PI.js} +1 -1
  207. package/dist/public/assets/_DfI982PI.js.br +0 -0
  208. package/dist/public/assets/_DfZ6emcw.js +1 -0
  209. package/dist/public/assets/{_DxVt7Zuk.js → _Dj1lZ1pa.js} +4 -4
  210. package/dist/public/assets/_Dj1lZ1pa.js.br +0 -0
  211. package/dist/public/assets/{_DhEdzMUw.js → _DkCaEf_h.js} +1 -1
  212. package/dist/public/assets/_DkCaEf_h.js.br +0 -0
  213. package/dist/public/assets/_DonAis0J.js +1 -0
  214. package/dist/public/assets/{_BRG_DBcC.js → _Dp3IZdH8.js} +1 -1
  215. package/dist/public/assets/_Dp3IZdH8.js.br +0 -0
  216. package/dist/public/assets/{_unwtcXFQ.js → _DqYih4xk.js} +1 -1
  217. package/dist/public/assets/_DqYih4xk.js.br +0 -0
  218. package/dist/public/assets/{_BLRpf6Uw.js → _DqhphdU4.js} +1 -1
  219. package/dist/public/assets/_DqhphdU4.js.br +0 -0
  220. package/dist/public/assets/{_C87NBm9i.js → _DrIgZJzN.js} +1 -1
  221. package/dist/public/assets/_DrIgZJzN.js.br +0 -0
  222. package/dist/public/assets/_Dt4hHR05.js +1 -0
  223. package/dist/public/assets/_DtTbTraA.js +1 -0
  224. package/dist/public/assets/_DwMxAJKP.js +1 -0
  225. package/dist/public/assets/{_CttJbiei.js → _DxEm-Gwj.js} +1 -1
  226. package/dist/public/assets/_DxEm-Gwj.js.br +0 -0
  227. package/dist/public/assets/{_CdgAsi3s.js → _Dytf99zx.js} +1 -1
  228. package/dist/public/assets/_Dytf99zx.js.br +0 -0
  229. package/dist/public/assets/_EAgv5jR9.js +1 -0
  230. package/dist/public/assets/{_C9qO_dny.js → _Iecpd0kS.js} +1 -1
  231. package/dist/public/assets/_Iecpd0kS.js.br +0 -0
  232. package/dist/public/assets/{_DuGmU4h0.js → _MCwIJAuJ.js} +1 -1
  233. package/dist/public/assets/_MCwIJAuJ.js.br +0 -0
  234. package/dist/public/assets/{_BJRSndB4.js → _NM79Lu3L.js} +1 -1
  235. package/dist/public/assets/_NM79Lu3L.js.br +0 -0
  236. package/dist/public/assets/_QpNKKuS9.js +1 -0
  237. package/dist/public/assets/{_BbiACo0Y.js → _SGDxiwE1.js} +1 -1
  238. package/dist/public/assets/_SGDxiwE1.js.br +0 -0
  239. package/dist/public/assets/_TA8pE7z9.js +1 -0
  240. package/dist/public/assets/_bE4sNDeU.js +1 -0
  241. package/dist/public/assets/{_pUYwxsdF.js → _bcsuBP7T.js} +1 -1
  242. package/dist/public/assets/_bcsuBP7T.js.br +0 -0
  243. package/dist/public/assets/_cdcAU4yY.js +1 -0
  244. package/dist/public/assets/{_DhNuRs-V.js → _ch_yXAap.js} +1 -1
  245. package/dist/public/assets/_ch_yXAap.js.br +0 -0
  246. package/dist/public/assets/{_DaqT6m41.js → _d5u7EI97.js} +1 -1
  247. package/dist/public/assets/_d5u7EI97.js.br +0 -0
  248. package/dist/public/assets/{_C2ZpyiHV.js → _eoa1EOU-.js} +1 -1
  249. package/dist/public/assets/_eoa1EOU-.js.br +0 -0
  250. package/dist/public/assets/{_C1PmcEws.js → _j2tDSMvo.js} +1 -1
  251. package/dist/public/assets/_j2tDSMvo.js.br +0 -0
  252. package/dist/public/assets/_jNhIFgbc.js +1 -0
  253. package/dist/public/assets/_kDYiTaag.js +1 -0
  254. package/dist/public/assets/_lNMVVbUx.js +1 -0
  255. package/dist/public/assets/_nwJ7Hu3S.js +1 -0
  256. package/dist/public/assets/{_qJTL2ooe.js → _tmDtUACa.js} +1 -1
  257. package/dist/public/assets/_tmDtUACa.js.br +0 -0
  258. package/dist/public/assets/{_BewXp5Y_.js → _wXDh-Z2N.js} +1 -1
  259. package/dist/public/assets/_wXDh-Z2N.js.br +0 -0
  260. package/dist/public/assets/{_CB31bp-W.js → _wcshV0sZ.js} +1 -1
  261. package/dist/public/assets/_wcshV0sZ.js.br +0 -0
  262. package/dist/public/assets/_x-NwqgCn.js +1 -0
  263. package/dist/public/assets/{_BsimXDnm.js → _xyw_DS5P.js} +1 -1
  264. package/dist/public/assets/_xyw_DS5P.js.br +0 -0
  265. package/dist/public/assets/{_Aq9oGnRu.js → _zSAfqXcm.js} +1 -1
  266. package/dist/public/assets/_zSAfqXcm.js.br +0 -0
  267. package/dist/public/assets/{app-shell-CpPCwWPW.css → app-shell-ChQoVC5b.css} +1 -1
  268. package/dist/public/assets/app-shell-ChQoVC5b.css.br +0 -0
  269. package/dist/public/assets/files-view-CLtLp_BW.js +2 -0
  270. package/dist/public/assets/{files-view-DtI7JE-f.css → files-view-CNHQapdI.css} +1 -1
  271. package/dist/public/assets/files-view-CNHQapdI.css.br +0 -0
  272. package/dist/public/assets/group.css.ts-BG82htKb.css +1 -0
  273. package/dist/public/assets/group.css.ts-BG82htKb.css.br +0 -0
  274. package/dist/public/assets/icon-folder-DJOHuEpD.css +1 -0
  275. package/dist/public/assets/icon-folder-DJOHuEpD.css.br +0 -0
  276. package/dist/public/assets/{icon-search-DAtjHWFL.css → icon-search-DsJuFXUJ.css} +1 -1
  277. package/dist/public/assets/icon-search-DsJuFXUJ.css.br +0 -0
  278. package/dist/public/assets/manage-workspace-NBcFDyrB.js +2 -0
  279. package/dist/public/assets/manage-workspace-f_Np32TD.css +1 -0
  280. package/dist/public/assets/{modal-view-D0qnmuJE.css → modal-view-KVNBpNYi.css} +1 -1
  281. package/dist/public/assets/modal-view-KVNBpNYi.css.br +0 -0
  282. package/dist/public/assets/new-DHI77GvL.js +1 -0
  283. package/dist/public/assets/new-workspace-BFE-HpD_.css +1 -0
  284. package/dist/public/assets/new-workspace-BFE-HpD_.css.br +0 -0
  285. package/dist/public/assets/new-workspace-BRzimdd5.js +2 -0
  286. package/dist/public/assets/port-chip-CUUIDOVM.css +1 -0
  287. package/dist/public/assets/port-chip-CUUIDOVM.css.br +0 -0
  288. package/dist/public/assets/prompt-dialog-BGs6RXOV.css +1 -0
  289. package/dist/public/assets/prompt-dialog-BGs6RXOV.css.br +0 -0
  290. package/dist/public/assets/{quick-open-DVqzk3-g.css → quick-open-Gx4so1bl.css} +1 -1
  291. package/dist/public/assets/quick-open-Gx4so1bl.css.br +0 -0
  292. package/dist/public/assets/repo-picker-CUhd0vJN.css +1 -0
  293. package/dist/public/assets/repo-picker-CUhd0vJN.css.br +4 -0
  294. package/dist/public/assets/review-view-DFEK9VBa.js +2 -0
  295. package/dist/public/assets/{review-view-DqMrB4Ny.css → review-view-deUY3OE5.css} +1 -1
  296. package/dist/public/assets/review-view-deUY3OE5.css.br +0 -0
  297. package/dist/public/assets/section-CziSOSBR.css +1 -0
  298. package/dist/public/assets/section-CziSOSBR.css.br +0 -0
  299. package/dist/public/assets/settings-DHI77GvL.js +1 -0
  300. package/dist/public/assets/settings-page-OOtPOzIn.js +2 -0
  301. package/dist/public/assets/settings-page-wZhd7FLi.css +1 -0
  302. package/dist/public/assets/settings-page-wZhd7FLi.css.br +0 -0
  303. package/dist/public/assets/skill-row-BoCyFIXg.css +1 -0
  304. package/dist/public/assets/sso-auth-DV76tTpE.css +1 -0
  305. package/dist/public/assets/sso-auth-DV76tTpE.css.br +0 -0
  306. package/dist/public/assets/w-DHI77GvL.js +1 -0
  307. package/dist/public/assets/w._-DHI77GvL.js +1 -0
  308. package/dist/public/assets/w._-DsTgq3-C.js +1 -0
  309. package/dist/public/assets/w._-igEOSPR-.js +1 -0
  310. package/lib/review/markdown.mjs +5 -5
  311. package/lib/setup/bridge.d.mts +10 -0
  312. package/lib/setup/bridge.mjs +84 -0
  313. package/lib/setup/doctor.d.mts +5 -0
  314. package/lib/setup/doctor.mjs +45 -1
  315. package/lib/setup/install.d.mts +1 -0
  316. package/lib/setup/install.mjs +21 -1
  317. package/lib/setup/listen.mjs +2 -2
  318. package/lib/share/manifest.mjs +2 -1
  319. package/package.json +2 -3
  320. package/dist/_LF2Fo5WE.js +0 -2
  321. package/dist/public/assets/_--tE4Gxz.js.br +0 -0
  322. package/dist/public/assets/_1OL9vXM-.js +0 -1
  323. package/dist/public/assets/_2mnAZf6B.js.br +0 -0
  324. package/dist/public/assets/_5f9fMvWJ.js +0 -1
  325. package/dist/public/assets/_5y69OR6M.js +0 -1
  326. package/dist/public/assets/_Aq9oGnRu.js.br +0 -0
  327. package/dist/public/assets/_B0uJCjmk.js +0 -1
  328. package/dist/public/assets/_B1RldJ0S.js.br +0 -0
  329. package/dist/public/assets/_B5TpOQCZ.js +0 -1
  330. package/dist/public/assets/_B6UdulKa.js +0 -1
  331. package/dist/public/assets/_BA8HFnO3.js.br +0 -0
  332. package/dist/public/assets/_BAHrOydH.js.br +0 -0
  333. package/dist/public/assets/_BBpX-M4b.js.br +0 -0
  334. package/dist/public/assets/_BCZpExov.js.br +0 -0
  335. package/dist/public/assets/_BFZHNauV.js +0 -1
  336. package/dist/public/assets/_BJRSndB4.js.br +0 -0
  337. package/dist/public/assets/_BL9QMk_P.js.br +0 -0
  338. package/dist/public/assets/_BLNEzyb5.js +0 -1
  339. package/dist/public/assets/_BLRpf6Uw.js.br +0 -0
  340. package/dist/public/assets/_BLTfQLdY.js.br +0 -0
  341. package/dist/public/assets/_BO0OB-rz.js.br +0 -0
  342. package/dist/public/assets/_BPcswKMK.js.br +0 -0
  343. package/dist/public/assets/_BPhXWliU.js +0 -1
  344. package/dist/public/assets/_BQXTv9Cr.js +0 -1
  345. package/dist/public/assets/_BRG_DBcC.js.br +0 -0
  346. package/dist/public/assets/_BS4crAAm.js.br +0 -0
  347. package/dist/public/assets/_BVp6r0fg.js.br +0 -0
  348. package/dist/public/assets/_BXT2bXMi.js.br +0 -0
  349. package/dist/public/assets/_B_zyAtSJ.js.br +0 -0
  350. package/dist/public/assets/_BaXKdIeb.js +0 -1
  351. package/dist/public/assets/_BbiACo0Y.js.br +0 -0
  352. package/dist/public/assets/_BdvO5Lqa.js.br +0 -0
  353. package/dist/public/assets/_BeE9qDu0.js.br +0 -0
  354. package/dist/public/assets/_BewXp5Y_.js.br +0 -0
  355. package/dist/public/assets/_BfOOLKo5.js +0 -1
  356. package/dist/public/assets/_BhS8bTnr.js +0 -1
  357. package/dist/public/assets/_BhZ3ZoG0.js +0 -1
  358. package/dist/public/assets/_Bi3_ZsOQ.js +0 -1
  359. package/dist/public/assets/_Bj_Lfa8B.js +0 -1
  360. package/dist/public/assets/_BlN_x04q.js +0 -1
  361. package/dist/public/assets/_Bn5nsnie.js +0 -1
  362. package/dist/public/assets/_BnOOD6nr.js.br +0 -0
  363. package/dist/public/assets/_BnyLUTdO.js.br +0 -0
  364. package/dist/public/assets/_Bp_WT09q.js.br +0 -0
  365. package/dist/public/assets/_BsimXDnm.js.br +0 -0
  366. package/dist/public/assets/_BsupnkWM.js.br +0 -0
  367. package/dist/public/assets/_BxAl0m64.js.br +0 -0
  368. package/dist/public/assets/_C-6dImS5.js.br +0 -0
  369. package/dist/public/assets/_C18Torhh.js +0 -1
  370. package/dist/public/assets/_C1PmcEws.js.br +0 -0
  371. package/dist/public/assets/_C2ZpyiHV.js.br +0 -0
  372. package/dist/public/assets/_C3P1VHUI.js +0 -1
  373. package/dist/public/assets/_C6xwTKke.js +0 -1
  374. package/dist/public/assets/_C6yqlRfl.js +0 -1
  375. package/dist/public/assets/_C75D8bH2.js +0 -1
  376. package/dist/public/assets/_C87NBm9i.js.br +0 -0
  377. package/dist/public/assets/_C8Vc_vBH.js +0 -1
  378. package/dist/public/assets/_C9OdJcx4.js.br +0 -0
  379. package/dist/public/assets/_C9eoo0sE.js +0 -1
  380. package/dist/public/assets/_C9qO_dny.js.br +0 -0
  381. package/dist/public/assets/_CB31bp-W.js.br +0 -0
  382. package/dist/public/assets/_CCCQMLw5.js.br +0 -0
  383. package/dist/public/assets/_CCie36pi.js +0 -1
  384. package/dist/public/assets/_CDD9N34p.js +0 -1
  385. package/dist/public/assets/_CE5MhJWL.js.br +0 -0
  386. package/dist/public/assets/_CGLpCj_I.js.br +0 -0
  387. package/dist/public/assets/_CJ9j8N5Z.js.br +0 -0
  388. package/dist/public/assets/_CLDmR3jR.js.br +0 -0
  389. package/dist/public/assets/_CLerZOx-.js.br +0 -0
  390. package/dist/public/assets/_CM5GtJb2.js +0 -1
  391. package/dist/public/assets/_COECwOVb.js +0 -1
  392. package/dist/public/assets/_CSQE9nMN.js +0 -1
  393. package/dist/public/assets/_CSXMgHLQ.js +0 -1
  394. package/dist/public/assets/_CVRiByCT.js +0 -1
  395. package/dist/public/assets/_CVSrm4Pl.js +0 -1
  396. package/dist/public/assets/_CX1wufuh.js.br +0 -0
  397. package/dist/public/assets/_CYNAhnRH.js.br +0 -0
  398. package/dist/public/assets/_CZGS4T08.js.br +0 -0
  399. package/dist/public/assets/_C_L7l9Mg.js +0 -1
  400. package/dist/public/assets/_CaMrYy1W.js +0 -1
  401. package/dist/public/assets/_CdgAsi3s.js.br +0 -0
  402. package/dist/public/assets/_Ce-E7sJE.js +0 -1
  403. package/dist/public/assets/_Cg3S760D.js +0 -1
  404. package/dist/public/assets/_CicyY7KP.js +0 -1
  405. package/dist/public/assets/_Ck0YOw_7.js +0 -1
  406. package/dist/public/assets/_CmHlTZSs.js +0 -1
  407. package/dist/public/assets/_CnECYh66.js +0 -1
  408. package/dist/public/assets/_CnKYioYw.js.br +0 -0
  409. package/dist/public/assets/_CnUVvVPd.js +0 -1
  410. package/dist/public/assets/_CqSgGCGC.js +0 -1
  411. package/dist/public/assets/_CttJbiei.js.br +0 -0
  412. package/dist/public/assets/_CtyJUmXC.js.br +0 -0
  413. package/dist/public/assets/_Cw_8WbwF.js.br +0 -0
  414. package/dist/public/assets/_CwmzEsB4.js.br +0 -0
  415. package/dist/public/assets/_CzETFsJs.js +0 -1
  416. package/dist/public/assets/_D-S9H-tX.js +0 -1
  417. package/dist/public/assets/_D-hK5uFn.js.br +0 -0
  418. package/dist/public/assets/_D5fTwHXK.js +0 -1
  419. package/dist/public/assets/_D8u1YU9b.js.br +0 -0
  420. package/dist/public/assets/_DAH8evhA.js +0 -1
  421. package/dist/public/assets/_DAemmoHI.js +0 -1
  422. package/dist/public/assets/_DEMYxWZf.js +0 -1
  423. package/dist/public/assets/_DGTQBWy0.js.br +0 -0
  424. package/dist/public/assets/_DHhv0pCA.js +0 -1
  425. package/dist/public/assets/_DI0QHEXB.js.br +0 -0
  426. package/dist/public/assets/_DJ3UAR_s.js.br +0 -0
  427. package/dist/public/assets/_DKu6UxI7.js +0 -1
  428. package/dist/public/assets/_DNC-9RBN.js +0 -1
  429. package/dist/public/assets/_DP-Bu7ET.js +0 -1
  430. package/dist/public/assets/_DYmmPBcq.js +0 -1
  431. package/dist/public/assets/_Da2Dmt_d.js.br +0 -0
  432. package/dist/public/assets/_DaqT6m41.js.br +0 -0
  433. package/dist/public/assets/_DbVyutEZ.js +0 -1
  434. package/dist/public/assets/_DcBvO2Si.js +0 -1
  435. package/dist/public/assets/_DeCJ44Me.js.br +0 -0
  436. package/dist/public/assets/_DeN4EY8L.js.br +0 -0
  437. package/dist/public/assets/_DhEdzMUw.js.br +0 -0
  438. package/dist/public/assets/_DhNuRs-V.js.br +0 -0
  439. package/dist/public/assets/_DiqV5bDH.js.br +0 -0
  440. package/dist/public/assets/_Diqt_yCf.js +0 -1
  441. package/dist/public/assets/_DlpTErRA.js.br +0 -0
  442. package/dist/public/assets/_DmDSLxrw.js.br +0 -0
  443. package/dist/public/assets/_DoC0qbSD.js +0 -1
  444. package/dist/public/assets/_DoCtdMd2.js.br +0 -0
  445. package/dist/public/assets/_DpqWFkMg.js +0 -1
  446. package/dist/public/assets/_Dr0Bkgso.js +0 -1
  447. package/dist/public/assets/_Dt-n9FaQ.js +0 -1
  448. package/dist/public/assets/_DtOzdwHm.js.br +0 -0
  449. package/dist/public/assets/_DuGmU4h0.js.br +0 -0
  450. package/dist/public/assets/_DuXOUegE.js.br +0 -0
  451. package/dist/public/assets/_DuaocJd1.js +0 -1
  452. package/dist/public/assets/_DuarImb7.js.br +0 -0
  453. package/dist/public/assets/_DwcoW-IU.js.br +0 -0
  454. package/dist/public/assets/_DxVt7Zuk.js.br +0 -0
  455. package/dist/public/assets/_Fzbz4zvE.js.br +0 -0
  456. package/dist/public/assets/_I5oX-lGP.js +0 -1
  457. package/dist/public/assets/_IWMmnVCy.js.br +0 -0
  458. package/dist/public/assets/_O70J1Mfv.js.br +0 -0
  459. package/dist/public/assets/_SwbsOoi9.js.br +0 -0
  460. package/dist/public/assets/_Yy39CykK.js +0 -1
  461. package/dist/public/assets/__Oa255vo.js.br +0 -0
  462. package/dist/public/assets/_bPze7k1x.js +0 -1
  463. package/dist/public/assets/_bU1KcT1I.js +0 -1
  464. package/dist/public/assets/_dr95P55a.js.br +0 -0
  465. package/dist/public/assets/_eQK3EZCc.js.br +0 -0
  466. package/dist/public/assets/_gPFPzzPF.js.br +0 -0
  467. package/dist/public/assets/_hzpOPZUB.js +0 -1
  468. package/dist/public/assets/_ifUb4WX7.js.br +0 -0
  469. package/dist/public/assets/_kQ7LiSim.js +0 -1
  470. package/dist/public/assets/_lOAW1VLM.js +0 -1
  471. package/dist/public/assets/_mnBdD4YN.js.br +0 -0
  472. package/dist/public/assets/_odBcV1kc.js +0 -1
  473. package/dist/public/assets/_pP1W6w5v.js.br +0 -0
  474. package/dist/public/assets/_pUYwxsdF.js.br +0 -0
  475. package/dist/public/assets/_pvS44-AC.js.br +0 -0
  476. package/dist/public/assets/_qJTL2ooe.js.br +0 -0
  477. package/dist/public/assets/_s5Jez2mu.js.br +0 -0
  478. package/dist/public/assets/_unfL8mz1.js.br +0 -0
  479. package/dist/public/assets/_unwtcXFQ.js.br +0 -0
  480. package/dist/public/assets/_vKQopDwG.js.br +0 -0
  481. package/dist/public/assets/_w1aegGdT.js +0 -1
  482. package/dist/public/assets/_xdrkfok5.js.br +0 -0
  483. package/dist/public/assets/_y-lm36fI.js +0 -1
  484. package/dist/public/assets/_zKlxcAnQ.js.br +0 -0
  485. package/dist/public/assets/app-shell-CpPCwWPW.css.br +0 -0
  486. package/dist/public/assets/files-view-BfCdcfXX.js +0 -2
  487. package/dist/public/assets/files-view-DtI7JE-f.css.br +0 -0
  488. package/dist/public/assets/group.css.ts-SeaNz7WZ.css +0 -1
  489. package/dist/public/assets/group.css.ts-SeaNz7WZ.css.br +0 -0
  490. package/dist/public/assets/icon-folder-DHVc-REl.css +0 -1
  491. package/dist/public/assets/icon-folder-DHVc-REl.css.br +0 -0
  492. package/dist/public/assets/icon-search-DAtjHWFL.css.br +0 -0
  493. package/dist/public/assets/manage-workspace-6i6Zeai7.css +0 -1
  494. package/dist/public/assets/manage-workspace-CixeMkdt.js +0 -2
  495. package/dist/public/assets/modal-view-D0qnmuJE.css.br +0 -0
  496. package/dist/public/assets/new-DxhaKmbF.js +0 -1
  497. package/dist/public/assets/new-workspace-BXjDRbqF.css +0 -1
  498. package/dist/public/assets/new-workspace-BXjDRbqF.css.br +0 -0
  499. package/dist/public/assets/new-workspace-DG693v2S.js +0 -2
  500. package/dist/public/assets/port-chip-Lz3mVJWb.css +0 -1
  501. package/dist/public/assets/port-chip-Lz3mVJWb.css.br +0 -0
  502. package/dist/public/assets/prompt-dialog-vhnae1-x.css +0 -1
  503. package/dist/public/assets/prompt-dialog-vhnae1-x.css.br +0 -0
  504. package/dist/public/assets/quick-open-DVqzk3-g.css.br +0 -0
  505. package/dist/public/assets/repo-picker-K5RYsEge.css +0 -1
  506. package/dist/public/assets/repo-picker-K5RYsEge.css.br +0 -0
  507. package/dist/public/assets/review-view-DqMrB4Ny.css.br +0 -0
  508. package/dist/public/assets/review-view-TdLbCgEg.js +0 -2
  509. package/dist/public/assets/section-2MyJSq5D.css +0 -1
  510. package/dist/public/assets/section-2MyJSq5D.css.br +0 -0
  511. package/dist/public/assets/settings-DxhaKmbF.js +0 -1
  512. package/dist/public/assets/settings-page-BBAG94Vh.js +0 -2
  513. package/dist/public/assets/settings-page-DUefc32x.css +0 -1
  514. package/dist/public/assets/settings-page-DUefc32x.css.br +0 -0
  515. package/dist/public/assets/skill-row-BeOk8NK8.css +0 -1
  516. package/dist/public/assets/sso-auth-CU3fGJ4U.css +0 -1
  517. package/dist/public/assets/sso-auth-CU3fGJ4U.css.br +0 -0
  518. package/dist/public/assets/w-DxhaKmbF.js +0 -1
  519. package/dist/public/assets/w._-C6JVdFgi.js +0 -1
  520. package/dist/public/assets/w._-DxhaKmbF.js +0 -1
  521. package/dist/public/assets/w._-rfvcDGPk.js +0 -1
  522. package/scripts/migrate.mjs +0 -682
@@ -1,682 +0,0 @@
1
- #!/usr/bin/env node
2
- // migrate.mjs — one-shot cleanups for changes between versions, run by
3
- // `work setup` and `work migrate` (update.sh) so the runtime stays free of
4
- // legacy handling. The machine repairs run every time; the database's
5
- // sweeps run once, while it is below schema version 1 (`PRAGMA
6
- // user_version`), which this script then stamps — the baseline 0.1
7
- // upgrades from. `npx @dylanpiercey/work@<this version> migrate` is how a
8
- // later version brings an older database up to it.
9
- import crypto from "node:crypto";
10
- import { execFileSync } from "node:child_process";
11
- import fs from "node:fs";
12
- import os from "node:os";
13
- import path from "node:path";
14
- import { DatabaseSync } from "node:sqlite";
15
- import { dialHost } from "../lib/setup/listen.mjs";
16
-
17
- const dataDir =
18
- process.env.WORK_DATA_DIR ||
19
- path.join(
20
- process.env.XDG_DATA_HOME || path.join(os.homedir(), ".local", "share"),
21
- "work",
22
- );
23
- const dbPath = path.join(dataDir, "work.db");
24
-
25
- // Machine repairs that need no db come first: a fresh install, or one whose
26
- // data dir this environment does not name, stops at the check below.
27
-
28
- // `gh auth setup-git` bakes the absolute path of the gh binary into
29
- // ~/.gitconfig, and git runs that string literally rather than looking gh up
30
- // on PATH. Where gh came from a version manager that path dies on the next gh
31
- // upgrade, and every https push fails with "could not read Username" — a
32
- // break with no visible cause, since `gh` itself still works. Repoint any
33
- // helper naming a gh that no longer exists at the launcher on PATH.
34
- {
35
- const versioned = /\/(installs|Cellar|versions|toolchains)\//;
36
- const git = (args) => execFileSync("git", args, { encoding: "utf8" }).trim();
37
- try {
38
- let gh = "";
39
- try {
40
- // Quietly: with no gh there is nothing to repair, and this runs on
41
- // every setup, fresh installs included.
42
- gh = execFileSync("which", ["gh"], {
43
- encoding: "utf8",
44
- stdio: ["ignore", "pipe", "ignore"],
45
- }).trim();
46
- } catch {}
47
- if (gh && !versioned.test(gh)) {
48
- let lines = [];
49
- try {
50
- lines = git([
51
- "config",
52
- "--global",
53
- "--get-regexp",
54
- String.raw`^credential\..*\.helper$`,
55
- ])
56
- .split("\n")
57
- .filter(Boolean);
58
- } catch {} // no such entries — nothing to repair
59
- let fixed = 0;
60
- for (const line of lines) {
61
- const sp = line.indexOf(" ");
62
- const [key, value] = [line.slice(0, sp), line.slice(sp + 1)];
63
- const bin = /^!(\S+) auth git-credential$/.exec(value)?.[1];
64
- if (!bin || bin === gh || fs.existsSync(bin)) continue;
65
- git([
66
- "config",
67
- "--global",
68
- "--replace-all",
69
- key,
70
- `!${gh} auth git-credential`,
71
- "auth git-credential",
72
- ]);
73
- fixed++;
74
- }
75
- if (fixed)
76
- console.log(
77
- `==> migrate: repaired ${fixed} stale gh credential helper(s)`,
78
- );
79
- }
80
- } catch {}
81
- }
82
-
83
- // Grok's hook registry ($GROK_HOME/hooks-paths) names work's hook file by
84
- // absolute path. A line left by a data dir since moved or removed (a
85
- // scratch server's temp dir, an uninstall) names nothing, and Grok's
86
- // sandbox refuses to start while one does. The app drops them as it
87
- // registers; this reaches machines that stopped launching Grok. Keep in
88
- // sync with registerHooks in src/agents/grok/index.ts.
89
- {
90
- try {
91
- const registry = path.join(
92
- process.env.GROK_HOME || path.join(os.homedir(), ".grok"),
93
- "hooks-paths",
94
- );
95
- const current = fs.readFileSync(registry, "utf8");
96
- const lines = current.split("\n");
97
- const kept = lines.filter((line) => {
98
- const target = line.trim();
99
- return !target.endsWith("/grok-hooks.json") || fs.existsSync(target);
100
- });
101
- if (kept.length !== lines.length) {
102
- fs.writeFileSync(registry, kept.join("\n"));
103
- console.log(
104
- `==> migrate: dropped ${lines.length - kept.length} stale Grok hook registry line(s)`,
105
- );
106
- }
107
- } catch {} // no registry — nothing to clean
108
- }
109
-
110
- if (!fs.existsSync(dbPath)) process.exit(0);
111
-
112
- /** A write connection that waits out the running server's transactions, as
113
- * db.ts does: setup and update.sh migrate while the old server still runs,
114
- * and a lock thrown here would end the script before every later sweep. */
115
- function writer() {
116
- const wr = new DatabaseSync(dbPath);
117
- wr.exec("PRAGMA busy_timeout = 5000");
118
- return wr;
119
- }
120
-
121
- // Version 1 is exactly the schema below: every table the app keeps, with
122
- // the columns later releases added, and nothing it retired. A database at
123
- // it has had the sweeps; one below it gets them now, then the stamp.
124
- {
125
- const wr = writer();
126
- try {
127
- if (wr.prepare("PRAGMA user_version").get().user_version >= 1)
128
- process.exit(0);
129
- // Keep in sync with src/server/db.ts: this is the schema a version-1
130
- // database has, whichever of the two brought it there.
131
- wr.exec(`
132
- CREATE TABLE IF NOT EXISTS workspaces (
133
- id TEXT PRIMARY KEY,
134
- name TEXT NOT NULL,
135
- path TEXT NOT NULL UNIQUE,
136
- branch TEXT NOT NULL,
137
- status TEXT NOT NULL DEFAULT 'active' CHECK (status IN ('active', 'archived')),
138
- created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
139
- );
140
- CREATE TABLE IF NOT EXISTS repos (
141
- workspace_id TEXT NOT NULL REFERENCES workspaces(id) ON DELETE CASCADE,
142
- full_name TEXT NOT NULL,
143
- worktree TEXT NOT NULL,
144
- base_branch TEXT NOT NULL,
145
- default_branch TEXT NOT NULL,
146
- PRIMARY KEY (workspace_id, full_name)
147
- );
148
- CREATE TABLE IF NOT EXISTS sessions (
149
- id TEXT PRIMARY KEY,
150
- workspace_id TEXT REFERENCES workspaces(id) ON DELETE SET NULL,
151
- agent TEXT NOT NULL,
152
- title TEXT,
153
- created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
154
- );
155
- CREATE TABLE IF NOT EXISTS settings (
156
- key TEXT PRIMARY KEY,
157
- value TEXT NOT NULL
158
- );
159
- CREATE TABLE IF NOT EXISTS review_comments (
160
- id INTEGER PRIMARY KEY AUTOINCREMENT,
161
- workspace_id TEXT NOT NULL REFERENCES workspaces(id) ON DELETE CASCADE,
162
- worktree TEXT NOT NULL,
163
- path TEXT NOT NULL,
164
- side TEXT NOT NULL DEFAULT 'additions',
165
- line_start INTEGER NOT NULL,
166
- line_end INTEGER NOT NULL,
167
- text TEXT NOT NULL,
168
- created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
169
- );
170
- CREATE TABLE IF NOT EXISTS push_subscriptions (
171
- endpoint TEXT PRIMARY KEY,
172
- data TEXT NOT NULL
173
- );
174
- CREATE TABLE IF NOT EXISTS dismissed_prs (
175
- workspace_id TEXT NOT NULL REFERENCES workspaces(id) ON DELETE CASCADE,
176
- full_name TEXT NOT NULL,
177
- number INTEGER NOT NULL,
178
- PRIMARY KEY (workspace_id, full_name, number)
179
- );
180
- CREATE TABLE IF NOT EXISTS review_marks (
181
- workspace_id TEXT NOT NULL REFERENCES workspaces(id) ON DELETE CASCADE,
182
- worktree TEXT NOT NULL,
183
- branch TEXT NOT NULL,
184
- path TEXT NOT NULL,
185
- fingerprint TEXT NOT NULL,
186
- PRIMARY KEY (workspace_id, worktree, branch, path)
187
- );
188
- `);
189
- for (const [table, column, decl] of [
190
- ["review_comments", "head", "TEXT"],
191
- ["review_comments", "snippet", "TEXT"],
192
- ["workspaces", "materialized", "INTEGER NOT NULL DEFAULT 1"],
193
- ["workspaces", "origin_branch", "TEXT"],
194
- ["workspaces", "imported_at", "TEXT"],
195
- ]) {
196
- const cols = wr.prepare(`PRAGMA table_info(${table})`).all();
197
- if (!cols.some((c) => c.name === column))
198
- wr.exec(`ALTER TABLE ${table} ADD COLUMN ${column} ${decl}`);
199
- }
200
- } finally {
201
- wr.close();
202
- }
203
- }
204
-
205
- const db = new DatabaseSync(dbPath, { readOnly: true });
206
-
207
- // Pre-scrape versions wrote agent hook files into every workspace
208
- // (identified by their agent-state callback); state now comes from
209
- // terminal scraping and launch flags, so sweep them out.
210
- const LEGACY_HOOK_FILES = [
211
- ".claude/settings.json",
212
- ".codex/hooks.json",
213
- ".cursor/hooks.json",
214
- ".cursor/hooks/work-working.sh",
215
- ".cursor/hooks/work-done.sh",
216
- ".github/hooks/work-agent-state.json",
217
- ];
218
-
219
- let removed = 0;
220
- for (const { path: wsPath } of db
221
- .prepare("SELECT path FROM workspaces")
222
- .all()) {
223
- for (const rel of LEGACY_HOOK_FILES) {
224
- const file = path.join(wsPath, rel);
225
- try {
226
- const text = fs.readFileSync(file, "utf8");
227
- if (
228
- !text.includes("/api/agent-state") &&
229
- !text.includes(".cursor/hooks/work-")
230
- ) {
231
- continue;
232
- }
233
- fs.rmSync(file);
234
- removed++;
235
- // Prune now-empty dirs the old version created.
236
- for (
237
- let dir = path.dirname(file);
238
- dir !== wsPath && !fs.readdirSync(dir).length;
239
- dir = path.dirname(dir)
240
- ) {
241
- fs.rmdirSync(dir);
242
- }
243
- } catch {}
244
- }
245
- }
246
- if (removed) console.log(`==> migrate: removed ${removed} legacy hook file(s)`);
247
-
248
- // Default review base/algorithm changed (workspace branch vs origin/<base>,
249
- // containment empty-check, then commit-to-commit). Existing comments are
250
- // keyed only by path+line, so they would silently re-anchor: wipe them
251
- // once. db.ts sets the flag on a db it creates, which has no such comments
252
- // to wipe. The viewed flags of that time go with their table, below.
253
- {
254
- const wr = writer();
255
- try {
256
- const FLAG = "review-cleared-diff-v2";
257
- const seen = wr.prepare("SELECT 1 FROM settings WHERE key = ?").get(FLAG);
258
- if (!seen) {
259
- const comments = wr.prepare("DELETE FROM review_comments").run();
260
- wr.prepare("INSERT INTO settings (key, value) VALUES (?, '1')").run(FLAG);
261
- if (comments.changes) {
262
- console.log(
263
- `==> migrate: cleared ${comments.changes} review comment(s)`,
264
- );
265
- }
266
- }
267
- } finally {
268
- wr.close();
269
- }
270
- }
271
-
272
- // The review flagged what moved since the reviewer's last visit, from a
273
- // head per section kept in `review.seen:<ws>`. Viewed marks replace it
274
- // (review_marks, src/server/viewed.ts): each head becomes a visit to its
275
- // section's branch, which the server turns into per-file marks at that
276
- // head when it next shows the section (a PR's under `#<number>`, the
277
- // only name its section had). The working-tree hashes beside the heads
278
- // name no branch's change and go. So does the table of the viewed flags
279
- // of that time, which nothing reads.
280
- {
281
- const wr = writer();
282
- try {
283
- const insert = wr.prepare(
284
- "INSERT OR IGNORE INTO review_marks (workspace_id, worktree, branch, path, fingerprint) VALUES (?, ?, ?, '', ?)",
285
- );
286
- let visits = 0;
287
- for (const { key, value } of wr
288
- .prepare("SELECT key, value FROM settings WHERE key GLOB 'review.seen:*'")
289
- .all()) {
290
- const id = key.slice("review.seen:".length);
291
- const ws = wr
292
- .prepare("SELECT branch FROM workspaces WHERE id = ?")
293
- .get(id);
294
- let heads = {};
295
- try {
296
- heads = JSON.parse(value)?.heads ?? {};
297
- } catch {}
298
- for (const [section, head] of Object.entries(ws ? heads : {})) {
299
- // `worktree`, `worktree@topic` or `worktree#pr`.
300
- const m = /^([^@#]+)(?:@(.+)|#(\d+))?$/.exec(section);
301
- if (!m || typeof head !== "string" || !/^[0-9a-f]{40,64}$/.test(head))
302
- continue;
303
- const branch = m[2]
304
- ? `${ws.branch}-${m[2]}`
305
- : m[3]
306
- ? `#${m[3]}`
307
- : ws.branch;
308
- insert.run(id, m[1], branch, `seen:${head}`);
309
- visits++;
310
- }
311
- wr.prepare("DELETE FROM settings WHERE key = ?").run(key);
312
- }
313
- if (visits)
314
- console.log(
315
- `==> migrate: carried ${visits} review visit(s) over to Viewed marks`,
316
- );
317
- wr.exec("DROP TABLE IF EXISTS review_viewed");
318
- } finally {
319
- wr.close();
320
- }
321
- }
322
-
323
- // Backfill the push-signal hook into bare caches that predate it (new
324
- // caches get it from ensureBare — keep this script in sync with
325
- // src/server/repo-events.ts).
326
- const workRoot = process.env.WORK_ROOT || path.join(os.homedir(), "work");
327
- const gitHost = "github.com";
328
- const appPort = Number(process.env.WORK_APP_PORT || 7171);
329
- // Same token file the server uses (src/server/hook-token.ts) — hooks ride
330
- // the public port and the endpoint refuses pings without it. dataDir is
331
- // declared at the top of this script.
332
- const tokenFile = path.join(dataDir, "hook-token");
333
- let hookTokenValue = "";
334
- try {
335
- hookTokenValue = fs.readFileSync(tokenFile, "utf8").trim();
336
- } catch {}
337
- if (!hookTokenValue) {
338
- hookTokenValue = crypto.randomBytes(16).toString("hex");
339
- fs.mkdirSync(dataDir, { recursive: true });
340
- fs.writeFileSync(tokenFile, `${hookTokenValue}\n`, { mode: 0o600 });
341
- }
342
- const cacheHost = path.join(workRoot, ".cache", gitHost);
343
- let hooked = 0;
344
- try {
345
- for (const owner of fs.readdirSync(cacheHost)) {
346
- const ownerDir = path.join(cacheHost, owner);
347
- for (const repoDir of fs.readdirSync(ownerDir)) {
348
- if (!repoDir.endsWith(".git")) continue;
349
- const fullName = `${owner}/${repoDir.slice(0, -4)}`;
350
- const script =
351
- `#!/bin/sh\n` +
352
- `# installed by work: signals ref updates to the app server.\n` +
353
- `[ "$1" = "committed" ] || exit 0\n` +
354
- `refs=$(cat)\n` +
355
- `case "$refs" in *"refs/remotes/origin/"*) ;; *) exit 0 ;; esac\n` +
356
- `printf '%s\\n' "$refs" | curl -sf -m 2 -X POST --data-binary @- "http://${dialHost(process.env.WORK_LISTEN)}:${appPort}` +
357
- `/api/repo-pushed?repo=${encodeURIComponent(fullName)}&token=${hookTokenValue}" >/dev/null 2>&1 &\n` +
358
- `exit 0\n`;
359
- const file = path.join(
360
- ownerDir,
361
- repoDir,
362
- "hooks",
363
- "reference-transaction",
364
- );
365
- let current = "";
366
- try {
367
- current = fs.readFileSync(file, "utf8");
368
- } catch {}
369
- try {
370
- if (current !== script) {
371
- fs.mkdirSync(path.dirname(file), { recursive: true });
372
- fs.writeFileSync(file, script, { mode: 0o700 });
373
- hooked++;
374
- }
375
- // It carries the hook token: this user's alone.
376
- fs.chmodSync(file, 0o700);
377
- } catch {}
378
- }
379
- }
380
- } catch {}
381
- if (hooked)
382
- console.log(`==> migrate: installed push hook in ${hooked} cache repo(s)`);
383
-
384
- // Lane branches used to accumulate in the bare caches: nothing deleted one
385
- // when its PR finished, only removing the repo or the whole workspace did,
386
- // and a long-lived workspace here reached 66 of them against a single live
387
- // branch. The app now prunes a lane when its merged PR is dismissed (see
388
- // pruneLaneBranch in src/server/workspaces.ts), which only reaches lanes
389
- // finished from here on — so sweep the backlog once, with the same guards.
390
- // Best-effort: without gh, a token, or the network this does nothing.
391
- const laneWorkspaces = db
392
- .prepare("SELECT id, branch FROM workspaces")
393
- .all()
394
- .map((w) => ({ ...w, repos: [] }));
395
- for (const row of db
396
- .prepare("SELECT workspace_id, full_name FROM repos")
397
- .all()) {
398
- laneWorkspaces
399
- .find((w) => w.id === row.workspace_id)
400
- ?.repos.push(row.full_name);
401
- }
402
- const ownsRef = (ref, prefix) => ref === prefix || ref.startsWith(`${prefix}-`);
403
- const gitIn = (dir, args) =>
404
- execFileSync("git", ["-C", dir, ...args], {
405
- encoding: "utf8",
406
- stdio: ["ignore", "pipe", "ignore"],
407
- });
408
-
409
- // Candidate lanes: owned by a workspace branch, not the branch itself, not
410
- // claimed by another workspace whose branch extends this one's prefix, and
411
- // not checked out in a worktree.
412
- const candidates = [];
413
- for (const ws of laneWorkspaces) {
414
- const others = laneWorkspaces
415
- .filter((w) => w.id !== ws.id)
416
- .map((w) => w.branch);
417
- for (const fullName of ws.repos) {
418
- const bare = path.join(cacheHost, `${fullName}.git`);
419
- let refs, checkedOut;
420
- try {
421
- refs = gitIn(bare, [
422
- "for-each-ref",
423
- "--format=%(refname:short) %(objectname)",
424
- "refs/heads/",
425
- ])
426
- .split("\n")
427
- .filter(Boolean)
428
- .map((line) => line.split(" "));
429
- checkedOut = new Set(
430
- gitIn(bare, ["worktree", "list", "--porcelain"])
431
- .split("\n")
432
- .filter((l) => l.startsWith("branch refs/heads/"))
433
- .map((l) => l.slice("branch refs/heads/".length)),
434
- );
435
- } catch {
436
- continue;
437
- }
438
- for (const [lane, oid] of refs) {
439
- if (lane === ws.branch || !ownsRef(lane, ws.branch)) continue;
440
- if (others.some((b) => ownsRef(lane, b)) || checkedOut.has(lane))
441
- continue;
442
- candidates.push({ bare, fullName, lane, oid });
443
- }
444
- }
445
- }
446
-
447
- let pruned = 0;
448
- for (let i = 0; i < candidates.length; i += 40) {
449
- const chunk = candidates.slice(i, i + 40);
450
- // One aliased query per chunk rather than a request per lane.
451
- const query =
452
- "query {" +
453
- chunk
454
- .map(({ fullName, lane }, n) => {
455
- const [owner, name] = fullName.split("/");
456
- return (
457
- `l${n}: repository(owner: ${JSON.stringify(owner)}, name: ${JSON.stringify(name)}) {` +
458
- ` pullRequests(headRefName: ${JSON.stringify(lane)}, first: 5) {` +
459
- " nodes { state headRefOid } } }"
460
- );
461
- })
462
- .join(" ") +
463
- "}";
464
- let data;
465
- try {
466
- data = JSON.parse(
467
- execFileSync("gh", ["api", "graphql", "-f", `query=${query}`], {
468
- encoding: "utf8",
469
- stdio: ["ignore", "pipe", "ignore"],
470
- }),
471
- ).data;
472
- } catch {
473
- break;
474
- }
475
- chunk.forEach((c, n) => {
476
- const nodes = data?.[`l${n}`]?.pullRequests?.nodes;
477
- if (!nodes?.length || nodes.some((p) => p.state === "OPEN")) return;
478
- // The lane has to still be sitting on the finished PR's head: anything
479
- // further along is work that PR never carried, and deleting it here
480
- // would be the only copy.
481
- if (!nodes.some((p) => p.state !== "OPEN" && p.headRefOid === c.oid))
482
- return;
483
- try {
484
- gitIn(c.bare, ["branch", "-D", c.lane]);
485
- pruned++;
486
- } catch {}
487
- });
488
- }
489
- if (pruned)
490
- console.log(`==> migrate: pruned ${pruned} finished lane branch(es)`);
491
-
492
- // Caches made with `git clone --bare` (every cache before init+fetch in
493
- // ensureBare) copied each remote branch into refs/heads, so a cache carries
494
- // every branch anyone ever pushed as a local head of its own. Drop the
495
- // mirrors: a head that no worktree checks out, no workspace here owns,
496
- // and that still sits exactly on its origin counterpart — the last guard
497
- // keeps anything with local-only commits, whoever made it.
498
- const ownedPrefixes = db
499
- .prepare("SELECT branch FROM workspaces")
500
- .all()
501
- .map((w) => w.branch);
502
- let mirrors = 0;
503
- try {
504
- const cacheRoot = path.join(workRoot, ".cache");
505
- for (const host of fs.readdirSync(cacheRoot)) {
506
- const hostDir = path.join(cacheRoot, host);
507
- if (!fs.statSync(hostDir).isDirectory()) continue;
508
- for (const owner of fs.readdirSync(hostDir)) {
509
- const ownerDir = path.join(hostDir, owner);
510
- if (!fs.statSync(ownerDir).isDirectory()) continue;
511
- for (const repoDir of fs.readdirSync(ownerDir)) {
512
- if (!repoDir.endsWith(".git")) continue;
513
- const bare = path.join(ownerDir, repoDir);
514
- let heads, remotes, checkedOut;
515
- try {
516
- const refLines = (glob) =>
517
- gitIn(bare, [
518
- "for-each-ref",
519
- "--format=%(refname) %(objectname)",
520
- glob,
521
- ])
522
- .split("\n")
523
- .filter(Boolean)
524
- .map((l) => l.split(" "));
525
- heads = refLines("refs/heads/");
526
- remotes = new Map(
527
- refLines("refs/remotes/origin/").map(([ref, oid]) => [
528
- ref.slice("refs/remotes/origin/".length),
529
- oid,
530
- ]),
531
- );
532
- checkedOut = new Set(
533
- gitIn(bare, ["worktree", "list", "--porcelain"])
534
- .split("\n")
535
- .filter((l) => l.startsWith("branch refs/heads/"))
536
- .map((l) => l.slice("branch refs/heads/".length)),
537
- );
538
- } catch {
539
- continue;
540
- }
541
- for (const [ref, oid] of heads) {
542
- const name = ref.slice("refs/heads/".length);
543
- if (checkedOut.has(name)) continue;
544
- if (ownedPrefixes.some((b) => ownsRef(name, b))) continue;
545
- if (remotes.get(name) !== oid) continue;
546
- try {
547
- gitIn(bare, ["branch", "-D", name]);
548
- mirrors++;
549
- } catch {}
550
- }
551
- }
552
- }
553
- }
554
- } catch {}
555
- if (mirrors)
556
- console.log(`==> migrate: dropped ${mirrors} mirrored remote branch(es)`);
557
-
558
- // Per-workspace UI prefs were never swept on delete; they ride every SSR
559
- // document via allPrefs(). Prune orphans once — runtime delete handles new ones.
560
- {
561
- const wr = writer();
562
- try {
563
- const live = new Set(
564
- wr
565
- .prepare("SELECT id FROM workspaces")
566
- .all()
567
- .map((r) => r.id),
568
- );
569
- // Kept equal to WORKSPACE_PREFS in src/server/settings.ts, a .ts file
570
- // this plain script cannot import.
571
- const prefixes = [
572
- "tab",
573
- "diff-filter",
574
- "diff-folded",
575
- "diff-collapsed",
576
- "diff-focus",
577
- "diff-pos",
578
- "files-recent",
579
- ].map((name) => `ui.${name}:`);
580
- let pruned = 0;
581
- for (const prefix of prefixes) {
582
- for (const { key } of wr
583
- .prepare("SELECT key FROM settings WHERE key GLOB ?")
584
- .all(prefix + "*")) {
585
- if (live.has(key.slice(prefix.length))) continue;
586
- wr.prepare("DELETE FROM settings WHERE key = ?").run(key);
587
- pruned++;
588
- }
589
- }
590
- if (pruned)
591
- console.log(`==> migrate: pruned ${pruned} orphaned ui pref(s)`);
592
- } finally {
593
- wr.close();
594
- }
595
- }
596
-
597
- // The review's two-way toggle (`ui.diff-uncommitted`) became the three-way
598
- // `diff-scope` pref, and nothing reads the old row: drop it, since it rides
599
- // every SSR prefs payload. Not folded into the scope: that would switch
600
- // long-time users to uncommitted changes without their asking.
601
- {
602
- const wr = writer();
603
- try {
604
- const dropped = wr
605
- .prepare(
606
- "DELETE FROM settings WHERE key IN ('ui.diff-uncommitted', 'diff-uncommitted')",
607
- )
608
- .run();
609
- if (dropped.changes)
610
- console.log("==> migrate: dropped the old diff-uncommitted pref");
611
- } finally {
612
- wr.close();
613
- }
614
- }
615
-
616
- // The terminal's two text sizes were one JSON pref (`term-font`), which a
617
- // device rewrote whole from a stale copy when it set its own size. Split
618
- // it into the per-device prefs once (keep in sync with termFontPref in
619
- // src/client/prefs.ts).
620
- {
621
- const wr = writer();
622
- try {
623
- const legacy = wr
624
- .prepare("SELECT value FROM settings WHERE key = 'ui.term-font'")
625
- .get();
626
- if (legacy) {
627
- let sizes = {};
628
- try {
629
- sizes = JSON.parse(legacy.value) ?? {};
630
- } catch {}
631
- for (const [field, key] of [
632
- ["desktop", "ui.term-font-desktop"],
633
- ["touch", "ui.term-font-touch"],
634
- ]) {
635
- if (!Number.isInteger(sizes[field])) continue;
636
- wr.prepare(
637
- "INSERT OR IGNORE INTO settings (key, value) VALUES (?, ?)",
638
- ).run(key, String(sizes[field]));
639
- }
640
- wr.prepare("DELETE FROM settings WHERE key = 'ui.term-font'").run();
641
- console.log("==> migrate: split term-font into per-device prefs");
642
- }
643
- } finally {
644
- wr.close();
645
- }
646
- }
647
-
648
- // The phone pad's pref was once a bare list of the keys after the pad's
649
- // own nine. It is `{ base, extra }` now, and a change to one key
650
- // (src/client/pref-change.ts) finds no `extra` in a list, so it would
651
- // start the pad afresh. Wrap such a list once.
652
- {
653
- const wr = writer();
654
- try {
655
- const row = wr
656
- .prepare("SELECT value FROM settings WHERE key = 'ui.phone-keys'")
657
- .get();
658
- let keys;
659
- try {
660
- keys = row && JSON.parse(row.value);
661
- } catch {}
662
- if (Array.isArray(keys)) {
663
- wr.prepare(
664
- "UPDATE settings SET value = ? WHERE key = 'ui.phone-keys'",
665
- ).run(JSON.stringify({ base: [], extra: keys }));
666
- console.log("==> migrate: moved the phone pad's keys into its new shape");
667
- }
668
- } finally {
669
- wr.close();
670
- }
671
- }
672
-
673
- // Every sweep has run: the stamp that makes the next run skip them, and
674
- // that 0.1 reads as the baseline it upgrades from.
675
- {
676
- const wr = writer();
677
- try {
678
- wr.exec("PRAGMA user_version = 1");
679
- } finally {
680
- wr.close();
681
- }
682
- }