@astryxdesign/cli 0.6.3 → 0.6.4-canary.0e1fbdb

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 (728) hide show
  1. package/CHANGELOG.md +194 -0
  2. package/README.md +152 -107
  3. package/api/blog/blog.doc.mjs +1 -0
  4. package/api/build/_adapter.d.mts +50 -0
  5. package/api/build/_adapter.mjs +60 -0
  6. package/api/build/build.doc.mjs +22 -10
  7. package/api/build/build.test.mjs +219 -8
  8. package/api/build/build.type.d.mts +91 -2
  9. package/api/build/build.type.mjs +52 -8
  10. package/api/build/help/help.d.mts +12 -5
  11. package/api/build/help/help.mjs +69 -6
  12. package/api/build/kit/kit.d.mts +4 -1
  13. package/api/build/kit/kit.mjs +208 -53
  14. package/api/build/kit/rank.d.mts +44 -0
  15. package/api/build/kit/rank.mjs +432 -0
  16. package/api/build/kit/rank.test.mjs +196 -0
  17. package/api/component/_adapter.d.mts +31 -12
  18. package/api/component/_adapter.mjs +79 -15
  19. package/api/component/component.d.mts +6 -3
  20. package/api/component/component.doc.mjs +49 -19
  21. package/api/component/component.mjs +339 -22
  22. package/api/component/component.test.mjs +38 -0
  23. package/api/component/component.type.d.mts +47 -11
  24. package/api/component/component.type.mjs +76 -24
  25. package/api/component/detail/blocks/blocks.d.mts +2 -1
  26. package/api/component/detail/blocks/blocks.mjs +4 -3
  27. package/api/component/list/list.d.mts +0 -5
  28. package/api/component/list/list.mjs +40 -11
  29. package/api/discover/_adapter.d.mts +114 -6
  30. package/api/discover/_adapter.mjs +372 -17
  31. package/api/discover/_adapter.test.mjs +215 -0
  32. package/api/discover/_catalog-view.d.mts +115 -0
  33. package/api/discover/_catalog-view.mjs +203 -0
  34. package/api/discover/_catalog-view.test.mjs +128 -0
  35. package/api/discover/detail/detail.d.mts +18 -6
  36. package/api/discover/detail/detail.mjs +67 -13
  37. package/api/discover/detail/detail.test.mjs +85 -0
  38. package/api/discover/detail/item/item.d.mts +26 -0
  39. package/api/discover/detail/item/item.mjs +78 -0
  40. package/api/discover/detail/item/item.test.mjs +73 -0
  41. package/api/discover/discover.d.mts +3 -9
  42. package/api/discover/discover.doc.mjs +62 -18
  43. package/api/discover/discover.mjs +220 -36
  44. package/api/discover/discover.test.mjs +11 -2
  45. package/api/discover/discover.type.d.mts +150 -11
  46. package/api/discover/discover.type.mjs +107 -17
  47. package/api/discover/list/list.d.mts +20 -6
  48. package/api/discover/list/list.mjs +45 -12
  49. package/api/discover/list/list.test.mjs +46 -0
  50. package/api/discover/search/search.d.mts +18 -16
  51. package/api/discover/search/search.mjs +102 -56
  52. package/api/discover/search/search.test.mjs +144 -10
  53. package/api/docs/_adapter.d.mts +277 -41
  54. package/api/docs/_adapter.mjs +993 -108
  55. package/api/docs/compiled-topics.test.mjs +78 -0
  56. package/api/docs/detail/detail.mjs +22 -63
  57. package/api/docs/detail/section/section.d.mts +1 -1
  58. package/api/docs/detail/section/section.mjs +54 -19
  59. package/api/docs/detail/section/section.test.mjs +50 -0
  60. package/api/docs/docOverlays.test.mjs +27 -1
  61. package/api/docs/docs.d.mts +10 -3
  62. package/api/docs/docs.doc.mjs +55 -16
  63. package/api/docs/docs.mjs +53 -10
  64. package/api/docs/docs.type.d.mts +221 -5
  65. package/api/docs/docs.type.mjs +153 -11
  66. package/api/docs/index/index.d.mts +18 -0
  67. package/api/docs/index/index.mjs +40 -0
  68. package/api/docs/index/index.test.mjs +62 -0
  69. package/api/docs/list/list.mjs +28 -12
  70. package/api/docs/node/node.d.mts +43 -0
  71. package/api/docs/node/node.mjs +192 -0
  72. package/api/docs/reference-blocks.test.mjs +406 -0
  73. package/api/doctor/doctor.d.mts +104 -1
  74. package/api/doctor/doctor.doc.mjs +18 -8
  75. package/api/doctor/doctor.mjs +635 -7
  76. package/api/doctor/doctor.test.mjs +732 -11
  77. package/api/doctor/doctor.type.d.mts +1 -1
  78. package/api/doctor/doctor.type.mjs +1 -1
  79. package/api/gap-report/gap-report.doc.mjs +27 -14
  80. package/api/hook/_adapter.mjs +19 -5
  81. package/api/hook/hook.doc.mjs +7 -3
  82. package/api/hook/hook.type.d.mts +3 -3
  83. package/api/hook/hook.type.mjs +11 -11
  84. package/api/hook/list/list.d.mts +2 -2
  85. package/api/hook/list/list.mjs +69 -17
  86. package/api/index.d.mts +2 -1
  87. package/api/index.mjs +6 -3
  88. package/api/init/init.doc.mjs +22 -12
  89. package/api/init/init.test.mjs +41 -1
  90. package/api/init/remove/remove.mjs +1 -1
  91. package/api/init/run/run.mjs +20 -10
  92. package/api/integration/add-contribution.component-names.test.mjs +120 -0
  93. package/api/integration/add-contribution.d.mts +2 -1
  94. package/api/integration/add-contribution.mjs +130 -15
  95. package/api/integration/add-contribution.test.mjs +258 -7
  96. package/api/integration/add-helpers.d.mts +5 -2
  97. package/api/integration/add-helpers.mjs +36 -9
  98. package/api/integration/add-theme.mjs +56 -65
  99. package/api/integration/add-theme.test.mjs +139 -21
  100. package/api/integration/authoring-checks.mjs +138 -28
  101. package/api/integration/authoring-checks.test.mjs +179 -7
  102. package/api/integration/authoring-checks.type.mjs +6 -1
  103. package/api/integration/integration-authoring.type.d.mts +3 -1
  104. package/api/integration/integration-authoring.type.mjs +2 -0
  105. package/api/integration/integration-block-exports.test.mjs +10 -6
  106. package/api/integration/integrationAdd.doc.mjs +14 -4
  107. package/api/integration/integrationAddAgentDoc.doc.mjs +1 -0
  108. package/api/integration/integrationAddCodemod.doc.mjs +1 -0
  109. package/api/integration/integrationAddComponent.doc.mjs +2 -1
  110. package/api/integration/integrationAddDoc.doc.mjs +8 -1
  111. package/api/integration/integrationAddTemplate.doc.mjs +1 -0
  112. package/api/integration/integrationAddTheme.doc.mjs +6 -5
  113. package/api/integration/integrationComponentConflicts.doc.mjs +1 -0
  114. package/api/integration/integrationDocConflicts.doc.mjs +2 -1
  115. package/api/integration/integrationPackCheck.doc.mjs +5 -4
  116. package/api/integration/integrationTemplateConflicts.doc.d.mts +3 -0
  117. package/api/integration/integrationTemplateConflicts.doc.mjs +4 -0
  118. package/api/integration/pack-check.lifecycle-output.test.mjs +107 -0
  119. package/api/integration/pack-check.mjs +160 -11
  120. package/api/integration/pack-check.test.mjs +477 -47
  121. package/api/integration/pack-check.type.d.mts +26 -2
  122. package/api/integration/pack-check.type.mjs +15 -2
  123. package/api/integration/summarizeIssues.doc.mjs +1 -0
  124. package/api/integration/template-conflict-compatibility.test.mjs +73 -0
  125. package/api/integration/validate-integration-fixes.test.mjs +1389 -0
  126. package/api/integration/validate-integration.mjs +52 -102
  127. package/api/integration/validate-integration.test.mjs +179 -26
  128. package/api/integration/validate-unread-theme-folders.test.mjs +110 -0
  129. package/api/integration/validateIntegration.doc.mjs +3 -2
  130. package/api/json/assertResponse.doc.mjs +2 -1
  131. package/api/json/envelope-types.test.mjs +76 -0
  132. package/api/json/index.ts +2 -0
  133. package/api/json/isError.doc.mjs +2 -1
  134. package/api/json/parseResponse.doc.mjs +3 -2
  135. package/api/layout/_adapter.mjs +20 -5
  136. package/api/layout/expand/expand.mjs +7 -5
  137. package/api/layout/expand/expand.path-safety.test.mjs +53 -0
  138. package/api/layout/grammar/grammar.mjs +2 -1
  139. package/api/layout/layoutCheck.doc.mjs +1 -0
  140. package/api/layout/layoutExpand.doc.mjs +2 -1
  141. package/api/layout/layoutGrammar.doc.mjs +1 -0
  142. package/api/search/search-return-type.test.mjs +54 -0
  143. package/api/search/search.d.mts +89 -12
  144. package/api/search/search.doc.mjs +8 -2
  145. package/api/search/search.mjs +697 -97
  146. package/api/search/search.type.d.mts +15 -3
  147. package/api/search/search.type.mjs +5 -2
  148. package/api/swizzle/copy/copy.mjs +28 -11
  149. package/api/swizzle/swizzle.doc.mjs +8 -5
  150. package/api/swizzle/swizzle.type.d.mts +2 -2
  151. package/api/swizzle/swizzle.type.mjs +2 -2
  152. package/api/template/copy/copy.mjs +18 -24
  153. package/api/template/copy/copy.test.mjs +26 -0
  154. package/api/template/list/list.mjs +1 -0
  155. package/api/template/table-floating-bulk-actions.test.mjs +66 -0
  156. package/api/template/template-integration.test.mjs +1072 -3
  157. package/api/template/template-suffix.test.mjs +41 -21
  158. package/api/template/template.d.mts +1 -1
  159. package/api/template/template.doc.mjs +32 -9
  160. package/api/template/template.mjs +45 -8
  161. package/api/template/template.type.d.mts +12 -14
  162. package/api/template/template.type.mjs +15 -14
  163. package/api/theme/_adapter.d.mts +2 -3
  164. package/api/theme/_adapter.mjs +4 -5
  165. package/api/theme/add/add.binary.test.mjs +84 -0
  166. package/api/theme/add/add.mjs +31 -22
  167. package/api/theme/add/add.rollback.test.mjs +158 -0
  168. package/api/theme/add/add.staging.test.mjs +83 -0
  169. package/api/theme/add/add.test.mjs +14 -1
  170. package/api/theme/build/build.family.test.mjs +7 -12
  171. package/api/theme/build/build.mjs +140 -59
  172. package/api/theme/build/build.public-component-vars.test.mjs +1 -1
  173. package/api/theme/build/build.receipt-doc.test.mjs +111 -0
  174. package/api/theme/build/build.rollback.test.mjs +148 -0
  175. package/api/theme/build/build.test.mjs +127 -0
  176. package/api/theme/build/font-warning.mjs +3 -3
  177. package/api/theme/build/font-warning.test.mjs +5 -2
  178. package/api/theme/generateTonalPalette.doc.mjs +2 -2
  179. package/api/theme/integration-themes.test.mjs +39 -28
  180. package/api/theme/list/list.test.mjs +19 -20
  181. package/api/theme/listThemes.doc.mjs +6 -5
  182. package/api/theme/palette/generate/generate.mjs +8 -3
  183. package/api/theme/palette/generate/generate.test.mjs +96 -0
  184. package/api/theme/palette/generate/generator.d.mts +10 -13
  185. package/api/theme/palette/generate/generator.mjs +15 -4
  186. package/api/theme/palette/generate/generator.test.mjs +10 -0
  187. package/api/theme/template/template.mjs +11 -2
  188. package/api/theme/template/template.test.mjs +20 -0
  189. package/api/theme/theme.type.d.mts +170 -11
  190. package/api/theme/theme.type.mjs +94 -27
  191. package/api/theme/themeAdd.doc.mjs +12 -12
  192. package/api/theme/themeBuild.doc.mjs +21 -17
  193. package/api/theme/themeList.doc.mjs +6 -3
  194. package/api/theme/themeListAvailable.doc.mjs +6 -3
  195. package/api/theme/themePaletteGenerate.doc.mjs +16 -8
  196. package/api/theme/themeTargets.doc.mjs +4 -2
  197. package/api/theme/themeTemplate.doc.mjs +8 -3
  198. package/api/upgrade/_adapter.d.mts +32 -5
  199. package/api/upgrade/_adapter.mjs +139 -22
  200. package/api/upgrade/list/list.mjs +2 -1
  201. package/api/upgrade/list/list.test.mjs +73 -0
  202. package/api/upgrade/project-context.test.mjs +272 -0
  203. package/api/upgrade/provider-agreement.test.mjs +152 -0
  204. package/api/upgrade/run/files-changed.test.mjs +111 -0
  205. package/api/upgrade/run/run.mjs +358 -59
  206. package/api/upgrade/status/status.mjs +2 -2
  207. package/api/upgrade/upgrade.doc.mjs +32 -23
  208. package/api/upgrade/upgrade.type.d.mts +43 -5
  209. package/api/upgrade/upgrade.type.mjs +29 -13
  210. package/assets/codemods/__tests__/registry.test.mjs +1 -0
  211. package/assets/codemods/__tests__/runner.test.mjs +332 -8
  212. package/assets/codemods/file-count.test.mjs +163 -0
  213. package/assets/codemods/integration-discovery.mjs +48 -4
  214. package/assets/codemods/integration-discovery.test.mjs +73 -0
  215. package/assets/codemods/integration-runner.mjs +59 -7
  216. package/assets/codemods/integration-runner.protection.test.mjs +153 -0
  217. package/assets/codemods/registry.mjs +1 -0
  218. package/assets/codemods/run-codemod.mjs +177 -34
  219. package/assets/codemods/runner.mjs +353 -104
  220. package/assets/codemods/term-log.mjs +32 -8
  221. package/assets/codemods/term-log.test.mjs +19 -1
  222. package/assets/codemods/transform-prop.mjs +109 -0
  223. package/assets/codemods/transform-prop.test.mjs +95 -0
  224. package/assets/codemods/transforms/v0.0.14/__tests__/rename-status-variants.test.mjs +86 -165
  225. package/assets/codemods/transforms/v0.0.14/rename-status-variants.mjs +72 -210
  226. package/assets/codemods/transforms/v0.1.8/__tests__/rename-avatar-size-scale.test.mjs +83 -115
  227. package/assets/codemods/transforms/v0.1.8/rename-avatar-size-scale.mjs +57 -186
  228. package/assets/codemods/transforms/v0.3.0/__tests__/unwrap-authoring-factories.test.mjs +27 -5
  229. package/assets/codemods/transforms/v0.3.0/unwrap-authoring-factories.mjs +20 -5
  230. package/assets/codemods/transforms/v0.6.0/__tests__/next-codemods.test.mjs +47 -0
  231. package/assets/codemods/transforms/v0.6.0/rename-resizable-pixel-bounds.mjs +57 -10
  232. package/assets/codemods/transforms/v0.6.4/__tests__/migrate-native-picker-to-presentation.test.mjs +63 -0
  233. package/assets/codemods/transforms/v0.6.4/__tests__/migrate-theme-catalog-to-descriptors.test.mjs +220 -0
  234. package/assets/codemods/transforms/v0.6.4/index.mjs +31 -0
  235. package/assets/codemods/transforms/v0.6.4/migrate-native-picker-to-presentation.mjs +148 -0
  236. package/assets/codemods/transforms/v0.6.4/migrate-theme-catalog-to-descriptors.mjs +141 -0
  237. package/assets/docs/README.md +12 -1
  238. package/assets/docs/authoring.doc.mjs +14 -0
  239. package/assets/docs/browser-support.doc.mjs +11 -11
  240. package/assets/docs/color.doc.mjs +8 -2
  241. package/assets/docs/elevation.doc.mjs +6 -4
  242. package/assets/docs/getting-started.doc.mjs +6 -17
  243. package/assets/docs/icons.doc.mjs +2 -21
  244. package/assets/docs/illustrations.doc.mjs +7 -15
  245. package/assets/docs/internationalization.doc.mjs +7 -5
  246. package/assets/docs/layout.doc.dense.mjs +132 -84
  247. package/assets/docs/layout.doc.mjs +134 -78
  248. package/assets/docs/migration.doc.mjs +19 -21
  249. package/assets/docs/motion.doc.mjs +16 -3
  250. package/assets/docs/principles.doc.dense.mjs +5 -5
  251. package/assets/docs/principles.doc.mjs +14 -6
  252. package/assets/docs/principles.doc.zh.mjs +6 -6
  253. package/assets/docs/shape.doc.mjs +8 -3
  254. package/assets/docs/spacing.doc.mjs +7 -2
  255. package/assets/docs/styling-libraries.doc.mjs +10 -6
  256. package/assets/docs/styling.doc.mjs +22 -26
  257. package/assets/docs/theme.doc.dense.mjs +58 -18
  258. package/assets/docs/theme.doc.mjs +60 -50
  259. package/assets/docs/theme.doc.zh.mjs +9 -8
  260. package/assets/docs/tokens.doc.dense.mjs +2 -2
  261. package/assets/docs/tokens.doc.mjs +390 -9
  262. package/assets/docs/tokens.doc.zh.mjs +2 -2
  263. package/assets/docs/tree/add-a-component.doc.mjs +75 -0
  264. package/assets/docs/tree/add-a-theme.doc.mjs +85 -0
  265. package/assets/docs/tree/add-a-topic.doc.mjs +144 -0
  266. package/assets/docs/tree/agent-guidance.doc.mjs +138 -0
  267. package/assets/docs/tree/api.doc.mjs +30 -0
  268. package/assets/docs/tree/block-template.doc.mjs +130 -0
  269. package/assets/docs/tree/build-the-template.doc.mjs +28 -0
  270. package/assets/docs/tree/building-blocks.doc.mjs +46 -0
  271. package/assets/docs/tree/check-your-docs.doc.mjs +137 -0
  272. package/assets/docs/tree/checks.doc.mjs +119 -0
  273. package/assets/docs/tree/cli.doc.mjs +23 -0
  274. package/assets/docs/tree/codemods.doc.mjs +147 -0
  275. package/assets/docs/tree/commands.doc.mjs +25 -0
  276. package/assets/docs/tree/component-family.doc.mjs +113 -0
  277. package/assets/docs/tree/component-imports.doc.mjs +69 -0
  278. package/assets/docs/tree/component-lookups.doc.mjs +149 -0
  279. package/assets/docs/tree/components.doc.mjs +23 -0
  280. package/assets/docs/tree/configuration.doc.mjs +23 -0
  281. package/assets/docs/tree/debug-and-gap-reports.doc.mjs +182 -0
  282. package/assets/docs/tree/define-the-theme.doc.mjs +118 -0
  283. package/assets/docs/tree/describe-the-component.doc.mjs +57 -0
  284. package/assets/docs/tree/docs.doc.mjs +21 -0
  285. package/assets/docs/tree/document-the-template.doc.mjs +28 -0
  286. package/assets/docs/tree/document-the-theme.doc.mjs +68 -0
  287. package/assets/docs/tree/export-template-assets.doc.mjs +147 -0
  288. package/assets/docs/tree/extend-or-replace.doc.mjs +103 -0
  289. package/assets/docs/tree/fonts-and-assets.doc.mjs +106 -0
  290. package/assets/docs/tree/generate-a-palette.doc.mjs +66 -0
  291. package/assets/docs/tree/grade-template-with-agent.doc.mjs +105 -0
  292. package/assets/docs/tree/help.doc.mjs +16 -0
  293. package/assets/docs/tree/integrations.doc.mjs +40 -0
  294. package/assets/docs/tree/links.doc.mjs +98 -0
  295. package/assets/docs/tree/package-and-test.doc.mjs +32 -0
  296. package/assets/docs/tree/page-template.doc.mjs +71 -0
  297. package/assets/docs/tree/publishing.doc.mjs +111 -0
  298. package/assets/docs/tree/quick-start.doc.mjs +272 -0
  299. package/assets/docs/tree/replace-a-core-component.doc.mjs +104 -0
  300. package/assets/docs/tree/replace-a-core-template.doc.mjs +172 -0
  301. package/assets/docs/tree/sections-and-placement.doc.mjs +108 -0
  302. package/assets/docs/tree/see-it-in-an-app.doc.mjs +59 -0
  303. package/assets/docs/tree/ship.doc.mjs +16 -0
  304. package/assets/docs/tree/short-and-findable.doc.mjs +108 -0
  305. package/assets/docs/tree/single-component.doc.mjs +165 -0
  306. package/assets/docs/tree/start-a-template.doc.mjs +143 -0
  307. package/assets/docs/tree/subcomponent.doc.mjs +115 -0
  308. package/assets/docs/tree/template-assets.doc.mjs +64 -0
  309. package/assets/docs/tree/template-doc-overview.doc.mjs +109 -0
  310. package/assets/docs/tree/template-fonts.doc.mjs +102 -0
  311. package/assets/docs/tree/template-grading-rubric.doc.mjs +452 -0
  312. package/assets/docs/tree/template-icons.doc.mjs +97 -0
  313. package/assets/docs/tree/template-images-media.doc.mjs +127 -0
  314. package/assets/docs/tree/template-styles.doc.mjs +93 -0
  315. package/assets/docs/tree/templates.doc.mjs +34 -0
  316. package/assets/docs/tree/test-in-an-app.doc.mjs +115 -0
  317. package/assets/docs/tree/test-template-in-app.doc.mjs +128 -0
  318. package/assets/docs/tree/themes.doc.mjs +39 -0
  319. package/assets/docs/tree/troubleshooting.doc.mjs +149 -0
  320. package/assets/docs/tree/upgrading.doc.mjs +103 -0
  321. package/assets/docs/tree/use-a-theme-in-an-app.doc.mjs +51 -0
  322. package/assets/docs/tree/verify-packed-template.doc.mjs +77 -0
  323. package/assets/docs/tree/versioning.doc.mjs +161 -0
  324. package/assets/docs/tree/write-good-templates.doc.mjs +64 -0
  325. package/assets/docs/tree/write-the-template-file.doc.mjs +154 -0
  326. package/assets/docs/typography.doc.mjs +24 -4
  327. package/assets/docs/working-with-ai.doc.mjs +34 -26
  328. package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.doc.mjs +1 -1
  329. package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.tsx +1 -3
  330. package/assets/templates/blocks/components/DateInput/DateInputDateRange.tsx +1 -1
  331. package/assets/templates/blocks/components/InternationalizationProvider/InternationalizationProvider01ShippedLocale.tsx +1 -1
  332. package/assets/templates/blocks/components/Item/ItemDocumentTabs.doc.mjs +14 -0
  333. package/assets/templates/blocks/components/Item/ItemDocumentTabs.tsx +100 -0
  334. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.doc.mjs +14 -0
  335. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.tsx +61 -0
  336. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.doc.mjs +14 -0
  337. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.tsx +126 -0
  338. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.doc.mjs +15 -0
  339. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.tsx +86 -0
  340. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.doc.mjs +14 -0
  341. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.tsx +99 -0
  342. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.doc.mjs +14 -0
  343. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.tsx +122 -0
  344. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.doc.mjs +14 -0
  345. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.tsx +95 -0
  346. package/assets/templates/blocks/components/Table/TableBulkActionsTable.doc.mjs +14 -0
  347. package/assets/templates/blocks/components/Table/TableBulkActionsTable.tsx +71 -0
  348. package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.doc.mjs +19 -0
  349. package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.tsx +139 -0
  350. package/assets/templates/blocks/components/TimeInput/TimeInputConstrained.tsx +1 -0
  351. package/assets/templates/blocks/components/Timer/TimerFormats.doc.mjs +14 -0
  352. package/assets/templates/blocks/components/Timer/TimerFormats.tsx +34 -0
  353. package/assets/templates/blocks/components/Timer/TimerInline.doc.mjs +14 -0
  354. package/assets/templates/blocks/components/Timer/TimerInline.tsx +14 -0
  355. package/assets/templates/blocks/components/Timer/TimerShowcase.doc.mjs +13 -0
  356. package/assets/templates/blocks/components/Timer/TimerShowcase.tsx +47 -0
  357. package/assets/templates/blocks/components/Timer/TimerTypography.doc.mjs +14 -0
  358. package/assets/templates/blocks/components/Timer/TimerTypography.tsx +31 -0
  359. package/assets/templates/blocks/components/Toolbar/ToolbarTableFilter.doc.mjs +19 -3
  360. package/assets/templates/blocks/components/Toolbar/ToolbarTableFilter.tsx +383 -65
  361. package/assets/templates/pages/table-tree/page.tsx +1704 -0
  362. package/assets/templates/pages/table-tree/template.doc.mjs +12 -0
  363. package/assets/templates/themes/butter/butterTheme.doc.mjs +11 -0
  364. package/assets/templates/themes/chocolate/chocolateTheme.doc.mjs +11 -0
  365. package/assets/templates/themes/gothic/gothicTheme.doc.mjs +11 -0
  366. package/assets/templates/themes/matcha/matchaTheme.doc.mjs +11 -0
  367. package/assets/templates/themes/neutral/neutralTheme.doc.mjs +11 -0
  368. package/assets/templates/themes/stone/stoneTheme.doc.mjs +11 -0
  369. package/assets/templates/themes/y2k/y2kTheme.doc.mjs +11 -0
  370. package/authoring/_shared/contract.ts +22 -0
  371. package/authoring/codemod/codemod.doc.mjs +7 -2
  372. package/authoring/codemod/parse.d.mts +8 -8
  373. package/authoring/codemod/parse.mjs +8 -6
  374. package/authoring/codemod/type.ts +12 -0
  375. package/authoring/config/config.doc.mjs +11 -3
  376. package/authoring/config/debug-composition.test.mjs +92 -0
  377. package/authoring/config/parse.d.mts +15 -13
  378. package/authoring/config/parse.mjs +27 -8
  379. package/authoring/config/parse.test.mjs +8 -0
  380. package/authoring/config/type.ts +29 -6
  381. package/authoring/debug/debug.doc.d.mts +11 -0
  382. package/authoring/debug/debug.doc.mjs +182 -0
  383. package/authoring/debug/parse.d.mts +8 -8
  384. package/authoring/debug/parse.mjs +3 -3
  385. package/authoring/discover/discover.doc.d.mts +13 -0
  386. package/authoring/discover/discover.doc.mjs +138 -0
  387. package/authoring/discover/parse.d.mts +24 -0
  388. package/authoring/discover/parse.mjs +128 -0
  389. package/authoring/discover/parse.test.mjs +124 -0
  390. package/authoring/discover/type.ts +87 -0
  391. package/authoring/doctypes/_schema.d.mts +792 -24
  392. package/authoring/doctypes/_schema.mjs +549 -39
  393. package/authoring/doctypes/base/graph-fields.doc.d.mts +9 -0
  394. package/authoring/doctypes/base/graph-fields.doc.mjs +64 -0
  395. package/authoring/doctypes/base/type.ts +43 -0
  396. package/authoring/doctypes/command/command.doc.mjs +4 -3
  397. package/authoring/doctypes/command/parse.d.mts +2 -2
  398. package/authoring/doctypes/command/parse.mjs +1 -1
  399. package/authoring/doctypes/command/type.ts +5 -4
  400. package/authoring/doctypes/component/component.doc.mjs +12 -3
  401. package/authoring/doctypes/component/parse.d.mts +2 -2
  402. package/authoring/doctypes/component/parse.mjs +1 -1
  403. package/authoring/doctypes/component/type.ts +14 -5
  404. package/authoring/doctypes/doctypes-new.test.mjs +48 -6
  405. package/authoring/doctypes/enum/enum.doc.mjs +1 -1
  406. package/authoring/doctypes/enum/parse.d.mts +2 -2
  407. package/authoring/doctypes/enum/parse.mjs +1 -1
  408. package/authoring/doctypes/enum/type.ts +4 -2
  409. package/authoring/doctypes/function/function.doc.mjs +7 -2
  410. package/authoring/doctypes/function/parse.d.mts +2 -2
  411. package/authoring/doctypes/function/parse.mjs +1 -1
  412. package/authoring/doctypes/function/type.ts +9 -4
  413. package/authoring/doctypes/hook/hook.doc.mjs +4 -0
  414. package/authoring/doctypes/hook/parse.d.mts +2 -2
  415. package/authoring/doctypes/hook/parse.mjs +1 -1
  416. package/authoring/doctypes/hook/type.ts +5 -4
  417. package/authoring/doctypes/legacy.d.mts +8 -6
  418. package/authoring/doctypes/legacy.mjs +5 -4
  419. package/authoring/doctypes/load-contract.test.mjs +233 -0
  420. package/authoring/doctypes/namespace/namespace.doc.d.mts +9 -0
  421. package/authoring/doctypes/namespace/namespace.doc.mjs +128 -0
  422. package/authoring/doctypes/namespace/parse.d.mts +12 -0
  423. package/authoring/doctypes/namespace/parse.mjs +25 -0
  424. package/authoring/doctypes/namespace/parse.test.mjs +163 -0
  425. package/authoring/doctypes/namespace/type.ts +74 -0
  426. package/authoring/doctypes/parse.d.mts +22 -18
  427. package/authoring/doctypes/parse.mjs +22 -11
  428. package/authoring/doctypes/parse.test.mjs +77 -3
  429. package/authoring/doctypes/reference/parse.d.mts +2 -2
  430. package/authoring/doctypes/reference/parse.mjs +8 -5
  431. package/authoring/doctypes/reference/reference.doc.mjs +55 -6
  432. package/authoring/doctypes/reference/type.ts +75 -7
  433. package/authoring/doctypes/schema/parse.d.mts +2 -2
  434. package/authoring/doctypes/schema/parse.mjs +1 -1
  435. package/authoring/doctypes/schema/schema.doc.mjs +2 -2
  436. package/authoring/doctypes/schema/type.ts +4 -4
  437. package/authoring/doctypes/template/parse.d.mts +94 -1
  438. package/authoring/doctypes/template/parse.mjs +40 -2
  439. package/authoring/doctypes/template/parse.test.mjs +26 -2
  440. package/authoring/doctypes/template/template.doc.mjs +13 -3
  441. package/authoring/doctypes/template/type.ts +13 -2
  442. package/authoring/doctypes/theme/parse.d.mts +35 -0
  443. package/authoring/doctypes/theme/parse.mjs +76 -0
  444. package/authoring/doctypes/theme/theme.doc.d.mts +9 -0
  445. package/authoring/doctypes/theme/theme.doc.mjs +79 -0
  446. package/authoring/doctypes/theme/type.ts +42 -0
  447. package/authoring/doctypes/types.ts +12 -10
  448. package/authoring/gap-report/gap-report.doc.d.mts +12 -0
  449. package/authoring/gap-report/gap-report.doc.mjs +183 -0
  450. package/authoring/gap-report/parse.d.mts +10 -10
  451. package/authoring/gap-report/parse.mjs +6 -6
  452. package/authoring/gap-report/type.ts +1 -1
  453. package/authoring/identity/identity.doc.d.mts +9 -0
  454. package/authoring/identity/identity.doc.mjs +61 -0
  455. package/authoring/identity/type.ts +132 -0
  456. package/authoring/index.d.mts +3 -0
  457. package/authoring/index.d.ts +62 -17
  458. package/authoring/index.mjs +4 -1
  459. package/authoring/integration/integration.doc.mjs +22 -13
  460. package/authoring/integration/parse.d.mts +2 -2
  461. package/authoring/integration/parse.mjs +1 -1
  462. package/authoring/integration/parse.test.mjs +10 -1
  463. package/authoring/integration/schema.d.mts +6 -4
  464. package/authoring/integration/schema.mjs +9 -3
  465. package/authoring/integration/type.ts +19 -8
  466. package/authoring/shadcn/receipt.d.mts +6 -6
  467. package/clients/cli/__tests__/cliManifest.test.ts +27 -29
  468. package/clients/cli/command-load-failure.test.mjs +83 -0
  469. package/clients/cli/commands/blog.doc.mjs +1 -1
  470. package/clients/cli/commands/blog.mjs +23 -8
  471. package/clients/cli/commands/blog.test.mjs +42 -1
  472. package/clients/cli/commands/build-theme.adaptations.test.mjs +100 -1
  473. package/clients/cli/commands/build-theme.ascii-output.test.mjs +161 -0
  474. package/clients/cli/commands/build-theme.flag-docs.test.mjs +110 -0
  475. package/clients/cli/commands/build-theme.mjs +16 -50
  476. package/clients/cli/commands/build-theme.path-safety.test.mjs +86 -1
  477. package/clients/cli/commands/build-theme.variants.test.mjs +76 -0
  478. package/clients/cli/commands/build.doc.mjs +16 -8
  479. package/clients/cli/commands/build.exit-codes-doc.test.mjs +50 -0
  480. package/clients/cli/commands/build.mjs +137 -114
  481. package/clients/cli/commands/build.playbook.test.mjs +75 -0
  482. package/clients/cli/commands/build.text-fields.test.mjs +81 -0
  483. package/clients/cli/commands/component/index.mjs +153 -61
  484. package/clients/cli/commands/component-batch.test.mjs +341 -0
  485. package/clients/cli/commands/component-ownership.test.mjs +92 -3
  486. package/clients/cli/commands/component-package.test.mjs +46 -0
  487. package/clients/cli/commands/component-resolution.test.mjs +21 -0
  488. package/clients/cli/commands/component.doc.mjs +28 -10
  489. package/clients/cli/commands/component.test.mjs +19 -0
  490. package/clients/cli/commands/detail-levels.test.mjs +2 -2
  491. package/clients/cli/commands/discover.broken-integration.test.mjs +52 -5
  492. package/clients/cli/commands/discover.components-flag.test.mjs +97 -0
  493. package/clients/cli/commands/discover.doc.mjs +55 -9
  494. package/clients/cli/commands/discover.mjs +393 -118
  495. package/clients/cli/commands/discover.sources.test.mjs +267 -0
  496. package/clients/cli/commands/discover.text-projection.test.mjs +103 -0
  497. package/clients/cli/commands/docs.doc.mjs +28 -6
  498. package/clients/cli/commands/docs.mjs +295 -38
  499. package/clients/cli/commands/doctor-integration-components.doc.mjs +1 -1
  500. package/clients/cli/commands/doctor-integration-docs.doc.mjs +6 -5
  501. package/clients/cli/commands/doctor-integration-templates.doc.mjs +15 -8
  502. package/clients/cli/commands/doctor-integration-validate.doc.mjs +1 -1
  503. package/clients/cli/commands/doctor-integration.doc.mjs +1 -1
  504. package/clients/cli/commands/doctor-integration.package-json.test.mjs +53 -0
  505. package/clients/cli/commands/doctor-integration.test.mjs +143 -8
  506. package/clients/cli/commands/doctor.doc.mjs +4 -2
  507. package/clients/cli/commands/doctor.mjs +108 -37
  508. package/clients/cli/commands/doctor.test.mjs +42 -0
  509. package/clients/cli/commands/gap-report.doc.mjs +27 -15
  510. package/clients/cli/commands/gap-report.test.mjs +72 -0
  511. package/clients/cli/commands/hook/index.mjs +7 -17
  512. package/clients/cli/commands/hook.doc.mjs +1 -1
  513. package/clients/cli/commands/hook.text-projection.test.mjs +45 -0
  514. package/clients/cli/commands/init.doc.mjs +24 -10
  515. package/clients/cli/commands/init.flag-help.test.mjs +153 -0
  516. package/clients/cli/commands/integration-add.controls.test.mjs +132 -0
  517. package/clients/cli/commands/integration-add.doc.mjs +39 -13
  518. package/clients/cli/commands/integration-authoring.test.mjs +74 -19
  519. package/clients/cli/commands/integration-pack.doc.mjs +6 -10
  520. package/clients/cli/commands/integration-real-world.test.mjs +4 -10
  521. package/clients/cli/commands/integration-verify.doc.mjs +22 -0
  522. package/clients/cli/commands/integration.doc.mjs +5 -5
  523. package/clients/cli/commands/integration.mjs +75 -43
  524. package/clients/cli/commands/interactive-guard.test.mjs +101 -24
  525. package/clients/cli/commands/json-contract.test.mjs +33 -0
  526. package/clients/cli/commands/layout-check.doc.mjs +15 -4
  527. package/clients/cli/commands/layout-expand.doc.mjs +22 -5
  528. package/clients/cli/commands/layout-grammar.doc.mjs +1 -1
  529. package/clients/cli/commands/layout.doc.mjs +3 -3
  530. package/clients/cli/commands/layout.mjs +21 -9
  531. package/clients/cli/commands/layout.path-help.test.mjs +33 -0
  532. package/clients/cli/commands/layout.stdin-cap.test.mjs +47 -0
  533. package/clients/cli/commands/layout.text-fields.test.mjs +39 -0
  534. package/clients/cli/commands/manifest.doc.mjs +2 -2
  535. package/clients/cli/commands/no-prompt-wording.test.mjs +94 -0
  536. package/clients/cli/commands/search.doc.mjs +16 -6
  537. package/clients/cli/commands/search.mjs +49 -11
  538. package/clients/cli/commands/search.test.mjs +92 -0
  539. package/clients/cli/commands/setup-nudge.test.mjs +6 -0
  540. package/clients/cli/commands/swizzle.doc.mjs +4 -3
  541. package/clients/cli/commands/swizzle.path-safety.test.mjs +42 -0
  542. package/clients/cli/commands/template.doc.mjs +53 -14
  543. package/clients/cli/commands/template.flag-help.test.mjs +117 -0
  544. package/clients/cli/commands/template.mjs +4 -91
  545. package/clients/cli/commands/template.path-help.test.mjs +40 -0
  546. package/clients/cli/commands/text-json-parity.test.mjs +725 -0
  547. package/clients/cli/commands/theme-add.doc.mjs +5 -4
  548. package/clients/cli/commands/theme-build.doc.mjs +8 -7
  549. package/clients/cli/commands/theme-list.doc.mjs +2 -2
  550. package/clients/cli/commands/theme-palette-generate.doc.mjs +12 -7
  551. package/clients/cli/commands/theme-palette-generate.test.mjs +19 -0
  552. package/clients/cli/commands/theme-palette.doc.mjs +2 -3
  553. package/clients/cli/commands/theme-targets.behavior.test.mjs +4 -3
  554. package/clients/cli/commands/theme-targets.doc.mjs +3 -3
  555. package/clients/cli/commands/theme-template.behavior.test.mjs +12 -0
  556. package/clients/cli/commands/theme-template.doc.mjs +2 -2
  557. package/clients/cli/commands/theme.doc.mjs +3 -2
  558. package/clients/cli/commands/upgrade.ascii-output.test.mjs +87 -0
  559. package/clients/cli/commands/upgrade.doc.mjs +83 -12
  560. package/clients/cli/commands/upgrade.file-protection.test.mjs +228 -0
  561. package/clients/cli/commands/upgrade.flag-help.test.mjs +188 -0
  562. package/clients/cli/commands/upgrade.hook-output.test.mjs +88 -0
  563. package/clients/cli/commands/upgrade.mjs +29 -7
  564. package/clients/cli/formatters/index.mjs +164 -1
  565. package/clients/cli/formatters/index.test.mjs +97 -0
  566. package/clients/cli/index.mjs +47 -34
  567. package/clients/cli/latest-version-env.test.mjs +50 -0
  568. package/clients/cli/lib/cli-error.test.mjs +7 -0
  569. package/clients/cli/lib/component-format.mjs +9 -9
  570. package/clients/cli/lib/component-format.test.mjs +1 -1
  571. package/clients/cli/lib/define-command.mjs +56 -6
  572. package/clients/cli/lib/define-command.test.mjs +54 -0
  573. package/clients/cli/lib/doc-text-ascii.test.mjs +82 -0
  574. package/clients/cli/lib/exit-codes.test.mjs +113 -0
  575. package/clients/cli/lib/hook-format.mjs +19 -10
  576. package/clients/cli/lib/json-shim.mjs +62 -16
  577. package/clients/cli/lib/json-shim.test.mjs +83 -0
  578. package/clients/cli/lib/manifest.d.ts +2 -0
  579. package/clients/cli/lib/manifest.mjs +53 -6
  580. package/clients/cli/lib/manifest.test.mjs +22 -2
  581. package/clients/cli/lib/parse-error-format.test.mjs +81 -0
  582. package/foundation/agent-docs/agent-docs.d.mts +7 -2
  583. package/foundation/agent-docs/agent-docs.mjs +83 -13
  584. package/foundation/agent-docs/agent-docs.path-safety.test.mjs +266 -4
  585. package/foundation/config/integration-debug.test.mjs +28 -3
  586. package/foundation/config/project-themes.test.mjs +11 -19
  587. package/foundation/config/project.d.mts +20 -11
  588. package/foundation/config/project.mjs +263 -91
  589. package/foundation/config/project.test.mjs +270 -21
  590. package/foundation/discovery/authoring-self-docs.d.mts +87 -0
  591. package/foundation/discovery/authoring-self-docs.mjs +237 -0
  592. package/foundation/discovery/authoring-self-docs.test.mjs +174 -0
  593. package/foundation/discovery/authoring-surface.d.mts +74 -0
  594. package/foundation/discovery/authoring-surface.mjs +525 -0
  595. package/foundation/discovery/authoring-surface.test.mjs +392 -0
  596. package/foundation/discovery/cli-self-docs.d.mts +119 -0
  597. package/foundation/discovery/cli-self-docs.mjs +504 -0
  598. package/foundation/discovery/cli-self-docs.test.mjs +395 -0
  599. package/foundation/discovery/component-discovery.d.mts +39 -1
  600. package/foundation/discovery/component-discovery.mjs +50 -1
  601. package/foundation/discovery/component-loader.d.mts +35 -38
  602. package/foundation/discovery/component-loader.mjs +53 -222
  603. package/foundation/discovery/docs-discovery.d.mts +119 -11
  604. package/foundation/discovery/docs-discovery.mjs +427 -108
  605. package/foundation/discovery/docs-discovery.test.mjs +386 -20
  606. package/foundation/discovery/docs-output-budget.d.mts +28 -0
  607. package/foundation/discovery/docs-output-budget.mjs +50 -0
  608. package/foundation/discovery/docs-section-key.d.mts +116 -0
  609. package/foundation/discovery/docs-section-key.mjs +322 -0
  610. package/foundation/discovery/docs-section-key.test.mjs +246 -0
  611. package/foundation/discovery/template-adapter.d.mts +113 -11
  612. package/foundation/discovery/template-adapter.fixture-refs.test.mjs +248 -0
  613. package/foundation/discovery/template-adapter.integration-isolation.test.mjs +94 -0
  614. package/foundation/discovery/template-adapter.mjs +774 -83
  615. package/foundation/discovery/template-adapter.test.mjs +57 -0
  616. package/foundation/discovery/template-conflict-release.d.mts +13 -0
  617. package/foundation/discovery/template-conflict-release.mjs +40 -0
  618. package/foundation/discovery/template-conflict-release.test.mjs +40 -0
  619. package/foundation/discovery/theme-discovery.d.mts +67 -7
  620. package/foundation/discovery/theme-discovery.mjs +916 -186
  621. package/foundation/discovery/theme-discovery.test.mjs +613 -219
  622. package/foundation/discovery/theming-targets.test.mjs +4 -0
  623. package/foundation/doc-compiler/bundle.d.mts +47 -0
  624. package/foundation/doc-compiler/bundle.mjs +278 -0
  625. package/foundation/doc-compiler/bundle.test.mjs +266 -0
  626. package/foundation/doc-compiler/compile.d.mts +343 -0
  627. package/foundation/doc-compiler/compile.mjs +558 -0
  628. package/foundation/doc-compiler/diagnostics.d.mts +126 -0
  629. package/foundation/doc-compiler/diagnostics.mjs +305 -0
  630. package/foundation/doc-compiler/doc-compiler.test.mjs +714 -0
  631. package/foundation/doc-compiler/doc-loads.test.mjs +1643 -0
  632. package/foundation/doc-compiler/import.d.mts +24 -0
  633. package/foundation/doc-compiler/import.mjs +59 -0
  634. package/foundation/doc-compiler/inputs.d.mts +102 -0
  635. package/foundation/doc-compiler/inputs.mjs +291 -0
  636. package/foundation/doc-compiler/inputs.test.mjs +298 -0
  637. package/foundation/doc-compiler/ir.d.mts +22 -0
  638. package/foundation/doc-compiler/ir.mjs +471 -0
  639. package/foundation/doc-compiler/lenses.d.mts +36 -0
  640. package/foundation/doc-compiler/lenses.mjs +173 -0
  641. package/foundation/doc-compiler/links.d.mts +162 -0
  642. package/foundation/doc-compiler/links.mjs +294 -0
  643. package/foundation/doc-compiler/links.test.mjs +192 -0
  644. package/foundation/doc-compiler/lower-doc.test.mjs +495 -0
  645. package/foundation/doc-compiler/overlays.d.mts +37 -0
  646. package/foundation/doc-compiler/overlays.mjs +206 -0
  647. package/foundation/doc-compiler/parse-readable.d.mts +9 -0
  648. package/foundation/doc-compiler/parse-readable.mjs +29 -0
  649. package/foundation/doc-compiler/read.d.mts +127 -0
  650. package/foundation/doc-compiler/read.mjs +325 -0
  651. package/foundation/doc-compiler/read.test.mjs +313 -0
  652. package/foundation/doc-compiler/source.d.mts +33 -0
  653. package/foundation/doc-compiler/source.mjs +128 -0
  654. package/foundation/doc-compiler/tree.d.mts +292 -0
  655. package/foundation/doc-compiler/tree.mjs +881 -0
  656. package/foundation/fs/file-protection.d.mts +33 -0
  657. package/foundation/fs/file-protection.mjs +825 -0
  658. package/foundation/fs/file-protection.test.mjs +250 -0
  659. package/foundation/fs/module-loader.d.mts +1 -0
  660. package/foundation/fs/module-loader.mjs +50 -1
  661. package/foundation/fs/module-loader.stdout.test.mjs +332 -0
  662. package/foundation/fs/path-safety.d.mts +3 -2
  663. package/foundation/fs/path-safety.mjs +49 -19
  664. package/foundation/fs/path-safety.test.mjs +50 -0
  665. package/foundation/fs/publish-file-hardlink-unavailable.test.mjs +129 -94
  666. package/foundation/identity/provider-identity.d.mts +90 -0
  667. package/foundation/identity/provider-identity.mjs +320 -0
  668. package/foundation/identity/provider-identity.test.mjs +254 -0
  669. package/foundation/identity/providers.d.mts +7 -0
  670. package/foundation/identity/providers.mjs +16 -0
  671. package/foundation/integrations/autolink.d.mts +58 -1
  672. package/foundation/integrations/autolink.mjs +143 -45
  673. package/foundation/integrations/autolink.test.mjs +1 -1
  674. package/foundation/integrations/cli-requirement.d.mts +65 -0
  675. package/foundation/integrations/cli-requirement.mjs +189 -0
  676. package/foundation/integrations/cli-requirement.test.mjs +89 -0
  677. package/foundation/integrations/contribution-fixes.d.mts +145 -0
  678. package/foundation/integrations/contribution-fixes.mjs +1284 -0
  679. package/foundation/integrations/contribution-inventory.d.mts +3 -2
  680. package/foundation/integrations/contribution-inventory.mjs +28 -25
  681. package/foundation/integrations/contribution-inventory.test.mjs +86 -27
  682. package/foundation/integrations/integration-warnings.d.mts +9 -2
  683. package/foundation/integrations/integration-warnings.mjs +52 -21
  684. package/foundation/integrations/integration-warnings.test.mjs +74 -1
  685. package/foundation/integrations/integrations.d.mts +63 -3
  686. package/foundation/integrations/integrations.mjs +122 -9
  687. package/foundation/integrations/integrations.test.mjs +415 -1
  688. package/foundation/integrations/provider-conflicts.test.mjs +125 -0
  689. package/foundation/integrations/provider-ledger.test.mjs +275 -0
  690. package/foundation/integrations/provider-resolution.d.mts +152 -0
  691. package/foundation/integrations/provider-resolution.mjs +576 -0
  692. package/foundation/integrations/provider-resolution.test.mjs +369 -0
  693. package/foundation/integrations/theme-descriptor.d.mts +8 -0
  694. package/foundation/integrations/theme-descriptor.mjs +44 -0
  695. package/foundation/integrations/validate-contributions.d.mts +2 -0
  696. package/foundation/integrations/validate-contributions.mjs +131 -29
  697. package/foundation/response/base.d.ts +8 -4
  698. package/foundation/response/batch.type.d.mts +33 -0
  699. package/foundation/response/batch.type.mjs +34 -0
  700. package/foundation/response/error-codes.d.mts +3 -1
  701. package/foundation/response/error-codes.d.ts +2 -0
  702. package/foundation/response/error-codes.doc.mjs +19 -12
  703. package/foundation/response/error-codes.mjs +8 -2
  704. package/foundation/response/error-codes.test.mjs +166 -14
  705. package/foundation/response/json-contract.test.mjs +57 -17
  706. package/foundation/response/json.d.mts +4 -2
  707. package/foundation/response/json.mjs +8 -10
  708. package/foundation/response/response-types.doc.d.mts +7 -2
  709. package/foundation/response/response-types.doc.mjs +69 -25
  710. package/foundation/response/response-types.doc.test.mjs +181 -0
  711. package/foundation/response/response.doc.mjs +12 -11
  712. package/foundation/text/string-utils.d.mts +8 -0
  713. package/foundation/text/string-utils.mjs +40 -10
  714. package/foundation/xle/expand.d.mts +2 -0
  715. package/foundation/xle/expand.mjs +4 -3
  716. package/foundation/xle/expand.test.mjs +54 -0
  717. package/foundation/xle/xle.test.mjs +13 -0
  718. package/package.json +10 -11
  719. package/api/docs/docs.test.mjs +0 -83
  720. package/api/docs/integrationDocs.test.mjs +0 -208
  721. package/api/search/search.test.mjs +0 -389
  722. package/assets/docs/cli-integrations.doc.mjs +0 -367
  723. package/assets/templates/themes/manifest.json +0 -95
  724. package/clients/cli/commands/docs.test.mjs +0 -102
  725. package/clients/cli/lib/update-check.mjs +0 -83
  726. package/clients/cli/lib/update-check.test.mjs +0 -137
  727. package/clients/cli/update-hint-commands.test.mjs +0 -54
  728. package/foundation/agent-docs/agent-docs.test.mjs +0 -1141
