@astryxdesign/cli 0.6.3-canary.98a2e4e → 0.6.3-canary.9c4d44d

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 (612) hide show
  1. package/README.md +117 -79
  2. package/api/blog/blog.doc.mjs +1 -0
  3. package/api/build/_adapter.d.mts +50 -0
  4. package/api/build/_adapter.mjs +60 -0
  5. package/api/build/build.doc.mjs +16 -9
  6. package/api/build/build.test.mjs +197 -8
  7. package/api/build/build.type.d.mts +91 -2
  8. package/api/build/build.type.mjs +52 -8
  9. package/api/build/help/help.d.mts +12 -5
  10. package/api/build/help/help.mjs +69 -6
  11. package/api/build/kit/kit.d.mts +4 -1
  12. package/api/build/kit/kit.mjs +165 -49
  13. package/api/build/kit/rank.d.mts +44 -0
  14. package/api/build/kit/rank.mjs +432 -0
  15. package/api/build/kit/rank.test.mjs +196 -0
  16. package/api/component/_adapter.d.mts +6 -12
  17. package/api/component/_adapter.mjs +20 -10
  18. package/api/component/component.doc.mjs +13 -3
  19. package/api/component/component.mjs +91 -14
  20. package/api/component/component.test.mjs +38 -0
  21. package/api/component/component.type.d.mts +22 -11
  22. package/api/component/component.type.mjs +32 -24
  23. package/api/component/detail/blocks/blocks.d.mts +2 -1
  24. package/api/component/detail/blocks/blocks.mjs +4 -3
  25. package/api/component/list/list.d.mts +0 -5
  26. package/api/component/list/list.mjs +40 -11
  27. package/api/discover/_adapter.d.mts +114 -6
  28. package/api/discover/_adapter.mjs +372 -17
  29. package/api/discover/_adapter.test.mjs +215 -0
  30. package/api/discover/_catalog-view.d.mts +115 -0
  31. package/api/discover/_catalog-view.mjs +203 -0
  32. package/api/discover/_catalog-view.test.mjs +128 -0
  33. package/api/discover/detail/detail.d.mts +18 -6
  34. package/api/discover/detail/detail.mjs +67 -13
  35. package/api/discover/detail/detail.test.mjs +85 -0
  36. package/api/discover/detail/item/item.d.mts +26 -0
  37. package/api/discover/detail/item/item.mjs +78 -0
  38. package/api/discover/detail/item/item.test.mjs +73 -0
  39. package/api/discover/discover.d.mts +3 -9
  40. package/api/discover/discover.doc.mjs +62 -18
  41. package/api/discover/discover.mjs +220 -36
  42. package/api/discover/discover.test.mjs +11 -2
  43. package/api/discover/discover.type.d.mts +150 -11
  44. package/api/discover/discover.type.mjs +107 -17
  45. package/api/discover/list/list.d.mts +20 -6
  46. package/api/discover/list/list.mjs +45 -12
  47. package/api/discover/list/list.test.mjs +46 -0
  48. package/api/discover/search/search.d.mts +18 -16
  49. package/api/discover/search/search.mjs +102 -56
  50. package/api/discover/search/search.test.mjs +144 -10
  51. package/api/docs/_adapter.d.mts +268 -47
  52. package/api/docs/_adapter.mjs +970 -149
  53. package/api/docs/compiled-topics.test.mjs +78 -0
  54. package/api/docs/detail/detail.d.mts +0 -15
  55. package/api/docs/detail/detail.mjs +22 -78
  56. package/api/docs/detail/section/section.mjs +39 -24
  57. package/api/docs/detail/section/section.test.mjs +19 -9
  58. package/api/docs/docs.d.mts +5 -3
  59. package/api/docs/docs.doc.mjs +39 -17
  60. package/api/docs/docs.mjs +44 -8
  61. package/api/docs/docs.test.mjs +158 -4
  62. package/api/docs/docs.type.d.mts +185 -6
  63. package/api/docs/docs.type.mjs +127 -13
  64. package/api/docs/index/index.mjs +15 -6
  65. package/api/docs/index/index.test.mjs +1 -1
  66. package/api/docs/integration-tree.test.mjs +555 -0
  67. package/api/docs/integrationDocs.test.mjs +14 -14
  68. package/api/docs/list/list.mjs +28 -12
  69. package/api/docs/node/node.d.mts +43 -0
  70. package/api/docs/node/node.mjs +192 -0
  71. package/api/docs/reference-blocks.test.mjs +406 -0
  72. package/api/doctor/doctor.d.mts +54 -4
  73. package/api/doctor/doctor.doc.mjs +1 -0
  74. package/api/doctor/doctor.mjs +332 -21
  75. package/api/doctor/doctor.test.mjs +420 -7
  76. package/api/gap-report/gap-report.doc.mjs +8 -4
  77. package/api/hook/_adapter.mjs +19 -5
  78. package/api/hook/hook.doc.mjs +1 -0
  79. package/api/hook/hook.type.d.mts +3 -3
  80. package/api/hook/hook.type.mjs +11 -11
  81. package/api/hook/list/list.d.mts +1 -1
  82. package/api/hook/list/list.mjs +69 -17
  83. package/api/index.d.mts +1 -1
  84. package/api/index.mjs +1 -0
  85. package/api/init/init.doc.mjs +6 -1
  86. package/api/init/init.test.mjs +41 -1
  87. package/api/init/remove/remove.mjs +1 -1
  88. package/api/init/run/run.mjs +20 -10
  89. package/api/integration/add-contribution.component-names.test.mjs +120 -0
  90. package/api/integration/add-contribution.d.mts +2 -1
  91. package/api/integration/add-contribution.mjs +130 -15
  92. package/api/integration/add-contribution.test.mjs +258 -7
  93. package/api/integration/add-helpers.d.mts +5 -2
  94. package/api/integration/add-helpers.mjs +36 -9
  95. package/api/integration/add-theme.mjs +34 -64
  96. package/api/integration/add-theme.test.mjs +105 -21
  97. package/api/integration/authoring-checks.mjs +138 -28
  98. package/api/integration/authoring-checks.test.mjs +179 -7
  99. package/api/integration/authoring-checks.type.mjs +6 -1
  100. package/api/integration/integration-authoring.type.d.mts +2 -0
  101. package/api/integration/integration-authoring.type.mjs +2 -0
  102. package/api/integration/integration-block-exports.test.mjs +10 -6
  103. package/api/integration/integrationAdd.doc.mjs +14 -4
  104. package/api/integration/integrationAddAgentDoc.doc.mjs +1 -0
  105. package/api/integration/integrationAddCodemod.doc.mjs +1 -0
  106. package/api/integration/integrationAddComponent.doc.mjs +2 -1
  107. package/api/integration/integrationAddDoc.doc.mjs +8 -1
  108. package/api/integration/integrationAddTemplate.doc.mjs +1 -0
  109. package/api/integration/integrationAddTheme.doc.mjs +6 -5
  110. package/api/integration/integrationComponentConflicts.doc.mjs +1 -0
  111. package/api/integration/integrationDocConflicts.doc.mjs +2 -1
  112. package/api/integration/integrationPackCheck.doc.mjs +2 -1
  113. package/api/integration/integrationTemplateConflicts.doc.d.mts +3 -0
  114. package/api/integration/integrationTemplateConflicts.doc.mjs +4 -0
  115. package/api/integration/pack-check.mjs +83 -7
  116. package/api/integration/pack-check.test.mjs +387 -47
  117. package/api/integration/pack-check.type.d.mts +26 -2
  118. package/api/integration/pack-check.type.mjs +14 -1
  119. package/api/integration/summarizeIssues.doc.mjs +1 -0
  120. package/api/integration/template-conflict-compatibility.test.mjs +73 -0
  121. package/api/integration/validate-integration-fixes.test.mjs +1389 -0
  122. package/api/integration/validate-integration.mjs +52 -102
  123. package/api/integration/validate-integration.test.mjs +179 -26
  124. package/api/integration/validate-unread-theme-folders.test.mjs +110 -0
  125. package/api/integration/validateIntegration.doc.mjs +3 -2
  126. package/api/json/assertResponse.doc.mjs +1 -0
  127. package/api/json/envelope-types.test.mjs +76 -0
  128. package/api/json/index.ts +2 -0
  129. package/api/json/isError.doc.mjs +1 -0
  130. package/api/json/parseResponse.doc.mjs +3 -2
  131. package/api/layout/_adapter.mjs +20 -5
  132. package/api/layout/expand/expand.mjs +7 -5
  133. package/api/layout/expand/expand.path-safety.test.mjs +53 -0
  134. package/api/layout/grammar/grammar.mjs +2 -1
  135. package/api/layout/layoutCheck.doc.mjs +1 -0
  136. package/api/layout/layoutExpand.doc.mjs +2 -1
  137. package/api/layout/layoutGrammar.doc.mjs +1 -0
  138. package/api/search/search-return-type.test.mjs +54 -0
  139. package/api/search/search.d.mts +61 -10
  140. package/api/search/search.doc.mjs +8 -2
  141. package/api/search/search.mjs +471 -83
  142. package/api/search/search.test.mjs +124 -1
  143. package/api/search/search.type.d.mts +14 -2
  144. package/api/search/search.type.mjs +5 -2
  145. package/api/swizzle/copy/copy.mjs +28 -11
  146. package/api/swizzle/swizzle.doc.mjs +2 -1
  147. package/api/swizzle/swizzle.type.d.mts +2 -2
  148. package/api/swizzle/swizzle.type.mjs +2 -2
  149. package/api/template/copy/copy.mjs +17 -23
  150. package/api/template/copy/copy.test.mjs +17 -0
  151. package/api/template/list/list.mjs +1 -0
  152. package/api/template/table-floating-bulk-actions.test.mjs +66 -0
  153. package/api/template/template-integration.test.mjs +1072 -3
  154. package/api/template/template-suffix.test.mjs +41 -21
  155. package/api/template/template.doc.mjs +30 -8
  156. package/api/template/template.mjs +45 -8
  157. package/api/template/template.type.d.mts +11 -13
  158. package/api/template/template.type.mjs +15 -14
  159. package/api/theme/_adapter.d.mts +2 -3
  160. package/api/theme/_adapter.mjs +4 -5
  161. package/api/theme/add/add.binary.test.mjs +84 -0
  162. package/api/theme/add/add.mjs +31 -22
  163. package/api/theme/add/add.rollback.test.mjs +158 -0
  164. package/api/theme/add/add.staging.test.mjs +83 -0
  165. package/api/theme/add/add.test.mjs +14 -1
  166. package/api/theme/build/build.family.test.mjs +7 -12
  167. package/api/theme/build/build.mjs +140 -59
  168. package/api/theme/build/build.public-component-vars.test.mjs +1 -1
  169. package/api/theme/build/build.receipt-doc.test.mjs +111 -0
  170. package/api/theme/build/build.rollback.test.mjs +148 -0
  171. package/api/theme/build/build.test.mjs +127 -0
  172. package/api/theme/build/font-warning.mjs +3 -3
  173. package/api/theme/build/font-warning.test.mjs +5 -2
  174. package/api/theme/generateTonalPalette.doc.mjs +1 -0
  175. package/api/theme/integration-themes.test.mjs +39 -28
  176. package/api/theme/list/list.test.mjs +19 -20
  177. package/api/theme/listThemes.doc.mjs +6 -5
  178. package/api/theme/palette/generate/generate.mjs +8 -3
  179. package/api/theme/palette/generate/generate.test.mjs +96 -0
  180. package/api/theme/palette/generate/generator.d.mts +10 -13
  181. package/api/theme/palette/generate/generator.mjs +15 -4
  182. package/api/theme/palette/generate/generator.test.mjs +10 -0
  183. package/api/theme/template/template.mjs +11 -2
  184. package/api/theme/template/template.test.mjs +20 -0
  185. package/api/theme/theme.type.d.mts +170 -11
  186. package/api/theme/theme.type.mjs +94 -27
  187. package/api/theme/themeAdd.doc.mjs +4 -3
  188. package/api/theme/themeBuild.doc.mjs +8 -4
  189. package/api/theme/themeList.doc.mjs +6 -3
  190. package/api/theme/themeListAvailable.doc.mjs +5 -3
  191. package/api/theme/themePaletteGenerate.doc.mjs +1 -0
  192. package/api/theme/themeTargets.doc.mjs +1 -0
  193. package/api/theme/themeTemplate.doc.mjs +6 -2
  194. package/api/upgrade/_adapter.d.mts +32 -5
  195. package/api/upgrade/_adapter.mjs +124 -73
  196. package/api/upgrade/list/list.mjs +2 -1
  197. package/api/upgrade/list/list.test.mjs +73 -0
  198. package/api/upgrade/provider-agreement.test.mjs +152 -0
  199. package/api/upgrade/run/run.mjs +356 -59
  200. package/api/upgrade/status/status.mjs +2 -2
  201. package/api/upgrade/upgrade.doc.mjs +8 -2
  202. package/api/upgrade/upgrade.type.d.mts +42 -4
  203. package/api/upgrade/upgrade.type.mjs +26 -10
  204. package/assets/codemods/__tests__/runner.test.mjs +330 -8
  205. package/assets/codemods/integration-discovery.mjs +48 -4
  206. package/assets/codemods/integration-discovery.test.mjs +73 -0
  207. package/assets/codemods/integration-runner.mjs +56 -4
  208. package/assets/codemods/integration-runner.protection.test.mjs +153 -0
  209. package/assets/codemods/run-codemod.mjs +177 -34
  210. package/assets/codemods/runner.mjs +350 -102
  211. package/assets/codemods/term-log.mjs +32 -8
  212. package/assets/codemods/term-log.test.mjs +19 -1
  213. package/assets/codemods/transform-prop.mjs +109 -0
  214. package/assets/codemods/transform-prop.test.mjs +95 -0
  215. package/assets/codemods/transforms/next/__tests__/migrate-native-picker-to-presentation.test.mjs +63 -0
  216. package/assets/codemods/transforms/next/__tests__/migrate-theme-catalog-to-descriptors.test.mjs +220 -0
  217. package/assets/codemods/transforms/next/index.mjs +19 -1
  218. package/assets/codemods/transforms/next/migrate-native-picker-to-presentation.mjs +148 -0
  219. package/assets/codemods/transforms/next/migrate-theme-catalog-to-descriptors.mjs +141 -0
  220. package/assets/codemods/transforms/v0.0.14/__tests__/rename-status-variants.test.mjs +86 -165
  221. package/assets/codemods/transforms/v0.0.14/rename-status-variants.mjs +72 -210
  222. package/assets/codemods/transforms/v0.1.8/__tests__/rename-avatar-size-scale.test.mjs +83 -115
  223. package/assets/codemods/transforms/v0.1.8/rename-avatar-size-scale.mjs +57 -186
  224. package/assets/codemods/transforms/v0.3.0/__tests__/unwrap-authoring-factories.test.mjs +27 -5
  225. package/assets/codemods/transforms/v0.3.0/unwrap-authoring-factories.mjs +20 -5
  226. package/assets/codemods/transforms/v0.6.0/__tests__/next-codemods.test.mjs +47 -0
  227. package/assets/codemods/transforms/v0.6.0/rename-resizable-pixel-bounds.mjs +57 -10
  228. package/assets/docs/getting-started.doc.mjs +2 -2
  229. package/assets/docs/internationalization.doc.mjs +7 -5
  230. package/assets/docs/layout.doc.dense.mjs +2 -2
  231. package/assets/docs/layout.doc.mjs +1 -1
  232. package/assets/docs/principles.doc.mjs +6 -6
  233. package/assets/docs/styling-libraries.doc.mjs +4 -4
  234. package/assets/docs/styling.doc.mjs +4 -4
  235. package/assets/docs/theme.doc.mjs +5 -5
  236. package/assets/docs/tokens.doc.mjs +1 -1
  237. package/assets/docs/tree/api.doc.mjs +30 -0
  238. package/assets/docs/tree/cli.doc.mjs +23 -0
  239. package/assets/docs/tree/commands.doc.mjs +25 -0
  240. package/assets/docs/{cli-integrations.doc.mjs → tree/integrations.doc.mjs} +95 -39
  241. package/assets/docs/tree/integrations.test.mjs +62 -0
  242. package/assets/docs/tree/writing-docs.doc.mjs +286 -0
  243. package/assets/docs/working-with-ai.doc.mjs +4 -4
  244. package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.doc.mjs +1 -1
  245. package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.tsx +1 -3
  246. package/assets/templates/blocks/components/DateInput/DateInputDateRange.tsx +1 -1
  247. package/assets/templates/blocks/components/InternationalizationProvider/InternationalizationProvider01ShippedLocale.tsx +1 -1
  248. package/assets/templates/blocks/components/Item/ItemDocumentTabs.doc.mjs +14 -0
  249. package/assets/templates/blocks/components/Item/ItemDocumentTabs.tsx +100 -0
  250. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.doc.mjs +14 -0
  251. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.tsx +61 -0
  252. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.doc.mjs +14 -0
  253. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.tsx +126 -0
  254. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.doc.mjs +15 -0
  255. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.tsx +86 -0
  256. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.doc.mjs +14 -0
  257. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.tsx +99 -0
  258. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.doc.mjs +14 -0
  259. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.tsx +122 -0
  260. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.doc.mjs +14 -0
  261. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.tsx +95 -0
  262. package/assets/templates/blocks/components/Table/TableBulkActionsTable.doc.mjs +14 -0
  263. package/assets/templates/blocks/components/Table/TableBulkActionsTable.tsx +71 -0
  264. package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.doc.mjs +19 -0
  265. package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.tsx +139 -0
  266. package/assets/templates/blocks/components/TimeInput/TimeInputConstrained.tsx +1 -0
  267. package/assets/templates/pages/table-tree/page.tsx +1704 -0
  268. package/assets/templates/pages/table-tree/template.doc.mjs +12 -0
  269. package/assets/templates/themes/butter/butterTheme.doc.mjs +11 -0
  270. package/assets/templates/themes/chocolate/chocolateTheme.doc.mjs +11 -0
  271. package/assets/templates/themes/gothic/gothicTheme.doc.mjs +11 -0
  272. package/assets/templates/themes/matcha/matchaTheme.doc.mjs +11 -0
  273. package/assets/templates/themes/neutral/neutralTheme.doc.mjs +11 -0
  274. package/assets/templates/themes/stone/stoneTheme.doc.mjs +11 -0
  275. package/assets/templates/themes/y2k/y2kTheme.doc.mjs +11 -0
  276. package/authoring/_shared/contract.ts +22 -0
  277. package/authoring/codemod/codemod.doc.mjs +7 -2
  278. package/authoring/codemod/parse.d.mts +8 -8
  279. package/authoring/codemod/parse.mjs +8 -6
  280. package/authoring/codemod/type.ts +12 -0
  281. package/authoring/config/config.doc.mjs +10 -2
  282. package/authoring/config/debug-composition.test.mjs +92 -0
  283. package/authoring/config/parse.d.mts +15 -13
  284. package/authoring/config/parse.mjs +27 -8
  285. package/authoring/config/parse.test.mjs +8 -0
  286. package/authoring/config/type.ts +29 -6
  287. package/authoring/debug/debug.doc.d.mts +11 -0
  288. package/authoring/debug/debug.doc.mjs +182 -0
  289. package/authoring/debug/parse.d.mts +7 -7
  290. package/authoring/debug/parse.mjs +3 -3
  291. package/authoring/discover/discover.doc.d.mts +13 -0
  292. package/authoring/discover/discover.doc.mjs +138 -0
  293. package/authoring/discover/parse.d.mts +24 -0
  294. package/authoring/discover/parse.mjs +128 -0
  295. package/authoring/discover/parse.test.mjs +124 -0
  296. package/authoring/discover/type.ts +87 -0
  297. package/authoring/doctypes/_schema.d.mts +240 -128
  298. package/authoring/doctypes/_schema.mjs +198 -16
  299. package/authoring/doctypes/base/graph-fields.doc.mjs +15 -6
  300. package/authoring/doctypes/base/type.ts +9 -4
  301. package/authoring/doctypes/command/command.doc.mjs +4 -3
  302. package/authoring/doctypes/command/parse.d.mts +2 -2
  303. package/authoring/doctypes/command/parse.mjs +1 -1
  304. package/authoring/doctypes/command/type.ts +4 -4
  305. package/authoring/doctypes/component/component.doc.mjs +5 -2
  306. package/authoring/doctypes/component/parse.d.mts +2 -2
  307. package/authoring/doctypes/component/parse.mjs +1 -1
  308. package/authoring/doctypes/component/type.ts +3 -3
  309. package/authoring/doctypes/doctypes-new.test.mjs +48 -6
  310. package/authoring/doctypes/enum/enum.doc.mjs +1 -1
  311. package/authoring/doctypes/enum/parse.d.mts +2 -2
  312. package/authoring/doctypes/enum/parse.mjs +1 -1
  313. package/authoring/doctypes/enum/type.ts +2 -2
  314. package/authoring/doctypes/function/function.doc.mjs +7 -2
  315. package/authoring/doctypes/function/parse.d.mts +2 -2
  316. package/authoring/doctypes/function/parse.mjs +1 -1
  317. package/authoring/doctypes/function/type.ts +4 -3
  318. package/authoring/doctypes/hook/hook.doc.mjs +4 -0
  319. package/authoring/doctypes/hook/parse.d.mts +2 -2
  320. package/authoring/doctypes/hook/parse.mjs +1 -1
  321. package/authoring/doctypes/hook/type.ts +3 -3
  322. package/authoring/doctypes/legacy.d.mts +6 -6
  323. package/authoring/doctypes/legacy.mjs +3 -3
  324. package/authoring/doctypes/load-contract.test.mjs +233 -0
  325. package/authoring/doctypes/namespace/namespace.doc.mjs +9 -9
  326. package/authoring/doctypes/namespace/parse.d.mts +2 -2
  327. package/authoring/doctypes/namespace/parse.mjs +1 -1
  328. package/authoring/doctypes/namespace/parse.test.mjs +23 -25
  329. package/authoring/doctypes/namespace/type.ts +6 -3
  330. package/authoring/doctypes/parse.d.mts +22 -20
  331. package/authoring/doctypes/parse.mjs +19 -14
  332. package/authoring/doctypes/reference/parse.d.mts +2 -2
  333. package/authoring/doctypes/reference/parse.mjs +1 -1
  334. package/authoring/doctypes/reference/reference.doc.mjs +39 -6
  335. package/authoring/doctypes/reference/type.ts +31 -14
  336. package/authoring/doctypes/schema/parse.d.mts +2 -2
  337. package/authoring/doctypes/schema/parse.mjs +1 -1
  338. package/authoring/doctypes/schema/schema.doc.mjs +1 -1
  339. package/authoring/doctypes/schema/type.ts +3 -4
  340. package/authoring/doctypes/template/parse.d.mts +94 -1
  341. package/authoring/doctypes/template/parse.mjs +37 -1
  342. package/authoring/doctypes/template/parse.test.mjs +18 -0
  343. package/authoring/doctypes/template/template.doc.mjs +13 -3
  344. package/authoring/doctypes/template/type.ts +12 -1
  345. package/authoring/doctypes/theme/parse.d.mts +35 -0
  346. package/authoring/doctypes/theme/parse.mjs +76 -0
  347. package/authoring/doctypes/theme/theme.doc.d.mts +9 -0
  348. package/authoring/doctypes/theme/theme.doc.mjs +79 -0
  349. package/authoring/doctypes/theme/type.ts +42 -0
  350. package/authoring/doctypes/types.ts +12 -11
  351. package/authoring/gap-report/gap-report.doc.d.mts +12 -0
  352. package/authoring/gap-report/gap-report.doc.mjs +183 -0
  353. package/authoring/gap-report/parse.d.mts +9 -9
  354. package/authoring/gap-report/parse.mjs +6 -6
  355. package/authoring/gap-report/type.ts +1 -1
  356. package/authoring/identity/identity.doc.mjs +3 -2
  357. package/authoring/identity/type.ts +10 -10
  358. package/authoring/index.d.mts +2 -0
  359. package/authoring/index.d.ts +32 -19
  360. package/authoring/index.mjs +3 -1
  361. package/authoring/integration/integration.doc.mjs +2 -2
  362. package/authoring/integration/parse.d.mts +2 -2
  363. package/authoring/integration/parse.mjs +1 -1
  364. package/authoring/integration/schema.d.mts +4 -4
  365. package/authoring/integration/schema.mjs +3 -3
  366. package/authoring/integration/type.ts +5 -11
  367. package/clients/cli/__tests__/cliManifest.test.ts +27 -29
  368. package/clients/cli/command-load-failure.test.mjs +83 -0
  369. package/clients/cli/commands/blog.doc.mjs +1 -1
  370. package/clients/cli/commands/blog.mjs +23 -8
  371. package/clients/cli/commands/blog.test.mjs +42 -1
  372. package/clients/cli/commands/build-theme.adaptations.test.mjs +100 -1
  373. package/clients/cli/commands/build-theme.ascii-output.test.mjs +161 -0
  374. package/clients/cli/commands/build-theme.flag-docs.test.mjs +110 -0
  375. package/clients/cli/commands/build-theme.mjs +16 -50
  376. package/clients/cli/commands/build-theme.path-safety.test.mjs +86 -1
  377. package/clients/cli/commands/build-theme.variants.test.mjs +76 -0
  378. package/clients/cli/commands/build.doc.mjs +16 -8
  379. package/clients/cli/commands/build.exit-codes-doc.test.mjs +50 -0
  380. package/clients/cli/commands/build.mjs +137 -114
  381. package/clients/cli/commands/build.playbook.test.mjs +75 -0
  382. package/clients/cli/commands/build.text-fields.test.mjs +81 -0
  383. package/clients/cli/commands/component/index.mjs +3 -8
  384. package/clients/cli/commands/component-ownership.test.mjs +3 -3
  385. package/clients/cli/commands/component-package.test.mjs +46 -0
  386. package/clients/cli/commands/component-resolution.test.mjs +21 -0
  387. package/clients/cli/commands/component.doc.mjs +1 -1
  388. package/clients/cli/commands/component.test.mjs +19 -0
  389. package/clients/cli/commands/detail-levels.test.mjs +2 -2
  390. package/clients/cli/commands/discover.broken-integration.test.mjs +52 -5
  391. package/clients/cli/commands/discover.components-flag.test.mjs +97 -0
  392. package/clients/cli/commands/discover.doc.mjs +55 -9
  393. package/clients/cli/commands/discover.mjs +393 -118
  394. package/clients/cli/commands/discover.sources.test.mjs +267 -0
  395. package/clients/cli/commands/discover.text-projection.test.mjs +103 -0
  396. package/clients/cli/commands/docs.doc.mjs +21 -9
  397. package/clients/cli/commands/docs.mjs +184 -70
  398. package/clients/cli/commands/docs.test.mjs +120 -16
  399. package/clients/cli/commands/doctor-integration-components.doc.mjs +1 -1
  400. package/clients/cli/commands/doctor-integration-docs.doc.mjs +3 -3
  401. package/clients/cli/commands/doctor-integration-templates.doc.mjs +15 -8
  402. package/clients/cli/commands/doctor-integration-validate.doc.mjs +1 -1
  403. package/clients/cli/commands/doctor-integration.doc.mjs +1 -1
  404. package/clients/cli/commands/doctor-integration.package-json.test.mjs +53 -0
  405. package/clients/cli/commands/doctor-integration.test.mjs +90 -8
  406. package/clients/cli/commands/doctor.doc.mjs +1 -1
  407. package/clients/cli/commands/doctor.mjs +59 -32
  408. package/clients/cli/commands/doctor.test.mjs +42 -0
  409. package/clients/cli/commands/gap-report.doc.mjs +17 -6
  410. package/clients/cli/commands/gap-report.test.mjs +72 -0
  411. package/clients/cli/commands/hook/index.mjs +7 -17
  412. package/clients/cli/commands/hook.doc.mjs +1 -1
  413. package/clients/cli/commands/hook.text-projection.test.mjs +45 -0
  414. package/clients/cli/commands/init.doc.mjs +20 -9
  415. package/clients/cli/commands/init.flag-help.test.mjs +153 -0
  416. package/clients/cli/commands/integration-add.controls.test.mjs +132 -0
  417. package/clients/cli/commands/integration-add.doc.mjs +32 -6
  418. package/clients/cli/commands/integration-authoring.test.mjs +13 -9
  419. package/clients/cli/commands/integration-pack.doc.mjs +1 -1
  420. package/clients/cli/commands/integration-real-world.test.mjs +3 -9
  421. package/clients/cli/commands/integration.doc.mjs +1 -1
  422. package/clients/cli/commands/integration.mjs +1 -0
  423. package/clients/cli/commands/interactive-guard.test.mjs +101 -24
  424. package/clients/cli/commands/json-contract.test.mjs +33 -0
  425. package/clients/cli/commands/layout-check.doc.mjs +15 -4
  426. package/clients/cli/commands/layout-expand.doc.mjs +22 -5
  427. package/clients/cli/commands/layout-grammar.doc.mjs +1 -1
  428. package/clients/cli/commands/layout.doc.mjs +3 -3
  429. package/clients/cli/commands/layout.mjs +21 -9
  430. package/clients/cli/commands/layout.path-help.test.mjs +33 -0
  431. package/clients/cli/commands/layout.stdin-cap.test.mjs +47 -0
  432. package/clients/cli/commands/layout.text-fields.test.mjs +39 -0
  433. package/clients/cli/commands/manifest.doc.mjs +1 -1
  434. package/clients/cli/commands/no-prompt-wording.test.mjs +94 -0
  435. package/clients/cli/commands/search.doc.mjs +7 -4
  436. package/clients/cli/commands/search.mjs +28 -9
  437. package/clients/cli/commands/search.test.mjs +75 -0
  438. package/clients/cli/commands/setup-nudge.test.mjs +6 -0
  439. package/clients/cli/commands/swizzle.doc.mjs +3 -2
  440. package/clients/cli/commands/swizzle.path-safety.test.mjs +42 -0
  441. package/clients/cli/commands/template.doc.mjs +52 -13
  442. package/clients/cli/commands/template.flag-help.test.mjs +117 -0
  443. package/clients/cli/commands/template.mjs +4 -91
  444. package/clients/cli/commands/template.path-help.test.mjs +40 -0
  445. package/clients/cli/commands/text-json-parity.test.mjs +719 -0
  446. package/clients/cli/commands/theme-add.doc.mjs +4 -3
  447. package/clients/cli/commands/theme-build.doc.mjs +8 -7
  448. package/clients/cli/commands/theme-list.doc.mjs +2 -2
  449. package/clients/cli/commands/theme-palette-generate.doc.mjs +3 -3
  450. package/clients/cli/commands/theme-palette-generate.test.mjs +19 -0
  451. package/clients/cli/commands/theme-palette.doc.mjs +1 -1
  452. package/clients/cli/commands/theme-targets.behavior.test.mjs +4 -3
  453. package/clients/cli/commands/theme-targets.doc.mjs +1 -1
  454. package/clients/cli/commands/theme-template.behavior.test.mjs +12 -0
  455. package/clients/cli/commands/theme-template.doc.mjs +2 -2
  456. package/clients/cli/commands/theme.doc.mjs +1 -1
  457. package/clients/cli/commands/upgrade.ascii-output.test.mjs +87 -0
  458. package/clients/cli/commands/upgrade.doc.mjs +20 -8
  459. package/clients/cli/commands/upgrade.file-protection.test.mjs +228 -0
  460. package/clients/cli/commands/upgrade.flag-help.test.mjs +188 -0
  461. package/clients/cli/commands/upgrade.hook-output.test.mjs +88 -0
  462. package/clients/cli/commands/upgrade.mjs +29 -7
  463. package/clients/cli/formatters/index.mjs +2 -0
  464. package/clients/cli/formatters/index.test.mjs +6 -0
  465. package/clients/cli/index.mjs +21 -30
  466. package/clients/cli/latest-version-env.test.mjs +50 -0
  467. package/clients/cli/lib/cli-error.test.mjs +7 -0
  468. package/clients/cli/lib/component-format.mjs +9 -9
  469. package/clients/cli/lib/component-format.test.mjs +1 -1
  470. package/clients/cli/lib/define-command.mjs +32 -6
  471. package/clients/cli/lib/doc-text-ascii.test.mjs +82 -0
  472. package/clients/cli/lib/exit-codes.test.mjs +97 -0
  473. package/clients/cli/lib/hook-format.mjs +19 -10
  474. package/clients/cli/lib/json-shim.mjs +38 -2
  475. package/clients/cli/lib/json-shim.test.mjs +83 -0
  476. package/clients/cli/lib/manifest.d.ts +2 -0
  477. package/clients/cli/lib/manifest.mjs +32 -2
  478. package/clients/cli/lib/manifest.test.mjs +17 -0
  479. package/foundation/agent-docs/agent-docs.d.mts +7 -2
  480. package/foundation/agent-docs/agent-docs.mjs +82 -12
  481. package/foundation/agent-docs/agent-docs.path-safety.test.mjs +266 -4
  482. package/foundation/agent-docs/agent-docs.test.mjs +19 -1
  483. package/foundation/config/integration-debug.test.mjs +28 -3
  484. package/foundation/config/project-themes.test.mjs +11 -19
  485. package/foundation/config/project.d.mts +20 -11
  486. package/foundation/config/project.mjs +246 -89
  487. package/foundation/config/project.test.mjs +270 -21
  488. package/foundation/discovery/authoring-self-docs.d.mts +18 -0
  489. package/foundation/discovery/authoring-self-docs.mjs +38 -15
  490. package/foundation/discovery/authoring-self-docs.test.mjs +87 -12
  491. package/foundation/discovery/authoring-surface.d.mts +74 -0
  492. package/foundation/discovery/authoring-surface.mjs +525 -0
  493. package/foundation/discovery/authoring-surface.test.mjs +392 -0
  494. package/foundation/discovery/cli-self-docs.d.mts +119 -0
  495. package/foundation/discovery/cli-self-docs.mjs +490 -0
  496. package/foundation/discovery/cli-self-docs.test.mjs +375 -0
  497. package/foundation/discovery/component-discovery.d.mts +38 -0
  498. package/foundation/discovery/component-discovery.mjs +48 -0
  499. package/foundation/discovery/component-loader.d.mts +35 -38
  500. package/foundation/discovery/component-loader.mjs +53 -222
  501. package/foundation/discovery/docs-discovery.d.mts +114 -9
  502. package/foundation/discovery/docs-discovery.mjs +239 -30
  503. package/foundation/discovery/docs-discovery.test.mjs +150 -35
  504. package/foundation/discovery/docs-output-budget.d.mts +2 -2
  505. package/foundation/discovery/docs-output-budget.mjs +1 -1
  506. package/foundation/discovery/docs-section-key.d.mts +28 -10
  507. package/foundation/discovery/docs-section-key.mjs +134 -33
  508. package/foundation/discovery/docs-section-key.test.mjs +41 -19
  509. package/foundation/discovery/template-adapter.d.mts +113 -11
  510. package/foundation/discovery/template-adapter.fixture-refs.test.mjs +248 -0
  511. package/foundation/discovery/template-adapter.integration-isolation.test.mjs +94 -0
  512. package/foundation/discovery/template-adapter.mjs +772 -82
  513. package/foundation/discovery/template-adapter.test.mjs +57 -0
  514. package/foundation/discovery/template-conflict-release.d.mts +13 -0
  515. package/foundation/discovery/template-conflict-release.mjs +40 -0
  516. package/foundation/discovery/template-conflict-release.test.mjs +40 -0
  517. package/foundation/discovery/theme-discovery.d.mts +67 -7
  518. package/foundation/discovery/theme-discovery.mjs +916 -186
  519. package/foundation/discovery/theme-discovery.test.mjs +613 -219
  520. package/foundation/discovery/theming-targets.test.mjs +4 -0
  521. package/foundation/doc-compiler/bundle.d.mts +47 -0
  522. package/foundation/doc-compiler/bundle.mjs +278 -0
  523. package/foundation/doc-compiler/bundle.test.mjs +266 -0
  524. package/foundation/doc-compiler/compile.d.mts +343 -0
  525. package/foundation/doc-compiler/compile.mjs +558 -0
  526. package/foundation/doc-compiler/diagnostics.d.mts +126 -0
  527. package/foundation/doc-compiler/diagnostics.mjs +305 -0
  528. package/foundation/doc-compiler/doc-compiler.test.mjs +714 -0
  529. package/foundation/doc-compiler/doc-loads.test.mjs +1642 -0
  530. package/foundation/doc-compiler/import.d.mts +24 -0
  531. package/foundation/doc-compiler/import.mjs +59 -0
  532. package/foundation/doc-compiler/inputs.d.mts +102 -0
  533. package/foundation/doc-compiler/inputs.mjs +291 -0
  534. package/foundation/doc-compiler/inputs.test.mjs +299 -0
  535. package/foundation/doc-compiler/ir.d.mts +22 -0
  536. package/foundation/doc-compiler/ir.mjs +471 -0
  537. package/foundation/doc-compiler/lenses.d.mts +36 -0
  538. package/foundation/doc-compiler/lenses.mjs +173 -0
  539. package/foundation/doc-compiler/links.d.mts +162 -0
  540. package/foundation/doc-compiler/links.mjs +294 -0
  541. package/foundation/doc-compiler/links.test.mjs +192 -0
  542. package/foundation/doc-compiler/lower-doc.test.mjs +495 -0
  543. package/foundation/doc-compiler/overlays.d.mts +37 -0
  544. package/foundation/doc-compiler/overlays.mjs +206 -0
  545. package/foundation/doc-compiler/parse-readable.d.mts +9 -0
  546. package/foundation/doc-compiler/parse-readable.mjs +29 -0
  547. package/foundation/doc-compiler/read.d.mts +127 -0
  548. package/foundation/doc-compiler/read.mjs +325 -0
  549. package/foundation/doc-compiler/read.test.mjs +313 -0
  550. package/foundation/doc-compiler/source.d.mts +33 -0
  551. package/foundation/doc-compiler/source.mjs +128 -0
  552. package/foundation/doc-compiler/tree.d.mts +288 -0
  553. package/foundation/doc-compiler/tree.mjs +876 -0
  554. package/foundation/doc-compiler/tree.test.mjs +598 -0
  555. package/foundation/fs/file-protection.d.mts +33 -0
  556. package/foundation/fs/file-protection.mjs +825 -0
  557. package/foundation/fs/file-protection.test.mjs +250 -0
  558. package/foundation/fs/module-loader.d.mts +1 -0
  559. package/foundation/fs/module-loader.mjs +50 -1
  560. package/foundation/fs/module-loader.stdout.test.mjs +332 -0
  561. package/foundation/fs/path-safety.d.mts +3 -2
  562. package/foundation/fs/path-safety.mjs +49 -19
  563. package/foundation/fs/path-safety.test.mjs +50 -0
  564. package/foundation/fs/publish-file-hardlink-unavailable.test.mjs +129 -94
  565. package/foundation/integrations/autolink.d.mts +58 -1
  566. package/foundation/integrations/autolink.mjs +143 -52
  567. package/foundation/integrations/autolink.test.mjs +1 -1
  568. package/foundation/integrations/cli-requirement.d.mts +45 -0
  569. package/foundation/integrations/cli-requirement.mjs +154 -0
  570. package/foundation/integrations/cli-requirement.test.mjs +84 -0
  571. package/foundation/integrations/contribution-fixes.d.mts +145 -0
  572. package/foundation/integrations/contribution-fixes.mjs +1284 -0
  573. package/foundation/integrations/contribution-inventory.d.mts +3 -2
  574. package/foundation/integrations/contribution-inventory.mjs +27 -24
  575. package/foundation/integrations/contribution-inventory.test.mjs +86 -27
  576. package/foundation/integrations/integration-warnings.d.mts +9 -2
  577. package/foundation/integrations/integration-warnings.mjs +51 -26
  578. package/foundation/integrations/integration-warnings.test.mjs +74 -1
  579. package/foundation/integrations/integrations.d.mts +17 -1
  580. package/foundation/integrations/integrations.mjs +52 -98
  581. package/foundation/integrations/integrations.test.mjs +31 -0
  582. package/foundation/integrations/provider-ledger.test.mjs +275 -0
  583. package/foundation/integrations/provider-resolution.d.mts +152 -0
  584. package/foundation/integrations/provider-resolution.mjs +576 -0
  585. package/foundation/integrations/provider-resolution.test.mjs +369 -0
  586. package/foundation/integrations/theme-descriptor.d.mts +8 -0
  587. package/foundation/integrations/theme-descriptor.mjs +44 -0
  588. package/foundation/integrations/validate-contributions.mjs +121 -29
  589. package/foundation/response/base.d.ts +8 -4
  590. package/foundation/response/error-codes.d.mts +3 -1
  591. package/foundation/response/error-codes.d.ts +2 -0
  592. package/foundation/response/error-codes.doc.mjs +13 -4
  593. package/foundation/response/error-codes.mjs +8 -2
  594. package/foundation/response/error-codes.test.mjs +137 -10
  595. package/foundation/response/json-contract.test.mjs +11 -0
  596. package/foundation/response/json.d.mts +4 -2
  597. package/foundation/response/json.mjs +8 -10
  598. package/foundation/response/response-types.doc.d.mts +5 -1
  599. package/foundation/response/response-types.doc.mjs +37 -22
  600. package/foundation/response/response-types.doc.test.mjs +158 -0
  601. package/foundation/response/response.doc.mjs +1 -1
  602. package/foundation/text/string-utils.d.mts +8 -0
  603. package/foundation/text/string-utils.mjs +40 -10
  604. package/foundation/xle/expand.d.mts +2 -0
  605. package/foundation/xle/expand.mjs +4 -3
  606. package/foundation/xle/expand.test.mjs +54 -0
  607. package/foundation/xle/xle.test.mjs +13 -0
  608. package/package.json +10 -11
  609. package/assets/templates/themes/manifest.json +0 -95
  610. package/clients/cli/lib/update-check.mjs +0 -83
  611. package/clients/cli/lib/update-check.test.mjs +0 -137
  612. package/clients/cli/update-hint-commands.test.mjs +0 -54
