@dylanpiercey/work 0.1.0 → 0.1.1
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 +17 -5
- package/bin/work.mjs +208 -9
- package/dist/_D1C-XIqT.js +168 -0
- package/dist/{_Bq7to522.js → _Dzz52ZtI.js} +188 -49
- package/dist/_HbAW5Cbt.js +2 -0
- package/dist/index.mjs +1118 -1151
- package/dist/public/assets/{_Cz5BPBG8.js → _-5UNb9-C.js} +1 -1
- package/dist/public/assets/_-5UNb9-C.js.br +0 -0
- package/dist/public/assets/_06rtP_SB.js +1 -0
- package/dist/public/assets/_14yhXek7.js +1 -0
- package/dist/public/assets/_14yhXek7.js.br +0 -0
- package/dist/public/assets/_1JXC9nFp.js +1 -0
- package/dist/public/assets/_1JXC9nFp.js.br +0 -0
- package/dist/public/assets/_1Yit_Y5R.js +1 -0
- package/dist/public/assets/_1ZPfR2B8.js +6 -0
- package/dist/public/assets/_1ZPfR2B8.js.br +0 -0
- package/dist/public/assets/{_D2un443j.js → _1xOByopP.js} +1 -1
- package/dist/public/assets/_1xOByopP.js.br +0 -0
- package/dist/public/assets/{_C_37_B6u.js → _3aBl7SEn.js} +1 -1
- package/dist/public/assets/_3aBl7SEn.js.br +0 -0
- package/dist/public/assets/_5aMLV2Vy.js +1 -0
- package/dist/public/assets/{_BwP07uVS.js → _7YrArFMB.js} +1 -1
- package/dist/public/assets/_7YrArFMB.js.br +0 -0
- package/dist/public/assets/{_ClldMY37.js → _B1-W0Sn2.js} +1 -1
- package/dist/public/assets/_B1-W0Sn2.js.br +0 -0
- package/dist/public/assets/{_8dvK2NDJ.js → _B1D0PIz3.js} +1 -1
- package/dist/public/assets/_B1D0PIz3.js.br +0 -0
- package/dist/public/assets/_B1agoKUa.js +1 -0
- package/dist/public/assets/_B3NfNm8M.js +1591 -0
- package/dist/public/assets/_B3NfNm8M.js.br +0 -0
- package/dist/public/assets/{_BDa-iwuj.js → _B7VYILLZ.js} +1 -1
- package/dist/public/assets/_B7VYILLZ.js.br +0 -0
- package/dist/public/assets/_B7sPBy0J.js +1 -0
- package/dist/public/assets/_B81p6DSw.js +1 -0
- package/dist/public/assets/_BAkSKCkz.js +1 -0
- package/dist/public/assets/{_B582D2rg.js → _BDUjU8Ev.js} +1 -1
- package/dist/public/assets/{_Bv3qNE1b.js → _BHU5aikZ.js} +1 -1
- package/dist/public/assets/_BHZPTv1U.js +1 -0
- package/dist/public/assets/{_DxEm-Gwj.js → _BKHtiW96.js} +1 -1
- package/dist/public/assets/_BKHtiW96.js.br +0 -0
- package/dist/public/assets/{_C0_s45qg.js → _BKIx7IZP.js} +1 -1
- package/dist/public/assets/_BKIx7IZP.js.br +0 -0
- package/dist/public/assets/{_Bp8-V8yl.js → _BLfzQY-3.js} +1 -1
- package/dist/public/assets/_BLfzQY-3.js.br +0 -0
- package/dist/public/assets/{_ch_yXAap.js → _BPSTqkJn.js} +1 -1
- package/dist/public/assets/_BPSTqkJn.js.br +0 -0
- package/dist/public/assets/_BQZOimBB.js +1 -0
- package/dist/public/assets/{_DfI982PI.js → _BRQ6iQ5p.js} +1 -1
- package/dist/public/assets/_BRQ6iQ5p.js.br +0 -0
- package/dist/public/assets/_BRVURc4u.js +1 -0
- package/dist/public/assets/{_CTINBWaG.js → _BSFJEuJX.js} +1 -1
- package/dist/public/assets/_BSFJEuJX.js.br +0 -0
- package/dist/public/assets/{_CMSBfO6u.js → _BSWN-v3P.js} +1 -1
- package/dist/public/assets/_BSWN-v3P.js.br +0 -0
- package/dist/public/assets/_BTVAQr2c.js +1 -0
- package/dist/public/assets/_BUD1pBC0.js +1 -0
- package/dist/public/assets/_BVGzCczb.js +1 -0
- package/dist/public/assets/{_j2tDSMvo.js → _BVQosHjY.js} +1 -1
- package/dist/public/assets/_BVQosHjY.js.br +0 -0
- package/dist/public/assets/{_9kX9D09B.js → _B_0C2_RO.js} +1 -1
- package/dist/public/assets/_B_0C2_RO.js.br +0 -0
- package/dist/public/assets/_BaA31ms5.js +1 -0
- package/dist/public/assets/_BgCHJGlO.js +1 -0
- package/dist/public/assets/_BhpRLDbL.js +1 -0
- package/dist/public/assets/_BhpRLDbL.js.br +0 -0
- package/dist/public/assets/_BkKcjMAC.js +1 -0
- package/dist/public/assets/{_xyw_DS5P.js → _BkcPY2j0.js} +1 -1
- package/dist/public/assets/_BkcPY2j0.js.br +0 -0
- package/dist/public/assets/_BlTVd_3d.js +1 -0
- package/dist/public/assets/_BlqlLmEY.js +1 -0
- package/dist/public/assets/_BoNfxc9P.js +1 -0
- package/dist/public/assets/_BqswW9B9.js +1 -0
- package/dist/public/assets/_BricqzsO.js +1 -0
- package/dist/public/assets/_BrreckIa.js +1 -0
- package/dist/public/assets/{_BpoeUr5j.js → _BsJZPHmz.js} +1 -1
- package/dist/public/assets/_BsJZPHmz.js.br +0 -0
- package/dist/public/assets/_BtRYwaBb.js +1 -0
- package/dist/public/assets/{_B7GwDeKK.js → _BtZ2AatF.js} +1 -1
- package/dist/public/assets/_BvPBKjRP.js +1 -0
- package/dist/public/assets/_BvPBKjRP.js.br +0 -0
- package/dist/public/assets/_ByrrjMU9.js +1 -0
- package/dist/public/assets/{_CpjSCB1I.js → _BzGHediB.js} +1 -1
- package/dist/public/assets/_BzGHediB.js.br +0 -0
- package/dist/public/assets/_BzvTKm92.js +1 -0
- package/dist/public/assets/{_D1uRW1qz.js → _C-EkQeP_.js} +1 -1
- package/dist/public/assets/_C-EkQeP_.js.br +0 -0
- package/dist/public/assets/{_Bv3e3rg8.js → _C0Ib7MZF.js} +1 -1
- package/dist/public/assets/_C0Ib7MZF.js.br +0 -0
- package/dist/public/assets/_C2p1Z5Lf.js +86 -0
- package/dist/public/assets/_C2p1Z5Lf.js.br +0 -0
- package/dist/public/assets/_C3iiOlxd.js +1 -0
- package/dist/public/assets/{_De7P3jUH.js → _C81nSl09.js} +1 -1
- package/dist/public/assets/_C81nSl09.js.br +0 -0
- package/dist/public/assets/{_BvXp6HpX.js → _C8bqYk4J.js} +1 -1
- package/dist/public/assets/_C8bqYk4J.js.br +0 -0
- package/dist/public/assets/_C98JZr09.js +1 -0
- package/dist/public/assets/_C98JZr09.js.br +0 -0
- package/dist/public/assets/_CB4VkmGZ.js +1 -0
- package/dist/public/assets/{_bcsuBP7T.js → _CCVkYcN5.js} +1 -1
- package/dist/public/assets/_CCVkYcN5.js.br +0 -0
- package/dist/public/assets/{_DC-78WeM.js → _CDY0RpYX.js} +1 -1
- package/dist/public/assets/_CDY0RpYX.js.br +0 -0
- package/dist/public/assets/_CE2GEqMx.js +1 -0
- package/dist/public/assets/_CE2GEqMx.js.br +0 -0
- package/dist/public/assets/{_BbbOvNRH.js → _CFUREq1M.js} +1 -1
- package/dist/public/assets/_CFUREq1M.js.br +0 -0
- package/dist/public/assets/_CHdh6bII.js +1 -0
- package/dist/public/assets/{_wcshV0sZ.js → _CHdpLB95.js} +1 -1
- package/dist/public/assets/_CHdpLB95.js.br +0 -0
- package/dist/public/assets/{_D4q8XSMI.js → _CKLGAGKJ.js} +1 -1
- package/dist/public/assets/_CKLGAGKJ.js.br +0 -0
- package/dist/public/assets/_CMRt2lyQ.js +1 -0
- package/dist/public/assets/_CN1zW1AT.js +1 -0
- package/dist/public/assets/_CN1zW1AT.js.br +0 -0
- package/dist/public/assets/_CUILmj9R.js +1 -0
- package/dist/public/assets/_CUhP8KQ8.js +1 -0
- package/dist/public/assets/{_DaMVRI8f.js → _CUsrMpdL.js} +1 -1
- package/dist/public/assets/_CUsrMpdL.js.br +0 -0
- package/dist/public/assets/_CVG0_w9T.js +1 -0
- package/dist/public/assets/{_CamWDaoG.js → _CWG813ur.js} +1 -1
- package/dist/public/assets/_CWG813ur.js.br +0 -0
- package/dist/public/assets/{_DSVLaMWS.js → _CY87Y7QL.js} +1 -1
- package/dist/public/assets/_CY87Y7QL.js.br +0 -0
- package/dist/public/assets/_CYAsKva_.js +1 -0
- package/dist/public/assets/_CajKYNSY.js +1 -0
- package/dist/public/assets/{_D0aoEFRx.js → _Cb_k_JA_.js} +1 -1
- package/dist/public/assets/_Cb_k_JA_.js.br +0 -0
- package/dist/public/assets/_Ce8PlfMD.js +1 -0
- package/dist/public/assets/{_Bm4SHrNp.js → _CfGEGt_k.js} +1 -1
- package/dist/public/assets/_CfGEGt_k.js.br +0 -0
- package/dist/public/assets/{_DqhphdU4.js → _CfdK8EeQ.js} +1 -1
- package/dist/public/assets/_CfdK8EeQ.js.br +0 -0
- package/dist/public/assets/_CgOKmAwr.js +1 -0
- package/dist/public/assets/{_eoa1EOU-.js → _CiYQhf81.js} +1 -1
- package/dist/public/assets/_CiYQhf81.js.br +0 -0
- package/dist/public/assets/_Cj9DHPRL.js +1 -0
- package/dist/public/assets/{_CxAPL49a.js → _ClHPjF-1.js} +1 -1
- package/dist/public/assets/_ClHPjF-1.js.br +0 -0
- package/dist/public/assets/{_DDl8KSWJ.js → _Cmmdd2e3.js} +1 -1
- package/dist/public/assets/_Cmmdd2e3.js.br +0 -0
- package/dist/public/assets/{_BZKB4fhr.js → _Cn9Ia4SS.js} +1 -1
- package/dist/public/assets/_Cn9Ia4SS.js.br +0 -0
- package/dist/public/assets/_CnTzFbuG.js +1 -0
- package/dist/public/assets/{_BE_Jyvqd.js → _CqCenHOp.js} +1 -1
- package/dist/public/assets/_CqCenHOp.js.br +0 -0
- package/dist/public/assets/{_Dp3IZdH8.js → _CtqGSS84.js} +1 -1
- package/dist/public/assets/_CtqGSS84.js.br +0 -0
- package/dist/public/assets/_CttfwM-c.js +1 -0
- package/dist/public/assets/{_D6kktUFn.js → _CxA3Yab0.js} +1 -1
- package/dist/public/assets/_CxA3Yab0.js.br +0 -0
- package/dist/public/assets/{_Bx1CW-sF.js → _Cx_aJfDp.js} +1 -1
- package/dist/public/assets/_Cx_aJfDp.js.br +0 -0
- package/dist/public/assets/_D2L_ILOW.js +1 -0
- package/dist/public/assets/_D47lCu0c.js +1 -0
- package/dist/public/assets/_D5W-uGIK.js +1 -0
- package/dist/public/assets/_D6BbZLrc.js +1 -0
- package/dist/public/assets/_D6RVeCAn.js +1 -0
- package/dist/public/assets/_D75V4jV-.js +1 -0
- package/dist/public/assets/{_CyBCIknf.js → _D9r_Fn0I.js} +1 -1
- package/dist/public/assets/_D9r_Fn0I.js.br +0 -0
- package/dist/public/assets/{_8G2Mv7jG.js → _DBD57l1T.js} +1 -1
- package/dist/public/assets/_DBD57l1T.js.br +0 -0
- package/dist/public/assets/_DCWILZgL.js +1 -0
- package/dist/public/assets/{_COcePo2y.js → _DEOryr7w.js} +1 -1
- package/dist/public/assets/_DEOryr7w.js.br +0 -0
- package/dist/public/assets/_DF54Iz7o.js +1 -0
- package/dist/public/assets/_DFamU2Uj.js +2 -0
- package/dist/public/assets/_DFamU2Uj.js.br +0 -0
- package/dist/public/assets/_DHmBuyCO.js +1 -0
- package/dist/public/assets/_DHmBuyCO.js.br +0 -0
- package/dist/public/assets/{_BywcP-As.js → _DJqEBkNd.js} +1 -1
- package/dist/public/assets/_DJqEBkNd.js.br +0 -0
- package/dist/public/assets/{_BUvqweu0.js → _DL3w8c_p.js} +1 -1
- package/dist/public/assets/_DL3w8c_p.js.br +0 -0
- package/dist/public/assets/_DLVL-4MP.js +1 -0
- package/dist/public/assets/{_wXDh-Z2N.js → _DM60dKRs.js} +1 -1
- package/dist/public/assets/_DM60dKRs.js.br +0 -0
- package/dist/public/assets/{_BBWaxDkO.js → _DMJHTH74.js} +1 -1
- package/dist/public/assets/_DMJHTH74.js.br +0 -0
- package/dist/public/assets/_DMLv6KA6.js +1 -0
- package/dist/public/assets/_DQYpgyzr.js +1 -0
- package/dist/public/assets/_DQYpgyzr.js.br +0 -0
- package/dist/public/assets/{_SGDxiwE1.js → _DQyjuXTi.js} +1 -1
- package/dist/public/assets/_DQyjuXTi.js.br +0 -0
- package/dist/public/assets/{_DrIgZJzN.js → _DRHCy0UF.js} +1 -1
- package/dist/public/assets/_DRHCy0UF.js.br +0 -0
- package/dist/public/assets/{_D4rOX-Fa.js → _DSUBv-Bl.js} +1 -1
- package/dist/public/assets/_DSUBv-Bl.js.br +0 -0
- package/dist/public/assets/{_CYjE__ml.js → _DUFM9qLV.js} +1 -1
- package/dist/public/assets/_DUFM9qLV.js.br +0 -0
- package/dist/public/assets/{_BNW5Jiec.js → _DUs3ZGbj.js} +1 -1
- package/dist/public/assets/_DUs3ZGbj.js.br +0 -0
- package/dist/public/assets/{_Dytf99zx.js → _DX5u6Wvm.js} +1 -1
- package/dist/public/assets/_DX5u6Wvm.js.br +0 -0
- package/dist/public/assets/{_CHuLFr1f.js → _DZvkgS3V.js} +1 -1
- package/dist/public/assets/_DZvkgS3V.js.br +0 -0
- package/dist/public/assets/{_D9sS4J_w.js → _Dbm6zAQS.js} +1 -1
- package/dist/public/assets/_Dbm6zAQS.js.br +0 -0
- package/dist/public/assets/{_D4dJ2qEE.js → _DcOkTFth.js} +1 -1
- package/dist/public/assets/_Ddf1gumD.js +1 -0
- package/dist/public/assets/_De6E9M7R.js +1 -0
- package/dist/public/assets/{_DFWOMF-B.js → _DgWKSW-Y.js} +1 -1
- package/dist/public/assets/_DgWKSW-Y.js.br +0 -0
- package/dist/public/assets/_DhEN6T4v.js +1 -0
- package/dist/public/assets/{_D4quFMVQ.js → _Di1ccq_2.js} +1 -1
- package/dist/public/assets/_Di1ccq_2.js.br +0 -0
- package/dist/public/assets/{_CUXajOKj.js → _DifjKObE.js} +1 -1
- package/dist/public/assets/_DifjKObE.js.br +0 -0
- package/dist/public/assets/_Dn10ABa-.js +1 -0
- package/dist/public/assets/{_MCwIJAuJ.js → _Do1ltY2a.js} +1 -1
- package/dist/public/assets/_Do1ltY2a.js.br +0 -0
- package/dist/public/assets/{_Ct3RF80L.js → _DomK7Scb.js} +1 -1
- package/dist/public/assets/_DomK7Scb.js.br +0 -0
- package/dist/public/assets/_DtWggCxt.js +1 -0
- package/dist/public/assets/_DtqqybyQ.js +1 -0
- package/dist/public/assets/{_CEJUcePr.js → _DvKnakqk.js} +1 -1
- package/dist/public/assets/_DvKnakqk.js.br +0 -0
- package/dist/public/assets/_DxD_AC3a.js +1 -0
- package/dist/public/assets/_DxD_AC3a.js.br +0 -0
- package/dist/public/assets/_Dxo7m9cG.js +1 -0
- package/dist/public/assets/{_DkCaEf_h.js → _DzKW89Sx.js} +1 -1
- package/dist/public/assets/_DzKW89Sx.js.br +0 -0
- package/dist/public/assets/_DzTHCioH.js +1 -0
- package/dist/public/assets/{_C654p96Z.js → _EefWj858.js} +1 -1
- package/dist/public/assets/_EefWj858.js.br +0 -0
- package/dist/public/assets/{_zSAfqXcm.js → _FlITqTCo.js} +1 -1
- package/dist/public/assets/_FlITqTCo.js.br +0 -0
- package/dist/public/assets/_GkEw2S0T.js +1 -0
- package/dist/public/assets/{_Dd6X3e7w.js → _HM_QqtJi.js} +1 -1
- package/dist/public/assets/_HM_QqtJi.js.br +0 -0
- package/dist/public/assets/{_CEXHZd73.js → _HmkI4Rfn.js} +1 -1
- package/dist/public/assets/_HmkI4Rfn.js.br +0 -0
- package/dist/public/assets/{_d5u7EI97.js → _JEvx8ub4.js} +1 -1
- package/dist/public/assets/_JEvx8ub4.js.br +0 -0
- package/dist/public/assets/_JOb8B3tz.js +1 -0
- package/dist/public/assets/_LEIhjFrO.js +1 -0
- package/dist/public/assets/_STJhwy7U.js +1 -0
- package/dist/public/assets/_TrcWRD8T.js +15 -0
- package/dist/public/assets/_TrcWRD8T.js.br +0 -0
- package/dist/public/assets/{_CAkPJLeF.js → _UaKPY71M.js} +1 -1
- package/dist/public/assets/_UaKPY71M.js.br +0 -0
- package/dist/public/assets/_UhK3lkm0.js +1 -0
- package/dist/public/assets/_VPLoEBTS.js +1 -0
- package/dist/public/assets/_Zeftz3t1.js +1 -0
- package/dist/public/assets/{_Bhx319Hi.js → __cyRVmTO.js} +1 -1
- package/dist/public/assets/__cyRVmTO.js.br +0 -0
- package/dist/public/assets/_awfYTHit.js +1 -0
- package/dist/public/assets/{_DcMIlvz-.js → _dsj7vMTW.js} +1 -1
- package/dist/public/assets/_dsj7vMTW.js.br +0 -0
- package/dist/public/assets/_eqpiOhSM.js +1 -0
- package/dist/public/assets/{_CZ_OWtIT.js → _iutZ4EDe.js} +1 -1
- package/dist/public/assets/_iutZ4EDe.js.br +0 -0
- package/dist/public/assets/{_BOGkzMx9.js → _kWQ0dtYZ.js} +1 -1
- package/dist/public/assets/_kWQ0dtYZ.js.br +0 -0
- package/dist/public/assets/_knvMqXQh.js +1 -0
- package/dist/public/assets/_lwC7sIgC.js +1 -0
- package/dist/public/assets/_m2tRa0jk.js +1 -0
- package/dist/public/assets/_m2tRa0jk.js.br +0 -0
- package/dist/public/assets/{_CIb7xw_1.js → _pXG8fRON.js} +1 -1
- package/dist/public/assets/_pXG8fRON.js.br +0 -0
- package/dist/public/assets/_r541ENtr.js +1 -0
- package/dist/public/assets/_rrUx1wn3.js +1 -0
- package/dist/public/assets/_tJvcu7sD.js +1 -0
- package/dist/public/assets/{_Bf8WYPfh.js → _vcLBrU2m.js} +1 -1
- package/dist/public/assets/_vcLBrU2m.js.br +0 -0
- package/dist/public/assets/_xZC4Vm70.js +1 -0
- package/dist/public/assets/_yAr5r-uL.js +1 -0
- package/dist/public/assets/{_DbvaGqOl.js → _yUmRJIJ6.js} +1 -1
- package/dist/public/assets/_yUmRJIJ6.js.br +0 -0
- package/dist/public/assets/app-shell-CVYlktwa.css +1 -0
- package/dist/public/assets/app-shell-CVYlktwa.css.br +0 -0
- package/dist/public/assets/files-view-CTadakLK.js +2 -0
- package/dist/public/assets/manage-workspace-HUAS6qjy.js +2 -0
- package/dist/public/assets/new-CirJkJFl.js +1 -0
- package/dist/public/assets/new-workspace-C3t1nA6z.js +2 -0
- package/dist/public/assets/review-view-DKPNtgmc.js +2 -0
- package/dist/public/assets/settings-CirJkJFl.js +1 -0
- package/dist/public/assets/settings-page-DH-9cN-8.js +2 -0
- package/dist/public/assets/styles-CIeNhVxC.css +1 -0
- package/dist/public/assets/styles-CIeNhVxC.css.br +0 -0
- package/dist/public/assets/w-CirJkJFl.js +1 -0
- package/dist/public/assets/w._-BnShhzdq.js +1 -0
- package/dist/public/assets/w._-CirJkJFl.js +1 -0
- package/dist/public/assets/w._-aCTYfruH.js +1 -0
- package/lib/setup/doctor.d.mts +12 -1
- package/lib/setup/doctor.mjs +54 -9
- package/lib/setup/tailscale.d.mts +53 -0
- package/lib/setup/tailscale.mjs +179 -0
- package/package.json +1 -1
- package/dist/_CkwTsHKB.js +0 -2
- package/dist/public/assets/_1RHVsAcK.js +0 -1
- package/dist/public/assets/_4CShjaLP.js +0 -1
- package/dist/public/assets/_68JtNDO1.js +0 -1
- package/dist/public/assets/_8G2Mv7jG.js.br +0 -0
- package/dist/public/assets/_8dvK2NDJ.js.br +0 -0
- package/dist/public/assets/_94L2SIJF.js +0 -1
- package/dist/public/assets/_9AnDb3YH.js +0 -1
- package/dist/public/assets/_9kX9D09B.js.br +0 -0
- package/dist/public/assets/_9lErVegn.js +0 -1
- package/dist/public/assets/_B0oyGUU5.js +0 -1
- package/dist/public/assets/_B0oyGUU5.js.br +0 -0
- package/dist/public/assets/_B1mPnLlp.js +0 -1
- package/dist/public/assets/_B4fi2SSA.js +0 -1
- package/dist/public/assets/_B7Qx25UP.js +0 -1
- package/dist/public/assets/_B7b8EVjA.js +0 -1
- package/dist/public/assets/_BBWaxDkO.js.br +0 -0
- package/dist/public/assets/_BDa-iwuj.js.br +0 -0
- package/dist/public/assets/_BEKHKNmM.js +0 -1
- package/dist/public/assets/_BE_Jyvqd.js.br +0 -0
- package/dist/public/assets/_BFU-kJkk.js +0 -1
- package/dist/public/assets/_BIJ2O2oU.js +0 -1
- package/dist/public/assets/_BJ59XAZ9.js +0 -1
- package/dist/public/assets/_BKqRYfOI.js +0 -15
- package/dist/public/assets/_BKqRYfOI.js.br +0 -0
- package/dist/public/assets/_BKr9Dzz1.js +0 -1
- package/dist/public/assets/_BN7xvxS_.js +0 -1
- package/dist/public/assets/_BNQTVBlH.js +0 -1
- package/dist/public/assets/_BNW5Jiec.js.br +0 -0
- package/dist/public/assets/_BOGkzMx9.js.br +0 -0
- package/dist/public/assets/_BUEpqQ_m.js +0 -1
- package/dist/public/assets/_BUvqweu0.js.br +0 -0
- package/dist/public/assets/_BZKB4fhr.js.br +0 -0
- package/dist/public/assets/_BZo9BjDF.js +0 -1
- package/dist/public/assets/_BbbOvNRH.js.br +0 -0
- package/dist/public/assets/_BdUNnSlC.js +0 -1
- package/dist/public/assets/_Bf8WYPfh.js.br +0 -0
- package/dist/public/assets/_Bhx319Hi.js.br +0 -0
- package/dist/public/assets/_Bm4SHrNp.js.br +0 -0
- package/dist/public/assets/_Bmrqq8Ro.js +0 -2
- package/dist/public/assets/_Bmrqq8Ro.js.br +0 -0
- package/dist/public/assets/_BnHZ6Npj.js +0 -1
- package/dist/public/assets/_BoDxRJLS.js +0 -1
- package/dist/public/assets/_BoDxRJLS.js.br +0 -0
- package/dist/public/assets/_Bo_Ru664.js +0 -1
- package/dist/public/assets/_Bp8-V8yl.js.br +0 -0
- package/dist/public/assets/_BpoeUr5j.js.br +0 -0
- package/dist/public/assets/_Bq2G_Tid.js +0 -1
- package/dist/public/assets/_BsyoLB_D.js +0 -1
- package/dist/public/assets/_Bv3e3rg8.js.br +0 -0
- package/dist/public/assets/_BvXp6HpX.js.br +0 -0
- package/dist/public/assets/_BwP07uVS.js.br +0 -0
- package/dist/public/assets/_Bx1CW-sF.js.br +0 -0
- package/dist/public/assets/_BywcP-As.js.br +0 -0
- package/dist/public/assets/_Bzgtwt3G.js +0 -1
- package/dist/public/assets/_Bzgtwt3G.js.br +0 -0
- package/dist/public/assets/_C0_s45qg.js.br +0 -0
- package/dist/public/assets/_C0ePgF6b.js +0 -1
- package/dist/public/assets/_C0oVtTqO.js +0 -1
- package/dist/public/assets/_C0oVtTqO.js.br +0 -0
- package/dist/public/assets/_C654p96Z.js.br +0 -0
- package/dist/public/assets/_C8_1Y2-z.js +0 -1
- package/dist/public/assets/_C8_1Y2-z.js.br +0 -0
- package/dist/public/assets/_C8v1AZFP.js +0 -1
- package/dist/public/assets/_CAkPJLeF.js.br +0 -0
- package/dist/public/assets/_CB0D5cRH.js +0 -1
- package/dist/public/assets/_CD05JUTh.js +0 -1
- package/dist/public/assets/_CEJUcePr.js.br +0 -0
- package/dist/public/assets/_CEXHZd73.js.br +0 -0
- package/dist/public/assets/_CHcUMVR7.js +0 -1
- package/dist/public/assets/_CHuLFr1f.js.br +0 -0
- package/dist/public/assets/_CIb7xw_1.js.br +0 -0
- package/dist/public/assets/_CMSBfO6u.js.br +0 -0
- package/dist/public/assets/_CN7GPyBo.js +0 -1
- package/dist/public/assets/_COcePo2y.js.br +0 -0
- package/dist/public/assets/_CTINBWaG.js.br +0 -0
- package/dist/public/assets/_CTWrnAbz.js +0 -1
- package/dist/public/assets/_CUXajOKj.js.br +0 -0
- package/dist/public/assets/_CVru3vzC.js +0 -1
- package/dist/public/assets/_CYjE__ml.js.br +0 -0
- package/dist/public/assets/_CZ_OWtIT.js.br +0 -0
- package/dist/public/assets/_C_37_B6u.js.br +0 -0
- package/dist/public/assets/_C_CIQL7J.js +0 -1
- package/dist/public/assets/_C_CIQL7J.js.br +0 -0
- package/dist/public/assets/_C_WdpYbK.js +0 -1
- package/dist/public/assets/_CaiH3VN9.js +0 -1
- package/dist/public/assets/_CamWDaoG.js.br +0 -0
- package/dist/public/assets/_CdDElA0V.js +0 -1
- package/dist/public/assets/_CfnsClzZ.js +0 -1
- package/dist/public/assets/_Cgo1fRhJ.js +0 -1
- package/dist/public/assets/_Cgo1fRhJ.js.br +0 -0
- package/dist/public/assets/_CjhGrlf3.js +0 -1
- package/dist/public/assets/_CjlbL4C_.js +0 -1
- package/dist/public/assets/_CjogTUXK.js +0 -1
- package/dist/public/assets/_ClldMY37.js.br +0 -0
- package/dist/public/assets/_CmFq6Gtp.js +0 -1
- package/dist/public/assets/_CoAPOKiP.js +0 -1
- package/dist/public/assets/_CoUUgh9P.js +0 -1
- package/dist/public/assets/_CpjSCB1I.js.br +0 -0
- package/dist/public/assets/_Ct3RF80L.js.br +0 -0
- package/dist/public/assets/_CtYy5eZs.js +0 -1
- package/dist/public/assets/_CxAPL49a.js.br +0 -0
- package/dist/public/assets/_CyBCIknf.js.br +0 -0
- package/dist/public/assets/_Cz5BPBG8.js.br +0 -0
- package/dist/public/assets/_D-eEFXaI.js +0 -1
- package/dist/public/assets/_D0aoEFRx.js.br +0 -0
- package/dist/public/assets/_D1uRW1qz.js.br +0 -0
- package/dist/public/assets/_D2oIr2T2.js +0 -1
- package/dist/public/assets/_D2un443j.js.br +0 -0
- package/dist/public/assets/_D3MPx4-f.js +0 -1
- package/dist/public/assets/_D4q8XSMI.js.br +0 -0
- package/dist/public/assets/_D4quFMVQ.js.br +0 -0
- package/dist/public/assets/_D4rOX-Fa.js.br +0 -0
- package/dist/public/assets/_D5edrSyA.js +0 -1
- package/dist/public/assets/_D6kktUFn.js.br +0 -0
- package/dist/public/assets/_D80-qtVY.js +0 -1
- package/dist/public/assets/_D9-3EVA4.js +0 -1
- package/dist/public/assets/_D9sS4J_w.js.br +0 -0
- package/dist/public/assets/_DBLpxTDi.js +0 -1
- package/dist/public/assets/_DByHQ7nW.js +0 -1591
- package/dist/public/assets/_DByHQ7nW.js.br +0 -0
- package/dist/public/assets/_DC-78WeM.js.br +0 -0
- package/dist/public/assets/_DDl8KSWJ.js.br +0 -0
- package/dist/public/assets/_DFWOMF-B.js.br +0 -0
- package/dist/public/assets/_DKb-rt9n.js +0 -1
- package/dist/public/assets/_DMnSJCF_.js +0 -1
- package/dist/public/assets/_DOOIlrPh.js +0 -1
- package/dist/public/assets/_DPW-0yKP.js +0 -1
- package/dist/public/assets/_DR3BmvWU.js +0 -1
- package/dist/public/assets/_DSVLaMWS.js.br +0 -0
- package/dist/public/assets/_DYNGNKLk.js +0 -1
- package/dist/public/assets/_DZnEgCbj.js +0 -1
- package/dist/public/assets/_DaMVRI8f.js.br +0 -0
- package/dist/public/assets/_DbvaGqOl.js.br +0 -0
- package/dist/public/assets/_DcMIlvz-.js.br +0 -0
- package/dist/public/assets/_Dd6X3e7w.js.br +0 -0
- package/dist/public/assets/_De7P3jUH.js.br +0 -0
- package/dist/public/assets/_DeiFEAar.js +0 -1
- package/dist/public/assets/_DfI982PI.js.br +0 -0
- package/dist/public/assets/_DfZ6emcw.js +0 -1
- package/dist/public/assets/_Dj1lZ1pa.js +0 -86
- package/dist/public/assets/_Dj1lZ1pa.js.br +0 -0
- package/dist/public/assets/_DkCaEf_h.js.br +0 -0
- package/dist/public/assets/_DonAis0J.js +0 -1
- package/dist/public/assets/_Dp3IZdH8.js.br +0 -0
- package/dist/public/assets/_DqYih4xk.js +0 -1
- package/dist/public/assets/_DqYih4xk.js.br +0 -0
- package/dist/public/assets/_DqhphdU4.js.br +0 -0
- package/dist/public/assets/_DrIgZJzN.js.br +0 -0
- package/dist/public/assets/_Dt4hHR05.js +0 -1
- package/dist/public/assets/_DtTbTraA.js +0 -1
- package/dist/public/assets/_DwMxAJKP.js +0 -1
- package/dist/public/assets/_DxEm-Gwj.js.br +0 -0
- package/dist/public/assets/_Dytf99zx.js.br +0 -0
- package/dist/public/assets/_EAgv5jR9.js +0 -1
- package/dist/public/assets/_Iecpd0kS.js +0 -1
- package/dist/public/assets/_Iecpd0kS.js.br +0 -0
- package/dist/public/assets/_MCwIJAuJ.js.br +0 -0
- package/dist/public/assets/_NM79Lu3L.js +0 -6
- package/dist/public/assets/_NM79Lu3L.js.br +0 -0
- package/dist/public/assets/_QpNKKuS9.js +0 -1
- package/dist/public/assets/_SGDxiwE1.js.br +0 -0
- package/dist/public/assets/_TA8pE7z9.js +0 -1
- package/dist/public/assets/_bE4sNDeU.js +0 -1
- package/dist/public/assets/_bcsuBP7T.js.br +0 -0
- package/dist/public/assets/_cdcAU4yY.js +0 -1
- package/dist/public/assets/_ch_yXAap.js.br +0 -0
- package/dist/public/assets/_d5u7EI97.js.br +0 -0
- package/dist/public/assets/_eoa1EOU-.js.br +0 -0
- package/dist/public/assets/_j2tDSMvo.js.br +0 -0
- package/dist/public/assets/_jNhIFgbc.js +0 -1
- package/dist/public/assets/_kDYiTaag.js +0 -1
- package/dist/public/assets/_lNMVVbUx.js +0 -1
- package/dist/public/assets/_nwJ7Hu3S.js +0 -1
- package/dist/public/assets/_tmDtUACa.js +0 -1
- package/dist/public/assets/_tmDtUACa.js.br +0 -0
- package/dist/public/assets/_wXDh-Z2N.js.br +0 -0
- package/dist/public/assets/_wcshV0sZ.js.br +0 -0
- package/dist/public/assets/_x-NwqgCn.js +0 -1
- package/dist/public/assets/_xyw_DS5P.js.br +0 -0
- package/dist/public/assets/_zSAfqXcm.js.br +0 -0
- package/dist/public/assets/app-shell-ChQoVC5b.css +0 -1
- package/dist/public/assets/app-shell-ChQoVC5b.css.br +0 -0
- package/dist/public/assets/files-view-CLtLp_BW.js +0 -2
- package/dist/public/assets/files-view-CNHQapdI.css +0 -1
- package/dist/public/assets/files-view-CNHQapdI.css.br +0 -0
- package/dist/public/assets/group.css.ts-BG82htKb.css +0 -1
- package/dist/public/assets/group.css.ts-BG82htKb.css.br +0 -0
- package/dist/public/assets/icon-folder-DJOHuEpD.css +0 -1
- package/dist/public/assets/icon-folder-DJOHuEpD.css.br +0 -0
- package/dist/public/assets/icon-search-DsJuFXUJ.css +0 -1
- package/dist/public/assets/icon-search-DsJuFXUJ.css.br +0 -0
- package/dist/public/assets/manage-workspace-NBcFDyrB.js +0 -2
- package/dist/public/assets/manage-workspace-f_Np32TD.css +0 -1
- package/dist/public/assets/modal-view-KVNBpNYi.css +0 -1
- package/dist/public/assets/modal-view-KVNBpNYi.css.br +0 -0
- package/dist/public/assets/new-DHI77GvL.js +0 -1
- package/dist/public/assets/new-workspace-BFE-HpD_.css +0 -1
- package/dist/public/assets/new-workspace-BFE-HpD_.css.br +0 -0
- package/dist/public/assets/new-workspace-BRzimdd5.js +0 -2
- package/dist/public/assets/port-chip-CUUIDOVM.css +0 -1
- package/dist/public/assets/port-chip-CUUIDOVM.css.br +0 -0
- package/dist/public/assets/prompt-dialog-BGs6RXOV.css +0 -1
- package/dist/public/assets/prompt-dialog-BGs6RXOV.css.br +0 -0
- package/dist/public/assets/quick-open-Gx4so1bl.css +0 -1
- package/dist/public/assets/quick-open-Gx4so1bl.css.br +0 -0
- package/dist/public/assets/repo-picker-CUhd0vJN.css +0 -1
- package/dist/public/assets/repo-picker-CUhd0vJN.css.br +0 -4
- package/dist/public/assets/review-view-DFEK9VBa.js +0 -2
- package/dist/public/assets/review-view-deUY3OE5.css +0 -1
- package/dist/public/assets/review-view-deUY3OE5.css.br +0 -0
- package/dist/public/assets/section-CziSOSBR.css +0 -1
- package/dist/public/assets/section-CziSOSBR.css.br +0 -0
- package/dist/public/assets/settings-DHI77GvL.js +0 -1
- package/dist/public/assets/settings-page-OOtPOzIn.js +0 -2
- package/dist/public/assets/settings-page-wZhd7FLi.css +0 -1
- package/dist/public/assets/settings-page-wZhd7FLi.css.br +0 -0
- package/dist/public/assets/skill-row-BoCyFIXg.css +0 -1
- package/dist/public/assets/sso-auth-DV76tTpE.css +0 -1
- package/dist/public/assets/sso-auth-DV76tTpE.css.br +0 -0
- package/dist/public/assets/w-DHI77GvL.js +0 -1
- package/dist/public/assets/w._-DHI77GvL.js +0 -1
- package/dist/public/assets/w._-DsTgq3-C.js +0 -1
- package/dist/public/assets/w._-igEOSPR-.js +0 -1
package/README.md
CHANGED
|
@@ -80,13 +80,25 @@ from then on. A refused request gets a page saying which setting it needs.
|
|
|
80
80
|
Everything (pages, API, and the `/term` websockets) serves from the single
|
|
81
81
|
app port, so route the whole hostname to it.
|
|
82
82
|
|
|
83
|
+
**Tailscale** is the zero-config way. On a machine logged in to Tailscale
|
|
84
|
+
(1.52 or newer), `work setup` offers to run `tailscale serve --bg <port>`,
|
|
85
|
+
which puts work at `https://<machine>.<tailnet>.ts.net/` for your devices on
|
|
86
|
+
the tailnet alone (never Funnel, which would publish it to the internet),
|
|
87
|
+
and adds that name to `WORK_ALLOWED_HOSTS`: open it on a phone signed in to
|
|
88
|
+
the same tailnet. `work setup --tailscale` does it without asking and
|
|
89
|
+
`--no-tailscale` skips the question; `--yes` alone leaves Tailscale's config
|
|
90
|
+
as it is. A serve config already pointing at work only has its name
|
|
91
|
+
allowed, and `work doctor` says which of these holds.
|
|
92
|
+
|
|
83
93
|
**Opening workspace ports remotely.** The port chips in the sidebar link to
|
|
84
94
|
`http://<host>:<port>`, which only works where the machine is reachable
|
|
85
|
-
directly
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
95
|
+
directly — under a tailnet name too, since `tailscale serve` has no
|
|
96
|
+
wildcard names: there a chip reaches a dev server that listens beyond
|
|
97
|
+
loopback (`--host`), and one on loopback says so. Through a tunnel, route
|
|
98
|
+
a wildcard hostname to the app port as well and work proxies it — HTTP and
|
|
99
|
+
websockets, so HMR works — to `localhost:<port>`. `WORK_PORT_HOSTS` picks
|
|
100
|
+
the hostname shape the chips link to; `sub` is always accepted, `dash` only
|
|
101
|
+
when picked, and only for a name of three labels or more:
|
|
90
102
|
|
|
91
103
|
- `sub` (default): `https://3000.work.example.com`. Needs a wildcard
|
|
92
104
|
`*.work.example.com` route and a certificate that covers it (your own
|
package/bin/work.mjs
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
// work CLI — ships with the npm package (no dependencies; plain node).
|
|
3
3
|
//
|
|
4
4
|
// work setup install missing tools, sign in, install/refresh the background service
|
|
5
|
+
// (--tailscale serves work on the tailnet with `tailscale serve`, which
|
|
6
|
+
// it otherwise offers when Tailscale is logged in; --no-tailscale skips that)
|
|
5
7
|
// work doctor report machine readiness (--json, --fix to install what's missing)
|
|
6
8
|
// work start run the server in the foreground
|
|
7
9
|
// work update upgrade the npm package and refresh the service
|
|
@@ -26,8 +28,17 @@ import { execFileSync, spawnSync } from "node:child_process";
|
|
|
26
28
|
import fs from "node:fs";
|
|
27
29
|
import os from "node:os";
|
|
28
30
|
import path from "node:path";
|
|
31
|
+
import readline from "node:readline/promises";
|
|
32
|
+
import tty from "node:tty";
|
|
29
33
|
import { fileURLToPath } from "node:url";
|
|
30
|
-
import {
|
|
34
|
+
import {
|
|
35
|
+
doctor,
|
|
36
|
+
formatDoctor,
|
|
37
|
+
setupPath,
|
|
38
|
+
tailscaleProbe,
|
|
39
|
+
which,
|
|
40
|
+
} from "../lib/setup/doctor.mjs";
|
|
41
|
+
import { allowHost, stateText } from "../lib/setup/tailscale.mjs";
|
|
31
42
|
import { installTool, repairGhHelpers } from "../lib/setup/install.mjs";
|
|
32
43
|
import { bridgeCommands, bridgeIfNeeded } from "../lib/setup/bridge.mjs";
|
|
33
44
|
import { dialHost, listenStream } from "../lib/setup/listen.mjs";
|
|
@@ -638,17 +649,23 @@ function until(iso) {
|
|
|
638
649
|
|
|
639
650
|
async function setup() {
|
|
640
651
|
await bridge();
|
|
641
|
-
|
|
652
|
+
const d = await doctor(doctorOpts());
|
|
653
|
+
await fix(d);
|
|
654
|
+
// Before the service is written: a tailnet name to answer goes into the
|
|
655
|
+
// WORK_ALLOWED_HOSTS it carries.
|
|
656
|
+
const tailnet = await tailscale(d.tailscale);
|
|
642
657
|
|
|
643
658
|
const running = installService();
|
|
644
659
|
const port = serviceEnv().PORT;
|
|
645
|
-
maybeTunnel(port);
|
|
660
|
+
if (!tailnet) maybeTunnel(port);
|
|
646
661
|
if (running) {
|
|
647
662
|
if (await waitForServer()) log(`done — http://localhost:${port}`);
|
|
648
663
|
else
|
|
649
664
|
warn(
|
|
650
665
|
`service started but nothing answered on port ${port} within 30s — check the logs`,
|
|
651
666
|
);
|
|
667
|
+
if (tailnet)
|
|
668
|
+
log(`on your phone and other devices on the tailnet: ${tailnet}`);
|
|
652
669
|
} else {
|
|
653
670
|
// A fresh install's shell may not have mise on PATH yet — name the shim.
|
|
654
671
|
const shim = path.join(
|
|
@@ -725,15 +742,19 @@ async function update() {
|
|
|
725
742
|
"@dylanpiercey/work@latest",
|
|
726
743
|
]);
|
|
727
744
|
// Re-exec the (possibly new) CLI to finish with fresh code.
|
|
728
|
-
sh("work", [
|
|
745
|
+
sh("work", [
|
|
746
|
+
"setup",
|
|
747
|
+
...(yes ? ["--yes"] : []),
|
|
748
|
+
...args.filter((a) => a === "--tailscale" || a === "--no-tailscale"),
|
|
749
|
+
]);
|
|
729
750
|
}
|
|
730
751
|
|
|
731
752
|
/** Machine readiness from lib/setup — the same probe the Settings page runs. */
|
|
732
753
|
async function doctorCmd() {
|
|
733
|
-
let d = await doctor();
|
|
754
|
+
let d = await doctor(doctorOpts());
|
|
734
755
|
if (args.includes("--fix")) {
|
|
735
756
|
await fix(d);
|
|
736
|
-
d = await doctor();
|
|
757
|
+
d = await doctor(doctorOpts());
|
|
737
758
|
}
|
|
738
759
|
if (args.includes("--json")) {
|
|
739
760
|
console.log(JSON.stringify(d, null, 2));
|
|
@@ -747,6 +768,13 @@ async function doctorCmd() {
|
|
|
747
768
|
if (!d.ready) process.exitCode = 1;
|
|
748
769
|
}
|
|
749
770
|
|
|
771
|
+
/** What the doctor's Tailscale probe checks against: the port and allowed
|
|
772
|
+
* names the service runs with (or will, after `work setup`). */
|
|
773
|
+
function doctorOpts() {
|
|
774
|
+
const env = serviceEnv();
|
|
775
|
+
return { port: env.PORT, allowedHosts: env.WORK_ALLOWED_HOSTS || "" };
|
|
776
|
+
}
|
|
777
|
+
|
|
750
778
|
/** Said when the service listens beyond this machine with nothing declared
|
|
751
779
|
* to answer there: every other machine is refused (server/access.ts), which
|
|
752
780
|
* is safe, but likely not what the listening was for. */
|
|
@@ -1312,8 +1340,179 @@ function maybeTunnel(port = appPort) {
|
|
|
1312
1340
|
if (yes || have("cloudflared")) return;
|
|
1313
1341
|
console.log(`
|
|
1314
1342
|
To reach work from your phone or other devices, put it behind something
|
|
1315
|
-
that terminates TLS and authenticates, e.g.
|
|
1343
|
+
that terminates TLS and authenticates, e.g. Tailscale (\`work setup
|
|
1344
|
+
--tailscale\` runs \`tailscale serve\` for you) or a Cloudflare Tunnel with
|
|
1316
1345
|
Access (https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/)
|
|
1317
|
-
pointing at http://localhost:${port}
|
|
1318
|
-
|
|
1346
|
+
pointing at http://localhost:${port}. The server itself has no auth of its
|
|
1347
|
+
own.`);
|
|
1348
|
+
}
|
|
1349
|
+
|
|
1350
|
+
/**
|
|
1351
|
+
* `tailscale serve` in front of work: https://<machine>.<tailnet>.ts.net/,
|
|
1352
|
+
* TLS and the tailnet's own sign-in in the local daemon, proxied to work's
|
|
1353
|
+
* port, so requests arrive from this machine under that name — which goes
|
|
1354
|
+
* into WORK_ALLOWED_HOSTS. Tailnet only, never Funnel: Funnel publishes to
|
|
1355
|
+
* the internet, and work has no login of its own. Tailscale's config is
|
|
1356
|
+
* changed only on an explicit yes, the prompt's or `--tailscale`; `--yes`
|
|
1357
|
+
* is how the installer, `work update` and the app's own update run setup
|
|
1358
|
+
* unattended, and none of them asked for it. A serve config already
|
|
1359
|
+
* pointing at work only has its name allowed. Returns the URL work is
|
|
1360
|
+
* served at, or null.
|
|
1361
|
+
*/
|
|
1362
|
+
async function tailscale(ts) {
|
|
1363
|
+
if (args.includes("--no-tailscale")) return null;
|
|
1364
|
+
const asked = args.includes("--tailscale");
|
|
1365
|
+
const port = serviceEnv().PORT;
|
|
1366
|
+
if (!ts?.installed) {
|
|
1367
|
+
if (asked)
|
|
1368
|
+
warn(
|
|
1369
|
+
"Tailscale is not installed: https://tailscale.com/download, then work setup --tailscale",
|
|
1370
|
+
);
|
|
1371
|
+
return null;
|
|
1372
|
+
}
|
|
1373
|
+
if (ts.serve) {
|
|
1374
|
+
if (!allowTailnet(ts.serve)) return null;
|
|
1375
|
+
if (ts.running) return servedAt(ts.serve.url);
|
|
1376
|
+
// A serve config outlives a logout, and serves again once it is up.
|
|
1377
|
+
log(
|
|
1378
|
+
`Tailscale is ${stateText(ts)}: work is at ${ts.serve.url} once it is up`,
|
|
1379
|
+
);
|
|
1380
|
+
return null;
|
|
1381
|
+
}
|
|
1382
|
+
if (!ts.running) {
|
|
1383
|
+
if (asked)
|
|
1384
|
+
warn(
|
|
1385
|
+
`Tailscale is ${stateText(ts)}: ${ts.state === null ? "start tailscaled" : "run `tailscale up`"}, then work setup --tailscale`,
|
|
1386
|
+
);
|
|
1387
|
+
return null;
|
|
1388
|
+
}
|
|
1389
|
+
const input = yes ? null : terminal();
|
|
1390
|
+
try {
|
|
1391
|
+
const refusal = serveRefusal(ts, port);
|
|
1392
|
+
if (refusal) {
|
|
1393
|
+
if (asked || input) warn(refusal);
|
|
1394
|
+
return null;
|
|
1395
|
+
}
|
|
1396
|
+
const target = serveTarget(port);
|
|
1397
|
+
const command = `tailscale serve --bg ${target}`;
|
|
1398
|
+
if (!asked) {
|
|
1399
|
+
if (!input) {
|
|
1400
|
+
log(
|
|
1401
|
+
`Tailscale is logged in: \`work setup --tailscale\` serves work at https://${ts.name}/ on your tailnet`,
|
|
1402
|
+
);
|
|
1403
|
+
return null;
|
|
1404
|
+
}
|
|
1405
|
+
console.log(`
|
|
1406
|
+
Tailscale is logged in here as ${ts.name}.
|
|
1407
|
+
\`${command}\` puts work at https://${ts.name}/
|
|
1408
|
+
for your devices on the tailnet (only them: never Funnel), proxied by the
|
|
1409
|
+
local Tailscale daemon to port ${port}.${ts.https === false ? "\nHTTPS certificates are off on your tailnet: tailscale prints a link that\nturns them on." : ""}`);
|
|
1410
|
+
if (!(await confirm(input, `Run \`${command}\`? [y/N] `))) {
|
|
1411
|
+
log(
|
|
1412
|
+
"left Tailscale as it was (work setup --tailscale serves work later; --no-tailscale skips this question)",
|
|
1413
|
+
);
|
|
1414
|
+
return null;
|
|
1415
|
+
}
|
|
1416
|
+
} else if (ts.https === false && !input) {
|
|
1417
|
+
// tailscale serve would wait, unattended, for someone to follow the
|
|
1418
|
+
// link it prints.
|
|
1419
|
+
warn(
|
|
1420
|
+
"HTTPS certificates are off on your tailnet: turn them on (https://login.tailscale.com/admin/dns), then run work setup --tailscale",
|
|
1421
|
+
);
|
|
1422
|
+
return null;
|
|
1423
|
+
}
|
|
1424
|
+
log(command);
|
|
1425
|
+
spawnSync(which("tailscale"), ["serve", "--bg", target], {
|
|
1426
|
+
stdio: "inherit",
|
|
1427
|
+
});
|
|
1428
|
+
} finally {
|
|
1429
|
+
if (input && input !== process.stdin) input.destroy();
|
|
1430
|
+
}
|
|
1431
|
+
// Its exit status is no proof: it exits 0 having only printed how to
|
|
1432
|
+
// turn HTTPS on, when it does not wait for that.
|
|
1433
|
+
const after = await tailscaleProbe({ port, allowedHosts: "" });
|
|
1434
|
+
if (!after.serve) {
|
|
1435
|
+
warn(
|
|
1436
|
+
"tailscale serve did not serve work (see above); once it does, run work setup again",
|
|
1437
|
+
);
|
|
1438
|
+
return null;
|
|
1439
|
+
}
|
|
1440
|
+
return allowTailnet(after.serve) ? servedAt(after.serve.url) : null;
|
|
1441
|
+
}
|
|
1442
|
+
|
|
1443
|
+
function servedAt(url) {
|
|
1444
|
+
log(`Tailscale serves work at ${url} (tailnet only)`);
|
|
1445
|
+
return url;
|
|
1446
|
+
}
|
|
1447
|
+
|
|
1448
|
+
/** Why `tailscale serve --bg <port>` is not run here, or null. */
|
|
1449
|
+
function serveRefusal(ts, port) {
|
|
1450
|
+
if (!ts.serveCli)
|
|
1451
|
+
return `tailscale ${ts.version || "(unknown version)"} predates \`tailscale serve --bg <port>\` (1.52): update Tailscale, then run work setup --tailscale`;
|
|
1452
|
+
// It would replace whatever serves the name's root now.
|
|
1453
|
+
if (ts.rootTaken)
|
|
1454
|
+
return `https://${ts.name}/ already serves ${ts.rootTaken}, which work leaves alone. To serve work beside it: tailscale serve --bg --https=8443 ${port}, then work setup`;
|
|
1455
|
+
if (!serveTarget(port))
|
|
1456
|
+
return `work listens on ${serviceEnv().WORK_LISTEN} alone, and tailscale serve proxies to loopback: WORK_LISTEN= work setup --tailscale`;
|
|
1457
|
+
return null;
|
|
1458
|
+
}
|
|
1459
|
+
|
|
1460
|
+
/** What `tailscale serve` proxies to: work's port on loopback, where
|
|
1461
|
+
* requests are this machine's (server/access.ts). Null when work listens
|
|
1462
|
+
* on one other address only, which loopback does not reach. */
|
|
1463
|
+
function serveTarget(port) {
|
|
1464
|
+
const listen = serviceEnv().WORK_LISTEN;
|
|
1465
|
+
if (listen === "::1") return `http://[::1]:${port}`;
|
|
1466
|
+
return ["127.0.0.1", "0.0.0.0", "::", "*"].includes(listen)
|
|
1467
|
+
? String(port)
|
|
1468
|
+
: null;
|
|
1469
|
+
}
|
|
1470
|
+
|
|
1471
|
+
/** Put the name tailscale serve serves work under in WORK_ALLOWED_HOSTS,
|
|
1472
|
+
* for installService() to write — or, when Funnel publishes that name to
|
|
1473
|
+
* the internet, take it out, so work refuses the internet there. False
|
|
1474
|
+
* then. */
|
|
1475
|
+
function allowTailnet(serve) {
|
|
1476
|
+
const current = serviceEnv().WORK_ALLOWED_HOSTS || "";
|
|
1477
|
+
const next = allowHost(current, serve.host, !serve.funnel);
|
|
1478
|
+
if (next !== current) {
|
|
1479
|
+
process.env.WORK_ALLOWED_HOSTS = next;
|
|
1480
|
+
log(
|
|
1481
|
+
`${serve.funnel ? "refusing" : "allowing"} ${serve.host} (WORK_ALLOWED_HOSTS=${next})`,
|
|
1482
|
+
);
|
|
1483
|
+
}
|
|
1484
|
+
if (serve.funnel) {
|
|
1485
|
+
warn(
|
|
1486
|
+
`Tailscale Funnel publishes ${serve.url} to the internet, and work has no login, so work refuses that name. Turn Funnel off (tailscale funnel --https=${new URL(serve.url).port || 443} off), then run work setup again`,
|
|
1487
|
+
);
|
|
1488
|
+
return false;
|
|
1489
|
+
}
|
|
1490
|
+
return true;
|
|
1491
|
+
}
|
|
1492
|
+
|
|
1493
|
+
/** Where to ask the user something: stdin when it is a terminal, else the
|
|
1494
|
+
* controlling terminal, since the curl installer pipes its script into the
|
|
1495
|
+
* shell this runs under. Null with no terminal at all. */
|
|
1496
|
+
function terminal() {
|
|
1497
|
+
if (process.stdin.isTTY) return process.stdin;
|
|
1498
|
+
try {
|
|
1499
|
+
return new tty.ReadStream(fs.openSync("/dev/tty", "r"));
|
|
1500
|
+
} catch {
|
|
1501
|
+
return null;
|
|
1502
|
+
}
|
|
1503
|
+
}
|
|
1504
|
+
|
|
1505
|
+
/** A yes/no question, no unless answered yes. Line-buffered by the
|
|
1506
|
+
* terminal itself, so Ctrl-C stops setup as it would anywhere else. */
|
|
1507
|
+
async function confirm(input, question) {
|
|
1508
|
+
const rl = readline.createInterface({
|
|
1509
|
+
input,
|
|
1510
|
+
output: process.stdout,
|
|
1511
|
+
terminal: false,
|
|
1512
|
+
});
|
|
1513
|
+
try {
|
|
1514
|
+
return /^y(es)?$/i.test((await rl.question(question)).trim());
|
|
1515
|
+
} finally {
|
|
1516
|
+
rl.close();
|
|
1517
|
+
}
|
|
1319
1518
|
}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
var glyphBadgeNum = "_y _x";
|
|
2
|
+
var usageInk = {
|
|
3
|
+
ok: "_z",
|
|
4
|
+
mid: "_A",
|
|
5
|
+
warm: "_B",
|
|
6
|
+
hot: "_C"
|
|
7
|
+
};
|
|
8
|
+
var usageFill = {
|
|
9
|
+
ok: "_D",
|
|
10
|
+
mid: "_E",
|
|
11
|
+
warm: "_F",
|
|
12
|
+
hot: "_G"
|
|
13
|
+
};
|
|
14
|
+
var prTone = {
|
|
15
|
+
open: "_H",
|
|
16
|
+
draft: "_I",
|
|
17
|
+
merged: "_J",
|
|
18
|
+
closed: "_K"
|
|
19
|
+
};
|
|
20
|
+
var phaseIcon = {
|
|
21
|
+
working: "_X _W",
|
|
22
|
+
waiting: "_Y _W",
|
|
23
|
+
idle: "_Z _W",
|
|
24
|
+
off: "_0 _W"
|
|
25
|
+
};
|
|
26
|
+
var btnSm = "_7 _r";
|
|
27
|
+
var btnLg = "_8 _r";
|
|
28
|
+
var tone = {
|
|
29
|
+
accent: "_bb",
|
|
30
|
+
ok: "_bc",
|
|
31
|
+
warn: "_bd",
|
|
32
|
+
danger: "_be",
|
|
33
|
+
merged: "_bf",
|
|
34
|
+
closed: "_bg"
|
|
35
|
+
};
|
|
36
|
+
var inputLg = "_bk _bj";
|
|
37
|
+
var iconBtnXs = "_bo _m";
|
|
38
|
+
var iconBtnRow = "_bp _m";
|
|
39
|
+
var iconBtnLg = "_bq _m";
|
|
40
|
+
var chipBtn = "_br _m";
|
|
41
|
+
var tocDot = "_dx _U";
|
|
42
|
+
//#endregion
|
|
43
|
+
//#region src/styles/tokens.css.ts
|
|
44
|
+
var color = {
|
|
45
|
+
ok: "light-dark(#1a7f37, #57d364)",
|
|
46
|
+
okStrong: "light-dark(#116329, #7ee787)",
|
|
47
|
+
warn: "light-dark(#bf8700, #d4a72c)",
|
|
48
|
+
warnStrong: "light-dark(#8a5a00, #f0b84a)",
|
|
49
|
+
merged: "light-dark(#8250df, #a371f7)",
|
|
50
|
+
closed: "light-dark(#cf222e, #f85149)",
|
|
51
|
+
onAccent: "#fff",
|
|
52
|
+
onDanger: "#fff",
|
|
53
|
+
accentDefault: "light-dark(#4f5bd5, #6470e6)",
|
|
54
|
+
bg: "var(--bg)",
|
|
55
|
+
panel: "var(--panel)",
|
|
56
|
+
border: "var(--border)",
|
|
57
|
+
text: "var(--text)",
|
|
58
|
+
dim: "var(--dim)",
|
|
59
|
+
accent: "var(--accent)",
|
|
60
|
+
accentFill: "var(--accent-fill)",
|
|
61
|
+
accentText: "var(--accent-text)",
|
|
62
|
+
danger: "var(--danger)",
|
|
63
|
+
fieldBorder: "var(--field-border)",
|
|
64
|
+
raised: "color-mix(in srgb, var(--panel) 94%, var(--text))",
|
|
65
|
+
raisedHover: "color-mix(in srgb, var(--panel) 90%, var(--text))",
|
|
66
|
+
onScrim: "#fff"
|
|
67
|
+
};
|
|
68
|
+
var sans = "Inter, ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", sans-serif";
|
|
69
|
+
var iconSize = {
|
|
70
|
+
sm: 12,
|
|
71
|
+
md: 14,
|
|
72
|
+
lg: 16,
|
|
73
|
+
xl: 18
|
|
74
|
+
};
|
|
75
|
+
var toastKind = {
|
|
76
|
+
error: "_bJ",
|
|
77
|
+
warn: "_bK",
|
|
78
|
+
info: "_bL"
|
|
79
|
+
};
|
|
80
|
+
var toastTitle = {
|
|
81
|
+
error: "_bM",
|
|
82
|
+
warn: "_bN",
|
|
83
|
+
info: "_bO"
|
|
84
|
+
};
|
|
85
|
+
//#endregion
|
|
86
|
+
//#region src/tags/settings-agents.css.ts
|
|
87
|
+
var agentRow = "_fD _dI";
|
|
88
|
+
var list$3 = "_dM _c9 _dH _dK";
|
|
89
|
+
var metaChip = "_d0 _bi _bh";
|
|
90
|
+
var sectionCount = "_c6 _9 __";
|
|
91
|
+
var usageNote = "_jn _bh";
|
|
92
|
+
var pop$2 = "_ht _bw";
|
|
93
|
+
var spinner = "_hw _bm _2";
|
|
94
|
+
var toolLead = "_he _dV";
|
|
95
|
+
var name$4 = "_gW _dV";
|
|
96
|
+
var desc$1 = "_gX _dW";
|
|
97
|
+
//#endregion
|
|
98
|
+
//#region src/tags/lsp-add-dialog.css.ts
|
|
99
|
+
var addDlg = "_k1 _b2";
|
|
100
|
+
var key$1 = "_k_ _k8";
|
|
101
|
+
var addTile = "_lb _k8";
|
|
102
|
+
var field$2 = "_lm _bj";
|
|
103
|
+
var keyField = "_ln _lm _bj";
|
|
104
|
+
var labelField = "_lo _lm _bj";
|
|
105
|
+
var themeSeg = "_eI _bA";
|
|
106
|
+
var checkList = "_gM _c7";
|
|
107
|
+
//#endregion
|
|
108
|
+
//#region src/tags/prompt-dialog.css.ts
|
|
109
|
+
var promptDlg = "_b6 _b2";
|
|
110
|
+
var item$1 = "_bY _m";
|
|
111
|
+
var glance = "_dE _m";
|
|
112
|
+
//#endregion
|
|
113
|
+
//#region src/tags/side-nav.css.ts
|
|
114
|
+
var iconBtn = "_b9 _m";
|
|
115
|
+
var settingsDot = "_b_ _bz";
|
|
116
|
+
var notifyBtn = "_ce _m";
|
|
117
|
+
//#endregion
|
|
118
|
+
//#region src/styles/session-pop.css.ts
|
|
119
|
+
var sessionPop = "_b7 _bw";
|
|
120
|
+
var sessionPopBtn = "_b8 _4";
|
|
121
|
+
var wsBtn = "_fe _4";
|
|
122
|
+
var rowIcon = "_fg _bo _m";
|
|
123
|
+
var prChip = "_kM _v _kG";
|
|
124
|
+
var readyChip = "_kN _v";
|
|
125
|
+
var prDot = "_kP _kO";
|
|
126
|
+
//#endregion
|
|
127
|
+
//#region src/tags/port-chip.css.ts
|
|
128
|
+
var port = "_m6 _v _kG";
|
|
129
|
+
var open = "_j7 _4";
|
|
130
|
+
var action = "_ka _br _m";
|
|
131
|
+
var toggle = "_d5 _P";
|
|
132
|
+
var fold = "_d6 _dJ";
|
|
133
|
+
var item = "_jz _4";
|
|
134
|
+
var menu = "_kx _b7 _bw";
|
|
135
|
+
var menuItem = "_kz _4";
|
|
136
|
+
var findBtn$1 = "_ih _fV _bp _m";
|
|
137
|
+
var tool = "_fV _bp _m";
|
|
138
|
+
var pop$1 = "_kg _b7 _bw";
|
|
139
|
+
var fileFilter = "_m4 _o";
|
|
140
|
+
var findInput = "_ei _o";
|
|
141
|
+
var keybarIconBtn = "_er _br _m";
|
|
142
|
+
var repoTitle = "_lU _L";
|
|
143
|
+
var input = "_ct _o";
|
|
144
|
+
var group = "_cw _P";
|
|
145
|
+
var hint$1 = "_l2 _9 _M";
|
|
146
|
+
var sheetDir = "_ml _by";
|
|
147
|
+
var upBtn = "_gc _bp _m";
|
|
148
|
+
var findBtn = "_gg _fV _bp _m";
|
|
149
|
+
var goBtn = "_gh _fV _bp _m";
|
|
150
|
+
var note = "_l5 _bh";
|
|
151
|
+
//#endregion
|
|
152
|
+
//#region src/tags/manage-workspace.css.ts
|
|
153
|
+
var procCmd = "_fs _dV";
|
|
154
|
+
var factCopy = "_fz _br _m";
|
|
155
|
+
var resultRow = "_jO _4";
|
|
156
|
+
var resultBranch = "_jP _d0 _bi _bh _bo _m";
|
|
157
|
+
var urlAction = "_jQ _d0 _bi _bh _d1";
|
|
158
|
+
var curRow = "_eC _dP";
|
|
159
|
+
//#endregion
|
|
160
|
+
//#region src/tags/join-dialog.css.ts
|
|
161
|
+
var dlg = "_jC _b2";
|
|
162
|
+
var hint = "_jD _bh";
|
|
163
|
+
var kbtn = "_cP _bq _m";
|
|
164
|
+
var repeat = "_cS _cR";
|
|
165
|
+
var dpadUser = "_cV _cR";
|
|
166
|
+
var dpadEsc = "_cW _cR";
|
|
167
|
+
//#endregion
|
|
168
|
+
export { key$1 as $, item as A, usageFill as At, wsBtn as B, keybarIconBtn as C, iconBtnLg as Ct, findBtn$1 as D, phaseIcon as Dt, tool as E, inputLg as Et, port as F, settingsDot as G, sessionPopBtn as H, prChip as I, promptDlg as J, glance as K, prDot as L, toggle as M, action as N, menu as O, prTone as Ot, open as P, field$2 as Q, readyChip as R, findInput as S, glyphBadgeNum as St, pop$1 as T, iconBtnXs as Tt, iconBtn as U, sessionPop as V, notifyBtn as W, themeSeg as X, checkList as Y, addTile as Z, sheetDir as _, sans as _t, dlg as a, toolLead as at, input as b, btnSm as bt, resultBranch as c, usageNote as ct, factCopy as d, metaChip as dt, keyField as et, procCmd as f, agentRow as ft, upBtn as g, iconSize as gt, goBtn as h, color as ht, repeat as i, name$4 as it, fold as j, usageInk as jt, menuItem as k, tone as kt, resultRow as l, sectionCount as lt, findBtn as m, toastTitle as mt, dpadUser as n, addDlg as nt, hint as o, pop$2 as ot, note as p, toastKind as pt, item$1 as q, kbtn as r, desc$1 as rt, curRow as s, spinner as st, dpadEsc as t, labelField as tt, urlAction as u, list$3 as ut, hint$1 as v, tocDot as vt, fileFilter as w, iconBtnRow as wt, repoTitle as x, chipBtn as xt, group as y, btnLg as yt, rowIcon as z };
|