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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (612) hide show
  1. package/README.md +117 -79
  2. package/api/blog/blog.doc.mjs +1 -0
  3. package/api/build/_adapter.d.mts +50 -0
  4. package/api/build/_adapter.mjs +60 -0
  5. package/api/build/build.doc.mjs +16 -9
  6. package/api/build/build.test.mjs +197 -8
  7. package/api/build/build.type.d.mts +91 -2
  8. package/api/build/build.type.mjs +52 -8
  9. package/api/build/help/help.d.mts +12 -5
  10. package/api/build/help/help.mjs +69 -6
  11. package/api/build/kit/kit.d.mts +4 -1
  12. package/api/build/kit/kit.mjs +165 -49
  13. package/api/build/kit/rank.d.mts +44 -0
  14. package/api/build/kit/rank.mjs +432 -0
  15. package/api/build/kit/rank.test.mjs +196 -0
  16. package/api/component/_adapter.d.mts +6 -12
  17. package/api/component/_adapter.mjs +20 -10
  18. package/api/component/component.doc.mjs +13 -3
  19. package/api/component/component.mjs +91 -14
  20. package/api/component/component.test.mjs +38 -0
  21. package/api/component/component.type.d.mts +22 -11
  22. package/api/component/component.type.mjs +32 -24
  23. package/api/component/detail/blocks/blocks.d.mts +2 -1
  24. package/api/component/detail/blocks/blocks.mjs +4 -3
  25. package/api/component/list/list.d.mts +0 -5
  26. package/api/component/list/list.mjs +40 -11
  27. package/api/discover/_adapter.d.mts +114 -6
  28. package/api/discover/_adapter.mjs +372 -17
  29. package/api/discover/_adapter.test.mjs +215 -0
  30. package/api/discover/_catalog-view.d.mts +115 -0
  31. package/api/discover/_catalog-view.mjs +203 -0
  32. package/api/discover/_catalog-view.test.mjs +128 -0
  33. package/api/discover/detail/detail.d.mts +18 -6
  34. package/api/discover/detail/detail.mjs +67 -13
  35. package/api/discover/detail/detail.test.mjs +85 -0
  36. package/api/discover/detail/item/item.d.mts +26 -0
  37. package/api/discover/detail/item/item.mjs +78 -0
  38. package/api/discover/detail/item/item.test.mjs +73 -0
  39. package/api/discover/discover.d.mts +3 -9
  40. package/api/discover/discover.doc.mjs +62 -18
  41. package/api/discover/discover.mjs +220 -36
  42. package/api/discover/discover.test.mjs +11 -2
  43. package/api/discover/discover.type.d.mts +150 -11
  44. package/api/discover/discover.type.mjs +107 -17
  45. package/api/discover/list/list.d.mts +20 -6
  46. package/api/discover/list/list.mjs +45 -12
  47. package/api/discover/list/list.test.mjs +46 -0
  48. package/api/discover/search/search.d.mts +18 -16
  49. package/api/discover/search/search.mjs +102 -56
  50. package/api/discover/search/search.test.mjs +144 -10
  51. package/api/docs/_adapter.d.mts +268 -47
  52. package/api/docs/_adapter.mjs +970 -149
  53. package/api/docs/compiled-topics.test.mjs +78 -0
  54. package/api/docs/detail/detail.d.mts +0 -15
  55. package/api/docs/detail/detail.mjs +22 -78
  56. package/api/docs/detail/section/section.mjs +39 -24
  57. package/api/docs/detail/section/section.test.mjs +19 -9
  58. package/api/docs/docs.d.mts +5 -3
  59. package/api/docs/docs.doc.mjs +39 -17
  60. package/api/docs/docs.mjs +44 -8
  61. package/api/docs/docs.test.mjs +158 -4
  62. package/api/docs/docs.type.d.mts +185 -6
  63. package/api/docs/docs.type.mjs +127 -13
  64. package/api/docs/index/index.mjs +15 -6
  65. package/api/docs/index/index.test.mjs +1 -1
  66. package/api/docs/integration-tree.test.mjs +555 -0
  67. package/api/docs/integrationDocs.test.mjs +14 -14
  68. package/api/docs/list/list.mjs +28 -12
  69. package/api/docs/node/node.d.mts +43 -0
  70. package/api/docs/node/node.mjs +192 -0
  71. package/api/docs/reference-blocks.test.mjs +406 -0
  72. package/api/doctor/doctor.d.mts +54 -4
  73. package/api/doctor/doctor.doc.mjs +1 -0
  74. package/api/doctor/doctor.mjs +332 -21
  75. package/api/doctor/doctor.test.mjs +420 -7
  76. package/api/gap-report/gap-report.doc.mjs +8 -4
  77. package/api/hook/_adapter.mjs +19 -5
  78. package/api/hook/hook.doc.mjs +1 -0
  79. package/api/hook/hook.type.d.mts +3 -3
  80. package/api/hook/hook.type.mjs +11 -11
  81. package/api/hook/list/list.d.mts +1 -1
  82. package/api/hook/list/list.mjs +69 -17
  83. package/api/index.d.mts +1 -1
  84. package/api/index.mjs +1 -0
  85. package/api/init/init.doc.mjs +6 -1
  86. package/api/init/init.test.mjs +41 -1
  87. package/api/init/remove/remove.mjs +1 -1
  88. package/api/init/run/run.mjs +20 -10
  89. package/api/integration/add-contribution.component-names.test.mjs +120 -0
  90. package/api/integration/add-contribution.d.mts +2 -1
  91. package/api/integration/add-contribution.mjs +130 -15
  92. package/api/integration/add-contribution.test.mjs +258 -7
  93. package/api/integration/add-helpers.d.mts +5 -2
  94. package/api/integration/add-helpers.mjs +36 -9
  95. package/api/integration/add-theme.mjs +34 -64
  96. package/api/integration/add-theme.test.mjs +105 -21
  97. package/api/integration/authoring-checks.mjs +138 -28
  98. package/api/integration/authoring-checks.test.mjs +179 -7
  99. package/api/integration/authoring-checks.type.mjs +6 -1
  100. package/api/integration/integration-authoring.type.d.mts +2 -0
  101. package/api/integration/integration-authoring.type.mjs +2 -0
  102. package/api/integration/integration-block-exports.test.mjs +10 -6
  103. package/api/integration/integrationAdd.doc.mjs +14 -4
  104. package/api/integration/integrationAddAgentDoc.doc.mjs +1 -0
  105. package/api/integration/integrationAddCodemod.doc.mjs +1 -0
  106. package/api/integration/integrationAddComponent.doc.mjs +2 -1
  107. package/api/integration/integrationAddDoc.doc.mjs +8 -1
  108. package/api/integration/integrationAddTemplate.doc.mjs +1 -0
  109. package/api/integration/integrationAddTheme.doc.mjs +6 -5
  110. package/api/integration/integrationComponentConflicts.doc.mjs +1 -0
  111. package/api/integration/integrationDocConflicts.doc.mjs +2 -1
  112. package/api/integration/integrationPackCheck.doc.mjs +2 -1
  113. package/api/integration/integrationTemplateConflicts.doc.d.mts +3 -0
  114. package/api/integration/integrationTemplateConflicts.doc.mjs +4 -0
  115. package/api/integration/pack-check.mjs +83 -7
  116. package/api/integration/pack-check.test.mjs +387 -47
  117. package/api/integration/pack-check.type.d.mts +26 -2
  118. package/api/integration/pack-check.type.mjs +14 -1
  119. package/api/integration/summarizeIssues.doc.mjs +1 -0
  120. package/api/integration/template-conflict-compatibility.test.mjs +73 -0
  121. package/api/integration/validate-integration-fixes.test.mjs +1389 -0
  122. package/api/integration/validate-integration.mjs +52 -102
  123. package/api/integration/validate-integration.test.mjs +179 -26
  124. package/api/integration/validate-unread-theme-folders.test.mjs +110 -0
  125. package/api/integration/validateIntegration.doc.mjs +3 -2
  126. package/api/json/assertResponse.doc.mjs +1 -0
  127. package/api/json/envelope-types.test.mjs +76 -0
  128. package/api/json/index.ts +2 -0
  129. package/api/json/isError.doc.mjs +1 -0
  130. package/api/json/parseResponse.doc.mjs +3 -2
  131. package/api/layout/_adapter.mjs +20 -5
  132. package/api/layout/expand/expand.mjs +7 -5
  133. package/api/layout/expand/expand.path-safety.test.mjs +53 -0
  134. package/api/layout/grammar/grammar.mjs +2 -1
  135. package/api/layout/layoutCheck.doc.mjs +1 -0
  136. package/api/layout/layoutExpand.doc.mjs +2 -1
  137. package/api/layout/layoutGrammar.doc.mjs +1 -0
  138. package/api/search/search-return-type.test.mjs +54 -0
  139. package/api/search/search.d.mts +61 -10
  140. package/api/search/search.doc.mjs +8 -2
  141. package/api/search/search.mjs +471 -83
  142. package/api/search/search.test.mjs +124 -1
  143. package/api/search/search.type.d.mts +14 -2
  144. package/api/search/search.type.mjs +5 -2
  145. package/api/swizzle/copy/copy.mjs +28 -11
  146. package/api/swizzle/swizzle.doc.mjs +2 -1
  147. package/api/swizzle/swizzle.type.d.mts +2 -2
  148. package/api/swizzle/swizzle.type.mjs +2 -2
  149. package/api/template/copy/copy.mjs +17 -23
  150. package/api/template/copy/copy.test.mjs +17 -0
  151. package/api/template/list/list.mjs +1 -0
  152. package/api/template/table-floating-bulk-actions.test.mjs +66 -0
  153. package/api/template/template-integration.test.mjs +1072 -3
  154. package/api/template/template-suffix.test.mjs +41 -21
  155. package/api/template/template.doc.mjs +30 -8
  156. package/api/template/template.mjs +45 -8
  157. package/api/template/template.type.d.mts +11 -13
  158. package/api/template/template.type.mjs +15 -14
  159. package/api/theme/_adapter.d.mts +2 -3
  160. package/api/theme/_adapter.mjs +4 -5
  161. package/api/theme/add/add.binary.test.mjs +84 -0
  162. package/api/theme/add/add.mjs +31 -22
  163. package/api/theme/add/add.rollback.test.mjs +158 -0
  164. package/api/theme/add/add.staging.test.mjs +83 -0
  165. package/api/theme/add/add.test.mjs +14 -1
  166. package/api/theme/build/build.family.test.mjs +7 -12
  167. package/api/theme/build/build.mjs +140 -59
  168. package/api/theme/build/build.public-component-vars.test.mjs +1 -1
  169. package/api/theme/build/build.receipt-doc.test.mjs +111 -0
  170. package/api/theme/build/build.rollback.test.mjs +148 -0
  171. package/api/theme/build/build.test.mjs +127 -0
  172. package/api/theme/build/font-warning.mjs +3 -3
  173. package/api/theme/build/font-warning.test.mjs +5 -2
  174. package/api/theme/generateTonalPalette.doc.mjs +1 -0
  175. package/api/theme/integration-themes.test.mjs +39 -28
  176. package/api/theme/list/list.test.mjs +19 -20
  177. package/api/theme/listThemes.doc.mjs +6 -5
  178. package/api/theme/palette/generate/generate.mjs +8 -3
  179. package/api/theme/palette/generate/generate.test.mjs +96 -0
  180. package/api/theme/palette/generate/generator.d.mts +10 -13
  181. package/api/theme/palette/generate/generator.mjs +15 -4
  182. package/api/theme/palette/generate/generator.test.mjs +10 -0
  183. package/api/theme/template/template.mjs +11 -2
  184. package/api/theme/template/template.test.mjs +20 -0
  185. package/api/theme/theme.type.d.mts +170 -11
  186. package/api/theme/theme.type.mjs +94 -27
  187. package/api/theme/themeAdd.doc.mjs +4 -3
  188. package/api/theme/themeBuild.doc.mjs +8 -4
  189. package/api/theme/themeList.doc.mjs +6 -3
  190. package/api/theme/themeListAvailable.doc.mjs +5 -3
  191. package/api/theme/themePaletteGenerate.doc.mjs +1 -0
  192. package/api/theme/themeTargets.doc.mjs +1 -0
  193. package/api/theme/themeTemplate.doc.mjs +6 -2
  194. package/api/upgrade/_adapter.d.mts +32 -5
  195. package/api/upgrade/_adapter.mjs +124 -73
  196. package/api/upgrade/list/list.mjs +2 -1
  197. package/api/upgrade/list/list.test.mjs +73 -0
  198. package/api/upgrade/provider-agreement.test.mjs +152 -0
  199. package/api/upgrade/run/run.mjs +356 -59
  200. package/api/upgrade/status/status.mjs +2 -2
  201. package/api/upgrade/upgrade.doc.mjs +8 -2
  202. package/api/upgrade/upgrade.type.d.mts +42 -4
  203. package/api/upgrade/upgrade.type.mjs +26 -10
  204. package/assets/codemods/__tests__/runner.test.mjs +330 -8
  205. package/assets/codemods/integration-discovery.mjs +48 -4
  206. package/assets/codemods/integration-discovery.test.mjs +73 -0
  207. package/assets/codemods/integration-runner.mjs +56 -4
  208. package/assets/codemods/integration-runner.protection.test.mjs +153 -0
  209. package/assets/codemods/run-codemod.mjs +177 -34
  210. package/assets/codemods/runner.mjs +350 -102
  211. package/assets/codemods/term-log.mjs +32 -8
  212. package/assets/codemods/term-log.test.mjs +19 -1
  213. package/assets/codemods/transform-prop.mjs +109 -0
  214. package/assets/codemods/transform-prop.test.mjs +95 -0
  215. package/assets/codemods/transforms/next/__tests__/migrate-native-picker-to-presentation.test.mjs +63 -0
  216. package/assets/codemods/transforms/next/__tests__/migrate-theme-catalog-to-descriptors.test.mjs +220 -0
  217. package/assets/codemods/transforms/next/index.mjs +19 -1
  218. package/assets/codemods/transforms/next/migrate-native-picker-to-presentation.mjs +148 -0
  219. package/assets/codemods/transforms/next/migrate-theme-catalog-to-descriptors.mjs +141 -0
  220. package/assets/codemods/transforms/v0.0.14/__tests__/rename-status-variants.test.mjs +86 -165
  221. package/assets/codemods/transforms/v0.0.14/rename-status-variants.mjs +72 -210
  222. package/assets/codemods/transforms/v0.1.8/__tests__/rename-avatar-size-scale.test.mjs +83 -115
  223. package/assets/codemods/transforms/v0.1.8/rename-avatar-size-scale.mjs +57 -186
  224. package/assets/codemods/transforms/v0.3.0/__tests__/unwrap-authoring-factories.test.mjs +27 -5
  225. package/assets/codemods/transforms/v0.3.0/unwrap-authoring-factories.mjs +20 -5
  226. package/assets/codemods/transforms/v0.6.0/__tests__/next-codemods.test.mjs +47 -0
  227. package/assets/codemods/transforms/v0.6.0/rename-resizable-pixel-bounds.mjs +57 -10
  228. package/assets/docs/getting-started.doc.mjs +2 -2
  229. package/assets/docs/internationalization.doc.mjs +7 -5
  230. package/assets/docs/layout.doc.dense.mjs +2 -2
  231. package/assets/docs/layout.doc.mjs +1 -1
  232. package/assets/docs/principles.doc.mjs +6 -6
  233. package/assets/docs/styling-libraries.doc.mjs +4 -4
  234. package/assets/docs/styling.doc.mjs +4 -4
  235. package/assets/docs/theme.doc.mjs +5 -5
  236. package/assets/docs/tokens.doc.mjs +1 -1
  237. package/assets/docs/tree/api.doc.mjs +30 -0
  238. package/assets/docs/tree/cli.doc.mjs +23 -0
  239. package/assets/docs/tree/commands.doc.mjs +25 -0
  240. package/assets/docs/{cli-integrations.doc.mjs → tree/integrations.doc.mjs} +95 -39
  241. package/assets/docs/tree/integrations.test.mjs +62 -0
  242. package/assets/docs/tree/writing-docs.doc.mjs +286 -0
  243. package/assets/docs/working-with-ai.doc.mjs +4 -4
  244. package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.doc.mjs +1 -1
  245. package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.tsx +1 -3
  246. package/assets/templates/blocks/components/DateInput/DateInputDateRange.tsx +1 -1
  247. package/assets/templates/blocks/components/InternationalizationProvider/InternationalizationProvider01ShippedLocale.tsx +1 -1
  248. package/assets/templates/blocks/components/Item/ItemDocumentTabs.doc.mjs +14 -0
  249. package/assets/templates/blocks/components/Item/ItemDocumentTabs.tsx +100 -0
  250. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.doc.mjs +14 -0
  251. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.tsx +61 -0
  252. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.doc.mjs +14 -0
  253. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.tsx +126 -0
  254. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.doc.mjs +15 -0
  255. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.tsx +86 -0
  256. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.doc.mjs +14 -0
  257. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.tsx +99 -0
  258. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.doc.mjs +14 -0
  259. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.tsx +122 -0
  260. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.doc.mjs +14 -0
  261. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.tsx +95 -0
  262. package/assets/templates/blocks/components/Table/TableBulkActionsTable.doc.mjs +14 -0
  263. package/assets/templates/blocks/components/Table/TableBulkActionsTable.tsx +71 -0
  264. package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.doc.mjs +19 -0
  265. package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.tsx +139 -0
  266. package/assets/templates/blocks/components/TimeInput/TimeInputConstrained.tsx +1 -0
  267. package/assets/templates/pages/table-tree/page.tsx +1704 -0
  268. package/assets/templates/pages/table-tree/template.doc.mjs +12 -0
  269. package/assets/templates/themes/butter/butterTheme.doc.mjs +11 -0
  270. package/assets/templates/themes/chocolate/chocolateTheme.doc.mjs +11 -0
  271. package/assets/templates/themes/gothic/gothicTheme.doc.mjs +11 -0
  272. package/assets/templates/themes/matcha/matchaTheme.doc.mjs +11 -0
  273. package/assets/templates/themes/neutral/neutralTheme.doc.mjs +11 -0
  274. package/assets/templates/themes/stone/stoneTheme.doc.mjs +11 -0
  275. package/assets/templates/themes/y2k/y2kTheme.doc.mjs +11 -0
  276. package/authoring/_shared/contract.ts +22 -0
  277. package/authoring/codemod/codemod.doc.mjs +7 -2
  278. package/authoring/codemod/parse.d.mts +8 -8
  279. package/authoring/codemod/parse.mjs +8 -6
  280. package/authoring/codemod/type.ts +12 -0
  281. package/authoring/config/config.doc.mjs +10 -2
  282. package/authoring/config/debug-composition.test.mjs +92 -0
  283. package/authoring/config/parse.d.mts +15 -13
  284. package/authoring/config/parse.mjs +27 -8
  285. package/authoring/config/parse.test.mjs +8 -0
  286. package/authoring/config/type.ts +29 -6
  287. package/authoring/debug/debug.doc.d.mts +11 -0
  288. package/authoring/debug/debug.doc.mjs +182 -0
  289. package/authoring/debug/parse.d.mts +7 -7
  290. package/authoring/debug/parse.mjs +3 -3
  291. package/authoring/discover/discover.doc.d.mts +13 -0
  292. package/authoring/discover/discover.doc.mjs +138 -0
  293. package/authoring/discover/parse.d.mts +24 -0
  294. package/authoring/discover/parse.mjs +128 -0
  295. package/authoring/discover/parse.test.mjs +124 -0
  296. package/authoring/discover/type.ts +87 -0
  297. package/authoring/doctypes/_schema.d.mts +240 -128
  298. package/authoring/doctypes/_schema.mjs +198 -16
  299. package/authoring/doctypes/base/graph-fields.doc.mjs +15 -6
  300. package/authoring/doctypes/base/type.ts +9 -4
  301. package/authoring/doctypes/command/command.doc.mjs +4 -3
  302. package/authoring/doctypes/command/parse.d.mts +2 -2
  303. package/authoring/doctypes/command/parse.mjs +1 -1
  304. package/authoring/doctypes/command/type.ts +4 -4
  305. package/authoring/doctypes/component/component.doc.mjs +5 -2
  306. package/authoring/doctypes/component/parse.d.mts +2 -2
  307. package/authoring/doctypes/component/parse.mjs +1 -1
  308. package/authoring/doctypes/component/type.ts +3 -3
  309. package/authoring/doctypes/doctypes-new.test.mjs +48 -6
  310. package/authoring/doctypes/enum/enum.doc.mjs +1 -1
  311. package/authoring/doctypes/enum/parse.d.mts +2 -2
  312. package/authoring/doctypes/enum/parse.mjs +1 -1
  313. package/authoring/doctypes/enum/type.ts +2 -2
  314. package/authoring/doctypes/function/function.doc.mjs +7 -2
  315. package/authoring/doctypes/function/parse.d.mts +2 -2
  316. package/authoring/doctypes/function/parse.mjs +1 -1
  317. package/authoring/doctypes/function/type.ts +4 -3
  318. package/authoring/doctypes/hook/hook.doc.mjs +4 -0
  319. package/authoring/doctypes/hook/parse.d.mts +2 -2
  320. package/authoring/doctypes/hook/parse.mjs +1 -1
  321. package/authoring/doctypes/hook/type.ts +3 -3
  322. package/authoring/doctypes/legacy.d.mts +6 -6
  323. package/authoring/doctypes/legacy.mjs +3 -3
  324. package/authoring/doctypes/load-contract.test.mjs +233 -0
  325. package/authoring/doctypes/namespace/namespace.doc.mjs +9 -9
  326. package/authoring/doctypes/namespace/parse.d.mts +2 -2
  327. package/authoring/doctypes/namespace/parse.mjs +1 -1
  328. package/authoring/doctypes/namespace/parse.test.mjs +23 -25
  329. package/authoring/doctypes/namespace/type.ts +6 -3
  330. package/authoring/doctypes/parse.d.mts +22 -20
  331. package/authoring/doctypes/parse.mjs +19 -14
  332. package/authoring/doctypes/reference/parse.d.mts +2 -2
  333. package/authoring/doctypes/reference/parse.mjs +1 -1
  334. package/authoring/doctypes/reference/reference.doc.mjs +39 -6
  335. package/authoring/doctypes/reference/type.ts +31 -14
  336. package/authoring/doctypes/schema/parse.d.mts +2 -2
  337. package/authoring/doctypes/schema/parse.mjs +1 -1
  338. package/authoring/doctypes/schema/schema.doc.mjs +1 -1
  339. package/authoring/doctypes/schema/type.ts +3 -4
  340. package/authoring/doctypes/template/parse.d.mts +94 -1
  341. package/authoring/doctypes/template/parse.mjs +37 -1
  342. package/authoring/doctypes/template/parse.test.mjs +18 -0
  343. package/authoring/doctypes/template/template.doc.mjs +13 -3
  344. package/authoring/doctypes/template/type.ts +12 -1
  345. package/authoring/doctypes/theme/parse.d.mts +35 -0
  346. package/authoring/doctypes/theme/parse.mjs +76 -0
  347. package/authoring/doctypes/theme/theme.doc.d.mts +9 -0
  348. package/authoring/doctypes/theme/theme.doc.mjs +79 -0
  349. package/authoring/doctypes/theme/type.ts +42 -0
  350. package/authoring/doctypes/types.ts +12 -11
  351. package/authoring/gap-report/gap-report.doc.d.mts +12 -0
  352. package/authoring/gap-report/gap-report.doc.mjs +183 -0
  353. package/authoring/gap-report/parse.d.mts +9 -9
  354. package/authoring/gap-report/parse.mjs +6 -6
  355. package/authoring/gap-report/type.ts +1 -1
  356. package/authoring/identity/identity.doc.mjs +3 -2
  357. package/authoring/identity/type.ts +10 -10
  358. package/authoring/index.d.mts +2 -0
  359. package/authoring/index.d.ts +32 -19
  360. package/authoring/index.mjs +3 -1
  361. package/authoring/integration/integration.doc.mjs +2 -2
  362. package/authoring/integration/parse.d.mts +2 -2
  363. package/authoring/integration/parse.mjs +1 -1
  364. package/authoring/integration/schema.d.mts +4 -4
  365. package/authoring/integration/schema.mjs +3 -3
  366. package/authoring/integration/type.ts +5 -11
  367. package/clients/cli/__tests__/cliManifest.test.ts +27 -29
  368. package/clients/cli/command-load-failure.test.mjs +83 -0
  369. package/clients/cli/commands/blog.doc.mjs +1 -1
  370. package/clients/cli/commands/blog.mjs +23 -8
  371. package/clients/cli/commands/blog.test.mjs +42 -1
  372. package/clients/cli/commands/build-theme.adaptations.test.mjs +100 -1
  373. package/clients/cli/commands/build-theme.ascii-output.test.mjs +161 -0
  374. package/clients/cli/commands/build-theme.flag-docs.test.mjs +110 -0
  375. package/clients/cli/commands/build-theme.mjs +16 -50
  376. package/clients/cli/commands/build-theme.path-safety.test.mjs +86 -1
  377. package/clients/cli/commands/build-theme.variants.test.mjs +76 -0
  378. package/clients/cli/commands/build.doc.mjs +16 -8
  379. package/clients/cli/commands/build.exit-codes-doc.test.mjs +50 -0
  380. package/clients/cli/commands/build.mjs +137 -114
  381. package/clients/cli/commands/build.playbook.test.mjs +75 -0
  382. package/clients/cli/commands/build.text-fields.test.mjs +81 -0
  383. package/clients/cli/commands/component/index.mjs +3 -8
  384. package/clients/cli/commands/component-ownership.test.mjs +3 -3
  385. package/clients/cli/commands/component-package.test.mjs +46 -0
  386. package/clients/cli/commands/component-resolution.test.mjs +21 -0
  387. package/clients/cli/commands/component.doc.mjs +1 -1
  388. package/clients/cli/commands/component.test.mjs +19 -0
  389. package/clients/cli/commands/detail-levels.test.mjs +2 -2
  390. package/clients/cli/commands/discover.broken-integration.test.mjs +52 -5
  391. package/clients/cli/commands/discover.components-flag.test.mjs +97 -0
  392. package/clients/cli/commands/discover.doc.mjs +55 -9
  393. package/clients/cli/commands/discover.mjs +393 -118
  394. package/clients/cli/commands/discover.sources.test.mjs +267 -0
  395. package/clients/cli/commands/discover.text-projection.test.mjs +103 -0
  396. package/clients/cli/commands/docs.doc.mjs +21 -9
  397. package/clients/cli/commands/docs.mjs +184 -70
  398. package/clients/cli/commands/docs.test.mjs +120 -16
  399. package/clients/cli/commands/doctor-integration-components.doc.mjs +1 -1
  400. package/clients/cli/commands/doctor-integration-docs.doc.mjs +3 -3
  401. package/clients/cli/commands/doctor-integration-templates.doc.mjs +15 -8
  402. package/clients/cli/commands/doctor-integration-validate.doc.mjs +1 -1
  403. package/clients/cli/commands/doctor-integration.doc.mjs +1 -1
  404. package/clients/cli/commands/doctor-integration.package-json.test.mjs +53 -0
  405. package/clients/cli/commands/doctor-integration.test.mjs +90 -8
  406. package/clients/cli/commands/doctor.doc.mjs +1 -1
  407. package/clients/cli/commands/doctor.mjs +59 -32
  408. package/clients/cli/commands/doctor.test.mjs +42 -0
  409. package/clients/cli/commands/gap-report.doc.mjs +17 -6
  410. package/clients/cli/commands/gap-report.test.mjs +72 -0
  411. package/clients/cli/commands/hook/index.mjs +7 -17
  412. package/clients/cli/commands/hook.doc.mjs +1 -1
  413. package/clients/cli/commands/hook.text-projection.test.mjs +45 -0
  414. package/clients/cli/commands/init.doc.mjs +20 -9
  415. package/clients/cli/commands/init.flag-help.test.mjs +153 -0
  416. package/clients/cli/commands/integration-add.controls.test.mjs +132 -0
  417. package/clients/cli/commands/integration-add.doc.mjs +32 -6
  418. package/clients/cli/commands/integration-authoring.test.mjs +13 -9
  419. package/clients/cli/commands/integration-pack.doc.mjs +1 -1
  420. package/clients/cli/commands/integration-real-world.test.mjs +3 -9
  421. package/clients/cli/commands/integration.doc.mjs +1 -1
  422. package/clients/cli/commands/integration.mjs +1 -0
  423. package/clients/cli/commands/interactive-guard.test.mjs +101 -24
  424. package/clients/cli/commands/json-contract.test.mjs +33 -0
  425. package/clients/cli/commands/layout-check.doc.mjs +15 -4
  426. package/clients/cli/commands/layout-expand.doc.mjs +22 -5
  427. package/clients/cli/commands/layout-grammar.doc.mjs +1 -1
  428. package/clients/cli/commands/layout.doc.mjs +3 -3
  429. package/clients/cli/commands/layout.mjs +21 -9
  430. package/clients/cli/commands/layout.path-help.test.mjs +33 -0
  431. package/clients/cli/commands/layout.stdin-cap.test.mjs +47 -0
  432. package/clients/cli/commands/layout.text-fields.test.mjs +39 -0
  433. package/clients/cli/commands/manifest.doc.mjs +1 -1
  434. package/clients/cli/commands/no-prompt-wording.test.mjs +94 -0
  435. package/clients/cli/commands/search.doc.mjs +7 -4
  436. package/clients/cli/commands/search.mjs +28 -9
  437. package/clients/cli/commands/search.test.mjs +75 -0
  438. package/clients/cli/commands/setup-nudge.test.mjs +6 -0
  439. package/clients/cli/commands/swizzle.doc.mjs +3 -2
  440. package/clients/cli/commands/swizzle.path-safety.test.mjs +42 -0
  441. package/clients/cli/commands/template.doc.mjs +52 -13
  442. package/clients/cli/commands/template.flag-help.test.mjs +117 -0
  443. package/clients/cli/commands/template.mjs +4 -91
  444. package/clients/cli/commands/template.path-help.test.mjs +40 -0
  445. package/clients/cli/commands/text-json-parity.test.mjs +719 -0
  446. package/clients/cli/commands/theme-add.doc.mjs +4 -3
  447. package/clients/cli/commands/theme-build.doc.mjs +8 -7
  448. package/clients/cli/commands/theme-list.doc.mjs +2 -2
  449. package/clients/cli/commands/theme-palette-generate.doc.mjs +3 -3
  450. package/clients/cli/commands/theme-palette-generate.test.mjs +19 -0
  451. package/clients/cli/commands/theme-palette.doc.mjs +1 -1
  452. package/clients/cli/commands/theme-targets.behavior.test.mjs +4 -3
  453. package/clients/cli/commands/theme-targets.doc.mjs +1 -1
  454. package/clients/cli/commands/theme-template.behavior.test.mjs +12 -0
  455. package/clients/cli/commands/theme-template.doc.mjs +2 -2
  456. package/clients/cli/commands/theme.doc.mjs +1 -1
  457. package/clients/cli/commands/upgrade.ascii-output.test.mjs +87 -0
  458. package/clients/cli/commands/upgrade.doc.mjs +20 -8
  459. package/clients/cli/commands/upgrade.file-protection.test.mjs +228 -0
  460. package/clients/cli/commands/upgrade.flag-help.test.mjs +188 -0
  461. package/clients/cli/commands/upgrade.hook-output.test.mjs +88 -0
  462. package/clients/cli/commands/upgrade.mjs +29 -7
  463. package/clients/cli/formatters/index.mjs +2 -0
  464. package/clients/cli/formatters/index.test.mjs +6 -0
  465. package/clients/cli/index.mjs +21 -30
  466. package/clients/cli/latest-version-env.test.mjs +50 -0
  467. package/clients/cli/lib/cli-error.test.mjs +7 -0
  468. package/clients/cli/lib/component-format.mjs +9 -9
  469. package/clients/cli/lib/component-format.test.mjs +1 -1
  470. package/clients/cli/lib/define-command.mjs +32 -6
  471. package/clients/cli/lib/doc-text-ascii.test.mjs +82 -0
  472. package/clients/cli/lib/exit-codes.test.mjs +97 -0
  473. package/clients/cli/lib/hook-format.mjs +19 -10
  474. package/clients/cli/lib/json-shim.mjs +38 -2
  475. package/clients/cli/lib/json-shim.test.mjs +83 -0
  476. package/clients/cli/lib/manifest.d.ts +2 -0
  477. package/clients/cli/lib/manifest.mjs +32 -2
  478. package/clients/cli/lib/manifest.test.mjs +17 -0
  479. package/foundation/agent-docs/agent-docs.d.mts +7 -2
  480. package/foundation/agent-docs/agent-docs.mjs +82 -12
  481. package/foundation/agent-docs/agent-docs.path-safety.test.mjs +266 -4
  482. package/foundation/agent-docs/agent-docs.test.mjs +19 -1
  483. package/foundation/config/integration-debug.test.mjs +28 -3
  484. package/foundation/config/project-themes.test.mjs +11 -19
  485. package/foundation/config/project.d.mts +20 -11
  486. package/foundation/config/project.mjs +246 -89
  487. package/foundation/config/project.test.mjs +270 -21
  488. package/foundation/discovery/authoring-self-docs.d.mts +18 -0
  489. package/foundation/discovery/authoring-self-docs.mjs +38 -15
  490. package/foundation/discovery/authoring-self-docs.test.mjs +87 -12
  491. package/foundation/discovery/authoring-surface.d.mts +74 -0
  492. package/foundation/discovery/authoring-surface.mjs +525 -0
  493. package/foundation/discovery/authoring-surface.test.mjs +392 -0
  494. package/foundation/discovery/cli-self-docs.d.mts +119 -0
  495. package/foundation/discovery/cli-self-docs.mjs +490 -0
  496. package/foundation/discovery/cli-self-docs.test.mjs +375 -0
  497. package/foundation/discovery/component-discovery.d.mts +38 -0
  498. package/foundation/discovery/component-discovery.mjs +48 -0
  499. package/foundation/discovery/component-loader.d.mts +35 -38
  500. package/foundation/discovery/component-loader.mjs +53 -222
  501. package/foundation/discovery/docs-discovery.d.mts +114 -9
  502. package/foundation/discovery/docs-discovery.mjs +239 -30
  503. package/foundation/discovery/docs-discovery.test.mjs +150 -35
  504. package/foundation/discovery/docs-output-budget.d.mts +2 -2
  505. package/foundation/discovery/docs-output-budget.mjs +1 -1
  506. package/foundation/discovery/docs-section-key.d.mts +28 -10
  507. package/foundation/discovery/docs-section-key.mjs +134 -33
  508. package/foundation/discovery/docs-section-key.test.mjs +41 -19
  509. package/foundation/discovery/template-adapter.d.mts +113 -11
  510. package/foundation/discovery/template-adapter.fixture-refs.test.mjs +248 -0
  511. package/foundation/discovery/template-adapter.integration-isolation.test.mjs +94 -0
  512. package/foundation/discovery/template-adapter.mjs +772 -82
  513. package/foundation/discovery/template-adapter.test.mjs +57 -0
  514. package/foundation/discovery/template-conflict-release.d.mts +13 -0
  515. package/foundation/discovery/template-conflict-release.mjs +40 -0
  516. package/foundation/discovery/template-conflict-release.test.mjs +40 -0
  517. package/foundation/discovery/theme-discovery.d.mts +67 -7
  518. package/foundation/discovery/theme-discovery.mjs +916 -186
  519. package/foundation/discovery/theme-discovery.test.mjs +613 -219
  520. package/foundation/discovery/theming-targets.test.mjs +4 -0
  521. package/foundation/doc-compiler/bundle.d.mts +47 -0
  522. package/foundation/doc-compiler/bundle.mjs +278 -0
  523. package/foundation/doc-compiler/bundle.test.mjs +266 -0
  524. package/foundation/doc-compiler/compile.d.mts +343 -0
  525. package/foundation/doc-compiler/compile.mjs +558 -0
  526. package/foundation/doc-compiler/diagnostics.d.mts +126 -0
  527. package/foundation/doc-compiler/diagnostics.mjs +305 -0
  528. package/foundation/doc-compiler/doc-compiler.test.mjs +714 -0
  529. package/foundation/doc-compiler/doc-loads.test.mjs +1642 -0
  530. package/foundation/doc-compiler/import.d.mts +24 -0
  531. package/foundation/doc-compiler/import.mjs +59 -0
  532. package/foundation/doc-compiler/inputs.d.mts +102 -0
  533. package/foundation/doc-compiler/inputs.mjs +291 -0
  534. package/foundation/doc-compiler/inputs.test.mjs +299 -0
  535. package/foundation/doc-compiler/ir.d.mts +22 -0
  536. package/foundation/doc-compiler/ir.mjs +471 -0
  537. package/foundation/doc-compiler/lenses.d.mts +36 -0
  538. package/foundation/doc-compiler/lenses.mjs +173 -0
  539. package/foundation/doc-compiler/links.d.mts +162 -0
  540. package/foundation/doc-compiler/links.mjs +294 -0
  541. package/foundation/doc-compiler/links.test.mjs +192 -0
  542. package/foundation/doc-compiler/lower-doc.test.mjs +495 -0
  543. package/foundation/doc-compiler/overlays.d.mts +37 -0
  544. package/foundation/doc-compiler/overlays.mjs +206 -0
  545. package/foundation/doc-compiler/parse-readable.d.mts +9 -0
  546. package/foundation/doc-compiler/parse-readable.mjs +29 -0
  547. package/foundation/doc-compiler/read.d.mts +127 -0
  548. package/foundation/doc-compiler/read.mjs +325 -0
  549. package/foundation/doc-compiler/read.test.mjs +313 -0
  550. package/foundation/doc-compiler/source.d.mts +33 -0
  551. package/foundation/doc-compiler/source.mjs +128 -0
  552. package/foundation/doc-compiler/tree.d.mts +288 -0
  553. package/foundation/doc-compiler/tree.mjs +876 -0
  554. package/foundation/doc-compiler/tree.test.mjs +598 -0
  555. package/foundation/fs/file-protection.d.mts +33 -0
  556. package/foundation/fs/file-protection.mjs +825 -0
  557. package/foundation/fs/file-protection.test.mjs +250 -0
  558. package/foundation/fs/module-loader.d.mts +1 -0
  559. package/foundation/fs/module-loader.mjs +50 -1
  560. package/foundation/fs/module-loader.stdout.test.mjs +332 -0
  561. package/foundation/fs/path-safety.d.mts +3 -2
  562. package/foundation/fs/path-safety.mjs +49 -19
  563. package/foundation/fs/path-safety.test.mjs +50 -0
  564. package/foundation/fs/publish-file-hardlink-unavailable.test.mjs +129 -94
  565. package/foundation/integrations/autolink.d.mts +58 -1
  566. package/foundation/integrations/autolink.mjs +143 -52
  567. package/foundation/integrations/autolink.test.mjs +1 -1
  568. package/foundation/integrations/cli-requirement.d.mts +45 -0
  569. package/foundation/integrations/cli-requirement.mjs +154 -0
  570. package/foundation/integrations/cli-requirement.test.mjs +84 -0
  571. package/foundation/integrations/contribution-fixes.d.mts +145 -0
  572. package/foundation/integrations/contribution-fixes.mjs +1284 -0
  573. package/foundation/integrations/contribution-inventory.d.mts +3 -2
  574. package/foundation/integrations/contribution-inventory.mjs +27 -24
  575. package/foundation/integrations/contribution-inventory.test.mjs +86 -27
  576. package/foundation/integrations/integration-warnings.d.mts +9 -2
  577. package/foundation/integrations/integration-warnings.mjs +51 -26
  578. package/foundation/integrations/integration-warnings.test.mjs +74 -1
  579. package/foundation/integrations/integrations.d.mts +17 -1
  580. package/foundation/integrations/integrations.mjs +52 -98
  581. package/foundation/integrations/integrations.test.mjs +31 -0
  582. package/foundation/integrations/provider-ledger.test.mjs +275 -0
  583. package/foundation/integrations/provider-resolution.d.mts +152 -0
  584. package/foundation/integrations/provider-resolution.mjs +576 -0
  585. package/foundation/integrations/provider-resolution.test.mjs +369 -0
  586. package/foundation/integrations/theme-descriptor.d.mts +8 -0
  587. package/foundation/integrations/theme-descriptor.mjs +44 -0
  588. package/foundation/integrations/validate-contributions.mjs +121 -29
  589. package/foundation/response/base.d.ts +8 -4
  590. package/foundation/response/error-codes.d.mts +3 -1
  591. package/foundation/response/error-codes.d.ts +2 -0
  592. package/foundation/response/error-codes.doc.mjs +13 -4
  593. package/foundation/response/error-codes.mjs +8 -2
  594. package/foundation/response/error-codes.test.mjs +137 -10
  595. package/foundation/response/json-contract.test.mjs +11 -0
  596. package/foundation/response/json.d.mts +4 -2
  597. package/foundation/response/json.mjs +8 -10
  598. package/foundation/response/response-types.doc.d.mts +5 -1
  599. package/foundation/response/response-types.doc.mjs +37 -22
  600. package/foundation/response/response-types.doc.test.mjs +158 -0
  601. package/foundation/response/response.doc.mjs +1 -1
  602. package/foundation/text/string-utils.d.mts +8 -0
  603. package/foundation/text/string-utils.mjs +40 -10
  604. package/foundation/xle/expand.d.mts +2 -0
  605. package/foundation/xle/expand.mjs +4 -3
  606. package/foundation/xle/expand.test.mjs +54 -0
  607. package/foundation/xle/xle.test.mjs +13 -0
  608. package/package.json +10 -11
  609. package/assets/templates/themes/manifest.json +0 -95
  610. package/clients/cli/lib/update-check.mjs +0 -83
  611. package/clients/cli/lib/update-check.test.mjs +0 -137
  612. package/clients/cli/update-hint-commands.test.mjs +0 -54
