@astryxdesign/cli 0.7.2-canary.fdd384f → 0.7.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 (450) hide show
  1. package/CHANGELOG.md +119 -0
  2. package/README.md +169 -149
  3. package/api/build/_adapter.d.mts +8 -0
  4. package/api/build/_adapter.mjs +12 -1
  5. package/api/build/build.doc.mjs +4 -0
  6. package/api/build/kit/kit.mjs +3 -11
  7. package/api/component/_adapter.d.mts +31 -0
  8. package/api/component/_adapter.mjs +119 -11
  9. package/api/component/component.doc.mjs +6 -1
  10. package/api/component/component.mjs +60 -10
  11. package/api/component/doc-links.test.mjs +386 -0
  12. package/api/discover/_adapter.d.mts +132 -12
  13. package/api/discover/_adapter.mjs +488 -27
  14. package/api/discover/_adapter.test.mjs +599 -17
  15. package/api/discover/_catalog-view.d.mts +16 -5
  16. package/api/discover/_catalog-view.mjs +32 -8
  17. package/api/discover/detail/doc/doc.mjs +9 -1
  18. package/api/discover/discover.d.mts +11 -0
  19. package/api/discover/discover.doc.mjs +9 -7
  20. package/api/discover/discover.mjs +121 -19
  21. package/api/discover/discover.type.d.mts +20 -7
  22. package/api/discover/discover.type.mjs +17 -7
  23. package/api/discover/list/list.d.mts +4 -3
  24. package/api/discover/list/list.mjs +17 -10
  25. package/api/docs/_adapter.d.mts +63 -0
  26. package/api/docs/_adapter.mjs +312 -18
  27. package/api/docs/docs.doc.mjs +2 -1
  28. package/api/docs/docs.mjs +2 -1
  29. package/api/docs/docs.test.mjs +5 -2
  30. package/api/docs/integration-tree.test.mjs +22 -0
  31. package/api/docs/list/list.mjs +12 -2
  32. package/api/docs/reference-blocks.test.mjs +1 -3
  33. package/api/doctor/_adapter.d.mts +108 -0
  34. package/api/doctor/_adapter.mjs +223 -4
  35. package/api/doctor/doctor.d.mts +199 -0
  36. package/api/doctor/doctor.doc.mjs +3 -2
  37. package/api/doctor/doctor.mjs +530 -34
  38. package/api/doctor/doctor.test.mjs +180 -14
  39. package/api/doctor/release-checks.test.mjs +156 -0
  40. package/api/doctor/theme-checks.mjs +16 -3
  41. package/api/doctor/theme-checks.test.mjs +223 -7
  42. package/api/error.d.mts +10 -0
  43. package/api/error.mjs +25 -0
  44. package/api/gap-report/gap-report.d.mts +3 -0
  45. package/api/gap-report/gap-report.doc.mjs +11 -3
  46. package/api/gap-report/gap-report.mjs +152 -48
  47. package/api/gap-report/gap-report.test.mjs +233 -0
  48. package/api/gap-report/gap-report.type.d.mts +41 -0
  49. package/api/gap-report/gap-report.type.mjs +18 -0
  50. package/api/hook/_adapter.mjs +3 -11
  51. package/api/hook/hook.doc.mjs +4 -0
  52. package/api/hook/list/list.d.mts +1 -1
  53. package/api/init/_adapter.d.mts +22 -0
  54. package/api/init/_adapter.mjs +59 -0
  55. package/api/init/init.d.mts +7 -5
  56. package/api/init/init.doc.mjs +28 -7
  57. package/api/init/init.mjs +28 -4
  58. package/api/init/init.type.d.mts +48 -3
  59. package/api/init/init.type.mjs +37 -3
  60. package/api/init/run/run.d.mts +1 -1
  61. package/api/init/run/run.mjs +15 -4
  62. package/api/init/user/user.d.mts +14 -0
  63. package/api/init/user/user.mjs +87 -0
  64. package/api/init/user/user.test.mjs +232 -0
  65. package/api/integration/_adapter.d.mts +33 -0
  66. package/api/integration/_adapter.mjs +58 -0
  67. package/api/integration/authoring-checks.mjs +100 -5
  68. package/api/integration/authoring-checks.test.mjs +769 -0
  69. package/api/integration/authoring-checks.type.d.mts +134 -0
  70. package/api/integration/authoring-checks.type.mjs +60 -1
  71. package/api/integration/integrationCheck.doc.mjs +1 -1
  72. package/api/integration/integrationComponentConflicts.doc.mjs +11 -3
  73. package/api/integration/integrationDocConflicts.doc.mjs +22 -5
  74. package/api/integration/pack-check.mjs +303 -13
  75. package/api/integration/pack-check.test.mjs +371 -10
  76. package/api/integration/validate-integration-fixes.test.mjs +67 -0
  77. package/api/integration/validate-integration.d.mts +8 -0
  78. package/api/integration/validate-integration.mjs +55 -9
  79. package/api/integration/validate-integration.test.mjs +77 -8
  80. package/api/integration/validate-integration.type.d.mts +8 -0
  81. package/api/integration/validate-integration.type.mjs +3 -1
  82. package/api/integration/validate-unread-theme-folders.test.mjs +3 -2
  83. package/api/integration/validateIntegration.doc.mjs +4 -2
  84. package/api/search/_adapter.d.mts +11 -0
  85. package/api/search/_adapter.mjs +25 -0
  86. package/api/search/search.d.mts +73 -13
  87. package/api/search/search.doc.mjs +8 -3
  88. package/api/search/search.domain-priority.test.mjs +108 -18
  89. package/api/search/search.mjs +541 -52
  90. package/api/search/search.test.mjs +143 -1
  91. package/api/search/search.type.d.mts +14 -1
  92. package/api/search/search.type.mjs +6 -1
  93. package/api/swizzle/_adapter.mjs +2 -2
  94. package/api/swizzle/copy/copy.mjs +1 -1
  95. package/api/template/template-integration.test.mjs +1 -1
  96. package/api/theme/_adapter.d.mts +16 -0
  97. package/api/theme/_adapter.mjs +32 -5
  98. package/api/theme/build/build.d.mts +2 -1
  99. package/api/theme/build/build.mjs +70 -14
  100. package/api/theme/build/build.packed-old-core.test.mjs +20 -3
  101. package/api/theme/build/font-warning.mjs +5 -3
  102. package/api/theme/build/font-warning.test.mjs +2 -1
  103. package/api/theme/remove/remove.test.mjs +2 -2
  104. package/api/theme/targets/targets.mjs +3 -10
  105. package/api/theme/themeTargets.doc.mjs +4 -0
  106. package/api/theme/use/use.test.mjs +1 -1
  107. package/api/upgrade/_adapter.d.mts +40 -2
  108. package/api/upgrade/_adapter.mjs +118 -5
  109. package/api/upgrade/run/cli-behind-core.test.mjs +438 -0
  110. package/api/upgrade/run/run.mjs +35 -2
  111. package/api/upgrade/status/status.d.mts +21 -5
  112. package/api/upgrade/status/status.mjs +45 -8
  113. package/api/upgrade/upgrade.doc.mjs +6 -3
  114. package/api/upgrade/upgrade.mjs +5 -1
  115. package/api/upgrade/upgrade.type.d.mts +23 -0
  116. package/api/upgrade/upgrade.type.mjs +16 -1
  117. package/assets/codemods/__tests__/registry.test.mjs +1 -0
  118. package/assets/codemods/registry.mjs +1 -0
  119. package/assets/codemods/runner.mjs +7 -1
  120. package/assets/codemods/transforms/next/index.mjs +1 -11
  121. package/assets/codemods/transforms/v0.7.2/index.mjs +20 -0
  122. package/assets/discover/official-packages.json +367 -0
  123. package/assets/docs/author-a-theme.doc.mjs +2 -2
  124. package/assets/docs/browser-support.doc.mjs +1 -1
  125. package/assets/docs/getting-started.doc.mjs +23 -3
  126. package/assets/docs/styling-overview.doc.mjs +1 -1
  127. package/assets/docs/theme.doc.mjs +1 -1
  128. package/assets/docs/tree/add-a-component.doc.mjs +12 -2
  129. package/assets/docs/tree/add-a-theme.doc.mjs +13 -3
  130. package/assets/docs/tree/add-a-topic.doc.mjs +54 -9
  131. package/assets/docs/tree/agent-guidance.doc.mjs +19 -5
  132. package/assets/docs/tree/block-template.doc.mjs +6 -18
  133. package/assets/docs/tree/build-the-template.doc.mjs +1 -1
  134. package/assets/docs/tree/building-blocks.doc.mjs +4 -0
  135. package/assets/docs/tree/check-the-props.doc.mjs +8 -3
  136. package/assets/docs/tree/check-your-docs.doc.mjs +30 -13
  137. package/assets/docs/tree/checks.doc.mjs +17 -17
  138. package/assets/docs/tree/ci-and-containers.doc.mjs +88 -0
  139. package/assets/docs/tree/cli-command.doc.mjs +142 -0
  140. package/assets/docs/tree/cli.doc.mjs +6 -0
  141. package/assets/docs/tree/codemods.doc.mjs +17 -7
  142. package/assets/docs/tree/commands.doc.mjs +7 -1
  143. package/assets/docs/tree/component-family.doc.mjs +3 -5
  144. package/assets/docs/tree/component-imports.doc.mjs +13 -3
  145. package/assets/docs/tree/components.doc.mjs +7 -1
  146. package/assets/docs/tree/computer-agent-guide.doc.mjs +160 -0
  147. package/assets/docs/tree/computer-integrations.doc.mjs +93 -0
  148. package/assets/docs/tree/configuration.doc.mjs +7 -3
  149. package/assets/docs/tree/debug-and-gap-reports.doc.mjs +41 -22
  150. package/assets/docs/tree/define-the-theme.doc.mjs +6 -5
  151. package/assets/docs/tree/describe-the-component.doc.mjs +2 -2
  152. package/assets/docs/tree/docs.doc.mjs +9 -3
  153. package/assets/docs/tree/document-the-template.doc.mjs +1 -1
  154. package/assets/docs/tree/document-the-theme.doc.mjs +3 -3
  155. package/assets/docs/tree/export-template-assets.doc.mjs +1 -1
  156. package/assets/docs/tree/extend-or-replace.doc.mjs +19 -9
  157. package/assets/docs/tree/fonts-and-assets.doc.mjs +2 -2
  158. package/assets/docs/tree/generate-a-palette.doc.mjs +7 -5
  159. package/assets/docs/tree/global-integrations.doc.mjs +124 -0
  160. package/assets/docs/tree/global.doc.mjs +131 -0
  161. package/assets/docs/tree/grade-template-with-agent.doc.mjs +5 -5
  162. package/assets/docs/tree/install-once.doc.mjs +105 -0
  163. package/assets/docs/tree/integrations.doc.mjs +13 -1
  164. package/assets/docs/tree/layout-spacing.doc.mjs +2 -3
  165. package/assets/docs/tree/layout.doc.mjs +6 -6
  166. package/assets/docs/tree/links.doc.mjs +6 -5
  167. package/assets/docs/tree/migration-setup.doc.mjs +3 -2
  168. package/assets/docs/tree/migration-verification.doc.mjs +0 -1
  169. package/assets/docs/tree/migration.doc.mjs +0 -1
  170. package/assets/docs/tree/monorepos.doc.mjs +84 -0
  171. package/assets/docs/tree/package-and-test.doc.mjs +1 -1
  172. package/assets/docs/tree/page-template.doc.mjs +3 -7
  173. package/assets/docs/tree/problems.doc.mjs +205 -0
  174. package/assets/docs/tree/project-global-or-both.doc.mjs +131 -0
  175. package/assets/docs/tree/publishing.doc.mjs +6 -6
  176. package/assets/docs/tree/quick-start.doc.mjs +52 -26
  177. package/assets/docs/tree/reference.doc.mjs +192 -0
  178. package/assets/docs/tree/replace-a-core-component.doc.mjs +15 -7
  179. package/assets/docs/tree/replace-a-core-template.doc.mjs +9 -11
  180. package/assets/docs/tree/scaffold.doc.mjs +1 -1
  181. package/assets/docs/tree/sections-and-placement.doc.mjs +9 -11
  182. package/assets/docs/tree/see-it-in-an-app.doc.mjs +17 -5
  183. package/assets/docs/tree/short-and-findable.doc.mjs +9 -8
  184. package/assets/docs/tree/single-component.doc.mjs +14 -6
  185. package/assets/docs/tree/start-a-template.doc.mjs +18 -8
  186. package/assets/docs/tree/subcomponent.doc.mjs +6 -6
  187. package/assets/docs/tree/template-assets.doc.mjs +2 -2
  188. package/assets/docs/tree/template-doc-overview.doc.mjs +6 -17
  189. package/assets/docs/tree/template-fonts.doc.mjs +1 -1
  190. package/assets/docs/tree/template-icons.doc.mjs +1 -1
  191. package/assets/docs/tree/template-images-media.doc.mjs +1 -1
  192. package/assets/docs/tree/template-styles.doc.mjs +2 -2
  193. package/assets/docs/tree/templates.doc.mjs +7 -1
  194. package/assets/docs/tree/test-in-an-app.doc.mjs +7 -7
  195. package/assets/docs/tree/test-template-in-app.doc.mjs +5 -5
  196. package/assets/docs/tree/themes.doc.mjs +4 -0
  197. package/assets/docs/tree/tokens-and-setup.doc.mjs +19 -15
  198. package/assets/docs/tree/troubleshooting.doc.mjs +22 -14
  199. package/assets/docs/tree/uninstall.doc.mjs +109 -0
  200. package/assets/docs/tree/updates.doc.mjs +92 -0
  201. package/assets/docs/tree/upgrading.doc.mjs +6 -6
  202. package/assets/docs/tree/use-a-theme-in-an-app.doc.mjs +14 -2
  203. package/assets/docs/tree/verify-packed-template.doc.mjs +3 -3
  204. package/assets/docs/tree/versioning.doc.mjs +9 -9
  205. package/assets/docs/tree/who-answers.doc.mjs +119 -0
  206. package/assets/docs/tree/write-the-template-file.doc.mjs +5 -5
  207. package/assets/docs/working-with-ai.doc.mjs +23 -9
  208. package/authoring/codemod/codemod.doc.mjs +7 -3
  209. package/authoring/config/config.doc.mjs +9 -6
  210. package/authoring/config/type.ts +4 -2
  211. package/authoring/debug/parse.d.mts +5 -5
  212. package/authoring/discover/discover.doc.mjs +7 -1
  213. package/authoring/doctypes/_schema.d.mts +8 -3
  214. package/authoring/doctypes/_schema.mjs +1 -0
  215. package/authoring/doctypes/base/graph-fields.doc.mjs +6 -4
  216. package/authoring/doctypes/command/command.doc.mjs +20 -12
  217. package/authoring/doctypes/command/type.ts +14 -0
  218. package/authoring/doctypes/component/component.doc.mjs +29 -26
  219. package/authoring/doctypes/component/type.ts +15 -5
  220. package/authoring/doctypes/enum/enum.doc.mjs +7 -4
  221. package/authoring/doctypes/function/function.doc.mjs +9 -8
  222. package/authoring/doctypes/hook/hook.doc.mjs +5 -4
  223. package/authoring/doctypes/hook/type.ts +4 -0
  224. package/authoring/doctypes/namespace/namespace.doc.mjs +7 -6
  225. package/authoring/doctypes/reference/reference.doc.mjs +12 -11
  226. package/authoring/doctypes/schema/schema.doc.mjs +9 -9
  227. package/authoring/doctypes/template/template.doc.mjs +2 -2
  228. package/authoring/doctypes/theme/theme.doc.mjs +2 -2
  229. package/authoring/gap-report/gap-report.doc.mjs +2 -2
  230. package/authoring/identity/identity.doc.mjs +3 -3
  231. package/authoring/index.d.ts +1 -0
  232. package/authoring/integration/integration.doc.mjs +22 -5
  233. package/authoring/integration/parse.test.mjs +11 -0
  234. package/authoring/integration/schema.d.mts +14 -3
  235. package/authoring/integration/schema.mjs +33 -2
  236. package/authoring/integration/type.ts +8 -0
  237. package/clients/cli/bin/astryx.mjs +20 -3
  238. package/clients/cli/cli-command.test.mjs +166 -0
  239. package/clients/cli/commands/blog.doc.mjs +1 -0
  240. package/clients/cli/commands/build-theme.batch-report.test.mjs +14 -2
  241. package/clients/cli/commands/build-theme.font-warning.test.mjs +3 -3
  242. package/clients/cli/commands/build-theme.mjs +25 -12
  243. package/clients/cli/commands/build.doc.mjs +1 -0
  244. package/clients/cli/commands/build.exit-codes-doc.test.mjs +4 -0
  245. package/clients/cli/commands/cli-postinstall.test.mjs +49 -1
  246. package/clients/cli/commands/component.doc.mjs +1 -0
  247. package/clients/cli/commands/discover.broken-integration.test.mjs +11 -7
  248. package/clients/cli/commands/discover.doc.mjs +9 -1
  249. package/clients/cli/commands/discover.mjs +144 -93
  250. package/clients/cli/commands/discover.no-source.test.mjs +448 -33
  251. package/clients/cli/commands/discover.sources.test.mjs +20 -1
  252. package/clients/cli/commands/docs.doc.mjs +1 -0
  253. package/clients/cli/commands/docs.mjs +49 -19
  254. package/clients/cli/commands/docs.test.mjs +2 -2
  255. package/clients/cli/commands/doctor-integration-components.doc.mjs +7 -3
  256. package/clients/cli/commands/doctor-integration-docs.doc.mjs +20 -5
  257. package/clients/cli/commands/doctor-integration-templates.doc.mjs +1 -0
  258. package/clients/cli/commands/doctor-integration-validate.doc.mjs +13 -2
  259. package/clients/cli/commands/doctor-integration.test.mjs +52 -4
  260. package/clients/cli/commands/doctor.doc.mjs +12 -2
  261. package/clients/cli/commands/doctor.mjs +102 -7
  262. package/clients/cli/commands/doctor.test.mjs +10 -4
  263. package/clients/cli/commands/gap-report.doc.mjs +15 -2
  264. package/clients/cli/commands/gap-report.mjs +24 -2
  265. package/clients/cli/commands/gap-report.test.mjs +79 -0
  266. package/clients/cli/commands/hook.doc.mjs +1 -0
  267. package/clients/cli/commands/init.behavior.test.mjs +5 -0
  268. package/clients/cli/commands/init.doc.mjs +29 -3
  269. package/clients/cli/commands/integration-add.doc.mjs +7 -0
  270. package/clients/cli/commands/integration-authoring.test.mjs +49 -3
  271. package/clients/cli/commands/integration-check.doc.mjs +10 -2
  272. package/clients/cli/commands/integration-check.test.mjs +175 -1
  273. package/clients/cli/commands/integration-pack.doc.mjs +8 -1
  274. package/clients/cli/commands/integration-verify.doc.mjs +8 -1
  275. package/clients/cli/commands/integration.mjs +15 -9
  276. package/clients/cli/commands/json-contract.test.mjs +11 -2
  277. package/clients/cli/commands/manifest.doc.mjs +1 -0
  278. package/clients/cli/commands/outside-project.test.mjs +774 -0
  279. package/clients/cli/commands/search.doc.mjs +1 -0
  280. package/clients/cli/commands/search.mjs +16 -11
  281. package/clients/cli/commands/search.test.mjs +429 -296
  282. package/clients/cli/commands/setup-nudge.test.mjs +102 -2
  283. package/clients/cli/commands/swizzle.doc.mjs +7 -0
  284. package/clients/cli/commands/swizzle.mjs +5 -3
  285. package/clients/cli/commands/swizzle.routing.test.mjs +19 -2
  286. package/clients/cli/commands/template.doc.mjs +1 -0
  287. package/clients/cli/commands/theme-add-lifecycle.test.mjs +3 -3
  288. package/clients/cli/commands/theme-add.doc.mjs +8 -1
  289. package/clients/cli/commands/theme-build.doc.mjs +1 -0
  290. package/clients/cli/commands/theme-eject.doc.mjs +1 -0
  291. package/clients/cli/commands/theme-list.behavior.test.mjs +6 -0
  292. package/clients/cli/commands/theme-list.doc.mjs +1 -0
  293. package/clients/cli/commands/theme-palette-generate.doc.mjs +1 -0
  294. package/clients/cli/commands/theme-remove.doc.mjs +7 -0
  295. package/clients/cli/commands/theme-targets.doc.mjs +1 -0
  296. package/clients/cli/commands/theme-template.doc.mjs +1 -0
  297. package/clients/cli/commands/theme-use.doc.mjs +7 -0
  298. package/clients/cli/commands/upgrade.config-ordering.test.mjs +2 -1
  299. package/clients/cli/commands/upgrade.doc.mjs +22 -1
  300. package/clients/cli/commands/upgrade.file-protection.test.mjs +3 -2
  301. package/clients/cli/commands/upgrade.hook-output.test.mjs +2 -1
  302. package/clients/cli/commands/upgrade.older-cli.test.mjs +160 -0
  303. package/clients/cli/index.mjs +111 -16
  304. package/clients/cli/lib/cli-error.mjs +4 -1
  305. package/clients/cli/lib/component-format.test.mjs +1 -1
  306. package/clients/cli/lib/define-command.mjs +2 -2
  307. package/clients/cli/lib/json-shim.mjs +3 -1
  308. package/clients/cli/lib/manifest.d.ts +9 -0
  309. package/clients/cli/lib/manifest.mjs +17 -1
  310. package/clients/cli/lib/manifest.test.mjs +25 -0
  311. package/foundation/agent-docs/agent-doc-state.d.mts +35 -6
  312. package/foundation/agent-docs/agent-doc-state.mjs +66 -6
  313. package/foundation/agent-docs/agent-docs.d.mts +4 -3
  314. package/foundation/agent-docs/agent-docs.mjs +11 -9
  315. package/foundation/agent-docs/computer-agent-text.d.mts +133 -0
  316. package/foundation/agent-docs/computer-agent-text.mjs +623 -0
  317. package/foundation/agent-docs/computer-agent-text.test.mjs +602 -0
  318. package/foundation/config/project.d.mts +35 -3
  319. package/foundation/config/project.mjs +145 -8
  320. package/foundation/config/project.test.mjs +66 -0
  321. package/foundation/config/theme-state.mjs +5 -4
  322. package/foundation/discovery/authoring-self-docs.mjs +1 -1
  323. package/foundation/discovery/cli-self-docs.mjs +20 -3
  324. package/foundation/discovery/cli-self-docs.test.mjs +3 -2
  325. package/foundation/discovery/component-replacement.mjs +2 -1
  326. package/foundation/discovery/copied-passages.d.mts +216 -0
  327. package/foundation/discovery/copied-passages.mjs +720 -0
  328. package/foundation/discovery/copied-passages.test.mjs +124 -0
  329. package/foundation/discovery/doc-consistency.d.mts +34 -0
  330. package/foundation/discovery/doc-consistency.mjs +513 -0
  331. package/foundation/discovery/doc-consistency.test.mjs +347 -0
  332. package/foundation/discovery/doc-fluff.d.mts +112 -0
  333. package/foundation/discovery/doc-fluff.mjs +328 -0
  334. package/foundation/discovery/doc-fluff.test.mjs +142 -0
  335. package/foundation/discovery/doc-types.d.mts +1 -1
  336. package/foundation/discovery/doc-types.mjs +15 -8
  337. package/foundation/discovery/doc-types.test.mjs +94 -2
  338. package/foundation/discovery/docs-discovery.d.mts +7 -0
  339. package/foundation/discovery/docs-discovery.mjs +26 -2
  340. package/foundation/discovery/project-typescript.d.mts +11 -2
  341. package/foundation/discovery/project-typescript.mjs +32 -4
  342. package/foundation/discovery/prop-drift.d.mts +26 -7
  343. package/foundation/discovery/prop-drift.mjs +173 -8
  344. package/foundation/discovery/prop-drift.test.mjs +120 -2
  345. package/foundation/discovery/runner-allowlist.d.mts +40 -0
  346. package/foundation/discovery/runner-allowlist.mjs +53 -0
  347. package/foundation/discovery/stray-pointers.d.mts +52 -0
  348. package/foundation/discovery/stray-pointers.mjs +293 -0
  349. package/foundation/discovery/stray-pointers.test.mjs +86 -0
  350. package/foundation/discovery/template-needs.mjs +5 -2
  351. package/foundation/discovery/theme-imports.mjs +8 -4
  352. package/foundation/discovery/theme-imports.test.mjs +1 -1
  353. package/foundation/discovery/type-text.mjs +1 -1
  354. package/foundation/discovery/type-text.test.mjs +1 -1
  355. package/foundation/doc-compiler/doc-loads.test.mjs +42 -2
  356. package/foundation/doc-compiler/inputs.mjs +4 -1
  357. package/foundation/doc-compiler/links.d.mts +32 -0
  358. package/foundation/doc-compiler/links.mjs +163 -26
  359. package/foundation/doc-compiler/links.test.mjs +97 -4
  360. package/foundation/doc-compiler/read.d.mts +1 -1
  361. package/foundation/doc-compiler/tree.mjs +30 -1
  362. package/foundation/doc-compiler/tree.test.mjs +8 -1
  363. package/foundation/env/cli-command.d.mts +83 -0
  364. package/foundation/env/cli-command.mjs +152 -0
  365. package/foundation/env/cli-command.test.mjs +129 -0
  366. package/foundation/env/node-version.test.mjs +15 -3
  367. package/foundation/env/package-manager.d.mts +93 -9
  368. package/foundation/env/package-manager.global.test.mjs +66 -0
  369. package/foundation/env/package-manager.mjs +184 -13
  370. package/foundation/env/package-manager.test.mjs +341 -15
  371. package/foundation/env/project-scope.d.mts +9 -0
  372. package/foundation/env/project-scope.mjs +33 -0
  373. package/foundation/env/search-path.d.mts +42 -0
  374. package/foundation/env/search-path.mjs +205 -0
  375. package/foundation/env/search-path.test.mjs +122 -0
  376. package/foundation/env/user-dirs.d.mts +39 -0
  377. package/foundation/env/user-dirs.mjs +93 -0
  378. package/foundation/env/user-dirs.test.mjs +72 -0
  379. package/foundation/env/user-settings.d.mts +46 -0
  380. package/foundation/env/user-settings.mjs +106 -0
  381. package/foundation/env/user-settings.test.mjs +64 -0
  382. package/foundation/fs/file-protection.mjs +15 -1
  383. package/foundation/fs/module-loader.d.mts +2 -1
  384. package/foundation/fs/module-loader.mjs +60 -4
  385. package/foundation/fs/module-loader.stdout.test.mjs +3 -2
  386. package/foundation/fs/module-loader.test.mjs +194 -0
  387. package/foundation/fs/path-compare.d.mts +33 -0
  388. package/foundation/fs/path-compare.mjs +73 -0
  389. package/foundation/fs/paths.d.mts +57 -1
  390. package/foundation/fs/paths.mjs +131 -3
  391. package/foundation/fs/paths.test.mjs +10 -1
  392. package/foundation/integrations/computer-integrations.d.mts +78 -0
  393. package/foundation/integrations/computer-integrations.mjs +316 -0
  394. package/foundation/integrations/computer-integrations.test.mjs +292 -0
  395. package/foundation/integrations/contribution-inventory.d.mts +11 -0
  396. package/foundation/integrations/contribution-inventory.mjs +50 -2
  397. package/foundation/integrations/integration-warnings.mjs +3 -2
  398. package/foundation/integrations/integration-warnings.test.mjs +8 -9
  399. package/foundation/integrations/integrations.d.mts +25 -1
  400. package/foundation/integrations/integrations.mjs +46 -3
  401. package/foundation/integrations/issue.ts +6 -0
  402. package/foundation/integrations/validate-contributions.d.mts +2 -0
  403. package/foundation/integrations/validate-contributions.mjs +41 -1
  404. package/foundation/release/agent-text-worker.d.mts +4 -0
  405. package/foundation/release/agent-text-worker.mjs +52 -0
  406. package/foundation/release/cache.d.mts +310 -0
  407. package/foundation/release/cache.mjs +1216 -0
  408. package/foundation/release/cache.test.mjs +920 -0
  409. package/foundation/release/choose.d.mts +207 -0
  410. package/foundation/release/choose.mjs +677 -0
  411. package/foundation/release/choose.test.mjs +427 -0
  412. package/foundation/release/core-worker.d.mts +4 -0
  413. package/foundation/release/core-worker.mjs +38 -0
  414. package/foundation/release/global-state.d.mts +259 -0
  415. package/foundation/release/global-state.mjs +472 -0
  416. package/foundation/release/global-state.test.mjs +381 -0
  417. package/foundation/release/handoff.d.mts +60 -0
  418. package/foundation/release/handoff.e2e.test.mjs +278 -0
  419. package/foundation/release/handoff.mjs +357 -0
  420. package/foundation/release/lock-lease.d.mts +23 -0
  421. package/foundation/release/lock-lease.mjs +80 -0
  422. package/foundation/release/notices.d.mts +253 -0
  423. package/foundation/release/notices.mjs +596 -0
  424. package/foundation/release/notices.test.mjs +565 -0
  425. package/foundation/release/npm-guard.d.mts +4 -0
  426. package/foundation/release/npm-guard.mjs +126 -0
  427. package/foundation/release/project.d.mts +141 -0
  428. package/foundation/release/project.mjs +466 -0
  429. package/foundation/release/project.test.mjs +288 -0
  430. package/foundation/release/refresh-worker.d.mts +4 -0
  431. package/foundation/release/refresh-worker.mjs +27 -0
  432. package/foundation/release/run-context.d.mts +47 -0
  433. package/foundation/release/run-context.mjs +149 -0
  434. package/foundation/release/update-notice-env.d.mts +28 -0
  435. package/foundation/release/update-notice-env.mjs +39 -0
  436. package/foundation/response/base.d.ts +26 -3
  437. package/foundation/response/error-codes.d.mts +3 -1
  438. package/foundation/response/error-codes.doc.mjs +12 -0
  439. package/foundation/response/error-codes.mjs +17 -0
  440. package/foundation/response/error-codes.test.mjs +2 -0
  441. package/foundation/response/json-contract.test.mjs +7 -2
  442. package/foundation/response/json.mjs +4 -1
  443. package/foundation/response/response-types.doc.mjs +17 -11
  444. package/foundation/response/response-types.doc.test.mjs +46 -0
  445. package/foundation/response/response.doc.mjs +3 -3
  446. package/foundation/xle/browser-imports.test.mjs +74 -0
  447. package/package.json +11 -11
  448. package/scripts/postinstall.mjs +24 -5
  449. /package/assets/codemods/transforms/{next → v0.7.2}/__tests__/migrate-list-edge-compensation-to-edge.test.mjs +0 -0
  450. /package/assets/codemods/transforms/{next → v0.7.2}/migrate-list-edge-compensation-to-edge.mjs +0 -0
