@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.
- package/README.md +1 -1
- package/dist/{Lexical.dev-Cck4n26y.mjs → Lexical.dev-BSvx45_E.mjs} +127 -94
- package/dist/{Lexical.node-D6wf2D5M.mjs → Lexical.node-kAh5GM2n.mjs} +1 -1
- package/dist/{Lexical.prod-DCwS1oTq.mjs → Lexical.prod-Bqwgb3ez.mjs} +4 -2
- package/dist/{LexicalClipboard.dev-CMkPHV7O.mjs → LexicalClipboard.dev-BWU3KXIa.mjs} +18 -14
- package/dist/{LexicalClipboard.node-m4nZ7IYw.mjs → LexicalClipboard.node-BygAdNdF.mjs} +1 -1
- package/dist/{LexicalClipboard.prod-B_rN1vE1.mjs → LexicalClipboard.prod-BtMuKNyT.mjs} +10 -10
- package/dist/{LexicalCodeCore.dev-DyJw3i8V.mjs → LexicalCodeCore.dev-CD2xgvDs.mjs} +43 -25
- package/dist/{LexicalCodeCore.prod-DPXLHQLF.mjs → LexicalCodeCore.prod-Bl6FFMc7.mjs} +6 -6
- package/dist/{LexicalDragon.dev-ZkNfMwrE.mjs → LexicalDragon.dev-BwdYhm4K.mjs} +2 -2
- package/dist/{LexicalDragon.node-Ds9oLUFh.mjs → LexicalDragon.node-CpJhkCVV.mjs} +1 -1
- package/dist/{LexicalDragon.prod-B58ic2av.mjs → LexicalDragon.prod-CvXmWwo1.mjs} +2 -2
- package/dist/{LexicalExtension.dev-DvwHs1Xv.mjs → LexicalExtension.dev-LcRLXI5Z.mjs} +25 -13
- package/dist/{LexicalExtension.node-5OymZQfy.mjs → LexicalExtension.node-BwJt2LXV.mjs} +1 -1
- package/dist/{LexicalExtension.prod-Ce0T5smQ.mjs → LexicalExtension.prod-lg8_33-H.mjs} +16 -13
- package/dist/{LexicalHeadless.dev-DA0WldSR.mjs → LexicalHeadless.dev-BeUbKBes.mjs} +1 -1
- package/dist/{LexicalHeadless.prod-1kQgKB6c.mjs → LexicalHeadless.prod-4gbIA8HM.mjs} +1 -1
- package/dist/{LexicalHtml.dev-BDB7CUrx.mjs → LexicalHtml.dev-BLdZWTCJ.mjs} +20 -14
- package/dist/{LexicalHtml.node-DpVNt7It.mjs → LexicalHtml.node-BeuJMvvt.mjs} +1 -1
- package/dist/{LexicalHtml.prod-HkxM5scw.mjs → LexicalHtml.prod-CHUyCocN.mjs} +4 -4
- package/dist/{LexicalLink.dev-C5zNJlrm.mjs → LexicalLink.dev-DgsFRqw0.mjs} +28 -21
- package/dist/{LexicalLink.prod-Bkt9hQAt.mjs → LexicalLink.prod-CkXkeKY2.mjs} +6 -5
- package/dist/{LexicalList.dev-B7VgME-m.mjs → LexicalList.dev-OOms3kQi.mjs} +4 -4
- package/dist/{LexicalList.prod-B8c7TDjH.mjs → LexicalList.prod-DzMBeqHn.mjs} +4 -4
- package/dist/{LexicalMarkdown.dev-B5z9kLbV.mjs → LexicalMarkdown.dev-DJLKbZtD.mjs} +40 -29
- package/dist/{LexicalMarkdown.prod-wKzw7FFH.mjs → LexicalMarkdown.prod-Cp21kDCU.mjs} +10 -7
- package/dist/{LexicalRichText.dev-CUd6Li5F.mjs → LexicalRichText.dev-0rkAGjUf.mjs} +15 -11
- package/dist/{LexicalRichText.node-BKfaQ-CH.mjs → LexicalRichText.node-Cd-BySPE.mjs} +4 -4
- package/dist/{LexicalRichText.prod-SBewjJHx.mjs → LexicalRichText.prod-DTQiEr8C.mjs} +17 -11
- package/dist/{LexicalSelection.dev-D27JOCqj.mjs → LexicalSelection.dev-Bi0VlUEv.mjs} +28 -24
- package/dist/{LexicalSelection.node-DBEwPjBu.mjs → LexicalSelection.node-t2U46EF_.mjs} +1 -1
- package/dist/{LexicalSelection.prod-OaYhXHOL.mjs → LexicalSelection.prod-CrFG111g.mjs} +2 -2
- package/dist/{LexicalTable.dev-6IFFOAE0.mjs → LexicalTable.dev-D-sFhO-o.mjs} +33 -28
- package/dist/{LexicalTable.prod-2CaLZ7fH.mjs → LexicalTable.prod-DwYaa_dN.mjs} +10 -9
- package/dist/{LexicalUtils.dev-DJA7J_7v.mjs → LexicalUtils.dev-Q2q3-UDM.mjs} +8 -5
- package/dist/{LexicalUtils.node-Df9oPTlA.mjs → LexicalUtils.node-Dl7OvqJV.mjs} +1 -1
- package/dist/{LexicalUtils.prod-Bb7V4Ewg.mjs → LexicalUtils.prod-CBnq_iEV.mjs} +7 -6
- package/dist/bin/mxs.mjs +1 -1
- package/dist/esm-CNZ7kdTg.mjs +2 -0
- package/dist/{esm-DLzrv7gD.mjs → esm-ZXjJmLEC.mjs} +257 -260
- package/dist/index.mjs +1 -1
- package/dist/{mxs-BIRW5Axj.mjs → mxs-DC9zR3f2.mjs} +759 -539
- package/dist/{rolldown-runtime-JspESFgx.mjs → rolldown-runtime-B4iAMlE-.mjs} +1 -1
- package/dist/src/bin/mxs.d.ts +2 -0
- package/dist/src/bin/mxs.js +310 -0
- package/dist/src/cli/ai/_poll.d.ts +12 -0
- package/dist/src/cli/ai/_poll.js +38 -0
- package/dist/src/cli/ai/_resolve.d.ts +8 -0
- package/dist/src/cli/ai/_resolve.js +27 -0
- package/dist/src/cli/ai/index.d.ts +127 -0
- package/dist/src/cli/ai/index.js +46 -0
- package/dist/src/cli/ai/insights/by-article.d.ts +10 -0
- package/dist/src/cli/ai/insights/by-article.js +21 -0
- package/dist/src/cli/ai/insights/delete.d.ts +7 -0
- package/dist/src/cli/ai/insights/delete.js +18 -0
- package/dist/src/cli/ai/insights/edit.d.ts +8 -0
- package/dist/src/cli/ai/insights/edit.js +54 -0
- package/dist/src/cli/ai/insights/get.d.ts +6 -0
- package/dist/src/cli/ai/insights/get.js +11 -0
- package/dist/src/cli/ai/insights/index.d.ts +30 -0
- package/dist/src/cli/ai/insights/index.js +17 -0
- package/dist/src/cli/ai/insights/list.d.ts +10 -0
- package/dist/src/cli/ai/insights/list.js +20 -0
- package/dist/src/cli/ai/insights/refresh.d.ts +10 -0
- package/dist/src/cli/ai/insights/refresh.js +25 -0
- package/dist/src/cli/ai/insights/translate.d.ts +10 -0
- package/dist/src/cli/ai/insights/translate.js +25 -0
- package/dist/src/cli/ai/overview/by-article.d.ts +7 -0
- package/dist/src/cli/ai/overview/by-article.js +15 -0
- package/dist/src/cli/ai/overview/index.d.ts +11 -0
- package/dist/src/cli/ai/overview/index.js +4 -0
- package/dist/src/cli/ai/overview/list.d.ts +10 -0
- package/dist/src/cli/ai/overview/list.js +20 -0
- package/dist/src/cli/ai/summary/by-article.d.ts +10 -0
- package/dist/src/cli/ai/summary/by-article.js +21 -0
- package/dist/src/cli/ai/summary/delete.d.ts +7 -0
- package/dist/src/cli/ai/summary/delete.js +18 -0
- package/dist/src/cli/ai/summary/edit.d.ts +8 -0
- package/dist/src/cli/ai/summary/edit.js +54 -0
- package/dist/src/cli/ai/summary/get.d.ts +6 -0
- package/dist/src/cli/ai/summary/get.js +11 -0
- package/dist/src/cli/ai/summary/index.d.ts +30 -0
- package/dist/src/cli/ai/summary/index.js +9 -0
- package/dist/src/cli/ai/summary/list.d.ts +10 -0
- package/dist/src/cli/ai/summary/list.js +20 -0
- package/dist/src/cli/ai/summary/regen.d.ts +10 -0
- package/dist/src/cli/ai/summary/regen.js +25 -0
- package/dist/src/cli/ai/summary/translate.d.ts +10 -0
- package/dist/src/cli/ai/summary/translate.js +25 -0
- package/dist/src/cli/ai/translate/by-article.d.ts +9 -0
- package/dist/src/cli/ai/translate/by-article.js +19 -0
- package/dist/src/cli/ai/translate/delete.d.ts +7 -0
- package/dist/src/cli/ai/translate/delete.js +18 -0
- package/dist/src/cli/ai/translate/edit.d.ts +8 -0
- package/dist/src/cli/ai/translate/edit.js +97 -0
- package/dist/src/cli/ai/translate/entries/delete.d.ts +7 -0
- package/dist/src/cli/ai/translate/entries/delete.js +18 -0
- package/dist/src/cli/ai/translate/entries/edit.d.ts +8 -0
- package/dist/src/cli/ai/translate/entries/edit.js +73 -0
- package/dist/src/cli/ai/translate/entries/generate.d.ts +7 -0
- package/dist/src/cli/ai/translate/entries/generate.js +15 -0
- package/dist/src/cli/ai/translate/entries/index.d.ts +17 -0
- package/dist/src/cli/ai/translate/entries/index.js +6 -0
- package/dist/src/cli/ai/translate/entries/list.d.ts +10 -0
- package/dist/src/cli/ai/translate/entries/list.js +20 -0
- package/dist/src/cli/ai/translate/get.d.ts +6 -0
- package/dist/src/cli/ai/translate/get.js +11 -0
- package/dist/src/cli/ai/translate/index.d.ts +40 -0
- package/dist/src/cli/ai/translate/index.js +19 -0
- package/dist/src/cli/ai/translate/languages.d.ts +7 -0
- package/dist/src/cli/ai/translate/languages.js +15 -0
- package/dist/src/cli/ai/translate/list.d.ts +9 -0
- package/dist/src/cli/ai/translate/list.js +19 -0
- package/dist/src/cli/ai/translate/run.d.ts +10 -0
- package/dist/src/cli/ai/translate/run.js +31 -0
- package/dist/src/cli/ai/tts/by-article.d.ts +7 -0
- package/dist/src/cli/ai/tts/by-article.js +15 -0
- package/dist/src/cli/ai/tts/delete.d.ts +7 -0
- package/dist/src/cli/ai/tts/delete.js +18 -0
- package/dist/src/cli/ai/tts/index.d.ts +22 -0
- package/dist/src/cli/ai/tts/index.js +7 -0
- package/dist/src/cli/ai/tts/list.d.ts +10 -0
- package/dist/src/cli/ai/tts/list.js +20 -0
- package/dist/src/cli/ai/tts/run.d.ts +10 -0
- package/dist/src/cli/ai/tts/run.js +25 -0
- package/dist/src/cli/ai/tts/voices.d.ts +7 -0
- package/dist/src/cli/ai/tts/voices.js +12 -0
- package/dist/src/cli/ai/views.d.ts +3 -0
- package/dist/src/cli/ai/views.js +45 -0
- package/dist/src/cli/auth/index.d.ts +6 -0
- package/dist/src/cli/auth/index.js +22 -0
- package/dist/src/cli/auth/login.d.ts +11 -0
- package/dist/src/cli/auth/login.js +168 -0
- package/dist/src/cli/auth/logout.d.ts +6 -0
- package/dist/src/cli/auth/logout.js +21 -0
- package/dist/src/cli/auth/status.d.ts +4 -0
- package/dist/src/cli/auth/status.js +31 -0
- package/dist/src/cli/auth/view.d.ts +25 -0
- package/dist/src/cli/auth/view.js +46 -0
- package/dist/src/cli/auth/whoami.d.ts +7 -0
- package/dist/src/cli/auth/whoami.js +44 -0
- package/dist/src/cli/category/create.d.ts +10 -0
- package/dist/src/cli/category/create.js +24 -0
- package/dist/src/cli/category/delete.d.ts +8 -0
- package/dist/src/cli/category/delete.js +21 -0
- package/dist/src/cli/category/get.d.ts +6 -0
- package/dist/src/cli/category/get.js +11 -0
- package/dist/src/cli/category/index.d.ts +20 -0
- package/dist/src/cli/category/index.js +41 -0
- package/dist/src/cli/category/list.d.ts +4 -0
- package/dist/src/cli/category/list.js +10 -0
- package/dist/src/cli/category/update.d.ts +12 -0
- package/dist/src/cli/category/update.js +34 -0
- package/dist/src/cli/comment/_flags.d.ts +28 -0
- package/dist/src/cli/comment/_flags.js +48 -0
- package/dist/src/cli/comment/approve.d.ts +9 -0
- package/dist/src/cli/comment/approve.js +23 -0
- package/dist/src/cli/comment/delete.d.ts +9 -0
- package/dist/src/cli/comment/delete.js +24 -0
- package/dist/src/cli/comment/get.d.ts +6 -0
- package/dist/src/cli/comment/get.js +12 -0
- package/dist/src/cli/comment/index.d.ts +34 -0
- package/dist/src/cli/comment/index.js +53 -0
- package/dist/src/cli/comment/list.d.ts +9 -0
- package/dist/src/cli/comment/list.js +20 -0
- package/dist/src/cli/comment/reject.d.ts +9 -0
- package/dist/src/cli/comment/reject.js +23 -0
- package/dist/src/cli/comment/reply.d.ts +9 -0
- package/dist/src/cli/comment/reply.js +31 -0
- package/dist/src/cli/comment/unread.d.ts +7 -0
- package/dist/src/cli/comment/unread.js +21 -0
- package/dist/src/cli/comment/view.d.ts +3 -0
- package/dist/src/cli/comment/view.js +197 -0
- package/dist/src/cli/config/edit.d.ts +5 -0
- package/dist/src/cli/config/edit.js +36 -0
- package/dist/src/cli/config/get.d.ts +6 -0
- package/dist/src/cli/config/get.js +11 -0
- package/dist/src/cli/config/index.d.ts +10 -0
- package/dist/src/cli/config/index.js +22 -0
- package/dist/src/cli/config/list.d.ts +4 -0
- package/dist/src/cli/config/list.js +10 -0
- package/dist/src/cli/config/set.d.ts +9 -0
- package/dist/src/cli/config/set.js +48 -0
- package/dist/src/cli/draft/_shared.d.ts +27 -0
- package/dist/src/cli/draft/_shared.js +85 -0
- package/dist/src/cli/draft/create.d.ts +21 -0
- package/dist/src/cli/draft/create.js +34 -0
- package/dist/src/cli/draft/delete.d.ts +7 -0
- package/dist/src/cli/draft/delete.js +20 -0
- package/dist/src/cli/draft/get.d.ts +6 -0
- package/dist/src/cli/draft/get.js +11 -0
- package/dist/src/cli/draft/index.d.ts +54 -0
- package/dist/src/cli/draft/index.js +42 -0
- package/dist/src/cli/draft/list.d.ts +11 -0
- package/dist/src/cli/draft/list.js +23 -0
- package/dist/src/cli/draft/publish.d.ts +8 -0
- package/dist/src/cli/draft/publish.js +64 -0
- package/dist/src/cli/draft/update.d.ts +22 -0
- package/dist/src/cli/draft/update.js +29 -0
- package/dist/src/cli/file/_shared.d.ts +6 -0
- package/dist/src/cli/file/_shared.js +5 -0
- package/dist/src/cli/file/delete.d.ts +8 -0
- package/dist/src/cli/file/delete.js +21 -0
- package/dist/src/cli/file/index.d.ts +19 -0
- package/dist/src/cli/file/index.js +33 -0
- package/dist/src/cli/file/list.d.ts +6 -0
- package/dist/src/cli/file/list.js +11 -0
- package/dist/src/cli/file/rename.d.ts +8 -0
- package/dist/src/cli/file/rename.js +16 -0
- package/dist/src/cli/file/upload.d.ts +9 -0
- package/dist/src/cli/file/upload.js +32 -0
- package/dist/src/cli/help/index.d.ts +62 -0
- package/dist/src/cli/help/index.js +276 -0
- package/dist/src/cli/help/registry.d.ts +28 -0
- package/dist/src/cli/help/registry.js +29 -0
- package/dist/src/cli/note/_flags.d.ts +66 -0
- package/dist/src/cli/note/_flags.js +73 -0
- package/dist/src/cli/note/create.d.ts +23 -0
- package/dist/src/cli/note/create.js +25 -0
- package/dist/src/cli/note/delete.d.ts +8 -0
- package/dist/src/cli/note/delete.js +21 -0
- package/dist/src/cli/note/edit.d.ts +28 -0
- package/dist/src/cli/note/edit.js +114 -0
- package/dist/src/cli/note/get.d.ts +6 -0
- package/dist/src/cli/note/get.js +29 -0
- package/dist/src/cli/note/index.d.ts +77 -0
- package/dist/src/cli/note/index.js +63 -0
- package/dist/src/cli/note/list.d.ts +10 -0
- package/dist/src/cli/note/list.js +22 -0
- package/dist/src/cli/note/publish.d.ts +7 -0
- package/dist/src/cli/note/publish.js +17 -0
- package/dist/src/cli/note/unpublish.d.ts +7 -0
- package/dist/src/cli/note/unpublish.js +17 -0
- package/dist/src/cli/note/update.d.ts +25 -0
- package/dist/src/cli/note/update.js +36 -0
- package/dist/src/cli/note/view.d.ts +3 -0
- package/dist/src/cli/note/view.js +162 -0
- package/dist/src/cli/page/create.d.ts +41 -0
- package/dist/src/cli/page/create.js +56 -0
- package/dist/src/cli/page/delete.d.ts +7 -0
- package/dist/src/cli/page/delete.js +37 -0
- package/dist/src/cli/page/edit.d.ts +19 -0
- package/dist/src/cli/page/edit.js +117 -0
- package/dist/src/cli/page/get.d.ts +6 -0
- package/dist/src/cli/page/get.js +16 -0
- package/dist/src/cli/page/index.d.ts +44 -0
- package/dist/src/cli/page/index.js +38 -0
- package/dist/src/cli/page/list.d.ts +4 -0
- package/dist/src/cli/page/list.js +10 -0
- package/dist/src/cli/page/update.d.ts +16 -0
- package/dist/src/cli/page/update.js +48 -0
- package/dist/src/cli/page/view.d.ts +2 -0
- package/dist/src/cli/page/view.js +79 -0
- package/dist/src/cli/post/_flags.d.ts +66 -0
- package/dist/src/cli/post/_flags.js +96 -0
- package/dist/src/cli/post/apply.d.ts +7 -0
- package/dist/src/cli/post/apply.js +70 -0
- package/dist/src/cli/post/create.d.ts +21 -0
- package/dist/src/cli/post/create.js +24 -0
- package/dist/src/cli/post/delete.d.ts +8 -0
- package/dist/src/cli/post/delete.js +21 -0
- package/dist/src/cli/post/edit.d.ts +26 -0
- package/dist/src/cli/post/edit.js +115 -0
- package/dist/src/cli/post/get.d.ts +7 -0
- package/dist/src/cli/post/get.js +15 -0
- package/dist/src/cli/post/index.d.ts +91 -0
- package/dist/src/cli/post/index.js +73 -0
- package/dist/src/cli/post/list.d.ts +10 -0
- package/dist/src/cli/post/list.js +23 -0
- package/dist/src/cli/post/publish.d.ts +7 -0
- package/dist/src/cli/post/publish.js +17 -0
- package/dist/src/cli/post/stage.d.ts +23 -0
- package/dist/src/cli/post/stage.js +55 -0
- package/dist/src/cli/post/unpublish.d.ts +7 -0
- package/dist/src/cli/post/unpublish.js +17 -0
- package/dist/src/cli/post/update.d.ts +23 -0
- package/dist/src/cli/post/update.js +38 -0
- package/dist/src/cli/post/view.d.ts +3 -0
- package/dist/src/cli/post/view.js +150 -0
- package/dist/src/cli/preview/index.d.ts +13 -0
- package/dist/src/cli/preview/index.js +226 -0
- package/dist/src/cli/profile/index.d.ts +14 -0
- package/dist/src/cli/profile/index.js +36 -0
- package/dist/src/cli/profile/ls.d.ts +5 -0
- package/dist/src/cli/profile/ls.js +26 -0
- package/dist/src/cli/profile/mark.d.ts +9 -0
- package/dist/src/cli/profile/mark.js +23 -0
- package/dist/src/cli/profile/rm.d.ts +12 -0
- package/dist/src/cli/profile/rm.js +50 -0
- package/dist/src/cli/profile/show.d.ts +9 -0
- package/dist/src/cli/profile/show.js +40 -0
- package/dist/src/cli/profile/use.d.ts +6 -0
- package/dist/src/cli/profile/use.js +11 -0
- package/dist/src/cli/profile/view.d.ts +8 -0
- package/dist/src/cli/profile/view.js +21 -0
- package/dist/src/cli/project/_flags.d.ts +56 -0
- package/dist/src/cli/project/_flags.js +130 -0
- package/dist/src/cli/project/create.d.ts +17 -0
- package/dist/src/cli/project/create.js +25 -0
- package/dist/src/cli/project/delete.d.ts +8 -0
- package/dist/src/cli/project/delete.js +22 -0
- package/dist/src/cli/project/edit.d.ts +11 -0
- package/dist/src/cli/project/edit.js +61 -0
- package/dist/src/cli/project/get.d.ts +7 -0
- package/dist/src/cli/project/get.js +14 -0
- package/dist/src/cli/project/index.d.ts +43 -0
- package/dist/src/cli/project/index.js +52 -0
- package/dist/src/cli/project/list.d.ts +8 -0
- package/dist/src/cli/project/list.js +19 -0
- package/dist/src/cli/project/update.d.ts +18 -0
- package/dist/src/cli/project/update.js +24 -0
- package/dist/src/cli/project/view-cmd.d.ts +7 -0
- package/dist/src/cli/project/view-cmd.js +15 -0
- package/dist/src/cli/project/view.d.ts +3 -0
- package/dist/src/cli/project/view.js +102 -0
- package/dist/src/cli/render/codehighlight.d.ts +8 -0
- package/dist/src/cli/render/codehighlight.js +264 -0
- package/dist/src/cli/render/envelope.d.ts +7 -0
- package/dist/src/cli/render/envelope.js +23 -0
- package/dist/src/cli/render/frontmatter.d.ts +8 -0
- package/dist/src/cli/render/frontmatter.js +50 -0
- package/dist/src/cli/render/helpers.d.ts +2 -0
- package/dist/src/cli/render/helpers.js +11 -0
- package/dist/src/cli/render/index.d.ts +7 -0
- package/dist/src/cli/render/index.js +10 -0
- package/dist/src/cli/render/lexical/blocks.d.ts +19 -0
- package/dist/src/cli/render/lexical/blocks.js +208 -0
- package/dist/src/cli/render/lexical/code.d.ts +2 -0
- package/dist/src/cli/render/lexical/code.js +22 -0
- package/dist/src/cli/render/lexical/embeds.d.ts +6 -0
- package/dist/src/cli/render/lexical/embeds.js +51 -0
- package/dist/src/cli/render/lexical/index.d.ts +9 -0
- package/dist/src/cli/render/lexical/index.js +25 -0
- package/dist/src/cli/render/lexical/inlines.d.ts +17 -0
- package/dist/src/cli/render/lexical/inlines.js +76 -0
- package/dist/src/cli/render/lexical/parser.d.ts +10 -0
- package/dist/src/cli/render/lexical/parser.js +64 -0
- package/dist/src/cli/render/lexical/walker.d.ts +21 -0
- package/dist/src/cli/render/lexical/walker.js +51 -0
- package/dist/src/cli/render/markdown.d.ts +18 -0
- package/dist/src/cli/render/markdown.js +196 -0
- package/dist/src/cli/render/metadata-block.d.ts +14 -0
- package/dist/src/cli/render/metadata-block.js +50 -0
- package/dist/src/cli/skill/all.d.ts +4 -0
- package/dist/src/cli/skill/all.js +11 -0
- package/dist/src/cli/skill/get.d.ts +6 -0
- package/dist/src/cli/skill/get.js +12 -0
- package/dist/src/cli/skill/index.d.ts +10 -0
- package/dist/src/cli/skill/index.js +34 -0
- package/dist/src/cli/skill/list.d.ts +4 -0
- package/dist/src/cli/skill/list.js +11 -0
- package/dist/src/cli/skill/search.d.ts +6 -0
- package/dist/src/cli/skill/search.js +12 -0
- package/dist/src/cli/skill/views.d.ts +6 -0
- package/dist/src/cli/skill/views.js +90 -0
- package/dist/src/cli/snippet/_flags.d.ts +57 -0
- package/dist/src/cli/snippet/_flags.js +123 -0
- package/dist/src/cli/snippet/_resolve.d.ts +4 -0
- package/dist/src/cli/snippet/_resolve.js +32 -0
- package/dist/src/cli/snippet/_sync.d.ts +5 -0
- package/dist/src/cli/snippet/_sync.js +54 -0
- package/dist/src/cli/snippet/create.d.ts +19 -0
- package/dist/src/cli/snippet/create.js +35 -0
- package/dist/src/cli/snippet/delete.d.ts +8 -0
- package/dist/src/cli/snippet/delete.js +28 -0
- package/dist/src/cli/snippet/edit.d.ts +7 -0
- package/dist/src/cli/snippet/edit.js +29 -0
- package/dist/src/cli/snippet/get.d.ts +6 -0
- package/dist/src/cli/snippet/get.js +12 -0
- package/dist/src/cli/snippet/index.d.ts +43 -0
- package/dist/src/cli/snippet/index.js +58 -0
- package/dist/src/cli/snippet/list.d.ts +9 -0
- package/dist/src/cli/snippet/list.js +20 -0
- package/dist/src/cli/snippet/pull.d.ts +8 -0
- package/dist/src/cli/snippet/pull.js +33 -0
- package/dist/src/cli/snippet/push.d.ts +10 -0
- package/dist/src/cli/snippet/push.js +31 -0
- package/dist/src/cli/snippet/update.d.ts +8 -0
- package/dist/src/cli/snippet/update.js +16 -0
- package/dist/src/cli/topic/create.d.ts +10 -0
- package/dist/src/cli/topic/create.js +24 -0
- package/dist/src/cli/topic/delete.d.ts +7 -0
- package/dist/src/cli/topic/delete.js +37 -0
- package/dist/src/cli/topic/get.d.ts +6 -0
- package/dist/src/cli/topic/get.js +15 -0
- package/dist/src/cli/topic/index.d.ts +20 -0
- package/dist/src/cli/topic/index.js +32 -0
- package/dist/src/cli/topic/list.d.ts +4 -0
- package/dist/src/cli/topic/list.js +10 -0
- package/dist/src/cli/topic/update.d.ts +11 -0
- package/dist/src/cli/topic/update.js +51 -0
- package/dist/src/cli/ui/index.d.ts +24 -0
- package/dist/src/cli/ui/index.js +83 -0
- package/dist/src/cli/update/index.d.ts +10 -0
- package/dist/src/cli/update/index.js +142 -0
- package/dist/src/domain/admin-link.d.ts +12 -0
- package/dist/src/domain/admin-link.js +45 -0
- package/dist/src/domain/content-spec.d.ts +20 -0
- package/dist/src/domain/content-spec.js +78 -0
- package/dist/src/domain/envelope-compat.d.ts +68 -0
- package/dist/src/domain/envelope-compat.js +121 -0
- package/dist/src/domain/envelope.d.ts +34 -0
- package/dist/src/domain/envelope.js +355 -0
- package/dist/src/domain/errors.d.ts +336 -0
- package/dist/src/domain/errors.js +239 -0
- package/dist/src/domain/gate.d.ts +14 -0
- package/dist/src/domain/gate.js +18 -0
- package/dist/src/domain/payload.d.ts +64 -0
- package/dist/src/domain/payload.js +237 -0
- package/dist/src/domain/preflight-guards.d.ts +54 -0
- package/dist/src/domain/preflight-guards.js +130 -0
- package/dist/src/domain/runtime-flags.d.ts +33 -0
- package/dist/src/domain/runtime-flags.js +166 -0
- package/dist/src/domain/schema/api-envelope.d.ts +67 -0
- package/dist/src/domain/schema/api-envelope.js +65 -0
- package/dist/src/domain/schema/category.d.ts +23 -0
- package/dist/src/domain/schema/category.js +19 -0
- package/dist/src/domain/schema/config.d.ts +13 -0
- package/dist/src/domain/schema/config.js +18 -0
- package/dist/src/domain/schema/note.d.ts +76 -0
- package/dist/src/domain/schema/note.js +35 -0
- package/dist/src/domain/schema/page.d.ts +40 -0
- package/dist/src/domain/schema/page.js +22 -0
- package/dist/src/domain/schema/post.d.ts +68 -0
- package/dist/src/domain/schema/post.js +35 -0
- package/dist/src/domain/schema/profile.d.ts +14 -0
- package/dist/src/domain/schema/profile.js +22 -0
- package/dist/src/domain/schema/topic.d.ts +24 -0
- package/dist/src/domain/schema/topic.js +16 -0
- package/dist/src/domain/version.d.ts +15 -0
- package/dist/src/domain/version.js +43 -0
- package/dist/src/index.d.ts +4 -0
- package/dist/src/index.js +8 -0
- package/dist/src/layers/App.d.ts +30 -0
- package/dist/src/layers/App.js +39 -0
- package/dist/src/services/Ai/index.d.ts +13 -0
- package/dist/src/services/Ai/index.js +127 -0
- package/dist/src/services/Ai/overview.d.ts +7 -0
- package/dist/src/services/Ai/overview.js +11 -0
- package/dist/src/services/Ai/resources.d.ts +7 -0
- package/dist/src/services/Ai/resources.js +59 -0
- package/dist/src/services/Ai/shared.d.ts +2 -0
- package/dist/src/services/Ai/shared.js +11 -0
- package/dist/src/services/Ai/tasks.d.ts +8 -0
- package/dist/src/services/Ai/tasks.js +144 -0
- package/dist/src/services/Ai/types.d.ts +130 -0
- package/dist/src/services/Ai/types.js +1 -0
- package/dist/src/services/Api.d.ts +67 -0
- package/dist/src/services/Api.js +348 -0
- package/dist/src/services/Auth.d.ts +101 -0
- package/dist/src/services/Auth.js +402 -0
- package/dist/src/services/Backup.d.ts +8 -0
- package/dist/src/services/Backup.js +4 -0
- package/dist/src/services/Cache.d.ts +8 -0
- package/dist/src/services/Cache.js +4 -0
- package/dist/src/services/Comment.d.ts +48 -0
- package/dist/src/services/Comment.js +102 -0
- package/dist/src/services/Config.d.ts +95 -0
- package/dist/src/services/Config.js +359 -0
- package/dist/src/services/Editor.d.ts +28 -0
- package/dist/src/services/Editor.js +95 -0
- package/dist/src/services/Lexical.d.ts +27 -0
- package/dist/src/services/Lexical.js +56 -0
- package/dist/src/services/Migration.d.ts +31 -0
- package/dist/src/services/Migration.js +177 -0
- package/dist/src/services/Profile.d.ts +29 -0
- package/dist/src/services/Profile.js +115 -0
- package/dist/src/services/Renderer/content.d.ts +16 -0
- package/dist/src/services/Renderer/content.js +110 -0
- package/dist/src/services/Renderer/datetime.d.ts +38 -0
- package/dist/src/services/Renderer/datetime.js +147 -0
- package/dist/src/services/Renderer/errors.d.ts +3 -0
- package/dist/src/services/Renderer/errors.js +59 -0
- package/dist/src/services/Renderer/index.d.ts +13 -0
- package/dist/src/services/Renderer/index.js +11 -0
- package/dist/src/services/Renderer/lists.d.ts +1 -0
- package/dist/src/services/Renderer/lists.js +101 -0
- package/dist/src/services/Renderer/options.d.ts +10 -0
- package/dist/src/services/Renderer/options.js +13 -0
- package/dist/src/services/Renderer/primitives.d.ts +4 -0
- package/dist/src/services/Renderer/primitives.js +12 -0
- package/dist/src/services/Renderer/service.d.ts +35 -0
- package/dist/src/services/Renderer/service.js +123 -0
- package/dist/src/services/Renderer/view.d.ts +16 -0
- package/dist/src/services/Renderer/view.js +1 -0
- package/dist/src/services/Resolver.d.ts +47 -0
- package/dist/src/services/Resolver.js +269 -0
- package/dist/src/services/Skill.d.ts +29 -0
- package/dist/src/services/Skill.js +421 -0
- package/dist/src/services/UpdateNotifier.d.ts +162 -0
- package/dist/src/services/UpdateNotifier.js +572 -0
- package/dist/test/cli/ai/ai.test.d.ts +1 -0
- package/dist/test/cli/ai/ai.test.js +507 -0
- package/dist/test/cli/ai/verbs.test.d.ts +1 -0
- package/dist/test/cli/ai/verbs.test.js +235 -0
- package/dist/test/cli/auth/login.test.d.ts +1 -0
- package/dist/test/cli/auth/login.test.js +236 -0
- package/dist/test/cli/auth/logout-whoami.test.d.ts +1 -0
- package/dist/test/cli/auth/logout-whoami.test.js +124 -0
- package/dist/test/cli/auth/status.test.d.ts +1 -0
- package/dist/test/cli/auth/status.test.js +90 -0
- package/dist/test/cli/category/category.test.d.ts +1 -0
- package/dist/test/cli/category/category.test.js +175 -0
- package/dist/test/cli/comment/comment.test.d.ts +1 -0
- package/dist/test/cli/comment/comment.test.js +445 -0
- package/dist/test/cli/config/config.test.d.ts +1 -0
- package/dist/test/cli/config/config.test.js +281 -0
- package/dist/test/cli/edit-roundtrip.test.d.ts +1 -0
- package/dist/test/cli/edit-roundtrip.test.js +259 -0
- package/dist/test/cli/file/file.test.d.ts +1 -0
- package/dist/test/cli/file/file.test.js +185 -0
- package/dist/test/cli/help.test.d.ts +1 -0
- package/dist/test/cli/help.test.js +289 -0
- package/dist/test/cli/note/create.test.d.ts +1 -0
- package/dist/test/cli/note/create.test.js +155 -0
- package/dist/test/cli/note/list.test.d.ts +1 -0
- package/dist/test/cli/note/list.test.js +115 -0
- package/dist/test/cli/note/publish.test.d.ts +1 -0
- package/dist/test/cli/note/publish.test.js +123 -0
- package/dist/test/cli/page/page.test.d.ts +1 -0
- package/dist/test/cli/page/page.test.js +185 -0
- package/dist/test/cli/post/create.test.d.ts +1 -0
- package/dist/test/cli/post/create.test.js +172 -0
- package/dist/test/cli/post/list.test.d.ts +1 -0
- package/dist/test/cli/post/list.test.js +133 -0
- package/dist/test/cli/post/publish.test.d.ts +1 -0
- package/dist/test/cli/post/publish.test.js +139 -0
- package/dist/test/cli/post/stage-apply.test.d.ts +1 -0
- package/dist/test/cli/post/stage-apply.test.js +215 -0
- package/dist/test/cli/post/update.test.d.ts +1 -0
- package/dist/test/cli/post/update.test.js +160 -0
- package/dist/test/cli/post-note-crud.test.d.ts +1 -0
- package/dist/test/cli/post-note-crud.test.js +362 -0
- package/dist/test/cli/profile/ls.test.d.ts +1 -0
- package/dist/test/cli/profile/ls.test.js +93 -0
- package/dist/test/cli/profile/mark-use.test.d.ts +1 -0
- package/dist/test/cli/profile/mark-use.test.js +216 -0
- package/dist/test/cli/project-crud.test.d.ts +1 -0
- package/dist/test/cli/project-crud.test.js +315 -0
- package/dist/test/cli/render/lexical.test.d.ts +1 -0
- package/dist/test/cli/render/lexical.test.js +216 -0
- package/dist/test/cli/render/markdown.test.d.ts +1 -0
- package/dist/test/cli/render/markdown.test.js +39 -0
- package/dist/test/cli/snippet-crud.test.d.ts +1 -0
- package/dist/test/cli/snippet-crud.test.js +293 -0
- package/dist/test/cli/topic/topic.test.d.ts +1 -0
- package/dist/test/cli/topic/topic.test.js +181 -0
- package/dist/test/cli/update.test.d.ts +1 -0
- package/dist/test/cli/update.test.js +395 -0
- package/dist/test/domain/content-spec.test.d.ts +1 -0
- package/dist/test/domain/content-spec.test.js +126 -0
- package/dist/test/domain/envelope-compat.test.d.ts +1 -0
- package/dist/test/domain/envelope-compat.test.js +126 -0
- package/dist/test/domain/envelope.test.d.ts +1 -0
- package/dist/test/domain/envelope.test.js +149 -0
- package/dist/test/domain/errors.test.d.ts +1 -0
- package/dist/test/domain/errors.test.js +127 -0
- package/dist/test/domain/gate.test.d.ts +1 -0
- package/dist/test/domain/gate.test.js +128 -0
- package/dist/test/domain/payload.test.d.ts +1 -0
- package/dist/test/domain/payload.test.js +259 -0
- package/dist/test/helper/test-fs.d.ts +24 -0
- package/dist/test/helper/test-fs.js +161 -0
- package/dist/test/helper/test-http.d.ts +31 -0
- package/dist/test/helper/test-http.js +66 -0
- package/dist/test/integration/_helpers.d.ts +5 -0
- package/dist/test/integration/_helpers.js +24 -0
- package/dist/test/integration/cli-error-envelope.test.d.ts +1 -0
- package/dist/test/integration/cli-error-envelope.test.js +137 -0
- package/dist/test/integration/cli-help-render.test.d.ts +1 -0
- package/dist/test/integration/cli-help-render.test.js +149 -0
- package/dist/test/integration/cli-help.test.d.ts +1 -0
- package/dist/test/integration/cli-help.test.js +67 -0
- package/dist/test/integration/cli-post-list.test.d.ts +1 -0
- package/dist/test/integration/cli-post-list.test.js +140 -0
- package/dist/test/integration/cli-skill.test.d.ts +1 -0
- package/dist/test/integration/cli-skill.test.js +74 -0
- package/dist/test/integration/cli-version.test.d.ts +1 -0
- package/dist/test/integration/cli-version.test.js +37 -0
- package/dist/test/services/Api.test.d.ts +1 -0
- package/dist/test/services/Api.test.js +553 -0
- package/dist/test/services/Auth.test.d.ts +1 -0
- package/dist/test/services/Auth.test.js +650 -0
- package/dist/test/services/Config.test.d.ts +1 -0
- package/dist/test/services/Config.test.js +510 -0
- package/dist/test/services/Datetime.test.d.ts +1 -0
- package/dist/test/services/Datetime.test.js +113 -0
- package/dist/test/services/Editor.test.d.ts +1 -0
- package/dist/test/services/Editor.test.js +205 -0
- package/dist/test/services/Lexical.errors.test.d.ts +1 -0
- package/dist/test/services/Lexical.errors.test.js +60 -0
- package/dist/test/services/Lexical.test.d.ts +1 -0
- package/dist/test/services/Lexical.test.js +68 -0
- package/dist/test/services/Migration.test.d.ts +1 -0
- package/dist/test/services/Migration.test.js +376 -0
- package/dist/test/services/Profile.test.d.ts +1 -0
- package/dist/test/services/Profile.test.js +277 -0
- package/dist/test/services/Renderer.test.d.ts +1 -0
- package/dist/test/services/Renderer.test.js +538 -0
- package/dist/test/services/Resolver.test.d.ts +1 -0
- package/dist/test/services/Resolver.test.js +320 -0
- package/dist/test/services/Skill.test.d.ts +1 -0
- package/dist/test/services/Skill.test.js +261 -0
- package/dist/test/services/UpdateNotifier.spawn.test.d.ts +1 -0
- package/dist/test/services/UpdateNotifier.spawn.test.js +73 -0
- package/dist/test/services/UpdateNotifier.test.d.ts +1 -0
- package/dist/test/services/UpdateNotifier.test.js +912 -0
- package/dist/vendor/litexml/cli.mjs +19 -4
- package/dist/vendor/litexml/litexml-html-preview-client.css +98 -13
- package/dist/vendor/litexml/litexml-html-preview-client.js +5794 -4976
- package/dist/vendor/litexml/style.css +5 -5
- package/package.json +29 -26
- package/skills/safety.md +1 -1
- package/LICENSE +0 -33
- package/dist/esm-CDcJmHkG.mjs +0 -2
|
@@ -26,7 +26,7 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
26
26
|
}
|
|
27
27
|
return to;
|
|
28
28
|
};
|
|
29
|
-
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
|
|
29
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule || !__hasOwnProp.call(mod, "default") ? __defProp(target, "default", {
|
|
30
30
|
value: mod,
|
|
31
31
|
enumerable: true
|
|
32
32
|
}) : target, mod));
|
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { createRequire } from 'node:module';
|
|
3
|
+
import { Command } from '@effect/cli';
|
|
4
|
+
import { NodeContext, NodeHttpClient, NodeRuntime } from '@effect/platform-node';
|
|
5
|
+
import { Effect, Layer } from 'effect';
|
|
6
|
+
import { aiCmd } from '../cli/ai';
|
|
7
|
+
import { authCmd } from '../cli/auth';
|
|
8
|
+
import { categoryCmd } from '../cli/category';
|
|
9
|
+
import { commentCmd } from '../cli/comment';
|
|
10
|
+
import { configCmd } from '../cli/config';
|
|
11
|
+
import { draftCmd } from '../cli/draft';
|
|
12
|
+
import { fileCmd } from '../cli/file';
|
|
13
|
+
import { buildRootHelpData, emitGroupHelp, emitHelp, groupHelpDataFor, isGroupName, } from '../cli/help';
|
|
14
|
+
import { noteCmd } from '../cli/note';
|
|
15
|
+
import { pageCmd } from '../cli/page';
|
|
16
|
+
import { postCmd } from '../cli/post';
|
|
17
|
+
import { previewCmd } from '../cli/preview';
|
|
18
|
+
import { profileCmd } from '../cli/profile';
|
|
19
|
+
import { projectCmd } from '../cli/project';
|
|
20
|
+
import { skillCmd } from '../cli/skill';
|
|
21
|
+
import { snippetCmd } from '../cli/snippet';
|
|
22
|
+
import { topicCmd } from '../cli/topic';
|
|
23
|
+
import { updateCmd } from '../cli/update';
|
|
24
|
+
import { exitCodeForTag, Generic, ProfileInvalidName, ProfileNoneActive, tagToCode, } from '../domain/errors';
|
|
25
|
+
import { detectInvokedCommand, requiresActiveProfile, } from '../domain/preflight-guards';
|
|
26
|
+
import { currentDryRun, currentProfileFlag, parseGlobalFlags, } from '../domain/runtime-flags';
|
|
27
|
+
import { AppLayer } from '../layers/App';
|
|
28
|
+
import { Ai } from '../services/Ai';
|
|
29
|
+
import { Api } from '../services/Api';
|
|
30
|
+
import { Comment } from '../services/Comment';
|
|
31
|
+
import { LOCAL_DEV_ENV, LOCAL_DEV_PROFILE_NAME, shouldUseLocalDev, } from '../services/Config';
|
|
32
|
+
import { Migration } from '../services/Migration';
|
|
33
|
+
import { Profile } from '../services/Profile';
|
|
34
|
+
import { currentOutputOptions, Renderer } from '../services/Renderer';
|
|
35
|
+
import { Resolver } from '../services/Resolver';
|
|
36
|
+
import { make as makeUpdater } from '../services/UpdateNotifier';
|
|
37
|
+
// ---------------------------------------------------------------------------
|
|
38
|
+
// Package version (read once at module load via createRequire).
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
//
|
|
41
|
+
// `import.meta.url` resolves to one of:
|
|
42
|
+
// - `<root>/packages/cli/src/bin/mxs.ts` (tsx, dev — 2 levels up)
|
|
43
|
+
// - `<root>/packages/cli/dist/mxs.mjs` (tsdown bundle — 1 level up)
|
|
44
|
+
// - `<root>/packages/cli/dist/bin/mxs.mjs` (tsdown re-export shim — 2 up)
|
|
45
|
+
//
|
|
46
|
+
// To avoid hard-coding a fixed depth, walk up until we find a `package.json`
|
|
47
|
+
// whose `name` is `@mx-space/cli`.
|
|
48
|
+
const requireFrom = createRequire(import.meta.url);
|
|
49
|
+
const resolveCliVersion = () => {
|
|
50
|
+
const candidates = [
|
|
51
|
+
'../package.json',
|
|
52
|
+
'../../package.json',
|
|
53
|
+
'../../../package.json',
|
|
54
|
+
];
|
|
55
|
+
for (const candidate of candidates) {
|
|
56
|
+
try {
|
|
57
|
+
const pkg = requireFrom(candidate);
|
|
58
|
+
if (pkg.name === '@mx-space/cli' && typeof pkg.version === 'string') {
|
|
59
|
+
return pkg.version;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
// try next candidate
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return '0.0.0-unknown';
|
|
67
|
+
};
|
|
68
|
+
const CLI_VERSION = resolveCliVersion();
|
|
69
|
+
// Force stdout/stderr into blocking mode on POSIX pipes so writes drain
|
|
70
|
+
// before `process.exit()` returns. Without this, output produced just before
|
|
71
|
+
// exit (help text, JSON envelopes, error frames) is silently dropped under
|
|
72
|
+
// pipe pressure — observable as empty-stdout flake when the CLI is spawned
|
|
73
|
+
// from another process (e2e harness, scripts, CI).
|
|
74
|
+
for (const stream of [process.stdout, process.stderr]) {
|
|
75
|
+
const handle = stream._handle;
|
|
76
|
+
if (handle && typeof handle.setBlocking === 'function') {
|
|
77
|
+
handle.setBlocking(true);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// Mirror the v0.2.x convenience: when running this file directly from source,
|
|
81
|
+
// enable the local-dev default profile so the bare `mxs ...` invocation does
|
|
82
|
+
// not require explicit configuration.
|
|
83
|
+
if (import.meta.url.endsWith('/src/bin/mxs.ts')) {
|
|
84
|
+
process.env[LOCAL_DEV_ENV] ??= '1';
|
|
85
|
+
}
|
|
86
|
+
// ---------------------------------------------------------------------------
|
|
87
|
+
// Root command (subcommands only — global flags are pre-parsed before
|
|
88
|
+
// `@effect/cli` ever sees argv, so they don't need to be declared here).
|
|
89
|
+
// ---------------------------------------------------------------------------
|
|
90
|
+
const rootCmd = Command.make('mxs', {}, () => Effect.flatMap(Renderer, (r) => r.emitInfo('mxs: mx-space CLI — see `mxs --help` for the command list, or `mxs <command> --help` for details.'))).pipe(Command.withDescription('mx-space CLI — manage your mx-core blog from the command line.'), Command.withSubcommands([
|
|
91
|
+
authCmd,
|
|
92
|
+
profileCmd,
|
|
93
|
+
postCmd,
|
|
94
|
+
noteCmd,
|
|
95
|
+
pageCmd,
|
|
96
|
+
draftCmd,
|
|
97
|
+
projectCmd,
|
|
98
|
+
categoryCmd,
|
|
99
|
+
topicCmd,
|
|
100
|
+
commentCmd,
|
|
101
|
+
snippetCmd,
|
|
102
|
+
aiCmd,
|
|
103
|
+
configCmd,
|
|
104
|
+
fileCmd,
|
|
105
|
+
skillCmd,
|
|
106
|
+
previewCmd,
|
|
107
|
+
updateCmd,
|
|
108
|
+
]));
|
|
109
|
+
// ---------------------------------------------------------------------------
|
|
110
|
+
// Preflight: profile-name validation, legacy migration, active-profile guard,
|
|
111
|
+
// fire-and-forget passive update notifier.
|
|
112
|
+
// ---------------------------------------------------------------------------
|
|
113
|
+
const preflight = (flags) => Effect.gen(function* () {
|
|
114
|
+
const profile = yield* Profile;
|
|
115
|
+
const migration = yield* Migration;
|
|
116
|
+
const updater = yield* Effect.sync(() => makeUpdater({
|
|
117
|
+
emitInfo: flags.quiet ? () => undefined : undefined,
|
|
118
|
+
}));
|
|
119
|
+
// 1. Validate --profile name (mirrors legacy try { validateProfileName }).
|
|
120
|
+
if (flags.profile) {
|
|
121
|
+
yield* profile.validateName(flags.profile).pipe(Effect.catchTag('ProfileInvalidName', (e) => Effect.fail(new ProfileInvalidName({
|
|
122
|
+
name: e.name,
|
|
123
|
+
message: e.message,
|
|
124
|
+
hint: 'profile name must match ^[a-z0-9_-]{1,32}$ and must not be "current"',
|
|
125
|
+
}))));
|
|
126
|
+
}
|
|
127
|
+
// 2. Run legacy migration if needed; stream status to stderr unless quiet.
|
|
128
|
+
yield* migration
|
|
129
|
+
.runLegacyMigrationIfNeeded({
|
|
130
|
+
report: flags.quiet ? null : undefined,
|
|
131
|
+
})
|
|
132
|
+
.pipe(Effect.catchAll((err) => Effect.fail(new Generic({
|
|
133
|
+
message: err.message ?? 'legacy migration failed',
|
|
134
|
+
cause: err,
|
|
135
|
+
}))));
|
|
136
|
+
// 3. Guard: throw profile.none_active if no profile is resolvable AND the
|
|
137
|
+
// active subcommand is not exempt.
|
|
138
|
+
const invoked = detectInvokedCommand(process.argv);
|
|
139
|
+
const currentProfile = yield* profile.current.pipe(Effect.catchAll(() => Effect.succeed(null)));
|
|
140
|
+
const effectiveCurrentProfile = currentProfile ||
|
|
141
|
+
(shouldUseLocalDev({
|
|
142
|
+
profileOverride: flags.profile,
|
|
143
|
+
envProfile: process.env.MXS_PROFILE,
|
|
144
|
+
apiUrlOverride: flags.apiUrl,
|
|
145
|
+
envApiUrl: process.env.MXS_API_URL,
|
|
146
|
+
currentProfile,
|
|
147
|
+
})
|
|
148
|
+
? LOCAL_DEV_PROFILE_NAME
|
|
149
|
+
: null);
|
|
150
|
+
if (requiresActiveProfile({
|
|
151
|
+
profileFlag: flags.profile,
|
|
152
|
+
apiUrlFlag: flags.apiUrl,
|
|
153
|
+
envProfile: process.env.MXS_PROFILE?.trim(),
|
|
154
|
+
envApiUrl: process.env.MXS_API_URL?.trim(),
|
|
155
|
+
currentProfile: effectiveCurrentProfile,
|
|
156
|
+
parentName: invoked.parentName,
|
|
157
|
+
commandName: invoked.commandName,
|
|
158
|
+
})) {
|
|
159
|
+
return yield* Effect.fail(new ProfileNoneActive({
|
|
160
|
+
message: 'no active mxs profile',
|
|
161
|
+
hint: 'run `mxs profile use <name>` to switch, or `mxs auth login --profile <name>` to create one',
|
|
162
|
+
}));
|
|
163
|
+
}
|
|
164
|
+
// 4. Fire-and-forget passive update notifier (no fiber leak — the bin's
|
|
165
|
+
// runMain awaits all daemon fibers before exit).
|
|
166
|
+
yield* Effect.forkDaemon(updater.maybeNotify({
|
|
167
|
+
currentVersion: CLI_VERSION,
|
|
168
|
+
quiet: flags.quiet,
|
|
169
|
+
json: flags.json,
|
|
170
|
+
output: flags.output,
|
|
171
|
+
commandName: invoked.commandName,
|
|
172
|
+
parentName: invoked.parentName,
|
|
173
|
+
}));
|
|
174
|
+
});
|
|
175
|
+
// Top-level commands that are leafs (have their own handler) rather than
|
|
176
|
+
// subcommand groups. Bare `mxs <leaf>` MUST execute the handler — only
|
|
177
|
+
// `mxs <leaf> --help` should render our custom group/leaf help page.
|
|
178
|
+
const LEAF_COMMANDS = new Set(['update', 'skill', 'preview']);
|
|
179
|
+
const detectHelpTarget = (rest) => {
|
|
180
|
+
// `rest` includes argv[0] (node) and argv[1] (script).
|
|
181
|
+
const args = rest.slice(2);
|
|
182
|
+
if (args.length === 0)
|
|
183
|
+
return { kind: 'root' };
|
|
184
|
+
const first = args[0];
|
|
185
|
+
if (args.length === 1 && (first === '--help' || first === '-h')) {
|
|
186
|
+
return { kind: 'root' };
|
|
187
|
+
}
|
|
188
|
+
// Bare `mxs <group>` (no flags, no verb) → group help. Groups have no
|
|
189
|
+
// default executable; @effect/cli would print its default help anyway.
|
|
190
|
+
// Leafs like `update` carry a real handler and must NOT be intercepted.
|
|
191
|
+
if (args.length === 1 && isGroupName(first) && !LEAF_COMMANDS.has(first)) {
|
|
192
|
+
return { kind: 'group', name: first };
|
|
193
|
+
}
|
|
194
|
+
// Explicit `--help` / `-h` on any top-level command (group OR leaf) → our
|
|
195
|
+
// custom help.
|
|
196
|
+
if (args.length === 2 &&
|
|
197
|
+
isGroupName(first) &&
|
|
198
|
+
(args[1] === '--help' || args[1] === '-h')) {
|
|
199
|
+
return { kind: 'group', name: first };
|
|
200
|
+
}
|
|
201
|
+
return { kind: 'none' };
|
|
202
|
+
};
|
|
203
|
+
export const run = (argv) => {
|
|
204
|
+
const parsed = parseGlobalFlags(argv);
|
|
205
|
+
const flags = parsed.flags;
|
|
206
|
+
// Intercept root- and group-level help BEFORE building any layers or
|
|
207
|
+
// invoking `@effect/cli`. This sidesteps the broken layout produced by the
|
|
208
|
+
// default renderer at both depths (see `src/cli/help.ts`).
|
|
209
|
+
const helpTarget = detectHelpTarget(parsed.rest);
|
|
210
|
+
if (helpTarget.kind === 'root') {
|
|
211
|
+
emitHelp(buildRootHelpData(CLI_VERSION));
|
|
212
|
+
return Promise.resolve();
|
|
213
|
+
}
|
|
214
|
+
if (helpTarget.kind === 'group') {
|
|
215
|
+
emitGroupHelp(groupHelpDataFor(helpTarget.name, CLI_VERSION));
|
|
216
|
+
return Promise.resolve();
|
|
217
|
+
}
|
|
218
|
+
// The HttpClient layer used by Api + Auth. NodeContext.layer brings FS,
|
|
219
|
+
// Path, Terminal, CommandExecutor but NOT HttpClient — that's a separate
|
|
220
|
+
// export.
|
|
221
|
+
const httpLayer = NodeHttpClient.layer;
|
|
222
|
+
// Build the flag-aware Api layer. Resolver depends on Api, so we provide
|
|
223
|
+
// its dependencies first and let `Layer.provide` resolve the rest.
|
|
224
|
+
const apiLayer = Api.layer({
|
|
225
|
+
overrides: {
|
|
226
|
+
apiUrl: flags.apiUrl,
|
|
227
|
+
token: flags.token,
|
|
228
|
+
apiKey: flags.apiKey,
|
|
229
|
+
profile: flags.profile,
|
|
230
|
+
},
|
|
231
|
+
verbose: flags.verbose,
|
|
232
|
+
quiet: flags.quiet,
|
|
233
|
+
dryRun: flags.dryRun,
|
|
234
|
+
lang: flags.lang,
|
|
235
|
+
});
|
|
236
|
+
// Layer composition. `AppLayer` requires platform services (FileSystem,
|
|
237
|
+
// Path, HttpClient). `Layer.mergeAll` does not internally wire deps so we
|
|
238
|
+
// use `Layer.provideMerge` to thread HttpClient into AppLayer while
|
|
239
|
+
// re-exporting both. The result still requires FileSystem + Path, which
|
|
240
|
+
// come from `NodeContext.layer` at the outer `Effect.provide` site.
|
|
241
|
+
const appWithHttp = AppLayer.pipe(Layer.provideMerge(httpLayer));
|
|
242
|
+
const apiWithDeps = apiLayer.pipe(Layer.provideMerge(appWithHttp));
|
|
243
|
+
const commentWithDeps = Comment.Default.pipe(Layer.provideMerge(apiWithDeps));
|
|
244
|
+
const resolverWithDeps = Resolver.Default.pipe(Layer.provideMerge(commentWithDeps));
|
|
245
|
+
const aiWithDeps = Ai.Default.pipe(Layer.provideMerge(resolverWithDeps));
|
|
246
|
+
const fullAppLayer = aiWithDeps;
|
|
247
|
+
const cli = Command.run(rootCmd, { name: 'mxs', version: CLI_VERSION });
|
|
248
|
+
// Tagged-error rendering + exit-code mapping happen INSIDE the FiberRef
|
|
249
|
+
// scopes so the Renderer sees the parsed `--json` / `--output` settings.
|
|
250
|
+
const core = preflight(flags).pipe(Effect.zipRight(cli(parsed.rest)), Effect.tapError((err) => isCliError(err)
|
|
251
|
+
? Effect.flatMap(Renderer, (r) => r.emitError(err))
|
|
252
|
+
: Effect.sync(() => undefined)), Effect.catchAll((err) => Effect.sync(() => {
|
|
253
|
+
const tag = isCliError(err) ? err._tag : 'Generic';
|
|
254
|
+
process.exit(exitCodeForTag(tag));
|
|
255
|
+
})));
|
|
256
|
+
const program = Effect.locally(Effect.locally(Effect.locally(core, currentOutputOptions, {
|
|
257
|
+
json: flags.json,
|
|
258
|
+
output: flags.output,
|
|
259
|
+
quiet: flags.quiet,
|
|
260
|
+
verbose: flags.verbose,
|
|
261
|
+
}), currentDryRun, flags.dryRun), currentProfileFlag, flags.profile?.trim() || undefined);
|
|
262
|
+
// Defects bypass the Effect error channel; surface them generically.
|
|
263
|
+
const finalized = program.pipe(Effect.catchAllDefect((defect) => Effect.sync(() => {
|
|
264
|
+
process.stderr.write(`mxs: internal error\n${String(defect)}\n`);
|
|
265
|
+
process.exit(1);
|
|
266
|
+
})), Effect.provide(fullAppLayer), Effect.provide(NodeContext.layer));
|
|
267
|
+
return NodeRuntime.runMain(finalized);
|
|
268
|
+
};
|
|
269
|
+
// ---------------------------------------------------------------------------
|
|
270
|
+
// Helpers
|
|
271
|
+
// ---------------------------------------------------------------------------
|
|
272
|
+
const isCliError = (err) => {
|
|
273
|
+
if (typeof err !== 'object' || err === null)
|
|
274
|
+
return false;
|
|
275
|
+
if (!('_tag' in err))
|
|
276
|
+
return false;
|
|
277
|
+
const tag = err._tag;
|
|
278
|
+
return typeof tag === 'string' && tag in tagToCode;
|
|
279
|
+
};
|
|
280
|
+
// ---------------------------------------------------------------------------
|
|
281
|
+
// Auto-run when executed as the program entry-point.
|
|
282
|
+
//
|
|
283
|
+
// `import.meta.url` ends in either `src/bin/mxs.ts` (tsx, dev) or
|
|
284
|
+
// `dist/mxs.mjs` (built bundle); both invoke `run(process.argv)`. When the
|
|
285
|
+
// module is imported (tests, library use), `run` is not invoked.
|
|
286
|
+
// ---------------------------------------------------------------------------
|
|
287
|
+
const isDirectInvocation = () => {
|
|
288
|
+
const url = import.meta.url;
|
|
289
|
+
// Direct dev/source invocation (`tsx src/bin/mxs.ts`) or the legacy
|
|
290
|
+
// CommonJS shim (`bin/mxs.cjs`).
|
|
291
|
+
if (/\/bin\/mxs\.(?:ts|cjs)$/.test(url))
|
|
292
|
+
return true;
|
|
293
|
+
// Bundled invocation: tsdown emits a re-export shim at `dist/bin/mxs.mjs`
|
|
294
|
+
// that pulls in the bundled core (`dist/mxs-<hash>.mjs`). Match either.
|
|
295
|
+
if (/\/dist\/bin\/mxs\.mjs$/.test(url))
|
|
296
|
+
return true;
|
|
297
|
+
if (/\/dist\/mxs(?:-[^/]*)?\.mjs$/.test(url))
|
|
298
|
+
return true;
|
|
299
|
+
// Fallback: process.argv[1]'s basename matches the module url's basename.
|
|
300
|
+
if (process.argv[1]) {
|
|
301
|
+
const argvBase = process.argv[1].split('/').pop() ?? '';
|
|
302
|
+
const urlBase = url.split('/').pop() ?? '';
|
|
303
|
+
if (argvBase === urlBase)
|
|
304
|
+
return true;
|
|
305
|
+
}
|
|
306
|
+
return false;
|
|
307
|
+
};
|
|
308
|
+
if (isDirectInvocation()) {
|
|
309
|
+
void run(process.argv);
|
|
310
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Effect } from 'effect';
|
|
2
|
+
import type { AiTaskFailed } from '../../domain/errors';
|
|
3
|
+
import { type AiService, type AiTaskCreateResult, type AiTaskFinalView, type AiTaskType } from '../../services/Ai';
|
|
4
|
+
import type { ApiError } from '../../services/Api';
|
|
5
|
+
import { Renderer, type RendererService } from '../../services/Renderer';
|
|
6
|
+
/**
|
|
7
|
+
* Drive a freshly-created task to a terminal state, emitting progress to
|
|
8
|
+
* stderr via the renderer. With `noWait`, returns a synthetic pending view.
|
|
9
|
+
*/
|
|
10
|
+
export declare const followTask: (ai: AiService, renderer: RendererService, created: AiTaskCreateResult, noWait: boolean) => Effect.Effect<AiTaskFinalView, AiTaskFailed | ApiError>;
|
|
11
|
+
export type { AiTaskType };
|
|
12
|
+
export { Renderer };
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { Effect } from 'effect';
|
|
2
|
+
import { Renderer } from '../../services/Renderer';
|
|
3
|
+
const synthesizePending = (created) => ({
|
|
4
|
+
type: created.type,
|
|
5
|
+
taskId: created.taskId,
|
|
6
|
+
status: 'pending',
|
|
7
|
+
refId: created.refId,
|
|
8
|
+
targetLanguages: created.targetLanguages,
|
|
9
|
+
});
|
|
10
|
+
/**
|
|
11
|
+
* Drive a freshly-created task to a terminal state, emitting progress to
|
|
12
|
+
* stderr via the renderer. With `noWait`, returns a synthetic pending view.
|
|
13
|
+
*/
|
|
14
|
+
export const followTask = (ai, renderer, created, noWait) => Effect.gen(function* () {
|
|
15
|
+
if (!created.created) {
|
|
16
|
+
yield* renderer.emitInfo(`[ai] joining existing task taskId=${created.taskId}`);
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
yield* renderer.emitInfo(`[ai] task pending… taskId=${created.taskId}`);
|
|
20
|
+
}
|
|
21
|
+
if (noWait)
|
|
22
|
+
return synthesizePending(created);
|
|
23
|
+
const final = yield* ai.waitForTask(created.taskId, {
|
|
24
|
+
type: created.type,
|
|
25
|
+
onProgress: (msg) => {
|
|
26
|
+
// Fire-and-forget; stderr write is sync.
|
|
27
|
+
// We intentionally don't await the Effect — onProgress runs inside
|
|
28
|
+
// the polling loop and must stay sync.
|
|
29
|
+
process.stderr.write(`${msg}\n`);
|
|
30
|
+
},
|
|
31
|
+
});
|
|
32
|
+
return {
|
|
33
|
+
...final,
|
|
34
|
+
refId: final.refId ?? created.refId,
|
|
35
|
+
targetLanguages: final.targetLanguages ?? created.targetLanguages,
|
|
36
|
+
};
|
|
37
|
+
});
|
|
38
|
+
export { Renderer };
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Effect } from 'effect';
|
|
2
|
+
import { ResourceNotFound } from '../../domain/errors';
|
|
3
|
+
import { type ResolverService } from '../../services/Resolver';
|
|
4
|
+
/**
|
|
5
|
+
* Resolve an article reference (snowflake id, slug, or title) to a Snowflake.
|
|
6
|
+
* Tries post first, then note. AI generation has no page surface.
|
|
7
|
+
*/
|
|
8
|
+
export declare const resolveArticleId: (resolver: ResolverService, ref: string) => Effect.Effect<string, ResourceNotFound>;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Effect } from 'effect';
|
|
2
|
+
import { ResourceNotFound } from '../../domain/errors';
|
|
3
|
+
import { isSnowflakeId } from '../../services/Resolver';
|
|
4
|
+
/**
|
|
5
|
+
* Resolve an article reference (snowflake id, slug, or title) to a Snowflake.
|
|
6
|
+
* Tries post first, then note. AI generation has no page surface.
|
|
7
|
+
*/
|
|
8
|
+
export const resolveArticleId = (resolver, ref) => Effect.gen(function* () {
|
|
9
|
+
if (isSnowflakeId(ref))
|
|
10
|
+
return ref;
|
|
11
|
+
const asPost = yield* resolver
|
|
12
|
+
.resolvePostId(ref)
|
|
13
|
+
.pipe(Effect.catchAll(() => Effect.succeed(null)));
|
|
14
|
+
if (asPost)
|
|
15
|
+
return asPost;
|
|
16
|
+
const asNote = yield* resolver
|
|
17
|
+
.resolveNoteId(ref)
|
|
18
|
+
.pipe(Effect.catchAll(() => Effect.succeed(null)));
|
|
19
|
+
if (asNote)
|
|
20
|
+
return asNote;
|
|
21
|
+
return yield* Effect.fail(new ResourceNotFound({
|
|
22
|
+
message: `article not found: ${ref}`,
|
|
23
|
+
kind: 'article',
|
|
24
|
+
ref,
|
|
25
|
+
hint: 'pass a snowflake id, a post slug, or a numeric note nid',
|
|
26
|
+
}));
|
|
27
|
+
});
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { Command } from '@effect/cli';
|
|
2
|
+
export declare const aiCmd: Command.Command<"ai", import("../../services/Ai").Ai | import("./_poll").Renderer | import("../../services/Resolver").Resolver | import("../../services/Editor").Editor, import("../../domain/errors").ValidationJson | import("../../domain/errors").AiTaskCreateFailed | import("../../domain/errors").AiTaskFailed | import("../../domain/errors").AiRecordNotFound | import("../../services/Api").ApiError, {
|
|
3
|
+
readonly subcommand: import("effect/Option").Option<{
|
|
4
|
+
readonly subcommand: import("effect/Option").Option<{
|
|
5
|
+
readonly id: string;
|
|
6
|
+
readonly lang: import("effect/Option").Option<string>;
|
|
7
|
+
readonly onlyDb: boolean;
|
|
8
|
+
} | {
|
|
9
|
+
readonly recordId: string;
|
|
10
|
+
readonly force: boolean;
|
|
11
|
+
} | {
|
|
12
|
+
readonly recordId: string;
|
|
13
|
+
} | {
|
|
14
|
+
readonly recordId: string;
|
|
15
|
+
} | {
|
|
16
|
+
readonly page: import("effect/Option").Option<number>;
|
|
17
|
+
readonly size: import("effect/Option").Option<number>;
|
|
18
|
+
readonly grouped: boolean;
|
|
19
|
+
readonly search: import("effect/Option").Option<string>;
|
|
20
|
+
} | {
|
|
21
|
+
readonly id: string;
|
|
22
|
+
readonly to: string[];
|
|
23
|
+
readonly force: boolean;
|
|
24
|
+
readonly noWait: boolean;
|
|
25
|
+
} | {
|
|
26
|
+
readonly id: string;
|
|
27
|
+
readonly to: string;
|
|
28
|
+
readonly force: boolean;
|
|
29
|
+
readonly noWait: boolean;
|
|
30
|
+
}>;
|
|
31
|
+
} | {
|
|
32
|
+
readonly subcommand: import("effect/Option").Option<{
|
|
33
|
+
readonly id: string;
|
|
34
|
+
} | {
|
|
35
|
+
readonly page: import("effect/Option").Option<number>;
|
|
36
|
+
readonly size: import("effect/Option").Option<number>;
|
|
37
|
+
readonly search: import("effect/Option").Option<string>;
|
|
38
|
+
readonly type: import("effect/Option").Option<"post" | "note" | "page">;
|
|
39
|
+
}>;
|
|
40
|
+
} | {
|
|
41
|
+
readonly subcommand: import("effect/Option").Option<{
|
|
42
|
+
readonly id: string;
|
|
43
|
+
readonly lang: import("effect/Option").Option<string>;
|
|
44
|
+
readonly onlyDb: boolean;
|
|
45
|
+
} | {
|
|
46
|
+
readonly recordId: string;
|
|
47
|
+
readonly force: boolean;
|
|
48
|
+
} | {
|
|
49
|
+
readonly recordId: string;
|
|
50
|
+
} | {
|
|
51
|
+
readonly recordId: string;
|
|
52
|
+
} | {
|
|
53
|
+
readonly page: import("effect/Option").Option<number>;
|
|
54
|
+
readonly size: import("effect/Option").Option<number>;
|
|
55
|
+
readonly grouped: boolean;
|
|
56
|
+
readonly search: import("effect/Option").Option<string>;
|
|
57
|
+
} | {
|
|
58
|
+
readonly id: string;
|
|
59
|
+
readonly to: string[];
|
|
60
|
+
readonly force: boolean;
|
|
61
|
+
readonly noWait: boolean;
|
|
62
|
+
} | {
|
|
63
|
+
readonly id: string;
|
|
64
|
+
readonly to: string;
|
|
65
|
+
readonly force: boolean;
|
|
66
|
+
readonly noWait: boolean;
|
|
67
|
+
}>;
|
|
68
|
+
} | {
|
|
69
|
+
readonly subcommand: import("effect/Option").Option<{
|
|
70
|
+
readonly id: string;
|
|
71
|
+
readonly lang: import("effect/Option").Option<string>;
|
|
72
|
+
} | {
|
|
73
|
+
readonly recordId: string;
|
|
74
|
+
readonly force: boolean;
|
|
75
|
+
} | {
|
|
76
|
+
readonly recordId: string;
|
|
77
|
+
} | {
|
|
78
|
+
readonly subcommand: import("effect/Option").Option<{
|
|
79
|
+
readonly recordId: string;
|
|
80
|
+
readonly force: boolean;
|
|
81
|
+
} | {
|
|
82
|
+
readonly recordId: string;
|
|
83
|
+
} | {
|
|
84
|
+
readonly keyPath: string[];
|
|
85
|
+
readonly to: string[];
|
|
86
|
+
} | {
|
|
87
|
+
readonly page: import("effect/Option").Option<number>;
|
|
88
|
+
readonly size: import("effect/Option").Option<number>;
|
|
89
|
+
readonly keyPath: import("effect/Option").Option<string>;
|
|
90
|
+
readonly lang: import("effect/Option").Option<string>;
|
|
91
|
+
}>;
|
|
92
|
+
} | {
|
|
93
|
+
readonly recordId: string;
|
|
94
|
+
} | {
|
|
95
|
+
readonly id: string;
|
|
96
|
+
} | {
|
|
97
|
+
readonly page: import("effect/Option").Option<number>;
|
|
98
|
+
readonly size: import("effect/Option").Option<number>;
|
|
99
|
+
readonly search: import("effect/Option").Option<string>;
|
|
100
|
+
} | {
|
|
101
|
+
readonly id: string;
|
|
102
|
+
readonly to: string[];
|
|
103
|
+
readonly force: boolean;
|
|
104
|
+
readonly noWait: boolean;
|
|
105
|
+
}>;
|
|
106
|
+
} | {
|
|
107
|
+
readonly subcommand: import("effect/Option").Option<{
|
|
108
|
+
readonly id: string;
|
|
109
|
+
} | {
|
|
110
|
+
readonly recordId: string;
|
|
111
|
+
readonly force: boolean;
|
|
112
|
+
} | {
|
|
113
|
+
readonly page: import("effect/Option").Option<number>;
|
|
114
|
+
readonly size: import("effect/Option").Option<number>;
|
|
115
|
+
readonly grouped: boolean;
|
|
116
|
+
readonly search: import("effect/Option").Option<string>;
|
|
117
|
+
} | {
|
|
118
|
+
readonly id: string;
|
|
119
|
+
readonly to: string[];
|
|
120
|
+
readonly force: boolean;
|
|
121
|
+
readonly noWait: boolean;
|
|
122
|
+
} | {
|
|
123
|
+
readonly provider: string;
|
|
124
|
+
readonly model: string;
|
|
125
|
+
}>;
|
|
126
|
+
}>;
|
|
127
|
+
}>;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { Command } from '@effect/cli';
|
|
2
|
+
import { registerCommandHelp } from '../help/registry';
|
|
3
|
+
import { insightsCmd } from './insights';
|
|
4
|
+
import { overviewCmd } from './overview';
|
|
5
|
+
import { summaryCmd } from './summary';
|
|
6
|
+
import { translateCmd } from './translate';
|
|
7
|
+
import { ttsCmd } from './tts';
|
|
8
|
+
const help = registerCommandHelp({
|
|
9
|
+
name: 'ai',
|
|
10
|
+
description: 'manage AI artifacts (summary, translation, insights, tts, overview)',
|
|
11
|
+
skillChapter: 'commands-ai',
|
|
12
|
+
verbs: [
|
|
13
|
+
{
|
|
14
|
+
name: 'summary',
|
|
15
|
+
args: ['<verb>', '...'],
|
|
16
|
+
description: 'manage AI summaries (regen, translate, list, get, by-article, edit, delete)',
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
name: 'translate',
|
|
20
|
+
args: ['<verb>', '...'],
|
|
21
|
+
description: 'manage AI translations (run, list, get, by-article, languages, edit, delete, entries)',
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
name: 'insights',
|
|
25
|
+
args: ['<verb>', '...'],
|
|
26
|
+
description: 'manage AI insights (refresh, translate, list, get, by-article, edit, delete)',
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
name: 'tts',
|
|
30
|
+
args: ['<verb>', '...'],
|
|
31
|
+
description: 'manage AI narrations (run, list, by-article, voices, delete)',
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
name: 'overview',
|
|
35
|
+
args: ['<verb>', '...'],
|
|
36
|
+
description: 'inspect the per-article AI overview board (list, by-article)',
|
|
37
|
+
},
|
|
38
|
+
],
|
|
39
|
+
});
|
|
40
|
+
export const aiCmd = Command.make('ai').pipe(Command.withDescription(help.description), Command.withSubcommands([
|
|
41
|
+
summaryCmd,
|
|
42
|
+
translateCmd,
|
|
43
|
+
insightsCmd,
|
|
44
|
+
ttsCmd,
|
|
45
|
+
overviewCmd,
|
|
46
|
+
]));
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Command } from '@effect/cli';
|
|
2
|
+
import { Option } from 'effect';
|
|
3
|
+
import { Ai } from '../../../services/Ai';
|
|
4
|
+
import { Renderer } from '../../../services/Renderer';
|
|
5
|
+
import { Resolver } from '../../../services/Resolver';
|
|
6
|
+
export declare const byArticle: Command.Command<"by-article", Ai | Renderer | Resolver, import("../../../services/Api").ApiError, {
|
|
7
|
+
readonly id: string;
|
|
8
|
+
readonly lang: Option.Option<string>;
|
|
9
|
+
readonly onlyDb: boolean;
|
|
10
|
+
}>;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Args, Command, Options } from '@effect/cli';
|
|
2
|
+
import { Effect, Option } from 'effect';
|
|
3
|
+
import { Ai } from '../../../services/Ai';
|
|
4
|
+
import { Renderer } from '../../../services/Renderer';
|
|
5
|
+
import { Resolver } from '../../../services/Resolver';
|
|
6
|
+
import { resolveArticleId } from '../_resolve';
|
|
7
|
+
const id = Args.text({ name: 'idOrSlug' });
|
|
8
|
+
const lang = Options.text('lang').pipe(Options.optional);
|
|
9
|
+
const onlyDb = Options.boolean('only-db').pipe(Options.withDescription('do not auto-generate on miss'));
|
|
10
|
+
const unwrap = (value) => Option.getOrUndefined(value);
|
|
11
|
+
export const byArticle = Command.make('by-article', { id, lang, onlyDb }, ({ id, lang, onlyDb }) => Effect.gen(function* () {
|
|
12
|
+
const ai = yield* Ai;
|
|
13
|
+
const renderer = yield* Renderer;
|
|
14
|
+
const resolver = yield* Resolver;
|
|
15
|
+
const refId = yield* resolveArticleId(resolver, id);
|
|
16
|
+
const res = yield* ai.getInsightsByArticle(refId, {
|
|
17
|
+
lang: unwrap(lang),
|
|
18
|
+
onlyDb,
|
|
19
|
+
});
|
|
20
|
+
yield* renderer.emitSuccess(res);
|
|
21
|
+
})).pipe(Command.withDescription("show an article's AI insights"));
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Command } from '@effect/cli';
|
|
2
|
+
import { Ai } from '../../../services/Ai';
|
|
3
|
+
import { Renderer } from '../../../services/Renderer';
|
|
4
|
+
export declare const del: Command.Command<"delete", Ai | Renderer, import("../../../services/Api").ApiError, {
|
|
5
|
+
readonly recordId: string;
|
|
6
|
+
readonly force: boolean;
|
|
7
|
+
}>;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Args, Command, Options } from '@effect/cli';
|
|
2
|
+
import { Effect } from 'effect';
|
|
3
|
+
import { ValidationFailed } from '../../../domain/errors';
|
|
4
|
+
import { Ai } from '../../../services/Ai';
|
|
5
|
+
import { Renderer } from '../../../services/Renderer';
|
|
6
|
+
const recordId = Args.text({ name: 'recordId' });
|
|
7
|
+
const force = Options.boolean('force').pipe(Options.withDescription('skip the non-TTY guard'));
|
|
8
|
+
export const del = Command.make('delete', { recordId, force }, ({ recordId, force }) => Effect.gen(function* () {
|
|
9
|
+
if (!force && !process.stdin.isTTY) {
|
|
10
|
+
return yield* Effect.fail(new ValidationFailed({
|
|
11
|
+
message: 'refusing to delete without --force in non-TTY context',
|
|
12
|
+
}));
|
|
13
|
+
}
|
|
14
|
+
const ai = yield* Ai;
|
|
15
|
+
const renderer = yield* Renderer;
|
|
16
|
+
yield* ai.deleteInsights(recordId);
|
|
17
|
+
yield* renderer.emitSuccess({ deleted: recordId });
|
|
18
|
+
})).pipe(Command.withDescription('delete an AI insights record'));
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Command } from '@effect/cli';
|
|
2
|
+
import { ValidationJson } from '../../../domain/errors';
|
|
3
|
+
import { Ai } from '../../../services/Ai';
|
|
4
|
+
import { Editor } from '../../../services/Editor';
|
|
5
|
+
import { Renderer } from '../../../services/Renderer';
|
|
6
|
+
export declare const edit: Command.Command<"edit", Ai | Renderer | Editor, ValidationJson | import("../../../domain/errors").AiRecordNotFound | import("../../../services/Api").ApiError, {
|
|
7
|
+
readonly recordId: string;
|
|
8
|
+
}>;
|