@mx-space/cli 0.15.1 → 0.15.2

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 (611) hide show
  1. package/dist/{Lexical.dev-BSvx45_E.mjs → Lexical.dev-Df5TNMgP.mjs} +2 -2
  2. package/dist/{Lexical.node-kAh5GM2n.mjs → Lexical.node-B064E4Hy.mjs} +1 -1
  3. package/dist/{Lexical.prod-Bqwgb3ez.mjs → Lexical.prod-DRFSwoE7.mjs} +2 -2
  4. package/dist/{LexicalClipboard.dev-BWU3KXIa.mjs → LexicalClipboard.dev-ClOWeg5v.mjs} +5 -5
  5. package/dist/{LexicalClipboard.node-BygAdNdF.mjs → LexicalClipboard.node-BJBLWpEi.mjs} +1 -1
  6. package/dist/{LexicalClipboard.prod-BtMuKNyT.mjs → LexicalClipboard.prod-Ytt65eQo.mjs} +5 -5
  7. package/dist/{LexicalCodeCore.dev-CD2xgvDs.mjs → LexicalCodeCore.dev-CzEPINOT.mjs} +4 -4
  8. package/dist/{LexicalCodeCore.prod-Bl6FFMc7.mjs → LexicalCodeCore.prod-DOVk7lL_.mjs} +4 -4
  9. package/dist/{LexicalDragon.dev-BwdYhm4K.mjs → LexicalDragon.dev-DxePN9fP.mjs} +2 -2
  10. package/dist/{LexicalDragon.node-CpJhkCVV.mjs → LexicalDragon.node-DBwaqStp.mjs} +1 -1
  11. package/dist/{LexicalDragon.prod-CvXmWwo1.mjs → LexicalDragon.prod-Bji84-Hq.mjs} +2 -2
  12. package/dist/{LexicalExtension.dev-LcRLXI5Z.mjs → LexicalExtension.dev-DtSRyjbf.mjs} +2 -2
  13. package/dist/{LexicalExtension.node-BwJt2LXV.mjs → LexicalExtension.node-3nsS5NjU.mjs} +1 -1
  14. package/dist/{LexicalExtension.prod-lg8_33-H.mjs → LexicalExtension.prod-Ddk0ja_6.mjs} +2 -2
  15. package/dist/{LexicalHeadless.dev-BeUbKBes.mjs → LexicalHeadless.dev-DdWJsPoH.mjs} +1 -1
  16. package/dist/{LexicalHeadless.prod-4gbIA8HM.mjs → LexicalHeadless.prod-CH74ZDMt.mjs} +1 -1
  17. package/dist/{LexicalHtml.dev-BLdZWTCJ.mjs → LexicalHtml.dev-DN7QIb_7.mjs} +4 -4
  18. package/dist/{LexicalHtml.node-BeuJMvvt.mjs → LexicalHtml.node-DAwuaPeI.mjs} +1 -1
  19. package/dist/{LexicalHtml.prod-CHUyCocN.mjs → LexicalHtml.prod-X4eTHEfI.mjs} +4 -4
  20. package/dist/{LexicalLink.dev-DgsFRqw0.mjs → LexicalLink.dev-owitIl6I.mjs} +4 -4
  21. package/dist/{LexicalLink.prod-CkXkeKY2.mjs → LexicalLink.prod-BZ7ZZkVD.mjs} +4 -4
  22. package/dist/{LexicalList.dev-OOms3kQi.mjs → LexicalList.dev-CUbi09Yo.mjs} +4 -4
  23. package/dist/{LexicalList.prod-DzMBeqHn.mjs → LexicalList.prod-pUsUZa0r.mjs} +4 -4
  24. package/dist/{LexicalMarkdown.dev-DJLKbZtD.mjs → LexicalMarkdown.dev-S2yWckH9.mjs} +3 -3
  25. package/dist/{LexicalMarkdown.prod-Cp21kDCU.mjs → LexicalMarkdown.prod-TRkMWfmC.mjs} +3 -3
  26. package/dist/{LexicalRichText.dev-0rkAGjUf.mjs → LexicalRichText.dev-Y3ybFF2S.mjs} +7 -7
  27. package/dist/{LexicalRichText.node-Cd-BySPE.mjs → LexicalRichText.node-wNAi2Z4i.mjs} +4 -4
  28. package/dist/{LexicalRichText.prod-DTQiEr8C.mjs → LexicalRichText.prod-HLxqZ6hQ.mjs} +7 -7
  29. package/dist/{LexicalSelection.dev-Bi0VlUEv.mjs → LexicalSelection.dev-CyhKOKbs.mjs} +1 -1
  30. package/dist/{LexicalSelection.node-t2U46EF_.mjs → LexicalSelection.node-BCuHMbzl.mjs} +1 -1
  31. package/dist/{LexicalSelection.prod-CrFG111g.mjs → LexicalSelection.prod-RebDJliC.mjs} +1 -1
  32. package/dist/{LexicalTable.dev-D-sFhO-o.mjs → LexicalTable.dev-DN3ezVey.mjs} +5 -5
  33. package/dist/{LexicalTable.prod-DwYaa_dN.mjs → LexicalTable.prod-B0MioVyq.mjs} +5 -5
  34. package/dist/{LexicalUtils.dev-Q2q3-UDM.mjs → LexicalUtils.dev-Bw6LFRlt.mjs} +2 -2
  35. package/dist/{LexicalUtils.node-Dl7OvqJV.mjs → LexicalUtils.node-BPKMFN80.mjs} +1 -1
  36. package/dist/{LexicalUtils.prod-CBnq_iEV.mjs → LexicalUtils.prod-CJYQVQJO.mjs} +2 -2
  37. package/dist/bin/mxs.mjs +1 -1
  38. package/dist/{esm-ZXjJmLEC.mjs → esm-7vSMGlFz.mjs} +171 -245
  39. package/dist/esm-ZrfYH2y2.mjs +2 -0
  40. package/dist/index.mjs +1 -1
  41. package/dist/{mxs-DC9zR3f2.mjs → mxs-DKv-4ZTg.mjs} +362 -297
  42. package/dist/vendor/litexml/cli.mjs +94 -38
  43. package/dist/vendor/litexml/litexml-html-preview-client.css +329 -836
  44. package/dist/vendor/litexml/litexml-html-preview-client.js +6048 -5832
  45. package/dist/vendor/litexml/style.css +5 -1
  46. package/package.json +10 -10
  47. package/dist/esm-CNZ7kdTg.mjs +0 -2
  48. package/dist/src/bin/mxs.d.ts +0 -2
  49. package/dist/src/bin/mxs.js +0 -310
  50. package/dist/src/cli/ai/_poll.d.ts +0 -12
  51. package/dist/src/cli/ai/_poll.js +0 -38
  52. package/dist/src/cli/ai/_resolve.d.ts +0 -8
  53. package/dist/src/cli/ai/_resolve.js +0 -27
  54. package/dist/src/cli/ai/index.d.ts +0 -127
  55. package/dist/src/cli/ai/index.js +0 -46
  56. package/dist/src/cli/ai/insights/by-article.d.ts +0 -10
  57. package/dist/src/cli/ai/insights/by-article.js +0 -21
  58. package/dist/src/cli/ai/insights/delete.d.ts +0 -7
  59. package/dist/src/cli/ai/insights/delete.js +0 -18
  60. package/dist/src/cli/ai/insights/edit.d.ts +0 -8
  61. package/dist/src/cli/ai/insights/edit.js +0 -54
  62. package/dist/src/cli/ai/insights/get.d.ts +0 -6
  63. package/dist/src/cli/ai/insights/get.js +0 -11
  64. package/dist/src/cli/ai/insights/index.d.ts +0 -30
  65. package/dist/src/cli/ai/insights/index.js +0 -17
  66. package/dist/src/cli/ai/insights/list.d.ts +0 -10
  67. package/dist/src/cli/ai/insights/list.js +0 -20
  68. package/dist/src/cli/ai/insights/refresh.d.ts +0 -10
  69. package/dist/src/cli/ai/insights/refresh.js +0 -25
  70. package/dist/src/cli/ai/insights/translate.d.ts +0 -10
  71. package/dist/src/cli/ai/insights/translate.js +0 -25
  72. package/dist/src/cli/ai/overview/by-article.d.ts +0 -7
  73. package/dist/src/cli/ai/overview/by-article.js +0 -15
  74. package/dist/src/cli/ai/overview/index.d.ts +0 -11
  75. package/dist/src/cli/ai/overview/index.js +0 -4
  76. package/dist/src/cli/ai/overview/list.d.ts +0 -10
  77. package/dist/src/cli/ai/overview/list.js +0 -20
  78. package/dist/src/cli/ai/summary/by-article.d.ts +0 -10
  79. package/dist/src/cli/ai/summary/by-article.js +0 -21
  80. package/dist/src/cli/ai/summary/delete.d.ts +0 -7
  81. package/dist/src/cli/ai/summary/delete.js +0 -18
  82. package/dist/src/cli/ai/summary/edit.d.ts +0 -8
  83. package/dist/src/cli/ai/summary/edit.js +0 -54
  84. package/dist/src/cli/ai/summary/get.d.ts +0 -6
  85. package/dist/src/cli/ai/summary/get.js +0 -11
  86. package/dist/src/cli/ai/summary/index.d.ts +0 -30
  87. package/dist/src/cli/ai/summary/index.js +0 -9
  88. package/dist/src/cli/ai/summary/list.d.ts +0 -10
  89. package/dist/src/cli/ai/summary/list.js +0 -20
  90. package/dist/src/cli/ai/summary/regen.d.ts +0 -10
  91. package/dist/src/cli/ai/summary/regen.js +0 -25
  92. package/dist/src/cli/ai/summary/translate.d.ts +0 -10
  93. package/dist/src/cli/ai/summary/translate.js +0 -25
  94. package/dist/src/cli/ai/translate/by-article.d.ts +0 -9
  95. package/dist/src/cli/ai/translate/by-article.js +0 -19
  96. package/dist/src/cli/ai/translate/delete.d.ts +0 -7
  97. package/dist/src/cli/ai/translate/delete.js +0 -18
  98. package/dist/src/cli/ai/translate/edit.d.ts +0 -8
  99. package/dist/src/cli/ai/translate/edit.js +0 -97
  100. package/dist/src/cli/ai/translate/entries/delete.d.ts +0 -7
  101. package/dist/src/cli/ai/translate/entries/delete.js +0 -18
  102. package/dist/src/cli/ai/translate/entries/edit.d.ts +0 -8
  103. package/dist/src/cli/ai/translate/entries/edit.js +0 -73
  104. package/dist/src/cli/ai/translate/entries/generate.d.ts +0 -7
  105. package/dist/src/cli/ai/translate/entries/generate.js +0 -15
  106. package/dist/src/cli/ai/translate/entries/index.d.ts +0 -17
  107. package/dist/src/cli/ai/translate/entries/index.js +0 -6
  108. package/dist/src/cli/ai/translate/entries/list.d.ts +0 -10
  109. package/dist/src/cli/ai/translate/entries/list.js +0 -20
  110. package/dist/src/cli/ai/translate/get.d.ts +0 -6
  111. package/dist/src/cli/ai/translate/get.js +0 -11
  112. package/dist/src/cli/ai/translate/index.d.ts +0 -40
  113. package/dist/src/cli/ai/translate/index.js +0 -19
  114. package/dist/src/cli/ai/translate/languages.d.ts +0 -7
  115. package/dist/src/cli/ai/translate/languages.js +0 -15
  116. package/dist/src/cli/ai/translate/list.d.ts +0 -9
  117. package/dist/src/cli/ai/translate/list.js +0 -19
  118. package/dist/src/cli/ai/translate/run.d.ts +0 -10
  119. package/dist/src/cli/ai/translate/run.js +0 -31
  120. package/dist/src/cli/ai/tts/by-article.d.ts +0 -7
  121. package/dist/src/cli/ai/tts/by-article.js +0 -15
  122. package/dist/src/cli/ai/tts/delete.d.ts +0 -7
  123. package/dist/src/cli/ai/tts/delete.js +0 -18
  124. package/dist/src/cli/ai/tts/index.d.ts +0 -22
  125. package/dist/src/cli/ai/tts/index.js +0 -7
  126. package/dist/src/cli/ai/tts/list.d.ts +0 -10
  127. package/dist/src/cli/ai/tts/list.js +0 -20
  128. package/dist/src/cli/ai/tts/run.d.ts +0 -10
  129. package/dist/src/cli/ai/tts/run.js +0 -25
  130. package/dist/src/cli/ai/tts/voices.d.ts +0 -7
  131. package/dist/src/cli/ai/tts/voices.js +0 -12
  132. package/dist/src/cli/ai/views.d.ts +0 -3
  133. package/dist/src/cli/ai/views.js +0 -45
  134. package/dist/src/cli/auth/index.d.ts +0 -6
  135. package/dist/src/cli/auth/index.js +0 -22
  136. package/dist/src/cli/auth/login.d.ts +0 -11
  137. package/dist/src/cli/auth/login.js +0 -168
  138. package/dist/src/cli/auth/logout.d.ts +0 -6
  139. package/dist/src/cli/auth/logout.js +0 -21
  140. package/dist/src/cli/auth/status.d.ts +0 -4
  141. package/dist/src/cli/auth/status.js +0 -31
  142. package/dist/src/cli/auth/view.d.ts +0 -25
  143. package/dist/src/cli/auth/view.js +0 -46
  144. package/dist/src/cli/auth/whoami.d.ts +0 -7
  145. package/dist/src/cli/auth/whoami.js +0 -44
  146. package/dist/src/cli/category/create.d.ts +0 -10
  147. package/dist/src/cli/category/create.js +0 -24
  148. package/dist/src/cli/category/delete.d.ts +0 -8
  149. package/dist/src/cli/category/delete.js +0 -21
  150. package/dist/src/cli/category/get.d.ts +0 -6
  151. package/dist/src/cli/category/get.js +0 -11
  152. package/dist/src/cli/category/index.d.ts +0 -20
  153. package/dist/src/cli/category/index.js +0 -41
  154. package/dist/src/cli/category/list.d.ts +0 -4
  155. package/dist/src/cli/category/list.js +0 -10
  156. package/dist/src/cli/category/update.d.ts +0 -12
  157. package/dist/src/cli/category/update.js +0 -34
  158. package/dist/src/cli/comment/_flags.d.ts +0 -28
  159. package/dist/src/cli/comment/_flags.js +0 -48
  160. package/dist/src/cli/comment/approve.d.ts +0 -9
  161. package/dist/src/cli/comment/approve.js +0 -23
  162. package/dist/src/cli/comment/delete.d.ts +0 -9
  163. package/dist/src/cli/comment/delete.js +0 -24
  164. package/dist/src/cli/comment/get.d.ts +0 -6
  165. package/dist/src/cli/comment/get.js +0 -12
  166. package/dist/src/cli/comment/index.d.ts +0 -34
  167. package/dist/src/cli/comment/index.js +0 -53
  168. package/dist/src/cli/comment/list.d.ts +0 -9
  169. package/dist/src/cli/comment/list.js +0 -20
  170. package/dist/src/cli/comment/reject.d.ts +0 -9
  171. package/dist/src/cli/comment/reject.js +0 -23
  172. package/dist/src/cli/comment/reply.d.ts +0 -9
  173. package/dist/src/cli/comment/reply.js +0 -31
  174. package/dist/src/cli/comment/unread.d.ts +0 -7
  175. package/dist/src/cli/comment/unread.js +0 -21
  176. package/dist/src/cli/comment/view.d.ts +0 -3
  177. package/dist/src/cli/comment/view.js +0 -197
  178. package/dist/src/cli/config/edit.d.ts +0 -5
  179. package/dist/src/cli/config/edit.js +0 -36
  180. package/dist/src/cli/config/get.d.ts +0 -6
  181. package/dist/src/cli/config/get.js +0 -11
  182. package/dist/src/cli/config/index.d.ts +0 -10
  183. package/dist/src/cli/config/index.js +0 -22
  184. package/dist/src/cli/config/list.d.ts +0 -4
  185. package/dist/src/cli/config/list.js +0 -10
  186. package/dist/src/cli/config/set.d.ts +0 -9
  187. package/dist/src/cli/config/set.js +0 -48
  188. package/dist/src/cli/draft/_shared.d.ts +0 -27
  189. package/dist/src/cli/draft/_shared.js +0 -85
  190. package/dist/src/cli/draft/create.d.ts +0 -21
  191. package/dist/src/cli/draft/create.js +0 -34
  192. package/dist/src/cli/draft/delete.d.ts +0 -7
  193. package/dist/src/cli/draft/delete.js +0 -20
  194. package/dist/src/cli/draft/get.d.ts +0 -6
  195. package/dist/src/cli/draft/get.js +0 -11
  196. package/dist/src/cli/draft/index.d.ts +0 -54
  197. package/dist/src/cli/draft/index.js +0 -42
  198. package/dist/src/cli/draft/list.d.ts +0 -11
  199. package/dist/src/cli/draft/list.js +0 -23
  200. package/dist/src/cli/draft/publish.d.ts +0 -8
  201. package/dist/src/cli/draft/publish.js +0 -64
  202. package/dist/src/cli/draft/update.d.ts +0 -22
  203. package/dist/src/cli/draft/update.js +0 -29
  204. package/dist/src/cli/file/_shared.d.ts +0 -6
  205. package/dist/src/cli/file/_shared.js +0 -5
  206. package/dist/src/cli/file/delete.d.ts +0 -8
  207. package/dist/src/cli/file/delete.js +0 -21
  208. package/dist/src/cli/file/index.d.ts +0 -19
  209. package/dist/src/cli/file/index.js +0 -33
  210. package/dist/src/cli/file/list.d.ts +0 -6
  211. package/dist/src/cli/file/list.js +0 -11
  212. package/dist/src/cli/file/rename.d.ts +0 -8
  213. package/dist/src/cli/file/rename.js +0 -16
  214. package/dist/src/cli/file/upload.d.ts +0 -9
  215. package/dist/src/cli/file/upload.js +0 -32
  216. package/dist/src/cli/help/index.d.ts +0 -62
  217. package/dist/src/cli/help/index.js +0 -276
  218. package/dist/src/cli/help/registry.d.ts +0 -28
  219. package/dist/src/cli/help/registry.js +0 -29
  220. package/dist/src/cli/note/_flags.d.ts +0 -66
  221. package/dist/src/cli/note/_flags.js +0 -73
  222. package/dist/src/cli/note/create.d.ts +0 -23
  223. package/dist/src/cli/note/create.js +0 -25
  224. package/dist/src/cli/note/delete.d.ts +0 -8
  225. package/dist/src/cli/note/delete.js +0 -21
  226. package/dist/src/cli/note/edit.d.ts +0 -28
  227. package/dist/src/cli/note/edit.js +0 -114
  228. package/dist/src/cli/note/get.d.ts +0 -6
  229. package/dist/src/cli/note/get.js +0 -29
  230. package/dist/src/cli/note/index.d.ts +0 -77
  231. package/dist/src/cli/note/index.js +0 -63
  232. package/dist/src/cli/note/list.d.ts +0 -10
  233. package/dist/src/cli/note/list.js +0 -22
  234. package/dist/src/cli/note/publish.d.ts +0 -7
  235. package/dist/src/cli/note/publish.js +0 -17
  236. package/dist/src/cli/note/unpublish.d.ts +0 -7
  237. package/dist/src/cli/note/unpublish.js +0 -17
  238. package/dist/src/cli/note/update.d.ts +0 -25
  239. package/dist/src/cli/note/update.js +0 -36
  240. package/dist/src/cli/note/view.d.ts +0 -3
  241. package/dist/src/cli/note/view.js +0 -162
  242. package/dist/src/cli/page/create.d.ts +0 -41
  243. package/dist/src/cli/page/create.js +0 -56
  244. package/dist/src/cli/page/delete.d.ts +0 -7
  245. package/dist/src/cli/page/delete.js +0 -37
  246. package/dist/src/cli/page/edit.d.ts +0 -19
  247. package/dist/src/cli/page/edit.js +0 -117
  248. package/dist/src/cli/page/get.d.ts +0 -6
  249. package/dist/src/cli/page/get.js +0 -16
  250. package/dist/src/cli/page/index.d.ts +0 -44
  251. package/dist/src/cli/page/index.js +0 -38
  252. package/dist/src/cli/page/list.d.ts +0 -4
  253. package/dist/src/cli/page/list.js +0 -10
  254. package/dist/src/cli/page/update.d.ts +0 -16
  255. package/dist/src/cli/page/update.js +0 -48
  256. package/dist/src/cli/page/view.d.ts +0 -2
  257. package/dist/src/cli/page/view.js +0 -79
  258. package/dist/src/cli/post/_flags.d.ts +0 -66
  259. package/dist/src/cli/post/_flags.js +0 -96
  260. package/dist/src/cli/post/apply.d.ts +0 -7
  261. package/dist/src/cli/post/apply.js +0 -70
  262. package/dist/src/cli/post/create.d.ts +0 -21
  263. package/dist/src/cli/post/create.js +0 -24
  264. package/dist/src/cli/post/delete.d.ts +0 -8
  265. package/dist/src/cli/post/delete.js +0 -21
  266. package/dist/src/cli/post/edit.d.ts +0 -26
  267. package/dist/src/cli/post/edit.js +0 -115
  268. package/dist/src/cli/post/get.d.ts +0 -7
  269. package/dist/src/cli/post/get.js +0 -15
  270. package/dist/src/cli/post/index.d.ts +0 -91
  271. package/dist/src/cli/post/index.js +0 -73
  272. package/dist/src/cli/post/list.d.ts +0 -10
  273. package/dist/src/cli/post/list.js +0 -23
  274. package/dist/src/cli/post/publish.d.ts +0 -7
  275. package/dist/src/cli/post/publish.js +0 -17
  276. package/dist/src/cli/post/stage.d.ts +0 -23
  277. package/dist/src/cli/post/stage.js +0 -55
  278. package/dist/src/cli/post/unpublish.d.ts +0 -7
  279. package/dist/src/cli/post/unpublish.js +0 -17
  280. package/dist/src/cli/post/update.d.ts +0 -23
  281. package/dist/src/cli/post/update.js +0 -38
  282. package/dist/src/cli/post/view.d.ts +0 -3
  283. package/dist/src/cli/post/view.js +0 -150
  284. package/dist/src/cli/preview/index.d.ts +0 -13
  285. package/dist/src/cli/preview/index.js +0 -226
  286. package/dist/src/cli/profile/index.d.ts +0 -14
  287. package/dist/src/cli/profile/index.js +0 -36
  288. package/dist/src/cli/profile/ls.d.ts +0 -5
  289. package/dist/src/cli/profile/ls.js +0 -26
  290. package/dist/src/cli/profile/mark.d.ts +0 -9
  291. package/dist/src/cli/profile/mark.js +0 -23
  292. package/dist/src/cli/profile/rm.d.ts +0 -12
  293. package/dist/src/cli/profile/rm.js +0 -50
  294. package/dist/src/cli/profile/show.d.ts +0 -9
  295. package/dist/src/cli/profile/show.js +0 -40
  296. package/dist/src/cli/profile/use.d.ts +0 -6
  297. package/dist/src/cli/profile/use.js +0 -11
  298. package/dist/src/cli/profile/view.d.ts +0 -8
  299. package/dist/src/cli/profile/view.js +0 -21
  300. package/dist/src/cli/project/_flags.d.ts +0 -56
  301. package/dist/src/cli/project/_flags.js +0 -130
  302. package/dist/src/cli/project/create.d.ts +0 -17
  303. package/dist/src/cli/project/create.js +0 -25
  304. package/dist/src/cli/project/delete.d.ts +0 -8
  305. package/dist/src/cli/project/delete.js +0 -22
  306. package/dist/src/cli/project/edit.d.ts +0 -11
  307. package/dist/src/cli/project/edit.js +0 -61
  308. package/dist/src/cli/project/get.d.ts +0 -7
  309. package/dist/src/cli/project/get.js +0 -14
  310. package/dist/src/cli/project/index.d.ts +0 -43
  311. package/dist/src/cli/project/index.js +0 -52
  312. package/dist/src/cli/project/list.d.ts +0 -8
  313. package/dist/src/cli/project/list.js +0 -19
  314. package/dist/src/cli/project/update.d.ts +0 -18
  315. package/dist/src/cli/project/update.js +0 -24
  316. package/dist/src/cli/project/view-cmd.d.ts +0 -7
  317. package/dist/src/cli/project/view-cmd.js +0 -15
  318. package/dist/src/cli/project/view.d.ts +0 -3
  319. package/dist/src/cli/project/view.js +0 -102
  320. package/dist/src/cli/render/codehighlight.d.ts +0 -8
  321. package/dist/src/cli/render/codehighlight.js +0 -264
  322. package/dist/src/cli/render/envelope.d.ts +0 -7
  323. package/dist/src/cli/render/envelope.js +0 -23
  324. package/dist/src/cli/render/frontmatter.d.ts +0 -8
  325. package/dist/src/cli/render/frontmatter.js +0 -50
  326. package/dist/src/cli/render/helpers.d.ts +0 -2
  327. package/dist/src/cli/render/helpers.js +0 -11
  328. package/dist/src/cli/render/index.d.ts +0 -7
  329. package/dist/src/cli/render/index.js +0 -10
  330. package/dist/src/cli/render/lexical/blocks.d.ts +0 -19
  331. package/dist/src/cli/render/lexical/blocks.js +0 -208
  332. package/dist/src/cli/render/lexical/code.d.ts +0 -2
  333. package/dist/src/cli/render/lexical/code.js +0 -22
  334. package/dist/src/cli/render/lexical/embeds.d.ts +0 -6
  335. package/dist/src/cli/render/lexical/embeds.js +0 -51
  336. package/dist/src/cli/render/lexical/index.d.ts +0 -9
  337. package/dist/src/cli/render/lexical/index.js +0 -25
  338. package/dist/src/cli/render/lexical/inlines.d.ts +0 -17
  339. package/dist/src/cli/render/lexical/inlines.js +0 -76
  340. package/dist/src/cli/render/lexical/parser.d.ts +0 -10
  341. package/dist/src/cli/render/lexical/parser.js +0 -64
  342. package/dist/src/cli/render/lexical/walker.d.ts +0 -21
  343. package/dist/src/cli/render/lexical/walker.js +0 -51
  344. package/dist/src/cli/render/markdown.d.ts +0 -18
  345. package/dist/src/cli/render/markdown.js +0 -196
  346. package/dist/src/cli/render/metadata-block.d.ts +0 -14
  347. package/dist/src/cli/render/metadata-block.js +0 -50
  348. package/dist/src/cli/skill/all.d.ts +0 -4
  349. package/dist/src/cli/skill/all.js +0 -11
  350. package/dist/src/cli/skill/get.d.ts +0 -6
  351. package/dist/src/cli/skill/get.js +0 -12
  352. package/dist/src/cli/skill/index.d.ts +0 -10
  353. package/dist/src/cli/skill/index.js +0 -34
  354. package/dist/src/cli/skill/list.d.ts +0 -4
  355. package/dist/src/cli/skill/list.js +0 -11
  356. package/dist/src/cli/skill/search.d.ts +0 -6
  357. package/dist/src/cli/skill/search.js +0 -12
  358. package/dist/src/cli/skill/views.d.ts +0 -6
  359. package/dist/src/cli/skill/views.js +0 -90
  360. package/dist/src/cli/snippet/_flags.d.ts +0 -57
  361. package/dist/src/cli/snippet/_flags.js +0 -123
  362. package/dist/src/cli/snippet/_resolve.d.ts +0 -4
  363. package/dist/src/cli/snippet/_resolve.js +0 -32
  364. package/dist/src/cli/snippet/_sync.d.ts +0 -5
  365. package/dist/src/cli/snippet/_sync.js +0 -54
  366. package/dist/src/cli/snippet/create.d.ts +0 -19
  367. package/dist/src/cli/snippet/create.js +0 -35
  368. package/dist/src/cli/snippet/delete.d.ts +0 -8
  369. package/dist/src/cli/snippet/delete.js +0 -28
  370. package/dist/src/cli/snippet/edit.d.ts +0 -7
  371. package/dist/src/cli/snippet/edit.js +0 -29
  372. package/dist/src/cli/snippet/get.d.ts +0 -6
  373. package/dist/src/cli/snippet/get.js +0 -12
  374. package/dist/src/cli/snippet/index.d.ts +0 -43
  375. package/dist/src/cli/snippet/index.js +0 -58
  376. package/dist/src/cli/snippet/list.d.ts +0 -9
  377. package/dist/src/cli/snippet/list.js +0 -20
  378. package/dist/src/cli/snippet/pull.d.ts +0 -8
  379. package/dist/src/cli/snippet/pull.js +0 -33
  380. package/dist/src/cli/snippet/push.d.ts +0 -10
  381. package/dist/src/cli/snippet/push.js +0 -31
  382. package/dist/src/cli/snippet/update.d.ts +0 -8
  383. package/dist/src/cli/snippet/update.js +0 -16
  384. package/dist/src/cli/topic/create.d.ts +0 -10
  385. package/dist/src/cli/topic/create.js +0 -24
  386. package/dist/src/cli/topic/delete.d.ts +0 -7
  387. package/dist/src/cli/topic/delete.js +0 -37
  388. package/dist/src/cli/topic/get.d.ts +0 -6
  389. package/dist/src/cli/topic/get.js +0 -15
  390. package/dist/src/cli/topic/index.d.ts +0 -20
  391. package/dist/src/cli/topic/index.js +0 -32
  392. package/dist/src/cli/topic/list.d.ts +0 -4
  393. package/dist/src/cli/topic/list.js +0 -10
  394. package/dist/src/cli/topic/update.d.ts +0 -11
  395. package/dist/src/cli/topic/update.js +0 -51
  396. package/dist/src/cli/ui/index.d.ts +0 -24
  397. package/dist/src/cli/ui/index.js +0 -83
  398. package/dist/src/cli/update/index.d.ts +0 -10
  399. package/dist/src/cli/update/index.js +0 -142
  400. package/dist/src/domain/admin-link.d.ts +0 -12
  401. package/dist/src/domain/admin-link.js +0 -45
  402. package/dist/src/domain/content-spec.d.ts +0 -20
  403. package/dist/src/domain/content-spec.js +0 -78
  404. package/dist/src/domain/envelope-compat.d.ts +0 -68
  405. package/dist/src/domain/envelope-compat.js +0 -121
  406. package/dist/src/domain/envelope.d.ts +0 -34
  407. package/dist/src/domain/envelope.js +0 -355
  408. package/dist/src/domain/errors.d.ts +0 -336
  409. package/dist/src/domain/errors.js +0 -239
  410. package/dist/src/domain/gate.d.ts +0 -14
  411. package/dist/src/domain/gate.js +0 -18
  412. package/dist/src/domain/payload.d.ts +0 -64
  413. package/dist/src/domain/payload.js +0 -237
  414. package/dist/src/domain/preflight-guards.d.ts +0 -54
  415. package/dist/src/domain/preflight-guards.js +0 -130
  416. package/dist/src/domain/runtime-flags.d.ts +0 -33
  417. package/dist/src/domain/runtime-flags.js +0 -166
  418. package/dist/src/domain/schema/api-envelope.d.ts +0 -67
  419. package/dist/src/domain/schema/api-envelope.js +0 -65
  420. package/dist/src/domain/schema/category.d.ts +0 -23
  421. package/dist/src/domain/schema/category.js +0 -19
  422. package/dist/src/domain/schema/config.d.ts +0 -13
  423. package/dist/src/domain/schema/config.js +0 -18
  424. package/dist/src/domain/schema/note.d.ts +0 -76
  425. package/dist/src/domain/schema/note.js +0 -35
  426. package/dist/src/domain/schema/page.d.ts +0 -40
  427. package/dist/src/domain/schema/page.js +0 -22
  428. package/dist/src/domain/schema/post.d.ts +0 -68
  429. package/dist/src/domain/schema/post.js +0 -35
  430. package/dist/src/domain/schema/profile.d.ts +0 -14
  431. package/dist/src/domain/schema/profile.js +0 -22
  432. package/dist/src/domain/schema/topic.d.ts +0 -24
  433. package/dist/src/domain/schema/topic.js +0 -16
  434. package/dist/src/domain/version.d.ts +0 -15
  435. package/dist/src/domain/version.js +0 -43
  436. package/dist/src/index.d.ts +0 -4
  437. package/dist/src/index.js +0 -8
  438. package/dist/src/layers/App.d.ts +0 -30
  439. package/dist/src/layers/App.js +0 -39
  440. package/dist/src/services/Ai/index.d.ts +0 -13
  441. package/dist/src/services/Ai/index.js +0 -127
  442. package/dist/src/services/Ai/overview.d.ts +0 -7
  443. package/dist/src/services/Ai/overview.js +0 -11
  444. package/dist/src/services/Ai/resources.d.ts +0 -7
  445. package/dist/src/services/Ai/resources.js +0 -59
  446. package/dist/src/services/Ai/shared.d.ts +0 -2
  447. package/dist/src/services/Ai/shared.js +0 -11
  448. package/dist/src/services/Ai/tasks.d.ts +0 -8
  449. package/dist/src/services/Ai/tasks.js +0 -144
  450. package/dist/src/services/Ai/types.d.ts +0 -130
  451. package/dist/src/services/Ai/types.js +0 -1
  452. package/dist/src/services/Api.d.ts +0 -67
  453. package/dist/src/services/Api.js +0 -348
  454. package/dist/src/services/Auth.d.ts +0 -101
  455. package/dist/src/services/Auth.js +0 -402
  456. package/dist/src/services/Backup.d.ts +0 -8
  457. package/dist/src/services/Backup.js +0 -4
  458. package/dist/src/services/Cache.d.ts +0 -8
  459. package/dist/src/services/Cache.js +0 -4
  460. package/dist/src/services/Comment.d.ts +0 -48
  461. package/dist/src/services/Comment.js +0 -102
  462. package/dist/src/services/Config.d.ts +0 -95
  463. package/dist/src/services/Config.js +0 -359
  464. package/dist/src/services/Editor.d.ts +0 -28
  465. package/dist/src/services/Editor.js +0 -95
  466. package/dist/src/services/Lexical.d.ts +0 -27
  467. package/dist/src/services/Lexical.js +0 -56
  468. package/dist/src/services/Migration.d.ts +0 -31
  469. package/dist/src/services/Migration.js +0 -177
  470. package/dist/src/services/Profile.d.ts +0 -29
  471. package/dist/src/services/Profile.js +0 -115
  472. package/dist/src/services/Renderer/content.d.ts +0 -16
  473. package/dist/src/services/Renderer/content.js +0 -110
  474. package/dist/src/services/Renderer/datetime.d.ts +0 -38
  475. package/dist/src/services/Renderer/datetime.js +0 -147
  476. package/dist/src/services/Renderer/errors.d.ts +0 -3
  477. package/dist/src/services/Renderer/errors.js +0 -59
  478. package/dist/src/services/Renderer/index.d.ts +0 -13
  479. package/dist/src/services/Renderer/index.js +0 -11
  480. package/dist/src/services/Renderer/lists.d.ts +0 -1
  481. package/dist/src/services/Renderer/lists.js +0 -101
  482. package/dist/src/services/Renderer/options.d.ts +0 -10
  483. package/dist/src/services/Renderer/options.js +0 -13
  484. package/dist/src/services/Renderer/primitives.d.ts +0 -4
  485. package/dist/src/services/Renderer/primitives.js +0 -12
  486. package/dist/src/services/Renderer/service.d.ts +0 -35
  487. package/dist/src/services/Renderer/service.js +0 -123
  488. package/dist/src/services/Renderer/view.d.ts +0 -16
  489. package/dist/src/services/Renderer/view.js +0 -1
  490. package/dist/src/services/Resolver.d.ts +0 -47
  491. package/dist/src/services/Resolver.js +0 -269
  492. package/dist/src/services/Skill.d.ts +0 -29
  493. package/dist/src/services/Skill.js +0 -421
  494. package/dist/src/services/UpdateNotifier.d.ts +0 -162
  495. package/dist/src/services/UpdateNotifier.js +0 -572
  496. package/dist/test/cli/ai/ai.test.d.ts +0 -1
  497. package/dist/test/cli/ai/ai.test.js +0 -507
  498. package/dist/test/cli/ai/verbs.test.d.ts +0 -1
  499. package/dist/test/cli/ai/verbs.test.js +0 -235
  500. package/dist/test/cli/auth/login.test.d.ts +0 -1
  501. package/dist/test/cli/auth/login.test.js +0 -236
  502. package/dist/test/cli/auth/logout-whoami.test.d.ts +0 -1
  503. package/dist/test/cli/auth/logout-whoami.test.js +0 -124
  504. package/dist/test/cli/auth/status.test.d.ts +0 -1
  505. package/dist/test/cli/auth/status.test.js +0 -90
  506. package/dist/test/cli/category/category.test.d.ts +0 -1
  507. package/dist/test/cli/category/category.test.js +0 -175
  508. package/dist/test/cli/comment/comment.test.d.ts +0 -1
  509. package/dist/test/cli/comment/comment.test.js +0 -445
  510. package/dist/test/cli/config/config.test.d.ts +0 -1
  511. package/dist/test/cli/config/config.test.js +0 -281
  512. package/dist/test/cli/edit-roundtrip.test.d.ts +0 -1
  513. package/dist/test/cli/edit-roundtrip.test.js +0 -259
  514. package/dist/test/cli/file/file.test.d.ts +0 -1
  515. package/dist/test/cli/file/file.test.js +0 -185
  516. package/dist/test/cli/help.test.d.ts +0 -1
  517. package/dist/test/cli/help.test.js +0 -289
  518. package/dist/test/cli/note/create.test.d.ts +0 -1
  519. package/dist/test/cli/note/create.test.js +0 -155
  520. package/dist/test/cli/note/list.test.d.ts +0 -1
  521. package/dist/test/cli/note/list.test.js +0 -115
  522. package/dist/test/cli/note/publish.test.d.ts +0 -1
  523. package/dist/test/cli/note/publish.test.js +0 -123
  524. package/dist/test/cli/page/page.test.d.ts +0 -1
  525. package/dist/test/cli/page/page.test.js +0 -185
  526. package/dist/test/cli/post/create.test.d.ts +0 -1
  527. package/dist/test/cli/post/create.test.js +0 -172
  528. package/dist/test/cli/post/list.test.d.ts +0 -1
  529. package/dist/test/cli/post/list.test.js +0 -133
  530. package/dist/test/cli/post/publish.test.d.ts +0 -1
  531. package/dist/test/cli/post/publish.test.js +0 -139
  532. package/dist/test/cli/post/stage-apply.test.d.ts +0 -1
  533. package/dist/test/cli/post/stage-apply.test.js +0 -215
  534. package/dist/test/cli/post/update.test.d.ts +0 -1
  535. package/dist/test/cli/post/update.test.js +0 -160
  536. package/dist/test/cli/post-note-crud.test.d.ts +0 -1
  537. package/dist/test/cli/post-note-crud.test.js +0 -362
  538. package/dist/test/cli/profile/ls.test.d.ts +0 -1
  539. package/dist/test/cli/profile/ls.test.js +0 -93
  540. package/dist/test/cli/profile/mark-use.test.d.ts +0 -1
  541. package/dist/test/cli/profile/mark-use.test.js +0 -216
  542. package/dist/test/cli/project-crud.test.d.ts +0 -1
  543. package/dist/test/cli/project-crud.test.js +0 -315
  544. package/dist/test/cli/render/lexical.test.d.ts +0 -1
  545. package/dist/test/cli/render/lexical.test.js +0 -216
  546. package/dist/test/cli/render/markdown.test.d.ts +0 -1
  547. package/dist/test/cli/render/markdown.test.js +0 -39
  548. package/dist/test/cli/snippet-crud.test.d.ts +0 -1
  549. package/dist/test/cli/snippet-crud.test.js +0 -293
  550. package/dist/test/cli/topic/topic.test.d.ts +0 -1
  551. package/dist/test/cli/topic/topic.test.js +0 -181
  552. package/dist/test/cli/update.test.d.ts +0 -1
  553. package/dist/test/cli/update.test.js +0 -395
  554. package/dist/test/domain/content-spec.test.d.ts +0 -1
  555. package/dist/test/domain/content-spec.test.js +0 -126
  556. package/dist/test/domain/envelope-compat.test.d.ts +0 -1
  557. package/dist/test/domain/envelope-compat.test.js +0 -126
  558. package/dist/test/domain/envelope.test.d.ts +0 -1
  559. package/dist/test/domain/envelope.test.js +0 -149
  560. package/dist/test/domain/errors.test.d.ts +0 -1
  561. package/dist/test/domain/errors.test.js +0 -127
  562. package/dist/test/domain/gate.test.d.ts +0 -1
  563. package/dist/test/domain/gate.test.js +0 -128
  564. package/dist/test/domain/payload.test.d.ts +0 -1
  565. package/dist/test/domain/payload.test.js +0 -259
  566. package/dist/test/helper/test-fs.d.ts +0 -24
  567. package/dist/test/helper/test-fs.js +0 -161
  568. package/dist/test/helper/test-http.d.ts +0 -31
  569. package/dist/test/helper/test-http.js +0 -66
  570. package/dist/test/integration/_helpers.d.ts +0 -5
  571. package/dist/test/integration/_helpers.js +0 -24
  572. package/dist/test/integration/cli-error-envelope.test.d.ts +0 -1
  573. package/dist/test/integration/cli-error-envelope.test.js +0 -137
  574. package/dist/test/integration/cli-help-render.test.d.ts +0 -1
  575. package/dist/test/integration/cli-help-render.test.js +0 -149
  576. package/dist/test/integration/cli-help.test.d.ts +0 -1
  577. package/dist/test/integration/cli-help.test.js +0 -67
  578. package/dist/test/integration/cli-post-list.test.d.ts +0 -1
  579. package/dist/test/integration/cli-post-list.test.js +0 -140
  580. package/dist/test/integration/cli-skill.test.d.ts +0 -1
  581. package/dist/test/integration/cli-skill.test.js +0 -74
  582. package/dist/test/integration/cli-version.test.d.ts +0 -1
  583. package/dist/test/integration/cli-version.test.js +0 -37
  584. package/dist/test/services/Api.test.d.ts +0 -1
  585. package/dist/test/services/Api.test.js +0 -553
  586. package/dist/test/services/Auth.test.d.ts +0 -1
  587. package/dist/test/services/Auth.test.js +0 -650
  588. package/dist/test/services/Config.test.d.ts +0 -1
  589. package/dist/test/services/Config.test.js +0 -510
  590. package/dist/test/services/Datetime.test.d.ts +0 -1
  591. package/dist/test/services/Datetime.test.js +0 -113
  592. package/dist/test/services/Editor.test.d.ts +0 -1
  593. package/dist/test/services/Editor.test.js +0 -205
  594. package/dist/test/services/Lexical.errors.test.d.ts +0 -1
  595. package/dist/test/services/Lexical.errors.test.js +0 -60
  596. package/dist/test/services/Lexical.test.d.ts +0 -1
  597. package/dist/test/services/Lexical.test.js +0 -68
  598. package/dist/test/services/Migration.test.d.ts +0 -1
  599. package/dist/test/services/Migration.test.js +0 -376
  600. package/dist/test/services/Profile.test.d.ts +0 -1
  601. package/dist/test/services/Profile.test.js +0 -277
  602. package/dist/test/services/Renderer.test.d.ts +0 -1
  603. package/dist/test/services/Renderer.test.js +0 -538
  604. package/dist/test/services/Resolver.test.d.ts +0 -1
  605. package/dist/test/services/Resolver.test.js +0 -320
  606. package/dist/test/services/Skill.test.d.ts +0 -1
  607. package/dist/test/services/Skill.test.js +0 -261
  608. package/dist/test/services/UpdateNotifier.spawn.test.d.ts +0 -1
  609. package/dist/test/services/UpdateNotifier.spawn.test.js +0 -73
  610. package/dist/test/services/UpdateNotifier.test.d.ts +0 -1
  611. package/dist/test/services/UpdateNotifier.test.js +0 -912
