@mx-space/cli 0.15.0 → 0.15.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 (615) hide show
  1. package/README.md +1 -1
  2. package/dist/{Lexical.dev-Cck4n26y.mjs → Lexical.dev-BSvx45_E.mjs} +127 -94
  3. package/dist/{Lexical.node-D6wf2D5M.mjs → Lexical.node-kAh5GM2n.mjs} +1 -1
  4. package/dist/{Lexical.prod-DCwS1oTq.mjs → Lexical.prod-Bqwgb3ez.mjs} +4 -2
  5. package/dist/{LexicalClipboard.dev-CMkPHV7O.mjs → LexicalClipboard.dev-BWU3KXIa.mjs} +18 -14
  6. package/dist/{LexicalClipboard.node-m4nZ7IYw.mjs → LexicalClipboard.node-BygAdNdF.mjs} +1 -1
  7. package/dist/{LexicalClipboard.prod-B_rN1vE1.mjs → LexicalClipboard.prod-BtMuKNyT.mjs} +10 -10
  8. package/dist/{LexicalCodeCore.dev-DyJw3i8V.mjs → LexicalCodeCore.dev-CD2xgvDs.mjs} +43 -25
  9. package/dist/{LexicalCodeCore.prod-DPXLHQLF.mjs → LexicalCodeCore.prod-Bl6FFMc7.mjs} +6 -6
  10. package/dist/{LexicalDragon.dev-ZkNfMwrE.mjs → LexicalDragon.dev-BwdYhm4K.mjs} +2 -2
  11. package/dist/{LexicalDragon.node-Ds9oLUFh.mjs → LexicalDragon.node-CpJhkCVV.mjs} +1 -1
  12. package/dist/{LexicalDragon.prod-B58ic2av.mjs → LexicalDragon.prod-CvXmWwo1.mjs} +2 -2
  13. package/dist/{LexicalExtension.dev-DvwHs1Xv.mjs → LexicalExtension.dev-LcRLXI5Z.mjs} +25 -13
  14. package/dist/{LexicalExtension.node-5OymZQfy.mjs → LexicalExtension.node-BwJt2LXV.mjs} +1 -1
  15. package/dist/{LexicalExtension.prod-Ce0T5smQ.mjs → LexicalExtension.prod-lg8_33-H.mjs} +16 -13
  16. package/dist/{LexicalHeadless.dev-DA0WldSR.mjs → LexicalHeadless.dev-BeUbKBes.mjs} +1 -1
  17. package/dist/{LexicalHeadless.prod-1kQgKB6c.mjs → LexicalHeadless.prod-4gbIA8HM.mjs} +1 -1
  18. package/dist/{LexicalHtml.dev-BDB7CUrx.mjs → LexicalHtml.dev-BLdZWTCJ.mjs} +20 -14
  19. package/dist/{LexicalHtml.node-DpVNt7It.mjs → LexicalHtml.node-BeuJMvvt.mjs} +1 -1
  20. package/dist/{LexicalHtml.prod-HkxM5scw.mjs → LexicalHtml.prod-CHUyCocN.mjs} +4 -4
  21. package/dist/{LexicalLink.dev-C5zNJlrm.mjs → LexicalLink.dev-DgsFRqw0.mjs} +28 -21
  22. package/dist/{LexicalLink.prod-Bkt9hQAt.mjs → LexicalLink.prod-CkXkeKY2.mjs} +6 -5
  23. package/dist/{LexicalList.dev-B7VgME-m.mjs → LexicalList.dev-OOms3kQi.mjs} +4 -4
  24. package/dist/{LexicalList.prod-B8c7TDjH.mjs → LexicalList.prod-DzMBeqHn.mjs} +4 -4
  25. package/dist/{LexicalMarkdown.dev-B5z9kLbV.mjs → LexicalMarkdown.dev-DJLKbZtD.mjs} +40 -29
  26. package/dist/{LexicalMarkdown.prod-wKzw7FFH.mjs → LexicalMarkdown.prod-Cp21kDCU.mjs} +10 -7
  27. package/dist/{LexicalRichText.dev-CUd6Li5F.mjs → LexicalRichText.dev-0rkAGjUf.mjs} +15 -11
  28. package/dist/{LexicalRichText.node-BKfaQ-CH.mjs → LexicalRichText.node-Cd-BySPE.mjs} +4 -4
  29. package/dist/{LexicalRichText.prod-SBewjJHx.mjs → LexicalRichText.prod-DTQiEr8C.mjs} +17 -11
  30. package/dist/{LexicalSelection.dev-D27JOCqj.mjs → LexicalSelection.dev-Bi0VlUEv.mjs} +28 -24
  31. package/dist/{LexicalSelection.node-DBEwPjBu.mjs → LexicalSelection.node-t2U46EF_.mjs} +1 -1
  32. package/dist/{LexicalSelection.prod-OaYhXHOL.mjs → LexicalSelection.prod-CrFG111g.mjs} +2 -2
  33. package/dist/{LexicalTable.dev-6IFFOAE0.mjs → LexicalTable.dev-D-sFhO-o.mjs} +33 -28
  34. package/dist/{LexicalTable.prod-2CaLZ7fH.mjs → LexicalTable.prod-DwYaa_dN.mjs} +10 -9
  35. package/dist/{LexicalUtils.dev-DJA7J_7v.mjs → LexicalUtils.dev-Q2q3-UDM.mjs} +8 -5
  36. package/dist/{LexicalUtils.node-Df9oPTlA.mjs → LexicalUtils.node-Dl7OvqJV.mjs} +1 -1
  37. package/dist/{LexicalUtils.prod-Bb7V4Ewg.mjs → LexicalUtils.prod-CBnq_iEV.mjs} +7 -6
  38. package/dist/bin/mxs.mjs +1 -1
  39. package/dist/esm-CNZ7kdTg.mjs +2 -0
  40. package/dist/{esm-DLzrv7gD.mjs → esm-ZXjJmLEC.mjs} +257 -260
  41. package/dist/index.mjs +1 -1
  42. package/dist/{mxs-BIRW5Axj.mjs → mxs-DC9zR3f2.mjs} +759 -539
  43. package/dist/{rolldown-runtime-JspESFgx.mjs → rolldown-runtime-B4iAMlE-.mjs} +1 -1
  44. package/dist/src/bin/mxs.d.ts +2 -0
  45. package/dist/src/bin/mxs.js +310 -0
  46. package/dist/src/cli/ai/_poll.d.ts +12 -0
  47. package/dist/src/cli/ai/_poll.js +38 -0
  48. package/dist/src/cli/ai/_resolve.d.ts +8 -0
  49. package/dist/src/cli/ai/_resolve.js +27 -0
  50. package/dist/src/cli/ai/index.d.ts +127 -0
  51. package/dist/src/cli/ai/index.js +46 -0
  52. package/dist/src/cli/ai/insights/by-article.d.ts +10 -0
  53. package/dist/src/cli/ai/insights/by-article.js +21 -0
  54. package/dist/src/cli/ai/insights/delete.d.ts +7 -0
  55. package/dist/src/cli/ai/insights/delete.js +18 -0
  56. package/dist/src/cli/ai/insights/edit.d.ts +8 -0
  57. package/dist/src/cli/ai/insights/edit.js +54 -0
  58. package/dist/src/cli/ai/insights/get.d.ts +6 -0
  59. package/dist/src/cli/ai/insights/get.js +11 -0
  60. package/dist/src/cli/ai/insights/index.d.ts +30 -0
  61. package/dist/src/cli/ai/insights/index.js +17 -0
  62. package/dist/src/cli/ai/insights/list.d.ts +10 -0
  63. package/dist/src/cli/ai/insights/list.js +20 -0
  64. package/dist/src/cli/ai/insights/refresh.d.ts +10 -0
  65. package/dist/src/cli/ai/insights/refresh.js +25 -0
  66. package/dist/src/cli/ai/insights/translate.d.ts +10 -0
  67. package/dist/src/cli/ai/insights/translate.js +25 -0
  68. package/dist/src/cli/ai/overview/by-article.d.ts +7 -0
  69. package/dist/src/cli/ai/overview/by-article.js +15 -0
  70. package/dist/src/cli/ai/overview/index.d.ts +11 -0
  71. package/dist/src/cli/ai/overview/index.js +4 -0
  72. package/dist/src/cli/ai/overview/list.d.ts +10 -0
  73. package/dist/src/cli/ai/overview/list.js +20 -0
  74. package/dist/src/cli/ai/summary/by-article.d.ts +10 -0
  75. package/dist/src/cli/ai/summary/by-article.js +21 -0
  76. package/dist/src/cli/ai/summary/delete.d.ts +7 -0
  77. package/dist/src/cli/ai/summary/delete.js +18 -0
  78. package/dist/src/cli/ai/summary/edit.d.ts +8 -0
  79. package/dist/src/cli/ai/summary/edit.js +54 -0
  80. package/dist/src/cli/ai/summary/get.d.ts +6 -0
  81. package/dist/src/cli/ai/summary/get.js +11 -0
  82. package/dist/src/cli/ai/summary/index.d.ts +30 -0
  83. package/dist/src/cli/ai/summary/index.js +9 -0
  84. package/dist/src/cli/ai/summary/list.d.ts +10 -0
  85. package/dist/src/cli/ai/summary/list.js +20 -0
  86. package/dist/src/cli/ai/summary/regen.d.ts +10 -0
  87. package/dist/src/cli/ai/summary/regen.js +25 -0
  88. package/dist/src/cli/ai/summary/translate.d.ts +10 -0
  89. package/dist/src/cli/ai/summary/translate.js +25 -0
  90. package/dist/src/cli/ai/translate/by-article.d.ts +9 -0
  91. package/dist/src/cli/ai/translate/by-article.js +19 -0
  92. package/dist/src/cli/ai/translate/delete.d.ts +7 -0
  93. package/dist/src/cli/ai/translate/delete.js +18 -0
  94. package/dist/src/cli/ai/translate/edit.d.ts +8 -0
  95. package/dist/src/cli/ai/translate/edit.js +97 -0
  96. package/dist/src/cli/ai/translate/entries/delete.d.ts +7 -0
  97. package/dist/src/cli/ai/translate/entries/delete.js +18 -0
  98. package/dist/src/cli/ai/translate/entries/edit.d.ts +8 -0
  99. package/dist/src/cli/ai/translate/entries/edit.js +73 -0
  100. package/dist/src/cli/ai/translate/entries/generate.d.ts +7 -0
  101. package/dist/src/cli/ai/translate/entries/generate.js +15 -0
  102. package/dist/src/cli/ai/translate/entries/index.d.ts +17 -0
  103. package/dist/src/cli/ai/translate/entries/index.js +6 -0
  104. package/dist/src/cli/ai/translate/entries/list.d.ts +10 -0
  105. package/dist/src/cli/ai/translate/entries/list.js +20 -0
  106. package/dist/src/cli/ai/translate/get.d.ts +6 -0
  107. package/dist/src/cli/ai/translate/get.js +11 -0
  108. package/dist/src/cli/ai/translate/index.d.ts +40 -0
  109. package/dist/src/cli/ai/translate/index.js +19 -0
  110. package/dist/src/cli/ai/translate/languages.d.ts +7 -0
  111. package/dist/src/cli/ai/translate/languages.js +15 -0
  112. package/dist/src/cli/ai/translate/list.d.ts +9 -0
  113. package/dist/src/cli/ai/translate/list.js +19 -0
  114. package/dist/src/cli/ai/translate/run.d.ts +10 -0
  115. package/dist/src/cli/ai/translate/run.js +31 -0
  116. package/dist/src/cli/ai/tts/by-article.d.ts +7 -0
  117. package/dist/src/cli/ai/tts/by-article.js +15 -0
  118. package/dist/src/cli/ai/tts/delete.d.ts +7 -0
  119. package/dist/src/cli/ai/tts/delete.js +18 -0
  120. package/dist/src/cli/ai/tts/index.d.ts +22 -0
  121. package/dist/src/cli/ai/tts/index.js +7 -0
  122. package/dist/src/cli/ai/tts/list.d.ts +10 -0
  123. package/dist/src/cli/ai/tts/list.js +20 -0
  124. package/dist/src/cli/ai/tts/run.d.ts +10 -0
  125. package/dist/src/cli/ai/tts/run.js +25 -0
  126. package/dist/src/cli/ai/tts/voices.d.ts +7 -0
  127. package/dist/src/cli/ai/tts/voices.js +12 -0
  128. package/dist/src/cli/ai/views.d.ts +3 -0
  129. package/dist/src/cli/ai/views.js +45 -0
  130. package/dist/src/cli/auth/index.d.ts +6 -0
  131. package/dist/src/cli/auth/index.js +22 -0
  132. package/dist/src/cli/auth/login.d.ts +11 -0
  133. package/dist/src/cli/auth/login.js +168 -0
  134. package/dist/src/cli/auth/logout.d.ts +6 -0
  135. package/dist/src/cli/auth/logout.js +21 -0
  136. package/dist/src/cli/auth/status.d.ts +4 -0
  137. package/dist/src/cli/auth/status.js +31 -0
  138. package/dist/src/cli/auth/view.d.ts +25 -0
  139. package/dist/src/cli/auth/view.js +46 -0
  140. package/dist/src/cli/auth/whoami.d.ts +7 -0
  141. package/dist/src/cli/auth/whoami.js +44 -0
  142. package/dist/src/cli/category/create.d.ts +10 -0
  143. package/dist/src/cli/category/create.js +24 -0
  144. package/dist/src/cli/category/delete.d.ts +8 -0
  145. package/dist/src/cli/category/delete.js +21 -0
  146. package/dist/src/cli/category/get.d.ts +6 -0
  147. package/dist/src/cli/category/get.js +11 -0
  148. package/dist/src/cli/category/index.d.ts +20 -0
  149. package/dist/src/cli/category/index.js +41 -0
  150. package/dist/src/cli/category/list.d.ts +4 -0
  151. package/dist/src/cli/category/list.js +10 -0
  152. package/dist/src/cli/category/update.d.ts +12 -0
  153. package/dist/src/cli/category/update.js +34 -0
  154. package/dist/src/cli/comment/_flags.d.ts +28 -0
  155. package/dist/src/cli/comment/_flags.js +48 -0
  156. package/dist/src/cli/comment/approve.d.ts +9 -0
  157. package/dist/src/cli/comment/approve.js +23 -0
  158. package/dist/src/cli/comment/delete.d.ts +9 -0
  159. package/dist/src/cli/comment/delete.js +24 -0
  160. package/dist/src/cli/comment/get.d.ts +6 -0
  161. package/dist/src/cli/comment/get.js +12 -0
  162. package/dist/src/cli/comment/index.d.ts +34 -0
  163. package/dist/src/cli/comment/index.js +53 -0
  164. package/dist/src/cli/comment/list.d.ts +9 -0
  165. package/dist/src/cli/comment/list.js +20 -0
  166. package/dist/src/cli/comment/reject.d.ts +9 -0
  167. package/dist/src/cli/comment/reject.js +23 -0
  168. package/dist/src/cli/comment/reply.d.ts +9 -0
  169. package/dist/src/cli/comment/reply.js +31 -0
  170. package/dist/src/cli/comment/unread.d.ts +7 -0
  171. package/dist/src/cli/comment/unread.js +21 -0
  172. package/dist/src/cli/comment/view.d.ts +3 -0
  173. package/dist/src/cli/comment/view.js +197 -0
  174. package/dist/src/cli/config/edit.d.ts +5 -0
  175. package/dist/src/cli/config/edit.js +36 -0
  176. package/dist/src/cli/config/get.d.ts +6 -0
  177. package/dist/src/cli/config/get.js +11 -0
  178. package/dist/src/cli/config/index.d.ts +10 -0
  179. package/dist/src/cli/config/index.js +22 -0
  180. package/dist/src/cli/config/list.d.ts +4 -0
  181. package/dist/src/cli/config/list.js +10 -0
  182. package/dist/src/cli/config/set.d.ts +9 -0
  183. package/dist/src/cli/config/set.js +48 -0
  184. package/dist/src/cli/draft/_shared.d.ts +27 -0
  185. package/dist/src/cli/draft/_shared.js +85 -0
  186. package/dist/src/cli/draft/create.d.ts +21 -0
  187. package/dist/src/cli/draft/create.js +34 -0
  188. package/dist/src/cli/draft/delete.d.ts +7 -0
  189. package/dist/src/cli/draft/delete.js +20 -0
  190. package/dist/src/cli/draft/get.d.ts +6 -0
  191. package/dist/src/cli/draft/get.js +11 -0
  192. package/dist/src/cli/draft/index.d.ts +54 -0
  193. package/dist/src/cli/draft/index.js +42 -0
  194. package/dist/src/cli/draft/list.d.ts +11 -0
  195. package/dist/src/cli/draft/list.js +23 -0
  196. package/dist/src/cli/draft/publish.d.ts +8 -0
  197. package/dist/src/cli/draft/publish.js +64 -0
  198. package/dist/src/cli/draft/update.d.ts +22 -0
  199. package/dist/src/cli/draft/update.js +29 -0
  200. package/dist/src/cli/file/_shared.d.ts +6 -0
  201. package/dist/src/cli/file/_shared.js +5 -0
  202. package/dist/src/cli/file/delete.d.ts +8 -0
  203. package/dist/src/cli/file/delete.js +21 -0
  204. package/dist/src/cli/file/index.d.ts +19 -0
  205. package/dist/src/cli/file/index.js +33 -0
  206. package/dist/src/cli/file/list.d.ts +6 -0
  207. package/dist/src/cli/file/list.js +11 -0
  208. package/dist/src/cli/file/rename.d.ts +8 -0
  209. package/dist/src/cli/file/rename.js +16 -0
  210. package/dist/src/cli/file/upload.d.ts +9 -0
  211. package/dist/src/cli/file/upload.js +32 -0
  212. package/dist/src/cli/help/index.d.ts +62 -0
  213. package/dist/src/cli/help/index.js +276 -0
  214. package/dist/src/cli/help/registry.d.ts +28 -0
  215. package/dist/src/cli/help/registry.js +29 -0
  216. package/dist/src/cli/note/_flags.d.ts +66 -0
  217. package/dist/src/cli/note/_flags.js +73 -0
  218. package/dist/src/cli/note/create.d.ts +23 -0
  219. package/dist/src/cli/note/create.js +25 -0
  220. package/dist/src/cli/note/delete.d.ts +8 -0
  221. package/dist/src/cli/note/delete.js +21 -0
  222. package/dist/src/cli/note/edit.d.ts +28 -0
  223. package/dist/src/cli/note/edit.js +114 -0
  224. package/dist/src/cli/note/get.d.ts +6 -0
  225. package/dist/src/cli/note/get.js +29 -0
  226. package/dist/src/cli/note/index.d.ts +77 -0
  227. package/dist/src/cli/note/index.js +63 -0
  228. package/dist/src/cli/note/list.d.ts +10 -0
  229. package/dist/src/cli/note/list.js +22 -0
  230. package/dist/src/cli/note/publish.d.ts +7 -0
  231. package/dist/src/cli/note/publish.js +17 -0
  232. package/dist/src/cli/note/unpublish.d.ts +7 -0
  233. package/dist/src/cli/note/unpublish.js +17 -0
  234. package/dist/src/cli/note/update.d.ts +25 -0
  235. package/dist/src/cli/note/update.js +36 -0
  236. package/dist/src/cli/note/view.d.ts +3 -0
  237. package/dist/src/cli/note/view.js +162 -0
  238. package/dist/src/cli/page/create.d.ts +41 -0
  239. package/dist/src/cli/page/create.js +56 -0
  240. package/dist/src/cli/page/delete.d.ts +7 -0
  241. package/dist/src/cli/page/delete.js +37 -0
  242. package/dist/src/cli/page/edit.d.ts +19 -0
  243. package/dist/src/cli/page/edit.js +117 -0
  244. package/dist/src/cli/page/get.d.ts +6 -0
  245. package/dist/src/cli/page/get.js +16 -0
  246. package/dist/src/cli/page/index.d.ts +44 -0
  247. package/dist/src/cli/page/index.js +38 -0
  248. package/dist/src/cli/page/list.d.ts +4 -0
  249. package/dist/src/cli/page/list.js +10 -0
  250. package/dist/src/cli/page/update.d.ts +16 -0
  251. package/dist/src/cli/page/update.js +48 -0
  252. package/dist/src/cli/page/view.d.ts +2 -0
  253. package/dist/src/cli/page/view.js +79 -0
  254. package/dist/src/cli/post/_flags.d.ts +66 -0
  255. package/dist/src/cli/post/_flags.js +96 -0
  256. package/dist/src/cli/post/apply.d.ts +7 -0
  257. package/dist/src/cli/post/apply.js +70 -0
  258. package/dist/src/cli/post/create.d.ts +21 -0
  259. package/dist/src/cli/post/create.js +24 -0
  260. package/dist/src/cli/post/delete.d.ts +8 -0
  261. package/dist/src/cli/post/delete.js +21 -0
  262. package/dist/src/cli/post/edit.d.ts +26 -0
  263. package/dist/src/cli/post/edit.js +115 -0
  264. package/dist/src/cli/post/get.d.ts +7 -0
  265. package/dist/src/cli/post/get.js +15 -0
  266. package/dist/src/cli/post/index.d.ts +91 -0
  267. package/dist/src/cli/post/index.js +73 -0
  268. package/dist/src/cli/post/list.d.ts +10 -0
  269. package/dist/src/cli/post/list.js +23 -0
  270. package/dist/src/cli/post/publish.d.ts +7 -0
  271. package/dist/src/cli/post/publish.js +17 -0
  272. package/dist/src/cli/post/stage.d.ts +23 -0
  273. package/dist/src/cli/post/stage.js +55 -0
  274. package/dist/src/cli/post/unpublish.d.ts +7 -0
  275. package/dist/src/cli/post/unpublish.js +17 -0
  276. package/dist/src/cli/post/update.d.ts +23 -0
  277. package/dist/src/cli/post/update.js +38 -0
  278. package/dist/src/cli/post/view.d.ts +3 -0
  279. package/dist/src/cli/post/view.js +150 -0
  280. package/dist/src/cli/preview/index.d.ts +13 -0
  281. package/dist/src/cli/preview/index.js +226 -0
  282. package/dist/src/cli/profile/index.d.ts +14 -0
  283. package/dist/src/cli/profile/index.js +36 -0
  284. package/dist/src/cli/profile/ls.d.ts +5 -0
  285. package/dist/src/cli/profile/ls.js +26 -0
  286. package/dist/src/cli/profile/mark.d.ts +9 -0
  287. package/dist/src/cli/profile/mark.js +23 -0
  288. package/dist/src/cli/profile/rm.d.ts +12 -0
  289. package/dist/src/cli/profile/rm.js +50 -0
  290. package/dist/src/cli/profile/show.d.ts +9 -0
  291. package/dist/src/cli/profile/show.js +40 -0
  292. package/dist/src/cli/profile/use.d.ts +6 -0
  293. package/dist/src/cli/profile/use.js +11 -0
  294. package/dist/src/cli/profile/view.d.ts +8 -0
  295. package/dist/src/cli/profile/view.js +21 -0
  296. package/dist/src/cli/project/_flags.d.ts +56 -0
  297. package/dist/src/cli/project/_flags.js +130 -0
  298. package/dist/src/cli/project/create.d.ts +17 -0
  299. package/dist/src/cli/project/create.js +25 -0
  300. package/dist/src/cli/project/delete.d.ts +8 -0
  301. package/dist/src/cli/project/delete.js +22 -0
  302. package/dist/src/cli/project/edit.d.ts +11 -0
  303. package/dist/src/cli/project/edit.js +61 -0
  304. package/dist/src/cli/project/get.d.ts +7 -0
  305. package/dist/src/cli/project/get.js +14 -0
  306. package/dist/src/cli/project/index.d.ts +43 -0
  307. package/dist/src/cli/project/index.js +52 -0
  308. package/dist/src/cli/project/list.d.ts +8 -0
  309. package/dist/src/cli/project/list.js +19 -0
  310. package/dist/src/cli/project/update.d.ts +18 -0
  311. package/dist/src/cli/project/update.js +24 -0
  312. package/dist/src/cli/project/view-cmd.d.ts +7 -0
  313. package/dist/src/cli/project/view-cmd.js +15 -0
  314. package/dist/src/cli/project/view.d.ts +3 -0
  315. package/dist/src/cli/project/view.js +102 -0
  316. package/dist/src/cli/render/codehighlight.d.ts +8 -0
  317. package/dist/src/cli/render/codehighlight.js +264 -0
  318. package/dist/src/cli/render/envelope.d.ts +7 -0
  319. package/dist/src/cli/render/envelope.js +23 -0
  320. package/dist/src/cli/render/frontmatter.d.ts +8 -0
  321. package/dist/src/cli/render/frontmatter.js +50 -0
  322. package/dist/src/cli/render/helpers.d.ts +2 -0
  323. package/dist/src/cli/render/helpers.js +11 -0
  324. package/dist/src/cli/render/index.d.ts +7 -0
  325. package/dist/src/cli/render/index.js +10 -0
  326. package/dist/src/cli/render/lexical/blocks.d.ts +19 -0
  327. package/dist/src/cli/render/lexical/blocks.js +208 -0
  328. package/dist/src/cli/render/lexical/code.d.ts +2 -0
  329. package/dist/src/cli/render/lexical/code.js +22 -0
  330. package/dist/src/cli/render/lexical/embeds.d.ts +6 -0
  331. package/dist/src/cli/render/lexical/embeds.js +51 -0
  332. package/dist/src/cli/render/lexical/index.d.ts +9 -0
  333. package/dist/src/cli/render/lexical/index.js +25 -0
  334. package/dist/src/cli/render/lexical/inlines.d.ts +17 -0
  335. package/dist/src/cli/render/lexical/inlines.js +76 -0
  336. package/dist/src/cli/render/lexical/parser.d.ts +10 -0
  337. package/dist/src/cli/render/lexical/parser.js +64 -0
  338. package/dist/src/cli/render/lexical/walker.d.ts +21 -0
  339. package/dist/src/cli/render/lexical/walker.js +51 -0
  340. package/dist/src/cli/render/markdown.d.ts +18 -0
  341. package/dist/src/cli/render/markdown.js +196 -0
  342. package/dist/src/cli/render/metadata-block.d.ts +14 -0
  343. package/dist/src/cli/render/metadata-block.js +50 -0
  344. package/dist/src/cli/skill/all.d.ts +4 -0
  345. package/dist/src/cli/skill/all.js +11 -0
  346. package/dist/src/cli/skill/get.d.ts +6 -0
  347. package/dist/src/cli/skill/get.js +12 -0
  348. package/dist/src/cli/skill/index.d.ts +10 -0
  349. package/dist/src/cli/skill/index.js +34 -0
  350. package/dist/src/cli/skill/list.d.ts +4 -0
  351. package/dist/src/cli/skill/list.js +11 -0
  352. package/dist/src/cli/skill/search.d.ts +6 -0
  353. package/dist/src/cli/skill/search.js +12 -0
  354. package/dist/src/cli/skill/views.d.ts +6 -0
  355. package/dist/src/cli/skill/views.js +90 -0
  356. package/dist/src/cli/snippet/_flags.d.ts +57 -0
  357. package/dist/src/cli/snippet/_flags.js +123 -0
  358. package/dist/src/cli/snippet/_resolve.d.ts +4 -0
  359. package/dist/src/cli/snippet/_resolve.js +32 -0
  360. package/dist/src/cli/snippet/_sync.d.ts +5 -0
  361. package/dist/src/cli/snippet/_sync.js +54 -0
  362. package/dist/src/cli/snippet/create.d.ts +19 -0
  363. package/dist/src/cli/snippet/create.js +35 -0
  364. package/dist/src/cli/snippet/delete.d.ts +8 -0
  365. package/dist/src/cli/snippet/delete.js +28 -0
  366. package/dist/src/cli/snippet/edit.d.ts +7 -0
  367. package/dist/src/cli/snippet/edit.js +29 -0
  368. package/dist/src/cli/snippet/get.d.ts +6 -0
  369. package/dist/src/cli/snippet/get.js +12 -0
  370. package/dist/src/cli/snippet/index.d.ts +43 -0
  371. package/dist/src/cli/snippet/index.js +58 -0
  372. package/dist/src/cli/snippet/list.d.ts +9 -0
  373. package/dist/src/cli/snippet/list.js +20 -0
  374. package/dist/src/cli/snippet/pull.d.ts +8 -0
  375. package/dist/src/cli/snippet/pull.js +33 -0
  376. package/dist/src/cli/snippet/push.d.ts +10 -0
  377. package/dist/src/cli/snippet/push.js +31 -0
  378. package/dist/src/cli/snippet/update.d.ts +8 -0
  379. package/dist/src/cli/snippet/update.js +16 -0
  380. package/dist/src/cli/topic/create.d.ts +10 -0
  381. package/dist/src/cli/topic/create.js +24 -0
  382. package/dist/src/cli/topic/delete.d.ts +7 -0
  383. package/dist/src/cli/topic/delete.js +37 -0
  384. package/dist/src/cli/topic/get.d.ts +6 -0
  385. package/dist/src/cli/topic/get.js +15 -0
  386. package/dist/src/cli/topic/index.d.ts +20 -0
  387. package/dist/src/cli/topic/index.js +32 -0
  388. package/dist/src/cli/topic/list.d.ts +4 -0
  389. package/dist/src/cli/topic/list.js +10 -0
  390. package/dist/src/cli/topic/update.d.ts +11 -0
  391. package/dist/src/cli/topic/update.js +51 -0
  392. package/dist/src/cli/ui/index.d.ts +24 -0
  393. package/dist/src/cli/ui/index.js +83 -0
  394. package/dist/src/cli/update/index.d.ts +10 -0
  395. package/dist/src/cli/update/index.js +142 -0
  396. package/dist/src/domain/admin-link.d.ts +12 -0
  397. package/dist/src/domain/admin-link.js +45 -0
  398. package/dist/src/domain/content-spec.d.ts +20 -0
  399. package/dist/src/domain/content-spec.js +78 -0
  400. package/dist/src/domain/envelope-compat.d.ts +68 -0
  401. package/dist/src/domain/envelope-compat.js +121 -0
  402. package/dist/src/domain/envelope.d.ts +34 -0
  403. package/dist/src/domain/envelope.js +355 -0
  404. package/dist/src/domain/errors.d.ts +336 -0
  405. package/dist/src/domain/errors.js +239 -0
  406. package/dist/src/domain/gate.d.ts +14 -0
  407. package/dist/src/domain/gate.js +18 -0
  408. package/dist/src/domain/payload.d.ts +64 -0
  409. package/dist/src/domain/payload.js +237 -0
  410. package/dist/src/domain/preflight-guards.d.ts +54 -0
  411. package/dist/src/domain/preflight-guards.js +130 -0
  412. package/dist/src/domain/runtime-flags.d.ts +33 -0
  413. package/dist/src/domain/runtime-flags.js +166 -0
  414. package/dist/src/domain/schema/api-envelope.d.ts +67 -0
  415. package/dist/src/domain/schema/api-envelope.js +65 -0
  416. package/dist/src/domain/schema/category.d.ts +23 -0
  417. package/dist/src/domain/schema/category.js +19 -0
  418. package/dist/src/domain/schema/config.d.ts +13 -0
  419. package/dist/src/domain/schema/config.js +18 -0
  420. package/dist/src/domain/schema/note.d.ts +76 -0
  421. package/dist/src/domain/schema/note.js +35 -0
  422. package/dist/src/domain/schema/page.d.ts +40 -0
  423. package/dist/src/domain/schema/page.js +22 -0
  424. package/dist/src/domain/schema/post.d.ts +68 -0
  425. package/dist/src/domain/schema/post.js +35 -0
  426. package/dist/src/domain/schema/profile.d.ts +14 -0
  427. package/dist/src/domain/schema/profile.js +22 -0
  428. package/dist/src/domain/schema/topic.d.ts +24 -0
  429. package/dist/src/domain/schema/topic.js +16 -0
  430. package/dist/src/domain/version.d.ts +15 -0
  431. package/dist/src/domain/version.js +43 -0
  432. package/dist/src/index.d.ts +4 -0
  433. package/dist/src/index.js +8 -0
  434. package/dist/src/layers/App.d.ts +30 -0
  435. package/dist/src/layers/App.js +39 -0
  436. package/dist/src/services/Ai/index.d.ts +13 -0
  437. package/dist/src/services/Ai/index.js +127 -0
  438. package/dist/src/services/Ai/overview.d.ts +7 -0
  439. package/dist/src/services/Ai/overview.js +11 -0
  440. package/dist/src/services/Ai/resources.d.ts +7 -0
  441. package/dist/src/services/Ai/resources.js +59 -0
  442. package/dist/src/services/Ai/shared.d.ts +2 -0
  443. package/dist/src/services/Ai/shared.js +11 -0
  444. package/dist/src/services/Ai/tasks.d.ts +8 -0
  445. package/dist/src/services/Ai/tasks.js +144 -0
  446. package/dist/src/services/Ai/types.d.ts +130 -0
  447. package/dist/src/services/Ai/types.js +1 -0
  448. package/dist/src/services/Api.d.ts +67 -0
  449. package/dist/src/services/Api.js +348 -0
  450. package/dist/src/services/Auth.d.ts +101 -0
  451. package/dist/src/services/Auth.js +402 -0
  452. package/dist/src/services/Backup.d.ts +8 -0
  453. package/dist/src/services/Backup.js +4 -0
  454. package/dist/src/services/Cache.d.ts +8 -0
  455. package/dist/src/services/Cache.js +4 -0
  456. package/dist/src/services/Comment.d.ts +48 -0
  457. package/dist/src/services/Comment.js +102 -0
  458. package/dist/src/services/Config.d.ts +95 -0
  459. package/dist/src/services/Config.js +359 -0
  460. package/dist/src/services/Editor.d.ts +28 -0
  461. package/dist/src/services/Editor.js +95 -0
  462. package/dist/src/services/Lexical.d.ts +27 -0
  463. package/dist/src/services/Lexical.js +56 -0
  464. package/dist/src/services/Migration.d.ts +31 -0
  465. package/dist/src/services/Migration.js +177 -0
  466. package/dist/src/services/Profile.d.ts +29 -0
  467. package/dist/src/services/Profile.js +115 -0
  468. package/dist/src/services/Renderer/content.d.ts +16 -0
  469. package/dist/src/services/Renderer/content.js +110 -0
  470. package/dist/src/services/Renderer/datetime.d.ts +38 -0
  471. package/dist/src/services/Renderer/datetime.js +147 -0
  472. package/dist/src/services/Renderer/errors.d.ts +3 -0
  473. package/dist/src/services/Renderer/errors.js +59 -0
  474. package/dist/src/services/Renderer/index.d.ts +13 -0
  475. package/dist/src/services/Renderer/index.js +11 -0
  476. package/dist/src/services/Renderer/lists.d.ts +1 -0
  477. package/dist/src/services/Renderer/lists.js +101 -0
  478. package/dist/src/services/Renderer/options.d.ts +10 -0
  479. package/dist/src/services/Renderer/options.js +13 -0
  480. package/dist/src/services/Renderer/primitives.d.ts +4 -0
  481. package/dist/src/services/Renderer/primitives.js +12 -0
  482. package/dist/src/services/Renderer/service.d.ts +35 -0
  483. package/dist/src/services/Renderer/service.js +123 -0
  484. package/dist/src/services/Renderer/view.d.ts +16 -0
  485. package/dist/src/services/Renderer/view.js +1 -0
  486. package/dist/src/services/Resolver.d.ts +47 -0
  487. package/dist/src/services/Resolver.js +269 -0
  488. package/dist/src/services/Skill.d.ts +29 -0
  489. package/dist/src/services/Skill.js +421 -0
  490. package/dist/src/services/UpdateNotifier.d.ts +162 -0
  491. package/dist/src/services/UpdateNotifier.js +572 -0
  492. package/dist/test/cli/ai/ai.test.d.ts +1 -0
  493. package/dist/test/cli/ai/ai.test.js +507 -0
  494. package/dist/test/cli/ai/verbs.test.d.ts +1 -0
  495. package/dist/test/cli/ai/verbs.test.js +235 -0
  496. package/dist/test/cli/auth/login.test.d.ts +1 -0
  497. package/dist/test/cli/auth/login.test.js +236 -0
  498. package/dist/test/cli/auth/logout-whoami.test.d.ts +1 -0
  499. package/dist/test/cli/auth/logout-whoami.test.js +124 -0
  500. package/dist/test/cli/auth/status.test.d.ts +1 -0
  501. package/dist/test/cli/auth/status.test.js +90 -0
  502. package/dist/test/cli/category/category.test.d.ts +1 -0
  503. package/dist/test/cli/category/category.test.js +175 -0
  504. package/dist/test/cli/comment/comment.test.d.ts +1 -0
  505. package/dist/test/cli/comment/comment.test.js +445 -0
  506. package/dist/test/cli/config/config.test.d.ts +1 -0
  507. package/dist/test/cli/config/config.test.js +281 -0
  508. package/dist/test/cli/edit-roundtrip.test.d.ts +1 -0
  509. package/dist/test/cli/edit-roundtrip.test.js +259 -0
  510. package/dist/test/cli/file/file.test.d.ts +1 -0
  511. package/dist/test/cli/file/file.test.js +185 -0
  512. package/dist/test/cli/help.test.d.ts +1 -0
  513. package/dist/test/cli/help.test.js +289 -0
  514. package/dist/test/cli/note/create.test.d.ts +1 -0
  515. package/dist/test/cli/note/create.test.js +155 -0
  516. package/dist/test/cli/note/list.test.d.ts +1 -0
  517. package/dist/test/cli/note/list.test.js +115 -0
  518. package/dist/test/cli/note/publish.test.d.ts +1 -0
  519. package/dist/test/cli/note/publish.test.js +123 -0
  520. package/dist/test/cli/page/page.test.d.ts +1 -0
  521. package/dist/test/cli/page/page.test.js +185 -0
  522. package/dist/test/cli/post/create.test.d.ts +1 -0
  523. package/dist/test/cli/post/create.test.js +172 -0
  524. package/dist/test/cli/post/list.test.d.ts +1 -0
  525. package/dist/test/cli/post/list.test.js +133 -0
  526. package/dist/test/cli/post/publish.test.d.ts +1 -0
  527. package/dist/test/cli/post/publish.test.js +139 -0
  528. package/dist/test/cli/post/stage-apply.test.d.ts +1 -0
  529. package/dist/test/cli/post/stage-apply.test.js +215 -0
  530. package/dist/test/cli/post/update.test.d.ts +1 -0
  531. package/dist/test/cli/post/update.test.js +160 -0
  532. package/dist/test/cli/post-note-crud.test.d.ts +1 -0
  533. package/dist/test/cli/post-note-crud.test.js +362 -0
  534. package/dist/test/cli/profile/ls.test.d.ts +1 -0
  535. package/dist/test/cli/profile/ls.test.js +93 -0
  536. package/dist/test/cli/profile/mark-use.test.d.ts +1 -0
  537. package/dist/test/cli/profile/mark-use.test.js +216 -0
  538. package/dist/test/cli/project-crud.test.d.ts +1 -0
  539. package/dist/test/cli/project-crud.test.js +315 -0
  540. package/dist/test/cli/render/lexical.test.d.ts +1 -0
  541. package/dist/test/cli/render/lexical.test.js +216 -0
  542. package/dist/test/cli/render/markdown.test.d.ts +1 -0
  543. package/dist/test/cli/render/markdown.test.js +39 -0
  544. package/dist/test/cli/snippet-crud.test.d.ts +1 -0
  545. package/dist/test/cli/snippet-crud.test.js +293 -0
  546. package/dist/test/cli/topic/topic.test.d.ts +1 -0
  547. package/dist/test/cli/topic/topic.test.js +181 -0
  548. package/dist/test/cli/update.test.d.ts +1 -0
  549. package/dist/test/cli/update.test.js +395 -0
  550. package/dist/test/domain/content-spec.test.d.ts +1 -0
  551. package/dist/test/domain/content-spec.test.js +126 -0
  552. package/dist/test/domain/envelope-compat.test.d.ts +1 -0
  553. package/dist/test/domain/envelope-compat.test.js +126 -0
  554. package/dist/test/domain/envelope.test.d.ts +1 -0
  555. package/dist/test/domain/envelope.test.js +149 -0
  556. package/dist/test/domain/errors.test.d.ts +1 -0
  557. package/dist/test/domain/errors.test.js +127 -0
  558. package/dist/test/domain/gate.test.d.ts +1 -0
  559. package/dist/test/domain/gate.test.js +128 -0
  560. package/dist/test/domain/payload.test.d.ts +1 -0
  561. package/dist/test/domain/payload.test.js +259 -0
  562. package/dist/test/helper/test-fs.d.ts +24 -0
  563. package/dist/test/helper/test-fs.js +161 -0
  564. package/dist/test/helper/test-http.d.ts +31 -0
  565. package/dist/test/helper/test-http.js +66 -0
  566. package/dist/test/integration/_helpers.d.ts +5 -0
  567. package/dist/test/integration/_helpers.js +24 -0
  568. package/dist/test/integration/cli-error-envelope.test.d.ts +1 -0
  569. package/dist/test/integration/cli-error-envelope.test.js +137 -0
  570. package/dist/test/integration/cli-help-render.test.d.ts +1 -0
  571. package/dist/test/integration/cli-help-render.test.js +149 -0
  572. package/dist/test/integration/cli-help.test.d.ts +1 -0
  573. package/dist/test/integration/cli-help.test.js +67 -0
  574. package/dist/test/integration/cli-post-list.test.d.ts +1 -0
  575. package/dist/test/integration/cli-post-list.test.js +140 -0
  576. package/dist/test/integration/cli-skill.test.d.ts +1 -0
  577. package/dist/test/integration/cli-skill.test.js +74 -0
  578. package/dist/test/integration/cli-version.test.d.ts +1 -0
  579. package/dist/test/integration/cli-version.test.js +37 -0
  580. package/dist/test/services/Api.test.d.ts +1 -0
  581. package/dist/test/services/Api.test.js +553 -0
  582. package/dist/test/services/Auth.test.d.ts +1 -0
  583. package/dist/test/services/Auth.test.js +650 -0
  584. package/dist/test/services/Config.test.d.ts +1 -0
  585. package/dist/test/services/Config.test.js +510 -0
  586. package/dist/test/services/Datetime.test.d.ts +1 -0
  587. package/dist/test/services/Datetime.test.js +113 -0
  588. package/dist/test/services/Editor.test.d.ts +1 -0
  589. package/dist/test/services/Editor.test.js +205 -0
  590. package/dist/test/services/Lexical.errors.test.d.ts +1 -0
  591. package/dist/test/services/Lexical.errors.test.js +60 -0
  592. package/dist/test/services/Lexical.test.d.ts +1 -0
  593. package/dist/test/services/Lexical.test.js +68 -0
  594. package/dist/test/services/Migration.test.d.ts +1 -0
  595. package/dist/test/services/Migration.test.js +376 -0
  596. package/dist/test/services/Profile.test.d.ts +1 -0
  597. package/dist/test/services/Profile.test.js +277 -0
  598. package/dist/test/services/Renderer.test.d.ts +1 -0
  599. package/dist/test/services/Renderer.test.js +538 -0
  600. package/dist/test/services/Resolver.test.d.ts +1 -0
  601. package/dist/test/services/Resolver.test.js +320 -0
  602. package/dist/test/services/Skill.test.d.ts +1 -0
  603. package/dist/test/services/Skill.test.js +261 -0
  604. package/dist/test/services/UpdateNotifier.spawn.test.d.ts +1 -0
  605. package/dist/test/services/UpdateNotifier.spawn.test.js +73 -0
  606. package/dist/test/services/UpdateNotifier.test.d.ts +1 -0
  607. package/dist/test/services/UpdateNotifier.test.js +912 -0
  608. package/dist/vendor/litexml/cli.mjs +19 -4
  609. package/dist/vendor/litexml/litexml-html-preview-client.css +98 -13
  610. package/dist/vendor/litexml/litexml-html-preview-client.js +5794 -4976
  611. package/dist/vendor/litexml/style.css +5 -5
  612. package/package.json +29 -26
  613. package/skills/safety.md +1 -1
  614. package/LICENSE +0 -33
  615. package/dist/esm-CDcJmHkG.mjs +0 -2
