@mx-space/cli 0.1.1 → 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.
Files changed (235) hide show
  1. package/README.md +101 -28
  2. package/ROADMAP.md +4 -3
  3. package/dist/{Lexical.dev-DpU35QTu.mjs → Lexical.dev-CMevU1DO.mjs} +1 -1
  4. package/dist/{Lexical.dev-DpU35QTu.mjs.map → Lexical.dev-CMevU1DO.mjs.map} +1 -1
  5. package/dist/{Lexical.node-gYNDt_p9.mjs → Lexical.node-BR9e7Cyk.mjs} +2 -2
  6. package/dist/{Lexical.node-gYNDt_p9.mjs.map → Lexical.node-BR9e7Cyk.mjs.map} +1 -1
  7. package/dist/{Lexical.prod-t4c3bHV3.mjs → Lexical.prod-PUD-z9fY.mjs} +1 -1
  8. package/dist/{Lexical.prod-t4c3bHV3.mjs.map → Lexical.prod-PUD-z9fY.mjs.map} +1 -1
  9. package/dist/{LexicalClipboard.dev-CdeeWCIq.mjs → LexicalClipboard.dev-DZC2zppG.mjs} +6 -6
  10. package/dist/{LexicalClipboard.dev-CdeeWCIq.mjs.map → LexicalClipboard.dev-DZC2zppG.mjs.map} +1 -1
  11. package/dist/{LexicalClipboard.node-0e9GBL1g.mjs → LexicalClipboard.node-e5G1wVGb.mjs} +2 -2
  12. package/dist/{LexicalClipboard.node-0e9GBL1g.mjs.map → LexicalClipboard.node-e5G1wVGb.mjs.map} +1 -1
  13. package/dist/{LexicalClipboard.prod-CsCWYmV7.mjs → LexicalClipboard.prod-DE2azzIb.mjs} +6 -6
  14. package/dist/{LexicalClipboard.prod-CsCWYmV7.mjs.map → LexicalClipboard.prod-DE2azzIb.mjs.map} +1 -1
  15. package/dist/{LexicalCodeCore.dev-haI2cqH8.mjs → LexicalCodeCore.dev-gs--x55I.mjs} +3 -3
  16. package/dist/{LexicalCodeCore.dev-haI2cqH8.mjs.map → LexicalCodeCore.dev-gs--x55I.mjs.map} +1 -1
  17. package/dist/{LexicalCodeCore.prod-D_k7zuE5.mjs → LexicalCodeCore.prod-DPHOnyEj.mjs} +3 -3
  18. package/dist/{LexicalCodeCore.prod-D_k7zuE5.mjs.map → LexicalCodeCore.prod-DPHOnyEj.mjs.map} +1 -1
  19. package/dist/{LexicalDragon.dev-CAggdFh_.mjs → LexicalDragon.dev-CVe8bzVN.mjs} +3 -3
  20. package/dist/{LexicalDragon.dev-CAggdFh_.mjs.map → LexicalDragon.dev-CVe8bzVN.mjs.map} +1 -1
  21. package/dist/{LexicalDragon.node-QMR_wqJg.mjs → LexicalDragon.node-c7EHvcnK.mjs} +2 -2
  22. package/dist/{LexicalDragon.node-QMR_wqJg.mjs.map → LexicalDragon.node-c7EHvcnK.mjs.map} +1 -1
  23. package/dist/{LexicalDragon.prod-OssQhwS-.mjs → LexicalDragon.prod-D6KvqyLD.mjs} +3 -3
  24. package/dist/{LexicalDragon.prod-OssQhwS-.mjs.map → LexicalDragon.prod-D6KvqyLD.mjs.map} +1 -1
  25. package/dist/{LexicalExtension.dev-CtDZiMCU.mjs → LexicalExtension.dev-PDo8HyEw.mjs} +3 -3
  26. package/dist/{LexicalExtension.dev-CtDZiMCU.mjs.map → LexicalExtension.dev-PDo8HyEw.mjs.map} +1 -1
  27. package/dist/{LexicalExtension.node-BM0gh8zu.mjs → LexicalExtension.node-BKzjRb-0.mjs} +2 -2
  28. package/dist/{LexicalExtension.node-BM0gh8zu.mjs.map → LexicalExtension.node-BKzjRb-0.mjs.map} +1 -1
  29. package/dist/{LexicalExtension.prod-Ug6emhEO.mjs → LexicalExtension.prod-D0x_lX7q.mjs} +3 -3
  30. package/dist/{LexicalExtension.prod-Ug6emhEO.mjs.map → LexicalExtension.prod-D0x_lX7q.mjs.map} +1 -1
  31. package/dist/{LexicalHeadless.dev-D4yQpl_s.mjs → LexicalHeadless.dev-DBKcW82j.mjs} +2 -2
  32. package/dist/{LexicalHeadless.dev-D4yQpl_s.mjs.map → LexicalHeadless.dev-DBKcW82j.mjs.map} +1 -1
  33. package/dist/{LexicalHeadless.prod-jeN65B3k.mjs → LexicalHeadless.prod-D4nEh7cR.mjs} +2 -2
  34. package/dist/{LexicalHeadless.prod-jeN65B3k.mjs.map → LexicalHeadless.prod-D4nEh7cR.mjs.map} +1 -1
  35. package/dist/{LexicalHtml.dev-BdU1_ITQ.mjs → LexicalHtml.dev-vsWW05es.mjs} +4 -4
  36. package/dist/{LexicalHtml.dev-BdU1_ITQ.mjs.map → LexicalHtml.dev-vsWW05es.mjs.map} +1 -1
  37. package/dist/{LexicalHtml.node-DLtAh00E.mjs → LexicalHtml.node-CpibAfba.mjs} +2 -2
  38. package/dist/{LexicalHtml.node-DLtAh00E.mjs.map → LexicalHtml.node-CpibAfba.mjs.map} +1 -1
  39. package/dist/{LexicalHtml.prod-DdLE1HHT.mjs → LexicalHtml.prod-Bqz-3WAp.mjs} +4 -4
  40. package/dist/{LexicalHtml.prod-DdLE1HHT.mjs.map → LexicalHtml.prod-Bqz-3WAp.mjs.map} +1 -1
  41. package/dist/{LexicalLink.dev-DK87Biuy.mjs → LexicalLink.dev-BO0J0B1E.mjs} +4 -4
  42. package/dist/{LexicalLink.dev-DK87Biuy.mjs.map → LexicalLink.dev-BO0J0B1E.mjs.map} +1 -1
  43. package/dist/{LexicalLink.prod-fssuv6Sf.mjs → LexicalLink.prod-D66AhUCZ.mjs} +4 -4
  44. package/dist/{LexicalLink.prod-fssuv6Sf.mjs.map → LexicalLink.prod-D66AhUCZ.mjs.map} +1 -1
  45. package/dist/{LexicalList.dev-BJ4dr_rk.mjs → LexicalList.dev-DVGTWRk0.mjs} +4 -4
  46. package/dist/{LexicalList.dev-BJ4dr_rk.mjs.map → LexicalList.dev-DVGTWRk0.mjs.map} +1 -1
  47. package/dist/{LexicalList.prod-jWBbaWfi.mjs → LexicalList.prod-Bao7NGl7.mjs} +4 -4
  48. package/dist/{LexicalList.prod-jWBbaWfi.mjs.map → LexicalList.prod-Bao7NGl7.mjs.map} +1 -1
  49. package/dist/{LexicalMarkdown.dev-C8e-eh6y.mjs → LexicalMarkdown.dev-CRWkZwlp.mjs} +4 -4
  50. package/dist/{LexicalMarkdown.dev-C8e-eh6y.mjs.map → LexicalMarkdown.dev-CRWkZwlp.mjs.map} +1 -1
  51. package/dist/{LexicalMarkdown.prod-k73tZVb2.mjs → LexicalMarkdown.prod-tGG6js4r.mjs} +4 -4
  52. package/dist/{LexicalMarkdown.prod-k73tZVb2.mjs.map → LexicalMarkdown.prod-tGG6js4r.mjs.map} +1 -1
  53. package/dist/{LexicalRichText.dev-CrSqq3K-.mjs → LexicalRichText.dev-DPXfQePC.mjs} +6 -6
  54. package/dist/{LexicalRichText.dev-CrSqq3K-.mjs.map → LexicalRichText.dev-DPXfQePC.mjs.map} +1 -1
  55. package/dist/{LexicalRichText.node-B7k7wlQz.mjs → LexicalRichText.node-BEkm_YwY.mjs} +5 -5
  56. package/dist/{LexicalRichText.node-B7k7wlQz.mjs.map → LexicalRichText.node-BEkm_YwY.mjs.map} +1 -1
  57. package/dist/{LexicalRichText.prod-CqvyxQ9m.mjs → LexicalRichText.prod-DlfudC5w.mjs} +6 -6
  58. package/dist/{LexicalRichText.prod-CqvyxQ9m.mjs.map → LexicalRichText.prod-DlfudC5w.mjs.map} +1 -1
  59. package/dist/{LexicalSelection.dev-sNOHKHe_.mjs → LexicalSelection.dev-BVTArZ-b.mjs} +2 -2
  60. package/dist/{LexicalSelection.dev-sNOHKHe_.mjs.map → LexicalSelection.dev-BVTArZ-b.mjs.map} +1 -1
  61. package/dist/{LexicalSelection.node-Di7GwBCZ.mjs → LexicalSelection.node-CQ8iTYsz.mjs} +2 -2
  62. package/dist/{LexicalSelection.node-Di7GwBCZ.mjs.map → LexicalSelection.node-CQ8iTYsz.mjs.map} +1 -1
  63. package/dist/{LexicalSelection.prod-SWllPJop.mjs → LexicalSelection.prod-BZKGGs-G.mjs} +2 -2
  64. package/dist/{LexicalSelection.prod-SWllPJop.mjs.map → LexicalSelection.prod-BZKGGs-G.mjs.map} +1 -1
  65. package/dist/{LexicalTable.dev-CQkLHXJx.mjs → LexicalTable.dev-C-AOEpJn.mjs} +5 -5
  66. package/dist/{LexicalTable.dev-CQkLHXJx.mjs.map → LexicalTable.dev-C-AOEpJn.mjs.map} +1 -1
  67. package/dist/{LexicalTable.prod-BtqCwKSi.mjs → LexicalTable.prod-Cyn0qWxZ.mjs} +5 -5
  68. package/dist/{LexicalTable.prod-BtqCwKSi.mjs.map → LexicalTable.prod-Cyn0qWxZ.mjs.map} +1 -1
  69. package/dist/{LexicalUtils.dev-DiUpsXE8.mjs → LexicalUtils.dev-DRRDyAlS.mjs} +3 -3
  70. package/dist/{LexicalUtils.dev-DiUpsXE8.mjs.map → LexicalUtils.dev-DRRDyAlS.mjs.map} +1 -1
  71. package/dist/{LexicalUtils.node-CmK462d1.mjs → LexicalUtils.node-Dz-HANi6.mjs} +2 -2
  72. package/dist/{LexicalUtils.node-CmK462d1.mjs.map → LexicalUtils.node-Dz-HANi6.mjs.map} +1 -1
  73. package/dist/{LexicalUtils.prod-bWwV4GAF.mjs → LexicalUtils.prod-CmeHwh8W.mjs} +3 -3
  74. package/dist/{LexicalUtils.prod-bWwV4GAF.mjs.map → LexicalUtils.prod-CmeHwh8W.mjs.map} +1 -1
  75. package/dist/{auth-OeKZZ_2x.mjs → auth-CAKmTDpF.mjs} +11 -11
  76. package/dist/auth-CAKmTDpF.mjs.map +1 -0
  77. package/dist/bin/mxs.d.mts +2 -1
  78. package/dist/bin/mxs.mjs +402 -55
  79. package/dist/bin/mxs.mjs.map +1 -1
  80. package/dist/{config-store-WL7dNMS6.mjs → config-store-B8_9iStL.mjs} +21 -81
  81. package/dist/config-store-B8_9iStL.mjs.map +1 -0
  82. package/dist/{create-Cxnqt_Wt.mjs → create-5wbU7IQh.mjs} +5 -5
  83. package/dist/{create-Cxnqt_Wt.mjs.map → create-5wbU7IQh.mjs.map} +1 -1
  84. package/dist/{create-DUOSAqBm.mjs → create-Bs6K7AyQ.mjs} +3 -3
  85. package/dist/{create-DUOSAqBm.mjs.map → create-Bs6K7AyQ.mjs.map} +1 -1
  86. package/dist/{create-C85MSrtt.mjs → create-DBReocgJ.mjs} +5 -5
  87. package/dist/{create-C85MSrtt.mjs.map → create-DBReocgJ.mjs.map} +1 -1
  88. package/dist/{create-BVHnXtIH.mjs → create-DGVaE0_S.mjs} +4 -4
  89. package/dist/{create-BVHnXtIH.mjs.map → create-DGVaE0_S.mjs.map} +1 -1
  90. package/dist/{create-BWA2WGrW.mjs → create-lLFZuMsz.mjs} +3 -3
  91. package/dist/{create-BWA2WGrW.mjs.map → create-lLFZuMsz.mjs.map} +1 -1
  92. package/dist/{delete-CGy-cV6k.mjs → delete-6tkhHQDp.mjs} +5 -5
  93. package/dist/delete-6tkhHQDp.mjs.map +1 -0
  94. package/dist/{delete-CcyrLNZv.mjs → delete-CRFxitDN.mjs} +6 -6
  95. package/dist/delete-CRFxitDN.mjs.map +1 -0
  96. package/dist/{delete-Cjxehwj7.mjs → delete-DU2Hvsy8.mjs} +5 -5
  97. package/dist/delete-DU2Hvsy8.mjs.map +1 -0
  98. package/dist/{delete-BEXOOFAJ.mjs → delete-nJmHtvfq.mjs} +6 -6
  99. package/dist/delete-nJmHtvfq.mjs.map +1 -0
  100. package/dist/{delete-CKqlAUT8.mjs → delete-tJhXI8s4.mjs} +5 -5
  101. package/dist/delete-tJhXI8s4.mjs.map +1 -0
  102. package/dist/{onboarding-C1t1yoay.mjs → dist-DJF1Ntdn.mjs} +95 -173
  103. package/dist/dist-DJF1Ntdn.mjs.map +1 -0
  104. package/dist/{document-output-C5PWbz2p.mjs → document-output-BFJdwPV0.mjs} +5 -5
  105. package/dist/document-output-BFJdwPV0.mjs.map +1 -0
  106. package/dist/{edit-BuKMUNVC.mjs → edit-BMjTbPQO.mjs} +5 -5
  107. package/dist/edit-BMjTbPQO.mjs.map +1 -0
  108. package/dist/{edit-DFnOnk4i.mjs → edit-BnEmMmv6.mjs} +9 -9
  109. package/dist/edit-BnEmMmv6.mjs.map +1 -0
  110. package/dist/{edit-BRaZ6GGg.mjs → edit-C4vRSmRy.mjs} +9 -9
  111. package/dist/{edit-BRaZ6GGg.mjs.map → edit-C4vRSmRy.mjs.map} +1 -1
  112. package/dist/{edit-t108N11Q.mjs → edit-CQsW5gnk.mjs} +8 -8
  113. package/dist/{edit-t108N11Q.mjs.map → edit-CQsW5gnk.mjs.map} +1 -1
  114. package/dist/{editor-xrF-j3UE.mjs → editor-BIw1ALTF.mjs} +4 -4
  115. package/dist/editor-BIw1ALTF.mjs.map +1 -0
  116. package/dist/{envelope-overlays-DPAlMNW1.mjs → envelope-overlays-DXXygxdF.mjs} +2 -2
  117. package/dist/{envelope-overlays-DPAlMNW1.mjs.map → envelope-overlays-DXXygxdF.mjs.map} +1 -1
  118. package/dist/{get-CwcNFb39.mjs → get-B3Y5hAAO.mjs} +3 -3
  119. package/dist/{get-CwcNFb39.mjs.map → get-B3Y5hAAO.mjs.map} +1 -1
  120. package/dist/{get-DnDvLa9S.mjs → get-C5fmd5Vf.mjs} +4 -4
  121. package/dist/{get-DnDvLa9S.mjs.map → get-C5fmd5Vf.mjs.map} +1 -1
  122. package/dist/{get-Doi-NKAh.mjs → get-Cdp2tmwz.mjs} +6 -6
  123. package/dist/get-Cdp2tmwz.mjs.map +1 -0
  124. package/dist/{get-DxTU7Nom.mjs → get-D18ChSKU.mjs} +3 -3
  125. package/dist/{get-DxTU7Nom.mjs.map → get-D18ChSKU.mjs.map} +1 -1
  126. package/dist/{get-BYoAlJwB.mjs → get-NSHTGu4Y.mjs} +4 -4
  127. package/dist/{get-BYoAlJwB.mjs.map → get-NSHTGu4Y.mjs.map} +1 -1
  128. package/dist/{get-GdRz82RW.mjs → get-XBPJr95m.mjs} +4 -4
  129. package/dist/{get-GdRz82RW.mjs.map → get-XBPJr95m.mjs.map} +1 -1
  130. package/dist/index.d.mts +57 -11
  131. package/dist/index.mjs +11 -10
  132. package/dist/{list-DVunNsXr.mjs → list-B6703n9X.mjs} +3 -3
  133. package/dist/{list-DVunNsXr.mjs.map → list-B6703n9X.mjs.map} +1 -1
  134. package/dist/{list-DN81zVDA.mjs → list-BtNocJhc.mjs} +3 -3
  135. package/dist/{list-DN81zVDA.mjs.map → list-BtNocJhc.mjs.map} +1 -1
  136. package/dist/{list-DHG-MzOM.mjs → list-C9dXrU9H.mjs} +3 -3
  137. package/dist/{list-DHG-MzOM.mjs.map → list-C9dXrU9H.mjs.map} +1 -1
  138. package/dist/{list-CtME3aDw.mjs → list-CcwcYZgN.mjs} +3 -3
  139. package/dist/{list-CtME3aDw.mjs.map → list-CcwcYZgN.mjs.map} +1 -1
  140. package/dist/{list-CLAcZYZ4.mjs → list-Ctc8b5gT.mjs} +3 -3
  141. package/dist/{list-CLAcZYZ4.mjs.map → list-Ctc8b5gT.mjs.map} +1 -1
  142. package/dist/{list-DbNCVZbz.mjs → list-b60JzCTw.mjs} +3 -3
  143. package/dist/{list-DbNCVZbz.mjs.map → list-b60JzCTw.mjs.map} +1 -1
  144. package/dist/{litexml-codec-CDoRloiR.mjs → litexml-codec-CfIxcPG0.mjs} +10 -10
  145. package/dist/{litexml-codec-CDoRloiR.mjs.map → litexml-codec-CfIxcPG0.mjs.map} +1 -1
  146. package/dist/{login-mjliJn8U.mjs → login-bZx4HaVs.mjs} +21 -9
  147. package/dist/{login-mjliJn8U.mjs.map → login-bZx4HaVs.mjs.map} +1 -1
  148. package/dist/logout-C0Dzitsu.mjs +18 -0
  149. package/dist/logout-C0Dzitsu.mjs.map +1 -0
  150. package/dist/ls-wMiTXZPQ.mjs +33 -0
  151. package/dist/ls-wMiTXZPQ.mjs.map +1 -0
  152. package/dist/mark-Dh9BErsf.mjs +29 -0
  153. package/dist/mark-Dh9BErsf.mjs.map +1 -0
  154. package/dist/onboarding-Bw_I8qpf.mjs +214 -0
  155. package/dist/onboarding-Bw_I8qpf.mjs.map +1 -0
  156. package/dist/{output-CTnO1lYt.d.mts → output-D2dDlyV2.d.mts} +1 -1
  157. package/dist/{output-BM7aBFwt.mjs → output-vzequvhd.mjs} +52 -9
  158. package/dist/output-vzequvhd.mjs.map +1 -0
  159. package/dist/{payload-CN11pUto.mjs → payload-CO4zbNr8.mjs} +17 -17
  160. package/dist/payload-CO4zbNr8.mjs.map +1 -0
  161. package/dist/profile-CNe2uWJi.mjs +172 -0
  162. package/dist/profile-CNe2uWJi.mjs.map +1 -0
  163. package/dist/{publish-akQWYsnL.mjs → publish-CzzucXQq.mjs} +4 -4
  164. package/dist/{publish-akQWYsnL.mjs.map → publish-CzzucXQq.mjs.map} +1 -1
  165. package/dist/{publish-CN3NTJ_r.mjs → publish-DRQkpxsz.mjs} +4 -4
  166. package/dist/{publish-CN3NTJ_r.mjs.map → publish-DRQkpxsz.mjs.map} +1 -1
  167. package/dist/{resolve-CyjMlaoJ.mjs → resolve-BYg5Gees.mjs} +5 -5
  168. package/dist/resolve-BYg5Gees.mjs.map +1 -0
  169. package/dist/{resolve-Bw5Po9yK.mjs → resolve-BlpMdnaM.mjs} +4 -4
  170. package/dist/resolve-BlpMdnaM.mjs.map +1 -0
  171. package/dist/{resolve-BogJOR7R.mjs → resolve-CUsHGcb-.mjs} +4 -4
  172. package/dist/resolve-CUsHGcb-.mjs.map +1 -0
  173. package/dist/{resolve-helpers-CahPoJ0Y.mjs → resolve-helpers-CoHYa2uk.mjs} +2 -2
  174. package/dist/{resolve-helpers-CahPoJ0Y.mjs.map → resolve-helpers-CoHYa2uk.mjs.map} +1 -1
  175. package/dist/{resolve-Bp1AfBmM.mjs → resolve-jdb1VqAG.mjs} +5 -5
  176. package/dist/resolve-jdb1VqAG.mjs.map +1 -0
  177. package/dist/rm-D-2iW1Cr.mjs +33 -0
  178. package/dist/rm-D-2iW1Cr.mjs.map +1 -0
  179. package/dist/run-Dnax6uhZ.mjs +130 -0
  180. package/dist/run-Dnax6uhZ.mjs.map +1 -0
  181. package/dist/self-update-CZywTwGd.mjs +1610 -0
  182. package/dist/self-update-CZywTwGd.mjs.map +1 -0
  183. package/dist/{set-ClbrGFGv.mjs → set-Dk28LAy5.mjs} +5 -5
  184. package/dist/set-Dk28LAy5.mjs.map +1 -0
  185. package/dist/{shared-C2EAn5h_.mjs → shared-d0_6ZPn_.mjs} +13 -9
  186. package/dist/shared-d0_6ZPn_.mjs.map +1 -0
  187. package/dist/show-DScu6mXz.mjs +39 -0
  188. package/dist/show-DScu6mXz.mjs.map +1 -0
  189. package/dist/status-8F6tgphP.mjs +23 -0
  190. package/dist/status-8F6tgphP.mjs.map +1 -0
  191. package/dist/{update-dc-72pUN.mjs → update-B1LGxV0n.mjs} +6 -6
  192. package/dist/{update-dc-72pUN.mjs.map → update-B1LGxV0n.mjs.map} +1 -1
  193. package/dist/{update-CHmckeo8.mjs → update-CXetpFT3.mjs} +4 -4
  194. package/dist/{update-CHmckeo8.mjs.map → update-CXetpFT3.mjs.map} +1 -1
  195. package/dist/{update-Duh-iVOZ.mjs → update-Dr4BW8U-.mjs} +6 -6
  196. package/dist/{update-Duh-iVOZ.mjs.map → update-Dr4BW8U-.mjs.map} +1 -1
  197. package/dist/{update-qfiC-9Og.mjs → update-bqcHRJPC.mjs} +6 -6
  198. package/dist/update-bqcHRJPC.mjs.map +1 -0
  199. package/dist/{update-CJjwg09n.mjs → update-dBtzzmkN.mjs} +5 -5
  200. package/dist/update-dBtzzmkN.mjs.map +1 -0
  201. package/dist/use-D7eKESSW.mjs +29 -0
  202. package/dist/use-D7eKESSW.mjs.map +1 -0
  203. package/dist/{whoami-UwcdRchK.mjs → whoami-CKSNd6zL.mjs} +6 -6
  204. package/dist/whoami-CKSNd6zL.mjs.map +1 -0
  205. package/package.json +15 -13
  206. package/LICENSE +0 -33
  207. package/dist/auth-OeKZZ_2x.mjs.map +0 -1
  208. package/dist/chunk-hT5z_Zn9.mjs +0 -35
  209. package/dist/config-store-WL7dNMS6.mjs.map +0 -1
  210. package/dist/delete-BEXOOFAJ.mjs.map +0 -1
  211. package/dist/delete-CGy-cV6k.mjs.map +0 -1
  212. package/dist/delete-CKqlAUT8.mjs.map +0 -1
  213. package/dist/delete-CcyrLNZv.mjs.map +0 -1
  214. package/dist/delete-Cjxehwj7.mjs.map +0 -1
  215. package/dist/document-output-C5PWbz2p.mjs.map +0 -1
  216. package/dist/edit-BuKMUNVC.mjs.map +0 -1
  217. package/dist/edit-DFnOnk4i.mjs.map +0 -1
  218. package/dist/editor-xrF-j3UE.mjs.map +0 -1
  219. package/dist/get-Doi-NKAh.mjs.map +0 -1
  220. package/dist/logout-Bslt_ZJ4.mjs +0 -11
  221. package/dist/logout-Bslt_ZJ4.mjs.map +0 -1
  222. package/dist/onboarding-C1t1yoay.mjs.map +0 -1
  223. package/dist/output-BM7aBFwt.mjs.map +0 -1
  224. package/dist/payload-CN11pUto.mjs.map +0 -1
  225. package/dist/resolve-BogJOR7R.mjs.map +0 -1
  226. package/dist/resolve-Bp1AfBmM.mjs.map +0 -1
  227. package/dist/resolve-Bw5Po9yK.mjs.map +0 -1
  228. package/dist/resolve-CyjMlaoJ.mjs.map +0 -1
  229. package/dist/set-ClbrGFGv.mjs.map +0 -1
  230. package/dist/shared-C2EAn5h_.mjs.map +0 -1
  231. package/dist/status-Cvyrrx-J.mjs +0 -22
  232. package/dist/status-Cvyrrx-J.mjs.map +0 -1
  233. package/dist/update-CJjwg09n.mjs.map +0 -1
  234. package/dist/update-qfiC-9Og.mjs.map +0 -1
  235. package/dist/whoami-UwcdRchK.mjs.map +0 -1
