@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
@@ -29,8 +29,9 @@
29
29
  * package's own package.json `name` (see loadIntegrations), so an aliased
30
30
  * dependency reports the package it actually is.
31
31
  *
32
- * An explicit config entry always wins: candidates already loaded from config
33
- * are dropped before anything here is imported.
32
+ * An explicit config entry always wins: a dependency whose directory is
33
+ * already loaded from config is never imported again, and comes back as a
34
+ * repeat so the provider ledger still records it.
34
35
  *
35
36
  * @position lib — sits between config/project (the caller) and
36
37
  * integrations/integrations (the loader); contributes no discovery of its own.
@@ -39,6 +40,7 @@
39
40
  import * as fs from 'node:fs';
40
41
  import * as path from 'node:path';
41
42
  import {findManifestPaths, loadIntegrations} from './integrations.mjs';
43
+ import {resolveProviders} from './provider-resolution.mjs';
42
44
 
43
45
  /**
44
46
  * package.json fields whose keys name a dependency this project installs.
@@ -164,36 +166,44 @@ function realPath(target) {
164
166
  }
165
167
 
166
168
  /**
167
- * Declared dependencies that ship an integration manifest and are not already
168
- * loaded, in declaration order.
169
- *
170
- * A candidate must have EXACTLY ONE root manifest. Zero is the ordinary case
171
- * (almost every dependency), and more than one is a packaging mistake the
172
- * loader treats as a hard error — an error the project did not ask for and
173
- * cannot fix, so an ambiguous package is passed over here rather than allowed
174
- * to fail the load of a project that merely depends on it.
169
+ * @typedef {object} AutolinkCandidate
170
+ * @property {string} spec
171
+ * @property {string} field
172
+ * @property {string} packageDir
173
+ * @property {string} hostDir
174
+ * @property {boolean} [repeat] the directory is already loaded or already a
175
+ * candidate under another dependency key; it is not loaded again
176
+ */
177
+
178
+ /**
179
+ * Every declared dependency that ships exactly one root manifest, in
180
+ * declaration order, including the ones whose directory is already loaded or
181
+ * already a candidate (`repeat`), so a caller can account for each of them.
175
182
  *
176
183
  * @param {string} projectDir directory holding the project's package.json
177
184
  * @param {{exclude?: Iterable<string>}} [options] `exclude` — package
178
185
  * directories already loaded (from config); matched through symlinks
179
- * @returns {Array<{spec: string, field: string, packageDir: string, hostDir: string}>}
186
+ * @returns {AutolinkCandidate[]}
180
187
  */
