@astryxdesign/cli 0.7.2-canary.fe2c655 → 0.7.3-canary.02f5fe4

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 (694) hide show
  1. package/CHANGELOG.md +119 -0
  2. package/README.md +216 -162
  3. package/api/build/_adapter.d.mts +66 -0
  4. package/api/build/_adapter.mjs +139 -4
  5. package/api/build/blocks/blocks.d.mts +92 -0
  6. package/api/build/blocks/blocks.mjs +528 -0
  7. package/api/build/blocks/blocks.test.mjs +238 -0
  8. package/api/build/blocks/blocks.weights.json +1 -0
  9. package/api/build/build.doc.mjs +4 -0
  10. package/api/build/build.mjs +25 -6
  11. package/api/build/build.type.mjs +1 -1
  12. package/api/build/help/help.mjs +1 -1
  13. package/api/build/kit/answer.d.mts +18 -0
  14. package/api/build/kit/answer.mjs +195 -0
  15. package/api/build/kit/answer.test.mjs +108 -0
  16. package/api/build/kit/kind.d.mts +25 -0
  17. package/api/build/kit/kind.mjs +170 -0
  18. package/api/build/kit/kit.d.mts +2 -4
  19. package/api/build/kit/kit.mjs +8 -406
  20. package/api/build/kit/rank.d.mts +3 -32
  21. package/api/build/kit/rank.mjs +25 -342
  22. package/api/build/kit/rank.test.mjs +2 -1
  23. package/api/build/kit/signals.d.mts +79 -0
  24. package/api/build/kit/signals.mjs +295 -0
  25. package/api/build/kit/start.d.mts +32 -0
  26. package/api/build/kit/start.mjs +163 -0
  27. package/api/build/kit/words.d.mts +72 -0
  28. package/api/build/kit/words.mjs +202 -0
  29. package/api/build/tree.d.mts +20 -0
  30. package/api/build/tree.mjs +53 -0
  31. package/api/build/tree.test.mjs +185 -0
  32. package/api/build/tree.weights.json +1 -0
  33. package/api/component/_adapter.d.mts +72 -1
  34. package/api/component/_adapter.mjs +251 -23
  35. package/api/component/component-replacement.test.mjs +1 -0
  36. package/api/component/component.doc.mjs +6 -1
  37. package/api/component/component.mjs +97 -16
  38. package/api/component/component.test.mjs +95 -0
  39. package/api/component/doc-links.test.mjs +386 -0
  40. package/api/component/integration-export-name.test.mjs +644 -0
  41. package/api/component/list/list.mjs +42 -4
  42. package/api/discover/_adapter.d.mts +131 -12
  43. package/api/discover/_adapter.mjs +520 -34
  44. package/api/discover/_adapter.test.mjs +641 -17
  45. package/api/discover/_catalog-view.d.mts +16 -5
  46. package/api/discover/_catalog-view.mjs +32 -8
  47. package/api/discover/detail/doc/doc.mjs +9 -1
  48. package/api/discover/discover.d.mts +11 -0
  49. package/api/discover/discover.doc.mjs +9 -7
  50. package/api/discover/discover.mjs +120 -19
  51. package/api/discover/discover.type.d.mts +20 -7
  52. package/api/discover/discover.type.mjs +17 -7
  53. package/api/discover/list/list.d.mts +4 -3
  54. package/api/discover/list/list.mjs +17 -10
  55. package/api/docs/_adapter.d.mts +76 -2
  56. package/api/docs/_adapter.mjs +630 -34
  57. package/api/docs/docs-homes.test.mjs +127 -0
  58. package/api/docs/docs.doc.mjs +5 -4
  59. package/api/docs/docs.mjs +2 -1
  60. package/api/docs/docs.test.mjs +39 -20
  61. package/api/docs/integration-tree.test.mjs +42 -20
  62. package/api/docs/integrationDocs.test.mjs +125 -1
  63. package/api/docs/list/list.mjs +12 -2
  64. package/api/docs/namespace-section.test.mjs +6 -6
  65. package/api/docs/reference-blocks.test.mjs +3 -5
  66. package/api/doctor/_adapter.d.mts +128 -0
  67. package/api/doctor/_adapter.mjs +253 -4
  68. package/api/doctor/doctor.d.mts +217 -0
  69. package/api/doctor/doctor.doc.mjs +3 -2
  70. package/api/doctor/doctor.mjs +691 -52
  71. package/api/doctor/doctor.test.mjs +267 -18
  72. package/api/doctor/release-checks.test.mjs +156 -0
  73. package/api/doctor/theme-checks.mjs +17 -4
  74. package/api/doctor/theme-checks.test.mjs +223 -7
  75. package/api/error.d.mts +10 -0
  76. package/api/error.mjs +25 -0
  77. package/api/gap-report/gap-report.d.mts +3 -0
  78. package/api/gap-report/gap-report.doc.mjs +11 -3
  79. package/api/gap-report/gap-report.mjs +219 -52
  80. package/api/gap-report/gap-report.test.mjs +233 -0
  81. package/api/gap-report/gap-report.type.d.mts +41 -0
  82. package/api/gap-report/gap-report.type.mjs +18 -0
  83. package/api/hook/_adapter.mjs +3 -11
  84. package/api/hook/hook.doc.mjs +4 -0
  85. package/api/hook/hook.mjs +1 -1
  86. package/api/hook/list/list.d.mts +1 -1
  87. package/api/index.d.mts +2 -0
  88. package/api/index.mjs +2 -0
  89. package/api/init/_adapter.d.mts +22 -0
  90. package/api/init/_adapter.mjs +59 -0
  91. package/api/init/init.d.mts +7 -5
  92. package/api/init/init.doc.mjs +45 -10
  93. package/api/init/init.mjs +28 -4
  94. package/api/init/init.test.mjs +18 -2
  95. package/api/init/init.type.d.mts +50 -5
  96. package/api/init/init.type.mjs +39 -5
  97. package/api/init/remove/remove.mjs +17 -4
  98. package/api/init/remove/remove.test.mjs +114 -2
  99. package/api/init/run/run.d.mts +1 -1
  100. package/api/init/run/run.mjs +86 -12
  101. package/api/init/user/user.d.mts +14 -0
  102. package/api/init/user/user.mjs +87 -0
  103. package/api/init/user/user.test.mjs +232 -0
  104. package/api/integration/_adapter.d.mts +53 -0
  105. package/api/integration/_adapter.mjs +132 -0
  106. package/api/integration/add-contribution.component-names.test.mjs +66 -0
  107. package/api/integration/add-contribution.mjs +8 -4
  108. package/api/integration/add-contribution.test.mjs +4 -2
  109. package/api/integration/authoring-checks.mjs +192 -14
  110. package/api/integration/authoring-checks.test.mjs +1028 -0
  111. package/api/integration/authoring-checks.type.d.mts +143 -0
  112. package/api/integration/authoring-checks.type.mjs +74 -2
  113. package/api/integration/check/check.d.mts +96 -0
  114. package/api/integration/check/check.mjs +357 -0
  115. package/api/integration/check/check.test.mjs +489 -0
  116. package/api/integration/integration-check.type.d.mts +118 -0
  117. package/api/integration/integration-check.type.mjs +84 -0
  118. package/api/integration/integrationCheck.doc.d.mts +10 -0
  119. package/api/integration/integrationCheck.doc.mjs +73 -0
  120. package/api/integration/integrationComponentConflicts.doc.mjs +45 -6
  121. package/api/integration/integrationDocConflicts.doc.mjs +22 -5
  122. package/api/integration/pack-check.mjs +486 -123
  123. package/api/integration/pack-check.test.mjs +817 -10
  124. package/api/integration/validate-integration-case-disk.test.mjs +111 -0
  125. package/api/integration/validate-integration-fixes.test.mjs +73 -5
  126. package/api/integration/validate-integration-gaps.test.mjs +1975 -0
  127. package/api/integration/validate-integration.d.mts +23 -2
  128. package/api/integration/validate-integration.mjs +358 -45
  129. package/api/integration/validate-integration.test.mjs +88 -8
  130. package/api/integration/validate-integration.type.d.mts +105 -0
  131. package/api/integration/validate-integration.type.mjs +79 -1
  132. package/api/integration/validate-unread-theme-folders.test.mjs +3 -2
  133. package/api/integration/validateIntegration.doc.mjs +19 -3
  134. package/api/search/ORDERING.md +28 -0
  135. package/api/search/_adapter.d.mts +91 -0
  136. package/api/search/_adapter.mjs +172 -0
  137. package/api/search/_adapter.test.mjs +173 -0
  138. package/api/search/_candidate-score.d.mts +40 -0
  139. package/api/search/_candidate-score.mjs +238 -0
  140. package/api/search/_cards.json +6098 -0
  141. package/api/search/_compound.d.mts +50 -0
  142. package/api/search/_compound.mjs +170 -0
  143. package/api/search/_doc-searcher.d.mts +4 -0
  144. package/api/search/_doc-searcher.mjs +23 -0
  145. package/api/search/_doc-searcher.test.mjs +36 -0
  146. package/api/search/_doc-searcher.weights.json +1 -0
  147. package/api/search/_doc-text.d.mts +30 -0
  148. package/api/search/_doc-text.mjs +87 -0
  149. package/api/search/_entries.d.mts +63 -0
  150. package/api/search/_entries.mjs +232 -0
  151. package/api/search/_entries.test.mjs +48 -0
  152. package/api/search/_features.d.mts +35 -0
  153. package/api/search/_features.mjs +155 -0
  154. package/api/search/_gather-components.d.mts +26 -0
  155. package/api/search/_gather-components.mjs +284 -0
  156. package/api/search/_gather-docs.d.mts +20 -0
  157. package/api/search/_gather-docs.mjs +254 -0
  158. package/api/search/_gather-hooks.d.mts +12 -0
  159. package/api/search/_gather-hooks.mjs +52 -0
  160. package/api/search/_gather-templates.d.mts +25 -0
  161. package/api/search/_gather-templates.mjs +107 -0
  162. package/api/search/_lexical.d.mts +135 -0
  163. package/api/search/_lexical.mjs +351 -0
  164. package/api/search/_main-searcher.d.mts +19 -0
  165. package/api/search/_main-searcher.mjs +115 -0
  166. package/api/search/_main-searcher.test.mjs +106 -0
  167. package/api/search/_main-searcher.weights.json +1 -0
  168. package/api/search/_module-doc.d.mts +32 -0
  169. package/api/search/_module-doc.mjs +78 -0
  170. package/api/search/_order.d.mts +32 -0
  171. package/api/search/_order.mjs +162 -0
  172. package/api/search/_order.test.mjs +72 -0
  173. package/api/search/_priority.d.mts +50 -0
  174. package/api/search/_priority.mjs +139 -0
  175. package/api/search/_query-words.d.mts +25 -0
  176. package/api/search/_query-words.mjs +92 -0
  177. package/api/search/_query.d.mts +65 -0
  178. package/api/search/_query.mjs +176 -0
  179. package/api/search/_result.d.mts +97 -0
  180. package/api/search/_result.mjs +150 -0
  181. package/api/search/_score.d.mts +60 -0
  182. package/api/search/_score.mjs +283 -0
  183. package/api/search/_synonyms.d.mts +21 -0
  184. package/api/search/_synonyms.mjs +67 -0
  185. package/api/search/_template-searcher.d.mts +4 -0
  186. package/api/search/_template-searcher.mjs +23 -0
  187. package/api/search/_template-searcher.test.mjs +40 -0
  188. package/api/search/_template-searcher.weights.json +1 -0
  189. package/api/search/_titles.d.mts +33 -0
  190. package/api/search/_titles.mjs +65 -0
  191. package/api/search/_words.d.mts +64 -0
  192. package/api/search/_words.mjs +157 -0
  193. package/api/search/search.d.mts +22 -236
  194. package/api/search/search.doc.mjs +14 -7
  195. package/api/search/search.domain-priority.test.mjs +108 -18
  196. package/api/search/search.integration-check.test.mjs +24 -0
  197. package/api/search/search.mjs +59 -1904
  198. package/api/search/search.test.mjs +193 -15
  199. package/api/search/search.type.d.mts +20 -2
  200. package/api/search/search.type.mjs +12 -2
  201. package/api/search/tree.d.mts +15 -0
  202. package/api/search/tree.mjs +40 -0
  203. package/api/search/tree.test.mjs +66 -0
  204. package/api/search/tree.weights.json +1 -0
  205. package/api/swizzle/_adapter.mjs +2 -2
  206. package/api/swizzle/copy/copy.mjs +29 -15
  207. package/api/template/template-integration.test.mjs +1 -1
  208. package/api/template/template.mjs +5 -1
  209. package/api/template/template.test.mjs +120 -3
  210. package/api/theme/_adapter.d.mts +16 -0
  211. package/api/theme/_adapter.mjs +32 -5
  212. package/api/theme/build/build.d.mts +2 -1
  213. package/api/theme/build/build.family.test.mjs +64 -0
  214. package/api/theme/build/build.mjs +250 -38
  215. package/api/theme/build/build.packed-old-core.test.mjs +21 -3
  216. package/api/theme/build/font-warning.mjs +5 -3
  217. package/api/theme/build/font-warning.test.mjs +2 -1
  218. package/api/theme/remove/remove.test.mjs +2 -2
  219. package/api/theme/targets/targets.mjs +3 -10
  220. package/api/theme/themeBuild.doc.mjs +4 -4
  221. package/api/theme/themeTargets.doc.mjs +4 -0
  222. package/api/theme/use/use.test.mjs +1 -1
  223. package/api/upgrade/_adapter.d.mts +97 -11
  224. package/api/upgrade/_adapter.mjs +315 -32
  225. package/api/upgrade/registry/registry.d.mts +10 -4
  226. package/api/upgrade/registry/registry.mjs +33 -16
  227. package/api/upgrade/registry/registry.test.mjs +85 -0
  228. package/api/upgrade/run/cli-behind-core.test.mjs +438 -0
  229. package/api/upgrade/run/run.d.mts +4 -2
  230. package/api/upgrade/run/run.mjs +48 -4
  231. package/api/upgrade/run/run.test.mjs +417 -3
  232. package/api/upgrade/status/status.d.mts +21 -5
  233. package/api/upgrade/status/status.mjs +45 -8
  234. package/api/upgrade/upgrade.doc.mjs +16 -8
  235. package/api/upgrade/upgrade.mjs +18 -3
  236. package/api/upgrade/upgrade.test.mjs +194 -0
  237. package/api/upgrade/upgrade.type.d.mts +28 -3
  238. package/api/upgrade/upgrade.type.mjs +24 -7
  239. package/assets/codemods/__tests__/registry.test.mjs +1 -0
  240. package/assets/codemods/registry.mjs +1 -0
  241. package/assets/codemods/runner.mjs +7 -1
  242. package/assets/codemods/transforms/v0.7.0/__tests__/validate-data-token-ownership.test.mjs +11 -0
  243. package/assets/codemods/transforms/v0.7.0/validate-data-token-ownership.mjs +3 -3
  244. package/assets/codemods/transforms/v0.7.2/__tests__/migrate-list-edge-compensation-to-edge.test.mjs +120 -0
  245. package/assets/codemods/transforms/v0.7.2/index.mjs +20 -0
  246. package/assets/codemods/transforms/v0.7.2/migrate-list-edge-compensation-to-edge.mjs +198 -0
  247. package/assets/discover/official-packages.json +367 -0
  248. package/assets/docs/README.md +10 -0
  249. package/assets/docs/author-a-theme.doc.mjs +5 -5
  250. package/assets/docs/browser-support.doc.mjs +1 -1
  251. package/assets/docs/getting-started.doc.mjs +26 -6
  252. package/assets/docs/is-my-code-good.doc.mjs +287 -0
  253. package/assets/docs/styling-overview.doc.mjs +1 -1
  254. package/assets/docs/theme.doc.dense.mjs +1 -1
  255. package/assets/docs/theme.doc.mjs +2 -2
  256. package/assets/docs/theme.doc.zh.mjs +1 -1
  257. package/assets/docs/tree/add-a-component.doc.mjs +22 -2
  258. package/assets/docs/tree/add-a-theme.doc.mjs +14 -4
  259. package/assets/docs/tree/add-a-topic.doc.mjs +54 -9
  260. package/assets/docs/tree/agent-guidance.doc.mjs +19 -5
  261. package/assets/docs/tree/api.doc.mjs +6 -0
  262. package/assets/docs/tree/authoring.doc.mjs +61 -0
  263. package/assets/docs/tree/block-template.doc.mjs +8 -20
  264. package/assets/docs/tree/build-the-template.doc.mjs +1 -1
  265. package/assets/docs/tree/building-blocks.doc.mjs +6 -2
  266. package/assets/docs/tree/check-the-props.doc.mjs +201 -0
  267. package/assets/docs/tree/check-your-docs.doc.mjs +69 -11
  268. package/assets/docs/tree/checks.doc.mjs +32 -24
  269. package/assets/docs/tree/ci-and-containers.doc.mjs +101 -0
  270. package/assets/docs/tree/cli-command.doc.mjs +142 -0
  271. package/assets/docs/tree/cli.doc.mjs +7 -1
  272. package/assets/docs/tree/codemods.doc.mjs +17 -7
  273. package/assets/docs/tree/commands.doc.mjs +7 -1
  274. package/assets/docs/tree/component-family.doc.mjs +8 -6
  275. package/assets/docs/tree/component-imports.doc.mjs +21 -3
  276. package/assets/docs/tree/components.doc.mjs +7 -1
  277. package/assets/docs/tree/computer-agent-guide.doc.mjs +160 -0
  278. package/assets/docs/tree/computer-integrations.doc.mjs +93 -0
  279. package/assets/docs/tree/configuration.doc.mjs +8 -4
  280. package/assets/docs/tree/debug-and-gap-reports.doc.mjs +41 -22
  281. package/assets/docs/tree/define-the-theme.doc.mjs +7 -6
  282. package/assets/docs/tree/describe-the-component.doc.mjs +3 -3
  283. package/assets/docs/tree/docs.doc.mjs +9 -3
  284. package/assets/docs/tree/document-the-template.doc.mjs +1 -1
  285. package/assets/docs/tree/document-the-theme.doc.mjs +4 -4
  286. package/assets/docs/tree/export-template-assets.doc.mjs +1 -1
  287. package/assets/docs/tree/extend-or-replace.doc.mjs +19 -9
  288. package/assets/docs/{authoring.doc.mjs → tree/field-reference.doc.mjs} +4 -3
  289. package/assets/docs/tree/fonts-and-assets.doc.mjs +3 -3
  290. package/assets/docs/tree/generate-a-palette.doc.mjs +8 -6
  291. package/assets/docs/tree/global-integrations.doc.mjs +124 -0
  292. package/assets/docs/tree/global.doc.mjs +131 -0
  293. package/assets/docs/tree/grade-template-with-agent.doc.mjs +5 -5
  294. package/assets/docs/tree/help.doc.mjs +2 -2
  295. package/assets/docs/tree/host-entry.doc.mjs +128 -0
  296. package/assets/docs/tree/install-once.doc.mjs +105 -0
  297. package/assets/docs/tree/layout-spacing.doc.mjs +2 -3
  298. package/assets/docs/tree/layout.doc.mjs +6 -6
  299. package/assets/docs/tree/links.doc.mjs +7 -6
  300. package/assets/docs/tree/migration-setup.doc.mjs +3 -2
  301. package/assets/docs/tree/migration-verification.doc.mjs +0 -1
  302. package/assets/docs/tree/migration.doc.mjs +0 -1
  303. package/assets/docs/tree/monorepos.doc.mjs +84 -0
  304. package/assets/docs/tree/package-and-test.doc.mjs +1 -1
  305. package/assets/docs/tree/page-template.doc.mjs +4 -8
  306. package/assets/docs/tree/problems.doc.mjs +205 -0
  307. package/assets/docs/tree/project-global-or-both.doc.mjs +131 -0
  308. package/assets/docs/tree/publishing.doc.mjs +6 -6
  309. package/assets/docs/tree/quick-start.doc.mjs +54 -28
  310. package/assets/docs/tree/reference.doc.mjs +192 -0
  311. package/assets/docs/tree/replace-a-core-component.doc.mjs +15 -7
  312. package/assets/docs/tree/replace-a-core-template.doc.mjs +10 -12
  313. package/assets/docs/tree/scaffold.doc.mjs +1 -1
  314. package/assets/docs/tree/sections-and-placement.doc.mjs +9 -11
  315. package/assets/docs/tree/see-it-in-an-app.doc.mjs +17 -5
  316. package/assets/docs/tree/ship.doc.mjs +2 -2
  317. package/assets/docs/tree/short-and-findable.doc.mjs +9 -8
  318. package/assets/docs/tree/single-component.doc.mjs +15 -6
  319. package/assets/docs/tree/start-a-template.doc.mjs +18 -8
  320. package/assets/docs/tree/subcomponent.doc.mjs +6 -6
  321. package/assets/docs/tree/template-assets.doc.mjs +2 -2
  322. package/assets/docs/tree/template-doc-overview.doc.mjs +6 -17
  323. package/assets/docs/tree/template-fonts.doc.mjs +1 -1
  324. package/assets/docs/tree/template-grading-rubric.doc.mjs +17 -38
  325. package/assets/docs/tree/template-icons.doc.mjs +1 -1
  326. package/assets/docs/tree/template-images-media.doc.mjs +1 -1
  327. package/assets/docs/tree/template-styles.doc.mjs +2 -2
  328. package/assets/docs/tree/templates.doc.mjs +7 -1
  329. package/assets/docs/tree/test-in-an-app.doc.mjs +7 -7
  330. package/assets/docs/tree/test-template-in-app.doc.mjs +5 -5
  331. package/assets/docs/tree/themes.doc.mjs +5 -1
  332. package/assets/docs/tree/tokens-and-setup.doc.mjs +19 -15
  333. package/assets/docs/tree/tokens-data.doc.mjs +2 -2
  334. package/assets/docs/tree/troubleshooting.doc.mjs +29 -13
  335. package/assets/docs/tree/type-scale.doc.mjs +3 -3
  336. package/assets/docs/tree/uninstall.doc.mjs +109 -0
  337. package/assets/docs/tree/updates.doc.mjs +92 -0
  338. package/assets/docs/tree/upgrading.doc.mjs +6 -6
  339. package/assets/docs/tree/use-a-theme-in-an-app.doc.mjs +15 -3
  340. package/assets/docs/tree/verify-packed-template.doc.mjs +3 -3
  341. package/assets/docs/tree/versioning.doc.mjs +14 -9
  342. package/assets/docs/tree/who-answers.doc.mjs +119 -0
  343. package/assets/docs/tree/write-good-templates.doc.mjs +1 -1
  344. package/assets/docs/tree/write-the-template-file.doc.mjs +7 -6
  345. package/assets/docs/use-a-theme.doc.mjs +2 -2
  346. package/assets/docs/use-integrations.doc.mjs +120 -0
  347. package/assets/docs/working-with-ai.doc.mjs +70 -13
  348. package/assets/templates/themes/butter/butterTheme.ts +4 -2
  349. package/assets/templates/themes/stone/stoneTheme.ts +4 -2
  350. package/assets/templates/themes/y2k/y2kTheme.ts +4 -2
  351. package/assets/theme.template.ts +1 -1
  352. package/authoring/codemod/codemod.doc.mjs +7 -3
  353. package/authoring/config/config.doc.mjs +9 -6
  354. package/authoring/config/type.ts +4 -2
  355. package/authoring/debug/parse.d.mts +5 -5
  356. package/authoring/discover/discover.doc.mjs +7 -1
  357. package/authoring/doctypes/_schema.d.mts +8 -3
  358. package/authoring/doctypes/_schema.mjs +1 -0
  359. package/authoring/doctypes/base/graph-fields.doc.mjs +6 -4
  360. package/authoring/doctypes/command/command.doc.mjs +20 -12
  361. package/authoring/doctypes/command/type.ts +14 -0
  362. package/authoring/doctypes/component/component.doc.mjs +30 -27
  363. package/authoring/doctypes/component/type.ts +21 -8
  364. package/authoring/doctypes/enum/enum.doc.mjs +7 -4
  365. package/authoring/doctypes/function/function.doc.mjs +9 -8
  366. package/authoring/doctypes/hook/hook.doc.mjs +5 -4
  367. package/authoring/doctypes/hook/type.ts +4 -0
  368. package/authoring/doctypes/namespace/namespace.doc.mjs +7 -6
  369. package/authoring/doctypes/reference/reference.doc.mjs +12 -11
  370. package/authoring/doctypes/schema/schema.doc.mjs +10 -10
  371. package/authoring/doctypes/template/integration-template.doc.d.mts +11 -0
  372. package/authoring/doctypes/template/integration-template.doc.mjs +49 -0
  373. package/authoring/doctypes/template/parse.d.mts +6 -2
  374. package/authoring/doctypes/template/parse.mjs +3 -1
  375. package/authoring/doctypes/template/template.doc.mjs +3 -3
  376. package/authoring/doctypes/template/type.ts +22 -0
  377. package/authoring/doctypes/theme/theme.doc.mjs +2 -2
  378. package/authoring/gap-report/gap-report.doc.mjs +2 -2
  379. package/authoring/identity/identity.doc.mjs +3 -3
  380. package/authoring/index.d.ts +2 -0
  381. package/authoring/integration/integration.doc.mjs +30 -6
  382. package/authoring/integration/parse.test.mjs +21 -0
  383. package/authoring/integration/schema.d.mts +16 -3
  384. package/authoring/integration/schema.mjs +34 -2
  385. package/authoring/integration/type.ts +13 -1
  386. package/clients/cli/bin/astryx.mjs +11 -65
  387. package/clients/cli/cli-command.test.mjs +166 -0
  388. package/clients/cli/command-result-coverage.test.mjs +6 -5
  389. package/clients/cli/commands/blog.doc.mjs +1 -0
  390. package/clients/cli/commands/build-theme.batch-report.test.mjs +17 -3
  391. package/clients/cli/commands/build-theme.color-scheme.test.mjs +1 -1
  392. package/clients/cli/commands/build-theme.font-warning.test.mjs +3 -3
  393. package/clients/cli/commands/build-theme.path-safety.test.mjs +224 -6
  394. package/clients/cli/commands/build-theme.registry.test.mjs +5 -2
  395. package/clients/cli/commands/build.doc.mjs +1 -0
  396. package/clients/cli/commands/build.exit-codes-doc.test.mjs +4 -0
  397. package/clients/cli/commands/cli-postinstall.test.mjs +49 -1
  398. package/clients/cli/commands/component.doc.mjs +1 -0
  399. package/clients/cli/commands/{component/index.mjs → component.mjs} +37 -37
  400. package/clients/cli/commands/component.test.mjs +6 -6
  401. package/clients/cli/commands/discover.broken-integration.test.mjs +11 -7
  402. package/clients/cli/commands/discover.doc.mjs +9 -1
  403. package/clients/cli/commands/discover.mjs +144 -93
  404. package/clients/cli/commands/discover.no-source.test.mjs +448 -33
  405. package/clients/cli/commands/discover.sources.test.mjs +20 -1
  406. package/clients/cli/commands/docs.doc.mjs +3 -2
  407. package/clients/cli/commands/docs.mjs +50 -20
  408. package/clients/cli/commands/docs.test.mjs +16 -16
  409. package/clients/cli/commands/doctor-integration-components.doc.mjs +19 -4
  410. package/clients/cli/commands/doctor-integration-docs.doc.mjs +20 -5
  411. package/clients/cli/commands/doctor-integration-templates.doc.mjs +1 -0
  412. package/clients/cli/commands/doctor-integration-validate.doc.mjs +22 -2
  413. package/clients/cli/commands/doctor-integration.test.mjs +936 -3
  414. package/clients/cli/commands/doctor.doc.mjs +12 -2
  415. package/clients/cli/commands/doctor.mjs +332 -7
  416. package/clients/cli/commands/doctor.test.mjs +75 -4
  417. package/clients/cli/commands/gap-report.doc.mjs +15 -2
  418. package/clients/cli/commands/gap-report.mjs +24 -2
  419. package/clients/cli/commands/gap-report.test.mjs +79 -0
  420. package/clients/cli/commands/hook.doc.mjs +1 -0
  421. package/clients/cli/commands/{hook/index.mjs → hook.mjs} +22 -22
  422. package/clients/cli/commands/import-hint-correctness.test.mjs +1 -1
  423. package/clients/cli/commands/init.behavior.test.mjs +235 -1
  424. package/clients/cli/commands/init.doc.mjs +55 -10
  425. package/clients/cli/commands/init.flag-help.test.mjs +1 -0
  426. package/clients/cli/commands/init.mjs +2 -2
  427. package/clients/cli/commands/integration-add.doc.mjs +7 -0
  428. package/clients/cli/commands/integration-authoring.test.mjs +49 -3
  429. package/clients/cli/commands/integration-check.doc.mjs +93 -0
  430. package/clients/cli/commands/integration-check.test.mjs +489 -0
  431. package/clients/cli/commands/integration-pack.doc.mjs +8 -1
  432. package/clients/cli/commands/integration-verify.doc.mjs +8 -1
  433. package/clients/cli/commands/integration.doc.mjs +6 -2
  434. package/clients/cli/commands/integration.mjs +119 -7
  435. package/clients/cli/commands/json-contract.test.mjs +11 -2
  436. package/clients/cli/commands/manifest.doc.mjs +2 -1
  437. package/clients/cli/commands/manifest.mjs +67 -0
  438. package/clients/cli/commands/outside-project.test.mjs +874 -0
  439. package/clients/cli/commands/postinstall.doc.mjs +23 -0
  440. package/clients/cli/commands/postinstall.mjs +31 -0
  441. package/clients/cli/commands/search.doc.mjs +1 -0
  442. package/clients/cli/commands/search.mjs +16 -11
  443. package/clients/cli/commands/search.test.mjs +429 -296
  444. package/clients/cli/commands/setup-nudge.test.mjs +180 -2
  445. package/clients/cli/commands/swizzle.doc.mjs +7 -0
  446. package/clients/cli/commands/swizzle.mjs +5 -3
  447. package/clients/cli/commands/swizzle.routing.test.mjs +19 -2
  448. package/clients/cli/commands/template.doc.mjs +1 -0
  449. package/clients/cli/commands/text-json-parity.test.mjs +5 -0
  450. package/clients/cli/commands/theme-add-lifecycle.test.mjs +3 -3
  451. package/clients/cli/commands/theme-add.doc.mjs +8 -1
  452. package/clients/cli/commands/theme-build.doc.mjs +3 -2
  453. package/clients/cli/commands/theme-eject.doc.mjs +1 -0
  454. package/clients/cli/commands/theme-list.behavior.test.mjs +6 -0
  455. package/clients/cli/commands/theme-list.doc.mjs +1 -0
  456. package/clients/cli/commands/theme-palette-generate.doc.mjs +1 -0
  457. package/clients/cli/commands/theme-remove.doc.mjs +7 -0
  458. package/clients/cli/commands/theme-targets.doc.mjs +1 -0
  459. package/clients/cli/commands/theme-template.doc.mjs +1 -0
  460. package/clients/cli/commands/theme-use.doc.mjs +7 -0
  461. package/clients/cli/commands/{build-theme.mjs → theme.mjs} +27 -14
  462. package/clients/cli/commands/upgrade.config-ordering.test.mjs +2 -1
  463. package/clients/cli/commands/upgrade.doc.mjs +26 -3
  464. package/clients/cli/commands/upgrade.file-protection.test.mjs +3 -2
  465. package/clients/cli/commands/upgrade.hook-output.test.mjs +2 -1
  466. package/clients/cli/commands/upgrade.mjs +9 -2
  467. package/clients/cli/commands/upgrade.older-cli.test.mjs +160 -0
  468. package/clients/cli/commands/upgrade.subfolder-path.test.mjs +97 -0
  469. package/clients/cli/index.mjs +156 -100
  470. package/clients/cli/lib/cli-error.mjs +4 -1
  471. package/clients/cli/lib/component-format.mjs +1 -1
  472. package/clients/cli/lib/component-format.test.mjs +1 -1
  473. package/clients/cli/lib/define-command.mjs +14 -9
  474. package/clients/cli/lib/exit-codes.test.mjs +5 -0
  475. package/clients/cli/lib/json-shim.mjs +3 -1
  476. package/clients/cli/lib/manifest.d.ts +9 -0
  477. package/clients/cli/lib/manifest.mjs +17 -1
  478. package/clients/cli/lib/manifest.test.mjs +37 -0
  479. package/clients/cli/lib/welcome-box.mjs +50 -0
  480. package/clients/cli/run.mjs +108 -0
  481. package/foundation/agent-docs/agent-doc-state.d.mts +67 -13
  482. package/foundation/agent-docs/agent-doc-state.mjs +123 -14
  483. package/foundation/agent-docs/agent-docs.d.mts +104 -15
  484. package/foundation/agent-docs/agent-docs.mjs +1028 -114
  485. package/foundation/agent-docs/agent-docs.path-safety.test.mjs +1239 -17
  486. package/foundation/agent-docs/agent-docs.test.mjs +683 -39
  487. package/foundation/agent-docs/computer-agent-text.d.mts +170 -0
  488. package/foundation/agent-docs/computer-agent-text.mjs +750 -0
  489. package/foundation/agent-docs/computer-agent-text.test.mjs +699 -0
  490. package/foundation/config/project.d.mts +35 -3
  491. package/foundation/config/project.mjs +243 -26
  492. package/foundation/config/project.test.mjs +122 -0
  493. package/foundation/config/theme-state.mjs +5 -4
  494. package/foundation/discovery/authoring-self-docs.d.mts +7 -0
  495. package/foundation/discovery/authoring-self-docs.mjs +17 -4
  496. package/foundation/discovery/authoring-self-docs.test.mjs +15 -3
  497. package/foundation/discovery/authoring-surface.d.mts +1 -1
  498. package/foundation/discovery/authoring-surface.mjs +2 -2
  499. package/foundation/discovery/authoring-surface.test.mjs +1 -1
  500. package/foundation/discovery/cli-self-docs.d.mts +2 -1
  501. package/foundation/discovery/cli-self-docs.mjs +22 -4
  502. package/foundation/discovery/cli-self-docs.test.mjs +3 -2
  503. package/foundation/discovery/component-discovery.d.mts +227 -10
  504. package/foundation/discovery/component-discovery.export-names.test.mjs +760 -0
  505. package/foundation/discovery/component-discovery.mjs +940 -57
  506. package/foundation/discovery/component-discovery.test.mjs +96 -0
  507. package/foundation/discovery/component-loader.d.mts +1 -1
  508. package/foundation/discovery/component-replacement.mjs +20 -1
  509. package/foundation/discovery/component-replacement.test.mjs +40 -0
  510. package/foundation/discovery/copied-passages.d.mts +216 -0
  511. package/foundation/discovery/copied-passages.mjs +720 -0
  512. package/foundation/discovery/copied-passages.test.mjs +124 -0
  513. package/foundation/discovery/doc-consistency.d.mts +34 -0
  514. package/foundation/discovery/doc-consistency.mjs +513 -0
  515. package/foundation/discovery/doc-consistency.test.mjs +347 -0
  516. package/foundation/discovery/doc-fluff.d.mts +112 -0
  517. package/foundation/discovery/doc-fluff.mjs +328 -0
  518. package/foundation/discovery/doc-fluff.test.mjs +142 -0
  519. package/foundation/discovery/doc-types.d.mts +157 -0
  520. package/foundation/discovery/doc-types.mjs +1231 -0
  521. package/foundation/discovery/doc-types.test.mjs +744 -0
  522. package/foundation/discovery/docs-discovery.d.mts +88 -0
  523. package/foundation/discovery/docs-discovery.mjs +97 -3
  524. package/foundation/discovery/integration-doc-files.d.mts +22 -0
  525. package/foundation/discovery/integration-doc-files.mjs +231 -0
  526. package/foundation/discovery/integration-doc-files.test.mjs +246 -0
  527. package/foundation/discovery/module-exports.d.mts +68 -0
  528. package/foundation/discovery/module-exports.mjs +609 -31
  529. package/foundation/discovery/module-exports.test.mjs +172 -0
  530. package/foundation/discovery/package-tsconfig.d.mts +14 -0
  531. package/foundation/discovery/package-tsconfig.mjs +228 -0
  532. package/foundation/discovery/package-tsconfig.test.mjs +210 -0
  533. package/foundation/discovery/project-typescript.d.mts +32 -0
  534. package/foundation/discovery/project-typescript.mjs +89 -0
  535. package/foundation/discovery/prop-drift.d.mts +297 -0
  536. package/foundation/discovery/prop-drift.mjs +2428 -0
  537. package/foundation/discovery/prop-drift.test.mjs +2337 -0
  538. package/foundation/discovery/runner-allowlist.d.mts +38 -0
  539. package/foundation/discovery/runner-allowlist.mjs +51 -0
  540. package/foundation/discovery/runner-commands.d.mts +77 -0
  541. package/foundation/discovery/runner-commands.mjs +294 -0
  542. package/foundation/discovery/runner-commands.test.mjs +128 -0
  543. package/foundation/discovery/stray-pointers.d.mts +52 -0
  544. package/foundation/discovery/stray-pointers.mjs +293 -0
  545. package/foundation/discovery/stray-pointers.test.mjs +86 -0
  546. package/foundation/discovery/template-adapter.mjs +92 -6
  547. package/foundation/discovery/template-needs.mjs +6 -46
  548. package/foundation/discovery/theme-discovery.mjs +147 -3
  549. package/foundation/discovery/theme-imports.mjs +8 -4
  550. package/foundation/discovery/theme-imports.test.mjs +1 -1
  551. package/foundation/discovery/type-match.d.mts +53 -0
  552. package/foundation/discovery/type-match.mjs +660 -0
  553. package/foundation/discovery/type-match.test.mjs +169 -0
  554. package/foundation/discovery/type-text.d.mts +68 -0
  555. package/foundation/discovery/type-text.mjs +658 -0
  556. package/foundation/discovery/type-text.test.mjs +196 -0
  557. package/foundation/discovery/unresolved-references.d.mts +62 -0
  558. package/foundation/discovery/unresolved-references.mjs +790 -0
  559. package/foundation/discovery/unresolved-references.test.mjs +567 -0
  560. package/foundation/doc-compiler/doc-loads.test.mjs +84 -10
  561. package/foundation/doc-compiler/inputs.mjs +27 -1
  562. package/foundation/doc-compiler/inputs.test.mjs +0 -1
  563. package/foundation/doc-compiler/links.d.mts +41 -5
  564. package/foundation/doc-compiler/links.mjs +167 -28
  565. package/foundation/doc-compiler/links.test.mjs +97 -4
  566. package/foundation/doc-compiler/read.d.mts +1 -1
  567. package/foundation/doc-compiler/read.mjs +59 -1
  568. package/foundation/doc-compiler/read.test.mjs +11 -2
  569. package/foundation/doc-compiler/split-topic-keywords.test.mjs +3 -2
  570. package/foundation/doc-compiler/tree.d.mts +32 -6
  571. package/foundation/doc-compiler/tree.mjs +107 -44
  572. package/foundation/doc-compiler/tree.test.mjs +14 -7
  573. package/foundation/env/cli-command.d.mts +83 -0
  574. package/foundation/env/cli-command.mjs +152 -0
  575. package/foundation/env/cli-command.test.mjs +129 -0
  576. package/foundation/env/node-version.test.mjs +15 -3
  577. package/foundation/env/package-manager.d.mts +93 -9
  578. package/foundation/env/package-manager.global.test.mjs +66 -0
  579. package/foundation/env/package-manager.mjs +184 -13
  580. package/foundation/env/package-manager.test.mjs +341 -15
  581. package/foundation/env/project-scope.d.mts +9 -0
  582. package/foundation/env/project-scope.mjs +33 -0
  583. package/foundation/env/search-path.d.mts +42 -0
  584. package/foundation/env/search-path.mjs +205 -0
  585. package/foundation/env/search-path.test.mjs +122 -0
  586. package/foundation/env/user-dirs.d.mts +39 -0
  587. package/foundation/env/user-dirs.mjs +93 -0
  588. package/foundation/env/user-dirs.test.mjs +72 -0
  589. package/foundation/env/user-settings.d.mts +46 -0
  590. package/foundation/env/user-settings.mjs +106 -0
  591. package/foundation/env/user-settings.test.mjs +64 -0
  592. package/foundation/fs/file-protection.mjs +15 -1
  593. package/foundation/fs/module-loader.d.mts +2 -1
  594. package/foundation/fs/module-loader.mjs +60 -4
  595. package/foundation/fs/module-loader.stdout.test.mjs +3 -2
  596. package/foundation/fs/module-loader.test.mjs +194 -0
  597. package/foundation/fs/path-compare.d.mts +33 -0
  598. package/foundation/fs/path-compare.mjs +73 -0
  599. package/foundation/fs/paths.d.mts +122 -4
  600. package/foundation/fs/paths.mjs +675 -29
  601. package/foundation/fs/paths.test.mjs +439 -54
  602. package/foundation/fs/read-record.d.mts +18 -0
  603. package/foundation/fs/read-record.mjs +131 -0
  604. package/foundation/fs/read-record.test.mjs +77 -0
  605. package/foundation/integrations/autolink.d.mts +2 -1
  606. package/foundation/integrations/autolink.mjs +4 -13
  607. package/foundation/integrations/cli-peer-version.d.mts +36 -0
  608. package/foundation/integrations/cli-peer-version.mjs +132 -0
  609. package/foundation/integrations/cli-peer-version.test.mjs +354 -0
  610. package/foundation/integrations/computer-integrations.d.mts +81 -0
  611. package/foundation/integrations/computer-integrations.mjs +345 -0
  612. package/foundation/integrations/computer-integrations.test.mjs +292 -0
  613. package/foundation/integrations/contribution-inventory.d.mts +26 -20
  614. package/foundation/integrations/contribution-inventory.mjs +97 -8
  615. package/foundation/integrations/exports-subpaths.d.mts +57 -0
  616. package/foundation/integrations/exports-subpaths.mjs +113 -0
  617. package/foundation/integrations/integration-warnings.mjs +3 -2
  618. package/foundation/integrations/integration-warnings.test.mjs +8 -9
  619. package/foundation/integrations/integrations.d.mts +51 -1
  620. package/foundation/integrations/integrations.mjs +106 -4
  621. package/foundation/integrations/issue.ts +6 -0
  622. package/foundation/integrations/public-imports.d.mts +118 -0
  623. package/foundation/integrations/public-imports.mjs +1769 -0
  624. package/foundation/integrations/public-imports.test.mjs +1793 -0
  625. package/foundation/integrations/validate-contributions.d.mts +117 -0
  626. package/foundation/integrations/validate-contributions.mjs +1209 -14
  627. package/foundation/release/agent-text-worker.d.mts +4 -0
  628. package/foundation/release/agent-text-worker.mjs +52 -0
  629. package/foundation/release/cache.d.mts +310 -0
  630. package/foundation/release/cache.mjs +1216 -0
  631. package/foundation/release/cache.test.mjs +923 -0
  632. package/foundation/release/choose.d.mts +207 -0
  633. package/foundation/release/choose.mjs +677 -0
  634. package/foundation/release/choose.test.mjs +427 -0
  635. package/foundation/release/core-worker.d.mts +4 -0
  636. package/foundation/release/core-worker.mjs +38 -0
  637. package/foundation/release/global-state.d.mts +263 -0
  638. package/foundation/release/global-state.mjs +474 -0
  639. package/foundation/release/global-state.test.mjs +381 -0
  640. package/foundation/release/handoff.d.mts +79 -0
  641. package/foundation/release/handoff.e2e.test.mjs +278 -0
  642. package/foundation/release/handoff.mjs +524 -0
  643. package/foundation/release/lock-lease.d.mts +23 -0
  644. package/foundation/release/lock-lease.mjs +80 -0
  645. package/foundation/release/notices.d.mts +307 -0
  646. package/foundation/release/notices.mjs +707 -0
  647. package/foundation/release/notices.test.mjs +586 -0
  648. package/foundation/release/npm-guard.d.mts +4 -0
  649. package/foundation/release/npm-guard.mjs +126 -0
  650. package/foundation/release/project.d.mts +141 -0
  651. package/foundation/release/project.mjs +466 -0
  652. package/foundation/release/project.test.mjs +288 -0
  653. package/foundation/release/refresh-worker.d.mts +4 -0
  654. package/foundation/release/refresh-worker.mjs +27 -0
  655. package/foundation/release/run-context.d.mts +47 -0
  656. package/foundation/release/run-context.mjs +163 -0
  657. package/foundation/release/update-notice-env.d.mts +28 -0
  658. package/foundation/release/update-notice-env.mjs +39 -0
  659. package/foundation/response/base.d.ts +26 -3
  660. package/foundation/response/error-codes.d.mts +3 -1
  661. package/foundation/response/error-codes.doc.mjs +12 -0
  662. package/foundation/response/error-codes.mjs +17 -0
  663. package/foundation/response/error-codes.test.mjs +2 -0
  664. package/foundation/response/json-contract.test.mjs +7 -2
  665. package/foundation/response/json.mjs +4 -1
  666. package/foundation/response/response-types.doc.mjs +22 -11
  667. package/foundation/response/response-types.doc.test.mjs +46 -0
  668. package/foundation/response/response.doc.mjs +3 -3
  669. package/foundation/route/route.d.mts +285 -0
  670. package/foundation/route/route.mjs +324 -0
  671. package/foundation/route/route.test.mjs +153 -0
  672. package/foundation/runtime/hosted-runtime.test.mjs +403 -0
  673. package/foundation/runtime/locked-versions.d.mts +32 -0
  674. package/foundation/runtime/locked-versions.mjs +65 -0
  675. package/foundation/runtime/package-root.d.mts +91 -0
  676. package/foundation/runtime/package-root.mjs +174 -0
  677. package/foundation/runtime/package-set.d.mts +62 -0
  678. package/foundation/runtime/package-set.mjs +130 -0
  679. package/foundation/runtime/package-set.test.mjs +432 -0
  680. package/foundation/text/string-utils.d.mts +2 -1
  681. package/foundation/text/string-utils.mjs +16 -5
  682. package/foundation/text/suggest-order.d.mts +72 -0
  683. package/foundation/text/suggest-order.mjs +363 -0
  684. package/foundation/text/suggest-order.test.mjs +259 -0
  685. package/foundation/xle/browser-imports.test.mjs +74 -0
  686. package/foundation/xle/registry.mjs +4 -0
  687. package/foundation/xle/registry.test.mjs +28 -0
  688. package/host/door-conformance.test.mjs +274 -0
  689. package/host/index.d.ts +116 -0
  690. package/host/index.mjs +295 -0
  691. package/host/index.test.mjs +302 -0
  692. package/package.json +16 -11
  693. package/scripts/postinstall.mjs +24 -5
  694. package/assets/docs/tree/integrations.doc.mjs +0 -40