@@ -0,0 +1,359 @@
1
+ import { FileSystem, Path } from '@effect/platform';
2
+ import { Context, Effect, Layer } from 'effect';
3
+ import { ConfigMissingApiUrl, Generic, ProfileNotFound } from '../domain/errors';
4
+ // ---------------------------------------------------------------------------
5
+ // Constants — keep wire-compatible with `src/core/config-store.ts`
6
+ // ---------------------------------------------------------------------------
7
+ export const DEFAULT_CLIENT_ID = 'mxs-cli';
8
+ export const LEGACY_CONFIG_FIELDS = [
9
+ 'api_base',
10
+ 'auth_base',
11
+ 'client_id',
12
+ ];
13
+ export const LOCAL_DEV_ENV = 'MXS_CLI_LOCAL_DEV';
14
+ export const LOCAL_DEV_API_URL_ENV = 'MXS_CLI_LOCAL_DEV_API_URL';
15
+ export const LOCAL_DEV_PROFILE_NAME = 'local-dev';
16
+ export const LOCAL_DEV_API_URL_DEFAULT = 'http://localhost:2333';
17
+ export const isLocalDevEnabled = () => process.env[LOCAL_DEV_ENV] === '1';
18
+ export const getLocalDevApiUrl = () => process.env[LOCAL_DEV_API_URL_ENV]?.trim() || LOCAL_DEV_API_URL_DEFAULT;
19
+ export const shouldUseLocalDev = (input) => isLocalDevEnabled() &&
20
+ !input.profileOverride?.trim() &&
21
+ !input.envProfile?.trim() &&
22
+ !input.apiUrlOverride?.trim() &&
23
+ !input.envApiUrl?.trim();
24
+ export const stripLegacyConfigFields = (cfg) => {
25
+ const out = { ...cfg };
26
+ for (const k of LEGACY_CONFIG_FIELDS)
27
+ delete out[k];
28
+ return out;
29
+ };
30
+ export const parseApiUrl = (input) => Effect.gen(function* () {
31
+ let url = input.trim();
32
+ if (!url) {
33
+ return yield* Effect.fail(new ConfigMissingApiUrl({ message: 'API URL is empty' }));
34
+ }
35
+ if (!/^https?:\/\//i.test(url)) {
36
+ const isLocal = /^(?:localhost|127\.0\.0\.1|::1)(?::\d+)?$/i.test(url);
37
+ url = isLocal ? `http://${url}` : `https://${url}`;
38
+ }
39
+ url = url.replace(/\/+$/, '');
40
+ const match = url.match(/^(.*)\/api\/v(\d+)$/);
41
+ if (match) {
42
+ return { baseUrl: match[1], apiVersion: Number(match[2]) };
43
+ }
44
+ // Accept a bare `/api` suffix too — many users habitually paste the API
45
+ // root rather than the site root. The probe lives at `/api/v{N}/auth/ok`,
46
+ // so a leftover `/api` would yield a `/api/api/v{N}/...` URL and 404.
47
+ const apiSuffix = url.match(/^(.*)\/api$/);
48
+ if (apiSuffix) {
49
+ return { baseUrl: apiSuffix[1] };
50
+ }
51
+ return { baseUrl: url };
52
+ });
53
+ export const normalizeApiUrl = (input) => Effect.map(parseApiUrl(input), (p) => p.baseUrl);
54
+ // ---------------------------------------------------------------------------
55
+ // Implementation
56
+ // ---------------------------------------------------------------------------
57
+ const PROFILES_SUBDIR = 'profiles';
58
+ const getXdgConfigDir = (path) => {
59
+ const xdg = process.env.XDG_CONFIG_HOME;
60
+ const base = xdg && xdg.length > 0
61
+ ? xdg
62
+ : path.join(process.env.HOME || process.env.USERPROFILE || '~', '.config');
63
+ return path.join(base, 'mxs');
64
+ };
65
+ const isNotFound = (err) => {
66
+ if (typeof err === 'object' && err !== null) {
67
+ const e = err;
68
+ if (e._tag === 'SystemError' && e.reason === 'NotFound')
69
+ return true;
70
+ if (e.code === 'ENOENT')
71
+ return true;
72
+ }
73
+ return false;
74
+ };
75
+ const toGeneric = (err, message) => new Generic({ message, cause: err });
76
+ const readJsonIfExists = (fs, filePath) => Effect.gen(function* () {
77
+ const raw = yield* fs.readFileString(filePath).pipe(Effect.map((s) => s), Effect.catchAll((err) => isNotFound(err)
78
+ ? Effect.succeed(null)
79
+ : Effect.fail(toGeneric(err, `failed to read ${filePath}: ${String(err)}`))));
80
+ if (raw === null)
81
+ return null;
82
+ try {
83
+ return JSON.parse(raw);
84
+ }
85
+ catch (err) {
86
+ return yield* Effect.fail(new Generic({
87
+ message: `failed to parse ${filePath}: ${err.message}`,
88
+ cause: err,
89
+ }));
90
+ }
91
+ });
92
+ const writeJson = (fs, filePath, data, mode) => Effect.gen(function* () {
93
+ const text = `${JSON.stringify(data, null, 2)}`;
94
+ yield* fs
95
+ .writeFileString(filePath, text, { mode })
96
+ .pipe(Effect.catchAll((err) => Effect.fail(toGeneric(err, `failed to write ${filePath}`))));
97
+ // Best-effort chmod — silently ignore failures (Windows / unsupported FS).
98
+ yield* fs.chmod(filePath, mode).pipe(Effect.catchAll(() => Effect.void));
99
+ });
100
+ const ensureProfileDir = (fs, dir) => Effect.gen(function* () {
101
+ yield* fs
102
+ .makeDirectory(dir, { recursive: true, mode: 0o700 })
103
+ .pipe(Effect.catchAll((err) => Effect.fail(toGeneric(err, `failed to create ${dir}`))));
104
+ yield* fs.chmod(dir, 0o700).pipe(Effect.catchAll(() => Effect.void));
105
+ });
106
+ const make = Effect.gen(function* () {
107
+ const fs = yield* FileSystem.FileSystem;
108
+ const path = yield* Path.Path;
109
+ // Path helpers --------------------------------------------------------------
110
+ const configDir = () => getXdgConfigDir(path);
111
+ const profilesDir = () => path.join(configDir(), PROFILES_SUBDIR);
112
+ const profileDir = (name) => path.join(profilesDir(), name);
113
+ const profileConfigPath = (name) => path.join(profileDir(name), 'config.json');
114
+ const profileCredentialsPath = (name) => path.join(profileDir(name), 'credentials.json');
115
+ const legacyConfigPath = () => path.join(configDir(), 'config.json');
116
+ const legacyCredentialsPath = () => path.join(configDir(), 'credentials.json');
117
+ const currentPath = () => path.join(configDir(), 'current');
118
+ // Profile config IO ---------------------------------------------------------
119
+ const readProfileConfig = (name) => Effect.gen(function* () {
120
+ const raw = yield* readJsonIfExists(fs, profileConfigPath(name));
121
+ return stripLegacyConfigFields(raw ?? {});
122
+ });
123
+ const writeProfileConfig = (name, cfg) => Effect.gen(function* () {
124
+ yield* ensureProfileDir(fs, profileDir(name));
125
+ yield* writeJson(fs, profileConfigPath(name), cfg, 0o644);
126
+ });
127
+ const updateProfileConfig = (name, update) => Effect.gen(function* () {
128
+ const prev = yield* readProfileConfig(name);
129
+ const next = update(prev);
130
+ yield* writeProfileConfig(name, next);
131
+ return next;
132
+ });
133
+ // Credentials IO ------------------------------------------------------------
134
+ const enforceCredsMode = (p) => Effect.gen(function* () {
135
+ const info = yield* fs.stat(p).pipe(Effect.map((i) => i), Effect.catchAll((err) => isNotFound(err)
136
+ ? Effect.succeed(null)
137
+ : Effect.fail(toGeneric(err, `failed to stat ${p}`))));
138
+ if (info === null)
139
+ return;
140
+ const mode = info.mode & 0o777;
141
+ if (mode !== 0o600) {
142
+ process.stderr.write(`mxs: credentials file ${p} had mode ${mode.toString(8)}; chmod 600\n`);
143
+ yield* fs.chmod(p, 0o600).pipe(Effect.catchAll(() => Effect.void));
144
+ }
145
+ });
146
+ const readProfileCredentials = (name) => Effect.gen(function* () {
147
+ const p = profileCredentialsPath(name);
148
+ const data = yield* readJsonIfExists(fs, p);
149
+ if (data !== null) {
150
+ yield* enforceCredsMode(p);
151
+ }
152
+ return data;
153
+ });
154
+ const writeProfileCredentials = (name, creds) => Effect.gen(function* () {
155
+ yield* ensureProfileDir(fs, profileDir(name));
156
+ yield* writeJson(fs, profileCredentialsPath(name), creds, 0o600);
157
+ });
158
+ const deleteProfileCredentials = (name) => fs
159
+ .remove(profileCredentialsPath(name), { force: true })
160
+ .pipe(Effect.catchAll((err) => isNotFound(err)
161
+ ? Effect.void
162
+ : Effect.fail(toGeneric(err, `failed to remove credentials`))));
163
+ // Legacy IO -----------------------------------------------------------------
164
+ const readLegacyConfigRaw = readJsonIfExists(fs, legacyConfigPath());
165
+ const readLegacyCredentialsRaw = readJsonIfExists(fs, legacyCredentialsPath());
166
+ const readLegacyConfig = Effect.map(readLegacyConfigRaw, (raw) => (raw === null ? {} : stripLegacyConfigFields(raw)));
167
+ const deleteLegacyConfig = fs
168
+ .remove(legacyConfigPath(), { force: true })
169
+ .pipe(Effect.catchAll((err) => isNotFound(err)
170
+ ? Effect.void
171
+ : Effect.fail(toGeneric(err, 'failed to remove legacy config'))));
172
+ const deleteLegacyCredentials = fs
173
+ .remove(legacyCredentialsPath(), { force: true })
174
+ .pipe(Effect.catchAll((err) => isNotFound(err)
175
+ ? Effect.void
176
+ : Effect.fail(toGeneric(err, 'failed to remove legacy credentials'))));
177
+ // Current pointer -----------------------------------------------------------
178
+ const readCurrent = Effect.gen(function* () {
179
+ const raw = yield* fs.readFileString(currentPath()).pipe(Effect.map((s) => s), Effect.catchAll((err) => isNotFound(err)
180
+ ? Effect.succeed(null)
181
+ : Effect.fail(toGeneric(err, 'failed to read current pointer'))));
182
+ if (raw === null)
183
+ return null;
184
+ const name = raw.trim();
185
+ return name.length > 0 ? name : null;
186
+ });
187
+ const writeCurrent = (name) => Effect.gen(function* () {
188
+ yield* fs
189
+ .makeDirectory(configDir(), { recursive: true })
190
+ .pipe(Effect.catchAll((err) => Effect.fail(toGeneric(err, 'failed to create mxs config dir'))));
191
+ yield* fs
192
+ .writeFileString(currentPath(), `${name}\n`)
193
+ .pipe(Effect.catchAll((err) => Effect.fail(toGeneric(err, 'failed to write current pointer'))));
194
+ });
195
+ // Profile dir listing -------------------------------------------------------
196
+ const listProfileDirs = Effect.gen(function* () {
197
+ const dir = profilesDir();
198
+ const entries = yield* fs
199
+ .readDirectory(dir)
200
+ .pipe(Effect.map((arr) => arr), Effect.catchAll((err) => isNotFound(err)
201
+ ? Effect.succeed(null)
202
+ : Effect.fail(toGeneric(err, `failed to list ${dir}`))));
203
+ if (entries === null)
204
+ return [];
205
+ const visible = entries.filter((name) => !name.startsWith('.'));
206
+ // Filter out non-directory entries (files like `readme.txt`).
207
+ const out = [];
208
+ for (const name of visible) {
209
+ const info = yield* fs.stat(path.join(dir, name)).pipe(Effect.map((i) => i), Effect.catchAll(() => Effect.succeed(null)));
210
+ if (info && info.type === 'Directory')
211
+ out.push(name);
212
+ }
213
+ return out.sort();
214
+ });
215
+ const profileExists = (name) => fs.stat(profileDir(name)).pipe(Effect.map((info) => info.type === 'Directory'), Effect.catchAll((err) => isNotFound(err)
216
+ ? Effect.succeed(false)
217
+ : Effect.fail(toGeneric(err, `failed to stat profile ${name}`))));
218
+ const removeProfileDir = (name) => fs
219
+ .remove(profileDir(name), { recursive: true, force: true })
220
+ .pipe(Effect.catchAll((err) => Effect.fail(toGeneric(err, `failed to remove profile ${name}`))));
221
+ // Resolve ------------------------------------------------------------------
222
+ const buildLocalDevProfileConfig = () => Effect.gen(function* () {
223
+ const parsed = yield* parseApiUrl(getLocalDevApiUrl());
224
+ return {
225
+ api_url: parsed.baseUrl,
226
+ api_version: 2,
227
+ production: false,
228
+ };
229
+ });
230
+ const resolve = (overrides = {}) => Effect.gen(function* () {
231
+ const envApiUrl = process.env.MXS_API_URL?.trim();
232
+ const envToken = process.env.MXS_TOKEN?.trim();
233
+ const envApiKey = process.env.MXS_API_KEY?.trim();
234
+ const envProfile = process.env.MXS_PROFILE?.trim();
235
+ const urlOverridden = Boolean(overrides.apiUrl || envApiUrl);
236
+ const profileExplicit = Boolean(overrides.profile || envProfile);
237
+ const currentProfile = yield* readCurrent;
238
+ const useLocalDev = shouldUseLocalDev({
239
+ profileOverride: overrides.profile,
240
+ envProfile,
241
+ apiUrlOverride: overrides.apiUrl,
242
+ envApiUrl,
243
+ currentProfile,
244
+ });
245
+ const profileName = overrides.profile?.trim() ||
246
+ envProfile ||
247
+ (useLocalDev ? LOCAL_DEV_PROFILE_NAME : null) ||
248
+ currentProfile ||
249
+ null;
250
+ const useLocalDevEndpoint = isLocalDevEnabled() &&
251
+ !urlOverridden &&
252
+ profileName === LOCAL_DEV_PROFILE_NAME;
253
+ if (profileName && !urlOverridden && !useLocalDev) {
254
+ const exists = yield* profileExists(profileName);
255
+ if (!exists) {
256
+ return yield* Effect.fail(new ProfileNotFound({
257
+ name: profileName,
258
+ message: `profile '${profileName}' does not exist`,
259
+ hint: 'run `mxs profile ls` to see configured profiles, or `mxs auth login --profile <name>` to create one',
260
+ }));
261
+ }
262
+ }
263
+ let profileConfig = {};
264
+ if (useLocalDev) {
265
+ profileConfig = yield* buildLocalDevProfileConfig();
266
+ }
267
+ else if (profileName) {
268
+ profileConfig = yield* readProfileConfig(profileName);
269
+ }
270
+ const rawApiUrl = overrides.apiUrl || envApiUrl || profileConfig.api_url;
271
+ if (!rawApiUrl) {
272
+ return yield* Effect.fail(new ConfigMissingApiUrl({
273
+ message: 'API URL is not configured',
274
+ hint: 'set MXS_API_URL or pass --api-url <url>, or run `mxs auth login` in an interactive shell',
275
+ }));
276
+ }
277
+ const parsed = yield* parseApiUrl(rawApiUrl);
278
+ const apiUrl = parsed.baseUrl;
279
+ const apiVersion = profileConfig.api_version ?? parsed.apiVersion ?? 2;
280
+ const apiBase = useLocalDevEndpoint
281
+ ? apiUrl
282
+ : `${apiUrl}/api/v${apiVersion}`;
283
+ const authBase = useLocalDevEndpoint
284
+ ? `${apiUrl}/auth`
285
+ : `${apiBase}/auth`;
286
+ let token;
287
+ if (urlOverridden) {
288
+ token = overrides.token || envToken || undefined;
289
+ }
290
+ else {
291
+ let profileCreds = null;
292
+ // Read credentials for the resolved profile, including the synthetic
293
+ // `local-dev` profile when auth login has written them. Skipping the
294
+ // read when `useLocalDev` is true was a bug — login writes
295
+ // credentials under `profiles/local-dev/`, so subsequent commands must
296
+ // pick them up.
297
+ if (profileName) {
298
+ profileCreds = yield* readProfileCredentials(profileName);
299
+ }
300
+ token = overrides.token || envToken || profileCreds?.access_token;
301
+ }
302
+ const apiKey = overrides.apiKey || envApiKey;
303
+ const isProduction = urlOverridden
304
+ ? false
305
+ : profileName
306
+ ? Boolean(profileConfig.production)
307
+ : false;
308
+ return {
309
+ apiUrl,
310
+ apiBase,
311
+ authBase,
312
+ apiVersion,
313
+ clientId: DEFAULT_CLIENT_ID,
314
+ token,
315
+ apiKey,
316
+ configPath: profileName
317
+ ? profileConfigPath(profileName)
318
+ : legacyConfigPath(),
319
+ credentialsPath: profileName
320
+ ? profileCredentialsPath(profileName)
321
+ : legacyCredentialsPath(),
322
+ profileName,
323
+ isProduction,
324
+ profileExplicit,
325
+ urlOverridden,
326
+ };
327
+ });
328
+ const svc = {
329
+ getConfigDir: Effect.sync(configDir),
330
+ getProfilesDir: Effect.sync(profilesDir),
331
+ getProfileDir: (name) => Effect.sync(() => profileDir(name)),
332
+ getProfileConfigPath: (name) => Effect.sync(() => profileConfigPath(name)),
333
+ getProfileCredentialsPath: (name) => Effect.sync(() => profileCredentialsPath(name)),
334
+ getCurrentPath: Effect.sync(currentPath),
335
+ getLegacyConfigPath: Effect.sync(legacyConfigPath),
336
+ getLegacyCredentialsPath: Effect.sync(legacyCredentialsPath),
337
+ readProfileConfig,
338
+ writeProfileConfig,
339
+ updateProfileConfig,
340
+ readProfileCredentials,
341
+ writeProfileCredentials,
342
+ deleteProfileCredentials,
343
+ readLegacyConfig,
344
+ readLegacyConfigRaw,
345
+ readLegacyCredentialsRaw,
346
+ deleteLegacyConfig,
347
+ deleteLegacyCredentials,
348
+ readCurrent,
349
+ writeCurrent,
350
+ listProfileDirs,
351
+ profileExists,
352
+ removeProfileDir,
353
+ resolve,
354
+ };
355
+ return svc;
356
+ });
357
+ export class Config extends Context.Tag('Config')() {
358
+ static Default = Layer.effect(Config, make);
359
+ }
@@ -0,0 +1,28 @@
1
+ import { FileSystem } from '@effect/platform';
2
+ import { Context, Effect, Layer } from 'effect';
3
+ import { Generic, ValidationFailed } from '../domain/errors';
4
+ export interface EditorRoundTrip {
5
+ readonly filename: string;
6
+ readonly initialContent: string;
7
+ readonly editor?: string;
8
+ }
9
+ export interface EditorService {
10
+ /** Spawn `$EDITOR` against a tmp file seeded with `initialContent`. */
11
+ readonly openEditor: (opts: EditorRoundTrip) => Effect.Effect<string, Generic>;
12
+ /** Prompt for free-form input. */
13
+ readonly prompt: (message: string, opts?: {
14
+ readonly initialValue?: string;
15
+ readonly placeholder?: string;
16
+ }) => Effect.Effect<string, Generic>;
17
+ /** Yes/no confirmation. */
18
+ readonly confirm: (message: string, opts?: {
19
+ readonly initialValue?: boolean;
20
+ }) => Effect.Effect<boolean, Generic>;
21
+ /** Read a file path or stdin (`-` or no path). */
22
+ readonly readFileOrStdin: (path: string | undefined) => Effect.Effect<string, ValidationFailed | Generic>;
23
+ }
24
+ declare const Editor_base: Context.TagClass<Editor, "Editor", EditorService>;
25
+ export declare class Editor extends Editor_base {
26
+ static Default: Layer.Layer<Editor, never, FileSystem.FileSystem>;
27
+ }
28
+ export {};
@@ -0,0 +1,95 @@
1
+ import { spawn } from 'node:child_process';
2
+ import os from 'node:os';
3
+ import path from 'node:path';
4
+ import * as Clack from '@clack/prompts';
5
+ import { FileSystem } from '@effect/platform';
6
+ import { Context, Effect, Layer } from 'effect';
7
+ import { Generic, ValidationFailed } from '../domain/errors';
8
+ const messageOf = (err) => {
9
+ if (err instanceof Error)
10
+ return err.message;
11
+ if (typeof err === 'string')
12
+ return err;
13
+ return String(err);
14
+ };
15
+ const spawnInteractive = (cmd, args) => new Promise((resolve, reject) => {
16
+ const child = spawn(cmd, args, { stdio: 'inherit', shell: true });
17
+ child.on('error', reject);
18
+ child.on('exit', (code) => {
19
+ if (code === 0)
20
+ resolve();
21
+ else
22
+ reject(new Error(`editor exited with code ${code}`));
23
+ });
24
+ });
25
+ const readStdinAll = () => new Promise((resolve, reject) => {
26
+ const stdin = process.stdin;
27
+ const chunks = [];
28
+ stdin.on('data', (chunk) => {
29
+ chunks.push(typeof chunk === 'string' ? Buffer.from(chunk) : chunk);
30
+ });
31
+ stdin.on('end', () => resolve(Buffer.concat(chunks).toString('utf8')));
32
+ stdin.on('error', reject);
33
+ if (stdin.isPaused?.())
34
+ stdin.resume();
35
+ });
36
+ const makeService = (fs) => ({
37
+ openEditor: (opts) => Effect.tryPromise({
38
+ try: async () => {
39
+ const editor = opts.editor ?? process.env.EDITOR ?? process.env.VISUAL;
40
+ if (!editor) {
41
+ throw new Error('$EDITOR not set; export EDITOR=vim (or another editor) and try again');
42
+ }
43
+ const dir = await new Promise((resolve, reject) => import('node:fs').then(({ promises }) => promises
44
+ .mkdtemp(path.join(os.tmpdir(), 'mxs-'))
45
+ .then(resolve, reject)));
46
+ const tmpPath = path.join(dir, opts.filename);
47
+ const nodeFs = await import('node:fs');
48
+ await nodeFs.promises.writeFile(tmpPath, opts.initialContent, 'utf8');
49
+ await spawnInteractive(editor, [tmpPath]);
50
+ const next = await nodeFs.promises.readFile(tmpPath, 'utf8');
51
+ await nodeFs.promises.unlink(tmpPath).catch(() => undefined);
52
+ await nodeFs.promises.rmdir(dir).catch(() => undefined);
53
+ return next;
54
+ },
55
+ catch: (err) => new Generic({ message: messageOf(err), cause: err }),
56
+ }),
57
+ prompt: (message, opts) => Effect.tryPromise({
58
+ try: () => Clack.text({
59
+ message,
60
+ initialValue: opts?.initialValue,
61
+ placeholder: opts?.placeholder,
62
+ }),
63
+ catch: (err) => new Generic({ message: messageOf(err), cause: err }),
64
+ }).pipe(Effect.flatMap((value) => Clack.isCancel(value)
65
+ ? Effect.fail(new Generic({ message: 'cancelled by user' }))
66
+ : Effect.succeed(value))),
67
+ confirm: (message, opts) => Effect.tryPromise({
68
+ try: () => Clack.confirm({
69
+ message,
70
+ initialValue: opts?.initialValue,
71
+ }),
72
+ catch: (err) => new Generic({ message: messageOf(err), cause: err }),
73
+ }).pipe(Effect.flatMap((value) => Clack.isCancel(value)
74
+ ? Effect.fail(new Generic({ message: 'cancelled by user' }))
75
+ : Effect.succeed(value))),
76
+ readFileOrStdin: (p) => {
77
+ if (p === undefined || p === '-' || p === '') {
78
+ return Effect.tryPromise({
79
+ try: () => readStdinAll(),
80
+ catch: (err) => new ValidationFailed({
81
+ message: `failed to read stdin: ${messageOf(err)}`,
82
+ }),
83
+ });
84
+ }
85
+ return fs.readFileString(p).pipe(Effect.mapError((err) => new ValidationFailed({
86
+ message: `failed to read ${p}: ${messageOf(err)}`,
87
+ })));
88
+ },
89
+ });
90
+ export class Editor extends Context.Tag('Editor')() {
91
+ static Default = Layer.effect(Editor, Effect.gen(function* () {
92
+ const fs = yield* FileSystem.FileSystem;
93
+ return makeService(fs);
94
+ }));
95
+ }
@@ -0,0 +1,27 @@
1
+ import { Context, Effect, Layer } from 'effect';
2
+ import { ValidationXml } from '../domain/errors';
3
+ export interface LexicalState {
4
+ readonly root: {
5
+ readonly type: 'root';
6
+ readonly children: ReadonlyArray<unknown>;
7
+ readonly direction?: 'ltr' | 'rtl' | null;
8
+ readonly format?: string;
9
+ readonly indent?: number;
10
+ readonly version?: number;
11
+ };
12
+ }
13
+ export interface LexicalService {
14
+ /** Parse LiteXML into a Lexical editor state. */
15
+ readonly litexmlToPayload: (xml: string) => Effect.Effect<LexicalState, ValidationXml>;
16
+ /** Serialize a Lexical editor state back to LiteXML. */
17
+ readonly payloadToLitexml: (state: LexicalState) => Effect.Effect<string, ValidationXml>;
18
+ /** Derive a Markdown rendering from a Lexical state (used for `--output llm`). */
19
+ readonly lexicalJsonToMarkdown: (state: LexicalState) => Effect.Effect<string, ValidationXml>;
20
+ /** Convenience: a blank Lexical state for new-document scaffolds. */
21
+ readonly emptyState: Effect.Effect<LexicalState>;
22
+ }
23
+ declare const Lexical_base: Context.TagClass<Lexical, "Lexical", LexicalService>;
24
+ export declare class Lexical extends Lexical_base {
25
+ static Default: Layer.Layer<Lexical>;
26
+ }
27
+ export {};
@@ -0,0 +1,56 @@
1
+ import { deserializeMxLitexmlToLexical, mxLexicalToMarkdown, serializeMxLexicalToLitexml, stripMxLitexmlDocWrapper, } from '@mx-space/editor';
2
+ import { Context, Effect, Layer } from 'effect';
3
+ import { ValidationXml } from '../domain/errors';
4
+ const messageOf = (err) => {
5
+ if (err instanceof Error)
6
+ return err.message;
7
+ if (typeof err === 'string')
8
+ return err;
9
+ return String(err);
10
+ };
11
+ const makeService = () => ({
12
+ litexmlToPayload: (xml) => Effect.try({
13
+ try: () => {
14
+ const wrapped = xml.includes('<doc') ? xml : `<doc>${xml}</doc>`;
15
+ return deserializeMxLitexmlToLexical(wrapped);
16
+ },
17
+ catch: (err) => new ValidationXml({
18
+ message: `failed to parse LiteXML: ${messageOf(err)}`,
19
+ cause: err,
20
+ }),
21
+ }),
22
+ payloadToLitexml: (state) => Effect.try({
23
+ try: () => {
24
+ const xml = serializeMxLexicalToLitexml(state, {
25
+ compact: false,
26
+ });
27
+ return stripMxLitexmlDocWrapper(xml).trim();
28
+ },
29
+ catch: (err) => new ValidationXml({
30
+ message: `failed to serialize Lexical state: ${messageOf(err)}`,
31
+ cause: err,
32
+ }),
33
+ }),
34
+ lexicalJsonToMarkdown: (state) => Effect.try({
35
+ try: () => {
36
+ return mxLexicalToMarkdown(state);
37
+ },
38
+ catch: (err) => new ValidationXml({
39
+ message: `failed to render Markdown: ${messageOf(err)}`,
40
+ cause: err,
41
+ }),
42
+ }),
43
+ emptyState: Effect.sync(() => ({
44
+ root: {
45
+ type: 'root',
46
+ children: [],
47
+ direction: 'ltr',
48
+ format: '',
49
+ indent: 0,
50
+ version: 1,
51
+ },
52
+ })),
53
+ });
54
+ export class Lexical extends Context.Tag('Lexical')() {
55
+ static Default = Layer.succeed(Lexical, makeService());
56
+ }
@@ -0,0 +1,31 @@
1
+ import { FileSystem } from '@effect/platform';
2
+ import { Context, Effect, Layer } from 'effect';
3
+ import { ConfigMigrationFailed, type Generic } from '../domain/errors';
4
+ import { Config } from './Config';
5
+ export interface MigrationResult {
6
+ readonly profile: string | null;
7
+ readonly production: boolean;
8
+ readonly cleanedStaleLegacy: boolean;
9
+ }
10
+ export interface MigrationOptions {
11
+ /** Defaults to process.stdin.isTTY && process.stdout.isTTY. */
12
+ readonly isTTY?: boolean;
13
+ /**
14
+ * Injected for tests. Called when TTY + legacy api_url present. Resolves
15
+ * `true` to set production. May resolve a symbol (treated as cancel → false).
16
+ */
17
+ readonly promptIsProduction?: (apiUrl: string) => Promise<boolean | symbol>;
18
+ /**
19
+ * Where to emit status messages. Defaults to `process.stderr`. Pass `null`
20
+ * to suppress entirely.
21
+ */
22
+ readonly report?: ((line: string) => void) | null;
23
+ }
24
+ export interface MigrationService {
25
+ readonly runLegacyMigrationIfNeeded: (opts?: MigrationOptions) => Effect.Effect<MigrationResult | null, ConfigMigrationFailed | Generic>;
26
+ }
27
+ declare const Migration_base: Context.TagClass<Migration, "Migration", MigrationService>;
28
+ export declare class Migration extends Migration_base {
29
+ static Default: Layer.Layer<Migration, never, Config | FileSystem.FileSystem>;
30
+ }
31
+ export {};