@dylanpiercey/work 0.0.204 → 0.0.205
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/work.mjs +220 -63
- package/dist/_CWyeRc54.js +2 -0
- package/dist/{_B9FeLAO5.js → _C_-lYJlp.js} +394 -114
- package/dist/index.mjs +15316 -13911
- package/dist/public/assets/_-OlchSkR.js +1 -0
- package/dist/public/assets/_2V7v-g6H.js +1 -0
- package/dist/public/assets/_5FuvVnQD.js +1 -0
- package/dist/public/assets/_5izm_sOI.js +1 -0
- package/dist/public/assets/_5izm_sOI.js.br +0 -0
- package/dist/public/assets/_6AplNi7Z.js +1 -0
- package/dist/public/assets/_6AplNi7Z.js.br +0 -0
- package/dist/public/assets/_8YGIApOo.js +1 -0
- package/dist/public/assets/{_BQ6oRmZj.js → _AHFaCvQU.js} +1 -1
- package/dist/public/assets/_AHFaCvQU.js.br +0 -0
- package/dist/public/assets/_B0mn17Dk.js +1 -0
- package/dist/public/assets/_B0roVhqi.js +1 -0
- package/dist/public/assets/{_52XwXqiy.js → _B16QFqgy.js} +1 -1
- package/dist/public/assets/_B16QFqgy.js.br +0 -0
- package/dist/public/assets/{_bX1A3m6x.js → _B2f-LxUk.js} +1 -1
- package/dist/public/assets/_B2f-LxUk.js.br +0 -0
- package/dist/public/assets/_B7rzA4Vo.js +1 -0
- package/dist/public/assets/_B7rzA4Vo.js.br +0 -0
- package/dist/public/assets/_B9EmUOCA.js +1 -0
- package/dist/public/assets/_B9EmUOCA.js.br +0 -0
- package/dist/public/assets/_BD9gP_kw.js +1 -0
- package/dist/public/assets/_BD9gP_kw.js.br +0 -0
- package/dist/public/assets/_BDHG8Nmi.js +9 -0
- package/dist/public/assets/_BDHG8Nmi.js.br +0 -0
- package/dist/public/assets/{_DNQWXflz.js → _BDWKc_9X.js} +1 -1
- package/dist/public/assets/_BDWKc_9X.js.br +0 -0
- package/dist/public/assets/{_BVT8cLW8.js → _BE8KQ5PW.js} +1 -1
- package/dist/public/assets/_BE8KQ5PW.js.br +0 -0
- package/dist/public/assets/{_BPJgPGy_.js → _BFgV8m7c.js} +1 -1
- package/dist/public/assets/_BFgV8m7c.js.br +0 -0
- package/dist/public/assets/_BHZ-Cv2U.js +1 -0
- package/dist/public/assets/{_BDX0L_3F.js → _BHcaNOzL.js} +1 -1
- package/dist/public/assets/_BHcaNOzL.js.br +0 -0
- package/dist/public/assets/_BKM2-z0e.js +1 -0
- package/dist/public/assets/_BN0AE2HC.js +1 -0
- package/dist/public/assets/_BNORURCQ.js +1 -0
- package/dist/public/assets/_BNORURCQ.js.br +0 -0
- package/dist/public/assets/_BNm4Ae9_.js +1 -0
- package/dist/public/assets/_BNm4Ae9_.js.br +0 -0
- package/dist/public/assets/_BOm1SpkD.js +1 -0
- package/dist/public/assets/{_CM90yd32.js → _BPhE-idg.js} +1 -1
- package/dist/public/assets/_BPhE-idg.js.br +0 -0
- package/dist/public/assets/{_rCrnzYGa.js → _BPtQ2PEh.js} +1 -1
- package/dist/public/assets/_BPtQ2PEh.js.br +0 -0
- package/dist/public/assets/_BRGmqkNr.js +1 -0
- package/dist/public/assets/_BRnslEKE.js +1 -0
- package/dist/public/assets/{_DZRRUShG.js → _BSSQw7B1.js} +1 -1
- package/dist/public/assets/_BSSQw7B1.js.br +0 -0
- package/dist/public/assets/{_B4mrAOJe.js → _BUfLoUyd.js} +1 -1
- package/dist/public/assets/_BUfLoUyd.js.br +0 -0
- package/dist/public/assets/{_DCjHVJN2.js → _BVLWii1t.js} +1 -1
- package/dist/public/assets/_BVLWii1t.js.br +0 -0
- package/dist/public/assets/{_DCGza5jQ.js → _BWAs5afd.js} +1 -1
- package/dist/public/assets/_BWAs5afd.js.br +0 -0
- package/dist/public/assets/_BYdCKt3O.js +1 -0
- package/dist/public/assets/_B_JOtc1M.js +1 -0
- package/dist/public/assets/_BcXiRBkz.js +1 -0
- package/dist/public/assets/_BgKdTCD6.js +1 -0
- package/dist/public/assets/{_CXecCgJ4.js → _BixjwCO8.js} +1 -1
- package/dist/public/assets/_BixjwCO8.js.br +0 -0
- package/dist/public/assets/_BkQF1UOD.js +1 -0
- package/dist/public/assets/_BkQF1UOD.js.br +0 -0
- package/dist/public/assets/_BpGTzAYy.js +1 -0
- package/dist/public/assets/{_B99eluvQ.js → _Bpf0k8uS.js} +1 -1
- package/dist/public/assets/_Bpf0k8uS.js.br +0 -0
- package/dist/public/assets/{_OqWnNRp1.js → _BqizK7cx.js} +1 -1
- package/dist/public/assets/_BqizK7cx.js.br +0 -0
- package/dist/public/assets/{_BBCoOIOP.js → _BrWsQx9M.js} +1 -1
- package/dist/public/assets/_BrWsQx9M.js.br +0 -0
- package/dist/public/assets/_BrbA4biE.js +1 -0
- package/dist/public/assets/{_BHYTDkZR.js → _Bs2HUAxm.js} +1 -1
- package/dist/public/assets/_Bs2HUAxm.js.br +0 -0
- package/dist/public/assets/_BsWogZkr.js +1 -0
- package/dist/public/assets/_BthptJ6a.js +1 -0
- package/dist/public/assets/_BthptJ6a.js.br +0 -0
- package/dist/public/assets/_BuxlUghc.js +1 -0
- package/dist/public/assets/{_4tTyBCeC.js → _Bv-wpAaO.js} +1 -1
- package/dist/public/assets/_Bv-wpAaO.js.br +0 -0
- package/dist/public/assets/_BvK6PQ1z.js +1 -0
- package/dist/public/assets/{_DKSFLcWe.js → _BytWZ6R5.js} +1 -1
- package/dist/public/assets/_BytWZ6R5.js.br +0 -0
- package/dist/public/assets/_C-OUSTHo.js +1 -0
- package/dist/public/assets/{_DwnrXrJG.js → _C0Hfu_Ho.js} +1 -1
- package/dist/public/assets/_C0Hfu_Ho.js.br +0 -0
- package/dist/public/assets/_C0ztthm_.js +1 -0
- package/dist/public/assets/{_CyG4uyH4.js → _C2DkGqn5.js} +1 -1
- package/dist/public/assets/_C2DkGqn5.js.br +0 -0
- package/dist/public/assets/{_yJwnpW5d.js → _C33cmCxX.js} +1 -1
- package/dist/public/assets/_C33cmCxX.js.br +0 -0
- package/dist/public/assets/{_BeIfsbXf.js → _C3ShTfoQ.js} +1 -1
- package/dist/public/assets/_C3ShTfoQ.js.br +0 -0
- package/dist/public/assets/_C3tVbCBH.js +1 -0
- package/dist/public/assets/_C6M1hDWV.js +1 -0
- package/dist/public/assets/_C6P-6sWK.js +1 -0
- package/dist/public/assets/_C78RESm0.js +1 -0
- package/dist/public/assets/_C7z3JBX0.js +1 -0
- package/dist/public/assets/_C8-cikmx.js +1 -0
- package/dist/public/assets/_C9thRVyr.js +1 -0
- package/dist/public/assets/{_CV-Bw8FG.js → _CBBTd56s.js} +1 -1
- package/dist/public/assets/_CBBTd56s.js.br +0 -0
- package/dist/public/assets/_CEGHO2aQ.js +1 -0
- package/dist/public/assets/{_Gm2nKIsI.js → _CFF1bIG3.js} +1 -1
- package/dist/public/assets/_CFF1bIG3.js.br +0 -0
- package/dist/public/assets/{_CT50UdvA.js → _CGmOePAM.js} +1 -1
- package/dist/public/assets/_CGmOePAM.js.br +0 -0
- package/dist/public/assets/_CHOAR75o.js +1 -0
- package/dist/public/assets/_CIK0aYGO.js +1422 -0
- package/dist/public/assets/_CIK0aYGO.js.br +0 -0
- package/dist/public/assets/_CIM_QKij.js +1 -0
- package/dist/public/assets/_CJzM23DW.js +2 -0
- package/dist/public/assets/_CJzM23DW.js.br +0 -0
- package/dist/public/assets/_CK5CtA9f.js +1 -0
- package/dist/public/assets/_CLVYQ-74.js +1 -0
- package/dist/public/assets/_CLVYQ-74.js.br +0 -0
- package/dist/public/assets/{_C-CeSamd.js → _CLeF1FF3.js} +1 -1
- package/dist/public/assets/_CPm0qMfS.js +1 -0
- package/dist/public/assets/_CQWTMS1P.js +1 -0
- package/dist/public/assets/_CQWTMS1P.js.br +0 -0
- package/dist/public/assets/_CQgVf_hl.js +1 -0
- package/dist/public/assets/_CRzep8vQ.js +1 -0
- package/dist/public/assets/_CVY_H9pO.js +1 -0
- package/dist/public/assets/_CVlglWWP.js +1 -0
- package/dist/public/assets/_CYtOhTGb.js +1 -0
- package/dist/public/assets/_CZP-vnK2.js +1 -0
- package/dist/public/assets/_CZP-vnK2.js.br +0 -0
- package/dist/public/assets/_C_aWNVgg.js +1 -0
- package/dist/public/assets/_C_fU39wg.js +1 -0
- package/dist/public/assets/{_CGAwOmU8.js → _CaWlTbQM.js} +1 -1
- package/dist/public/assets/_Ca_UkEY3.js +1 -0
- package/dist/public/assets/_Ca_UkEY3.js.br +8 -0
- package/dist/public/assets/_CbKQ4tM7.js +1 -0
- package/dist/public/assets/_CbndvCa9.js +1 -0
- package/dist/public/assets/_CdgFbcw6.js +1 -0
- package/dist/public/assets/_Cf0kh0ya.js +1 -0
- package/dist/public/assets/_Cf0kh0ya.js.br +0 -0
- package/dist/public/assets/_CffIUDL_.js +1 -0
- package/dist/public/assets/_CffIUDL_.js.br +0 -0
- package/dist/public/assets/_CfrSfMqj.js +1 -0
- package/dist/public/assets/_CfrSfMqj.js.br +0 -0
- package/dist/public/assets/_CoHLhCNH.js +1 -0
- package/dist/public/assets/{_CjCClW7n.js → _CpK94htG.js} +1 -1
- package/dist/public/assets/_CqrXDSP9.js +1 -0
- package/dist/public/assets/_Csdgg-p8.js +1 -0
- package/dist/public/assets/_Csdgg-p8.js.br +0 -0
- package/dist/public/assets/{_Cm7MwWeR.js → _Csvc0jmZ.js} +1 -1
- package/dist/public/assets/_Csvc0jmZ.js.br +0 -0
- package/dist/public/assets/_CtdLytfI.js +1 -0
- package/dist/public/assets/{_c8sEONGc.js → _CtxNwohv.js} +1 -1
- package/dist/public/assets/_CtxNwohv.js.br +0 -0
- package/dist/public/assets/_CuApWap_.js +86 -0
- package/dist/public/assets/_CuApWap_.js.br +0 -0
- package/dist/public/assets/_CvBjVI0v.js +1 -0
- package/dist/public/assets/_CwZRDJQ2.js +1 -0
- package/dist/public/assets/_CwZRDJQ2.js.br +0 -0
- package/dist/public/assets/_CxyFAuJT.js +1 -0
- package/dist/public/assets/_CxyFAuJT.js.br +0 -0
- package/dist/public/assets/_D00q6XFi.js +1 -0
- package/dist/public/assets/_D00q6XFi.js.br +0 -0
- package/dist/public/assets/{_BM0HAmYi.js → _D0rv_4FK.js} +1 -1
- package/dist/public/assets/_D0rv_4FK.js.br +0 -0
- package/dist/public/assets/{_DrwRDfxo.js → _D478nKDM.js} +1 -1
- package/dist/public/assets/_D478nKDM.js.br +0 -0
- package/dist/public/assets/{_UDwcCybR.js → _D5W5ntHo.js} +1 -1
- package/dist/public/assets/_D5W5ntHo.js.br +0 -0
- package/dist/public/assets/_D5guyfCP.js +1 -0
- package/dist/public/assets/{_C3xkTmgg.js → _D7FiuTy-.js} +1 -1
- package/dist/public/assets/_D7FiuTy-.js.br +0 -0
- package/dist/public/assets/_DA1hU7GY.js +1 -0
- package/dist/public/assets/_DAGUL1Vl.js +6 -0
- package/dist/public/assets/_DAGUL1Vl.js.br +0 -0
- package/dist/public/assets/{_bXJ6rDQv.js → _DCaVKBqt.js} +1 -1
- package/dist/public/assets/_DCaVKBqt.js.br +0 -0
- package/dist/public/assets/_DFRZGT2q.js +1 -0
- package/dist/public/assets/_DFRZGT2q.js.br +0 -0
- package/dist/public/assets/_DGDoR_gX.js +1 -0
- package/dist/public/assets/_DGDoR_gX.js.br +0 -0
- package/dist/public/assets/_DJl1sf70.js +1 -0
- package/dist/public/assets/_DMGdwfSr.js +1 -0
- package/dist/public/assets/_DMGdwfSr.js.br +0 -0
- package/dist/public/assets/{_B7jfD4o_.js → _DMdBg_GK.js} +1 -1
- package/dist/public/assets/_DMdBg_GK.js.br +0 -0
- package/dist/public/assets/{_axB73DIG.js → _DPOlYZjX.js} +1 -1
- package/dist/public/assets/_DPOlYZjX.js.br +0 -0
- package/dist/public/assets/{_DEI3Wsc1.js → _DSCUag9O.js} +1 -1
- package/dist/public/assets/_DSCUag9O.js.br +0 -0
- package/dist/public/assets/_DUzx5eZR.js +1 -0
- package/dist/public/assets/_DUzx5eZR.js.br +0 -0
- package/dist/public/assets/{_BB8hnAFC.js → _DV0W2yTo.js} +1 -1
- package/dist/public/assets/_DV0W2yTo.js.br +0 -0
- package/dist/public/assets/_DW6rnS22.js +1 -0
- package/dist/public/assets/_DW6rnS22.js.br +0 -0
- package/dist/public/assets/_DY6s_kAl.js +1 -0
- package/dist/public/assets/_Da0Zcyhl.js +1 -0
- package/dist/public/assets/_Dbyzv-e6.js +1 -0
- package/dist/public/assets/_Dbyzv-e6.js.br +0 -0
- package/dist/public/assets/{_BKraHRf9.js → _DcFRlTYB.js} +1 -1
- package/dist/public/assets/_DcFRlTYB.js.br +0 -0
- package/dist/public/assets/_DiThv-ws.js +1 -0
- package/dist/public/assets/_Djho-FAH.js +1 -0
- package/dist/public/assets/_Djho-FAH.js.br +0 -0
- package/dist/public/assets/_DkfyvJLz.js +1 -0
- package/dist/public/assets/_DmdewGjf.js +1 -0
- package/dist/public/assets/{_CoSm8rGI.js → _DnhVTHg1.js} +1 -1
- package/dist/public/assets/_DnhVTHg1.js.br +0 -0
- package/dist/public/assets/_Dq4Lv0Cs.js +1 -0
- package/dist/public/assets/_Dq4Lv0Cs.js.br +0 -0
- package/dist/public/assets/_DqxOu378.js +1 -0
- package/dist/public/assets/{_B__t-xqQ.js → _DrpXP57c.js} +1 -1
- package/dist/public/assets/_DrpXP57c.js.br +0 -0
- package/dist/public/assets/{_C3czKCoC.js → _DsAV3t8S.js} +1 -1
- package/dist/public/assets/_DsAV3t8S.js.br +0 -0
- package/dist/public/assets/{_CnOgm_8-.js → _DvNEiAgs.js} +1 -1
- package/dist/public/assets/_DvNEiAgs.js.br +0 -0
- package/dist/public/assets/{_I5E4cOIs.js → _Dvu8aO9d.js} +1 -1
- package/dist/public/assets/_Dvu8aO9d.js.br +0 -0
- package/dist/public/assets/_DyUJCQsE.js +1 -0
- package/dist/public/assets/_DyUJCQsE.js.br +0 -0
- package/dist/public/assets/_DzJPXetd.js +1 -0
- package/dist/public/assets/_DzJPXetd.js.br +0 -0
- package/dist/public/assets/{_B7ZIrFzP.js → _DzOgre70.js} +1 -1
- package/dist/public/assets/_DzOgre70.js.br +0 -0
- package/dist/public/assets/_FXPfeF9Q.js +1 -0
- package/dist/public/assets/{_8OyrAmVC.js → _G6zi9_6i.js} +1 -1
- package/dist/public/assets/_G6zi9_6i.js.br +0 -0
- package/dist/public/assets/_I2leMoLk.js +1 -0
- package/dist/public/assets/_IWsH3JbM.js +1 -0
- package/dist/public/assets/{_DN0LSN_7.js → _Jsehj7rl.js} +1 -1
- package/dist/public/assets/_Jsehj7rl.js.br +0 -0
- package/dist/public/assets/_NGMwjBBG.js +1 -0
- package/dist/public/assets/{_yX6f-Tdd.js → _QljbgS5l.js} +1 -1
- package/dist/public/assets/_QljbgS5l.js.br +0 -0
- package/dist/public/assets/{_BmJ4HL0P.js → _Z8l8zhFZ.js} +1 -1
- package/dist/public/assets/_Z8l8zhFZ.js.br +0 -0
- package/dist/public/assets/__GnUfSxE.js +1 -0
- package/dist/public/assets/__GnUfSxE.js.br +0 -0
- package/dist/public/assets/_cD7JRpZk.js +1 -0
- package/dist/public/assets/_dP2ZLG1O.js +1 -0
- package/dist/public/assets/_dP2ZLG1O.js.br +0 -0
- package/dist/public/assets/_fQTAXQ2A.js +1 -0
- package/dist/public/assets/_fQTAXQ2A.js.br +0 -0
- package/dist/public/assets/_gIJHrFck.js +1 -0
- package/dist/public/assets/_gIJHrFck.js.br +0 -0
- package/dist/public/assets/{_C46wgmL5.js → _iqlUPvpu.js} +1 -1
- package/dist/public/assets/_iqlUPvpu.js.br +0 -0
- package/dist/public/assets/_m2OvafhN.js +1 -0
- package/dist/public/assets/_mNtBBYrx.js +1 -0
- package/dist/public/assets/_o4vB6uaf.js +1 -0
- package/dist/public/assets/{_wg_bmG9z.js → _pTRVL6_Z.js} +1 -1
- package/dist/public/assets/_pTRVL6_Z.js.br +0 -0
- package/dist/public/assets/_sayhcKVq.js +1 -0
- package/dist/public/assets/_sdf2KG0s.js +1 -0
- package/dist/public/assets/_sdf2KG0s.js.br +0 -0
- package/dist/public/assets/_tsg5j2Lv.js +1 -0
- package/dist/public/assets/_uTzPJzX0.js +1 -0
- package/dist/public/assets/_vIGuFBIb.js +1 -0
- package/dist/public/assets/_vIGuFBIb.js.br +0 -0
- package/dist/public/assets/_yJE0vu9j.js +1 -0
- package/dist/public/assets/_yJE0vu9j.js.br +0 -0
- package/dist/public/assets/_z9XIIgTI.js +1 -0
- package/dist/public/assets/{app-page-DSi27TMH.css → app-shell-8Pd1rc7u.css} +1 -1
- package/dist/public/assets/app-shell-8Pd1rc7u.css.br +0 -0
- package/dist/public/assets/command-palette-B4o6jF8Z.css +1 -0
- package/dist/public/assets/command-palette-B4o6jF8Z.css.br +0 -0
- package/dist/public/assets/files-view-BnN1VOCi.css +1 -0
- package/dist/public/assets/files-view-BnN1VOCi.css.br +0 -0
- package/dist/public/assets/files-view-cAPnyoQZ.js +2 -0
- package/dist/public/assets/group.css.ts-CXNej9ok.css +1 -0
- package/dist/public/assets/group.css.ts-CXNej9ok.css.br +0 -0
- package/dist/public/assets/{icon-search-Cslr912D.css → icon-search-DcAn99Uv.css} +1 -1
- package/dist/public/assets/icon-search-DcAn99Uv.css.br +0 -0
- package/dist/public/assets/manage-workspace-BMzLgYX3.css +1 -0
- package/dist/public/assets/manage-workspace-DhLNff0-.js +2 -0
- package/dist/public/assets/{modal-view-UBeCgIX7.css → modal-view-B53laKnF.css} +1 -1
- package/dist/public/assets/modal-view-B53laKnF.css.br +0 -0
- package/dist/public/assets/new-BqXHbQlu.js +1 -0
- package/dist/public/assets/new-workspace-B3ylje_g.css +1 -0
- package/dist/public/assets/new-workspace-B3ylje_g.css.br +0 -0
- package/dist/public/assets/new-workspace-RR8h-qIh.js +2 -0
- package/dist/public/assets/port-chip-Bt0w2MzG.css +1 -0
- package/dist/public/assets/port-chip-Bt0w2MzG.css.br +0 -0
- package/dist/public/assets/prompt-dialog-B_qzbXMZ.css +1 -0
- package/dist/public/assets/prompt-dialog-B_qzbXMZ.css.br +0 -0
- package/dist/public/assets/quick-open-CXyrWkbA.css +1 -0
- package/dist/public/assets/quick-open-CXyrWkbA.css.br +0 -0
- package/dist/public/assets/repo-picker-CpKpWL1n.css +1 -0
- package/dist/public/assets/repo-picker-CpKpWL1n.css.br +0 -0
- package/dist/public/assets/review-view-CTtdvipj.js +2 -0
- package/dist/public/assets/review-view-tq2OyY98.css +1 -0
- package/dist/public/assets/review-view-tq2OyY98.css.br +0 -0
- package/dist/public/assets/section-D7RUq5Cz.css +1 -0
- package/dist/public/assets/section-D7RUq5Cz.css.br +0 -0
- package/dist/public/assets/settings-BqXHbQlu.js +1 -0
- package/dist/public/assets/settings-page-Btvx32iZ.js +2 -0
- package/dist/public/assets/settings-page-Cnmgnr_0.css +1 -0
- package/dist/public/assets/settings-page-Cnmgnr_0.css.br +0 -0
- package/dist/public/assets/skill-row-CyviHufk.css +1 -0
- package/dist/public/assets/sso-auth-BRNOE7tU.css +1 -0
- package/dist/public/assets/sso-auth-BRNOE7tU.css.br +0 -0
- package/dist/public/assets/w-BqXHbQlu.js +1 -0
- package/dist/public/assets/w._-BqXHbQlu.js +1 -0
- package/dist/public/assets/w._-Nf-ixmkH.js +1 -0
- package/dist/public/assets/w._-cjUl7ond.js +1 -0
- package/dist/public/assets/worker-hkE5tvP8.js +164 -0
- package/dist/public/assets/worker-hkE5tvP8.js.br +0 -0
- package/lib/review/markdown.mjs +23 -11
- package/lib/setup/doctor.d.mts +5 -0
- package/lib/setup/doctor.mjs +31 -1
- package/lib/setup/install.mjs +68 -9
- package/lib/setup/listen.d.mts +5 -0
- package/lib/setup/listen.mjs +23 -0
- package/lib/share/manifest.mjs +8 -3
- package/package.json +7 -7
- package/scripts/migrate.mjs +169 -89
- package/dist/_7W8iLTql.js +0 -2
- package/dist/public/assets/_-Rhp4Iam.js +0 -1
- package/dist/public/assets/_-Rhp4Iam.js.br +0 -0
- package/dist/public/assets/_2PWnr0Ep.js +0 -1
- package/dist/public/assets/_2PWnr0Ep.js.br +0 -0
- package/dist/public/assets/_4tTyBCeC.js.br +0 -0
- package/dist/public/assets/_4x24Xtz8.js +0 -1
- package/dist/public/assets/_52XwXqiy.js.br +0 -0
- package/dist/public/assets/_5z9K39Kg.js +0 -1
- package/dist/public/assets/_6RP3yOfX.js +0 -1
- package/dist/public/assets/_6c5sWg_q.js +0 -1
- package/dist/public/assets/_6c5sWg_q.js.br +0 -0
- package/dist/public/assets/_772AjyQx.js +0 -1
- package/dist/public/assets/_772AjyQx.js.br +0 -0
- package/dist/public/assets/_7udydMs9.js +0 -1
- package/dist/public/assets/_7udydMs9.js.br +0 -0
- package/dist/public/assets/_8CN3GhrA.js +0 -1
- package/dist/public/assets/_8OyrAmVC.js.br +0 -0
- package/dist/public/assets/_9rfvDt0D.js +0 -1
- package/dist/public/assets/_B-oyYxP4.js +0 -1
- package/dist/public/assets/_B23autIT.js +0 -1
- package/dist/public/assets/_B4fdS_GK.js +0 -1
- package/dist/public/assets/_B4fdS_GK.js.br +0 -0
- package/dist/public/assets/_B4mrAOJe.js.br +0 -0
- package/dist/public/assets/_B5648bFu.js +0 -1
- package/dist/public/assets/_B56KWh6H.js +0 -1
- package/dist/public/assets/_B7ZIrFzP.js.br +0 -0
- package/dist/public/assets/_B7h2Q1yF.js +0 -1
- package/dist/public/assets/_B7h2Q1yF.js.br +0 -0
- package/dist/public/assets/_B7jfD4o_.js.br +0 -0
- package/dist/public/assets/_B8-9UU0b.js +0 -1
- package/dist/public/assets/_B8-9UU0b.js.br +0 -0
- package/dist/public/assets/_B99eluvQ.js.br +0 -0
- package/dist/public/assets/_BB8hnAFC.js.br +0 -0
- package/dist/public/assets/_BBCoOIOP.js.br +0 -0
- package/dist/public/assets/_BDX0L_3F.js.br +0 -0
- package/dist/public/assets/_BE7ERBV5.js +0 -1
- package/dist/public/assets/_BHYTDkZR.js.br +0 -0
- package/dist/public/assets/_BIknkuK7.js +0 -1
- package/dist/public/assets/_BIknkuK7.js.br +0 -0
- package/dist/public/assets/_BKXpTbJa.js +0 -1
- package/dist/public/assets/_BKraHRf9.js.br +0 -0
- package/dist/public/assets/_BM0HAmYi.js.br +0 -0
- package/dist/public/assets/_BPJgPGy_.js.br +0 -0
- package/dist/public/assets/_BPTeCwVk.js +0 -1
- package/dist/public/assets/_BPTeCwVk.js.br +0 -0
- package/dist/public/assets/_BQ6oRmZj.js.br +0 -0
- package/dist/public/assets/_BSGfztFB.js +0 -1
- package/dist/public/assets/_BSGfztFB.js.br +0 -0
- package/dist/public/assets/_BT1Fg9f7.js +0 -1
- package/dist/public/assets/_BT1Fg9f7.js.br +0 -0
- package/dist/public/assets/_BUc28oLW.js +0 -1
- package/dist/public/assets/_BVT8cLW8.js.br +0 -0
- package/dist/public/assets/_B__t-xqQ.js.br +0 -0
- package/dist/public/assets/_BaxiLRDq.js +0 -1
- package/dist/public/assets/_BaxiLRDq.js.br +0 -0
- package/dist/public/assets/_BdH6o3ne.js +0 -1
- package/dist/public/assets/_Be2QJJqi.js +0 -1
- package/dist/public/assets/_BeIfsbXf.js.br +0 -0
- package/dist/public/assets/_BkmCB1B7.js +0 -1
- package/dist/public/assets/_BlaUPzz6.js +0 -1
- package/dist/public/assets/_BmJ4HL0P.js.br +0 -0
- package/dist/public/assets/_BtmrZoMX.js +0 -1
- package/dist/public/assets/_BtmrZoMX.js.br +0 -0
- package/dist/public/assets/_Bu1O62mi.js +0 -1
- package/dist/public/assets/_BwsYYj35.js +0 -1
- package/dist/public/assets/_By9P7LBz.js +0 -1
- package/dist/public/assets/_Byov8m78.js +0 -1
- package/dist/public/assets/_C-Xu6InH.js +0 -1
- package/dist/public/assets/_C-pvpSFn.js +0 -1
- package/dist/public/assets/_C-pvpSFn.js.br +0 -0
- package/dist/public/assets/_C0GWE8Ws.js +0 -1
- package/dist/public/assets/_C0MnX7gF.js +0 -1
- package/dist/public/assets/_C0Ysgu0N.js +0 -1
- package/dist/public/assets/_C0udqXoV.js +0 -1
- package/dist/public/assets/_C3czKCoC.js.br +0 -0
- package/dist/public/assets/_C3qzGqgT.js +0 -1
- package/dist/public/assets/_C3xkTmgg.js.br +0 -0
- package/dist/public/assets/_C46wgmL5.js.br +0 -0
- package/dist/public/assets/_C4zXPi6Z.js +0 -1
- package/dist/public/assets/_C6fbnMgU.js +0 -1
- package/dist/public/assets/_C7NJXs7I.js +0 -1
- package/dist/public/assets/_C7NJXs7I.js.br +0 -0
- package/dist/public/assets/_C7jdZwl-.js +0 -1
- package/dist/public/assets/_CAx9vRB3.js +0 -1
- package/dist/public/assets/_CAx9vRB3.js.br +0 -0
- package/dist/public/assets/_CBqtZgPq.js +0 -1
- package/dist/public/assets/_CBqtZgPq.js.br +0 -0
- package/dist/public/assets/_CDL5bva3.js +0 -1
- package/dist/public/assets/_CDL5bva3.js.br +0 -0
- package/dist/public/assets/_CH7NDXYO.js +0 -1
- package/dist/public/assets/_CKoo1DBI.js +0 -1
- package/dist/public/assets/_CM90yd32.js.br +0 -0
- package/dist/public/assets/_CN8qwXEP.js +0 -1
- package/dist/public/assets/_CN8qwXEP.js.br +0 -0
- package/dist/public/assets/_CNBCSwDm.js +0 -1
- package/dist/public/assets/_CNBCSwDm.js.br +0 -0
- package/dist/public/assets/_COjK9IVw.js +0 -1
- package/dist/public/assets/_COjK9IVw.js.br +0 -0
- package/dist/public/assets/_COvQSj_N.js +0 -1
- package/dist/public/assets/_CSmTRKYC.js +0 -1
- package/dist/public/assets/_CSmTRKYC.js.br +0 -0
- package/dist/public/assets/_CT4opMDH.js +0 -86
- package/dist/public/assets/_CT4opMDH.js.br +0 -0
- package/dist/public/assets/_CT50UdvA.js.br +0 -0
- package/dist/public/assets/_CV-Bw8FG.js.br +0 -0
- package/dist/public/assets/_CXecCgJ4.js.br +0 -0
- package/dist/public/assets/_C__ngYHl.js +0 -1
- package/dist/public/assets/_CdYzXVw9.js +0 -1
- package/dist/public/assets/_CdYzXVw9.js.br +0 -0
- package/dist/public/assets/_Cf7ziBW6.js +0 -1
- package/dist/public/assets/_CfZpxvbA.js +0 -1
- package/dist/public/assets/_Cm7MwWeR.js.br +0 -0
- package/dist/public/assets/_CnOgm_8-.js.br +0 -0
- package/dist/public/assets/_CoSm8rGI.js.br +0 -0
- package/dist/public/assets/_CodAPaLl.js +0 -1
- package/dist/public/assets/_CodAPaLl.js.br +0 -0
- package/dist/public/assets/_Cp7bn2n4.js +0 -1
- package/dist/public/assets/_Cr3IENiS.js +0 -1
- package/dist/public/assets/_Cr8eFog_.js +0 -9
- package/dist/public/assets/_Cr8eFog_.js.br +0 -0
- package/dist/public/assets/_CsiY7_Sq.js +0 -1
- package/dist/public/assets/_CvUTwBtz.js +0 -1
- package/dist/public/assets/_CyG4uyH4.js.br +0 -0
- package/dist/public/assets/_Czf8lSy3.js +0 -1
- package/dist/public/assets/_D0h6bM9K.js +0 -1
- package/dist/public/assets/_D1Q-u_7m.js +0 -1
- package/dist/public/assets/_D1Q-u_7m.js.br +0 -0
- package/dist/public/assets/_DCGza5jQ.js.br +0 -0
- package/dist/public/assets/_DCjHVJN2.js.br +0 -0
- package/dist/public/assets/_DDs3rbi4.js +0 -1
- package/dist/public/assets/_DEI3Wsc1.js.br +0 -0
- package/dist/public/assets/_DFUvzjSY.js +0 -1
- package/dist/public/assets/_DJ4ScClm.js +0 -1
- package/dist/public/assets/_DJ4ScClm.js.br +0 -0
- package/dist/public/assets/_DKSFLcWe.js.br +0 -0
- package/dist/public/assets/_DN0LSN_7.js.br +0 -0
- package/dist/public/assets/_DNQWXflz.js.br +0 -0
- package/dist/public/assets/_DOr-IIYd.js +0 -1
- package/dist/public/assets/_DUECTykQ.js +0 -2640
- package/dist/public/assets/_DUECTykQ.js.br +0 -0
- package/dist/public/assets/_DU_CXTYH.js +0 -1
- package/dist/public/assets/_DXLfnZgl.js +0 -1
- package/dist/public/assets/_DZ7lKWLx.js +0 -1
- package/dist/public/assets/_DZRRUShG.js.br +0 -0
- package/dist/public/assets/_Db8OySTl.js +0 -1
- package/dist/public/assets/_DbBa1NO6.js +0 -1
- package/dist/public/assets/_DeRrQBgm.js +0 -2
- package/dist/public/assets/_DeRrQBgm.js.br +0 -0
- package/dist/public/assets/_DfrEESyG.js +0 -1
- package/dist/public/assets/_DigmuRvk.js +0 -1
- package/dist/public/assets/_DjWKgUPY.js +0 -1
- package/dist/public/assets/_DjWKgUPY.js.br +0 -0
- package/dist/public/assets/_Doy075sx.js +0 -1
- package/dist/public/assets/_DpL-iy2Q.js +0 -1
- package/dist/public/assets/_DpL-iy2Q.js.br +0 -0
- package/dist/public/assets/_Dpy7Nv8Y.js +0 -1
- package/dist/public/assets/_Dpy7Nv8Y.js.br +0 -0
- package/dist/public/assets/_DqoN6Zbr.js +0 -1
- package/dist/public/assets/_DqoN6Zbr.js.br +0 -0
- package/dist/public/assets/_DrwRDfxo.js.br +0 -0
- package/dist/public/assets/_DtfClEB2.js +0 -1
- package/dist/public/assets/_DtkyFd1k.js +0 -1
- package/dist/public/assets/_DtkyFd1k.js.br +0 -0
- package/dist/public/assets/_DuraWzq8.js +0 -1
- package/dist/public/assets/_DuraWzq8.js.br +0 -0
- package/dist/public/assets/_DwOZjG25.js +0 -1
- package/dist/public/assets/_DwnrXrJG.js.br +0 -0
- package/dist/public/assets/_Gm2nKIsI.js.br +0 -0
- package/dist/public/assets/_HwNNMC_M.js +0 -1
- package/dist/public/assets/_I5E4cOIs.js.br +0 -0
- package/dist/public/assets/_OqWnNRp1.js.br +0 -0
- package/dist/public/assets/_QJRLXJCl.js +0 -1
- package/dist/public/assets/_QJRLXJCl.js.br +0 -0
- package/dist/public/assets/_TnKds2XR.js +0 -1
- package/dist/public/assets/_UDwcCybR.js.br +0 -0
- package/dist/public/assets/_Y9eVHbos.js +0 -1
- package/dist/public/assets/_awhwVzn2.js +0 -1
- package/dist/public/assets/_axB73DIG.js.br +0 -0
- package/dist/public/assets/_bX1A3m6x.js.br +0 -0
- package/dist/public/assets/_bXJ6rDQv.js.br +0 -0
- package/dist/public/assets/_c8sEONGc.js.br +0 -0
- package/dist/public/assets/_ddGgTxBq.js +0 -1
- package/dist/public/assets/_e7A8Lk3N.js +0 -1
- package/dist/public/assets/_hI9Uq04u.js +0 -1
- package/dist/public/assets/_jsYtAs8X.js +0 -1
- package/dist/public/assets/_jsYtAs8X.js.br +0 -0
- package/dist/public/assets/_ktJP056X.js +0 -1
- package/dist/public/assets/_rCrnzYGa.js.br +0 -0
- package/dist/public/assets/_seluNJrC.js +0 -1
- package/dist/public/assets/_tjp1F1WS.js +0 -1
- package/dist/public/assets/_vefbuJnt.js +0 -6
- package/dist/public/assets/_vefbuJnt.js.br +0 -0
- package/dist/public/assets/_vh9LFjDx.js +0 -1
- package/dist/public/assets/_wg_bmG9z.js.br +0 -0
- package/dist/public/assets/_xnx0Qqu_.js +0 -1
- package/dist/public/assets/_yJwnpW5d.js.br +0 -0
- package/dist/public/assets/_yX6f-Tdd.js.br +0 -0
- package/dist/public/assets/_zOxmqmej.js +0 -1
- package/dist/public/assets/_zOxmqmej.js.br +0 -0
- package/dist/public/assets/app-page-DSi27TMH.css.br +0 -0
- package/dist/public/assets/command-palette-D1FTfzRL.css +0 -1
- package/dist/public/assets/command-palette-D1FTfzRL.css.br +0 -0
- package/dist/public/assets/files-view-CUjcVonq.css +0 -1
- package/dist/public/assets/files-view-CUjcVonq.css.br +0 -0
- package/dist/public/assets/files-view-CiV1wzMY.js +0 -2
- package/dist/public/assets/group.css.ts-bSDNRl7w.css +0 -1
- package/dist/public/assets/group.css.ts-bSDNRl7w.css.br +0 -0
- package/dist/public/assets/icon-search-Cslr912D.css.br +0 -0
- package/dist/public/assets/key-bar.css.ts-Brsaaphs.css +0 -1
- package/dist/public/assets/key-bar.css.ts-Brsaaphs.css.br +0 -0
- package/dist/public/assets/manage-workspace-CBoNUXar.css +0 -1
- package/dist/public/assets/manage-workspace-Cbpb6QYD.js +0 -2
- package/dist/public/assets/modal-view-UBeCgIX7.css.br +0 -0
- package/dist/public/assets/new-I9rKXr4F.js +0 -1
- package/dist/public/assets/new-workspace-B3e9AXWd.js +0 -2
- package/dist/public/assets/new-workspace-DfEJoWx5.css +0 -1
- package/dist/public/assets/new-workspace-DfEJoWx5.css.br +0 -0
- package/dist/public/assets/port-chip-B1iVO49X.css +0 -1
- package/dist/public/assets/port-chip-B1iVO49X.css.br +0 -0
- package/dist/public/assets/prompt-dialog-TvY9iRCd.css +0 -1
- package/dist/public/assets/prompt-dialog-TvY9iRCd.css.br +0 -0
- package/dist/public/assets/quick-open-CCdyjExx.css +0 -1
- package/dist/public/assets/quick-open-CCdyjExx.css.br +0 -0
- package/dist/public/assets/repo-picker-DUC4liD4.css +0 -1
- package/dist/public/assets/repo-picker-DUC4liD4.css.br +0 -3
- package/dist/public/assets/review-view-Cbql7hRd.js +0 -2
- package/dist/public/assets/review-view-DBvRJQKT.css +0 -1
- package/dist/public/assets/review-view-DBvRJQKT.css.br +0 -0
- package/dist/public/assets/section-DF0g3UYh.css +0 -1
- package/dist/public/assets/section-DF0g3UYh.css.br +0 -0
- package/dist/public/assets/settings-I9rKXr4F.js +0 -1
- package/dist/public/assets/settings-page-DSTN6gbj.css +0 -1
- package/dist/public/assets/settings-page-DSTN6gbj.css.br +0 -0
- package/dist/public/assets/settings-page-ZPnKcjEK.js +0 -2
- package/dist/public/assets/skill-row-bJ0ycL8_.css +0 -1
- package/dist/public/assets/sso-auth-BzQg9Hau.css +0 -1
- package/dist/public/assets/sso-auth-BzQg9Hau.css.br +0 -0
- package/dist/public/assets/w-I9rKXr4F.js +0 -1
- package/dist/public/assets/w._-BZWvupro.js +0 -1
- package/dist/public/assets/w._-D4DOoZXE.js +0 -1
- package/dist/public/assets/w._-I9rKXr4F.js +0 -1
- package/dist/public/assets/worker-BK3lyuKh.js +0 -164
- package/dist/public/assets/worker-BK3lyuKh.js.br +0 -0
package/bin/work.mjs
CHANGED
|
@@ -28,6 +28,7 @@ import { fileURLToPath } from "node:url";
|
|
|
28
28
|
import { createRequire } from "node:module";
|
|
29
29
|
import { doctor, formatDoctor, setupPath } from "../lib/setup/doctor.mjs";
|
|
30
30
|
import { installTool } from "../lib/setup/install.mjs";
|
|
31
|
+
import { dialHost, listenStream } from "../lib/setup/listen.mjs";
|
|
31
32
|
import { commentMarkdown } from "../lib/review/markdown.mjs";
|
|
32
33
|
import { formatInvite, parseInvite } from "../lib/share/manifest.mjs";
|
|
33
34
|
import { duration, pctText } from "../lib/usage/format.mjs";
|
|
@@ -82,7 +83,7 @@ switch (command) {
|
|
|
82
83
|
// definition; WORK_SERVICE_EXEC points it at a checkout's run-prod.sh.
|
|
83
84
|
if (!installService()) {
|
|
84
85
|
process.exitCode = 1;
|
|
85
|
-
} else if (await waitForServer(
|
|
86
|
+
} else if (await waitForServer()) {
|
|
86
87
|
log(`done — http://localhost:${serviceEnv().PORT}`);
|
|
87
88
|
} else {
|
|
88
89
|
warn(
|
|
@@ -91,6 +92,12 @@ switch (command) {
|
|
|
91
92
|
process.exitCode = 1;
|
|
92
93
|
}
|
|
93
94
|
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;
|
|
94
101
|
case "doctor":
|
|
95
102
|
await doctorCmd();
|
|
96
103
|
break;
|
|
@@ -135,7 +142,7 @@ switch (command) {
|
|
|
135
142
|
break;
|
|
136
143
|
default:
|
|
137
144
|
console.log(
|
|
138
|
-
`work ${pkg.version}\n\nusage: work <setup|install-service|doctor|start|update|usage|workspaces|workspace|repos|procs|review|export|restore|share|join|version> [--json]`,
|
|
145
|
+
`work ${pkg.version}\n\nusage: work <setup|install-service|migrate|doctor|start|update|usage|workspaces|workspace|repos|procs|review|export|restore|share|join|version> [--json]`,
|
|
139
146
|
);
|
|
140
147
|
}
|
|
141
148
|
|
|
@@ -190,10 +197,17 @@ async function usage() {
|
|
|
190
197
|
|
|
191
198
|
// -- workspace read commands (HTTP to the running server) --------------------
|
|
192
199
|
|
|
200
|
+
/** The running server as this machine reaches it: the service's port, at
|
|
201
|
+
* the address it listens on. */
|
|
202
|
+
function serverUrl() {
|
|
203
|
+
const env = serviceEnv();
|
|
204
|
+
return `http://${dialHost(env.WORK_LISTEN)}:${env.PORT}`;
|
|
205
|
+
}
|
|
206
|
+
|
|
193
207
|
async function apiGet(path) {
|
|
194
208
|
const port = serviceEnv().PORT;
|
|
195
209
|
try {
|
|
196
|
-
const res = await fetch(
|
|
210
|
+
const res = await fetch(`${serverUrl()}${path}`, {
|
|
197
211
|
signal: AbortSignal.timeout(30_000),
|
|
198
212
|
});
|
|
199
213
|
if (!res.ok) die(`server answered ${res.status} for ${path}`);
|
|
@@ -362,14 +376,32 @@ async function reviewCmd() {
|
|
|
362
376
|
const { comments = [] } = await apiGet(`/api/workspaces/${ws.id}/review`);
|
|
363
377
|
if (jsonOut) return console.log(JSON.stringify(comments, null, 2));
|
|
364
378
|
if (!comments.length) return console.log("no pending review comments");
|
|
365
|
-
console.log(commentMarkdown(comments,
|
|
379
|
+
console.log(commentMarkdown(comments, await reviewSections(ws.id, comments)));
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
/** The diff's sections, which say which lane or PR a comment's lines are
|
|
383
|
+
* on (by the head it stored) and what a removed line was removed from.
|
|
384
|
+
* Null when no comment stored a head or the diff cannot be had: those
|
|
385
|
+
* comments then read as the checkout's rather than failing the command. */
|
|
386
|
+
async function reviewSections(wsId, comments) {
|
|
387
|
+
if (!comments.some((c) => c.head)) return null;
|
|
388
|
+
const port = serviceEnv().PORT;
|
|
389
|
+
try {
|
|
390
|
+
const res = await fetch(
|
|
391
|
+
`http://127.0.0.1:${port}/api/workspaces/${wsId}/diff`,
|
|
392
|
+
{ signal: AbortSignal.timeout(60_000) },
|
|
393
|
+
);
|
|
394
|
+
return res.ok ? ((await res.json()).sections ?? null) : null;
|
|
395
|
+
} catch {
|
|
396
|
+
return null;
|
|
397
|
+
}
|
|
366
398
|
}
|
|
367
399
|
|
|
368
400
|
async function apiPost(path, body) {
|
|
369
401
|
const port = serviceEnv().PORT;
|
|
370
402
|
let res;
|
|
371
403
|
try {
|
|
372
|
-
res = await fetch(
|
|
404
|
+
res = await fetch(`${serverUrl()}${path}`, {
|
|
373
405
|
method: "POST",
|
|
374
406
|
headers: { "content-type": "application/json" },
|
|
375
407
|
body: body === undefined ? undefined : JSON.stringify(body),
|
|
@@ -428,8 +460,7 @@ async function exportCmd() {
|
|
|
428
460
|
);
|
|
429
461
|
}
|
|
430
462
|
}
|
|
431
|
-
const
|
|
432
|
-
const res = await fetch(`http://127.0.0.1:${port}/api/backup/export`);
|
|
463
|
+
const res = await fetch(`${serverUrl()}/api/backup/export`);
|
|
433
464
|
if (!res.ok) die(`server answered ${res.status} for /api/backup/export`);
|
|
434
465
|
const name =
|
|
435
466
|
positional[0] ||
|
|
@@ -558,22 +589,13 @@ function until(iso) {
|
|
|
558
589
|
async function setup() {
|
|
559
590
|
await fix(await doctor());
|
|
560
591
|
|
|
561
|
-
|
|
562
|
-
// service actually uses: migrate.mjs exits quietly when it finds no db, so
|
|
563
|
-
// an ambient environment missing WORK_DATA_DIR skips every sweep.
|
|
564
|
-
const migrate = path.join(pkgRoot, "scripts", "migrate.mjs");
|
|
565
|
-
if (fs.existsSync(migrate)) {
|
|
566
|
-
spawnSync(process.execPath, [migrate], {
|
|
567
|
-
stdio: "inherit",
|
|
568
|
-
env: { ...process.env, ...serviceEnv() },
|
|
569
|
-
});
|
|
570
|
-
}
|
|
592
|
+
migrate();
|
|
571
593
|
|
|
572
594
|
const running = installService();
|
|
573
595
|
const port = serviceEnv().PORT;
|
|
574
596
|
maybeTunnel(port);
|
|
575
597
|
if (running) {
|
|
576
|
-
if (await waitForServer(
|
|
598
|
+
if (await waitForServer()) log(`done — http://localhost:${port}`);
|
|
577
599
|
else
|
|
578
600
|
warn(
|
|
579
601
|
`service started but nothing answered on port ${port} within 30s — check the logs`,
|
|
@@ -595,6 +617,22 @@ async function setup() {
|
|
|
595
617
|
}
|
|
596
618
|
}
|
|
597
619
|
|
|
620
|
+
/** One-shot cleanups between versions (scripts/migrate.mjs), run against
|
|
621
|
+
* the settings the service actually uses: migrate.mjs exits quietly when it
|
|
622
|
+
* finds no db, so an ambient environment missing WORK_DATA_DIR skips every
|
|
623
|
+
* sweep. A checkout's .env.local sits under both, as it does when its run
|
|
624
|
+
* script starts the server. Returns the exit status. */
|
|
625
|
+
function migrate() {
|
|
626
|
+
const script = path.join(pkgRoot, "scripts", "migrate.mjs");
|
|
627
|
+
if (!fs.existsSync(script)) return 0;
|
|
628
|
+
return (
|
|
629
|
+
spawnSync(process.execPath, [script], {
|
|
630
|
+
stdio: "inherit",
|
|
631
|
+
env: { ...checkoutEnvLocal(), ...process.env, ...serviceEnv() },
|
|
632
|
+
}).status ?? 1
|
|
633
|
+
);
|
|
634
|
+
}
|
|
635
|
+
|
|
598
636
|
/** The two packages in this tree that carry install scripts: node-pty builds
|
|
599
637
|
* its native binding when there is no prebuild for the platform, and our own
|
|
600
638
|
* postinstall marks the bundled spawn-helper executable. */
|
|
@@ -643,11 +681,16 @@ async function doctorCmd() {
|
|
|
643
681
|
await fix(d);
|
|
644
682
|
d = await doctor();
|
|
645
683
|
}
|
|
646
|
-
if (args.includes("--json"))
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
684
|
+
if (args.includes("--json")) {
|
|
685
|
+
console.log(JSON.stringify(d, null, 2));
|
|
686
|
+
} else {
|
|
687
|
+
console.log(formatDoctor(d));
|
|
688
|
+
const access = accessNote();
|
|
689
|
+
if (access) warn(access);
|
|
690
|
+
}
|
|
691
|
+
// exitCode, not exit(): a pipe on macOS is written asynchronously, and
|
|
692
|
+
// exiting at once can cut the JSON short for whatever reads it.
|
|
693
|
+
if (!d.ready) process.exitCode = 1;
|
|
651
694
|
}
|
|
652
695
|
|
|
653
696
|
/** Said when the service listens beyond this machine with nothing declared
|
|
@@ -738,33 +781,114 @@ function serviceFile() {
|
|
|
738
781
|
);
|
|
739
782
|
}
|
|
740
783
|
|
|
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
|
+
/** One Environment= line systemd reads back as exactly this value. A value
|
|
804
|
+
* holding whitespace, a quote, `\` or `%` is quoted, with `\` and `"`
|
|
805
|
+
* escaped and `%` doubled, since systemd expands specifiers there: bare, a
|
|
806
|
+
* proxy URL's percent-encoded password, a root with a space or a host list
|
|
807
|
+
* written `a, b` is cut short or dropped whole. Any other value stays bare,
|
|
808
|
+
* the form an older CLI reads back (`work-source prod` runs the npm one),
|
|
809
|
+
* so a setting such a CLI carries is not lost to the quoting. */
|
|
810
|
+
function unitEnvLine(key, value) {
|
|
811
|
+
const text = String(value);
|
|
812
|
+
if (!/[\s"'\\%]/.test(text)) return `Environment=${key}=${text}`;
|
|
813
|
+
const escaped = text.replace(/[\\"]/g, "\\$&").replace(/%/g, "%%");
|
|
814
|
+
return `Environment="${key}=${escaped}"`;
|
|
815
|
+
}
|
|
816
|
+
|
|
817
|
+
/** Text for a plist <string>: launchd reads it as XML. */
|
|
818
|
+
function xmlText(value) {
|
|
819
|
+
return String(value)
|
|
820
|
+
.replace(/&/g, "&")
|
|
821
|
+
.replace(/</g, "<")
|
|
822
|
+
.replace(/>/g, ">");
|
|
823
|
+
}
|
|
824
|
+
|
|
825
|
+
const XML_ENTITIES = { amp: "&", lt: "<", gt: ">", quot: '"', apos: "'" };
|
|
826
|
+
|
|
741
827
|
/** WORK_* already baked into the installed service. `work update` re-runs
|
|
742
828
|
* setup from whatever shell the user happens to be in, so without this the
|
|
743
829
|
* first update silently resets the port, root and data dir to defaults —
|
|
744
830
|
* and a lost WORK_DATA_DIR points the server at an empty database, making
|
|
745
|
-
* every workspace look like it vanished.
|
|
746
|
-
|
|
747
|
-
* set, every interface for `0.0.0.0` / `::` / `*`, else that address. */
|
|
748
|
-
function listenStream(listen, port) {
|
|
749
|
-
if (!listen) return `127.0.0.1:${port}`;
|
|
750
|
-
if (listen === "0.0.0.0" || listen === "::" || listen === "*")
|
|
751
|
-
return String(port);
|
|
752
|
-
return listen.includes(":") ? `[${listen}]:${port}` : `${listen}:${port}`;
|
|
753
|
-
}
|
|
754
|
-
|
|
831
|
+
* every workspace look like it vanished. Values come back unescaped, or the
|
|
832
|
+
* next setup would write the escapes into the value itself. */
|
|
755
833
|
function installedServiceEnv() {
|
|
756
834
|
const installed = {};
|
|
835
|
+
let text;
|
|
757
836
|
try {
|
|
758
|
-
|
|
837
|
+
text = fs.readFileSync(serviceFile(), "utf8");
|
|
838
|
+
} catch {
|
|
839
|
+
return installed;
|
|
840
|
+
}
|
|
841
|
+
if (process.platform === "darwin") {
|
|
759
842
|
const re =
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
843
|
+
/<key>([A-Za-z_][A-Za-z0-9_]*)<\/key>\s*<string>([^<]*)<\/string>/g;
|
|
844
|
+
for (const [, key, value] of text.matchAll(re)) {
|
|
845
|
+
installed[key] = value.replace(
|
|
846
|
+
/&(amp|lt|gt|quot|apos);/g,
|
|
847
|
+
(_, name) => XML_ENTITIES[name],
|
|
848
|
+
);
|
|
849
|
+
}
|
|
850
|
+
return installed;
|
|
851
|
+
}
|
|
852
|
+
// unitEnvLine's quoted form, or an older service's bare `KEY=value`,
|
|
853
|
+
// which was never escaped either.
|
|
854
|
+
const re =
|
|
855
|
+
/^Environment=(?:"([A-Za-z_][A-Za-z0-9_]*)=((?:[^"\\]|\\.)*)"|([A-Za-z_][A-Za-z0-9_]*)=(.*))$/gm;
|
|
856
|
+
for (const [, qKey, qValue, key, value] of text.matchAll(re)) {
|
|
857
|
+
if (qKey) {
|
|
858
|
+
installed[qKey] = qValue.replace(/\\(.)|%%/g, (_, c) => c ?? "%");
|
|
859
|
+
} else {
|
|
860
|
+
installed[key] = value;
|
|
861
|
+
}
|
|
862
|
+
}
|
|
765
863
|
return installed;
|
|
766
864
|
}
|
|
767
865
|
|
|
866
|
+
/** WORK_* from the .env.local of the checkout WORK_SERVICE_EXEC runs, read
|
|
867
|
+
* as scripts/env-local.sh reads it: that script exports them at start, under
|
|
868
|
+
* whatever the service sets. Never written into the service, which would
|
|
869
|
+
* shadow later edits of the file. */
|
|
870
|
+
function checkoutEnvLocal() {
|
|
871
|
+
const exec = process.env.WORK_SERVICE_EXEC;
|
|
872
|
+
const out = {};
|
|
873
|
+
if (!exec) return out;
|
|
874
|
+
let text = "";
|
|
875
|
+
try {
|
|
876
|
+
text = fs.readFileSync(
|
|
877
|
+
path.join(path.dirname(path.dirname(exec)), ".env.local"),
|
|
878
|
+
"utf8",
|
|
879
|
+
);
|
|
880
|
+
} catch {
|
|
881
|
+
return out;
|
|
882
|
+
}
|
|
883
|
+
for (const line of text.split("\n")) {
|
|
884
|
+
const m = /^\s*(?:export\s+)?(WORK_[A-Za-z0-9_]*)=(.*)$/.exec(line);
|
|
885
|
+
if (!m) continue;
|
|
886
|
+
const quoted = /^"(.*)"$|^'(.*)'$/.exec(m[2]);
|
|
887
|
+
out[m[1]] ??= quoted ? (quoted[1] ?? quoted[2]) : m[2];
|
|
888
|
+
}
|
|
889
|
+
return out;
|
|
890
|
+
}
|
|
891
|
+
|
|
768
892
|
function serviceEnv() {
|
|
769
893
|
// Network env worth carrying from the installing shell into the service.
|
|
770
894
|
// (Declared here, not at module level: the command dispatch above runs
|
|
@@ -796,17 +920,23 @@ function serviceEnv() {
|
|
|
796
920
|
const value = key in process.env ? process.env[key] : installed[key];
|
|
797
921
|
if (value) env[key] = value;
|
|
798
922
|
}
|
|
799
|
-
// A new install listens on this machine only
|
|
800
|
-
//
|
|
923
|
+
// A new install listens on this machine only, and its service says so, so
|
|
924
|
+
// that a missing line only ever means a service from before that default.
|
|
925
|
+
// Those listened on every interface, and other machines (a phone, the
|
|
801
926
|
// proxy in front of it) may be reaching it that way: keep it listening,
|
|
802
927
|
// so they get work's page naming the setting to add (server/access.ts)
|
|
803
928
|
// rather than a connection that is simply refused.
|
|
804
|
-
if (!
|
|
805
|
-
|
|
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";
|
|
806
934
|
}
|
|
807
935
|
// entry.ts prefers PORT, so carrying WORK_APP_PORT forward without this
|
|
808
|
-
// would leave the service on the default port anyway.
|
|
809
|
-
|
|
936
|
+
// would leave the service on the default port anyway. A checkout's run
|
|
937
|
+
// script serves the port its .env.local names, so the socket binds that
|
|
938
|
+
// one and setup waits on it.
|
|
939
|
+
env.PORT = env.WORK_APP_PORT || checkoutEnvLocal().WORK_APP_PORT || appPort;
|
|
810
940
|
// A service starts with none of the shell's network environment. Behind a
|
|
811
941
|
// corporate proxy or a private CA the server's own usage fetches would
|
|
812
942
|
// fail while every CLI in a login-shell pane works, so carry those
|
|
@@ -838,16 +968,48 @@ function serviceEnv() {
|
|
|
838
968
|
function isWorkServerCmd(cmd) {
|
|
839
969
|
if (/\btmux\b/.test(cmd)) return false;
|
|
840
970
|
if (/\bwork(\.mjs)?\s+(setup|update|version)\b/.test(cmd)) return false;
|
|
841
|
-
|
|
971
|
+
if (
|
|
842
972
|
/\bwork\.mjs\s+start(?:\s|$)/.test(cmd) ||
|
|
843
973
|
/(?:^|[\s/])work\s+start(?:\s|$)/.test(cmd) ||
|
|
844
|
-
/run-prod\.sh/.test(cmd) ||
|
|
845
|
-
/run-local\.sh/.test(cmd) ||
|
|
846
974
|
/--why=work server is running/.test(cmd) ||
|
|
847
|
-
/--why="work server is running"/.test(cmd)
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
975
|
+
/--why="work server is running"/.test(cmd)
|
|
976
|
+
)
|
|
977
|
+
return true;
|
|
978
|
+
// A built server or run script, by the absolute path an interpreter was
|
|
979
|
+
// handed, inside this package or a checkout of it. A path alone says
|
|
980
|
+
// nothing: `dist/index.mjs` is most node builds' entry, workspaces live
|
|
981
|
+
// under ~/work, and an editor or pager may have a run script open — each
|
|
982
|
+
// a process of the user's that setup must not kill.
|
|
983
|
+
const argv = cmd.split(/\s+/);
|
|
984
|
+
return argv.some((arg, i) => {
|
|
985
|
+
if (
|
|
986
|
+
!/^\/.*\/(?:(?:dist|\.run)\/index\.mjs|scripts\/run-(?:prod|local)\.sh)$/.test(
|
|
987
|
+
arg,
|
|
988
|
+
)
|
|
989
|
+
)
|
|
990
|
+
return false;
|
|
991
|
+
const runner = argv
|
|
992
|
+
.slice(0, i)
|
|
993
|
+
.reverse()
|
|
994
|
+
.find((a) => !a.startsWith("-"));
|
|
995
|
+
if (runner && !/^(?:node|nodejs|bash|sh)$/.test(path.basename(runner)))
|
|
996
|
+
return false;
|
|
997
|
+
return inWorkPackage(arg);
|
|
998
|
+
});
|
|
999
|
+
}
|
|
1000
|
+
|
|
1001
|
+
/** Whether `file` lies in a package named as this one is: the nearest
|
|
1002
|
+
* package.json above it that has a name. */
|
|
1003
|
+
function inWorkPackage(file) {
|
|
1004
|
+
for (let dir = path.dirname(file); ; dir = path.dirname(dir)) {
|
|
1005
|
+
try {
|
|
1006
|
+
const { name } = JSON.parse(
|
|
1007
|
+
fs.readFileSync(path.join(dir, "package.json"), "utf8"),
|
|
1008
|
+
);
|
|
1009
|
+
if (name) return name === pkg.name;
|
|
1010
|
+
} catch {}
|
|
1011
|
+
if (dir === path.dirname(dir)) return false;
|
|
1012
|
+
}
|
|
851
1013
|
}
|
|
852
1014
|
|
|
853
1015
|
function pidsListening(port) {
|
|
@@ -967,11 +1129,11 @@ function stopOldCopies(port) {
|
|
|
967
1129
|
* used to print at a port that answers a second or two later — which reads as
|
|
968
1130
|
* an update that broke the app. Any HTTP reply proves the server is serving;
|
|
969
1131
|
* the status the route returns is not this function's business. */
|
|
970
|
-
async function waitForServer(
|
|
1132
|
+
async function waitForServer(timeoutMs = 30_000) {
|
|
971
1133
|
const deadline = Date.now() + timeoutMs;
|
|
972
1134
|
for (;;) {
|
|
973
1135
|
try {
|
|
974
|
-
await fetch(
|
|
1136
|
+
await fetch(`${serverUrl()}/`, {
|
|
975
1137
|
redirect: "manual",
|
|
976
1138
|
signal: AbortSignal.timeout(2000),
|
|
977
1139
|
});
|
|
@@ -998,13 +1160,8 @@ function installService() {
|
|
|
998
1160
|
const plist = serviceFile();
|
|
999
1161
|
fs.mkdirSync(path.dirname(plist), { recursive: true });
|
|
1000
1162
|
fs.mkdirSync(path.join(os.homedir(), "Library/Logs"), { recursive: true });
|
|
1001
|
-
const xml = (v) =>
|
|
1002
|
-
String(v)
|
|
1003
|
-
.replace(/&/g, "&")
|
|
1004
|
-
.replace(/</g, "<")
|
|
1005
|
-
.replace(/>/g, ">");
|
|
1006
1163
|
const envXml = Object.entries(serviceEnv())
|
|
1007
|
-
.map(([k, v]) => ` <key>${k}</key><string>${
|
|
1164
|
+
.map(([k, v]) => ` <key>${k}</key><string>${xmlText(v)}</string>`)
|
|
1008
1165
|
.join("\n");
|
|
1009
1166
|
fs.writeFileSync(
|
|
1010
1167
|
plist,
|
|
@@ -1014,7 +1171,7 @@ function installService() {
|
|
|
1014
1171
|
<dict>
|
|
1015
1172
|
<key>Label</key><string>dev.work.app</string>
|
|
1016
1173
|
<key>ProgramArguments</key>
|
|
1017
|
-
<array>${startArgs.map((a) => `<string>${a}</string>`).join("")}</array>
|
|
1174
|
+
<array>${startArgs.map((a) => `<string>${xmlText(a)}</string>`).join("")}</array>
|
|
1018
1175
|
<key>RunAtLoad</key><true/>
|
|
1019
1176
|
<key>KeepAlive</key><true/>
|
|
1020
1177
|
<key>StandardOutPath</key><string>${os.homedir()}/Library/Logs/work.log</string>
|
|
@@ -1072,7 +1229,7 @@ ${envXml}
|
|
|
1072
1229
|
const unitDir = path.dirname(unitFile);
|
|
1073
1230
|
fs.mkdirSync(unitDir, { recursive: true });
|
|
1074
1231
|
const envLines = Object.entries(serviceEnv())
|
|
1075
|
-
.map(([k, v]) =>
|
|
1232
|
+
.map(([k, v]) => unitEnvLine(k, v))
|
|
1076
1233
|
.join("\n");
|
|
1077
1234
|
const execStart = unitCommand(target);
|
|
1078
1235
|
// The port is held by work.socket, not the server: a restart swaps the
|
|
@@ -1146,7 +1303,7 @@ WantedBy=default.target
|
|
|
1146
1303
|
|
|
1147
1304
|
warn(
|
|
1148
1305
|
execOverride
|
|
1149
|
-
?
|
|
1306
|
+
? `no service manager found. Start manually with: ${execOverride}`
|
|
1150
1307
|
: "no service manager found. Start manually with: work start",
|
|
1151
1308
|
);
|
|
1152
1309
|
return false;
|