@astryxdesign/cli 0.6.3-canary.f22695a → 0.6.3-canary.f839b67

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 (518) hide show
  1. package/README.md +115 -78
  2. package/api/blog/blog.doc.mjs +1 -0
  3. package/api/build/_adapter.d.mts +50 -0
  4. package/api/build/_adapter.mjs +60 -0
  5. package/api/build/build.doc.mjs +16 -9
  6. package/api/build/build.test.mjs +197 -8
  7. package/api/build/build.type.d.mts +91 -2
  8. package/api/build/build.type.mjs +52 -8
  9. package/api/build/help/help.d.mts +12 -5
  10. package/api/build/help/help.mjs +69 -6
  11. package/api/build/kit/kit.d.mts +4 -1
  12. package/api/build/kit/kit.mjs +165 -49
  13. package/api/build/kit/rank.d.mts +44 -0
  14. package/api/build/kit/rank.mjs +432 -0
  15. package/api/build/kit/rank.test.mjs +196 -0
  16. package/api/component/_adapter.d.mts +6 -12
  17. package/api/component/_adapter.mjs +20 -10
  18. package/api/component/component.doc.mjs +13 -3
  19. package/api/component/component.mjs +91 -14
  20. package/api/component/component.test.mjs +38 -0
  21. package/api/component/component.type.d.mts +16 -5
  22. package/api/component/component.type.mjs +13 -5
  23. package/api/component/detail/blocks/blocks.d.mts +2 -1
  24. package/api/component/detail/blocks/blocks.mjs +4 -3
  25. package/api/component/list/list.d.mts +0 -5
  26. package/api/component/list/list.mjs +40 -11
  27. package/api/discover/discover.doc.mjs +2 -1
  28. package/api/docs/_adapter.d.mts +210 -34
  29. package/api/docs/_adapter.mjs +674 -134
  30. package/api/docs/detail/detail.mjs +11 -3
  31. package/api/docs/detail/section/section.mjs +24 -13
  32. package/api/docs/detail/section/section.test.mjs +15 -6
  33. package/api/docs/docs.d.mts +5 -3
  34. package/api/docs/docs.doc.mjs +36 -15
  35. package/api/docs/docs.mjs +44 -8
  36. package/api/docs/docs.test.mjs +158 -4
  37. package/api/docs/docs.type.d.mts +165 -2
  38. package/api/docs/docs.type.mjs +101 -3
  39. package/api/docs/index/index.mjs +11 -3
  40. package/api/docs/index/index.test.mjs +1 -1
  41. package/api/docs/integration-tree.test.mjs +547 -0
  42. package/api/docs/integrationDocs.test.mjs +14 -14
  43. package/api/docs/list/list.mjs +28 -12
  44. package/api/docs/node/node.d.mts +43 -0
  45. package/api/docs/node/node.mjs +192 -0
  46. package/api/doctor/doctor.d.mts +54 -4
  47. package/api/doctor/doctor.doc.mjs +1 -0
  48. package/api/doctor/doctor.mjs +327 -16
  49. package/api/doctor/doctor.test.mjs +420 -7
  50. package/api/gap-report/gap-report.doc.mjs +8 -4
  51. package/api/hook/_adapter.mjs +19 -5
  52. package/api/hook/hook.doc.mjs +1 -0
  53. package/api/hook/list/list.d.mts +1 -1
  54. package/api/hook/list/list.mjs +69 -17
  55. package/api/index.d.mts +1 -1
  56. package/api/index.mjs +1 -0
  57. package/api/init/init.doc.mjs +6 -1
  58. package/api/init/init.test.mjs +41 -1
  59. package/api/init/remove/remove.mjs +1 -1
  60. package/api/init/run/run.mjs +20 -10
  61. package/api/integration/add-contribution.component-names.test.mjs +120 -0
  62. package/api/integration/add-contribution.d.mts +2 -1
  63. package/api/integration/add-contribution.mjs +125 -12
  64. package/api/integration/add-contribution.test.mjs +254 -3
  65. package/api/integration/add-theme.mjs +34 -64
  66. package/api/integration/add-theme.test.mjs +105 -21
  67. package/api/integration/authoring-checks.mjs +125 -28
  68. package/api/integration/authoring-checks.test.mjs +179 -7
  69. package/api/integration/authoring-checks.type.mjs +6 -1
  70. package/api/integration/integration-authoring.type.d.mts +2 -0
  71. package/api/integration/integration-authoring.type.mjs +2 -0
  72. package/api/integration/integration-block-exports.test.mjs +10 -6
  73. package/api/integration/integrationAdd.doc.mjs +14 -4
  74. package/api/integration/integrationAddAgentDoc.doc.mjs +1 -0
  75. package/api/integration/integrationAddCodemod.doc.mjs +1 -0
  76. package/api/integration/integrationAddComponent.doc.mjs +2 -1
  77. package/api/integration/integrationAddDoc.doc.mjs +8 -1
  78. package/api/integration/integrationAddTemplate.doc.mjs +1 -0
  79. package/api/integration/integrationAddTheme.doc.mjs +6 -5
  80. package/api/integration/integrationComponentConflicts.doc.mjs +1 -0
  81. package/api/integration/integrationDocConflicts.doc.mjs +2 -1
  82. package/api/integration/integrationPackCheck.doc.mjs +2 -1
  83. package/api/integration/integrationTemplateConflicts.doc.d.mts +3 -0
  84. package/api/integration/integrationTemplateConflicts.doc.mjs +4 -0
  85. package/api/integration/pack-check.mjs +34 -0
  86. package/api/integration/pack-check.test.mjs +138 -47
  87. package/api/integration/pack-check.type.d.mts +26 -2
  88. package/api/integration/pack-check.type.mjs +14 -1
  89. package/api/integration/summarizeIssues.doc.mjs +1 -0
  90. package/api/integration/template-conflict-compatibility.test.mjs +73 -0
  91. package/api/integration/validate-integration-fixes.test.mjs +1389 -0
  92. package/api/integration/validate-integration.mjs +52 -102
  93. package/api/integration/validate-integration.test.mjs +179 -26
  94. package/api/integration/validate-unread-theme-folders.test.mjs +110 -0
  95. package/api/integration/validateIntegration.doc.mjs +3 -2
  96. package/api/json/assertResponse.doc.mjs +1 -0
  97. package/api/json/envelope-types.test.mjs +76 -0
  98. package/api/json/index.ts +2 -0
  99. package/api/json/isError.doc.mjs +1 -0
  100. package/api/json/parseResponse.doc.mjs +3 -2
  101. package/api/layout/_adapter.mjs +20 -5
  102. package/api/layout/expand/expand.mjs +7 -5
  103. package/api/layout/expand/expand.path-safety.test.mjs +53 -0
  104. package/api/layout/grammar/grammar.mjs +2 -1
  105. package/api/layout/layoutCheck.doc.mjs +1 -0
  106. package/api/layout/layoutExpand.doc.mjs +2 -1
  107. package/api/layout/layoutGrammar.doc.mjs +1 -0
  108. package/api/search/search-return-type.test.mjs +54 -0
  109. package/api/search/search.d.mts +61 -10
  110. package/api/search/search.doc.mjs +8 -2
  111. package/api/search/search.mjs +468 -80
  112. package/api/search/search.test.mjs +124 -1
  113. package/api/search/search.type.d.mts +13 -1
  114. package/api/search/search.type.mjs +4 -1
  115. package/api/swizzle/copy/copy.mjs +28 -11
  116. package/api/swizzle/swizzle.doc.mjs +2 -1
  117. package/api/template/copy/copy.mjs +17 -23
  118. package/api/template/copy/copy.test.mjs +17 -0
  119. package/api/template/list/list.mjs +1 -0
  120. package/api/template/template-integration.test.mjs +1072 -3
  121. package/api/template/template-suffix.test.mjs +41 -21
  122. package/api/template/template.doc.mjs +30 -8
  123. package/api/template/template.mjs +45 -8
  124. package/api/template/template.type.d.mts +6 -8
  125. package/api/template/template.type.mjs +3 -2
  126. package/api/theme/_adapter.d.mts +2 -3
  127. package/api/theme/_adapter.mjs +4 -5
  128. package/api/theme/add/add.binary.test.mjs +84 -0
  129. package/api/theme/add/add.mjs +20 -3
  130. package/api/theme/add/add.staging.test.mjs +66 -0
  131. package/api/theme/add/add.test.mjs +14 -1
  132. package/api/theme/build/build.mjs +114 -37
  133. package/api/theme/build/build.public-component-vars.test.mjs +1 -1
  134. package/api/theme/build/build.receipt-doc.test.mjs +111 -0
  135. package/api/theme/build/font-warning.mjs +3 -3
  136. package/api/theme/build/font-warning.test.mjs +5 -2
  137. package/api/theme/generateTonalPalette.doc.mjs +1 -0
  138. package/api/theme/integration-themes.test.mjs +39 -28
  139. package/api/theme/list/list.test.mjs +19 -20
  140. package/api/theme/listThemes.doc.mjs +6 -5
  141. package/api/theme/palette/generate/generate.mjs +7 -2
  142. package/api/theme/palette/generate/generate.test.mjs +96 -0
  143. package/api/theme/palette/generate/generator.mjs +8 -1
  144. package/api/theme/palette/generate/generator.test.mjs +10 -0
  145. package/api/theme/template/template.mjs +11 -2
  146. package/api/theme/template/template.test.mjs +20 -0
  147. package/api/theme/themeAdd.doc.mjs +4 -3
  148. package/api/theme/themeBuild.doc.mjs +8 -4
  149. package/api/theme/themeList.doc.mjs +6 -3
  150. package/api/theme/themeListAvailable.doc.mjs +5 -3
  151. package/api/theme/themePaletteGenerate.doc.mjs +1 -0
  152. package/api/theme/themeTargets.doc.mjs +1 -0
  153. package/api/theme/themeTemplate.doc.mjs +6 -2
  154. package/api/upgrade/_adapter.d.mts +32 -5
  155. package/api/upgrade/_adapter.mjs +124 -73
  156. package/api/upgrade/list/list.mjs +2 -1
  157. package/api/upgrade/list/list.test.mjs +73 -0
  158. package/api/upgrade/provider-agreement.test.mjs +152 -0
  159. package/api/upgrade/run/run.mjs +356 -59
  160. package/api/upgrade/status/status.mjs +2 -2
  161. package/api/upgrade/upgrade.doc.mjs +8 -2
  162. package/api/upgrade/upgrade.type.d.mts +38 -0
  163. package/api/upgrade/upgrade.type.mjs +16 -0
  164. package/assets/codemods/__tests__/runner.test.mjs +330 -8
  165. package/assets/codemods/integration-discovery.mjs +8 -2
  166. package/assets/codemods/integration-discovery.test.mjs +15 -0
  167. package/assets/codemods/integration-runner.mjs +56 -4
  168. package/assets/codemods/integration-runner.protection.test.mjs +153 -0
  169. package/assets/codemods/run-codemod.mjs +177 -34
  170. package/assets/codemods/runner.mjs +350 -102
  171. package/assets/codemods/term-log.mjs +32 -8
  172. package/assets/codemods/term-log.test.mjs +19 -1
  173. package/assets/codemods/transform-prop.mjs +109 -0
  174. package/assets/codemods/transform-prop.test.mjs +95 -0
  175. package/assets/codemods/transforms/next/__tests__/migrate-native-picker-to-presentation.test.mjs +63 -0
  176. package/assets/codemods/transforms/next/__tests__/migrate-theme-catalog-to-descriptors.test.mjs +220 -0
  177. package/assets/codemods/transforms/next/index.mjs +19 -1
  178. package/assets/codemods/transforms/next/migrate-native-picker-to-presentation.mjs +148 -0
  179. package/assets/codemods/transforms/next/migrate-theme-catalog-to-descriptors.mjs +141 -0
  180. package/assets/codemods/transforms/v0.0.14/__tests__/rename-status-variants.test.mjs +86 -165
  181. package/assets/codemods/transforms/v0.0.14/rename-status-variants.mjs +72 -210
  182. package/assets/codemods/transforms/v0.1.8/__tests__/rename-avatar-size-scale.test.mjs +83 -115
  183. package/assets/codemods/transforms/v0.1.8/rename-avatar-size-scale.mjs +57 -186
  184. package/assets/codemods/transforms/v0.6.0/__tests__/next-codemods.test.mjs +47 -0
  185. package/assets/codemods/transforms/v0.6.0/rename-resizable-pixel-bounds.mjs +57 -10
  186. package/assets/docs/getting-started.doc.mjs +2 -2
  187. package/assets/docs/layout.doc.dense.mjs +2 -2
  188. package/assets/docs/layout.doc.mjs +1 -1
  189. package/assets/docs/principles.doc.mjs +6 -6
  190. package/assets/docs/styling-libraries.doc.mjs +2 -2
  191. package/assets/docs/styling.doc.mjs +4 -4
  192. package/assets/docs/theme.doc.mjs +4 -4
  193. package/assets/docs/tokens.doc.mjs +1 -1
  194. package/assets/docs/tree/api.doc.mjs +30 -0
  195. package/assets/docs/tree/cli.doc.mjs +23 -0
  196. package/assets/docs/tree/commands.doc.mjs +25 -0
  197. package/assets/docs/{cli-integrations.doc.mjs → tree/integrations.doc.mjs} +66 -38
  198. package/assets/docs/tree/integrations.test.mjs +62 -0
  199. package/assets/docs/tree/writing-docs.doc.mjs +286 -0
  200. package/assets/docs/working-with-ai.doc.mjs +3 -3
  201. package/assets/templates/blocks/components/DateInput/DateInputDateRange.tsx +1 -1
  202. package/assets/templates/blocks/components/Item/ItemDocumentTabs.doc.mjs +14 -0
  203. package/assets/templates/blocks/components/Item/ItemDocumentTabs.tsx +100 -0
  204. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.doc.mjs +14 -0
  205. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.tsx +61 -0
  206. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.doc.mjs +14 -0
  207. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.tsx +126 -0
  208. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.doc.mjs +15 -0
  209. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.tsx +86 -0
  210. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.doc.mjs +14 -0
  211. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.tsx +99 -0
  212. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.doc.mjs +14 -0
  213. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.tsx +122 -0
  214. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.doc.mjs +14 -0
  215. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.tsx +95 -0
  216. package/assets/templates/blocks/components/TimeInput/TimeInputConstrained.tsx +1 -0
  217. package/assets/templates/pages/table-tree/page.tsx +1704 -0
  218. package/assets/templates/pages/table-tree/template.doc.mjs +12 -0
  219. package/assets/templates/themes/butter/butterTheme.doc.mjs +11 -0
  220. package/assets/templates/themes/chocolate/chocolateTheme.doc.mjs +11 -0
  221. package/assets/templates/themes/gothic/gothicTheme.doc.mjs +11 -0
  222. package/assets/templates/themes/matcha/matchaTheme.doc.mjs +11 -0
  223. package/assets/templates/themes/neutral/neutralTheme.doc.mjs +11 -0
  224. package/assets/templates/themes/stone/stoneTheme.doc.mjs +11 -0
  225. package/assets/templates/themes/y2k/y2kTheme.doc.mjs +11 -0
  226. package/authoring/codemod/codemod.doc.mjs +1 -1
  227. package/authoring/codemod/type.ts +12 -0
  228. package/authoring/config/config.doc.mjs +2 -2
  229. package/authoring/config/debug-composition.test.mjs +92 -0
  230. package/authoring/config/type.ts +15 -3
  231. package/authoring/debug/debug.doc.d.mts +11 -0
  232. package/authoring/debug/debug.doc.mjs +182 -0
  233. package/authoring/debug/parse.d.mts +3 -3
  234. package/authoring/doctypes/_schema.d.mts +71 -141
  235. package/authoring/doctypes/_schema.mjs +29 -2
  236. package/authoring/doctypes/base/graph-fields.doc.mjs +8 -6
  237. package/authoring/doctypes/base/type.ts +6 -5
  238. package/authoring/doctypes/command/command.doc.mjs +1 -1
  239. package/authoring/doctypes/command/type.ts +2 -2
  240. package/authoring/doctypes/component/type.ts +2 -2
  241. package/authoring/doctypes/doctypes-new.test.mjs +48 -6
  242. package/authoring/doctypes/enum/enum.doc.mjs +1 -1
  243. package/authoring/doctypes/enum/type.ts +1 -1
  244. package/authoring/doctypes/function/function.doc.mjs +3 -2
  245. package/authoring/doctypes/function/type.ts +3 -2
  246. package/authoring/doctypes/hook/type.ts +2 -2
  247. package/authoring/doctypes/load-contract.test.mjs +3 -2
  248. package/authoring/doctypes/namespace/namespace.doc.mjs +6 -10
  249. package/authoring/doctypes/namespace/parse.test.mjs +23 -25
  250. package/authoring/doctypes/namespace/type.ts +5 -2
  251. package/authoring/doctypes/parse.d.mts +4 -2
  252. package/authoring/doctypes/parse.mjs +10 -5
  253. package/authoring/doctypes/reference/reference.doc.mjs +7 -5
  254. package/authoring/doctypes/reference/type.ts +12 -10
  255. package/authoring/doctypes/schema/schema.doc.mjs +1 -1
  256. package/authoring/doctypes/schema/type.ts +1 -2
  257. package/authoring/doctypes/template/parse.d.mts +2 -0
  258. package/authoring/doctypes/template/parse.mjs +4 -0
  259. package/authoring/doctypes/template/parse.test.mjs +18 -0
  260. package/authoring/doctypes/template/template.doc.mjs +9 -3
  261. package/authoring/doctypes/template/type.ts +8 -0
  262. package/authoring/doctypes/theme/parse.d.mts +35 -0
  263. package/authoring/doctypes/theme/parse.mjs +76 -0
  264. package/authoring/doctypes/theme/theme.doc.d.mts +9 -0
  265. package/authoring/doctypes/theme/theme.doc.mjs +79 -0
  266. package/authoring/doctypes/theme/type.ts +42 -0
  267. package/authoring/doctypes/types.ts +2 -1
  268. package/authoring/gap-report/gap-report.doc.d.mts +12 -0
  269. package/authoring/gap-report/gap-report.doc.mjs +183 -0
  270. package/authoring/identity/identity.doc.mjs +2 -2
  271. package/authoring/index.d.mts +1 -0
  272. package/authoring/index.d.ts +7 -4
  273. package/authoring/index.mjs +2 -1
  274. package/authoring/integration/integration.doc.mjs +2 -2
  275. package/authoring/integration/type.ts +4 -10
  276. package/clients/cli/__tests__/cliManifest.test.ts +27 -29
  277. package/clients/cli/command-load-failure.test.mjs +83 -0
  278. package/clients/cli/commands/blog.doc.mjs +1 -1
  279. package/clients/cli/commands/blog.mjs +23 -8
  280. package/clients/cli/commands/blog.test.mjs +42 -1
  281. package/clients/cli/commands/build-theme.adaptations.test.mjs +100 -1
  282. package/clients/cli/commands/build-theme.ascii-output.test.mjs +161 -0
  283. package/clients/cli/commands/build-theme.flag-docs.test.mjs +110 -0
  284. package/clients/cli/commands/build-theme.mjs +16 -50
  285. package/clients/cli/commands/build-theme.path-safety.test.mjs +86 -1
  286. package/clients/cli/commands/build-theme.variants.test.mjs +76 -0
  287. package/clients/cli/commands/build.doc.mjs +16 -8
  288. package/clients/cli/commands/build.exit-codes-doc.test.mjs +50 -0
  289. package/clients/cli/commands/build.mjs +137 -114
  290. package/clients/cli/commands/build.playbook.test.mjs +75 -0
  291. package/clients/cli/commands/build.text-fields.test.mjs +81 -0
  292. package/clients/cli/commands/component/index.mjs +3 -8
  293. package/clients/cli/commands/component-ownership.test.mjs +3 -3
  294. package/clients/cli/commands/component-package.test.mjs +46 -0
  295. package/clients/cli/commands/component-resolution.test.mjs +21 -0
  296. package/clients/cli/commands/component.doc.mjs +1 -1
  297. package/clients/cli/commands/component.test.mjs +19 -0
  298. package/clients/cli/commands/detail-levels.test.mjs +2 -2
  299. package/clients/cli/commands/discover.broken-integration.test.mjs +52 -5
  300. package/clients/cli/commands/discover.components-flag.test.mjs +97 -0
  301. package/clients/cli/commands/discover.doc.mjs +5 -3
  302. package/clients/cli/commands/discover.mjs +4 -4
  303. package/clients/cli/commands/discover.text-projection.test.mjs +103 -0
  304. package/clients/cli/commands/docs.doc.mjs +21 -9
  305. package/clients/cli/commands/docs.mjs +182 -68
  306. package/clients/cli/commands/docs.test.mjs +120 -16
  307. package/clients/cli/commands/doctor-integration-components.doc.mjs +1 -1
  308. package/clients/cli/commands/doctor-integration-docs.doc.mjs +3 -3
  309. package/clients/cli/commands/doctor-integration-templates.doc.mjs +15 -8
  310. package/clients/cli/commands/doctor-integration-validate.doc.mjs +1 -1
  311. package/clients/cli/commands/doctor-integration.doc.mjs +1 -1
  312. package/clients/cli/commands/doctor-integration.package-json.test.mjs +53 -0
  313. package/clients/cli/commands/doctor-integration.test.mjs +90 -8
  314. package/clients/cli/commands/doctor.doc.mjs +1 -1
  315. package/clients/cli/commands/doctor.mjs +59 -32
  316. package/clients/cli/commands/doctor.test.mjs +42 -0
  317. package/clients/cli/commands/gap-report.doc.mjs +17 -6
  318. package/clients/cli/commands/gap-report.test.mjs +72 -0
  319. package/clients/cli/commands/hook/index.mjs +7 -17
  320. package/clients/cli/commands/hook.doc.mjs +1 -1
  321. package/clients/cli/commands/hook.text-projection.test.mjs +45 -0
  322. package/clients/cli/commands/init.doc.mjs +20 -9
  323. package/clients/cli/commands/init.flag-help.test.mjs +153 -0
  324. package/clients/cli/commands/integration-add.controls.test.mjs +132 -0
  325. package/clients/cli/commands/integration-add.doc.mjs +32 -6
  326. package/clients/cli/commands/integration-pack.doc.mjs +1 -1
  327. package/clients/cli/commands/integration-real-world.test.mjs +3 -9
  328. package/clients/cli/commands/integration.doc.mjs +1 -1
  329. package/clients/cli/commands/integration.mjs +1 -0
  330. package/clients/cli/commands/interactive-guard.test.mjs +101 -24
  331. package/clients/cli/commands/json-contract.test.mjs +33 -0
  332. package/clients/cli/commands/layout-check.doc.mjs +15 -4
  333. package/clients/cli/commands/layout-expand.doc.mjs +22 -5
  334. package/clients/cli/commands/layout-grammar.doc.mjs +1 -1
  335. package/clients/cli/commands/layout.doc.mjs +3 -3
  336. package/clients/cli/commands/layout.mjs +21 -9
  337. package/clients/cli/commands/layout.path-help.test.mjs +33 -0
  338. package/clients/cli/commands/layout.stdin-cap.test.mjs +47 -0
  339. package/clients/cli/commands/layout.text-fields.test.mjs +39 -0
  340. package/clients/cli/commands/manifest.doc.mjs +1 -1
  341. package/clients/cli/commands/no-prompt-wording.test.mjs +94 -0
  342. package/clients/cli/commands/search.doc.mjs +7 -4
  343. package/clients/cli/commands/search.mjs +28 -9
  344. package/clients/cli/commands/search.test.mjs +75 -0
  345. package/clients/cli/commands/setup-nudge.test.mjs +6 -0
  346. package/clients/cli/commands/swizzle.doc.mjs +3 -2
  347. package/clients/cli/commands/swizzle.path-safety.test.mjs +42 -0
  348. package/clients/cli/commands/template.doc.mjs +52 -13
  349. package/clients/cli/commands/template.flag-help.test.mjs +117 -0
  350. package/clients/cli/commands/template.mjs +4 -91
  351. package/clients/cli/commands/template.path-help.test.mjs +40 -0
  352. package/clients/cli/commands/text-json-parity.test.mjs +719 -0
  353. package/clients/cli/commands/theme-add.doc.mjs +4 -3
  354. package/clients/cli/commands/theme-build.doc.mjs +8 -7
  355. package/clients/cli/commands/theme-list.doc.mjs +2 -2
  356. package/clients/cli/commands/theme-palette-generate.doc.mjs +3 -3
  357. package/clients/cli/commands/theme-palette-generate.test.mjs +19 -0
  358. package/clients/cli/commands/theme-palette.doc.mjs +1 -1
  359. package/clients/cli/commands/theme-targets.behavior.test.mjs +4 -3
  360. package/clients/cli/commands/theme-targets.doc.mjs +1 -1
  361. package/clients/cli/commands/theme-template.behavior.test.mjs +12 -0
  362. package/clients/cli/commands/theme-template.doc.mjs +2 -2
  363. package/clients/cli/commands/theme.doc.mjs +1 -1
  364. package/clients/cli/commands/upgrade.ascii-output.test.mjs +87 -0
  365. package/clients/cli/commands/upgrade.doc.mjs +20 -8
  366. package/clients/cli/commands/upgrade.file-protection.test.mjs +228 -0
  367. package/clients/cli/commands/upgrade.flag-help.test.mjs +188 -0
  368. package/clients/cli/commands/upgrade.hook-output.test.mjs +88 -0
  369. package/clients/cli/commands/upgrade.mjs +29 -7
  370. package/clients/cli/formatters/index.mjs +2 -0
  371. package/clients/cli/formatters/index.test.mjs +6 -0
  372. package/clients/cli/index.mjs +21 -30
  373. package/clients/cli/latest-version-env.test.mjs +50 -0
  374. package/clients/cli/lib/cli-error.test.mjs +7 -0
  375. package/clients/cli/lib/component-format.mjs +9 -9
  376. package/clients/cli/lib/component-format.test.mjs +1 -1
  377. package/clients/cli/lib/define-command.mjs +32 -6
  378. package/clients/cli/lib/doc-text-ascii.test.mjs +82 -0
  379. package/clients/cli/lib/exit-codes.test.mjs +97 -0
  380. package/clients/cli/lib/hook-format.mjs +19 -10
  381. package/clients/cli/lib/json-shim.mjs +38 -2
  382. package/clients/cli/lib/json-shim.test.mjs +83 -0
  383. package/clients/cli/lib/manifest.d.ts +2 -0
  384. package/clients/cli/lib/manifest.mjs +31 -2
  385. package/clients/cli/lib/manifest.test.mjs +17 -0
  386. package/foundation/agent-docs/agent-docs.d.mts +7 -2
  387. package/foundation/agent-docs/agent-docs.mjs +82 -12
  388. package/foundation/agent-docs/agent-docs.path-safety.test.mjs +266 -4
  389. package/foundation/agent-docs/agent-docs.test.mjs +19 -1
  390. package/foundation/config/integration-debug.test.mjs +28 -3
  391. package/foundation/config/project-themes.test.mjs +11 -19
  392. package/foundation/config/project.d.mts +20 -11
  393. package/foundation/config/project.mjs +246 -89
  394. package/foundation/config/project.test.mjs +270 -21
  395. package/foundation/discovery/authoring-self-docs.d.mts +6 -0
  396. package/foundation/discovery/authoring-self-docs.mjs +17 -7
  397. package/foundation/discovery/authoring-self-docs.test.mjs +20 -9
  398. package/foundation/discovery/authoring-surface.d.mts +74 -0
  399. package/foundation/discovery/authoring-surface.mjs +525 -0
  400. package/foundation/discovery/authoring-surface.test.mjs +392 -0
  401. package/foundation/discovery/cli-self-docs.d.mts +119 -0
  402. package/foundation/discovery/cli-self-docs.mjs +490 -0
  403. package/foundation/discovery/cli-self-docs.test.mjs +375 -0
  404. package/foundation/discovery/component-discovery.d.mts +38 -0
  405. package/foundation/discovery/component-discovery.mjs +48 -0
  406. package/foundation/discovery/component-loader.d.mts +35 -38
  407. package/foundation/discovery/component-loader.mjs +53 -222
  408. package/foundation/discovery/docs-discovery.d.mts +108 -10
  409. package/foundation/discovery/docs-discovery.mjs +191 -30
  410. package/foundation/discovery/docs-discovery.test.mjs +71 -32
  411. package/foundation/discovery/docs-output-budget.d.mts +2 -2
  412. package/foundation/discovery/docs-output-budget.mjs +1 -1
  413. package/foundation/discovery/docs-section-key.d.mts +28 -10
  414. package/foundation/discovery/docs-section-key.mjs +134 -33
  415. package/foundation/discovery/docs-section-key.test.mjs +41 -19
  416. package/foundation/discovery/template-adapter.d.mts +113 -11
  417. package/foundation/discovery/template-adapter.fixture-refs.test.mjs +248 -0
  418. package/foundation/discovery/template-adapter.integration-isolation.test.mjs +94 -0
  419. package/foundation/discovery/template-adapter.mjs +772 -82
  420. package/foundation/discovery/template-adapter.test.mjs +57 -0
  421. package/foundation/discovery/template-conflict-release.d.mts +13 -0
  422. package/foundation/discovery/template-conflict-release.mjs +40 -0
  423. package/foundation/discovery/template-conflict-release.test.mjs +40 -0
  424. package/foundation/discovery/theme-discovery.d.mts +67 -7
  425. package/foundation/discovery/theme-discovery.mjs +916 -186
  426. package/foundation/discovery/theme-discovery.test.mjs +613 -219
  427. package/foundation/discovery/theming-targets.test.mjs +4 -0
  428. package/foundation/doc-compiler/bundle.d.mts +47 -0
  429. package/foundation/doc-compiler/bundle.mjs +278 -0
  430. package/foundation/doc-compiler/bundle.test.mjs +266 -0
  431. package/foundation/doc-compiler/compile.d.mts +220 -39
  432. package/foundation/doc-compiler/compile.mjs +311 -15
  433. package/foundation/doc-compiler/diagnostics.d.mts +126 -0
  434. package/foundation/doc-compiler/diagnostics.mjs +305 -0
  435. package/foundation/doc-compiler/doc-compiler.test.mjs +28 -1
  436. package/foundation/doc-compiler/doc-loads.test.mjs +1642 -0
  437. package/foundation/doc-compiler/import.d.mts +24 -0
  438. package/foundation/doc-compiler/import.mjs +59 -0
  439. package/foundation/doc-compiler/inputs.d.mts +102 -0
  440. package/foundation/doc-compiler/inputs.mjs +291 -0
  441. package/foundation/doc-compiler/inputs.test.mjs +299 -0
  442. package/foundation/doc-compiler/ir.d.mts +13 -0
  443. package/foundation/doc-compiler/ir.mjs +196 -12
  444. package/foundation/doc-compiler/lenses.d.mts +3 -2
  445. package/foundation/doc-compiler/lenses.mjs +2 -1
  446. package/foundation/doc-compiler/links.d.mts +135 -0
  447. package/foundation/doc-compiler/links.mjs +253 -0
  448. package/foundation/doc-compiler/links.test.mjs +139 -0
  449. package/foundation/doc-compiler/lower-doc.test.mjs +495 -0
  450. package/foundation/doc-compiler/overlays.d.mts +37 -0
  451. package/foundation/doc-compiler/overlays.mjs +206 -0
  452. package/foundation/doc-compiler/parse-readable.d.mts +9 -0
  453. package/foundation/doc-compiler/parse-readable.mjs +29 -0
  454. package/foundation/doc-compiler/read.d.mts +127 -0
  455. package/foundation/doc-compiler/read.mjs +325 -0
  456. package/foundation/doc-compiler/read.test.mjs +313 -0
  457. package/foundation/doc-compiler/source.d.mts +33 -0
  458. package/foundation/doc-compiler/source.mjs +128 -0
  459. package/foundation/doc-compiler/tree.d.mts +288 -0
  460. package/foundation/doc-compiler/tree.mjs +876 -0
  461. package/foundation/doc-compiler/tree.test.mjs +598 -0
  462. package/foundation/fs/file-protection.d.mts +33 -0
  463. package/foundation/fs/file-protection.mjs +825 -0
  464. package/foundation/fs/file-protection.test.mjs +250 -0
  465. package/foundation/fs/module-loader.d.mts +1 -0
  466. package/foundation/fs/module-loader.mjs +50 -1
  467. package/foundation/fs/module-loader.stdout.test.mjs +332 -0
  468. package/foundation/fs/path-safety.d.mts +3 -2
  469. package/foundation/fs/path-safety.mjs +49 -19
  470. package/foundation/fs/path-safety.test.mjs +50 -0
  471. package/foundation/fs/publish-file-hardlink-unavailable.test.mjs +129 -94
  472. package/foundation/integrations/autolink.d.mts +58 -1
  473. package/foundation/integrations/autolink.mjs +143 -52
  474. package/foundation/integrations/autolink.test.mjs +1 -1
  475. package/foundation/integrations/cli-requirement.d.mts +45 -0
  476. package/foundation/integrations/cli-requirement.mjs +154 -0
  477. package/foundation/integrations/cli-requirement.test.mjs +109 -0
  478. package/foundation/integrations/contribution-fixes.d.mts +145 -0
  479. package/foundation/integrations/contribution-fixes.mjs +1284 -0
  480. package/foundation/integrations/contribution-inventory.d.mts +3 -2
  481. package/foundation/integrations/contribution-inventory.mjs +27 -24
  482. package/foundation/integrations/contribution-inventory.test.mjs +86 -27
  483. package/foundation/integrations/integration-warnings.d.mts +9 -2
  484. package/foundation/integrations/integration-warnings.mjs +51 -26
  485. package/foundation/integrations/integration-warnings.test.mjs +74 -1
  486. package/foundation/integrations/integrations.d.mts +3 -0
  487. package/foundation/integrations/integrations.mjs +11 -97
  488. package/foundation/integrations/provider-ledger.test.mjs +275 -0
  489. package/foundation/integrations/provider-resolution.d.mts +152 -0
  490. package/foundation/integrations/provider-resolution.mjs +576 -0
  491. package/foundation/integrations/provider-resolution.test.mjs +369 -0
  492. package/foundation/integrations/theme-descriptor.d.mts +8 -0
  493. package/foundation/integrations/theme-descriptor.mjs +44 -0
  494. package/foundation/integrations/validate-contributions.mjs +121 -29
  495. package/foundation/response/base.d.ts +8 -4
  496. package/foundation/response/error-codes.d.mts +3 -1
  497. package/foundation/response/error-codes.d.ts +2 -0
  498. package/foundation/response/error-codes.doc.mjs +13 -4
  499. package/foundation/response/error-codes.mjs +8 -2
  500. package/foundation/response/error-codes.test.mjs +137 -10
  501. package/foundation/response/json-contract.test.mjs +11 -0
  502. package/foundation/response/json.d.mts +4 -2
  503. package/foundation/response/json.mjs +8 -10
  504. package/foundation/response/response-types.doc.d.mts +5 -1
  505. package/foundation/response/response-types.doc.mjs +27 -18
  506. package/foundation/response/response-types.doc.test.mjs +158 -0
  507. package/foundation/response/response.doc.mjs +1 -1
  508. package/foundation/text/string-utils.d.mts +8 -0
  509. package/foundation/text/string-utils.mjs +40 -10
  510. package/foundation/xle/expand.d.mts +2 -0
  511. package/foundation/xle/expand.mjs +4 -3
  512. package/foundation/xle/expand.test.mjs +54 -0
  513. package/foundation/xle/xle.test.mjs +13 -0
  514. package/package.json +10 -9
  515. package/assets/templates/themes/manifest.json +0 -95
  516. package/clients/cli/lib/update-check.mjs +0 -83
  517. package/clients/cli/lib/update-check.test.mjs +0 -137
  518. package/clients/cli/update-hint-commands.test.mjs +0 -54
