@dylanpiercey/work 0.0.46 → 0.0.48
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 +84 -49
- package/dist/{_P9IsUQm2.js → _CO83dVER.js} +472 -35
- package/dist/_DjrRGy4k.js +2 -0
- package/dist/{_BlRAjywT.js → _Hz_qlZE1.js} +67 -67
- package/dist/{_CWl3Ch5X.js → _m3ryV1w6.js} +47 -46
- package/dist/index.mjs +2304 -1174
- package/dist/public/assets/{_qriUiiqP.js → _1cz-l3Ka.js} +1 -1
- package/dist/public/assets/_1cz-l3Ka.js.br +0 -0
- package/dist/public/assets/{_BXfL26ye2.js → _1oYv4fmY2.js} +1 -1
- package/dist/public/assets/_1oYv4fmY2.js.br +0 -0
- package/dist/public/assets/{_DCm-_PJn2.js → _3i592Qvz2.js} +1 -1
- package/dist/public/assets/_3i592Qvz2.js.br +0 -0
- package/dist/public/assets/{_cEH-PUtq2.js → _8nx9Raqx2.js} +1 -1
- package/dist/public/assets/_8nx9Raqx2.js.br +0 -0
- package/dist/public/assets/{_iIzVA4u72.js → _9yP8iK4t2.js} +1 -1
- package/dist/public/assets/_9yP8iK4t2.js.br +0 -0
- package/dist/public/assets/{_C8Et1SyI2.js → _B-MMW3nb2.js} +1 -1
- package/dist/public/assets/_B-MMW3nb2.js.br +0 -0
- package/dist/public/assets/{_Buzw695T2.js → _B2fn4I8S2.js} +1 -1
- package/dist/public/assets/_B2fn4I8S2.js.br +0 -0
- package/dist/public/assets/{_DbNaSvXF.js → _B49r6O_E.js} +1 -1
- package/dist/public/assets/_B49r6O_E.js.br +0 -0
- package/dist/public/assets/{_EuJYsBIp.js → _BBW7mJhZ.js} +1 -1
- package/dist/public/assets/_BBW7mJhZ.js.br +0 -0
- package/dist/public/assets/{_3Ix19RVv.js → _BC2FBUbj.js} +1 -1
- package/dist/public/assets/_BC2FBUbj.js.br +0 -0
- package/dist/public/assets/{_CNkHd20B.js → _BFt-jSq-.js} +1 -1
- package/dist/public/assets/_BFt-jSq-.js.br +0 -0
- package/dist/public/assets/{_2M21bg3q2.js → _BGyMoPGj2.js} +1 -1
- package/dist/public/assets/_BGyMoPGj2.js.br +0 -0
- package/dist/public/assets/{_BKoNtf_F.js → _BLjOZLxk.js} +1 -1
- package/dist/public/assets/_BLjOZLxk.js.br +0 -0
- package/dist/public/assets/{_BjNNABN4.js → _BPFJiBiE.js} +1 -1
- package/dist/public/assets/_BPFJiBiE.js.br +0 -0
- package/dist/public/assets/{_nYIFwHU2.js → _BPLnh5S4.js} +1 -1
- package/dist/public/assets/_BPLnh5S4.js.br +0 -0
- package/dist/public/assets/{_BIoq-ERW.js → _BRzL7uNP.js} +1 -1
- package/dist/public/assets/_BRzL7uNP.js.br +0 -0
- package/dist/public/assets/{_qsL2FxXl.js → _BV-nVD9L2.js} +1 -1
- package/dist/public/assets/_BV-nVD9L2.js.br +0 -0
- package/dist/public/assets/{_AnY5lXmz2.js → _BbMkV19p2.js} +1 -1
- package/dist/public/assets/_BbMkV19p2.js.br +0 -0
- package/dist/public/assets/{_BEK6FWxR.js → _BbW3-3ve.js} +1 -1
- package/dist/public/assets/_BbW3-3ve.js.br +0 -0
- package/dist/public/assets/{_DfrjsE1y2.js → _BdbnwCKs2.js} +1 -1
- package/dist/public/assets/_BdbnwCKs2.js.br +0 -0
- package/dist/public/assets/_BeSgyXoy2.js +1 -0
- package/dist/public/assets/_BeSgyXoy2.js.br +0 -0
- package/dist/public/assets/{_D6gJIVAe.js → _Bg9mkw0u.js} +1 -1
- package/dist/public/assets/_Bg9mkw0u.js.br +0 -0
- package/dist/public/assets/{_DXyHmj0W.js → _BhUM9ZCP.js} +1 -1
- package/dist/public/assets/_BhUM9ZCP.js.br +0 -0
- package/dist/public/assets/{_CIWR8COm.js → _Bhnzfac_.js} +1 -1
- package/dist/public/assets/_Bhnzfac_.js.br +0 -0
- package/dist/public/assets/{_iTZwOiw8.js → _BiEWaww7.js} +1 -1
- package/dist/public/assets/_BiEWaww7.js.br +0 -0
- package/dist/public/assets/{_CPintIPn.js → _Bm-lmvlM.js} +1 -1
- package/dist/public/assets/_Bm-lmvlM.js.br +0 -0
- package/dist/public/assets/{_BAm2L16s2.js → _Bpdzs0h4.js} +1 -1
- package/dist/public/assets/_Bpdzs0h4.js.br +0 -0
- package/dist/public/assets/{_XYmpEKpu.js → _BqeAAcor.js} +1 -1
- package/dist/public/assets/_BqeAAcor.js.br +0 -0
- package/dist/public/assets/{_Cjul82Zq.js → _Bvwr3uff.js} +1 -1
- package/dist/public/assets/_Bvwr3uff.js.br +0 -0
- package/dist/public/assets/{_BxoEzgEZ.js → _ByiODT9w.js} +1 -1
- package/dist/public/assets/_ByiODT9w.js.br +0 -0
- package/dist/public/assets/{_DGWBK-es.js → _C4NK2Cq5.js} +1 -1
- package/dist/public/assets/_C4NK2Cq5.js.br +0 -0
- package/dist/public/assets/{_C7ePJdWG.js → _CASsRCtt.js} +1 -1
- package/dist/public/assets/_CASsRCtt.js.br +0 -0
- package/dist/public/assets/{_DCWsqkZv2.js → _CH4P29Yf2.js} +1 -1
- package/dist/public/assets/_CH4P29Yf2.js.br +0 -0
- package/dist/public/assets/{_BwiRBnwa2.js → _CHqTBuzz2.js} +1 -1
- package/dist/public/assets/_CHqTBuzz2.js.br +0 -0
- package/dist/public/assets/{_DXcwnV6_2.js → _CIeZtXbg2.js} +1 -1
- package/dist/public/assets/_CIeZtXbg2.js.br +0 -0
- package/dist/public/assets/{_BRlDlrsI.js → _CObQoJCq.js} +1 -1
- package/dist/public/assets/_CObQoJCq.js.br +0 -0
- package/dist/public/assets/{_Bl1lbp_w.js → _CQDBqJkT.js} +1 -1
- package/dist/public/assets/_CQDBqJkT.js.br +0 -0
- package/dist/public/assets/{_CF8Ye5Pr.js → _CUqlR7rP.js} +1 -1
- package/dist/public/assets/_CUqlR7rP.js.br +0 -0
- package/dist/public/assets/{_Bwvf5O5m.js → _CUwAZxRw.js} +1 -1
- package/dist/public/assets/_CUwAZxRw.js.br +0 -0
- package/dist/public/assets/{_bnyHmBSB.js → _CbMNS899.js} +1 -1
- package/dist/public/assets/_CbMNS899.js.br +0 -0
- package/dist/public/assets/{_DHGqWb3U2.js → _Ced5468N2.js} +1 -1
- package/dist/public/assets/{_B_q23_II.js → _Cf0wSsqE.js} +1 -1
- package/dist/public/assets/_Cf0wSsqE.js.br +0 -0
- package/dist/public/assets/{_BYauXu-72.js → _ClEKr0Tm2.js} +1 -1
- package/dist/public/assets/_ClEKr0Tm2.js.br +0 -0
- package/dist/public/assets/{_DNzVvAp22.js → _CsNJf4g52.js} +1 -1
- package/dist/public/assets/_CsNJf4g52.js.br +0 -0
- package/dist/public/assets/{_D1PGPveJ2.js → _CtErcdf92.js} +1 -1
- package/dist/public/assets/_CtErcdf92.js.br +0 -0
- package/dist/public/assets/{_eKiwGFGI.js → _DAfu0wMa.js} +1 -1
- package/dist/public/assets/_DAfu0wMa.js.br +0 -0
- package/dist/public/assets/{_KWAohXQr.js → _DBN8F3s1.js} +1 -1
- package/dist/public/assets/_DBN8F3s1.js.br +0 -0
- package/dist/public/assets/{_CHF-A3pQ2.js → _DBn74psf2.js} +1 -1
- package/dist/public/assets/{_BpdQAAz52.js → _DFOnuGNp.js} +1 -1
- package/dist/public/assets/_DFOnuGNp.js.br +0 -0
- package/dist/public/assets/{_CCEQHCkw2.js → _DHvVwuPu2.js} +1 -1
- package/dist/public/assets/_DHvVwuPu2.js.br +0 -0
- package/dist/public/assets/{_C2_FIDzy.js → _DKnLFVdw.js} +1 -1
- package/dist/public/assets/_DKnLFVdw.js.br +0 -0
- package/dist/public/assets/{_DqtgQ2KQ2.js → _DLFnXIrG2.js} +1 -1
- package/dist/public/assets/_DLFnXIrG2.js.br +0 -0
- package/dist/public/assets/{_dqrrRyjM.js → _DLK0WouR.js} +1 -1
- package/dist/public/assets/_DLK0WouR.js.br +0 -0
- package/dist/public/assets/_DLLEkkcM.js +1531 -0
- package/dist/public/assets/_DLLEkkcM.js.br +0 -0
- package/dist/public/assets/{_apOz5w70.js → _DOpT45mO.js} +1 -1
- package/dist/public/assets/_DOpT45mO.js.br +0 -0
- package/dist/public/assets/{_CovynO6D.js → _DT9Qs1il.js} +1 -1
- package/dist/public/assets/_DT9Qs1il.js.br +0 -0
- package/dist/public/assets/{_DEwU7Qht2.js → _DVPPxo4e2.js} +1 -1
- package/dist/public/assets/_DVPPxo4e2.js.br +0 -0
- package/dist/public/assets/{_CJb-25b5.js → _De7fhQUT.js} +1 -1
- package/dist/public/assets/_De7fhQUT.js.br +0 -0
- package/dist/public/assets/{_7QGssl5Y2.js → _DgmBuYFG2.js} +1 -1
- package/dist/public/assets/_DgmBuYFG2.js.br +0 -0
- package/dist/public/assets/{_CV-6NFPr.js → _DjLQQUoq.js} +1 -1
- package/dist/public/assets/_DjLQQUoq.js.br +0 -0
- package/dist/public/assets/{_CcKgVKPB.js → _Dn4wMX5v.js} +1 -1
- package/dist/public/assets/_Dn4wMX5v.js.br +0 -0
- package/dist/public/assets/{_C8ZyCmzP2.js → _DsJkMBKU2.js} +1 -1
- package/dist/public/assets/_DsJkMBKU2.js.br +0 -0
- package/dist/public/assets/{_CG1U-TrX.js → _Ez06j6Qv.js} +1 -1
- package/dist/public/assets/_Ez06j6Qv.js.br +0 -0
- package/dist/public/assets/{_BfHpfaZ_.js → _FCV34uHN.js} +1 -1
- package/dist/public/assets/_FCV34uHN.js.br +0 -0
- package/dist/public/assets/{_BgEZ4VVT.js → _I6H6F0ME.js} +1 -1
- package/dist/public/assets/_I6H6F0ME.js.br +0 -0
- package/dist/public/assets/{_DXwZkY0g.js → _K6PNL3j4.js} +1 -1
- package/dist/public/assets/_K6PNL3j4.js.br +0 -0
- package/dist/public/assets/{_Da05VMNb.js → _KVpYyL9A.js} +1 -1
- package/dist/public/assets/_KVpYyL9A.js.br +0 -0
- package/dist/public/assets/{_BBEhnK4G.js → _KjztUkjx.js} +1 -1
- package/dist/public/assets/_KjztUkjx.js.br +0 -0
- package/dist/public/assets/{_352AdLA5.js → _Q6y5EfU1.js} +1 -1
- package/dist/public/assets/_Q6y5EfU1.js.br +0 -0
- package/dist/public/assets/{_B0-W17hf.js → _cRLLpjIg.js} +1 -1
- package/dist/public/assets/_cRLLpjIg.js.br +0 -0
- package/dist/public/assets/{_wqvH6a9w.js → _h8qSl3Me.js} +1 -1
- package/dist/public/assets/{_CulCcVql.js → _kv39JOeM.js} +1 -1
- package/dist/public/assets/_kv39JOeM.js.br +0 -0
- package/dist/public/assets/{_DTpbGvLK.js → _o1of2_lP.js} +1 -1
- package/dist/public/assets/_o1of2_lP.js.br +0 -0
- package/dist/public/assets/{_7EJ8kgH9.js → _qoSWRJiT.js} +1 -1
- package/dist/public/assets/_qoSWRJiT.js.br +0 -0
- package/dist/public/assets/{_B5-VBCs9.js → _yQJK428k.js} +1 -1
- package/dist/public/assets/_yQJK428k.js.br +0 -0
- package/dist/public/assets/diff-view-CQX-Ovnt.css +1 -0
- package/dist/public/assets/diff-view-CQX-Ovnt.css.br +0 -0
- package/dist/public/assets/index-DR0Bvd6u.css +1 -0
- package/dist/public/assets/index-DR0Bvd6u.css.br +0 -0
- package/dist/public/assets/index-fCEONff1.js +85 -0
- package/dist/public/assets/index-fCEONff1.js.br +0 -0
- package/lib/setup/catalog.d.mts +22 -0
- package/lib/setup/catalog.mjs +72 -0
- package/lib/setup/doctor.d.mts +49 -0
- package/lib/setup/doctor.mjs +203 -0
- package/lib/setup/install.d.mts +14 -0
- package/lib/setup/install.mjs +135 -0
- package/package.json +2 -1
- package/dist/_kABYZA6_.js +0 -2
- package/dist/public/assets/_2M21bg3q2.js.br +0 -0
- package/dist/public/assets/_352AdLA5.js.br +0 -0
- package/dist/public/assets/_3Ix19RVv.js.br +0 -0
- package/dist/public/assets/_7EJ8kgH9.js.br +0 -0
- package/dist/public/assets/_7QGssl5Y2.js.br +0 -0
- package/dist/public/assets/_AnY5lXmz2.js.br +0 -0
- package/dist/public/assets/_B0-W17hf.js.br +0 -0
- package/dist/public/assets/_B5-VBCs9.js.br +0 -0
- package/dist/public/assets/_BAm2L16s2.js.br +0 -0
- package/dist/public/assets/_BBEhnK4G.js.br +0 -0
- package/dist/public/assets/_BEK6FWxR.js.br +0 -0
- package/dist/public/assets/_BIoq-ERW.js.br +0 -0
- package/dist/public/assets/_BKoNtf_F.js.br +0 -0
- package/dist/public/assets/_BRlDlrsI.js.br +0 -0
- package/dist/public/assets/_BXfL26ye2.js.br +0 -0
- package/dist/public/assets/_BYauXu-72.js.br +0 -0
- package/dist/public/assets/_B_q23_II.js.br +0 -0
- package/dist/public/assets/_BfHpfaZ_.js.br +0 -0
- package/dist/public/assets/_BgEZ4VVT.js.br +0 -0
- package/dist/public/assets/_BjNNABN4.js.br +0 -0
- package/dist/public/assets/_Bl1lbp_w.js.br +0 -0
- package/dist/public/assets/_BpdQAAz52.js.br +0 -0
- package/dist/public/assets/_Buzw695T2.js.br +0 -0
- package/dist/public/assets/_BwiRBnwa2.js.br +0 -0
- package/dist/public/assets/_Bwvf5O5m.js.br +0 -0
- package/dist/public/assets/_BxoEzgEZ.js.br +0 -0
- package/dist/public/assets/_C2_FIDzy.js.br +0 -0
- package/dist/public/assets/_C7ePJdWG.js.br +0 -0
- package/dist/public/assets/_C8Et1SyI2.js.br +0 -0
- package/dist/public/assets/_C8ZyCmzP2.js.br +0 -0
- package/dist/public/assets/_CCEQHCkw2.js.br +0 -0
- package/dist/public/assets/_CF8Ye5Pr.js.br +0 -0
- package/dist/public/assets/_CG1U-TrX.js.br +0 -0
- package/dist/public/assets/_CIWR8COm.js.br +0 -0
- package/dist/public/assets/_CJb-25b5.js.br +0 -0
- package/dist/public/assets/_CNkHd20B.js.br +0 -0
- package/dist/public/assets/_CPintIPn.js.br +0 -0
- package/dist/public/assets/_CV-6NFPr.js.br +0 -0
- package/dist/public/assets/_CcKgVKPB.js.br +0 -0
- package/dist/public/assets/_Cjul82Zq.js.br +0 -0
- package/dist/public/assets/_ClIws-96.js +0 -1531
- package/dist/public/assets/_ClIws-96.js.br +0 -0
- package/dist/public/assets/_CovynO6D.js.br +0 -0
- package/dist/public/assets/_CulCcVql.js.br +0 -0
- package/dist/public/assets/_D1PGPveJ2.js.br +0 -0
- package/dist/public/assets/_D6gJIVAe.js.br +0 -0
- package/dist/public/assets/_DCWsqkZv2.js.br +0 -0
- package/dist/public/assets/_DCm-_PJn2.js.br +0 -0
- package/dist/public/assets/_DEwU7Qht2.js.br +0 -0
- package/dist/public/assets/_DGWBK-es.js.br +0 -0
- package/dist/public/assets/_DNzVvAp22.js.br +0 -0
- package/dist/public/assets/_DTpbGvLK.js.br +0 -0
- package/dist/public/assets/_DXcwnV6_2.js.br +0 -0
- package/dist/public/assets/_DXwZkY0g.js.br +0 -0
- package/dist/public/assets/_DXyHmj0W.js.br +0 -0
- package/dist/public/assets/_Da-7IlQ12.js +0 -1
- package/dist/public/assets/_Da-7IlQ12.js.br +0 -0
- package/dist/public/assets/_Da05VMNb.js.br +0 -0
- package/dist/public/assets/_DbNaSvXF.js.br +0 -0
- package/dist/public/assets/_DfrjsE1y2.js.br +0 -0
- package/dist/public/assets/_DqtgQ2KQ2.js.br +0 -0
- package/dist/public/assets/_EuJYsBIp.js.br +0 -0
- package/dist/public/assets/_KWAohXQr.js.br +0 -0
- package/dist/public/assets/_XYmpEKpu.js.br +0 -0
- package/dist/public/assets/_YewM841C.js +0 -1
- package/dist/public/assets/_YewM841C.js.br +0 -0
- package/dist/public/assets/_apOz5w70.js.br +0 -0
- package/dist/public/assets/_bnyHmBSB.js.br +0 -0
- package/dist/public/assets/_cEH-PUtq2.js.br +0 -0
- package/dist/public/assets/_dqrrRyjM.js.br +0 -0
- package/dist/public/assets/_eKiwGFGI.js.br +0 -0
- package/dist/public/assets/_iIzVA4u72.js.br +0 -0
- package/dist/public/assets/_iTZwOiw8.js.br +0 -0
- package/dist/public/assets/_nYIFwHU2.js.br +0 -0
- package/dist/public/assets/_qriUiiqP.js.br +0 -0
- package/dist/public/assets/_qsL2FxXl.js.br +0 -0
- package/dist/public/assets/diff-view-C8mNAKSm.css +0 -1
- package/dist/public/assets/diff-view-C8mNAKSm.css.br +0 -0
- package/dist/public/assets/index-7WlgwCwh.css +0 -1
- package/dist/public/assets/index-7WlgwCwh.css.br +0 -0
- package/dist/public/assets/index-BffJzCDz.js +0 -86
- package/dist/public/assets/index-BffJzCDz.js.br +0 -0
- package/dist/public/assets/preload-helper-EAZGOO6u.css +0 -1
- package/dist/public/assets/preload-helper-EAZGOO6u.css.br +0 -0
- /package/dist/public/assets/{_B5W6OYN72.js → _B5W6OYN7.js} +0 -0
- /package/dist/public/assets/{_B5W6OYN72.js.br → _B5W6OYN7.js.br} +0 -0
- /package/dist/public/assets/{_DMoTqEGO2.js → _DMoTqEGO.js} +0 -0
- /package/dist/public/assets/{_DMoTqEGO2.js.br → _DMoTqEGO.js.br} +0 -0
- /package/dist/public/assets/{_DmIc4jLQ2.js → _DmIc4jLQ.js} +0 -0
- /package/dist/public/assets/{_DmIc4jLQ2.js.br → _DmIc4jLQ.js.br} +0 -0
- /package/dist/public/assets/{_DsUTQ-LC.js → _DsUTQ-LC2.js} +0 -0
- /package/dist/public/assets/{_DsUTQ-LC.js.br → _DsUTQ-LC2.js.br} +0 -0
- /package/dist/public/assets/{_VbXTXTou.js → _VbXTXTou2.js} +0 -0
- /package/dist/public/assets/{_VbXTXTou.js.br → _VbXTXTou2.js.br} +0 -0
- /package/dist/public/assets/{_iXnhIJG7.js → _iXnhIJG72.js} +0 -0
- /package/dist/public/assets/{_iXnhIJG7.js.br → _iXnhIJG72.js.br} +0 -0
- /package/dist/public/assets/{_vGVdxbeo.js → _vGVdxbeo2.js} +0 -0
- /package/dist/public/assets/{_vGVdxbeo.js.br → _vGVdxbeo2.js.br} +0 -0
package/bin/work.mjs
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
// work CLI — ships with the npm package (no dependencies; plain node).
|
|
3
3
|
//
|
|
4
|
-
// work setup install/refresh the background service
|
|
4
|
+
// work setup install missing tools, sign in, install/refresh the background service
|
|
5
|
+
// work doctor report machine readiness (--json, --fix to install what's missing)
|
|
5
6
|
// work start run the server in the foreground
|
|
6
7
|
// work update upgrade the npm package and refresh the service
|
|
7
8
|
// work usage print agent plan/quota usage
|
|
@@ -12,6 +13,9 @@ import os from "node:os";
|
|
|
12
13
|
import path from "node:path";
|
|
13
14
|
import { fileURLToPath } from "node:url";
|
|
14
15
|
import { createRequire } from "node:module";
|
|
16
|
+
import readline from "node:readline/promises";
|
|
17
|
+
import { doctor, formatDoctor } from "../lib/setup/doctor.mjs";
|
|
18
|
+
import { authGithub, installAgent, installTool } from "../lib/setup/install.mjs";
|
|
15
19
|
|
|
16
20
|
const pkgRoot = path.dirname(path.dirname(fileURLToPath(import.meta.url)));
|
|
17
21
|
const pkg = JSON.parse(fs.readFileSync(path.join(pkgRoot, "package.json"), "utf8"));
|
|
@@ -41,6 +45,9 @@ switch (command) {
|
|
|
41
45
|
case "setup":
|
|
42
46
|
await setup();
|
|
43
47
|
break;
|
|
48
|
+
case "doctor":
|
|
49
|
+
await doctorCmd();
|
|
50
|
+
break;
|
|
44
51
|
case "update":
|
|
45
52
|
await update();
|
|
46
53
|
break;
|
|
@@ -54,7 +61,7 @@ switch (command) {
|
|
|
54
61
|
break;
|
|
55
62
|
default:
|
|
56
63
|
console.log(
|
|
57
|
-
`work ${pkg.version}\n\nusage: work <setup|start|update|usage|version>`,
|
|
64
|
+
`work ${pkg.version}\n\nusage: work <setup|doctor|start|update|usage|version>`,
|
|
58
65
|
);
|
|
59
66
|
}
|
|
60
67
|
|
|
@@ -136,51 +143,7 @@ function short(ms) {
|
|
|
136
143
|
}
|
|
137
144
|
|
|
138
145
|
async function setup() {
|
|
139
|
-
|
|
140
|
-
// `npm i -g` user may be missing them.
|
|
141
|
-
for (const tool of ["git", "tmux"]) {
|
|
142
|
-
if (!have(tool)) die(`${tool} not found — install it and re-run (the curl installer does this automatically)`);
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
// Default toolset (mirrors DylanPiercey/start): gh for PR features plus
|
|
146
|
-
// the utilities agents reach for constantly. Static binaries via mise,
|
|
147
|
-
// each non-fatal, skipped when already on PATH.
|
|
148
|
-
if (have("mise")) {
|
|
149
|
-
const tools = [
|
|
150
|
-
"gh",
|
|
151
|
-
"ripgrep", // rg
|
|
152
|
-
"fd",
|
|
153
|
-
"jq",
|
|
154
|
-
"delta",
|
|
155
|
-
"ast-grep",
|
|
156
|
-
"hyperfine",
|
|
157
|
-
"fzf",
|
|
158
|
-
"bottom",
|
|
159
|
-
"pnpm",
|
|
160
|
-
];
|
|
161
|
-
// Note: ast-grep's short alias `sg` collides with the coreutils
|
|
162
|
-
// setgroups command — check the long binary name.
|
|
163
|
-
const binOf = { ripgrep: "rg", bottom: "btm" };
|
|
164
|
-
for (const tool of tools) {
|
|
165
|
-
if (have(binOf[tool] || tool)) continue;
|
|
166
|
-
log(`installing ${tool} via mise`);
|
|
167
|
-
if (spawnSync("mise", ["use", "-g", "-y", `${tool}@latest`], { stdio: "inherit" }).status !== 0) {
|
|
168
|
-
warn(`${tool} install failed (non-fatal)`);
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
} else if (!have("gh")) {
|
|
172
|
-
warn("gh not found and mise unavailable — PR features need gh; install it and re-run");
|
|
173
|
-
}
|
|
174
|
-
if (have("gh") && spawnSync("gh", ["auth", "status"], { stdio: "ignore" }).status !== 0) {
|
|
175
|
-
if (process.env.GH_TOKEN || process.env.GITHUB_TOKEN) {
|
|
176
|
-
log("gh will use GH_TOKEN from the environment");
|
|
177
|
-
} else if (yes) {
|
|
178
|
-
warn("gh is not authenticated — run `gh auth login` later");
|
|
179
|
-
} else {
|
|
180
|
-
log("authenticating gh (GitHub PRs/clones)");
|
|
181
|
-
sh("gh", ["auth", "login"]);
|
|
182
|
-
}
|
|
183
|
-
}
|
|
146
|
+
await fix(await doctor(), { agents: yes ? "skip" : "prompt" });
|
|
184
147
|
|
|
185
148
|
// One-shot cleanups between versions. Run them against the settings the
|
|
186
149
|
// service actually uses: migrate.mjs exits quietly when it finds no db, so
|
|
@@ -206,6 +169,73 @@ async function update() {
|
|
|
206
169
|
sh("work", ["setup", ...(yes ? ["--yes"] : [])]);
|
|
207
170
|
}
|
|
208
171
|
|
|
172
|
+
/** Machine readiness from lib/setup — the same probe the Settings page runs. */
|
|
173
|
+
async function doctorCmd() {
|
|
174
|
+
let d = await doctor();
|
|
175
|
+
if (args.includes("--fix")) {
|
|
176
|
+
await fix(d, { agents: yes ? "skip" : "prompt" });
|
|
177
|
+
d = await doctor();
|
|
178
|
+
}
|
|
179
|
+
if (args.includes("--json")) return console.log(JSON.stringify(d, null, 2));
|
|
180
|
+
console.log(formatDoctor(d));
|
|
181
|
+
if (!d.ready) process.exit(1);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Bring the machine to "ready": required tools, then optional ones (each
|
|
186
|
+
* non-fatal), then gh sign-in, then agent CLIs. `--yes` never prompts —
|
|
187
|
+
* sign-in and agents are deferred with a hint. Re-runs are idempotent
|
|
188
|
+
* because everything is keyed off what doctor() found missing.
|
|
189
|
+
*/
|
|
190
|
+
async function fix(d, { agents = "prompt" } = {}) {
|
|
191
|
+
for (const tool of d.tools.filter((t) => !t.installed)) {
|
|
192
|
+
if (!tool.installable) {
|
|
193
|
+
if (tool.required) die(`${tool.label} not found — install it and re-run (the curl installer does this automatically)`);
|
|
194
|
+
continue;
|
|
195
|
+
}
|
|
196
|
+
log(`installing ${tool.label} via mise`);
|
|
197
|
+
try {
|
|
198
|
+
await installTool(tool.id, { log: (l) => console.log(` ${l}`) });
|
|
199
|
+
} catch (err) {
|
|
200
|
+
if (tool.required) die(`${tool.label} install failed: ${err.message}`);
|
|
201
|
+
warn(`${tool.label} install failed (non-fatal)`);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
const authed = d.github.some((h) => h.authed);
|
|
205
|
+
if (!authed && have("gh")) {
|
|
206
|
+
if (process.env.GH_TOKEN || process.env.GITHUB_TOKEN) {
|
|
207
|
+
log("gh will use GH_TOKEN from the environment");
|
|
208
|
+
} else if (yes) {
|
|
209
|
+
warn("gh is not authenticated — run `gh auth login` later");
|
|
210
|
+
} else {
|
|
211
|
+
log("signing in to GitHub (PRs/clones)");
|
|
212
|
+
await authGithub("github.com", { interactive: true }).catch((err) => warn(err.message));
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
const missingAgents = d.agents.filter((a) => !a.installed);
|
|
216
|
+
if (missingAgents.length && agents !== "skip") {
|
|
217
|
+
const names = missingAgents.map((a) => a.label).join(", ");
|
|
218
|
+
let go = agents === "all";
|
|
219
|
+
if (!go) {
|
|
220
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
221
|
+
const ans = await rl.question(`Install coding agent CLIs (${names})? [y/N] `).catch(() => "");
|
|
222
|
+
rl.close();
|
|
223
|
+
go = /^y/i.test(ans.trim());
|
|
224
|
+
}
|
|
225
|
+
if (go) {
|
|
226
|
+
for (const a of missingAgents) {
|
|
227
|
+
try {
|
|
228
|
+
await installAgent(a.id, { log: (l) => console.log(` ${l}`) });
|
|
229
|
+
} catch (err) {
|
|
230
|
+
warn(`${a.label} install failed (non-fatal): ${err.message}`);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
} else if (!d.agents.some((a) => a.installed)) {
|
|
235
|
+
warn(`no coding agent CLI found — install one later from Settings or: work doctor --fix`);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
209
239
|
/** PATH baked into the service — it runs without a login shell. */
|
|
210
240
|
function servicePath() {
|
|
211
241
|
const home = os.homedir();
|
|
@@ -295,10 +325,11 @@ function isWorkServerCmd(cmd) {
|
|
|
295
325
|
/\bwork\.mjs\s+start(?:\s|$)/.test(cmd) ||
|
|
296
326
|
/(?:^|[\s/])work\s+start(?:\s|$)/.test(cmd) ||
|
|
297
327
|
/run-prod\.sh/.test(cmd) ||
|
|
328
|
+
/run-local\.sh/.test(cmd) ||
|
|
298
329
|
/--why=work server is running/.test(cmd) ||
|
|
299
330
|
/--why="work server is running"/.test(cmd) ||
|
|
300
331
|
(/@dylanpiercey\/work\//.test(cmd) && !/\bnpm\b/.test(cmd)) ||
|
|
301
|
-
/\/work\/(?:\S*\/)?dist\/index\.mjs/.test(cmd)
|
|
332
|
+
/\/work\/(?:\S*\/)?(?:dist|\.run)\/index\.mjs/.test(cmd)
|
|
302
333
|
);
|
|
303
334
|
}
|
|
304
335
|
|
|
@@ -368,7 +399,11 @@ function stopOldCopies(port) {
|
|
|
368
399
|
if (!name.endsWith(".plist")) continue;
|
|
369
400
|
const file = path.join(agents, name);
|
|
370
401
|
const text = fs.readFileSync(file, "utf8");
|
|
371
|
-
if (
|
|
402
|
+
if (
|
|
403
|
+
!/dev\.work\.app|work\.mjs|run-prod\.sh|run-local\.sh|@dylanpiercey\/work/.test(
|
|
404
|
+
text,
|
|
405
|
+
)
|
|
406
|
+
)
|
|
372
407
|
continue;
|
|
373
408
|
const label = text.match(
|
|
374
409
|
/<key>Label<\/key>\s*<string>([^<]+)<\/string>/,
|