@dylanpiercey/work 0.2.17 → 0.2.18
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 +13 -0
- package/bin/cli/README.md +34 -0
- package/bin/cli/_progress.mjs +68 -0
- package/bin/cli/_repo.mjs +32 -0
- package/bin/cli/_target.mjs +49 -0
- package/bin/cli/agent.mjs +153 -0
- package/bin/cli/branches.mjs +79 -0
- package/bin/cli/config.mjs +175 -0
- package/bin/cli/host.mjs +142 -0
- package/bin/cli/lsp.mjs +117 -0
- package/bin/cli/notify.mjs +53 -0
- package/bin/cli/open.mjs +37 -0
- package/bin/cli/repo.mjs +98 -0
- package/bin/cli/session.mjs +167 -0
- package/bin/cli/skill.mjs +99 -0
- package/bin/cli/stack.mjs +51 -0
- package/bin/cli/status.mjs +86 -0
- package/bin/cli/topic.mjs +585 -0
- package/bin/cli/workspace.mjs +184 -0
- package/bin/work.mjs +402 -80
- package/dist/_BAJGOEa1.js +168 -0
- package/dist/{_Bj-WwfnW.js → _BlLEM8du.js} +76 -46
- package/dist/_t9VsALwo.js +2 -0
- package/dist/index.mjs +3550 -2616
- package/dist/public/assets/{_CXVkXsw1.js → _10dZ1R0m.js} +1 -1
- package/dist/public/assets/_10dZ1R0m.js.br +0 -0
- package/dist/public/assets/_1EPD0XJG.js +1 -0
- package/dist/public/assets/_1jA3fFvQ.js +1 -0
- package/dist/public/assets/{_DZanHI_X.js → _4Sj6a8Ya.js} +1 -1
- package/dist/public/assets/_4Sj6a8Ya.js.br +0 -0
- package/dist/public/assets/{_Quh6tl1u.js → _5tN48iuJ.js} +1 -1
- package/dist/public/assets/_5tN48iuJ.js.br +0 -0
- package/dist/public/assets/{_CYQ4srZb.js → _8_DzkMgB.js} +1 -1
- package/dist/public/assets/_8_DzkMgB.js.br +0 -0
- package/dist/public/assets/{_CxgPm_xy.js → _9JG-F3GR.js} +1 -1
- package/dist/public/assets/_9JG-F3GR.js.br +0 -0
- package/dist/public/assets/_9KUM3Nch.js +2 -0
- package/dist/public/assets/_9KUM3Nch.js.br +0 -0
- package/dist/public/assets/{_BoEcMQmX.js → _B-H6ABVZ.js} +1 -1
- package/dist/public/assets/_B-H6ABVZ.js.br +0 -0
- package/dist/public/assets/{_D-0pUYXq.js → _B-iOtMg6.js} +1 -1
- package/dist/public/assets/_B-iOtMg6.js.br +0 -0
- package/dist/public/assets/{_CJgqLdsx.js → _B0FhzjB2.js} +1 -1
- package/dist/public/assets/_B0FhzjB2.js.br +0 -0
- package/dist/public/assets/{_C1-Nli75.js → _B26gPL08.js} +1 -1
- package/dist/public/assets/_B26gPL08.js.br +0 -0
- package/dist/public/assets/{_BA-MNdjL.js → _B2DHvTZR.js} +1 -1
- package/dist/public/assets/{_vX9d6g5Y.js → _B3Z1kRpD.js} +1 -1
- package/dist/public/assets/_B3Z1kRpD.js.br +0 -0
- package/dist/public/assets/{_BfQeZPXW.js → _B3sH8Usv.js} +1 -1
- package/dist/public/assets/_B3sH8Usv.js.br +0 -0
- package/dist/public/assets/_B42hLH2K.js +1 -0
- package/dist/public/assets/{_CY_Z-kV5.js → _B4hn3NNW.js} +1 -1
- package/dist/public/assets/_B4hn3NNW.js.br +0 -0
- package/dist/public/assets/{_DK-MOyi_.js → _B5NleRC6.js} +1 -1
- package/dist/public/assets/_B5NleRC6.js.br +0 -0
- package/dist/public/assets/_B5fRGxPQ.js +1 -0
- package/dist/public/assets/_B5fRGxPQ.js.br +0 -0
- package/dist/public/assets/_B65yR5Ej.js +1 -0
- package/dist/public/assets/_B6Sh9WEH.js +1 -0
- package/dist/public/assets/{_C7bHTlG1.js → _B6VtVybz.js} +1 -1
- package/dist/public/assets/_B6VtVybz.js.br +0 -0
- package/dist/public/assets/_B7rJ4n9b.js +1 -0
- package/dist/public/assets/_B8M-AD29.js +1 -0
- package/dist/public/assets/{_BQEpu56f.js → _B8joFpf1.js} +1 -1
- package/dist/public/assets/_B8joFpf1.js.br +0 -0
- package/dist/public/assets/_B9nA-Uh1.js +1 -0
- package/dist/public/assets/_B9nA-Uh1.js.br +0 -0
- package/dist/public/assets/_BA6X_Aj6.js +1 -0
- package/dist/public/assets/_BBFJV2Bx.js +1 -0
- package/dist/public/assets/_BCW5GFMW.js +1 -0
- package/dist/public/assets/{_TynjiShF.js → _BD1SQU0V.js} +1 -1
- package/dist/public/assets/_BD1SQU0V.js.br +0 -0
- package/dist/public/assets/_BEpd9Y1R.js +1 -0
- package/dist/public/assets/_BEy7R4W_.js +1 -0
- package/dist/public/assets/_BFGJOHQb.js +1 -0
- package/dist/public/assets/{_BiY8chB-.js → _BI45WgW9.js} +1 -1
- package/dist/public/assets/_BI45WgW9.js.br +0 -0
- package/dist/public/assets/_BIKvQKWe.js +1 -0
- package/dist/public/assets/_BIPnL2aI.js +1 -0
- package/dist/public/assets/{_Dj5RDA5P.js → _BIUaA4Nl.js} +1 -1
- package/dist/public/assets/_BIUaA4Nl.js.br +0 -0
- package/dist/public/assets/{_Ch-UiovX.js → _BJpBnuvv.js} +1 -1
- package/dist/public/assets/_BJpBnuvv.js.br +0 -0
- package/dist/public/assets/{_0KruTMn9.js → _BLeLpnYL.js} +1 -1
- package/dist/public/assets/_BLeLpnYL.js.br +0 -0
- package/dist/public/assets/_BMb5ANTv.js +1 -0
- package/dist/public/assets/{_ChPy2IX4.js → _BSRsPQTe.js} +1 -1
- package/dist/public/assets/_BSRsPQTe.js.br +0 -0
- package/dist/public/assets/_BVuerXin.js +6 -0
- package/dist/public/assets/_BVuerXin.js.br +0 -0
- package/dist/public/assets/_BWV8aSlZ.js +1 -0
- package/dist/public/assets/{_Q5s6o5H4.js → _BXHggM8M.js} +1 -1
- package/dist/public/assets/_BXHggM8M.js.br +0 -0
- package/dist/public/assets/{_D8uBvHXU.js → _BXPUZfKX.js} +1 -1
- package/dist/public/assets/_BXPUZfKX.js.br +0 -0
- package/dist/public/assets/_BYebhygn.js +1 -0
- package/dist/public/assets/_BZgCxd-U.js +1 -0
- package/dist/public/assets/_BZgCxd-U.js.br +0 -0
- package/dist/public/assets/_B_W51WxU.js +1 -0
- package/dist/public/assets/_B_jFFNyT.js +1 -0
- package/dist/public/assets/_Ba9OQzPV.js +1 -0
- package/dist/public/assets/_Ba9OQzPV.js.br +0 -0
- package/dist/public/assets/_BayiY7GU.js +1 -0
- package/dist/public/assets/_BcDMeS82.js +1 -0
- package/dist/public/assets/_BdD1sZp_.js +1 -0
- package/dist/public/assets/_Bg_WwlL2.js +1 -0
- package/dist/public/assets/_BhHzv4g0.js +1 -0
- package/dist/public/assets/_BjEinMEe.js +1 -0
- package/dist/public/assets/_BjEinMEe.js.br +0 -0
- package/dist/public/assets/{_DPiemRX1.js → _BkGAUdMd.js} +1 -1
- package/dist/public/assets/_BkGAUdMd.js.br +0 -0
- package/dist/public/assets/{_FwFz43m8.js → _BkHLXMjq.js} +1 -1
- package/dist/public/assets/_BkHLXMjq.js.br +0 -0
- package/dist/public/assets/_BmSWsZvV.js +1 -0
- package/dist/public/assets/{_D_GeNCls.js → _Bn6y2_ex.js} +1 -1
- package/dist/public/assets/_Bn6y2_ex.js.br +0 -0
- package/dist/public/assets/_Bp2gqUaf.js +1 -0
- package/dist/public/assets/_Bs6oYKkD.js +1 -0
- package/dist/public/assets/{_CYhJ6ae-.js → _Bs_MPTBZ.js} +1 -1
- package/dist/public/assets/_Bs_MPTBZ.js.br +0 -0
- package/dist/public/assets/_Bt13j1ev.js +1 -0
- package/dist/public/assets/{_D-pUpBL1.js → _Bt4cxzaP.js} +1 -1
- package/dist/public/assets/_BwlnYt-t.js +1 -0
- package/dist/public/assets/_Bx9aUXTG.js +1 -0
- package/dist/public/assets/{_DUdEYxV0.js → _BxKDE6Ct.js} +1 -1
- package/dist/public/assets/_BxKDE6Ct.js.br +0 -0
- package/dist/public/assets/_BymFDqKj.js +1 -0
- package/dist/public/assets/{_i4iteLF8.js → _C-z8Ntse.js} +1 -1
- package/dist/public/assets/_C-z8Ntse.js.br +0 -0
- package/dist/public/assets/_C0XUbqWe.js +1 -0
- package/dist/public/assets/_C1upDwBv.js +1 -0
- package/dist/public/assets/_C3f4huqn.js +1 -0
- package/dist/public/assets/{_BHyWcuOR.js → _C46o3wQ8.js} +1 -1
- package/dist/public/assets/_C46o3wQ8.js.br +0 -0
- package/dist/public/assets/_C4_3qKLX.js +1 -0
- package/dist/public/assets/_C7tG4xwv.js +1 -0
- package/dist/public/assets/_C8LciIOa.js +1 -0
- package/dist/public/assets/{_zcAaK79d.js → _C9k00otG.js} +1 -1
- package/dist/public/assets/_C9k00otG.js.br +0 -0
- package/dist/public/assets/_CBG92pZO.js +1 -0
- package/dist/public/assets/_CBfI2lSr.js +1 -0
- package/dist/public/assets/{_BPNSknLT.js → _CFKwHn62.js} +1 -1
- package/dist/public/assets/_CFKwHn62.js.br +0 -0
- package/dist/public/assets/_CHDvRNgn.js +1 -0
- package/dist/public/assets/{_DVLNzEkW.js → _CIDjLk1A.js} +1 -1
- package/dist/public/assets/_CIDjLk1A.js.br +0 -0
- package/dist/public/assets/{_3fvr5bU1.js → _CLV83hY7.js} +1 -1
- package/dist/public/assets/_CLV83hY7.js.br +0 -0
- package/dist/public/assets/_CO8ZosDU.js +1 -0
- package/dist/public/assets/{_D4CkNo0r.js → _CPqT91JX.js} +1 -1
- package/dist/public/assets/_CPqT91JX.js.br +0 -0
- package/dist/public/assets/_CRZ03hrO.js +1 -0
- package/dist/public/assets/_CUKvJRmi.js +1 -0
- package/dist/public/assets/_CU_FKEsy.js +1 -0
- package/dist/public/assets/{_Do6b-nfX.js → _CUxBk_RE.js} +1 -1
- package/dist/public/assets/_CUxBk_RE.js.br +0 -0
- package/dist/public/assets/_CW_vyZfo.js +1 -0
- package/dist/public/assets/{_BOBYB-cj.js → _CX5VOdNU.js} +1 -1
- package/dist/public/assets/_CX5VOdNU.js.br +0 -0
- package/dist/public/assets/{_C5c3o9N3.js → _CYcgwayF.js} +1 -1
- package/dist/public/assets/_CYcgwayF.js.br +0 -0
- package/dist/public/assets/{_BXcMBVCY.js → _CZsqsL_m.js} +1 -1
- package/dist/public/assets/_CZsqsL_m.js.br +0 -0
- package/dist/public/assets/_C_a8QggH.js +1 -0
- package/dist/public/assets/_C_ymFHNL.js +1 -0
- package/dist/public/assets/_CaU4irFc.js +1 -0
- package/dist/public/assets/_Cb3fSi2R.js +1 -0
- package/dist/public/assets/{_DOKecL0e.js → _CcINcTUt.js} +1 -1
- package/dist/public/assets/_CcINcTUt.js.br +0 -0
- package/dist/public/assets/{_BTh4v5Tr.js → _CcflXOTj.js} +1 -1
- package/dist/public/assets/_CcflXOTj.js.br +0 -0
- package/dist/public/assets/{_DbLQjG4R.js → _Cfts4mFJ.js} +1 -1
- package/dist/public/assets/_Cfts4mFJ.js.br +0 -0
- package/dist/public/assets/{_v3HPnNBs.js → _ClHeQc6g.js} +1 -1
- package/dist/public/assets/_ClHeQc6g.js.br +0 -0
- package/dist/public/assets/_CnSlVcEh.js +1 -0
- package/dist/public/assets/_Co71-HWR.js +1 -0
- package/dist/public/assets/_CpEeHKyF.js +1 -0
- package/dist/public/assets/{_CNUs2Gqk.js → _CpVeIwQ4.js} +1 -1
- package/dist/public/assets/_CpVeIwQ4.js.br +0 -0
- package/dist/public/assets/{_Cc_GUPR4.js → _Cq4DpL3R.js} +1 -1
- package/dist/public/assets/_Cq4DpL3R.js.br +0 -0
- package/dist/public/assets/_CvxsvMFa.js +1 -0
- package/dist/public/assets/{_DorQTaAa.js → _Cwdn40Q2.js} +1 -1
- package/dist/public/assets/_Cwdn40Q2.js.br +0 -0
- package/dist/public/assets/_CzN0wC_5.js +16 -0
- package/dist/public/assets/_CzN0wC_5.js.br +0 -0
- package/dist/public/assets/_D3ieGLoq.js +1 -0
- package/dist/public/assets/_D4wF26fk.js +1 -0
- package/dist/public/assets/_D9a9nY1Q.js +1 -0
- package/dist/public/assets/{_CIWiehYG.js → _DB7_Yora.js} +1 -1
- package/dist/public/assets/_DB7_Yora.js.br +0 -0
- package/dist/public/assets/{_6klEiBhY.js → _DDWIDZyP.js} +1 -1
- package/dist/public/assets/_DDWIDZyP.js.br +0 -0
- package/dist/public/assets/{_Cwtn28hL.js → _DG3L8-RO.js} +1 -1
- package/dist/public/assets/_DG3L8-RO.js.br +0 -0
- package/dist/public/assets/{_BxS3xvmE.js → _DGRgLaG-.js} +1 -1
- package/dist/public/assets/_DGRgLaG-.js.br +0 -0
- package/dist/public/assets/{_pEUCjhqm.js → _DG_QOtsx.js} +1 -1
- package/dist/public/assets/_DG_QOtsx.js.br +0 -0
- package/dist/public/assets/{_BwSXxzqy.js → _DHYIZWev.js} +11 -11
- package/dist/public/assets/_DHYIZWev.js.br +0 -0
- package/dist/public/assets/{_BoTzWlXR.js → _DJwY_zBh.js} +1 -1
- package/dist/public/assets/_DJwY_zBh.js.br +0 -0
- package/dist/public/assets/{_C9jR1P3s.js → _DKlB-yMq.js} +1 -1
- package/dist/public/assets/_DKlB-yMq.js.br +0 -0
- package/dist/public/assets/{_DYqx8g78.js → _DMCVOg7x.js} +1 -1
- package/dist/public/assets/_DMCVOg7x.js.br +0 -0
- package/dist/public/assets/_DMXnrdYy.js +1 -0
- package/dist/public/assets/_DMXnrdYy.js.br +0 -0
- package/dist/public/assets/{_Di78jTI-.js → _DNrRZhO7.js} +1 -1
- package/dist/public/assets/_DNrRZhO7.js.br +0 -0
- package/dist/public/assets/_DPdb5l-Z.js +1 -0
- package/dist/public/assets/{_Depr5Jps.js → _DRpsUHP5.js} +1 -1
- package/dist/public/assets/_DRpsUHP5.js.br +0 -0
- package/dist/public/assets/{_BHgwN0LC.js → _DUH5o_iN.js} +1 -1
- package/dist/public/assets/_DUH5o_iN.js.br +0 -0
- package/dist/public/assets/{_-ycNE92Z.js → _DUmYv8Kf.js} +1 -1
- package/dist/public/assets/_DUmYv8Kf.js.br +0 -0
- package/dist/public/assets/{_CPbClwhX.js → _DXvsvUmJ.js} +1 -1
- package/dist/public/assets/_DXvsvUmJ.js.br +0 -0
- package/dist/public/assets/{_DqGOYRpi.js → _DYxQeog7.js} +1 -1
- package/dist/public/assets/_DYxQeog7.js.br +0 -0
- package/dist/public/assets/_DZIDdpeW.js +1 -0
- package/dist/public/assets/{_CCONYsJT.js → _DZqoQxTm.js} +1 -1
- package/dist/public/assets/_DZqoQxTm.js.br +0 -0
- package/dist/public/assets/_D_4RJnk0.js +2 -0
- package/dist/public/assets/_D_4RJnk0.js.br +0 -0
- package/dist/public/assets/_DclJXqwW.js +1 -0
- package/dist/public/assets/_Debmjz1c.js +1 -0
- package/dist/public/assets/_DeiCZCO_.js +1 -0
- package/dist/public/assets/{_yp48NYOW.js → _Df-N1G_n.js} +1 -1
- package/dist/public/assets/_Df-N1G_n.js.br +0 -0
- package/dist/public/assets/_Df_3rEok.js +86 -0
- package/dist/public/assets/_Df_3rEok.js.br +0 -0
- package/dist/public/assets/{_DO_4_u2Q.js → _Dh9434oc.js} +1 -1
- package/dist/public/assets/{_Dhn3A3KJ.js → _DjYscMjF.js} +1 -1
- package/dist/public/assets/_DjYscMjF.js.br +0 -0
- package/dist/public/assets/{_cyorvuL1.js → _Dku55Ypt.js} +1 -1
- package/dist/public/assets/_Dku55Ypt.js.br +0 -0
- package/dist/public/assets/_Dm8TVkBX.js +1 -0
- package/dist/public/assets/_DnUBW0Qq.js +1 -0
- package/dist/public/assets/_DoOPrRIy.js +1 -0
- package/dist/public/assets/_DqJvxlYV.js +1 -0
- package/dist/public/assets/_Drle66GA.js +1 -0
- package/dist/public/assets/_DtrvrAfl.js +1 -0
- package/dist/public/assets/{_B5JxE4Sx.js → _DwTaEsY5.js} +1 -1
- package/dist/public/assets/_DwTaEsY5.js.br +0 -0
- package/dist/public/assets/_Dypj9l-z.js +1 -0
- package/dist/public/assets/_DyvwMfCp.js +1 -0
- package/dist/public/assets/{_OpbuiQ7h.js → _GK8r-gEu.js} +1 -1
- package/dist/public/assets/_GK8r-gEu.js.br +0 -0
- package/dist/public/assets/{_BqWlTTxo.js → _HpxvfbM2.js} +1 -1
- package/dist/public/assets/_HpxvfbM2.js.br +0 -0
- package/dist/public/assets/{_CIrZGxEf.js → _RudCGuBM.js} +1 -1
- package/dist/public/assets/_RudCGuBM.js.br +0 -0
- package/dist/public/assets/_UbfI3k4y.js +1 -0
- package/dist/public/assets/{_A-jpjc8j.js → _WOU8TCkO.js} +1 -1
- package/dist/public/assets/_WOU8TCkO.js.br +0 -0
- package/dist/public/assets/{_C-lB_p3U.js → _XWw1j8vS.js} +1 -1
- package/dist/public/assets/_XWw1j8vS.js.br +0 -0
- package/dist/public/assets/{_BCB8LQS3.js → _YDyNvOET.js} +1 -1
- package/dist/public/assets/_YDyNvOET.js.br +0 -0
- package/dist/public/assets/{_DzlXwaiG.js → _f8D86HXZ.js} +1 -1
- package/dist/public/assets/_f8D86HXZ.js.br +0 -0
- package/dist/public/assets/{_BUW_V5kN.js → _hbXd8Ogo.js} +1 -1
- package/dist/public/assets/_hbXd8Ogo.js.br +0 -0
- package/dist/public/assets/{_CrlNjDih.js → _i6YkSowH.js} +1 -1
- package/dist/public/assets/_i6YkSowH.js.br +0 -0
- package/dist/public/assets/_k1ciacDf.js +1 -0
- package/dist/public/assets/_k6nXIP-i.js +1 -0
- package/dist/public/assets/_keX09TNx.js +1 -0
- package/dist/public/assets/{_Dwe1TUjY.js → _l9xpLTP_.js} +1 -1
- package/dist/public/assets/_l9xpLTP_.js.br +0 -0
- package/dist/public/assets/_n9Rb26YX.js +1 -0
- package/dist/public/assets/{_4_sKOYsy.js → _o8mJsMHw.js} +1 -1
- package/dist/public/assets/_o8mJsMHw.js.br +0 -0
- package/dist/public/assets/{_Ca2DTddL.js → _oVsjszGq.js} +1 -1
- package/dist/public/assets/_oVsjszGq.js.br +0 -0
- package/dist/public/assets/_pM8W420Q.js +1 -0
- package/dist/public/assets/{_C449plW0.js → _rv9KtZHz.js} +1 -1
- package/dist/public/assets/_rv9KtZHz.js.br +0 -0
- package/dist/public/assets/{_B19mS3yM.js → _sSKEak2x.js} +1 -1
- package/dist/public/assets/_sSKEak2x.js.br +0 -0
- package/dist/public/assets/_tJgkkxOD.js +1 -0
- package/dist/public/assets/_tJgkkxOD.js.br +0 -0
- package/dist/public/assets/_uP3LGOtV.js +1 -0
- package/dist/public/assets/{_BT7DMail.js → _vG7bXn-C.js} +1 -1
- package/dist/public/assets/_vG7bXn-C.js.br +0 -0
- package/dist/public/assets/{_BTWfPOi-.js → _vHqiFYsh.js} +1 -1
- package/dist/public/assets/_vHqiFYsh.js.br +0 -0
- package/dist/public/assets/_vXJ7nP0d.js +1 -0
- package/dist/public/assets/{_Dks8YY2K.js → _w-MAJku6.js} +1 -1
- package/dist/public/assets/_wvhU__5f.js +1 -0
- package/dist/public/assets/_xFMpRp_e.js +1 -0
- package/dist/public/assets/_yXimF5vw.js +1 -0
- package/dist/public/assets/files-view-BennlUmP.js +2 -0
- package/dist/public/assets/manage-workspace-CaESLJdc.js +2 -0
- package/dist/public/assets/new-BNH4m99d.js +1 -0
- package/dist/public/assets/new-workspace-CwiZjHNn.js +2 -0
- package/dist/public/assets/review-view-BdbMyVt7.js +2 -0
- package/dist/public/assets/settings-BNH4m99d.js +1 -0
- package/dist/public/assets/settings-page-CU3aC70Q.js +2 -0
- package/dist/public/assets/styles-ctr-Sxsj.css +1 -0
- package/dist/public/assets/styles-ctr-Sxsj.css.br +0 -0
- package/dist/public/assets/w-BNH4m99d.js +1 -0
- package/dist/public/assets/w._-BNH4m99d.js +1 -0
- package/dist/public/assets/w._-CLYxMMR4.js +1 -0
- package/dist/public/assets/w._-_w8eUYMy.js +1 -0
- package/dist/public/sw.js +11 -4
- package/dist/public/sw.js.br +0 -0
- package/lib/ports/url.d.mts +20 -0
- package/lib/ports/url.mjs +80 -0
- package/package.json +1 -1
- package/dist/_CLoLdV87.js +0 -2
- package/dist/_DPpY3UqO.js +0 -167
- package/dist/public/assets/_-ycNE92Z.js.br +0 -0
- package/dist/public/assets/_0KruTMn9.js.br +0 -0
- package/dist/public/assets/_0NH5yJMx.js +0 -1
- package/dist/public/assets/_1CAp-NbR.js +0 -1
- package/dist/public/assets/_3fvr5bU1.js.br +0 -0
- package/dist/public/assets/_4Dkmi0BI.js +0 -1
- package/dist/public/assets/_4_sKOYsy.js.br +0 -0
- package/dist/public/assets/_6klEiBhY.js.br +0 -0
- package/dist/public/assets/_7_64OpLh.js +0 -1
- package/dist/public/assets/_7p-zxUs0.js +0 -1
- package/dist/public/assets/_8RAv3gFP.js +0 -1
- package/dist/public/assets/_9PDxaMA9.js +0 -1
- package/dist/public/assets/_9PDxaMA9.js.br +0 -0
- package/dist/public/assets/_9mbDrbe7.js +0 -1
- package/dist/public/assets/_A-jpjc8j.js.br +0 -0
- package/dist/public/assets/_B0JwTeu6.js +0 -1
- package/dist/public/assets/_B19mS3yM.js.br +0 -0
- package/dist/public/assets/_B1Sfrnda.js +0 -1
- package/dist/public/assets/_B3i0wS_I.js +0 -1
- package/dist/public/assets/_B5JxE4Sx.js.br +0 -0
- package/dist/public/assets/_B9RLcC8I.js +0 -1
- package/dist/public/assets/_BCB8LQS3.js.br +0 -0
- package/dist/public/assets/_BE7UYyYb.js +0 -1
- package/dist/public/assets/_BHgwN0LC.js.br +0 -0
- package/dist/public/assets/_BHyWcuOR.js.br +0 -0
- package/dist/public/assets/_BIpUDgQH.js +0 -16
- package/dist/public/assets/_BIpUDgQH.js.br +0 -0
- package/dist/public/assets/_BMlgaRlM.js +0 -1
- package/dist/public/assets/_BOBYB-cj.js.br +0 -0
- package/dist/public/assets/_BPNSknLT.js.br +0 -0
- package/dist/public/assets/_BQEpu56f.js.br +0 -0
- package/dist/public/assets/_BT7DMail.js.br +0 -0
- package/dist/public/assets/_BTJHQNIz.js +0 -1
- package/dist/public/assets/_BTWfPOi-.js.br +0 -0
- package/dist/public/assets/_BTh4v5Tr.js.br +0 -0
- package/dist/public/assets/_BUW_V5kN.js.br +0 -0
- package/dist/public/assets/_BXcMBVCY.js.br +0 -0
- package/dist/public/assets/_B_MtJKnj.js +0 -1
- package/dist/public/assets/_Bay3D1io.js +0 -1
- package/dist/public/assets/_BfQeZPXW.js.br +0 -0
- package/dist/public/assets/_BgKjJWz_.js +0 -1
- package/dist/public/assets/_BiY8chB-.js.br +0 -0
- package/dist/public/assets/_Bk5THQZb.js +0 -1
- package/dist/public/assets/_BmeQRnXS.js +0 -1
- package/dist/public/assets/_BoEcMQmX.js.br +0 -0
- package/dist/public/assets/_BoTzWlXR.js.br +0 -0
- package/dist/public/assets/_BqWlTTxo.js.br +0 -0
- package/dist/public/assets/_BuMTHEPk.js +0 -1
- package/dist/public/assets/_BuMTHEPk.js.br +0 -0
- package/dist/public/assets/_BubhcEjq.js +0 -1
- package/dist/public/assets/_BwSXxzqy.js.br +0 -0
- package/dist/public/assets/_BxS3xvmE.js.br +0 -0
- package/dist/public/assets/_ByvA6zJz.js +0 -1
- package/dist/public/assets/_Bz2Sejcy.js +0 -1
- package/dist/public/assets/_C-lB_p3U.js.br +0 -0
- package/dist/public/assets/_C1-Nli75.js.br +0 -0
- package/dist/public/assets/_C3mw4T_r.js +0 -1
- package/dist/public/assets/_C449plW0.js.br +0 -0
- package/dist/public/assets/_C5c3o9N3.js.br +0 -0
- package/dist/public/assets/_C7bHTlG1.js.br +0 -0
- package/dist/public/assets/_C8mt6nRC.js +0 -1
- package/dist/public/assets/_C9jR1P3s.js.br +0 -0
- package/dist/public/assets/_CCONYsJT.js.br +0 -0
- package/dist/public/assets/_CCZAROAW.js +0 -1
- package/dist/public/assets/_CCZAROAW.js.br +0 -0
- package/dist/public/assets/_CG3s9pE5.js +0 -1
- package/dist/public/assets/_CIWiehYG.js.br +0 -0
- package/dist/public/assets/_CIrZGxEf.js.br +0 -0
- package/dist/public/assets/_CIurl9jC.js +0 -1
- package/dist/public/assets/_CJgqLdsx.js.br +0 -0
- package/dist/public/assets/_CMbVHIgP.js +0 -1
- package/dist/public/assets/_CNUs2Gqk.js.br +0 -0
- package/dist/public/assets/_CPbClwhX.js.br +0 -0
- package/dist/public/assets/_CQUlxerJ.js +0 -1
- package/dist/public/assets/_CTDYlYHi.js +0 -1
- package/dist/public/assets/_CXVkXsw1.js.br +0 -0
- package/dist/public/assets/_CY5EBxZ6.js +0 -1
- package/dist/public/assets/_CYQ4srZb.js.br +0 -0
- package/dist/public/assets/_CY_Z-kV5.js.br +0 -0
- package/dist/public/assets/_CYhJ6ae-.js.br +0 -0
- package/dist/public/assets/_CZbVK94d.js +0 -1
- package/dist/public/assets/_C_A97h_2.js +0 -1
- package/dist/public/assets/_C_A97h_2.js.br +0 -0
- package/dist/public/assets/_C_Y5Dwzy.js +0 -1
- package/dist/public/assets/_Ca2DTddL.js.br +0 -0
- package/dist/public/assets/_Cc2nu3_5.js +0 -1
- package/dist/public/assets/_Cc_GUPR4.js.br +0 -0
- package/dist/public/assets/_CgFUs0bE.js +0 -1
- package/dist/public/assets/_Ch-UiovX.js.br +0 -0
- package/dist/public/assets/_ChDp0-FJ.js +0 -1
- package/dist/public/assets/_ChPy2IX4.js.br +0 -0
- package/dist/public/assets/_Chsgo2e1.js +0 -1
- package/dist/public/assets/_CjECwrWB.js +0 -1
- package/dist/public/assets/_CmW74dH7.js +0 -1
- package/dist/public/assets/_CmhAUlqu.js +0 -1
- package/dist/public/assets/_CrlNjDih.js.br +0 -0
- package/dist/public/assets/_CvzTEaQq.js +0 -1
- package/dist/public/assets/_Cw-dmwPJ.js +0 -86
- package/dist/public/assets/_Cw-dmwPJ.js.br +0 -0
- package/dist/public/assets/_Cwtn28hL.js.br +0 -0
- package/dist/public/assets/_CxHuLHdz.js +0 -1
- package/dist/public/assets/_CxgPm_xy.js.br +0 -0
- package/dist/public/assets/_D-0pUYXq.js.br +0 -0
- package/dist/public/assets/_D-rV-z_T.js +0 -1
- package/dist/public/assets/_D4CkNo0r.js.br +0 -0
- package/dist/public/assets/_D4fP_viq.js +0 -1
- package/dist/public/assets/_D570Sd6p.js +0 -1
- package/dist/public/assets/_D6Gudpw8.js +0 -1
- package/dist/public/assets/_D8ZTP1ck.js +0 -1
- package/dist/public/assets/_D8uBvHXU.js.br +0 -0
- package/dist/public/assets/_D8xGEGlm.js +0 -1
- package/dist/public/assets/_D9GZHKow.js +0 -1
- package/dist/public/assets/_DE0eZjad.js +0 -1
- package/dist/public/assets/_DElIEG9n.js +0 -1
- package/dist/public/assets/_DF0n9xzn.js +0 -2
- package/dist/public/assets/_DF0n9xzn.js.br +0 -0
- package/dist/public/assets/_DFX_tXcw.js +0 -1
- package/dist/public/assets/_DJ2gfhU_.js +0 -1
- package/dist/public/assets/_DK-MOyi_.js.br +0 -0
- package/dist/public/assets/_DOKecL0e.js.br +0 -0
- package/dist/public/assets/_DPXXIOLX.js +0 -1
- package/dist/public/assets/_DPb3t58B.js +0 -1
- package/dist/public/assets/_DPiemRX1.js.br +0 -0
- package/dist/public/assets/_DPpbgqBC.js +0 -1
- package/dist/public/assets/_DRVSLjxA.js +0 -1
- package/dist/public/assets/_DTHWnu6M.js +0 -1
- package/dist/public/assets/_DUdEYxV0.js.br +0 -0
- package/dist/public/assets/_DVLNzEkW.js.br +0 -0
- package/dist/public/assets/_DWpx2Uof.js +0 -1
- package/dist/public/assets/_DXYEUAmC.js +0 -1
- package/dist/public/assets/_DYTVambU.js +0 -1
- package/dist/public/assets/_DYqx8g78.js.br +0 -0
- package/dist/public/assets/_DZanHI_X.js.br +0 -0
- package/dist/public/assets/_D_GeNCls.js.br +0 -0
- package/dist/public/assets/_DbLQjG4R.js.br +0 -0
- package/dist/public/assets/_DbmusecK.js +0 -1
- package/dist/public/assets/_DbmusecK.js.br +0 -0
- package/dist/public/assets/_DemN-D5U.js +0 -1
- package/dist/public/assets/_Depr5Jps.js.br +0 -0
- package/dist/public/assets/_DhJfHI4f.js +0 -1
- package/dist/public/assets/_Dhn3A3KJ.js.br +0 -0
- package/dist/public/assets/_Di78jTI-.js.br +0 -0
- package/dist/public/assets/_DiBTtPlu.js +0 -1
- package/dist/public/assets/_Dj5RDA5P.js.br +0 -0
- package/dist/public/assets/_DkjKARSS.js +0 -1
- package/dist/public/assets/_Do6b-nfX.js.br +0 -0
- package/dist/public/assets/_DorQTaAa.js.br +0 -0
- package/dist/public/assets/_DpxVmwni.js +0 -1
- package/dist/public/assets/_DqGOYRpi.js.br +0 -0
- package/dist/public/assets/_DsbxQ1i8.js +0 -1
- package/dist/public/assets/_Dt_P7K1V.js +0 -6
- package/dist/public/assets/_Dt_P7K1V.js.br +0 -0
- package/dist/public/assets/_Dwe1TUjY.js.br +0 -0
- package/dist/public/assets/_DyROQKS8.js +0 -1
- package/dist/public/assets/_DzEUPsq0.js +0 -1
- package/dist/public/assets/_DzlXwaiG.js.br +0 -0
- package/dist/public/assets/_FwFz43m8.js.br +0 -0
- package/dist/public/assets/_OpbuiQ7h.js.br +0 -0
- package/dist/public/assets/_Q5s6o5H4.js.br +0 -0
- package/dist/public/assets/_Quh6tl1u.js.br +0 -0
- package/dist/public/assets/_Rh99sjDe.js +0 -1
- package/dist/public/assets/_SEE1XtID.js +0 -1
- package/dist/public/assets/_SZjr1kid.js +0 -1
- package/dist/public/assets/_T7rMqM5P.js +0 -1
- package/dist/public/assets/_TynjiShF.js.br +0 -0
- package/dist/public/assets/_UENAEFcY.js +0 -1
- package/dist/public/assets/_UwTOb1gP.js +0 -1
- package/dist/public/assets/_WrxtT1Ok.js +0 -1
- package/dist/public/assets/_WrxtT1Ok.js.br +0 -0
- package/dist/public/assets/_bcvRRCkB.js +0 -1
- package/dist/public/assets/_cyorvuL1.js.br +0 -0
- package/dist/public/assets/_gi--JOq8.js +0 -1
- package/dist/public/assets/_i4iteLF8.js.br +0 -0
- package/dist/public/assets/_i7vMugBN.js +0 -1
- package/dist/public/assets/_j7jPRUEQ.js +0 -2
- package/dist/public/assets/_j7jPRUEQ.js.br +0 -0
- package/dist/public/assets/_pEUCjhqm.js.br +0 -0
- package/dist/public/assets/_qkJuNTl-.js +0 -1
- package/dist/public/assets/_uuZJDLIV.js +0 -1
- package/dist/public/assets/_v3HPnNBs.js.br +0 -0
- package/dist/public/assets/_vX9d6g5Y.js.br +0 -0
- package/dist/public/assets/_vhysM7gk.js +0 -1
- package/dist/public/assets/_vjwPQHk_.js +0 -1
- package/dist/public/assets/_yp48NYOW.js.br +0 -0
- package/dist/public/assets/_zcAaK79d.js.br +0 -0
- package/dist/public/assets/_zwPrEKxN.js +0 -1
- package/dist/public/assets/_zwPrEKxN.js.br +0 -0
- package/dist/public/assets/files-view-CzRAql9-.js +0 -2
- package/dist/public/assets/manage-workspace-C-c1R4pP.js +0 -2
- package/dist/public/assets/new-DWfNwssk.js +0 -1
- package/dist/public/assets/new-workspace-B8XAfkIH.js +0 -2
- package/dist/public/assets/review-view-DivHZNBf.js +0 -2
- package/dist/public/assets/settings-DWfNwssk.js +0 -1
- package/dist/public/assets/settings-page-BN9Hj1ui.js +0 -2
- package/dist/public/assets/styles-NmwxQh5L.css +0 -1
- package/dist/public/assets/styles-NmwxQh5L.css.br +0 -0
- package/dist/public/assets/w-DWfNwssk.js +0 -1
- package/dist/public/assets/w._-C9dj1aZ0.js +0 -1
- package/dist/public/assets/w._-D7_D4HlM.js +0 -1
- package/dist/public/assets/w._-DWfNwssk.js +0 -1
package/bin/cli/host.mjs
ADDED
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
// `work host` and `work gh login`: the GitHub hosts work clones from and
|
|
2
|
+
// signs in to, as Settings → GitHub lists, adds and signs them in.
|
|
3
|
+
import { follow } from "./_progress.mjs";
|
|
4
|
+
|
|
5
|
+
function printHosts(hosts) {
|
|
6
|
+
if (!hosts.length) return console.log("no GitHub hosts");
|
|
7
|
+
const w = Math.max(4, ...hosts.map((h) => h.host.length));
|
|
8
|
+
for (const h of hosts) {
|
|
9
|
+
const state = h.unreachable
|
|
10
|
+
? `can't be reached${h.error ? `: ${h.error}` : ""}`
|
|
11
|
+
: h.authed
|
|
12
|
+
? `signed in${h.user ? ` as ${h.user}` : ""}`
|
|
13
|
+
: `not signed in (work gh login ${h.host})${h.error ? `: ${h.error}` : ""}`;
|
|
14
|
+
console.log(`${h.host.padEnd(w)} ${state}`);
|
|
15
|
+
for (const s of h.sso || [])
|
|
16
|
+
console.log(`${"".padEnd(w)} ${s.org} needs its SAML SSO authorized`);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/** A host name as gh and Settings take it: no scheme, no path. */
|
|
21
|
+
function hostName(ctx, text) {
|
|
22
|
+
const h = String(text || "")
|
|
23
|
+
.trim()
|
|
24
|
+
.replace(/^https?:\/\//i, "")
|
|
25
|
+
.replace(/\/.*$/, "")
|
|
26
|
+
.toLowerCase();
|
|
27
|
+
if (!/^[a-z0-9.-]+\.[a-z0-9.-]+(?::\d+)?$/.test(h))
|
|
28
|
+
ctx.die(`not a host name: ${text} (e.g. github.example.com)`);
|
|
29
|
+
return h;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** The device flow's two things the user acts on, from gh's own lines:
|
|
33
|
+
* the one-time code and the page to enter it on. */
|
|
34
|
+
function deviceFlow(line, seen) {
|
|
35
|
+
const code = /\b([A-Z0-9]{4}-[A-Z0-9]{4})\b/.exec(line)?.[1];
|
|
36
|
+
const url = /(https?:\/\/\S+\/login\/device\S*)/.exec(line)?.[1];
|
|
37
|
+
if (code) seen.code ??= code;
|
|
38
|
+
if (url) seen.url ??= url;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/** @type {Array<{name: string, summary: string, help: string, run: (ctx: any) => Promise<void>}>} */
|
|
42
|
+
export const commands = [
|
|
43
|
+
{
|
|
44
|
+
name: "host",
|
|
45
|
+
summary: "GitHub hosts: list | add | rm",
|
|
46
|
+
help: `work host [list] [--refresh]
|
|
47
|
+
The GitHub hosts work clones from (github.com and any Enterprise hosts),
|
|
48
|
+
whether each is signed in and as whom, or can't be reached (an Enterprise
|
|
49
|
+
host off its VPN). --refresh asks gh again rather than the app's last
|
|
50
|
+
reading (a sign-in made outside work).
|
|
51
|
+
work host add <host>
|
|
52
|
+
Add a GitHub Enterprise host, as Settings → GitHub does: its repos join
|
|
53
|
+
the picker once signed in (work gh login <host>).
|
|
54
|
+
work host rm <host>
|
|
55
|
+
Forget an Enterprise host (gh stays signed in to it).`,
|
|
56
|
+
async run(ctx) {
|
|
57
|
+
const [verb = "list", arg] = ctx.parse();
|
|
58
|
+
if (verb === "list") {
|
|
59
|
+
const setup = await ctx.api.get(
|
|
60
|
+
`/api/setup${ctx.has("--refresh") ? "?refresh" : ""}`,
|
|
61
|
+
);
|
|
62
|
+
return ctx.out(setup.github || [], printHosts);
|
|
63
|
+
}
|
|
64
|
+
if (verb === "add" || verb === "rm" || verb === "remove") {
|
|
65
|
+
if (!arg) ctx.die(`name the host: work host ${verb} <host>`);
|
|
66
|
+
const host = hostName(ctx, arg);
|
|
67
|
+
const setup = await ctx.api.post("/api/github/hosts", {
|
|
68
|
+
host,
|
|
69
|
+
remove: verb !== "add" || undefined,
|
|
70
|
+
});
|
|
71
|
+
const row = (setup.github || []).find((h) => h.host === host);
|
|
72
|
+
return ctx.out(row ?? { host, removed: verb !== "add" }, () =>
|
|
73
|
+
console.log(
|
|
74
|
+
verb === "add"
|
|
75
|
+
? `added ${host}${row && !row.authed && !row.unreachable ? ` — sign in: work gh login ${host}` : row?.unreachable ? " — it can't be reached now (VPN?)" : ""}`
|
|
76
|
+
: `forgot ${host}`,
|
|
77
|
+
),
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
ctx.die(`no host verb ${verb} (list, add, rm)`);
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
name: "gh login",
|
|
85
|
+
summary: "sign in to a GitHub host (device code)",
|
|
86
|
+
help: `work gh login [host]
|
|
87
|
+
Sign in to github.com, or an Enterprise host (added first if it is not
|
|
88
|
+
yet), with gh's device flow, as Settings → GitHub does: prints the
|
|
89
|
+
one-time code and the page to enter it on as soon as gh has them, then
|
|
90
|
+
waits until the sign-in is done in the browser. gh's own lines go to
|
|
91
|
+
stderr.`,
|
|
92
|
+
async run(ctx) {
|
|
93
|
+
const [arg] = ctx.parse();
|
|
94
|
+
const host = arg ? hostName(ctx, arg) : "github.com";
|
|
95
|
+
// Asked afresh: the app's last reading may predate a sign-out.
|
|
96
|
+
const before = await ctx.api.get("/api/setup?refresh");
|
|
97
|
+
const known = (before.github || []).find((h) => h.host === host);
|
|
98
|
+
if (known?.authed) {
|
|
99
|
+
ctx.out(known, () =>
|
|
100
|
+
console.log(
|
|
101
|
+
`already signed in to ${host}${known.user ? ` as ${known.user}` : ""}`,
|
|
102
|
+
),
|
|
103
|
+
);
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
if (!known && host !== "github.com") {
|
|
107
|
+
process.stderr.write(` adding ${host}\n`);
|
|
108
|
+
await ctx.api.post("/api/github/hosts", { host });
|
|
109
|
+
}
|
|
110
|
+
const seen = {};
|
|
111
|
+
let told = false;
|
|
112
|
+
const setup = await follow(
|
|
113
|
+
ctx,
|
|
114
|
+
`setup:${host}`,
|
|
115
|
+
() =>
|
|
116
|
+
ctx.api.post(`/api/setup/${encodeURIComponent(host)}`, {
|
|
117
|
+
action: "auth",
|
|
118
|
+
}),
|
|
119
|
+
(line) => {
|
|
120
|
+
deviceFlow(line, seen);
|
|
121
|
+
// Said once both are known, while this still waits on the user:
|
|
122
|
+
// on stdout, or stderr under --json, where stdout is the JSON.
|
|
123
|
+
if (!told && seen.code && seen.url) {
|
|
124
|
+
told = true;
|
|
125
|
+
const say = `open ${seen.url} and enter the code ${seen.code}`;
|
|
126
|
+
if (ctx.json) process.stderr.write(`${say}\n`);
|
|
127
|
+
else console.log(say);
|
|
128
|
+
}
|
|
129
|
+
},
|
|
130
|
+
);
|
|
131
|
+
const row = (setup.github || []).find((h) => h.host === host);
|
|
132
|
+
ctx.out(row ?? { host }, () =>
|
|
133
|
+
console.log(
|
|
134
|
+
row?.authed
|
|
135
|
+
? `signed in to ${host}${row.user ? ` as ${row.user}` : ""}`
|
|
136
|
+
: `not signed in to ${host}${row?.error ? `: ${row.error}` : ""}`,
|
|
137
|
+
),
|
|
138
|
+
);
|
|
139
|
+
if (!row?.authed) process.exitCode = 1;
|
|
140
|
+
},
|
|
141
|
+
},
|
|
142
|
+
];
|
package/bin/cli/lsp.mjs
ADDED
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
// `work lsp`: the language servers behind Review and Files' types and
|
|
2
|
+
// errors, as Settings → Languages switches and installs them.
|
|
3
|
+
import { follow } from "./_progress.mjs";
|
|
4
|
+
|
|
5
|
+
function printList(list) {
|
|
6
|
+
console.log(
|
|
7
|
+
`language servers: ${list.on ? "on" : "off (work lsp on turns them on)"}`,
|
|
8
|
+
);
|
|
9
|
+
const rows = list.servers || [];
|
|
10
|
+
const w = Math.max(2, ...rows.map((s) => s.id.length));
|
|
11
|
+
for (const s of rows) {
|
|
12
|
+
const state = [
|
|
13
|
+
s.installed
|
|
14
|
+
? `installed${s.version ? ` ${s.version}` : ""}`
|
|
15
|
+
: "not installed",
|
|
16
|
+
s.enabled ? null : "off",
|
|
17
|
+
s.running ? `${s.running} running` : null,
|
|
18
|
+
]
|
|
19
|
+
.filter(Boolean)
|
|
20
|
+
.join(", ");
|
|
21
|
+
const exts = [...(s.extensions || []), ...(s.names || [])].join(" ");
|
|
22
|
+
console.log(
|
|
23
|
+
`${s.id.padEnd(w)} ${s.label} — ${state}${exts ? ` (${exts})` : ""}`,
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** A server the list has, or the command dies naming where to look. */
|
|
29
|
+
function server(ctx, list, id) {
|
|
30
|
+
if (!id) ctx.die("name the server: an id from work lsp list");
|
|
31
|
+
const hit = (list.servers || []).find((s) => s.id === id);
|
|
32
|
+
if (!hit) ctx.die(`no language server ${id} (see: work lsp list)`);
|
|
33
|
+
return hit;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** @type {Array<{name: string, summary: string, help: string, run: (ctx: any) => Promise<void>}>} */
|
|
37
|
+
export const commands = [
|
|
38
|
+
{
|
|
39
|
+
name: "lsp",
|
|
40
|
+
summary: "language servers: list | on | off | install | enable | disable",
|
|
41
|
+
help: `work lsp [list]
|
|
42
|
+
Whether language servers are on, and each one work knows: installed or
|
|
43
|
+
not, switched off or not, running copies, the file types it serves.
|
|
44
|
+
work lsp on|off
|
|
45
|
+
Language servers for the whole app (off until switched on: nothing
|
|
46
|
+
starts or installs while off).
|
|
47
|
+
work lsp install|update|remove <id>
|
|
48
|
+
Install, update or uninstall one server, as Settings does; the
|
|
49
|
+
installer's output goes to stderr.
|
|
50
|
+
work lsp enable|disable <id>
|
|
51
|
+
Use or skip one installed server (disabling stops its running copies).`,
|
|
52
|
+
async run(ctx) {
|
|
53
|
+
const [verb = "list", id] = ctx.parse();
|
|
54
|
+
if (verb === "list") {
|
|
55
|
+
const list = await ctx.api.get("/api/lsp");
|
|
56
|
+
return ctx.out(list, printList);
|
|
57
|
+
}
|
|
58
|
+
if (verb === "on" || verb === "off") {
|
|
59
|
+
await ctx.api.post("/api/prefs", {
|
|
60
|
+
key: "lsp",
|
|
61
|
+
value: verb === "on" ? "1" : null,
|
|
62
|
+
});
|
|
63
|
+
return ctx.out({ on: verb === "on" }, () =>
|
|
64
|
+
console.log(`language servers ${verb}`),
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
if (verb === "install" || verb === "update" || verb === "remove") {
|
|
68
|
+
const list = await ctx.api.get("/api/lsp");
|
|
69
|
+
const s = server(ctx, list, id);
|
|
70
|
+
if (verb === "install" && s.installed) {
|
|
71
|
+
ctx.out({ id: s.id, installed: true }, () =>
|
|
72
|
+
console.log(
|
|
73
|
+
`${s.label} is already installed (work lsp update ${s.id} to update it)`,
|
|
74
|
+
),
|
|
75
|
+
);
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
if (verb !== "remove" && !s.installable)
|
|
79
|
+
ctx.die(
|
|
80
|
+
`${s.label} installs outside work${s.hint ? `: ${s.hint}` : ""}`,
|
|
81
|
+
);
|
|
82
|
+
const after = await follow(ctx, `lsp:${s.id}`, () =>
|
|
83
|
+
ctx.api.post(`/api/lsp/${encodeURIComponent(s.id)}`, {
|
|
84
|
+
action: verb,
|
|
85
|
+
}),
|
|
86
|
+
);
|
|
87
|
+
const now = (after.servers || []).find((x) => x.id === s.id);
|
|
88
|
+
if (!list.on && verb !== "remove")
|
|
89
|
+
ctx.warn("language servers are off: work lsp on to use it");
|
|
90
|
+
return ctx.out(now ?? { id: s.id }, () =>
|
|
91
|
+
console.log(
|
|
92
|
+
`${verb === "remove" ? "removed" : verb === "update" ? "updated" : "installed"} ${s.label}${now?.version ? ` ${now.version}` : ""}`,
|
|
93
|
+
),
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
if (verb === "enable" || verb === "disable") {
|
|
97
|
+
const list = await ctx.api.get("/api/lsp");
|
|
98
|
+
const s = server(ctx, list, id);
|
|
99
|
+
await ctx.api.post("/api/prefs", {
|
|
100
|
+
key: "lsp-off",
|
|
101
|
+
change: { op: verb === "disable" ? "add" : "remove", item: s.id },
|
|
102
|
+
});
|
|
103
|
+
// Switched off, its copies stop now rather than at their idle end.
|
|
104
|
+
if (verb === "disable" && s.running)
|
|
105
|
+
await ctx.api.post(`/api/lsp/${encodeURIComponent(s.id)}`, {
|
|
106
|
+
action: "stop",
|
|
107
|
+
});
|
|
108
|
+
return ctx.out({ id: s.id, enabled: verb === "enable" }, () =>
|
|
109
|
+
console.log(`${s.label} ${verb}d`),
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
ctx.die(
|
|
113
|
+
`no lsp verb ${verb} (list, on, off, install, update, remove, enable, disable)`,
|
|
114
|
+
);
|
|
115
|
+
},
|
|
116
|
+
},
|
|
117
|
+
];
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { resolveTarget, unresolved } from "./_target.mjs";
|
|
2
|
+
|
|
3
|
+
/** `work notify`: an agent tells the user something — a toast on every
|
|
4
|
+
* open page, and a notification on their devices when the session's
|
|
5
|
+
* terminal is not on screen (Settings → Notifications, "An agent sends you
|
|
6
|
+
* a message"), past a few in ten minutes only shown. */
|
|
7
|
+
export const commands = [
|
|
8
|
+
{
|
|
9
|
+
name: "notify",
|
|
10
|
+
summary: "tell the user something: a toast in the app and a push",
|
|
11
|
+
help: `work notify <message…> [--link <target>] [--title <t>] [--no-push] [--json]
|
|
12
|
+
Tell the user something: a toast on every open page of work and, unless
|
|
13
|
+
--no-push or the session's terminal is on screen, a notification on the
|
|
14
|
+
devices that have them on. From inside a session it is that session's;
|
|
15
|
+
elsewhere, the workspace's (the cwd's, or --workspace <id|name>).
|
|
16
|
+
--link what the toast's Open (and a tap on the notification) opens: an
|
|
17
|
+
app page (/w/<id>/review?section=…), a URL (a dev server), or a
|
|
18
|
+
path in the workspace (src/a.ts:12, .share/shots/), which opens
|
|
19
|
+
in Files
|
|
20
|
+
--title the notification's title in place of the session's name
|
|
21
|
+
At most one a second; past a few pushes in ten minutes the app still
|
|
22
|
+
shows it, only without a notification (the command says so).`,
|
|
23
|
+
async run(ctx) {
|
|
24
|
+
const words = ctx.parse(["--link", "--title", "--workspace"]);
|
|
25
|
+
const message = words.join(" ").trim();
|
|
26
|
+
if (!message)
|
|
27
|
+
ctx.die(
|
|
28
|
+
"say something: work notify <message…> (see: work help notify)",
|
|
29
|
+
);
|
|
30
|
+
const { ws } = await ctx.resolveWorkspace(ctx.flag("--workspace"));
|
|
31
|
+
const raw = ctx.flag("--link");
|
|
32
|
+
const target = raw ? await resolveTarget(ctx, ws, raw) : null;
|
|
33
|
+
if (raw && !target) ctx.die(unresolved(raw));
|
|
34
|
+
const res = await ctx.api.post(`/api/workspaces/${ws.id}/notices`, {
|
|
35
|
+
message,
|
|
36
|
+
...(ctx.flag("--title") && { title: ctx.flag("--title") }),
|
|
37
|
+
...(target && { link: target.link }),
|
|
38
|
+
...(process.env.WORK_SESSION_ID && {
|
|
39
|
+
session: process.env.WORK_SESSION_ID,
|
|
40
|
+
}),
|
|
41
|
+
push: !ctx.has("--no-push"),
|
|
42
|
+
});
|
|
43
|
+
ctx.out(res, ({ push }) => {
|
|
44
|
+
console.log(
|
|
45
|
+
push.state === "sent"
|
|
46
|
+
? `shown in the app, and pushed to ${push.devices} device${push.devices === 1 ? "" : "s"}`
|
|
47
|
+
: `shown in the app; not pushed: ${push.reason}`,
|
|
48
|
+
);
|
|
49
|
+
if (target) console.log(`link: ${target.link}`);
|
|
50
|
+
});
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
];
|
package/bin/cli/open.mjs
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { resolveTarget, unresolved } from "./_target.mjs";
|
|
2
|
+
|
|
3
|
+
/** `work open`: an agent offers the user something to look at — a toast
|
|
4
|
+
* on every open page with an Open button; never a navigation of its own
|
|
5
|
+
* (the user may be typing), and no push (`work notify --link` is that). */
|
|
6
|
+
export const commands = [
|
|
7
|
+
{
|
|
8
|
+
name: "open",
|
|
9
|
+
summary: "offer the user a file, folder or page to open in the app",
|
|
10
|
+
help: `work open <target> [--message <text>] [--json]
|
|
11
|
+
Offer the user something to look at: a toast on every open page of work
|
|
12
|
+
with an Open button (never a navigation by itself, and no notification:
|
|
13
|
+
work notify --link is that). Prints the link it offered.
|
|
14
|
+
<target> a path in the workspace — a file (src/a.ts, src/a.ts:12) or a
|
|
15
|
+
folder (.share/shots/), opened in Files; an app page
|
|
16
|
+
(/w/<id>/review?section=<repo>@<topic>); or a URL (a dev server)
|
|
17
|
+
--message the toast's text in place of "Look at <target>"`,
|
|
18
|
+
async run(ctx) {
|
|
19
|
+
const [raw] = ctx.parse(["--message", "--workspace"]);
|
|
20
|
+
if (!raw) ctx.die("open what? work open <target> (see: work help open)");
|
|
21
|
+
const { ws } = await ctx.resolveWorkspace(ctx.flag("--workspace"));
|
|
22
|
+
const target = await resolveTarget(ctx, ws, raw);
|
|
23
|
+
if (!target) ctx.die(unresolved(raw));
|
|
24
|
+
const res = await ctx.api.post(`/api/workspaces/${ws.id}/notices`, {
|
|
25
|
+
message: ctx.flag("--message") || `Look at ${target.label}`,
|
|
26
|
+
link: target.link,
|
|
27
|
+
...(process.env.WORK_SESSION_ID && {
|
|
28
|
+
session: process.env.WORK_SESSION_ID,
|
|
29
|
+
}),
|
|
30
|
+
push: false,
|
|
31
|
+
});
|
|
32
|
+
ctx.out({ ...target, notice: res.notice }, () =>
|
|
33
|
+
console.log(`offered in the app: ${target.link}`),
|
|
34
|
+
);
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
];
|
package/bin/cli/repo.mjs
ADDED
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
// `work repo add|rm`: a workspace's repos from a terminal, as Manage's
|
|
2
|
+
// Repos list adds and removes them.
|
|
3
|
+
import { follow, opId } from "./_progress.mjs";
|
|
4
|
+
import { repoName } from "./_repo.mjs";
|
|
5
|
+
|
|
6
|
+
/** The workspace `--workspace` names, else the one this shell is in. */
|
|
7
|
+
async function target(ctx) {
|
|
8
|
+
const arg = ctx.args.includes("--workspace")
|
|
9
|
+
? ctx.flag("--workspace")
|
|
10
|
+
: undefined;
|
|
11
|
+
return (await ctx.resolveWorkspace(arg)).ws;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/** @type {Array<{name: string, summary: string, help: string, run: (ctx: any) => Promise<void>}>} */
|
|
15
|
+
export const commands = [
|
|
16
|
+
{
|
|
17
|
+
name: "repo add",
|
|
18
|
+
summary: "add a repo to a workspace (clones it the first time)",
|
|
19
|
+
help: `work repo add <repo> [--base <branch>] [--fork] [--workspace <name|id>]
|
|
20
|
+
Add a repo to a workspace, as Manage does: a worktree of it on the
|
|
21
|
+
workspace's branch, from its default branch unless --base names another.
|
|
22
|
+
<repo> is owner/name, host/owner/name (GitHub Enterprise) or a clone URL;
|
|
23
|
+
--fork forks it to your account first and clones the fork. The workspace
|
|
24
|
+
is the one this shell runs in unless --workspace names another. Clone
|
|
25
|
+
progress goes to stderr. Prints where it landed (--json: the workspace).`,
|
|
26
|
+
async run(ctx) {
|
|
27
|
+
const [spec] = ctx.parse(["--base", "--workspace"]);
|
|
28
|
+
if (!spec) ctx.die("name the repo: work repo add <owner/name|clone URL>");
|
|
29
|
+
const fullName = repoName(spec);
|
|
30
|
+
if (!fullName)
|
|
31
|
+
ctx.die(
|
|
32
|
+
`not a repo: ${spec} (owner/name, host/owner/name or a clone URL)`,
|
|
33
|
+
);
|
|
34
|
+
const ws = await target(ctx);
|
|
35
|
+
const baseBranch = ctx.args.includes("--base")
|
|
36
|
+
? ctx.flag("--base")
|
|
37
|
+
: undefined;
|
|
38
|
+
const op = opId();
|
|
39
|
+
const before = new Set(ws.repos.map((r) => r.worktree));
|
|
40
|
+
const updated = await follow(ctx, op, () =>
|
|
41
|
+
ctx.api.post(`/api/workspaces/${encodeURIComponent(ws.id)}/repos`, {
|
|
42
|
+
fullName,
|
|
43
|
+
baseBranch,
|
|
44
|
+
fork: ctx.has("--fork") || undefined,
|
|
45
|
+
opId: op,
|
|
46
|
+
}),
|
|
47
|
+
);
|
|
48
|
+
const added =
|
|
49
|
+
updated.repos.find((r) => !before.has(r.worktree)) ??
|
|
50
|
+
updated.repos.find((r) => r.full_name === fullName);
|
|
51
|
+
ctx.out(updated, () => {
|
|
52
|
+
if (!added) return console.log(`added ${fullName} to ${ws.name}`);
|
|
53
|
+
console.log(
|
|
54
|
+
`added ${added.full_name} to ${ws.name} as ${added.worktree}/ (base ${added.base_branch})`,
|
|
55
|
+
);
|
|
56
|
+
console.log(` path: ${ws.display_path || ws.path}/${added.worktree}`);
|
|
57
|
+
});
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
name: "repo rm",
|
|
62
|
+
aliases: ["repo remove"],
|
|
63
|
+
summary: "remove a repo from a workspace (--yes)",
|
|
64
|
+
help: `work repo rm <worktree|owner/name> [--workspace <name|id>] --yes
|
|
65
|
+
Remove a repo from a workspace, as Manage does: its folder there is
|
|
66
|
+
deleted, with the workspace's local branches of it and its review
|
|
67
|
+
comments — uncommitted and unpushed work in it is lost; pushed branches
|
|
68
|
+
and their PRs stay on GitHub. Asks for --yes.`,
|
|
69
|
+
async run(ctx) {
|
|
70
|
+
const [spec] = ctx.parse(["--workspace"]);
|
|
71
|
+
if (!spec) ctx.die("name the repo: work repo rm <worktree> --yes");
|
|
72
|
+
const ws = await target(ctx);
|
|
73
|
+
const name = repoName(spec);
|
|
74
|
+
const repo = ws.repos.find(
|
|
75
|
+
(r) =>
|
|
76
|
+
r.worktree === spec.replace(/\/$/, "") ||
|
|
77
|
+
r.full_name === spec ||
|
|
78
|
+
(name && r.full_name === name),
|
|
79
|
+
);
|
|
80
|
+
if (!repo)
|
|
81
|
+
ctx.die(
|
|
82
|
+
`${ws.name} has no repo ${spec} (it has: ${ws.repos.map((r) => `${r.worktree}/`).join(", ") || "none"})`,
|
|
83
|
+
);
|
|
84
|
+
if (!ctx.yes)
|
|
85
|
+
ctx.die(
|
|
86
|
+
`removing ${repo.worktree}/ deletes ${ws.display_path || ws.path}/${repo.worktree} and ${ws.name}'s local branches of ${repo.full_name}; uncommitted and unpushed work there is lost. Pass --yes to go ahead`,
|
|
87
|
+
);
|
|
88
|
+
await follow(ctx, ws.id, () =>
|
|
89
|
+
ctx.api.del(
|
|
90
|
+
`/api/workspaces/${encodeURIComponent(ws.id)}/repos/${encodeURIComponent(repo.worktree)}`,
|
|
91
|
+
),
|
|
92
|
+
);
|
|
93
|
+
ctx.out({ workspace: ws.id, removed: repo.worktree }, () =>
|
|
94
|
+
console.log(`removed ${repo.worktree}/ from ${ws.name}`),
|
|
95
|
+
);
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
];
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
// `work session`: which session this is (an agent's own pane, by
|
|
2
|
+
// WORK_SESSION_ID), its name in the session list, and the workspace's
|
|
3
|
+
// other sessions — starting one, sending it a prompt, closing it.
|
|
4
|
+
|
|
5
|
+
/** More sessions than this in one workspace is an agent starting them in
|
|
6
|
+
* a loop, not a plan: past it, `new` wants --force. */
|
|
7
|
+
const SESSION_CAP = 8;
|
|
8
|
+
|
|
9
|
+
/** The session a command means: --session's, else this pane's own. */
|
|
10
|
+
function sessionId(ctx) {
|
|
11
|
+
const id = ctx.flag("--session") || process.env.WORK_SESSION_ID;
|
|
12
|
+
if (!id)
|
|
13
|
+
ctx.die(
|
|
14
|
+
"not in a work session (WORK_SESSION_ID is unset): pass --session <id>",
|
|
15
|
+
);
|
|
16
|
+
return id;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/** The workspace's sessions with their state, this pane's marked. */
|
|
20
|
+
async function sessionsOf(ctx, wsId) {
|
|
21
|
+
const me = process.env.WORK_SESSION_ID;
|
|
22
|
+
const list = await ctx.api.get(`/api/workspaces/${wsId}/sessions`);
|
|
23
|
+
return list.map((s) => ({
|
|
24
|
+
id: s.id,
|
|
25
|
+
agent: s.agent,
|
|
26
|
+
title: s.title || null,
|
|
27
|
+
phase: s.state?.phase || (s.state?.alive ? "idle" : "off"),
|
|
28
|
+
self: s.id === me,
|
|
29
|
+
}));
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function sessionLine(ctx, s) {
|
|
33
|
+
return `${ctx.pad(s.id, 9)} ${ctx.pad(s.agent, 10)} ${ctx.pad(s.phase, 8)} ${s.title || ""}${s.self ? " (this session)" : ""}`;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export const commands = [
|
|
37
|
+
{
|
|
38
|
+
name: "session",
|
|
39
|
+
summary: "this session and the workspace's others: title, new, send, kill",
|
|
40
|
+
help: `work session [--json]
|
|
41
|
+
This session (WORK_SESSION_ID): its id, agent, name, state, and the
|
|
42
|
+
workspace it is in (id, name, path) — what a link names (/w/<id>/…).
|
|
43
|
+
work session list [id|name] [--json]
|
|
44
|
+
The workspace's sessions, this one marked.
|
|
45
|
+
work session title "<name>" [--session <id>]
|
|
46
|
+
Name a session in the session list (empty clears it).
|
|
47
|
+
work session new [--agent <id>] [--title "<name>"] [--prompt "<text>"] [--workspace <id|name>] [--force]
|
|
48
|
+
Start a session (the default agent unless --agent; "shell" for a
|
|
49
|
+
terminal), name it, and hand it a first prompt. Past ${SESSION_CAP} sessions
|
|
50
|
+
in the workspace it wants --force.
|
|
51
|
+
work session send <id> "<text>"
|
|
52
|
+
Type text into a session and press Enter, as the review's Send does.
|
|
53
|
+
work session kill <id> --yes
|
|
54
|
+
Close a session and the process in it.`,
|
|
55
|
+
async run(ctx) {
|
|
56
|
+
const [verb, ...rest] = ctx.parse([
|
|
57
|
+
"--agent",
|
|
58
|
+
"--title",
|
|
59
|
+
"--prompt",
|
|
60
|
+
"--workspace",
|
|
61
|
+
"--session",
|
|
62
|
+
]);
|
|
63
|
+
switch (verb) {
|
|
64
|
+
case undefined: {
|
|
65
|
+
const id = sessionId(ctx);
|
|
66
|
+
const { ws } = await ctx.resolveWorkspace();
|
|
67
|
+
const me = (await sessionsOf(ctx, ws.id)).find((s) => s.id === id);
|
|
68
|
+
if (!me) ctx.die(`no session ${id} in ${ws.name}`);
|
|
69
|
+
const out = {
|
|
70
|
+
...me,
|
|
71
|
+
workspace: {
|
|
72
|
+
id: ws.id,
|
|
73
|
+
name: ws.name,
|
|
74
|
+
path: ws.path,
|
|
75
|
+
branch: ws.branch,
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
return ctx.out(out, (s) => {
|
|
79
|
+
console.log(
|
|
80
|
+
`${s.id} ${s.agent} ${s.phase}${s.title ? ` "${s.title}"` : ""}`,
|
|
81
|
+
);
|
|
82
|
+
console.log(
|
|
83
|
+
`workspace ${s.workspace.name} (${s.workspace.id}) ${s.workspace.path}`,
|
|
84
|
+
);
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
case "list": {
|
|
88
|
+
const { ws } = await ctx.resolveWorkspace(rest[0]);
|
|
89
|
+
const list = await sessionsOf(ctx, ws.id);
|
|
90
|
+
return ctx.out(list, (l) => {
|
|
91
|
+
if (!l.length) return console.log("no sessions");
|
|
92
|
+
for (const s of l) console.log(sessionLine(ctx, s));
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
case "title": {
|
|
96
|
+
const id = sessionId(ctx);
|
|
97
|
+
const title = rest.join(" ");
|
|
98
|
+
await ctx.api.patch(`/api/sessions/${id}`, { title });
|
|
99
|
+
return ctx.out({ id, title: title || null }, () =>
|
|
100
|
+
console.log(
|
|
101
|
+
title ? `named ${id} "${title}"` : `cleared ${id}'s name`,
|
|
102
|
+
),
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
case "new": {
|
|
106
|
+
const { ws } = await ctx.resolveWorkspace(ctx.flag("--workspace"));
|
|
107
|
+
const existing = await sessionsOf(ctx, ws.id);
|
|
108
|
+
if (existing.length >= SESSION_CAP && !ctx.has("--force"))
|
|
109
|
+
ctx.die(
|
|
110
|
+
`${ws.name} already has ${existing.length} sessions: pass --force to start another`,
|
|
111
|
+
);
|
|
112
|
+
const agent = ctx.flag("--agent");
|
|
113
|
+
const created = await ctx.api.post(
|
|
114
|
+
`/api/workspaces/${ws.id}/sessions`,
|
|
115
|
+
agent ? { agent } : {},
|
|
116
|
+
);
|
|
117
|
+
const title = ctx.flag("--title");
|
|
118
|
+
if (title)
|
|
119
|
+
await ctx.api.patch(`/api/sessions/${created.id}`, { title });
|
|
120
|
+
const prompt = ctx.flag("--prompt");
|
|
121
|
+
// Sent, the session starts (detached) with it as its first
|
|
122
|
+
// prompt; otherwise it starts when someone opens it.
|
|
123
|
+
if (prompt)
|
|
124
|
+
await ctx.api.post(`/api/sessions/${created.id}/send`, {
|
|
125
|
+
text: prompt,
|
|
126
|
+
});
|
|
127
|
+
const out = {
|
|
128
|
+
id: created.id,
|
|
129
|
+
agent: created.agent,
|
|
130
|
+
title: title || null,
|
|
131
|
+
workspace: ws.id,
|
|
132
|
+
prompted: !!prompt,
|
|
133
|
+
href: `/w/${ws.id}?s=${created.id}`,
|
|
134
|
+
};
|
|
135
|
+
return ctx.out(out, (s) =>
|
|
136
|
+
console.log(
|
|
137
|
+
`started ${s.id} (${s.agent})${s.prompted ? " with its prompt" : ""}: [${s.title || s.agent}](${s.href})`,
|
|
138
|
+
),
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
case "send": {
|
|
142
|
+
const [id, ...words] = rest;
|
|
143
|
+
const text = words.join(" ");
|
|
144
|
+
if (!id || !text) ctx.die('usage: work session send <id> "<text>"');
|
|
145
|
+
await ctx.api.post(`/api/sessions/${id}/send`, { text });
|
|
146
|
+
return ctx.out({ id, sent: true }, () =>
|
|
147
|
+
console.log(`sent to ${id}`),
|
|
148
|
+
);
|
|
149
|
+
}
|
|
150
|
+
case "kill": {
|
|
151
|
+
const [id] = rest;
|
|
152
|
+
if (!id) ctx.die("usage: work session kill <id> --yes");
|
|
153
|
+
if (!ctx.yes)
|
|
154
|
+
ctx.die(
|
|
155
|
+
`closing ${id} ends the process in it${id === process.env.WORK_SESSION_ID ? " — this session, the one running this command" : ""}: pass --yes`,
|
|
156
|
+
);
|
|
157
|
+
await ctx.api.del(`/api/sessions/${id}`);
|
|
158
|
+
return ctx.out({ id, killed: true }, () =>
|
|
159
|
+
console.log(`closed ${id}`),
|
|
160
|
+
);
|
|
161
|
+
}
|
|
162
|
+
default:
|
|
163
|
+
ctx.die(`no \`work session ${verb}\` (see: work help session)`);
|
|
164
|
+
}
|
|
165
|
+
},
|
|
166
|
+
},
|
|
167
|
+
];
|