@astryxdesign/cli 0.6.3 → 0.6.4-canary.078fd25

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
@@ -15,14 +15,16 @@
15
15
  * async). It does what loadConfig did — find the config sibling-of
16
16
  * package.json, import + validate it, load the configured integrations —
17
17
  * plus autolink the installed ones no config names, and self-resolve the
18
- * package being authored when it carries a manifest. Discovery is LAZY.
18
+ * package being authored when it carries a manifest. Provider identity is
19
+ * resolved once over all three (see integrations/provider-resolution), and
20
+ * the ledger is kept for {@link providerLedgerOf}. Discovery is LAZY.
19
21
  * - Discovery methods (components/templates/codemods/docs/themes) are MEMOIZED per
20
22
  * instance (via the pluggable cache) and orchestrate the EXISTING discovery
21
23
  * functions — Project never reimplements discovery.
22
- * - SKIP + WARN policy: as a discovery method runs, per-integration work is
23
- * guarded so one broken integration never throws out of discovery. Any
24
- * AstryxIntegrationIssue encountered is collected into a private set and
25
- * that integration's contributions are skipped.
24
+ * - SKIP + WARN policy: discovery records each integration issue. Other valid
25
+ * contribution kinds remain available; invalid template and component files
26
+ * do not hide valid siblings. A manifest load failure still withdraws the
27
+ * package because its roots cannot be trusted.
26
28
  * - `issues()` returns the deduped accumulated set, and (when called
27
29
  * directly) fills in validation for any configured integration not yet
28
30
  * visited by a discovery call, so it is always complete on demand.
@@ -38,8 +40,10 @@ import {parseConfig} from '../../authoring/config/parse.mjs';
38
40
  import {
39
41
  loadIntegrations,
40
42
  loadLocalIntegration,
43
+ resolvePackageDir,
41
44
  } from '../integrations/integrations.mjs';
