@astryxdesign/cli 0.6.3 → 0.6.4-canary.10dd683

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 (643) hide show
  1. package/CHANGELOG.md +194 -0
  2. package/README.md +117 -78
  3. package/api/blog/blog.doc.mjs +1 -0
  4. package/api/build/_adapter.d.mts +50 -0
  5. package/api/build/_adapter.mjs +60 -0
  6. package/api/build/build.doc.mjs +16 -9
  7. package/api/build/build.test.mjs +197 -8
  8. package/api/build/build.type.d.mts +91 -2
  9. package/api/build/build.type.mjs +52 -8
  10. package/api/build/help/help.d.mts +12 -5
  11. package/api/build/help/help.mjs +69 -6
  12. package/api/build/kit/kit.d.mts +4 -1
  13. package/api/build/kit/kit.mjs +165 -49
  14. package/api/build/kit/rank.d.mts +44 -0
  15. package/api/build/kit/rank.mjs +432 -0
  16. package/api/build/kit/rank.test.mjs +196 -0
  17. package/api/component/_adapter.d.mts +6 -12
  18. package/api/component/_adapter.mjs +20 -10
  19. package/api/component/component.doc.mjs +13 -3
  20. package/api/component/component.mjs +91 -14
  21. package/api/component/component.test.mjs +38 -0
  22. package/api/component/component.type.d.mts +22 -11
  23. package/api/component/component.type.mjs +32 -24
  24. package/api/component/detail/blocks/blocks.d.mts +2 -1
  25. package/api/component/detail/blocks/blocks.mjs +4 -3
  26. package/api/component/list/list.d.mts +0 -5
  27. package/api/component/list/list.mjs +40 -11
  28. package/api/discover/_adapter.d.mts +114 -6
  29. package/api/discover/_adapter.mjs +372 -17
  30. package/api/discover/_adapter.test.mjs +215 -0
  31. package/api/discover/_catalog-view.d.mts +115 -0
  32. package/api/discover/_catalog-view.mjs +203 -0
  33. package/api/discover/_catalog-view.test.mjs +128 -0
  34. package/api/discover/detail/detail.d.mts +18 -6
  35. package/api/discover/detail/detail.mjs +67 -13
  36. package/api/discover/detail/detail.test.mjs +85 -0
  37. package/api/discover/detail/item/item.d.mts +26 -0
  38. package/api/discover/detail/item/item.mjs +78 -0
  39. package/api/discover/detail/item/item.test.mjs +73 -0
  40. package/api/discover/discover.d.mts +3 -9
  41. package/api/discover/discover.doc.mjs +62 -18
  42. package/api/discover/discover.mjs +220 -36
  43. package/api/discover/discover.test.mjs +11 -2
  44. package/api/discover/discover.type.d.mts +150 -11
  45. package/api/discover/discover.type.mjs +107 -17
  46. package/api/discover/list/list.d.mts +20 -6
  47. package/api/discover/list/list.mjs +45 -12
  48. package/api/discover/list/list.test.mjs +46 -0
  49. package/api/discover/search/search.d.mts +18 -16
  50. package/api/discover/search/search.mjs +102 -56
  51. package/api/discover/search/search.test.mjs +144 -10
  52. package/api/docs/_adapter.d.mts +272 -41
  53. package/api/docs/_adapter.mjs +985 -108
  54. package/api/docs/compiled-topics.test.mjs +78 -0
  55. package/api/docs/detail/detail.mjs +22 -63
  56. package/api/docs/detail/section/section.d.mts +1 -1
  57. package/api/docs/detail/section/section.mjs +54 -19
  58. package/api/docs/detail/section/section.test.mjs +50 -0
  59. package/api/docs/docs.d.mts +10 -3
  60. package/api/docs/docs.doc.mjs +55 -16
  61. package/api/docs/docs.mjs +53 -10
  62. package/api/docs/docs.test.mjs +164 -4
  63. package/api/docs/docs.type.d.mts +221 -5
  64. package/api/docs/docs.type.mjs +153 -11
  65. package/api/docs/index/index.d.mts +18 -0
  66. package/api/docs/index/index.mjs +40 -0
  67. package/api/docs/index/index.test.mjs +62 -0
  68. package/api/docs/integration-tree.test.mjs +555 -0
  69. package/api/docs/integrationDocs.test.mjs +114 -8
  70. package/api/docs/list/list.mjs +28 -12
  71. package/api/docs/node/node.d.mts +43 -0
  72. package/api/docs/node/node.mjs +192 -0
  73. package/api/docs/reference-blocks.test.mjs +406 -0
  74. package/api/doctor/doctor.d.mts +99 -1
  75. package/api/doctor/doctor.doc.mjs +1 -0
  76. package/api/doctor/doctor.mjs +548 -1
  77. package/api/doctor/doctor.test.mjs +610 -1
  78. package/api/gap-report/gap-report.doc.mjs +8 -4
  79. package/api/hook/_adapter.mjs +19 -5
  80. package/api/hook/hook.doc.mjs +1 -0
  81. package/api/hook/hook.type.d.mts +3 -3
  82. package/api/hook/hook.type.mjs +11 -11
  83. package/api/hook/list/list.d.mts +2 -2
  84. package/api/hook/list/list.mjs +69 -17
  85. package/api/index.d.mts +1 -1
  86. package/api/index.mjs +1 -0
  87. package/api/init/init.doc.mjs +6 -1
  88. package/api/init/init.test.mjs +41 -1
  89. package/api/init/remove/remove.mjs +1 -1
  90. package/api/init/run/run.mjs +20 -10
  91. package/api/integration/add-contribution.component-names.test.mjs +120 -0
  92. package/api/integration/add-contribution.d.mts +2 -1
  93. package/api/integration/add-contribution.mjs +130 -15
  94. package/api/integration/add-contribution.test.mjs +258 -7
  95. package/api/integration/add-helpers.d.mts +5 -2
  96. package/api/integration/add-helpers.mjs +36 -9
  97. package/api/integration/add-theme.mjs +34 -64
  98. package/api/integration/add-theme.test.mjs +105 -21
  99. package/api/integration/authoring-checks.mjs +138 -28
  100. package/api/integration/authoring-checks.test.mjs +179 -7
  101. package/api/integration/authoring-checks.type.mjs +6 -1
  102. package/api/integration/integration-authoring.type.d.mts +3 -1
  103. package/api/integration/integration-authoring.type.mjs +2 -0
  104. package/api/integration/integration-block-exports.test.mjs +10 -6
  105. package/api/integration/integrationAdd.doc.mjs +14 -4
  106. package/api/integration/integrationAddAgentDoc.doc.mjs +1 -0
  107. package/api/integration/integrationAddCodemod.doc.mjs +1 -0
  108. package/api/integration/integrationAddComponent.doc.mjs +2 -1
  109. package/api/integration/integrationAddDoc.doc.mjs +8 -1
  110. package/api/integration/integrationAddTemplate.doc.mjs +1 -0
  111. package/api/integration/integrationAddTheme.doc.mjs +6 -5
  112. package/api/integration/integrationComponentConflicts.doc.mjs +1 -0
  113. package/api/integration/integrationDocConflicts.doc.mjs +2 -1
  114. package/api/integration/integrationPackCheck.doc.mjs +2 -1
  115. package/api/integration/integrationTemplateConflicts.doc.d.mts +3 -0
  116. package/api/integration/integrationTemplateConflicts.doc.mjs +4 -0
  117. package/api/integration/pack-check.mjs +83 -7
  118. package/api/integration/pack-check.test.mjs +387 -47
  119. package/api/integration/pack-check.type.d.mts +26 -2
  120. package/api/integration/pack-check.type.mjs +14 -1
  121. package/api/integration/summarizeIssues.doc.mjs +1 -0
  122. package/api/integration/template-conflict-compatibility.test.mjs +73 -0
  123. package/api/integration/validate-integration-fixes.test.mjs +1389 -0
  124. package/api/integration/validate-integration.mjs +52 -102
  125. package/api/integration/validate-integration.test.mjs +179 -26
  126. package/api/integration/validate-unread-theme-folders.test.mjs +110 -0
  127. package/api/integration/validateIntegration.doc.mjs +3 -2
  128. package/api/json/assertResponse.doc.mjs +1 -0
  129. package/api/json/envelope-types.test.mjs +76 -0
  130. package/api/json/index.ts +2 -0
  131. package/api/json/isError.doc.mjs +1 -0
  132. package/api/json/parseResponse.doc.mjs +3 -2
  133. package/api/layout/_adapter.mjs +20 -5
  134. package/api/layout/expand/expand.mjs +7 -5
  135. package/api/layout/expand/expand.path-safety.test.mjs +53 -0
  136. package/api/layout/grammar/grammar.mjs +2 -1
  137. package/api/layout/layoutCheck.doc.mjs +1 -0
  138. package/api/layout/layoutExpand.doc.mjs +2 -1
  139. package/api/layout/layoutGrammar.doc.mjs +1 -0
  140. package/api/search/search-return-type.test.mjs +54 -0
  141. package/api/search/search.d.mts +62 -11
  142. package/api/search/search.doc.mjs +8 -2
  143. package/api/search/search.mjs +471 -83
  144. package/api/search/search.test.mjs +124 -1
  145. package/api/search/search.type.d.mts +15 -3
  146. package/api/search/search.type.mjs +5 -2
  147. package/api/swizzle/copy/copy.mjs +28 -11
  148. package/api/swizzle/swizzle.doc.mjs +2 -1
  149. package/api/swizzle/swizzle.type.d.mts +2 -2
  150. package/api/swizzle/swizzle.type.mjs +2 -2
  151. package/api/template/copy/copy.mjs +17 -23
  152. package/api/template/copy/copy.test.mjs +17 -0
  153. package/api/template/list/list.mjs +1 -0
  154. package/api/template/table-floating-bulk-actions.test.mjs +66 -0
  155. package/api/template/template-integration.test.mjs +1072 -3
  156. package/api/template/template-suffix.test.mjs +41 -21
  157. package/api/template/template.d.mts +1 -1
  158. package/api/template/template.doc.mjs +30 -8
  159. package/api/template/template.mjs +45 -8
  160. package/api/template/template.type.d.mts +12 -14
  161. package/api/template/template.type.mjs +15 -14
  162. package/api/theme/_adapter.d.mts +2 -3
  163. package/api/theme/_adapter.mjs +4 -5
  164. package/api/theme/add/add.binary.test.mjs +84 -0
  165. package/api/theme/add/add.mjs +31 -22
  166. package/api/theme/add/add.rollback.test.mjs +158 -0
  167. package/api/theme/add/add.staging.test.mjs +83 -0
  168. package/api/theme/add/add.test.mjs +14 -1
  169. package/api/theme/build/build.family.test.mjs +7 -12
  170. package/api/theme/build/build.mjs +140 -59
  171. package/api/theme/build/build.public-component-vars.test.mjs +1 -1
  172. package/api/theme/build/build.receipt-doc.test.mjs +111 -0
  173. package/api/theme/build/build.rollback.test.mjs +148 -0
  174. package/api/theme/build/build.test.mjs +127 -0
  175. package/api/theme/build/font-warning.mjs +3 -3
  176. package/api/theme/build/font-warning.test.mjs +5 -2
  177. package/api/theme/generateTonalPalette.doc.mjs +1 -0
  178. package/api/theme/integration-themes.test.mjs +39 -28
  179. package/api/theme/list/list.test.mjs +19 -20
  180. package/api/theme/listThemes.doc.mjs +6 -5
  181. package/api/theme/palette/generate/generate.mjs +8 -3
  182. package/api/theme/palette/generate/generate.test.mjs +96 -0
  183. package/api/theme/palette/generate/generator.d.mts +10 -13
  184. package/api/theme/palette/generate/generator.mjs +15 -4
  185. package/api/theme/palette/generate/generator.test.mjs +10 -0
  186. package/api/theme/template/template.mjs +11 -2
  187. package/api/theme/template/template.test.mjs +20 -0
  188. package/api/theme/theme.type.d.mts +170 -11
  189. package/api/theme/theme.type.mjs +94 -27
  190. package/api/theme/themeAdd.doc.mjs +4 -3
  191. package/api/theme/themeBuild.doc.mjs +8 -4
  192. package/api/theme/themeList.doc.mjs +6 -3
  193. package/api/theme/themeListAvailable.doc.mjs +5 -3
  194. package/api/theme/themePaletteGenerate.doc.mjs +1 -0
  195. package/api/theme/themeTargets.doc.mjs +1 -0
  196. package/api/theme/themeTemplate.doc.mjs +6 -2
  197. package/api/upgrade/_adapter.d.mts +32 -5
  198. package/api/upgrade/_adapter.mjs +139 -22
  199. package/api/upgrade/list/list.mjs +2 -1
  200. package/api/upgrade/list/list.test.mjs +73 -0
  201. package/api/upgrade/project-context.test.mjs +272 -0
  202. package/api/upgrade/provider-agreement.test.mjs +152 -0
  203. package/api/upgrade/run/run.mjs +356 -59
  204. package/api/upgrade/status/status.mjs +2 -2
  205. package/api/upgrade/upgrade.doc.mjs +12 -5
  206. package/api/upgrade/upgrade.type.d.mts +43 -5
  207. package/api/upgrade/upgrade.type.mjs +27 -11
  208. package/assets/codemods/__tests__/registry.test.mjs +1 -0
  209. package/assets/codemods/__tests__/runner.test.mjs +330 -8
  210. package/assets/codemods/integration-discovery.mjs +48 -4
  211. package/assets/codemods/integration-discovery.test.mjs +73 -0
  212. package/assets/codemods/integration-runner.mjs +56 -4
  213. package/assets/codemods/integration-runner.protection.test.mjs +153 -0
  214. package/assets/codemods/registry.mjs +1 -0
  215. package/assets/codemods/run-codemod.mjs +177 -34
  216. package/assets/codemods/runner.mjs +350 -102
  217. package/assets/codemods/term-log.mjs +32 -8
  218. package/assets/codemods/term-log.test.mjs +19 -1
  219. package/assets/codemods/transform-prop.mjs +109 -0
  220. package/assets/codemods/transform-prop.test.mjs +95 -0
  221. package/assets/codemods/transforms/v0.0.14/__tests__/rename-status-variants.test.mjs +86 -165
  222. package/assets/codemods/transforms/v0.0.14/rename-status-variants.mjs +72 -210
  223. package/assets/codemods/transforms/v0.1.8/__tests__/rename-avatar-size-scale.test.mjs +83 -115
  224. package/assets/codemods/transforms/v0.1.8/rename-avatar-size-scale.mjs +57 -186
  225. package/assets/codemods/transforms/v0.3.0/__tests__/unwrap-authoring-factories.test.mjs +27 -5
  226. package/assets/codemods/transforms/v0.3.0/unwrap-authoring-factories.mjs +20 -5
  227. package/assets/codemods/transforms/v0.6.0/__tests__/next-codemods.test.mjs +47 -0
  228. package/assets/codemods/transforms/v0.6.0/rename-resizable-pixel-bounds.mjs +57 -10
  229. package/assets/codemods/transforms/v0.6.4/__tests__/migrate-native-picker-to-presentation.test.mjs +63 -0
  230. package/assets/codemods/transforms/v0.6.4/__tests__/migrate-theme-catalog-to-descriptors.test.mjs +220 -0
  231. package/assets/codemods/transforms/v0.6.4/index.mjs +31 -0
  232. package/assets/codemods/transforms/v0.6.4/migrate-native-picker-to-presentation.mjs +148 -0
  233. package/assets/codemods/transforms/v0.6.4/migrate-theme-catalog-to-descriptors.mjs +141 -0
  234. package/assets/docs/README.md +9 -0
  235. package/assets/docs/authoring.doc.mjs +14 -0
  236. package/assets/docs/getting-started.doc.mjs +2 -2
  237. package/assets/docs/internationalization.doc.mjs +7 -5
  238. package/assets/docs/layout.doc.dense.mjs +2 -2
  239. package/assets/docs/layout.doc.mjs +1 -1
  240. package/assets/docs/principles.doc.mjs +6 -6
  241. package/assets/docs/styling-libraries.doc.mjs +4 -4
  242. package/assets/docs/styling.doc.mjs +4 -4
  243. package/assets/docs/theme.doc.mjs +5 -5
  244. package/assets/docs/tokens.doc.mjs +1 -1
  245. package/assets/docs/tree/api.doc.mjs +30 -0
  246. package/assets/docs/tree/cli.doc.mjs +23 -0
  247. package/assets/docs/tree/commands.doc.mjs +25 -0
  248. package/assets/docs/{cli-integrations.doc.mjs → tree/integrations.doc.mjs} +144 -26
  249. package/assets/docs/tree/integrations.test.mjs +62 -0
  250. package/assets/docs/tree/writing-docs.doc.mjs +286 -0
  251. package/assets/docs/working-with-ai.doc.mjs +4 -4
  252. package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.doc.mjs +1 -1
  253. package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.tsx +1 -3
  254. package/assets/templates/blocks/components/DateInput/DateInputDateRange.tsx +1 -1
  255. package/assets/templates/blocks/components/InternationalizationProvider/InternationalizationProvider01ShippedLocale.tsx +1 -1
  256. package/assets/templates/blocks/components/Item/ItemDocumentTabs.doc.mjs +14 -0
  257. package/assets/templates/blocks/components/Item/ItemDocumentTabs.tsx +100 -0
  258. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.doc.mjs +14 -0
  259. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.tsx +61 -0
  260. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.doc.mjs +14 -0
  261. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.tsx +126 -0
  262. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.doc.mjs +15 -0
  263. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.tsx +86 -0
  264. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.doc.mjs +14 -0
  265. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.tsx +99 -0
  266. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.doc.mjs +14 -0
  267. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.tsx +122 -0
  268. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.doc.mjs +14 -0
  269. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.tsx +95 -0
  270. package/assets/templates/blocks/components/Table/TableBulkActionsTable.doc.mjs +14 -0
  271. package/assets/templates/blocks/components/Table/TableBulkActionsTable.tsx +71 -0
  272. package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.doc.mjs +19 -0
  273. package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.tsx +139 -0
  274. package/assets/templates/blocks/components/TimeInput/TimeInputConstrained.tsx +1 -0
  275. package/assets/templates/blocks/components/Timer/TimerFormats.doc.mjs +14 -0
  276. package/assets/templates/blocks/components/Timer/TimerFormats.tsx +34 -0
  277. package/assets/templates/blocks/components/Timer/TimerInline.doc.mjs +14 -0
  278. package/assets/templates/blocks/components/Timer/TimerInline.tsx +14 -0
  279. package/assets/templates/blocks/components/Timer/TimerShowcase.doc.mjs +13 -0
  280. package/assets/templates/blocks/components/Timer/TimerShowcase.tsx +47 -0
  281. package/assets/templates/blocks/components/Timer/TimerTypography.doc.mjs +14 -0
  282. package/assets/templates/blocks/components/Timer/TimerTypography.tsx +31 -0
  283. package/assets/templates/blocks/components/Toolbar/ToolbarTableFilter.doc.mjs +19 -3
  284. package/assets/templates/blocks/components/Toolbar/ToolbarTableFilter.tsx +383 -65
  285. package/assets/templates/pages/table-tree/page.tsx +1704 -0
  286. package/assets/templates/pages/table-tree/template.doc.mjs +12 -0
  287. package/assets/templates/themes/butter/butterTheme.doc.mjs +11 -0
  288. package/assets/templates/themes/chocolate/chocolateTheme.doc.mjs +11 -0
  289. package/assets/templates/themes/gothic/gothicTheme.doc.mjs +11 -0
  290. package/assets/templates/themes/matcha/matchaTheme.doc.mjs +11 -0
  291. package/assets/templates/themes/neutral/neutralTheme.doc.mjs +11 -0
  292. package/assets/templates/themes/stone/stoneTheme.doc.mjs +11 -0
  293. package/assets/templates/themes/y2k/y2kTheme.doc.mjs +11 -0
  294. package/authoring/_shared/contract.ts +22 -0
  295. package/authoring/codemod/codemod.doc.mjs +7 -2
  296. package/authoring/codemod/parse.d.mts +8 -8
  297. package/authoring/codemod/parse.mjs +8 -6
  298. package/authoring/codemod/type.ts +12 -0
  299. package/authoring/config/config.doc.mjs +10 -2
  300. package/authoring/config/debug-composition.test.mjs +92 -0
  301. package/authoring/config/parse.d.mts +15 -13
  302. package/authoring/config/parse.mjs +27 -8
  303. package/authoring/config/parse.test.mjs +8 -0
  304. package/authoring/config/type.ts +29 -6
  305. package/authoring/debug/debug.doc.d.mts +11 -0
  306. package/authoring/debug/debug.doc.mjs +182 -0
  307. package/authoring/debug/parse.d.mts +8 -8
  308. package/authoring/debug/parse.mjs +3 -3
  309. package/authoring/discover/discover.doc.d.mts +13 -0
  310. package/authoring/discover/discover.doc.mjs +138 -0
  311. package/authoring/discover/parse.d.mts +24 -0
  312. package/authoring/discover/parse.mjs +128 -0
  313. package/authoring/discover/parse.test.mjs +124 -0
  314. package/authoring/discover/type.ts +87 -0
  315. package/authoring/doctypes/_schema.d.mts +790 -23
  316. package/authoring/doctypes/_schema.mjs +543 -39
  317. package/authoring/doctypes/base/graph-fields.doc.d.mts +9 -0
  318. package/authoring/doctypes/base/graph-fields.doc.mjs +64 -0
  319. package/authoring/doctypes/base/type.ts +41 -0
  320. package/authoring/doctypes/command/command.doc.mjs +4 -3
  321. package/authoring/doctypes/command/parse.d.mts +2 -2
  322. package/authoring/doctypes/command/parse.mjs +1 -1
  323. package/authoring/doctypes/command/type.ts +5 -4
  324. package/authoring/doctypes/component/component.doc.mjs +6 -3
  325. package/authoring/doctypes/component/parse.d.mts +2 -2
  326. package/authoring/doctypes/component/parse.mjs +1 -1
  327. package/authoring/doctypes/component/type.ts +6 -5
  328. package/authoring/doctypes/doctypes-new.test.mjs +48 -6
  329. package/authoring/doctypes/enum/enum.doc.mjs +1 -1
  330. package/authoring/doctypes/enum/parse.d.mts +2 -2
  331. package/authoring/doctypes/enum/parse.mjs +1 -1
  332. package/authoring/doctypes/enum/type.ts +4 -2
  333. package/authoring/doctypes/function/function.doc.mjs +7 -2
  334. package/authoring/doctypes/function/parse.d.mts +2 -2
  335. package/authoring/doctypes/function/parse.mjs +1 -1
  336. package/authoring/doctypes/function/type.ts +9 -4
  337. package/authoring/doctypes/hook/hook.doc.mjs +4 -0
  338. package/authoring/doctypes/hook/parse.d.mts +2 -2
  339. package/authoring/doctypes/hook/parse.mjs +1 -1
  340. package/authoring/doctypes/hook/type.ts +5 -4
  341. package/authoring/doctypes/legacy.d.mts +8 -6
  342. package/authoring/doctypes/legacy.mjs +5 -4
  343. package/authoring/doctypes/load-contract.test.mjs +233 -0
  344. package/authoring/doctypes/namespace/namespace.doc.d.mts +9 -0
  345. package/authoring/doctypes/namespace/namespace.doc.mjs +128 -0
  346. package/authoring/doctypes/namespace/parse.d.mts +12 -0
  347. package/authoring/doctypes/namespace/parse.mjs +25 -0
  348. package/authoring/doctypes/namespace/parse.test.mjs +163 -0
  349. package/authoring/doctypes/namespace/type.ts +74 -0
  350. package/authoring/doctypes/parse.d.mts +22 -18
  351. package/authoring/doctypes/parse.mjs +22 -11
  352. package/authoring/doctypes/parse.test.mjs +77 -3
  353. package/authoring/doctypes/reference/parse.d.mts +2 -2
  354. package/authoring/doctypes/reference/parse.mjs +8 -5
  355. package/authoring/doctypes/reference/reference.doc.mjs +48 -6
  356. package/authoring/doctypes/reference/type.ts +70 -7
  357. package/authoring/doctypes/schema/parse.d.mts +2 -2
  358. package/authoring/doctypes/schema/parse.mjs +1 -1
  359. package/authoring/doctypes/schema/schema.doc.mjs +1 -1
  360. package/authoring/doctypes/schema/type.ts +4 -4
  361. package/authoring/doctypes/template/parse.d.mts +94 -1
  362. package/authoring/doctypes/template/parse.mjs +40 -2
  363. package/authoring/doctypes/template/parse.test.mjs +26 -2
  364. package/authoring/doctypes/template/template.doc.mjs +13 -3
  365. package/authoring/doctypes/template/type.ts +13 -2
  366. package/authoring/doctypes/theme/parse.d.mts +35 -0
  367. package/authoring/doctypes/theme/parse.mjs +76 -0
  368. package/authoring/doctypes/theme/theme.doc.d.mts +9 -0
  369. package/authoring/doctypes/theme/theme.doc.mjs +79 -0
  370. package/authoring/doctypes/theme/type.ts +42 -0
  371. package/authoring/doctypes/types.ts +12 -10
  372. package/authoring/gap-report/gap-report.doc.d.mts +12 -0
  373. package/authoring/gap-report/gap-report.doc.mjs +183 -0
  374. package/authoring/gap-report/parse.d.mts +10 -10
  375. package/authoring/gap-report/parse.mjs +6 -6
  376. package/authoring/gap-report/type.ts +1 -1
  377. package/authoring/identity/identity.doc.d.mts +9 -0
  378. package/authoring/identity/identity.doc.mjs +61 -0
  379. package/authoring/identity/type.ts +132 -0
  380. package/authoring/index.d.mts +3 -0
  381. package/authoring/index.d.ts +62 -17
  382. package/authoring/index.mjs +4 -1
  383. package/authoring/integration/integration.doc.mjs +15 -8
  384. package/authoring/integration/parse.d.mts +2 -2
  385. package/authoring/integration/parse.mjs +1 -1
  386. package/authoring/integration/parse.test.mjs +10 -1
  387. package/authoring/integration/schema.d.mts +6 -4
  388. package/authoring/integration/schema.mjs +9 -3
  389. package/authoring/integration/type.ts +19 -8
  390. package/authoring/shadcn/receipt.d.mts +6 -6
  391. package/clients/cli/__tests__/cliManifest.test.ts +27 -29
  392. package/clients/cli/command-load-failure.test.mjs +83 -0
  393. package/clients/cli/commands/blog.doc.mjs +1 -1
  394. package/clients/cli/commands/blog.mjs +23 -8
  395. package/clients/cli/commands/blog.test.mjs +42 -1
  396. package/clients/cli/commands/build-theme.adaptations.test.mjs +100 -1
  397. package/clients/cli/commands/build-theme.ascii-output.test.mjs +161 -0
  398. package/clients/cli/commands/build-theme.flag-docs.test.mjs +110 -0
  399. package/clients/cli/commands/build-theme.mjs +16 -50
  400. package/clients/cli/commands/build-theme.path-safety.test.mjs +86 -1
  401. package/clients/cli/commands/build-theme.variants.test.mjs +76 -0
  402. package/clients/cli/commands/build.doc.mjs +16 -8
  403. package/clients/cli/commands/build.exit-codes-doc.test.mjs +50 -0
  404. package/clients/cli/commands/build.mjs +137 -114
  405. package/clients/cli/commands/build.playbook.test.mjs +75 -0
  406. package/clients/cli/commands/build.text-fields.test.mjs +81 -0
  407. package/clients/cli/commands/component/index.mjs +3 -8
  408. package/clients/cli/commands/component-ownership.test.mjs +3 -3
  409. package/clients/cli/commands/component-package.test.mjs +46 -0
  410. package/clients/cli/commands/component-resolution.test.mjs +21 -0
  411. package/clients/cli/commands/component.doc.mjs +1 -1
  412. package/clients/cli/commands/component.test.mjs +19 -0
  413. package/clients/cli/commands/detail-levels.test.mjs +2 -2
  414. package/clients/cli/commands/discover.broken-integration.test.mjs +52 -5
  415. package/clients/cli/commands/discover.components-flag.test.mjs +97 -0
  416. package/clients/cli/commands/discover.doc.mjs +55 -9
  417. package/clients/cli/commands/discover.mjs +393 -118
  418. package/clients/cli/commands/discover.sources.test.mjs +267 -0
  419. package/clients/cli/commands/discover.text-projection.test.mjs +103 -0
  420. package/clients/cli/commands/docs.doc.mjs +28 -6
  421. package/clients/cli/commands/docs.mjs +240 -26
  422. package/clients/cli/commands/docs.test.mjs +193 -1
  423. package/clients/cli/commands/doctor-integration-components.doc.mjs +1 -1
  424. package/clients/cli/commands/doctor-integration-docs.doc.mjs +3 -3
  425. package/clients/cli/commands/doctor-integration-templates.doc.mjs +15 -8
  426. package/clients/cli/commands/doctor-integration-validate.doc.mjs +1 -1
  427. package/clients/cli/commands/doctor-integration.doc.mjs +1 -1
  428. package/clients/cli/commands/doctor-integration.package-json.test.mjs +53 -0
  429. package/clients/cli/commands/doctor-integration.test.mjs +90 -8
  430. package/clients/cli/commands/doctor.doc.mjs +1 -1
  431. package/clients/cli/commands/doctor.mjs +59 -32
  432. package/clients/cli/commands/doctor.test.mjs +42 -0
  433. package/clients/cli/commands/gap-report.doc.mjs +17 -6
  434. package/clients/cli/commands/gap-report.test.mjs +72 -0
  435. package/clients/cli/commands/hook/index.mjs +7 -17
  436. package/clients/cli/commands/hook.doc.mjs +1 -1
  437. package/clients/cli/commands/hook.text-projection.test.mjs +45 -0
  438. package/clients/cli/commands/init.doc.mjs +20 -9
  439. package/clients/cli/commands/init.flag-help.test.mjs +153 -0
  440. package/clients/cli/commands/integration-add.controls.test.mjs +132 -0
  441. package/clients/cli/commands/integration-add.doc.mjs +32 -6
  442. package/clients/cli/commands/integration-authoring.test.mjs +13 -9
  443. package/clients/cli/commands/integration-pack.doc.mjs +1 -1
  444. package/clients/cli/commands/integration-real-world.test.mjs +3 -9
  445. package/clients/cli/commands/integration.doc.mjs +1 -1
  446. package/clients/cli/commands/integration.mjs +1 -0
  447. package/clients/cli/commands/interactive-guard.test.mjs +101 -24
  448. package/clients/cli/commands/json-contract.test.mjs +33 -0
  449. package/clients/cli/commands/layout-check.doc.mjs +15 -4
  450. package/clients/cli/commands/layout-expand.doc.mjs +22 -5
  451. package/clients/cli/commands/layout-grammar.doc.mjs +1 -1
  452. package/clients/cli/commands/layout.doc.mjs +3 -3
  453. package/clients/cli/commands/layout.mjs +21 -9
  454. package/clients/cli/commands/layout.path-help.test.mjs +33 -0
  455. package/clients/cli/commands/layout.stdin-cap.test.mjs +47 -0
  456. package/clients/cli/commands/layout.text-fields.test.mjs +39 -0
  457. package/clients/cli/commands/manifest.doc.mjs +1 -1
  458. package/clients/cli/commands/no-prompt-wording.test.mjs +94 -0
  459. package/clients/cli/commands/search.doc.mjs +7 -4
  460. package/clients/cli/commands/search.mjs +28 -9
  461. package/clients/cli/commands/search.test.mjs +75 -0
  462. package/clients/cli/commands/setup-nudge.test.mjs +6 -0
  463. package/clients/cli/commands/swizzle.doc.mjs +3 -2
  464. package/clients/cli/commands/swizzle.path-safety.test.mjs +42 -0
  465. package/clients/cli/commands/template.doc.mjs +52 -13
  466. package/clients/cli/commands/template.flag-help.test.mjs +117 -0
  467. package/clients/cli/commands/template.mjs +4 -91
  468. package/clients/cli/commands/template.path-help.test.mjs +40 -0
  469. package/clients/cli/commands/text-json-parity.test.mjs +719 -0
  470. package/clients/cli/commands/theme-add.doc.mjs +4 -3
  471. package/clients/cli/commands/theme-build.doc.mjs +8 -7
  472. package/clients/cli/commands/theme-list.doc.mjs +2 -2
  473. package/clients/cli/commands/theme-palette-generate.doc.mjs +9 -5
  474. package/clients/cli/commands/theme-palette-generate.test.mjs +19 -0
  475. package/clients/cli/commands/theme-palette.doc.mjs +1 -1
  476. package/clients/cli/commands/theme-targets.behavior.test.mjs +4 -3
  477. package/clients/cli/commands/theme-targets.doc.mjs +1 -1
  478. package/clients/cli/commands/theme-template.behavior.test.mjs +12 -0
  479. package/clients/cli/commands/theme-template.doc.mjs +2 -2
  480. package/clients/cli/commands/theme.doc.mjs +1 -1
  481. package/clients/cli/commands/upgrade.ascii-output.test.mjs +87 -0
  482. package/clients/cli/commands/upgrade.doc.mjs +22 -10
  483. package/clients/cli/commands/upgrade.file-protection.test.mjs +228 -0
  484. package/clients/cli/commands/upgrade.flag-help.test.mjs +188 -0
  485. package/clients/cli/commands/upgrade.hook-output.test.mjs +88 -0
  486. package/clients/cli/commands/upgrade.mjs +29 -7
  487. package/clients/cli/formatters/index.mjs +164 -1
  488. package/clients/cli/formatters/index.test.mjs +97 -0
  489. package/clients/cli/index.mjs +21 -30
  490. package/clients/cli/latest-version-env.test.mjs +50 -0
  491. package/clients/cli/lib/cli-error.test.mjs +7 -0
  492. package/clients/cli/lib/component-format.mjs +9 -9
  493. package/clients/cli/lib/component-format.test.mjs +1 -1
  494. package/clients/cli/lib/define-command.mjs +32 -6
  495. package/clients/cli/lib/doc-text-ascii.test.mjs +82 -0
  496. package/clients/cli/lib/exit-codes.test.mjs +97 -0
  497. package/clients/cli/lib/hook-format.mjs +19 -10
  498. package/clients/cli/lib/json-shim.mjs +38 -2
  499. package/clients/cli/lib/json-shim.test.mjs +83 -0
  500. package/clients/cli/lib/manifest.d.ts +2 -0
  501. package/clients/cli/lib/manifest.mjs +37 -2
  502. package/clients/cli/lib/manifest.test.mjs +17 -0
  503. package/foundation/agent-docs/agent-docs.d.mts +7 -2
  504. package/foundation/agent-docs/agent-docs.mjs +82 -12
  505. package/foundation/agent-docs/agent-docs.path-safety.test.mjs +266 -4
  506. package/foundation/agent-docs/agent-docs.test.mjs +19 -1
  507. package/foundation/config/integration-debug.test.mjs +28 -3
  508. package/foundation/config/project-themes.test.mjs +11 -19
  509. package/foundation/config/project.d.mts +20 -11
  510. package/foundation/config/project.mjs +263 -91
  511. package/foundation/config/project.test.mjs +270 -21
  512. package/foundation/discovery/authoring-self-docs.d.mts +87 -0
  513. package/foundation/discovery/authoring-self-docs.mjs +237 -0
  514. package/foundation/discovery/authoring-self-docs.test.mjs +170 -0
  515. package/foundation/discovery/authoring-surface.d.mts +74 -0
  516. package/foundation/discovery/authoring-surface.mjs +525 -0
  517. package/foundation/discovery/authoring-surface.test.mjs +392 -0
  518. package/foundation/discovery/cli-self-docs.d.mts +119 -0
  519. package/foundation/discovery/cli-self-docs.mjs +490 -0
  520. package/foundation/discovery/cli-self-docs.test.mjs +375 -0
  521. package/foundation/discovery/component-discovery.d.mts +39 -1
  522. package/foundation/discovery/component-discovery.mjs +50 -1
  523. package/foundation/discovery/component-loader.d.mts +35 -38
  524. package/foundation/discovery/component-loader.mjs +53 -222
  525. package/foundation/discovery/docs-discovery.d.mts +119 -11
  526. package/foundation/discovery/docs-discovery.mjs +423 -108
  527. package/foundation/discovery/docs-discovery.test.mjs +365 -20
  528. package/foundation/discovery/docs-output-budget.d.mts +28 -0
  529. package/foundation/discovery/docs-output-budget.mjs +50 -0
  530. package/foundation/discovery/docs-section-key.d.mts +116 -0
  531. package/foundation/discovery/docs-section-key.mjs +322 -0
  532. package/foundation/discovery/docs-section-key.test.mjs +246 -0
  533. package/foundation/discovery/template-adapter.d.mts +113 -11
  534. package/foundation/discovery/template-adapter.fixture-refs.test.mjs +248 -0
  535. package/foundation/discovery/template-adapter.integration-isolation.test.mjs +94 -0
  536. package/foundation/discovery/template-adapter.mjs +774 -83
  537. package/foundation/discovery/template-adapter.test.mjs +57 -0
  538. package/foundation/discovery/template-conflict-release.d.mts +13 -0
  539. package/foundation/discovery/template-conflict-release.mjs +40 -0
  540. package/foundation/discovery/template-conflict-release.test.mjs +40 -0
  541. package/foundation/discovery/theme-discovery.d.mts +67 -7
  542. package/foundation/discovery/theme-discovery.mjs +916 -186
  543. package/foundation/discovery/theme-discovery.test.mjs +613 -219
  544. package/foundation/discovery/theming-targets.test.mjs +4 -0
  545. package/foundation/doc-compiler/bundle.d.mts +47 -0
  546. package/foundation/doc-compiler/bundle.mjs +278 -0
  547. package/foundation/doc-compiler/bundle.test.mjs +266 -0
  548. package/foundation/doc-compiler/compile.d.mts +343 -0
  549. package/foundation/doc-compiler/compile.mjs +558 -0
  550. package/foundation/doc-compiler/diagnostics.d.mts +126 -0
  551. package/foundation/doc-compiler/diagnostics.mjs +305 -0
  552. package/foundation/doc-compiler/doc-compiler.test.mjs +714 -0
  553. package/foundation/doc-compiler/doc-loads.test.mjs +1642 -0
  554. package/foundation/doc-compiler/import.d.mts +24 -0
  555. package/foundation/doc-compiler/import.mjs +59 -0
  556. package/foundation/doc-compiler/inputs.d.mts +102 -0
  557. package/foundation/doc-compiler/inputs.mjs +291 -0
  558. package/foundation/doc-compiler/inputs.test.mjs +299 -0
  559. package/foundation/doc-compiler/ir.d.mts +22 -0
  560. package/foundation/doc-compiler/ir.mjs +471 -0
  561. package/foundation/doc-compiler/lenses.d.mts +36 -0
  562. package/foundation/doc-compiler/lenses.mjs +173 -0
  563. package/foundation/doc-compiler/links.d.mts +162 -0
  564. package/foundation/doc-compiler/links.mjs +294 -0
  565. package/foundation/doc-compiler/links.test.mjs +192 -0
  566. package/foundation/doc-compiler/lower-doc.test.mjs +495 -0
  567. package/foundation/doc-compiler/overlays.d.mts +37 -0
  568. package/foundation/doc-compiler/overlays.mjs +206 -0
  569. package/foundation/doc-compiler/parse-readable.d.mts +9 -0
  570. package/foundation/doc-compiler/parse-readable.mjs +29 -0
  571. package/foundation/doc-compiler/read.d.mts +127 -0
  572. package/foundation/doc-compiler/read.mjs +325 -0
  573. package/foundation/doc-compiler/read.test.mjs +313 -0
  574. package/foundation/doc-compiler/source.d.mts +33 -0
  575. package/foundation/doc-compiler/source.mjs +128 -0
  576. package/foundation/doc-compiler/tree.d.mts +288 -0
  577. package/foundation/doc-compiler/tree.mjs +876 -0
  578. package/foundation/doc-compiler/tree.test.mjs +598 -0
  579. package/foundation/fs/file-protection.d.mts +33 -0
  580. package/foundation/fs/file-protection.mjs +825 -0
  581. package/foundation/fs/file-protection.test.mjs +250 -0
  582. package/foundation/fs/module-loader.d.mts +1 -0
  583. package/foundation/fs/module-loader.mjs +50 -1
  584. package/foundation/fs/module-loader.stdout.test.mjs +332 -0
  585. package/foundation/fs/path-safety.d.mts +3 -2
  586. package/foundation/fs/path-safety.mjs +49 -19
  587. package/foundation/fs/path-safety.test.mjs +50 -0
  588. package/foundation/fs/publish-file-hardlink-unavailable.test.mjs +129 -94
  589. package/foundation/identity/provider-identity.d.mts +90 -0
  590. package/foundation/identity/provider-identity.mjs +320 -0
  591. package/foundation/identity/provider-identity.test.mjs +254 -0
  592. package/foundation/identity/providers.d.mts +7 -0
  593. package/foundation/identity/providers.mjs +16 -0
  594. package/foundation/integrations/autolink.d.mts +58 -1
  595. package/foundation/integrations/autolink.mjs +143 -45
  596. package/foundation/integrations/autolink.test.mjs +1 -1
  597. package/foundation/integrations/cli-requirement.d.mts +45 -0
  598. package/foundation/integrations/cli-requirement.mjs +154 -0
  599. package/foundation/integrations/cli-requirement.test.mjs +84 -0
  600. package/foundation/integrations/contribution-fixes.d.mts +145 -0
  601. package/foundation/integrations/contribution-fixes.mjs +1284 -0
  602. package/foundation/integrations/contribution-inventory.d.mts +3 -2
  603. package/foundation/integrations/contribution-inventory.mjs +27 -24
  604. package/foundation/integrations/contribution-inventory.test.mjs +86 -27
  605. package/foundation/integrations/integration-warnings.d.mts +9 -2
  606. package/foundation/integrations/integration-warnings.mjs +52 -21
  607. package/foundation/integrations/integration-warnings.test.mjs +74 -1
  608. package/foundation/integrations/integrations.d.mts +63 -3
  609. package/foundation/integrations/integrations.mjs +122 -9
  610. package/foundation/integrations/integrations.test.mjs +415 -1
  611. package/foundation/integrations/provider-conflicts.test.mjs +125 -0
  612. package/foundation/integrations/provider-ledger.test.mjs +275 -0
  613. package/foundation/integrations/provider-resolution.d.mts +152 -0
  614. package/foundation/integrations/provider-resolution.mjs +576 -0
  615. package/foundation/integrations/provider-resolution.test.mjs +369 -0
  616. package/foundation/integrations/theme-descriptor.d.mts +8 -0
  617. package/foundation/integrations/theme-descriptor.mjs +44 -0
  618. package/foundation/integrations/validate-contributions.d.mts +2 -0
  619. package/foundation/integrations/validate-contributions.mjs +131 -29
  620. package/foundation/response/base.d.ts +8 -4
  621. package/foundation/response/error-codes.d.mts +3 -1
  622. package/foundation/response/error-codes.d.ts +2 -0
  623. package/foundation/response/error-codes.doc.mjs +13 -4
  624. package/foundation/response/error-codes.mjs +8 -2
  625. package/foundation/response/error-codes.test.mjs +137 -10
  626. package/foundation/response/json-contract.test.mjs +57 -17
  627. package/foundation/response/json.d.mts +4 -2
  628. package/foundation/response/json.mjs +8 -10
  629. package/foundation/response/response-types.doc.d.mts +5 -1
  630. package/foundation/response/response-types.doc.mjs +41 -21
  631. package/foundation/response/response-types.doc.test.mjs +158 -0
  632. package/foundation/response/response.doc.mjs +1 -1
  633. package/foundation/text/string-utils.d.mts +8 -0
  634. package/foundation/text/string-utils.mjs +40 -10
  635. package/foundation/xle/expand.d.mts +2 -0
  636. package/foundation/xle/expand.mjs +4 -3
  637. package/foundation/xle/expand.test.mjs +54 -0
  638. package/foundation/xle/xle.test.mjs +13 -0
  639. package/package.json +10 -11
  640. package/assets/templates/themes/manifest.json +0 -95
  641. package/clients/cli/lib/update-check.mjs +0 -83
  642. package/clients/cli/lib/update-check.test.mjs +0 -137
  643. package/clients/cli/update-hint-commands.test.mjs +0 -54
