@astryxdesign/cli 0.6.3-canary.db4e378 → 0.6.3-canary.db52d98

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 (397) hide show
  1. package/README.md +38 -15
  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 +14 -7
  6. package/api/build/build.test.mjs +184 -6
  7. package/api/build/build.type.d.mts +57 -2
  8. package/api/build/build.type.mjs +30 -7
  9. package/api/build/help/help.d.mts +4 -0
  10. package/api/build/help/help.mjs +24 -11
  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 +1 -0
  19. package/api/component/component.mjs +60 -12
  20. package/api/component/list/list.mjs +3 -2
  21. package/api/discover/discover.doc.mjs +1 -0
  22. package/api/docs/_adapter.d.mts +252 -34
  23. package/api/docs/_adapter.mjs +923 -132
  24. package/api/docs/detail/detail.mjs +11 -3
  25. package/api/docs/detail/section/section.mjs +24 -13
  26. package/api/docs/detail/section/section.test.mjs +15 -6
  27. package/api/docs/docs.d.mts +5 -3
  28. package/api/docs/docs.doc.mjs +39 -17
  29. package/api/docs/docs.mjs +44 -8
  30. package/api/docs/docs.test.mjs +158 -4
  31. package/api/docs/docs.type.d.mts +181 -2
  32. package/api/docs/docs.type.mjs +117 -3
  33. package/api/docs/index/index.mjs +11 -3
  34. package/api/docs/index/index.test.mjs +1 -1
  35. package/api/docs/integration-tree.test.mjs +555 -0
  36. package/api/docs/integrationDocs.test.mjs +14 -14
  37. package/api/docs/list/list.mjs +28 -12
  38. package/api/docs/node/node.d.mts +43 -0
  39. package/api/docs/node/node.mjs +192 -0
  40. package/api/docs/reference-blocks.test.mjs +406 -0
  41. package/api/doctor/doctor.d.mts +54 -4
  42. package/api/doctor/doctor.doc.mjs +1 -0
  43. package/api/doctor/doctor.mjs +331 -16
  44. package/api/doctor/doctor.test.mjs +420 -7
  45. package/api/gap-report/gap-report.doc.mjs +1 -0
  46. package/api/hook/_adapter.mjs +19 -5
  47. package/api/hook/hook.doc.mjs +1 -0
  48. package/api/hook/list/list.d.mts +1 -1
  49. package/api/hook/list/list.mjs +69 -17
  50. package/api/index.d.mts +1 -1
  51. package/api/index.mjs +1 -0
  52. package/api/init/init.doc.mjs +2 -1
  53. package/api/integration/add-contribution.d.mts +2 -1
  54. package/api/integration/add-contribution.mjs +114 -12
  55. package/api/integration/add-contribution.test.mjs +174 -3
  56. package/api/integration/add-theme.mjs +34 -64
  57. package/api/integration/add-theme.test.mjs +105 -21
  58. package/api/integration/authoring-checks.mjs +138 -28
  59. package/api/integration/authoring-checks.test.mjs +179 -7
  60. package/api/integration/authoring-checks.type.mjs +6 -1
  61. package/api/integration/integration-authoring.type.d.mts +2 -0
  62. package/api/integration/integration-authoring.type.mjs +2 -0
  63. package/api/integration/integration-block-exports.test.mjs +10 -6
  64. package/api/integration/integrationAdd.doc.mjs +7 -0
  65. package/api/integration/integrationAddAgentDoc.doc.mjs +1 -0
  66. package/api/integration/integrationAddCodemod.doc.mjs +1 -0
  67. package/api/integration/integrationAddComponent.doc.mjs +1 -0
  68. package/api/integration/integrationAddDoc.doc.mjs +8 -1
  69. package/api/integration/integrationAddTemplate.doc.mjs +1 -0
  70. package/api/integration/integrationAddTheme.doc.mjs +6 -5
  71. package/api/integration/integrationComponentConflicts.doc.mjs +1 -0
  72. package/api/integration/integrationDocConflicts.doc.mjs +2 -1
  73. package/api/integration/integrationPackCheck.doc.mjs +2 -1
  74. package/api/integration/integrationTemplateConflicts.doc.d.mts +3 -0
  75. package/api/integration/integrationTemplateConflicts.doc.mjs +4 -0
  76. package/api/integration/pack-check.mjs +34 -0
  77. package/api/integration/pack-check.test.mjs +138 -47
  78. package/api/integration/pack-check.type.d.mts +26 -2
  79. package/api/integration/pack-check.type.mjs +14 -1
  80. package/api/integration/summarizeIssues.doc.mjs +1 -0
  81. package/api/integration/template-conflict-compatibility.test.mjs +73 -0
  82. package/api/integration/validate-integration-fixes.test.mjs +1389 -0
  83. package/api/integration/validate-integration.mjs +50 -102
  84. package/api/integration/validate-integration.test.mjs +88 -26
  85. package/api/integration/validate-unread-theme-folders.test.mjs +110 -0
  86. package/api/integration/validateIntegration.doc.mjs +2 -1
  87. package/api/json/assertResponse.doc.mjs +1 -0
  88. package/api/json/index.ts +2 -0
  89. package/api/json/isError.doc.mjs +1 -0
  90. package/api/json/parseResponse.doc.mjs +1 -0
  91. package/api/layout/_adapter.mjs +20 -5
  92. package/api/layout/layoutCheck.doc.mjs +1 -0
  93. package/api/layout/layoutExpand.doc.mjs +1 -0
  94. package/api/layout/layoutGrammar.doc.mjs +1 -0
  95. package/api/search/search.d.mts +59 -1
  96. package/api/search/search.doc.mjs +5 -3
  97. package/api/search/search.mjs +458 -77
  98. package/api/search/search.test.mjs +91 -2
  99. package/api/search/search.type.d.mts +13 -1
  100. package/api/search/search.type.mjs +4 -1
  101. package/api/swizzle/swizzle.doc.mjs +1 -0
  102. package/api/template/list/list.mjs +1 -0
  103. package/api/template/table-floating-bulk-actions.test.mjs +66 -0
  104. package/api/template/template-integration.test.mjs +1072 -3
  105. package/api/template/template-suffix.test.mjs +41 -21
  106. package/api/template/template.doc.mjs +28 -7
  107. package/api/template/template.mjs +45 -8
  108. package/api/template/template.type.d.mts +6 -8
  109. package/api/template/template.type.mjs +3 -2
  110. package/api/theme/_adapter.d.mts +2 -3
  111. package/api/theme/_adapter.mjs +4 -5
  112. package/api/theme/add/add.binary.test.mjs +10 -17
  113. package/api/theme/add/add.test.mjs +14 -1
  114. package/api/theme/generateTonalPalette.doc.mjs +1 -0
  115. package/api/theme/integration-themes.test.mjs +39 -28
  116. package/api/theme/list/list.test.mjs +19 -20
  117. package/api/theme/listThemes.doc.mjs +6 -5
  118. package/api/theme/template/template.test.mjs +5 -0
  119. package/api/theme/themeAdd.doc.mjs +4 -3
  120. package/api/theme/themeBuild.doc.mjs +1 -0
  121. package/api/theme/themeList.doc.mjs +6 -3
  122. package/api/theme/themeListAvailable.doc.mjs +5 -3
  123. package/api/theme/themePaletteGenerate.doc.mjs +1 -0
  124. package/api/theme/themeTargets.doc.mjs +1 -0
  125. package/api/theme/themeTemplate.doc.mjs +2 -1
  126. package/api/upgrade/_adapter.d.mts +32 -5
  127. package/api/upgrade/_adapter.mjs +97 -69
  128. package/api/upgrade/provider-agreement.test.mjs +152 -0
  129. package/api/upgrade/run/run.mjs +356 -59
  130. package/api/upgrade/upgrade.doc.mjs +6 -1
  131. package/api/upgrade/upgrade.type.d.mts +34 -0
  132. package/api/upgrade/upgrade.type.mjs +15 -0
  133. package/assets/codemods/__tests__/runner.test.mjs +330 -8
  134. package/assets/codemods/integration-discovery.mjs +8 -2
  135. package/assets/codemods/integration-discovery.test.mjs +15 -0
  136. package/assets/codemods/integration-runner.mjs +56 -4
  137. package/assets/codemods/integration-runner.protection.test.mjs +153 -0
  138. package/assets/codemods/run-codemod.mjs +177 -34
  139. package/assets/codemods/runner.mjs +350 -102
  140. package/assets/codemods/transforms/next/__tests__/migrate-native-picker-to-presentation.test.mjs +63 -0
  141. package/assets/codemods/transforms/next/__tests__/migrate-theme-catalog-to-descriptors.test.mjs +220 -0
  142. package/assets/codemods/transforms/next/index.mjs +19 -1
  143. package/assets/codemods/transforms/next/migrate-native-picker-to-presentation.mjs +148 -0
  144. package/assets/codemods/transforms/next/migrate-theme-catalog-to-descriptors.mjs +141 -0
  145. package/assets/docs/getting-started.doc.mjs +2 -2
  146. package/assets/docs/layout.doc.dense.mjs +2 -2
  147. package/assets/docs/layout.doc.mjs +1 -1
  148. package/assets/docs/principles.doc.mjs +6 -6
  149. package/assets/docs/styling-libraries.doc.mjs +3 -3
  150. package/assets/docs/styling.doc.mjs +4 -4
  151. package/assets/docs/theme.doc.mjs +5 -5
  152. package/assets/docs/tokens.doc.mjs +1 -1
  153. package/assets/docs/tree/api.doc.mjs +30 -0
  154. package/assets/docs/tree/cli.doc.mjs +23 -0
  155. package/assets/docs/tree/commands.doc.mjs +25 -0
  156. package/assets/docs/{cli-integrations.doc.mjs → tree/integrations.doc.mjs} +66 -38
  157. package/assets/docs/tree/integrations.test.mjs +62 -0
  158. package/assets/docs/tree/writing-docs.doc.mjs +286 -0
  159. package/assets/docs/working-with-ai.doc.mjs +3 -3
  160. package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.doc.mjs +1 -1
  161. package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.tsx +1 -3
  162. package/assets/templates/blocks/components/DateInput/DateInputDateRange.tsx +1 -1
  163. package/assets/templates/blocks/components/Item/ItemDocumentTabs.doc.mjs +14 -0
  164. package/assets/templates/blocks/components/Item/ItemDocumentTabs.tsx +100 -0
  165. package/assets/templates/blocks/components/Table/TableBulkActionsTable.doc.mjs +14 -0
  166. package/assets/templates/blocks/components/Table/TableBulkActionsTable.tsx +71 -0
  167. package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.doc.mjs +19 -0
  168. package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.tsx +139 -0
  169. package/assets/templates/blocks/components/TimeInput/TimeInputConstrained.tsx +1 -0
  170. package/assets/templates/themes/butter/butterTheme.doc.mjs +11 -0
  171. package/assets/templates/themes/chocolate/chocolateTheme.doc.mjs +11 -0
  172. package/assets/templates/themes/gothic/gothicTheme.doc.mjs +11 -0
  173. package/assets/templates/themes/matcha/matchaTheme.doc.mjs +11 -0
  174. package/assets/templates/themes/neutral/neutralTheme.doc.mjs +11 -0
  175. package/assets/templates/themes/stone/stoneTheme.doc.mjs +11 -0
  176. package/assets/templates/themes/y2k/y2kTheme.doc.mjs +11 -0
  177. package/authoring/codemod/codemod.doc.mjs +1 -1
  178. package/authoring/codemod/type.ts +12 -0
  179. package/authoring/config/config.doc.mjs +1 -1
  180. package/authoring/debug/debug.doc.d.mts +11 -0
  181. package/authoring/debug/debug.doc.mjs +182 -0
  182. package/authoring/debug/parse.d.mts +3 -3
  183. package/authoring/doctypes/_schema.d.mts +119 -117
  184. package/authoring/doctypes/_schema.mjs +54 -3
  185. package/authoring/doctypes/base/graph-fields.doc.mjs +8 -6
  186. package/authoring/doctypes/base/type.ts +6 -5
  187. package/authoring/doctypes/command/command.doc.mjs +1 -1
  188. package/authoring/doctypes/command/type.ts +2 -2
  189. package/authoring/doctypes/component/type.ts +2 -2
  190. package/authoring/doctypes/doctypes-new.test.mjs +48 -6
  191. package/authoring/doctypes/enum/enum.doc.mjs +1 -1
  192. package/authoring/doctypes/enum/type.ts +1 -1
  193. package/authoring/doctypes/function/function.doc.mjs +3 -2
  194. package/authoring/doctypes/function/type.ts +3 -2
  195. package/authoring/doctypes/hook/type.ts +2 -2
  196. package/authoring/doctypes/load-contract.test.mjs +28 -2
  197. package/authoring/doctypes/namespace/namespace.doc.mjs +6 -10
  198. package/authoring/doctypes/namespace/parse.test.mjs +23 -25
  199. package/authoring/doctypes/namespace/type.ts +5 -2
  200. package/authoring/doctypes/parse.d.mts +4 -2
  201. package/authoring/doctypes/parse.mjs +10 -5
  202. package/authoring/doctypes/reference/reference.doc.mjs +35 -6
  203. package/authoring/doctypes/reference/type.ts +30 -13
  204. package/authoring/doctypes/schema/schema.doc.mjs +1 -1
  205. package/authoring/doctypes/schema/type.ts +1 -2
  206. package/authoring/doctypes/template/parse.d.mts +2 -0
  207. package/authoring/doctypes/template/parse.mjs +4 -0
  208. package/authoring/doctypes/template/parse.test.mjs +18 -0
  209. package/authoring/doctypes/template/template.doc.mjs +9 -3
  210. package/authoring/doctypes/template/type.ts +8 -0
  211. package/authoring/doctypes/theme/parse.d.mts +35 -0
  212. package/authoring/doctypes/theme/parse.mjs +76 -0
  213. package/authoring/doctypes/theme/theme.doc.d.mts +9 -0
  214. package/authoring/doctypes/theme/theme.doc.mjs +79 -0
  215. package/authoring/doctypes/theme/type.ts +42 -0
  216. package/authoring/doctypes/types.ts +2 -1
  217. package/authoring/gap-report/gap-report.doc.d.mts +12 -0
  218. package/authoring/gap-report/gap-report.doc.mjs +183 -0
  219. package/authoring/identity/identity.doc.mjs +2 -2
  220. package/authoring/index.d.mts +1 -0
  221. package/authoring/index.d.ts +7 -4
  222. package/authoring/index.mjs +2 -1
  223. package/authoring/integration/integration.doc.mjs +2 -2
  224. package/authoring/integration/type.ts +4 -10
  225. package/clients/cli/__tests__/cliManifest.test.ts +27 -29
  226. package/clients/cli/commands/blog.doc.mjs +1 -1
  227. package/clients/cli/commands/build-theme.adaptations.test.mjs +100 -1
  228. package/clients/cli/commands/build-theme.mjs +11 -45
  229. package/clients/cli/commands/build.doc.mjs +12 -7
  230. package/clients/cli/commands/build.mjs +105 -67
  231. package/clients/cli/commands/build.text-fields.test.mjs +41 -0
  232. package/clients/cli/commands/component/index.mjs +1 -1
  233. package/clients/cli/commands/component-ownership.test.mjs +3 -3
  234. package/clients/cli/commands/component.doc.mjs +1 -1
  235. package/clients/cli/commands/discover.broken-integration.test.mjs +7 -8
  236. package/clients/cli/commands/discover.doc.mjs +1 -1
  237. package/clients/cli/commands/discover.mjs +1 -1
  238. package/clients/cli/commands/docs.doc.mjs +21 -9
  239. package/clients/cli/commands/docs.mjs +184 -70
  240. package/clients/cli/commands/docs.test.mjs +120 -16
  241. package/clients/cli/commands/doctor-integration-components.doc.mjs +1 -1
  242. package/clients/cli/commands/doctor-integration-docs.doc.mjs +3 -3
  243. package/clients/cli/commands/doctor-integration-templates.doc.mjs +15 -8
  244. package/clients/cli/commands/doctor-integration-validate.doc.mjs +1 -1
  245. package/clients/cli/commands/doctor-integration.doc.mjs +1 -1
  246. package/clients/cli/commands/doctor-integration.test.mjs +90 -8
  247. package/clients/cli/commands/doctor.doc.mjs +1 -1
  248. package/clients/cli/commands/doctor.mjs +53 -16
  249. package/clients/cli/commands/gap-report.doc.mjs +1 -1
  250. package/clients/cli/commands/hook.doc.mjs +1 -1
  251. package/clients/cli/commands/init.doc.mjs +1 -1
  252. package/clients/cli/commands/integration-add.controls.test.mjs +1 -1
  253. package/clients/cli/commands/integration-add.doc.mjs +11 -1
  254. package/clients/cli/commands/integration-pack.doc.mjs +1 -1
  255. package/clients/cli/commands/integration-real-world.test.mjs +3 -9
  256. package/clients/cli/commands/integration.doc.mjs +1 -1
  257. package/clients/cli/commands/integration.mjs +1 -0
  258. package/clients/cli/commands/layout-check.doc.mjs +1 -1
  259. package/clients/cli/commands/layout-expand.doc.mjs +1 -1
  260. package/clients/cli/commands/layout-grammar.doc.mjs +1 -1
  261. package/clients/cli/commands/layout.doc.mjs +1 -1
  262. package/clients/cli/commands/manifest.doc.mjs +1 -1
  263. package/clients/cli/commands/search.doc.mjs +1 -1
  264. package/clients/cli/commands/search.mjs +11 -2
  265. package/clients/cli/commands/setup-nudge.test.mjs +6 -0
  266. package/clients/cli/commands/swizzle.doc.mjs +1 -1
  267. package/clients/cli/commands/template.doc.mjs +24 -7
  268. package/clients/cli/commands/template.mjs +4 -91
  269. package/clients/cli/commands/text-json-parity.test.mjs +719 -0
  270. package/clients/cli/commands/theme-add.doc.mjs +2 -2
  271. package/clients/cli/commands/theme-build.doc.mjs +1 -1
  272. package/clients/cli/commands/theme-list.doc.mjs +2 -2
  273. package/clients/cli/commands/theme-palette-generate.doc.mjs +3 -3
  274. package/clients/cli/commands/theme-palette.doc.mjs +1 -1
  275. package/clients/cli/commands/theme-targets.behavior.test.mjs +4 -3
  276. package/clients/cli/commands/theme-targets.doc.mjs +1 -1
  277. package/clients/cli/commands/theme-template.doc.mjs +1 -1
  278. package/clients/cli/commands/theme.doc.mjs +1 -1
  279. package/clients/cli/commands/upgrade.doc.mjs +3 -2
  280. package/clients/cli/commands/upgrade.file-protection.test.mjs +228 -0
  281. package/clients/cli/commands/upgrade.mjs +29 -7
  282. package/clients/cli/formatters/index.mjs +2 -0
  283. package/clients/cli/formatters/index.test.mjs +6 -0
  284. package/clients/cli/index.mjs +8 -0
  285. package/clients/cli/lib/hook-format.mjs +14 -5
  286. package/clients/cli/lib/manifest.mjs +9 -2
  287. package/foundation/agent-docs/agent-docs.d.mts +3 -2
  288. package/foundation/agent-docs/agent-docs.mjs +13 -9
  289. package/foundation/agent-docs/agent-docs.test.mjs +19 -1
  290. package/foundation/config/project-themes.test.mjs +11 -19
  291. package/foundation/config/project.d.mts +20 -11
  292. package/foundation/config/project.mjs +123 -80
  293. package/foundation/config/project.test.mjs +144 -21
  294. package/foundation/discovery/authoring-self-docs.d.mts +18 -0
  295. package/foundation/discovery/authoring-self-docs.mjs +37 -15
  296. package/foundation/discovery/authoring-self-docs.test.mjs +25 -9
  297. package/foundation/discovery/authoring-surface.d.mts +74 -0
  298. package/foundation/discovery/authoring-surface.mjs +525 -0
  299. package/foundation/discovery/authoring-surface.test.mjs +392 -0
  300. package/foundation/discovery/cli-self-docs.d.mts +119 -0
  301. package/foundation/discovery/cli-self-docs.mjs +490 -0
  302. package/foundation/discovery/cli-self-docs.test.mjs +375 -0
  303. package/foundation/discovery/component-discovery.d.mts +38 -0
  304. package/foundation/discovery/component-discovery.mjs +48 -0
  305. package/foundation/discovery/component-loader.d.mts +35 -38
  306. package/foundation/discovery/component-loader.mjs +53 -222
  307. package/foundation/discovery/docs-discovery.d.mts +112 -11
  308. package/foundation/discovery/docs-discovery.mjs +231 -36
  309. package/foundation/discovery/docs-discovery.test.mjs +111 -32
  310. package/foundation/discovery/docs-output-budget.d.mts +2 -2
  311. package/foundation/discovery/docs-output-budget.mjs +1 -1
  312. package/foundation/discovery/docs-section-key.d.mts +28 -10
  313. package/foundation/discovery/docs-section-key.mjs +134 -33
  314. package/foundation/discovery/docs-section-key.test.mjs +41 -19
  315. package/foundation/discovery/template-adapter.d.mts +99 -6
  316. package/foundation/discovery/template-adapter.mjs +480 -57
  317. package/foundation/discovery/template-adapter.test.mjs +57 -0
  318. package/foundation/discovery/template-conflict-release.d.mts +13 -0
  319. package/foundation/discovery/template-conflict-release.mjs +40 -0
  320. package/foundation/discovery/template-conflict-release.test.mjs +40 -0
  321. package/foundation/discovery/theme-discovery.d.mts +67 -7
  322. package/foundation/discovery/theme-discovery.mjs +916 -186
  323. package/foundation/discovery/theme-discovery.test.mjs +613 -219
  324. package/foundation/doc-compiler/bundle.d.mts +47 -0
  325. package/foundation/doc-compiler/bundle.mjs +278 -0
  326. package/foundation/doc-compiler/bundle.test.mjs +266 -0
  327. package/foundation/doc-compiler/compile.d.mts +220 -39
  328. package/foundation/doc-compiler/compile.mjs +311 -15
  329. package/foundation/doc-compiler/diagnostics.d.mts +126 -0
  330. package/foundation/doc-compiler/diagnostics.mjs +305 -0
  331. package/foundation/doc-compiler/doc-compiler.test.mjs +28 -1
  332. package/foundation/doc-compiler/doc-loads.test.mjs +1642 -0
  333. package/foundation/doc-compiler/import.d.mts +24 -0
  334. package/foundation/doc-compiler/import.mjs +59 -0
  335. package/foundation/doc-compiler/inputs.d.mts +102 -0
  336. package/foundation/doc-compiler/inputs.mjs +291 -0
  337. package/foundation/doc-compiler/inputs.test.mjs +299 -0
  338. package/foundation/doc-compiler/ir.d.mts +13 -0
  339. package/foundation/doc-compiler/ir.mjs +196 -12
  340. package/foundation/doc-compiler/lenses.d.mts +8 -5
  341. package/foundation/doc-compiler/lenses.mjs +50 -4
  342. package/foundation/doc-compiler/links.d.mts +162 -0
  343. package/foundation/doc-compiler/links.mjs +294 -0
  344. package/foundation/doc-compiler/links.test.mjs +192 -0
  345. package/foundation/doc-compiler/lower-doc.test.mjs +495 -0
  346. package/foundation/doc-compiler/overlays.d.mts +37 -0
  347. package/foundation/doc-compiler/overlays.mjs +206 -0
  348. package/foundation/doc-compiler/parse-readable.d.mts +9 -0
  349. package/foundation/doc-compiler/parse-readable.mjs +29 -0
  350. package/foundation/doc-compiler/read.d.mts +127 -0
  351. package/foundation/doc-compiler/read.mjs +325 -0
  352. package/foundation/doc-compiler/read.test.mjs +313 -0
  353. package/foundation/doc-compiler/source.d.mts +33 -0
  354. package/foundation/doc-compiler/source.mjs +128 -0
  355. package/foundation/doc-compiler/tree.d.mts +288 -0
  356. package/foundation/doc-compiler/tree.mjs +876 -0
  357. package/foundation/doc-compiler/tree.test.mjs +598 -0
  358. package/foundation/fs/file-protection.d.mts +33 -0
  359. package/foundation/fs/file-protection.mjs +825 -0
  360. package/foundation/fs/file-protection.test.mjs +250 -0
  361. package/foundation/integrations/autolink.d.mts +58 -1
  362. package/foundation/integrations/autolink.mjs +143 -57
  363. package/foundation/integrations/autolink.test.mjs +1 -1
  364. package/foundation/integrations/cli-requirement.d.mts +45 -0
  365. package/foundation/integrations/cli-requirement.mjs +154 -0
  366. package/foundation/integrations/cli-requirement.test.mjs +84 -0
  367. package/foundation/integrations/contribution-fixes.d.mts +145 -0
  368. package/foundation/integrations/contribution-fixes.mjs +1284 -0
  369. package/foundation/integrations/contribution-inventory.d.mts +3 -2
  370. package/foundation/integrations/contribution-inventory.mjs +27 -24
  371. package/foundation/integrations/contribution-inventory.test.mjs +86 -27
  372. package/foundation/integrations/integration-warnings.d.mts +9 -2
  373. package/foundation/integrations/integration-warnings.mjs +51 -26
  374. package/foundation/integrations/integration-warnings.test.mjs +74 -1
  375. package/foundation/integrations/integrations.d.mts +3 -0
  376. package/foundation/integrations/integrations.mjs +11 -97
  377. package/foundation/integrations/provider-ledger.test.mjs +275 -0
  378. package/foundation/integrations/provider-resolution.d.mts +152 -0
  379. package/foundation/integrations/provider-resolution.mjs +576 -0
  380. package/foundation/integrations/provider-resolution.test.mjs +369 -0
  381. package/foundation/integrations/theme-descriptor.d.mts +8 -0
  382. package/foundation/integrations/theme-descriptor.mjs +44 -0
  383. package/foundation/integrations/validate-contributions.mjs +121 -29
  384. package/foundation/response/error-codes.d.mts +3 -1
  385. package/foundation/response/error-codes.d.ts +2 -0
  386. package/foundation/response/error-codes.doc.mjs +12 -2
  387. package/foundation/response/error-codes.mjs +7 -1
  388. package/foundation/response/error-codes.test.mjs +55 -11
  389. package/foundation/response/response-types.doc.d.mts +5 -1
  390. package/foundation/response/response-types.doc.mjs +20 -11
  391. package/foundation/response/response.doc.mjs +1 -1
  392. package/foundation/text/string-utils.d.mts +8 -0
  393. package/foundation/text/string-utils.mjs +40 -10
  394. package/foundation/xle/expand.mjs +1 -1
  395. package/foundation/xle/xle.test.mjs +13 -0
  396. package/package.json +10 -9
  397. package/assets/templates/themes/manifest.json +0 -95