package/README.md CHANGED
@@ -15,6 +15,25 @@ npx @astryxdesign/cli template --list
15
15
 
16
16
  Once it's a project dependency (`npm install -D @astryxdesign/cli`), drop the scope and use the shorter `astryx` — e.g. `npx astryx component Button` or `pnpm exec astryx component Button`. Bare `astryx` resolves to an unrelated npm package until the CLI is installed, so prefer the scoped form above for first-run/one-off use.
17
17
 
18
+ ## Reading the CLI's own docs
19
+
20
+ The CLI documents itself, so these commands print what the installed version does:
21
+
22
+ - `astryx <command> --help`: one command's arguments and options.
23
+ - `astryx manifest --json`: every command, option, and response type, as JSON.
24
+ - `astryx docs cli`: the CLI's docs tree, one level at a time.
25
+ `astryx docs cli/commands` lists every command, `astryx docs cli/api` lists
26
+ the API's functions, schemas, and enums, and a route such as
27
+ `astryx docs cli/api/functions/search` prints one.
28
+ - `astryx docs authoring --index`: the authoring reference, with one section for
29
+ each file an author writes: the `astryx.config.*` file, the
30
+ `astryx.integration.*` manifest, codemods, and every doc type (`ComponentDoc`,
31
+ `TemplateDoc`, `ThemeDoc`, and the rest). Read one section with
32
+ `astryx docs authoring <section>`, for example `astryx docs authoring config`.
33
+ - `astryx docs cli/integrations`: the guide to building an integration package.
34
+ - `astryx docs`: every docs topic, including the design-system guides (for
35
+ example `tokens`, `theme`, and `layout`).
36
+
18
37
  ## Finding things: `astryx search`