@@ -31,7 +31,9 @@ function topic(fields) {
31
31
  name: 'deploying',
32
32
  title: 'Deploying',
33
33
  description: 'How to ship it.',
34
- sections: [{title: 'Overview', content: [{type: 'prose', text: 'Ship it.'}]}],
34
+ sections: [
35
+ {title: 'Overview', content: [{type: 'prose', text: 'Ship it.'}]},
36
+ ],
35
37
  ...fields,
36
38
  };
37
39
  }
@@ -72,16 +74,16 @@ describe('discoverBuiltinTopics', () => {
72
74
 
73
75
  describe('discoverIntegrationDocs', () => {
74
76
  it('contributes nothing when no docs root is declared or the root is gone', async () => {
75
- expect(await discoverIntegrationDocs({name: '@acme/widgets'})).toEqual({
76
- records: [],
77
- errors: [],
78
- });
77
+ const nothing = {records: [], errors: [], namespaces: [], guides: []};
78
+ expect(await discoverIntegrationDocs({name: '@acme/widgets'})).toEqual(
79
+ nothing,
80
+ );
79
81
  expect(
80
82
  await discoverIntegrationDocs({
81
83
  name: '@acme/widgets',
82
84
  docs: path.join(tmpDir, 'nope'),
83
85
  }),
84
- ).toEqual({records: [], errors: []});
86
+ ).toEqual(nothing);
85
87
  });
86
88
 
87
89
  it('reads every topic under the root, with what it declares', async () => {
@@ -97,7 +99,9 @@ describe('discoverIntegrationDocs', () => {
97
99
  }),
98
100
  );
99
101
  expect(errors).toEqual([]);
100
- expect(records.map(r => [r.name, r.package, r.replaces, r.extendsTopic])).toEqual([
102
+ expect(
103
+ records.map(r => [r.name, r.package, r.replaces, r.extendsTopic]),
104
+ ).toEqual([
101
105
  ['deploying', '@acme/widgets', undefined, undefined],
102
106
  ['getting-started', '@acme/widgets', 'getting-started', undefined],
103
107
  ['theme-extra', '@acme/widgets', undefined, 'theme'],
@@ -126,7 +130,9 @@ describe('discoverIntegrationDocs', () => {
126
130
 
127
131
  it('reports a doc that exports nothing, rather than skipping it silently', async () => {
128
132
  const {records, errors} = await discoverIntegrationDocs(
129
- integration('@acme/empty', {'deploying.doc.mjs': 'export const nope = 1;\n'}),
133
+ integration('@acme/empty', {
134
+ 'deploying.doc.mjs': 'export const nope = 1;\n',
135
+ }),
130
136
  );
131
137
  expect(records).toEqual([]);
132
138
  expect(errors).toHaveLength(1);
@@ -153,6 +159,88 @@ describe('discoverIntegrationDocs', () => {
153
159
  expect(records).toEqual([]);
154
160
  expect(errors[0].message).toContain('declares both');
155
161
  });
162
+
163
+ it('rejects graph blocks at the legacy topic-reader boundary', async () => {
164
+ const {records, errors} = await discoverIntegrationDocs(
165
+ integration('@acme/graph-block', {
166
+ 'deploying.doc.mjs': topic({
167
+ sections: [
168
+ {
169
+ id: 'steps',
170
+ title: 'Steps',
171
+ content: [
172
+ {type: 'collection', source: {slot: 'guides'}},
173
+ ],
174
+ },
175
+ ],
176
+ }),
177
+ }),
178
+ );
179
+ expect(records).toEqual([]);
180
+ expect(errors[0].message).toContain('Invalid discriminator value');
181
+ });
182
+
183
+ it('hands namespace docs and placed guides to the docs tree, by provider id', async () => {
184
+ const found = await discoverIntegrationDocs({
185
+ ...integration('@acme/namespace', {
186
+ 'guides.doc.mjs': {
187
+ type: 'namespace',
188
+ name: 'guides',
189
+ title: 'Guides',
190
+ summary: 'Every guide.',
191
+ slots: {guides: {title: 'Guides', accepts: {kinds: ['generic']}}},
192
+ },
193
+ 'setup.doc.mjs': topic({
194
+ name: 'setup',
195
+ title: 'Set up',
196
+ placement: {parent: 'namespace:guides', slot: 'guides', order: 1},
197
+ }),
198
+ 'deploying.doc.mjs': topic(),
199
+ }),
200
+ providerId: '@acme/tree-provider',
201
+ });
202
+ expect(found.errors).toEqual([]);
203
+ expect(found.records.map(record => record.name)).toEqual(['deploying']);
204
+ expect(found.records[0].providerId).toBe('@acme/tree-provider');
205
+ expect(found.namespaces).toMatchObject([
206
+ {
207
+ provider: '@acme/namespace',
208
+ providerId: '@acme/tree-provider',
209
+ source: '@acme/namespace/guides.doc.mjs',
210
+ doc: {name: 'guides'},
211
+ },
212
+ ]);
213
+ expect(found.guides).toMatchObject([
214
+ {
215
+ provider: '@acme/namespace',
216
+ providerId: '@acme/tree-provider',
217
+ kind: 'generic',
218
+ name: 'setup',
219
+ placement: {parent: 'namespace:guides', slot: 'guides', order: 1},
220
+ },
221
+ ]);
222
+ });
223
+
224
+ it('names what a namespace doc lacks, and refuses a placed guide that replaces a topic', async () => {
225
+ const {errors, namespaces, guides} = await discoverIntegrationDocs(
226
+ integration('@acme/namespace', {
227
+ 'guides.doc.mjs': {type: 'namespace', name: 'guides', title: 'Guides'},
228
+ 'setup.doc.mjs': topic({
229
+ name: 'setup',
230
+ replaces: 'getting-started',
231
+ placement: {parent: 'namespace:guides', slot: 'guides'},
232
+ }),
233
+ }),
234
+ );
235
+ expect(namespaces).toEqual([]);
236
+ expect(guides).toEqual([]);
237
+ expect(errors.map(error => error.message).join('\n')).toMatch(
238
+ /guides\.doc\.mjs.*slots/,
239
+ );
240
+ expect(errors.map(error => error.message).join('\n')).toContain(
241
+ 'is placed in the docs tree and also declares `replaces`',
242
+ );
243
+ });
156
244
  });
157
245
 
158
246
  describe('problemsInTopic', () => {
@@ -170,7 +258,11 @@ describe('problemsInTopic', () => {
170
258
  // A misspelled required field: the block renders nothing at all.
171
259
  expect(
172
260
  problemsInTopic(
173
- topic({sections: [{title: 'Overview', content: [{type: 'prose', txt: 'oops'}]}]}),
261
+ topic({
262
+ sections: [
263
+ {title: 'Overview', content: [{type: 'prose', txt: 'oops'}]},
264
+ ],
265
+ }),
174
266
  ),
175
267
  ).toEqual([
176
268
  'sections[0].content[0].text: required for a prose block',
@@ -180,7 +272,12 @@ describe('problemsInTopic', () => {
180
272
  expect(
181
273
  problemsInTopic(
182
274
  topic({
183
- sections: [{title: 'Overview', content: [{type: 'heading', level: 2, text: 'x'}]}],
275
+ sections: [
276
+ {
277
+ title: 'Overview',
278
+ content: [{type: 'heading', level: 2, text: 'x'}],
279
+ },
280
+ ],
184
281
  }),
185
282
  ),
186
283
  ).toContain('sections[0].content[0].level: 2 is not one of 3, 4, 5, 6');
@@ -196,11 +293,67 @@ describe('problemsInTopic', () => {
196
293
  ],
197
294
  }),
198
295
  ),
199
- ).toContain('sections[0].content[0].rows[0]: has 1 cells but the table has 2 headers');
296
+ ).toContain(
297
+ 'sections[0].content[0].rows[0]: has 1 cells but the table has 2 headers',
298
+ );
299
+ });
300
+
301
+ it('rejects graph metadata at the legacy topic-reader boundary', () => {
302
+ for (const fields of [
303
+ {placement: {parent: 'namespace:cli'}},
304
+ {aliases: ['setup']},
305
+ {audience: 'internal'},
306
+ ]) {
307
+ expect(problemsInTopic(topic(fields)).join('\n')).toContain(
308
+ 'requires the compiled graph reader',
309
+ );
310
+ }
311
+ });
312
+
313
+ it('takes a reference block, and checks its projection and presentation', () => {
314
+ /** @param {any[]} content */
315
+ const withBlocks = content =>
316
+ problemsInTopic(topic({sections: [{title: 'Overview', content}]}));
317
+ expect(
318
+ withBlocks([
319
+ {type: 'reference', target: 'schema:integration'},
320
+ {
321
+ type: 'reference',
322
+ target: '@astryxdesign/cli:schema:integration',
323
+ projection: {fields: ['docs']},
324
+ presentation: 'compact',
325
+ },
326
+ ]),
327
+ ).toEqual([]);
328
+ expect(
329
+ withBlocks([
330
+ {type: 'reference', target: ''},
331
+ {type: 'reference', target: 'schema:x', presentation: 'card'},
332
+ {type: 'reference', target: 'schema:x', projection: {fields: []}},
333
+ {type: 'reference', target: 'schema:x', projection: {rows: ['a']}},
334
+ {type: 'reference', target: 'schema:x', projection: ['docs']},
335
+ {type: 'reference', target: 'schema:x', link: {}},
336
+ ]),
337
+ ).toEqual([
338
+ 'sections[0].content[0].target: expected a non-empty string',
339
+ 'sections[0].content[1].presentation: "card" is not one of summary, compact, full',
340
+ 'sections[0].content[2].projection.fields: expected a non-empty array of names',
341
+ 'sections[0].content[3].projection.rows: not a field of a projection',
342
+ 'sections[0].content[4].projection: expected {fields?, sections?}, naming the parts of the doc to include',
343
+ 'sections[0].content[5].link: not a field of a reference block',
344
+ ]);
345
+ // Workflow and collection blocks stay in a namespace doc's `blocks`.
346
+ for (const type of ['workflow', 'collection']) {
347
+ expect(withBlocks([{type}]).join('\n')).toContain(
348
+ 'requires the compiled graph renderer',
349
+ );
350
+ }
200
351
  });
201
352
 
202
353
  it('rejects a name that is not URL-safe', () => {
203
- expect(problemsInTopic(topic({name: 'not a topic'})).join('\n')).toContain('URL-safe');
354
+ expect(problemsInTopic(topic({name: 'not a topic'})).join('\n')).toContain(
355
+ 'URL-safe',
356
+ );
204
357
  });
205
358
  });
206
359
 
@@ -228,11 +381,23 @@ describe('DocsCatalog', () => {
228
381
  expect(catalog.resolve('deploying').package).toBe('@acme/widgets');
229
382
  });
230
383
 
384
+ it('treats topic identities case-insensitively without losing display case', () => {
385
+ const catalog = DocsCatalog.fromBuiltins();
386
+ expect(catalog.add(record({name: 'Deploying'}))).toBeNull();
387
+ expect(catalog.resolve('deploying').name).toBe('Deploying');
388
+ expect(catalog.resolve('DEPLOYING').name).toBe('Deploying');
389
+
390
+ const issue = catalog.add(
391
+ record({name: 'deploying', package: '@acme/duplicate'}),
392
+ );
393
+ expect(issue).toMatchObject({code: 'invalid_doc', severity: 'error'});
394
+ });
395
+
231
396
  it('refuses to shadow an existing topic by name alone', () => {
232
397
  const catalog = DocsCatalog.fromBuiltins({tokens: '/cli/tokens.doc.mjs'});
233
398
  const issue = catalog.add(record({name: 'tokens'}));
234
399
  expect(issue).toMatchObject({code: 'invalid_doc', severity: 'error'});
235
- expect(issue.message).toContain("already provided by @astryxdesign/cli");
400
+ expect(issue.message).toContain('already provided by @astryxdesign/cli');
236
401
  expect(issue.message).toContain("replaces: 'tokens'");
237
402
  // The built-in topic is untouched.
238
403
  expect(catalog.resolve('tokens').package).toBe(BUILTIN_DOCS_PACKAGE);
@@ -244,7 +409,9 @@ describe('DocsCatalog', () => {
244
409
  tokens: '/cli/tokens.doc.mjs',
245
410
  });
246
411
  expect(
247
- catalog.add(record({name: 'getting-started', replaces: 'getting-started'})),
412
+ catalog.add(
413
+ record({name: 'getting-started', replaces: 'getting-started'}),
414
+ ),
248
415
  ).toBeNull();
249
416
  expect(catalog.names()).toEqual(['getting-started', 'tokens']);
250
417
  const entry = catalog.resolve('getting-started');
@@ -276,12 +443,16 @@ describe('DocsCatalog', () => {
276
443
 
277
444
  it('warns, and lets the later package win, when two replace one topic', () => {
278
445
  const catalog = DocsCatalog.fromBuiltins({tokens: '/cli/tokens.doc.mjs'});
279
- expect(catalog.add(record({name: 'tokens', replaces: 'tokens'}))).toBeNull();
446
+ expect(
447
+ catalog.add(record({name: 'tokens', replaces: 'tokens'})),
448
+ ).toBeNull();
280
449
  const issue = catalog.add(
281
450
  record({name: 'tokens', package: '@acme/later', replaces: 'tokens'}),
282
451
  );
283
452
  expect(issue).toMatchObject({code: 'duplicate_doc', severity: 'warning'});
284
- expect(issue.message).toContain('@acme/later is configured later, so it wins');
453
+ expect(issue.message).toContain(
454
+ '@acme/later is configured later, so it wins',
455
+ );
285
456
  expect(catalog.resolve('tokens').package).toBe('@acme/later');
286
457
  });
287
458
 
@@ -327,15 +498,189 @@ describe('mergeTopic', () => {
327
498
  {title: 'Internal', content: [{type: 'prose', text: 'the meta way'}]},
328
499
  ],
329
500
  });
330
- expect(merged.sections.map(s => s.title)).toEqual(['Install', 'Tokens', 'Internal']);
501
+ expect(merged.sections.map(s => s.title)).toEqual([
502
+ 'Install',
503
+ 'Tokens',
504
+ 'Internal',
505
+ ]);
331
506
  expect(merged.sections[0].content[0].text).toBe('yarn add');
332
507
  expect(merged.sections[1].content[0].text).toBe('use tokens');
333
508
  // The base is untouched.
334
509
  expect(base.sections[0].content[0].text).toBe('npm i');
335
510
  });
336
511
 
337
- it('takes the title and description only when the overlay states them', () => {
338
- expect(mergeTopic(base, {sections: []}).title).toBe('Theme');
339
- expect(mergeTopic(base, {title: 'Theming', sections: []}).title).toBe('Theming');
512
+ it('replaces a section by stable ID even when its title changes', () => {
513
+ const merged = mergeTopic(
514
+ {
515
+ ...base,
516
+ sections: [
517
+ {id: 'install', title: 'Install', content: []},
518
+ {id: 'tokens', title: 'Tokens', content: []},
519
+ ],
520
+ },
521
+ {
522
+ sections: [{id: 'install', title: 'Setup', content: []}],
523
+ },
524
+ );
525
+ expect(merged.sections.map(section => [section.id, section.title])).toEqual(
526
+ [
527
+ ['install', 'Setup'],
528
+ ['tokens', 'Tokens'],
529
+ ],
530
+ );
531
+ });
532
+
533
+ it('migrates a legacy section to a stable ID without duplicating it', () => {
534
+ const merged = mergeTopic(base, {
535
+ sections: [
536
+ {
537
+ id: 'install',
538
+ title: 'Install',
539
+ content: [{type: 'prose', text: 'yarn add'}],
540
+ },
541
+ ],
542
+ });
543
+ expect(
544
+ merged.sections.map(section => [section.id ?? null, section.title]),
545
+ ).toEqual([
546
+ ['install', 'Install'],
547
+ [null, 'Tokens'],
548
+ ]);
549
+ expect(merged.sections[0].content[0].text).toBe('yarn add');
550
+ });
551
+
552
+ it('lets a legacy extension replace a section that has since gained an ID', () => {
553
+ const merged = mergeTopic(
554
+ {
555
+ ...base,
556
+ sections: [
557
+ {id: 'setup-steps', title: 'Install', content: []},
558
+ {title: 'Tokens', content: []},
559
+ ],
560
+ },
561
+ {
562
+ sections: [
563
+ {title: 'Install', content: [{type: 'prose', text: 'yarn add'}]},
564
+ ],
565
+ },
566
+ );
567
+ expect(
568
+ merged.sections.map(section => [section.id ?? null, section.title]),
569
+ ).toEqual([
570
+ ['setup-steps', 'Install'],
571
+ [null, 'Tokens'],
572
+ ]);
573
+ expect(merged.sections[0].content[0].text).toBe('yarn add');
574
+ });
575
+
576
+ it('keeps two different authored IDs distinct under one title', () => {
577
+ const merged = mergeTopic(
578
+ {...base, sections: [{id: 'install', title: 'Install', content: []}]},
579
+ {sections: [{id: 'install-yarn', title: 'Install', content: []}]},
580
+ );
581
+ expect(merged.sections.map(section => section.id)).toEqual([
582
+ 'install',
583
+ 'install-yarn',
584
+ ]);
585
+ });
586
+
587
+ it('keeps the base title and description: an extension never renames a topic', () => {
588
+ const merged = mergeTopic(base, {
589
+ title: 'Acme theme notes',
590
+ description: 'Our additions.',
591
+ sections: [],
592
+ });
593
+ expect(merged.title).toBe('Theme');
594
+ expect(merged.description).toBe('Theming.');
595
+ });
596
+ });
597
+
598
+ describe('problemsInTopic section keys', () => {
599
+ /** @param {object[]} sections */
600
+ const doc = sections => ({
601
+ type: 'generic',
602
+ name: 'keys',
603
+ title: 'Keys',
604
+ description: 'Section keys.',
605
+ sections: sections.map(s => ({
606
+ content: [{type: 'prose', text: 'x'}],
607
+ ...s,
608
+ })),
609
+ });
610
+
611
+ it('keeps legacy title-only key conflicts readable', () => {
612
+ expect(
613
+ problemsInTopic(doc([{title: 'Quick Start'}, {title: 'Quick-start'}])),
614
+ ).toEqual([]);
615
+ });
616
+
617
+ it('rejects an unsafe id', () => {
618
+ expect(
619
+ problemsInTopic(doc([{id: 'Quick Start', title: 'Quick Start'}])),
620
+ ).toEqual([expect.stringContaining('is not a stable key')]);
621
+ });
622
+
623
+ it('keeps a legacy title that has no derived key readable', () => {
624
+ expect(problemsInTopic(doc([{title: '亮/暗模式'}]))).toEqual([]);
625
+ expect(
626
+ problemsInTopic(doc([{id: 'light-dark', title: '亮/暗模式'}])),
627
+ ).toEqual([]);
628
+ });
629
+ });
630
+
631
+ describe('mergeTopic by section key', () => {
632
+ const base = {
633
+ title: 'Theme',
634
+ sections: [
635
+ {title: 'Quick Start', content: [{type: 'prose', text: 'base'}]},
636
+ {title: 'Light/Dark Mode', content: [{type: 'prose', text: 'base'}]},
637
+ ],
638
+ };
639
+ const titles = doc =>
640
+ doc.sections.map(s => [s.id ?? null, s.title, s.content[0].text]);
641
+
642
+ it('replaces the section whose derived key an extension id names', () => {
643
+ const merged = mergeTopic(base, {
644
+ sections: [
645
+ {
646
+ id: 'quick-start',
647
+ title: 'Quick Start with Acme',
648
+ content: [{type: 'prose', text: 'acme'}],
649
+ },
650
+ ],
651
+ });
652
+ expect(titles(merged)).toEqual([
653
+ ['quick-start', 'Quick Start with Acme', 'acme'],
654
+ [null, 'Light/Dark Mode', 'base'],
655
+ ]);
656
+ });
657
+
658
+ it('keeps a legacy title variant as a separate section', () => {
659
+ const merged = mergeTopic(base, {
660
+ sections: [
661
+ {title: 'Light-Dark Mode', content: [{type: 'prose', text: 'acme'}]},
662
+ ],
663
+ });
664
+ expect(titles(merged)).toEqual([
665
+ [null, 'Quick Start', 'base'],
666
+ [null, 'Light/Dark Mode', 'base'],
667
+ [null, 'Light-Dark Mode', 'acme'],
668
+ ]);
669
+ });
670
+
671
+ it('prefers the key over a legacy title for an extension with an id', () => {
672
+ const merged = mergeTopic(base, {
673
+ sections: [
674
+ {
675
+ id: 'light-dark-mode',
676
+ title: 'Quick Start',
677
+ content: [{type: 'prose', text: 'acme'}],
678
+ },
679
+ ],
680
+ });
681
+ expect(titles(merged)).toEqual([
682
+ [null, 'Quick Start', 'base'],
683
+ ['light-dark-mode', 'Quick Start', 'acme'],
684
+ ]);
340
685
  });
341
686
  });
@@ -0,0 +1,28 @@
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
+ * A payload's size as `--json` prints it: the envelope data, two-space
6
+ * indented, in UTF-8 bytes.
7
+ * @param {unknown} payload
8
+ * @returns {number}
9
+ */
10
+ export function docPayloadBytes(payload: unknown): number;
11
+ /**
12
+ * @param {Omit<import('../../api/docs/docs.type.mjs').DocsIndex, 'links'> | import('../../api/docs/docs.type.mjs').DocsIndex} index
13
+ * @returns {number}
14
+ */
15
+ export function docsIndexBytes(index: Omit<import("../../api/docs/docs.type.mjs").DocsIndex, "links"> | import("../../api/docs/docs.type.mjs").DocsIndex): number;
16
+ /**
17
+ * The sections a single read would return more than `budget` bytes for.
18
+ * @param {any[]} sections
19
+ * @param {number} [budget]
20
+ * @returns {{key: string, title: string, bytes: number}[]}
21
+ */
22
+ export function oversizedDocSections(sections: any[], budget?: number): {
23
+ key: string;
24
+ title: string;
25
+ bytes: number;
26
+ }[];
27
+ /** The most one index or one section read may return, in bytes. */
28
+ export const DOC_OUTPUT_BUDGET_BYTES: number;
@@ -0,0 +1,50 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file The most one progressive docs read may return.
5
+ *
6
+ * @input Docs payloads: one topic's section index, or one section.
7
+ * @output Their size in bytes as `--json` prints them, and the sections over
8
+ * the budget.
9
+ * @position Shared by Doctor's docs checks and the authoring self-doc audit, so
10
+ * both hold every read to the same limit.
11
+ */
12
+
13
+ import {sectionKey} from './docs-section-key.mjs';
14
+
15
+ /** The most one index or one section read may return, in bytes. */
16
+ export const DOC_OUTPUT_BUDGET_BYTES = 32 * 1024;
17
+
18
+ /**
19
+ * A payload's size as `--json` prints it: the envelope data, two-space
20
+ * indented, in UTF-8 bytes.
21
+ * @param {unknown} payload
22
+ * @returns {number}
23
+ */
24
+ export function docPayloadBytes(payload) {
25
+ return Buffer.byteLength(JSON.stringify(payload, null, 2), 'utf8');
26
+ }
27
+
28
+ /**
29
+ * @param {Omit<import('../../api/docs/docs.type.mjs').DocsIndex, 'links'> | import('../../api/docs/docs.type.mjs').DocsIndex} index
30
+ * @returns {number}
31
+ */
32
+ export function docsIndexBytes(index) {
33
+ return docPayloadBytes({type: 'docs.index', data: index});
34
+ }
35
+
36
+ /**
37
+ * The sections a single read would return more than `budget` bytes for.
38
+ * @param {any[]} sections
39
+ * @param {number} [budget]
40
+ * @returns {{key: string, title: string, bytes: number}[]}
41
+ */
42
+ export function oversizedDocSections(sections, budget = DOC_OUTPUT_BUDGET_BYTES) {
43
+ return sections
44
+ .map(section => ({
45
+ key: sectionKey(section),
46
+ title: section.title,
47
+ bytes: docPayloadBytes({type: 'docs.detail.section', data: section}),
48
+ }))
49
+ .filter(entry => entry.bytes > budget);
50
+ }
@@ -0,0 +1,116 @@
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
+ * Record the authored title of a section whose visible title a translation
6
+ * overlay replaces.
7
+ * @template {object} T
8
+ * @param {T} section
9
+ * @param {string} title
10
+ * @returns {T}
11
+ */
12
+ export function withSourceTitle<T extends object>(section: T, title: string): T;
13
+ /**
14
+ * @param {any} section
15
+ * @returns {string}
16
+ */
17
+ export function sourceTitle(section: any): string;
18
+ /**
19
+ * The key a title derives: accents folded, `&` spelled out, and every other
20
+ * run of non-alphanumerics collapsed to one hyphen. Empty when the title has
21
+ * no Latin letters or digits to derive from.
22
+ * @param {unknown} title
23
+ * @returns {string}
24
+ */
25
+ export function sectionTitleKey(title: unknown): string;
26
+ /**
27
+ * The key a section is addressed by: its authored `id`, else the key its
28
+ * authored title derives.
29
+ * @param {any} section
30
+ * @returns {string}
31
+ */
32
+ export function sectionKey(section: any): string;
33
+ /**
34
+ * A name as a docs-tree route segment: lowercase words joined by hyphens, so
35
+ * `integrationPackCheck` and `integration pack` both read naturally.
36
+ * @param {string} name
37
+ * @returns {string}
38
+ */
39
+ export function routeSegment(name: string): string;
40
+ /**
41
+ * Fatal key problems: only an explicitly authored `id` can make a previously
42
+ * readable topic invalid. Derived-key collisions and titles with no Latin
43
+ * letters or digits are handled by {@link withSectionKeys} for 0.6.x
44
+ * compatibility.
45
+ * @param {any[]} sections
46
+ * @returns {string[]}
47
+ */
48
+ export function sectionKeyErrors(sections: any[]): string[];
49
+ /**
50
+ * Compatibility notices for section keys. These inputs loaded in 0.6.x, so
51
+ * readers keep accepting them and assign deterministic fallback keys.
52
+ * @param {any[]} sections
53
+ * @returns {string[]}
54
+ */
55
+ export function sectionKeyProblems(sections: any[]): string[];
56
+ /**
57
+ * Stamp every section with the key it is addressed by. Runs only after
58
+ * extensions merge: a derived key must never take part in merge matching.
59
+ * @template {{sections: any[]}} T
60
+ * @param {T} doc
61
+ * @returns {T}
62
+ */
63
+ export function withSectionKeys<T extends {
64
+ sections: any[];
65
+ }>(doc: T): T;
66
+ /**
67
+ * Find the section a reader asked for. The 0.6.x first-match title-substring
68
+ * lookup remains first in the authored-title view. In a localized view, an
69
+ * exact stable key resolves before translated title substrings because those
70
+ * translations cannot participate in language-stable key allocation. Generated
71
+ * keys avoid authored-title conflicts, and authored IDs that would shadow an
72
+ * authored legacy query are rejected.
73
+ * @param {any[]} sections
74
+ * @param {string} query
75
+ * @returns {{section: any | null, candidates: any[]}} `candidates` lists every
76
+ * legacy title match when the query is ambiguous
77
+ */
78
+ export function findDocSection(sections: any[], query: string): {
79
+ section: any | null;
80
+ candidates: any[];
81
+ };
82
+ /**
83
+ * One line that says what a section holds: its first prose or list text,
84
+ * whitespace collapsed, cut at a word boundary.
85
+ * @param {any} section
86
+ * @param {number} [max]
87
+ * @returns {string}
88
+ */
89
+ export function sectionSummary(section: any, max?: number): string;
90
+ /**
91
+ * The index a topic-only read returns: what the topic is, and one entry per
92
+ * section with the key to read it by.
93
+ * @param {{name: string, title: string, description: string, sections: any[]}} doc
94
+ * @returns {Omit<import('../../api/docs/docs.type.mjs').DocsIndex, 'links'>}
95
+ */
96
+ export function buildDocsIndexData(doc: {
97
+ name: string;
98
+ title: string;
99
+ description: string;
100
+ sections: any[];
101
+ }): Omit<import("../../api/docs/docs.type.mjs").DocsIndex, "links">;
102
+ /**
103
+ * @file Stable section keys, section lookup, and the topic index.
104
+ *
105
+ * @input Reference-doc sections, each with an optional authored `id`.
106
+ * @output The key a section is addressed by (its `id`, else a kebab-case key
107
+ * derived from its authored title), lookup by key or title, and the compact
108
+ * index a topic-only docs read returns.
109
+ * @position Shared by docs discovery (which rejects colliding keys before a
110
+ * reader sees them), the docs leaves (index, section, detail), and Doctor
111
+ * (output budgets). Imports nothing from discovery, so both can use it.
112
+ */
113
+ /** A stable key: lowercase letters and digits, joined by single hyphens. */
114
+ export const SECTION_KEY_RE: RegExp;
115
+ /** The longest summary an index entry carries, in characters. */
116
+ export const SECTION_SUMMARY_MAX: 240;