@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
@@ -0,0 +1,598 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file Tests for the docs tree (spec:AST-046): one home per doc, decided by
5
+ * explicit placement, then one adoption rule; every way a placement can fail;
6
+ * generated kind levels; deterministic order; and the CLI's own tree.
7
+ *
8
+ * @input Plain fixture inputs for the pure builder, and this package's own
9
+ * tree files and typed docs for the loader.
10
+ * @output Assertions on routes, parents, slots, children order, and
11
+ * diagnostics.
12
+ * @position packages/cli/foundation/doc-compiler — tests for tree.mjs.
13
+ */
14
+
15
+ import {describe, expect, it} from 'vitest';
16
+ import {
17
+ buildDocsTree,
18
+ KIND_GROUPS,
19
+ loadDocsTree,
20
+ loadTreeInputs,
21
+ routeSegment,
22
+ } from './tree.mjs';
23
+ import {loadCliSelfDocs} from '../discovery/cli-self-docs.mjs';
24
+ import * as api from '../../api/index.mjs';
25
+ import {createDocId} from '../identity/provider-identity.mjs';
26
+ import {CLI_PROVIDER_ID} from '../identity/providers.mjs';
27
+
28
+ const SLOW = 60_000;
29
+ const P = '@acme/kit';
30
+
31
+ /**
32
+ * @param {string} name
33
+ * @param {object} [extra]
34
+ * @returns {import('./tree.mjs').TreeNamespaceInput}
35
+ */
36
+ const ns = (name, extra = {}) => ({
37
+ provider: P,
38
+ providerId: P,
39
+ source: `${P}/tree/${name}.doc.mjs`,
40
+ doc: /** @type {any} */ ({
41
+ type: 'namespace',
42
+ name,
43
+ title: name.toUpperCase(),
44
+ summary: `The ${name} level.`,
45
+ slots: {
46
+ items: {title: 'Items', accepts: {kinds: ['generic', 'namespace']}},
47
+ },
48
+ ...extra,
49
+ }),
50
+ });
51
+
52
+ /**
53
+ * @param {string} name
54
+ * @param {object} [extra]
55
+ * @returns {import('./tree.mjs').TreeDocInput}
56
+ */
57
+ const guide = (name, extra = {}) => ({
58
+ provider: P,
59
+ providerId: P,
60
+ source: `${P}/tree/${name}.doc.mjs`,
61
+ kind: 'generic',
62
+ name,
63
+ title: `Guide ${name}`,
64
+ summary: `About ${name}.`,
65
+ group: null,
66
+ placement: undefined,
67
+ ...extra,
68
+ });
69
+
70
+ /**
71
+ * @param {string} kind
72
+ * @param {string} name
73
+ * @param {string} group
74
+ * @returns {import('./tree.mjs').TreeDocInput}
75
+ */
76
+ const typed = (kind, name, group) => ({
77
+ provider: P,
78
+ providerId: P,
79
+ source: `${P}/api/${name}.doc.mjs`,
80
+ kind,
81
+ name,
82
+ title: name,
83
+ summary: `The ${name} ${kind}.`,
84
+ group,
85
+ placement: undefined,
86
+ });
87
+
88
+ /** @param {ReturnType<typeof buildDocsTree>} tree */
89
+ const routes = tree => [...tree.nodes.keys()];
90
+
91
+ /** @param {ReturnType<typeof buildDocsTree>} tree */
92
+ const problems = tree => tree.diagnostics.map(d => [d.code, d.message]);
93
+
94
+ describe('buildDocsTree', () => {
95
+
96
+ it('withdraws a namespace placed in a withdrawn namespace, and what is placed in it', () => {
97
+ const CLI = '@astryxdesign/cli';
98
+ const tree = buildDocsTree({
99
+ namespaces: [
100
+ ns('tokens'),
101
+ ns('alpha', {placement: {parent: 'namespace:tokens', slot: 'items'}}),
102
+ ],
103
+ docs: [guide('deep', {placement: {parent: 'namespace:alpha', slot: 'items'}})],
104
+ topics: [
105
+ {provider: CLI, providerId: CLI, name: 'tokens', title: 'Tokens', summary: 'Tokens.', source: `${CLI}/tokens.doc.mjs`},
106
+ ],
107
+ });
108
+ expect(tree.get('tokens')?.provider).toBe(CLI);
109
+ expect(routes(tree).filter(route => route.startsWith('tokens/'))).toEqual([]);
110
+ expect(problems(tree)).toEqual(
111
+ expect.arrayContaining([
112
+ ['duplicate_route', expect.stringContaining('takes the route "tokens"')],
113
+ ['invalid_placement', 'Namespace "alpha" has no route: the namespace it is placed in was withdrawn.'],
114
+ ['invalid_placement', expect.stringContaining('names a namespace that has no route')],
115
+ ]),
116
+ );
117
+ });
118
+
119
+ it("keeps a name a topic answers to through replaces as that topic's route", () => {
120
+ const tree = buildDocsTree({
121
+ namespaces: [ns('tokens')],
122
+ docs: [],
123
+ topics: [
124
+ {provider: '@acme/a', providerId: '@acme/a', name: 'acme-tokens', title: 'Acme tokens', summary: 'Acme tokens.', source: '@acme/a:acme-tokens', aliases: ['tokens', 'old-tokens']},
125
+ ],
126
+ });
127
+ expect(tree.get('tokens')).toBeUndefined();
128
+ expect(tree.get('acme-tokens')?.provider).toBe('@acme/a');
129
+ expect(problems(tree)).toEqual([
130
+ ['duplicate_route', expect.stringContaining('takes the route "tokens", which the topic "acme-tokens" also answers to')],
131
+ ]);
132
+ // Every name it answers to is reserved, not only the last one it replaced.
133
+ const older = buildDocsTree({
134
+ namespaces: [ns('old-tokens')],
135
+ docs: [],
136
+ topics: [
137
+ {provider: '@acme/a', providerId: '@acme/a', name: 'acme-tokens', title: 'Acme tokens', summary: 'Acme tokens.', source: '@acme/a:acme-tokens', aliases: ['tokens', 'old-tokens']},
138
+ ],
139
+ });
140
+ expect(older.get('old-tokens')).toBeUndefined();
141
+ });
142
+
143
+ it("keeps the CLI's own routes from an integration, compared without case", () => {
144
+ const CLI = '@astryxdesign/cli';
145
+ /** @param {string} name @param {string} [provider] */
146
+ const topic = (name, provider = P) => ({
147
+ provider,
148
+ providerId: provider,
149
+ name,
150
+ title: name,
151
+ summary: `The ${name} topic.`,
152
+ source: `${provider}/${name}.doc.mjs`,
153
+ });
154
+ const cliNs = {...ns('cli'), provider: CLI, providerId: CLI, source: `${CLI}/tree/cli.doc.mjs`};
155
+ // An integration's topics named `CLI` and `UNORGANIZED` claim the CLI's
156
+ // namespace and the generated level; both are withdrawn.
157
+ const tree = buildDocsTree({
158
+ namespaces: [cliNs],
159
+ docs: [],
160
+ topics: [topic('theme', CLI), topic('CLI'), topic('UNORGANIZED')],
161
+ });
162
+ expect(tree.get('cli')?.provider).toBe(CLI);
163
+ expect(tree.get('unorganized')?.provider).toBe(CLI);
164
+ expect(routes(tree)).not.toContain('CLI');
165
+ expect(routes(tree)).not.toContain('UNORGANIZED');
166
+ expect(problems(tree)).toEqual(
167
+ expect.arrayContaining([
168
+ ['duplicate_route', expect.stringContaining('both have the route "CLI"')],
169
+ ['duplicate_route', expect.stringContaining('takes the route "UNORGANIZED", which the CLI\'s own docs keep')],
170
+ ]),
171
+ );
172
+ expect(tree.getFolded('THEME')?.provider).toBe(CLI);
173
+ // A CLI topic whose own name has capitals keeps its route against a
174
+ // lowercase namespace, although namespaces go into the tree first.
175
+ const caps = buildDocsTree({namespaces: [ns('tokens')], docs: [], topics: [topic('Tokens', CLI)]});
176
+ expect(caps.get('Tokens')?.provider).toBe(CLI);
177
+ expect(caps.get('tokens')).toBeUndefined();
178
+ expect(problems(caps)).toEqual([
179
+ ['duplicate_route', expect.stringContaining('takes the route "tokens", which the CLI\'s own docs keep')],
180
+ ]);
181
+ });
182
+ it('builds three authored levels and a guide below them', () => {
183
+ const tree = buildDocsTree({
184
+ namespaces: [
185
+ ns('top'),
186
+ ns('middle', {placement: {parent: 'namespace:top', slot: 'items'}}),
187
+ ns('bottom', {placement: {parent: 'namespace:middle'}}),
188
+ ],
189
+ docs: [
190
+ guide('deep', {placement: {parent: 'namespace:bottom', order: 1}}),
191
+ ],
192
+ });
193
+ expect(problems(tree)).toEqual([]);
194
+ expect(routes(tree)).toEqual([
195
+ 'top',
196
+ 'top/middle',
197
+ 'top/middle/bottom',
198
+ 'top/middle/bottom/deep',
199
+ ]);
200
+ const deep = /** @type {any} */ (tree.get('top/middle/bottom/deep'));
201
+ expect(deep).toMatchObject({
202
+ id: 'astryx:artifact:v1/%40acme%2Fkit/generic/deep',
203
+ parent: 'top/middle/bottom',
204
+ slot: 'items',
205
+ order: 1,
206
+ generated: false,
207
+ });
208
+ expect(tree.ancestors(deep).map(node => node.route)).toEqual([
209
+ 'top',
210
+ 'top/middle',
211
+ 'top/middle/bottom',
212
+ ]);
213
+ expect(tree.roots().map(node => node.route)).toEqual(['top']);
214
+ });
215
+
216
+ it('adopts typed docs by group, with one generated level per kind', () => {
217
+ const tree = buildDocsTree({
218
+ namespaces: [
219
+ ns('api', {
220
+ slots: {kinds: {title: 'Reference', accepts: {kinds: ['namespace']}}},
221
+ adopts: [
222
+ {
223
+ source: {group: 'kit/api', kinds: ['function', 'enum']},
224
+ into: 'kinds',
225
+ groupBy: 'kind',
226
+ },
227
+ ],
228
+ }),
229
+ ],
230
+ docs: [
231
+ typed('enum', 'errorCodes', 'kit/api'),
232
+ typed('function', 'search', 'kit/api'),
233
+ typed('function', 'build', 'kit/api'),
234
+ typed('schema', 'config', 'kit/api'),
235
+ typed('function', 'other', 'kit/elsewhere'),
236
+ ],
237
+ });
238
+ expect(problems(tree)).toEqual([]);
239
+ expect(routes(tree)).toEqual([
240
+ 'api',
241
+ 'api/enums',
242
+ 'api/enums/error-codes',
243
+ 'api/functions',
244
+ 'api/functions/build',
245
+ 'api/functions/search',
246
+ ]);
247
+ const functions = /** @type {any} */ (tree.get('api/functions'));
248
+ expect(functions).toMatchObject({
249
+ id: null,
250
+ kind: 'namespace',
251
+ title: KIND_GROUPS.function.title,
252
+ generated: true,
253
+ parent: 'api',
254
+ slot: 'kinds',
255
+ });
256
+ // Kind levels follow the rule's kind order; docs inside sort by title.
257
+ expect(tree.get('api')?.slots[0].children).toEqual([
258
+ 'api/functions',
259
+ 'api/enums',
260
+ ]);
261
+ expect(functions.slots[0].children).toEqual([
262
+ 'api/functions/build',
263
+ 'api/functions/search',
264
+ ]);
265
+ });
266
+
267
+ it('adopts without grouping straight into the named slot', () => {
268
+ const tree = buildDocsTree({
269
+ namespaces: [
270
+ ns('commands', {
271
+ slots: {all: {title: 'All', accepts: {kinds: ['command']}}},
272
+ adopts: [{source: {group: 'kit/commands'}, into: 'all'}],
273
+ }),
274
+ ],
275
+ docs: [typed('command', 'theme add', 'kit/commands')],
276
+ });
277
+ expect(routes(tree)).toEqual(['commands', 'commands/theme-add']);
278
+ expect(tree.get('commands')?.slots[0].children).toEqual([
279
+ 'commands/theme-add',
280
+ ]);
281
+ });
282
+
283
+ it('prefers explicit placement over adoption, and never falls back', () => {
284
+ const namespaces = [
285
+ ns('guides'),
286
+ ns('api', {
287
+ slots: {all: {title: 'All', accepts: {kinds: ['generic']}}},
288
+ adopts: [{source: {group: 'kit/api'}, into: 'all'}],
289
+ }),
290
+ ];
291
+ const placed = buildDocsTree({
292
+ namespaces,
293
+ docs: [
294
+ guide('intro', {
295
+ group: 'kit/api',
296
+ placement: {parent: 'namespace:guides'},
297
+ }),
298
+ ],
299
+ });
300
+ expect(routes(placed)).toContain('guides/intro');
301
+ expect(routes(placed)).not.toContain('api/intro');
302
+
303
+ const broken = buildDocsTree({
304
+ namespaces,
305
+ docs: [
306
+ guide('intro', {
307
+ group: 'kit/api',
308
+ placement: {parent: 'namespace:nope'},
309
+ }),
310
+ ],
311
+ });
312
+ expect(routes(broken).some(route => route.endsWith('/intro'))).toBe(false);
313
+ expect(problems(broken)).toEqual([
314
+ [
315
+ 'invalid_placement',
316
+ 'placement.parent "namespace:nope" names no namespace; @acme/kit declares "api", "guides".',
317
+ ],
318
+ ]);
319
+ });
320
+
321
+ it('reports every way a placement can fail', () => {
322
+ const tree = buildDocsTree({
323
+ namespaces: [
324
+ ns('home', {
325
+ slots: {
326
+ one: {title: 'One', accepts: {kinds: ['generic']}},
327
+ two: {title: 'Two', accepts: {kinds: ['command']}},
328
+ },
329
+ }),
330
+ ],
331
+ docs: [
332
+ guide('no-slot', {placement: {parent: 'namespace:home'}}),
333
+ guide('bad-slot', {
334
+ placement: {parent: 'namespace:home', slot: 'three'},
335
+ }),
336
+ guide('wrong-kind', {
337
+ placement: {parent: 'namespace:home', slot: 'two'},
338
+ }),
339
+ guide('other-package', {
340
+ placement: {parent: '@other/pkg/namespace/home'},
341
+ }),
342
+ guide('not-a-ref', {placement: {parent: 'home'}}),
343
+ ],
344
+ });
345
+ expect(routes(tree)).toEqual(['home']);
346
+ expect(
347
+ problems(tree)
348
+ .map(([, message]) => message)
349
+ .sort(),
350
+ ).toEqual(
351
+ [
352
+ 'placement names no slot, and namespace "home" has 2 (one, two). Name one with placement.slot.',
353
+ 'placement.slot "three" is not a slot of namespace "home"; it declares one, two.',
354
+ 'slot "two" of namespace "home" does not accept generic docs; it accepts command.',
355
+ 'placement.parent "@other/pkg/namespace/home" belongs to @other/pkg. A doc can only be placed in a namespace of its own package (@acme/kit).',
356
+ 'placement.parent "home" is not a namespace reference. Write "namespace:<name>".',
357
+ ].sort(),
358
+ );
359
+ expect(tree.diagnostics.every(d => d.code === 'invalid_placement')).toBe(
360
+ true,
361
+ );
362
+ expect(tree.diagnostics.every(d => d.severity === 'error')).toBe(true);
363
+ });
364
+
365
+ it('fails a doc two namespaces adopt, naming both', () => {
366
+ const rule = {source: {group: 'kit/api'}, into: 'items'};
367
+ const tree = buildDocsTree({
368
+ namespaces: [ns('a', {adopts: [rule]}), ns('b', {adopts: [rule]})],
369
+ docs: [guide('shared', {group: 'kit/api'})],
370
+ });
371
+ expect(routes(tree)).toEqual(['a', 'b']);
372
+ expect(problems(tree)).toEqual([
373
+ [
374
+ 'overlapping_adoption',
375
+ '@acme/kit/generic/shared is adopted by "a" and "b"; exactly one namespace may adopt a doc.',
376
+ ],
377
+ ]);
378
+ });
379
+
380
+ it('fails two docs at one route, keeping the first by identity', () => {
381
+ const tree = buildDocsTree({
382
+ namespaces: [ns('home')],
383
+ docs: [
384
+ guide('fooBar', {placement: {parent: 'namespace:home'}}),
385
+ guide('foo_bar', {placement: {parent: 'namespace:home'}}),
386
+ ],
387
+ });
388
+ expect(routes(tree)).toEqual(['home', 'home/foo-bar']);
389
+ expect(tree.get('home/foo-bar')?.id).toBe(
390
+ 'astryx:artifact:v1/%40acme%2Fkit/generic/fooBar',
391
+ );
392
+ expect(problems(tree)).toEqual([
393
+ [
394
+ 'duplicate_route',
395
+ 'astryx:artifact:v1/%40acme%2Fkit/generic/foo_bar and astryx:artifact:v1/%40acme%2Fkit/generic/fooBar both have the route "home/foo-bar". Rename or move one of them.',
396
+ ],
397
+ ]);
398
+ });
399
+
400
+ it('fails a namespace cycle and everything under it', () => {
401
+ const tree = buildDocsTree({
402
+ namespaces: [
403
+ ns('a', {placement: {parent: 'namespace:b'}}),
404
+ ns('b', {placement: {parent: 'namespace:a'}}),
405
+ ],
406
+ docs: [guide('lost', {placement: {parent: 'namespace:a'}})],
407
+ });
408
+ expect(routes(tree)).toEqual([]);
409
+ expect(problems(tree).map(([code]) => code)).toEqual([
410
+ 'invalid_placement',
411
+ 'invalid_placement',
412
+ 'invalid_placement',
413
+ ]);
414
+ });
415
+
416
+ it('fails a duplicate or unsafe namespace name', () => {
417
+ const tree = buildDocsTree({
418
+ namespaces: [
419
+ ns('twice'),
420
+ {...ns('twice'), source: `${P}/other.doc.mjs`},
421
+ ns('Bad Name'),
422
+ ],
423
+ docs: [],
424
+ });
425
+ expect(routes(tree)).toEqual(['twice']);
426
+ expect(tree.diagnostics.map(d => d.code)).toEqual([
427
+ 'invalid_namespace',
428
+ 'invalid_namespace',
429
+ ]);
430
+ });
431
+
432
+ it('leaves a doc with no placement and no adoption out, in phase 1', () => {
433
+ const tree = buildDocsTree({
434
+ namespaces: [ns('home')],
435
+ docs: [guide('loose'), typed('function', 'free', 'kit/nowhere')],
436
+ });
437
+ expect(routes(tree)).toEqual(['home']);
438
+ expect(tree.diagnostics).toEqual([]);
439
+ });
440
+
441
+ it('is the same tree whatever order its inputs arrive in', () => {
442
+ const namespaces = [
443
+ ns('top'),
444
+ ns('child', {placement: {parent: 'namespace:top'}}),
445
+ ];
446
+ const docs = [
447
+ guide('b', {placement: {parent: 'namespace:child'}}),
448
+ guide('a', {placement: {parent: 'namespace:child'}}),
449
+ ];
450
+ const one = buildDocsTree({namespaces, docs});
451
+ const two = buildDocsTree({
452
+ namespaces: [...namespaces].reverse(),
453
+ docs: [...docs].reverse(),
454
+ });
455
+ expect(JSON.stringify([...two.nodes])).toBe(JSON.stringify([...one.nodes]));
456
+ });
457
+
458
+ it('orders children by order, then title', () => {
459
+ const tree = buildDocsTree({
460
+ namespaces: [ns('home')],
461
+ docs: [
462
+ guide('z', {
463
+ title: 'Zed',
464
+ placement: {parent: 'namespace:home', order: 1},
465
+ }),
466
+ guide('b', {title: 'Beta', placement: {parent: 'namespace:home'}}),
467
+ guide('a', {title: 'Alpha', placement: {parent: 'namespace:home'}}),
468
+ ],
469
+ });
470
+ expect(tree.get('home')?.slots[0].children).toEqual([
471
+ 'home/z',
472
+ 'home/a',
473
+ 'home/b',
474
+ ]);
475
+ });
476
+ });
477
+
478
+ describe('routeSegment', () => {
479
+ it('joins lowercase words with hyphens, whatever the name looks like', () => {
480
+ expect(routeSegment('integrationPackCheck')).toBe('integration-pack-check');
481
+ expect(routeSegment('doctor integration validate')).toBe(
482
+ 'doctor-integration-validate',
483
+ );
484
+ expect(routeSegment('error-codes')).toBe('error-codes');
485
+ expect(routeSegment('isError')).toBe('is-error');
486
+ expect(routeSegment('!!')).toBe('');
487
+ });
488
+ });
489
+
490
+ describe("the CLI's own docs tree", () => {
491
+ it(
492
+ 'builds with no diagnostic, rooted at cli',
493
+ async () => {
494
+ const tree = await loadDocsTree({fresh: true});
495
+ expect(tree.diagnostics).toEqual([]);
496
+ expect(tree.roots().map(node => node.route)).toEqual(['cli']);
497
+ expect(
498
+ tree.get('cli')?.slots.map(slot => [slot.name, slot.children]),
499
+ ).toEqual([
500
+ ['guides', ['cli/integrations', 'cli/writing-docs']],
501
+ ['reference', ['cli/commands', 'cli/api']],
502
+ ]);
503
+ expect(tree.get('cli/api')?.slots[0].children).toEqual([
504
+ 'cli/api/functions',
505
+ 'cli/api/schemas',
506
+ 'cli/api/enums',
507
+ ]);
508
+ },
509
+ SLOW,
510
+ );
511
+
512
+ it(
513
+ 'gives every CLI typed doc in a cli group one route, by its kind',
514
+ async () => {
515
+ const tree = await loadDocsTree();
516
+ const {loaded} = await loadCliSelfDocs();
517
+ const inTree = loaded.filter(({doc}) =>
518
+ String(doc.namespace).startsWith('cli/'),
519
+ );
520
+ expect(inTree.length).toBeGreaterThan(0);
521
+ const expected = inTree.map(({doc}) =>
522
+ doc.type === 'command'
523
+ ? `cli/commands/${routeSegment(doc.name)}`
524
+ : `cli/api/${KIND_GROUPS[doc.type].segment}/${routeSegment(doc.name)}`,
525
+ );
526
+ expect(expected.filter(route => tree.get(route) == null)).toEqual([]);
527
+ // A doc in the authoring group stays a section of `astryx docs authoring`.
528
+ const authoring = loaded.filter(({doc}) => doc.namespace === 'authoring');
529
+ expect(authoring.length).toBeGreaterThan(0);
530
+ const ids = new Set([...tree.nodes.values()].map(node => node.id));
531
+ expect(
532
+ authoring.filter(({doc}) =>
533
+ ids.has(createDocId(CLI_PROVIDER_ID, doc.type, doc.name)),
534
+ ),
535
+ ).toEqual([]);
536
+ },
537
+ SLOW,
538
+ );
539
+
540
+ it(
541
+ 'gives every function @astryxdesign/cli/api exports a route',
542
+ async () => {
543
+ const tree = await loadDocsTree();
544
+ const exported = Object.entries(api)
545
+ .filter(
546
+ ([, value]) =>
547
+ typeof value === 'function' &&
548
+ Object.getOwnPropertyDescriptor(value, 'prototype')?.writable !==
549
+ false,
550
+ )
551
+ .map(([name]) => `cli/api/functions/${routeSegment(name)}`);
552
+ expect(exported.length).toBeGreaterThan(0);
553
+ expect(exported.filter(route => tree.get(route) == null)).toEqual([]);
554
+ },
555
+ SLOW,
556
+ );
557
+
558
+ it(
559
+ 'reads only namespace and generic docs from the tree directory, each named after its file',
560
+ async () => {
561
+ const inputs = await loadTreeInputs({selfDocs: false});
562
+ expect(inputs.diagnostics).toEqual([]);
563
+ expect(inputs.namespaces.map(n => n.doc.name).sort()).toEqual([
564
+ 'api',
565
+ 'cli',
566
+ 'commands',
567
+ ]);
568
+ expect(inputs.docs.map(d => [d.name, d.placement?.parent])).toEqual([
569
+ ['integrations', 'namespace:cli'],
570
+ ['writing-docs', 'namespace:cli'],
571
+ ]);
572
+ },
573
+ SLOW,
574
+ );
575
+ });
576
+
577
+ describe('doc identity', () => {
578
+ it('builds each id from the provider id, never the package name', () => {
579
+ const provider = '@acme/tree-provider';
580
+ const tree = buildDocsTree({
581
+ namespaces: [{...ns('home'), providerId: provider}],
582
+ docs: [
583
+ {
584
+ ...guide('intro', {placement: {parent: 'namespace:home'}}),
585
+ providerId: provider,
586
+ },
587
+ ],
588
+ });
589
+ expect(problems(tree)).toEqual([]);
590
+ expect(tree.get('home')?.id).toBe(
591
+ 'astryx:artifact:v1/%40acme%2Ftree-provider/namespace/home',
592
+ );
593
+ expect(tree.get('home/intro')).toMatchObject({
594
+ id: 'astryx:artifact:v1/%40acme%2Ftree-provider/generic/intro',
595
+ provider: P,
596
+ });
597
+ });
598
+ });
@@ -0,0 +1,33 @@
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
+ * @typedef {{file: string, reason: 'generated'|'vendored'|'ignored'|'dependency'|'vcs'|'symlink'|'outside-root', declaration: string, source?: string, line?: number, command?: string}} FileProtection
6
+ */
7
+ /**
8
+ * Create an eager, fail-closed resolver. Every declaration under root is parsed
9
+ * before the caller can begin writing consumer files.
10
+ * @param {string} root
11
+ * @param {{overrides?: Map<string, string|null>}} [options]
12
+ */
13
+ export function createFileProtectionResolver(root: string, { overrides }?: {
14
+ overrides?: Map<string, string | null>;
15
+ }): Readonly<{
16
+ root: string;
17
+ classify: (filePath: string) => FileProtection[];
18
+ }>;
19
+ /** A stable failure raised before any consumer write. */
20
+ export class ProtectionSourceError extends Error {
21
+ /** @param {string} source @param {string} reason */
22
+ constructor(source: string, reason: string);
23
+ code: string;
24
+ source: string;
25
+ }
26
+ export type FileProtection = {
27
+ file: string;
28
+ reason: "generated" | "vendored" | "ignored" | "dependency" | "vcs" | "symlink" | "outside-root";
29
+ declaration: string;
30
+ source?: string;
31
+ line?: number;
32
+ command?: string;
33
+ };