@@ -9,25 +9,26 @@ export const doc = {
9
9
  type: 'function',
10
10
  kind: 'api',
11
11
  name: 'listThemes',
12
+ namespace: 'cli/api',
12
13
  displayName: 'listThemes()',
13
- summary: 'Read the CLI bundled-theme manifest.',
14
+ summary: 'Read the CLI bundled-theme descriptors.',
14
15
  description:
15
- 'Reads templates/themes/manifest.json and returns its raw entries synchronously. This low-level helper keeps its historical bundled-only contract; project-aware themeList() and themeAdd() also discover source themes from installed integrations.',
16
+ 'Reads the typed same-stem descriptors under templates/themes and returns normalized entries synchronously. This low-level helper keeps its historical bundled-only contract; project-aware themeList() and themeAdd() also discover source themes from installed integrations.',
16
17
  importPath: '@astryxdesign/cli/api',
17
18
  signature: 'listThemes(): BundledTheme[]',
18
- keywords: ['theme', 'themes', 'manifest', 'bundled', 'adapter', 'list'],
19
+ keywords: ['theme', 'themes', 'descriptor', 'bundled', 'adapter', 'list'],
19
20
  params: [],
20
21
  returns: [
21
22
  {
22
23
  type: 'BundledTheme[]',
23
24
  description:
24
- 'The bundled manifest entries: slug, displayName, description, maintained, entry, exportName, and files.',
25
+ 'The normalized bundled descriptor entries: slug, displayName, description, maintained, entry, exportName, and files.',
25
26
  },
26
27
  ],
27
28
  throws: [
28
29
  {
29
30
  code: 'ERR_NO_SOURCE',
30
- when: 'the bundled catalog is missing, invalid, or references missing source files',
31
+ when: 'the bundled descriptors are missing, invalid, or have missing source files',
31
32
  },
32
33
  ],
33
34
  examples: [
@@ -13,6 +13,7 @@ import {describe, it, expect, beforeEach, afterEach} from 'vitest';
13
13
  import * as fs from 'node:fs';
14
14
  import * as path from 'node:path';
15
15
  import * as os from 'node:os';
16
+ import {themeTemplate as publicThemeTemplate} from '../../index.mjs';
16
17
  import {themeTemplate, THEME_TEMPLATE_DEFAULT_PATH} from './template.mjs';
17
18
  import {isErrorCode} from '../../../foundation/response/error-codes.mjs';
18
19
 
@@ -25,6 +26,10 @@ afterEach(() => {
25
26
  });
26
27
 
27
28
  describe('themeTemplate()', () => {
29
+ it('is available through the public API entry point', () => {
30
+ expect(publicThemeTemplate).toBe(themeTemplate);
31
+ });
32
+
28
33
  it('writes the template and returns a theme.template receipt', () => {
29
34
  const res = themeTemplate({cwd: tmpDir});
30
35
 
@@ -9,10 +9,11 @@ export const doc = {
9
9
  type: 'function',
10
10
  kind: 'api',
11
11
  name: 'themeAdd',
12
+ namespace: 'cli/api',
12
13
  displayName: 'themeAdd()',
13
14
  summary: 'Copy an available theme into a project as editable source.',
14
15
  description:
15
- 'Resolves a theme from the CLI bundle or an installed integration and copies every catalog-listed source file into the consumer project. Writes are staged and existing files require explicit overwrite. Duplicate slugs fail closed until the caller selects an owner package.',
16
+ "Resolves a theme from the CLI bundle or an installed integration and copies it into the consumer project: a bundled theme's source files, or an integration theme's complete directory with its descriptor. Writes are staged and existing files require explicit overwrite. Duplicate slugs fail closed until the caller selects an owner package.",
16
17
  importPath: '@astryxdesign/cli/api',
17
18
  signature:
18
19
  'themeAdd(slug: string, options?: {targetPath?: string, overwrite?: boolean, cwd?: string, package?: string}): Promise<ThemeAddResponse>',
@@ -70,10 +71,10 @@ export const doc = {
70
71
  {code: 'ERR_AMBIGUOUS_THEME', when: 'more than one package owns the slug'},
71
72
  {
72
73
  code: 'ERR_THEME_INVALID',
73
- when: 'the selected installed package has a blocking integration or theme-catalog error',
74
+ when: 'the selected installed package has a blocking integration or theme-descriptor error',
74
75
  },
75
76
  {code: 'ERR_PATH_TRAVERSAL', when: 'the target path escapes cwd'},
76
- {code: 'ERR_NO_SOURCE', when: 'a catalog-listed source file is missing'},
77
+ {code: 'ERR_NO_SOURCE', when: 'a theme file to copy is missing'},
77
78
  {
78
79
  code: 'ERR_FILE_EXISTS',
79
80
  when: 'a destination exists and overwrite is not set',
@@ -12,6 +12,7 @@ export const doc = {
12
12
  type: 'function',
13
13
  kind: 'api',
14
14
  name: 'themeBuild',
15
+ namespace: 'cli/api',
15
16
  displayName: 'themeBuild()',
16
17
  summary: 'Compile a defineTheme file to CSS + JS + type declarations.',
17
18
  description:
@@ -9,10 +9,11 @@ export const doc = {
9
9
  type: 'function',
10
10
  kind: 'api',
11
11
  name: 'themeList',
12
+ namespace: 'cli/api',
12
13
  displayName: 'themeList()',
13
14
  summary: 'List themes bundled with this CLI build.',
14
15
  description:
15
- 'Projects the bundled-theme manifest into a synchronous theme.list envelope. This preserves the original programmatic API contract. The CLI command uses themeListAvailable() so installed integrations also appear.',
16
+ 'Projects the bundled typed theme descriptors into a synchronous theme.list envelope. This preserves the original programmatic API contract. The CLI command uses themeListAvailable() so installed integrations also appear.',
16
17
  importPath: '@astryxdesign/cli/api',
17
18
  signature: 'themeList(): ThemeListResponse',
18
19
  keywords: ['theme', 'list', 'themes', 'bundled', 'available'],
@@ -27,9 +28,11 @@ export const doc = {
27
28
  throws: [
28
29
  {
29
30
  code: 'ERR_NO_SOURCE',
30
- when: 'the bundled-theme manifest cannot be read or parsed',
31
+ when: 'the bundled theme descriptors cannot be read or parsed',
31
32
  },
32
33
  ],
33
- examples: [{label: 'List bundled themes', code: 'const {data} = themeList();'}],
34
+ examples: [
35
+ {label: 'List bundled themes', code: 'const {data} = themeList();'},
36
+ ],
34
37
  related: ['themeListAvailable', 'themeAdd', 'listThemes'],
35
38
  };
@@ -9,10 +9,11 @@ export const doc = {
9
9
  type: 'function',
10
10
  kind: 'api',
11
11
  name: 'themeListAvailable',
12
+ namespace: 'cli/api',
12
13
  displayName: 'themeListAvailable()',
13
14
  summary: 'List bundled and installed integration themes.',
14
15
  description:
15
- 'Loads Project for the requested directory, combines the CLI bundle with source themes from installed integrations, and projects each entry with its owner package. An unreadable project configuration degrades to the bundled catalog.',
16
+ 'Loads Project for the requested directory, combines the CLI bundle with source themes from installed integrations, and projects each entry with its owner package. An unreadable project configuration degrades to the bundled descriptors.',
16
17
  importPath: '@astryxdesign/cli/api',
17
18
  signature:
18
19
  'themeListAvailable(options?: {cwd?: string, package?: string}): Promise<ThemeListResponse>',
@@ -21,7 +22,8 @@ export const doc = {
21
22
  {
22
23
  name: 'options.cwd',
23
24
  type: 'string',
24
- description: 'Project directory whose installed integrations contribute themes.',
25
+ description:
26
+ 'Project directory whose installed integrations contribute themes.',
25
27
  },
26
28
  {
27
29
  name: 'options.package',
@@ -39,7 +41,7 @@ export const doc = {
39
41
  throws: [
40
42
  {
41
43
  code: 'ERR_NO_SOURCE',
42
- when: 'the CLI bundled-theme manifest cannot be read or parsed',
44
+ when: 'the CLI bundled-theme descriptors cannot be read or parsed',
43
45
  },
44
46
  ],
45
47
  examples: [
@@ -5,6 +5,7 @@ export const doc = {
5
5
  type: 'function',
6
6
  kind: 'api',
7
7
  name: 'themePaletteGenerate',
8
+ namespace: 'cli/api',
8
9
  displayName: 'themePaletteGenerate()',
9
10
  summary: 'Generate an author-reviewable palette candidate from JSON input.',
10
11
  description:
@@ -12,6 +12,7 @@ export const doc = {
12
12
  type: 'function',
13
13
  kind: 'api',
14
14
  name: 'themeTargets',
15
+ namespace: 'cli/api',
15
16
  displayName: 'themeTargets()',
16
17
  summary: 'List every component theming target a theme can override.',
17
18
  description:
@@ -12,6 +12,7 @@ export const doc = {
12
12
  type: 'function',
13
13
  kind: 'api',
14
14
  name: 'themeTemplate',
15
+ namespace: 'cli/api',
15
16
  displayName: 'themeTemplate()',
16
17
  summary: 'Write the annotated theme template into a project.',
17
18
  description:
@@ -23,7 +24,7 @@ export const doc = {
23
24
  '`overwrite`, so it is safe to re-run.',
24
25
  importPath: '@astryxdesign/cli/api',
25
26
  signature:
26
- 'themeTemplate(options?: {targetPath?: string, overwrite?: boolean, cwd?: string}): ThemeNewResponse',
27
+ 'themeTemplate(options?: {targetPath?: string, overwrite?: boolean, cwd?: string}): ThemeTemplateResponse',
27
28
  keywords: ['theme', 'template', 'starter', 'defineTheme', 'scaffold', 'reference', 'tokens'],
28
29
  params: [
29
30
  {
@@ -104,18 +104,27 @@ export function ensureCodemodDeps({ installDeps }?: {
104
104
  * Run the CORE registry codemods. Runs BEFORE the config is loaded so a core
105
105
  * CONFIG codemod can repair a config the strict loader would otherwise reject.
106
106
  * @param {CoreVersionManifest[]} versionManifests
107
- * @param {{apply: boolean, path: string, codemod?: string, skipCodemods: Set<string>}} options
107
+ * @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
108
108
  */
109
- export function runCoreCodemods(versionManifests: CoreVersionManifest[], { apply, path: srcPath, codemod, skipCodemods }: {
109
+ export function runCoreCodemods(versionManifests: CoreVersionManifest[], { apply, path: srcPath, codemod, skipCodemods, root, protection, silent }: {
110
110
  apply: boolean;
111
111
  path: string;
112
112
  codemod?: string;
113
113
  skipCodemods: Set<string>;
114
+ root?: string;
115
+ protection?: {
116
+ root: string;
117
+ classify: (file: string) => import("../../foundation/fs/file-protection.mjs").FileProtection[];
118
+ };
119
+ silent?: boolean;
114
120
  }): Promise<{
115
121
  totalFilesChanged: number;
116
122
  totalTransformsApplied: number;
117
123
  totalValidationBlocked: number;
124
+ changedFiles: string[];
118
125
  writtenFiles: string[];
126
+ stagedContents: Map<string, string>;
127
+ protectedFiles: import("../../authoring/codemod/type").CodemodRunResult["protectedFiles"];
119
128
  errors: Array<{
120
129
  file: string;
121
130
  codemod: string;
@@ -139,13 +148,21 @@ export function runCoreCodemods(versionManifests: CoreVersionManifest[], { apply
139
148
  /**
140
149
  * Load the consumer project's config + integrations. Throws on invalid config;
141
150
  * the run leaf decides between the config_fixable preview and a hard abort.
151
+ *
152
+ * Provider identity is resolved by the same resolver Project uses, on top of
153
+ * Project's ledger, under the codemod policy: a package that lists itself runs
154
+ * its installed copy's released codemods, never the work in progress being
155
+ * authored, and autolinked and local packages claim provider IDs without
156
+ * running codemods.
157
+ *
142
158
  * @param {string} cwd
143
159
  * @param {string[]} [extraIntegrationSpecs] explicit `--integration` specs
144
- * @returns {Promise<{postCodemodHooks: import('../../authoring/config/type').PostCodemodHook[], integrations: import('../../foundation/integrations/integrations.mjs').LoadedIntegration[]}>}
160
+ * @returns {Promise<{postCodemodHooks: import('../../authoring/config/type').PostCodemodHook[], integrations: import('../../foundation/integrations/integrations.mjs').LoadedIntegration[], ledger: import('../../foundation/integrations/provider-resolution.mjs').ProviderLedger}>}
145
161
  */
146
162
  export function loadProjectContext(cwd: string, extraIntegrationSpecs?: string[]): Promise<{
147
163
  postCodemodHooks: import("../../authoring/config/type").PostCodemodHook[];
148
164
  integrations: import("../../foundation/integrations/integrations.mjs").LoadedIntegration[];
165
+ ledger: import("../../foundation/integrations/provider-resolution.mjs").ProviderLedger;
149
166
  }>;
150
167
  /**
151
168
  * Non-blocking nudge for integration validation issues. Never throws (a broken
@@ -171,20 +188,30 @@ export function selectIntegrationCodemodsFor(integrations: Array<import("../../f
171
188
  /**
172
189
  * Run the file-based INTEGRATION codemods (config codemods first, then code).
173
190
  * @param {Array<{version: string, codemods: import('../../authoring/codemod/type').CodemodEntry[]}>} versionGroups
174
- * @param {{apply: boolean, path: string, codemod?: string, skipCodemods: Set<string>}} options
191
+ * @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
175
192
  */
176
193
  export function runIntegrationCodemodsStep(versionGroups: Array<{
177
194
  version: string;
178
195
  codemods: import("../../authoring/codemod/type").CodemodEntry[];
179
- }>, { apply, path: srcPath, codemod, skipCodemods }: {
196
+ }>, { apply, path: srcPath, codemod, skipCodemods, root, protection, contents, silent, }: {
180
197
  apply: boolean;
181
198
  path: string;
182
199
  codemod?: string;
183
200
  skipCodemods: Set<string>;
201
+ root?: string;
202
+ protection?: {
203
+ root: string;
204
+ classify: (file: string) => import("../../foundation/fs/file-protection.mjs").FileProtection[];
205
+ };
206
+ contents?: Map<string, string>;
207
+ silent?: boolean;
184
208
  }): Promise<{
185
209
  totalFilesChanged: number;
186
210
  totalTransformsApplied: number;
211
+ changedFiles: string[];
187
212
  writtenFiles: string[];
213
+ stagedContents: Map<string, string>;
214
+ protectedFiles: import("../../authoring/codemod/type").CodemodRunResult["protectedFiles"];
188
215
  errors: Array<{
189
216
  file: string;
190
217
  codemod: string;
@@ -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
 
@@ -291,7 +292,13 @@ export async function collectAllCodemods() {
291
292
  );
292
293
  for (const {version, transforms} of manifests) {
293
294
  for (const {name, meta, optional} of transforms) {
294
- 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
+ });
295
302
  }
296
303
  }
297
304
  return codemods;
@@ -322,33 +329,36 @@ export async function ensureCodemodDeps({installDeps} = {}) {
322
329
  * Run the CORE registry codemods. Runs BEFORE the config is loaded so a core
323
330
  * CONFIG codemod can repair a config the strict loader would otherwise reject.
324
331
  * @param {CoreVersionManifest[]} versionManifests
325
- * @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
326
333
  */
327
- 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
+ ) {
328
338
  return runCodemods(versionManifests, {
329
339
  apply,
330
340
  path: srcPath,
331
341
  codemod,
332
342
  skipCodemods,
333
- silent: logger.silent,
343
+ silent: silent ?? logger.silent,
344
+ root,
345
+ protection,
334
346
  });
335
347
  }
336
348
 
337
- /**
338
- * One installed package at one version; two specs that reach it share this.
339
- * @param {{name: string, version?: string}} integration
340
- * @returns {string}
341
- */
342
- function packageIdentity(integration) {
343
- return `${integration.name}\u0000${integration.version ?? ''}`;
344
- }
345
-
346
349
  /**
347
350
  * Load the consumer project's config + integrations. Throws on invalid config;
348
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
+ *
349
359
  * @param {string} cwd
350
360
  * @param {string[]} [extraIntegrationSpecs] explicit `--integration` specs
351
- * @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}>}
352
362
  */
353
363
  export async function loadProjectContext(cwd, extraIntegrationSpecs = []) {
354
364
  // The CLI debug preflight may already have imported this config before core
@@ -360,23 +370,38 @@ export async function loadProjectContext(cwd, extraIntegrationSpecs = []) {
360
370
  // Configured packages come from Project, which has already resolved provider
361
371
  // identity over configured, autolinked, and local packages. Loading them
362
372
  // again here would let upgrade run codemods from a package Project set aside.
363
- const configured = project.loadedIntegrations.filter(
364
- integration =>
365
- !integration.__autolinked && configuredSpecs.has(integration.__spec),
366
- );
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
+ });
367
389
  // A package that lists itself runs its installed copy's released codemods,
368
- // 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.
369
393
  const local = project.loadedIntegrations.find(
370
394
  integration => integration.__local,
371
395
  );
372
- const selfListed = local != null && configured.includes(local);
373
- if (local != null && selfListed && project.configPath) {
374
- const installed = await loadIntegrations([local.__spec], {
375
- cwd: path.dirname(project.configPath),
376
- resolveProviders: false,
377
- });
378
- configured.splice(configured.indexOf(local), 1, ...installed);
379
- }
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
+ : [];
380
405
  const extraSpecs = uniqueFiles(extraIntegrationSpecs ?? []).filter(
381
406
  spec => !configuredSpecs.has(spec),
382
407
  );
@@ -384,38 +409,23 @@ export async function loadProjectContext(cwd, extraIntegrationSpecs = []) {
384
409
  extraSpecs.length === 0
385
410
  ? []
386
411
  : await loadIntegrations(extraSpecs, {resolveProviders: false});
387
- // Naming the package being authored with --integration asks for its
388
- // installed copy too, so the local package must not claim against it.
389
- const localStandsIn =
390
- local != null &&
391
- (selfListed || extras.some(extra => extra.name === local.name));
392
- // Autolinked packages and the package being authored join the pass only as
393
- // claimants: every other command uses them for their provider IDs, but
394
- // upgrade has never run their codemods and still does not. An extra that
395
- // names one of them opts it in, so the extra stands in for that claimant.
396
- const extraIdentities = new Set(extras.map(packageIdentity));
397
- const claimantsOnly = project.loadedIntegrations.filter(
398
- integration =>
399
- (integration.__autolinked || (integration.__local && !localStandsIn)) &&
400
- !extraIdentities.has(packageIdentity(integration)),
401
- );
402
- const resolved = markProviderConflicts([
403
- ...configured,
404
- ...claimantsOnly,
405
- ...extras,
406
- ]);
407
- // Claimants leave by package directory, not object identity: the pass can
408
- // return one as a new conflict entry, and upgrade must not warn that a
409
- // package every other command uses contributes nothing.
410
- const claimantDirs = new Set(
411
- claimantsOnly.map(integration => integration.__packageDir),
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)},
412
427
  );
413
- const integrations = resolved.filter(
414
- integration =>
415
- integration.__packageDir == null ||
416
- !claimantDirs.has(integration.__packageDir),
417
- );
418
- return {postCodemodHooks, integrations};
428
+ return {postCodemodHooks, integrations, ledger};
419
429
  }
420
430
 
421
431
  /**
@@ -450,7 +460,10 @@ export async function selectIntegrationCodemodsFor(integrations, from, to) {
450
460
  try {
451
461
  const byVersion = await discoverIntegrationCodemods([integration]);
452
462
  for (const [version, rawList] of byVersion) {
453
- 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
+ );
454
467
  const existing = integrationCodemodsByVersion.get(version);
455
468
  if (existing) existing.push(...list);
456
469
  else integrationCodemodsByVersion.set(version, [...list]);
@@ -467,9 +480,21 @@ export async function selectIntegrationCodemodsFor(integrations, from, to) {
467
480
  /**
468
481
  * Run the file-based INTEGRATION codemods (config codemods first, then code).
469
482
  * @param {Array<{version: string, codemods: import('../../authoring/codemod/type').CodemodEntry[]}>} versionGroups
470
- * @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
471
484
  */
472
- 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
+ ) {
473
498
  const jscodeshift = (await import('jscodeshift')).default;
474
499
  return runIntegrationCodemods(versionGroups, {
475
500
  apply,
@@ -477,6 +502,9 @@ export async function runIntegrationCodemodsStep(versionGroups, {apply, path: sr
477
502
  codemod,
478
503
  skipCodemods,
479
504
  jscodeshift,
480
- silent: logger.silent,
505
+ silent: silent ?? logger.silent,
506
+ root,
507
+ protection,
508
+ contents,
481
509
  });
482
510
  }