@@ -1,7 +1,7 @@
1
- import { i as emitSuccess, s as MxsError } from "./output-BM7aBFwt.mjs";
2
- import { n as buildPagePayload } from "./payload-CN11pUto.mjs";
3
- import { r as isSnowflakeId } from "./resolve-BogJOR7R.mjs";
4
- import { n as resolveContext, t as buildApiClient } from "./shared-C2EAn5h_.mjs";
1
+ import { c as MxsErrorCode, i as emitSuccess, s as MxsError } from "./output-vzequvhd.mjs";
2
+ import { n as buildPagePayload } from "./payload-CO4zbNr8.mjs";
3
+ import { r as isSnowflakeId } from "./resolve-CUsHGcb-.mjs";
4
+ import { n as resolveContext, t as buildApiClient } from "./shared-d0_6ZPn_.mjs";
5
5
  //#region src/commands/page/update.ts
6
6
  async function run(slugOrId, opts, flags, out) {
7
7
  const built = await buildPagePayload(opts);
@@ -25,7 +25,7 @@ async function resolveId(client, slugOrId) {
25
25
  if (isSnowflakeId(slugOrId)) return slugOrId;
26
26
  const res = await client.request(`/pages/slug/${slugOrId}`);
27
27
  if (!res.data?.id) throw new MxsError({
28
- code: "resource.not_found",
28
+ code: MxsErrorCode.ResourceNotFound,
29
29
  message: `page not found: ${slugOrId}`
30
30
  });
31
31
  return res.data.id;
@@ -33,4 +33,4 @@ async function resolveId(client, slugOrId) {
33
33
  //#endregion
34
34
  export { run };
35
35
 
36
- //# sourceMappingURL=update-qfiC-9Og.mjs.map
36
+ //# sourceMappingURL=update-bqcHRJPC.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-bqcHRJPC.mjs","names":[],"sources":["../src/commands/page/update.ts"],"sourcesContent":["import type { ApiClient } from '../../core/api-client'\nimport { MxsError, MxsErrorCode } from '../../core/errors'\nimport { emitSuccess, type OutputOptions } from '../../core/output'\nimport { buildPagePayload, type PageFlagInputs } from '../../core/payload'\nimport { isSnowflakeId } from '../../core/resolve'\nimport {\n buildApiClient,\n type GlobalFlags,\n resolveContext,\n} from '../internal/shared'\n\nexport async function run(\n slugOrId: string,\n opts: PageFlagInputs,\n flags: GlobalFlags,\n out: OutputOptions,\n) {\n const built = await buildPagePayload(opts)\n if (opts.content === undefined && !opts.file) {\n delete built.payload.content\n delete built.payload.text\n delete built.payload.contentFormat\n }\n if (flags.dryRun) {\n emitSuccess(built.payload, 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(`/pages/${id}`, {\n method: 'PATCH',\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: MxsErrorCode.ResourceNotFound,\n message: `page not found: ${slugOrId}`,\n })\n return res.data.id\n}\n"],"mappings":";;;;;AAWA,eAAsB,IACpB,UACA,MACA,OACA,KACA;CACA,MAAM,QAAQ,MAAM,iBAAiB,IAAI;CACzC,IAAI,KAAK,YAAY,KAAA,KAAa,CAAC,KAAK,MAAM;EAC5C,OAAO,MAAM,QAAQ;EACrB,OAAO,MAAM,QAAQ;EACrB,OAAO,MAAM,QAAQ;CACvB;CACA,IAAI,MAAM,QAAQ;EAChB,YAAY,MAAM,SAAS,GAAG;EAC9B;CACF;CAEA,MAAM,SAAS,eAAe,MADZ,eAAe,OAAO,GAAG,GACR,KAAK;CACxC,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,aAAa;EACnB,SAAS,mBAAmB;CAC9B,CAAC;CACH,OAAO,IAAI,KAAK;AAClB"}
@@ -1,6 +1,6 @@
1
- import { i as emitSuccess, s as MxsError } from "./output-BM7aBFwt.mjs";
2
- import { r as isSnowflakeId } from "./resolve-BogJOR7R.mjs";
3
- import { n as resolveContext, t as buildApiClient } from "./shared-C2EAn5h_.mjs";
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: "resource.not_found",
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-CJjwg09n.mjs.map
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"}
@@ -0,0 +1,29 @@
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";
3
+ //#region src/commands/profile/use.ts
4
+ async function run(name, _flags, out) {
5
+ try {
6
+ validateProfileName(name);
7
+ } catch {
8
+ throw new MxsError({
9
+ code: MxsErrorCode.ProfileInvalidName,
10
+ message: `'${name}' is not a valid profile name`,
11
+ hint: "profile name must match ^[a-z0-9_-]{1,32}$ and must not be \"current\""
12
+ });
13
+ }
14
+ try {
15
+ await setCurrentProfile(name);
16
+ } catch (err) {
17
+ if (err?.code === MxsErrorCode.ValidationFailed) throw new MxsError({
18
+ code: MxsErrorCode.ProfileNotFound,
19
+ message: `profile '${name}' does not exist`,
20
+ hint: "run `mxs profile ls` to see available profiles, or `mxs auth login --profile <name>` to create one"
21
+ });
22
+ throw err;
23
+ }
24
+ emitInfo(`mxs: active profile is now '${name}'`, out);
25
+ }
26
+ //#endregion
27
+ export { run };
28
+
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,12 +1,12 @@
1
- import { i as emitSuccess, s as MxsError } from "./output-BM7aBFwt.mjs";
2
- import { s as readCredentials } from "./config-store-WL7dNMS6.mjs";
3
- import { n as resolveContext, t as buildApiClient } from "./shared-C2EAn5h_.mjs";
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";
4
4
  //#region src/commands/auth/whoami.ts
5
5
  async function run(flags, out) {
6
6
  const ctx = await resolveContext(flags, out);
7
- const cred = await readCredentials();
7
+ const cred = ctx.profileName ? await readProfileCredentials(ctx.profileName) : null;
8
8
  if (!cred && !ctx.token && !ctx.apiKey) throw new MxsError({
9
- code: "auth.missing",
9
+ code: MxsErrorCode.AuthMissing,
10
10
  message: "not authenticated",
11
11
  hint: "run `mxs auth login`"
12
12
  });
@@ -19,4 +19,4 @@ async function run(flags, out) {
19
19
  //#endregion
20
20
  export { run };
21
21
 
22
- //# sourceMappingURL=whoami-UwcdRchK.mjs.map
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.1.1",
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
- "@mx-space/api-client": "4.2.0"
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-OeKZZ_2x.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,35 +0,0 @@
1
- import { createRequire } from "node:module";
2
- //#region \0rolldown/runtime.js
3
- var __create = Object.create;
4
- var __defProp = Object.defineProperty;
5
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
- var __getOwnPropNames = Object.getOwnPropertyNames;
7
- var __getProtoOf = Object.getPrototypeOf;
8
- var __hasOwnProp = Object.prototype.hasOwnProperty;
9
- var __commonJSMin = (cb, mod) => () => (mod || (cb((mod = { exports: {} }).exports, mod), cb = null), mod.exports);
10
- var __exportAll = (all, no_symbols) => {
11
- let target = {};
12
- for (var name in all) __defProp(target, name, {
13
- get: all[name],
14
- enumerable: true
15
- });
16
- if (!no_symbols) __defProp(target, Symbol.toStringTag, { value: "Module" });
17
- return target;
18
- };
19
- var __copyProps = (to, from, except, desc) => {
20
- if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
21
- key = keys[i];
22
- if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
23
- get: ((k) => from[k]).bind(null, key),
24
- enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
25
- });
26
- }
27
- return to;
28
- };
29
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
30
- value: mod,
31
- enumerable: true
32
- }) : target, mod));
33
- var __require = /* @__PURE__ */ createRequire(import.meta.url);
34
- //#endregion
35
- export { __toESM as i, __exportAll as n, __require as r, __commonJSMin as t };
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-store-WL7dNMS6.mjs","names":["fs","readJsonIfExists","fs"],"sources":["../src/core/config-dir.ts","../src/core/profile.ts","../src/core/config-store.ts"],"sourcesContent":["import os from 'node:os'\nimport path from 'node:path'\n\nexport function getConfigDir(): string {\n const xdg = process.env.XDG_CONFIG_HOME\n const base = xdg && xdg.length > 0 ? xdg : path.join(os.homedir(), '.config')\n return path.join(base, 'mxs')\n}\n","import { type Dirent, promises as fs } from 'node:fs'\nimport path from 'node:path'\n\nimport { getConfigDir } from './config-dir'\nimport type { ConfigShape, CredentialsShape } from './config-store'\nimport { MxsError } from './errors'\n\nexport { getConfigDir }\n\nexport const PROFILE_NAME_RE = /^[\\d_a-z-]{1,32}$/\n\nexport const RESERVED_PROFILE_NAMES = new Set(['current'])\n\nexport function validateProfileName(name: string): void {\n if (!name || name.length === 0) {\n throw new MxsError({\n code: 'validation.failed',\n message: 'profile name must not be empty',\n })\n }\n if (RESERVED_PROFILE_NAMES.has(name)) {\n throw new MxsError({\n code: 'validation.failed',\n message: `profile name '${name}' is reserved`,\n })\n }\n if (!PROFILE_NAME_RE.test(name)) {\n throw new MxsError({\n code: 'validation.failed',\n message: `profile name '${name}' is invalid; must match ^[a-z0-9_-]{1,32}$`,\n })\n }\n}\n\nexport function getProfilesDir(): string {\n return path.join(getConfigDir(), 'profiles')\n}\n\nexport function getCurrentPath(): string {\n return path.join(getConfigDir(), 'current')\n}\n\nexport function getProfileDir(name: string): string {\n return path.join(getProfilesDir(), name)\n}\n\nexport function getProfileConfigPath(name: string): string {\n return path.join(getProfileDir(name), 'config.json')\n}\n\nexport function getProfileCredentialsPath(name: string): string {\n return path.join(getProfileDir(name), 'credentials.json')\n}\n\nexport async function listProfiles(): Promise<string[]> {\n const dir = getProfilesDir()\n let entries: Dirent[]\n try {\n entries = await fs.readdir(dir, { withFileTypes: true })\n } catch (err: any) {\n if (err?.code === 'ENOENT') return []\n throw err\n }\n return entries\n .filter((e) => e.isDirectory() && !e.name.startsWith('.'))\n .map((e) => e.name)\n .sort()\n}\n\nexport async function getCurrentProfile(): Promise<string | null> {\n const p = getCurrentPath()\n try {\n const raw = await fs.readFile(p, 'utf8')\n const name = raw.trim()\n return name.length > 0 ? name : null\n } catch (err: any) {\n if (err?.code === 'ENOENT') return null\n throw err\n }\n}\n\nexport async function setCurrentProfile(name: string): Promise<void> {\n validateProfileName(name)\n const dir = getProfileDir(name)\n try {\n const stat = await fs.stat(dir)\n if (!stat.isDirectory()) {\n throw new MxsError({\n code: 'validation.failed',\n message: `profile '${name}' does not exist`,\n })\n }\n } catch (err: any) {\n if (err instanceof MxsError) throw err\n if (err?.code === 'ENOENT') {\n throw new MxsError({\n code: 'validation.failed',\n message: `profile '${name}' does not exist`,\n })\n }\n throw err\n }\n await fs.writeFile(getCurrentPath(), `${name}\\n`, { encoding: 'utf8' })\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\nasync function ensureProfileDir(name: string): Promise<void> {\n const dir = getProfileDir(name)\n await fs.mkdir(dir, { recursive: true, mode: 0o700 })\n try {\n await fs.chmod(dir, 0o700)\n } catch {}\n}\n\nexport type ProfileConfigShape = ConfigShape\nexport type ProfileCredentialsShape = CredentialsShape\n\nexport async function readProfileConfig(\n name: string,\n): Promise<ProfileConfigShape> {\n const data = await readJsonIfExists<ProfileConfigShape>(\n getProfileConfigPath(name),\n )\n return data ?? {}\n}\n\nexport async function writeProfileConfig(\n name: string,\n cfg: ProfileConfigShape,\n): Promise<void> {\n await ensureProfileDir(name)\n const p = getProfileConfigPath(name)\n await fs.writeFile(p, JSON.stringify(cfg, null, 2), { mode: 0o644 })\n try {\n await fs.chmod(p, 0o644)\n } catch {}\n}\n\nexport async function readProfileCredentials(\n name: string,\n): Promise<ProfileCredentialsShape | null> {\n const p = getProfileCredentialsPath(name)\n const data = await readJsonIfExists<ProfileCredentialsShape>(p)\n if (data) {\n await enforceProfileCredentialsMode(p)\n }\n return data\n}\n\nexport async function writeProfileCredentials(\n name: string,\n creds: ProfileCredentialsShape,\n): Promise<void> {\n await ensureProfileDir(name)\n const p = getProfileCredentialsPath(name)\n await fs.writeFile(p, JSON.stringify(creds, null, 2), { mode: 0o600 })\n await fs.chmod(p, 0o600)\n}\n\nexport async function removeProfile(name: string): Promise<void> {\n const dir = getProfileDir(name)\n try {\n await fs.stat(dir)\n } catch (err: any) {\n if (err?.code === 'ENOENT') {\n throw new MxsError({\n code: 'resource.not_found',\n message: `profile '${name}' does not exist`,\n })\n }\n throw err\n }\n await fs.rm(dir, { recursive: true, force: true })\n}\n\nexport async function enforceProfileCredentialsMode(\n p: string,\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","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\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\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\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-BEXOOFAJ.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":"delete-CGy-cV6k.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-CKqlAUT8.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-CcyrLNZv.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-Cjxehwj7.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":"document-output-C5PWbz2p.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('&', '&amp;')\n .replaceAll('<', '&lt;')\n .replaceAll('>', '&gt;')\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"edit-BuKMUNVC.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-DFnOnk4i.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('&', '&amp;')\n .replaceAll('<', '&lt;')\n .replaceAll('>', '&gt;')\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-xrF-j3UE.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-Doi-NKAh.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,11 +0,0 @@
1
- import { i as emitSuccess } from "./output-BM7aBFwt.mjs";
2
- import { t as deleteCredentials } from "./config-store-WL7dNMS6.mjs";
3
- //#region src/commands/auth/logout.ts
4
- async function run(_flags, out) {
5
- await deleteCredentials();
6
- emitSuccess({ ok: true }, out);
7
- }
8
- //#endregion
9
- export { run };
10
-
11
- //# sourceMappingURL=logout-Bslt_ZJ4.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"logout-Bslt_ZJ4.mjs","names":[],"sources":["../src/commands/auth/logout.ts"],"sourcesContent":["import { deleteCredentials } from '../../core/config-store'\nimport { emitSuccess, type OutputOptions } from '../../core/output'\nimport { type GlobalFlags } from '../internal/shared'\n\nexport async function run(_flags: GlobalFlags, out: OutputOptions) {\n await deleteCredentials()\n emitSuccess({ ok: true }, out)\n}\n"],"mappings":";;;AAIA,eAAsB,IAAI,QAAqB,KAAoB;CACjE,MAAM,kBAAkB;CACxB,YAAY,EAAE,IAAI,KAAK,GAAG,GAAG;AAC/B"}