19
38
 
20
39
  When you don't know whether what you need is a component, a hook, a docs topic,
@@ -51,8 +70,8 @@ Options:
51
70
 
52
71
  - `--type <component|hook|doc|template>`: restrict to a single domain
53
72
  - `--limit <n>`: cap the number of results (default 20)
54
- - `--detail`: include the import path and the match reason/score
55
- - `--json`: typed `{ type: 'search', data: { query, matchCount, results } }` envelope — `matchCount` is how many candidates matched in total, `results` the slice `--limit` allowed
73
+ - `--verbose`: also print each result's match score and reason
74
+ - `--json`: typed `{ apiVersion, type: 'search', data: { query, matchCount, results } }` envelope — `matchCount` is how many candidates matched in total, `results` the slice `--limit` allowed
56
75
 
57
76
  ## Commands
58
77
 
@@ -61,7 +80,7 @@ Options:
61
80
  | Command | Description |
62
81
  | ------------- | ----------------------------------------------------------------------------- |
63
82
  | `blog` | Read the Astryx blog from the published feed |
64
- | `build` | Build a page: composition kit for an idea, or the workflow playbook (no args) |
83
+ | `build` | Build a page: the template to start from, or the workflow playbook (no query) |
65
84
  | `component` | List components or print component docs |
