@dylanpiercey/work 0.2.41 → 0.2.43
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/bin/cli/stack.mjs +33 -19
- package/bin/cli/topic.mjs +1 -1
- package/bin/work.mjs +199 -47
- package/dist/_BKkT73fv.js +2 -0
- package/dist/_BviTiVOB.js +2 -0
- package/dist/{_DuADlWik.js → _Cv5RrCSW.js} +3 -72
- package/dist/{_DgY5Gc2z.js → _DN2yXOe-.js} +113 -113
- package/dist/{_D4k_lVuT.js → _DuwPQCOE.js} +1 -1
- package/dist/index.mjs +1123 -1073
- package/dist/public/assets/_4jzUxBl1.js +1 -0
- package/dist/public/assets/_6Gfbsj34.js +1 -0
- package/dist/public/assets/{_CGYOyAi6.js → _7NOeJZ7O.js} +1 -1
- package/dist/public/assets/_7NOeJZ7O.js.br +0 -0
- package/dist/public/assets/{_f7Sgp2jB.js → _8fMkhL-V.js} +1 -1
- package/dist/public/assets/_8fMkhL-V.js.br +0 -0
- package/dist/public/assets/_ACxWQrF_.js +1 -0
- package/dist/public/assets/{_CvTM_Hkg.js → _AUDK9Grt.js} +1 -1
- package/dist/public/assets/_AUDK9Grt.js.br +0 -0
- package/dist/public/assets/{_C4i6tdPg.js → _B0mwj6Ev.js} +1 -1
- package/dist/public/assets/_B0mwj6Ev.js.br +0 -0
- package/dist/public/assets/{_Bud8PVk2.js → _B0pMH4yO.js} +1 -1
- package/dist/public/assets/_B0pMH4yO.js.br +0 -0
- package/dist/public/assets/_B1G63IYo.js +1 -0
- package/dist/public/assets/_B1qkzWnd.js +1 -0
- package/dist/public/assets/_B56RiWbN.js +1 -0
- package/dist/public/assets/_B6ZXN5aU.js +1 -0
- package/dist/public/assets/_B6_r9iYg.js +1 -0
- package/dist/public/assets/{_BLzCI5fA.js → _B73Eh-N_.js} +1 -1
- package/dist/public/assets/_B73Eh-N_.js.br +0 -0
- package/dist/public/assets/{_CBmZFyev.js → _B8-o-AZv.js} +1 -1
- package/dist/public/assets/_B92ZvzMb.js +1595 -0
- package/dist/public/assets/_B92ZvzMb.js.br +0 -0
- package/dist/public/assets/_B9iGefG4.js +1 -0
- package/dist/public/assets/_BAb8sJtB.js +1 -0
- package/dist/public/assets/{_DOGQJlMz.js → _BCXa70Fh.js} +1 -1
- package/dist/public/assets/_BCXa70Fh.js.br +0 -0
- package/dist/public/assets/_BEw6aufk.js +1 -0
- package/dist/public/assets/{_2X4Nxaqb.js → _BKI2XK6i.js} +1 -1
- package/dist/public/assets/_BKI2XK6i.js.br +0 -0
- package/dist/public/assets/_BL6T7K5F.js +1 -0
- package/dist/public/assets/{_Yl99Ym1s.js → _BLtle8N9.js} +1 -1
- package/dist/public/assets/_BLtle8N9.js.br +0 -0
- package/dist/public/assets/_BMhAJhx_.js +1 -0
- package/dist/public/assets/_BNC-BdhL.js +1 -0
- package/dist/public/assets/{_wlPMGofh.js → _BOw__Q2y.js} +1 -1
- package/dist/public/assets/_BOw__Q2y.js.br +0 -0
- package/dist/public/assets/{_DDwZqDeP.js → _BPHYSdej.js} +1 -1
- package/dist/public/assets/_BPHYSdej.js.br +0 -0
- package/dist/public/assets/{_BFR8p6md.js → _BPbGGRrT.js} +1 -1
- package/dist/public/assets/_BPbGGRrT.js.br +0 -0
- package/dist/public/assets/_BQ0Wpc1b.js +1 -0
- package/dist/public/assets/{_C4TOoJt-.js → _BQjfwReN.js} +1 -1
- package/dist/public/assets/_BQjfwReN.js.br +0 -0
- package/dist/public/assets/_BSOQpNL6.js +1 -0
- package/dist/public/assets/_BU076YIw.js +1 -0
- package/dist/public/assets/{_Goz4NHSk.js → _BUHolEsT.js} +1 -1
- package/dist/public/assets/_BUHolEsT.js.br +0 -0
- package/dist/public/assets/_BW0CTcZj.js +1 -0
- package/dist/public/assets/_BWaDSzqN.js +1 -0
- package/dist/public/assets/_BXFUBIN4.js +1 -0
- package/dist/public/assets/_BaZLe1km.js +1 -0
- package/dist/public/assets/{_B7kCpNyD.js → _BcEm_iyy.js} +1 -1
- package/dist/public/assets/_BcEm_iyy.js.br +0 -0
- package/dist/public/assets/_BdTFZA5g.js +1 -0
- package/dist/public/assets/{_DyPWIZeU.js → _BgpmFeeP.js} +1 -1
- package/dist/public/assets/_BgpmFeeP.js.br +0 -0
- package/dist/public/assets/_BhtG3O1x.js +2 -0
- package/dist/public/assets/_BhtG3O1x.js.br +0 -0
- package/dist/public/assets/_BiYkTvg2.js +1 -0
- package/dist/public/assets/_BjTD5VbW.js +1 -0
- package/dist/public/assets/_Bl1FCUd6.js +1 -0
- package/dist/public/assets/_BtuZvkEt.js +1 -0
- package/dist/public/assets/{_Dw-MQsnH.js → _Buv7nRCW.js} +1 -1
- package/dist/public/assets/_Buv7nRCW.js.br +0 -0
- package/dist/public/assets/_Buv99kaT.js +1 -0
- package/dist/public/assets/_ByfZnU2c.js +1 -0
- package/dist/public/assets/_C-fnxBxJ.js +2 -0
- package/dist/public/assets/_C-fnxBxJ.js.br +0 -0
- package/dist/public/assets/_C05YW868.js +1 -0
- package/dist/public/assets/{_sAZ12zqC.js → _C6f-hgTe.js} +1 -1
- package/dist/public/assets/_C6f-hgTe.js.br +0 -0
- package/dist/public/assets/_C7Y0TA82.js +1 -0
- package/dist/public/assets/{_DAqHF2w4.js → _C7vQHCek.js} +1 -1
- package/dist/public/assets/_C7vQHCek.js.br +0 -0
- package/dist/public/assets/_C8bV43Ih.js +1 -0
- package/dist/public/assets/{_BFkRvzwl.js → _CCjVMkO3.js} +1 -1
- package/dist/public/assets/_CCjVMkO3.js.br +0 -0
- package/dist/public/assets/_CGIbExeK.js +1 -0
- package/dist/public/assets/{_DH0yKcfT.js → _CGb1Cnwy.js} +1 -1
- package/dist/public/assets/_CGb1Cnwy.js.br +0 -0
- package/dist/public/assets/{_D6N1Ob8T.js → _CHy9xaEn.js} +1 -1
- package/dist/public/assets/_CHy9xaEn.js.br +0 -0
- package/dist/public/assets/_CKyHmOht.js +1 -0
- package/dist/public/assets/_CL-ckoH5.js +1 -0
- package/dist/public/assets/{_UBNUF9Kp.js → _CNBA4JfC.js} +1 -1
- package/dist/public/assets/_CNBA4JfC.js.br +0 -0
- package/dist/public/assets/{_CFQ5E_MU.js → _CN_q8cW8.js} +1 -1
- package/dist/public/assets/{_BP1-9YZQ.js → _COOlu3UX.js} +1 -1
- package/dist/public/assets/_COOlu3UX.js.br +0 -0
- package/dist/public/assets/{_DrmQTAwC.js → _COk-n7hZ.js} +1 -1
- package/dist/public/assets/_COk-n7hZ.js.br +0 -0
- package/dist/public/assets/{_DxG3J469.js → _CPPSSISM.js} +1 -1
- package/dist/public/assets/_CPPSSISM.js.br +0 -0
- package/dist/public/assets/_CQftYh9Z.js +1 -0
- package/dist/public/assets/_CQmdU2jo.js +1 -0
- package/dist/public/assets/{_CafkGbWO.js → _CS9jx04A.js} +1 -1
- package/dist/public/assets/_CS9jx04A.js.br +0 -0
- package/dist/public/assets/_CSdtDfvR.js +1 -0
- package/dist/public/assets/_CU0zS2tF.js +1 -0
- package/dist/public/assets/_CVs4BgJ8.js +1 -0
- package/dist/public/assets/{_DzYdOMqO.js → _CWfDZOTS.js} +1 -1
- package/dist/public/assets/_CWfDZOTS.js.br +0 -0
- package/dist/public/assets/_CXTPeLVy.js +1 -0
- package/dist/public/assets/{_KcGCvv0h.js → _C_2Poz1k.js} +1 -1
- package/dist/public/assets/_C_2Poz1k.js.br +0 -0
- package/dist/public/assets/{_QSE08ioq.js → _C_YGsTAD.js} +1 -1
- package/dist/public/assets/_C_YGsTAD.js.br +0 -0
- package/dist/public/assets/{_BNKR_PFf.js → _Cas9R6tf.js} +1 -1
- package/dist/public/assets/_Cas9R6tf.js.br +0 -0
- package/dist/public/assets/{_DrUKq1tq.js → _CbLcjKPG.js} +1 -1
- package/dist/public/assets/_CbLcjKPG.js.br +0 -0
- package/dist/public/assets/_CbwHAX50.js +1 -0
- package/dist/public/assets/_CcKHitbd.js +1 -0
- package/dist/public/assets/_CdPw4LUm.js +1 -0
- package/dist/public/assets/_CdPw4LUm.js.br +0 -0
- package/dist/public/assets/_CfDehMkg.js +1 -0
- package/dist/public/assets/{_BHZ3z1c3.js → _Ciq72Yaz.js} +1 -1
- package/dist/public/assets/_Ciq72Yaz.js.br +0 -0
- package/dist/public/assets/{_D-6002zy.js → _CjnfvQG7.js} +1 -1
- package/dist/public/assets/_CjnfvQG7.js.br +0 -0
- package/dist/public/assets/_Ck80YJf-.js +1 -0
- package/dist/public/assets/{_BVF9vDBR.js → _CkwFvNTM.js} +1 -1
- package/dist/public/assets/_CkwFvNTM.js.br +0 -0
- package/dist/public/assets/_CmrqyF2X.js +1 -0
- package/dist/public/assets/_Coq56wZh.js +1 -0
- package/dist/public/assets/{_S0t9nmdw.js → _CqD6fuWN.js} +1 -1
- package/dist/public/assets/_CqD6fuWN.js.br +0 -0
- package/dist/public/assets/{_DMxmrREh.js → _Cucb4Tjg.js} +1 -1
- package/dist/public/assets/_Cucb4Tjg.js.br +0 -0
- package/dist/public/assets/{_Dmr61lrF.js → _Cug-hxky.js} +1 -1
- package/dist/public/assets/_Cug-hxky.js.br +0 -0
- package/dist/public/assets/_Cw7W1tiO.js +1 -0
- package/dist/public/assets/_CwE97-yW.js +1 -0
- package/dist/public/assets/_CwuZ_5cX.js +1 -0
- package/dist/public/assets/{_CxA2ehGA.js → _CyYvm4rW.js} +1 -1
- package/dist/public/assets/_CyYvm4rW.js.br +0 -0
- package/dist/public/assets/{_BUi5Lnyu.js → _CzIpBjJM.js} +1 -1
- package/dist/public/assets/_CzIpBjJM.js.br +0 -0
- package/dist/public/assets/{_lv7q9SmK.js → _D1L3UHX3.js} +1 -1
- package/dist/public/assets/_D1L3UHX3.js.br +0 -0
- package/dist/public/assets/{_CxGMPpn8.js → _D4egTrfn.js} +1 -1
- package/dist/public/assets/_D4egTrfn.js.br +0 -0
- package/dist/public/assets/{_C63MsoW_.js → _D4uw28j2.js} +1 -1
- package/dist/public/assets/_D4uw28j2.js.br +0 -0
- package/dist/public/assets/{_BsEmt4Xo.js → _D5bv6LQl.js} +1 -1
- package/dist/public/assets/_D5bv6LQl.js.br +0 -0
- package/dist/public/assets/{_BWRhy73M.js → _D7_Ub5eD.js} +1 -1
- package/dist/public/assets/_D7_Ub5eD.js.br +0 -0
- package/dist/public/assets/{_DsODWTMK.js → _DA4mq6lj.js} +1 -1
- package/dist/public/assets/_DA4mq6lj.js.br +0 -0
- package/dist/public/assets/{_rV9c6noX.js → _DAqrKmCA.js} +1 -1
- package/dist/public/assets/_DAqrKmCA.js.br +0 -0
- package/dist/public/assets/_DAuw68_p.js +1 -0
- package/dist/public/assets/_DCVr8Tb2.js +1 -0
- package/dist/public/assets/{_BdYyTR77.js → _DFf4Rzl8.js} +1 -1
- package/dist/public/assets/_DFf4Rzl8.js.br +0 -0
- package/dist/public/assets/_DGvpitpZ.js +1 -0
- package/dist/public/assets/_DIZG1G-Z.js +1 -0
- package/dist/public/assets/_DJ-_BqNL.js +1 -0
- package/dist/public/assets/_DMEqEv_T.js +1 -0
- package/dist/public/assets/{_Dxl6ePU3.js → _DPoG38YC.js} +1 -1
- package/dist/public/assets/{_CqVEbJdU.js → _DTfOovOq.js} +5 -5
- package/dist/public/assets/_DTfOovOq.js.br +0 -0
- package/dist/public/assets/{_CxPc5sJ4.js → _DUUWYhg_.js} +1 -1
- package/dist/public/assets/_DUUWYhg_.js.br +0 -0
- package/dist/public/assets/{_ymY4YmGe.js → _DUuqR8Il.js} +1 -1
- package/dist/public/assets/_DUuqR8Il.js.br +0 -0
- package/dist/public/assets/_DVHVPPDm.js +1 -0
- package/dist/public/assets/_DVPR8Gc6.js +12 -0
- package/dist/public/assets/_DVPR8Gc6.js.br +0 -0
- package/dist/public/assets/{_D9G809lq.js → _DWlBFpSS.js} +1 -1
- package/dist/public/assets/_DWlBFpSS.js.br +0 -0
- package/dist/public/assets/_DWum7no_.js +1 -0
- package/dist/public/assets/{_DVfIcVOc.js → _DXV62Cae.js} +1 -1
- package/dist/public/assets/_DXV62Cae.js.br +0 -0
- package/dist/public/assets/{_BPoHnP8w.js → _DXipSiI1.js} +1 -1
- package/dist/public/assets/_DXipSiI1.js.br +0 -0
- package/dist/public/assets/{_Clzo9X7l.js → _DZYDOMkl.js} +1 -1
- package/dist/public/assets/_DZYDOMkl.js.br +0 -0
- package/dist/public/assets/_D_701Hlg.js +1 -0
- package/dist/public/assets/{_tlSiPgo6.js → _D_9gKfZY.js} +1 -1
- package/dist/public/assets/_D_9gKfZY.js.br +0 -0
- package/dist/public/assets/{_Ctprx5dp.js → _D_JHfJs4.js} +1 -1
- package/dist/public/assets/_D_JHfJs4.js.br +0 -0
- package/dist/public/assets/{_DvhYEPCI.js → _DbEZe7yb.js} +1 -1
- package/dist/public/assets/_DbEZe7yb.js.br +0 -0
- package/dist/public/assets/{_B0YpwhBT.js → _DbH0P--6.js} +1 -1
- package/dist/public/assets/_DbH0P--6.js.br +0 -0
- package/dist/public/assets/{_CKGtByJf.js → _DbadYlan.js} +1 -1
- package/dist/public/assets/_DbadYlan.js.br +0 -0
- package/dist/public/assets/_DcZGtx9M.js +1 -0
- package/dist/public/assets/{_BG7u51c6.js → _DdkaLWU-.js} +1 -1
- package/dist/public/assets/_DdkaLWU-.js.br +0 -0
- package/dist/public/assets/{_D80egIjq.js → _De56Kzes.js} +1 -1
- package/dist/public/assets/_De56Kzes.js.br +0 -0
- package/dist/public/assets/{_DxMfRWk5.js → _DeI8ro0m.js} +1 -1
- package/dist/public/assets/_DeI8ro0m.js.br +0 -0
- package/dist/public/assets/_DeW8reMC.js +1 -0
- package/dist/public/assets/{_DNWcRd5b.js → _DeYwNUUu.js} +2 -2
- package/dist/public/assets/_DeYwNUUu.js.br +0 -0
- package/dist/public/assets/{_B4Cg-RuN.js → _DgTOYvd6.js} +1 -1
- package/dist/public/assets/_DgTOYvd6.js.br +0 -0
- package/dist/public/assets/_DiSCjU2A.js +1 -0
- package/dist/public/assets/{_D6fwgK2P.js → _DkTAnqm3.js} +1 -1
- package/dist/public/assets/_DkTAnqm3.js.br +0 -0
- package/dist/public/assets/_Dmm830TH.js +1 -0
- package/dist/public/assets/_DpjdDKK2.js +7 -0
- package/dist/public/assets/_DpjdDKK2.js.br +0 -0
- package/dist/public/assets/{_BteLCW3W.js → _DqJfOZRO.js} +1 -1
- package/dist/public/assets/_DqJfOZRO.js.br +0 -0
- package/dist/public/assets/_DqjxsMkL.js +1 -0
- package/dist/public/assets/_DuA45JvH.js +1 -0
- package/dist/public/assets/_DuA45JvH.js.br +0 -0
- package/dist/public/assets/{_BbhdJgn7.js → _DuOaoYJs.js} +1 -1
- package/dist/public/assets/_DuOaoYJs.js.br +0 -0
- package/dist/public/assets/_Duzf7BCj.js +1 -0
- package/dist/public/assets/_Duzf7BCj.js.br +0 -0
- package/dist/public/assets/_DvLPq_1f.js +1 -0
- package/dist/public/assets/{_DCPFy4S-.js → _Dy7h2yOQ.js} +1 -1
- package/dist/public/assets/_Dy7h2yOQ.js.br +0 -0
- package/dist/public/assets/{_zLL0pxIC.js → _FChy8Jml.js} +1 -1
- package/dist/public/assets/_FChy8Jml.js.br +0 -0
- package/dist/public/assets/_Hg8ZWlxs.js +1 -0
- package/dist/public/assets/_IGL38N54.js +1 -0
- package/dist/public/assets/{_Bzj2coXM.js → _KHMfdBQI.js} +1 -1
- package/dist/public/assets/_KHMfdBQI.js.br +0 -0
- package/dist/public/assets/{_AZdn-pAq.js → _KkDXvfqJ.js} +1 -1
- package/dist/public/assets/_KkDXvfqJ.js.br +0 -0
- package/dist/public/assets/_MNAHC8bw.js +1 -0
- package/dist/public/assets/_MaR9Opge.js +1 -0
- package/dist/public/assets/{__SKAFxGa.js → _NxnEqCRC.js} +1 -1
- package/dist/public/assets/_NxnEqCRC.js.br +0 -0
- package/dist/public/assets/_OUf-pT7F.js +1 -0
- package/dist/public/assets/_QCvY_0EH.js +1 -0
- package/dist/public/assets/{_lEdDdBb0.js → _TMRapgLW.js} +1 -1
- package/dist/public/assets/_TMRapgLW.js.br +0 -0
- package/dist/public/assets/{_CzBj3vat.js → __2D61bRv.js} +1 -1
- package/dist/public/assets/_a3v9VRGR.js +1 -0
- package/dist/public/assets/{_HHBD7Mwb.js → _b1QkEZO6.js} +1 -1
- package/dist/public/assets/_b1QkEZO6.js.br +0 -0
- package/dist/public/assets/{_csnQFbUb.js → _czNfyPen.js} +1 -1
- package/dist/public/assets/_czNfyPen.js.br +0 -0
- package/dist/public/assets/_dubh06MD.js +1 -0
- package/dist/public/assets/_e7F7m2AO.js +1 -0
- package/dist/public/assets/_e7F7m2AO.js.br +0 -0
- package/dist/public/assets/_ep6TpAZh.js +1 -0
- package/dist/public/assets/{_nVVtAArW.js → _g5AR9tpA.js} +1 -1
- package/dist/public/assets/_g5AR9tpA.js.br +0 -0
- package/dist/public/assets/_gZV0em2r.js +1 -0
- package/dist/public/assets/_jiqsGnyP.js +1 -0
- package/dist/public/assets/{_CwwZF_Zb.js → _l0hDq-K2.js} +1 -1
- package/dist/public/assets/_l0hDq-K2.js.br +0 -0
- package/dist/public/assets/{_DuiVLwbC.js → _lSk10m1w.js} +1 -1
- package/dist/public/assets/_lSk10m1w.js.br +0 -0
- package/dist/public/assets/_lhsz8w9h.js +1 -0
- package/dist/public/assets/_nI9u4LRb.js +1 -0
- package/dist/public/assets/_n_zJ-LqK.js +1 -0
- package/dist/public/assets/_n_zJ-LqK.js.br +0 -0
- package/dist/public/assets/{_Ih3MoXl0.js → _o0VQYCUE.js} +1 -1
- package/dist/public/assets/_o0VQYCUE.js.br +0 -0
- package/dist/public/assets/{_BB9Q57R1.js → _oR0LYfq3.js} +1 -1
- package/dist/public/assets/_oR0LYfq3.js.br +0 -0
- package/dist/public/assets/{_znlpA0RF.js → _q330tDWb.js} +1 -1
- package/dist/public/assets/_q330tDWb.js.br +0 -0
- package/dist/public/assets/_qHB7bu0-.js +1 -0
- package/dist/public/assets/_so_VJkr5.js +1 -0
- package/dist/public/assets/_toCsz2cL.js +1 -0
- package/dist/public/assets/_u7bZ6UkK.js +1 -0
- package/dist/public/assets/{_CEcIHTni.js → _uP13C5Wl.js} +1 -1
- package/dist/public/assets/_uP13C5Wl.js.br +0 -0
- package/dist/public/assets/{_CRxrUJ-J.js → _xSVMCoQJ.js} +1 -1
- package/dist/public/assets/_xSVMCoQJ.js.br +0 -0
- package/dist/public/assets/{_CgHFvMzh.js → _xXNz6TCM.js} +1 -1
- package/dist/public/assets/_xXNz6TCM.js.br +0 -0
- package/dist/public/assets/_zmjyTuaK.js +1 -0
- package/dist/public/assets/files-view-XjUBLNCX.js +2 -0
- package/dist/public/assets/manage-workspace-DdpHBJIX.js +2 -0
- package/dist/public/assets/new-4NSZeknb.js +1 -0
- package/dist/public/assets/new-workspace-LRUvrRNr.js +2 -0
- package/dist/public/assets/review-view-AXkF7DUG.js +2 -0
- package/dist/public/assets/settings-4NSZeknb.js +1 -0
- package/dist/public/assets/settings-page-DhMS0VeA.js +2 -0
- package/dist/public/assets/styles-CJbPDDVA.css +1 -0
- package/dist/public/assets/styles-CJbPDDVA.css.br +0 -0
- package/dist/public/assets/w-4NSZeknb.js +1 -0
- package/dist/public/assets/w._-4NSZeknb.js +1 -0
- package/dist/public/assets/w._-BXrd0YFM.js +1 -0
- package/dist/public/assets/w._-Dwx7An1m.js +1 -0
- package/lib/setup/catalog.d.mts +2 -4
- package/lib/setup/catalog.mjs +0 -3
- package/lib/setup/doctor.mjs +1 -27
- package/lib/setup/firewall.mjs +3 -1
- package/lib/setup/install.mjs +0 -27
- package/package.json +1 -1
- package/dist/_DDikKLG_.js +0 -2
- package/dist/_ENqPMLjD.js +0 -2
- package/dist/public/assets/_2X4Nxaqb.js.br +0 -0
- package/dist/public/assets/_4CG1_0AB.js +0 -1
- package/dist/public/assets/_6e0Uc2iz.js +0 -1
- package/dist/public/assets/_7EbyoqQO.js +0 -1
- package/dist/public/assets/_AZdn-pAq.js.br +0 -0
- package/dist/public/assets/_B0YpwhBT.js.br +0 -0
- package/dist/public/assets/_B2E2dOUC.js +0 -1
- package/dist/public/assets/_B4Cg-RuN.js.br +0 -0
- package/dist/public/assets/_B7kCpNyD.js.br +0 -0
- package/dist/public/assets/_B9NIbsbr.js +0 -1
- package/dist/public/assets/_BAmZEVIH.js +0 -15
- package/dist/public/assets/_BAmZEVIH.js.br +0 -0
- package/dist/public/assets/_BB9Q57R1.js.br +0 -0
- package/dist/public/assets/_BCxjUBLn.js +0 -1
- package/dist/public/assets/_BCxjUBLn.js.br +0 -0
- package/dist/public/assets/_BD6kLg4i.js +0 -1
- package/dist/public/assets/_BFR8p6md.js.br +0 -0
- package/dist/public/assets/_BFkRvzwl.js.br +0 -0
- package/dist/public/assets/_BFwjqxJi.js +0 -1
- package/dist/public/assets/_BG7u51c6.js.br +0 -0
- package/dist/public/assets/_BGj24EPL.js +0 -1
- package/dist/public/assets/_BHZ3z1c3.js.br +0 -0
- package/dist/public/assets/_BLzCI5fA.js.br +0 -0
- package/dist/public/assets/_BNKR_PFf.js.br +0 -0
- package/dist/public/assets/_BP1-9YZQ.js.br +0 -0
- package/dist/public/assets/_BPoHnP8w.js.br +0 -0
- package/dist/public/assets/_BQK0Ua8P.js +0 -1
- package/dist/public/assets/_BUi5Lnyu.js.br +0 -0
- package/dist/public/assets/_BVF9vDBR.js.br +0 -0
- package/dist/public/assets/_BWRhy73M.js.br +0 -0
- package/dist/public/assets/_BapqrzTC.js +0 -1
- package/dist/public/assets/_Bb3HjdgA.js +0 -1
- package/dist/public/assets/_BbhdJgn7.js.br +0 -0
- package/dist/public/assets/_BdYyTR77.js.br +0 -0
- package/dist/public/assets/_BgJeYj6O.js +0 -1
- package/dist/public/assets/_Bgcqgb8f.js +0 -1
- package/dist/public/assets/_BjDtPv37.js +0 -7
- package/dist/public/assets/_BjDtPv37.js.br +0 -0
- package/dist/public/assets/_BjL4pgd1.js +0 -1
- package/dist/public/assets/_Bjupqvvl.js +0 -1
- package/dist/public/assets/_Bjupqvvl.js.br +0 -0
- package/dist/public/assets/_BjzIZvxS.js +0 -1
- package/dist/public/assets/_BkleQY2P.js +0 -1
- package/dist/public/assets/_BlGMtzOr.js +0 -1
- package/dist/public/assets/_Bo09pVsm.js +0 -1
- package/dist/public/assets/_Bo7UsgQ1.js +0 -1
- package/dist/public/assets/_Bo7UsgQ1.js.br +0 -0
- package/dist/public/assets/_BoN8WXNM.js +0 -1
- package/dist/public/assets/_BrAi38xM.js +0 -1
- package/dist/public/assets/_BrwDLY9A.js +0 -1
- package/dist/public/assets/_BsEmt4Xo.js.br +0 -0
- package/dist/public/assets/_BteLCW3W.js.br +0 -0
- package/dist/public/assets/_Bud8PVk2.js.br +0 -0
- package/dist/public/assets/_BwOL76jM.js +0 -1
- package/dist/public/assets/_Bzj2coXM.js.br +0 -0
- package/dist/public/assets/_C0qwHGvt.js +0 -1
- package/dist/public/assets/_C0qwHGvt.js.br +0 -0
- package/dist/public/assets/_C44-U0HZ.js +0 -1
- package/dist/public/assets/_C4TOoJt-.js.br +0 -0
- package/dist/public/assets/_C4i6tdPg.js.br +0 -0
- package/dist/public/assets/_C4lozmRu.js +0 -1
- package/dist/public/assets/_C63MsoW_.js.br +0 -0
- package/dist/public/assets/_C9xpsatV.js +0 -1
- package/dist/public/assets/_CBcRMH1I.js +0 -1
- package/dist/public/assets/_CEcIHTni.js.br +0 -0
- package/dist/public/assets/_CErLThfD.js +0 -1
- package/dist/public/assets/_CFDwxbE0.js +0 -1
- package/dist/public/assets/_CGYOyAi6.js.br +0 -0
- package/dist/public/assets/_CHCQDmjv.js +0 -1591
- package/dist/public/assets/_CHCQDmjv.js.br +0 -0
- package/dist/public/assets/_CKGtByJf.js.br +0 -0
- package/dist/public/assets/_CKYU_-EV.js +0 -1
- package/dist/public/assets/_CLDzlgJ_.js +0 -1
- package/dist/public/assets/_CNz608a5.js +0 -1
- package/dist/public/assets/_CO7giqIn.js +0 -1
- package/dist/public/assets/_COImNA0T.js +0 -1
- package/dist/public/assets/_CQIbdL8n.js +0 -2
- package/dist/public/assets/_CQIbdL8n.js.br +0 -0
- package/dist/public/assets/_CR91niWu.js +0 -1
- package/dist/public/assets/_CRxrUJ-J.js.br +0 -0
- package/dist/public/assets/_CUI5_Kc8.js +0 -1
- package/dist/public/assets/_CViysOIy.js +0 -2
- package/dist/public/assets/_CViysOIy.js.br +0 -0
- package/dist/public/assets/_CWUHe8y9.js +0 -1
- package/dist/public/assets/_CafkGbWO.js.br +0 -0
- package/dist/public/assets/_CamEQdEy.js +0 -1
- package/dist/public/assets/_CbLtpMzf.js +0 -1
- package/dist/public/assets/_CcUuSpPV.js +0 -1
- package/dist/public/assets/_CgHFvMzh.js.br +0 -0
- package/dist/public/assets/_ChYvsWUb.js +0 -1
- package/dist/public/assets/_CjMgo0is.js +0 -1
- package/dist/public/assets/_Clzo9X7l.js.br +0 -0
- package/dist/public/assets/_CoRZeDpA.js +0 -1
- package/dist/public/assets/_CoUiEb__.js +0 -1
- package/dist/public/assets/_CqVEbJdU.js.br +0 -0
- package/dist/public/assets/_CsnYZRX1.js +0 -1
- package/dist/public/assets/_Ctprx5dp.js.br +0 -0
- package/dist/public/assets/_CvO8C3EH.js +0 -1
- package/dist/public/assets/_CvTM_Hkg.js.br +0 -0
- package/dist/public/assets/_Cw53IOvr.js +0 -1
- package/dist/public/assets/_CwwZF_Zb.js.br +0 -0
- package/dist/public/assets/_CxA2ehGA.js.br +0 -0
- package/dist/public/assets/_CxGMPpn8.js.br +0 -0
- package/dist/public/assets/_CxPc5sJ4.js.br +0 -0
- package/dist/public/assets/_Cxa2TAUf.js +0 -1
- package/dist/public/assets/_Cy_niJWx.js +0 -1
- package/dist/public/assets/_D-6002zy.js.br +0 -0
- package/dist/public/assets/_D0Ae1m8t.js +0 -1
- package/dist/public/assets/_D1EJcr9u.js +0 -1
- package/dist/public/assets/_D6N1Ob8T.js.br +0 -0
- package/dist/public/assets/_D6fwgK2P.js.br +0 -0
- package/dist/public/assets/_D80egIjq.js.br +0 -0
- package/dist/public/assets/_D9G809lq.js.br +0 -0
- package/dist/public/assets/_DAgpiMnc.js +0 -1
- package/dist/public/assets/_DAqHF2w4.js.br +0 -0
- package/dist/public/assets/_DCPFy4S-.js.br +0 -0
- package/dist/public/assets/_DDdrxdVx.js +0 -1
- package/dist/public/assets/_DDwZqDeP.js.br +0 -0
- package/dist/public/assets/_DEpWf8ro.js +0 -1
- package/dist/public/assets/_DEpWf8ro.js.br +0 -0
- package/dist/public/assets/_DFMkO54P.js +0 -1
- package/dist/public/assets/_DFVrnUUI.js +0 -1
- package/dist/public/assets/_DH0yKcfT.js.br +0 -0
- package/dist/public/assets/_DHE02xjh.js +0 -1
- package/dist/public/assets/_DMxmrREh.js.br +0 -0
- package/dist/public/assets/_DNWcRd5b.js.br +0 -0
- package/dist/public/assets/_DOGQJlMz.js.br +0 -0
- package/dist/public/assets/_DUOr22R8.js +0 -1
- package/dist/public/assets/_DVfIcVOc.js.br +0 -0
- package/dist/public/assets/_DWvJUtgI.js +0 -1
- package/dist/public/assets/_DX_wI8Ku.js +0 -1
- package/dist/public/assets/_DZAyYSrR.js +0 -1
- package/dist/public/assets/_DbON91M6.js +0 -1
- package/dist/public/assets/_Dmr61lrF.js.br +0 -0
- package/dist/public/assets/_Do0f-7ZP.js +0 -1
- package/dist/public/assets/_DrUKq1tq.js.br +0 -0
- package/dist/public/assets/_DrmQTAwC.js.br +0 -0
- package/dist/public/assets/_DsE5ESQl.js +0 -1
- package/dist/public/assets/_DsODWTMK.js.br +0 -0
- package/dist/public/assets/_DuHnqTMi.js +0 -1
- package/dist/public/assets/_DuiVLwbC.js.br +0 -0
- package/dist/public/assets/_DvhYEPCI.js.br +0 -0
- package/dist/public/assets/_Dw-MQsnH.js.br +0 -0
- package/dist/public/assets/_DxG3J469.js.br +0 -0
- package/dist/public/assets/_DxMfRWk5.js.br +0 -0
- package/dist/public/assets/_DyJbxamO.js +0 -1
- package/dist/public/assets/_DyPWIZeU.js.br +0 -0
- package/dist/public/assets/_DzDisVDu.js +0 -1
- package/dist/public/assets/_DzYdOMqO.js.br +0 -0
- package/dist/public/assets/_Goz4NHSk.js.br +0 -0
- package/dist/public/assets/_HHBD7Mwb.js.br +0 -0
- package/dist/public/assets/_I0BsvzyX.js +0 -1
- package/dist/public/assets/_Ih3MoXl0.js.br +0 -0
- package/dist/public/assets/_Iy5kHWHO.js +0 -1
- package/dist/public/assets/_K5LXbS5I.js +0 -1
- package/dist/public/assets/_KcGCvv0h.js.br +0 -0
- package/dist/public/assets/_PCJNoAwu.js +0 -1
- package/dist/public/assets/_QSE08ioq.js.br +0 -0
- package/dist/public/assets/_S0t9nmdw.js.br +0 -0
- package/dist/public/assets/_UBNUF9Kp.js.br +0 -0
- package/dist/public/assets/_Uz6LspUB.js +0 -1
- package/dist/public/assets/_WaGpIsSa.js +0 -1
- package/dist/public/assets/_Yl99Ym1s.js.br +0 -0
- package/dist/public/assets/_Z73XNfnJ.js +0 -1
- package/dist/public/assets/__SKAFxGa.js.br +0 -0
- package/dist/public/assets/_c3cBqR4q.js +0 -1
- package/dist/public/assets/_csnQFbUb.js.br +0 -0
- package/dist/public/assets/_dLadtSBo.js +0 -1
- package/dist/public/assets/_f7Sgp2jB.js.br +0 -0
- package/dist/public/assets/_gjaB4W51.js +0 -1
- package/dist/public/assets/_l-1e5-uC.js +0 -1
- package/dist/public/assets/_lEdDdBb0.js.br +0 -0
- package/dist/public/assets/_lv7q9SmK.js.br +0 -0
- package/dist/public/assets/_nVVtAArW.js.br +0 -0
- package/dist/public/assets/_pSzK2ztp.js +0 -1
- package/dist/public/assets/_r9IZX58O.js +0 -1
- package/dist/public/assets/_rV9c6noX.js.br +0 -0
- package/dist/public/assets/_rk0M_hpt.js +0 -1
- package/dist/public/assets/_ru_rDgLp.js +0 -1
- package/dist/public/assets/_sAZ12zqC.js.br +0 -0
- package/dist/public/assets/_scmoaGnX.js +0 -1
- package/dist/public/assets/_tlSiPgo6.js.br +0 -0
- package/dist/public/assets/_w_kZ7oXG.js +0 -1
- package/dist/public/assets/_wlPMGofh.js.br +0 -0
- package/dist/public/assets/_ymY4YmGe.js.br +0 -0
- package/dist/public/assets/_zLL0pxIC.js.br +0 -0
- package/dist/public/assets/_znlpA0RF.js.br +0 -0
- package/dist/public/assets/files-view-BMZoqQCr.js +0 -2
- package/dist/public/assets/manage-workspace-DVER4MrG.js +0 -2
- package/dist/public/assets/new-BuZjAnZr.js +0 -1
- package/dist/public/assets/new-workspace-DG5o9P6p.js +0 -2
- package/dist/public/assets/review-view-B9KVei-m.js +0 -2
- package/dist/public/assets/settings-BuZjAnZr.js +0 -1
- package/dist/public/assets/settings-page-CbLeDUF_.js +0 -2
- package/dist/public/assets/styles-DUzVKiZK.css +0 -1
- package/dist/public/assets/styles-DUzVKiZK.css.br +0 -0
- package/dist/public/assets/w-BuZjAnZr.js +0 -1
- package/dist/public/assets/w._-BLFJb1Kc.js +0 -1
- package/dist/public/assets/w._-BuZjAnZr.js +0 -1
- package/dist/public/assets/w._-DDS58VZm.js +0 -1
package/bin/cli/stack.mjs
CHANGED
|
@@ -8,26 +8,40 @@ function recipe(branch) {
|
|
|
8
8
|
|
|
9
9
|
Stack only when the user asks, or when a change of several hundred lines
|
|
10
10
|
splits into parts each worth merging alone; never a layer per commit.
|
|
11
|
+
A stack is a convention, plain branches and PRs: each layer is cut from
|
|
12
|
+
the one below and its PR is based on it, which is how GitHub and work's
|
|
13
|
+
review both read a stack.
|
|
11
14
|
|
|
12
|
-
- The working branch (${branch}) stays the top; cut layers below it
|
|
13
|
-
first, as ${branch}-<layer
|
|
14
|
-
|
|
15
|
-
|
|
15
|
+
- The working branch (${branch}) stays the top; cut layers below it from
|
|
16
|
+
its own commits, bottom first, as ${branch}-<layer>, each with its PR's
|
|
17
|
+
base as gh reads it:
|
|
18
|
+
git branch ${branch}-<layer> <its last commit>
|
|
19
|
+
git config branch.${branch}-<layer>.gh-merge-base <layer below, else base>
|
|
20
|
+
- The user reviews it here a layer at a time, bottom first: link each as
|
|
21
|
+
[<layer>](/w/<id>/review?section=<repo>@<layer>) (\`work branches\`
|
|
22
|
+
lists them).
|
|
16
23
|
- Never check a layer out. Edit one by \`git commit --fixup <sha>\` on the
|
|
17
|
-
top, then:
|
|
24
|
+
top, then (every layer moves with the commits it holds):
|
|
18
25
|
GIT_SEQUENCE_EDITOR=: git rebase -i --autosquash --update-refs origin/<base>
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
(
|
|
23
|
-
|
|
26
|
+
A base that moved is \`git rebase --update-refs origin/<base>\` alike.
|
|
27
|
+
- Nothing goes up front. Push a layer and open its PR only when the user
|
|
28
|
+
says it is ready, after reviewing it, bottom first and never past a
|
|
29
|
+
layer still local (a PR's base must be on GitHub):
|
|
30
|
+
git push origin ${branch}-<layer>
|
|
31
|
+
gh pr create --head ${branch}-<layer> --base <layer below, else base>
|
|
32
|
+
The top goes last, its PR based on the last layer (one already open:
|
|
33
|
+
\`gh pr edit --base\`). After a rebase, force-push only what is pushed:
|
|
34
|
+
git push --force-with-lease --atomic origin <pushed branches…>
|
|
35
|
+
- Land bottom first, deleting the merged branch so GitHub moves the PR
|
|
36
|
+
above onto <base> (on the web, delete it after merging):
|
|
37
|
+
cut=$(git rev-parse ${branch}-<layer>)
|
|
38
|
+
gh pr merge <pr> --squash --delete-branch
|
|
39
|
+
then, on the top, move the rest onto the squash, and force-push what of
|
|
40
|
+
it is pushed:
|
|
24
41
|
git fetch
|
|
25
|
-
git
|
|
26
|
-
git branch -
|
|
27
|
-
|
|
28
|
-
- Once the top merges: \`gh stack unstack --local\`.
|
|
29
|
-
- Link a layer for review as [<layer>](/w/<id>/review?section=<repo>@<layer>);
|
|
30
|
-
\`work branches\` lists every layer with its link.`;
|
|
42
|
+
git rebase --update-refs --onto origin/<base> $cut
|
|
43
|
+
git config branch.<layer above>.gh-merge-base <base> # not the top's
|
|
44
|
+
- A lane stacks the same way, in its worktree, its branch the top.`;
|
|
31
45
|
}
|
|
32
46
|
|
|
33
47
|
export const commands = [
|
|
@@ -35,9 +49,9 @@ export const commands = [
|
|
|
35
49
|
name: "stack",
|
|
36
50
|
summary: "how to stack branches in this workspace (prints the recipe)",
|
|
37
51
|
help: `work stack [id|name]
|
|
38
|
-
Prints how to stack branches
|
|
39
|
-
branch filled in: when to, cutting layers, editing one
|
|
40
|
-
it out, merging a layer and rebasing the rest.`,
|
|
52
|
+
Prints how to stack branches here, as plain branches and PRs, with the
|
|
53
|
+
workspace's branch filled in: when to, cutting layers, editing one
|
|
54
|
+
without checking it out, merging a layer and rebasing the rest.`,
|
|
41
55
|
async run(ctx) {
|
|
42
56
|
let branch = "<workspace-branch>";
|
|
43
57
|
try {
|
package/bin/cli/topic.mjs
CHANGED
|
@@ -84,7 +84,7 @@ function mergeBases(dir) {
|
|
|
84
84
|
* copy. This workspace's own branches (it, and the topics one stacks on)
|
|
85
85
|
* go by the local one: they may never be pushed, and here is where they
|
|
86
86
|
* move. Any other (the repo's base) goes by origin's: a bare cache's local
|
|
87
|
-
* copy of it is as old as the clone
|
|
87
|
+
* copy of it is as old as the clone. */
|
|
88
88
|
function baseRef(dir, name, ws, foreign) {
|
|
89
89
|
const local = has(dir, `refs/heads/${name}`) ? name : null;
|
|
90
90
|
const remote = has(dir, `refs/remotes/origin/${name}`)
|
package/bin/work.mjs
CHANGED
|
@@ -76,6 +76,7 @@ import {
|
|
|
76
76
|
applyPlan,
|
|
77
77
|
dropText,
|
|
78
78
|
firewallProbe,
|
|
79
|
+
programOf,
|
|
79
80
|
serviceNode,
|
|
80
81
|
} from "../lib/setup/firewall.mjs";
|
|
81
82
|
import { installTool, repairGhHelpers } from "../lib/setup/install.mjs";
|
|
@@ -958,6 +959,7 @@ function allowScriptsArgs() {
|
|
|
958
959
|
|
|
959
960
|
async function update() {
|
|
960
961
|
log("updating @dylanpiercey/work");
|
|
962
|
+
const before = serviceCli();
|
|
961
963
|
// `--prefer-online`: npm serves `latest` from a cached packument for a
|
|
962
964
|
// few minutes after a publish, so an update right behind a release
|
|
963
965
|
// reinstalled the version already running.
|
|
@@ -974,8 +976,19 @@ async function update() {
|
|
|
974
976
|
],
|
|
975
977
|
{ stdio },
|
|
976
978
|
);
|
|
977
|
-
//
|
|
978
|
-
|
|
979
|
+
// Finish with the CLI that npm just installed, found where that npm
|
|
980
|
+
// installs, never `work` by name: the npm and the `work` first on PATH
|
|
981
|
+
// can be two nodes' (a Homebrew npm ahead of mise's shims), and the
|
|
982
|
+
// other install's setup points the service back at itself, so every
|
|
983
|
+
// update left the service on the old release.
|
|
984
|
+
const root = execFileSync("npm", ["root", "-g"], {
|
|
985
|
+
encoding: "utf8",
|
|
986
|
+
stdio: ["ignore", "pipe", 2],
|
|
987
|
+
}).trim();
|
|
988
|
+
const cli = path.join(root, "@dylanpiercey", "work", "bin", "work.mjs");
|
|
989
|
+
if (!fs.existsSync(cli))
|
|
990
|
+
die(`npm installed into ${root}, but there is no ${cli}`);
|
|
991
|
+
sh(cli, [
|
|
979
992
|
"setup",
|
|
980
993
|
...(yes ? ["--yes"] : []),
|
|
981
994
|
...args.filter((a) =>
|
|
@@ -991,6 +1004,21 @@ async function update() {
|
|
|
991
1004
|
...flagValues("--allow-host").flatMap((h) => ["--allow-host", h]),
|
|
992
1005
|
...flagValues("--disallow-host").flatMap((h) => ["--disallow-host", h]),
|
|
993
1006
|
]);
|
|
1007
|
+
// The service now runs what npm updated; an install it or this shell ran
|
|
1008
|
+
// before is left behind at its old release.
|
|
1009
|
+
const now = realpathOr(cli);
|
|
1010
|
+
const left = new Map();
|
|
1011
|
+
for (const [w, was] of [
|
|
1012
|
+
[before, "the service ran"],
|
|
1013
|
+
[installAt(fileURLToPath(import.meta.url)), "`work` here ran"],
|
|
1014
|
+
]) {
|
|
1015
|
+
if (w?.prefix && w.real !== now && !left.has(w.real))
|
|
1016
|
+
left.set(
|
|
1017
|
+
w.real,
|
|
1018
|
+
`${was} ${tilde(w.path)} (${w.version}), not the install npm updated (${tilde(cli)}); remove it: ${removeHint(w)}`,
|
|
1019
|
+
);
|
|
1020
|
+
}
|
|
1021
|
+
for (const note of left.values()) warn(note);
|
|
994
1022
|
}
|
|
995
1023
|
|
|
996
1024
|
/** Machine readiness from lib/setup — the same probe the Settings page runs. */
|
|
@@ -1015,38 +1043,39 @@ async function doctorCmd() {
|
|
|
1015
1043
|
}
|
|
1016
1044
|
|
|
1017
1045
|
/**
|
|
1018
|
-
* This `work`, every other one on PATH (the first is what `work` runs)
|
|
1019
|
-
* each with its version, and the
|
|
1020
|
-
*
|
|
1021
|
-
*
|
|
1022
|
-
*
|
|
1046
|
+
* This `work`, every other one on PATH (the first is what `work` runs) or
|
|
1047
|
+
* on the service's, each with the install it runs and its version, and the
|
|
1048
|
+
* service: the CLI its definition runs and the release the running one
|
|
1049
|
+
* reports. A package manager's global left behind — a Homebrew node's
|
|
1050
|
+
* under mise's — shadows the one kept up to date, and the doctor it runs is
|
|
1051
|
+
* then old code describing a machine it no longer knows.
|
|
1023
1052
|
*/
|
|
1024
1053
|
async function workInstalls() {
|
|
1025
|
-
const self =
|
|
1054
|
+
const self = installAt(fileURLToPath(import.meta.url));
|
|
1055
|
+
const shell = (process.env.PATH || "").split(path.delimiter);
|
|
1056
|
+
const servicePath = (installedServiceEnv().PATH || "").split(path.delimiter);
|
|
1026
1057
|
const onPath = [];
|
|
1027
1058
|
const seen = new Set();
|
|
1028
|
-
for (const dir of (
|
|
1059
|
+
for (const dir of new Set([...shell, ...servicePath])) {
|
|
1029
1060
|
if (!dir) continue;
|
|
1030
|
-
const
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
if (seen.has(real)) continue;
|
|
1039
|
-
seen.add(real);
|
|
1040
|
-
onPath.push({ path: file, real, version: installVersion(real, file) });
|
|
1041
|
-
}
|
|
1042
|
-
let service = null;
|
|
1061
|
+
const w = workOnPath(path.join(dir, "work"));
|
|
1062
|
+
if (!w || seen.has(w.real)) continue;
|
|
1063
|
+
seen.add(w.real);
|
|
1064
|
+
onPath.push(shell.includes(dir) ? w : { ...w, servicePath: true });
|
|
1065
|
+
}
|
|
1066
|
+
// A service that answers without a version is from before /api/boot
|
|
1067
|
+
// carried one: older than any CLI that asks.
|
|
1068
|
+
const service = { answered: false, version: null, cli: serviceCli() };
|
|
1043
1069
|
try {
|
|
1044
1070
|
const res = await fetch(`${serverUrl()}/api/boot`, {
|
|
1045
1071
|
signal: AbortSignal.timeout(2000),
|
|
1046
1072
|
});
|
|
1047
|
-
if (res.ok)
|
|
1073
|
+
if (res.ok) {
|
|
1074
|
+
service.version = (await res.json()).version ?? null;
|
|
1075
|
+
service.answered = true;
|
|
1076
|
+
}
|
|
1048
1077
|
} catch {}
|
|
1049
|
-
return { self
|
|
1078
|
+
return { self, onPath, service };
|
|
1050
1079
|
}
|
|
1051
1080
|
|
|
1052
1081
|
function realpathOr(file) {
|
|
@@ -1057,28 +1086,118 @@ function realpathOr(file) {
|
|
|
1057
1086
|
}
|
|
1058
1087
|
}
|
|
1059
1088
|
|
|
1060
|
-
/**
|
|
1061
|
-
*
|
|
1062
|
-
|
|
1089
|
+
/** The package of work a file is part of, read from its package.json and
|
|
1090
|
+
* never by running anything: `prefix` is the npm prefix whose global it
|
|
1091
|
+
* is, null for a checkout. */
|
|
1092
|
+
function installAt(file) {
|
|
1093
|
+
const real = realpathOr(file);
|
|
1063
1094
|
let dir = path.dirname(real);
|
|
1064
1095
|
for (let i = 0; i < 3; i++) {
|
|
1065
1096
|
try {
|
|
1066
1097
|
const p = JSON.parse(fs.readFileSync(path.join(dir, "package.json")));
|
|
1067
|
-
if (p.name === "@dylanpiercey/work")
|
|
1098
|
+
if (p.name === "@dylanpiercey/work") {
|
|
1099
|
+
const prefix = /^(.*)\/lib\/node_modules\/@dylanpiercey\/work$/.exec(
|
|
1100
|
+
dir,
|
|
1101
|
+
)?.[1];
|
|
1102
|
+
return {
|
|
1103
|
+
path: file,
|
|
1104
|
+
real,
|
|
1105
|
+
version: p.version ?? null,
|
|
1106
|
+
prefix: prefix ?? null,
|
|
1107
|
+
};
|
|
1108
|
+
}
|
|
1068
1109
|
} catch {}
|
|
1069
1110
|
dir = path.dirname(dir);
|
|
1070
1111
|
}
|
|
1112
|
+
return null;
|
|
1113
|
+
}
|
|
1114
|
+
|
|
1115
|
+
/** Version managers whose shims stand in for `work`. A shim is the
|
|
1116
|
+
* manager's own binary (mise links every shim to itself) or a script that
|
|
1117
|
+
* hands off to it, so neither its path nor its target is the install: the
|
|
1118
|
+
* manager's `which` names that. A global uninstalled from one of its
|
|
1119
|
+
* nodes leaves the shim until a reshim. */
|
|
1120
|
+
function versionManagers() {
|
|
1121
|
+
return [
|
|
1122
|
+
{
|
|
1123
|
+
id: "mise",
|
|
1124
|
+
shim: (file, real) => path.basename(real) === "mise",
|
|
1125
|
+
which: (real) => [real, ["which", "work"]],
|
|
1126
|
+
installs: /\/mise\/installs\/node\//,
|
|
1127
|
+
reshim: "mise reshim",
|
|
1128
|
+
},
|
|
1129
|
+
{
|
|
1130
|
+
id: "asdf",
|
|
1131
|
+
shim: (file) => /\/\.asdf\/shims$/.test(path.dirname(file)),
|
|
1132
|
+
which: () => ["asdf", ["which", "work"]],
|
|
1133
|
+
installs: /\/\.asdf\/installs\/nodejs\//,
|
|
1134
|
+
reshim: "asdf reshim nodejs",
|
|
1135
|
+
},
|
|
1136
|
+
{
|
|
1137
|
+
id: "nodenv",
|
|
1138
|
+
shim: (file) => /\/\.nodenv\/shims$/.test(path.dirname(file)),
|
|
1139
|
+
which: () => ["nodenv", ["which", "work"]],
|
|
1140
|
+
installs: /\/\.nodenv\/versions\//,
|
|
1141
|
+
reshim: "nodenv rehash",
|
|
1142
|
+
},
|
|
1143
|
+
];
|
|
1144
|
+
}
|
|
1145
|
+
|
|
1146
|
+
/** The install a `work` on PATH runs: an npm global's bin links into the
|
|
1147
|
+
* package, a shim's is the one its manager names, and anything else is
|
|
1148
|
+
* asked its version. */
|
|
1149
|
+
function workOnPath(file) {
|
|
1150
|
+
try {
|
|
1151
|
+
if (!fs.statSync(file).isFile()) return null;
|
|
1152
|
+
} catch {
|
|
1153
|
+
return null;
|
|
1154
|
+
}
|
|
1155
|
+
const own = installAt(file);
|
|
1156
|
+
if (own) return own;
|
|
1157
|
+
const real = realpathOr(file);
|
|
1158
|
+
const manager = versionManagers().find((m) => m.shim(file, real));
|
|
1159
|
+
if (manager) {
|
|
1160
|
+
const [bin, argv] = manager.which(real);
|
|
1161
|
+
const out = spawnSync(bin, argv, { encoding: "utf8", timeout: 5000 });
|
|
1162
|
+
const target = out.status === 0 && out.stdout.trim();
|
|
1163
|
+
const w = target && installAt(target);
|
|
1164
|
+
if (w) return { ...w, path: file, manager: manager.id };
|
|
1165
|
+
}
|
|
1071
1166
|
const out = spawnSync(file, ["version"], { encoding: "utf8", timeout: 5000 });
|
|
1072
|
-
|
|
1167
|
+
const version = /^\d+\.\d+\.\d+\S*/.exec((out.stdout || "").trim())?.[0];
|
|
1168
|
+
return { path: file, real, version: version ?? null, prefix: null };
|
|
1169
|
+
}
|
|
1170
|
+
|
|
1171
|
+
/** The work the service definition runs (`[caffeinate -s] <cli> start`,
|
|
1172
|
+
* or a checkout's run script under work-source local): the first program
|
|
1173
|
+
* in its argv that is part of a work package. */
|
|
1174
|
+
function serviceCli() {
|
|
1175
|
+
let text;
|
|
1176
|
+
try {
|
|
1177
|
+
text = fs.readFileSync(serviceFile(), "utf8");
|
|
1178
|
+
} catch {
|
|
1179
|
+
return null;
|
|
1180
|
+
}
|
|
1181
|
+
for (const arg of programOf(text)) {
|
|
1182
|
+
const w = path.isAbsolute(arg) && installAt(arg);
|
|
1183
|
+
if (w) return w;
|
|
1184
|
+
}
|
|
1185
|
+
return null;
|
|
1073
1186
|
}
|
|
1074
1187
|
|
|
1075
|
-
/** How to remove an
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1188
|
+
/** How to remove an npm global of work: npm's uninstall at the prefix it
|
|
1189
|
+
* is in (named: the npm first on PATH may be another node's, whose own
|
|
1190
|
+
* prefix holds some other install), then its version manager's reshim.
|
|
1191
|
+
* Null for anything else, which is not this CLI's to remove. */
|
|
1192
|
+
function removeHint(w) {
|
|
1193
|
+
if (!w.prefix) return null;
|
|
1194
|
+
const manager = versionManagers().find(
|
|
1195
|
+
(m) => m.id === w.manager || m.installs.test(`${w.prefix}/`),
|
|
1196
|
+
);
|
|
1197
|
+
const prefix = /^[\w@%+=:,./-]+$/.test(w.prefix)
|
|
1198
|
+
? w.prefix
|
|
1199
|
+
: `'${w.prefix.replace(/'/g, `'\\''`)}'`;
|
|
1200
|
+
return `npm uninstall -g --prefix ${prefix} @dylanpiercey/work${manager ? ` && ${manager.reshim}` : ""}`;
|
|
1082
1201
|
}
|
|
1083
1202
|
|
|
1084
1203
|
function newest(versions) {
|
|
@@ -1090,23 +1209,56 @@ function newest(versions) {
|
|
|
1090
1209
|
}, null);
|
|
1091
1210
|
}
|
|
1092
1211
|
|
|
1093
|
-
/** The doctor's warnings about which `work` this is
|
|
1212
|
+
/** The doctor's warnings about which `work` this is and which the service
|
|
1213
|
+
* runs. */
|
|
1094
1214
|
function installNotes({ self, onPath, service }) {
|
|
1095
1215
|
const notes = [];
|
|
1096
|
-
|
|
1097
|
-
|
|
1216
|
+
const runs = service.cli;
|
|
1217
|
+
// The newest install here is the one to keep: an update installs it,
|
|
1218
|
+
// and whatever else is here was left behind, the service's included.
|
|
1219
|
+
const current = newest([self.version, ...onPath.map((w) => w.version)]);
|
|
1220
|
+
const behind = (v) => v !== current && newest([v, current]) === current;
|
|
1221
|
+
const keep = [...onPath.filter((w) => !w.servicePath), self].find(
|
|
1222
|
+
(w) => w.prefix && w.version === current,
|
|
1223
|
+
);
|
|
1224
|
+
// `setup` from the install kept points the service at it, unless the
|
|
1225
|
+
// service runs a checkout (work-source local), which setup would undo.
|
|
1226
|
+
const move =
|
|
1227
|
+
keep &&
|
|
1228
|
+
runs?.prefix &&
|
|
1229
|
+
`\`${keep === onPath[0] ? "work" : keep.path} setup\``;
|
|
1230
|
+
if (service.answered && service.version !== self.version) {
|
|
1231
|
+
const theirs = runs ?? onPath.find((w) => w.version === service.version);
|
|
1232
|
+
notes.push(
|
|
1233
|
+
`this work is ${self.version} (${tilde(self.path)}), but the running service is ${service.version ?? "older (it does not report its version)"}, so what this doctor says is an older or newer release's${theirs ? `: the service's is ${tilde(theirs.path)}` : ""}${move && behind(service.version) ? `; run ${move} to move it to ${current}` : ""}`,
|
|
1234
|
+
);
|
|
1235
|
+
} else if (!service.answered && runs && runs.version !== self.version) {
|
|
1098
1236
|
notes.push(
|
|
1099
|
-
`
|
|
1237
|
+
`the service is set to run ${tilde(runs.path)} (${runs.version ?? "unknown version"}), not this work (${self.version}, ${tilde(self.path)})${move && behind(runs.version) ? `; run ${move} to move it to ${current}` : ""}`,
|
|
1100
1238
|
);
|
|
1101
1239
|
}
|
|
1102
1240
|
if (onPath.length > 1) {
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1241
|
+
const lines = onPath.map((w, i) => {
|
|
1242
|
+
const tags = [
|
|
1243
|
+
i === 0 && !w.servicePath && "what `work` runs",
|
|
1244
|
+
w.servicePath && "on the service's PATH",
|
|
1245
|
+
w.real === runs?.real && "the service's",
|
|
1246
|
+
].filter(Boolean);
|
|
1247
|
+
const hint = removeHint(w);
|
|
1248
|
+
// The service's own install goes only once the service is off it:
|
|
1249
|
+
// removed first, it would stop the service.
|
|
1250
|
+
const fix =
|
|
1251
|
+
w.version === current
|
|
1252
|
+
? ""
|
|
1253
|
+
: !hint
|
|
1254
|
+
? "not an npm global: remove it the way it was installed"
|
|
1255
|
+
: w.real !== runs?.real
|
|
1256
|
+
? `remove: ${hint}`
|
|
1257
|
+
: move
|
|
1258
|
+
? `remove, once ${move} has moved the service off it: ${hint}`
|
|
1259
|
+
: "";
|
|
1260
|
+
return ` ${tilde(w.path)} → ${w.version ?? "unknown version"}${tags.length ? ` (${tags.join(", ")})` : ""}${fix ? `\n ${fix}` : ""}`;
|
|
1261
|
+
});
|
|
1110
1262
|
notes.push(`more than one work is on PATH:\n${lines.join("\n")}`);
|
|
1111
1263
|
}
|
|
1112
1264
|
return notes;
|
|
@@ -1129,11 +1129,6 @@ var TOOLS = [
|
|
|
1129
1129
|
mise: "gh",
|
|
1130
1130
|
required: true
|
|
1131
1131
|
},
|
|
1132
|
-
{
|
|
1133
|
-
id: "gh-stack",
|
|
1134
|
-
label: "gh stack",
|
|
1135
|
-
ghExtension: "github/gh-stack"
|
|
1136
|
-
},
|
|
1137
1132
|
{
|
|
1138
1133
|
id: "ripgrep",
|
|
1139
1134
|
label: "ripgrep",
|
|
@@ -2321,19 +2316,6 @@ async function canStayAwake() {
|
|
|
2321
2316
|
], { timeout: 5e3 });
|
|
2322
2317
|
return ok;
|
|
2323
2318
|
}
|
|
2324
|
-
/** gh's extensions, repo → version (`gh extension list`: name, repo,
|
|
2325
|
-
* version by tabs). Null without gh, which is what installs them. */
|
|
2326
|
-
async function ghExtensions() {
|
|
2327
|
-
if (!which("gh")) return null;
|
|
2328
|
-
const { ok, stdout } = await run("gh", ["extension", "list"]);
|
|
2329
|
-
if (!ok) return /* @__PURE__ */ new Map();
|
|
2330
|
-
const out = /* @__PURE__ */ new Map();
|
|
2331
|
-
for (const line of stdout.split("\n")) {
|
|
2332
|
-
const [, repo, version = ""] = line.split(" ");
|
|
2333
|
-
if (repo) out.set(repo.trim(), version.trim().replace(/^v/, ""));
|
|
2334
|
-
}
|
|
2335
|
-
return out;
|
|
2336
|
-
}
|
|
2337
2319
|
function parseJson(text) {
|
|
2338
2320
|
try {
|
|
2339
2321
|
return JSON.parse(text);
|
|
@@ -2386,11 +2368,10 @@ async function doctor(opts = {}) {
|
|
|
2386
2368
|
...opts.hosts || [],
|
|
2387
2369
|
...ghKnownHosts()
|
|
2388
2370
|
]);
|
|
2389
|
-
const [versions, github, awake,
|
|
2371
|
+
const [versions, github, awake, helpers, tailscale, firewall] = await Promise.all([
|
|
2390
2372
|
miseVersions(),
|
|
2391
2373
|
Promise.all([...hostSet].map(githubHostStatus)),
|
|
2392
2374
|
canStayAwake(),
|
|
2393
|
-
ghExtensions(),
|
|
2394
2375
|
staleGhHelpers(),
|
|
2395
2376
|
tailscaleProbe(opts),
|
|
2396
2377
|
opts.firewall !== void 0 ? opts.firewall : firewallProbe({
|
|
@@ -2401,17 +2382,6 @@ async function doctor(opts = {}) {
|
|
|
2401
2382
|
})
|
|
2402
2383
|
]);
|
|
2403
2384
|
const tools = TOOLS.map((t) => {
|
|
2404
|
-
if (t.ghExtension) {
|
|
2405
|
-
const version = extensions?.get(t.ghExtension);
|
|
2406
|
-
return {
|
|
2407
|
-
id: t.id,
|
|
2408
|
-
label: t.label,
|
|
2409
|
-
required: !!t.required,
|
|
2410
|
-
installed: version !== void 0,
|
|
2411
|
-
version: version || void 0,
|
|
2412
|
-
installable: extensions !== null
|
|
2413
|
-
};
|
|
2414
|
-
}
|
|
2415
2385
|
const found = which(t.bin);
|
|
2416
2386
|
return {
|
|
2417
2387
|
id: t.id,
|
|
@@ -9508,7 +9478,7 @@ function publishChange(sessionId) {
|
|
|
9508
9478
|
const row = get("SELECT workspace_id FROM sessions WHERE id = ?", sessionId);
|
|
9509
9479
|
if (row?.workspace_id) {
|
|
9510
9480
|
const workspaceId = row.workspace_id;
|
|
9511
|
-
import("./
|
|
9481
|
+
import("./_BKkT73fv.js").then((m) => m.notifySessionsChanged(workspaceId));
|
|
9512
9482
|
return;
|
|
9513
9483
|
}
|
|
9514
9484
|
publish("sessions.changed");
|
|
@@ -14839,15 +14809,6 @@ async function installMise(opts = {}) {
|
|
|
14839
14809
|
await runRemoteScript("https://mise.run", "sh", opts);
|
|
14840
14810
|
if (!which("mise")) throw new Error("mise install finished but binary not found");
|
|
14841
14811
|
}
|
|
14842
|
-
/** A catalog tool that is a gh extension: gh, not mise, owns it. The name
|
|
14843
|
-
* gh's upgrade and remove take is the repo's less its `gh-`. */
|
|
14844
|
-
function ghExtension(idOrName) {
|
|
14845
|
-
const repo = toolById(idOrName)?.ghExtension;
|
|
14846
|
-
return repo ? {
|
|
14847
|
-
repo,
|
|
14848
|
-
name: repo.slice(repo.indexOf("/") + 1).replace(/^gh-/, "")
|
|
14849
|
-
} : null;
|
|
14850
|
-
}
|
|
14851
14812
|
function miseName(idOrName) {
|
|
14852
14813
|
const t = toolById(idOrName);
|
|
14853
14814
|
if (t && !t.mise) throw new Error(`${t.label} is a system package. Install it with the system package manager`);
|
|
@@ -14856,16 +14817,6 @@ function miseName(idOrName) {
|
|
|
14856
14817
|
/** `mise use -g name@version` — installs (or re-pins) a global tool. Accepts
|
|
14857
14818
|
* catalog ids or any mise registry short name (Settings search). */
|
|
14858
14819
|
async function installTool(idOrName, { version = "latest", ...opts } = {}) {
|
|
14859
|
-
const ext = ghExtension(idOrName);
|
|
14860
|
-
if (ext) {
|
|
14861
|
-
opts.log?.(`gh extension install ${ext.repo}`);
|
|
14862
|
-
await runStreaming("gh", [
|
|
14863
|
-
"extension",
|
|
14864
|
-
"install",
|
|
14865
|
-
ext.repo
|
|
14866
|
-
], opts);
|
|
14867
|
-
return;
|
|
14868
|
-
}
|
|
14869
14820
|
await installMise(opts);
|
|
14870
14821
|
const name = miseName(idOrName);
|
|
14871
14822
|
opts.log?.(`mise use -g ${name}@${version}`);
|
|
@@ -14879,16 +14830,6 @@ async function installTool(idOrName, { version = "latest", ...opts } = {}) {
|
|
|
14879
14830
|
/** Move to the newest release and rewrite the global pin to match
|
|
14880
14831
|
* (`--bump`), so an exact pin such as `1.5.0` updates too. */
|
|
14881
14832
|
async function updateTool(idOrName, opts = {}) {
|
|
14882
|
-
const ext = ghExtension(idOrName);
|
|
14883
|
-
if (ext) {
|
|
14884
|
-
opts.log?.(`gh extension upgrade ${ext.name}`);
|
|
14885
|
-
await runStreaming("gh", [
|
|
14886
|
-
"extension",
|
|
14887
|
-
"upgrade",
|
|
14888
|
-
ext.name
|
|
14889
|
-
], opts);
|
|
14890
|
-
return;
|
|
14891
|
-
}
|
|
14892
14833
|
const name = miseName(idOrName);
|
|
14893
14834
|
opts.log?.(`mise upgrade --bump ${name}`);
|
|
14894
14835
|
await runStreaming("mise", [
|
|
@@ -14902,16 +14843,6 @@ async function updateTool(idOrName, opts = {}) {
|
|
|
14902
14843
|
async function removeTool(idOrName, opts = {}) {
|
|
14903
14844
|
const t = toolById(idOrName);
|
|
14904
14845
|
if (t?.required) throw new Error(`${t.label} is required`);
|
|
14905
|
-
const ext = ghExtension(idOrName);
|
|
14906
|
-
if (ext) {
|
|
14907
|
-
opts.log?.(`gh extension remove ${ext.name}`);
|
|
14908
|
-
await runStreaming("gh", [
|
|
14909
|
-
"extension",
|
|
14910
|
-
"remove",
|
|
14911
|
-
ext.name
|
|
14912
|
-
], opts);
|
|
14913
|
-
return;
|
|
14914
|
-
}
|
|
14915
14846
|
const name = miseName(idOrName);
|
|
14916
14847
|
opts.log?.(`mise unuse -g ${name}`);
|
|
14917
14848
|
await runStreaming("mise", [
|
|
@@ -17645,7 +17576,7 @@ function notifySessionsChanged(workspaceId) {
|
|
|
17645
17576
|
async function emitSessionsChanged(workspaceId) {
|
|
17646
17577
|
try {
|
|
17647
17578
|
const states = await sessionStates();
|
|
17648
|
-
const { teamsOf } = await import("./
|
|
17579
|
+
const { teamsOf } = await import("./_BviTiVOB.js");
|
|
17649
17580
|
publish("sessions.changed", {
|
|
17650
17581
|
workspaceId,
|
|
17651
17582
|
sessions: listSessions(workspaceId).map((s) => ({
|