@@ -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,14 +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';
38
+ import {Project, providerLedgerOf} from '../../foundation/config/project.mjs';
36
39
  import {loadIntegrations} from '../../foundation/integrations/integrations.mjs';
40
+ import {resolveProviders} from '../../foundation/integrations/provider-resolution.mjs';
37
41
  import {warnOnIntegrationIssues} from '../../foundation/integrations/integration-warnings.mjs';
38
42
  import {logger} from '../logger.mjs';
39
43
 
40
44
  // Re-exported for the run leaf's lightweight agent-docs inspection path
41
45
  // (config_fixable short-circuit, where the full render cannot load config).
42
- export { inspectAgentDocs };
46
+ export {inspectAgentDocs};
43
47
 
44
48
  const execFileAsync = promisify(execFile);
45
49
 
@@ -101,6 +105,27 @@ export function uniqueFiles(files) {
101
105
  ];
102
106
  }
103
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
+
104
129
  /**
105
130
  * Run the app config's post-codemod hooks (config.hooks.postCodemod).
106
131
  * Dry-run PREVIEWS (buildCommand still called, so a throw fails); apply executes.
@@ -120,7 +145,9 @@ export async function runPostCodemodHooks(hooks, context) {
120
145
  );
121
146
  }
122
147
 
123
- const cmd = await hook.buildCommand({packageDir, files});
148
+ const cmd = await withStdoutOnStderr(() =>
149
+ hook.buildCommand({packageDir, files}),
150
+ );
124
151
  if (!cmd) {
125
152
  logger.log(`Post-codemod hook ${label} produced no command; skipping.`);
126
153
  continue;
@@ -144,7 +171,7 @@ export async function runPostCodemodHooks(hooks, context) {
144
171
  env: {...process.env, ...(cmd.options?.env ?? {})},
145
172
  }),
146
173
  );
147
- logger.log(`✓ Post-codemod hook ${label} completed.`);
174
+ logger.log(`[ok] Post-codemod hook ${label} completed.`);
148
175
  }
149
176
  }
150
177
 
@@ -183,7 +210,7 @@ export async function prepareAgentDocsRefresh({
183
210
  if (initial.status === 'missing') {
184
211
  summary.action = 'nudge-init';
185
212
  logger.warn(
186
- `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.`,
187
214
  );
188
215
  return {cwd, renderedBlock: null, summary};
189
216
  }
@@ -237,7 +264,7 @@ export function applyAgentDocsRefresh(plan) {
237
264
  summary.files = written;
238
265
  summary.action = summary.refreshed ? 'refreshed' : 'error';
239
266
  if (summary.refreshed) {
240
- logger.log(`✓ Agent docs refreshed → ${written.join(', ')}`);
267
+ logger.log(`[ok] Agent docs refreshed -> ${written.join(', ')}`);
241
268
  } else {
242
269
  logger.warn(
243
270
  `Agent docs look stale but couldn't be refreshed. Run \`${formatCliCommand('astryx init --features agents')}\` to reinstall the block.`,
@@ -265,7 +292,13 @@ export async function collectAllCodemods() {
265
292
  );
266
293
  for (const {version, transforms} of manifests) {
267
294
  for (const {name, meta, optional} of transforms) {
268
- 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
+ });
269
302
  }
270
303
  }
271
304
  return codemods;
@@ -296,24 +329,36 @@ export async function ensureCodemodDeps({installDeps} = {}) {
296
329
  * Run the CORE registry codemods. Runs BEFORE the config is loaded so a core
297
330
  * CONFIG codemod can repair a config the strict loader would otherwise reject.
298
331
  * @param {CoreVersionManifest[]} versionManifests
299
- * @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
300
333
  */
