@dylanpiercey/work 0.0.223 → 0.1.1
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.
- package/README.md +19 -32
- package/bin/work.mjs +259 -114
- package/dist/_D1C-XIqT.js +168 -0
- package/dist/{_CpANOzpd.js → _Dzz52ZtI.js} +488 -144
- package/dist/_HbAW5Cbt.js +2 -0
- package/dist/index.mjs +2634 -2786
- package/dist/public/assets/{_unfL8mz1.js → _-5UNb9-C.js} +1 -1
- package/dist/public/assets/_-5UNb9-C.js.br +0 -0
- package/dist/public/assets/_06rtP_SB.js +1 -0
- package/dist/public/assets/_14yhXek7.js +1 -0
- package/dist/public/assets/_14yhXek7.js.br +0 -0
- package/dist/public/assets/_1JXC9nFp.js +1 -0
- package/dist/public/assets/_1JXC9nFp.js.br +0 -0
- package/dist/public/assets/_1Yit_Y5R.js +1 -0
- package/dist/public/assets/_1ZPfR2B8.js +6 -0
- package/dist/public/assets/_1ZPfR2B8.js.br +0 -0
- package/dist/public/assets/{_BBpX-M4b.js → _1xOByopP.js} +1 -1
- package/dist/public/assets/_1xOByopP.js.br +0 -0
- package/dist/public/assets/{_BLTfQLdY.js → _3aBl7SEn.js} +1 -1
- package/dist/public/assets/_3aBl7SEn.js.br +0 -0
- package/dist/public/assets/_5aMLV2Vy.js +1 -0
- package/dist/public/assets/{_CX1wufuh.js → _7YrArFMB.js} +1 -1
- package/dist/public/assets/_7YrArFMB.js.br +0 -0
- package/dist/public/assets/{_mnBdD4YN.js → _B1-W0Sn2.js} +1 -1
- package/dist/public/assets/_B1-W0Sn2.js.br +0 -0
- package/dist/public/assets/{_BL9QMk_P.js → _B1D0PIz3.js} +1 -1
- package/dist/public/assets/_B1D0PIz3.js.br +0 -0
- package/dist/public/assets/_B1agoKUa.js +1 -0
- package/dist/public/assets/_B3NfNm8M.js +1591 -0
- package/dist/public/assets/_B3NfNm8M.js.br +0 -0
- package/dist/public/assets/{_DeCJ44Me.js → _B7VYILLZ.js} +1 -1
- package/dist/public/assets/_B7VYILLZ.js.br +0 -0
- package/dist/public/assets/_B7sPBy0J.js +1 -0
- package/dist/public/assets/_B81p6DSw.js +1 -0
- package/dist/public/assets/_BAkSKCkz.js +1 -0
- package/dist/public/assets/{_BUH04L5e.js → _BDUjU8Ev.js} +1 -1
- package/dist/public/assets/{_C6i9NP5A.js → _BHU5aikZ.js} +1 -1
- package/dist/public/assets/_BHZPTv1U.js +1 -0
- package/dist/public/assets/{_CttJbiei.js → _BKHtiW96.js} +1 -1
- package/dist/public/assets/_BKHtiW96.js.br +0 -0
- package/dist/public/assets/{_IWMmnVCy.js → _BKIx7IZP.js} +1 -1
- package/dist/public/assets/_BKIx7IZP.js.br +0 -0
- package/dist/public/assets/{_BCZpExov.js → _BLfzQY-3.js} +1 -1
- package/dist/public/assets/_BLfzQY-3.js.br +0 -0
- package/dist/public/assets/{_DhNuRs-V.js → _BPSTqkJn.js} +1 -1
- package/dist/public/assets/_BPSTqkJn.js.br +0 -0
- package/dist/public/assets/_BQZOimBB.js +1 -0
- package/dist/public/assets/{_vKQopDwG.js → _BRQ6iQ5p.js} +1 -1
- package/dist/public/assets/_BRQ6iQ5p.js.br +0 -0
- package/dist/public/assets/_BRVURc4u.js +1 -0
- package/dist/public/assets/{_eQK3EZCc.js → _BSFJEuJX.js} +1 -1
- package/dist/public/assets/_BSFJEuJX.js.br +0 -0
- package/dist/public/assets/{_B1RldJ0S.js → _BSWN-v3P.js} +1 -1
- package/dist/public/assets/_BSWN-v3P.js.br +0 -0
- package/dist/public/assets/_BTVAQr2c.js +1 -0
- package/dist/public/assets/_BUD1pBC0.js +1 -0
- package/dist/public/assets/_BVGzCczb.js +1 -0
- package/dist/public/assets/{_C1PmcEws.js → _BVQosHjY.js} +1 -1
- package/dist/public/assets/_BVQosHjY.js.br +0 -0
- package/dist/public/assets/{_DlpTErRA.js → _B_0C2_RO.js} +1 -1
- package/dist/public/assets/_B_0C2_RO.js.br +0 -0
- package/dist/public/assets/_BaA31ms5.js +1 -0
- package/dist/public/assets/_BgCHJGlO.js +1 -0
- package/dist/public/assets/_BhpRLDbL.js +1 -0
- package/dist/public/assets/_BhpRLDbL.js.br +0 -0
- package/dist/public/assets/_BkKcjMAC.js +1 -0
- package/dist/public/assets/{_BsimXDnm.js → _BkcPY2j0.js} +1 -1
- package/dist/public/assets/_BkcPY2j0.js.br +0 -0
- package/dist/public/assets/_BlTVd_3d.js +1 -0
- package/dist/public/assets/_BlqlLmEY.js +1 -0
- package/dist/public/assets/_BoNfxc9P.js +1 -0
- package/dist/public/assets/_BqswW9B9.js +1 -0
- package/dist/public/assets/_BricqzsO.js +1 -0
- package/dist/public/assets/_BrreckIa.js +1 -0
- package/dist/public/assets/{_CGLpCj_I.js → _BsJZPHmz.js} +1 -1
- package/dist/public/assets/_BsJZPHmz.js.br +0 -0
- package/dist/public/assets/_BtRYwaBb.js +1 -0
- package/dist/public/assets/{_CT3clsOQ.js → _BtZ2AatF.js} +1 -1
- package/dist/public/assets/_BvPBKjRP.js +1 -0
- package/dist/public/assets/_BvPBKjRP.js.br +0 -0
- package/dist/public/assets/_ByrrjMU9.js +1 -0
- package/dist/public/assets/{_s5Jez2mu.js → _BzGHediB.js} +1 -1
- package/dist/public/assets/_BzGHediB.js.br +0 -0
- package/dist/public/assets/_BzvTKm92.js +1 -0
- package/dist/public/assets/{_CnKYioYw.js → _C-EkQeP_.js} +1 -1
- package/dist/public/assets/_C-EkQeP_.js.br +0 -0
- package/dist/public/assets/{_BAHrOydH.js → _C0Ib7MZF.js} +1 -1
- package/dist/public/assets/_C0Ib7MZF.js.br +0 -0
- package/dist/public/assets/_C2p1Z5Lf.js +86 -0
- package/dist/public/assets/_C2p1Z5Lf.js.br +0 -0
- package/dist/public/assets/_C3iiOlxd.js +1 -0
- package/dist/public/assets/{_BdvO5Lqa.js → _C81nSl09.js} +1 -1
- package/dist/public/assets/_C81nSl09.js.br +0 -0
- package/dist/public/assets/{_BXT2bXMi.js → _C8bqYk4J.js} +1 -1
- package/dist/public/assets/_C8bqYk4J.js.br +0 -0
- package/dist/public/assets/_C98JZr09.js +1 -0
- package/dist/public/assets/_C98JZr09.js.br +0 -0
- package/dist/public/assets/_CB4VkmGZ.js +1 -0
- package/dist/public/assets/{_pUYwxsdF.js → _CCVkYcN5.js} +1 -1
- package/dist/public/assets/_CCVkYcN5.js.br +0 -0
- package/dist/public/assets/{_D-hK5uFn.js → _CDY0RpYX.js} +1 -1
- package/dist/public/assets/_CDY0RpYX.js.br +0 -0
- package/dist/public/assets/_CE2GEqMx.js +1 -0
- package/dist/public/assets/_CE2GEqMx.js.br +0 -0
- package/dist/public/assets/{_BeE9qDu0.js → _CFUREq1M.js} +1 -1
- package/dist/public/assets/_CFUREq1M.js.br +0 -0
- package/dist/public/assets/_CHdh6bII.js +1 -0
- package/dist/public/assets/{_CB31bp-W.js → _CHdpLB95.js} +1 -1
- package/dist/public/assets/_CHdpLB95.js.br +0 -0
- package/dist/public/assets/{_Fzbz4zvE.js → _CKLGAGKJ.js} +1 -1
- package/dist/public/assets/_CKLGAGKJ.js.br +0 -0
- package/dist/public/assets/_CMRt2lyQ.js +1 -0
- package/dist/public/assets/_CN1zW1AT.js +1 -0
- package/dist/public/assets/_CN1zW1AT.js.br +0 -0
- package/dist/public/assets/_CUILmj9R.js +1 -0
- package/dist/public/assets/_CUhP8KQ8.js +1 -0
- package/dist/public/assets/{_zKlxcAnQ.js → _CUsrMpdL.js} +1 -1
- package/dist/public/assets/_CUsrMpdL.js.br +0 -0
- package/dist/public/assets/_CVG0_w9T.js +1 -0
- package/dist/public/assets/{_CCCQMLw5.js → _CWG813ur.js} +1 -1
- package/dist/public/assets/_CWG813ur.js.br +0 -0
- package/dist/public/assets/{_C9OdJcx4.js → _CY87Y7QL.js} +1 -1
- package/dist/public/assets/_CY87Y7QL.js.br +0 -0
- package/dist/public/assets/_CYAsKva_.js +1 -0
- package/dist/public/assets/_CajKYNSY.js +1 -0
- package/dist/public/assets/{_gPFPzzPF.js → _Cb_k_JA_.js} +1 -1
- package/dist/public/assets/_Cb_k_JA_.js.br +0 -0
- package/dist/public/assets/_Ce8PlfMD.js +1 -0
- package/dist/public/assets/{_O70J1Mfv.js → _CfGEGt_k.js} +1 -1
- package/dist/public/assets/_CfGEGt_k.js.br +0 -0
- package/dist/public/assets/{_BLRpf6Uw.js → _CfdK8EeQ.js} +1 -1
- package/dist/public/assets/_CfdK8EeQ.js.br +0 -0
- package/dist/public/assets/_CgOKmAwr.js +1 -0
- package/dist/public/assets/{_C2ZpyiHV.js → _CiYQhf81.js} +1 -1
- package/dist/public/assets/_CiYQhf81.js.br +0 -0
- package/dist/public/assets/_Cj9DHPRL.js +1 -0
- package/dist/public/assets/{_BS4crAAm.js → _ClHPjF-1.js} +1 -1
- package/dist/public/assets/_ClHPjF-1.js.br +0 -0
- package/dist/public/assets/{_DmDSLxrw.js → _Cmmdd2e3.js} +1 -1
- package/dist/public/assets/_Cmmdd2e3.js.br +0 -0
- package/dist/public/assets/{_BsupnkWM.js → _Cn9Ia4SS.js} +1 -1
- package/dist/public/assets/_Cn9Ia4SS.js.br +0 -0
- package/dist/public/assets/_CnTzFbuG.js +1 -0
- package/dist/public/assets/{_DJ3UAR_s.js → _CqCenHOp.js} +1 -1
- package/dist/public/assets/_CqCenHOp.js.br +0 -0
- package/dist/public/assets/{_BRG_DBcC.js → _CtqGSS84.js} +1 -1
- package/dist/public/assets/_CtqGSS84.js.br +0 -0
- package/dist/public/assets/_CttfwM-c.js +1 -0
- package/dist/public/assets/{_DuXOUegE.js → _CxA3Yab0.js} +1 -1
- package/dist/public/assets/_CxA3Yab0.js.br +0 -0
- package/dist/public/assets/{_ifUb4WX7.js → _Cx_aJfDp.js} +1 -1
- package/dist/public/assets/_Cx_aJfDp.js.br +0 -0
- package/dist/public/assets/_D2L_ILOW.js +1 -0
- package/dist/public/assets/_D47lCu0c.js +1 -0
- package/dist/public/assets/_D5W-uGIK.js +1 -0
- package/dist/public/assets/_D6BbZLrc.js +1 -0
- package/dist/public/assets/_D6RVeCAn.js +1 -0
- package/dist/public/assets/_D75V4jV-.js +1 -0
- package/dist/public/assets/{_CwmzEsB4.js → _D9r_Fn0I.js} +1 -1
- package/dist/public/assets/_D9r_Fn0I.js.br +0 -0
- package/dist/public/assets/{_DoCtdMd2.js → _DBD57l1T.js} +1 -1
- package/dist/public/assets/_DBD57l1T.js.br +0 -0
- package/dist/public/assets/_DCWILZgL.js +1 -0
- package/dist/public/assets/{_DI0QHEXB.js → _DEOryr7w.js} +1 -1
- package/dist/public/assets/_DEOryr7w.js.br +0 -0
- package/dist/public/assets/_DF54Iz7o.js +1 -0
- package/dist/public/assets/_DFamU2Uj.js +2 -0
- package/dist/public/assets/_DFamU2Uj.js.br +0 -0
- package/dist/public/assets/_DHmBuyCO.js +1 -0
- package/dist/public/assets/_DHmBuyCO.js.br +0 -0
- package/dist/public/assets/{_BPcswKMK.js → _DJqEBkNd.js} +1 -1
- package/dist/public/assets/_DJqEBkNd.js.br +0 -0
- package/dist/public/assets/{_B_zyAtSJ.js → _DL3w8c_p.js} +1 -1
- package/dist/public/assets/_DL3w8c_p.js.br +0 -0
- package/dist/public/assets/_DLVL-4MP.js +1 -0
- package/dist/public/assets/{_BewXp5Y_.js → _DM60dKRs.js} +1 -1
- package/dist/public/assets/_DM60dKRs.js.br +0 -0
- package/dist/public/assets/{_BVp6r0fg.js → _DMJHTH74.js} +1 -1
- package/dist/public/assets/_DMJHTH74.js.br +0 -0
- package/dist/public/assets/_DMLv6KA6.js +1 -0
- package/dist/public/assets/_DQYpgyzr.js +1 -0
- package/dist/public/assets/_DQYpgyzr.js.br +0 -0
- package/dist/public/assets/{_BbiACo0Y.js → _DQyjuXTi.js} +1 -1
- package/dist/public/assets/_DQyjuXTi.js.br +0 -0
- package/dist/public/assets/{_C87NBm9i.js → _DRHCy0UF.js} +1 -1
- package/dist/public/assets/_DRHCy0UF.js.br +0 -0
- package/dist/public/assets/{_pvS44-AC.js → _DSUBv-Bl.js} +1 -1
- package/dist/public/assets/_DSUBv-Bl.js.br +0 -0
- package/dist/public/assets/{_BA8HFnO3.js → _DUFM9qLV.js} +1 -1
- package/dist/public/assets/_DUFM9qLV.js.br +0 -0
- package/dist/public/assets/{_D8u1YU9b.js → _DUs3ZGbj.js} +1 -1
- package/dist/public/assets/_DUs3ZGbj.js.br +0 -0
- package/dist/public/assets/{_CdgAsi3s.js → _DX5u6Wvm.js} +1 -1
- package/dist/public/assets/_DX5u6Wvm.js.br +0 -0
- package/dist/public/assets/{_BnyLUTdO.js → _DZvkgS3V.js} +1 -1
- package/dist/public/assets/_DZvkgS3V.js.br +0 -0
- package/dist/public/assets/{_CE5MhJWL.js → _Dbm6zAQS.js} +1 -1
- package/dist/public/assets/_Dbm6zAQS.js.br +0 -0
- package/dist/public/assets/{_DzrtBP-L.js → _DcOkTFth.js} +1 -1
- package/dist/public/assets/_Ddf1gumD.js +1 -0
- package/dist/public/assets/_De6E9M7R.js +1 -0
- package/dist/public/assets/{_C-6dImS5.js → _DgWKSW-Y.js} +1 -1
- package/dist/public/assets/_DgWKSW-Y.js.br +0 -0
- package/dist/public/assets/_DhEN6T4v.js +1 -0
- package/dist/public/assets/{_BxAl0m64.js → _Di1ccq_2.js} +1 -1
- package/dist/public/assets/_Di1ccq_2.js.br +0 -0
- package/dist/public/assets/{_CLerZOx-.js → _DifjKObE.js} +1 -1
- package/dist/public/assets/_DifjKObE.js.br +0 -0
- package/dist/public/assets/_Dn10ABa-.js +1 -0
- package/dist/public/assets/{_DuGmU4h0.js → _Do1ltY2a.js} +1 -1
- package/dist/public/assets/_Do1ltY2a.js.br +0 -0
- package/dist/public/assets/{_DeN4EY8L.js → _DomK7Scb.js} +1 -1
- package/dist/public/assets/_DomK7Scb.js.br +0 -0
- package/dist/public/assets/_DtWggCxt.js +1 -0
- package/dist/public/assets/_DtqqybyQ.js +1 -0
- package/dist/public/assets/{_CJ9j8N5Z.js → _DvKnakqk.js} +1 -1
- package/dist/public/assets/_DvKnakqk.js.br +0 -0
- package/dist/public/assets/_DxD_AC3a.js +1 -0
- package/dist/public/assets/_DxD_AC3a.js.br +0 -0
- package/dist/public/assets/_Dxo7m9cG.js +1 -0
- package/dist/public/assets/{_DhEdzMUw.js → _DzKW89Sx.js} +1 -1
- package/dist/public/assets/_DzKW89Sx.js.br +0 -0
- package/dist/public/assets/_DzTHCioH.js +1 -0
- package/dist/public/assets/{_CtyJUmXC.js → _EefWj858.js} +1 -1
- package/dist/public/assets/_EefWj858.js.br +0 -0
- package/dist/public/assets/{_Aq9oGnRu.js → _FlITqTCo.js} +1 -1
- package/dist/public/assets/_FlITqTCo.js.br +0 -0
- package/dist/public/assets/_GkEw2S0T.js +1 -0
- package/dist/public/assets/{__Oa255vo.js → _HM_QqtJi.js} +1 -1
- package/dist/public/assets/_HM_QqtJi.js.br +0 -0
- package/dist/public/assets/{_DuarImb7.js → _HmkI4Rfn.js} +1 -1
- package/dist/public/assets/_HmkI4Rfn.js.br +0 -0
- package/dist/public/assets/{_DaqT6m41.js → _JEvx8ub4.js} +1 -1
- package/dist/public/assets/_JEvx8ub4.js.br +0 -0
- package/dist/public/assets/_JOb8B3tz.js +1 -0
- package/dist/public/assets/_LEIhjFrO.js +1 -0
- package/dist/public/assets/_STJhwy7U.js +1 -0
- package/dist/public/assets/_TrcWRD8T.js +15 -0
- package/dist/public/assets/_TrcWRD8T.js.br +0 -0
- package/dist/public/assets/{_BO0OB-rz.js → _UaKPY71M.js} +1 -1
- package/dist/public/assets/_UaKPY71M.js.br +0 -0
- package/dist/public/assets/_UhK3lkm0.js +1 -0
- package/dist/public/assets/_VPLoEBTS.js +1 -0
- package/dist/public/assets/_Zeftz3t1.js +1 -0
- package/dist/public/assets/{_pP1W6w5v.js → __cyRVmTO.js} +1 -1
- package/dist/public/assets/__cyRVmTO.js.br +0 -0
- package/dist/public/assets/_awfYTHit.js +1 -0
- package/dist/public/assets/{_DiqV5bDH.js → _dsj7vMTW.js} +1 -1
- package/dist/public/assets/_dsj7vMTW.js.br +0 -0
- package/dist/public/assets/_eqpiOhSM.js +1 -0
- package/dist/public/assets/{_dr95P55a.js → _iutZ4EDe.js} +1 -1
- package/dist/public/assets/_iutZ4EDe.js.br +0 -0
- package/dist/public/assets/{_CZGS4T08.js → _kWQ0dtYZ.js} +1 -1
- package/dist/public/assets/_kWQ0dtYZ.js.br +0 -0
- package/dist/public/assets/_knvMqXQh.js +1 -0
- package/dist/public/assets/_lwC7sIgC.js +1 -0
- package/dist/public/assets/_m2tRa0jk.js +1 -0
- package/dist/public/assets/_m2tRa0jk.js.br +0 -0
- package/dist/public/assets/{_DwcoW-IU.js → _pXG8fRON.js} +1 -1
- package/dist/public/assets/_pXG8fRON.js.br +0 -0
- package/dist/public/assets/_r541ENtr.js +1 -0
- package/dist/public/assets/_rrUx1wn3.js +1 -0
- package/dist/public/assets/_tJvcu7sD.js +1 -0
- package/dist/public/assets/{_Cw_8WbwF.js → _vcLBrU2m.js} +1 -1
- package/dist/public/assets/_vcLBrU2m.js.br +0 -0
- package/dist/public/assets/_xZC4Vm70.js +1 -0
- package/dist/public/assets/_yAr5r-uL.js +1 -0
- package/dist/public/assets/{_DGTQBWy0.js → _yUmRJIJ6.js} +1 -1
- package/dist/public/assets/_yUmRJIJ6.js.br +0 -0
- package/dist/public/assets/app-shell-CVYlktwa.css +1 -0
- package/dist/public/assets/app-shell-CVYlktwa.css.br +0 -0
- package/dist/public/assets/files-view-CTadakLK.js +2 -0
- package/dist/public/assets/manage-workspace-HUAS6qjy.js +2 -0
- package/dist/public/assets/new-CirJkJFl.js +1 -0
- package/dist/public/assets/new-workspace-C3t1nA6z.js +2 -0
- package/dist/public/assets/review-view-DKPNtgmc.js +2 -0
- package/dist/public/assets/settings-CirJkJFl.js +1 -0
- package/dist/public/assets/settings-page-DH-9cN-8.js +2 -0
- package/dist/public/assets/styles-CIeNhVxC.css +1 -0
- package/dist/public/assets/styles-CIeNhVxC.css.br +0 -0
- package/dist/public/assets/w-CirJkJFl.js +1 -0
- package/dist/public/assets/w._-BnShhzdq.js +1 -0
- package/dist/public/assets/w._-CirJkJFl.js +1 -0
- package/dist/public/assets/w._-aCTYfruH.js +1 -0
- package/lib/review/markdown.mjs +5 -5
- package/lib/setup/bridge.d.mts +10 -0
- package/lib/setup/bridge.mjs +84 -0
- package/lib/setup/doctor.d.mts +17 -1
- package/lib/setup/doctor.mjs +97 -8
- package/lib/setup/install.d.mts +1 -0
- package/lib/setup/install.mjs +21 -1
- package/lib/setup/listen.mjs +2 -2
- package/lib/setup/tailscale.d.mts +53 -0
- package/lib/setup/tailscale.mjs +179 -0
- package/lib/share/manifest.mjs +2 -1
- package/package.json +2 -3
- package/dist/_LF2Fo5WE.js +0 -2
- package/dist/public/assets/_--tE4Gxz.js +0 -2
- package/dist/public/assets/_--tE4Gxz.js.br +0 -0
- package/dist/public/assets/_1OL9vXM-.js +0 -1
- package/dist/public/assets/_2mnAZf6B.js +0 -1
- package/dist/public/assets/_2mnAZf6B.js.br +0 -0
- package/dist/public/assets/_5f9fMvWJ.js +0 -1
- package/dist/public/assets/_5y69OR6M.js +0 -1
- package/dist/public/assets/_Aq9oGnRu.js.br +0 -0
- package/dist/public/assets/_B0uJCjmk.js +0 -1
- package/dist/public/assets/_B1RldJ0S.js.br +0 -0
- package/dist/public/assets/_B5TpOQCZ.js +0 -1
- package/dist/public/assets/_B6UdulKa.js +0 -1
- package/dist/public/assets/_BA8HFnO3.js.br +0 -0
- package/dist/public/assets/_BAHrOydH.js.br +0 -0
- package/dist/public/assets/_BBpX-M4b.js.br +0 -0
- package/dist/public/assets/_BCZpExov.js.br +0 -0
- package/dist/public/assets/_BFZHNauV.js +0 -1
- package/dist/public/assets/_BJRSndB4.js +0 -6
- package/dist/public/assets/_BJRSndB4.js.br +0 -0
- package/dist/public/assets/_BL9QMk_P.js.br +0 -0
- package/dist/public/assets/_BLNEzyb5.js +0 -1
- package/dist/public/assets/_BLRpf6Uw.js.br +0 -0
- package/dist/public/assets/_BLTfQLdY.js.br +0 -0
- package/dist/public/assets/_BO0OB-rz.js.br +0 -0
- package/dist/public/assets/_BPcswKMK.js.br +0 -0
- package/dist/public/assets/_BPhXWliU.js +0 -1
- package/dist/public/assets/_BQXTv9Cr.js +0 -1
- package/dist/public/assets/_BRG_DBcC.js.br +0 -0
- package/dist/public/assets/_BS4crAAm.js.br +0 -0
- package/dist/public/assets/_BVp6r0fg.js.br +0 -0
- package/dist/public/assets/_BXT2bXMi.js.br +0 -0
- package/dist/public/assets/_B_zyAtSJ.js.br +0 -0
- package/dist/public/assets/_BaXKdIeb.js +0 -1
- package/dist/public/assets/_BbiACo0Y.js.br +0 -0
- package/dist/public/assets/_BdvO5Lqa.js.br +0 -0
- package/dist/public/assets/_BeE9qDu0.js.br +0 -0
- package/dist/public/assets/_BewXp5Y_.js.br +0 -0
- package/dist/public/assets/_BfOOLKo5.js +0 -1
- package/dist/public/assets/_BhS8bTnr.js +0 -1
- package/dist/public/assets/_BhZ3ZoG0.js +0 -1
- package/dist/public/assets/_Bi3_ZsOQ.js +0 -1
- package/dist/public/assets/_Bj_Lfa8B.js +0 -1
- package/dist/public/assets/_BlN_x04q.js +0 -1
- package/dist/public/assets/_Bn5nsnie.js +0 -1
- package/dist/public/assets/_BnOOD6nr.js +0 -15
- package/dist/public/assets/_BnOOD6nr.js.br +0 -0
- package/dist/public/assets/_BnyLUTdO.js.br +0 -0
- package/dist/public/assets/_Bp_WT09q.js +0 -1
- package/dist/public/assets/_Bp_WT09q.js.br +0 -0
- package/dist/public/assets/_BsimXDnm.js.br +0 -0
- package/dist/public/assets/_BsupnkWM.js.br +0 -0
- package/dist/public/assets/_BxAl0m64.js.br +0 -0
- package/dist/public/assets/_C-6dImS5.js.br +0 -0
- package/dist/public/assets/_C18Torhh.js +0 -1
- package/dist/public/assets/_C1PmcEws.js.br +0 -0
- package/dist/public/assets/_C2ZpyiHV.js.br +0 -0
- package/dist/public/assets/_C3P1VHUI.js +0 -1
- package/dist/public/assets/_C6xwTKke.js +0 -1
- package/dist/public/assets/_C6yqlRfl.js +0 -1
- package/dist/public/assets/_C75D8bH2.js +0 -1
- package/dist/public/assets/_C87NBm9i.js.br +0 -0
- package/dist/public/assets/_C8Vc_vBH.js +0 -1
- package/dist/public/assets/_C9OdJcx4.js.br +0 -0
- package/dist/public/assets/_C9eoo0sE.js +0 -1
- package/dist/public/assets/_C9qO_dny.js +0 -1
- package/dist/public/assets/_C9qO_dny.js.br +0 -0
- package/dist/public/assets/_CB31bp-W.js.br +0 -0
- package/dist/public/assets/_CCCQMLw5.js.br +0 -0
- package/dist/public/assets/_CCie36pi.js +0 -1
- package/dist/public/assets/_CDD9N34p.js +0 -1
- package/dist/public/assets/_CE5MhJWL.js.br +0 -0
- package/dist/public/assets/_CGLpCj_I.js.br +0 -0
- package/dist/public/assets/_CJ9j8N5Z.js.br +0 -0
- package/dist/public/assets/_CLDmR3jR.js +0 -1
- package/dist/public/assets/_CLDmR3jR.js.br +0 -0
- package/dist/public/assets/_CLerZOx-.js.br +0 -0
- package/dist/public/assets/_CM5GtJb2.js +0 -1
- package/dist/public/assets/_COECwOVb.js +0 -1
- package/dist/public/assets/_CSQE9nMN.js +0 -1
- package/dist/public/assets/_CSXMgHLQ.js +0 -1
- package/dist/public/assets/_CVRiByCT.js +0 -1
- package/dist/public/assets/_CVSrm4Pl.js +0 -1
- package/dist/public/assets/_CX1wufuh.js.br +0 -0
- package/dist/public/assets/_CYNAhnRH.js +0 -1591
- package/dist/public/assets/_CYNAhnRH.js.br +0 -0
- package/dist/public/assets/_CZGS4T08.js.br +0 -0
- package/dist/public/assets/_C_L7l9Mg.js +0 -1
- package/dist/public/assets/_CaMrYy1W.js +0 -1
- package/dist/public/assets/_CdgAsi3s.js.br +0 -0
- package/dist/public/assets/_Ce-E7sJE.js +0 -1
- package/dist/public/assets/_Cg3S760D.js +0 -1
- package/dist/public/assets/_ChpYg41R.js +0 -1
- package/dist/public/assets/_CicyY7KP.js +0 -1
- package/dist/public/assets/_Ck0YOw_7.js +0 -1
- package/dist/public/assets/_CmHlTZSs.js +0 -1
- package/dist/public/assets/_CnECYh66.js +0 -1
- package/dist/public/assets/_CnKYioYw.js.br +0 -0
- package/dist/public/assets/_CnUVvVPd.js +0 -1
- package/dist/public/assets/_CqSgGCGC.js +0 -1
- package/dist/public/assets/_CttJbiei.js.br +0 -0
- package/dist/public/assets/_CtyJUmXC.js.br +0 -0
- package/dist/public/assets/_Cw_8WbwF.js.br +0 -0
- package/dist/public/assets/_CwmzEsB4.js.br +0 -0
- package/dist/public/assets/_CzETFsJs.js +0 -1
- package/dist/public/assets/_D-S9H-tX.js +0 -1
- package/dist/public/assets/_D-hK5uFn.js.br +0 -0
- package/dist/public/assets/_D5fTwHXK.js +0 -1
- package/dist/public/assets/_D8u1YU9b.js.br +0 -0
- package/dist/public/assets/_DAH8evhA.js +0 -1
- package/dist/public/assets/_DAemmoHI.js +0 -1
- package/dist/public/assets/_DEMYxWZf.js +0 -1
- package/dist/public/assets/_DGTQBWy0.js.br +0 -0
- package/dist/public/assets/_DHhv0pCA.js +0 -1
- package/dist/public/assets/_DI0QHEXB.js.br +0 -0
- package/dist/public/assets/_DJ3UAR_s.js.br +0 -0
- package/dist/public/assets/_DKu6UxI7.js +0 -1
- package/dist/public/assets/_DNC-9RBN.js +0 -1
- package/dist/public/assets/_DP-Bu7ET.js +0 -1
- package/dist/public/assets/_DYmmPBcq.js +0 -1
- package/dist/public/assets/_Da2Dmt_d.js +0 -1
- package/dist/public/assets/_Da2Dmt_d.js.br +0 -0
- package/dist/public/assets/_DaqT6m41.js.br +0 -0
- package/dist/public/assets/_DbVyutEZ.js +0 -1
- package/dist/public/assets/_DcBvO2Si.js +0 -1
- package/dist/public/assets/_DeCJ44Me.js.br +0 -0
- package/dist/public/assets/_DeN4EY8L.js.br +0 -0
- package/dist/public/assets/_DhEdzMUw.js.br +0 -0
- package/dist/public/assets/_DhNuRs-V.js.br +0 -0
- package/dist/public/assets/_DiqV5bDH.js.br +0 -0
- package/dist/public/assets/_Diqt_yCf.js +0 -1
- package/dist/public/assets/_DlpTErRA.js.br +0 -0
- package/dist/public/assets/_DmDSLxrw.js.br +0 -0
- package/dist/public/assets/_DoC0qbSD.js +0 -1
- package/dist/public/assets/_DoCtdMd2.js.br +0 -0
- package/dist/public/assets/_DpqWFkMg.js +0 -1
- package/dist/public/assets/_Dr0Bkgso.js +0 -1
- package/dist/public/assets/_Dt-n9FaQ.js +0 -1
- package/dist/public/assets/_DtOzdwHm.js +0 -1
- package/dist/public/assets/_DtOzdwHm.js.br +0 -0
- package/dist/public/assets/_DuGmU4h0.js.br +0 -0
- package/dist/public/assets/_DuXOUegE.js.br +0 -0
- package/dist/public/assets/_DuaocJd1.js +0 -1
- package/dist/public/assets/_DuarImb7.js.br +0 -0
- package/dist/public/assets/_DwcoW-IU.js.br +0 -0
- package/dist/public/assets/_DxVt7Zuk.js +0 -86
- package/dist/public/assets/_DxVt7Zuk.js.br +0 -0
- package/dist/public/assets/_Fzbz4zvE.js.br +0 -0
- package/dist/public/assets/_I5oX-lGP.js +0 -1
- package/dist/public/assets/_IWMmnVCy.js.br +0 -0
- package/dist/public/assets/_O70J1Mfv.js.br +0 -0
- package/dist/public/assets/_SwbsOoi9.js +0 -1
- package/dist/public/assets/_SwbsOoi9.js.br +0 -0
- package/dist/public/assets/_Yy39CykK.js +0 -1
- package/dist/public/assets/__Oa255vo.js.br +0 -0
- package/dist/public/assets/_bPze7k1x.js +0 -1
- package/dist/public/assets/_bU1KcT1I.js +0 -1
- package/dist/public/assets/_dr95P55a.js.br +0 -0
- package/dist/public/assets/_eQK3EZCc.js.br +0 -0
- package/dist/public/assets/_gPFPzzPF.js.br +0 -0
- package/dist/public/assets/_hzpOPZUB.js +0 -1
- package/dist/public/assets/_ifUb4WX7.js.br +0 -0
- package/dist/public/assets/_kQ7LiSim.js +0 -1
- package/dist/public/assets/_lOAW1VLM.js +0 -1
- package/dist/public/assets/_mnBdD4YN.js.br +0 -0
- package/dist/public/assets/_odBcV1kc.js +0 -1
- package/dist/public/assets/_pP1W6w5v.js.br +0 -0
- package/dist/public/assets/_pUYwxsdF.js.br +0 -0
- package/dist/public/assets/_pvS44-AC.js.br +0 -0
- package/dist/public/assets/_qJTL2ooe.js +0 -1
- package/dist/public/assets/_qJTL2ooe.js.br +0 -0
- package/dist/public/assets/_s5Jez2mu.js.br +0 -0
- package/dist/public/assets/_unfL8mz1.js.br +0 -0
- package/dist/public/assets/_unwtcXFQ.js +0 -1
- package/dist/public/assets/_unwtcXFQ.js.br +0 -0
- package/dist/public/assets/_vKQopDwG.js.br +0 -0
- package/dist/public/assets/_w1aegGdT.js +0 -1
- package/dist/public/assets/_xdrkfok5.js +0 -1
- package/dist/public/assets/_xdrkfok5.js.br +0 -0
- package/dist/public/assets/_y-lm36fI.js +0 -1
- package/dist/public/assets/_zKlxcAnQ.js.br +0 -0
- package/dist/public/assets/app-shell-CpPCwWPW.css +0 -1
- package/dist/public/assets/app-shell-CpPCwWPW.css.br +0 -0
- package/dist/public/assets/files-view-BfCdcfXX.js +0 -2
- package/dist/public/assets/files-view-DtI7JE-f.css +0 -1
- package/dist/public/assets/files-view-DtI7JE-f.css.br +0 -0
- package/dist/public/assets/group.css.ts-SeaNz7WZ.css +0 -1
- package/dist/public/assets/group.css.ts-SeaNz7WZ.css.br +0 -0
- package/dist/public/assets/icon-folder-DHVc-REl.css +0 -1
- package/dist/public/assets/icon-folder-DHVc-REl.css.br +0 -0
- package/dist/public/assets/icon-search-DAtjHWFL.css +0 -1
- package/dist/public/assets/icon-search-DAtjHWFL.css.br +0 -0
- package/dist/public/assets/manage-workspace-6i6Zeai7.css +0 -1
- package/dist/public/assets/manage-workspace-CixeMkdt.js +0 -2
- package/dist/public/assets/modal-view-D0qnmuJE.css +0 -1
- package/dist/public/assets/modal-view-D0qnmuJE.css.br +0 -0
- package/dist/public/assets/new-DxhaKmbF.js +0 -1
- package/dist/public/assets/new-workspace-BXjDRbqF.css +0 -1
- package/dist/public/assets/new-workspace-BXjDRbqF.css.br +0 -0
- package/dist/public/assets/new-workspace-DG693v2S.js +0 -2
- package/dist/public/assets/port-chip-Lz3mVJWb.css +0 -1
- package/dist/public/assets/port-chip-Lz3mVJWb.css.br +0 -0
- package/dist/public/assets/prompt-dialog-vhnae1-x.css +0 -1
- package/dist/public/assets/prompt-dialog-vhnae1-x.css.br +0 -0
- package/dist/public/assets/quick-open-DVqzk3-g.css +0 -1
- package/dist/public/assets/quick-open-DVqzk3-g.css.br +0 -0
- package/dist/public/assets/repo-picker-K5RYsEge.css +0 -1
- package/dist/public/assets/repo-picker-K5RYsEge.css.br +0 -0
- package/dist/public/assets/review-view-DqMrB4Ny.css +0 -1
- package/dist/public/assets/review-view-DqMrB4Ny.css.br +0 -0
- package/dist/public/assets/review-view-TdLbCgEg.js +0 -2
- package/dist/public/assets/section-2MyJSq5D.css +0 -1
- package/dist/public/assets/section-2MyJSq5D.css.br +0 -0
- package/dist/public/assets/settings-DxhaKmbF.js +0 -1
- package/dist/public/assets/settings-page-BBAG94Vh.js +0 -2
- package/dist/public/assets/settings-page-DUefc32x.css +0 -1
- package/dist/public/assets/settings-page-DUefc32x.css.br +0 -0
- package/dist/public/assets/skill-row-BeOk8NK8.css +0 -1
- package/dist/public/assets/sso-auth-CU3fGJ4U.css +0 -1
- package/dist/public/assets/sso-auth-CU3fGJ4U.css.br +0 -0
- package/dist/public/assets/w-DxhaKmbF.js +0 -1
- package/dist/public/assets/w._-C6JVdFgi.js +0 -1
- package/dist/public/assets/w._-DxhaKmbF.js +0 -1
- package/dist/public/assets/w._-rfvcDGPk.js +0 -1
- package/scripts/migrate.mjs +0 -682
package/scripts/migrate.mjs
DELETED
|
@@ -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
|
-
}
|