@astryxdesign/cli 0.7.2 → 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 (373) hide show
  1. package/README.md +104 -71
  2. package/api/build/_adapter.d.mts +58 -0
  3. package/api/build/_adapter.mjs +127 -3
  4. package/api/build/blocks/blocks.d.mts +92 -0
  5. package/api/build/blocks/blocks.mjs +528 -0
  6. package/api/build/blocks/blocks.test.mjs +238 -0
  7. package/api/build/blocks/blocks.weights.json +1 -0
  8. package/api/build/build.mjs +25 -6
  9. package/api/build/build.type.mjs +1 -1
  10. package/api/build/kit/answer.d.mts +18 -0
  11. package/api/build/kit/answer.mjs +195 -0
  12. package/api/build/kit/answer.test.mjs +108 -0
  13. package/api/build/kit/kind.d.mts +25 -0
  14. package/api/build/kit/kind.mjs +170 -0
  15. package/api/build/kit/kit.d.mts +2 -4
  16. package/api/build/kit/kit.mjs +8 -398
  17. package/api/build/kit/rank.d.mts +3 -32
  18. package/api/build/kit/rank.mjs +25 -342
  19. package/api/build/kit/rank.test.mjs +2 -1
  20. package/api/build/kit/signals.d.mts +79 -0
  21. package/api/build/kit/signals.mjs +295 -0
  22. package/api/build/kit/start.d.mts +32 -0
  23. package/api/build/kit/start.mjs +163 -0
  24. package/api/build/kit/words.d.mts +72 -0
  25. package/api/build/kit/words.mjs +202 -0
  26. package/api/build/tree.d.mts +20 -0
  27. package/api/build/tree.mjs +53 -0
  28. package/api/build/tree.test.mjs +185 -0
  29. package/api/build/tree.weights.json +1 -0
  30. package/api/component/_adapter.mjs +39 -5
  31. package/api/component/component-replacement.test.mjs +1 -0
  32. package/api/component/component.mjs +17 -3
  33. package/api/component/component.test.mjs +15 -0
  34. package/api/component/doc-links.test.mjs +2 -2
  35. package/api/discover/_adapter.d.mts +1 -2
  36. package/api/discover/_adapter.mjs +42 -17
  37. package/api/discover/_adapter.test.mjs +42 -0
  38. package/api/discover/discover.mjs +0 -1
  39. package/api/docs/_adapter.d.mts +2 -2
  40. package/api/docs/_adapter.mjs +82 -23
  41. package/api/docs/docs-homes.test.mjs +127 -0
  42. package/api/docs/docs.doc.mjs +3 -3
  43. package/api/docs/docs.test.mjs +35 -19
  44. package/api/docs/integration-tree.test.mjs +20 -20
  45. package/api/docs/integrationDocs.test.mjs +1 -1
  46. package/api/docs/namespace-section.test.mjs +6 -6
  47. package/api/docs/reference-blocks.test.mjs +2 -2
  48. package/api/doctor/_adapter.d.mts +33 -13
  49. package/api/doctor/_adapter.mjs +55 -25
  50. package/api/doctor/doctor.d.mts +23 -5
  51. package/api/doctor/doctor.mjs +183 -40
  52. package/api/doctor/doctor.test.mjs +95 -12
  53. package/api/hook/hook.mjs +1 -1
  54. package/api/init/init.doc.mjs +20 -6
  55. package/api/init/init.test.mjs +18 -2
  56. package/api/init/init.type.d.mts +3 -3
  57. package/api/init/init.type.mjs +3 -3
  58. package/api/init/remove/remove.mjs +17 -4
  59. package/api/init/remove/remove.test.mjs +114 -2
  60. package/api/init/run/run.mjs +69 -6
  61. package/api/integration/_adapter.d.mts +8 -0
  62. package/api/integration/_adapter.mjs +21 -1
  63. package/api/integration/authoring-checks.mjs +83 -9
  64. package/api/integration/authoring-checks.test.mjs +220 -0
  65. package/api/integration/pack-check.mjs +123 -4
  66. package/api/integration/pack-check.test.mjs +87 -0
  67. package/api/integration/validate-integration-case-disk.test.mjs +111 -0
  68. package/api/integration/validate-integration-fixes.test.mjs +6 -5
  69. package/api/integration/validate-integration-gaps.test.mjs +1975 -0
  70. package/api/integration/validate-integration.d.mts +15 -2
  71. package/api/integration/validate-integration.mjs +298 -39
  72. package/api/integration/validate-integration.type.d.mts +90 -1
  73. package/api/integration/validate-integration.type.mjs +67 -2
  74. package/api/integration/validateIntegration.doc.mjs +1 -1
  75. package/api/search/ORDERING.md +28 -0
  76. package/api/search/_adapter.d.mts +82 -2
  77. package/api/search/_adapter.mjs +157 -10
  78. package/api/search/_adapter.test.mjs +173 -0
  79. package/api/search/_candidate-score.d.mts +40 -0
  80. package/api/search/_candidate-score.mjs +238 -0
  81. package/api/search/_cards.json +6098 -0
  82. package/api/search/_compound.d.mts +50 -0
  83. package/api/search/_compound.mjs +170 -0
  84. package/api/search/_doc-searcher.d.mts +4 -0
  85. package/api/search/_doc-searcher.mjs +23 -0
  86. package/api/search/_doc-searcher.test.mjs +36 -0
  87. package/api/search/_doc-searcher.weights.json +1 -0
  88. package/api/search/_doc-text.d.mts +30 -0
  89. package/api/search/_doc-text.mjs +87 -0
  90. package/api/search/_entries.d.mts +63 -0
  91. package/api/search/_entries.mjs +232 -0
  92. package/api/search/_entries.test.mjs +48 -0
  93. package/api/search/_features.d.mts +35 -0
  94. package/api/search/_features.mjs +155 -0
  95. package/api/search/_gather-components.d.mts +26 -0
  96. package/api/search/_gather-components.mjs +284 -0
  97. package/api/search/_gather-docs.d.mts +20 -0
  98. package/api/search/_gather-docs.mjs +254 -0
  99. package/api/search/_gather-hooks.d.mts +12 -0
  100. package/api/search/_gather-hooks.mjs +52 -0
  101. package/api/search/_gather-templates.d.mts +25 -0
  102. package/api/search/_gather-templates.mjs +107 -0
  103. package/api/search/_lexical.d.mts +135 -0
  104. package/api/search/_lexical.mjs +351 -0
  105. package/api/search/_main-searcher.d.mts +19 -0
  106. package/api/search/_main-searcher.mjs +115 -0
  107. package/api/search/_main-searcher.test.mjs +106 -0
  108. package/api/search/_main-searcher.weights.json +1 -0
  109. package/api/search/_module-doc.d.mts +32 -0
  110. package/api/search/_module-doc.mjs +78 -0
  111. package/api/search/_order.d.mts +32 -0
  112. package/api/search/_order.mjs +162 -0
  113. package/api/search/_order.test.mjs +72 -0
  114. package/api/search/_priority.d.mts +50 -0
  115. package/api/search/_priority.mjs +139 -0
  116. package/api/search/_query-words.d.mts +25 -0
  117. package/api/search/_query-words.mjs +92 -0
  118. package/api/search/_query.d.mts +65 -0
  119. package/api/search/_query.mjs +176 -0
  120. package/api/search/_result.d.mts +97 -0
  121. package/api/search/_result.mjs +150 -0
  122. package/api/search/_score.d.mts +60 -0
  123. package/api/search/_score.mjs +283 -0
  124. package/api/search/_synonyms.d.mts +21 -0
  125. package/api/search/_synonyms.mjs +67 -0
  126. package/api/search/_template-searcher.d.mts +4 -0
  127. package/api/search/_template-searcher.mjs +23 -0
  128. package/api/search/_template-searcher.test.mjs +40 -0
  129. package/api/search/_template-searcher.weights.json +1 -0
  130. package/api/search/_titles.d.mts +33 -0
  131. package/api/search/_titles.mjs +65 -0
  132. package/api/search/_words.d.mts +64 -0
  133. package/api/search/_words.mjs +157 -0
  134. package/api/search/search.d.mts +22 -305
  135. package/api/search/search.doc.mjs +8 -6
  136. package/api/search/search.mjs +56 -2482
  137. package/api/search/search.test.mjs +14 -14
  138. package/api/search/search.type.d.mts +6 -1
  139. package/api/search/search.type.mjs +6 -1
  140. package/api/search/tree.d.mts +15 -0
  141. package/api/search/tree.mjs +40 -0
  142. package/api/search/tree.test.mjs +66 -0
  143. package/api/search/tree.weights.json +1 -0
  144. package/api/template/template.mjs +5 -1
  145. package/api/theme/build/build.packed-old-core.test.mjs +1 -0
  146. package/api/upgrade/_adapter.d.mts +57 -9
  147. package/api/upgrade/_adapter.mjs +198 -28
  148. package/api/upgrade/registry/registry.d.mts +10 -4
  149. package/api/upgrade/registry/registry.mjs +33 -16
  150. package/api/upgrade/registry/registry.test.mjs +85 -0
  151. package/api/upgrade/run/run.d.mts +4 -2
  152. package/api/upgrade/run/run.mjs +13 -2
  153. package/api/upgrade/run/run.test.mjs +417 -3
  154. package/api/upgrade/upgrade.doc.mjs +10 -5
  155. package/api/upgrade/upgrade.mjs +13 -2
  156. package/api/upgrade/upgrade.test.mjs +194 -0
  157. package/api/upgrade/upgrade.type.d.mts +5 -3
  158. package/api/upgrade/upgrade.type.mjs +8 -6
  159. package/assets/codemods/transforms/v0.7.0/__tests__/validate-data-token-ownership.test.mjs +11 -0
  160. package/assets/codemods/transforms/v0.7.0/validate-data-token-ownership.mjs +3 -3
  161. package/assets/docs/author-a-theme.doc.mjs +2 -2
  162. package/assets/docs/is-my-code-good.doc.mjs +287 -0
  163. package/assets/docs/tree/add-a-component.doc.mjs +1 -1
  164. package/assets/docs/tree/add-a-theme.doc.mjs +1 -1
  165. package/assets/docs/tree/add-a-topic.doc.mjs +2 -2
  166. package/assets/docs/tree/agent-guidance.doc.mjs +1 -1
  167. package/assets/docs/tree/api.doc.mjs +6 -0
  168. package/assets/docs/tree/{integrations.doc.mjs → authoring.doc.mjs} +15 -6
  169. package/assets/docs/tree/block-template.doc.mjs +1 -1
  170. package/assets/docs/tree/build-the-template.doc.mjs +1 -1
  171. package/assets/docs/tree/building-blocks.doc.mjs +2 -2
  172. package/assets/docs/tree/check-the-props.doc.mjs +1 -1
  173. package/assets/docs/tree/check-your-docs.doc.mjs +2 -2
  174. package/assets/docs/tree/checks.doc.mjs +3 -3
  175. package/assets/docs/tree/ci-and-containers.doc.mjs +13 -0
  176. package/assets/docs/tree/cli-command.doc.mjs +1 -1
  177. package/assets/docs/tree/cli.doc.mjs +1 -1
  178. package/assets/docs/tree/codemods.doc.mjs +1 -1
  179. package/assets/docs/tree/component-family.doc.mjs +1 -1
  180. package/assets/docs/tree/component-imports.doc.mjs +1 -1
  181. package/assets/docs/tree/components.doc.mjs +1 -1
  182. package/assets/docs/tree/configuration.doc.mjs +1 -1
  183. package/assets/docs/tree/debug-and-gap-reports.doc.mjs +1 -1
  184. package/assets/docs/tree/define-the-theme.doc.mjs +1 -1
  185. package/assets/docs/tree/describe-the-component.doc.mjs +1 -1
  186. package/assets/docs/tree/docs.doc.mjs +1 -1
  187. package/assets/docs/tree/document-the-template.doc.mjs +1 -1
  188. package/assets/docs/tree/document-the-theme.doc.mjs +1 -1
  189. package/assets/docs/tree/export-template-assets.doc.mjs +1 -1
  190. package/assets/docs/tree/extend-or-replace.doc.mjs +1 -1
  191. package/assets/docs/{authoring.doc.mjs → tree/field-reference.doc.mjs} +4 -3
  192. package/assets/docs/tree/fonts-and-assets.doc.mjs +1 -1
  193. package/assets/docs/tree/generate-a-palette.doc.mjs +1 -1
  194. package/assets/docs/tree/global-integrations.doc.mjs +2 -2
  195. package/assets/docs/tree/grade-template-with-agent.doc.mjs +4 -4
  196. package/assets/docs/tree/help.doc.mjs +2 -2
  197. package/assets/docs/tree/host-entry.doc.mjs +128 -0
  198. package/assets/docs/tree/links.doc.mjs +1 -1
  199. package/assets/docs/tree/package-and-test.doc.mjs +1 -1
  200. package/assets/docs/tree/page-template.doc.mjs +1 -1
  201. package/assets/docs/tree/publishing.doc.mjs +1 -1
  202. package/assets/docs/tree/quick-start.doc.mjs +1 -1
  203. package/assets/docs/tree/replace-a-core-component.doc.mjs +1 -1
  204. package/assets/docs/tree/replace-a-core-template.doc.mjs +1 -1
  205. package/assets/docs/tree/sections-and-placement.doc.mjs +1 -1
  206. package/assets/docs/tree/see-it-in-an-app.doc.mjs +1 -1
  207. package/assets/docs/tree/ship.doc.mjs +2 -2
  208. package/assets/docs/tree/short-and-findable.doc.mjs +1 -1
  209. package/assets/docs/tree/single-component.doc.mjs +1 -1
  210. package/assets/docs/tree/start-a-template.doc.mjs +1 -1
  211. package/assets/docs/tree/subcomponent.doc.mjs +1 -1
  212. package/assets/docs/tree/template-assets.doc.mjs +1 -1
  213. package/assets/docs/tree/template-doc-overview.doc.mjs +2 -2
  214. package/assets/docs/tree/template-fonts.doc.mjs +1 -1
  215. package/assets/docs/tree/template-grading-rubric.doc.mjs +17 -38
  216. package/assets/docs/tree/template-icons.doc.mjs +1 -1
  217. package/assets/docs/tree/template-images-media.doc.mjs +1 -1
  218. package/assets/docs/tree/template-styles.doc.mjs +1 -1
  219. package/assets/docs/tree/templates.doc.mjs +1 -1
  220. package/assets/docs/tree/test-in-an-app.doc.mjs +1 -1
  221. package/assets/docs/tree/test-template-in-app.doc.mjs +1 -1
  222. package/assets/docs/tree/themes.doc.mjs +1 -1
  223. package/assets/docs/tree/tokens-data.doc.mjs +2 -2
  224. package/assets/docs/tree/troubleshooting.doc.mjs +1 -1
  225. package/assets/docs/tree/upgrading.doc.mjs +1 -1
  226. package/assets/docs/tree/use-a-theme-in-an-app.doc.mjs +1 -1
  227. package/assets/docs/tree/verify-packed-template.doc.mjs +1 -1
  228. package/assets/docs/tree/versioning.doc.mjs +5 -1
  229. package/assets/docs/tree/write-good-templates.doc.mjs +1 -1
  230. package/assets/docs/tree/write-the-template-file.doc.mjs +1 -1
  231. package/assets/docs/use-integrations.doc.mjs +120 -0
  232. package/assets/docs/working-with-ai.doc.mjs +6 -2
  233. package/assets/templates/themes/butter/butterTheme.ts +4 -2
  234. package/assets/templates/themes/stone/stoneTheme.ts +4 -2
  235. package/assets/templates/themes/y2k/y2kTheme.ts +4 -2
  236. package/authoring/debug/parse.d.mts +1 -1
  237. package/authoring/doctypes/schema/schema.doc.mjs +1 -1
  238. package/authoring/integration/integration.doc.mjs +1 -1
  239. package/authoring/integration/type.ts +1 -1
  240. package/clients/cli/bin/astryx.mjs +7 -78
  241. package/clients/cli/command-result-coverage.test.mjs +6 -5
  242. package/clients/cli/commands/build-theme.color-scheme.test.mjs +1 -1
  243. package/clients/cli/commands/{component/index.mjs → component.mjs} +37 -37
  244. package/clients/cli/commands/component.test.mjs +6 -6
  245. package/clients/cli/commands/docs.doc.mjs +2 -2
  246. package/clients/cli/commands/docs.mjs +1 -1
  247. package/clients/cli/commands/docs.test.mjs +14 -14
  248. package/clients/cli/commands/doctor-integration.test.mjs +49 -1
  249. package/clients/cli/commands/doctor.doc.mjs +1 -1
  250. package/clients/cli/commands/doctor.mjs +40 -0
  251. package/clients/cli/commands/doctor.test.mjs +65 -0
  252. package/clients/cli/commands/{hook/index.mjs → hook.mjs} +22 -22
  253. package/clients/cli/commands/import-hint-correctness.test.mjs +1 -1
  254. package/clients/cli/commands/init.behavior.test.mjs +230 -1
  255. package/clients/cli/commands/init.doc.mjs +28 -9
  256. package/clients/cli/commands/init.flag-help.test.mjs +1 -0
  257. package/clients/cli/commands/init.mjs +2 -2
  258. package/clients/cli/commands/integration-check.test.mjs +48 -0
  259. package/clients/cli/commands/integration.doc.mjs +1 -1
  260. package/clients/cli/commands/manifest.doc.mjs +1 -1
  261. package/clients/cli/commands/manifest.mjs +67 -0
  262. package/clients/cli/commands/outside-project.test.mjs +101 -1
  263. package/clients/cli/commands/postinstall.doc.mjs +23 -0
  264. package/clients/cli/commands/postinstall.mjs +31 -0
  265. package/clients/cli/commands/setup-nudge.test.mjs +78 -0
  266. package/clients/cli/commands/{build-theme.mjs → theme.mjs} +1 -1
  267. package/clients/cli/commands/upgrade.doc.mjs +4 -2
  268. package/clients/cli/commands/upgrade.mjs +9 -2
  269. package/clients/cli/commands/upgrade.subfolder-path.test.mjs +97 -0
  270. package/clients/cli/index.mjs +54 -94
  271. package/clients/cli/lib/component-format.mjs +1 -1
  272. package/clients/cli/lib/define-command.mjs +12 -7
  273. package/clients/cli/lib/exit-codes.test.mjs +5 -0
  274. package/clients/cli/lib/manifest.test.mjs +12 -0
  275. package/clients/cli/lib/welcome-box.mjs +50 -0
  276. package/clients/cli/run.mjs +108 -0
  277. package/foundation/agent-docs/agent-doc-state.d.mts +32 -7
  278. package/foundation/agent-docs/agent-doc-state.mjs +58 -9
  279. package/foundation/agent-docs/agent-docs.d.mts +100 -12
  280. package/foundation/agent-docs/agent-docs.mjs +1017 -105
  281. package/foundation/agent-docs/agent-docs.path-safety.test.mjs +1239 -17
  282. package/foundation/agent-docs/agent-docs.test.mjs +683 -39
  283. package/foundation/agent-docs/computer-agent-text.d.mts +39 -2
  284. package/foundation/agent-docs/computer-agent-text.mjs +135 -8
  285. package/foundation/agent-docs/computer-agent-text.test.mjs +99 -2
  286. package/foundation/config/project.mjs +20 -22
  287. package/foundation/config/project.test.mjs +56 -0
  288. package/foundation/discovery/authoring-self-docs.d.mts +7 -0
  289. package/foundation/discovery/authoring-self-docs.mjs +16 -4
  290. package/foundation/discovery/authoring-self-docs.test.mjs +15 -3
  291. package/foundation/discovery/authoring-surface.d.mts +1 -1
  292. package/foundation/discovery/authoring-surface.mjs +2 -2
  293. package/foundation/discovery/authoring-surface.test.mjs +1 -1
  294. package/foundation/discovery/cli-self-docs.d.mts +2 -1
  295. package/foundation/discovery/cli-self-docs.mjs +4 -3
  296. package/foundation/discovery/cli-self-docs.test.mjs +2 -2
  297. package/foundation/discovery/component-discovery.d.mts +37 -0
  298. package/foundation/discovery/component-discovery.mjs +80 -5
  299. package/foundation/discovery/component-loader.d.mts +1 -1
  300. package/foundation/discovery/docs-discovery.mjs +14 -1
  301. package/foundation/discovery/module-exports.d.mts +41 -0
  302. package/foundation/discovery/module-exports.mjs +253 -0
  303. package/foundation/discovery/runner-allowlist.d.mts +2 -4
  304. package/foundation/discovery/runner-allowlist.mjs +2 -4
  305. package/foundation/discovery/runner-commands.d.mts +77 -0
  306. package/foundation/discovery/runner-commands.mjs +294 -0
  307. package/foundation/discovery/runner-commands.test.mjs +128 -0
  308. package/foundation/discovery/stray-pointers.test.mjs +1 -1
  309. package/foundation/discovery/template-adapter.mjs +18 -1
  310. package/foundation/discovery/template-needs.mjs +1 -44
  311. package/foundation/discovery/theme-discovery.mjs +147 -3
  312. package/foundation/doc-compiler/doc-loads.test.mjs +33 -9
  313. package/foundation/doc-compiler/read.mjs +59 -1
  314. package/foundation/doc-compiler/read.test.mjs +11 -2
  315. package/foundation/doc-compiler/split-topic-keywords.test.mjs +3 -2
  316. package/foundation/doc-compiler/tree.d.mts +32 -6
  317. package/foundation/doc-compiler/tree.mjs +77 -43
  318. package/foundation/doc-compiler/tree.test.mjs +7 -7
  319. package/foundation/fs/paths.d.mts +70 -8
  320. package/foundation/fs/paths.mjs +556 -38
  321. package/foundation/fs/paths.test.mjs +430 -54
  322. package/foundation/fs/read-record.d.mts +18 -0
  323. package/foundation/fs/read-record.mjs +131 -0
  324. package/foundation/fs/read-record.test.mjs +77 -0
  325. package/foundation/integrations/autolink.d.mts +2 -1
  326. package/foundation/integrations/autolink.mjs +4 -13
  327. package/foundation/integrations/cli-peer-version.d.mts +36 -0
  328. package/foundation/integrations/cli-peer-version.mjs +132 -0
  329. package/foundation/integrations/cli-peer-version.test.mjs +354 -0
  330. package/foundation/integrations/computer-integrations.d.mts +6 -3
  331. package/foundation/integrations/computer-integrations.mjs +38 -9
  332. package/foundation/integrations/contribution-inventory.d.mts +15 -20
  333. package/foundation/integrations/contribution-inventory.mjs +41 -5
  334. package/foundation/integrations/exports-subpaths.d.mts +57 -0
  335. package/foundation/integrations/exports-subpaths.mjs +113 -0
  336. package/foundation/integrations/integrations.d.mts +27 -1
  337. package/foundation/integrations/integrations.mjs +61 -2
  338. package/foundation/integrations/public-imports.d.mts +118 -0
  339. package/foundation/integrations/public-imports.mjs +1769 -0
  340. package/foundation/integrations/public-imports.test.mjs +1793 -0
  341. package/foundation/integrations/validate-contributions.d.mts +115 -0
  342. package/foundation/integrations/validate-contributions.mjs +1168 -13
  343. package/foundation/release/cache.test.mjs +24 -21
  344. package/foundation/release/global-state.d.mts +8 -4
  345. package/foundation/release/global-state.mjs +4 -2
  346. package/foundation/release/handoff.d.mts +23 -4
  347. package/foundation/release/handoff.mjs +175 -8
  348. package/foundation/release/notices.d.mts +62 -8
  349. package/foundation/release/notices.mjs +136 -25
  350. package/foundation/release/notices.test.mjs +21 -0
  351. package/foundation/release/run-context.mjs +14 -0
  352. package/foundation/response/response-types.doc.mjs +1 -1
  353. package/foundation/route/route.d.mts +285 -0
  354. package/foundation/route/route.mjs +324 -0
  355. package/foundation/route/route.test.mjs +153 -0
  356. package/foundation/runtime/hosted-runtime.test.mjs +403 -0
  357. package/foundation/runtime/locked-versions.d.mts +32 -0
  358. package/foundation/runtime/locked-versions.mjs +65 -0
  359. package/foundation/runtime/package-root.d.mts +91 -0
  360. package/foundation/runtime/package-root.mjs +174 -0
  361. package/foundation/runtime/package-set.d.mts +62 -0
  362. package/foundation/runtime/package-set.mjs +130 -0
  363. package/foundation/runtime/package-set.test.mjs +432 -0
  364. package/foundation/text/string-utils.d.mts +2 -1
  365. package/foundation/text/string-utils.mjs +16 -5
  366. package/foundation/text/suggest-order.d.mts +72 -0
  367. package/foundation/text/suggest-order.mjs +363 -0
  368. package/foundation/text/suggest-order.test.mjs +259 -0
  369. package/host/door-conformance.test.mjs +274 -0
  370. package/host/index.d.ts +116 -0
  371. package/host/index.mjs +295 -0
  372. package/host/index.test.mjs +302 -0
  373. package/package.json +14 -9