301
- 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
+ ) {
302
338
  return runCodemods(versionManifests, {
303
339
  apply,
304
340
  path: srcPath,
305
341
  codemod,
306
342
  skipCodemods,
307
- silent: logger.silent,
343
+ silent: silent ?? logger.silent,
344
+ root,
345
+ protection,
308
346
  });
309
347
  }
310
348
 
311
349
  /**
312
350
  * Load the consumer project's config + integrations. Throws on invalid config;
313
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
+ *
314
359
  * @param {string} cwd
315
360
  * @param {string[]} [extraIntegrationSpecs] explicit `--integration` specs
316
- * @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}>}
317
362
  */
318
363
  export async function loadProjectContext(cwd, extraIntegrationSpecs = []) {
319
364
  // The CLI debug preflight may already have imported this config before core
@@ -321,12 +366,66 @@ export async function loadProjectContext(cwd, extraIntegrationSpecs = []) {
321
366
  // cache entry; ordinary Project discovery remains cached by default.
322
367
  const project = await Project.load(cwd, {fresh: true});
323
368
  const postCodemodHooks = project.config.hooks?.postCodemod ?? [];
324
- const integrationSpecs = uniqueFiles([
325
- ...(project.integrations ?? []),
326
- ...(extraIntegrationSpecs ?? []),
327
- ]);
328
- const integrations = await loadIntegrations(integrationSpecs);
329
- return {postCodemodHooks, integrations};
369
+ const configuredSpecs = new Set(project.integrations ?? []);
370
+ // Configured packages come from Project, which has already resolved provider
371
+ // identity over configured, autolinked, and local packages. Loading them
372
+ // again here would let upgrade run codemods from a package Project set aside.
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
+ });
389
+ // A package that lists itself runs its installed copy's released codemods,
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.
393
+ const local = project.loadedIntegrations.find(
394
+ integration => integration.__local,
395
+ );
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
+ : [];
405
+ const extraSpecs = uniqueFiles(extraIntegrationSpecs ?? []).filter(
406
+ spec => !configuredSpecs.has(spec),
407
+ );
408
+ const extras =
409
+ extraSpecs.length === 0
410
+ ? []
411
+ : await loadIntegrations(extraSpecs, {resolveProviders: false});
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)},
427
+ );
428
+ return {postCodemodHooks, integrations, ledger};
330
429
  }