@@ -15,12 +15,18 @@
15
15
  * ShadCN-copied compositions → post-codemod hooks → render + refresh agent docs
16
16
  * from final post-upgrade state. Integration DISCOVERY errors skip that
17
17
  * integration; execution errors abort before the agent-doc write.
18
+ *
19
+ * Core codemods ship inside the CLI, so a CLI older than the installed Core
20
+ * has none for the releases after its own version. Every result past the
21
+ * up-to-date exit then carries `cliBehindCore`, and no human line says the
22
+ * upgrade finished; the warning names the same upgrade on the matching CLI.
18
23
  */
19
24
 
20
25
  import * as fs from 'node:fs';
21
26
  import * as path from 'node:path';
22
27
  import {
23
28
  detectInstalledTargetVersion,
29
+ detectCliBehindCore,
24
30
  prepareAgentDocsRefresh,
25
31
  applyAgentDocsRefresh,
26
32
  inspectAgentDocs,
@@ -42,9 +48,11 @@ import {
42
48
  statusUpToDate,
43
49
  statusNoCodemods,
44
50
  statusConfigFixable,
51
+ logCliBehindCore,
45
52
  } from '../status/status.mjs';
46
53
  import {semverGte} from '../../../foundation/env/semver.mjs';
47
54
  import {getCliInvocation} from '../../../foundation/env/package-manager.mjs';
55
+ import {isOutsideProject} from '../../../foundation/env/project-scope.mjs';
48
56
  import {ERROR_CODES} from '../../../foundation/response/error-codes.mjs';
49
57
  import {AstryxError} from '../../error.mjs';
50
58
  import {logger} from '../../logger.mjs';
@@ -146,7 +154,10 @@ export async function run(options = {}, {cwd = process.cwd()} = {}) {
146
154
  const currentVersion = /** @type {string} */ (options.from);
147
155
  const installed = detectInstalledTargetVersion(cwd);
148
156
  if (!installed) {
149
- const msg = `Could not find installed @astryxdesign/core (or legacy @xds/core). Install the target version first, then rerun \`${getCliInvocation()} upgrade --from <old-version>\`.`;
157
+ // Outside a project there is no version to install (spec AST-081 FR3).
158
+ const msg = isOutsideProject(cwd)
159
+ ? 'Could not find installed @astryxdesign/core (or legacy @xds/core). This folder is outside a project; upgrade migrates the code of an app project that installs @astryxdesign/core.'
160
+ : `Could not find installed @astryxdesign/core (or legacy @xds/core). Install the target version first, then rerun \`${getCliInvocation()} upgrade --from <old-version>\`.`;
150
161
  logger.error(msg);
151
162
  logger.log('Aborted\n');
152
163
  throw new AstryxError(msg, undefined, ERROR_CODES.ERR_VERSION_DETECT);
@@ -195,6 +206,17 @@ export async function run(options = {}, {cwd = process.cwd()} = {}) {
195
206
  });
196
207
  }
197
208
 
209
+ // Past the up-to-date exit, codemods are needed through targetVersion. A
210
+ // CLI older than that has none for the releases after its own version.
211
+ const cliBehindCore = detectCliBehindCore({
212
+ from: currentVersion,
213
+ to: targetVersion,
214
+ packageName: installed.packageName,
215
+ options,
216
+ cwd,
217
+ sourcePath: path_,
218
+ });
219
+
198
220
  const versionManifests = await getCoreVersionManifests(
199
221
  currentVersion,
200
222
  targetVersion,
@@ -243,6 +265,7 @@ export async function run(options = {}, {cwd = process.cwd()} = {}) {
243
265
  skipCodemods,
244
266
  root: cwd,
245
267
  protection,
268
+ coversTarget: !cliBehindCore,
246
269
  });
247
270
  const coreResult =
248
271
  codemodResult && 'totalFilesChanged' in codemodResult
@@ -271,6 +294,7 @@ export async function run(options = {}, {cwd = process.cwd()} = {}) {
271
294
  for (const item of protectedFiles) {
272
295
  logger.error(` ${item.file} — ${item.declarations.join('; ')}`);
273
296
  }
297
+ if (cliBehindCore) logCliBehindCore(cliBehindCore, targetVersion);
274
298
  logger.log('Upgrade incomplete: protected changes remain\n');
275
299
  return {
276
300
  type: 'upgrade.run',
@@ -299,6 +323,7 @@ export async function run(options = {}, {cwd = process.cwd()} = {}) {
299
323
  complete: false,
300
324
  errorCode: 'ERR_CODEMOD_PROTECTED',
301
325
  errors: coreResult?.errors ?? [],
326
+ ...(cliBehindCore ? {cliBehindCore} : {}),
302
327
  },
303
328
  };
304
329
  }
@@ -316,6 +341,7 @@ export async function run(options = {}, {cwd = process.cwd()} = {}) {
316
341
  to: targetVersion,
317
342
  configError: configErr.message,
318
343
  configCodemods: coreConfigCodemodNames,
344
+ cliBehindCore,
319
345
  agentDocs:
320
346
  /** @type {import('../upgrade.type.mjs').AgentDocsSummary} */ ({
321
347
  status: inspection.status,
@@ -381,6 +407,7 @@ export async function run(options = {}, {cwd = process.cwd()} = {}) {
381
407
  to: targetVersion,
382
408
  agentDocs,
383
409
  ...(registryResult ? {registryCompositions: registryResult.summary} : {}),
410
+ cliBehindCore,
384
411
  });
385
412
  }
386
413
 
@@ -620,6 +647,7 @@ export async function run(options = {}, {cwd = process.cwd()} = {}) {
620
647
  }
621
648
  receipt.errors = finalErrors;
622
649
  if (registryResult) receipt.registryCompositions = registryResult.summary;
650
+ if (cliBehindCore) receipt.cliBehindCore = cliBehindCore;
623
651
 
624
652
  if (protectedFiles.length > 0) {
625
653
  logger.error(
@@ -655,7 +683,12 @@ export async function run(options = {}, {cwd = process.cwd()} = {}) {
655
683
  }
656
684
 
657
685
  const registryOk = receipt.registryCompositions?.ok ?? true;
658
- const done = apply ? 'Upgrade complete' : 'Dry run complete';
686
+ if (cliBehindCore) logCliBehindCore(cliBehindCore, targetVersion);
687
+ const done = cliBehindCore
688
+ ? 'Upgrade incomplete'
689
+ : apply
690
+ ? 'Upgrade complete'
691
+ : 'Dry run complete';
659
692
  logger.log(
660
693
  protectedFiles.length > 0
661
694
  ? 'Upgrade incomplete: protected changes remain\n'
@@ -13,27 +13,43 @@ export function statusUpToDate({ from, to, agentDocs, registryCompositions }: {
13
13
  registryCompositions?: import("../upgrade.type.mjs").RegistryCompositionSummary;
14
14
  }): import("../upgrade.type.mjs").UpgradeStatusResponse;
15
15
  /**
16
- * No core or integration codemods apply to the requested version range.
17
- * @param {{from: string, to: string, agentDocs: import('../upgrade.type.mjs').AgentDocsSummary, registryCompositions?: import('../upgrade.type.mjs').RegistryCompositionSummary}} data
16
+ * The one warning for a CLI older than the installed Core: it has no codemods
17
+ * for the releases after its own version, and the pinned command does. The
18
+ * command gets a line of its own, so it copies exactly, whatever quotes or
19
+ * backticks its arguments carry. On Windows it is written for PowerShell, and
20
+ * the warning says so.
21
+ * @param {import('../upgrade.type.mjs').CliBehindCore} cliBehindCore
22
+ * @param {string} to the installed Core version
23
+ * @param {string} [platform] the `process.platform` the command was printed
24
+ * for, as `quoteCommandArgument` and `commandInFolder` take it
25
+ */
26
+ export function logCliBehindCore({ cliVersion, command }: import("../upgrade.type.mjs").CliBehindCore, to: string, platform?: string): void;
27
+ /**
28
+ * No core or integration codemods apply to the requested version range. When
29
+ * the CLI is older than the installed Core, that only means this CLI has none:
30
+ * the result carries `cliBehindCore` and the human lines say so.
31
+ * @param {{from: string, to: string, agentDocs: import('../upgrade.type.mjs').AgentDocsSummary, registryCompositions?: import('../upgrade.type.mjs').RegistryCompositionSummary, cliBehindCore?: import('../upgrade.type.mjs').CliBehindCore | null}} data
18
32
  * @returns {import('../upgrade.type.mjs').UpgradeStatusResponse}
19
33
  */
20
- export function statusNoCodemods({ from, to, agentDocs, registryCompositions }: {
34
+ export function statusNoCodemods({ from, to, agentDocs, registryCompositions, cliBehindCore }: {
21
35
  from: string;
22
36
  to: string;
23
37
  agentDocs: import("../upgrade.type.mjs").AgentDocsSummary;
24
38
  registryCompositions?: import("../upgrade.type.mjs").RegistryCompositionSummary;
39
+ cliBehindCore?: import("../upgrade.type.mjs").CliBehindCore | null;
25
40
  }): import("../upgrade.type.mjs").UpgradeStatusResponse;
26
41
  /**
27
42
  * DRY-RUN only: the consumer's astryx.config fails strict validation, but a
28
43
  * pending core CONFIG codemod previewed a change that would repair it. Preview
29
44
  * the fix + report the exact `--apply` command; integrations are skipped here.
30
- * @param {{from: string, to: string, configError: string, configCodemods: string[], agentDocs: import('../upgrade.type.mjs').AgentDocsSummary}} data
45
+ * @param {{from: string, to: string, configError: string, configCodemods: string[], agentDocs: import('../upgrade.type.mjs').AgentDocsSummary, cliBehindCore?: import('../upgrade.type.mjs').CliBehindCore | null}} data
31
46
  * @returns {import('../upgrade.type.mjs').UpgradeStatusResponse}
32
47
  */
33
- export function statusConfigFixable({ from, to, configError, configCodemods, agentDocs }: {
48
+ export function statusConfigFixable({ from, to, configError, configCodemods, agentDocs, cliBehindCore }: {
34
49
  from: string;
35
50
  to: string;
36
51
  configError: string;
37
52
  configCodemods: string[];
38
53
  agentDocs: import("../upgrade.type.mjs").AgentDocsSummary;
54
+ cliBehindCore?: import("../upgrade.type.mjs").CliBehindCore | null;
39
55
  }): import("../upgrade.type.mjs").UpgradeStatusResponse;
@@ -10,6 +10,10 @@
10
10
  * - `config_fixable` — DRY-RUN only: the config fails strict validation but a
11
11
  * pending core CONFIG codemod would repair it; preview the fix, don't write.
12
12
  *
13
+ * `no_codemods` and `config_fixable` also carry `cliBehindCore` when the
14
+ * installed Core is newer than this CLI: the run cannot finish the upgrade, so
15
+ * neither says it is done, and `logCliBehindCore` names the command that can.
16
+ *
13
17
  * These builders own the exact human progress lines for their path (emitted via
14
18
  * the shared `logger`) and return the `upgrade.status` envelope; the caller
15
19
  * just returns what they hand back.
@@ -40,13 +44,43 @@ export function statusUpToDate({from, to, agentDocs, registryCompositions}) {
40
44
  }
41
45
 
42
46
  /**
43
- * No core or integration codemods apply to the requested version range.
44
- * @param {{from: string, to: string, agentDocs: import('../upgrade.type.mjs').AgentDocsSummary, registryCompositions?: import('../upgrade.type.mjs').RegistryCompositionSummary}} data
47
+ * The one warning for a CLI older than the installed Core: it has no codemods
48
+ * for the releases after its own version, and the pinned command does. The
49
+ * command gets a line of its own, so it copies exactly, whatever quotes or
50
+ * backticks its arguments carry. On Windows it is written for PowerShell, and
51
+ * the warning says so.
52
+ * @param {import('../upgrade.type.mjs').CliBehindCore} cliBehindCore
53
+ * @param {string} to the installed Core version
54
+ * @param {string} [platform] the `process.platform` the command was printed
55
+ * for, as `quoteCommandArgument` and `commandInFolder` take it
56
+ */
57
+ export function logCliBehindCore({cliVersion, command}, to, platform = process.platform) {
58
+ const shell = platform === 'win32' ? ' in PowerShell' : '';
59
+ logger.warn(
60
+ `This CLI (${cliVersion}) is older than the installed @astryxdesign/core (${to}): ` +
61
+ `it has no codemods for releases after ${cliVersion}, so it cannot finish this upgrade. ` +
62
+ `Run it${shell} with the CLI that matches your Core:`,
63
+ );
64
+ logger.warn(` ${command}`);
65
+ }
66
+
67
+ /**
68
+ * No core or integration codemods apply to the requested version range. When
69
+ * the CLI is older than the installed Core, that only means this CLI has none:
70
+ * the result carries `cliBehindCore` and the human lines say so.
71
+ * @param {{from: string, to: string, agentDocs: import('../upgrade.type.mjs').AgentDocsSummary, registryCompositions?: import('../upgrade.type.mjs').RegistryCompositionSummary, cliBehindCore?: import('../upgrade.type.mjs').CliBehindCore | null}} data
45
72
  * @returns {import('../upgrade.type.mjs').UpgradeStatusResponse}
46
73
  */
47
- export function statusNoCodemods({from, to, agentDocs, registryCompositions}) {
48
- logger.log('[ok] No codemods available for this version range.');
49
- logger.log(registryCompositions?.ok === false ? 'Finished with unresolved registry items\n' : 'Done\n');
74
+ export function statusNoCodemods({from, to, agentDocs, registryCompositions, cliBehindCore}) {
75
+ if (cliBehindCore) logCliBehindCore(cliBehindCore, to);
76
+ else logger.log('[ok] No codemods available for this version range.');
77
+ logger.log(
78
+ registryCompositions?.ok === false
79
+ ? 'Finished with unresolved registry items\n'
80
+ : cliBehindCore
81
+ ? 'Upgrade incomplete\n'
82
+ : 'Done\n',
83
+ );
50
84
  return {
51
85
  type: 'upgrade.status',
52
86
  data: {
@@ -55,6 +89,7 @@ export function statusNoCodemods({from, to, agentDocs, registryCompositions}) {
55
89
  to,
56
90
  agentDocs,
57
91
  ...(registryCompositions ? {registryCompositions} : {}),
92
+ ...(cliBehindCore ? {cliBehindCore} : {}),
58
93
  },
59
94
  };
60
95
  }
@@ -63,10 +98,10 @@ export function statusNoCodemods({from, to, agentDocs, registryCompositions}) {
63
98
  * DRY-RUN only: the consumer's astryx.config fails strict validation, but a
64
99
  * pending core CONFIG codemod previewed a change that would repair it. Preview
65
100
  * the fix + report the exact `--apply` command; integrations are skipped here.
66
- * @param {{from: string, to: string, configError: string, configCodemods: string[], agentDocs: import('../upgrade.type.mjs').AgentDocsSummary}} data
101
+ * @param {{from: string, to: string, configError: string, configCodemods: string[], agentDocs: import('../upgrade.type.mjs').AgentDocsSummary, cliBehindCore?: import('../upgrade.type.mjs').CliBehindCore | null}} data
67
102
  * @returns {import('../upgrade.type.mjs').UpgradeStatusResponse}
68
103
  */
69
- export function statusConfigFixable({from, to, configError, configCodemods, agentDocs}) {
104
+ export function statusConfigFixable({from, to, configError, configCodemods, agentDocs, cliBehindCore}) {
70
105
  const codemodFlags = configCodemods.map(name => `--codemod ${name}`).join(' ');
71
106
  const suggestedCommand = `astryx upgrade --from ${from} ${codemodFlags} --apply`;
72
107
  const guidance =
@@ -77,7 +112,8 @@ export function statusConfigFixable({from, to, configError, configCodemods, agen
77
112
  logger.warn(guidance);
78
113
  logger.log(` ${formatCliCommand(suggestedCommand)}`);
79
114
  logger.log('Integrations are skipped in this preview; they will be processed on the --apply run.');
80
- logger.log('Dry run complete\n');
115
+ if (cliBehindCore) logCliBehindCore(cliBehindCore, to);
116
+ logger.log(cliBehindCore ? 'Upgrade incomplete\n' : 'Dry run complete\n');
81
117
  return {
82
118
  type: 'upgrade.status',
83
119
  data: {
@@ -90,6 +126,7 @@ export function statusConfigFixable({from, to, configError, configCodemods, agen
90
126
  message: guidance,
91
127
  note: 'Integrations are skipped in this preview; they will be processed on the --apply run.',
92
128
  agentDocs,
129
+ ...(cliBehindCore ? {cliBehindCore} : {}),
93
130
  },
94
131
  };
95
132
  }
@@ -22,7 +22,10 @@ export const doc = {
22
22
  'loaded, so they can repair an invalid config. Also updates copied compositions from ' +
23
23
  'their install receipts: unchanged files are updated, non-overlapping edits are merged, ' +
24
24
  'and conflicts are left untouched. `list` only lists codemods; `registry` only updates ' +
25
- 'copied compositions.',
25
+ 'copied compositions. Core codemods ship inside the CLI, so a CLI older than the installed ' +
26
+ 'Core has none for the releases after its own version: the result then carries ' +
27
+ '`cliBehindCore` with the command that runs the same upgrade on the matching CLI.' +
28
+ " In global mode: in a project, the CLI runs `upgrade` with the project's own CLI, whichever astryx command started it (in a project with no CLI of its own, the one you started); this function runs the codemods of the package it is imported from. With `cwd` outside a project, `list` lists this release's codemods, `registry` finds no copied compositions, and a migration writes nothing and fails with `ERR_VERSION_DETECT`. See {@link namespace:global} and {@link generic:who-answers}.",
26
29
  importPath: '@astryxdesign/cli/api',
27
30
  signature:
28
31
  'upgrade(options?: UpgradeOptions, ctx?: {cwd?: string}): Promise<UpgradeListResponse | UpgradeRegistryResponse | UpgradeStatusResponse | UpgradeRunResponse>',
@@ -118,12 +121,12 @@ export const doc = {
118
121
  {
119
122
  type: 'upgrade.status',
120
123
  description:
121
- 'A short-circuit outcome (no codemods executed): `up_to_date` (`from` is at/after the installed target and no `force`), `no_codemods` (none apply to the range), or `config_fixable` (dry-run preview that a pending config codemod would repair an invalid astryx.config). up_to_date and no_codemods carry the agent-docs summary and, when receipts are found, the copied-composition summary; config_fixable carries configError, configCodemods, suggestedCommand, message, note, and the agent-docs summary.',
124
+ 'A short-circuit outcome (no codemods executed): `up_to_date` (`from` is at/after the installed target and no `force`), `no_codemods` (none apply to the range), or `config_fixable` (dry-run preview that a pending config codemod would repair an invalid astryx.config). up_to_date and no_codemods carry the agent-docs summary and, when receipts are found, the copied-composition summary; config_fixable carries configError, configCodemods, suggestedCommand, message, note, and the agent-docs summary. When the installed Core is newer than the CLI, no_codemods and config_fixable also carry cliBehindCore ({cliVersion, command}): this CLI has no codemods for the releases after cliVersion, and command runs the same upgrade with the CLI release that matches the installed Core.',
122
125
  },
123
126
  {
124
127
  type: 'upgrade.run',
125
128
  description:
126
- 'The terminal run receipt: from, to, codemods (count), integrations, agentDocs, agentDocsRefreshed, registryCompositions (when receipts are found), sourcePathFound (false when the resolved `path` does not exist, so nothing was scanned), filesChanged, transformsApplied, modifiedFiles, protectedFiles, declinedCandidates, errors, and complete. When a protected file still requires a change, complete is false and errorCode is ERR_CODEMOD_PROTECTED; the CLI exits nonzero while preserving the structured receipt.',
129
+ 'The terminal run receipt: from, to, codemods (count), integrations, agentDocs, agentDocsRefreshed, registryCompositions (when receipts are found), sourcePathFound (false when the resolved `path` does not exist, so nothing was scanned), filesChanged, transformsApplied, modifiedFiles, protectedFiles, declinedCandidates, errors, and complete. When a protected file still requires a change, complete is false and errorCode is ERR_CODEMOD_PROTECTED; the CLI exits nonzero while preserving the structured receipt. When the installed Core is newer than the CLI, it also carries cliBehindCore ({cliVersion, command}): codemods for the releases after cliVersion did not run, and command runs the same upgrade with the matching CLI.',
127
130
  },
128
131
  ],
129
132
  throws: [
@@ -26,6 +26,7 @@ import {registryUpgrade} from './registry/registry.mjs';
26
26
  import {run} from './run/run.mjs';
27
27
  import {isValidSemver} from '../../foundation/env/semver.mjs';
28
28
  import {getCliInvocation} from '../../foundation/env/package-manager.mjs';
29
+ import {isOutsideProject} from '../../foundation/env/project-scope.mjs';
29
30
  import {ERROR_CODES} from '../../foundation/response/error-codes.mjs';
30
31
  import {AstryxError} from '../error.mjs';
31
32
  import {logger} from '../logger.mjs';
@@ -91,7 +92,10 @@ export async function upgrade(options = {}, {cwd = process.cwd()} = {}) {
91
92
  }
92
93
 
93
94
  if (!options.list && !options.from) {
94
- const msg = `Missing required --from. Install the target version first, then run \`${getCliInvocation()} upgrade --from <old-version>\`.`;
95
+ // Outside a project there is no version to install (spec AST-081 FR3).
96
+ const msg = isOutsideProject(cwd)
97
+ ? 'Missing required --from. This folder is outside a project; upgrade migrates the code of an app project that installs @astryxdesign/core.'
98
+ : `Missing required --from. Install the target version first, then run \`${getCliInvocation()} upgrade --from <old-version>\`.`;
95
99
  logger.error(msg);
96
100
  logger.log('Aborted\n');
97
101
  throw new AstryxError(msg, undefined, ERROR_CODES.ERR_INVALID_ARGUMENT);
@@ -160,6 +160,22 @@ export type ProtectedCodemodFile = {
160
160
  */
161
161
  commands: string[];
162
162
  };
163
+ /**
164
+ * Present only when the installed `@astryxdesign/core` (the response's `to`) is
165
+ * newer than the running CLI. Core codemods ship inside the CLI, so this CLI
166
+ * has none for the releases after `cliVersion`: the run could not migrate them,
167
+ * whatever else the response reports.
168
+ */
169
+ export type CliBehindCore = {
170
+ /**
171
+ * The running CLI's version, the last release it has codemods for.
172
+ */
173
+ cliVersion: string;
174
+ /**
175
+ * The same upgrade, run with the CLI release that matches the installed Core. It first changes to the folder this run used, then names the directory this run scanned as an absolute `--path`, both with symbolic links resolved, so pasted from any folder it finds the same Core and scans the same directory. It is written for a POSIX shell (sh, bash, zsh), or for PowerShell on Windows, with each argument quoted for that shell; cmd.exe is not a target.
176
+ */
177
+ command: string;
178
+ };
163
179
  /**
164
180
  * astryx --json upgrade [--apply]
165
181
  */
@@ -190,6 +206,7 @@ export type UpgradeRunResponse = {
190
206
  codemod: string;
191
207
  error: string;
192
208
  }[] | undefined;
209
+ cliBehindCore?: CliBehindCore | undefined;
193
210
  };
194
211
  };
195
212
  /**
@@ -202,6 +219,10 @@ export type UpgradeRunResponse = {
202
219
  * range) would repair it. The dry run previews the fix without writing and
203
220
  * reports the exact command to apply it; integrations are skipped for the
204
221
  * preview (they will be processed on the `--apply` run).
222
+ *
223
+ * `no_codemods` and `config_fixable` carry `cliBehindCore` when the installed
224
+ * Core is newer than this CLI; `no_codemods` then means only that this CLI has
225
+ * no codemods for the range.
205
226
  */
206
227
  export type UpgradeStatusResponse = {
207
228
  type: "upgrade.status";
@@ -217,6 +238,7 @@ export type UpgradeStatusResponse = {
217
238
  to: string;
218
239
  agentDocs: AgentDocsSummary;
219
240
  registryCompositions?: RegistryCompositionSummary;
241
+ cliBehindCore?: CliBehindCore;
220
242
  } | {
221
243
  status: "config_fixable";
222
244
  from: string;
@@ -227,6 +249,7 @@ export type UpgradeStatusResponse = {
227
249
  message: string;
228
250
  note: string;
229
251
  agentDocs: AgentDocsSummary;
252
+ cliBehindCore?: CliBehindCore;
230
253
  };
231
254
  };
232
255
  /**
@@ -106,6 +106,16 @@
106
106
  * @property {string[]} commands Exact regeneration commands found in generated headers, when present.
107
107
  */
108
108
 
109
+ /**
110
+ * Present only when the installed `@astryxdesign/core` (the response's `to`) is
111
+ * newer than the running CLI. Core codemods ship inside the CLI, so this CLI
112
+ * has none for the releases after `cliVersion`: the run could not migrate them,
113
+ * whatever else the response reports.
114
+ * @typedef {object} CliBehindCore
115
+ * @property {string} cliVersion The running CLI's version, the last release it has codemods for.
116
+ * @property {string} command The same upgrade, run with the CLI release that matches the installed Core. It first changes to the folder this run used, then names the directory this run scanned as an absolute `--path`, both with symbolic links resolved, so pasted from any folder it finds the same Core and scans the same directory. It is written for a POSIX shell (sh, bash, zsh), or for PowerShell on Windows, with each argument quoted for that shell; cmd.exe is not a target.
117
+ */
118
+
109
119
  /**
110
120
  * astryx --json upgrade [--apply]
111
121
  * @typedef {object} UpgradeRunResponse
@@ -127,6 +137,7 @@
127
137
  * @property {Array<{file: string, location?: string, reason: string}>} [data.declinedCandidates] Candidates left unchanged because proof was insufficient.
128
138
  * @property {number} [data.transformsApplied] Total codemod changes. A code or config codemod counts once for each file it changed, so one file changed by four of them counts four times; a project codemod counts once, however many files it writes.
129
139
  * @property {Array<{file: string, codemod: string, error: string}>} [data.errors] Per-codemod errors, when any codemod failed.
140
+ * @property {CliBehindCore} [data.cliBehindCore] Present only when the installed Core is newer than this CLI: codemods for the releases after `cliBehindCore.cliVersion` did not run.
130
141
  */
131
142
 
132
143
  /**
@@ -140,9 +151,13 @@
140
151
  * reports the exact command to apply it; integrations are skipped for the
141
152
  * preview (they will be processed on the `--apply` run).
142
153
  *
154
+ * `no_codemods` and `config_fixable` carry `cliBehindCore` when the installed
155
+ * Core is newer than this CLI; `no_codemods` then means only that this CLI has
156
+ * no codemods for the range.
157
+ *
143
158
  * @typedef {object} UpgradeStatusResponse
144
159
  * @property {'upgrade.status'} type
145
- * @property {{status: 'up_to_date', from: string, to: string, agentDocs: AgentDocsSummary, registryCompositions?: RegistryCompositionSummary} | {status: 'no_codemods', from: string, to: string, agentDocs: AgentDocsSummary, registryCompositions?: RegistryCompositionSummary} | {status: 'config_fixable', from: string, to: string, configError: string, configCodemods: string[], suggestedCommand: string, message: string, note: string, agentDocs: AgentDocsSummary}} data
160
+ * @property {{status: 'up_to_date', from: string, to: string, agentDocs: AgentDocsSummary, registryCompositions?: RegistryCompositionSummary} | {status: 'no_codemods', from: string, to: string, agentDocs: AgentDocsSummary, registryCompositions?: RegistryCompositionSummary, cliBehindCore?: CliBehindCore} | {status: 'config_fixable', from: string, to: string, configError: string, configCodemods: string[], suggestedCommand: string, message: string, note: string, agentDocs: AgentDocsSummary, cliBehindCore?: CliBehindCore}} data
146
161
  */
147
162
 
148
163
  /**
@@ -31,6 +31,7 @@ describe('registry', () => {
31
31
  '0.6.4',
32
32
  '0.6.7',
33
33
  '0.7.0',
34
+ '0.7.2',
34
35
  ]);
35
36
  });
36
37
  });
@@ -32,6 +32,7 @@ const registry = new Map([
32
32
  ['0.6.4', () => import('./transforms/v0.6.4/index.mjs')],
33
33
  ['0.6.7', () => import('./transforms/v0.6.7/index.mjs')],
34
34
  ['0.7.0', () => import('./transforms/v0.7.0/index.mjs')],
35
+ ['0.7.2', () => import('./transforms/v0.7.2/index.mjs')],
35
36
  ]);
36
37
 
37
38
  // Re-export from the shared utility so registry callers and other consumers
@@ -418,6 +418,7 @@ async function runProjectCodemod(
418
418
  * @param {boolean} [options.silent] - Suppress all human-facing output (for --json)
419
419
  * @param {string} [options.root] - Project root a project codemod reads (default: the process cwd)
420
420
  * @param {{root: string, classify: (file: string) => import('../../foundation/fs/file-protection.mjs').FileProtection[]}} [options.protection] - Preloaded protection resolver
421
+ * @param {boolean} [options.coversTarget] - False when these codemods stop before the installed target (the CLI is older than Core), so a run with no changes does not say the code is up to date. Default true.
421
422
  * @returns {Promise<{totalFilesChanged: number, totalTransformsApplied: number, totalValidationBlocked: number, changedFiles: string[], writtenFiles: string[], stagedContents: Map<string, string>, protectedFiles: import('../../authoring/codemod/type').CodemodRunResult['protectedFiles'], errors: Array<{file: string, codemod: string, error: string}>, skippedOptional: Array<{name: string, meta: {title: string, description?: string, fileExtensions?: string[], codemodType?: string}, version: string}>} | {ok: false, reason: string, resolvedPath: string}>}
422
423
  */
423
424
  export async function runCodemods(
@@ -430,6 +431,7 @@ export async function runCodemods(
430
431
  silent = false,
431
432
  root = process.cwd(),
432
433
  protection: providedProtection,
434
+ coversTarget = true,
433
435
  },
434
436
  ) {
435
437
  // No-op stub object so silent mode skips log output entirely without
@@ -643,7 +645,11 @@ export async function runCodemods(
643
645
  errors.length === 0 &&
644
646
  protectedFiles.length === 0
645
647
  ) {
646
- log.success('No changes needed — your code is already up to date!');
648
+ // Codemods that stop before the installed target cannot vouch for the
649
+ // code; the caller says what is missing.
650
+ if (coversTarget) {
651
+ log.success('No changes needed — your code is already up to date!');
652
+ }
647
653
  } else if (apply && protectedFiles.length > 0) {
648
654
  log.warn(
649
655
  `Applied ${totalTransformsApplied} owned change${totalTransformsApplied === 1 ? '' : 's'} across ${totalFilesChanged} file${totalFilesChanged === 1 ? '' : 's'}; protected changes remain.`,
@@ -7,14 +7,4 @@
7
7
  * this file into the resolved version folder.
8
8
  */
9
9
 
10
- import migrateListEdgeCompensationToEdge, {
11
- meta as migrateListEdgeCompensationToEdgeMeta,
12
- } from './migrate-list-edge-compensation-to-edge.mjs';
13
-
14
- export default [
15
- {
16
- name: 'migrate-list-edge-compensation-to-edge',
17
- transform: migrateListEdgeCompensationToEdge,
18
- meta: migrateListEdgeCompensationToEdgeMeta,
19
- },
20
- ];
10
+ export default [];
@@ -0,0 +1,20 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file next transform manifest
5
+ *
6
+ * Staged codemods for the next release. The Version Packages PR promotes
7
+ * this file into the resolved version folder.
8
+ */
9
+
10
+ import migrateListEdgeCompensationToEdge, {
11
+ meta as migrateListEdgeCompensationToEdgeMeta,
12
+ } from './migrate-list-edge-compensation-to-edge.mjs';
13
+
14
+ export default [
15
+ {
16
+ name: 'migrate-list-edge-compensation-to-edge',
17
+ transform: migrateListEdgeCompensationToEdge,
18
+ meta: migrateListEdgeCompensationToEdgeMeta,
19
+ },
20
+ ];