@@ -9,6 +9,14 @@
9
9
  * @returns {string|null}
10
10
  */
11
11
  export function findConfigPath(startDir?: string): string | null;
12
+ /**
13
+ * The provider ledger a Project resolved at load: one outcome for every
14
+ * package directory configured, autolinked, or authored. Internal: upgrade
15
+ * resolves on top of it, and tests account for every candidate with it.
16
+ * @param {Project} project
17
+ * @returns {import('../integrations/provider-resolution.mjs').ProviderLedger}
18
+ */
19
+ export function providerLedgerOf(project: Project): import("../integrations/provider-resolution.mjs").ProviderLedger;
12
20
  /**
13
21
  * An integration issue tagged with the owner package. The base
14
22
  * {@link import('../integrations/issue').AstryxIntegrationIssue} fields plus the
@@ -87,9 +95,9 @@ export class Project {
87
95
  /**
88
96
  * Core + integration component ownership records. Wraps
89
97
  * discoverOwnedComponents for core and discoverIntegrationComponents (via
90
- * discoverOwnedComponents) for integrations, but applies the skip+warn
91
- * policy per integration: a broken integration's components are skipped and
92
- * its issues collected, never thrown. Memoized per instance.
98
+ * discoverOwnedComponents) for integrations. Invalid component records are
99
+ * omitted and reported; valid component siblings and other contribution kinds
100
+ * remain available. Memoized per instance.
93
101
  *
94
102
  * @returns {Promise<Array<{name: string, package: string, group: string|null, docPath: string|null, sourcePath: string|null, issuesUrl: string|undefined}>>}
95
103
  */
