@dylanpiercey/work 0.0.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 +99 -0
- package/bin/work.mjs +236 -0
- package/dist/_B9zhiogp.js +1797 -0
- package/dist/_BMI-E3GI.js +44 -0
- package/dist/_BmSjjJ2E.js +43 -0
- package/dist/_DmVVbFOa.js +7641 -0
- package/dist/_JcAWG3K1.js +2422 -0
- package/dist/_xlrdOUsL.js +877 -0
- package/dist/index.mjs +21023 -0
- package/dist/public/apple-touch-icon.png +0 -0
- package/dist/public/assets/_0fSaH845.js +2 -0
- package/dist/public/assets/_0fSaH845.js.map +1 -0
- package/dist/public/assets/_1d3aXaVP.js +2 -0
- package/dist/public/assets/_1d3aXaVP.js.map +1 -0
- package/dist/public/assets/_2IIEA8gg.js +2 -0
- package/dist/public/assets/_2IIEA8gg.js.map +1 -0
- package/dist/public/assets/_2WURHcVF2.js +2 -0
- package/dist/public/assets/_2WURHcVF2.js.map +1 -0
- package/dist/public/assets/_2sfcym2Z.js +2 -0
- package/dist/public/assets/_2sfcym2Z.js.map +1 -0
- package/dist/public/assets/_4CJ0cIlV.js +2 -0
- package/dist/public/assets/_4CJ0cIlV.js.map +1 -0
- package/dist/public/assets/_4G7pJPwS2.js +2 -0
- package/dist/public/assets/_4G7pJPwS2.js.map +1 -0
- package/dist/public/assets/_4ZHwLPI52.js +2 -0
- package/dist/public/assets/_4ZHwLPI52.js.map +1 -0
- package/dist/public/assets/_5eyTD99u.js +2 -0
- package/dist/public/assets/_5eyTD99u.js.map +1 -0
- package/dist/public/assets/_7GGW24-e2.js +2 -0
- package/dist/public/assets/_7GGW24-e2.js.map +1 -0
- package/dist/public/assets/_8PwUyIlP2.js +2 -0
- package/dist/public/assets/_8PwUyIlP2.js.map +1 -0
- package/dist/public/assets/_9MfHhQsQ.js +2 -0
- package/dist/public/assets/_9MfHhQsQ.js.map +1 -0
- package/dist/public/assets/_B1RWQWA52.js +2 -0
- package/dist/public/assets/_B1RWQWA52.js.map +1 -0
- package/dist/public/assets/_B2OO5cIa2.js +2 -0
- package/dist/public/assets/_B2OO5cIa2.js.map +1 -0
- package/dist/public/assets/_B2gwz-sJ2.js +2 -0
- package/dist/public/assets/_B2gwz-sJ2.js.map +1 -0
- package/dist/public/assets/_B3-BJFgG2.js +2 -0
- package/dist/public/assets/_B3-BJFgG2.js.map +1 -0
- package/dist/public/assets/_B35FxJx-.js +2 -0
- package/dist/public/assets/_B35FxJx-.js.map +1 -0
- package/dist/public/assets/_B3gFvitq2.js +2 -0
- package/dist/public/assets/_B3gFvitq2.js.map +1 -0
- package/dist/public/assets/_B5W6OYN7.js +2 -0
- package/dist/public/assets/_B5W6OYN7.js.map +1 -0
- package/dist/public/assets/_B5_Aarum.js +2 -0
- package/dist/public/assets/_B5_Aarum.js.map +1 -0
- package/dist/public/assets/_B5eOa1yu.js +2 -0
- package/dist/public/assets/_B5eOa1yu.js.map +1 -0
- package/dist/public/assets/_B68TUdTA.js +2 -0
- package/dist/public/assets/_B68TUdTA.js.map +1 -0
- package/dist/public/assets/_B6D30XZt.js +2 -0
- package/dist/public/assets/_B6D30XZt.js.map +1 -0
- package/dist/public/assets/_B7U1oqTK.js +2 -0
- package/dist/public/assets/_B7U1oqTK.js.map +1 -0
- package/dist/public/assets/_B7ZEbQpA2.js +2 -0
- package/dist/public/assets/_B7ZEbQpA2.js.map +1 -0
- package/dist/public/assets/_BAWPOn9u.js +2 -0
- package/dist/public/assets/_BAWPOn9u.js.map +1 -0
- package/dist/public/assets/_BAd6mRrB.js +2 -0
- package/dist/public/assets/_BAd6mRrB.js.map +1 -0
- package/dist/public/assets/_BC2Px7Mm.js +2 -0
- package/dist/public/assets/_BC2Px7Mm.js.map +1 -0
- package/dist/public/assets/_BC_s9l72.js +2 -0
- package/dist/public/assets/_BC_s9l72.js.map +1 -0
- package/dist/public/assets/_BHWKrbxM.js +2 -0
- package/dist/public/assets/_BHWKrbxM.js.map +1 -0
- package/dist/public/assets/_BHpQb5nM.js +2 -0
- package/dist/public/assets/_BHpQb5nM.js.map +1 -0
- package/dist/public/assets/_BJitypiv.js +2 -0
- package/dist/public/assets/_BJitypiv.js.map +1 -0
- package/dist/public/assets/_BM315xPC.js +2 -0
- package/dist/public/assets/_BM315xPC.js.map +1 -0
- package/dist/public/assets/_BML5mF2J.js +2 -0
- package/dist/public/assets/_BML5mF2J.js.map +1 -0
- package/dist/public/assets/_BMqwQI7S.js +2 -0
- package/dist/public/assets/_BMqwQI7S.js.map +1 -0
- package/dist/public/assets/_BN8roHge.js +2 -0
- package/dist/public/assets/_BN8roHge.js.map +1 -0
- package/dist/public/assets/_BNLmms1o.js +2 -0
- package/dist/public/assets/_BNLmms1o.js.map +1 -0
- package/dist/public/assets/_BPjhmG05.js +2 -0
- package/dist/public/assets/_BPjhmG05.js.map +1 -0
- package/dist/public/assets/_BQwnQ1RS.js +2 -0
- package/dist/public/assets/_BQwnQ1RS.js.map +1 -0
- package/dist/public/assets/_BR5RXkoi.js +2 -0
- package/dist/public/assets/_BR5RXkoi.js.map +1 -0
- package/dist/public/assets/_BRdr0IET2.js +2 -0
- package/dist/public/assets/_BRdr0IET2.js.map +1 -0
- package/dist/public/assets/_BSMLrYjP.js +2 -0
- package/dist/public/assets/_BSMLrYjP.js.map +1 -0
- package/dist/public/assets/_BSWPekZh2.js +2 -0
- package/dist/public/assets/_BSWPekZh2.js.map +1 -0
- package/dist/public/assets/_BUDT5pXO2.js +2 -0
- package/dist/public/assets/_BUDT5pXO2.js.map +1 -0
- package/dist/public/assets/_BUR00bIu.js +2 -0
- package/dist/public/assets/_BUR00bIu.js.map +1 -0
- package/dist/public/assets/_BVOciON5.js +2 -0
- package/dist/public/assets/_BVOciON5.js.map +1 -0
- package/dist/public/assets/_BVqpJbzt.js +2 -0
- package/dist/public/assets/_BVqpJbzt.js.map +1 -0
- package/dist/public/assets/_BWXHIvNe2.js +2 -0
- package/dist/public/assets/_BWXHIvNe2.js.map +1 -0
- package/dist/public/assets/_BX8lD8tm2.js +2 -0
- package/dist/public/assets/_BX8lD8tm2.js.map +1 -0
- package/dist/public/assets/_BXViO-2h.js +2 -0
- package/dist/public/assets/_BXViO-2h.js.map +1 -0
- package/dist/public/assets/_BXeXVLqQ.js +2 -0
- package/dist/public/assets/_BXeXVLqQ.js.map +1 -0
- package/dist/public/assets/_BYOwaDjH.js +2 -0
- package/dist/public/assets/_BYOwaDjH.js.map +1 -0
- package/dist/public/assets/_BYnGhZoM.js +2 -0
- package/dist/public/assets/_BYnGhZoM.js.map +1 -0
- package/dist/public/assets/_BZCL-v6S2.js +2 -0
- package/dist/public/assets/_BZCL-v6S2.js.map +1 -0
- package/dist/public/assets/_B_bV9PQ92.js +2 -0
- package/dist/public/assets/_B_bV9PQ92.js.map +1 -0
- package/dist/public/assets/_B_tTalzw.js +2 -0
- package/dist/public/assets/_B_tTalzw.js.map +1 -0
- package/dist/public/assets/_BaHq4SXp.js +2 -0
- package/dist/public/assets/_BaHq4SXp.js.map +1 -0
- package/dist/public/assets/_BaS-oxxd2.js +2 -0
- package/dist/public/assets/_BaS-oxxd2.js.map +1 -0
- package/dist/public/assets/_Bc3YyYrH2.js +2 -0
- package/dist/public/assets/_Bc3YyYrH2.js.map +1 -0
- package/dist/public/assets/_BdRaM05m2.js +2 -0
- package/dist/public/assets/_BdRaM05m2.js.map +1 -0
- package/dist/public/assets/_BdplqJrr.js +2 -0
- package/dist/public/assets/_BdplqJrr.js.map +1 -0
- package/dist/public/assets/_BeD6FBFk.js +2 -0
- package/dist/public/assets/_BeD6FBFk.js.map +1 -0
- package/dist/public/assets/_BewZWKdk2.js +2 -0
- package/dist/public/assets/_BewZWKdk2.js.map +1 -0
- package/dist/public/assets/_BgfXC-Er.js +2 -0
- package/dist/public/assets/_BgfXC-Er.js.map +1 -0
- package/dist/public/assets/_Bh7aXd4k.js +2 -0
- package/dist/public/assets/_Bh7aXd4k.js.map +1 -0
- package/dist/public/assets/_BiFt_7mu2.js +2 -0
- package/dist/public/assets/_BiFt_7mu2.js.map +1 -0
- package/dist/public/assets/_BiJDBrnU2.js +2 -0
- package/dist/public/assets/_BiJDBrnU2.js.map +1 -0
- package/dist/public/assets/_Bj61d0ZC2.js +2 -0
- package/dist/public/assets/_Bj61d0ZC2.js.map +1 -0
- package/dist/public/assets/_Bj7E1mRn.js +2 -0
- package/dist/public/assets/_Bj7E1mRn.js.map +1 -0
- package/dist/public/assets/_BjSbUqbC.js +2 -0
- package/dist/public/assets/_BjSbUqbC.js.map +1 -0
- package/dist/public/assets/_Bkw-3BvZ.js +2 -0
- package/dist/public/assets/_Bkw-3BvZ.js.map +1 -0
- package/dist/public/assets/_BkyTk9wS.js +2 -0
- package/dist/public/assets/_BkyTk9wS.js.map +1 -0
- package/dist/public/assets/_Bm2Q91Ye.js +2 -0
- package/dist/public/assets/_Bm2Q91Ye.js.map +1 -0
- package/dist/public/assets/_Bm3Qr25_2.js +2 -0
- package/dist/public/assets/_Bm3Qr25_2.js.map +1 -0
- package/dist/public/assets/_BmuOG9ZW.js +2 -0
- package/dist/public/assets/_BmuOG9ZW.js.map +1 -0
- package/dist/public/assets/_BnjxR4X6.js +2 -0
- package/dist/public/assets/_BnjxR4X6.js.map +1 -0
- package/dist/public/assets/_BnlCZFoB2.js +2 -0
- package/dist/public/assets/_BnlCZFoB2.js.map +1 -0
- package/dist/public/assets/_Bozd7klA.js +2 -0
- package/dist/public/assets/_Bozd7klA.js.map +1 -0
- package/dist/public/assets/_BqS6dk9f2.js +2 -0
- package/dist/public/assets/_BqS6dk9f2.js.map +1 -0
- package/dist/public/assets/_Bqwy1Gya.js +2 -0
- package/dist/public/assets/_Bqwy1Gya.js.map +1 -0
- package/dist/public/assets/_BroJfC0k2.js +2 -0
- package/dist/public/assets/_BroJfC0k2.js.map +1 -0
- package/dist/public/assets/_BsKzXJz42.js +2 -0
- package/dist/public/assets/_BsKzXJz42.js.map +1 -0
- package/dist/public/assets/_BsSzOQcm2.js +2 -0
- package/dist/public/assets/_BsSzOQcm2.js.map +1 -0
- package/dist/public/assets/_BtDbiS_P.js +2 -0
- package/dist/public/assets/_BtDbiS_P.js.map +1 -0
- package/dist/public/assets/_Bvq9DfCD.js +2 -0
- package/dist/public/assets/_Bvq9DfCD.js.map +1 -0
- package/dist/public/assets/_Bx1FflLF.js +2 -0
- package/dist/public/assets/_Bx1FflLF.js.map +1 -0
- package/dist/public/assets/_BxMlprV5.js +2 -0
- package/dist/public/assets/_BxMlprV5.js.map +1 -0
- package/dist/public/assets/_BxpfTIzt.js +2 -0
- package/dist/public/assets/_BxpfTIzt.js.map +1 -0
- package/dist/public/assets/_ByJddavk.js +2 -0
- package/dist/public/assets/_ByJddavk.js.map +1 -0
- package/dist/public/assets/_ByQdrI9o.js +2 -0
- package/dist/public/assets/_ByQdrI9o.js.map +1 -0
- package/dist/public/assets/_ByWQv1Qj2.js +2 -0
- package/dist/public/assets/_ByWQv1Qj2.js.map +1 -0
- package/dist/public/assets/_C-LZuMrd.js +2 -0
- package/dist/public/assets/_C-LZuMrd.js.map +1 -0
- package/dist/public/assets/_C03EYrpw.js +2 -0
- package/dist/public/assets/_C03EYrpw.js.map +1 -0
- package/dist/public/assets/_C0MpOrj4.js +2 -0
- package/dist/public/assets/_C0MpOrj4.js.map +1 -0
- package/dist/public/assets/_C0YiOr0H.js +2 -0
- package/dist/public/assets/_C0YiOr0H.js.map +1 -0
- package/dist/public/assets/_C1IUL_tW2.js +2 -0
- package/dist/public/assets/_C1IUL_tW2.js.map +1 -0
- package/dist/public/assets/_C2pBCSgt.js +2 -0
- package/dist/public/assets/_C2pBCSgt.js.map +1 -0
- package/dist/public/assets/_C3h-C4tm.js +2 -0
- package/dist/public/assets/_C3h-C4tm.js.map +1 -0
- package/dist/public/assets/_C5qYipkI.js +2 -0
- package/dist/public/assets/_C5qYipkI.js.map +1 -0
- package/dist/public/assets/_C7Dq7tkg.js +2 -0
- package/dist/public/assets/_C7Dq7tkg.js.map +1 -0
- package/dist/public/assets/_C7UOKdEL2.js +2 -0
- package/dist/public/assets/_C7UOKdEL2.js.map +1 -0
- package/dist/public/assets/_C7mF5XQf.js +2 -0
- package/dist/public/assets/_C7mF5XQf.js.map +1 -0
- package/dist/public/assets/_C820rvS2.js +2 -0
- package/dist/public/assets/_C820rvS2.js.map +1 -0
- package/dist/public/assets/_C8oCnwJJ2.js +2 -0
- package/dist/public/assets/_C8oCnwJJ2.js.map +1 -0
- package/dist/public/assets/_C8pVoKbM2.js +2 -0
- package/dist/public/assets/_C8pVoKbM2.js.map +1 -0
- package/dist/public/assets/_C8r90Shi2.js +2 -0
- package/dist/public/assets/_C8r90Shi2.js.map +1 -0
- package/dist/public/assets/_C9Q5zVZY.js +2 -0
- package/dist/public/assets/_C9Q5zVZY.js.map +1 -0
- package/dist/public/assets/_C9nuUTWB.js +2 -0
- package/dist/public/assets/_C9nuUTWB.js.map +1 -0
- package/dist/public/assets/_CA9gdOdF.js +2 -0
- package/dist/public/assets/_CA9gdOdF.js.map +1 -0
- package/dist/public/assets/_CA_30FGA2.js +2 -0
- package/dist/public/assets/_CA_30FGA2.js.map +1 -0
- package/dist/public/assets/_CAekHB0j.js +2 -0
- package/dist/public/assets/_CAekHB0j.js.map +1 -0
- package/dist/public/assets/_CAySWx-v2.js +2 -0
- package/dist/public/assets/_CAySWx-v2.js.map +1 -0
- package/dist/public/assets/_CBce3t8t2.js +2 -0
- package/dist/public/assets/_CBce3t8t2.js.map +1 -0
- package/dist/public/assets/_CCSX75yM2.js +2 -0
- package/dist/public/assets/_CCSX75yM2.js.map +1 -0
- package/dist/public/assets/_CCn79oCD.js +2 -0
- package/dist/public/assets/_CCn79oCD.js.map +1 -0
- package/dist/public/assets/_CDeNXAV0.js +2 -0
- package/dist/public/assets/_CDeNXAV0.js.map +1 -0
- package/dist/public/assets/_CDv2pdJW.js +2 -0
- package/dist/public/assets/_CDv2pdJW.js.map +1 -0
- package/dist/public/assets/_CE9AQfxI.js +2 -0
- package/dist/public/assets/_CE9AQfxI.js.map +1 -0
- package/dist/public/assets/_CE9ld1lL.js +2 -0
- package/dist/public/assets/_CE9ld1lL.js.map +1 -0
- package/dist/public/assets/_CEbqgOJL.js +2 -0
- package/dist/public/assets/_CEbqgOJL.js.map +1 -0
- package/dist/public/assets/_CFuIV2fl.js +2 -0
- package/dist/public/assets/_CFuIV2fl.js.map +1 -0
- package/dist/public/assets/_CHQ94UKr.js +2 -0
- package/dist/public/assets/_CHQ94UKr.js.map +1 -0
- package/dist/public/assets/_CJTPZ8u_.js +2 -0
- package/dist/public/assets/_CJTPZ8u_.js.map +1 -0
- package/dist/public/assets/_CKONSnHR2.js +2 -0
- package/dist/public/assets/_CKONSnHR2.js.map +1 -0
- package/dist/public/assets/_CL7CweMx.js +2 -0
- package/dist/public/assets/_CL7CweMx.js.map +1 -0
- package/dist/public/assets/_CLvhMVsD.js +2 -0
- package/dist/public/assets/_CLvhMVsD.js.map +1 -0
- package/dist/public/assets/_CLwyXe_n2.js +2 -0
- package/dist/public/assets/_CLwyXe_n2.js.map +1 -0
- package/dist/public/assets/_CMLA9XwU2.js +2 -0
- package/dist/public/assets/_CMLA9XwU2.js.map +1 -0
- package/dist/public/assets/_CNp9jCcm.js +2 -0
- package/dist/public/assets/_CNp9jCcm.js.map +1 -0
- package/dist/public/assets/_CPPmWfSs.js +2 -0
- package/dist/public/assets/_CPPmWfSs.js.map +1 -0
- package/dist/public/assets/_CQ2zXKGN2.js +2 -0
- package/dist/public/assets/_CQ2zXKGN2.js.map +1 -0
- package/dist/public/assets/_CQJs3lWb.js +2 -0
- package/dist/public/assets/_CQJs3lWb.js.map +1 -0
- package/dist/public/assets/_CRGYupPL.js +2 -0
- package/dist/public/assets/_CRGYupPL.js.map +1 -0
- package/dist/public/assets/_CSRkHgEL2.js +2 -0
- package/dist/public/assets/_CSRkHgEL2.js.map +1 -0
- package/dist/public/assets/_CUHmPFLl2.js +2 -0
- package/dist/public/assets/_CUHmPFLl2.js.map +1 -0
- package/dist/public/assets/_CV2tkWYe2.js +2 -0
- package/dist/public/assets/_CV2tkWYe2.js.map +1 -0
- package/dist/public/assets/_CY8IvGdO2.js +2 -0
- package/dist/public/assets/_CY8IvGdO2.js.map +1 -0
- package/dist/public/assets/_CYIUgYqB2.js +2 -0
- package/dist/public/assets/_CYIUgYqB2.js.map +1 -0
- package/dist/public/assets/_CYNrtFtB.js +2 -0
- package/dist/public/assets/_CYNrtFtB.js.map +1 -0
- package/dist/public/assets/_CYpm1nAK.js +2 -0
- package/dist/public/assets/_CYpm1nAK.js.map +1 -0
- package/dist/public/assets/_CZbG8q4J2.js +2 -0
- package/dist/public/assets/_CZbG8q4J2.js.map +1 -0
- package/dist/public/assets/_CZd0xW_V2.js +2 -0
- package/dist/public/assets/_CZd0xW_V2.js.map +1 -0
- package/dist/public/assets/_C_8bwKvT.js +2 -0
- package/dist/public/assets/_C_8bwKvT.js.map +1 -0
- package/dist/public/assets/_CacY0gHj2.js +2 -0
- package/dist/public/assets/_CacY0gHj2.js.map +1 -0
- package/dist/public/assets/_Cadu5wg_2.js +2 -0
- package/dist/public/assets/_Cadu5wg_2.js.map +1 -0
- package/dist/public/assets/_Cb4Vim4T2.js +2 -0
- package/dist/public/assets/_Cb4Vim4T2.js.map +1 -0
- package/dist/public/assets/_CcUt-GD82.js +2 -0
- package/dist/public/assets/_CcUt-GD82.js.map +1 -0
- package/dist/public/assets/_CcmNWLt02.js +2 -0
- package/dist/public/assets/_CcmNWLt02.js.map +1 -0
- package/dist/public/assets/_CewbzKMR.js +2 -0
- package/dist/public/assets/_CewbzKMR.js.map +1 -0
- package/dist/public/assets/_Cfkwpbl82.js +2 -0
- package/dist/public/assets/_Cfkwpbl82.js.map +1 -0
- package/dist/public/assets/_CgoNMtux2.js +2 -0
- package/dist/public/assets/_CgoNMtux2.js.map +1 -0
- package/dist/public/assets/_Ci_nEsc72.js +2 -0
- package/dist/public/assets/_Ci_nEsc72.js.map +1 -0
- package/dist/public/assets/_CjNLYCLg2.js +2 -0
- package/dist/public/assets/_CjNLYCLg2.js.map +1 -0
- package/dist/public/assets/_Ckw8ddFX.js +2 -0
- package/dist/public/assets/_Ckw8ddFX.js.map +1 -0
- package/dist/public/assets/_ClCAoQg62.js +2 -0
- package/dist/public/assets/_ClCAoQg62.js.map +1 -0
- package/dist/public/assets/_ClFFjSW22.js +2 -0
- package/dist/public/assets/_ClFFjSW22.js.map +1 -0
- package/dist/public/assets/_ClKdZ_lG.js +2 -0
- package/dist/public/assets/_ClKdZ_lG.js.map +1 -0
- package/dist/public/assets/_Clg0Yi872.js +2 -0
- package/dist/public/assets/_Clg0Yi872.js.map +1 -0
- package/dist/public/assets/_Cluzi2Zq.js +2 -0
- package/dist/public/assets/_Cluzi2Zq.js.map +1 -0
- package/dist/public/assets/_CmCQp5Yx.js +2 -0
- package/dist/public/assets/_CmCQp5Yx.js.map +1 -0
- package/dist/public/assets/_CmKGBNpS.js +2 -0
- package/dist/public/assets/_CmKGBNpS.js.map +1 -0
- package/dist/public/assets/_Cmm7eHzH.js +2 -0
- package/dist/public/assets/_Cmm7eHzH.js.map +1 -0
- package/dist/public/assets/_CnvKMtbv.js +2 -0
- package/dist/public/assets/_CnvKMtbv.js.map +1 -0
- package/dist/public/assets/_CoaEpmwp.js +2 -0
- package/dist/public/assets/_CoaEpmwp.js.map +1 -0
- package/dist/public/assets/_CohzipZa.js +2 -0
- package/dist/public/assets/_CohzipZa.js.map +1 -0
- package/dist/public/assets/_CpLgRqie.js +2 -0
- package/dist/public/assets/_CpLgRqie.js.map +1 -0
- package/dist/public/assets/_CpMGvmmC.js +2 -0
- package/dist/public/assets/_CpMGvmmC.js.map +1 -0
- package/dist/public/assets/_CpQYzh95.js +2 -0
- package/dist/public/assets/_CpQYzh95.js.map +1 -0
- package/dist/public/assets/_CpYNKFv52.js +2 -0
- package/dist/public/assets/_CpYNKFv52.js.map +1 -0
- package/dist/public/assets/_CpjhbsIL.js +2 -0
- package/dist/public/assets/_CpjhbsIL.js.map +1 -0
- package/dist/public/assets/_Cs2F2srj.js +2 -0
- package/dist/public/assets/_Cs2F2srj.js.map +1 -0
- package/dist/public/assets/_Cs6JJXT5.js +2 -0
- package/dist/public/assets/_Cs6JJXT5.js.map +1 -0
- package/dist/public/assets/_CsD5j6eV.js +2 -0
- package/dist/public/assets/_CsD5j6eV.js.map +1 -0
- package/dist/public/assets/_CsvMBhTu.js +2 -0
- package/dist/public/assets/_CsvMBhTu.js.map +1 -0
- package/dist/public/assets/_CswbzlgY.js +2 -0
- package/dist/public/assets/_CswbzlgY.js.map +1 -0
- package/dist/public/assets/_CtIoeUxU2.js +2 -0
- package/dist/public/assets/_CtIoeUxU2.js.map +1 -0
- package/dist/public/assets/_CtfBBspg2.js +2 -0
- package/dist/public/assets/_CtfBBspg2.js.map +1 -0
- package/dist/public/assets/_CtsyrtPq.js +2 -0
- package/dist/public/assets/_CtsyrtPq.js.map +1 -0
- package/dist/public/assets/_Cv5bFMCO.js +2 -0
- package/dist/public/assets/_Cv5bFMCO.js.map +1 -0
- package/dist/public/assets/_Cvrh5tZx2.js +2 -0
- package/dist/public/assets/_Cvrh5tZx2.js.map +1 -0
- package/dist/public/assets/_Cx8FnA3x.js +2 -0
- package/dist/public/assets/_Cx8FnA3x.js.map +1 -0
- package/dist/public/assets/_CxZEssPk2.js +2 -0
- package/dist/public/assets/_CxZEssPk2.js.map +1 -0
- package/dist/public/assets/_CyE5x4UV.js +2 -0
- package/dist/public/assets/_CyE5x4UV.js.map +1 -0
- package/dist/public/assets/_CyEgAFGc.js +2 -0
- package/dist/public/assets/_CyEgAFGc.js.map +1 -0
- package/dist/public/assets/_D-T_C697.js +2 -0
- package/dist/public/assets/_D-T_C697.js.map +1 -0
- package/dist/public/assets/_D-usSTwE2.js +2 -0
- package/dist/public/assets/_D-usSTwE2.js.map +1 -0
- package/dist/public/assets/_D0apG41V2.js +2 -0
- package/dist/public/assets/_D0apG41V2.js.map +1 -0
- package/dist/public/assets/_D1A_Heim2.js +2 -0
- package/dist/public/assets/_D1A_Heim2.js.map +1 -0
- package/dist/public/assets/_D271znPr.js +2 -0
- package/dist/public/assets/_D271znPr.js.map +1 -0
- package/dist/public/assets/_D4kbjPsP2.js +2 -0
- package/dist/public/assets/_D4kbjPsP2.js.map +1 -0
- package/dist/public/assets/_D7Lr4KcI2.js +2 -0
- package/dist/public/assets/_D7Lr4KcI2.js.map +1 -0
- package/dist/public/assets/_D7qyCx1q.js +2 -0
- package/dist/public/assets/_D7qyCx1q.js.map +1 -0
- package/dist/public/assets/_D80Fkn33.js +2 -0
- package/dist/public/assets/_D80Fkn33.js.map +1 -0
- package/dist/public/assets/_D81mTxaU2.js +2 -0
- package/dist/public/assets/_D81mTxaU2.js.map +1 -0
- package/dist/public/assets/_D8IpX4py2.js +2 -0
- package/dist/public/assets/_D8IpX4py2.js.map +1 -0
- package/dist/public/assets/_D8YarXPe.js +2 -0
- package/dist/public/assets/_D8YarXPe.js.map +1 -0
- package/dist/public/assets/_DB4EqR-F.js +2 -0
- package/dist/public/assets/_DB4EqR-F.js.map +1 -0
- package/dist/public/assets/_DBiDFlly.js +2 -0
- package/dist/public/assets/_DBiDFlly.js.map +1 -0
- package/dist/public/assets/_DBj4K9d_2.js +2 -0
- package/dist/public/assets/_DBj4K9d_2.js.map +1 -0
- package/dist/public/assets/_DCQb3MpD.js +2 -0
- package/dist/public/assets/_DCQb3MpD.js.map +1 -0
- package/dist/public/assets/_DDpmG2fV2.js +2 -0
- package/dist/public/assets/_DDpmG2fV2.js.map +1 -0
- package/dist/public/assets/_DExj1W_82.js +2 -0
- package/dist/public/assets/_DExj1W_82.js.map +1 -0
- package/dist/public/assets/_DGHpHOYJ2.js +2 -0
- package/dist/public/assets/_DGHpHOYJ2.js.map +1 -0
- package/dist/public/assets/_DHYfO66s2.js +2 -0
- package/dist/public/assets/_DHYfO66s2.js.map +1 -0
- package/dist/public/assets/_DHuY153x.js +2 -0
- package/dist/public/assets/_DHuY153x.js.map +1 -0
- package/dist/public/assets/_DI7wJmV3.js +2 -0
- package/dist/public/assets/_DI7wJmV3.js.map +1 -0
- package/dist/public/assets/_DI99ib-x2.js +2 -0
- package/dist/public/assets/_DI99ib-x2.js.map +1 -0
- package/dist/public/assets/_DJMQeKeT.js +2 -0
- package/dist/public/assets/_DJMQeKeT.js.map +1 -0
- package/dist/public/assets/_DKDBIGSx.js +2 -0
- package/dist/public/assets/_DKDBIGSx.js.map +1 -0
- package/dist/public/assets/_DKpUyyne2.js +2 -0
- package/dist/public/assets/_DKpUyyne2.js.map +1 -0
- package/dist/public/assets/_DLL8P-h_2.js +2 -0
- package/dist/public/assets/_DLL8P-h_2.js.map +1 -0
- package/dist/public/assets/_DLbMbJfH2.js +2 -0
- package/dist/public/assets/_DLbMbJfH2.js.map +1 -0
- package/dist/public/assets/_DMLJgrzU2.js +2 -0
- package/dist/public/assets/_DMLJgrzU2.js.map +1 -0
- package/dist/public/assets/_DMgNhnYS2.js +2 -0
- package/dist/public/assets/_DMgNhnYS2.js.map +1 -0
- package/dist/public/assets/_DMoTqEGO.js +2 -0
- package/dist/public/assets/_DMoTqEGO.js.map +1 -0
- package/dist/public/assets/_DNMTfnFr2.js +2 -0
- package/dist/public/assets/_DNMTfnFr2.js.map +1 -0
- package/dist/public/assets/_DO-qXg-I2.js +2 -0
- package/dist/public/assets/_DO-qXg-I2.js.map +1 -0
- package/dist/public/assets/_DOwzaHZ02.js +2 -0
- package/dist/public/assets/_DOwzaHZ02.js.map +1 -0
- package/dist/public/assets/_DQCgrYNe.js +2 -0
- package/dist/public/assets/_DQCgrYNe.js.map +1 -0
- package/dist/public/assets/_DQZ5AkYe.js +2 -0
- package/dist/public/assets/_DQZ5AkYe.js.map +1 -0
- package/dist/public/assets/_DQwYfKfQ2.js +2 -0
- package/dist/public/assets/_DQwYfKfQ2.js.map +1 -0
- package/dist/public/assets/_DQxkIbk2.js +2 -0
- package/dist/public/assets/_DQxkIbk2.js.map +1 -0
- package/dist/public/assets/_DRFjx7u42.js +2 -0
- package/dist/public/assets/_DRFjx7u42.js.map +1 -0
- package/dist/public/assets/_DSNQnXHK.js +2 -0
- package/dist/public/assets/_DSNQnXHK.js.map +1 -0
- package/dist/public/assets/_DVQuIRkW.js +2 -0
- package/dist/public/assets/_DVQuIRkW.js.map +1 -0
- package/dist/public/assets/_DVTAwKKz.js +2 -0
- package/dist/public/assets/_DVTAwKKz.js.map +1 -0
- package/dist/public/assets/_DW3nJb8Q.js +2 -0
- package/dist/public/assets/_DW3nJb8Q.js.map +1 -0
- package/dist/public/assets/_DWQbgPoS.js +2 -0
- package/dist/public/assets/_DWQbgPoS.js.map +1 -0
- package/dist/public/assets/_DX1BQOs82.js +2 -0
- package/dist/public/assets/_DX1BQOs82.js.map +1 -0
- package/dist/public/assets/_DXG-b-1a.js +2 -0
- package/dist/public/assets/_DXG-b-1a.js.map +1 -0
- package/dist/public/assets/_DXrisJhu.js +2 -0
- package/dist/public/assets/_DXrisJhu.js.map +1 -0
- package/dist/public/assets/_DXw9l8Rf.js +2 -0
- package/dist/public/assets/_DXw9l8Rf.js.map +1 -0
- package/dist/public/assets/_DYvRD3hg2.js +2 -0
- package/dist/public/assets/_DYvRD3hg2.js.map +1 -0
- package/dist/public/assets/_DZQUGsSH.js +2 -0
- package/dist/public/assets/_DZQUGsSH.js.map +1 -0
- package/dist/public/assets/_Db1ZVL_I.js +2 -0
- package/dist/public/assets/_Db1ZVL_I.js.map +1 -0
- package/dist/public/assets/_DcIDlBhZ.js +2 -0
- package/dist/public/assets/_DcIDlBhZ.js.map +1 -0
- package/dist/public/assets/_DdrHHSXu2.js +2 -0
- package/dist/public/assets/_DdrHHSXu2.js.map +1 -0
- package/dist/public/assets/_DdvCle-K2.js +2 -0
- package/dist/public/assets/_DdvCle-K2.js.map +1 -0
- package/dist/public/assets/_De_Heo4C.js +2 -0
- package/dist/public/assets/_De_Heo4C.js.map +1 -0
- package/dist/public/assets/_Df2xbC6M.js +2 -0
- package/dist/public/assets/_Df2xbC6M.js.map +1 -0
- package/dist/public/assets/_Dgaz7aur.js +2 -0
- package/dist/public/assets/_Dgaz7aur.js.map +1 -0
- package/dist/public/assets/_DgjMoLWr.js +2 -0
- package/dist/public/assets/_DgjMoLWr.js.map +1 -0
- package/dist/public/assets/_Dh228itO2.js +2 -0
- package/dist/public/assets/_Dh228itO2.js.map +1 -0
- package/dist/public/assets/_Dh5ihWbf.js +2 -0
- package/dist/public/assets/_Dh5ihWbf.js.map +1 -0
- package/dist/public/assets/_DhhofPvG.js +2 -0
- package/dist/public/assets/_DhhofPvG.js.map +1 -0
- package/dist/public/assets/_DhmEMT882.js +2 -0
- package/dist/public/assets/_DhmEMT882.js.map +1 -0
- package/dist/public/assets/_Dixweg8N.js +2 -0
- package/dist/public/assets/_Dixweg8N.js.map +1 -0
- package/dist/public/assets/_DjuaAJKi.js +2 -0
- package/dist/public/assets/_DjuaAJKi.js.map +1 -0
- package/dist/public/assets/_Dl-2e7rI2.js +2 -0
- package/dist/public/assets/_Dl-2e7rI2.js.map +1 -0
- package/dist/public/assets/_Dlh5hvp9.js +2 -0
- package/dist/public/assets/_Dlh5hvp9.js.map +1 -0
- package/dist/public/assets/_DluEY0Gj.js +2 -0
- package/dist/public/assets/_DluEY0Gj.js.map +1 -0
- package/dist/public/assets/_DmIc4jLQ.js +2 -0
- package/dist/public/assets/_DmIc4jLQ.js.map +1 -0
- package/dist/public/assets/_DnToyrRv2.js +2 -0
- package/dist/public/assets/_DnToyrRv2.js.map +1 -0
- package/dist/public/assets/_DqHOMS-s.js +2 -0
- package/dist/public/assets/_DqHOMS-s.js.map +1 -0
- package/dist/public/assets/_DqKBuwfJ2.js +2 -0
- package/dist/public/assets/_DqKBuwfJ2.js.map +1 -0
- package/dist/public/assets/_Dqh6l9VH.js +2 -0
- package/dist/public/assets/_Dqh6l9VH.js.map +1 -0
- package/dist/public/assets/_DqhwlshE2.js +2 -0
- package/dist/public/assets/_DqhwlshE2.js.map +1 -0
- package/dist/public/assets/_DsOwYco6.js +2 -0
- package/dist/public/assets/_DsOwYco6.js.map +1 -0
- package/dist/public/assets/_DsUTQ-LC2.js +2 -0
- package/dist/public/assets/_DsUTQ-LC2.js.map +1 -0
- package/dist/public/assets/_DswuEJGm2.js +2 -0
- package/dist/public/assets/_DswuEJGm2.js.map +1 -0
- package/dist/public/assets/_DtyUWVZz.js +2 -0
- package/dist/public/assets/_DtyUWVZz.js.map +1 -0
- package/dist/public/assets/_DuBRPxYg.js +2 -0
- package/dist/public/assets/_DuBRPxYg.js.map +1 -0
- package/dist/public/assets/_DuBYtv0r.js +2 -0
- package/dist/public/assets/_DuBYtv0r.js.map +1 -0
- package/dist/public/assets/_DvXPmvsu2.js +2 -0
- package/dist/public/assets/_DvXPmvsu2.js.map +1 -0
- package/dist/public/assets/_Dw6INy6H2.js +2 -0
- package/dist/public/assets/_Dw6INy6H2.js.map +1 -0
- package/dist/public/assets/_Dx-8-gkx.js +2 -0
- package/dist/public/assets/_Dx-8-gkx.js.map +1 -0
- package/dist/public/assets/_Dx2utMPo.js +2 -0
- package/dist/public/assets/_Dx2utMPo.js.map +1 -0
- package/dist/public/assets/_EUqPIrTm.js +2 -0
- package/dist/public/assets/_EUqPIrTm.js.map +1 -0
- package/dist/public/assets/_Fe1Jh2GI.js +2 -0
- package/dist/public/assets/_Fe1Jh2GI.js.map +1 -0
- package/dist/public/assets/_IvuFDN5E2.js +2 -0
- package/dist/public/assets/_IvuFDN5E2.js.map +1 -0
- package/dist/public/assets/_IyjqRm3v.js +2 -0
- package/dist/public/assets/_IyjqRm3v.js.map +1 -0
- package/dist/public/assets/_KFGFyKwG.js +2 -0
- package/dist/public/assets/_KFGFyKwG.js.map +1 -0
- package/dist/public/assets/_L8AbGenz.js +2 -0
- package/dist/public/assets/_L8AbGenz.js.map +1 -0
- package/dist/public/assets/_MrdJrrXF.js +2 -0
- package/dist/public/assets/_MrdJrrXF.js.map +1 -0
- package/dist/public/assets/_O90oeIOV2.js +2 -0
- package/dist/public/assets/_O90oeIOV2.js.map +1 -0
- package/dist/public/assets/_R8nAf1vR.js +2 -0
- package/dist/public/assets/_R8nAf1vR.js.map +1 -0
- package/dist/public/assets/_SCjQUq34.js +2 -0
- package/dist/public/assets/_SCjQUq34.js.map +1 -0
- package/dist/public/assets/_TlYgJqzm.js +2 -0
- package/dist/public/assets/_TlYgJqzm.js.map +1 -0
- package/dist/public/assets/_U0d_L8uA.js +2 -0
- package/dist/public/assets/_U0d_L8uA.js.map +1 -0
- package/dist/public/assets/_UdsmMDCL2.js +2 -0
- package/dist/public/assets/_UdsmMDCL2.js.map +1 -0
- package/dist/public/assets/_Uh3mh5XV2.js +2 -0
- package/dist/public/assets/_Uh3mh5XV2.js.map +1 -0
- package/dist/public/assets/_VUp2lXgN.js +2 -0
- package/dist/public/assets/_VUp2lXgN.js.map +1 -0
- package/dist/public/assets/_VXkXYg_d.js +2 -0
- package/dist/public/assets/_VXkXYg_d.js.map +1 -0
- package/dist/public/assets/_VbXTXTou2.js +2 -0
- package/dist/public/assets/_VbXTXTou2.js.map +1 -0
- package/dist/public/assets/__5a1GRtc.js +2 -0
- package/dist/public/assets/__5a1GRtc.js.map +1 -0
- package/dist/public/assets/__6rzW9BS.js +2 -0
- package/dist/public/assets/__6rzW9BS.js.map +1 -0
- package/dist/public/assets/__X_XdTYD.js +2 -0
- package/dist/public/assets/__X_XdTYD.js.map +1 -0
- package/dist/public/assets/_a4yckPl9.js +2 -0
- package/dist/public/assets/_a4yckPl9.js.map +1 -0
- package/dist/public/assets/_aMsaMD1D2.js +2 -0
- package/dist/public/assets/_aMsaMD1D2.js.map +1 -0
- package/dist/public/assets/_bTVj8UrX2.js +2 -0
- package/dist/public/assets/_bTVj8UrX2.js.map +1 -0
- package/dist/public/assets/_c_oH4hRZ.js +2 -0
- package/dist/public/assets/_c_oH4hRZ.js.map +1 -0
- package/dist/public/assets/_eJ-hLW7d2.js +2 -0
- package/dist/public/assets/_eJ-hLW7d2.js.map +1 -0
- package/dist/public/assets/_fvy_08gp2.js +2 -0
- package/dist/public/assets/_fvy_08gp2.js.map +1 -0
- package/dist/public/assets/_fwtXNY1n2.js +2 -0
- package/dist/public/assets/_fwtXNY1n2.js.map +1 -0
- package/dist/public/assets/_gzcpVVnB2.js +2 -0
- package/dist/public/assets/_gzcpVVnB2.js.map +1 -0
- package/dist/public/assets/_iUWkWK9o.js +2 -0
- package/dist/public/assets/_iUWkWK9o.js.map +1 -0
- package/dist/public/assets/_iXnhIJG72.js +2 -0
- package/dist/public/assets/_iXnhIJG72.js.map +1 -0
- package/dist/public/assets/_ilITqXS62.js +2 -0
- package/dist/public/assets/_ilITqXS62.js.map +1 -0
- package/dist/public/assets/_it7tAyoL2.js +2 -0
- package/dist/public/assets/_it7tAyoL2.js.map +1 -0
- package/dist/public/assets/_kIpfj7zU2.js +2 -0
- package/dist/public/assets/_kIpfj7zU2.js.map +1 -0
- package/dist/public/assets/_kZQmAZld.js +2 -0
- package/dist/public/assets/_kZQmAZld.js.map +1 -0
- package/dist/public/assets/_lWLdNTOI.js +2 -0
- package/dist/public/assets/_lWLdNTOI.js.map +1 -0
- package/dist/public/assets/_m5z1534W.js +2 -0
- package/dist/public/assets/_m5z1534W.js.map +1 -0
- package/dist/public/assets/_nFMaYfgc2.js +2 -0
- package/dist/public/assets/_nFMaYfgc2.js.map +1 -0
- package/dist/public/assets/_oM2G3aXe2.js +2 -0
- package/dist/public/assets/_oM2G3aXe2.js.map +1 -0
- package/dist/public/assets/_oeQT6MSM2.js +2 -0
- package/dist/public/assets/_oeQT6MSM2.js.map +1 -0
- package/dist/public/assets/_oqKa8noW.js +2 -0
- package/dist/public/assets/_oqKa8noW.js.map +1 -0
- package/dist/public/assets/_ot-7Btpt2.js +2 -0
- package/dist/public/assets/_ot-7Btpt2.js.map +1 -0
- package/dist/public/assets/_qD-0Kul2.js +2 -0
- package/dist/public/assets/_qD-0Kul2.js.map +1 -0
- package/dist/public/assets/_qdxAdBWQ2.js +2 -0
- package/dist/public/assets/_qdxAdBWQ2.js.map +1 -0
- package/dist/public/assets/_rLFTqkRN2.js +2 -0
- package/dist/public/assets/_rLFTqkRN2.js.map +1 -0
- package/dist/public/assets/_sB-x3p7T.js +2 -0
- package/dist/public/assets/_sB-x3p7T.js.map +1 -0
- package/dist/public/assets/_sltzmVWM2.js +2 -0
- package/dist/public/assets/_sltzmVWM2.js.map +1 -0
- package/dist/public/assets/_uh5ioxiV.js +2 -0
- package/dist/public/assets/_uh5ioxiV.js.map +1 -0
- package/dist/public/assets/_uhdI0v04.js +2 -0
- package/dist/public/assets/_uhdI0v04.js.map +1 -0
- package/dist/public/assets/_vGVdxbeo2.js +2 -0
- package/dist/public/assets/_vGVdxbeo2.js.map +1 -0
- package/dist/public/assets/_woXpYk--.js +2 -0
- package/dist/public/assets/_woXpYk--.js.map +1 -0
- package/dist/public/assets/_zf12oZj62.js +2 -0
- package/dist/public/assets/_zf12oZj62.js.map +1 -0
- package/dist/public/assets/index-KIy0rCx1.css +1 -0
- package/dist/public/assets/index-kv6gFctA.js +1612 -0
- package/dist/public/assets/index-kv6gFctA.js.map +1 -0
- package/dist/public/icon-192.png +0 -0
- package/dist/public/icon-512.png +0 -0
- package/dist/public/icon-maskable-512.png +0 -0
- package/dist/public/icon.svg +4 -0
- package/dist/public/manifest.webmanifest +35 -0
- package/dist/public/sw.js +48 -0
- package/install.sh +104 -0
- package/package.json +59 -0
- package/scripts/migrate.mjs +108 -0
package/README.md
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# work
|
|
2
|
+
|
|
3
|
+
A self-hosted web GUI for agentic dev workspaces — on desktop and as a mobile
|
|
4
|
+
PWA. Spin up multi-repo worktree workspaces, run coding agents (Claude Code,
|
|
5
|
+
Codex, Copilot, Cursor, Grok) or plain shells in real terminals, review diffs
|
|
6
|
+
and send feedback to agents, and watch PR/CI status — from any device.
|
|
7
|
+
|
|
8
|
+
- **Workspaces** — named directories of git worktrees (one per GitHub repo,
|
|
9
|
+
cloned from a shared bare-repo cache), all on a generated branch. Create,
|
|
10
|
+
add/remove repos, archive/restore, delete.
|
|
11
|
+
- **Sessions** — real CLIs in tmux, mirrored to the browser over WebSocket
|
|
12
|
+
(xterm.js). Sessions survive server restarts and phone locks; agent hooks
|
|
13
|
+
surface working / waiting / idle state at a glance.
|
|
14
|
+
- **Review** — a fast diff view across every repo in the workspace, with
|
|
15
|
+
line comments you can send straight into an agent session.
|
|
16
|
+
- **Mobile-first PWA** — installable, with a touch-tuned terminal (sticky
|
|
17
|
+
keyboard toggle, d-pad for arrows/tab/ctrl-c, momentum scrolling).
|
|
18
|
+
|
|
19
|
+
## Install (bare machine)
|
|
20
|
+
|
|
21
|
+
One command on a fresh Linux or macOS box — installs the system tools
|
|
22
|
+
(git, tmux, a compiler for node-pty), [mise](https://mise.jdx.dev) + node,
|
|
23
|
+
the published package, and the background service (systemd/launchd):
|
|
24
|
+
|
|
25
|
+
```sh
|
|
26
|
+
curl -fsSL https://cdn.jsdelivr.net/npm/@dylanpiercey/work/install.sh | bash
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Already have node (and git/tmux)? `npm i -g @dylanpiercey/work && work setup`
|
|
30
|
+
does the same minus the system tools. Update later with `work update` (or
|
|
31
|
+
re-run the installer).
|
|
32
|
+
|
|
33
|
+
## Develop
|
|
34
|
+
|
|
35
|
+
Requires Linux or macOS with `git`, `tmux`, `gh` (authenticated), and Node 22+.
|
|
36
|
+
The bootstrap script installs everything via [mise](https://mise.jdx.dev),
|
|
37
|
+
offers the agent CLIs, and runs `pnpm install`:
|
|
38
|
+
|
|
39
|
+
```sh
|
|
40
|
+
./scripts/bootstrap.sh
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Run
|
|
44
|
+
|
|
45
|
+
```sh
|
|
46
|
+
pnpm dev # http://localhost:7171
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
For a production build plus a background service (systemd on Linux, launchd on macOS):
|
|
50
|
+
|
|
51
|
+
```sh
|
|
52
|
+
./scripts/setup-prod.sh # build + install + start the service
|
|
53
|
+
./scripts/run-prod.sh # or: build with --no-service and run manually
|
|
54
|
+
./scripts/update.sh # later: pull latest, rebuild, restart
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
To reach it from other devices, put it behind something that terminates TLS
|
|
58
|
+
and authenticates — e.g. a Cloudflare Tunnel with Access, or Tailscale.
|
|
59
|
+
Everything (pages, API, and the `/term` websockets) serves from the single
|
|
60
|
+
app port, so route the whole hostname to it. Set
|
|
61
|
+
`WORK_ALLOWED_HOSTS=your.domain` so the dev server accepts the hostname.
|
|
62
|
+
|
|
63
|
+
> **Upgrading from the two-port layout:** older setups routed `/term/*` to a
|
|
64
|
+
> separate terminal port (7172). That port no longer exists — remove the
|
|
65
|
+
> `/term` rule from your tunnel/proxy config and send all traffic to the app
|
|
66
|
+
> port, or terminals will fail to connect.
|
|
67
|
+
|
|
68
|
+
## Configuration
|
|
69
|
+
|
|
70
|
+
| Variable | Default | Purpose |
|
|
71
|
+
| -------------------- | ----------------------- | ------------------------------------ |
|
|
72
|
+
| `WORK_ROOT` | `~/work` | Workspaces root (+ `.cache` bare repos) |
|
|
73
|
+
| `WORK_DATA_DIR` | `~/.local/share/work` | sqlite db and server state |
|
|
74
|
+
| `WORK_APP_PORT` | `7171` | HTTP server (app, assets, and `/term` websockets) |
|
|
75
|
+
| `WORK_ALLOWED_HOSTS` | — | Extra dev-server hostnames (comma-separated) |
|
|
76
|
+
| `WORK_USER` / `WORK_HOST` | current user/host | Branch-name prefix parts |
|
|
77
|
+
| `WORK_BRANCH_PREFIX` | `<user>-<host>` | Whole branch-name prefix, overriding the parts |
|
|
78
|
+
|
|
79
|
+
Ports and paths can be exported before `scripts/setup-prod.sh` to bake them into
|
|
80
|
+
the service. For settings that should outlive an update, put them in an untracked
|
|
81
|
+
`.env.local` at the repo root instead — `scripts/run-prod.sh` reads it on every
|
|
82
|
+
start (the dev server does not), only `WORK_*` names apply, and the
|
|
83
|
+
surrounding environment still takes precedence:
|
|
84
|
+
|
|
85
|
+
```sh
|
|
86
|
+
WORK_BRANCH_PREFIX=rturnq
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Optional: a `plan-usage` CLI on PATH enables the agent plan/quota usage panel.
|
|
90
|
+
|
|
91
|
+
## Layout on disk
|
|
92
|
+
|
|
93
|
+
- `~/work/<slug>-<id>/` — a workspace: one worktree per repo + generated
|
|
94
|
+
`AGENTS.md` (and `CLAUDE.md` symlink) encoding the conventions
|
|
95
|
+
- `~/work/.cache/github.com/<owner>/<repo>.git` — shared bare-repo cache
|
|
96
|
+
- `~/.local/share/work/work.db` — sqlite database (authoritative state)
|
|
97
|
+
|
|
98
|
+
Terminals live in a dedicated tmux server (`tmux -L work`), kept alive by a
|
|
99
|
+
transient systemd unit so app restarts never kill your sessions.
|
package/bin/work.mjs
ADDED
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// work CLI — ships with the npm package (no dependencies; plain node).
|
|
3
|
+
//
|
|
4
|
+
// work setup install/refresh the background service (+ optional tunnel)
|
|
5
|
+
// work start run the server in the foreground
|
|
6
|
+
// work update upgrade the npm package and refresh the service
|
|
7
|
+
// work version print the installed version
|
|
8
|
+
import { execFileSync, spawnSync } from "node:child_process";
|
|
9
|
+
import fs from "node:fs";
|
|
10
|
+
import os from "node:os";
|
|
11
|
+
import path from "node:path";
|
|
12
|
+
import { fileURLToPath } from "node:url";
|
|
13
|
+
import { createRequire } from "node:module";
|
|
14
|
+
|
|
15
|
+
const pkgRoot = path.dirname(path.dirname(fileURLToPath(import.meta.url)));
|
|
16
|
+
const pkg = JSON.parse(fs.readFileSync(path.join(pkgRoot, "package.json"), "utf8"));
|
|
17
|
+
const distEntry = path.join(pkgRoot, "dist", "index.mjs");
|
|
18
|
+
const appPort = process.env.WORK_APP_PORT || "7171";
|
|
19
|
+
|
|
20
|
+
const log = (msg) => console.log(`==> ${msg}`);
|
|
21
|
+
const warn = (msg) => console.warn(`warning: ${msg}`);
|
|
22
|
+
const die = (msg) => {
|
|
23
|
+
console.error(`error: ${msg}`);
|
|
24
|
+
process.exit(1);
|
|
25
|
+
};
|
|
26
|
+
const have = (cmd) =>
|
|
27
|
+
spawnSync(process.platform === "win32" ? "where" : "which", [cmd], {
|
|
28
|
+
stdio: "ignore",
|
|
29
|
+
}).status === 0;
|
|
30
|
+
const sh = (cmd, args, opts = {}) =>
|
|
31
|
+
execFileSync(cmd, args, { stdio: "inherit", ...opts });
|
|
32
|
+
|
|
33
|
+
const [, , command = "help", ...args] = process.argv;
|
|
34
|
+
const yes = args.includes("--yes") || args.includes("-y");
|
|
35
|
+
|
|
36
|
+
switch (command) {
|
|
37
|
+
case "start":
|
|
38
|
+
await start();
|
|
39
|
+
break;
|
|
40
|
+
case "setup":
|
|
41
|
+
await setup();
|
|
42
|
+
break;
|
|
43
|
+
case "update":
|
|
44
|
+
await update();
|
|
45
|
+
break;
|
|
46
|
+
case "version":
|
|
47
|
+
case "--version":
|
|
48
|
+
case "-v":
|
|
49
|
+
console.log(pkg.version);
|
|
50
|
+
break;
|
|
51
|
+
default:
|
|
52
|
+
console.log(
|
|
53
|
+
`work ${pkg.version}\n\nusage: work <setup|start|update|version>`,
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
async function start() {
|
|
58
|
+
if (!fs.existsSync(distEntry)) die(`missing ${distEntry}`);
|
|
59
|
+
process.env.PORT ||= appPort;
|
|
60
|
+
await import(distEntry);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
async function setup() {
|
|
64
|
+
// Runtime tools. The curl installer normally provides these; a plain
|
|
65
|
+
// `npm i -g` user may be missing them.
|
|
66
|
+
for (const tool of ["git", "tmux"]) {
|
|
67
|
+
if (!have(tool)) die(`${tool} not found — install it and re-run (the curl installer does this automatically)`);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Default toolset (mirrors DylanPiercey/start): gh for PR features plus
|
|
71
|
+
// the utilities agents reach for constantly. Static binaries via mise,
|
|
72
|
+
// each non-fatal, skipped when already on PATH.
|
|
73
|
+
if (have("mise")) {
|
|
74
|
+
const tools = [
|
|
75
|
+
"gh",
|
|
76
|
+
"ripgrep", // rg
|
|
77
|
+
"fd",
|
|
78
|
+
"jq",
|
|
79
|
+
"delta",
|
|
80
|
+
"ast-grep",
|
|
81
|
+
"hyperfine",
|
|
82
|
+
"fzf",
|
|
83
|
+
"bottom",
|
|
84
|
+
"pnpm",
|
|
85
|
+
];
|
|
86
|
+
const binOf = { ripgrep: "rg", "ast-grep": "sg", bottom: "btm" };
|
|
87
|
+
for (const tool of tools) {
|
|
88
|
+
if (have(binOf[tool] || tool)) continue;
|
|
89
|
+
log(`installing ${tool} via mise`);
|
|
90
|
+
if (spawnSync("mise", ["use", "-g", "-y", `${tool}@latest`], { stdio: "inherit" }).status !== 0) {
|
|
91
|
+
warn(`${tool} install failed (non-fatal)`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
} else if (!have("gh")) {
|
|
95
|
+
warn("gh not found and mise unavailable — PR features need gh; install it and re-run");
|
|
96
|
+
}
|
|
97
|
+
if (have("gh") && spawnSync("gh", ["auth", "status"], { stdio: "ignore" }).status !== 0) {
|
|
98
|
+
if (process.env.GH_TOKEN || process.env.GITHUB_TOKEN) {
|
|
99
|
+
log("gh will use GH_TOKEN from the environment");
|
|
100
|
+
} else if (yes) {
|
|
101
|
+
warn("gh is not authenticated — run `gh auth login` later");
|
|
102
|
+
} else {
|
|
103
|
+
log("authenticating gh (GitHub PRs/clones)");
|
|
104
|
+
sh("gh", ["auth", "login"]);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// One-shot cleanups between versions.
|
|
109
|
+
const migrate = path.join(pkgRoot, "scripts", "migrate.mjs");
|
|
110
|
+
if (fs.existsSync(migrate)) {
|
|
111
|
+
spawnSync(process.execPath, [migrate], { stdio: "inherit" });
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
installService();
|
|
115
|
+
maybeTunnel();
|
|
116
|
+
log(`done — http://localhost:${appPort}`);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
async function update() {
|
|
120
|
+
log("updating @dylanpiercey/work");
|
|
121
|
+
sh("npm", ["install", "-g", "@dylanpiercey/work@latest"]);
|
|
122
|
+
// Re-exec the (possibly new) CLI to finish with fresh code.
|
|
123
|
+
sh("work", ["setup", ...(yes ? ["--yes"] : [])]);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/** PATH baked into the service — it runs without a login shell. */
|
|
127
|
+
function servicePath() {
|
|
128
|
+
const home = os.homedir();
|
|
129
|
+
return [
|
|
130
|
+
path.dirname(process.execPath),
|
|
131
|
+
`${home}/.local/share/mise/shims`,
|
|
132
|
+
`${home}/.local/bin`,
|
|
133
|
+
"/opt/homebrew/bin",
|
|
134
|
+
"/usr/local/bin",
|
|
135
|
+
"/usr/bin",
|
|
136
|
+
"/bin",
|
|
137
|
+
].join(":");
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
function serviceEnv() {
|
|
141
|
+
const env = { PATH: servicePath(), PORT: appPort };
|
|
142
|
+
for (const key of ["WORK_APP_PORT", "WORK_ROOT", "WORK_DATA_DIR", "WORK_ALLOWED_HOSTS", "WORK_BIND"]) {
|
|
143
|
+
if (process.env[key]) env[key] = process.env[key];
|
|
144
|
+
}
|
|
145
|
+
return env;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
function installService() {
|
|
149
|
+
const cliPath = fileURLToPath(import.meta.url);
|
|
150
|
+
if (process.platform === "darwin") {
|
|
151
|
+
const plist = path.join(os.homedir(), "Library/LaunchAgents/dev.work.app.plist");
|
|
152
|
+
fs.mkdirSync(path.dirname(plist), { recursive: true });
|
|
153
|
+
fs.mkdirSync(path.join(os.homedir(), "Library/Logs"), { recursive: true });
|
|
154
|
+
const envXml = Object.entries(serviceEnv())
|
|
155
|
+
.map(([k, v]) => ` <key>${k}</key><string>${v}</string>`)
|
|
156
|
+
.join("\n");
|
|
157
|
+
fs.writeFileSync(
|
|
158
|
+
plist,
|
|
159
|
+
`<?xml version="1.0" encoding="UTF-8"?>
|
|
160
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
161
|
+
<plist version="1.0">
|
|
162
|
+
<dict>
|
|
163
|
+
<key>Label</key><string>dev.work.app</string>
|
|
164
|
+
<key>ProgramArguments</key>
|
|
165
|
+
<array><string>${process.execPath}</string><string>${cliPath}</string><string>start</string></array>
|
|
166
|
+
<key>RunAtLoad</key><true/>
|
|
167
|
+
<key>KeepAlive</key><true/>
|
|
168
|
+
<key>StandardOutPath</key><string>${os.homedir()}/Library/Logs/work.log</string>
|
|
169
|
+
<key>StandardErrorPath</key><string>${os.homedir()}/Library/Logs/work.log</string>
|
|
170
|
+
<key>EnvironmentVariables</key>
|
|
171
|
+
<dict>
|
|
172
|
+
${envXml}
|
|
173
|
+
</dict>
|
|
174
|
+
</dict>
|
|
175
|
+
</plist>
|
|
176
|
+
`,
|
|
177
|
+
);
|
|
178
|
+
log("installing launchd agent");
|
|
179
|
+
const uid = process.getuid();
|
|
180
|
+
spawnSync("launchctl", ["bootout", `gui/${uid}/dev.work.app`], { stdio: "ignore" });
|
|
181
|
+
const boot = spawnSync("launchctl", ["bootstrap", `gui/${uid}`, plist], { stdio: "ignore" });
|
|
182
|
+
if (boot.status !== 0 && spawnSync("launchctl", ["load", "-w", plist], { stdio: "ignore" }).status !== 0) {
|
|
183
|
+
warn(`could not load the agent (no GUI launchd session?) — run from a local terminal: launchctl bootstrap gui/$UID ${plist}`);
|
|
184
|
+
warn("or start manually: work start");
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
spawnSync("launchctl", ["kickstart", "-k", `gui/${uid}/dev.work.app`], { stdio: "ignore" });
|
|
188
|
+
log("manage with: launchctl {kickstart -k,print} gui/$UID/dev.work.app (logs: ~/Library/Logs/work.log)");
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
if (process.platform === "linux" && have("systemctl")) {
|
|
193
|
+
const unitDir = path.join(
|
|
194
|
+
process.env.XDG_CONFIG_HOME || path.join(os.homedir(), ".config"),
|
|
195
|
+
"systemd/user",
|
|
196
|
+
);
|
|
197
|
+
fs.mkdirSync(unitDir, { recursive: true });
|
|
198
|
+
const envLines = Object.entries(serviceEnv())
|
|
199
|
+
.map(([k, v]) => `Environment=${k}=${v}`)
|
|
200
|
+
.join("\n");
|
|
201
|
+
fs.writeFileSync(
|
|
202
|
+
path.join(unitDir, "work.service"),
|
|
203
|
+
`[Unit]
|
|
204
|
+
Description=work — agentic dev workspace GUI
|
|
205
|
+
|
|
206
|
+
[Service]
|
|
207
|
+
ExecStart=${process.execPath} ${cliPath} start
|
|
208
|
+
Restart=on-failure
|
|
209
|
+
${envLines}
|
|
210
|
+
|
|
211
|
+
[Install]
|
|
212
|
+
WantedBy=default.target
|
|
213
|
+
`,
|
|
214
|
+
);
|
|
215
|
+
log("installing systemd user service");
|
|
216
|
+
sh("systemctl", ["--user", "daemon-reload"]);
|
|
217
|
+
sh("systemctl", ["--user", "enable", "work.service"]);
|
|
218
|
+
sh("systemctl", ["--user", "restart", "work.service"]);
|
|
219
|
+
// Survive logout (best-effort; may need sudo on some systems).
|
|
220
|
+
spawnSync("loginctl", ["enable-linger", os.userInfo().username], { stdio: "ignore" });
|
|
221
|
+
log("manage with: systemctl --user {status,restart,stop} work.service");
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
warn("no service manager found — start manually with: work start");
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
function maybeTunnel() {
|
|
229
|
+
if (yes || have("cloudflared")) return;
|
|
230
|
+
console.log(`
|
|
231
|
+
To reach work from your phone or other devices, put it behind something
|
|
232
|
+
that terminates TLS and authenticates — e.g. a Cloudflare Tunnel with
|
|
233
|
+
Access (https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/)
|
|
234
|
+
pointing at http://localhost:${appPort}, or Tailscale. The server itself has
|
|
235
|
+
no auth of its own.`);
|
|
236
|
+
}
|