331
430
 
332
431
  /**
@@ -361,7 +460,10 @@ export async function selectIntegrationCodemodsFor(integrations, from, to) {
361
460
  try {
362
461
  const byVersion = await discoverIntegrationCodemods([integration]);
363
462
  for (const [version, rawList] of byVersion) {
364
- 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
+ );
365
467
  const existing = integrationCodemodsByVersion.get(version);
366
468
  if (existing) existing.push(...list);
367
469
  else integrationCodemodsByVersion.set(version, [...list]);
@@ -378,9 +480,21 @@ export async function selectIntegrationCodemodsFor(integrations, from, to) {
378
480
  /**
379
481
  * Run the file-based INTEGRATION codemods (config codemods first, then code).
380
482
  * @param {Array<{version: string, codemods: import('../../authoring/codemod/type').CodemodEntry[]}>} versionGroups
381
- * @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
382
484
  */
383
- 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
+ ) {
384
498
  const jscodeshift = (await import('jscodeshift')).default;
385
499
  return runIntegrationCodemods(versionGroups, {
386
500
  apply,
@@ -388,6 +502,9 @@ export async function runIntegrationCodemodsStep(versionGroups, {apply, path: sr
388
502
  codemod,
389
503
  skipCodemods,
390
504
  jscodeshift,
391
- silent: logger.silent,
505
+ silent: silent ?? logger.silent,
506
+ root,
507
+ protection,
508
+ contents,
392
509
  });
393
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,272 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file `loadProjectContext` agrees with Project on provider identity, so
5
+ * `astryx upgrade` never runs codemods from a package Project set aside.
6
+ *
7
+ * Fixtures live under a repo-local temp dir, not /tmp, because Vite refuses to
8
+ * dynamically import a module from outside the project root.
9
+ */
10
+
11
+ import {afterEach, beforeEach, describe, expect, it} from 'vitest';
12
+ import * as fs from 'node:fs';
13
+ import * as path from 'node:path';
14
+ import {loadProjectContext, selectIntegrationCodemodsFor} from './_adapter.mjs';
15
+
16
+ let tmpDir;
17
+ let originalCwd;
18
+
19
+ beforeEach(() => {
20
+ originalCwd = process.cwd();
21
+ tmpDir = fs.mkdtempSync(path.join(process.cwd(), '.astryx-upgrade-context-'));
22
+ });
23
+
24
+ afterEach(() => {
25
+ process.chdir(originalCwd);
26
+ fs.rmSync(tmpDir, {recursive: true, force: true});
27
+ });
28
+
29
+ /**
30
+ * Install an integration package that ships one 0.2.0 codemod.
31
+ * @param {string} name
32
+ * @param {string} version
33
+ * @param {Record<string, unknown>} [manifest]
34
+ */
35
+ function installWithCodemod(name, version, manifest = {}) {
36
+ const pkgDir = path.join(tmpDir, 'node_modules', ...name.split('/'));
37
+ const codemodDir = path.join(pkgDir, 'codemods', '0.2.0');
38
+ fs.mkdirSync(codemodDir, {recursive: true});
39
+ fs.writeFileSync(path.join(pkgDir, 'package.json'), JSON.stringify({name, version}));
40
+ fs.writeFileSync(
41
+ path.join(pkgDir, 'astryx.integration.mjs'),
42
+ `export default ${JSON.stringify({codemods: './codemods', ...manifest})};\n`,
43
+ );
44
+ fs.writeFileSync(
45
+ path.join(codemodDir, 'rename.mjs'),
46
+ "export default {type: 'code', title: 'Rename', transform: file => file.source};\n",
47
+ );
48
+ }
49
+
50
+ /** @param {string[]} integrations */
51
+ function configure(integrations) {
52
+ fs.writeFileSync(
53
+ path.join(tmpDir, 'astryx.config.mjs'),
54
+ `export default ${JSON.stringify({integrations})};\n`,
55
+ );
56
+ }
57
+
58
+ describe('loadProjectContext provider identity', () => {
59
+ it('keeps codemods from a configured package the authored package sets aside', async () => {
60
+ installWithCodemod('@acme/widgets', '1.0.0');
61
+ configure(['@acme/widgets']);
62
+ fs.writeFileSync(
63
+ path.join(tmpDir, 'package.json'),
64
+ JSON.stringify({name: '@acme/renamed', version: '2.0.0-dev'}),
65
+ );
66
+ fs.writeFileSync(
67
+ path.join(tmpDir, 'astryx.integration.mjs'),
68
+ "export default {providerId: '@acme/widgets'};\n",
69
+ );
70
+
71
+ const {integrations} = await loadProjectContext(tmpDir);
72
+ expect(
73
+ integrations.map(integration => [
74
+ integration.name,
75
+ Boolean(integration.__providerConflict),
76
+ ]),
77
+ ).toEqual([['@acme/widgets', true]]);
78
+ expect(
79
+ await selectIntegrationCodemodsFor(integrations, '0.1.0', '0.3.0'),
80
+ ).toEqual([]);
81
+ });
82
+
83
+ it('still selects codemods from a configured package nothing else claims', async () => {
84
+ installWithCodemod('@acme/widgets', '1.0.0');
85
+ configure(['@acme/widgets']);
86
+ fs.writeFileSync(path.join(tmpDir, 'package.json'), JSON.stringify({name: 'consumer'}));
87
+
88
+ const {integrations} = await loadProjectContext(tmpDir);
89
+ const selected = await selectIntegrationCodemodsFor(integrations, '0.1.0', '0.3.0');
90
+ expect(selected.map(entry => entry.version)).toEqual(['0.2.0']);
91
+ });
92
+
93
+ it('sets aside an --integration extra that claims a configured provider ID', async () => {
94
+ installWithCodemod('@acme/widgets', '1.0.0');
95
+ installWithCodemod('@acme/other', '1.0.0', {providerId: '@acme/widgets'});
96
+ configure(['@acme/widgets']);
97
+ fs.writeFileSync(path.join(tmpDir, 'package.json'), JSON.stringify({name: 'consumer'}));
98
+ // `--integration` specs resolve from the process cwd, as they always have.
99
+ process.chdir(tmpDir);
100
+
101
+ const {integrations} = await loadProjectContext(tmpDir, ['@acme/other']);
102
+ expect(
103
+ integrations.map(integration => [
104
+ integration.name,
105
+ integration.__providerConflict?.claimedBy ?? null,
106
+ ]),
107
+ ).toEqual([
108
+ ['@acme/widgets', null],
109
+ ['@acme/other', '@acme/widgets'],
110
+ ]);
111
+ });
112
+
113
+ it('runs the installed copy of a package that lists itself, not its work in progress', async () => {
114
+ installWithCodemod('@acme/widgets', '1.0.0');
115
+ configure(['@acme/widgets']);
116
+ fs.writeFileSync(
117
+ path.join(tmpDir, 'package.json'),
118
+ JSON.stringify({name: '@acme/widgets', version: '3.0.0-dev'}),
119
+ );
120
+ fs.writeFileSync(
121
+ path.join(tmpDir, 'astryx.integration.mjs'),
122
+ "export default {codemods: './codemods'};\n",
123
+ );
124
+ fs.mkdirSync(path.join(tmpDir, 'codemods', '0.2.0'), {recursive: true});
125
+ fs.writeFileSync(
126
+ path.join(tmpDir, 'codemods', '0.2.0', 'local-wip.mjs'),
127
+ "export default {type: 'code', title: 'Local WIP', transform: file => file.source};\n",
128
+ );
129
+
130
+ const {integrations} = await loadProjectContext(tmpDir);
131
+ expect(
132
+ integrations.map(integration => [
133
+ integration.name,
134
+ integration.version,
135
+ Boolean(integration.__local),
136
+ Boolean(integration.__providerConflict),
137
+ ]),
138
+ ).toEqual([['@acme/widgets', '1.0.0', false, false]]);
139
+ const selected = JSON.stringify(
140
+ await selectIntegrationCodemodsFor(integrations, '0.1.0', '0.3.0'),
141
+ );
142
+ expect(selected).toContain('rename');
143
+ expect(selected).not.toContain('local-wip');
144
+ });
145
+
146
+ it('runs the installed copy when the authored package is named with --integration', async () => {
147
+ installWithCodemod('@acme/widgets', '1.0.0');
148
+ configure([]);
149
+ fs.writeFileSync(
150
+ path.join(tmpDir, 'package.json'),
151
+ JSON.stringify({name: '@acme/widgets', version: '3.0.0-dev'}),
152
+ );
153
+ fs.writeFileSync(
154
+ path.join(tmpDir, 'astryx.integration.mjs'),
155
+ "export default {codemods: './codemods'};\n",
156
+ );
157
+ fs.mkdirSync(path.join(tmpDir, 'codemods', '0.2.0'), {recursive: true});
158
+ fs.writeFileSync(
159
+ path.join(tmpDir, 'codemods', '0.2.0', 'local-wip.mjs'),
160
+ "export default {type: 'code', title: 'Local WIP', transform: file => file.source};\n",
161
+ );
162
+ process.chdir(tmpDir);
163
+
164
+ const {integrations} = await loadProjectContext(tmpDir, ['@acme/widgets']);
165
+ expect(
166
+ integrations.map(integration => [
167
+ integration.name,
168
+ integration.version,
169
+ Boolean(integration.__local),
170
+ integration.__providerConflict?.claimedBy ?? null,
171
+ ]),
172
+ ).toEqual([['@acme/widgets', '1.0.0', false, null]]);
173
+ const selected = JSON.stringify(
174
+ await selectIntegrationCodemodsFor(integrations, '0.1.0', '0.3.0'),
175
+ );
176
+ expect(selected).toContain('rename');
177
+ expect(selected).not.toContain('local-wip');
178
+ });
179
+
180
+ it("sets aside an --integration extra that claims an autolinked package's ID", async () => {
181
+ installWithCodemod('@acme/a', '1.0.0');
182
+ installWithCodemod('@acme/b', '1.0.0', {providerId: '@acme/a'});
183
+ configure([]);
184
+ fs.writeFileSync(
185
+ path.join(tmpDir, 'package.json'),
186
+ JSON.stringify({name: 'consumer', dependencies: {'@acme/a': '1.0.0'}}),
187
+ );
188
+ process.chdir(tmpDir);
189
+
190
+ const {integrations} = await loadProjectContext(tmpDir, ['@acme/b']);
191
+ expect(
192
+ integrations.map(integration => [
193
+ integration.name,
194
+ integration.__providerConflict?.claimedBy ?? null,
195
+ ]),
196
+ ).toEqual([['@acme/b', '@acme/a']]);
197
+ expect(
198
+ await selectIntegrationCodemodsFor(integrations, '0.1.0', '0.3.0'),
199
+ ).toEqual([]);
200
+ });
201
+
202
+ it('runs an autolinked package the user names with --integration', async () => {
203
+ installWithCodemod('@acme/a', '1.0.0');
204
+ fs.writeFileSync(
205
+ path.join(tmpDir, 'package.json'),
206
+ JSON.stringify({name: 'consumer', dependencies: {'@acme/a': '1.0.0'}}),
207
+ );
208
+ process.chdir(tmpDir);
209
+
210
+ const {integrations} = await loadProjectContext(tmpDir, ['@acme/a']);
211
+ expect(
212
+ integrations.map(integration => [
213
+ integration.name,
214
+ integration.__providerConflict?.claimedBy ?? null,
215
+ ]),
216
+ ).toEqual([['@acme/a', null]]);
217
+ const selected = await selectIntegrationCodemodsFor(integrations, '0.1.0', '0.3.0');
218
+ expect(selected.map(entry => entry.version)).toEqual(['0.2.0']);
219
+ });
220
+
221
+ it('never reports a claimant that every other command uses as set aside', async () => {
222
+ installWithCodemod('@acme/widgets', '1.0.0');
223
+ installWithCodemod('@acme/renamed', '2.0.0', {providerId: '@acme/widgets'});
224
+ configure(['@acme/widgets']);
225
+ fs.writeFileSync(
226
+ path.join(tmpDir, 'package.json'),
227
+ JSON.stringify({
228
+ name: '@acme/widgets',
229
+ version: '3.0.0-dev',
230
+ dependencies: {'@acme/renamed': '2.0.0'},
231
+ }),
232
+ );
233
+ fs.writeFileSync(
234
+ path.join(tmpDir, 'astryx.integration.mjs'),
235
+ "export default {providerId: '@acme/widgets-next'};\n",
236
+ );
237
+
238
+ const {integrations} = await loadProjectContext(tmpDir);
239
+ expect(
240
+ integrations.map(integration => [
241
+ integration.name,
242
+ integration.version,
243
+ integration.__providerConflict?.claimedBy ?? null,
244
+ ]),
245
+ ).toEqual([['@acme/widgets', '1.0.0', null]]);
246
+ });
247
+
248
+ it("sets aside an --integration extra that claims the authored package's ID", async () => {
249
+ installWithCodemod('@acme/widgets', '1.0.0');
250
+ configure([]);
251
+ fs.writeFileSync(
252
+ path.join(tmpDir, 'package.json'),
253
+ JSON.stringify({name: '@acme/renamed', version: '2.0.0-dev'}),
254
+ );
255
+ fs.writeFileSync(
256
+ path.join(tmpDir, 'astryx.integration.mjs'),
257
+ "export default {providerId: '@acme/widgets'};\n",
258
+ );
259
+ process.chdir(tmpDir);
260
+
261
+ const {integrations} = await loadProjectContext(tmpDir, ['@acme/widgets']);
262
+ expect(
263
+ integrations.map(integration => [
264
+ integration.name,
265
+ integration.__providerConflict?.claimedBy ?? null,
266
+ ]),
267
+ ).toEqual([['@acme/widgets', '@acme/renamed']]);
268
+ expect(
269
+ await selectIntegrationCodemodsFor(integrations, '0.1.0', '0.3.0'),
270
+ ).toEqual([]);
271
+ });
272
+ });