181
- export function findAutolinkCandidates(projectDir, {exclude = []} = {}) {
188
+ export function scanAutolinkCandidates(projectDir, {exclude = []} = {}) {
182
189
  const taken = new Set([...exclude].map(realPath));
183
- /** @type {Array<{spec: string, field: string, packageDir: string, hostDir: string}>} */
190
+ /** @type {AutolinkCandidate[]} */
184
191
  const candidates = [];
185
192
 
186
193
  for (const {name, field} of readDeclaredDependencies(projectDir)) {
187
194
  const resolved = resolveInstalledPackageDir(name, projectDir);
188
195
  if (!resolved) continue;
189
196
 
197
+ if (findManifestPaths(resolved.packageDir).length !== 1) continue;
198
+
190
199
  // Two dependency keys can name one installed package — an npm alias beside
191
200
  // the package it aliases, or the two spellings of a package mid-rename
192
201
  // resolving through one store entry. Load it once.
193
202
  const identity = realPath(resolved.packageDir);
194
- if (taken.has(identity)) continue;
195
-
196
- if (findManifestPaths(resolved.packageDir).length !== 1) continue;
203
+ if (taken.has(identity)) {
204
+ candidates.push({spec: name, field, ...resolved, repeat: true});
205
+ continue;
206
+ }
197
207
 
198
208
  taken.add(identity);
199
209
  candidates.push({spec: name, field, ...resolved});
@@ -202,6 +212,100 @@ export function findAutolinkCandidates(projectDir, {exclude = []} = {}) {
202
212
  return candidates;
203
213
  }
204
214
 
215
+ /**
216
+ * Declared dependencies that ship an integration manifest and are not already
217
+ * loaded, in declaration order.
218
+ *
219
+ * A candidate must have EXACTLY ONE root manifest. Zero is the ordinary case
220
+ * (almost every dependency), and more than one is a packaging mistake the
221
+ * loader treats as a hard error — an error the project did not ask for and
222
+ * cannot fix, so an ambiguous package is passed over here rather than allowed
223
+ * to fail the load of a project that merely depends on it.
224
+ *
225
+ * @param {string} projectDir directory holding the project's package.json
226
+ * @param {{exclude?: Iterable<string>}} [options] `exclude` — package
227
+ * directories already loaded (from config); matched through symlinks
228
+ * @returns {Array<{spec: string, field: string, packageDir: string, hostDir: string}>}
229
+ */
230
+ export function findAutolinkCandidates(projectDir, options) {
231
+ return scanAutolinkCandidates(projectDir, options)
232
+ .filter(candidate => !candidate.repeat)
233
+ .map(({spec, field, packageDir, hostDir}) => ({
234
+ spec,
235
+ field,
236
+ packageDir,
237
+ hostDir,
238
+ }));
239
+ }
240
+
241
+ /**
242
+ * Load every autolink candidate, each in isolation, as provider candidates for
243
+ * {@link resolveProviders}. Nothing is filtered here: a candidate whose load
244
+ * throws or whose manifest fails comes back with its error, and a repeated
245
+ * directory comes back unloaded, so the resolver records each one.
246
+ *
247
+ * @param {object} options
248
+ * @param {string} options.projectDir directory holding the project's package.json
249
+ * @param {import('./integrations.mjs').LoadedIntegration[]} [options.loaded]
250
+ * integrations already loaded from config
251
+ * @param {boolean} [options.fresh]
252
+ * @returns {Promise<import('./provider-resolution.mjs').ProviderCandidate[]>}
253
+ */
254
+ export async function loadAutolinkCandidates({
255
+ projectDir,
256
+ loaded = [],
257
+ fresh = false,
258
+ }) {
259
+ const scanned = scanAutolinkCandidates(projectDir, {
260
+ // A configured entry that never resolved to a directory has none to exclude.
261
+ exclude: loaded.flatMap(integration =>
262
+ typeof integration.__packageDir === 'string'
263
+ ? [integration.__packageDir]
264
+ : [],
265
+ ),
266
+ });
267
+
268
+ /** @type {import('./provider-resolution.mjs').ProviderCandidate[]} */
269
+ const candidates = [];
270
+ for (const candidate of scanned) {
271
+ const {spec, packageDir} = candidate;
272
+ if (candidate.repeat) {
273
+ candidates.push({source: 'autolinked', spec, packageDir, repeat: true});
274
+ continue;
275
+ }
276
+ try {
277
+ // Resolve from the directory whose node_modules actually holds the
278
+ // package, so a hoisted dependency resolves the same way Node found it.
279
+ const [integration] = await loadIntegrations([spec], {
280
+ cwd: candidate.hostDir,
281
+ fresh,
282
+ });
283
+ candidates.push({
284
+ source: 'autolinked',
285
+ spec,
286
+ packageDir,
287
+ ...(integration == null
288
+ ? {}
289
+ : {
290
+ integration: {
291
+ ...integration,
292
+ __autolinked: true,
293
+ __dependencyField: candidate.field,
294
+ },
295
+ }),
296
+ });
297
+ } catch (error) {
298
+ candidates.push({
299
+ source: 'autolinked',
300
+ spec,
301
+ packageDir,
302
+ error: error instanceof Error ? error.message : String(error),
303
+ });
304
+ }
305
+ }
306
+ return candidates;
307
+ }
308
+
205
309
  /**
206
310
  * Load every declared dependency that ships an integration manifest and is not
207
311
  * already loaded from config.
@@ -216,6 +320,12 @@ export function findAutolinkCandidates(projectDir, {exclude = []} = {}) {
216
320
  * consuming project can neither fix nor silence, and which
217
321
  * `astryx doctor integration validate <package>` reports on demand.
218
322
  *
323
+ * One package reached twice (an alias beside the package it aliases, at the
324
+ * same version) loads once. The same name at another version is kept, so the
325
+ * provider pass reports it instead of dropping it. Project.load does not call
326
+ * this; it hands {@link loadAutolinkCandidates} to the resolver, whose ledger
327
+ * records every candidate dropped here.
328
+ *
219
329
  * @param {object} options
220
330
  * @param {string} options.projectDir directory holding the project's package.json
221
331
  * @param {import('./integrations.mjs').LoadedIntegration[]} [options.loaded]
@@ -228,45 +338,26 @@ export async function autolinkIntegrations({
228
338
  loaded = [],
229
339
  fresh = false,
230
340
  }) {
231
- const candidates = findAutolinkCandidates(projectDir, {
232
- exclude: loaded.map(integration => integration.__packageDir),
233
- });
234
-
341
+ const candidates = await loadAutolinkCandidates({projectDir, loaded, fresh});
342
+ const {ledger} = resolveProviders([
343
+ ...loaded.map(integration => ({
344
+ source: /** @type {const} */ ('configured'),
345
+ integration,
346
+ spec: integration.__spec,
347
+ })),
348
+ ...candidates,
349
+ ]);
235
350
  /** @type {import('./integrations.mjs').LoadedIntegration[]} */
