@mx-space/cli 0.2.0 → 0.2.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/dist/{Lexical.dev-DpU35QTu.mjs → Lexical.dev-CMevU1DO.mjs} +1 -1
- package/dist/{Lexical.dev-DpU35QTu.mjs.map → Lexical.dev-CMevU1DO.mjs.map} +1 -1
- package/dist/{Lexical.node-gYNDt_p9.mjs → Lexical.node-BR9e7Cyk.mjs} +2 -2
- package/dist/{Lexical.node-gYNDt_p9.mjs.map → Lexical.node-BR9e7Cyk.mjs.map} +1 -1
- package/dist/{Lexical.prod-t4c3bHV3.mjs → Lexical.prod-PUD-z9fY.mjs} +1 -1
- package/dist/{Lexical.prod-t4c3bHV3.mjs.map → Lexical.prod-PUD-z9fY.mjs.map} +1 -1
- package/dist/{LexicalClipboard.dev-CdeeWCIq.mjs → LexicalClipboard.dev-DZC2zppG.mjs} +6 -6
- package/dist/{LexicalClipboard.dev-CdeeWCIq.mjs.map → LexicalClipboard.dev-DZC2zppG.mjs.map} +1 -1
- package/dist/{LexicalClipboard.node-0e9GBL1g.mjs → LexicalClipboard.node-e5G1wVGb.mjs} +2 -2
- package/dist/{LexicalClipboard.node-0e9GBL1g.mjs.map → LexicalClipboard.node-e5G1wVGb.mjs.map} +1 -1
- package/dist/{LexicalClipboard.prod-CsCWYmV7.mjs → LexicalClipboard.prod-DE2azzIb.mjs} +6 -6
- package/dist/{LexicalClipboard.prod-CsCWYmV7.mjs.map → LexicalClipboard.prod-DE2azzIb.mjs.map} +1 -1
- package/dist/{LexicalCodeCore.dev-haI2cqH8.mjs → LexicalCodeCore.dev-gs--x55I.mjs} +3 -3
- package/dist/{LexicalCodeCore.dev-haI2cqH8.mjs.map → LexicalCodeCore.dev-gs--x55I.mjs.map} +1 -1
- package/dist/{LexicalCodeCore.prod-D_k7zuE5.mjs → LexicalCodeCore.prod-DPHOnyEj.mjs} +3 -3
- package/dist/{LexicalCodeCore.prod-D_k7zuE5.mjs.map → LexicalCodeCore.prod-DPHOnyEj.mjs.map} +1 -1
- package/dist/{LexicalDragon.dev-CAggdFh_.mjs → LexicalDragon.dev-CVe8bzVN.mjs} +3 -3
- package/dist/{LexicalDragon.dev-CAggdFh_.mjs.map → LexicalDragon.dev-CVe8bzVN.mjs.map} +1 -1
- package/dist/{LexicalDragon.node-QMR_wqJg.mjs → LexicalDragon.node-c7EHvcnK.mjs} +2 -2
- package/dist/{LexicalDragon.node-QMR_wqJg.mjs.map → LexicalDragon.node-c7EHvcnK.mjs.map} +1 -1
- package/dist/{LexicalDragon.prod-OssQhwS-.mjs → LexicalDragon.prod-D6KvqyLD.mjs} +3 -3
- package/dist/{LexicalDragon.prod-OssQhwS-.mjs.map → LexicalDragon.prod-D6KvqyLD.mjs.map} +1 -1
- package/dist/{LexicalExtension.dev-CtDZiMCU.mjs → LexicalExtension.dev-PDo8HyEw.mjs} +3 -3
- package/dist/{LexicalExtension.dev-CtDZiMCU.mjs.map → LexicalExtension.dev-PDo8HyEw.mjs.map} +1 -1
- package/dist/{LexicalExtension.node-BM0gh8zu.mjs → LexicalExtension.node-BKzjRb-0.mjs} +2 -2
- package/dist/{LexicalExtension.node-BM0gh8zu.mjs.map → LexicalExtension.node-BKzjRb-0.mjs.map} +1 -1
- package/dist/{LexicalExtension.prod-Ug6emhEO.mjs → LexicalExtension.prod-D0x_lX7q.mjs} +3 -3
- package/dist/{LexicalExtension.prod-Ug6emhEO.mjs.map → LexicalExtension.prod-D0x_lX7q.mjs.map} +1 -1
- package/dist/{LexicalHeadless.dev-D4yQpl_s.mjs → LexicalHeadless.dev-DBKcW82j.mjs} +2 -2
- package/dist/{LexicalHeadless.dev-D4yQpl_s.mjs.map → LexicalHeadless.dev-DBKcW82j.mjs.map} +1 -1
- package/dist/{LexicalHeadless.prod-jeN65B3k.mjs → LexicalHeadless.prod-D4nEh7cR.mjs} +2 -2
- package/dist/{LexicalHeadless.prod-jeN65B3k.mjs.map → LexicalHeadless.prod-D4nEh7cR.mjs.map} +1 -1
- package/dist/{LexicalHtml.dev-BdU1_ITQ.mjs → LexicalHtml.dev-vsWW05es.mjs} +4 -4
- package/dist/{LexicalHtml.dev-BdU1_ITQ.mjs.map → LexicalHtml.dev-vsWW05es.mjs.map} +1 -1
- package/dist/{LexicalHtml.node-DLtAh00E.mjs → LexicalHtml.node-CpibAfba.mjs} +2 -2
- package/dist/{LexicalHtml.node-DLtAh00E.mjs.map → LexicalHtml.node-CpibAfba.mjs.map} +1 -1
- package/dist/{LexicalHtml.prod-DdLE1HHT.mjs → LexicalHtml.prod-Bqz-3WAp.mjs} +4 -4
- package/dist/{LexicalHtml.prod-DdLE1HHT.mjs.map → LexicalHtml.prod-Bqz-3WAp.mjs.map} +1 -1
- package/dist/{LexicalLink.dev-DK87Biuy.mjs → LexicalLink.dev-BO0J0B1E.mjs} +4 -4
- package/dist/{LexicalLink.dev-DK87Biuy.mjs.map → LexicalLink.dev-BO0J0B1E.mjs.map} +1 -1
- package/dist/{LexicalLink.prod-fssuv6Sf.mjs → LexicalLink.prod-D66AhUCZ.mjs} +4 -4
- package/dist/{LexicalLink.prod-fssuv6Sf.mjs.map → LexicalLink.prod-D66AhUCZ.mjs.map} +1 -1
- package/dist/{LexicalList.dev-BJ4dr_rk.mjs → LexicalList.dev-DVGTWRk0.mjs} +4 -4
- package/dist/{LexicalList.dev-BJ4dr_rk.mjs.map → LexicalList.dev-DVGTWRk0.mjs.map} +1 -1
- package/dist/{LexicalList.prod-jWBbaWfi.mjs → LexicalList.prod-Bao7NGl7.mjs} +4 -4
- package/dist/{LexicalList.prod-jWBbaWfi.mjs.map → LexicalList.prod-Bao7NGl7.mjs.map} +1 -1
- package/dist/{LexicalMarkdown.dev-C8e-eh6y.mjs → LexicalMarkdown.dev-CRWkZwlp.mjs} +4 -4
- package/dist/{LexicalMarkdown.dev-C8e-eh6y.mjs.map → LexicalMarkdown.dev-CRWkZwlp.mjs.map} +1 -1
- package/dist/{LexicalMarkdown.prod-k73tZVb2.mjs → LexicalMarkdown.prod-tGG6js4r.mjs} +4 -4
- package/dist/{LexicalMarkdown.prod-k73tZVb2.mjs.map → LexicalMarkdown.prod-tGG6js4r.mjs.map} +1 -1
- package/dist/{LexicalRichText.dev-CrSqq3K-.mjs → LexicalRichText.dev-DPXfQePC.mjs} +6 -6
- package/dist/{LexicalRichText.dev-CrSqq3K-.mjs.map → LexicalRichText.dev-DPXfQePC.mjs.map} +1 -1
- package/dist/{LexicalRichText.node-B7k7wlQz.mjs → LexicalRichText.node-BEkm_YwY.mjs} +5 -5
- package/dist/{LexicalRichText.node-B7k7wlQz.mjs.map → LexicalRichText.node-BEkm_YwY.mjs.map} +1 -1
- package/dist/{LexicalRichText.prod-CqvyxQ9m.mjs → LexicalRichText.prod-DlfudC5w.mjs} +6 -6
- package/dist/{LexicalRichText.prod-CqvyxQ9m.mjs.map → LexicalRichText.prod-DlfudC5w.mjs.map} +1 -1
- package/dist/{LexicalSelection.dev-sNOHKHe_.mjs → LexicalSelection.dev-BVTArZ-b.mjs} +2 -2
- package/dist/{LexicalSelection.dev-sNOHKHe_.mjs.map → LexicalSelection.dev-BVTArZ-b.mjs.map} +1 -1
- package/dist/{LexicalSelection.node-Di7GwBCZ.mjs → LexicalSelection.node-CQ8iTYsz.mjs} +2 -2
- package/dist/{LexicalSelection.node-Di7GwBCZ.mjs.map → LexicalSelection.node-CQ8iTYsz.mjs.map} +1 -1
- package/dist/{LexicalSelection.prod-SWllPJop.mjs → LexicalSelection.prod-BZKGGs-G.mjs} +2 -2
- package/dist/{LexicalSelection.prod-SWllPJop.mjs.map → LexicalSelection.prod-BZKGGs-G.mjs.map} +1 -1
- package/dist/{LexicalTable.dev-CQkLHXJx.mjs → LexicalTable.dev-C-AOEpJn.mjs} +5 -5
- package/dist/{LexicalTable.dev-CQkLHXJx.mjs.map → LexicalTable.dev-C-AOEpJn.mjs.map} +1 -1
- package/dist/{LexicalTable.prod-BtqCwKSi.mjs → LexicalTable.prod-Cyn0qWxZ.mjs} +5 -5
- package/dist/{LexicalTable.prod-BtqCwKSi.mjs.map → LexicalTable.prod-Cyn0qWxZ.mjs.map} +1 -1
- package/dist/{LexicalUtils.dev-DiUpsXE8.mjs → LexicalUtils.dev-DRRDyAlS.mjs} +3 -3
- package/dist/{LexicalUtils.dev-DiUpsXE8.mjs.map → LexicalUtils.dev-DRRDyAlS.mjs.map} +1 -1
- package/dist/{LexicalUtils.node-CmK462d1.mjs → LexicalUtils.node-Dz-HANi6.mjs} +2 -2
- package/dist/{LexicalUtils.node-CmK462d1.mjs.map → LexicalUtils.node-Dz-HANi6.mjs.map} +1 -1
- package/dist/{LexicalUtils.prod-bWwV4GAF.mjs → LexicalUtils.prod-CmeHwh8W.mjs} +3 -3
- package/dist/{LexicalUtils.prod-bWwV4GAF.mjs.map → LexicalUtils.prod-CmeHwh8W.mjs.map} +1 -1
- package/dist/{auth-Duj8jJn9.mjs → auth-CAKmTDpF.mjs} +11 -11
- package/dist/auth-CAKmTDpF.mjs.map +1 -0
- package/dist/bin/mxs.d.mts +1 -1
- package/dist/bin/mxs.mjs +206 -61
- package/dist/bin/mxs.mjs.map +1 -1
- package/dist/{config-store-DmwX2iZU.mjs → config-store-B8_9iStL.mjs} +8 -7
- package/dist/config-store-B8_9iStL.mjs.map +1 -0
- package/dist/{create-Cqt1rrSZ.mjs → create-5wbU7IQh.mjs} +5 -5
- package/dist/{create-Cqt1rrSZ.mjs.map → create-5wbU7IQh.mjs.map} +1 -1
- package/dist/{create-_H8YO7ze.mjs → create-Bs6K7AyQ.mjs} +3 -3
- package/dist/{create-_H8YO7ze.mjs.map → create-Bs6K7AyQ.mjs.map} +1 -1
- package/dist/{create-DAt3FXLf.mjs → create-DBReocgJ.mjs} +5 -5
- package/dist/{create-DAt3FXLf.mjs.map → create-DBReocgJ.mjs.map} +1 -1
- package/dist/{create-kYlrs4d6.mjs → create-DGVaE0_S.mjs} +4 -4
- package/dist/{create-kYlrs4d6.mjs.map → create-DGVaE0_S.mjs.map} +1 -1
- package/dist/{create-D7cR9xcN.mjs → create-lLFZuMsz.mjs} +3 -3
- package/dist/{create-D7cR9xcN.mjs.map → create-lLFZuMsz.mjs.map} +1 -1
- package/dist/{delete-D_NRteuq.mjs → delete-6tkhHQDp.mjs} +5 -5
- package/dist/delete-6tkhHQDp.mjs.map +1 -0
- package/dist/{delete-ZIjkquZj.mjs → delete-CRFxitDN.mjs} +6 -6
- package/dist/delete-CRFxitDN.mjs.map +1 -0
- package/dist/{delete-DVNebWqO.mjs → delete-DU2Hvsy8.mjs} +5 -5
- package/dist/delete-DU2Hvsy8.mjs.map +1 -0
- package/dist/{delete-aCVSWuKi.mjs → delete-nJmHtvfq.mjs} +6 -6
- package/dist/delete-nJmHtvfq.mjs.map +1 -0
- package/dist/{delete-DmKPzzsQ.mjs → delete-tJhXI8s4.mjs} +5 -5
- package/dist/delete-tJhXI8s4.mjs.map +1 -0
- package/dist/{document-output-BtY8T7eY.mjs → document-output-BFJdwPV0.mjs} +5 -5
- package/dist/document-output-BFJdwPV0.mjs.map +1 -0
- package/dist/{edit-DjRE8Gk-.mjs → edit-BMjTbPQO.mjs} +5 -5
- package/dist/edit-BMjTbPQO.mjs.map +1 -0
- package/dist/{edit-R6H5RtWd.mjs → edit-BnEmMmv6.mjs} +9 -9
- package/dist/edit-BnEmMmv6.mjs.map +1 -0
- package/dist/{edit-CHCuoiWT.mjs → edit-C4vRSmRy.mjs} +9 -9
- package/dist/{edit-CHCuoiWT.mjs.map → edit-C4vRSmRy.mjs.map} +1 -1
- package/dist/{edit-BWX7X4sy.mjs → edit-CQsW5gnk.mjs} +8 -8
- package/dist/{edit-BWX7X4sy.mjs.map → edit-CQsW5gnk.mjs.map} +1 -1
- package/dist/{editor-Dywlo4-8.mjs → editor-BIw1ALTF.mjs} +4 -4
- package/dist/editor-BIw1ALTF.mjs.map +1 -0
- package/dist/{envelope-overlays-D1gmGVe5.mjs → envelope-overlays-DXXygxdF.mjs} +2 -2
- package/dist/{envelope-overlays-D1gmGVe5.mjs.map → envelope-overlays-DXXygxdF.mjs.map} +1 -1
- package/dist/{get-IQQv4_rP.mjs → get-B3Y5hAAO.mjs} +3 -3
- package/dist/{get-IQQv4_rP.mjs.map → get-B3Y5hAAO.mjs.map} +1 -1
- package/dist/{get-DbH58EkF.mjs → get-C5fmd5Vf.mjs} +4 -4
- package/dist/{get-DbH58EkF.mjs.map → get-C5fmd5Vf.mjs.map} +1 -1
- package/dist/{get-CkBqVyGi.mjs → get-Cdp2tmwz.mjs} +6 -6
- package/dist/get-Cdp2tmwz.mjs.map +1 -0
- package/dist/{get-DNdde54z.mjs → get-D18ChSKU.mjs} +3 -3
- package/dist/{get-DNdde54z.mjs.map → get-D18ChSKU.mjs.map} +1 -1
- package/dist/{get-xtByxURm.mjs → get-NSHTGu4Y.mjs} +4 -4
- package/dist/{get-xtByxURm.mjs.map → get-NSHTGu4Y.mjs.map} +1 -1
- package/dist/{get-CiLnUGHw.mjs → get-XBPJr95m.mjs} +4 -4
- package/dist/{get-CiLnUGHw.mjs.map → get-XBPJr95m.mjs.map} +1 -1
- package/dist/index.d.mts +40 -11
- package/dist/index.mjs +11 -10
- package/dist/{list-Bnlg9SfR.mjs → list-B6703n9X.mjs} +3 -3
- package/dist/{list-Bnlg9SfR.mjs.map → list-B6703n9X.mjs.map} +1 -1
- package/dist/{list-lmpHwOQx.mjs → list-BtNocJhc.mjs} +3 -3
- package/dist/{list-lmpHwOQx.mjs.map → list-BtNocJhc.mjs.map} +1 -1
- package/dist/{list-DW5TcGxS.mjs → list-C9dXrU9H.mjs} +3 -3
- package/dist/{list-DW5TcGxS.mjs.map → list-C9dXrU9H.mjs.map} +1 -1
- package/dist/{list-C6z1iw4a.mjs → list-CcwcYZgN.mjs} +3 -3
- package/dist/{list-C6z1iw4a.mjs.map → list-CcwcYZgN.mjs.map} +1 -1
- package/dist/{list-CD9j9did.mjs → list-Ctc8b5gT.mjs} +3 -3
- package/dist/{list-CD9j9did.mjs.map → list-Ctc8b5gT.mjs.map} +1 -1
- package/dist/{list-DVMtBAHG.mjs → list-b60JzCTw.mjs} +3 -3
- package/dist/{list-DVMtBAHG.mjs.map → list-b60JzCTw.mjs.map} +1 -1
- package/dist/{litexml-codec-D-1oggXL.mjs → litexml-codec-CfIxcPG0.mjs} +9 -9
- package/dist/{litexml-codec-D-1oggXL.mjs.map → litexml-codec-CfIxcPG0.mjs.map} +1 -1
- package/dist/{login-D-SoeV01.mjs → login-bZx4HaVs.mjs} +5 -4
- package/dist/{login-D-SoeV01.mjs.map → login-bZx4HaVs.mjs.map} +1 -1
- package/dist/{logout-D63ZU-1Q.mjs → logout-C0Dzitsu.mjs} +4 -3
- package/dist/logout-C0Dzitsu.mjs.map +1 -0
- package/dist/{ls-Bz3BCcwU.mjs → ls-wMiTXZPQ.mjs} +3 -2
- package/dist/{ls-Bz3BCcwU.mjs.map → ls-wMiTXZPQ.mjs.map} +1 -1
- package/dist/{mark-N-IpKK17.mjs → mark-Dh9BErsf.mjs} +5 -4
- package/dist/mark-Dh9BErsf.mjs.map +1 -0
- package/dist/{onboarding-FPMcuqn8.mjs → onboarding-Bw_I8qpf.mjs} +17 -15
- package/dist/onboarding-Bw_I8qpf.mjs.map +1 -0
- package/dist/{output-DQMhacTo.d.mts → output-D2dDlyV2.d.mts} +1 -1
- package/dist/output-vzequvhd.mjs +163 -0
- package/dist/output-vzequvhd.mjs.map +1 -0
- package/dist/{payload-CjlZ9CeZ.mjs → payload-CO4zbNr8.mjs} +17 -17
- package/dist/payload-CO4zbNr8.mjs.map +1 -0
- package/dist/profile-CNe2uWJi.mjs +172 -0
- package/dist/profile-CNe2uWJi.mjs.map +1 -0
- package/dist/{publish-yuM6YGSb.mjs → publish-CzzucXQq.mjs} +4 -4
- package/dist/{publish-yuM6YGSb.mjs.map → publish-CzzucXQq.mjs.map} +1 -1
- package/dist/{publish-C9O5obZ6.mjs → publish-DRQkpxsz.mjs} +4 -4
- package/dist/{publish-C9O5obZ6.mjs.map → publish-DRQkpxsz.mjs.map} +1 -1
- package/dist/{resolve-TBYXBS4i.mjs → resolve-BYg5Gees.mjs} +5 -5
- package/dist/resolve-BYg5Gees.mjs.map +1 -0
- package/dist/{resolve-U6RJ3AnQ.mjs → resolve-BlpMdnaM.mjs} +4 -4
- package/dist/resolve-BlpMdnaM.mjs.map +1 -0
- package/dist/{resolve-DIu9N2sD.mjs → resolve-CUsHGcb-.mjs} +4 -4
- package/dist/resolve-CUsHGcb-.mjs.map +1 -0
- package/dist/{resolve-helpers-C7PIVziv.mjs → resolve-helpers-CoHYa2uk.mjs} +2 -2
- package/dist/{resolve-helpers-C7PIVziv.mjs.map → resolve-helpers-CoHYa2uk.mjs.map} +1 -1
- package/dist/{resolve-B4-fMQ6I.mjs → resolve-jdb1VqAG.mjs} +5 -5
- package/dist/resolve-jdb1VqAG.mjs.map +1 -0
- package/dist/{rm-D9GvLhhF.mjs → rm-D-2iW1Cr.mjs} +5 -4
- package/dist/rm-D-2iW1Cr.mjs.map +1 -0
- package/dist/run-Dnax6uhZ.mjs +130 -0
- package/dist/run-Dnax6uhZ.mjs.map +1 -0
- package/dist/self-update-CZywTwGd.mjs +1610 -0
- package/dist/self-update-CZywTwGd.mjs.map +1 -0
- package/dist/{set-jD79hpuF.mjs → set-Dk28LAy5.mjs} +5 -5
- package/dist/set-Dk28LAy5.mjs.map +1 -0
- package/dist/{shared-SryY2QPY.mjs → shared-d0_6ZPn_.mjs} +5 -5
- package/dist/shared-d0_6ZPn_.mjs.map +1 -0
- package/dist/{show-C5Zk0tcK.mjs → show-DScu6mXz.mjs} +5 -4
- package/dist/show-DScu6mXz.mjs.map +1 -0
- package/dist/{status-evZpPR3N.mjs → status-8F6tgphP.mjs} +4 -3
- package/dist/{status-evZpPR3N.mjs.map → status-8F6tgphP.mjs.map} +1 -1
- package/dist/{update-hhAcAz_M.mjs → update-B1LGxV0n.mjs} +6 -6
- package/dist/{update-hhAcAz_M.mjs.map → update-B1LGxV0n.mjs.map} +1 -1
- package/dist/{update--7NPzL_w.mjs → update-CXetpFT3.mjs} +4 -4
- package/dist/{update--7NPzL_w.mjs.map → update-CXetpFT3.mjs.map} +1 -1
- package/dist/{update-CPJXcOg_.mjs → update-Dr4BW8U-.mjs} +6 -6
- package/dist/{update-CPJXcOg_.mjs.map → update-Dr4BW8U-.mjs.map} +1 -1
- package/dist/{update-0q5hxJFh.mjs → update-bqcHRJPC.mjs} +6 -6
- package/dist/update-bqcHRJPC.mjs.map +1 -0
- package/dist/{update-DN78pXGZ.mjs → update-dBtzzmkN.mjs} +5 -5
- package/dist/update-dBtzzmkN.mjs.map +1 -0
- package/dist/{use-CHDCEe38.mjs → use-D7eKESSW.mjs} +6 -5
- package/dist/use-D7eKESSW.mjs.map +1 -0
- package/dist/{whoami-BHDYyY5D.mjs → whoami-CKSNd6zL.mjs} +5 -4
- package/dist/whoami-CKSNd6zL.mjs.map +1 -0
- package/package.json +15 -13
- package/LICENSE +0 -33
- package/dist/auth-Duj8jJn9.mjs.map +0 -1
- package/dist/config-store-DmwX2iZU.mjs.map +0 -1
- package/dist/delete-DVNebWqO.mjs.map +0 -1
- package/dist/delete-D_NRteuq.mjs.map +0 -1
- package/dist/delete-DmKPzzsQ.mjs.map +0 -1
- package/dist/delete-ZIjkquZj.mjs.map +0 -1
- package/dist/delete-aCVSWuKi.mjs.map +0 -1
- package/dist/document-output-BtY8T7eY.mjs.map +0 -1
- package/dist/edit-DjRE8Gk-.mjs.map +0 -1
- package/dist/edit-R6H5RtWd.mjs.map +0 -1
- package/dist/editor-Dywlo4-8.mjs.map +0 -1
- package/dist/get-CkBqVyGi.mjs.map +0 -1
- package/dist/logout-D63ZU-1Q.mjs.map +0 -1
- package/dist/mark-N-IpKK17.mjs.map +0 -1
- package/dist/onboarding-FPMcuqn8.mjs.map +0 -1
- package/dist/output-Dg8PISJM.mjs +0 -299
- package/dist/output-Dg8PISJM.mjs.map +0 -1
- package/dist/payload-CjlZ9CeZ.mjs.map +0 -1
- package/dist/resolve-B4-fMQ6I.mjs.map +0 -1
- package/dist/resolve-DIu9N2sD.mjs.map +0 -1
- package/dist/resolve-TBYXBS4i.mjs.map +0 -1
- package/dist/resolve-U6RJ3AnQ.mjs.map +0 -1
- package/dist/rm-D9GvLhhF.mjs.map +0 -1
- package/dist/set-jD79hpuF.mjs.map +0 -1
- package/dist/shared-SryY2QPY.mjs.map +0 -1
- package/dist/show-C5Zk0tcK.mjs.map +0 -1
- package/dist/update-0q5hxJFh.mjs.map +0 -1
- package/dist/update-DN78pXGZ.mjs.map +0 -1
- package/dist/use-CHDCEe38.mjs.map +0 -1
- package/dist/whoami-BHDYyY5D.mjs.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { r as isSnowflakeId } from "./resolve-
|
|
3
|
-
import { n as resolveContext, t as buildApiClient } from "./shared-
|
|
1
|
+
import { c as MxsErrorCode, i as emitSuccess, s as MxsError } from "./output-vzequvhd.mjs";
|
|
2
|
+
import { r as isSnowflakeId } from "./resolve-CUsHGcb-.mjs";
|
|
3
|
+
import { n as resolveContext, t as buildApiClient } from "./shared-d0_6ZPn_.mjs";
|
|
4
4
|
//#region src/commands/topic/update.ts
|
|
5
5
|
async function run(slugOrId, opts, flags, out) {
|
|
6
6
|
const body = {};
|
|
@@ -26,7 +26,7 @@ async function resolveId(client, slugOrId) {
|
|
|
26
26
|
if (isSnowflakeId(slugOrId)) return slugOrId;
|
|
27
27
|
const res = await client.request(`/topics/slug/${slugOrId}`);
|
|
28
28
|
if (!res.data?.id) throw new MxsError({
|
|
29
|
-
code:
|
|
29
|
+
code: MxsErrorCode.ResourceNotFound,
|
|
30
30
|
message: `topic not found: ${slugOrId}`
|
|
31
31
|
});
|
|
32
32
|
return res.data.id;
|
|
@@ -34,4 +34,4 @@ async function resolveId(client, slugOrId) {
|
|
|
34
34
|
//#endregion
|
|
35
35
|
export { run };
|
|
36
36
|
|
|
37
|
-
//# sourceMappingURL=update-
|
|
37
|
+
//# sourceMappingURL=update-dBtzzmkN.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-dBtzzmkN.mjs","names":[],"sources":["../src/commands/topic/update.ts"],"sourcesContent":["import type { ApiClient } from '../../core/api-client'\nimport { MxsError, MxsErrorCode } from '../../core/errors'\nimport { emitSuccess, type OutputOptions } from '../../core/output'\nimport { isSnowflakeId } from '../../core/resolve'\nimport {\n buildApiClient,\n type GlobalFlags,\n resolveContext,\n} from '../internal/shared'\n\nexport interface TopicUpdateFlags {\n name?: string\n slug?: string\n description?: string\n icon?: string\n}\n\nexport async function run(\n slugOrId: string,\n opts: TopicUpdateFlags,\n flags: GlobalFlags,\n out: OutputOptions,\n) {\n const body: Record<string, unknown> = {}\n if (opts.name) body.name = opts.name\n if (opts.slug) body.slug = opts.slug\n if (opts.description) body.description = opts.description\n if (opts.icon) body.icon = opts.icon\n if (flags.dryRun) {\n emitSuccess({ id: slugOrId, body }, out)\n return\n }\n const ctx = await resolveContext(flags, out)\n const client = buildApiClient(ctx, flags)\n const id = await resolveId(client, slugOrId)\n const res = await client.request(`/topics/${id}`, {\n method: 'PATCH',\n body,\n })\n emitSuccess(res.data, out)\n}\n\nasync function resolveId(client: ApiClient, slugOrId: string): Promise<string> {\n if (isSnowflakeId(slugOrId)) return slugOrId\n const res = await client.request<{ id?: string }>(`/topics/slug/${slugOrId}`)\n if (!res.data?.id)\n throw new MxsError({\n code: MxsErrorCode.ResourceNotFound,\n message: `topic not found: ${slugOrId}`,\n })\n return res.data.id\n}\n"],"mappings":";;;;AAiBA,eAAsB,IACpB,UACA,MACA,OACA,KACA;CACA,MAAM,OAAgC,CAAC;CACvC,IAAI,KAAK,MAAM,KAAK,OAAO,KAAK;CAChC,IAAI,KAAK,MAAM,KAAK,OAAO,KAAK;CAChC,IAAI,KAAK,aAAa,KAAK,cAAc,KAAK;CAC9C,IAAI,KAAK,MAAM,KAAK,OAAO,KAAK;CAChC,IAAI,MAAM,QAAQ;EAChB,YAAY;GAAE,IAAI;GAAU;EAAK,GAAG,GAAG;EACvC;CACF;CAEA,MAAM,SAAS,eAAe,MADZ,eAAe,OAAO,GAAG,GACR,KAAK;CACxC,MAAM,KAAK,MAAM,UAAU,QAAQ,QAAQ;CAK3C,aAAY,MAJM,OAAO,QAAQ,WAAW,MAAM;EAChD,QAAQ;EACR;CACF,CAAC,GACe,MAAM,GAAG;AAC3B;AAEA,eAAe,UAAU,QAAmB,UAAmC;CAC7E,IAAI,cAAc,QAAQ,GAAG,OAAO;CACpC,MAAM,MAAM,MAAM,OAAO,QAAyB,gBAAgB,UAAU;CAC5E,IAAI,CAAC,IAAI,MAAM,IACb,MAAM,IAAI,SAAS;EACjB,MAAM,aAAa;EACnB,SAAS,oBAAoB;CAC/B,CAAC;CACH,OAAO,IAAI,KAAK;AAClB"}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { c as MxsErrorCode, r as emitInfo, s as MxsError } from "./output-vzequvhd.mjs";
|
|
2
|
+
import { f as setCurrentProfile, p as validateProfileName } from "./profile-CNe2uWJi.mjs";
|
|
2
3
|
//#region src/commands/profile/use.ts
|
|
3
4
|
async function run(name, _flags, out) {
|
|
4
5
|
try {
|
|
5
6
|
validateProfileName(name);
|
|
6
7
|
} catch {
|
|
7
8
|
throw new MxsError({
|
|
8
|
-
code:
|
|
9
|
+
code: MxsErrorCode.ProfileInvalidName,
|
|
9
10
|
message: `'${name}' is not a valid profile name`,
|
|
10
11
|
hint: "profile name must match ^[a-z0-9_-]{1,32}$ and must not be \"current\""
|
|
11
12
|
});
|
|
@@ -13,8 +14,8 @@ async function run(name, _flags, out) {
|
|
|
13
14
|
try {
|
|
14
15
|
await setCurrentProfile(name);
|
|
15
16
|
} catch (err) {
|
|
16
|
-
if (err?.code ===
|
|
17
|
-
code:
|
|
17
|
+
if (err?.code === MxsErrorCode.ValidationFailed) throw new MxsError({
|
|
18
|
+
code: MxsErrorCode.ProfileNotFound,
|
|
18
19
|
message: `profile '${name}' does not exist`,
|
|
19
20
|
hint: "run `mxs profile ls` to see available profiles, or `mxs auth login --profile <name>` to create one"
|
|
20
21
|
});
|
|
@@ -25,4 +26,4 @@ async function run(name, _flags, out) {
|
|
|
25
26
|
//#endregion
|
|
26
27
|
export { run };
|
|
27
28
|
|
|
28
|
-
//# sourceMappingURL=use-
|
|
29
|
+
//# sourceMappingURL=use-D7eKESSW.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-D7eKESSW.mjs","names":[],"sources":["../src/commands/profile/use.ts"],"sourcesContent":["import { MxsError, MxsErrorCode } from '../../core/errors'\nimport { emitInfo, type OutputOptions } from '../../core/output'\nimport { setCurrentProfile, validateProfileName } from '../../core/profile'\nimport type { GlobalFlags } from '../internal/shared'\n\nexport async function run(\n name: string,\n _flags: GlobalFlags,\n out: OutputOptions,\n) {\n try {\n validateProfileName(name)\n } catch {\n throw new MxsError({\n code: MxsErrorCode.ProfileInvalidName,\n message: `'${name}' is not a valid profile name`,\n hint: 'profile name must match ^[a-z0-9_-]{1,32}$ and must not be \"current\"',\n })\n }\n\n try {\n await setCurrentProfile(name)\n } catch (err: any) {\n if (err?.code === MxsErrorCode.ValidationFailed) {\n throw new MxsError({\n code: MxsErrorCode.ProfileNotFound,\n message: `profile '${name}' does not exist`,\n hint: 'run `mxs profile ls` to see available profiles, or `mxs auth login --profile <name>` to create one',\n })\n }\n throw err\n }\n\n emitInfo(`mxs: active profile is now '${name}'`, out)\n}\n"],"mappings":";;;AAKA,eAAsB,IACpB,MACA,QACA,KACA;CACA,IAAI;EACF,oBAAoB,IAAI;CAC1B,QAAQ;EACN,MAAM,IAAI,SAAS;GACjB,MAAM,aAAa;GACnB,SAAS,IAAI,KAAK;GAClB,MAAM;EACR,CAAC;CACH;CAEA,IAAI;EACF,MAAM,kBAAkB,IAAI;CAC9B,SAAS,KAAU;EACjB,IAAI,KAAK,SAAS,aAAa,kBAC7B,MAAM,IAAI,SAAS;GACjB,MAAM,aAAa;GACnB,SAAS,YAAY,KAAK;GAC1B,MAAM;EACR,CAAC;EAEH,MAAM;CACR;CAEA,SAAS,+BAA+B,KAAK,IAAI,GAAG;AACtD"}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { c as MxsErrorCode, i as emitSuccess, s as MxsError } from "./output-vzequvhd.mjs";
|
|
2
|
+
import { u as readProfileCredentials } from "./profile-CNe2uWJi.mjs";
|
|
3
|
+
import { n as resolveContext, t as buildApiClient } from "./shared-d0_6ZPn_.mjs";
|
|
3
4
|
//#region src/commands/auth/whoami.ts
|
|
4
5
|
async function run(flags, out) {
|
|
5
6
|
const ctx = await resolveContext(flags, out);
|
|
6
7
|
const cred = ctx.profileName ? await readProfileCredentials(ctx.profileName) : null;
|
|
7
8
|
if (!cred && !ctx.token && !ctx.apiKey) throw new MxsError({
|
|
8
|
-
code:
|
|
9
|
+
code: MxsErrorCode.AuthMissing,
|
|
9
10
|
message: "not authenticated",
|
|
10
11
|
hint: "run `mxs auth login`"
|
|
11
12
|
});
|
|
@@ -18,4 +19,4 @@ async function run(flags, out) {
|
|
|
18
19
|
//#endregion
|
|
19
20
|
export { run };
|
|
20
21
|
|
|
21
|
-
//# sourceMappingURL=whoami-
|
|
22
|
+
//# sourceMappingURL=whoami-CKSNd6zL.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whoami-CKSNd6zL.mjs","names":[],"sources":["../src/commands/auth/whoami.ts"],"sourcesContent":["import { MxsError, MxsErrorCode } from '../../core/errors'\nimport { emitSuccess, type OutputOptions } from '../../core/output'\nimport { readProfileCredentials } from '../../core/profile'\nimport {\n buildApiClient,\n type GlobalFlags,\n resolveContext,\n} from '../internal/shared'\n\nexport async function run(flags: GlobalFlags, out: OutputOptions) {\n const ctx = await resolveContext(flags, out)\n const cred = ctx.profileName\n ? await readProfileCredentials(ctx.profileName)\n : null\n if (!cred && !ctx.token && !ctx.apiKey) {\n throw new MxsError({\n code: MxsErrorCode.AuthMissing,\n message: 'not authenticated',\n hint: 'run `mxs auth login`',\n })\n }\n const client = buildApiClient(ctx, flags)\n const session =\n ctx.token && !ctx.apiKey\n ? await client.request('/auth/session').then((res) => res.data)\n : null\n emitSuccess(\n {\n user: session ?? cred?.user ?? null,\n api_url: ctx.apiUrl,\n },\n out,\n )\n}\n"],"mappings":";;;;AASA,eAAsB,IAAI,OAAoB,KAAoB;CAChE,MAAM,MAAM,MAAM,eAAe,OAAO,GAAG;CAC3C,MAAM,OAAO,IAAI,cACb,MAAM,uBAAuB,IAAI,WAAW,IAC5C;CACJ,IAAI,CAAC,QAAQ,CAAC,IAAI,SAAS,CAAC,IAAI,QAC9B,MAAM,IAAI,SAAS;EACjB,MAAM,aAAa;EACnB,SAAS;EACT,MAAM;CACR,CAAC;CAEH,MAAM,SAAS,eAAe,KAAK,KAAK;CAKxC,YACE;EACE,OALF,IAAI,SAAS,CAAC,IAAI,SACd,MAAM,OAAO,QAAQ,eAAe,EAAE,MAAM,QAAQ,IAAI,IAAI,IAC5D,SAGe,MAAM,QAAQ;EAC/B,SAAS,IAAI;CACf,GACA,GACF;AACF"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mx-space/cli",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "Command line interface for mx-space (mx-core) — auth, content, configuration",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"mx-space",
|
|
@@ -46,32 +46,34 @@
|
|
|
46
46
|
"publishConfig": {
|
|
47
47
|
"access": "public"
|
|
48
48
|
},
|
|
49
|
+
"scripts": {
|
|
50
|
+
"package": "rm -rf dist && tsdown",
|
|
51
|
+
"build": "npm run package",
|
|
52
|
+
"prepackage": "rm -rf dist",
|
|
53
|
+
"clean": "rm -rf dist",
|
|
54
|
+
"dev": "tsx src/bin/mxs.ts",
|
|
55
|
+
"test": "vitest run",
|
|
56
|
+
"test:watch": "vitest",
|
|
57
|
+
"typecheck": "tsc -p tsconfig.json --noEmit"
|
|
58
|
+
},
|
|
49
59
|
"dependencies": {
|
|
50
60
|
"@clack/prompts": "^1.4.0",
|
|
51
61
|
"@haklex/rich-headless": "0.13.0",
|
|
52
62
|
"@haklex/rich-litexml": "0.13.0",
|
|
53
63
|
"@lexical/headless": "^0.44.0",
|
|
64
|
+
"@mx-space/api-client": "workspace:*",
|
|
54
65
|
"better-auth": "^1.6.9",
|
|
55
66
|
"commander": "14.0.3",
|
|
56
67
|
"lexical": "^0.44.0",
|
|
57
68
|
"open": "^11.0.0",
|
|
58
|
-
"
|
|
69
|
+
"semver": "7.8.0"
|
|
59
70
|
},
|
|
60
71
|
"devDependencies": {
|
|
61
72
|
"@types/node": "25.8.0",
|
|
73
|
+
"@types/semver": "7.7.1",
|
|
62
74
|
"tsdown": "0.22.0",
|
|
63
75
|
"tsx": "^4.22.1",
|
|
64
76
|
"typescript": "6.0.3",
|
|
65
77
|
"vitest": "4.1.6"
|
|
66
|
-
},
|
|
67
|
-
"scripts": {
|
|
68
|
-
"package": "rm -rf dist && tsdown",
|
|
69
|
-
"build": "npm run package",
|
|
70
|
-
"prepackage": "rm -rf dist",
|
|
71
|
-
"clean": "rm -rf dist",
|
|
72
|
-
"dev": "tsx src/bin/mxs.ts",
|
|
73
|
-
"test": "vitest run",
|
|
74
|
-
"test:watch": "vitest",
|
|
75
|
-
"typecheck": "tsc -p tsconfig.json --noEmit"
|
|
76
78
|
}
|
|
77
|
-
}
|
|
79
|
+
}
|
package/LICENSE
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
** Mix Space Open Source License**
|
|
2
|
-
|
|
3
|
-
This project is dual-licensed under different terms for different parts of the project. It is important for users and contributors to understand the licensing terms applicable to each part of the project.
|
|
4
|
-
|
|
5
|
-
### For the `apps/` Directory
|
|
6
|
-
|
|
7
|
-
**License:** GNU Affero General Public License v3.0 (AGPLv3) with Additional Terms (ADDITIONAL_TERMS).
|
|
8
|
-
|
|
9
|
-
**Scope:** This license applies exclusively to all files within the `apps/` directory of this project.
|
|
10
|
-
|
|
11
|
-
**Summary:**
|
|
12
|
-
- The AGPLv3 is a free, copyleft license suitable for software that will be distributed over a network. It allows users to use, modify, and distribute the software and any modifications under the same terms.
|
|
13
|
-
- The "Additional Terms" (ADDITIONAL_TERMS) are specific conditions that are added to the AGPLv3 license. These terms must be reviewed in the accompanying LICENSE file or documentation to understand any additional restrictions or permissions that apply to the software.
|
|
14
|
-
|
|
15
|
-
### For Other Parts of the Project
|
|
16
|
-
|
|
17
|
-
**License:** MIT License.
|
|
18
|
-
|
|
19
|
-
**Scope:** This license applies to all parts of the project that are not included within the `apps/` directory.
|
|
20
|
-
|
|
21
|
-
**Summary:**
|
|
22
|
-
- The MIT License is a permissive open-source license that allows users considerable freedom. It permits use, copying, modification, merging, publishing, distribution, sublicensing, and/or selling copies of the software.
|
|
23
|
-
- It also protects the authors by including a limitation of liability and a disclaimer of warranty.
|
|
24
|
-
|
|
25
|
-
**General Conditions:**
|
|
26
|
-
- Redistribution and use in source and binary forms, with or without modification, are permitted provided that the above license notices and this permission notice appear in all copies of the software.
|
|
27
|
-
- The software is provided "as is", without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose, and noninfringement.
|
|
28
|
-
|
|
29
|
-
**Contribution:**
|
|
30
|
-
- Contributions to this project are accepted under the terms of the same license as the part of the project to which the contribution is made.
|
|
31
|
-
|
|
32
|
-
**Notice:**
|
|
33
|
-
- This summary is not the license itself and is not a substitute for reading the licenses in their entirety. All users and contributors are encouraged to read the full text of the licenses for a comprehensive understanding.
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auth-Duj8jJn9.mjs","names":[],"sources":["../src/core/auth.ts"],"sourcesContent":["import {\n type CredentialsShape,\n readCredentials,\n writeCredentials,\n} from './config-store'\nimport { MxsError } from './errors'\n\nexport const SUPPORTED_API_VERSIONS = [2] as const\n\nexport interface DeviceCodeResponse {\n device_code: string\n user_code: string\n verification_uri: string\n verification_uri_complete?: string\n expires_in: number\n interval: number\n}\n\nexport interface DeviceTokenResponse {\n access_token: string\n token_type: string\n expires_in: number\n refresh_token?: string\n scope?: string\n user?: {\n id?: string\n email?: string\n name?: string\n }\n}\n\nexport interface ProbeResult {\n apiUrl: string\n apiBase: string\n authBase: string\n apiVersion: number\n}\n\nexport interface AuthHttp {\n fetch: typeof fetch\n}\n\nexport function defaultHttp(): AuthHttp {\n return { fetch: globalThis.fetch.bind(globalThis) }\n}\n\nexport async function probeAuthEndpoint(\n apiUrl: string,\n http: AuthHttp = defaultHttp(),\n): Promise<ProbeResult> {\n const candidates: { prefix: string; version: number | null }[] = [\n ...SUPPORTED_API_VERSIONS.map((v) => ({\n prefix: `/api/v${v}/auth`,\n version: v,\n })),\n { prefix: '/auth', version: null },\n ]\n for (const cand of candidates) {\n const probeUrl = `${apiUrl}${cand.prefix}/ok`\n let res: Response\n try {\n res = await http.fetch(probeUrl, { method: 'GET' })\n } catch {\n continue\n }\n if (res.ok) {\n const apiVersion = cand.version ?? SUPPORTED_API_VERSIONS[0]\n const apiBase =\n cand.prefix === '/auth' ? apiUrl : `${apiUrl}/api/v${apiVersion}`\n const authBase = `${apiUrl}${cand.prefix}`\n return { apiUrl, apiBase, authBase, apiVersion }\n }\n }\n throw new MxsError({\n code: 'auth.probe',\n message: 'cannot detect auth endpoint',\n hint: 'verify the URL points at a running mx-core server',\n })\n}\n\nexport async function requestDeviceCode(\n authBase: string,\n clientId: string,\n scope = 'openid profile email',\n http: AuthHttp = defaultHttp(),\n): Promise<DeviceCodeResponse> {\n const res = await http.fetch(`${authBase}/device/code`, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ client_id: clientId, scope }),\n })\n if (!res.ok) {\n let body: unknown\n try {\n body = await res.json()\n } catch {\n body = await res.text()\n }\n throw new MxsError({\n code: 'auth.denied',\n message: `device code request failed (${res.status})`,\n details: body,\n })\n }\n return (await res.json()) as DeviceCodeResponse\n}\n\nexport interface PollOptions {\n intervalSec: number\n expiresInSec: number\n signal?: AbortSignal\n onTick?: (state: 'pending' | 'slow_down') => void\n http?: AuthHttp\n}\n\nexport async function pollDeviceToken(\n authBase: string,\n clientId: string,\n deviceCode: string,\n opts: PollOptions,\n): Promise<DeviceTokenResponse> {\n const http = opts.http ?? defaultHttp()\n const deadline = Date.now() + opts.expiresInSec * 1000\n let intervalMs = Math.max(1, opts.intervalSec) * 1000\n while (Date.now() < deadline) {\n if (opts.signal?.aborted) {\n throw new MxsError({ code: 'auth.denied', message: 'aborted by user' })\n }\n await sleep(intervalMs, opts.signal)\n const res = await http.fetch(`${authBase}/device/token`, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n grant_type: 'urn:ietf:params:oauth:grant-type:device_code',\n device_code: deviceCode,\n client_id: clientId,\n }),\n })\n let body: any\n try {\n body = await res.json()\n } catch {\n body = null\n }\n if (res.ok && body?.access_token) {\n return body as DeviceTokenResponse\n }\n const err = body?.error as string | undefined\n if (err === 'authorization_pending') {\n opts.onTick?.('pending')\n continue\n }\n if (err === 'slow_down') {\n intervalMs += 5000\n opts.onTick?.('slow_down')\n continue\n }\n if (err === 'access_denied') {\n throw new MxsError({\n code: 'auth.denied',\n message: 'user denied the authorization request',\n })\n }\n if (err === 'expired_token') {\n throw new MxsError({\n code: 'auth.expired',\n message: 'device code expired before authorization completed',\n hint: 'run `mxs auth login` again',\n })\n }\n throw new MxsError({\n code: 'auth.denied',\n message: `device token request failed (${res.status})`,\n details: body,\n })\n }\n throw new MxsError({\n code: 'auth.expired',\n message: 'device authorization timed out',\n hint: 'run `mxs auth login` again',\n })\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) return reject(new Error('aborted'))\n const timer = setTimeout(() => {\n if (signal) signal.removeEventListener('abort', onAbort)\n resolve()\n }, ms)\n const onAbort = () => {\n clearTimeout(timer)\n reject(new Error('aborted'))\n }\n signal?.addEventListener('abort', onAbort, { once: true })\n })\n}\n\nexport function toCredentials(resp: DeviceTokenResponse): CredentialsShape {\n return {\n access_token: resp.access_token,\n refresh_token: resp.refresh_token,\n expires_at: Date.now() + resp.expires_in * 1000,\n user: resp.user,\n }\n}\n\nexport function isExpiringSoon(\n cred: CredentialsShape,\n bufferMs = 60_000,\n): boolean {\n return cred.expires_at < Date.now() + bufferMs\n}\n\nexport async function refreshAccessToken(\n authBase: string,\n clientId: string,\n cred: CredentialsShape,\n http: AuthHttp = defaultHttp(),\n): Promise<CredentialsShape | null> {\n if (!cred.refresh_token) {\n return refreshSessionToken(authBase, cred, http)\n }\n const res = await http.fetch(`${authBase}/token`, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n grant_type: 'refresh_token',\n refresh_token: cred.refresh_token,\n client_id: clientId,\n }),\n })\n if (!res.ok) return null\n const body = (await res.json()) as DeviceTokenResponse\n if (!body?.access_token) return null\n return {\n access_token: body.access_token,\n refresh_token: body.refresh_token ?? cred.refresh_token,\n expires_at: Date.now() + body.expires_in * 1000,\n user: body.user ?? cred.user,\n }\n}\n\nasync function refreshSessionToken(\n authBase: string,\n cred: CredentialsShape,\n http: AuthHttp,\n): Promise<CredentialsShape | null> {\n const res = await http.fetch(`${authBase}/get-session`, {\n method: 'GET',\n headers: {\n accept: 'application/json',\n authorization: `Bearer ${cred.access_token}`,\n },\n })\n if (!res.ok) return null\n const body = (await res.json().catch(() => null)) as\n | {\n session?: { expiresAt?: string | Date | number }\n user?: CredentialsShape['user']\n }\n | null\n const expiresAt = normalizeExpiresAt(body?.session?.expiresAt)\n if (!expiresAt || expiresAt <= cred.expires_at) return null\n return {\n access_token: res.headers.get('set-auth-token') ?? cred.access_token,\n refresh_token: cred.refresh_token,\n expires_at: expiresAt,\n user: body?.user ?? cred.user,\n }\n}\n\nfunction normalizeExpiresAt(value: string | Date | number | undefined) {\n if (value === undefined) return null\n const time =\n value instanceof Date\n ? value.getTime()\n : typeof value === 'number'\n ? value\n : new Date(value).getTime()\n return Number.isFinite(time) ? time : null\n}\n\nexport async function loadCredentialsOrThrow(): Promise<CredentialsShape> {\n const cred = await readCredentials()\n if (!cred) {\n throw new MxsError({\n code: 'auth.missing',\n message: 'not authenticated',\n hint: 'run `mxs auth login`',\n })\n }\n return cred\n}\n\nexport async function ensureFreshToken(\n authBase: string,\n clientId: string,\n http: AuthHttp = defaultHttp(),\n): Promise<CredentialsShape> {\n const cred = await loadCredentialsOrThrow()\n if (!isExpiringSoon(cred)) return cred\n const refreshed = await refreshAccessToken(authBase, clientId, cred, http)\n if (!refreshed) return cred\n await writeCredentials(refreshed)\n return refreshed\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config-store-DmwX2iZU.mjs","names":["fs"],"sources":["../src/core/config-store.ts"],"sourcesContent":["import { promises as fs } from 'node:fs'\nimport path from 'node:path'\n\nimport { getConfigDir } from './config-dir'\nimport { MxsError } from './errors'\nimport {\n getCurrentProfile,\n getProfileConfigPath,\n getProfileCredentialsPath,\n getProfileDir,\n readProfileConfig,\n readProfileCredentials,\n} from './profile'\n\nexport { getConfigDir }\n\nexport interface ConfigShape {\n api_url?: string\n api_base?: string\n auth_base?: string\n api_version?: number\n client_id?: string\n production?: boolean\n}\n\nexport interface CredentialsShape {\n access_token: string\n refresh_token?: string\n expires_at: number\n user?: {\n id?: string\n email?: string\n name?: string\n }\n}\n\nexport interface ResolvedConfig {\n apiUrl: string\n apiBase: string\n authBase: string\n apiVersion: number\n clientId: string\n token?: string\n apiKey?: string\n configPath: string\n credentialsPath: string\n profileName: string | null\n isProduction: boolean\n profileExplicit: boolean\n urlOverridden: boolean\n}\n\nexport interface StoreOverrides {\n apiUrl?: string\n token?: string\n apiKey?: string\n profile?: string\n}\n\nconst DEFAULT_CLIENT_ID = 'mxs-cli'\n\nexport function getLegacyConfigPath(): string {\n return path.join(getConfigDir(), 'config.json')\n}\n\nexport function getLegacyCredentialsPath(): string {\n return path.join(getConfigDir(), 'credentials.json')\n}\n\n/** @deprecated Use getLegacyConfigPath for migration logic only */\nexport function getConfigPath(): string {\n return getLegacyConfigPath()\n}\n\n/** @deprecated Use getLegacyCredentialsPath for migration logic only */\nexport function getCredentialsPath(): string {\n return getLegacyCredentialsPath()\n}\n\nasync function readJsonIfExists<T>(p: string): Promise<T | null> {\n try {\n const raw = await fs.readFile(p, 'utf8')\n return JSON.parse(raw) as T\n } catch (err: any) {\n if (err?.code === 'ENOENT') return null\n if (err instanceof SyntaxError) {\n throw new MxsError({\n code: 'generic',\n message: `failed to parse ${p}: ${err.message}`,\n })\n }\n throw err\n }\n}\n\nexport async function readConfig(): Promise<ConfigShape> {\n const data = await readJsonIfExists<ConfigShape>(getLegacyConfigPath())\n return data ?? {}\n}\n\nexport async function writeConfig(cfg: ConfigShape): Promise<void> {\n const dir = getConfigDir()\n await fs.mkdir(dir, { recursive: true })\n await fs.writeFile(getLegacyConfigPath(), JSON.stringify(cfg, null, 2), {\n mode: 0o644,\n })\n try {\n await fs.chmod(getLegacyConfigPath(), 0o644)\n } catch {}\n}\n\n/**\n * @deprecated Read from profile credentials via `readProfileCredentials` in core/profile.ts.\n * Kept for the legacy migration read path and api-client auto-refresh; remove after full profile migration.\n */\nexport async function readCredentials(): Promise<CredentialsShape | null> {\n const p = getLegacyCredentialsPath()\n const data = await readJsonIfExists<CredentialsShape>(p)\n if (data) {\n await enforceCredentialsMode(p)\n }\n return data\n}\n\n/**\n * @deprecated Write to profile credentials via `writeProfileCredentials` in core/profile.ts.\n * Kept for the legacy migration read path and api-client auto-refresh; remove after full profile migration.\n */\nexport async function writeCredentials(cred: CredentialsShape): Promise<void> {\n const dir = getConfigDir()\n await fs.mkdir(dir, { recursive: true })\n const p = getLegacyCredentialsPath()\n await fs.writeFile(p, JSON.stringify(cred, null, 2), { mode: 0o600 })\n await fs.chmod(p, 0o600)\n}\n\n/**\n * @deprecated Use `deleteProfileCredentials` in core/profile.ts for profile-aware logout.\n * Kept only for Task 2 migration's read path; remove after full profile migration.\n */\nexport async function deleteCredentials(): Promise<void> {\n const p = getLegacyCredentialsPath()\n try {\n await fs.unlink(p)\n } catch (err: any) {\n if (err?.code !== 'ENOENT') throw err\n }\n}\n\nexport async function enforceCredentialsMode(\n p = getLegacyCredentialsPath(),\n): Promise<boolean> {\n let stats\n try {\n stats = await fs.stat(p)\n } catch (err: any) {\n if (err?.code === 'ENOENT') return false\n throw err\n }\n const mode = stats.mode & 0o777\n if (mode !== 0o600) {\n process.stderr.write(\n `mxs: credentials file ${p} had mode ${mode.toString(8)}; chmod 600\\n`,\n )\n await fs.chmod(p, 0o600)\n return true\n }\n return false\n}\n\nexport function normalizeApiUrl(input: string): string {\n let url = input.trim()\n if (!url) {\n throw new MxsError({\n code: 'config.missing.api_url',\n message: 'API URL is empty',\n })\n }\n if (!/^https?:\\/\\//i.test(url)) {\n const isLocal = /^(?:localhost|127\\.0\\.0\\.1|::1)(?::\\d+)?$/i.test(url)\n url = isLocal ? `http://${url}` : `https://${url}`\n }\n return url.replace(/\\/+$/, '')\n}\n\nexport async function resolveConfig(\n overrides: StoreOverrides = {},\n): Promise<ResolvedConfig> {\n const envApiUrl = process.env.MXS_API_URL?.trim()\n const envToken = process.env.MXS_TOKEN?.trim()\n const envApiKey = process.env.MXS_API_KEY?.trim()\n const envProfile = process.env.MXS_PROFILE?.trim()\n\n const urlOverridden = Boolean(overrides.apiUrl || envApiUrl)\n const profileExplicit = Boolean(overrides.profile || envProfile)\n\n const profileName: string | null =\n overrides.profile?.trim() ||\n envProfile ||\n (await getCurrentProfile()) ||\n null\n\n if (profileName && !urlOverridden) {\n try {\n const stat = await fs.stat(getProfileDir(profileName))\n if (!stat.isDirectory()) {\n throw new MxsError({\n code: 'profile.not_found',\n message: `profile '${profileName}' does not exist`,\n hint: 'run `mxs profile ls` to see configured profiles, or `mxs auth login --profile <name>` to create one',\n })\n }\n } catch (err: any) {\n if (err instanceof MxsError) throw err\n if (err?.code === 'ENOENT') {\n throw new MxsError({\n code: 'profile.not_found',\n message: `profile '${profileName}' does not exist`,\n hint: 'run `mxs profile ls` to see configured profiles, or `mxs auth login --profile <name>` to create one',\n })\n }\n throw err\n }\n }\n\n let profileConfig: ConfigShape = {}\n if (profileName) {\n profileConfig = await readProfileConfig(profileName)\n }\n\n const rawApiUrl = overrides.apiUrl || envApiUrl || profileConfig.api_url\n if (!rawApiUrl) {\n throw new MxsError({\n code: 'config.missing.api_url',\n message: 'API URL is not configured',\n hint: 'set MXS_API_URL or pass --api-url <url>, or run `mxs auth login` in an interactive shell',\n })\n }\n const apiUrl = normalizeApiUrl(rawApiUrl)\n const apiVersion = profileConfig.api_version ?? 2\n const apiBase = urlOverridden\n ? `${apiUrl}/api/v${apiVersion}`\n : profileConfig.api_base || `${apiUrl}/api/v${apiVersion}`\n const authBase = urlOverridden\n ? `${apiBase}/auth`\n : profileConfig.auth_base || `${apiBase}/auth`\n\n let token: string | undefined\n if (urlOverridden) {\n token = overrides.token || envToken || undefined\n } else {\n let profileCreds: Awaited<ReturnType<typeof readProfileCredentials>> = null\n if (profileName) {\n profileCreds = await readProfileCredentials(profileName)\n }\n token = overrides.token || envToken || profileCreds?.access_token\n }\n\n const apiKey = overrides.apiKey || envApiKey\n\n const isProduction = urlOverridden\n ? false\n : profileName\n ? Boolean(profileConfig.production)\n : false\n\n return {\n apiUrl,\n apiBase,\n authBase,\n apiVersion,\n clientId: profileConfig.client_id || DEFAULT_CLIENT_ID,\n token,\n apiKey,\n configPath: profileName\n ? getProfileConfigPath(profileName)\n : getLegacyConfigPath(),\n credentialsPath: profileName\n ? getProfileCredentialsPath(profileName)\n : getLegacyCredentialsPath(),\n profileName,\n isProduction,\n profileExplicit,\n urlOverridden,\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"delete-DVNebWqO.mjs","names":[],"sources":["../src/commands/category/delete.ts"],"sourcesContent":["import { MxsError } from '../../core/errors'\nimport { emitSuccess, type OutputOptions } from '../../core/output'\nimport {\n buildApiClient,\n type GlobalFlags,\n resolveContext,\n} from '../internal/shared'\nimport { resolveCategoryId } from './resolve'\n\nexport async function run(\n slugOrId: string,\n opts: { force?: boolean },\n flags: GlobalFlags,\n out: OutputOptions,\n) {\n if (!opts.force && !flags.dryRun && !process.stdin.isTTY) {\n throw new MxsError({\n code: 'validation.failed',\n message: 'refusing to delete without --force in non-TTY context',\n })\n }\n if (flags.dryRun) {\n emitSuccess({ would_delete: slugOrId }, out)\n return\n }\n const ctx = await resolveContext(flags, out)\n const client = buildApiClient(ctx, flags)\n const id = await resolveCategoryId(client, slugOrId)\n await client.request(`/categories/${id}`, { method: 'DELETE' })\n emitSuccess({ deleted: id }, out)\n}\n"],"mappings":";;;;AASA,eAAsB,IACpB,UACA,MACA,OACA,KACA;CACA,IAAI,CAAC,KAAK,SAAS,CAAC,MAAM,UAAU,CAAC,QAAQ,MAAM,OACjD,MAAM,IAAI,SAAS;EACjB,MAAM;EACN,SAAS;CACX,CAAC;CAEH,IAAI,MAAM,QAAQ;EAChB,YAAY,EAAE,cAAc,SAAS,GAAG,GAAG;EAC3C;CACF;CAEA,MAAM,SAAS,eAAe,MADZ,eAAe,OAAO,GAAG,GACR,KAAK;CACxC,MAAM,KAAK,MAAM,kBAAkB,QAAQ,QAAQ;CACnD,MAAM,OAAO,QAAQ,eAAe,MAAM,EAAE,QAAQ,SAAS,CAAC;CAC9D,YAAY,EAAE,SAAS,GAAG,GAAG,GAAG;AAClC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"delete-D_NRteuq.mjs","names":[],"sources":["../src/commands/post/delete.ts"],"sourcesContent":["import { MxsError } from '../../core/errors'\nimport { emitSuccess, type OutputOptions } from '../../core/output'\nimport { buildApiClient, type GlobalFlags, resolveContext } from '../internal/shared'\nimport { resolvePostId } from './resolve'\n\nexport async function run(\n slugOrId: string,\n opts: { force?: boolean },\n flags: GlobalFlags,\n out: OutputOptions,\n) {\n if (!opts.force && !flags.dryRun && !process.stdin.isTTY) {\n throw new MxsError({\n code: 'validation.failed',\n message: 'refusing to delete without --force in non-TTY context',\n })\n }\n if (flags.dryRun) {\n emitSuccess({ would_delete: slugOrId }, out)\n return\n }\n const ctx = await resolveContext(flags, out)\n const client = buildApiClient(ctx, flags)\n const id = await resolvePostId(client, slugOrId)\n await client.request(`/posts/${id}`, { method: 'DELETE' })\n emitSuccess({ deleted: id }, out)\n}\n"],"mappings":";;;;AAKA,eAAsB,IACpB,UACA,MACA,OACA,KACA;CACA,IAAI,CAAC,KAAK,SAAS,CAAC,MAAM,UAAU,CAAC,QAAQ,MAAM,OACjD,MAAM,IAAI,SAAS;EACjB,MAAM;EACN,SAAS;CACX,CAAC;CAEH,IAAI,MAAM,QAAQ;EAChB,YAAY,EAAE,cAAc,SAAS,GAAG,GAAG;EAC3C;CACF;CAEA,MAAM,SAAS,eAAe,MADZ,eAAe,OAAO,GAAG,GACR,KAAK;CACxC,MAAM,KAAK,MAAM,cAAc,QAAQ,QAAQ;CAC/C,MAAM,OAAO,QAAQ,UAAU,MAAM,EAAE,QAAQ,SAAS,CAAC;CACzD,YAAY,EAAE,SAAS,GAAG,GAAG,GAAG;AAClC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"delete-DmKPzzsQ.mjs","names":[],"sources":["../src/commands/note/delete.ts"],"sourcesContent":["import { MxsError } from '../../core/errors'\nimport { emitSuccess, type OutputOptions } from '../../core/output'\nimport {\n buildApiClient,\n type GlobalFlags,\n resolveContext,\n} from '../internal/shared'\nimport { resolveNoteId } from './resolve'\n\nexport async function run(\n slugOrId: string,\n opts: { force?: boolean },\n flags: GlobalFlags,\n out: OutputOptions,\n) {\n if (!opts.force && !flags.dryRun && !process.stdin.isTTY) {\n throw new MxsError({\n code: 'validation.failed',\n message: 'refusing to delete without --force in non-TTY context',\n })\n }\n if (flags.dryRun) {\n emitSuccess({ would_delete: slugOrId }, out)\n return\n }\n const ctx = await resolveContext(flags, out)\n const client = buildApiClient(ctx, flags)\n const id = await resolveNoteId(client, slugOrId)\n await client.request(`/notes/${id}`, { method: 'DELETE' })\n emitSuccess({ deleted: id }, out)\n}\n"],"mappings":";;;;AASA,eAAsB,IACpB,UACA,MACA,OACA,KACA;CACA,IAAI,CAAC,KAAK,SAAS,CAAC,MAAM,UAAU,CAAC,QAAQ,MAAM,OACjD,MAAM,IAAI,SAAS;EACjB,MAAM;EACN,SAAS;CACX,CAAC;CAEH,IAAI,MAAM,QAAQ;EAChB,YAAY,EAAE,cAAc,SAAS,GAAG,GAAG;EAC3C;CACF;CAEA,MAAM,SAAS,eAAe,MADZ,eAAe,OAAO,GAAG,GACR,KAAK;CACxC,MAAM,KAAK,MAAM,cAAc,QAAQ,QAAQ;CAC/C,MAAM,OAAO,QAAQ,UAAU,MAAM,EAAE,QAAQ,SAAS,CAAC;CACzD,YAAY,EAAE,SAAS,GAAG,GAAG,GAAG;AAClC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"delete-ZIjkquZj.mjs","names":[],"sources":["../src/commands/page/delete.ts"],"sourcesContent":["import type { ApiClient } from '../../core/api-client'\nimport { MxsError } from '../../core/errors'\nimport { emitSuccess, type OutputOptions } from '../../core/output'\nimport { isSnowflakeId } from '../../core/resolve'\nimport { buildApiClient, type GlobalFlags, resolveContext } from '../internal/shared'\n\nexport async function run(\n slugOrId: string,\n opts: { force?: boolean },\n flags: GlobalFlags,\n out: OutputOptions,\n) {\n if (!opts.force && !flags.dryRun && !process.stdin.isTTY) {\n throw new MxsError({\n code: 'validation.failed',\n message: 'refusing to delete without --force in non-TTY context',\n })\n }\n if (flags.dryRun) {\n emitSuccess({ would_delete: slugOrId }, out)\n return\n }\n const ctx = await resolveContext(flags, out)\n const client = buildApiClient(ctx, flags)\n const id = await resolveId(client, slugOrId)\n await client.request(`/pages/${id}`, { method: 'DELETE' })\n emitSuccess({ deleted: id }, out)\n}\n\nasync function resolveId(client: ApiClient, slugOrId: string): Promise<string> {\n if (isSnowflakeId(slugOrId)) return slugOrId\n const res = await client.request<{ id: string }>(`/pages/slug/${slugOrId}`)\n if (!res.data?.id)\n throw new MxsError({\n code: 'resource.not_found',\n message: `page not found: ${slugOrId}`,\n })\n return res.data.id\n}\n"],"mappings":";;;;AAMA,eAAsB,IACpB,UACA,MACA,OACA,KACA;CACA,IAAI,CAAC,KAAK,SAAS,CAAC,MAAM,UAAU,CAAC,QAAQ,MAAM,OACjD,MAAM,IAAI,SAAS;EACjB,MAAM;EACN,SAAS;CACX,CAAC;CAEH,IAAI,MAAM,QAAQ;EAChB,YAAY,EAAE,cAAc,SAAS,GAAG,GAAG;EAC3C;CACF;CAEA,MAAM,SAAS,eAAe,MADZ,eAAe,OAAO,GAAG,GACR,KAAK;CACxC,MAAM,KAAK,MAAM,UAAU,QAAQ,QAAQ;CAC3C,MAAM,OAAO,QAAQ,UAAU,MAAM,EAAE,QAAQ,SAAS,CAAC;CACzD,YAAY,EAAE,SAAS,GAAG,GAAG,GAAG;AAClC;AAEA,eAAe,UAAU,QAAmB,UAAmC;CAC7E,IAAI,cAAc,QAAQ,GAAG,OAAO;CACpC,MAAM,MAAM,MAAM,OAAO,QAAwB,eAAe,UAAU;CAC1E,IAAI,CAAC,IAAI,MAAM,IACb,MAAM,IAAI,SAAS;EACjB,MAAM;EACN,SAAS,mBAAmB;CAC9B,CAAC;CACH,OAAO,IAAI,KAAK;AAClB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"delete-aCVSWuKi.mjs","names":[],"sources":["../src/commands/topic/delete.ts"],"sourcesContent":["import type { ApiClient } from '../../core/api-client'\nimport { MxsError } from '../../core/errors'\nimport { emitSuccess, type OutputOptions } from '../../core/output'\nimport { isSnowflakeId } from '../../core/resolve'\nimport { buildApiClient, type GlobalFlags, resolveContext } from '../internal/shared'\n\nexport async function run(\n slugOrId: string,\n opts: { force?: boolean },\n flags: GlobalFlags,\n out: OutputOptions,\n) {\n if (!opts.force && !flags.dryRun && !process.stdin.isTTY) {\n throw new MxsError({\n code: 'validation.failed',\n message: 'refusing to delete without --force in non-TTY context',\n })\n }\n if (flags.dryRun) {\n emitSuccess({ would_delete: slugOrId }, out)\n return\n }\n const ctx = await resolveContext(flags, out)\n const client = buildApiClient(ctx, flags)\n const id = await resolveId(client, slugOrId)\n await client.request(`/topics/${id}`, { method: 'DELETE' })\n emitSuccess({ deleted: id }, out)\n}\n\nasync function resolveId(client: ApiClient, slugOrId: string): Promise<string> {\n if (isSnowflakeId(slugOrId)) return slugOrId\n const res = await client.request<{ id?: string }>(`/topics/slug/${slugOrId}`)\n if (!res.data?.id)\n throw new MxsError({\n code: 'resource.not_found',\n message: `topic not found: ${slugOrId}`,\n })\n return res.data.id\n}\n"],"mappings":";;;;AAMA,eAAsB,IACpB,UACA,MACA,OACA,KACA;CACA,IAAI,CAAC,KAAK,SAAS,CAAC,MAAM,UAAU,CAAC,QAAQ,MAAM,OACjD,MAAM,IAAI,SAAS;EACjB,MAAM;EACN,SAAS;CACX,CAAC;CAEH,IAAI,MAAM,QAAQ;EAChB,YAAY,EAAE,cAAc,SAAS,GAAG,GAAG;EAC3C;CACF;CAEA,MAAM,SAAS,eAAe,MADZ,eAAe,OAAO,GAAG,GACR,KAAK;CACxC,MAAM,KAAK,MAAM,UAAU,QAAQ,QAAQ;CAC3C,MAAM,OAAO,QAAQ,WAAW,MAAM,EAAE,QAAQ,SAAS,CAAC;CAC1D,YAAY,EAAE,SAAS,GAAG,GAAG,GAAG;AAClC;AAEA,eAAe,UAAU,QAAmB,UAAmC;CAC7E,IAAI,cAAc,QAAQ,GAAG,OAAO;CACpC,MAAM,MAAM,MAAM,OAAO,QAAyB,gBAAgB,UAAU;CAC5E,IAAI,CAAC,IAAI,MAAM,IACb,MAAM,IAAI,SAAS;EACjB,MAAM;EACN,SAAS,oBAAoB;CAC/B,CAAC;CACH,OAAO,IAAI,KAAK;AAClB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"document-output-BtY8T7eY.mjs","names":[],"sources":["../src/core/document-output.ts"],"sourcesContent":["import { MxsError } from './errors'\nimport { serializeFromLexical, type LexicalState } from './litexml-codec'\nimport { emitSuccess, type OutputOptions } from './output'\n\nexport type DocumentKind = 'post' | 'note' | 'page'\n\nconst POST_LIST_OUTPUT_MODES = new Set([\n 'pretty-json',\n 'json',\n 'readable',\n 'llm',\n])\n\nconst DOCUMENT_OUTPUT_MODES = new Set([\n 'pretty-json',\n 'json',\n 'readable',\n 'llm',\n 'envelope',\n])\n\nexport function emitDocument(\n kind: DocumentKind,\n data: unknown,\n opts: OutputOptions,\n): void {\n const mode = opts.output ?? 'pretty-json'\n if (!DOCUMENT_OUTPUT_MODES.has(mode)) {\n throw new MxsError({\n code: 'validation.failed',\n message: `unsupported --output value: ${mode}`,\n hint: 'use --output pretty-json, json, readable, llm, or envelope',\n })\n }\n\n if (opts.json || mode === 'json' || mode === 'pretty-json') {\n emitSuccess(data, opts)\n return\n }\n\n const doc = unwrapDocument(data)\n const rendered =\n mode === 'envelope'\n ? renderDocumentEnvelope(kind, doc)\n : renderReadableDocument(kind, doc)\n process.stdout.write(`${rendered}\\n`)\n}\n\nexport function emitPostList(data: unknown, opts: OutputOptions): void {\n const mode = opts.output ?? 'pretty-json'\n if (!POST_LIST_OUTPUT_MODES.has(mode)) {\n throw new MxsError({\n code: 'validation.failed',\n message: `unsupported --output value for post list: ${mode}`,\n hint: 'use --output pretty-json, json, readable, or llm',\n })\n }\n\n if (opts.json || mode === 'json' || mode === 'pretty-json') {\n emitSuccess(data, opts)\n return\n }\n\n process.stdout.write(`${renderPostList(data)}\\n`)\n}\n\nexport function renderReadableDocument(\n kind: DocumentKind,\n data: unknown,\n): string {\n const doc = asRecord(data)\n const lines: string[] = [kind]\n const fields = collectReadableFields(kind, doc)\n\n for (const [key, value] of fields) {\n if (value === undefined || value === null || value === '') continue\n lines.push(`${key}: ${formatScalar(value)}`)\n }\n\n const summary = firstString(doc, 'summary', 'subtitle')\n if (summary) {\n lines.push('', 'summary:', summary)\n }\n\n const content = renderContent(doc)\n if (content.body) {\n lines.push(\n '',\n `content_format: ${content.format}`,\n '',\n 'content:',\n content.body,\n )\n }\n\n return lines.join('\\n')\n}\n\nexport function renderPostList(data: unknown): string {\n const payload = asRecord(data)\n const rows = Array.isArray(payload.data)\n ? payload.data\n : Array.isArray(data)\n ? data\n : []\n const pagination = asRecord(first(payload, 'pagination'))\n const lines = ['posts']\n\n if (rows.length > 0) {\n lines.push(`count: ${rows.length}`)\n } else {\n lines.push('count: 0')\n }\n\n const page = first(pagination, 'page', 'currentPage')\n const size = first(pagination, 'size', 'pageSize')\n const total = first(pagination, 'total', 'totalCount')\n if (page !== undefined) lines.push(`page: ${formatScalar(page)}`)\n if (size !== undefined) lines.push(`size: ${formatScalar(size)}`)\n if (total !== undefined) lines.push(`total: ${formatScalar(total)}`)\n\n rows.forEach((row, index) => {\n const doc = asRecord(row)\n lines.push('', `post ${index + 1}:`)\n const fields: Array<[string, unknown]> = [\n ['id', first(doc, 'id')],\n ['title', first(doc, 'title')],\n ['slug', first(doc, 'slug')],\n ['state', publishState(doc)],\n ['category', relationLabel(first(doc, 'category'))],\n ['tags', first(doc, 'tags')],\n ['summary', first(doc, 'summary')],\n ['created_at', first(doc, 'created_at', 'createdAt')],\n ['modified_at', first(doc, 'modified_at', 'modifiedAt')],\n ['source_lang', first(doc, 'source_lang', 'sourceLang')],\n ['translated', first(doc, 'is_translated', 'isTranslated')],\n ]\n\n for (const [key, value] of fields) {\n if (value === undefined || value === null || value === '') continue\n lines.push(`${key}: ${formatScalar(value)}`)\n }\n })\n\n return lines.join('\\n')\n}\n\nexport function renderDocumentEnvelope(\n kind: DocumentKind,\n data: unknown,\n): string {\n const doc = asRecord(data)\n const root = kind === 'note' ? 'mxnote' : 'mxpost'\n const meta = collectEnvelopeMeta(kind, doc)\n const metaLines = meta.map(([key, value]) => renderEnvelopeMeta(key, value))\n const content = renderContent(doc)\n\n return `<${root}>\n <meta>\n${metaLines.join('\\n')}\n </meta>\n <content>\n${content.body}\n </content>\n</${root}>`\n}\n\nfunction collectReadableFields(\n kind: DocumentKind,\n doc: Record<string, unknown>,\n): Array<[string, unknown]> {\n const base: Array<[string, unknown]> = [\n ['id', first(doc, 'id')],\n ['title', first(doc, 'title')],\n ['slug', first(doc, 'slug')],\n ]\n\n if (kind === 'post') {\n base.push(\n ['state', publishState(doc)],\n ['category', relationLabel(first(doc, 'category'))],\n ['tags', first(doc, 'tags')],\n ['pin', first(doc, 'pin')],\n )\n } else if (kind === 'note') {\n base.push(\n ['nid', first(doc, 'nid')],\n ['state', publishState(doc)],\n ['topic', relationLabel(first(doc, 'topic'))],\n ['mood', first(doc, 'mood')],\n ['weather', first(doc, 'weather')],\n ['public_at', first(doc, 'public_at', 'publicAt')],\n ['bookmark', first(doc, 'bookmark')],\n )\n } else {\n base.push(\n ['subtitle', first(doc, 'subtitle')],\n ['order', first(doc, 'order')],\n )\n }\n\n base.push(\n ['created_at', first(doc, 'created_at', 'createdAt')],\n ['modified_at', first(doc, 'modified_at', 'modifiedAt')],\n ['source_lang', first(doc, 'source_lang', 'sourceLang')],\n ['translated', first(doc, 'is_translated', 'isTranslated')],\n )\n\n return base\n}\n\nfunction collectEnvelopeMeta(\n kind: DocumentKind,\n doc: Record<string, unknown>,\n): Array<[string, unknown]> {\n const meta: Array<[string, unknown]> = [\n ['title', first(doc, 'title')],\n ['slug', first(doc, 'slug')],\n ]\n\n if (kind === 'post') {\n meta.push(\n ['category', relationSlugOrLabel(first(doc, 'category'))],\n ['state', publishState(doc) === 'published' ? 'publish' : 'draft'],\n ['summary', first(doc, 'summary')],\n ['tags', first(doc, 'tags')],\n )\n } else if (kind === 'note') {\n meta.push(\n ['topic', relationSlugOrLabel(first(doc, 'topic'))],\n ['state', publishState(doc) === 'published' ? 'publish' : 'draft'],\n ['mood', first(doc, 'mood')],\n ['weather', first(doc, 'weather')],\n ['publicAt', first(doc, 'public_at', 'publicAt')],\n ['bookmark', first(doc, 'bookmark')],\n ['location', first(doc, 'location')],\n )\n } else {\n meta.push(\n ['subtitle', first(doc, 'subtitle')],\n ['order', first(doc, 'order')],\n )\n }\n\n meta.push(['format', contentFormat(doc)])\n return meta.filter(\n ([, value]) => value !== undefined && value !== null && value !== '',\n )\n}\n\nfunction renderContent(doc: Record<string, unknown>): {\n body: string\n format: 'litexml' | 'markdown' | 'text'\n} {\n const format = contentFormat(doc)\n const content = firstString(doc, 'content')\n const text = firstString(doc, 'text')\n\n if (format === 'lexical' && content) {\n try {\n return {\n body: serializeFromLexical(JSON.parse(content) as LexicalState),\n format: 'litexml',\n }\n } catch {\n return { body: text || content, format: text ? 'text' : 'markdown' }\n }\n }\n\n return {\n body: content || text || '',\n format: format === 'markdown' ? 'markdown' : 'text',\n }\n}\n\nfunction unwrapDocument(data: unknown): unknown {\n const obj = asRecord(data)\n const nested = obj.data\n if (nested && typeof nested === 'object' && !Array.isArray(nested))\n return nested\n return data\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> {\n return value && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : {}\n}\n\nfunction first(record: Record<string, unknown>, ...keys: string[]): unknown {\n for (const key of keys) {\n if (record[key] !== undefined && record[key] !== null) return record[key]\n }\n return undefined\n}\n\nfunction firstString(\n record: Record<string, unknown>,\n ...keys: string[]\n): string {\n const value = first(record, ...keys)\n return typeof value === 'string' ? value : ''\n}\n\nfunction contentFormat(doc: Record<string, unknown>): string {\n const value = first(doc, 'content_format', 'contentFormat')\n return typeof value === 'string' ? value : 'markdown'\n}\n\nfunction publishState(doc: Record<string, unknown>): string | undefined {\n const value = first(doc, 'is_published', 'isPublished')\n if (typeof value === 'boolean') return value ? 'published' : 'draft'\n return undefined\n}\n\nfunction relationLabel(value: unknown): string | undefined {\n if (!value) return undefined\n if (typeof value === 'string') return value\n const obj = asRecord(value)\n return (\n firstString(obj, 'name') ||\n firstString(obj, 'slug') ||\n firstString(obj, 'id')\n )\n}\n\nfunction relationSlugOrLabel(value: unknown): string | undefined {\n if (!value) return undefined\n if (typeof value === 'string') return value\n const obj = asRecord(value)\n return (\n firstString(obj, 'slug') ||\n firstString(obj, 'name') ||\n firstString(obj, 'id')\n )\n}\n\nfunction formatScalar(value: unknown): string {\n if (Array.isArray(value)) return value.map(formatScalar).join(', ')\n if (value instanceof Date) return value.toISOString()\n if (typeof value === 'object' && value !== null) return JSON.stringify(value)\n return String(value)\n}\n\nfunction renderEnvelopeMeta(key: string, value: unknown): string {\n if (key === 'tags' && Array.isArray(value)) {\n const tags = value\n .map((item) => ` <tag>${escapeXml(formatScalar(item))}</tag>`)\n .join('\\n')\n return ` <tags>\\n${tags}\\n </tags>`\n }\n\n return ` <${key}>${escapeXml(formatScalar(value))}</${key}>`\n}\n\nfunction escapeXml(value: string): string {\n return value\n .replaceAll('&', '&')\n .replaceAll('<', '<')\n .replaceAll('>', '>')\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"edit-DjRE8Gk-.mjs","names":[],"sources":["../src/commands/config/edit.ts"],"sourcesContent":["import { runEditorRoundTrip } from '../../core/editor'\nimport { MxsError } from '../../core/errors'\nimport { emitInfo, emitSuccess, type OutputOptions } from '../../core/output'\nimport { buildApiClient, type GlobalFlags, resolveContext } from '../internal/shared'\n\nexport async function run(flags: GlobalFlags, out: OutputOptions) {\n const ctx = await resolveContext(flags, out)\n const client = buildApiClient(ctx, flags)\n const res = await client.request<Record<string, unknown>>('/options')\n const initial = JSON.stringify(res.data ?? {}, null, 2)\n const next = await runEditorRoundTrip({\n filename: 'mxs-config.json',\n initialContent: initial,\n })\n if (next.trim() === initial.trim()) {\n emitInfo('no changes', out)\n return\n }\n let parsed: Record<string, unknown>\n try {\n parsed = JSON.parse(next)\n } catch (err: any) {\n throw new MxsError({\n code: 'validation.failed',\n message: `invalid JSON: ${err?.message ?? err}`,\n })\n }\n if (flags.dryRun) {\n emitSuccess(parsed, out)\n return\n }\n const results: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(parsed)) {\n const r = await client.request(`/options/${key}`, {\n method: 'PATCH',\n body: value,\n })\n results[key] = r.data\n }\n emitSuccess(results, out)\n}\n"],"mappings":";;;;AAKA,eAAsB,IAAI,OAAoB,KAAoB;CAEhE,MAAM,SAAS,eAAe,MADZ,eAAe,OAAO,GAAG,GACR,KAAK;CACxC,MAAM,MAAM,MAAM,OAAO,QAAiC,UAAU;CACpE,MAAM,UAAU,KAAK,UAAU,IAAI,QAAQ,CAAC,GAAG,MAAM,CAAC;CACtD,MAAM,OAAO,MAAM,mBAAmB;EACpC,UAAU;EACV,gBAAgB;CAClB,CAAC;CACD,IAAI,KAAK,KAAK,MAAM,QAAQ,KAAK,GAAG;EAClC,SAAS,cAAc,GAAG;EAC1B;CACF;CACA,IAAI;CACJ,IAAI;EACF,SAAS,KAAK,MAAM,IAAI;CAC1B,SAAS,KAAU;EACjB,MAAM,IAAI,SAAS;GACjB,MAAM;GACN,SAAS,iBAAiB,KAAK,WAAW;EAC5C,CAAC;CACH;CACA,IAAI,MAAM,QAAQ;EAChB,YAAY,QAAQ,GAAG;EACvB;CACF;CACA,MAAM,UAAmC,CAAC;CAC1C,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,MAAM,GAK9C,QAAQ,QAAO,MAJC,OAAO,QAAQ,YAAY,OAAO;EAChD,QAAQ;EACR,MAAM;CACR,CAAC,GACgB;CAEnB,YAAY,SAAS,GAAG;AAC1B"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"edit-R6H5RtWd.mjs","names":[],"sources":["../src/commands/page/edit.ts"],"sourcesContent":["import type { ApiClient } from '../../core/api-client'\nimport { runEditorRoundTrip } from '../../core/editor'\nimport { parseEnvelope } from '../../core/envelope'\nimport { MxsError } from '../../core/errors'\nimport { serializeFromLexical } from '../../core/litexml-codec'\nimport { emitInfo, emitSuccess, type OutputOptions } from '../../core/output'\nimport { buildPagePayload, type PageFlagInputs } from '../../core/payload'\nimport { isSnowflakeId } from '../../core/resolve'\nimport { applyPageEnvelopeMeta } from '../internal/envelope-overlays'\nimport { buildApiClient, type GlobalFlags, resolveContext } from '../internal/shared'\n\nexport async function run(\n slugOrId: string,\n opts: PageFlagInputs,\n flags: GlobalFlags,\n out: OutputOptions,\n) {\n const ctx = await resolveContext(flags, out)\n const client = buildApiClient(ctx, flags)\n\n if (!opts.file && opts.content === undefined) {\n const xml = await materialize(client, slugOrId)\n const next = await runEditorRoundTrip({\n filename: `page-${slugOrId}.xml`,\n initialContent: xml,\n })\n if (next.trim() === xml.trim()) {\n emitInfo('no changes', out)\n return\n }\n const parsed = parseEnvelope(next, 'post')\n const built = await buildPagePayload({\n ...opts,\n content: parsed.contentXml,\n format: opts.format ?? 'lexical',\n })\n applyPageEnvelopeMeta(built.payload, parsed.meta)\n if (flags.dryRun) {\n emitSuccess(built.payload, out)\n return\n }\n const id = await resolveId(client, slugOrId)\n const res = await client.request(`/pages/${id}`, {\n method: 'PUT',\n body: built.payload,\n })\n emitSuccess(res.data, out)\n return\n }\n\n const built = await buildPagePayload(opts)\n if (flags.dryRun) {\n emitSuccess(built.payload, out)\n return\n }\n const id = await resolveId(client, slugOrId)\n const res = await client.request(`/pages/${id}`, {\n method: 'PUT',\n body: built.payload,\n })\n emitSuccess(res.data, out)\n}\n\nasync function resolveId(client: ApiClient, slugOrId: string): Promise<string> {\n if (isSnowflakeId(slugOrId)) return slugOrId\n const res = await client.request<{ id: string }>(`/pages/slug/${slugOrId}`)\n if (!res.data?.id)\n throw new MxsError({\n code: 'resource.not_found',\n message: `page not found: ${slugOrId}`,\n })\n return res.data.id\n}\n\nasync function materialize(\n client: ApiClient,\n slugOrId: string,\n): Promise<string> {\n const path = isSnowflakeId(slugOrId)\n ? `/pages/${slugOrId}`\n : `/pages/slug/${slugOrId}`\n const res = await client.request<any>(path, { query: { prefer: 'lexical' } })\n const page = res.data\n const inner =\n page.contentFormat === 'lexical' && page.content\n ? serializeFromLexical(JSON.parse(page.content))\n : (page.content ?? '')\n return `<mxpost>\n <meta>\n <title>${esc(page.title ?? '')}</title>\n <slug>${esc(page.slug ?? '')}</slug>\n </meta>\n <content>\n${inner}\n </content>\n</mxpost>\n`\n}\n\nfunction esc(s: string): string {\n return s\n .replaceAll('&', '&')\n .replaceAll('<', '<')\n .replaceAll('>', '>')\n}\n"],"mappings":";;;;;;;;AAWA,eAAsB,IACpB,UACA,MACA,OACA,KACA;CAEA,MAAM,SAAS,eAAe,MADZ,eAAe,OAAO,GAAG,GACR,KAAK;CAExC,IAAI,CAAC,KAAK,QAAQ,KAAK,YAAY,KAAA,GAAW;EAC5C,MAAM,MAAM,MAAM,YAAY,QAAQ,QAAQ;EAC9C,MAAM,OAAO,MAAM,mBAAmB;GACpC,UAAU,QAAQ,SAAS;GAC3B,gBAAgB;EAClB,CAAC;EACD,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,GAAG;GAC9B,SAAS,cAAc,GAAG;GAC1B;EACF;EACA,MAAM,SAAS,cAAc,MAAM,MAAM;EACzC,MAAM,QAAQ,MAAM,iBAAiB;GACnC,GAAG;GACH,SAAS,OAAO;GAChB,QAAQ,KAAK,UAAU;EACzB,CAAC;EACD,sBAAsB,MAAM,SAAS,OAAO,IAAI;EAChD,IAAI,MAAM,QAAQ;GAChB,YAAY,MAAM,SAAS,GAAG;GAC9B;EACF;EACA,MAAM,KAAK,MAAM,UAAU,QAAQ,QAAQ;EAK3C,aAAY,MAJM,OAAO,QAAQ,UAAU,MAAM;GAC/C,QAAQ;GACR,MAAM,MAAM;EACd,CAAC,GACe,MAAM,GAAG;EACzB;CACF;CAEA,MAAM,QAAQ,MAAM,iBAAiB,IAAI;CACzC,IAAI,MAAM,QAAQ;EAChB,YAAY,MAAM,SAAS,GAAG;EAC9B;CACF;CACA,MAAM,KAAK,MAAM,UAAU,QAAQ,QAAQ;CAK3C,aAAY,MAJM,OAAO,QAAQ,UAAU,MAAM;EAC/C,QAAQ;EACR,MAAM,MAAM;CACd,CAAC,GACe,MAAM,GAAG;AAC3B;AAEA,eAAe,UAAU,QAAmB,UAAmC;CAC7E,IAAI,cAAc,QAAQ,GAAG,OAAO;CACpC,MAAM,MAAM,MAAM,OAAO,QAAwB,eAAe,UAAU;CAC1E,IAAI,CAAC,IAAI,MAAM,IACb,MAAM,IAAI,SAAS;EACjB,MAAM;EACN,SAAS,mBAAmB;CAC9B,CAAC;CACH,OAAO,IAAI,KAAK;AAClB;AAEA,eAAe,YACb,QACA,UACiB;CACjB,MAAM,OAAO,cAAc,QAAQ,IAC/B,UAAU,aACV,eAAe;CAEnB,MAAM,QAAO,MADK,OAAO,QAAa,MAAM,EAAE,OAAO,EAAE,QAAQ,UAAU,EAAE,CAAC,GAC3D;CACjB,MAAM,QACJ,KAAK,kBAAkB,aAAa,KAAK,UACrC,qBAAqB,KAAK,MAAM,KAAK,OAAO,CAAC,IAC5C,KAAK,WAAW;CACvB,OAAO;;aAEI,IAAI,KAAK,SAAS,EAAE,EAAE;YACvB,IAAI,KAAK,QAAQ,EAAE,EAAE;;;EAG/B,MAAM;;;;AAIR;AAEA,SAAS,IAAI,GAAmB;CAC9B,OAAO,EACJ,WAAW,KAAK,OAAO,EACvB,WAAW,KAAK,MAAM,EACtB,WAAW,KAAK,MAAM;AAC3B"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"editor-Dywlo4-8.mjs","names":["fs"],"sources":["../src/core/editor.ts"],"sourcesContent":["import { spawn } from 'node:child_process'\nimport { promises as fs } from 'node:fs'\nimport os from 'node:os'\nimport path from 'node:path'\n\nimport { MxsError } from './errors'\n\nexport interface EditorOptions {\n filename: string\n initialContent: string\n editor?: string\n}\n\nexport async function runEditorRoundTrip(opts: EditorOptions): Promise<string> {\n const editor = opts.editor ?? process.env.EDITOR ?? process.env.VISUAL\n if (!editor) {\n throw new MxsError({\n code: 'generic',\n message: '$EDITOR not set',\n hint: 'export EDITOR=vim (or another editor) and try again',\n })\n }\n const dir = await fs.mkdtemp(path.join(os.tmpdir(), 'mxs-'))\n const tmpPath = path.join(dir, opts.filename)\n await fs.writeFile(tmpPath, opts.initialContent, 'utf8')\n await spawnInteractive(editor, [tmpPath])\n const next = await fs.readFile(tmpPath, 'utf8')\n await fs.unlink(tmpPath).catch(() => undefined)\n await fs.rmdir(dir).catch(() => undefined)\n return next\n}\n\nfunction spawnInteractive(cmd: string, args: string[]): Promise<void> {\n return new Promise((resolve, reject) => {\n const child = spawn(cmd, args, { stdio: 'inherit', shell: true })\n child.on('error', reject)\n child.on('exit', (code) => {\n if (code === 0) resolve()\n else\n reject(\n new MxsError({\n code: 'generic',\n message: `editor exited with code ${code}`,\n }),\n )\n })\n })\n}\n"],"mappings":";;;;;;AAaA,eAAsB,mBAAmB,MAAsC;CAC7E,MAAM,SAAS,KAAK,UAAU,QAAQ,IAAI,UAAU,QAAQ,IAAI;CAChE,IAAI,CAAC,QACH,MAAM,IAAI,SAAS;EACjB,MAAM;EACN,SAAS;EACT,MAAM;CACR,CAAC;CAEH,MAAM,MAAM,MAAMA,SAAG,QAAQ,KAAK,KAAK,GAAG,OAAO,GAAG,MAAM,CAAC;CAC3D,MAAM,UAAU,KAAK,KAAK,KAAK,KAAK,QAAQ;CAC5C,MAAMA,SAAG,UAAU,SAAS,KAAK,gBAAgB,MAAM;CACvD,MAAM,iBAAiB,QAAQ,CAAC,OAAO,CAAC;CACxC,MAAM,OAAO,MAAMA,SAAG,SAAS,SAAS,MAAM;CAC9C,MAAMA,SAAG,OAAO,OAAO,EAAE,YAAY,KAAA,CAAS;CAC9C,MAAMA,SAAG,MAAM,GAAG,EAAE,YAAY,KAAA,CAAS;CACzC,OAAO;AACT;AAEA,SAAS,iBAAiB,KAAa,MAA+B;CACpE,OAAO,IAAI,SAAS,SAAS,WAAW;EACtC,MAAM,QAAQ,MAAM,KAAK,MAAM;GAAE,OAAO;GAAW,OAAO;EAAK,CAAC;EAChE,MAAM,GAAG,SAAS,MAAM;EACxB,MAAM,GAAG,SAAS,SAAS;GACzB,IAAI,SAAS,GAAG,QAAQ;QAEtB,OACE,IAAI,SAAS;IACX,MAAM;IACN,SAAS,2BAA2B;GACtC,CAAC,CACH;EACJ,CAAC;CACH,CAAC;AACH"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"get-CkBqVyGi.mjs","names":[],"sources":["../src/commands/note/get.ts"],"sourcesContent":["import { type DocumentKind, emitDocument } from '../../core/document-output'\nimport { MxsError } from '../../core/errors'\nimport type { OutputOptions } from '../../core/output'\nimport { isSnowflakeId } from '../../core/resolve'\nimport {\n buildApiClient,\n type GlobalFlags,\n resolveContext,\n withLangQuery,\n} from '../internal/shared'\n\nconst KIND: DocumentKind = 'note'\n\nexport async function run(\n slugOrId: string,\n flags: GlobalFlags,\n out: OutputOptions,\n) {\n const ctx = await resolveContext(flags, out)\n const client = buildApiClient(ctx, flags)\n if (isSnowflakeId(slugOrId)) {\n const res = await client.request(`/notes/${slugOrId}`, {\n query: withLangQuery(flags, { prefer: 'lexical' }),\n })\n emitDocument(KIND, res.data, out)\n return\n }\n if (/^\\d+$/.test(slugOrId)) {\n const res = await client.request(`/notes/nid/${slugOrId}`, {\n query: withLangQuery(flags, { single: '1', prefer: 'lexical' }),\n })\n emitDocument(KIND, res.data, out)\n return\n }\n throw new MxsError({\n code: 'validation.failed',\n message: `invalid note reference: ${slugOrId} (use snowflake id or numeric nid)`,\n })\n}\n"],"mappings":";;;;;AAWA,MAAM,OAAqB;AAE3B,eAAsB,IACpB,UACA,OACA,KACA;CAEA,MAAM,SAAS,eAAe,MADZ,eAAe,OAAO,GAAG,GACR,KAAK;CACxC,IAAI,cAAc,QAAQ,GAAG;EAI3B,aAAa,OAAM,MAHD,OAAO,QAAQ,UAAU,YAAY,EACrD,OAAO,cAAc,OAAO,EAAE,QAAQ,UAAU,CAAC,EACnD,CAAC,GACsB,MAAM,GAAG;EAChC;CACF;CACA,IAAI,QAAQ,KAAK,QAAQ,GAAG;EAI1B,aAAa,OAAM,MAHD,OAAO,QAAQ,cAAc,YAAY,EACzD,OAAO,cAAc,OAAO;GAAE,QAAQ;GAAK,QAAQ;EAAU,CAAC,EAChE,CAAC,GACsB,MAAM,GAAG;EAChC;CACF;CACA,MAAM,IAAI,SAAS;EACjB,MAAM;EACN,SAAS,2BAA2B,SAAS;CAC/C,CAAC;AACH"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"logout-D63ZU-1Q.mjs","names":[],"sources":["../src/commands/auth/logout.ts"],"sourcesContent":["import { MxsError } from '../../core/errors'\nimport { emitInfo, emitSuccess, type OutputOptions } from '../../core/output'\nimport { deleteProfileCredentials, getCurrentProfile } from '../../core/profile'\nimport { type GlobalFlags } from '../internal/shared'\n\nexport async function run(flags: GlobalFlags, out: OutputOptions) {\n const target = flags.profile?.trim() || (await getCurrentProfile()) || null\n\n if (!target) {\n throw new MxsError({\n code: 'profile.none_active',\n message: 'no active profile to log out of',\n hint: 'pass --profile <name> or set an active profile with `mxs profile use <name>`',\n })\n }\n\n await deleteProfileCredentials(target)\n emitInfo(`mxs: logged out of profile '${target}'`, out)\n emitSuccess({ ok: true }, out)\n}\n"],"mappings":";;AAKA,eAAsB,IAAI,OAAoB,KAAoB;CAChE,MAAM,SAAS,MAAM,SAAS,KAAK,KAAM,MAAM,kBAAkB,KAAM;CAEvE,IAAI,CAAC,QACH,MAAM,IAAI,SAAS;EACjB,MAAM;EACN,SAAS;EACT,MAAM;CACR,CAAC;CAGH,MAAM,yBAAyB,MAAM;CACrC,SAAS,+BAA+B,OAAO,IAAI,GAAG;CACtD,YAAY,EAAE,IAAI,KAAK,GAAG,GAAG;AAC/B"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mark-N-IpKK17.mjs","names":["fs"],"sources":["../src/commands/profile/mark.ts"],"sourcesContent":["import { promises as fs } from 'node:fs'\n\nimport { MxsError } from '../../core/errors'\nimport { emitInfo, type OutputOptions } from '../../core/output'\nimport {\n getProfileDir,\n readProfileConfig,\n validateProfileName,\n writeProfileConfig,\n} from '../../core/profile'\nimport type { GlobalFlags } from '../internal/shared'\n\nexport interface MarkOpts {\n production?: boolean\n}\n\nexport async function run(\n name: string,\n opts: MarkOpts,\n _flags: GlobalFlags,\n out: OutputOptions,\n) {\n validateProfileName(name)\n\n if (opts.production === undefined) {\n throw new MxsError({\n code: 'validation.failed',\n message: 'one of --production or --no-production is required',\n })\n }\n\n try {\n const stat = await fs.stat(getProfileDir(name))\n if (!stat.isDirectory()) throw new Error('not a directory')\n } catch (err: any) {\n if (err?.code !== 'ENOENT' && !(err instanceof MxsError)) throw err\n throw new MxsError({\n code: 'profile.not_found',\n message: `profile '${name}' does not exist`,\n })\n }\n\n const existing = await readProfileConfig(name)\n await writeProfileConfig(name, { ...existing, production: opts.production })\n\n const flag = opts.production ? '--production' : '--no-production'\n emitInfo(`mxs: profile '${name}' marked with ${flag}`, out)\n}\n"],"mappings":";;;AAgBA,eAAsB,IACpB,MACA,MACA,QACA,KACA;CACA,oBAAoB,IAAI;CAExB,IAAI,KAAK,eAAe,KAAA,GACtB,MAAM,IAAI,SAAS;EACjB,MAAM;EACN,SAAS;CACX,CAAC;CAGH,IAAI;EAEF,IAAI,EAAC,MADcA,SAAG,KAAK,cAAc,IAAI,CAAC,GACpC,YAAY,GAAG,MAAM,IAAI,MAAM,iBAAiB;CAC5D,SAAS,KAAU;EACjB,IAAI,KAAK,SAAS,YAAY,EAAE,eAAe,WAAW,MAAM;EAChE,MAAM,IAAI,SAAS;GACjB,MAAM;GACN,SAAS,YAAY,KAAK;EAC5B,CAAC;CACH;CAGA,MAAM,mBAAmB,MAAM;EAAE,GAAG,MADb,kBAAkB,IAAI;EACC,YAAY,KAAK;CAAW,CAAC;CAG3E,SAAS,iBAAiB,KAAK,gBADlB,KAAK,aAAa,iBAAiB,qBACO,GAAG;AAC5D"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"onboarding-FPMcuqn8.mjs","names":["text"],"sources":["../src/core/gate.ts","../src/core/api-client.ts","../src/core/onboarding.ts"],"sourcesContent":["import type { ResolvedConfig } from './config-store'\n\nexport type HttpMethod =\n | 'GET'\n | 'HEAD'\n | 'OPTIONS'\n | 'POST'\n | 'PUT'\n | 'PATCH'\n | 'DELETE'\n\nexport interface GateDecision {\n allow: boolean\n code?: 'profile.write_requires_explicit'\n message?: string\n hint?: string\n}\n\nconst SAFE_METHODS = new Set<HttpMethod>(['GET', 'HEAD', 'OPTIONS'])\n\nexport function decideWriteGate(\n resolved: ResolvedConfig,\n method: HttpMethod,\n): GateDecision {\n if (SAFE_METHODS.has(method)) {\n return { allow: true }\n }\n if (!resolved.isProduction) {\n return { allow: true }\n }\n if (resolved.profileExplicit) {\n return { allow: true }\n }\n if (resolved.urlOverridden) {\n return { allow: true }\n }\n\n const name = resolved.profileName ?? 'unknown'\n const url = resolved.apiUrl\n\n return {\n allow: false,\n code: 'profile.write_requires_explicit',\n message: `write blocked: active profile '${name}' (${url}) is production`,\n hint: `active profile '${name}' is production; retry with --profile ${name} or MXS_PROFILE=${name}`,\n }\n}\n","import {\n type AuthHttp,\n defaultHttp,\n ensureFreshToken,\n refreshAccessToken,\n} from './auth'\nimport {\n type CredentialsShape,\n readCredentials,\n type ResolvedConfig,\n writeCredentials,\n} from './config-store'\nimport { MxsError } from './errors'\nimport { decideWriteGate, type HttpMethod } from './gate'\n\nexport interface ApiClientContext {\n apiBase: string\n authBase: string\n clientId: string\n token?: string\n apiKey?: string\n autoRefresh?: boolean\n verbose?: boolean\n quiet?: boolean\n http?: AuthHttp\n /** When provided, enables the production banner and write gate. */\n resolved?: ResolvedConfig\n}\n\nexport interface RequestOptions {\n method?: 'GET' | 'POST' | 'PATCH' | 'PUT' | 'DELETE'\n body?: unknown\n query?: Record<string, unknown>\n headers?: Record<string, string>\n signal?: AbortSignal\n}\n\nexport interface ApiResponse<T> {\n ok: boolean\n status: number\n data: T\n}\n\nexport class ApiClient {\n private http: AuthHttp\n private token?: string\n private refreshed = false\n\n constructor(private ctx: ApiClientContext) {\n this.http = ctx.http ?? defaultHttp()\n this.token = ctx.token\n if (ctx.resolved?.isProduction && !ctx.quiet) {\n const r = ctx.resolved\n process.stderr.write(\n `mxs: profile=${r.profileName} (production) → ${r.apiUrl}\\n`,\n )\n }\n }\n\n get apiBase(): string {\n return this.ctx.apiBase\n }\n\n async request<T = unknown>(\n path: string,\n options: RequestOptions = {},\n ): Promise<ApiResponse<T>> {\n const method = (options.method ?? 'GET') as HttpMethod\n if (this.ctx.resolved) {\n const decision = decideWriteGate(this.ctx.resolved, method)\n if (!decision.allow) {\n throw new MxsError({\n code: 'profile.write_requires_explicit',\n message: decision.message!,\n hint: decision.hint,\n details: {\n profile: this.ctx.resolved.profileName,\n api_url: this.ctx.resolved.apiUrl,\n },\n })\n }\n }\n if (this.ctx.autoRefresh && this.token) {\n await this.tryRefresh()\n }\n const url = buildUrl(this.ctx.apiBase, path, options.query)\n const headers: Record<string, string> = {\n accept: 'application/json',\n ...options.headers,\n }\n if (this.token) headers.authorization = `Bearer ${this.token}`\n if (this.ctx.apiKey) headers['x-api-key'] = this.ctx.apiKey\n if (options.body !== undefined && !(options.body instanceof FormData)) {\n headers['content-type'] ??= 'application/json'\n }\n const startedAt = Date.now()\n let res = await this.http.fetch(url, {\n method,\n headers,\n body:\n options.body === undefined\n ? undefined\n : options.body instanceof FormData\n ? options.body\n : JSON.stringify(options.body),\n signal: options.signal,\n })\n if (this.ctx.verbose) {\n process.stderr.write(\n `${method} ${url} → ${res.status} (${Date.now() - startedAt}ms)\\n`,\n )\n }\n\n if (res.status === 401 && !this.refreshed && this.token) {\n const refreshed = await this.tryRefresh()\n if (refreshed) {\n this.refreshed = true\n headers.authorization = `Bearer ${refreshed.access_token}`\n this.token = refreshed.access_token\n res = await this.http.fetch(url, {\n method,\n headers,\n body:\n options.body === undefined\n ? undefined\n : options.body instanceof FormData\n ? options.body\n : JSON.stringify(options.body),\n signal: options.signal,\n })\n }\n }\n\n const data = await parseBody<T>(res)\n if (res.ok) return { ok: true, status: res.status, data }\n\n throw toMxsError(res.status, data)\n }\n\n private async tryRefresh(): Promise<CredentialsShape | null> {\n const current = await readCredentials()\n if (!current) return null\n if (this.token && current.access_token !== this.token) return null\n const refreshed = await refreshAccessToken(\n this.ctx.authBase,\n this.ctx.clientId,\n current,\n this.http,\n )\n if (!refreshed) return null\n await writeCredentials(refreshed)\n this.token = refreshed.access_token\n return refreshed\n }\n}\n\nexport async function createApiClient(\n ctx: ApiClientContext,\n): Promise<ApiClient> {\n if (!ctx.token) return new ApiClient(ctx)\n const fresh = await ensureFreshToken(\n ctx.authBase,\n ctx.clientId,\n ctx.http ?? defaultHttp(),\n ).catch(() => null)\n if (fresh) {\n return new ApiClient({ ...ctx, token: fresh.access_token })\n }\n return new ApiClient(ctx)\n}\n\nfunction buildUrl(\n base: string,\n path: string,\n query?: Record<string, unknown>,\n): string {\n const url = new URL(\n path.startsWith('/') ? path.slice(1) : path,\n base.endsWith('/') ? base : `${base}/`,\n )\n if (query) {\n for (const [k, v] of Object.entries(query)) {\n if (v === undefined || v === null) continue\n url.searchParams.set(k, String(v))\n }\n }\n return url.toString()\n}\n\nasync function parseBody<T>(res: Response): Promise<T> {\n const ct = res.headers.get('content-type') ?? ''\n if (ct.includes('application/json')) {\n try {\n return (await res.json()) as T\n } catch {\n return undefined as T\n }\n }\n return (await res.text()) as unknown as T\n}\n\nfunction toMxsError(status: number, body: unknown): MxsError {\n if (status === 401) {\n return new MxsError({\n code: 'auth.expired',\n message: 'authentication required',\n hint: 'run `mxs auth login`',\n details: body,\n })\n }\n if (status === 403) {\n return new MxsError({\n code: 'auth.denied',\n message: 'permission denied',\n details: body,\n })\n }\n if (status === 404) {\n return new MxsError({\n code: 'resource.not_found',\n message: 'resource not found',\n details: body,\n })\n }\n if (status === 422 || status === 400) {\n return new MxsError({\n code: 'validation.failed',\n message: extractMessage(body) ?? 'validation failed',\n details: body,\n })\n }\n if (status >= 500) {\n return new MxsError({\n code: 'server.error',\n message: extractMessage(body) ?? `server error (${status})`,\n details: body,\n })\n }\n return new MxsError({\n code: 'generic',\n message: extractMessage(body) ?? `request failed (${status})`,\n details: body,\n })\n}\n\nfunction extractMessage(body: unknown): string | null {\n if (!body || typeof body !== 'object') return null\n const msg = (body as Record<string, unknown>).message\n if (typeof msg === 'string') return msg\n if (Array.isArray(msg) && typeof msg[0] === 'string') return msg.join('; ')\n return null\n}\n","import { text } from '@clack/prompts'\n\nimport { type AuthHttp, defaultHttp, probeAuthEndpoint } from './auth'\nimport { normalizeApiUrl } from './config-store'\nimport { MxsError } from './errors'\nimport {\n getCurrentProfile,\n setCurrentProfile,\n writeProfileConfig,\n} from './profile'\n\nexport interface OnboardingResult {\n apiUrl: string\n apiBase: string\n authBase: string\n apiVersion: number\n}\n\nexport interface OnboardingOptions {\n http?: AuthHttp\n initialApiUrl?: string\n isTTY?: boolean\n prompt?: (question: string) => Promise<string>\n /** Override the target profile name (mirrors --profile flag). */\n profile?: string\n}\n\nexport async function runOnboarding(\n opts: OnboardingOptions = {},\n): Promise<OnboardingResult> {\n const tty = opts.isTTY ?? Boolean(process.stdin.isTTY && process.stdout.isTTY)\n let input = opts.initialApiUrl\n if (!input) {\n if (!tty) {\n throw new MxsError({\n code: 'config.missing.api_url',\n message: 'API URL is not configured',\n hint: 'set MXS_API_URL or pass --api-url <url>, or run `mxs auth login` in an interactive shell',\n })\n }\n if (opts.prompt) {\n input = await opts.prompt('API URL of your mx-core server')\n } else {\n const answer = await text({\n message: 'API URL of your mx-core server',\n placeholder: 'https://blog.example.com',\n validate: (v) => (!v || v.trim().length === 0 ? 'required' : undefined),\n })\n if (typeof answer !== 'string') {\n throw new MxsError({\n code: 'config.missing.api_url',\n message: 'onboarding aborted',\n })\n }\n input = answer\n }\n }\n\n const apiUrl = normalizeApiUrl(input)\n const probed = await probeAuthEndpoint(apiUrl, opts.http ?? defaultHttp())\n\n // Determine target profile: --profile > active current > 'default'\n const target =\n opts.profile?.trim() || (await getCurrentProfile()) || 'default'\n\n await writeProfileConfig(target, {\n api_url: probed.apiUrl,\n api_base: probed.apiBase,\n auth_base: probed.authBase,\n api_version: probed.apiVersion,\n client_id: 'mxs-cli',\n })\n\n await setCurrentProfile(target)\n\n return probed\n}\n"],"mappings":"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"}
|