66
85
  | `discover` | Discover external packages and components |
67
86
  | `docs` | Print reference docs |
@@ -84,7 +103,7 @@ Options:
84
103
 
85
104
  These flags work with any command:
86
105
 
87
- - `--json`: Output as typed JSON envelope: `{ type, data }` (errors: `{ error, code, suggestions? }`)
106
+ - `--json`: Output as typed JSON envelope: `{ apiVersion, type, data, meta? }` (errors: `{ apiVersion, error, code, suggestions? }`)
88
107
  - `--detail <level>`: Detail level for list views, increasing in size: `brief` (names only, default for `--list`) < `compact` (names + 1-line descriptions) < `full` (full docs per entry). Single-item views default to `full`.
89
108
  - `--zh`: Output docs in Chinese Simplified
90
109
  - `--dense`: Compressed format (token-efficient, useful for AI agents)
@@ -95,13 +114,14 @@ These flags work with any command:
95
114
  Every command supports `--json` for machine-readable output. Responses are typed envelopes:
96
115
 
97
116
  ```json
98
- {"type": "component.detail", "data": {"name": "Button", ...}}
117
+ {"apiVersion": 1, "type": "component.detail", "data": {"name": "Button", ...}}
99
118
  ```
100
119
 
101
120
  Errors:
102
121
 
103
122
  ```json
104
123
  {
124
+ "apiVersion": 1,
105
125
  "error": "No component named \"Buttn\"",
106
126
  "code": "ERR_UNKNOWN_COMPONENT",
107
127
  "suggestions": [{"name": "Button", "reason": "similar name"}]
@@ -169,16 +189,18 @@ if (isError(result)) {
169
189
  | `ERR_UNKNOWN_FEATURE` | An unrecognized `--features` value was passed to init. |
170
190
  | `ERR_UNKNOWN_CODEMOD` | A `--codemod` value did not match any registered codemod (upgrade). |
171
191
  | `ERR_CODEMOD_FAILED` | One or more codemods failed during an upgrade run. |
192
+ | `ERR_CODEMOD_PROTECTED` | A required codemod change remains blocked by a protected consumer file. |
193
+ | `ERR_CODEMOD_PROTECTION_SOURCE` | A working-tree protection declaration could not be read or parsed. |
172
194
  | `ERR_NOT_FOUND` | A generic discover/lookup query matched nothing in any package. |
173
195
  | `ERR_NO_DOC` | A component exists but has no typed `.doc.mjs` file. |
174
196
  | `ERR_NO_SHOWCASE` | No showcase exists for the requested component. |
175
197
  | `ERR_NO_SOURCE` | No source file could be located for the requested component/template. |
176
198
  | `ERR_INVALID_DOC` | A component's docs failed validation (malformed `.doc.mjs`). |
177
199
  | `ERR_FILE_NOT_FOUND` | A required input file did not exist. |
178
- | `ERR_FILE_EXISTS` | Refused to overwrite an existing file in non-interactive mode. |
200
+ | `ERR_FILE_EXISTS` | Refused to overwrite an existing file. |
179
201
  | `ERR_PATH_TRAVERSAL` | A path escaped its allowed root, or a name contained traversal markers. |
180
202
  | `ERR_WRITE_FAILED` | Writing output files failed (and was rolled back). |
181
- | `ERR_THEME_INVALID` | A theme definition or contributed theme catalog is invalid. |
203
+ | `ERR_THEME_INVALID` | A theme definition or contributed theme descriptor is invalid. |
182
204
  | `ERR_THEME_LOAD` | A theme file could not be loaded / parsed into a defineTheme result. |
183
205
  | `ERR_PALETTE_GENERATION` | A palette generation request or one of its constraints was invalid. |
184
206
  | `ERR_VERSION_DETECT` | The current `@astryxdesign/core` version could not be detected. |
@@ -199,8 +221,9 @@ if (isError(result)) {
199
221
 
200
222
  Agents don't have to scrape `--help` to learn the CLI. A single call returns a
201
223
  **self-describing manifest**: every command, its arguments, flags (with types,
202
- choices, and defaults), whether it supports `--json`, and the response `type`
203
- discriminators each command can emit. Think of it as an OpenAPI spec for the CLI.
224
+ choices, and defaults), whether it supports `--json`, the response `type`
225
+ discriminators each command can emit, and its documented exit codes. Think of it
226
+ as an OpenAPI spec for the CLI.
204
227
 
205
228
  ```bash
206
229
  astryx manifest --json # dedicated surface — type: "manifest"
@@ -262,6 +285,10 @@ Shape:
262
285
  "…",
263
286
  ],
264
287
  "examples": ["astryx component Button --props --json"],
288
+ "exitCodes": [
289
+ {"code": 0, "when": "success"},
290
+ {"code": 1, "when": "…"},
291
+ ],
265
292
  },
266
293
  // …one entry per command; subcommands (e.g. `theme build`) nest under `subcommands`
267
294
  ],
@@ -343,9 +370,9 @@ import type {
343
370
  // ...import the response types for the commands you consume
344
371
  } from '@astryxdesign/cli/json';
345
372
 
346
- // parseResponse returns the structural { type, data, meta? } envelope; `data`
347
- // is `unknown` until you narrow it. Reconstruct the union you care about from
348
- // the per-command response types, then narrow on `type`:
373
+ // parseResponse returns the structural { apiVersion, type, data, meta? }
374
+ // envelope; `data` is `unknown` until you narrow it. Reconstruct the union you
375
+ // care about from the per-command response types, then narrow on `type`:
349
376
  type MyResponse =
350
377
  ComponentDetailResponse | ComponentListResponse | DocsListResponse;
351
378
 