@@ -0,0 +1,302 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file The host entry, `@astryxdesign/cli/host` (spec AST-081 FR1): every
5
+ * input is checked before anything runs, one run per process, a run matches
6
+ * the bin's, printed commands start with the host's command name, and a
7
+ * project CLI the host declined is never run (FR2, FR9).
8
+ */
9
+
10
+ import {describe, it, expect, afterEach} from 'vitest';
11
+ import {spawnSync} from 'node:child_process';
12
+ import * as fs from 'node:fs';
13
+ import * as path from 'node:path';
14
+ import {fileURLToPath} from 'node:url';
15
+ import {
16
+ cleanupFixtures,
17
+ installCore,
18
+ installStandInCli,
19
+ project,
20
+ tempDir,
21
+ } from '../test-utils/release-fixtures.mjs';
22
+ import {runHostedCli} from './index.mjs';
23
+
24
+ const HOST = fileURLToPath(new URL('./index.mjs', import.meta.url));
25
+ const BIN = fileURLToPath(
26
+ new URL('../clients/cli/bin/astryx.mjs', import.meta.url),
27
+ );
28
+ const SELF_VERSION = JSON.parse(
29
+ fs.readFileSync(
30
+ fileURLToPath(new URL('../package.json', import.meta.url)),
31
+ 'utf-8',
32
+ ),
33
+ ).version;
34
+
35
+ afterEach(cleanupFixtures);
36
+
37
+ /**
38
+ * A private home and cache, offline, and none of the test runner's package
39
+ * manager or CI settings.
40
+ * @returns {Record<string, string>}
41
+ */
42
+ function cleanEnv() {
43
+ const home = tempDir('home');
44
+ const cache = tempDir('cache');
45
+ return {
46
+ ...Object.fromEntries(
47
+ Object.entries(process.env).filter(
48
+ ([key]) => !/^(?:npm_|CI$|NO_UPDATE_NOTIFIER$)/iu.test(key),
49
+ ),
50
+ ),
51
+ HOME: home,
52
+ USERPROFILE: home,
53
+ XDG_CACHE_HOME: cache,
54
+ LOCALAPPDATA: cache,
55
+ XDG_CONFIG_HOME: path.join(home, '.config'),
56
+ APPDATA: path.join(home, 'AppData', 'Roaming'),
57
+ NO_COLOR: '1',
58
+ npm_config_registry: 'http://127.0.0.1:9',
59
+ };
60
+ }
61
+
62
+ /**
63
+ * Start a host process that calls `runHostedCli` with `options` (once, or
64
+ * twice with `{twice: true}`) and exits with the returned status.
65
+ * @param {Record<string, unknown>} options
66
+ * @param {{twice?: boolean, env?: Record<string, string>}} [extra]
67
+ */
68
+ function host(options, extra = {}) {
69
+ const script = `
70
+ const {runHostedCli} = await import(${JSON.stringify(HOST)});
71
+ const options = ${JSON.stringify(options)};
72
+ ${
73
+ extra.twice
74
+ ? `const first = runHostedCli(options);
75
+ try { await runHostedCli(options); } catch (err) { process.stderr.write('second: ' + err.message + '\\n'); }
76
+ const {status} = await first;`
77
+ : `const {status} = await runHostedCli(options);`
78
+ }
79
+ process.exitCode = status;
80
+ `;
81
+ const result = spawnSync(
82
+ process.execPath,
83
+ ['--input-type=module', '-e', script],
84
+ {
85
+ cwd: tempDir('host-cwd'),
86
+ encoding: 'utf-8',
87
+ env: extra.env ?? cleanEnv(),
88
+ timeout: 60_000,
89
+ },
90
+ );
91
+ return {status: result.status, stdout: result.stdout, stderr: result.stderr};
92
+ }
93
+
94
+ /**
95
+ * Run the bin itself in `cwd`.
96
+ * @param {string} cwd
97
+ * @param {string[]} args
98
+ * @param {Record<string, string>} env
99
+ */
100
+ function bin(cwd, args, env) {
101
+ const result = spawnSync(process.execPath, [BIN, ...args], {
102
+ cwd,
103
+ encoding: 'utf-8',
104
+ env,
105
+ timeout: 60_000,
106
+ });
107
+ return {status: result.status, stdout: result.stdout, stderr: result.stderr};
108
+ }
109
+
110
+ describe('inputs', () => {
111
+ it('rejects every invalid input before running anything', async () => {
112
+ const before = process.cwd();
113
+ const cases = [
114
+ [null, /options must be an object/u],
115
+ [['--version'], /options must be an object/u],
116
+ [{handlers: {}}, /unknown option "handlers"/u],
117
+ [
118
+ {projectCliAlreadyHandled: true},
119
+ /unknown option "projectCliAlreadyHandled"/u,
120
+ ],
121
+ [{roots: '/tmp'}, /roots must be an array of folder paths/u],
122
+ [{roots: ['']}, /roots must be an array of folder paths/u],
123
+ [
124
+ {roots: [path.join(tempDir(), 'missing')]},
125
+ /roots names a path that is not a folder/u,
126
+ ],
127
+ [
128
+ {integrations: 'acme'},
129
+ /integrations must be an array of package names/u,
130
+ ],
131
+ [
132
+ {integrations: ['Acme Widgets']},
133
+ /integrations must be an array of package names/u,
134
+ ],
135
+ [
136
+ {integrations: ['../acme']},
137
+ /integrations must be an array of package names/u,
138
+ ],
139
+ [
140
+ {discoverSources: [{}]},
141
+ /discoverSources must be an array of functions/u,
142
+ ],
143
+ [{argv: '--version'}, /argv must be an array of strings/u],
144
+ [{argv: [1]}, /argv must be an array of strings/u],
145
+ [{cwd: 7}, /cwd must be a folder path/u],
146
+ [{cwd: path.join(tempDir(), 'missing')}, /cwd is not a folder/u],
147
+ [{cliCommand: ''}, /cliCommand/u],
148
+ [{cliCommand: ' acme astryx'}, /cliCommand/u],
149
+ [{cliCommand: 'acme\nastryx'}, /cliCommand/u],
150
+ [{cliCommand: 'a'.repeat(121)}, /cliCommand/u],
151
+ [{cliCommand: 'acme ASTRYX:START'}, /cliCommand/u],
152
+ [
153
+ {declinedProjectCli: ''},
154
+ /declinedProjectCli must be a non-blank single line/u,
155
+ ],
156
+ [
157
+ {declinedProjectCli: 'a\nb'},
158
+ /declinedProjectCli must be a non-blank single line/u,
159
+ ],
160
+ [
161
+ {declinedProjectCli: ' untrusted'},
162
+ /declinedProjectCli must be a non-blank single line/u,
163
+ ],
164
+ [
165
+ {declinedProjectCli: 'x'.repeat(121)},
166
+ /declinedProjectCli must be a non-blank single line/u,
167
+ ],
168
+ [
169
+ {declinedProjectCli: 3},
170
+ /declinedProjectCli must be a non-blank single line/u,
171
+ ],
172
+ ];
173
+ for (const [options, message] of cases) {
174
+ await expect(runHostedCli(/** @type {any} */ (options))).rejects.toThrow(
175
+ message,
176
+ );
177
+ }
178
+ await expect(
179
+ runHostedCli(/** @type {any} */ ({argv: 'x'})),
180
+ ).rejects.toBeInstanceOf(TypeError);
181
+ expect(process.cwd()).toBe(before);
182
+ });
183
+ });
184
+
185
+ describe('one run per process', () => {
186
+ it('fails a second call before it runs anything, and the first run completes', () => {
187
+ const empty = tempDir('empty');
188
+ const result = host({argv: ['--version'], cwd: empty}, {twice: true});
189
+ expect(result.status).toBe(0);
190
+ expect(result.stdout.trim()).toBe(SELF_VERSION);
191
+ expect(result.stderr).toMatch(
192
+ /second: runHostedCli: a run already started in this process/u,
193
+ );
194
+ });
195
+ });
196
+
197
+ describe('a hosted run matches the bin', () => {
198
+ it('gives the same exit status, output, and standard-error line', () => {
199
+ const empty = tempDir('empty');
200
+ const env = cleanEnv();
201
+ for (const args of [
202
+ ['--version'],
203
+ ['component', 'Buttn'],
204
+ ['docs', '--json'],
205
+ ]) {
206
+ const direct = bin(empty, args, env);
207
+ const hosted = host({argv: args, cwd: empty}, {env});
208
+ expect(hosted.status).toBe(direct.status);
209
+ expect(hosted.stdout).toBe(direct.stdout);
210
+ expect(hosted.stderr).toBe(direct.stderr);
211
+ }
212
+ });
213
+ });
214
+
215
+ describe('the command name', () => {
216
+ it('starts the commands help prints with the host name', () => {
217
+ const empty = tempDir('empty');
218
+ const hosted = host({
219
+ argv: ['--help'],
220
+ cwd: empty,
221
+ cliCommand: 'acme astryx',
222
+ });
223
+ expect(hosted.status).toBe(0);
224
+ expect(hosted.stdout).toContain('See acme astryx docs global.');
225
+ const direct = host({argv: ['--help'], cwd: empty});
226
+ expect(direct.stdout).not.toContain('acme astryx');
227
+ });
228
+ });
229
+
230
+ describe('a project CLI the host declined', () => {
231
+ /** A project whose own CLI is a stand-in that reports when it runs. */
232
+ function projectWithCli(version, core = version) {
233
+ const root = project(tempDir(), {
234
+ '@astryxdesign/core': core,
235
+ '@astryxdesign/cli': version,
236
+ });
237
+ installCore(root, core);
238
+ installStandInCli(root, version);
239
+ return root;
240
+ }
241
+
242
+ it('without a reason, the run is handed to the project CLI', () => {
243
+ const root = projectWithCli('0.6.8');
244
+ const result = host({argv: ['--version'], cwd: root});
245
+ expect(result.status).toBe(0);
246
+ expect(result.stdout.trim()).toBe('0.6.8');
247
+ });
248
+
249
+ it.each(['cannot-start', 'untrusted'])(
250
+ '%s: another release answers itself, with the fallback warning naming the reason',
251
+ reason => {
252
+ const root = projectWithCli('0.6.8');
253
+ const text = host({
254
+ argv: ['--version'],
255
+ cwd: root,
256
+ declinedProjectCli: reason,
257
+ });
258
+ expect(text.status).toBe(0);
259
+ expect(text.stdout.trim()).toBe(SELF_VERSION);
260
+ expect(text.stderr).not.toContain('stand-in');
261
+ expect(text.stderr.trim()).toBe(
262
+ `astryx: could not get Astryx 0.6.8 to match this project's Core (project CLI skipped: ${reason}); answering with CLI ${SELF_VERSION} instead`,
263
+ );
264
+ const json = host({
265
+ argv: ['docs', '--json'],
266
+ cwd: root,
267
+ declinedProjectCli: reason,
268
+ });
269
+ expect(json.status).toBe(0);
270
+ expect(json.stderr).toBe('');
271
+ expect(JSON.parse(json.stdout).meta.answeredBy.copy).toBe('fallback');
272
+ },
273
+ );
274
+
275
+ it("the declined CLI's own release answers in its place, named as that CLI's release", () => {
276
+ // The project's CLI is this release while its Core is another, so the
277
+ // answer is the project CLI's release, not the release matched to Core.
278
+ const root = projectWithCli(SELF_VERSION, '0.6.8');
279
+ const json = host({
280
+ argv: ['docs', '--json'],
281
+ cwd: root,
282
+ declinedProjectCli: 'untrusted',
283
+ });
284
+ expect(json.status).toBe(0);
285
+ expect(json.stderr).toBe('');
286
+ expect(JSON.parse(json.stdout).meta.answeredBy).toMatchObject({
287
+ cli: SELF_VERSION,
288
+ core: '0.6.8',
289
+ copy: 'project',
290
+ });
291
+ const text = host({
292
+ argv: ['--version'],
293
+ cwd: root,
294
+ declinedProjectCli: 'untrusted',
295
+ });
296
+ expect(text.status).toBe(0);
297
+ expect(text.stdout.trim()).toBe(SELF_VERSION);
298
+ expect(text.stderr.trim()).toBe(
299
+ `astryx: answered by CLI ${SELF_VERSION}, the release of this project's CLI, in its place (project CLI skipped: untrusted)`,
300
+ );
301
+ });
302
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@astryxdesign/cli",
3
- "version": "0.7.2",
3
+ "version": "0.7.3-canary.02f5fe4",
4
4
  "displayName": "CLI",
5
5
  "description": "Scaffold projects, browse templates, generate themes, and get agent-ready docs from the command line.",
6
6
  "author": "Meta Open Source",
@@ -42,6 +42,10 @@
42
42
  "types": "./api/index.d.mts",
43
43
  "import": "./api/index.mjs"
44
44
  },
45
+ "./host": {
46
+ "types": "./host/index.d.ts",
47
+ "import": "./host/index.mjs"
48
+ },
45
49
  "./authoring": {
46
50
  "types": "./authoring/index.d.ts",
47
51
  "import": "./authoring/index.mjs"
@@ -81,6 +85,7 @@
81
85
  "assets",
82
86
  "authoring",
83
87
  "foundation",
88
+ "host",
84
89
  "scripts/postinstall.mjs",
85
90
  "CHANGELOG.md"
86
91
  ],
@@ -101,10 +106,10 @@
101
106
  "zod": "^4.4.3"
102
107
  },