@@ -19,7 +19,10 @@ import * as path from 'node:path';
19
19
  import {execFile} from 'node:child_process';
20
20
  import {promisify} from 'node:util';
21
21
  import {ensureJscodeshift} from '../../assets/codemods/ensure-jscodeshift.mjs';
22
- import {getTransformsBetween, latestVersion} from '../../assets/codemods/registry.mjs';
22
+ import {
23
+ getTransformsBetween,
24
+ latestVersion,
25
+ } from '../../assets/codemods/registry.mjs';
23
26
  import {runCodemods} from '../../assets/codemods/runner.mjs';
24
27
  import {
25
28
  discoverIntegrationCodemods,
@@ -32,17 +35,15 @@ import {
32
35
  renderAgentDocsBlock,
33
36
  } from '../../foundation/agent-docs/agent-docs.mjs';
34
37
  import {formatCliCommand} from '../../foundation/env/package-manager.mjs';
35
- import {Project} from '../../foundation/config/project.mjs';
36
- import {
37
- loadIntegrations,
38
- markProviderConflicts,
39
- } from '../../foundation/integrations/integrations.mjs';
38
+ import {Project, providerLedgerOf} from '../../foundation/config/project.mjs';
39
+ import {loadIntegrations} from '../../foundation/integrations/integrations.mjs';
40
+ import {resolveProviders} from '../../foundation/integrations/provider-resolution.mjs';
40
41
  import {warnOnIntegrationIssues} from '../../foundation/integrations/integration-warnings.mjs';
41
42
  import {logger} from '../logger.mjs';
42
43
 
43
44
  // Re-exported for the run leaf's lightweight agent-docs inspection path
44
45
  // (config_fixable short-circuit, where the full render cannot load config).
45
- export { inspectAgentDocs };
46
+ export {inspectAgentDocs};
46
47
 
47
48
  const execFileAsync = promisify(execFile);
48
49
 
@@ -104,6 +105,27 @@ export function uniqueFiles(files) {
104
105
  ];
105
106
  }
