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