@@ -102,10 +110,11 @@ export class Project {
102
110
  issuesUrl: string | undefined;
103
111
  }>>;
104
112
  /**
105
- * Core + integration templates, type-tagged. Wraps discoverTemplates (core +
106
- * external blocks) and discoverIntegrationTemplatesForOne per integration so
107
- * a broken integration's templates are skipped and its issues collected.
108
- * Memoized per instance.
113
+ * Core + integration templates, type-tagged, with valid integration
114
+ * replacements projected over their Core targets. Wraps raw template discovery
115
+ * (Core + external blocks) and discoverIntegrationTemplatesForOne per integration
116
+ * so unusable template files are reported and omitted while valid siblings
117
+ * remain available. Memoized per instance.
109
118
  *
110
119
  * @returns {Promise<Array<object>>}
111
120
  */
@@ -113,8 +122,8 @@ export class Project {
113
122
  /**
114
123
  * Bundled source themes plus themes contributed by installed integrations.
115
124
  * Each record keeps its package owner and source directory so callers can
116
- * both list and copy it without reconstructing paths. A broken integration's
117
- * themes are skipped under the same issue policy as every other kind.
125
+ * both list and copy it without reconstructing paths. A broken theme
126
+ * contribution is reported without hiding the package's other valid kinds.
118
127
  *
119
128
  * @returns {Promise<import('../discovery/theme-discovery.mjs').DiscoveredTheme[]>}
120
129
  */
@@ -137,8 +146,8 @@ export class Project {
137
146
  /**
138
147
  * Core registry transforms + integration codemods for an upgrade range.
139
148
  * Wraps getTransformsBetween (core) and discoverIntegrationCodemods /
140
- * selectIntegrationCodemods (integrations). A broken integration's codemods
141
- * are skipped (issue collected) rather than failing the whole resolution.
149
+ * selectIntegrationCodemods (integrations). An invalid codemod contribution
150
+ * is reported and omitted without hiding other valid contribution kinds.
142
151
  * Memoized per (from, to) key.
143
152
  *
144
153
  * @param {string} fromVersion exclusive lower bound
@@ -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,9 +40,10 @@ import {parseConfig} from '../../authoring/config/parse.mjs';
38
40
  import {
39
41
  loadIntegrations,
40
42
  loadLocalIntegration,
41
- markProviderConflicts,
43
+ resolvePackageDir,
42
44
  } from '../integrations/integrations.mjs';
43
- import {autolinkIntegrations} from '../integrations/autolink.mjs';
45
+ import {loadAutolinkCandidates} from '../integrations/autolink.mjs';
46
+ import {resolveProviders} from '../integrations/provider-resolution.mjs';
44
47
  import {
45
48
  setProject as setDebugProject,
46
49
  setEventHandler as setDebugEventHandler,
@@ -49,11 +52,13 @@ import {
49
52
  import {
50
53
  CORE_PACKAGE,
51
54
  discoverOwnedComponents,
52
- discoverIntegrationComponents,
55
+ discoverValidIntegrationComponents,
53
56
  } from '../discovery/component-discovery.mjs';
54
57
  import {findCoreDir} from '../fs/paths.mjs';
55
58
  import {
56
- discoverAll as discoverTemplates,
59
+ applyTemplateReplacements,
60
+ effectiveTemplateDiscovery,
61
+ discoverAllUnresolved as discoverTemplates,
57
62
  discoverIntegrationTemplatesForOne,
58
63
  } from '../discovery/template-adapter.mjs';
59
64
  import {
@@ -69,10 +74,7 @@ import {
69
74
  discoverIntegrationCodemods,
70
75
  selectIntegrationCodemods,
71
76
  } from '../../assets/codemods/integration-discovery.mjs';
72
- import {
73
- INVALID_AGENT_DOCS,
74
- validateLoadedIntegration,
75
- } from '../integrations/validate-contributions.mjs';
77
+ import {validateLoadedIntegration} from '../integrations/validate-contributions.mjs';
76
78
  import {
77
79
  InMemoryConfigCache,
78
80
  cacheKey,
@@ -95,6 +97,118 @@ function errorMessage(err) {
95
97
  return message == null ? String(err) : String(message);
96
98
  }
97
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
+
98
212
  /**
99
213
  * An integration issue tagged with the owner package. The base
100
214
  * {@link import('../integrations/issue').AstryxIntegrationIssue} fields plus the
@@ -147,13 +261,15 @@ function findPackageRoot(startDir) {
147
261
  *
148
262
  * This governs INHERITED handlers only. A project's own `debug` always runs.
149
263
  *
150
- * @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
151
268
  * @returns {boolean}
152
269
  */
153
- function inheritsIntegrationDebug(configPath) {
154
- if (!configPath) return true;
270
+ function inheritsIntegrationDebug(projectDir) {
155
271
  try {
156
- const pkgPath = path.join(path.dirname(configPath), 'package.json');
272
+ const pkgPath = path.join(projectDir, 'package.json');
157
273
  const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
158
274
  return pkg?.astryx?.inheritDebug !== false;
159
275
  } catch {
@@ -182,6 +298,24 @@ export function findConfigPath(startDir = process.cwd()) {
182
298
  return present.length === 1 ? present[0] : null;
183
299
  }
184
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
+
185
319
  /**
186
320
  * The single API for reading resolved project configuration. Construct via the
187
321
  * async {@link Project.load} factory.
@@ -211,6 +345,8 @@ export class Project {
211
345
  * @type {Set<object>}
212
346
  */
213
347
  #visitedIssues = new Set();
348
+ /** @type {Promise<Array<object>> | null} */
349
+ #templatesPromise = null;
214
350
 
215
351
  /**
216
352
  * @param {object} init
@@ -276,11 +412,10 @@ export class Project {
276
412
  fresh,
277
413
  });
278
414
  integrations = config.integrations ?? [];
279
- loadedIntegrations = await loadIntegrations(integrations, {
415
+ // Provider identity is resolved once, below, over the final set.
416
+ loadedIntegrations = await loadConfiguredIntegrations(integrations, {
280
417
  cwd: projectDir,
281
418
  fresh,
282
- // Provider identity is resolved once, below, over the final set.
283
- resolveProviders: false,
284
419
  });
285
420
  }
286
421
 
@@ -288,35 +423,42 @@ export class Project {
288
423
  // This runs whether or not a config exists, because the projects it reaches
289
424
  // are overwhelmingly the ones with no astryx.config at all: a scaffold adds
290
425
  // the dependency and writes no config, and the integration then contributes
291
- // 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
292
427
  // configured ones so an explicit entry keeps its position and its
293
428
  // precedence in every discovery order.
294
- loadedIntegrations = [
295
- ...loadedIntegrations,
296
- ...(await autolinkIntegrations({
297
- projectDir,
298
- loaded: loadedIntegrations,
299
- fresh,
300
- })),
301
- ];
429
+ const autolinked = await loadAutolinkCandidates({
430
+ projectDir,
431
+ loaded: loadedIntegrations,
432
+ fresh,
433
+ });
302
434
 
303
435
  // The package being authored is the one package that cannot install itself.
304
436
  // When it carries a manifest, resolve its working bytes directly so every
305
437
  // existing consumer command doubles as the author's preview. A local copy
306
438
  // replaces the same installed package in place, preserving configured
307
439
  // precedence while making the source being edited authoritative.
308
- const localIntegration = await loadLocalIntegration(projectDir, {fresh});
309
- if (localIntegration) {
310
- const existing = loadedIntegrations.findIndex(
311
- integration => integration.name === localIntegration.name,
312
- );
313
- if (existing === -1) loadedIntegrations.push(localIntegration);
314
- else loadedIntegrations[existing] = localIntegration;
315
- }
440
+ const localIntegration = await loadLocalIntegrationSafely(projectDir, fresh);
316
441
 
317
442
  // Autolinked and local packages can claim a provider ID that a configured
318
443
  // package already holds, so identity is resolved once over the final set.
319
- loadedIntegrations = markProviderConflicts(loadedIntegrations);
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;
320
462
 
321
463
  // The debug recorder resolves its settings synchronously, long before any
322
464
  // command gets here, so this is where a project's `debug` block gets a
@@ -335,7 +477,7 @@ export class Project {
335
477
  // because Project.load can run more than once in a process and appending
336
478
  // would deliver twice.
337
479
  setDebugIntegrationEventHandlers(
338
- inheritsIntegrationDebug(configPath)
480
+ inheritsIntegrationDebug(projectDir)
339
481
  ? loadedIntegrations.map(integration => integration.__debug)
340
482
  : [],
341
483
  );
@@ -347,7 +489,7 @@ export class Project {
347
489
  // Never let recording break config loading.
348
490
  }
349
491
 
350
- return new Project({
492
+ const project = new Project({
351
493
  cwd,
352
494
  configPath,
353
495
  config,
@@ -356,6 +498,8 @@ export class Project {
356
498
  cache: resolvedCache,
357
499
  hash,
358
500
  });
501
+ PROVIDER_LEDGERS.set(project, resolution.ledger);
502
+ return project;
359
503
  }
360
504
 
361
505
  /**
@@ -454,22 +598,6 @@ export class Project {
454
598
  return integration?.name ?? integration?.__spec ?? '(integration)';
455
599
  }
456
600
 
457
- /**
458
- * Whether this package has an error that invalidates its regular manifest
459
- * contributions. Invalid `agentDocs` blocks agent-doc writes only; it must not
460
- * withdraw components, templates, docs, or codemods.
461
- * @param {string} pkg
462
- * @returns {boolean}
463
- */
464
- #hasBlockingContributionIssue(pkg) {
465
- return this.#issues.some(
466
- issue =>
467
- issue.package === pkg &&
468
- issue.severity === 'error' &&
469
- issue.code !== INVALID_AGENT_DOCS,
470
- );
471
- }
472
-
473
601
  /**
474
602
  * Validate one loaded integration and collect any issues. Marks the
475
603
  * integration visited so issues() won't redo the work. Best-effort: a
@@ -506,9 +634,9 @@ export class Project {
506
634
  /**
507
635
  * Core + integration component ownership records. Wraps
508
636
  * discoverOwnedComponents for core and discoverIntegrationComponents (via
509
- * discoverOwnedComponents) for integrations, but applies the skip+warn
510
- * policy per integration: a broken integration's components are skipped and
511
- * 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.
512
640
  *
513
641
  * @returns {Promise<Array<{name: string, package: string, group: string|null, docPath: string|null, sourcePath: string|null, issuesUrl: string|undefined}>>}
514
642
  */
@@ -528,18 +656,17 @@ export class Project {
528
656
  }
529
657
  }
530
658
 
531
- // 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.
532
661
  for (const integration of this.#loadedIntegrations) {
533
662
  await this.#collectIssues(integration);
534
663
  const pkg = this.#pkgLabel(integration);
535
- if (this.#hasBlockingContributionIssue(pkg)) continue;
536
664
  try {
537
- // discoverOwnedComponents owns the core+integration record shape;
538
- // here we add only this integration's records (core is handled
539
- // above) so a single broken integration can be skipped in isolation.
540
- for (const rec of discoverIntegrationComponents(integration)) {
541
- records.push(rec);
542
- }
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);
543
670
  } catch (err) {
544
671
  this.#pushIssue(pkg, {
545
672
  code: 'invalid_component',
@@ -554,17 +681,21 @@ export class Project {
554
681
  }
555
682
 
556
683
  /**
557
- * Core + integration templates, type-tagged. Wraps discoverTemplates (core +
558
- * external blocks) and discoverIntegrationTemplatesForOne per integration so
559
- * a broken integration's templates are skipped and its issues collected.
560
- * 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.
561
689
  *
562
690
  * @returns {Promise<Array<object>>}
563
691
  */
564
692
  async templates() {
565
- return this.#memo('templates', async () => {
693
+ if (this.#templatesPromise) return this.#templatesPromise;
694
+ this.#templatesPromise = (async () => {
566
695
  /** @type {any[]} */
567
696
  const templates = [];
697
+ /** @type {import('../discovery/template-adapter.mjs').TemplateDiscoveryError[]} */
698
+ const replacementErrors = [];
568
699
 
569
700
  // Core + external-package templates (discoverTemplates internally also
570
701
  // loads integration templates via loadConfig today; we intentionally
@@ -585,20 +716,24 @@ export class Project {
585
716
  for (const integration of this.#loadedIntegrations) {
586
717
  await this.#collectIssues(integration);
587
718
  const pkg = this.#pkgLabel(integration);
588
- 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.
589
722
  try {
590
723
  const {templates: ts, errors} =
591
724
  await discoverIntegrationTemplatesForOne(integration);
592
725
  for (const e of errors) {
593
726
  this.#pushIssue(pkg, {
594
- code: 'invalid_template',
595
- severity: 'error',
727
+ code: e.code ?? 'invalid_template',
728
+ severity: e.severity ?? 'error',
596
729
  message: e.message,
597
730
  });
731
+ if (e.replacementTarget != null) replacementErrors.push(e);
598
732
  }
599
- // Only contribute templates when the integration had no per-template
600
- // errors (skip the whole integration's templates on any error).
601
- 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);
602
737
  } catch (err) {
603
738
  this.#pushIssue(pkg, {
604
739
  code: 'invalid_template',
@@ -608,15 +743,24 @@ export class Project {
608
743
  }
609
744
  }
610
745
 
611
- return templates.sort((a, b) => a.name.localeCompare(b.name));
612
- });
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;
613
757
  }
614
758
 
615
759
  /**
616
760
  * Bundled source themes plus themes contributed by installed integrations.
617
761
  * Each record keeps its package owner and source directory so callers can
618
- * both list and copy it without reconstructing paths. A broken integration's
619
- * 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.
620
764
  *
621
765
  * @returns {Promise<import('../discovery/theme-discovery.mjs').DiscoveredTheme[]>}
622
766
  */
@@ -627,7 +771,6 @@ export class Project {
627
771
  for (const integration of this.#loadedIntegrations) {
628
772
  await this.#collectIssues(integration);
629
773
  const pkg = this.#pkgLabel(integration);
630
- if (this.#hasBlockingContributionIssue(pkg)) continue;
631
774
  if (!integration?.themes) continue;
632
775
  try {
633
776
  themes.push(...(await discoverIntegrationThemes(integration)));
@@ -661,14 +804,16 @@ export class Project {
661
804
  async docs() {
662
805
  return this.#memo('docs', async () => {
663
806
  const catalog = DocsCatalog.fromBuiltins();
807
+ let rank = 0;
664
808
 
665
809
  for (const integration of this.#loadedIntegrations) {
810
+ rank += 1;
666
811
  await this.#collectIssues(integration);
667
812
  const pkg = this.#pkgLabel(integration);
668
- if (this.#hasBlockingContributionIssue(pkg)) continue;
669
813
  if (!integration?.docs) continue;
670
814
  try {
671
- const {records, errors} = await discoverIntegrationDocs(integration);
815
+ const {records, errors, namespaces, guides} =
816
+ await discoverIntegrationDocs(integration);
672
817
  for (const e of errors) {
673
818
  this.#pushIssue(pkg, {
674
819
  code: 'invalid_doc',
@@ -680,11 +825,20 @@ export class Project {
680
825
  // how a bad template withdraws its package's templates: a partial
681
826
  // docs contribution is the state where a `replaces` silently does
682
827
  // nothing and a reader gets the topic it was meant to replace.
683
- 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
+ }
684
834
  for (const record of records) {
685
835
  const issue = catalog.add(record);
686
836
  if (issue) this.#pushIssue(pkg, issue);
687
837
  }
838
+ catalog.addTreeInputs({
839
+ namespaces: namespaces.map(input => ({...input, rank})),
840
+ guides: guides.map(input => ({...input, rank})),
841
+ });
688
842
  } catch (err) {
689
843
  this.#pushIssue(pkg, {
690
844
  code: 'invalid_doc',
@@ -701,8 +855,8 @@ export class Project {
701
855
  /**
702
856
  * Core registry transforms + integration codemods for an upgrade range.
703
857
  * Wraps getTransformsBetween (core) and discoverIntegrationCodemods /
704
- * selectIntegrationCodemods (integrations). A broken integration's codemods
705
- * 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.
706
860
  * Memoized per (from, to) key.
707
861
  *
708
862
  * @param {string} fromVersion exclusive lower bound
@@ -720,7 +874,6 @@ export class Project {
720
874
  for (const integration of this.#loadedIntegrations) {
721
875
  await this.#collectIssues(integration);
722
876
  const pkg = this.#pkgLabel(integration);
723
- if (this.#hasBlockingContributionIssue(pkg)) continue;
724
877
  if (!integration?.codemods) continue;
725
878
  try {
726
879
  // Validate this integration's codemods discover cleanly in
@@ -775,6 +928,10 @@ export class Project {
775
928
  * @returns {Promise<ProjectIntegrationIssue[]>}
776
929
  */
777
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();
778
935
  for (const integration of this.#loadedIntegrations) {
779
936
  await this.#collectIssues(integration);
780
937
  }