106
107
 
108
+ /**
109
+ * Run app code with its stdout writes sent to stderr. Stdout carries only the
110
+ * command's own output, so a hook that prints cannot corrupt `--json`.
111
+ * @template T
112
+ * @param {() => T | Promise<T>} fn
113
+ * @returns {Promise<T>}
114
+ */
115
+ async function withStdoutOnStderr(fn) {
116
+ const realWrite = process.stdout.write;
117
+ process.stdout.write = /** @type {any} */ (
118
+ function (/** @type {any} */ chunk, /** @type {any[]} */ ...rest) {
119
+ return process.stderr.write(chunk, ...rest);
120
+ }
121
+ );
122
+ try {
123
+ return await fn();
124
+ } finally {
125
+ process.stdout.write = realWrite;
126
+ }
127
+ }
128
+
107
129
  /**
108
130
  * Run the app config's post-codemod hooks (config.hooks.postCodemod).
109
131
  * Dry-run PREVIEWS (buildCommand still called, so a throw fails); apply executes.
@@ -123,7 +145,9 @@ export async function runPostCodemodHooks(hooks, context) {
123
145
  );
124
146
  }
125
147
 
126
- const cmd = await hook.buildCommand({packageDir, files});
148
+ const cmd = await withStdoutOnStderr(() =>
149
+ hook.buildCommand({packageDir, files}),
150
+ );
127
151
  if (!cmd) {
128
152
  logger.log(`Post-codemod hook ${label} produced no command; skipping.`);
129
153
  continue;
@@ -147,7 +171,7 @@ export async function runPostCodemodHooks(hooks, context) {
147
171
  env: {...process.env, ...(cmd.options?.env ?? {})},
148
172
  }),
149
173
  );
150
- logger.log(`✓ Post-codemod hook ${label} completed.`);
174
+ logger.log(`[ok] Post-codemod hook ${label} completed.`);
151
175
  }
152
176
  }
153
177
 
@@ -186,7 +210,7 @@ export async function prepareAgentDocsRefresh({
186
210
  if (initial.status === 'missing') {
187
211
  summary.action = 'nudge-init';
188
212
  logger.warn(
189
- `No Astryx agent-docs block found — AI agents have no component index. Run \`${formatCliCommand('astryx init --features agents')}\` to install it.`,
213
+ `No Astryx agent-docs block found - AI agents have no component index. Run \`${formatCliCommand('astryx init --features agents')}\` to install it.`,
190
214
  );
191
215
  return {cwd, renderedBlock: null, summary};
192
216
  }
@@ -240,7 +264,7 @@ export function applyAgentDocsRefresh(plan) {
240
264
  summary.files = written;
241
265
  summary.action = summary.refreshed ? 'refreshed' : 'error';
242
266
  if (summary.refreshed) {
243
- logger.log(`✓ Agent docs refreshed → ${written.join(', ')}`);
267
+ logger.log(`[ok] Agent docs refreshed -> ${written.join(', ')}`);
244
268
  } else {
245
269
  logger.warn(
246
270
  `Agent docs look stale but couldn't be refreshed. Run \`${formatCliCommand('astryx init --features agents')}\` to reinstall the block.`,
@@ -268,7 +292,13 @@ export async function collectAllCodemods() {
268
292
  );
269
293
  for (const {version, transforms} of manifests) {
270
294
  for (const {name, meta, optional} of transforms) {
271
- codemods.push({name, title: meta.title, version, pr: meta.pr, optional: !!optional});
295
+ codemods.push({
296
+ name,
297
+ title: meta.title,
298
+ version,
299
+ pr: meta.pr,
300
+ optional: !!optional,
301
+ });
272
302
  }
273
303
  }
274
304
  return codemods;
@@ -299,33 +329,36 @@ export async function ensureCodemodDeps({installDeps} = {}) {
299
329
  * Run the CORE registry codemods. Runs BEFORE the config is loaded so a core
300
330
  * CONFIG codemod can repair a config the strict loader would otherwise reject.
301
331
  * @param {CoreVersionManifest[]} versionManifests
302
- * @param {{apply: boolean, path: string, codemod?: string, skipCodemods: Set<string>}} options
332
+ * @param {{apply: boolean, path: string, codemod?: string, skipCodemods: Set<string>, root?: string, protection?: {root: string, classify: (file: string) => import('../../foundation/fs/file-protection.mjs').FileProtection[]}, silent?: boolean}} options
303
333
  */