42
- import {autolinkIntegrations} from '../integrations/autolink.mjs';
45
+ import {loadAutolinkCandidates} from '../integrations/autolink.mjs';
46
+ import {resolveProviders} from '../integrations/provider-resolution.mjs';
43
47
  import {
44
48
  setProject as setDebugProject,
45
49
  setEventHandler as setDebugEventHandler,
@@ -48,11 +52,13 @@ import {
48
52
  import {
49
53
  CORE_PACKAGE,
50
54
  discoverOwnedComponents,
51
- discoverIntegrationComponents,
55
+ discoverValidIntegrationComponents,
52
56
  } from '../discovery/component-discovery.mjs';
53
57
  import {findCoreDir} from '../fs/paths.mjs';
54
58
  import {
55
- discoverAll as discoverTemplates,
59
+ applyTemplateReplacements,
60
+ effectiveTemplateDiscovery,
61
+ discoverAllUnresolved as discoverTemplates,
56
62
  discoverIntegrationTemplatesForOne,
57
63
  } from '../discovery/template-adapter.mjs';
58
64
  import {
@@ -68,10 +74,7 @@ import {
68
74
  discoverIntegrationCodemods,
69
75
  selectIntegrationCodemods,
70
76
  } from '../../assets/codemods/integration-discovery.mjs';
71
- import {
72
- INVALID_AGENT_DOCS,
73
- validateLoadedIntegration,
74
- } from '../integrations/validate-contributions.mjs';
77
+ import {validateLoadedIntegration} from '../integrations/validate-contributions.mjs';
75
78
  import {
76
79
  InMemoryConfigCache,
77
80
  cacheKey,
@@ -94,6 +97,118 @@ function errorMessage(err) {
94
97
  return message == null ? String(err) : String(message);
95
98
  }
96
99
 
100
+ /**
101
+ * Load the configured integrations one at a time, so a package that cannot
102
+ * load at all (not installed, no manifest, more than one manifest, not a bare
103
+ * name) becomes that entry's load-error marker instead of failing the project.
104
+ * @param {string[]} specs
105
+ * @param {{cwd: string, fresh: boolean}} options
106
+ * @returns {Promise<import('../integrations/integrations.mjs').LoadedIntegration[]>}
107
+ */
108
+ async function loadConfiguredIntegrations(specs, {cwd, fresh}) {
109
+ /** @type {import('../integrations/integrations.mjs').LoadedIntegration[]} */
110
+ const loaded = [];
111
+ const seen = new Set();
112
+ for (const spec of specs) {
113
+ if (!spec || seen.has(spec)) continue;
114
+ seen.add(spec);
115
+ try {
116
+ loaded.push(
117
+ ...(await loadIntegrations([spec], {
118
+ cwd,
119
+ fresh,
120
+ resolveProviders: false,
121
+ })),
122
+ );
123
+ } catch (err) {
124
+ /** @type {string|undefined} */
125
+ let packageDir;
126
+ try {
127
+ packageDir = resolvePackageDir(spec, cwd);
128
+ } catch {
129
+ // Not a bare package name: there is no install location to record.
130
+ }
131
+ const pkg = packageDir ? readPackageJson(packageDir) : null;
132
+ loaded.push(
133
+ loadErrorMarker({
134
+ name: packageName(pkg) ?? spec,
135
+ version: pkg?.version,
136
+ spec,
137
+ packageDir,
138
+ err,
139
+ }),
140
+ );
141
+ }
142
+ }
143
+ return loaded;
144
+ }
145
+
146
+ /**
147
+ * Resolve the package being authored. Every failure, including an unreadable
148
+ * package.json or more than one manifest, becomes its load-error marker.
149
+ * @param {string} projectDir
150
+ * @param {boolean} fresh
151
+ * @returns {Promise<import('../integrations/integrations.mjs').LoadedIntegration|null>}
152
+ */
153
+ async function loadLocalIntegrationSafely(projectDir, fresh) {
154
+ try {
155
+ return await loadLocalIntegration(projectDir, {fresh});
156
+ } catch (err) {
157
+ const pkg = readPackageJson(projectDir);
158
+ const name = packageName(pkg) ?? '(local integration)';
159
+ return {
160
+ ...loadErrorMarker({
161
+ name,
162
+ version: pkg?.version,
163
+ spec: name,
164
+ packageDir: projectDir,
165
+ err,
166
+ }),
167
+ __local: true,
168
+ };
169
+ }
170
+ }
171
+
172
+ /**
173
+ * An inert entry for an integration that could not be loaded. It contributes
174
+ * nothing; Project reports its `__loadError` as the package's issue.
175
+ * @param {{name: string, version?: unknown, spec: string, packageDir?: string, err: unknown}} input
176
+ * @returns {import('../integrations/integrations.mjs').LoadedIntegration}
177
+ */
178
+ function loadErrorMarker({name, version, spec, packageDir, err}) {
179
+ return /** @type {import('../integrations/integrations.mjs').LoadedIntegration} */ ({
180
+ name,
181
+ ...(typeof version === 'string' ? {version} : {}),
182
+ __spec: spec,
183
+ ...(packageDir ? {__packageDir: packageDir} : {}),
184
+ __loadError: errorMessage(err),
185
+ });
186
+ }
187
+
188
+ /**
189
+ * @param {Record<string, unknown>|null} pkg
190
+ * @returns {string|undefined}
191
+ */
192
+ function packageName(pkg) {
193
+ const name = pkg?.name;
194
+ return typeof name === 'string' && name.length > 0 ? name : undefined;
195
+ }
196
+
197
+ /**
198
+ * @param {string} dir
199
+ * @returns {Record<string, unknown>|null}
200
+ */
201
+ function readPackageJson(dir) {
202
+ try {
203
+ const pkg = JSON.parse(
204
+ fs.readFileSync(path.join(dir, 'package.json'), 'utf-8'),
205
+ );
206
+ return pkg && typeof pkg === 'object' ? pkg : null;
207
+ } catch {
208
+ return null;
209
+ }
210
+ }
211
+
97
212
  /**
98
213
  * An integration issue tagged with the owner package. The base
99
214
  * {@link import('../integrations/issue').AstryxIntegrationIssue} fields plus the
@@ -146,13 +261,15 @@ function findPackageRoot(startDir) {
146
261
  *
147
262
  * This governs INHERITED handlers only. A project's own `debug` always runs.
148
263
  *
149
- * @param {string|null} configPath
264
+ * Read from the project root whether or not an astryx.config exists: an
265
+ * autolinked integration contributes a handler with no config at all.
266
+ *
267
+ * @param {string} projectDir directory holding the project's package.json
150
268
  * @returns {boolean}
151
269
  */
152
- function inheritsIntegrationDebug(configPath) {
153
- if (!configPath) return true;
270
+ function inheritsIntegrationDebug(projectDir) {
154
271
  try {
155
- const pkgPath = path.join(path.dirname(configPath), 'package.json');
272
+ const pkgPath = path.join(projectDir, 'package.json');
156
273
  const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
157
274
  return pkg?.astryx?.inheritDebug !== false;
158
275
  } catch {
@@ -181,6 +298,24 @@ export function findConfigPath(startDir = process.cwd()) {
181
298
  return present.length === 1 ? present[0] : null;
182
299
  }
183
300
 
301
+ /**
302
+ * The provider ledger each loaded Project resolved, kept off the class so it
303
+ * is not part of the Project API.
304
+ * @type {WeakMap<Project, import('../integrations/provider-resolution.mjs').ProviderLedger>}
305
+ */
306
+ const PROVIDER_LEDGERS = new WeakMap();
307
+
308
+ /**
309
+ * The provider ledger a Project resolved at load: one outcome for every
310
+ * package directory configured, autolinked, or authored. Internal: upgrade
311
+ * resolves on top of it, and tests account for every candidate with it.
312
+ * @param {Project} project
313
+ * @returns {import('../integrations/provider-resolution.mjs').ProviderLedger}
314
+ */
315
+ export function providerLedgerOf(project) {
316
+ return PROVIDER_LEDGERS.get(project) ?? new Map();
317
+ }
318
+
184
319
  /**
185
320
  * The single API for reading resolved project configuration. Construct via the
186
321
  * async {@link Project.load} factory.
@@ -203,12 +338,15 @@ export class Project {
203
338
  /** @type {ProjectIntegrationIssue[]} */
204
339
  #issues = [];
205
340
  /**
206
- * Package names of integrations whose issues have already been collected
207
- * (via a discovery method or a direct issues() validation), so issues() can
208
- * fill in only the ones not yet visited and never double-collect.
209
- * @type {Set<string>}
341
+ * Loaded integrations whose issues have already been collected (via a
342
+ * discovery method or a direct issues() validation), so issues() can fill in
343
+ * only the ones not yet visited and never double-collect. Keyed by entry, not
344
+ * label: two entries can share a package name (an alias at another version).
345
+ * @type {Set<object>}
210
346
  */
211
347
  #visitedIssues = new Set();
348
+ /** @type {Promise<Array<object>> | null} */
349
+ #templatesPromise = null;
212
350
 
213
351
  /**
214
352
  * @param {object} init
@@ -274,7 +412,8 @@ export class Project {
274
412
  fresh,
275
413
  });
276
414
  integrations = config.integrations ?? [];
277
- loadedIntegrations = await loadIntegrations(integrations, {
415
+ // Provider identity is resolved once, below, over the final set.
416
+ loadedIntegrations = await loadConfiguredIntegrations(integrations, {
278
417
  cwd: projectDir,
279
418
  fresh,
280
419
  });
@@ -284,31 +423,42 @@ export class Project {
284
423
  // This runs whether or not a config exists, because the projects it reaches
285
424
  // are overwhelmingly the ones with no astryx.config at all: a scaffold adds
286
425
  // the dependency and writes no config, and the integration then contributes
287
- // nothing for want of a line nobody knew to write. Appended AFTER the
426
+ // nothing for want of a line nobody knew to write. Resolved AFTER the
288
427
  // configured ones so an explicit entry keeps its position and its
289
428
  // precedence in every discovery order.
290
- loadedIntegrations = [
291
- ...loadedIntegrations,
292
- ...(await autolinkIntegrations({
293
- projectDir,
294
- loaded: loadedIntegrations,
295
- fresh,
296
- })),
297
- ];
429
+ const autolinked = await loadAutolinkCandidates({
430
+ projectDir,
431
+ loaded: loadedIntegrations,
432
+ fresh,
433
+ });
298
434
 
299
435
  // The package being authored is the one package that cannot install itself.
300
436
  // When it carries a manifest, resolve its working bytes directly so every
301
437
  // existing consumer command doubles as the author's preview. A local copy
302
438
  // replaces the same installed package in place, preserving configured
303
439
  // precedence while making the source being edited authoritative.
304
- const localIntegration = await loadLocalIntegration(projectDir, {fresh});
305
- if (localIntegration) {
306
- const existing = loadedIntegrations.findIndex(
307
- integration => integration.name === localIntegration.name,
308
- );
309
- if (existing === -1) loadedIntegrations.push(localIntegration);
310
- else loadedIntegrations[existing] = localIntegration;
311
- }
440
+ const localIntegration = await loadLocalIntegrationSafely(projectDir, fresh);
441
+
442
+ // Autolinked and local packages can claim a provider ID that a configured
443
+ // package already holds, so identity is resolved once over the final set.
444
+ const resolution = resolveProviders([
445
+ ...loadedIntegrations.map(integration => ({
446
+ source: /** @type {const} */ ('configured'),
447
+ integration,
448
+ spec: integration.__spec,
449
+ })),
450
+ ...autolinked,
451
+ ...(localIntegration
452
+ ? [
453
+ {
454
+ source: /** @type {const} */ ('local'),
455
+ integration: localIntegration,
456
+ spec: localIntegration.__spec,
457
+ },
458
+ ]
459
+ : []),
460
+ ]);
461
+ loadedIntegrations = resolution.integrations;
312
462
 
313
463
  // The debug recorder resolves its settings synchronously, long before any
314
464
  // command gets here, so this is where a project's `debug` block gets a
@@ -327,7 +477,7 @@ export class Project {
327
477
  // because Project.load can run more than once in a process and appending
328
478
  // would deliver twice.
329
479
  setDebugIntegrationEventHandlers(
330
- inheritsIntegrationDebug(configPath)
480
+ inheritsIntegrationDebug(projectDir)
331
481
  ? loadedIntegrations.map(integration => integration.__debug)
332
482
  : [],
333
483
  );
@@ -339,7 +489,7 @@ export class Project {
339
489
  // Never let recording break config loading.
340
490
  }
341
491
 
342
- return new Project({
492
+ const project = new Project({
343
493
  cwd,
344
494
  configPath,
345
495
  config,
@@ -348,6 +498,8 @@ export class Project {
348
498
  cache: resolvedCache,
349
499
  hash,
350
500
  });
501
+ PROVIDER_LEDGERS.set(project, resolution.ledger);
502
+ return project;
351
503
  }
352
504
 
353
505
  /**
@@ -436,25 +588,16 @@ export class Project {
436
588
  * @returns {string}
437
589
  */
438
590
  #pkgLabel(integration) {
591
+ // A set-aside package is labelled name@version, so its issue never reads as
592
+ // the winner's, even when both share a package name.
593
+ if (integration?.__providerConflict) {
594
+ return integration.version
595
+ ? `${integration.name}@${integration.version}`
596
+ : (integration.__spec ?? integration.name);
597
+ }
439
598
  return integration?.name ?? integration?.__spec ?? '(integration)';
440
599
  }
441
600
 
442
- /**
443
- * Whether this package has an error that invalidates its regular manifest
444
- * contributions. Invalid `agentDocs` blocks agent-doc writes only; it must not
445
- * withdraw components, templates, docs, or codemods.
446
- * @param {string} pkg
447
- * @returns {boolean}
448
- */
449
- #hasBlockingContributionIssue(pkg) {
450
- return this.#issues.some(
451
- issue =>
452
- issue.package === pkg &&
453
- issue.severity === 'error' &&
454
- issue.code !== INVALID_AGENT_DOCS,
455
- );
456
- }
457
-
458
601
  /**
459
602
  * Validate one loaded integration and collect any issues. Marks the
460
603
  * integration visited so issues() won't redo the work. Best-effort: a
@@ -463,8 +606,8 @@ export class Project {
463
606
  */
464
607
  async #collectIssues(integration) {
465
608
  const pkg = this.#pkgLabel(integration);
466
- if (this.#visitedIssues.has(pkg)) return;
467
- this.#visitedIssues.add(pkg);
609
+ if (this.#visitedIssues.has(integration)) return;
610
+ this.#visitedIssues.add(integration);
468
611
  // A manifest that failed to load (throwing import / invalid shape) is
469
612
  // recorded as a marker by loadIntegrations — surface it as an issue and
470
613
  // skip validation (there's no manifest to validate).
@@ -491,9 +634,9 @@ export class Project {
491
634
  /**
492
635
  * Core + integration component ownership records. Wraps
493
636
  * discoverOwnedComponents for core and discoverIntegrationComponents (via
494
- * discoverOwnedComponents) for integrations, but applies the skip+warn
495
- * policy per integration: a broken integration's components are skipped and
496
- * its issues collected, never thrown. Memoized per instance.
637
+ * discoverOwnedComponents) for integrations. Invalid component records are
638
+ * omitted and reported; valid component siblings and other contribution kinds
639
+ * remain available. Memoized per instance.
497
640
  *
498
641
  * @returns {Promise<Array<{name: string, package: string, group: string|null, docPath: string|null, sourcePath: string|null, issuesUrl: string|undefined}>>}
499
642
  */
@@ -513,18 +656,17 @@ export class Project {
513
656
  }
514
657
  }
515
658
 
516
- // Each integration in isolation so one broken integration is skipped.
659
+ // Each integration is discovered independently. Invalid records are
660
+ // omitted below without hiding valid siblings or other contribution kinds.
517
661
  for (const integration of this.#loadedIntegrations) {
518
662
  await this.#collectIssues(integration);
519
663
  const pkg = this.#pkgLabel(integration);
520
- if (this.#hasBlockingContributionIssue(pkg)) continue;
521
664
  try {
522
- // discoverOwnedComponents owns the core+integration record shape;
523
- // here we add only this integration's records (core is handled
524
- // above) so a single broken integration can be skipped in isolation.
525
- for (const rec of discoverIntegrationComponents(integration)) {
526
- records.push(rec);
527
- }
665
+ // #collectIssues (above) already reported each withdrawn record,
666
+ // with its fix, through the same discovery.
667
+ const {components} =
668
+ await discoverValidIntegrationComponents(integration);
669
+ records.push(...components);
528
670
  } catch (err) {
529
671
  this.#pushIssue(pkg, {
530
672
  code: 'invalid_component',
@@ -539,17 +681,21 @@ export class Project {
539
681
  }
540
682
 
541
683
  /**
542
- * Core + integration templates, type-tagged. Wraps discoverTemplates (core +
543
- * external blocks) and discoverIntegrationTemplatesForOne per integration so
544
- * a broken integration's templates are skipped and its issues collected.
545
- * Memoized per instance.
684
+ * Core + integration templates, type-tagged, with valid integration
685
+ * replacements projected over their Core targets. Wraps raw template discovery
686
+ * (Core + external blocks) and discoverIntegrationTemplatesForOne per integration
687
+ * so unusable template files are reported and omitted while valid siblings
688
+ * remain available. Memoized per instance.
546
689
  *
547
690
  * @returns {Promise<Array<object>>}
548
691
  */
549
692
  async templates() {
550
- return this.#memo('templates', async () => {
693
+ if (this.#templatesPromise) return this.#templatesPromise;
694
+ this.#templatesPromise = (async () => {
551
695
  /** @type {any[]} */
552
696
  const templates = [];
697
+ /** @type {import('../discovery/template-adapter.mjs').TemplateDiscoveryError[]} */
698
+ const replacementErrors = [];
553
699
 
554
700
  // Core + external-package templates (discoverTemplates internally also
555
701
  // loads integration templates via loadConfig today; we intentionally
@@ -570,20 +716,24 @@ export class Project {
570
716
  for (const integration of this.#loadedIntegrations) {
571
717
  await this.#collectIssues(integration);
572
718
  const pkg = this.#pkgLabel(integration);
573
- if (this.#hasBlockingContributionIssue(pkg)) continue;
719
+ // Template discovery already isolates invalid template files and returns
720
+ // every valid sibling. Do not withdraw templates because another
721
+ // contribution kind in this package is broken.
574
722
  try {
575
723
  const {templates: ts, errors} =
576
724
  await discoverIntegrationTemplatesForOne(integration);
577
725
  for (const e of errors) {
578
726
  this.#pushIssue(pkg, {
579
- code: 'invalid_template',
580
- severity: 'error',
727
+ code: e.code ?? 'invalid_template',
728
+ severity: e.severity ?? 'error',
581
729
  message: e.message,
582
730
  });
731
+ if (e.replacementTarget != null) replacementErrors.push(e);
583
732
  }
584
- // Only contribute templates when the integration had no per-template
585
- // errors (skip the whole integration's templates on any error).
586
- if (errors.length === 0) templates.push(...ts);
733
+ // Discovery already omits each unusable template from `ts`. Keep all
734
+ // valid siblings, while the collected errors remain visible through
735
+ // issues() and replacement errors disable only their own targets.
736
+ templates.push(...ts);
587
737
  } catch (err) {
588
738
  this.#pushIssue(pkg, {
589
739
  code: 'invalid_template',
@@ -593,15 +743,24 @@ export class Project {
593
743
  }
594
744
  }
595
745
 
596
- return templates.sort((a, b) => a.name.localeCompare(b.name));
597
- });
746
+ const resolved = applyTemplateReplacements(templates, replacementErrors);
747
+ for (const error of resolved.errors) {
748
+ this.#pushIssue(error.package, {
749
+ code: error.code,
750
+ severity: error.severity,
751
+ message: error.message,
752
+ });
753
+ }
754
+ return effectiveTemplateDiscovery(resolved.templates);
755
+ })();
756
+ return this.#templatesPromise;
598
757
  }
599
758
 
600
759
  /**
601
760
  * Bundled source themes plus themes contributed by installed integrations.
602
761
  * Each record keeps its package owner and source directory so callers can
603
- * both list and copy it without reconstructing paths. A broken integration's
604
- * themes are skipped under the same issue policy as every other kind.
762
+ * both list and copy it without reconstructing paths. A broken theme
763
+ * contribution is reported without hiding the package's other valid kinds.
605
764
  *
606
765
  * @returns {Promise<import('../discovery/theme-discovery.mjs').DiscoveredTheme[]>}
607
766
  */
@@ -612,7 +771,6 @@ export class Project {
612
771
  for (const integration of this.#loadedIntegrations) {
613
772
  await this.#collectIssues(integration);
614
773
  const pkg = this.#pkgLabel(integration);
615
- if (this.#hasBlockingContributionIssue(pkg)) continue;
616
774
  if (!integration?.themes) continue;
617
775
  try {
618
776
  themes.push(...(await discoverIntegrationThemes(integration)));
@@ -646,14 +804,16 @@ export class Project {
646
804
  async docs() {
647
805
  return this.#memo('docs', async () => {
648
806
  const catalog = DocsCatalog.fromBuiltins();
807
+ let rank = 0;
649
808
 
650
809
  for (const integration of this.#loadedIntegrations) {
810
+ rank += 1;
651
811
  await this.#collectIssues(integration);
652
812
  const pkg = this.#pkgLabel(integration);
653
- if (this.#hasBlockingContributionIssue(pkg)) continue;
654
813
  if (!integration?.docs) continue;
655
814
  try {
656
- const {records, errors} = await discoverIntegrationDocs(integration);
815
+ const {records, errors, namespaces, guides} =
816
+ await discoverIntegrationDocs(integration);
657
817
  for (const e of errors) {
658
818
  this.#pushIssue(pkg, {
659
819
  code: 'invalid_doc',
@@ -665,11 +825,20 @@ export class Project {
665
825
  // how a bad template withdraws its package's templates: a partial
666
826
  // docs contribution is the state where a `replaces` silently does
667
827
  // nothing and a reader gets the topic it was meant to replace.
668
- if (errors.length > 0) continue;
828
+ if (errors.length > 0) {
829
+ for (const e of errors) {
830
+ catalog.addIssue({package: integration.name ?? pkg, message: e.message});
831
+ }
832
+ continue;
833
+ }
669
834
  for (const record of records) {
670
835
  const issue = catalog.add(record);
671
836
  if (issue) this.#pushIssue(pkg, issue);
672
837
  }
838
+ catalog.addTreeInputs({
839
+ namespaces: namespaces.map(input => ({...input, rank})),
840
+ guides: guides.map(input => ({...input, rank})),
841
+ });
673
842
  } catch (err) {
674
843
  this.#pushIssue(pkg, {
675
844
  code: 'invalid_doc',
@@ -686,8 +855,8 @@ export class Project {
686
855
  /**
687
856
  * Core registry transforms + integration codemods for an upgrade range.
688
857
  * Wraps getTransformsBetween (core) and discoverIntegrationCodemods /
689
- * selectIntegrationCodemods (integrations). A broken integration's codemods
690
- * are skipped (issue collected) rather than failing the whole resolution.
858
+ * selectIntegrationCodemods (integrations). An invalid codemod contribution
859
+ * is reported and omitted without hiding other valid contribution kinds.
691
860
  * Memoized per (from, to) key.
692
861
  *
693
862
  * @param {string} fromVersion exclusive lower bound
@@ -705,7 +874,6 @@ export class Project {
705
874
  for (const integration of this.#loadedIntegrations) {
706
875
  await this.#collectIssues(integration);
707
876
  const pkg = this.#pkgLabel(integration);
708
- if (this.#hasBlockingContributionIssue(pkg)) continue;
709
877
  if (!integration?.codemods) continue;
710
878
  try {
711
879
  // Validate this integration's codemods discover cleanly in
@@ -760,6 +928,10 @@ export class Project {
760
928
  * @returns {Promise<ProjectIntegrationIssue[]>}
761
929
  */
762
930
  async issues() {
931
+ // Template replacement validity depends on the combined Core + integration
932
+ // catalog. Resolve it first so issue results never depend on which discovery
933
+ // method the caller happened to invoke earlier.
934
+ await this.templates();
763
935
  for (const integration of this.#loadedIntegrations) {
764
936
  await this.#collectIssues(integration);
765
937
  }