236
351
  const autolinked = [];
237
- // One package reached twice (an alias beside the package it aliases, at the
238
- // same version) loads once. The same name at another version is kept, so the
239
- // provider-identity pass in Project.load reports it instead of dropping it.
240
- /** @param {{name: string, version?: string}} integration */
241
- const identity = integration =>
242
- `${integration.name}\u0000${integration.version ?? ''}`;
243
- const seen = new Set(loaded.map(identity));
244
-
245
- for (const candidate of candidates) {
246
- /** @type {import('./integrations.mjs').LoadedIntegration|undefined} */
247
- let integration;
248
- try {
249
- // Resolve from the directory whose node_modules actually holds the
250
- // package, so a hoisted dependency resolves the same way Node found it.
251
- [integration] = await loadIntegrations([candidate.spec], {
252
- cwd: candidate.hostDir,
253
- fresh,
254
- });
255
- } catch {
256
- continue;
352
+ for (const entry of ledger.values()) {
353
+ const {candidate} = entry;
354
+ if (
355
+ candidate.source === 'autolinked' &&
356
+ candidate.integration != null &&
357
+ (entry.outcome === 'contributes' || entry.outcome === 'set-aside')
358
+ ) {
359
+ autolinked.push(candidate.integration);
257
360
  }
258
- if (!integration || integration.__loadError) continue;
259
- // Identity is the resolved package's own name and version, so an alias and
260
- // the package it aliases collapse here even when they are two directories
261
- // on disk.
262
- if (seen.has(identity(integration))) continue;
263
- seen.add(identity(integration));
264
- autolinked.push({
265
- ...integration,
266
- __autolinked: true,
267
- __dependencyField: candidate.field,
268
- });
269
361
  }
270
-
271
362
  return autolinked;
272
363
  }
@@ -87,7 +87,7 @@ function installPackage(
87
87
  fs.mkdirSync(componentsDir, {recursive: true});
88
88
  fs.writeFileSync(
89
89
  path.join(componentsDir, `${componentName}.doc.mjs`),
90
- `export const docs = {name: '${componentName}', usage: {description: 'A widget'}};\n`,
90
+ `export default {type: 'component', name: '${componentName}', usage: {description: 'A widget'}, props: []};\n`,
91
91
  );
92
92
  fs.writeFileSync(
93
93
  path.join(componentsDir, `${componentName}.tsx`),
@@ -0,0 +1,45 @@
1
+ // @generated by scripts/sync-api-types.mjs from the JSDoc in foundation/**/*.mjs.
2
+ // DO NOT EDIT — run `pnpm sync:api-types` to regenerate.
3
+
4
+ /**
5
+ * The lowest version a semver range admits: the least of its `||`
6
+ * alternatives. Null when an alternative has no lower bound, or the range is
7
+ * not one this can read, so the caller treats it as admitting every version.
8
+ * @param {unknown} range
9
+ * @returns {string | null}
10
+ */
11
+ export function lowestAdmitted(range: unknown): string | null;
12
+ /**
13
+ * Why a package that ships a namespace doc or a placed guide would lose its
14
+ * docs on an older CLI, or null when its declared CLI range admits only CLIs
15
+ * that read the docs tree. Published 0.6.3 hides every topic of a package
16
+ * with a namespace doc; builds of main before the docs tree also do so for a
17
+ * placed guide.
18
+ * @param {any} pkg package.json
19
+ * @returns {string | null}
20
+ */
21
+ export function docsTreeCliProblem(pkg: any): string | null;
22
+ /**
23
+ * Why a package with a template that sets `replaces` would lose its templates
24
+ * and doc topics on an older CLI (spec:AST-035), or null when its declared CLI
25
+ * range admits only CLIs that read the field.
26
+ * @param {any} pkg package.json
27
+ * @returns {string | null}
28
+ */
29
+ export function replacesCliProblem(pkg: any): string | null;
30
+ /**
31
+ * The package.json with a CLI peer that reads namespace docs: optional, unless
32
+ * the package already says otherwise.
33
+ * @param {any} pkg package.json
34
+ * @returns {any}
35
+ */
36
+ export function withDocsTreeCli(pkg: any): any;
37
+ export const CLI_PACKAGE: "@astryxdesign/cli";
38
+ /**
39
+ * The first CLI release that reads an integration's docs tree (namespace docs
40
+ * and placed guides) and its templates' `replaces`. A release before it can
41
+ * hide every doc topic a package with a namespace doc or a placed guide
42
+ * ships, with no warning, and it rejects `replaces` and withholds the
43
+ * package's templates and doc topics.
44
+ */
45
+ export const DOCS_TREE_CLI: "0.7.0";
@@ -0,0 +1,154 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file The CLI an integration's namespace docs need (spec:AST-046 FR11).
5
+ *
6
+ * @input A package.json object.
7
+ * @output Whether its `peerDependencies` range for `@astryxdesign/cli` admits
8
+ * only CLIs that read namespace docs, and the package.json that declares it.
9
+ * @position foundation/integrations; read by `integration add doc --parent`,
10
+ * which declares the peer, and `integration pack --check`, which requires it.
11
+ */
12
+
13
+ import {semverCompare} from '../env/semver.mjs';
14
+
15
+ export const CLI_PACKAGE = '@astryxdesign/cli';
16
+
17
+ /**
18
+ * The first CLI release that reads an integration's docs tree (namespace docs
19
+ * and placed guides) and its templates' `replaces`. A release before it can
20
+ * hide every doc topic a package with a namespace doc or a placed guide
21
+ * ships, with no warning, and it rejects `replaces` and withholds the
22
+ * package's templates and doc topics.
23
+ */
24
+ export const DOCS_TREE_CLI = '0.7.0';
25
+
26
+ const VERSION_RE = /^v?(\d+|[xX*])(?:\.(\d+|[xX*]))?(?:\.(\d+|[xX*]))?(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/;
27
+
28
+ /**
29
+ * A version or partial version as MAJOR.MINOR.PATCH, a wildcard part as 0.
30
+ * @param {string} text
31
+ * @returns {string | null}
32
+ */
33
+ function lowerVersion(text) {
34
+ const m = VERSION_RE.exec(text.trim());
35
+ if (!m) return null;
36
+ return [m[1], m[2], m[3]]
37
+ .map(part => (part == null || /^[xX*]$/.test(part) ? '0' : part))
38
+ .join('.');
39
+ }
40
+
41
+ /**
42
+ * The lowest version one space-joined comparator set admits, or null when it
43
+ * has no lower bound this can read.
44
+ * @param {string} set
45
+ * @returns {string | null}
46
+ */
47
+ function lowestOfSet(set) {
48
+ if (set === '' || set === '*' || /^[xX]$/.test(set)) return null;
49
+ const hyphen = /^(\S+)\s+-\s+\S+$/.exec(set);
50
+ if (hyphen) return lowerVersion(hyphen[1]);
51
+ /** @type {string | null} */
52
+ let lowest = null;
53
+ for (const comparator of set.split(/\s+/)) {
54
+ const m = /^(>=|<=|>|<|=|\^|~)?(.+)$/.exec(comparator);
55
+ if (!m) return null;
56
+ if (m[1] === '<' || m[1] === '<=') continue;
57
+ const version = lowerVersion(m[2]);
58
+ if (version == null) return null;
59
+ if (lowest == null || semverCompare(version, lowest) > 0) lowest = version;
60
+ }
61
+ return lowest;
62
+ }
63
+
64
+ /**
65
+ * The lowest version a semver range admits: the least of its `||`
66
+ * alternatives. Null when an alternative has no lower bound, or the range is
67
+ * not one this can read, so the caller treats it as admitting every version.
68
+ * @param {unknown} range
69
+ * @returns {string | null}
70
+ */
71
+ export function lowestAdmitted(range) {
72
+ if (typeof range !== 'string') return null;
73
+ /** @type {string | null} */
74
+ let lowest = null;
75
+ for (const alternative of range.split('||')) {
76
+ const low = lowestOfSet(alternative.trim());
77
+ if (low == null) return null;
78
+ if (lowest == null || semverCompare(low, lowest) < 0) lowest = low;
79
+ }
80
+ return lowest;
81
+ }
82
+
83
+ /**
84
+ * Why a package that uses a feature an older CLI cannot read would lose it,
85
+ * or null when its declared CLI range admits only CLIs that read it.
86
+ * @param {any} pkg package.json
87
+ * @param {string} feature what the package does, e.g. "ships a namespace doc"
88
+ * @param {string} loss what an older CLI does with it
89
+ * @returns {string | null}
90
+ */
91
+ function cliRangeProblem(pkg, feature, loss) {
92
+ const range = pkg?.peerDependencies?.[CLI_PACKAGE];
93
+ const fix = `"${CLI_PACKAGE}": ">=${DOCS_TREE_CLI}" in peerDependencies (optional in peerDependenciesMeta, if the CLI is not required)`;
94
+ if (typeof range !== 'string') {
95
+ return `The package ${feature} but declares no ${CLI_PACKAGE} peer. A CLI older than ${DOCS_TREE_CLI} ${loss}. Declare ${fix}.`;
96
+ }
97
+ const lowest = lowestAdmitted(range);
98
+ if (lowest == null || semverCompare(lowest, DOCS_TREE_CLI) < 0) {
99
+ return `The package ${feature}, but its ${CLI_PACKAGE} peer range "${range}" admits a CLI older than ${DOCS_TREE_CLI}, which ${loss}. Declare ${fix}.`;
100
+ }
101
+ return null;
102
+ }
103
+
104
+ /**
105
+ * Why a package that ships a namespace doc or a placed guide would lose its
106
+ * docs on an older CLI, or null when its declared CLI range admits only CLIs
107
+ * that read the docs tree. Published 0.6.3 hides every topic of a package
108
+ * with a namespace doc; builds of main before the docs tree also do so for a
109
+ * placed guide.
110
+ * @param {any} pkg package.json
111
+ * @returns {string | null}
112
+ */
113
+ export function docsTreeCliProblem(pkg) {
114
+ return cliRangeProblem(
115
+ pkg,
116
+ 'ships a namespace doc or a placed guide',
117
+ 'does not read the docs tree, and can hide every doc topic the package ships',
118
+ );
119
+ }
120
+
121
+ /**
122
+ * Why a package with a template that sets `replaces` would lose its templates
123
+ * and doc topics on an older CLI (spec:AST-035), or null when its declared CLI
124
+ * range admits only CLIs that read the field.
125
+ * @param {any} pkg package.json
126
+ * @returns {string | null}
127
+ */
128
+ export function replacesCliProblem(pkg) {
129
+ return cliRangeProblem(
130
+ pkg,
131
+ 'has a template that sets `replaces`',
132
+ "rejects the field, and withholds the package's templates and doc topics",
133
+ );
134
+ }
135
+
136
+ /**
137
+ * The package.json with a CLI peer that reads namespace docs: optional, unless
138
+ * the package already says otherwise.
139
+ * @param {any} pkg package.json
140
+ * @returns {any}
141
+ */
142
+ export function withDocsTreeCli(pkg) {
143
+ const meta = pkg.peerDependenciesMeta ?? {};
144
+ return {
145
+ ...pkg,
146
+ peerDependencies: {
147
+ ...(pkg.peerDependencies ?? {}),
148
+ [CLI_PACKAGE]: `>=${DOCS_TREE_CLI}`,
149
+ },
150
+ peerDependenciesMeta: meta[CLI_PACKAGE]
151
+ ? meta
152
+ : {...meta, [CLI_PACKAGE]: {optional: true}},
153
+ };
154
+ }
@@ -0,0 +1,84 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ import {describe, expect, it} from 'vitest';
4
+ import {
5
+ DOCS_TREE_CLI,
6
+ lowestAdmitted,
7
+ docsTreeCliProblem,
8
+ replacesCliProblem,
9
+ withDocsTreeCli,
10
+ } from './cli-requirement.mjs';
11
+
12
+ describe('lowestAdmitted', () => {
13
+ it.each([
14
+ ['>=0.7.0', '0.7.0'],
15
+ ['^0.6.0', '0.6.0'],
16
+ ['~0.7.1', '0.7.1'],
17
+ ['0.7.x', '0.7.0'],
18
+ ['>=0.7.0 <0.8.0', '0.7.0'],
19
+ ['^0.6.0 || >=0.7.0', '0.6.0'],
20
+ ['0.8.0 - 0.9.0', '0.8.0'],
21
+ ['*', null],
22
+ ['<1.0.0', null],
23
+ ['latest', null],
24
+ ['workspace:*', null],
25
+ ])('%s admits %s at the lowest', (range, lowest) => {
26
+ expect(lowestAdmitted(range)).toBe(lowest);
27
+ });
28
+ });
29
+
30
+ describe('docsTreeCliProblem', () => {
31
+ it('asks for a CLI peer when there is none', () => {
32
+ expect(docsTreeCliProblem({name: '@acme/kit'})).toContain(
33
+ 'declares no @astryxdesign/cli peer',
34
+ );
35
+ });
36
+
37
+ it.each(['^0.6.0', '^0.6.0 || >=0.7.0', '*', '>=0.6.3'])(
38
+ 'refuses %s, which admits a CLI that cannot read a namespace doc',
39
+ range => {
40
+ expect(
41
+ docsTreeCliProblem({peerDependencies: {'@astryxdesign/cli': range}}),
42
+ ).toContain('admits a CLI older than');
43
+ },
44
+ );
45
+
46
+ it.each(['>=0.7.0', '^0.7.2', '>=0.7.0 <2'])('accepts %s', range => {
47
+ expect(
48
+ docsTreeCliProblem({peerDependencies: {'@astryxdesign/cli': range}}),
49
+ ).toBeNull();
50
+ });
51
+
52
+ it('declares the peer as optional, and keeps what the package says of it', () => {
53
+ const declared = withDocsTreeCli({name: '@acme/kit'});
54
+ expect(declared.peerDependencies).toEqual({
55
+ '@astryxdesign/cli': `>=${DOCS_TREE_CLI}`,
56
+ });
57
+ expect(declared.peerDependenciesMeta).toEqual({
58
+ '@astryxdesign/cli': {optional: true},
59
+ });
60
+ expect(docsTreeCliProblem(declared)).toBeNull();
61
+ const required = withDocsTreeCli({
62
+ peerDependencies: {react: '^19.0.0', '@astryxdesign/cli': '^0.6.0'},
63
+ peerDependenciesMeta: {'@astryxdesign/cli': {optional: false}},
64
+ });
65
+ expect(required.peerDependencies.react).toBe('^19.0.0');
66
+ expect(required.peerDependenciesMeta['@astryxdesign/cli']).toEqual({
67
+ optional: false,
68
+ });
69
+ });
70
+ });
71
+
72
+ describe('replacesCliProblem', () => {
73
+ it('asks a package that sets replaces for a CLI that reads the field', () => {
74
+ expect(replacesCliProblem({name: '@acme/kit'})).toContain(
75
+ 'sets `replaces`',
76
+ );
77
+ expect(
78
+ replacesCliProblem({peerDependencies: {'@astryxdesign/cli': '^0.6.0'}}),
79
+ ).toContain('admits a CLI older than');
80
+ expect(
81
+ replacesCliProblem({peerDependencies: {'@astryxdesign/cli': '>=0.7.0'}}),
82
+ ).toBeNull();
83
+ });
84
+ });