@@ -1,912 +0,0 @@
1
- import { mkdtempSync, rmSync, writeFileSync } from 'node:fs';
2
- import os from 'node:os';
3
- import path from 'node:path';
4
- import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
5
- import { Effect } from 'effect';
6
- import { buildUpgradeCommand, compareSemver, detectPackageManager, fetchLatestVersion, make, readCache, satisfiesNodeEngine, shouldSkipNotify, UpdateNotifier, writeCacheAtomic, layer as updateNotifierLayer, } from '../../src/services/UpdateNotifier';
7
- // ---------------------------------------------------------------------------
8
- // Test helpers
9
- // ---------------------------------------------------------------------------
10
- function makeFetchOK(version, etag = 'W/"new"') {
11
- return async () => ({
12
- ok: true,
13
- status: 200,
14
- headers: {
15
- get(name) {
16
- if (name.toLowerCase() === 'etag')
17
- return etag;
18
- return null;
19
- },
20
- },
21
- async json() {
22
- return { version, engines: { node: '>=22' }, dist: { tarball: 'x' } };
23
- },
24
- async text() {
25
- return '';
26
- },
27
- });
28
- }
29
- function makeFetchOKWithEngine(version, engine, etag = 'W/"new"') {
30
- return async () => ({
31
- ok: true,
32
- status: 200,
33
- headers: {
34
- get(name) {
35
- if (name.toLowerCase() === 'etag')
36
- return etag;
37
- return null;
38
- },
39
- },
40
- async json() {
41
- return { version, engines: { node: engine }, dist: { tarball: 'x' } };
42
- },
43
- async text() {
44
- return '';
45
- },
46
- });
47
- }
48
- function makeFetch304() {
49
- return async () => ({
50
- ok: false,
51
- status: 304,
52
- headers: {
53
- get() {
54
- return null;
55
- },
56
- },
57
- async json() {
58
- return {};
59
- },
60
- async text() {
61
- return '';
62
- },
63
- });
64
- }
65
- function makeFetchBroken() {
66
- return async () => {
67
- throw new Error('network down');
68
- };
69
- }
70
- let tmpDir;
71
- beforeEach(() => {
72
- tmpDir = mkdtempSync(path.join(os.tmpdir(), 'mxs-notify-next-'));
73
- });
74
- afterEach(() => {
75
- rmSync(tmpDir, { recursive: true, force: true });
76
- });
77
- // ---------------------------------------------------------------------------
78
- // Pure helpers (mirror legacy self-update.test.ts assertions)
79
- // ---------------------------------------------------------------------------
80
- describe('detectPackageManager', () => {
81
- it('detects npm Linux global install', () => {
82
- const res = detectPackageManager('/usr/local/lib/node_modules/@mx-space/cli/dist/bin/mxs.mjs');
83
- expect(res.kind).toBe('global');
84
- if (res.kind === 'global')
85
- expect(res.pm).toBe('npm');
86
- });
87
- it('detects pnpm macOS global', () => {
88
- const res = detectPackageManager('/Users/x/Library/pnpm/global/5/node_modules/@mx-space/cli/dist/bin/mxs.mjs');
89
- expect(res.kind).toBe('global');
90
- if (res.kind === 'global')
91
- expect(res.pm).toBe('pnpm');
92
- });
93
- it('detects bun global install', () => {
94
- const res = detectPackageManager('/Users/x/.bun/install/global/node_modules/@mx-space/cli/dist/bin/mxs.mjs');
95
- expect(res.kind).toBe('global');
96
- if (res.kind === 'global')
97
- expect(res.pm).toBe('bun');
98
- });
99
- it('detects yarn global install', () => {
100
- const res = detectPackageManager('/Users/x/.config/yarn/global/node_modules/@mx-space/cli/dist/bin/mxs.mjs');
101
- expect(res.kind).toBe('global');
102
- if (res.kind === 'global')
103
- expect(res.pm).toBe('yarn');
104
- });
105
- it('detects monorepo dev source', () => {
106
- const res = detectPackageManager('/repo/packages/cli/src/bin/mxs.ts');
107
- expect(res.kind).toBe('dev');
108
- if (res.kind === 'dev')
109
- expect(res.reason).toBe('monorepo-source');
110
- });
111
- it('detects monorepo dist and other transient caches', () => {
112
- const dist = detectPackageManager('/repo/packages/cli/dist/bin/mxs.mjs');
113
- expect(dist.kind).toBe('dev');
114
- if (dist.kind === 'dev')
115
- expect(dist.reason).toBe('monorepo-dist');
116
- const pnpmDlx = detectPackageManager('/Users/x/.pnpm-store/dlx/abc/node_modules/@mx-space/cli/dist/bin/mxs.mjs');
117
- expect(pnpmDlx.kind).toBe('transient');
118
- if (pnpmDlx.kind === 'transient')
119
- expect(pnpmDlx.cache).toBe('pnpm-dlx');
120
- const bunx = detectPackageManager('/Users/x/.bun/install/cache/@mx-space/cli/dist/bin/mxs.mjs');
121
- expect(bunx.kind).toBe('transient');
122
- if (bunx.kind === 'transient')
123
- expect(bunx.cache).toBe('bunx');
124
- });
125
- it('detects npx transient cache', () => {
126
- const res = detectPackageManager('/Users/x/.npm/_npx/abc/node_modules/@mx-space/cli/dist/bin/mxs.mjs');
127
- expect(res.kind).toBe('transient');
128
- if (res.kind === 'transient')
129
- expect(res.cache).toBe('npx');
130
- });
131
- it('returns unknown when nothing matches', () => {
132
- expect(detectPackageManager('/some/exotic/path/mxs').kind).toBe('unknown');
133
- });
134
- });
135
- describe('compareSemver', () => {
136
- it('orders patch versions', () => {
137
- expect(compareSemver('0.2.0', '0.2.1')).toBe(-1);
138
- expect(compareSemver('0.2.1', '0.2.0')).toBe(1);
139
- expect(compareSemver('0.2.0', '0.2.0')).toBe(0);
140
- });
141
- it('orders prerelease less than release', () => {
142
- expect(compareSemver('1.0.0-rc.1', '1.0.0')).toBe(-1);
143
- });
144
- it('orders prerelease identifiers and falls back for invalid versions', () => {
145
- expect(compareSemver('1.0.0-rc.1', '1.0.0-rc.2')).toBe(-1);
146
- expect(compareSemver('1.0.0-rc.2', '1.0.0-rc.1')).toBe(1);
147
- expect(compareSemver('1.0.0-alpha', '1.0.0-alpha.1')).toBe(-1);
148
- expect(compareSemver('1.0.0-beta.2', '1.0.0-beta.alpha')).toBe(-1);
149
- expect(compareSemver('1.0.0', '1.0.0-rc.1')).toBe(1);
150
- expect(compareSemver('1.0.0-rc.1', '1.0.0-rc')).toBe(1);
151
- expect(compareSemver('1.0.0-rc.alpha', '1.0.0-rc.1')).toBe(1);
152
- expect(compareSemver('bad', 'bad')).toBe(0);
153
- expect(compareSemver('bad-a', 'bad-b')).toBe(-1);
154
- });
155
- });
156
- describe('buildUpgradeCommand', () => {
157
- it('builds npm latest', () => {
158
- expect(buildUpgradeCommand('npm', 'stable')).toEqual({
159
- cmd: 'npm',
160
- args: ['install', '-g', '@mx-space/cli@latest'],
161
- });
162
- });
163
- it('uses @next for prerelease channel', () => {
164
- expect(buildUpgradeCommand('npm', 'next').args).toContain('@mx-space/cli@next');
165
- });
166
- it('builds pnpm, yarn, and bun commands', () => {
167
- expect(buildUpgradeCommand('pnpm', 'stable')).toEqual({
168
- cmd: 'pnpm',
169
- args: ['add', '-g', '@mx-space/cli@latest'],
170
- });
171
- expect(buildUpgradeCommand('yarn', 'stable')).toEqual({
172
- cmd: 'yarn',
173
- args: ['global', 'add', '@mx-space/cli@latest'],
174
- });
175
- expect(buildUpgradeCommand('bun', 'stable')).toEqual({
176
- cmd: 'bun',
177
- args: ['add', '-g', '@mx-space/cli@latest'],
178
- });
179
- });
180
- });
181
- describe('satisfiesNodeEngine', () => {
182
- it('accepts >=N when current is greater', () => {
183
- expect(satisfiesNodeEngine('22.5.0', '>=22')).toBe(true);
184
- });
185
- it('rejects when below range', () => {
186
- expect(satisfiesNodeEngine('20.5.0', '>=22')).toBe(false);
187
- });
188
- it('returns true when range is undefined', () => {
189
- expect(satisfiesNodeEngine('22.5.0', undefined)).toBe(true);
190
- });
191
- it('accepts blank and invalid ranges as non-blocking', () => {
192
- expect(satisfiesNodeEngine('22.5.0', '')).toBe(true);
193
- expect(satisfiesNodeEngine('22.5.0', 'not a range')).toBe(true);
194
- });
195
- });
196
- describe('fetchLatestVersion', () => {
197
- it('returns the latest version', async () => {
198
- const hit = await fetchLatestVersion('stable', {
199
- fetchImpl: makeFetchOK('0.3.0', 'W/"abc"'),
200
- });
201
- expect('notModified' in hit).toBe(false);
202
- if (!('notModified' in hit) || !hit.notModified) {
203
- expect(hit.version).toBe('0.3.0');
204
- expect(hit.etag).toBe('W/"abc"');
205
- }
206
- });
207
- it('honors 304 not-modified', async () => {
208
- const hit = await fetchLatestVersion('stable', {
209
- fetchImpl: makeFetch304(),
210
- etag: 'W/"abc"',
211
- });
212
- expect('notModified' in hit && hit.notModified).toBe(true);
213
- });
214
- it('throws on non-2xx', async () => {
215
- const fetchImpl = async () => ({
216
- ok: false,
217
- status: 500,
218
- headers: { get: () => null },
219
- async json() {
220
- return {};
221
- },
222
- async text() {
223
- return '';
224
- },
225
- });
226
- await expect(fetchLatestVersion('stable', { fetchImpl })).rejects.toThrow(/status 500/);
227
- });
228
- it('uses global fetch and the default registry when no fetch override is supplied', async () => {
229
- const fetchSpy = vi
230
- .spyOn(globalThis, 'fetch')
231
- .mockResolvedValue({
232
- ok: true,
233
- status: 200,
234
- headers: { get: () => null },
235
- async json() {
236
- return { version: '0.5.0' };
237
- },
238
- async text() {
239
- return '';
240
- },
241
- });
242
- try {
243
- const hit = await fetchLatestVersion('stable');
244
- expect(fetchSpy).toHaveBeenCalledWith('https://registry.npmjs.org/@mx-space%2Fcli/latest', expect.objectContaining({
245
- headers: { accept: 'application/json' },
246
- }));
247
- expect('notModified' in hit).toBe(false);
248
- if (!('notModified' in hit))
249
- expect(hit.version).toBe('0.5.0');
250
- }
251
- finally {
252
- fetchSpy.mockRestore();
253
- }
254
- });
255
- });
256
- // ---------------------------------------------------------------------------
257
- // shouldSkipNotify
258
- // ---------------------------------------------------------------------------
259
- describe('shouldSkipNotify', () => {
260
- const base = { currentVersion: '0.2.0', isTTY: true, env: {} };
261
- it('skips when quiet', () => {
262
- expect(shouldSkipNotify({ ...base, quiet: true })).toBe(true);
263
- });
264
- it('skips when json flag', () => {
265
- expect(shouldSkipNotify({ ...base, json: true })).toBe(true);
266
- });
267
- it('skips when json output mode is selected', () => {
268
- expect(shouldSkipNotify({ ...base, output: 'json' })).toBe(true);
269
- });
270
- it('skips when CI is truthy', () => {
271
- expect(shouldSkipNotify({ ...base, env: { CI: 'true' } })).toBe(true);
272
- });
273
- it('does not skip when CI=false', () => {
274
- expect(shouldSkipNotify({ ...base, env: { CI: 'false' } })).toBe(false);
275
- });
276
- it('skips when MXS_NO_UPDATE_CHECK=1', () => {
277
- expect(shouldSkipNotify({ ...base, env: { MXS_NO_UPDATE_CHECK: '1' } })).toBe(true);
278
- });
279
- it('skips when not a TTY', () => {
280
- expect(shouldSkipNotify({ ...base, isTTY: false })).toBe(true);
281
- });
282
- it('skips the update command itself', () => {
283
- expect(shouldSkipNotify({ ...base, commandName: 'update' })).toBe(true);
284
- });
285
- it('skips when invoked below the update parent command', () => {
286
- expect(shouldSkipNotify({ ...base, parentName: 'update' })).toBe(true);
287
- });
288
- });
289
- // ---------------------------------------------------------------------------
290
- // Cache read/write
291
- // ---------------------------------------------------------------------------
292
- describe('cache read/write', () => {
293
- it('writes atomically and reads back', () => {
294
- writeCacheAtomic({ last_check_ts: 123, latest_version: '0.3.0', etag: 'W/"x"' }, tmpDir);
295
- expect(readCache(tmpDir)).toEqual({
296
- last_check_ts: 123,
297
- latest_version: '0.3.0',
298
- etag: 'W/"x"',
299
- });
300
- });
301
- it('returns null on missing file', () => {
302
- expect(readCache(tmpDir)).toBeNull();
303
- });
304
- it('returns null on malformed cache content', () => {
305
- writeCacheAtomic({ last_check_ts: 123 }, tmpDir);
306
- const cacheFile = path.join(tmpDir, 'update-check.json');
307
- rmSync(cacheFile, { force: true });
308
- expect(readCache(tmpDir)).toBeNull();
309
- });
310
- it('returns null when cache content has no numeric timestamp', () => {
311
- const cacheFile = path.join(tmpDir, 'update-check.json');
312
- writeCacheAtomic({ last_check_ts: 123 }, tmpDir);
313
- writeFileSync(cacheFile, JSON.stringify({ latest_version: '0.3.0' }));
314
- expect(readCache(tmpDir)).toBeNull();
315
- });
316
- });
317
- // ---------------------------------------------------------------------------
318
- // maybeNotify — Effect-flavoured behaviour
319
- // ---------------------------------------------------------------------------
320
- describe('maybeNotify', () => {
321
- it('emits when cache has a newer version (within throttle)', async () => {
322
- const t = 1_000_000_000_000;
323
- writeCacheAtomic({ last_check_ts: t - 1000, latest_version: '0.3.0' }, tmpDir);
324
- const lines = [];
325
- const svc = make({ now: () => t });
326
- await Effect.runPromise(svc.maybeNotify({
327
- currentVersion: '0.2.0',
328
- isTTY: true,
329
- env: {},
330
- configDir: tmpDir,
331
- emit: (m) => lines.push(m),
332
- }));
333
- expect(lines).toHaveLength(1);
334
- expect(lines[0]).toMatch(/0\.2\.0 → 0\.3\.0/);
335
- });
336
- it('does not emit when cache version <= current', async () => {
337
- const t = 1_000_000_000_000;
338
- writeCacheAtomic({ last_check_ts: t - 1000, latest_version: '0.2.0' }, tmpDir);
339
- const lines = [];
340
- const svc = make({ now: () => t });
341
- await Effect.runPromise(svc.maybeNotify({
342
- currentVersion: '0.2.0',
343
- isTTY: true,
344
- env: {},
345
- configDir: tmpDir,
346
- emit: (m) => lines.push(m),
347
- }));
348
- expect(lines).toHaveLength(0);
349
- });
350
- it('does not fetch within 24h throttle window (cache fresh)', async () => {
351
- const t = 1_000_000_000_000;
352
- writeCacheAtomic({ last_check_ts: t - 60_000, latest_version: '0.2.0' }, tmpDir);
353
- const fetchImpl = vi.fn(makeFetchOK('0.4.0'));
354
- const svc = make({ now: () => t, fetchImpl: fetchImpl });
355
- await Effect.runPromise(svc.maybeNotify({
356
- currentVersion: '0.2.0',
357
- isTTY: true,
358
- env: {},
359
- configDir: tmpDir,
360
- }));
361
- expect(fetchImpl).not.toHaveBeenCalled();
362
- });
363
- it('fetches when cache is stale (>24h) and writes the new latest', async () => {
364
- const t = 1_000_000_000_000;
365
- const stale = t - 25 * 60 * 60 * 1000;
366
- writeCacheAtomic({ last_check_ts: stale, latest_version: '0.2.0' }, tmpDir);
367
- const lines = [];
368
- const svc = make({
369
- now: () => t,
370
- fetchImpl: makeFetchOK('0.3.0', 'W/"abc"'),
371
- });
372
- await Effect.runPromise(svc.maybeNotify({
373
- currentVersion: '0.2.0',
374
- isTTY: true,
375
- env: {},
376
- configDir: tmpDir,
377
- emit: (m) => lines.push(m),
378
- }));
379
- expect(lines).toHaveLength(0); // silent on the fetching run
380
- expect(readCache(tmpDir)).toEqual({
381
- last_check_ts: t,
382
- latest_version: '0.3.0',
383
- etag: 'W/"abc"',
384
- });
385
- });
386
- it('handles 304 by preserving cached latest_version', async () => {
387
- const t = 1_000_000_000_000;
388
- const stale = t - 25 * 60 * 60 * 1000;
389
- writeCacheAtomic({ last_check_ts: stale, latest_version: '0.3.0', etag: 'W/"old"' }, tmpDir);
390
- const svc = make({ now: () => t, fetchImpl: makeFetch304() });
391
- await Effect.runPromise(svc.maybeNotify({
392
- currentVersion: '0.2.0',
393
- isTTY: true,
394
- env: {},
395
- configDir: tmpDir,
396
- }));
397
- const cache = readCache(tmpDir);
398
- expect(cache?.latest_version).toBe('0.3.0');
399
- expect(cache?.etag).toBe('W/"old"');
400
- expect(cache?.last_check_ts).toBe(t);
401
- });
402
- it('still updates last_check_ts on network failure', async () => {
403
- const t = 1_000_000_000_000;
404
- const svc = make({ now: () => t, fetchImpl: makeFetchBroken() });
405
- await Effect.runPromise(svc.maybeNotify({
406
- currentVersion: '0.2.0',
407
- isTTY: true,
408
- env: {},
409
- configDir: tmpDir,
410
- }));
411
- expect(readCache(tmpDir)?.last_check_ts).toBe(t);
412
- });
413
- it('uses env-selected next channel and per-service configDir', async () => {
414
- const t = 1_000_000_000_000;
415
- const urls = [];
416
- const fetchImpl = async (url) => {
417
- urls.push(url);
418
- return makeFetchOK('0.4.0')(url);
419
- };
420
- const svc = make({ now: () => t, fetchImpl, configDir: tmpDir });
421
- await Effect.runPromise(svc.maybeNotify({
422
- currentVersion: '0.2.0',
423
- isTTY: true,
424
- env: { MXS_UPDATE_CHANNEL: 'next' },
425
- force: true,
426
- }));
427
- expect(urls[0]).toContain('/next');
428
- expect(readCache(tmpDir)?.latest_version).toBe('0.4.0');
429
- });
430
- it('uses XDG_CONFIG_HOME when no config directory override is supplied', async () => {
431
- const previous = process.env.XDG_CONFIG_HOME;
432
- process.env.XDG_CONFIG_HOME = tmpDir;
433
- try {
434
- const svc = make({
435
- now: () => 1_000_000_000_000,
436
- fetchImpl: makeFetchOK('0.4.0'),
437
- });
438
- await Effect.runPromise(svc.maybeNotify({
439
- currentVersion: '0.2.0',
440
- isTTY: true,
441
- env: {},
442
- force: true,
443
- }));
444
- expect(readCache(path.join(tmpDir, 'mxs'))?.latest_version).toBe('0.4.0');
445
- }
446
- finally {
447
- if (previous === undefined)
448
- delete process.env.XDG_CONFIG_HOME;
449
- else
450
- process.env.XDG_CONFIG_HOME = previous;
451
- }
452
- });
453
- it('returns immediately when notify options request a skip', async () => {
454
- const fetchImpl = vi.fn(makeFetchOK('0.4.0'));
455
- const svc = make({ fetchImpl: fetchImpl });
456
- await Effect.runPromise(svc.maybeNotify({
457
- currentVersion: '0.2.0',
458
- isTTY: true,
459
- env: {},
460
- quiet: true,
461
- configDir: tmpDir,
462
- }));
463
- expect(fetchImpl).not.toHaveBeenCalled();
464
- expect(readCache(tmpDir)).toBeNull();
465
- });
466
- it('triggers a background auto-update spawn when cache shows a newer version', async () => {
467
- const t = 1_000_000_000_000;
468
- writeCacheAtomic({ last_check_ts: t - 1000, latest_version: '9.9.9' }, tmpDir);
469
- const lines = [];
470
- const spawnDetached = vi.fn();
471
- const svc = make({
472
- now: () => t,
473
- spawnDetached,
474
- entrypoint: '/usr/local/lib/node_modules/@mx-space/cli/dist/bin/mxs.mjs',
475
- });
476
- await Effect.runPromise(svc.maybeNotify({
477
- currentVersion: '0.2.0',
478
- isTTY: true,
479
- env: {},
480
- configDir: tmpDir,
481
- emit: (m) => lines.push(m),
482
- }));
483
- expect(spawnDetached).toHaveBeenCalledOnce();
484
- const [cmd, args, logPath] = spawnDetached.mock.calls[0];
485
- expect(cmd).toBe('npm');
486
- expect(args.join(' ')).toBe('install -g @mx-space/cli@latest');
487
- expect(logPath).toBe(path.join(tmpDir, 'auto-update.log'));
488
- expect(lines[0]).toMatch(/auto-updating 0\.2\.0 → 9\.9\.9 in background/);
489
- expect(readCache(tmpDir)?.last_auto_update_ts).toBe(t);
490
- });
491
- it('throttles auto-update within 24h of the previous spawn', async () => {
492
- const t = 1_000_000_000_000;
493
- writeCacheAtomic({
494
- last_check_ts: t - 1000,
495
- latest_version: '9.9.9',
496
- last_auto_update_ts: t - 60_000,
497
- }, tmpDir);
498
- const lines = [];
499
- const spawnDetached = vi.fn();
500
- const svc = make({
501
- now: () => t,
502
- spawnDetached,
503
- entrypoint: '/usr/local/lib/node_modules/@mx-space/cli/dist/bin/mxs.mjs',
504
- });
505
- await Effect.runPromise(svc.maybeNotify({
506
- currentVersion: '0.2.0',
507
- isTTY: true,
508
- env: {},
509
- configDir: tmpDir,
510
- emit: (m) => lines.push(m),
511
- }));
512
- expect(spawnDetached).not.toHaveBeenCalled();
513
- expect(lines[0]).toMatch(/run 'mxs update' to upgrade/);
514
- });
515
- it('honours MXS_NO_AUTO_UPDATE=1 by reverting to the legacy notify line', async () => {
516
- const t = 1_000_000_000_000;
517
- writeCacheAtomic({ last_check_ts: t - 1000, latest_version: '9.9.9' }, tmpDir);
518
- const lines = [];
519
- const spawnDetached = vi.fn();
520
- const svc = make({
521
- now: () => t,
522
- spawnDetached,
523
- entrypoint: '/usr/local/lib/node_modules/@mx-space/cli/dist/bin/mxs.mjs',
524
- });
525
- await Effect.runPromise(svc.maybeNotify({
526
- currentVersion: '0.2.0',
527
- isTTY: true,
528
- env: { MXS_NO_AUTO_UPDATE: '1' },
529
- configDir: tmpDir,
530
- emit: (m) => lines.push(m),
531
- }));
532
- expect(spawnDetached).not.toHaveBeenCalled();
533
- expect(lines[0]).toMatch(/run 'mxs update' to upgrade/);
534
- });
535
- it('does not auto-update when running from a transient install', async () => {
536
- const t = 1_000_000_000_000;
537
- writeCacheAtomic({ last_check_ts: t - 1000, latest_version: '9.9.9' }, tmpDir);
538
- const spawnDetached = vi.fn();
539
- const svc = make({
540
- now: () => t,
541
- spawnDetached,
542
- entrypoint: '/Users/x/.npm/_npx/abc/node_modules/@mx-space/cli/dist/bin/mxs.mjs',
543
- });
544
- await Effect.runPromise(svc.maybeNotify({
545
- currentVersion: '0.2.0',
546
- isTTY: true,
547
- env: {},
548
- configDir: tmpDir,
549
- }));
550
- expect(spawnDetached).not.toHaveBeenCalled();
551
- });
552
- it('triggers auto-update on the fresh-fetch path when registry returns a newer version', async () => {
553
- const t = 1_000_000_000_000;
554
- const spawnDetached = vi.fn();
555
- const svc = make({
556
- now: () => t,
557
- fetchImpl: makeFetchOK('0.3.0'),
558
- spawnDetached,
559
- entrypoint: '/usr/local/lib/node_modules/@mx-space/cli/dist/bin/mxs.mjs',
560
- });
561
- await Effect.runPromise(svc.maybeNotify({
562
- currentVersion: '0.2.0',
563
- isTTY: true,
564
- env: {},
565
- configDir: tmpDir,
566
- }));
567
- expect(spawnDetached).toHaveBeenCalledOnce();
568
- expect(readCache(tmpDir)?.last_auto_update_ts).toBe(t);
569
- });
570
- it('never throws even when the cache dir is unwritable', async () => {
571
- const svc = make({
572
- now: () => 1,
573
- fetchImpl: makeFetchOK('0.3.0'),
574
- });
575
- await expect(Effect.runPromise(svc.maybeNotify({
576
- currentVersion: '0.2.0',
577
- isTTY: true,
578
- env: {},
579
- configDir: '/dev/null/missing',
580
- }))).resolves.toBeUndefined();
581
- });
582
- });
583
- // ---------------------------------------------------------------------------
584
- // runUpdate — pm detection / engine / spawn outcomes
585
- // ---------------------------------------------------------------------------
586
- describe('runUpdate', () => {
587
- it('fails UpdateDevEnvironment when running from monorepo source', async () => {
588
- const svc = make({ fetchImpl: makeFetchOK('9.9.9') });
589
- const exit = await Effect.runPromiseExit(svc.runUpdate({
590
- currentVersion: '0.2.0',
591
- entrypoint: '/repo/packages/cli/src/bin/mxs.ts',
592
- yes: true,
593
- json: true,
594
- }));
595
- expect(exit._tag).toBe('Failure');
596
- if (exit._tag === 'Failure') {
597
- const err = exit.cause.error ?? exit.cause.failure;
598
- const tag = err?._tag ?? extractTag(exit.cause);
599
- expect(tag).toBe('UpdateDevEnvironment');
600
- }
601
- });
602
- it('fails UpdatePmUnknown when pm cannot be detected', async () => {
603
- const svc = make({ fetchImpl: makeFetchOK('9.9.9') });
604
- const exit = await Effect.runPromiseExit(svc.runUpdate({
605
- currentVersion: '0.2.0',
606
- entrypoint: '/some/exotic/path/mxs',
607
- yes: true,
608
- json: true,
609
- }));
610
- expect(exit._tag).toBe('Failure');
611
- if (exit._tag === 'Failure') {
612
- expect(extractTag(exit.cause)).toBe('UpdatePmUnknown');
613
- }
614
- });
615
- it('fails UpdateRegistryUnreachable when fetch throws', async () => {
616
- const svc = make({ fetchImpl: makeFetchBroken() });
617
- const exit = await Effect.runPromiseExit(svc.runUpdate({
618
- currentVersion: '0.2.0',
619
- entrypoint: '/usr/local/lib/node_modules/@mx-space/cli/dist/bin/mxs.mjs',
620
- yes: true,
621
- json: true,
622
- }));
623
- expect(exit._tag).toBe('Failure');
624
- if (exit._tag === 'Failure') {
625
- expect(extractTag(exit.cause)).toBe('UpdateRegistryUnreachable');
626
- }
627
- });
628
- it('returns up-to-date result without spawning when local >= registry latest', async () => {
629
- const spawnImpl = vi.fn();
630
- const svc = make({ fetchImpl: makeFetchOK('0.2.0'), spawnImpl });
631
- const res = await Effect.runPromise(svc.runUpdate({
632
- currentVersion: '0.2.0',
633
- entrypoint: '/usr/local/lib/node_modules/@mx-space/cli/dist/bin/mxs.mjs',
634
- yes: true,
635
- json: true,
636
- }));
637
- expect(res.upToDate).toBe(true);
638
- expect(res.upgraded).toBe(false);
639
- expect(spawnImpl).not.toHaveBeenCalled();
640
- });
641
- it('returns dry-run result when --dry-run set', async () => {
642
- const spawnImpl = vi.fn();
643
- const svc = make({ fetchImpl: makeFetchOK('9.9.9'), spawnImpl });
644
- const res = await Effect.runPromise(svc.runUpdate({
645
- currentVersion: '0.2.0',
646
- entrypoint: '/usr/local/lib/node_modules/@mx-space/cli/dist/bin/mxs.mjs',
647
- dryRun: true,
648
- yes: true,
649
- json: true,
650
- }));
651
- expect(res.dryRun).toBe(true);
652
- expect(res.upgraded).toBe(false);
653
- expect(res.command).toMatch(/^npm install -g @mx-space\/cli@latest$/);
654
- expect(spawnImpl).not.toHaveBeenCalled();
655
- });
656
- it('emits the exact command for non-json dry-run updates', async () => {
657
- const lines = [];
658
- const spawnImpl = vi.fn();
659
- const svc = make({
660
- fetchImpl: makeFetchOK('9.9.9'),
661
- spawnImpl,
662
- emitInfo: (line) => lines.push(line),
663
- });
664
- const res = await Effect.runPromise(svc.runUpdate({
665
- currentVersion: '0.2.0',
666
- entrypoint: '/usr/local/lib/node_modules/@mx-space/cli/dist/bin/mxs.mjs',
667
- dryRun: true,
668
- yes: true,
669
- json: false,
670
- }));
671
- expect(res.command).toBe('npm install -g @mx-space/cli@latest');
672
- expect(lines.join('\n')).toContain('would run');
673
- expect(spawnImpl).not.toHaveBeenCalled();
674
- });
675
- it('returns check-only result and emits non-json announcement', async () => {
676
- const lines = [];
677
- const spawnImpl = vi.fn();
678
- const svc = make({
679
- fetchImpl: makeFetchOK('9.9.9'),
680
- spawnImpl,
681
- emitInfo: (line) => lines.push(line),
682
- });
683
- const res = await Effect.runPromise(svc.runUpdate({
684
- currentVersion: '0.2.0',
685
- entrypoint: '/usr/local/lib/node_modules/@mx-space/cli/dist/bin/mxs.mjs',
686
- check: true,
687
- json: false,
688
- }));
689
- expect(res).toMatchObject({ dryRun: true, upToDate: false });
690
- expect(lines.join('\n')).toContain('0.2.0 → 9.9.9');
691
- expect(spawnImpl).not.toHaveBeenCalled();
692
- });
693
- it('supports --pm override and prerelease channel', async () => {
694
- const spawnImpl = vi.fn(async () => ({ status: 0, stderr: '' }));
695
- const svc = make({ fetchImpl: makeFetchOK('9.9.9'), spawnImpl });
696
- const res = await Effect.runPromise(svc.runUpdate({
697
- currentVersion: '0.2.0',
698
- entrypoint: '/some/exotic/path/mxs',
699
- pm: 'pnpm',
700
- prerelease: true,
701
- yes: true,
702
- json: true,
703
- }));
704
- expect(res.channel).toBe('next');
705
- expect(res.pm).toBe('pnpm');
706
- expect(res.command).toBe('pnpm add -g @mx-space/cli@next');
707
- });
708
- it('maps unexpected 304 during runUpdate to UpdateRegistryUnreachable', async () => {
709
- const svc = make({ fetchImpl: makeFetch304() });
710
- const exit = await Effect.runPromiseExit(svc.runUpdate({
711
- currentVersion: '0.2.0',
712
- entrypoint: '/usr/local/lib/node_modules/@mx-space/cli/dist/bin/mxs.mjs',
713
- yes: true,
714
- json: true,
715
- }));
716
- expect(exit._tag).toBe('Failure');
717
- if (exit._tag === 'Failure') {
718
- expect(extractTag(exit.cause)).toBe('UpdateRegistryUnreachable');
719
- }
720
- });
721
- it('auto-installs without prompting even when stdin/stderr are TTYs', async () => {
722
- const stdinTty = Object.getOwnPropertyDescriptor(process.stdin, 'isTTY');
723
- const stderrTty = Object.getOwnPropertyDescriptor(process.stderr, 'isTTY');
724
- Object.defineProperty(process.stdin, 'isTTY', {
725
- configurable: true,
726
- value: true,
727
- });
728
- Object.defineProperty(process.stderr, 'isTTY', {
729
- configurable: true,
730
- value: true,
731
- });
732
- const confirmImpl = vi.fn(async () => false);
733
- const spawnImpl = vi.fn(async () => ({ status: 0, stderr: '' }));
734
- try {
735
- const svc = make({
736
- fetchImpl: makeFetchOK('9.9.9'),
737
- spawnImpl,
738
- confirmImpl,
739
- });
740
- const res = await Effect.runPromise(svc.runUpdate({
741
- currentVersion: '0.2.0',
742
- entrypoint: '/usr/local/lib/node_modules/@mx-space/cli/dist/bin/mxs.mjs',
743
- yes: false,
744
- json: false,
745
- }));
746
- expect(res.upgraded).toBe(true);
747
- expect(res.cancelled).toBeUndefined();
748
- expect(confirmImpl).not.toHaveBeenCalled();
749
- expect(spawnImpl).toHaveBeenCalledOnce();
750
- }
751
- finally {
752
- if (stdinTty)
753
- Object.defineProperty(process.stdin, 'isTTY', stdinTty);
754
- if (stderrTty)
755
- Object.defineProperty(process.stderr, 'isTTY', stderrTty);
756
- }
757
- });
758
- it('maps spawn failures to UpdateSpawnFailed', async () => {
759
- const spawnSvc = make({
760
- fetchImpl: makeFetchOK('9.9.9'),
761
- spawnImpl: async () => {
762
- throw new Error('spawn failed');
763
- },
764
- });
765
- const spawnExit = await Effect.runPromiseExit(spawnSvc.runUpdate({
766
- currentVersion: '0.2.0',
767
- entrypoint: '/usr/local/lib/node_modules/@mx-space/cli/dist/bin/mxs.mjs',
768
- yes: true,
769
- json: true,
770
- }));
771
- expect(spawnExit._tag).toBe('Failure');
772
- if (spawnExit._tag === 'Failure') {
773
- expect(extractTag(spawnExit.cause)).toBe('UpdateSpawnFailed');
774
- }
775
- });
776
- it('maps nonzero non-permission spawn status to UpdateSpawnFailed', async () => {
777
- const svc = make({
778
- fetchImpl: makeFetchOK('9.9.9'),
779
- spawnImpl: async () => ({ status: 2, stderr: 'regular failure' }),
780
- });
781
- const exit = await Effect.runPromiseExit(svc.runUpdate({
782
- currentVersion: '0.2.0',
783
- entrypoint: '/usr/local/lib/node_modules/@mx-space/cli/dist/bin/mxs.mjs',
784
- yes: true,
785
- json: true,
786
- }));
787
- expect(exit._tag).toBe('Failure');
788
- if (exit._tag === 'Failure') {
789
- expect(extractTag(exit.cause)).toBe('UpdateSpawnFailed');
790
- }
791
- });
792
- it('maps transient installs to UpdateTransientInstall', async () => {
793
- const svc = make({ fetchImpl: makeFetchOK('9.9.9') });
794
- const exit = await Effect.runPromiseExit(svc.runUpdate({
795
- currentVersion: '0.2.0',
796
- entrypoint: '/Users/x/.npm/_npx/abc/node_modules/@mx-space/cli/dist/bin/mxs.mjs',
797
- yes: true,
798
- json: true,
799
- }));
800
- expect(exit._tag).toBe('Failure');
801
- if (exit._tag === 'Failure') {
802
- expect(extractTag(exit.cause)).toBe('UpdateTransientInstall');
803
- }
804
- });
805
- it('returns upgraded=true on successful spawn', async () => {
806
- const spawnImpl = vi.fn(async () => ({ status: 0, stderr: '' }));
807
- const svc = make({ fetchImpl: makeFetchOK('9.9.9'), spawnImpl });
808
- const res = await Effect.runPromise(svc.runUpdate({
809
- currentVersion: '0.2.0',
810
- entrypoint: '/usr/local/lib/node_modules/@mx-space/cli/dist/bin/mxs.mjs',
811
- yes: true,
812
- json: true,
813
- }));
814
- expect(res.upgraded).toBe(true);
815
- expect(res.toVersion).toBe('9.9.9');
816
- expect(spawnImpl).toHaveBeenCalledOnce();
817
- });
818
- it('emits restart guidance after a non-json successful spawn', async () => {
819
- const lines = [];
820
- const spawnImpl = vi.fn(async () => ({ status: 0, stderr: '' }));
821
- const svc = make({
822
- fetchImpl: makeFetchOK('9.9.9'),
823
- spawnImpl,
824
- emitInfo: (line) => lines.push(line),
825
- });
826
- const res = await Effect.runPromise(svc.runUpdate({
827
- currentVersion: '0.2.0',
828
- entrypoint: '/usr/local/lib/node_modules/@mx-space/cli/dist/bin/mxs.mjs',
829
- yes: true,
830
- json: false,
831
- }));
832
- expect(res.upgraded).toBe(true);
833
- expect(lines.join('\n')).toContain('Restart any long-running mxs process');
834
- });
835
- it('maps EACCES stderr to UpdatePermissionDenied', async () => {
836
- const spawnImpl = async () => ({
837
- status: 1,
838
- stderr: 'npm ERR! Error: EACCES: permission denied',
839
- });
840
- const svc = make({ fetchImpl: makeFetchOK('9.9.9'), spawnImpl });
841
- const exit = await Effect.runPromiseExit(svc.runUpdate({
842
- currentVersion: '0.2.0',
843
- entrypoint: '/usr/local/lib/node_modules/@mx-space/cli/dist/bin/mxs.mjs',
844
- yes: true,
845
- json: true,
846
- }));
847
- expect(exit._tag).toBe('Failure');
848
- if (exit._tag === 'Failure') {
849
- expect(extractTag(exit.cause)).toBe('UpdatePermissionDenied');
850
- }
851
- });
852
- it('fails UpdateNodeIncompatible when registry engine excludes current node', async () => {
853
- const svc = make({
854
- fetchImpl: makeFetchOKWithEngine('9.9.9', '>=99'),
855
- });
856
- const exit = await Effect.runPromiseExit(svc.runUpdate({
857
- currentVersion: '0.2.0',
858
- entrypoint: '/usr/local/lib/node_modules/@mx-space/cli/dist/bin/mxs.mjs',
859
- nodeVersion: '22.0.0',
860
- yes: true,
861
- json: true,
862
- }));
863
- expect(exit._tag).toBe('Failure');
864
- if (exit._tag === 'Failure') {
865
- expect(extractTag(exit.cause)).toBe('UpdateNodeIncompatible');
866
- }
867
- });
868
- it('rejects unknown --pm override with UpdatePmUnknown', async () => {
869
- const svc = make({ fetchImpl: makeFetchOK('9.9.9') });
870
- const exit = await Effect.runPromiseExit(svc.runUpdate({
871
- currentVersion: '0.2.0',
872
- entrypoint: '/usr/local/lib/node_modules/@mx-space/cli/dist/bin/mxs.mjs',
873
- pm: 'snap',
874
- yes: true,
875
- json: true,
876
- }));
877
- expect(exit._tag).toBe('Failure');
878
- if (exit._tag === 'Failure') {
879
- expect(extractTag(exit.cause)).toBe('UpdatePmUnknown');
880
- }
881
- });
882
- });
883
- describe('UpdateNotifier layer', () => {
884
- it('provides a service through the exported layer factory', async () => {
885
- const result = await Effect.runPromise(Effect.gen(function* () {
886
- const notifier = yield* UpdateNotifier;
887
- return typeof notifier.maybeNotify;
888
- }).pipe(Effect.provide(updateNotifierLayer())));
889
- expect(result).toBe('function');
890
- });
891
- });
892
- // extract a TaggedError tag from an Effect Cause without depending on internals
893
- function extractTag(cause) {
894
- const seen = new Set();
895
- const visit = (node) => {
896
- if (!node || typeof node !== 'object' || seen.has(node))
897
- return undefined;
898
- seen.add(node);
899
- const obj = node;
900
- if (typeof obj._tag === 'string' && obj._tag.startsWith('Update'))
901
- return obj._tag;
902
- if (typeof obj._tag === 'string' && /^(Update|Auth|Validation|Resource|Server|Network|Config|Profile|Argv|Generic|Write)/.test(obj._tag))
903
- return obj._tag;
904
- for (const v of Object.values(obj)) {
905
- const t = visit(v);
906
- if (t)
907
- return t;
908
- }
909
- return undefined;
910
- };
911
- return visit(cause);
912
- }