@@ -391,63 +418,64 @@ Every response has a `type` discriminant. The full set is below (generated from
391
418
 
392
419
  <!-- BEGIN GENERATED: response-types -->
393
420
 
394
- | Type | What `data` carries |
395
- | --------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
396
- | `init.run` | The install receipt: the `mode` (`default` \| `features`), the features run, agent-doc files written, any soft `docsError`, whether theme guidance was emitted, the template outcome (`workflow` \| `created` \| `skipped`) plus its path, and whether the next-steps were emitted. |
397
- | `init.remove` | Confirmation that the managed agent-docs block was removed (`data.removed: true`) — returned when --remove-agents is set. |
398
- | `component.list` | The component catalog grouped by category: `detail` (the level: names \| compact \| full) and `components`, the grouped map of names entries ({name, package, and optional canonical import for integrations}), brief entries, or a full ComponentDoc per entry. |
399
- | `component.detail` | One component's authored ComponentDoc plus ownership metadata (owner package, import specifier, and whether source is available). |
400
- | `component.detail.props` | Just one component's props table (ComponentPropDoc[]). |
401
- | `component.detail.source` | One component's source file, as {component, source}. |
402
- | `component.detail.showcase` | One component's showcase example, as {component, aspectRatio, source}. |
403
- | `component.detail.blocks` | One component's example blocks, as {component, showcase, examples, related} of BlockEntry. |
404
- | `docs.list` | All reference-doc topics as DocsListEntry[] ({topic, description}), in discovery order. |
405
- | `docs.detail` | One topic's full ReferenceDoc, with token-ref blocks inlined. |
406
- | `docs.index` | One topic's section index (--index): each section's key, title, and one-line summary. |
407
- | `docs.detail.section` | One ReferenceSection of a topic, found by key or title, with token-ref blocks inlined. |
408
- | `blog.list` | The feed URL plus every post parsed from the RSS feed, each with slug, title, description, date, type, authors, link, and plaintext URL. |
409
- | `blog.detail` | One post's metadata plus the feed URL and the post's full plaintext body. |
410
- | `discover.list` | The configured external packages (name, category, components, version, description); when empty it carries meta.configured to tell "nothing configured" from "nothing discovered". |
411
- | `discover.detail` | A single external package entry, for an @scope/name query. |
412
- | `discover.detail.doc` | The validated ComponentDoc for one external component: an @scope/name/Component query, or a free-text term resolving to exactly one component. |
413
- | `discover.search` | The echoed query plus the matching {package, component} pairs, when a free-text term matches several components. |
414
- | `search` | The echoed query, `matchCount` (how many candidates matched in total, before `limit`), plus a ranked SearchResultEntry[] bounded by `limit` (domain, name, score, reason, description, follow-up command, and import path where relevant). |
415
- | `build.help` | A marker (`playbook: true`) that the renderer expands into the how-to-build-a-page workflow; emitted when no query is given. |
416
- | `build.kit` | The grouped composition kit: echoed query, hasResults/matchCount/directMatch fields (matchCount is the total matched, never a cap read back), the closest page templates, drop-in block patterns, idea-specific components/hooks, and the always-on frame + foundation component-name arrays. |
417
- | `swizzle.list` | The names of swizzlable components discoverable from cwd's @astryxdesign/core. |
418
- | `swizzle.copy` | An eject receipt: component name, owning package, output directory, files-copied count, the written file names, whether any file uses StyleX, and an optional maintainer note. |
419
- | `gap-report.categories` | The fixed gap category values and human-readable labels. |
420
- | `gap-report.file` | An aggregate receipt with overall status, the selected package and issues URL, ordered per-handler deliveries, and filedCount/routedOnlyCount totals. |
421
- | `template.list` | Every discovered template (page + block); each entry carries id, name, description, kind, owning package, optional category and componentsUsed, and readiness flags. |
422
- | `template.show` | The resolved template's raw source plus its description, kind, and the component names it composes. |
423
- | `template.skeleton` | A layout skeleton (structural tags with spatial annotations) plus the template's description and the components it composes. |
424
- | `template.copy` | A scaffold receipt: template id, output directory, written file name, and file count. |
425
- | `template.cdn` | A write receipt for the no-build-step CDN starter page: the path (relative to cwd), the Astryx version every CDN URL was pinned to, whether it was written, and the reason it was not. `exists` when a file was already there, which is a success. |
426
- | `hook.list` | The hook catalog grouped by category: `detail` (the level: names \| compact \| full) and `components`, the grouped map of hook names, brief entries, or a full HookDoc per entry. |
427
- | `hook.detail` | One hook's full authored HookDoc. |
428
- | `hook.detail.params` | Just one hook's parameters table (HookParamDoc[]). |
429
- | `theme.build` | A theme build receipt: name, token- and component-override counts, output size, the written outputs {css, js, dts, and variantsDts when applicable}, and any validation warnings. |
430
- | `theme.build.check` | The --check receipt: theme name, an upToDate flag, the stale outputs (each {path, reason: missing \| outdated}), and the full list of checked paths. Writes nothing. |
431
- | `theme.build.batch` | Several themes built in one invocation: `count` plus one {file, receipt} per theme in argument order, where receipt is that theme's theme.build (or theme.build.check) envelope, or null when it produced no CSS. |
432
- | `theme.list` | Every bundled or installed integration theme as a ThemeListEntry[]: each with slug, displayName, description, maintained flag, and owner package. |
433
- | `theme.add` | A scaffold receipt: resolved slug, displayName, maintained flag, owner package, outputDir (relative to cwd), the theme entry file, its exportName, and the files written. |
434
- | `theme.template` | A write receipt for the annotated theme template: the path (relative to cwd), whether it was written, and the reason it was not. `exists` when a file was already there, which is a success. |
435
- | `theme.targets` | The whole themeable surface: the echoed filter, the component count, and one entry per theming target — {key, className, component, props, states}, where props and states are its legal override keys. |
436
- | `theme.palette.generate` | An author-reviewable OKLCH palette candidate, its reproducibility receipt, summary counts, and optional candidate/receipt file-write result. |
437
- | `upgrade.list` | Every available codemod, oldest→newest, as {name, title, version, optional}; returned for --list without running anything. |
438
- | `upgrade.status` | A short-circuit outcome with no codemods run (up_to_date, no_codemods, or config_fixable), each carrying the agent-docs summary. |
439
- | `upgrade.run` | The run receipt: from/to versions, codemod count, integrations processed, the agent-docs summary, and (apply mode) filesChanged, transformsApplied, and per-codemod errors. |
440
- | `manifest` | The self-describing CLI capability manifest: name, version, apiVersion, global options, the command tree (args, options, json flag, response types, examples), the jsonSupported allowlist, and the flat responseTypes index. |
441
- | `doctor` | The health-check report: `checks` (each with id, label, status: pass \| warn \| fail \| info, a message, and a fix when not passing) plus a `summary` of counts per status. |
442
- | `integration.add` | A contribution-writer receipt: kind, name, optional root {path, created}, integration-manifest path, every affected project-relative path, written, and dryRun. |
443
- | `integration.pack-check` | The packed-package check: package identity, tarball facts, local and packed contribution inventories, and issues. |
444
- | `integration.validate` | The validation result: the package name and version (both null when no local manifest is found) plus issues, an AstryxIntegrationIssue[] of {code, severity: warning \| error, message}. |
445
- | `integration.template-conflicts` | The integration identity, structural issues, and non-blocking conflicts where an integration template id is also owned by Core; each conflict includes the exact package-qualified command. |
446
- | `integration.component-conflicts` | The integration identity, structural issues, and non-blocking conflicts where an integration component name is also owned by Core; each conflict includes the exact package-qualified command. |
447
- | `integration.doc-conflicts` | The integration identity, structural issues, and Core doc overlaps classified as intentional replacements, intentional extensions, or accidental same-name conflicts. |
448
- | `layout.expand` | The expansion: parsed form, generated TSX code, componentsUsed, states (count of useState hooks scaffolded), todos, blocksReferenced (each {name, mode}), warnings, and written (the output path, or null when nothing was written). |
449
- | `layout.check` | The validation result: a valid flag, the detected form, errors (each with line/col, message, formatted text, and suggestions), warnings, and the expression re-printed in both canonical surfaces (compact and outline). |
450
- | `layout.grammar` | The XLE/XLO grammar cheatsheet: a text field with the full reference plus an aliases map (short name → canonical component) generated from this install's registry. |
421
+ | Type | What `data` carries |
422
+ | --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
423
+ | `init.run` | The install receipt: the `mode` (`default` \| `features`), the features run, agent-doc files written, any soft `docsError`, whether theme guidance was emitted, the template outcome (`workflow` \| `created` \| `skipped`) plus its path, and whether the next-steps were emitted. |
424
+ | `init.remove` | Confirmation that the managed agent-docs block was removed (`data.removed: true`) — returned when --remove-agents is set. |
425
+ | `component.list` | The component catalog grouped by category: `detail` (the level: names \| compact \| full) and `components`, the grouped map of names entries ({name, package, and optional canonical import for integrations}), brief entries, or a full ComponentDoc per entry. |
426
+ | `component.detail` | One component's authored ComponentDoc plus ownership fields (package, the owner; import, the specifier; sourceAvailable, whether source exists) and parentDoc (present when the component is documented inside another component's doc, naming that doc). |
427
+ | `component.detail.props` | Just one component's props table (ComponentPropDoc[]). |
428
+ | `component.detail.source` | One component's source file, as {component, source}. |
429
+ | `component.detail.showcase` | One component's showcase example, as {component, aspectRatio, source}. |
430
+ | `component.detail.blocks` | One component's example blocks, as {component, showcase, examples, related} of BlockEntry. |
431
+ | `docs.list` | All reference-doc topics as DocsListEntry[] ({topic, description, package, replaces?}), in read order; meta.namespaces lists the docs tree's top-level namespaces, and meta.notLoaded each package whose docs did not load. |
432
+ | `docs.detail` | One topic's full ReferenceDoc (the JSON read of a topic, --full, --dense, or a topic with one section), with token-ref blocks inlined, plus links ({up, previous, next}: the commands that open the level it sits in and its neighbors there). |
433
+ | `docs.index` | One topic's section index, the text read of a topic with more than one section (and --index): the topic's name, title, and description, plus sections, each {id, title, summary} (pass the id as the section argument; summary is the section's one-line summary), and links ({up, previous, next}: the commands that open the level it sits in and its neighbors there). |
434
+ | `docs.detail.section` | One ReferenceSection of a topic, found by key or title, with token-ref blocks inlined, plus links ({up, previous, next}: the commands that open its topic index and the sections before and after it). |
435
+ | `docs.node` | One node of the docs tree, read by its route: its id, kind, package, title, summary, and breadcrumb, plus a namespace's slots with their children (one level down) or a typed doc's content, and links ({up, previous, next, related}: the commands that open its parent, its neighbors, and the docs it names). |
436
+ | `blog.list` | The feed URL plus every post parsed from the RSS feed, each with slug, title, description, date, type, authors, link, and plaintext URL. |
437
+ | `blog.detail` | One post's metadata plus the feed URL and the post's full plaintext body. |
438
+ | `discover.list` | The configured external packages (name, category, components, version, description); when empty it carries meta.configured to tell "nothing configured" from "nothing discovered". |
439
+ | `discover.detail` | A single external package entry, for an @scope/name query. |
440
+ | `discover.detail.doc` | The validated ComponentDoc for one external component: an @scope/name/Component query, or a free-text term resolving to exactly one component. |
441
+ | `discover.search` | The echoed query plus the matching {package, component} pairs, when a free-text term matches several components. |
442
+ | `search` | The echoed query, `matchCount` (total matches, before `limit`), and results, a ranked SearchResultEntry[] bounded by `limit`: each {domain, name, score, reason, description, command}, plus import (components, hooks), title, parent (the command that opens the level above), package (for a docs-tree hit), and, for a hit on one section, section (docs), or displayName and kind (templates). |
443
+ | `build.help` | The how-to-build-a-page playbook, emitted when no query is given: `playbook: true`, a title, the ordered steps (title, commands, optional returns), the on-system rules, and related lookups. Commands are bare subcommands for the caller to render with its own invocation. |
444
+ | `build.kit` | The template to start from and its kit: query, hasResults, matchCount (never a cap), directMatch, start {name, command, basis, reason, alternatives, ...}, pages (search's closest templates), blocks and domain as SearchResultEntry[], frame, foundation, and hint {reason, commands} when thin. |
445
+ | `swizzle.list` | The names of swizzlable components discoverable from cwd's @astryxdesign/core. |
446
+ | `swizzle.copy` | An eject receipt: component name, owning package, output directory, files-copied count, the written file names, whether any file uses StyleX, and an optional maintainer note. |
447
+ | `gap-report.categories` | The fixed gap category values and human-readable labels. |
448
+ | `gap-report.file` | An aggregate receipt: overall status, the selected package, issuesUrl (or null), deliveries in handler order, each {handlerType: project \| integration \| fallback, handler, audience, status, url, message}, and filedCount/routedOnlyCount totals. |
449
+ | `template.list` | The effective discovered TemplateListEntry[] for pages and blocks. A winning replacement entry includes optional `replaces`, naming the Core id omitted from the default list. |
450
+ | `template.show` | The resolved template's raw source plus its description, kind, and the component names it composes. |
451
+ | `template.skeleton` | A layout skeleton (structural tags with spatial annotations) plus the template's description and the components it composes. |
452
+ | `template.copy` | A scaffold receipt: template id, output directory, written file name, and file count. |
453
+ | `template.cdn` | A write receipt for the no-build-step CDN starter page: the path (relative to cwd), the Astryx version every CDN URL was pinned to, whether it was written, and the reason it was not. `exists` when a file was already there, which is a success. |
454
+ | `hook.list` | The hook catalog grouped by category: `detail` (the level: names \| compact \| full) and `components`, the grouped map of hook names, brief entries, or a full HookDoc per entry. |
455
+ | `hook.detail` | One hook's full authored HookDoc. |
456
+ | `hook.detail.params` | Just one hook's parameters table (HookParamDoc[]). |
457
+ | `theme.build` | A theme build receipt: name, tokenCount and componentCount (override counts), sizeKB, the written outputs {css, js, dts, and variantsDts when applicable}, warnings (defects to fix), and notices (advisories about a correct theme, such as a named font it does not load). |
458
+ | `theme.build.check` | The --check receipt: theme name, an upToDate flag, the stale outputs (each {path, reason: missing \| outdated}), and the full list of checked paths. Writes nothing. |
459
+ | `theme.build.batch` | Several themes built in one invocation: `count` plus one {file, receipt} per theme in argument order, where receipt is that theme's theme.build (or theme.build.check) envelope, or null when it produced no CSS. |
460
+ | `theme.list` | Every bundled or installed integration theme as a ThemeListEntry[]: each with slug, displayName, description, maintained flag, and owner package. |
461
+ | `theme.add` | A scaffold receipt: resolved slug, displayName, maintained flag, owner package, outputDir (relative to cwd), the theme entry file, its exportName, and the files written. |
462
+ | `theme.template` | A write receipt for the annotated theme template: the path (relative to cwd), whether it was written, and the reason it was not. `exists` when a file was already there, which is a success. |
463
+ | `theme.targets` | The whole themeable surface: the echoed filter, componentCount, and targets, one per theming target — {key, className, component, props, states, deprecatedFor?}, where props and states are its legal override keys and deprecatedFor names the canonical replacement key. |
464
+ | `theme.palette.generate` | An author-reviewable OKLCH palette candidate, its reproducibility receipt, summary counts, and optional candidate/receipt file-write result. |
465
+ | `upgrade.list` | Every available codemod, oldest→newest, as {name, title, version, optional}; returned for --list without running anything. |
466
+ | `upgrade.status` | A short-circuit outcome with no codemods run (up_to_date, no_codemods, or config_fixable), each carrying the agent-docs summary. |
467
+ | `upgrade.run` | The run receipt: from/to versions, codemod count, integrations processed, the agent-docs summary, and (apply mode) filesChanged, transformsApplied, and per-codemod errors. |
468
+ | `manifest` | The CLI capability manifest: name, version, apiVersion, description, globalOptions, commands (each name, description, arguments, options, json, aliases?, responseTypes?, examples?, exitCodes? as [{code, when}], subcommands?), jsonSupported, and the flat responseTypes index. |
469
+ | `doctor` | The health-check report: `checks` (each with id, label, status: pass \| warn \| fail \| info, a message, and a fix when not passing) plus a `summary` of counts per status. |
470
+ | `integration.add` | A contribution-writer receipt: kind, name, optional root {path, created}, integration-manifest path, every affected project-relative path, written, and dryRun. |
471
+ | `integration.pack-check` | The packed-package check: name, version, packable, tarball {filename, fileCount, size, unpackedSize} or null, inventory {manifest, roots [{kind, path, expectedFiles, missingFiles, complete}], expectedFiles, packedFiles}, contributions {local, packed}, each null or {themes [{slug, exportName}], components, templates [{id, type, name}], codemods [{version, id}], docs, agentDocsAppend}, and issues [{code, severity, message}]. |
472
+ | `integration.validate` | The validation result: the package name and version (both null when no local manifest is found) plus issues, an AstryxIntegrationIssue[] of {code, severity: warning \| error, message}. |
473
+ | `integration.template-conflicts` | The integration identity, structural issues, and non-blocking Core template-id conflicts as {id, severity: warning, integrationPackage, integrationType, integrationName, coreMatches, message, command}. |
474
+ | `integration.component-conflicts` | The integration identity, structural issues, and non-blocking conflicts where an integration component name is also owned by Core; each conflict includes the exact package-qualified command. |
475
+ | `integration.doc-conflicts` | The integration identity, structural issues, and Core doc overlaps. Each finding includes `severity` (`info` \| `error`) and `relationship` (`replaces` \| `extends` \| `accidental`). |
476
+ | `layout.expand` | The expansion: parsed form, generated TSX code, componentsUsed, states (count of useState hooks scaffolded), todos, blocksReferenced (each {name, mode}), warnings, and written (the output path, or null when nothing was written). |
477
+ | `layout.check` | The validation result: a valid flag, the detected form, errors (each with line/col, message, formatted text, and suggestions), warnings, and the expression re-printed in both canonical surfaces (compact and outline). |
478
+ | `layout.grammar` | The XLE/XLO grammar cheatsheet: a text field with the full reference plus an aliases map (short name → canonical component) generated from this install's registry. |
451
479
 
452
480
  <!-- END GENERATED: response-types -->
453
481
  <!-- Generated by scripts/generate-cli-readme.mjs from the response-types EnumDoc. Run `pnpm -F @astryxdesign/cli readme`. -->
@@ -456,25 +484,33 @@ Every response has a `type` discriminant. The full set is below (generated from
456
484
 
457
485
  `astryx doctor` runs read-only health checks against your project and
458
486
  environment. Each record uses `[ok]`, `[warn]`, `[fail]`, or `[info]`, and
459
- includes an actionable `fix` when one is available. The exact checks and values
460
- depend on the project; the output shape is stable:
487
+ includes an actionable `fix` when one is available. Field names match the
488
+ `--json` keys. The exact checks and values depend on the project; the output
489
+ shape is stable:
461
490
 
462
491
  ```
463
492
  $ astryx doctor
464
493
  astryx doctor - diagnosing your setup
465
494
 
495
+ id: node-version
466
496
  status: [ok]
467
- check: Node.js version
497
+ label: Node.js version
468
498
  message: Node v24.18.1 meets the minimum (>=22.13.0).
469
499
 
500
+ id: themes
470
501
  status: [warn]
471
- check: Theme packages
502
+ label: Theme packages
472
503
  message: No @astryxdesign/theme-* packages are installed.
473
504
  fix: Install a theme, e.g. `npm install @astryxdesign/theme-neutral`, then import its CSS or set astryx.theme.
474
505
 
475
506
  ...
476
507
 
477
- Summary: 4 passed, 2 warnings, 0 failures, 2 info
508
+ summary
509
+
510
+ pass: 4
511
+ warn: 2
512
+ fail: 0
513
+ info: 2
478
514
 
479
515
  No failures - but review the [warn] warnings above when you can.
480
516
  ```
@@ -632,9 +668,10 @@ wrong type fails there; a field this CLI does not know is ignored with a
632
668
  warning naming it, so a manifest written against a newer CLI still contributes
633
669
  everything this one understands.
634
670
 
635
- Discovery is resilient: a broken or misconfigured integration is skipped with a
636
- one-line warning on stderr instead of crashing the CLI, and it never corrupts a
637
- `--json` envelope. To inspect problems, run
671
+ Discovery is resilient. A manifest load failure skips that package with a warning.
672
+ An invalid contribution kind remains reportable without hiding other valid kinds,
673
+ and invalid template or component metadata is omitted without hiding valid siblings.
674
+ Warnings go to stderr and never corrupt a `--json` envelope. To inspect problems, run
638
675
  `astryx doctor integration validate <package>` for structure, then use `templates`,
639
676
  `components`, or `docs` under the same `astryx doctor integration` group to check
640
677
  Core identity overlaps before publishing. Bare `astryx doctor` checks overall
@@ -644,5 +681,5 @@ For the full authoring walkthrough (component doc format, template packaging
644
681
  and `exports` requirements, and codemod authoring), see the guide:
645
682
 
646
683
  ```bash
647
- astryx docs cli-integrations
684
+ astryx docs cli/integrations
648
685
  ```
@@ -11,6 +11,7 @@ export const doc = {
11
11
  type: 'function',
12
12
  kind: 'api',
13
13
  name: 'blog',
14
+ namespace: 'cli/api',
14
15
  displayName: 'blog()',
15
16
  summary: 'List blog posts, or read one, from the published RSS feed.',
16
17
  description:
@@ -0,0 +1,50 @@
1
+ // @generated by scripts/sync-api-types.mjs from the JSDoc in api/**/*.mjs.
2
+ // DO NOT EDIT — run `pnpm sync:api-types` to regenerate.
3
+
4
+ /**
5
+ * A page template the kit can recommend starting from.
6
+ * @typedef {object} PageTemplate
7
+ * @property {string} name The template's own id, as search reports it.
8
+ * @property {string} command `astryx template <id> --type page`, the command that selects exactly this template: an integration replacement is selected by the Core id it replaces, and `--type page` keeps a block with the same id from making it ambiguous. Search prints template commands the same way.
9
+ * @property {string} displayName Human-facing name.
10
+ * @property {string} description What the page is: its layout and the ideas it serves.
11
+ * @property {string} category The template's own `Family - Variant` label; empty when it declares none.
12
+ */
13
+ /**
14
+ * Every ready page template the project can scaffold, in discovery order. This
15
+ * is the default discovery view: an active integration replacement stands in
16
+ * for the Core template it replaces, as it does for `astryx template <id>`.
17
+ *
18
+ * Discovery failures leave the kit without a start rather than failing the
19
+ * command: the kit still carries its search matches, and `template --list`
20
+ * reports what went wrong.
21
+ *
22
+ * @param {string} cwd
23
+ * @returns {Promise<PageTemplate[]>}
24
+ */
25
+ export function loadPageTemplates(cwd: string): Promise<PageTemplate[]>;
26
+ /**
27
+ * A page template the kit can recommend starting from.
28
+ */
29
+ export type PageTemplate = {
30
+ /**
31
+ * The template's own id, as search reports it.
32
+ */
33
+ name: string;
34
+ /**
35
+ * `astryx template <id> --type page`, the command that selects exactly this template: an integration replacement is selected by the Core id it replaces, and `--type page` keeps a block with the same id from making it ambiguous. Search prints template commands the same way.
36
+ */
37
+ command: string;
38
+ /**
39
+ * Human-facing name.
40
+ */
41
+ displayName: string;
42
+ /**
43
+ * What the page is: its layout and the ideas it serves.
44
+ */
45
+ description: string;
46
+ /**
47
+ * The template's own `Family - Variant` label; empty when it declares none.
48
+ */
49
+ category: string;
50
+ };
@@ -0,0 +1,60 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file The build subject's environment access: the page templates a project
5
+ * can scaffold.
6
+ *
7
+ * @input Template discovery for `cwd` — the CLI's own templates plus any that
8
+ * the project's configured integrations contribute.
9
+ * @output Ready page templates as `{name, displayName, description, category,
10
+ * command}`, where `command` is the `astryx template` command that selects
11
+ * exactly that template.
12
+ * @position Beside build.mjs (api/build/). The kit leaf reads templates only
13
+ * through here, because a subject's `_adapter.mjs` is its only environment
14
+ * access. Search keeps its own discovery; this adds none of its own, it
15
+ * reuses the template subject's.
16
+ */
17
+
18
+ import {discoverTemplates} from '../template/template.mjs';
19
+
20
+ /**
21
+ * A page template the kit can recommend starting from.
22
+ * @typedef {object} PageTemplate
23
+ * @property {string} name The template's own id, as search reports it.
24
+ * @property {string} command `astryx template <id> --type page`, the command that selects exactly this template: an integration replacement is selected by the Core id it replaces, and `--type page` keeps a block with the same id from making it ambiguous. Search prints template commands the same way.
25
+ * @property {string} displayName Human-facing name.
26
+ * @property {string} description What the page is: its layout and the ideas it serves.
27
+ * @property {string} category The template's own `Family - Variant` label; empty when it declares none.
28
+ */
29
+
30
+ /**
31
+ * Every ready page template the project can scaffold, in discovery order. This
32
+ * is the default discovery view: an active integration replacement stands in
33
+ * for the Core template it replaces, as it does for `astryx template <id>`.
34
+ *
35
+ * Discovery failures leave the kit without a start rather than failing the
36
+ * command: the kit still carries its search matches, and `template --list`
37
+ * reports what went wrong.
38
+ *
39
+ * @param {string} cwd
40
+ * @returns {Promise<PageTemplate[]>}
41
+ */
42
+ export async function loadPageTemplates(cwd) {
43
+ let templates;
44
+ try {
45
+ templates = await discoverTemplates(cwd);
46
+ } catch {
47
+ return [];
48
+ }
49
+ return templates
50
+ .filter(t => t.type === 'page' && t.isReady !== false)
51
+ .map(t => ({
52
+ name: t.dirName,
53
+ displayName: t.displayName || t.name,
54
+ description: t.description || '',
55
+ category: t.category || '',
56
+ // The id `template()` resolves back to this entry: an active replacement
57
+ // owns the Core id it names, so that id selects it, not its own.
58
+ command: `astryx template ${t.replaces ?? t.dirName} --type page`,
59
+ }));
60
+ }
@@ -11,15 +11,19 @@ export const doc = {
11
11
  type: 'function',
12
12
  kind: 'api',
13
13
  name: 'build',
14
+ namespace: 'cli/api',
14
15
  displayName: 'build()',
15
16
  summary:
16
- 'Page-building assistant: the how-to-build playbook, or a composition kit for an idea.',
17
+ 'Page-building assistant: the how-to-build playbook, or the page template to start from for an idea.',
17
18
  description:
18
- 'The "assemble a page" entry point. Called with no query it returns the ' +
19
- 'playbook signal that the renderer expands into the how-to-build-a-page ' +
20
- 'workflow. Called with a query it runs the unified search and groups the ' +
21
- 'hits into a composition KIT: the closest page templates, drop-in blocks, ' +
22
- 'and idea-specific components/hooks, plus the always-on frame + foundation.',
19
+ 'The "build a page" entry point. Called with no query it returns the ' +
20
+ 'how-to-build-a-page playbook as data: the workflow steps with their ' +
21
+ 'commands, the on-system rules, and related lookups. Called with a query it names the page template to ' +
22
+ 'START from (always one: the page template a ranker built for long descriptions puts first, else the app ' +
23
+ 'shell) and the next two templates, ' +
24
+ 'and the unified search grouped around it: the other close page templates, drop-in blocks, and ' +
25
+ 'idea-specific components/hooks, plus the always-on frame + foundation. A template carries the page ' +
26
+ 'frame and spacing, so the kit never recommends composing a page from components.',
23
27
  importPath: '@astryxdesign/cli/api',
24
28
  signature:
25
29
  'build(query?: string, options?: BuildOptions): Promise<BuildHelpResponse | BuildKitResponse>',
@@ -54,12 +58,12 @@ export const doc = {
54
58
  {
55
59
  type: 'build.help',
56
60
  description:
57
- 'Emitted when the query is omitted: a pure marker (`data.playbook: true`) that the command renderer expands into the page-building workflow prose.',
61
+ 'Emitted when the query is omitted: the page-building playbook — `playbook: true`, a `title`, the ordered `steps` (each a `title`, its `commands`, and optionally what the step `returns`), the on-system `rules`, and `related` lookups. Each command is a bare subcommand ({command, purpose?}) for the caller to render with its own CLI invocation.',
58
62
  },
59
63
  {
60
64
  type: 'build.kit',
61
65
  description:
62
- 'The grouped composition kit: the echoed query, hasResults/matchCount/directMatch fields, the closest page templates (≤3), drop-in block patterns (≤5), idea-specific components/hooks (≤6), and the always-on frame + foundation component-name arrays. Carries `hint` only when the kit came back thin — what to try instead, so a caller does not read a near-empty kit as "the package has nothing".',
66
+ "The page template to start from and the kit around it: the echoed query, hasResults/matchCount/directMatch fields, `start` (the template to scaffold, the `template <id> --type page <path>` command that selects it, whether the page ranker's pick is also search's direct match, the closest page, or the fallback app shell, and the ranker's next two `alternatives`), search's closest page templates (≤3), drop-in block patterns (≤5), idea-specific components/hooks (≤6), and the always-on frame + foundation component-name arrays. Carries `hint` only when the kit came back thin — what to try instead, so a caller does not read a near-empty kit as \"the package has nothing\".",
63
67
  },
64
68
  ],
65
69
  throws: [
@@ -70,7 +74,10 @@ export const doc = {
70
74
  ],
71
75
  examples: [
72
76
  {label: 'Get the playbook', code: 'const r = await build();'},
73
- {label: 'Compose a page', code: "await build('analytics dashboard');"},
77
+ {
78
+ label: 'Find the template to start from',
79
+ code: "const {data} = await build('analytics dashboard');\n// data.start.command: 'astryx template dashboard --type page <path>'",
80
+ },
74
81
  {
75
82
  label: 'Restrict + limit',
76
83
  code: "await build('pricing', {type: 'template', limit: 10});",