103
108
  "peerDependencies": {
104
- "@astryxdesign/charts": "*",
105
- "@astryxdesign/core": "*",
106
- "@astryxdesign/lab": "*",
107
- "@astryxdesign/theme-neutral": "*"
109
+ "@astryxdesign/charts": "0.7.3-canary.02f5fe4",
110
+ "@astryxdesign/core": "0.7.3-canary.02f5fe4",
111
+ "@astryxdesign/lab": "0.7.3-canary.02f5fe4",
112
+ "@astryxdesign/theme-neutral": "0.7.3-canary.02f5fe4"
108
113
  },
109
114
  "peerDependenciesMeta": {
110
115
  "@astryxdesign/charts": {
@@ -121,10 +126,10 @@
121
126
  }
122
127
  },
123
128
  "devDependencies": {
124
- "@astryxdesign/charts": "*",
125
- "@astryxdesign/core": "*",
126
- "@astryxdesign/lab": "*",
127
- "@astryxdesign/theme-neutral": "*",
129
+ "@astryxdesign/charts": "0.7.3-canary.02f5fe4",
130
+ "@astryxdesign/core": "0.7.3-canary.02f5fe4",
131
+ "@astryxdesign/lab": "0.7.3-canary.02f5fe4",
132
+ "@astryxdesign/theme-neutral": "0.7.3-canary.02f5fe4",
128
133
  "@heroicons/react": "^2.2.0",
129
134
  "@stylexjs/stylex": "^0.19.0",
130
135
  "@types/babel__core": "^7.20.5",