@astryxdesign/cli 0.6.3-canary.db4e378 → 0.6.3-canary.db52d98

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 (397) hide show
  1. package/README.md +38 -15
  2. package/api/blog/blog.doc.mjs +1 -0
  3. package/api/build/_adapter.d.mts +50 -0
  4. package/api/build/_adapter.mjs +60 -0
  5. package/api/build/build.doc.mjs +14 -7
  6. package/api/build/build.test.mjs +184 -6
  7. package/api/build/build.type.d.mts +57 -2
  8. package/api/build/build.type.mjs +30 -7
  9. package/api/build/help/help.d.mts +4 -0
  10. package/api/build/help/help.mjs +24 -11
  11. package/api/build/kit/kit.d.mts +4 -1
  12. package/api/build/kit/kit.mjs +165 -49
  13. package/api/build/kit/rank.d.mts +44 -0
  14. package/api/build/kit/rank.mjs +432 -0
  15. package/api/build/kit/rank.test.mjs +196 -0
  16. package/api/component/_adapter.d.mts +6 -12
  17. package/api/component/_adapter.mjs +20 -10
  18. package/api/component/component.doc.mjs +1 -0
  19. package/api/component/component.mjs +60 -12
  20. package/api/component/list/list.mjs +3 -2
  21. package/api/discover/discover.doc.mjs +1 -0
  22. package/api/docs/_adapter.d.mts +252 -34
  23. package/api/docs/_adapter.mjs +923 -132
  24. package/api/docs/detail/detail.mjs +11 -3
  25. package/api/docs/detail/section/section.mjs +24 -13
  26. package/api/docs/detail/section/section.test.mjs +15 -6
  27. package/api/docs/docs.d.mts +5 -3
  28. package/api/docs/docs.doc.mjs +39 -17
  29. package/api/docs/docs.mjs +44 -8
  30. package/api/docs/docs.test.mjs +158 -4
  31. package/api/docs/docs.type.d.mts +181 -2
  32. package/api/docs/docs.type.mjs +117 -3
  33. package/api/docs/index/index.mjs +11 -3
  34. package/api/docs/index/index.test.mjs +1 -1
  35. package/api/docs/integration-tree.test.mjs +555 -0
  36. package/api/docs/integrationDocs.test.mjs +14 -14
  37. package/api/docs/list/list.mjs +28 -12
  38. package/api/docs/node/node.d.mts +43 -0
  39. package/api/docs/node/node.mjs +192 -0
  40. package/api/docs/reference-blocks.test.mjs +406 -0
  41. package/api/doctor/doctor.d.mts +54 -4
  42. package/api/doctor/doctor.doc.mjs +1 -0
  43. package/api/doctor/doctor.mjs +331 -16
  44. package/api/doctor/doctor.test.mjs +420 -7
  45. package/api/gap-report/gap-report.doc.mjs +1 -0
  46. package/api/hook/_adapter.mjs +19 -5
  47. package/api/hook/hook.doc.mjs +1 -0
  48. package/api/hook/list/list.d.mts +1 -1
  49. package/api/hook/list/list.mjs +69 -17
  50. package/api/index.d.mts +1 -1
  51. package/api/index.mjs +1 -0
  52. package/api/init/init.doc.mjs +2 -1
  53. package/api/integration/add-contribution.d.mts +2 -1
  54. package/api/integration/add-contribution.mjs +114 -12
  55. package/api/integration/add-contribution.test.mjs +174 -3
  56. package/api/integration/add-theme.mjs +34 -64
  57. package/api/integration/add-theme.test.mjs +105 -21
  58. package/api/integration/authoring-checks.mjs +138 -28
  59. package/api/integration/authoring-checks.test.mjs +179 -7
  60. package/api/integration/authoring-checks.type.mjs +6 -1
  61. package/api/integration/integration-authoring.type.d.mts +2 -0
  62. package/api/integration/integration-authoring.type.mjs +2 -0
  63. package/api/integration/integration-block-exports.test.mjs +10 -6
  64. package/api/integration/integrationAdd.doc.mjs +7 -0
  65. package/api/integration/integrationAddAgentDoc.doc.mjs +1 -0
  66. package/api/integration/integrationAddCodemod.doc.mjs +1 -0
  67. package/api/integration/integrationAddComponent.doc.mjs +1 -0
  68. package/api/integration/integrationAddDoc.doc.mjs +8 -1
  69. package/api/integration/integrationAddTemplate.doc.mjs +1 -0
  70. package/api/integration/integrationAddTheme.doc.mjs +6 -5
  71. package/api/integration/integrationComponentConflicts.doc.mjs +1 -0
  72. package/api/integration/integrationDocConflicts.doc.mjs +2 -1
  73. package/api/integration/integrationPackCheck.doc.mjs +2 -1
  74. package/api/integration/integrationTemplateConflicts.doc.d.mts +3 -0
  75. package/api/integration/integrationTemplateConflicts.doc.mjs +4 -0
  76. package/api/integration/pack-check.mjs +34 -0
  77. package/api/integration/pack-check.test.mjs +138 -47
  78. package/api/integration/pack-check.type.d.mts +26 -2
  79. package/api/integration/pack-check.type.mjs +14 -1
  80. package/api/integration/summarizeIssues.doc.mjs +1 -0
  81. package/api/integration/template-conflict-compatibility.test.mjs +73 -0
  82. package/api/integration/validate-integration-fixes.test.mjs +1389 -0
  83. package/api/integration/validate-integration.mjs +50 -102
  84. package/api/integration/validate-integration.test.mjs +88 -26
  85. package/api/integration/validate-unread-theme-folders.test.mjs +110 -0
  86. package/api/integration/validateIntegration.doc.mjs +2 -1
  87. package/api/json/assertResponse.doc.mjs +1 -0
  88. package/api/json/index.ts +2 -0
  89. package/api/json/isError.doc.mjs +1 -0
  90. package/api/json/parseResponse.doc.mjs +1 -0
  91. package/api/layout/_adapter.mjs +20 -5
  92. package/api/layout/layoutCheck.doc.mjs +1 -0
  93. package/api/layout/layoutExpand.doc.mjs +1 -0
  94. package/api/layout/layoutGrammar.doc.mjs +1 -0
  95. package/api/search/search.d.mts +59 -1
  96. package/api/search/search.doc.mjs +5 -3
  97. package/api/search/search.mjs +458 -77
  98. package/api/search/search.test.mjs +91 -2
  99. package/api/search/search.type.d.mts +13 -1
  100. package/api/search/search.type.mjs +4 -1
  101. package/api/swizzle/swizzle.doc.mjs +1 -0
  102. package/api/template/list/list.mjs +1 -0
  103. package/api/template/table-floating-bulk-actions.test.mjs +66 -0
  104. package/api/template/template-integration.test.mjs +1072 -3
  105. package/api/template/template-suffix.test.mjs +41 -21
  106. package/api/template/template.doc.mjs +28 -7
  107. package/api/template/template.mjs +45 -8
  108. package/api/template/template.type.d.mts +6 -8
  109. package/api/template/template.type.mjs +3 -2
  110. package/api/theme/_adapter.d.mts +2 -3
  111. package/api/theme/_adapter.mjs +4 -5
  112. package/api/theme/add/add.binary.test.mjs +10 -17
  113. package/api/theme/add/add.test.mjs +14 -1
  114. package/api/theme/generateTonalPalette.doc.mjs +1 -0
  115. package/api/theme/integration-themes.test.mjs +39 -28
  116. package/api/theme/list/list.test.mjs +19 -20
  117. package/api/theme/listThemes.doc.mjs +6 -5
  118. package/api/theme/template/template.test.mjs +5 -0
  119. package/api/theme/themeAdd.doc.mjs +4 -3
  120. package/api/theme/themeBuild.doc.mjs +1 -0
  121. package/api/theme/themeList.doc.mjs +6 -3
  122. package/api/theme/themeListAvailable.doc.mjs +5 -3
  123. package/api/theme/themePaletteGenerate.doc.mjs +1 -0
  124. package/api/theme/themeTargets.doc.mjs +1 -0
  125. package/api/theme/themeTemplate.doc.mjs +2 -1
  126. package/api/upgrade/_adapter.d.mts +32 -5
  127. package/api/upgrade/_adapter.mjs +97 -69
  128. package/api/upgrade/provider-agreement.test.mjs +152 -0
  129. package/api/upgrade/run/run.mjs +356 -59
  130. package/api/upgrade/upgrade.doc.mjs +6 -1
  131. package/api/upgrade/upgrade.type.d.mts +34 -0
  132. package/api/upgrade/upgrade.type.mjs +15 -0
  133. package/assets/codemods/__tests__/runner.test.mjs +330 -8
  134. package/assets/codemods/integration-discovery.mjs +8 -2
  135. package/assets/codemods/integration-discovery.test.mjs +15 -0
  136. package/assets/codemods/integration-runner.mjs +56 -4
  137. package/assets/codemods/integration-runner.protection.test.mjs +153 -0
  138. package/assets/codemods/run-codemod.mjs +177 -34
  139. package/assets/codemods/runner.mjs +350 -102
  140. package/assets/codemods/transforms/next/__tests__/migrate-native-picker-to-presentation.test.mjs +63 -0
  141. package/assets/codemods/transforms/next/__tests__/migrate-theme-catalog-to-descriptors.test.mjs +220 -0
  142. package/assets/codemods/transforms/next/index.mjs +19 -1
  143. package/assets/codemods/transforms/next/migrate-native-picker-to-presentation.mjs +148 -0
  144. package/assets/codemods/transforms/next/migrate-theme-catalog-to-descriptors.mjs +141 -0
  145. package/assets/docs/getting-started.doc.mjs +2 -2
  146. package/assets/docs/layout.doc.dense.mjs +2 -2
  147. package/assets/docs/layout.doc.mjs +1 -1
  148. package/assets/docs/principles.doc.mjs +6 -6
  149. package/assets/docs/styling-libraries.doc.mjs +3 -3
  150. package/assets/docs/styling.doc.mjs +4 -4
  151. package/assets/docs/theme.doc.mjs +5 -5
  152. package/assets/docs/tokens.doc.mjs +1 -1
  153. package/assets/docs/tree/api.doc.mjs +30 -0
  154. package/assets/docs/tree/cli.doc.mjs +23 -0
  155. package/assets/docs/tree/commands.doc.mjs +25 -0
  156. package/assets/docs/{cli-integrations.doc.mjs → tree/integrations.doc.mjs} +66 -38
  157. package/assets/docs/tree/integrations.test.mjs +62 -0
  158. package/assets/docs/tree/writing-docs.doc.mjs +286 -0
  159. package/assets/docs/working-with-ai.doc.mjs +3 -3
  160. package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.doc.mjs +1 -1
  161. package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.tsx +1 -3
  162. package/assets/templates/blocks/components/DateInput/DateInputDateRange.tsx +1 -1
  163. package/assets/templates/blocks/components/Item/ItemDocumentTabs.doc.mjs +14 -0
  164. package/assets/templates/blocks/components/Item/ItemDocumentTabs.tsx +100 -0
  165. package/assets/templates/blocks/components/Table/TableBulkActionsTable.doc.mjs +14 -0
  166. package/assets/templates/blocks/components/Table/TableBulkActionsTable.tsx +71 -0
  167. package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.doc.mjs +19 -0
  168. package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.tsx +139 -0
  169. package/assets/templates/blocks/components/TimeInput/TimeInputConstrained.tsx +1 -0
  170. package/assets/templates/themes/butter/butterTheme.doc.mjs +11 -0
  171. package/assets/templates/themes/chocolate/chocolateTheme.doc.mjs +11 -0
  172. package/assets/templates/themes/gothic/gothicTheme.doc.mjs +11 -0
  173. package/assets/templates/themes/matcha/matchaTheme.doc.mjs +11 -0
  174. package/assets/templates/themes/neutral/neutralTheme.doc.mjs +11 -0
  175. package/assets/templates/themes/stone/stoneTheme.doc.mjs +11 -0
  176. package/assets/templates/themes/y2k/y2kTheme.doc.mjs +11 -0
  177. package/authoring/codemod/codemod.doc.mjs +1 -1
  178. package/authoring/codemod/type.ts +12 -0
  179. package/authoring/config/config.doc.mjs +1 -1
  180. package/authoring/debug/debug.doc.d.mts +11 -0
  181. package/authoring/debug/debug.doc.mjs +182 -0
  182. package/authoring/debug/parse.d.mts +3 -3
  183. package/authoring/doctypes/_schema.d.mts +119 -117
  184. package/authoring/doctypes/_schema.mjs +54 -3
  185. package/authoring/doctypes/base/graph-fields.doc.mjs +8 -6
  186. package/authoring/doctypes/base/type.ts +6 -5
  187. package/authoring/doctypes/command/command.doc.mjs +1 -1
  188. package/authoring/doctypes/command/type.ts +2 -2
  189. package/authoring/doctypes/component/type.ts +2 -2
  190. package/authoring/doctypes/doctypes-new.test.mjs +48 -6
  191. package/authoring/doctypes/enum/enum.doc.mjs +1 -1
  192. package/authoring/doctypes/enum/type.ts +1 -1
  193. package/authoring/doctypes/function/function.doc.mjs +3 -2
  194. package/authoring/doctypes/function/type.ts +3 -2
  195. package/authoring/doctypes/hook/type.ts +2 -2
  196. package/authoring/doctypes/load-contract.test.mjs +28 -2
  197. package/authoring/doctypes/namespace/namespace.doc.mjs +6 -10
  198. package/authoring/doctypes/namespace/parse.test.mjs +23 -25
  199. package/authoring/doctypes/namespace/type.ts +5 -2
  200. package/authoring/doctypes/parse.d.mts +4 -2
  201. package/authoring/doctypes/parse.mjs +10 -5
  202. package/authoring/doctypes/reference/reference.doc.mjs +35 -6
  203. package/authoring/doctypes/reference/type.ts +30 -13
  204. package/authoring/doctypes/schema/schema.doc.mjs +1 -1
  205. package/authoring/doctypes/schema/type.ts +1 -2
  206. package/authoring/doctypes/template/parse.d.mts +2 -0
  207. package/authoring/doctypes/template/parse.mjs +4 -0
  208. package/authoring/doctypes/template/parse.test.mjs +18 -0
  209. package/authoring/doctypes/template/template.doc.mjs +9 -3
  210. package/authoring/doctypes/template/type.ts +8 -0
  211. package/authoring/doctypes/theme/parse.d.mts +35 -0
  212. package/authoring/doctypes/theme/parse.mjs +76 -0
  213. package/authoring/doctypes/theme/theme.doc.d.mts +9 -0
  214. package/authoring/doctypes/theme/theme.doc.mjs +79 -0
  215. package/authoring/doctypes/theme/type.ts +42 -0
  216. package/authoring/doctypes/types.ts +2 -1
  217. package/authoring/gap-report/gap-report.doc.d.mts +12 -0
  218. package/authoring/gap-report/gap-report.doc.mjs +183 -0
  219. package/authoring/identity/identity.doc.mjs +2 -2
  220. package/authoring/index.d.mts +1 -0
  221. package/authoring/index.d.ts +7 -4
  222. package/authoring/index.mjs +2 -1
  223. package/authoring/integration/integration.doc.mjs +2 -2
  224. package/authoring/integration/type.ts +4 -10
  225. package/clients/cli/__tests__/cliManifest.test.ts +27 -29
  226. package/clients/cli/commands/blog.doc.mjs +1 -1
  227. package/clients/cli/commands/build-theme.adaptations.test.mjs +100 -1
  228. package/clients/cli/commands/build-theme.mjs +11 -45
  229. package/clients/cli/commands/build.doc.mjs +12 -7
  230. package/clients/cli/commands/build.mjs +105 -67
  231. package/clients/cli/commands/build.text-fields.test.mjs +41 -0
  232. package/clients/cli/commands/component/index.mjs +1 -1
  233. package/clients/cli/commands/component-ownership.test.mjs +3 -3
  234. package/clients/cli/commands/component.doc.mjs +1 -1
  235. package/clients/cli/commands/discover.broken-integration.test.mjs +7 -8
  236. package/clients/cli/commands/discover.doc.mjs +1 -1
  237. package/clients/cli/commands/discover.mjs +1 -1
  238. package/clients/cli/commands/docs.doc.mjs +21 -9
  239. package/clients/cli/commands/docs.mjs +184 -70
  240. package/clients/cli/commands/docs.test.mjs +120 -16
  241. package/clients/cli/commands/doctor-integration-components.doc.mjs +1 -1
  242. package/clients/cli/commands/doctor-integration-docs.doc.mjs +3 -3
  243. package/clients/cli/commands/doctor-integration-templates.doc.mjs +15 -8
  244. package/clients/cli/commands/doctor-integration-validate.doc.mjs +1 -1
  245. package/clients/cli/commands/doctor-integration.doc.mjs +1 -1
  246. package/clients/cli/commands/doctor-integration.test.mjs +90 -8
  247. package/clients/cli/commands/doctor.doc.mjs +1 -1
  248. package/clients/cli/commands/doctor.mjs +53 -16
  249. package/clients/cli/commands/gap-report.doc.mjs +1 -1
  250. package/clients/cli/commands/hook.doc.mjs +1 -1
  251. package/clients/cli/commands/init.doc.mjs +1 -1
  252. package/clients/cli/commands/integration-add.controls.test.mjs +1 -1
  253. package/clients/cli/commands/integration-add.doc.mjs +11 -1
  254. package/clients/cli/commands/integration-pack.doc.mjs +1 -1
  255. package/clients/cli/commands/integration-real-world.test.mjs +3 -9
  256. package/clients/cli/commands/integration.doc.mjs +1 -1
  257. package/clients/cli/commands/integration.mjs +1 -0
  258. package/clients/cli/commands/layout-check.doc.mjs +1 -1
  259. package/clients/cli/commands/layout-expand.doc.mjs +1 -1
  260. package/clients/cli/commands/layout-grammar.doc.mjs +1 -1
  261. package/clients/cli/commands/layout.doc.mjs +1 -1
  262. package/clients/cli/commands/manifest.doc.mjs +1 -1
  263. package/clients/cli/commands/search.doc.mjs +1 -1
  264. package/clients/cli/commands/search.mjs +11 -2
  265. package/clients/cli/commands/setup-nudge.test.mjs +6 -0
  266. package/clients/cli/commands/swizzle.doc.mjs +1 -1
  267. package/clients/cli/commands/template.doc.mjs +24 -7
  268. package/clients/cli/commands/template.mjs +4 -91
  269. package/clients/cli/commands/text-json-parity.test.mjs +719 -0
  270. package/clients/cli/commands/theme-add.doc.mjs +2 -2
  271. package/clients/cli/commands/theme-build.doc.mjs +1 -1
  272. package/clients/cli/commands/theme-list.doc.mjs +2 -2
  273. package/clients/cli/commands/theme-palette-generate.doc.mjs +3 -3
  274. package/clients/cli/commands/theme-palette.doc.mjs +1 -1
  275. package/clients/cli/commands/theme-targets.behavior.test.mjs +4 -3
  276. package/clients/cli/commands/theme-targets.doc.mjs +1 -1
  277. package/clients/cli/commands/theme-template.doc.mjs +1 -1
  278. package/clients/cli/commands/theme.doc.mjs +1 -1
  279. package/clients/cli/commands/upgrade.doc.mjs +3 -2
  280. package/clients/cli/commands/upgrade.file-protection.test.mjs +228 -0
  281. package/clients/cli/commands/upgrade.mjs +29 -7
  282. package/clients/cli/formatters/index.mjs +2 -0
  283. package/clients/cli/formatters/index.test.mjs +6 -0
  284. package/clients/cli/index.mjs +8 -0
  285. package/clients/cli/lib/hook-format.mjs +14 -5
  286. package/clients/cli/lib/manifest.mjs +9 -2
  287. package/foundation/agent-docs/agent-docs.d.mts +3 -2
  288. package/foundation/agent-docs/agent-docs.mjs +13 -9
  289. package/foundation/agent-docs/agent-docs.test.mjs +19 -1
  290. package/foundation/config/project-themes.test.mjs +11 -19
  291. package/foundation/config/project.d.mts +20 -11
  292. package/foundation/config/project.mjs +123 -80
  293. package/foundation/config/project.test.mjs +144 -21
  294. package/foundation/discovery/authoring-self-docs.d.mts +18 -0
  295. package/foundation/discovery/authoring-self-docs.mjs +37 -15
  296. package/foundation/discovery/authoring-self-docs.test.mjs +25 -9
  297. package/foundation/discovery/authoring-surface.d.mts +74 -0
  298. package/foundation/discovery/authoring-surface.mjs +525 -0
  299. package/foundation/discovery/authoring-surface.test.mjs +392 -0
  300. package/foundation/discovery/cli-self-docs.d.mts +119 -0
  301. package/foundation/discovery/cli-self-docs.mjs +490 -0
  302. package/foundation/discovery/cli-self-docs.test.mjs +375 -0
  303. package/foundation/discovery/component-discovery.d.mts +38 -0
  304. package/foundation/discovery/component-discovery.mjs +48 -0
  305. package/foundation/discovery/component-loader.d.mts +35 -38
  306. package/foundation/discovery/component-loader.mjs +53 -222
  307. package/foundation/discovery/docs-discovery.d.mts +112 -11
  308. package/foundation/discovery/docs-discovery.mjs +231 -36
  309. package/foundation/discovery/docs-discovery.test.mjs +111 -32
  310. package/foundation/discovery/docs-output-budget.d.mts +2 -2
  311. package/foundation/discovery/docs-output-budget.mjs +1 -1
  312. package/foundation/discovery/docs-section-key.d.mts +28 -10
  313. package/foundation/discovery/docs-section-key.mjs +134 -33
  314. package/foundation/discovery/docs-section-key.test.mjs +41 -19
  315. package/foundation/discovery/template-adapter.d.mts +99 -6
  316. package/foundation/discovery/template-adapter.mjs +480 -57
  317. package/foundation/discovery/template-adapter.test.mjs +57 -0
  318. package/foundation/discovery/template-conflict-release.d.mts +13 -0
  319. package/foundation/discovery/template-conflict-release.mjs +40 -0
  320. package/foundation/discovery/template-conflict-release.test.mjs +40 -0
  321. package/foundation/discovery/theme-discovery.d.mts +67 -7
  322. package/foundation/discovery/theme-discovery.mjs +916 -186
  323. package/foundation/discovery/theme-discovery.test.mjs +613 -219
  324. package/foundation/doc-compiler/bundle.d.mts +47 -0
  325. package/foundation/doc-compiler/bundle.mjs +278 -0
  326. package/foundation/doc-compiler/bundle.test.mjs +266 -0
  327. package/foundation/doc-compiler/compile.d.mts +220 -39
  328. package/foundation/doc-compiler/compile.mjs +311 -15
  329. package/foundation/doc-compiler/diagnostics.d.mts +126 -0
  330. package/foundation/doc-compiler/diagnostics.mjs +305 -0
  331. package/foundation/doc-compiler/doc-compiler.test.mjs +28 -1
  332. package/foundation/doc-compiler/doc-loads.test.mjs +1642 -0
  333. package/foundation/doc-compiler/import.d.mts +24 -0
  334. package/foundation/doc-compiler/import.mjs +59 -0
  335. package/foundation/doc-compiler/inputs.d.mts +102 -0
  336. package/foundation/doc-compiler/inputs.mjs +291 -0
  337. package/foundation/doc-compiler/inputs.test.mjs +299 -0
  338. package/foundation/doc-compiler/ir.d.mts +13 -0
  339. package/foundation/doc-compiler/ir.mjs +196 -12
  340. package/foundation/doc-compiler/lenses.d.mts +8 -5
  341. package/foundation/doc-compiler/lenses.mjs +50 -4
  342. package/foundation/doc-compiler/links.d.mts +162 -0
  343. package/foundation/doc-compiler/links.mjs +294 -0
  344. package/foundation/doc-compiler/links.test.mjs +192 -0
  345. package/foundation/doc-compiler/lower-doc.test.mjs +495 -0
  346. package/foundation/doc-compiler/overlays.d.mts +37 -0
  347. package/foundation/doc-compiler/overlays.mjs +206 -0
  348. package/foundation/doc-compiler/parse-readable.d.mts +9 -0
  349. package/foundation/doc-compiler/parse-readable.mjs +29 -0
  350. package/foundation/doc-compiler/read.d.mts +127 -0
  351. package/foundation/doc-compiler/read.mjs +325 -0
  352. package/foundation/doc-compiler/read.test.mjs +313 -0
  353. package/foundation/doc-compiler/source.d.mts +33 -0
  354. package/foundation/doc-compiler/source.mjs +128 -0
  355. package/foundation/doc-compiler/tree.d.mts +288 -0
  356. package/foundation/doc-compiler/tree.mjs +876 -0
  357. package/foundation/doc-compiler/tree.test.mjs +598 -0
  358. package/foundation/fs/file-protection.d.mts +33 -0
  359. package/foundation/fs/file-protection.mjs +825 -0
  360. package/foundation/fs/file-protection.test.mjs +250 -0
  361. package/foundation/integrations/autolink.d.mts +58 -1
  362. package/foundation/integrations/autolink.mjs +143 -57
  363. package/foundation/integrations/autolink.test.mjs +1 -1
  364. package/foundation/integrations/cli-requirement.d.mts +45 -0
  365. package/foundation/integrations/cli-requirement.mjs +154 -0
  366. package/foundation/integrations/cli-requirement.test.mjs +84 -0
  367. package/foundation/integrations/contribution-fixes.d.mts +145 -0
  368. package/foundation/integrations/contribution-fixes.mjs +1284 -0
  369. package/foundation/integrations/contribution-inventory.d.mts +3 -2
  370. package/foundation/integrations/contribution-inventory.mjs +27 -24
  371. package/foundation/integrations/contribution-inventory.test.mjs +86 -27
  372. package/foundation/integrations/integration-warnings.d.mts +9 -2
  373. package/foundation/integrations/integration-warnings.mjs +51 -26
  374. package/foundation/integrations/integration-warnings.test.mjs +74 -1
  375. package/foundation/integrations/integrations.d.mts +3 -0
  376. package/foundation/integrations/integrations.mjs +11 -97
  377. package/foundation/integrations/provider-ledger.test.mjs +275 -0
  378. package/foundation/integrations/provider-resolution.d.mts +152 -0
  379. package/foundation/integrations/provider-resolution.mjs +576 -0
  380. package/foundation/integrations/provider-resolution.test.mjs +369 -0
  381. package/foundation/integrations/theme-descriptor.d.mts +8 -0
  382. package/foundation/integrations/theme-descriptor.mjs +44 -0
  383. package/foundation/integrations/validate-contributions.mjs +121 -29
  384. package/foundation/response/error-codes.d.mts +3 -1
  385. package/foundation/response/error-codes.d.ts +2 -0
  386. package/foundation/response/error-codes.doc.mjs +12 -2
  387. package/foundation/response/error-codes.mjs +7 -1
  388. package/foundation/response/error-codes.test.mjs +55 -11
  389. package/foundation/response/response-types.doc.d.mts +5 -1
  390. package/foundation/response/response-types.doc.mjs +20 -11
  391. package/foundation/response/response.doc.mjs +1 -1
  392. package/foundation/text/string-utils.d.mts +8 -0
  393. package/foundation/text/string-utils.mjs +40 -10
  394. package/foundation/xle/expand.mjs +1 -1
  395. package/foundation/xle/xle.test.mjs +13 -0
  396. package/package.json +10 -9
  397. package/assets/templates/themes/manifest.json +0 -95