304
- export async function runCoreCodemods(versionManifests, {apply, path: srcPath, codemod, skipCodemods}) {
334
+ export async function runCoreCodemods(
335
+ versionManifests,
336
+ {apply, path: srcPath, codemod, skipCodemods, root, protection, silent},
337
+ ) {
305
338
  return runCodemods(versionManifests, {
306
339
  apply,
307
340
  path: srcPath,
308
341
  codemod,
309
342
  skipCodemods,
310
- silent: logger.silent,
343
+ silent: silent ?? logger.silent,
344
+ root,
345
+ protection,
311
346
  });
312
347
  }
313
348
 
314
- /**
315
- * One installed package at one version; two specs that reach it share this.
316
- * @param {{name: string, version?: string}} integration
317
- * @returns {string}
318
- */
319
- function packageIdentity(integration) {
320
- return `${integration.name}\u0000${integration.version ?? ''}`;
321
- }
322
-
323
349
  /**
324
350
  * Load the consumer project's config + integrations. Throws on invalid config;
325
351
  * the run leaf decides between the config_fixable preview and a hard abort.
352
+ *
353
+ * Provider identity is resolved by the same resolver Project uses, on top of
354
+ * Project's ledger, under the codemod policy: a package that lists itself runs
355
+ * its installed copy's released codemods, never the work in progress being
356
+ * authored, and autolinked and local packages claim provider IDs without
357
+ * running codemods.
358
+ *
326
359
  * @param {string} cwd
327
360
  * @param {string[]} [extraIntegrationSpecs] explicit `--integration` specs
328
- * @returns {Promise<{postCodemodHooks: import('../../authoring/config/type').PostCodemodHook[], integrations: import('../../foundation/integrations/integrations.mjs').LoadedIntegration[]}>}
361
+ * @returns {Promise<{postCodemodHooks: import('../../authoring/config/type').PostCodemodHook[], integrations: import('../../foundation/integrations/integrations.mjs').LoadedIntegration[], ledger: import('../../foundation/integrations/provider-resolution.mjs').ProviderLedger}>}
329
362
  */
330
363
  export async function loadProjectContext(cwd, extraIntegrationSpecs = []) {
331
364
  // The CLI debug preflight may already have imported this config before core
@@ -337,23 +370,38 @@ export async function loadProjectContext(cwd, extraIntegrationSpecs = []) {
337
370
  // Configured packages come from Project, which has already resolved provider
338
371
  // identity over configured, autolinked, and local packages. Loading them
339
372
  // again here would let upgrade run codemods from a package Project set aside.
340
- const configured = project.loadedIntegrations.filter(
341
- integration =>
342
- !integration.__autolinked && configuredSpecs.has(integration.__spec),
343
- );
373
+ // Autolinked packages and the package being authored join only as claimants:
374
+ // every other command uses them for their provider IDs, but upgrade has
375
+ // never run their codemods.
376
+ const candidates = project.loadedIntegrations.flatMap(integration => {
377
+ const source =
378
+ !integration.__autolinked && configuredSpecs.has(integration.__spec)
379
+ ? /** @type {const} */ ('configured')
380
+ : integration.__autolinked
381
+ ? /** @type {const} */ ('autolinked')
382
+ : integration.__local
383
+ ? /** @type {const} */ ('local')
384
+ : null;
385
+ return source == null
386
+ ? []
387
+ : [{source, integration, spec: integration.__spec}];
388
+ });
344
389
  // A package that lists itself runs its installed copy's released codemods,
345
- // never the work in progress being authored, so that copy stands in for it.
390
+ // never the work in progress being authored; the resolver puts that copy in
391
+ // its place. Naming the package being authored with --integration asks for
392
+ // the installed copy too.
346
393
  const local = project.loadedIntegrations.find(
347
394
  integration => integration.__local,
348
395
  );
349
- const selfListed = local != null && configured.includes(local);
350
- if (local != null && selfListed && project.configPath) {
351
- const installed = await loadIntegrations([local.__spec], {
352
- cwd: path.dirname(project.configPath),
353
- resolveProviders: false,
354
- });
355
- configured.splice(configured.indexOf(local), 1, ...installed);
356
- }
396
+ const selfListed =
397
+ local != null && !local.__autolinked && configuredSpecs.has(local.__spec);
398
+ const installed =
399
+ local != null && selfListed && project.configPath
400
+ ? await loadIntegrations([local.__spec], {
401
+ cwd: path.dirname(project.configPath),
402
+ resolveProviders: false,
403
+ })
404
+ : [];
357
405
  const extraSpecs = uniqueFiles(extraIntegrationSpecs ?? []).filter(
358
406
  spec => !configuredSpecs.has(spec),
359
407
  );
@@ -361,38 +409,23 @@ export async function loadProjectContext(cwd, extraIntegrationSpecs = []) {
361
409
  extraSpecs.length === 0
362
410
  ? []
363
411
  : await loadIntegrations(extraSpecs, {resolveProviders: false});
364
- // Naming the package being authored with --integration asks for its
365
- // installed copy too, so the local package must not claim against it.
366
- const localStandsIn =
367
- local != null &&
368
- (selfListed || extras.some(extra => extra.name === local.name));
369
- // Autolinked packages and the package being authored join the pass only as
370
- // claimants: every other command uses them for their provider IDs, but
371
- // upgrade has never run their codemods and still does not. An extra that
372
- // names one of them opts it in, so the extra stands in for that claimant.
373
- const extraIdentities = new Set(extras.map(packageIdentity));
374
- const claimantsOnly = project.loadedIntegrations.filter(
375
- integration =>
376
- (integration.__autolinked || (integration.__local && !localStandsIn)) &&
377
- !extraIdentities.has(packageIdentity(integration)),
412
+ const {integrations, ledger} = resolveProviders(
413
+ [
414
+ ...candidates,
415
+ ...installed.map(integration => ({
416
+ source: /** @type {const} */ ('installed'),
417
+ integration,
418
+ spec: integration.__spec,
419
+ })),
420
+ ...extras.map(integration => ({
421
+ source: /** @type {const} */ ('extra'),
422
+ integration,
423
+ spec: integration.__spec,
424
+ })),
425
+ ],
426
+ {codemods: true, prior: providerLedgerOf(project)},
378
427
  );
379
- const resolved = markProviderConflicts([
380
- ...configured,
381
- ...claimantsOnly,
382
- ...extras,
383
- ]);
384
- // Claimants leave by package directory, not object identity: the pass can
385
- // return one as a new conflict entry, and upgrade must not warn that a
386
- // package every other command uses contributes nothing.
387
- const claimantDirs = new Set(
388
- claimantsOnly.map(integration => integration.__packageDir),
389
- );
390
- const integrations = resolved.filter(
391
- integration =>
392
- integration.__packageDir == null ||
393
- !claimantDirs.has(integration.__packageDir),
394
- );
395
- return {postCodemodHooks, integrations};
428
+ return {postCodemodHooks, integrations, ledger};
396
429
  }
397
430
 
398
431
  /**
@@ -427,7 +460,10 @@ export async function selectIntegrationCodemodsFor(integrations, from, to) {
427
460
  try {
428
461
  const byVersion = await discoverIntegrationCodemods([integration]);
429
462
  for (const [version, rawList] of byVersion) {
430
- const list = /** @type {Array<import('../../authoring/codemod/type').CodemodEntry>} */ (/** @type {unknown} */ (rawList));
463
+ const list =
464
+ /** @type {Array<import('../../authoring/codemod/type').CodemodEntry>} */ (
465
+ /** @type {unknown} */ (rawList)
466
+ );
431
467
  const existing = integrationCodemodsByVersion.get(version);
432
468
  if (existing) existing.push(...list);
433
469
  else integrationCodemodsByVersion.set(version, [...list]);
@@ -444,9 +480,21 @@ export async function selectIntegrationCodemodsFor(integrations, from, to) {
444
480
  /**
445
481
  * Run the file-based INTEGRATION codemods (config codemods first, then code).
446
482
  * @param {Array<{version: string, codemods: import('../../authoring/codemod/type').CodemodEntry[]}>} versionGroups
447
- * @param {{apply: boolean, path: string, codemod?: string, skipCodemods: Set<string>}} options
483
+ * @param {{apply: boolean, path: string, codemod?: string, skipCodemods: Set<string>, root?: string, protection?: {root: string, classify: (file: string) => import('../../foundation/fs/file-protection.mjs').FileProtection[]}, contents?: Map<string, string>, silent?: boolean}} options
448
484
  */
449
- export async function runIntegrationCodemodsStep(versionGroups, {apply, path: srcPath, codemod, skipCodemods}) {
485
+ export async function runIntegrationCodemodsStep(
486
+ versionGroups,
487
+ {
488
+ apply,
489
+ path: srcPath,
490
+ codemod,
491
+ skipCodemods,
492
+ root,
493
+ protection,
494
+ contents,
495
+ silent,
496
+ },
497
+ ) {
450
498
  const jscodeshift = (await import('jscodeshift')).default;
451
499
  return runIntegrationCodemods(versionGroups, {
452
500
  apply,
@@ -454,6 +502,9 @@ export async function runIntegrationCodemodsStep(versionGroups, {apply, path: sr
454
502
  codemod,
455
503
  skipCodemods,
456
504
  jscodeshift,
457
- silent: logger.silent,
505
+ silent: silent ?? logger.silent,
506
+ root,
507
+ protection,
508
+ contents,
458
509
  });
459
510
  }
@@ -10,6 +10,7 @@
10
10
 
11
11
  import {collectAllCodemods} from '../_adapter.mjs';
12
12
  import {logger} from '../../logger.mjs';
13
+ import {toAscii} from '../../../assets/codemods/term-log.mjs';
13
14
 
14
15
  /**
15
16
  * List every available codemod (oldest→newest).
@@ -19,7 +20,7 @@ export async function list() {
19
20
  const codemods = await collectAllCodemods();
20
21
  logger.log('Available codemods:');
21
22
  for (const {name, title, pr, optional} of codemods) {
22
- logger.log(` ${name} — ${title}${optional ? ' (optional)' : ''} (${pr})`);
23
+ logger.log(` ${name} - ${toAscii(title)}${optional ? ' (optional)' : ''} (${pr})`);
23
24
  }
24
25
  logger.log('Done\n');
25
26
  return {
@@ -0,0 +1,73 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file Colocated tests for the upgrade.list leaf: every field an entry
5
+ * carries is declared on the canonical `UpgradeListEntry` type, and every
6
+ * declared field is present on every entry.
7
+ */
8
+
9
+ import {describe, it, expect} from 'vitest';
10
+ import * as fs from 'node:fs';
11
+ import {fileURLToPath} from 'node:url';
12
+ import ts from 'typescript';
13
+ import {list} from './list.mjs';
14
+
15
+ const TYPE_FILE = fileURLToPath(
16
+ new URL('../upgrade.type.mjs', import.meta.url),
17
+ );
18
+
19
+ /**
20
+ * Property names a JSDoc `@typedef {object}` declares, parsed from the file.
21
+ * @param {string} typedefName
22
+ * @returns {string[]}
23
+ */
24
+ function declaredProperties(typedefName) {
25
+ const source = ts.createSourceFile(
26
+ TYPE_FILE,
27
+ fs.readFileSync(TYPE_FILE, 'utf8'),
28
+ ts.ScriptTarget.Latest,
29
+ true,
30
+ ts.ScriptKind.JS,
31
+ );
32
+ /** @type {string[]} */
33
+ const names = [];
34
+ for (const statement of source.statements) {
35
+ for (const doc of /** @type {any} */ (statement).jsDoc ?? []) {
36
+ for (const tag of doc.tags ?? []) {
37
+ if (
38
+ !ts.isJSDocTypedefTag(tag) ||
39
+ tag.name?.getText(source) !== typedefName
40
+ ) {
41
+ continue;
42
+ }
43
+ const literal = tag.typeExpression;
44
+ if (literal && ts.isJSDocTypeLiteral(literal)) {
45
+ for (const property of literal.jsDocPropertyTags ?? []) {
46
+ names.push(property.name.getText(source));
47
+ }
48
+ }
49
+ }
50
+ }
51
+ }
52
+ return names.sort();
53
+ }
54
+
55
+ describe('upgrade.list entries', () => {
56
+ it('carry exactly the fields UpgradeListEntry declares', async () => {
57
+ const declared = declaredProperties('UpgradeListEntry');
58
+ expect(declared.length).toBeGreaterThan(0);
59
+
60
+ const {type, data} = await list();
61
+ expect(type).toBe('upgrade.list');
62
+ expect(data.length).toBeGreaterThan(0);
63
+ for (const entry of data) {
64
+ expect(Object.keys(entry).sort()).toEqual(declared);
65
+ }
66
+ });
67
+
68
+ it('marks optional codemods with a boolean', async () => {
69
+ const {data} = await list();
70
+ for (const entry of data) expect(typeof entry.optional).toBe('boolean');
71
+ expect(data.some(entry => entry.optional)).toBe(true);
72
+ });
73
+ });
@@ -0,0 +1,152 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file Where `upgrade` and Project still disagree on a provider ID's winner.
5
+ *
6
+ * Both repros are `it.fails`: each asserts the agreeing result, and fails
7
+ * today. `upgrade` lets an `--integration` extra of the same name@version stand
8
+ * in for an autolinked package, from any directory, and orders that extra with
9
+ * the extras. So another extra can take the provider ID in `upgrade` while
10
+ * every other command gives it to the autolinked package. The provider ledger
11
+ * property test carves out exactly this shape.
12
+ *
13
+ * Fixtures live under a repo-local temp dir, not /tmp, because Vite refuses to
14
+ * dynamically import a module from outside the project root.
15
+ */
16
+
17
+ import {afterEach, beforeEach, describe, expect, it} from 'vitest';
18
+ import * as fs from 'node:fs';
19
+ import * as path from 'node:path';
20
+ import {loadProjectContext} from './_adapter.mjs';
21
+ import {Project, providerLedgerOf} from '../../foundation/config/project.mjs';
22
+
23
+ let tmpDir;
24
+ let originalCwd;
25
+
26
+ beforeEach(() => {
27
+ originalCwd = process.cwd();
28
+ tmpDir = fs.mkdtempSync(
29
+ path.join(process.cwd(), '.astryx-upgrade-agreement-'),
30
+ );
31
+ process.chdir(tmpDir);
32
+ });
33
+
34
+ afterEach(() => {
35
+ process.chdir(originalCwd);
36
+ fs.rmSync(tmpDir, {recursive: true, force: true});
37
+ });
38
+
39
+ /**
40
+ * Install a package under node_modules/<dir>.
41
+ * @param {string} dir
42
+ * @param {{name: string, version: string}} pkg
43
+ * @param {string} manifest manifest module source
44
+ */
45
+ function install(dir, pkg, manifest) {
46
+ const pkgDir = path.join(tmpDir, 'node_modules', ...dir.split('/'));
47
+ fs.mkdirSync(pkgDir, {recursive: true});
48
+ fs.writeFileSync(path.join(pkgDir, 'package.json'), JSON.stringify(pkg));
49
+ fs.writeFileSync(path.join(pkgDir, 'astryx.integration.mjs'), manifest);
50
+ }
51
+
52
+ /** An autolinked `@acme/a` and an `@acme/other` that claims its provider ID. */
53
+ function autolinkedWithRival() {
54
+ fs.writeFileSync(
55
+ path.join(tmpDir, 'package.json'),
56
+ JSON.stringify({name: 'consumer', dependencies: {'@acme/a': '1.0.0'}}),
57
+ );
58
+ install(
59
+ '@acme/a',
60
+ {name: '@acme/a', version: '1.0.0'},
61
+ 'export default {};\n',
62
+ );
63
+ install(
64
+ '@acme/other',
65
+ {name: '@acme/other', version: '1.0.0'},
66
+ "export default {providerId: '@acme/a'};\n",
67
+ );
68
+ }
69
+
70
+ /**
71
+ * The package each resolution lets contribute under a provider ID.
72
+ * @param {Map<string, any>} ledger
73
+ * @param {string} providerId
74
+ */
75
+ function winnerOf(ledger, providerId) {
76
+ return [...ledger.values()].find(
77
+ entry => entry.outcome === 'contributes' && entry.providerId === providerId,
78
+ )?.key;
79
+ }
80
+
81
+ /** @param {Array<import('../../foundation/integrations/integrations.mjs').LoadedIntegration>} integrations */
82
+ function claims(integrations) {
83
+ return integrations.map(integration => [
84
+ integration.name,
85
+ integration.__providerConflict?.claimedBy ?? null,
86
+ ]);
87
+ }
88
+
89
+ describe('upgrade and Project on an autolinked package named with --integration', () => {
90
+ it('agree when the autolinked package is named first', async () => {
91
+ autolinkedWithRival();
92
+ const project = await Project.load(tmpDir, {fresh: true});
93
+ const upgrade = await loadProjectContext(tmpDir, [
94
+ '@acme/a',
95
+ '@acme/other',
96
+ ]);
97
+
98
+ expect(claims(upgrade.integrations)).toEqual([
99
+ ['@acme/a', null],
100
+ ['@acme/other', '@acme/a'],
101
+ ]);
102
+ expect(winnerOf(upgrade.ledger, '@acme/a')).toBe(
103
+ winnerOf(providerLedgerOf(project), '@acme/a'),
104
+ );
105
+ });
106
+
107
+ it.fails(
108
+ 'agree when an extra that claims its ID is named first',
109
+ async () => {
110
+ autolinkedWithRival();
111
+ const project = await Project.load(tmpDir, {fresh: true});
112
+ // Today upgrade runs @acme/other and reports @acme/a, which every other
113
+ // command uses, as contributing nothing.
114
+ const upgrade = await loadProjectContext(tmpDir, [
115
+ '@acme/other',
116
+ '@acme/a',
117
+ ]);
118
+
119
+ expect(winnerOf(upgrade.ledger, '@acme/a')).toBe(
120
+ winnerOf(providerLedgerOf(project), '@acme/a'),
121
+ );
122
+ expect(claims(upgrade.integrations)).toEqual([
123
+ ['@acme/other', '@acme/a'],
124
+ ['@acme/a', null],
125
+ ]);
126
+ },
127
+ );
128
+
129
+ it.fails(
130
+ 'agree when a copy of it in another directory is named',
131
+ async () => {
132
+ autolinkedWithRival();
133
+ // The same name@version in another directory, with a manifest that fails.
134
+ install(
135
+ '@acme/a-copy',
136
+ {name: '@acme/a', version: '1.0.0'},
137
+ "throw new Error('broken copy');\n",
138
+ );
139
+ const project = await Project.load(tmpDir, {fresh: true});
140
+ // Today the broken copy stands in for @acme/a by name@version, so upgrade
141
+ // has no claimant left for the ID and @acme/other takes it.
142
+ const upgrade = await loadProjectContext(tmpDir, [
143
+ '@acme/a-copy',
144
+ '@acme/other',
145
+ ]);
146
+
147
+ expect(winnerOf(upgrade.ledger, '@acme/a')).toBe(
148
+ winnerOf(providerLedgerOf(project), '@acme/a'),
149
+ );
150
+ },
151
+ );
152
+ });