@@ -76,6 +76,10 @@ export const doc = {
76
76
  code: 'ERR_CORE_NOT_FOUND',
77
77
  when: 'a query is given and @astryxdesign/core cannot be found from cwd',
78
78
  },
79
+ {
80
+ code: 'ERR_VERSIONS_UNAVAILABLE',
81
+ when: 'a query is given outside a project, or in a project with nothing installed, and the Core of the release that answers is not beside it or cached, and cannot be installed into the per-user cache (offline, a registry without it, or an unwritable cache)',
82
+ },
79
83
  ],
80
84
  examples: [
81
85
  {label: 'Get the playbook', code: 'const r = await build();'},
@@ -4,20 +4,27 @@
4
4
  * @file build API — dispatcher + barrel for the "assemble a page" assistant.
5
5
  *
6
6
  * `build()` with no query signals the workflow playbook (`build.help`). With a
7
- * query it runs the unified search and groups the results into a composition
8
- * KIT (`build.kit`). Each shape is projected by its own leaf; this file only
7
+ * query it runs build's tree (tree.mjs), whose searchers answer with a
8
+ * composition KIT (`build.kit`). Each shape is projected by its own leaf; this file only
9
9
  * routes to the leaves and re-exports them, keeping the SAME `build` export so
10
10
  * api/index.mjs and the CLI consumer stay unchanged.
11
11
  *
12
12
  * no query → build.help (api/build/help/help.mjs)
13
- * a query → build.kit (api/build/kit/kit.mjs)
13
+ * a query → build.kit (api/build/tree.mjs: kit/signals.mjs, the block
14
+ * picker in blocks/blocks.mjs, then kit/answer.mjs)
14
15
  */
15
16
 
16
17
  import {AstryxError} from '../error.mjs';
17
18
  import {ERROR_CODES} from '../../foundation/response/error-codes.mjs';
18
19
  import {buildHelp} from './help/help.mjs';
19
20
  import {buildKit} from './kit/kit.mjs';
20
- import {withListingCache} from './_adapter.mjs';
21
+ import {
22
+ loadBlockPicker,
23
+ loadTreeWeights,
24
+ withListingCache,
25
+ } from './_adapter.mjs';
26
+ import {runTree} from '../../foundation/route/route.mjs';
27
+ import {BUILD_TREE} from './tree.mjs';
21
28
 
22
29
  // Barrel: surface the leaves alongside the dispatcher for the fractal shape.
23
30
  export {buildHelp, buildKit};
@@ -34,7 +41,10 @@ export async function build(query, options = {}) {
34
41
  if (!query || !String(query).trim()) {
35
42
  return buildHelp();
36
43
  }
37
- if (options.limit != null && (!Number.isInteger(options.limit) || options.limit <= 0)) {
44
+ if (
45
+ options.limit != null &&
46
+ (!Number.isInteger(options.limit) || options.limit <= 0)
47
+ ) {
38
48
  throw new AstryxError(
39
49
  `Invalid limit "${options.limit}". Must be a positive integer.`,
40
50
  undefined,
@@ -43,5 +53,14 @@ export async function build(query, options = {}) {
43
53
  }
44
54
  // The kit resolves every candidate's source and docs by walking the same
45
55
  // tree; read each directory once for this call.
46
- return withListingCache(() => buildKit(query, options));
56
+ return withListingCache(
57
+ async () =>
58
+ /** @type {import('./build.type.mjs').BuildKitResponse} */ (
59
+ await runTree(
60
+ BUILD_TREE,
61
+ {query, options},
62
+ {weights: loadTreeWeights(), blocks: loadBlockPicker()},
63
+ )
64
+ ),
65
+ );
47
66
  }
@@ -77,7 +77,7 @@
77
77
  * @property {boolean} data.directMatch True when the top page template is a confident direct match.
78
78
  * @property {BuildStart | null} data.start The page template to start from: the ranker's pick, else the app shell. Null only when the kit is narrowed to components or hooks (`type`), or when the project has no page template to offer.
79
79
  * @property {import('../search/search.type.mjs').SearchResultEntry[]} data.pages Closest page templates by search (≤3). Each entry's `command` carries `--skeleton` when `directMatch` is false, so it previews the layout; `start.command` is the scaffold.
80
- * @property {import('../search/search.type.mjs').SearchResultEntry[]} data.blocks Drop-in block patterns covering parts of the idea (≤5).
80
+ * @property {import('../search/search.type.mjs').SearchResultEntry[]} data.blocks Drop-in block patterns covering parts of the idea (≤5), best first. A block search returned keeps search's score and reason; any other block carries the block picker's relative score (100 for its best candidate, never below 1) and reason, so the two kinds of score are not comparable.
81
81
  * @property {import('../search/search.type.mjs').SearchResultEntry[]} data.domain Idea-specific components/hooks (≤6), excluding frame/foundation.
82
82
  * @property {string[]} data.frame Always-on page-shell component names. Every page template already uses them.
83
83
  * @property {string[]} data.foundation Always-on layout/typography/action component names. Every page template already uses them.
@@ -63,7 +63,7 @@ export function buildHelp() {
63
63
  "Keep the template's page frame, gap, and padding values. Replace its data, copy, and sections.",
64
64
  'No <div>/raw HTML for layout — use VStack/HStack/Grid/Stack/Card etc.',
65
65
  'No style={{}} — use component props, and design tokens for values.',
66
- "Wrap the app in <Theme theme={...}> (import {Theme} from '@astryxdesign/core') and import core reset.css + astryx.css.",
66
+ "Wrap the app in <Theme theme={...}> (import {Theme} from '@astryxdesign/core/theme') and import core reset.css + astryx.css.",
67
67
  ],
68
68
  related: [
69
69
  {
@@ -0,0 +1,18 @@
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
+ * The kit for a request. `blocks` names the blocks to list, best first: a
6
+ * block build names itself keeps build's entry, another keeps search's own
7
+ * entry (its real score and reason), a name search did not return is
8
+ * dropped, and the kit never lists more blocks than build's own. Blocks of
9
+ * the same name from two packages are both kept.
10
+ *
11
+ * @param {import('./signals.mjs').KitSignals} signals
12
+ * @param {string[]} [blocks] block names; build's own when omitted
13
+ * @param {Map<string, import('../../search/search.type.mjs').SearchResultEntry>} [picked]
14
+ * the block picker's own entry (its real score and reason) for each named
15
+ * block search did not return
16
+ * @returns {import('../build.type.mjs').BuildKitResponse}
17
+ */
18
+ export function kitAnswer(signals: import("./signals.mjs").KitSignals, blocks?: string[], picked?: Map<string, import("../../search/search.type.mjs").SearchResultEntry>): import("../build.type.mjs").BuildKitResponse;
@@ -0,0 +1,195 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file The build.kit response, from a request's signals (signals.mjs) and the
5
+ * blocks to name. With build's own blocks it is the kit build has always
6
+ * given; another list changes only the blocks, never their count.
7
+ * @input {@link import('./signals.mjs').KitSignals} and block names
8
+ * @output the build.kit response
9
+ * @position api/build/kit, beside signals.mjs; the main searcher in tree.mjs
10
+ * calls it with the block picker's list.
11
+ */
12
+
13
+ import {firstSentence} from '../../../foundation/text/string-utils.mjs';
14
+ import {FOUNDATION, FRAME} from './signals.mjs';
15
+
16
+ /**
17
+ * Fewer offerable results than this and the kit says how to look further.
18
+ *
19
+ * Three is the point below which a kit stops being a starting point. An agent
20
+ * that reads a near-empty kit does not conclude "my wording was wrong" — it
21
+ * concludes the package has nothing and falls back on its own memory of what
22
+ * Astryx contains, which is exactly the failure `build` exists to prevent.
23
+ */
24
+ const THIN_KIT = 3;
25
+
26
+ /**
27
+ * The kit for a request. `blocks` names the blocks to list, best first: a
28
+ * block build names itself keeps build's entry, another keeps search's own
29
+ * entry (its real score and reason), a name search did not return is
30
+ * dropped, and the kit never lists more blocks than build's own. Blocks of
31
+ * the same name from two packages are both kept.
32
+ *
33
+ * @param {import('./signals.mjs').KitSignals} signals
34
+ * @param {string[]} [blocks] block names; build's own when omitted
35
+ * @param {Map<string, import('../../search/search.type.mjs').SearchResultEntry>} [picked]
36
+ * the block picker's own entry (its real score and reason) for each named
37
+ * block search did not return
38
+ * @returns {import('../build.type.mjs').BuildKitResponse}
39
+ */
40
+ export function kitAnswer(
41
+ signals,
42
+ blocks = signals.kitBlocks,
43
+ picked = new Map(),
44
+ ) {
45
+ // Entries by name, in build's order: two packages can ship a block with the
46
+ // same name, and each name in `blocks` takes the next entry of that name, so
47
+ // both stay listed.
48
+ /** @type {Map<string, import('../build.type.mjs').BuildKitResponse['data']['blocks']>} */
49
+ const own = new Map();
50
+ for (const b of signals.blocks)
51
+ own.set(b.name, [...(own.get(b.name) ?? []), b]);
52
+ /** @type {Set<string>} */
53
+ const added = new Set();
54
+ const named = blocks
55
+ .flatMap(name => {
56
+ const entry = own.get(name)?.shift();
57
+ if (entry) return [entry];
58
+ // A block build does not name itself keeps search's own entry, once;
59
+ // one search did not return keeps the picker's entry.
60
+ const found =
61
+ own.has(name) || added.has(name)
62
+ ? undefined
63
+ : (signals.searchedEntries.get(name) ?? picked.get(name));
64
+ if (!found) return [];
65
+ added.add(name);
66
+ return [found];
67
+ })
68
+ .slice(0, signals.blocks.length);
69
+
70
+ // What to try when the kit comes back thin. Keyword search over a design
71
+ // system misses in a predictable way — the reader's words and the package's
72
+ // often do not overlap — so name the two commands that browse rather than
73
+ // search, and say plainly that this is not semantic matching.
74
+ //
75
+ // STRUCTURED, not prose: `commands` are bare subcommands, because the API
76
+ // cannot know how the caller invokes the CLI. Baking `astryx component
77
+ // --list` into the text hands a pnpm-workspace reader a command that does
78
+ // not resolve — the same defect `getCliInvocation` exists to prevent, and
79
+ // the renderer applies it. A JSON caller gets the parts, not a sentence.
80
+ const hint =
81
+ signals.pages.length + named.length + signals.domain.length < THIN_KIT
82
+ ? {
83
+ reason:
84
+ 'Few matches. This is keyword search, not semantic — try other wordings.',
85
+ commands: ['component --list', 'template --list'],
86
+ }
87
+ : undefined;
88
+
89
+ const answer = (/** @type {typeof named} */ list) => ({
90
+ type: /** @type {const} */ ('build.kit'),
91
+ data: {
92
+ query: signals.query,
93
+ // Distinguishes "search found nothing" from a weak-but-non-empty result
94
+ // set. Either way the kit still names a template to start from.
95
+ hasResults: signals.matchCount > 0,
96
+ matchCount: signals.matchCount,
97
+ directMatch: signals.directMatch,
98
+ start: signals.start,
99
+ pages: signals.pages,
100
+ blocks: list,
101
+ domain: signals.domain,
102
+ frame: FRAME,
103
+ foundation: FOUNDATION,
104
+ hint,
105
+ },
106
+ });
107
+
108
+ // An added block must not make the answer longer than build's own, as JSON
109
+ // or as text: trim the added blocks' descriptions, never which blocks are
110
+ // listed.
111
+ const fitted = fitDescriptions(named, signals.blocks, {
112
+ json: list => bytes(answer(list)),
113
+ text: textSize,
114
+ });
115
+ return answer(fitted);
116
+ }
117
+
118
+ /** @param {unknown} value */
119
+ const bytes = value => Buffer.byteLength(JSON.stringify(value));
120
+
121
+ /**
122
+ * What the blocks add to the text answer, which prints each block's name,
123
+ * package, and the first sentence of its description.
124
+ * @param {{name: string, package?: string, description?: string}[]} list
125
+ */
126
+ const textSize = list =>
127
+ list.reduce(
128
+ (n, b) =>
129
+ n +
130
+ Buffer.byteLength(
131
+ `${b.name}${b.package ?? ''}${firstSentence(b.description ?? '')}`,
132
+ ),
133
+ 0,
134
+ );
135
+
136
+ /** An added block keeps at least this much of its description. */
137
+ const MIN_DESCRIPTION = 24;
138
+
139
+ /**
140
+ * A description cut to about `keep` characters (never fewer than
141
+ * {@link MIN_DESCRIPTION}) at a word boundary, with an ellipsis. Never empty:
142
+ * a description already that short is kept whole.
143
+ * @param {string} description
144
+ * @param {number} keep
145
+ */
146
+ function cutTo(description, keep) {
147
+ const room = Math.max(keep, MIN_DESCRIPTION);
148
+ if (description.length <= room) return description;
149
+ const cut = description.slice(0, room);
150
+ const at = cut.lastIndexOf(' ');
151
+ return `${(at > 0 ? cut.slice(0, at) : cut).trimEnd()}…`;
152
+ }
153
+
154
+ /**
155
+ * The listed blocks with the added blocks' descriptions shortened until
156
+ * neither the JSON nor the text answer is longer than with build's own
157
+ * blocks, or every added description is as short as it may get. A
158
+ * description is never emptied, and build's own entries never change.
159
+ * @template {{name: string, package?: string, description?: string}} B
160
+ * @param {B[]} list
161
+ * @param {B[]} own build's own entries
162
+ * @param {{json: (list: B[]) => number, text: (list: B[]) => number}} size
163
+ * @returns {B[]}
164
+ */
165
+ function fitDescriptions(list, own, size) {
166
+ const limit = {json: size.json(own), text: size.text(own)};
167
+ let out = list;
168
+ /** The bytes over each limit; 0 when within. */
169
+ const over = (/** @type {B[]} */ l) => ({
170
+ text: Math.max(0, size.text(l) - limit.text),
171
+ json: Math.max(0, size.json(l) - limit.json),
172
+ });
173
+ // The last added block first, each cut by what is still over and never
174
+ // below MIN_DESCRIPTION; when one is as short as it may get, the next one
175
+ // up is cut, and passes repeat while any cut still helps.
176
+ for (let changed = true; changed;) {
177
+ changed = false;
178
+ for (let k = out.length - 1; k >= 0; k--) {
179
+ const o = over(out);
180
+ if (o.text === 0 && o.json === 0) return out;
181
+ const b = out[k];
182
+ if (own.includes(b) || !b.description) continue;
183
+ const first = firstSentence(b.description);
184
+ const keep = Math.min(
185
+ o.text > 0 ? first.length - o.text - 1 : b.description.length,
186
+ o.json > 0 ? b.description.length - o.json - 1 : b.description.length,
187
+ );
188
+ const description = cutTo(b.description, keep);
189
+ if (description.length >= b.description.length) continue;
190
+ out = out.map((x, i) => (i === k ? {...x, description} : x));
191
+ changed = true;
192
+ }
193
+ }
194
+ return out;
195
+ }
@@ -0,0 +1,108 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ import {describe, it, expect} from 'vitest';
4
+ import {kitAnswer} from './answer.mjs';
5
+
6
+ /**
7
+ * @param {any[]} blocks
8
+ * @param {any[]} [searched] blocks search returned that build did not name
9
+ */
10
+ const signals = (blocks, searched = []) =>
11
+ /** @type {any} */ ({
12
+ query: 'q',
13
+ matchCount: blocks.length,
14
+ directMatch: false,
15
+ start: null,
16
+ pages: [],
17
+ blocks,
18
+ kitBlocks: blocks.map(b => b.name),
19
+ domain: [],
20
+ searchedEntries: new Map(searched.map(b => [b.name, b])),
21
+ });
22
+
23
+ describe('kitAnswer', () => {
24
+ const a = {name: 'Hero', package: '@a/one', score: 90, reason: 'name'};
25
+ const b = {name: 'Hero', package: '@b/two', score: 80, reason: 'name'};
26
+ const c = {name: 'Footer', package: '@a/one', score: 70, reason: 'keyword'};
27
+
28
+ it('keeps blocks of the same name from two packages', () => {
29
+ const kit = kitAnswer(signals([a, b, c]));
30
+ expect(kit.data.blocks).toEqual([a, b, c]);
31
+ });
32
+
33
+ it('keeps both when the picker re-orders them', () => {
34
+ const kit = kitAnswer(signals([a, b, c]), ['Footer', 'Hero', 'Hero']);
35
+ expect(kit.data.blocks).toEqual([c, a, b]);
36
+ });
37
+
38
+ it('never lists a block neither build nor search gave, or more than build gave', () => {
39
+ const kit = kitAnswer(signals([a, c]), ['Hero', 'Hero', 'Nav', 'Footer']);
40
+ expect(kit.data.blocks).toEqual([a, c]);
41
+ });
42
+
43
+ it('lists a block search returned with search’s own entry, within build’s count', () => {
44
+ const nav = {name: 'Nav', package: '@a/one', score: 60, reason: 'keyword'};
45
+ const kit = kitAnswer(signals([a, c], [nav]), [
46
+ 'Nav',
47
+ 'Nav',
48
+ 'Hero',
49
+ 'Footer',
50
+ ]);
51
+ expect(kit.data.blocks).toEqual([nav, a]);
52
+ });
53
+
54
+ it('trims an added block’s description so the answer is never longer than build’s own', () => {
55
+ const hero = {
56
+ ...a,
57
+ description: 'A wide hero with a title and two buttons.',
58
+ };
59
+ const foot = {...c, description: 'A footer with links in three columns.'};
60
+ const nav = {
61
+ name: 'Nav',
62
+ package: '@a/one',
63
+ score: 60,
64
+ reason: 'keyword',
65
+ description: 'word '.repeat(200).trim(),
66
+ };
67
+ const own = kitAnswer(signals([hero, foot]));
68
+ const kit = kitAnswer(signals([hero, foot], [nav]), ['Nav', 'Hero']);
69
+ expect(kit.data.blocks.map(b => b.name)).toEqual(['Nav', 'Hero']);
70
+ expect(kit.data.blocks[1]).toEqual(hero);
71
+ expect(Buffer.byteLength(JSON.stringify(kit))).toBeLessThanOrEqual(
72
+ Buffer.byteLength(JSON.stringify(own)),
73
+ );
74
+ expect(kit.data.blocks[0].description).toMatch(/…$/);
75
+ });
76
+ it('trims an added block’s first sentence so the text answer is never longer either', () => {
77
+ const long = ' More words follow here. '.repeat(20);
78
+ const hero = {...a, description: `A hero.${long}`};
79
+ const foot = {...c, description: `A footer.${long}`};
80
+ const nav = {
81
+ name: 'Nav',
82
+ package: '@a/one',
83
+ score: 60,
84
+ reason: 'keyword',
85
+ description:
86
+ 'A navigation bar with a logo, five links, a search box and a menu.',
87
+ };
88
+ const kit = kitAnswer(signals([hero, foot], [nav]), ['Nav', 'Hero']);
89
+ const d = kit.data.blocks[0].description;
90
+ expect(d).toMatch(/…$/);
91
+ expect(d.length).toBeLessThan(nav.description.length);
92
+ expect(nav.description.startsWith(d.slice(0, -1))).toBe(true);
93
+ expect(kit.data.blocks[1]).toEqual(hero);
94
+ });
95
+ it('never empties an added block’s description', () => {
96
+ const nav = {
97
+ name: 'Nav',
98
+ package: '@a/one',
99
+ score: 60,
100
+ reason: 'keyword',
101
+ description:
102
+ 'A navigation bar with a logo, five links, a search box and a menu.',
103
+ };
104
+ const kit = kitAnswer(signals([a, c], [nav]), ['Nav', 'Hero']);
105
+ expect(kit.data.blocks[0].name).toBe('Nav');
106
+ expect(kit.data.blocks[0].description.length).toBeGreaterThan(0);
107
+ });
108
+ });
@@ -0,0 +1,25 @@
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
+ * What an idea asks for (spec:AST-048/FR3): a whole `page`; a `part` of one,
6
+ * when its head noun names one of the system's components and it lists fewer
7
+ * than PAGE_PIECES pieces; or an `edit` of a page the builder already has.
8
+ *
9
+ * @param {string} query
10
+ * @param {PageTemplate[]} pages
11
+ * @param {ComponentWords[]} components
12
+ * @returns {IdeaKind}
13
+ */
14
+ export function ideaKind(query: string, pages: PageTemplate[], components: ComponentWords[]): IdeaKind;
15
+ /**
16
+ * Whether an idea asks for a new page (see `asksNewPage`), from the idea and
17
+ * the project's page templates.
18
+ * @param {string} query
19
+ * @param {PageTemplate[]} pages
20
+ * @returns {boolean}
21
+ */
22
+ export function asksForNewPage(query: string, pages: PageTemplate[]): boolean;
23
+ export type PageTemplate = import("./words.mjs").PageTemplate;
24
+ export type ComponentWords = import("./words.mjs").ComponentWords;
25
+ export type IdeaKind = import("./words.mjs").IdeaKind;
@@ -0,0 +1,170 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file Whether a build idea asks for a page, a part of a page, or a change to
5
+ * a page the builder already has.
6
+ *
7
+ * Parts (spec:AST-048/FR3). "A date range picker" asks for a part of a page,
8
+ * not a page, and the system's own components say what a part is: an idea
9
+ * whose head noun is a word of a component's name or keywords, Core's or an
10
+ * integration's, asks for that part, unless the noun is a family word ("a data
11
+ * table") or the idea lists a page's worth of pieces. Words search drops as
12
+ * stopwords ("page", "screen", "app", "view") name no component, so "a calendar
13
+ * page" asks for a page and "a calendar" for a part. A part starts from the
14
+ * base template of the family the idea names ("an empty state for a settings
15
+ * page"), else from the app shell. An idea that changes a page or part the
16
+ * builder already has starts from the app shell too: that page is the
17
+ * builder's to keep (FR9), and no template scaffolds it. "Existing" marks one
18
+ * when its phrase names a page family or a component ("add a column to the
19
+ * existing table"), unless the idea asks for a new page ("a new dashboard like
20
+ * the existing dashboard", "clone the existing dashboard as a new page"). A
21
+ * bare "existing" phrase that names a page ("existing reports dashboard with a
22
+ * date filter") reads as the builder's own page.
23
+ */
24
+
25
+ import {stem} from '../../search/search.mjs';
26
+ import {
27
+ HEAD_END,
28
+ CONTAINER_PHRASE,
29
+ PHRASE_END,
30
+ terms,
31
+ containersOf,
32
+ familyWordsOf,
33
+ } from './words.mjs';
34
+
35
+ /**
36
+ * @typedef {import('./words.mjs').PageTemplate} PageTemplate
37
+ * @typedef {import('./words.mjs').ComponentWords} ComponentWords
38
+ * @typedef {import('./words.mjs').IdeaKind} IdeaKind
39
+ */
40
+
41
+ /**
42
+ * How many listed pieces make an idea a page: a part is one thing with a detail
43
+ * or two ("a status pill with a tooltip"), while three pieces, two commas
44
+ * apart, describe a page.
45
+ */
46
+ const PAGE_PIECES = 3;
47
+
48
+ /**
49
+ * The word that marks a page or part the builder already has, when its phrase
50
+ * names one (see `changesExistingPage`).
51
+ */
52
+ const EXISTING = /\bexisting\b/i;
53
+
54
+ /**
55
+ * The word that marks an idea asking for a new page ("a new dashboard", "as a
56
+ * new page"), which is never a change to one the builder has.
57
+ */
58
+ const NEW = /\bnew\b/;
59
+
60
+ /**
61
+ * What an idea asks for (spec:AST-048/FR3): a whole `page`; a `part` of one,
62
+ * when its head noun names one of the system's components and it lists fewer
63
+ * than PAGE_PIECES pieces; or an `edit` of a page the builder already has.
64
+ *
65
+ * @param {string} query
66
+ * @param {PageTemplate[]} pages
67
+ * @param {ComponentWords[]} components
68
+ * @returns {IdeaKind}
69
+ */
70
+ export function ideaKind(query, pages, components) {
71
+ const text = String(query);
72
+ const familyWords = familyWordsOf(pages);
73
+ if (changesExistingPage(text, familyWords, components)) return 'edit';
74
+ // The head's last word, page words included: "calendar" is the noun of "a
75
+ // calendar", "page" the noun of "a calendar page". An overlay frame names
76
+ // where the thing lives, not the thing: "drafts" is the noun of "drafts in
77
+ // a modal".
78
+ const head = (text.split(HEAD_END)[0] ?? '').replace(CONTAINER_PHRASE, m =>
79
+ containersOf(m).size > 0 ? ' ' : m,
80
+ );
81
+ const words = (head.toLowerCase().match(/[a-z0-9]+/g) ?? []).filter(
82
+ w => w.length >= 2,
83
+ );
84
+ const noun = stem(words[words.length - 1] ?? '');
85
+ if (familyWords.has(noun)) return 'page';
86
+ const pieces = (text.match(/,/g) ?? []).length + 1;
87
+ if (pieces >= PAGE_PIECES) return 'page';
88
+ return components.some(c => componentTerms(c).includes(noun))
89
+ ? 'part'
90
+ : 'page';
91
+ }
92
+
93
+ /**
94
+ * Whether an idea changes a page or part the builder already has: "existing"
95
+ * in the same phrase as a word that names a family of page templates or one of
96
+ * the system's components ("the existing incidents table", "the existing
97
+ * banner"). A new page "inspired by the existing one", or "existing users" on a
98
+ * new page, names neither, and an idea that asks for a new page is no change
99
+ * whatever it names.
100
+ * @param {string} text
101
+ * @param {Map<string, string>} familyWords
102
+ * @param {ComponentWords[]} components
103
+ * @returns {boolean}
104
+ */
105
+ function changesExistingPage(text, familyWords, components) {
106
+ const componentWords = new Set(components.flatMap(nameTerms));
107
+ const phrases = text.toLowerCase().split(PHRASE_END);
108
+ if (asksNewPage(phrases, familyWords)) return false;
109
+ return phrases.some(phrase => {
110
+ const at = phrase.search(EXISTING);
111
+ return (
112
+ at >= 0 &&
113
+ terms(phrase.slice(at)).some(
114
+ t => familyWords.has(t) || componentWords.has(t),
115
+ )
116
+ );
117
+ });
118
+ }
119
+
120
+ /**
121
+ * Whether an idea asks for a new page: "new" before a word that names a family
122
+ * of page templates ("a new dashboard"), or before only words search drops,
123
+ * such as "page" ("as a new page"). "A new column" asks for a part.
124
+ * @param {string[]} phrases
125
+ * @param {Map<string, string>} familyWords
126
+ * @returns {boolean}
127
+ */
128
+ function asksNewPage(phrases, familyWords) {
129
+ return phrases.some(phrase => {
130
+ const at = phrase.search(NEW);
131
+ if (at < 0) return false;
132
+ const after = terms(phrase.slice(at + 'new'.length));
133
+ return after.length === 0 || familyWords.has(after[0]);
134
+ });
135
+ }
136
+
137
+ /**
138
+ * Whether an idea asks for a new page (see `asksNewPage`), from the idea and
139
+ * the project's page templates.
140
+ * @param {string} query
141
+ * @param {PageTemplate[]} pages
142
+ * @returns {boolean}
143
+ */
144
+ export function asksForNewPage(query, pages) {
145
+ return asksNewPage(
146
+ String(query).toLowerCase().split(PHRASE_END),
147
+ familyWordsOf(pages),
148
+ );
149
+ }
150
+
151
+ /**
152
+ * The words of a component's name: "DateRangeInput" is date, range, input.
153
+ * @param {ComponentWords} component
154
+ * @returns {string[]}
155
+ */
156
+ function nameTerms(component) {
157
+ return terms(component.name.replace(/([a-z0-9])([A-Z])/g, '$1 $2'));
158
+ }
159
+
160
+ /**
161
+ * The terms a component answers to: the words of its name and of its keywords.
162
+ * @param {ComponentWords} component
163
+ * @returns {string[]}
164
+ */
165
+ function componentTerms(component) {
166
+ return [
167
+ ...nameTerms(component),
168
+ ...component.keywords.flatMap(keyword => terms(keyword)),
169
+ ];
170
+ }
@@ -2,7 +2,8 @@
2
2
  // DO NOT EDIT — run `pnpm sync:api-types` to regenerate.
3
3
 
4
4
  /**
5
- * The page template to start from, and the kit around it.
5
+ * The page template to start from, and the kit around it, with the blocks
6
+ * build names itself.
6
7
  *
7
8
  * @param {string} query what you're building (e.g. "analytics dashboard")
8
9
  * @param {{cwd?: string, type?: import('../../search/search.type.mjs').SearchDomain, limit?: number}} [options]
@@ -13,6 +14,3 @@ export function buildKit(query: string, options?: {
13
14
  type?: import("../../search/search.type.mjs").SearchDomain;
14
15
  limit?: number;
15
16
  }): Promise<import("../build.type.mjs").BuildKitResponse>;
16
- export type SearchResultEntry = import("../../search/search.type.mjs").SearchResultEntry;
17
- export type BuildStart = import("../build.type.mjs").BuildStart;
18
- export type PageTemplate = import("../_adapter.mjs").PageTemplate;