@@ -0,0 +1,490 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file The CLI's own typed docs, read by their `namespace`: every command,
5
+ * API function, schema, and enum doc the CLI ships names the group that reads
6
+ * it. The docs tree adopts `cli/commands` and `cli/api` (spec:AST-046); the
7
+ * authoring topic reads `authoring` from its own list.
8
+ *
9
+ * @input The command, function, schema, and enum docs under
10
+ * clients/cli/commands, api, authoring, and foundation.
11
+ * @output {@link loadCliSelfDocs} for the docs tree, {@link cliDocSection} for
12
+ * what `astryx docs <route>` prints for one of them, and
13
+ * {@link auditCliSelfDocs}, which `astryx doctor` runs.
14
+ * @position foundation/discovery. The tree (doc-compiler/tree.mjs) gives each
15
+ * doc its route; this module only loads the docs and renders one.
16
+ */
17
+
18
+ import * as fs from 'node:fs';
19
+ import * as path from 'node:path';
20
+ import {CLI_ROOT} from '../fs/paths.mjs';
21
+ import {readDocView} from '../doc-compiler/read.mjs';
22
+ import {AUTHORING_SELF_DOCS, selfDocSection} from './authoring-self-docs.mjs';
23
+ import {
24
+ DOC_OUTPUT_BUDGET_BYTES,
25
+ oversizedDocSections,
26
+ } from './docs-output-budget.mjs';
27
+ import {routeSegment} from './docs-section-key.mjs';
28
+
29
+ /** The directories, relative to the CLI root, that hold the CLI's own docs. */
30
+ export const CLI_SELF_DOC_DIRS = [
31
+ 'clients/cli/commands',
32
+ 'api',
33
+ 'authoring',
34
+ 'foundation',
35
+ ];
36
+
37
+ /** The doc kinds that declare a namespace. */
38
+ const NAMESPACED_KINDS = new Set(['command', 'function', 'schema', 'enum']);
39
+
40
+ /**
41
+ * Every namespace a CLI doc may declare, and what reads it. The docs tree
42
+ * adopts `cli/commands` (under `cli/commands`) and `cli/api` (under
43
+ * `cli/api/<kind>s`); `astryx docs authoring` reads `authoring` from its list.
44
+ * @type {Record<string, {reader: 'tree' | 'authoring'}>}
45
+ */
46
+ export const CLI_DOC_NAMESPACES = {
47
+ 'cli/commands': {reader: 'tree'},
48
+ 'cli/api': {reader: 'tree'},
49
+ authoring: {reader: 'authoring'},
50
+ };
51
+
52
+ /** Blocks a doc's notes may carry that a topic section can render. */
53
+ const TOPIC_BLOCKS = new Set(['prose', 'list', 'code', 'heading', 'table']);
54
+
55
+ /**
56
+ * Every `*.doc.mjs` under the CLI's doc directories, relative to `root` and
57
+ * sorted. Fixture, test, and dependency directories are skipped.
58
+ * @param {string} [root]
59
+ * @returns {string[]}
60
+ */
61
+ export function discoverCliSelfDocSources(root = CLI_ROOT) {
62
+ /** @type {string[]} */
63
+ const found = [];
64
+ /** @param {string} dir */
65
+ const walk = dir => {
66
+ if (!fs.existsSync(dir)) return;
67
+ for (const entry of fs.readdirSync(dir, {withFileTypes: true})) {
68
+ if (
69
+ entry.name === 'node_modules' ||
70
+ entry.name.startsWith('__') ||
71
+ entry.name.startsWith('.')
72
+ ) {
73
+ continue;
74
+ }
75
+ const full = path.join(dir, entry.name);
76
+ if (entry.isDirectory()) walk(full);
77
+ else if (entry.name.endsWith('.doc.mjs')) {
78
+ found.push(path.relative(root, full).split(path.sep).join('/'));
79
+ }
80
+ }
81
+ };
82
+ for (const dir of CLI_SELF_DOC_DIRS) walk(path.join(root, dir));
83
+ return found.sort();
84
+ }
85
+
86
+ /**
87
+ * Read each doc through the compiler and keep the kinds that declare a
88
+ * namespace. One that fails is reported, never thrown, so one bad file cannot
89
+ * take the rest of the topic down with it.
90
+ * @param {string[]} [sources]
91
+ * @param {string} [root]
92
+ * @returns {Promise<{loaded: {source: string, doc: any}[], failed: {source: string, error: string}[]}>}
93
+ */
94
+ export async function loadCliSelfDocs(
95
+ sources = discoverCliSelfDocSources(),
96
+ root = CLI_ROOT,
97
+ ) {
98
+ const loaded = [];
99
+ const failed = [];
100
+ for (const source of sources) {
101
+ try {
102
+ const doc = await readDocView(path.join(root, source), {
103
+ root: 'self-docs',
104
+ loader: 'native',
105
+ });
106
+ if (!NAMESPACED_KINDS.has(doc?.type)) continue;
107
+ if (typeof doc.name !== 'string' || doc.name === '') {
108
+ throw new Error('exports no doc with a name');
109
+ }
110
+ loaded.push({source, doc});
111
+ } catch (error) {
112
+ failed.push({
113
+ source,
114
+ error: error instanceof Error ? error.message : String(error),
115
+ });
116
+ }
117
+ }
118
+ return {loaded, failed};
119
+ }
120
+
121
+ /**
122
+ * What cross-links need: the loaded function docs by name, the command names,
123
+ * and the route the docs tree gave a doc, if it gave one.
124
+ * @typedef {object} CliDocIndex
125
+ * @property {Map<string, any>} functions
126
+ * @property {Set<string>} commands
127
+ * @property {(kind: string, name: string) => string | null} route
128
+ */
129
+
130
+ /**
131
+ * @param {any[]} docs every loaded CLI typed doc
132
+ * @param {(kind: string, name: string) => string | null} [route]
133
+ * @returns {CliDocIndex}
134
+ */
135
+ export function cliDocIndex(docs, route = () => null) {
136
+ return {
137
+ functions: new Map(
138
+ docs.filter(d => d.type === 'function').map(d => [d.name, d]),
139
+ ),
140
+ commands: new Set(docs.filter(d => d.type === 'command').map(d => d.name)),
141
+ route,
142
+ };
143
+ }
144
+
145
+ /** @param {unknown} value */
146
+ function defaultText(value) {
147
+ if (value === undefined || value === false || value === '') return null;
148
+ if (Array.isArray(value)) return value.length > 0 ? value.join(' ') : null;
149
+ return String(value);
150
+ }
151
+
152
+ /**
153
+ * @param {any} cmd
154
+ * @returns {string}
155
+ */
156
+ function usage(cmd) {
157
+ const args = (cmd.args ?? []).map((/** @type {any} */ arg) => {
158
+ const name = arg.variadic ? `${arg.name}...` : arg.name;
159
+ return arg.required ? `<${name}>` : `[${name}]`;
160
+ });
161
+ return ['astryx', cmd.name, ...args].join(' ');
162
+ }
163
+
164
+ /**
165
+ * The text for a command option or argument: its own, or else the text of the
166
+ * API parameter it maps to, as `--help` shows.
167
+ * @param {{description?: string, param?: string}} entry
168
+ * @param {any} fn the FunctionDoc the command calls, if any
169
+ * @returns {string}
170
+ */
171
+ function entryText(entry, fn) {
172
+ if (typeof entry.description === 'string' && entry.description !== '') {
173
+ return entry.description;
174
+ }
175
+ const param = (fn?.params ?? []).find(
176
+ (/** @type {any} */ p) => p.name === entry.param,
177
+ );
178
+ return typeof param?.description === 'string' ? param.description : '';
179
+ }
180
+
181
+ /**
182
+ * `text`, ending in a full stop when more text follows it in the same cell.
183
+ * @param {string} text
184
+ * @param {boolean} more
185
+ */
186
+ function sentence(text, more) {
187
+ return more && text !== '' && !/[.!?:]$/.test(text) ? `${text}.` : text;
188
+ }
189
+
190
+ /** @param {any[]} notes */
191
+ function noteBlocks(notes) {
192
+ return (notes ?? []).filter(note => TOPIC_BLOCKS.has(note?.type));
193
+ }
194
+
195
+ /**
196
+ * What `astryx docs <route>` prints for one command doc.
197
+ * @param {any} cmd
198
+ * @param {CliDocIndex} index
199
+ */
200
+ function commandSection(cmd, index) {
201
+ const fn = cmd.fn == null ? undefined : index.functions.get(cmd.fn);
202
+ /** @type {any[]} */
203
+ const content = [{type: 'prose', text: cmd.summary}];
204
+ if (cmd.description) content.push({type: 'prose', text: cmd.description});
205
+ content.push({type: 'code', lang: 'bash', code: usage(cmd)});
206
+ const args = cmd.args ?? [];
207
+ if (args.length > 0) {
208
+ content.push({
209
+ type: 'table',
210
+ headers: ['Argument', 'Description'],
211
+ rows: args.map((/** @type {any} */ arg) => [
212
+ `\`${arg.name}\``,
213
+ entryText(arg, fn),
214
+ ]),
215
+ });
216
+ }
217
+ const options = cmd.options ?? [];
218
+ if (options.length > 0) {
219
+ content.push({
220
+ type: 'table',
221
+ headers: ['Option', 'Description'],
222
+ rows: options.map((/** @type {any} */ option) => {
223
+ const extra = [
224
+ option.choices?.length
225
+ ? `One of: ${option.choices.map((/** @type {string} */ c) => `\`${c}\``).join(', ')}.`
226
+ : null,
227
+ defaultText(option.default) == null
228
+ ? null
229
+ : `Default: \`${defaultText(option.default)}\`.`,
230
+ ].filter(Boolean);
231
+ return [
232
+ `\`${option.flag}\``,
233
+ [sentence(entryText(option, fn), extra.length > 0), ...extra]
234
+ .filter(Boolean)
235
+ .join(' '),
236
+ ];
237
+ }),
238
+ });
239
+ }
240
+ const examples = (cmd.examples ?? []).flatMap((/** @type {any} */ e) =>
241
+ e.label ? [`# ${e.label}`, e.cli] : [e.cli],
242
+ );
243
+ if (examples.length > 0) {
244
+ content.push({type: 'code', lang: 'bash', code: examples.join('\n')});
245
+ }
246
+ const exitCodes = cmd.exitCodes ?? [];
247
+ if (exitCodes.length > 0) {
248
+ content.push({
249
+ type: 'table',
250
+ headers: ['Exit code', 'When'],
251
+ rows: exitCodes.map((/** @type {any} */ e) => [String(e.code), e.when]),
252
+ });
253
+ }
254
+ // Links name docs by identity; the route in each command is derived when
255
+ // the doc is read (spec:AST-047 FR9).
256
+ const subcommands = (cmd.subcommands ?? []).filter(
257
+ (/** @type {string} */ sub) => index.commands.has(`${cmd.name} ${sub}`),
258
+ );
259
+ if (subcommands.length > 0) {
260
+ content.push({
261
+ type: 'list',
262
+ style: 'unordered',
263
+ items: subcommands.map(
264
+ (/** @type {string} */ sub) =>
265
+ `\`astryx ${cmd.name} ${sub}\`: {@link command:${cmd.name} ${sub}}`,
266
+ ),
267
+ });
268
+ }
269
+ if (fn != null) {
270
+ content.push({
271
+ type: 'prose',
272
+ text: `It runs \`${fn.name}()\` from \`${fn.importPath}\`. Read it with {@link function:${fn.name}}.`,
273
+ });
274
+ }
275
+ content.push(...noteBlocks(cmd.notes));
276
+ return {
277
+ id: routeSegment(cmd.name),
278
+ title: cmd.displayName ?? `astryx ${cmd.name}`,
279
+ content,
280
+ };
281
+ }
282
+
283
+ /**
284
+ * The command doc a command line belongs to: its longest leading words that
285
+ * name one (`integration add theme` is the `integration add` command).
286
+ * @param {string} line
287
+ * @param {Set<string>} commands
288
+ * @returns {string | null}
289
+ */
290
+ function commandDocName(line, commands) {
291
+ const words = line.trim().split(/\s+/);
292
+ for (let n = words.length; n > 0; n--) {
293
+ const name = words.slice(0, n).join(' ');
294
+ if (commands.has(name)) return name;
295
+ }
296
+ return null;
297
+ }
298
+
299
+ /**
300
+ * What `astryx docs <route>` prints for one API function doc.
301
+ * @param {any} fn
302
+ * @param {CliDocIndex} index
303
+ */
304
+ function functionSection(fn, index) {
305
+ /** @type {any[]} */
306
+ const content = [{type: 'prose', text: fn.summary ?? fn.description ?? ''}];
307
+ if (fn.summary && fn.description) {
308
+ content.push({type: 'prose', text: fn.description});
309
+ }
310
+ if (fn.signature) {
311
+ content.push({type: 'code', lang: 'ts', code: fn.signature});
312
+ }
313
+ if (fn.importPath) {
314
+ content.push({type: 'prose', text: `Import it from \`${fn.importPath}\`.`});
315
+ }
316
+ const params = fn.params ?? [];
317
+ if (params.length > 0) {
318
+ content.push({
319
+ type: 'table',
320
+ headers: ['Parameter', 'Type', 'Description'],
321
+ rows: params.map((/** @type {any} */ p) => [
322
+ `\`${p.name}\``,
323
+ `\`${p.type ?? ''}\``,
324
+ p.description ?? '',
325
+ ]),
326
+ });
327
+ }
328
+ const returns = fn.returns ?? [];
329
+ if (returns.length > 0) {
330
+ content.push({
331
+ type: 'table',
332
+ headers: ['Returns', 'Description'],
333
+ rows: returns.map((/** @type {any} */ r) => [
334
+ `\`${r.name ? `${r.name}: ` : ''}${r.type}\``,
335
+ r.description ?? '',
336
+ ]),
337
+ });
338
+ }
339
+ const throws = fn.throws ?? [];
340
+ if (throws.length > 0) {
341
+ content.push({
342
+ type: 'table',
343
+ headers: ['Throws', 'When'],
344
+ rows: throws.map((/** @type {any} */ t) => [`\`${t.code}\``, t.when]),
345
+ });
346
+ }
347
+ for (const example of fn.examples ?? []) {
348
+ if (typeof example?.code !== 'string' || example.code.trim() === '') {
349
+ continue;
350
+ }
351
+ content.push({
352
+ type: 'code',
353
+ lang: 'ts',
354
+ ...(example.label ? {label: example.label} : {}),
355
+ code: example.code,
356
+ });
357
+ }
358
+ const commandDoc =
359
+ fn.command == null ? null : commandDocName(fn.command, index.commands);
360
+ if (commandDoc != null) {
361
+ content.push({
362
+ type: 'prose',
363
+ text: `\`astryx ${fn.command}\` runs it. Read it with {@link command:${commandDoc}}.`,
364
+ });
365
+ }
366
+ return {
367
+ id: routeSegment(fn.name),
368
+ title: fn.displayName ?? `${fn.name}()`,
369
+ content,
370
+ };
371
+ }
372
+
373
+ /**
374
+ * What `astryx docs <route>` prints for one enum doc.
375
+ * @param {any} doc
376
+ */
377
+ function enumSection(doc) {
378
+ return {
379
+ id: routeSegment(doc.name),
380
+ title: doc.displayName ?? doc.name,
381
+ content: [
382
+ {type: 'prose', text: doc.description},
383
+ {
384
+ type: 'table',
385
+ headers: ['Value', 'Meaning'],
386
+ rows: (doc.members ?? []).map((/** @type {any} */ m) => [
387
+ `\`${m.value}\``,
388
+ m.deprecated
389
+ ? `${m.description} Deprecated: ${m.deprecated}`
390
+ : m.description,
391
+ ]),
392
+ },
393
+ ],
394
+ };
395
+ }
396
+
397
+ /**
398
+ * What `astryx docs <route>` prints for one CLI typed doc: its title and the
399
+ * blocks of its content, with cross-links to the routes the tree gave.
400
+ * @param {any} doc
401
+ * @param {CliDocIndex} index
402
+ * @returns {{id: string, title: string, content: any[]}}
403
+ */
404
+ export function cliDocSection(doc, index) {
405
+ if (doc.type === 'command') return commandSection(doc, index);
406
+ if (doc.type === 'function') return functionSection(doc, index);
407
+ if (doc.type === 'enum') return enumSection(doc);
408
+ return {...selfDocSection(doc), id: routeSegment(doc.name)};
409
+ }
410
+
411
+ /**
412
+ * What stands between a CLI doc and a reader: a missing namespace, one nothing
413
+ * reads, one that disagrees with the authoring topic's list, a doc that fails
414
+ * to load, and a tree leaf too large for one read. Whether the tree gives
415
+ * every `cli/...` doc a route is the docs-tree check's job.
416
+ * @param {{root?: string, sources?: string[], budget?: number, authoringSources?: string[]}} [options]
417
+ * @returns {Promise<{
418
+ * docs: number,
419
+ * tree: number,
420
+ * authoring: number,
421
+ * missing: string[],
422
+ * unknown: {source: string, namespace: string}[],
423
+ * misfiled: {source: string, message: string}[],
424
+ * failed: {source: string, error: string}[],
425
+ * oversized: {key: string, title: string, bytes: number}[],
426
+ * }>}
427
+ */
428
+ export async function auditCliSelfDocs({
429
+ root = CLI_ROOT,
430
+ sources,
431
+ budget = DOC_OUTPUT_BUDGET_BYTES,
432
+ authoringSources = AUTHORING_SELF_DOCS,
433
+ } = {}) {
434
+ const {loaded, failed} = await loadCliSelfDocs(
435
+ sources ?? discoverCliSelfDocSources(root),
436
+ root,
437
+ );
438
+ const listed = new Set(authoringSources.map(source => `authoring/${source}`));
439
+ /** @type {string[]} */
440
+ const missing = [];
441
+ /** @type {{source: string, namespace: string}[]} */
442
+ const unknown = [];
443
+ /** @type {{source: string, message: string}[]} */
444
+ const misfiled = [];
445
+ /** @type {any[]} */
446
+ const treeDocs = [];
447
+ let authoring = 0;
448
+ for (const {source, doc} of loaded) {
449
+ const namespace = doc.namespace;
450
+ if (typeof namespace !== 'string' || namespace === '') {
451
+ missing.push(source);
452
+ continue;
453
+ }
454
+ if (!Object.hasOwn(CLI_DOC_NAMESPACES, namespace)) {
455
+ unknown.push({source, namespace});
456
+ continue;
457
+ }
458
+ const inAuthoring = listed.has(source);
459
+ if (CLI_DOC_NAMESPACES[namespace].reader === 'authoring') {
460
+ if (inAuthoring) authoring++;
461
+ else {
462
+ misfiled.push({
463
+ source,
464
+ message: `${source} has namespace "authoring", but \`astryx docs authoring\` does not list it`,
465
+ });
466
+ }
467
+ } else if (inAuthoring) {
468
+ misfiled.push({
469
+ source,
470
+ message: `${source} is read in \`astryx docs authoring\`, but its namespace is "${namespace}"`,
471
+ });
472
+ } else {
473
+ treeDocs.push(doc);
474
+ }
475
+ }
476
+ const index = cliDocIndex(loaded.map(entry => entry.doc));
477
+ return {
478
+ docs: loaded.length,
479
+ tree: treeDocs.length,
480
+ authoring,
481
+ missing,
482
+ unknown,
483
+ misfiled,
484
+ failed,
485
+ oversized: oversizedDocSections(
486
+ treeDocs.map(doc => cliDocSection(doc, index)),
487
+ budget,
488
+ ),
489
+ };
490
+ }